summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/Makefile.lint2
-rw-r--r--usr/src/cmd/allocate/Makefile24
-rw-r--r--usr/src/cmd/allocate/audio_clean.c296
-rw-r--r--usr/src/cmd/allocate/audio_clean.sh (renamed from usr/src/cmd/allocate/audio_clean_wrapper.sh)57
-rw-r--r--usr/src/cmd/allocate/devalloc_defaults6
-rw-r--r--usr/src/cmd/audio/Makefile10
-rw-r--r--usr/src/cmd/audio/audioplay/audioplay.c159
-rw-r--r--usr/src/cmd/audio/audiorecord/audiorecord.c149
-rw-r--r--usr/src/cmd/audio/audiotest/Makefile50
-rw-r--r--usr/src/cmd/audio/audiotest/audiotest.c575
-rw-r--r--usr/src/cmd/audio/audiotest/audiotest.xcl (renamed from usr/src/cmd/mdb/sparc/v9/audiosup/Makefile)42
-rw-r--r--usr/src/cmd/audio/audiotest/wavedata.c194
-rw-r--r--usr/src/cmd/audio/audiotest/wavedata.h42792
-rw-r--r--usr/src/cmd/audio/mixerctl/Makefile9
-rw-r--r--usr/src/cmd/audio/mixerctl/mixerctl.c1644
-rw-r--r--usr/src/cmd/devfsadm/audio_link.c362
-rw-r--r--usr/src/cmd/mdb/Makefile.common3
-rw-r--r--usr/src/cmd/mdb/common/modules/audiosup/audiosup.c227
-rw-r--r--usr/src/cmd/svc/milestone/Makefile6
-rw-r--r--usr/src/cmd/svc/milestone/devices-audio44
-rw-r--r--usr/src/cmd/svc/milestone/devices-audio.xml91
-rw-r--r--usr/src/pkgdefs/SUNWad810/Makefile8
-rw-r--r--usr/src/pkgdefs/SUNWad810/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWad810/postinstall)57
-rw-r--r--usr/src/pkgdefs/SUNWad810/preremove52
-rw-r--r--usr/src/pkgdefs/SUNWad810/preremove.tmpl (renamed from usr/src/cmd/mdb/intel/ia32/audiosup/Makefile)19
-rw-r--r--usr/src/pkgdefs/SUNWadixp/Makefile9
-rw-r--r--usr/src/pkgdefs/SUNWadixp/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWadixp/postinstall)38
-rw-r--r--usr/src/pkgdefs/SUNWadixp/preremove.tmpl (renamed from usr/src/cmd/mdb/intel/amd64/audiosup/Makefile)20
-rw-r--r--usr/src/pkgdefs/SUNWauda/prototype_com12
-rw-r--r--usr/src/pkgdefs/SUNWaudd/Makefile7
-rw-r--r--usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl6
-rw-r--r--usr/src/pkgdefs/SUNWaudd/postinstall69
-rw-r--r--usr/src/pkgdefs/SUNWaudd/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWaudd/preremove)37
-rw-r--r--usr/src/pkgdefs/SUNWaudd/preremove.tmpl (renamed from usr/src/pkgdefs/SUNWadixp/preremove)33
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_com12
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_i38621
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_sparc12
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_com20
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_i3868
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_sparc8
-rw-r--r--usr/src/pkgdefs/SUNWaudiohd/postinstall4
-rw-r--r--usr/src/pkgdefs/SUNWcsr/prototype_com2
-rw-r--r--usr/src/pkgdefs/SUNWmdb/prototype_i3864
-rw-r--r--usr/src/pkgdefs/SUNWmdb/prototype_sparc3
-rw-r--r--usr/src/pkgdefs/SUNWmdbr/prototype_i3864
-rw-r--r--usr/src/pkgdefs/SUNWmdbr/prototype_sparc3
-rw-r--r--usr/src/pkgdefs/SUNWtsg/prototype_com11
-rw-r--r--usr/src/pkgdefs/SUNWusb/prototype_i3863
-rw-r--r--usr/src/pkgdefs/SUNWusb/prototype_sparc1
-rw-r--r--usr/src/pkgdefs/etc/exception_list_sparc15
-rw-r--r--usr/src/tools/findunref/exception_list.open8
-rw-r--r--usr/src/tools/scripts/bfu.sh116
-rw-r--r--usr/src/uts/common/Makefile.files25
-rw-r--r--usr/src/uts/common/Makefile.rules49
-rw-r--r--usr/src/uts/common/brand/lx/io/lx_audio.c54
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97.c1974
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_ad.c257
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_alc.c219
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_cmi.c311
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_impl.h113
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.c1952
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf (renamed from usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf)32
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.h468
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.c1971
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.conf97
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.h267
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.c1458
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf)32
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.h210
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.c (renamed from usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c)5474
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf)16
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.h (renamed from usr/src/uts/common/sys/audio/impl/audiohd_impl.h)298
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.c1675
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf)29
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.h286
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.c1736
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf46
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.h233
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.c2015
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf)28
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.h (renamed from usr/src/uts/common/sys/audio/impl/audiots_impl.h)247
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c1070
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf41
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h191
-rw-r--r--usr/src/uts/common/io/audio/impl/audio.conf38
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_client.c1675
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_client.h260
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_ctrl.c375
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_ddi.c465
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_engine.c1197
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_fltdata.c9283
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_format.c894
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_grc3.c388
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_grc3.h275
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_impl.h472
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_input.c229
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_oss.c2577
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_output.c463
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_sun.c1967
-rw-r--r--usr/src/uts/common/io/audio/impl/austr.c62
-rw-r--r--usr/src/uts/common/io/audio/impl/austr.conf38
-rw-r--r--usr/src/uts/common/io/audio/inc.flg128
-rw-r--r--usr/src/uts/common/io/audio/sada/amsrc2/README106
-rw-r--r--usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c1037
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audio810/README383
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c3490
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c3389
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c4264
-rw-r--r--usr/src/uts/common/io/audio/sada/framework/audio_support.c4209
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_ad.c5155
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c5376
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_main.c4273
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c1956
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h161
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c2378
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf11
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c1202
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c153
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c947
-rw-r--r--usr/src/uts/common/io/usb/inc.flg191
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac.wlcmd6
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd5
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd5
-rw-r--r--usr/src/uts/common/sys/Makefile16
-rw-r--r--usr/src/uts/common/sys/audio/ac97.h284
-rw-r--r--usr/src/uts/common/sys/audio/am_src1.h77
-rw-r--r--usr/src/uts/common/sys/audio/am_src2.h55
-rw-r--r--usr/src/uts/common/sys/audio/audio810.h84
-rw-r--r--usr/src/uts/common/sys/audio/audio_apm.h331
-rw-r--r--usr/src/uts/common/sys/audio/audio_common.h304
-rw-r--r--usr/src/uts/common/sys/audio/audio_driver.h241
-rw-r--r--usr/src/uts/common/sys/audio/audio_mixer.h114
-rw-r--r--usr/src/uts/common/sys/audio/audio_oss.h908
-rw-r--r--usr/src/uts/common/sys/audio/audio_src.h102
-rw-r--r--usr/src/uts/common/sys/audio/audio_support.h116
-rw-r--r--usr/src/uts/common/sys/audio/audio_trace.h140
-rwxr-xr-xusr/src/uts/common/sys/audio/audiohd.h89
-rw-r--r--usr/src/uts/common/sys/audio/audioixp.h77
-rw-r--r--usr/src/uts/common/sys/audio/audiots.h86
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src1_impl.h96
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src2_impl.h107
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src2_table.h1493
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio810_impl.h350
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h425
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio_support_impl.h122
-rw-r--r--usr/src/uts/common/sys/audio/impl/audioixp_impl.h459
-rw-r--r--usr/src/uts/common/sys/audioio.h20
-rw-r--r--usr/src/uts/common/sys/audiovar.h472
-rw-r--r--usr/src/uts/common/sys/mixer.h16
-rw-r--r--usr/src/uts/common/sys/soundcard.h31
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h51
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h15
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h7
-rw-r--r--usr/src/uts/intel/Makefile.intel.shared13
-rw-r--r--usr/src/uts/intel/ac97/Makefile (renamed from usr/src/uts/intel/amsrc2/Makefile)44
-rw-r--r--usr/src/uts/intel/audio/Makefile80
-rw-r--r--usr/src/uts/intel/audio810/Makefile73
-rw-r--r--usr/src/uts/intel/audioens/Makefile82
-rw-r--r--usr/src/uts/intel/audiohd/Makefile60
-rw-r--r--usr/src/uts/intel/audioixp/Makefile67
-rw-r--r--usr/src/uts/intel/audiopci/Makefile82
-rw-r--r--usr/src/uts/intel/audiovia823x/Makefile (renamed from usr/src/uts/intel/usb_ac_dacf/Makefile)46
-rw-r--r--usr/src/uts/intel/austr/Makefile85
-rw-r--r--usr/src/uts/intel/mixer/Makefile154
-rw-r--r--usr/src/uts/intel/os/dacf.conf10
-rw-r--r--usr/src/uts/intel/usb_ac/Makefile17
-rw-r--r--usr/src/uts/intel/usb_ah/Makefile4
-rw-r--r--usr/src/uts/intel/usb_as/Makefile22
-rw-r--r--usr/src/uts/intel/warlock/Makefile19
-rw-r--r--usr/src/uts/sparc/Makefile.sparc.shared9
-rw-r--r--usr/src/uts/sparc/ac97/Makefile (renamed from usr/src/uts/intel/audiosup/Makefile)51
-rw-r--r--usr/src/uts/sparc/amsrc2/main.c74
-rw-r--r--usr/src/uts/sparc/audio/Makefile80
-rw-r--r--usr/src/uts/sparc/audio1575/Makefile70
-rw-r--r--usr/src/uts/sparc/audio810/Makefile155
-rw-r--r--usr/src/uts/sparc/audiocs/Makefile66
-rw-r--r--usr/src/uts/sparc/audioens/Makefile82
-rw-r--r--usr/src/uts/sparc/audiohd/Makefile156
-rw-r--r--usr/src/uts/sparc/audioixp/Makefile117
-rw-r--r--usr/src/uts/sparc/audiopci/Makefile82
-rw-r--r--usr/src/uts/sparc/audiosup/Makefile128
-rw-r--r--usr/src/uts/sparc/audiots/Makefile68
-rw-r--r--usr/src/uts/sparc/austr/Makefile (renamed from usr/src/uts/sparc/amsrc2/Makefile)73
-rw-r--r--usr/src/uts/sparc/mixer/Makefile156
-rw-r--r--usr/src/uts/sparc/os/dacf.conf10
-rw-r--r--usr/src/uts/sparc/usb_ac/Makefile10
-rw-r--r--usr/src/uts/sparc/usb_ac_dacf/Makefile89
-rw-r--r--usr/src/uts/sparc/usb_ah/Makefile6
-rw-r--r--usr/src/uts/sparc/usb_as/Makefile22
-rw-r--r--usr/src/uts/sparc/warlock/Makefile22
-rw-r--r--usr/src/uts/sun/Makefile.files5
-rw-r--r--usr/src/uts/sun/Makefile.rules15
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c2406
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h (renamed from usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h)286
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c567
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c573
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf (renamed from usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf)25
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c4119
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c3020
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c1332
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c1459
-rw-r--r--usr/src/uts/sun/sys/Makefile10
-rw-r--r--usr/src/uts/sun/sys/audio/audio1575.h83
-rw-r--r--usr/src/uts/sun/sys/audio/audio_4231.h92
-rw-r--r--usr/src/uts/sun/sys/audio/impl/audio1575_impl.h766
205 files changed, 95574 insertions, 57977 deletions
diff --git a/usr/src/Makefile.lint b/usr/src/Makefile.lint
index 7c3ce96683..c4adef0aea 100644
--- a/usr/src/Makefile.lint
+++ b/usr/src/Makefile.lint
@@ -35,6 +35,8 @@ COMMON_SUBDIRS = \
cmd/acctadm \
cmd/asa \
cmd/amt \
+ cmd/audio/audiotest \
+ cmd/audio/mixerctl \
cmd/audit \
cmd/auditconfig \
cmd/auditd \
diff --git a/usr/src/cmd/allocate/Makefile b/usr/src/cmd/allocate/Makefile
index cd572ed03e..5691423a21 100644
--- a/usr/src/cmd/allocate/Makefile
+++ b/usr/src/cmd/allocate/Makefile
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
ETCTSOLFILES = devalloc_defaults
@@ -33,13 +31,14 @@ include ../Makefile.cmd
ROOTSEC = $(ROOTETC)/security
ROOTSECDEV = $(ROOTSEC)/dev
ROOTSECLIB = $(ROOTSEC)/lib
-ROOTDIRS = $(ROOTSECDEV) $(ROOTSECLIB)
+ROOTSECAUD = $(ROOTSEC)/audio
+ROOTDIRS = $(ROOTSECDEV) $(ROOTSECLIB) $(ROOTSECAUD)
RTLCKS = audio fd0 sr0 st0 st1
CLEANfd = fd_clean
CLEANsr = sr_clean
CLEANst = st_clean
-CLEANaudio = audio_clean_wrapper
+CLEANaudio = audio_clean
CLEANdisk = disk_clean
CLEAN_SCRIPTS = $(CLEANfd) $(CLEANsr) $(CLEANst) $(CLEANaudio) $(CLEANdisk)
WDW_SCRIPTS = wdwmsg wdwwrapper
@@ -50,10 +49,9 @@ ALLSCRIPTS = allscripts.sh
PROGalloc = allocate
PROGmkdevalloc = mkdevalloc
PROGdminfo = dminfo
-PROGaudio = audio_clean
PROGaddalloc = add_allocatable
PROG = $(PROGalloc) $(PROGmkdevalloc) $(PROGdminfo) \
- $(PROGaudio) $(PROGaddalloc)
+ $(PROGaddalloc)
LINKPROGalloc = deallocate list_devices
LINKPROGmkdevalloc = mkdevmaps
@@ -72,7 +70,6 @@ ROOTWDWLINKS = $(WDW_LINKS:%=$(ROOTSECLIB)/%.windowing)
ROOTPROG = $(PROGallocate:%=$(ROOTUSRSBIN)/%) \
$(PROGmkdevalloc:%=$(ROOTUSRSBIN)/%) \
$(PROGdminfo:%=$(ROOTUSRSBIN)/%) \
- $(PROGaudio:%=$(ROOTSECLIB)/%) \
$(PROGaddaloc:%=$(ROOTUSRSBIN)/%)
ROOTLINKalloc = $(LINKPROGalloc:%=$(ROOTUSRSBIN)/%)
ROOTLINKmkdevalloc = $(LINKPROGmkdevalloc:%=$(ROOTUSRSBIN)/%)
@@ -82,13 +79,11 @@ ROOTLINKS = $(ROOTLINKalloc) $(ROOTLINKmkdevalloc) $(ROOTLINKaddalloc)
PROGallocOBJS = allocate.o allocate3.o
PROGmkdevallocOBJS = mkdevalloc.o
PROGdminfoOBJS = dminfo.o
-PROGaudioOBJS = audio_clean.o
PROGaddallocOBJS = add_allocatable.o
OBJS = $(PROGallocOBJS) \
$(PROGmkdevallocOBJS) \
$(PROGdminfoOBJS) \
- $(PROGaudioOBJS) \
$(PROGaddallocOBJS)
SRCS = $(OBJS:%.o=%.c)
@@ -109,7 +104,6 @@ lint := LDLIBS += -lbsm -lsec -lsecdb -ldevinfo -ltsol
$(PROGalloc) := LDLIBS += -lbsm -lsec -lsecdb -ldevinfo -ltsol
$(PROGmkdevalloc) := LDLIBS += -lbsm
$(PROGdminfo) := LDLIBS += -lbsm
-$(PROGaudio) := LDLIBS += -lbsm
$(PROGaddalloc) := LDLIBS += -lbsm -lsecdb -ltsol
CLOBBERFILES += $(SCRIPTS)
@@ -143,10 +137,6 @@ $(PROGdminfo) : $(PROGdminfoOBJS)
$(LINK.c) $(PROGdminfoOBJS) -o $@ $(LDLIBS)
$(POST_PROCESS)
-$(PROGaudio) : $(PROGaudioOBJS)
- $(LINK.c) $(PROGaudioOBJS) -o $@ $(LDLIBS)
- $(POST_PROCESS)
-
$(ROOTDIRS) :
$(INS.dir)
@@ -157,10 +147,6 @@ $(ROOTSECLIB)/%: %
$(RM) $@
$(INS.file)
-$(ROOTSECLIB)/audio_clean : audio_clean
- $(RM) $@
- $(INS.file) $(@F)
-
$(ROOTLINKalloc) : $(PROGalloc:%=$(ROOTUSRSBIN)/%)
$(RM) $@
$(LN) $(PROGalloc:%=$(ROOTUSRSBIN)/%) $@
diff --git a/usr/src/cmd/allocate/audio_clean.c b/usr/src/cmd/allocate/audio_clean.c
deleted file mode 100644
index 24753b8569..0000000000
--- a/usr/src/cmd/allocate/audio_clean.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * audio_clean - Clear any residual data that may be residing in the in the
- * audio device driver or chip.
- *
- * Usage: audio_clean [-Iisf] device_name
- *
- * Note: The same operation is performed for any of the "ifs" flags.
- * The "I" flag is a silent form of "i". Support for the flags
- * is provided so that the framework is place if added
- * functionality is required.
- *
- * Note: The AUDIO_SETINFO ioctl is used instead of the low level
- * AUDIOSETREG command which is used to perform low level
- * operations on the device. If a process had previously used
- * AUDIOSETREG to monkey with the device, then the driver would
- * have reset the chip when the process performed a close,
- * so this can just clear the info structure.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <stropts.h>
-#include <unistd.h>
-#include <bsm/devices.h>
-#include <sys/audioio.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#ifndef TEXT_DOMAIN
-#define TEXT_DOMAIN "SUNW_OST_OSCMD"
-#endif
-
-#ifdef DEBUG
-static void print_info(audio_info_t *);
-static void print_prinfo(audio_prinfo_t *);
-#endif /* DEBUG */
-
-static void
-usage(char *prog)
-{
- (void) fprintf(stderr, "%s%s", prog,
- gettext(" : usage:[-I|-s|-f|-i] device\n"));
-}
-
-int
-main(int argc, char **argv)
-{
- int err = 0;
- int Audio_fd;
- int forced = 0; /* Command line options */
- int initial = 0;
- int standard = 0;
- int verbose = 1; /* default is to be verbose */
- int c;
- char *prog, *devname, *devpath;
- devmap_t *dm;
- struct stat st;
- audio_info_t info;
-
- (void) setlocale(LC_ALL, "");
- (void) textdomain(TEXT_DOMAIN);
-
- prog = argv[0]; /* save program initiation name */
-
- /*
- * Parse arguments. Currently i, s and f all do the
- * the same thing.
- */
-
- while ((c = getopt(argc, argv, "Iifs")) != -1) {
- switch (c) {
- case 'I':
- verbose = 0;
- initial++;
- if (standard || forced)
- err++;
- break;
- case 'i':
- initial++;
- if (standard || forced)
- err++;
- break;
- case 's':
- standard++;
- if (initial || forced)
- err++;
- break;
- case 'f':
- forced++;
- if (initial || standard)
- err++;
- break;
- case '?':
- err++;
- break;
- default:
- err++;
- break;
- }
- if (err) {
- if (verbose)
- usage(prog);
- exit(1);
- }
- }
-
- if ((argc - optind) != 1) {
- if (verbose)
- usage(prog);
- exit(1);
- } else {
- devname = argv[optind];
- }
-
- setdmapent();
- if ((dm = getdmapnam(devname)) == NULL) {
- enddmapent();
- if (verbose)
- (void) fprintf(stderr, "%s%s",
- devname,
- gettext(" : No such allocatable device\n"));
- exit(1);
- }
- enddmapent();
- if (dm->dmap_devarray == NULL || dm->dmap_devarray[0] == NULL) {
- if (verbose)
- (void) fprintf(stderr, "%s%s",
- devname,
- gettext(" : No such allocatable device\n"));
- exit(1);
- }
- devpath = strdup(dm->dmap_devarray[0]);
- freedmapent(dm);
-
- /*
- * Validate and open the audio device
- */
- err = stat(devpath, &st);
-
- if (err < 0) {
- if (verbose) {
- (void) fprintf(stderr, gettext("%s: cannot stat "),
- prog);
- perror("audio_clean");
- }
- exit(1);
- }
- if (!S_ISCHR(st.st_mode)) {
- if (verbose)
- (void) fprintf(stderr,
- gettext("%s: %s is not an audio device\n"), prog,
- devpath);
- exit(1);
- }
-
- /*
- * Since the device /dev/audio can suspend if someone else is
- * using it we check to see if we're going to hang before we
- * do anything.
- */
- Audio_fd = open(devpath, O_WRONLY | O_NDELAY);
-
- if ((Audio_fd < 0) && (errno == EBUSY)) {
- if (verbose)
- (void) fprintf(stderr, gettext("%s: waiting for %s..."),
- prog, devpath);
- exit(0);
- } else if (Audio_fd < 0) {
- if (verbose) {
- (void) fprintf(stderr, gettext("%s: error opening "),
- prog);
- perror(devpath);
- }
- exit(1);
- }
-
-#ifdef DEBUG
- /*
- * Read the audio_info structure.
- */
-
- if (ioctl(Audio_fd, AUDIO_GETINFO, &info) != 0) {
- perror("Ioctl AUDIO_GETINFO error");
- (void) close(Audio_fd);
- exit(1);
- }
-
- print_info(&info);
-#endif /* DEBUG */
-
-/* LINTED */
- AUDIO_INITINFO(&info); /* clear audit info structure */
-
- if (ioctl(Audio_fd, AUDIO_SETINFO, &info) != 0) {
- if (verbose)
- perror(gettext("Ioctl AUDIO_SETINFO error"));
- (void) close(Audio_fd);
- exit(1);
- }
-
-#ifdef DEBUG
- if (ioctl(Audio_fd, AUDIO_GETINFO, &info) != 0) {
- perror("Ioctl AUDIO_GETINFO-2 error");
- (void) close(Audio_fd);
- exit(1);
- }
-
- print_info(&info);
-#endif /* DEBUG */
-
- return (0);
-}
-
-
-#ifdef DEBUG
-void
-print_info(audio_info_t *info)
-{
- print_prinfo(&info->play);
- print_prinfo(&info->record);
- (void) printf("monitor_gain %d\n", info->monitor_gain);
- (void) fflush(stdout);
-}
-
-
-void
-print_prinfo(audio_prinfo_t *prinfo)
-{
- /* The following values decribe audio data encoding: */
- (void) printf("sample_rate %d\n", prinfo->sample_rate);
- (void) printf("channels %d\n", prinfo->channels);
- (void) printf("precision %d\n", prinfo->precision);
- (void) printf("encoding %d\n", prinfo->encoding);
-
- /* The following values control audio device configuration */
- (void) printf("gain %d\n", prinfo->gain);
- (void) printf("port %d\n", prinfo->port);
- (void) printf("avail_ports %d\n", prinfo->avail_ports);
- (void) printf("mod_ports %d\n", prinfo->mod_ports);
-
- /* These are Reserved for future use, but we clear them */
- (void) printf("_xxx %d\n", prinfo->_xxx);
-
- (void) printf("buffer_size %d\n", prinfo->buffer_size);
-
- /* The following values describe driver state */
- (void) printf("samples %d\n", prinfo->samples);
- (void) printf("eof %d\n", prinfo->eof);
- (void) printf("pause %d\n", prinfo->pause);
- (void) printf("error %d\n", prinfo->error);
- (void) printf("waiting %d\n", prinfo->waiting);
- (void) printf("balance %d\n", prinfo->balance);
-
- /* The following values are read-only state flags */
- (void) printf("open %d\n", prinfo->open);
- (void) printf("active %d\n", prinfo->active);
-}
-#endif /* DEBUG */
diff --git a/usr/src/cmd/allocate/audio_clean_wrapper.sh b/usr/src/cmd/allocate/audio_clean.sh
index 2a7820c098..24ccea7fdb 100644
--- a/usr/src/cmd/allocate/audio_clean_wrapper.sh
+++ b/usr/src/cmd/allocate/audio_clean.sh
@@ -19,12 +19,10 @@
#
# CDDL HEADER END
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
-# This is a wrapper for the audio_clean program.
+# This is the audio_clean program.
#
# Following is the syntax for calling the script:
# scriptname [-s|-f|-i|-I] devicename [-A|-D] [username] [zonename]
@@ -56,16 +54,15 @@
# dialogs. To present dialogs to the user, the dtksh script
# /etc/security/lib/wdwmsg may be used.
#
-# This particular script, audio_clean_wrapper, will work using stdin/stdout, or
-# using dialogs. A symbolic link audio_clean_wrapper.windowing points to
-# audio_clean_wrapper.
+# This particular script, audio_clean, will work using stdin/stdout, or
+# using dialogs. A symbolic link audio_clean.windowing points to
+# audio_clean.
trap "" INT TERM QUIT TSTP ABRT
USAGE="usage: $0 [-s|-f|-i|-I] devicename [-A|-D][username][zonename][zonepath]"
PATH="/usr/bin:/usr/sbin"
-CLEAN_PROG="/etc/security/lib/audio_clean"
WDWMSG="/etc/security/lib/wdwmsg"
MODE="allocate"
@@ -92,22 +89,13 @@ msg() {
fi
}
-alloc_msg() {
- msg "Audio device allocated in zone $ZONENAME." \
- "\nTurn on microphone if audio recording is to be performed." \
- "\nTurn microphone off when not recording."
-}
-
-dealloc_msg() {
- msg "Please make sure the microphone is turned off."
-}
-
fail_msg() {
if [ "$MODE" = "allocate" ]; then
msg "$0: Allocate of $DEVICE failed."
else
msg "$0: Deallocate of $DEVICE failed."
fi
+ exit 1
}
#
@@ -147,18 +135,33 @@ if [ "$MODE" != "allocate" -a "$MODE" != "deallocate" ]; then
fi
ZONENAME=$4
ZONEPATH=$5
-
-$CLEAN_PROG -$FLAG $DEVICE
-
-if [ $? -ne 0 ]; then
- fail_msg
- exit 1
+SAVEDIR=/etc/security/audio
+MAP=`dminfo -v -n $AUDIO`
+DEVICE=`echo $MAP | cut -f1 -d:`
+TYPE=`echo $MAP | cut -f2 -d:`
+FILES=`echo $MAP | cut -f3 -d:`
+
+if [ ! -d ${SAVEDIR} ]
+then
+ /usr/bin/mkdir -m 0755 -p ${SAVEDIR} || fail_msg
+ /usr/bin/chown root:sys ${SAVEDIR} || fail_msg
fi
-if [ "$MODE" = "allocate" ]; then
- alloc_msg
+for d in $FILES
+do
+ x="`expr $d : '/dev/mixer[0-9][0-9]*'`"
+ if [ "$x" -ne 0 ] ; then
+ DEVNM=$d
+ break
+ fi
+done
+SAVEFILE="${SAVEDIR}/`basename ${DEVNM}`"
+
+if [ "${FLAG}" = "i" -a ! -r "${SAVEFILE}" ]
+then
+ /usr/sbin/mixerctl -d ${DEVNM} -f -s ${SAVEFILE} || fail_msg
else
- dealloc_msg
+ /usr/sbin/mixerctl -d ${DEVNM} -r ${SAVEFILE} || fail_msg
fi
exit 0
diff --git a/usr/src/cmd/allocate/devalloc_defaults b/usr/src/cmd/allocate/devalloc_defaults
index 56ef8ce53a..98cca2668d 100644
--- a/usr/src/cmd/allocate/devalloc_defaults
+++ b/usr/src/cmd/allocate/devalloc_defaults
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# Default device_allocation attributes for device types.
# Device types supported -
# audio, fd, sr, st, rmdisk
@@ -39,7 +37,7 @@
# e.g.: minlabel="TS A B";maxlabel="TS AB";auths=solaris.device.allocate;\
# cleanscript=/bin/true
#
-audio:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/audio_clean_wrapper
+audio:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/audio_clean
fd:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/disk_clean
sr:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/disk_clean
st:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/tape_clean
diff --git a/usr/src/cmd/audio/Makefile b/usr/src/cmd/audio/Makefile
index 73a66ce21b..20fdea8d51 100644
--- a/usr/src/cmd/audio/Makefile
+++ b/usr/src/cmd/audio/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# cmd/audio/Makefile
#
@@ -32,6 +29,7 @@ include ../Makefile.cmd
SUBDIRS = \
mixerctl \
+ audiotest \
utilities .WAIT \
audioplay \
audiorecord \
diff --git a/usr/src/cmd/audio/audioplay/audioplay.c b/usr/src/cmd/audio/audioplay/audioplay.c
index c898626a80..882c4d9087 100644
--- a/usr/src/cmd/audio/audioplay/audioplay.c
+++ b/usr/src/cmd/audio/audioplay/audioplay.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,10 @@
* CDDL HEADER END
*/
/*
- * Copyright 1993-2003 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/* Command-line audio play utility */
#include <stdio.h>
@@ -64,15 +61,12 @@
/* Local variables */
static char *prog;
-static char prog_opts[] = "VEiv:b:d:p:?"; /* getopt() flags */
+static char prog_opts[] = "VEiv:d:?"; /* getopt() flags */
static char *Stdin;
#define MAX_GAIN (100) /* maximum gain */
-#define LEFT_BAL (-100) /* min/max balance */
-#define MID_BAL (0)
-#define RIGHT_BAL (100)
/*
* This defines the tolerable sample rate error as a ratio between the
* sample rates of the audio data and the audio device.
@@ -86,12 +80,7 @@ static char *Stdin;
static unsigned Volume = INT_MAX; /* output volume */
static double Savevol; /* saved volume level */
-static unsigned int Balance = INT_MAX; /* output balance */
-static unsigned int Savebal; /* saved output balance */
-static unsigned int Port = INT_MAX;
- /* output port (spkr, line, hp-jack) */
-static unsigned int Saveport = 0;
- /* save prev. val so we can restore */
+
static int Verbose = FALSE; /* verbose messages */
static int Immediate = FALSE;
/* don't hang waiting for device */
@@ -153,7 +142,6 @@ static void sigint(int sig);
static void open_audio(void);
static int path_open(char *fname, int flags, mode_t mode, char *path);
static int parse_unsigned(char *str, unsigned *dst, char *flag);
-static int scale_balance(int g);
static int reconfig(void);
static void initmux(int unitsz, int unitsp);
static void demux(int unitsz, int cnt);
@@ -165,21 +153,15 @@ static void
usage(void)
{
Error(stderr, MGET("Play an audio file -- usage:\n"
- "\t%s [-iV] [-v vol] [-b bal]\n"
- "\t%.*s [-p speaker|headphone|line|aux1|aux2|spdif]\n"
- "\t%.*s [-d dev] [file ...]\n"
+ "\t%s [-iV] [-v vol] [-d dev] [file ...]\n"
"where:\n"
"\t-i\tDon't hang if audio device is busy\n"
"\t-V\tPrint verbose warning messages\n"
"\t-v\tSet output volume (0 - %d)\n"
- "\t-b\tSet output balance (%d=left, %d=center, %d=right)\n"
- "\t-p\tSpecify output port\n"
"\t-d\tSpecify audio device (default: /dev/audio)\n"
"\tfile\tList of files to play\n"
"\t\tIf no files specified, read stdin\n"),
- prog, strlen(prog), " ",
- strlen(prog), " ",
- MAX_GAIN, LEFT_BAL, MID_BAL, RIGHT_BAL);
+ prog, MAX_GAIN);
exit(1);
}
@@ -193,10 +175,6 @@ sigint(int sig)
/* restore saved parameters */
if (Volume != INT_MAX)
(void) audio_set_play_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_play_balance(Audio_fd, &Savebal);
- if (Port != INT_MAX)
- (void) audio_set_play_port(Audio_fd, &Saveport);
if ((Audio_ctlfd >= 0) &&
(audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0)) {
(void) audio_set_play_config(Audio_fd, &Save_hdr);
@@ -263,29 +241,6 @@ open_audio(void)
exit(1);
}
}
-
- if (Balance != INT_MAX) {
- (void) audio_get_play_balance(Audio_fd, &Savebal);
- err = audio_set_play_balance(Audio_fd, &Balance);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set output balance for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -p flag, set the output port now */
- if (Port != INT_MAX) {
- (void) audio_get_play_port(Audio_fd, &Saveport);
- err = audio_set_play_port(Audio_fd, &Port);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set output port %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
}
/* Play a list of audio files. */
@@ -304,7 +259,6 @@ main(int argc, char **argv) {
int ifd;
int stdinseen;
int regular;
- int bal;
int swapBytes;
int frame;
char *outbuf;
@@ -342,16 +296,6 @@ main(int argc, char **argv) {
err++;
}
break;
- case 'b':
- bal = atoi(optarg);
- if ((bal > RIGHT_BAL) || (bal < LEFT_BAL)) {
- Error(stderr, MGET("%s: invalid value "
- "for -b\n"), prog);
- err++;
- } else {
- Balance = (unsigned)scale_balance(bal);
- }
- break;
case 'd':
Audio_dev = optarg;
break;
@@ -364,32 +308,6 @@ main(int argc, char **argv) {
case 'i':
Immediate = TRUE;
break;
- case 'p':
- /* a partial match is OK */
- if (strncmp(optarg, "speaker",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPEAKER;
- } else if (strncmp(optarg, "headphone",
- strlen(optarg)) == 0) {
- Port = AUDIO_HEADPHONE;
- } else if (strncmp(optarg, "line",
- strlen(optarg)) == 0) {
- Port = AUDIO_LINE_OUT;
- } else if (strncmp(optarg, "aux1",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX1_OUT;
- } else if (strncmp(optarg, "aux2",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX2_OUT;
- } else if (strncmp(optarg, "spdif",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPDIF_OUT;
- } else {
- Error(stderr, MGET("%s: invalid value "
- "for -p\n"), prog);
- err++;
- }
- break;
case '?':
usage();
/*NOTREACHED*/
@@ -416,13 +334,8 @@ main(int argc, char **argv) {
/* This should probably use audio_cntl instead of open_audio */
if ((argc <= 0) && isatty(fileno(stdin))) {
- if (Verbose) {
- Error(stderr,
- MGET("%s: No files - setting audio device parameters.\n"),
- prog);
- }
- open_audio();
- exit(0);
+ Error(stderr, MGET("%s: No files and stdin is a tty.\n"), prog);
+ exit(1);
}
/* Check on the -i status now. */
@@ -438,7 +351,7 @@ main(int argc, char **argv) {
Audio_fd = -1;
/* Try to open the control device and save the current format */
- (void) sprintf(ctldev, "%sctl", Audio_dev);
+ (void) snprintf(ctldev, sizeof (ctldev), "%sctl", Audio_dev);
Audio_ctlfd = open(ctldev, O_RDWR);
if (Audio_ctlfd >= 0) {
/*
@@ -521,7 +434,7 @@ main(int argc, char **argv) {
File_hdr.samples_per_unit = 1;
File_hdr.bytes_per_unit = 1;
adpcm_state = (struct audio_g72x_state *)malloc
- (sizeof (*adpcm_state) * File_hdr.channels);
+ (sizeof (*adpcm_state) * File_hdr.channels);
for (i = 0; i < File_hdr.channels; i++) {
g721_init_state(&adpcm_state[i]);
}
@@ -533,7 +446,7 @@ main(int argc, char **argv) {
File_hdr.samples_per_unit = 1;
File_hdr.bytes_per_unit = 1;
adpcm_state = (struct audio_g72x_state *)malloc
- (sizeof (*adpcm_state) * File_hdr.channels);
+ (sizeof (*adpcm_state) * File_hdr.channels);
for (i = 0; i < File_hdr.channels; i++) {
g723_init_state(&adpcm_state[i]);
}
@@ -911,10 +824,6 @@ nextfile:;
if (Volume != INT_MAX)
(void) audio_set_play_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_play_balance(Audio_fd, &Savebal);
- if (Port != INT_MAX)
- (void) audio_set_play_port(Audio_fd, &Saveport);
if ((Audio_ctlfd >= 0) && (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0)) {
(void) audio_set_play_config(Audio_fd, &Save_hdr);
}
@@ -958,7 +867,8 @@ reconfig(void)
if (ratio <= SAMPLE_RATE_THRESHOLD) {
if (Verbose) {
Error(stderr,
- MGET("%s: WARNING: %s sampled at %d, playing at %d\n"),
+ MGET("%s: WARNING: %s sampled at "
+ "%d, playing at %d\n"),
prog, Ifile, File_hdr.sample_rate,
Dev_hdr.sample_rate);
}
@@ -1067,7 +977,8 @@ path_open(char *fname, int flags, mode_t mode, char *path)
/* got a match! */
if (Verbose) {
Error(stderr,
- MGET("%s: Found %s in path at %s\n"),
+ MGET("%s: Found %s in path "
+ "at %s\n"),
prog, fname, fullpath);
}
return (open(fullpath, flags, mode));
@@ -1085,14 +996,6 @@ path_open(char *fname, int flags, mode_t mode, char *path)
}
-/* Convert local balance into device parameters */
-static int
-scale_balance(int g)
-{
- return (int)(((g + RIGHT_BAL) / (double)(RIGHT_BAL - LEFT_BAL)) *
- (double)AUDIO_RIGHT_BALANCE);
-}
-
/*
* initmux()
*
@@ -1119,47 +1022,41 @@ initmux(int unitsz, int unitsp)
out_ch_size = in_ch_size * unitsp / unitsz;
/* Allocate pointers to input channels */
- in_ch_data = (unsigned char **)malloc(sizeof (unsigned char *)
- * File_hdr.channels);
+ in_ch_data = malloc(sizeof (unsigned char *) * File_hdr.channels);
if (in_ch_data == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, sizeof (unsigned char *) *
- File_hdr.channels / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, sizeof (unsigned char *) * File_hdr.channels / 1000);
exit(1);
}
/* Allocate input channels */
for (c = 0; c < File_hdr.channels; c++) {
- in_ch_data[c] = (unsigned char *)malloc
- (sizeof (unsigned char) * in_ch_size);
+ in_ch_data[c] = malloc(sizeof (unsigned char) * in_ch_size);
if (in_ch_data[c] == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, in_ch_size / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, in_ch_size / 1000);
exit(1);
}
}
/* Allocate pointers to output channels */
- out_ch_data = (unsigned char **)malloc(sizeof (unsigned char *)
- * File_hdr.channels);
+ out_ch_data = malloc(sizeof (unsigned char *) * File_hdr.channels);
if (out_ch_data == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, sizeof (unsigned char *) *
- File_hdr.channels / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, sizeof (unsigned char *) * File_hdr.channels / 1000);
exit(1);
}
/* Allocate output channels */
for (c = 0; c < File_hdr.channels; c++) {
- out_ch_data[c] = (unsigned char *)malloc
- (sizeof (unsigned char) * out_ch_size);
+ out_ch_data[c] = malloc(sizeof (unsigned char) * out_ch_size);
if (out_ch_data[c] == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, out_ch_size / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, out_ch_size / 1000);
exit(1);
}
}
diff --git a/usr/src/cmd/audio/audiorecord/audiorecord.c b/usr/src/cmd/audio/audiorecord/audiorecord.c
index dff332466a..d8b681d777 100644
--- a/usr/src/cmd/audio/audiorecord/audiorecord.c
+++ b/usr/src/cmd/audio/audiorecord/audiorecord.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,10 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/* Command-line audio record utility */
#include <stdio.h>
@@ -62,16 +59,11 @@
#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
#endif
-/* Defined until I get a copy of the apropriate audioio.h file. */
-#ifndef AUDIO_CD_IN
-#define AUDIO_CD_IN 0x04 /* input from the internal CD player */
-#endif
-
#define Error (void) fprintf
/* Local variables */
static char *prog;
-static char prog_opts[] = "aft:v:b:m:d:p:i:e:s:c:T:?"; /* getopt() flags */
+static char prog_opts[] = "aft:v:d:i:e:s:c:T:?"; /* getopt() flags */
static char *Stdout;
/* XXX - the input buffer size should depend on sample_rate */
@@ -82,20 +74,10 @@ static char swapBuf[AUDIO_BUFSIZ]; /* for byte swapping */
#define MAX_GAIN (100) /* maximum gain */
-#define LEFT_BAL (-100) /* min/max balance */
-#define MID_BAL (0)
-#define RIGHT_BAL (100)
-
static char *Info = NULL; /* pointer to info data */
static unsigned Ilen = 0; /* length of info data */
static unsigned Volume = INT_MAX; /* record volume */
static double Savevol; /* saved volume */
-static unsigned Monvol = INT_MAX; /* monitor volume */
-static double Savemonvol; /* saved monitor volume */
-static unsigned int Balance = INT_MAX; /* input balance */
-static unsigned int Savebal; /* saved input balance */
-static unsigned Port = INT_MAX; /* Input port (line, mic) */
-static unsigned Saveport = 0; /* restore value of input port */
static unsigned Sample_rate = 0;
static unsigned Channels = 0;
static unsigned Precision = 0; /* based on encoding */
@@ -130,7 +112,6 @@ extern char *optarg;
/* Local Functions */
static void usage(void);
static void sigint(int sig);
-static int scale_balance(int g);
static int parse_unsigned(char *str, unsigned *dst, char *flag);
static int parse_sample_rate(char *s, unsigned *rate);
@@ -139,17 +120,13 @@ static void
usage(void)
{
Error(stderr, MGET("Record an audio file -- usage:\n"
- "\t%s [-af] [-v vol] [-b bal] [-m monvol]\n"
- "\t%.*s [-p mic|line|cd|aux1|aux2|spdif]\n"
+ "\t%s [-af] [-v vol]\n"
"\t%.*s [-c channels] [-s rate] [-e encoding]\n"
"\t%.*s [-t time] [-i info] [-d dev] [-T au|wav|aif[f]] [file]\n"
"where:\n"
"\t-a\tAppend to output file\n"
"\t-f\tIgnore sample rate differences on append\n"
"\t-v\tSet record volume (0 - %d)\n"
- "\t-b\tSet record balance (%d=left, %d=center, %d=right)\n"
- "\t-m\tSet monitor volume (0 - %d)\n"
- "\t-p\tSpecify input port\n"
"\t-c\tSpecify number of channels to record\n"
"\t-s\tSpecify rate in samples per second\n"
"\t-e\tSpecify encoding (ulaw | alaw | [u]linear | linear8 )\n"
@@ -164,8 +141,7 @@ usage(void)
prog,
strlen(prog), " ",
strlen(prog), " ",
- strlen(prog), " ",
- MAX_GAIN, LEFT_BAL, MID_BAL, RIGHT_BAL, MAX_GAIN);
+ MAX_GAIN);
exit(1);
}
@@ -185,12 +161,6 @@ sigint(int sig)
if (Audio_fd >= 0) {
if (Volume != INT_MAX)
(void) audio_set_record_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_record_balance(Audio_fd, &Savebal);
- if (Monvol != INT_MAX)
- (void) audio_set_monitor_gain(Audio_fd, &Savemonvol);
- if (Port != INT_MAX)
- (void) audio_set_record_port(Audio_fd, &Saveport);
if (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0) {
(void) audio_set_record_config(Audio_fd, &Save_hdr);
}
@@ -211,11 +181,9 @@ main(int argc, char **argv)
int ofd;
int swapBytes = FALSE;
double vol;
- int bal;
struct stat st;
struct pollfd pfd;
char *cp;
- char ctldev[MAXPATHLEN];
(void) setlocale(LC_ALL, "");
(void) textdomain(TEXT_DOMAIN);
@@ -250,25 +218,6 @@ main(int argc, char **argv)
err++;
}
break;
- case 'b':
- bal = atoi(optarg);
- if ((bal > RIGHT_BAL) || (bal < LEFT_BAL)) {
- Error(stderr, MGET("%s: invalid value for "
- "-b\n"), prog);
- err++;
- } else {
- Balance = (unsigned)scale_balance(bal);
- }
- break;
- case 'm':
- if (parse_unsigned(optarg, &Monvol, "-m")) {
- err++;
- } else if (Monvol > MAX_GAIN) {
- Error(stderr, MGET("%s: invalid value for "
- "-m\n"), prog);
- err++;
- }
- break;
case 't':
Time = audio_str_to_secs(optarg);
if ((Time == HUGE_VAL) || (Time < 0.)) {
@@ -280,33 +229,6 @@ main(int argc, char **argv)
case 'd':
Audio_dev = optarg;
break;
- case 'p':
- /* a partial match is OK */
- if (strncmp(optarg, "microphone",
- strlen(optarg)) == 0) {
- Port = AUDIO_MICROPHONE;
- } else if (strncmp(optarg, "line",
- strlen(optarg)) == 0) {
- Port = AUDIO_LINE_IN;
- } else if ((strncmp(optarg, "cd",
- strlen(optarg)) == 0) || (strncmp(optarg,
- "internal-cd", strlen(optarg)) == 0)) {
- Port = AUDIO_CD_IN;
- } else if (strncmp(optarg, "aux1",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX1_IN;
- } else if (strncmp(optarg, "aux2",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX2_IN;
- } else if (strncmp(optarg, "spdif",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPDIF_IN;
- } else {
- Error(stderr, MGET("%s: invalid value for "
- "-p\n"), prog);
- err++;
- }
- break;
case 'f':
Force = TRUE;
break;
@@ -703,44 +625,10 @@ openinput:
}
}
- if (Balance != INT_MAX) {
- (void) audio_get_record_balance(Audio_fd, &Savebal);
- err = audio_set_record_balance(Audio_fd, &Balance);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set record balance for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -m flag, set monitor volume now */
- if (Monvol != INT_MAX) {
- vol = (double)Monvol / (double)MAX_GAIN;
- (void) audio_get_monitor_gain(Audio_fd, &Savemonvol);
- err = audio_set_monitor_gain(Audio_fd, &vol);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set monitor volume for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -p flag, set the input port */
- if (Port != INT_MAX) {
- (void) audio_get_record_port(Audio_fd, &Saveport);
- err = audio_set_record_port(Audio_fd, &Port);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set input port %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
if (isatty(ofd)) {
- exit(0);
+ Error(stderr, MGET("%s: No files and stdout is a tty\n"),
+ prog);
+ exit(1);
}
/* Set up SIGINT handler so that final buffers may be flushed */
@@ -823,15 +711,9 @@ openinput:
Error(stderr, MGET("%s: WARNING: Data overflow occurred\n"),
prog);
- /* Reset record volume, balance, monitor volume, port, encoding */
+ /* Reset record volume, encoding */
if (Volume != INT_MAX)
(void) audio_set_record_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_record_balance(Audio_fd, &Savebal);
- if (Monvol != INT_MAX)
- (void) audio_set_monitor_gain(Audio_fd, &Savemonvol);
- if (Port != INT_MAX)
- (void) audio_set_record_port(Audio_fd, &Saveport);
if (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0) {
(void) audio_set_record_config(Audio_fd, &Save_hdr);
}
@@ -886,7 +768,8 @@ parse_sample_rate(char *s, unsigned *rate)
* XXX bug alert: could have multiple "." in string
* and mess things up.
*/
- for (cp = s; *cp && (isdigit(*cp) || (*cp == '.')); cp++);
+ for (cp = s; *cp && (isdigit(*cp) || (*cp == '.')); cp++)
+ /* NOP */;
if (*cp != NULL) {
if ((*cp == 'k') || (*cp == 'K')) {
drate *= 1000.0;
@@ -903,11 +786,3 @@ parse_sample_rate(char *s, unsigned *rate)
*rate = irint(drate);
return (0);
}
-
-/* Convert local balance into device parameters */
-static int
-scale_balance(int g)
-{
- return (int)(((g + RIGHT_BAL) / (double)(RIGHT_BAL - LEFT_BAL)) *
- (double)AUDIO_RIGHT_BALANCE);
-}
diff --git a/usr/src/cmd/audio/audiotest/Makefile b/usr/src/cmd/audio/audiotest/Makefile
new file mode 100644
index 0000000000..ad3033716c
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/Makefile
@@ -0,0 +1,50 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Makefile for cmd/audio/audiotest
+
+PROG= audiotest
+OBJS= audiotest.o wavedata.o
+SRCS= $(OBJS:%.o=%.c)
+
+include ../../Makefile.cmd
+
+CFLAGS += $(CCVERBOSE)
+XGETFLAGS += -a -x audiotest.xcl
+
+.KEEP_STATE:
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) $(OBJS) -o $@
+ $(POST_PROCESS)
+
+install: all $(ROOTPROG)
+
+clean:
+
+lint: lint_SRCS
+
+include ../../Makefile.targ
diff --git a/usr/src/cmd/audio/audiotest/audiotest.c b/usr/src/cmd/audio/audiotest/audiotest.c
new file mode 100644
index 0000000000..c995ea16e9
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/audiotest.c
@@ -0,0 +1,575 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * This program is a general purpose test facility for audio output.
+ * It does not test record.
+ *
+ * The wavedata.c and wavedata.h files contain the actual samples compressed
+ * using the MS ADPCM algorithm.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <sys/soundcard.h>
+#include <inttypes.h>
+#include <locale.h>
+
+#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
+#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
+#endif
+
+#define _(s) gettext(s)
+
+/*
+ * Channel selectors
+ */
+#define CH_LEFT (1 << 0)
+#define CH_RIGHT (1 << 1)
+#define CH_LREAR4 (1 << 2) /* quadraphonic */
+#define CH_RREAR4 (1 << 3) /* quadraphonic */
+#define CH_CENTER (1 << 2)
+#define CH_LFE (1 << 3)
+#define CH_LSURR (1 << 4)
+#define CH_RSURR (1 << 5)
+#define CH_LREAR (1 << 6)
+#define CH_RREAR (1 << 7)
+#define CH_STEREO (CH_LEFT|CH_RIGHT)
+#define CH_4 (CH_STEREO | CH_LREAR4 | CH_RREAR4)
+#define CH_5 (CH_STEREO | CH_CENTER | CH_LSURR | CH_RSURR)
+#define CH_7 (CH_5 | CH_LREAR | CH_RREAR)
+
+typedef struct chancfg {
+ int mask;
+ const char *name;
+ unsigned flags;
+ int16_t *data;
+ int len;
+} chancfg_t;
+
+typedef struct testcfg {
+ int nchan;
+ chancfg_t *tests[16];
+} testcfg_t;
+
+#define CFLAG_LFE 0x1 /* lfe channel - not full range */
+
+/*
+ * TRANSLATION_NOTE : The following strings are displayed during progress.
+ * Its important for alignment that they have the same displayed length.
+ */
+#define NM_LEFT "\t<left> ................"
+#define NM_RIGHT "\t<right> ..............."
+#define NM_LREAR "\t<left rear> ..........."
+#define NM_RREAR "\t<right rear> .........."
+#define NM_LSIDE "\t<left side> ..........."
+#define NM_RSIDE "\t<right side> .........."
+#define NM_CENTER "\t<center> .............."
+#define NM_LFE "\t<lfe> ................."
+#define NM_STEREO "\t<stereo> .............."
+#define NM_40 "\t<4.0 surround> ........"
+#define NM_50 "\t<5.0 surround> ........"
+#define NM_70 "\t<7.0 surround> ........"
+
+chancfg_t ch_left = { CH_LEFT, NM_LEFT, 0 };
+chancfg_t ch_right = { CH_RIGHT, NM_RIGHT, 0 };
+chancfg_t ch_stereo = { CH_STEREO, NM_STEREO, 0 };
+
+chancfg_t ch_center = { CH_CENTER, NM_CENTER, 0 };
+chancfg_t ch_lfe = { CH_LFE, NM_LFE, CFLAG_LFE };
+
+chancfg_t ch_lsurr_4 = { (1 << 2), NM_LREAR, 0 };
+chancfg_t ch_rsurr_4 = { (1 << 3), NM_RREAR, 0 };
+chancfg_t ch_4 = { CH_4, NM_40, 0 };
+
+chancfg_t ch_lsurr_5 = { CH_LSURR, NM_LREAR, 0 };
+chancfg_t ch_rsurr_5 = { CH_RSURR, NM_RREAR, 0 };
+chancfg_t ch_5 = { CH_5, NM_50, 0 };
+
+chancfg_t ch_lsurr_7 = { CH_LSURR, NM_LSIDE, 0 };
+chancfg_t ch_rsurr_7 = { CH_RSURR, NM_RSIDE, 0 };
+chancfg_t ch_lrear_7 = { CH_LREAR, NM_LREAR, 0 };
+chancfg_t ch_rrear_7 = { CH_RREAR, NM_RREAR, 0 };
+chancfg_t ch_7 = { CH_7, NM_70, 0 };
+
+testcfg_t test_stereo = {
+ 2, { &ch_left, &ch_right, &ch_stereo, NULL }
+};
+
+testcfg_t test_quad = {
+ 4, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_4, &ch_rsurr_4, &ch_4, NULL }
+};
+
+testcfg_t test_51 = {
+ 6, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_5, &ch_rsurr_5, &ch_center, &ch_lfe, &ch_5, NULL }
+};
+
+testcfg_t test_71 = {
+ 8, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_7, &ch_rsurr_7, &ch_lrear_7, &ch_rrear_7,
+ &ch_center, &ch_lfe, &ch_7, NULL }
+};
+
+/*
+ * uncompress_wave() is defined in wavedata.c. It expands the audio
+ * samples stored in wavedata.h and returns the lenghth of the
+ * uncompressed version in bytes.
+ *
+ * The uncompressed wave data format is 16 bit (native) stereo
+ * recorded at 48000 Hz.
+ */
+extern int uncompress_wave(short *outbuf);
+
+static int data_len;
+
+#define MAXDEVICE 64
+extern void describe_error(int);
+
+#define SAMPLE_RATE 48000
+
+/*
+ * Operating mode flags (set from the command line).
+ */
+#define TF_LOOP 0x00000010 /* Loop until interrupted */
+
+static int mixerfd;
+static int num_devices_tested = 0;
+
+static short *sample_buf;
+
+void
+prepare(testcfg_t *tcfg)
+{
+ int nsamples;
+ int i;
+ chancfg_t *ccfg;
+ if ((sample_buf = malloc(2000000)) == NULL) {
+ perror("malloc");
+ exit(-1);
+ }
+
+ data_len = uncompress_wave(sample_buf);
+ nsamples = (data_len / sizeof (int16_t)) / 2;
+
+ for (i = 0; (ccfg = tcfg->tests[i]) != NULL; i++) {
+ int16_t *src, *dst;
+ int ch;
+ int samp;
+
+ src = sample_buf;
+
+ if (ccfg->flags != CFLAG_LFE) {
+ ccfg->len = nsamples * tcfg->nchan * sizeof (int16_t);
+ ccfg->data = malloc(ccfg->len);
+ if ((dst = ccfg->data) == NULL) {
+ perror("malloc");
+ exit(-1);
+ }
+ for (samp = 0; samp < nsamples; samp++) {
+ for (ch = 0; ch < tcfg->nchan; ch++) {
+ *dst = ((1U << ch) & ccfg->mask) ?
+ *src : 0;
+ dst++;
+ }
+ src += 2;
+ }
+ } else {
+ /* Skip LFE for now */
+ ccfg->len = 0;
+ }
+ }
+}
+
+/*
+ * The testdsp() routine checks the capabilities of a given audio device number
+ * (parameter n) and decides if the test sound needs to be played.
+ */
+
+/*ARGSUSED*/
+int
+testdsp(int hd, int flags, testcfg_t *tcfg)
+{
+ float ratio;
+ struct timeval t1, t2;
+ unsigned long t;
+ int sample_rate;
+ int delay;
+ long long total_bytes = 0;
+ unsigned int tmp, caps;
+ int i;
+ chancfg_t *ccfg;
+
+ caps = 0;
+ if (ioctl(hd, SNDCTL_DSP_GETCAPS, &caps) == -1) {
+ perror("SNDCTL_DSP_GETCAPS");
+ return (-1);
+ }
+
+ /*
+ * Setup the sample format. Since OSS will support AFMT_S16_NE
+ * regardless of the device we do not need to support any
+ * other formats.
+ */
+
+ tmp = AFMT_S16_NE;
+ if (ioctl(hd, SNDCTL_DSP_SETFMT, &tmp) == -1 || tmp != AFMT_S16_NE) {
+ (void) printf(_("Device doesn't support native 16-bit PCM\n"));
+ return (-1);
+ }
+
+ /*
+ * Setup the device for channels. Once again we can simply
+ * assume that stereo will always work before OSS takes care
+ * of this by emulation if necessary.
+ */
+ tmp = tcfg->nchan;
+ if (ioctl(hd, SNDCTL_DSP_CHANNELS, &tmp) == -1 || tmp != tcfg->nchan) {
+ (void) printf(_("The device doesn't support %d channels\n"),
+ tcfg->nchan);
+ return (-2);
+ }
+
+ /*
+ * Set up the sample rate.
+ */
+
+ tmp = SAMPLE_RATE;
+ if (ioctl(hd, SNDCTL_DSP_SPEED, &tmp) == -1) {
+ perror("SNDCTL_DSP_SPEED");
+ return (-3);
+ }
+
+ sample_rate = tmp;
+ if (sample_rate != SAMPLE_RATE) {
+ (void) printf(_("The device doesn't support %d Hz\n"),
+ SAMPLE_RATE);
+ return (-3);
+ }
+ (void) printf("\n");
+
+ /*
+ * This program will measure the real sampling rate by
+ * computing the total time required to play the sample.
+ *
+ * This is not terribly presice with short test sounds but it
+ * can be used to detect if the sampling rate badly
+ * wrong. Errors of few percents is more likely to be caused
+ * by poor accuracy of the system clock rather than problems
+ * with the sampling rate.
+ */
+ (void) gettimeofday(&t1, NULL);
+
+ for (i = 0; (ccfg = tcfg->tests[i]) != NULL; i++) {
+ (void) fputs(_(ccfg->name), stdout);
+ (void) fflush(stdout);
+ if (ccfg->flags & CFLAG_LFE) {
+ (void) printf(_("SKIPPED\n"));
+ continue;
+ }
+
+ if (write(hd, ccfg->data, ccfg->len) < 0) {
+ (void) printf(_("ERROR: %s\n"),
+ strerror(errno));
+ return (-3);
+ }
+ (void) printf(_("OK\n"));
+ total_bytes += ccfg->len;
+ }
+
+ (void) gettimeofday(&t2, NULL);
+ delay = 0;
+ (void) ioctl(hd, SNDCTL_DSP_GETODELAY, &delay); /* Ignore errors */
+
+ /*
+ * Perform the time computations using milliseconds.
+ */
+
+ t = t2.tv_sec - t1.tv_sec;
+ t *= 1000;
+
+ t += t2.tv_usec / 1000;
+ t -= t1.tv_usec / 1000;
+
+ total_bytes -= delay;
+ total_bytes *= 1000;
+
+ total_bytes /= t;
+ total_bytes /= (tcfg->nchan * sizeof (int16_t));
+
+ ratio = ((float)total_bytes / (float)sample_rate) * 100.0;
+ (void) printf(_("\t<measured sample rate %8.2f Hz (%4.2f%%)>\n"),
+ (float)sample_rate * ratio / 100.0, ratio - 100.0);
+ num_devices_tested++;
+
+ return (1);
+}
+
+static int
+find_num_devices(void)
+{
+ oss_sysinfo info;
+ struct utsname un;
+ /*
+ * Find out the number of available audio devices by calling
+ * SNDCTL_SYSINFO.
+ */
+
+ if (ioctl(mixerfd, SNDCTL_SYSINFO, &info) == -1) {
+ if (errno == ENXIO) {
+ (void) fprintf(stderr,
+ _("No supported sound hardware detected.\n"));
+ exit(-1);
+ } else {
+ perror("SNDCTL_SYSINFO");
+ (void) printf(_("Cannot get system information.\n"));
+ exit(-1);
+ }
+ }
+ (void) printf(_("Sound subsystem and version: %s %s (0x%08X)\n"),
+ info.product, info.version, info.versionnum);
+
+ if (uname(&un) != -1)
+ (void) printf(_("Platform: %s %s %s %s\n"),
+ un.sysname, un.release, un.version, un.machine);
+
+ return (info.numaudios);
+}
+
+/*
+ * The test_device() routine checks certain information about the device
+ * and calls testdsp() to play the test sound.
+ */
+
+int
+test_device(char *dn, int flags, testcfg_t *tcfg)
+{
+ oss_audioinfo ainfo;
+ int code;
+ int fd;
+
+ fd = open(dn, O_WRONLY, 0);
+ if (fd == -1) {
+ int err = errno;
+ perror(dn);
+ errno = err;
+ describe_error(errno);
+ return (0);
+ }
+
+ ainfo.dev = -1;
+ if (ioctl(fd, SNDCTL_AUDIOINFO, &ainfo) == -1) {
+ perror("SNDCTL_AUDIOINFO");
+ (void) close(fd);
+ return (1);
+ }
+
+ (void) printf(_("\n*** Scanning sound adapter #%d ***\n"),
+ ainfo.card_number);
+
+ (void) printf(_("%s (audio engine %d): %s\n"), ainfo.devnode, ainfo.dev,
+ ainfo.name);
+
+ if (!ainfo.enabled) {
+ (void) printf(_(" - Device not present - Skipping\n"));
+ (void) close(fd);
+ return (1);
+ }
+
+ if (!(ainfo.caps & PCM_CAP_OUTPUT)) {
+ (void) printf(_(" - Skipping input only device\n"));
+ (void) close(fd);
+ return (1);
+ }
+
+ (void) printf(_(" - Performing audio playback test... "));
+ (void) fflush(stdout);
+
+ code = testdsp(fd, flags, tcfg);
+ (void) close(fd);
+
+ return (code == 1);
+}
+
+void
+describe_error(int err)
+{
+ switch (err) {
+ case ENODEV:
+ (void) fprintf(stderr,
+ _("The device file was found in /dev but\n"
+ "the driver was not loaded.\n"));
+ break;
+
+ case ENXIO:
+ (void) fprintf(stderr,
+ _("There are no sound devices available.\n"
+ "The most likely reason is that the device you have\n"
+ "is malfunctioning or it's not supported.\n"
+ "It's also possible that you are trying to use the wrong "
+ "device file.\n"));
+ break;
+
+ case ENOSPC:
+ (void) fprintf(stderr,
+ _("Your system cannot allocate memory for the device\n"
+ "buffers. Reboot your machine and try again.\n"));
+ break;
+
+ case ENOENT:
+ (void) fprintf(stderr,
+ _("The device file is missing from /dev.\n"));
+ break;
+
+
+ case EBUSY:
+ (void) fprintf(stderr,
+ _("The device is busy. There is some other application\n"
+ "using it.\n"));
+ break;
+
+ default:
+ break;
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int t, i;
+ int maxdev;
+ int flags = 0;
+ int status = 0;
+ int numdev;
+ extern int optind;
+ testcfg_t *tcfg;
+
+ (void) setlocale(LC_ALL, "");
+ (void) textdomain(TEXT_DOMAIN);
+
+ tcfg = &test_stereo;
+
+ /*
+ * Simple command line switch handling.
+ */
+
+ while ((i = getopt(argc, argv, "l2457")) != EOF) {
+ switch (i) {
+ case 'l':
+ flags |= TF_LOOP;
+ break;
+ case '2':
+ tcfg = &test_stereo;
+ break;
+ case '4':
+ tcfg = &test_quad;
+ break;
+ case '5':
+ tcfg = &test_51;
+ break;
+ case '7':
+ tcfg = &test_71;
+ break;
+ default:
+ (void) printf(_("Usage: %s [options...] [device]\n"
+ " -2 Stereo test\n"
+ " -4 Quadraphonic 4.0 test\n"
+ " -5 Surround 5.1 test\n"
+ " -7 Surround 7.1 test\n"
+ " -l Loop test\n"), argv[0]);
+ exit(-1);
+ }
+ }
+
+ /*
+ * Open the mixer device used for calling SNDCTL_SYSINFO and
+ * SNDCTL_AUDIOINFO.
+ */
+ if ((mixerfd = open("/dev/mixer", O_RDWR, 0)) == -1) {
+ int err = errno;
+ perror("/dev/mixer");
+ errno = err;
+ describe_error(errno);
+ exit(-1);
+ }
+
+ prepare(tcfg); /* Prepare the wave data */
+
+ /*
+ * Enumerate all devices and play the test sounds.
+ */
+ maxdev = find_num_devices();
+ if (maxdev < 1) {
+ (void) printf(_("\n*** No audio hardware available ***\n"));
+ exit(-1);
+ }
+
+ numdev = (argc - optind);
+ do {
+ char *dn;
+ oss_audioinfo ainfo;
+
+ if (numdev > 0) {
+ for (t = 0; t < numdev; t++) {
+ dn = argv[optind + t];
+ if (!test_device(dn, flags, tcfg))
+ status++;
+ }
+ } else {
+ for (t = 0; t < maxdev; t++) {
+ ainfo.dev = t;
+ if (ioctl(mixerfd, SNDCTL_AUDIOINFO,
+ &ainfo) == -1) {
+ perror("SNDCTL_AUDIOINFO");
+ status++;
+ continue;
+ }
+ dn = ainfo.devnode;
+ if (!test_device(dn, flags, tcfg))
+ status++;
+ }
+ }
+
+ if (status == 0)
+ (void) printf(_("\n*** All tests completed OK ***\n"));
+ else
+ (void) printf(_("\n*** Errors were detected ***\n"));
+
+ } while (flags & TF_LOOP);
+
+ (void) close(mixerfd);
+
+ return (status);
+}
diff --git a/usr/src/cmd/mdb/sparc/v9/audiosup/Makefile b/usr/src/cmd/audio/audiotest/audiotest.xcl
index 33e20a4a01..42057d7af3 100644
--- a/usr/src/cmd/mdb/sparc/v9/audiosup/Makefile
+++ b/usr/src/cmd/audio/audiotest/audiotest.xcl
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -19,18 +18,31 @@
#
# CDDL HEADER END
#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-
-MODULE = audiosup.so
-MDBTGT = kvm
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../../../Makefile.cmd.64
-include ../../Makefile.sparcv9
-include ../../../Makefile.module
+#
+# separating newline
+#
+msgid "\n"
+#
+# getopt switches
+#
+msgid "l2457"
+#
+# file name
+#
+msgid "/dev/mixer"
+#
+# ioctls and system calls used with perror
+#
+msgid "malloc"
+msgid "SNDCTL_DSP_GETCAPS"
+msgid "SNDCTL_DSP_SPEED"
+msgid "SNDCTL_SYSINFO"
+msgid "SNDCTL_AUDIOINFO"
+#
+# argument to setlocale
+#
+msgid ""
diff --git a/usr/src/cmd/audio/audiotest/wavedata.c b/usr/src/cmd/audio/audiotest/wavedata.c
new file mode 100644
index 0000000000..94a05f51ea
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/wavedata.c
@@ -0,0 +1,194 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Test sounds for osstest
+ *
+ * Nodoc:
+ */
+
+#include <string.h>
+
+#include "wavedata.h"
+
+static int
+le_int(const unsigned char *p, int l)
+{
+ int i, val;
+
+ val = 0;
+
+ for (i = l - 1; i >= 0; i--) {
+ val = (val << 8) | p[i];
+ }
+
+ return (val);
+}
+
+int
+uncompress_wave(short *outbuf)
+{
+#define WAVE_FORMAT_ADPCM 0x0002
+
+ int i, n, dataleft, x, l = sizeof (inbuf);
+ const unsigned char *hdr = inbuf;
+ typedef struct {
+ int coeff1, coeff2;
+ }
+ adpcm_coeff;
+
+ adpcm_coeff coeff[32];
+ static int AdaptionTable[] = { 230, 230, 230, 230, 307, 409, 512, 614,
+ 768, 614, 512, 409, 307, 230, 230, 230
+ };
+
+ unsigned char buf[4096];
+
+ int channels = 1;
+ int p = 12, outp = 0;
+ int nBlockAlign = 2048;
+ int wSamplesPerBlock = 2036, wNumCoeff = 7;
+ int nib;
+ int ppp;
+
+ /* filelen = le_int(&hdr[4], 4); */
+
+ while (p < l - 16 && memcmp(&hdr[p], "data", 4) != 0) {
+ n = le_int(&hdr[p + 4], 4);
+
+ if (memcmp(&hdr[p], "fmt ", 4) == 0) {
+
+ /* fmt = le_int(&hdr[p + 8], 2); */
+ channels = le_int(&hdr[p + 10], 2);
+ /* speed = le_int(&hdr[p + 12], 4); */
+ nBlockAlign = le_int(&hdr[p + 20], 2);
+ /* bytes_per_sample = le_int(&hdr[p + 20], 2); */
+
+ wSamplesPerBlock = le_int(&hdr[p + 26], 2);
+ wNumCoeff = le_int(&hdr[p + 28], 2);
+
+ x = p + 30;
+
+ for (i = 0; i < wNumCoeff; i++) {
+ coeff[i].coeff1 = (short)le_int(&hdr[x], 2);
+ x += 2;
+ coeff[i].coeff2 = (short)le_int(&hdr[x], 2);
+ x += 2;
+ }
+ }
+
+ p += n + 8;
+ }
+
+ if (p < l - 16 && memcmp(&hdr[p], "data", 4) == 0) {
+
+ dataleft = n = le_int(&hdr[p + 4], 4);
+ p += 8;
+
+/*
+ * Playback procedure
+ */
+#define OUT_SAMPLE(s) { \
+ if (s > 32767) \
+ s = 32767; \
+ else if (s < -32768) \
+ s = -32768; \
+ outbuf[outp++] = s; \
+ n += 2; \
+ }
+
+#define GETNIBBLE \
+ ((nib == 0) ? \
+ (buf[x + nib++] >> 4) & 0x0f : buf[x++ + --nib] & 0x0f)
+
+ outp = 0;
+
+ ppp = p;
+ while (dataleft > nBlockAlign) {
+ int predictor[2], delta[2], samp1[2], samp2[2];
+
+ int x = 0;
+
+ (void) memcpy(buf, &inbuf[ppp], nBlockAlign);
+ ppp += nBlockAlign;
+ dataleft -= nBlockAlign;
+
+ nib = 0;
+ n = 0;
+
+ for (i = 0; i < channels; i++) {
+ predictor[i] = buf[x];
+ x++;
+ }
+
+ for (i = 0; i < channels; i++) {
+ delta[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ }
+
+ for (i = 0; i < channels; i++) {
+ samp1[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ OUT_SAMPLE(samp1[i]);
+ }
+
+ for (i = 0; i < channels; i++) {
+ samp2[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ OUT_SAMPLE(samp2[i]);
+ }
+
+ while (n < (wSamplesPerBlock * 2 * channels))
+ for (i = 0; i < channels; i++) {
+ int pred, new, error_delta, i_delta;
+
+ pred = ((samp1[i] *
+ coeff[predictor[i]].coeff1)
+ + (samp2[i] *
+ coeff[predictor[i]].coeff2)) / 256;
+ i_delta = error_delta = GETNIBBLE;
+
+ /* Convert to signed */
+ if (i_delta & 0x08)
+ i_delta -= 0x10;
+
+ new = pred + (delta[i] * i_delta);
+ OUT_SAMPLE(new);
+
+ delta[i] = delta[i] *
+ AdaptionTable[error_delta] / 256;
+ if (delta[i] < 16)
+ delta[i] = 16;
+
+ samp2[i] = samp1[i];
+ samp1[i] = new;
+ }
+ }
+
+ }
+
+ return (outp * 2);
+}
diff --git a/usr/src/cmd/audio/audiotest/wavedata.h b/usr/src/cmd/audio/audiotest/wavedata.h
new file mode 100644
index 0000000000..5e98da8b70
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/wavedata.h
@@ -0,0 +1,42792 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef WAVEDATA_H
+#define WAVEDATA_H
+
+static const unsigned char inbuf[] = {
+ 0x52, 0x49, 0x46, 0x46, 0x26, 0x38, 0x05, 0x00, 0x57, 0x41, 0x56, 0x45,
+ 0x66, 0x6d, 0x74, 0x20,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x80, 0xbb, 0x00, 0x00,
+ 0x9b, 0xbc, 0x00, 0x00,
+ 0x00, 0x08, 0x04, 0x00, 0x20, 0x00, 0xf4, 0x07, 0x07, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xcc, 0x01,
+ 0x30, 0xff, 0x88, 0x01, 0x18, 0xff, 0x66, 0x61, 0x63, 0x74, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x30,
+ 0x05, 0x00, 0x64, 0x61, 0x74, 0x61, 0xd4, 0x37, 0x05, 0x00, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0xf0,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x0f, 0x10, 0xf0, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x1f, 0x01, 0xf0,
+ 0x0f, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xe0, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x10, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x20, 0x00, 0xf0, 0x0f,
+ 0x00, 0x20, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x11, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x20, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x20, 0x00, 0xf0, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x20,
+ 0xf0, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x10, 0x20,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x01, 0x01, 0x0f, 0xf0, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0xe0, 0x10, 0x21, 0xf0, 0xef, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x01, 0x0f, 0x1f,
+ 0x00, 0xf2, 0x00, 0x1e, 0x10, 0x01, 0x00, 0x0f, 0x0f, 0x10, 0x01, 0x00,
+ 0x0f, 0x0f, 0xf0, 0x00,
+ 0x11, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x10, 0x0f,
+ 0x00, 0x00, 0x02, 0x10, 0x0e, 0x00, 0x10, 0xf0, 0x00, 0x10, 0x20, 0xf0,
+ 0x0f, 0xff, 0x10, 0x10,
+ 0x10, 0x0f, 0x0f, 0x0f, 0x00, 0x01, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x0f,
+ 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x21, 0x00,
+ 0xf1, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xef, 0x00,
+ 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xe0,
+ 0xf0, 0x10, 0x0f, 0x00,
+ 0xf1, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x21, 0xf0, 0xf0, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0xf1, 0x1f,
+ 0x30, 0x00, 0xe0, 0x1f,
+ 0x10, 0x20, 0x02, 0x0f, 0x1f, 0x00, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0xe0, 0x01, 0x00, 0x10, 0x0f, 0xf1, 0xf1, 0x00, 0x0f, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0xf1, 0x00, 0x00, 0x2e, 0xe0,
+ 0xe1, 0x0f, 0x0e, 0x12,
+ 0x01, 0xf0, 0xfe, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x01,
+ 0x10, 0x0f, 0x00, 0xf0,
+ 0xf1, 0x00, 0x00, 0x1f, 0x01, 0x01, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x11,
+ 0x01, 0x0f, 0x0f, 0x11,
+ 0x00, 0x00, 0x0f, 0x20, 0xf1, 0xf0, 0x0e, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0xfe, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x0e, 0xf0, 0x02, 0x11, 0x0f, 0x00,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x10, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x02, 0x10, 0x1d,
+ 0xf0, 0xf1, 0x02, 0x0f,
+ 0x2f, 0x00, 0xe0, 0x00, 0x10, 0x10, 0xf1, 0x0f, 0x0f, 0x20, 0xf0, 0xf0,
+ 0x10, 0x20, 0x0f, 0x00,
+ 0x01, 0x10, 0x20, 0x00, 0x00, 0x11, 0x10, 0x1f, 0x00, 0x01, 0x00, 0x00,
+ 0x21, 0x0f, 0xff, 0x00,
+ 0x11, 0x12, 0x0f, 0xff, 0xf0, 0x00, 0x21, 0x0e, 0xf0, 0xf0, 0x10, 0x0f,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x0f, 0xff, 0x01, 0x10, 0x1f, 0x0f, 0xf0,
+ 0x00, 0x00, 0x2f, 0x00,
+ 0xf0, 0xf0, 0x0f, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x01, 0x01, 0x00, 0x0e,
+ 0xf0, 0x01, 0x11, 0x00,
+ 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0xf0, 0x00, 0xf2, 0xf0, 0x00, 0x0f,
+ 0x02, 0xf1, 0xd1, 0x00,
+ 0x00, 0x01, 0x0f, 0xe0, 0xf1, 0xf1, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x02, 0xf0, 0x0d, 0x00,
+ 0x01, 0x12, 0x00, 0xff, 0x00, 0x00, 0x11, 0x22, 0x00, 0x0e, 0xf1, 0x02,
+ 0x31, 0x00, 0xf0, 0x10,
+ 0x00, 0x01, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x01,
+ 0x10, 0x10, 0x0f, 0xf0,
+ 0x00, 0x02, 0x20, 0x00, 0x0f, 0x0e, 0x00, 0xf0, 0x12, 0x20, 0x0f, 0x0f,
+ 0xf0, 0x00, 0x11, 0x21,
+ 0x1f, 0x00, 0xf0, 0x00, 0x10, 0x2f, 0x00, 0xf2, 0x0f, 0x1f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0xe1, 0xf0, 0x0f, 0x41, 0x01, 0xd0, 0x00, 0x01, 0x31,
+ 0xf0, 0xf0, 0xff, 0x00,
+ 0xf2, 0x10, 0x0f, 0x00, 0xff, 0xef, 0x01, 0x22, 0x01, 0xfe, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0xf1,
+ 0x00, 0x1e, 0x00, 0xf0, 0xf1, 0x0f, 0x0e, 0x00, 0x02, 0xf0, 0x0e, 0x0e,
+ 0x10, 0x11, 0x00, 0x00,
+ 0x0e, 0x00, 0x11, 0x20, 0x0f, 0xfe, 0x01, 0x01, 0x00, 0x0e, 0x20, 0x00,
+ 0xe0, 0xff, 0x10, 0x22,
+ 0x00, 0xff, 0x0e, 0xf0, 0x01, 0x00, 0x0f, 0xff, 0x00, 0x11, 0x1f, 0x0f,
+ 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01,
+ 0x10, 0xff, 0xe0, 0x00,
+ 0x10, 0x20, 0xf0, 0xe0, 0x0f, 0x00, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xd0,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x00, 0x0f, 0x0f, 0x01, 0x00, 0xf0, 0x10, 0x00, 0x0e, 0x00, 0xe1, 0xf2,
+ 0xf0, 0x1f, 0x20, 0xe1,
+ 0xe0, 0x00, 0x11, 0x30, 0xf0, 0xff, 0x0f, 0x0f, 0x1e, 0x11, 0x01, 0x0f,
+ 0x0d, 0x00, 0x0f, 0x10,
+ 0x10, 0x0f, 0xef, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x2f, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x30, 0xe0, 0xe0, 0xf0, 0x10, 0x20, 0x00, 0xf0, 0xe1, 0x1f, 0x10, 0x02,
+ 0x00, 0x00, 0x20, 0x00,
+ 0xf1, 0xf1, 0x00, 0x20, 0x00, 0x0f, 0xe0, 0x02, 0x10, 0x2f, 0x00, 0x01,
+ 0x00, 0x00, 0x2e, 0x21,
+ 0x03, 0xfe, 0x0f, 0x30, 0x11, 0x01, 0x0f, 0x00, 0x23, 0x10, 0x00, 0x00,
+ 0x01, 0x21, 0x02, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x01, 0xc2, 0x00, 0x20, 0x30, 0xe1,
+ 0xe1, 0x00, 0x1f, 0x01,
+ 0x01, 0x00, 0x00, 0xe0, 0x01, 0x2f, 0x0e, 0xe0, 0xf4, 0x01, 0x1d, 0xfe,
+ 0xe1, 0x02, 0x00, 0x1e,
+ 0xf0, 0xe0, 0xf0, 0x0e, 0x20, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x01, 0x00,
+ 0x1f, 0x0d, 0xf0, 0xe2,
+ 0x1f, 0x2d, 0x0f, 0xe1, 0x01, 0x10, 0x0e, 0x0f, 0x00, 0x11, 0x0f, 0x1f,
+ 0x00, 0x00, 0xf1, 0x10,
+ 0x2f, 0x10, 0x00, 0x00, 0x02, 0x11, 0x0f, 0x1f, 0x10, 0x11, 0xf0, 0xf1,
+ 0x01, 0x10, 0x10, 0x00,
+ 0x00, 0xf1, 0x01, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0xfe, 0x01, 0x02, 0xff,
+ 0xee, 0x00, 0x00, 0x10,
+ 0xf0, 0xe0, 0x00, 0x11, 0x20, 0xf0, 0xde, 0x10, 0x21, 0x21, 0xf0, 0xe0,
+ 0x0f, 0x10, 0x1f, 0x10,
+ 0x00, 0xf1, 0xf0, 0x00, 0x21, 0x01, 0xf0, 0xe0, 0x00, 0x12, 0x01, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x02, 0x00, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x01, 0x10,
+ 0x00, 0x01, 0xff, 0x00,
+ 0x11, 0x02, 0xf0, 0x00, 0x11, 0x00, 0xef, 0x10, 0x12, 0xe2, 0xff, 0x1e,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x02, 0x0f, 0x00, 0x10, 0x02, 0x10, 0x00, 0x12, 0x00,
+ 0x0e, 0x00, 0x13, 0x00,
+ 0x00, 0x0e, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x00, 0x14, 0x00, 0xfe, 0x0e,
+ 0x01, 0x01, 0x1f, 0x0e,
+ 0xf1, 0x02, 0x0f, 0x2e, 0x00, 0xf0, 0x03, 0x00, 0x0f, 0x10, 0x10, 0x00,
+ 0xef, 0x0f, 0x01, 0x01,
+ 0x00, 0x0e, 0x00, 0x01, 0x10, 0x01, 0x11, 0x00, 0xef, 0x00, 0x20, 0x13,
+ 0x00, 0xdf, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0xe0, 0xf1, 0xf0, 0x01, 0x1f, 0xe0, 0xe0, 0xf2, 0x00,
+ 0x0d, 0x00, 0xef, 0xf0,
+ 0x01, 0x00, 0xef, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x10, 0x00, 0x02, 0x00,
+ 0x0e, 0x00, 0x32, 0x00, 0x0f, 0xe0, 0x00, 0x31, 0x1f, 0xff, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xd4, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0x0e, 0x0e, 0x01, 0x10,
+ 0x0f, 0xee, 0x00, 0x10,
+ 0x0f, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x0d, 0x0f, 0x00, 0x00,
+ 0x20, 0x0f, 0xdf, 0x00,
+ 0x11, 0x2f, 0x0e, 0xf1, 0xf1, 0x0f, 0x10, 0x10, 0x0e, 0xef, 0x1f, 0x2f,
+ 0x01, 0x01, 0x2e, 0x1c,
+ 0x00, 0xf2, 0x00, 0x6d, 0x10, 0xe1, 0x01, 0x1f, 0x3f, 0x11, 0x01, 0xe0,
+ 0x10, 0x20, 0x12, 0xf0,
+ 0xf0, 0x1f, 0x12, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x02, 0x0f, 0x0f, 0x00,
+ 0x01, 0x11, 0x00, 0x02,
+ 0x00, 0x0e, 0x10, 0x01, 0xe2, 0x00, 0x2e, 0x00, 0xc0, 0x0e, 0x20, 0x00,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0x2e, 0x1d, 0x00, 0x03, 0x10, 0x2f, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x01,
+ 0x01, 0x10, 0x0e, 0xf0,
+ 0x11, 0x13, 0xf0, 0xd0, 0x00, 0x2f, 0x00, 0xd1, 0x00, 0x00, 0xf0, 0xdf,
+ 0x0e, 0x2f, 0x02, 0xf3,
+ 0xdf, 0x0d, 0x42, 0x03, 0xd0, 0x00, 0x10, 0x32, 0x02, 0xd0, 0x00, 0x1f,
+ 0x11, 0x13, 0xf0, 0xf0,
+ 0x0e, 0x30, 0x01, 0xd3, 0x00, 0x1f, 0x2f, 0x00, 0xe0, 0x03, 0x00, 0x1f,
+ 0x0e, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0x10, 0xe0, 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x10,
+ 0xf0, 0x00, 0xff, 0x01, 0x00, 0x10, 0x22, 0xe0, 0xed, 0x01, 0x12, 0x0e,
+ 0xef, 0x02, 0x01, 0x0f,
+ 0x1f, 0xf0, 0xd1, 0xd0, 0x1f, 0x40, 0x00, 0xff, 0xcf, 0xff, 0x1f, 0x2e,
+ 0x00, 0xd1, 0xf0, 0x0f,
+ 0x0d, 0x00, 0x03, 0x01, 0x00, 0x0e, 0xf1, 0x03, 0x20, 0xe0, 0xe1, 0x10,
+ 0x30, 0xf0, 0xd0, 0x00,
+ 0x22, 0x01, 0xfe, 0x0d, 0x10, 0x04, 0xd0, 0x00, 0x2d, 0x00, 0xe2, 0x0f,
+ 0x00, 0x13, 0x00, 0xff,
+ 0xd0, 0x10, 0x3f, 0x2f, 0xf0, 0xd2, 0x11, 0x3f, 0x1b, 0xf0, 0x00, 0x32,
+ 0x1f, 0x0f, 0x00, 0x30,
+ 0x0e, 0x00, 0x21, 0x12, 0x01, 0x0f, 0x0e, 0xf1, 0x12, 0x11, 0x0f, 0x10,
+ 0x11, 0xf3, 0xfe, 0x0d,
+ 0x20, 0x23, 0xe0, 0xd0, 0x1d, 0x31, 0xe2, 0xef, 0x10, 0x12, 0xe1, 0xe0,
+ 0x1e, 0x21, 0xf4, 0xe1,
+ 0x1e, 0x0e, 0xf1, 0xf2, 0x01, 0x2e, 0xe0, 0xd0, 0x00, 0x3f, 0x0e, 0xd2,
+ 0xe1, 0x0f, 0x3d, 0x00,
+ 0xff, 0xd1, 0x01, 0x1f, 0x10, 0x0f, 0xef, 0x00, 0x31, 0x02, 0xf0, 0xff,
+ 0x10, 0x02, 0xff, 0x00,
+ 0x10, 0x01, 0xe3, 0x00, 0x0f, 0x0d, 0x20, 0x03, 0x02, 0x0f, 0x1d, 0x00,
+ 0xf2, 0xe1, 0x1f, 0x3d,
+ 0x00, 0xc2, 0xf0, 0xf0, 0x00, 0x1e, 0x00, 0xd2, 0x12, 0x1d, 0x0e, 0xd0,
+ 0x0f, 0x10, 0x1e, 0x0d,
+ 0xfe, 0x01, 0x0f, 0x1d, 0x0f, 0xe1, 0x20, 0x2c, 0x1f, 0x00, 0x13, 0x0f,
+ 0x0c, 0x00, 0x31, 0x20,
+ 0x0e, 0xf0, 0xf2, 0x01, 0x0e, 0x1d, 0x20, 0xe3, 0xd2, 0x01, 0x00, 0x10,
+ 0x00, 0xee, 0x01, 0x21,
+ 0x01, 0xd2, 0x0f, 0x2c, 0x00, 0x00, 0x04, 0x01, 0x0f, 0xfe, 0x01, 0x13,
+ 0x30, 0x00, 0xe1, 0x10,
+ 0x10, 0x11, 0x00, 0xf0, 0x20, 0x31, 0x01, 0xff, 0x0e, 0x10, 0x44, 0x20,
+ 0x0f, 0x00, 0x01, 0x10,
+ 0x30, 0x10, 0x01, 0x00, 0xdf, 0x00, 0x41, 0x01, 0xd0, 0xd0, 0x12, 0x30,
+ 0x0f, 0xce, 0x03, 0x13,
+ 0x50, 0xfe, 0xc0, 0x00, 0x20, 0x23, 0xd2, 0xf1, 0x00, 0x00, 0x02, 0x12,
+ 0x22, 0xf0, 0xf0, 0x01,
+ 0x40, 0x01, 0xd1, 0x00, 0x4e, 0x00, 0xf0, 0xe0, 0x00, 0x10, 0x20, 0x02,
+ 0xe1, 0x0f, 0x1f, 0x11,
+ 0x02, 0xf0, 0x0f, 0x3f, 0xf1, 0xc2, 0x00, 0x5f, 0x00, 0xff, 0xf0, 0x10,
+ 0x40, 0xff, 0xc0, 0x01,
+ 0x50, 0x00, 0xf0, 0xdf, 0x10, 0x12, 0x11, 0xf0, 0xdf, 0x00, 0x10, 0x22,
+ 0xe0, 0xee, 0x01, 0x02,
+ 0x00, 0x0d, 0x00, 0xf2, 0xf0, 0x20, 0x1d, 0xf2, 0xf2, 0x0f, 0x2d, 0x02,
+ 0x02, 0x0e, 0xee, 0x02,
+ 0x12, 0xfe, 0xed, 0x21, 0x14, 0xe0, 0xec, 0x00, 0x21, 0x10, 0xf0, 0xd0,
+ 0xe0, 0x0f, 0x2e, 0x1f,
+ 0xf2, 0xe2, 0x0f, 0x1d, 0xf0, 0x01, 0x32, 0x10, 0x0e, 0xe0, 0x01, 0x01,
+ 0x0e, 0x1f, 0x20, 0xe2,
+ 0xd0, 0x0f, 0x2d, 0x1f, 0x02, 0xd1, 0x10, 0x2f, 0x00, 0xd0, 0x0e, 0x42,
+ 0x11, 0xff, 0xc0, 0x10,
+ 0x10, 0x2e, 0xf0, 0xf0, 0xf1, 0x10, 0x01, 0x00, 0xdd, 0x0f, 0x12, 0x03,
+ 0xfe, 0x0c, 0x00, 0x00,
+ 0xdf, 0xf1, 0x10, 0x3e, 0xf0, 0xc0, 0x00, 0x1f, 0x10, 0xf3, 0x02, 0x1e,
+ 0x20, 0x01, 0x03, 0x22,
+ 0x02, 0x00, 0x0f, 0x30, 0x10, 0xe2, 0xe2, 0x11, 0x30, 0xfc, 0xd0, 0xe3,
+ 0x10, 0x3f, 0x10, 0xdf,
+ 0xdf, 0x00, 0x00, 0xf1, 0x00, 0x20, 0xd0, 0xdf, 0xf1, 0x21, 0x12, 0xf0,
+ 0xd0, 0x0f, 0x00, 0x00,
+ 0x00, 0x02, 0xe1, 0x0f, 0x0c, 0x00, 0xe2, 0x10, 0x01, 0xd1, 0x00, 0xf1,
+ 0x01, 0xff, 0xd0, 0x04,
+ 0x02, 0x0e, 0xee, 0xf1, 0x43, 0x02, 0xef, 0xeb, 0x20, 0x40, 0x01, 0xd0,
+ 0x10, 0x1f, 0x0f, 0x0e,
+ 0x10, 0x10, 0xe5, 0xfe, 0x2d, 0x21, 0xf2, 0xfe, 0x1e, 0x21, 0x10, 0xfd,
+ 0x0f, 0x10, 0x00, 0x1d,
+ 0x1e, 0x0f, 0x00, 0x00, 0x20, 0xef, 0xff, 0x40, 0x30, 0x00, 0xdf, 0x0f,
+ 0x10, 0x63, 0x1e, 0xfd,
+ 0x00, 0x00, 0x0f, 0x0f, 0x20, 0x40, 0xfc, 0xef, 0xf1, 0x24, 0x2e, 0x0d,
+ 0x00, 0x14, 0x00, 0x0d,
+ 0xd2, 0x11, 0x4d, 0x0d, 0xe1, 0x05, 0x3f, 0xfc, 0xe0, 0x04, 0x30, 0x0d,
+ 0x0d, 0xd1, 0x02, 0x20,
+ 0x1e, 0xef, 0xdf, 0xfe, 0x1f, 0x30, 0xf2, 0xc0, 0x00, 0x5e, 0x00, 0x02,
+ 0xd2, 0x30, 0x7d, 0x02,
+ 0xf5, 0x01, 0x30, 0x0e, 0x02, 0x16, 0x11, 0xff, 0x00, 0xd3, 0x05, 0x2f,
+ 0x10, 0xe1, 0xd1, 0x00,
+ 0x10, 0x13, 0x02, 0x0e, 0xdd, 0x00, 0x14, 0x10, 0x1e, 0xff, 0xf2, 0x00,
+ 0x3e, 0x1e, 0xe1, 0xe5,
+ 0x10, 0x4b, 0xf0, 0xb1, 0x01, 0x20, 0x0f, 0x0e, 0xc1, 0x00, 0x00, 0x2b,
+ 0x00, 0x00, 0x30, 0x0f,
+ 0x0f, 0x20, 0x50, 0x1e, 0x00, 0x21, 0x04, 0x3f, 0x4b, 0x11, 0xf3, 0x00,
+ 0x3e, 0x0f, 0x13, 0x13,
+ 0xe0, 0x00, 0x30, 0x1f, 0xd2, 0xd4, 0x2e, 0x2e, 0x02, 0xa5, 0x00, 0x1e,
+ 0x20, 0xc5, 0xe1, 0x02,
+ 0x10, 0x21, 0xf2, 0xd0, 0xf0, 0x04, 0xf0, 0x10, 0xef, 0xc0, 0xf0, 0x1f,
+ 0x10, 0xc5, 0xc0, 0x0c,
+ 0x2f, 0x41, 0xc3, 0xb0, 0x00, 0x10, 0x20, 0x02, 0xe1, 0xe2, 0xe1, 0x0f,
+ 0x00, 0x13, 0xe2, 0x0f,
+ 0x0e, 0xf0, 0x00, 0xe1, 0xf1, 0x00, 0x2f, 0x0e, 0xe0, 0x00, 0xf1, 0xfe,
+ 0x0c, 0x00, 0x01, 0xe3,
+ 0x0c, 0x0b, 0x00, 0x00, 0xe3, 0x0b, 0xff, 0x00, 0x30, 0x11, 0xff, 0xec,
+ 0x1f, 0x10, 0x11, 0x00,
+ 0xfc, 0x20, 0x3e, 0xfe, 0xc1, 0x22, 0x4e, 0x0e, 0xc2, 0x00, 0x2e, 0x2c,
+ 0x02, 0xf4, 0x1f, 0x2b,
+ 0x00, 0xe0, 0x12, 0x20, 0x10, 0x0e, 0x0f, 0x00, 0x0f, 0x1d, 0x20, 0x33,
+ 0x00, 0xda, 0x00, 0x2f,
+ 0x03, 0xe0, 0x2c, 0x1f, 0xd0, 0xd3, 0xfe, 0x0f, 0x10, 0x11, 0xd0, 0xdf,
+ 0xfc, 0x00, 0x12, 0x00,
+ 0xe0, 0x00, 0x1f, 0x0f, 0xe3, 0x20, 0x4c, 0x12, 0x04, 0x00, 0xff, 0x30,
+ 0x50, 0x02, 0xf2, 0x04,
+ 0x0f, 0xfd, 0x00, 0x05, 0x12, 0x0f, 0x0e, 0x02, 0x01, 0xd1, 0x00, 0x14,
+ 0x3f, 0x0d, 0xd0, 0xe4,
+ 0x05, 0x2f, 0x4e, 0x0f, 0xa1, 0x05, 0x02, 0x2f, 0x2d, 0xf0, 0x02, 0x00,
+ 0x0e, 0x00, 0x0f, 0x41,
+ 0x01, 0xf0, 0x0d, 0x1e, 0x21, 0xe6, 0xe0, 0x20, 0x3e, 0x01, 0xe1, 0x22,
+ 0x10, 0x00, 0xf0, 0x21,
+ 0x7e, 0x0f, 0x03, 0x02, 0x2d, 0x2f, 0x02, 0xf0, 0xee, 0x10, 0x30, 0x0d,
+ 0xae, 0xf2, 0x01, 0x5c,
+ 0xfe, 0xd0, 0xf4, 0x10, 0x1d, 0x0c, 0xdf, 0x03, 0x04, 0x0f, 0xda, 0xff,
+ 0xf0, 0x02, 0x01, 0x0e,
+ 0xff, 0xc0, 0x00, 0x1f, 0x10, 0xc4, 0xe0, 0x00, 0x2e, 0x00, 0xcf, 0x02,
+ 0x22, 0x10, 0xe0, 0xc3,
+ 0x1f, 0x4e, 0xe0, 0xc1, 0x04, 0x32, 0x0e, 0xcc, 0xff, 0x00, 0x03, 0x04,
+ 0x10, 0x1e, 0xe0, 0xf1,
+ 0x21, 0x12, 0xce, 0xe1, 0x47, 0x20, 0xee, 0xb0, 0x03, 0x11, 0x1e, 0xef,
+ 0xe1, 0xe1, 0xef, 0x0e,
+ 0x11, 0xf0, 0xd0, 0x00, 0xff, 0xed, 0x0e, 0x12, 0x03, 0x0c, 0x1c, 0x01,
+ 0xd3, 0x11, 0x70, 0x0d,
+ 0xf0, 0xe1, 0x16, 0x10, 0x0c, 0xf0, 0xf1, 0x12, 0x20, 0xdc, 0xb0, 0x00,
+ 0x60, 0x00, 0xf1, 0xe0,
+ 0x00, 0x11, 0xf0, 0x02, 0x50, 0x00, 0x0f, 0xce, 0x01, 0x44, 0x4f, 0xfc,
+ 0xe1, 0x02, 0x10, 0x10,
+ 0x24, 0x20, 0x01, 0xe0, 0x01, 0x21, 0x60, 0x0f, 0xf1, 0x05, 0x30, 0x5e,
+ 0x00, 0x00, 0xf4, 0x13,
+ 0x62, 0x20, 0xfc, 0xd0, 0x12, 0x17, 0x12, 0x0d, 0x1f, 0xf0, 0xa2, 0x03,
+ 0x21, 0x20, 0xce, 0xd1,
+ 0x11, 0x61, 0x01, 0xf0, 0xef, 0x1d, 0x50, 0x10, 0xf1, 0xe1, 0x3d, 0x2f,
+ 0xf0, 0x00, 0x10, 0x22,
+ 0x30, 0x10, 0x01, 0xf0, 0x3e, 0x30, 0x12, 0x34, 0x30, 0xed, 0xfc, 0x10,
+ 0x41, 0x33, 0x02, 0x0e,
+ 0xfa, 0x00, 0x03, 0x21, 0x5c, 0xf0, 0xd1, 0xf2, 0x0e, 0x0d, 0x00, 0x11,
+ 0xc0, 0xee, 0x03, 0x04,
+ 0x3d, 0xea, 0xb0, 0x02, 0xf0, 0x10, 0x4d, 0x0e, 0xa3, 0xf0, 0x1f, 0x2d,
+ 0x00, 0xaf, 0x02, 0x02,
+ 0x0e, 0x0f, 0xf0, 0xe2, 0x01, 0x03, 0xe0, 0x0d, 0x2f, 0xb0, 0xe0, 0x00,
+ 0x3d, 0x1f, 0xd2, 0xb0,
+ 0x0a, 0x20, 0x41, 0xe0, 0xcc, 0x00, 0x01, 0xfd, 0x1f, 0xf0, 0xbe, 0xe0,
+ 0x21, 0x00, 0x9d, 0x00,
+ 0x02, 0xfe, 0xdc, 0xf0, 0x04, 0x10, 0x0d, 0xee, 0xf0, 0xf2, 0xde, 0x0d,
+ 0x40, 0x01, 0xf0, 0xde,
+ 0x00, 0x00, 0x01, 0x03, 0x32, 0x2d, 0xde, 0xc0, 0x36, 0x52, 0x0e, 0xed,
+ 0x00, 0x14, 0x00, 0xfe,
+ 0xff, 0x0e, 0x1e, 0xe0, 0xd2, 0x0f, 0x0c, 0x00, 0xd6, 0xf0, 0x0d, 0x1d,
+ 0x04, 0xb4, 0xff, 0x0c,
+ 0x20, 0x00, 0xc1, 0x0f, 0x0c, 0x00, 0xb2, 0x0d, 0x1a, 0x30, 0x10, 0xf3,
+ 0x0e, 0x1a, 0x60, 0x10,
+ 0x22, 0x30, 0x3f, 0x0e, 0x00, 0x35, 0x51, 0x1f, 0x4f, 0x25, 0x02, 0x0f,
+ 0x0f, 0x23, 0x60, 0x24,
+ 0xe2, 0x0f, 0x3f, 0x31, 0x11, 0x00, 0x40, 0x32, 0x00, 0x00, 0x4d, 0x01,
+ 0xe4, 0xf0, 0x4b, 0x51,
+ 0xf3, 0xd0, 0x2d, 0x4f, 0x00, 0xe3, 0x12, 0x70, 0x0c, 0xe1, 0x12, 0x30,
+ 0x0b, 0xe0, 0x03, 0x3e,
+ 0x0e, 0xf1, 0xe3, 0x0f, 0x2c, 0x0e, 0x04, 0x27, 0x00, 0xfe, 0x20, 0x32,
+ 0x00, 0xbf, 0x00, 0x54,
+ 0x02, 0xee, 0xd9, 0x10, 0x32, 0x01, 0xbe, 0x1f, 0x1f, 0xdd, 0xb0, 0x10,
+ 0x63, 0x0f, 0xdc, 0x0f,
+ 0x10, 0x13, 0x10, 0x0e, 0xcf, 0x0f, 0x10, 0x32, 0xe2, 0xdf, 0x0e, 0x00,
+ 0xd2, 0xd4, 0x0e, 0x0d,
+ 0x11, 0x13, 0xf0, 0xde, 0x2d, 0x40, 0x03, 0x07, 0x20, 0x0d, 0x90, 0x03,
+ 0x23, 0x01, 0xe2, 0x00,
+ 0x0f, 0xed, 0xd0, 0xf6, 0x00, 0x2f, 0xfe, 0xa2, 0xf0, 0x0c, 0x10, 0x02,
+ 0xc5, 0x0e, 0x0c, 0xf0,
+ 0xd0, 0xd4, 0x0f, 0x2b, 0xe0, 0xd1, 0xf3, 0xe0, 0xdf, 0xee, 0x10, 0x11,
+ 0xa4, 0xe0, 0x0f, 0x1e,
+ 0x01, 0xf1, 0x1f, 0xfe, 0xdf, 0xf1, 0x10, 0x30, 0x1f, 0x0c, 0x02, 0x43,
+ 0x10, 0x0e, 0x1f, 0x2f,
+ 0x0e, 0x20, 0x33, 0x01, 0xee, 0x0e, 0x40, 0x01, 0xd5, 0x02, 0x0f, 0x0c,
+ 0x20, 0x12, 0x05, 0xe0,
+ 0xed, 0x20, 0x60, 0x04, 0x17, 0x00, 0xfd, 0x10, 0x23, 0xf5, 0xf0, 0x2f,
+ 0x11, 0xe0, 0xf0, 0x01,
+ 0x05, 0x00, 0x2d, 0xf2, 0xd4, 0x00, 0x4e, 0x21, 0xf6, 0xc0, 0x3f, 0x40,
+ 0x01, 0xef, 0x1d, 0x63,
+ 0xe5, 0xfe, 0x1c, 0x50, 0xf0, 0xd5, 0x1f, 0x4e, 0x0f, 0xd0, 0x0f, 0x2e,
+ 0x40, 0xf1, 0xbd, 0xfe,
+ 0x00, 0x2f, 0x0c, 0xef, 0xe4, 0xd1, 0xfb, 0x0e, 0xe0, 0xc4, 0x10, 0x4d,
+ 0xdb, 0x80, 0x03, 0x10,
+ 0x0d, 0xfe, 0xe1, 0x22, 0x00, 0xc0, 0x00, 0x11, 0xf4, 0xd3, 0x00, 0x4f,
+ 0x0d, 0xe0, 0xb4, 0x05,
+ 0x2f, 0x6c, 0xf0, 0xe0, 0x0f, 0x11, 0x15, 0xf0, 0xfc, 0x30, 0xf0, 0x90,
+ 0x02, 0x03, 0x3f, 0xcb,
+ 0xe0, 0x00, 0x03, 0x0d, 0x1d, 0x22, 0xf3, 0xbf, 0x0f, 0x4f, 0x02, 0xd2,
+ 0x10, 0x20, 0xee, 0xfe,
+ 0x00, 0x25, 0x00, 0x1e, 0x30, 0xe0, 0xc1, 0x02, 0x20, 0x6f, 0xee, 0xd3,
+ 0x13, 0x3c, 0x00, 0xd2,
+ 0x10, 0x7c, 0x01, 0xf2, 0xff, 0x30, 0x20, 0xf0, 0xf0, 0x40, 0x2d, 0xff,
+ 0xe4, 0xd5, 0x2e, 0x7d,
+ 0x0f, 0x02, 0xe1, 0x01, 0x10, 0x3f, 0x40, 0x20, 0xef, 0xf0, 0x11, 0x43,
+ 0x5f, 0x0e, 0xf0, 0xd0,
+ 0x30, 0x52, 0x02, 0xce, 0x0d, 0x31, 0x04, 0xbf, 0x0c, 0x50, 0x22, 0xe0,
+ 0xdd, 0x1f, 0x5f, 0x20,
+ 0xf0, 0xf3, 0x0c, 0x4d, 0x1f, 0x00, 0x03, 0x1f, 0x2d, 0x02, 0x21, 0x1d,
+ 0x10, 0xe3, 0x00, 0x7b,
+ 0x11, 0xf2, 0xe0, 0x0d, 0x21, 0x60, 0x00, 0xcf, 0xf2, 0x14, 0x3f, 0x00,
+ 0xf0, 0x00, 0xf1, 0xf3,
+ 0x23, 0x2f, 0xe0, 0xd0, 0x0f, 0x00, 0x25, 0xf1, 0xb0, 0x0f, 0x10, 0x45,
+ 0xd2, 0x0e, 0x2e, 0x01,
+ 0x16, 0x40, 0x00, 0x0d, 0xe0, 0x05, 0x60, 0x00, 0xf0, 0xe0, 0xe0, 0x1f,
+ 0x10, 0xf0, 0xc0, 0x03,
+ 0x40, 0xde, 0xad, 0x00, 0x0d, 0x22, 0xe2, 0xb1, 0x00, 0x0b, 0x00, 0xe1,
+ 0xf5, 0x1e, 0x20, 0xb5,
+ 0xdf, 0x0c, 0x00, 0x03, 0x03, 0xee, 0xda, 0xe0, 0xd1, 0x01, 0x7e, 0xfe,
+ 0xd0, 0x01, 0x30, 0x00,
+ 0xfe, 0xce, 0x0d, 0x11, 0xf5, 0x10, 0x1d, 0xdf, 0xc3, 0xf0, 0x0d, 0x3f,
+ 0x20, 0xa0, 0xe3, 0x11,
+ 0x2c, 0xed, 0x0e, 0x00, 0xd1, 0xe0, 0x61, 0x10, 0xee, 0xeb, 0x30, 0x04,
+ 0xc2, 0xee, 0x3b, 0x11,
+ 0xc2, 0xef, 0xfe, 0x04, 0x01, 0x0d, 0xde, 0xf3, 0xff, 0x0a, 0xf0, 0xd3,
+ 0x02, 0x2e, 0x0c, 0xe0,
+ 0xe1, 0x25, 0x10, 0x11, 0x2e, 0x0d, 0xe2, 0xd4, 0x20, 0x50, 0x0d, 0xe0,
+ 0xf0, 0x00, 0x22, 0x03,
+ 0xb1, 0xfc, 0x4f, 0x25, 0xb3, 0xf0, 0x2d, 0x2e, 0x02, 0xf3, 0xfe, 0x0b,
+ 0x13, 0x42, 0x0c, 0xfd,
+ 0x2f, 0x5f, 0xe0, 0xf2, 0x42, 0x5a, 0xfc, 0xff, 0x31, 0x04, 0x00, 0x3c,
+ 0x40, 0xe1, 0xef, 0x2f,
+ 0x41, 0x33, 0xfb, 0xff, 0x30, 0x50, 0x12, 0x0e, 0xfe, 0x10, 0x71, 0x2f,
+ 0xd1, 0xf0, 0x30, 0x41,
+ 0xf6, 0xff, 0x2e, 0x20, 0xe2, 0xe5, 0x0f, 0x3e, 0x30, 0xd3, 0xcf, 0x0b,
+ 0x3f, 0x32, 0xf3, 0xfe,
+ 0x2c, 0x20, 0x00, 0x03, 0x30, 0x1f, 0x2c, 0x20, 0x12, 0x02, 0x11, 0x11,
+ 0xf0, 0xfe, 0x42, 0x07,
+ 0xb0, 0xff, 0x41, 0x04, 0xb1, 0x0d, 0x0f, 0x22, 0x07, 0xe1, 0xde, 0x0f,
+ 0xf2, 0xe2, 0xf1, 0x01,
+ 0xd4, 0xf0, 0x00, 0xef, 0xe1, 0xe5, 0x01, 0x10, 0xff, 0xd0, 0x02, 0xf2,
+ 0xe1, 0xef, 0x1e, 0x20,
+ 0xf7, 0x90, 0x0e, 0x10, 0x01, 0x00, 0x0a, 0x02, 0x01, 0x0d, 0xed, 0x32,
+ 0x31, 0x9c, 0xfe, 0x12,
+ 0x24, 0xfb, 0xdd, 0x01, 0x02, 0xf0, 0xec, 0x5d, 0x0e, 0xe0, 0xe3, 0x00,
+ 0x3c, 0xf0, 0xa3, 0x00,
+ 0x21, 0xf0, 0xe0, 0x01, 0x01, 0xe1, 0x21, 0x1f, 0x0c, 0x0e, 0x2e, 0x30,
+ 0x21, 0x01, 0x0c, 0x4d,
+ 0x00, 0xfe, 0x3d, 0x2e, 0x00, 0x12, 0x21, 0x1e, 0x4d, 0x1e, 0xd2, 0x03,
+ 0x70, 0x21, 0x01, 0xe0,
+ 0x00, 0x20, 0x2f, 0x11, 0x33, 0x01, 0xc2, 0xf1, 0x5c, 0x4f, 0xe7, 0xc3,
+ 0x00, 0x3e, 0x00, 0x00,
+ 0xf5, 0x15, 0xf0, 0xed, 0x20, 0x32, 0xe5, 0xc0, 0x0d, 0x30, 0x15, 0xd1,
+ 0xc0, 0x1d, 0x02, 0x14,
+ 0x00, 0xdd, 0xe0, 0x10, 0x02, 0xff, 0x0e, 0x10, 0x1f, 0x1c, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3c, 0x00, 0xdb, 0xff, 0x4c, 0x00, 0x99, 0xff, 0x1e, 0x3d, 0x20, 0x0f,
+ 0x0c, 0x20, 0x55, 0xd0,
+ 0xec, 0x2f, 0x40, 0xd0, 0xd0, 0x0d, 0x10, 0xe2, 0xdd, 0xfd, 0x30, 0x0f,
+ 0xda, 0xff, 0x22, 0x14,
+ 0xfd, 0x0a, 0x30, 0x01, 0xe1, 0x10, 0x2d, 0xf0, 0xff, 0x0d, 0x10, 0xf4,
+ 0xe0, 0x0b, 0x0f, 0xf2,
+ 0x02, 0x41, 0x00, 0xd1, 0x00, 0x1c, 0x61, 0x07, 0x03, 0x01, 0x50, 0x0e,
+ 0xe3, 0xf4, 0x31, 0x41,
+ 0xd4, 0xc0, 0x0e, 0x10, 0x11, 0xb5, 0xe3, 0x00, 0xfc, 0xd0, 0xb5, 0xf2,
+ 0xff, 0xc0, 0xc7, 0x01,
+ 0x10, 0xfd, 0xd2, 0xf4, 0xe2, 0x00, 0xfe, 0x02, 0x23, 0x0f, 0xc0, 0xe5,
+ 0x21, 0x3e, 0x3e, 0xe4,
+ 0x90, 0x0a, 0x3e, 0x12, 0xc2, 0xde, 0x0b, 0x10, 0x00, 0xd2, 0xbf, 0xca,
+ 0x0e, 0x21, 0x34, 0xac,
+ 0xfd, 0x01, 0x30, 0x0f, 0xfd, 0x2f, 0x1c, 0xfe, 0x40, 0x3c, 0x0c, 0x00,
+ 0x0d, 0x1a, 0x4f, 0x41,
+ 0xd0, 0xab, 0x1e, 0x30, 0x14, 0xee, 0x0c, 0x00, 0x00, 0x02, 0x10, 0x5a,
+ 0x1f, 0xe0, 0xd3, 0x30,
+ 0x3e, 0x0d, 0xf0, 0x03, 0x10, 0x1e, 0x02, 0x03, 0x3f, 0x1f, 0xf2, 0xe2,
+ 0x4e, 0x62, 0x07, 0xe0,
+ 0x0e, 0x00, 0x20, 0x23, 0xef, 0xcb, 0x00, 0x43, 0x1f, 0xcc, 0xc1, 0x11,
+ 0x20, 0x2f, 0x2e, 0x02,
+ 0xd2, 0xfd, 0x3e, 0x76, 0x11, 0xe0, 0x00, 0x01, 0x40, 0x00, 0xf5, 0xc2,
+ 0x00, 0x40, 0x02, 0xa4,
+ 0x00, 0x00, 0x2f, 0xe3, 0xf4, 0x22, 0x00, 0xde, 0xe1, 0x74, 0x35, 0xd0,
+ 0xec, 0x20, 0x24, 0x32,
+ 0x40, 0x0d, 0xb1, 0x03, 0x00, 0x3d, 0x2d, 0x01, 0xb7, 0xee, 0xfb, 0x30,
+ 0x32, 0xb0, 0xdc, 0x0f,
+ 0x20, 0xe1, 0xbf, 0x0c, 0x41, 0x00, 0xcc, 0xfd, 0x21, 0x31, 0xfd, 0xc0,
+ 0x3e, 0x20, 0xf0, 0xce,
+ 0xfd, 0xf0, 0x31, 0x41, 0xe2, 0x80, 0x0f, 0x0c, 0x11, 0x01, 0xf1, 0x10,
+ 0x0d, 0xce, 0x02, 0x50,
+ 0x0c, 0xef, 0xf4, 0x16, 0x00, 0x0d, 0x10, 0x3f, 0x22, 0xc1, 0xe0, 0x2f,
+ 0x3e, 0x00, 0x0e, 0x0e,
+ 0x00, 0xf2, 0xf1, 0xfe, 0x01, 0x42, 0x00, 0xd2, 0x34, 0x12, 0xe0, 0xef,
+ 0x02, 0x45, 0xe0, 0xcd,
+ 0x01, 0xf6, 0x11, 0x0f, 0xa0, 0xd0, 0x00, 0x30, 0x02, 0x90, 0xfa, 0x0f,
+ 0x10, 0x01, 0xc0, 0x0c,
+ 0x10, 0x10, 0xf0, 0x14, 0x3e, 0xfc, 0xe0, 0xf6, 0x10, 0x10, 0x2f, 0x0c,
+ 0xe0, 0x23, 0x3f, 0xea,
+ 0xe0, 0x31, 0x72, 0x0f, 0xbb, 0x3f, 0x40, 0xf6, 0xd0, 0x0e, 0x30, 0x40,
+ 0x00, 0xd2, 0xe0, 0x21,
+ 0x30, 0x0d, 0xe2, 0x16, 0x1f, 0x0c, 0x20, 0x65, 0xe2, 0xef, 0x1c, 0x71,
+ 0x03, 0x00, 0x00, 0xe2,
+ 0x1f, 0x6f, 0x06, 0xf1, 0x00, 0x1f, 0x11, 0xf2, 0x00, 0x51, 0x03, 0xe0,
+ 0xfe, 0x51, 0x17, 0xe2,
+ 0xdd, 0x20, 0x74, 0x01, 0xce, 0x0d, 0x25, 0x33, 0xd0, 0xf0, 0x00, 0x00,
+ 0x24, 0x21, 0xf4, 0xf1,
+ 0x0f, 0xff, 0xf2, 0x13, 0x02, 0x03, 0xe1, 0xb0, 0xf1, 0x02, 0x10, 0x00,
+ 0xd1, 0xe4, 0xbf, 0xee,
+ 0x3e, 0x71, 0xe7, 0xd0, 0x1e, 0x40, 0x01, 0xe1, 0xff, 0x1d, 0x50, 0x02,
+ 0xf2, 0xe1, 0x22, 0x00,
+ 0xe8, 0xe0, 0x61, 0x02, 0xa0, 0xff, 0x0d, 0x1e, 0xf2, 0xd6, 0xfe, 0xfc,
+ 0x00, 0xf0, 0xcd, 0x00,
+ 0x20, 0xed, 0x8e, 0xf1, 0x0b, 0x2c, 0x00, 0xf1, 0xdf, 0xdb, 0x31, 0x7f,
+ 0xfb, 0xbf, 0x02, 0x00,
+ 0x1f, 0x0d, 0xff, 0x01, 0x00, 0xfd, 0x1f, 0x42, 0x2f, 0xed, 0x00, 0x6c,
+ 0x01, 0xf3, 0x0b, 0x7e,
+ 0x10, 0x04, 0xf0, 0x0c, 0x30, 0x15, 0x02, 0xdd, 0x4a, 0x31, 0xe4, 0xf0,
+ 0x2f, 0x2d, 0x30, 0x13,
+ 0xe0, 0xcc, 0x02, 0x53, 0x1e, 0xdd, 0x00, 0x20, 0x00, 0xe7, 0x10, 0x6d,
+ 0x0f, 0x00, 0x03, 0x02,
+ 0x0e, 0x7e, 0x10, 0xe1, 0x02, 0x31, 0x20, 0x0f, 0x01, 0xf4, 0xf0, 0x40,
+ 0x42, 0x00, 0x00, 0x02,
+ 0x33, 0x5f, 0x0d, 0xe1, 0x22, 0x20, 0x00, 0xdf, 0x2f, 0x2f, 0xe0, 0xd2,
+ 0xf6, 0x0f, 0x3c, 0xf0,
+ 0xc3, 0x24, 0x50, 0xfc, 0xdf, 0x10, 0x53, 0x03, 0xdc, 0x4d, 0x11, 0xc0,
+ 0xeb, 0x60, 0x34, 0xe0,
+ 0xeb, 0x20, 0x02, 0x00, 0x5b, 0x3f, 0xe2, 0xc3, 0x2c, 0x3e, 0x01, 0xf1,
+ 0x01, 0xfd, 0x00, 0x13,
+ 0xe3, 0xcd, 0xf0, 0x01, 0x10, 0x20, 0xb7, 0xd4, 0x0c, 0x0e, 0xc1, 0xb4,
+ 0x00, 0xfe, 0xd0, 0xcf,
+ 0xf0, 0x02, 0xd5, 0xdf, 0xed, 0x00, 0xe6, 0xb2, 0x0e, 0x5e, 0xf3, 0xa5,
+ 0x00, 0x2d, 0x10, 0xf0,
+ 0xd5, 0x01, 0x2f, 0x3e, 0x0f, 0xc0, 0x16, 0x01, 0xef, 0x1f, 0x42, 0x00,
+ 0xb1, 0x03, 0x21, 0x3d,
+ 0xbf, 0xb3, 0x06, 0x30, 0x0e, 0xdd, 0xe3, 0xe0, 0xfc, 0x40, 0x10, 0xac,
+ 0xef, 0x00, 0xdf, 0xfc,
+ 0x0f, 0x0e, 0xb1, 0xe3, 0x1b, 0x3e, 0xb3, 0xd3, 0x0d, 0x7b, 0x0e, 0xd0,
+ 0x07, 0x00, 0x1a, 0x4f,
+ 0x01, 0xd3, 0xed, 0x2c, 0x70, 0x02, 0xf0, 0xfc, 0x10, 0x30, 0x0f, 0x3f,
+ 0x1d, 0x00, 0x03, 0x3f,
+ 0x0a, 0x00, 0x51, 0x20, 0xfd, 0x0e, 0x42, 0x36, 0x30, 0x1b, 0x20, 0x12,
+ 0x11, 0x00, 0x0e, 0x3e,
+ 0x70, 0x04, 0xe1, 0x00, 0x20, 0x20, 0x30, 0x05, 0xa2, 0x0e, 0x10, 0x57,
+ 0xff, 0xde, 0x01, 0x32,
+ 0x54, 0x01, 0xee, 0x0e, 0x20, 0x21, 0x40, 0x00, 0xf4, 0x01, 0x6c, 0x2f,
+ 0x02, 0x03, 0xe0, 0x1e,
+ 0x30, 0x04, 0x00, 0xeb, 0xee, 0x23, 0xf7, 0xcf, 0x0e, 0x51, 0xe2, 0xb0,
+ 0x0f, 0x00, 0x07, 0xf0,
+ 0xfd, 0xd0, 0x03, 0x01, 0xd0, 0xf1, 0x1f, 0xfe, 0xf1, 0xe5, 0xe0, 0x0b,
+ 0x21, 0xf7, 0x80, 0xff,
+ 0x2e, 0x30, 0xd5, 0xd1, 0x0f, 0x3e, 0x40, 0xd2, 0x00, 0x2d, 0x00, 0xc3,
+ 0x1f, 0x5a, 0x00, 0xc4,
+ 0xe1, 0x2f, 0x5c, 0xf0, 0xc4, 0x02, 0x0e, 0x3e, 0xd2, 0xb3, 0x0c, 0x3f,
+ 0x12, 0xd3, 0xe0, 0xfd,
+ 0xd0, 0xd0, 0x2e, 0x2b, 0x90, 0xf7, 0x01, 0x0e, 0xfd, 0x01, 0x04, 0xf0,
+ 0x0e, 0x6f, 0xf1, 0xe0,
+ 0x00, 0x2e, 0x32, 0x02, 0xbd, 0xe9, 0xd0, 0x35, 0x7f, 0xfd, 0xbf, 0x03,
+ 0x10, 0x1d, 0x2e, 0x0f,
+ 0xef, 0x00, 0x01, 0x08, 0x1e, 0x12, 0xe0, 0xfd, 0x00, 0xf5, 0x0f, 0x2c,
+ 0x30, 0x14, 0xf1, 0xee,
+ 0xfc, 0x00, 0x10, 0x22, 0x01, 0xe0, 0xba, 0xdf, 0xf0, 0x20, 0x23, 0xae,
+ 0xfe, 0x01, 0xd3, 0x0b,
+ 0x3e, 0x14, 0xf3, 0x1e, 0xde, 0xc2, 0x50, 0x58, 0xe0, 0xd2, 0x03, 0x4c,
+ 0x2c, 0x00, 0xc3, 0x00,
+ 0x1c, 0x10, 0x10, 0x4e, 0x10, 0xf2, 0xd0, 0x0b, 0x70, 0x50, 0xf2, 0xd1,
+ 0x2e, 0x2f, 0x12, 0x03,
+ 0xb5, 0x00, 0x3c, 0x40, 0xd3, 0xb6, 0x10, 0x3f, 0x0c, 0xe1, 0x04, 0xf1,
+ 0x0f, 0x2e, 0x21, 0xf1,
+ 0xe0, 0x40, 0x17, 0x70, 0x3b, 0xf0, 0xf3, 0x21, 0x20, 0x10, 0x3f, 0x4f,
+ 0xc4, 0xe2, 0x20, 0x5e,
+ 0x1d, 0x00, 0xd7, 0xf2, 0x7b, 0x30, 0xc2, 0xe2, 0x2f, 0x2e, 0x03, 0xd3,
+ 0x1e, 0xdf, 0x00, 0x65,
+ 0x00, 0xed, 0x02, 0x33, 0xfd, 0xcf, 0x72, 0x23, 0xdb, 0xfe, 0x32, 0x14,
+ 0xf0, 0xfc, 0x41, 0x04,
+ 0x02, 0x00, 0x0e, 0x0f, 0x55, 0x07, 0xa0, 0x0d, 0x00, 0x52, 0x05, 0xd0,
+ 0xfe, 0x10, 0x01, 0x02,
+ 0xf0, 0x1e, 0x0f, 0xe0, 0xe1, 0xe0, 0x10, 0x44, 0x00, 0x0a, 0xef, 0xe3,
+ 0x27, 0x10, 0xed, 0x30,
+ 0x41, 0x92, 0xf3, 0x2e, 0x2c, 0xdf, 0xf3, 0x46, 0x0f, 0x9c, 0x00, 0x01,
+ 0x21, 0xff, 0xe0, 0xde,
+ 0x0d, 0x0d, 0x04, 0x04, 0x0c, 0xdd, 0x00, 0x12, 0xd0, 0xfa, 0x51, 0x23,
+ 0xdf, 0xae, 0x00, 0x1e,
+ 0x22, 0xb2, 0xfe, 0xed, 0xf4, 0xff, 0x39, 0x00, 0x82, 0xf0, 0x01, 0x2e,
+ 0x0b, 0xc1, 0x03, 0x3f,
+ 0x39, 0xb1, 0xd1, 0x00, 0x3e, 0x4e, 0x00, 0xa1, 0xf0, 0x02, 0x32, 0x09,
+ 0xc0, 0x00, 0x12, 0x00,
+ 0xf0, 0x2e, 0x02, 0xe3, 0x1b, 0x0e, 0xf1, 0x75, 0x30, 0xbe, 0xff, 0x20,
+ 0x16, 0xf1, 0xe0, 0x1e,
+ 0x10, 0x05, 0xf1, 0xf2, 0xc3, 0xef, 0x11, 0x56, 0x11, 0xe1, 0x91, 0xf7,
+ 0x31, 0x4f, 0xe0, 0xc0,
+ 0x03, 0x31, 0x10, 0xe0, 0x0d, 0x30, 0xe0, 0xdc, 0x45, 0x34, 0x2c, 0x4d,
+ 0x11, 0xf4, 0x00, 0x50,
+ 0x7d, 0x00, 0xd3, 0x2f, 0x5b, 0x00, 0xe3, 0x1e, 0x1b, 0x00, 0x02, 0x41,
+ 0xf0, 0xd2, 0x01, 0x20,
+ 0x3c, 0xfe, 0x92, 0x07, 0xf1, 0x1b, 0x1f, 0x01, 0xc3, 0xd0, 0xec, 0x1e,
+ 0x60, 0xe2, 0xa1, 0x0f,
+ 0x1c, 0x2f, 0xf0, 0xe0, 0x0e, 0x00, 0x1f, 0x2b, 0x10, 0xd0, 0xfa, 0x0e,
+ 0x0f, 0xf1, 0xff, 0x18,
+ 0x40, 0x10, 0xde, 0xdf, 0x20, 0x40, 0x00, 0xff, 0xf0, 0x01, 0x20, 0x2e,
+ 0xf1, 0x17, 0x32, 0x0b,
+ 0x00, 0x04, 0xf0, 0xee, 0x30, 0x60, 0xe0, 0xb1, 0x1f, 0x5c, 0x01, 0xc0,
+ 0x00, 0x00, 0x40, 0x0c,
+ 0xe2, 0xe3, 0x1c, 0x4e, 0x00, 0x03, 0x0c, 0x0d, 0xf2, 0x47, 0x20, 0xc9,
+ 0xf0, 0x34, 0x50, 0xed,
+ 0xf0, 0x01, 0x10, 0x4e, 0x14, 0x00, 0xcb, 0xef, 0x00, 0x51, 0x02, 0xff,
+ 0x1d, 0x00, 0xd2, 0x00,
+ 0x12, 0x57, 0x0f, 0xee, 0xf4, 0x11, 0x20, 0xad, 0xf3, 0x07, 0x00, 0x2d,
+ 0xcf, 0xb4, 0x01, 0x30,
+ 0xee, 0xb0, 0x10, 0x10, 0xf1, 0xe3, 0x32, 0xfb, 0x0d, 0x7f, 0x05, 0xd4,
+ 0x0f, 0x7c, 0x30, 0xe2,
+ 0xf1, 0x1c, 0x1e, 0x13, 0x45, 0x0c, 0xfc, 0xf1, 0x31, 0x41, 0x0d, 0xdf,
+ 0x01, 0x70, 0x1c, 0xf0,
+ 0xb1, 0x13, 0x4c, 0x2c, 0xd0, 0x04, 0xf0, 0xec, 0x2f, 0x74, 0x00, 0xdc,
+ 0xff, 0xf5, 0x01, 0x2d,
+ 0x0f, 0xd7, 0x00, 0x00, 0xf0, 0x02, 0x11, 0xdf, 0x30, 0x42, 0x02, 0xf0,
+ 0x00, 0xe0, 0xec, 0x6e,
+ 0x37, 0xc5, 0xdf, 0x2e, 0x31, 0xe2, 0x00, 0x40, 0x01, 0x24, 0x0e, 0x0e,
+ 0x10, 0x32, 0x03, 0xbe,
+ 0x00, 0x47, 0xe0, 0xee, 0x10, 0x03, 0x81, 0x02, 0x30, 0x2c, 0xcf, 0xd0,
+ 0x02, 0x04, 0xed, 0xfb,
+ 0x03, 0xb5, 0x0e, 0x0d, 0xd2, 0x82, 0x00, 0x2d, 0x01, 0xe1, 0xe0, 0x00,
+ 0xf0, 0xf6, 0xff, 0xdc,
+ 0x00, 0xb5, 0xb3, 0x0f, 0x1b, 0x0f, 0xd2, 0xe4, 0xee, 0x1d, 0x01, 0xf1,
+ 0xde, 0x2f, 0x32, 0xc1,
+ 0xfd, 0x5d, 0x2d, 0xf4, 0xe7, 0x70, 0x2a, 0xdf, 0xe2, 0x43, 0x3e, 0xfe,
+ 0xa2, 0x10, 0x2e, 0x1e,
+ 0xd6, 0x02, 0x6f, 0x0d, 0xf0, 0xf2, 0x12, 0x33, 0x01, 0xcd, 0x0f, 0x01,
+ 0xfe, 0x60, 0x17, 0xf2,
+ 0xdd, 0x20, 0x40, 0xf1, 0xb3, 0x13, 0x4e, 0x0e, 0xc5, 0x01, 0x0f, 0x1d,
+ 0x00, 0x2f, 0xf4, 0xc2,
+ 0xf8, 0x2c, 0x00, 0xd3, 0xc0, 0x29, 0x10, 0xe2, 0xd0, 0x0d, 0xff, 0x43,
+ 0x10, 0xdb, 0x01, 0x31,
+ 0x0f, 0xee, 0x0e, 0x42, 0xe1, 0xdb, 0x1e, 0x03, 0xc2, 0x0c, 0x6f, 0xf0,
+ 0xd0, 0x02, 0x00, 0xf4,
+ 0x3d, 0x0a, 0xd0, 0xd6, 0x01, 0x0e, 0x0d, 0x50, 0xd4, 0xb0, 0x2f, 0x7f,
+ 0x0f, 0xd2, 0x00, 0x4c,
+ 0x1e, 0x04, 0xd3, 0x2b, 0x4e, 0x01, 0x02, 0x20, 0x3f, 0x01, 0xd1, 0x70,
+ 0x3f, 0x00, 0xf4, 0x06,
+ 0x10, 0x2c, 0x43, 0x14, 0xef, 0x0c, 0x63, 0x04, 0xf0, 0x2e, 0x4f, 0xd0,
+ 0x05, 0x33, 0x0f, 0xdf,
+ 0xe1, 0x34, 0x00, 0xe2, 0xf4, 0xaf, 0xee, 0x40, 0x25, 0xb2, 0xff, 0x0e,
+ 0x03, 0x06, 0x1f, 0xba,
+ 0xe0, 0x10, 0x23, 0xf1, 0xcb, 0x0e, 0x10, 0xe2, 0xdf, 0x2c, 0x11, 0xc0,
+ 0x1f, 0x6c, 0xe1, 0x02,
+ 0x0e, 0x09, 0xe0, 0x12, 0x3f, 0xc0, 0xbe, 0x0c, 0xf0, 0xf2, 0xf1, 0xeb,
+ 0xed, 0xef, 0x05, 0x00,
+ 0xfe, 0xa0, 0x01, 0x01, 0xed, 0x8e, 0x00, 0x47, 0xf3, 0xdb, 0x0e, 0x01,
+ 0x02, 0x0f, 0x0c, 0x10,
+ 0xf2, 0x0f, 0x0b, 0x00, 0xd0, 0x20, 0x4d, 0x20, 0xf1, 0x8b, 0xfe, 0x31,
+ 0x22, 0x0d, 0x0f, 0xdf,
+ 0xbf, 0x20, 0x77, 0x21, 0xcd, 0x00, 0x14, 0x20, 0x0f, 0xf1, 0x05, 0x10,
+ 0x4d, 0xf1, 0xb2, 0xf4,
+ 0x32, 0x5d, 0xec, 0xe4, 0x17, 0x11, 0x0f, 0x0f, 0x20, 0x00, 0x04, 0xf0,
+ 0xc0, 0x2f, 0x7f, 0x00,
+ 0xc7, 0x10, 0x0e, 0xf2, 0x37, 0x4f, 0xdf, 0xc2, 0x10, 0x50, 0x00, 0x02,
+ 0xf4, 0x01, 0x0d, 0x6f,
+ 0x23, 0xd7, 0x01, 0x20, 0x41, 0x10, 0xf1, 0xe0, 0x04, 0x74, 0x0d, 0xfa,
+ 0xf2, 0x14, 0x3f, 0xfb,
+ 0x01, 0x02, 0xf0, 0xff, 0x7f, 0x10, 0xf2, 0x01, 0xf0, 0xed, 0x10, 0x71,
+ 0x00, 0xd1, 0xdd, 0x2d,
+ 0x41, 0x0b, 0xce, 0xe2, 0x42, 0x3b, 0xee, 0xd0, 0x20, 0x04, 0x1d, 0x6b,
+ 0x00, 0xe6, 0x0f, 0x3d,
+ 0x10, 0x04, 0x04, 0x0e, 0x2c, 0x10, 0x34, 0x01, 0xde, 0xfe, 0x10, 0x34,
+ 0x30, 0xef, 0xae, 0x00,
+ 0x41, 0x13, 0xd6, 0xde, 0x1b, 0x22, 0xe2, 0xe1, 0x2e, 0xd2, 0x03, 0x0f,
+ 0xbf, 0x02, 0x51, 0xec,
+ 0xce, 0xf7, 0xe4, 0x0b, 0x30, 0xf0, 0x83, 0xe0, 0x0f, 0x0f, 0x12, 0x02,
+ 0xb1, 0xcd, 0xf1, 0x14,
+ 0x3c, 0xf1, 0x84, 0xfd, 0x0e, 0x23, 0x11, 0xed, 0xc3, 0x0f, 0x38, 0x10,
+ 0xd2, 0xe0, 0xfd, 0x0f,
+ 0x4f, 0x0d, 0x9f, 0x02, 0x10, 0x08, 0xff, 0x03, 0xe0, 0x0c, 0x30, 0x10,
+ 0xf0, 0xe0, 0x00, 0x08,
+ 0xa0, 0x01, 0x50, 0x0d, 0xd0, 0xe0, 0x10, 0x01, 0x10, 0x4e, 0xcd, 0xed,
+ 0x51, 0x04, 0xe0, 0x10,
+ 0x40, 0xdd, 0xd0, 0x41, 0x51, 0xf3, 0xe0, 0x1a, 0x4f, 0x0f, 0x00, 0x01,
+ 0x22, 0x1d, 0x58, 0x11,
+ 0xd1, 0xdd, 0x1d, 0x77, 0x20, 0x0d, 0xef, 0x03, 0x20, 0x0d, 0x40, 0x10,
+ 0x0f, 0x1f, 0x5f, 0x0f,
+ 0x0e, 0x3f, 0x4e, 0xfe, 0x12, 0x72, 0x2d, 0xc0, 0xf5, 0x33, 0x3b, 0xff,
+ 0xe6, 0x02, 0x3f, 0xff,
+ 0xe0, 0x73, 0x02, 0xf0, 0xe0, 0x00, 0x50, 0x21, 0xe4, 0xd0, 0x2c, 0x33,
+ 0x17, 0x12, 0x2e, 0xce,
+ 0xe0, 0x10, 0x70, 0x17, 0xe2, 0xdc, 0x0d, 0x01, 0xe0, 0x51, 0x32, 0xe0,
+ 0xab, 0x0e, 0x22, 0x41,
+ 0x0e, 0xdf, 0x0d, 0x0e, 0x13, 0xf7, 0xc0, 0xed, 0x0e, 0xf0, 0x07, 0x13,
+ 0xcd, 0xbd, 0x21, 0x34,
+ 0xbf, 0xd1, 0x02, 0x6c, 0x0f, 0xa0, 0x01, 0x0f, 0x1d, 0xef, 0xe0, 0x01,
+ 0x1f, 0x0c, 0xed, 0xfd,
+ 0x13, 0x07, 0x9f, 0x2e, 0x3f, 0xde, 0xd5, 0x53, 0x1b, 0xf0, 0xc3, 0x32,
+ 0x3e, 0xf0, 0xf3, 0x10,
+ 0x00, 0xd7, 0xf4, 0x1d, 0x70, 0x02, 0xc6, 0x00, 0x2f, 0x1f, 0xdf, 0xc4,
+ 0xc4, 0xfe, 0x4e, 0xe1,
+ 0xa5, 0x0f, 0x0f, 0x00, 0xf2, 0x0f, 0xef, 0xa3, 0x2f, 0x4c, 0xe3, 0xc2,
+ 0x09, 0x2f, 0x00, 0xe2,
+ 0x00, 0xff, 0xee, 0x0a, 0x00, 0xd0, 0xd2, 0x3c, 0x0d, 0x01, 0xe1, 0xbc,
+ 0xed, 0x3e, 0x72, 0xf2,
+ 0xbc, 0x0c, 0x30, 0x13, 0x00, 0xf9, 0x00, 0x00, 0x10, 0x2f, 0x00, 0xd5,
+ 0xc0, 0x5c, 0x40, 0xe0,
+ 0xb4, 0x01, 0x1e, 0x5a, 0x10, 0xd3, 0xe1, 0xff, 0x3e, 0x6f, 0xf1, 0xc5,
+ 0x10, 0x3e, 0x0f, 0xd0,
+ 0x13, 0x11, 0x2e, 0x1c, 0xe0, 0xf0, 0x72, 0x14, 0x04, 0xfc, 0x4c, 0x21,
+ 0x06, 0x00, 0x71, 0x01,
+ 0xf0, 0x00, 0x30, 0x25, 0x20, 0xf0, 0xee, 0x52, 0x36, 0xf0, 0xfd, 0x73,
+ 0x03, 0xff, 0xff, 0x42,
+ 0x22, 0xfd, 0x00, 0x17, 0x02, 0x00, 0x5c, 0x00, 0xd2, 0x31, 0x02, 0xe0,
+ 0xfc, 0x5f, 0x20, 0xc0,
+ 0xf3, 0x0f, 0x19, 0xf0, 0xb3, 0xf1, 0x0e, 0x30, 0xf4, 0x90, 0x1a, 0x01,
+ 0xd6, 0x00, 0x4c, 0xc0,
+ 0xd3, 0x32, 0xfe, 0xcd, 0x01, 0x03, 0xf2, 0x2c, 0x3d, 0xb2, 0xe7, 0x00,
+ 0x3c, 0x31, 0xd1, 0xb0,
+ 0x1d, 0x00, 0xe5, 0xe0, 0xfc, 0x6f, 0x01, 0xa0, 0x0e, 0x10, 0x30, 0xbd,
+ 0x00, 0x10, 0x1d, 0xcd,
+ 0x00, 0x40, 0xe2, 0xcd, 0x0f, 0x55, 0x0f, 0xf9, 0xf0, 0x00, 0x06, 0x02,
+ 0x11, 0x00, 0x18, 0x00,
+ 0x8e, 0xff, 0xe0, 0xff, 0xde, 0xff, 0x74, 0xff, 0x34, 0x15, 0x80, 0xff,
+ 0x20, 0x30, 0xdd, 0xdc,
+ 0x30, 0x56, 0x03, 0x10, 0x0c, 0xed, 0xf0, 0x30, 0x4c, 0x0b, 0xc0, 0xe2,
+ 0x20, 0x7f, 0x00, 0xf1,
+ 0xeb, 0x4c, 0x20, 0xe3, 0x23, 0x73, 0xf1, 0xef, 0x4d, 0x4d, 0x0c, 0xe0,
+ 0x17, 0x03, 0xf1, 0x30,
+ 0x30, 0x9e, 0xff, 0x40, 0x02, 0xc6, 0xf3, 0x31, 0x0e, 0x0d, 0xd0, 0xf0,
+ 0xff, 0x30, 0x05, 0xb1,
+ 0xfc, 0x1a, 0x1d, 0xbf, 0xe3, 0x16, 0x41, 0x0f, 0x1e, 0x2f, 0x00, 0xc0,
+ 0x0f, 0x60, 0x42, 0x01,
+ 0xb4, 0x03, 0x2e, 0x08, 0x0e, 0xf0, 0xe1, 0x20, 0x11, 0xd5, 0xd3, 0xf0,
+ 0x0f, 0x10, 0xfe, 0x28,
+ 0x2e, 0xd0, 0xe0, 0x30, 0x32, 0x33, 0x54, 0xf3, 0x91, 0x11, 0x63, 0x04,
+ 0xf0, 0xed, 0x1b, 0x20,
+ 0x03, 0xf4, 0xb2, 0x00, 0x3d, 0x20, 0xe5, 0xe1, 0x0f, 0x0e, 0x6c, 0x0f,
+ 0x06, 0x03, 0xf0, 0x0c,
+ 0x4e, 0x23, 0x04, 0x0e, 0xec, 0x01, 0x77, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0xd0, 0x40, 0x30, 0xd1,
+ 0xb1, 0xd3, 0x07, 0x32, 0xd0, 0x80, 0x03, 0x01, 0xe0, 0xe3, 0x05, 0xd3,
+ 0x02, 0x30, 0x83, 0xe6,
+ 0x00, 0x0e, 0x0e, 0xc0, 0x02, 0xe2, 0xd1, 0xf0, 0x1f, 0xfc, 0xcd, 0xf1,
+ 0xc0, 0xf9, 0x4d, 0xde,
+ 0x80, 0x01, 0x1e, 0xe8, 0x0e, 0x12, 0xd1, 0xdf, 0x00, 0x31, 0x20, 0xfe,
+ 0x0f, 0xe1, 0xe5, 0x55,
+ 0x44, 0x03, 0x01, 0x5b, 0xea, 0x0e, 0x21, 0x23, 0x01, 0x00, 0x11, 0xc3,
+ 0x00, 0x5b, 0x0d, 0xdd,
+ 0xdf, 0x7f, 0x2f, 0x02, 0xd4, 0x00, 0x3e, 0x7d, 0x18, 0x0e, 0x00, 0x11,
+ 0x60, 0x10, 0x10, 0x1e,
+ 0x2e, 0x0f, 0x20, 0x32, 0x01, 0x2c, 0x7b, 0x10, 0x03, 0x13, 0x11, 0x30,
+ 0x10, 0x0c, 0xfd, 0x46,
+ 0x26, 0xe1, 0xe0, 0x11, 0x11, 0x00, 0xfe, 0x2f, 0x31, 0xf1, 0xb0, 0x01,
+ 0x04, 0x40, 0x1c, 0xdd,
+ 0xe1, 0x21, 0xea, 0xab, 0x00, 0x02, 0xc0, 0x0d, 0x1c, 0x80, 0x02, 0x05,
+ 0xf1, 0xff, 0x0c, 0xfc,
+ 0x1f, 0x3f, 0xcb, 0xed, 0x40, 0x41, 0xe1, 0xe0, 0x20, 0x00, 0xfd, 0x09,
+ 0x0f, 0xa0, 0x02, 0x36,
+ 0x02, 0x80, 0x0f, 0x22, 0xf6, 0xc1, 0x10, 0x3e, 0x10, 0xd1, 0xe0, 0x1f,
+ 0x32, 0x35, 0x30, 0x0d,
+ 0xe0, 0x73, 0x30, 0x0a, 0xf0, 0x01, 0x30, 0x5e, 0xf0, 0xb1, 0x10, 0x2d,
+ 0xf9, 0x0e, 0x00, 0xd0,
+ 0xfe, 0x7c, 0x20, 0xc1, 0xc0, 0x2f, 0x50, 0xf0, 0xb0, 0x09, 0xfc, 0x30,
+ 0x11, 0xd0, 0xc0, 0x00,
+ 0x30, 0x0f, 0xc0, 0xd2, 0x13, 0x40, 0x0b, 0xcf, 0xd4, 0x06, 0x61, 0x00,
+ 0xe1, 0xf3, 0x00, 0x1e,
+ 0x25, 0xf5, 0xb0, 0x00, 0x11, 0xf0, 0xbc, 0x00, 0x46, 0xf0, 0xce, 0x0d,
+ 0x1f, 0x0e, 0xce, 0x05,
+ 0x14, 0x00, 0xdb, 0x0d, 0xf0, 0xf2, 0x01, 0xf0, 0xdd, 0x2f, 0x64, 0xb1,
+ 0xdd, 0x0d, 0x2f, 0x00,
+ 0xc0, 0xd1, 0x43, 0x14, 0xc3, 0x04, 0x01, 0xf9, 0x0b, 0x50, 0x01, 0xf0,
+ 0x1d, 0x2c, 0xee, 0xe0,
+ 0x70, 0x50, 0xde, 0x0d, 0x2c, 0x3d, 0xff, 0x03, 0x76, 0x00, 0xfe, 0x0f,
+ 0x4f, 0x1e, 0x00, 0x01,
+ 0x21, 0x1d, 0x18, 0x1c, 0x70, 0x06, 0xd1, 0x00, 0x7f, 0x10, 0xf2, 0xd3,
+ 0x12, 0x30, 0x0d, 0x0f,
+ 0xf5, 0xf6, 0x01, 0x20, 0x3f, 0xe1, 0xa2, 0x00, 0x3e, 0x5f, 0xd5, 0xd4,
+ 0x21, 0x3f, 0x00, 0x24,
+ 0x12, 0xef, 0x0d, 0x7f, 0xf2, 0xe3, 0x44, 0x12, 0xf0, 0xe0, 0x00, 0x22,
+ 0xe5, 0xc2, 0x42, 0x33,
+ 0xc2, 0xe0, 0xf1, 0xe5, 0x12, 0x60, 0xcb, 0xdf, 0x15, 0x21, 0xcf, 0xf1,
+ 0xe7, 0xd1, 0x2f, 0x5e,
+ 0xb0, 0xe2, 0x02, 0x00, 0x2d, 0xde, 0xff, 0x10, 0x10, 0x0c, 0x0e, 0xa5,
+ 0x03, 0x71, 0x20, 0xe3,
+ 0xe5, 0x01, 0x4f, 0x30, 0x07, 0x04, 0xf1, 0x00, 0x2f, 0x5e, 0x5f, 0x0e,
+ 0xe0, 0x27, 0x33, 0x32,
+ 0xf1, 0xf0, 0x0f, 0xef, 0x6e, 0x19, 0xbd, 0xf0, 0x20, 0x0f, 0xd0, 0x21,
+ 0x0e, 0x9b, 0x0f, 0x1f,
+ 0x0c, 0xad, 0x01, 0x36, 0x01, 0xcf, 0xfb, 0x0e, 0xf1, 0x32, 0x10, 0xd0,
+ 0xf0, 0x00, 0xfd, 0x19,
+ 0x1e, 0x0f, 0x3f, 0xe0, 0xbf, 0x3f, 0x3b, 0xab, 0xee, 0x20, 0x73, 0x01,
+ 0xde, 0x0c, 0x20, 0xe1,
+ 0xf1, 0x51, 0x02, 0xbf, 0x0c, 0x21, 0x04, 0xf5, 0x03, 0x00, 0xfb, 0x1c,
+ 0x30, 0x91, 0x01, 0x30,
+ 0x10, 0xc0, 0xf0, 0x3f, 0x1b, 0xcd, 0x0d, 0x01, 0xd5, 0x41, 0x1f, 0xbe,
+ 0x0f, 0x20, 0x00, 0xe1,
+ 0x22, 0x12, 0x00, 0x50, 0x01, 0xcc, 0x19, 0x70, 0x14, 0xf2, 0x00, 0x1b,
+ 0x0d, 0x01, 0x44, 0x31,
+ 0xdf, 0x00, 0x62, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x1d, 0xfd, 0xf6,
+ 0xe2, 0xb0, 0x14, 0x77,
+ 0xf2, 0xcf, 0x0e, 0x41, 0x05, 0xd1, 0x0f, 0x1f, 0x2f, 0x30, 0xe6, 0xc4,
+ 0x21, 0x20, 0xe0, 0x22,
+ 0x56, 0x02, 0xc1, 0x00, 0x20, 0xff, 0xef, 0x71, 0x31, 0xcf, 0xde, 0x10,
+ 0x25, 0x43, 0x30, 0xad,
+ 0xee, 0x01, 0x4f, 0x0c, 0xf2, 0xc7, 0x02, 0x10, 0x10, 0xe0, 0xaa, 0x0d,
+ 0x31, 0xf4, 0xb0, 0x0f,
+ 0x2e, 0xed, 0xfd, 0x00, 0x04, 0x02, 0xfe, 0x08, 0xfe, 0x00, 0x01, 0x00,
+ 0xe1, 0x03, 0x13, 0x40,
+ 0xda, 0x8c, 0x00, 0x22, 0x11, 0xed, 0xfb, 0x3f, 0x1f, 0xef, 0x0f, 0x00,
+ 0xc0, 0x7f, 0x6d, 0xea,
+ 0xed, 0x1e, 0x10, 0x02, 0x14, 0x01, 0xec, 0x0d, 0x41, 0xe3, 0xb0, 0x2f,
+ 0x5b, 0xeb, 0xef, 0x02,
+ 0x24, 0xf1, 0x1f, 0x2e, 0xce, 0xf0, 0x52, 0x00, 0xd0, 0x02, 0x25, 0x01,
+ 0xff, 0x1d, 0x0e, 0x9e,
+ 0x0f, 0x23, 0x10, 0xd8, 0xcc, 0x0e, 0x2e, 0x40, 0xf0, 0xcf, 0x0e, 0x10,
+ 0x6d, 0x08, 0xdd, 0xf0,
+ 0x20, 0x4f, 0xf0, 0xd2, 0x20, 0x0d, 0xef, 0x07, 0x63, 0x00, 0xd0, 0xf4,
+ 0x03, 0xf0, 0x0f, 0x2f,
+ 0x95, 0xf6, 0x41, 0x00, 0xc0, 0xe1, 0x30, 0x0e, 0x1f, 0x01, 0xd0, 0xde,
+ 0x10, 0x47, 0x25, 0x00,
+ 0xe0, 0x00, 0x20, 0x04, 0x75, 0x10, 0xf0, 0x00, 0x50, 0xff, 0xf2, 0x46,
+ 0xf0, 0xcf, 0x30, 0x45,
+ 0xd2, 0xe0, 0x1f, 0x01, 0xe3, 0x30, 0x50, 0xc2, 0xf0, 0x1e, 0x2f, 0x03,
+ 0x04, 0x71, 0x0f, 0xd0,
+ 0x06, 0x45, 0x02, 0xd0, 0x2f, 0x70, 0x27, 0xa5, 0x00, 0x0e, 0x5e, 0x00,
+ 0xe2, 0x11, 0x1e, 0xff,
+ 0x03, 0x11, 0x1c, 0x0f, 0x01, 0xd1, 0xd0, 0x62, 0x36, 0xe1, 0xce, 0x0d,
+ 0x01, 0x33, 0x10, 0xcb,
+ 0xcd, 0x02, 0xf4, 0x00, 0x0e, 0xf0, 0xa3, 0xe0, 0x4b, 0x3c, 0x9e, 0xe0,
+ 0x11, 0x20, 0x00, 0xe1,
+ 0xef, 0xff, 0x03, 0x27, 0x00, 0xcc, 0x0e, 0x00, 0xf3, 0xc4, 0x02, 0x02,
+ 0x04, 0x01, 0xcc, 0x0a,
+ 0x00, 0xe0, 0x10, 0x7f, 0x21, 0xa4, 0xf2, 0x1f, 0x3b, 0x0d, 0x00, 0x11,
+ 0xdf, 0xdc, 0x3e, 0x30,
+ 0x41, 0x22, 0xd1, 0xbb, 0xfc, 0x3e, 0x70, 0x23, 0xa4, 0x00, 0x2c, 0x2e,
+ 0x00, 0xf0, 0xff, 0x1c,
+ 0x7c, 0x00, 0x10, 0x0e, 0xff, 0x01, 0x15, 0x40, 0x0a, 0xdd, 0x00, 0x22,
+ 0x4f, 0x0c, 0x0e, 0x0e,
+ 0xeb, 0x0c, 0x7f, 0x31, 0xd2, 0xd0, 0x0e, 0x20, 0x30, 0x2e, 0xbf, 0xcf,
+ 0x0a, 0x20, 0x07, 0xa2,
+ 0x00, 0x4e, 0xec, 0xcd, 0x00, 0x31, 0xf0, 0xc0, 0x31, 0x0f, 0xd8, 0x3c,
+ 0x0e, 0x90, 0x00, 0x51,
+ 0x00, 0xe0, 0xf0, 0x01, 0x10, 0x50, 0xf1, 0xd3, 0x00, 0x22, 0x37, 0xf2,
+ 0xff, 0xff, 0x00, 0x10,
+ 0x40, 0xf0, 0x00, 0x20, 0x2f, 0x71, 0x26, 0xe2, 0x00, 0x5d, 0x17, 0xf6,
+ 0x10, 0x3f, 0xcf, 0xe2,
+ 0x40, 0x7d, 0xf0, 0xc4, 0x12, 0x20, 0x12, 0x01, 0x0f, 0xec, 0x0c, 0x10,
+ 0x03, 0x05, 0x22, 0xf4,
+ 0x81, 0x0e, 0x3c, 0xf1, 0xb3, 0x12, 0x20, 0x0f, 0x0e, 0x0e, 0xe1, 0x04,
+ 0x5b, 0xf8, 0xdf, 0x00,
+ 0x70, 0xf0, 0xd0, 0x11, 0x20, 0x0e, 0x0d, 0xde, 0xff, 0x0f, 0x64, 0xf7,
+ 0xc1, 0x10, 0x1d, 0x0e,
+ 0xe0, 0xff, 0x2e, 0xff, 0xc1, 0x24, 0x12, 0x00, 0xc8, 0xed, 0x21, 0x24,
+ 0xd0, 0xae, 0x00, 0x03,
+ 0x04, 0x01, 0xee, 0xfe, 0x01, 0xe0, 0x0e, 0xd0, 0xf0, 0x3d, 0x9a, 0x9e,
+ 0x10, 0x42, 0xe0, 0xd0,
+ 0x16, 0x12, 0x0b, 0xdc, 0xd0, 0x43, 0x42, 0xd0, 0xc0, 0x00, 0x12, 0x11,
+ 0x01, 0xf3, 0x10, 0xf8,
+ 0xbf, 0x25, 0x04, 0x01, 0x60, 0xf0, 0xc0, 0x00, 0x71, 0x03, 0xe1, 0x1e,
+ 0x1b, 0x0e, 0x00, 0x42,
+ 0xf2, 0xd0, 0x5e, 0x0e, 0xfd, 0xe0, 0x26, 0x21, 0xff, 0x0c, 0x0f, 0x06,
+ 0x33, 0x00, 0x3f, 0x71,
+ 0x04, 0xb1, 0x0e, 0x5a, 0x10, 0xd4, 0x02, 0x30, 0xe0, 0x00, 0x50, 0x0e,
+ 0xcd, 0x10, 0x30, 0x0e,
+ 0xc0, 0x07, 0x22, 0xf1, 0x03, 0x11, 0xdd, 0xbd, 0x00, 0x33, 0x52, 0xf0,
+ 0xcc, 0xf0, 0x37, 0x40,
+ 0x0c, 0xec, 0x0f, 0x1f, 0xef, 0x21, 0x64, 0x00, 0xca, 0x2d, 0x20, 0xd2,
+ 0x01, 0x53, 0x02, 0xdd,
+ 0x0b, 0x4f, 0x01, 0xe3, 0x34, 0x33, 0xd0, 0xfb, 0x1d, 0x5f, 0x00, 0x01,
+ 0xf1, 0x03, 0x13, 0x30,
+ 0x0e, 0xc3, 0xc7, 0x30, 0x7c, 0x0e, 0xc2, 0x03, 0x30, 0x20, 0xd2, 0xff,
+ 0x4a, 0xef, 0xc0, 0x5e,
+ 0x0b, 0xce, 0x10, 0x0f, 0xfe, 0xe1, 0x33, 0xfb, 0x9b, 0x00, 0x20, 0xed,
+ 0xff, 0xf0, 0x0d, 0x0d,
+ 0xf0, 0xff, 0x05, 0x06, 0xe0, 0x8e, 0x0e, 0x2e, 0x0e, 0xb2, 0x17, 0x03,
+ 0x00, 0xfc, 0xfb, 0x3f,
+ 0x32, 0x03, 0x80, 0xe0, 0x20, 0x13, 0xf1, 0xfe, 0xfc, 0xc0, 0xf3, 0x36,
+ 0x12, 0x80, 0x0e, 0x1e,
+ 0x10, 0xf0, 0xf3, 0x01, 0x0b, 0x1a, 0x0e, 0xfe, 0xd0, 0x12, 0x20, 0xed,
+ 0xe2, 0x07, 0x40, 0xfe,
+ 0x0e, 0xa1, 0xe2, 0x51, 0x00, 0x9e, 0x0c, 0x4e, 0x0e, 0xef, 0xcf, 0x19,
+ 0x2b, 0x2f, 0x00, 0xd0,
+ 0xdf, 0x20, 0x47, 0x02, 0xe0, 0x0d, 0xff, 0xf0, 0xd2, 0x13, 0x42, 0xe0,
+ 0xde, 0xcd, 0xef, 0x71,
+ 0x71, 0xe0, 0xe3, 0x21, 0x3a, 0xee, 0xe0, 0x2e, 0x5b, 0x01, 0xe3, 0x0d,
+ 0x29, 0x20, 0x14, 0x21,
+ 0x00, 0xf0, 0x10, 0x5f, 0x0d, 0xd0, 0x77, 0x02, 0xf0, 0x0f, 0x30, 0x1e,
+ 0xdc, 0xf0, 0x74, 0x21,
+ 0xce, 0x01, 0x16, 0x00, 0x1e, 0x1e, 0x00, 0xe1, 0x2d, 0x0c, 0x81, 0xf7,
+ 0x61, 0x0f, 0xef, 0xf2,
+ 0x03, 0x0e, 0x0f, 0x26, 0xe1, 0xbf, 0x20, 0x12, 0x00, 0xde, 0x00, 0x3f,
+ 0x19, 0xde, 0x01, 0x22,
+ 0xe0, 0xdd, 0x5d, 0x33, 0xe7, 0xe2, 0xd0, 0xf0, 0x7d, 0x6d, 0x01, 0xc4,
+ 0xf0, 0x2f, 0x70, 0xf0,
+ 0xef, 0x1e, 0x1b, 0x0e, 0x02, 0x06, 0xd3, 0x20, 0x6e, 0xf1, 0xe6, 0x01,
+ 0x20, 0x1e, 0x0f, 0xe3,
+ 0xf5, 0x41, 0x32, 0xe1, 0xef, 0x2e, 0x20, 0x02, 0xf1, 0x43, 0x47, 0xd4,
+ 0x03, 0x70, 0x2c, 0xd0,
+ 0xf3, 0x10, 0x4f, 0x02, 0xe5, 0xe1, 0x01, 0x42, 0x01, 0xae, 0xfd, 0x34,
+ 0x37, 0xd0, 0xdf, 0xd0,
+ 0x0e, 0x7b, 0x10, 0xc2, 0xd1, 0x00, 0x50, 0x1f, 0xdd, 0xec, 0x0d, 0x10,
+ 0x42, 0x03, 0xe0, 0x0c,
+ 0x1c, 0xe0, 0x04, 0x42, 0x0f, 0xce, 0xed, 0x2c, 0x2f, 0xde, 0xb9, 0xe0,
+ 0x12, 0x40, 0xcc, 0xef,
+ 0xf0, 0xbf, 0x11, 0x71, 0xea, 0xda, 0x0f, 0x11, 0x02, 0x00, 0x00, 0xbe,
+ 0x0d, 0xf3, 0x07, 0x30,
+ 0xee, 0xd0, 0x00, 0x5d, 0x0a, 0xcf, 0xf0, 0x10, 0x2f, 0xef, 0x1e, 0x3d,
+ 0x80, 0x02, 0x10, 0x2a,
+ 0xfd, 0x01, 0x04, 0x10, 0x2d, 0x0e, 0xd3, 0x04, 0x71, 0x10, 0xd0, 0xf0,
+ 0x3e, 0x01, 0x87, 0x01,
+ 0x40, 0x01, 0xfe, 0x09, 0x0e, 0x22, 0x44, 0x01, 0xfe, 0x00, 0x13, 0x40,
+ 0x2c, 0x00, 0x25, 0x01,
+ 0xc0, 0x4f, 0x73, 0x07, 0xf0, 0xde, 0x30, 0x61, 0x00, 0xd0, 0x10, 0x20,
+ 0x00, 0x0f, 0x2d, 0x00,
+ 0xd7, 0xe2, 0xe0, 0x40, 0x12, 0xe3, 0x84, 0xe1, 0x0f, 0x2f, 0x02, 0xc3,
+ 0xd4, 0x02, 0x4d, 0x08,
+ 0x9d, 0x00, 0x02, 0x30, 0xdd, 0xd1, 0x47, 0x20, 0xba, 0x0e, 0x20, 0x01,
+ 0xe2, 0x01, 0x1f, 0x0f,
+ 0xe1, 0xff, 0xe9, 0x2c, 0x5f, 0xd1, 0xc1, 0x0e, 0x7e, 0x0f, 0xe0, 0x0f,
+ 0x1a, 0xee, 0x00, 0x51,
+ 0x02, 0xf1, 0xef, 0x0c, 0x3e, 0x40, 0xfe, 0xdb, 0x0e, 0x0f, 0x60, 0x03,
+ 0xf3, 0x0f, 0xf9, 0x0d,
+ 0x32, 0x35, 0xe0, 0xbf, 0x10, 0x62, 0x00, 0xd0, 0x12, 0x52, 0xff, 0xdd,
+ 0x41, 0x04, 0xe0, 0xb0,
+ 0x37, 0x33, 0xe0, 0xd0, 0x21, 0x03, 0x0f, 0x49, 0x00, 0xa1, 0xf1, 0x10,
+ 0x3d, 0xf9, 0xde, 0xf0,
+ 0x02, 0x02, 0x30, 0xed, 0x80, 0x34, 0x11, 0xde, 0xd0, 0x44, 0x10, 0xef,
+ 0xf3, 0x16, 0x01, 0x00,
+ 0xfe, 0xae, 0x1f, 0x71, 0xf2, 0xd1, 0x1e, 0x3e, 0xe5, 0xf6, 0x20, 0xeb,
+ 0x0d, 0x30, 0xe1, 0xd2,
+ 0x74, 0x22, 0xe1, 0x00, 0x2d, 0x2b, 0x10, 0x33, 0x02, 0xb1, 0x20, 0x3c,
+ 0xfc, 0xd2, 0xf5, 0xb0,
+ 0x10, 0x70, 0x10, 0xb0, 0xf0, 0x30, 0x11, 0xf3, 0xe7, 0x43, 0x12, 0xde,
+ 0x1d, 0x52, 0xe4, 0xf0,
+ 0x50, 0xfe, 0xfc, 0x12, 0x07, 0x04, 0x14, 0x41, 0xe0, 0x00, 0x10, 0x10,
+ 0xe0, 0x33, 0x75, 0xf2,
+ 0xb1, 0x10, 0x2e, 0x0d, 0x0f, 0xf3, 0xf6, 0x12, 0x02, 0x13, 0x11, 0x9d,
+ 0xed, 0x3e, 0x2f, 0xc1,
+ 0xde, 0x0c, 0x2d, 0xe8, 0xe1, 0x07, 0xb0, 0x0c, 0x2e, 0xc1, 0xc1, 0x20,
+ 0x30, 0x90, 0x00, 0x2f,
+ 0x0d, 0xaf, 0x02, 0x22, 0x10, 0xd0, 0x01, 0x0c, 0xf8, 0xff, 0x30, 0xf1,
+ 0xa1, 0x01, 0x20, 0xf0,
+ 0xe0, 0x1c, 0xeb, 0xcf, 0x2f, 0x4d, 0xef, 0xc3, 0x04, 0x20, 0x10, 0x0f,
+ 0xec, 0xeb, 0x2f, 0x3f,
+ 0xa0, 0x03, 0x43, 0x0f, 0xfc, 0x2c, 0x3b, 0xfc, 0x0e, 0x70, 0x10, 0xcf,
+ 0x50, 0x21, 0xff, 0xfe,
+ 0x1f, 0x1f, 0x3e, 0x3d, 0xd4, 0x07, 0x42, 0x2e, 0x0b, 0x00, 0x24, 0x03,
+ 0xd2, 0x70, 0x4e, 0xde,
+ 0x0f, 0x30, 0x03, 0xd6, 0x72, 0x3e, 0xcc, 0xf0, 0x14, 0x22, 0x0f, 0xf0,
+ 0xf1, 0xff, 0x0b, 0x0e,
+ 0x00, 0xd0, 0x01, 0x00, 0xdb, 0x4b, 0x00, 0x84, 0xf3, 0x50, 0x0c, 0xfe,
+ 0x01, 0x01, 0xff, 0x11,
+ 0x54, 0xd3, 0xd1, 0x20, 0x7d, 0x0b, 0xc0, 0x03, 0x11, 0x2d, 0xee, 0xf3,
+ 0x04, 0x00, 0x0f, 0x10,
+ 0xfd, 0xd9, 0x01, 0x33, 0x00, 0xad, 0x0e, 0xf6, 0x05, 0x12, 0xb0, 0xf0,
+ 0x00, 0xe0, 0x33, 0x56,
+ 0x90, 0x00, 0x13, 0x21, 0xde, 0xfd, 0x30, 0xe5, 0xb4, 0x52, 0x0f, 0xea,
+ 0xe0, 0x14, 0x14, 0x11,
+ 0x00, 0xff, 0xde, 0x40, 0x32, 0x01, 0xe3, 0x15, 0x31, 0x2f, 0x1e, 0x2e,
+ 0xe0, 0xc5, 0x63, 0x20,
+ 0xde, 0xff, 0x4f, 0x0f, 0xcf, 0x0c, 0xfb, 0x20, 0xf0, 0x9e, 0x0e, 0x3e,
+ 0xff, 0xa0, 0xf9, 0x2e,
+ 0x42, 0xd3, 0xcf, 0x0c, 0x3d, 0xff, 0xe0, 0xff, 0x0d, 0x3c, 0xed, 0xad,
+ 0x0e, 0xee, 0x2e, 0x61,
+ 0x0f, 0xd8, 0xc8, 0x10, 0x31, 0x10, 0xbf, 0xf0, 0x01, 0x0f, 0x0b, 0xee,
+ 0xe1, 0x02, 0x00, 0xcf,
+ 0xfe, 0x1d, 0x0e, 0xd0, 0xc0, 0xe0, 0x0c, 0x0a, 0x00, 0x32, 0xcd, 0xad,
+ 0x04, 0x03, 0xdf, 0x7a,
+ 0x1d, 0xbf, 0x00, 0x20, 0xfd, 0xdc, 0x3e, 0x3e, 0xbe, 0xf0, 0x02, 0x22,
+ 0xd0, 0x09, 0x6c, 0xe0,
+ 0xd4, 0x02, 0x21, 0x10, 0xee, 0x1e, 0x61, 0xe1, 0xd0, 0x5f, 0x2f, 0xf2,
+ 0xe3, 0x2b, 0x2b, 0x00,
+ 0x05, 0x01, 0x0f, 0x20, 0x33, 0xf4, 0x10, 0x0f, 0xd2, 0x73, 0x3e, 0xce,
+ 0x01, 0x3f, 0x3e, 0xf0,
+ 0x01, 0x67, 0x06, 0xf0, 0xf0, 0x11, 0x74, 0x25, 0x03, 0xd2, 0x10, 0x30,
+ 0x10, 0x23, 0x02, 0xaf,
+ 0xf6, 0x27, 0x42, 0xf0, 0xf0, 0x40, 0x00, 0xb3, 0x46, 0x41, 0x02, 0x02,
+ 0x4d, 0x00, 0x6c, 0x00,
+ 0xd5, 0xff, 0x05, 0xff, 0xa4, 0x00, 0x57, 0xff, 0x32, 0x66, 0x12, 0x00,
+ 0x11, 0x13, 0x00, 0xfe,
+ 0x2f, 0x44, 0x05, 0xd1, 0x00, 0x30, 0x4f, 0x1f, 0xe0, 0xbe, 0x1e, 0x51,
+ 0x02, 0xf0, 0x20, 0x61,
+ 0x10, 0x0f, 0x00, 0x02, 0x44, 0x33, 0x00, 0x00, 0x27, 0xf3, 0xc0, 0x1d,
+ 0x60, 0x21, 0x18, 0x0d,
+ 0xf0, 0xd3, 0xc6, 0x02, 0x2f, 0x3f, 0x30, 0x4c, 0x2a, 0x00, 0xd3, 0x03,
+ 0x10, 0x8d, 0xe0, 0x40,
+ 0x3a, 0xee, 0xd3, 0x04, 0xf0, 0xbe, 0xdd, 0x0e, 0x2f, 0x00, 0x20, 0x0e,
+ 0x8e, 0xed, 0x0b, 0x1d,
+ 0xfd, 0xd0, 0xe1, 0x0f, 0x0b, 0xfd, 0xcd, 0xce, 0xe2, 0x01, 0x09, 0x1d,
+ 0x2f, 0xbf, 0xbd, 0xfd,
+ 0x0f, 0xc6, 0xd4, 0x00, 0x2b, 0x2e, 0xf0, 0xd0, 0xe0, 0x10, 0x1f, 0x00,
+ 0xbf, 0xbe, 0xc0, 0xf1,
+ 0x3f, 0x2f, 0xff, 0xe3, 0xc7, 0xa0, 0xfd, 0x00, 0x21, 0x4d, 0x2b, 0x0f,
+ 0xe3, 0xe4, 0xdf, 0xbd,
+ 0xf0, 0x11, 0x1c, 0xec, 0xe1, 0x05, 0x03, 0xf6, 0x20, 0xfa, 0x8c, 0x00,
+ 0x51, 0x12, 0xf1, 0x00,
+ 0x00, 0xe0, 0x00, 0x2f, 0xfe, 0xed, 0x22, 0xf7, 0xb3, 0x1e, 0x2b, 0x20,
+ 0x13, 0xe1, 0x0e, 0x3f,
+ 0x52, 0x22, 0x0e, 0xcc, 0xfe, 0x10, 0x43, 0x73, 0x4d, 0x1d, 0x00, 0xe9,
+ 0xdc, 0xf0, 0x51, 0x3f,
+ 0x2d, 0x00, 0x01, 0x01, 0x00, 0x03, 0x07, 0xe2, 0x10, 0x7e, 0x1f, 0xd0,
+ 0x06, 0x14, 0xf1, 0x00,
+ 0x4e, 0x1f, 0xe1, 0x83, 0xd0, 0xf0, 0x1d, 0x0b, 0xe0, 0x00, 0x4d, 0x0f,
+ 0x07, 0x63, 0x3e, 0x0b,
+ 0xf0, 0x00, 0x00, 0x12, 0x31, 0x20, 0x60, 0x40, 0x1c, 0xfc, 0xff, 0x00,
+ 0xef, 0xdf, 0x40, 0x7e,
+ 0x1a, 0x00, 0xf3, 0xe0, 0x0d, 0x1f, 0x03, 0x02, 0x21, 0x30, 0x41, 0x44,
+ 0x4a, 0x28, 0x00, 0x01,
+ 0x00, 0x1e, 0x01, 0xd3, 0x02, 0x60, 0x2e, 0x03, 0xb7, 0xc0, 0xef, 0x13,
+ 0x75, 0x20, 0x00, 0xd0,
+ 0xd0, 0xe0, 0x01, 0x62, 0x30, 0x0f, 0xe5, 0xf4, 0x00, 0xff, 0x01, 0x34,
+ 0x00, 0xfe, 0x00, 0xe1,
+ 0x81, 0xc2, 0xe1, 0xf0, 0x0f, 0x2e, 0x30, 0x04, 0xe3, 0x0a, 0xdd, 0x86,
+ 0x02, 0x0c, 0x0c, 0x00,
+ 0x05, 0x02, 0x00, 0x0f, 0xef, 0xce, 0xd0, 0x05, 0x21, 0x20, 0xff, 0x80,
+ 0xe1, 0x10, 0x0d, 0xda,
+ 0xcf, 0xf0, 0x10, 0x2f, 0x0c, 0xad, 0xc0, 0xf4, 0x00, 0x1a, 0x3c, 0x2f,
+ 0xe1, 0xc0, 0x0d, 0xec,
+ 0x8f, 0x00, 0x30, 0x22, 0x05, 0xf1, 0x00, 0x0f, 0x2f, 0x4f, 0x10, 0xf7,
+ 0xe4, 0x41, 0x61, 0x01,
+ 0xf0, 0x0f, 0x2d, 0x0e, 0x0f, 0xdf, 0xd2, 0xf3, 0xff, 0x1e, 0x7e, 0x1a,
+ 0xf0, 0xf2, 0x0e, 0x08,
+ 0x0f, 0x70, 0x31, 0x21, 0x02, 0x00, 0xfd, 0x00, 0x62, 0x10, 0xf0, 0x0f,
+ 0x0d, 0xee, 0xb7, 0xf4,
+ 0x20, 0x5c, 0x2e, 0x00, 0x0e, 0xfc, 0xff, 0x05, 0x17, 0xf1, 0xf0, 0x01,
+ 0xf3, 0xef, 0x0a, 0xe0,
+ 0x82, 0xf2, 0x31, 0x30, 0xd1, 0xe1, 0x7e, 0x2b, 0xe0, 0xd1, 0x11, 0x10,
+ 0xef, 0x0e, 0x5c, 0x1d,
+ 0x0f, 0x03, 0xa4, 0xc0, 0x0d, 0x0c, 0x00, 0x02, 0xf2, 0xc2, 0xd0, 0x09,
+ 0x1c, 0xfe, 0xb0, 0xf1,
+ 0x20, 0x0e, 0xf0, 0x03, 0x02, 0xe9, 0xec, 0x00, 0x51, 0x61, 0x12, 0xf0,
+ 0xec, 0x1e, 0x30, 0x10,
+ 0x22, 0x3f, 0x0e, 0xf6, 0x01, 0x3d, 0x5b, 0x0e, 0x1f, 0x73, 0x07, 0xf2,
+ 0x10, 0x4d, 0x0c, 0xf0,
+ 0x53, 0x45, 0x00, 0xee, 0xfd, 0x10, 0x32, 0x12, 0xe1, 0xa0, 0xe0, 0x2e,
+ 0x3a, 0xfd, 0xc0, 0xd1,
+ 0xd2, 0x03, 0x3f, 0xf8, 0xcd, 0x01, 0x33, 0x41, 0xe1, 0x80, 0xdc, 0x0e,
+ 0x21, 0x11, 0xe1, 0xf2,
+ 0x42, 0x42, 0x02, 0xbd, 0xd9, 0x00, 0x24, 0x02, 0xe2, 0x92, 0xd0, 0x0e,
+ 0x2f, 0x1f, 0xf8, 0xec,
+ 0xcc, 0xbf, 0x00, 0x10, 0x00, 0xe0, 0x1f, 0x5d, 0x10, 0xf4, 0xf3, 0x00,
+ 0xff, 0x00, 0x0f, 0xea,
+ 0x20, 0x73, 0x21, 0xf0, 0xde, 0xf0, 0x05, 0xe2, 0xb0, 0x0f, 0x30, 0x21,
+ 0x13, 0x37, 0xf7, 0xc1,
+ 0x00, 0x0f, 0x40, 0x40, 0x11, 0x02, 0x03, 0x71, 0x2d, 0x0e, 0x04, 0x45,
+ 0x22, 0x02, 0x0f, 0x2b,
+ 0x30, 0x21, 0x10, 0x0f, 0x32, 0x72, 0x4f, 0xee, 0xb0, 0x0f, 0x2f, 0x13,
+ 0xf0, 0x0f, 0x17, 0xf6,
+ 0x21, 0x72, 0x02, 0xf1, 0xff, 0xe0, 0xe3, 0x05, 0x00, 0xd0, 0x00, 0x2f,
+ 0xcc, 0xc1, 0x03, 0xcf,
+ 0xdb, 0x5b, 0x6f, 0x13, 0x05, 0x01, 0x3e, 0x3d, 0xf0, 0xd6, 0x02, 0x20,
+ 0x1d, 0xd0, 0xc3, 0x30,
+ 0x7e, 0x1e, 0xf2, 0xc0, 0xfa, 0x1e, 0x00, 0x00, 0x2e, 0x01, 0xe3, 0xd0,
+ 0xfd, 0x08, 0x0e, 0xf2,
+ 0x42, 0x70, 0x23, 0xf5, 0x80, 0xec, 0x0b, 0x0f, 0xe1, 0xd2, 0xf1, 0xe0,
+ 0xff, 0x0e, 0x1e, 0x3e,
+ 0x3e, 0x3f, 0x0f, 0x81, 0xe1, 0x2e, 0x1a, 0xee, 0xc0, 0xed, 0xee, 0x04,
+ 0x31, 0x0f, 0x00, 0x51,
+ 0x28, 0xdd, 0xa0, 0x03, 0x00, 0x1d, 0x50, 0x32, 0x0b, 0xe9, 0xef, 0x11,
+ 0x41, 0x22, 0x22, 0x50,
+ 0x4d, 0x09, 0xef, 0xe1, 0x02, 0x20, 0x30, 0x32, 0xf1, 0xcf, 0x1f, 0x1f,
+ 0xcb, 0x1f, 0x72, 0x33,
+ 0x14, 0x33, 0x20, 0xef, 0xd0, 0x2d, 0x3b, 0x42, 0x45, 0x20, 0x0f, 0x10,
+ 0x70, 0x2f, 0x01, 0x05,
+ 0xc0, 0xdf, 0x0f, 0x3f, 0x3f, 0x21, 0x13, 0xd3, 0x80, 0xfc, 0x3c, 0x22,
+ 0xf7, 0xf0, 0x0e, 0xf0,
+ 0x04, 0x53, 0x30, 0x0f, 0xe1, 0xe0, 0x0c, 0x2f, 0x12, 0xd4, 0x80, 0xdc,
+ 0x3e, 0x2f, 0xfc, 0xff,
+ 0xb7, 0xb4, 0xf0, 0x1e, 0x1d, 0x1e, 0x01, 0x14, 0x21, 0x0e, 0xfc, 0x1d,
+ 0x11, 0x05, 0x00, 0xeb,
+ 0x7f, 0x70, 0x51, 0x36, 0x12, 0x0f, 0xfe, 0xe0, 0xd1, 0x20, 0x40, 0xf0,
+ 0xf1, 0x10, 0x0a, 0xcc,
+ 0xe0, 0x01, 0xf0, 0xd1, 0x12, 0x40, 0xe0, 0x9f, 0xed, 0xfc, 0x0f, 0x04,
+ 0xf5, 0xe2, 0xe1, 0xf0,
+ 0x0d, 0x0c, 0x0f, 0xbf, 0xbe, 0xf2, 0x05, 0xd1, 0xb0, 0x0b, 0x0c, 0xa0,
+ 0xb1, 0xf1, 0x00, 0x02,
+ 0x02, 0x01, 0x0e, 0x0a, 0x0f, 0xf2, 0xf2, 0xf0, 0xdf, 0xce, 0x0c, 0x1e,
+ 0xf0, 0xd0, 0xd2, 0xa0,
+ 0xef, 0xe3, 0xdd, 0x08, 0x10, 0xb2, 0xc2, 0xe3, 0xf0, 0xbb, 0xed, 0x01,
+ 0xf4, 0xe1, 0x10, 0x4e,
+ 0x0a, 0xb0, 0xd3, 0xc0, 0xed, 0x39, 0x4e, 0x00, 0xd2, 0xd1, 0xd1, 0xd0,
+ 0x00, 0x32, 0x21, 0x2f,
+ 0x5b, 0x00, 0x94, 0x04, 0x32, 0x01, 0xff, 0x0c, 0x2f, 0x21, 0x01, 0x5f,
+ 0x5d, 0x2e, 0x20, 0x10,
+ 0x0d, 0x1d, 0x4c, 0x33, 0x27, 0x44, 0x3d, 0x1c, 0x70, 0x42, 0x01, 0x05,
+ 0x34, 0x41, 0x1f, 0x00,
+ 0x02, 0x22, 0x11, 0xf1, 0x02, 0x20, 0x0e, 0x1f, 0x4e, 0x11, 0x07, 0xc2,
+ 0xe1, 0x43, 0x15, 0xc3,
+ 0xe2, 0x02, 0xd3, 0xf1, 0x71, 0x07, 0xe7, 0x01, 0x00, 0xde, 0xa0, 0xf0,
+ 0x00, 0x04, 0x05, 0xd1,
+ 0xa0, 0xf0, 0x00, 0x00, 0x30, 0x10, 0xb1, 0xb1, 0xf0, 0x2e, 0x2c, 0x0f,
+ 0x02, 0x01, 0xed, 0xfe,
+ 0x00, 0xc3, 0xe7, 0x01, 0x09, 0xfd, 0x20, 0x61, 0x02, 0xb4, 0xb1, 0xfe,
+ 0x1c, 0x2e, 0x20, 0x01,
+ 0xdf, 0xe0, 0x13, 0x00, 0xf9, 0xfe, 0x00, 0x20, 0x00, 0x06, 0x31, 0x0f,
+ 0xff, 0x2e, 0x2d, 0x8f,
+ 0xd0, 0x6f, 0x50, 0x10, 0xfe, 0xfe, 0x0f, 0x20, 0x50, 0x4e, 0x1c, 0x00,
+ 0xf0, 0x08, 0x0a, 0x10,
+ 0x52, 0x20, 0x0f, 0x00, 0xfe, 0xd9, 0x00, 0x11, 0xe0, 0xfd, 0x3f, 0x31,
+ 0x0f, 0xdd, 0xdd, 0x30,
+ 0x11, 0xa0, 0xa0, 0xf8, 0x3e, 0x70, 0x22, 0x12, 0x0e, 0x08, 0xdf, 0xc1,
+ 0x10, 0x40, 0x11, 0x0f,
+ 0xfc, 0x00, 0x03, 0xf0, 0xdd, 0x28, 0x6f, 0x02, 0xf1, 0x2e, 0x2d, 0x0e,
+ 0xee, 0x01, 0x04, 0x80,
+ 0xee, 0x22, 0x35, 0x00, 0x0e, 0x2e, 0xfc, 0x8e, 0xe2, 0x05, 0x11, 0x10,
+ 0x20, 0x2f, 0xea, 0x9b,
+ 0x0f, 0x11, 0x00, 0xee, 0x10, 0x50, 0x40, 0x21, 0xf1, 0xdd, 0xeb, 0x10,
+ 0x42, 0x32, 0x20, 0xff,
+ 0xe4, 0x04, 0x3f, 0x4c, 0x0f, 0xbf, 0x0f, 0x5f, 0x11, 0xf3, 0x0f, 0x1b,
+ 0x00, 0x20, 0x6f, 0x0c,
+ 0xf0, 0xf5, 0x20, 0x2e, 0xef, 0xc4, 0xf4, 0x31, 0x5e, 0xfd, 0xb4, 0xf7,
+ 0x23, 0x10, 0xee, 0xc0,
+ 0xf0, 0x1e, 0x10, 0x03, 0xf2, 0x0f, 0xe1, 0xd7, 0x03, 0x0e, 0xbd, 0xf5,
+ 0x35, 0x11, 0x00, 0xf0,
+ 0xd0, 0xa2, 0xd3, 0x01, 0xf1, 0xe0, 0x30, 0x40, 0xc3, 0xb2, 0xf2, 0x04,
+ 0x30, 0x30, 0xa6, 0x91,
+ 0xf0, 0x12, 0x10, 0x09, 0x1f, 0x00, 0xef, 0xff, 0x30, 0x3f, 0x01, 0xf3,
+ 0x1d, 0x18, 0xfd, 0x0e,
+ 0xd0, 0xaf, 0x0f, 0x00, 0x80, 0xd0, 0x0e, 0x28, 0x0d, 0x0f, 0xe0, 0x00,
+ 0x20, 0x50, 0x3f, 0x1e,
+ 0xee, 0xc0, 0xff, 0x2c, 0x4d, 0x10, 0x0f, 0x28, 0x3e, 0x00, 0x00, 0x51,
+ 0x12, 0xc0, 0xbb, 0xfb,
+ 0x00, 0x22, 0x52, 0x20, 0x1c, 0x1c, 0x02, 0x15, 0x41, 0x10, 0x00, 0x50,
+ 0x20, 0xef, 0xb0, 0x0e,
+ 0x38, 0x0e, 0xf0, 0x02, 0xe0, 0xc0, 0xde, 0x0b, 0x0f, 0x02, 0x23, 0x01,
+ 0xb1, 0xc0, 0xce, 0xf5,
+ 0x35, 0x10, 0xee, 0xb0, 0xf2, 0xf2, 0xe2, 0x02, 0xf0, 0x82, 0xe5, 0x12,
+ 0x2f, 0x0b, 0xdf, 0xd1,
+ 0x02, 0x00, 0xe0, 0xd1, 0x40, 0x50, 0x00, 0xe1, 0xd0, 0xc0, 0x07, 0x12,
+ 0x0e, 0x0f, 0xf4, 0xa2,
+ 0xd0, 0x02, 0x0f, 0xba, 0xc1, 0x06, 0x41, 0x21, 0x01, 0xf0, 0xde, 0xce,
+ 0x00, 0x53, 0x15, 0x01,
+ 0x11, 0x12, 0x02, 0x02, 0x14, 0xf2, 0xd0, 0x01, 0x30, 0xe0, 0xe3, 0x67,
+ 0x30, 0x0e, 0xf1, 0x11,
+ 0x3f, 0xfe, 0x44, 0x77, 0x12, 0x1f, 0x1e, 0xff, 0x20, 0x70, 0x2f, 0xfe,
+ 0xfa, 0x0e, 0x00, 0x1f,
+ 0x7c, 0x3d, 0x00, 0x00, 0x1e, 0x1f, 0x10, 0x13, 0x10, 0x2c, 0x3d, 0x3a,
+ 0x1c, 0xac, 0xee, 0x36,
+ 0x44, 0x00, 0xec, 0xee, 0x11, 0xf0, 0xae, 0x00, 0x20, 0x00, 0xef, 0xef,
+ 0x00, 0x10, 0xe0, 0x80,
+ 0xdd, 0x08, 0xfd, 0xd0, 0x01, 0x0f, 0xcc, 0xb0, 0xe4, 0xd0, 0xed, 0x3d,
+ 0x7b, 0x1c, 0xf0, 0xd0,
+ 0xcc, 0xfc, 0x10, 0x22, 0x4e, 0x30, 0x02, 0xee, 0xea, 0x10, 0x70, 0x1f,
+ 0xf1, 0xf3, 0x01, 0x0e,
+ 0x00, 0x16, 0x20, 0x0e, 0xef, 0xc0, 0xd1, 0xf4, 0x02, 0x20, 0x50, 0x12,
+ 0xb2, 0xef, 0x4b, 0x3c,
+ 0xee, 0xa5, 0x16, 0x50, 0x1e, 0x00, 0xf1, 0x01, 0x21, 0x20, 0x02, 0x04,
+ 0x00, 0xd0, 0x05, 0x62,
+ 0x1e, 0xfe, 0x04, 0x23, 0x10, 0xe3, 0x05, 0x50, 0x1e, 0x12, 0x13, 0xee,
+ 0x9b, 0xd0, 0xf3, 0x10,
+ 0x50, 0x24, 0x02, 0xd0, 0xdf, 0xf0, 0xe0, 0xc6, 0xe4, 0xf1, 0xe0, 0x01,
+ 0x14, 0xe1, 0x80, 0xfd,
+ 0x0c, 0xd3, 0xd7, 0x11, 0x00, 0xe0, 0xce, 0x8d, 0xde, 0x0e, 0x20, 0x25,
+ 0x04, 0x00, 0x0a, 0xfe,
+ 0xc1, 0x02, 0x40, 0x40, 0x00, 0x01, 0x00, 0xfe, 0x01, 0x31, 0x30, 0x00,
+ 0x0d, 0x6f, 0x41, 0x0c,
+ 0xfa, 0x0f, 0x20, 0x10, 0x2f, 0xcc, 0xce, 0x77, 0x22, 0x0e, 0xed, 0xd0,
+ 0xe0, 0x00, 0x31, 0x30,
+ 0xfe, 0xcf, 0xd1, 0xd0, 0xc9, 0xfc, 0x0d, 0x3d, 0x30, 0x04, 0xb2, 0x0d,
+ 0x68, 0x2e, 0x0f, 0x0f,
+ 0x20, 0x20, 0xf0, 0x01, 0x42, 0x40, 0x10, 0x03, 0xe1, 0xa0, 0x0d, 0x5b,
+ 0x30, 0x17, 0x02, 0xf0,
+ 0x0c, 0xfb, 0xe0, 0x22, 0x60, 0x0f, 0xe0, 0xe0, 0xf0, 0xff, 0xff, 0x4f,
+ 0x5d, 0x1c, 0xe0, 0xc3,
+ 0x03, 0x21, 0x0e, 0x0c, 0xed, 0xcd, 0xf8, 0xfc, 0xf0, 0x24, 0x50, 0x0e,
+ 0x2d, 0x70, 0x02, 0xe2,
+ 0xf2, 0x15, 0x23, 0x30, 0x50, 0x04, 0xe3, 0x01, 0x00, 0xaf, 0xf2, 0x24,
+ 0x15, 0x04, 0xe1, 0xee,
+ 0x0c, 0x00, 0x10, 0x30, 0x05, 0xd3, 0xc0, 0x0e, 0x70, 0x50, 0x1d, 0x0a,
+ 0x0e, 0x00, 0xf3, 0xf6,
+ 0x11, 0x30, 0x4e, 0x1b, 0xf0, 0x03, 0x02, 0x00, 0xe0, 0xc0, 0xdf, 0x00,
+ 0x40, 0x1d, 0x0c, 0xdc,
+ 0xcd, 0x21, 0x74, 0x00, 0xdd, 0x00, 0x01, 0xec, 0x8e, 0xf5, 0x07, 0x12,
+ 0x20, 0x3e, 0x3e, 0x01,
+ 0xb4, 0x01, 0x70, 0x12, 0xf1, 0xef, 0x0a, 0x0d, 0x00, 0x20, 0x20, 0x00,
+ 0xe2, 0xe0, 0x0d, 0x0b,
+ 0x0e, 0x0f, 0x40, 0x44, 0xc4, 0xb0, 0x0e, 0x10, 0xff, 0xfe, 0x12, 0xe5,
+ 0x80, 0xc0, 0x10, 0x2c,
+ 0x0f, 0x01, 0x30, 0x1f, 0xee, 0x0a, 0x6f, 0x22, 0xe5, 0xc5, 0x02, 0x30,
+ 0x40, 0x20, 0x20, 0x11,
+ 0x06, 0x02, 0xd0, 0xbf, 0x0f, 0x30, 0x51, 0x22, 0x10, 0x0e, 0x0d, 0x20,
+ 0x27, 0xf2, 0xc0, 0x0d,
+ 0x4d, 0x20, 0x00, 0x1d, 0xde, 0x87, 0x04, 0x40, 0x2c, 0xed, 0xd2, 0xf5,
+ 0xf0, 0x1f, 0x3f, 0x00,
+ 0x0f, 0x2f, 0xf0, 0xb1, 0x02, 0x30, 0x2c, 0xdf, 0xa7, 0x02, 0x0f, 0xdd,
+ 0xf0, 0x02, 0xf0, 0x11,
+ 0x55, 0x01, 0xbc, 0xfc, 0x3f, 0x40, 0x30, 0x22, 0xc3, 0xa0, 0x0b, 0x1d,
+ 0x00, 0x01, 0x0e, 0x0b,
+ 0xfd, 0xdf, 0x15, 0x53, 0x10, 0x0c, 0xfe, 0xf0, 0x21, 0x02, 0xc0, 0x0e,
+ 0x12, 0xb5, 0xb0, 0x0e,
+ 0x1e, 0xe1, 0xf4, 0x03, 0xe1, 0x9f, 0xef, 0x1e, 0x0e, 0xce, 0xd8, 0x0e,
+ 0x02, 0xf7, 0x02, 0x00,
+ 0x90, 0xc0, 0x1f, 0x4e, 0x12, 0x07, 0x01, 0x00, 0xee, 0xff, 0x20, 0x40,
+ 0x20, 0xf0, 0x9f, 0xec,
+ 0x1d, 0x10, 0x01, 0x01, 0x00, 0xec, 0xd0, 0xe7, 0x01, 0x00, 0x21, 0x32,
+ 0xd2, 0xa5, 0x02, 0x0f,
+ 0xde, 0xc0, 0x00, 0x0c, 0x00, 0x04, 0xe3, 0x0f, 0x7c, 0x00, 0xc1, 0x20,
+ 0x64, 0x03, 0xef, 0xfb,
+ 0x50, 0x46, 0x13, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xf1, 0xf1, 0xf0,
+ 0x0c, 0x7b, 0x2f, 0xe1,
+ 0xc1, 0xf0, 0x00, 0x00, 0x2b, 0x3e, 0x11, 0x23, 0x53, 0x15, 0x01, 0x50,
+ 0x2f, 0xec, 0xc0, 0x03,
+ 0x0f, 0x0d, 0x32, 0x41, 0xed, 0x84, 0xf5, 0x1d, 0x1b, 0x13, 0x16, 0x00,
+ 0xff, 0xe0, 0xe0, 0x00,
+ 0x5e, 0x1f, 0xf2, 0xef, 0x09, 0x2e, 0x40, 0x00, 0xf0, 0x20, 0x0e, 0x0e,
+ 0x40, 0x20, 0xcf, 0x80,
+ 0xf0, 0x08, 0x5e, 0x30, 0x00, 0xfd, 0x00, 0x05, 0xd0, 0xfe, 0x2f, 0x41,
+ 0x44, 0x24, 0xe2, 0xa0,
+ 0x0f, 0x33, 0x26, 0xd0, 0xb0, 0x10, 0x30, 0x0f, 0xfe, 0xff, 0xe0, 0xe4,
+ 0x04, 0x20, 0x0f, 0xd3,
+ 0x02, 0x68, 0x1d, 0x00, 0x01, 0xd0, 0xbd, 0x2f, 0x4f, 0x00, 0xf3, 0x01,
+ 0x09, 0xfd, 0x00, 0x43,
+ 0x13, 0x00, 0xbd, 0xbd, 0x1d, 0x5f, 0x11, 0xf4, 0xd1, 0xed, 0x10, 0x57,
+ 0x00, 0xd0, 0xe2, 0x00,
+ 0x0b, 0x2c, 0x30, 0x01, 0xdd, 0xea, 0xd0, 0xa1, 0xff, 0x4e, 0x5e, 0x14,
+ 0xf5, 0xe0, 0xef, 0x11,
+ 0x50, 0x3f, 0x16, 0xf3, 0xcf, 0xbf, 0xf3, 0x31, 0x3d, 0x01, 0xf6, 0xf4,
+ 0xe1, 0xcf, 0x0e, 0x21,
+ 0x11, 0xf0, 0x03, 0x32, 0x0b, 0xbd, 0xdd, 0x0b, 0x40, 0x12, 0xff, 0xfb,
+ 0x0e, 0xd0, 0xef, 0x4f,
+ 0x31, 0x04, 0x16, 0x22, 0xbf, 0x9c, 0x0e, 0x50, 0x24, 0x01, 0x0f, 0x10,
+ 0x01, 0xdf, 0xce, 0x0f,
+ 0x3e, 0x6e, 0x03, 0xe7, 0xf0, 0x2a, 0x1d, 0xf0, 0xd2, 0x30, 0x70, 0x02,
+ 0xe0, 0xec, 0x0c, 0x00,
+ 0x03, 0xf4, 0xf1, 0x00, 0xfe, 0xdd, 0xe0, 0x21, 0x33, 0xa3, 0x90, 0xfd,
+ 0x08, 0xfe, 0xe3, 0xe6,
+ 0xf1, 0x00, 0x10, 0x20, 0x00, 0xb2, 0xb3, 0xf3, 0x00, 0xff, 0xf1, 0xd1,
+ 0xcf, 0x0e, 0x1e, 0x00,
+ 0xd7, 0xd2, 0x3d, 0x3e, 0xe0, 0xfd, 0x0d, 0x41, 0x76, 0x11, 0xe0, 0xdf,
+ 0x1c, 0x0a, 0xcf, 0x32,
+ 0x50, 0x0e, 0x01, 0xd5, 0x90, 0x0e, 0x4f, 0x20, 0x01, 0xe0, 0x2c, 0x4c,
+ 0x0e, 0x00, 0x01, 0xc1,
+ 0xb4, 0x05, 0x5f, 0x28, 0x1f, 0x02, 0xe3, 0x01, 0x20, 0x00, 0x02, 0x02,
+ 0x2a, 0x00, 0x50, 0x00,
+ 0x76, 0x00, 0x3a, 0xfd, 0xaa, 0xff, 0xf4, 0xfe, 0x6b, 0x22, 0x02, 0xd1,
+ 0xb3, 0xf1, 0x38, 0x4e,
+ 0x22, 0x13, 0x00, 0xe0, 0x01, 0x72, 0x10, 0xf1, 0x35, 0x60, 0x09, 0xde,
+ 0xe2, 0x01, 0x0f, 0x00,
+ 0xf0, 0xff, 0x0b, 0xfd, 0x0e, 0x6f, 0x20, 0xf2, 0x92, 0xee, 0x0a, 0x0c,
+ 0x1e, 0x51, 0x03, 0xd0,
+ 0xfe, 0x02, 0xe2, 0xf0, 0x60, 0x3d, 0x1a, 0x00, 0x04, 0x22, 0xf0, 0xdf,
+ 0x2e, 0x21, 0xf4, 0x12,
+ 0x61, 0x10, 0xe0, 0xf2, 0x23, 0x1e, 0xfb, 0xee, 0x03, 0x07, 0xf2, 0x9f,
+ 0x0d, 0x50, 0x06, 0xe2,
+ 0x00, 0x01, 0xd3, 0x02, 0x7f, 0x4e, 0x03, 0xa7, 0xe0, 0x1d, 0x2e, 0x01,
+ 0x00, 0x00, 0xf2, 0x00,
+ 0x0e, 0x10, 0x00, 0x0a, 0xfe, 0x22, 0x73, 0x1d, 0x08, 0x10, 0x14, 0x01,
+ 0x00, 0x1f, 0x50, 0x1f,
+ 0xdd, 0xe0, 0x23, 0x02, 0xef, 0x2b, 0x5e, 0x00, 0x12, 0x71, 0x1a, 0xdd,
+ 0xe3, 0x17, 0x10, 0xe0,
+ 0xd0, 0xff, 0x2f, 0x51, 0x22, 0xe2, 0xa3, 0xe2, 0xe0, 0x0e, 0x50, 0x12,
+ 0xe0, 0xe0, 0x07, 0xd2,
+ 0xae, 0x0b, 0x0f, 0x00, 0x13, 0xf5, 0xc0, 0x00, 0x31, 0x0e, 0xda, 0xef,
+ 0x23, 0x74, 0x00, 0xce,
+ 0xd0, 0x02, 0x10, 0x0f, 0x0e, 0x01, 0x04, 0xff, 0x08, 0x7e, 0x00, 0xc3,
+ 0xf2, 0x3f, 0x2b, 0xe0,
+ 0xf3, 0x03, 0xe0, 0xed, 0x0b, 0xf0, 0x11, 0x71, 0x00, 0xff, 0x6d, 0x2e,
+ 0xfd, 0x0c, 0x3d, 0x1f,
+ 0x03, 0x15, 0x30, 0x09, 0x2e, 0x70, 0x60, 0x00, 0x02, 0x10, 0x28, 0x0e,
+ 0x01, 0x41, 0x40, 0x10,
+ 0x00, 0x10, 0x31, 0x31, 0x30, 0x30, 0xfb, 0xcf, 0x03, 0x73, 0x20, 0x00,
+ 0xe0, 0xec, 0x0e, 0x21,
+ 0x2f, 0x1d, 0x04, 0x07, 0x01, 0xef, 0xcd, 0xc0, 0xe2, 0x2f, 0x1b, 0x0d,
+ 0x20, 0x35, 0xb3, 0xa0,
+ 0x0f, 0x0e, 0xde, 0xcc, 0x30, 0x22, 0x93, 0xd2, 0x01, 0x0c, 0x00, 0x07,
+ 0x02, 0xf0, 0xc0, 0xe2,
+ 0xf0, 0xed, 0x1e, 0x72, 0x22, 0x0f, 0xdf, 0xdf, 0xff, 0x00, 0xf0, 0xf9,
+ 0x0e, 0xf0, 0xa0, 0xd0,
+ 0xd4, 0xe5, 0xf2, 0xc1, 0xe0, 0x3f, 0x22, 0xa7, 0xc3, 0xe0, 0xde, 0xcf,
+ 0xe2, 0x17, 0x23, 0x00,
+ 0xdd, 0xde, 0xee, 0x9d, 0xec, 0x00, 0x04, 0xe3, 0xe2, 0xe0, 0x3d, 0x7a,
+ 0x1f, 0xe2, 0xe4, 0x00,
+ 0x1e, 0x00, 0x01, 0x2f, 0x5d, 0x21, 0xf0, 0xfa, 0x2f, 0x40, 0x70, 0x01,
+ 0xc1, 0xe0, 0x0f, 0x0f,
+ 0xf0, 0x10, 0x2f, 0x02, 0xb7, 0xc5, 0x10, 0x5c, 0x1e, 0x01, 0x04, 0x02,
+ 0x00, 0x0e, 0x3b, 0x2e,
+ 0x12, 0x03, 0xb0, 0xdd, 0x1f, 0x12, 0x1f, 0x4d, 0x2e, 0x1f, 0xe4, 0x84,
+ 0xd0, 0x0e, 0x40, 0x23,
+ 0x01, 0xef, 0xee, 0xea, 0x1e, 0x41, 0x03, 0xae, 0xf2, 0x07, 0xfe, 0xeb,
+ 0xf2, 0xf3, 0xce, 0xcf,
+ 0xe0, 0xe0, 0x01, 0x5e, 0x1d, 0xd7, 0xb4, 0x00, 0x4f, 0x1e, 0x01, 0x02,
+ 0x0d, 0x0c, 0x31, 0x40,
+ 0x0d, 0xe4, 0x01, 0x18, 0x0c, 0x00, 0xff, 0xf0, 0x52, 0x41, 0x00, 0xd0,
+ 0xfd, 0x10, 0x37, 0x33,
+ 0x01, 0x4e, 0x4d, 0x0e, 0x11, 0x77, 0x41, 0x0f, 0xd0, 0xe0, 0x10, 0x6d,
+ 0x3a, 0x3f, 0x11, 0x0e,
+ 0xfb, 0xc0, 0xc2, 0x10, 0x7f, 0x10, 0xf2, 0x0f, 0x1c, 0x00, 0xf5, 0x23,
+ 0x2f, 0x0c, 0x13, 0x25,
+ 0xf0, 0xa0, 0xe1, 0x1e, 0x1d, 0x01, 0x02, 0x12, 0x14, 0x01, 0xad, 0xd0,
+ 0x04, 0x3d, 0x09, 0xf0,
+ 0x02, 0xd0, 0x8e, 0xfe, 0x21, 0x04, 0xe0, 0xde, 0xc0, 0xf0, 0x0c, 0x01,
+ 0x17, 0x42, 0x10, 0xaf,
+ 0xc0, 0xe1, 0x01, 0x40, 0x30, 0x00, 0xc2, 0xe4, 0x20, 0x4b, 0x1e, 0x00,
+ 0xf3, 0xf6, 0xc4, 0xe0,
+ 0x3e, 0x1e, 0xb0, 0xf4, 0x24, 0x10, 0x0e, 0x2e, 0x30, 0x00, 0xcd, 0xce,
+ 0x00, 0x2d, 0x28, 0x6e,
+ 0x22, 0xe1, 0xdd, 0x0f, 0x03, 0x01, 0x00, 0x1f, 0x08, 0xb0, 0xe3, 0x40,
+ 0x4b, 0x0e, 0x00, 0x01,
+ 0xde, 0xbb, 0x1f, 0x40, 0x20, 0x00, 0x00, 0xdd, 0x0e, 0x73, 0x26, 0x01,
+ 0xf0, 0xff, 0x2f, 0x20,
+ 0x1f, 0x13, 0x13, 0x3c, 0x2a, 0xb1, 0x83, 0xf0, 0x0d, 0x0e, 0x02, 0x15,
+ 0xe0, 0x0f, 0x6f, 0x2c,
+ 0x00, 0xe6, 0xe1, 0x0f, 0x01, 0x14, 0xf0, 0xef, 0x10, 0xf1, 0xb0, 0x00,
+ 0x12, 0x00, 0xdf, 0xbe,
+ 0xeb, 0xee, 0xc0, 0xe0, 0x0d, 0xf9, 0xe0, 0x03, 0xe3, 0xe0, 0xe0, 0xa4,
+ 0xe2, 0x11, 0x52, 0x14,
+ 0x10, 0x68, 0x2e, 0xd0, 0xb2, 0xe1, 0x00, 0x01, 0x23, 0x40, 0x1f, 0xe2,
+ 0xe2, 0x0e, 0x1b, 0x31,
+ 0x12, 0xfb, 0x0d, 0x00, 0xe0, 0xb0, 0xf0, 0x2d, 0x7d, 0x31, 0x17, 0x01,
+ 0x1e, 0x39, 0x10, 0x35,
+ 0x11, 0xdf, 0x2f, 0x70, 0x60, 0x20, 0xf0, 0xd1, 0x03, 0x01, 0xf0, 0xf0,
+ 0x54, 0x43, 0x01, 0xb1,
+ 0xe2, 0x03, 0x1f, 0x2c, 0x1e, 0xf5, 0xf6, 0x02, 0x21, 0x70, 0x10, 0x0f,
+ 0x00, 0x15, 0xe1, 0xbe,
+ 0xfd, 0x10, 0x33, 0x22, 0x03, 0xd0, 0xcf, 0x02, 0x25, 0x00, 0xbd, 0xd0,
+ 0xf4, 0x11, 0x2f, 0x16,
+ 0xf4, 0xc1, 0x01, 0x40, 0xf0, 0xce, 0x0b, 0x0d, 0xcc, 0x10, 0x21, 0xda,
+ 0xfd, 0x41, 0x33, 0xf1,
+ 0xbf, 0xee, 0x30, 0x73, 0x16, 0xe3, 0xb0, 0xff, 0x10, 0x14, 0x15, 0x30,
+ 0x0e, 0xc0, 0x15, 0x62,
+ 0x1f, 0xfd, 0x0f, 0x31, 0x21, 0xe3, 0xf2, 0x3d, 0x58, 0x3e, 0x30, 0x01,
+ 0xc1, 0xf0, 0x30, 0x72,
+ 0x20, 0x08, 0x0f, 0x21, 0x31, 0x0f, 0xee, 0x21, 0x31, 0x0f, 0x20, 0x3d,
+ 0xca, 0xde, 0x5e, 0x3c,
+ 0xfe, 0x00, 0x30, 0xf2, 0x91, 0xcc, 0xff, 0x35, 0x41, 0x1f, 0xf0, 0xcc,
+ 0xee, 0x01, 0x00, 0xe0,
+ 0xc0, 0x0d, 0x1c, 0xee, 0xab, 0xef, 0xe0, 0x0e, 0x2d, 0x1d, 0xf0, 0x05,
+ 0x00, 0xed, 0x20, 0xe5,
+ 0x8f, 0x18, 0x0f, 0x91, 0x02, 0x11, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0xc0,
+ 0xde, 0x0d, 0x10, 0xf1,
+ 0xb1, 0xf7, 0x24, 0x0e, 0xed, 0x03, 0x33, 0x3f, 0x01, 0xe6, 0xf4, 0x10,
+ 0xfc, 0x5e, 0x73, 0x05,
+ 0xf0, 0x00, 0x20, 0x2f, 0x30, 0x21, 0x20, 0x4f, 0x1d, 0xba, 0xef, 0x52,
+ 0x43, 0x02, 0xf0, 0xeb,
+ 0xec, 0x10, 0x43, 0x22, 0x00, 0x2f, 0x30, 0x01, 0xf0, 0xfb, 0xcc, 0x21,
+ 0x75, 0x20, 0x2e, 0x4e,
+ 0xee, 0x91, 0xf5, 0x10, 0x1e, 0x0d, 0xff, 0xf2, 0x17, 0x12, 0xc0, 0xde,
+ 0x00, 0x22, 0x31, 0x1f,
+ 0xde, 0xcc, 0x0d, 0x32, 0x26, 0x00, 0xfd, 0xaf, 0xd3, 0xf0, 0x1b, 0x2e,
+ 0x00, 0xd0, 0x0e, 0x01,
+ 0x82, 0x0e, 0x59, 0x30, 0xf2, 0x91, 0xe0, 0x00, 0x14, 0x03, 0xff, 0x3c,
+ 0x40, 0x04, 0xc0, 0xed,
+ 0x0d, 0x1e, 0x20, 0x20, 0x1f, 0xea, 0xef, 0x02, 0xe4, 0xa1, 0xff, 0x1e,
+ 0x11, 0x03, 0x00, 0x0f,
+ 0xb4, 0xb7, 0x01, 0x20, 0x1f, 0xfc, 0xf0, 0x05, 0x11, 0x3e, 0x3c, 0x2f,
+ 0x10, 0x23, 0x13, 0xdf,
+ 0x0d, 0x3f, 0xc0, 0xb4, 0x04, 0x50, 0x20, 0xf2, 0xe0, 0x20, 0x44, 0x5e,
+ 0x49, 0x00, 0xc2, 0xf1,
+ 0x1f, 0xee, 0xbf, 0xf2, 0x05, 0xf0, 0xdb, 0x3c, 0x71, 0x15, 0xf1, 0xf0,
+ 0xef, 0xdf, 0x01, 0x71,
+ 0x20, 0x00, 0xf2, 0xf1, 0xfe, 0xef, 0x05, 0x42, 0x1f, 0xd0, 0x90, 0xdc,
+ 0x1e, 0x53, 0x03, 0xf5,
+ 0xf5, 0xe0, 0x0e, 0x20, 0x05, 0xf2, 0x00, 0x20, 0x20, 0x20, 0x30, 0x13,
+ 0x06, 0x12, 0x11, 0x02,
+ 0x41, 0x7f, 0x7c, 0x1e, 0x02, 0xe5, 0xf1, 0x3f, 0x4b, 0x0d, 0xd0, 0xf0,
+ 0x00, 0xc3, 0xb0, 0x0c,
+ 0x4f, 0x23, 0x02, 0xec, 0xdd, 0xf2, 0x2e, 0x2b, 0xf0, 0xdf, 0xdb, 0x2e,
+ 0x3f, 0x00, 0x10, 0x10,
+ 0xb2, 0xe2, 0x4c, 0x4d, 0x00, 0xfe, 0xda, 0xf0, 0x70, 0x30, 0x01, 0x0f,
+ 0x18, 0x70, 0x31, 0x00,
+ 0xd0, 0x00, 0x41, 0x40, 0x2b, 0x0c, 0xce, 0xf0, 0x41, 0x00, 0xc0, 0xd0,
+ 0xfd, 0x1c, 0x20, 0x21,
+ 0x10, 0x19, 0xdb, 0x80, 0xe3, 0x01, 0x0f, 0x0f, 0x20, 0x00, 0xbd, 0xec,
+ 0x11, 0x13, 0xee, 0xde,
+ 0x01, 0x01, 0xc0, 0x91, 0x0f, 0x3f, 0x17, 0xf2, 0x0b, 0x2e, 0xf2, 0xe5,
+ 0xe2, 0xd0, 0xbe, 0xe0,
+ 0x24, 0x31, 0xd0, 0x80, 0x00, 0x14, 0xd4, 0xc1, 0x0d, 0x1c, 0xff, 0xee,
+ 0x00, 0x02, 0xff, 0xd0,
+ 0x3e, 0x78, 0x00, 0xe6, 0xf1, 0x3f, 0x3f, 0x21, 0x41, 0x30, 0xf0, 0x8e,
+ 0xf0, 0x00, 0x1d, 0x00,
+ 0xe3, 0xef, 0x19, 0x1e, 0x10, 0x41, 0x40, 0x0d, 0xe1, 0xc7, 0x00, 0x2f,
+ 0x2e, 0x00, 0x35, 0x52,
+ 0x10, 0x0e, 0x1f, 0x11, 0xf0, 0x40, 0x63, 0xe0, 0x99, 0xfe, 0x21, 0x1f,
+ 0x09, 0x1f, 0x02, 0xf1,
+ 0x00, 0x3e, 0x3f, 0x10, 0xf1, 0xf2, 0x32, 0x61, 0x30, 0x2f, 0x04, 0xe1,
+ 0xfc, 0xfe, 0x55, 0x67,
+ 0x02, 0xe0, 0x0f, 0x0f, 0xef, 0x00, 0x32, 0x02, 0xdf, 0x2e, 0x40, 0xe5,
+ 0xd2, 0x2e, 0x6c, 0x10,
+ 0x01, 0x02, 0x15, 0xf2, 0xae, 0xec, 0x0f, 0x21, 0x10, 0x2e, 0x1d, 0xaf,
+ 0xbe, 0xfd, 0x00, 0x00,
+ 0xe3, 0xe2, 0xeb, 0x0c, 0x21, 0xf0, 0x88, 0xef, 0x12, 0x31, 0x1e, 0x0c,
+ 0x00, 0xd4, 0xd2, 0x00,
+ 0x2e, 0x4c, 0x2e, 0xe1, 0xd2, 0x0f, 0x0c, 0xff, 0xe2, 0x90, 0x0d, 0x2e,
+ 0xe4, 0xe7, 0x12, 0x81,
+ 0xd0, 0x0e, 0xfb, 0x01, 0x50, 0x1b, 0xe0, 0x05, 0x31, 0x20, 0x00, 0x00,
+ 0x0e, 0x2f, 0x5f, 0x0f,
+ 0xc5, 0xf2, 0x4e, 0x4d, 0x03, 0x06, 0xe0, 0xef, 0x10, 0x60, 0x10, 0xe0,
+ 0xb3, 0x03, 0x20, 0x10,
+ 0x07, 0xf3, 0xf0, 0xde, 0xd0, 0x20, 0x60, 0x00, 0xe7, 0x04, 0x11, 0xcf,
+ 0xbd, 0x00, 0x23, 0x12,
+ 0xf0, 0xff, 0xf0, 0xc6, 0xc1, 0x1f, 0x4e, 0x0e, 0xc3, 0xe5, 0x1f, 0x1d,
+ 0xdf, 0xdf, 0x21, 0x07,
+ 0xd2, 0x00, 0x1f, 0x00, 0x10, 0xdd, 0x88, 0xf0, 0x11, 0x10, 0x10, 0x00,
+ 0xb0, 0xf2, 0x15, 0x01,
+ 0xef, 0x30, 0x71, 0x10, 0xe0, 0xd4, 0x02, 0x00, 0x00, 0x20, 0x0e, 0xbd,
+ 0xf1, 0x01, 0x0e, 0x50,
+ 0x50, 0x1d, 0x0b, 0x18, 0x2e, 0x03, 0x03, 0x3c, 0x19, 0xf0, 0x11, 0x70,
+ 0x20, 0x00, 0xdf, 0x20,
+ 0x60, 0x0d, 0xeb, 0x00, 0x01, 0x00, 0x20, 0xef, 0xde, 0x30, 0x61, 0x22,
+ 0x32, 0x10, 0x36, 0x63,
+ 0x1e, 0x1c, 0x31, 0x13, 0x0f, 0x04, 0x07, 0x00, 0x4f, 0x2f, 0x0f, 0x8d,
+ 0xee, 0x23, 0x27, 0x00,
+ 0xe0, 0xd0, 0xe1, 0x01, 0x20, 0x1d, 0x01, 0x44, 0x10, 0xcf, 0xf4, 0x02,
+ 0xdb, 0x2f, 0x73, 0x1f,
+ 0x0c, 0xf2, 0xb5, 0xf0, 0x3f, 0x20, 0x00, 0x00, 0xd0, 0xc5, 0x01, 0xdc,
+ 0xae, 0x03, 0x03, 0xf0,
+ 0x00, 0xe0, 0xad, 0xf1, 0x06, 0x00, 0x1f, 0x0d, 0x18, 0x50, 0x02, 0xd1,
+ 0xef, 0xef, 0xde, 0x1f,
+ 0x4e, 0x1c, 0xff, 0xa1, 0xe0, 0x0e, 0x0b, 0x0e, 0x40, 0x30, 0x1f, 0xf0,
+ 0xc1, 0x3c, 0x7a, 0x3e,
+ 0x0f, 0x00, 0xd2, 0x01, 0x60, 0x30, 0x2d, 0x1d, 0x04, 0xc1, 0xeb, 0x0e,
+ 0x00, 0x24, 0x45, 0x01,
+ 0xad, 0xcd, 0xf2, 0x21, 0x4f, 0x1c, 0xfe, 0xd4, 0xd3, 0xdf, 0x00, 0x30,
+ 0x6b, 0x1f, 0xf4, 0xe1,
+ 0xfe, 0x0e, 0xe0, 0x01, 0x32, 0x02, 0x03, 0x1d, 0x08, 0x00, 0xf4, 0xd1,
+ 0x5e, 0x70, 0x15, 0xf2,
+ 0xd0, 0xdf, 0xed, 0x0f, 0x12, 0x01, 0x00, 0xf0, 0x8d, 0xdb, 0x0e, 0x2e,
+ 0x0e, 0xed, 0x0e, 0x40,
+ 0x02, 0xa1, 0xe9, 0x3d, 0x50, 0x02, 0x02, 0x02, 0x10, 0x1e, 0x0c, 0xcd,
+ 0x0f, 0x68, 0x00, 0xd6,
+ 0xc1, 0x0d, 0x0f, 0xf1, 0xf0, 0xf0, 0xe3, 0xe4, 0x02, 0x00, 0xcf, 0xf1,
+ 0x17, 0x41, 0x4f, 0x10,
+ 0x10, 0x5f, 0x00, 0xdf, 0x22, 0x57, 0xf3, 0x00, 0x3c, 0x0e, 0xd2, 0xd2,
+ 0x51, 0x42, 0xf0, 0xed,
+ 0x1e, 0x01, 0xb0, 0x2e, 0x7e, 0x11, 0xf7, 0xe2, 0x12, 0x46, 0x21, 0x00,
+ 0xe3, 0xe0, 0x0e, 0x13,
+ 0x00, 0xe9, 0xef, 0x22, 0x43, 0x03, 0x04, 0x01, 0xd0, 0xd2, 0xc2, 0xd1,
+ 0xb3, 0xd4, 0xe6, 0x63,
+ 0x71, 0x1f, 0xff, 0xef, 0x01, 0x07, 0x02, 0x00, 0x10, 0x30, 0x14, 0x02,
+ 0x00, 0xe0, 0x0f, 0x30,
+ 0x1f, 0xb1, 0xe7, 0xf1, 0xcd, 0xfb, 0x4e, 0x00, 0xe2, 0x02, 0xf0, 0x90,
+ 0xef, 0x5f, 0x5c, 0x0c,
+ 0xee, 0xee, 0x11, 0x13, 0x0d, 0x0c, 0x12, 0x00, 0xe8, 0xf0, 0x01, 0x4e,
+ 0x2c, 0x31, 0x34, 0xe1,
+ 0xf0, 0x20, 0xde, 0x9c, 0xb0, 0xc1, 0x00, 0x32, 0x40, 0x18, 0xdd, 0x8c,
+ 0x0e, 0x11, 0x13, 0x0f,
+ 0xfa, 0xfd, 0x0f, 0x1f, 0x0f, 0xe1, 0x02, 0x0d, 0x09, 0x00, 0x01, 0x2f,
+ 0x7e, 0x30, 0x03, 0xf5,
+ 0xe0, 0x0c, 0x00, 0x02, 0x7f, 0x1e, 0xd0, 0xb3, 0x03, 0x10, 0x0f, 0x0f,
+ 0x0e, 0x2d, 0x0f, 0xd7,
+ 0xe4, 0x10, 0x1d, 0x0e, 0x03, 0x07, 0x02, 0x3f, 0x7d, 0x30, 0xb1, 0xb0,
+ 0x00, 0x2e, 0x0f, 0x02,
+ 0x0e, 0x08, 0x0f, 0xc0, 0xb0, 0x00, 0x5f, 0x1e, 0x00, 0xef, 0xc8, 0xff,
+ 0x13, 0x33, 0x2f, 0x0f,
+ 0xe1, 0xf0, 0xec, 0x0d, 0x30, 0x03, 0xa2, 0x0e, 0x4b, 0x0e, 0xe0, 0xc0,
+ 0xed, 0x1c, 0x1e, 0x00,
+ 0x0e, 0x4e, 0x4f, 0x10, 0xf1, 0xd6, 0x05, 0x00, 0x2e, 0x7f, 0x51, 0x07,
+ 0xe2, 0x00, 0x10, 0x20,
+ 0x2d, 0x0b, 0xf0, 0x11, 0x00, 0xe3, 0x12, 0x2d, 0x9b, 0xce, 0x10, 0x32,
+ 0x12, 0x35, 0x43, 0xf0,
+ 0xcc, 0x0e, 0x00, 0xe0, 0x03, 0x34, 0x20, 0x20, 0xe2, 0x81, 0xfc, 0x1b,
+ 0x0f, 0xe1, 0x02, 0x20,
+ 0x22, 0x06, 0xb1, 0xbf, 0xf1, 0xf3, 0xff, 0x00, 0x07, 0x30, 0x2d, 0xbf,
+ 0xe6, 0x13, 0x11, 0xf0,
+ 0xe0, 0x00, 0x1e, 0xed, 0xe0, 0x05, 0x22, 0x20, 0x10, 0xb0, 0xa0, 0xfe,
+ 0x3d, 0x44, 0x16, 0x30,
+ 0xf0, 0x80, 0xd0, 0xe0, 0xf5, 0x01, 0x1f, 0x51, 0x14, 0xc0, 0xeb, 0x0e,
+ 0x20, 0x10, 0x00, 0x10,
+ 0xf1, 0xc2, 0x00, 0x0c, 0xba, 0xc0, 0xf0, 0x0f, 0x22, 0x47, 0x00, 0xfe,
+ 0xcf, 0xb1, 0xf0, 0x30,
+ 0x20, 0xee, 0x1d, 0x71, 0x13, 0xef, 0xf0, 0x24, 0x13, 0x2e, 0x68, 0x20,
+ 0x03, 0x03, 0x11, 0x30,
+ 0x2b, 0x0d, 0x00, 0x03, 0x63, 0x22, 0x0f, 0x0d, 0x00, 0xf0, 0xfd, 0x30,
+ 0x44, 0x10, 0x22, 0x04,
+ 0x90, 0xeb, 0x1a, 0x1e, 0x01, 0x03, 0x10, 0x4e, 0x01, 0xc0, 0xf8, 0x6f,
+ 0x12, 0xf2, 0xe1, 0x01,
+ 0x30, 0x2d, 0xec, 0xe1, 0x26, 0x03, 0x82, 0xf1, 0xf0, 0xed, 0xec, 0xc0,
+ 0xe4, 0x33, 0x31, 0xc0,
+ 0xbd, 0x0f, 0x01, 0x2f, 0x21, 0xf7, 0x00, 0x3c, 0x00, 0xe4, 0xd0, 0xce,
+ 0x50, 0x42, 0x01, 0x00,
+ 0x0c, 0xdc, 0xa1, 0xf2, 0x0e, 0x2d, 0x1e, 0xdd, 0xad, 0xf3, 0x17, 0x31,
+ 0x3e, 0x0c, 0xfe, 0x22,
+ 0x36, 0xf0, 0x0e, 0xff, 0x81, 0xf0, 0x4b, 0x4e, 0x01, 0xe2, 0xef, 0x0e,
+ 0x00, 0xf2, 0x0f, 0x2d,
+ 0x42, 0x11, 0xfd, 0xff, 0xe4, 0x03, 0x70, 0x39, 0x0e, 0xc1, 0xcf, 0x0e,
+ 0x40, 0x2e, 0x09, 0xfd,
+ 0xdd, 0xc0, 0x07, 0xe1, 0xbe, 0xed, 0xf1, 0x12, 0x3c, 0xea, 0xa0, 0xf2,
+ 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0xf1, 0xf2, 0x00, 0xfe, 0xda, 0x0f, 0x14, 0x44, 0x60, 0xff, 0xbf,
+ 0xf0, 0x10, 0x23, 0x25,
+ 0x00, 0x9d, 0x01, 0x23, 0x00, 0xff, 0x01, 0x01, 0x0f, 0x2d, 0x2e, 0x05,
+ 0xa3, 0xbf, 0xf0, 0x23,
+ 0x2f, 0xee, 0xdd, 0x08, 0x2c, 0x30, 0x1f, 0xfe, 0x04, 0xf5, 0x90, 0xff,
+ 0x11, 0x12, 0x3e, 0x6e,
+ 0x04, 0x03, 0x00, 0x00, 0x1c, 0x69, 0x1f, 0xf3, 0xd5, 0xe1, 0x00, 0x0e,
+ 0xfd, 0xd1, 0x14, 0x23,
+ 0x00, 0x0c, 0x4b, 0x30, 0xe0, 0x20, 0x70, 0x50, 0x0b, 0xeb, 0x00, 0x01,
+ 0x01, 0x30, 0x70, 0x10,
+ 0xd0, 0xc0, 0x10, 0x20, 0x10, 0x31, 0x02, 0xac, 0xfc, 0x01, 0x00, 0x04,
+ 0x38, 0x00, 0x7e, 0x00,
+ 0x41, 0x00, 0x04, 0x01, 0xf6, 0x00, 0x6c, 0x00, 0xb2, 0xdd, 0x0a, 0x60,
+ 0x01, 0xe0, 0x10, 0x61,
+ 0x00, 0xe1, 0xf3, 0x00, 0x1c, 0x7d, 0x01, 0xc2, 0x0c, 0x1e, 0x20, 0xe6,
+ 0xe2, 0x02, 0x31, 0x0b,
+ 0xfb, 0x10, 0x02, 0xc0, 0x00, 0xf1, 0x20, 0x70, 0x01, 0x00, 0xf0, 0xb0,
+ 0x2e, 0x33, 0xd2, 0xcc,
+ 0x1f, 0x4c, 0x0b, 0xe4, 0xf5, 0xef, 0x1e, 0x11, 0x00, 0x4f, 0x0e, 0xc4,
+ 0x31, 0x2c, 0xaf, 0x01,
+ 0x34, 0x24, 0xef, 0xdb, 0x0f, 0x30, 0x02, 0xd3, 0xe0, 0x0a, 0x51, 0xe4,
+ 0xbf, 0x0d, 0x2f, 0x2f,
+ 0x51, 0xf4, 0x90, 0x0f, 0x30, 0x02, 0xe0, 0x1b, 0x0f, 0xd0, 0x52, 0x23,
+ 0xe0, 0xcf, 0x25, 0x10,
+ 0xca, 0x0f, 0x31, 0x11, 0xf1, 0xf0, 0xee, 0xc0, 0xf5, 0x7f, 0x3b, 0xf1,
+ 0xb0, 0x0e, 0x31, 0x06,
+ 0xc0, 0xff, 0x20, 0x31, 0x00, 0xfe, 0x0d, 0x01, 0xe4, 0xd2, 0x20, 0x6d,
+ 0xef, 0xd0, 0x2b, 0x40,
+ 0xf7, 0xf0, 0xed, 0xd2, 0x46, 0x6f, 0x0d, 0xf0, 0xe0, 0x10, 0x33, 0x02,
+ 0xdf, 0xeb, 0x0f, 0x12,
+ 0x22, 0x3f, 0x30, 0xdf, 0x8e, 0xc3, 0x24, 0x4e, 0x1e, 0x0f, 0xdf, 0xe1,
+ 0xf2, 0x1c, 0x1f, 0x16,
+ 0x11, 0x00, 0x00, 0x1f, 0x38, 0x3f, 0x82, 0xf3, 0x20, 0x0d, 0xf0, 0x03,
+ 0xee, 0x2c, 0x71, 0xe0,
+ 0xef, 0x32, 0xe2, 0x94, 0x33, 0x4a, 0xec, 0xe0, 0x01, 0x22, 0xf0, 0xb4,
+ 0xf1, 0x2d, 0x6b, 0x01,
+ 0xe4, 0xff, 0x0d, 0x01, 0x05, 0x00, 0x0e, 0x0f, 0xe0, 0xf0, 0x7f, 0x25,
+ 0xc0, 0xea, 0x20, 0x24,
+ 0xf1, 0x0e, 0x1e, 0xde, 0xf1, 0x75, 0x01, 0xf0, 0xef, 0xfd, 0x1f, 0x32,
+ 0x21, 0x0e, 0xc0, 0xe2,
+ 0x00, 0x42, 0x10, 0xf8, 0xcf, 0x02, 0xf2, 0xd1, 0x70, 0x3e, 0xe0, 0x01,
+ 0xfe, 0xdf, 0xf6, 0x2f,
+ 0x3e, 0xd3, 0x21, 0x69, 0xe0, 0xe1, 0x40, 0x00, 0xc2, 0xe0, 0x2e, 0x1f,
+ 0xdd, 0x60, 0x41, 0xe0,
+ 0xd2, 0x0f, 0xe0, 0x04, 0x2f, 0x3a, 0xde, 0xe3, 0x76, 0x00, 0x00, 0x00,
+ 0xeb, 0xc0, 0x03, 0x40,
+ 0x0d, 0xb0, 0x02, 0x0f, 0x0c, 0x5f, 0x17, 0xd2, 0xfe, 0x2d, 0x23, 0x02,
+ 0x0d, 0xed, 0xe0, 0x04,
+ 0x75, 0x0f, 0xbc, 0x02, 0x21, 0x2c, 0x00, 0x03, 0xb0, 0xdf, 0x30, 0x54,
+ 0x1f, 0xfd, 0xed, 0xe0,
+ 0x24, 0x23, 0xdf, 0x0d, 0x12, 0x01, 0xe8, 0xff, 0x75, 0x12, 0xdd, 0xbc,
+ 0x01, 0x23, 0x23, 0x13,
+ 0xfc, 0xeb, 0x10, 0x41, 0xc0, 0x91, 0x12, 0x5e, 0x0d, 0xf0, 0xf2, 0x03,
+ 0x2f, 0x0c, 0xd0, 0x03,
+ 0x2a, 0x00, 0xf4, 0x00, 0x1d, 0x00, 0xa1, 0x00, 0x33, 0x2f, 0xf8, 0xdd,
+ 0x01, 0x26, 0x10, 0xcf,
+ 0x20, 0x30, 0xef, 0xd0, 0x42, 0x2d, 0x0e, 0x40, 0xef, 0x87, 0xe5, 0x3f,
+ 0x2d, 0xef, 0x00, 0x22,
+ 0xe2, 0x0e, 0x3f, 0xc1, 0xbd, 0x4e, 0x47, 0xe1, 0xed, 0x12, 0xe4, 0xbf,
+ 0x2b, 0x50, 0x04, 0xd0,
+ 0x0e, 0x1f, 0x30, 0x13, 0xd1, 0xe0, 0x0e, 0x5c, 0x30, 0xb2, 0xf4, 0x10,
+ 0x2f, 0x00, 0xfe, 0xed,
+ 0x03, 0x37, 0x1e, 0xed, 0xb0, 0x03, 0xf1, 0x0f, 0x3b, 0xf2, 0xc7, 0x20,
+ 0x1e, 0xcf, 0x01, 0x73,
+ 0x20, 0xf0, 0xb0, 0xe8, 0x1e, 0x42, 0x07, 0xd0, 0x0f, 0x5f, 0x0f, 0xe0,
+ 0xf1, 0x02, 0x1f, 0x0f,
+ 0xff, 0xf0, 0x30, 0x10, 0xc1, 0xe1, 0xfd, 0x38, 0x71, 0x06, 0xd0, 0x2e,
+ 0x3f, 0xe0, 0x82, 0x00,
+ 0x2f, 0x3f, 0xff, 0xc2, 0x03, 0x0e, 0x0c, 0x00, 0x30, 0x02, 0xc2, 0xe0,
+ 0x4c, 0x4d, 0xc1, 0xc7,
+ 0x20, 0x4e, 0xef, 0xff, 0x43, 0x05, 0xd0, 0xdc, 0x0f, 0x22, 0x20, 0x4e,
+ 0x3e, 0xb0, 0xa3, 0x17,
+ 0x40, 0xfe, 0xfe, 0xf0, 0x0f, 0x10, 0x05, 0xf1, 0x2d, 0x4d, 0x04, 0xc2,
+ 0x0e, 0x1f, 0xd0, 0x04,
+ 0x72, 0x0d, 0xe8, 0xc0, 0x02, 0x30, 0x3f, 0x01, 0xf1, 0x0e, 0xde, 0xd1,
+ 0x12, 0x20, 0x50, 0x00,
+ 0xd2, 0x01, 0x63, 0x01, 0xfc, 0xf9, 0x00, 0xd2, 0xcf, 0x40, 0x63, 0x0f,
+ 0xec, 0xf2, 0x01, 0x1f,
+ 0x1d, 0xeb, 0xdf, 0x05, 0x54, 0x10, 0x0d, 0x01, 0xd3, 0xe0, 0x48, 0x1f,
+ 0xe1, 0x33, 0x20, 0xe0,
+ 0xe1, 0xf0, 0xac, 0xde, 0x52, 0x43, 0x0f, 0xdc, 0xf0, 0x02, 0x22, 0x23,
+ 0xbf, 0xbc, 0x2d, 0x69,
+ 0x00, 0xf3, 0xe2, 0x0e, 0x00, 0x11, 0x01, 0x00, 0x0c, 0xed, 0xf2, 0x17,
+ 0x50, 0x0c, 0xed, 0xf4,
+ 0x33, 0x3f, 0x80, 0x01, 0x2c, 0x0f, 0xe7, 0x11, 0x0e, 0x0e, 0x2d, 0xe2,
+ 0xb3, 0x24, 0x41, 0x00,
+ 0xda, 0xf0, 0x12, 0x10, 0x0d, 0x00, 0x02, 0x02, 0xc1, 0xbf, 0x2a, 0x60,
+ 0x02, 0xe0, 0x0f, 0x1c,
+ 0x00, 0xf4, 0x03, 0xef, 0xfd, 0x20, 0x10, 0x3d, 0x50, 0xd6, 0xa2, 0x0c,
+ 0x1c, 0x05, 0xf3, 0x2e,
+ 0x4d, 0x10, 0xe0, 0xe0, 0x00, 0xf0, 0x03, 0x30, 0x8b, 0xdf, 0x50, 0x31,
+ 0xe2, 0xe2, 0x01, 0xf0,
+ 0x0b, 0x3d, 0x04, 0xc2, 0xfe, 0x11, 0x14, 0x1e, 0x3e, 0x04, 0xd1, 0x09,
+ 0x1d, 0x03, 0x94, 0x1e,
+ 0x7d, 0x04, 0xe2, 0xfe, 0x0b, 0x20, 0xe0, 0x04, 0x71, 0x0f, 0xc0, 0xf0,
+ 0x1d, 0x2f, 0x05, 0x11,
+ 0x10, 0xe0, 0xff, 0x1c, 0xe2, 0xf3, 0x0e, 0x1e, 0x00, 0x24, 0x70, 0xfb,
+ 0x90, 0xe5, 0x20, 0x3f,
+ 0x00, 0xf0, 0xfd, 0xf0, 0x24, 0x60, 0xf0, 0xb0, 0x00, 0x20, 0x10, 0x0a,
+ 0xf0, 0xf7, 0x4f, 0x2e,
+ 0xa1, 0xf0, 0x1f, 0x1f, 0x01, 0x03, 0x20, 0x0c, 0xdf, 0xe1, 0x13, 0x12,
+ 0x02, 0x0d, 0x48, 0x51,
+ 0xe4, 0xaf, 0x0d, 0x10, 0x22, 0x01, 0x2f, 0x0e, 0xc0, 0xe4, 0x11, 0x2f,
+ 0xd0, 0xf0, 0x7d, 0x19,
+ 0xd3, 0xe4, 0x1e, 0x3f, 0x0e, 0x10, 0xe7, 0xe0, 0x3e, 0x0f, 0xc1, 0x22,
+ 0xfb, 0x80, 0x13, 0x51,
+ 0x0d, 0xdd, 0xf4, 0x33, 0x1c, 0x0d, 0xf2, 0x04, 0x0e, 0x3c, 0x12, 0x92,
+ 0xf0, 0x2f, 0x2c, 0x0e,
+ 0xf4, 0xf6, 0x00, 0x1c, 0x0f, 0xf2, 0x00, 0xff, 0xb0, 0xc1, 0x20, 0x5e,
+ 0xff, 0xf2, 0x02, 0x0e,
+ 0x1f, 0x14, 0xef, 0xc8, 0x01, 0x23, 0x3f, 0x0c, 0xd0, 0x01, 0x62, 0x00,
+ 0xbd, 0xfc, 0x23, 0x27,
+ 0x10, 0x0e, 0x90, 0x01, 0x40, 0x0f, 0xf0, 0xe1, 0x00, 0x3e, 0x2b, 0xd4,
+ 0xe6, 0x00, 0x2d, 0xde,
+ 0x00, 0x63, 0xf1, 0x10, 0x3e, 0x8f, 0xef, 0x20, 0x23, 0xe5, 0x1d, 0x7e,
+ 0x00, 0xc2, 0x00, 0x1d,
+ 0xe7, 0xf2, 0x4d, 0x2e, 0xd2, 0xf3, 0x1f, 0x1e, 0x0f, 0xf0, 0xe1, 0x1e,
+ 0xf2, 0xc4, 0x69, 0x1f,
+ 0xe4, 0x00, 0x2a, 0xf0, 0xe3, 0xf1, 0x21, 0x3f, 0xbc, 0x00, 0x20, 0xea,
+ 0xb0, 0x36, 0x71, 0x0f,
+ 0xef, 0xff, 0x00, 0xf0, 0x02, 0x74, 0x20, 0xfe, 0xcd, 0xf1, 0x1f, 0x2e,
+ 0xf5, 0xe0, 0x10, 0x10,
+ 0x01, 0x0f, 0xfc, 0x10, 0x21, 0xe1, 0xfd, 0x00, 0x77, 0x63, 0xee, 0xcb,
+ 0x00, 0x31, 0x01, 0xce,
+ 0x00, 0x34, 0x00, 0x0d, 0x02, 0xe4, 0xcd, 0xfc, 0x5f, 0x31, 0xd1, 0xe0,
+ 0x21, 0x05, 0xf0, 0x1d,
+ 0x3d, 0xf1, 0xe3, 0x41, 0x76, 0x02, 0xbe, 0xd9, 0x0f, 0x31, 0x21, 0x12,
+ 0xf0, 0x0e, 0x00, 0xe3,
+ 0xe0, 0xdc, 0xfe, 0x20, 0x50, 0x21, 0x02, 0xee, 0x00, 0x06, 0xe0, 0x2f,
+ 0x2f, 0x80, 0x0c, 0x4f,
+ 0x15, 0xe3, 0xce, 0xdc, 0x3f, 0x70, 0x02, 0xf1, 0xeb, 0xff, 0x05, 0x31,
+ 0x40, 0x00, 0xaf, 0xfd,
+ 0x0e, 0x40, 0x07, 0xf1, 0xff, 0x00, 0x00, 0x0d, 0xfc, 0x01, 0xf3, 0x04,
+ 0x73, 0x2b, 0xec, 0xc0,
+ 0xf2, 0x32, 0x30, 0xdf, 0x0c, 0x10, 0x04, 0xf0, 0x0f, 0xff, 0xd1, 0x82,
+ 0xeb, 0x7f, 0x35, 0xe0,
+ 0xce, 0x11, 0x20, 0xfe, 0xd0, 0x1f, 0x41, 0x05, 0xf0, 0x0b, 0xef, 0xc2,
+ 0x21, 0x4e, 0xee, 0xde,
+ 0x45, 0x54, 0x00, 0xec, 0xe0, 0x04, 0x11, 0x0e, 0xef, 0x10, 0x50, 0xfe,
+ 0xe3, 0x24, 0x1e, 0xbc,
+ 0x01, 0x20, 0x0e, 0x12, 0xf1, 0xd1, 0x25, 0x5f, 0xb9, 0xe0, 0x31, 0x10,
+ 0x01, 0x01, 0x0f, 0x00,
+ 0x00, 0xae, 0x1f, 0x21, 0x00, 0x02, 0x37, 0x00, 0xcd, 0x00, 0xf0, 0xd0,
+ 0x50, 0x4d, 0xf3, 0xf7,
+ 0x04, 0xca, 0x0f, 0x31, 0x02, 0xb0, 0x20, 0x60, 0xff, 0xd1, 0x00, 0x2f,
+ 0x0f, 0xf2, 0x67, 0x00,
+ 0xcc, 0xff, 0x34, 0x10, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xd0, 0x00, 0x51,
+ 0x0f, 0xfc, 0xf2, 0x16,
+ 0xff, 0xdd, 0x22, 0x60, 0xfe, 0xbe, 0x12, 0x36, 0xee, 0xfd, 0x23, 0xf3,
+ 0xcc, 0x1e, 0x76, 0x01,
+ 0xed, 0xdb, 0x11, 0x43, 0xf0, 0x00, 0x1f, 0x0b, 0xff, 0xe1, 0xf4, 0x13,
+ 0x00, 0xec, 0x2d, 0x10,
+ 0xc4, 0x22, 0x4d, 0x9e, 0xf2, 0x41, 0x01, 0xe0, 0x0e, 0x4e, 0x03, 0xf4,
+ 0x0c, 0xcd, 0xf2, 0x03,
+ 0x4e, 0x29, 0xf1, 0xe5, 0xef, 0xeb, 0x00, 0xf2, 0x73, 0x02, 0xad, 0xdc,
+ 0x63, 0x46, 0x00, 0xff,
+ 0xef, 0x00, 0x13, 0xdd, 0xc9, 0x0f, 0x20, 0x22, 0x23, 0x01, 0x73, 0x33,
+ 0x0e, 0xb8, 0xee, 0x00,
+ 0x22, 0x32, 0x12, 0xef, 0x88, 0xdd, 0x0f, 0x54, 0x34, 0x00, 0xff, 0xf0,
+ 0xee, 0xfe, 0x00, 0x01,
+ 0x03, 0x12, 0x00, 0x1f, 0x20, 0x20, 0x0e, 0xca, 0x8c, 0xcb, 0x20, 0x75,
+ 0x00, 0xee, 0x00, 0x01,
+ 0x00, 0x1f, 0x01, 0x02, 0xff, 0x00, 0x16, 0x11, 0xef, 0xbe, 0xf0, 0x02,
+ 0x02, 0xf0, 0x00, 0xfc,
+ 0x2f, 0x42, 0x04, 0xc0, 0xdc, 0x0e, 0x75, 0x35, 0x00, 0xff, 0xff, 0x00,
+ 0x20, 0x0f, 0xdd, 0xfe,
+ 0x75, 0x74, 0x00, 0xfe, 0xfe, 0xff, 0x00, 0xf1, 0x00, 0x00, 0x11, 0x01,
+ 0x01, 0x23, 0x14, 0x0f,
+ 0xb9, 0x00, 0x34, 0x10, 0xcc, 0xef, 0x00, 0x00, 0x31, 0x13, 0xcd, 0xca,
+ 0x0f, 0x20, 0x21, 0x00,
+ 0xff, 0xdd, 0x8b, 0x00, 0x21, 0xf0, 0xf1, 0x14, 0x11, 0x10, 0x0d, 0xea,
+ 0x10, 0x75, 0x21, 0xf0,
+ 0xe1, 0xc0, 0xee, 0x00, 0xf0, 0xbf, 0x02, 0x32, 0x1e, 0x13, 0x24, 0x00,
+ 0xcd, 0xa8, 0xee, 0x53,
+ 0x22, 0x0e, 0x0f, 0x23, 0x10, 0xe9, 0xcd, 0x1e, 0x51, 0x23, 0x01, 0xef,
+ 0xf0, 0x00, 0x43, 0x24,
+ 0xde, 0xba, 0x00, 0x17, 0x01, 0xcf, 0xe0, 0x11, 0x01, 0x02, 0xe1, 0xe0,
+ 0x00, 0x10, 0x60, 0x22,
+ 0x00, 0x12, 0x44, 0xfc, 0x0f, 0x33, 0xfd, 0xdb, 0x74, 0x53, 0x0f, 0xff,
+ 0xd9, 0x00, 0x31, 0x00,
+ 0x20, 0x23, 0xce, 0xdd, 0x20, 0x30, 0xd9, 0x00, 0x22, 0x01, 0x22, 0x40,
+ 0xee, 0xbe, 0xbc, 0xcb,
+ 0x10, 0x44, 0xf0, 0xee, 0x0e, 0x0f, 0x0e, 0xfe, 0xf0, 0xdd, 0xee, 0x12,
+ 0xf2, 0x8a, 0xc9, 0x20,
+ 0x76, 0x00, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x20, 0x11, 0x02, 0xf0, 0xd0,
+ 0x01, 0x02, 0xe0, 0xff,
+ 0x75, 0x13, 0xcf, 0xef, 0x01, 0x34, 0xfe, 0xff, 0x45, 0x01, 0xe0, 0x02,
+ 0x22, 0xfc, 0x99, 0x10,
+ 0x63, 0x01, 0xfd, 0x0f, 0x21, 0x10, 0x1f, 0x10, 0xfe, 0x00, 0x47, 0x01,
+ 0x00, 0x01, 0xcf, 0xce,
+ 0x03, 0x15, 0xf0, 0xd0, 0xd0, 0x00, 0x32, 0x41, 0x0f, 0x0e, 0x11, 0x02,
+ 0x31, 0x1d, 0x09, 0x60,
+ 0x00, 0xdf, 0x0f, 0x1e, 0x1e, 0x32, 0x30, 0xca, 0x89, 0xf0, 0x00, 0x00,
+ 0x1e, 0x0f, 0x10, 0x20,
+ 0xfd, 0xca, 0x51, 0x44, 0xff, 0xee, 0x00, 0x00, 0x21, 0x0f, 0xbc, 0xff,
+ 0x00, 0x01, 0x0f, 0x0f,
+ 0x0f, 0xfd, 0x0f, 0xbe, 0xaa, 0xff, 0x00, 0x20, 0xfd, 0xdd, 0x02, 0xf5,
+ 0x00, 0x0d, 0x1d, 0x71,
+ 0x24, 0x00, 0xdf, 0xf0, 0x27, 0x76, 0x00, 0xde, 0x01, 0x02, 0xf1, 0xf1,
+ 0x12, 0x00, 0xdf, 0xce,
+ 0x16, 0x23, 0xc0, 0xe0, 0x64, 0x23, 0xee, 0xee, 0x13, 0x23, 0x0f, 0xca,
+ 0x10, 0x74, 0x10, 0x0d,
+ 0x10, 0x10, 0x10, 0x55, 0x31, 0x0e, 0x0e, 0x00, 0x06, 0x01, 0xe0, 0xd0,
+ 0x03, 0xd1, 0xc0, 0xc0,
+ 0xf1, 0x25, 0x10, 0x0f, 0x10, 0x20, 0x74, 0x22, 0x0f, 0x10, 0x33, 0x0d,
+ 0x0d, 0x52, 0x0e, 0xe8,
+ 0x11, 0x31, 0xe0, 0xdd, 0x2f, 0x72, 0x0e, 0xa8, 0xfe, 0x0f, 0x21, 0x10,
+ 0xec, 0x00, 0x62, 0x12,
+ 0x0d, 0xed, 0x00, 0x00, 0x0f, 0x0e, 0x1d, 0x0d, 0xff, 0xd0, 0x06, 0x13,
+ 0x99, 0xdc, 0x00, 0x00,
+ 0xf1, 0xd1, 0xb0, 0xef, 0xdc, 0xfe, 0x30, 0x00, 0xe0, 0xdf, 0xdd, 0x0d,
+ 0x60, 0x20, 0x0e, 0x07,
+ 0xf4, 0x9f, 0x00, 0x01, 0xdf, 0x01, 0x24, 0xef, 0xd0, 0xf5, 0xc0, 0x12,
+ 0x23, 0xce, 0x01, 0x47,
+ 0x14, 0xe0, 0xd0, 0xe0, 0x41, 0x31, 0x01, 0x33, 0xdf, 0x8a, 0x10, 0x74,
+ 0x0f, 0x0d, 0x30, 0x21,
+ 0x0f, 0x21, 0x37, 0x10, 0xd0, 0xde, 0x01, 0x14, 0xe0, 0x8f, 0xf0, 0x02,
+ 0xfe, 0xec, 0x67, 0x23,
+ 0x0f, 0xde, 0xff, 0x34, 0x21, 0xce, 0x10, 0x31, 0x00, 0xed, 0x00, 0x01,
+ 0x00, 0xba, 0x0e, 0x61,
+ 0x00, 0xc9, 0xfe, 0x11, 0x32, 0x0e, 0xfd, 0x20, 0x0f, 0xff, 0x00, 0x41,
+ 0xd9, 0x0f, 0x72, 0x10,
+ 0xec, 0x00, 0x01, 0x00, 0x0e, 0x20, 0x00, 0xbd, 0xed, 0xfc, 0xee, 0x35,
+ 0x32, 0x8c, 0xed, 0x01,
+ 0x0f, 0xcc, 0x10, 0x23, 0x0f, 0x0e, 0x0b, 0xdd, 0x10, 0x66, 0x0f, 0xff,
+ 0x34, 0x12, 0xbd, 0xed,
+ 0x11, 0x14, 0xef, 0xf0, 0x02, 0x01, 0xd0, 0xf2, 0x57, 0x22, 0xcf, 0xde,
+ 0x01, 0x01, 0x15, 0x42,
+ 0xbe, 0xee, 0x22, 0x44, 0x00, 0xcd, 0xed, 0x0f, 0x77, 0x32, 0x0f, 0x0e,
+ 0x00, 0x24, 0x00, 0x0f,
+ 0x22, 0x22, 0xe0, 0xf1, 0xf0, 0xe0, 0x11, 0x01, 0xce, 0x01, 0x57, 0x02,
+ 0xee, 0x31, 0x31, 0x13,
+ 0x57, 0x00, 0xdf, 0x20, 0x41, 0x0f, 0x00, 0x44, 0xf0, 0xdf, 0xdd, 0x0e,
+ 0x2d, 0xd9, 0xbf, 0x21,
+ 0x00, 0xed, 0x2f, 0x1d, 0xfb, 0x10, 0x71, 0x10, 0x20, 0x30, 0xdd, 0x0f,
+ 0x0d, 0xdb, 0x31, 0x52,
+ 0xed, 0xeb, 0x74, 0x74, 0xfe, 0xc9, 0xff, 0x22, 0x12, 0xef, 0xdd, 0x00,
+ 0x00, 0x01, 0x11, 0xdc,
+ 0xcd, 0x31, 0x63, 0x0f, 0xeb, 0x11, 0x34, 0x00, 0xf0, 0xf0, 0x00, 0x02,
+ 0xad, 0xee, 0x06, 0x33,
+ 0xd0, 0xef, 0x02, 0xf2, 0xe3, 0x04, 0x02, 0x02, 0xf2, 0x80, 0xde, 0x17,
+ 0x24, 0xbf, 0xce, 0x00,
+ 0x24, 0x01, 0xed, 0xff, 0x31, 0x30, 0xfc, 0x10, 0x30, 0x22, 0x75, 0x12,
+ 0x10, 0x00, 0x00, 0xcc,
+ 0xe0, 0xe1, 0x03, 0xf0, 0xcb, 0x11, 0x36, 0x02, 0x00, 0xae, 0xdc, 0x52,
+ 0x34, 0x00, 0x11, 0x55,
+ 0xfe, 0xdd, 0x11, 0x44, 0xff, 0xcc, 0x00, 0x0f, 0xfd, 0x10, 0x20, 0xdb,
+ 0xff, 0x41, 0x10, 0xfb,
+ 0xfe, 0x60, 0x53, 0x00, 0xeb, 0x00, 0x00, 0xfe, 0x0f, 0x40, 0x32, 0x43,
+ 0xfe, 0xdb, 0x10, 0x30,
+ 0x10, 0x0f, 0x33, 0xe0, 0x9c, 0xe0, 0xf0, 0x0e, 0xeb, 0x00, 0x31, 0xdd,
+ 0xab, 0x00, 0x43, 0x30,
+ 0x10, 0x11, 0x00, 0xcc, 0x01, 0x37, 0x00, 0xac, 0x01, 0x23, 0xf0, 0xd0,
+ 0xf1, 0xf2, 0xd0, 0xf0,
+ 0x36, 0x01, 0xe0, 0xd0, 0xe2, 0x26, 0xf1, 0x8f, 0xe1, 0x03, 0xe0, 0x01,
+ 0x11, 0x8b, 0xdc, 0x11,
+ 0x44, 0x0f, 0x2f, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x44, 0x00, 0xba, 0x00,
+ 0x33, 0xf0, 0xaf, 0x01,
+ 0x35, 0x00, 0xed, 0xde, 0x01, 0x45, 0x43, 0x00, 0xfe, 0x0e, 0x42, 0xf0,
+ 0x00, 0x24, 0x00, 0xff,
+ 0xfd, 0x0d, 0x30, 0xfd, 0x9a, 0x00, 0x10, 0xfb, 0x0e, 0x72, 0x33, 0xea,
+ 0xdd, 0xed, 0x32, 0x53,
+ 0x0f, 0xec, 0xfe, 0x20, 0x31, 0x43, 0x00, 0x0d, 0x20, 0x0e, 0x0d, 0x35,
+ 0x01, 0xac, 0xff, 0x00,
+ 0x14, 0x03, 0x9b, 0xdc, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0xff, 0xfe, 0x31,
+ 0x65, 0x00, 0x00, 0x0f,
+ 0xdb, 0xf0, 0x66, 0xff, 0xab, 0x11, 0x24, 0xf0, 0xce, 0x00, 0x04, 0x04,
+ 0x1a, 0x03, 0x68, 0x01,
+ 0x1e, 0x09, 0x3e, 0x16, 0xb1, 0xef, 0xaf, 0xfd, 0x17, 0xc0, 0xaf, 0xcd,
+ 0xf5, 0x47, 0x14, 0xdf,
+ 0x00, 0x01, 0xc0, 0xbe, 0x00, 0x12, 0x0f, 0x00, 0x00, 0xfe, 0x46, 0x11,
+ 0xfe, 0x00, 0x74, 0x00,
+ 0xec, 0xfe, 0x02, 0x13, 0x01, 0x23, 0xf0, 0xbc, 0xee, 0x00, 0x37, 0x11,
+ 0xef, 0xe0, 0xf0, 0x12,
+ 0x75, 0x11, 0x00, 0xfe, 0x00, 0x34, 0x00, 0xcc, 0x11, 0x22, 0xdd, 0x0e,
+ 0x54, 0xec, 0xcd, 0x0f,
+ 0x0e, 0x1e, 0x40, 0x1f, 0xfa, 0x0f, 0x32, 0x32, 0xdd, 0x88, 0xee, 0x41,
+ 0x32, 0x31, 0x00, 0xfd,
+ 0xdd, 0x10, 0x50, 0x22, 0x22, 0x01, 0x01, 0xed, 0xdb, 0xcd, 0x00, 0x01,
+ 0xfe, 0x98, 0xfe, 0x21,
+ 0x00, 0x00, 0x21, 0x20, 0x0e, 0xec, 0x20, 0x72, 0x13, 0x0f, 0xff, 0x0f,
+ 0xdc, 0xfe, 0x33, 0x27,
+ 0xd0, 0xbf, 0x00, 0x22, 0xf0, 0x13, 0x47, 0xb0, 0xd0, 0x04, 0x23, 0xf0,
+ 0xb0, 0x01, 0xd0, 0xad,
+ 0xdc, 0x03, 0x46, 0x00, 0x00, 0x31, 0xee, 0xdd, 0x00, 0x10, 0x53, 0x47,
+ 0x00, 0xdd, 0xdf, 0xe0,
+ 0x01, 0x23, 0x23, 0xe0, 0xbe, 0xfe, 0xe0, 0xf4, 0xf3, 0xef, 0x12, 0x77,
+ 0x23, 0xfe, 0xdc, 0x12,
+ 0x45, 0x21, 0x21, 0x00, 0xcd, 0xde, 0xdd, 0x24, 0x75, 0x0e, 0xed, 0x0f,
+ 0x32, 0x00, 0xc8, 0xef,
+ 0x0f, 0x40, 0x00, 0xd0, 0x00, 0x30, 0x74, 0x20, 0xfb, 0xef, 0x0f, 0x31,
+ 0x30, 0x51, 0x21, 0x00,
+ 0x10, 0x0e, 0xf0, 0x14, 0xfe, 0xcc, 0x11, 0x0f, 0x88, 0xef, 0x22, 0x32,
+ 0xed, 0xfe, 0x0e, 0x42,
+ 0x56, 0x0f, 0xdd, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0xef, 0x00, 0x01,
+ 0xdf, 0x9a, 0x00, 0x57,
+ 0x22, 0x00, 0xe0, 0xe0, 0x12, 0x35, 0xf0, 0xb0, 0xef, 0xd0, 0xf0, 0x13,
+ 0x12, 0xcf, 0xef, 0xff,
+ 0x31, 0x42, 0xfd, 0x10, 0x32, 0xfe, 0xcc, 0x11, 0x33, 0x45, 0x00, 0xc0,
+ 0xe0, 0x03, 0xbe, 0xb9,
+ 0x02, 0x23, 0x01, 0xf0, 0xdf, 0xf3, 0x37, 0x42, 0x20, 0x10, 0xfe, 0xf1,
+ 0x57, 0x11, 0xcf, 0xde,
+ 0x20, 0x00, 0xce, 0x00, 0x24, 0x41, 0x0f, 0x98, 0xed, 0x10, 0x20, 0x31,
+ 0x11, 0x00, 0xfd, 0xbb,
+ 0xff, 0x10, 0x10, 0x0d, 0x60, 0x22, 0xfc, 0xfe, 0x20, 0x10, 0x0c, 0x20,
+ 0x76, 0x10, 0xee, 0xff,
+ 0xff, 0xff, 0x00, 0xcc, 0xff, 0x00, 0xcf, 0x0f, 0x00, 0x2e, 0x0b, 0x2f,
+ 0x31, 0x01, 0xfe, 0xaa,
+ 0x00, 0x76, 0x10, 0xed, 0xee, 0x01, 0x00, 0xee, 0x01, 0x22, 0x01, 0x01,
+ 0x03, 0x06, 0x76, 0x01,
+ 0xd0, 0xef, 0xe0, 0xf2, 0xe0, 0xf3, 0xe2, 0x90, 0x02, 0x02, 0xed, 0xec,
+ 0x46, 0x22, 0xff, 0xee,
+ 0x30, 0x52, 0x00, 0xff, 0x23, 0x47, 0xf0, 0xac, 0x00, 0x21, 0x00, 0xbe,
+ 0x01, 0x02, 0x00, 0xf0,
+ 0x00, 0x17, 0x63, 0x00, 0xfe, 0x0f, 0x33, 0x25, 0x00, 0x00, 0xf1, 0xf0,
+ 0x00, 0x21, 0x00, 0x00,
+ 0xfc, 0xce, 0x30, 0x2e, 0x4e, 0x40, 0xd8, 0xcd, 0x00, 0x00, 0x11, 0x72,
+ 0x0e, 0xfa, 0x0f, 0xfe,
+ 0x0d, 0x72, 0x21, 0x0e, 0x33, 0x44, 0xfc, 0xea, 0x00, 0x41, 0x01, 0xff,
+ 0x0f, 0xde, 0xce, 0xfe,
+ 0xef, 0xf0, 0x02, 0xfd, 0xb9, 0xdd, 0x52, 0x44, 0xec, 0xee, 0x13, 0x22,
+ 0x00, 0x0e, 0xfd, 0xfe,
+ 0x21, 0xf0, 0x88, 0xee, 0x02, 0x56, 0x21, 0xff, 0xff, 0x02, 0x01, 0xb0,
+ 0x14, 0x23, 0x00, 0x01,
+ 0xd0, 0xc0, 0x03, 0x06, 0xe0, 0xd0, 0x00, 0x30, 0x40, 0x23, 0x02, 0x00,
+ 0x1f, 0x0e, 0x63, 0x45,
+ 0x0d, 0xff, 0x13, 0x02, 0x0f, 0xfe, 0xde, 0xb9, 0x00, 0x47, 0x21, 0xe0,
+ 0xbe, 0xf0, 0x31, 0x31,
+ 0x32, 0x55, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x55, 0x22, 0xff, 0xdc,
+ 0x00, 0x41, 0xcc, 0xdc,
+ 0x40, 0x53, 0x00, 0xec, 0xcd, 0xfd, 0x11, 0x20, 0xfb, 0x00, 0x20, 0x00,
+ 0x0f, 0x30, 0x0d, 0x0a,
+ 0x70, 0x43, 0x0e, 0x0e, 0x0f, 0xee, 0x11, 0x20, 0xc8, 0xef, 0x21, 0xe0,
+ 0x8d, 0xfe, 0xee, 0x00,
+ 0x20, 0x1e, 0x01, 0x00, 0xde, 0xda, 0x0f, 0x42, 0x32, 0x0f, 0xdc, 0xac,
+ 0xff, 0x00, 0x21, 0x55,
+ 0xff, 0xcd, 0x00, 0x04, 0x01, 0x13, 0x24, 0xf0, 0x03, 0xf6, 0x80, 0xf0,
+ 0xf1, 0x03, 0x03, 0xf2,
+ 0xcf, 0xde, 0xf0, 0x37, 0x42, 0x00, 0xdf, 0xff, 0x00, 0x43, 0x42, 0x22,
+ 0xfe, 0xd9, 0xf0, 0x23,
+ 0x64, 0x10, 0xdd, 0xbc, 0xef, 0xe0, 0x02, 0x57, 0x22, 0xff, 0x0f, 0x01,
+ 0x32, 0xff, 0xef, 0x45,
+ 0x54, 0x00, 0xf0, 0xff, 0xf0, 0x00, 0x43, 0x10, 0xfd, 0xfd, 0x00, 0x0f,
+ 0x0d, 0x52, 0x13, 0xfd,
+ 0xca, 0xda, 0xcc, 0x10, 0x32, 0xee, 0x0e, 0x40, 0x0f, 0xdb, 0x41, 0x61,
+ 0x0e, 0x10, 0x30, 0x0f,
+ 0x0d, 0xed, 0xcc, 0x00, 0x67, 0x00, 0xed, 0xed, 0xcc, 0x00, 0x02, 0x00,
+ 0x10, 0x1f, 0xea, 0xef,
+ 0x11, 0x22, 0x00, 0xcd, 0x0e, 0x20, 0x0e, 0x8a, 0xee, 0x12, 0x00, 0xfd,
+ 0x32, 0x75, 0x0f, 0xef,
+ 0x13, 0x16, 0x01, 0x01, 0xf0, 0xdf, 0x14, 0x45, 0xc0, 0xaf, 0x01, 0x13,
+ 0x00, 0xdf, 0xe0, 0x00,
+ 0x11, 0x34, 0x11, 0x00, 0x11, 0x63, 0x0d, 0xd8, 0x00, 0x74, 0x00, 0x00,
+ 0x00, 0xf0, 0xef, 0x00,
+ 0xe0, 0xf0, 0x25, 0x11, 0x0f, 0x10, 0x20, 0xce, 0xef, 0x77, 0x43, 0x00,
+ 0xf1, 0x01, 0x00, 0x22,
+ 0xff, 0xdc, 0x43, 0x56, 0x0f, 0x00, 0x00, 0x0e, 0x0e, 0xf0, 0x00, 0x00,
+ 0xdd, 0xda, 0xdd, 0x00,
+ 0x30, 0xd0, 0xff, 0xbc, 0x0d, 0x70, 0x2d, 0x0b, 0x20, 0x00, 0x0e, 0x74,
+ 0x20, 0xfc, 0xfe, 0xef,
+ 0xfe, 0x00, 0xf0, 0xdc, 0xdd, 0xcc, 0xcc, 0x00, 0x11, 0x11, 0x00, 0x0d,
+ 0xea, 0x9d, 0xef, 0x23,
+ 0x42, 0xea, 0xdd, 0x00, 0xff, 0x00, 0x43, 0xfe, 0xdc, 0x62, 0x23, 0xdb,
+ 0xf0, 0x46, 0x12, 0xf0,
+ 0x13, 0x01, 0xb0, 0xcf, 0xe1, 0x27, 0x02, 0x9e, 0xf0, 0x12, 0x02, 0xdd,
+ 0x00, 0x26, 0x00, 0x00,
+ 0x21, 0x0f, 0x40, 0x63, 0x00, 0xdc, 0x02, 0x11, 0x00, 0xff, 0xf0, 0xf0,
+ 0x01, 0xf1, 0x02, 0x12,
+ 0x43, 0x00, 0x20, 0x77, 0x37, 0xd0, 0x00, 0x23, 0x11, 0x32, 0x42, 0x11,
+ 0x00, 0x10, 0x54, 0x44,
+ 0xff, 0xec, 0x10, 0x50, 0x31, 0x00, 0x00, 0xce, 0xa8, 0xec, 0x21, 0x20,
+ 0x0f, 0xee, 0xee, 0x00,
+ 0x43, 0xfb, 0xfc, 0x70, 0x32, 0x00, 0x00, 0x00, 0xed, 0x0e, 0x31, 0x31,
+ 0xda, 0xbd, 0xf0, 0xef,
+ 0xdd, 0x0f, 0x00, 0x2e, 0x1f, 0xed, 0xf0, 0x03, 0x0d, 0xc8, 0x1f, 0x40,
+ 0xce, 0xcc, 0x00, 0x11,
+ 0xdc, 0x0e, 0x72, 0x00, 0xfc, 0x10, 0x43, 0xee, 0xef, 0x27, 0x23, 0xd0,
+ 0xf1, 0x26, 0x80, 0xde,
+ 0x03, 0xf3, 0xe1, 0x04, 0x01, 0x01, 0xb0, 0xcf, 0xf1, 0x37, 0x42, 0x00,
+ 0xee, 0xdd, 0x0f, 0x21,
+ 0x43, 0x45, 0x12, 0xee, 0xbd, 0xff, 0xff, 0xf0, 0x03, 0x23, 0x00, 0x11,
+ 0xfb, 0xaa, 0x11, 0x46,
+ 0x11, 0x00, 0x21, 0x01, 0x00, 0x21, 0x52, 0xf0, 0xe0, 0x23, 0x52, 0x21,
+ 0x01, 0x0e, 0xfc, 0x23,
+ 0x22, 0xd9, 0x0f, 0x0f, 0x8d, 0xf0, 0x11, 0x21, 0x0d, 0xb8, 0xfe, 0x1f,
+ 0x20, 0x20, 0x20, 0x1e,
+ 0x3f, 0x60, 0x21, 0xfd, 0xfd, 0x35, 0x20, 0x0d, 0x1f, 0xec, 0x9c, 0xfe,
+ 0xf0, 0x00, 0x20, 0x1e,
+ 0x2f, 0x10, 0xeb, 0xac, 0x01, 0x21, 0x0c, 0x10, 0x43, 0xff, 0xca, 0xdd,
+ 0xdc, 0x31, 0x75, 0x1f,
+ 0x0e, 0x00, 0x0f, 0x00, 0x23, 0xf0, 0xe0, 0x46, 0x43, 0xf0, 0xa0, 0xe0,
+ 0x01, 0x04, 0xe1, 0xf2,
+ 0x04, 0xf1, 0xb0, 0x02, 0x14, 0x00, 0xf1, 0x22, 0x31, 0x20, 0x0e, 0xff,
+ 0x47, 0x22, 0xae, 0xee,
+ 0x23, 0x23, 0xdc, 0xfe, 0xe0, 0xbd, 0x03, 0x37, 0x10, 0x00, 0x0e, 0x22,
+ 0x67, 0x02, 0x9e, 0xff,
+ 0x23, 0x34, 0x10, 0x02, 0xef, 0xf0, 0x57, 0x10, 0x00, 0x10, 0x0f, 0x00,
+ 0x11, 0xce, 0xdd, 0x21,
+ 0x0f, 0xb8, 0xf0, 0x00, 0x00, 0xee, 0x0f, 0x0f, 0x70, 0x0e, 0x0b, 0x10,
+ 0x30, 0x32, 0x32, 0x0e,
+ 0xc9, 0x0f, 0x51, 0x00, 0xef, 0xfe, 0xde, 0x00, 0x00, 0x2f, 0x31, 0x0f,
+ 0xaa, 0xce, 0x10, 0x32,
+ 0xf0, 0xfe, 0xfe, 0xda, 0xce, 0xff, 0x52, 0x11, 0xdc, 0xdc, 0x30, 0x60,
+ 0x0e, 0x0e, 0x02, 0x02,
+ 0x15, 0x53, 0x00, 0xff, 0x01, 0x05, 0xd0, 0x90, 0xe0, 0x06, 0x23, 0x02,
+ 0xae, 0xde, 0x05, 0x03,
+ 0xff, 0x01, 0x32, 0x00, 0x10, 0xf0, 0xdd, 0x34, 0x77, 0x00, 0xef, 0xee,
+ 0x00, 0xd0, 0xbd, 0x00,
+ 0x23, 0x00, 0x00, 0x24, 0xef, 0x99, 0x00, 0x23, 0x23, 0x01, 0xe0, 0xf0,
+ 0x02, 0x43, 0x23, 0x00,
+ 0xf0, 0x36, 0x33, 0x10, 0x31, 0x20, 0x50, 0x43, 0xfe, 0xba, 0xf0, 0x00,
+ 0xec, 0x20, 0x22, 0xee,
+ 0xba, 0xee, 0xfe, 0x0e, 0x1e, 0x60, 0x41, 0x10, 0x0e, 0x1f, 0x1f, 0x0c,
+ 0x2f, 0x0d, 0xe8, 0x10,
+ 0x51, 0xde, 0xbb, 0x21, 0x22, 0x0e, 0xee, 0xee, 0x00, 0x51, 0x0f, 0xdb,
+ 0xee, 0x11, 0x21, 0xff,
+ 0xee, 0x0e, 0xbb, 0xec, 0x20, 0x61, 0x0d, 0xfd, 0x0f, 0x0e, 0x20, 0x36,
+ 0x33, 0x32, 0xef, 0xef,
+ 0x11, 0xe0, 0xb0, 0x07, 0xc3, 0xc3, 0x04, 0xc0, 0xf1, 0x03, 0x9f, 0xdc,
+ 0x06, 0x44, 0x00, 0xfe,
+ 0x30, 0x33, 0xe0, 0xdf, 0x23, 0x12, 0xff, 0xee, 0x10, 0x00, 0x8a, 0x00,
+ 0x03, 0xf0, 0xfd, 0x1f,
+ 0x56, 0x01, 0xe0, 0xe0, 0xf0, 0x01, 0x23, 0x13, 0x34, 0x01, 0x01, 0x77,
+ 0x32, 0xe0, 0xee, 0x1f,
+ 0x61, 0x35, 0x21, 0xf0, 0xf0, 0x00, 0xf0, 0xab, 0xed, 0x02, 0x00, 0xfe,
+ 0x0f, 0xed, 0xcb, 0x1f,
+ 0x2f, 0x3e, 0x71, 0x20, 0x0e, 0x0d, 0x0d, 0x0c, 0x20, 0x1c, 0x0c, 0x74,
+ 0x13, 0xb8, 0xdd, 0x00,
+ 0x42, 0x11, 0xfe, 0x0f, 0xfe, 0xff, 0x02, 0x00, 0xeb, 0x00, 0x10, 0xde,
+ 0xcd, 0x22, 0x54, 0xfb,
+ 0xbb, 0x20, 0x31, 0xcd, 0xee, 0x33, 0x53, 0x0f, 0x0f, 0x0f, 0xff, 0x02,
+ 0x12, 0xf0, 0x06, 0xf3,
+ 0xe2, 0xc2, 0xc1, 0xb0, 0xf0, 0x17, 0x02, 0xf1, 0xe1, 0x00, 0x11, 0xfe,
+ 0x11, 0x77, 0x02, 0xef,
+ 0xf0, 0x44, 0x00, 0xbd, 0x0f, 0x12, 0x00, 0xdc, 0x01, 0x33, 0xee, 0xee,
+ 0x55, 0x11, 0xef, 0xf1,
+ 0x04, 0x01, 0xf0, 0xf1, 0x11, 0x76, 0x12, 0x02, 0x45, 0x00, 0xee, 0xff,
+ 0x76, 0x32, 0xff, 0xff,
+ 0x01, 0x12, 0x00, 0xfe, 0xed, 0xee, 0xef, 0x00, 0xbc, 0xb8, 0x0f, 0x51,
+ 0x11, 0x10, 0xfe, 0x0d,
+ 0x20, 0x52, 0x11, 0xfb, 0xec, 0x00, 0x21, 0x20, 0x00, 0xfd, 0xdc, 0x10,
+ 0x10, 0xdc, 0x40, 0x40,
+ 0x0f, 0x00, 0xbe, 0xdd, 0x00, 0x1e, 0x42, 0x47, 0xcc, 0xba, 0xf0, 0x00,
+ 0x20, 0x20, 0x1f, 0x0e,
+ 0xdd, 0x00, 0x32, 0x0e, 0x20, 0x41, 0xfd, 0x11, 0x26, 0xd1, 0xe4, 0x02,
+ 0xf2, 0xc2, 0x80, 0xce,
+ 0xe1, 0xf4, 0x03, 0x17, 0x12, 0xe0, 0x00, 0x32, 0x01, 0xbe, 0x02, 0x47,
+ 0x12, 0xdf, 0xde, 0x62,
+ 0x12, 0xf0, 0xff, 0xe0, 0x00, 0x00, 0xdc, 0x00, 0x55, 0xf0, 0xf0, 0x14,
+ 0xf0, 0xa0, 0x00, 0x35,
+ 0x33, 0xe0, 0xdf, 0x13, 0x77, 0x21, 0x10, 0x21, 0x10, 0x00, 0x12, 0x02,
+ 0x10, 0x21, 0x10, 0xac,
+ 0xdb, 0x00, 0xf0, 0xbe, 0x0f, 0x0d, 0x0c, 0x51, 0x1f, 0xc8, 0x0e, 0x54,
+ 0x21, 0x0f, 0x0e, 0x0d,
+ 0x0e, 0x21, 0x00, 0xed, 0xee, 0xed, 0x50, 0x45, 0x10, 0xea, 0xce, 0x0f,
+ 0x00, 0x11, 0x00, 0xfe,
+ 0xde, 0xee, 0xff, 0x10, 0x20, 0xcb, 0xac, 0x0e, 0x00, 0x0e, 0x0f, 0x0f,
+ 0x0c, 0x1e, 0x73, 0x31,
+ 0xfb, 0x00, 0x21, 0xdc, 0xce, 0x57, 0x14, 0xd0, 0xdf, 0xf1, 0xf1, 0xc0,
+ 0xf2, 0xe1, 0xc0, 0x02,
+ 0x15, 0x01, 0x00, 0x01, 0x02, 0xd0, 0xf2, 0x77, 0x42, 0xef, 0xde, 0x00,
+ 0x01, 0xf0, 0x01, 0x01,
+ 0x0f, 0xdd, 0x32, 0xf0, 0x89, 0xd0, 0x35, 0x52, 0xef, 0xde, 0x03, 0x45,
+ 0x00, 0x00, 0x32, 0x00,
+ 0xf0, 0x00, 0x53, 0x33, 0x35, 0x32, 0x20, 0x11, 0x21, 0xe0, 0x8c, 0x0f,
+ 0x11, 0x0f, 0xed, 0xed,
+ 0xc9, 0xef, 0x20, 0x30, 0x2c, 0x1e, 0x0d, 0x30, 0x74, 0x0d, 0x0d, 0x30,
+ 0x20, 0xfd, 0xc8, 0x00,
+ 0x61, 0x0f, 0xfb, 0x0f, 0x0f, 0x10, 0x0f, 0xf0, 0x10, 0x20, 0xff, 0xdd,
+ 0x0e, 0x31, 0x00, 0x89,
+ 0xce, 0x0f, 0x21, 0x0f, 0xeb, 0xed, 0x10, 0x20, 0x0e, 0x0e, 0x1d, 0x5c,
+ 0x73, 0x34, 0x0f, 0xf0,
+ 0x02, 0xe0, 0xd1, 0x07, 0x01, 0xc0, 0xf4, 0xd1, 0x90, 0xf2, 0x05, 0x12,
+ 0x13, 0x01, 0xcf, 0x00,
+ 0x26, 0x22, 0xf0, 0xc0, 0xf2, 0x34, 0x21, 0xff, 0xbe, 0xf0, 0x24, 0x23,
+ 0xef, 0xfe, 0x50, 0x0f,
+ 0xca, 0xe1, 0x04, 0x13, 0x01, 0xe0, 0x0f, 0x00, 0xf1, 0xb0, 0x25, 0x77,
+ 0x30, 0x10, 0x42, 0x00,
+ 0xf0, 0x11, 0x65, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0xdf, 0xcc,
+ 0xed, 0x30, 0x3f, 0x0b,
+ 0x40, 0x40, 0x1f, 0x2f, 0x2f, 0x1f, 0xeb, 0x0e, 0x70, 0x30, 0x0d, 0x0f,
+ 0x0c, 0xeb, 0x0e, 0x3f,
+ 0x4f, 0xea, 0xdf, 0x31, 0x30, 0xdf, 0x20, 0x1f, 0x8c, 0xde, 0x0f, 0x32,
+ 0x0f, 0xba, 0xee, 0xac,
+ 0x0f, 0x22, 0x0f, 0xea, 0x00, 0x30, 0x0e, 0x4f, 0x20, 0x0e, 0x00, 0x01,
+ 0x34, 0x13, 0xd0, 0x90,
+ 0xf1, 0xe2, 0xb0, 0xe1, 0xe6, 0xd2, 0x02, 0x16, 0x02, 0xe0, 0xe0, 0xf1,
+ 0xe2, 0xc2, 0x04, 0x02,
+ 0xe0, 0xd0, 0xf0, 0x34, 0x54, 0xdf, 0xad, 0xf0, 0x00, 0x00, 0xff, 0xcd,
+ 0xdf, 0x27, 0x01, 0xa1,
+ 0x15, 0x00, 0xbd, 0xff, 0x14, 0x13, 0x01, 0x01, 0x45, 0x31, 0x0f, 0x63,
+ 0x47, 0x11, 0xf0, 0x00,
+ 0x21, 0x00, 0xf0, 0xef, 0xef, 0x01, 0x13, 0xad, 0xd9, 0x1f, 0x3f, 0x1e,
+ 0x1f, 0x00, 0x00, 0x2f,
+ 0x50, 0x2d, 0x4d, 0x30, 0xfc, 0x0d, 0x1f, 0xe8, 0x0e, 0x70, 0x2e, 0xfc,
+ 0x32, 0x10, 0xdd, 0xfe,
+ 0x20, 0xdb, 0x30, 0x72, 0xec, 0xcd, 0x00, 0x01, 0xff, 0xdd, 0xcb, 0xff,
+ 0x0e, 0xfc, 0x1f, 0x0d,
+ 0xfc, 0x1f, 0x70, 0x40, 0x2e, 0x2e, 0x0c, 0xfe, 0x04, 0xf4, 0xa0, 0x01,
+ 0x03, 0xe0, 0xbe, 0xd0,
+ 0xc4, 0xf6, 0x03, 0x35, 0x01, 0xcf, 0xd0, 0xf3, 0x03, 0xf2, 0x15, 0x42,
+ 0xf0, 0xf1, 0xf1, 0xe0,
+ 0x03, 0x01, 0xac, 0x0f, 0x42, 0x00, 0xff, 0x02, 0xde, 0xd0, 0x06, 0x02,
+ 0x8f, 0xff, 0x14, 0x11,
+ 0xf0, 0xd0, 0xd0, 0x17, 0x77, 0x42, 0x20, 0x01, 0x10, 0x21, 0x32, 0x00,
+ 0x03, 0x34, 0xff, 0xbf,
+ 0x01, 0x02, 0xeb, 0xde, 0x0e, 0xfe, 0x30, 0x60, 0x0c, 0x0d, 0x42, 0x10,
+ 0xfb, 0x00, 0x50, 0x31,
+ 0x0b, 0xeb, 0x0f, 0x20, 0x10, 0x2e, 0x6e, 0x20, 0x0e, 0xdc, 0x0e, 0x00,
+ 0x10, 0x71, 0x0d, 0x08,
+ 0x01, 0x32, 0xbf, 0xbc, 0x00, 0x10, 0x0f, 0xfd, 0xee, 0xec, 0x0e, 0x20,
+ 0x1d, 0x1c, 0x60, 0x0d,
+ 0x0d, 0x43, 0x11, 0x0f, 0x0f, 0xef, 0x04, 0xe3, 0xad, 0xf0, 0x17, 0x03,
+ 0x8d, 0x05, 0x07, 0x00,
+ 0xe0, 0x00, 0x12, 0x02, 0xd0, 0x03, 0x15, 0x00, 0xd0, 0x11, 0x00, 0xf0,
+ 0xe1, 0xc0, 0xf0, 0x62,
+ 0x00, 0xea, 0x00, 0x02, 0xd0, 0x02, 0x65, 0xee, 0xcd, 0xff, 0xf0, 0x05,
+ 0x03, 0xe1, 0xf0, 0x21,
+ 0x40, 0x10, 0x77, 0x23, 0x01, 0x11, 0x22, 0x11, 0x00, 0x01, 0xde, 0x25,
+ 0x75, 0xef, 0xcc, 0x00,
+ 0x0f, 0x0e, 0x31, 0x32, 0xff, 0x0f, 0xee, 0x1e, 0x61, 0x1f, 0x0b, 0x1f,
+ 0x2e, 0x1d, 0x0c, 0x20,
+ 0x0d, 0xeb, 0x30, 0x70, 0x40, 0x0d, 0xc8, 0x00, 0x52, 0x20, 0x05, 0x05,
+ 0xc8, 0x00, 0xbc, 0x00,
+ 0xe3, 0x1f, 0x54, 0xd6, 0xf5, 0x23, 0x16, 0xd8, 0x56, 0xef, 0xee, 0xef,
+ 0xef, 0x01, 0x72, 0x09,
+ 0xdb, 0xe0, 0x74, 0x0d, 0xee, 0x76, 0x00, 0xfc, 0x01, 0x11, 0xce, 0x11,
+ 0x45, 0xff, 0xdd, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0xcb, 0x12, 0x54, 0xff, 0xee, 0x00, 0x14, 0xff,
+ 0xee, 0x32, 0x76, 0xef,
+ 0xcd, 0x11, 0x10, 0x10, 0x12, 0xf0, 0xee, 0xde, 0x34, 0x52, 0xed, 0x00,
+ 0x02, 0xce, 0x22, 0x02,
+ 0xfc, 0xff, 0x00, 0xd3, 0x05, 0x52, 0x10, 0x0d, 0x22, 0x63, 0x00, 0xd0,
+ 0xf0, 0x07, 0x34, 0xfe,
+ 0x31, 0x12, 0x9a, 0xff, 0xf1, 0x13, 0x2e, 0xda, 0x31, 0x74, 0xef, 0xdd,
+ 0x11, 0x43, 0xec, 0x00,
+ 0x54, 0xff, 0xda, 0x22, 0x10, 0x00, 0x0f, 0x0f, 0xcf, 0x42, 0x12, 0xfe,
+ 0x0e, 0x30, 0xce, 0xed,
+ 0x67, 0x12, 0x0e, 0xde, 0x00, 0x00, 0x01, 0xff, 0xed, 0x10, 0x22, 0x0f,
+ 0xc8, 0xef, 0x51, 0x32,
+ 0x0f, 0x0d, 0x30, 0x31, 0xbf, 0xdb, 0x13, 0x43, 0x00, 0xef, 0xb9, 0x11,
+ 0x12, 0xf0, 0xf0, 0xe0,
+ 0xdd, 0x55, 0x10, 0xbd, 0x11, 0x47, 0xd0, 0xdd, 0x23, 0x21, 0x0f, 0x00,
+ 0x0f, 0xe0, 0x22, 0xc0,
+ 0xde, 0x00, 0x71, 0x01, 0x00, 0x00, 0xe4, 0x11, 0xf9, 0xbf, 0x12, 0x01,
+ 0xae, 0x14, 0x46, 0xed,
+ 0xfe, 0x24, 0x00, 0xce, 0x30, 0x67, 0x00, 0xde, 0x00, 0x12, 0x21, 0xdf,
+ 0xf0, 0x20, 0x10, 0xff,
+ 0xe0, 0x01, 0xdf, 0x0d, 0x72, 0x33, 0xdd, 0xce, 0xfe, 0x37, 0x55, 0xfc,
+ 0xef, 0x00, 0x1f, 0x31,
+ 0x02, 0xac, 0x01, 0x42, 0xfb, 0x00, 0x00, 0xfe, 0x01, 0x34, 0x0d, 0x10,
+ 0xfe, 0xce, 0x67, 0x02,
+ 0xba, 0x00, 0x21, 0x01, 0xff, 0xdd, 0x01, 0x41, 0x00, 0xff, 0xeb, 0x41,
+ 0x44, 0xcd, 0x0e, 0x33,
+ 0x00, 0xcb, 0x11, 0x32, 0xf0, 0xd0, 0x10, 0x0f, 0xde, 0x22, 0xc0, 0xfe,
+ 0x66, 0x0f, 0xcf, 0x13,
+ 0x00, 0x0e, 0x03, 0x05, 0x00, 0xfd, 0x0e, 0x44, 0xf0, 0x9f, 0x0f, 0x15,
+ 0x21, 0x0f, 0x0f, 0x10,
+ 0xde, 0xdd, 0x57, 0x12, 0xce, 0x00, 0x0f, 0x0e, 0x02, 0xe3, 0xe0, 0x10,
+ 0x00, 0x0e, 0x74, 0x43,
+ 0xed, 0xf1, 0x17, 0x15, 0xff, 0x0f, 0x0f, 0x00, 0x23, 0x22, 0xbc, 0xfe,
+ 0x44, 0xf0, 0xbe, 0x10,
+ 0x30, 0xf0, 0xf1, 0x04, 0xfc, 0x0e, 0x74, 0x00, 0x0f, 0x00, 0xc9, 0x00,
+ 0x54, 0x00, 0xfd, 0xf0,
+ 0x11, 0x2e, 0xfd, 0x01, 0x14, 0xee, 0x0d, 0x72, 0x31, 0xf2, 0xde, 0xc8,
+ 0x10, 0x12, 0x10, 0xe1,
+ 0xff, 0x0c, 0xee, 0x22, 0x23, 0x9a, 0x00, 0x40, 0x3f, 0x1f, 0xef, 0xf0,
+ 0xe2, 0xfe, 0x3f, 0x54,
+ 0xff, 0xee, 0xf0, 0xcf, 0x20, 0x31, 0xbb, 0xe1, 0x16, 0x00, 0xf0, 0xe0,
+ 0x42, 0x02, 0xcc, 0x22,
+ 0x13, 0x8c, 0x01, 0x17, 0x1f, 0xed, 0x23, 0x25, 0xbd, 0xfe, 0x21, 0x22,
+ 0x00, 0xe0, 0x00, 0x01,
+ 0xcf, 0xef, 0x23, 0x00, 0xcb, 0xf0, 0xf2, 0x33, 0x20, 0xf0, 0x10, 0xeb,
+ 0x43, 0x77, 0x26, 0xad,
+ 0x00, 0x20, 0xf0, 0x22, 0x23, 0xbe, 0xfd, 0x11, 0x22, 0xfe, 0xfd, 0x02,
+ 0x15, 0xee, 0xce, 0x54,
+ 0x31, 0xdc, 0x00, 0x31, 0xf0, 0xcd, 0x10, 0x67, 0x00, 0xeb, 0xf0, 0x52,
+ 0xff, 0xed, 0x22, 0x11,
+ 0xdb, 0x52, 0x32, 0xfe, 0xcd, 0x02, 0x34, 0x0f, 0xdc, 0x00, 0xf0, 0x00,
+ 0x00, 0x01, 0xfe, 0xfe,
+ 0x20, 0x30, 0xeb, 0x2f, 0x73, 0x2b, 0xac, 0x34, 0x21, 0xbe, 0x00, 0x22,
+ 0x1e, 0xfc, 0x01, 0x03,
+ 0xee, 0xbb, 0x03, 0x53, 0xfd, 0xda, 0x34, 0x12, 0xbe, 0x10, 0x12, 0xed,
+ 0x0f, 0x24, 0xf0, 0xe1,
+ 0x01, 0xff, 0x23, 0x0e, 0xfc, 0x20, 0x24, 0xe0, 0xf0, 0xee, 0xbf, 0xe0,
+ 0x47, 0xe0, 0x8d, 0x00,
+ 0x13, 0x00, 0x0d, 0xd0, 0xe0, 0x45, 0x20, 0x20, 0x33, 0xe1, 0x90, 0x15,
+ 0x13, 0x0d, 0xfc, 0x23,
+ 0x22, 0xf1, 0xef, 0xd0, 0x01, 0x01, 0xcb, 0x10, 0x75, 0x10, 0xcc, 0xff,
+ 0x00, 0xf1, 0x62, 0x24,
+ 0xfc, 0xdf, 0x01, 0x00, 0x1d, 0x23, 0x0f, 0xc8, 0x1f, 0x30, 0x01, 0xf0,
+ 0x1f, 0x50, 0x11, 0x0e,
+ 0xfe, 0xf0, 0xf0, 0xdc, 0x00, 0x77, 0xe0, 0xcd, 0x01, 0x30, 0x0d, 0xec,
+ 0x00, 0xfe, 0xfe, 0x70,
+ 0x00, 0x12, 0x13, 0x08, 0xdb, 0x32, 0x21, 0x01, 0x2f, 0xee, 0x8e, 0xee,
+ 0x22, 0x35, 0xf1, 0x00,
+ 0xcd, 0xec, 0x03, 0x24, 0x10, 0xbd, 0x14, 0x34, 0xde, 0xcd, 0xf2, 0x02,
+ 0x31, 0x46, 0xbf, 0xed,
+ 0x30, 0x41, 0xf0, 0xd0, 0x26, 0x10, 0xf0, 0xcf, 0xcc, 0x00, 0x35, 0xe0,
+ 0x9d, 0x12, 0x12, 0x0f,
+ 0xfd, 0x52, 0x02, 0xc0, 0x14, 0x24, 0x0f, 0x10, 0x0f, 0xf0, 0x04, 0x23,
+ 0x00, 0x00, 0x1f, 0x21,
+ 0x8b, 0xff, 0x16, 0x0f, 0x00, 0x42, 0xff, 0xaa, 0x00, 0x44, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0xcb,
+ 0x11, 0x53, 0x0e, 0xec, 0x20, 0x02, 0x0e, 0xe0, 0x11, 0x30, 0x3d, 0x61,
+ 0x00, 0xbb, 0x00, 0x04,
+ 0x02, 0xfa, 0x11, 0x21, 0xce, 0xfd, 0x00, 0x34, 0x0e, 0xab, 0x20, 0x31,
+ 0x00, 0xf1, 0x00, 0xec,
+ 0x20, 0x53, 0xfd, 0x0f, 0x00, 0xdc, 0x0f, 0x55, 0xe0, 0xfe, 0x02, 0xde,
+ 0x30, 0x76, 0xfe, 0xce,
+ 0x01, 0x04, 0x00, 0x00, 0x22, 0x00, 0xcf, 0x02, 0x04, 0xec, 0x10, 0x61,
+ 0x03, 0x12, 0x0d, 0xd0,
+ 0xf1, 0xf3, 0x35, 0x0f, 0xac, 0x00, 0x0f, 0xfe, 0x03, 0xf2, 0x00, 0x15,
+ 0x00, 0xcd, 0x51, 0x24,
+ 0xf3, 0xf7, 0x02, 0xdd, 0x10, 0x75, 0x20, 0xee, 0x03, 0x26, 0xff, 0xbd,
+ 0x01, 0x22, 0x0f, 0xee,
+ 0x01, 0x13, 0x0f, 0x1f, 0x40, 0x01, 0xdf, 0x00, 0x15, 0xfe, 0x3e, 0x5f,
+ 0xeb, 0xb0, 0x04, 0x31,
+ 0x1c, 0xfb, 0x20, 0x71, 0x00, 0x20, 0x10, 0xdc, 0xf0, 0x51, 0x00, 0xe0,
+ 0x02, 0x37, 0xee, 0x8a,
+ 0x00, 0x10, 0x00, 0xd0, 0x20, 0x30, 0xfd, 0x20, 0x42, 0xbd, 0x0d, 0x13,
+ 0x1e, 0x2e, 0x33, 0xfd,
+ 0xa8, 0x00, 0x24, 0xfe, 0xdd, 0x41, 0x02, 0xfe, 0x00, 0x15, 0xf0, 0xaf,
+ 0x0e, 0x36, 0x10, 0xbd,
+ 0x02, 0xe3, 0x0f, 0x12, 0x32, 0xbb, 0x11, 0x44, 0x0f, 0xe0, 0x00, 0xf0,
+ 0x02, 0x11, 0x10, 0xdf,
+ 0xbc, 0x01, 0x11, 0xee, 0x05, 0xf0, 0xca, 0x00, 0x55, 0x00, 0xff, 0x22,
+ 0x00, 0xc0, 0xf0, 0x55,
+ 0x20, 0x2f, 0xf0, 0xd2, 0xdf, 0x23, 0x76, 0xff, 0xdd, 0x0f, 0x01, 0x22,
+ 0x00, 0xdf, 0x00, 0x12,
+ 0x41, 0x2e, 0x10, 0x01, 0xae, 0xfe, 0x17, 0x31, 0xcc, 0xcc, 0x40, 0x30,
+ 0x15, 0x10, 0xbc, 0xfc,
+ 0x31, 0x10, 0x10, 0x73, 0x03, 0xc8, 0x00, 0x01, 0x21, 0x00, 0x1f, 0xde,
+ 0xde, 0xf0, 0x42, 0x20,
+ 0xbb, 0x10, 0x33, 0xee, 0xfd, 0x31, 0x30, 0xfe, 0xdc, 0x11, 0x33, 0x0f,
+ 0xea, 0x60, 0xf0, 0xf1,
+ 0xf0, 0xdc, 0x20, 0x31, 0x00, 0x31, 0x00, 0x93, 0xe2, 0xe0, 0x0e, 0x31,
+ 0xf2, 0x90, 0xf0, 0x07,
+ 0x25, 0x0f, 0x40, 0x0d, 0xd0, 0x37, 0x13, 0xdf, 0xef, 0x2f, 0xfe, 0xb1,
+ 0xf2, 0xc0, 0xff, 0x00,
+ 0x0f, 0xff, 0xfe, 0xe4, 0xc1, 0x00, 0x77, 0xf0, 0xc0, 0x74, 0x01, 0x0e,
+ 0x02, 0x07, 0x24, 0xdd,
+ 0xff, 0x10, 0x12, 0xf2, 0xf0, 0x0e, 0x0e, 0x01, 0xe5, 0xf0, 0x50, 0x30,
+ 0xfe, 0x1f, 0x33, 0x80,
+ 0xff, 0x13, 0xf8, 0xf0, 0x43, 0x0e, 0xdd, 0x10, 0x21, 0x1c, 0x2f, 0x1f,
+ 0x5e, 0x4f, 0x00, 0xd1,
+ 0xec, 0x24, 0x54, 0xec, 0xee, 0x00, 0x20, 0xef, 0x8a, 0x00, 0x22, 0xff,
+ 0xef, 0x0b, 0x60, 0x10,
+ 0xff, 0xed, 0x00, 0x21, 0x3e, 0x30, 0xfe, 0x98, 0x0f, 0x12, 0x10, 0xec,
+ 0xff, 0x53, 0x00, 0xfb,
+ 0x01, 0x03, 0x00, 0xde, 0x00, 0x14, 0xa0, 0xf0, 0x14, 0x2f, 0xdb, 0xe1,
+ 0x34, 0x10, 0x01, 0x02,
+ 0x10, 0x0e, 0x60, 0x17, 0xd1, 0x8f, 0x00, 0x1e, 0x0f, 0x00, 0x02, 0xd0,
+ 0xce, 0x17, 0x2f, 0xfb,
+ 0x01, 0x03, 0xce, 0x21, 0x12, 0x01, 0x12, 0x70, 0x02, 0x02, 0xb0, 0x11,
+ 0x26, 0x0e, 0xed, 0x13,
+ 0x06, 0xef, 0xee, 0x11, 0x31, 0x11, 0x20, 0xd0, 0xfe, 0x41, 0x30, 0x9b,
+ 0xd0, 0x37, 0x12, 0xac,
+ 0x10, 0x40, 0xef, 0xfe, 0x20, 0x00, 0xff, 0x30, 0x40, 0x0e, 0x00, 0x30,
+ 0x02, 0xce, 0xfe, 0x3f,
+ 0x22, 0xd0, 0xcb, 0x0e, 0x0d, 0xdd, 0xae, 0x00, 0x57, 0x0d, 0x08, 0x00,
+ 0x00, 0x1f, 0x1f, 0x20,
+ 0x01, 0x30, 0x30, 0x9b, 0xdb, 0x11, 0x62, 0xf0, 0x0e, 0x0e, 0x0f, 0x21,
+ 0xf2, 0xe2, 0xee, 0x0e,
+ 0x11, 0xf2, 0x9f, 0xfd, 0x06, 0x06, 0xf0, 0xef, 0x3e, 0x73, 0x03, 0xf0,
+ 0xe0, 0x04, 0x11, 0x0f,
+ 0x00, 0xf0, 0x00, 0x23, 0xdf, 0x8a, 0xf0, 0x02, 0x00, 0xf0, 0xde, 0xfa,
+ 0x54, 0x23, 0xed, 0xcf,
+ 0x17, 0x11, 0x10, 0x40, 0x10, 0x11, 0x00, 0xc5, 0x11, 0xef, 0xff, 0x23,
+ 0xd0, 0x1d, 0x74, 0x10,
+ 0xae, 0x03, 0x34, 0x1e, 0x0b, 0x00, 0xf4, 0xf0, 0xdf, 0xe0, 0x34, 0x40,
+ 0x0b, 0xe0, 0xbf, 0x0d,
+ 0x50, 0x33, 0x00, 0xdc, 0x1e, 0x41, 0x01, 0x1f, 0x00, 0x4f, 0x00, 0xdb,
+ 0xdf, 0x55, 0x00, 0xcb,
+ 0xff, 0x22, 0xf0, 0xff, 0x0f, 0x3e, 0x3d, 0x0e, 0x42, 0x00, 0x8c, 0x00,
+ 0x13, 0x3b, 0x0c, 0x1f,
+ 0x00, 0xdc, 0xd2, 0x42, 0x4f, 0x08, 0xfe, 0x32, 0x02, 0xf1, 0xe1, 0xc0,
+ 0xdc, 0x00, 0xa1, 0xf0,
+ 0x00, 0x35, 0xe0, 0x00, 0x10, 0x02, 0x13, 0x21, 0xb0, 0x00, 0x77, 0x01,
+ 0x01, 0xdf, 0xdb, 0xf0,
+ 0x34, 0x02, 0xaf, 0x0f, 0x0e, 0xba, 0x00, 0x34, 0xe0, 0xb0, 0x10, 0x23,
+ 0x1e, 0x30, 0x02, 0xd0,
+ 0x03, 0x02, 0x23, 0x01, 0xef, 0xee, 0x02, 0x47, 0x16, 0xdf, 0xdd, 0x00,
+ 0x73, 0x10, 0xdd, 0x74,
+ 0x32, 0xbd, 0x00, 0x03, 0xe0, 0xfe, 0x22, 0x33, 0xd8, 0x0f, 0x50, 0xe0,
+ 0xbd, 0x22, 0x32, 0x1a,
+ 0x10, 0x30, 0xef, 0xff, 0x03, 0x00, 0x2e, 0x50, 0x11, 0xde, 0xcb, 0xf0,
+ 0x02, 0x10, 0x1b, 0xf0,
+ 0x00, 0x3d, 0x20, 0x1f, 0xbc, 0x0e, 0x32, 0x72, 0x2c, 0xcd, 0xee, 0x0d,
+ 0x3f, 0x19, 0x0f, 0x43,
+ 0x0f, 0xd8, 0x30, 0x62, 0x01, 0xbe, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x0e,
+ 0x01, 0xc4, 0x02, 0x15,
+ 0x30, 0xdd, 0x21, 0x43, 0x26, 0xf2, 0x8d, 0x0e, 0x02, 0x14, 0x22, 0xf0,
+ 0xcc, 0xe0, 0x01, 0x01,
+ 0xee, 0x00, 0xdf, 0xaa, 0x34, 0x02, 0xdc, 0x32, 0x54, 0xde, 0x00, 0x13,
+ 0x2f, 0x10, 0xf5, 0xc1,
+ 0xf1, 0xf3, 0x20, 0x1f, 0xed, 0x34, 0x74, 0xfc, 0xde, 0x01, 0x04, 0x34,
+ 0x61, 0xee, 0xcd, 0x11,
+ 0x10, 0xe0, 0x02, 0x07, 0xf0, 0xdb, 0x5f, 0x1f, 0x00, 0x20, 0x02, 0xf0,
+ 0x0d, 0x7e, 0x61, 0xfe,
+ 0xee, 0x16, 0x10, 0xfd, 0x01, 0x00, 0x0f, 0x0e, 0xde, 0x0f, 0x00, 0xf3,
+ 0x4d, 0x08, 0x1d, 0x22,
+ 0x11, 0x00, 0xcf, 0xca, 0x3f, 0x70, 0xf1, 0xee, 0x30, 0x2d, 0xfc, 0x0f,
+ 0x4f, 0x30, 0xf0, 0xd0,
+ 0xf3, 0xe0, 0xcd, 0x3e, 0x08, 0x8e, 0xe1, 0x37, 0xf0, 0xce, 0x03, 0x52,
+ 0x00, 0xab, 0x12, 0x23,
+ 0x0d, 0xe0, 0x25, 0x13, 0x00, 0xbd, 0x0f, 0x33, 0xf1, 0xee, 0xf0, 0xdf,
+ 0x0b, 0x10, 0x04, 0xb0,
+ 0x00, 0x03, 0x0f, 0x0d, 0x02, 0x63, 0x12, 0x00, 0xe7, 0x04, 0xdf, 0x00,
+ 0x25, 0x10, 0x0f, 0x20,
+ 0x02, 0xb0, 0xfd, 0x11, 0x44, 0x43, 0x10, 0xfc, 0xd2, 0xd4, 0xd0, 0x10,
+ 0x54, 0x0f, 0xee, 0x0e,
+ 0xcd, 0xef, 0x31, 0x56, 0xec, 0xdf, 0x50, 0x3f, 0x6f, 0x0e, 0xea, 0x00,
+ 0x13, 0x32, 0x00, 0xfe,
+ 0xec, 0x1f, 0xfe, 0xd0, 0x06, 0x00, 0x0d, 0x2e, 0x0d, 0x0f, 0x70, 0x00,
+ 0xdf, 0x2f, 0xe0, 0xce,
+ 0x0c, 0x7b, 0x2d, 0x0e, 0xfe, 0x0e, 0x1f, 0x30, 0x42, 0x1d, 0x09, 0x00,
+ 0x2c, 0xcf, 0xd3, 0xf4,
+ 0xcd, 0xda, 0xd0, 0x42, 0x45, 0xb0, 0xbc, 0x01, 0x41, 0x10, 0x01, 0xe3,
+ 0xe0, 0x02, 0x36, 0x3f,
+ 0x0f, 0xf0, 0x03, 0xd1, 0x8e, 0x0e, 0x01, 0x00, 0xbf, 0x00, 0xf3, 0x00,
+ 0xfd, 0x1e, 0x31, 0xd0,
+ 0xd4, 0x37, 0x57, 0x0e, 0xf0, 0x04, 0x01, 0xe0, 0xb0, 0x01, 0x20, 0x10,
+ 0x23, 0x31, 0xce, 0xdf,
+ 0x05, 0x63, 0x00, 0x1e, 0x01, 0x06, 0xdf, 0xef, 0x35, 0x31, 0xb0, 0xbc,
+ 0xf0, 0x1f, 0x30, 0x1e,
+ 0x10, 0xef, 0x10, 0x75, 0x2d, 0xec, 0x22, 0x50, 0x00, 0x20, 0x00, 0xea,
+ 0xe0, 0xd3, 0xff, 0x3f,
+ 0x60, 0xed, 0x09, 0x00, 0x20, 0xf0, 0xd1, 0x12, 0x40, 0xdb, 0xee, 0x70,
+ 0x10, 0xcb, 0x11, 0x41,
+ 0x0d, 0xfe, 0x10, 0x1d, 0x22, 0x43, 0x0f, 0xe9, 0x0f, 0xf0, 0xa0, 0x0f,
+ 0x00, 0x22, 0x00, 0xee,
+ 0xf4, 0xf0, 0xcf, 0xfd, 0xde, 0x03, 0x77, 0x47, 0xff, 0xd0, 0x02, 0x11,
+ 0x20, 0x20, 0x00, 0xcf,
+ 0xc0, 0xc0, 0x03, 0x52, 0xeb, 0xcf, 0x03, 0x00, 0xee, 0x23, 0x0b, 0x1d,
+ 0x24, 0x05, 0xe0, 0xf0,
+ 0xe1, 0xe4, 0x01, 0x2f, 0x50, 0x21, 0xf2, 0xc0, 0xe0, 0xf3, 0x01, 0x4e,
+ 0x20, 0x37, 0x13, 0x01,
+ 0xef, 0xff, 0xc3, 0xf2, 0xf1, 0x01, 0x8c, 0xef, 0x56, 0xfe, 0xcb, 0x01,
+ 0x01, 0x20, 0x7f, 0x08,
+ 0x00, 0x40, 0x01, 0xf0, 0x02, 0xf0, 0x0e, 0x4f, 0x0d, 0xfe, 0xd0, 0x02,
+ 0x34, 0x0d, 0xda, 0x30,
+ 0x50, 0x0f, 0xd0, 0xd1, 0x23, 0x4e, 0xe8, 0x8e, 0x20, 0x20, 0xee, 0x02,
+ 0x61, 0x0c, 0x1d, 0x12,
+ 0xff, 0xd9, 0x10, 0x43, 0x0f, 0xed, 0x00, 0x01, 0xf1, 0xf0, 0xf0, 0xdd,
+ 0xbb, 0x00, 0x43, 0xf1,
+ 0xa0, 0x12, 0x37, 0x01, 0xfe, 0xff, 0x11, 0x26, 0x00, 0xf0, 0x10, 0x00,
+ 0xa0, 0xff, 0xf3, 0xc0,
+ 0xed, 0x01, 0xf0, 0xde, 0x10, 0x0c, 0xf2, 0x03, 0x66, 0x31, 0xc0, 0xe0,
+ 0x04, 0xf1, 0xf2, 0x33,
+ 0x74, 0xff, 0xbb, 0x04, 0x32, 0xfc, 0xf0, 0x24, 0x12, 0x01, 0x00, 0xde,
+ 0xd0, 0x20, 0x76, 0x21,
+ 0xd1, 0xe1, 0x00, 0xde, 0xdd, 0xf1, 0xef, 0x6f, 0x2e, 0x0d, 0x00, 0x30,
+ 0x4f, 0x20, 0x09, 0x20,
+ 0x10, 0x00, 0xdd, 0x03, 0x71, 0xf8, 0xdd, 0x20, 0x30, 0xcc, 0x00, 0x65,
+ 0xf0, 0xee, 0x20, 0x00,
+ 0x9a, 0x00, 0x0f, 0x3f, 0x00, 0x0d, 0xf0, 0x04, 0xff, 0x1b, 0x7f, 0x5f,
+ 0x0c, 0xdf, 0xf0, 0x05,
+ 0x11, 0x0e, 0x1c, 0x10, 0x0f, 0xe0, 0xf1, 0xd2, 0xdf, 0xef, 0xee, 0x00,
+ 0x71, 0x36, 0xa0, 0x03,
+ 0x03, 0x2e, 0x2d, 0x03, 0x17, 0xf1, 0xef, 0xe1, 0xe2, 0x01, 0xde, 0xef,
+ 0xc0, 0xf1, 0x00, 0xce,
+ 0xa9, 0x31, 0x32, 0xc0, 0x04, 0x24, 0xfe, 0xee, 0xd1, 0x07, 0x71, 0x00,
+ 0x00, 0xe2, 0xe0, 0x1f,
+ 0x40, 0x04, 0xc0, 0x25, 0x20, 0xec, 0x00, 0x73, 0x03, 0xf1, 0x02, 0x22,
+ 0xfe, 0xbc, 0x00, 0xe0,
+ 0xd3, 0x37, 0x30, 0xca, 0x10, 0x50, 0x10, 0xee, 0x00, 0x54, 0x00, 0x0f,
+ 0x30, 0x3f, 0xcc, 0xff,
+ 0x01, 0x00, 0x21, 0x41, 0xff, 0xbb, 0x01, 0x30, 0x0e, 0xfd, 0x04, 0xf0,
+ 0xcd, 0x00, 0x2d, 0x0d,
+ 0xfc, 0x31, 0x52, 0x4f, 0x08, 0xbb, 0x00, 0x42, 0x20, 0x0e, 0x0e, 0x01,
+ 0xe0, 0x00, 0x10, 0x4f,
+ 0xfa, 0xcf, 0xf0, 0xf2, 0xf1, 0xdd, 0x10, 0xf2, 0xd0, 0x63, 0xe1, 0xcf,
+ 0x43, 0x46, 0x03, 0x14,
+ 0x00, 0x0d, 0xa0, 0x07, 0x02, 0xc0, 0x0e, 0x20, 0x1f, 0xe0, 0xb1, 0xf0,
+ 0xfe, 0x0e, 0x2d, 0x30,
+ 0xe7, 0xd6, 0x21, 0x00, 0xbf, 0xf0, 0x20, 0x41, 0x12, 0xe5, 0xa1, 0x0f,
+ 0x0e, 0x2f, 0x01, 0x27,
+ 0x14, 0xde, 0x00, 0x70, 0x20, 0x0f, 0xd3, 0xe5, 0x00, 0xf0, 0x05, 0x05,
+ 0x4a, 0x00, 0x3c, 0x00,
+ 0xc0, 0xff, 0x31, 0x30, 0xc1, 0x01, 0x88, 0x33, 0x26, 0x92, 0xff, 0xfb,
+ 0x3e, 0x6e, 0x0d, 0x02,
+ 0x46, 0x00, 0x20, 0x22, 0xf8, 0x00, 0x3e, 0xe0, 0xe1, 0x12, 0x3f, 0x4c,
+ 0x70, 0x31, 0xdd, 0xb0,
+ 0x03, 0x0e, 0xf9, 0x00, 0x21, 0xe0, 0xef, 0x1e, 0x60, 0xf0, 0xe9, 0x00,
+ 0x60, 0x3f, 0x0e, 0xed,
+ 0x00, 0x01, 0x01, 0x30, 0x60, 0x09, 0xdd, 0x00, 0x31, 0xf0, 0xde, 0xe3,
+ 0xb0, 0xe0, 0x0c, 0x1e,
+ 0x2e, 0x04, 0x03, 0xe0, 0x14, 0x57, 0x11, 0x1f, 0x30, 0x12, 0xc0, 0xc0,
+ 0xf3, 0xe5, 0xd0, 0xce,
+ 0xfe, 0xe0, 0xbe, 0xde, 0xf2, 0x35, 0xf0, 0x2f, 0x73, 0xe1, 0xb0, 0x00,
+ 0x06, 0x33, 0x00, 0x00,
+ 0xf0, 0xe1, 0xd5, 0xb1, 0x01, 0x73, 0x0c, 0xf0, 0x03, 0x37, 0x21, 0xf0,
+ 0xe3, 0x01, 0xfe, 0x00,
+ 0x27, 0xc1, 0xd0, 0x20, 0xbe, 0xbc, 0x21, 0x32, 0xcc, 0x01, 0x52, 0x0e,
+ 0x2e, 0x12, 0x01, 0xf0,
+ 0xff, 0x08, 0x2e, 0x30, 0x00, 0x12, 0x31, 0xe0, 0xff, 0x4c, 0x6d, 0xee,
+ 0xbc, 0x04, 0x03, 0xff,
+ 0xee, 0x1e, 0x5c, 0x1f, 0x00, 0xcb, 0x0f, 0x0f, 0x1b, 0x4f, 0x62, 0x03,
+ 0xfc, 0xec, 0x0e, 0x00,
+ 0x42, 0x3f, 0x0e, 0xcf, 0x00, 0x0f, 0xd8, 0xde, 0x11, 0x12, 0xff, 0x00,
+ 0xc4, 0xce, 0x30, 0x52,
+ 0xfb, 0x01, 0x67, 0xf1, 0xd0, 0x0f, 0x11, 0x13, 0xff, 0xe0, 0xf0, 0xdf,
+ 0xf0, 0x0f, 0xf0, 0xb0,
+ 0xf1, 0x01, 0xdf, 0xec, 0x13, 0x23, 0x02, 0x37, 0x22, 0xa0, 0xef, 0x01,
+ 0xe3, 0xb6, 0x00, 0x21,
+ 0x2f, 0xe0, 0x11, 0x51, 0x00, 0x05, 0x52, 0x23, 0x04, 0xd1, 0x55, 0x00,
+ 0x9e, 0xf0, 0x03, 0x0d,
+ 0xdc, 0x23, 0x13, 0x01, 0x20, 0xed, 0x0e, 0x5e, 0x08, 0x0f, 0x53, 0x11,
+ 0xea, 0xe0, 0x22, 0x60,
+ 0x0f, 0x0e, 0x2e, 0x0c, 0xce, 0x02, 0x67, 0x00, 0xed, 0xff, 0xff, 0x00,
+ 0x00, 0x02, 0x4f, 0xda,
+ 0xed, 0x2f, 0x33, 0x00, 0x0d, 0x0e, 0x0e, 0x50, 0x4f, 0x1c, 0x0f, 0xef,
+ 0xec, 0x50, 0x40, 0xf8,
+ 0xee, 0xf1, 0xc2, 0xee, 0x0f, 0x0e, 0x1f, 0xee, 0x00, 0x17, 0xc0, 0xf0,
+ 0x21, 0x71, 0x12, 0x23,
+ 0xe0, 0xd0, 0xc3, 0xf5, 0x23, 0x4f, 0xff, 0xc1, 0xd1, 0xbb, 0xfc, 0xf0,
+ 0x20, 0x04, 0x03, 0x03,
+ 0xdc, 0xed, 0x20, 0x35, 0x13, 0x83, 0xe0, 0xf0, 0xde, 0x40, 0x34, 0xdf,
+ 0xd4, 0x25, 0x0d, 0x0f,
+ 0x75, 0x31, 0xf1, 0x34, 0x00, 0xc0, 0xe0, 0x23, 0x12, 0xc0, 0xbf, 0xf1,
+ 0x00, 0x11, 0x1e, 0x0d,
+ 0x20, 0x37, 0xf0, 0xee, 0x3f, 0x50, 0xef, 0x0e, 0x30, 0x7f, 0x1b, 0x1e,
+ 0x0d, 0x00, 0x36, 0x2d,
+ 0xf8, 0x01, 0x30, 0xf2, 0xaf, 0xdf, 0x00, 0x30, 0x2c, 0x00, 0xcf, 0x0c,
+ 0x30, 0xb0, 0x0e, 0x40,
+ 0x10, 0x2d, 0x3f, 0xc8, 0x30, 0x72, 0x5e, 0xea, 0x00, 0x02, 0xef, 0x1f,
+ 0x3e, 0xee, 0xef, 0xf2,
+ 0xdf, 0xde, 0x01, 0x00, 0x2a, 0x1e, 0x72, 0x17, 0xd0, 0xe0, 0x10, 0x53,
+ 0x10, 0xd0, 0xd0, 0x14,
+ 0x32, 0xf0, 0x9f, 0x00, 0x00, 0xbc, 0xe0, 0x03, 0x21, 0x12, 0x20, 0xeb,
+ 0xae, 0x00, 0x06, 0x04,
+ 0x20, 0xf0, 0x00, 0xe3, 0xaf, 0xfe, 0x02, 0x21, 0x00, 0x11, 0x17, 0x14,
+ 0x0f, 0x30, 0x22, 0x21,
+ 0x61, 0xf3, 0xa0, 0x02, 0x05, 0x00, 0xdf, 0x00, 0x05, 0x01, 0x00, 0x10,
+ 0xfb, 0xfe, 0x00, 0x74,
+ 0x52, 0xf0, 0xdb, 0x00, 0x40, 0x20, 0x0e, 0x0f, 0x30, 0xff, 0xeb, 0x52,
+ 0x24, 0x0f, 0xec, 0x00,
+ 0xff, 0x00, 0x10, 0x10, 0x10, 0x40, 0xee, 0x88, 0xfe, 0x10, 0x00, 0x00,
+ 0x71, 0x1d, 0xfc, 0xff,
+ 0xf0, 0x1f, 0x5b, 0x20, 0x12, 0xff, 0xdb, 0x0f, 0x1e, 0x00, 0xe2, 0xac,
+ 0x0f, 0x30, 0xfc, 0xdc,
+ 0x22, 0x02, 0x10, 0x00, 0xd1, 0x01, 0x67, 0x11, 0x00, 0x01, 0x03, 0xb0,
+ 0xf0, 0x02, 0x01, 0x00,
+ 0xef, 0xd0, 0x00, 0xf2, 0xbc, 0xdc, 0x03, 0x22, 0x41, 0x03, 0xd0, 0xe5,
+ 0x17, 0x95, 0xdf, 0x0e,
+ 0x10, 0x01, 0xdf, 0x12, 0x04, 0xf0, 0x72, 0x30, 0x10, 0x05, 0xf2, 0xe2,
+ 0xf1, 0x4f, 0x31, 0xa3,
+ 0xd6, 0xf2, 0x13, 0x20, 0x0c, 0xe0, 0xdf, 0xcc, 0x42, 0x57, 0xe0, 0xdf,
+ 0x0f, 0x6f, 0x20, 0x00,
+ 0xde, 0x0f, 0x52, 0x20, 0x0a, 0x10, 0xf0, 0xcd, 0x2f, 0x55, 0x00, 0xe0,
+ 0x0f, 0xfe, 0x0b, 0x00,
+ 0x13, 0xee, 0x1d, 0x40, 0xbb, 0xde, 0x34, 0x50, 0xec, 0xfd, 0x33, 0x40,
+ 0xfb, 0xed, 0x32, 0x42,
+ 0x0e, 0x1d, 0xfe, 0xd0, 0xe0, 0x0c, 0x0d, 0x0e, 0xe0, 0xf1, 0xb8, 0x0f,
+ 0x0e, 0xc0, 0x33, 0x77,
+ 0x00, 0xff, 0x0f, 0x00, 0x01, 0xf2, 0x15, 0x00, 0xf0, 0xf0, 0xe2, 0xe0,
+ 0x8c, 0xb0, 0x25, 0x1f,
+ 0xfd, 0x00, 0xe2, 0x01, 0xef, 0x00, 0x36, 0xf1, 0x8f, 0x0f, 0x00, 0x02,
+ 0xf5, 0xce, 0xfd, 0x12,
+ 0x74, 0x01, 0xe0, 0x14, 0x20, 0x0e, 0xfd, 0xf1, 0x07, 0x23, 0x10, 0x01,
+ 0xc0, 0xe0, 0xcf, 0xf0,
+ 0x35, 0x40, 0xe0, 0xfd, 0x10, 0xf4, 0xb1, 0xfe, 0x0f, 0x40, 0x52, 0x10,
+ 0xff, 0xfb, 0xfe, 0x0d,
+ 0x2c, 0x74, 0x13, 0x0e, 0xff, 0x00, 0xd8, 0x00, 0x61, 0x00, 0xfe, 0xf1,
+ 0x02, 0x0e, 0xfc, 0xff,
+ 0x00, 0x0e, 0xfe, 0x03, 0x00, 0x38, 0x7e, 0x30, 0x10, 0x0e, 0x10, 0x22,
+ 0xfc, 0xfe, 0x20, 0x0f,
+ 0xbd, 0x0b, 0x3f, 0xe0, 0xaf, 0x0e, 0x0b, 0x0f, 0x00, 0x13, 0xd0, 0x23,
+ 0x73, 0xf8, 0xce, 0x33,
+ 0x24, 0xf1, 0xd1, 0x13, 0x20, 0xfe, 0x00, 0xf2, 0x8d, 0xdf, 0x04, 0x22,
+ 0x0c, 0xba, 0x01, 0x44,
+ 0x01, 0xf2, 0xff, 0xcd, 0xff, 0x14, 0x23, 0xd0, 0x92, 0x02, 0x0d, 0x1f,
+ 0x1c, 0x36, 0x13, 0x0e,
+ 0xd0, 0x02, 0x77, 0x01, 0xef, 0x00, 0x21, 0x04, 0xe1, 0xd0, 0x1f, 0x0f,
+ 0x22, 0x35, 0x80, 0x0e,
+ 0x00, 0x01, 0xef, 0x12, 0x42, 0xeb, 0xff, 0x62, 0x10, 0x0f, 0xfe, 0x0e,
+ 0x2e, 0x3f, 0x31, 0x45,
+ 0x0d, 0xca, 0xfe, 0xf0, 0x37, 0x71, 0x0e, 0xdd, 0x0e, 0x00, 0x01, 0x03,
+ 0xee, 0xac, 0x10, 0x31,
+ 0x2d, 0xeb, 0x0f, 0x1f, 0x60, 0x20, 0x00, 0x11, 0x00, 0xe8, 0x00, 0x1e,
+ 0x1f, 0x20, 0xdf, 0xbd,
+ 0x0e, 0x1d, 0x00, 0xb0, 0xfe, 0x1d, 0x72, 0x04, 0xee, 0xe0, 0x16, 0x33,
+ 0x10, 0x11, 0xf7, 0xd2,
+ 0xe1, 0xde, 0x2f, 0x11, 0x80, 0xcd, 0x13, 0x35, 0x0e, 0x13, 0x00, 0xdb,
+ 0xf2, 0xf6, 0xc0, 0xcf,
+ 0xf0, 0x10, 0x12, 0xc0, 0xc0, 0xe3, 0xf0, 0x1f, 0x70, 0x37, 0xf2, 0xcd,
+ 0x11, 0x23, 0x01, 0xd3,
+ 0x05, 0x32, 0x02, 0xf0, 0x00, 0x04, 0xe0, 0xc0, 0x00, 0x30, 0x37, 0x82,
+ 0xf0, 0x0d, 0x11, 0xdf,
+ 0xf1, 0x57, 0x1e, 0x0f, 0x30, 0xf0, 0xd9, 0x20, 0x72, 0x30, 0xf0, 0xf0,
+ 0x00, 0x3e, 0x1d, 0x30,
+ 0x22, 0xc0, 0xce, 0x0f, 0x1f, 0x1f, 0xfe, 0x8a, 0x00, 0x22, 0xfc, 0xd9,
+ 0x70, 0x12, 0x0d, 0xef,
+ 0x20, 0x20, 0x00, 0x2d, 0x1e, 0x0f, 0x0e, 0x0f, 0xec, 0xd8, 0x40, 0x1f,
+ 0xd0, 0xe0, 0x0b, 0xef,
+ 0x9f, 0xf1, 0x51, 0x30, 0xfd, 0xd1, 0x06, 0x30, 0x11, 0xe1, 0xf2, 0x00,
+ 0x0e, 0xbf, 0x16, 0xe0,
+ 0x9f, 0x0f, 0x10, 0x12, 0xf3, 0x00, 0xfd, 0xde, 0x10, 0x46, 0xf2, 0x80,
+ 0xce, 0x15, 0x12, 0xff,
+ 0xed, 0xf0, 0x00, 0x21, 0x33, 0x26, 0xdf, 0xf0, 0x04, 0x02, 0xe0, 0x60,
+ 0x25, 0x02, 0x00, 0xd0,
+ 0xd2, 0xf6, 0xd0, 0x0e, 0x71, 0x35, 0xe0, 0x8f, 0x0f, 0xf1, 0x04, 0x10,
+ 0x1e, 0x1f, 0x20, 0x00,
+ 0xe0, 0x00, 0x2e, 0x1f, 0x1e, 0x74, 0x10, 0xf8, 0x0f, 0x20, 0x32, 0x21,
+ 0xfe, 0xeb, 0x20, 0x01,
+ 0xb0, 0x10, 0x00, 0xae, 0xfc, 0x0f, 0x2e, 0x00, 0xec, 0x3e, 0x7c, 0x2c,
+ 0x14, 0x26, 0xe0, 0xeb,
+ 0x2f, 0x70, 0x0f, 0xf0, 0x11, 0xff, 0xde, 0x00, 0x2f, 0xfd, 0xed, 0xdd,
+ 0x00, 0x32, 0xed, 0x1d,
+ 0x75, 0x23, 0x00, 0x04, 0xf2, 0xbe, 0x0e, 0x02, 0xf2, 0x06, 0xe1, 0xb0,
+ 0xfe, 0xdd, 0x44, 0x54,
+ 0x00, 0xdd, 0x00, 0x03, 0xe1, 0xd3, 0xe4, 0xcf, 0xe1, 0xe3, 0x80, 0xf0,
+ 0x03, 0x36, 0x1e, 0xca,
+ 0x03, 0x57, 0xf0, 0xce, 0x11, 0x43, 0x01, 0xef, 0xe0, 0x15, 0x31, 0x12,
+ 0x11, 0xc0, 0xf0, 0xf0,
+ 0x21, 0x16, 0xe2, 0xa0, 0xff, 0x0d, 0x01, 0x36, 0x11, 0x0f, 0x1f, 0x0f,
+ 0xdd, 0x00, 0x61, 0x10,
+ 0x22, 0x35, 0x2f, 0x3b, 0x1f, 0xed, 0x21, 0x72, 0x43, 0x00, 0xec, 0xff,
+ 0xee, 0xee, 0x03, 0xf0,
+ 0x98, 0x10, 0x30, 0x0f, 0xec, 0xff, 0x30, 0x72, 0x3f, 0x2f, 0x0d, 0xdc,
+ 0x00, 0x2f, 0x4d, 0x21,
+ 0x45, 0xd9, 0xbc, 0x00, 0x11, 0xe0, 0xfe, 0x1c, 0xef, 0x00, 0x71, 0x01,
+ 0x1f, 0x0f, 0xf0, 0x04,
+ 0x11, 0x02, 0x03, 0xb0, 0xf0, 0x1e, 0xfc, 0xe4, 0x37, 0xb0, 0xff, 0x70,
+ 0x0f, 0xdd, 0x24, 0x04,
+ 0xef, 0xff, 0xf3, 0xc0, 0xd0, 0x0e, 0x02, 0x07, 0xc0, 0x9d, 0x0f, 0x42,
+ 0x04, 0x01, 0xff, 0xff,
+ 0x04, 0x13, 0xf0, 0x30, 0x32, 0xf6, 0xe0, 0x00, 0x01, 0xd0, 0x03, 0x15,
+ 0x32, 0xb0, 0x8e, 0x02,
+ 0x07, 0x31, 0xde, 0xf0, 0x0f, 0x0e, 0x41, 0x12, 0x02, 0xf1, 0xb0, 0x08,
+ 0x50, 0x2f, 0x10, 0x33,
+ 0x4f, 0x0e, 0xee, 0xfe, 0x22, 0x03, 0xee, 0x20, 0x70, 0xfc, 0x98, 0x00,
+ 0x0f, 0x0e, 0x01, 0x43,
+ 0xfc, 0xec, 0x11, 0x20, 0x0e, 0x20, 0x50, 0xfb, 0x0d, 0x11, 0x23, 0x00,
+ 0xff, 0x0e, 0xc8, 0xfb,
+ 0x30, 0xf1, 0xaf, 0x1f, 0x2f, 0xfe, 0xf0, 0x32, 0x62, 0x0f, 0xde, 0x0f,
+ 0x01, 0x14, 0x02, 0xc2,
+ 0x06, 0x00, 0x0f, 0xce, 0x0e, 0x31, 0x01, 0xd1, 0x27, 0x62, 0xcd, 0xfe,
+ 0x22, 0xd3, 0xbf, 0x00,
+ 0x16, 0xc0, 0xdd, 0x00, 0x22, 0xf5, 0xcf, 0x0f, 0x30, 0x23, 0xc0, 0xd0,
+ 0x00, 0x15, 0x45, 0x10,
+ 0x00, 0x1e, 0x41, 0x04, 0xb1, 0xe2, 0xd1, 0x0f, 0x72, 0x26, 0xc0, 0xd1,
+ 0x01, 0x21, 0x2f, 0x01,
+ 0x02, 0xaf, 0xfe, 0x13, 0x33, 0xfb, 0xff, 0x22, 0x51, 0x0c, 0x0c, 0x1e,
+ 0x2e, 0x20, 0x47, 0x20,
+ 0x0c, 0xe1, 0x15, 0xff, 0xbd, 0x0f, 0x0f, 0xef, 0xe0, 0x10, 0x30, 0xf0,
+ 0xce, 0x0c, 0x3b, 0x7f,
+ 0x40, 0x00, 0x31, 0x30, 0x0f, 0x10, 0x08, 0x1e, 0x10, 0x00, 0x02, 0xcd,
+ 0x89, 0xef, 0x3f, 0x1e,
+ 0xf0, 0x42, 0x1f, 0xdc, 0x00, 0x60, 0x00, 0xf3, 0x04, 0x01, 0xdf, 0xfb,
+ 0x00, 0x03, 0xb2, 0x02,
+ 0x30, 0x0b, 0xf1, 0x22, 0x2f, 0xde, 0xb1, 0xf5, 0x03, 0xf2, 0x8d, 0xec,
+ 0xe0, 0x03, 0x14, 0xd0,
+ 0xee, 0x00, 0x31, 0x01, 0x80, 0xf5, 0x05, 0x2f, 0x1d, 0x01, 0xf6, 0x01,
+ 0x30, 0x1f, 0x10, 0x01,
+ 0xc7, 0xd1, 0xe0, 0xe0, 0x31, 0x41, 0xd0, 0xed, 0xa1, 0x06, 0x33, 0xde,
+ 0x9d, 0x10, 0x33, 0x01,
+ 0xa0, 0x00, 0x0e, 0x2a, 0x41, 0x21, 0x11, 0x1f, 0xff, 0xf1, 0x51, 0x5d,
+ 0x0d, 0xfe, 0xd1, 0x10,
+ 0x11, 0x03, 0xfd, 0xd8, 0xfe, 0xfd, 0xef, 0x0e, 0x11, 0x4e, 0xf8, 0x50,
+ 0x61, 0x00, 0x0d, 0x20,
+ 0x00, 0x00, 0x73, 0x0b, 0xfa, 0xf0, 0xff, 0x0e, 0xfe, 0xf0, 0x0e, 0x0c,
+ 0x2f, 0x2f, 0x0e, 0x30,
+ 0x0f, 0xf0, 0xdd, 0x65, 0x23, 0x90, 0xe3, 0x01, 0x2f, 0x2f, 0xdf, 0xc0,
+ 0x24, 0x00, 0x50, 0x17,
+ 0xf6, 0xcf, 0x00, 0x0f, 0x0f, 0x03, 0xd4, 0xaf, 0x0f, 0x01, 0xe0, 0xdf,
+ 0x14, 0x33, 0xce, 0xcc,
+ 0x02, 0x20, 0xf4, 0x07, 0x13, 0x30, 0x1c, 0x20, 0x00, 0xc3, 0xd3, 0x05,
+ 0x30, 0xf0, 0x01, 0x34,
+ 0x80, 0xee, 0x33, 0x43, 0xc0, 0xcf, 0x14, 0x35, 0xc0, 0xee, 0x11, 0x00,
+ 0xd0, 0xdf, 0x0f, 0x7f,
+ 0x53, 0x27, 0x0d, 0x0d, 0x0e, 0x03, 0x35, 0x2f, 0x4b, 0x00, 0x00, 0x01,
+ 0xdf, 0x00, 0xf2, 0xb0,
+ 0x08, 0x00, 0x0e, 0xf0, 0xc0, 0xf0, 0x4f, 0x7f, 0x31, 0xff, 0x0c, 0x31,
+ 0x50, 0xee, 0x00, 0x00,
+ 0x0a, 0x1d, 0x20, 0xcc, 0xdf, 0xff, 0x0b, 0x4f, 0x6f, 0x00, 0xdc, 0x0d,
+ 0x21, 0x22, 0x23, 0x03,
+ 0xba, 0xee, 0x01, 0x14, 0x00, 0xc0, 0x10, 0x01, 0x0d, 0x21, 0x54, 0x03,
+ 0xe0, 0x0d, 0xdf, 0xd4,
+ 0xd5, 0x02, 0x0f, 0x0e, 0xe0, 0x8e, 0xb0, 0x06, 0xf1, 0xf0, 0x13, 0x11,
+ 0xff, 0xb0, 0xff, 0x10,
+ 0x37, 0x06, 0x0e, 0x4e, 0x12, 0xd3, 0xc2, 0x01, 0x02, 0x00, 0x02, 0x00,
+ 0x2f, 0x45, 0xf4, 0xb1,
+ 0xf2, 0xe2, 0x02, 0x00, 0xce, 0x00, 0xe0, 0x00, 0xc1, 0xf4, 0x77, 0x2e,
+ 0xda, 0x30, 0x73, 0x00,
+ 0x0c, 0x20, 0x20, 0x11, 0x02, 0x11, 0x0d, 0xda, 0x41, 0x42, 0xbe, 0xdd,
+ 0x02, 0x0f, 0x0a, 0x20,
+ 0xf0, 0xb0, 0x0c, 0x51, 0x22, 0x30, 0x0f, 0xeb, 0x20, 0x40, 0x00, 0x00,
+ 0xef, 0xed, 0x0c, 0x1d,
+ 0x3e, 0xdc, 0xae, 0x0f, 0x2e, 0x7d, 0x1b, 0xfc, 0xef, 0x04, 0x33, 0xff,
+ 0xde, 0x00, 0x10, 0xe1,
+ 0xc6, 0x00, 0x0e, 0x7e, 0x21, 0xe2, 0xd1, 0x13, 0x23, 0xf0, 0xee, 0x03,
+ 0xd1, 0xd3, 0x17, 0x20,
+ 0xd0, 0x83, 0xe0, 0xcc, 0xe0, 0xc7, 0x03, 0x1e, 0x3f, 0xf2, 0x90, 0x00,
+ 0x34, 0x01, 0xf4, 0x33,
+ 0x0d, 0xcf, 0x07, 0x05, 0x00, 0x0f, 0x00, 0x53, 0x23, 0xd0, 0xc0, 0xe4,
+ 0x04, 0x41, 0x11, 0xdf,
+ 0xbe, 0x02, 0xf0, 0xbb, 0x25, 0x44, 0xee, 0x0f, 0x30, 0x0e, 0xf0, 0x30,
+ 0x3f, 0x0e, 0x75, 0x74,
+ 0xfc, 0xdd, 0x01, 0x23, 0x10, 0x0e, 0x0f, 0x0e, 0xcb, 0xf0, 0x00, 0xe0,
+ 0x1d, 0x3f, 0x20, 0x00,
+ 0x3f, 0x4d, 0x1b, 0x2f, 0x22, 0x35, 0x0f, 0xca, 0x2f, 0x0f, 0xe0, 0xde,
+ 0xdd, 0xbd, 0xff, 0x7e,
+ 0x4b, 0x0d, 0x0f, 0x11, 0xed, 0xdb, 0x23, 0x15, 0xdf, 0xcd, 0x2f, 0x10,
+ 0xf2, 0x02, 0x31, 0xb0,
+ 0xef, 0x30, 0x2d, 0xe0, 0x04, 0x56, 0x04, 0xc1, 0x0f, 0xec, 0xf1, 0x81,
+ 0xf0, 0x0e, 0xe6, 0xc2,
+ 0xe0, 0xee, 0xf0, 0xf1, 0x00, 0x20, 0xc3, 0xe1, 0x42, 0x01, 0x02, 0xe7,
+ 0x11, 0x1f, 0x60, 0x27,
+ 0xd1, 0xb0, 0x0f, 0x23, 0x01, 0x35, 0x41, 0x90, 0x01, 0x03, 0xee, 0x01,
+ 0xf4, 0xdf, 0xf0, 0x27,
+ 0xf0, 0xde, 0x10, 0x30, 0x7f, 0x41, 0x0f, 0xdd, 0x34, 0x53, 0x0f, 0xfa,
+ 0x20, 0x42, 0x00, 0xee,
+ 0x11, 0x00, 0xde, 0xeb, 0x00, 0x0f, 0xcc, 0xe0, 0x0f, 0x0d, 0x6e, 0x32,
+ 0x20, 0x1e, 0x6f, 0x1e,
+ 0x0a, 0xf0, 0x35, 0x00, 0xdd, 0xac, 0x1e, 0x4f, 0x0b, 0xec, 0x10, 0x2f,
+ 0x0d, 0x1f, 0x20, 0xd9,
+ 0x0f, 0x10, 0x10, 0xd3, 0xdf, 0x30, 0xa0, 0xc0, 0x3e, 0x3d, 0x00, 0xe6,
+ 0x00, 0x01, 0x75, 0x00,
+ 0xac, 0x00, 0x11, 0x11, 0x12, 0x03, 0xfd, 0xad, 0xf1, 0x06, 0xe2, 0xf1,
+ 0xe0, 0xff, 0x10, 0x00,
+ 0xbc, 0xbf, 0x04, 0x37, 0x23, 0x0f, 0xfd, 0xde, 0x0f, 0x25, 0x02, 0xd2,
+ 0x20, 0x71, 0x00, 0x00,
+ 0xe3, 0xf2, 0x01, 0x47, 0x01, 0xa0, 0x00, 0x00, 0xf2, 0xd2, 0xf0, 0xe1,
+ 0x00, 0x70, 0x04, 0x0e,
+ 0x2e, 0xfd, 0xfe, 0x12, 0x57, 0x12, 0x4d, 0x0b, 0x20, 0x00, 0x16, 0x00,
+ 0x0d, 0xed, 0xd2, 0xc5,
+ 0xbe, 0x0c, 0x3f, 0x01, 0xd1, 0xbf, 0x1c, 0x70, 0x62, 0x01, 0xd0, 0x0d,
+ 0xfc, 0x15, 0x34, 0x1e,
+ 0x0b, 0xdf, 0xef, 0x02, 0x11, 0x4e, 0x0b, 0x00, 0xd0, 0x1f, 0x4e, 0x20,
+ 0xdf, 0xb2, 0x21, 0x3b,
+ 0xf0, 0xa0, 0xf2, 0x10, 0x7c, 0x0e, 0xef, 0xe7, 0x06, 0x4f, 0x1e, 0xe0,
+ 0xee, 0x00, 0x40, 0x23,
+ 0xe3, 0xcb, 0x0e, 0x11, 0x01, 0xf2, 0xb0, 0x00, 0x0f, 0x1f, 0x05, 0x05,
+ 0x88, 0x00, 0xa4, 0x00,
+ 0x6a, 0xec, 0xb1, 0x07, 0x5a, 0xef, 0xc1, 0x01, 0xd2, 0x6a, 0x1e, 0xff,
+ 0xc5, 0xf3, 0x22, 0x6f,
+ 0x0b, 0xf0, 0xe1, 0x01, 0x02, 0xf2, 0xa0, 0xde, 0x00, 0x25, 0x20, 0x02,
+ 0x00, 0x44, 0x72, 0x0e,
+ 0x1e, 0x03, 0xb4, 0x00, 0x0d, 0x1f, 0x0f, 0xe5, 0x02, 0x0d, 0x0d, 0xfe,
+ 0xff, 0x61, 0x37, 0x26,
+ 0x0e, 0x0e, 0x0f, 0x40, 0x11, 0xe3, 0xe0, 0x0c, 0xfe, 0x10, 0x21, 0x9f,
+ 0xdd, 0x20, 0x2f, 0x28,
+ 0x10, 0xcf, 0xf0, 0x14, 0x40, 0x0b, 0xd0, 0x02, 0xf0, 0x2f, 0x2b, 0x50,
+ 0x1f, 0xd0, 0xc0, 0x10,
+ 0x4e, 0x2c, 0xff, 0x91, 0xf7, 0xe0, 0xfc, 0x00, 0x40, 0x21, 0x00, 0xe3,
+ 0x0f, 0xec, 0x0f, 0x00,
+ 0x02, 0xd1, 0xc1, 0xc0, 0x2d, 0x40, 0x7f, 0x23, 0xf1, 0xc2, 0xb6, 0x00,
+ 0x10, 0x30, 0x21, 0xd2,
+ 0xe2, 0x04, 0xe0, 0xcb, 0xe0, 0xe3, 0xd1, 0xff, 0x30, 0x74, 0x11, 0x24,
+ 0x33, 0x00, 0x00, 0x07,
+ 0xf6, 0x02, 0x20, 0x0f, 0x1f, 0x21, 0xf2, 0x90, 0xb0, 0xe5, 0x03, 0x00,
+ 0x4b, 0xff, 0xdf, 0xf0,
+ 0x02, 0x20, 0x5d, 0x12, 0x07, 0x00, 0xdd, 0x0d, 0x70, 0x10, 0x12, 0x13,
+ 0x1e, 0x38, 0x10, 0xff,
+ 0xd0, 0xe2, 0xe1, 0x0e, 0x29, 0x2f, 0xe0, 0xb0, 0xe0, 0xe1, 0x0f, 0x7b,
+ 0x20, 0x1f, 0x50, 0x22,
+ 0x03, 0x8e, 0xfd, 0x00, 0x00, 0x04, 0x02, 0xe0, 0x0e, 0x2c, 0x5b, 0x00,
+ 0xde, 0x00, 0xe1, 0x05,
+ 0x00, 0x0f, 0x2d, 0x3e, 0x00, 0xe2, 0xc4, 0xc6, 0xf2, 0xff, 0x1c, 0x2f,
+ 0x53, 0x33, 0xf3, 0xe1,
+ 0xd0, 0x00, 0x00, 0xc1, 0x82, 0xe2, 0x07, 0x02, 0x10, 0x7e, 0x00, 0xff,
+ 0xe2, 0xf6, 0x22, 0x41,
+ 0x32, 0x02, 0xf0, 0xd0, 0xdc, 0x00, 0x04, 0x34, 0x33, 0x4d, 0x0a, 0x9f,
+ 0x00, 0x00, 0x50, 0x33,
+ 0x0f, 0x0b, 0xe0, 0xf3, 0x02, 0xf1, 0x0f, 0x1a, 0xff, 0x10, 0x3f, 0x10,
+ 0x23, 0xb0, 0xb8, 0x0f,
+ 0x70, 0x20, 0x0e, 0xf0, 0xe1, 0x00, 0x0c, 0x0f, 0x2f, 0x30, 0x2d, 0x00,
+ 0x0f, 0x4c, 0xcc, 0xdc,
+ 0xee, 0xc0, 0xc1, 0xf6, 0xe0, 0x50, 0x4c, 0xef, 0xff, 0x02, 0xe0, 0xe0,
+ 0x02, 0x12, 0x1f, 0xfb,
+ 0xfe, 0x50, 0x14, 0x01, 0xe3, 0xbd, 0xdb, 0xe0, 0xd1, 0x21, 0x52, 0x30,
+ 0x0e, 0x00, 0xb2, 0xd5,
+ 0xe0, 0xd0, 0xd0, 0xd6, 0x01, 0xe3, 0x00, 0x19, 0xd0, 0x2e, 0x73, 0x67,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x23, 0x22, 0x00, 0xf1, 0xd0, 0x01, 0xf0, 0xf0, 0xe0, 0xf3, 0x00,
+ 0x79, 0x7f, 0x20, 0x00,
+ 0xb2, 0xf0, 0x03, 0x02, 0x1a, 0x1d, 0x20, 0x03, 0xe1, 0xd0, 0x0e, 0x20,
+ 0x3c, 0x7f, 0x10, 0x03,
+ 0x27, 0x10, 0x0f, 0xee, 0xff, 0xc1, 0xd1, 0xd1, 0x20, 0x7f, 0x0b, 0x2c,
+ 0x0c, 0xee, 0xf0, 0xf1,
+ 0xe7, 0x10, 0x2f, 0x4d, 0x4f, 0x22, 0xc4, 0xe1, 0xf0, 0xed, 0xee, 0xf0,
+ 0xe0, 0xe0, 0x2e, 0x7f,
+ 0x6f, 0x01, 0x03, 0xd9, 0xde, 0x00, 0x05, 0x23, 0x73, 0x1f, 0x18, 0xf0,
+ 0xf0, 0xf0, 0x05, 0x01,
+ 0xe0, 0xef, 0xfd, 0xd0, 0xb0, 0xe1, 0xf1, 0x00, 0x4d, 0x4f, 0x00, 0xd0,
+ 0xb1, 0xe7, 0x41, 0x51,
+ 0x2e, 0x0e, 0x03, 0xd7, 0xe2, 0xf0, 0xff, 0x2e, 0x40, 0x50, 0x00, 0x02,
+ 0xf1, 0xf0, 0x2b, 0x50,
+ 0x10, 0xf1, 0xd0, 0x03, 0x1f, 0x1a, 0x0f, 0xe0, 0x90, 0xf0, 0xe0, 0x20,
+ 0x40, 0x5e, 0x0a, 0x0d,
+ 0xff, 0xc2, 0x04, 0x02, 0x12, 0x4c, 0x3c, 0xfd, 0xb0, 0x13, 0x00, 0x2b,
+ 0x1e, 0x0f, 0xd1, 0xf3,
+ 0x03, 0xeb, 0x0f, 0x41, 0x25, 0xe2, 0x8e, 0xed, 0xff, 0x00, 0x15, 0x60,
+ 0x23, 0x00, 0x00, 0x0d,
+ 0xd0, 0x12, 0x12, 0x07, 0x06, 0xff, 0x0e, 0x0f, 0x40, 0x00, 0x01, 0x03,
+ 0xe0, 0xf1, 0x2f, 0xf0,
+ 0x80, 0xa4, 0x02, 0x0f, 0x0f, 0x00, 0x00, 0xe4, 0xe2, 0xee, 0x00, 0x2f,
+ 0x70, 0x1f, 0x30, 0x05,
+ 0x07, 0xd4, 0xef, 0x0f, 0x01, 0x00, 0x0e, 0x10, 0x1e, 0x00, 0xf0, 0x11,
+ 0x5c, 0x28, 0x3d, 0x7f,
+ 0x44, 0x01, 0x0c, 0x0d, 0xdf, 0x00, 0xc3, 0x03, 0x0e, 0x39, 0x7f, 0x1f,
+ 0x0e, 0x00, 0xff, 0xf0,
+ 0x03, 0x02, 0xfe, 0xfb, 0x2e, 0x5e, 0x11, 0xe1, 0xd3, 0xe0, 0x08, 0xcc,
+ 0xcd, 0xf1, 0x13, 0x11,
+ 0x10, 0x4f, 0x0b, 0x9f, 0xde, 0xf4, 0xe5, 0xd1, 0x0f, 0x7f, 0x3f, 0xff,
+ 0xb2, 0xe3, 0x07, 0xe0,
+ 0xff, 0x00, 0x0f, 0xe1, 0xd1, 0xd2, 0x21, 0x71, 0x5f, 0x1f, 0x04, 0xf7,
+ 0xc2, 0xff, 0x0e, 0x01,
+ 0x21, 0xf0, 0xc1, 0xe2, 0xc1, 0xf0, 0xff, 0xfd, 0x0e, 0x2d, 0x10, 0xf5,
+ 0x12, 0x52, 0x32, 0x00,
+ 0xf2, 0xc2, 0xf7, 0xf7, 0xf0, 0x4f, 0x5e, 0x00, 0xc0, 0xe1, 0x00, 0x00,
+ 0x4b, 0x6e, 0x1d, 0x1f,
+ 0xff, 0xed, 0x0e, 0x00, 0x10, 0x1f, 0x0a, 0xfe, 0x0d, 0x0d, 0x3c, 0x70,
+ 0x60, 0x01, 0xdb, 0xfd,
+ 0x0f, 0x20, 0x13, 0x34, 0x2f, 0x3d, 0x0e, 0xc9, 0xf0, 0x0f, 0x0e, 0x30,
+ 0x31, 0x3d, 0x0d, 0xad,
+ 0xff, 0xf1, 0x04, 0x00, 0xed, 0xf1, 0x05, 0xff, 0x0c, 0x20, 0x23, 0x60,
+ 0x23, 0x14, 0xc4, 0xb5,
+ 0xf0, 0x0f, 0x2e, 0x42, 0x37, 0x14, 0x01, 0x10, 0x20, 0xf2, 0xa4, 0xe2,
+ 0xb0, 0x0f, 0x01, 0x06,
+ 0x01, 0xa2, 0xf0, 0xdf, 0xf0, 0xe0, 0xf2, 0x14, 0x20, 0x20, 0x0e, 0xf0,
+ 0xd5, 0x02, 0x10, 0x40,
+ 0x32, 0xe6, 0xc1, 0xf0, 0xde, 0x8e, 0xf2, 0xe7, 0x03, 0xf0, 0x0c, 0x1f,
+ 0x4f, 0x3f, 0x3f, 0x20,
+ 0x02, 0xa1, 0xee, 0x08, 0x0f, 0x20, 0x10, 0x20, 0x2e, 0x6d, 0x3d, 0x2c,
+ 0xfd, 0xaf, 0xf0, 0x02,
+ 0x1f, 0x5b, 0x3f, 0x4f, 0xff, 0xd0, 0xff, 0x1b, 0x4e, 0x5e, 0x2e, 0x2f,
+ 0xff, 0xe0, 0x00, 0x1d,
+ 0x3d, 0x10, 0x04, 0xf0, 0xcf, 0xed, 0x10, 0x6e, 0x30, 0x30, 0x07, 0xb7,
+ 0xd0, 0xe2, 0xf1, 0xfe,
+ 0x0d, 0x41, 0x15, 0xf5, 0xd2, 0x00, 0x40, 0x50, 0x01, 0x02, 0xf3, 0x04,
+ 0x54, 0x10, 0x32, 0x04,
+ 0xa2, 0xf5, 0xc1, 0xd2, 0xe1, 0x01, 0x10, 0x10, 0xe0, 0x8e, 0xf0, 0x07,
+ 0x32, 0x22, 0x0e, 0x1e,
+ 0xf1, 0x04, 0xe7, 0xf2, 0x03, 0xe0, 0xf0, 0xef, 0xc0, 0x03, 0x00, 0x7d,
+ 0x2e, 0x0e, 0x0d, 0xdd,
+ 0xce, 0xff, 0xfc, 0x0f, 0x42, 0x3d, 0x18, 0x0d, 0xe0, 0xe0, 0xfc, 0x1d,
+ 0x2c, 0x70, 0x21, 0x02,
+ 0xd9, 0x0d, 0x5f, 0x3f, 0x30, 0x02, 0xfd, 0x08, 0x3f, 0x3d, 0x60, 0x2f,
+ 0x1f, 0x0e, 0x0f, 0x00,
+ 0xdf, 0xfe, 0x0a, 0x1f, 0x1d, 0x30, 0x72, 0x41, 0x20, 0xee, 0xfc, 0xd1,
+ 0xa2, 0xe1, 0xff, 0x00,
+ 0x20, 0x45, 0x00, 0xb0, 0xe2, 0xe2, 0x03, 0x33, 0x43, 0x31, 0xf0, 0xc2,
+ 0xf3, 0x05, 0x07, 0xe7,
+ 0x82, 0xd1, 0xde, 0xee, 0x00, 0x00, 0xe4, 0xb1, 0xf2, 0x02, 0x4f, 0x1f,
+ 0x20, 0x03, 0x07, 0x03,
+ 0xf4, 0xb1, 0xd0, 0xe2, 0xd4, 0xe3, 0xf4, 0xd0, 0x00, 0x71, 0x31, 0x2f,
+ 0xf0, 0xd2, 0xb0, 0x00,
+ 0x13, 0x26, 0x61, 0x0d, 0x0d, 0xfc, 0xe0, 0x10, 0x21, 0x0c, 0x5b, 0x2e,
+ 0xfd, 0xef, 0xef, 0x10,
+ 0x50, 0x2b, 0x30, 0x04, 0xc0, 0x0d, 0x09, 0x40, 0x4d, 0x5f, 0x00, 0x03,
+ 0x00, 0x0a, 0x0f, 0x2e,
+ 0x0f, 0x1e, 0x0f, 0x0e, 0x2f, 0x50, 0x2e, 0x0b, 0xee, 0xdf, 0xf1, 0xe3,
+ 0xe0, 0x0b, 0x1d, 0x4f,
+ 0xdf, 0xa0, 0xc6, 0xd2, 0x01, 0x2f, 0x7d, 0x3f, 0x00, 0xf0, 0xf6, 0xf4,
+ 0x03, 0x30, 0xff, 0xbe,
+ 0xe1, 0xa3, 0xf4, 0xd3, 0x00, 0xef, 0xee, 0xc2, 0xe5, 0xf2, 0xfe, 0x0c,
+ 0x7f, 0x12, 0x16, 0xe2,
+ 0xd1, 0xd1, 0x00, 0x05, 0x05, 0x62, 0x11, 0x10, 0xef, 0xf0, 0x03, 0x03,
+ 0x12, 0xf0, 0xe1, 0xe0,
+ 0xd0, 0x00, 0xfe, 0x3f, 0x7e, 0x14, 0x13, 0x0e, 0x08, 0x1e, 0x5e, 0x30,
+ 0x20, 0x00, 0x00, 0x05,
+ 0x30, 0x5f, 0x29, 0x1f, 0xf0, 0xd0, 0x3e, 0x7e, 0x7d, 0x3f, 0x0f, 0xd0,
+ 0xff, 0x0c, 0x1e, 0x20,
+ 0x3c, 0x0c, 0x1d, 0x0d, 0x00, 0x21, 0x04, 0x32, 0x4d, 0x18, 0xfe, 0xdf,
+ 0x0e, 0x20, 0x0e, 0xa0,
+ 0xc5, 0xa0, 0xdd, 0x0d, 0x1d, 0x50, 0x11, 0xf5, 0xf0, 0x0f, 0x3e, 0x02,
+ 0x17, 0x00, 0xd0, 0xde,
+ 0xc2, 0xd5, 0xd2, 0x90, 0xdd, 0xc0, 0xe3, 0xe2, 0xe2, 0x10, 0x60, 0x2c,
+ 0x0e, 0xc0, 0xe4, 0xe7,
+ 0x02, 0xd0, 0x11, 0x13, 0x22, 0xd3, 0x91, 0xf0, 0x01, 0x07, 0x31, 0x01,
+ 0x9e, 0x0f, 0x01, 0x01,
+ 0x10, 0x41, 0x03, 0x01, 0x04, 0xe0, 0x0e, 0x0a, 0x0e, 0x20, 0x20, 0x02,
+ 0x10, 0xe0, 0xec, 0x0f,
+ 0x2f, 0x01, 0x00, 0x2e, 0x70, 0x70, 0x5a, 0x10, 0x0f, 0x0b, 0x02, 0x07,
+ 0x11, 0x1e, 0x2b, 0x2e,
+ 0x3e, 0x3f, 0xf0, 0xc2, 0x00, 0x3c, 0x6e, 0x2e, 0x30, 0x00, 0xce, 0xff,
+ 0x00, 0x24, 0x01, 0xc0,
+ 0xde, 0xaf, 0xfe, 0x0d, 0x20, 0x74, 0x11, 0x0c, 0xfe, 0xf3, 0x02, 0x30,
+ 0x2e, 0x23, 0x06, 0xd0,
+ 0xc0, 0xde, 0x84, 0xf1, 0xe0, 0x07, 0x01, 0x0f, 0xfe, 0xfd, 0x08, 0x0e,
+ 0x2f, 0x22, 0xc7, 0xd1,
+ 0xe2, 0x20, 0x3e, 0x40, 0x03, 0xa6, 0x03, 0xf2, 0x0f, 0x1e, 0x00, 0x02,
+ 0xb0, 0xff, 0xe2, 0x05,
+ 0x41, 0x20, 0xee, 0xbe, 0xfe, 0xcd, 0x0e, 0x1e, 0x6c, 0x3b, 0x0f, 0xee,
+ 0xe0, 0x0f, 0x13, 0x24,
+ 0x2f, 0x1b, 0x0d, 0x10, 0x23, 0x12, 0x02, 0xf0, 0x2d, 0x3b, 0x0f, 0xd4,
+ 0x01, 0x7a, 0x7e, 0x1e,
+ 0x00, 0xe3, 0x06, 0x20, 0x3e, 0x4e, 0x30, 0x20, 0x01, 0x01, 0xf1, 0x01,
+ 0x0e, 0xcc, 0xb0, 0xd5,
+ 0xd2, 0xf0, 0xfa, 0x00, 0x5f, 0x01, 0xb0, 0x03, 0x03, 0x74, 0x30, 0x00,
+ 0x11, 0x04, 0xe1, 0xf0,
+ 0xc1, 0xd7, 0xe5, 0x00, 0xd0, 0xef, 0x0f, 0xc0, 0xef, 0x0d, 0x20, 0x2f,
+ 0x0f, 0xa0, 0xc0, 0x00,
+ 0x02, 0x10, 0x20, 0x27, 0x26, 0xd0, 0xa2, 0xe0, 0x1d, 0x1f, 0x11, 0x53,
+ 0x04, 0xf1, 0xe1, 0x00,
+ 0x21, 0x00, 0xcf, 0xef, 0x0b, 0x2e, 0x6a, 0x3e, 0x4e, 0x00, 0xd2, 0xc0,
+ 0xeb, 0xed, 0x00, 0x2e,
+ 0x5c, 0x0d, 0xdb, 0xf0, 0x02, 0x51, 0x30, 0x3b, 0x2e, 0x0e, 0x0f, 0x00,
+ 0x43, 0x41, 0x2f, 0xf9,
+ 0xf0, 0xd0, 0x93, 0xf0, 0x1d, 0x6e, 0x3f, 0x0f, 0xe0, 0xd4, 0xf2, 0x0d,
+ 0x3f, 0x37, 0xf4, 0xa0,
+ 0xe0, 0xc0, 0x0f, 0x0f, 0x11, 0x06, 0x03, 0x12, 0x3e, 0x2c, 0x70, 0x11,
+ 0x12, 0x01, 0xc4, 0xf4,
+ 0xe3, 0xd0, 0xe0, 0xf4, 0xc1, 0xd0, 0xc0, 0xe1, 0x15, 0x41, 0xf0, 0xde,
+ 0xeb, 0xdf, 0x00, 0x53,
+ 0x27, 0x30, 0x10, 0x0e, 0xa0, 0xf4, 0xf3, 0x1f, 0x3c, 0x6f, 0x00, 0x03,
+ 0xd2, 0xf0, 0x0f, 0x0f,
+ 0x0f, 0x00, 0x00, 0x5a, 0x2d, 0x0b, 0x3e, 0x5f, 0x20, 0x12, 0xd2, 0x0c,
+ 0x0a, 0x3f, 0x4d, 0x1f,
+ 0x1f, 0x11, 0x12, 0x50, 0x2d, 0x0e, 0x0c, 0x2d, 0x20, 0x60, 0x0f, 0xfc,
+ 0xff, 0xcd, 0x09, 0xfe,
+ 0xff, 0x11, 0x50, 0x7e, 0x3a, 0x3f, 0x00, 0xf0, 0xe0, 0xf6, 0x51, 0x11,
+ 0x0f, 0x0f, 0xe0, 0xa0,
+ 0xd3, 0xc3, 0xe1, 0x01, 0x14, 0x31, 0x10, 0xfd, 0xd3, 0x67, 0x33, 0x44,
+ 0x02, 0xf3, 0xd2, 0xf1,
+ 0xe3, 0xc4, 0x07, 0x03, 0xe1, 0xd0, 0xbe, 0xf0, 0xe0, 0x01, 0xef, 0x0f,
+ 0xe0, 0xf0, 0xf1, 0x27,
+ 0x46, 0xd0, 0x90, 0xff, 0x01, 0xf4, 0x11, 0x61, 0x30, 0x0f, 0xf0, 0xd2,
+ 0xd7, 0x12, 0x00, 0x0c,
+ 0x6f, 0x20, 0xf0, 0xde, 0x0f, 0x3f, 0x70, 0x1e, 0xfc, 0xee, 0xfb, 0x0e,
+ 0x3e, 0x1d, 0x5e, 0x1e,
+ 0x00, 0xdf, 0x0c, 0x0c, 0x5f, 0x30, 0x50, 0x0d, 0x0e, 0xfd, 0x0a, 0x0e,
+ 0x1e, 0x20, 0x15, 0x0f,
+ 0x0c, 0x2e, 0x4f, 0x1e, 0xff, 0x0f, 0xff, 0xf1, 0xf0, 0x60, 0x5c, 0x09,
+ 0xef, 0xee, 0xf4, 0xc4,
+ 0xd0, 0xb0, 0x0c, 0xe0, 0x00, 0x15, 0x41, 0x32, 0x10, 0x2e, 0x30, 0xf2,
+ 0xd5, 0xa1, 0xf3, 0xb2,
+ 0xf2, 0xf1, 0x04, 0x06, 0xd1, 0x92, 0xd0, 0xf0, 0x01, 0x0f, 0x10, 0xf3,
+ 0xd2, 0x02, 0xd2, 0xe3,
+ 0xe7, 0xe0, 0xe0, 0x10, 0x40, 0x23, 0x00, 0xf1, 0xf0, 0x37, 0xe3, 0x82,
+ 0xb2, 0xf0, 0x0f, 0x2f,
+ 0x40, 0x11, 0xe1, 0xf4, 0x10, 0x3b, 0x4c, 0x0c, 0x2f, 0x0e, 0x20, 0x1f,
+ 0x2b, 0x6b, 0x2d, 0x1e,
+ 0xf0, 0xf0, 0xf0, 0x0c, 0x7c, 0x7f, 0x2e, 0x0c, 0xce, 0x0e, 0x00, 0x21,
+ 0x10, 0x5a, 0x1e, 0xed,
+ 0xed, 0x0f, 0x00, 0x56, 0x3e, 0x1c, 0xff, 0x0f, 0x10, 0x31, 0x51, 0x10,
+ 0x0f, 0xde, 0xe0, 0xa3,
+ 0xe3, 0xe0, 0xfd, 0xfc, 0x00, 0x11, 0x02, 0x03, 0xfe, 0x48, 0x5f, 0x1f,
+ 0xf2, 0xe7, 0x03, 0x12,
+ 0x30, 0x03, 0xc4, 0xa4, 0xd1, 0xd2, 0xe0, 0x00, 0xff, 0xf0, 0xc2, 0xd4,
+ 0xc1, 0xf5, 0xf1, 0xf4,
+ 0xe1, 0x00, 0x00, 0x02, 0x37, 0x42, 0x21, 0xe2, 0xe2, 0xa2, 0xd1, 0xf0,
+ 0xe1, 0x34, 0x61, 0x11,
+ 0x01, 0xf1, 0xe0, 0x0e, 0x0d, 0x0f, 0x5e, 0x3f, 0x30, 0x0b, 0x0a, 0xfd,
+ 0xdb, 0x2f, 0x10, 0x70,
+ 0x30, 0x4e, 0x0a, 0x0e, 0x2d, 0x5f, 0x30, 0x11, 0x00, 0x0a, 0x4d, 0x3e,
+ 0x3d, 0x0f, 0xee, 0xce,
+ 0xfc, 0x4c, 0x5e, 0x1d, 0x1e, 0x0d, 0x4c, 0x7d, 0x2d, 0x10, 0x21, 0x0e,
+ 0xe8, 0xe0, 0xe0, 0xc1,
+ 0xd0, 0xe0, 0x0e, 0x50, 0x20, 0x0f, 0xb3, 0x05, 0x3f, 0x2d, 0x3f, 0x00,
+ 0xf4, 0xc7, 0xf3, 0xf3,
+ 0xf1, 0xe1, 0xc0, 0xc3, 0xb5, 0xf1, 0xef, 0x0f, 0x20, 0x14, 0xd3, 0x95,
+ 0xf2, 0xf0, 0x01, 0x00,
+ 0xf4, 0xf3, 0xf3, 0xe3, 0xf5, 0x13, 0x31, 0x00, 0x84, 0xe3, 0xd5, 0x01,
+ 0x14, 0x53, 0x20, 0xef,
+ 0xc0, 0xf6, 0x03, 0x02, 0x5f, 0x3e, 0x0f, 0xef, 0xf1, 0x01, 0x0f, 0x2d,
+ 0x1d, 0x39, 0x4e, 0x0e,
+ 0xc0, 0xf0, 0x2d, 0x4c, 0x60, 0x1f, 0x0f, 0xef, 0x1f, 0x2d, 0x58, 0x1f,
+ 0x1e, 0xef, 0xf1, 0x00,
+ 0x0a, 0x3d, 0x2f, 0x7e, 0x3f, 0x0e, 0x4e, 0x3c, 0x2e, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0xee, 0xbe, 0xfe,
+ 0xe0, 0xfb, 0xf0, 0xf0, 0x00, 0xfd, 0x0c, 0x1e, 0x7d, 0x4b, 0x2d, 0x1f,
+ 0x03, 0xf7, 0x06, 0x00,
+ 0x00, 0x10, 0x00, 0xa1, 0xe1, 0xc2, 0xf2, 0xd0, 0xe0, 0xa1, 0xd3, 0xc2,
+ 0xc0, 0xe0, 0xd1, 0x21,
+ 0x41, 0x12, 0xc5, 0xe1, 0xe3, 0x07, 0x56, 0x01, 0x01, 0x01, 0xe1, 0x00,
+ 0xf3, 0x05, 0xc2, 0xe2,
+ 0xf1, 0x02, 0xe1, 0x01, 0x31, 0x21, 0x20, 0x01, 0xe4, 0xc3, 0x00, 0x0d,
+ 0x7c, 0x5d, 0x0f, 0xe0,
+ 0x04, 0x00, 0x50, 0x3e, 0x28, 0xfd, 0xff, 0x10, 0x42, 0x40, 0x3b, 0x2b,
+ 0x0f, 0xd0, 0xe0, 0xad,
+ 0x0e, 0x1d, 0x6e, 0x3e, 0x2e, 0x00, 0x1a, 0x3d, 0x3d, 0x3e, 0x30, 0xff,
+ 0xff, 0x0b, 0xce, 0x00,
+ 0x30, 0x3f, 0xcf, 0x9f, 0xec, 0x0b, 0x1d, 0x38, 0x6e, 0x0f, 0x0f, 0x01,
+ 0x04, 0x20, 0x2f, 0x0e,
+ 0xe0, 0xe3, 0xe2, 0xf5, 0x01, 0x30, 0xdc, 0x8f, 0xe0, 0xd2, 0xb6, 0xf1,
+ 0xf0, 0x2e, 0x3f, 0xf0,
+ 0xb0, 0xd7, 0xe3, 0x01, 0x0f, 0x2f, 0x00, 0xe5, 0x80, 0xe2, 0x00, 0xf0,
+ 0x00, 0x05, 0x02, 0xf1,
+ 0xe0, 0xf0, 0x22, 0x62, 0x13, 0x02, 0x00, 0xf2, 0xf1, 0x00, 0x0e, 0x0f,
+ 0x0d, 0x2e, 0xf0, 0xdf,
+ 0xdc, 0xee, 0xff, 0x7f, 0x5e, 0x3f, 0x07, 0x24, 0x21, 0x4f, 0x1c, 0x00,
+ 0xd0, 0xec, 0xaf, 0x10,
+ 0x1d, 0x48, 0x5c, 0x2f, 0x30, 0x00, 0x0c, 0x2e, 0x4d, 0x4b, 0x4d, 0x0e,
+ 0xf0, 0xe0, 0xe7, 0xf0,
+ 0x02, 0x1e, 0xec, 0x8f, 0xef, 0x00, 0x2e, 0x6e, 0x10, 0x1f, 0x0b, 0xf0,
+ 0xf0, 0x06, 0x21, 0x10,
+ 0x30, 0x1c, 0x00, 0xd2, 0xc1, 0xc1, 0xe0, 0xf0, 0xee, 0xde, 0x01, 0x01,
+ 0x2d, 0x00, 0x1b, 0x00,
+ 0x04, 0xea, 0x04, 0xfa, 0xb3, 0xf2, 0xa8, 0xf9, 0x20, 0x69, 0x2d, 0x41,
+ 0x04, 0xf7, 0x36, 0x7e,
+ 0x7d, 0x3f, 0xf1, 0x04, 0xe3, 0x01, 0x0e, 0x2f, 0x2e, 0xc2, 0xd7, 0xe1,
+ 0xe0, 0x2d, 0x3d, 0x3e,
+ 0xf0, 0xa0, 0xef, 0x1b, 0x1e, 0x4e, 0x7f, 0x2f, 0xfd, 0xd0, 0xf0, 0x01,
+ 0x01, 0x42, 0x22, 0x12,
+ 0xd7, 0xe1, 0x21, 0x70, 0x0e, 0xc0, 0xe2, 0xf5, 0xe2, 0x0e, 0xeb, 0x0f,
+ 0x1f, 0x23, 0x76, 0x14,
+ 0x20, 0x00, 0xf9, 0x0f, 0x40, 0x20, 0x02, 0xd3, 0x91, 0x00, 0xfd, 0xdf,
+ 0xe0, 0xc5, 0xf1, 0x0f,
+ 0x1c, 0x4d, 0x6f, 0x0f, 0xf1, 0xe3, 0xf6, 0x12, 0x30, 0x20, 0x3f, 0x01,
+ 0xf3, 0xb1, 0x03, 0xd2,
+ 0x0f, 0x2f, 0x0d, 0x0b, 0xdd, 0xbf, 0xdc, 0xe0, 0x01, 0x3e, 0x59, 0x0d,
+ 0xff, 0xc0, 0x16, 0x52,
+ 0x4d, 0x3d, 0x01, 0xc5, 0xf2, 0xf0, 0x00, 0x1f, 0x3f, 0x11, 0x26, 0xf1,
+ 0xc1, 0x00, 0x2b, 0x7f,
+ 0x20, 0x00, 0xd0, 0xd2, 0x10, 0x3d, 0x4e, 0x0c, 0x8d, 0xfd, 0xe0, 0xf0,
+ 0x10, 0x2c, 0x2d, 0x1c,
+ 0x01, 0x04, 0x05, 0x24, 0x51, 0x0d, 0x0c, 0xe1, 0xc2, 0xd2, 0xe3, 0x07,
+ 0x31, 0x6f, 0x0b, 0xf0,
+ 0xe1, 0x00, 0x20, 0x70, 0x3e, 0x1e, 0xd0, 0xb7, 0xe3, 0xe2, 0x0f, 0xfe,
+ 0x00, 0xf1, 0xf2, 0x0d,
+ 0x0d, 0x1f, 0x4f, 0x2f, 0xf4, 0x01, 0x2c, 0x6c, 0x1f, 0x11, 0x03, 0x17,
+ 0xf1, 0xd0, 0xf0, 0x10,
+ 0x0f, 0x90, 0xef, 0xf0, 0xde, 0xcd, 0x00, 0x00, 0xf0, 0x0d, 0xdf, 0x20,
+ 0x7e, 0x7b, 0x0c, 0x10,
+ 0x03, 0x04, 0x00, 0xe0, 0x0e, 0x18, 0x00, 0x00, 0x16, 0x61, 0x00, 0xcf,
+ 0x0d, 0x0f, 0x01, 0x14,
+ 0x44, 0x0f, 0xfc, 0x0d, 0x0b, 0x30, 0x00, 0xf1, 0xb0, 0xfd, 0xfa, 0x1f,
+ 0x61, 0x24, 0x10, 0x04,
+ 0x01, 0xfe, 0xff, 0xf0, 0xc3, 0xe0, 0xcf, 0xde, 0xb0, 0xf0, 0xe2, 0x06,
+ 0x00, 0x5f, 0x1d, 0x1c,
+ 0x20, 0x73, 0x44, 0x1e, 0x29, 0xd0, 0xc5, 0xd3, 0x01, 0x01, 0xfe, 0xfd,
+ 0xd0, 0xe0, 0xd6, 0xe0,
+ 0x0e, 0x4e, 0x1e, 0x32, 0xe1, 0xd2, 0x31, 0x40, 0x70, 0x4f, 0x23, 0xf6,
+ 0xc2, 0xf1, 0x00, 0x10,
+ 0x4b, 0x2e, 0xde, 0x91, 0xf2, 0xdf, 0x18, 0x2f, 0x1e, 0x00, 0xd0, 0x01,
+ 0x22, 0x33, 0x2e, 0x09,
+ 0x1f, 0x00, 0x10, 0x13, 0x23, 0x51, 0x50, 0x2b, 0xe0, 0xe0, 0xc5, 0x02,
+ 0x10, 0x3f, 0x5a, 0x20,
+ 0x00, 0xb0, 0x01, 0x00, 0x4f, 0x1c, 0xfd, 0xce, 0xd0, 0x00, 0xd0, 0x0f,
+ 0x51, 0x44, 0x11, 0x00,
+ 0xfd, 0xde, 0x00, 0x13, 0x66, 0x22, 0x00, 0xb0, 0xe0, 0xf7, 0xe5, 0x01,
+ 0x0f, 0x1f, 0x1e, 0x30,
+ 0x21, 0x2f, 0x2f, 0x00, 0xe2, 0xa0, 0xd1, 0x00, 0xe0, 0xe6, 0xe1, 0x01,
+ 0x00, 0xe2, 0xe2, 0xb2,
+ 0xe0, 0x0e, 0x2a, 0x7f, 0x00, 0xe0, 0x01, 0x40, 0x43, 0x37, 0x05, 0xe0,
+ 0xee, 0xff, 0x21, 0x64,
+ 0x11, 0xd2, 0xc0, 0xda, 0xbf, 0xf0, 0xf0, 0x33, 0x10, 0x1b, 0x0e, 0xff,
+ 0x0f, 0x2f, 0x3f, 0x5f,
+ 0x00, 0x3b, 0x4f, 0x0e, 0x40, 0x15, 0x02, 0xf1, 0xeb, 0xd0, 0xb0, 0xf2,
+ 0x03, 0x50, 0x4b, 0x10,
+ 0x25, 0x11, 0x40, 0x0b, 0xfe, 0xbf, 0xef, 0xe0, 0xf2, 0xf0, 0x3e, 0x5b,
+ 0x20, 0xff, 0xd1, 0xf2,
+ 0x00, 0x7e, 0x3f, 0x4d, 0xf0, 0xb0, 0xd5, 0xe7, 0xe2, 0xf0, 0x0f, 0x0f,
+ 0x1f, 0x00, 0x00, 0x42,
+ 0x70, 0x3f, 0x10, 0x01, 0xe2, 0xe5, 0x03, 0x16, 0x00, 0xd2, 0xe1, 0xb2,
+ 0xe3, 0xb0, 0xee, 0xda,
+ 0x00, 0x0d, 0x00, 0x10, 0x00, 0x11, 0x20, 0x6f, 0x38, 0x30, 0x32, 0xf7,
+ 0xf4, 0x0e, 0x5f, 0x3f,
+ 0x00, 0xa0, 0xd4, 0xf0, 0xdf, 0x0c, 0x10, 0x00, 0x00, 0xa1, 0xf0, 0xfe,
+ 0x00, 0x40, 0x3f, 0x1f,
+ 0x20, 0xfd, 0x00, 0x15, 0x73, 0x33, 0x0d, 0xf8, 0xcf, 0xff, 0xf0, 0xf3,
+ 0x23, 0x71, 0x4e, 0x0c,
+ 0xee, 0xf0, 0x00, 0x0f, 0xfc, 0x0c, 0x0d, 0x1e, 0xf0, 0xb1, 0xf0, 0x0f,
+ 0x1e, 0x60, 0x10, 0x0e,
+ 0x1c, 0x1e, 0x2d, 0x20, 0x02, 0x97, 0xe7, 0xe4, 0xf0, 0xfd, 0x0f, 0x10,
+ 0x0f, 0x00, 0x01, 0x32,
+ 0x30, 0x50, 0x0d, 0x00, 0xdd, 0x00, 0x17, 0x16, 0xe2, 0xd1, 0xb0, 0xd0,
+ 0xdf, 0xc1, 0xe5, 0x02,
+ 0x01, 0x3d, 0x2d, 0xd1, 0x86, 0xd0, 0x00, 0x51, 0x10, 0x30, 0xf0, 0xd6,
+ 0xf1, 0x01, 0x4d, 0x0f,
+ 0x1f, 0xf3, 0xe4, 0xde, 0xeb, 0x0f, 0xe0, 0xf2, 0xb6, 0xe0, 0xec, 0x00,
+ 0x0e, 0x10, 0x6f, 0x41,
+ 0x43, 0x31, 0x3c, 0x2e, 0x4f, 0xdf, 0x90, 0xe3, 0xf4, 0x00, 0x3e, 0x50,
+ 0x26, 0x13, 0x01, 0x11,
+ 0x1f, 0x1e, 0x3a, 0x2d, 0x3d, 0xee, 0x9f, 0xe0, 0xee, 0xdb, 0x0e, 0x70,
+ 0x2e, 0x0d, 0x0d, 0x0e,
+ 0x0e, 0x4e, 0x2a, 0x01, 0xe4, 0xb6, 0xe2, 0xcf, 0xec, 0x00, 0x31, 0x14,
+ 0xe2, 0xc1, 0x0e, 0x4c,
+ 0x7f, 0x00, 0x20, 0xf3, 0xe1, 0x0f, 0x4f, 0x00, 0xf5, 0xd2, 0xd3, 0xf1,
+ 0xe0, 0xf2, 0xd2, 0xe1,
+ 0xff, 0xab, 0xce, 0xdf, 0xf2, 0x21, 0x6e, 0x2a, 0x31, 0xe3, 0xf7, 0x27,
+ 0x40, 0x31, 0x2e, 0x00,
+ 0xc1, 0xd2, 0xe3, 0xf2, 0xde, 0xfd, 0xdf, 0xde, 0x80, 0xbe, 0x0c, 0xe0,
+ 0x2d, 0x3f, 0x4d, 0x10,
+ 0x00, 0x05, 0x03, 0x1f, 0x18, 0x4f, 0x0f, 0x00, 0xb1, 0x07, 0x21, 0x30,
+ 0x4f, 0x01, 0xd2, 0xf0,
+ 0x0c, 0x3f, 0x4d, 0x1f, 0xf0, 0xd0, 0xf0, 0xd0, 0xb2, 0xd4, 0x1a, 0x5b,
+ 0x3e, 0x30, 0x01, 0x20,
+ 0x40, 0x4d, 0x2e, 0x0f, 0xb0, 0xc4, 0xf3, 0x00, 0x0c, 0x0d, 0xd1, 0xd5,
+ 0xf0, 0xde, 0x0e, 0x00,
+ 0x72, 0x60, 0x1e, 0x10, 0x02, 0xdf, 0x0f, 0x05, 0x17, 0x37, 0x01, 0xc0,
+ 0xde, 0xc0, 0xef, 0xe1,
+ 0xe4, 0x00, 0xdd, 0xfc, 0x00, 0x10, 0x10, 0x02, 0x13, 0x70, 0x41, 0x10,
+ 0x00, 0xd5, 0x01, 0x02,
+ 0x33, 0x34, 0x0f, 0xcd, 0x10, 0xf0, 0x80, 0xd0, 0xce, 0x03, 0xf3, 0x1c,
+ 0x40, 0x37, 0x11, 0xd0,
+ 0xa1, 0x0c, 0x0d, 0x2e, 0x0f, 0xeb, 0x0e, 0xff, 0x1e, 0x11, 0x44, 0x47,
+ 0x16, 0x01, 0xff, 0x7c,
+ 0x5e, 0x20, 0x12, 0x02, 0xd0, 0xc0, 0x0d, 0xee, 0x0e, 0x00, 0x10, 0x0a,
+ 0x1e, 0x4e, 0x20, 0x5f,
+ 0x30, 0x0d, 0xcf, 0xf1, 0x06, 0x03, 0x22, 0xdf, 0xdc, 0xbf, 0xe3, 0xe6,
+ 0x01, 0x0f, 0x3a, 0x70,
+ 0x5f, 0x00, 0xef, 0x01, 0x01, 0x10, 0x4e, 0x20, 0xf0, 0xc3, 0xd7, 0xf3,
+ 0xe1, 0x0e, 0x0e, 0x0e,
+ 0xa0, 0xf2, 0xc2, 0xf0, 0x00, 0x3f, 0x5f, 0x02, 0xe4, 0xe1, 0x0e, 0x2e,
+ 0x55, 0x23, 0x24, 0x03,
+ 0x04, 0x02, 0xf0, 0xa1, 0xf0, 0xf8, 0xfe, 0xd0, 0xc0, 0xe4, 0xf0, 0x0d,
+ 0x4a, 0x10, 0x22, 0xe2,
+ 0xe2, 0x2e, 0x78, 0x30, 0x3f, 0x00, 0xd0, 0xc4, 0xf4, 0x10, 0x1f, 0x20,
+ 0x12, 0x00, 0x0e, 0x00,
+ 0x10, 0x7f, 0x40, 0xf3, 0xcd, 0xcd, 0x0d, 0xed, 0x0e, 0x3f, 0x3f, 0x49,
+ 0x0b, 0xfc, 0x00, 0x42,
+ 0x50, 0x30, 0x1e, 0xff, 0xdf, 0xde, 0xd2, 0xf6, 0xb4, 0x00, 0x00, 0xdc,
+ 0xff, 0x01, 0x03, 0x20,
+ 0x5e, 0x3f, 0x5e, 0x01, 0xe4, 0x02, 0x11, 0x70, 0x20, 0x07, 0xc2, 0x00,
+ 0x00, 0xf0, 0xfe, 0xb1,
+ 0xe3, 0xef, 0x08, 0x0e, 0x0e, 0x10, 0xf2, 0xb1, 0x0e, 0x0d, 0x30, 0x67,
+ 0x23, 0x05, 0x00, 0x20,
+ 0x0e, 0x02, 0xd6, 0xe1, 0x00, 0xce, 0xce, 0x0f, 0xdf, 0xff, 0x0f, 0x14,
+ 0x03, 0xd0, 0x0f, 0x6e,
+ 0x3b, 0x0c, 0xfc, 0xee, 0x02, 0x24, 0xd2, 0x80, 0xeb, 0x0f, 0x01, 0x64,
+ 0x11, 0x52, 0x10, 0x10,
+ 0x30, 0xfd, 0xe0, 0xf7, 0xe3, 0x00, 0x00, 0x0d, 0xdd, 0xec, 0xc0, 0xd0,
+ 0x01, 0x1e, 0x78, 0x7f,
+ 0x2e, 0xf0, 0xdf, 0xf1, 0x02, 0x10, 0x21, 0x00, 0x00, 0xd3, 0xd2, 0xf2,
+ 0x05, 0x0e, 0x3d, 0x4c,
+ 0x2e, 0xfe, 0x80, 0x00, 0x14, 0x50, 0x2e, 0x10, 0x07, 0xe6, 0xe2, 0xf1,
+ 0xf0, 0xfc, 0xb0, 0xf3,
+ 0xe1, 0x03, 0x0d, 0xfd, 0xee, 0x01, 0xef, 0xee, 0xef, 0x01, 0x70, 0x7b,
+ 0x20, 0x04, 0x07, 0xe1,
+ 0xf1, 0x01, 0x0f, 0x2d, 0x0d, 0xee, 0xbd, 0xe2, 0xe7, 0xf5, 0x01, 0x1f,
+ 0x1d, 0xff, 0xbf, 0xf0,
+ 0x21, 0x7f, 0x4d, 0x0a, 0xce, 0xf0, 0xf5, 0x02, 0x00, 0x1d, 0x40, 0x30,
+ 0x11, 0xf3, 0xe3, 0xf2,
+ 0x30, 0x4b, 0x2d, 0x00, 0x81, 0xf4, 0xe0, 0x0d, 0x1e, 0x1c, 0x1f, 0x2f,
+ 0x4e, 0x2c, 0x3c, 0x2f,
+ 0xf2, 0xe5, 0xff, 0x0c, 0x00, 0xf0, 0xf4, 0x86, 0xe1, 0xef, 0x0e, 0xd0,
+ 0x0f, 0xd0, 0x0d, 0x00,
+ 0xee, 0x0f, 0x50, 0x73, 0x64, 0x0f, 0x00, 0xf0, 0x17, 0x07, 0x00, 0xe1,
+ 0xff, 0x0f, 0xe0, 0x02,
+ 0x01, 0xe2, 0xde, 0xac, 0xe0, 0xe0, 0xf1, 0x00, 0x2e, 0x20, 0x10, 0x57,
+ 0x26, 0x12, 0x30, 0x10,
+ 0x1e, 0x00, 0x0e, 0x10, 0x40, 0xc2, 0xb2, 0xd0, 0xef, 0xcd, 0xd3, 0xf0,
+ 0xf0, 0x3a, 0x5b, 0x2d,
+ 0x1d, 0x0f, 0xef, 0xde, 0x0f, 0xf2, 0xe4, 0x00, 0x1e, 0x73, 0x21, 0x10,
+ 0x12, 0x37, 0x77, 0x50,
+ 0x1d, 0x1e, 0xe0, 0xd4, 0x05, 0x00, 0x0d, 0xfc, 0xe0, 0x00, 0xf0, 0xf0,
+ 0x00, 0x5b, 0x4d, 0x4d,
+ 0x1f, 0xf0, 0xb3, 0xfc, 0x1e, 0x6f, 0x22, 0x07, 0x03, 0xc1, 0xf0, 0x0d,
+ 0xf0, 0xe3, 0xf2, 0xde,
+ 0x0e, 0xf0, 0x14, 0x71, 0x4e, 0x0d, 0x0b, 0xe0, 0xe4, 0x07, 0x01, 0x60,
+ 0x0e, 0xfe, 0xe3, 0x05,
+ 0xe2, 0xf0, 0xc0, 0xee, 0xfb, 0xc0, 0x0f, 0x00, 0xe3, 0x12, 0x71, 0x3f,
+ 0x0b, 0x01, 0xd7, 0x11,
+ 0x50, 0x3f, 0x2d, 0x00, 0xa0, 0xd6, 0xe1, 0xf1, 0x00, 0x0e, 0x00, 0x01,
+ 0x20, 0x2e, 0x1d, 0x00,
+ 0x30, 0x10, 0xfd, 0xab, 0xfd, 0xed, 0xe1, 0xd4, 0xf2, 0x2f, 0x6a, 0x50,
+ 0x30, 0x22, 0x02, 0x00,
+ 0x0c, 0x10, 0x35, 0x01, 0xc2, 0xf0, 0xeb, 0xc0, 0x00, 0xe0, 0x0e, 0x50,
+ 0x5f, 0x1b, 0x2d, 0x3f,
+ 0x1e, 0x20, 0xee, 0x01, 0x00, 0x31, 0x30, 0x10, 0x97, 0xa3, 0xdf, 0xdc,
+ 0xd0, 0xf1, 0x00, 0x5a,
+ 0x10, 0x1f, 0x20, 0x10, 0x42, 0x31, 0x04, 0x13, 0x2d, 0x0d, 0x07, 0xf6,
+ 0xe3, 0x00, 0xde, 0x80,
+ 0xd0, 0xa0, 0xe0, 0xe0, 0xfc, 0x0e, 0x00, 0xe2, 0xf3, 0x0f, 0x0e, 0x75,
+ 0x23, 0x22, 0x22, 0x10,
+ 0x3c, 0x0d, 0x00, 0xa3, 0xf5, 0xe5, 0xe1, 0x0e, 0x1d, 0x00, 0x03, 0xb2,
+ 0x01, 0xfc, 0x1d, 0x3e,
+ 0x3f, 0x1e, 0xb0, 0xd2, 0xb1, 0x0d, 0x0c, 0x10, 0x34, 0x1f, 0x3c, 0x30,
+ 0x32, 0x72, 0x48, 0x0f,
+ 0xf0, 0xf5, 0xf2, 0xf0, 0xfd, 0x0c, 0xef, 0xde, 0xf3, 0x26, 0x6f, 0x4c,
+ 0x2d, 0xfd, 0xee, 0x0f,
+ 0x20, 0x3f, 0x4d, 0x60, 0x20, 0x0d, 0xdb, 0xd1, 0xe7, 0xe7, 0xff, 0xce,
+ 0xff, 0x00, 0x00, 0x20,
+ 0x03, 0x10, 0x4d, 0xf0, 0xbf, 0xd0, 0x0e, 0x30, 0x60, 0x41, 0x47, 0x03,
+ 0x03, 0xcf, 0x0d, 0xc1,
+ 0x04, 0x02, 0xf0, 0xee, 0xef, 0xee, 0xb1, 0xd5, 0xd7, 0x02, 0x1e, 0x6f,
+ 0x20, 0x23, 0xf1, 0xe2,
+ 0x1d, 0x1d, 0x30, 0x22, 0xb7, 0xc3, 0xdf, 0x0f, 0x00, 0x02, 0x12, 0x04,
+ 0x10, 0x0e, 0x6b, 0x2e,
+ 0x0d, 0xac, 0xf0, 0xf0, 0xe4, 0xc0, 0x0b, 0x20, 0x4e, 0x10, 0x11, 0xf2,
+ 0x03, 0x70, 0x33, 0x32,
+ 0xe4, 0xde, 0xdb, 0x1e, 0x35, 0x25, 0x21, 0x0f, 0xeb, 0xe0, 0xde, 0x02,
+ 0xe0, 0x3c, 0x7d, 0x7d,
+ 0x1d, 0xff, 0x00, 0x4f, 0x20, 0x00, 0x01, 0x04, 0xaf, 0xfd, 0xe0, 0xff,
+ 0x01, 0x25, 0xf3, 0xe2,
+ 0xee, 0x09, 0xce, 0xfe, 0x3d, 0x71, 0x60, 0x00, 0x1f, 0x14, 0x07, 0xf6,
+ 0xe2, 0x00, 0xff, 0x0e,
+ 0xff, 0xc0, 0xe2, 0xb0, 0xd0, 0xdd, 0xee, 0x02, 0x21, 0x32, 0x20, 0x42,
+ 0x17, 0x21, 0x30, 0x71,
+ 0x13, 0x00, 0xf3, 0xd6, 0xf3, 0x03, 0xc0, 0xcf, 0xd0, 0x04, 0x24, 0x02,
+ 0x0d, 0xf9, 0x20, 0x0e,
+ 0xc0, 0xe0, 0xe2, 0xf0, 0xcc, 0xdc, 0x0f, 0xe0, 0x03, 0x76, 0x4f, 0x7d,
+ 0x1f, 0x10, 0x00, 0xf3,
+ 0xf3, 0x10, 0x40, 0x1b, 0xf1, 0xe6, 0xf2, 0xf0, 0xe0, 0xfd, 0x0e, 0x0f,
+ 0xfd, 0x0d, 0x4f, 0x7a,
+ 0x7f, 0x2f, 0x00, 0x00, 0x1c, 0x0d, 0xef, 0xe3, 0xf7, 0xf0, 0x0e, 0x1b,
+ 0x20, 0xd1, 0x93, 0xe0,
+ 0xed, 0x0c, 0x3e, 0x2d, 0x50, 0x1e, 0x12, 0x05, 0x01, 0x14, 0x52, 0x20,
+ 0x01, 0xc2, 0xf0, 0xe0,
+ 0x0f, 0x3f, 0xce, 0xc0, 0xd6, 0xb1, 0xfe, 0xf0, 0x24, 0x00, 0xd0, 0xe1,
+ 0x03, 0x72, 0x2f, 0x1b,
+ 0x00, 0x0f, 0x0e, 0xa1, 0x07, 0xf7, 0x01, 0x10, 0x2f, 0x1f, 0x01, 0xc5,
+ 0x03, 0x30, 0x4f, 0x0c,
+ 0xdf, 0xb0, 0xf1, 0xb3, 0xe0, 0xfe, 0x1b, 0x1e, 0x00, 0x00, 0x02, 0x20,
+ 0x7d, 0x0f, 0x23, 0x16,
+ 0x0f, 0x0f, 0xf1, 0x14, 0x62, 0x16, 0xf2, 0xcf, 0x0c, 0x0e, 0xde, 0x00,
+ 0x10, 0x6f, 0x2a, 0x1e,
+ 0x1f, 0x00, 0x0f, 0x0f, 0x0e, 0x0f, 0x40, 0x12, 0x00, 0xf1, 0xc4, 0xe4,
+ 0xf3, 0xfe, 0xed, 0xf0,
+ 0xfd, 0xc9, 0xfd, 0x3d, 0x7c, 0x1d, 0x31, 0x04, 0x02, 0x01, 0x73, 0x62,
+ 0x01, 0x03, 0x0f, 0xcc,
+ 0x0f, 0x02, 0xf7, 0xd4, 0xed, 0xef, 0xce, 0xd0, 0xd7, 0x12, 0x31, 0x5f,
+ 0x3c, 0x1f, 0x1e, 0x12,
+ 0x25, 0x21, 0x02, 0xcf, 0xdf, 0xc1, 0xe5, 0xe3, 0xf3, 0x10, 0x0f, 0xd0,
+ 0x11, 0x1d, 0xfb, 0x9f,
+ 0xf0, 0xc0, 0xe1, 0xdb, 0xed, 0x00, 0x30, 0x30, 0x35, 0x74, 0x3f, 0x0c,
+ 0x1f, 0x00, 0x01, 0xf4,
+ 0x27, 0x70, 0x40, 0x1e, 0x01, 0xf4, 0xa1, 0xd0, 0xc1, 0x0c, 0x1d, 0x5f,
+ 0x30, 0x10, 0xd0, 0xed,
+ 0x0c, 0x6d, 0x3c, 0x1d, 0x0d, 0x0f, 0xff, 0x32, 0x14, 0xf3, 0xd1, 0xee,
+ 0xd2, 0xb7, 0xd1, 0xfd,
+ 0x1b, 0x0d, 0xeb, 0xd0, 0x01, 0x20, 0x72, 0x73, 0x32, 0x0e, 0x0d, 0xf5,
+ 0x06, 0x42, 0x10, 0x0c,
+ 0x00, 0xcf, 0xd0, 0xd2, 0x92, 0xff, 0xeb, 0x00, 0x20, 0x00, 0x04, 0xe0,
+ 0x2e, 0x6e, 0x20, 0x02,
+ 0x04, 0xc0, 0xff, 0x0f, 0x00, 0x07, 0xf3, 0x1f, 0x0f, 0x30, 0x17, 0x00,
+ 0x11, 0x20, 0xed, 0xc0,
+ 0xa0, 0xe2, 0xb0, 0xf0, 0xeb, 0x0e, 0x00, 0x22, 0x00, 0xdc, 0xde, 0x0f,
+ 0x3b, 0x6e, 0x60, 0x31,
+ 0x25, 0x02, 0xe3, 0x02, 0x04, 0x10, 0x0f, 0xf1, 0xf4, 0xd0, 0xfb, 0x00,
+ 0xf1, 0x04, 0x1d, 0x0a,
+ 0xff, 0x5e, 0x70, 0x70, 0x2e, 0x0d, 0xee, 0xe1, 0x05, 0x04, 0x23, 0x20,
+ 0x0d, 0xb9, 0xd0, 0xe0,
+ 0xe0, 0x11, 0x0f, 0x3d, 0x4e, 0x00, 0xf0, 0xe4, 0x20, 0x71, 0x62, 0x13,
+ 0x02, 0x0e, 0x0f, 0x10,
+ 0xf3, 0xc7, 0x03, 0xdf, 0xcd, 0xcf, 0xf0, 0x02, 0x05, 0x05, 0x00, 0x2e,
+ 0x6c, 0x0f, 0x20, 0xf0,
+ 0xd0, 0xe2, 0xe1, 0x1f, 0x2d, 0x42, 0xf3, 0xd7, 0x15, 0x50, 0x41, 0x0e,
+ 0xff, 0xa0, 0xe4, 0xf0,
+ 0xec, 0xff, 0x01, 0x0f, 0x4e, 0x01, 0xc1, 0xee, 0x0e, 0x0d, 0x2a, 0x4e,
+ 0x2e, 0x41, 0x26, 0x11,
+ 0x01, 0x22, 0xd0, 0xbd, 0xee, 0x05, 0x34, 0x12, 0x00, 0xba, 0xfe, 0x00,
+ 0x03, 0x21, 0x22, 0x7b,
+ 0x7c, 0x1e, 0x1f, 0x00, 0xf2, 0xf2, 0x00, 0x5f, 0x0f, 0x01, 0xe7, 0xd0,
+ 0xfe, 0xd0, 0xef, 0x00,
+ 0x21, 0x0d, 0xd9, 0xbf, 0xe0, 0xf1, 0x23, 0x70, 0x30, 0x2c, 0x21, 0x03,
+ 0x42, 0x21, 0x21, 0x0f,
+ 0xf1, 0xa2, 0xde, 0xd1, 0xd5, 0xc1, 0xf1, 0x0e, 0x00, 0x15, 0xf2, 0x00,
+ 0x30, 0x40, 0x1d, 0x11,
+ 0x10, 0xd7, 0x96, 0x00, 0xef, 0x30, 0x73, 0x15, 0x01, 0xf0, 0xef, 0xed,
+ 0x03, 0x12, 0xeb, 0x00,
+ 0x0e, 0xf0, 0xf1, 0xe4, 0x02, 0x9c, 0xcb, 0xde, 0xed, 0x00, 0x05, 0x05,
+ 0x38, 0x00, 0x11, 0x00,
+ 0x94, 0xe1, 0xd3, 0x1a, 0x10, 0xe6, 0x3b, 0x1a, 0xe8, 0x0f, 0x8f, 0xc1,
+ 0x07, 0x05, 0x00, 0x10,
+ 0x11, 0x03, 0xb7, 0xd2, 0xc2, 0xe1, 0xe4, 0xf1, 0xe2, 0xc1, 0xc0, 0xe1,
+ 0xdf, 0xf0, 0x3e, 0x30,
+ 0x0e, 0x0c, 0xff, 0x4d, 0x20, 0x47, 0x23, 0x00, 0x20, 0x2d, 0x4c, 0x1c,
+ 0x0f, 0xc1, 0x92, 0xfe,
+ 0xd8, 0xfd, 0xfe, 0x2f, 0x50, 0x5e, 0x2e, 0x3d, 0x6d, 0x2e, 0x4d, 0x1d,
+ 0x0d, 0x00, 0x2c, 0x0b,
+ 0xdd, 0x0f, 0xf0, 0x0c, 0x0c, 0x5e, 0x4f, 0x3c, 0x0d, 0x0d, 0x0b, 0xce,
+ 0x1d, 0x11, 0x00, 0x08,
+ 0x0f, 0x7f, 0x22, 0x04, 0xf0, 0xe0, 0xfd, 0x51, 0x23, 0x03, 0x06, 0x00,
+ 0x00, 0x02, 0x03, 0xc5,
+ 0xa1, 0xd1, 0xc0, 0xe0, 0xd0, 0x02, 0xe2, 0xd0, 0xd0, 0xe2, 0x25, 0x10,
+ 0x0f, 0xe1, 0xa7, 0xf3,
+ 0xb1, 0xe4, 0xe2, 0x04, 0xc2, 0xc2, 0xd2, 0xe2, 0xe4, 0xc4, 0xf0, 0x01,
+ 0xe0, 0x2f, 0x30, 0x3e,
+ 0x31, 0xd5, 0x03, 0x42, 0x5f, 0x30, 0x16, 0xd0, 0xf0, 0x00, 0x2d, 0x0e,
+ 0xed, 0xcf, 0x88, 0xae,
+ 0xfd, 0x0e, 0x0f, 0x4d, 0x4e, 0x0e, 0x2c, 0x3c, 0x4d, 0x5e, 0x20, 0x3d,
+ 0xeb, 0x0e, 0x1f, 0x0e,
+ 0x0c, 0x0e, 0x0e, 0x3d, 0x1b, 0x40, 0x3f, 0x0d, 0xdb, 0x1e, 0x2e, 0xfd,
+ 0xfe, 0x60, 0x3f, 0x3a,
+ 0x3d, 0x2f, 0x00, 0xf3, 0xd3, 0x20, 0x4a, 0x7e, 0x7f, 0x01, 0xf6, 0xe1,
+ 0x02, 0x10, 0xf1, 0xf1,
+ 0xd2, 0xd0, 0xc2, 0xb2, 0x02, 0xd1, 0xf2, 0x07, 0xf3, 0xf0, 0xd0, 0xe2,
+ 0xf2, 0xf4, 0xc3, 0xd6,
+ 0xf1, 0xb3, 0x06, 0xe3, 0xb1, 0xd1, 0xf4, 0xd2, 0xb2, 0xd2, 0xf3, 0xd3,
+ 0xf0, 0xef, 0xf0, 0x21,
+ 0x34, 0xd2, 0xa1, 0x14, 0x33, 0x2f, 0x40, 0x47, 0x01, 0x20, 0x00, 0x00,
+ 0x1c, 0x00, 0x90, 0xce,
+ 0xfc, 0x0e, 0xfe, 0x00, 0x1d, 0x48, 0x5b, 0x4f, 0x4e, 0x10, 0x3f, 0x1f,
+ 0x0c, 0x0d, 0x1d, 0x20,
+ 0x4d, 0x3d, 0x10, 0x6e, 0x1c, 0x0d, 0x1c, 0x1f, 0x0c, 0xdd, 0x2b, 0x5d,
+ 0x4e, 0x1f, 0x0d, 0xee,
+ 0x00, 0x0c, 0x2f, 0x31, 0x0d, 0x0d, 0x2b, 0x60, 0x22, 0x15, 0xf2, 0x02,
+ 0x1f, 0x30, 0x0f, 0xa3,
+ 0xe7, 0xd1, 0xc0, 0xc0, 0xc0, 0xe2, 0xe0, 0xe2, 0xf2, 0xc0, 0xc0, 0xef,
+ 0xf1, 0x16, 0x02, 0xe6,
+ 0xf5, 0xc2, 0xd2, 0xd3, 0xd5, 0xa4, 0xb1, 0xf1, 0xc3, 0xf1, 0xd3, 0x02,
+ 0x01, 0xe0, 0xc1, 0xf2,
+ 0x04, 0x34, 0x10, 0x12, 0x21, 0x24, 0x15, 0x13, 0x41, 0x2e, 0x1e, 0x0f,
+ 0x92, 0xd3, 0xa2, 0xed,
+ 0xe8, 0xfe, 0xef, 0x10, 0x50, 0x4e, 0x3e, 0x5c, 0x2f, 0x2e, 0x1d, 0x0c,
+ 0x0f, 0x3e, 0x4c, 0x2e,
+ 0x2c, 0x1e, 0x1c, 0x0f, 0x0e, 0x0b, 0xfd, 0x3d, 0x7c, 0x2a, 0x2e, 0x1f,
+ 0x2e, 0x2e, 0x5f, 0x1f,
+ 0x2d, 0x1c, 0x2d, 0x3f, 0x3e, 0x4e, 0x41, 0x10, 0x20, 0x3c, 0x40, 0x13,
+ 0x13, 0x0f, 0xdd, 0xd1,
+ 0xa7, 0xe6, 0xe1, 0x90, 0xee, 0xff, 0xe0, 0x01, 0xe4, 0xc0, 0xce, 0x0e,
+ 0x2f, 0x11, 0xe4, 0xc2,
+ 0xf4, 0xd4, 0xd5, 0xe5, 0xc3, 0xb1, 0xc2, 0xd1, 0xd3, 0xe3, 0xd3, 0x03,
+ 0xf3, 0x81, 0xf3, 0x04,
+ 0xf4, 0x03, 0x07, 0x04, 0xf0, 0x1f, 0x32, 0x24, 0x11, 0x12, 0x00, 0x30,
+ 0xcf, 0x91, 0xc2, 0xb1,
+ 0xff, 0x0e, 0x0d, 0x20, 0x3e, 0x1d, 0x0b, 0x0d, 0x1c, 0x5e, 0x1b, 0x40,
+ 0x3d, 0x19, 0x3f, 0x1f,
+ 0x2f, 0x2e, 0x31, 0x51, 0x0d, 0x08, 0x1f, 0x5f, 0x3f, 0x1e, 0x1e, 0x10,
+ 0x1b, 0x1f, 0x2e, 0x0f,
+ 0x0c, 0x0e, 0x0d, 0x4e, 0x7f, 0x4e, 0x3e, 0x1d, 0x1d, 0x42, 0x22, 0x2f,
+ 0x2b, 0x10, 0x00, 0x01,
+ 0xe5, 0xd2, 0xa0, 0xff, 0xfd, 0xee, 0xb3, 0xd6, 0xa0, 0xfd, 0xfd, 0xfd,
+ 0x1e, 0x21, 0xe2, 0xa7,
+ 0x06, 0xf0, 0xf1, 0xe2, 0xf5, 0xd2, 0xd3, 0xc1, 0xf1, 0xf3, 0xd1, 0x83,
+ 0xf3, 0xe1, 0xe2, 0x02,
+ 0xe3, 0x01, 0xd5, 0xe5, 0x12, 0x53, 0x44, 0x32, 0x20, 0x01, 0xd5, 0xa1,
+ 0xf1, 0xc1, 0xf3, 0xf2,
+ 0xe0, 0x0d, 0x10, 0x00, 0xf0, 0x14, 0x3e, 0x39, 0x5c, 0x3f, 0x50, 0x20,
+ 0x1f, 0x2c, 0x2f, 0x2e,
+ 0x2e, 0x51, 0x01, 0x00, 0x09, 0x2d, 0x2d, 0x3e, 0x1d, 0x1e, 0x5c, 0x2b,
+ 0x5f, 0x2d, 0x1e, 0x0b,
+ 0x0e, 0x0f, 0x4d, 0x60, 0x3d, 0x2e, 0x10, 0x1d, 0x2d, 0x2f, 0x10, 0x22,
+ 0x00, 0x08, 0x2d, 0x0e,
+ 0xf2, 0x07, 0xc0, 0x80, 0xcc, 0x00, 0x00, 0xd1, 0xd1, 0xe0, 0xea, 0x2f,
+ 0x6f, 0x0e, 0xc0, 0xe0,
+ 0xf5, 0xf1, 0x03, 0xd2, 0xc2, 0xe4, 0xb3, 0xc4, 0xe1, 0xf3, 0xe3, 0xe1,
+ 0xd2, 0xc2, 0xa4, 0xd3,
+ 0xe2, 0x01, 0x27, 0x55, 0x10, 0x00, 0x20, 0x13, 0x13, 0xf4, 0xbf, 0xef,
+ 0xde, 0xf1, 0xf4, 0xe1,
+ 0xef, 0xe0, 0xef, 0x01, 0x03, 0x52, 0x09, 0x0d, 0x70, 0x20, 0x1d, 0x1d,
+ 0x20, 0x1e, 0x1b, 0x30,
+ 0x32, 0x5f, 0x1e, 0x2c, 0x2f, 0x2d, 0x40, 0x51, 0x0b, 0x1e, 0x1b, 0x5f,
+ 0x0b, 0x10, 0x0f, 0xf0,
+ 0xfb, 0xfd, 0x5e, 0x19, 0x40, 0x0f, 0x01, 0x20, 0xf9, 0x10, 0x4f, 0x50,
+ 0x01, 0x30, 0x42, 0x01,
+ 0xdf, 0x0f, 0xd0, 0xa1, 0xee, 0xee, 0xe1, 0xe0, 0x0e, 0xda, 0x0f, 0x00,
+ 0x00, 0xaa, 0x0f, 0x42,
+ 0x13, 0xcf, 0xcb, 0x03, 0x07, 0xf0, 0x02, 0x11, 0x20, 0xf0, 0xa0, 0xc1,
+ 0xd0, 0xd3, 0xe2, 0xd0,
+ 0x00, 0x00, 0x34, 0x45, 0x01, 0x00, 0x43, 0x33, 0x12, 0xd0, 0xc0, 0xf2,
+ 0xd2, 0xdf, 0xdd, 0x06,
+ 0x13, 0xa1, 0xe0, 0x26, 0x31, 0x0e, 0xec, 0x3d, 0x7f, 0x1c, 0x0e, 0x32,
+ 0x73, 0x1f, 0x49, 0x10,
+ 0x2f, 0x10, 0x15, 0x00, 0x0c, 0x20, 0x60, 0x1f, 0x1f, 0x00, 0x34, 0x0f,
+ 0x1c, 0x0f, 0x1e, 0x10,
+ 0x40, 0x0e, 0xfb, 0x3f, 0x72, 0x7d, 0xd8, 0x11, 0x23, 0x10, 0x0d, 0x1f,
+ 0x63, 0x02, 0xfc, 0xde,
+ 0x03, 0x23, 0xf0, 0xf0, 0x04, 0xe0, 0xde, 0xe0, 0xf2, 0xde, 0x1e, 0x3b,
+ 0xcc, 0xac, 0x01, 0xd1,
+ 0xe2, 0xf5, 0xd0, 0xe2, 0x03, 0x00, 0x8e, 0xff, 0x04, 0xe5, 0x90, 0xed,
+ 0xe1, 0xf6, 0xef, 0xdd,
+ 0xe0, 0x54, 0x11, 0xfe, 0xd0, 0x23, 0x64, 0x0f, 0xfe, 0x04, 0xf0, 0xfe,
+ 0xff, 0x01, 0xf4, 0xd2,
+ 0xd1, 0xcc, 0x2e, 0x47, 0xf0, 0xef, 0x10, 0x30, 0x60, 0x32, 0x2f, 0x1d,
+ 0x40, 0x11, 0x20, 0x0e,
+ 0x3e, 0x19, 0xfd, 0xeb, 0x50, 0x74, 0x0e, 0xe8, 0x00, 0x62, 0x0f, 0xdc,
+ 0x00, 0x31, 0x00, 0xed,
+ 0x10, 0x32, 0x0f, 0xfc, 0x00, 0x10, 0x00, 0x40, 0x72, 0x0f, 0xe8, 0x10,
+ 0x62, 0x02, 0xfd, 0x02,
+ 0x34, 0xff, 0xef, 0x04, 0x03, 0xad, 0xec, 0x12, 0x45, 0xff, 0xbc, 0x00,
+ 0x22, 0x00, 0xcd, 0x01,
+ 0x03, 0x00, 0x12, 0x11, 0x01, 0x16, 0x01, 0xd0, 0x04, 0x02, 0xc0, 0x9f,
+ 0x04, 0xe2, 0xef, 0xff,
+ 0x12, 0x13, 0xff, 0xf4, 0x46, 0x10, 0x0f, 0x0f, 0x20, 0x45, 0x01, 0xe1,
+ 0xf0, 0x21, 0x00, 0xde,
+ 0xf0, 0x04, 0x8e, 0xdd, 0x67, 0x00, 0xfb, 0x00, 0x41, 0x22, 0xfe, 0xca,
+ 0x20, 0x72, 0x00, 0xdd,
+ 0x0f, 0x30, 0x22, 0x20, 0x0f, 0x2f, 0x0d, 0xdc, 0x65, 0x21, 0xed, 0xfd,
+ 0x21, 0x54, 0xfe, 0xd8,
+ 0xf0, 0x40, 0x12, 0xec, 0xff, 0x30, 0x32, 0xef, 0xdc, 0x61, 0x22, 0x0e,
+ 0x10, 0x42, 0x02, 0xdf,
+ 0xfe, 0x02, 0x05, 0xc0, 0xe0, 0x00, 0xee, 0x21, 0x12, 0xce, 0xe0, 0xd0,
+ 0xdd, 0xd0, 0xe3, 0xd2,
+ 0xae, 0x02, 0x47, 0xf0, 0xd3, 0x17, 0x04, 0x8f, 0xbe, 0xff, 0x03, 0x06,
+ 0xee, 0xae, 0x04, 0x12,
+ 0xef, 0x00, 0x22, 0x00, 0x02, 0xf1, 0x14, 0x22, 0xfe, 0xef, 0x14, 0x00,
+ 0xe0, 0xf1, 0xd0, 0xb0,
+ 0xe0, 0x02, 0x88, 0xe9, 0x11, 0x00, 0x0f, 0x30, 0x21, 0xaa, 0xff, 0x30,
+ 0x53, 0xfe, 0xec, 0x10,
+ 0x30, 0x20, 0x0e, 0xfd, 0x10, 0x55, 0xfd, 0xdb, 0x20, 0x42, 0x0f, 0xed,
+ 0x11, 0x30, 0xec, 0xef,
+ 0xff, 0x4f, 0x71, 0x0d, 0xdc, 0x0f, 0x0f, 0x10, 0x2f, 0x4e, 0x1a, 0x0e,
+ 0x20, 0x34, 0xd0, 0xbc,
+ 0xff, 0x33, 0x36, 0xe0, 0x8d, 0x00, 0x00, 0x11, 0x35, 0xad, 0xed, 0x05,
+ 0x00, 0xee, 0xef, 0x43,
+ 0x01, 0xdd, 0xf0, 0x47, 0x33, 0xcf, 0xdc, 0x23, 0x02, 0xe0, 0xe1, 0xe2,
+ 0x8e, 0x01, 0x07, 0x00,
+ 0xd0, 0x00, 0x01, 0x13, 0xee, 0xf0, 0x42, 0x23, 0x00, 0xbd, 0x26, 0x64,
+ 0xff, 0xcd, 0x11, 0x36,
+ 0xf0, 0xd0, 0xff, 0x21, 0x00, 0xab, 0x32, 0x67, 0xef, 0xcc, 0x21, 0x32,
+ 0x0f, 0xce, 0x00, 0x63,
+ 0x00, 0xfc, 0xff, 0x12, 0x33, 0xfc, 0xed, 0x34, 0x32, 0xdc, 0xdd, 0x54,
+ 0x32, 0xfd, 0xdd, 0x22,
+ 0x21, 0x00, 0x0d, 0x00, 0x24, 0xfd, 0xbb, 0x31, 0x75, 0x0e, 0xed, 0x21,
+ 0x22, 0xde, 0x11, 0x67,
+ 0xee, 0xff, 0x21, 0x01, 0x00, 0x00, 0x00, 0x02, 0x22, 0xdd, 0xde, 0x23,
+ 0x11, 0xcc, 0xef, 0x43,
+ 0x35, 0xdf, 0xde, 0x12, 0x77, 0x00, 0xce, 0x01, 0x34, 0xdf, 0xcf, 0x04,
+ 0x22, 0xbd, 0xdf, 0x57,
+ 0x01, 0xde, 0x00, 0x12, 0x23, 0xff, 0xdd, 0x22, 0x64, 0xf0, 0xf0, 0xf1,
+ 0x01, 0x12, 0xee, 0x01,
+ 0x16, 0xdf, 0xdf, 0x32, 0x75, 0x0f, 0xbb, 0xf0, 0x32, 0x56, 0xdd, 0xed,
+ 0x23, 0x30, 0xe0, 0x0f,
+ 0x21, 0xed, 0x0e, 0x76, 0x20, 0xcd, 0xfe, 0x33, 0x12, 0x0d, 0xed, 0x0f,
+ 0x43, 0x10, 0xfa, 0xef,
+ 0x00, 0x42, 0xee, 0xec, 0x43, 0x0e, 0xc8, 0x30, 0x73, 0x0f, 0xec, 0xf0,
+ 0x10, 0x32, 0x00, 0xbc,
+ 0x0f, 0x34, 0x21, 0xee, 0xce, 0x22, 0x22, 0xfe, 0xcc, 0x23, 0x00, 0xbb,
+ 0x01, 0x21, 0xde, 0xdd,
+ 0x54, 0x02, 0x0e, 0xdd, 0xfe, 0x24, 0x12, 0xf0, 0x03, 0x89, 0xee, 0x24,
+ 0x22, 0xce, 0xef, 0xf0,
+ 0x01, 0x25, 0xf0, 0xce, 0xfe, 0x22, 0x35, 0xcf, 0xfe, 0x23, 0x12, 0xbd,
+ 0xfe, 0x02, 0x01, 0x02,
+ 0x01, 0xce, 0x25, 0x22, 0x88, 0xff, 0x24, 0x10, 0xdd, 0xf0, 0x23, 0xed,
+ 0xff, 0x32, 0xfe, 0xbb,
+ 0x10, 0x75, 0x00, 0xfd, 0xde, 0x33, 0x00, 0x0c, 0x12, 0x10, 0x0c, 0x43,
+ 0x00, 0xbb, 0x00, 0x22,
+ 0x0f, 0xed, 0x11, 0xff, 0xee, 0x40, 0x10, 0x2f, 0x1e, 0xb9, 0x0f, 0x43,
+ 0x32, 0xda, 0x9d, 0x00,
+ 0x77, 0x00, 0xed, 0xf0, 0x21, 0x24, 0xfe, 0xdd, 0x00, 0x12, 0x10, 0x01,
+ 0xcd, 0xfe, 0x12, 0x34,
+ 0xec, 0xcf, 0x21, 0x22, 0x01, 0xee, 0xee, 0x34, 0xf0, 0xae, 0x00, 0x27,
+ 0x02, 0xac, 0xf0, 0x03,
+ 0x32, 0xcd, 0xee, 0x12, 0x24, 0x11, 0xf0, 0xdd, 0x00, 0x57, 0x22, 0xbd,
+ 0x00, 0x24, 0xff, 0xf0,
+ 0x01, 0x00, 0xf2, 0x12, 0xcc, 0x00, 0x77, 0x00, 0xce, 0x00, 0x21, 0x01,
+ 0x00, 0x10, 0x20, 0x22,
+ 0xed, 0xef, 0x44, 0xf0, 0x20, 0x00, 0xea, 0x73, 0x43, 0xec, 0xb8, 0x32,
+ 0x33, 0xdd, 0xee, 0x42,
+ 0x24, 0xdc, 0xef, 0x52, 0x00, 0x0f, 0x11, 0x00, 0x0d, 0x10, 0x21, 0x10,
+ 0xfe, 0xed, 0x42, 0x47,
+ 0xee, 0xcc, 0x32, 0x75, 0x00, 0xdb, 0x01, 0x42, 0xf0, 0xde, 0x0f, 0x33,
+ 0x0f, 0xbd, 0x11, 0x44,
+ 0xfe, 0xde, 0x22, 0x24, 0x0e, 0xcc, 0x01, 0x33, 0x01, 0xdf, 0x33, 0xf1,
+ 0x8a, 0x01, 0x25, 0x00,
+ 0xbd, 0x00, 0x35, 0x00, 0xef, 0xef, 0x21, 0x13, 0x00, 0x20, 0xf0, 0xef,
+ 0x02, 0x46, 0x00, 0xad,
+ 0x00, 0x35, 0x00, 0xde, 0x00, 0x34, 0x00, 0x8c, 0xf1, 0x55, 0xff, 0xed,
+ 0x21, 0x34, 0xce, 0xfd,
+ 0x13, 0x44, 0xfe, 0xdc, 0x10, 0x66, 0x00, 0xed, 0x00, 0x32, 0x00, 0x00,
+ 0xee, 0x11, 0x22, 0x00,
+ 0xfd, 0xff, 0x22, 0x43, 0xdc, 0xcc, 0x52, 0x23, 0x0d, 0xdb, 0x00, 0x75,
+ 0x0f, 0xdc, 0x11, 0x42,
+ 0x00, 0xee, 0x11, 0x55, 0xfe, 0xef, 0x0f, 0x01, 0x24, 0x0f, 0xcc, 0x00,
+ 0x23, 0xfe, 0xf0, 0x21,
+ 0xcd, 0x10, 0x45, 0xdd, 0x00, 0x32, 0xf0, 0xff, 0xde, 0xf0, 0x57, 0xf0,
+ 0xbd, 0x00, 0x02, 0x03,
+ 0xe0, 0xef, 0x00, 0xce, 0x0f, 0x47, 0x22, 0xdf, 0xcc, 0xef, 0x34, 0x75,
+ 0xf0, 0xaa, 0x00, 0x44,
+ 0x0f, 0xdf, 0x00, 0x22, 0xef, 0xe0, 0x00, 0x1f, 0x10, 0x02, 0xde, 0x0f,
+ 0x10, 0xff, 0x01, 0x33,
+ 0xbb, 0xdc, 0x53, 0x12, 0x0d, 0xdc, 0x31, 0x55, 0xee, 0xcb, 0x21, 0x54,
+ 0xff, 0xdc, 0x00, 0x11,
+ 0x32, 0xbd, 0x10, 0x11, 0x0e, 0xfe, 0x11, 0x11, 0xfd, 0x0f, 0xed, 0xdb,
+ 0x42, 0x42, 0xfe, 0x0d,
+ 0xe0, 0x42, 0x01, 0xe9, 0x00, 0x64, 0x00, 0xbb, 0x00, 0x23, 0x00, 0xba,
+ 0x00, 0x01, 0x10, 0x12,
+ 0x0f, 0xaa, 0x00, 0x33, 0x00, 0xdd, 0x00, 0x23, 0x0f, 0xce, 0x00, 0x01,
+ 0x01, 0xcf, 0xef, 0xf1,
+ 0x04, 0xff, 0xb9, 0x00, 0x43, 0x01, 0xad, 0x00, 0x13, 0x10, 0xec, 0xff,
+ 0x13, 0x33, 0xef, 0xb8,
+ 0x12, 0x22, 0xee, 0xcf, 0x01, 0x22, 0xff, 0xba, 0x32, 0x11, 0xdf, 0xfe,
+ 0x00, 0x01, 0xef, 0x00,
+ 0x41, 0xcb, 0x00, 0x52, 0xec, 0x00, 0x32, 0x10, 0xfb, 0x00, 0x10, 0x0f,
+ 0xcd, 0x00, 0x77, 0x00,
+ 0xca, 0x00, 0x53, 0x00, 0xfd, 0xff, 0x01, 0x10, 0x00, 0x0e, 0xff, 0x0f,
+ 0x10, 0x40, 0x10, 0xff,
+ 0x0e, 0x46, 0x10, 0xdd, 0x20, 0x77, 0x0f, 0xbd, 0x12, 0x23, 0xee, 0xff,
+ 0x01, 0xff, 0xed, 0x11,
+ 0x56, 0x00, 0xde, 0xdc, 0x33, 0x73, 0xff, 0xfd, 0x01, 0x02, 0x04, 0x00,
+ 0xce, 0x01, 0x14, 0x01,
+ 0xdf, 0xf0, 0x01, 0x37, 0x24, 0x8d, 0xff, 0x01, 0x03, 0x20, 0x02, 0x10,
+ 0x00, 0x01, 0xf3, 0x02,
+ 0x14, 0x01, 0xde, 0x47, 0x73, 0xbb, 0x00, 0x25, 0x30, 0xbe, 0x0f, 0x02,
+ 0x12, 0x10, 0xfc, 0xf0,
+ 0x13, 0x42, 0xff, 0xfa, 0x11, 0x63, 0x0f, 0x1f, 0x21, 0xef, 0xeb, 0x33,
+ 0x65, 0x0f, 0xfd, 0xf0,
+ 0x00, 0x76, 0x00, 0xfd, 0x00, 0x00, 0x11, 0x00, 0x20, 0x0f, 0xfe, 0x10,
+ 0x41, 0x0f, 0x0f, 0x25,
+ 0x42, 0x00, 0x1d, 0x00, 0x23, 0x45, 0x11, 0xd0, 0x0f, 0x23, 0x41, 0xf0,
+ 0xcc, 0x13, 0x27, 0xf0,
+ 0xf0, 0x0e, 0x73, 0x22, 0x00, 0xf0, 0x12, 0x00, 0x03, 0x07, 0xd0, 0xf1,
+ 0x01, 0x9f, 0xf0, 0x37,
+ 0x43, 0xcf, 0xe0, 0xe0, 0xd0, 0x77, 0x12, 0xcd, 0x00, 0x54, 0x00, 0xe0,
+ 0x00, 0x35, 0x00, 0xd0,
+ 0xff, 0x21, 0x24, 0xff, 0xc0, 0x11, 0x23, 0xfd, 0xdf, 0x43, 0x36, 0xbe,
+ 0xed, 0x44, 0x11, 0xde,
+ 0xfe, 0x33, 0x73, 0xfc, 0x0f, 0x21, 0x11, 0xfd, 0x00, 0x31, 0xfd, 0x0c,
+ 0x31, 0x02, 0x64, 0x0e,
+ 0x0b, 0x10, 0x22, 0xff, 0x0f, 0x1d, 0x0c, 0x51, 0x00, 0xc8, 0x0f, 0x61,
+ 0x00, 0x0c, 0x20, 0x11,
+ 0x0e, 0x20, 0x23, 0x0e, 0xec, 0x21, 0x75, 0x0f, 0xdc, 0x11, 0x13, 0xed,
+ 0xce, 0x13, 0x03, 0xcb,
+ 0xde, 0x52, 0x43, 0xec, 0xd9, 0x02, 0x63, 0xf0, 0xcc, 0x00, 0x21, 0x14,
+ 0xde, 0xee, 0xf1, 0x14,
+ 0x01, 0x8e, 0x00, 0x01, 0xf2, 0xf0, 0xfd, 0x02, 0x15, 0x00, 0xde, 0x00,
+ 0x13, 0x15, 0xff, 0xbe,
+ 0x00, 0xf1, 0x03, 0xf2, 0x01, 0xff, 0xb9, 0x13, 0x22, 0xee, 0xab, 0x00,
+ 0xe2, 0x0f, 0xdc, 0x00,
+ 0x23, 0xee, 0x2d, 0x20, 0xda, 0xee, 0x61, 0x01, 0xdb, 0x0d, 0x40, 0x51,
+ 0xee, 0xfe, 0x00, 0x41,
+ 0x0f, 0xf8, 0x0f, 0x00, 0x0f, 0x0e, 0xde, 0xcd, 0xff, 0x4f, 0x1d, 0xea,
+ 0x0e, 0x1e, 0x40, 0x10,
+ 0x0b, 0x20, 0x10, 0xff, 0x6e, 0x30, 0x0e, 0x02, 0xcf, 0x98, 0x00, 0xe0,
+ 0xe0, 0xff, 0xef, 0xdd,
+ 0x2f, 0x40, 0xed, 0xdf, 0x01, 0xd0, 0x88, 0x00, 0x11, 0xdf, 0x01, 0x01,
+ 0x69, 0x00, 0x46, 0x00,
+ 0x14, 0xd0, 0xa9, 0xce, 0x1b, 0xd2, 0x80, 0xcb, 0x24, 0xcb, 0xbf, 0x02,
+ 0x02, 0x00, 0x03, 0x0d,
+ 0xe8, 0x1f, 0x76, 0x60, 0xfe, 0x0f, 0x22, 0x00, 0xef, 0x0e, 0x02, 0x11,
+ 0x0d, 0x10, 0x00, 0xff,
+ 0x10, 0x77, 0x0e, 0xcb, 0xff, 0x00, 0x03, 0xe0, 0xda, 0x51, 0x52, 0x00,
+ 0xdd, 0x0f, 0x52, 0x03,
+ 0xfd, 0xfb, 0x10, 0x32, 0x01, 0xbd, 0x00, 0x02, 0x43, 0x01, 0xee, 0xff,
+ 0x03, 0x02, 0x1e, 0xdb,
+ 0x04, 0x03, 0x0c, 0x9b, 0x00, 0x33, 0x0f, 0xfd, 0xf0, 0x14, 0x00, 0x02,
+ 0x03, 0x6f, 0x1f, 0x17,
+ 0xf3, 0xce, 0xf0, 0xf4, 0xf2, 0x8d, 0xfd, 0x15, 0x10, 0xee, 0x0e, 0x11,
+ 0x22, 0xff, 0x01, 0xf0,
+ 0xfb, 0x21, 0x42, 0xfd, 0x0d, 0x13, 0x04, 0xf4, 0x0f, 0xd9, 0xb0, 0xf3,
+ 0xe4, 0xce, 0xce, 0x00,
+ 0x60, 0x02, 0x0f, 0x40, 0x13, 0x1f, 0x3d, 0x0b, 0x00, 0x14, 0x32, 0xbd,
+ 0x0d, 0x74, 0x21, 0x2f,
+ 0xcb, 0xef, 0x01, 0x12, 0xf8, 0xb0, 0x00, 0x10, 0x20, 0xdd, 0xe0, 0x20,
+ 0x71, 0x0f, 0x0e, 0x0f,
+ 0x0b, 0x2e, 0x32, 0x01, 0xae, 0x0f, 0x34, 0x22, 0x0f, 0xf0, 0x27, 0x03,
+ 0xad, 0xff, 0xf1, 0x03,
+ 0x0f, 0xde, 0x0c, 0x0b, 0xf0, 0xe1, 0xff, 0x0d, 0x20, 0xf5, 0x33, 0x5e,
+ 0x3b, 0x75, 0x75, 0xff,
+ 0xcd, 0x01, 0x04, 0x01, 0xf0, 0xee, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0x03,
+ 0x20, 0xf9, 0x10, 0x44,
+ 0xcf, 0xff, 0x30, 0x50, 0xfe, 0xe0, 0x26, 0x00, 0xc0, 0xf0, 0xff, 0x00,
+ 0xf2, 0xb2, 0xef, 0xfc,
+ 0x20, 0x75, 0x30, 0x0c, 0xf0, 0xf1, 0x01, 0x00, 0x0c, 0x41, 0x33, 0x20,
+ 0x0c, 0x00, 0x24, 0x10,
+ 0x00, 0xca, 0xd0, 0xff, 0x00, 0x9e, 0xfe, 0x24, 0x02, 0xe0, 0x2d, 0x70,
+ 0x0a, 0x20, 0x31, 0xd0,
+ 0xcc, 0xff, 0x00, 0x71, 0x12, 0xf9, 0xf0, 0x61, 0x05, 0x0e, 0xc0, 0x12,
+ 0x01, 0x0e, 0x0d, 0x02,
+ 0x03, 0x10, 0xef, 0xcc, 0xee, 0x00, 0x01, 0xdf, 0x0e, 0x54, 0x6f, 0x0f,
+ 0x05, 0x02, 0xf0, 0x00,
+ 0x04, 0x05, 0xd0, 0xd0, 0xff, 0x04, 0xcf, 0xfd, 0x10, 0x12, 0xe3, 0xb0,
+ 0xfb, 0x00, 0x30, 0x0e,
+ 0x50, 0x03, 0xff, 0xed, 0x71, 0x12, 0x00, 0xc6, 0xef, 0xf0, 0x04, 0xe0,
+ 0xe3, 0xf3, 0x06, 0x50,
+ 0x0c, 0x00, 0x65, 0x00, 0xdb, 0x00, 0x22, 0xfe, 0x0f, 0x74, 0x61, 0xfe,
+ 0xed, 0x03, 0x34, 0x09,
+ 0xef, 0x10, 0x12, 0xdd, 0xee, 0x03, 0xf3, 0x00, 0x0c, 0x0c, 0x00, 0x53,
+ 0x0f, 0xfb, 0x00, 0x22,
+ 0x0d, 0x0d, 0x70, 0x23, 0x10, 0x2c, 0x30, 0x02, 0xb0, 0xe1, 0x07, 0x57,
+ 0xf0, 0xda, 0x41, 0x11,
+ 0xd0, 0xb0, 0xff, 0xf0, 0x0f, 0xe0, 0xdd, 0x21, 0x53, 0x0e, 0x10, 0x40,
+ 0x10, 0x21, 0xe6, 0xe3,
+ 0x00, 0xff, 0x0e, 0x34, 0xe3, 0x9f, 0xdb, 0xe0, 0x13, 0x12, 0xef, 0x9e,
+ 0x00, 0xf0, 0xfc, 0x0f,
+ 0x51, 0x14, 0x20, 0x0f, 0x0f, 0x2f, 0xed, 0xd3, 0xe7, 0xf0, 0xbf, 0xef,
+ 0x14, 0x43, 0x20, 0xd0,
+ 0xee, 0x01, 0x1f, 0x0a, 0x01, 0xe1, 0x20, 0x7f, 0x33, 0x05, 0x30, 0x71,
+ 0x20, 0x0a, 0x0f, 0x00,
+ 0xff, 0xc0, 0x12, 0x23, 0xca, 0xce, 0x00, 0x31, 0x11, 0x0c, 0xed, 0xf0,
+ 0x23, 0x10, 0xcb, 0x0f,
+ 0x6e, 0x3c, 0x1d, 0x21, 0x04, 0x00, 0xdb, 0x30, 0x55, 0x11, 0x00, 0x31,
+ 0x11, 0x00, 0xbe, 0x1f,
+ 0x23, 0x84, 0xcd, 0xdb, 0x11, 0x20, 0x0f, 0xfb, 0x01, 0x10, 0x20, 0x51,
+ 0x11, 0x13, 0xe0, 0xf1,
+ 0xf3, 0xe1, 0x02, 0x21, 0xd0, 0xe7, 0x07, 0x90, 0xcb, 0xf0, 0xf3, 0xe0,
+ 0xd0, 0xff, 0x31, 0x5f,
+ 0x5d, 0x42, 0x02, 0xed, 0xcf, 0x04, 0xf1, 0xfa, 0xee, 0x24, 0x01, 0xaf,
+ 0x00, 0x07, 0x31, 0xff,
+ 0xed, 0x20, 0x00, 0xe0, 0xf1, 0x23, 0x3f, 0x0e, 0x7e, 0x75, 0x23, 0x0f,
+ 0x0b, 0x30, 0x00, 0xc0,
+ 0xfd, 0x12, 0xf1, 0xdd, 0x1f, 0x50, 0x13, 0x00, 0xc0, 0xe0, 0xef, 0x08,
+ 0x1d, 0x20, 0x02, 0x3d,
+ 0x7c, 0x0d, 0x0b, 0x00, 0x2d, 0x0e, 0xd0, 0x44, 0x53, 0x12, 0x47, 0x20,
+ 0xfd, 0xc0, 0xe3, 0xe3,
+ 0xf1, 0xdd, 0xa0, 0x01, 0xec, 0xf8, 0x0e, 0x30, 0xf2, 0x00, 0x70, 0x41,
+ 0xf0, 0xef, 0x15, 0x14,
+ 0x00, 0xe1, 0x03, 0x61, 0x0f, 0xd0, 0xe6, 0xe1, 0xef, 0xbb, 0xf1, 0x03,
+ 0x01, 0x0d, 0x0f, 0x20,
+ 0x4f, 0x1e, 0xff, 0x02, 0x00, 0x1b, 0x0e, 0xe1, 0x06, 0x00, 0xe3, 0xd0,
+ 0xb1, 0x02, 0x02, 0x0f,
+ 0xa9, 0xef, 0xf0, 0xe2, 0x91, 0x02, 0xf0, 0x3b, 0x70, 0x62, 0x0f, 0x0e,
+ 0xf5, 0x00, 0x0c, 0x2f,
+ 0x03, 0x21, 0xea, 0xee, 0x10, 0x33, 0xee, 0xdd, 0x06, 0xe2, 0xbe, 0x0b,
+ 0x0f, 0x31, 0x72, 0x0e,
+ 0xfc, 0xe0, 0x00, 0x1f, 0x3d, 0x00, 0x13, 0x55, 0x1f, 0x1d, 0x31, 0x77,
+ 0xf1, 0xcf, 0x0f, 0x02,
+ 0xf1, 0xf0, 0xeb, 0xc0, 0xfe, 0xe0, 0x10, 0x4f, 0x31, 0x10, 0xec, 0xc0,
+ 0x02, 0x16, 0x20, 0x0e,
+ 0x41, 0x74, 0x00, 0xe1, 0xe3, 0x03, 0xc0, 0x00, 0xfe, 0xdf, 0xe1, 0xf4,
+ 0xe5, 0x01, 0x70, 0x1e,
+ 0x0b, 0x00, 0x10, 0x01, 0xcd, 0x0b, 0x11, 0xf2, 0xd2, 0xf3, 0xf0, 0x0e,
+ 0x00, 0x6e, 0x01, 0xe5,
+ 0xa0, 0xdb, 0x00, 0x11, 0x03, 0x23, 0x4e, 0x59, 0x21, 0x12, 0x01, 0x10,
+ 0x11, 0x10, 0x3d, 0x0b,
+ 0xfc, 0x32, 0x30, 0xc0, 0xde, 0xdc, 0xe0, 0xc3, 0xe5, 0xe0, 0x0f, 0x39,
+ 0x7f, 0x7f, 0x10, 0xe0,
+ 0xcf, 0x0d, 0x3b, 0x00, 0xff, 0x5e, 0x30, 0x00, 0xe2, 0x21, 0x72, 0x27,
+ 0x04, 0xfe, 0xcf, 0xf2,
+ 0xe5, 0xff, 0xcd, 0x00, 0x21, 0x0e, 0x0d, 0xd0, 0x00, 0xf0, 0x0f, 0x0c,
+ 0x1c, 0x42, 0x74, 0x14,
+ 0x31, 0x10, 0xf6, 0xf1, 0xe1, 0xa1, 0xe2, 0xdf, 0xdc, 0x02, 0x17, 0xb0,
+ 0xe0, 0x00, 0x20, 0x61,
+ 0x0c, 0x0f, 0xe1, 0x00, 0xee, 0x00, 0x13, 0x30, 0x13, 0x05, 0x00, 0x0c,
+ 0x10, 0xd3, 0x80, 0xcf,
+ 0xf3, 0xe3, 0xd9, 0x0e, 0x50, 0x12, 0x03, 0x30, 0x0e, 0x0c, 0x43, 0x13,
+ 0x40, 0x4d, 0x1b, 0x3e,
+ 0x51, 0x11, 0xfe, 0xba, 0xf0, 0x03, 0x11, 0xf0, 0xe0, 0x30, 0x08, 0xff,
+ 0xef, 0xf0, 0xeb, 0x10,
+ 0x33, 0xbd, 0xb8, 0x1f, 0x70, 0x00, 0x10, 0x2f, 0x40, 0x34, 0x0f, 0x00,
+ 0x04, 0xe1, 0xcf, 0xdf,
+ 0x10, 0x14, 0x00, 0xac, 0x0e, 0xe0, 0xf2, 0x00, 0xed, 0xfc, 0x21, 0x02,
+ 0x40, 0x51, 0x22, 0x06,
+ 0x12, 0x11, 0x00, 0xc0, 0x15, 0xf1, 0x8e, 0xef, 0xf7, 0x03, 0xde, 0xff,
+ 0x01, 0x21, 0x0f, 0x1c,
+ 0x10, 0xe0, 0xcf, 0x02, 0x01, 0xdb, 0x10, 0x71, 0x32, 0x14, 0xf2, 0xb0,
+ 0xeb, 0xf0, 0x02, 0xe4,
+ 0x80, 0x00, 0x0d, 0x0f, 0x01, 0x37, 0x11, 0x00, 0xc0, 0x20, 0x60, 0x10,
+ 0x10, 0x3d, 0x3d, 0xdd,
+ 0xe0, 0x00, 0x0d, 0x24, 0x10, 0xe8, 0xbf, 0x0f, 0x32, 0xe5, 0xde, 0x5c,
+ 0x70, 0xfe, 0xef, 0x0f,
+ 0xfe, 0xfc, 0xec, 0x2e, 0x4d, 0x0e, 0x3f, 0x40, 0x40, 0x22, 0x0e, 0xc3,
+ 0x07, 0x17, 0xf0, 0xee,
+ 0x10, 0x22, 0x01, 0xa0, 0xf0, 0xee, 0xd8, 0xde, 0x11, 0x01, 0xef, 0x2f,
+ 0x30, 0x34, 0x50, 0x4f,
+ 0x50, 0x66, 0xf0, 0xde, 0xe0, 0x05, 0xf3, 0xd0, 0xd0, 0x00, 0x00, 0x23,
+ 0x02, 0xc2, 0xdd, 0x0c,
+ 0x31, 0xdf, 0x8b, 0x01, 0x04, 0x20, 0x1c, 0x60, 0x10, 0xf1, 0xc2, 0x07,
+ 0xf0, 0xed, 0xf0, 0x04,
+ 0x00, 0xdd, 0xe0, 0xf1, 0xe2, 0xb2, 0x23, 0x32, 0x3e, 0x19, 0x50, 0x73,
+ 0x11, 0x1e, 0x0e, 0x0f,
+ 0x21, 0x20, 0xeb, 0x00, 0x03, 0xc0, 0xf2, 0x2d, 0x3e, 0x31, 0x02, 0xfb,
+ 0xcc, 0xde, 0xe1, 0xae,
+ 0xd8, 0xfc, 0xff, 0x2d, 0x5c, 0x70, 0x31, 0x01, 0x11, 0x0f, 0x2c, 0x10,
+ 0x27, 0x02, 0xf0, 0x0e,
+ 0x23, 0xb2, 0xe0, 0xeb, 0xe0, 0xc0, 0xbc, 0xfe, 0xe0, 0x00, 0xe1, 0x32,
+ 0x3f, 0x6c, 0x30, 0x34,
+ 0x20, 0x01, 0xef, 0xc0, 0xf6, 0xf3, 0x02, 0x90, 0xf0, 0xf2, 0x03, 0x00,
+ 0x21, 0xe5, 0xa0, 0xee,
+ 0xed, 0x01, 0x02, 0x10, 0x35, 0x40, 0x2b, 0xf0, 0xcf, 0x07, 0xe2, 0xe0,
+ 0x1f, 0x0d, 0xdf, 0xe2,
+ 0xb2, 0x80, 0xf3, 0x02, 0x10, 0x02, 0xf3, 0x00, 0x03, 0x36, 0x4d, 0x6b,
+ 0x31, 0x03, 0x00, 0x0c,
+ 0x1a, 0x0f, 0xf2, 0x03, 0xe0, 0x4b, 0x30, 0x30, 0x24, 0x2f, 0x00, 0xe2,
+ 0x81, 0xc9, 0xff, 0xdf,
+ 0x10, 0x2d, 0x3e, 0x0c, 0x0e, 0x7f, 0x02, 0x20, 0x08, 0x30, 0x50, 0x00,
+ 0x01, 0xf4, 0x04, 0x10,
+ 0x6e, 0x1d, 0xf0, 0xc3, 0xef, 0xed, 0xfe, 0xe0, 0xeb, 0x0f, 0x02, 0x30,
+ 0x2f, 0x7d, 0x43, 0x10,
+ 0x0d, 0xfe, 0xd7, 0xc4, 0x00, 0xf2, 0x04, 0x34, 0x10, 0x0f, 0x80, 0xf3,
+ 0xe4, 0xf0, 0xe0, 0xe0,
+ 0x0b, 0x00, 0x5f, 0x00, 0x00, 0xe0, 0x37, 0x30, 0xed, 0xf0, 0x14, 0x02,
+ 0xaf, 0xea, 0x00, 0x13,
+ 0xc0, 0x92, 0x02, 0xe0, 0xfd, 0xe0, 0x07, 0x32, 0x00, 0x0c, 0x50, 0x70,
+ 0x13, 0x1d, 0x0c, 0xf2,
+ 0xf2, 0x0e, 0x0d, 0x31, 0x23, 0x2f, 0x2f, 0x01, 0xf7, 0xf1, 0xcf, 0xef,
+ 0xff, 0xc8, 0xdf, 0xe0,
+ 0xf0, 0xcf, 0x3d, 0x7e, 0x0d, 0x1e, 0x60, 0x0d, 0x1d, 0x1f, 0x20, 0x27,
+ 0x33, 0x14, 0x21, 0x22,
+ 0x20, 0x0b, 0x8e, 0xef, 0xe3, 0xe2, 0xbb, 0xee, 0xf0, 0x00, 0x10, 0x2d,
+ 0x7e, 0x2d, 0xf8, 0xf0,
+ 0x13, 0x02, 0xfe, 0x00, 0x16, 0x61, 0x00, 0x12, 0xd4, 0xa0, 0xfd, 0x14,
+ 0x02, 0xd0, 0xfc, 0x00,
+ 0xf1, 0xe0, 0x0e, 0x21, 0x24, 0xfd, 0xfb, 0x32, 0x65, 0xf0, 0xde, 0x0f,
+ 0x52, 0xf0, 0xde, 0xe0,
+ 0xe5, 0xf0, 0x9e, 0x01, 0xe2, 0xe2, 0x12, 0x12, 0x21, 0x20, 0x7c, 0x31,
+ 0xf3, 0xf3, 0xdf, 0x00,
+ 0x5a, 0x09, 0x10, 0x00, 0x42, 0x04, 0x01, 0x00, 0x0e, 0x41, 0x10, 0xee,
+ 0x90, 0xff, 0x08, 0xfe,
+ 0x00, 0x11, 0x0d, 0x0a, 0x0d, 0x0e, 0x40, 0x2f, 0x0d, 0x2e, 0x71, 0x15,
+ 0x12, 0x22, 0x51, 0x22,
+ 0x10, 0xdc, 0xd0, 0xc1, 0xe5, 0xc0, 0xd1, 0x0e, 0x3b, 0x3f, 0x40, 0xf0,
+ 0xd0, 0xfa, 0x2f, 0x4f,
+ 0x11, 0xf3, 0xf0, 0x20, 0x1f, 0x32, 0xe6, 0x02, 0xb2, 0xa3, 0xf3, 0x03,
+ 0xbf, 0xfc, 0x12, 0x33,
+ 0xad, 0xc9, 0x00, 0x44, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x11, 0x01, 0x3d,
+ 0x0c, 0x0f, 0xb2, 0xf0,
+ 0xc0, 0xc0, 0xc7, 0xf1, 0x13, 0x01, 0x0f, 0x16, 0x54, 0x00, 0x0e, 0x1e,
+ 0x21, 0x03, 0x0c, 0x0d,
+ 0x3f, 0x1c, 0x5f, 0x5f, 0x24, 0x07, 0x02, 0x1f, 0x1c, 0x01, 0xc4, 0xe0,
+ 0xef, 0xc0, 0xf0, 0xed,
+ 0x0e, 0x1e, 0x19, 0xfe, 0x0b, 0xdf, 0x7f, 0x3e, 0x00, 0x13, 0x70, 0x51,
+ 0x31, 0x50, 0x00, 0x02,
+ 0xd5, 0xef, 0xf0, 0xf4, 0xef, 0xeb, 0x00, 0x0f, 0xfd, 0x00, 0x02, 0xf1,
+ 0x0d, 0x58, 0x30, 0x0f,
+ 0x0f, 0x00, 0x77, 0x10, 0x2f, 0x0f, 0x04, 0x04, 0xc1, 0xdf, 0xdf, 0xd0,
+ 0xb3, 0xd0, 0xe2, 0xe1,
+ 0xfd, 0xcb, 0x0f, 0x63, 0xd2, 0xe2, 0x00, 0x0f, 0x6e, 0x4e, 0x2f, 0x33,
+ 0xd4, 0xaf, 0xfe, 0xf2,
+ 0xf6, 0xdf, 0xec, 0x00, 0xe2, 0x03, 0xf7, 0x24, 0x21, 0x0f, 0x3e, 0x4e,
+ 0xff, 0xdf, 0x52, 0x11,
+ 0x3a, 0x2f, 0x70, 0x65, 0x01, 0x0f, 0xfc, 0x00, 0x23, 0x10, 0xf0, 0xd2,
+ 0x03, 0xe1, 0xf8, 0x0f,
+ 0x3e, 0x0f, 0xdd, 0xcd, 0xce, 0xdb, 0xf0, 0x3f, 0x51, 0x60, 0x4d, 0x11,
+ 0x24, 0x30, 0x2e, 0x06,
+ 0xc1, 0xef, 0xee, 0x22, 0x03, 0xde, 0xff, 0xde, 0xdd, 0xde, 0x03, 0x07,
+ 0x2f, 0xb8, 0x1c, 0x70,
+ 0x10, 0x31, 0xf2, 0x01, 0x2f, 0x70, 0x02, 0xf2, 0xb7, 0xf4, 0x00, 0x0e,
+ 0x00, 0xe1, 0xe2, 0xe0,
+ 0xe0, 0xc1, 0xf1, 0xdf, 0x00, 0x03, 0x3f, 0x6c, 0x40, 0x12, 0x02, 0xf5,
+ 0xd1, 0x9d, 0x09, 0xdf,
+ 0xc0, 0xf0, 0xf0, 0xf5, 0xf4, 0x10, 0x00, 0x2e, 0x23, 0xf3, 0x10, 0x0a,
+ 0x50, 0x31, 0x01, 0xd1,
+ 0x0e, 0x7e, 0x60, 0x1f, 0x4d, 0x10, 0x00, 0xf0, 0xe7, 0x01, 0x06, 0x02,
+ 0x00, 0x3d, 0x4b, 0xef,
+ 0xc0, 0xf0, 0xbb, 0xee, 0xbc, 0x0f, 0x20, 0x30, 0x30, 0x5c, 0x2f, 0x1f,
+ 0x30, 0x35, 0x21, 0x00,
+ 0xf1, 0xd0, 0xd0, 0xf0, 0x00, 0xc2, 0x85, 0xff, 0x0d, 0x0e, 0x0f, 0xe0,
+ 0x02, 0xd9, 0x0d, 0x4e,
+ 0x70, 0x2e, 0x0e, 0x16, 0x25, 0xe0, 0xdd, 0xf3, 0xf6, 0x01, 0x3f, 0x0e,
+ 0xc1, 0xb3, 0xd2, 0xe0,
+ 0x80, 0xff, 0xfe, 0x00, 0x14, 0x01, 0x10, 0x31, 0x40, 0x11, 0x00, 0x23,
+ 0xe5, 0x8c, 0xfd, 0x0e,
+ 0xd0, 0x01, 0x02, 0xe7, 0xd6, 0xd0, 0x10, 0x30, 0x10, 0xf0, 0xef, 0xd0,
+ 0xb4, 0xd4, 0x11, 0x7d,
+ 0x7a, 0x1f, 0x2f, 0x00, 0x0f, 0x11, 0x05, 0x00, 0xff, 0x01, 0x36, 0x30,
+ 0xf1, 0x0e, 0x0e, 0xcd,
+ 0xae, 0xe0, 0xd1, 0x0c, 0xe9, 0x0f, 0x5d, 0x20, 0x10, 0x20, 0x1f, 0x50,
+ 0x61, 0x10, 0x10, 0x0e,
+ 0xe4, 0xf2, 0xfd, 0x1f, 0x41, 0x07, 0xf0, 0xcf, 0xf0, 0xf0, 0xdf, 0xd8,
+ 0x10, 0x40, 0x11, 0x1c,
+ 0x1e, 0x10, 0xf3, 0xe2, 0x20, 0x70, 0x23, 0xf1, 0x05, 0xf3, 0xf2, 0xf1,
+ 0x01, 0xb0, 0xa5, 0xf4,
+ 0xc0, 0xcc, 0xff, 0x02, 0x24, 0x2f, 0x20, 0x13, 0x20, 0x0e, 0x1c, 0xf1,
+ 0xd3, 0xcc, 0xbb, 0xbf,
+ 0xf1, 0xf5, 0xe3, 0x01, 0xff, 0x1e, 0x31, 0xf5, 0xd2, 0xb2, 0xd2, 0xc0,
+ 0x1d, 0x1f, 0x62, 0x23,
+ 0x3a, 0x5d, 0x0e, 0x0a, 0xf0, 0xf5, 0x22, 0x00, 0x2e, 0x70, 0x22, 0x22,
+ 0xf2, 0xe1, 0xdf, 0xf9,
+ 0x0e, 0xe0, 0xee, 0xcc, 0xce, 0x0d, 0x0e, 0x0e, 0x6f, 0x60, 0x2f, 0x0a,
+ 0x0e, 0x10, 0x43, 0xf2,
+ 0x00, 0x1d, 0x40, 0x02, 0x03, 0xf1, 0xc4, 0xc7, 0xf2, 0xf8, 0x0f, 0x30,
+ 0x0e, 0xdf, 0xfe, 0x00,
+ 0x12, 0x7f, 0x2b, 0x01, 0xe3, 0xf0, 0x20, 0x40, 0x56, 0x22, 0xf0, 0xc1,
+ 0xc2, 0xe4, 0xe1, 0xd0,
+ 0xec, 0xd0, 0xf2, 0xe2, 0x03, 0x72, 0x32, 0x2f, 0xfc, 0x0e, 0x31, 0xc3,
+ 0xcf, 0xdb, 0x00, 0xf2,
+ 0xe0, 0x00, 0xf3, 0xd7, 0xc4, 0x0d, 0xed, 0xd2, 0x87, 0xd3, 0x01, 0xd0,
+ 0x0f, 0x5d, 0x50, 0x2f,
+ 0xf1, 0xee, 0x1f, 0x3f, 0x3e, 0x20, 0x47, 0x27, 0x10, 0x3f, 0x11, 0x15,
+ 0x00, 0xf0, 0xec, 0x90,
+ 0xdf, 0x9f, 0xff, 0x0e, 0xdd, 0x0c, 0x3d, 0x3f, 0x3e, 0x50, 0x0e, 0x0f,
+ 0x0c, 0x4d, 0x70, 0x11,
+ 0x03, 0x02, 0x04, 0x02, 0x00, 0xf1, 0xf4, 0xe0, 0xdb, 0xe0, 0x00, 0x18,
+ 0x1b, 0x21, 0xd0, 0xce,
+ 0xff, 0xe0, 0x52, 0x60, 0x2c, 0x0e, 0x03, 0x57, 0x13, 0x00, 0xf0, 0xde,
+ 0xef, 0xe2, 0xe6, 0xaf,
+ 0xd0, 0xd1, 0x03, 0x2f, 0xf0, 0x04, 0x71, 0x20, 0xfd, 0xff, 0xf0, 0xc5,
+ 0xe0, 0xf0, 0xf0, 0x00,
+ 0x2f, 0x2e, 0x1d, 0xb2, 0xb6, 0xe2, 0xe5, 0xf3, 0xe0, 0xe2, 0xe3, 0x02,
+ 0x2f, 0x38, 0x2e, 0x41,
+ 0xf3, 0x0e, 0x4d, 0x6d, 0x2f, 0x00, 0x15, 0x77, 0x20, 0x20, 0x20, 0x30,
+ 0x03, 0xe2, 0x81, 0xf0,
+ 0x0a, 0x0f, 0xed, 0x1d, 0x1e, 0xe0, 0xd1, 0x0e, 0x6b, 0x00, 0x2e, 0x1d,
+ 0x28, 0x0f, 0x41, 0x44,
+ 0x4f, 0x0e, 0xe0, 0xf2, 0x01, 0x01, 0x03, 0x0f, 0x59, 0xe0, 0xd0, 0x21,
+ 0x0f, 0xde, 0x8f, 0x0e,
+ 0x0f, 0x0d, 0x20, 0x20, 0x42, 0x0f, 0xfd, 0x26, 0x52, 0x03, 0xf3, 0xf1,
+ 0xb0, 0xfe, 0xf0, 0xe5,
+ 0xb7, 0xe2, 0x02, 0x0f, 0x30, 0x42, 0x10, 0xfd, 0xc0, 0xf1, 0xe6, 0x02,
+ 0x42, 0x00, 0x28, 0x0f,
+ 0x0d, 0xc2, 0xb3, 0xe2, 0xe2, 0xdf, 0xef, 0xd1, 0xf6, 0xf3, 0x01, 0x01,
+ 0x1b, 0x00, 0x22, 0x00,
+ 0x6e, 0x0e, 0x5d, 0xee, 0x9a, 0x13, 0x00, 0xeb, 0x3d, 0x78, 0x2f, 0xf1,
+ 0x10, 0x0f, 0xfe, 0xc2,
+ 0x52, 0x4e, 0x6c, 0x24, 0x04, 0x13, 0x00, 0x03, 0x03, 0x2d, 0xed, 0xba,
+ 0x0f, 0xff, 0xde, 0xff,
+ 0x0e, 0x0d, 0x0b, 0xde, 0xfe, 0x0d, 0x7c, 0x6e, 0x1b, 0x4e, 0x0f, 0x04,
+ 0x34, 0x02, 0xfd, 0x0d,
+ 0x01, 0x11, 0x04, 0xc4, 0x01, 0x0c, 0x2c, 0xf0, 0x81, 0xe0, 0x0c, 0xfc,
+ 0x1e, 0x1f, 0x0d, 0x21,
+ 0x25, 0x51, 0x3f, 0x5e, 0x10, 0x15, 0xf2, 0xc0, 0xcf, 0xe1, 0xe2, 0xc3,
+ 0x07, 0x34, 0x0e, 0x2d,
+ 0x20, 0xc0, 0xc2, 0xe2, 0x03, 0x33, 0x0d, 0x3c, 0x12, 0x15, 0xa0, 0xfb,
+ 0xf0, 0xfe, 0x00, 0xe0,
+ 0xc3, 0xa2, 0xc5, 0x01, 0x01, 0x15, 0x10, 0xf0, 0xf0, 0xf5, 0xff, 0xdd,
+ 0x00, 0xe0, 0x0f, 0x2d,
+ 0x7f, 0x71, 0x25, 0x15, 0x02, 0x30, 0x01, 0x02, 0x03, 0x03, 0x0e, 0x08,
+ 0xcd, 0xf0, 0xf2, 0x00,
+ 0xc0, 0xdf, 0xb9, 0xff, 0x0e, 0x6f, 0x0c, 0x2f, 0x30, 0x41, 0x1f, 0x2c,
+ 0x01, 0x03, 0x21, 0x1e,
+ 0x3f, 0x60, 0x07, 0x03, 0xff, 0xdc, 0x00, 0x0f, 0xd0, 0x02, 0xcd, 0x9a,
+ 0xdd, 0x0f, 0x12, 0x53,
+ 0x20, 0x5e, 0x1e, 0x2f, 0x01, 0xc5, 0xe2, 0xe0, 0x01, 0x03, 0xef, 0x11,
+ 0x34, 0x07, 0xb1, 0xd1,
+ 0x02, 0x00, 0x4f, 0xf0, 0xc4, 0xd5, 0x01, 0x00, 0x5f, 0x3e, 0x1f, 0xdc,
+ 0xaa, 0xf0, 0xf0, 0x02,
+ 0xb0, 0xe3, 0x02, 0x02, 0xf7, 0xf4, 0x01, 0xd0, 0xed, 0x01, 0x0f, 0xfd,
+ 0x80, 0xee, 0x20, 0x68,
+ 0x10, 0x20, 0x24, 0x23, 0x00, 0x03, 0x11, 0x4f, 0x20, 0x05, 0xf1, 0xde,
+ 0xd0, 0x20, 0xe0, 0x8d,
+ 0xed, 0xfd, 0x08, 0x1d, 0xde, 0x1e, 0x7e, 0x3e, 0xfd, 0x0c, 0x1e, 0x4e,
+ 0x10, 0x24, 0x4e, 0x00,
+ 0x03, 0xe7, 0x23, 0x21, 0x0f, 0x0b, 0xed, 0xce, 0xbf, 0xcf, 0xbe, 0xff,
+ 0x0e, 0x1b, 0x4f, 0x6e,
+ 0x1d, 0x02, 0xf7, 0x02, 0x3e, 0xfb, 0x01, 0x04, 0xc3, 0xe0, 0xf0, 0x02,
+ 0x04, 0xf1, 0xff, 0xdd,
+ 0xc2, 0xd7, 0xf5, 0xf0, 0x21, 0x1f, 0x5e, 0x70, 0x01, 0x00, 0x0f, 0xe0,
+ 0xed, 0xee, 0xf1, 0xdf,
+ 0xc0, 0xd7, 0xe5, 0xf0, 0xff, 0xf2, 0xd7, 0x92, 0xc0, 0xcd, 0xfd, 0x0f,
+ 0xe0, 0x10, 0x50, 0x00,
+ 0x0c, 0x63, 0x47, 0x01, 0xe0, 0x2f, 0x3f, 0x41, 0x13, 0x22, 0xf1, 0xe2,
+ 0xd0, 0x0d, 0x0f, 0xcc,
+ 0xca, 0x0e, 0xef, 0xff, 0xea, 0x0e, 0x40, 0x30, 0x2d, 0x29, 0x70, 0x30,
+ 0x30, 0xf0, 0x00, 0xf3,
+ 0x33, 0x7e, 0x7f, 0x11, 0x03, 0xde, 0xee, 0x00, 0xfb, 0xce, 0xef, 0x1c,
+ 0x2e, 0x0a, 0x0f, 0x4f,
+ 0x3f, 0x11, 0x10, 0x1b, 0x0e, 0xd2, 0xf7, 0xc2, 0x00, 0x0e, 0x10, 0x71,
+ 0x03, 0xd5, 0xb0, 0xf0,
+ 0xf0, 0xf4, 0x03, 0x02, 0x05, 0x1f, 0x5e, 0x10, 0x11, 0xf0, 0xde, 0xe1,
+ 0xb0, 0xda, 0xbc, 0x0f,
+ 0x03, 0x33, 0xdf, 0xd5, 0x05, 0x02, 0xb0, 0xd0, 0xd0, 0xcf, 0xfb, 0x00,
+ 0xe0, 0xd2, 0x01, 0x5e,
+ 0x1e, 0x40, 0x41, 0x57, 0x10, 0x2f, 0x30, 0x52, 0x14, 0x02, 0x03, 0xe1,
+ 0xf0, 0xfa, 0xee, 0x0f,
+ 0x0e, 0x80, 0xe0, 0xf1, 0x0d, 0x58, 0x0b, 0x10, 0x1f, 0xf0, 0xfd, 0x1f,
+ 0x41, 0x11, 0x72, 0x21,
+ 0x0f, 0x1f, 0x23, 0x03, 0x00, 0xd0, 0xcb, 0xff, 0xcf, 0x00, 0xe1, 0xef,
+ 0x18, 0x3d, 0x7d, 0x20,
+ 0xf1, 0x04, 0x0d, 0x2c, 0x00, 0x05, 0x22, 0x00, 0xb0, 0x1e, 0x50, 0x0f,
+ 0xc0, 0xe6, 0xd1, 0xf5,
+ 0xf1, 0xd1, 0xe0, 0x00, 0x51, 0x33, 0x12, 0x04, 0x02, 0x0e, 0xda, 0xd0,
+ 0xe0, 0x0d, 0xac, 0x0f,
+ 0x35, 0x25, 0xa1, 0xb0, 0x02, 0xe1, 0xe0, 0xd0, 0xc2, 0x00, 0xf8, 0xd0,
+ 0xf0, 0x02, 0xf0, 0x0e,
+ 0x50, 0x30, 0x60, 0x4f, 0x11, 0x07, 0xf2, 0x50, 0x31, 0x11, 0x11, 0xf0,
+ 0xdf, 0xfc, 0x00, 0xf4,
+ 0x81, 0x0c, 0x0b, 0x0f, 0x0e, 0x10, 0x10, 0x09, 0xef, 0xee, 0x00, 0x3f,
+ 0x6e, 0x21, 0x73, 0x01,
+ 0x20, 0x0d, 0x4f, 0x00, 0xf4, 0xd6, 0xd0, 0x0d, 0x0c, 0xe0, 0xdf, 0x10,
+ 0x20, 0x10, 0x3d, 0x1d,
+ 0x3d, 0x3f, 0xb2, 0xe3, 0x22, 0x7c, 0x2e, 0x13, 0x16, 0x10, 0x0c, 0xa0,
+ 0xe2, 0xf7, 0xf3, 0xbf,
+ 0xef, 0x00, 0x44, 0x03, 0x07, 0x01, 0x10, 0x0f, 0xde, 0xcf, 0xe0, 0x10,
+ 0x1f, 0xbd, 0x1d, 0x50,
+ 0xf5, 0xb3, 0xf5, 0xf1, 0x00, 0xf0, 0xf0, 0x01, 0xf2, 0xa4, 0xd1, 0xd1,
+ 0x1c, 0x3f, 0xe0, 0xef,
+ 0x09, 0x2f, 0x14, 0x04, 0x51, 0x7f, 0x5f, 0x00, 0x11, 0x03, 0x06, 0xf0,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0x02, 0x12, 0x1e, 0xd9, 0xec, 0x0f, 0x0e, 0xcd, 0xcf, 0xde, 0x0b, 0x70,
+ 0x3f, 0x6f, 0x20, 0x01,
+ 0x32, 0x20, 0xfe, 0x0d, 0x01, 0x17, 0xb7, 0xcf, 0x0c, 0x00, 0x20, 0x00,
+ 0x0d, 0x0f, 0x0f, 0x00,
+ 0x00, 0x10, 0x5e, 0x00, 0x2f, 0x30, 0x2f, 0x12, 0x34, 0x00, 0xdf, 0x8b,
+ 0xc3, 0xf6, 0xe1, 0xd0,
+ 0x00, 0xf7, 0x31, 0x74, 0xf0, 0xd2, 0xe0, 0xf0, 0x10, 0x4d, 0x00, 0x0c,
+ 0xee, 0xf0, 0x04, 0xc2,
+ 0x00, 0x01, 0xf2, 0x84, 0xd0, 0x0f, 0xf1, 0xc7, 0xa7, 0xe0, 0x0e, 0xfe,
+ 0xff, 0xe0, 0x02, 0x00,
+ 0x00, 0x0d, 0x31, 0x64, 0x54, 0x30, 0x10, 0x12, 0x00, 0x22, 0x25, 0x02,
+ 0xc4, 0x00, 0xff, 0x0d,
+ 0x01, 0x06, 0x2f, 0xbb, 0xde, 0xee, 0xf0, 0xce, 0xbd, 0x0a, 0x2f, 0x30,
+ 0x40, 0x70, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xef, 0x0a, 0x0e, 0x20, 0x0f,
+ 0xe0, 0xfe, 0xfe, 0xe0,
+ 0x1e, 0x5d, 0x00, 0x02, 0x2e, 0x78, 0x40, 0x01, 0xd2, 0xed, 0x00, 0xe3,
+ 0x0c, 0x1d, 0x00, 0xf5,
+ 0x05, 0xe2, 0xe5, 0xe2, 0xf1, 0x00, 0x00, 0xde, 0xef, 0x00, 0xc3, 0xc1,
+ 0xd0, 0x4b, 0x5f, 0x10,
+ 0xc2, 0xc2, 0xf5, 0xd2, 0xf0, 0xd0, 0xd6, 0xe5, 0xd2, 0x9e, 0xce, 0xde,
+ 0xe0, 0xe0, 0xe0, 0xb3,
+ 0xde, 0xfe, 0x3f, 0x72, 0x74, 0x03, 0x04, 0x0f, 0x0e, 0x13, 0x07, 0x27,
+ 0x10, 0x0f, 0x0f, 0x03,
+ 0x02, 0x31, 0x0c, 0xee, 0xcd, 0xde, 0xb0, 0xee, 0xdf, 0xe8, 0x2f, 0x5f,
+ 0x5f, 0x4e, 0x1e, 0x01,
+ 0x32, 0x00, 0x1e, 0x0c, 0x02, 0xe4, 0x01, 0x3e, 0x1b, 0xef, 0x10, 0x70,
+ 0xe0, 0x9e, 0xf0, 0x0c,
+ 0x3a, 0x0f, 0x3e, 0x3f, 0x2f, 0xe2, 0xf6, 0x00, 0x0e, 0xef, 0xed, 0x1b,
+ 0x4f, 0xb1, 0xd7, 0xf2,
+ 0x00, 0x31, 0x00, 0x03, 0xa2, 0xd0, 0xdf, 0x01, 0x20, 0x40, 0x1d, 0x00,
+ 0xe5, 0x00, 0x3c, 0xae,
+ 0xf0, 0x10, 0xf1, 0x87, 0xe7, 0x01, 0x20, 0xee, 0xb0, 0xd3, 0xd0, 0xb0,
+ 0xff, 0xe0, 0xd2, 0x03,
+ 0x1e, 0x1c, 0x20, 0x72, 0x43, 0x01, 0xf6, 0x00, 0x2c, 0x21, 0x06, 0x03,
+ 0x23, 0x41, 0x20, 0x1c,
+ 0x3f, 0xed, 0x81, 0xf6, 0xff, 0xdc, 0xfd, 0xe0, 0xef, 0x0f, 0x2c, 0x3e,
+ 0x7e, 0x70, 0x0e, 0x0f,
+ 0x10, 0x11, 0x01, 0xe1, 0x13, 0x44, 0x0e, 0xf8, 0x00, 0xf0, 0xe1, 0xd1,
+ 0x0d, 0xfb, 0xfd, 0x3c,
+ 0x5f, 0x01, 0x27, 0x20, 0x40, 0xfc, 0x00, 0x50, 0x1f, 0x0e, 0xde, 0xb0,
+ 0x03, 0x00, 0x41, 0x14,
+ 0x05, 0xc2, 0xe0, 0xc1, 0x04, 0x11, 0x00, 0xd0, 0x04, 0x2f, 0x2e, 0xe0,
+ 0xed, 0x3d, 0x0e, 0xc0,
+ 0xb0, 0x03, 0x35, 0x05, 0xa1, 0x0f, 0x0e, 0xd2, 0x87, 0xd3, 0xd0, 0xeb,
+ 0xe0, 0xe0, 0xc0, 0xe1,
+ 0x04, 0x11, 0x6e, 0x3c, 0x10, 0x00, 0x02, 0xd3, 0x26, 0x30, 0x60, 0x31,
+ 0x44, 0x02, 0x00, 0x00,
+ 0x30, 0x13, 0xe0, 0x8a, 0x00, 0xd0, 0xfd, 0xcd, 0x0d, 0x1c, 0x5d, 0x1a,
+ 0x10, 0x00, 0x0d, 0x0f,
+ 0x21, 0x40, 0x4d, 0x0f, 0x20, 0x0f, 0x06, 0x03, 0xf0, 0xdc, 0x19, 0x20,
+ 0xc0, 0x90, 0xff, 0x1e,
+ 0x30, 0x23, 0x21, 0xf2, 0x0e, 0x2a, 0x4f, 0x0b, 0xef, 0x0f, 0x00, 0xee,
+ 0x0f, 0x72, 0x07, 0x21,
+ 0x0f, 0xb1, 0xc3, 0xd2, 0x13, 0x36, 0x01, 0xe0, 0x0d, 0x2e, 0x00, 0xb0,
+ 0xe1, 0xf1, 0x00, 0x0b,
+ 0x2f, 0xb2, 0x05, 0x01, 0x61, 0x02, 0xe5, 0x90, 0xed, 0xd0, 0xb5, 0xd0,
+ 0xef, 0xf0, 0x01, 0x10,
+ 0x2e, 0xe1, 0xf1, 0x0b, 0x7c, 0x1f, 0x05, 0xf4, 0x01, 0x31, 0x4f, 0x51,
+ 0x24, 0x14, 0x31, 0x00,
+ 0x0d, 0xc2, 0xe6, 0xb0, 0xde, 0xff, 0x0c, 0x0e, 0x10, 0x20, 0x0b, 0xff,
+ 0x0e, 0x20, 0x7e, 0x7f,
+ 0x1e, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x25, 0x03, 0xdc, 0xd8, 0xf0, 0x00,
+ 0xff, 0xbe, 0x00, 0x0f,
+ 0x51, 0x23, 0x13, 0x2d, 0x08, 0x0f, 0x20, 0x3e, 0x0f, 0x10, 0x20, 0x22,
+ 0x0d, 0xdc, 0x32, 0x04,
+ 0x83, 0xd7, 0xf0, 0x00, 0x10, 0x13, 0x06, 0xd0, 0x8e, 0x00, 0x10, 0x40,
+ 0xe0, 0xdb, 0xf0, 0xf3,
+ 0x01, 0x61, 0x30, 0x20, 0xf0, 0xd1, 0xa4, 0xe0, 0xe2, 0xd4, 0xc1, 0x0f,
+ 0xdc, 0xc0, 0xf3, 0x00,
+ 0x00, 0x0d, 0x3d, 0x00, 0xcb, 0xf0, 0xc7, 0x04, 0x30, 0x7d, 0x50, 0x20,
+ 0x35, 0x03, 0x11, 0xe1,
+ 0xe1, 0x0f, 0x3f, 0x01, 0x80, 0xf9, 0x00, 0xff, 0x00, 0x0d, 0x0e, 0x0e,
+ 0x0e, 0x0c, 0x1b, 0x5f,
+ 0x3f, 0x3f, 0x12, 0x25, 0x30, 0x40, 0x0e, 0xef, 0xeb, 0x0f, 0xd0, 0xb0,
+ 0x01, 0x1e, 0x10, 0x23,
+ 0x6e, 0x0e, 0xdd, 0xf0, 0xf0, 0x4b, 0x3d, 0x3c, 0x1c, 0x4e, 0xf0, 0xc0,
+ 0x0e, 0x3b, 0x6e, 0x02,
+ 0xc7, 0xe3, 0xe3, 0xf3, 0x41, 0x33, 0x02, 0x02, 0x9e, 0xeb, 0xe0, 0x01,
+ 0xf1, 0xfe, 0x30, 0x43,
+ 0x10, 0x1b, 0x20, 0x15, 0xc4, 0xcf, 0xc0, 0xe1, 0xc6, 0x90, 0xe0, 0xf3,
+ 0xe0, 0x0f, 0x2d, 0x1f,
+ 0xef, 0xc0, 0xf1, 0xe3, 0xc1, 0xde, 0x1e, 0x5f, 0x40, 0x30, 0x37, 0x36,
+ 0x22, 0x30, 0x01, 0xe0,
+ 0x00, 0x1f, 0x21, 0xe3, 0xa2, 0xdb, 0xed, 0xdf, 0xd0, 0xed, 0xf9, 0xdf,
+ 0x0e, 0x1d, 0x7c, 0x70,
+ 0x15, 0x31, 0x30, 0x0b, 0x20, 0x01, 0x00, 0x1e, 0xdf, 0xe0, 0xe0, 0x50,
+ 0x10, 0xb1, 0xf0, 0x1d,
+ 0x11, 0x03, 0x0d, 0x0c, 0x70, 0x10, 0xfa, 0x0b, 0x20, 0x40, 0x10, 0x0c,
+ 0xde, 0xec, 0xf0, 0xf1,
+ 0xd7, 0xf3, 0xf0, 0x00, 0x70, 0x10, 0xe0, 0x95, 0xe2, 0x0f, 0x1c, 0x01,
+ 0xf3, 0x20, 0x4e, 0x00,
+ 0x00, 0x44, 0x60, 0x00, 0xf0, 0xb3, 0xd7, 0xe2, 0x00, 0xd0, 0x00, 0xe0,
+ 0xf0, 0x00, 0xe1, 0xe0,
+ 0xa0, 0xe4, 0xff, 0xcc, 0x00, 0xfc, 0x00, 0x11, 0x63, 0x47, 0x20, 0x21,
+ 0x15, 0x03, 0x02, 0x4f,
+ 0x3d, 0x00, 0xf5, 0xc3, 0x03, 0x01, 0xcd, 0xfa, 0xeb, 0xd0, 0xd0, 0xfe,
+ 0x0e, 0xee, 0x5e, 0x70,
+ 0x72, 0x0e, 0x0f, 0x00, 0x0b, 0x1f, 0x2d, 0x1f, 0x00, 0xc1, 0x0c, 0x1c,
+ 0x00, 0x07, 0x20, 0x0e,
+ 0xff, 0xd0, 0x00, 0x00, 0x10, 0x70, 0x40, 0x08, 0x1d, 0x1c, 0xff, 0xdf,
+ 0xe0, 0x01, 0x3e, 0x50,
+ 0x07, 0x03, 0xf4, 0x00, 0x0f, 0x20, 0xf1, 0x84, 0xb1, 0xf0, 0x0f, 0xed,
+ 0xf2, 0x02, 0x6f, 0x2b,
+ 0x20, 0x12, 0xff, 0xd1, 0xf7, 0xc4, 0xcf, 0x0d, 0x02, 0x03, 0xf3, 0xe0,
+ 0x00, 0xb1, 0xc1, 0xd0,
+ 0x01, 0xb5, 0xdf, 0xeb, 0xf0, 0x0e, 0x00, 0x25, 0x33, 0x60, 0x41, 0x10,
+ 0x23, 0x10, 0x02, 0x17,
+ 0x36, 0x30, 0x30, 0x01, 0xc4, 0xdf, 0xad, 0xec, 0xe0, 0xf0, 0xf0, 0xed,
+ 0x0e, 0x4c, 0x2f, 0x5f,
+ 0x3e, 0x33, 0x33, 0x6a, 0x0c, 0x0e, 0x10, 0x01, 0xf0, 0x0d, 0x12, 0x4f,
+ 0x2a, 0x00, 0xa0, 0xf3,
+ 0xee, 0xfe, 0x12, 0x52, 0x5c, 0x1b, 0xf0, 0xfc, 0x0d, 0x3a, 0x1e, 0x0f,
+ 0x1e, 0xf1, 0xb3, 0x00,
+ 0x30, 0x46, 0x02, 0xf0, 0x01, 0xf1, 0xa3, 0xc5, 0xe3, 0xde, 0xfc, 0x00,
+ 0x32, 0x74, 0x40, 0x0e,
+ 0x0e, 0x00, 0xf3, 0xd7, 0xd2, 0x00, 0x00, 0xef, 0xb0, 0x12, 0x03, 0xf7,
+ 0x92, 0xe0, 0xfc, 0xe0,
+ 0xd0, 0xee, 0xde, 0xd0, 0xe1, 0x03, 0x42, 0x54, 0x22, 0x00, 0x01, 0x0e,
+ 0x31, 0x77, 0x57, 0x00,
+ 0x11, 0x00, 0x02, 0x01, 0xd2, 0x0f, 0xee, 0xdd, 0xfd, 0xfd, 0xee, 0x91,
+ 0x03, 0x1a, 0x4c, 0x3e,
+ 0x2f, 0x20, 0xed, 0xef, 0x2d, 0x7e, 0x5d, 0x0c, 0x1d, 0x00, 0xde, 0x0e,
+ 0x11, 0x00, 0xfe, 0xff,
+ 0x03, 0x05, 0xf2, 0x0e, 0x7c, 0x3d, 0x0d, 0xfa, 0x0e, 0x0b, 0x0f, 0x0d,
+ 0xf0, 0x0d, 0x5e, 0x30,
+ 0x41, 0x27, 0x53, 0x00, 0xc0, 0xb0, 0xe3, 0xf7, 0xd3, 0xdc, 0x1f, 0x60,
+ 0x21, 0x11, 0x02, 0x00,
+ 0xf1, 0xf0, 0x12, 0x1a, 0xe0, 0xc4, 0xc0, 0x31, 0xfd, 0x17, 0xc0, 0x13,
+ 0xd0, 0x80, 0x06, 0x88,
+ 0x00, 0x16, 0xbd, 0xee, 0x45, 0x20, 0xbf, 0xfd, 0x02, 0x33, 0x10, 0x0d,
+ 0xef, 0x21, 0x34, 0x00,
+ 0xfe, 0xf0, 0x33, 0x00, 0x0f, 0xf0, 0xf0, 0xcf, 0x00, 0xf3, 0xfd, 0xfe,
+ 0x0e, 0x10, 0x23, 0x0f,
+ 0x3b, 0x73, 0x30, 0xb8, 0x0e, 0x63, 0x22, 0xfd, 0xee, 0x00, 0x11, 0x10,
+ 0x0c, 0xf0, 0x04, 0x02,
+ 0xdf, 0x00, 0x40, 0x3c, 0x4e, 0x32, 0xf3, 0xab, 0x0d, 0x00, 0xfc, 0x10,
+ 0x40, 0xed, 0x2f, 0x77,
+ 0x1f, 0xdd, 0x13, 0x16, 0xcf, 0xbe, 0x12, 0x03, 0x0e, 0xec, 0x00, 0x34,
+ 0x31, 0x0f, 0x00, 0x23,
+ 0x0d, 0xbd, 0xfd, 0x14, 0x34, 0xe0, 0x00, 0x12, 0x10, 0x00, 0xd4, 0x80,
+ 0xaf, 0x0f, 0xe3, 0x01,
+ 0xff, 0xde, 0xe3, 0xd6, 0xbd, 0x00, 0x02, 0x20, 0x0e, 0x0a, 0x00, 0x44,
+ 0x32, 0x45, 0x20, 0x42,
+ 0x47, 0x02, 0xdd, 0xe0, 0x02, 0x20, 0xf0, 0xb0, 0xfe, 0xef, 0x0d, 0x02,
+ 0x02, 0xe9, 0x1e, 0x70,
+ 0x1e, 0xf1, 0x00, 0x62, 0x2e, 0x1a, 0x0d, 0x3f, 0x30, 0xff, 0xcc, 0x00,
+ 0x00, 0x11, 0xd6, 0xf0,
+ 0xf0, 0x30, 0x7e, 0x5d, 0x10, 0x04, 0xd0, 0xdd, 0x08, 0x1e, 0x20, 0x4f,
+ 0x6c, 0x3d, 0x01, 0x13,
+ 0x00, 0x0b, 0xf1, 0xf7, 0xa0, 0xdf, 0x00, 0xe0, 0x04, 0xcf, 0x11, 0x5f,
+ 0x2f, 0x13, 0xf0, 0xac,
+ 0x10, 0x10, 0xf0, 0x0e, 0x46, 0x00, 0xf0, 0x03, 0x26, 0xee, 0x8d, 0x01,
+ 0x05, 0x00, 0xbd, 0x00,
+ 0xf6, 0xe0, 0xdf, 0xce, 0x02, 0x11, 0xde, 0xde, 0x00, 0x10, 0x11, 0x21,
+ 0x61, 0x54, 0x24, 0x02,
+ 0xf0, 0x03, 0x32, 0x03, 0x0f, 0xf0, 0x17, 0xf1, 0x9d, 0x0d, 0x0d, 0xfe,
+ 0xf5, 0x14, 0xda, 0xff,
+ 0x21, 0x30, 0x2f, 0x30, 0x4f, 0x7d, 0x5e, 0x0e, 0x00, 0x00, 0xea, 0x00,
+ 0x01, 0x04, 0x0c, 0x00,
+ 0x73, 0x2e, 0x0f, 0x03, 0x05, 0xbc, 0xfe, 0xf0, 0x10, 0x1d, 0x19, 0x20,
+ 0x5f, 0x10, 0x41, 0x01,
+ 0x0e, 0xfd, 0xe0, 0xd7, 0xc2, 0xe0, 0xfd, 0x1f, 0x23, 0x76, 0x00, 0xde,
+ 0xf0, 0x01, 0x30, 0x0e,
+ 0x20, 0x00, 0xf1, 0x00, 0x10, 0x63, 0x06, 0xe0, 0x30, 0xfd, 0xd5, 0xa4,
+ 0xbd, 0xff, 0xf1, 0xe2,
+ 0xa0, 0x17, 0xbf, 0xc8, 0x24, 0x00, 0xbd, 0xed, 0x34, 0x13, 0xfc, 0xff,
+ 0x32, 0x52, 0x00, 0x0e,
+ 0x11, 0x02, 0x00, 0x01, 0x21, 0x01, 0x02, 0xee, 0x9b, 0x01, 0x24, 0xfe,
+ 0xec, 0x01, 0x01, 0x0f,
+ 0xbe, 0x33, 0x65, 0x1d, 0x1d, 0x0f, 0x0e, 0xfe, 0x13, 0x01, 0xe8, 0x11,
+ 0x42, 0xdd, 0x2f, 0x50,
+ 0x06, 0x00, 0xfe, 0x00, 0x01, 0xdf, 0xee, 0xd0, 0x0e, 0x70, 0x3e, 0x3a,
+ 0x41, 0x42, 0xde, 0xda,
+ 0x21, 0x22, 0xe0, 0xce, 0x00, 0x23, 0xc0, 0xd3, 0x02, 0x3f, 0xf1, 0xc2,
+ 0xff, 0x18, 0x60, 0x25,
+ 0x00, 0xcd, 0x00, 0x30, 0x42, 0x00, 0xf0, 0xf0, 0x55, 0x00, 0xce, 0x0f,
+ 0xd2, 0xd2, 0xd2, 0x07,
+ 0xd0, 0x8f, 0x8c, 0x00, 0x03, 0xd0, 0xfd, 0x00, 0x0e, 0x0f, 0x00, 0x03,
+ 0xad, 0x00, 0x27, 0x00,
+ 0x36, 0x08, 0xc3, 0xe9, 0x49, 0x0c, 0x28, 0xea, 0xbe, 0xe4, 0xe5, 0xe1,
+ 0xe7, 0xf4, 0xd4, 0xe4,
+ 0xe3, 0xe4, 0xe3, 0xf4, 0xe3, 0xc3, 0xc2, 0xd4, 0xb5, 0xc2, 0xc2, 0xd3,
+ 0xe3, 0xd2, 0xd1, 0x02,
+ 0xf4, 0xe2, 0xd1, 0xf1, 0x01, 0x00, 0xd0, 0xe0, 0x1f, 0x5f, 0x4f, 0x4e,
+ 0x40, 0x47, 0x22, 0x00,
+ 0x10, 0x10, 0x00, 0x0e, 0x0d, 0x09, 0x3c, 0x7d, 0x5d, 0x2b, 0x2c, 0x4d,
+ 0x2b, 0x4e, 0x3d, 0x4d,
+ 0x1d, 0x2d, 0x3d, 0x4e, 0x2c, 0x2e, 0x3e, 0x3d, 0x3d, 0x4e, 0x2c, 0x4b,
+ 0x4e, 0x3f, 0x3e, 0x3e,
+ 0x5e, 0x3e, 0x4d, 0x3e, 0x4d, 0x2d, 0x2c, 0x3e, 0x40, 0x36, 0x43, 0x00,
+ 0x00, 0x02, 0x03, 0xc4,
+ 0xc1, 0xc1, 0xc1, 0xc2, 0xd0, 0xbf, 0xe0, 0xd3, 0xe6, 0xe0, 0xe0, 0xd4,
+ 0xe7, 0xd3, 0xd4, 0xf4,
+ 0xf4, 0xf2, 0xf3, 0xe3, 0xd4, 0xc4, 0xb3, 0xd4, 0xd3, 0xa3, 0xd3, 0xd3,
+ 0xe3, 0xe3, 0xe3, 0xf4,
+ 0xe3, 0xe3, 0xe2, 0xd1, 0xf2, 0xd0, 0xdf, 0xfd, 0x3f, 0x72, 0x30, 0x1b,
+ 0x40, 0x23, 0x12, 0x23,
+ 0x25, 0x10, 0xfe, 0x0e, 0x30, 0x60, 0x5b, 0x5a, 0x3c, 0x2e, 0x4c, 0x2c,
+ 0x4c, 0x2d, 0x3c, 0x4d,
+ 0x3e, 0x3e, 0x2d, 0x3b, 0x3e, 0x6e, 0x1e, 0x1e, 0x2e, 0x1d, 0x2b, 0x3e,
+ 0x5f, 0x2f, 0x2d, 0x3d,
+ 0x4e, 0x4e, 0x2c, 0x3c, 0x5e, 0x3f, 0x3e, 0x2e, 0x30, 0x42, 0x33, 0x21,
+ 0x1f, 0x13, 0x06, 0xd1,
+ 0xa2, 0xd3, 0xb3, 0xd3, 0xc0, 0xcf, 0xe0, 0xd0, 0xd0, 0xd0, 0xc6, 0xd7,
+ 0xe2, 0xd2, 0xe4, 0x07,
+ 0x02, 0xd0, 0xe2, 0x07, 0x03, 0xa0, 0xd1, 0xd3, 0xc3, 0xc2, 0xe3, 0xe5,
+ 0xd2, 0xd2, 0xd2, 0xe2,
+ 0xe4, 0xc2, 0xd2, 0xc1, 0xe0, 0x01, 0x01, 0x00, 0x31, 0x10, 0x40, 0x62,
+ 0x10, 0x0f, 0x1f, 0x00,
+ 0x10, 0x1f, 0x23, 0x10, 0xf8, 0x0c, 0x7f, 0x50, 0x1b, 0x2b, 0x3d, 0x4d,
+ 0x3b, 0x2d, 0x4c, 0x5e,
+ 0x3f, 0x2c, 0x2d, 0x3e, 0x3e, 0x1c, 0x4f, 0x3f, 0x3e, 0x4d, 0x3e, 0x3e,
+ 0x2e, 0x3c, 0x2c, 0x4e,
+ 0x5e, 0x3c, 0x3d, 0x4e, 0x4d, 0x3e, 0x4f, 0x4f, 0x3e, 0x4e, 0x20, 0x23,
+ 0x12, 0x24, 0x02, 0xd1,
+ 0xe5, 0xb2, 0xce, 0xde, 0xcf, 0xcc, 0xcc, 0xef, 0xc0, 0xe0, 0xcd, 0xef,
+ 0xe7, 0xf7, 0xe2, 0xe1,
+ 0xf2, 0x04, 0xf5, 0xd2, 0xc2, 0xd3, 0xc3, 0xd4, 0xd3, 0xd4, 0xc4, 0xe3,
+ 0xc3, 0xd2, 0xe3, 0xe5,
+ 0xd2, 0xa2, 0xe1, 0xe3, 0xf2, 0xe0, 0x0f, 0x12, 0x23, 0x11, 0x10, 0x20,
+ 0x33, 0x33, 0x20, 0x03,
+ 0xf3, 0xc0, 0x14, 0x67, 0x11, 0x2e, 0x4e, 0x4d, 0x4c, 0x4a, 0x4d, 0x4b,
+ 0x3d, 0x3d, 0x4c, 0x3d,
+ 0x4d, 0x2c, 0x3d, 0x3e, 0x4d, 0x2a, 0x2e, 0x3e, 0x3f, 0x3e, 0x2d, 0x6d,
+ 0x2e, 0x3d, 0x2d, 0x3b,
+ 0x4e, 0x4f, 0x4f, 0x3e, 0x4c, 0x2d, 0x5e, 0x3f, 0x2d, 0x3f, 0x30, 0x32,
+ 0x24, 0x01, 0x00, 0x02,
+ 0xf2, 0xa0, 0xe0, 0xd1, 0xb0, 0xdd, 0xb8, 0xdc, 0xdf, 0xc0, 0xd0, 0xe1,
+ 0xe5, 0xf3, 0xe1, 0xf4,
+ 0xe6, 0xe3, 0xe4, 0xd3, 0xc3, 0xc4, 0xd4, 0xb1, 0xd2, 0x06, 0xd3, 0xc1,
+ 0xe3, 0xd4, 0xc2, 0xc1,
+ 0x06, 0x03, 0x90, 0xee, 0x01, 0x04, 0x00, 0xef, 0x00, 0x22, 0x11, 0x0f,
+ 0x00, 0x10, 0x22, 0x00,
+ 0x02, 0x03, 0x02, 0x10, 0x20, 0x20, 0x0e, 0x4b, 0x6b, 0x4d, 0x2c, 0x5e,
+ 0x2c, 0x3d, 0x3c, 0x3c,
+ 0x5d, 0x3c, 0x4e, 0x3e, 0x2c, 0x1d, 0x3d, 0x5f, 0x2e, 0x2a, 0x3e, 0x4f,
+ 0x2f, 0x1e, 0x2d, 0x2d,
+ 0x1c, 0x5f, 0x74, 0x0c, 0xd8, 0x70, 0x46, 0xed, 0xfd, 0x42, 0x24, 0xee,
+ 0xec, 0x42, 0x23, 0xef,
+ 0xfd, 0x00, 0x01, 0x00, 0xd0, 0xdf, 0xe0, 0xd0, 0xd0, 0xc0, 0xc0, 0xef,
+ 0xf1, 0xe0, 0xdf, 0xf2,
+ 0xe4, 0xd1, 0xd2, 0xe6, 0xc2, 0xc1, 0xd1, 0xe3, 0x07, 0xb1, 0xf3, 0xd2,
+ 0x90, 0x05, 0x14, 0xc0,
+ 0xdf, 0x03, 0x04, 0xd0, 0xe0, 0x02, 0x02, 0xf0, 0xef, 0x11, 0x43, 0xf0,
+ 0xee, 0x00, 0x23, 0x24,
+ 0xd0, 0x11, 0x13, 0xbf, 0x00, 0x21, 0x42, 0x30, 0x09, 0x2d, 0x70, 0x5f,
+ 0x2d, 0x1b, 0x3c, 0x2d,
+ 0x3c, 0x6e, 0x1e, 0x1a, 0x1d, 0x40, 0x30, 0x1d, 0x2e, 0x2d, 0x3d, 0x2d,
+ 0x2b, 0x3e, 0x40, 0x3f,
+ 0x2d, 0x3b, 0x6e, 0x5f, 0x2e, 0x2a, 0x4e, 0x40, 0x20, 0x0d, 0x3f, 0x41,
+ 0x10, 0x1e, 0x1f, 0x32,
+ 0x10, 0x0d, 0xf1, 0xf7, 0x90, 0xcb, 0xde, 0xf1, 0xd1, 0xcf, 0xde, 0xee,
+ 0xf3, 0xd3, 0xd2, 0xf5,
+ 0xc2, 0xc0, 0xe1, 0xe6, 0xd2, 0xb0, 0xf4, 0xe4, 0xe2, 0xf4, 0xe3, 0xb1,
+ 0xe4, 0xe3, 0xd4, 0xc2,
+ 0xd2, 0xe5, 0xc1, 0xc0, 0xf2, 0x03, 0xf1, 0xf0, 0x01, 0x01, 0x02, 0x11,
+ 0x00, 0x14, 0xf1, 0xf1,
+ 0x05, 0x22, 0x12, 0xb0, 0xd0, 0x34, 0x53, 0x0e, 0x1d, 0x4d, 0x7e, 0x30,
+ 0x08, 0x2c, 0x4e, 0x3d,
+ 0x3d, 0x3d, 0x3b, 0x2d, 0x1c, 0x5e, 0x50, 0x3e, 0x1c, 0x2d, 0x40, 0x1f,
+ 0x1c, 0x1e, 0x2f, 0xfa,
+ 0x0e, 0x7f, 0x3f, 0x1c, 0x3e, 0x6f, 0x2f, 0x1c, 0x2e, 0x40, 0x30, 0x3f,
+ 0x2d, 0x3e, 0x40, 0x20,
+ 0x22, 0x00, 0x10, 0xf6, 0xc0, 0x88, 0xcb, 0x25, 0x01, 0xad, 0xff, 0x01,
+ 0x01, 0xef, 0xef, 0x01,
+ 0x02, 0xe0, 0xdf, 0xf0, 0x04, 0x02, 0xe1, 0xe1, 0xf4, 0xf4, 0xd1, 0xa1,
+ 0xf3, 0xf5, 0xd1, 0xc1,
+ 0xe4, 0xd2, 0xd2, 0xd2, 0xd1, 0x03, 0xf1, 0xb0, 0xf0, 0x00, 0x03, 0x04,
+ 0xff, 0x11, 0x46, 0xf1,
+ 0xf1, 0xe0, 0x02, 0x55, 0xf0, 0xdf, 0x10, 0x31, 0x30, 0x40, 0x1d, 0x19,
+ 0x7f, 0x50, 0x0c, 0x2f,
+ 0x40, 0x1e, 0x1b, 0x2d, 0x4f, 0x3f, 0x0a, 0x4f, 0x50, 0x20, 0x1f, 0x1e,
+ 0x1e, 0x0d, 0x1e, 0x40,
+ 0x30, 0x4e, 0x2b, 0x2d, 0x4e, 0x2e, 0x3e, 0x5e, 0x3e, 0x4d, 0x4f, 0x3f,
+ 0x3f, 0x30, 0x32, 0x36,
+ 0x21, 0x10, 0x01, 0xf0, 0xd0, 0xc2, 0xbf, 0xc9, 0xe1, 0xe3, 0xbe, 0xed,
+ 0xe0, 0xd0, 0xde, 0xd1,
+ 0xd2, 0xbe, 0xf1, 0xe7, 0xe6, 0xc0, 0xf3, 0xf7, 0xd1, 0xd1, 0xe3, 0xe4,
+ 0xa2, 0xd2, 0xe5, 0xc3,
+ 0xd2, 0xd2, 0xd3, 0xe4, 0xc2, 0xd0, 0xf1, 0xe1, 0x01, 0x03, 0x05, 0x01,
+ 0xe1, 0x02, 0xd0, 0xb0,
+ 0x03, 0x03, 0xb0, 0xe0, 0xf3, 0x06, 0x01, 0x11, 0x30, 0x3d, 0x7e, 0x3e,
+ 0x3b, 0x5f, 0x2d, 0x08,
+ 0x4e, 0x4e, 0x3d, 0x6f, 0x1d, 0x2a, 0x3f, 0x3e, 0x2e, 0x3e, 0x2f, 0x0d,
+ 0x1d, 0x3f, 0x5f, 0x3c,
+ 0x2c, 0x3d, 0x2d, 0x1b, 0x6e, 0x3f, 0x3e, 0x6d, 0x3e, 0x3e, 0x4e, 0x3d,
+ 0x52, 0x36, 0x20, 0x1f,
+ 0x20, 0x22, 0x02, 0xfe, 0xeb, 0xef, 0xd0, 0xc0, 0xce, 0xd0, 0xc0, 0xce,
+ 0xe0, 0xd0, 0xc0, 0xe0,
+ 0xd1, 0xc7, 0xe4, 0xc1, 0xf1, 0xf6, 0x04, 0xe2, 0xd2, 0xd3, 0xb3, 0xe4,
+ 0xe7, 0xd3, 0xc3, 0xc2,
+ 0xd4, 0xd3, 0xb2, 0xe3, 0xf3, 0xc1, 0xf1, 0x04, 0x03, 0xe0, 0xcd, 0x00,
+ 0x27, 0x01, 0xf0, 0xd0,
+ 0xf0, 0x15, 0x01, 0xc0, 0xf0, 0x01, 0x01, 0x30, 0x30, 0x00, 0x6e, 0x4f,
+ 0x30, 0x1e, 0x0a, 0x3d,
+ 0x7d, 0x3c, 0x3c, 0x4c, 0x4e, 0x2d, 0x2c, 0x3e, 0x2d, 0x4e, 0x2e, 0x1c,
+ 0x3c, 0x4d, 0x0c, 0x2d,
+ 0x6f, 0x20, 0x1d, 0x1b, 0x2e, 0x60, 0x41, 0xf8, 0x0b, 0x72, 0x43, 0x0c,
+ 0x0d, 0x44, 0x11, 0xfe,
+ 0x0d, 0x33, 0x23, 0xee, 0xfd, 0x00, 0x01, 0xe0, 0xdf, 0xe0, 0xcf, 0xdf,
+ 0x02, 0xd3, 0x9e, 0xee,
+ 0xe0, 0xe0, 0xf4, 0xd1, 0xdf, 0xe2, 0xe2, 0xd4, 0xe7, 0xb0, 0xd0, 0x07,
+ 0xe5, 0x8f, 0xe0, 0x06,
+ 0xe1, 0xc0, 0xf0, 0x02, 0xe1, 0xc0, 0x00, 0x02, 0x01, 0xe0, 0xf0, 0x02,
+ 0x11, 0x00, 0xe2, 0xf2,
+ 0xd0, 0xe0, 0xd4, 0xc1, 0x00, 0x32, 0x02, 0x02, 0x00, 0x70, 0x11, 0x00,
+ 0x0c, 0x3b, 0x5f, 0x19,
+ 0x70, 0x41, 0x0a, 0x0d, 0x30, 0x2f, 0x2d, 0x0c, 0x4f, 0x20, 0x1d, 0x2d,
+ 0x50, 0x2f, 0x0a, 0x2e,
+ 0x30, 0x20, 0x0d, 0x2d, 0x5e, 0x0a, 0x60, 0x52, 0x1e, 0x1a, 0x30, 0x31,
+ 0x2f, 0x3f, 0x30, 0x30,
+ 0x20, 0x1d, 0x41, 0x35, 0xef, 0xff, 0x00, 0xdf, 0xe0, 0xc1, 0x9b, 0xdd,
+ 0xef, 0xe1, 0xe2, 0xae,
+ 0xef, 0xf4, 0xe1, 0xef, 0xf2, 0xe3, 0xd1, 0xf5, 0xd3, 0xd5, 0x07, 0xd2,
+ 0x90, 0xd1, 0xe4, 0x05,
+ 0xb1, 0xc0, 0x03, 0xf4, 0xd1, 0xc0, 0x02, 0x04, 0xf0, 0x01, 0x01, 0xe0,
+ 0xdf, 0x12, 0x03, 0xbf,
+ 0xef, 0x03, 0x02, 0x01, 0x03, 0x14, 0x34, 0xe0, 0xbd, 0x00, 0x34, 0x00,
+ 0x00, 0x2d, 0x7d, 0x29,
+ 0x4f, 0x60, 0x1e, 0x09, 0x2f, 0x40, 0x1f, 0x2d, 0x2d, 0x4e, 0x30, 0x1c,
+ 0x30, 0x30, 0x08, 0x1f,
+ 0x50, 0xfe, 0xfd, 0x20, 0xfb, 0xfc, 0x70, 0x40, 0x1f, 0x0c, 0x60, 0x32,
+ 0x1f, 0x1d, 0x2f, 0x20,
+ 0x2f, 0x1f, 0x20, 0x1f, 0x10, 0x21, 0x0e, 0xed, 0xff, 0xe0, 0xb0, 0xdf,
+ 0xbe, 0xd9, 0xd1, 0xe4,
+ 0x9c, 0xef, 0xf1, 0xee, 0xef, 0xf1, 0xd0, 0xdf, 0xd2, 0xe7, 0xd2, 0x90,
+ 0x05, 0xe4, 0xc1, 0xd0,
+ 0xe3, 0xe7, 0xc1, 0xd1, 0xd2, 0xe2, 0xd2, 0xd0, 0x01, 0x24, 0xe1, 0xd2,
+ 0xc1, 0xf1, 0x04, 0xc1,
+ 0xd0, 0x02, 0xf4, 0xf3, 0xe2, 0xe1, 0x02, 0x03, 0xe1, 0x01, 0x33, 0xbe,
+ 0x0c, 0x70, 0x7c, 0x1a,
+ 0x1d, 0x1c, 0x2e, 0x3f, 0x1a, 0x1d, 0x3c, 0x7f, 0x20, 0x2e, 0x3e, 0x3e,
+ 0x1c, 0x2e, 0x2e, 0x3e,
+ 0x1c, 0x1d, 0x2d, 0x0a, 0x0d, 0x7e, 0x4f, 0x3e, 0x5d, 0x2c, 0x4c, 0x4f,
+ 0x30, 0x40, 0x2f, 0x2f,
+ 0x30, 0x20, 0x2f, 0x30, 0x30, 0x0d, 0x0c, 0x0f, 0x00, 0xf0, 0xbd, 0xdf,
+ 0xc2, 0xc1, 0xc0, 0xdf,
+ 0xdd, 0xe7, 0xe7, 0xb0, 0xdd, 0xf0, 0x06, 0xc1, 0xe1, 0xe3, 0xe3, 0xd2,
+ 0xd6, 0xc4, 0xc4, 0xb3,
+ 0xd2, 0xc2, 0xf4, 0xe4, 0xb0, 0xf2, 0x05, 0x02, 0xd0, 0xe0, 0x02, 0xe1,
+ 0xd2, 0x02, 0xd1, 0xd0,
+ 0x03, 0x35, 0x02, 0xc1, 0x03, 0xf2, 0xa0, 0xd0, 0x03, 0x15, 0xef, 0xff,
+ 0x32, 0x77, 0x74, 0x0f,
+ 0xfc, 0x0f, 0x41, 0x10, 0x0c, 0x1f, 0x3f, 0x3f, 0x2e, 0x3e, 0x4e, 0x2d,
+ 0x2d, 0x4e, 0x2d, 0x2d,
+ 0x2c, 0x0b, 0x0d, 0x0b, 0x2f, 0x70, 0x3f, 0x2c, 0x3d, 0x6e, 0x2d, 0x3d,
+ 0x50, 0x30, 0x2d, 0x3f,
+ 0x32, 0x41, 0x2d, 0x2d, 0x2e, 0x32, 0x20, 0x08, 0x0e, 0xf0, 0xf3, 0xd0,
+ 0xbe, 0xbb, 0xef, 0xd0,
+ 0xdf, 0xd0, 0xbe, 0x07, 0xf4, 0xbe, 0xa8, 0x11, 0x47, 0xce, 0xfe, 0x13,
+ 0x02, 0xdf, 0xde, 0x03,
+ 0x05, 0xd0, 0xdf, 0x01, 0xf2, 0xf2, 0xd1, 0xd0, 0xe1, 0xf2, 0xf2, 0xd1,
+ 0xb0, 0xdf, 0xf0, 0x14,
+ 0x24, 0xaf, 0xcc, 0x25, 0x14, 0xbe, 0xff, 0x23, 0x02, 0xce, 0xee, 0x35,
+ 0x32, 0xce, 0x0e, 0x10,
+ 0x22, 0x0f, 0xfb, 0x2f, 0x70, 0x0f, 0x1d, 0x1d, 0x3e, 0x2f, 0x2d, 0x3e,
+ 0x50, 0x08, 0x0d, 0x53,
+ 0x00, 0xfb, 0x0f, 0x20, 0x2f, 0xfb, 0x3f, 0x50, 0x2e, 0x3e, 0x2e, 0x5e,
+ 0x3e, 0x2d, 0x1d, 0x61,
+ 0x22, 0x2e, 0x2c, 0x2e, 0x2f, 0x42, 0x12, 0xf8, 0x0e, 0x21, 0x01, 0xdd,
+ 0xcd, 0x03, 0xf0, 0x8a,
+ 0xef, 0x01, 0xf1, 0xcd, 0xeb, 0x00, 0x02, 0xdf, 0xdc, 0xe0, 0xf2, 0xd1,
+ 0xa1, 0xf4, 0xe5, 0xc1,
+ 0xd1, 0xd2, 0x07, 0xf3, 0x90, 0xe0, 0x03, 0x02, 0xd0, 0xf0, 0x06, 0xf1,
+ 0xcf, 0xf0, 0x02, 0x13,
+ 0xf0, 0xd0, 0xd1, 0xf3, 0x03, 0xe2, 0xc2, 0xf4, 0x02, 0x03, 0x07, 0x01,
+ 0xc0, 0xde, 0x72, 0x00,
+ 0xfd, 0x10, 0x3f, 0xb8, 0xea, 0x72, 0x51, 0xfd, 0x0d, 0x21, 0x32, 0xfc,
+ 0x0e, 0x41, 0x00, 0x0d,
+ 0x0d, 0x0f, 0x0f, 0x0d, 0xe9, 0x1f, 0x50, 0x1e, 0x1d, 0x3f, 0x6f, 0x0c,
+ 0x1d, 0x51, 0x32, 0x1c,
+ 0x1b, 0x40, 0x31, 0x1e, 0x1e, 0x40, 0x10, 0x0e, 0x1d, 0x10, 0x11, 0xff,
+ 0xed, 0xcc, 0xf0, 0xbf,
+ 0xdc, 0xde, 0xef, 0xe1, 0xcc, 0xfc, 0x25, 0x00, 0xae, 0xf0, 0xf5, 0xf2,
+ 0xe2, 0xd4, 0xd4, 0xc2,
+ 0xd3, 0xd5, 0xd3, 0xd3, 0xc3, 0xb3, 0xe3, 0xe4, 0xd2, 0xd2, 0xe2, 0xf3,
+ 0x04, 0xe2, 0xc2, 0x06,
+ 0x24, 0xc1, 0xb0, 0x01, 0x03, 0xe2, 0xb0, 0x04, 0x15, 0xe0, 0x00, 0x34,
+ 0x12, 0xdf, 0x0f, 0x30,
+ 0x41, 0x00, 0x20, 0x4f, 0x2d, 0x7e, 0x3f, 0x74, 0x20, 0x08, 0x30, 0x73,
+ 0x0e, 0xfa, 0x10, 0x21,
+ 0x10, 0xff, 0x0d, 0x20, 0x20, 0x0c, 0x1e, 0x30, 0x3f, 0x4c, 0x2d, 0x5f,
+ 0x3f, 0x5e, 0x2e, 0x41,
+ 0x32, 0x30, 0x45, 0x22, 0x1d, 0x3e, 0x30, 0x32, 0x0b, 0x1c, 0x30, 0x22,
+ 0x00, 0xa0, 0xef, 0xdf,
+ 0xef, 0xee, 0xcb, 0xff, 0xee, 0xcb, 0xff, 0xfe, 0xe0, 0xc0, 0xc0, 0xd0,
+ 0xbf, 0xe7, 0xf5, 0xc0,
+ 0xd0, 0xc3, 0xe5, 0xf4, 0xd2, 0xb1, 0xe1, 0xe3, 0xf3, 0xe3, 0xe2, 0xe2,
+ 0xf3, 0xf4, 0xe2, 0xe2,
+ 0xd4, 0xb1, 0xdf, 0xbf, 0x04, 0xf7, 0xd0, 0xe0, 0xe1, 0x04, 0x14, 0x01,
+ 0xe0, 0xc0, 0x11, 0x32,
+ 0xe0, 0x20, 0x61, 0x0e, 0x1b, 0x6f, 0x40, 0x2e, 0x2c, 0x4d, 0x2e, 0x2b,
+ 0x0d, 0x20, 0x3f, 0xf9,
+ 0xfd, 0x0e, 0x2f, 0xfd, 0xba, 0x1f, 0x60, 0x0e, 0xfb, 0x1e, 0x40, 0x4f,
+ 0x2d, 0x2d, 0x5e, 0x3f,
+ 0x3f, 0x4e, 0x50, 0x20, 0x30, 0x3f, 0x2b, 0x1c, 0x30, 0x30, 0x0f, 0x0f,
+ 0xf0, 0xdf, 0xbe, 0xde,
+ 0xcb, 0xde, 0xff, 0xef, 0xee, 0xef, 0xba, 0xde, 0xf1, 0xf2, 0xc0, 0xce,
+ 0xe2, 0xd2, 0xb1, 0xd2,
+ 0xe7, 0xd6, 0xb2, 0xd1, 0xd2, 0xe4, 0xf3, 0xe4, 0xc2, 0xe3, 0xd1, 0x06,
+ 0x23, 0xe1, 0x88, 0xc0,
+ 0x77, 0xef, 0xce, 0x22, 0x22, 0xef, 0xde, 0x11, 0x33, 0xe0, 0xef, 0x00,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x01, 0x01, 0x00, 0xff, 0x1f, 0x1e, 0x3e, 0x6f, 0x30, 0x3e, 0x09, 0x1f,
+ 0x40, 0x1f, 0xfb, 0x2f,
+ 0x30, 0x0e, 0x4f, 0x98, 0x30, 0x63, 0xdd, 0xfb, 0x20, 0x31, 0x0f, 0x0e,
+ 0x50, 0x21, 0x0e, 0x1d,
+ 0x40, 0x43, 0x1f, 0x0a, 0x40, 0x41, 0x20, 0x10, 0x1e, 0x10, 0x21, 0x10,
+ 0x00, 0x01, 0x03, 0xcc,
+ 0x01, 0x37, 0xe0, 0xe0, 0xce, 0xdf, 0x01, 0xce, 0x01, 0x04, 0xbe, 0xcd,
+ 0xf2, 0x17, 0x03, 0x90,
+ 0xf1, 0x06, 0xf2, 0xd0, 0xd1, 0x03, 0xf4, 0xd1, 0xe1, 0x04, 0x03, 0xe1,
+ 0xc0, 0xf1, 0x02, 0xf2,
+ 0xc1, 0xe2, 0xf2, 0xaf, 0xd0, 0x17, 0x17, 0xe1, 0xcf, 0xe0, 0x42, 0x03,
+ 0xd1, 0x00, 0x00, 0xd0,
+ 0xb2, 0xf4, 0xff, 0xdc, 0x20, 0x32, 0x3f, 0x7c, 0xed, 0xcd, 0x0f, 0x70,
+ 0x5e, 0x0f, 0x03, 0x00,
+ 0x09, 0xfc, 0x0f, 0x22, 0x22, 0xfe, 0xe9, 0x1e, 0x7f, 0x2e, 0x0e, 0x0f,
+ 0x0c, 0x20, 0x30, 0x2b,
+ 0x2c, 0x5e, 0x3f, 0x40, 0x32, 0x61, 0x4f, 0x2d, 0x0f, 0x0e, 0x0d, 0x0d,
+ 0x0e, 0x00, 0xee, 0xfe,
+ 0xfe, 0x3b, 0x1e, 0xfe, 0xdd, 0xed, 0xdc, 0x89, 0xdb, 0xef, 0xd2, 0xb5,
+ 0x03, 0x22, 0x30, 0xfe,
+ 0xac, 0xdd, 0xf0, 0xe2, 0xe1, 0xec, 0xc9, 0xcf, 0xc1, 0xf5, 0x02, 0x30,
+ 0x30, 0x13, 0xe5, 0xb1,
+ 0xd0, 0xd1, 0xf2, 0xd2, 0xa0, 0xc0, 0xe4, 0xf4, 0x00, 0x0f, 0x0f, 0x2e,
+ 0x32, 0x07, 0xd1, 0xd0,
+ 0x00, 0x70, 0x10, 0x00, 0x30, 0x40, 0x51, 0x1f, 0x0c, 0x0d, 0x6e, 0x3f,
+ 0x30, 0x00, 0xfd, 0x0d,
+ 0x0d, 0xec, 0xde, 0x0d, 0x5f, 0x25, 0x01, 0x0d, 0x09, 0x1d, 0x0f, 0xfe,
+ 0x0d, 0x2e, 0x3f, 0x08,
+ 0xdd, 0x3e, 0x30, 0x40, 0x33, 0x0f, 0x38, 0x7e, 0x7f, 0x01, 0x0f, 0xdb,
+ 0xde, 0xe1, 0xe3, 0xd0,
+ 0x9d, 0xff, 0x25, 0x04, 0x00, 0x7e, 0x30, 0x11, 0xd0, 0xd0, 0x05, 0x05,
+ 0x5d, 0x01, 0x0f, 0x03,
+ 0x10, 0x01, 0x70, 0xeb, 0xf3, 0x06, 0x1e, 0xdd, 0x41, 0x1c, 0xbb, 0xb0,
+ 0x02, 0x03, 0x40, 0x0b,
+ 0xf0, 0xd3, 0x00, 0x1d, 0x00, 0xd2, 0x31, 0x70, 0x1c, 0xc0, 0xe0, 0x04,
+ 0x3d, 0x3b, 0x00, 0xc4,
+ 0xf4, 0x30, 0x0e, 0xad, 0x0e, 0x22, 0x55, 0x02, 0xcf, 0xfe, 0x0f, 0xf1,
+ 0x02, 0xf0, 0xf0, 0x00,
+ 0x31, 0x03, 0xd6, 0xd0, 0x5d, 0x5d, 0x00, 0xf5, 0xf3, 0x11, 0x2e, 0xfb,
+ 0xd0, 0x00, 0x40, 0x11,
+ 0xe0, 0x80, 0xf1, 0x1f, 0x3c, 0x0e, 0x00, 0x05, 0x63, 0x2e, 0x0a, 0xf0,
+ 0xe0, 0x00, 0x4e, 0x02,
+ 0xf7, 0x01, 0x2d, 0x0b, 0xb0, 0xf0, 0x01, 0x21, 0x51, 0x10, 0xfc, 0x0e,
+ 0x2f, 0xf0, 0xe3, 0x02,
+ 0x0f, 0x0a, 0x00, 0xd0, 0xd0, 0x00, 0x7f, 0x20, 0xf0, 0xa0, 0x00, 0x0d,
+ 0x0f, 0x1e, 0x35, 0xc6,
+ 0xf1, 0x0e, 0x1e, 0x00, 0x90, 0x04, 0x00, 0x30, 0xff, 0xc1, 0xd7, 0xf0,
+ 0xef, 0x0d, 0x50, 0x35,
+ 0xf4, 0xd1, 0x00, 0x0a, 0xf0, 0x0f, 0x00, 0xf1, 0xc2, 0x01, 0x0f, 0x7e,
+ 0x7f, 0x00, 0xef, 0xf7,
+ 0xf4, 0x0c, 0x40, 0x12, 0xe0, 0xdf, 0xf0, 0x11, 0x03, 0xa0, 0xff, 0xfe,
+ 0x0f, 0x2f, 0x52, 0x02,
+ 0x22, 0x12, 0x00, 0xf8, 0xe0, 0x02, 0x01, 0x00, 0x22, 0x40, 0x1b, 0xce,
+ 0x9f, 0x03, 0x00, 0x1f,
+ 0x2d, 0x10, 0x00, 0xd8, 0x1f, 0x40, 0x31, 0x15, 0xf0, 0xef, 0x0c, 0x2f,
+ 0x01, 0xf2, 0x22, 0x4c,
+ 0x0c, 0x00, 0xa0, 0x03, 0x01, 0x1c, 0x1d, 0x3f, 0x0f, 0xb0, 0xb4, 0xf0,
+ 0xff, 0x0b, 0x2f, 0x30,
+ 0x00, 0xc1, 0xc5, 0xde, 0x0e, 0x50, 0x10, 0x04, 0x94, 0x01, 0x20, 0x2d,
+ 0x0e, 0xb0, 0x00, 0x05,
+ 0xf3, 0xf1, 0x0e, 0x0c, 0x20, 0x01, 0xd1, 0xc7, 0x03, 0x00, 0xec, 0x00,
+ 0x31, 0x12, 0xd0, 0xf1,
+ 0xf1, 0xd0, 0x0f, 0xa0, 0xf0, 0x11, 0x23, 0x7f, 0x2f, 0x0e, 0x15, 0x0f,
+ 0x10, 0x07, 0x23, 0x21,
+ 0x31, 0xe1, 0x8e, 0xee, 0xf0, 0x07, 0x11, 0x30, 0x2e, 0xe9, 0xe0, 0x73,
+ 0x31, 0x1e, 0x1f, 0x1f,
+ 0xef, 0xf1, 0x12, 0x00, 0x0f, 0x7f, 0x1d, 0xfd, 0xdb, 0x11, 0x01, 0x1f,
+ 0x2e, 0x5b, 0x2f, 0xeb,
+ 0xf1, 0x01, 0x20, 0x10, 0x2f, 0x1c, 0x50, 0x51, 0x10, 0xd9, 0xde, 0x21,
+ 0x50, 0x00, 0xbe, 0xe2,
+ 0x07, 0x50, 0x0d, 0xed, 0x00, 0xe1, 0x02, 0xe2, 0xe0, 0xdc, 0x2f, 0x6e,
+ 0x30, 0x14, 0x04, 0xbd,
+ 0xec, 0x00, 0x15, 0x10, 0xde, 0x00, 0x65, 0x00, 0xf2, 0xf1, 0xcf, 0xdf,
+ 0xef, 0xf0, 0x25, 0x24,
+ 0xe0, 0xec, 0xde, 0x11, 0x77, 0x31, 0xe0, 0xf0, 0xff, 0xe0, 0xc0, 0x0f,
+ 0x52, 0x46, 0xf0, 0xce,
+ 0x00, 0x00, 0x00, 0x31, 0x52, 0x0c, 0x20, 0x11, 0x00, 0xf4, 0xe0, 0xdf,
+ 0x0e, 0xfe, 0x0f, 0x77,
+ 0x21, 0xac, 0x00, 0x13, 0x20, 0xfb, 0xff, 0x11, 0x44, 0x00, 0x0f, 0xce,
+ 0x00, 0x13, 0x10, 0x0e,
+ 0xcc, 0xfe, 0x20, 0x5f, 0x20, 0xbd, 0xff, 0x05, 0x0e, 0x0d, 0x10, 0x1e,
+ 0x00, 0x00, 0xd3, 0x01,
+ 0xba, 0x00, 0x20, 0xeb, 0x20, 0x73, 0x0c, 0xdf, 0x16, 0x00, 0xdc, 0xf0,
+ 0xef, 0x21, 0x76, 0x3e,
+ 0xdf, 0xf0, 0xc1, 0xe0, 0x00, 0x01, 0xdf, 0x11, 0x32, 0xc0, 0x01, 0x30,
+ 0x0f, 0x40, 0x00, 0xdd,
+ 0x37, 0x67, 0xf0, 0xde, 0x30, 0x50, 0xe2, 0xd0, 0xe0, 0xd0, 0x00, 0x61,
+ 0x02, 0xfc, 0xcc, 0x24,
+ 0x77, 0xef, 0xdc, 0x01, 0x31, 0xe0, 0x00, 0x12, 0x10, 0x0e, 0xcf, 0xde,
+ 0x33, 0x43, 0x0e, 0x0b,
+ 0x73, 0x41, 0xdc, 0xee, 0x04, 0x24, 0x0f, 0x0d, 0x31, 0xf0, 0xbf, 0x10,
+ 0x23, 0x0c, 0xca, 0x10,
+ 0x67, 0x00, 0xde, 0x0f, 0x51, 0x02, 0xff, 0xf0, 0x00, 0x00, 0x03, 0x10,
+ 0x0d, 0x43, 0xf0, 0xcd,
+ 0x02, 0x22, 0x0d, 0x00, 0x01, 0xf0, 0x26, 0x40, 0xfb, 0xef, 0x43, 0x21,
+ 0xd0, 0x0d, 0xf1, 0x57,
+ 0x01, 0xac, 0x00, 0x30, 0x02, 0xf0, 0x13, 0x0e, 0xa8, 0x11, 0x22, 0x0f,
+ 0x10, 0x10, 0x02, 0xf2,
+ 0xcd, 0xee, 0x23, 0x45, 0xbc, 0xee, 0x52, 0x12, 0x00, 0xf0, 0x0d, 0x0f,
+ 0x12, 0x12, 0x10, 0x10,
+ 0x0c, 0xce, 0x15, 0xe0, 0x8c, 0x00, 0x34, 0x0f, 0x08, 0xe0, 0x32, 0x01,
+ 0xcf, 0xfd, 0x12, 0x65,
+ 0xff, 0xec, 0x01, 0x02, 0x11, 0x0f, 0xfe, 0xee, 0xf0, 0xf0, 0xee, 0x70,
+ 0x23, 0x0e, 0xeb, 0xf0,
+ 0x02, 0x03, 0xbe, 0x00, 0x20, 0x1f, 0xda, 0x01, 0xd1, 0xd1, 0x11, 0xfb,
+ 0x00, 0x76, 0xdf, 0xad,
+ 0x10, 0x32, 0x00, 0x42, 0x03, 0xca, 0xe0, 0x01, 0x23, 0xfe, 0xdc, 0x00,
+ 0x24, 0xd0, 0xac, 0x00,
+ 0x02, 0xf0, 0xeb, 0x00, 0x40, 0xe0, 0x32, 0x52, 0xcb, 0xff, 0x11, 0x02,
+ 0xc0, 0x00, 0x2d, 0x3d,
+ 0x56, 0xe1, 0xce, 0x00, 0x00, 0x51, 0x0d, 0x0b, 0x01, 0xf1, 0xe0, 0x01,
+ 0xde, 0xec, 0x30, 0x74,
+ 0x0e, 0xc8, 0x00, 0x21, 0x63, 0x00, 0xc9, 0x00, 0x11, 0x11, 0x00, 0x10,
+ 0xff, 0xfd, 0x00, 0x13,
+ 0x00, 0xe0, 0x0e, 0x0f, 0x30, 0x0f, 0xef, 0xf0, 0x02, 0x11, 0xde, 0xaf,
+ 0x17, 0x31, 0xac, 0x00,
+ 0x34, 0xdd, 0xfe, 0x23, 0x02, 0xad, 0x0e, 0x01, 0x53, 0x24, 0xfe, 0xe0,
+ 0x26, 0x00, 0xee, 0x00,
+ 0x27, 0x20, 0xbe, 0xef, 0x13, 0x35, 0xce, 0xff, 0xf0, 0xde, 0xd1, 0x44,
+ 0x21, 0x0e, 0x1f, 0x00,
+ 0x02, 0x33, 0x01, 0x01, 0xe0, 0x8d, 0x23, 0x67, 0xf0, 0xdc, 0xf0, 0x03,
+ 0x01, 0x10, 0x41, 0x10,
+ 0xfc, 0xdb, 0x00, 0x45, 0x01, 0xdf, 0x0d, 0x51, 0x02, 0x00, 0x10, 0x10,
+ 0x20, 0x1d, 0x41, 0x03,
+ 0xdc, 0x10, 0x77, 0x12, 0x10, 0x2e, 0xcc, 0x02, 0x26, 0x0f, 0xcd, 0x30,
+ 0x70, 0x01, 0x23, 0xec,
+ 0xfd, 0x35, 0x51, 0xf0, 0xed, 0x00, 0x35, 0x00, 0xcd, 0x41, 0x31, 0x12,
+ 0xe2, 0xd0, 0xd0, 0x00,
+ 0x5e, 0x0d, 0x67, 0x06, 0xef, 0xff, 0x10, 0x22, 0x10, 0x00, 0xe0, 0x00,
+ 0x77, 0xff, 0xdd, 0x10,
+ 0x45, 0xf0, 0xcf, 0x00, 0x10, 0x41, 0x01, 0xef, 0xff, 0x01, 0x11, 0x00,
+ 0x0f, 0x21, 0x22, 0x23,
+ 0xbd, 0xdf, 0x17, 0x33, 0xdd, 0xdd, 0x03, 0x34, 0x31, 0x30, 0x00, 0x00,
+ 0xef, 0xd0, 0x80, 0xef,
+ 0x23, 0x46, 0xfd, 0xdc, 0x0f, 0x20, 0xd0, 0xbc, 0x10, 0x30, 0x31, 0x00,
+ 0x88, 0x0d, 0x32, 0x22,
+ 0xf1, 0xf1, 0xfe, 0x0a, 0x1e, 0x10, 0x73, 0x10, 0xec, 0xfd, 0x01, 0x22,
+ 0xdd, 0xdd, 0x0f, 0x21,
+ 0x11, 0xba, 0x0e, 0x41, 0x00, 0xba, 0x01, 0x33, 0x0e, 0xbc, 0x01, 0x42,
+ 0x0e, 0xdb, 0x12, 0x11,
+ 0xff, 0x0d, 0x32, 0x41, 0xee, 0xcb, 0x00, 0x32, 0x21, 0xc0, 0xd1, 0xc0,
+ 0xb8, 0x10, 0x64, 0xf0,
+ 0xba, 0x01, 0x13, 0x00, 0xfe, 0xff, 0x21, 0x11, 0xe0, 0xde, 0x24, 0xf0,
+ 0xce, 0x00, 0x54, 0x02,
+ 0xed, 0xed, 0x11, 0x13, 0x20, 0x11, 0xde, 0x9a, 0x01, 0x04, 0x00, 0x1d,
+ 0x1e, 0x01, 0xe3, 0xe0,
+ 0xfc, 0x0f, 0x0f, 0x00, 0x15, 0x01, 0x8b, 0x10, 0x62, 0x02, 0xe0, 0x00,
+ 0x0f, 0x0c, 0xff, 0x2f,
+ 0x75, 0x01, 0xed, 0xec, 0x00, 0x11, 0x0e, 0x10, 0x23, 0xa8, 0xec, 0x41,
+ 0x36, 0xf0, 0xcd, 0x10,
+ 0x11, 0x00, 0x00, 0x0e, 0x01, 0x20, 0xed, 0xe0, 0x02, 0x36, 0x1f, 0xcd,
+ 0x20, 0x72, 0x23, 0xdc,
+ 0xcd, 0x01, 0x67, 0x0f, 0xce, 0x00, 0x10, 0x02, 0xfe, 0x00, 0xff, 0x13,
+ 0x01, 0xca, 0x00, 0x51,
+ 0x00, 0x1f, 0x00, 0x15, 0xf0, 0xcc, 0x00, 0x14, 0x20, 0x00, 0x43, 0xef,
+ 0xce, 0x46, 0xf0, 0x0f,
+ 0x01, 0xf0, 0xe0, 0xff, 0x00, 0x63, 0x00, 0x0d, 0x04, 0x21, 0xf0, 0x1e,
+ 0x50, 0x00, 0xfa, 0x01,
+ 0x24, 0x23, 0xfe, 0xcc, 0x00, 0x33, 0x77, 0xff, 0xdd, 0x40, 0x63, 0x00,
+ 0xfe, 0xdd, 0x13, 0x37,
+ 0x00, 0x0e, 0x40, 0x0f, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x40, 0x00, 0xf0,
+ 0x00, 0xe0, 0x12, 0x36,
+ 0xd0, 0x8d, 0xfe, 0xed, 0x00, 0x73, 0x27, 0x12, 0xca, 0xef, 0x32, 0x21,
+ 0x10, 0x20, 0x00, 0xdf,
+ 0xf1, 0x13, 0x1d, 0xef, 0xf1, 0xf3, 0x9d, 0xfc, 0x01, 0x75, 0x0f, 0xf9,
+ 0xd0, 0x10, 0x12, 0x11,
+ 0x11, 0x00, 0x0e, 0xde, 0x77, 0x11, 0xdd, 0x00, 0x13, 0x00, 0x00, 0x02,
+ 0xec, 0xbc, 0x33, 0x43,
+ 0x00, 0xf0, 0xcb, 0x00, 0x00, 0x40, 0x02, 0x32, 0xe1, 0xbd, 0x0f, 0x25,
+ 0x21, 0xbd, 0xf0, 0x05,
+ 0x11, 0x0e, 0x0f, 0x30, 0x0d, 0x47, 0x12, 0xaf, 0x0f, 0x0e, 0x1f, 0x63,
+ 0x15, 0xfe, 0xdd, 0xf0,
+ 0x13, 0x77, 0x0f, 0xec, 0x03, 0x20, 0xef, 0xff, 0x14, 0x11, 0xef, 0x00,
+ 0x01, 0xcf, 0x32, 0x63,
+ 0x0d, 0x01, 0x07, 0x00, 0x0f, 0x10, 0x41, 0x00, 0x11, 0x15, 0xf0, 0x8c,
+ 0xf0, 0x00, 0x24, 0x00,
+ 0xda, 0x01, 0x01, 0x00, 0x20, 0x1f, 0x0e, 0xe0, 0xe0, 0x46, 0x2f, 0x0b,
+ 0x52, 0x42, 0xd0, 0x0e,
+ 0x12, 0x0e, 0xee, 0x11, 0x42, 0xcf, 0xfe, 0x03, 0x1f, 0x0c, 0x20, 0x14,
+ 0xc0, 0x88, 0xde, 0x73,
+ 0x33, 0x0f, 0xec, 0xef, 0xf0, 0x10, 0x13, 0x0f, 0x1d, 0x10, 0x10, 0xcc,
+ 0xfe, 0x23, 0x23, 0x14,
+ 0xdb, 0xbe, 0x11, 0x44, 0x00, 0x0e, 0x05, 0xd0, 0xaa, 0x00, 0x11, 0x20,
+ 0x00, 0x00, 0x02, 0xf0,
+ 0xdc, 0x0f, 0x73, 0x02, 0xde, 0xbd, 0x03, 0x20, 0x00, 0x10, 0x00, 0xbf,
+ 0xfd, 0x01, 0x44, 0x0e,
+ 0x0d, 0x00, 0xf0, 0xf0, 0xdd, 0xd3, 0x07, 0x17, 0x20, 0xfe, 0x8c, 0xff,
+ 0x14, 0x20, 0xff, 0x00,
+ 0x00, 0xac, 0x00, 0x00, 0x20, 0x02, 0x12, 0x00, 0xc8, 0xfe, 0x02, 0x30,
+ 0xef, 0xdd, 0x23, 0x00,
+ 0xfd, 0xba, 0xde, 0x20, 0x65, 0xf0, 0xef, 0xdb, 0x0f, 0x60, 0x10, 0x21,
+ 0xe0, 0xde, 0xed, 0xe0,
+ 0x21, 0x1f, 0xd8, 0x0f, 0x41, 0x01, 0xa0, 0x0e, 0x0f, 0x1e, 0x70, 0x00,
+ 0xdf, 0x0f, 0x00, 0xfc,
+ 0x20, 0x32, 0xed, 0xa9, 0x10, 0x11, 0x0d, 0x20, 0x00, 0xc0, 0x01, 0xfe,
+ 0xfc, 0x25, 0x14, 0xd0,
+ 0x8c, 0xf0, 0x0e, 0xe1, 0x07, 0x00, 0xdd, 0x00, 0x21, 0x42, 0x00, 0xf0,
+ 0xdf, 0xf1, 0xe3, 0xd0,
+ 0xd0, 0xef, 0xbd, 0x16, 0x54, 0xdd, 0xde, 0x01, 0x00, 0x02, 0x01, 0x8b,
+ 0xff, 0x01, 0x03, 0x53,
+ 0x00, 0xdd, 0x02, 0x07, 0x10, 0x30, 0x0c, 0x21, 0x33, 0xe1, 0xe3, 0xff,
+ 0xef, 0x12, 0x02, 0x9b,
+ 0x0e, 0x31, 0x0e, 0xca, 0x51, 0x24, 0xfe, 0xce, 0x0d, 0x21, 0x32, 0x0e,
+ 0xfd, 0xff, 0x0f, 0xfb,
+ 0x53, 0x33, 0xda, 0xee, 0x72, 0x32, 0xee, 0xee, 0x02, 0x30, 0x2f, 0xcb,
+ 0xbe, 0x12, 0x57, 0x1f,
+ 0x0d, 0xef, 0x00, 0xf1, 0x00, 0x24, 0x1f, 0x2e, 0x31, 0xd3, 0x8d, 0x01,
+ 0x05, 0x0e, 0x0f, 0x30,
+ 0x35, 0xdf, 0xdd, 0x43, 0x21, 0x30, 0x35, 0x00, 0xf0, 0xd1, 0xe3, 0x06,
+ 0x31, 0x00, 0x40, 0xe1,
+ 0xa2, 0x04, 0xe1, 0xbd, 0x12, 0x77, 0x00, 0xc0, 0x10, 0x23, 0x13, 0x0f,
+ 0xf3, 0x25, 0x10, 0x20,
+ 0x63, 0x12, 0x02, 0x03, 0xf0, 0xe0, 0x14, 0x33, 0x11, 0x43, 0x05, 0xf0,
+ 0x01, 0x55, 0x1f, 0x1f,
+ 0x54, 0x03, 0x0f, 0x0e, 0x23, 0x54, 0x03, 0x00, 0x22, 0x11, 0x00, 0x0f,
+ 0x23, 0x77, 0x00, 0x01,
+ 0x13, 0x0f, 0x0e, 0x12, 0x15, 0x12, 0x22, 0x0c, 0xda, 0x20, 0x73, 0x31,
+ 0xe0, 0x01, 0x51, 0x0c,
+ 0x3e, 0x23, 0x05, 0xe0, 0xef, 0x02, 0x24, 0x0e, 0xad, 0x03, 0x00, 0xdd,
+ 0x54, 0x53, 0x0d, 0xff,
+ 0x02, 0xf1, 0xf5, 0x01, 0xfe, 0x67, 0x13, 0xdd, 0x03, 0x03, 0xc9, 0xde,
+ 0x10, 0x52, 0xf1, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0xf0, 0x0f, 0x02, 0x04, 0xe1, 0xfe, 0x43, 0x66,
+ 0xcc, 0xdf, 0x27, 0x01,
+ 0xe0, 0x0e, 0x1e, 0x31, 0x04, 0xe0, 0x8e, 0xfd, 0x23, 0x74, 0x0f, 0xe8,
+ 0xf0, 0x10, 0x10, 0xee,
+ 0x22, 0x10, 0xcd, 0x01, 0x00, 0xdb, 0x62, 0x21, 0xed, 0xce, 0x0f, 0x21,
+ 0x23, 0x31, 0x0c, 0xbb,
+ 0x00, 0x13, 0x00, 0x01, 0x2b, 0x0e, 0x20, 0xe0, 0xff, 0x00, 0x04, 0x0f,
+ 0x3d, 0x10, 0xc0, 0x8f,
+ 0x99, 0x00, 0x00, 0x01, 0x00, 0x10, 0xfc, 0xde, 0x00, 0x1d, 0x0f, 0x02,
+ 0x15, 0x1f, 0x0b, 0xcf,
+ 0x02, 0xe4, 0x8c, 0xee, 0x01, 0x20, 0xfd, 0xcc, 0xee, 0xe0, 0x00, 0x00,
+ 0xcc, 0x00, 0x02, 0xef,
+ 0xfe, 0x00, 0xeb, 0xaa, 0x10, 0x12, 0xe0, 0xcb, 0xe0, 0xff, 0x01, 0x10,
+ 0xab, 0x00, 0x32, 0xf0,
+ 0x9b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xee, 0xde, 0xdd, 0xe0, 0x01,
+ 0x10, 0x0c, 0xda, 0x8d,
+ 0x00, 0x01, 0x13, 0x22, 0xea, 0xbd, 0x1f, 0x20, 0xf0, 0xef, 0x00, 0xfd,
+ 0xfe, 0x00, 0xca, 0xe0,
+ 0x0f, 0x20, 0x50, 0xf0, 0xcb, 0xff, 0x00, 0x11, 0x04, 0xa0, 0xd0, 0xcd,
+ 0x1f, 0x21, 0x20, 0xf2,
+ 0xbf, 0xed, 0x11, 0x44, 0x46, 0x00, 0xed, 0xcd, 0x01, 0x04, 0x03, 0x37,
+ 0xe0, 0x8a, 0xe0, 0x12,
+ 0x0f, 0xfe, 0xdd, 0x14, 0x13, 0xee, 0xcc, 0x00, 0x1f, 0x31, 0x23, 0xf0,
+ 0xac, 0x01, 0x23, 0x0e,
+ 0xfc, 0xf0, 0xf2, 0xf0, 0xef, 0xdb, 0xff, 0x63, 0x06, 0xce, 0x10, 0x71,
+ 0x0e, 0xeb, 0x11, 0x13,
+ 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x0e, 0x01, 0x47, 0x1f, 0x1b, 0x70,
+ 0x01, 0xf2, 0x00, 0xee,
+ 0x30, 0x30, 0xde, 0xe0, 0x33, 0x01, 0xcd, 0xaa, 0x00, 0x43, 0x10, 0x0c,
+ 0xf0, 0x63, 0x00, 0xfb,
+ 0x12, 0x24, 0xfd, 0xdd, 0x34, 0x11, 0xe1, 0xd0, 0xcf, 0xee, 0x22, 0x56,
+ 0xce, 0x0c, 0x51, 0x23,
+ 0xe0, 0xcf, 0x24, 0x21, 0x31, 0x03, 0xe0, 0xbf, 0x02, 0x35, 0xfe, 0xce,
+ 0x34, 0x37, 0xdf, 0xaf,
+ 0x00, 0x12, 0x10, 0x40, 0x01, 0xf0, 0x02, 0xe1, 0x0e, 0x00, 0x12, 0x00,
+ 0x0c, 0x56, 0x01, 0xef,
+ 0xf0, 0x13, 0x1f, 0x60, 0x11, 0x0f, 0x37, 0x42, 0xee, 0x0f, 0x32, 0xff,
+ 0x0d, 0x00, 0x52, 0x02,
+ 0xfd, 0x0e, 0x00, 0x62, 0x57, 0x0f, 0x1f, 0x00, 0xf0, 0x47, 0x10, 0x2d,
+ 0x20, 0x00, 0xe1, 0x26,
+ 0x1f, 0x0d, 0x10, 0x71, 0x51, 0x02, 0x20, 0x0d, 0x10, 0x14, 0x12, 0x12,
+ 0x54, 0x00, 0xe0, 0x02,
+ 0xe1, 0xf3, 0xd7, 0x05, 0x20, 0xee, 0x2f, 0x73, 0x21, 0xe2, 0x17, 0x30,
+ 0x00, 0x61, 0x12, 0xdf,
+ 0x01, 0x37, 0x33, 0xf0, 0xee, 0xf0, 0xa0, 0xf0, 0xe2, 0x05, 0x40, 0xee,
+ 0x10, 0x54, 0xf3, 0xcf,
+ 0x00, 0x54, 0x00, 0x00, 0x13, 0x00, 0xf3, 0x07, 0x00, 0xee, 0x12, 0x34,
+ 0xe0, 0x00, 0x01, 0x31,
+ 0x41, 0xf0, 0x00, 0x04, 0x00, 0xdf, 0xfd, 0x74, 0x40, 0xa8, 0x0f, 0x10,
+ 0x22, 0x00, 0x1f, 0x2e,
+ 0x4f, 0x11, 0x25, 0x10, 0x0f, 0x0b, 0x00, 0x10, 0x01, 0xdf, 0xbd, 0x00,
+ 0xec, 0x1f, 0x72, 0x71,
+ 0x0c, 0xf0, 0x00, 0x10, 0x30, 0xf8, 0xf0, 0x00, 0x22, 0xf0, 0xd0, 0xff,
+ 0xcd, 0xec, 0x21, 0x42,
+ 0xfc, 0x0e, 0x72, 0x00, 0xfe, 0x13, 0x04, 0x01, 0x20, 0x30, 0x32, 0x04,
+ 0x90, 0xe0, 0xf4, 0xf7,
+ 0xd0, 0xff, 0x02, 0xe2, 0xbf, 0xff, 0x17, 0x21, 0xf0, 0x00, 0x12, 0xc0,
+ 0x00, 0x26, 0x10, 0x90,
+ 0xf0, 0x24, 0xee, 0xcc, 0x45, 0xf1, 0xd1, 0x11, 0x30, 0x20, 0x00, 0xb0,
+ 0x03, 0x13, 0x11, 0xdd,
+ 0xbc, 0x00, 0x10, 0x53, 0x04, 0x02, 0xf0, 0xe8, 0x0f, 0x60, 0x22, 0x00,
+ 0x20, 0x12, 0x0f, 0xdd,
+ 0xdc, 0xce, 0x24, 0x32, 0xbc, 0xec, 0x00, 0x0e, 0x0f, 0x73, 0x15, 0x1a,
+ 0x0e, 0x4f, 0x20, 0x02,
+ 0x00, 0x0d, 0xfd, 0x10, 0x00, 0x9d, 0xf0, 0xf0, 0xeb, 0x0f, 0x05, 0x05,
+ 0xfe, 0x00, 0xde, 0x00,
+ 0xc0, 0x0a, 0x83, 0xb6, 0x9b, 0x09, 0x42, 0xb5, 0xbb, 0xcc, 0x01, 0x13,
+ 0x20, 0x0e, 0x3f, 0xf0,
+ 0xf0, 0x02, 0x01, 0xbb, 0xed, 0x13, 0x2f, 0xda, 0xe0, 0xd0, 0x80, 0x00,
+ 0xf1, 0x1f, 0x2e, 0xef,
+ 0xc0, 0xf1, 0xee, 0xec, 0x05, 0x03, 0xae, 0x01, 0xe4, 0xec, 0xbd, 0x00,
+ 0x10, 0x26, 0x14, 0xdf,
+ 0xce, 0x40, 0x01, 0xf0, 0xe2, 0xdf, 0xed, 0x55, 0x22, 0xbc, 0xdb, 0xef,
+ 0x00, 0x11, 0x10, 0x1e,
+ 0x3e, 0xed, 0xee, 0x31, 0x03, 0x0d, 0x0b, 0x3f, 0x0d, 0x8d, 0xd0, 0xf0,
+ 0x67, 0x10, 0xf8, 0x00,
+ 0x20, 0x20, 0x0f, 0x7e, 0x20, 0x00, 0x0f, 0xf1, 0xe0, 0xea, 0xcf, 0x00,
+ 0x30, 0xd0, 0x8b, 0xee,
+ 0x32, 0x22, 0x0d, 0xe0, 0xed, 0x0e, 0x53, 0x0f, 0xeb, 0x13, 0x0e, 0xee,
+ 0x34, 0xcb, 0xdf, 0x31,
+ 0x00, 0x8c, 0x00, 0x03, 0x0e, 0x0c, 0xe0, 0xf0, 0xf1, 0xe0, 0xec, 0x10,
+ 0x32, 0x11, 0xef, 0x8b,
+ 0xdc, 0x01, 0x25, 0x0f, 0xee, 0x01, 0x11, 0xf1, 0xe1, 0xdd, 0x30, 0x11,
+ 0xe0, 0xb3, 0x17, 0x34,
+ 0xbe, 0xee, 0xe2, 0xaf, 0xed, 0xe0, 0x24, 0x10, 0xb9, 0x00, 0x22, 0x43,
+ 0x0e, 0xfd, 0x02, 0x00,
+ 0x03, 0x31, 0xfd, 0xbc, 0x01, 0x14, 0xde, 0xcd, 0x00, 0x32, 0x74, 0x10,
+ 0x08, 0xfd, 0x53, 0x12,
+ 0xdd, 0x04, 0x14, 0x20, 0x1e, 0x00, 0x0f, 0x02, 0x67, 0xf0, 0xed, 0x00,
+ 0x73, 0x10, 0xfc, 0x11,
+ 0x15, 0x00, 0x20, 0x33, 0xfe, 0xad, 0x12, 0x25, 0x10, 0x00, 0xd0, 0x10,
+ 0x23, 0x10, 0x10, 0xf0,
+ 0xd0, 0x32, 0x01, 0xf0, 0x05, 0x33, 0x30, 0x40, 0x9f, 0xcb, 0x03, 0x26,
+ 0x00, 0x60, 0x10, 0xf0,
+ 0xef, 0xe1, 0x07, 0x22, 0x11, 0x50, 0x32, 0x00, 0xc0, 0x01, 0x02, 0x10,
+ 0x32, 0x11, 0xcb, 0x22,
+ 0x56, 0xfd, 0x0e, 0x73, 0x26, 0x0f, 0xde, 0x10, 0x32, 0x32, 0x10, 0xf0,
+ 0xf3, 0xf2, 0xe1, 0xaf,
+ 0xff, 0x13, 0xfe, 0x0a, 0x75, 0x10, 0x0f, 0x2f, 0x20, 0x00, 0x21, 0x26,
+ 0x11, 0x10, 0xfe, 0xd0,
+ 0x31, 0x00, 0x01, 0x24, 0xef, 0xdb, 0x61, 0x00, 0x0e, 0x01, 0xcd, 0xdb,
+ 0x75, 0x74, 0x00, 0xed,
+ 0x00, 0x24, 0xf0, 0x0f, 0x44, 0x10, 0xff, 0xef, 0x11, 0x11, 0xf0, 0x05,
+ 0x32, 0xde, 0xbc, 0x01,
+ 0x04, 0xef, 0xbe, 0x0f, 0x10, 0x3f, 0xf0, 0xf2, 0x11, 0x3e, 0x2d, 0x55,
+ 0x03, 0x8b, 0x0e, 0x01,
+ 0x24, 0x22, 0x02, 0xcf, 0xfd, 0x1f, 0x1f, 0xeb, 0xde, 0x43, 0x31, 0xfd,
+ 0x0f, 0xdb, 0xe0, 0x22,
+ 0x1f, 0x19, 0x70, 0x30, 0x0e, 0xdf, 0xd0, 0xe0, 0x24, 0x1e, 0x0b, 0x72,
+ 0x41, 0xba, 0xfe, 0x20,
+ 0x74, 0x00, 0x0b, 0x0f, 0x00, 0x11, 0x02, 0x00, 0xfe, 0x00, 0x12, 0x0f,
+ 0xcd, 0x13, 0x13, 0xea,
+ 0xce, 0x32, 0x55, 0xee, 0xce, 0x43, 0x10, 0xef, 0x0f, 0xf2, 0xf3, 0x13,
+ 0x4f, 0x1c, 0x01, 0xe2,
+ 0xd3, 0xf4, 0xf0, 0x09, 0x1f, 0x73, 0xf1, 0xa1, 0x00, 0xe1, 0x0f, 0x0d,
+ 0x31, 0x17, 0xd1, 0xac,
+ 0x02, 0x46, 0x00, 0xed, 0x00, 0x03, 0x00, 0xe0, 0x02, 0x23, 0xfe, 0xde,
+ 0x36, 0xf0, 0x8f, 0x00,
+ 0x02, 0xff, 0x0e, 0x10, 0xf0, 0x0f, 0x0f, 0x0f, 0x21, 0x0d, 0x88, 0x0d,
+ 0x45, 0x10, 0xdc, 0x0e,
+ 0x12, 0x00, 0xee, 0xed, 0xf0, 0x10, 0x20, 0x1f, 0xfc, 0x8a, 0x10, 0x63,
+ 0x00, 0xec, 0xfd, 0xfc,
+ 0x22, 0x24, 0x00, 0xed, 0xcd, 0x1f, 0x42, 0xf0, 0xee, 0xfd, 0xfb, 0x41,
+ 0x10, 0xcb, 0x00, 0x20,
+ 0x00, 0x11, 0xef, 0xef, 0x25, 0x0f, 0x30, 0x64, 0xbd, 0xed, 0x15, 0x33,
+ 0x00, 0x0e, 0xd0, 0xf0,
+ 0xb0, 0x05, 0x03, 0xdd, 0xf0, 0x22, 0xe0, 0x12, 0x06, 0xd0, 0x10, 0x31,
+ 0x22, 0xb1, 0x9e, 0xed,
+ 0x15, 0x56, 0x00, 0x03, 0xf2, 0xc0, 0x00, 0x14, 0x20, 0xef, 0x21, 0x67,
+ 0x01, 0xd0, 0x0f, 0x42,
+ 0x32, 0xf0, 0x00, 0x30, 0x02, 0x02, 0x0d, 0x3d, 0x77, 0x01, 0xd0, 0x01,
+ 0xc1, 0xed, 0x0e, 0x75,
+ 0x11, 0xff, 0xef, 0x11, 0x53, 0x0e, 0x0c, 0x21, 0x11, 0x0d, 0x2f, 0x10,
+ 0x1e, 0x10, 0x10, 0xfa,
+ 0x00, 0x54, 0x1f, 0xd8, 0x10, 0x01, 0xce, 0x00, 0x00, 0x9c, 0x0f, 0x77,
+ 0x10, 0xed, 0x00, 0xe0,
+ 0x01, 0x62, 0x0e, 0x0d, 0x00, 0xff, 0x13, 0x35, 0x0f, 0xfc, 0xfe, 0xf1,
+ 0x03, 0x00, 0xe0, 0xce,
+ 0xff, 0x01, 0x01, 0x22, 0x00, 0xac, 0xec, 0x00, 0x31, 0x00, 0xef, 0xf1,
+ 0xe0, 0x07, 0x57, 0xf1,
+ 0x8e, 0x00, 0x23, 0x0e, 0xed, 0x37, 0x01, 0xbe, 0xfe, 0x01, 0x01, 0xef,
+ 0x0e, 0x00, 0x0d, 0x02,
+ 0x33, 0xfe, 0xfb, 0x0f, 0xef, 0x9e, 0x02, 0x27, 0x22, 0xcb, 0x00, 0x40,
+ 0x02, 0x0f, 0x0e, 0x30,
+ 0x4f, 0x0e, 0x23, 0x0f, 0xa8, 0x00, 0x61, 0x22, 0xfe, 0xcb, 0x21, 0x23,
+ 0xfd, 0x00, 0x10, 0xe0,
+ 0xcf, 0x00, 0x1f, 0xff, 0xf0, 0xee, 0xeb, 0xee, 0x21, 0x00, 0xdb, 0x70,
+ 0x53, 0x0e, 0xed, 0x02,
+ 0xf0, 0xfe, 0x12, 0x0e, 0xdb, 0xe0, 0xae, 0x01, 0x07, 0xdc, 0xce, 0x11,
+ 0x12, 0xcf, 0xa8, 0x00,
+ 0x51, 0x0f, 0xed, 0xf0, 0x02, 0x00, 0x1d, 0x00, 0xf5, 0xf1, 0xef, 0xcd,
+ 0x00, 0x13, 0x01, 0xcf,
+ 0xde, 0xee, 0xc4, 0xc0, 0xcd, 0xfa, 0x01, 0x44, 0xfe, 0xce, 0xfe, 0x00,
+ 0x41, 0x12, 0xd8, 0xe0,
+ 0x10, 0xe0, 0xce, 0x00, 0x01, 0xbe, 0x00, 0xf0, 0xc9, 0xf0, 0x01, 0x00,
+ 0x00, 0xcf, 0xbb, 0x00,
+ 0x61, 0x11, 0xff, 0xed, 0x03, 0x26, 0x20, 0x0d, 0x00, 0xff, 0x02, 0x03,
+ 0xcd, 0xff, 0x21, 0x00,
+ 0xaa, 0x00, 0x04, 0xf0, 0xfe, 0x0d, 0x40, 0x41, 0x10, 0x00, 0x05, 0x35,
+ 0xbf, 0xfd, 0x00, 0x00,
+ 0xbd, 0x03, 0x37, 0xf0, 0xdc, 0x00, 0xd0, 0xe2, 0x00, 0x30, 0x1c, 0xad,
+ 0xe0, 0x35, 0x00, 0xaf,
+ 0x00, 0x10, 0x00, 0xf0, 0xe0, 0xf2, 0x00, 0x3e, 0x71, 0x30, 0xde, 0xef,
+ 0xef, 0xfe, 0x01, 0x47,
+ 0x40, 0xf8, 0xe0, 0x30, 0x12, 0x0e, 0x21, 0x20, 0xcb, 0x00, 0x33, 0x51,
+ 0xf0, 0x8b, 0x00, 0xe0,
+ 0x02, 0x24, 0xfe, 0xbb, 0x01, 0x42, 0x0f, 0x00, 0x02, 0x10, 0x1b, 0x30,
+ 0x33, 0x10, 0xe0, 0xf0,
+ 0x10, 0x32, 0xdc, 0xef, 0x01, 0xc1, 0x00, 0x30, 0x0d, 0x8d, 0xf0, 0xd2,
+ 0x00, 0xdf, 0x23, 0x77,
+ 0x36, 0x00, 0x1e, 0x32, 0x14, 0x01, 0xe0, 0x23, 0x15, 0x10, 0xee, 0xc0,
+ 0xe0, 0x56, 0xe0, 0xaf,
+ 0x11, 0x20, 0xeb, 0x10, 0x61, 0x03, 0x0f, 0xee, 0x12, 0x00, 0xc9, 0x10,
+ 0x74, 0x00, 0x0e, 0x02,
+ 0x32, 0x1e, 0x1e, 0x01, 0x11, 0x04, 0x32, 0xcd, 0xed, 0x23, 0x31, 0x0e,
+ 0xf0, 0x11, 0x40, 0x4e,
+ 0x1f, 0x18, 0x20, 0x50, 0x00, 0x20, 0x52, 0xfc, 0x00, 0x74, 0x0d, 0x0a,
+ 0x14, 0x33, 0xfb, 0x00,
+ 0x31, 0x00, 0x32, 0x42, 0x0d, 0x2c, 0x74, 0x42, 0xe2, 0xf0, 0x00, 0x20,
+ 0x20, 0x10, 0x37, 0x01,
+ 0xc0, 0x00, 0xf2, 0x11, 0x10, 0x11, 0xf0, 0xe0, 0x51, 0x16, 0xf0, 0x33,
+ 0x67, 0x00, 0x0f, 0x00,
+ 0x03, 0x00, 0x22, 0x42, 0xe0, 0x9f, 0x03, 0x17, 0x12, 0xff, 0x01, 0x13,
+ 0xe0, 0x01, 0x22, 0x40,
+ 0x14, 0x03, 0x8f, 0xe0, 0x07, 0x03, 0x00, 0x20, 0x10, 0x10, 0x15, 0xf0,
+ 0xd0, 0x40, 0x77, 0x00,
+ 0xe0, 0xef, 0xef, 0x02, 0x34, 0x10, 0xef, 0x0f, 0x0d, 0x60, 0x31, 0xef,
+ 0xf0, 0x40, 0x08, 0xde,
+ 0x30, 0x41, 0xef, 0xfd, 0x00, 0x0f, 0x00, 0x21, 0xbb, 0xed, 0x21, 0xde,
+ 0x9a, 0x10, 0x42, 0x10,
+ 0x0b, 0xfe, 0x00, 0x21, 0x01, 0x4f, 0x4d, 0x1e, 0xf0, 0xdc, 0xff, 0xe0,
+ 0x01, 0x35, 0xdc, 0x8d,
+ 0x01, 0x33, 0xbb, 0xed, 0x34, 0x64, 0xf0, 0xec, 0xf1, 0x00, 0xf1, 0x23,
+ 0x00, 0xf0, 0x04, 0xd0,
+ 0xdf, 0x32, 0x02, 0x80, 0x02, 0xf4, 0x13, 0x22, 0xec, 0xf0, 0x24, 0xd0,
+ 0x8c, 0xe6, 0x05, 0x0f,
+ 0xde, 0x00, 0x23, 0xe2, 0xb0, 0x01, 0x32, 0x20, 0x00, 0x43, 0x06, 0xe0,
+ 0x03, 0xf1, 0x01, 0x55,
+ 0x00, 0xdd, 0x01, 0x31, 0x0f, 0x50, 0x24, 0xdc, 0xbc, 0x10, 0x31, 0x42,
+ 0x02, 0xe0, 0xee, 0xf0,
+ 0xfe, 0xee, 0x35, 0x62, 0xeb, 0x0d, 0x0f, 0x3f, 0x0d, 0x30, 0x0a, 0x70,
+ 0x43, 0xfd, 0xdb, 0x50,
+ 0x00, 0x1f, 0x31, 0x12, 0xdd, 0xfd, 0xee, 0xfd, 0x00, 0xcd, 0xd8, 0x0f,
+ 0x10, 0x30, 0x0f, 0x0e,
+ 0xde, 0xaf, 0x21, 0x71, 0x3c, 0x0e, 0xfb, 0xd1, 0x27, 0x00, 0xad, 0x00,
+ 0xf2, 0x00, 0xf0, 0xfd,
+ 0xe0, 0x01, 0x01, 0xdf, 0xcb, 0xe0, 0x03, 0xb0, 0xc9, 0x22, 0x01, 0xad,
+ 0x00, 0x10, 0xff, 0xf1,
+ 0x47, 0x01, 0xcd, 0x00, 0x03, 0x01, 0x01, 0x0e, 0xcc, 0x02, 0x04, 0xf0,
+ 0xcd, 0xf0, 0x0f, 0xfc,
+ 0xdb, 0x10, 0x74, 0x10, 0xec, 0x10, 0x51, 0x00, 0x01, 0xf0, 0xe0, 0xec,
+ 0x0f, 0x40, 0x0d, 0x0d,
+ 0x0d, 0xea, 0x20, 0x70, 0x0d, 0x1c, 0x0e, 0x1e, 0x1f, 0x21, 0x33, 0x4e,
+ 0x3e, 0x2f, 0xfb, 0xde,
+ 0xcc, 0xf0, 0x0e, 0x0e, 0x1f, 0x0d, 0x88, 0xed, 0x00, 0x01, 0x12, 0x0d,
+ 0x20, 0x74, 0x1e, 0xe8,
+ 0x00, 0x11, 0xe0, 0xbe, 0x02, 0xe0, 0xdb, 0x11, 0x03, 0x9e, 0x0e, 0x00,
+ 0x0e, 0x02, 0x22, 0xdd,
+ 0xeb, 0x00, 0xe0, 0xbe, 0x06, 0x02, 0x0d, 0xdc, 0x00, 0x00, 0xc1, 0xc1,
+ 0xe1, 0xe5, 0xe1, 0xe2,
+ 0xbf, 0xce, 0x04, 0xd2, 0xd0, 0xe1, 0x01, 0x32, 0xcc, 0xcc, 0x02, 0x24,
+ 0x00, 0xfd, 0xeb, 0x70,
+ 0x40, 0xf2, 0xe3, 0xe1, 0xee, 0x0f, 0x0e, 0x88, 0x00, 0x03, 0xfe, 0xdc,
+ 0x00, 0x21, 0xee, 0x0f,
+ 0x4e, 0x31, 0x67, 0x00, 0x00, 0x21, 0x02, 0x10, 0x0f, 0x20, 0x23, 0x33,
+ 0xeb, 0xde, 0x20, 0xe1,
+ 0x8e, 0x03, 0x37, 0x0f, 0xdd, 0x64, 0x13, 0xed, 0x0f, 0x73, 0x21, 0x00,
+ 0xf0, 0x05, 0x02, 0xfe,
+ 0xff, 0x13, 0x13, 0x11, 0xf3, 0x05, 0xf0, 0xfe, 0x42, 0x56, 0xe1, 0xc0,
+ 0xe0, 0x04, 0x32, 0xe0,
+ 0xad, 0x00, 0xf0, 0x05, 0x23, 0xfc, 0xf0, 0x33, 0x0e, 0x0f, 0x46, 0xf3,
+ 0x13, 0x72, 0x0e, 0x00,
+ 0xf4, 0xe0, 0x27, 0x40, 0xde, 0x0e, 0x30, 0x33, 0xd1, 0x00, 0x74, 0x42,
+ 0x00, 0xde, 0xfe, 0x10,
+ 0x57, 0xf1, 0xef, 0x33, 0x10, 0xc9, 0x00, 0x11, 0xf0, 0xf1, 0x71, 0x3e,
+ 0x0c, 0x42, 0x00, 0x01,
+ 0x04, 0x3f, 0x0b, 0x21, 0x21, 0x0f, 0xed, 0xde, 0xc0, 0xee, 0x0e, 0x42,
+ 0x10, 0xfc, 0xe0, 0x36,
+ 0x62, 0x10, 0x40, 0x52, 0x0e, 0xec, 0x13, 0x37, 0xe0, 0xde, 0x00, 0xf1,
+ 0xf1, 0xf2, 0xd0, 0x0f,
+ 0x0e, 0xcf, 0x54, 0x13, 0xd0, 0xdc, 0x01, 0x00, 0xe0, 0xc0, 0x0e, 0x0b,
+ 0x50, 0x51, 0x0b, 0xdd,
+ 0xf2, 0xd5, 0xd0, 0x2f, 0x7e, 0x10, 0x22, 0x03, 0x90, 0xfe, 0xf7, 0x02,
+ 0xed, 0xfd, 0xda, 0x0e,
+ 0x50, 0x01, 0xef, 0x0d, 0x2f, 0x2b, 0x0e, 0x41, 0x25, 0x0f, 0xfc, 0x50,
+ 0x30, 0x00, 0xd0, 0xab,
+ 0x00, 0x0f, 0x1f, 0x1f, 0x2f, 0x5e, 0xfe, 0x20, 0x65, 0x1f, 0x1f, 0x10,
+ 0x12, 0x20, 0x0a, 0x00,
+ 0x01, 0xfd, 0xce, 0x00, 0xd0, 0xfe, 0xff, 0xf0, 0x50, 0x44, 0xfe, 0xc0,
+ 0x22, 0x0e, 0x1b, 0x0e,
+ 0x20, 0x04, 0x9f, 0x01, 0x05, 0xee, 0xe0, 0x37, 0x42, 0xbe, 0x04, 0x15,
+ 0xef, 0xde, 0x03, 0xf3,
+ 0xc0, 0xf0, 0x00, 0x02, 0xb0, 0xee, 0xf2, 0xf3, 0xed, 0xef, 0xd0, 0x06,
+ 0xd1, 0xb0, 0x05, 0x11,
+ 0x04, 0x16, 0xe1, 0x8f, 0xcf, 0x0f, 0xf0, 0xf0, 0x05, 0xef, 0xcc, 0x20,
+ 0x11, 0xfd, 0xee, 0x10,
+ 0x20, 0x0e, 0x0f, 0x62, 0x21, 0xc9, 0xe0, 0xf2, 0xcf, 0xdc, 0xef, 0x0f,
+ 0xfe, 0x9c, 0xfe, 0x11,
+ 0x1f, 0x0b, 0x31, 0x10, 0xdc, 0x40, 0x73, 0x0c, 0x0d, 0x10, 0x11, 0x0f,
+ 0xfa, 0xef, 0xff, 0xd0,
+ 0x00, 0xe0, 0xe0, 0xfc, 0x00, 0x20, 0xdd, 0xff, 0x74, 0xfe, 0xcb, 0x01,
+ 0x32, 0xcf, 0xce, 0x13,
+ 0x40, 0x1e, 0x34, 0x05, 0xe0, 0xcf, 0xf0, 0x05, 0xd1, 0x8e, 0x01, 0x05,
+ 0xce, 0xf0, 0x02, 0xc0,
+ 0xe0, 0x05, 0x00, 0x00, 0x00, 0xf2, 0x05, 0x03, 0xf0, 0x34, 0x74, 0x02,
+ 0xf2, 0xe0, 0xd0, 0x03,
+ 0xf6, 0x11, 0xd0, 0x00, 0x62, 0xf1, 0xd0, 0x00, 0xe2, 0x02, 0x61, 0x20,
+ 0x35, 0x00, 0x00, 0xf2,
+ 0x03, 0xe0, 0xcf, 0x00, 0x22, 0x0f, 0x0d, 0x00, 0x1e, 0x3d, 0x08, 0x7e,
+ 0x72, 0x40, 0x0d, 0x0f,
+ 0x07, 0x13, 0x3f, 0x4c, 0x1d, 0x0e, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0x0d,
+ 0x0e, 0x33, 0x6f, 0x4b,
+ 0x20, 0x3f, 0x10, 0x10, 0x0b, 0xf0, 0x30, 0x00, 0x30, 0x30, 0x2f, 0x10,
+ 0x62, 0x43, 0x21, 0x0e,
+ 0x02, 0xd5, 0xe0, 0x12, 0xc2, 0xa1, 0xf7, 0xff, 0xce, 0xf1, 0xf6, 0xd0,
+ 0x00, 0x00, 0x1e, 0x2f,
+ 0x32, 0x47, 0x04, 0x00, 0xcf, 0x9f, 0xf2, 0xe3, 0xe2, 0xc0, 0xf1, 0x07,
+ 0x01, 0xa0, 0xff, 0xe1,
+ 0x03, 0x32, 0x00, 0xce, 0x40, 0x43, 0x01, 0xf2, 0x07, 0x16, 0x10, 0x0e,
+ 0xef, 0xe0, 0x10, 0xf2,
+ 0x8f, 0x0e, 0x0e, 0x1d, 0x1c, 0x61, 0x22, 0x1d, 0x20, 0x31, 0x00, 0x41,
+ 0x1d, 0x19, 0x31, 0x51,
+ 0x00, 0x0f, 0x1c, 0x0d, 0xec, 0x0e, 0x44, 0x62, 0x2d, 0x4d, 0x0d, 0xf9,
+ 0xf0, 0x04, 0x31, 0xef,
+ 0x0e, 0xfe, 0x0e, 0xed, 0xe1, 0x47, 0x30, 0x30, 0x7f, 0x10, 0xf0, 0xee,
+ 0x01, 0x00, 0x50, 0x45,
+ 0x10, 0xde, 0xce, 0xf2, 0xd2, 0xeb, 0xf0, 0x24, 0xee, 0xff, 0x14, 0x07,
+ 0xb0, 0xbe, 0x01, 0xf5,
+ 0xe1, 0xc2, 0xf2, 0xb0, 0x00, 0xf3, 0xc0, 0xf2, 0xf5, 0xe0, 0x0f, 0x71,
+ 0x01, 0xe0, 0x03, 0xe2,
+ 0x02, 0x21, 0x0f, 0xfe, 0xc3, 0xd4, 0xcf, 0xd1, 0xf5, 0xef, 0xca, 0xf0,
+ 0xee, 0xdd, 0xf2, 0x05,
+ 0x21, 0x10, 0x4e, 0x10, 0x14, 0x33, 0x71, 0x4e, 0xe9, 0x00, 0xf0, 0x00,
+ 0x02, 0xc1, 0x00, 0x10,
+ 0x30, 0x0b, 0x5f, 0x2f, 0x00, 0x30, 0x22, 0xec, 0xdf, 0x44, 0x1e, 0xea,
+ 0x50, 0x73, 0x10, 0x0b,
+ 0x20, 0x41, 0x00, 0x0e, 0x13, 0x12, 0x10, 0xff, 0x00, 0xe6, 0xd0, 0x80,
+ 0xe0, 0xdf, 0xcd, 0xfc,
+ 0xef, 0xfd, 0xff, 0x40, 0x3b, 0xea, 0xc0, 0x00, 0x04, 0x20, 0x40, 0xe0,
+ 0xb1, 0x02, 0xe1, 0xdf,
+ 0xe2, 0x07, 0x10, 0xae, 0x0e, 0x33, 0x02, 0xd1, 0x03, 0x20, 0xfb, 0x1f,
+ 0x46, 0xb1, 0xc0, 0x01,
+ 0xe1, 0xd0, 0x00, 0x14, 0xef, 0xf0, 0xf0, 0xa1, 0xff, 0x0f, 0x2f, 0xd0,
+ 0x03, 0x44, 0x2d, 0xe8,
+ 0x0d, 0x70, 0x20, 0xdd, 0xdd, 0x01, 0xf2, 0xf0, 0x0c, 0xd8, 0xc0, 0x40,
+ 0x53, 0x11, 0x50, 0x0e,
+ 0x0e, 0xfe, 0xe0, 0xff, 0xef, 0x00, 0x2b, 0x2e, 0x61, 0x13, 0xee, 0xea,
+ 0x20, 0x4e, 0x2e, 0x53,
+ 0x15, 0xee, 0xec, 0x02, 0x01, 0xee, 0xcf, 0xff, 0xda, 0x0d, 0x60, 0x10,
+ 0x09, 0xef, 0x20, 0x3f,
+ 0x0f, 0x0f, 0x3e, 0x00, 0xf0, 0xc2, 0xe1, 0x12, 0xe0, 0x8d, 0xf0, 0xe1,
+ 0xe1, 0xba, 0x0f, 0x0f,
+ 0x30, 0x20, 0x08, 0xec, 0x00, 0x10, 0x00, 0x73, 0x72, 0xec, 0xed, 0x01,
+ 0x13, 0x10, 0x21, 0x0c,
+ 0xed, 0x00, 0x02, 0x11, 0xda, 0x12, 0x76, 0x1e, 0x0e, 0x20, 0x61, 0x00,
+ 0x00, 0x01, 0x22, 0x0f,
+ 0xfe, 0x02, 0x23, 0x00, 0x0f, 0x0b, 0x41, 0x45, 0xe0, 0xef, 0x0c, 0xfe,
+ 0xc0, 0xe1, 0xff, 0x2e,
+ 0x5f, 0x2e, 0xff, 0xe2, 0xf7, 0xe4, 0x60, 0x62, 0x20, 0x22, 0x17, 0x01,
+ 0xd1, 0x01, 0x11, 0xf3,
+ 0xc1, 0xe1, 0xc0, 0xe1, 0xf0, 0x02, 0x0c, 0xdc, 0xee, 0x1e, 0x05, 0x05,
+ 0x5e, 0x00, 0x48, 0x00,
+ 0xf1, 0xe8, 0x7d, 0x19, 0xc1, 0xe9, 0x43, 0x1d, 0x80, 0xf7, 0xf1, 0xfe,
+ 0xf6, 0x04, 0x00, 0x80,
+ 0xfe, 0xf0, 0xe3, 0xd0, 0x00, 0x00, 0x19, 0x2f, 0x10, 0xff, 0xdf, 0x2f,
+ 0x1d, 0x0e, 0xd2, 0x91,
+ 0xf3, 0xe0, 0xd8, 0xcb, 0x00, 0xd0, 0x9d, 0xef, 0xee, 0xce, 0xfd, 0xdd,
+ 0x0f, 0x0e, 0x3e, 0x0a,
+ 0x3e, 0x4e, 0x20, 0x0d, 0xec, 0x0f, 0xed, 0x1d, 0xfd, 0x0e, 0x40, 0xd0,
+ 0xaa, 0xde, 0xbd, 0xff,
+ 0xce, 0xdc, 0xde, 0x1f, 0x2d, 0x20, 0x02, 0x9f, 0x0a, 0x10, 0x2f, 0x0a,
+ 0x00, 0x50, 0x10, 0x0e,
+ 0xd2, 0x17, 0x01, 0xe0, 0xed, 0xc1, 0x93, 0xe1, 0xe1, 0xe0, 0xed, 0xe0,
+ 0xf4, 0x02, 0xe0, 0xe3,
+ 0x00, 0xfc, 0x51, 0x37, 0x04, 0x83, 0x03, 0x03, 0x03, 0x03, 0x06, 0xd0,
+ 0xc1, 0x04, 0x00, 0xf1,
+ 0x02, 0x51, 0xff, 0xee, 0x05, 0x04, 0x02, 0x10, 0x1e, 0x02, 0xf3, 0x24,
+ 0x70, 0x1e, 0x1c, 0x10,
+ 0xf2, 0xd2, 0xce, 0xfd, 0xfc, 0x1f, 0x41, 0xe3, 0x02, 0x52, 0x62, 0x18,
+ 0x1c, 0x20, 0x01, 0xdc,
+ 0x0e, 0x71, 0x1c, 0x1d, 0x40, 0x00, 0xdc, 0x00, 0x11, 0x2e, 0x0d, 0x0b,
+ 0x1e, 0x2f, 0x0e, 0x3f,
+ 0x50, 0x0b, 0x1b, 0x30, 0x60, 0x0f, 0x0d, 0x01, 0x44, 0x30, 0x0e, 0x01,
+ 0x03, 0x01, 0xd2, 0x05,
+ 0x02, 0x12, 0x14, 0xb0, 0xbb, 0x10, 0x42, 0x01, 0x01, 0xfd, 0xda, 0x10,
+ 0x53, 0x00, 0x00, 0x0f,
+ 0x1c, 0x30, 0xd2, 0xa3, 0x07, 0x03, 0xa0, 0xf0, 0xf0, 0x01, 0x03, 0xef,
+ 0xf0, 0x23, 0x11, 0x03,
+ 0xe7, 0xe7, 0xf0, 0x71, 0x40, 0x10, 0x10, 0x10, 0x00, 0x01, 0x00, 0xfd,
+ 0xff, 0xd0, 0xce, 0xab,
+ 0xf0, 0xf1, 0x12, 0x7d, 0x2b, 0x00, 0x0f, 0xf0, 0x10, 0x4c, 0x5f, 0x31,
+ 0x2c, 0x2b, 0x30, 0x22,
+ 0xee, 0x0f, 0x41, 0x0d, 0x2d, 0x20, 0x02, 0xef, 0xb8, 0xff, 0x00, 0x00,
+ 0xfc, 0x00, 0xfd, 0x3c,
+ 0x70, 0x1f, 0x0e, 0xed, 0xed, 0x22, 0x43, 0x2c, 0x6b, 0x2e, 0x00, 0xf3,
+ 0xc4, 0x25, 0x30, 0x0a,
+ 0x0f, 0x00, 0xe0, 0xa1, 0xe0, 0xe1, 0xef, 0x0a, 0x11, 0x32, 0xa0, 0xd1,
+ 0x02, 0x35, 0x20, 0xe2,
+ 0xd1, 0xb1, 0xf3, 0x02, 0x23, 0x02, 0xd0, 0xe3, 0xf7, 0xd0, 0xd2, 0xd0,
+ 0xde, 0x20, 0xc0, 0x03,
+ 0x77, 0x72, 0x4f, 0xfe, 0xd0, 0xe1, 0xe0, 0xd4, 0xd1, 0xf1, 0x12, 0x02,
+ 0xf7, 0xd1, 0x80, 0x00,
+ 0x33, 0x43, 0x10, 0x20, 0x10, 0xf0, 0x01, 0x57, 0x27, 0xff, 0x00, 0x11,
+ 0xf0, 0x0f, 0x21, 0x43,
+ 0x11, 0x30, 0x20, 0x00, 0x40, 0x32, 0x60, 0x22, 0x30, 0x2e, 0x2d, 0x5d,
+ 0x46, 0x12, 0x10, 0x67,
+ 0x23, 0xf0, 0x02, 0x06, 0x00, 0x00, 0x12, 0x53, 0x00, 0xe0, 0x10, 0x01,
+ 0xc0, 0xf3, 0xf3, 0x0d,
+ 0x0a, 0x40, 0x20, 0x0e, 0x02, 0x00, 0x22, 0x77, 0x47, 0x10, 0x01, 0x10,
+ 0x20, 0x12, 0x21, 0x00,
+ 0xe2, 0x04, 0xe0, 0xe0, 0xcf, 0xd1, 0x04, 0x52, 0x74, 0x22, 0x33, 0x20,
+ 0x23, 0x13, 0xf4, 0xf4,
+ 0x02, 0xe1, 0x12, 0x74, 0x00, 0xce, 0xe1, 0x07, 0x01, 0x00, 0x0f, 0x3e,
+ 0x30, 0x21, 0x01, 0x50,
+ 0x2d, 0x2f, 0x4f, 0x1f, 0x07, 0x47, 0x00, 0x20, 0x6f, 0x12, 0x02, 0x01,
+ 0x00, 0x00, 0x30, 0x30,
+ 0xe0, 0xe6, 0xdf, 0xce, 0x60, 0x43, 0x0b, 0x2f, 0x23, 0xe1, 0xef, 0xf1,
+ 0x33, 0x50, 0x10, 0x20,
+ 0x00, 0x04, 0xf0, 0x0c, 0xfd, 0x21, 0x33, 0xb8, 0xdd, 0xe0, 0xfe, 0xfe,
+ 0x3f, 0xfb, 0x8e, 0x1e,
+ 0x30, 0x00, 0x02, 0x05, 0xf0, 0x0c, 0x6f, 0x2d, 0x1e, 0x00, 0xa3, 0xde,
+ 0xa8, 0xfd, 0xee, 0x0d,
+ 0xfe, 0x31, 0x63, 0x0e, 0x08, 0x10, 0x2f, 0x1f, 0xfe, 0xfd, 0x0f, 0x00,
+ 0x00, 0xde, 0x00, 0x0d,
+ 0xfa, 0xcf, 0xdf, 0xcf, 0x2c, 0x70, 0x10, 0x1d, 0x30, 0x20, 0x40, 0x0d,
+ 0x1d, 0x3e, 0x1d, 0x0d,
+ 0x0f, 0xdf, 0xdc, 0x08, 0xfd, 0xcd, 0xf0, 0xdf, 0x98, 0xed, 0x01, 0x01,
+ 0xdf, 0x8d, 0x21, 0x33,
+ 0x1e, 0xeb, 0x03, 0xe4, 0xd0, 0xcd, 0x00, 0x75, 0x10, 0xfd, 0xe2, 0xf1,
+ 0xf2, 0x03, 0x03, 0xb0,
+ 0xef, 0xe0, 0xdf, 0xbc, 0xf0, 0xf1, 0xf0, 0xea, 0xe0, 0xc3, 0xc0, 0xcc,
+ 0xde, 0xf0, 0x02, 0x00,
+ 0x20, 0x05, 0xed, 0xcc, 0xb0, 0xe4, 0xe1, 0xdb, 0xde, 0x00, 0x00, 0x3f,
+ 0xfe, 0xbf, 0x09, 0xfe,
+ 0xfe, 0x00, 0xef, 0xcf, 0xbb, 0xce, 0xde, 0xdd, 0xdd, 0xdc, 0xbc, 0xfb,
+ 0xff, 0x0e, 0x1e, 0xdd,
+ 0xfa, 0x5f, 0x3d, 0x1e, 0xff, 0x00, 0xcf, 0x0f, 0xdb, 0xdf, 0x0f, 0xee,
+ 0xcd, 0xff, 0xdf, 0x8d,
+ 0xfe, 0xfa, 0xfe, 0x00, 0x0f, 0xe1, 0xef, 0x1e, 0x4d, 0x0a, 0xff, 0x00,
+ 0xce, 0xdf, 0x00, 0xf0,
+ 0xce, 0xdb, 0xef, 0x00, 0x02, 0xb0, 0xbf, 0xe3, 0xe7, 0xb0, 0xd2, 0xb2,
+ 0xde, 0xe1, 0x07, 0x32,
+ 0x0e, 0xa0, 0xf1, 0xe4, 0xe0, 0xf0, 0x04, 0x02, 0x03, 0x36, 0x03, 0x03,
+ 0xcf, 0xe0, 0x03, 0xa4,
+ 0xb0, 0xf5, 0x03, 0xf0, 0x0f, 0x01, 0x33, 0xf2, 0xe1, 0x52, 0x73, 0x11,
+ 0x11, 0x13, 0x15, 0xf3,
+ 0x15, 0x21, 0x10, 0x31, 0x00, 0x03, 0xbd, 0x0c, 0x21, 0x43, 0x31, 0x1b,
+ 0x1c, 0x20, 0x62, 0x1e,
+ 0x3c, 0x0e, 0x00, 0x55, 0x1f, 0x1e, 0x50, 0x2f, 0x09, 0x10, 0x2f, 0x0f,
+ 0x2f, 0x2e, 0x3e, 0x5e,
+ 0x10, 0x12, 0x1d, 0x1c, 0x20, 0x32, 0x3e, 0x51, 0x16, 0xfd, 0xfc, 0x21,
+ 0x73, 0x34, 0x14, 0x23,
+ 0x00, 0x03, 0x17, 0x03, 0xf3, 0x12, 0x22, 0x20, 0x40, 0x15, 0xa0, 0xe1,
+ 0x0e, 0xfc, 0x1f, 0x01,
+ 0x03, 0x21, 0x41, 0x14, 0x01, 0xd3, 0x07, 0x13, 0x82, 0xb2, 0xf1, 0xd2,
+ 0xf4, 0x03, 0x02, 0x17,
+ 0x21, 0xd0, 0x20, 0x73, 0x02, 0x00, 0x01, 0x45, 0x00, 0x41, 0x20, 0x0f,
+ 0x12, 0x04, 0x01, 0xc0,
+ 0xfe, 0xfe, 0x00, 0x00, 0x2c, 0x18, 0x6f, 0x4f, 0x5e, 0x20, 0x1f, 0x30,
+ 0x2e, 0x5f, 0x4f, 0x2f,
+ 0x39, 0x1e, 0x00, 0x30, 0x20, 0x20, 0x00, 0x0d, 0x3f, 0x1a, 0xdf, 0xc0,
+ 0x00, 0xf1, 0x3e, 0x18,
+ 0xff, 0x40, 0xf0, 0xef, 0x7d, 0x7f, 0x3c, 0x1f, 0x10, 0x01, 0x12, 0x00,
+ 0x15, 0x02, 0xe1, 0xf0,
+ 0x10, 0x40, 0x00, 0xe0, 0xbf, 0xe1, 0xb6, 0xcf, 0xef, 0x00, 0xf1, 0x05,
+ 0x33, 0xf2, 0xb4, 0x06,
+ 0x03, 0x00, 0xe3, 0xf3, 0xa0, 0xd0, 0xe5, 0xc3, 0xf1, 0xd3, 0xf0, 0xb0,
+ 0xec, 0x12, 0x03, 0x00,
+ 0xbd, 0x02, 0x17, 0x01, 0xee, 0xee, 0x01, 0xd5, 0xe1, 0xc0, 0xe1, 0xe0,
+ 0xcf, 0xfd, 0xf2, 0xd0,
+ 0xbf, 0xfe, 0xdf, 0xf1, 0x22, 0x0e, 0x0e, 0x1b, 0xfd, 0x40, 0x2b, 0x10,
+ 0x40, 0xe9, 0xdc, 0x1e,
+ 0x7f, 0x0f, 0xca, 0x2f, 0x70, 0x0d, 0x0d, 0x21, 0x03, 0xfd, 0xe8, 0x1f,
+ 0x40, 0x2e, 0x7f, 0x2f,
+ 0x00, 0x1e, 0x10, 0xff, 0xfe, 0xe0, 0xe2, 0xf3, 0xf0, 0xbc, 0xf2, 0x02,
+ 0xfe, 0xe9, 0xcd, 0xb0,
+ 0xee, 0xca, 0xfe, 0x0e, 0x10, 0x20, 0x02, 0x02, 0xfe, 0xdd, 0x12, 0x36,
+ 0xcf, 0xad, 0xf1, 0xc3,
+ 0xbf, 0xef, 0xd1, 0xf1, 0xef, 0xed, 0xf5, 0x27, 0xd1, 0xc0, 0x20, 0x66,
+ 0x10, 0x01, 0x02, 0xe4,
+ 0xf1, 0xd0, 0xef, 0xd2, 0xb2, 0xf0, 0xe0, 0xff, 0xcd, 0xde, 0xb1, 0x0d,
+ 0xf9, 0x20, 0x0f, 0x21,
+ 0x12, 0x1d, 0x4b, 0x70, 0x32, 0x11, 0x0f, 0x00, 0x00, 0xfd, 0x1c, 0x0b,
+ 0x0e, 0x20, 0x41, 0x2c,
+ 0x0b, 0x01, 0x34, 0xbf, 0xef, 0xf0, 0x2d, 0x1b, 0x4e, 0x7e, 0x3e, 0x0b,
+ 0xee, 0x00, 0x1f, 0x30,
+ 0x30, 0x2d, 0x10, 0x51, 0x12, 0x0c, 0x08, 0x00, 0xe0, 0xcf, 0xdd, 0x0d,
+ 0x1e, 0x0b, 0x5e, 0x20,
+ 0xf0, 0x36, 0x30, 0x0e, 0x0e, 0x71, 0xf1, 0xa0, 0xef, 0xf0, 0xf0, 0xec,
+ 0xff, 0xe0, 0xab, 0xd0,
+ 0x00, 0xd0, 0x00, 0x70, 0x1f, 0x0d, 0x02, 0x01, 0x1f, 0x0e, 0x34, 0x00,
+ 0xcd, 0xff, 0xf0, 0xf6,
+ 0x0f, 0xfd, 0x00, 0x27, 0x33, 0x9e, 0x02, 0x57, 0x22, 0x1f, 0x2f, 0x43,
+ 0x02, 0x1e, 0x50, 0x53,
+ 0x0f, 0x19, 0x00, 0x10, 0x10, 0x0c, 0x30, 0x31, 0x32, 0x22, 0xe0, 0xcb,
+ 0x10, 0x32, 0x01, 0x21,
+ 0x21, 0x4d, 0x6d, 0x20, 0x10, 0x00, 0x0a, 0x50, 0x30, 0x57, 0x16, 0x40,
+ 0x30, 0x13, 0x10, 0x14,
+ 0xf0, 0xf1, 0xf2, 0xf0, 0xa0, 0xdf, 0xcf, 0xe0, 0x04, 0x03, 0x04, 0x00,
+ 0x2e, 0x0e, 0xf1, 0x07,
+ 0x34, 0xd0, 0x12, 0x50, 0x0e, 0xcf, 0xe3, 0xb3, 0xd2, 0xbf, 0xf0, 0x01,
+ 0x06, 0x03, 0xd3, 0xc1,
+ 0xff, 0xfe, 0x1f, 0x32, 0x06, 0x8e, 0xdf, 0x0e, 0xfc, 0xee, 0x0e, 0xde,
+ 0xf0, 0xd0, 0xfc, 0x0d,
+ 0xfe, 0xdc, 0xbb, 0xde, 0x11, 0x21, 0x0a, 0x1e, 0xce, 0xaf, 0xff, 0xdf,
+ 0x00, 0x00, 0x3a, 0x7f,
+ 0x6f, 0x01, 0x02, 0xef, 0x0e, 0x02, 0x1e, 0x0e, 0x15, 0x00, 0x0c, 0x2e,
+ 0x6d, 0x0d, 0x0d, 0xda,
+ 0xfe, 0xfd, 0x0d, 0x1c, 0x60, 0x20, 0x12, 0x02, 0x17, 0x22, 0x02, 0x10,
+ 0x00, 0xe0, 0x82, 0xc0,
+ 0xf2, 0xe4, 0x03, 0x13, 0x21, 0x03, 0xe7, 0x05, 0x12, 0x42, 0x21, 0x33,
+ 0x04, 0xa2, 0xe3, 0xd1,
+ 0xf3, 0xe4, 0xd5, 0xd2, 0xe2, 0xe3, 0x01, 0x13, 0x43, 0x63, 0x13, 0x04,
+ 0x07, 0x32, 0x52, 0x10,
+ 0x0f, 0x01, 0x00, 0x12, 0x45, 0x01, 0x12, 0x53, 0xe0, 0x9d, 0xf2, 0xf7,
+ 0x00, 0x0e, 0x30, 0x4f,
+ 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x2d, 0x3d, 0x6c, 0x2e, 0x3d, 0x3f, 0x4b,
+ 0x3f, 0x4c, 0x3e, 0x3f,
+ 0x0b, 0x30, 0x31, 0x30, 0x0b, 0xfd, 0x1e, 0x6c, 0x1e, 0x0d, 0xfc, 0x0f,
+ 0x1c, 0x4e, 0x73, 0x47,
+ 0x33, 0x10, 0x2e, 0x20, 0x33, 0x13, 0x00, 0xee, 0xb0, 0xfc, 0x0e, 0xcc,
+ 0xee, 0x00, 0xee, 0xee,
+ 0x12, 0x71, 0x0f, 0x2c, 0xfe, 0xdd, 0x07, 0x07, 0xe0, 0xdf, 0xb0, 0xd2,
+ 0xb1, 0xe2, 0xd0, 0xc0,
+ 0xf1, 0x02, 0x55, 0x02, 0xf3, 0x02, 0x11, 0x01, 0x03, 0xe4, 0xc3, 0xf3,
+ 0xf3, 0xf0, 0xdc, 0xdf,
+ 0xb0, 0xc0, 0xde, 0xdc, 0x12, 0x1c, 0x2a, 0x30, 0x2f, 0x0b, 0x4f, 0x4f,
+ 0x10, 0x0b, 0xec, 0x70,
+ 0x2f, 0x2f, 0x40, 0x3d, 0x2c, 0x10, 0x30, 0xe0, 0xf3, 0x0e, 0xe8, 0x2e,
+ 0x4f, 0xf0, 0xee, 0x30,
+ 0x0d, 0xfb, 0x0d, 0x7c, 0x0e, 0xdf, 0x2c, 0x7e, 0x6e, 0x2f, 0x40, 0x33,
+ 0x0f, 0x0a, 0xdf, 0x1f,
+ 0x00, 0x1f, 0x0e, 0x9d, 0xeb, 0xfe, 0xd0, 0x0f, 0xef, 0xff, 0xf0, 0x12,
+ 0x40, 0x11, 0x2f, 0xd0,
+ 0x07, 0x24, 0xd0, 0xb3, 0xe0, 0x80, 0xd0, 0xd3, 0xc0, 0xcd, 0x00, 0x00,
+ 0x02, 0x11, 0xe7, 0xf7,
+ 0xf0, 0xf0, 0x00, 0xe0, 0x02, 0xf2, 0xc0, 0xe0, 0xf2, 0xf3, 0x9e, 0xd2,
+ 0xe7, 0xe5, 0xef, 0x00,
+ 0x21, 0xf3, 0xd3, 0xc2, 0xd0, 0xb2, 0xd2, 0xf0, 0xe2, 0xcf, 0xfd, 0x00,
+ 0x52, 0x2f, 0x2a, 0x10,
+ 0x00, 0xbf, 0x0e, 0x25, 0x34, 0x1f, 0x0e, 0x70, 0x21, 0x2e, 0x1a, 0x40,
+ 0x30, 0x0f, 0x0d, 0x2b,
+ 0x2f, 0x3e, 0x6f, 0x2f, 0x54, 0x23, 0x11, 0x13, 0x33, 0x1e, 0x0e, 0x02,
+ 0xf3, 0x0e, 0x2b, 0x20,
+ 0x0f, 0x0a, 0x0f, 0x70, 0x4e, 0x1d, 0x10, 0x10, 0x00, 0x47, 0x13, 0x2d,
+ 0x0c, 0x00, 0x03, 0xbe,
+ 0xdc, 0xc1, 0xe6, 0xe2, 0x04, 0x01, 0x31, 0x34, 0x13, 0x27, 0x01, 0xd1,
+ 0x12, 0x73, 0x73, 0x03,
+ 0x12, 0xf1, 0xd0, 0xd4, 0xc5, 0xd1, 0xd1, 0xe1, 0x12, 0x31, 0x00, 0x14,
+ 0xc5, 0xe1, 0xd0, 0xd0,
+ 0x11, 0x00, 0x90, 0xf0, 0x26, 0x41, 0x1f, 0x60, 0x20, 0x1f, 0xff, 0x01,
+ 0x15, 0x50, 0x03, 0x13,
+ 0x12, 0x13, 0x04, 0x13, 0x1e, 0xd9, 0xe0, 0xdf, 0xfe, 0xff, 0x2c, 0x7e,
+ 0x5e, 0x1b, 0x10, 0x40,
+ 0x20, 0x40, 0x2a, 0x7f, 0x10, 0x1f, 0x00, 0xf0, 0x0f, 0x1c, 0x1e, 0x1e,
+ 0x0c, 0xcd, 0x0f, 0x1e,
+ 0x4b, 0x4d, 0x3f, 0x20, 0x0c, 0x0e, 0x10, 0xfc, 0xcd, 0xfe, 0xec, 0x0d,
+ 0xee, 0xdf, 0xbd, 0xf9,
+ 0x0e, 0xfe, 0x8f, 0xee, 0xcd, 0xfd, 0x0a, 0x3f, 0x3e, 0x00, 0xdf, 0xcf,
+ 0xee, 0xee, 0x0d, 0xd0,
+ 0xfe, 0x00, 0xe3, 0x80, 0xf1, 0x03, 0x10, 0x1e, 0xe7, 0xb7, 0xd0, 0xec,
+ 0xe0, 0x22, 0x10, 0x1e,
+ 0x3d, 0x2e, 0x3b, 0xfd, 0xed, 0x2f, 0x5e, 0xee, 0xb0, 0xf2, 0x03, 0x2d,
+ 0xfe, 0x93, 0xc0, 0xc8,
+ 0x0f, 0x00, 0x0c, 0x28, 0x0f, 0xff, 0x1e, 0x4f, 0x30, 0x20, 0x40, 0x30,
+ 0x32, 0x22, 0x0f, 0x0f,
+ 0x36, 0xe2, 0x8f, 0xfe, 0xe0, 0xc0, 0xc0, 0xd2, 0xef, 0xa8, 0xfc, 0x00,
+ 0x52, 0x10, 0x0b, 0xef,
+ 0x00, 0x0e, 0xfd, 0xe0, 0x03, 0xf1, 0xfe, 0x0e, 0x00, 0xbd, 0xbc, 0xd0,
+ 0xd3, 0xe0, 0xde, 0x00,
+ 0xec, 0xdc, 0xf0, 0xd3, 0xb0, 0xf9, 0x0f, 0x2d, 0x0a, 0xbe, 0xde, 0xee,
+ 0xf0, 0x00, 0x0f, 0x0d,
+ 0x8e, 0xba, 0xee, 0xe0, 0xfd, 0xcc, 0xff, 0xf0, 0xee, 0xfd, 0xf9, 0x1f,
+ 0x0d, 0x0e, 0xcf, 0xf0,
+ 0x00, 0xe0, 0x02, 0x20, 0x32, 0xe2, 0x91, 0xe3, 0xed, 0xda, 0xfd, 0xca,
+ 0xbd, 0xde, 0xfd, 0xf9,
+ 0xfd, 0x1e, 0x3f, 0x0d, 0x00, 0xe3, 0xcf, 0xfc, 0x0f, 0x22, 0x12, 0xa0,
+ 0xe0, 0xe3, 0xff, 0xea,
+ 0xc0, 0xe3, 0xd4, 0xdf, 0xff, 0x63, 0x34, 0x00, 0xd2, 0xb4, 0xd3, 0xd0,
+ 0xf2, 0x23, 0x54, 0x24,
+ 0xf3, 0xb4, 0x03, 0x04, 0xe4, 0xc1, 0xd3, 0x01, 0x02, 0x13, 0x14, 0x12,
+ 0x53, 0x24, 0x55, 0x14,
+ 0x34, 0x01, 0x30, 0x31, 0x53, 0x34, 0x22, 0x41, 0x22, 0x00, 0xe2, 0xb0,
+ 0xf4, 0xd5, 0xe2, 0xe1,
+ 0x02, 0x00, 0x0f, 0x7e, 0x52, 0x26, 0x1f, 0x0e, 0x40, 0x33, 0x1d, 0x2a,
+ 0x61, 0x23, 0x11, 0x25,
+ 0x00, 0x20, 0x00, 0x20, 0x0f, 0x00, 0x0e, 0xff, 0x0b, 0x50, 0x52, 0x30,
+ 0x20, 0x27, 0x12, 0x03,
+ 0x11, 0x62, 0x24, 0x32, 0x10, 0x22, 0x46, 0x01, 0xf3, 0x00, 0x00, 0x01,
+ 0x3e, 0x2d, 0x51, 0x55,
+ 0x00, 0xdf, 0x02, 0xe7, 0x00, 0x0f, 0x61, 0x22, 0x10, 0x21, 0x35, 0x01,
+ 0x00, 0xd0, 0x16, 0x23,
+ 0xd0, 0xb1, 0xf1, 0x04, 0x12, 0x33, 0x33, 0x12, 0xc1, 0x04, 0x42, 0x12,
+ 0xe6, 0xd1, 0x01, 0x70,
+ 0x50, 0x32, 0x11, 0x0f, 0xfc, 0xd0, 0x20, 0x01, 0xec, 0xfd, 0x61, 0x23,
+ 0x30, 0x70, 0x2b, 0x1c,
+ 0x3d, 0x2f, 0x20, 0x2e, 0x3f, 0x1c, 0x1e, 0x0e, 0x00, 0x61, 0x17, 0x20,
+ 0x0e, 0x20, 0x4e, 0x0e,
+ 0x0e, 0x50, 0x2b, 0x6c, 0x2e, 0x1a, 0x0e, 0x0e, 0x0f, 0x3f, 0x3f, 0x4c,
+ 0x4d, 0x20, 0x3e, 0x1f,
+ 0x01, 0xe3, 0xdc, 0xfc, 0x00, 0x00, 0x0b, 0x40, 0x47, 0x02, 0xdf, 0xef,
+ 0xf1, 0x15, 0xe1, 0x81,
+ 0xe2, 0x11, 0x11, 0x35, 0xd1, 0x91, 0x02, 0x01, 0xd2, 0xd1, 0xc3, 0xd2,
+ 0xb5, 0xe3, 0xf2, 0xf1,
+ 0x01, 0xd0, 0xc0, 0xc3, 0xc4, 0x03, 0x33, 0x35, 0x02, 0xf2, 0xd3, 0x15,
+ 0x26, 0xb0, 0xde, 0xf3,
+ 0xd2, 0x81, 0xe3, 0xd3, 0xe0, 0xf1, 0xdf, 0xc0, 0xe5, 0xc2, 0xef, 0xe9,
+ 0x0f, 0xfd, 0xef, 0xde,
+ 0x0a, 0x5f, 0x20, 0x11, 0x14, 0x00, 0xfe, 0xfe, 0x30, 0x71, 0x71, 0x0d,
+ 0x18, 0x00, 0x1f, 0xff,
+ 0xde, 0x0d, 0x20, 0x1e, 0xfa, 0x10, 0x70, 0x12, 0x0f, 0x0d, 0x0f, 0x1e,
+ 0x10, 0x35, 0x01, 0x0b,
+ 0x0e, 0x1f, 0x10, 0xe0, 0x90, 0xc0, 0xdd, 0xe0, 0xfe, 0xa8, 0xfd, 0x00,
+ 0x00, 0x00, 0x0e, 0x0e,
+ 0xff, 0xee, 0xcf, 0xf3, 0x04, 0x01, 0xe1, 0xf3, 0xd5, 0xc3, 0xb3, 0xd5,
+ 0xa0, 0xe1, 0xf2, 0x04,
+ 0x04, 0x34, 0x11, 0x00, 0x00, 0x11, 0x16, 0xc0, 0xae, 0xe0, 0x05, 0x01,
+ 0x61, 0x00, 0x46, 0x00,
+ 0xf0, 0xd8, 0x63, 0x30, 0xd6, 0xda, 0xd1, 0x30, 0xc1, 0xe6, 0xad, 0x0c,
+ 0x00, 0x04, 0x11, 0xfd,
+ 0xec, 0xdd, 0xcc, 0xf1, 0xd1, 0x33, 0x74, 0x6f, 0x0f, 0x01, 0x07, 0x02,
+ 0xe2, 0x00, 0x3e, 0x40,
+ 0x10, 0xeb, 0xd0, 0xf0, 0x0e, 0xea, 0xe0, 0x10, 0x02, 0xe0, 0x4d, 0x71,
+ 0x51, 0x00, 0x00, 0x10,
+ 0x02, 0xf0, 0x20, 0x5f, 0x14, 0x23, 0x00, 0xf4, 0x05, 0x40, 0xfc, 0xee,
+ 0xf0, 0x04, 0x02, 0xd1,
+ 0xe2, 0x73, 0x38, 0x0d, 0x0f, 0x00, 0xe2, 0xd1, 0xef, 0x1f, 0x22, 0xe6,
+ 0xb2, 0xf0, 0x0e, 0xef,
+ 0x00, 0xe1, 0xb0, 0x9c, 0xef, 0x00, 0x27, 0x01, 0x10, 0x20, 0x40, 0x20,
+ 0x14, 0x35, 0xe1, 0xc0,
+ 0x0c, 0x00, 0xf3, 0xe4, 0x11, 0x3f, 0x7b, 0x4f, 0x1e, 0x10, 0xfd, 0xee,
+ 0x20, 0x71, 0x1d, 0x1e,
+ 0x11, 0x0f, 0xff, 0x05, 0x05, 0x01, 0x10, 0x70, 0x5f, 0x00, 0x22, 0x00,
+ 0xfd, 0x00, 0x14, 0x1b,
+ 0x0c, 0x11, 0x52, 0x4b, 0x3d, 0x20, 0x22, 0x57, 0x13, 0x0f, 0x10, 0x22,
+ 0x20, 0x0f, 0x31, 0x14,
+ 0x00, 0xee, 0x0d, 0xfa, 0x90, 0x00, 0xee, 0xfd, 0x00, 0x10, 0x70, 0x6f,
+ 0x0e, 0xf0, 0xff, 0xfd,
+ 0x06, 0x22, 0xf2, 0xe0, 0xdc, 0xc2, 0xe5, 0xf2, 0xb0, 0xee, 0xdc, 0xe0,
+ 0xc0, 0xda, 0xf0, 0xf0,
+ 0x00, 0x02, 0x24, 0x53, 0x2f, 0x3b, 0x1f, 0xfe, 0xd2, 0xc5, 0xcd, 0xcc,
+ 0xd0, 0x0e, 0xd0, 0xef,
+ 0xa0, 0xe3, 0xd2, 0xef, 0xdd, 0xd0, 0x02, 0xf3, 0xe1, 0xd5, 0x03, 0xf6,
+ 0x91, 0xf0, 0xe5, 0x24,
+ 0x61, 0x0f, 0x2f, 0x21, 0x00, 0x01, 0xcf, 0xed, 0xfc, 0xa8, 0xed, 0xd0,
+ 0x02, 0x0f, 0xef, 0x10,
+ 0x60, 0x0f, 0x32, 0xf7, 0xe0, 0x12, 0x21, 0x31, 0x22, 0x00, 0xf4, 0x00,
+ 0xed, 0xbe, 0xd6, 0xe3,
+ 0xb2, 0xee, 0xdf, 0x00, 0x70, 0x31, 0x01, 0xf1, 0xf0, 0xf8, 0xef, 0x00,
+ 0xce, 0xc0, 0xe0, 0xd0,
+ 0xe0, 0xa1, 0xdc, 0xfa, 0xff, 0x00, 0xe1, 0x00, 0xd0, 0x01, 0x33, 0x70,
+ 0x49, 0x1e, 0x20, 0x03,
+ 0x0e, 0x0d, 0xf0, 0xe0, 0xe0, 0xfb, 0x10, 0x64, 0x00, 0x02, 0xb2, 0xdb,
+ 0xed, 0xc0, 0x11, 0x45,
+ 0x4f, 0x19, 0x0f, 0x0f, 0x00, 0x2f, 0x00, 0x60, 0x30, 0x20, 0x20, 0x22,
+ 0x53, 0x22, 0x22, 0x54,
+ 0x00, 0xe0, 0x00, 0x07, 0x00, 0x00, 0xf1, 0x20, 0x12, 0x32, 0x20, 0x53,
+ 0x24, 0x12, 0x3f, 0x5d,
+ 0x54, 0x30, 0x3c, 0x11, 0x07, 0xf0, 0xdd, 0xf0, 0xe0, 0xe0, 0xcf, 0xd0,
+ 0x00, 0xfa, 0x40, 0x63,
+ 0x05, 0xf0, 0xe9, 0xf0, 0x0f, 0x00, 0xf1, 0xe2, 0xd1, 0xe0, 0x21, 0x20,
+ 0xdd, 0xa2, 0xd6, 0xb1,
+ 0xa0, 0xd0, 0xe0, 0xf0, 0xdf, 0xdf, 0xc0, 0xf0, 0xe3, 0xfe, 0xc8, 0xdc,
+ 0xcd, 0xfe, 0x01, 0x42,
+ 0x0c, 0x1c, 0x20, 0x14, 0xf3, 0xcf, 0xfd, 0x2d, 0x71, 0x74, 0xf1, 0xf0,
+ 0xfd, 0x0d, 0xf0, 0x00,
+ 0x0e, 0x0d, 0xf0, 0x00, 0x60, 0x21, 0x26, 0x37, 0x14, 0x0e, 0x0e, 0x02,
+ 0x32, 0x31, 0x32, 0x0e,
+ 0x0b, 0x0e, 0x05, 0x62, 0x0d, 0xeb, 0x0f, 0x00, 0x11, 0x51, 0x64, 0x31,
+ 0x30, 0x0e, 0x12, 0x02,
+ 0xd0, 0x05, 0x03, 0xe3, 0x0f, 0xb0, 0xf1, 0xc2, 0x00, 0x07, 0x41, 0x1f,
+ 0xde, 0xcf, 0xd0, 0xf1,
+ 0xe2, 0xe2, 0xba, 0xed, 0x00, 0xf0, 0xe0, 0xce, 0x9c, 0xcd, 0xdd, 0xff,
+ 0xd4, 0x04, 0xd0, 0x0e,
+ 0x00, 0xdc, 0xa1, 0xf4, 0xf0, 0x0f, 0x1d, 0x10, 0x15, 0xf1, 0xb0, 0xea,
+ 0xe0, 0x00, 0xe2, 0xd4,
+ 0xb0, 0xf0, 0xef, 0xdc, 0xce, 0xb0, 0xef, 0xdc, 0xeb, 0xde, 0xde, 0xd1,
+ 0x33, 0x7f, 0x2a, 0x30,
+ 0x22, 0x34, 0x10, 0x10, 0x20, 0x2e, 0x2f, 0x41, 0x15, 0x01, 0x20, 0x2f,
+ 0x3c, 0x3f, 0x2d, 0x20,
+ 0x32, 0x50, 0x7f, 0x70, 0x46, 0x27, 0x20, 0x01, 0x1f, 0x31, 0x11, 0x31,
+ 0x10, 0x00, 0x02, 0xf1,
+ 0xfe, 0x1e, 0x1d, 0x3b, 0x2f, 0x3e, 0x1f, 0x21, 0x64, 0x20, 0x20, 0x62,
+ 0x27, 0x23, 0x11, 0x12,
+ 0x0d, 0xdf, 0xd4, 0xc0, 0xcf, 0xeb, 0x24, 0x54, 0x01, 0xdf, 0xe0, 0xe1,
+ 0xff, 0xff, 0x00, 0x31,
+ 0x18, 0x0e, 0xde, 0xcf, 0xf0, 0x14, 0xd0, 0x9e, 0xfc, 0xe0, 0xf2, 0xb1,
+ 0xee, 0xfe, 0x10, 0x40,
+ 0xf3, 0xc0, 0xb8, 0xfc, 0xfe, 0xfe, 0x30, 0x74, 0x30, 0x20, 0x4f, 0x30,
+ 0x23, 0x13, 0x26, 0x11,
+ 0x51, 0x3f, 0x0c, 0x2f, 0x32, 0x10, 0xd8, 0xdf, 0x0f, 0x70, 0x10, 0x2e,
+ 0x40, 0x31, 0x40, 0x50,
+ 0x31, 0x25, 0x40, 0x30, 0x11, 0x23, 0x21, 0x10, 0x20, 0x1f, 0x20, 0x11,
+ 0x23, 0x00, 0x1e, 0x61,
+ 0x07, 0x04, 0x11, 0x4f, 0x7f, 0x20, 0x23, 0x22, 0x12, 0x19, 0x0d, 0xf0,
+ 0x04, 0xef, 0xdc, 0xf0,
+ 0xe0, 0xbf, 0xc0, 0x07, 0xc5, 0xdf, 0xdf, 0xf1, 0xe1, 0x02, 0x02, 0xf0,
+ 0x0f, 0x0f, 0x9c, 0xe0,
+ 0xf4, 0xdf, 0xdc, 0x12, 0x77, 0x02, 0x0f, 0xed, 0x00, 0xdf, 0xef, 0xcf,
+ 0xbd, 0xbc, 0xff, 0xe0,
+ 0x0f, 0xfd, 0xdb, 0x11, 0x22, 0x00, 0x00, 0x03, 0x03, 0x42, 0x43, 0x35,
+ 0x4e, 0xf8, 0x0e, 0xf1,
+ 0xf0, 0x00, 0x1d, 0x70, 0x23, 0x01, 0x01, 0x12, 0x61, 0x23, 0x32, 0x30,
+ 0x1a, 0x0e, 0xf0, 0xf2,
+ 0xe0, 0xe4, 0x73, 0x5a, 0x2f, 0x12, 0xe1, 0xed, 0x0e, 0xe0, 0x05, 0x01,
+ 0x00, 0x02, 0x71, 0x10,
+ 0x1c, 0xe0, 0xd2, 0xb2, 0x0d, 0xfc, 0xdd, 0xb8, 0xf0, 0xc0, 0xc2, 0xe0,
+ 0xe2, 0xf7, 0xe3, 0xd0,
+ 0xe0, 0xef, 0x00, 0x00, 0xf5, 0x02, 0x9a, 0xed, 0xf0, 0xef, 0xe0, 0xc0,
+ 0xcd, 0xdf, 0xf0, 0x05,
+ 0x02, 0xbf, 0xbe, 0xe1, 0xd4, 0xc2, 0xd0, 0xce, 0x0f, 0xec, 0xdf, 0xff,
+ 0xe3, 0xd2, 0xef, 0xd0,
+ 0xe0, 0xd0, 0xd7, 0xc7, 0x00, 0xff, 0x0e, 0x0f, 0x00, 0x81, 0xe0, 0xee,
+ 0xeb, 0xcf, 0xed, 0xc0,
+ 0xd0, 0xef, 0x0c, 0x50, 0x32, 0xf0, 0xd0, 0x05, 0xf5, 0x11, 0x30, 0x02,
+ 0x22, 0x51, 0x02, 0x24,
+ 0x12, 0xe0, 0xda, 0x9f, 0xf0, 0x02, 0xf2, 0x00, 0x03, 0xd0, 0x10, 0x0f,
+ 0xe1, 0x91, 0xed, 0xe8,
+ 0x0f, 0xdc, 0xdf, 0xe1, 0xf5, 0xd0, 0x9d, 0x11, 0x26, 0xf0, 0xdf, 0xe1,
+ 0x13, 0x70, 0x40, 0x1d,
+ 0x0e, 0xce, 0xee, 0xf0, 0xf0, 0x0e, 0xf5, 0xf2, 0x2c, 0x7e, 0x23, 0x06,
+ 0x01, 0xf0, 0x0e, 0x2f,
+ 0x2e, 0xed, 0xbe, 0x0a, 0x1d, 0x4c, 0x1f, 0x0c, 0xee, 0x1e, 0x20, 0x50,
+ 0x52, 0x27, 0x24, 0x11,
+ 0x40, 0x4e, 0x31, 0x42, 0x00, 0xf2, 0xf0, 0x0c, 0x00, 0x44, 0x44, 0x3d,
+ 0x5b, 0x21, 0x10, 0x32,
+ 0x51, 0x21, 0x20, 0x2e, 0x50, 0x20, 0x34, 0x10, 0x1e, 0x3c, 0x0d, 0x1e,
+ 0x01, 0x37, 0x00, 0x2d,
+ 0x3f, 0x7f, 0x52, 0x15, 0x30, 0x2f, 0x1e, 0x10, 0x43, 0x32, 0x20, 0x33,
+ 0x10, 0x4e, 0x06, 0xf3,
+ 0xbf, 0xe0, 0xc6, 0xf4, 0xf1, 0xe0, 0x0d, 0x0d, 0x2e, 0x00, 0xe2, 0xd3,
+ 0xd8, 0xed, 0x2d, 0x2f,
+ 0x7f, 0x51, 0x20, 0x21, 0x34, 0x51, 0x02, 0x0b, 0xff, 0x02, 0x01, 0x0f,
+ 0xfe, 0xeb, 0xfb, 0xef,
+ 0x0e, 0xde, 0xee, 0x50, 0x71, 0x11, 0x00, 0x27, 0x36, 0x51, 0x20, 0x40,
+ 0x31, 0xf0, 0xe0, 0xfe,
+ 0xef, 0xff, 0x20, 0x70, 0x1f, 0x3e, 0x0e, 0x1e, 0x4d, 0x1e, 0x13, 0x26,
+ 0x41, 0x30, 0x71, 0x11,
+ 0x12, 0x26, 0x14, 0x23, 0x02, 0x00, 0x10, 0x43, 0x21, 0x1d, 0xfb, 0x05,
+ 0x37, 0x61, 0x00, 0x0c,
+ 0x1f, 0x20, 0x10, 0x11, 0x10, 0x0d, 0xd0, 0xe0, 0xbf, 0xcf, 0xbf, 0xd2,
+ 0xc0, 0xf1, 0xf5, 0xe0,
+ 0xfe, 0xe1, 0x03, 0x00, 0x20, 0x34, 0xbc, 0xba, 0x00, 0x1f, 0x10, 0xd4,
+ 0xc6, 0xf0, 0xe0, 0xde,
+ 0xe0, 0xc0, 0xb2, 0xc0, 0xcd, 0xcd, 0xe0, 0xe9, 0xed, 0xed, 0xc0, 0xed,
+ 0xff, 0xfe, 0xef, 0xe0,
+ 0xe3, 0x04, 0x10, 0x51, 0x25, 0x00, 0x9e, 0x0e, 0xe1, 0x0e, 0xc0, 0xe0,
+ 0xf0, 0x00, 0x0d, 0x20,
+ 0x21, 0xed, 0x0b, 0x04, 0x37, 0x45, 0x41, 0x2e, 0x40, 0x51, 0x11, 0x14,
+ 0xf1, 0x00, 0x00, 0x0d,
+ 0x04, 0x42, 0xf0, 0xfd, 0xfd, 0x1b, 0x1f, 0x01, 0xf6, 0x13, 0xff, 0xbf,
+ 0x20, 0x71, 0x22, 0x23,
+ 0x43, 0x0d, 0xa9, 0xf2, 0xe7, 0xe1, 0xff, 0xfe, 0xf3, 0xf6, 0xf0, 0xa0,
+ 0xed, 0xcf, 0xe0, 0xd1,
+ 0xd2, 0xe0, 0xfd, 0x00, 0x0e, 0xfd, 0xcf, 0x05, 0xe4, 0xef, 0x00, 0xef,
+ 0x9e, 0xc0, 0xc1, 0xe3,
+ 0xcf, 0xfc, 0xfc, 0xec, 0xdd, 0xcc, 0xee, 0xcf, 0xe0, 0x27, 0x74, 0x1f,
+ 0x0a, 0x10, 0x00, 0x02,
+ 0xe1, 0xe0, 0x01, 0xed, 0xbe, 0xde, 0xff, 0xe0, 0xee, 0xde, 0x00, 0x4f,
+ 0x2a, 0x1e, 0x00, 0x01,
+ 0x14, 0x20, 0x2f, 0x2d, 0x60, 0x47, 0x12, 0xf0, 0xfe, 0x20, 0x51, 0x21,
+ 0x10, 0x22, 0x07, 0x02,
+ 0xe0, 0x3f, 0x42, 0xf0, 0x32, 0x70, 0x7a, 0x5f, 0x10, 0x03, 0x1e, 0x0a,
+ 0x0f, 0x10, 0x0e, 0xe0,
+ 0xf2, 0xe2, 0xf0, 0x03, 0xe7, 0xc5, 0xd0, 0xde, 0x01, 0xe1, 0xb1, 0xb0,
+ 0xe1, 0xf1, 0x0f, 0x0e,
+ 0x30, 0x51, 0x14, 0x20, 0x12, 0x03, 0x00, 0xf7, 0x13, 0xff, 0xbc, 0xd0,
+ 0xde, 0xe0, 0xed, 0x8f,
+ 0xdc, 0xd0, 0xdc, 0x0e, 0x1f, 0x6e, 0x0a, 0x2f, 0x14, 0x33, 0x00, 0x0f,
+ 0x00, 0x0d, 0x10, 0x54,
+ 0x14, 0x1f, 0x1b, 0x40, 0x03, 0x0f, 0xce, 0x0e, 0x3d, 0x70, 0x0d, 0x20,
+ 0x14, 0x1f, 0x29, 0x0e,
+ 0x1d, 0x02, 0x25, 0x21, 0x7f, 0x5f, 0x2f, 0x2f, 0x30, 0x02, 0x11, 0x05,
+ 0x37, 0x21, 0x10, 0x2e,
+ 0x1d, 0x4f, 0x20, 0x00, 0xef, 0xce, 0x0d, 0x00, 0x0b, 0xf0, 0x26, 0x53,
+ 0x02, 0x50, 0x1f, 0xd0,
+ 0xa1, 0x01, 0xe2, 0xd0, 0xee, 0xec, 0xdc, 0xdd, 0x0d, 0x7f, 0x20, 0xfc,
+ 0x0d, 0x02, 0x07, 0xe3,
+ 0xa2, 0xf2, 0x03, 0xf1, 0xff, 0xdb, 0xa0, 0xc2, 0xb1, 0xe1, 0xe0, 0xeb,
+ 0xfd, 0xf1, 0x07, 0x05,
+ 0xb0, 0x0e, 0xff, 0x00, 0x00, 0xd1, 0x02, 0xe0, 0x10, 0x10, 0xf9, 0xd0,
+ 0xee, 0x80, 0xef, 0xef,
+ 0xe1, 0xe1, 0x0d, 0xf9, 0x00, 0xf0, 0x01, 0x24, 0x00, 0x0d, 0xef, 0x30,
+ 0x54, 0x32, 0x71, 0x2f,
+ 0x2f, 0x53, 0x17, 0xf0, 0xf2, 0x01, 0xe0, 0xfe, 0xe0, 0x14, 0xf1, 0x8d,
+ 0xff, 0x00, 0x1f, 0x3a,
+ 0x0f, 0x30, 0x1e, 0x3c, 0x63, 0x23, 0x20, 0x4e, 0x23, 0x14, 0x13, 0xe0,
+ 0xac, 0xea, 0xf0, 0xe1,
+ 0x00, 0x20, 0x1c, 0x6e, 0x00, 0x31, 0x14, 0xf0, 0x04, 0x10, 0x60, 0x21,
+ 0x14, 0x22, 0x00, 0xfb,
+ 0xff, 0x00, 0xe0, 0xca, 0xda, 0xfe, 0x10, 0x0f, 0x60, 0x40, 0x00, 0x10,
+ 0x10, 0x10, 0x01, 0x05,
+ 0x11, 0xf1, 0x02, 0x62, 0x51, 0x32, 0x00, 0xe4, 0x00, 0x28, 0x30, 0x31,
+ 0x25, 0x4f, 0x4d, 0x4f,
+ 0x11, 0x01, 0xf1, 0x00, 0x1f, 0x5e, 0x40, 0x21, 0x21, 0x3e, 0x0e, 0xbd,
+ 0x0d, 0x00, 0x04, 0x0e,
+ 0x0a, 0x20, 0x75, 0x22, 0x11, 0x1f, 0x6e, 0x11, 0x11, 0x12, 0x01, 0x00,
+ 0x40, 0x10, 0x00, 0x05,
+ 0x07, 0xd1, 0x04, 0x00, 0xff, 0x80, 0xd3, 0xdf, 0xcc, 0xdd, 0x00, 0x01,
+ 0x08, 0x0d, 0x1f, 0x20,
+ 0x1e, 0x20, 0x32, 0x75, 0x20, 0x21, 0x44, 0x00, 0x0e, 0xef, 0xfd, 0xec,
+ 0xff, 0xef, 0xb0, 0xdd,
+ 0xcc, 0x0f, 0x19, 0x50, 0x00, 0x15, 0x00, 0xef, 0x00, 0x54, 0x42, 0x02,
+ 0x1f, 0x1f, 0x02, 0x14,
+ 0xe1, 0x0f, 0x1c, 0x3d, 0x21, 0x10, 0x6f, 0x0d, 0xfb, 0xdd, 0x2f, 0x10,
+ 0xe4, 0xa3, 0x03, 0x51,
+ 0x40, 0x30, 0x47, 0x21, 0x01, 0xf0, 0x0f, 0x43, 0x33, 0xf3, 0xc2, 0xe1,
+ 0x00, 0x07, 0x37, 0x01,
+ 0xfe, 0xde, 0x0f, 0xe0, 0x80, 0xcd, 0xee, 0xf0, 0x0d, 0x0d, 0xff, 0xfe,
+ 0xa0, 0xf7, 0x07, 0xd1,
+ 0xc0, 0xc0, 0xfe, 0x00, 0xe1, 0xf0, 0xde, 0xef, 0xf0, 0xdf, 0xdf, 0xe0,
+ 0x0e, 0xc0, 0x07, 0x07,
+ 0xf0, 0xb0, 0xef, 0x00, 0x80, 0xde, 0xd0, 0xdd, 0xce, 0x0e, 0x00, 0xfd,
+ 0xaa, 0xee, 0xee, 0xe0,
+ 0xc0, 0xdf, 0xfe, 0x02, 0x45, 0x10, 0x0d, 0xd2, 0x04, 0x00, 0x0e, 0x0e,
+ 0xee, 0x03, 0x45, 0x30,
+ 0x3b, 0xf0, 0x07, 0x20, 0x11, 0x30, 0x70, 0x74, 0x21, 0x2f, 0x5c, 0x2f,
+ 0x20, 0x30, 0x33, 0x20,
+ 0x3a, 0x3f, 0x40, 0x20, 0xf2, 0x03, 0x23, 0x70, 0x1f, 0x45, 0x12, 0x1d,
+ 0x0e, 0x42, 0x20, 0x3c,
+ 0x0f, 0x10, 0x10, 0x50, 0x10, 0x02, 0x02, 0xf2, 0xe6, 0xd4, 0xd4, 0x03,
+ 0x12, 0xff, 0x2e, 0x30,
+ 0xd0, 0x8a, 0xbd, 0x1f, 0x1f, 0xfa, 0xf0, 0x01, 0xf4, 0x00, 0xe0, 0x3f,
+ 0x5f, 0x0f, 0xe3, 0xd4,
+ 0xe0, 0xdd, 0x4a, 0x70, 0x5e, 0xfb, 0x0e, 0x00, 0x00, 0x11, 0x02, 0x14,
+ 0xfe, 0xcc, 0xe1, 0xf0,
+ 0xff, 0x2d, 0x4f, 0x40, 0x0e, 0xde, 0x2d, 0x74, 0x45, 0x2c, 0x0f, 0x20,
+ 0x03, 0x00, 0xdc, 0xfb,
+ 0x0f, 0x0e, 0x00, 0x41, 0x24, 0x5d, 0x6e, 0x42, 0x12, 0x1f, 0x02, 0x07,
+ 0x04, 0x01, 0x11, 0x35,
+ 0x40, 0x3d, 0x6e, 0x21, 0x13, 0x30, 0x2e, 0x2d, 0x44, 0x22, 0x5d, 0x2a,
+ 0x2c, 0x0d, 0x0f, 0x11,
+ 0x05, 0xd0, 0xc3, 0xf4, 0x01, 0xc0, 0xd3, 0xf5, 0xe0, 0xee, 0x0f, 0xe0,
+ 0x83, 0xf0, 0xdd, 0xfb,
+ 0x00, 0x32, 0x53, 0x05, 0x01, 0xf0, 0xf5, 0x02, 0xf1, 0xd0, 0xe0, 0xcd,
+ 0xfc, 0x00, 0x00, 0x90,
+ 0xcc, 0xbe, 0xfc, 0xea, 0x0e, 0x00, 0xe1, 0xf1, 0x0e, 0x0e, 0x11, 0x26,
+ 0x12, 0xff, 0xee, 0x60,
+ 0x64, 0x13, 0x0f, 0xfc, 0xe0, 0xf2, 0xd0, 0xdd, 0xba, 0xff, 0xee, 0xe0,
+ 0xf0, 0x04, 0x5f, 0x3f,
+ 0x40, 0x20, 0x1f, 0x13, 0x06, 0x10, 0x3c, 0x50, 0x00, 0xf3, 0xf1, 0x10,
+ 0x30, 0x30, 0x0f, 0x03,
+ 0xa7, 0xe0, 0xfc, 0x20, 0x53, 0x2f, 0x0e, 0x0c, 0xff, 0xd0, 0xd2, 0xc1,
+ 0x83, 0xe1, 0xe3, 0xd7,
+ 0xe4, 0xe1, 0xef, 0x1c, 0xff, 0xaf, 0xef, 0xdf, 0xec, 0xd8, 0xde, 0x00,
+ 0x11, 0xc0, 0x91, 0xf2,
+ 0xe2, 0x02, 0x00, 0x02, 0xe5, 0xc4, 0xe2, 0xb0, 0xfd, 0xd0, 0xb1, 0xe1,
+ 0xc0, 0xeb, 0xef, 0xdf,
+ 0xf0, 0xe0, 0xfc, 0xef, 0xef, 0xf4, 0xf4, 0x00, 0xdf, 0xbd, 0xe0, 0xd0,
+ 0xe2, 0xce, 0xb9, 0xdf,
+ 0xcc, 0xdf, 0xbe, 0xe0, 0xd3, 0xee, 0xdb, 0x00, 0x60, 0x11, 0x20, 0x0f,
+ 0x00, 0x01, 0x07, 0xd7,
+ 0x00, 0x00, 0xc1, 0xf0, 0xc1, 0xf3, 0xb2, 0xff, 0xec, 0xe3, 0xf6, 0xf1,
+ 0x1e, 0x2d, 0x3f, 0x61,
+ 0x11, 0x0f, 0xef, 0xfa, 0xf0, 0x41, 0x42, 0x0e, 0xef, 0x01, 0x04, 0x02,
+ 0xf1, 0xc0, 0xdf, 0xbf,
+ 0xde, 0xec, 0xf0, 0x0b, 0xf0, 0xf1, 0xf1, 0xe5, 0xd2, 0xef, 0x0f, 0x20,
+ 0x73, 0x77, 0x41, 0x00,
+ 0x1f, 0x1d, 0x1a, 0x00, 0xf3, 0x5f, 0x08, 0xbf, 0x00, 0x30, 0x0e, 0xb0,
+ 0x00, 0x12, 0x10, 0x0e,
+ 0x10, 0x50, 0x12, 0x13, 0x24, 0x30, 0x41, 0x30, 0x33, 0x23, 0x1d, 0x1c,
+ 0x27, 0x02, 0xf0, 0x0d,
+ 0x41, 0x11, 0x0d, 0x5f, 0x40, 0x32, 0x3b, 0x5b, 0x1f, 0x20, 0x1f, 0x2f,
+ 0x2f, 0x6f, 0x00, 0x15,
+ 0x11, 0x30, 0x0f, 0x60, 0x37, 0x33, 0x30, 0x3e, 0x40, 0x60, 0x13, 0x24,
+ 0x11, 0x0f, 0x2e, 0x12,
+ 0x02, 0x19, 0x1f, 0x20, 0x20, 0x06, 0x0f, 0xfd, 0x02, 0x02, 0xfe, 0xcd,
+ 0xff, 0xf0, 0x20, 0x11,
+ 0x1c, 0x2a, 0x52, 0x36, 0x5e, 0x2e, 0x30, 0x40, 0x4f, 0x20, 0x25, 0x40,
+ 0x1a, 0x1f, 0x30, 0xf1,
+ 0xef, 0xee, 0x21, 0x52, 0x0f, 0xde, 0x12, 0x20, 0x0f, 0x7e, 0x61, 0x14,
+ 0x23, 0x27, 0x52, 0x4f,
+ 0x3d, 0x3f, 0x2f, 0x02, 0x11, 0x00, 0xf0, 0x0f, 0x1e, 0x6f, 0x01, 0x01,
+ 0x15, 0x00, 0x22, 0x00,
+ 0x6c, 0x3a, 0xd7, 0xea, 0x3f, 0x3a, 0x54, 0xee, 0x4d, 0xbc, 0xf4, 0x74,
+ 0x30, 0x30, 0x04, 0x17,
+ 0x23, 0xe0, 0x2b, 0x60, 0x12, 0xc4, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0xd0,
+ 0x07, 0x02, 0x00, 0x4d,
+ 0x3f, 0xf1, 0xd1, 0xc0, 0x0e, 0xe0, 0x11, 0x5e, 0x3e, 0x10, 0xbc, 0xed,
+ 0x05, 0x04, 0x10, 0x40,
+ 0x42, 0x10, 0xfe, 0xc5, 0xf3, 0xf0, 0xc9, 0xe0, 0xfe, 0x0f, 0x3e, 0x4c,
+ 0x6f, 0x10, 0x15, 0x03,
+ 0x00, 0xf0, 0xfb, 0x00, 0x00, 0xe1, 0xd1, 0xcf, 0xde, 0x0b, 0x0e, 0x40,
+ 0x4e, 0xfb, 0xbd, 0xed,
+ 0x12, 0x3f, 0x0e, 0x70, 0x55, 0x1f, 0x1d, 0x30, 0x03, 0xf7, 0x02, 0x10,
+ 0xff, 0xef, 0xfe, 0x00,
+ 0x45, 0x01, 0x7e, 0x4f, 0xee, 0xb0, 0x00, 0x10, 0x01, 0xef, 0x04, 0x52,
+ 0x0d, 0x0b, 0xf1, 0xf6,
+ 0xf0, 0xdf, 0xf0, 0x03, 0x20, 0x04, 0xd5, 0xe3, 0xf2, 0xdd, 0xde, 0x01,
+ 0x54, 0xf4, 0xae, 0xfa,
+ 0x0f, 0x10, 0x31, 0x05, 0x00, 0xf2, 0xd0, 0xf2, 0xf1, 0x51, 0x00, 0x80,
+ 0xd1, 0xf0, 0x08, 0xff,
+ 0xef, 0x01, 0xd0, 0xff, 0x1d, 0x50, 0x30, 0x63, 0x31, 0x30, 0x20, 0x2d,
+ 0x23, 0x07, 0xe0, 0xc0,
+ 0x10, 0xf1, 0x90, 0x0b, 0x1e, 0x1f, 0xe0, 0xbf, 0xda, 0xf0, 0x00, 0x2d,
+ 0x4b, 0x40, 0x55, 0x00,
+ 0x20, 0x2f, 0x0e, 0x1f, 0x00, 0x00, 0xaf, 0x0e, 0xf0, 0xef, 0x0b, 0x2f,
+ 0x0f, 0xdd, 0xda, 0x00,
+ 0x12, 0x13, 0x1e, 0x5d, 0x20, 0x03, 0xd5, 0x02, 0x2f, 0x09, 0x10, 0x23,
+ 0x74, 0x40, 0x10, 0x1f,
+ 0x0f, 0xd0, 0xf1, 0x81, 0xfe, 0xfd, 0x02, 0x04, 0x00, 0x2b, 0x0e, 0xd0,
+ 0xf2, 0xe7, 0x02, 0xb0,
+ 0xce, 0xd0, 0xc2, 0xd1, 0x15, 0x02, 0xa0, 0xff, 0x00, 0x20, 0x32, 0x27,
+ 0x21, 0xd0, 0x0f, 0x72,
+ 0x30, 0x2f, 0xe0, 0x01, 0x14, 0x00, 0x14, 0x02, 0x01, 0xdb, 0xc0, 0xf2,
+ 0x01, 0x1f, 0xdb, 0x00,
+ 0x1f, 0xfd, 0xf9, 0xcf, 0x40, 0x70, 0x71, 0x10, 0x2f, 0x40, 0x00, 0x0f,
+ 0x01, 0x05, 0xe3, 0xd2,
+ 0xff, 0xec, 0x0b, 0x5f, 0x0e, 0x00, 0xb0, 0xe2, 0xee, 0x0e, 0x40, 0x2e,
+ 0x2c, 0x4e, 0x4e, 0x2c,
+ 0x30, 0x22, 0x00, 0xd9, 0xd1, 0xd2, 0xcf, 0x0a, 0x20, 0x41, 0xb0, 0xb0,
+ 0xf2, 0xe6, 0xe0, 0x0f,
+ 0x0e, 0x00, 0x00, 0xd0, 0xe1, 0x04, 0x03, 0x1f, 0x2e, 0xa5, 0xe3, 0xcd,
+ 0xfe, 0xc0, 0xd0, 0xf6,
+ 0x16, 0xf0, 0xdd, 0xee, 0x20, 0x60, 0x0f, 0x3e, 0x2d, 0x1f, 0x40, 0x20,
+ 0x30, 0xe4, 0xc5, 0x01,
+ 0x07, 0xf2, 0x12, 0x20, 0x00, 0x21, 0x73, 0x30, 0x0d, 0xee, 0x9b, 0xf0,
+ 0xc0, 0xb2, 0xfe, 0xfd,
+ 0x40, 0x30, 0x2c, 0x2f, 0xf3, 0xf6, 0x00, 0x1c, 0x3f, 0xe1, 0xd0, 0x2a,
+ 0x60, 0x3e, 0x40, 0x40,
+ 0x10, 0x3e, 0x1a, 0x1f, 0x7f, 0x40, 0x05, 0xa0, 0x02, 0x3f, 0x00, 0xc1,
+ 0x00, 0x3d, 0xef, 0xf3,
+ 0x03, 0x2c, 0x0f, 0xd6, 0x03, 0xf0, 0xd0, 0xe3, 0x13, 0x74, 0x10, 0x0e,
+ 0x0c, 0x21, 0x02, 0xec,
+ 0xfa, 0x2e, 0x2f, 0xf1, 0xe2, 0xe3, 0xde, 0x0e, 0xa3, 0xa7, 0xf2, 0xcf,
+ 0xbe, 0xf0, 0xe3, 0x0f,
+ 0xe0, 0xf5, 0x11, 0x50, 0x2c, 0x32, 0x31, 0x0f, 0xf2, 0x03, 0x05, 0x03,
+ 0x44, 0x30, 0x2b, 0xfc,
+ 0xf0, 0x00, 0xf0, 0xb0, 0xcc, 0xbd, 0xeb, 0xbe, 0xfe, 0xf0, 0x20, 0x50,
+ 0x28, 0x10, 0x00, 0xf0,
+ 0x24, 0x21, 0x20, 0x12, 0x42, 0xf0, 0xae, 0x0c, 0xf0, 0x01, 0xe4, 0xe2,
+ 0xf2, 0x0e, 0xfc, 0x41,
+ 0x51, 0xf0, 0xdd, 0x1d, 0xfe, 0xee, 0x08, 0x1d, 0xfe, 0x5f, 0x6f, 0x1c,
+ 0x10, 0x33, 0x27, 0x03,
+ 0x0f, 0x0f, 0x43, 0x02, 0x04, 0xc2, 0xef, 0x0e, 0x20, 0xff, 0xae, 0xea,
+ 0xdf, 0x00, 0xc2, 0xe1,
+ 0xd2, 0xf2, 0x01, 0x20, 0xc1, 0xa4, 0xf1, 0xcf, 0xee, 0x02, 0x3e, 0x18,
+ 0x01, 0x03, 0x7d, 0x3f,
+ 0x00, 0xeb, 0xee, 0x0e, 0x00, 0x33, 0x30, 0x21, 0x57, 0x13, 0x2f, 0xec,
+ 0xe0, 0x0f, 0xdf, 0x1d,
+ 0x3e, 0xe3, 0xc1, 0xdf, 0xc4, 0x50, 0x6e, 0x10, 0x17, 0x14, 0xcb, 0xcd,
+ 0x10, 0x40, 0x11, 0x00,
+ 0xef, 0xf0, 0xed, 0xeb, 0xfe, 0x02, 0xf7, 0x03, 0x6f, 0x3e, 0x10, 0x02,
+ 0x01, 0x23, 0x4c, 0x3d,
+ 0x0d, 0x31, 0x02, 0x9e, 0xcb, 0xf3, 0x17, 0x03, 0xf1, 0x0f, 0x00, 0x02,
+ 0xc4, 0xe1, 0x01, 0x12,
+ 0xfd, 0xba, 0xef, 0xef, 0x1d, 0x7f, 0x21, 0x00, 0xd0, 0x10, 0x42, 0x37,
+ 0x12, 0x40, 0x11, 0xc0,
+ 0xc1, 0xd1, 0xd1, 0xa2, 0xfe, 0xfb, 0xff, 0xed, 0x0d, 0x3e, 0x1d, 0x3f,
+ 0x4f, 0x17, 0x07, 0x20,
+ 0x2f, 0x71, 0x36, 0x00, 0x10, 0x0d, 0xe1, 0xc1, 0xd1, 0xb0, 0xfd, 0xdd,
+ 0xfd, 0x2e, 0x6d, 0xfc,
+ 0xdb, 0x0f, 0x10, 0x53, 0x1f, 0x2b, 0x41, 0x20, 0x20, 0x00, 0x02, 0x05,
+ 0xf0, 0xef, 0x0c, 0x90,
+ 0x00, 0xf3, 0x00, 0x0c, 0x53, 0x23, 0x0f, 0x0d, 0x0e, 0x2f, 0x3f, 0x10,
+ 0x36, 0x00, 0xe8, 0x00,
+ 0x2f, 0x0f, 0xb0, 0xc4, 0xe4, 0xd3, 0xe0, 0xbd, 0x01, 0xf3, 0xe3, 0x03,
+ 0xde, 0xca, 0x0d, 0x5e,
+ 0x53, 0x33, 0x1d, 0x0c, 0x04, 0x46, 0x00, 0xb0, 0xce, 0xe2, 0xe7, 0xb2,
+ 0xcf, 0xfe, 0x0f, 0xef,
+ 0xee, 0x00, 0x22, 0x00, 0xed, 0x2d, 0x3e, 0x20, 0x42, 0x60, 0x53, 0x27,
+ 0x33, 0x03, 0x02, 0x02,
+ 0xd0, 0xde, 0xef, 0xbf, 0xce, 0xec, 0xf1, 0x04, 0xfd, 0x1a, 0x20, 0x2e,
+ 0x7b, 0x2f, 0x30, 0x20,
+ 0x1e, 0x1c, 0xf0, 0xef, 0x20, 0x3d, 0x0b, 0x0c, 0xbc, 0xff, 0xff, 0xb1,
+ 0xd4, 0x02, 0x10, 0x10,
+ 0x0f, 0xee, 0xf1, 0xf3, 0xae, 0x00, 0x60, 0x08, 0x08, 0x0f, 0x30, 0x32,
+ 0x2f, 0x20, 0x32, 0x13,
+ 0x20, 0x01, 0x10, 0x02, 0xf0, 0xe1, 0xa2, 0xc1, 0xca, 0xcd, 0xfe, 0xcf,
+ 0xff, 0x10, 0x52, 0x20,
+ 0x13, 0x07, 0xf6, 0xc0, 0xf2, 0xe2, 0xf2, 0x80, 0x0d, 0xf3, 0xf0, 0x00,
+ 0x0d, 0x00, 0x01, 0x0f,
+ 0xc0, 0xe1, 0xf1, 0x47, 0x57, 0xc1, 0x30, 0x41, 0x00, 0xc1, 0x02, 0x2e,
+ 0x1b, 0xf0, 0xe1, 0x01,
+ 0xfd, 0xea, 0x00, 0xf0, 0x44, 0x31, 0x3f, 0x0e, 0x40, 0x20, 0x04, 0x0e,
+ 0x2e, 0xf0, 0xe1, 0x71,
+ 0x0f, 0x98, 0x00, 0x3f, 0xf0, 0xe0, 0x10, 0x40, 0x02, 0xd0, 0x2f, 0x40,
+ 0x00, 0xff, 0x01, 0x4c,
+ 0x4a, 0x0c, 0xdb, 0x0f, 0xff, 0x0d, 0x3d, 0x40, 0x24, 0xd1, 0xd0, 0x34,
+ 0x02, 0x00, 0x10, 0x82,
+ 0xa0, 0xf0, 0xe6, 0x03, 0xff, 0xec, 0x11, 0x15, 0x20, 0xf0, 0x21, 0x42,
+ 0xff, 0xdf, 0xff, 0x02,
+ 0x14, 0x1d, 0xe8, 0xaf, 0x00, 0x01, 0x8f, 0xef, 0xff, 0x10, 0x00, 0x12,
+ 0x0f, 0x0e, 0x36, 0x23,
+ 0x20, 0x30, 0x05, 0x02, 0x00, 0x61, 0x40, 0x12, 0x02, 0xd4, 0xe5, 0xe0,
+ 0xeb, 0xbe, 0x01, 0xd3,
+ 0x80, 0xbc, 0x02, 0x13, 0x01, 0x2f, 0x1c, 0xfd, 0xfe, 0x2e, 0x40, 0x0d,
+ 0x1d, 0x4f, 0x2f, 0x38,
+ 0x2e, 0x41, 0x27, 0x10, 0x00, 0x30, 0x00, 0xcf, 0xe0, 0x00, 0x2f, 0xef,
+ 0xce, 0x0d, 0xfe, 0x8a,
+ 0x0f, 0x3f, 0xe0, 0x85, 0x04, 0x43, 0x00, 0x0e, 0x11, 0x02, 0xf0, 0x0c,
+ 0x01, 0x01, 0x10, 0x29,
+ 0x2f, 0x71, 0x21, 0x00, 0xfe, 0xed, 0xc0, 0xf3, 0xe7, 0xe1, 0xe0, 0x01,
+ 0x02, 0x50, 0xff, 0xdf,
+ 0xbf, 0x00, 0xf7, 0x05, 0xfe, 0x0d, 0x20, 0x41, 0x15, 0x10, 0x20, 0x2e,
+ 0x40, 0x13, 0x00, 0xe0,
+ 0xd0, 0xce, 0x00, 0x06, 0xa0, 0xfd, 0xfc, 0xfe, 0xfe, 0x0e, 0x30, 0x21,
+ 0xe0, 0x0e, 0x70, 0x46,
+ 0xf0, 0x00, 0xfe, 0x01, 0x03, 0x71, 0x14, 0x07, 0xe2, 0xd1, 0x0f, 0x50,
+ 0x14, 0xc2, 0xc0, 0xdd,
+ 0xdd, 0xd0, 0xe0, 0x0d, 0x08, 0xdd, 0x2d, 0x7e, 0x4c, 0x2f, 0x20, 0x20,
+ 0x52, 0x4f, 0x34, 0x16,
+ 0x10, 0x0e, 0xe1, 0x04, 0xbf, 0xdc, 0xf1, 0x05, 0xf0, 0xe0, 0x3b, 0x60,
+ 0x00, 0xb0, 0x0e, 0x0f,
+ 0xe0, 0x00, 0x04, 0x10, 0xd1, 0xd2, 0x05, 0xe1, 0xd1, 0x02, 0x20, 0xa8,
+ 0xcf, 0xe0, 0xd0, 0xa0,
+ 0x0d, 0x00, 0x20, 0x2d, 0x2f, 0x30, 0x30, 0x22, 0x35, 0x31, 0x70, 0x20,
+ 0x10, 0x00, 0x00, 0x03,
+ 0x17, 0xc0, 0xde, 0x0c, 0x10, 0xf1, 0x82, 0xde, 0xff, 0x0b, 0x00, 0x22,
+ 0x00, 0x0d, 0x0d, 0x44,
+ 0x23, 0x2f, 0x1d, 0x4e, 0xf4, 0xe2, 0xf0, 0xe1, 0xb5, 0xa0, 0x04, 0x16,
+ 0x43, 0x10, 0x2f, 0x4e,
+ 0x20, 0x10, 0xe9, 0xdf, 0x01, 0xf2, 0x10, 0x30, 0x32, 0x11, 0xef, 0xb0,
+ 0xb0, 0xd0, 0xb5, 0xa4,
+ 0xe0, 0xe0, 0x0b, 0x2f, 0x3d, 0x50, 0x10, 0x00, 0x20, 0x00, 0x27, 0x03,
+ 0xc0, 0x0f, 0x00, 0x37,
+ 0x11, 0xe0, 0x9e, 0xef, 0xef, 0xfe, 0xf0, 0x00, 0x00, 0xdf, 0x11, 0x76,
+ 0xde, 0xee, 0x12, 0x23,
+ 0x3f, 0x1b, 0x2e, 0x30, 0x0f, 0xf2, 0x17, 0x70, 0x40, 0xdc, 0xe0, 0xf0,
+ 0xfc, 0xcc, 0xff, 0xf0,
+ 0x03, 0x01, 0xe0, 0xfa, 0x2e, 0x1f, 0xdf, 0x80, 0x0f, 0x02, 0x41, 0x3e,
+ 0x58, 0x20, 0x31, 0xe0,
+ 0xcd, 0x32, 0x34, 0x02, 0xe0, 0xe2, 0xe0, 0x30, 0x3f, 0x7e, 0x00, 0x7e,
+ 0x6f, 0xcd, 0x01, 0x43,
+ 0x0c, 0xed, 0xf4, 0x27, 0x06, 0xd1, 0xe1, 0x00, 0xf3, 0xf3, 0x00, 0x0a,
+ 0x2f, 0x70, 0x30, 0x02,
+ 0x04, 0x02, 0x01, 0x00, 0xf3, 0xd1, 0xa0, 0xf1, 0xd7, 0xd0, 0xdf, 0x10,
+ 0x0f, 0xe0, 0xfd, 0xdf,
+ 0x70, 0x1d, 0xfb, 0x00, 0x02, 0xfd, 0xda, 0x1f, 0x73, 0x03, 0x0c, 0xfe,
+ 0x11, 0x24, 0xe3, 0x07,
+ 0x52, 0x11, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x3b, 0xff, 0xf0,
+ 0x50, 0x0a, 0xff, 0x71,
+ 0x10, 0x00, 0x2f, 0x1d, 0x7f, 0x1e, 0x0b, 0xd0, 0x1e, 0x2e, 0xef, 0xbe,
+ 0xf0, 0xe1, 0xd2, 0xe1,
+ 0xdd, 0x0c, 0xd0, 0x00, 0xe0, 0xd0, 0x1b, 0x50, 0x64, 0x52, 0x2b, 0x3e,
+ 0x1f, 0x02, 0xf2, 0xf1,
+ 0xad, 0x00, 0x02, 0xf3, 0x07, 0xf3, 0x1a, 0x10, 0x41, 0x20, 0x20, 0x02,
+ 0xf0, 0xfe, 0x00, 0x40,
+ 0x0c, 0xac, 0xe5, 0xd5, 0xe1, 0xd2, 0x04, 0x02, 0xdf, 0xf0, 0x50, 0x10,
+ 0xd0, 0xd7, 0x05, 0x8f,
+ 0xdc, 0xd0, 0xc1, 0xe0, 0xf0, 0xf2, 0x11, 0x52, 0x10, 0x40, 0x31, 0x00,
+ 0x00, 0x40, 0x11, 0x11,
+ 0x37, 0x17, 0xd0, 0xcc, 0x3f, 0x11, 0x11, 0x03, 0x00, 0xe0, 0x1c, 0x4f,
+ 0x40, 0x72, 0x01, 0x0c,
+ 0x0e, 0xfe, 0x0d, 0xec, 0xe0, 0xb0, 0xe7, 0x04, 0x20, 0x7f, 0xfe, 0xff,
+ 0x20, 0x13, 0x0d, 0xcc,
+ 0x1f, 0x4d, 0x2d, 0x4c, 0x2b, 0x0d, 0xed, 0x20, 0x30, 0x02, 0xf0, 0x93,
+ 0xf4, 0xe0, 0xc2, 0xe6,
+ 0xf3, 0x00, 0xf0, 0x03, 0x30, 0x0e, 0xdf, 0x02, 0x26, 0x6f, 0x1e, 0x2f,
+ 0x13, 0x05, 0xaf, 0xf9,
+ 0x00, 0x00, 0xa0, 0xe0, 0x00, 0xd0, 0xec, 0xe1, 0x01, 0xaf, 0xdd, 0xe0,
+ 0xe1, 0xf2, 0x12, 0x0f,
+ 0x0f, 0x5f, 0x23, 0x66, 0x13, 0x15, 0x20, 0x31, 0x17, 0x22, 0xe0, 0xd3,
+ 0x07, 0x10, 0x80, 0xce,
+ 0x01, 0xd1, 0xf0, 0xcc, 0x0f, 0x0e, 0x01, 0x43, 0x3e, 0x6a, 0x1f, 0x1f,
+ 0x0e, 0x1f, 0x10, 0x20,
+ 0x2f, 0x2f, 0x25, 0x22, 0x01, 0xf0, 0xef, 0xdf, 0xc1, 0x00, 0xde, 0xab,
+ 0xea, 0x00, 0x6f, 0x1f,
+ 0x40, 0x1f, 0xef, 0xed, 0xe3, 0x06, 0x00, 0x2e, 0x20, 0x13, 0x25, 0x31,
+ 0xf3, 0x9f, 0x0b, 0x3f,
+ 0x7f, 0x10, 0x0f, 0xcf, 0x01, 0xf4, 0x02, 0xef, 0x00, 0x44, 0x10, 0x22,
+ 0x21, 0x00, 0xe0, 0x04,
+ 0xd5, 0xb0, 0xdd, 0xd0, 0xd0, 0x83, 0xe7, 0xd0, 0xfe, 0x06, 0x01, 0xe0,
+ 0x2e, 0x50, 0x21, 0x1f,
+ 0x10, 0x00, 0x2e, 0x0a, 0x12, 0x01, 0x0e, 0x0d, 0x0b, 0xce, 0xb0, 0xd0,
+ 0xc3, 0xf0, 0xf0, 0x2f,
+ 0x60, 0x70, 0x1c, 0x11, 0x27, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xc7,
+ 0xf4, 0xc0, 0xcc, 0xff,
+ 0xfe, 0xef, 0xdd, 0xeb, 0x01, 0x23, 0x7e, 0x1d, 0x3c, 0x4e, 0x2e, 0x20,
+ 0x2c, 0x0e, 0x0f, 0x02,
+ 0x57, 0x17, 0x0f, 0xde, 0x00, 0x00, 0xf1, 0xd1, 0xce, 0xdf, 0xef, 0x02,
+ 0x22, 0x6d, 0x11, 0x37,
+ 0x22, 0x2f, 0x40, 0x04, 0xe2, 0x82, 0x00, 0xdf, 0x0c, 0xf0, 0xc0, 0xf1,
+ 0xe0, 0xec, 0xae, 0x00,
+ 0xfe, 0x8f, 0xfd, 0x0f, 0x01, 0x1e, 0x08, 0x4c, 0x10, 0x00, 0x04, 0x32,
+ 0x01, 0x10, 0x50, 0x2e,
+ 0x02, 0xd1, 0xef, 0xf4, 0xe7, 0x02, 0xed, 0xdd, 0x02, 0x32, 0x50, 0x0d,
+ 0x0f, 0x37, 0x0f, 0xab,
+ 0x0e, 0x00, 0x0f, 0xe0, 0xf0, 0x60, 0x20, 0x4f, 0x22, 0x06, 0xe1, 0xf1,
+ 0xf2, 0x21, 0x43, 0x2e,
+ 0x2f, 0x13, 0xd3, 0xa0, 0xd5, 0xf0, 0x0c, 0x08, 0x1f, 0x30, 0x01, 0x80,
+ 0xe1, 0x00, 0x0e, 0x30,
+ 0xf3, 0xe5, 0xf0, 0xfd, 0xfe, 0x10, 0x01, 0x07, 0xf2, 0xb0, 0x0f, 0x2c,
+ 0x70, 0x04, 0x01, 0x41,
+ 0x11, 0x11, 0x30, 0x10, 0x17, 0xf4, 0x80, 0xdc, 0xfe, 0xe0, 0xe1, 0xd0,
+ 0xff, 0xe0, 0x00, 0x40,
+ 0x0d, 0xdf, 0x00, 0xd5, 0x53, 0x74, 0x0e, 0x1b, 0x00, 0x00, 0x1f, 0xde,
+ 0xfe, 0x00, 0x1f, 0x00,
+ 0x1e, 0xc0, 0x02, 0x57, 0x47, 0x0f, 0xed, 0x0f, 0xf0, 0xae, 0xdd, 0x0f,
+ 0x10, 0xff, 0x1d, 0x4c,
+ 0x4e, 0x7e, 0x20, 0x37, 0x02, 0x02, 0x10, 0x31, 0x44, 0x32, 0x0e, 0xcc,
+ 0xde, 0x00, 0xe5, 0xf0,
+ 0xed, 0xcd, 0xe1, 0x02, 0x4e, 0x1a, 0x30, 0x60, 0x20, 0x40, 0x32, 0x37,
+ 0x34, 0xe2, 0x90, 0xdb,
+ 0x00, 0x00, 0xe1, 0xb2, 0xd0, 0xcd, 0x01, 0x02, 0x15, 0x41, 0x02, 0xf1,
+ 0x10, 0x2d, 0x20, 0xcd,
+ 0xcf, 0xdc, 0xbf, 0x0f, 0xfd, 0x00, 0x0f, 0xdc, 0xcc, 0xff, 0x15, 0x57,
+ 0x02, 0x02, 0xde, 0xf0,
+ 0x17, 0x41, 0xff, 0xec, 0x00, 0x51, 0x12, 0x01, 0xf0, 0x00, 0xf0, 0x40,
+ 0x7f, 0x70, 0x32, 0xee,
+ 0xda, 0xf2, 0x01, 0x2d, 0x08, 0xff, 0xfe, 0x0e, 0x20, 0x20, 0x20, 0xae,
+ 0xfe, 0x00, 0x01, 0xf0,
+ 0x0c, 0x14, 0xc5, 0xe0, 0x0f, 0x31, 0x34, 0x5f, 0x1e, 0xee, 0x0d, 0x4b,
+ 0x7f, 0x20, 0xe1, 0xcd,
+ 0x0e, 0x00, 0x01, 0x3f, 0x2e, 0xfe, 0xec, 0xf2, 0xc4, 0xfb, 0x2b, 0x40,
+ 0x35, 0x20, 0xe0, 0xbd,
+ 0xd1, 0xe0, 0xe1, 0x22, 0x77, 0x64, 0x01, 0x00, 0x0e, 0x00, 0x04, 0xd5,
+ 0xe2, 0xf0, 0xee, 0x9e,
+ 0xf0, 0xd1, 0x00, 0xed, 0xc0, 0xe0, 0x03, 0xee, 0x09, 0x0f, 0x40, 0x43,
+ 0x45, 0x40, 0x1f, 0x01,
+ 0xf1, 0x01, 0xfe, 0x1e, 0x21, 0x17, 0x07, 0xaf, 0xfe, 0xff, 0x10, 0x32,
+ 0x20, 0x0f, 0xdf, 0x0f,
+ 0x1e, 0x1f, 0x2e, 0x00, 0x10, 0x17, 0xf0, 0x9f, 0xdb, 0xe0, 0xd2, 0x14,
+ 0x60, 0x1f, 0x4f, 0x30,
+ 0x2e, 0x5b, 0x00, 0x0d, 0xf0, 0x00, 0x3f, 0x3d, 0x6d, 0x0f, 0xe1, 0xe4,
+ 0x13, 0x43, 0x01, 0xdf,
+ 0xdd, 0xf2, 0x27, 0x37, 0x10, 0x02, 0xb0, 0xde, 0x0d, 0x10, 0x40, 0x1e,
+ 0xce, 0x10, 0x74, 0x41,
+ 0x0f, 0x1c, 0xfe, 0xb0, 0xe0, 0xe7, 0x01, 0xd0, 0xc0, 0xbd, 0xcf, 0xf0,
+ 0xdf, 0x0e, 0x0d, 0x0c,
+ 0x00, 0x57, 0x31, 0x02, 0x13, 0x34, 0x32, 0x43, 0x32, 0x02, 0xd0, 0xb0,
+ 0xe6, 0xe2, 0xf1, 0x00,
+ 0x02, 0xb0, 0xdc, 0xcf, 0x0f, 0x2c, 0x1d, 0x0f, 0x11, 0xff, 0x09, 0x3f,
+ 0x7f, 0x7e, 0x0f, 0xe0,
+ 0xf2, 0x10, 0x2e, 0x2b, 0x00, 0xd6, 0x03, 0x02, 0x00, 0x2b, 0x6f, 0x0f,
+ 0xed, 0x0d, 0x4f, 0x34,
+ 0xf2, 0xd1, 0x01, 0x30, 0x29, 0x0f, 0xde, 0xff, 0x00, 0x54, 0x02, 0x50,
+ 0x2b, 0xf0, 0xd0, 0x02,
+ 0x0f, 0x0d, 0x00, 0x0f, 0xde, 0x0e, 0x72, 0x75, 0x23, 0x20, 0x01, 0x01,
+ 0x17, 0x00, 0x32, 0x00,
+ 0x5d, 0xe9, 0xf2, 0xcd, 0xe9, 0xe0, 0x9c, 0xd0, 0x64, 0x00, 0xd7, 0x83,
+ 0xa0, 0x01, 0x03, 0x01,
+ 0x0e, 0xdc, 0xcf, 0xd0, 0xd0, 0xf2, 0x00, 0xdf, 0xd6, 0x14, 0x30, 0x00,
+ 0x00, 0x00, 0x1c, 0x3b,
+ 0x4e, 0x4f, 0x21, 0xf2, 0xd0, 0x3f, 0x70, 0x20, 0x40, 0x22, 0xf0, 0xcd,
+ 0xf3, 0x37, 0x77, 0x77,
+ 0x01, 0xe0, 0x0e, 0xff, 0x0f, 0x00, 0xf0, 0xd1, 0xfe, 0xed, 0xf2, 0xf1,
+ 0xcf, 0xed, 0x20, 0x2f,
+ 0x10, 0x41, 0x23, 0x2d, 0x2e, 0x64, 0x33, 0x2c, 0xf8, 0xff, 0xe0, 0xc0,
+ 0xfb, 0xfe, 0xe0, 0x0e,
+ 0x30, 0x42, 0x4d, 0x3d, 0x01, 0x02, 0xf1, 0xe1, 0x07, 0x42, 0xff, 0xcc,
+ 0x71, 0x30, 0x2f, 0xde,
+ 0xe7, 0x06, 0x00, 0x11, 0x60, 0x40, 0x4e, 0x10, 0x00, 0xc2, 0xff, 0xdd,
+ 0x8d, 0xcb, 0xef, 0xe0,
+ 0x00, 0x0c, 0x0e, 0x20, 0x11, 0x02, 0x12, 0x35, 0x51, 0x1f, 0x0d, 0xfd,
+ 0xd0, 0xf0, 0xf5, 0xf6,
+ 0xc0, 0xd1, 0xd0, 0x10, 0x70, 0x0e, 0x10, 0xf3, 0xf6, 0x01, 0x00, 0x2d,
+ 0x09, 0xdf, 0x3e, 0x70,
+ 0x30, 0x10, 0x03, 0xd1, 0xb1, 0x0d, 0x0e, 0x12, 0xe7, 0xc3, 0x02, 0x21,
+ 0x50, 0x33, 0x30, 0xfc,
+ 0xeb, 0x30, 0x70, 0x12, 0xf0, 0xce, 0xef, 0xe0, 0xf0, 0x1f, 0x31, 0x0f,
+ 0xdf, 0xe2, 0x14, 0x72,
+ 0x00, 0xe0, 0xd7, 0x02, 0x0d, 0x79, 0x40, 0x2e, 0x0e, 0xef, 0x13, 0x32,
+ 0x0f, 0x0f, 0x50, 0x22,
+ 0x30, 0x00, 0x27, 0x06, 0xa0, 0xd1, 0xc0, 0xdf, 0xfe, 0xee, 0xe0, 0xed,
+ 0xef, 0xf3, 0xf5, 0x0d,
+ 0x5d, 0x20, 0x06, 0xf4, 0x02, 0x70, 0x20, 0x1c, 0xf1, 0xe2, 0xef, 0x0c,
+ 0xf0, 0xe7, 0xd0, 0xce,
+ 0xfe, 0x00, 0xc2, 0xe0, 0x00, 0x1d, 0x3d, 0x0d, 0xa0, 0x00, 0x1d, 0x0c,
+ 0x4d, 0x70, 0x3d, 0x00,
+ 0xd1, 0xd7, 0x07, 0x03, 0x1e, 0x0d, 0xef, 0x03, 0x72, 0x3f, 0x5f, 0x0f,
+ 0xfe, 0xdd, 0x0a, 0x4f,
+ 0x4d, 0x0f, 0xc0, 0x01, 0x1e, 0x3d, 0x21, 0x35, 0x15, 0x02, 0xd4, 0xc2,
+ 0xd1, 0xf0, 0xf0, 0xce,
+ 0x00, 0x00, 0xcd, 0xaf, 0xfd, 0xdf, 0x10, 0x57, 0x57, 0x30, 0x2c, 0x22,
+ 0x23, 0x12, 0x00, 0xbf,
+ 0xe0, 0xd4, 0xe0, 0xcd, 0xc9, 0xcf, 0xff, 0xef, 0xf1, 0x02, 0x23, 0x1f,
+ 0xfe, 0xef, 0x24, 0x75,
+ 0x30, 0xff, 0x00, 0x1f, 0x3f, 0x5c, 0x31, 0x11, 0xee, 0xbe, 0x07, 0x27,
+ 0x00, 0xc0, 0x0f, 0x30,
+ 0x00, 0x10, 0xff, 0xfc, 0xee, 0xee, 0xf0, 0x44, 0x20, 0x0e, 0x00, 0x0e,
+ 0x1f, 0x40, 0x43, 0x67,
+ 0x00, 0xf1, 0x9e, 0xfe, 0xfd, 0x0e, 0x61, 0x01, 0x0f, 0x0f, 0xf2, 0x0b,
+ 0x0b, 0x6f, 0x00, 0x0e,
+ 0x00, 0x15, 0x01, 0xcd, 0xfd, 0xfd, 0x0d, 0x00, 0xd3, 0xf4, 0xdd, 0x0e,
+ 0xee, 0xfa, 0x20, 0x73,
+ 0x77, 0x06, 0x11, 0x20, 0x32, 0x30, 0x00, 0x01, 0xc3, 0xe0, 0xfe, 0x0e,
+ 0xd0, 0x8e, 0xcd, 0xff,
+ 0xf0, 0x04, 0x0f, 0x0e, 0x00, 0x2d, 0x09, 0x00, 0x30, 0x04, 0xe4, 0x03,
+ 0x0f, 0x1a, 0x1f, 0x21,
+ 0x03, 0xe0, 0xfe, 0x70, 0x64, 0x03, 0x02, 0xc1, 0x0f, 0xfe, 0x00, 0x10,
+ 0x0e, 0xff, 0xfe, 0x1f,
+ 0x2b, 0x1f, 0xf3, 0xf7, 0x17, 0x3f, 0x50, 0x3e, 0x0e, 0x80, 0x03, 0x10,
+ 0x2e, 0x10, 0x2f, 0x4c,
+ 0x3c, 0x0c, 0x2e, 0x00, 0x00, 0x01, 0x30, 0x30, 0xe6, 0xc2, 0xd1, 0x90,
+ 0xdc, 0xcd, 0x0d, 0x12,
+ 0x52, 0x00, 0xd3, 0x47, 0x10, 0x2a, 0x1f, 0x10, 0x20, 0x7f, 0x20, 0x31,
+ 0xfe, 0xae, 0x0f, 0xe2,
+ 0x06, 0xf0, 0xfe, 0xd1, 0xd1, 0xbb, 0xfd, 0xed, 0x10, 0x20, 0x23, 0x03,
+ 0xce, 0x10, 0x74, 0x04,
+ 0x01, 0x05, 0xd5, 0xd2, 0x02, 0xd3, 0x12, 0x21, 0x23, 0x14, 0xb1, 0x9e,
+ 0xef, 0x00, 0x1f, 0x31,
+ 0x13, 0x00, 0xfb, 0xe0, 0x3f, 0x5c, 0x2c, 0x00, 0xb4, 0xf2, 0xf0, 0xff,
+ 0x0a, 0x0f, 0xfe, 0xf1,
+ 0x04, 0xde, 0xed, 0x4f, 0x60, 0x10, 0x3d, 0x76, 0x14, 0x00, 0xeb, 0x00,
+ 0x0d, 0x0e, 0x40, 0x31,
+ 0x32, 0x0d, 0xb0, 0x07, 0x21, 0xec, 0xfc, 0x00, 0x01, 0x00, 0x0e, 0x1c,
+ 0xdd, 0xcc, 0xef, 0x11,
+ 0x14, 0x20, 0x3e, 0x2c, 0x7e, 0x7f, 0x41, 0x27, 0x02, 0x01, 0x00, 0x10,
+ 0x31, 0x21, 0xd3, 0xc3,
+ 0xa0, 0xf0, 0x05, 0x02, 0x01, 0xc0, 0xff, 0xe0, 0xf4, 0xa0, 0xe1, 0xfe,
+ 0xe9, 0xd0, 0xde, 0x00,
+ 0x0c, 0x0d, 0xed, 0xfb, 0x7f, 0x60, 0x20, 0x22, 0x17, 0x01, 0x00, 0x20,
+ 0x32, 0x00, 0xf5, 0xb4,
+ 0xe2, 0xc0, 0xff, 0xff, 0x0d, 0xdd, 0xde, 0x0d, 0x03, 0x07, 0xf0, 0x31,
+ 0x7f, 0x00, 0x1f, 0x12,
+ 0x02, 0xd0, 0xd4, 0xe1, 0x8d, 0x09, 0x0f, 0x1e, 0x0e, 0x30, 0x71, 0x20,
+ 0x0c, 0x1e, 0x10, 0x10,
+ 0x4e, 0x30, 0x2f, 0x0d, 0xc0, 0xcd, 0xf9, 0x0e, 0xcf, 0xd0, 0xbc, 0xf0,
+ 0x07, 0x31, 0x31, 0x73,
+ 0x31, 0x01, 0x12, 0x01, 0x23, 0x0e, 0xce, 0xe3, 0x07, 0xe1, 0xbe, 0x0d,
+ 0xe1, 0xf0, 0xfa, 0x0e,
+ 0x6d, 0x10, 0xf3, 0xe4, 0x00, 0x2d, 0x1a, 0xff, 0xc0, 0xfe, 0xcb, 0x00,
+ 0x00, 0xf1, 0xe0, 0xff,
+ 0x34, 0x56, 0x30, 0x11, 0x2f, 0x00, 0xd3, 0xe1, 0xc3, 0xe1, 0xee, 0xf9,
+ 0xff, 0xfd, 0x7f, 0x5c,
+ 0x1f, 0x00, 0xc0, 0xe4, 0x00, 0xf1, 0x00, 0x64, 0x22, 0x23, 0xe3, 0xe1,
+ 0xf0, 0xfd, 0x01, 0xe7,
+ 0x04, 0x22, 0x0e, 0xee, 0x21, 0x72, 0x1e, 0x4d, 0x23, 0x02, 0x8c, 0xf1,
+ 0x07, 0xf3, 0x00, 0xe0,
+ 0x00, 0xf0, 0xdb, 0x0e, 0x0f, 0x0a, 0x1f, 0x70, 0x50, 0x22, 0x1f, 0x3d,
+ 0x3f, 0x0f, 0xf0, 0x03,
+ 0x27, 0x26, 0xcf, 0xee, 0xf0, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x2f, 0xc0,
+ 0xbd, 0xe0, 0xde, 0xb0,
+ 0xd0, 0xf2, 0x37, 0x00, 0xca, 0xb0, 0xe1, 0x03, 0x23, 0x12, 0x33, 0x72,
+ 0x1e, 0x1a, 0x0f, 0x10,
+ 0x05, 0xd2, 0xcf, 0x0d, 0xfd, 0xe0, 0x0e, 0x0f, 0xfe, 0xf0, 0x11, 0x5c,
+ 0x4f, 0x1f, 0xd0, 0xf1,
+ 0x36, 0x76, 0x70, 0x00, 0xee, 0xf0, 0x00, 0x0f, 0xff, 0x00, 0x04, 0xcd,
+ 0xfb, 0x0f, 0x0e, 0x01,
+ 0x45, 0x40, 0x3c, 0x5f, 0x50, 0x15, 0x10, 0x03, 0xc3, 0x02, 0xe2, 0xfc,
+ 0xcc, 0xee, 0xd0, 0xbf,
+ 0xee, 0x02, 0x2f, 0x2d, 0x31, 0x77, 0x12, 0x12, 0x00, 0x31, 0x14, 0x2e,
+ 0x19, 0x0f, 0xe0, 0xc1,
+ 0x04, 0x00, 0xd0, 0xde, 0xdf, 0xbe, 0xc0, 0xef, 0xd0, 0xf5, 0xa0, 0xf1,
+ 0xd1, 0xef, 0xec, 0xec,
+ 0x30, 0x53, 0x22, 0x3e, 0x4a, 0x20, 0x5f, 0x0e, 0x11, 0xe6, 0xd1, 0x01,
+ 0x20, 0x0f, 0xef, 0xf0,
+ 0x12, 0x34, 0xe0, 0xbf, 0x00, 0x0c, 0x3b, 0x7f, 0x3e, 0x0d, 0x0f, 0x16,
+ 0x36, 0xf0, 0x0e, 0x00,
+ 0xa0, 0xe0, 0xd0, 0xff, 0x00, 0xcc, 0xdf, 0x20, 0x50, 0x01, 0x73, 0x30,
+ 0x28, 0x0e, 0x0f, 0x22,
+ 0x41, 0x1f, 0xfc, 0xdf, 0xbf, 0xce, 0xcd, 0xdd, 0xe1, 0xc0, 0x00, 0x0f,
+ 0x0a, 0x50, 0x22, 0x35,
+ 0x23, 0x57, 0x32, 0x21, 0x0f, 0x00, 0x02, 0xe1, 0xf2, 0xe6, 0xc0, 0xd0,
+ 0xdd, 0xe0, 0x03, 0x10,
+ 0x2f, 0x0c, 0xaf, 0xf0, 0xe4, 0x10, 0xff, 0xcf, 0xc0, 0xc3, 0xdb, 0xcd,
+ 0x0e, 0x2f, 0x51, 0x20,
+ 0x10, 0x03, 0xe7, 0x05, 0xfd, 0x0f, 0x10, 0x12, 0x20, 0x20, 0xe1, 0xa0,
+ 0x0d, 0x20, 0x37, 0x03,
+ 0xf0, 0xde, 0x0f, 0x0c, 0xed, 0xef, 0x0f, 0x72, 0x75, 0x23, 0x10, 0x0c,
+ 0xef, 0x0f, 0xe0, 0x02,
+ 0x42, 0x7e, 0x18, 0xec, 0xd0, 0x0e, 0x2f, 0x1f, 0x60, 0x35, 0xf0, 0xb0,
+ 0x0e, 0x00, 0x13, 0xe0,
+ 0xf3, 0x06, 0x2f, 0x0b, 0x20, 0x1f, 0xff, 0xb0, 0x02, 0x42, 0x60, 0x0f,
+ 0xf0, 0xe7, 0xf0, 0x12,
+ 0x30, 0xdf, 0xae, 0x00, 0x23, 0x2e, 0x2c, 0x1f, 0x2f, 0x0a, 0xeb, 0x4f,
+ 0x4e, 0x10, 0x02, 0xa5,
+ 0xd2, 0xc4, 0xc0, 0xd0, 0xf0, 0x02, 0xe2, 0x04, 0x11, 0xe0, 0xde, 0x0f,
+ 0x02, 0x12, 0x21, 0x11,
+ 0x72, 0x42, 0x42, 0x03, 0x01, 0xe4, 0xc0, 0xe1, 0xf4, 0xf0, 0x0e, 0x28,
+ 0xc8, 0xdf, 0xc0, 0x12,
+ 0x60, 0x5f, 0x40, 0x0c, 0x00, 0xff, 0x02, 0x14, 0x23, 0x00, 0xed, 0xed,
+ 0xfd, 0xfd, 0x00, 0x0e,
+ 0x51, 0x17, 0x16, 0x1e, 0x4d, 0x20, 0x21, 0x0f, 0x4e, 0x0d, 0x2d, 0x00,
+ 0xaf, 0xcf, 0xdf, 0xc8,
+ 0xdb, 0xe0, 0xff, 0x00, 0x0e, 0x40, 0x73, 0x10, 0x20, 0x21, 0x43, 0x47,
+ 0x32, 0x00, 0xef, 0xf0,
+ 0xe3, 0x05, 0x22, 0x10, 0x31, 0xf2, 0x91, 0xe0, 0xe2, 0xc0, 0xdf, 0x9f,
+ 0xf0, 0xf1, 0xfb, 0xeb,
+ 0xfc, 0x30, 0x3f, 0x0a, 0x3f, 0x40, 0x31, 0x10, 0x0e, 0x12, 0x27, 0xe2,
+ 0xf1, 0xe0, 0xd0, 0xb0,
+ 0x01, 0xf1, 0xd2, 0xd0, 0xc1, 0xb3, 0x00, 0x71, 0x45, 0x00, 0xfc, 0xdf,
+ 0x00, 0x3f, 0x0d, 0x00,
+ 0x07, 0xb5, 0x00, 0x02, 0x00, 0x1d, 0xff, 0xfe, 0x3f, 0x5d, 0x0f, 0xce,
+ 0x0d, 0x2c, 0x7e, 0x3d,
+ 0x2d, 0x0a, 0x0c, 0xde, 0x0f, 0x02, 0x45, 0x02, 0xbe, 0xfd, 0xfd, 0xec,
+ 0x0f, 0x3d, 0x42, 0xd2,
+ 0xa0, 0x03, 0x04, 0x30, 0x0b, 0x03, 0x17, 0x05, 0x0e, 0x0e, 0x41, 0x22,
+ 0x00, 0x00, 0xf0, 0x20,
+ 0x73, 0x21, 0xe0, 0x99, 0xff, 0x0e, 0x0e, 0xee, 0xf0, 0xe0, 0xf5, 0xb0,
+ 0xfd, 0xe0, 0x03, 0x12,
+ 0x0d, 0x0f, 0x20, 0x00, 0xd9, 0x41, 0x64, 0x23, 0x11, 0xdf, 0xad, 0xdd,
+ 0x0f, 0x13, 0x10, 0x1f,
+ 0x00, 0xef, 0x0b, 0x0d, 0x1c, 0x0e, 0xf0, 0x01, 0x14, 0x25, 0x54, 0x02,
+ 0xe1, 0x44, 0x73, 0x22,
+ 0x21, 0x2c, 0xfc, 0xbd, 0xfe, 0xf2, 0x07, 0xc1, 0xd1, 0x11, 0x12, 0x1f,
+ 0x1d, 0x71, 0x07, 0xf1,
+ 0xd0, 0x01, 0x6f, 0x0c, 0x0e, 0xfe, 0xee, 0x0e, 0x0d, 0x0d, 0x5e, 0x1c,
+ 0x1e, 0x02, 0x27, 0x37,
+ 0x23, 0x20, 0xfd, 0xd0, 0x00, 0x70, 0x6f, 0x1f, 0x20, 0x0e, 0x0d, 0xeb,
+ 0xe0, 0xdf, 0xcf, 0x03,
+ 0x05, 0xf0, 0xd1, 0xf0, 0xd5, 0xc1, 0xb1, 0xf0, 0x12, 0xf0, 0xa0, 0xc0,
+ 0x0b, 0x10, 0x3e, 0x50,
+ 0x20, 0x00, 0x05, 0xf3, 0xdd, 0xec, 0xff, 0xfd, 0xa0, 0x01, 0x02, 0x10,
+ 0xfc, 0x0d, 0x16, 0x42,
+ 0x0e, 0xdc, 0x00, 0x33, 0x00, 0xac, 0x01, 0xe0, 0xda, 0xff, 0x0f, 0x20,
+ 0x00, 0x34, 0x20, 0x7e,
+ 0x7e, 0x70, 0x00, 0x17, 0x00, 0xf0, 0xf1, 0x02, 0x0f, 0x0e, 0x0f, 0xd0,
+ 0xe1, 0xe0, 0xf1, 0x01,
+ 0xe0, 0xde, 0xd2, 0x03, 0x5c, 0x7a, 0x3e, 0x1f, 0x10, 0x07, 0x22, 0x11,
+ 0xf3, 0x00, 0x30, 0x3f,
+ 0x0b, 0x31, 0x03, 0x8e, 0xc9, 0xf0, 0xf4, 0x02, 0xd2, 0xe1, 0xd2, 0xd0,
+ 0xc0, 0x00, 0x2f, 0x0c,
+ 0xee, 0xce, 0x0d, 0x1f, 0x7e, 0x3f, 0x2e, 0x07, 0xe6, 0xff, 0x0d, 0x10,
+ 0x0e, 0xe0, 0xb7, 0xd1,
+ 0xf0, 0x40, 0x60, 0x1f, 0x21, 0x23, 0x00, 0x2b, 0x31, 0xe4, 0x80, 0x0d,
+ 0xeb, 0x00, 0xdf, 0xff,
+ 0x01, 0xf4, 0xf1, 0x00, 0x20, 0x3e, 0xf4, 0x57, 0x70, 0x4f, 0x09, 0x00,
+ 0xff, 0x1e, 0x00, 0x1f,
+ 0x10, 0xf0, 0xd3, 0xef, 0xfd, 0x0d, 0x30, 0x03, 0x8e, 0xda, 0xf0, 0x10,
+ 0x0e, 0x3e, 0x70, 0x14,
+ 0x0f, 0x0e, 0x12, 0x04, 0xe0, 0xdd, 0x32, 0x67, 0x07, 0x02, 0xfe, 0x00,
+ 0x20, 0x20, 0x33, 0x10,
+ 0xe2, 0xc0, 0xa0, 0xff, 0xed, 0xff, 0x01, 0x05, 0xa0, 0xdc, 0xef, 0x00,
+ 0xc1, 0xfe, 0xfe, 0x13,
+ 0x61, 0x0d, 0x3b, 0x00, 0xcf, 0xf2, 0x06, 0x27, 0x02, 0x01, 0x00, 0xe0,
+ 0xe0, 0x10, 0x23, 0x01,
+ 0x00, 0x42, 0x2f, 0xf9, 0xe0, 0x1f, 0x01, 0x94, 0x1d, 0x7d, 0x5c, 0x00,
+ 0xef, 0x01, 0x15, 0x32,
+ 0xf1, 0xe0, 0x0e, 0xdb, 0xed, 0x1c, 0x4f, 0x30, 0xe1, 0xa2, 0x03, 0x00,
+ 0x30, 0x7d, 0x1d, 0x1c,
+ 0x00, 0x06, 0x26, 0x0f, 0x1e, 0x3e, 0x10, 0x21, 0x01, 0x80, 0xcf, 0xd1,
+ 0xf3, 0xe0, 0xee, 0x0c,
+ 0x00, 0x0f, 0x5c, 0x71, 0x20, 0x1d, 0x18, 0x1b, 0x10, 0x2d, 0x1f, 0x10,
+ 0x00, 0x03, 0xf1, 0xc1,
+ 0xc6, 0xd3, 0x92, 0xd0, 0xde, 0xd0, 0xe2, 0xf1, 0x00, 0x00, 0x52, 0x17,
+ 0x04, 0xf0, 0x3d, 0x61,
+ 0x04, 0x13, 0x03, 0xd2, 0xf3, 0xbf, 0xe2, 0xf7, 0x00, 0x21, 0x00, 0xf1,
+ 0x00, 0x09, 0x3f, 0x61,
+ 0x10, 0x0f, 0x0e, 0x0b, 0x2f, 0x1f, 0x21, 0xf2, 0xa0, 0xf0, 0x00, 0x02,
+ 0x1f, 0x3d, 0x07, 0x15,
+ 0x00, 0xe0, 0x7d, 0x3f, 0x3f, 0x2d, 0x00, 0x1f, 0x0e, 0xfe, 0x90, 0x02,
+ 0xda, 0xec, 0xec, 0x0d,
+ 0xff, 0x0d, 0xfe, 0x1f, 0x60, 0x50, 0x1d, 0x0d, 0x0f, 0x10, 0x42, 0x1a,
+ 0x2e, 0x32, 0x77, 0x47,
+ 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x12, 0xe1, 0x80, 0xc1, 0xe1,
+ 0xe0, 0xe0, 0xff, 0x0d,
+ 0xfe, 0x0e, 0x0c, 0x1f, 0x1b, 0x2e, 0x70, 0x01, 0x1e, 0x00, 0xd3, 0xd1,
+ 0xf0, 0xf0, 0xd6, 0xd2,
+ 0xc5, 0x04, 0xc2, 0x02, 0x32, 0x53, 0x3f, 0x1c, 0xde, 0xbe, 0x10, 0x64,
+ 0x17, 0x01, 0xc2, 0x01,
+ 0xe4, 0xe0, 0x0c, 0xdc, 0x00, 0x22, 0xf2, 0x02, 0x02, 0x20, 0xed, 0xca,
+ 0x1d, 0x7e, 0x50, 0x20,
+ 0x1b, 0x0c, 0x1f, 0x21, 0x53, 0x01, 0x0e, 0x00, 0x01, 0xea, 0x0d, 0x2f,
+ 0x1c, 0xdf, 0xdf, 0x00,
+ 0xee, 0xde, 0xbe, 0xf0, 0xd4, 0xb0, 0x02, 0x27, 0x34, 0x10, 0x22, 0x70,
+ 0x72, 0x4f, 0x21, 0x11,
+ 0x1f, 0xfe, 0xcf, 0x02, 0xf0, 0xe8, 0x0d, 0xf2, 0xe7, 0xf0, 0xce, 0x0c,
+ 0xdf, 0x00, 0x0f, 0x70,
+ 0x02, 0x03, 0xf1, 0xc0, 0x0e, 0xed, 0x11, 0xdc, 0xc0, 0xbf, 0x00, 0xf1,
+ 0x16, 0x35, 0xad, 0x00,
+ 0xe0, 0x12, 0x21, 0x55, 0x00, 0xfc, 0xf1, 0x01, 0x34, 0x0e, 0x10, 0x03,
+ 0x03, 0xdc, 0x41, 0x53,
+ 0x0f, 0xe0, 0xf5, 0x06, 0xce, 0x0f, 0x00, 0x45, 0xd0, 0xce, 0x00, 0x22,
+ 0x00, 0xbf, 0x31, 0x00,
+ 0x13, 0xfd, 0x02, 0x8c, 0x10, 0x30, 0x2d, 0x3d, 0xf8, 0xd0, 0xad, 0x14,
+ 0xe0, 0xf2, 0xcf, 0x25,
+ 0x00, 0x1f, 0x10, 0x5e, 0x30, 0x08, 0x4f, 0x2d, 0x72, 0x30, 0x00, 0x0d,
+ 0x10, 0xf0, 0xcd, 0x27,
+ 0xf2, 0xf0, 0x8c, 0x14, 0x01, 0xde, 0xf0, 0x02, 0x57, 0xfe, 0xcd, 0x10,
+ 0x43, 0x00, 0xda, 0x00,
+ 0x23, 0x00, 0x0f, 0x00, 0x20, 0xe1, 0xb0, 0x14, 0x23, 0xdd, 0xda, 0x02,
+ 0x53, 0xf0, 0xcd, 0x0f,
+ 0x43, 0x00, 0xc8, 0xf0, 0x00, 0x31, 0x00, 0xff, 0x32, 0x43, 0xbc, 0x10,
+ 0x24, 0x10, 0xfd, 0xed,
+ 0x33, 0x55, 0xf0, 0xfd, 0x00, 0x0e, 0x11, 0x21, 0xc0, 0xe1, 0xf2, 0xd0,
+ 0x00, 0x14, 0x45, 0xee,
+ 0xef, 0x30, 0x0e, 0x0b, 0x71, 0x63, 0xed, 0xdc, 0xef, 0x24, 0x54, 0xfb,
+ 0xbe, 0x21, 0x01, 0x1f,
+ 0x3f, 0x02, 0x01, 0x0d, 0xf0, 0x30, 0x30, 0xfe, 0xd0, 0x07, 0xd3, 0xdf,
+ 0x04, 0xa0, 0xb1, 0x02,
+ 0xf5, 0x0d, 0x0c, 0x62, 0x0e, 0xeb, 0x01, 0x10, 0xec, 0xdd, 0x41, 0x24,
+ 0xcd, 0xdd, 0x12, 0x45,
+ 0x31, 0xf0, 0xfe, 0x32, 0x75, 0x0f, 0xbc, 0x02, 0x04, 0x0e, 0xfd, 0xe0,
+ 0xf0, 0xef, 0x0f, 0x0e,
+ 0x36, 0x75, 0x10, 0xfe, 0xf0, 0xff, 0x11, 0x13, 0x00, 0xfe, 0xde, 0x41,
+ 0x44, 0x1e, 0xda, 0xef,
+ 0x22, 0x23, 0xed, 0x8c, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xe9, 0x42, 0x20,
+ 0xfe, 0xfe, 0x30, 0x00,
+ 0xac, 0x00, 0x14, 0x14, 0xde, 0xbc, 0x02, 0x33, 0xff, 0x0f, 0x03, 0x0e,
+ 0x01, 0x67, 0x00, 0x0e,
+ 0xff, 0x11, 0x32, 0xce, 0xf0, 0x23, 0x33, 0xff, 0xb9, 0x22, 0x45, 0xee,
+ 0xad, 0x01, 0x22, 0x00,
+ 0xfc, 0xef, 0x20, 0xf0, 0xa9, 0x33, 0x55, 0xee, 0xbc, 0x13, 0x05, 0x05,
+ 0x06, 0x01, 0xf3, 0x00,
+ 0xa3, 0x29, 0x0d, 0xe2, 0x79, 0x2c, 0xf0, 0xe1, 0xec, 0x00, 0x76, 0x20,
+ 0xef, 0xee, 0x21, 0x22,
+ 0xef, 0xcc, 0x22, 0x33, 0xbc, 0xdd, 0x33, 0x35, 0xee, 0xcc, 0x22, 0x22,
+ 0xef, 0xee, 0xf0, 0x01,
+ 0x0f, 0x8b, 0x00, 0x22, 0xf0, 0xdb, 0x01, 0x10, 0xbd, 0x00, 0x34, 0xfe,
+ 0xdc, 0x22, 0x10, 0xff,
+ 0xef, 0xef, 0x21, 0x63, 0xda, 0xce, 0x11, 0x12, 0xce, 0xdd, 0x01, 0x12,
+ 0xbb, 0xee, 0x0f, 0x01,
+ 0x10, 0xb8, 0x10, 0x40, 0x0f, 0x0c, 0x20, 0x40, 0xdc, 0xfd, 0x53, 0x10,
+ 0xdb, 0xff, 0x00, 0x20,
+ 0xfd, 0xcc, 0x00, 0x30, 0x0f, 0xff, 0xfe, 0xfc, 0x1e, 0xea, 0x00, 0x2e,
+ 0x9f, 0xef, 0x1f, 0x32,
+ 0xff, 0x8b, 0xee, 0x22, 0x77, 0xde, 0xdc, 0x21, 0x12, 0xf0, 0xff, 0xf0,
+ 0xcf, 0xed, 0x44, 0x00,
+ 0xba, 0xff, 0x12, 0x11, 0xf0, 0xcf, 0xff, 0x12, 0x12, 0xe0, 0xdf, 0x11,
+ 0x34, 0xbf, 0xee, 0x05,
+ 0x00, 0x8c, 0x00, 0x17, 0x00, 0xcf, 0xff, 0x01, 0x24, 0xf0, 0xbd, 0x00,
+ 0x13, 0x23, 0xcc, 0xee,
+ 0x00, 0x13, 0xee, 0xba, 0x11, 0x00, 0xdd, 0x00, 0x22, 0xde, 0xdc, 0x43,
+ 0x31, 0xec, 0xdd, 0xed,
+ 0x41, 0x10, 0x00, 0x12, 0xa9, 0xde, 0x33, 0x42, 0xcb, 0xee, 0x00, 0x00,
+ 0x44, 0x00, 0xfe, 0xed,
+ 0x31, 0x52, 0xec, 0xfd, 0x01, 0x30, 0xb9, 0xff, 0x00, 0x0f, 0xf0, 0x00,
+ 0xfe, 0x22, 0x65, 0xba,
+ 0x00, 0x42, 0x00, 0xce, 0x00, 0x31, 0xf0, 0x0f, 0x13, 0x0e, 0xeb, 0x01,
+ 0x67, 0x00, 0xd0, 0xfe,
+ 0x13, 0x11, 0xd0, 0x21, 0x02, 0xcf, 0x23, 0x02, 0xdf, 0x00, 0x37, 0x01,
+ 0xc0, 0x35, 0xd0, 0xe0,
+ 0x33, 0x41, 0x42, 0x11, 0xd0, 0x00, 0x77, 0x62, 0xe0, 0xcc, 0x00, 0x67,
+ 0x00, 0xff, 0xef, 0x11,
+ 0x44, 0xe0, 0xfd, 0x01, 0x02, 0x33, 0x10, 0xff, 0xee, 0x43, 0x46, 0xef,
+ 0xee, 0x22, 0x43, 0x10,
+ 0x0f, 0x00, 0x33, 0x22, 0x00, 0x10, 0x77, 0x41, 0xee, 0x00, 0x43, 0x22,
+ 0xfe, 0x0e, 0x01, 0x43,
+ 0x11, 0x0f, 0xfa, 0x0f, 0x54, 0x21, 0xec, 0x0f, 0x64, 0x00, 0x0f, 0x01,
+ 0x1f, 0x10, 0x20, 0xea,
+ 0xf0, 0x63, 0x01, 0xfa, 0x00, 0x20, 0x21, 0x00, 0x0e, 0x10, 0x41, 0x0e,
+ 0x0e, 0x21, 0x20, 0x20,
+ 0x20, 0xda, 0x72, 0x57, 0xee, 0xbc, 0x22, 0x33, 0xdd, 0xed, 0x24, 0x53,
+ 0xdb, 0xef, 0x41, 0x01,
+ 0xf0, 0x20, 0x0f, 0xf0, 0x00, 0x15, 0x00, 0xfe, 0xd0, 0x03, 0x25, 0x9e,
+ 0xdd, 0x01, 0x47, 0x00,
+ 0x9e, 0x00, 0x41, 0x01, 0xef, 0x0f, 0x32, 0x00, 0xeb, 0x10, 0x54, 0xff,
+ 0xed, 0x13, 0x33, 0x0e,
+ 0xde, 0x00, 0x45, 0x10, 0xfe, 0x23, 0x32, 0xcc, 0x0f, 0x77, 0x10, 0xcd,
+ 0x00, 0x43, 0x11, 0xec,
+ 0x0e, 0x12, 0x33, 0x01, 0x10, 0x01, 0x0e, 0x02, 0x47, 0x00, 0xdd, 0xf0,
+ 0x44, 0x01, 0xad, 0x00,
+ 0x24, 0x00, 0xb9, 0x00, 0x64, 0x00, 0xdc, 0x12, 0x42, 0xff, 0xdc, 0x22,
+ 0x34, 0xff, 0xcc, 0x00,
+ 0x53, 0x01, 0xdc, 0xe0, 0x21, 0x02, 0xff, 0xfe, 0x01, 0x23, 0xf0, 0xcc,
+ 0x00, 0x43, 0x24, 0xdd,
+ 0xac, 0x13, 0x23, 0xfe, 0xcd, 0x01, 0x17, 0x00, 0xac, 0x00, 0x31, 0x01,
+ 0xcd, 0x10, 0x35, 0xef,
+ 0xfd, 0xf0, 0x00, 0x52, 0xf0, 0xcd, 0x11, 0x27, 0xef, 0x00, 0x22, 0xce,
+ 0x01, 0x45, 0xef, 0x00,
+ 0x22, 0xe0, 0xf0, 0xee, 0xe0, 0x15, 0x00, 0xac, 0x00, 0x00, 0x21, 0x01,
+ 0x00, 0x02, 0xbd, 0xfe,
+ 0x24, 0x33, 0xcd, 0xcb, 0xee, 0x02, 0x67, 0xf0, 0xac, 0x00, 0x24, 0x00,
+ 0xcc, 0x12, 0x11, 0xff,
+ 0xdf, 0x10, 0x22, 0x00, 0x11, 0xdf, 0x00, 0xf3, 0xdf, 0x00, 0x25, 0xae,
+ 0xcb, 0x14, 0x31, 0xc0,
+ 0xdc, 0x12, 0x55, 0xdf, 0xdc, 0x10, 0x75, 0x0f, 0xcd, 0x00, 0x41, 0x01,
+ 0xfd, 0xf0, 0x10, 0x00,
+ 0xfd, 0x00, 0xf0, 0xfc, 0xf0, 0xff, 0xca, 0x01, 0x41, 0xdd, 0xf0, 0xef,
+ 0x10, 0x20, 0xdb, 0x00,
+ 0x61, 0x10, 0xc9, 0x0f, 0x53, 0x00, 0xdd, 0x0e, 0x10, 0x40, 0x12, 0x0f,
+ 0x98, 0x0f, 0x33, 0x00,
+ 0xec, 0x00, 0x10, 0x00, 0xdd, 0x00, 0x30, 0x1f, 0xec, 0x00, 0x1f, 0x52,
+ 0xf0, 0xcb, 0x00, 0x24,
+ 0x00, 0xac, 0xf0, 0x12, 0x00, 0xfd, 0xbe, 0x02, 0x23, 0xfd, 0xc9, 0x11,
+ 0x54, 0xed, 0xfe, 0x01,
+ 0x12, 0x0f, 0xba, 0x11, 0x33, 0xdd, 0xef, 0x00, 0x10, 0xfd, 0x00, 0x43,
+ 0xdb, 0x0f, 0x62, 0xed,
+ 0x00, 0x22, 0x10, 0xfc, 0x00, 0x14, 0x0e, 0xab, 0x00, 0x17, 0x10, 0x8c,
+ 0x00, 0x12, 0x00, 0xed,
+ 0x0e, 0x01, 0x20, 0x00, 0x0f, 0x2f, 0x1e, 0x1e, 0x3f, 0x1f, 0xfb, 0xff,
+ 0x51, 0x20, 0xb9, 0x1f,
+ 0x52, 0xfd, 0xeb, 0x22, 0x42, 0xec, 0x0f, 0x10, 0x0f, 0x0c, 0x00, 0x71,
+ 0x11, 0xfc, 0xdd, 0x20,
+ 0x42, 0xff, 0xec, 0x00, 0x20, 0x25, 0xf0, 0xbe, 0x00, 0x24, 0x00, 0xbc,
+ 0x0f, 0xe0, 0x23, 0x13,
+ 0x98, 0xf0, 0x00, 0x12, 0x00, 0x02, 0x00, 0xef, 0x00, 0xf3, 0x01, 0x12,
+ 0xf1, 0xb0, 0x07, 0x55,
+ 0xbe, 0xff, 0x26, 0x10, 0xb0, 0xff, 0x02, 0x11, 0x01, 0xd0, 0xff, 0x02,
+ 0x23, 0xe0, 0xcf, 0x01,
+ 0x05, 0x00, 0xdf, 0x42, 0xdf, 0x99, 0x22, 0x42, 0xf0, 0xec, 0xde, 0x00,
+ 0x43, 0x00, 0xb9, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0xfe, 0xef, 0x00, 0x20, 0x10, 0x0d, 0x33, 0x54,
+ 0x0f, 0x0d, 0xfd, 0x21,
+ 0x73, 0x00, 0x0b, 0x0f, 0x15, 0x10, 0xf0, 0xaa, 0x10, 0x12, 0x1f, 0xfe,
+ 0x0d, 0x31, 0x22, 0x0f,
+ 0x0e, 0x30, 0x0d, 0x11, 0x77, 0x00, 0x00, 0x22, 0xef, 0xcf, 0x34, 0x34,
+ 0xdd, 0xd0, 0xbf, 0xdd,
+ 0x67, 0x05, 0xad, 0x00, 0x04, 0x10, 0xe0, 0x00, 0x34, 0x01, 0xd0, 0xe2,
+ 0x03, 0x14, 0xd0, 0xa0,
+ 0x03, 0x02, 0xe1, 0xc1, 0x17, 0x45, 0xef, 0xbe, 0x23, 0x22, 0xef, 0xef,
+ 0x32, 0x53, 0x0f, 0xed,
+ 0x12, 0x13, 0xef, 0xf0, 0x16, 0xfe, 0xd0, 0x02, 0xf0, 0xf1, 0x01, 0xae,
+ 0x01, 0x12, 0x00, 0x30,
+ 0x10, 0x3c, 0x72, 0x44, 0xf9, 0x10, 0x74, 0x00, 0x0e, 0x12, 0x12, 0x1f,
+ 0x12, 0x15, 0x1f, 0x0c,
+ 0x2f, 0x53, 0x10, 0x0a, 0x10, 0x40, 0x0d, 0x0c, 0x20, 0x60, 0x0f, 0x0c,
+ 0x42, 0x32, 0xec, 0xdb,
+ 0x11, 0x65, 0x0f, 0xcc, 0x0f, 0x20, 0x32, 0xee, 0xee, 0x2f, 0x42, 0x12,
+ 0xdb, 0x00, 0x30, 0x20,
+ 0xee, 0xef, 0x00, 0x60, 0x00, 0xed, 0xff, 0x0f, 0x31, 0xfe, 0xdb, 0x20,
+ 0x70, 0x02, 0x0f, 0x0f,
+ 0xeb, 0xcd, 0x03, 0x17, 0xdf, 0xce, 0xe1, 0x24, 0x10, 0xd0, 0xe1, 0xe6,
+ 0x80, 0xf2, 0xf1, 0xcf,
+ 0xe0, 0x11, 0x13, 0xfe, 0xeb, 0x10, 0x53, 0xdf, 0xdb, 0x00, 0x61, 0x01,
+ 0xdc, 0x0f, 0x31, 0x10,
+ 0x10, 0x0f, 0x00, 0x30, 0x33, 0x13, 0xcd, 0x0c, 0x0d, 0x5f, 0x4c, 0x49,
+ 0x40, 0x20, 0x1d, 0x3f,
+ 0x22, 0x22, 0x53, 0x1b, 0x0b, 0x22, 0x21, 0x00, 0x01, 0x01, 0xcd, 0xf3,
+ 0x03, 0xfb, 0xcd, 0x42,
+ 0x03, 0xab, 0x30, 0x64, 0x0f, 0xe0, 0x14, 0x32, 0xfe, 0xf0, 0x12, 0x31,
+ 0x11, 0x13, 0x10, 0xdf,
+ 0x01, 0x77, 0x17, 0x0f, 0xf0, 0x31, 0x04, 0xbe, 0xf0, 0x01, 0x06, 0xd1,
+ 0xf1, 0xf1, 0xd0, 0xf4,
+ 0x74, 0x00, 0xe1, 0xf2, 0x14, 0x53, 0xe0, 0xee, 0x32, 0x75, 0x00, 0xf0,
+ 0xfe, 0x11, 0x23, 0xff,
+ 0xed, 0x0e, 0x55, 0x02, 0x00, 0x15, 0x43, 0x13, 0x31, 0x21, 0x23, 0x54,
+ 0x44, 0x11, 0xf2, 0x15,
+ 0x64, 0x00, 0x02, 0x01, 0x05, 0x10, 0x00, 0x30, 0x61, 0x12, 0x10, 0x33,
+ 0x10, 0x20, 0x03, 0x02,
+ 0xff, 0x00, 0x54, 0x34, 0xe0, 0x03, 0x37, 0x23, 0xbd, 0xf0, 0x15, 0x61,
+ 0x11, 0x12, 0x21, 0x01,
+ 0x21, 0x53, 0x00, 0x12, 0x27, 0x03, 0x12, 0x03, 0x00, 0xa1, 0xf5, 0xf2,
+ 0xe0, 0xd0, 0x05, 0x24,
+ 0x01, 0xa1, 0xf3, 0xf2, 0xf3, 0xf0, 0x00, 0x31, 0x74, 0x51, 0x00, 0x0f,
+ 0x22, 0x20, 0x0e, 0x0d,
+ 0xec, 0x33, 0x25, 0xce, 0xc0, 0xf6, 0xe0, 0xef, 0xaf, 0xfe, 0x01, 0x21,
+ 0xfd, 0xeb, 0x0f, 0x0c,
+ 0x4d, 0x30, 0x40, 0x0b, 0x3f, 0x70, 0x10, 0x0c, 0x01, 0x24, 0x20, 0x0e,
+ 0xed, 0x00, 0x42, 0x3c,
+ 0x0a, 0x3d, 0x4d, 0x5d, 0x20, 0x39, 0x3e, 0x3e, 0x30, 0x4f, 0x1d, 0x0d,
+ 0x44, 0x44, 0xee, 0xa9,
+ 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xe1, 0x00, 0xf2, 0x0f, 0xdc, 0x10, 0x1f,
+ 0xae, 0xf0, 0x11, 0xac,
+ 0xec, 0xe0, 0x0f, 0xaa, 0xfe, 0x00, 0x1f, 0xec, 0xff, 0x0f, 0x0f, 0x00,
+ 0xde, 0xef, 0xca, 0xfe,
+ 0xff, 0xad, 0xca, 0xee, 0xd0, 0xe0, 0xbd, 0xdb, 0xce, 0xf0, 0xee, 0xde,
+ 0xee, 0x00, 0xcf, 0xed,
+ 0xdd, 0xcc, 0x0e, 0xec, 0xda, 0x8d, 0x0e, 0xed, 0xda, 0xff, 0xfd, 0xfc,
+ 0xff, 0x0e, 0xff, 0xdc,
+ 0xed, 0xfd, 0x2e, 0x1e, 0x89, 0xee, 0x0f, 0xfe, 0xed, 0xec, 0x30, 0x2f,
+ 0xfc, 0xdd, 0x0e, 0x0c,
+ 0xdd, 0xfe, 0xcd, 0xcc, 0x2f, 0x1d, 0x8b, 0xae, 0xff, 0xff, 0xdb, 0xff,
+ 0xef, 0xde, 0xce, 0xfd,
+ 0xde, 0xde, 0xcd, 0xef, 0xff, 0xcf, 0xbd, 0xfd, 0xf0, 0xd3, 0xee, 0xef,
+ 0xf2, 0xcb, 0xec, 0x0f,
+ 0x00, 0xc2, 0xd6, 0xe3, 0xd2, 0x80, 0xd0, 0xd1, 0xe4, 0xb1, 0xe0, 0xd0,
+ 0xd6, 0xf2, 0xe1, 0xd0,
+ 0xd2, 0xe7, 0xd1, 0xd1, 0xf1, 0xd2, 0x8e, 0xff, 0x10, 0x1c, 0xfa, 0xd0,
+ 0xdf, 0xd0, 0x8b, 0xde,
+ 0xe0, 0xef, 0xcb, 0xef, 0x0e, 0xfe, 0x0f, 0x1c, 0x1e, 0x20, 0x30, 0x0f,
+ 0xfd, 0x0f, 0x2f, 0x0c,
+ 0x0e, 0x13, 0x04, 0xaf, 0xec, 0xee, 0x00, 0xdd, 0xfb, 0x70, 0x71, 0x1b,
+ 0x0c, 0x20, 0x20, 0x10,
+ 0x0c, 0x1f, 0x21, 0x31, 0x0d, 0x1d, 0x61, 0x21, 0xfe, 0xff, 0xf3, 0x0f,
+ 0x0c, 0x01, 0x07, 0x11,
+ 0x10, 0x11, 0x64, 0x04, 0x01, 0x01, 0xf4, 0x56, 0x62, 0x03, 0xf3, 0x04,
+ 0x04, 0x03, 0xf2, 0xf4,
+ 0xe4, 0xd3, 0xe4, 0xf3, 0x05, 0x01, 0xf3, 0x72, 0x73, 0x31, 0x14, 0x33,
+ 0x23, 0x24, 0x21, 0x03,
+ 0x43, 0x34, 0x22, 0x13, 0x34, 0x34, 0x22, 0x35, 0xf1, 0xe1, 0x12, 0x33,
+ 0x32, 0x52, 0x42, 0x31,
+ 0x71, 0x63, 0x24, 0x33, 0x23, 0x37, 0x43, 0x32, 0x42, 0x13, 0x43, 0x45,
+ 0x23, 0x12, 0x21, 0x44,
+ 0x11, 0x32, 0x30, 0x72, 0x32, 0x31, 0x20, 0x30, 0x41, 0x13, 0x31, 0x43,
+ 0x21, 0x31, 0x20, 0x37,
+ 0x35, 0x1e, 0x2e, 0x51, 0x33, 0x20, 0x2d, 0x63, 0x12, 0x2f, 0x24, 0x10,
+ 0x2f, 0x0b, 0x20, 0x20,
+ 0x31, 0x32, 0x45, 0x54, 0x11, 0x56, 0x00, 0x2b, 0x1f, 0x30, 0x41, 0x00,
+ 0x10, 0x0f, 0x20, 0x00,
+ 0x20, 0x10, 0x11, 0x01, 0x07, 0x13, 0x00, 0x00, 0x07, 0xf2, 0xc3, 0xf3,
+ 0x13, 0x33, 0xe2, 0xc1,
+ 0x43, 0x16, 0xc1, 0xa1, 0x03, 0xd2, 0xa0, 0xd0, 0xe2, 0xe7, 0xf0, 0xcf,
+ 0xe0, 0xf0, 0xd0, 0x00,
+ 0x61, 0x21, 0x0e, 0x00, 0xf2, 0xf3, 0xdc, 0x0e, 0x22, 0x57, 0x61, 0x4e,
+ 0x3f, 0x3f, 0x3f, 0x7e,
+ 0x10, 0x2f, 0x20, 0x10, 0x24, 0x12, 0x08, 0x2d, 0x0f, 0x24, 0x10, 0x1c,
+ 0x40, 0x22, 0x50, 0x2b,
+ 0x1c, 0x1e, 0x2f, 0x00, 0xfd, 0x00, 0x42, 0xdc, 0xee, 0x4d, 0x7d, 0x1c,
+ 0x0b, 0x00, 0x02, 0x4e,
+ 0x2c, 0x0c, 0x0c, 0xfd, 0xed, 0xde, 0xdc, 0xbc, 0xbe, 0xe2, 0xd7, 0xb3,
+ 0xc0, 0xd1, 0xd2, 0xe2,
+ 0xd1, 0xd3, 0x05, 0x01, 0x00, 0x0f, 0xb0, 0x04, 0x02, 0xf0, 0xcc, 0xcd,
+ 0xef, 0xc0, 0xc0, 0xde,
+ 0xca, 0xde, 0xf0, 0xd1, 0xb2, 0xed, 0xdc, 0xff, 0xdf, 0xdb, 0xee, 0xe1,
+ 0xd1, 0xb0, 0xd6, 0xf4,
+ 0xb3, 0xd0, 0xb2, 0x06, 0xf1, 0xef, 0xf0, 0x01, 0xe1, 0xd0, 0xec, 0xe0,
+ 0x00, 0xe0, 0x0d, 0xdc,
+ 0x8c, 0xbd, 0x0f, 0xdf, 0xef, 0xb0, 0x0f, 0xd8, 0x0d, 0x40, 0x20, 0x0d,
+ 0xca, 0x00, 0x10, 0xfc,
+ 0xfe, 0xde, 0xdf, 0xaf, 0xee, 0xfe, 0xfe, 0xdc, 0xdd, 0xdd, 0xad, 0xe0,
+ 0xee, 0xcb, 0xbc, 0xef,
+ 0xf0, 0xde, 0xee, 0xe0, 0xf0, 0xde, 0xe1, 0xef, 0xfa, 0x0f, 0xfa, 0xbe,
+ 0xff, 0xff, 0xda, 0xbd,
+ 0xee, 0xfe, 0xe0, 0xbe, 0xcb, 0xef, 0xe0, 0xdf, 0xce, 0xed, 0xbc, 0xee,
+ 0xed, 0xfe, 0xbb, 0xeb,
+ 0xfe, 0xdc, 0xed, 0xec, 0xff, 0xdc, 0xce, 0xc0, 0xef, 0xce, 0xcc, 0xef,
+ 0xe0, 0xfe, 0xfc, 0x0b,
+ 0x1e, 0x1f, 0x0e, 0x0d, 0x0d, 0xeb, 0x0e, 0x2d, 0x3c, 0x0d, 0xbd, 0xee,
+ 0xcd, 0xdf, 0xcd, 0xdd,
+ 0x2c, 0x2e, 0x8d, 0xee, 0xed, 0x1a, 0x0e, 0xed, 0xde, 0xcb, 0xcd, 0xbe,
+ 0xbd, 0xdb, 0xd0, 0xef,
+ 0xdc, 0xdc, 0xff, 0x4e, 0x0e, 0x2f, 0x30, 0x1d, 0x1d, 0x4d, 0x0b, 0xfd,
+ 0xdb, 0xee, 0xfc, 0xae,
+ 0xdc, 0xd0, 0xcf, 0xbe, 0xdc, 0xde, 0xdd, 0xee, 0x0f, 0x10, 0x3e, 0x0c,
+ 0x00, 0xe1, 0xde, 0x89,
+ 0xe0, 0x00, 0x00, 0xee, 0xc1, 0x03, 0xef, 0xcc, 0xde, 0xec, 0x0f, 0xfd,
+ 0x3c, 0x0d, 0xca, 0x0e,
+ 0xee, 0xbe, 0xee, 0x00, 0xdf, 0xed, 0x0e, 0xfb, 0x4e, 0x70, 0x7e, 0x3c,
+ 0x3e, 0x2d, 0x0b, 0x60,
+ 0x1e, 0x1e, 0x0b, 0x1f, 0x0e, 0x20, 0xfd, 0xfa, 0x30, 0x5e, 0x00, 0x13,
+ 0x10, 0x09, 0x2f, 0x20,
+ 0x1e, 0x0f, 0x0d, 0x32, 0x33, 0xd0, 0xaf, 0x14, 0x16, 0xd0, 0x13, 0x74,
+ 0x72, 0x21, 0x13, 0x33,
+ 0x44, 0x23, 0x00, 0x01, 0x13, 0x16, 0xf3, 0xb0, 0xe2, 0xe5, 0xe5, 0xe1,
+ 0xd3, 0xc2, 0xe4, 0xf1,
+ 0x24, 0x72, 0x23, 0x34, 0x31, 0x01, 0xf2, 0x31, 0x34, 0x00, 0xf4, 0x13,
+ 0x04, 0x90, 0xd1, 0xe0,
+ 0xb1, 0x00, 0x00, 0x40, 0x2f, 0x40, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x02,
+ 0x0b, 0x2f, 0x05, 0xf7,
+ 0xe1, 0x53, 0x12, 0x12, 0x33, 0x71, 0x71, 0x01, 0x20, 0x32, 0x34, 0x33,
+ 0x45, 0x20, 0x23, 0x34,
+ 0x31, 0x42, 0x33, 0x25, 0x11, 0x23, 0x65, 0x11, 0x30, 0x12, 0x52, 0x21,
+ 0x20, 0x21, 0x24, 0x31,
+ 0x10, 0x45, 0x03, 0x36, 0x12, 0x12, 0x64, 0x21, 0x22, 0x23, 0x04, 0x24,
+ 0x34, 0x02, 0x04, 0xf4,
+ 0xf5, 0xe1, 0xc2, 0xf3, 0xd3, 0x81, 0xf2, 0x03, 0x05, 0x51, 0x34, 0x42,
+ 0x32, 0x52, 0x13, 0x03,
+ 0x24, 0x22, 0xf2, 0x04, 0x14, 0x02, 0xb3, 0xd0, 0xf4, 0xe2, 0xf2, 0x00,
+ 0x01, 0x50, 0x30, 0x53,
+ 0x21, 0x11, 0x25, 0x36, 0x00, 0x21, 0x21, 0x62, 0x03, 0x03, 0x06, 0xf1,
+ 0xe0, 0x11, 0x73, 0x32,
+ 0x30, 0x52, 0x31, 0x42, 0x30, 0x5f, 0x11, 0x30, 0x2e, 0x30, 0x35, 0x32,
+ 0x2f, 0x2d, 0x2b, 0x5e,
+ 0x3a, 0x3d, 0x5f, 0x21, 0x12, 0x2c, 0x2e, 0x4e, 0x0c, 0x10, 0x0f, 0x0e,
+ 0xfe, 0xfd, 0xde, 0x1e,
+ 0x2d, 0x7c, 0x5e, 0x0d, 0x2e, 0x28, 0x2d, 0x2d, 0x2e, 0x3a, 0x5e, 0x1e,
+ 0x1d, 0x0a, 0x0f, 0x0e,
+ 0x0e, 0xcc, 0x00, 0x03, 0x30, 0xfb, 0xdf, 0xf0, 0xc0, 0x01, 0x73, 0x50,
+ 0x0e, 0x02, 0x07, 0xb0,
+ 0xf0, 0xe0, 0xd3, 0xe4, 0xd1, 0xe0, 0xf0, 0xf5, 0xf1, 0x00, 0xb0, 0xdf,
+ 0xb0, 0xe0, 0xcd, 0xcc,
+ 0xef, 0xcc, 0xee, 0xf0, 0xed, 0xea, 0x0d, 0xfe, 0x0d, 0x2f, 0x0f, 0x42,
+ 0x01, 0x18, 0x40, 0x3d,
+ 0x0c, 0x1f, 0x3f, 0x00, 0x00, 0x1c, 0x4d, 0x0f, 0x0f, 0x1d, 0x19, 0x1e,
+ 0x0c, 0x4f, 0x7c, 0x0d,
+ 0x1c, 0x2f, 0xd0, 0x80, 0xd0, 0xef, 0xff, 0xd0, 0xb8, 0xff, 0xfe, 0x21,
+ 0x30, 0xfb, 0x2f, 0x2d,
+ 0x6f, 0x3d, 0x4d, 0x3c, 0x0d, 0xee, 0xcf, 0xc0, 0xc0, 0xe1, 0x01, 0x01,
+ 0x10, 0x00, 0x1b, 0x00,
+ 0x33, 0xfa, 0x58, 0xdb, 0x6d, 0xfd, 0xc6, 0xd8, 0xe0, 0xe7, 0x23, 0x30,
+ 0x2e, 0x73, 0x70, 0x2b,
+ 0x1e, 0x31, 0x32, 0x1a, 0x2d, 0x00, 0xf0, 0xe0, 0x00, 0xef, 0xda, 0xaf,
+ 0xee, 0x02, 0xff, 0x4a,
+ 0x2f, 0x0e, 0x00, 0xf1, 0x82, 0xd2, 0xe2, 0xf6, 0x01, 0x01, 0x31, 0x00,
+ 0x51, 0x77, 0x21, 0x0f,
+ 0x0e, 0x11, 0x41, 0x0e, 0xfd, 0xef, 0x0f, 0xf0, 0xc0, 0xf1, 0xe0, 0xcd,
+ 0xc8, 0x00, 0x40, 0xeb,
+ 0xed, 0x60, 0x4f, 0x3d, 0x0b, 0x20, 0x02, 0x13, 0xd0, 0xd0, 0xe0, 0x04,
+ 0xa0, 0x0f, 0xf0, 0xe1,
+ 0xcf, 0xdc, 0xd0, 0xdf, 0xf1, 0xdf, 0x02, 0x37, 0x61, 0x2d, 0x01, 0x07,
+ 0x06, 0x00, 0x40, 0x00,
+ 0xbf, 0x10, 0x13, 0x0d, 0x0d, 0x2e, 0x70, 0x42, 0x10, 0x2c, 0x2f, 0x04,
+ 0xf5, 0xdf, 0xed, 0x24,
+ 0x52, 0xe0, 0xed, 0xdf, 0xdc, 0x10, 0xf0, 0xfd, 0xee, 0x88, 0xde, 0x3f,
+ 0x50, 0xff, 0xe1, 0xf7,
+ 0xf1, 0xc0, 0x02, 0xf2, 0x8c, 0xff, 0x12, 0x22, 0x1f, 0x0a, 0x30, 0x52,
+ 0x00, 0x0d, 0x72, 0x00,
+ 0x1a, 0x1f, 0x13, 0x14, 0x00, 0xe0, 0x00, 0x35, 0x00, 0xc0, 0x00, 0x23,
+ 0x00, 0xcc, 0xf1, 0xf2,
+ 0xc0, 0xd0, 0xbe, 0xde, 0xcf, 0xfe, 0xdd, 0xeb, 0xe0, 0xd1, 0xe0, 0x33,
+ 0x52, 0x24, 0x60, 0x30,
+ 0x27, 0x13, 0x1d, 0x0a, 0xff, 0x0d, 0x11, 0x00, 0xff, 0xea, 0xef, 0xd0,
+ 0xb1, 0xc0, 0xdc, 0xde,
+ 0x0d, 0x10, 0x20, 0x1f, 0xf0, 0x47, 0x77, 0x41, 0xd0, 0xe0, 0x00, 0x61,
+ 0x01, 0x20, 0x11, 0x02,
+ 0x12, 0x10, 0xfc, 0xfe, 0xe0, 0xf0, 0xfe, 0xea, 0xcd, 0xbc, 0xef, 0xf0,
+ 0xe1, 0xef, 0x3e, 0x61,
+ 0xf7, 0xd1, 0x00, 0x50, 0x60, 0x3e, 0x20, 0x01, 0xef, 0x42, 0x57, 0x02,
+ 0xcf, 0x0f, 0x0f, 0x01,
+ 0xc0, 0x02, 0xf0, 0x20, 0x34, 0x33, 0x40, 0xfd, 0xc0, 0xfc, 0xed, 0xe9,
+ 0xbd, 0xde, 0xe2, 0x17,
+ 0x07, 0xb1, 0xf1, 0x02, 0x00, 0x10, 0x7f, 0x2f, 0x10, 0x0d, 0x12, 0x02,
+ 0xf0, 0xcc, 0x11, 0x26,
+ 0xe0, 0xcc, 0x1f, 0x10, 0xd0, 0xc4, 0xd0, 0xd0, 0xee, 0x32, 0x40, 0x0e,
+ 0x20, 0x51, 0x47, 0x00,
+ 0x00, 0x00, 0x4d, 0x10, 0x0e, 0x10, 0x3f, 0x78, 0x30, 0x3e, 0x0e, 0xcc,
+ 0x20, 0x2e, 0x1d, 0x0c,
+ 0x1e, 0x0e, 0x0c, 0xfc, 0x90, 0xf2, 0xc0, 0xdf, 0x02, 0xf7, 0x03, 0x00,
+ 0xef, 0x01, 0xf4, 0xf0,
+ 0x00, 0x00, 0x30, 0x73, 0x53, 0x24, 0x14, 0x13, 0x00, 0x03, 0x01, 0x52,
+ 0x0e, 0x0a, 0x12, 0xd2,
+ 0x81, 0x0b, 0xfc, 0x00, 0x00, 0x6f, 0x2d, 0xfe, 0xe2, 0xe3, 0xff, 0xee,
+ 0xe1, 0xe3, 0xf4, 0x13,
+ 0x30, 0x40, 0x10, 0xb7, 0xe7, 0xc3, 0xf0, 0xc0, 0xd2, 0xc0, 0xe0, 0xe2,
+ 0xd1, 0x0e, 0x5f, 0x52,
+ 0x11, 0x1f, 0x15, 0x37, 0x44, 0x1e, 0x3d, 0x22, 0x03, 0xde, 0xca, 0x00,
+ 0xde, 0x0f, 0x0e, 0x0d,
+ 0x0e, 0xfb, 0x0f, 0x70, 0x7c, 0x2e, 0x0d, 0xd0, 0xfe, 0x1c, 0x70, 0x12,
+ 0x00, 0x1d, 0x03, 0xf4,
+ 0xce, 0xfd, 0xee, 0xd2, 0xf0, 0xb9, 0xe1, 0x07, 0xf2, 0x0e, 0x20, 0x70,
+ 0x3d, 0x3f, 0x31, 0x00,
+ 0x1f, 0x0d, 0x1d, 0x3f, 0x2d, 0x23, 0x07, 0x05, 0xa0, 0x0d, 0xe0, 0xdf,
+ 0xd2, 0xe3, 0xf1, 0xec,
+ 0xee, 0xab, 0xcf, 0xc0, 0xd2, 0xd2, 0xc1, 0xe7, 0xb3, 0x03, 0xf0, 0xfe,
+ 0x00, 0x15, 0x30, 0x42,
+ 0x10, 0xf1, 0xde, 0xeb, 0x0c, 0x5f, 0x0f, 0xde, 0x61, 0x21, 0x0b, 0xee,
+ 0x31, 0x17, 0x01, 0xf0,
+ 0xf1, 0x92, 0xd3, 0xb3, 0x00, 0x0d, 0xba, 0x10, 0x14, 0x03, 0xe0, 0x00,
+ 0x25, 0x75, 0x20, 0x00,
+ 0x00, 0x11, 0x10, 0x0d, 0x0f, 0xc0, 0xee, 0xc0, 0xfd, 0xd8, 0xee, 0x0d,
+ 0x50, 0x10, 0x2d, 0x40,
+ 0xff, 0xdf, 0x20, 0x70, 0x60, 0x0d, 0x2e, 0x01, 0x22, 0x0d, 0x1a, 0x20,
+ 0x00, 0xd3, 0x05, 0x11,
+ 0x00, 0x0f, 0x04, 0x04, 0x21, 0x30, 0x13, 0x01, 0xbb, 0xca, 0xaf, 0xe1,
+ 0xe5, 0xe0, 0xe0, 0xd0,
+ 0xc1, 0xd0, 0xd1, 0x13, 0x30, 0x1e, 0x74, 0x23, 0x2e, 0x08, 0x2b, 0x41,
+ 0x11, 0xf0, 0x00, 0xe0,
+ 0x81, 0xe1, 0xd1, 0xd2, 0xe0, 0xee, 0xe3, 0xe6, 0xa1, 0xe3, 0x04, 0x00,
+ 0xff, 0x0f, 0x24, 0x10,
+ 0x20, 0x71, 0x3e, 0x2a, 0x2f, 0x32, 0x15, 0xff, 0xed, 0x2d, 0x30, 0x0d,
+ 0x3e, 0x7f, 0xec, 0xbc,
+ 0xe0, 0xf0, 0xf0, 0x1b, 0x7e, 0x2e, 0x1f, 0x00, 0xff, 0x02, 0x03, 0x17,
+ 0x57, 0x01, 0x00, 0x20,
+ 0x12, 0xd2, 0x90, 0x0d, 0xf0, 0x00, 0x0c, 0xe0, 0x00, 0xff, 0xca, 0x20,
+ 0x50, 0x00, 0x3c, 0x3e,
+ 0x73, 0x24, 0x1f, 0x2d, 0x20, 0x04, 0xd0, 0xed, 0xec, 0xbd, 0xee, 0xcb,
+ 0x0e, 0xf0, 0xe0, 0x00,
+ 0xd2, 0x23, 0x23, 0x24, 0x14, 0x03, 0xb1, 0xe2, 0xf3, 0xb2, 0xc0, 0xf0,
+ 0xe5, 0xd2, 0xb1, 0x05,
+ 0x21, 0x2e, 0x2b, 0x0e, 0x13, 0x67, 0x35, 0x30, 0x3e, 0xf2, 0xd2, 0xe0,
+ 0x0c, 0x1e, 0xbe, 0xe0,
+ 0x01, 0x1f, 0x2c, 0x70, 0x70, 0x10, 0x05, 0xd1, 0xf0, 0xfb, 0x0f, 0x2f,
+ 0x30, 0xf1, 0xdf, 0xe1,
+ 0xf3, 0xbd, 0xb8, 0xef, 0xf0, 0xe1, 0xf0, 0xdd, 0x01, 0x26, 0x30, 0x2d,
+ 0x70, 0x7d, 0x1f, 0x2c,
+ 0x1e, 0x10, 0x23, 0x07, 0x01, 0x22, 0x33, 0x21, 0x01, 0x02, 0x55, 0x20,
+ 0x1b, 0x10, 0x02, 0xa0,
+ 0xcc, 0xce, 0xef, 0xd0, 0xd1, 0xf0, 0xff, 0xdd, 0xf1, 0xe2, 0x02, 0x07,
+ 0x75, 0x11, 0x14, 0x00,
+ 0x1e, 0x40, 0xf0, 0xde, 0x20, 0x51, 0x00, 0xf9, 0x3f, 0x40, 0x01, 0x0e,
+ 0xde, 0xef, 0xcf, 0x10,
+ 0x10, 0xdd, 0x9a, 0x00, 0x01, 0x25, 0x00, 0xb0, 0x01, 0xf2, 0x22, 0x10,
+ 0x32, 0x57, 0x02, 0x01,
+ 0xd2, 0x01, 0x10, 0x2e, 0x1e, 0x20, 0xde, 0x8d, 0xcf, 0xf0, 0xf1, 0xfc,
+ 0x0c, 0x30, 0x21, 0x00,
+ 0x4b, 0x3c, 0x1c, 0x0f, 0x1b, 0xee, 0xdf, 0x02, 0x74, 0x31, 0x20, 0x1d,
+ 0xe0, 0x04, 0xe4, 0xf1,
+ 0x2e, 0x5d, 0x10, 0x77, 0x51, 0x0a, 0x2d, 0x0f, 0x02, 0xc1, 0xfe, 0xfe,
+ 0xe0, 0xc5, 0x02, 0xf2,
+ 0xd1, 0xc0, 0xd0, 0xf0, 0xe4, 0xf1, 0x04, 0x06, 0x63, 0x32, 0x2d, 0x20,
+ 0x21, 0x11, 0x1f, 0xcc,
+ 0x8e, 0x00, 0x0e, 0xf1, 0xc2, 0x00, 0x01, 0xf0, 0xf0, 0x06, 0x34, 0x00,
+ 0x0e, 0x91, 0xe7, 0xe5,
+ 0xe0, 0x00, 0x30, 0x7f, 0x1d, 0x3f, 0x00, 0x0e, 0xec, 0xfc, 0x1e, 0x5d,
+ 0x3c, 0x3e, 0x30, 0xf0,
+ 0xfb, 0x0f, 0x6f, 0x0c, 0xdc, 0xe0, 0x0f, 0xfd, 0xde, 0xdf, 0xec, 0xff,
+ 0xd0, 0x04, 0x03, 0xce,
+ 0x00, 0x77, 0x57, 0x00, 0x00, 0x03, 0xf0, 0xe0, 0xe0, 0xd0, 0x03, 0x7f,
+ 0x1f, 0x53, 0x22, 0x10,
+ 0x1f, 0x22, 0x24, 0x2c, 0xfd, 0xdf, 0x0f, 0x0d, 0x5b, 0xfe, 0xfd, 0x0f,
+ 0xff, 0x12, 0x64, 0x0f,
+ 0xed, 0xc1, 0xb4, 0xe2, 0xf6, 0x83, 0xe2, 0xe5, 0xd1, 0x04, 0xe1, 0xff,
+ 0x01, 0x16, 0x10, 0x23,
+ 0x62, 0x12, 0x42, 0x10, 0x10, 0x01, 0xf4, 0xe5, 0xd0, 0xcf, 0xbd, 0xf2,
+ 0x03, 0xec, 0x08, 0xec,
+ 0x1f, 0x6e, 0x20, 0x3d, 0x6e, 0x10, 0x23, 0x1e, 0x29, 0x00, 0x0e, 0x0e,
+ 0xe0, 0x0f, 0xe2, 0xe2,
+ 0xd3, 0xc1, 0xce, 0xbd, 0xef, 0xef, 0xe1, 0x05, 0x6e, 0x18, 0x2e, 0x2f,
+ 0xf0, 0xf0, 0x0f, 0x40,
+ 0x22, 0x1c, 0x30, 0x30, 0x2e, 0x5e, 0x56, 0x34, 0x1f, 0x20, 0x13, 0x04,
+ 0xc0, 0xdc, 0x00, 0x12,
+ 0x00, 0xce, 0xdf, 0xef, 0xd0, 0xd0, 0xe7, 0xd7, 0x80, 0xee, 0xff, 0xcf,
+ 0xc0, 0xe1, 0xc3, 0xd0,
+ 0x02, 0x01, 0x1f, 0xee, 0xe0, 0x37, 0x51, 0x1f, 0x4d, 0x4e, 0x3e, 0x32,
+ 0x44, 0xef, 0xc8, 0xde,
+ 0xd2, 0x04, 0xb0, 0xdd, 0xf0, 0xd5, 0xc1, 0x05, 0x10, 0x20, 0x33, 0x51,
+ 0x61, 0x20, 0x1f, 0x01,
+ 0xe4, 0xf1, 0xd1, 0xf0, 0xf3, 0xb1, 0xd0, 0xeb, 0xbe, 0x0f, 0x00, 0x0c,
+ 0x1e, 0x6e, 0x00, 0x2b,
+ 0x1b, 0x2d, 0x2d, 0x1c, 0x2c, 0x2d, 0xff, 0x00, 0x00, 0x44, 0xe1, 0xd2,
+ 0x2f, 0x7c, 0x51, 0x44,
+ 0x20, 0x29, 0x1f, 0x2f, 0x31, 0x22, 0xf0, 0xd0, 0x01, 0x04, 0x80, 0xf0,
+ 0xb0, 0xf1, 0xf7, 0xf3,
+ 0x00, 0x30, 0x50, 0x1c, 0x0f, 0x20, 0xff, 0xea, 0x0e, 0x10, 0x12, 0x01,
+ 0xd2, 0xc0, 0xf2, 0xc6,
+ 0xf1, 0xd0, 0xcf, 0xfe, 0xef, 0xd1, 0xd3, 0xc4, 0xc7, 0xd1, 0xc0, 0xe0,
+ 0xb0, 0xd0, 0xe1, 0xf0,
+ 0x23, 0x67, 0x32, 0x42, 0x20, 0x0f, 0x2f, 0x1f, 0x0d, 0xff, 0xf1, 0xa0,
+ 0xff, 0xfe, 0x10, 0xfe,
+ 0xe0, 0x5c, 0x5a, 0x2e, 0x20, 0x3f, 0x3e, 0x50, 0x23, 0x34, 0x0e, 0xf9,
+ 0xc1, 0x05, 0xe4, 0xb0,
+ 0xc0, 0xef, 0xcd, 0xce, 0xe1, 0xd2, 0x00, 0x2d, 0x2b, 0x4e, 0x50, 0x10,
+ 0x29, 0x2e, 0x10, 0x30,
+ 0x41, 0x1e, 0x04, 0xa4, 0x00, 0x00, 0x0e, 0x08, 0xff, 0x4e, 0x3e, 0x1f,
+ 0x1f, 0x20, 0x43, 0x00,
+ 0x1a, 0x0f, 0xdd, 0x90, 0xe1, 0xe4, 0xc2, 0xc0, 0xd1, 0xce, 0x00, 0xff,
+ 0x0e, 0x30, 0x71, 0x07,
+ 0x13, 0x24, 0xf1, 0xe5, 0xe0, 0x0e, 0xf0, 0xc2, 0xe5, 0xe1, 0xe0, 0xfd,
+ 0xe0, 0x15, 0x20, 0x00,
+ 0x70, 0x50, 0x32, 0x11, 0x1c, 0x1c, 0x00, 0x00, 0x0f, 0xdd, 0x14, 0x03,
+ 0xe7, 0xf7, 0xe0, 0x0e,
+ 0xe0, 0x8f, 0xb0, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0xfd, 0xdf, 0xbc, 0xed,
+ 0xdf, 0x0e, 0xfb, 0x1d,
+ 0x60, 0x44, 0x43, 0x21, 0x34, 0x53, 0x21, 0x45, 0x10, 0x2e, 0xef, 0xe2,
+ 0x04, 0xe0, 0x0e, 0xed,
+ 0xcf, 0x0c, 0xff, 0x1e, 0x2e, 0xfd, 0xae, 0xff, 0xf1, 0xf7, 0x03, 0xe3,
+ 0xf0, 0x07, 0xe5, 0x90,
+ 0xd0, 0xf0, 0xe1, 0xd0, 0xec, 0x7f, 0x70, 0x10, 0x00, 0x0f, 0x09, 0x0d,
+ 0x0c, 0x1f, 0x00, 0x00,
+ 0xbe, 0xf0, 0xe0, 0xf2, 0xf4, 0xe0, 0xf0, 0xf1, 0x14, 0x20, 0x4d, 0x40,
+ 0x14, 0x00, 0x01, 0x03,
+ 0xa2, 0xe6, 0xe3, 0xd6, 0xd1, 0xb1, 0xf5, 0x01, 0x10, 0x4e, 0x30, 0x20,
+ 0x5f, 0x2d, 0x6e, 0x30,
+ 0x0e, 0xea, 0xe0, 0xe0, 0xe0, 0xce, 0xcc, 0xe0, 0xe1, 0x0e, 0x0e, 0xf6,
+ 0x14, 0x71, 0x4f, 0x2d,
+ 0x20, 0x31, 0x21, 0x0a, 0xfd, 0x0f, 0x03, 0xf1, 0xd0, 0xc0, 0xf0, 0xef,
+ 0xc0, 0xfe, 0x02, 0x43,
+ 0x02, 0x25, 0x73, 0x11, 0x1f, 0x07, 0x15, 0x01, 0xb0, 0xde, 0xde, 0xf0,
+ 0xe7, 0x01, 0xff, 0x0d,
+ 0x41, 0x20, 0x1f, 0x3d, 0x6f, 0x1e, 0x10, 0xe0, 0xe7, 0xe6, 0xb0, 0xc3,
+ 0xe0, 0xf2, 0xaf, 0xe0,
+ 0xe0, 0x0c, 0x0e, 0x5e, 0x41, 0x43, 0x13, 0x03, 0xff, 0xf0, 0xf0, 0x05,
+ 0xd3, 0xfc, 0x2a, 0x5f,
+ 0x0d, 0xfb, 0x0e, 0x0c, 0x5d, 0x1e, 0x6e, 0x1d, 0x0c, 0x0f, 0x11, 0xf5,
+ 0xe1, 0x00, 0xe1, 0xe3,
+ 0xd3, 0xc2, 0xb0, 0xe4, 0xbe, 0xe0, 0x02, 0x06, 0x40, 0x1e, 0x3f, 0x24,
+ 0x06, 0x20, 0xff, 0x01,
+ 0x05, 0x00, 0x0e, 0x21, 0x33, 0x70, 0x70, 0x4c, 0x0f, 0x2d, 0x1d, 0x4d,
+ 0x1e, 0x2e, 0x00, 0xb5,
+ 0xe1, 0xdf, 0xf0, 0xc0, 0xb0, 0xf3, 0xe3, 0x00, 0xfb, 0x0e, 0x0e, 0x46,
+ 0x25, 0x14, 0x32, 0x01,
+ 0x11, 0x41, 0x00, 0x04, 0xc6, 0xd2, 0xe0, 0xb1, 0xc0, 0xe2, 0xc1, 0xf0,
+ 0x09, 0x0e, 0x4f, 0x4f,
+ 0x3e, 0x2e, 0x3f, 0x3e, 0x4f, 0x3d, 0x10, 0x11, 0xea, 0xbe, 0xfe, 0xee,
+ 0xe0, 0x00, 0xf3, 0x22,
+ 0x31, 0x0c, 0x8d, 0xe0, 0x07, 0x01, 0x00, 0x0f, 0xcf, 0xff, 0x00, 0xea,
+ 0xdf, 0xec, 0x3d, 0x6e,
+ 0x1a, 0xff, 0x2e, 0x5f, 0x22, 0x33, 0x36, 0x32, 0x00, 0x01, 0x0f, 0x6c,
+ 0x40, 0x22, 0x34, 0x20,
+ 0xe0, 0xdf, 0xf0, 0x3e, 0x70, 0x4f, 0xed, 0xbd, 0xec, 0xdc, 0xd0, 0xd3,
+ 0xb7, 0xf7, 0xd1, 0xf0,
+ 0xee, 0xd0, 0xf0, 0x1e, 0x30, 0x50, 0x39, 0x1f, 0x00, 0x3f, 0x20, 0x60,
+ 0x10, 0x00, 0xad, 0xf5,
+ 0x02, 0xc0, 0xf2, 0x04, 0x26, 0x30, 0x1e, 0x2e, 0x10, 0x00, 0xef, 0x1f,
+ 0x40, 0xf3, 0x06, 0xf6,
+ 0xd0, 0x92, 0xb1, 0xe2, 0xf1, 0xe0, 0x01, 0x00, 0xff, 0xfd, 0xe0, 0x12,
+ 0x3f, 0x6c, 0x40, 0x2e,
+ 0x1a, 0x0d, 0xfd, 0xf0, 0xf0, 0xf0, 0xe0, 0xef, 0xef, 0x39, 0x7c, 0x4b,
+ 0x7f, 0x2f, 0x10, 0x1d,
+ 0x10, 0x11, 0x24, 0xf4, 0x01, 0x30, 0x01, 0xc2, 0xe2, 0x13, 0x01, 0xbf,
+ 0xfc, 0x0c, 0x70, 0x20,
+ 0x08, 0x00, 0x32, 0x12, 0x1f, 0x1e, 0x00, 0xd5, 0x03, 0x72, 0x00, 0xbb,
+ 0x00, 0xf0, 0xc0, 0xef,
+ 0xef, 0xd0, 0xdc, 0xef, 0x0e, 0x22, 0x01, 0x12, 0xf7, 0xd6, 0xc0, 0xa0,
+ 0x01, 0x11, 0xf0, 0xce,
+ 0x10, 0x14, 0xe0, 0xc0, 0xf0, 0xe2, 0x81, 0xf1, 0xf3, 0xe0, 0xff, 0xe0,
+ 0x00, 0x03, 0x70, 0x38,
+ 0x6e, 0x2c, 0x1d, 0x2d, 0x1c, 0x30, 0x11, 0x13, 0x0c, 0x0f, 0x01, 0xd7,
+ 0x07, 0xd0, 0xa0, 0xef,
+ 0xb0, 0xef, 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0xee, 0xf0, 0x20, 0x00, 0xf0,
+ 0x45, 0x21, 0x12, 0xf3,
+ 0x12, 0x53, 0x11, 0x50, 0x5c, 0x2d, 0x3e, 0x40, 0x30, 0x48, 0x4f, 0x3f,
+ 0x10, 0x1f, 0x0d, 0xcd,
+ 0xfb, 0xde, 0x00, 0xee, 0xef, 0xce, 0xdf, 0x92, 0xb5, 0xe0, 0x00, 0x0e,
+ 0x2c, 0x3f, 0x4f, 0x03,
+ 0xb6, 0xf3, 0xe4, 0x00, 0xf0, 0xc2, 0x07, 0xf3, 0xd1, 0x00, 0xf0, 0x07,
+ 0x20, 0x5e, 0x2f, 0x20,
+ 0x00, 0x00, 0x2f, 0x41, 0xf3, 0x00, 0x50, 0x3d, 0x2f, 0x20, 0x47, 0x24,
+ 0xf2, 0xc0, 0x20, 0x2c,
+ 0xe1, 0xc4, 0xed, 0xfe, 0x91, 0xe1, 0xbc, 0xea, 0xce, 0xde, 0x0c, 0x0c,
+ 0x00, 0x24, 0x1f, 0x1c,
+ 0x5f, 0x20, 0x21, 0x32, 0x33, 0x43, 0x25, 0x31, 0x10, 0x60, 0x11, 0x10,
+ 0x00, 0xdd, 0x0d, 0x4e,
+ 0x7e, 0x3e, 0x1c, 0x1d, 0x3d, 0xfe, 0xd0, 0xc7, 0xd2, 0xcf, 0xdf, 0xf2,
+ 0x17, 0x05, 0x02, 0xd3,
+ 0xb2, 0xc0, 0xee, 0x0e, 0x0e, 0x0d, 0x1f, 0x3c, 0x0b, 0xde, 0xdf, 0x40,
+ 0x72, 0x32, 0xfe, 0x0f,
+ 0x23, 0xf2, 0x0d, 0x68, 0x3f, 0x0e, 0xed, 0x0d, 0x4d, 0xde, 0x8f, 0xff,
+ 0xed, 0xdc, 0xbe, 0x05,
+ 0x07, 0x05, 0x02, 0xf2, 0x13, 0x31, 0x30, 0x2f, 0x21, 0x34, 0x61, 0x42,
+ 0x00, 0xee, 0xff, 0xef,
+ 0xe0, 0xad, 0xfe, 0x0e, 0xfd, 0xd1, 0x26, 0x50, 0x1f, 0x1f, 0x03, 0xf2,
+ 0x08, 0x0e, 0x0f, 0xde,
+ 0xfe, 0x3b, 0x3e, 0x4f, 0x30, 0x10, 0xbf, 0xe0, 0x61, 0x30, 0x03, 0xe2,
+ 0x00, 0x0d, 0xd0, 0x00,
+ 0x52, 0x75, 0x37, 0x02, 0x00, 0x31, 0x00, 0xdf, 0xb1, 0xe4, 0xe1, 0x00,
+ 0x20, 0x0e, 0xee, 0x10,
+ 0x31, 0xcd, 0xc9, 0xf0, 0x00, 0x34, 0xf3, 0x80, 0xbe, 0x02, 0x20, 0xfb,
+ 0xed, 0xff, 0x06, 0x01,
+ 0x51, 0x04, 0x04, 0xd2, 0xe1, 0xe0, 0x81, 0xf0, 0xe1, 0x13, 0x0f, 0x0b,
+ 0x1e, 0x09, 0xfd, 0x20,
+ 0x72, 0x4e, 0x09, 0x0e, 0x3d, 0x3c, 0x1d, 0x10, 0x30, 0x30, 0x00, 0xe0,
+ 0x03, 0xf1, 0xff, 0xff,
+ 0x10, 0xf0, 0x8b, 0x0c, 0x01, 0xc1, 0xd1, 0xd0, 0xd6, 0xb3, 0xf0, 0xf0,
+ 0xe0, 0xc2, 0xc0, 0x03,
+ 0x04, 0x22, 0x67, 0x47, 0x30, 0x20, 0x00, 0x0e, 0x70, 0x10, 0x00, 0x2f,
+ 0x2f, 0x0f, 0x1f, 0x0e,
+ 0xe0, 0xef, 0xbd, 0xfd, 0xe0, 0xb0, 0x02, 0xfd, 0x03, 0x07, 0x56, 0x20,
+ 0x00, 0x01, 0x21, 0x00,
+ 0xa1, 0xf1, 0xe7, 0xe1, 0xd2, 0xd1, 0xa2, 0xf3, 0x06, 0xf0, 0x0e, 0x1f,
+ 0x02, 0x13, 0x2f, 0x0c,
+ 0x2c, 0x5e, 0x1d, 0x0d, 0x0c, 0xfe, 0x20, 0x0e, 0x1d, 0x1a, 0x0f, 0x0f,
+ 0x51, 0x76, 0x62, 0x00,
+ 0xef, 0x0f, 0x31, 0xef, 0xfb, 0x00, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x50, 0xf3, 0x53, 0x45, 0x90, 0xf3, 0xf8, 0x46, 0xf8, 0x40, 0x10, 0xdb,
+ 0x90, 0x0f, 0x00, 0x1d,
+ 0x3f, 0x3f, 0x00, 0xde, 0xee, 0x21, 0x77, 0x72, 0x42, 0x05, 0x21, 0x01,
+ 0x02, 0x21, 0x20, 0x1e,
+ 0x23, 0x13, 0xe9, 0xaf, 0xf1, 0xf5, 0xe1, 0xc0, 0xe0, 0xc2, 0xd0, 0xf0,
+ 0xd1, 0xe1, 0xc0, 0x00,
+ 0xf4, 0x0e, 0x7b, 0x0d, 0x00, 0x00, 0x0b, 0xcd, 0x01, 0xf3, 0xf1, 0xcd,
+ 0x0d, 0x13, 0x56, 0x31,
+ 0x43, 0x07, 0x02, 0x1f, 0x5c, 0x0f, 0x0e, 0x00, 0xe1, 0xf3, 0xc0, 0xc2,
+ 0xc6, 0xe3, 0xd0, 0xb0,
+ 0xf2, 0xf6, 0x02, 0x04, 0x30, 0x22, 0x40, 0xf0, 0xd0, 0x02, 0xe0, 0x0e,
+ 0x19, 0x00, 0x1e, 0x7f,
+ 0x3d, 0x0d, 0xef, 0x2f, 0x3c, 0x7a, 0x5f, 0x1e, 0x3d, 0x0e, 0x0a, 0xff,
+ 0xf1, 0xe3, 0xe0, 0x0d,
+ 0x1f, 0xfd, 0xd0, 0x03, 0x54, 0x10, 0x10, 0x21, 0x6f, 0x6b, 0x2f, 0x10,
+ 0x14, 0x44, 0x40, 0x2e,
+ 0x0c, 0xf0, 0x01, 0x03, 0xd4, 0xb2, 0xf7, 0xc1, 0xd0, 0x00, 0xf1, 0x01,
+ 0xf0, 0x20, 0x10, 0xee,
+ 0xce, 0x04, 0x06, 0xb0, 0xeb, 0x0f, 0x31, 0xe3, 0xb0, 0x01, 0x15, 0xc3,
+ 0xd2, 0xe3, 0xd1, 0xd1,
+ 0xc6, 0xf3, 0xe2, 0x80, 0xc0, 0xbd, 0xdf, 0xf0, 0x0d, 0xed, 0x18, 0x6b,
+ 0x40, 0x40, 0x20, 0x03,
+ 0x10, 0x12, 0x02, 0xf0, 0x11, 0x42, 0x04, 0x04, 0x20, 0x0f, 0xdb, 0xa0,
+ 0x00, 0xf1, 0xfc, 0x0b,
+ 0xef, 0x0e, 0x30, 0xff, 0xea, 0x0d, 0x00, 0xe0, 0x81, 0xf3, 0xe1, 0xd0,
+ 0xe1, 0xe4, 0xf0, 0x04,
+ 0x43, 0x52, 0x6f, 0x2a, 0x3f, 0x3f, 0x3e, 0x2a, 0x4c, 0x2d, 0x00, 0x1f,
+ 0x00, 0xd1, 0xce, 0xfd,
+ 0xeb, 0xdf, 0xf2, 0x30, 0x3a, 0xe0, 0xd0, 0x11, 0x00, 0x8e, 0xdc, 0xb0,
+ 0xe2, 0xee, 0xee, 0xe3,
+ 0x17, 0x07, 0xf1, 0xf0, 0xd1, 0xe3, 0xa2, 0xe0, 0xe0, 0x00, 0xf0, 0x0f,
+ 0x20, 0x70, 0x30, 0xc0,
+ 0xe2, 0x10, 0x2d, 0x08, 0x00, 0x72, 0x44, 0x04, 0x02, 0x13, 0x23, 0x02,
+ 0x10, 0xfd, 0xdb, 0xfd,
+ 0xbe, 0xbe, 0xdf, 0xbb, 0xed, 0xee, 0x04, 0x11, 0x3e, 0x2d, 0x71, 0x12,
+ 0x1b, 0x08, 0xee, 0x20,
+ 0x02, 0x0f, 0x00, 0x01, 0xb1, 0x00, 0xef, 0x0f, 0x2f, 0x20, 0x50, 0x4d,
+ 0x3a, 0x5d, 0x1a, 0x30,
+ 0x30, 0x53, 0x00, 0x0f, 0x2d, 0x11, 0xe4, 0xc7, 0xe4, 0xe1, 0xc1, 0xc0,
+ 0xdf, 0xd0, 0xe2, 0xf0,
+ 0x00, 0x4d, 0x4c, 0xee, 0xde, 0x20, 0x05, 0x11, 0xff, 0xed, 0x20, 0x35,
+ 0x0f, 0xdb, 0x4f, 0x70,
+ 0x40, 0x2e, 0x0b, 0x10, 0x00, 0x9c, 0xed, 0xcc, 0xff, 0xc0, 0xf0, 0xe5,
+ 0x04, 0x13, 0x02, 0x20,
+ 0x20, 0xf3, 0xc2, 0x10, 0x21, 0x14, 0x24, 0x0f, 0xfd, 0xc1, 0x07, 0x07,
+ 0xe0, 0xce, 0xe0, 0x12,
+ 0x40, 0xe0, 0x3e, 0x50, 0x02, 0xff, 0x7b, 0x3e, 0x3f, 0x50, 0x0f, 0xde,
+ 0xee, 0xd0, 0xe3, 0xcd,
+ 0xbe, 0x00, 0xf0, 0xe8, 0x0f, 0x20, 0x30, 0x5f, 0x50, 0x12, 0x31, 0x42,
+ 0x10, 0x00, 0x15, 0x11,
+ 0x0f, 0xed, 0xf4, 0x57, 0x27, 0x11, 0x3f, 0x2e, 0x01, 0x01, 0xd0, 0x00,
+ 0xe0, 0x8d, 0xcd, 0x0e,
+ 0xcd, 0xdf, 0x00, 0x17, 0x10, 0xdb, 0xc0, 0x01, 0x32, 0x70, 0x30, 0x10,
+ 0x25, 0x16, 0xc1, 0xd2,
+ 0xd1, 0xc2, 0xb1, 0xe3, 0xe1, 0xf0, 0x0f, 0xdc, 0xff, 0x10, 0x30, 0x2e,
+ 0x6b, 0x3b, 0x4e, 0x2e,
+ 0x4d, 0x1c, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x53, 0x0f, 0x2f, 0x0d, 0xfc,
+ 0xeb, 0x0f, 0x21, 0x46,
+ 0x00, 0xdd, 0xcf, 0xd0, 0xad, 0xcc, 0xa0, 0xe0, 0xd4, 0xf2, 0xf1, 0xf6,
+ 0x01, 0xf4, 0x02, 0x41,
+ 0x33, 0x72, 0x31, 0x1f, 0x2e, 0x2f, 0x20, 0x0a, 0x0e, 0x5e, 0x0a, 0x0f,
+ 0x31, 0x12, 0x1d, 0x4d,
+ 0x30, 0x73, 0x11, 0x30, 0x0b, 0xff, 0xf2, 0xd1, 0xbf, 0xfa, 0x0d, 0xb0,
+ 0xe6, 0xe4, 0xd1, 0xd2,
+ 0xe6, 0xe3, 0x02, 0x10, 0x20, 0x60, 0x21, 0x02, 0xe5, 0xd2, 0xf0, 0xda,
+ 0xaf, 0xf0, 0xde, 0xfe,
+ 0xf0, 0x0f, 0x50, 0x4f, 0x20, 0x20, 0x1d, 0x31, 0x32, 0x1b, 0x0d, 0x2e,
+ 0xf3, 0x04, 0x0e, 0xef,
+ 0x02, 0xb1, 0xf5, 0xb5, 0x02, 0x21, 0x3e, 0x7e, 0x3c, 0xf9, 0xff, 0x1f,
+ 0xee, 0xad, 0xfd, 0xbf,
+ 0xec, 0x00, 0xee, 0xff, 0x00, 0x40, 0x20, 0x52, 0x27, 0x13, 0x20, 0x2f,
+ 0x30, 0x11, 0x4d, 0x0d,
+ 0x2a, 0x0d, 0x00, 0xb4, 0xd3, 0xb2, 0x01, 0xd0, 0x11, 0x56, 0x55, 0x00,
+ 0x00, 0xe0, 0xfa, 0xff,
+ 0xce, 0xff, 0x01, 0xb1, 0xfc, 0xed, 0x00, 0xe2, 0xf4, 0x05, 0x01, 0x00,
+ 0x3d, 0x3e, 0x70, 0x3f,
+ 0x3d, 0x42, 0x14, 0x00, 0x0f, 0xdc, 0xde, 0xed, 0xed, 0xc1, 0xf4, 0xd5,
+ 0xd6, 0xc3, 0xdf, 0xd0,
+ 0xc0, 0xd5, 0x93, 0xf2, 0x01, 0xd2, 0xc3, 0xf4, 0xd1, 0xf2, 0x04, 0x43,
+ 0x13, 0x30, 0x2e, 0x5c,
+ 0x5d, 0x3f, 0x6f, 0x1a, 0x0d, 0x20, 0x02, 0xe0, 0xf8, 0xfe, 0xef, 0xde,
+ 0xce, 0xfe, 0x0c, 0x30,
+ 0x1f, 0x42, 0x14, 0x0e, 0xfc, 0x0e, 0x5e, 0x0e, 0x5c, 0x3e, 0x50, 0x10,
+ 0xf1, 0x0e, 0xfe, 0x15,
+ 0x16, 0x01, 0x2f, 0x7f, 0x60, 0x02, 0x13, 0x13, 0x07, 0x04, 0xd0, 0x00,
+ 0x04, 0xdf, 0xcc, 0xf0,
+ 0xd0, 0xed, 0xdb, 0x0f, 0x10, 0x7e, 0x30, 0x2f, 0x43, 0x25, 0x03, 0xb3,
+ 0xf1, 0xa1, 0xf5, 0xf2,
+ 0xc2, 0xe1, 0xe0, 0xef, 0xcb, 0xf0, 0xff, 0x00, 0x2b, 0x0d, 0x0e, 0x73,
+ 0x22, 0x02, 0x15, 0x21,
+ 0x00, 0x1e, 0x15, 0x02, 0x13, 0xf2, 0xe2, 0xe3, 0x0e, 0x0d, 0x72, 0x53,
+ 0x29, 0x1c, 0x0e, 0x1e,
+ 0x1f, 0x10, 0x00, 0xee, 0xca, 0xe0, 0xbf, 0xef, 0xe0, 0xcf, 0xd0, 0xf1,
+ 0xdf, 0xf6, 0xe7, 0x02,
+ 0x50, 0x4d, 0x10, 0x20, 0x0f, 0x2d, 0x1f, 0x10, 0x3c, 0x4e, 0x5c, 0x6c,
+ 0x4f, 0x2f, 0x1e, 0x11,
+ 0x12, 0x00, 0x10, 0x00, 0x0a, 0x10, 0xfd, 0xbe, 0xdb, 0xde, 0xca, 0xef,
+ 0xfc, 0xf0, 0xef, 0x32,
+ 0x76, 0x31, 0xf1, 0xc1, 0x02, 0xf2, 0xc0, 0xfd, 0xd1, 0xe5, 0xc1, 0xd0,
+ 0xd0, 0xd0, 0xd1, 0x04,
+ 0x53, 0x7f, 0x2d, 0x23, 0x24, 0x10, 0x09, 0x20, 0x11, 0xd5, 0xb1, 0xe0,
+ 0xb1, 0xef, 0xc0, 0xf0,
+ 0x02, 0x02, 0x0e, 0x22, 0x77, 0x10, 0x2c, 0x21, 0x21, 0x11, 0x0f, 0xcd,
+ 0xf0, 0xd0, 0xe7, 0xd1,
+ 0xef, 0xfe, 0xdf, 0xdf, 0xca, 0x0f, 0x2e, 0x6f, 0x2f, 0x4f, 0x60, 0x1f,
+ 0x2d, 0x0f, 0x0b, 0x00,
+ 0x01, 0x0f, 0x2c, 0x1e, 0x30, 0x23, 0x00, 0x04, 0x21, 0x2e, 0x00, 0xb7,
+ 0xd1, 0xf0, 0x02, 0x03,
+ 0xb2, 0xee, 0x90, 0xe7, 0xc4, 0x00, 0x00, 0x1f, 0x20, 0x3e, 0x7f, 0x0c,
+ 0x2d, 0x0c, 0x0f, 0x1f,
+ 0x19, 0xee, 0x0f, 0x01, 0xef, 0x0b, 0x3f, 0x20, 0x2f, 0x0f, 0xdd, 0xbb,
+ 0xff, 0xff, 0x00, 0xb0,
+ 0x0f, 0xc4, 0xa7, 0xd3, 0xf3, 0xd4, 0xc3, 0xc2, 0xf2, 0xf2, 0xf0, 0x00,
+ 0x0f, 0x40, 0x77, 0x21,
+ 0x21, 0xf4, 0xf4, 0x02, 0xe0, 0xf0, 0x10, 0x34, 0x32, 0x41, 0x1f, 0xec,
+ 0xae, 0xeb, 0xfc, 0x0f,
+ 0xec, 0x0f, 0x0d, 0x5e, 0x00, 0x0f, 0x9d, 0xff, 0xe4, 0xf6, 0x03, 0x10,
+ 0x20, 0x3f, 0x5d, 0x3a,
+ 0x5f, 0x2f, 0x40, 0x00, 0xf2, 0x16, 0x31, 0x01, 0x14, 0x02, 0xcf, 0xed,
+ 0x01, 0xd0, 0x9e, 0xfd,
+ 0xfc, 0x0d, 0x1a, 0x4d, 0x2d, 0x2e, 0x3f, 0x21, 0x41, 0x10, 0xb1, 0xf7,
+ 0xe7, 0xf1, 0xf2, 0xe0,
+ 0x92, 0xe1, 0xe2, 0xc0, 0xec, 0xc0, 0x00, 0xf3, 0x01, 0x0d, 0x09, 0x10,
+ 0x70, 0x2e, 0x30, 0x01,
+ 0xff, 0xcd, 0xfc, 0x0f, 0xee, 0xfe, 0x3f, 0x74, 0x62, 0x00, 0x2e, 0x00,
+ 0xe0, 0x0f, 0xf1, 0x00,
+ 0xfa, 0x00, 0x00, 0x00, 0x0b, 0xef, 0xdf, 0xf0, 0xbe, 0xde, 0xfe, 0xb2,
+ 0xf3, 0xd4, 0xf5, 0xe6,
+ 0xf2, 0xe5, 0xb0, 0xb1, 0xf0, 0x0f, 0x4f, 0x0d, 0x5f, 0x3e, 0x3d, 0x40,
+ 0x32, 0x3f, 0x2b, 0x20,
+ 0x4f, 0x10, 0x07, 0x00, 0xfe, 0x00, 0xf0, 0x01, 0x30, 0xcd, 0xc0, 0xf2,
+ 0xd4, 0xdf, 0x0c, 0x01,
+ 0x77, 0x04, 0xe3, 0xa2, 0xf4, 0xd2, 0xc3, 0xc2, 0xee, 0x01, 0xf5, 0x00,
+ 0x21, 0x0f, 0x2b, 0x0d,
+ 0x0e, 0x0e, 0xfe, 0xd9, 0xdf, 0x0e, 0x3e, 0x7e, 0x10, 0x00, 0xf5, 0xe3,
+ 0x02, 0x03, 0x00, 0x70,
+ 0x53, 0x0c, 0x4c, 0x1d, 0x20, 0x0d, 0xbd, 0x01, 0x0f, 0x0a, 0x1e, 0xec,
+ 0xbd, 0xeb, 0xe0, 0xf2,
+ 0xf2, 0xfe, 0x0a, 0x0f, 0x5d, 0x2e, 0x50, 0x32, 0x11, 0x0e, 0x01, 0xd6,
+ 0xc0, 0xef, 0xf0, 0x06,
+ 0x34, 0x22, 0x61, 0x32, 0x5e, 0x1b, 0x70, 0x12, 0x10, 0x0e, 0xf0, 0xe0,
+ 0xf0, 0xf0, 0x02, 0x00,
+ 0xc2, 0xd7, 0xd4, 0xe0, 0xb0, 0xdf, 0xf0, 0xfe, 0xfc, 0xce, 0xde, 0x00,
+ 0x1f, 0x3a, 0x4f, 0x70,
+ 0x36, 0x12, 0x50, 0x1d, 0x1f, 0x2d, 0x3c, 0x0c, 0x0f, 0xf0, 0xe1, 0xaf,
+ 0xee, 0xd2, 0xd1, 0xc4,
+ 0xf7, 0xc3, 0xe0, 0xc2, 0xe4, 0xe3, 0xf3, 0x02, 0x13, 0x60, 0x22, 0x30,
+ 0x01, 0x14, 0x11, 0x00,
+ 0x0f, 0xfa, 0xef, 0xe0, 0x07, 0x21, 0x22, 0x30, 0x30, 0xf0, 0xca, 0x2f,
+ 0x7d, 0x70, 0x0e, 0xfe,
+ 0xfd, 0xfc, 0x0e, 0x0e, 0x00, 0xc0, 0xd7, 0x00, 0xe0, 0xe0, 0x0d, 0x7e,
+ 0x4d, 0x0d, 0x1e, 0x3d,
+ 0x3f, 0x5e, 0x1f, 0x22, 0x37, 0x17, 0x03, 0xff, 0xe0, 0xe4, 0xd0, 0xf0,
+ 0xc0, 0xff, 0x00, 0x3e,
+ 0x6f, 0x1d, 0x40, 0x30, 0x20, 0x3c, 0x4f, 0x31, 0xf5, 0x81, 0xe5, 0xd0,
+ 0xf1, 0xd1, 0xa5, 0x02,
+ 0xd0, 0xef, 0xc0, 0xf0, 0xef, 0xed, 0x0c, 0xef, 0x30, 0x34, 0x54, 0x04,
+ 0xe3, 0x00, 0xed, 0xfe,
+ 0x22, 0x77, 0x12, 0x00, 0x15, 0x23, 0x00, 0x00, 0x5d, 0x40, 0x10, 0x20,
+ 0x10, 0x3f, 0x67, 0x20,
+ 0x0b, 0xee, 0x00, 0x0f, 0x00, 0x10, 0x1f, 0xec, 0xb0, 0xe2, 0xd2, 0xa3,
+ 0xd6, 0xc1, 0xcf, 0xcc,
+ 0xf0, 0xe1, 0x0c, 0xec, 0x00, 0x5f, 0x2c, 0x2e, 0x30, 0x57, 0x20, 0x10,
+ 0x30, 0x00, 0x31, 0x00,
+ 0xf9, 0x2f, 0x5f, 0x1f, 0x0e, 0x2e, 0x20, 0x11, 0x42, 0x2c, 0x2b, 0x0d,
+ 0xf0, 0x0d, 0x10, 0xa0,
+ 0x91, 0xe5, 0xd0, 0xcf, 0xe1, 0x03, 0x00, 0xe1, 0x07, 0x04, 0xf1, 0xb1,
+ 0x00, 0x00, 0x76, 0x00,
+ 0x0c, 0x54, 0x12, 0xc8, 0x00, 0x11, 0xf2, 0xad, 0xf0, 0x04, 0x00, 0xfd,
+ 0xf0, 0x12, 0x01, 0x20,
+ 0x0f, 0x20, 0x31, 0x23, 0x22, 0x20, 0x1d, 0x52, 0x13, 0xf0, 0xad, 0x04,
+ 0x01, 0xfb, 0xbe, 0xf1,
+ 0xf1, 0x04, 0x11, 0x1f, 0x1a, 0xfd, 0x00, 0x2b, 0xfc, 0x30, 0x30, 0xbb,
+ 0x00, 0x7f, 0x10, 0x0d,
+ 0x00, 0x31, 0x21, 0xf2, 0xe1, 0xd3, 0x21, 0x3c, 0x0e, 0x70, 0x62, 0x00,
+ 0x09, 0xe1, 0x02, 0x12,
+ 0xe1, 0xe3, 0xf6, 0xf0, 0xef, 0x30, 0x57, 0xf3, 0xb1, 0xff, 0xf0, 0xe0,
+ 0x03, 0x13, 0x21, 0x3d,
+ 0x78, 0x2e, 0x3e, 0x0d, 0xec, 0x0e, 0x4e, 0x0e, 0xed, 0x21, 0x5d, 0x0c,
+ 0x01, 0x17, 0xd1, 0xaf,
+ 0xc0, 0xe0, 0xe4, 0xb0, 0xdd, 0xc0, 0x03, 0xd3, 0xf0, 0x00, 0xff, 0x00,
+ 0x44, 0x02, 0x02, 0x27,
+ 0x67, 0x03, 0x21, 0x22, 0x20, 0x00, 0xf1, 0xd2, 0x0f, 0x0c, 0x30, 0x34,
+ 0x20, 0x4b, 0x2d, 0x2f,
+ 0xcd, 0x0f, 0x23, 0xc0, 0x9c, 0xf0, 0xdf, 0xe0, 0xfa, 0x1f, 0x3f, 0xff,
+ 0xcc, 0x00, 0x20, 0x54,
+ 0x33, 0x20, 0x1f, 0x41, 0x72, 0x67, 0x16, 0x00, 0x0e, 0xd0, 0xf1, 0xd1,
+ 0x12, 0x10, 0x0c, 0x3e,
+ 0x4f, 0x4e, 0x1c, 0x2f, 0x40, 0x31, 0x32, 0x0c, 0xfa, 0x60, 0x22, 0xf1,
+ 0xc2, 0xd4, 0xb4, 0xd3,
+ 0xc3, 0xd5, 0xf2, 0xf1, 0x20, 0x10, 0x64, 0x02, 0xee, 0x0c, 0xfd, 0x0e,
+ 0xf0, 0x01, 0xcc, 0xcb,
+ 0xff, 0xf0, 0x0d, 0x0e, 0xee, 0xc1, 0x02, 0x64, 0x32, 0x63, 0x15, 0x2f,
+ 0x1e, 0x29, 0x1f, 0x0f,
+ 0x0c, 0xed, 0x2f, 0x73, 0x0b, 0xcb, 0x02, 0x43, 0xe1, 0xe0, 0x05, 0x11,
+ 0xe0, 0xd0, 0xb2, 0xe2,
+ 0xdf, 0xcd, 0xed, 0xe0, 0xef, 0x14, 0x1d, 0xe9, 0x10, 0x62, 0x20, 0x63,
+ 0x32, 0x2f, 0x1c, 0x20,
+ 0x20, 0x3f, 0xfb, 0xf0, 0x10, 0x40, 0x2d, 0x29, 0x10, 0x40, 0x00, 0xd1,
+ 0xe1, 0xc0, 0xd0, 0x02,
+ 0x04, 0x30, 0x37, 0xf7, 0xb3, 0xcf, 0xb0, 0xe1, 0xd3, 0xd1, 0xc0, 0xf1,
+ 0x00, 0xfc, 0xff, 0x21,
+ 0x42, 0x0e, 0x1a, 0x6f, 0x0e, 0xef, 0xcd, 0x01, 0x00, 0x91, 0x07, 0xf2,
+ 0xfe, 0xec, 0x11, 0x24,
+ 0x50, 0x6f, 0x1e, 0x2f, 0x0f, 0x10, 0x00, 0xe0, 0xfd, 0xfd, 0xb8, 0xee,
+ 0xde, 0xf0, 0x02, 0x00,
+ 0x1a, 0x30, 0x70, 0x5f, 0x1f, 0x0f, 0x1b, 0x00, 0x00, 0xb1, 0x01, 0x10,
+ 0x0e, 0xc2, 0x07, 0xe3,
+ 0xfe, 0xba, 0x10, 0x30, 0x30, 0x7f, 0x30, 0x12, 0x20, 0x00, 0x21, 0x0f,
+ 0x0c, 0xce, 0xff, 0xec,
+ 0xda, 0xbe, 0xdf, 0xc4, 0xd6, 0xb1, 0xe2, 0xd0, 0x00, 0x01, 0x12, 0x7f,
+ 0x2f, 0x0e, 0x20, 0x10,
+ 0x26, 0x21, 0x00, 0x1d, 0x1c, 0x2d, 0x0d, 0x1b, 0x0c, 0x10, 0xff, 0xcf,
+ 0xf2, 0xc4, 0xc3, 0xf6,
+ 0xd0, 0xb0, 0xd1, 0xa3, 0xd0, 0xf2, 0xe0, 0xc0, 0x00, 0x10, 0x0b, 0x0e,
+ 0x12, 0x17, 0x00, 0xf0,
+ 0x13, 0x25, 0xe3, 0xe2, 0x22, 0x40, 0x00, 0xf0, 0x73, 0x40, 0x2b, 0x2f,
+ 0x10, 0x1f, 0xfb, 0xbf,
+ 0x3f, 0x40, 0x0e, 0x0f, 0x5d, 0xf8, 0xba, 0x00, 0xfe, 0x00, 0xf0, 0xef,
+ 0x0f, 0x0e, 0x70, 0x4e,
+ 0x3d, 0x00, 0x24, 0x03, 0x0c, 0xdc, 0xe0, 0x16, 0x23, 0x00, 0xff, 0xd0,
+ 0x11, 0x11, 0xe1, 0x43,
+ 0x74, 0x72, 0x20, 0x1f, 0x1e, 0x1d, 0x3d, 0x04, 0xf2, 0xcf, 0xd0, 0xc3,
+ 0xe7, 0xc1, 0xd1, 0xde,
+ 0xef, 0xd0, 0xee, 0x10, 0xfc, 0xee, 0x44, 0x44, 0x25, 0x22, 0xe0, 0x90,
+ 0xef, 0xf2, 0xc6, 0xc1,
+ 0xb0, 0xf1, 0xd7, 0xf1, 0x01, 0x00, 0x40, 0x31, 0x40, 0x3b, 0x3e, 0x1f,
+ 0x40, 0x1e, 0x1f, 0xf0,
+ 0xef, 0x13, 0x57, 0x1c, 0x40, 0x66, 0x00, 0xdb, 0x01, 0x04, 0x0f, 0xae,
+ 0x0f, 0x01, 0x00, 0xef,
+ 0xde, 0x00, 0xd0, 0xcf, 0xdc, 0xf1, 0xf1, 0xf3, 0x60, 0x3f, 0x39, 0x0f,
+ 0x00, 0x21, 0x31, 0x41,
+ 0x32, 0x51, 0x1f, 0x3b, 0x2f, 0x2e, 0x5e, 0x21, 0x0d, 0xc8, 0x1c, 0x50,
+ 0xfe, 0x0d, 0x2f, 0x0f,
+ 0xef, 0xcf, 0xf1, 0xe5, 0xc0, 0xd2, 0xd7, 0xe2, 0xd2, 0xdf, 0x1f, 0x71,
+ 0x33, 0x21, 0x0f, 0x1f,
+ 0x1d, 0x1e, 0xf0, 0x91, 0xd2, 0xd2, 0xc7, 0xd3, 0xce, 0xfe, 0xf6, 0x03,
+ 0x03, 0x00, 0xed, 0x30,
+ 0x74, 0x7e, 0x1c, 0x0e, 0x0f, 0x00, 0xfe, 0xe5, 0xf7, 0x04, 0xe2, 0xe1,
+ 0x12, 0x10, 0x20, 0x00,
+ 0x22, 0xfb, 0xff, 0x20, 0x0d, 0x3c, 0x72, 0x50, 0xfb, 0xe0, 0x0f, 0xe0,
+ 0xb2, 0xed, 0x0e, 0x01,
+ 0x0f, 0x3d, 0x6e, 0x18, 0x2f, 0x0e, 0x3e, 0x70, 0x1d, 0x0f, 0x0f, 0x0e,
+ 0x00, 0x02, 0x0e, 0x20,
+ 0x25, 0x02, 0x14, 0xe0, 0xc3, 0xf3, 0x17, 0xf1, 0x80, 0xf1, 0xf5, 0x02,
+ 0x0e, 0xdd, 0x01, 0xe1,
+ 0xf0, 0x1b, 0x70, 0x7f, 0x0a, 0x40, 0x2d, 0x1b, 0x2f, 0x11, 0x00, 0xee,
+ 0xff, 0xd0, 0xb0, 0xf0,
+ 0xe5, 0xe1, 0xd0, 0xbc, 0xde, 0xf4, 0xc2, 0xef, 0x0f, 0x20, 0x42, 0x00,
+ 0x0f, 0x03, 0xd1, 0xe7,
+ 0x07, 0xd2, 0xb2, 0xf2, 0xf4, 0x02, 0x40, 0x1f, 0x12, 0x41, 0xf0, 0x4f,
+ 0x50, 0x0e, 0x3f, 0x54,
+ 0x00, 0xff, 0x01, 0xef, 0xf9, 0xdf, 0xf2, 0xb1, 0xc8, 0xfe, 0x00, 0x30,
+ 0x2e, 0x0f, 0x50, 0x2f,
+ 0xfd, 0xbd, 0xff, 0xff, 0xe1, 0x03, 0x06, 0x02, 0x14, 0xf2, 0x04, 0x04,
+ 0x91, 0x00, 0x44, 0x00,
+ 0x5c, 0xe4, 0x1c, 0x04, 0x9b, 0xe5, 0xbf, 0x02, 0xb4, 0xe3, 0xe4, 0xf1,
+ 0x02, 0x10, 0x30, 0x5d,
+ 0x4d, 0x3b, 0x5b, 0x2c, 0x3d, 0x3b, 0x3d, 0x4c, 0x2d, 0x3d, 0x3e, 0x50,
+ 0x30, 0x42, 0x31, 0x41,
+ 0x32, 0x42, 0x22, 0x32, 0x41, 0x23, 0x34, 0x32, 0x22, 0x13, 0x13, 0x17,
+ 0x06, 0x03, 0x03, 0x05,
+ 0x02, 0x14, 0x13, 0x02, 0x04, 0x02, 0xe3, 0xd2, 0xb1, 0xd1, 0xe1, 0x01,
+ 0x10, 0x71, 0x31, 0x55,
+ 0x55, 0x33, 0x43, 0x44, 0x33, 0x43, 0x33, 0x45, 0x33, 0x24, 0x24, 0x12,
+ 0x03, 0xf4, 0xc2, 0xd4,
+ 0xb2, 0xd3, 0xe3, 0xc4, 0xe3, 0xc2, 0xd3, 0xd2, 0xc3, 0xd3, 0xc5, 0xd3,
+ 0xd2, 0xc2, 0xd2, 0xd2,
+ 0xc4, 0xe3, 0xe3, 0xf4, 0xf2, 0x12, 0x20, 0x4d, 0x3b, 0x5d, 0x3b, 0x3d,
+ 0x4e, 0x3e, 0x3e, 0x30,
+ 0x43, 0x34, 0x35, 0x34, 0x64, 0x35, 0x33, 0x33, 0x44, 0x43, 0x34, 0x33,
+ 0x43, 0x22, 0x32, 0x31,
+ 0x32, 0x22, 0x13, 0x16, 0x13, 0x15, 0x02, 0x13, 0x34, 0x54, 0x32, 0x54,
+ 0x32, 0x24, 0x22, 0x13,
+ 0x03, 0xd4, 0xb3, 0xd3, 0xc3, 0xc3, 0xe4, 0xf3, 0xe2, 0xf4, 0x03, 0x13,
+ 0x22, 0x44, 0x53, 0x33,
+ 0x33, 0x22, 0x23, 0x02, 0xc2, 0xc3, 0xb4, 0xc3, 0xd5, 0xc2, 0xd4, 0xd2,
+ 0xd3, 0xf3, 0xf3, 0x04,
+ 0x03, 0x24, 0x41, 0x52, 0x43, 0x43, 0x33, 0x42, 0x33, 0x34, 0x31, 0x21,
+ 0x20, 0x20, 0x20, 0x10,
+ 0x0d, 0x0b, 0xfc, 0xfd, 0xef, 0xd0, 0xc1, 0xc7, 0xd3, 0xc4, 0xd3, 0xe3,
+ 0x03, 0x21, 0x20, 0x70,
+ 0x70, 0x38, 0x4d, 0x4f, 0x2c, 0x3b, 0x4e, 0x4e, 0x3e, 0x3c, 0x4d, 0x2c,
+ 0x3d, 0x4d, 0x2c, 0x2c,
+ 0x3d, 0x3c, 0x3d, 0x4c, 0x2d, 0x3c, 0x2d, 0x2c, 0x2d, 0x0d, 0x0c, 0xed,
+ 0xee, 0xbd, 0xdd, 0xdd,
+ 0xbd, 0xdc, 0xbd, 0xee, 0xef, 0xdf, 0xde, 0xe0, 0xd1, 0xe1, 0xd0, 0xd0,
+ 0xd2, 0xb5, 0xc2, 0xc3,
+ 0xc5, 0xd3, 0xb3, 0xe6, 0xe3, 0xd1, 0xe2, 0xd1, 0xe0, 0xde, 0xdc, 0xde,
+ 0xcc, 0xcc, 0xdd, 0xcb,
+ 0xcd, 0xcc, 0xdd, 0xcc, 0xdc, 0xdd, 0xcd, 0xec, 0xdd, 0xed, 0xdd, 0xfc,
+ 0xfe, 0x0d, 0x0d, 0x0c,
+ 0x2e, 0x4e, 0x2c, 0x2d, 0x2c, 0x4d, 0x4c, 0x2c, 0x4d, 0x3c, 0x4d, 0x2c,
+ 0x2d, 0x4e, 0x3c, 0x5d,
+ 0x3d, 0x3c, 0x5d, 0x2d, 0x2c, 0x2d, 0x2c, 0x1c, 0x1e, 0x1e, 0x1e, 0x2f,
+ 0x0d, 0x0f, 0x0e, 0x0e,
+ 0xfe, 0xc0, 0xb1, 0xc1, 0xc0, 0xde, 0xce, 0xce, 0xc4, 0xc7, 0xe0, 0x0b,
+ 0x1e, 0xe0, 0xa1, 0xf2,
+ 0x00, 0x20, 0x13, 0x07, 0x25, 0x51, 0x21, 0x12, 0x04, 0x04, 0x02, 0x02,
+ 0x22, 0x04, 0xe3, 0xa3,
+ 0xe3, 0xe3, 0xf5, 0xd2, 0xc3, 0xd4, 0xc3, 0xc3, 0xb4, 0xd4, 0xc3, 0xd5,
+ 0xe2, 0xf3, 0xf3, 0xd4,
+ 0xd2, 0xd3, 0x03, 0x23, 0x24, 0x23, 0x03, 0x32, 0x62, 0x41, 0x20, 0x20,
+ 0x21, 0x32, 0x32, 0x61,
+ 0x3f, 0x3e, 0x3e, 0x4d, 0x40, 0x34, 0x42, 0x3f, 0x4e, 0x20, 0x30, 0x40,
+ 0x31, 0x57, 0x37, 0x22,
+ 0x20, 0x20, 0x30, 0x20, 0x30, 0x40, 0x51, 0x20, 0x2d, 0x2b, 0x1e, 0x2d,
+ 0x2f, 0x3b, 0x2d, 0x2c,
+ 0x10, 0x11, 0x22, 0x32, 0x73, 0x13, 0x14, 0x15, 0x04, 0x25, 0x03, 0x04,
+ 0x03, 0x13, 0x13, 0x04,
+ 0xf5, 0xc3, 0xd3, 0xf5, 0xf2, 0xd2, 0x92, 0xd2, 0xf4, 0xf4, 0xe3, 0xa3,
+ 0xc2, 0xc3, 0xc3, 0xc4,
+ 0xe3, 0xd4, 0xe3, 0xd2, 0xb2, 0xd2, 0xf2, 0x12, 0x41, 0x23, 0x14, 0x11,
+ 0x00, 0x10, 0x10, 0x11,
+ 0x34, 0x12, 0xf0, 0xb0, 0xd0, 0xce, 0xde, 0xb0, 0xd7, 0xc4, 0xdf, 0xdd,
+ 0xee, 0xd0, 0xdf, 0x08,
+ 0x4c, 0x2d, 0x0d, 0x00, 0x40, 0x7d, 0x59, 0x2e, 0x1f, 0x0f, 0x0f, 0x1c,
+ 0x1d, 0x2b, 0x5d, 0x3c,
+ 0x2d, 0x2d, 0x2d, 0x3e, 0x6c, 0x2d, 0x3d, 0x4f, 0x3e, 0x3c, 0x4c, 0x3c,
+ 0x2e, 0x2d, 0x1e, 0x2d,
+ 0x2a, 0x2d, 0x1e, 0xef, 0xbf, 0xde, 0xfc, 0x0c, 0xde, 0xcf, 0xd0, 0x00,
+ 0x2e, 0x2d, 0xde, 0x90,
+ 0xff, 0x1e, 0x3c, 0x0c, 0x9c, 0xfb, 0x0d, 0xde, 0xce, 0xcf, 0xfe, 0xea,
+ 0xed, 0xdd, 0xbc, 0xed,
+ 0xde, 0xde, 0xc0, 0xc0, 0xde, 0xde, 0xcf, 0xd0, 0xd2, 0xe4, 0xd2, 0xa3,
+ 0xd3, 0xc1, 0xd1, 0xc0,
+ 0xc1, 0xd2, 0xce, 0xed, 0xfe, 0x0e, 0x0b, 0xf8, 0xfb, 0xfd, 0xfd, 0x0d,
+ 0x0c, 0x2c, 0x2d, 0x1d,
+ 0xfd, 0xec, 0xfc, 0x3d, 0x3c, 0xad, 0xdc, 0xed, 0x1d, 0x4e, 0xee, 0xdc,
+ 0xdd, 0x2d, 0x5d, 0xfe,
+ 0xbf, 0xcf, 0xce, 0xdc, 0xcc, 0xec, 0xed, 0xfb, 0xee, 0xdd, 0xdc, 0xed,
+ 0xdd, 0xed, 0xfd, 0x0e,
+ 0x0d, 0xdd, 0x9b, 0xff, 0x00, 0x02, 0x12, 0x61, 0x41, 0x1f, 0x0f, 0x14,
+ 0x24, 0x11, 0x10, 0x02,
+ 0xd3, 0x80, 0xc1, 0xe4, 0xc6, 0xd1, 0xc0, 0xde, 0xcf, 0xe1, 0xe3, 0xf0,
+ 0xd3, 0xb7, 0xe5, 0xd1,
+ 0xe1, 0xf0, 0xe2, 0xd3, 0xd0, 0xce, 0xdc, 0xff, 0xd0, 0xdf, 0xea, 0xec,
+ 0xdd, 0xdd, 0xcd, 0xef,
+ 0x00, 0x30, 0x2e, 0xda, 0xad, 0xde, 0xe0, 0xe6, 0xf3, 0x40, 0x40, 0x00,
+ 0x00, 0x02, 0x11, 0x71,
+ 0x50, 0x31, 0x25, 0x24, 0x20, 0x30, 0x21, 0x06, 0x04, 0xf4, 0x02, 0x01,
+ 0x02, 0xe1, 0xf4, 0xe2,
+ 0x04, 0x12, 0x11, 0x12, 0x72, 0x73, 0x35, 0x33, 0x52, 0x41, 0x33, 0x32,
+ 0x53, 0x23, 0x21, 0x21,
+ 0x00, 0x01, 0x03, 0xf4, 0xf5, 0xd3, 0xd2, 0xd2, 0xd4, 0xc7, 0xd3, 0xc5,
+ 0xf3, 0x23, 0x54, 0x23,
+ 0x32, 0x33, 0x55, 0x43, 0x34, 0x54, 0x22, 0x32, 0x42, 0x23, 0x22, 0x32,
+ 0x43, 0x33, 0x44, 0x13,
+ 0x33, 0x22, 0x32, 0x32, 0x22, 0x34, 0x44, 0x74, 0x31, 0x10, 0x00, 0x10,
+ 0x12, 0x31, 0x41, 0x42,
+ 0x23, 0x00, 0x10, 0x1d, 0x2d, 0x3f, 0x4c, 0x4b, 0x5c, 0x3e, 0x40, 0x43,
+ 0x43, 0x30, 0x40, 0x20,
+ 0x3e, 0x2c, 0x2c, 0x2e, 0x11, 0x10, 0x19, 0x1d, 0x1d, 0x1e, 0x2f, 0x2d,
+ 0x1b, 0xfd, 0xdb, 0xbc,
+ 0xec, 0xfd, 0x0e, 0x0e, 0xec, 0xeb, 0xce, 0xee, 0xef, 0xff, 0x3d, 0x0f,
+ 0xdf, 0xde, 0xec, 0x2e,
+ 0x60, 0x34, 0x24, 0x01, 0xf0, 0xc0, 0xb4, 0xb4, 0xc3, 0xd2, 0xe3, 0xe3,
+ 0xe1, 0xde, 0xdc, 0xdc,
+ 0xed, 0xeb, 0xfd, 0xfc, 0xee, 0xc0, 0xc0, 0xc1, 0xc2, 0xb3, 0xc5, 0xd3,
+ 0xd3, 0x02, 0x66, 0x21,
+ 0x00, 0x0f, 0x20, 0x62, 0x20, 0x2f, 0x35, 0x33, 0x03, 0x04, 0x02, 0x21,
+ 0x77, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0x0f, 0xfe, 0x10, 0x43, 0x56, 0x33, 0x21, 0x33, 0x25,
+ 0x10, 0xde, 0xfe, 0x62,
+ 0x46, 0x22, 0x00, 0xef, 0xaa, 0xcd, 0xee, 0x35, 0x43, 0xf0, 0xde, 0xdf,
+ 0xdd, 0xf0, 0x01, 0x01,
+ 0x11, 0x10, 0xee, 0xee, 0x32, 0x76, 0x20, 0xff, 0xcb, 0xcc, 0x22, 0x77,
+ 0x11, 0xee, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xee, 0x00, 0x24, 0x00, 0xbe, 0xee, 0xf0, 0xf0,
+ 0xf0, 0x22, 0x00, 0xcd,
+ 0xf0, 0x27, 0x10, 0xce, 0xce, 0x00, 0x35, 0x42, 0x01, 0xae, 0xdc, 0xdd,
+ 0x00, 0x00, 0xbb, 0xdd,
+ 0x13, 0x66, 0x00, 0xee, 0xff, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
+ 0x13, 0x35, 0x12, 0xef,
+ 0x9b, 0x01, 0x56, 0x00, 0xef, 0x00, 0x11, 0xf0, 0x00, 0x21, 0x0f, 0xed,
+ 0xed, 0x00, 0x74, 0x21,
+ 0x0e, 0xfd, 0xda, 0x00, 0x30, 0x0f, 0xfe, 0x10, 0xee, 0x8a, 0xed, 0xcb,
+ 0x00, 0x53, 0x00, 0x0f,
+ 0xfe, 0xfc, 0x0e, 0x22, 0x21, 0xee, 0x10, 0x10, 0x0e, 0x34, 0x64, 0xf0,
+ 0xde, 0xab, 0xef, 0x25,
+ 0x02, 0xef, 0x01, 0x13, 0xf0, 0xbc, 0xef, 0x00, 0x0f, 0x32, 0x00, 0xe9,
+ 0xdf, 0x10, 0x54, 0xf0,
+ 0xab, 0xdc, 0x00, 0x21, 0x00, 0xef, 0xde, 0x00, 0x0e, 0x10, 0xf0, 0x8c,
+ 0x00, 0xf0, 0x01, 0xf1,
+ 0xef, 0x13, 0x01, 0xb8, 0x00, 0x33, 0xee, 0xdd, 0x76, 0x21, 0xfe, 0xed,
+ 0xcc, 0x00, 0x44, 0x00,
+ 0x10, 0x21, 0xfe, 0xed, 0x21, 0x20, 0xca, 0x20, 0x41, 0x00, 0x10, 0x10,
+ 0xec, 0xde, 0xbc, 0xcd,
+ 0x22, 0x55, 0xfe, 0xde, 0x00, 0x00, 0x00, 0xfd, 0xce, 0xed, 0x02, 0x26,
+ 0x00, 0xbd, 0xa9, 0x11,
+ 0x56, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x10, 0x11, 0x01, 0x32, 0xff, 0xcd,
+ 0x00, 0x23, 0x01, 0xde,
+ 0x13, 0x12, 0x9b, 0xdd, 0x03, 0x47, 0xf0, 0xf0, 0x00, 0xf0, 0xee, 0x01,
+ 0x13, 0xde, 0x89, 0x00,
+ 0x44, 0x11, 0xed, 0xf0, 0x11, 0x21, 0x00, 0x00, 0xed, 0x0f, 0x77, 0x00,
+ 0xfe, 0x00, 0xff, 0xff,
+ 0x21, 0x32, 0x0f, 0x1f, 0x1d, 0x3f, 0x72, 0x23, 0x2f, 0x1d, 0x20, 0x2f,
+ 0x32, 0x0d, 0x1c, 0x77,
+ 0x23, 0xfd, 0xee, 0x00, 0x00, 0x23, 0x47, 0x01, 0xab, 0x0f, 0x01, 0x00,
+ 0x11, 0x00, 0x10, 0x45,
+ 0x0f, 0xba, 0x31, 0x43, 0xee, 0xee, 0x01, 0x34, 0x32, 0x00, 0xef, 0x00,
+ 0x12, 0x02, 0xd0, 0x23,
+ 0x77, 0x11, 0x00, 0xef, 0xde, 0x20, 0x75, 0x11, 0x00, 0x00, 0x02, 0xf0,
+ 0xe0, 0xde, 0xe0, 0x02,
+ 0x01, 0x9c, 0xda, 0xde, 0x00, 0x55, 0x0f, 0xcc, 0x10, 0x20, 0x0e, 0x20,
+ 0x42, 0x10, 0x0c, 0xfc,
+ 0x21, 0x31, 0xff, 0xee, 0x65, 0x22, 0xee, 0xff, 0x12, 0x13, 0xdf, 0x9a,
+ 0x10, 0x55, 0x00, 0xee,
+ 0x00, 0xff, 0x00, 0x35, 0x32, 0xce, 0xdc, 0x00, 0x43, 0x21, 0xac, 0x0f,
+ 0x25, 0x21, 0xff, 0xf0,
+ 0x22, 0x22, 0xce, 0x00, 0x12, 0x12, 0x24, 0x00, 0xcf, 0x11, 0x34, 0x00,
+ 0x10, 0x10, 0xab, 0xee,
+ 0x35, 0x21, 0xcf, 0xff, 0x33, 0x23, 0xbe, 0xcc, 0xf0, 0x03, 0x02, 0x24,
+ 0x01, 0xad, 0x02, 0x47,
+ 0x02, 0xde, 0xef, 0x12, 0x56, 0xf0, 0xab, 0x00, 0x23, 0x11, 0x00, 0x11,
+ 0x01, 0xde, 0xcc, 0x00,
+ 0x67, 0x12, 0xff, 0xee, 0x00, 0x13, 0x00, 0xd0, 0x13, 0x12, 0xde, 0xde,
+ 0x76, 0x34, 0xee, 0xf0,
+ 0x22, 0x00, 0xe0, 0x00, 0x01, 0x02, 0x01, 0xbe, 0x01, 0x24, 0xed, 0x00,
+ 0x44, 0xdd, 0xa9, 0x22,
+ 0x63, 0x00, 0x0b, 0x00, 0x10, 0x12, 0x00, 0x1f, 0x1f, 0x0e, 0x30, 0x53,
+ 0x00, 0x0b, 0x00, 0xfc,
+ 0x0f, 0x21, 0x00, 0xec, 0xce, 0x0e, 0xdd, 0xed, 0x32, 0x0f, 0xdb, 0xfe,
+ 0xbb, 0xfe, 0x71, 0x66,
+ 0x00, 0xec, 0xef, 0x21, 0x21, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0xde, 0xde,
+ 0xd0, 0xdd, 0xff, 0x76,
+ 0x00, 0xbb, 0xff, 0x01, 0x14, 0x00, 0xbd, 0x0f, 0xf0, 0x01, 0x11, 0xed,
+ 0xa8, 0x00, 0x45, 0xf0,
+ 0xde, 0x11, 0x12, 0xef, 0x01, 0x33, 0xef, 0xac, 0x00, 0x12, 0x00, 0x21,
+ 0x34, 0x0f, 0x0e, 0x10,
+ 0xfe, 0xec, 0x73, 0x21, 0xfc, 0x10, 0x0f, 0xa8, 0x0e, 0x42, 0xfe, 0xfd,
+ 0x34, 0x10, 0xec, 0xfd,
+ 0x0f, 0x31, 0x30, 0x0e, 0x1e, 0x30, 0x2e, 0x1e, 0x60, 0x21, 0x0c, 0xe9,
+ 0xff, 0x30, 0x73, 0x0f,
+ 0xb9, 0x00, 0x42, 0x11, 0xfe, 0xcd, 0xff, 0x00, 0x37, 0x42, 0xdf, 0xdd,
+ 0x22, 0x42, 0xfe, 0xdd,
+ 0x00, 0x33, 0x44, 0x10, 0xde, 0xde, 0x22, 0x01, 0x9d, 0x00, 0x27, 0x04,
+ 0xbe, 0xef, 0x01, 0x15,
+ 0x23, 0xf0, 0xce, 0x23, 0xf0, 0x8b, 0x13, 0x25, 0xff, 0xef, 0x01, 0x22,
+ 0xef, 0xff, 0x00, 0x02,
+ 0x00, 0x00, 0x23, 0x00, 0xac, 0x00, 0x37, 0x00, 0x10, 0x31, 0xd0, 0xef,
+ 0xf0, 0xcf, 0xdd, 0x31,
+ 0x21, 0xce, 0x57, 0x44, 0xed, 0xcc, 0x0f, 0x33, 0x45, 0x00, 0xdf, 0xdf,
+ 0x00, 0x76, 0x32, 0xbd,
+ 0xff, 0x35, 0x21, 0xef, 0xee, 0x31, 0x64, 0x00, 0x00, 0xff, 0x00, 0x11,
+ 0xff, 0xee, 0x13, 0x77,
+ 0x01, 0xff, 0xee, 0x00, 0x13, 0x23, 0xf0, 0xef, 0x13, 0xff, 0x99, 0x01,
+ 0x34, 0xf0, 0xdf, 0x01,
+ 0x54, 0x00, 0xef, 0xff, 0x01, 0x23, 0x00, 0xf0, 0xef, 0xde, 0x77, 0x22,
+ 0xff, 0xff, 0x00, 0x00,
+ 0xf1, 0xf0, 0xe0, 0xfe, 0xdc, 0xfe, 0x75, 0x57, 0x00, 0xdc, 0xce, 0x10,
+ 0x32, 0x00, 0x00, 0x21,
+ 0xf0, 0xcd, 0xff, 0x11, 0x12, 0x00, 0xbd, 0xc9, 0x00, 0x45, 0xef, 0xdd,
+ 0x21, 0x53, 0x00, 0xdc,
+ 0x00, 0x30, 0x32, 0x20, 0x10, 0x0e, 0x0f, 0xfe, 0x10, 0xff, 0x00, 0x77,
+ 0x54, 0xfd, 0xed, 0x11,
+ 0x24, 0x0f, 0xfe, 0x41, 0x45, 0x0e, 0xcc, 0x10, 0x41, 0x00, 0x0e, 0xfe,
+ 0xef, 0x00, 0xed, 0x23,
+ 0x44, 0xec, 0xbc, 0x0f, 0x01, 0x00, 0xd9, 0x0f, 0x71, 0x0f, 0xfd, 0x20,
+ 0x21, 0xeb, 0xfe, 0x42,
+ 0x10, 0xeb, 0x0f, 0x10, 0x10, 0x10, 0x1f, 0xfd, 0x0f, 0x22, 0x12, 0xe1,
+ 0x8b, 0x8b, 0x00, 0x13,
+ 0xff, 0xfe, 0x02, 0xfd, 0xc8, 0x00, 0x32, 0xee, 0xcd, 0x10, 0x00, 0xfe,
+ 0xfe, 0xff, 0x00, 0xff,
+ 0xf0, 0x10, 0xee, 0x88, 0xdd, 0x10, 0x76, 0x00, 0xed, 0xed, 0x00, 0x00,
+ 0x1f, 0x00, 0x0e, 0x0f,
+ 0x00, 0xed, 0xdd, 0x01, 0x23, 0xee, 0xcb, 0xde, 0x10, 0x76, 0x0f, 0xee,
+ 0xdd, 0xed, 0x00, 0x42,
+ 0x11, 0xca, 0xab, 0x00, 0x33, 0x21, 0xed, 0xff, 0x00, 0x00, 0x0f, 0x0e,
+ 0x0e, 0xcc, 0xee, 0x57,
+ 0x32, 0xe0, 0xde, 0xce, 0xf0, 0x13, 0x13, 0x03, 0xe0, 0x8d, 0x02, 0x27,
+ 0x15, 0xf0, 0xf0, 0x00,
+ 0xf1, 0xf1, 0x23, 0xcf, 0xac, 0x26, 0x33, 0xe0, 0xcd, 0xcd, 0xf0, 0x36,
+ 0x22, 0xd0, 0x8c, 0xee,
+ 0x01, 0x34, 0x00, 0xf0, 0x01, 0x01, 0xef, 0xee, 0x22, 0x12, 0xff, 0x10,
+ 0x22, 0xed, 0x00, 0x45,
+ 0x00, 0xdd, 0x31, 0x65, 0xee, 0xbc, 0xf0, 0x13, 0x46, 0x00, 0xef, 0x00,
+ 0x11, 0x00, 0x10, 0x20,
+ 0x00, 0x20, 0x0f, 0x52, 0x56, 0x00, 0x0f, 0x0e, 0x10, 0x65, 0x00, 0xec,
+ 0x00, 0x33, 0x01, 0x11,
+ 0x00, 0xcc, 0x00, 0x00, 0xff, 0x00, 0x76, 0x11, 0x0f, 0x00, 0x46, 0x11,
+ 0xef, 0x9a, 0x00, 0x23,
+ 0x44, 0x11, 0xef, 0xef, 0xf0, 0x01, 0x11, 0x23, 0x54, 0x22, 0x01, 0xff,
+ 0x00, 0x22, 0x33, 0x34,
+ 0x11, 0x01, 0x01, 0xf1, 0xd0, 0x57, 0x65, 0xff, 0xdf, 0x00, 0x11, 0x00,
+ 0xf0, 0x33, 0x53, 0xee,
+ 0xba, 0x01, 0x33, 0x10, 0x0f, 0x0f, 0x21, 0x0f, 0xed, 0x41, 0x43, 0x0d,
+ 0xf9, 0x30, 0x73, 0x10,
+ 0x00, 0x20, 0x00, 0x0e, 0x0c, 0x0e, 0x56, 0x33, 0x32, 0x00, 0xeb, 0x0e,
+ 0x1f, 0x0e, 0x52, 0x77,
+ 0x00, 0xeb, 0xff, 0x10, 0x20, 0x20, 0x30, 0x00, 0xee, 0xee, 0x10, 0x10,
+ 0xdd, 0x0f, 0x74, 0x10,
+ 0xed, 0xca, 0xee, 0x10, 0x33, 0x53, 0x22, 0xdb, 0xcc, 0x00, 0x11, 0x11,
+ 0x42, 0x00, 0xde, 0xfe,
+ 0x33, 0x10, 0xbb, 0xdd, 0xff, 0x24, 0x00, 0xd0, 0xf0, 0x22, 0x76, 0x00,
+ 0xef, 0xce, 0xf0, 0x01,
+ 0x00, 0x00, 0x0f, 0xee, 0x24, 0xf0, 0xaf, 0xf0, 0xef, 0xe0, 0x17, 0xf1,
+ 0xae, 0xff, 0x15, 0x02,
+ 0xf0, 0xff, 0xdf, 0x32, 0x77, 0x02, 0xcb, 0x00, 0x32, 0x21, 0x00, 0x00,
+ 0x00, 0x01, 0x01, 0xf0,
+ 0xff, 0x00, 0x01, 0x56, 0x01, 0xd0, 0xcf, 0xcd, 0x13, 0x77, 0x00, 0xce,
+ 0x0f, 0x00, 0x00, 0x21,
+ 0x0f, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0xb9, 0x0f, 0x11, 0x0f, 0xef, 0x01,
+ 0x02, 0x64, 0x00, 0x0c,
+ 0x00, 0x00, 0x0f, 0xcc, 0x12, 0x43, 0x21, 0x1f, 0xc8, 0xff, 0x42, 0x33,
+ 0x00, 0xdc, 0xef, 0x01,
+ 0x75, 0x00, 0xbc, 0xef, 0x13, 0x02, 0xcd, 0xf0, 0x01, 0x15, 0x01, 0xab,
+ 0xee, 0x00, 0x35, 0x21,
+ 0x01, 0x00, 0x00, 0xee, 0xbe, 0x12, 0x25, 0xf0, 0xe0, 0x00, 0xd0, 0xd0,
+ 0xd0, 0xd0, 0xf0, 0x44,
+ 0x74, 0x00, 0xff, 0x12, 0x0f, 0xff, 0x46, 0x11, 0x0f, 0xe0, 0x04, 0x00,
+ 0x4c, 0x02, 0x8b, 0x02,
+ 0x70, 0x07, 0x4e, 0x30, 0x7b, 0xfc, 0xd7, 0x24, 0xdc, 0xcc, 0x31, 0x21,
+ 0xde, 0xde, 0xee, 0x88,
+ 0x00, 0x53, 0x10, 0xca, 0xef, 0x10, 0x10, 0xfe, 0x20, 0x50, 0x0f, 0x0f,
+ 0x2f, 0x10, 0x62, 0x11,
+ 0x0c, 0xfd, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x37, 0xf2, 0x8c, 0xef,
+ 0x12, 0x14, 0xff, 0xff,
+ 0x01, 0xf0, 0xfe, 0x00, 0x0f, 0x02, 0x04, 0xcd, 0xed, 0x00, 0x00, 0xd1,
+ 0xd7, 0x90, 0xe0, 0x03,
+ 0xee, 0x00, 0x77, 0x01, 0xbb, 0xee, 0x00, 0x23, 0x01, 0x00, 0xdd, 0xed,
+ 0x02, 0x16, 0xe0, 0xd0,
+ 0xad, 0xef, 0x02, 0xf0, 0x01, 0x03, 0xa9, 0xcd, 0x00, 0x04, 0x12, 0x11,
+ 0x00, 0xfe, 0x00, 0x0e,
+ 0xec, 0x76, 0x10, 0xfd, 0x45, 0x21, 0xdd, 0xbc, 0x00, 0x22, 0x11, 0x00,
+ 0x01, 0xef, 0xcc, 0xf0,
+ 0x00, 0x10, 0x21, 0x11, 0xee, 0xbb, 0x23, 0x56, 0xdd, 0xce, 0x34, 0x22,
+ 0x10, 0x0f, 0xde, 0x01,
+ 0x35, 0x00, 0xce, 0xcd, 0x11, 0x77, 0x23, 0xde, 0xee, 0x00, 0xdf, 0xce,
+ 0x47, 0x11, 0x00, 0x10,
+ 0xf0, 0xde, 0x21, 0x33, 0x00, 0xbe, 0xef, 0x00, 0x33, 0x45, 0x00, 0xce,
+ 0xef, 0xe0, 0x02, 0x12,
+ 0xed, 0x0f, 0x02, 0xf0, 0xe0, 0xef, 0xbc, 0xba, 0x01, 0x65, 0x11, 0xfe,
+ 0xca, 0x0f, 0x21, 0x21,
+ 0x31, 0x21, 0xee, 0x0f, 0x00, 0x0d, 0xed, 0x22, 0x44, 0x00, 0xde, 0xac,
+ 0x23, 0x33, 0xca, 0xef,
+ 0x43, 0x55, 0x10, 0x00, 0xec, 0xff, 0x32, 0x42, 0xef, 0x00, 0x24, 0x00,
+ 0x01, 0x00, 0xbd, 0xeb,
+ 0x43, 0x45, 0x0e, 0x00, 0x00, 0x10, 0x73, 0x23, 0xf9, 0x00, 0x53, 0x00,
+ 0xfe, 0x00, 0x11, 0x23,
+ 0x10, 0x00, 0x12, 0x00, 0xfe, 0xdd, 0x03, 0x47, 0x12, 0x00, 0xed, 0x9a,
+ 0x00, 0x10, 0x31, 0x43,
+ 0xfd, 0xc9, 0xff, 0x10, 0x10, 0x30, 0x30, 0x0e, 0x62, 0x12, 0xec, 0xff,
+ 0x10, 0x54, 0x22, 0x00,
+ 0xef, 0xcb, 0x00, 0x45, 0x32, 0x00, 0xee, 0xdd, 0x00, 0x20, 0x41, 0x10,
+ 0xed, 0xbb, 0x0f, 0x11,
+ 0x66, 0x00, 0xff, 0xdd, 0xe0, 0xff, 0x11, 0x77, 0x22, 0xee, 0x0f, 0x12,
+ 0x11, 0xdd, 0xcd, 0x24,
+ 0x65, 0x00, 0x0e, 0x0f, 0x00, 0x00, 0x22, 0x31, 0xfd, 0x0d, 0x00, 0xff,
+ 0x00, 0x34, 0x21, 0xf0,
+ 0xce, 0x98, 0xed, 0x33, 0x34, 0xde, 0x00, 0x22, 0xde, 0x99, 0x10, 0x23,
+ 0xff, 0x00, 0x12, 0xff,
+ 0xde, 0xbd, 0xdd, 0x03, 0x67, 0x01, 0xef, 0xff, 0xff, 0x01, 0x24, 0x01,
+ 0x01, 0xf0, 0x9c, 0x01,
+ 0x25, 0x22, 0x00, 0xdf, 0x00, 0x42, 0x02, 0xee, 0xff, 0x57, 0xf0, 0xbd,
+ 0x13, 0x14, 0xdd, 0xde,
+ 0x04, 0x03, 0xf0, 0xd0, 0xbd, 0xca, 0x22, 0x34, 0xee, 0xad, 0x00, 0x33,
+ 0x0e, 0xdb, 0xff, 0xff,
+ 0x20, 0x52, 0x01, 0x0f, 0x00, 0x22, 0xeb, 0xcc, 0x32, 0x75, 0x00, 0x0f,
+ 0x00, 0x0d, 0x0d, 0x00,
+ 0x0d, 0x0e, 0x52, 0x20, 0x0a, 0x0e, 0x0e, 0xeb, 0x0f, 0x72, 0x11, 0x0d,
+ 0x00, 0xff, 0xee, 0x01,
+ 0xff, 0xba, 0x12, 0x24, 0xf0, 0x00, 0x00, 0xee, 0x0f, 0x00, 0x22, 0x43,
+ 0x20, 0x00, 0xda, 0xf0,
+ 0x13, 0xf1, 0xf2, 0x8f, 0xdf, 0x07, 0xf0, 0xbe, 0x00, 0xc0, 0x03, 0x37,
+ 0x02, 0xef, 0xe0, 0xef,
+ 0x00, 0x34, 0x22, 0x01, 0xc0, 0xee, 0xd0, 0x22, 0x77, 0x01, 0x00, 0xf0,
+ 0xae, 0xee, 0xf0, 0x36,
+ 0x21, 0xcd, 0xee, 0x00, 0xef, 0x0f, 0x40, 0xec, 0xba, 0x31, 0x41, 0xec,
+ 0x0f, 0x61, 0x21, 0x10,
+ 0x21, 0x00, 0x0d, 0xfd, 0x0e, 0x77, 0x13, 0xfc, 0xef, 0x32, 0x33, 0xdc,
+ 0xff, 0x12, 0xff, 0x10,
+ 0x30, 0xec, 0x21, 0x74, 0xdd, 0xca, 0x21, 0x21, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x20, 0x52,
+ 0x02, 0xde, 0xf0, 0x77, 0x03, 0xcc, 0xff, 0x11, 0x22, 0x02, 0x12, 0x00,
+ 0x01, 0x00, 0x21, 0x33,
+ 0xdd, 0x9a, 0xf1, 0x15, 0x23, 0x01, 0x00, 0xd0, 0x8c, 0xee, 0x16, 0x11,
+ 0xf0, 0x00, 0x00, 0x22,
+ 0x45, 0xde, 0xbc, 0x11, 0x44, 0x11, 0xf0, 0xef, 0xcc, 0xff, 0x33, 0x22,
+ 0xcd, 0xee, 0x13, 0xef,
+ 0xbc, 0x02, 0x11, 0x00, 0xf0, 0xe0, 0x03, 0x17, 0x00, 0xee, 0x52, 0x34,
+ 0x00, 0xe0, 0x55, 0x31,
+ 0x0f, 0x0f, 0x54, 0x11, 0xfd, 0x0f, 0x31, 0xde, 0xff, 0x56, 0x00, 0xed,
+ 0x10, 0x44, 0xbb, 0xfe,
+ 0x23, 0x00, 0x00, 0x31, 0x31, 0x10, 0xda, 0xad, 0x00, 0x34, 0x33, 0xce,
+ 0xbb, 0xde, 0xff, 0x01,
+ 0x23, 0x34, 0x11, 0xce, 0xbc, 0x00, 0x00, 0xff, 0x22, 0x43, 0x10, 0x1f,
+ 0xe9, 0xcd, 0x20, 0x53,
+ 0x10, 0x1f, 0x10, 0x0e, 0xfc, 0x12, 0x22, 0xbb, 0xdd, 0x00, 0x01, 0x00,
+ 0xf0, 0xcc, 0xdd, 0x24,
+ 0x23, 0xbc, 0x0f, 0x00, 0xbd, 0x01, 0x27, 0x23, 0xde, 0x8a, 0xff, 0x01,
+ 0x00, 0x11, 0x00, 0xe0,
+ 0xff, 0x23, 0x44, 0xee, 0xfd, 0x34, 0x42, 0x10, 0x33, 0x20, 0x00, 0x30,
+ 0x20, 0x63, 0x35, 0x31,
+ 0x52, 0x10, 0x1e, 0xf9, 0x00, 0x41, 0x0f, 0x42, 0x24, 0xef, 0xba, 0xed,
+ 0xdc, 0x30, 0x74, 0x0f,
+ 0xed, 0x0e, 0x0e, 0x0e, 0x30, 0x0d, 0x1d, 0x55, 0x21, 0x0e, 0xeb, 0xff,
+ 0x31, 0x44, 0x21, 0x10,
+ 0x31, 0x00, 0xfe, 0x21, 0x31, 0x0f, 0xdf, 0x13, 0x22, 0xbe, 0xaa, 0xf0,
+ 0x25, 0x00, 0xbc, 0xf0,
+ 0x33, 0x10, 0xcc, 0xf0, 0x00, 0xd0, 0x02, 0x26, 0xe0, 0x8d, 0xee, 0x01,
+ 0x37, 0xf0, 0x9c, 0xfe,
+ 0x01, 0x12, 0x00, 0xff, 0xec, 0xff, 0x33, 0x0f, 0xde, 0x00, 0xcc, 0x00,
+ 0x35, 0xae, 0xef, 0x12,
+ 0x00, 0xde, 0x01, 0x06, 0xe0, 0xe0, 0xe0, 0x11, 0x53, 0xef, 0xcb, 0xf0,
+ 0x11, 0x43, 0x10, 0xde,
+ 0x9a, 0x00, 0x22, 0x00, 0xef, 0xf0, 0xee, 0x00, 0x00, 0xf0, 0x04, 0xd1,
+ 0x9e, 0xee, 0x16, 0x23,
+ 0xe0, 0x02, 0x04, 0xdf, 0xae, 0x02, 0x57, 0x13, 0xef, 0xef, 0x13, 0x12,
+ 0xfe, 0xef, 0xe3, 0xe4,
+ 0x15, 0x22, 0xbf, 0xbf, 0xf0, 0xf1, 0xcf, 0xcc, 0xf0, 0x14, 0x15, 0x00,
+ 0xad, 0xec, 0x03, 0x11,
+ 0xfe, 0x02, 0x13, 0x00, 0xfe, 0xdd, 0xca, 0x11, 0x55, 0xf0, 0xcd, 0xef,
+ 0xf1, 0xdf, 0xcc, 0x11,
+ 0x32, 0x00, 0x00, 0x42, 0xda, 0x9b, 0x00, 0x32, 0x32, 0x0f, 0xde, 0xff,
+ 0x00, 0x00, 0x02, 0xf0,
+ 0xf0, 0x22, 0x22, 0x00, 0x01, 0x00, 0x63, 0x67, 0x00, 0xec, 0x00, 0x1f,
+ 0x0e, 0x45, 0x44, 0x00,
+ 0xfe, 0xed, 0xff, 0xff, 0x0f, 0x34, 0x55, 0x00, 0xe0, 0xf0, 0x00, 0xef,
+ 0x01, 0xf1, 0xad, 0x37,
+ 0x34, 0xef, 0xee, 0x74, 0x53, 0x0f, 0x0f, 0x00, 0x23, 0x34, 0x10, 0x00,
+ 0x10, 0x33, 0x24, 0x00,
+ 0xf0, 0x02, 0xcd, 0xdb, 0x52, 0x33, 0xfd, 0xfc, 0x1f, 0x0b, 0x3f, 0x70,
+ 0x42, 0x21, 0x0b, 0x0d,
+ 0x10, 0x0f, 0x2f, 0x64, 0x11, 0x10, 0x22, 0x0d, 0x1e, 0x20, 0xe8, 0xcc,
+ 0x53, 0x44, 0x0f, 0xfc,
+ 0x20, 0x30, 0x00, 0xff, 0x42, 0x31, 0x1f, 0x1e, 0x40, 0x1f, 0x0a, 0x31,
+ 0x42, 0x0e, 0x0c, 0x60,
+ 0x55, 0x00, 0x0f, 0xfd, 0x0e, 0x30, 0x20, 0x32, 0x20, 0x0b, 0x0e, 0x71,
+ 0x21, 0xea, 0xfd, 0x0f,
+ 0x10, 0x41, 0x12, 0xff, 0xfd, 0x00, 0x00, 0xcb, 0xdf, 0x24, 0x32, 0x31,
+ 0x52, 0xff, 0xdc, 0x0f,
+ 0xf0, 0x21, 0x77, 0x20, 0xff, 0xff, 0xf0, 0xe0, 0x22, 0x00, 0xdf, 0x67,
+ 0x02, 0x8b, 0xed, 0xf0,
+ 0x25, 0x00, 0xd0, 0xe0, 0xef, 0x01, 0x23, 0xf1, 0xd0, 0x01, 0x12, 0xe0,
+ 0xef, 0x77, 0x32, 0xef,
+ 0xce, 0x12, 0x23, 0xba, 0xde, 0x54, 0x12, 0x00, 0xf0, 0xee, 0xef, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0xf0, 0xee, 0xbb, 0xfe, 0x75, 0x12, 0x00, 0x0f, 0x0f, 0xfd, 0xd8,
+ 0x10, 0x74, 0x00, 0xdf,
+ 0x0f, 0x12, 0xf0, 0xbb, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x31, 0x0e, 0x0e,
+ 0x75, 0x10, 0x0e, 0x00,
+ 0x10, 0x0e, 0xfe, 0xff, 0xf0, 0x05, 0x00, 0x00, 0x23, 0xff, 0x88, 0xf0,
+ 0x44, 0x22, 0xde, 0xfe,
+ 0x00, 0x22, 0x00, 0xf0, 0xf0, 0xf0, 0x02, 0xf2, 0xcf, 0x88, 0x00, 0x23,
+ 0x03, 0x01, 0xbd, 0xed,
+ 0x02, 0x26, 0x11, 0xce, 0xcd, 0x02, 0x26, 0x01, 0x00, 0x00, 0xff, 0x21,
+ 0x01, 0xf0, 0x21, 0x42,
+ 0x11, 0x33, 0xdf, 0xcc, 0x01, 0x00, 0x37, 0x53, 0x9d, 0xca, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xfc,
+ 0xdc, 0x00, 0x30, 0xfd, 0x0e, 0x30, 0x0c, 0x70, 0x21, 0x10, 0x20, 0x40,
+ 0x30, 0x30, 0x0b, 0xeb,
+ 0x20, 0x51, 0x10, 0x52, 0x11, 0xfd, 0xfd, 0x20, 0x1e, 0xe8, 0xf0, 0x44,
+ 0x01, 0xae, 0xfe, 0x22,
+ 0x22, 0xf0, 0xef, 0xd0, 0xe0, 0xf1, 0x9c, 0x01, 0x37, 0xf1, 0xf0, 0x01,
+ 0xe0, 0xbe, 0xf0, 0x45,
+ 0x11, 0xef, 0xcd, 0x00, 0x34, 0x00, 0xfe, 0x00, 0xde, 0xcc, 0xe0, 0xf1,
+ 0xe0, 0x10, 0xf2, 0x8c,
+ 0xcd, 0x07, 0xf1, 0xd0, 0x00, 0xef, 0xde, 0x23, 0xe0, 0x88, 0xef, 0x35,
+ 0x21, 0xf0, 0xee, 0xcd,
+ 0xff, 0x32, 0xff, 0xcc, 0xef, 0xef, 0x12, 0x45, 0x00, 0xbf, 0xdc, 0xf0,
+ 0x01, 0x12, 0x12, 0xff,
+ 0xef, 0x0f, 0x00, 0x64, 0x23, 0x0f, 0x0d, 0x0e, 0x00, 0x02, 0x14, 0x12,
+ 0xfd, 0x20, 0x77, 0x11,
+ 0xba, 0xf0, 0x01, 0xcd, 0xdc, 0x55, 0x12, 0xdf, 0xff, 0x00, 0x10, 0x00,
+ 0x11, 0x00, 0xfe, 0x20,
+ 0x43, 0x11, 0x00, 0xf1, 0xd2, 0x9e, 0xf2, 0x27, 0x17, 0xaf, 0xef, 0x00,
+ 0x01, 0xf0, 0x00, 0x02,
+ 0x00, 0xf0, 0x33, 0x00, 0x99, 0x00, 0x23, 0x34, 0xdd, 0xac, 0x13, 0x13,
+ 0xf0, 0x0f, 0x00, 0xde,
+ 0xdd, 0xff, 0x01, 0x10, 0x21, 0x0f, 0xfa, 0xff, 0x10, 0xde, 0xaa, 0x20,
+ 0x43, 0x00, 0xf0, 0x00,
+ 0xde, 0xff, 0x24, 0x12, 0xd0, 0xbe, 0xcd, 0x37, 0x64, 0xfe, 0xef, 0x13,
+ 0x13, 0xff, 0xca, 0x21,
+ 0x74, 0x10, 0x0e, 0x10, 0x30, 0x31, 0x31, 0x21, 0x42, 0x31, 0x10, 0x10,
+ 0x36, 0x76, 0x11, 0x00,
+ 0x0e, 0x00, 0x22, 0x00, 0xff, 0xcc, 0x10, 0x31, 0x10, 0x0d, 0xfa, 0x0e,
+ 0x72, 0x52, 0x0d, 0x0f,
+ 0x22, 0x0f, 0x0b, 0x21, 0x41, 0x01, 0x33, 0x22, 0x0c, 0x00, 0x33, 0x22,
+ 0x55, 0x0f, 0xbb, 0x0f,
+ 0x32, 0x43, 0x0f, 0xfc, 0x01, 0x54, 0x10, 0x0d, 0xed, 0x0f, 0x36, 0x32,
+ 0xdf, 0xcf, 0x12, 0xef,
+ 0xab, 0xf0, 0x01, 0x12, 0x00, 0xef, 0xf0, 0x0f, 0xfe, 0xdb, 0x50, 0x65,
+ 0x0f, 0x0f, 0x00, 0xfe,
+ 0xcb, 0x00, 0x35, 0x10, 0x10, 0x00, 0x00, 0xef, 0x01, 0x33, 0x20, 0xbd,
+ 0xfe, 0x75, 0x20, 0x0f,
+ 0x31, 0x43, 0x10, 0x20, 0x30, 0x10, 0xe8, 0xfd, 0x61, 0x01, 0xee, 0x00,
+ 0xf0, 0xde, 0xac, 0xff,
+ 0x00, 0xdb, 0xef, 0x14, 0x01, 0xff, 0x01, 0x0f, 0xcd, 0xf2, 0x06, 0x64,
+ 0x10, 0x00, 0xf0, 0xde,
+ 0x13, 0x77, 0x11, 0xf0, 0x00, 0x22, 0x00, 0x00, 0x13, 0xd1, 0xc0, 0xf3,
+ 0x07, 0x11, 0xd0, 0xa0,
+ 0x00, 0x00, 0xf0, 0xef, 0xf0, 0xde, 0x11, 0x76, 0x00, 0xf0, 0xee, 0xfd,
+ 0xde, 0xbf, 0xe3, 0xd0,
+ 0xdd, 0xdc, 0xed, 0x03, 0x04, 0xcb, 0xde, 0x10, 0x30, 0x3f, 0x1d, 0xdb,
+ 0x0e, 0x72, 0x60, 0x1e,
+ 0x34, 0x0b, 0xf9, 0x0f, 0x40, 0x41, 0x0e, 0x1f, 0x30, 0x0d, 0xe9, 0x30,
+ 0x72, 0x2f, 0xec, 0x0f,
+ 0x20, 0x00, 0xde, 0xfe, 0x0e, 0x71, 0x21, 0xfd, 0xd9, 0x10, 0x20, 0x1f,
+ 0x10, 0x00, 0xe0, 0xf0,
+ 0xf0, 0xbf, 0xe2, 0x04, 0xe0, 0x03, 0x02, 0x8c, 0x00, 0x37, 0xff, 0xce,
+ 0x35, 0x32, 0xe0, 0xf0,
+ 0x10, 0xf1, 0x35, 0x74, 0xe0, 0xd0, 0x02, 0x02, 0xf1, 0xf2, 0xc0, 0xf1,
+ 0xe0, 0xc1, 0x03, 0xcf,
+ 0xde, 0xf0, 0x00, 0x0e, 0x09, 0xfd, 0xbc, 0x0e, 0x61, 0x10, 0x0d, 0x21,
+ 0x51, 0x0b, 0x0c, 0x0e,
+ 0x0f, 0x10, 0x45, 0x63, 0x00, 0xfc, 0xfe, 0x10, 0x10, 0x0e, 0x32, 0x52,
+ 0x0d, 0x0d, 0xfc, 0xfc,
+ 0x11, 0x12, 0xe9, 0x10, 0x73, 0x0f, 0x0f, 0x00, 0x0e, 0x00, 0x34, 0x00,
+ 0xdc, 0x0e, 0x71, 0x10,
+ 0x0d, 0xfa, 0xee, 0x01, 0x56, 0x10, 0x0f, 0x0f, 0xef, 0x10, 0x21, 0xde,
+ 0x01, 0x35, 0xef, 0x9e,
+ 0x03, 0x03, 0xee, 0xfe, 0xf2, 0xf4, 0x07, 0x22, 0x90, 0x00, 0x23, 0xf0,
+ 0xdd, 0x00, 0x16, 0x01,
+ 0xc0, 0xbe, 0x00, 0x01, 0xe0, 0xe0, 0xf3, 0x07, 0xc0, 0x9f, 0xf0, 0xd0,
+ 0x03, 0x05, 0xf0, 0xbf,
+ 0x04, 0x16, 0xb0, 0xde, 0x00, 0x43, 0x11, 0x00, 0x00, 0xef, 0x01, 0x23,
+ 0x0f, 0xf0, 0x15, 0xcf,
+ 0xbe, 0x04, 0x02, 0xd0, 0xe0, 0xe0, 0x12, 0x01, 0xac, 0x00, 0x76, 0x10,
+ 0xfc, 0x11, 0x44, 0x0e,
+ 0x0c, 0x00, 0x31, 0x10, 0x0e, 0x00, 0x01, 0xdf, 0xcc, 0x10, 0x0e, 0x0d,
+ 0x02, 0xd0, 0xec, 0x61,
+ 0x0f, 0xd8, 0x0f, 0x20, 0x00, 0x51, 0x55, 0xfd, 0xcd, 0x0f, 0x00, 0x35,
+ 0x22, 0x0f, 0xff, 0x0e,
+ 0x0d, 0xec, 0x53, 0x34, 0x0f, 0xee, 0x0f, 0x0f, 0xee, 0xde, 0x9b, 0x43,
+ 0x67, 0x0f, 0xed, 0x00,
+ 0x00, 0x0e, 0x24, 0x12, 0xef, 0xdf, 0xce, 0xf0, 0x03, 0xe0, 0xbf, 0xf0,
+ 0xe0, 0xde, 0xeb, 0x10,
+ 0x0d, 0xda, 0x01, 0x44, 0x32, 0xff, 0x8b, 0x00, 0x77, 0x01, 0x00, 0x00,
+ 0x01, 0x21, 0x00, 0x11,
+ 0x12, 0x21, 0x23, 0x10, 0x0e, 0xfe, 0x10, 0xfc, 0xda, 0x62, 0x10, 0xed,
+ 0x2e, 0x2d, 0xe9, 0x1f,
+ 0x71, 0x50, 0x0f, 0x1e, 0x0d, 0x1d, 0x40, 0x1e, 0x0a, 0x20, 0x31, 0x1f,
+ 0x1e, 0x20, 0x31, 0x10,
+ 0x0c, 0x50, 0x64, 0x00, 0xfc, 0x00, 0x2f, 0x1e, 0x30, 0x21, 0x00, 0xcd,
+ 0x02, 0x25, 0x0f, 0x02,
+ 0xf3, 0xb0, 0xf3, 0x04, 0xf0, 0xfe, 0xdd, 0xc0, 0xd1, 0xf6, 0xe2, 0xe0,
+ 0x11, 0x21, 0x0f, 0xca,
+ 0x8c, 0xe0, 0xf0, 0xdd, 0xf3, 0x02, 0xbc, 0xdb, 0xe0, 0xe2, 0xd0, 0x9d,
+ 0xf0, 0x17, 0x02, 0xce,
+ 0xf0, 0x01, 0xee, 0xf0, 0x27, 0xf0, 0xae, 0x00, 0x01, 0xff, 0xef, 0xee,
+ 0xbd, 0x02, 0x02, 0xde,
+ 0xee, 0xee, 0xb9, 0xde, 0x04, 0x03, 0xd0, 0xcf, 0xd0, 0xf0, 0x11, 0x00,
+ 0x0d, 0x02, 0x37, 0x42,
+ 0xff, 0xee, 0x24, 0x43, 0x00, 0xe0, 0xf4, 0x14, 0x80, 0xbe, 0x03, 0x06,
+ 0xf1, 0xe1, 0xcf, 0xf0,
+ 0x03, 0x02, 0x24, 0x00, 0xe0, 0x03, 0xf0, 0x8b, 0x00, 0x17, 0xd0, 0xce,
+ 0xf1, 0xd2, 0xc0, 0xf1,
+ 0xe0, 0xf0, 0x14, 0xf1, 0xd0, 0xdf, 0xe0, 0xf0, 0xdf, 0xcf, 0x04, 0x04,
+ 0x9e, 0xde, 0xf4, 0xd0,
+ 0xbb, 0x01, 0x47, 0x00, 0xfe, 0x10, 0x00, 0xbd, 0xff, 0x12, 0x02, 0xbc,
+ 0xfd, 0x01, 0x02, 0xef,
+ 0xcf, 0x01, 0x00, 0x0e, 0x10, 0x11, 0xfd, 0xf9, 0x30, 0x74, 0x02, 0x01,
+ 0xf0, 0x16, 0x43, 0x0f,
+ 0xff, 0xff, 0xef, 0x12, 0x13, 0xbb, 0xf0, 0x33, 0x1e, 0x40, 0x30, 0xfb,
+ 0x21, 0x54, 0x20, 0x42,
+ 0x00, 0xfe, 0x57, 0x33, 0xef, 0x0f, 0x65, 0x23, 0x00, 0xff, 0x00, 0x24,
+ 0x12, 0x10, 0xfb, 0x20,
+ 0x73, 0x0f, 0xed, 0x32, 0x30, 0xf9, 0x20, 0x60, 0x0f, 0x10, 0x30, 0x2e,
+ 0x3e, 0x53, 0x0f, 0x1e,
+ 0x53, 0x1e, 0x1c, 0x35, 0x21, 0x0f, 0x10, 0x21, 0x31, 0x0d, 0x39, 0x70,
+ 0x11, 0x0e, 0x0d, 0x20,
+ 0x22, 0x10, 0x11, 0x22, 0xfc, 0xca, 0x31, 0x34, 0xd0, 0xe0, 0x00, 0x2e,
+ 0x60, 0x30, 0x20, 0x51,
+ 0x11, 0x10, 0x67, 0x31, 0x3f, 0x2c, 0x2e, 0x30, 0x20, 0x2f, 0x1b, 0x2e,
+ 0x20, 0x30, 0x0b, 0x0d,
+ 0x71, 0x30, 0x0e, 0x2f, 0x3e, 0x2d, 0x3e, 0x71, 0x1b, 0x1d, 0x05, 0x05,
+ 0xc9, 0x00, 0xee, 0x00,
+ 0x8a, 0x41, 0xd9, 0xef, 0x3b, 0x40, 0x4b, 0xf0, 0xf0, 0xf0, 0x88, 0x0e,
+ 0x75, 0x00, 0x0d, 0xf1,
+ 0x01, 0x0e, 0x0d, 0x02, 0x02, 0x0c, 0xef, 0x00, 0x11, 0x02, 0xbd, 0xd8,
+ 0x40, 0x52, 0x02, 0xd0,
+ 0x0f, 0x2e, 0x0e, 0x25, 0x23, 0xcc, 0xf0, 0x10, 0x31, 0xd1, 0xaf, 0x04,
+ 0x0f, 0xdd, 0x01, 0x54,
+ 0xef, 0xff, 0x02, 0x01, 0x53, 0x20, 0xec, 0xe2, 0x24, 0xed, 0x0f, 0xf0,
+ 0x27, 0xf0, 0x8e, 0x11,
+ 0x03, 0xdc, 0xf0, 0x77, 0x00, 0xcb, 0x12, 0x23, 0xed, 0xed, 0x12, 0x23,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0xfe, 0x55, 0x00, 0xfd, 0x00, 0x0e, 0x32, 0x00, 0xff, 0xf1, 0xac,
+ 0x13, 0x77, 0x02, 0xb9,
+ 0x10, 0x10, 0x00, 0x02, 0x12, 0xfd, 0xec, 0x22, 0x40, 0xef, 0xfe, 0x14,
+ 0x22, 0xfe, 0xbe, 0x34,
+ 0x32, 0xbc, 0x00, 0xf2, 0x0e, 0xde, 0x00, 0x47, 0x00, 0xdb, 0x00, 0x34,
+ 0xff, 0xad, 0x43, 0x00,
+ 0xcd, 0x34, 0x42, 0xee, 0xef, 0x04, 0x24, 0x00, 0x0d, 0xf0, 0xf1, 0x02,
+ 0x03, 0xf1, 0xe0, 0x01,
+ 0x41, 0x02, 0x9a, 0x00, 0x36, 0xce, 0xcf, 0x42, 0x21, 0xcc, 0xf0, 0x12,
+ 0x0f, 0x0e, 0x22, 0x03,
+ 0xee, 0xda, 0x21, 0x74, 0xfe, 0xdc, 0x64, 0x02, 0xec, 0x11, 0x21, 0xcb,
+ 0x10, 0x42, 0xf0, 0xff,
+ 0x0f, 0x00, 0x43, 0x0e, 0xdd, 0x10, 0x11, 0xf0, 0xfc, 0x00, 0x0f, 0xe0,
+ 0x46, 0xe0, 0x8a, 0x00,
+ 0x32, 0x00, 0xf0, 0x00, 0xdf, 0x2f, 0x2e, 0x00, 0x33, 0xf0, 0xa9, 0x01,
+ 0x22, 0xfe, 0xcd, 0x00,
+ 0x20, 0x01, 0xe0, 0xee, 0x01, 0x00, 0xcb, 0x00, 0x76, 0x00, 0xde, 0xfe,
+ 0x00, 0x00, 0x13, 0x52,
+ 0xca, 0xf0, 0x11, 0x0f, 0xed, 0x33, 0xf1, 0x88, 0x00, 0x10, 0x01, 0xee,
+ 0xef, 0x00, 0x01, 0xc0,
+ 0xfd, 0x00, 0x0f, 0xec, 0x00, 0x76, 0xf0, 0xfe, 0x00, 0x1f, 0x1f, 0x0e,
+ 0xe3, 0xf1, 0xed, 0x40,
+ 0x00, 0xb4, 0x05, 0xdc, 0xcd, 0x22, 0x14, 0x10, 0x2f, 0x0f, 0xce, 0xed,
+ 0x50, 0x33, 0xf0, 0x01,
+ 0xd8, 0xcc, 0x22, 0x34, 0x0d, 0x9e, 0x13, 0x11, 0xfe, 0xed, 0x01, 0xee,
+ 0x30, 0x54, 0xdd, 0xca,
+ 0x10, 0x33, 0xef, 0xfd, 0x34, 0x32, 0xf0, 0xda, 0xaf, 0x00, 0x43, 0xff,
+ 0xcc, 0x22, 0x34, 0xce,
+ 0xfd, 0x21, 0x02, 0xcf, 0x12, 0x23, 0x0e, 0x0f, 0xea, 0xaf, 0x12, 0x22,
+ 0x1e, 0x0d, 0x0e, 0x20,
+ 0x89, 0x00, 0x15, 0x0f, 0x1f, 0x43, 0xdf, 0xca, 0x01, 0x12, 0x11, 0xfe,
+ 0x00, 0x23, 0xcd, 0x99,
+ 0x11, 0x23, 0xfe, 0xfd, 0x11, 0x10, 0xe0, 0x0f, 0x12, 0x00, 0x10, 0x74,
+ 0x00, 0xef, 0xe0, 0x26,
+ 0x3f, 0xdc, 0x33, 0x36, 0xae, 0xff, 0x12, 0x41, 0x00, 0xdd, 0x12, 0x65,
+ 0xff, 0x00, 0x00, 0xfc,
+ 0x22, 0x21, 0xf0, 0x0f, 0x30, 0xdc, 0x10, 0x77, 0xff, 0xf0, 0x30, 0xf0,
+ 0x20, 0x52, 0xff, 0xdc,
+ 0x01, 0x13, 0x3d, 0x40, 0x36, 0xef, 0xdf, 0x41, 0x01, 0xed, 0x30, 0x71,
+ 0x13, 0x00, 0xed, 0xee,
+ 0x00, 0x26, 0x63, 0xf0, 0xcb, 0x00, 0x01, 0x01, 0x33, 0x31, 0x01, 0x01,
+ 0xf0, 0xaa, 0x10, 0x40,
+ 0x01, 0x05, 0xf0, 0xcb, 0x00, 0x02, 0x1f, 0xfe, 0x32, 0x56, 0xce, 0xbc,
+ 0x12, 0x22, 0xff, 0x0f,
+ 0x11, 0x01, 0xff, 0xff, 0x11, 0x01, 0x00, 0x10, 0x31, 0x0e, 0x02, 0x61,
+ 0x0e, 0xf0, 0x07, 0x37,
+ 0x0e, 0xcc, 0xf1, 0x02, 0x00, 0x1f, 0x20, 0x8f, 0xcf, 0x20, 0x00, 0xff,
+ 0x21, 0x67, 0xfe, 0xdc,
+ 0x00, 0x54, 0x0f, 0xe0, 0x13, 0x1f, 0xea, 0x01, 0x44, 0xbf, 0xff, 0x13,
+ 0x0f, 0x10, 0x44, 0xf0,
+ 0xce, 0x00, 0x34, 0xff, 0xff, 0x42, 0x01, 0xd0, 0x05, 0x42, 0x00, 0xce,
+ 0x11, 0x66, 0x00, 0xcd,
+ 0x02, 0x03, 0xff, 0x34, 0x12, 0xcc, 0x02, 0x14, 0x00, 0xed, 0x02, 0xe2,
+ 0x13, 0x20, 0x01, 0xb0,
+ 0x0d, 0x03, 0x12, 0x00, 0x57, 0x02, 0xbc, 0x00, 0x44, 0xff, 0x00, 0x14,
+ 0x02, 0xed, 0xf0, 0x13,
+ 0x3d, 0x0d, 0xe3, 0x04, 0x0c, 0x72, 0x46, 0xdd, 0xdb, 0x00, 0x41, 0x21,
+ 0x00, 0x0d, 0x1e, 0x00,
+ 0x11, 0x03, 0x2f, 0x4d, 0xb9, 0xf0, 0x20, 0x32, 0x9b, 0xdc, 0x20, 0x41,
+ 0x01, 0x00, 0xa9, 0x0f,
+ 0x31, 0x00, 0x00, 0x55, 0x0f, 0xbb, 0x00, 0x11, 0x22, 0x00, 0x00, 0xff,
+ 0xee, 0xf1, 0x25, 0x20,
+ 0xcc, 0x12, 0x31, 0xb0, 0xfe, 0x01, 0x31, 0xde, 0xee, 0x01, 0x04, 0xff,
+ 0x0d, 0x42, 0x01, 0xf1,
+ 0xfe, 0xca, 0x11, 0x32, 0x00, 0x00, 0x60, 0x0e, 0xd0, 0x02, 0x0f, 0x60,
+ 0x00, 0xee, 0x1c, 0x41,
+ 0x0d, 0xfc, 0x00, 0x08, 0xfd, 0x45, 0x12, 0xbd, 0x0e, 0x1f, 0x00, 0xe2,
+ 0xe0, 0xef, 0x0e, 0x40,
+ 0x40, 0x01, 0xee, 0xfe, 0xfb, 0x40, 0x73, 0x19, 0xcf, 0x32, 0x0e, 0xd8,
+ 0x00, 0x73, 0x00, 0xeb,
+ 0xff, 0x00, 0x11, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0xd0, 0x3f, 0x2f,
+ 0xc9, 0x32, 0x63, 0xbf,
+ 0x0e, 0x30, 0x0b, 0x00, 0x43, 0xe0, 0xce, 0x00, 0x31, 0x1f, 0xef, 0xce,
+ 0x0d, 0xef, 0xe2, 0xcf,
+ 0xeb, 0x31, 0x34, 0xee, 0xce, 0x16, 0x33, 0x00, 0xfa, 0x51, 0x33, 0xb0,
+ 0xd1, 0xef, 0x21, 0x66,
+ 0xe0, 0xc0, 0x02, 0x32, 0x0f, 0xf1, 0xd1, 0xb0, 0x01, 0x47, 0x00, 0xdf,
+ 0x00, 0x66, 0x00, 0xcf,
+ 0x00, 0x33, 0xf0, 0x00, 0x01, 0x01, 0xcd, 0x00, 0x17, 0x21, 0xfe, 0x01,
+ 0x33, 0xe0, 0xe0, 0x02,
+ 0x02, 0xee, 0x71, 0x57, 0xf0, 0xcf, 0x00, 0x3f, 0x0f, 0x01, 0x26, 0xff,
+ 0xdf, 0x43, 0x0f, 0xfc,
+ 0x24, 0x00, 0xaf, 0x12, 0x22, 0xf0, 0x10, 0x20, 0x00, 0xee, 0xbb, 0x12,
+ 0x34, 0x0c, 0x0d, 0x45,
+ 0x02, 0xef, 0xed, 0x32, 0x21, 0x42, 0x50, 0x02, 0xf1, 0x22, 0x1f, 0x98,
+ 0xdf, 0x25, 0x12, 0xcc,
+ 0x21, 0x21, 0xbe, 0xef, 0x01, 0x00, 0x01, 0x22, 0x1f, 0x0d, 0xf0, 0x02,
+ 0xe1, 0xbf, 0x23, 0x65,
+ 0x02, 0xe0, 0xe0, 0x06, 0x03, 0x20, 0x00, 0xf3, 0x12, 0x0f, 0xdf, 0x03,
+ 0x00, 0x3f, 0x24, 0xb4,
+ 0xa0, 0x26, 0x33, 0xeb, 0xbd, 0x32, 0x53, 0xe0, 0x0d, 0x0d, 0x00, 0x44,
+ 0x00, 0x0b, 0xfe, 0x2f,
+ 0x51, 0x02, 0x0d, 0x28, 0x50, 0x11, 0x00, 0xfd, 0x3d, 0x40, 0x1e, 0xea,
+ 0x00, 0x30, 0x20, 0x1d,
+ 0x0e, 0xdd, 0x3e, 0x72, 0x20, 0xb8, 0x00, 0x40, 0x00, 0xe0, 0xee, 0x0e,
+ 0x54, 0x22, 0xeb, 0xfe,
+ 0x01, 0x00, 0xed, 0x3f, 0x20, 0x0d, 0xef, 0x00, 0xf0, 0xa8, 0x0f, 0x00,
+ 0xbf, 0xfd, 0x31, 0x0f,
+ 0x8a, 0xf3, 0x12, 0x0e, 0xfd, 0x00, 0x00, 0x10, 0xec, 0xef, 0x36, 0x20,
+ 0xef, 0xdf, 0xac, 0x0e,
+ 0x10, 0x00, 0xc0, 0xae, 0xf0, 0xf0, 0x0b, 0xde, 0xf0, 0x3e, 0x1e, 0x9c,
+ 0xef, 0x12, 0x1c, 0xe8,
+ 0xe0, 0x21, 0xf0, 0xef, 0x0f, 0x0f, 0xfe, 0xf0, 0x25, 0x0f, 0x8c, 0xe0,
+ 0x01, 0x30, 0x0e, 0x00,
+ 0x11, 0xbf, 0xf0, 0x01, 0x50, 0xe8, 0xdf, 0x23, 0x12, 0x0d, 0x00, 0x0e,
+ 0x0d, 0x01, 0xe1, 0xcf,
+ 0x00, 0x14, 0xff, 0xcc, 0xc0, 0xd2, 0xd4, 0xe0, 0x9d, 0x10, 0x46, 0x00,
+ 0xd0, 0xee, 0xc9, 0x01,
+ 0x45, 0x00, 0xdf, 0x30, 0x0f, 0x8c, 0x01, 0x26, 0xf0, 0xdf, 0x01, 0x01,
+ 0x0f, 0x0f, 0xf0, 0xc0,
+ 0x01, 0xf3, 0x12, 0xee, 0xbc, 0xfe, 0x01, 0x46, 0x02, 0xcf, 0xfc, 0x00,
+ 0x65, 0xef, 0xef, 0x42,
+ 0x01, 0xcd, 0xff, 0x01, 0xe0, 0x0f, 0x15, 0x00, 0xce, 0xf0, 0x23, 0xd0,
+ 0xbc, 0x34, 0x21, 0xcc,
+ 0x00, 0x62, 0x0f, 0xf1, 0x05, 0x00, 0x10, 0x23, 0x14, 0x00, 0xee, 0x22,
+ 0x65, 0x11, 0xe0, 0xe1,
+ 0x01, 0x20, 0x52, 0x03, 0xf0, 0xc3, 0x24, 0x43, 0x1f, 0x0f, 0xe0, 0x00,
+ 0x25, 0x00, 0xe1, 0x47,
+ 0x21, 0xda, 0x60, 0x54, 0xf1, 0xef, 0x00, 0x22, 0x30, 0x10, 0x32, 0x40,
+ 0x20, 0x03, 0x11, 0x75,
+ 0x0f, 0x0c, 0x10, 0x20, 0x37, 0x01, 0xce, 0x0e, 0x41, 0x24, 0x01, 0xf0,
+ 0xbf, 0x01, 0x26, 0x30,
+ 0x00, 0x32, 0xd0, 0xcf, 0x74, 0x00, 0xfc, 0x21, 0x25, 0x00, 0xf0, 0x21,
+ 0x2e, 0x20, 0x01, 0xf1,
+ 0x14, 0x33, 0x31, 0xec, 0x8d, 0x12, 0x16, 0xed, 0xce, 0x03, 0x04, 0x53,
+ 0x50, 0x0c, 0xed, 0x32,
+ 0x51, 0x00, 0x14, 0x24, 0x0e, 0xfa, 0x0f, 0x2f, 0x10, 0x12, 0x03, 0xae,
+ 0xea, 0x11, 0x70, 0xff,
+ 0xfd, 0x11, 0x1f, 0x0e, 0x00, 0x0f, 0x1d, 0x2d, 0x2e, 0x0f, 0x0f, 0xf3,
+ 0x00, 0xd8, 0x10, 0x62,
+ 0x0f, 0xde, 0xdf, 0xcd, 0x33, 0x57, 0x02, 0xdd, 0x2f, 0x00, 0xb0, 0x00,
+ 0x14, 0x40, 0x00, 0xef,
+ 0x02, 0xf3, 0xf0, 0x2f, 0x1e, 0xec, 0x27, 0x55, 0xbf, 0xe0, 0x03, 0x35,
+ 0xee, 0x8d, 0x03, 0x23,
+ 0xed, 0xf0, 0x37, 0x22, 0xce, 0xbc, 0x00, 0x43, 0x01, 0xe0, 0x02, 0xfd,
+ 0xfe, 0x23, 0x03, 0xe1,
+ 0xf3, 0x16, 0x0e, 0xee, 0xef, 0x00, 0x00, 0xdf, 0x03, 0x14, 0xc9, 0x4f,
+ 0x70, 0x00, 0x00, 0x32,
+ 0x21, 0xee, 0xfe, 0x2f, 0x20, 0x44, 0x10, 0xdd, 0xef, 0x00, 0x1f, 0x61,
+ 0x15, 0xed, 0x0f, 0x00,
+ 0xbb, 0x0f, 0x24, 0x32, 0x98, 0xdf, 0x10, 0x3f, 0x20, 0x0e, 0xae, 0x01,
+ 0x12, 0x41, 0x02, 0xfe,
+ 0xfe, 0x24, 0x14, 0xf3, 0x24, 0x20, 0xdf, 0xf2, 0xe0, 0x13, 0x47, 0xd2,
+ 0x00, 0x40, 0xe5, 0x81,
+ 0xf0, 0x02, 0x13, 0x01, 0x10, 0x00, 0xe2, 0xb6, 0x02, 0xc0, 0xe1, 0x30,
+ 0x20, 0xdf, 0xf1, 0x37,
+ 0xe1, 0x9e, 0x0f, 0x20, 0x76, 0x00, 0xfc, 0xff, 0x32, 0x10, 0xef, 0x00,
+ 0x0d, 0xf0, 0x02, 0x5f,
+ 0xfa, 0xcf, 0x00, 0x24, 0xff, 0xec, 0x62, 0x23, 0xf0, 0xeb, 0x00, 0x10,
+ 0x2f, 0x1f, 0x01, 0x01,
+ 0xdc, 0x1f, 0x70, 0x3e, 0xea, 0x00, 0x03, 0x0d, 0xec, 0xad, 0x00, 0xe0,
+ 0xef, 0x0c, 0xfe, 0xbd,
+ 0xf3, 0x01, 0x1e, 0x3a, 0x0f, 0x51, 0x00, 0xec, 0x63, 0x13, 0x0f, 0xd9,
+ 0xef, 0x10, 0x20, 0x0f,
+ 0x00, 0xa1, 0xcd, 0x04, 0x1f, 0xc8, 0xe0, 0x20, 0xfe, 0xce, 0x00, 0x00,
+ 0xff, 0xe0, 0xdf, 0x1f,
+ 0x00, 0xdd, 0xda, 0xff, 0xd1, 0xb0, 0xbc, 0xf0, 0x27, 0xef, 0x8c, 0x11,
+ 0x12, 0xef, 0xd0, 0x33,
+ 0xf0, 0xbe, 0x01, 0x10, 0x00, 0x06, 0xe1, 0xff, 0x1e, 0x00, 0xaf, 0xf0,
+ 0xfe, 0x11, 0x36, 0xe0,
+ 0xf2, 0x10, 0xee, 0xde, 0xcf, 0xcd, 0x24, 0x74, 0xfc, 0xef, 0xf0, 0x01,
+ 0xee, 0x1d, 0x2b, 0x0d,
+ 0x00, 0xdc, 0x20, 0x74, 0x40, 0xaa, 0x01, 0x23, 0xfc, 0x00, 0x2f, 0xdc,
+ 0xe0, 0x15, 0x00, 0xec,
+ 0xd0, 0x00, 0x00, 0x20, 0x4e, 0x20, 0x11, 0xff, 0xec, 0x00, 0x5f, 0x2d,
+ 0x0c, 0x21, 0x13, 0xd0,
+ 0xde, 0xbc, 0xc0, 0xef, 0x10, 0x01, 0xad, 0xc8, 0x12, 0x22, 0xba, 0xf0,
+ 0x10, 0x01, 0x1f, 0xdc,
+ 0xd0, 0x41, 0x00, 0xd0, 0xe0, 0x01, 0xd0, 0x30, 0x40, 0xdd, 0x9e, 0x04,
+ 0x37, 0x03, 0xbd, 0xff,
+ 0x03, 0x43, 0x0e, 0xc0, 0x05, 0x32, 0x00, 0xbc, 0x01, 0x36, 0x0f, 0xee,
+ 0x33, 0x21, 0xfe, 0xf2,
+ 0x04, 0xce, 0x00, 0x75, 0x50, 0xee, 0x00, 0x10, 0x32, 0x02, 0x00, 0x00,
+ 0x2a, 0x40, 0x50, 0x00,
+ 0xfb, 0x00, 0x46, 0x10, 0x0d, 0x00, 0x1f, 0x01, 0x10, 0x0f, 0x62, 0x45,
+ 0x0e, 0xec, 0x00, 0x00,
+ 0x01, 0x12, 0x23, 0x0f, 0x0e, 0x3d, 0x20, 0x30, 0x44, 0x74, 0x2e, 0x0b,
+ 0x01, 0x10, 0x0f, 0x1e,
+ 0x00, 0xe5, 0x8e, 0xe0, 0x13, 0x0d, 0xfc, 0xe6, 0x12, 0x00, 0xd0, 0xdc,
+ 0xff, 0x4f, 0x72, 0x42,
+ 0xe0, 0xe0, 0x01, 0x1f, 0x0a, 0x12, 0x34, 0x00, 0xe0, 0xbf, 0xf0, 0x00,
+ 0xf0, 0x01, 0xf1, 0xd0,
+ 0x10, 0xef, 0x89, 0xe0, 0x26, 0x61, 0xff, 0x0f, 0x20, 0xfd, 0xde, 0x05,
+ 0x22, 0x00, 0x71, 0x0f,
+ 0xc9, 0x11, 0x11, 0x00, 0x03, 0xe0, 0xee, 0x03, 0x36, 0xef, 0xfe, 0x71,
+ 0x02, 0x00, 0xe0, 0x04,
+ 0x43, 0x0e, 0x0d, 0x1f, 0x11, 0x25, 0xf3, 0xf5, 0x01, 0x00, 0x42, 0x0f,
+ 0xed, 0x66, 0x25, 0xd0,
+ 0xdf, 0x0f, 0x71, 0x01, 0xf1, 0x01, 0x00, 0x00, 0x04, 0x01, 0xdf, 0x62,
+ 0x37, 0xb0, 0xff, 0x12,
+ 0x01, 0x00, 0xff, 0x13, 0x14, 0xdf, 0xf0, 0xe0, 0xc0, 0x00, 0x64, 0x22,
+ 0x00, 0xc0, 0x16, 0x10,
+ 0x0e, 0x41, 0x02, 0xe0, 0xf0, 0x35, 0x00, 0xdd, 0xd5, 0x01, 0x11, 0x00,
+ 0x1f, 0x71, 0x71, 0xcc,
+ 0xef, 0x25, 0x20, 0x0a, 0xdf, 0x01, 0x00, 0x1f, 0x1d, 0x10, 0x03, 0xfe,
+ 0x31, 0x70, 0xfa, 0xee,
+ 0x40, 0x00, 0x0f, 0x32, 0x11, 0xca, 0x00, 0x43, 0x2e, 0x0d, 0xf1, 0x04,
+ 0x11, 0xfd, 0xfd, 0x41,
+ 0x12, 0xbd, 0xcf, 0x02, 0x42, 0xf8, 0xce, 0xf1, 0x12, 0x0d, 0xfd, 0xf2,
+ 0xdf, 0x0e, 0x67, 0x00,
+ 0x0c, 0x00, 0x52, 0x01, 0x0f, 0x08, 0xe0, 0x40, 0x01, 0xee, 0x00, 0x20,
+ 0x5e, 0x00, 0x1f, 0x40,
+ 0x20, 0x2c, 0x10, 0xc0, 0xae, 0x01, 0x11, 0x3b, 0xef, 0xc4, 0x04, 0xff,
+ 0xeb, 0x2f, 0x70, 0x21,
+ 0xf1, 0xe0, 0x10, 0x40, 0xe8, 0xcc, 0x31, 0x31, 0xf0, 0xd0, 0x9e, 0xea,
+ 0x00, 0x30, 0x00, 0xe2,
+ 0xf0, 0x0f, 0x0f, 0x3d, 0x3a, 0x40, 0x03, 0xb1, 0x10, 0x40, 0x0c, 0xfe,
+ 0x01, 0x33, 0x0f, 0xfd,
+ 0xdf, 0xf0, 0xe0, 0xdc, 0x0f, 0x60, 0x00, 0xe0, 0xd8, 0xbd, 0x00, 0x04,
+ 0xf0, 0x1f, 0x0c, 0xbc,
+ 0x40, 0x32, 0xbf, 0x0e, 0x15, 0x2e, 0xdc, 0xff, 0x22, 0x01, 0xaf, 0x0f,
+ 0x03, 0x23, 0xe0, 0xd0,
+ 0x10, 0x20, 0x07, 0x02, 0x90, 0x04, 0x15, 0xf0, 0x0e, 0x02, 0xcf, 0x0e,
+ 0x76, 0x22, 0xc0, 0xf3,
+ 0x01, 0xf0, 0x11, 0x31, 0x10, 0xd2, 0xe5, 0x12, 0x0f, 0x8d, 0x01, 0xf3,
+ 0x00, 0xf6, 0xf1, 0x00,
+ 0x00, 0xf1, 0x15, 0x41, 0x02, 0x12, 0xe0, 0xbe, 0x11, 0x63, 0x27, 0x21,
+ 0xe0, 0xd0, 0x13, 0xf0,
+ 0xcc, 0x23, 0x14, 0x00, 0x1e, 0x10, 0xf0, 0xf1, 0x30, 0x73, 0x3f, 0xc9,
+ 0x01, 0x64, 0x0f, 0x00,
+ 0xe1, 0x13, 0x2f, 0x0c, 0x15, 0x02, 0xcf, 0x20, 0x40, 0xc0, 0xed, 0x03,
+ 0x03, 0x01, 0x0d, 0x0a,
+ 0x51, 0x24, 0xd0, 0xc0, 0x0f, 0x2b, 0x0d, 0x0f, 0x35, 0x02, 0x12, 0x02,
+ 0xef, 0x0d, 0x00, 0xe1,
+ 0xa5, 0xe2, 0x12, 0x51, 0xe0, 0x10, 0x75, 0xf0, 0xf0, 0xf0, 0xe0, 0x01,
+ 0x03, 0x2e, 0x37, 0xe2,
+ 0x8e, 0xeb, 0x01, 0x03, 0x35, 0x10, 0xf0, 0xf3, 0x00, 0x0d, 0x0d, 0xbf,
+ 0x03, 0x77, 0x0f, 0x0e,
+ 0xef, 0x21, 0x40, 0x1c, 0x3f, 0x1f, 0x1f, 0x2f, 0x1c, 0x2c, 0x10, 0x20,
+ 0x40, 0x4d, 0x0d, 0xfc,
+ 0x40, 0x2e, 0xca, 0x00, 0x51, 0x2e, 0x2c, 0x5f, 0x0e, 0x1e, 0x3e, 0x41,
+ 0x00, 0xf8, 0x0f, 0x50,
+ 0xd0, 0xcf, 0x0e, 0x3f, 0x0a, 0xe0, 0xff, 0xae, 0x0f, 0x11, 0x2c, 0xfb,
+ 0x00, 0x42, 0x11, 0x9c,
+ 0xfc, 0x23, 0x20, 0xd9, 0x00, 0x21, 0x10, 0xc0, 0xe0, 0x10, 0x2f, 0x0d,
+ 0xef, 0xce, 0xe0, 0x02,
+ 0xa0, 0xdc, 0x00, 0x00, 0x0f, 0x8a, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0xd9, 0xcd, 0xfe, 0xf0,
+ 0xfe, 0x00, 0x0f, 0x8d, 0xfc, 0xe0, 0xe0, 0x13, 0x0e, 0xfb, 0xd0, 0x01,
+ 0x11, 0xfb, 0x0f, 0x0f,
+ 0xbd, 0x0e, 0x64, 0x02, 0xde, 0x0f, 0x01, 0x31, 0xea, 0x00, 0xf0, 0xd2,
+ 0x02, 0x00, 0xcc, 0xbd,
+ 0x03, 0x00, 0xb8, 0x00, 0x22, 0xff, 0xc0, 0x01, 0xf1, 0x0d, 0x30, 0x12,
+ 0xb3, 0xe1, 0xfd, 0x0d,
+ 0x32, 0xd7, 0xf3, 0x9d, 0xec, 0x01, 0x00, 0x0e, 0x47, 0xa1, 0x05, 0x05,
+ 0x7a, 0x00, 0x88, 0x00,
+ 0xed, 0xd8, 0x1c, 0x02, 0x59, 0xda, 0x8e, 0x02, 0x0e, 0x99, 0x20, 0x45,
+ 0xc0, 0x00, 0x00, 0x0e,
+ 0xe0, 0x02, 0x24, 0x52, 0x00, 0x8a, 0x00, 0x01, 0x03, 0xf0, 0xf0, 0xfd,
+ 0x11, 0x20, 0xef, 0x0e,
+ 0xf0, 0xf3, 0x11, 0x0e, 0x0d, 0x0e, 0x9b, 0xed, 0x03, 0x37, 0x02, 0xcb,
+ 0xf0, 0xf3, 0x00, 0xf0,
+ 0x00, 0x00, 0x44, 0xf0, 0x02, 0x43, 0xff, 0xff, 0x12, 0x77, 0x20, 0x00,
+ 0xf2, 0xf2, 0xe2, 0x12,
+ 0x34, 0xde, 0xad, 0xf3, 0x17, 0x43, 0x1d, 0x30, 0x03, 0xbf, 0xf0, 0x25,
+ 0x1e, 0x0e, 0x56, 0x01,
+ 0xef, 0x0f, 0x74, 0x00, 0x0e, 0x20, 0x43, 0x10, 0x10, 0x21, 0x00, 0x1c,
+ 0x33, 0x20, 0xcc, 0x23,
+ 0x56, 0xf0, 0xfe, 0x00, 0x02, 0x00, 0xe0, 0x24, 0x73, 0x44, 0x11, 0x0e,
+ 0x0d, 0x10, 0x27, 0x23,
+ 0x0e, 0x41, 0x01, 0xef, 0x01, 0x25, 0xfe, 0xcd, 0x23, 0x34, 0xbe, 0xf0,
+ 0x45, 0x0f, 0x0f, 0x63,
+ 0x12, 0x03, 0x01, 0x0e, 0xf0, 0x36, 0x20, 0x01, 0xf2, 0x12, 0x50, 0x31,
+ 0x1f, 0x10, 0x26, 0x32,
+ 0x0f, 0x00, 0xe1, 0xec, 0x74, 0x75, 0xfe, 0xfd, 0x11, 0x10, 0x0f, 0x1d,
+ 0x75, 0x10, 0x0a, 0xfe,
+ 0x2f, 0x30, 0x0d, 0x11, 0x15, 0x0f, 0xed, 0xdd, 0x40, 0x11, 0xf0, 0x02,
+ 0x0e, 0x0b, 0x41, 0x12,
+ 0xad, 0x0d, 0x6f, 0x12, 0x07, 0xf1, 0xf0, 0x2f, 0x30, 0x00, 0x00, 0x05,
+ 0x01, 0x0e, 0xfc, 0xf1,
+ 0xa3, 0x15, 0x20, 0xef, 0xb0, 0x00, 0x20, 0x33, 0x00, 0xd2, 0x16, 0xaf,
+ 0xce, 0x24, 0x54, 0x0e,
+ 0xd0, 0x06, 0x00, 0x10, 0x02, 0xd0, 0xd2, 0x11, 0x74, 0x11, 0xee, 0xef,
+ 0x01, 0xa0, 0xf0, 0x14,
+ 0x20, 0xd9, 0xef, 0x00, 0x43, 0x12, 0xec, 0xff, 0x31, 0x43, 0xf0, 0xdd,
+ 0x00, 0x1d, 0x30, 0xf2,
+ 0xc1, 0x26, 0x72, 0x3f, 0xda, 0xcf, 0xff, 0x30, 0x11, 0xf0, 0x03, 0x32,
+ 0x2c, 0x09, 0x0f, 0x0f,
+ 0xb0, 0xf1, 0x0f, 0x70, 0xfe, 0xcd, 0x01, 0x00, 0xed, 0x37, 0x74, 0x00,
+ 0xee, 0x00, 0x3f, 0x00,
+ 0x03, 0x05, 0x1e, 0x4f, 0x00, 0xd0, 0x00, 0x30, 0x13, 0xb4, 0xd1, 0x04,
+ 0x40, 0x01, 0xe0, 0xc1,
+ 0x02, 0xf6, 0xd4, 0xd4, 0xe3, 0x1f, 0xdd, 0xe3, 0x47, 0x90, 0x01, 0x51,
+ 0x0f, 0x0e, 0x34, 0x32,
+ 0xdd, 0x0e, 0x3f, 0x3f, 0xf0, 0xf2, 0xe3, 0x8b, 0x00, 0xe3, 0xdd, 0xda,
+ 0x01, 0x13, 0x00, 0x3d,
+ 0x70, 0x0f, 0xdb, 0x20, 0x31, 0x64, 0x00, 0x0b, 0x11, 0x0f, 0xfb, 0xf1,
+ 0xd3, 0xc0, 0x2c, 0x3f,
+ 0xcc, 0xe0, 0x03, 0xd0, 0x0c, 0x0f, 0xdb, 0xdf, 0x60, 0x51, 0x00, 0xeb,
+ 0x00, 0xe0, 0xdf, 0x10,
+ 0x70, 0x10, 0xed, 0x0d, 0x20, 0xd0, 0xd0, 0xf0, 0x31, 0x0e, 0xef, 0x06,
+ 0xbd, 0x98, 0x00, 0x00,
+ 0x20, 0xf0, 0xde, 0x00, 0xdd, 0xea, 0xff, 0x10, 0x3f, 0x30, 0xa1, 0xa0,
+ 0xf0, 0x00, 0x0d, 0xef,
+ 0xcc, 0xfe, 0x04, 0xe2, 0xdc, 0xda, 0xff, 0x00, 0xff, 0xe0, 0x54, 0x01,
+ 0xed, 0xef, 0x02, 0x03,
+ 0xd0, 0x0f, 0x01, 0xc5, 0xe5, 0xc0, 0x8e, 0xf0, 0xf3, 0xc0, 0xf0, 0xf3,
+ 0xdc, 0xdd, 0x25, 0x11,
+ 0xdf, 0xee, 0xf1, 0xf2, 0x12, 0x3c, 0x3d, 0xde, 0x80, 0xf0, 0x17, 0x72,
+ 0xed, 0xd8, 0x10, 0x42,
+ 0xf0, 0xde, 0x0e, 0x01, 0xbf, 0x10, 0x40, 0xec, 0xf1, 0x00, 0x0b, 0x3e,
+ 0x1e, 0x10, 0x10, 0xfd,
+ 0xdf, 0x01, 0x33, 0x3f, 0x88, 0x0e, 0x62, 0x14, 0xfe, 0xcc, 0xff, 0x0e,
+ 0x21, 0x02, 0xe0, 0xfb,
+ 0x30, 0x0d, 0xff, 0x0f, 0x0e, 0xdc, 0xdf, 0x00, 0x23, 0xf0, 0x89, 0x8e,
+ 0x0f, 0x00, 0x13, 0x02,
+ 0xff, 0x0e, 0x01, 0x04, 0x02, 0x10, 0x40, 0x00, 0xa8, 0x00, 0x35, 0x00,
+ 0xbf, 0x00, 0x01, 0x02,
+ 0xdf, 0xff, 0x11, 0x00, 0x23, 0x04, 0x9d, 0xec, 0x07, 0x53, 0xff, 0x0f,
+ 0xf0, 0xe0, 0xe0, 0x22,
+ 0x62, 0x12, 0x0f, 0xfd, 0x00, 0x43, 0x3f, 0x1c, 0x00, 0x24, 0x10, 0x2d,
+ 0x30, 0x0e, 0x0c, 0xd2,
+ 0x12, 0x41, 0x30, 0x08, 0xbd, 0x00, 0x75, 0x40, 0x0c, 0x00, 0x11, 0x13,
+ 0x22, 0x23, 0x1d, 0x1a,
+ 0x30, 0x20, 0x1f, 0x40, 0x44, 0xcf, 0xeb, 0x31, 0x50, 0xfd, 0xf0, 0xf0,
+ 0x1f, 0x0f, 0x01, 0x03,
+ 0x00, 0xbf, 0x00, 0x00, 0x47, 0x57, 0xe0, 0xdc, 0x21, 0x40, 0x01, 0xf1,
+ 0x01, 0x0d, 0x60, 0x04,
+ 0xe0, 0xe0, 0x03, 0x35, 0xf0, 0xac, 0x00, 0x13, 0x0f, 0xe1, 0x14, 0xed,
+ 0xbe, 0x11, 0x32, 0x0d,
+ 0xe0, 0x07, 0xbf, 0xec, 0x33, 0x11, 0xce, 0x00, 0x52, 0xf1, 0xe0, 0x03,
+ 0xf0, 0xea, 0x03, 0x36,
+ 0xff, 0xde, 0x40, 0x31, 0xf1, 0xf2, 0x13, 0x2f, 0x1f, 0x52, 0x00, 0x03,
+ 0x07, 0x61, 0x20, 0xfe,
+ 0xf2, 0x17, 0x31, 0x4f, 0x00, 0xe0, 0xb3, 0x42, 0x43, 0xf0, 0xce, 0x10,
+ 0x53, 0x04, 0xf4, 0x17,
+ 0x21, 0xfe, 0x00, 0x65, 0x00, 0xe0, 0x02, 0x33, 0xf0, 0xc1, 0x02, 0x11,
+ 0x10, 0x05, 0x00, 0xb0,
+ 0x0f, 0xf0, 0x15, 0x52, 0x00, 0xcc, 0x01, 0x42, 0x03, 0x27, 0x00, 0x10,
+ 0x0e, 0xe0, 0x23, 0x05,
+ 0xe0, 0xc2, 0xe0, 0x00, 0x73, 0x23, 0xbe, 0xf0, 0x13, 0x12, 0x00, 0x02,
+ 0xee, 0xd8, 0x0f, 0x13,
+ 0xa0, 0xee, 0x0f, 0xdf, 0x20, 0x77, 0xff, 0xdd, 0x22, 0x20, 0x21, 0x24,
+ 0x0e, 0xfb, 0x10, 0x52,
+ 0x10, 0x21, 0xde, 0xab, 0x10, 0x56, 0x20, 0xec, 0xff, 0x10, 0x40, 0x0e,
+ 0xf2, 0x03, 0xed, 0xec,
+ 0x10, 0x40, 0xe0, 0xa0, 0x0f, 0xfd, 0x00, 0x07, 0x22, 0xed, 0xfa, 0x50,
+ 0x21, 0x0f, 0x2e, 0x1f,
+ 0x1f, 0x0f, 0x20, 0x51, 0xea, 0xbc, 0x0f, 0x00, 0x00, 0x12, 0x00, 0xcd,
+ 0xfa, 0x00, 0x61, 0x11,
+ 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x23, 0x20, 0x31, 0x00, 0xfd, 0x13, 0x24,
+ 0xc9, 0xde, 0x30, 0x01,
+ 0x90, 0x0f, 0xed, 0x9c, 0xfd, 0x00, 0x11, 0xde, 0xcd, 0xfd, 0x23, 0x64,
+ 0xfa, 0xcb, 0x00, 0x1e,
+ 0x2e, 0x00, 0x14, 0xee, 0xed, 0x11, 0x61, 0x00, 0x01, 0x07, 0x0f, 0xcd,
+ 0xff, 0x1f, 0x1d, 0x10,
+ 0xf2, 0x91, 0x0d, 0x08, 0x0e, 0x0f, 0x20, 0x0f, 0xec, 0xf1, 0x20, 0x2f,
+ 0x1c, 0x20, 0xdf, 0xf0,
+ 0xdd, 0xbc, 0x00, 0x0d, 0xda, 0xae, 0x2f, 0x51, 0x0f, 0xcd, 0x0f, 0x11,
+ 0x00, 0x0f, 0x32, 0x34,
+ 0xc0, 0xeb, 0x10, 0x27, 0xe6, 0x80, 0x01, 0x30, 0x00, 0x01, 0x02, 0xb0,
+ 0x00, 0x04, 0xe2, 0x02,
+ 0x02, 0x10, 0xe2, 0xd2, 0x01, 0x3f, 0x24, 0x17, 0xe5, 0x8f, 0xff, 0x01,
+ 0x33, 0x02, 0xe3, 0x01,
+ 0x32, 0x90, 0xdf, 0xf3, 0x03, 0xd0, 0x02, 0xf7, 0xd2, 0xf2, 0xcf, 0x1f,
+ 0x74, 0x32, 0xf0, 0x33,
+ 0x46, 0xe0, 0xc0, 0x1f, 0x40, 0xf2, 0x04, 0xf1, 0xfd, 0x11, 0x77, 0x11,
+ 0x00, 0x1e, 0x00, 0x57,
+ 0x00, 0xee, 0x31, 0x00, 0xcd, 0x50, 0x13, 0xee, 0xe0, 0x07, 0xe0, 0xfd,
+ 0x1e, 0x70, 0x13, 0xf0,
+ 0x00, 0x10, 0x00, 0xdd, 0x67, 0x22, 0xdf, 0x00, 0x51, 0x02, 0xe0, 0x00,
+ 0xff, 0x0f, 0x21, 0x17,
+ 0x11, 0xed, 0x1f, 0x20, 0x02, 0xf3, 0x01, 0xfe, 0x8c, 0x0f, 0x27, 0x05,
+ 0x80, 0x00, 0x00, 0x0f,
+ 0x00, 0x26, 0x00, 0x0f, 0x00, 0x42, 0x01, 0xf0, 0x10, 0x22, 0xff, 0xcd,
+ 0x22, 0x10, 0xce, 0x01,
+ 0x17, 0x30, 0xcc, 0xde, 0x00, 0x30, 0xfc, 0xf0, 0x73, 0x71, 0x0c, 0x0f,
+ 0xfe, 0xff, 0x23, 0x75,
+ 0x0d, 0xfd, 0x1f, 0x2e, 0x0e, 0x0e, 0x0c, 0xfb, 0x0d, 0x40, 0x0f, 0xdc,
+ 0xfe, 0x10, 0x01, 0x0f,
+ 0xf8, 0x4f, 0x2f, 0xff, 0xde, 0x40, 0x0d, 0xf8, 0x70, 0x31, 0xd0, 0xdf,
+ 0x0e, 0x3e, 0x20, 0x12,
+ 0xf0, 0xec, 0xdd, 0x1f, 0x7e, 0xef, 0xdc, 0x01, 0x1e, 0xfa, 0x8f, 0xfd,
+ 0xfe, 0x1f, 0x10, 0x00,
+ 0xfd, 0xe2, 0xdf, 0xf9, 0x1f, 0x2e, 0xac, 0xdf, 0x00, 0xe0, 0xcc, 0xbf,
+ 0xdf, 0xff, 0xfc, 0x0d,
+ 0xdd, 0xaf, 0x01, 0x02, 0xe2, 0xfe, 0xe8, 0xf9, 0x00, 0xf3, 0xc0, 0xd0,
+ 0xef, 0xee, 0xdd, 0x62,
+ 0x44, 0xc0, 0xbb, 0x00, 0xf1, 0x00, 0x21, 0xee, 0xe0, 0x00, 0xff, 0xed,
+ 0x0f, 0x02, 0xd1, 0x04,
+ 0x43, 0xbe, 0xde, 0x02, 0x22, 0x00, 0xf2, 0xd7, 0xc2, 0xc0, 0xda, 0xee,
+ 0xff, 0x35, 0x12, 0x8d,
+ 0xfd, 0x00, 0x32, 0x20, 0x0e, 0xbf, 0x00, 0x09, 0x1d, 0x31, 0xd3, 0x9e,
+ 0x0d, 0x10, 0x0f, 0xc1,
+ 0x07, 0x02, 0x0f, 0xed, 0x10, 0x33, 0xdc, 0xde, 0xe0, 0x06, 0x11, 0x8c,
+ 0x0f, 0x0f, 0x0f, 0xf2,
+ 0x04, 0xac, 0xec, 0x10, 0x01, 0x11, 0x12, 0xef, 0xae, 0x02, 0x01, 0xeb,
+ 0x00, 0xf7, 0x90, 0x0e,
+ 0x22, 0x10, 0xf1, 0xf0, 0x01, 0x01, 0x31, 0xef, 0x01, 0x76, 0x12, 0xfe,
+ 0xcf, 0x13, 0x04, 0xef,
+ 0xd1, 0xe7, 0xe1, 0x11, 0xd0, 0xbf, 0x03, 0x13, 0x20, 0x46, 0x00, 0x00,
+ 0x60, 0x20, 0x10, 0x12,
+ 0x00, 0xff, 0x41, 0x20, 0x10, 0x11, 0x05, 0x13, 0x60, 0x1e, 0x00, 0x0e,
+ 0x0e, 0x3a, 0x40, 0x36,
+ 0x00, 0x12, 0x70, 0x40, 0x20, 0x11, 0x14, 0x32, 0x30, 0x1e, 0x35, 0x63,
+ 0x0d, 0x1e, 0x33, 0x01,
+ 0xfc, 0x0f, 0x01, 0xe2, 0x05, 0x72, 0x10, 0x1b, 0x0e, 0x00, 0x02, 0x02,
+ 0x30, 0x7f, 0x43, 0x00,
+ 0x0f, 0x00, 0x0f, 0x37, 0x37, 0xe0, 0x01, 0x74, 0x10, 0xef, 0x01, 0x12,
+ 0xe0, 0xe2, 0x14, 0x41,
+ 0x13, 0xee, 0xcb, 0x10, 0x42, 0x36, 0x01, 0xf0, 0x3c, 0x60, 0x02, 0x01,
+ 0x11, 0x50, 0x03, 0x0f,
+ 0x1c, 0x10, 0x00, 0x11, 0x00, 0x0d, 0x6e, 0x1d, 0xf0, 0xec, 0x0d, 0x71,
+ 0x30, 0xf9, 0x00, 0x03,
+ 0x20, 0x1c, 0x71, 0x06, 0x00, 0x00, 0xfe, 0x00, 0x26, 0x22, 0xde, 0x10,
+ 0x40, 0xe0, 0xff, 0x14,
+ 0x0f, 0xba, 0x10, 0x62, 0x01, 0xff, 0x0f, 0x10, 0x20, 0x1f, 0x03, 0x27,
+ 0x01, 0x0d, 0x00, 0xc3,
+ 0xb0, 0x04, 0xe1, 0x22, 0x00, 0xd1, 0xd2, 0x04, 0x74, 0x40, 0x00, 0x0f,
+ 0xe1, 0x15, 0x00, 0xff,
+ 0x02, 0xe1, 0xed, 0x40, 0x04, 0xa2, 0xc1, 0xf1, 0x03, 0x0d, 0xf1, 0x00,
+ 0x08, 0x60, 0x37, 0x03,
+ 0xcc, 0xff, 0x00, 0x21, 0x20, 0x0c, 0x20, 0xff, 0xad, 0x03, 0xf1, 0xfa,
+ 0x0f, 0x10, 0xf0, 0x04,
+ 0x50, 0xcd, 0xab, 0x13, 0x24, 0xef, 0xfd, 0x00, 0x30, 0x23, 0x12, 0xf0,
+ 0x0e, 0x6f, 0x41, 0x12,
+ 0x12, 0x00, 0x09, 0x00, 0x12, 0x01, 0x8b, 0x00, 0x14, 0x10, 0xdd, 0xe0,
+ 0xe4, 0x02, 0xef, 0x40,
+ 0x57, 0x00, 0xe0, 0x0f, 0x14, 0x42, 0xff, 0x00, 0x14, 0x31, 0x01, 0xce,
+ 0xbe, 0x13, 0x56, 0xef,
+ 0xf0, 0x01, 0x0b, 0x10, 0x41, 0xf2, 0xcf, 0x00, 0x21, 0x12, 0x02, 0x0c,
+ 0x0d, 0x33, 0x13, 0x0d,
+ 0x30, 0x31, 0xee, 0xfc, 0x10, 0x13, 0x34, 0x70, 0xc8, 0xde, 0x15, 0xf0,
+ 0xbe, 0x0f, 0xdf, 0xbc,
+ 0x0f, 0xe0, 0xcd, 0x00, 0x20, 0xf9, 0xf0, 0x3f, 0x0f, 0xde, 0x31, 0x12,
+ 0x10, 0x7d, 0x2f, 0xfe,
+ 0x89, 0xf0, 0x02, 0x00, 0xfc, 0x01, 0x13, 0xdc, 0xbc, 0x00, 0x00, 0x30,
+ 0xfa, 0xd0, 0x30, 0x62,
+ 0xdc, 0xdd, 0x00, 0x01, 0x03, 0x10, 0xeb, 0xaf, 0xee, 0xdf, 0xe0, 0xe3,
+ 0xdf, 0xa9, 0xff, 0x11,
+ 0x10, 0xca, 0xfe, 0x00, 0xf0, 0xf1, 0xdf, 0xeb, 0x00, 0x20, 0x01, 0xe0,
+ 0xc0, 0xd0, 0xc1, 0xd0,
+ 0x1e, 0x32, 0x05, 0x80, 0xad, 0x0f, 0x04, 0x02, 0xd0, 0xfe, 0xff, 0xf0,
+ 0x07, 0x01, 0xd0, 0x00,
+ 0xb1, 0xdf, 0xfe, 0x14, 0x00, 0x80, 0x07, 0xe1, 0xff, 0xfe, 0xe0, 0xe3,
+ 0x00, 0x0c, 0xe0, 0xd3,
+ 0x0e, 0x1e, 0x22, 0xfb, 0xca, 0x00, 0x31, 0xf1, 0xbd, 0x0f, 0xc0, 0xde,
+ 0x3f, 0x2d, 0x0f, 0x04,
+ 0xf1, 0xcb, 0x0c, 0x30, 0x7f, 0x74, 0x10, 0xcd, 0x0f, 0x0f, 0x0d, 0xeb,
+ 0xde, 0x0e, 0x2f, 0x2f,
+ 0xfd, 0xdb, 0xdc, 0xee, 0x4e, 0x30, 0xfe, 0x0f, 0x9f, 0xcb, 0xef, 0xef,
+ 0xff, 0x0f, 0xde, 0xdd,
+ 0xcd, 0x03, 0x76, 0x1e, 0x2e, 0x0e, 0x1e, 0x00, 0x0a, 0x0f, 0x12, 0xe0,
+ 0x10, 0x77, 0x00, 0x8d,
+ 0xff, 0xf2, 0xf4, 0x04, 0xe1, 0xae, 0x0d, 0x13, 0x02, 0x00, 0x00, 0xf5,
+ 0x04, 0x41, 0x00, 0x0d,
+ 0x2f, 0x1f, 0x00, 0x12, 0x41, 0x0f, 0x00, 0x0d, 0xe8, 0x2c, 0x30, 0xf0,
+ 0xf2, 0x51, 0x22, 0xf1,
+ 0x21, 0x4e, 0x09, 0x70, 0x64, 0x11, 0x0d, 0x0f, 0x20, 0x22, 0x30, 0x11,
+ 0x33, 0x41, 0x1f, 0x21,
+ 0x32, 0x0d, 0x3e, 0x77, 0x27, 0x0f, 0xfb, 0x0f, 0x1f, 0x41, 0xe0, 0xd0,
+ 0x1e, 0x4e, 0x2d, 0x20,
+ 0x15, 0x20, 0x1f, 0x60, 0x00, 0x00, 0x00, 0x11, 0x35, 0x12, 0xc0, 0xee,
+ 0x00, 0x44, 0x20, 0x54,
+ 0x00, 0x8d, 0xfe, 0x04, 0x36, 0x10, 0xfe, 0x10, 0x35, 0x00, 0xbf, 0x01,
+ 0x00, 0xff, 0x0e, 0xf6,
+ 0xd0, 0xbf, 0x0f, 0x21, 0x01, 0xf0, 0xdf, 0x0f, 0xcf, 0x10, 0x41, 0xd9,
+ 0xdf, 0x03, 0xe4, 0xd0,
+ 0xf0, 0x01, 0x43, 0x46, 0x32, 0x20, 0xbb, 0x01, 0x06, 0x00, 0x00, 0xe0,
+ 0x40, 0x20, 0xf1, 0xb3,
+ 0xe1, 0x00, 0x72, 0x46, 0x10, 0x1f, 0xff, 0x01, 0x05, 0x41, 0x20, 0x10,
+ 0x01, 0x11, 0x65, 0x02,
+ 0xe1, 0xf1, 0x43, 0x20, 0x14, 0x14, 0xf1, 0xc2, 0x20, 0x73, 0x11, 0x02,
+ 0x02, 0x24, 0x03, 0xd1,
+ 0xe2, 0x32, 0x31, 0xfe, 0xe1, 0x37, 0x67, 0x10, 0x00, 0x0f, 0x11, 0x73,
+ 0x12, 0xf1, 0xf4, 0x15,
+ 0x72, 0x0f, 0x0e, 0xf0, 0x00, 0x04, 0x46, 0x10, 0x0e, 0x10, 0x00, 0xb1,
+ 0x00, 0x02, 0xf0, 0xb2,
+ 0xf1, 0xe0, 0xe0, 0xe7, 0xf2, 0xe0, 0x2f, 0x23, 0x15, 0x20, 0x3f, 0xee,
+ 0x3f, 0x72, 0x74, 0x41,
+ 0xee, 0x0b, 0x20, 0x21, 0x01, 0xcd, 0xff, 0x00, 0x35, 0x10, 0xed, 0xce,
+ 0x00, 0x10, 0xec, 0xe0,
+ 0x57, 0x20, 0x1f, 0x00, 0x01, 0x03, 0x0d, 0x3c, 0x70, 0x52, 0xff, 0xfe,
+ 0xff, 0x1a, 0x3c, 0xfc,
+ 0xbf, 0x00, 0x10, 0x0e, 0x1e, 0x0b, 0x0e, 0x1d, 0x30, 0x00, 0xeb, 0x10,
+ 0x0e, 0xed, 0x3e, 0x70,
+ 0x31, 0x1e, 0x3e, 0x1b, 0x20, 0x75, 0x21, 0x0e, 0x0d, 0x61, 0x02, 0x00,
+ 0xe0, 0x00, 0x10, 0xe8,
+ 0xff, 0xbe, 0xb0, 0x01, 0xf1, 0xf0, 0xd8, 0xdf, 0x20, 0x2f, 0x0f, 0xe0,
+ 0x00, 0x21, 0x10, 0x2d,
+ 0x40, 0xfd, 0xc9, 0x10, 0x13, 0x80, 0xfd, 0x00, 0xde, 0x9b, 0x00, 0x35,
+ 0x0f, 0x0e, 0x1f, 0xcf,
+ 0xdd, 0x00, 0x10, 0x1f, 0x0d, 0xff, 0xc1, 0xd3, 0xf0, 0x08, 0xee, 0x0f,
+ 0x0d, 0xb0, 0xe0, 0xf0,
+ 0xa9, 0xce, 0x0d, 0x30, 0x20, 0xeb, 0xbd, 0x0e, 0x41, 0x43, 0x1e, 0x0a,
+ 0xd0, 0x0e, 0x20, 0x63,
+ 0xf1, 0xef, 0xed, 0xed, 0xf0, 0x07, 0x02, 0xef, 0x00, 0x04, 0xf0, 0x00,
+ 0x21, 0x00, 0x72, 0x14,
+ 0xb4, 0xe2, 0x22, 0x31, 0xe0, 0xc0, 0xe6, 0xc4, 0xf4, 0xe0, 0xd1, 0x21,
+ 0x75, 0x51, 0xe0, 0xd0,
+ 0xf2, 0x14, 0x22, 0x00, 0xe1, 0x04, 0xb0, 0xe0, 0x01, 0x01, 0x02, 0x06,
+ 0xc2, 0x00, 0x32, 0x00,
+ 0x01, 0x01, 0x43, 0x05, 0xb3, 0x02, 0x30, 0x1f, 0x0e, 0x23, 0xf5, 0xd0,
+ 0x0f, 0x73, 0x72, 0x32,
+ 0xff, 0xda, 0x0f, 0x00, 0x20, 0x32, 0x1f, 0xfc, 0x0f, 0x0f, 0x0f, 0xf0,
+ 0xb0, 0x11, 0x47, 0x22,
+ 0xf0, 0x0d, 0x0f, 0x4e, 0x73, 0x37, 0x27, 0xe0, 0x0f, 0x70, 0x00, 0x12,
+ 0x00, 0x01, 0xe2, 0x00,
+ 0x0e, 0x00, 0xd4, 0xde, 0x0d, 0x0f, 0xa1, 0xe7, 0x03, 0x0f, 0x00, 0x15,
+ 0x11, 0x11, 0x50, 0x33,
+ 0x14, 0xff, 0x0f, 0x42, 0x72, 0x13, 0xff, 0xdc, 0xf3, 0x17, 0x05, 0x05,
+ 0x19, 0x00, 0x1e, 0x00,
+ 0xe1, 0x04, 0x24, 0x1d, 0x8e, 0x06, 0x4e, 0x1d, 0xc9, 0xd0, 0xb1, 0x07,
+ 0x03, 0xaf, 0x0e, 0x34,
+ 0x44, 0xae, 0xff, 0x1f, 0x30, 0x30, 0x21, 0x40, 0x10, 0x1f, 0x03, 0x10,
+ 0x09, 0x0e, 0x70, 0x73,
+ 0x00, 0x08, 0xdf, 0x0e, 0x00, 0x0d, 0x2f, 0x2e, 0xfe, 0xfb, 0x1e, 0x7d,
+ 0x1d, 0x0b, 0x10, 0x30,
+ 0x10, 0x1c, 0x7f, 0x0c, 0x0e, 0xee, 0xfe, 0x00, 0x1a, 0x0f, 0x00, 0x00,
+ 0x1d, 0x1c, 0x2e, 0x2e,
+ 0x3e, 0x4e, 0xfc, 0xef, 0xdc, 0x0c, 0x7e, 0x41, 0xef, 0xda, 0x00, 0xd0,
+ 0xdd, 0xcd, 0x0c, 0x00,
+ 0x9c, 0xdd, 0xed, 0xee, 0xdc, 0xdf, 0x0f, 0x1d, 0xcc, 0x8e, 0xef, 0x0c,
+ 0x40, 0xf1, 0xc0, 0xee,
+ 0xda, 0xef, 0xf0, 0x01, 0xf0, 0xb0, 0xd0, 0xcb, 0xf0, 0xf0, 0xf0, 0x0e,
+ 0xdf, 0xcf, 0x0f, 0x5d,
+ 0xf8, 0xdd, 0xfe, 0x14, 0x04, 0xb0, 0xdb, 0xf0, 0xf2, 0xf0, 0xff, 0xa0,
+ 0xc0, 0xe0, 0x10, 0x11,
+ 0x04, 0xc0, 0xde, 0xee, 0x14, 0x24, 0xef, 0xfe, 0xf0, 0xd1, 0xf0, 0x02,
+ 0x46, 0xcc, 0x19, 0x70,
+ 0x30, 0xc3, 0xde, 0x1e, 0x20, 0x2d, 0x10, 0xc0, 0xc0, 0xf1, 0x1f, 0x1e,
+ 0xed, 0xcf, 0x01, 0x02,
+ 0x5a, 0x1c, 0x0d, 0xfe, 0x0e, 0x0b, 0xef, 0xfd, 0xfe, 0xd2, 0xdf, 0x89,
+ 0xae, 0xff, 0xf2, 0xf5,
+ 0xee, 0xff, 0xff, 0x02, 0xd0, 0x0e, 0x2f, 0x3f, 0x00, 0x06, 0xe3, 0x9f,
+ 0x0a, 0x62, 0x32, 0xeb,
+ 0xf1, 0x37, 0xb0, 0xcb, 0x22, 0x22, 0x9e, 0xfe, 0x03, 0x04, 0xff, 0xee,
+ 0x01, 0x03, 0x00, 0x11,
+ 0x00, 0x04, 0xf0, 0x10, 0x10, 0x00, 0xd3, 0x02, 0x01, 0xff, 0x00, 0x63,
+ 0xf3, 0xbe, 0x00, 0x13,
+ 0x26, 0x00, 0xcf, 0x20, 0x42, 0x2f, 0x20, 0xfa, 0x20, 0x77, 0x0f, 0x1e,
+ 0x40, 0x23, 0x1f, 0x2f,
+ 0x64, 0x02, 0x10, 0x00, 0x30, 0x36, 0x10, 0x1f, 0x20, 0xf3, 0x02, 0x2c,
+ 0x4f, 0x31, 0x00, 0x0f,
+ 0x00, 0x10, 0x5e, 0x3b, 0x30, 0x52, 0x10, 0x20, 0x0d, 0x0b, 0x70, 0x23,
+ 0x26, 0x12, 0x20, 0x0e,
+ 0x30, 0x52, 0x11, 0x04, 0x01, 0xf0, 0x00, 0x25, 0x20, 0x10, 0x00, 0xd7,
+ 0x04, 0x71, 0x70, 0x01,
+ 0x13, 0xf0, 0xf1, 0x06, 0x01, 0xf1, 0x21, 0x00, 0xde, 0xd0, 0xf4, 0xf0,
+ 0xef, 0x5f, 0x53, 0x25,
+ 0x10, 0x1f, 0x30, 0x51, 0x2e, 0x2d, 0x1f, 0x10, 0x17, 0x30, 0x30, 0x0e,
+ 0xef, 0x33, 0x66, 0x31,
+ 0x30, 0x40, 0x61, 0x10, 0x1f, 0x01, 0x10, 0x62, 0x34, 0x00, 0x2c, 0x0f,
+ 0x36, 0xf1, 0xdc, 0x3f,
+ 0x70, 0x13, 0xf0, 0xf0, 0x0f, 0x3d, 0x23, 0x27, 0x03, 0xed, 0xdc, 0x41,
+ 0x52, 0x01, 0x0c, 0x0e,
+ 0xe2, 0x05, 0x30, 0x3e, 0x40, 0x73, 0x54, 0x0d, 0xdd, 0x03, 0x27, 0x00,
+ 0x01, 0x00, 0xee, 0x91,
+ 0xf6, 0x01, 0x20, 0x1f, 0xe2, 0xf6, 0x00, 0x20, 0x4f, 0x50, 0x1e, 0x00,
+ 0xf0, 0x00, 0x1d, 0x11,
+ 0x21, 0xaf, 0xdc, 0xee, 0x00, 0xf1, 0xf0, 0xbf, 0xdc, 0xe2, 0x00, 0x10,
+ 0x1e, 0x00, 0x25, 0x1b,
+ 0xca, 0xb0, 0x57, 0x33, 0xcb, 0x0f, 0x72, 0x02, 0xff, 0xde, 0x00, 0x21,
+ 0x01, 0xef, 0x00, 0x20,
+ 0x01, 0xf0, 0xf1, 0xff, 0x1f, 0x00, 0x01, 0x14, 0x62, 0x0e, 0x1d, 0x52,
+ 0x10, 0x04, 0xd5, 0x21,
+ 0x51, 0x20, 0x1e, 0x11, 0xf7, 0xc1, 0x0f, 0x0c, 0xf0, 0x02, 0xf1, 0xaf,
+ 0xfd, 0x01, 0x25, 0x0f,
+ 0x2a, 0x50, 0x00, 0x01, 0x22, 0x43, 0x3e, 0x3f, 0x55, 0x01, 0x11, 0x23,
+ 0x0e, 0x0c, 0x32, 0x05,
+ 0xc2, 0xbf, 0xff, 0x01, 0x3e, 0xde, 0xa4, 0x04, 0xff, 0x2a, 0x30, 0x20,
+ 0xd0, 0x9f, 0xdc, 0xee,
+ 0x0e, 0x11, 0x24, 0xb0, 0xcf, 0x0e, 0x00, 0x0e, 0xfe, 0xbd, 0x02, 0xe7,
+ 0xf0, 0xfc, 0xdc, 0x0f,
+ 0x0f, 0x2f, 0x20, 0x41, 0x23, 0xde, 0xc8, 0xf0, 0xe0, 0x00, 0x00, 0x2c,
+ 0xc0, 0xac, 0xd0, 0xc0,
+ 0xc0, 0xde, 0xef, 0xef, 0xee, 0xd0, 0xfd, 0xfa, 0xbf, 0xff, 0x00, 0xea,
+ 0x9d, 0x0e, 0x20, 0x21,
+ 0xcc, 0xbc, 0xfe, 0xee, 0xf0, 0xc2, 0xfe, 0xfa, 0x0f, 0xed, 0x0d, 0x10,
+ 0x11, 0xf0, 0xce, 0x0c,
+ 0x2e, 0x2f, 0x1e, 0xdd, 0x8f, 0xd6, 0xf4, 0x00, 0xff, 0xd2, 0xc1, 0xc1,
+ 0xe7, 0xd2, 0x33, 0x11,
+ 0x91, 0xe6, 0xe0, 0xbe, 0xf0, 0xf1, 0xf2, 0xe0, 0xd0, 0xc0, 0xf2, 0x00,
+ 0x0e, 0x1e, 0x0c, 0xe3,
+ 0xd7, 0xc0, 0xed, 0xec, 0x20, 0x13, 0x81, 0xaf, 0xf0, 0x0c, 0x00, 0x23,
+ 0xf0, 0xd0, 0x0c, 0x3a,
+ 0x4e, 0x1e, 0x0d, 0xfd, 0x00, 0x2f, 0x0a, 0x1e, 0xce, 0xbd, 0xfe, 0xf8,
+ 0xee, 0xef, 0xcf, 0xcd,
+ 0x0f, 0x0f, 0x9e, 0xec, 0x0e, 0x1d, 0x40, 0x22, 0x00, 0xdc, 0x0c, 0x3c,
+ 0x6d, 0x0d, 0xfd, 0x0d,
+ 0x0b, 0x0c, 0x0e, 0x0e, 0x1f, 0x0c, 0x0e, 0x01, 0x8e, 0xed, 0xe2, 0x07,
+ 0x11, 0xef, 0xdd, 0xe0,
+ 0xf2, 0xa4, 0xf0, 0x00, 0xf0, 0x07, 0x00, 0x1e, 0xfe, 0xff, 0x23, 0x56,
+ 0xf1, 0xd0, 0x0e, 0x70,
+ 0x20, 0xf0, 0xcf, 0x0d, 0xf0, 0xf6, 0x0f, 0x3e, 0x1e, 0x0c, 0xdd, 0x53,
+ 0x45, 0x11, 0x40, 0x2d,
+ 0x10, 0x15, 0x0f, 0xfc, 0x75, 0x73, 0x1d, 0xce, 0x17, 0x12, 0x0d, 0x0e,
+ 0x42, 0x45, 0x0f, 0xee,
+ 0x01, 0x10, 0x30, 0x0f, 0x30, 0x10, 0x0f, 0x00, 0x30, 0x0c, 0x2f, 0x52,
+ 0x24, 0x00, 0x0c, 0x0f,
+ 0x50, 0x21, 0x10, 0x10, 0x00, 0x1e, 0x51, 0x01, 0xc8, 0xfe, 0x77, 0x31,
+ 0xde, 0x0f, 0x20, 0x22,
+ 0xf0, 0x00, 0x10, 0x20, 0x00, 0xf0, 0xf3, 0x0f, 0xde, 0xa1, 0xf2, 0xfe,
+ 0x3e, 0x6f, 0xf8, 0xee,
+ 0x00, 0xe3, 0xfe, 0x0f, 0x53, 0x04, 0xff, 0xee, 0xfe, 0x00, 0xe0, 0xd1,
+ 0x07, 0xe6, 0xad, 0x20,
+ 0x03, 0xb2, 0xf1, 0x2f, 0x60, 0xf0, 0xc3, 0x07, 0x02, 0x2d, 0x00, 0xe3,
+ 0xe7, 0x00, 0x00, 0x60,
+ 0x10, 0x12, 0x06, 0xe0, 0xef, 0x61, 0x33, 0xe0, 0xd0, 0x01, 0xf5, 0x22,
+ 0x2f, 0x30, 0x16, 0x00,
+ 0x30, 0x51, 0xe1, 0x01, 0x73, 0x31, 0x00, 0x21, 0x01, 0x24, 0x13, 0xf0,
+ 0xf2, 0xc4, 0x05, 0x13,
+ 0x11, 0x2f, 0x7e, 0x22, 0x07, 0x12, 0x50, 0x0f, 0x50, 0x20, 0x24, 0x01,
+ 0x2e, 0x71, 0x11, 0x00,
+ 0x1e, 0x02, 0x25, 0xec, 0xfe, 0x10, 0x03, 0x00, 0xd0, 0xf1, 0xcf, 0xe4,
+ 0x37, 0x41, 0xc0, 0xe2,
+ 0x02, 0x31, 0x11, 0xdd, 0x20, 0x72, 0x17, 0xe3, 0x00, 0x20, 0x4d, 0x10,
+ 0x65, 0x01, 0xcf, 0x0f,
+ 0x02, 0xf2, 0xd2, 0xf0, 0x2f, 0x32, 0xc0, 0xd4, 0x27, 0x30, 0x00, 0x41,
+ 0x00, 0x8f, 0x16, 0x20,
+ 0x4c, 0x12, 0x16, 0x00, 0x0f, 0x00, 0x33, 0x0e, 0x0d, 0x30, 0x11, 0xcf,
+ 0xac, 0xff, 0xff, 0xfe,
+ 0x30, 0x2c, 0x0a, 0x50, 0x3e, 0x00, 0xfe, 0x00, 0x1c, 0x4d, 0x70, 0x0e,
+ 0x2d, 0x23, 0x0f, 0x1c,
+ 0x40, 0x2f, 0x18, 0x1f, 0x10, 0xfe, 0xcf, 0xde, 0xff, 0x0d, 0x1b, 0x00,
+ 0xe1, 0xd0, 0xfc, 0x7f,
+ 0x4f, 0x00, 0x00, 0xef, 0x32, 0xad, 0xb8, 0xfe, 0x0f, 0x30, 0xef, 0xaf,
+ 0x0f, 0xfd, 0x1d, 0x31,
+ 0xf2, 0xed, 0x0c, 0x4b, 0x2e, 0x20, 0x00, 0xd8, 0xff, 0x00, 0xef, 0xe0,
+ 0x9e, 0xbe, 0xf2, 0x01,
+ 0x0f, 0xbd, 0xba, 0xfe, 0xef, 0x0f, 0x21, 0x0f, 0xfe, 0xef, 0xdd, 0xfa,
+ 0xdf, 0x01, 0x0f, 0xa8,
+ 0xef, 0x0f, 0xf0, 0x0e, 0x0f, 0xde, 0x00, 0x60, 0x2e, 0x1a, 0x0f, 0x0e,
+ 0x0f, 0xa0, 0xf1, 0x11,
+ 0x40, 0x0d, 0xdc, 0xd0, 0xe2, 0x04, 0x60, 0x2e, 0x20, 0xe6, 0xf2, 0xef,
+ 0xfd, 0x02, 0x47, 0x15,
+ 0xc0, 0xc2, 0xa0, 0xf1, 0x02, 0x14, 0x03, 0xd0, 0x10, 0x32, 0x15, 0x31,
+ 0x0f, 0x0f, 0x01, 0x03,
+ 0xf2, 0x07, 0x12, 0x41, 0x60, 0x22, 0xd3, 0x81, 0xf4, 0xf2, 0xf0, 0xf4,
+ 0x33, 0x43, 0x00, 0xdf,
+ 0x20, 0x12, 0x27, 0x34, 0x72, 0x0f, 0x0e, 0x01, 0x31, 0x11, 0xce, 0xac,
+ 0x02, 0x17, 0x01, 0xfd,
+ 0xce, 0xf0, 0x01, 0x20, 0x34, 0x01, 0x00, 0x00, 0xe0, 0x3e, 0x70, 0x76,
+ 0x12, 0x10, 0x0d, 0x1f,
+ 0x03, 0x13, 0x10, 0x10, 0x35, 0x00, 0xcf, 0xe3, 0xf7, 0xf4, 0x13, 0x40,
+ 0x00, 0xbf, 0xf0, 0x03,
+ 0x27, 0x01, 0x00, 0xf0, 0x21, 0xe3, 0xc3, 0x72, 0x41, 0x30, 0x04, 0xd2,
+ 0xf4, 0xfe, 0x0f, 0x52,
+ 0x02, 0xc9, 0x00, 0x77, 0x00, 0x98, 0x22, 0x22, 0xff, 0xee, 0x22, 0x23,
+ 0x0d, 0xef, 0x10, 0x03,
+ 0x00, 0x00, 0x01, 0x11, 0x22, 0x00, 0xf0, 0x10, 0x13, 0x52, 0x21, 0x20,
+ 0xef, 0xd8, 0x20, 0x56,
+ 0xde, 0xcc, 0x61, 0x11, 0xef, 0xed, 0x01, 0x44, 0x0c, 0x0e, 0x71, 0x00,
+ 0xff, 0xfc, 0xff, 0x11,
+ 0x10, 0xfc, 0xee, 0x0e, 0x10, 0x0e, 0x0a, 0x40, 0x00, 0x0e, 0x73, 0x30,
+ 0xf8, 0x00, 0x20, 0x50,
+ 0xf0, 0xfe, 0xf0, 0xe0, 0xf0, 0xee, 0xfc, 0x2f, 0x1f, 0xad, 0xd0, 0xf0,
+ 0x0e, 0x7b, 0x1d, 0x0e,
+ 0x0d, 0xe0, 0xf8, 0xed, 0x20, 0x01, 0xaf, 0xfd, 0x10, 0xfd, 0xbb, 0xff,
+ 0x01, 0x02, 0xec, 0xdc,
+ 0x00, 0xf2, 0xce, 0xdc, 0xef, 0x00, 0xc3, 0xcd, 0xcd, 0xf0, 0x0d, 0x0e,
+ 0xf0, 0xe2, 0x43, 0x08,
+ 0xff, 0x11, 0xe0, 0x8c, 0xff, 0x14, 0x21, 0xbe, 0xdf, 0xe1, 0xf0, 0xed,
+ 0xfd, 0xf1, 0xf4, 0xb0,
+ 0xe9, 0x0f, 0xff, 0x00, 0x0f, 0xff, 0xee, 0xae, 0xdf, 0xf7, 0x02, 0x0d,
+ 0xe0, 0xf0, 0x90, 0xda,
+ 0x04, 0x13, 0xba, 0xf0, 0x41, 0x32, 0xdc, 0xef, 0x40, 0x21, 0x00, 0xfe,
+ 0x01, 0x10, 0x1d, 0x0c,
+ 0xfd, 0x1f, 0x2f, 0xed, 0xce, 0xa2, 0xbc, 0xe8, 0x0f, 0x0f, 0xcf, 0xef,
+ 0x02, 0x12, 0xbb, 0xff,
+ 0xf0, 0xf0, 0xf0, 0x00, 0x50, 0x2f, 0xfd, 0xbc, 0xee, 0x00, 0x03, 0x0c,
+ 0xf0, 0x0f, 0x00, 0xf2,
+ 0xbd, 0x07, 0x01, 0xec, 0xe0, 0xf4, 0xb2, 0xe0, 0xf0, 0x00, 0x05, 0xd1,
+ 0xd3, 0xd2, 0x01, 0x13,
+ 0x64, 0x12, 0x02, 0xb3, 0xf4, 0x06, 0xf1, 0x01, 0xd0, 0xc0, 0xe2, 0x05,
+ 0xc0, 0x00, 0x20, 0x01,
+ 0x80, 0xed, 0x03, 0x17, 0x1e, 0x4d, 0x41, 0x03, 0x0e, 0x0e, 0x34, 0x54,
+ 0x21, 0x10, 0x4f, 0x10,
+ 0x24, 0x22, 0x42, 0x30, 0xc9, 0x02, 0x36, 0x20, 0x0d, 0x41, 0x73, 0x20,
+ 0x0d, 0xe0, 0x25, 0x51,
+ 0x1f, 0x2f, 0x11, 0x01, 0xf1, 0x00, 0x00, 0x01, 0x20, 0x12, 0x00, 0x1e,
+ 0x0a, 0x70, 0x44, 0x10,
+ 0x20, 0x40, 0x30, 0x2f, 0x30, 0x77, 0x13, 0x1e, 0x00, 0x05, 0x03, 0xf2,
+ 0xf0, 0x12, 0x32, 0xf4,
+ 0xa2, 0x07, 0x01, 0x30, 0x01, 0xe1, 0x04, 0xf2, 0x12, 0x72, 0x2f, 0x1f,
+ 0x03, 0xe5, 0xf4, 0xf0,
+ 0xf0, 0x30, 0x34, 0x23, 0x50, 0x3f, 0x20, 0x00, 0x11, 0x35, 0x22, 0x33,
+ 0x10, 0x3c, 0x50, 0x41,
+ 0x74, 0x30, 0x32, 0x33, 0x04, 0x71, 0x30, 0x3c, 0x1f, 0x35, 0x25, 0x30,
+ 0x10, 0x02, 0x14, 0x00,
+ 0x32, 0x42, 0xf0, 0xd0, 0x00, 0x33, 0x40, 0x1d, 0x73, 0x67, 0x0c, 0x1d,
+ 0x30, 0x41, 0x13, 0xfd,
+ 0x0e, 0x20, 0x2c, 0xed, 0xf3, 0x06, 0xf3, 0xdf, 0xcf, 0x11, 0x75, 0x00,
+ 0x00, 0x44, 0x13, 0x10,
+ 0x01, 0x03, 0x00, 0x31, 0x77, 0x03, 0x0e, 0x1f, 0x32, 0xf1, 0x00, 0xfa,
+ 0xe1, 0xe2, 0xc0, 0xee,
+ 0xef, 0x9f, 0xd2, 0xe7, 0x00, 0x5c, 0x0e, 0xd2, 0x04, 0x00, 0x3c, 0x30,
+ 0x1f, 0x0c, 0x3e, 0xf0,
+ 0x06, 0x0f, 0x6f, 0x2f, 0xd1, 0x81, 0xe0, 0x02, 0x01, 0xd9, 0xbd, 0x67,
+ 0xd4, 0x88, 0x11, 0x22,
+ 0x0f, 0xee, 0x10, 0x33, 0x00, 0xed, 0x01, 0x11, 0x00, 0x10, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x01, 0x52, 0x0c, 0x0e, 0x1e, 0x20, 0xfc, 0xdf, 0x12,
+ 0x1d, 0x71, 0x0c, 0x0d,
+ 0x77, 0x01, 0xca, 0x13, 0x22, 0x00, 0xfd, 0x21, 0x32, 0xdd, 0x0f, 0x14,
+ 0x35, 0xd0, 0xbd, 0x20,
+ 0x71, 0x30, 0xff, 0xef, 0x02, 0x37, 0x20, 0xef, 0xe0, 0x00, 0x00, 0x0f,
+ 0x24, 0xa0, 0xbf, 0xff,
+ 0xee, 0xf3, 0xcf, 0xed, 0x05, 0x0e, 0x1d, 0x41, 0x07, 0xe0, 0xaa, 0xf0,
+ 0x11, 0x31, 0x0f, 0xb0,
+ 0x00, 0xf1, 0xff, 0xf0, 0xe0, 0x00, 0xdb, 0xf0, 0xf1, 0xe3, 0x0c, 0x1b,
+ 0x7f, 0x10, 0xe0, 0xbc,
+ 0xf0, 0xf0, 0xf0, 0x0e, 0xdc, 0x01, 0xdf, 0xac, 0x00, 0xf0, 0x01, 0x1f,
+ 0x00, 0xfb, 0xcc, 0xf0,
+ 0x02, 0x0d, 0x8c, 0xc0, 0xef, 0x0d, 0xfe, 0xea, 0xdd, 0x10, 0x20, 0xeb,
+ 0xff, 0x2e, 0x4d, 0x1d,
+ 0x20, 0x22, 0xde, 0xc0, 0xff, 0x2e, 0x45, 0x8d, 0xdf, 0xe7, 0xe2, 0xd0,
+ 0x12, 0x0e, 0xe0, 0xa1,
+ 0xf3, 0xe5, 0x01, 0x34, 0x10, 0xb0, 0xe0, 0xd2, 0xe3, 0xf1, 0xd0, 0xd0,
+ 0xb3, 0xb7, 0xe1, 0xc0,
+ 0xf0, 0xf2, 0x06, 0x32, 0xb3, 0xe0, 0xd0, 0x02, 0x47, 0x11, 0x0d, 0xfd,
+ 0x0f, 0x03, 0xd0, 0x9b,
+ 0x0d, 0x2e, 0x0e, 0xff, 0x0d, 0xea, 0xde, 0xce, 0xe1, 0x02, 0x00, 0xfc,
+ 0xed, 0xfd, 0xec, 0xce,
+ 0xad, 0xf0, 0xda, 0x0d, 0x1f, 0x2f, 0x0d, 0x1b, 0x70, 0x2d, 0x0e, 0x0b,
+ 0x2f, 0x1f, 0x0d, 0xfd,
+ 0xfb, 0xfc, 0xef, 0xdf, 0xe0, 0x80, 0xba, 0x00, 0x30, 0x1e, 0x0f, 0xe0,
+ 0xbf, 0x00, 0xe0, 0xe0,
+ 0x0b, 0x00, 0x00, 0xc1, 0xd0, 0xf0, 0xf3, 0xef, 0xe1, 0x02, 0xd0, 0x8b,
+ 0x14, 0x13, 0x88, 0x0f,
+ 0x00, 0xe2, 0x00, 0xfe, 0x00, 0x00, 0xf0, 0x21, 0x30, 0x3f, 0x52, 0xfe,
+ 0xdc, 0x03, 0x16, 0x4f,
+ 0x3e, 0x20, 0x01, 0xee, 0x00, 0x04, 0xc2, 0x03, 0x24, 0x00, 0x5f, 0x43,
+ 0x00, 0x12, 0x45, 0x42,
+ 0x62, 0x2f, 0x0d, 0x01, 0x17, 0x15, 0x5f, 0x4f, 0x0c, 0xfe, 0x01, 0x25,
+ 0x30, 0x30, 0x3e, 0x5d,
+ 0x40, 0x0e, 0x1e, 0x4d, 0x61, 0x21, 0x0b, 0xfd, 0x0f, 0x21, 0x24, 0x10,
+ 0x3c, 0x1e, 0x00, 0xe4,
+ 0xef, 0xfb, 0x22, 0x40, 0x2f, 0x0d, 0xae, 0xee, 0x0f, 0x00, 0xfe, 0x00,
+ 0x7e, 0x28, 0x0e, 0x2e,
+ 0x1d, 0x20, 0x02, 0xac, 0xfb, 0xff, 0x01, 0x07, 0x12, 0x0e, 0xce, 0xe2,
+ 0xa4, 0x04, 0x00, 0x0e,
+ 0x0f, 0x00, 0xe1, 0xd2, 0x11, 0x1c, 0x31, 0x47, 0x23, 0xd2, 0x8f, 0x02,
+ 0x45, 0xf1, 0xe4, 0xf3,
+ 0xc3, 0xc0, 0xe2, 0xe3, 0x00, 0x13, 0x03, 0xf3, 0x17, 0x41, 0x12, 0x22,
+ 0xf1, 0x00, 0x44, 0x72,
+ 0x23, 0x01, 0x03, 0x05, 0x02, 0xd2, 0xc3, 0x12, 0x73, 0x35, 0x27, 0x14,
+ 0xf1, 0xc1, 0x00, 0x54,
+ 0x43, 0x21, 0x11, 0x21, 0x31, 0x20, 0x23, 0x02, 0x10, 0x20, 0x50, 0x35,
+ 0x2f, 0x08, 0x50, 0x75,
+ 0x0f, 0xcd, 0x35, 0x1f, 0x0f, 0xff, 0x10, 0x53, 0xfe, 0xee, 0x10, 0x02,
+ 0x00, 0x30, 0x32, 0x2f,
+ 0x0f, 0x03, 0x56, 0x10, 0x03, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe1, 0x8f,
+ 0xe7, 0x07, 0xd0, 0x00,
+ 0x0f, 0x20, 0xd1, 0xe0, 0x56, 0x00, 0x02, 0x00, 0xf0, 0x00, 0x03, 0x00,
+ 0x50, 0x55, 0x00, 0xe1,
+ 0xc0, 0xf2, 0xf3, 0xe0, 0xf0, 0x1e, 0x33, 0x02, 0xbd, 0x1f, 0x10, 0x00,
+ 0x30, 0x0d, 0xfd, 0x1f,
+ 0x7d, 0x77, 0x05, 0x09, 0xef, 0x0f, 0x00, 0x34, 0x10, 0x1e, 0x4d, 0x20,
+ 0x0b, 0x2f, 0x10, 0x1f,
+ 0x70, 0x4e, 0x2c, 0x1d, 0x0d, 0x00, 0x30, 0x5f, 0x18, 0x0f, 0x0e, 0xe0,
+ 0xd0, 0xcd, 0x0f, 0x0f,
+ 0x1c, 0x0f, 0x30, 0x1e, 0x3d, 0x2b, 0xde, 0x10, 0x9d, 0x1f, 0x71, 0x1f,
+ 0x10, 0xec, 0xdb, 0xd0,
+ 0xfe, 0xe1, 0x43, 0x44, 0x1f, 0x2a, 0x1f, 0x00, 0xe1, 0xe0, 0x1e, 0x7d,
+ 0x1f, 0xfe, 0xed, 0xbb,
+ 0x00, 0xf4, 0xb0, 0xdf, 0xec, 0xfe, 0x00, 0xe1, 0xe0, 0xbd, 0x05, 0x05,
+ 0x2d, 0x00, 0x22, 0x00,
+ 0x80, 0xe6, 0x00, 0xf1, 0x36, 0xe9, 0xc5, 0xef, 0xc3, 0xbc, 0xfb, 0x1f,
+ 0x3d, 0x8d, 0xed, 0xf2,
+ 0xed, 0xfb, 0xfc, 0x0e, 0xd6, 0xd0, 0xdb, 0x1f, 0x2d, 0x00, 0x9f, 0xf0,
+ 0xf2, 0xfe, 0x1b, 0x4d,
+ 0x4f, 0x21, 0x02, 0x0d, 0x1f, 0x00, 0xfe, 0x5c, 0x3e, 0x25, 0x35, 0x0f,
+ 0xce, 0xaf, 0xe5, 0x03,
+ 0x21, 0x0f, 0xf1, 0xd4, 0x11, 0x71, 0x2e, 0x0c, 0x04, 0xf3, 0x06, 0x11,
+ 0x20, 0x31, 0xf2, 0xb1,
+ 0x04, 0x36, 0x01, 0x31, 0x23, 0x31, 0x71, 0x52, 0x12, 0x03, 0x03, 0x03,
+ 0x13, 0x0a, 0x01, 0x11,
+ 0xf1, 0xb2, 0x00, 0x05, 0xdf, 0xf4, 0xd2, 0x9f, 0x02, 0x13, 0xfe, 0x01,
+ 0x05, 0xaf, 0x00, 0x15,
+ 0x3f, 0xdd, 0xd0, 0x03, 0x0f, 0x2f, 0x67, 0x10, 0x0f, 0xdc, 0xc0, 0x04,
+ 0x00, 0x50, 0x0e, 0x11,
+ 0x02, 0x04, 0x34, 0xcd, 0xcd, 0x37, 0x37, 0xa0, 0xe0, 0xf0, 0xf0, 0x01,
+ 0x01, 0xc1, 0xd1, 0x02,
+ 0x04, 0x0f, 0x20, 0x20, 0x61, 0x41, 0x10, 0x11, 0x02, 0x11, 0xfd, 0xec,
+ 0x20, 0x60, 0x14, 0xdc,
+ 0xea, 0x51, 0x41, 0x20, 0x10, 0x1f, 0x2f, 0x20, 0x6e, 0x12, 0x1e, 0x1f,
+ 0x36, 0x00, 0xee, 0x0f,
+ 0x41, 0x24, 0x00, 0x51, 0x2e, 0x10, 0x17, 0x01, 0x0f, 0x0f, 0x73, 0x55,
+ 0xf0, 0xd0, 0xf1, 0xf2,
+ 0xf6, 0xf0, 0xed, 0x00, 0x54, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xf8, 0xff,
+ 0x40, 0x41, 0x00, 0xec,
+ 0xef, 0x2e, 0x3f, 0x00, 0xa1, 0xe2, 0xd0, 0x00, 0x3d, 0x09, 0xe0, 0x90,
+ 0xd2, 0xe0, 0xdf, 0xac,
+ 0xee, 0xfd, 0x20, 0x3f, 0xfc, 0xbb, 0x0e, 0x2f, 0x0d, 0x1c, 0x2d, 0x3c,
+ 0x4e, 0x1d, 0x0d, 0x0d,
+ 0x10, 0x2c, 0xe9, 0xaf, 0x0e, 0xff, 0xbe, 0xde, 0xee, 0xee, 0xdd, 0xee,
+ 0x0d, 0x0a, 0x3f, 0x4f,
+ 0xed, 0x1e, 0x0c, 0xfd, 0xee, 0x6f, 0x5e, 0x01, 0xf1, 0xca, 0xee, 0xdf,
+ 0xaf, 0xe2, 0xc1, 0xfd,
+ 0xed, 0xef, 0xb0, 0xf6, 0xf1, 0x0c, 0x1e, 0x50, 0x00, 0x00, 0xe1, 0xea,
+ 0xfd, 0xff, 0xad, 0xdc,
+ 0xbf, 0xe2, 0xd5, 0xce, 0xdf, 0xe0, 0xe4, 0xe4, 0xe3, 0x04, 0x03, 0xd0,
+ 0x8b, 0x00, 0x02, 0x00,
+ 0x0f, 0x10, 0x12, 0x00, 0x0c, 0x0d, 0x2f, 0x13, 0xc4, 0xfe, 0x0c, 0xde,
+ 0xce, 0xbf, 0xf1, 0xdf,
+ 0xb8, 0xdf, 0xbc, 0xed, 0xfc, 0x0e, 0x2e, 0x2d, 0x0b, 0x0e, 0xfe, 0x10,
+ 0x21, 0x0e, 0x08, 0xff,
+ 0xb0, 0xde, 0xcf, 0xde, 0xff, 0x2f, 0x2f, 0x8b, 0xce, 0xfd, 0x0d, 0x0c,
+ 0x0e, 0xd0, 0xe1, 0x0f,
+ 0x3c, 0x1f, 0x20, 0x20, 0xcf, 0x02, 0x11, 0x43, 0x36, 0xe0, 0xd0, 0x51,
+ 0x62, 0xff, 0xc3, 0xe5,
+ 0xf0, 0xe1, 0xa2, 0xd1, 0xff, 0x00, 0xe5, 0xf6, 0xf3, 0x02, 0xd4, 0xc1,
+ 0xe1, 0xf1, 0x22, 0x33,
+ 0x25, 0x01, 0x90, 0xef, 0xe0, 0xf0, 0x07, 0xe1, 0xc1, 0x20, 0x60, 0x10,
+ 0x15, 0x32, 0x01, 0x11,
+ 0x02, 0x13, 0x14, 0x03, 0xd0, 0x2d, 0x21, 0xb3, 0xb7, 0xf5, 0x20, 0x7f,
+ 0x51, 0x06, 0x01, 0x11,
+ 0x00, 0x3e, 0x30, 0x20, 0xf3, 0x21, 0x50, 0x3f, 0x2c, 0x2c, 0x70, 0x34,
+ 0x14, 0x13, 0x00, 0x2d,
+ 0x4f, 0x4f, 0x46, 0x34, 0x12, 0x40, 0x21, 0x32, 0x20, 0x11, 0x24, 0x53,
+ 0x30, 0x2d, 0x1f, 0x12,
+ 0x17, 0x21, 0x31, 0x10, 0x00, 0xd2, 0xd2, 0xf1, 0x02, 0x47, 0xe7, 0x80,
+ 0xf1, 0x00, 0x02, 0x40,
+ 0x21, 0x02, 0xe0, 0xe0, 0x1d, 0x21, 0x33, 0xd3, 0xe3, 0x73, 0x42, 0x23,
+ 0xf3, 0x07, 0x23, 0x35,
+ 0x50, 0x22, 0x03, 0x22, 0x73, 0x45, 0x00, 0x10, 0x00, 0x03, 0x34, 0x60,
+ 0x34, 0x35, 0x11, 0x10,
+ 0x11, 0x22, 0x22, 0x06, 0xf1, 0xc0, 0x00, 0x0d, 0x0e, 0x53, 0x15, 0x2f,
+ 0x00, 0x00, 0xf2, 0x3f,
+ 0x7d, 0x71, 0x41, 0x0f, 0x01, 0x06, 0x0f, 0x1f, 0x41, 0x12, 0x2f, 0x1f,
+ 0x0c, 0x0b, 0x2f, 0x2f,
+ 0x41, 0x02, 0x0d, 0x0b, 0x20, 0x12, 0xfe, 0xbd, 0x0d, 0x10, 0x66, 0x12,
+ 0x20, 0x0d, 0xf8, 0x10,
+ 0x70, 0x33, 0x0f, 0x0c, 0xf0, 0x1f, 0x1e, 0x2e, 0xf0, 0xe4, 0xf0, 0x0f,
+ 0xd0, 0xd0, 0xa1, 0xef,
+ 0xef, 0xf0, 0xc0, 0xba, 0xec, 0x0f, 0xf1, 0xd3, 0x80, 0xea, 0xf0, 0x0f,
+ 0x30, 0x14, 0xf4, 0xd4,
+ 0xc2, 0xe0, 0xb0, 0xf1, 0xd4, 0xe3, 0xd1, 0x03, 0xf0, 0x0f, 0xed, 0xcc,
+ 0xda, 0x1f, 0x70, 0x21,
+ 0x2e, 0x3d, 0x00, 0x10, 0x3f, 0x3a, 0x1e, 0x2e, 0x3e, 0x2d, 0x3c, 0x10,
+ 0xf0, 0xaa, 0x0f, 0x40,
+ 0x03, 0x1f, 0x4f, 0x74, 0x14, 0x32, 0x60, 0x1e, 0x0e, 0x01, 0x17, 0x33,
+ 0x20, 0x60, 0x11, 0x22,
+ 0x11, 0x27, 0x43, 0x10, 0x20, 0x2f, 0x22, 0x00, 0xde, 0x0c, 0x0e, 0xf1,
+ 0xf2, 0xf6, 0x22, 0x1d,
+ 0x0b, 0x0f, 0x70, 0x41, 0xd5, 0xc1, 0x01, 0x3f, 0x30, 0x03, 0xc2, 0xd0,
+ 0xf0, 0xd0, 0xd6, 0x84,
+ 0xc3, 0xe1, 0xd0, 0xb0, 0xf2, 0xf1, 0x0f, 0xdc, 0xf0, 0xdc, 0xea, 0xee,
+ 0x0e, 0x2e, 0x3d, 0x2d,
+ 0xd0, 0xa5, 0xe0, 0xfd, 0xf0, 0xc1, 0xb3, 0xc1, 0xa0, 0xf0, 0xed, 0x0c,
+ 0x0e, 0xc0, 0xf2, 0xed,
+ 0xe8, 0xe8, 0xff, 0x1e, 0x40, 0x1f, 0xfe, 0xbb, 0xff, 0xff, 0xf0, 0x00,
+ 0xee, 0xec, 0xc0, 0xe0,
+ 0xce, 0xdb, 0xe0, 0xe3, 0xf0, 0x0c, 0x0e, 0x1c, 0xff, 0xee, 0xe0, 0xa0,
+ 0xc0, 0xed, 0x0c, 0x30,
+ 0x41, 0x30, 0xd2, 0xb2, 0xf1, 0xe0, 0x10, 0x13, 0xa4, 0xd5, 0xe4, 0xe4,
+ 0xb2, 0xe3, 0xd1, 0xd1,
+ 0xd6, 0xc2, 0x01, 0x2f, 0x32, 0x02, 0xf0, 0xd1, 0xc0, 0xb9, 0x1e, 0x1f,
+ 0xce, 0xb0, 0xec, 0xf9,
+ 0xfd, 0xdf, 0x1e, 0xe0, 0x80, 0xf0, 0xf0, 0xdb, 0xde, 0xcc, 0x00, 0xfd,
+ 0xbc, 0xed, 0x0d, 0x10,
+ 0x0e, 0xdb, 0xe0, 0xdd, 0x0d, 0x2d, 0x0c, 0xcd, 0x0d, 0x0b, 0x2f, 0x6b,
+ 0x1d, 0x2d, 0xee, 0xce,
+ 0xdb, 0x2e, 0x4e, 0xfc, 0xce, 0xf1, 0xf3, 0x02, 0x60, 0x0b, 0x0f, 0xe0,
+ 0xe1, 0xd5, 0xb0, 0xff,
+ 0x0f, 0x10, 0x30, 0x01, 0x04, 0x01, 0xef, 0x5e, 0x60, 0x00, 0x1b, 0x00,
+ 0xc0, 0x04, 0x00, 0x02,
+ 0xff, 0xc0, 0xf1, 0xf3, 0x5f, 0x29, 0x10, 0x20, 0x10, 0x10, 0x20, 0x73,
+ 0x30, 0x18, 0x3e, 0x40,
+ 0x04, 0xe0, 0x03, 0x34, 0x20, 0xaf, 0xd0, 0x16, 0x01, 0xd1, 0xb0, 0xe1,
+ 0xf2, 0xb0, 0xe0, 0x0f,
+ 0x70, 0x21, 0x0d, 0x0b, 0xee, 0x0d, 0x0e, 0x01, 0x22, 0x2d, 0x4b, 0x2f,
+ 0x10, 0x0e, 0x02, 0x64,
+ 0x1b, 0x1d, 0x31, 0x20, 0x1d, 0x28, 0x3f, 0x50, 0x10, 0x12, 0xfc, 0x0c,
+ 0x3e, 0x3e, 0x2e, 0x00,
+ 0x01, 0x10, 0x28, 0x0d, 0x4e, 0x00, 0xff, 0x0e, 0xde, 0x8e, 0xcd, 0xea,
+ 0xfd, 0xc0, 0xd1, 0x01,
+ 0xfe, 0xcc, 0xbf, 0x1f, 0x73, 0x22, 0x20, 0x0d, 0x0d, 0x43, 0x20, 0x08,
+ 0x1c, 0x20, 0x00, 0xee,
+ 0xff, 0x01, 0x07, 0xd3, 0xb0, 0xe1, 0x06, 0x23, 0xf0, 0xc3, 0x12, 0x02,
+ 0xd5, 0x82, 0xe1, 0xf0,
+ 0x02, 0x02, 0x05, 0x01, 0x21, 0x61, 0x00, 0xf0, 0xc6, 0xe3, 0x03, 0xf0,
+ 0xde, 0x01, 0x03, 0xc2,
+ 0xf3, 0xd4, 0xc1, 0xd5, 0xf2, 0x74, 0x22, 0x00, 0xc1, 0x05, 0x22, 0x72,
+ 0x44, 0x24, 0x11, 0x21,
+ 0x23, 0x13, 0x1e, 0x4d, 0x11, 0x16, 0x01, 0x31, 0x40, 0x10, 0x2f, 0x2e,
+ 0x22, 0xf3, 0xde, 0x4e,
+ 0x77, 0x42, 0x00, 0x0f, 0x70, 0x13, 0x33, 0x16, 0x22, 0x11, 0x31, 0x51,
+ 0x10, 0x11, 0x01, 0x12,
+ 0x04, 0xf5, 0x01, 0x32, 0x20, 0x0f, 0x23, 0x27, 0xe7, 0x00, 0x01, 0x73,
+ 0x11, 0xe2, 0xe0, 0x01,
+ 0x33, 0x03, 0xd3, 0xe4, 0xf5, 0x12, 0x72, 0x22, 0xf5, 0xb3, 0xe3, 0x02,
+ 0xd3, 0xc5, 0xf1, 0x00,
+ 0x01, 0xd2, 0xb2, 0x02, 0x00, 0xef, 0xb1, 0x06, 0x20, 0x0e, 0xcf, 0x14,
+ 0x42, 0x1d, 0x1e, 0x10,
+ 0x05, 0xd1, 0xcf, 0x0e, 0x2d, 0xae, 0xf1, 0x13, 0x6e, 0x2b, 0x3d, 0x0d,
+ 0x0b, 0x0c, 0x1f, 0x4c,
+ 0x5e, 0x3f, 0x3d, 0x08, 0xff, 0x0f, 0x40, 0x2f, 0xfb, 0xef, 0xdf, 0xfd,
+ 0x0d, 0x0f, 0x0d, 0x8e,
+ 0xd9, 0xff, 0x0d, 0x0f, 0xae, 0x00, 0x3f, 0x4c, 0x1f, 0xff, 0xf0, 0x00,
+ 0x1d, 0x7f, 0x4e, 0x2f,
+ 0x0e, 0xff, 0xfd, 0xfa, 0x0e, 0xfc, 0xee, 0x0c, 0x30, 0x41, 0x0f, 0xfd,
+ 0x00, 0xa1, 0xf4, 0x02,
+ 0x0f, 0xdb, 0xdf, 0xdf, 0xb0, 0xbe, 0xc9, 0xde, 0xf0, 0xe3, 0xc5, 0xbf,
+ 0xee, 0xef, 0xff, 0x00,
+ 0x02, 0xf0, 0xcd, 0xf1, 0xc2, 0xca, 0xdc, 0xfe, 0xef, 0x0d, 0xe0, 0xf1,
+ 0xe5, 0xd0, 0xfd, 0x50,
+ 0x50, 0x00, 0xf0, 0xe2, 0x1f, 0x28, 0x2a, 0x50, 0x20, 0x20, 0x2f, 0x2e,
+ 0x1e, 0x4f, 0x1e, 0x40,
+ 0xee, 0xbe, 0xf0, 0xf0, 0xf1, 0xcf, 0xd1, 0xd7, 0x04, 0xff, 0x10, 0x63,
+ 0x25, 0x53, 0x32, 0x54,
+ 0x10, 0x01, 0x23, 0x47, 0x03, 0x1f, 0x00, 0x32, 0x32, 0x70, 0x22, 0x25,
+ 0xf2, 0x02, 0x02, 0x06,
+ 0xf1, 0xe1, 0x00, 0x11, 0x3f, 0xf0, 0x22, 0x26, 0x01, 0x01, 0x13, 0x21,
+ 0xf3, 0xe2, 0x76, 0x42,
+ 0xa3, 0xc2, 0xe1, 0xf4, 0x01, 0xe2, 0xf1, 0xe2, 0xae, 0xdc, 0xd0, 0xf0,
+ 0x11, 0x00, 0x2f, 0x3f,
+ 0x15, 0x15, 0xf3, 0x02, 0x22, 0x71, 0x33, 0x05, 0xf3, 0xe1, 0xa1, 0xd6,
+ 0xc3, 0xd5, 0xe0, 0xc0,
+ 0xf0, 0x03, 0x72, 0x13, 0xf0, 0xe0, 0x0e, 0x21, 0x26, 0x00, 0xf0, 0x2f,
+ 0x60, 0x20, 0xfe, 0xdc,
+ 0x0e, 0xff, 0x0d, 0xfb, 0x10, 0x10, 0xcd, 0xbc, 0x0d, 0x0d, 0x4d, 0x4c,
+ 0x3e, 0x59, 0x2f, 0x21,
+ 0x21, 0x40, 0x20, 0x63, 0x10, 0x2c, 0x0e, 0x1f, 0x11, 0x01, 0x0b, 0x2f,
+ 0x44, 0x07, 0xe1, 0xd1,
+ 0xd0, 0xd0, 0xbf, 0xf0, 0x03, 0xc5, 0xf0, 0x2d, 0x20, 0x1e, 0x2d, 0x2b,
+ 0x10, 0xa0, 0xf0, 0x10,
+ 0x7d, 0x00, 0xe1, 0xe6, 0x01, 0xff, 0xed, 0xd0, 0xe0, 0xa0, 0xeb, 0xfb,
+ 0x0f, 0xef, 0xaf, 0xfe,
+ 0x00, 0x1f, 0x1c, 0xfe, 0x0e, 0x0c, 0xfc, 0xcd, 0xf0, 0xf0, 0x1f, 0x18,
+ 0xfe, 0xdc, 0x0f, 0x4e,
+ 0x2e, 0x0d, 0x0d, 0x1d, 0xbc, 0xcc, 0xfe, 0x1d, 0x2d, 0xab, 0x8d, 0xfd,
+ 0xfd, 0x1c, 0x2e, 0x2e,
+ 0x5f, 0x1e, 0x0b, 0xef, 0xef, 0x0f, 0x2f, 0x20, 0x3f, 0x0c, 0xdf, 0x00,
+ 0x1f, 0x20, 0x00, 0xfc,
+ 0x30, 0x61, 0x00, 0xed, 0x1e, 0x3c, 0x6c, 0x1f, 0x0d, 0xfe, 0x0f, 0xfb,
+ 0x0f, 0x8d, 0xd0, 0x05,
+ 0x12, 0xc3, 0x82, 0xe5, 0x06, 0xf6, 0xe2, 0xc1, 0xe2, 0xe0, 0xe0, 0xd0,
+ 0xe4, 0xe4, 0xae, 0xef,
+ 0x01, 0xe2, 0xe0, 0xd1, 0xf6, 0xb1, 0x00, 0x00, 0xc0, 0xce, 0xdd, 0xd0,
+ 0xff, 0xce, 0xfd, 0x0b,
+ 0x0f, 0xee, 0xdc, 0x09, 0x2e, 0x3f, 0x4f, 0x2e, 0xe0, 0x90, 0xea, 0xfe,
+ 0x1f, 0x3e, 0xfe, 0x8a,
+ 0xfd, 0xff, 0xfd, 0xdb, 0xec, 0xff, 0x0e, 0xed, 0xc0, 0xec, 0xcd, 0xfc,
+ 0xef, 0xed, 0xbd, 0xdd,
+ 0xd0, 0xf2, 0x00, 0xbd, 0xde, 0xed, 0xcd, 0x09, 0x10, 0x30, 0xdf, 0xdf,
+ 0x40, 0x70, 0x3e, 0x0c,
+ 0xd0, 0x00, 0x21, 0x00, 0xfe, 0xb4, 0xd4, 0xd0, 0xde, 0x07, 0xc4, 0xb1,
+ 0xf1, 0xd0, 0xf1, 0x02,
+ 0x16, 0x31, 0x00, 0xb1, 0x02, 0x35, 0x02, 0x01, 0x02, 0x23, 0x01, 0x03,
+ 0x44, 0x01, 0xc2, 0xff,
+ 0x00, 0x65, 0x05, 0xe0, 0xf0, 0xd0, 0xf3, 0xe2, 0xf4, 0xf4, 0xc2, 0xe2,
+ 0x02, 0xd7, 0xb1, 0x11,
+ 0x70, 0x5d, 0x10, 0x44, 0x40, 0x1f, 0x2f, 0x20, 0x34, 0x31, 0x10, 0x1c,
+ 0x20, 0x51, 0x31, 0xe1,
+ 0xde, 0x22, 0x77, 0x60, 0x0e, 0x20, 0x02, 0x40, 0x13, 0x26, 0x20, 0x30,
+ 0x4f, 0x3c, 0x51, 0x27,
+ 0x22, 0x11, 0x10, 0x20, 0x10, 0x15, 0x12, 0x10, 0x04, 0x03, 0xe1, 0xb0,
+ 0x01, 0x23, 0x43, 0x31,
+ 0x74, 0x24, 0x10, 0x31, 0x10, 0x12, 0x06, 0x06, 0x01, 0x01, 0x21, 0x32,
+ 0x03, 0x05, 0xc2, 0x03,
+ 0xe2, 0xd3, 0xe2, 0x05, 0x73, 0x72, 0x30, 0xf3, 0xf3, 0x23, 0x50, 0x12,
+ 0x35, 0x05, 0x11, 0x01,
+ 0x11, 0x03, 0xe5, 0xe1, 0x01, 0x01, 0xe1, 0xa1, 0xe2, 0xe1, 0x05, 0x62,
+ 0x02, 0x10, 0x03, 0x00,
+ 0x40, 0x50, 0x50, 0x12, 0x22, 0x33, 0x05, 0x3f, 0x2f, 0x3f, 0x2e, 0x12,
+ 0x1f, 0x0b, 0xfc, 0xdc,
+ 0xee, 0x0c, 0x1b, 0x1c, 0xde, 0xee, 0x0e, 0x4e, 0x6f, 0xfd, 0xcb, 0x20,
+ 0x7f, 0x7f, 0x2e, 0x0d,
+ 0x0c, 0x2d, 0x2f, 0x3d, 0x09, 0x1c, 0x1f, 0x00, 0xc0, 0x11, 0x2e, 0x1b,
+ 0x0d, 0x2e, 0x70, 0x2e,
+ 0x0d, 0xf0, 0xff, 0x1e, 0x3b, 0x30, 0x13, 0x02, 0xf2, 0xa0, 0xed, 0xbf,
+ 0xd2, 0xf7, 0xe7, 0xe0,
+ 0x00, 0xe3, 0x80, 0xd2, 0xe1, 0xf1, 0x01, 0x22, 0x12, 0xd0, 0xa1, 0xf2,
+ 0xf3, 0xd5, 0xd3, 0xf3,
+ 0x0e, 0x0f, 0x1c, 0xee, 0xce, 0x12, 0x73, 0x2a, 0x2c, 0x00, 0x00, 0x4d,
+ 0x0b, 0xed, 0xef, 0xdd,
+ 0x0c, 0x51, 0x2f, 0x0c, 0x00, 0x5f, 0x51, 0x0e, 0x1d, 0x01, 0x25, 0x00,
+ 0x2f, 0x34, 0x14, 0x01,
+ 0x01, 0x15, 0x51, 0x3f, 0x20, 0x70, 0x33, 0x40, 0x12, 0x1c, 0x09, 0x00,
+ 0x41, 0x16, 0x10, 0x61,
+ 0x20, 0x0f, 0x10, 0x00, 0x0f, 0x41, 0x14, 0x15, 0x02, 0xd1, 0x20, 0x50,
+ 0x25, 0x03, 0xe1, 0x01,
+ 0x04, 0xe1, 0xa0, 0xd1, 0x05, 0xe1, 0xd1, 0xc0, 0xe0, 0xc1, 0xd0, 0xe0,
+ 0xe4, 0xd1, 0x91, 0xe4,
+ 0xf3, 0xf3, 0xc3, 0xc0, 0xed, 0xd5, 0xf4, 0xde, 0xb9, 0xd0, 0x00, 0xf3,
+ 0xd0, 0xcb, 0xdf, 0xb0,
+ 0xef, 0xed, 0xcf, 0xdf, 0xef, 0xe2, 0xf0, 0xf9, 0x0f, 0x02, 0xe4, 0x01,
+ 0x00, 0xec, 0xfa, 0xdf,
+ 0xce, 0xdf, 0xf2, 0xc0, 0x98, 0xed, 0xee, 0xed, 0xff, 0xfd, 0x8d, 0xde,
+ 0xbd, 0x0d, 0x00, 0xf0,
+ 0x1e, 0x2d, 0x3a, 0xfe, 0xbb, 0xe0, 0xf0, 0xff, 0xfb, 0x00, 0x30, 0x01,
+ 0xef, 0xe0, 0xef, 0xf2,
+ 0x12, 0x44, 0x11, 0x00, 0xcc, 0x00, 0x05, 0xa0, 0xde, 0xce, 0xdf, 0xcd,
+ 0xee, 0xce, 0xb0, 0xe1,
+ 0x11, 0x20, 0x0c, 0xf0, 0xfe, 0x00, 0x00, 0x8a, 0xed, 0x00, 0x0a, 0xdd,
+ 0xcd, 0xd0, 0xbd, 0xb8,
+ 0xef, 0xcf, 0xe0, 0xcf, 0xfd, 0xd9, 0x0f, 0x00, 0x10, 0x0f, 0xfd, 0xfb,
+ 0x1f, 0x3f, 0x0e, 0xde,
+ 0x9f, 0xec, 0xeb, 0xde, 0xcf, 0xc0, 0xd0, 0xed, 0x0d, 0x1d, 0x00, 0xd0,
+ 0xce, 0xfc, 0xfc, 0xee,
+ 0xf0, 0xee, 0xac, 0x0e, 0x00, 0x2f, 0xfb, 0xdc, 0x2d, 0x30, 0x11, 0x2d,
+ 0x1d, 0x10, 0xe0, 0xbe,
+ 0xbd, 0xf2, 0x47, 0x20, 0x0b, 0x1e, 0x4d, 0x50, 0x4c, 0x19, 0x4f, 0x7f,
+ 0x2f, 0x31, 0x13, 0x2f,
+ 0x2c, 0x3e, 0x40, 0x01, 0x13, 0x03, 0x06, 0xe2, 0xd4, 0xf1, 0xde, 0x0e,
+ 0xd0, 0x93, 0xe6, 0x01,
+ 0x2f, 0x50, 0x02, 0xf1, 0xe3, 0xf3, 0xe2, 0xe3, 0xe0, 0x0f, 0x04, 0x77,
+ 0x20, 0x41, 0x34, 0x02,
+ 0xf1, 0x02, 0x12, 0x02, 0x30, 0x4f, 0x5f, 0x37, 0x01, 0x2f, 0x72, 0x20,
+ 0x1e, 0x50, 0x27, 0x20,
+ 0x0c, 0x01, 0x22, 0x2f, 0x2d, 0x2e, 0x10, 0x2e, 0x1c, 0x0e, 0x9a, 0xcb,
+ 0xcf, 0xf0, 0xc0, 0xec,
+ 0xfd, 0xfe, 0xdd, 0xdd, 0x2e, 0x5e, 0x09, 0x2e, 0x5e, 0x1e, 0x2b, 0x20,
+ 0x20, 0x0d, 0x4e, 0x4f,
+ 0x1f, 0x0f, 0x0f, 0x2f, 0x10, 0x20, 0x01, 0x27, 0x56, 0x1f, 0x3f, 0x00,
+ 0xd2, 0x00, 0x50, 0x61,
+ 0x43, 0x03, 0x01, 0xe0, 0x13, 0x07, 0xf3, 0xa6, 0xe1, 0xc1, 0xf1, 0x01,
+ 0x23, 0x33, 0x03, 0xc2,
+ 0xf0, 0xd2, 0xd4, 0x06, 0x02, 0x31, 0x62, 0xf6, 0xa1, 0xf1, 0xe3, 0x12,
+ 0x33, 0x23, 0x04, 0xe3,
+ 0xf3, 0x22, 0x32, 0x01, 0xe2, 0xc3, 0xe5, 0xe1, 0xe1, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x8b, 0x00,
+ 0xd0, 0xfd, 0x8e, 0x29, 0xdc, 0xfb, 0x7d, 0x2c, 0x5b, 0x2d, 0x2f, 0x3e,
+ 0x4e, 0x1e, 0x3d, 0x4e,
+ 0x3d, 0x3b, 0x4e, 0x3d, 0x2d, 0x2a, 0x4e, 0x5f, 0x4d, 0x5c, 0x4e, 0x3d,
+ 0x4e, 0x3f, 0x31, 0x31,
+ 0x3f, 0x2e, 0x20, 0x02, 0xf5, 0xd4, 0xb4, 0xd5, 0xc3, 0xd5, 0xb2, 0xe1,
+ 0xe1, 0x02, 0x12, 0x14,
+ 0x02, 0x13, 0x33, 0x14, 0xf4, 0xd3, 0xb5, 0xc2, 0xb2, 0xd2, 0xc2, 0xc2,
+ 0xd1, 0xf1, 0x02, 0x03,
+ 0xf1, 0xe0, 0xff, 0xfe, 0xec, 0xec, 0xce, 0xdd, 0xcd, 0xec, 0xfc, 0xfc,
+ 0x1e, 0x3e, 0x4a, 0x1e,
+ 0x1e, 0x0e, 0x2e, 0x4c, 0x2e, 0x4d, 0x5c, 0x3c, 0x3d, 0x1d, 0x0b, 0xfd,
+ 0x0c, 0x3e, 0x2d, 0x1c,
+ 0x3d, 0x2e, 0x7e, 0x6f, 0x2e, 0x3a, 0x3d, 0x4c, 0x3d, 0x3c, 0x2c, 0x2d,
+ 0x2c, 0x0d, 0xdd, 0x8d,
+ 0xdd, 0xbc, 0xed, 0xee, 0xcd, 0xdd, 0xcd, 0xee, 0xd0, 0xee, 0x0e, 0x1e,
+ 0x1f, 0x2f, 0x1f, 0x10,
+ 0x2f, 0x3c, 0x7f, 0x60, 0x2f, 0x1e, 0x20, 0x25, 0x14, 0x03, 0x07, 0x04,
+ 0xf3, 0xf3, 0x04, 0x14,
+ 0x02, 0xc2, 0xd2, 0xd2, 0xa2, 0xd1, 0xc1, 0xe2, 0xe2, 0xe0, 0xe2, 0xc3,
+ 0xd1, 0xb2, 0xd5, 0xc5,
+ 0xd4, 0xc3, 0xd2, 0xe5, 0xc2, 0xc2, 0xd3, 0xd4, 0xd6, 0xc2, 0xe2, 0xf2,
+ 0x03, 0x22, 0x32, 0x63,
+ 0x22, 0x32, 0x33, 0x41, 0x2f, 0x4d, 0x2e, 0x30, 0x3e, 0x2b, 0x2c, 0x1c,
+ 0x0c, 0x0c, 0x0c, 0xee,
+ 0xef, 0xdf, 0xc1, 0xb3, 0xc1, 0xc1, 0xe2, 0x07, 0x03, 0x23, 0x34, 0x34,
+ 0x53, 0x44, 0x53, 0x24,
+ 0x43, 0x23, 0x23, 0x24, 0x34, 0x32, 0x22, 0x32, 0x32, 0x33, 0x23, 0x02,
+ 0x13, 0x12, 0x22, 0x72,
+ 0x43, 0x41, 0x40, 0x30, 0x35, 0x46, 0x23, 0x12, 0x11, 0x02, 0x02, 0xc2,
+ 0xc1, 0xd0, 0xc1, 0xc1,
+ 0xd0, 0xdb, 0xfc, 0xed, 0xfe, 0xed, 0xc8, 0xce, 0xcd, 0xdd, 0xdf, 0xf0,
+ 0xf1, 0xe0, 0xfe, 0xfe,
+ 0xf1, 0xd4, 0xd4, 0xe4, 0xe2, 0xd4, 0xa4, 0xe4, 0xc2, 0xc2, 0xd3, 0xd5,
+ 0xd3, 0xc1, 0xd1, 0xf3,
+ 0x23, 0x23, 0x31, 0x14, 0x03, 0xf3, 0x25, 0x71, 0x30, 0x3e, 0x4c, 0x4d,
+ 0x2a, 0x2d, 0x2a, 0x1e,
+ 0x1c, 0x1e, 0x0c, 0xfd, 0x0c, 0x0d, 0x7b, 0x7e, 0x5e, 0x3e, 0x3f, 0x4e,
+ 0x2d, 0x2c, 0x2e, 0x2e,
+ 0x2f, 0x3d, 0x3f, 0x2f, 0x1f, 0x1e, 0x0d, 0x2e, 0x40, 0x22, 0x35, 0x03,
+ 0xf1, 0xc0, 0xd2, 0xe3,
+ 0xf3, 0x44, 0x34, 0x03, 0xe2, 0x80, 0xd0, 0xd1, 0xf6, 0xf2, 0xd3, 0xc2,
+ 0xc1, 0xc0, 0xe3, 0xd7,
+ 0xf1, 0x00, 0x2f, 0x2e, 0x2e, 0x30, 0x3e, 0x0a, 0xfd, 0x8d, 0xac, 0xbd,
+ 0xed, 0xde, 0xcd, 0xdc,
+ 0xdd, 0xdd, 0xce, 0xe0, 0xd1, 0xd2, 0xc3, 0xe2, 0xe2, 0xe2, 0xe0, 0xe9,
+ 0xf8, 0xfc, 0xfc, 0xdd,
+ 0xfd, 0x0c, 0x1c, 0x1d, 0x4d, 0x4c, 0x0d, 0x0e, 0x0d, 0xde, 0x9d, 0xed,
+ 0x0e, 0x2f, 0x2f, 0x00,
+ 0x00, 0x31, 0x72, 0x54, 0x44, 0x32, 0x43, 0x44, 0x36, 0x33, 0x24, 0x13,
+ 0x25, 0x23, 0x13, 0x03,
+ 0x03, 0xe3, 0xd2, 0xb3, 0xe3, 0xe2, 0xd1, 0x03, 0x05, 0x02, 0xe2, 0xe2,
+ 0xa1, 0xf3, 0x06, 0x34,
+ 0x23, 0x13, 0x44, 0x44, 0x34, 0x42, 0x33, 0x22, 0x03, 0xc3, 0x94, 0xb3,
+ 0xd4, 0xb3, 0xd1, 0xd3,
+ 0xb2, 0xe0, 0xd0, 0xef, 0xf1, 0xf2, 0xf0, 0x0f, 0x1e, 0x1f, 0x3b, 0x3d,
+ 0x4d, 0x2b, 0x1c, 0x0f,
+ 0x0d, 0xd9, 0xde, 0xed, 0x0e, 0x0c, 0xde, 0xcc, 0xfe, 0x1c, 0x7d, 0x7e,
+ 0x5c, 0x2d, 0x3c, 0x3d,
+ 0x2c, 0x3d, 0x3c, 0x2d, 0x2b, 0x0e, 0x0c, 0xfe, 0xce, 0xce, 0xce, 0xdf,
+ 0xbe, 0xdf, 0xd0, 0xd0,
+ 0xd1, 0xd2, 0xe2, 0xf3, 0xf2, 0xf2, 0x02, 0x23, 0x55, 0x32, 0x31, 0x40,
+ 0x41, 0x34, 0x45, 0x33,
+ 0x24, 0x14, 0x24, 0x23, 0x04, 0x03, 0x04, 0x02, 0xe3, 0xc4, 0xe3, 0xc2,
+ 0xf2, 0x02, 0x34, 0x44,
+ 0x35, 0x72, 0x53, 0x23, 0x25, 0x23, 0x43, 0x34, 0x43, 0x22, 0x12, 0x13,
+ 0x04, 0xf2, 0xd1, 0xc1,
+ 0xe0, 0xd0, 0xbf, 0xd0, 0xe0, 0xf2, 0x02, 0x04, 0x04, 0x01, 0x01, 0x32,
+ 0x32, 0x20, 0x00, 0x12,
+ 0x12, 0x2e, 0x0a, 0x6e, 0x4e, 0x1c, 0x2f, 0x5f, 0x3d, 0x08, 0x1c, 0x2d,
+ 0x5c, 0x5d, 0x3e, 0x5d,
+ 0x2d, 0x3c, 0x4d, 0x4d, 0x3d, 0x4b, 0x3d, 0x5c, 0x3e, 0x4f, 0x30, 0x31,
+ 0x43, 0x23, 0x24, 0x26,
+ 0x23, 0x04, 0x03, 0xf3, 0xd4, 0xf3, 0xe2, 0xf2, 0x02, 0x02, 0x22, 0x01,
+ 0x00, 0x00, 0xfe, 0xee,
+ 0xbf, 0xc1, 0xb7, 0xc7, 0xc2, 0xd3, 0xd3, 0xf4, 0x04, 0x13, 0x03, 0xf4,
+ 0xf3, 0xf4, 0x02, 0x12,
+ 0x12, 0x23, 0x53, 0x23, 0x13, 0x13, 0x03, 0xf5, 0x14, 0x75, 0x53, 0x02,
+ 0x02, 0xd2, 0xa1, 0xc1,
+ 0xc0, 0xe1, 0xe1, 0xe0, 0xee, 0xdc, 0xdd, 0xfd, 0xed, 0xee, 0xef, 0xf0,
+ 0x20, 0x7c, 0x2a, 0x4d,
+ 0x4d, 0x4f, 0x2f, 0x2b, 0x0d, 0x1b, 0x3c, 0x4d, 0x5a, 0x2e, 0x2c, 0x2d,
+ 0x2c, 0x2d, 0x3c, 0x3e,
+ 0x2c, 0x1e, 0x1c, 0x0e, 0xee, 0x8e, 0xbd, 0xde, 0xcd, 0xde, 0xdd, 0xdb,
+ 0xee, 0xfd, 0xdd, 0xed,
+ 0xec, 0xfd, 0x0d, 0x0c, 0x1d, 0x4d, 0x5e, 0x2f, 0x4f, 0x40, 0x3f, 0x3e,
+ 0x3d, 0x3f, 0x20, 0x10,
+ 0x02, 0xb2, 0xd2, 0xc3, 0xc4, 0xd7, 0xc4, 0xd4, 0xc3, 0xd6, 0xe3, 0xd3,
+ 0xc4, 0xe4, 0xc3, 0xc3,
+ 0xc4, 0xc3, 0xd2, 0xc2, 0xd1, 0xe3, 0xc3, 0xe3, 0xc3, 0xd4, 0xd3, 0xd5,
+ 0xd3, 0xd2, 0xe1, 0xd1,
+ 0xd2, 0x02, 0x00, 0x0d, 0x1d, 0x2c, 0x4b, 0x7d, 0x4b, 0x4d, 0x2c, 0x3c,
+ 0x4e, 0x4e, 0x3e, 0x3c,
+ 0x3e, 0x4d, 0x3e, 0x2e, 0x1f, 0x1e, 0x0e, 0xde, 0xce, 0xdd, 0xee, 0xee,
+ 0x2e, 0x4e, 0x3e, 0x3f,
+ 0x50, 0x30, 0x40, 0x32, 0x27, 0x34, 0x25, 0x22, 0x13, 0x03, 0x04, 0x05,
+ 0x23, 0x43, 0x35, 0x53,
+ 0x22, 0x32, 0x32, 0x63, 0x35, 0x12, 0x12, 0x12, 0x00, 0x00, 0x21, 0x40,
+ 0x22, 0x15, 0x04, 0xc2,
+ 0xd2, 0xc3, 0xa3, 0xb2, 0xd2, 0xc4, 0xc2, 0xd2, 0xc7, 0xe4, 0xc2, 0xd1,
+ 0xc1, 0xd1, 0xf3, 0xd3,
+ 0xd0, 0xd0, 0xdb, 0xde, 0xdd, 0xde, 0xd9, 0xdc, 0x0f, 0xff, 0xce, 0xad,
+ 0xdd, 0xe0, 0xf3, 0xe1,
+ 0xbf, 0xdf, 0xe2, 0xe5, 0x15, 0x00, 0xde, 0x54, 0x43, 0x10, 0x2f, 0x73,
+ 0x21, 0x0a, 0x2d, 0x30,
+ 0x41, 0x2d, 0x08, 0x3f, 0x3e, 0x2e, 0x2d, 0x2e, 0xc9, 0xce, 0x00, 0xff,
+ 0xcd, 0xde, 0x0d, 0x30,
+ 0xfc, 0xfd, 0x71, 0x30, 0x00, 0xeb, 0x10, 0x71, 0x10, 0x0e, 0xff, 0x14,
+ 0x12, 0xff, 0xf0, 0x12,
+ 0x00, 0x88, 0x01, 0x67, 0x00, 0xe0, 0x00, 0x22, 0x00, 0xde, 0xff, 0x34,
+ 0x42, 0xef, 0xee, 0x02,
+ 0x45, 0xef, 0xce, 0x12, 0x44, 0xef, 0xba, 0x00, 0x32, 0xf0, 0xbc, 0x00,
+ 0x00, 0xf0, 0xff, 0xff,
+ 0x01, 0xef, 0xac, 0xf0, 0x13, 0xf0, 0xdb, 0x01, 0x22, 0xcd, 0x00, 0x13,
+ 0xfe, 0xdd, 0x00, 0x02,
+ 0x00, 0xff, 0xdc, 0x43, 0x55, 0xfd, 0xec, 0x32, 0x32, 0xee, 0xcd, 0x22,
+ 0x45, 0x0d, 0xdb, 0x1f,
+ 0x72, 0x30, 0x0c, 0x00, 0x40, 0x0e, 0x0b, 0x31, 0x54, 0xff, 0xee, 0x34,
+ 0x43, 0xed, 0xdd, 0x11,
+ 0x66, 0x20, 0x0f, 0x20, 0x42, 0x11, 0x20, 0x20, 0x32, 0x43, 0x10, 0x43,
+ 0x47, 0x10, 0x0f, 0x31,
+ 0x77, 0x22, 0x0f, 0xee, 0x22, 0x67, 0x00, 0xee, 0x00, 0x12, 0x01, 0x01,
+ 0x02, 0xcf, 0xee, 0x17,
+ 0x12, 0xaf, 0xdf, 0x02, 0x14, 0x01, 0xc0, 0xe1, 0x03, 0x24, 0x00, 0xef,
+ 0x00, 0x13, 0xf0, 0xde,
+ 0x45, 0x00, 0xbd, 0x0e, 0x67, 0x11, 0xfe, 0xff, 0x11, 0x44, 0x11, 0xfe,
+ 0xee, 0x43, 0x45, 0x0f,
+ 0xee, 0x00, 0x43, 0x10, 0x0d, 0x20, 0x31, 0xf9, 0x00, 0x40, 0xcd, 0xba,
+ 0x00, 0x00, 0xff, 0xdc,
+ 0xbd, 0x0f, 0xf0, 0x0f, 0x00, 0xdc, 0x9a, 0x10, 0x21, 0x0f, 0xee, 0x0f,
+ 0x0f, 0x21, 0x41, 0x0e,
+ 0xfc, 0x10, 0x62, 0x0f, 0x0e, 0x44, 0x24, 0x0f, 0x0f, 0x00, 0x00, 0x22,
+ 0x02, 0xf0, 0x15, 0x25,
+ 0x8e, 0xdf, 0x27, 0x01, 0xd0, 0xe0, 0x03, 0xd0, 0x01, 0x35, 0xf0, 0x90,
+ 0xf0, 0x35, 0x33, 0xcf,
+ 0xcf, 0x02, 0x01, 0xef, 0x02, 0xe0, 0xc0, 0x16, 0x00, 0xd0, 0xd0, 0x22,
+ 0x01, 0xd0, 0x23, 0xc0,
+ 0xbe, 0x00, 0x01, 0x13, 0x22, 0xec, 0xfd, 0x75, 0x55, 0x00, 0xb8, 0xff,
+ 0x22, 0x31, 0xce, 0xdd,
+ 0x10, 0x53, 0x0e, 0xeb, 0x0e, 0x0f, 0x20, 0x30, 0x1e, 0x0c, 0x40, 0x61,
+ 0x0d, 0x0b, 0x00, 0x20,
+ 0x20, 0x10, 0x0e, 0x30, 0x21, 0xfe, 0x00, 0x46, 0x32, 0xdf, 0xbf, 0x13,
+ 0x24, 0xf0, 0xcd, 0x01,
+ 0x15, 0x12, 0x02, 0xc0, 0xd0, 0x37, 0x53, 0xe0, 0xf0, 0x43, 0x02, 0xe1,
+ 0x02, 0xd0, 0xf0, 0x03,
+ 0x8b, 0xef, 0x27, 0x01, 0xcf, 0xef, 0xf0, 0x01, 0xf1, 0xf0, 0x02, 0x23,
+ 0x00, 0xf0, 0x22, 0x30,
+ 0x53, 0x01, 0xb8, 0x11, 0x55, 0xff, 0x8a, 0x00, 0x23, 0xff, 0xed, 0x11,
+ 0x23, 0xef, 0xdc, 0x10,
+ 0x00, 0xef, 0x00, 0x0f, 0xed, 0xfe, 0x30, 0x30, 0x0c, 0x0b, 0x5f, 0x70,
+ 0x0d, 0xe8, 0x00, 0x50,
+ 0x10, 0xed, 0xfe, 0x30, 0x10, 0xdb, 0xfe, 0x20, 0x0e, 0x8b, 0x00, 0x10,
+ 0x0d, 0xdd, 0x0f, 0x30,
+ 0xff, 0xca, 0xef, 0x1f, 0x10, 0x0e, 0x30, 0x52, 0xed, 0xf0, 0x66, 0x11,
+ 0xdd, 0xfe, 0x34, 0x32,
+ 0xdd, 0xdd, 0x10, 0x21, 0x10, 0x20, 0x00, 0xcc, 0xff, 0x44, 0x13, 0xad,
+ 0xef, 0x04, 0x02, 0xad,
+ 0xf0, 0x17, 0x03, 0xad, 0xfe, 0x17, 0x01, 0xcf, 0x02, 0x25, 0xf0, 0xcf,
+ 0x01, 0x44, 0x01, 0xdf,
+ 0xe0, 0x34, 0x33, 0xcf, 0xdf, 0x11, 0x02, 0xef, 0xee, 0x10, 0x43, 0x22,
+ 0xfd, 0xed, 0x42, 0x57,
+ 0x00, 0xcb, 0x11, 0x32, 0xf0, 0xce, 0xff, 0x56, 0x00, 0xef, 0x00, 0x10,
+ 0x11, 0xdd, 0x00, 0x66,
+ 0x00, 0xff, 0xed, 0x00, 0x64, 0x10, 0x0e, 0x0f, 0x34, 0x00, 0x10, 0x65,
+ 0x0f, 0x00, 0x33, 0x00,
+ 0x10, 0x22, 0x12, 0x10, 0x0f, 0xfd, 0x47, 0x21, 0xff, 0x00, 0x2f, 0x72,
+ 0x11, 0x10, 0x22, 0x0e,
+ 0x0c, 0x32, 0x76, 0x00, 0x0b, 0xdd, 0x00, 0x44, 0x01, 0x9b, 0xff, 0x04,
+ 0x00, 0xcf, 0x01, 0x13,
+ 0xe0, 0xe0, 0xf1, 0xf1, 0x03, 0x02, 0xf0, 0x00, 0x03, 0xe0, 0x03, 0x37,
+ 0xd0, 0x8e, 0x15, 0x14,
+ 0xf0, 0xcf, 0xf1, 0x16, 0xe0, 0x8f, 0xf0, 0x04, 0x01, 0xdf, 0xff, 0x11,
+ 0x23, 0xee, 0x0f, 0x12,
+ 0xfd, 0xfc, 0x50, 0x31, 0x1d, 0x3d, 0x3c, 0x09, 0x4f, 0x60, 0x10, 0x0d,
+ 0x1d, 0x20, 0x20, 0xfa,
+ 0x0f, 0x30, 0x50, 0xda, 0xee, 0x71, 0x00, 0x0d, 0xfc, 0x0f, 0x20, 0x41,
+ 0x00, 0xe9, 0xff, 0x51,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0xcf, 0xff, 0x11, 0x12, 0xf0, 0xee, 0x00,
+ 0x33, 0x22, 0xca, 0x00,
+ 0x72, 0x21, 0xeb, 0x0f, 0x30, 0x21, 0xfd, 0xbb, 0x00, 0x33, 0x00, 0x9c,
+ 0x00, 0x03, 0x00, 0xce,
+ 0x02, 0x07, 0xe0, 0xbf, 0x01, 0xf4, 0xd0, 0xef, 0xe0, 0xe0, 0xef, 0xf0,
+ 0x21, 0xcb, 0xff, 0x20,
+ 0xbd, 0xdd, 0x02, 0x01, 0xcd, 0xed, 0x00, 0xca, 0xbb, 0xee, 0x03, 0x11,
+ 0xb8, 0xff, 0x20, 0x31,
+ 0x0f, 0x0e, 0x20, 0x50, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x13, 0xff,
+ 0xdd, 0x24, 0x13, 0x8c,
+ 0x00, 0x27, 0x00, 0xad, 0x02, 0x37, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00,
+ 0x75, 0x23, 0x00, 0xee,
+ 0x01, 0x45, 0x10, 0x01, 0x20, 0x21, 0x42, 0x22, 0x00, 0xf0, 0x10, 0x11,
+ 0xfd, 0xcd, 0xee, 0x47,
+ 0x24, 0xae, 0xdf, 0xe0, 0x03, 0x03, 0xe2, 0xf4, 0xb0, 0xe0, 0xe0, 0xf0,
+ 0x01, 0xd0, 0xbd, 0x02,
+ 0x26, 0xba, 0xcd, 0x23, 0x13, 0xdb, 0xce, 0x00, 0x23, 0x10, 0xff, 0xfc,
+ 0x20, 0x61, 0x00, 0x0b,
+ 0x10, 0x30, 0x0f, 0x20, 0x63, 0xfd, 0xd8, 0x00, 0x52, 0x10, 0xff, 0xdc,
+ 0xff, 0x23, 0x21, 0xde,
+ 0xef, 0xff, 0xf0, 0x0f, 0x00, 0xf1, 0x9d, 0xf0, 0x02, 0xef, 0xdb, 0x01,
+ 0x45, 0xff, 0xdd, 0xbc,
+ 0xf0, 0x12, 0x10, 0xec, 0x0d, 0x30, 0x64, 0x10, 0xf9, 0x20, 0x50, 0x20,
+ 0x2f, 0x0e, 0x51, 0x22,
+ 0x12, 0x23, 0x36, 0x11, 0x11, 0x23, 0x12, 0x45, 0x34, 0x00, 0xe0, 0x43,
+ 0x45, 0x00, 0x00, 0xe0,
+ 0xdd, 0x74, 0x73, 0xfc, 0xfe, 0x13, 0x02, 0xff, 0xe0, 0x06, 0x02, 0xc0,
+ 0xcf, 0x01, 0x06, 0xf0,
+ 0xd0, 0x01, 0x13, 0x00, 0xdf, 0x23, 0x55, 0x00, 0xcc, 0x21, 0x33, 0xde,
+ 0xbb, 0x00, 0x11, 0xff,
+ 0xde, 0x10, 0x10, 0xdd, 0xf0, 0x53, 0x0e, 0x1e, 0x3f, 0x2e, 0x50, 0x30,
+ 0x3d, 0x40, 0x52, 0x22,
+ 0x22, 0x2c, 0x18, 0x43, 0x23, 0xfb, 0xff, 0x53, 0x10, 0x0e, 0x00, 0x00,
+ 0xfc, 0x00, 0x04, 0xf0,
+ 0xae, 0xe0, 0x07, 0xd2, 0xb0, 0x03, 0x36, 0x11, 0x00, 0x62, 0x45, 0x00,
+ 0x10, 0x43, 0x34, 0x10,
+ 0xff, 0x10, 0x76, 0x11, 0xf0, 0xff, 0x00, 0x04, 0x01, 0xd0, 0xe0, 0x15,
+ 0x02, 0xc0, 0xe1, 0x02,
+ 0x12, 0x00, 0xf0, 0x23, 0x54, 0x12, 0x00, 0xf2, 0x04, 0x15, 0xe0, 0x80,
+ 0xe0, 0xe1, 0xd1, 0xe2,
+ 0xe2, 0xdf, 0xbc, 0x00, 0x05, 0x00, 0xfc, 0xfe, 0x20, 0x4f, 0x0a, 0x4f,
+ 0x3f, 0x1d, 0x4d, 0x5e,
+ 0x1c, 0x1c, 0x40, 0x3e, 0x0c, 0xfb, 0x0f, 0x20, 0xee, 0x9c, 0xee, 0x0f,
+ 0xfd, 0xa9, 0xfe, 0xee,
+ 0xfe, 0x0e, 0xfd, 0xfc, 0x0e, 0x1e, 0x3f, 0x0e, 0x0c, 0x0e, 0x0e, 0x0f,
+ 0x1d, 0x2e, 0x3f, 0xfd,
+ 0x1e, 0x1e, 0xff, 0x73, 0x00, 0xec, 0x40, 0x52, 0x11, 0x26, 0x12, 0x01,
+ 0x13, 0x47, 0x01, 0xd1,
+ 0x03, 0xc2, 0x81, 0x06, 0x02, 0xe2, 0xc1, 0xe4, 0xf3, 0xa1, 0xd1, 0xe3,
+ 0xd2, 0xd2, 0xd4, 0xd2,
+ 0xb0, 0xef, 0x03, 0xf3, 0xde, 0xf0, 0x22, 0x23, 0x1b, 0x2d, 0x71, 0x20,
+ 0x2e, 0x2f, 0x2f, 0x0b,
+ 0x20, 0x55, 0x11, 0x0d, 0x1b, 0x20, 0x32, 0x0f, 0xb8, 0xff, 0x10, 0x1f,
+ 0xfc, 0xec, 0x20, 0x2f,
+ 0xde, 0xbc, 0xfe, 0x20, 0x3f, 0x1e, 0x10, 0x11, 0x24, 0x12, 0x22, 0x32,
+ 0x75, 0x73, 0x21, 0x0f,
+ 0xf0, 0x24, 0x20, 0xee, 0xef, 0x11, 0x11, 0x00, 0x74, 0x47, 0x32, 0x12,
+ 0x22, 0x23, 0x12, 0x56,
+ 0x12, 0x12, 0x11, 0x23, 0x24, 0xe0, 0xb0, 0x05, 0x02, 0xc1, 0xc0, 0xd2,
+ 0xd3, 0xc2, 0xd1, 0xd1,
+ 0xcf, 0xef, 0xd0, 0xad, 0xdb, 0xee, 0xde, 0xee, 0xdd, 0xda, 0xce, 0xef,
+ 0xdf, 0xdc, 0xbb, 0xef,
+ 0x02, 0xf1, 0xf0, 0x01, 0xf3, 0xf4, 0x02, 0xd2, 0xc2, 0xe6, 0xd3, 0x81,
+ 0xd0, 0xe2, 0xf2, 0xf0,
+ 0xde, 0xdb, 0x2f, 0x50, 0x1b, 0x0d, 0x3c, 0x7f, 0x4f, 0x1e, 0x1d, 0x2f,
+ 0x2e, 0x2c, 0x0c, 0x1f,
+ 0x0d, 0x0c, 0x1e, 0x0e, 0xd9, 0xbd, 0x0f, 0x4e, 0x0d, 0xfa, 0x1f, 0x1e,
+ 0x0e, 0x0e, 0x1f, 0x4f,
+ 0x1f, 0x20, 0x1e, 0x1d, 0x0d, 0x0e, 0xed, 0x0d, 0x10, 0x35, 0x42, 0x0f,
+ 0xbc, 0x32, 0x77, 0x65,
+ 0x00, 0xef, 0x00, 0x20, 0x10, 0x2e, 0x4f, 0x4d, 0x3e, 0x0d, 0x09, 0x0f,
+ 0x4e, 0xfe, 0x0f, 0x00,
+ 0xad, 0xdc, 0xde, 0xd0, 0x9d, 0xdc, 0xff, 0xfe, 0xef, 0xe0, 0xd1, 0xd1,
+ 0xd0, 0xe0, 0xc1, 0xc2,
+ 0xc5, 0xf7, 0xd4, 0xd0, 0xef, 0x01, 0x05, 0xc1, 0xc0, 0xc2, 0xe3, 0xe0,
+ 0xf0, 0x00, 0xe2, 0xe1,
+ 0xcd, 0xe8, 0xfe, 0x1e, 0x50, 0x0c, 0xdc, 0x0e, 0x0d, 0xfd, 0x50, 0x7f,
+ 0x1e, 0x2f, 0x61, 0x20,
+ 0x1c, 0x2d, 0x2d, 0x44, 0x37, 0x00, 0x00, 0x34, 0x32, 0x00, 0x01, 0x01,
+ 0x48, 0x00, 0x50, 0x00,
+ 0xe3, 0xe8, 0xdc, 0xd5, 0x51, 0xe6, 0xb7, 0xd4, 0x55, 0xe0, 0xec, 0x00,
+ 0x33, 0x10, 0x00, 0xcc,
+ 0x11, 0x52, 0x0e, 0xc9, 0xd0, 0x21, 0x00, 0x00, 0xf2, 0xb3, 0xef, 0xef,
+ 0x13, 0x03, 0xdf, 0xa8,
+ 0x00, 0x31, 0xe1, 0x00, 0x5f, 0x2f, 0x0d, 0xcf, 0x00, 0xf0, 0xfd, 0xf0,
+ 0x27, 0x61, 0xf0, 0x0f,
+ 0x51, 0x00, 0xd0, 0x04, 0x10, 0x20, 0x02, 0xe0, 0xee, 0x0b, 0x53, 0x2e,
+ 0xfc, 0xd1, 0x03, 0xf9,
+ 0x0d, 0x70, 0x21, 0xcc, 0xff, 0x36, 0x0f, 0xcb, 0xd0, 0x00, 0x23, 0xbf,
+ 0xdb, 0x32, 0x21, 0xef,
+ 0xcd, 0x12, 0x25, 0x10, 0xfc, 0x10, 0x71, 0x44, 0x00, 0xdd, 0x00, 0x13,
+ 0x0e, 0x0f, 0x63, 0x02,
+ 0xde, 0x0d, 0x0e, 0x23, 0xfd, 0xda, 0x75, 0x32, 0xce, 0xed, 0x03, 0x23,
+ 0x04, 0xd0, 0xd1, 0x16,
+ 0x22, 0xce, 0xde, 0x50, 0x43, 0xff, 0xed, 0x03, 0x4f, 0x1b, 0x00, 0xd1,
+ 0x01, 0xec, 0xed, 0xe3,
+ 0x17, 0xf0, 0xad, 0xde, 0x01, 0x33, 0x0f, 0x0f, 0x73, 0x51, 0xf8, 0xff,
+ 0x00, 0x13, 0x0f, 0xfc,
+ 0x32, 0x22, 0xaf, 0xfe, 0x01, 0x0f, 0xdb, 0xce, 0x12, 0x43, 0x0c, 0xfc,
+ 0xf1, 0x22, 0x4e, 0x0a,
+ 0x00, 0x21, 0x3f, 0x5d, 0x31, 0xe0, 0xcb, 0x01, 0x05, 0x00, 0x0d, 0x21,
+ 0x14, 0x01, 0x41, 0x42,
+ 0xcf, 0xef, 0x10, 0x35, 0xf4, 0x90, 0xfb, 0x00, 0x30, 0xd2, 0x80, 0x00,
+ 0x05, 0x00, 0xe1, 0x01,
+ 0x13, 0xf0, 0xeb, 0x40, 0x32, 0xff, 0xcd, 0x20, 0x20, 0x1d, 0xf9, 0x00,
+ 0x60, 0xf2, 0xd0, 0xdd,
+ 0x21, 0x47, 0xdf, 0xef, 0x22, 0x10, 0x20, 0x23, 0xd0, 0xdf, 0xfd, 0x4c,
+ 0x72, 0x01, 0x02, 0x2f,
+ 0x0a, 0x01, 0x63, 0xed, 0x98, 0x0f, 0x22, 0x00, 0xc0, 0x01, 0x10, 0xee,
+ 0xdd, 0x14, 0x01, 0xbe,
+ 0xfd, 0x27, 0x21, 0xec, 0x1f, 0x71, 0x72, 0xfc, 0xfe, 0x21, 0x13, 0x0f,
+ 0xfc, 0x00, 0x00, 0x0d,
+ 0x00, 0x11, 0xe1, 0xce, 0xfc, 0xe1, 0x04, 0xee, 0xf9, 0x21, 0x54, 0xff,
+ 0xff, 0xf3, 0xe0, 0xc0,
+ 0x10, 0x64, 0x12, 0x0e, 0x0f, 0x01, 0xf5, 0x1f, 0x3f, 0x20, 0x01, 0x0e,
+ 0x71, 0x02, 0xbd, 0xfb,
+ 0xff, 0xe3, 0xe2, 0xe0, 0x00, 0x00, 0x35, 0x10, 0x32, 0x67, 0x06, 0x30,
+ 0x40, 0x0d, 0x41, 0x26,
+ 0xd1, 0xae, 0x00, 0xf0, 0xd0, 0xd2, 0x00, 0x10, 0xb2, 0xde, 0x00, 0x2e,
+ 0xe9, 0xe0, 0x40, 0x41,
+ 0x00, 0x2c, 0x63, 0x33, 0x0c, 0xfd, 0x14, 0x45, 0x00, 0xce, 0x0f, 0x01,
+ 0x12, 0xe0, 0xbf, 0x04,
+ 0x10, 0x39, 0xdf, 0xd0, 0x00, 0x0d, 0x21, 0xff, 0xcc, 0x2e, 0x0f, 0xf0,
+ 0x1f, 0x7c, 0x71, 0x41,
+ 0xf1, 0xf6, 0xf2, 0x00, 0x01, 0x04, 0x00, 0xff, 0xde, 0xd0, 0xe0, 0xef,
+ 0x56, 0x33, 0x0c, 0xfe,
+ 0x31, 0x44, 0xde, 0xfd, 0x32, 0x77, 0x0f, 0xfd, 0x00, 0x64, 0x10, 0x0b,
+ 0xc0, 0x00, 0x14, 0x00,
+ 0xdc, 0xb0, 0xf1, 0x02, 0xf0, 0xce, 0x01, 0x46, 0xff, 0xbd, 0x02, 0x32,
+ 0x00, 0x00, 0xf0, 0x02,
+ 0x02, 0x00, 0x0f, 0x2e, 0x0f, 0xff, 0xec, 0xb0, 0x16, 0x46, 0xdf, 0xbc,
+ 0x10, 0x42, 0xf1, 0xaf,
+ 0x0f, 0x00, 0xfe, 0xe0, 0x20, 0x12, 0x20, 0xea, 0xe0, 0x11, 0x60, 0x1d,
+ 0x0e, 0x40, 0x45, 0x30,
+ 0x2d, 0x0d, 0x30, 0xf2, 0xf1, 0x0e, 0x00, 0x01, 0xe9, 0x1e, 0x5c, 0xef,
+ 0xed, 0xfe, 0x3e, 0x1e,
+ 0xbf, 0xf2, 0x03, 0xf0, 0xd7, 0xc6, 0xbe, 0xe0, 0xbf, 0xe2, 0x14, 0xe0,
+ 0x0e, 0x3e, 0x6f, 0x12,
+ 0x03, 0xcf, 0xf1, 0x17, 0x11, 0x2e, 0x1c, 0x00, 0xe0, 0x00, 0x72, 0x35,
+ 0xcd, 0x00, 0x12, 0xc4,
+ 0xe3, 0x2d, 0x70, 0x02, 0xd4, 0xe3, 0x13, 0x26, 0x0f, 0xdb, 0xfe, 0x33,
+ 0x03, 0x9d, 0xe0, 0x14,
+ 0x00, 0xca, 0x00, 0xf3, 0xdf, 0xec, 0x22, 0xe0, 0x9b, 0x00, 0x00, 0x01,
+ 0xde, 0xee, 0x47, 0x11,
+ 0x10, 0x60, 0x0f, 0x1d, 0x2d, 0x73, 0x27, 0xf0, 0xee, 0x00, 0x42, 0x00,
+ 0xfd, 0xee, 0x00, 0x3f,
+ 0xdc, 0x11, 0x43, 0x3b, 0x4f, 0xf0, 0xe0, 0xf0, 0x34, 0x56, 0xdf, 0xfd,
+ 0x33, 0xf1, 0x8e, 0x0d,
+ 0x00, 0x22, 0x07, 0xf3, 0xce, 0x0f, 0xf2, 0x00, 0x13, 0x64, 0x00, 0xb0,
+ 0x15, 0x30, 0x0a, 0xef,
+ 0x1e, 0x71, 0x11, 0xff, 0xfd, 0x13, 0x00, 0xec, 0xf2, 0x04, 0x0f, 0xff,
+ 0x07, 0xe0, 0x9c, 0x00,
+ 0x03, 0x01, 0x8e, 0x0e, 0x02, 0x04, 0xfd, 0xfe, 0x00, 0x2e, 0x1f, 0x00,
+ 0x41, 0x00, 0x10, 0xff,
+ 0xf8, 0x10, 0x32, 0x21, 0xff, 0xde, 0x04, 0x02, 0xab, 0xd0, 0xd0, 0x12,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x74, 0x7f, 0x09, 0x01, 0x36, 0x00, 0x0d, 0x00, 0x54, 0x00, 0xcd, 0x00,
+ 0x01, 0x1f, 0x01, 0xf4,
+ 0xb0, 0xca, 0x00, 0x02, 0x0e, 0xfd, 0x21, 0x00, 0xff, 0xed, 0x21, 0x22,
+ 0xee, 0x60, 0x40, 0x1e,
+ 0x1e, 0x4e, 0x42, 0xe8, 0xec, 0x21, 0x16, 0xd0, 0x9f, 0x10, 0x24, 0x02,
+ 0xe0, 0xf2, 0x00, 0x24,
+ 0x51, 0x0e, 0xeb, 0x30, 0x52, 0xff, 0xee, 0x00, 0x41, 0xd0, 0xd5, 0x01,
+ 0x00, 0xfd, 0x92, 0x06,
+ 0x01, 0xd1, 0xc1, 0x00, 0x11, 0x1d, 0x1e, 0x0a, 0x21, 0x42, 0xcd, 0x0d,
+ 0x01, 0x63, 0x0d, 0xfc,
+ 0x04, 0x01, 0xf9, 0x00, 0x02, 0xe1, 0xd1, 0xf0, 0x03, 0x0f, 0xde, 0x8d,
+ 0xf2, 0x27, 0x12, 0xc8,
+ 0xff, 0x41, 0x40, 0x1e, 0x40, 0x31, 0x22, 0x1f, 0x1d, 0x00, 0x0d, 0xe0,
+ 0x23, 0xc1, 0xbd, 0x10,
+ 0x47, 0xcd, 0xdc, 0x00, 0x30, 0xf0, 0xce, 0x27, 0x00, 0xde, 0x2f, 0x13,
+ 0x04, 0xb0, 0x02, 0x65,
+ 0x10, 0x00, 0x00, 0x51, 0x11, 0x0e, 0xee, 0x11, 0x0f, 0xea, 0x0e, 0xfd,
+ 0x42, 0x00, 0xaa, 0x32,
+ 0x34, 0xb2, 0xd0, 0x0f, 0xef, 0xe2, 0x04, 0x20, 0x2e, 0x3f, 0x22, 0xd3,
+ 0xe0, 0xad, 0x17, 0x32,
+ 0xef, 0xf0, 0x32, 0xf0, 0x8c, 0xdc, 0x0f, 0x13, 0x03, 0xdc, 0x0b, 0xf1,
+ 0xf2, 0x8e, 0xfa, 0x00,
+ 0xf0, 0x10, 0x0f, 0x40, 0x40, 0x3f, 0x0c, 0xf0, 0x02, 0x12, 0x41, 0x32,
+ 0x0d, 0x0a, 0x9c, 0x0e,
+ 0x10, 0x01, 0x0e, 0x49, 0x20, 0x00, 0xed, 0x0d, 0x3f, 0x00, 0xf1, 0x9f,
+ 0xcc, 0xe0, 0xd0, 0xe4,
+ 0x00, 0x1f, 0x6e, 0xf1, 0x07, 0x25, 0x10, 0x1d, 0x31, 0x00, 0xf0, 0x71,
+ 0x20, 0x0f, 0xf2, 0x12,
+ 0x0f, 0x04, 0xc4, 0xd0, 0xd7, 0x44, 0x30, 0x1f, 0x10, 0xe5, 0x02, 0x70,
+ 0x0e, 0x2f, 0x13, 0x82,
+ 0xd0, 0xff, 0x00, 0xf4, 0xc2, 0xea, 0xdd, 0x02, 0x01, 0xbc, 0x00, 0x02,
+ 0x10, 0x00, 0x40, 0x1d,
+ 0x00, 0x15, 0x75, 0x0e, 0x0c, 0x4f, 0x32, 0x24, 0x0f, 0x40, 0x23, 0x21,
+ 0x0f, 0xcc, 0x01, 0xd2,
+ 0xee, 0xdc, 0xf1, 0xb1, 0xc9, 0xfe, 0x12, 0x0f, 0xda, 0xf0, 0x00, 0x20,
+ 0x0c, 0x60, 0x15, 0x10,
+ 0x0f, 0x3e, 0x1f, 0x73, 0x23, 0x99, 0x00, 0x0f, 0x13, 0x40, 0x00, 0x1e,
+ 0xee, 0xe1, 0x16, 0x11,
+ 0xaf, 0xed, 0x32, 0x22, 0x02, 0x03, 0x44, 0x43, 0x0f, 0xba, 0x22, 0x43,
+ 0x11, 0x0d, 0x1f, 0x10,
+ 0xeb, 0xce, 0xf0, 0x06, 0xc0, 0xcd, 0xf1, 0x01, 0xe0, 0x9b, 0xef, 0x00,
+ 0xf4, 0xed, 0x0f, 0x41,
+ 0x01, 0xfe, 0x00, 0x53, 0x11, 0x1d, 0x0e, 0x06, 0x34, 0xed, 0x0e, 0x55,
+ 0x10, 0xf0, 0x00, 0xd0,
+ 0xae, 0xf0, 0x04, 0xf1, 0xbd, 0xee, 0xf1, 0x24, 0xfe, 0xec, 0x03, 0x53,
+ 0x3f, 0x2c, 0x33, 0x13,
+ 0x25, 0x00, 0xd8, 0x10, 0x71, 0x02, 0x21, 0x2f, 0x3d, 0x50, 0xd9, 0x00,
+ 0x61, 0x00, 0x0d, 0xdf,
+ 0x03, 0xd0, 0xba, 0x00, 0x00, 0xce, 0x1c, 0x40, 0x10, 0x00, 0x00, 0x32,
+ 0x15, 0x00, 0xf1, 0x33,
+ 0x11, 0x8a, 0xed, 0x11, 0x26, 0xc0, 0xbd, 0x00, 0x10, 0x11, 0x0f, 0x20,
+ 0x33, 0x00, 0x0d, 0x00,
+ 0x51, 0x2e, 0x5e, 0x00, 0xf0, 0xd1, 0x07, 0x13, 0x10, 0xbd, 0xba, 0x01,
+ 0x02, 0x1f, 0xfe, 0xf2,
+ 0xe1, 0x00, 0x20, 0xf0, 0xc4, 0x07, 0x00, 0x25, 0x02, 0x90, 0x0f, 0x0f,
+ 0x12, 0x36, 0x01, 0x10,
+ 0x00, 0xa0, 0x05, 0x22, 0xfe, 0xb0, 0xf0, 0x01, 0x00, 0xfc, 0x0a, 0x50,
+ 0x00, 0xfc, 0xff, 0x2f,
+ 0x61, 0x01, 0xe0, 0x1f, 0x3d, 0x2c, 0x00, 0x04, 0x71, 0x1f, 0x0b, 0x32,
+ 0x13, 0xee, 0xbc, 0x00,
+ 0x35, 0x00, 0x00, 0xef, 0x00, 0xef, 0x32, 0x56, 0xde, 0xce, 0x34, 0x77,
+ 0xf0, 0xce, 0x20, 0x33,
+ 0x00, 0x0d, 0x01, 0x53, 0xff, 0xed, 0x0f, 0x00, 0x0c, 0x00, 0x12, 0x02,
+ 0xcd, 0xfd, 0xc0, 0x06,
+ 0x45, 0xde, 0xdb, 0x20, 0x41, 0xc0, 0x9e, 0x01, 0xf1, 0xed, 0xfd, 0x02,
+ 0x17, 0x12, 0x40, 0x30,
+ 0x1f, 0x00, 0x04, 0x00, 0x00, 0xf4, 0xf2, 0xfe, 0xfc, 0x0f, 0xff, 0xc3,
+ 0xb5, 0xef, 0x0c, 0x10,
+ 0xc0, 0x9f, 0x0f, 0x0e, 0x00, 0xff, 0xfb, 0x11, 0x24, 0x73, 0x50, 0x09,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0xde, 0xe0, 0x12, 0x46, 0xef, 0xec, 0xf0, 0xed, 0x11, 0x21, 0x12, 0x9f,
+ 0xf8, 0x0f, 0x60, 0x12,
+ 0x0f, 0x0d, 0x2f, 0x51, 0x00, 0x10, 0x14, 0x01, 0x01, 0xf1, 0xe6, 0x01,
+ 0xd0, 0x8f, 0x0f, 0x03,
+ 0x17, 0x00, 0x20, 0x6e, 0x01, 0x04, 0x00, 0x2e, 0x00, 0xb0, 0xf3, 0x15,
+ 0x01, 0xdc, 0x0c, 0x60,
+ 0x03, 0x00, 0xdf, 0x02, 0x03, 0xdf, 0xb8, 0x10, 0x10, 0xf0, 0x1e, 0x22,
+ 0xc0, 0xae, 0x0f, 0x12,
+ 0x20, 0xda, 0x00, 0x73, 0x25, 0xff, 0xde, 0x00, 0x03, 0xed, 0xdc, 0x10,
+ 0x11, 0x12, 0xcd, 0xfc,
+ 0xef, 0xd9, 0x20, 0x20, 0x00, 0xf0, 0xfa, 0x50, 0x71, 0x30, 0x1f, 0x2f,
+ 0x53, 0x11, 0x43, 0x25,
+ 0x00, 0xfe, 0xf0, 0xed, 0xfc, 0x01, 0x27, 0xb1, 0xc2, 0xd0, 0xe2, 0xf2,
+ 0xf2, 0xd1, 0x06, 0xe3,
+ 0x02, 0x3f, 0x0a, 0x1e, 0x4e, 0x02, 0x32, 0xed, 0x00, 0x00, 0x1f, 0x7a,
+ 0x20, 0x0f, 0xc0, 0xf0,
+ 0x25, 0x33, 0xdf, 0x0c, 0x71, 0x02, 0x10, 0x20, 0x11, 0x41, 0x0e, 0xfe,
+ 0x31, 0x31, 0xf8, 0x0e,
+ 0x20, 0x21, 0x31, 0x34, 0x82, 0xe0, 0xfa, 0xb0, 0x00, 0x02, 0xa1, 0xd0,
+ 0xf3, 0xef, 0xfc, 0xdc,
+ 0xfe, 0x2d, 0x31, 0x03, 0x73, 0x4e, 0xf8, 0xef, 0x00, 0x22, 0x32, 0xed,
+ 0x0f, 0x30, 0x1b, 0xde,
+ 0xcf, 0x2e, 0x5f, 0x10, 0x21, 0xdf, 0xde, 0x0d, 0x5e, 0x30, 0xe8, 0x00,
+ 0x42, 0x17, 0xc1, 0x00,
+ 0x61, 0x00, 0xc0, 0xdf, 0x0f, 0x00, 0xef, 0xf0, 0x00, 0xa8, 0xed, 0x11,
+ 0x31, 0xdc, 0xcf, 0x22,
+ 0x15, 0xff, 0xdd, 0x23, 0x76, 0x30, 0x40, 0x30, 0x10, 0x02, 0xe2, 0x01,
+ 0x23, 0x31, 0x21, 0x11,
+ 0x02, 0x04, 0xbf, 0x0d, 0x21, 0x93, 0xd2, 0xf7, 0xfe, 0xfb, 0x0e, 0xce,
+ 0x90, 0xe0, 0x04, 0xf0,
+ 0xcd, 0x0f, 0x50, 0x34, 0x43, 0x02, 0x00, 0x37, 0xe5, 0xe0, 0x02, 0x00,
+ 0x20, 0xd0, 0x0f, 0x4e,
+ 0xf0, 0xf5, 0xe0, 0x8f, 0x0d, 0x0e, 0x2b, 0x0e, 0xee, 0x01, 0x3d, 0x09,
+ 0xaf, 0x00, 0x3d, 0x3f,
+ 0xe0, 0xe3, 0x00, 0xdf, 0xe2, 0xf3, 0x09, 0x0f, 0x02, 0x31, 0x2c, 0x0b,
+ 0x70, 0x31, 0x0f, 0xdd,
+ 0x52, 0x26, 0x00, 0x01, 0x14, 0x24, 0xd0, 0xdc, 0x0f, 0x73, 0x33, 0x0e,
+ 0x2e, 0x33, 0xa0, 0xea,
+ 0x0e, 0x10, 0x00, 0x0e, 0x00, 0xe0, 0xe6, 0x53, 0x20, 0xe0, 0x10, 0x25,
+ 0xe2, 0x80, 0xde, 0xd2,
+ 0xd3, 0xc1, 0xcf, 0x00, 0x45, 0x2f, 0x0c, 0xe1, 0x36, 0x5f, 0x0b, 0x00,
+ 0x0f, 0xe0, 0xf0, 0x05,
+ 0x10, 0xcc, 0x9f, 0xf0, 0xf0, 0xe0, 0xc2, 0xf1, 0xf0, 0xe0, 0xe0, 0xe2,
+ 0x00, 0x30, 0x72, 0x28,
+ 0x3f, 0x60, 0x2f, 0x1d, 0x20, 0x44, 0x30, 0x2b, 0x31, 0x22, 0xfe, 0xec,
+ 0x0f, 0x0f, 0xff, 0xbd,
+ 0xe1, 0xa4, 0xd0, 0xe0, 0xcb, 0x0f, 0x00, 0x00, 0x0b, 0x43, 0x77, 0x00,
+ 0x2e, 0x1d, 0x00, 0xe3,
+ 0xe0, 0x0c, 0xdd, 0xf0, 0xd0, 0xd0, 0xa0, 0xf0, 0xff, 0xfa, 0x00, 0x06,
+ 0x01, 0x31, 0x70, 0x11,
+ 0x03, 0x1f, 0x7d, 0x2f, 0x00, 0x07, 0x32, 0x00, 0x12, 0x34, 0xf0, 0xde,
+ 0xd0, 0xc1, 0xc1, 0xb0,
+ 0xe0, 0xdc, 0xec, 0x9c, 0xfe, 0x0e, 0x1e, 0xf1, 0xe4, 0x01, 0x03, 0x02,
+ 0x10, 0x3f, 0x01, 0x31,
+ 0x62, 0x27, 0x45, 0x00, 0xef, 0xf0, 0x10, 0xff, 0xac, 0x02, 0x12, 0x31,
+ 0xef, 0xce, 0x00, 0x0c,
+ 0x08, 0x0e, 0x70, 0x10, 0x2e, 0x30, 0x2e, 0x0c, 0x00, 0x10, 0x74, 0x23,
+ 0xf0, 0x0d, 0x1f, 0x00,
+ 0xb4, 0xff, 0xe0, 0xd7, 0xd5, 0xc0, 0xf0, 0xff, 0x02, 0x03, 0x32, 0x66,
+ 0x21, 0x20, 0x7e, 0x20,
+ 0x11, 0x0f, 0x2e, 0x0b, 0xff, 0xe2, 0xd3, 0x0f, 0x02, 0xe4, 0x1c, 0x5b,
+ 0x00, 0xa4, 0xf4, 0xdf,
+ 0xed, 0xdf, 0xef, 0x23, 0x0e, 0xfc, 0x10, 0x60, 0x0c, 0xe0, 0x40, 0x0b,
+ 0xff, 0xd3, 0x06, 0x0f,
+ 0x8e, 0xe0, 0xf2, 0x0f, 0xef, 0xde, 0x0e, 0x3d, 0x4b, 0x60, 0x15, 0x00,
+ 0xed, 0x0f, 0x10, 0x03,
+ 0xe2, 0x33, 0x67, 0x07, 0xf0, 0x00, 0x02, 0xe2, 0xf0, 0x4f, 0x42, 0x02,
+ 0xe1, 0x0f, 0x7b, 0x4e,
+ 0xf0, 0xcf, 0x02, 0xfe, 0x0a, 0xde, 0xbe, 0x0e, 0x2e, 0xff, 0xaf, 0xfd,
+ 0x02, 0x12, 0x1c, 0x39,
+ 0x40, 0x24, 0x00, 0x3f, 0x3a, 0x01, 0xb2, 0x00, 0x3b, 0xff, 0xe1, 0x14,
+ 0x5e, 0x7f, 0x10, 0x20,
+ 0x02, 0x00, 0xf4, 0x02, 0x02, 0xff, 0x9d, 0x0f, 0x31, 0xf6, 0xc2, 0xf2,
+ 0x13, 0x02, 0x01, 0xf5,
+ 0xf2, 0xf2, 0xe0, 0x0e, 0x40, 0x3f, 0x1b, 0x0d, 0xeb, 0x2e, 0x6f, 0x0f,
+ 0x9e, 0xf0, 0xd4, 0x00,
+ 0x00, 0xf9, 0xde, 0xf0, 0xc0, 0x07, 0x05, 0x20, 0x4f, 0x6f, 0x00, 0x00,
+ 0x01, 0x04, 0x22, 0x00,
+ 0xfe, 0xec, 0xd0, 0xbe, 0xef, 0x0d, 0x41, 0x44, 0x0d, 0xdf, 0x90, 0xf0,
+ 0x1a, 0x5c, 0x0e, 0x01,
+ 0x41, 0x1c, 0x0d, 0x1f, 0x20, 0x2d, 0xef, 0xc3, 0x06, 0x10, 0xf2, 0x05,
+ 0x52, 0x01, 0xc2, 0xd0,
+ 0x14, 0x64, 0x12, 0x00, 0xce, 0xd8, 0x10, 0x20, 0xf0, 0x00, 0x0f, 0x6f,
+ 0x20, 0x20, 0xfb, 0xe0,
+ 0x40, 0x12, 0xf3, 0xc4, 0x13, 0x10, 0x0d, 0x0f, 0x8f, 0x04, 0x02, 0x03,
+ 0xe7, 0xf2, 0x0e, 0x2c,
+ 0x43, 0x43, 0x01, 0xfe, 0xbf, 0x01, 0x10, 0xee, 0xeb, 0xc0, 0xfd, 0x23,
+ 0x36, 0xc0, 0xa0, 0xee,
+ 0xfd, 0xfe, 0x0c, 0x0e, 0x00, 0x27, 0xf1, 0xcf, 0xdb, 0xc0, 0xee, 0xf0,
+ 0x64, 0x31, 0x0d, 0x2b,
+ 0x5f, 0x40, 0x10, 0x1d, 0x3b, 0x20, 0x30, 0x0f, 0x0e, 0x00, 0xce, 0x9a,
+ 0xf0, 0xf0, 0xb3, 0xf1,
+ 0x0e, 0x0e, 0x1f, 0x00, 0x12, 0x3f, 0x08, 0xd0, 0x11, 0x31, 0x40, 0x2e,
+ 0x0f, 0x10, 0x30, 0x12,
+ 0xd7, 0xc1, 0xd3, 0xb3, 0x05, 0x11, 0xce, 0xb0, 0x03, 0x64, 0x11, 0x00,
+ 0x0e, 0xf0, 0x20, 0x10,
+ 0x20, 0x47, 0x01, 0xd3, 0x00, 0xc0, 0xe4, 0xf3, 0x9d, 0x00, 0xf6, 0xd0,
+ 0xef, 0xcd, 0xfe, 0xde,
+ 0x2f, 0x30, 0x13, 0x2c, 0x7d, 0x60, 0x01, 0x00, 0x00, 0x37, 0x12, 0x20,
+ 0x3f, 0x20, 0xe2, 0xc1,
+ 0xf2, 0x17, 0x07, 0xc0, 0xaf, 0xff, 0xe0, 0xe0, 0xfe, 0x0f, 0x10, 0x31,
+ 0x1c, 0x0e, 0x70, 0x3e,
+ 0xe9, 0xe0, 0x20, 0x70, 0x00, 0x0f, 0xbc, 0x0b, 0x0d, 0xff, 0x0c, 0xed,
+ 0xde, 0xe1, 0x37, 0x60,
+ 0x10, 0x01, 0x32, 0x31, 0x52, 0x17, 0x01, 0x20, 0x00, 0xe1, 0x01, 0xd0,
+ 0xd0, 0x4f, 0x2e, 0xe0,
+ 0xc1, 0x2e, 0x4b, 0xef, 0x90, 0x12, 0x47, 0xe0, 0xac, 0x01, 0x00, 0xd0,
+ 0xef, 0xe0, 0x12, 0x01,
+ 0x00, 0xf3, 0x21, 0x3e, 0x0d, 0x33, 0x77, 0x12, 0x22, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x72, 0x0c, 0xfe, 0x00, 0x64, 0x0b, 0xe3, 0xff, 0x1b, 0xdf, 0xc4, 0xe3,
+ 0x8b, 0xee, 0xd0, 0xc0,
+ 0xeb, 0xcf, 0x10, 0x04, 0xd0, 0xdd, 0x12, 0x46, 0x01, 0x00, 0x0f, 0x30,
+ 0xe1, 0xb6, 0x11, 0x21,
+ 0xf1, 0xc0, 0x3c, 0x70, 0x73, 0x4f, 0x0e, 0x00, 0x01, 0xfa, 0x0c, 0x1e,
+ 0x0d, 0x0d, 0xf0, 0x00,
+ 0x61, 0x0e, 0x10, 0x02, 0x1c, 0x0c, 0xf0, 0xce, 0xdf, 0x30, 0x0d, 0xb8,
+ 0xfe, 0x1d, 0x30, 0xdf,
+ 0xc2, 0x27, 0x52, 0x0e, 0xbb, 0x00, 0x1f, 0x00, 0x00, 0xc1, 0x01, 0x20,
+ 0x0c, 0x0e, 0x10, 0x52,
+ 0x3e, 0x20, 0x06, 0xc3, 0x00, 0x0f, 0x04, 0x32, 0x3e, 0x49, 0x40, 0x03,
+ 0xc0, 0xde, 0xf2, 0xb5,
+ 0xe0, 0xaf, 0x01, 0x25, 0xd0, 0xb1, 0xe5, 0x12, 0x21, 0x0f, 0x1f, 0x40,
+ 0x02, 0xd2, 0x00, 0xf0,
+ 0xed, 0x80, 0x07, 0xf2, 0x0d, 0x0d, 0x21, 0x24, 0xd0, 0xb0, 0x02, 0xdd,
+ 0x0b, 0x0f, 0x24, 0x23,
+ 0xfb, 0x2e, 0x7f, 0x70, 0x20, 0x0c, 0x0e, 0x3e, 0x0c, 0x0f, 0x0f, 0xfc,
+ 0x2f, 0x2e, 0xfb, 0xde,
+ 0x00, 0xf2, 0x00, 0xe0, 0x07, 0x77, 0x20, 0xe0, 0xc0, 0xf2, 0x11, 0x3f,
+ 0x0f, 0xe0, 0x70, 0x41,
+ 0x21, 0x00, 0x03, 0x30, 0xfa, 0x11, 0x31, 0x43, 0x00, 0xbb, 0xcf, 0x0e,
+ 0xfd, 0xdd, 0xae, 0xf0,
+ 0xf0, 0xdb, 0xcc, 0x00, 0x06, 0x21, 0x11, 0x35, 0x32, 0x00, 0x40, 0x01,
+ 0x03, 0x01, 0x73, 0x0e,
+ 0xe9, 0xd0, 0xee, 0x00, 0xb0, 0xff, 0x30, 0xe0, 0x90, 0xf0, 0xe0, 0xf1,
+ 0xd4, 0xc2, 0x11, 0x10,
+ 0xdc, 0xde, 0xdf, 0x06, 0x36, 0x62, 0x40, 0x5e, 0x11, 0x00, 0x10, 0x32,
+ 0x01, 0xfe, 0xca, 0x0e,
+ 0x3e, 0x0d, 0xfe, 0xd0, 0xd1, 0x9f, 0xfa, 0xe2, 0x00, 0x1a, 0x2c, 0x4e,
+ 0x71, 0x1f, 0x0b, 0x00,
+ 0x41, 0x00, 0x0c, 0x00, 0x22, 0x11, 0x00, 0xe3, 0xc4, 0xf1, 0xd0, 0x0f,
+ 0x2f, 0xb4, 0x00, 0x5b,
+ 0x2d, 0xf1, 0x25, 0x7f, 0x0c, 0xf0, 0x07, 0x14, 0x0e, 0x1f, 0x30, 0xf2,
+ 0x82, 0xe0, 0x11, 0x20,
+ 0xf1, 0xd1, 0x0d, 0x0b, 0x1e, 0x00, 0xf2, 0xbf, 0xcc, 0xe1, 0x15, 0x30,
+ 0x01, 0xf0, 0x0d, 0x4e,
+ 0xd0, 0x95, 0x02, 0x12, 0x00, 0xdb, 0xef, 0x1d, 0x1f, 0xe0, 0xc7, 0xe0,
+ 0xdf, 0xae, 0xbf, 0xe0,
+ 0x01, 0x3d, 0x1c, 0xc1, 0x04, 0x20, 0x1e, 0x10, 0x53, 0x40, 0x5c, 0x14,
+ 0x17, 0x32, 0x2e, 0x0d,
+ 0xef, 0xc0, 0x2c, 0x5f, 0x00, 0xd5, 0x11, 0x52, 0xf2, 0xbf, 0x0f, 0xf2,
+ 0xf5, 0x02, 0x01, 0x01,
+ 0x0f, 0xf0, 0xe0, 0x32, 0x5b, 0xfb, 0xc0, 0x00, 0x00, 0x2d, 0x0d, 0x0e,
+ 0x3f, 0x2d, 0xb5, 0x06,
+ 0x30, 0x7d, 0x70, 0x0e, 0x1e, 0x1d, 0x30, 0xf2, 0xd5, 0xf0, 0xf0, 0xff,
+ 0x0e, 0xd0, 0xd7, 0xd5,
+ 0x02, 0x12, 0xd1, 0xc2, 0x01, 0xec, 0x70, 0x61, 0x02, 0xfe, 0xec, 0xf1,
+ 0x33, 0x1d, 0xea, 0xaf,
+ 0x0f, 0xe0, 0xa1, 0xef, 0xeb, 0xee, 0xf0, 0xfd, 0xf8, 0x0c, 0x22, 0x74,
+ 0x10, 0x2f, 0x0e, 0x00,
+ 0x4f, 0x20, 0x03, 0x31, 0x30, 0x0e, 0x10, 0xf3, 0xbc, 0xfd, 0x03, 0xf2,
+ 0xd2, 0xf7, 0xd0, 0xfd,
+ 0xbc, 0xdd, 0xdd, 0x0d, 0x4d, 0x4d, 0xf8, 0xdd, 0x20, 0x30, 0x10, 0x00,
+ 0x01, 0x30, 0x12, 0xe7,
+ 0xd1, 0x41, 0x3f, 0xe2, 0xe5, 0x50, 0x70, 0x00, 0xc2, 0x13, 0x2e, 0x3e,
+ 0x00, 0x20, 0x14, 0x05,
+ 0x35, 0x60, 0x0c, 0x0f, 0x00, 0x13, 0xf0, 0x8f, 0xf4, 0xf3, 0xef, 0xfe,
+ 0xe3, 0x14, 0x1f, 0x0f,
+ 0x01, 0xd3, 0xee, 0xbd, 0xe1, 0xe4, 0x07, 0x27, 0x62, 0x6d, 0x3e, 0x00,
+ 0x02, 0x31, 0x12, 0xf3,
+ 0xd0, 0xff, 0xcd, 0x02, 0xf3, 0xcf, 0xee, 0xd6, 0xc0, 0xdf, 0x20, 0x00,
+ 0x0c, 0x19, 0xe0, 0x90,
+ 0xf0, 0x0d, 0x0c, 0x2e, 0x4d, 0x7a, 0x2d, 0x1f, 0x1f, 0x3e, 0xe1, 0xd5,
+ 0xf0, 0xfd, 0xef, 0x01,
+ 0xd4, 0xa1, 0xe1, 0xd3, 0x00, 0x4c, 0x70, 0x31, 0x00, 0x28, 0x5e, 0x32,
+ 0xf1, 0xf0, 0x22, 0x41,
+ 0xf0, 0xed, 0xf3, 0x07, 0x17, 0xe0, 0xc0, 0xe0, 0xa1, 0xe0, 0xf0, 0xf0,
+ 0xe2, 0x00, 0x31, 0x2f,
+ 0x0c, 0x4f, 0x72, 0x32, 0xe0, 0xd4, 0xf2, 0x00, 0x4c, 0x08, 0xd0, 0xe1,
+ 0xf3, 0xe1, 0x90, 0xd2,
+ 0xc0, 0xc0, 0xfa, 0xff, 0xe0, 0xfe, 0x0f, 0xee, 0x01, 0x44, 0x1d, 0x7c,
+ 0x31, 0x26, 0x00, 0xff,
+ 0x01, 0x35, 0x0f, 0xed, 0xff, 0x81, 0x03, 0x2f, 0x4f, 0xe0, 0xce, 0x2d,
+ 0x30, 0x25, 0x1f, 0x6e,
+ 0x35, 0x14, 0x01, 0x0d, 0xec, 0xc0, 0x0f, 0x1a, 0x3e, 0xd0, 0xbf, 0xff,
+ 0xfd, 0x0e, 0xca, 0xee,
+ 0xff, 0xef, 0xd0, 0xf4, 0x04, 0x0f, 0x0a, 0xf0, 0x00, 0x43, 0x4f, 0x3f,
+ 0x40, 0x5f, 0x20, 0xf6,
+ 0x02, 0x71, 0x40, 0x01, 0x0f, 0x0f, 0x1d, 0x00, 0x01, 0xef, 0xde, 0x02,
+ 0xe3, 0x81, 0xdd, 0x0d,
+ 0x0b, 0xc0, 0xe3, 0xf3, 0x01, 0x21, 0xe5, 0x05, 0x01, 0xef, 0xe0, 0x20,
+ 0x70, 0xf0, 0xc0, 0x17,
+ 0x45, 0x0f, 0xa0, 0xf0, 0xf2, 0x0d, 0xfd, 0x03, 0x04, 0xed, 0xde, 0x20,
+ 0x71, 0x3f, 0x00, 0xf5,
+ 0x01, 0x21, 0x11, 0x30, 0x1e, 0xf0, 0xa6, 0xff, 0x0b, 0x1e, 0x00, 0x0e,
+ 0x00, 0x00, 0x71, 0x6a,
+ 0x1d, 0x00, 0xf2, 0x02, 0x32, 0x01, 0xb2, 0xe5, 0xe1, 0x00, 0x4f, 0x1f,
+ 0x03, 0x36, 0xff, 0xdf,
+ 0x17, 0x73, 0x10, 0xdd, 0xf0, 0x34, 0x70, 0x0f, 0x0d, 0x10, 0x30, 0xec,
+ 0xba, 0xfe, 0x10, 0x1f,
+ 0x11, 0x10, 0x0f, 0xe0, 0xc0, 0xe7, 0x02, 0xe0, 0xc1, 0xd0, 0xee, 0xea,
+ 0x30, 0x70, 0x0d, 0x0e,
+ 0x1f, 0x3c, 0x1e, 0x5e, 0x1e, 0x0f, 0xdd, 0x02, 0x07, 0xe3, 0x80, 0xe4,
+ 0x03, 0x12, 0xc0, 0xd0,
+ 0xe7, 0x25, 0x10, 0xe2, 0x00, 0x03, 0x20, 0x00, 0x00, 0x51, 0x10, 0x03,
+ 0xe1, 0x1a, 0x7f, 0x10,
+ 0xe0, 0xf2, 0xd0, 0xdd, 0xe3, 0xd1, 0xa0, 0xc0, 0xb0, 0xfe, 0x08, 0x4d,
+ 0x30, 0x00, 0x1e, 0x2a,
+ 0x4f, 0x1e, 0x2d, 0x10, 0x4f, 0x70, 0x10, 0x31, 0x1f, 0xfe, 0xdf, 0x0f,
+ 0x1e, 0xff, 0xac, 0xf2,
+ 0xf7, 0x00, 0xce, 0xff, 0x00, 0x43, 0x26, 0x13, 0x27, 0x11, 0x42, 0x31,
+ 0x00, 0x10, 0x00, 0x3e,
+ 0x2c, 0xcf, 0xef, 0xfe, 0x0c, 0x0f, 0x00, 0x8e, 0xde, 0xc2, 0xd3, 0xe0,
+ 0xfe, 0xdf, 0x00, 0x3f,
+ 0x70, 0x41, 0x04, 0x07, 0x25, 0x52, 0x0f, 0x0d, 0xff, 0x02, 0x13, 0x00,
+ 0xa0, 0xf1, 0xf3, 0xcd,
+ 0xee, 0x00, 0x0f, 0xfd, 0xc5, 0xf6, 0xd1, 0xde, 0xec, 0x0e, 0x6d, 0x3f,
+ 0x0f, 0x00, 0x4e, 0x2d,
+ 0x4c, 0x1b, 0x20, 0x25, 0x10, 0x00, 0x20, 0x05, 0xc2, 0x02, 0xcf, 0xfe,
+ 0xf0, 0x14, 0xe0, 0x9d,
+ 0xf0, 0xf2, 0x00, 0x09, 0x1d, 0x1f, 0x60, 0x42, 0x20, 0x1e, 0x24, 0x05,
+ 0xc1, 0xf2, 0xfe, 0x0d,
+ 0x00, 0x46, 0x71, 0x20, 0xfc, 0xe0, 0x00, 0x10, 0xfe, 0xc0, 0xd5, 0x02,
+ 0xe1, 0x10, 0x7f, 0x60,
+ 0x04, 0x01, 0x01, 0x15, 0x02, 0xf2, 0x00, 0x3d, 0xef, 0xd7, 0xf4, 0xd1,
+ 0xe0, 0xad, 0xec, 0xff,
+ 0xdd, 0xdd, 0x8d, 0xf4, 0x03, 0xdc, 0xdd, 0xe0, 0x00, 0x5c, 0x1a, 0xf0,
+ 0xf3, 0x00, 0x6f, 0x11,
+ 0x0b, 0x2b, 0x5f, 0x00, 0x0c, 0x0e, 0xe0, 0x01, 0xc3, 0xfe, 0xcc, 0xff,
+ 0x0f, 0x31, 0x21, 0x20,
+ 0x2e, 0x0c, 0xf0, 0xd0, 0x0f, 0x4e, 0x20, 0x2f, 0x6e, 0x00, 0xc7, 0xe1,
+ 0xe0, 0x01, 0xc2, 0xf1,
+ 0x00, 0x41, 0x37, 0x10, 0x0e, 0x00, 0x01, 0xf0, 0x80, 0x04, 0x00, 0x21,
+ 0x22, 0xe4, 0xc7, 0x02,
+ 0x00, 0xf1, 0x03, 0x50, 0x30, 0x62, 0x10, 0x10, 0x0d, 0xfe, 0x1d, 0x2e,
+ 0x0c, 0x0f, 0xee, 0xf1,
+ 0x90, 0xc1, 0xfd, 0x0b, 0x00, 0xf1, 0xef, 0x1d, 0x42, 0x47, 0x62, 0x11,
+ 0x13, 0x01, 0x01, 0x05,
+ 0x26, 0x02, 0x11, 0x71, 0x1f, 0x0b, 0xc0, 0xf1, 0xf3, 0xc0, 0x0f, 0xdf,
+ 0xdf, 0xed, 0x8c, 0xfd,
+ 0xfb, 0x0f, 0x1f, 0x0c, 0x0d, 0x2d, 0x39, 0x1f, 0x10, 0x4d, 0x40, 0x03,
+ 0xf4, 0xe1, 0x00, 0x0f,
+ 0x03, 0x16, 0x70, 0x4e, 0x13, 0xe2, 0xfe, 0x2d, 0x12, 0xd3, 0x0a, 0x70,
+ 0x33, 0x07, 0xb0, 0xfc,
+ 0x00, 0x01, 0xf0, 0xd0, 0xf1, 0x03, 0x42, 0xe1, 0xaf, 0xfe, 0x00, 0x27,
+ 0x22, 0xf0, 0xee, 0x0f,
+ 0x10, 0x53, 0x00, 0xac, 0x0f, 0x2d, 0x20, 0xd7, 0x03, 0x70, 0x2d, 0x0d,
+ 0x00, 0x00, 0x02, 0x00,
+ 0x0d, 0x11, 0xc0, 0xe9, 0xfe, 0xde, 0xc2, 0xd4, 0xd0, 0xe0, 0xe0, 0xdf,
+ 0x8d, 0xe0, 0xd5, 0xf7,
+ 0x22, 0x13, 0x10, 0x0b, 0x2e, 0x70, 0x20, 0x23, 0x0e, 0x0e, 0x30, 0x11,
+ 0x43, 0x3f, 0x0a, 0x3f,
+ 0x60, 0x04, 0x03, 0xd0, 0xcc, 0xf0, 0x00, 0x7d, 0x1a, 0x0e, 0xfd, 0xfe,
+ 0x32, 0x32, 0xfe, 0xe9,
+ 0xff, 0x00, 0x00, 0xc3, 0xe1, 0xb0, 0x0b, 0xee, 0xdf, 0x0f, 0x4d, 0x2d,
+ 0x10, 0x22, 0xe0, 0xa8,
+ 0xee, 0x00, 0x0f, 0xfe, 0x00, 0x71, 0x32, 0x1e, 0x4a, 0x41, 0x32, 0x04,
+ 0x03, 0x24, 0x43, 0x02,
+ 0xc1, 0xe1, 0xd3, 0xc2, 0xb5, 0x03, 0xf0, 0xd0, 0xd5, 0xf4, 0x00, 0x50,
+ 0x25, 0x13, 0x0e, 0xed,
+ 0xc3, 0x04, 0xed, 0xaa, 0x01, 0x35, 0x00, 0xd0, 0xa0, 0xf2, 0xe2, 0xf0,
+ 0xe0, 0xf0, 0xe0, 0x1f,
+ 0x7e, 0x21, 0x04, 0x11, 0x2f, 0x3a, 0x3f, 0x2d, 0x3c, 0x5d, 0x1b, 0x2f,
+ 0x0d, 0x0b, 0x2e, 0x4f,
+ 0x20, 0x12, 0x00, 0x02, 0xff, 0xe0, 0xd2, 0xc5, 0x05, 0x02, 0x52, 0x2e,
+ 0x0e, 0xf1, 0x67, 0x35,
+ 0x0f, 0x00, 0x00, 0x01, 0xee, 0xee, 0x0f, 0x6f, 0x4f, 0x1f, 0xe0, 0xd0,
+ 0xf8, 0x0e, 0x21, 0x22,
+ 0x23, 0xa0, 0xd0, 0x02, 0x22, 0x21, 0xc1, 0x02, 0x2f, 0x30, 0x05, 0x02,
+ 0x10, 0x20, 0x24, 0x24,
+ 0x0e, 0xdd, 0xe2, 0xb0, 0x0b, 0x20, 0x2e, 0xa8, 0xdf, 0xce, 0xd0, 0xc0,
+ 0xe0, 0xf0, 0xf4, 0x13,
+ 0x24, 0x00, 0xd3, 0x07, 0x11, 0x30, 0x00, 0xb1, 0xf0, 0x00, 0x60, 0x01,
+ 0x01, 0xe1, 0x2f, 0x2e,
+ 0xea, 0xef, 0x2f, 0x70, 0x0e, 0xf0, 0xd7, 0x02, 0xfd, 0x0c, 0x0c, 0x3e,
+ 0x2e, 0x0e, 0xe0, 0xbb,
+ 0x00, 0x40, 0x10, 0xee, 0x3f, 0x72, 0x12, 0x00, 0x04, 0x12, 0x18, 0x0d,
+ 0x7e, 0x10, 0x0d, 0xf0,
+ 0xe0, 0x00, 0xf4, 0xf0, 0xd2, 0xa2, 0xe4, 0xf7, 0x02, 0xe1, 0x11, 0x73,
+ 0x31, 0x00, 0x20, 0x7c,
+ 0x1c, 0x20, 0x05, 0x01, 0x00, 0xdb, 0xaf, 0xff, 0xe0, 0xf0, 0xf1, 0x02,
+ 0x15, 0x23, 0xfe, 0xe0,
+ 0xf0, 0xde, 0x0f, 0x35, 0xc0, 0xe8, 0x20, 0x30, 0x00, 0xfe, 0x2e, 0x7f,
+ 0x10, 0xd1, 0xef, 0xfd,
+ 0xe0, 0xe7, 0xe3, 0xe0, 0xcf, 0x93, 0xd7, 0xe0, 0xc1, 0xf1, 0xde, 0x1c,
+ 0x41, 0x10, 0x3e, 0x70,
+ 0x41, 0x10, 0x4e, 0x2e, 0x08, 0x20, 0x21, 0x23, 0xf2, 0xb4, 0xf4, 0xf0,
+ 0xd0, 0xcc, 0xf0, 0xb1,
+ 0xf0, 0xfc, 0x0e, 0xf0, 0xf0, 0x00, 0x20, 0x65, 0x2f, 0x2f, 0x13, 0x23,
+ 0x0e, 0x2d, 0x30, 0x3f,
+ 0x0c, 0x2c, 0x70, 0x20, 0xee, 0xdc, 0x0c, 0xd0, 0xcf, 0xad, 0x00, 0x00,
+ 0x0e, 0x13, 0x47, 0x34,
+ 0x1d, 0x20, 0x47, 0x03, 0xe1, 0x41, 0x53, 0x20, 0xe0, 0xfe, 0xf0, 0xe4,
+ 0xcf, 0xdd, 0xdf, 0xfc,
+ 0xdf, 0x80, 0xcc, 0xdc, 0xde, 0xe0, 0xe3, 0xf0, 0xef, 0x0a, 0x3e, 0x5e,
+ 0x21, 0x14, 0x00, 0x21,
+ 0x5e, 0x2f, 0x20, 0x30, 0x4e, 0x10, 0x27, 0xf0, 0xe0, 0xa0, 0xdd, 0xf4,
+ 0xf3, 0x8d, 0x0c, 0xf0,
+ 0x0e, 0xf8, 0x1e, 0x40, 0x1e, 0x0d, 0xec, 0x30, 0x00, 0xdc, 0xf0, 0x75,
+ 0x22, 0xf0, 0xed, 0x12,
+ 0x43, 0x00, 0xad, 0x00, 0xf0, 0x0d, 0x1a, 0x0f, 0xdf, 0xfe, 0x1d, 0x41,
+ 0x07, 0xf1, 0x41, 0x74,
+ 0x61, 0x01, 0x01, 0x03, 0x2f, 0x1c, 0xf2, 0xf7, 0xf0, 0xed, 0xf1, 0xb4,
+ 0xee, 0xff, 0x01, 0x14,
+ 0x04, 0xd1, 0xee, 0x0e, 0x0f, 0x50, 0xf1, 0xf0, 0x21, 0x72, 0x27, 0x03,
+ 0xf0, 0xe0, 0x00, 0xf2,
+ 0x03, 0x55, 0x43, 0x44, 0x20, 0x01, 0x04, 0x04, 0x02, 0x82, 0xd1, 0xf0,
+ 0xcf, 0xe8, 0xbe, 0x00,
+ 0x00, 0x11, 0x0f, 0xfc, 0x0e, 0x2e, 0x5f, 0x0e, 0x29, 0x0f, 0x00, 0x0d,
+ 0xfd, 0xef, 0xdf, 0xf8,
+ 0x3c, 0x5f, 0x00, 0xe1, 0xee, 0x10, 0x63, 0x2f, 0x39, 0x6f, 0x00, 0x10,
+ 0x0e, 0x00, 0xd0, 0x07,
+ 0x43, 0x12, 0x20, 0x00, 0x03, 0x11, 0x21, 0x03, 0xe1, 0xf0, 0x00, 0x0e,
+ 0x59, 0x60, 0x00, 0x01,
+ 0xd5, 0x00, 0x0f, 0xd0, 0xa2, 0xf2, 0xff, 0xe1, 0xd4, 0xe0, 0x0e, 0xf1,
+ 0x06, 0x51, 0x20, 0x00,
+ 0x63, 0x64, 0xff, 0xcd, 0x3a, 0x4e, 0xdd, 0xee, 0x00, 0x33, 0xef, 0xbb,
+ 0x11, 0x00, 0xe0, 0xdd,
+ 0xc4, 0x05, 0xff, 0x0e, 0x02, 0x22, 0x1b, 0x2e, 0x74, 0x04, 0x04, 0x13,
+ 0x12, 0x0d, 0x2d, 0x50,
+ 0x2f, 0x10, 0x10, 0x02, 0x00, 0xdb, 0xcd, 0xc0, 0x0a, 0x2d, 0xef, 0xbf,
+ 0x1d, 0x0d, 0xac, 0xef,
+ 0x1c, 0x2a, 0x2e, 0x11, 0x60, 0x11, 0x10, 0x31, 0x10, 0x0e, 0x00, 0x00,
+ 0xdd, 0xde, 0xa1, 0xe0,
+ 0xdf, 0xec, 0xde, 0x00, 0x2f, 0x70, 0x51, 0x03, 0x32, 0x1b, 0x1b, 0x0e,
+ 0xde, 0x0f, 0x41, 0x12,
+ 0xd0, 0xd0, 0x07, 0xd0, 0xb2, 0xd4, 0x04, 0xf1, 0x91, 0x06, 0x01, 0xee,
+ 0xe0, 0xe0, 0x01, 0x53,
+ 0x0f, 0xeb, 0xf0, 0x30, 0x10, 0x40, 0x2f, 0xfc, 0x00, 0x42, 0xe4, 0xc3,
+ 0xd1, 0xe2, 0xf5, 0xb2,
+ 0xd4, 0xd4, 0xe2, 0x81, 0xee, 0x0a, 0xef, 0x01, 0x10, 0x1f, 0x6d, 0x3f,
+ 0x4e, 0x3f, 0x1f, 0x20,
+ 0x10, 0x0e, 0xcd, 0x02, 0x12, 0x0b, 0xfe, 0xe1, 0x05, 0xf1, 0xf0, 0x0e,
+ 0x3d, 0x01, 0xf3, 0xf0,
+ 0xdf, 0xf3, 0x02, 0x3b, 0x6d, 0x2e, 0x50, 0x30, 0x16, 0x23, 0x20, 0x2e,
+ 0x23, 0x04, 0xf0, 0x0e,
+ 0x0c, 0x0c, 0xe0, 0xa2, 0xe1, 0xab, 0x0d, 0x00, 0xd1, 0xfc, 0x0e, 0x12,
+ 0x1f, 0x6d, 0x1f, 0x0b,
+ 0x0b, 0x0d, 0x2f, 0x4f, 0x02, 0xf0, 0xc1, 0xe6, 0xe2, 0x0f, 0xbe, 0xf5,
+ 0x11, 0xf1, 0x00, 0x05,
+ 0x02, 0xd0, 0x01, 0x34, 0xf0, 0xe0, 0x31, 0x47, 0xf2, 0xd0, 0x1e, 0x21,
+ 0x86, 0xd0, 0x02, 0x10,
+ 0xd1, 0x80, 0x02, 0x04, 0xa0, 0x0d, 0x00, 0x03, 0x10, 0x00, 0x3d, 0x3e,
+ 0x08, 0x0c, 0x10, 0x21,
+ 0x00, 0xce, 0x0e, 0x2f, 0x08, 0xee, 0x40, 0x60, 0x2f, 0x2f, 0x0f, 0x2f,
+ 0x0f, 0xfe, 0xeb, 0xff,
+ 0x20, 0x40, 0x07, 0xf1, 0xe0, 0x10, 0x20, 0x02, 0x12, 0x30, 0xf0, 0xf4,
+ 0x03, 0x4f, 0x39, 0x10,
+ 0x30, 0x70, 0x1e, 0x0d, 0xd0, 0xe0, 0xcc, 0xed, 0xed, 0x80, 0xe0, 0x01,
+ 0x47, 0x01, 0xe1, 0x01,
+ 0x23, 0x02, 0x21, 0x01, 0x05, 0x32, 0x44, 0x61, 0x00, 0x1c, 0x4b, 0x00,
+ 0x00, 0xc5, 0xd0, 0xe0,
+ 0xf0, 0xd4, 0x8f, 0xff, 0xd3, 0xe0, 0xe1, 0xe5, 0xc1, 0xdc, 0xff, 0x20,
+ 0x22, 0x00, 0x0c, 0x70,
+ 0x22, 0x00, 0x00, 0x40, 0x33, 0x32, 0x04, 0x25, 0xf0, 0xfc, 0xef, 0x12,
+ 0xf2, 0xdd, 0x58, 0x2f,
+ 0xef, 0xd0, 0xdd, 0xee, 0x10, 0x50, 0x2e, 0x0f, 0xaf, 0x02, 0x17, 0x03,
+ 0xf4, 0xd0, 0x0f, 0x6f,
+ 0x33, 0x41, 0x2c, 0x4d, 0x22, 0x01, 0xd9, 0x0e, 0x0b, 0x0f, 0x00, 0x20,
+ 0x00, 0xed, 0xf2, 0x55,
+ 0x40, 0x0f, 0x13, 0x57, 0x00, 0xc0, 0xe1, 0x02, 0x40, 0x40, 0x01, 0x21,
+ 0xf0, 0xcf, 0x13, 0x01,
+ 0x03, 0xc7, 0xd0, 0xde, 0xdd, 0x9f, 0xc2, 0xee, 0xeb, 0xf1, 0x05, 0xfe,
+ 0x0d, 0x10, 0x2c, 0x1d,
+ 0x7e, 0x1f, 0xfe, 0xcb, 0x0e, 0x0f, 0x0f, 0xbc, 0x00, 0x16, 0x00, 0x03,
+ 0x39, 0x00, 0x3d, 0x00,
+ 0x14, 0x27, 0x36, 0x32, 0x02, 0x28, 0xff, 0x32, 0xdc, 0xbd, 0xdc, 0xcd,
+ 0xdc, 0xcd, 0xcb, 0xdd,
+ 0xcd, 0xdd, 0xcc, 0xdc, 0xec, 0x0e, 0xfd, 0xed, 0xfd, 0xfc, 0x0e, 0x0e,
+ 0x2d, 0x1b, 0x0d, 0xdb,
+ 0xee, 0x8c, 0xcd, 0xbc, 0xee, 0xce, 0xcd, 0xdc, 0xcd, 0xee, 0xdd, 0xde,
+ 0xdf, 0xd0, 0xe0, 0xdf,
+ 0xff, 0xff, 0x11, 0x31, 0x3f, 0x2c, 0x3a, 0x6e, 0x4d, 0x4b, 0x2b, 0x4d,
+ 0x3c, 0x2d, 0x2d, 0x1b,
+ 0x0d, 0x0e, 0xed, 0xdd, 0xdd, 0xcd, 0xcd, 0xed, 0x0e, 0x0d, 0x1e, 0x5f,
+ 0x70, 0x40, 0x41, 0x33,
+ 0x54, 0x35, 0x33, 0x23, 0x36, 0x33, 0x24, 0x13, 0x04, 0xf3, 0xe5, 0xc3,
+ 0xb2, 0xd1, 0xc3, 0xd3,
+ 0xd3, 0xe2, 0xd2, 0xc2, 0xd1, 0xe0, 0xd0, 0xd0, 0xe0, 0xf1, 0xe1, 0x06,
+ 0x02, 0x11, 0x00, 0x03,
+ 0x02, 0x0e, 0xda, 0xdd, 0x8c, 0xda, 0xcc, 0xdc, 0xec, 0xee, 0xdd, 0xbe,
+ 0xcd, 0xde, 0xdf, 0xde,
+ 0xef, 0xdf, 0x0f, 0x30, 0x01, 0xe3, 0x05, 0x03, 0xd3, 0x93, 0x05, 0x12,
+ 0xf3, 0xd5, 0x02, 0x22,
+ 0x02, 0xf1, 0x10, 0x30, 0x21, 0x72, 0x53, 0x34, 0x33, 0x23, 0x33, 0x41,
+ 0x31, 0x45, 0x65, 0x32,
+ 0x41, 0x53, 0x34, 0x42, 0x20, 0x31, 0x33, 0x33, 0x13, 0x02, 0xf2, 0xd0,
+ 0xbd, 0xd0, 0xc7, 0xd6,
+ 0xd2, 0xd3, 0xd4, 0xb4, 0xe3, 0xd5, 0xc2, 0xd2, 0xc3, 0xe5, 0xe3, 0xe2,
+ 0xe3, 0xe4, 0xd4, 0xd3,
+ 0xc4, 0xc5, 0xc2, 0xc2, 0xd2, 0xe2, 0xc2, 0xc2, 0xd1, 0xf3, 0x04, 0x03,
+ 0xe4, 0x03, 0x03, 0x22,
+ 0x22, 0x23, 0x14, 0x12, 0x00, 0xff, 0x8c, 0xca, 0xcc, 0xdd, 0xcb, 0xdd,
+ 0xbc, 0xde, 0xdd, 0xec,
+ 0xed, 0xdc, 0xed, 0x0c, 0x0d, 0xec, 0xfd, 0x1c, 0x2d, 0x1c, 0x3d, 0x6d,
+ 0x5d, 0x3c, 0x5d, 0x3d,
+ 0x3d, 0x5e, 0x3d, 0x5d, 0x2e, 0x1d, 0x2c, 0x1e, 0x1d, 0x1e, 0x0d, 0xdd,
+ 0xdd, 0xdc, 0xde, 0xce,
+ 0xcd, 0xee, 0xef, 0x00, 0xf3, 0xf6, 0xf3, 0x03, 0x12, 0x05, 0x05, 0x23,
+ 0x02, 0x92, 0xc3, 0xc3,
+ 0xc3, 0xc2, 0xc3, 0xc3, 0xe1, 0xd2, 0xd4, 0xd4, 0xc1, 0xe1, 0xd1, 0xc0,
+ 0xee, 0x0d, 0xfe, 0x00,
+ 0x04, 0x03, 0x26, 0x26, 0x24, 0x43, 0x63, 0x44, 0x22, 0x22, 0x21, 0x12,
+ 0x11, 0x00, 0xe1, 0xc0,
+ 0xdf, 0xbd, 0xed, 0xee, 0xee, 0xfd, 0x1e, 0x41, 0x30, 0x2d, 0x38, 0x6d,
+ 0x4d, 0x40, 0x32, 0x40,
+ 0x30, 0x37, 0x47, 0x34, 0x33, 0x32, 0x43, 0x42, 0x32, 0x44, 0x33, 0x31,
+ 0x41, 0x31, 0x41, 0x30,
+ 0x2b, 0x3d, 0x4e, 0x30, 0x3f, 0x3d, 0x4c, 0x2d, 0x2b, 0x3e, 0x4e, 0x2d,
+ 0x2d, 0x1e, 0x20, 0x00,
+ 0x1e, 0x20, 0x55, 0x37, 0x53, 0x25, 0x22, 0x23, 0x34, 0x13, 0x03, 0x14,
+ 0x25, 0x03, 0xe3, 0xc4,
+ 0xf3, 0xe3, 0xb4, 0xb2, 0xd4, 0xd3, 0xc4, 0xb3, 0xe3, 0xd3, 0xc3, 0xd4,
+ 0xc3, 0xd3, 0xb4, 0xe2,
+ 0xc3, 0xe3, 0xf2, 0x03, 0x01, 0x12, 0x23, 0x34, 0x22, 0x20, 0x2f, 0x2f,
+ 0x1f, 0x0d, 0xe9, 0xdc,
+ 0xad, 0xde, 0xdf, 0xce, 0xcd, 0xcc, 0xff, 0x01, 0x03, 0x04, 0x33, 0x13,
+ 0x42, 0x51, 0x4f, 0x3c,
+ 0x3c, 0x5d, 0x3f, 0x30, 0x3f, 0x4e, 0x2d, 0x3e, 0x31, 0x36, 0x44, 0x02,
+ 0xf1, 0xff, 0xfd, 0xfc,
+ 0x0c, 0x0a, 0x6b, 0x2d, 0x4c, 0x5d, 0x4c, 0x4d, 0x3b, 0x3e, 0x4e, 0x3d,
+ 0x2c, 0x1d, 0x0d, 0x0d,
+ 0xfc, 0xee, 0xbd, 0xde, 0xde, 0xdd, 0xdd, 0xde, 0xbf, 0xe0, 0xef, 0xef,
+ 0xff, 0xfe, 0xff, 0xe0,
+ 0xce, 0xc0, 0xe7, 0xc4, 0xc3, 0xc5, 0xc4, 0xd4, 0xc2, 0xd3, 0xe5, 0xf3,
+ 0x03, 0xf3, 0xd4, 0xd3,
+ 0xf3, 0xd3, 0xa4, 0xc2, 0xd2, 0xb3, 0xd4, 0xc2, 0xd3, 0xe4, 0xd3, 0xe4,
+ 0x03, 0xf2, 0xf2, 0xf2,
+ 0x02, 0x03, 0x20, 0x0d, 0x1b, 0x3d, 0x2b, 0x2b, 0x6d, 0x5d, 0x4d, 0x4d,
+ 0x4f, 0x30, 0x32, 0x62,
+ 0x23, 0x24, 0x43, 0x34, 0x34, 0x47, 0x33, 0x43, 0x33, 0x24, 0x44, 0x22,
+ 0x13, 0x12, 0x12, 0x03,
+ 0xf3, 0xf2, 0xf1, 0x02, 0x13, 0x44, 0x32, 0x43, 0x44, 0x24, 0x23, 0x33,
+ 0x04, 0x02, 0x01, 0x11,
+ 0x00, 0x0e, 0x5d, 0x20, 0xf1, 0xe0, 0xe1, 0xd4, 0xd3, 0xb3, 0xe1, 0xee,
+ 0xe9, 0xcb, 0x9c, 0xcb,
+ 0xcd, 0xdc, 0xcd, 0xde, 0xbe, 0xdd, 0xde, 0xde, 0xbd, 0xee, 0xde, 0xdc,
+ 0xdd, 0xec, 0xfe, 0xfc,
+ 0xea, 0xfd, 0xfc, 0xfc, 0xeb, 0xdd, 0xcc, 0xbd, 0xbc, 0xdd, 0xcd, 0xdc,
+ 0xde, 0xee, 0xce, 0xde,
+ 0xee, 0xfe, 0xed, 0xdd, 0xfd, 0x0d, 0x2e, 0x3b, 0x4d, 0x5c, 0x4c, 0x3d,
+ 0x3b, 0x3e, 0x2e, 0x2e,
+ 0x0e, 0xee, 0xbd, 0xcd, 0xde, 0xad, 0xee, 0xdd, 0xdc, 0xee, 0xdf, 0xdf,
+ 0xfe, 0x1e, 0x4f, 0x5f,
+ 0x5e, 0x3f, 0x40, 0x30, 0x32, 0x57, 0x27, 0x25, 0x23, 0x15, 0x23, 0x14,
+ 0x03, 0x04, 0xf4, 0xe2,
+ 0xd3, 0xc3, 0xd3, 0xb4, 0xd2, 0xd2, 0xd3, 0xe2, 0xe2, 0xe2, 0xf1, 0xf1,
+ 0x01, 0x21, 0xf0, 0xfe,
+ 0x0b, 0x0c, 0xdd, 0xaa, 0xed, 0xdc, 0x8c, 0xed, 0xdc, 0xdd, 0xbc, 0xdd,
+ 0xdd, 0xee, 0xfd, 0xed,
+ 0xee, 0x0d, 0x2e, 0x50, 0x30, 0x60, 0x2e, 0x3f, 0x4f, 0x30, 0x3f, 0x2f,
+ 0x2f, 0x22, 0x07, 0x03,
+ 0xe5, 0xc2, 0xd2, 0xd4, 0x92, 0xe4, 0xe5, 0xe4, 0xe2, 0xf2, 0x03, 0x45,
+ 0x53, 0x22, 0x22, 0x32,
+ 0x53, 0x44, 0x34, 0x21, 0x00, 0x21, 0x21, 0x43, 0x33, 0x11, 0xef, 0xef,
+ 0x15, 0x04, 0x13, 0xc0,
+ 0xc0, 0x77, 0x24, 0xf0, 0xe0, 0x11, 0x43, 0x24, 0x11, 0x23, 0x44, 0x01,
+ 0x33, 0x44, 0x24, 0x02,
+ 0xd1, 0xd3, 0xf5, 0xa2, 0xb0, 0xc0, 0xf0, 0xf2, 0xf2, 0x00, 0x00, 0xf0,
+ 0x01, 0x01, 0x1f, 0x21,
+ 0x54, 0x10, 0x20, 0x30, 0x0f, 0x32, 0x77, 0x11, 0x0f, 0x0e, 0xfe, 0x00,
+ 0xed, 0xdb, 0xee, 0xec,
+ 0x0d, 0x0b, 0xed, 0xda, 0xdd, 0x7f, 0x1d, 0xaa, 0x0f, 0x3f, 0x0d, 0xed,
+ 0x0c, 0x3d, 0x7e, 0x1d,
+ 0x0c, 0x1d, 0x2e, 0x1d, 0x2d, 0x0c, 0x0e, 0x3f, 0x3e, 0xeb, 0xee, 0xde,
+ 0x8d, 0xed, 0xde, 0xbb,
+ 0xef, 0xff, 0xde, 0xfe, 0xfe, 0xcd, 0xfe, 0x11, 0x0f, 0x0f, 0x1e, 0x1f,
+ 0x77, 0x88, 0xdb, 0x75,
+ 0x01, 0xef, 0xf0, 0x00, 0xf0, 0x01, 0xe0, 0xbd, 0x00, 0x03, 0xee, 0xff,
+ 0x04, 0x00, 0xce, 0xf0,
+ 0x02, 0x05, 0xf0, 0xe0, 0x02, 0x00, 0xef, 0x22, 0x01, 0x88, 0x00, 0x55,
+ 0xf0, 0xfe, 0xfe, 0xee,
+ 0x11, 0x44, 0xef, 0xfe, 0x12, 0x11, 0xee, 0x00, 0x24, 0x01, 0xef, 0xfe,
+ 0x31, 0x42, 0x0e, 0x0f,
+ 0x74, 0x22, 0x0c, 0x2f, 0x2f, 0x0c, 0x30, 0x75, 0x10, 0x0f, 0xf9, 0xfe,
+ 0x51, 0x01, 0xfd, 0x0e,
+ 0x0e, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, 0x0d, 0x0d, 0x2c, 0x2b, 0x5d, 0x3d,
+ 0x7f, 0x30, 0x1d, 0x0a,
+ 0x3f, 0x30, 0x51, 0x0f, 0x0e, 0x44, 0x00, 0xfe, 0x12, 0x05, 0x02, 0x04,
+ 0xc0, 0xd1, 0x17, 0xf3,
+ 0x90, 0xf3, 0x05, 0xc1, 0xf2, 0xd3, 0xa1, 0x27, 0x02, 0x8f, 0xff, 0x04,
+ 0x02, 0xf0, 0xe0, 0xef,
+ 0x01, 0x04, 0xd0, 0xf0, 0xf0, 0x01, 0xf1, 0x01, 0x12, 0x11, 0x00, 0x0f,
+ 0x41, 0x32, 0x30, 0x51,
+ 0x2f, 0x20, 0x67, 0x11, 0x0d, 0x20, 0x57, 0x12, 0xed, 0xfe, 0x23, 0x01,
+ 0xec, 0x10, 0x20, 0x0d,
+ 0x1d, 0x1d, 0x0c, 0x2e, 0x1d, 0x0b, 0x3e, 0x4d, 0x5d, 0x2c, 0x3d, 0x3c,
+ 0x5e, 0x40, 0x0d, 0x0b,
+ 0x30, 0x60, 0x00, 0x0d, 0x1e, 0x31, 0x41, 0x1e, 0x4f, 0x0a, 0x3e, 0x62,
+ 0x20, 0x18, 0x2f, 0x40,
+ 0x10, 0x0f, 0x0e, 0x20, 0x11, 0xf0, 0xd0, 0xcf, 0xe1, 0xe6, 0xa1, 0xd0,
+ 0xe2, 0xf6, 0xd2, 0xc1,
+ 0xc1, 0xe3, 0xe3, 0xb1, 0xe2, 0x06, 0x03, 0xf4, 0x01, 0xe0, 0xf2, 0x03,
+ 0x24, 0x11, 0xd0, 0x10,
+ 0x21, 0xbd, 0xfe, 0x01, 0x04, 0x12, 0x9e, 0xe0, 0x37, 0x07, 0xa0, 0xe0,
+ 0xe0, 0x12, 0x12, 0x00,
+ 0x00, 0x01, 0x10, 0x20, 0x30, 0x0f, 0x1e, 0x6f, 0x2f, 0x30, 0x40, 0x2c,
+ 0x4f, 0x2e, 0x3b, 0x5f,
+ 0x1e, 0x0a, 0x4e, 0x71, 0x31, 0x2f, 0x32, 0x44, 0x10, 0x42, 0x24, 0x22,
+ 0x24, 0x35, 0x11, 0x11,
+ 0x45, 0x43, 0x33, 0x23, 0x35, 0x32, 0x21, 0x63, 0x13, 0x23, 0x13, 0x01,
+ 0xca, 0x10, 0x77, 0x34,
+ 0xee, 0xcd, 0x0f, 0x32, 0x12, 0xff, 0xdf, 0xff, 0x10, 0x10, 0xdf, 0xff,
+ 0xf0, 0xc0, 0x9a, 0x00,
+ 0x02, 0xf0, 0xee, 0x0f, 0xff, 0xdd, 0xdf, 0x03, 0xcf, 0x12, 0x77, 0x98,
+ 0x0c, 0x57, 0xf0, 0xee,
+ 0x11, 0x00, 0xdf, 0x31, 0x00, 0xad, 0x11, 0x01, 0xfd, 0xf0, 0x02, 0x13,
+ 0xff, 0xc9, 0xff, 0x00,
+ 0x12, 0x01, 0xbe, 0x00, 0x0f, 0xfc, 0x10, 0x1f, 0x00, 0x00, 0x98, 0x10,
+ 0x52, 0xdb, 0x0e, 0x43,
+ 0xf0, 0xdb, 0xee, 0x20, 0x64, 0x00, 0xcc, 0x00, 0x12, 0x00, 0xff, 0x00,
+ 0x10, 0x11, 0xf0, 0xef,
+ 0x01, 0x01, 0xfe, 0xfd, 0x30, 0x42, 0x0f, 0x61, 0x33, 0x0b, 0x53, 0x12,
+ 0x0b, 0x64, 0x13, 0x0b,
+ 0x12, 0x03, 0xed, 0xfe, 0xf2, 0xf4, 0xe1, 0xbd, 0x0e, 0x24, 0x02, 0xf0,
+ 0xe0, 0xff, 0x00, 0x64,
+ 0x10, 0x0c, 0x0f, 0x01, 0x00, 0xfe, 0x02, 0xcd, 0xd9, 0x10, 0x0e, 0x0d,
+ 0x02, 0x8c, 0xcc, 0xf1,
+ 0xdf, 0xec, 0xfe, 0x00, 0xd0, 0xae, 0xf0, 0x07, 0x13, 0x0e, 0x10, 0x21,
+ 0x00, 0xf0, 0xea, 0x0f,
+ 0x53, 0xf0, 0xfd, 0x34, 0x00, 0xce, 0x14, 0xf1, 0xcf, 0x24, 0x65, 0x01,
+ 0x00, 0xf0, 0x25, 0x23,
+ 0xce, 0xdd, 0x43, 0x47, 0x00, 0xe0, 0xff, 0x30, 0x52, 0x00, 0xff, 0x40,
+ 0x73, 0x20, 0x1f, 0x1f,
+ 0x0e, 0x00, 0x01, 0x37, 0x21, 0x0f, 0x00, 0x01, 0x10, 0x0e, 0x22, 0xe0,
+ 0x8b, 0x00, 0x26, 0x21,
+ 0x00, 0xde, 0xbe, 0x04, 0xf5, 0xbf, 0xfe, 0x00, 0x10, 0xf0, 0xde, 0xdf,
+ 0xf2, 0xf4, 0xb0, 0xef,
+ 0xff, 0xde, 0xef, 0xcf, 0xdd, 0xdd, 0x03, 0x43, 0x2b, 0x1b, 0x2f, 0x00,
+ 0xeb, 0xfd, 0x20, 0x1f,
+ 0xbb, 0xce, 0xdf, 0xdf, 0xee, 0xed, 0xcf, 0xad, 0xde, 0xe1, 0xe4, 0x05,
+ 0x02, 0xdf, 0xfd, 0x0e,
+ 0x3c, 0x7e, 0x32, 0x25, 0x00, 0xdd, 0x0f, 0x74, 0x32, 0x2e, 0x1f, 0x10,
+ 0x20, 0x40, 0x30, 0x2e,
+ 0x37, 0x35, 0x10, 0x1f, 0x30, 0x52, 0x00, 0xed, 0x00, 0x01, 0xca, 0x0f,
+ 0x70, 0x1f, 0x0d, 0x0f,
+ 0xed, 0xcd, 0x03, 0x03, 0xfd, 0x09, 0x0e, 0xed, 0xed, 0x00, 0x2e, 0x60,
+ 0x10, 0xd8, 0xdd, 0x32,
+ 0xd1, 0x8d, 0xed, 0xf0, 0x06, 0xf0, 0xfe, 0x51, 0x30, 0x0f, 0x2f, 0x2f,
+ 0x2f, 0x30, 0x2f, 0x3f,
+ 0x3d, 0x0b, 0x0e, 0xbb, 0xde, 0x9f, 0xdd, 0xdd, 0xe2, 0xd4, 0xa0, 0xe5,
+ 0xe5, 0xd1, 0xd0, 0x02,
+ 0xd0, 0xc0, 0xd5, 0xb2, 0xe3, 0xf6, 0xf1, 0x02, 0x32, 0x12, 0x40, 0x61,
+ 0x22, 0x34, 0x24, 0x10,
+ 0x50, 0x55, 0x21, 0x21, 0x14, 0x01, 0xee, 0xff, 0x34, 0x21, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0xed, 0xfd,
+ 0xec, 0x20, 0x40, 0x3b, 0x4e, 0x2f, 0x0e, 0xde, 0x0e, 0x72, 0x53, 0x1b,
+ 0x1e, 0x1e, 0x00, 0x00,
+ 0xea, 0xbc, 0xf0, 0x02, 0x00, 0x00, 0x12, 0x00, 0x01, 0xcf, 0xdd, 0x36,
+ 0x42, 0x1f, 0x1d, 0x1c,
+ 0x1f, 0x42, 0x20, 0x2c, 0x3d, 0x1f, 0x03, 0x94, 0xc0, 0xc1, 0xf7, 0xe3,
+ 0xd1, 0xd0, 0xe1, 0xe1,
+ 0xf2, 0xc2, 0xa3, 0xe7, 0xc3, 0xd0, 0x05, 0x24, 0x00, 0xf3, 0xc2, 0xe1,
+ 0x26, 0x32, 0x40, 0x72,
+ 0x22, 0x12, 0x32, 0x13, 0x13, 0x03, 0x02, 0x44, 0x43, 0x0f, 0x1e, 0x00,
+ 0x00, 0x1f, 0x41, 0x31,
+ 0x09, 0xec, 0xed, 0xef, 0xdf, 0xac, 0xec, 0x00, 0x1f, 0x4d, 0x4d, 0x4d,
+ 0x2d, 0x1c, 0x08, 0xfe,
+ 0x0d, 0xfc, 0x5e, 0x50, 0x0f, 0x0d, 0xfd, 0x0e, 0x2f, 0x2d, 0x4f, 0x2f,
+ 0x0b, 0x0e, 0x0f, 0x0e,
+ 0xdb, 0xee, 0xdc, 0xbd, 0xf0, 0xe0, 0x9e, 0xde, 0xd1, 0xe4, 0xf2, 0xe0,
+ 0x0f, 0x03, 0xf3, 0xb2,
+ 0xd4, 0xb3, 0xe6, 0xe5, 0xd1, 0xc0, 0xe3, 0xe6, 0xb2, 0xb1, 0xd0, 0xe2,
+ 0x04, 0x22, 0x00, 0x01,
+ 0x13, 0x35, 0x21, 0x32, 0x43, 0x43, 0x12, 0x22, 0x13, 0x02, 0x02, 0x47,
+ 0x76, 0xfe, 0xfd, 0x77,
+ 0x10, 0xee, 0x00, 0x00, 0xf0, 0x21, 0x00, 0xed, 0x30, 0x42, 0x00, 0x1f,
+ 0x0f, 0x30, 0x2f, 0x1b,
+ 0x4f, 0x2f, 0x0d, 0x0d, 0x20, 0x2f, 0xfb, 0xcc, 0x0d, 0x2f, 0x50, 0x10,
+ 0x0e, 0xfd, 0xfc, 0x50,
+ 0x50, 0x09, 0x2d, 0x70, 0x01, 0xfd, 0xee, 0x03, 0x34, 0xff, 0x1e, 0x22,
+ 0xef, 0xf2, 0xd4, 0x9e,
+ 0xef, 0x06, 0x04, 0x03, 0xf0, 0xae, 0xe0, 0x07, 0xe4, 0xb0, 0xf0, 0x01,
+ 0x01, 0x01, 0x02, 0x01,
+ 0x22, 0x42, 0x32, 0x22, 0x22, 0x00, 0x10, 0x32, 0x15, 0x03, 0xc0, 0xdf,
+ 0x00, 0x40, 0x53, 0x17,
+ 0xae, 0xed, 0xf0, 0xff, 0xff, 0x0f, 0x0d, 0x0d, 0xec, 0x1e, 0x61, 0x19,
+ 0xfc, 0x0f, 0x0e, 0x0b,
+ 0xfe, 0x00, 0xff, 0xad, 0xcb, 0xfe, 0x2f, 0x2f, 0xdb, 0xad, 0x00, 0x00,
+ 0xfe, 0xfc, 0x0f, 0x3e,
+ 0x1c, 0x0d, 0x0e, 0xff, 0xbd, 0xff, 0x00, 0xee, 0xff, 0x0f, 0xcd, 0x04,
+ 0xc2, 0xa0, 0x07, 0x12,
+ 0x20, 0x11, 0x02, 0x05, 0xf3, 0xd2, 0xd4, 0x05, 0xc2, 0xa1, 0xf2, 0xe1,
+ 0xe2, 0xe4, 0xa3, 0xf2,
+ 0x14, 0x10, 0x00, 0x31, 0x34, 0xf0, 0xb0, 0x02, 0x13, 0x0e, 0x19, 0x70,
+ 0x32, 0x10, 0x1f, 0xfb,
+ 0xfe, 0x0f, 0x2f, 0x0d, 0x1f, 0x62, 0x00, 0xdd, 0x00, 0x12, 0x31, 0x3e,
+ 0x4d, 0x30, 0x30, 0x51,
+ 0x37, 0x1f, 0x0b, 0x2f, 0x7e, 0x3f, 0x40, 0x10, 0x00, 0xee, 0x04, 0x04,
+ 0xef, 0x0f, 0x00, 0xcf,
+ 0xd0, 0xe0, 0xda, 0xfe, 0xed, 0x0c, 0x30, 0x02, 0x8e, 0xef, 0xd0, 0xc1,
+ 0xc3, 0xf5, 0xef, 0xed,
+ 0xef, 0xde, 0xf3, 0x07, 0x02, 0x12, 0x12, 0x05, 0x03, 0x80, 0xc1, 0xe5,
+ 0xd3, 0xe2, 0x04, 0x42,
+ 0x22, 0x45, 0x44, 0x33, 0x22, 0x00, 0x31, 0x76, 0x22, 0x00, 0x43, 0x23,
+ 0x01, 0x02, 0x01, 0x22,
+ 0x13, 0xde, 0xda, 0x00, 0xe1, 0x8f, 0xfe, 0xfd, 0x0e, 0x2d, 0x09, 0x0e,
+ 0x0f, 0x0e, 0xdd, 0x0e,
+ 0x6f, 0x3d, 0x3c, 0x1c, 0x0e, 0xfd, 0xdc, 0xfe, 0x0e, 0x0f, 0x5f, 0x1d,
+ 0xfa, 0xcd, 0x01, 0x47,
+ 0xd0, 0xae, 0x0e, 0x30, 0x1f, 0x0d, 0x20, 0x10, 0xef, 0xce, 0xff, 0x21,
+ 0x77, 0x10, 0xca, 0x00,
+ 0x02, 0xd0, 0xf0, 0xf0, 0xdf, 0x00, 0x01, 0x8f, 0xef, 0x05, 0xf1, 0xdf,
+ 0xf0, 0x34, 0x32, 0x0e,
+ 0x4e, 0x62, 0x24, 0x00, 0x0f, 0x43, 0x47, 0x23, 0x34, 0x00, 0x00, 0x24,
+ 0x24, 0x01, 0x20, 0x10,
+ 0xde, 0x01, 0x03, 0xb0, 0xef, 0xff, 0xfc, 0x0c, 0x2e, 0x40, 0xf0, 0x8c,
+ 0xdf, 0xf1, 0x00, 0x1d,
+ 0x3e, 0x2e, 0x09, 0x0f, 0xed, 0xde, 0x24, 0x24, 0xae, 0xed, 0x0f, 0xdd,
+ 0xdf, 0x03, 0xe0, 0x89,
+ 0xde, 0x0e, 0x30, 0x4f, 0xfc, 0xdd, 0xff, 0x11, 0x12, 0xbd, 0xd9, 0xd0,
+ 0xc0, 0xc0, 0xe0, 0xef,
+ 0xbc, 0xf0, 0x03, 0x01, 0xf0, 0xd0, 0xe4, 0xd3, 0xb1, 0xd0, 0x04, 0x15,
+ 0xe1, 0xa0, 0xf3, 0xf4,
+ 0x01, 0xef, 0x0c, 0x4f, 0x30, 0x0b, 0x1d, 0x42, 0x14, 0xff, 0x0e, 0x70,
+ 0x40, 0x19, 0x1e, 0x30,
+ 0x12, 0x12, 0x10, 0x0f, 0x60, 0x3f, 0x2b, 0x30, 0xe9, 0xfe, 0x65, 0xf0,
+ 0xee, 0x10, 0xef, 0x00,
+ 0x12, 0x8c, 0xed, 0x02, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x0e, 0x00, 0x24,
+ 0xed, 0x0d, 0x31, 0x47,
+ 0x22, 0xe0, 0xad, 0xf0, 0x00, 0xef, 0xf0, 0x23, 0x01, 0xed, 0x04, 0x04,
+ 0x7e, 0x00, 0xa1, 0x00,
+ 0x09, 0xe4, 0x4c, 0xc8, 0xd5, 0xdd, 0x06, 0xbe, 0x9f, 0xf9, 0x0e, 0x88,
+ 0x10, 0x77, 0xfe, 0xdd,
+ 0x76, 0x22, 0xee, 0xcc, 0x00, 0x23, 0x11, 0xe0, 0xdf, 0xdf, 0x01, 0x34,
+ 0x01, 0xdd, 0xcd, 0x00,
+ 0x56, 0x00, 0xcd, 0xff, 0x01, 0x23, 0x11, 0x10, 0x0f, 0xbc, 0xed, 0x57,
+ 0x34, 0xff, 0x00, 0x21,
+ 0xff, 0xee, 0x11, 0x32, 0x43, 0x00, 0x00, 0x0f, 0xfe, 0xdd, 0x88, 0x9a,
+ 0x00, 0x12, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x56, 0x32, 0x22, 0x01, 0xfe, 0x00, 0x01, 0x00,
+ 0x44, 0x12, 0xef, 0xee,
+ 0xff, 0x00, 0x32, 0x43, 0x00, 0xce, 0xbd, 0x16, 0x47, 0x00, 0xce, 0x0f,
+ 0x00, 0x01, 0xf0, 0xef,
+ 0xef, 0x10, 0x20, 0x00, 0x00, 0x01, 0x01, 0x9d, 0xc9, 0x12, 0x11, 0xdc,
+ 0xed, 0x10, 0x00, 0xcd,
+ 0xdc, 0xef, 0x21, 0x76, 0x63, 0x01, 0x10, 0x00, 0x21, 0x25, 0x11, 0x00,
+ 0x00, 0x34, 0x10, 0xff,
+ 0xe0, 0x00, 0x11, 0xfe, 0x00, 0x11, 0x0f, 0xee, 0xde, 0xbe, 0xdb, 0x12,
+ 0x43, 0xef, 0xf0, 0x45,
+ 0x33, 0x24, 0xff, 0xff, 0x77, 0x20, 0xed, 0x31, 0x64, 0x0e, 0x00, 0x67,
+ 0x21, 0x00, 0xcc, 0x0f,
+ 0x22, 0x10, 0xfe, 0xf0, 0xff, 0xde, 0xcd, 0xdd, 0x00, 0x00, 0xef, 0xdd,
+ 0xdc, 0xef, 0x21, 0x11,
+ 0x00, 0x2f, 0x54, 0x13, 0xf0, 0xd0, 0x88, 0x99, 0xfe, 0xf0, 0x01, 0x12,
+ 0x11, 0x00, 0xf1, 0x14,
+ 0x12, 0x11, 0x01, 0xff, 0xce, 0x12, 0x67, 0x35, 0x21, 0x00, 0x10, 0x22,
+ 0xf0, 0xbd, 0xff, 0x45,
+ 0x22, 0xef, 0xcc, 0xf0, 0x0f, 0x00, 0x23, 0x02, 0xf0, 0xde, 0xbd, 0x01,
+ 0x23, 0x23, 0x11, 0xfe,
+ 0x00, 0x77, 0x12, 0xec, 0x21, 0x77, 0x11, 0x11, 0x00, 0x23, 0x32, 0xff,
+ 0xff, 0x53, 0x00, 0xb8,
+ 0xec, 0x00, 0x00, 0x10, 0x00, 0x0f, 0xff, 0x00, 0xff, 0x00, 0xff, 0xee,
+ 0x54, 0x32, 0xfe, 0xfc,
+ 0x0e, 0x0f, 0xcb, 0xde, 0x10, 0x62, 0x32, 0x23, 0x32, 0xff, 0x88, 0xdc,
+ 0x11, 0x21, 0xdf, 0xdd,
+ 0x00, 0x00, 0xff, 0xdc, 0x22, 0x75, 0x10, 0xff, 0x11, 0x44, 0x01, 0x11,
+ 0x57, 0x31, 0x01, 0x11,
+ 0x00, 0x01, 0x00, 0x10, 0x43, 0x01, 0xff, 0x10, 0x77, 0x00, 0xee, 0x00,
+ 0x32, 0x22, 0x00, 0x00,
+ 0x20, 0x10, 0x21, 0x43, 0x00, 0xed, 0x25, 0x43, 0xef, 0xdd, 0xf0, 0xfe,
+ 0x20, 0x77, 0x00, 0xcc,
+ 0xee, 0x21, 0x42, 0x0f, 0xdb, 0xef, 0x00, 0x21, 0xe0, 0xad, 0x00, 0x26,
+ 0x10, 0xf0, 0xff, 0xbd,
+ 0xee, 0x00, 0x03, 0xef, 0xba, 0xee, 0xf0, 0xf0, 0x02, 0x03, 0xd0, 0x02,
+ 0xf1, 0x88, 0xce, 0x01,
+ 0x01, 0xde, 0xf0, 0x03, 0x12, 0xef, 0xdc, 0x12, 0x67, 0x01, 0xf0, 0xdf,
+ 0x01, 0x12, 0x01, 0xde,
+ 0xde, 0x12, 0x01, 0xcf, 0xf0, 0xf0, 0xad, 0xa8, 0xfc, 0x01, 0x12, 0x10,
+ 0x01, 0xdc, 0x9a, 0xee,
+ 0xfe, 0x10, 0x0f, 0xfd, 0x0f, 0x00, 0xfd, 0x0e, 0x21, 0xfd, 0xb9, 0xff,
+ 0x21, 0x10, 0xff, 0xbb,
+ 0x0e, 0x30, 0x10, 0x0e, 0x40, 0x32, 0x10, 0xee, 0xed, 0x77, 0x65, 0x0f,
+ 0x00, 0x00, 0x0f, 0xcc,
+ 0xfe, 0xed, 0x0f, 0x22, 0x44, 0x10, 0xff, 0xfe, 0x12, 0x46, 0x11, 0xf0,
+ 0x00, 0x23, 0x02, 0xe0,
+ 0xf0, 0x26, 0x01, 0xbf, 0x00, 0x34, 0x11, 0xbf, 0x00, 0x33, 0xef, 0xbb,
+ 0x22, 0x64, 0x00, 0xfe,
+ 0x01, 0x35, 0x01, 0x00, 0x11, 0x11, 0x01, 0x33, 0x34, 0x11, 0x01, 0xf0,
+ 0x12, 0x42, 0x21, 0x30,
+ 0x62, 0x47, 0xff, 0x00, 0x75, 0x10, 0xfd, 0x00, 0x32, 0x0f, 0xcc, 0x00,
+ 0x12, 0x12, 0x00, 0x0f,
+ 0x31, 0x64, 0x36, 0x00, 0xff, 0xde, 0x00, 0x53, 0x11, 0xec, 0xdd, 0x23,
+ 0x34, 0xed, 0x0f, 0x30,
+ 0xfe, 0x0f, 0x74, 0x33, 0xfc, 0xdc, 0xdd, 0xde, 0xef, 0xa9, 0xcc, 0xf0,
+ 0x00, 0xde, 0xac, 0xfe,
+ 0xef, 0x0f, 0x00, 0x00, 0xde, 0x00, 0x26, 0x00, 0xae, 0xff, 0x00, 0xef,
+ 0xaa, 0xff, 0x01, 0x01,
+ 0xf0, 0xee, 0xed, 0x12, 0x33, 0xff, 0xdb, 0xf0, 0x00, 0x00, 0x43, 0x45,
+ 0x00, 0x10, 0x20, 0x73,
+ 0x11, 0x0f, 0x0f, 0x30, 0x64, 0x25, 0x11, 0x0f, 0xfa, 0xdd, 0xef, 0x21,
+ 0x00, 0xab, 0xfe, 0x0f,
+ 0x00, 0x00, 0x1f, 0x42, 0x33, 0x0f, 0xea, 0x00, 0x21, 0x32, 0x55, 0xf0,
+ 0x9b, 0x00, 0x01, 0xfe,
+ 0xde, 0x12, 0x22, 0xde, 0xbc, 0xee, 0xdd, 0xfe, 0x00, 0x0e, 0x0f, 0x01,
+ 0x00, 0xf0, 0x34, 0x77,
+ 0x34, 0x22, 0x00, 0x9c, 0x00, 0x46, 0x00, 0xef, 0x10, 0x21, 0xff, 0xde,
+ 0x11, 0x33, 0xcd, 0xaa,
+ 0x11, 0x45, 0x00, 0x0f, 0x11, 0x54, 0x00, 0xde, 0x00, 0x33, 0x00, 0x00,
+ 0x33, 0x34, 0x00, 0xe0,
+ 0x00, 0x32, 0x21, 0xee, 0x0f, 0x76, 0x22, 0x00, 0xcc, 0x00, 0x00, 0xde,
+ 0x00, 0x33, 0x02, 0xef,
+ 0x10, 0x65, 0x0f, 0xed, 0x00, 0xdd, 0x23, 0x77, 0x01, 0xef, 0x00, 0x01,
+ 0x34, 0xf0, 0xdc, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0xfe, 0xef, 0x01, 0x77, 0x34, 0xe0, 0xd0, 0x46,
+ 0x42, 0xe0, 0xd0, 0x11,
+ 0xf0, 0x9e, 0x02, 0x47, 0x11, 0xf0, 0xff, 0x0f, 0xf0, 0xce, 0x12, 0x77,
+ 0x21, 0xff, 0xfe, 0x21,
+ 0x43, 0x0f, 0x20, 0x20, 0x20, 0x10, 0x41, 0x33, 0x10, 0x21, 0x56, 0x12,
+ 0x00, 0xff, 0x0e, 0xfe,
+ 0x0d, 0x0d, 0x20, 0x74, 0x36, 0x20, 0x31, 0x54, 0x11, 0x10, 0x23, 0x47,
+ 0x01, 0xf0, 0xf0, 0xf0,
+ 0xe0, 0x10, 0x43, 0xef, 0xbb, 0xcc, 0xdd, 0x55, 0x33, 0xdd, 0xab, 0x00,
+ 0x22, 0xfe, 0xee, 0x00,
+ 0x00, 0xff, 0xee, 0x12, 0x01, 0xed, 0xef, 0x02, 0xf1, 0xc0, 0x37, 0x75,
+ 0x11, 0x11, 0x22, 0x02,
+ 0xef, 0xbe, 0xff, 0x00, 0xff, 0xda, 0xbc, 0xee, 0xf0, 0xff, 0x00, 0x44,
+ 0x00, 0xee, 0x00, 0x10,
+ 0x00, 0xdc, 0x9b, 0xee, 0x11, 0x22, 0xcc, 0xbb, 0xf0, 0x21, 0x11, 0x00,
+ 0xdd, 0xed, 0x00, 0x30,
+ 0x00, 0x00, 0x43, 0x32, 0x0e, 0xed, 0x12, 0x77, 0x24, 0xff, 0xf0, 0x00,
+ 0x23, 0x46, 0x21, 0x11,
+ 0x21, 0x00, 0xf0, 0x0e, 0xaa, 0x00, 0x75, 0x00, 0xfe, 0x00, 0x00, 0x33,
+ 0x33, 0xff, 0xee, 0xcd,
+ 0x00, 0x32, 0xfc, 0xaa, 0xff, 0xfe, 0x00, 0x23, 0xef, 0x88, 0xee, 0x10,
+ 0x23, 0x00, 0xff, 0x00,
+ 0xff, 0xff, 0x10, 0x32, 0xfe, 0xaa, 0xdd, 0xed, 0x00, 0xef, 0xce, 0x00,
+ 0x22, 0x00, 0xef, 0xee,
+ 0x03, 0x77, 0x12, 0xfd, 0x0f, 0x24, 0x21, 0x21, 0x53, 0x00, 0xff, 0x10,
+ 0x13, 0x15, 0x23, 0xdf,
+ 0x9b, 0xfe, 0x00, 0x01, 0xdc, 0xcc, 0x0f, 0x10, 0x00, 0x0f, 0xed, 0xcc,
+ 0x13, 0x66, 0x00, 0x0f,
+ 0x0f, 0x00, 0x56, 0x11, 0xf0, 0x11, 0x54, 0x00, 0x0f, 0x23, 0x34, 0x00,
+ 0xf0, 0x01, 0x22, 0x00,
+ 0x10, 0x30, 0x32, 0x23, 0xfe, 0x99, 0x11, 0x53, 0x00, 0x0d, 0x12, 0x00,
+ 0x0f, 0x00, 0xe0, 0xb9,
+ 0xfe, 0x00, 0x34, 0x01, 0xd0, 0xd0, 0xf0, 0x77, 0x11, 0xe0, 0x01, 0x54,
+ 0xf0, 0xcd, 0x13, 0x45,
+ 0x00, 0x00, 0x45, 0x21, 0x00, 0xf0, 0x00, 0x32, 0x33, 0xe0, 0xbd, 0xfe,
+ 0x00, 0x14, 0x12, 0x00,
+ 0x45, 0x42, 0xbc, 0xdb, 0x00, 0x32, 0x00, 0xe0, 0x01, 0xf0, 0x02, 0x32,
+ 0xf0, 0x01, 0x35, 0x63,
+ 0x00, 0x89, 0xff, 0x11, 0x22, 0xfe, 0xfe, 0x00, 0x01, 0xee, 0xed, 0xdd,
+ 0x0d, 0x10, 0x0c, 0x98,
+ 0xff, 0x00, 0x10, 0xff, 0xed, 0x1f, 0x20, 0xec, 0xee, 0x20, 0x00, 0x10,
+ 0x72, 0xec, 0xca, 0x00,
+ 0xee, 0xcd, 0xef, 0x01, 0x22, 0x20, 0xfd, 0x10, 0x77, 0x21, 0xef, 0xf0,
+ 0x45, 0x32, 0xcf, 0xce,
+ 0xee, 0xf0, 0x04, 0x22, 0xf0, 0xde, 0x10, 0x3f, 0x20, 0x54, 0x23, 0x00,
+ 0xf1, 0xf0, 0x8a, 0xed,
+ 0xee, 0x01, 0x67, 0x11, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xca, 0xed, 0x00,
+ 0xef, 0xcc, 0xff, 0x10,
+ 0x10, 0x0f, 0x0e, 0x0e, 0x31, 0x32, 0xdb, 0xab, 0xff, 0x20, 0x10, 0xdc,
+ 0xcd, 0x10, 0x20, 0xcd,
+ 0xbb, 0x0f, 0x00, 0x21, 0x10, 0x0f, 0xfe, 0x20, 0x00, 0x89, 0xff, 0x22,
+ 0x00, 0xcb, 0x00, 0x54,
+ 0x00, 0xee, 0x0f, 0x00, 0xe0, 0xdd, 0xff, 0x11, 0x23, 0xdf, 0xbb, 0xff,
+ 0x00, 0xf0, 0x9b, 0xf0,
+ 0x13, 0x24, 0x11, 0xe0, 0xee, 0x23, 0x67, 0x00, 0x00, 0x02, 0x02, 0x00,
+ 0xe1, 0x02, 0x01, 0xdf,
+ 0xde, 0x22, 0x46, 0x23, 0x43, 0x22, 0x01, 0x44, 0x75, 0x11, 0xff, 0x00,
+ 0x02, 0x01, 0x00, 0xdb,
+ 0xdc, 0x0f, 0x40, 0x20, 0x20, 0x42, 0x31, 0xfc, 0xaa, 0xff, 0x00, 0x10,
+ 0xed, 0xff, 0x00, 0x20,
+ 0x42, 0x20, 0x0f, 0x20, 0x50, 0x12, 0x32, 0x0d, 0xc8, 0x0e, 0x40, 0x10,
+ 0x00, 0x41, 0x11, 0x10,
+ 0x0e, 0xcc, 0x12, 0x56, 0xf0, 0xff, 0x10, 0x00, 0xce, 0xde, 0x00, 0x35,
+ 0x53, 0x00, 0xf0, 0xf0,
+ 0x04, 0x35, 0xf0, 0x00, 0x61, 0x00, 0x10, 0x55, 0x02, 0xef, 0xf0, 0x14,
+ 0x11, 0x11, 0x01, 0xef,
+ 0xbe, 0x03, 0x47, 0x11, 0xde, 0x9b, 0x00, 0x22, 0x00, 0xfe, 0xee, 0xec,
+ 0x00, 0x30, 0xff, 0x99,
+ 0x00, 0x21, 0x10, 0x00, 0x10, 0x0e, 0xed, 0x99, 0xef, 0x00, 0x21, 0x01,
+ 0x10, 0x00, 0xfe, 0x89,
+ 0xee, 0x22, 0x22, 0x00, 0x01, 0x33, 0x0f, 0xa9, 0xff, 0x10, 0x01, 0x00,
+ 0x22, 0x00, 0xbc, 0x00,
+ 0x11, 0xff, 0xdd, 0x00, 0xf0, 0xdf, 0xdf, 0xdf, 0xef, 0xde, 0x99, 0xef,
+ 0x13, 0x25, 0xf0, 0xdf,
+ 0x11, 0x54, 0x01, 0xde, 0xe0, 0x66, 0x12, 0xff, 0xf0, 0x22, 0x11, 0xf0,
+ 0x00, 0x35, 0x73, 0x01,
+ 0xff, 0xee, 0x00, 0x22, 0xfd, 0xeb, 0x0f, 0x52, 0x21, 0xdc, 0xed, 0x32,
+ 0x77, 0x20, 0xf0, 0x00,
+ 0x20, 0xfe, 0xbb, 0x0e, 0x10, 0x0e, 0xec, 0x00, 0x00, 0x30, 0x21, 0xee,
+ 0xab, 0x0f, 0x12, 0x11,
+ 0xcc, 0xde, 0x43, 0x11, 0xaa, 0xdd, 0xff, 0x00, 0x00, 0xff, 0xef, 0x0f,
+ 0x00, 0xdd, 0x34, 0x75,
+ 0xed, 0xba, 0x00, 0x01, 0x11, 0x12, 0xee, 0xdb, 0xff, 0x00, 0x00, 0x43,
+ 0x32, 0xf0, 0xdf, 0x00,
+ 0x01, 0x55, 0x00, 0xce, 0xee, 0x22, 0x34, 0xbc, 0xb9, 0x00, 0x32, 0x00,
+ 0xde, 0xee, 0x10, 0x43,
+ 0x01, 0x00, 0x32, 0x65, 0x01, 0x10, 0x11, 0x22, 0x10, 0x00, 0x31, 0x43,
+ 0x20, 0x0e, 0xe9, 0x00,
+ 0x42, 0x33, 0x0f, 0x0e, 0x20, 0x74, 0x46, 0x0f, 0xdd, 0x10, 0x0d, 0xea,
+ 0x61, 0x43, 0x00, 0x13,
+ 0x11, 0xee, 0xfe, 0x22, 0x23, 0xe0, 0xed, 0x00, 0x35, 0x44, 0xdf, 0x8c,
+ 0xfd, 0xfd, 0xdc, 0xf0,
+ 0xee, 0xf0, 0x25, 0x02, 0xef, 0x00, 0x01, 0xd0, 0x13, 0x77, 0x00, 0xbd,
+ 0xcc, 0xff, 0x24, 0x23,
+ 0xf0, 0xde, 0xdf, 0xcd, 0xee, 0x00, 0x43, 0x45, 0x44, 0x11, 0x0f, 0xfe,
+ 0x34, 0x54, 0xff, 0xcb,
+ 0x00, 0x32, 0x44, 0x11, 0x11, 0x21, 0x32, 0x10, 0xff, 0x00, 0x00, 0x0f,
+ 0x10, 0x54, 0xff, 0xb9,
+ 0x00, 0x42, 0xef, 0xdd, 0x13, 0x13, 0x00, 0x24, 0x00, 0xff, 0x20, 0x43,
+ 0x00, 0x01, 0x00, 0x46,
+ 0x52, 0x00, 0xfd, 0xca, 0xce, 0xdd, 0xee, 0x11, 0x10, 0xec, 0xcb, 0xcd,
+ 0xee, 0xef, 0xf0, 0x44,
+ 0xef, 0x88, 0xdf, 0x10, 0x21, 0x10, 0xf0, 0x0f, 0x42, 0x11, 0xcc, 0xed,
+ 0x00, 0x01, 0x00, 0xd0,
+ 0xdf, 0xce, 0xe0, 0x00, 0xe0, 0xba, 0xcd, 0xee, 0xef, 0xee, 0xee, 0x12,
+ 0x00, 0xed, 0x26, 0x43,
+ 0x55, 0x12, 0xac, 0xdb, 0xff, 0x00, 0x21, 0x54, 0x22, 0xed, 0xdd, 0x22,
+ 0x21, 0xed, 0xcc, 0x32,
+ 0x44, 0x00, 0xed, 0x00, 0x22, 0x12, 0x35, 0x10, 0xce, 0x0f, 0x10, 0xfe,
+ 0xbc, 0x12, 0x65, 0x01,
+ 0x00, 0x00, 0x00, 0x11, 0x13, 0xdf, 0xc0, 0xf3, 0xaa, 0xc9, 0xff, 0x00,
+ 0xce, 0xef, 0x00, 0xed,
+ 0xdb, 0xee, 0xff, 0x10, 0x42, 0x0f, 0xfe, 0x0f, 0xda, 0x0f, 0x72, 0x31,
+ 0x00, 0x00, 0xfe, 0xce,
+ 0xdc, 0x11, 0x44, 0xfe, 0xde, 0x43, 0x45, 0x0f, 0xcb, 0x11, 0x42, 0x00,
+ 0x00, 0x44, 0xf0, 0xdc,
+ 0xf0, 0x01, 0x13, 0x23, 0xff, 0xef, 0x22, 0x12, 0xcd, 0xca, 0x21, 0x64,
+ 0x12, 0x31, 0x21, 0xef,
+ 0xfd, 0x53, 0x11, 0xda, 0xed, 0x52, 0x21, 0xea, 0x00, 0x32, 0x00, 0xed,
+ 0x20, 0x51, 0x0e, 0x0d,
+ 0xf0, 0x26, 0x76, 0x41, 0x00, 0xef, 0x0f, 0x00, 0x10, 0x31, 0x10, 0xed,
+ 0x50, 0x44, 0x0f, 0xec,
+ 0x00, 0x31, 0x33, 0x33, 0x34, 0x53, 0x10, 0xec, 0xdb, 0x00, 0x30, 0x10,
+ 0xe0, 0xf0, 0x00, 0xef,
+ 0xe0, 0xd0, 0xe1, 0x06, 0xa2, 0xf4, 0xf2, 0xd1, 0xc0, 0x9d, 0xef, 0x01,
+ 0x13, 0x14, 0x16, 0x02,
+ 0xf2, 0x03, 0xe2, 0x26, 0x22, 0xf2, 0xa1, 0x02, 0x76, 0x21, 0x00, 0x00,
+ 0x31, 0x00, 0xd0, 0x24,
+ 0x53, 0x00, 0xfe, 0x11, 0x33, 0x00, 0x01, 0x02, 0xad, 0xeb, 0xdd, 0xbb,
+ 0xee, 0x00, 0xed, 0xfd,
+ 0x00, 0xe8, 0xce, 0x10, 0x1f, 0x0f, 0x72, 0x32, 0xec, 0xee, 0x10, 0x0f,
+ 0xdb, 0x20, 0x0e, 0xde,
+ 0x0e, 0x8a, 0xdc, 0x10, 0x42, 0xfe, 0xfd, 0xfd, 0xdb, 0x0f, 0x20, 0x11,
+ 0xef, 0xad, 0x20, 0x32,
+ 0xbc, 0xb9, 0xef, 0x01, 0x11, 0xbe, 0xef, 0x01, 0x11, 0xef, 0xde, 0xf0,
+ 0x03, 0x26, 0x22, 0x00,
+ 0xee, 0xde, 0xf0, 0x02, 0x02, 0x01, 0x53, 0x12, 0xdc, 0xe0, 0x77, 0x67,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x22, 0x00, 0xef, 0x01, 0x55, 0x22, 0x00, 0xf0, 0xef, 0xfe, 0x41, 0x43,
+ 0xfe, 0xeb, 0x10, 0x20,
+ 0xee, 0x00, 0x41, 0x21, 0x00, 0xeb, 0xff, 0x72, 0x45, 0x10, 0x11, 0x42,
+ 0x20, 0x00, 0x32, 0x35,
+ 0x0f, 0xee, 0x73, 0x36, 0xff, 0xee, 0x11, 0x22, 0xff, 0xff, 0x11, 0x21,
+ 0x77, 0x33, 0xff, 0xcc,
+ 0x23, 0x35, 0xf0, 0xbf, 0xef, 0xf0, 0x22, 0x11, 0xd0, 0xe0, 0x36, 0x32,
+ 0xd0, 0xdf, 0x20, 0x42,
+ 0x02, 0xf2, 0x04, 0xd1, 0x80, 0xf0, 0xe0, 0xf0, 0x27, 0x12, 0xd0, 0xe1,
+ 0xe1, 0xe0, 0x44, 0x74,
+ 0xff, 0xde, 0x21, 0x25, 0xff, 0x00, 0x75, 0x00, 0xf0, 0x11, 0x21, 0xef,
+ 0x0f, 0x10, 0x10, 0x52,
+ 0x34, 0x0e, 0x0c, 0x00, 0xdc, 0xcd, 0x31, 0x62, 0x0a, 0xca, 0xfe, 0x41,
+ 0x41, 0x0f, 0xfe, 0x0e,
+ 0x00, 0x1f, 0x0f, 0xee, 0x01, 0x12, 0xed, 0xaa, 0x0e, 0x0d, 0x0f, 0x31,
+ 0x10, 0xfd, 0xcb, 0xbd,
+ 0x00, 0x11, 0xff, 0xa8, 0x00, 0x00, 0xef, 0xee, 0x02, 0x44, 0x11, 0x00,
+ 0xee, 0xef, 0x23, 0x43,
+ 0xf0, 0xde, 0xdd, 0x10, 0x55, 0xee, 0xba, 0x00, 0x43, 0x00, 0xed, 0x00,
+ 0x11, 0x64, 0x23, 0x21,
+ 0x11, 0x00, 0xed, 0xf2, 0x03, 0xec, 0xde, 0x34, 0x22, 0xeb, 0xcd, 0x0e,
+ 0x31, 0x43, 0x0e, 0x0b,
+ 0x40, 0x44, 0x01, 0x11, 0x33, 0xdc, 0x9b, 0xf0, 0x11, 0x23, 0xe0, 0xbb,
+ 0xff, 0x10, 0x10, 0x0e,
+ 0x0e, 0xcd, 0xff, 0x27, 0x11, 0xd0, 0x12, 0x00, 0xbf, 0x20, 0x0e, 0xed,
+ 0x67, 0x01, 0xee, 0xde,
+ 0xee, 0xde, 0xd0, 0x03, 0xf4, 0x80, 0xd1, 0x17, 0x56, 0x00, 0xd0, 0xf0,
+ 0x01, 0x01, 0x00, 0x01,
+ 0xd0, 0xdf, 0x21, 0x11, 0xbe, 0x0f, 0x00, 0x66, 0x34, 0x00, 0xde, 0xdf,
+ 0x44, 0x43, 0xfe, 0x00,
+ 0x23, 0x13, 0x0e, 0x1f, 0x20, 0x21, 0x23, 0x11, 0xfe, 0xca, 0x0f, 0x50,
+ 0x2f, 0x30, 0x42, 0x00,
+ 0x13, 0x47, 0x00, 0xff, 0x51, 0x34, 0x22, 0x01, 0x00, 0x44, 0x77, 0x22,
+ 0xff, 0xde, 0x10, 0x20,
+ 0x00, 0x21, 0x00, 0xff, 0x42, 0x53, 0x09, 0xfd, 0x10, 0x22, 0x00, 0x05,
+ 0xe3, 0x02, 0x74, 0x04,
+ 0x5b, 0x1c, 0x60, 0x02, 0x55, 0x20, 0xb6, 0x00, 0x54, 0x0e, 0xdc, 0xe1,
+ 0x24, 0x10, 0xdd, 0x01,
+ 0xc0, 0xbf, 0x13, 0x43, 0x1e, 0x0c, 0xde, 0xe0, 0xf0, 0xe1, 0xf0, 0x06,
+ 0x61, 0x1f, 0xfd, 0xef,
+ 0xf2, 0x03, 0x32, 0x77, 0x1c, 0xcc, 0xf1, 0x03, 0x00, 0x0f, 0x11, 0x11,
+ 0x20, 0x0f, 0xbb, 0x01,
+ 0x22, 0x22, 0x0e, 0xcc, 0xe0, 0x02, 0x03, 0x12, 0x2e, 0xec, 0xbf, 0x04,
+ 0x64, 0xfb, 0xcd, 0x04,
+ 0x21, 0xef, 0xde, 0xf1, 0xf0, 0x00, 0x0e, 0xfd, 0xf0, 0xe4, 0xe1, 0xce,
+ 0xee, 0x44, 0x10, 0xdc,
+ 0x22, 0x12, 0xae, 0xe0, 0xfe, 0xdd, 0xf2, 0x02, 0xfd, 0xcb, 0xce, 0xf0,
+ 0x57, 0x0c, 0xce, 0x56,
+ 0x41, 0xfd, 0xdd, 0xf0, 0x04, 0x41, 0xed, 0xbb, 0x01, 0x14, 0x30, 0x0f,
+ 0xec, 0xdf, 0x01, 0x12,
+ 0x51, 0x40, 0x1c, 0x0e, 0x01, 0x32, 0xed, 0xee, 0x02, 0x32, 0x2b, 0x1f,
+ 0x71, 0x22, 0x10, 0x1e,
+ 0xfd, 0xf2, 0x27, 0x32, 0x1f, 0x0d, 0xfe, 0xf0, 0x55, 0x21, 0xfe, 0xaa,
+ 0xe0, 0x11, 0x22, 0x0f,
+ 0x10, 0x73, 0x42, 0x0b, 0xdd, 0xf2, 0x14, 0x40, 0x21, 0x10, 0x0e, 0xdd,
+ 0xce, 0xc0, 0xe5, 0x03,
+ 0x0f, 0xfc, 0xae, 0xf1, 0x06, 0x30, 0x41, 0x53, 0x20, 0x09, 0xe0, 0x00,
+ 0x43, 0x00, 0xfd, 0xf0,
+ 0x13, 0x22, 0x0d, 0xce, 0xc0, 0xc0, 0xd0, 0xfe, 0xfd, 0x04, 0x67, 0x11,
+ 0xeb, 0xdf, 0x13, 0x32,
+ 0x0d, 0x51, 0x32, 0x0f, 0xef, 0xe0, 0xe0, 0x11, 0x65, 0x30, 0x0e, 0xfc,
+ 0xe0, 0x01, 0x23, 0x20,
+ 0xfc, 0x01, 0x13, 0xcc, 0x8c, 0xe1, 0x05, 0xf0, 0x0f, 0x21, 0x00, 0xda,
+ 0x00, 0x65, 0x00, 0xfe,
+ 0xf1, 0x33, 0x10, 0xde, 0xe0, 0x02, 0xd0, 0xde, 0x54, 0x20, 0xbb, 0xe0,
+ 0xf2, 0x00, 0xff, 0xfe,
+ 0xe0, 0x05, 0xe0, 0xcc, 0x23, 0x51, 0xec, 0xac, 0x14, 0x32, 0xfc, 0xf0,
+ 0x20, 0x22, 0xfe, 0x9b,
+ 0xef, 0x02, 0x02, 0x0e, 0x0e, 0xee, 0x22, 0x77, 0x20, 0x20, 0x11, 0x1e,
+ 0x10, 0x21, 0x11, 0xfd,
+ 0xc0, 0x05, 0x13, 0xfd, 0xcd, 0x02, 0xf1, 0x00, 0x21, 0x00, 0x31, 0x4f,
+ 0x0e, 0x47, 0x10, 0xfe,
+ 0x43, 0x75, 0x20, 0x21, 0x0d, 0xfc, 0x01, 0x24, 0x53, 0x10, 0xd9, 0xe0,
+ 0xb0, 0xe0, 0x22, 0x10,
+ 0x11, 0x44, 0x1d, 0x1d, 0x10, 0x22, 0x65, 0x10, 0x0f, 0x31, 0x10, 0xba,
+ 0xd0, 0x02, 0xe0, 0xf0,
+ 0xe1, 0xd0, 0xbd, 0xf0, 0xf0, 0xef, 0x27, 0x75, 0x3f, 0x0d, 0xee, 0x10,
+ 0x01, 0xff, 0xf1, 0x02,
+ 0xe0, 0xed, 0xbe, 0x06, 0x76, 0x0e, 0xed, 0xe0, 0xe0, 0xc0, 0xdf, 0x05,
+ 0x21, 0x0f, 0xfe, 0x02,
+ 0x22, 0x10, 0x0e, 0x00, 0x01, 0xc0, 0x11, 0x63, 0x10, 0x11, 0x0c, 0xdb,
+ 0xe1, 0x25, 0x42, 0x10,
+ 0x12, 0xee, 0x8d, 0x06, 0x12, 0xb9, 0xc0, 0x01, 0x23, 0x0e, 0xee, 0xef,
+ 0xf1, 0x67, 0x2f, 0x0f,
+ 0xff, 0xe0, 0x00, 0x53, 0x1f, 0x0d, 0xff, 0x01, 0x00, 0x0e, 0x01, 0x12,
+ 0x0e, 0xed, 0xe0, 0x37,
+ 0x52, 0x0c, 0xff, 0x0e, 0x00, 0xf1, 0x21, 0x72, 0x1d, 0x0a, 0x22, 0x42,
+ 0x0d, 0xed, 0x12, 0x0d,
+ 0xdb, 0x46, 0x71, 0xfe, 0xdd, 0xe1, 0xf3, 0xf0, 0xff, 0xdf, 0xdb, 0x00,
+ 0x33, 0x32, 0xee, 0x9e,
+ 0xf0, 0xfe, 0xdc, 0x03, 0x35, 0xee, 0xad, 0xf3, 0x04, 0x00, 0x0e, 0x63,
+ 0x23, 0x1e, 0x36, 0x10,
+ 0xdb, 0xd0, 0x32, 0x62, 0xfd, 0xff, 0x25, 0x52, 0x0e, 0x0f, 0x31, 0x21,
+ 0x20, 0x0e, 0xfe, 0xf0,
+ 0x13, 0x37, 0x00, 0xed, 0xbf, 0xd0, 0xcf, 0xf0, 0x15, 0xff, 0xff, 0x10,
+ 0x31, 0x76, 0x51, 0x20,
+ 0x0e, 0x0e, 0xbe, 0x06, 0x33, 0x0d, 0xfd, 0x04, 0x12, 0x0e, 0xdd, 0xe0,
+ 0x01, 0xd0, 0xd0, 0x00,
+ 0xd0, 0xd0, 0x67, 0x20, 0x20, 0x20, 0x00, 0xde, 0xe0, 0xe0, 0xd0, 0x80,
+ 0xcd, 0xe3, 0x07, 0x10,
+ 0x0e, 0xd0, 0xe1, 0xd1, 0xd2, 0xc3, 0xbd, 0xba, 0xf4, 0xf1, 0xba, 0xe0,
+ 0x23, 0x10, 0xec, 0xf0,
+ 0x03, 0x12, 0x10, 0x1e, 0xfb, 0x22, 0x44, 0x0e, 0xf0, 0xff, 0xd1, 0xf1,
+ 0x3f, 0x70, 0x20, 0xeb,
+ 0xc0, 0x00, 0x0f, 0xdc, 0x00, 0x42, 0x75, 0x30, 0x0c, 0xdc, 0x12, 0x44,
+ 0x0d, 0xfe, 0x01, 0x54,
+ 0x21, 0x0c, 0xee, 0xf0, 0xf0, 0xf0, 0x00, 0x33, 0x2e, 0x0d, 0x2f, 0x0e,
+ 0xda, 0x21, 0x75, 0x4f,
+ 0x0e, 0xdd, 0xce, 0xd0, 0xe2, 0xe1, 0x00, 0xee, 0xce, 0x06, 0x10, 0xde,
+ 0x10, 0x22, 0xdd, 0xd0,
+ 0x76, 0x60, 0x1e, 0x1e, 0x22, 0x0e, 0xfe, 0x57, 0x47, 0x0f, 0xdc, 0x01,
+ 0x21, 0x10, 0xef, 0x21,
+ 0x31, 0x10, 0x20, 0xfe, 0xb0, 0x01, 0x42, 0x30, 0x1e, 0x0d, 0x01, 0xff,
+ 0xf0, 0x77, 0x00, 0xcb,
+ 0xf0, 0x44, 0x20, 0xf0, 0xee, 0xd0, 0x02, 0x00, 0x0f, 0x32, 0x52, 0xe8,
+ 0xae, 0x02, 0x23, 0x21,
+ 0x0e, 0xbb, 0xd0, 0xf2, 0x13, 0x1e, 0x0c, 0xdf, 0xe0, 0xf1, 0x03, 0xed,
+ 0xdc, 0x11, 0x01, 0xaf,
+ 0x03, 0x41, 0x1d, 0xef, 0xc1, 0xe4, 0xdd, 0x9c, 0x03, 0x06, 0xfd, 0xca,
+ 0x02, 0x21, 0x1f, 0x4f,
+ 0x22, 0x22, 0xfe, 0xdd, 0x00, 0x02, 0xf0, 0x02, 0x52, 0xfa, 0x8a, 0xd0,
+ 0x04, 0x00, 0x0c, 0xe0,
+ 0x00, 0x21, 0x21, 0x20, 0x1f, 0x73, 0x51, 0x0a, 0x10, 0x12, 0x20, 0x1f,
+ 0x1f, 0x20, 0x11, 0x32,
+ 0x10, 0x00, 0x02, 0xfc, 0xef, 0x36, 0x20, 0xae, 0x01, 0x15, 0xff, 0xef,
+ 0x21, 0xce, 0xf0, 0x77,
+ 0x1e, 0x0e, 0x01, 0xf0, 0xe0, 0x02, 0x00, 0xff, 0xd0, 0xc0, 0xf2, 0xdf,
+ 0xb9, 0x02, 0x14, 0x30,
+ 0x1d, 0x2f, 0x21, 0x32, 0x72, 0x00, 0xf8, 0x02, 0x52, 0xee, 0xdd, 0x02,
+ 0x22, 0x20, 0x0e, 0x00,
+ 0xe2, 0xcf, 0xcd, 0x00, 0x01, 0x91, 0x07, 0x35, 0x2e, 0xfc, 0xf0, 0xf0,
+ 0x11, 0x43, 0x0e, 0xed,
+ 0x05, 0xf0, 0xee, 0x63, 0x10, 0x00, 0x55, 0x31, 0x0f, 0x0d, 0x10, 0x32,
+ 0x00, 0xab, 0xcd, 0xf0,
+ 0x37, 0x32, 0xfe, 0xbe, 0xce, 0xe2, 0x15, 0x0f, 0x1f, 0x21, 0x00, 0xdc,
+ 0xe1, 0x14, 0xfe, 0xbe,
+ 0xf1, 0xf2, 0xf0, 0xe1, 0xae, 0xef, 0x02, 0x0f, 0xcc, 0x05, 0x35, 0x3f,
+ 0xfb, 0xd0, 0x10, 0x63,
+ 0x0f, 0x0f, 0x51, 0x33, 0x0f, 0x0e, 0x03, 0x00, 0xee, 0xce, 0xe0, 0xbf,
+ 0x07, 0x22, 0xea, 0xbf,
+ 0xf1, 0x23, 0x2f, 0xfd, 0x01, 0xf1, 0x12, 0x50, 0x0c, 0x0e, 0x34, 0x41,
+ 0x3e, 0x51, 0x10, 0x00,
+ 0x34, 0x43, 0x20, 0x0d, 0xe8, 0x00, 0x76, 0x10, 0x0d, 0x01, 0x34, 0x10,
+ 0x0d, 0x10, 0x53, 0x0f,
+ 0xef, 0xe1, 0xf2, 0xdd, 0xce, 0x03, 0xf1, 0xd0, 0xd1, 0xe5, 0x12, 0x75,
+ 0x0d, 0xdb, 0xc1, 0x03,
+ 0xe1, 0x00, 0x42, 0xfe, 0xcc, 0x02, 0x01, 0xff, 0x12, 0x11, 0xfe, 0xcf,
+ 0xbb, 0xef, 0x37, 0x73,
+ 0x0e, 0xda, 0xe0, 0xf0, 0xd0, 0x00, 0x12, 0x41, 0x42, 0xfa, 0xbe, 0x02,
+ 0x12, 0x0e, 0x00, 0x01,
+ 0xde, 0xf0, 0xf0, 0xf0, 0x30, 0x21, 0xf0, 0xf0, 0x0f, 0xfe, 0xde, 0x00,
+ 0x03, 0x9d, 0xe6, 0x13,
+ 0x30, 0x0d, 0x88, 0xdd, 0x16, 0x10, 0xce, 0xe0, 0x00, 0x10, 0x20, 0x42,
+ 0x20, 0x0e, 0x0d, 0x00,
+ 0x02, 0xd0, 0xd1, 0xde, 0xdd, 0x77, 0x57, 0xfd, 0x00, 0x22, 0xfd, 0xe0,
+ 0x64, 0x31, 0x1d, 0x10,
+ 0x0f, 0x0d, 0x21, 0x63, 0x10, 0x00, 0x02, 0x0d, 0xec, 0xc0, 0xf3, 0x01,
+ 0x09, 0x0f, 0x45, 0x10,
+ 0xbb, 0x00, 0xff, 0x0e, 0x42, 0x31, 0xfc, 0xbe, 0x02, 0x13, 0x0e, 0xfd,
+ 0x12, 0xff, 0x00, 0x00,
+ 0xdd, 0xec, 0x20, 0x43, 0xfe, 0x8c, 0xf6, 0x01, 0xf0, 0xfe, 0xef, 0xee,
+ 0xe0, 0x24, 0x20, 0xfd,
+ 0xf3, 0x05, 0xff, 0x1f, 0x50, 0x43, 0x32, 0xfd, 0xc0, 0x27, 0x47, 0xfd,
+ 0xe0, 0x61, 0x10, 0x00,
+ 0x34, 0x10, 0xb9, 0xf0, 0x23, 0x31, 0x30, 0x0f, 0xcf, 0x31, 0x72, 0x00,
+ 0x0e, 0xf3, 0x00, 0x0f,
+ 0x47, 0x41, 0x20, 0x0d, 0x0f, 0xff, 0x03, 0x21, 0x0d, 0x00, 0x56, 0x30,
+ 0xdd, 0x8d, 0xf1, 0x01,
+ 0x11, 0x12, 0x32, 0x40, 0x2d, 0xfa, 0x02, 0x03, 0x10, 0x0d, 0xcb, 0xde,
+ 0x03, 0x02, 0xf0, 0xfc,
+ 0xde, 0xd2, 0xd3, 0x8a, 0xd0, 0x03, 0xde, 0xac, 0x03, 0xf2, 0xdc, 0xef,
+ 0x00, 0x02, 0x32, 0x0f,
+ 0x0e, 0x03, 0xf0, 0xbc, 0xcf, 0x05, 0x37, 0x33, 0xdc, 0xbf, 0xf2, 0x04,
+ 0xef, 0xf0, 0x42, 0x20,
+ 0x0c, 0x01, 0xd0, 0x90, 0x0f, 0x14, 0x00, 0xee, 0xef, 0x01, 0x26, 0x30,
+ 0x0e, 0x20, 0x3e, 0x5f,
+ 0x60, 0x34, 0x0f, 0xea, 0x00, 0x33, 0x10, 0xfd, 0xff, 0x21, 0x63, 0x0b,
+ 0xde, 0x01, 0x0e, 0x0f,
+ 0x73, 0x20, 0x1d, 0x24, 0x0d, 0x1f, 0x30, 0xd9, 0xb1, 0x07, 0x0f, 0x0e,
+ 0x31, 0xd0, 0xf0, 0x0f,
+ 0x8b, 0xef, 0x13, 0x30, 0xdc, 0x8e, 0x04, 0x13, 0x0f, 0x0c, 0xdf, 0x00,
+ 0x56, 0x00, 0xfd, 0x00,
+ 0x00, 0xf0, 0xdf, 0x12, 0x22, 0xfe, 0xdd, 0xd0, 0xd0, 0x17, 0x1e, 0xff,
+ 0x72, 0x52, 0x0d, 0x04,
+ 0x11, 0xfb, 0xef, 0x02, 0x33, 0x00, 0xda, 0xf0, 0x33, 0x10, 0x0e, 0xff,
+ 0x31, 0x40, 0xcd, 0xbe,
+ 0x03, 0x33, 0x74, 0x3e, 0xf8, 0xdf, 0x00, 0x12, 0x31, 0x00, 0x0f, 0x10,
+ 0x30, 0x0f, 0x0d, 0x0f,
+ 0xbc, 0xe1, 0x03, 0xde, 0xde, 0x22, 0x10, 0x88, 0xee, 0x44, 0x1f, 0xeb,
+ 0x22, 0x72, 0x1f, 0x0e,
+ 0x10, 0x13, 0x13, 0x10, 0x0e, 0xcb, 0xe0, 0xe2, 0xf2, 0xf2, 0x8c, 0xdc,
+ 0x03, 0x02, 0xf0, 0xf0,
+ 0x01, 0xee, 0xdd, 0xe2, 0x05, 0x01, 0xcf, 0xed, 0x01, 0x26, 0xe0, 0x8e,
+ 0xe1, 0x05, 0x0f, 0x00,
+ 0x01, 0x20, 0x20, 0x65, 0x31, 0x2d, 0x1d, 0x31, 0x32, 0x2e, 0x1d, 0x32,
+ 0x10, 0xfe, 0x45, 0x72,
+ 0x1a, 0x00, 0x21, 0x10, 0x3f, 0x72, 0x32, 0x22, 0x10, 0xf8, 0xc0, 0xf1,
+ 0x13, 0x40, 0x0e, 0x10,
+ 0x34, 0x0c, 0xdd, 0x01, 0x52, 0xfa, 0xc0, 0x02, 0xf0, 0xee, 0xce, 0xe2,
+ 0xf3, 0x00, 0xfd, 0x0f,
+ 0x20, 0xf0, 0x06, 0x00, 0xce, 0xb1, 0xf5, 0x10, 0x0e, 0xbf, 0xd0, 0xc0,
+ 0xe1, 0x47, 0x55, 0x0c,
+ 0x0f, 0xf0, 0xd0, 0xf0, 0x24, 0x21, 0xcd, 0x00, 0x43, 0x11, 0xfe, 0xef,
+ 0xf0, 0xc1, 0xaf, 0x05,
+ 0x01, 0xfb, 0xd0, 0x0f, 0xf1, 0xe1, 0xe0, 0x32, 0x72, 0x2e, 0x0e, 0x27,
+ 0x20, 0xfe, 0xf0, 0x01,
+ 0xcc, 0x00, 0x75, 0x10, 0x0d, 0x01, 0x04, 0x10, 0x0c, 0xe0, 0x01, 0x32,
+ 0x20, 0x0f, 0xd0, 0xe2,
+ 0x00, 0x7d, 0x2a, 0x41, 0x56, 0x0f, 0xcb, 0xf2, 0x01, 0xff, 0xcf, 0xf0,
+ 0xf3, 0xf0, 0xfd, 0x00,
+ 0x12, 0x2f, 0x1b, 0x33, 0x01, 0xbd, 0x11, 0x44, 0xab, 0xe0, 0x27, 0x1f,
+ 0xed, 0xe0, 0xb0, 0xf1,
+ 0xf0, 0xef, 0x02, 0x21, 0xfe, 0x00, 0x40, 0x00, 0xe1, 0x00, 0x2e, 0x4f,
+ 0x77, 0x52, 0x1e, 0x1f,
+ 0x11, 0x21, 0x24, 0x00, 0x0b, 0xd0, 0xf0, 0x00, 0x15, 0x30, 0x00, 0xfe,
+ 0xe0, 0x01, 0x03, 0xf2,
+ 0xf0, 0x71, 0x31, 0x1e, 0x2e, 0x1d, 0xca, 0xd0, 0x67, 0x44, 0x00, 0xec,
+ 0xaf, 0xe0, 0x02, 0x36,
+ 0x1f, 0xfe, 0xe0, 0xf1, 0xf0, 0x1f, 0x21, 0xce, 0xdf, 0x26, 0x40, 0x00,
+ 0xed, 0xf0, 0x03, 0x40,
+ 0x30, 0x0f, 0x0e, 0xe0, 0xef, 0x30, 0x2f, 0x8d, 0xe3, 0x27, 0x40, 0x0c,
+ 0xe0, 0xc0, 0xdf, 0x43,
+ 0x22, 0xbb, 0xcf, 0xee, 0xfe, 0x02, 0x04, 0xdc, 0xf0, 0xf0, 0x0e, 0x31,
+ 0x77, 0x30, 0x0f, 0xff,
+ 0xef, 0x00, 0x16, 0x30, 0x1d, 0x00, 0xf0, 0x01, 0x20, 0x10, 0x73, 0x30,
+ 0x2e, 0x77, 0x30, 0x0c,
+ 0xff, 0x01, 0x12, 0xfd, 0x23, 0x76, 0x0f, 0xfd, 0xe0, 0xe0, 0xe2, 0xc0,
+ 0xd1, 0xd2, 0xf0, 0xcd,
+ 0xee, 0xf2, 0x04, 0xde, 0xdd, 0xe3, 0x25, 0x70, 0x0a, 0xde, 0xe1, 0x04,
+ 0x00, 0xf0, 0x0e, 0x10,
+ 0xf0, 0xbd, 0x27, 0x00, 0xdd, 0x62, 0x52, 0x0c, 0xfe, 0xf1, 0x03, 0x1f,
+ 0x0d, 0x0f, 0xcc, 0xbb,
+ 0xe1, 0x15, 0x20, 0xfc, 0xf0, 0x11, 0x23, 0x0f, 0x0e, 0x00, 0x0d, 0x74,
+ 0x44, 0x10, 0x0e, 0x21,
+ 0x34, 0x1f, 0x2f, 0x73, 0x21, 0x0e, 0x1d, 0x25, 0x56, 0x1f, 0x0e, 0x00,
+ 0x00, 0xe2, 0xe2, 0xbd,
+ 0xff, 0x16, 0x00, 0xfe, 0x00, 0xe0, 0x02, 0x65, 0x0f, 0xfe, 0x01, 0xf2,
+ 0xe0, 0xef, 0xee, 0xbd,
+ 0xbd, 0xdd, 0xd0, 0x05, 0x33, 0x1c, 0xfb, 0xf1, 0x04, 0xdd, 0xac, 0x02,
+ 0x12, 0x10, 0x10, 0xfc,
+ 0xef, 0x00, 0x31, 0x30, 0xdc, 0xd0, 0x01, 0x44, 0x30, 0x1c, 0x1e, 0x42,
+ 0xe0, 0x8e, 0xe1, 0x04,
+ 0xeb, 0xe0, 0x05, 0x9e, 0xbb, 0xe0, 0xf1, 0xee, 0xf0, 0x13, 0x20, 0xee,
+ 0xe0, 0x02, 0x0e, 0x61,
+ 0x32, 0x2d, 0x1d, 0x1f, 0x13, 0x11, 0x12, 0x47, 0x33, 0xf8, 0xe0, 0xf2,
+ 0xd0, 0x9f, 0xf0, 0x0f,
+ 0x0c, 0x10, 0x11, 0x45, 0x20, 0x1f, 0x40, 0x42, 0x20, 0x10, 0xe0, 0x9f,
+ 0x03, 0x17, 0x10, 0xca,
+ 0xd0, 0x01, 0x02, 0xee, 0x0f, 0x62, 0x1f, 0x0d, 0x34, 0x1e, 0x0c, 0xf0,
+ 0xf0, 0x10, 0x75, 0x4f,
+ 0x0b, 0x1f, 0x21, 0x20, 0x2f, 0x20, 0x0d, 0xde, 0xf3, 0x05, 0x40, 0x0e,
+ 0xdb, 0x00, 0x51, 0x00,
+ 0x0f, 0x03, 0xe0, 0xfe, 0x32, 0xff, 0xbd, 0x11, 0x0e, 0xac, 0xc0, 0xce,
+ 0xe0, 0x07, 0x02, 0xdf,
+ 0xdf, 0x03, 0x12, 0x40, 0x67, 0x1f, 0xfc, 0xee, 0xf2, 0x02, 0x02, 0x10,
+ 0x10, 0xcd, 0xbf, 0xf0,
+ 0x00, 0x0d, 0xde, 0xff, 0x10, 0x75, 0x46, 0x31, 0x0c, 0x0e, 0x00, 0x13,
+ 0x10, 0x10, 0x20, 0x00,
+ 0x00, 0x0e, 0x0a, 0x52, 0x42, 0x0a, 0x1e, 0x30, 0x11, 0xde, 0x13, 0x74,
+ 0x50, 0x20, 0x0d, 0x0e,
+ 0x05, 0x03, 0x09, 0xf0, 0x00, 0xae, 0xdf, 0xe2, 0xd2, 0xde, 0xe1, 0xe0,
+ 0xbb, 0xc0, 0x03, 0x25,
+ 0x0c, 0xef, 0x12, 0x20, 0xee, 0xf0, 0x06, 0xe0, 0x8e, 0xdf, 0xf1, 0x03,
+ 0xdd, 0xfd, 0x12, 0x36,
+ 0x00, 0xdf, 0xdf, 0xe1, 0xe4, 0x00, 0x60, 0x62, 0x22, 0x32, 0x1f, 0x3d,
+ 0x13, 0x13, 0xf0, 0xef,
+ 0xf1, 0xe1, 0x0e, 0xd8, 0xde, 0x67, 0x64, 0x2f, 0x0d, 0x20, 0x10, 0x20,
+ 0x30, 0x20, 0x10, 0x2f,
+ 0x0d, 0x20, 0x41, 0x53, 0x1d, 0x08, 0x50, 0x13, 0x0d, 0x02, 0x34, 0xed,
+ 0xdf, 0x34, 0x73, 0x1c,
+ 0x0d, 0x01, 0x21, 0x0f, 0x0e, 0xfb, 0xbd, 0xef, 0x07, 0xf1, 0xff, 0xff,
+ 0xbd, 0xd0, 0x07, 0x00,
+ 0xb0, 0xdf, 0xdf, 0xbf, 0xe0, 0xd1, 0xc0, 0xde, 0x02, 0x11, 0x00, 0xe0,
+ 0x00, 0x07, 0xd0, 0xc0,
+ 0xb0, 0xee, 0x02, 0x12, 0xff, 0xf0, 0x26, 0x61, 0x10, 0x30, 0x51, 0x12,
+ 0x23, 0x10, 0x11, 0x46,
+ 0x10, 0x0e, 0x00, 0x44, 0x65, 0x30, 0x3d, 0x1f, 0x12, 0x21, 0x3f, 0x20,
+ 0x25, 0x56, 0x1f, 0xfc,
+ 0xf1, 0x13, 0x30, 0x0f, 0xef, 0xe0, 0xef, 0xe0, 0x12, 0x00, 0x9d, 0xee,
+ 0x24, 0x45, 0x0e, 0x00,
+ 0x12, 0x0d, 0x0d, 0x30, 0x02, 0x8e, 0xce, 0xe5, 0xe2, 0xcd, 0xc0, 0xe3,
+ 0xef, 0xe0, 0xf0, 0xef,
+ 0xf4, 0x17, 0x01, 0x00, 0xff, 0xac, 0xe0, 0x04, 0xf1, 0xcf, 0xcd, 0xe1,
+ 0xe7, 0xe0, 0xce, 0xf2,
+ 0x05, 0xe0, 0xad, 0xe0, 0xf2, 0x01, 0x12, 0x20, 0x20, 0x20, 0x44, 0x0d,
+ 0xeb, 0x14, 0x54, 0x0d,
+ 0xfe, 0x00, 0x01, 0x0f, 0x63, 0x2f, 0x1f, 0x27, 0x30, 0x3f, 0x4e, 0x21,
+ 0x13, 0x01, 0x1f, 0x2c,
+ 0x5f, 0x10, 0xf0, 0x21, 0x74, 0x2e, 0x2e, 0x23, 0x46, 0x1c, 0x0b, 0x00,
+ 0x02, 0xef, 0xbd, 0xde,
+ 0xbf, 0xf1, 0x03, 0x0b, 0xfb, 0xe0, 0xf0, 0xf1, 0xe1, 0xdf, 0x05, 0x05,
+ 0x56, 0x00, 0x8b, 0x00,
+ 0xeb, 0xf5, 0x73, 0xb7, 0x1c, 0xf5, 0xca, 0xb8, 0x0c, 0x8a, 0x00, 0x00,
+ 0x00, 0xbe, 0x0e, 0x0e,
+ 0x5e, 0x10, 0xf0, 0xf0, 0xf9, 0x0e, 0x20, 0x23, 0xe1, 0xc0, 0xeb, 0x0f,
+ 0x11, 0x90, 0xd8, 0x0e,
+ 0x72, 0x03, 0xee, 0x1f, 0x43, 0x00, 0xf0, 0xeb, 0xef, 0x41, 0x01, 0xe0,
+ 0xe0, 0x02, 0xee, 0xe0,
+ 0x0f, 0x0d, 0x23, 0x17, 0xf0, 0xdb, 0x70, 0x40, 0xdd, 0xfd, 0x77, 0x11,
+ 0xdd, 0xe0, 0x22, 0x02,
+ 0xfe, 0xee, 0x23, 0x11, 0xe0, 0x00, 0x77, 0x03, 0xab, 0x00, 0x0f, 0x2f,
+ 0x01, 0x04, 0x00, 0xee,
+ 0xef, 0x11, 0x44, 0x00, 0x01, 0xf0, 0xf1, 0xf1, 0xc0, 0x33, 0x3f, 0x88,
+ 0xf0, 0x16, 0x20, 0xde,
+ 0xf0, 0x10, 0x42, 0x10, 0x02, 0xef, 0x8c, 0x00, 0x26, 0x20, 0xed, 0x0e,
+ 0x12, 0x00, 0xff, 0x00,
+ 0x24, 0x0f, 0x0f, 0x63, 0x12, 0xee, 0x0f, 0x01, 0x13, 0x44, 0x04, 0xf0,
+ 0x0d, 0xfd, 0x0f, 0x53,
+ 0x11, 0x0b, 0x00, 0x43, 0xce, 0xdb, 0x12, 0x00, 0xf2, 0x67, 0x00, 0xee,
+ 0x0f, 0x3f, 0x10, 0x25,
+ 0x00, 0x8b, 0x11, 0x55, 0x00, 0xcd, 0x02, 0x32, 0xed, 0x00, 0x13, 0x02,
+ 0x0f, 0xfd, 0x01, 0x47,
+ 0x32, 0x0d, 0xfe, 0x01, 0xf0, 0xcd, 0xfd, 0x00, 0x67, 0x02, 0xae, 0x1f,
+ 0x22, 0x0f, 0xef, 0x0f,
+ 0xd9, 0xe0, 0x72, 0x14, 0xec, 0xdd, 0x31, 0x33, 0xef, 0xff, 0xf0, 0xdf,
+ 0xee, 0x00, 0x04, 0x00,
+ 0xee, 0xac, 0xe0, 0x32, 0x43, 0x0f, 0xca, 0x2f, 0x21, 0x03, 0xa0, 0x0d,
+ 0x10, 0x17, 0x22, 0x00,
+ 0xed, 0xe0, 0xf0, 0x00, 0x0d, 0xf1, 0x16, 0xff, 0x4f, 0x30, 0x8e, 0xf0,
+ 0xff, 0x0b, 0x02, 0x75,
+ 0x00, 0x00, 0xee, 0x00, 0x10, 0xf0, 0xe0, 0xec, 0x02, 0x03, 0xcf, 0x30,
+ 0x2f, 0xdd, 0xc0, 0xfe,
+ 0x15, 0x57, 0xcf, 0xca, 0x10, 0x41, 0xf0, 0xf0, 0xed, 0xfe, 0xfe, 0x00,
+ 0x5f, 0x33, 0xf3, 0xad,
+ 0x0d, 0x00, 0xfa, 0xff, 0x30, 0x00, 0xef, 0xe0, 0xdc, 0xfe, 0x0f, 0x00,
+ 0x25, 0x1f, 0xc9, 0xf0,
+ 0x1f, 0x00, 0xf0, 0x9f, 0x00, 0x40, 0xef, 0x22, 0x75, 0xdd, 0xbb, 0x01,
+ 0x33, 0x00, 0xe1, 0x24,
+ 0x40, 0xfd, 0xee, 0x0c, 0x00, 0x27, 0x22, 0xbf, 0xfd, 0x10, 0x62, 0x02,
+ 0x00, 0x40, 0x01, 0xe2,
+ 0x15, 0x20, 0x1e, 0x0f, 0x12, 0x32, 0x02, 0xe2, 0xbf, 0xfb, 0x01, 0x14,
+ 0x20, 0x0e, 0xc0, 0xbe,
+ 0x1f, 0x60, 0x01, 0x00, 0x04, 0x30, 0xfb, 0xfe, 0x0f, 0x10, 0x31, 0x47,
+ 0x55, 0xf0, 0xde, 0xed,
+ 0xf0, 0xdf, 0x03, 0x52, 0xf0, 0xbb, 0x00, 0x40, 0x12, 0xfe, 0x01, 0x16,
+ 0xeb, 0xbe, 0x03, 0x54,
+ 0x0f, 0xbc, 0x0f, 0x24, 0x11, 0xed, 0xf0, 0x11, 0x22, 0x00, 0x01, 0xf3,
+ 0xe0, 0x02, 0x00, 0xfb,
+ 0xf0, 0x00, 0x04, 0x12, 0x24, 0x21, 0x9b, 0xde, 0x44, 0x25, 0x00, 0xef,
+ 0xee, 0x01, 0x51, 0x42,
+ 0x00, 0xf2, 0xdf, 0xbd, 0xf0, 0x03, 0x0e, 0x0f, 0x44, 0x01, 0x0f, 0x2e,
+ 0xfc, 0xbe, 0x20, 0x67,
+ 0x00, 0xda, 0x01, 0x02, 0x10, 0x2d, 0xdc, 0x00, 0x22, 0x50, 0x2f, 0x00,
+ 0xef, 0xec, 0x30, 0x2f,
+ 0x30, 0x1d, 0xfe, 0x24, 0xf1, 0x8f, 0x00, 0x37, 0x20, 0x00, 0xac, 0xf0,
+ 0x00, 0x00, 0x02, 0xdd,
+ 0xed, 0x13, 0x16, 0x12, 0x00, 0xad, 0xed, 0x22, 0x11, 0xef, 0xf1, 0x04,
+ 0xee, 0xbe, 0x15, 0x65,
+ 0x33, 0xe0, 0x8c, 0x0f, 0x21, 0x21, 0xf3, 0xf4, 0x0f, 0x0b, 0x10, 0xf2,
+ 0x00, 0xf1, 0x23, 0x13,
+ 0xcd, 0xf9, 0x50, 0x53, 0x00, 0xfc, 0x00, 0x01, 0x32, 0x3f, 0x00, 0xf3,
+ 0xc0, 0x22, 0x33, 0xfd,
+ 0xdf, 0x24, 0x44, 0x0c, 0xfd, 0x41, 0x66, 0x0e, 0xed, 0x10, 0x00, 0x01,
+ 0xff, 0x0c, 0x00, 0xf0,
+ 0xfe, 0x7f, 0x1a, 0xde, 0x13, 0x36, 0xf0, 0xbc, 0xf0, 0x11, 0x21, 0x01,
+ 0xf0, 0x8d, 0xb9, 0x02,
+ 0x32, 0xf0, 0x01, 0x03, 0xfe, 0xff, 0x25, 0x34, 0x00, 0xbe, 0x00, 0x26,
+ 0x11, 0xd0, 0xb0, 0x0f,
+ 0x00, 0xf2, 0x00, 0x02, 0x13, 0xc0, 0xe0, 0x54, 0x2f, 0xeb, 0xe1, 0x55,
+ 0x00, 0xec, 0xe0, 0xe0,
+ 0x41, 0x53, 0x00, 0xfe, 0xfd, 0x0e, 0x01, 0x04, 0x0f, 0x1b, 0x30, 0x44,
+ 0x10, 0x0d, 0x0c, 0x31,
+ 0x0f, 0xac, 0x31, 0x45, 0x0e, 0xed, 0x20, 0x0e, 0xdf, 0x23, 0x70, 0x2a,
+ 0xf0, 0xd0, 0x20, 0x60,
+ 0x0e, 0xdc, 0x1f, 0x20, 0x01, 0x25, 0x1f, 0xcb, 0xff, 0x02, 0x13, 0xdf,
+ 0xac, 0xed, 0x00, 0x12,
+ 0xfd, 0x0d, 0xe0, 0xff, 0x01, 0x45, 0xfe, 0xec, 0x00, 0x65, 0xf3, 0xbf,
+ 0xdb, 0x10, 0x20, 0x01,
+ 0x00, 0x11, 0x0e, 0x8d, 0x13, 0x26, 0x0e, 0x20, 0x22, 0x01, 0xff, 0xd1,
+ 0xf5, 0xe3, 0x0e, 0x1c,
+ 0x72, 0x44, 0xe0, 0xed, 0x00, 0x12, 0xee, 0xd0, 0x67, 0x20, 0xfe, 0xd0,
+ 0x00, 0x33, 0x20, 0x00,
+ 0x10, 0x14, 0xe0, 0xad, 0x01, 0x56, 0xfe, 0xef, 0x20, 0x11, 0x31, 0x24,
+ 0xf0, 0xa8, 0x10, 0x52,
+ 0x02, 0xed, 0xfd, 0x31, 0x33, 0xc0, 0xdd, 0xfd, 0x00, 0x22, 0x01, 0x0e,
+ 0xbf, 0xf2, 0x07, 0x16,
+ 0xfe, 0xe0, 0xde, 0xd0, 0x00, 0x41, 0x10, 0xae, 0xdd, 0xed, 0x00, 0xef,
+ 0xec, 0x35, 0x11, 0xcf,
+ 0xff, 0xaa, 0xef, 0x03, 0x16, 0x00, 0xbd, 0xf0, 0x23, 0x0f, 0xed, 0x00,
+ 0x01, 0x20, 0x9b, 0x01,
+ 0x45, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x40, 0x10, 0xca, 0xce, 0x00, 0x42,
+ 0x00, 0x10, 0x33, 0xcf,
+ 0xda, 0x21, 0x21, 0x01, 0x00, 0xd0, 0xf0, 0x3e, 0x6f, 0x0f, 0xfe, 0xdc,
+ 0x21, 0x07, 0x80, 0xf0,
+ 0x23, 0x22, 0xdb, 0x00, 0x31, 0x00, 0xec, 0x11, 0x20, 0x21, 0x73, 0xec,
+ 0xab, 0x00, 0x03, 0x00,
+ 0xfd, 0xef, 0x22, 0x35, 0xfe, 0xde, 0x1f, 0x51, 0x02, 0xe2, 0x14, 0x3f,
+ 0x0c, 0xf0, 0x22, 0x0f,
+ 0xf1, 0x67, 0x41, 0xfd, 0xff, 0x03, 0x00, 0xca, 0xce, 0x00, 0xc1, 0x00,
+ 0x71, 0x24, 0xff, 0xec,
+ 0x13, 0x12, 0x00, 0xfd, 0x0e, 0x40, 0x32, 0x04, 0xcf, 0xdd, 0x14, 0x0e,
+ 0xea, 0x30, 0x73, 0xd0,
+ 0xe6, 0x23, 0xdc, 0xee, 0x03, 0x40, 0x30, 0x20, 0xf1, 0x9d, 0xfb, 0x00,
+ 0x33, 0x02, 0xde, 0xf1,
+ 0x00, 0x89, 0x0f, 0x03, 0x13, 0x0d, 0x0d, 0x02, 0x13, 0xc9, 0x0e, 0xf0,
+ 0xf1, 0x13, 0x0d, 0x98,
+ 0xf0, 0x11, 0x00, 0xfd, 0xe0, 0x11, 0x0f, 0xab, 0x00, 0x51, 0x0e, 0xef,
+ 0x23, 0x34, 0x0e, 0x0e,
+ 0xef, 0xee, 0x21, 0x74, 0x02, 0xdc, 0xfe, 0x01, 0x03, 0x21, 0x10, 0x2e,
+ 0x0f, 0xb0, 0x03, 0x37,
+ 0x57, 0xde, 0xed, 0x33, 0x20, 0xde, 0x00, 0x04, 0x0f, 0x0e, 0x00, 0x10,
+ 0xf0, 0x02, 0xf1, 0x92,
+ 0x01, 0x42, 0x77, 0x00, 0xea, 0x10, 0x42, 0xf1, 0xef, 0x0f, 0x14, 0x42,
+ 0x0f, 0xf9, 0xf0, 0x01,
+ 0x11, 0xe0, 0x20, 0x70, 0x01, 0xef, 0x0f, 0x10, 0x0f, 0x2e, 0x3f, 0x43,
+ 0x17, 0x02, 0x0f, 0x0e,
+ 0xbe, 0xde, 0xef, 0xf0, 0xe1, 0xfd, 0xde, 0x53, 0x40, 0x0d, 0xce, 0x17,
+ 0x14, 0xef, 0x00, 0x71,
+ 0x2a, 0xfe, 0x00, 0x07, 0x10, 0xd0, 0xbe, 0x00, 0x30, 0x03, 0xaf, 0xee,
+ 0x03, 0x37, 0xf0, 0x10,
+ 0x75, 0x00, 0x01, 0x11, 0x00, 0xee, 0x00, 0xf0, 0x00, 0x32, 0x11, 0xee,
+ 0xd0, 0x15, 0xb0, 0xce,
+ 0x03, 0x45, 0x00, 0x0e, 0x00, 0xe3, 0xf2, 0x20, 0x5f, 0xeb, 0xd0, 0x34,
+ 0x63, 0xee, 0xfb, 0x00,
+ 0x01, 0x00, 0x00, 0x43, 0x62, 0xea, 0xef, 0x41, 0x22, 0x0f, 0x00, 0x13,
+ 0x10, 0x2a, 0xfc, 0xe0,
+ 0x11, 0x76, 0x30, 0xee, 0xcd, 0xf0, 0x12, 0x20, 0x00, 0x0d, 0xee, 0x44,
+ 0x12, 0xde, 0xfa, 0x00,
+ 0x00, 0xf3, 0x52, 0x20, 0xe0, 0xde, 0x0e, 0x5f, 0x52, 0x07, 0xe3, 0xdf,
+ 0xf0, 0x3f, 0x2f, 0x00,
+ 0x32, 0x13, 0x31, 0x13, 0x00, 0x02, 0x50, 0x30, 0x35, 0x77, 0x62, 0xde,
+ 0xd0, 0xf0, 0xfb, 0x20,
+ 0x21, 0xb1, 0x05, 0x41, 0x0e, 0xe0, 0x51, 0x01, 0xfc, 0x22, 0x44, 0x0f,
+ 0xfe, 0xfe, 0xee, 0x04,
+ 0xe1, 0xfd, 0x0d, 0x0f, 0xd0, 0xf7, 0x52, 0x2f, 0x0d, 0xfd, 0x30, 0x01,
+ 0xdf, 0x22, 0x10, 0xea,
+ 0x41, 0x34, 0x8e, 0xec, 0x00, 0x52, 0x01, 0x9d, 0x00, 0x04, 0x04, 0x11,
+ 0xec, 0xda, 0xfe, 0xf0,
+ 0x02, 0x01, 0xfe, 0xce, 0xf0, 0x01, 0xdc, 0xcf, 0x05, 0xf2, 0xdf, 0x50,
+ 0xed, 0x8d, 0x03, 0x23,
+ 0xec, 0xe0, 0x14, 0x0d, 0x1e, 0xfc, 0x0f, 0x00, 0xd0, 0xd2, 0x0f, 0x38,
+ 0x2f, 0x00, 0x00, 0x72,
+ 0x22, 0xbc, 0xca, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x21, 0x00, 0xee, 0x0c,
+ 0x0e, 0x10, 0x03, 0x43,
+ 0x1c, 0x0a, 0x0d, 0xe0, 0xf0, 0xf2, 0x0c, 0x5c, 0x1e, 0x01, 0x56, 0x00,
+ 0xbc, 0xf0, 0x00, 0x00,
+ 0x10, 0x61, 0x01, 0x0d, 0xed, 0xff, 0xf0, 0x0f, 0xcd, 0x03, 0x02, 0xe8,
+ 0xd0, 0x54, 0x22, 0x20,
+ 0xed, 0xe0, 0x02, 0x11, 0xe0, 0x03, 0x55, 0x00, 0x90, 0xfd, 0x00, 0x00,
+ 0x37, 0x54, 0x01, 0xde,
+ 0xee, 0x00, 0x15, 0x62, 0x00, 0xfe, 0xcc, 0x12, 0x67, 0x10, 0xff, 0xee,
+ 0x22, 0x11, 0x21, 0x11,
+ 0x02, 0xe0, 0x0f, 0x21, 0x24, 0x42, 0xfd, 0xcb, 0x11, 0x64, 0x00, 0x0d,
+ 0xf0, 0xf1, 0x01, 0x10,
+ 0x20, 0xf1, 0xe0, 0x33, 0x54, 0xed, 0xf9, 0x20, 0x32, 0x00, 0x00, 0x0d,
+ 0xde, 0x25, 0x21, 0xd0,
+ 0x0e, 0x00, 0xe2, 0x32, 0x41, 0xbf, 0xef, 0xdc, 0x9a, 0xff, 0x10, 0x12,
+ 0x80, 0xdd, 0x01, 0x33,
+ 0xf0, 0xbc, 0x07, 0x04, 0xdf, 0xad, 0x02, 0x25, 0x00, 0xff, 0xf0, 0xf0,
+ 0x00, 0x02, 0xee, 0xdc,
+ 0x00, 0xf1, 0x00, 0x0f, 0xf0, 0x34, 0x63, 0x0d, 0x0b, 0x0f, 0x30, 0x1d,
+ 0x8a, 0xf1, 0x13, 0x10,
+ 0xfd, 0x0e, 0x21, 0x54, 0x13, 0xff, 0xbd, 0xff, 0x24, 0x73, 0x0d, 0x0a,
+ 0xef, 0x01, 0x32, 0x10,
+ 0xfd, 0xe0, 0x00, 0x3e, 0x0f, 0x00, 0xff, 0x0b, 0x10, 0x01, 0x55, 0x31,
+ 0x30, 0x2d, 0xec, 0xae,
+ 0xfd, 0xd0, 0x33, 0x4c, 0xf9, 0x02, 0x04, 0x20, 0xfc, 0x8e, 0xed, 0xfd,
+ 0x40, 0x10, 0xef, 0xe0,
+ 0x14, 0x0e, 0xbc, 0x00, 0x0e, 0x10, 0x15, 0xff, 0xff, 0xf0, 0x1f, 0x2f,
+ 0xc0, 0xc1, 0x06, 0x40,
+ 0x00, 0x15, 0xc0, 0xcf, 0x00, 0x00, 0x22, 0x0c, 0xcc, 0x11, 0x21, 0x1d,
+ 0x0e, 0xff, 0x15, 0x75,
+ 0xfd, 0xab, 0x01, 0x02, 0x01, 0x02, 0x1e, 0xfc, 0xdd, 0xf0, 0x10, 0x42,
+ 0xf3, 0xde, 0x00, 0xe2,
+ 0xd0, 0x61, 0x3d, 0x08, 0xd8, 0x01, 0x01, 0xe0, 0x72, 0x71, 0x0f, 0x0e,
+ 0x00, 0xf3, 0x00, 0x0e,
+ 0x2f, 0x22, 0xf0, 0xce, 0x05, 0x03, 0x10, 0xed, 0x00, 0x2f, 0x42, 0xb3,
+ 0xf3, 0x11, 0x08, 0x0f,
+ 0xe0, 0x17, 0x21, 0x0e, 0xbf, 0x22, 0x01, 0xdf, 0xed, 0x00, 0xf4, 0x80,
+ 0xfe, 0x0d, 0x4f, 0x03,
+ 0xe2, 0xde, 0x0f, 0x15, 0x42, 0xff, 0xe0, 0x25, 0x4f, 0xda, 0xff, 0x65,
+ 0x42, 0x1f, 0x2e, 0x20,
+ 0x01, 0xf2, 0xf4, 0x21, 0x10, 0xe0, 0xd2, 0x22, 0x70, 0x0b, 0xdf, 0x20,
+ 0x00, 0xf0, 0x33, 0x71,
+ 0x0e, 0xd3, 0x07, 0x22, 0x0e, 0x01, 0x24, 0x0e, 0x2b, 0x30, 0x20, 0x04,
+ 0xd2, 0xce, 0x1f, 0x1f,
+ 0xbf, 0x41, 0x75, 0x2e, 0x0a, 0xd0, 0x00, 0x65, 0x20, 0xff, 0xff, 0x0f,
+ 0xee, 0x31, 0x41, 0x9d,
+ 0xfd, 0x05, 0x12, 0x0d, 0x20, 0x23, 0xf0, 0xc8, 0xff, 0x10, 0x45, 0xf0,
+ 0xae, 0xff, 0x00, 0xe0,
+ 0x00, 0x12, 0x32, 0xde, 0xdf, 0x01, 0x40, 0xf0, 0xd0, 0x00, 0x26, 0x50,
+ 0xec, 0xf0, 0x02, 0xd1,
+ 0xc1, 0xe0, 0xf0, 0xdf, 0x01, 0x77, 0x03, 0xda, 0xe0, 0xf0, 0x10, 0x52,
+ 0x30, 0x00, 0xb1, 0x02,
+ 0x00, 0xfe, 0xdb, 0x0f, 0x30, 0x04, 0xf0, 0x01, 0x76, 0x21, 0x00, 0xdd,
+ 0xde, 0x21, 0x13, 0x10,
+ 0x0c, 0x00, 0xdd, 0x40, 0x32, 0x9f, 0xd8, 0x21, 0x00, 0xbf, 0xec, 0x11,
+ 0x65, 0x00, 0xfa, 0x00,
+ 0x2f, 0x00, 0xf0, 0xf0, 0x10, 0x20, 0xfd, 0xa0, 0x13, 0x44, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0xf0, 0x14,
+ 0x5f, 0x2c, 0x21, 0x04, 0x02, 0xe0, 0x9d, 0xff, 0x02, 0x51, 0x22, 0x07,
+ 0xd0, 0xd0, 0x00, 0x40,
+ 0x42, 0xf3, 0xd1, 0x00, 0x05, 0x30, 0xf0, 0xe3, 0x12, 0x55, 0x03, 0xde,
+ 0xdf, 0x13, 0x66, 0x10,
+ 0x1f, 0x01, 0xf5, 0x00, 0x32, 0x1e, 0x0d, 0x61, 0x13, 0x01, 0xe1, 0x01,
+ 0x22, 0x31, 0x00, 0xfb,
+ 0x2f, 0x60, 0x25, 0x44, 0xfd, 0x99, 0x00, 0x22, 0x00, 0xed, 0xe0, 0x00,
+ 0x00, 0xdd, 0xeb, 0x20,
+ 0x71, 0x41, 0xdb, 0xee, 0x10, 0x10, 0x2f, 0x11, 0x0d, 0xdb, 0xf0, 0xf0,
+ 0x12, 0x34, 0x00, 0xe9,
+ 0x30, 0x50, 0xf1, 0x90, 0xfd, 0x01, 0x12, 0x42, 0x22, 0x03, 0xf0, 0x0c,
+ 0xfb, 0xbe, 0x01, 0x16,
+ 0x00, 0x10, 0x1f, 0xc0, 0xd1, 0xd1, 0x03, 0xe0, 0xd1, 0xa0, 0xda, 0x10,
+ 0x40, 0x02, 0xf3, 0x00,
+ 0x0c, 0x8d, 0xde, 0x31, 0x40, 0xfb, 0xcf, 0xf0, 0x03, 0xed, 0x0c, 0x00,
+ 0x3e, 0xfb, 0x30, 0x22,
+ 0xbf, 0x0e, 0x66, 0x22, 0xfe, 0xdb, 0x12, 0x34, 0x0e, 0xcc, 0x00, 0x00,
+ 0x40, 0xf2, 0xff, 0x10,
+ 0x2f, 0x00, 0x3d, 0x50, 0x02, 0xf0, 0xf0, 0xe4, 0xd4, 0xce, 0xaa, 0xee,
+ 0xf0, 0x20, 0x52, 0xec,
+ 0xdf, 0x47, 0x33, 0xd0, 0xcd, 0x20, 0x42, 0x12, 0xf2, 0xff, 0x0d, 0x50,
+ 0x00, 0x0e, 0x0f, 0x14,
+ 0x05, 0x00, 0xde, 0xdf, 0x01, 0x00, 0x55, 0x54, 0x00, 0xfa, 0x10, 0x64,
+ 0x01, 0x01, 0x00, 0x2e,
+ 0x00, 0x12, 0x11, 0xed, 0xed, 0x11, 0x05, 0xe0, 0x2f, 0x7f, 0x20, 0xb2,
+ 0x03, 0x2b, 0xfb, 0xce,
+ 0x03, 0x24, 0x10, 0x1e, 0xff, 0xb0, 0x02, 0x13, 0xfa, 0x2e, 0x61, 0xe3,
+ 0xd0, 0xfe, 0x11, 0x13,
+ 0xd1, 0xae, 0x0c, 0x0e, 0xe9, 0xbf, 0x00, 0x04, 0x1e, 0x0e, 0xe0, 0xe3,
+ 0xf3, 0xbd, 0xfe, 0x25,
+ 0x01, 0xbf, 0xf1, 0xf4, 0xce, 0xdf, 0x02, 0x26, 0x10, 0xdd, 0xd2, 0x37,
+ 0x10, 0xc0, 0xe0, 0x20,
+ 0x23, 0x8e, 0xdc, 0x00, 0x01, 0x02, 0xed, 0xeb, 0x0f, 0x50, 0x25, 0x30,
+ 0x00, 0x40, 0x41, 0x10,
+ 0x10, 0x00, 0x00, 0xfc, 0x30, 0x35, 0x0f, 0x0d, 0x5c, 0x30, 0x10, 0x00,
+ 0xed, 0x0f, 0x77, 0x60,
+ 0xfd, 0x0e, 0x30, 0x10, 0x00, 0x00, 0x30, 0x08, 0xef, 0xe0, 0x42, 0x22,
+ 0xab, 0xe0, 0x00, 0x10,
+ 0x0c, 0xb0, 0x01, 0x11, 0x30, 0x1e, 0x00, 0xd2, 0xae, 0xf0, 0x26, 0x40,
+ 0xeb, 0xdf, 0xe0, 0x00,
+ 0xf1, 0x05, 0xdf, 0xbe, 0x00, 0x34, 0x02, 0xc1, 0xcf, 0xde, 0x00, 0xf0,
+ 0x32, 0x62, 0xfc, 0xee,
+ 0x37, 0x00, 0x8f, 0x0d, 0x01, 0x10, 0x0e, 0x01, 0xf2, 0x00, 0x2f, 0x24,
+ 0x00, 0xec, 0x00, 0x10,
+ 0x04, 0x0e, 0xd9, 0x21, 0x75, 0x70, 0x4b, 0xc0, 0x01, 0x12, 0x11, 0x0f,
+ 0xef, 0x00, 0x01, 0x0f,
+ 0xfe, 0x01, 0x00, 0x10, 0x5f, 0x20, 0x1e, 0x1e, 0x14, 0x24, 0xca, 0xee,
+ 0x20, 0x21, 0xf0, 0xc0,
+ 0xd0, 0xab, 0xfe, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x00, 0x04, 0xf1, 0xcc,
+ 0xda, 0x00, 0xe0, 0xe1,
+ 0x00, 0xcf, 0xc0, 0x05, 0x90, 0xed, 0x04, 0x33, 0xde, 0xde, 0x24, 0x42,
+ 0xeb, 0xef, 0x21, 0x25,
+ 0x00, 0xbe, 0xff, 0x00, 0x01, 0xd0, 0x54, 0x34, 0xef, 0xce, 0x20, 0x40,
+ 0x51, 0xf0, 0xd0, 0x10,
+ 0x61, 0x1d, 0x0c, 0x10, 0x34, 0x31, 0x0e, 0xfa, 0xe0, 0x34, 0x52, 0xfe,
+ 0xce, 0x01, 0xf5, 0xef,
+ 0xec, 0x30, 0x75, 0x60, 0x00, 0x11, 0xf0, 0x00, 0x13, 0x23, 0x05, 0x05,
+ 0x3b, 0x00, 0x55, 0x00,
+ 0x17, 0x33, 0xe1, 0x17, 0x09, 0x31, 0x61, 0x15, 0x45, 0x42, 0x20, 0x4d,
+ 0x00, 0xce, 0xd9, 0x1f,
+ 0x40, 0x57, 0x00, 0xef, 0xbf, 0x02, 0x23, 0x0b, 0xde, 0x11, 0x51, 0x00,
+ 0xeb, 0x00, 0x40, 0x03,
+ 0xc0, 0xdf, 0x00, 0x04, 0x42, 0x12, 0x12, 0x04, 0xd2, 0xd0, 0xed, 0x42,
+ 0x74, 0x00, 0xf1, 0xd4,
+ 0x01, 0x5d, 0x1d, 0x12, 0x05, 0xe0, 0x10, 0x22, 0x17, 0x13, 0xe0, 0xeb,
+ 0x2f, 0x70, 0x71, 0x03,
+ 0x10, 0xfc, 0xe0, 0x06, 0x31, 0x10, 0x0f, 0xbe, 0x0f, 0x32, 0x04, 0x12,
+ 0x00, 0x0f, 0x42, 0x26,
+ 0x00, 0xbb, 0x10, 0x40, 0x11, 0x12, 0x10, 0x10, 0xf0, 0xce, 0xff, 0x00,
+ 0x34, 0x03, 0x00, 0xfe,
+ 0xb9, 0xe0, 0x1f, 0x10, 0x01, 0x80, 0xdf, 0x1c, 0x1d, 0xfc, 0x02, 0x35,
+ 0x10, 0x60, 0xf1, 0x8b,
+ 0xfe, 0x00, 0x05, 0xf0, 0x0e, 0x00, 0xf2, 0xe1, 0x0f, 0x0e, 0x2f, 0x42,
+ 0xd2, 0xde, 0x21, 0x40,
+ 0xf8, 0xff, 0x34, 0x32, 0xbf, 0xdc, 0xd2, 0xd1, 0x01, 0x0f, 0x0f, 0x73,
+ 0x50, 0xe9, 0xf1, 0x24,
+ 0x0f, 0xed, 0xf0, 0x04, 0x10, 0x30, 0xef, 0x90, 0xff, 0x0e, 0x0d, 0x0c,
+ 0xef, 0x30, 0x10, 0xc0,
+ 0xdd, 0x0b, 0x22, 0x31, 0x2f, 0x70, 0x0e, 0x0b, 0x20, 0x30, 0x60, 0x2b,
+ 0x0f, 0x0a, 0xdd, 0x1e,
+ 0x42, 0xd2, 0x9e, 0xee, 0x0d, 0x52, 0x00, 0xfd, 0x0e, 0x0a, 0xee, 0xf0,
+ 0x02, 0x3d, 0x08, 0xef,
+ 0xf0, 0x04, 0xee, 0x8b, 0xdf, 0x01, 0x01, 0xd0, 0xef, 0x3e, 0x30, 0x00,
+ 0xe2, 0xae, 0xeb, 0x1e,
+ 0x1e, 0x01, 0x07, 0x03, 0x0e, 0xcb, 0x01, 0x41, 0x10, 0x00, 0xf3, 0x01,
+ 0xef, 0x01, 0xf1, 0xff,
+ 0xdf, 0x02, 0x67, 0xe0, 0xef, 0x72, 0x54, 0x03, 0xfe, 0xce, 0x01, 0x02,
+ 0x00, 0x04, 0x13, 0xc0,
+ 0xcd, 0x12, 0x22, 0x2e, 0x20, 0x16, 0x45, 0x12, 0xbf, 0xeb, 0x10, 0x72,
+ 0x12, 0xfe, 0xcb, 0x00,
+ 0x02, 0x51, 0x0f, 0x0f, 0xf0, 0x00, 0xfc, 0x00, 0x22, 0x2f, 0x40, 0x21,
+ 0x3e, 0x1e, 0x20, 0x0c,
+ 0xdb, 0xd2, 0xd3, 0x8d, 0xfe, 0x15, 0x33, 0xfe, 0xee, 0x06, 0x12, 0x0f,
+ 0x4f, 0x44, 0xf0, 0xf0,
+ 0x01, 0x37, 0x20, 0x20, 0x5e, 0x0f, 0xc0, 0x03, 0x77, 0x10, 0x00, 0xce,
+ 0xdf, 0xf1, 0x03, 0x20,
+ 0x30, 0x20, 0xe1, 0xcd, 0xe3, 0x07, 0x02, 0x20, 0x0e, 0xdb, 0x20, 0x23,
+ 0xd3, 0x80, 0xfd, 0x2e,
+ 0x70, 0x34, 0x02, 0x03, 0xee, 0xea, 0x00, 0x41, 0x10, 0xec, 0x00, 0x26,
+ 0x30, 0xfd, 0xc0, 0x20,
+ 0x31, 0xef, 0xaa, 0x00, 0x20, 0xc0, 0xbe, 0x0f, 0xe0, 0x0f, 0xff, 0x00,
+ 0x02, 0x00, 0xe0, 0x1f,
+ 0x5f, 0x00, 0xbc, 0xda, 0x0f, 0xf2, 0xd2, 0xdd, 0xc9, 0x00, 0x41, 0x12,
+ 0x00, 0xce, 0xf0, 0x46,
+ 0x21, 0xde, 0x9f, 0x00, 0x20, 0x22, 0x01, 0xdf, 0xef, 0xfe, 0xd1, 0x02,
+ 0x50, 0x00, 0x17, 0xe7,
+ 0xb0, 0xec, 0xf0, 0xe0, 0x0e, 0x70, 0x02, 0x00, 0xed, 0x00, 0xd2, 0xef,
+ 0x1b, 0x1f, 0x00, 0x05,
+ 0x10, 0x10, 0x2c, 0xcf, 0x10, 0x70, 0x01, 0x21, 0x34, 0x00, 0xfa, 0xff,
+ 0x0e, 0x2f, 0x60, 0x21,
+ 0x2e, 0xff, 0x0f, 0x00, 0xcf, 0xd9, 0x30, 0x70, 0xe0, 0xbc, 0x00, 0x01,
+ 0x0e, 0x08, 0xf0, 0x00,
+ 0x64, 0x0f, 0xdf, 0xf0, 0x00, 0x2e, 0xfe, 0xe3, 0x17, 0x00, 0xbc, 0x00,
+ 0x00, 0xe1, 0xf1, 0x0f,
+ 0x40, 0x42, 0x0f, 0x1e, 0x31, 0xe5, 0xe2, 0x22, 0x0e, 0xdd, 0x22, 0x76,
+ 0x70, 0x00, 0xf0, 0x32,
+ 0x22, 0x35, 0x00, 0xfc, 0xf0, 0x24, 0x21, 0x01, 0x00, 0x00, 0x72, 0x33,
+ 0x01, 0xf0, 0xfe, 0x0e,
+ 0x0f, 0x33, 0x44, 0xdc, 0x1e, 0x7f, 0x1e, 0x15, 0x02, 0xdb, 0x0f, 0x11,
+ 0x20, 0x1d, 0x50, 0x01,
+ 0x0f, 0xbe, 0x07, 0x02, 0x0f, 0x5c, 0x30, 0x25, 0xe0, 0xcf, 0x1e, 0x0f,
+ 0xc0, 0x00, 0x31, 0x2f,
+ 0xe8, 0xb0, 0x00, 0x01, 0xd2, 0xd1, 0x00, 0xc1, 0xd0, 0x32, 0x33, 0x80,
+ 0xde, 0xc0, 0xf5, 0xf0,
+ 0xeb, 0x0d, 0xf0, 0xf7, 0x02, 0xd0, 0xef, 0x01, 0x52, 0xf0, 0xdf, 0xf1,
+ 0x02, 0x1e, 0xdb, 0x01,
+ 0x75, 0x00, 0xbb, 0xff, 0x00, 0x23, 0x11, 0xff, 0xcd, 0x00, 0x77, 0x41,
+ 0xff, 0x00, 0x00, 0x0e,
+ 0x2e, 0x20, 0x01, 0xf0, 0x2e, 0x40, 0xf7, 0xc0, 0xbe, 0x0d, 0xf0, 0x20,
+ 0x71, 0x11, 0x0e, 0xd8,
+ 0x00, 0x41, 0x23, 0x0f, 0xfc, 0xf0, 0xfd, 0xe0, 0xee, 0x10, 0x30, 0xee,
+ 0xbd, 0x12, 0x77, 0x10,
+ 0xfd, 0xdf, 0xef, 0x00, 0x11, 0x2e, 0x0d, 0x03, 0x17, 0xd0, 0xed, 0x0e,
+ 0x5f, 0x22, 0x02, 0x01,
+ 0xef, 0xfc, 0xfe, 0x44, 0x27, 0xc1, 0x90, 0xf0, 0xe1, 0xe0, 0x23, 0x41,
+ 0xed, 0xe0, 0x02, 0x74,
+ 0x13, 0x10, 0xfb, 0x0c, 0x11, 0x12, 0x00, 0x30, 0x20, 0x0f, 0xce, 0xc0,
+ 0xc0, 0x00, 0x21, 0x00,
+ 0x07, 0x77, 0x01, 0x00, 0x00, 0x1e, 0x21, 0x34, 0x00, 0xde, 0xee, 0x43,
+ 0x66, 0x20, 0x0f, 0x0e,
+ 0x02, 0x47, 0x01, 0xff, 0xdd, 0xe0, 0xf3, 0xb1, 0xcc, 0xf0, 0x25, 0x32,
+ 0x20, 0x0d, 0xf0, 0xc1,
+ 0xe1, 0xe2, 0xf2, 0xe1, 0x9e, 0xfb, 0x00, 0x27, 0x21, 0xdc, 0x00, 0x40,
+ 0x11, 0x01, 0xc0, 0xd0,
+ 0xb0, 0x00, 0x12, 0x04, 0xd2, 0x20, 0x5d, 0xef, 0xc0, 0xf1, 0x17, 0x40,
+ 0xfe, 0x10, 0x70, 0x0f,
+ 0xec, 0xee, 0x12, 0x57, 0x12, 0xfc, 0xff, 0x0f, 0x0f, 0x1e, 0x20, 0x03,
+ 0x10, 0x2d, 0x1e, 0x12,
+ 0x02, 0x0b, 0x7c, 0x30, 0x0e, 0x00, 0x40, 0x43, 0x0c, 0x0b, 0x20, 0x46,
+ 0x02, 0x00, 0x1b, 0x00,
+ 0x10, 0x74, 0x00, 0xed, 0xd0, 0xf1, 0x0f, 0x0e, 0x10, 0x62, 0x00, 0xdb,
+ 0xd0, 0x1e, 0x20, 0x2c,
+ 0x3f, 0x30, 0xa0, 0xcc, 0xfd, 0x10, 0x05, 0xd0, 0xdf, 0x0f, 0x31, 0xd0,
+ 0xad, 0xfd, 0xcf, 0xf0,
+ 0xf2, 0x10, 0x2c, 0xee, 0xee, 0xd0, 0xf7, 0x01, 0x3e, 0x4d, 0x62, 0x02,
+ 0xb2, 0xd0, 0xe5, 0x06,
+ 0xd0, 0xcb, 0x1e, 0x71, 0x01, 0xe0, 0x0f, 0x11, 0x16, 0x10, 0x00, 0x01,
+ 0x52, 0xfe, 0xfe, 0x02,
+ 0xd2, 0xbe, 0x0e, 0x02, 0x41, 0x0d, 0x00, 0x04, 0xf4, 0xc0, 0x06, 0x34,
+ 0x70, 0x1e, 0x00, 0xf0,
+ 0x15, 0x00, 0xfc, 0xff, 0x01, 0xf0, 0x10, 0x60, 0x0f, 0xd0, 0xf2, 0x0e,
+ 0x0f, 0x0f, 0x00, 0x17,
+ 0x57, 0xf0, 0xcd, 0x0e, 0xff, 0xfe, 0xf0, 0x00, 0x11, 0x2f, 0xfc, 0xbf,
+ 0xe0, 0xd3, 0xe1, 0x30,
+ 0x6d, 0xfb, 0xd0, 0xef, 0x00, 0x10, 0x10, 0xad, 0x98, 0xe0, 0x07, 0x00,
+ 0xe0, 0xcf, 0x00, 0x00,
+ 0x02, 0x31, 0x32, 0x11, 0x51, 0x21, 0x02, 0x27, 0x23, 0xef, 0x9d, 0x02,
+ 0x33, 0xf0, 0x00, 0x42,
+ 0x31, 0x09, 0xf0, 0x03, 0x02, 0xb0, 0xf0, 0x01, 0x01, 0x12, 0x31, 0x00,
+ 0x21, 0x10, 0x0b, 0x64,
+ 0x47, 0x00, 0x6f, 0x2f, 0x23, 0x02, 0xfe, 0xfc, 0x01, 0x01, 0xef, 0xa0,
+ 0xf2, 0xe0, 0x1a, 0x60,
+ 0x0d, 0xfa, 0xee, 0x20, 0x21, 0x31, 0x54, 0x00, 0xea, 0xff, 0x1f, 0xde,
+ 0xc0, 0x21, 0x33, 0x0f,
+ 0xcf, 0x00, 0xee, 0xff, 0xed, 0x50, 0x55, 0x01, 0xc0, 0xff, 0x0b, 0xce,
+ 0xf0, 0xe1, 0x00, 0x1f,
+ 0x1e, 0xe1, 0xe7, 0x01, 0x30, 0x20, 0xf3, 0xc3, 0x0f, 0x0f, 0xe4, 0x83,
+ 0xdf, 0x02, 0x13, 0xfe,
+ 0xb8, 0xf0, 0x06, 0xf1, 0xee, 0xef, 0xe0, 0x01, 0x14, 0x40, 0x00, 0x8c,
+ 0xe0, 0x01, 0x11, 0x10,
+ 0xf0, 0xea, 0x0e, 0x0e, 0xf2, 0xd2, 0xcb, 0xdd, 0x0f, 0x20, 0x7f, 0x0b,
+ 0x2f, 0x0f, 0x0e, 0x60,
+ 0x13, 0x0f, 0xf8, 0x2f, 0x60, 0x00, 0xef, 0x0f, 0xf0, 0xce, 0xec, 0xfd,
+ 0x10, 0x12, 0x22, 0x42,
+ 0x03, 0xfe, 0xf8, 0x0d, 0x10, 0x74, 0x22, 0xf0, 0xdf, 0xcf, 0xff, 0x00,
+ 0x54, 0x33, 0x0d, 0xdc,
+ 0xe0, 0x05, 0xf2, 0xf0, 0xca, 0x1f, 0x71, 0x14, 0xf0, 0xcd, 0x00, 0x30,
+ 0x30, 0x01, 0x00, 0x12,
+ 0x13, 0x0f, 0x0f, 0x44, 0x11, 0x00, 0xf1, 0xd0, 0xe6, 0x13, 0x3f, 0xee,
+ 0xf2, 0x67, 0x43, 0x5e,
+ 0x3d, 0x3e, 0x21, 0x75, 0x10, 0xfd, 0xef, 0x12, 0x02, 0xfe, 0xee, 0x02,
+ 0x42, 0xfc, 0xfa, 0x32,
+ 0x65, 0xf0, 0xae, 0x0f, 0xff, 0x0f, 0x1e, 0x30, 0x23, 0x0e, 0xea, 0xcf,
+ 0x03, 0x23, 0x10, 0x0c,
+ 0xff, 0xe0, 0xf0, 0x12, 0x54, 0x11, 0xf1, 0xed, 0x9d, 0xf3, 0x07, 0x47,
+ 0x20, 0xc0, 0xcf, 0xf1,
+ 0x14, 0x21, 0x00, 0xd1, 0xc0, 0x44, 0x34, 0x01, 0xbf, 0xfe, 0x0f, 0x22,
+ 0x44, 0x13, 0x00, 0xfb,
+ 0xde, 0x00, 0x16, 0x10, 0xf0, 0xae, 0xf1, 0xf2, 0xc0, 0x00, 0xec, 0x0f,
+ 0x11, 0x64, 0x30, 0x3f,
+ 0x00, 0xc0, 0x22, 0x77, 0x10, 0x0c, 0x1f, 0x30, 0x23, 0x10, 0xee, 0xec,
+ 0xef, 0x0f, 0x40, 0x51,
+ 0x02, 0x0e, 0xfc, 0xfe, 0x0f, 0x34, 0x53, 0xed, 0xfc, 0x11, 0x21, 0x20,
+ 0xef, 0xca, 0xf0, 0x12,
+ 0x05, 0xbe, 0xdd, 0x0d, 0x50, 0xe2, 0xd1, 0xd0, 0x13, 0x30, 0x0c, 0x21,
+ 0x17, 0xd1, 0x9d, 0x0e,
+ 0x04, 0x10, 0x0b, 0x40, 0x55, 0x01, 0x00, 0x0e, 0x20, 0x13, 0xf0, 0xd0,
+ 0x00, 0x34, 0xf0, 0xd0,
+ 0x70, 0x3f, 0x2e, 0x01, 0x03, 0xe5, 0xf0, 0x0d, 0x22, 0x01, 0x80, 0xf0,
+ 0x04, 0xde, 0xcd, 0x07,
+ 0x74, 0x1f, 0x2e, 0x01, 0xc0, 0xe0, 0x00, 0x53, 0x03, 0xf1, 0x10, 0x29,
+ 0xfc, 0xd0, 0x00, 0x33,
+ 0x1e, 0xeb, 0xa0, 0x01, 0xf0, 0x0b, 0x5f, 0x20, 0x10, 0xd2, 0x03, 0x04,
+ 0x0f, 0xab, 0xe0, 0xe0,
+ 0xb0, 0xef, 0xfd, 0xff, 0xf2, 0x02, 0x3e, 0xfc, 0x8d, 0xed, 0x0e, 0x24,
+ 0x1e, 0xc8, 0xe1, 0x17,
+ 0x10, 0xee, 0xbf, 0xff, 0xef, 0x20, 0x40, 0x00, 0xee, 0xe0, 0xff, 0xfc,
+ 0x2f, 0x30, 0x12, 0x30,
+ 0x40, 0x0d, 0x10, 0x21, 0x2e, 0xd8, 0x8b, 0xee, 0x20, 0x71, 0x00, 0x0f,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x52, 0x12, 0x0c, 0x0a, 0x2f, 0x3f, 0x0f, 0x00, 0x0f, 0x20,
+ 0x12, 0xac, 0xed, 0x11,
+ 0x10, 0x1e, 0x61, 0x02, 0x08, 0xde, 0xd0, 0xf0, 0x05, 0x20, 0x1e, 0x4d,
+ 0x4f, 0x25, 0x36, 0xf0,
+ 0xa0, 0xe0, 0x0d, 0x10, 0x64, 0x02, 0xdf, 0xff, 0x00, 0x11, 0x14, 0xe1,
+ 0xe2, 0x03, 0x30, 0x47,
+ 0xc0, 0xcf, 0x10, 0x56, 0x00, 0x00, 0xfe, 0xf0, 0x02, 0x46, 0x30, 0xfe,
+ 0xd1, 0x01, 0x40, 0x11,
+ 0x32, 0x33, 0x0d, 0xf0, 0x50, 0x3f, 0xda, 0x00, 0x71, 0x03, 0xe0, 0xc0,
+ 0x03, 0x20, 0x3a, 0x3f,
+ 0x20, 0x01, 0x05, 0x61, 0x42, 0x31, 0x0f, 0x0f, 0x10, 0x76, 0x11, 0xef,
+ 0xdf, 0x10, 0x13, 0x01,
+ 0xe2, 0xf0, 0xc0, 0xdc, 0xe1, 0xde, 0xfb, 0x2f, 0x30, 0xe2, 0x81, 0xee,
+ 0xfe, 0xe3, 0x04, 0xba,
+ 0xee, 0xd0, 0xd0, 0xad, 0x0c, 0xec, 0xfe, 0x02, 0x17, 0x02, 0x00, 0x20,
+ 0x3f, 0x1d, 0x10, 0xd4,
+ 0x81, 0xe1, 0x13, 0x2f, 0x0a, 0xef, 0x20, 0x23, 0xc4, 0xc0, 0xee, 0x20,
+ 0x21, 0xe4, 0xe1, 0x0f,
+ 0xed, 0xa0, 0xd1, 0x1d, 0x7c, 0x10, 0x0e, 0x1f, 0x24, 0x0e, 0x00, 0x37,
+ 0x15, 0xcb, 0xee, 0x20,
+ 0x43, 0xe0, 0xcf, 0x09, 0x10, 0x70, 0x33, 0x2f, 0x1e, 0x10, 0x01, 0xf0,
+ 0xf2, 0x21, 0x5f, 0x3b,
+ 0x51, 0x16, 0xde, 0xdc, 0x1f, 0x50, 0x13, 0x1f, 0x1f, 0x00, 0xdd, 0x00,
+ 0x01, 0xbd, 0xe0, 0x1e,
+ 0x1d, 0x01, 0xf2, 0xf8, 0xdd, 0xef, 0xe1, 0x44, 0x50, 0xba, 0xdf, 0x00,
+ 0x01, 0x00, 0x0f, 0xcf,
+ 0xd0, 0xf0, 0x00, 0x10, 0xaf, 0xdf, 0x00, 0x22, 0x0d, 0xbe, 0xe0, 0xe4,
+ 0xe5, 0x13, 0x22, 0x00,
+ 0xdf, 0xbe, 0x00, 0x32, 0x47, 0x03, 0xf0, 0xb0, 0xe1, 0xff, 0xe2, 0xc7,
+ 0xd0, 0x10, 0x63, 0x07,
+ 0x04, 0xdf, 0xed, 0xfe, 0x50, 0x77, 0x00, 0xf0, 0xff, 0x20, 0x22, 0x00,
+ 0x10, 0x11, 0xff, 0xee,
+ 0x47, 0x33, 0xcf, 0xdc, 0x10, 0x71, 0x12, 0x10, 0x0f, 0x0c, 0xee, 0x20,
+ 0x53, 0x01, 0xed, 0x1c,
+ 0x40, 0x12, 0xfd, 0x0d, 0x10, 0x40, 0xff, 0xec, 0xfb, 0xdb, 0xde, 0x00,
+ 0x43, 0x41, 0xdc, 0xac,
+ 0x00, 0xf1, 0x14, 0x12, 0x10, 0x30, 0x1a, 0xf0, 0xce, 0xc0, 0xff, 0x00,
+ 0xef, 0x12, 0x66, 0x02,
+ 0xc1, 0x00, 0x40, 0x30, 0x25, 0xe3, 0xd1, 0xe1, 0xc0, 0xe0, 0x0d, 0x40,
+ 0x04, 0xd1, 0x20, 0x74,
+ 0x44, 0x00, 0xde, 0x04, 0x04, 0x00, 0x0c, 0xe0, 0x9e, 0xe0, 0x25, 0x60,
+ 0x0d, 0xe0, 0x14, 0x13,
+ 0x0e, 0x0e, 0x00, 0x00, 0x20, 0x1e, 0x0c, 0xfc, 0x00, 0x30, 0x50, 0x6f,
+ 0x08, 0x0e, 0xde, 0xdf,
+ 0xef, 0xf0, 0x22, 0x4f, 0xfa, 0xd1, 0x26, 0x50, 0x00, 0xed, 0xf1, 0x21,
+ 0x10, 0x0f, 0xa0, 0xfe,
+ 0x0e, 0x43, 0x13, 0xed, 0xcc, 0x0e, 0xfd, 0xfb, 0xd0, 0xc6, 0xd1, 0xbd,
+ 0xdd, 0x21, 0x21, 0xbf,
+ 0xdd, 0xf2, 0x07, 0xf4, 0xd0, 0x10, 0x40, 0x00, 0xb0, 0x10, 0x51, 0x02,
+ 0x0d, 0xe0, 0x02, 0x17,
+ 0xd0, 0xc0, 0xd0, 0xe0, 0x00, 0x01, 0xd2, 0x8e, 0x0b, 0x0c, 0x70, 0x27,
+ 0x01, 0xe1, 0x00, 0xfd,
+ 0x11, 0x41, 0x00, 0xfe, 0x01, 0xf0, 0xfe, 0x0a, 0x3e, 0x4d, 0x4e, 0x00,
+ 0x01, 0xe0, 0x1d, 0x3e,
+ 0x02, 0xf1, 0xcb, 0x0f, 0x2e, 0x3b, 0x9a, 0xde, 0x01, 0x64, 0x32, 0x1f,
+ 0x1f, 0x10, 0x02, 0xd2,
+ 0x17, 0x13, 0x0e, 0xdc, 0x00, 0x20, 0x01, 0x42, 0x54, 0x02, 0xdf, 0xef,
+ 0x02, 0x77, 0x31, 0xe0,
+ 0xef, 0xf0, 0xe0, 0x21, 0x63, 0x03, 0xff, 0x10, 0x57, 0x01, 0x01, 0x10,
+ 0x00, 0x03, 0xf2, 0x00,
+ 0x63, 0x14, 0x01, 0xd1, 0x15, 0x30, 0x20, 0x40, 0x1e, 0x20, 0x71, 0x10,
+ 0xf0, 0x05, 0x46, 0x42,
+ 0x00, 0xdd, 0xef, 0x0f, 0xe0, 0xd0, 0x10, 0x63, 0x2b, 0x0d, 0xe0, 0x02,
+ 0x1e, 0xfb, 0xff, 0xfb,
+ 0x00, 0x0f, 0xfd, 0x4c, 0x1c, 0x2f, 0xf0, 0xd2, 0xee, 0xf9, 0x4f, 0x0f,
+ 0x8e, 0xe3, 0x04, 0x10,
+ 0xdf, 0x8d, 0xe2, 0xe2, 0xf4, 0xd0, 0xf1, 0xfd, 0x0c, 0xf1, 0xe2, 0xdd,
+ 0x0b, 0x53, 0xf3, 0x80,
+ 0xee, 0x01, 0xf0, 0xfa, 0x10, 0x11, 0x13, 0x00, 0xef, 0xdb, 0x9d, 0xfe,
+ 0x21, 0x43, 0xed, 0xb8,
+ 0x0e, 0x0f, 0x00, 0x0f, 0x0f, 0x40, 0x13, 0x00, 0xdb, 0x0f, 0x0f, 0xf0,
+ 0x11, 0x60, 0x1f, 0xf8,
+ 0xd0, 0x01, 0x14, 0x6e, 0x2f, 0x0f, 0xf0, 0x10, 0x2d, 0x1f, 0x52, 0x01,
+ 0xe0, 0xfe, 0x1c, 0x7e,
+ 0x1e, 0xdb, 0xe0, 0x07, 0x31, 0x20, 0x11, 0x1e, 0x0c, 0xef, 0xb0, 0xf2,
+ 0x17, 0x32, 0xfd, 0xed,
+ 0x10, 0x01, 0xb0, 0x0d, 0x73, 0x13, 0xef, 0xce, 0x00, 0x02, 0xe0, 0xf0,
+ 0x07, 0xf1, 0x8e, 0xff,
+ 0x04, 0x44, 0x1e, 0x0d, 0x15, 0x23, 0x03, 0x33, 0x20, 0x0b, 0x40, 0x43,
+ 0x06, 0x00, 0xdd, 0x00,
+ 0x21, 0xf2, 0xc0, 0xcf, 0xce, 0x12, 0x76, 0x0f, 0xee, 0xe0, 0x03, 0x12,
+ 0x23, 0x00, 0xea, 0xde,
+ 0x11, 0x44, 0x1f, 0x00, 0x0f, 0x0f, 0x00, 0x44, 0x13, 0x01, 0x21, 0x53,
+ 0x00, 0x03, 0xf7, 0x22,
+ 0xb0, 0xae, 0x00, 0x12, 0x41, 0xf3, 0xf2, 0x0f, 0xfa, 0xff, 0xce, 0xee,
+ 0x26, 0x45, 0x00, 0x0e,
+ 0x00, 0xc0, 0x82, 0xe2, 0xf1, 0x0d, 0xf1, 0xf6, 0xd0, 0xd0, 0x00, 0xe3,
+ 0xc0, 0xed, 0x1d, 0x70,
+ 0x23, 0x00, 0xd8, 0xfa, 0xe0, 0x02, 0x71, 0x00, 0x0e, 0xff, 0xf2, 0x00,
+ 0x3e, 0x1e, 0x11, 0x02,
+ 0x24, 0x12, 0x00, 0xd9, 0x1f, 0x70, 0x35, 0xef, 0x0c, 0x40, 0x10, 0x00,
+ 0x4d, 0x20, 0x13, 0x01,
+ 0xf0, 0xdd, 0xfa, 0xf0, 0xe0, 0x23, 0x74, 0x1e, 0xec, 0xe0, 0x05, 0x05,
+ 0x2a, 0x00, 0x38, 0x00,
+ 0xa0, 0x0f, 0x33, 0xf1, 0x8d, 0x0f, 0xf2, 0xf1, 0x4e, 0x27, 0xb2, 0xea,
+ 0xdd, 0x90, 0xff, 0x1f,
+ 0x4e, 0x1e, 0x2c, 0xee, 0xdd, 0xc1, 0xf1, 0xe9, 0x0e, 0x10, 0xf2, 0x04,
+ 0xd0, 0x8c, 0x9e, 0x00,
+ 0x20, 0x0e, 0x00, 0xb0, 0xe0, 0x0f, 0xfb, 0x0d, 0xee, 0x00, 0x04, 0x04,
+ 0xe0, 0xdb, 0xee, 0xd0,
+ 0x02, 0x32, 0x00, 0xde, 0xe0, 0x15, 0x50, 0x1e, 0x3f, 0xdf, 0x8d, 0x02,
+ 0x44, 0x0e, 0xdb, 0xe3,
+ 0x02, 0x01, 0x00, 0x0e, 0x6c, 0x3d, 0x0b, 0x20, 0x47, 0x11, 0x10, 0xf0,
+ 0xf0, 0x10, 0xee, 0xb0,
+ 0x15, 0x52, 0x00, 0xd0, 0x30, 0x70, 0x10, 0xe0, 0xe0, 0x22, 0x1f, 0x0b,
+ 0xec, 0x0c, 0x00, 0xff,
+ 0xdd, 0xde, 0xe0, 0x80, 0xdc, 0x1f, 0x5c, 0xf9, 0xcf, 0x01, 0x12, 0x0f,
+ 0xfc, 0x21, 0x00, 0x0f,
+ 0x50, 0x14, 0xfc, 0xcd, 0x13, 0x66, 0x10, 0x00, 0xdd, 0xee, 0xff, 0xf2,
+ 0x02, 0x00, 0x00, 0x23,
+ 0x41, 0x00, 0xf0, 0xd7, 0xf5, 0x0f, 0x0e, 0x2e, 0x7e, 0x10, 0x15, 0x14,
+ 0x10, 0x20, 0xdf, 0xd2,
+ 0x33, 0x52, 0x24, 0x01, 0xf2, 0x00, 0xe1, 0x54, 0x74, 0x40, 0x01, 0xf0,
+ 0x01, 0x17, 0x43, 0x0d,
+ 0x0f, 0x01, 0x47, 0x60, 0x22, 0x22, 0x02, 0xf1, 0x32, 0x45, 0x21, 0x10,
+ 0x21, 0x24, 0x12, 0xdf,
+ 0xee, 0x21, 0x70, 0x20, 0x2c, 0x02, 0x00, 0xec, 0xe9, 0x00, 0x31, 0xd0,
+ 0xbc, 0x00, 0x11, 0x52,
+ 0x0f, 0xdc, 0xc0, 0xd0, 0xfb, 0x10, 0x12, 0x11, 0x1f, 0xac, 0xe0, 0x05,
+ 0xe0, 0x0f, 0x20, 0x30,
+ 0x3e, 0x42, 0x04, 0x8f, 0xfd, 0x12, 0x20, 0x1f, 0x12, 0x07, 0xe4, 0xbf,
+ 0x0f, 0x14, 0xd2, 0x90,
+ 0xf0, 0x03, 0xdf, 0xfd, 0x10, 0x11, 0x16, 0x01, 0x10, 0xe1, 0x00, 0x73,
+ 0x42, 0xdf, 0x01, 0x46,
+ 0x11, 0x00, 0xd1, 0xae, 0x0d, 0xe0, 0xde, 0x0e, 0x54, 0x10, 0x08, 0x00,
+ 0x20, 0x02, 0xf0, 0x2f,
+ 0x71, 0x02, 0x0e, 0xfb, 0x0f, 0xef, 0x30, 0x50, 0x0d, 0xfa, 0xff, 0x0f,
+ 0x01, 0xf0, 0xcb, 0x0e,
+ 0x3d, 0x00, 0xd1, 0xf1, 0x67, 0x21, 0xee, 0xed, 0x20, 0x20, 0xfe, 0xdd,
+ 0xfd, 0xf1, 0xe6, 0xe0,
+ 0x90, 0xdd, 0x04, 0x44, 0x00, 0xde, 0xc0, 0x06, 0x51, 0xee, 0xec, 0x20,
+ 0x40, 0x02, 0x02, 0xf1,
+ 0xbc, 0xde, 0xf1, 0x13, 0x10, 0x0a, 0xef, 0x02, 0x04, 0xe0, 0xae, 0x25,
+ 0x62, 0x00, 0x0c, 0xe0,
+ 0xf0, 0x00, 0xdf, 0xfd, 0x61, 0x32, 0x0e, 0x0e, 0xfe, 0x2e, 0x2e, 0x09,
+ 0xfd, 0x2e, 0x7e, 0x0f,
+ 0xfa, 0xed, 0x00, 0x60, 0x0c, 0xef, 0x20, 0x2d, 0xfb, 0xcf, 0xe0, 0xf0,
+ 0x51, 0x2f, 0xe8, 0xae,
+ 0xfd, 0x11, 0x21, 0x30, 0x0e, 0x00, 0xe0, 0xe3, 0x0f, 0x00, 0x22, 0xdc,
+ 0x88, 0xe0, 0xf4, 0xc0,
+ 0xca, 0x10, 0x23, 0xe0, 0xdd, 0x21, 0x23, 0xb0, 0xee, 0x20, 0x33, 0x02,
+ 0xf0, 0x03, 0xf4, 0x9e,
+ 0xeb, 0x04, 0x06, 0x10, 0x00, 0xb1, 0x01, 0xe0, 0x02, 0x52, 0x11, 0x2f,
+ 0x20, 0xf0, 0xee, 0x02,
+ 0x07, 0x31, 0x20, 0x0f, 0x32, 0x73, 0x0f, 0x0e, 0x20, 0x02, 0x33, 0x33,
+ 0xfb, 0xdc, 0x3e, 0x2e,
+ 0x41, 0x75, 0x5e, 0x1b, 0x00, 0x20, 0x00, 0x00, 0x30, 0x0e, 0x0d, 0x50,
+ 0x10, 0xd8, 0xba, 0x00,
+ 0x54, 0x00, 0xff, 0xef, 0xff, 0x10, 0x73, 0x12, 0x0f, 0xdc, 0x00, 0x02,
+ 0x24, 0x0f, 0x2e, 0x0f,
+ 0xdf, 0xd3, 0xc3, 0xef, 0x1d, 0xe1, 0x90, 0x03, 0x27, 0x33, 0xe0, 0xde,
+ 0xc0, 0xe0, 0xf0, 0x05,
+ 0x40, 0x00, 0xed, 0xc0, 0xc0, 0xf2, 0x03, 0x21, 0x0c, 0xfc, 0x04, 0x16,
+ 0xe0, 0xd0, 0x53, 0x72,
+ 0x20, 0x0d, 0x10, 0x05, 0xe3, 0x02, 0x32, 0xe0, 0x99, 0x00, 0x00, 0x34,
+ 0x10, 0xdd, 0x00, 0x03,
+ 0x46, 0x20, 0x1d, 0x3d, 0x0f, 0xce, 0x00, 0x2e, 0xbf, 0xce, 0x00, 0xef,
+ 0xa8, 0x0e, 0x0f, 0x32,
+ 0xf1, 0xed, 0x0c, 0x1f, 0x20, 0x05, 0xb0, 0xdf, 0xed, 0xdf, 0x00, 0x3d,
+ 0x2e, 0x02, 0x11, 0xba,
+ 0xc0, 0xf6, 0xd0, 0xa0, 0xcf, 0xef, 0x0f, 0xc0, 0x32, 0x42, 0xb1, 0xff,
+ 0x3f, 0x03, 0x04, 0x4f,
+ 0x0e, 0xce, 0x32, 0x07, 0x00, 0x10, 0x0b, 0xfd, 0xcd, 0xef, 0x22, 0x21,
+ 0xeb, 0xde, 0xe0, 0x01,
+ 0xfe, 0x1e, 0x6d, 0xe1, 0x37, 0x34, 0xaf, 0x1c, 0x1f, 0xe0, 0x61, 0x30,
+ 0xbe, 0xf0, 0x24, 0x41,
+ 0x20, 0xff, 0xc0, 0x10, 0x23, 0x07, 0xef, 0xed, 0xef, 0x0e, 0x00, 0x0f,
+ 0x4c, 0xff, 0xc0, 0x11,
+ 0x42, 0x3e, 0xeb, 0x02, 0x12, 0xbc, 0x1d, 0x15, 0xf2, 0x1f, 0x0f, 0xe0,
+ 0x74, 0x43, 0xc4, 0x02,
+ 0x00, 0xfa, 0xd0, 0xe0, 0x00, 0x54, 0x0f, 0xfc, 0x03, 0x43, 0x1f, 0x3e,
+ 0x01, 0x36, 0x71, 0x00,
+ 0xed, 0x02, 0x03, 0x27, 0x00, 0x0d, 0xff, 0x01, 0x44, 0xe1, 0x21, 0x40,
+ 0xe0, 0xee, 0x1d, 0x5e,
+ 0x1f, 0x01, 0x06, 0x51, 0x0f, 0xed, 0x40, 0x1c, 0x0e, 0xf0, 0xd3, 0x00,
+ 0x15, 0xf4, 0xd0, 0x2e,
+ 0x8b, 0xf0, 0x0e, 0x01, 0x34, 0x72, 0x20, 0x03, 0x04, 0x1e, 0x30, 0x00,
+ 0xa2, 0xf0, 0x12, 0x00,
+ 0xdf, 0xfe, 0x06, 0x05, 0x00, 0xac, 0xf0, 0x04, 0xe1, 0xbc, 0xed, 0x00,
+ 0x03, 0x03, 0xfc, 0x0a,
+ 0x10, 0xf1, 0xd0, 0xee, 0xd0, 0xc5, 0xd0, 0xbe, 0xf0, 0xff, 0xdb, 0xc0,
+ 0x12, 0x43, 0x0e, 0x4e,
+ 0x04, 0xb1, 0x0f, 0x4f, 0x0d, 0xe9, 0xf0, 0x54, 0x42, 0x0f, 0x1e, 0x10,
+ 0x03, 0x02, 0x30, 0x00,
+ 0x01, 0xc5, 0x10, 0x0d, 0xeb, 0xef, 0x20, 0x5e, 0x00, 0xf0, 0x41, 0x1e,
+ 0x1f, 0x42, 0x20, 0x09,
+ 0xd0, 0xf0, 0x63, 0x1f, 0xd8, 0xb9, 0x00, 0x42, 0x10, 0xe0, 0xe0, 0xef,
+ 0xdf, 0x50, 0x40, 0x00,
+ 0xff, 0xe1, 0x34, 0x2e, 0xfe, 0x23, 0x73, 0x2d, 0xec, 0x02, 0xf2, 0xdf,
+ 0x0e, 0x10, 0xf3, 0xab,
+ 0x0f, 0x40, 0xf4, 0xe6, 0xf0, 0xc0, 0xde, 0xee, 0xfe, 0xe1, 0x05, 0xd1,
+ 0x8f, 0x0b, 0x1f, 0x41,
+ 0x03, 0x30, 0x1f, 0x00, 0x15, 0x02, 0x05, 0x20, 0xee, 0xaf, 0x10, 0x42,
+ 0x02, 0xd2, 0x0e, 0xed,
+ 0x24, 0x57, 0x10, 0x4e, 0x21, 0x26, 0x10, 0x00, 0xf0, 0x43, 0x32, 0x22,
+ 0x20, 0x33, 0x00, 0xe6,
+ 0x22, 0x41, 0x00, 0xe0, 0x11, 0x65, 0x00, 0x00, 0xf0, 0x02, 0x40, 0x2f,
+ 0x9d, 0x00, 0x03, 0x13,
+ 0x00, 0x2c, 0x4d, 0x2c, 0x0f, 0xb0, 0xe0, 0xe5, 0xef, 0x1e, 0x75, 0x02,
+ 0x0f, 0xf9, 0xe0, 0x20,
+ 0x42, 0xdd, 0xbe, 0x01, 0x45, 0xf0, 0xde, 0x0f, 0x2e, 0x00, 0xe3, 0xf1,
+ 0xbc, 0x1f, 0x2f, 0x02,
+ 0xe2, 0xdc, 0xec, 0xf0, 0xe0, 0x73, 0x35, 0xbd, 0xd9, 0x00, 0x53, 0x14,
+ 0xff, 0xec, 0x0f, 0x0f,
+ 0x21, 0x32, 0x10, 0x1f, 0xf0, 0xae, 0x01, 0x64, 0x20, 0xf8, 0xdf, 0x00,
+ 0x20, 0x01, 0x00, 0x0d,
+ 0x12, 0x30, 0x30, 0x3f, 0x0e, 0xec, 0x31, 0x43, 0xed, 0x1c, 0x75, 0x70,
+ 0x2d, 0xfd, 0x0f, 0x0b,
+ 0xec, 0xff, 0x4f, 0x0f, 0xb9, 0x00, 0xf2, 0xef, 0xed, 0xee, 0x00, 0x2d,
+ 0xcc, 0xef, 0x00, 0xe1,
+ 0xc0, 0xd0, 0xee, 0x08, 0xf0, 0xa0, 0xe0, 0xe0, 0xf0, 0x00, 0xe1, 0xef,
+ 0x0b, 0x10, 0x01, 0x31,
+ 0xa1, 0x9f, 0xf0, 0x15, 0x00, 0x0d, 0x20, 0xf2, 0xd3, 0x17, 0x24, 0x30,
+ 0x0e, 0xe0, 0xe0, 0x02,
+ 0x06, 0xb1, 0x8f, 0xdd, 0x01, 0x03, 0x22, 0x01, 0xe4, 0xb1, 0xf3, 0x02,
+ 0x00, 0x00, 0x1e, 0x4c,
+ 0x40, 0x42, 0x26, 0x60, 0x1b, 0x0e, 0xf1, 0x02, 0x11, 0x30, 0x00, 0x09,
+ 0x20, 0x20, 0x30, 0x30,
+ 0x0e, 0x3f, 0x72, 0x22, 0x23, 0xf0, 0xb8, 0x0e, 0x61, 0x01, 0xef, 0xfd,
+ 0x00, 0x1e, 0x00, 0x12,
+ 0x40, 0xd9, 0xb0, 0x04, 0x01, 0xbf, 0xde, 0xe0, 0xfd, 0xaf, 0x06, 0x71,
+ 0xfe, 0xcc, 0x23, 0x07,
+ 0x00, 0x1d, 0x02, 0x04, 0x00, 0x20, 0x01, 0xe2, 0x02, 0x00, 0x20, 0xf0,
+ 0x00, 0x30, 0x06, 0xe2,
+ 0x01, 0xd1, 0xf2, 0x27, 0x71, 0x10, 0xdf, 0xe0, 0xe0, 0x00, 0x12, 0x42,
+ 0xf0, 0xad, 0x0f, 0x70,
+ 0x02, 0x01, 0x17, 0x30, 0x0f, 0x0f, 0x02, 0x11, 0xef, 0x1f, 0x0f, 0xa9,
+ 0x00, 0x30, 0x1e, 0x0b,
+ 0x1f, 0x00, 0x00, 0x7f, 0x2e, 0x0f, 0x02, 0x42, 0x00, 0xe8, 0xcc, 0xf0,
+ 0x10, 0x01, 0x20, 0x1d,
+ 0x1b, 0xde, 0x01, 0x15, 0xf0, 0xaf, 0xcd, 0xc0, 0x00, 0x21, 0x30, 0xec,
+ 0x80, 0x04, 0x20, 0xfe,
+ 0xdf, 0xf0, 0x02, 0xee, 0xb9, 0xf0, 0x00, 0xd3, 0xf0, 0xe1, 0xe0, 0xde,
+ 0xf0, 0xd1, 0xbd, 0xec,
+ 0xe1, 0x03, 0x33, 0x03, 0x88, 0xed, 0x10, 0x26, 0xe1, 0xae, 0x0e, 0x02,
+ 0x01, 0xff, 0xeb, 0xf1,
+ 0xf3, 0x0f, 0x1c, 0x11, 0x02, 0x2e, 0x4e, 0x5e, 0x0e, 0xec, 0x2c, 0x0f,
+ 0xf2, 0x15, 0x2f, 0x0c,
+ 0x0d, 0x0f, 0x60, 0x40, 0x0d, 0xec, 0x00, 0xf0, 0xde, 0xec, 0xdc, 0x70,
+ 0x60, 0xfa, 0x0e, 0x3e,
+ 0x30, 0x01, 0xe0, 0x2e, 0x0c, 0xcf, 0xf0, 0x30, 0x0b, 0x8d, 0xe3, 0x04,
+ 0x01, 0x21, 0x00, 0xee,
+ 0x1e, 0x40, 0x03, 0xf7, 0x03, 0x2d, 0xed, 0x82, 0xe0, 0x0a, 0x2f, 0x40,
+ 0x22, 0x03, 0xff, 0xfe,
+ 0x1e, 0x3e, 0x03, 0xf7, 0xb0, 0xf1, 0x40, 0x32, 0xe0, 0xf0, 0x34, 0x64,
+ 0x01, 0xc3, 0x05, 0x42,
+ 0x2d, 0xfe, 0x21, 0x67, 0x01, 0xf0, 0xf0, 0xf0, 0x71, 0x27, 0xf1, 0x0f,
+ 0x0e, 0x50, 0x10, 0xc0,
+ 0xf2, 0x17, 0x12, 0x0c, 0xdf, 0xf0, 0x24, 0x51, 0xf0, 0xbe, 0x00, 0x34,
+ 0x33, 0xde, 0xdb, 0x21,
+ 0x74, 0x00, 0xec, 0x00, 0x12, 0x05, 0x00, 0xde, 0xcd, 0x02, 0x06, 0x42,
+ 0x0f, 0xdd, 0xe0, 0x11,
+ 0x23, 0xf0, 0xf2, 0x30, 0x72, 0x10, 0xdc, 0xd0, 0x22, 0x55, 0x22, 0xef,
+ 0xdc, 0xff, 0x00, 0x02,
+ 0x03, 0x10, 0x21, 0x41, 0xfe, 0xfc, 0x00, 0x00, 0x0e, 0x50, 0x0c, 0xdc,
+ 0x0f, 0x02, 0x37, 0x0f,
+ 0xbc, 0x40, 0x6f, 0x0f, 0xd1, 0xe4, 0x23, 0x30, 0x7e, 0x10, 0xf0, 0x01,
+ 0x23, 0xec, 0x0e, 0x7f,
+ 0x00, 0x0c, 0xe1, 0xe7, 0x12, 0x30, 0x00, 0xcc, 0xfe, 0xe0, 0x21, 0x65,
+ 0x0e, 0x0a, 0xf0, 0x00,
+ 0x13, 0x10, 0x1d, 0x3f, 0xcf, 0xc0, 0xf2, 0x20, 0x34, 0x41, 0xcc, 0x8f,
+ 0xe2, 0x07, 0x10, 0x2c,
+ 0x00, 0x80, 0x03, 0x00, 0x1a, 0x00, 0x0f, 0x31, 0x06, 0x00, 0xe0, 0x0d,
+ 0x20, 0x00, 0x21, 0x22,
+ 0x15, 0x00, 0xef, 0xdd, 0xe0, 0x14, 0x60, 0x20, 0x2f, 0xd1, 0x94, 0x11,
+ 0x20, 0x5d, 0x10, 0x02,
+ 0xe3, 0xe3, 0x12, 0x32, 0x00, 0x08, 0x0b, 0x20, 0x62, 0xe3, 0xd1, 0x01,
+ 0x20, 0x1d, 0x1f, 0x31,
+ 0xe3, 0xaf, 0xea, 0x1f, 0x20, 0x35, 0xd1, 0xa0, 0xf0, 0x00, 0x3d, 0x0d,
+ 0xd0, 0xf4, 0x04, 0xf0,
+ 0x0c, 0x0d, 0x3e, 0x5f, 0x90, 0xe0, 0xf0, 0x1c, 0x18, 0xce, 0xdf, 0xf4,
+ 0x03, 0x00, 0x0a, 0xc0,
+ 0xdf, 0xe0, 0xe0, 0x40, 0x2e, 0x1e, 0x10, 0xa1, 0xf3, 0x1c, 0xfd, 0x00,
+ 0x74, 0xe1, 0xc0, 0x0d,
+ 0xdd, 0xfd, 0xf2, 0xe3, 0x12, 0x13, 0x31, 0x0c, 0xe8, 0xff, 0x0e, 0x7f,
+ 0x60, 0x05, 0x02, 0x0e,
+ 0x0d, 0x00, 0x13, 0x12, 0x0f, 0xef, 0xed, 0xee, 0x0d, 0xf2, 0x41, 0x70,
+ 0x18, 0xdf, 0x01, 0x31,
+ 0x70, 0x0c, 0xf0, 0x01, 0x00, 0x20, 0x0f, 0x0f, 0x27, 0xe6, 0xf0, 0x00,
+ 0x2b, 0xff, 0x00, 0x23,
+ 0x71, 0x52, 0x00, 0x00, 0xe1, 0xf5, 0xe0, 0x00, 0x02, 0x10, 0x40, 0x20,
+ 0x11, 0xe4, 0xcf, 0x0a,
+ 0x00, 0x03, 0x01, 0x20, 0x2d, 0xb0, 0xd1, 0x01, 0xff, 0x3b, 0x3f, 0x85,
+ 0xe7, 0xe1, 0xdf, 0xfd,
+ 0x0e, 0x20, 0x14, 0xf0, 0x81, 0xef, 0xff, 0xf0, 0x00, 0x5f, 0x2c, 0x20,
+ 0xd5, 0xe2, 0x0f, 0x4b,
+ 0x1f, 0x20, 0x11, 0x00, 0x03, 0xf1, 0xce, 0xe0, 0x30, 0x33, 0xfc, 0xce,
+ 0xf1, 0x21, 0x30, 0x3e,
+ 0xe1, 0x87, 0x06, 0x30, 0x7f, 0x1c, 0xd0, 0xe2, 0x04, 0x00, 0xee, 0x0d,
+ 0x1e, 0x40, 0xf3, 0xc1,
+ 0x1f, 0x1c, 0xff, 0xcd, 0x0c, 0x40, 0x13, 0xf2, 0xd3, 0xfd, 0xdd, 0xff,
+ 0x11, 0x2f, 0xeb, 0x71,
+ 0x31, 0xf4, 0xd1, 0x0e, 0x8e, 0xde, 0xe1, 0x07, 0x71, 0x0c, 0xd2, 0xf7,
+ 0xf1, 0x0f, 0x00, 0x40,
+ 0x11, 0x03, 0xc1, 0xdc, 0x1e, 0x1e, 0x10, 0x1f, 0x01, 0xf0, 0x07, 0x54,
+ 0x5d, 0x1c, 0xff, 0xd1,
+ 0xe4, 0x01, 0x14, 0x41, 0xc0, 0xac, 0xf1, 0xf2, 0x10, 0x0f, 0x0a, 0xe0,
+ 0x10, 0x50, 0x31, 0x20,
+ 0x0f, 0xf0, 0x14, 0x2f, 0x40, 0x5d, 0x1d, 0xfb, 0xce, 0x02, 0x02, 0x1d,
+ 0x28, 0x2f, 0x01, 0x00,
+ 0x0f, 0xed, 0xfc, 0xff, 0x1e, 0x41, 0x70, 0x4f, 0xed, 0xce, 0x0f, 0x1a,
+ 0x1e, 0x1e, 0x00, 0x01,
+ 0x21, 0x0f, 0xe8, 0xdd, 0x50, 0x41, 0x02, 0xc1, 0xd3, 0xc1, 0xf0, 0x0e,
+ 0x50, 0x33, 0xc7, 0xc7,
+ 0x01, 0xf0, 0xef, 0xee, 0x10, 0x61, 0x13, 0xe1, 0xe0, 0xfd, 0x01, 0x23,
+ 0x21, 0x10, 0xe3, 0xa5,
+ 0x03, 0x03, 0x00, 0xc2, 0xf7, 0x02, 0x1f, 0xee, 0xc0, 0xe4, 0xe2, 0x00,
+ 0x1e, 0x0d, 0xd0, 0x3f,
+ 0x70, 0x5f, 0xfe, 0x05, 0x37, 0x04, 0x0e, 0x1d, 0x3e, 0x4f, 0x0f, 0x0f,
+ 0xf0, 0xcf, 0x1c, 0x5e,
+ 0x1e, 0x40, 0x27, 0xf5, 0x0f, 0x0f, 0xed, 0x00, 0x22, 0x70, 0x41, 0x24,
+ 0x00, 0x00, 0x0e, 0xe0,
+ 0x10, 0x02, 0x1d, 0x1a, 0x10, 0x30, 0xd0, 0xa0, 0x0f, 0x0f, 0x0f, 0xf0,
+ 0x94, 0xd0, 0x1d, 0x20,
+ 0x12, 0x27, 0x07, 0xe0, 0x10, 0x30, 0x50, 0xf0, 0xb0, 0xf0, 0x02, 0xde,
+ 0x0d, 0xf0, 0xe3, 0xf7,
+ 0x07, 0x20, 0xbe, 0xce, 0xe1, 0xe2, 0xf3, 0x32, 0x40, 0xcd, 0xbe, 0xe2,
+ 0x12, 0x50, 0x0e, 0x0f,
+ 0x1d, 0x2c, 0x2f, 0xf2, 0xf6, 0x11, 0xf0, 0xd0, 0x00, 0x10, 0xe2, 0x81,
+ 0xbe, 0x0a, 0x0e, 0x0e,
+ 0x41, 0x42, 0x0d, 0x0f, 0xd2, 0xfb, 0x28, 0x3e, 0x3f, 0x20, 0x01, 0xe5,
+ 0xf0, 0x0e, 0x2d, 0x0c,
+ 0xc0, 0xf1, 0xf2, 0xe0, 0xcc, 0x9c, 0x0e, 0x00, 0x50, 0x22, 0xa0, 0xf0,
+ 0x00, 0x0d, 0xfa, 0x0f,
+ 0x20, 0x33, 0x0f, 0xe0, 0x00, 0x0e, 0x0c, 0x0f, 0x11, 0x23, 0xf1, 0xa0,
+ 0xdb, 0xef, 0x03, 0xe4,
+ 0x97, 0x10, 0x2e, 0xd0, 0x02, 0x10, 0x0e, 0x02, 0xa5, 0x01, 0x2b, 0x1f,
+ 0x0e, 0x01, 0xe3, 0xe1,
+ 0xb2, 0x0d, 0x0d, 0x4f, 0x10, 0xe2, 0xf7, 0xd3, 0xdf, 0xd0, 0x00, 0x01,
+ 0x31, 0x05, 0x00, 0x2d,
+ 0x0e, 0x9d, 0x8c, 0x0f, 0x22, 0x42, 0x2f, 0x00, 0x04, 0xf2, 0xed, 0x0b,
+ 0x60, 0x10, 0x30, 0x00,
+ 0xd0, 0x34, 0x12, 0xf0, 0x00, 0x10, 0x00, 0xe0, 0x75, 0x46, 0x32, 0xe5,
+ 0xe3, 0x54, 0x10, 0x0c,
+ 0x11, 0x43, 0x17, 0x11, 0x50, 0x1e, 0x10, 0x01, 0x03, 0x52, 0x21, 0x0e,
+ 0xcf, 0x11, 0x10, 0xfb,
+ 0xff, 0x03, 0x17, 0x32, 0x30, 0x2e, 0xdf, 0xe0, 0x22, 0x40, 0x32, 0x11,
+ 0x00, 0x00, 0xf2, 0xf7,
+ 0x05, 0x80, 0xdf, 0x0f, 0x4f, 0x32, 0xc3, 0xb7, 0xf1, 0xf0, 0xed, 0x00,
+ 0x12, 0x05, 0x00, 0x9f,
+ 0xee, 0xff, 0x1d, 0x50, 0x21, 0x22, 0xff, 0xe0, 0xe2, 0xfe, 0x18, 0x30,
+ 0xb0, 0xc1, 0xd1, 0xd0,
+ 0xe0, 0xef, 0xfd, 0x0d, 0x0d, 0xbf, 0xe1, 0x04, 0xea, 0xfc, 0x0f, 0x4d,
+ 0x30, 0x03, 0xf0, 0xbc,
+ 0xcc, 0xe0, 0x01, 0xf0, 0x0d, 0x0e, 0xfe, 0xad, 0x0a, 0x0e, 0xf0, 0xd3,
+ 0x0f, 0xf8, 0xcf, 0xef,
+ 0x10, 0x70, 0x02, 0xdf, 0xee, 0x0e, 0x71, 0x6f, 0x0d, 0xff, 0x00, 0xff,
+ 0x0c, 0x2e, 0x3c, 0x0c,
+ 0xef, 0xf0, 0x12, 0x02, 0x0c, 0xdb, 0x00, 0xe1, 0xff, 0x64, 0x05, 0x05,
+ 0xfe, 0x00, 0x8f, 0x00,
+ 0xc0, 0x1c, 0x90, 0xe1, 0x8f, 0x1a, 0xb0, 0xdc, 0x98, 0xe0, 0x00, 0x01,
+ 0x22, 0x0f, 0x2e, 0xff,
+ 0xfd, 0x00, 0x4e, 0x0f, 0xe1, 0xf3, 0x36, 0x20, 0x02, 0xa0, 0xee, 0xd2,
+ 0xe9, 0xed, 0x0f, 0xf0,
+ 0xe2, 0x63, 0x2d, 0x0d, 0xd0, 0xd3, 0x00, 0x0a, 0x1f, 0x50, 0x30, 0x30,
+ 0x03, 0x2d, 0x28, 0xce,
+ 0xe0, 0x04, 0x60, 0x0d, 0xee, 0xf0, 0x00, 0x31, 0x17, 0xf4, 0x72, 0x60,
+ 0x0e, 0xe0, 0xe0, 0xf2,
+ 0x04, 0x12, 0x10, 0x2e, 0x53, 0x07, 0x27, 0x10, 0x3e, 0x10, 0x00, 0x00,
+ 0x21, 0x43, 0x11, 0xc1,
+ 0xef, 0xd1, 0x01, 0x70, 0x3f, 0x23, 0x07, 0xd0, 0xf1, 0x11, 0x61, 0x22,
+ 0x11, 0x01, 0x06, 0xf2,
+ 0xd0, 0x0c, 0x2f, 0x10, 0x00, 0x17, 0x02, 0x90, 0xe0, 0xf0, 0xf1, 0xf0,
+ 0xb3, 0xb0, 0xd0, 0xd0,
+ 0xcc, 0x0d, 0x4f, 0x50, 0x00, 0xff, 0xed, 0x11, 0xf0, 0x0d, 0x10, 0x00,
+ 0xee, 0xec, 0x0e, 0x11,
+ 0xf1, 0xcf, 0xce, 0xc8, 0xeb, 0x10, 0x50, 0x3d, 0x0e, 0xae, 0xf0, 0x06,
+ 0x00, 0x3d, 0x4b, 0xff,
+ 0xbf, 0x01, 0x03, 0x20, 0x1a, 0xed, 0x01, 0x10, 0x30, 0x2e, 0x0c, 0x8f,
+ 0xf0, 0xf0, 0x00, 0x1c,
+ 0x10, 0xf3, 0xf0, 0xfc, 0xcd, 0xff, 0x01, 0x50, 0x40, 0x4d, 0x0c, 0x2e,
+ 0xf0, 0x00, 0x0f, 0x0c,
+ 0x2d, 0x00, 0x04, 0xff, 0xe8, 0xcc, 0x03, 0x00, 0x1f, 0xcc, 0xe0, 0x00,
+ 0x12, 0x15, 0x12, 0x9f,
+ 0xa9, 0xdf, 0xe0, 0x0f, 0x3e, 0x31, 0x02, 0xe0, 0xec, 0xdf, 0xb0, 0xe0,
+ 0xd2, 0xf3, 0xfe, 0xf8,
+ 0xdf, 0xd0, 0x80, 0xcf, 0x00, 0x00, 0xfe, 0x0d, 0xf0, 0xf1, 0xba, 0xee,
+ 0x00, 0x01, 0x31, 0x52,
+ 0x11, 0x0f, 0x1d, 0xbe, 0xed, 0x0a, 0x1c, 0x5e, 0x00, 0xe3, 0x05, 0x00,
+ 0x0d, 0x0c, 0x2f, 0x30,
+ 0xd4, 0xf6, 0x32, 0x10, 0xed, 0x00, 0x72, 0x71, 0x23, 0x05, 0x11, 0x10,
+ 0x0e, 0xed, 0x30, 0x55,
+ 0x02, 0x00, 0xee, 0x00, 0x0f, 0x60, 0x22, 0x0e, 0x0d, 0x02, 0xf7, 0x25,
+ 0x50, 0x3d, 0x00, 0x12,
+ 0x02, 0x10, 0x0e, 0x00, 0x30, 0x10, 0x21, 0x17, 0x75, 0x30, 0x20, 0xff,
+ 0x82, 0xf6, 0xf1, 0x01,
+ 0x10, 0x00, 0xe0, 0xe2, 0x13, 0x13, 0x30, 0x0e, 0xc0, 0xe3, 0x26, 0x70,
+ 0x30, 0xd0, 0xe3, 0xf4,
+ 0x02, 0x20, 0x00, 0x23, 0x04, 0x01, 0xa1, 0xf4, 0xe2, 0x01, 0x3f, 0x6f,
+ 0x1f, 0x02, 0xd7, 0x12,
+ 0x1d, 0xfe, 0x00, 0x75, 0x31, 0x21, 0x10, 0x0f, 0xf3, 0x03, 0x1f, 0x0c,
+ 0x2e, 0x10, 0x3f, 0x4e,
+ 0x4e, 0xf9, 0xab, 0xee, 0xf0, 0x00, 0x1e, 0x0d, 0x11, 0x63, 0x10, 0x18,
+ 0x0d, 0xcd, 0x31, 0x56,
+ 0x20, 0x0d, 0x00, 0xfe, 0x0d, 0xee, 0x00, 0x0f, 0xed, 0x0f, 0x61, 0x35,
+ 0x00, 0xb1, 0xf1, 0x05,
+ 0xd0, 0xce, 0x00, 0x21, 0x2f, 0xfb, 0xa0, 0xf4, 0xe1, 0x00, 0x2d, 0x44,
+ 0xe5, 0x92, 0xff, 0x0e,
+ 0xfd, 0x00, 0x01, 0x06, 0x34, 0xd0, 0xbe, 0xff, 0x00, 0xc0, 0xef, 0xfd,
+ 0x04, 0xf4, 0xe0, 0xf0,
+ 0xcc, 0x10, 0x6f, 0x20, 0xf0, 0xd1, 0xe1, 0x0f, 0x0c, 0x1c, 0x1f, 0x30,
+ 0x31, 0x02, 0xdf, 0xf8,
+ 0x3d, 0x6f, 0x1e, 0xdf, 0xd2, 0x14, 0x1f, 0x7c, 0x31, 0x13, 0xf3, 0x0e,
+ 0x68, 0x3f, 0x00, 0xf0,
+ 0xd0, 0x35, 0x70, 0x2c, 0x0f, 0xd0, 0x11, 0xf0, 0xef, 0xfd, 0x0f, 0x0f,
+ 0x32, 0x51, 0x1e, 0xeb,
+ 0xd0, 0xe3, 0x00, 0xdf, 0xbc, 0x0f, 0x1d, 0x4f, 0x10, 0xf3, 0xd5, 0xf3,
+ 0x0d, 0x4f, 0x00, 0xd5,
+ 0xe4, 0xe2, 0x82, 0xdd, 0xd0, 0xa5, 0x02, 0x01, 0x10, 0x0c, 0x8f, 0xf0,
+ 0xf5, 0x0f, 0x1d, 0x10,
+ 0x00, 0x0f, 0x0f, 0x00, 0xe3, 0xbe, 0xeb, 0x02, 0x24, 0x0f, 0xcd, 0x00,
+ 0x00, 0xec, 0xdc, 0xef,
+ 0x00, 0xcf, 0xdb, 0x2f, 0x71, 0x03, 0xd8, 0xed, 0xff, 0x0f, 0x00, 0x23,
+ 0x75, 0x1f, 0x0c, 0x0d,
+ 0xef, 0x0f, 0xee, 0x00, 0x3f, 0x2f, 0x0b, 0xce, 0xc0, 0xc3, 0xc2, 0xda,
+ 0xed, 0x10, 0x4f, 0x40,
+ 0x02, 0xe5, 0x00, 0x0c, 0x1f, 0x20, 0x51, 0x32, 0x0d, 0xdc, 0x00, 0x0e,
+ 0xcc, 0x3f, 0x72, 0x47,
+ 0xf2, 0xd0, 0xf0, 0xf0, 0xfd, 0x0e, 0x31, 0x14, 0x53, 0x03, 0xff, 0xeb,
+ 0x1f, 0x4e, 0x20, 0x01,
+ 0xb4, 0x02, 0xf5, 0x1f, 0x5d, 0x10, 0x05, 0x03, 0x32, 0x3f, 0x1f, 0xcf,
+ 0xd0, 0xe0, 0x03, 0x21,
+ 0x0f, 0xe2, 0xe5, 0x21, 0x71, 0x1e, 0x1d, 0x0f, 0x2f, 0x43, 0x05, 0x21,
+ 0x37, 0x21, 0x5f, 0x7e,
+ 0x2f, 0x0d, 0xfc, 0x1e, 0x31, 0xf2, 0xf0, 0x1c, 0x4d, 0x2f, 0x26, 0xc2,
+ 0xc3, 0x04, 0x10, 0x2e,
+ 0x60, 0x37, 0x42, 0x31, 0x21, 0x22, 0xe0, 0xb0, 0x12, 0x23, 0x20, 0x20,
+ 0x03, 0x15, 0xe2, 0x03,
+ 0x57, 0x42, 0x2f, 0x00, 0x12, 0xf5, 0xe1, 0x00, 0x01, 0x53, 0x30, 0x41,
+ 0x32, 0x13, 0x21, 0x03,
+ 0x17, 0x44, 0x12, 0x2f, 0x30, 0x00, 0x35, 0x63, 0xf1, 0xc1, 0xd0, 0xf2,
+ 0xf3, 0x02, 0x35, 0x54,
+ 0x00, 0xef, 0xce, 0xd0, 0x02, 0x34, 0x02, 0x53, 0x5f, 0x1e, 0x0e, 0xe1,
+ 0xc0, 0xe4, 0xe2, 0xe4,
+ 0x31, 0x2f, 0x2d, 0xe0, 0xa2, 0xec, 0xdb, 0xff, 0x0f, 0x00, 0x3e, 0x4f,
+ 0xa1, 0xd3, 0xd0, 0xe8,
+ 0x0a, 0x5f, 0x30, 0x00, 0x31, 0x00, 0x09, 0xbe, 0xf0, 0x2f, 0x32, 0x00,
+ 0xbc, 0x9e, 0xfd, 0xfe,
+ 0x0b, 0x1e, 0x10, 0x14, 0xe3, 0xfe, 0x1e, 0x2d, 0x0c, 0xef, 0x40, 0x20,
+ 0x0c, 0x0e, 0x30, 0x51,
+ 0x1d, 0x09, 0xf0, 0xe0, 0x11, 0x02, 0xee, 0xaf, 0x0f, 0x02, 0x05, 0x40,
+ 0x10, 0xf0, 0xdf, 0x0f,
+ 0x1f, 0x0e, 0xb0, 0x03, 0xed, 0x0f, 0x37, 0x07, 0x01, 0xe1, 0x40, 0x7d,
+ 0x30, 0xf1, 0x83, 0x00,
+ 0xf1, 0x00, 0x0b, 0x00, 0x00, 0xf1, 0x0f, 0xfe, 0xbd, 0xe0, 0xe1, 0xf3,
+ 0x20, 0x4e, 0x1f, 0xf3,
+ 0xaf, 0xfc, 0xda, 0x0d, 0x18, 0x3f, 0x6f, 0x00, 0x01, 0x1e, 0xcc, 0xec,
+ 0xff, 0xf0, 0x00, 0x0c,
+ 0x0e, 0xcf, 0xcd, 0x04, 0x75, 0x31, 0x0f, 0xfc, 0x01, 0x01, 0x12, 0x00,
+ 0x00, 0xe0, 0x0f, 0xfe,
+ 0x3c, 0x72, 0x47, 0xf1, 0xdf, 0xef, 0x10, 0x13, 0x00, 0x00, 0x22, 0x11,
+ 0x02, 0xee, 0xec, 0xff,
+ 0xe1, 0xf3, 0x70, 0x6e, 0x1f, 0x15, 0x12, 0x0e, 0xbc, 0xf4, 0xd7, 0x17,
+ 0x30, 0x0f, 0xe0, 0xa2,
+ 0xe1, 0xe0, 0xe0, 0xf0, 0xe0, 0x00, 0x00, 0x13, 0xe1, 0x8e, 0xeb, 0xf1,
+ 0x20, 0x40, 0x0e, 0xb0,
+ 0xe4, 0xee, 0xea, 0x0e, 0x0f, 0x01, 0xe1, 0xe1, 0xef, 0xf9, 0xef, 0x0f,
+ 0x2e, 0x11, 0xc3, 0xb4,
+ 0xff, 0xed, 0xdb, 0xec, 0x0f, 0x60, 0x20, 0x10, 0x43, 0x00, 0xdc, 0xed,
+ 0xfc, 0x10, 0x3f, 0xac,
+ 0xdc, 0xee, 0x0f, 0x0e, 0xec, 0x00, 0xff, 0xae, 0xfc, 0x0f, 0xf4, 0xc0,
+ 0xea, 0x30, 0x6f, 0x00,
+ 0x00, 0x00, 0x40, 0x2c, 0x1c, 0x1c, 0x0f, 0x3e, 0x0e, 0x0f, 0xe3, 0xe3,
+ 0x00, 0x20, 0x1c, 0x0f,
+ 0x0c, 0x7e, 0x20, 0xc0, 0xb1, 0xec, 0x00, 0x24, 0x40, 0x2d, 0x2e, 0x0f,
+ 0xad, 0xee, 0xd0, 0x00,
+ 0x17, 0x61, 0x22, 0x00, 0xc0, 0xd0, 0xef, 0xfe, 0x09, 0x0e, 0xe0, 0x07,
+ 0xf0, 0x00, 0x20, 0x03,
+ 0x90, 0xe2, 0xf4, 0x00, 0x00, 0x00, 0xd1, 0xe4, 0x46, 0x61, 0x1f, 0x1e,
+ 0x12, 0x12, 0xff, 0xfe,
+ 0xd1, 0xcf, 0xc9, 0x00, 0x20, 0x34, 0x15, 0x01, 0x5f, 0x4f, 0xd0, 0xe4,
+ 0x16, 0x72, 0x20, 0x3f,
+ 0x30, 0x01, 0x01, 0xd2, 0x41, 0x42, 0x11, 0x51, 0x33, 0x45, 0x10, 0x0f,
+ 0xe1, 0xf6, 0x00, 0x0f,
+ 0x40, 0x50, 0x22, 0x00, 0xef, 0x0f, 0x30, 0x5f, 0x3b, 0x30, 0x07, 0xf3,
+ 0x01, 0x20, 0x3c, 0x00,
+ 0xf1, 0x02, 0x25, 0x02, 0xd0, 0x9e, 0xd0, 0xf3, 0xe4, 0xf3, 0x12, 0x24,
+ 0xc0, 0xbe, 0x0e, 0x30,
+ 0x75, 0x01, 0xe0, 0xe4, 0x04, 0xe0, 0xf0, 0xdd, 0xf0, 0xe0, 0xfe, 0x11,
+ 0x57, 0xf2, 0xb0, 0x01,
+ 0x00, 0x00, 0xbb, 0xf0, 0xe1, 0xd0, 0xce, 0x0f, 0x30, 0x51, 0x11, 0x20,
+ 0x0f, 0x0f, 0x0f, 0x10,
+ 0x1e, 0x18, 0x0b, 0x0e, 0x00, 0x23, 0x20, 0xec, 0xdd, 0xdd, 0x10, 0x30,
+ 0xab, 0xbe, 0xfe, 0xe1,
+ 0xf1, 0xbe, 0x0e, 0x73, 0x6d, 0x18, 0x1d, 0xfc, 0xf0, 0x0f, 0x2f, 0x3e,
+ 0x3e, 0x30, 0x01, 0xec,
+ 0x0b, 0x3e, 0x00, 0xe2, 0x00, 0x1d, 0x5d, 0x0e, 0xfe, 0x15, 0x02, 0xef,
+ 0xeb, 0xde, 0x50, 0x63,
+ 0x21, 0x00, 0xf7, 0xe3, 0x00, 0x10, 0x5f, 0xf1, 0xe6, 0xc2, 0x00, 0xfe,
+ 0xff, 0xd0, 0xf4, 0x03,
+ 0x55, 0x3f, 0xe0, 0x90, 0xf1, 0xd1, 0xd0, 0xf2, 0xf3, 0x10, 0x50, 0x42,
+ 0x16, 0x20, 0xf1, 0xe1,
+ 0xe2, 0x00, 0x30, 0x1c, 0x4d, 0x5d, 0xfe, 0x8e, 0xf0, 0x05, 0x1b, 0x1c,
+ 0x20, 0x46, 0xf2, 0xe0,
+ 0xee, 0x2e, 0x10, 0x04, 0x32, 0x42, 0x50, 0x00, 0x1d, 0x00, 0x21, 0x31,
+ 0x33, 0x33, 0x16, 0xe0,
+ 0xe2, 0x03, 0x00, 0x2e, 0x00, 0xf6, 0x02, 0x11, 0xff, 0xfd, 0x7e, 0x4d,
+ 0x00, 0x06, 0x74, 0x22,
+ 0x00, 0x0e, 0x10, 0x32, 0x24, 0x12, 0x02, 0x07, 0xf5, 0xa1, 0xf0, 0xc1,
+ 0xe0, 0xf1, 0xf0, 0xf1,
+ 0x12, 0x54, 0x02, 0xe4, 0xf0, 0x00, 0x05, 0xf0, 0xf3, 0xa0, 0xdf, 0x00,
+ 0x62, 0x2f, 0xee, 0x00,
+ 0x07, 0x21, 0x00, 0x90, 0xd1, 0xce, 0xff, 0x0f, 0x1e, 0xe0, 0xa0, 0xf0,
+ 0xf4, 0x2e, 0x49, 0x00,
+ 0x11, 0x1f, 0x1c, 0xee, 0xbf, 0x0f, 0x0f, 0x5f, 0x28, 0x0e, 0xfd, 0xde,
+ 0xfc, 0x0f, 0xd0, 0xcf,
+ 0xde, 0xec, 0x1c, 0xfe, 0xaf, 0xf1, 0xe0, 0xe8, 0xfe, 0x1f, 0x1f, 0xf0,
+ 0xef, 0x0f, 0x2e, 0xde,
+ 0xbe, 0x0e, 0x4d, 0xfc, 0xec, 0x3f, 0x22, 0xb2, 0xce, 0xea, 0xef, 0xf0,
+ 0xbe, 0xdf, 0xf0, 0x0c,
+ 0xdb, 0xcf, 0x00, 0x21, 0xf2, 0xd0, 0x3c, 0x7d, 0x0e, 0xa1, 0xe4, 0xe2,
+ 0x0f, 0x0b, 0x30, 0x31,
+ 0x12, 0xd1, 0xef, 0xcc, 0xdd, 0xbc, 0xf1, 0x13, 0x01, 0x00, 0xdb, 0x9f,
+ 0xe0, 0xf0, 0x0f, 0x2e,
+ 0x50, 0x07, 0x01, 0x00, 0xff, 0x0b, 0x0e, 0x0d, 0xe0, 0x04, 0xef, 0xdc,
+ 0x0c, 0x4f, 0x0f, 0xee,
+ 0x00, 0x61, 0x24, 0x0f, 0xfd, 0x00, 0x02, 0x01, 0x1d, 0x70, 0x71, 0x02,
+ 0x02, 0x01, 0x33, 0x00,
+ 0x14, 0x22, 0x37, 0x17, 0x15, 0x10, 0x21, 0x00, 0x0f, 0x70, 0x22, 0x03,
+ 0x03, 0x44, 0x30, 0x31,
+ 0xf0, 0x00, 0x31, 0x71, 0x3e, 0x31, 0x07, 0x03, 0x12, 0x30, 0x71, 0x07,
+ 0x03, 0x02, 0x01, 0xf0,
+ 0xf1, 0x15, 0x51, 0x33, 0x43, 0x03, 0x04, 0xe3, 0x02, 0x22, 0x02, 0x02,
+ 0x04, 0x33, 0xf4, 0xb2,
+ 0x05, 0x24, 0x62, 0x41, 0x31, 0x00, 0xe1, 0xe3, 0x05, 0xe2, 0xc0, 0xf3,
+ 0x03, 0x20, 0x30, 0x41,
+ 0xd2, 0xc0, 0x02, 0x67, 0x02, 0x00, 0x22, 0x44, 0x12, 0x00, 0x0f, 0x0e,
+ 0x0d, 0x18, 0x4d, 0x3f,
+ 0xf0, 0xd0, 0x0f, 0x2d, 0xdd, 0xb2, 0xe2, 0x9d, 0xeb, 0xed, 0x2f, 0x60,
+ 0x00, 0xfa, 0xdf, 0x0f,
+ 0x2d, 0x4d, 0x2f, 0x0a, 0xed, 0xfe, 0x00, 0xed, 0x0b, 0x60, 0x71, 0x20,
+ 0x0b, 0x0f, 0xc0, 0xfe,
+ 0xfd, 0xee, 0x3f, 0x30, 0x0e, 0x00, 0xf2, 0xff, 0xd8, 0xed, 0x10, 0x22,
+ 0x12, 0xc0, 0x0f, 0xef,
+ 0xaa, 0xee, 0x10, 0x76, 0x10, 0x00, 0x00, 0x00, 0xee, 0xef, 0xed, 0xdc,
+ 0xc0, 0xc1, 0xe1, 0xc1,
+ 0xfd, 0xec, 0xee, 0xe0, 0x01, 0x51, 0x0f, 0xbf, 0xd2, 0xee, 0x09, 0xfe,
+ 0xfa, 0xbf, 0xff, 0xff,
+ 0x0c, 0x0c, 0x0d, 0xad, 0xee, 0xfe, 0xfe, 0xd0, 0xd7, 0xe2, 0xfd, 0xfc,
+ 0xde, 0xce, 0x00, 0x7f,
+ 0x10, 0x0e, 0x0f, 0xf0, 0x03, 0x00, 0x3c, 0x3c, 0xee, 0x80, 0xf1, 0x01,
+ 0x0f, 0x0c, 0x13, 0xf4,
+ 0xc0, 0xf2, 0xe3, 0xc0, 0xfa, 0xeb, 0x5f, 0x40, 0x0f, 0x00, 0xfe, 0x01,
+ 0x02, 0xe2, 0x26, 0x30,
+ 0x0c, 0x9e, 0xd0, 0xc4, 0xf3, 0xe5, 0x01, 0x00, 0x0e, 0x00, 0xf0, 0xe1,
+ 0xb3, 0xd2, 0xb0, 0xde,
+ 0xf0, 0xf2, 0x32, 0x36, 0xd0, 0xcb, 0xed, 0xff, 0x0e, 0xf0, 0xbf, 0xe1,
+ 0xc1, 0xe9, 0xff, 0xe0,
+ 0xc0, 0xab, 0xee, 0xdf, 0xee, 0xee, 0xdc, 0x10, 0x05, 0xd2, 0xe1, 0xdf,
+ 0x2d, 0x7e, 0x6e, 0x11,
+ 0x00, 0xde, 0xf8, 0x0e, 0x00, 0x4d, 0x2f, 0x0d, 0xf0, 0xbe, 0xec, 0xde,
+ 0xde, 0x10, 0x12, 0x54,
+ 0x00, 0x0f, 0xda, 0xcc, 0xde, 0x0f, 0x40, 0x51, 0x30, 0x1e, 0x0f, 0x1d,
+ 0x2b, 0x3f, 0x30, 0x22,
+ 0x02, 0x14, 0x5f, 0x1b, 0x0a, 0xa0, 0x0f, 0x30, 0x41, 0x0f, 0x00, 0x10,
+ 0x2b, 0x0e, 0x50, 0x34,
+ 0x00, 0xfe, 0x03, 0x31, 0x12, 0xf2, 0x20, 0x7e, 0x3e, 0x14, 0x17, 0x14,
+ 0x00, 0xfb, 0x0f, 0xd0,
+ 0xb0, 0xe1, 0x01, 0x02, 0x41, 0xf0, 0xb2, 0x15, 0x10, 0x20, 0x0f, 0x02,
+ 0x37, 0x05, 0xb0, 0xf0,
+ 0x0f, 0x40, 0x60, 0x00, 0x02, 0x00, 0xfe, 0x01, 0x23, 0x34, 0x00, 0xe0,
+ 0x00, 0xf0, 0xc2, 0xa2,
+ 0x03, 0x33, 0x51, 0x10, 0xe2, 0x07, 0x07, 0x36, 0x50, 0x40, 0x20, 0x20,
+ 0x10, 0x31, 0x63, 0x03,
+ 0xf3, 0xf4, 0x10, 0x22, 0x11, 0x11, 0x13, 0x03, 0x02, 0x16, 0x71, 0x72,
+ 0x22, 0x24, 0x10, 0x00,
+ 0x20, 0x10, 0x02, 0x10, 0x04, 0x27, 0x14, 0x20, 0x62, 0x10, 0x11, 0x00,
+ 0x02, 0x12, 0x13, 0x04,
+ 0x03, 0x23, 0x10, 0x24, 0xf4, 0x82, 0x00, 0x01, 0x13, 0x32, 0x37, 0x15,
+ 0x01, 0xe2, 0xf0, 0x10,
+ 0x73, 0x03, 0x10, 0x4f, 0x11, 0xc2, 0xb0, 0xf5, 0x05, 0x10, 0x1f, 0x32,
+ 0xf7, 0xb2, 0xef, 0x0e,
+ 0x00, 0x02, 0x63, 0x42, 0x22, 0x11, 0x0f, 0xeb, 0x00, 0x20, 0x2e, 0x1f,
+ 0x2e, 0x31, 0x11, 0xe0,
+ 0xcf, 0x24, 0x10, 0xfb, 0xf0, 0x03, 0x03, 0xbb, 0x0e, 0x0c, 0x4d, 0x4e,
+ 0x30, 0x13, 0x6f, 0x40,
+ 0x3d, 0x08, 0x1e, 0x30, 0x12, 0x51, 0x20, 0x0c, 0x0d, 0xff, 0x00, 0x30,
+ 0x2a, 0x0e, 0x70, 0x20,
+ 0xf1, 0xce, 0xfa, 0xff, 0xe0, 0xef, 0x02, 0x05, 0x00, 0xee, 0xf0, 0xdf,
+ 0xc0, 0x62, 0x41, 0x12,
+ 0xe0, 0x93, 0xf4, 0xf2, 0x00, 0x00, 0xff, 0xfc, 0xcb, 0xef, 0xe3, 0xf5,
+ 0xf0, 0x01, 0xd1, 0xc1,
+ 0xb1, 0xf3, 0xef, 0xd0, 0x0f, 0xef, 0x18, 0x7d, 0x1e, 0x0d, 0xb0, 0xf3,
+ 0x00, 0x0b, 0x0b, 0x1d,
+ 0x0e, 0xfd, 0xce, 0xff, 0x01, 0xd2, 0xda, 0x0e, 0x10, 0x31, 0xeb, 0x0c,
+ 0x3f, 0x7f, 0x20, 0x20,
+ 0x61, 0x11, 0x10, 0x3e, 0x2d, 0x30, 0x02, 0xcf, 0x9d, 0xe0, 0x02, 0x0c,
+ 0x2b, 0x21, 0x33, 0x0e,
+ 0xf9, 0x0e, 0xfd, 0xde, 0x1f, 0x7f, 0x5c, 0xfe, 0xb1, 0x05, 0x0f, 0x1c,
+ 0x2d, 0x2f, 0x02, 0x07,
+ 0xd0, 0xd0, 0xf0, 0xc1, 0x03, 0xf2, 0x02, 0x03, 0xb1, 0xbe, 0xee, 0xe1,
+ 0xf6, 0xf3, 0x25, 0x53,
+ 0x03, 0xdf, 0xcd, 0x00, 0xe5, 0xe1, 0x00, 0x02, 0x04, 0xd0, 0xd0, 0xee,
+ 0xae, 0xd0, 0xc0, 0xf1,
+ 0xc7, 0xf3, 0xef, 0x1f, 0x20, 0x00, 0xf5, 0x11, 0x02, 0x0e, 0x1f, 0x4d,
+ 0x1e, 0x1b, 0x1a, 0x4e,
+ 0x5f, 0x10, 0x00, 0xef, 0xe0, 0xec, 0xbc, 0xcf, 0xdf, 0xe0, 0xd0, 0xda,
+ 0xad, 0xcf, 0xdd, 0xed,
+ 0x0b, 0x5e, 0x2e, 0x00, 0xed, 0xb0, 0xfb, 0x0e, 0x0c, 0x0e, 0x00, 0xfe,
+ 0xd0, 0x0d, 0x7d, 0x2b,
+ 0x0d, 0xfe, 0xdc, 0x0e, 0xec, 0xdd, 0xaf, 0xd0, 0xd0, 0xdc, 0x0c, 0x50,
+ 0x1d, 0xed, 0xe0, 0x01,
+ 0x0e, 0x3a, 0x50, 0x0e, 0xcf, 0xe2, 0x04, 0xcd, 0xda, 0xe0, 0x00, 0x0e,
+ 0x3e, 0x2f, 0xb0, 0xc6,
+ 0xe1, 0xf1, 0x00, 0x01, 0xd0, 0xbc, 0xf0, 0xe1, 0x13, 0x23, 0x05, 0x01,
+ 0x18, 0x00, 0x1c, 0x00,
+ 0xae, 0xd1, 0xff, 0x03, 0x9d, 0xd1, 0x7a, 0x01, 0xaf, 0x0d, 0x38, 0xfb,
+ 0xdd, 0xbd, 0x1f, 0x22,
+ 0x83, 0xd2, 0xf7, 0x20, 0x5c, 0x20, 0xd2, 0xa0, 0xee, 0xed, 0xed, 0x0b,
+ 0x63, 0x44, 0x21, 0x13,
+ 0x00, 0x0f, 0x0d, 0x10, 0x42, 0x27, 0x02, 0xef, 0xd2, 0xf7, 0x00, 0x2d,
+ 0x30, 0x71, 0x70, 0x0e,
+ 0x00, 0xef, 0xff, 0x0e, 0x20, 0x20, 0x25, 0x2f, 0x19, 0x0e, 0x2f, 0x0e,
+ 0x0e, 0x56, 0x23, 0x64,
+ 0x00, 0x00, 0x0d, 0xff, 0xef, 0x01, 0xc1, 0x00, 0xf0, 0x02, 0x31, 0x21,
+ 0x13, 0xdc, 0xce, 0x07,
+ 0x12, 0xdf, 0xee, 0x74, 0x6e, 0xf8, 0xe0, 0x0f, 0x10, 0x00, 0x00, 0xcc,
+ 0xef, 0xc0, 0xc2, 0xe0,
+ 0x0f, 0x11, 0x13, 0xd5, 0xb2, 0xfe, 0xfd, 0x1c, 0x50, 0x21, 0xf1, 0xc0,
+ 0x00, 0x0e, 0x08, 0x2f,
+ 0x60, 0x00, 0x12, 0x01, 0x00, 0x00, 0x03, 0xd0, 0xdc, 0x0e, 0x10, 0xf2,
+ 0x85, 0xd1, 0x00, 0x02,
+ 0x4b, 0x00, 0x02, 0x20, 0x12, 0x0f, 0xdf, 0xd2, 0x37, 0x33, 0x7e, 0x7d,
+ 0x00, 0x01, 0x01, 0x11,
+ 0x3f, 0x1d, 0x20, 0x10, 0x04, 0x07, 0x02, 0xe0, 0xdd, 0x0c, 0x30, 0x74,
+ 0x11, 0x10, 0x11, 0x07,
+ 0x11, 0x33, 0x13, 0x21, 0x0b, 0x0c, 0x0f, 0x70, 0x61, 0x00, 0xff, 0xfd,
+ 0x00, 0xf0, 0x02, 0x10,
+ 0x3f, 0x1b, 0xe1, 0xa5, 0x02, 0xe0, 0x00, 0x00, 0x6b, 0x20, 0xf0, 0xe2,
+ 0x00, 0xe8, 0xee, 0x0f,
+ 0x40, 0x31, 0x11, 0x21, 0x00, 0xbf, 0xfe, 0xed, 0xfe, 0x01, 0xd4, 0xe1,
+ 0xc3, 0xa1, 0xdd, 0xf8,
+ 0x10, 0x73, 0x52, 0xfe, 0x0f, 0x04, 0x03, 0x02, 0x00, 0x17, 0x11, 0x13,
+ 0x10, 0x1e, 0x0e, 0xda,
+ 0xe0, 0x10, 0x53, 0x03, 0x20, 0x3e, 0x3e, 0xfc, 0xef, 0x00, 0xf0, 0x01,
+ 0x72, 0x4e, 0x3b, 0x3f,
+ 0x31, 0x13, 0x20, 0x51, 0x26, 0x24, 0x00, 0xfd, 0xec, 0xde, 0x0f, 0x70,
+ 0x56, 0x00, 0xee, 0xff,
+ 0xf0, 0xf0, 0x01, 0x41, 0x4f, 0x0d, 0x0f, 0x12, 0x27, 0x0f, 0x0c, 0x7e,
+ 0x3f, 0x0d, 0xeb, 0xe0,
+ 0x03, 0xff, 0xca, 0xe0, 0xe1, 0xe3, 0xd0, 0xf1, 0x01, 0xa1, 0xd6, 0xf0,
+ 0x10, 0x1b, 0x00, 0xc0,
+ 0x00, 0x03, 0x00, 0x3e, 0x70, 0x70, 0x3d, 0x0f, 0xe2, 0xf5, 0xf0, 0xfc,
+ 0xd1, 0xe0, 0xd0, 0x02,
+ 0x03, 0xce, 0xda, 0xf0, 0x21, 0x50, 0x00, 0x0b, 0xd0, 0xee, 0xd3, 0x06,
+ 0xf2, 0xb0, 0xf0, 0x1c,
+ 0x70, 0x21, 0x33, 0x31, 0x1f, 0x00, 0xe2, 0xe3, 0x01, 0xee, 0x0c, 0x3d,
+ 0x0b, 0xef, 0x80, 0xe3,
+ 0xd1, 0x00, 0x37, 0x33, 0x40, 0x12, 0xf0, 0xbe, 0xd9, 0xc0, 0xf0, 0x00,
+ 0x71, 0x3f, 0x02, 0xe1,
+ 0xcc, 0xeb, 0x0f, 0xe0, 0x01, 0x02, 0xe3, 0xe7, 0xa0, 0xd0, 0xfe, 0xf0,
+ 0xed, 0xbf, 0xe3, 0xf7,
+ 0xf0, 0xcd, 0xef, 0xef, 0x03, 0x44, 0x20, 0x0e, 0x0e, 0xe0, 0x9d, 0xfe,
+ 0xef, 0xc2, 0xd3, 0xd7,
+ 0x02, 0x10, 0xfe, 0xbb, 0xff, 0xef, 0xef, 0x22, 0x51, 0x32, 0x03, 0x00,
+ 0xf0, 0x10, 0x40, 0x10,
+ 0x00, 0x07, 0x17, 0x20, 0x50, 0x60, 0x11, 0x1e, 0x20, 0x16, 0x00, 0xdc,
+ 0xf0, 0x3e, 0x7e, 0x6f,
+ 0x10, 0x01, 0x00, 0x30, 0x20, 0x10, 0x20, 0x21, 0x50, 0x2c, 0x3f, 0x00,
+ 0x14, 0x37, 0x24, 0x1d,
+ 0x3b, 0x30, 0x30, 0x12, 0x02, 0xd1, 0xe0, 0x0b, 0x30, 0x72, 0x21, 0x44,
+ 0x31, 0x10, 0x10, 0x3c,
+ 0x6f, 0x2f, 0x1e, 0x0d, 0xfd, 0xdf, 0xdf, 0xf0, 0x25, 0x63, 0x1f, 0x0c,
+ 0xe0, 0xc3, 0xf7, 0xd0,
+ 0xcd, 0xee, 0xef, 0xf0, 0x15, 0x71, 0x1c, 0x3e, 0x40, 0x10, 0x2e, 0x0f,
+ 0x61, 0x30, 0x1c, 0x00,
+ 0x00, 0xe7, 0xd1, 0xec, 0x0e, 0x10, 0x30, 0x20, 0x2f, 0xe1, 0x82, 0xdf,
+ 0xf0, 0xd5, 0x00, 0x0e,
+ 0x7f, 0x2d, 0xfe, 0xe1, 0xf4, 0x13, 0x41, 0x44, 0x43, 0x27, 0x02, 0xef,
+ 0xe8, 0x00, 0x2f, 0x10,
+ 0x10, 0x02, 0x43, 0x00, 0x8e, 0xf0, 0xf0, 0xf2, 0xf0, 0xff, 0x01, 0xe3,
+ 0xe2, 0xe1, 0x24, 0x10,
+ 0x0a, 0xe0, 0xb4, 0xf5, 0xe0, 0xda, 0x90, 0xcf, 0xd0, 0xe2, 0x05, 0x00,
+ 0x3f, 0xcf, 0xa0, 0xe0,
+ 0xd0, 0xd1, 0xc2, 0xd1, 0x00, 0xed, 0x0f, 0xef, 0xcf, 0xf8, 0xfe, 0xf0,
+ 0xf1, 0xc2, 0xb3, 0xf0,
+ 0xec, 0xee, 0xe0, 0xa0, 0xe0, 0xd3, 0xd0, 0xd9, 0xff, 0x20, 0x12, 0x01,
+ 0xdc, 0xf0, 0xf2, 0xb1,
+ 0xd0, 0x01, 0x10, 0x6c, 0x20, 0x03, 0x04, 0xf7, 0x03, 0x00, 0x1e, 0xfe,
+ 0xc0, 0x21, 0x25, 0xc1,
+ 0xc0, 0xff, 0xed, 0x0b, 0x6f, 0x30, 0x13, 0xff, 0xda, 0x00, 0x03, 0x52,
+ 0x3f, 0x2d, 0x0e, 0xcf,
+ 0xcf, 0xf4, 0xf5, 0x00, 0x1c, 0x20, 0xd1, 0xa3, 0xf4, 0xcf, 0xcc, 0xf2,
+ 0xd3, 0xf1, 0xe0, 0x03,
+ 0x40, 0xfd, 0xe4, 0xf4, 0xc0, 0xdb, 0xcf, 0xee, 0xdd, 0x0e, 0x0e, 0xbc,
+ 0x00, 0xad, 0xde, 0xc0,
+ 0xe6, 0xe0, 0xeb, 0xd0, 0xc3, 0xc6, 0xc0, 0xd2, 0xef, 0x0c, 0x3e, 0x30,
+ 0x50, 0x05, 0x00, 0xde,
+ 0xfe, 0xe0, 0x11, 0x42, 0x13, 0x2d, 0xfb, 0xd0, 0xef, 0xce, 0xe0, 0x21,
+ 0x76, 0x00, 0xe0, 0xb0,
+ 0x0e, 0xed, 0xed, 0xff, 0x01, 0x06, 0x03, 0x21, 0x0c, 0xde, 0x01, 0x27,
+ 0x30, 0x60, 0x30, 0x1e,
+ 0x00, 0x0f, 0x3e, 0x5f, 0x00, 0x00, 0x73, 0x40, 0x0e, 0xff, 0xc4, 0x06,
+ 0xe0, 0xff, 0x15, 0x63,
+ 0x21, 0x2e, 0x1e, 0x10, 0x0e, 0xff, 0x00, 0x04, 0x02, 0x05, 0x30, 0x60,
+ 0x20, 0x3c, 0x1f, 0x0d,
+ 0x00, 0x11, 0x33, 0x17, 0x02, 0xde, 0xdd, 0x33, 0x05, 0x80, 0xe0, 0xef,
+ 0x0d, 0x6d, 0x5f, 0x20,
+ 0x33, 0x1f, 0x21, 0xef, 0xb8, 0x0e, 0x00, 0x00, 0x0d, 0x2d, 0x20, 0x03,
+ 0xd3, 0xf1, 0x51, 0x2a,
+ 0x5e, 0x2e, 0x0f, 0x00, 0x02, 0x1f, 0x2c, 0x6f, 0x30, 0x37, 0x16, 0x00,
+ 0x00, 0x00, 0x34, 0x72,
+ 0x30, 0x20, 0x1e, 0x0e, 0xf0, 0x12, 0x42, 0x1d, 0x2c, 0x50, 0x32, 0x23,
+ 0x00, 0x30, 0x18, 0x3f,
+ 0x70, 0x43, 0x22, 0x41, 0x29, 0x4d, 0x3f, 0x22, 0x00, 0x0f, 0xf0, 0xe0,
+ 0x0e, 0x20, 0x63, 0x17,
+ 0x13, 0x01, 0x00, 0x00, 0x41, 0x1e, 0x50, 0x45, 0x21, 0x00, 0xd0, 0xfc,
+ 0xed, 0x1e, 0x7d, 0x4f,
+ 0x2f, 0xfc, 0xec, 0x00, 0x01, 0x00, 0x03, 0xe7, 0xd7, 0x00, 0xee, 0xcc,
+ 0xcf, 0xff, 0x2e, 0x50,
+ 0x46, 0x01, 0x10, 0x0e, 0x4f, 0x00, 0x0e, 0xff, 0x20, 0x60, 0x0e, 0x3f,
+ 0x11, 0x26, 0x00, 0xff,
+ 0x0f, 0x10, 0x3f, 0xff, 0xed, 0xd0, 0x8d, 0xd0, 0xf6, 0x35, 0x40, 0x30,
+ 0x00, 0xc0, 0x10, 0x10,
+ 0x44, 0x02, 0x45, 0x12, 0x32, 0x40, 0x4f, 0x2d, 0x0b, 0x0e, 0x0f, 0xd0,
+ 0xc0, 0xf4, 0x25, 0x10,
+ 0xff, 0x0f, 0x60, 0x10, 0x10, 0x14, 0x13, 0x02, 0x20, 0x40, 0x10, 0x0a,
+ 0x10, 0x30, 0x01, 0xd1,
+ 0xee, 0x1e, 0x7d, 0x73, 0x73, 0x0c, 0xe3, 0xf7, 0xf6, 0xff, 0xf0, 0xfe,
+ 0x0f, 0x0c, 0xf0, 0xf0,
+ 0x00, 0x2f, 0x3d, 0x2f, 0x3f, 0x0e, 0xbe, 0xe0, 0xe3, 0x01, 0xce, 0xed,
+ 0xde, 0xd8, 0xca, 0xb0,
+ 0xd3, 0xd0, 0xd1, 0xb0, 0xff, 0x00, 0xe0, 0xe0, 0xfe, 0x00, 0x10, 0xbb,
+ 0xd0, 0x07, 0x67, 0x0f,
+ 0x10, 0x00, 0xe3, 0xd0, 0xe0, 0x02, 0xc2, 0xc1, 0x00, 0x30, 0x2e, 0x1b,
+ 0xc0, 0x80, 0xe1, 0xee,
+ 0x0c, 0x10, 0x30, 0x23, 0x04, 0x04, 0x00, 0x0b, 0x3f, 0x70, 0x32, 0x0f,
+ 0x0d, 0xef, 0xad, 0xfe,
+ 0xef, 0xf5, 0x02, 0x22, 0x01, 0xf1, 0xf1, 0xb1, 0xff, 0xf1, 0xe7, 0xd4,
+ 0xe2, 0x04, 0x20, 0x7a,
+ 0x0d, 0xfe, 0x00, 0x1e, 0x00, 0x3e, 0x2f, 0x0f, 0x9f, 0xd3, 0xd5, 0xa0,
+ 0xf0, 0xec, 0xfd, 0xe0,
+ 0x03, 0xe1, 0xa9, 0x00, 0x0f, 0x00, 0x14, 0x02, 0xef, 0x0b, 0xc0, 0xef,
+ 0x02, 0x14, 0x00, 0xf1,
+ 0x71, 0x11, 0x0c, 0xee, 0xff, 0xdf, 0xff, 0xd3, 0xd6, 0xd0, 0xbe, 0xec,
+ 0xf0, 0xd0, 0xec, 0xe1,
+ 0xd3, 0xc4, 0xa0, 0xe0, 0xf5, 0x30, 0x61, 0x0f, 0x1f, 0xf0, 0xf0, 0xd0,
+ 0xef, 0x10, 0x31, 0x3e,
+ 0x19, 0xf0, 0x80, 0xf3, 0x03, 0x0c, 0x1c, 0x30, 0x34, 0xd1, 0xd2, 0x05,
+ 0xd1, 0xe1, 0xf0, 0xe0,
+ 0xaa, 0xe0, 0x0f, 0x2f, 0x2e, 0x70, 0x54, 0x30, 0xfe, 0xff, 0x03, 0xf4,
+ 0x01, 0xc0, 0xe1, 0xe4,
+ 0xe3, 0xbe, 0x0b, 0x02, 0xe0, 0xed, 0x0f, 0x2f, 0x0f, 0xf4, 0xf7, 0xbd,
+ 0xda, 0xf0, 0x00, 0x93,
+ 0xc1, 0xc1, 0xf0, 0x0d, 0x0d, 0xe1, 0x05, 0xc0, 0xbf, 0xe1, 0xe0, 0xdf,
+ 0x0d, 0x0e, 0x5f, 0x1e,
+ 0xe0, 0xec, 0xd8, 0xee, 0x10, 0x46, 0x31, 0x10, 0xe2, 0x03, 0x00, 0x00,
+ 0x5c, 0x50, 0x21, 0x0f,
+ 0x0e, 0x13, 0x33, 0xfa, 0xbe, 0xe0, 0x02, 0x17, 0x50, 0x50, 0x2f, 0x2d,
+ 0x2f, 0x01, 0x10, 0x22,
+ 0x50, 0x30, 0x20, 0x10, 0x08, 0xfd, 0x2e, 0x30, 0x40, 0x17, 0x31, 0x00,
+ 0xe1, 0xe0, 0xd3, 0xf2,
+ 0xff, 0xfb, 0x4f, 0x60, 0x23, 0x1f, 0x2d, 0x2f, 0x3f, 0x40, 0x17, 0x32,
+ 0x1f, 0x0b, 0x8f, 0x9f,
+ 0x00, 0xd1, 0x02, 0xe2, 0x01, 0xce, 0x0e, 0x0f, 0xdf, 0xef, 0xde, 0x00,
+ 0xc7, 0xe0, 0xc2, 0x02,
+ 0x30, 0x3c, 0x3b, 0x40, 0x01, 0xe1, 0xa1, 0x00, 0x20, 0x30, 0x20, 0x23,
+ 0xf0, 0xde, 0xc9, 0xdf,
+ 0xce, 0xff, 0x00, 0x11, 0xfb, 0xcf, 0x00, 0xb5, 0x02, 0x10, 0x5f, 0x5c,
+ 0x00, 0x12, 0x11, 0x34,
+ 0x12, 0x21, 0x40, 0x1c, 0x0a, 0x0f, 0x20, 0x30, 0x00, 0x6f, 0x51, 0x35,
+ 0x01, 0x04, 0xf0, 0x0e,
+ 0xfd, 0x02, 0x07, 0x13, 0x2e, 0x5c, 0x00, 0x3f, 0x50, 0x23, 0x45, 0x00,
+ 0xf0, 0xe0, 0x0e, 0x11,
+ 0x30, 0x0e, 0xce, 0x07, 0xb3, 0xc1, 0xee, 0x0b, 0x00, 0x7f, 0x42, 0x06,
+ 0xd0, 0xfd, 0x0f, 0x0f,
+ 0x0e, 0x01, 0x33, 0x21, 0x00, 0xcc, 0xed, 0xdf, 0xe1, 0x05, 0xd0, 0xef,
+ 0xcf, 0xcf, 0xde, 0xe0,
+ 0xe1, 0xe0, 0x2d, 0x7f, 0x71, 0x02, 0x1e, 0xf8, 0xfc, 0x01, 0x05, 0x12,
+ 0x22, 0x41, 0x3f, 0x0e,
+ 0x00, 0x03, 0x33, 0x40, 0x3f, 0x41, 0x13, 0x03, 0xf0, 0x1e, 0x28, 0x3a,
+ 0x51, 0x50, 0x43, 0x42,
+ 0x20, 0x0e, 0x10, 0x40, 0x10, 0x30, 0x3f, 0x7c, 0x29, 0x1e, 0x0d, 0x0f,
+ 0x00, 0x04, 0x35, 0x40,
+ 0xf0, 0xdf, 0xe1, 0x02, 0x0f, 0x1d, 0x01, 0x24, 0x65, 0x22, 0x20, 0x30,
+ 0x5b, 0x1f, 0x1f, 0x20,
+ 0x00, 0xde, 0xae, 0xef, 0x01, 0x25, 0x2e, 0x0c, 0xf0, 0x82, 0xd2, 0xf5,
+ 0xe1, 0xfc, 0xed, 0xef,
+ 0x00, 0x02, 0xd2, 0xb1, 0xec, 0xee, 0x0f, 0x41, 0x07, 0x10, 0x01, 0xff,
+ 0x10, 0x60, 0x10, 0x2e,
+ 0x0f, 0x0d, 0xeb, 0xef, 0xf0, 0xc2, 0xdf, 0xcf, 0xe4, 0xa0, 0xde, 0xed,
+ 0x01, 0x30, 0x0d, 0x03,
+ 0xe7, 0xe7, 0x0e, 0x0e, 0x20, 0xf3, 0x93, 0xe2, 0xcd, 0xdb, 0xfe, 0x5d,
+ 0x50, 0x13, 0x04, 0xd2,
+ 0xd4, 0xf0, 0xdd, 0x0f, 0xf2, 0xc5, 0xd0, 0xe5, 0xc3, 0xad, 0xd9, 0x00,
+ 0x21, 0x51, 0x11, 0x41,
+ 0x00, 0xde, 0x0d, 0xf0, 0xf1, 0xd2, 0x04, 0x02, 0x03, 0x8c, 0xee, 0x01,
+ 0xe2, 0xe1, 0xf4, 0x05,
+ 0x60, 0x0e, 0xeb, 0xf1, 0xf1, 0xf0, 0x0f, 0x31, 0x20, 0xec, 0xcf, 0xf3,
+ 0xf3, 0xbb, 0xde, 0xd2,
+ 0xf2, 0xf3, 0x00, 0xdc, 0xc8, 0xff, 0x0e, 0x10, 0x0d, 0xd1, 0x00, 0x12,
+ 0x60, 0x34, 0xe0, 0xe0,
+ 0x7e, 0x50, 0x22, 0x24, 0x03, 0x10, 0x02, 0x00, 0x0e, 0x02, 0x47, 0x37,
+ 0x0f, 0x0c, 0x0f, 0x0f,
+ 0x0f, 0x43, 0x74, 0x32, 0x0f, 0x20, 0x53, 0x2f, 0x3a, 0x6f, 0x2f, 0x1f,
+ 0x00, 0x23, 0x43, 0x31,
+ 0x3a, 0x3f, 0x2f, 0x00, 0x01, 0x03, 0xf3, 0xdf, 0xee, 0x11, 0x75, 0x61,
+ 0x2f, 0x00, 0x03, 0x02,
+ 0x01, 0x4e, 0x2d, 0x2f, 0x30, 0x04, 0x00, 0x19, 0x2e, 0x1d, 0xfc, 0x0f,
+ 0x02, 0x07, 0xc0, 0xe0,
+ 0xee, 0xef, 0xcf, 0xd0, 0xf0, 0xab, 0xdc, 0xfc, 0x30, 0x30, 0x00, 0x45,
+ 0x10, 0x4f, 0xdd, 0x50,
+ 0x72, 0x33, 0x0e, 0xff, 0x10, 0x3f, 0x28, 0x50, 0x1f, 0x00, 0xde, 0xbe,
+ 0xde, 0xee, 0x00, 0x50,
+ 0x1f, 0x23, 0x07, 0xd4, 0xf0, 0x00, 0x00, 0x20, 0x11, 0x16, 0x10, 0x10,
+ 0x1f, 0x0f, 0xab, 0x00,
+ 0x23, 0x32, 0x62, 0x32, 0x20, 0x0f, 0xbf, 0xd0, 0xf1, 0xe1, 0x06, 0x12,
+ 0x0f, 0xee, 0x01, 0xe4,
+ 0xee, 0xed, 0x7f, 0x52, 0x03, 0xf2, 0x0f, 0xd9, 0xe0, 0xfd, 0xc2, 0xf7,
+ 0x03, 0xef, 0xe0, 0xe4,
+ 0x80, 0xdc, 0xe0, 0xe1, 0xf2, 0xd3, 0x06, 0x21, 0xfe, 0xbb, 0x00, 0xf0,
+ 0xed, 0xdf, 0x04, 0xd1,
+ 0x8e, 0xcd, 0xd1, 0xd0, 0xf3, 0x0f, 0xda, 0xcf, 0xce, 0xcc, 0xd0, 0xdd,
+ 0xde, 0xe0, 0xd6, 0xb0,
+ 0xef, 0xf0, 0xff, 0xeb, 0x10, 0x31, 0xe4, 0x90, 0xf3, 0xf6, 0xe0, 0x00,
+ 0xef, 0x1f, 0x10, 0xef,
+ 0xb0, 0xd5, 0xb0, 0xe1, 0x00, 0x10, 0x53, 0xf2, 0xc3, 0xe2, 0xd0, 0xf9,
+ 0xe0, 0x10, 0x63, 0x10,
+ 0x0c, 0x0f, 0x00, 0x1f, 0x0b, 0x10, 0x0f, 0xdd, 0xd0, 0xf1, 0xc4, 0xc0,
+ 0xdd, 0xf0, 0xe4, 0xc4,
+ 0xc3, 0x02, 0x0e, 0x0b, 0x21, 0xf7, 0xb1, 0xd1, 0xcd, 0xea, 0x00, 0x1f,
+ 0x30, 0xd1, 0xa2, 0xf1,
+ 0x00, 0x0e, 0x0c, 0x20, 0xc4, 0xa0, 0xbe, 0xdf, 0x00, 0xfd, 0xdd, 0xed,
+ 0xd2, 0xc3, 0xd2, 0xb1,
+ 0xeb, 0xee, 0xf0, 0x05, 0x40, 0x41, 0x01, 0x16, 0x00, 0xfc, 0xd0, 0x00,
+ 0x01, 0xe1, 0xd0, 0xec,
+ 0xcd, 0x9c, 0xdd, 0xbf, 0x05, 0x04, 0x20, 0x22, 0x00, 0xd0, 0xc2, 0xe1,
+ 0xff, 0x0d, 0xfd, 0xdc,
+ 0xfe, 0x54, 0x57, 0x00, 0x0b, 0x1e, 0x20, 0x52, 0x12, 0x13, 0x20, 0x1d,
+ 0x0d, 0xf2, 0xe4, 0x04,
+ 0xf0, 0x30, 0x5f, 0x2f, 0x00, 0x1e, 0x0d, 0x4e, 0x71, 0x33, 0x27, 0x25,
+ 0x10, 0x1d, 0x3f, 0x20,
+ 0x50, 0x00, 0x0f, 0x01, 0xf2, 0xb7, 0x04, 0xf1, 0x00, 0x3f, 0x3e, 0x71,
+ 0x10, 0x0f, 0x1d, 0x2c,
+ 0x10, 0x20, 0x02, 0x04, 0xf7, 0xc2, 0xff, 0x0d, 0x7b, 0x30, 0xff, 0xc0,
+ 0xf6, 0xd0, 0xd0, 0xfe,
+ 0xdd, 0xef, 0xcf, 0xef, 0xdd, 0x9f, 0xec, 0xd1, 0x26, 0x53, 0x43, 0x1f,
+ 0x00, 0x0e, 0xfe, 0xfe,
+ 0x00, 0x22, 0x01, 0x02, 0x02, 0x1e, 0x4b, 0x73, 0x17, 0x02, 0xe2, 0x12,
+ 0x01, 0x0c, 0x3c, 0x3f,
+ 0x71, 0x37, 0x32, 0x2d, 0x5c, 0x3f, 0x40, 0x40, 0x20, 0x11, 0x43, 0x10,
+ 0x38, 0x1f, 0x30, 0x11,
+ 0x20, 0x1e, 0x12, 0x32, 0x20, 0x30, 0x50, 0x50, 0x45, 0x01, 0x12, 0x2e,
+ 0x2a, 0x3f, 0x4f, 0x40,
+ 0x45, 0x20, 0x1f, 0x1f, 0x00, 0x0e, 0xe1, 0x07, 0x40, 0x40, 0x1e, 0x30,
+ 0xe0, 0xb2, 0x00, 0xcd,
+ 0x00, 0xff, 0x00, 0x1f, 0xfb, 0xcf, 0x00, 0x02, 0x43, 0x11, 0x31, 0x33,
+ 0x32, 0x51, 0x2e, 0x08,
+ 0x00, 0x01, 0xeb, 0xad, 0x00, 0x0f, 0x0e, 0x1b, 0xfe, 0xee, 0x10, 0x56,
+ 0x42, 0x43, 0xfe, 0xdd,
+ 0xf0, 0x03, 0x01, 0x0e, 0x1e, 0x42, 0x76, 0x32, 0x20, 0x20, 0x2e, 0x3a,
+ 0x30, 0x40, 0x11, 0x03,
+ 0x23, 0x45, 0x0e, 0x0d, 0x30, 0x6f, 0x40, 0x11, 0x02, 0xd0, 0x10, 0x7d,
+ 0x2d, 0x16, 0x15, 0x13,
+ 0x10, 0x1a, 0x2f, 0x40, 0x1f, 0xed, 0xdf, 0xd1, 0xa5, 0xe3, 0xd3, 0x0f,
+ 0x3d, 0x5c, 0x00, 0x01,
+ 0xf7, 0xe0, 0xee, 0x00, 0x43, 0x11, 0x10, 0x0f, 0x8c, 0xec, 0xe0, 0x01,
+ 0xf4, 0xe4, 0xd0, 0xff,
+ 0xfd, 0xfd, 0xc0, 0xc0, 0xe4, 0xce, 0xb8, 0xdf, 0xdf, 0xf0, 0x00, 0x30,
+ 0xe2, 0x81, 0xf1, 0xe3,
+ 0x00, 0x1f, 0x00, 0xf0, 0xf4, 0x06, 0x01, 0xf0, 0x0a, 0x2f, 0x01, 0x05,
+ 0x2e, 0x00, 0x16, 0x00,
+ 0x23, 0xe0, 0x9d, 0xc5, 0xd1, 0xdc, 0x8d, 0xc6, 0xa1, 0xd5, 0x05, 0xe8,
+ 0xcc, 0x0f, 0x00, 0x12,
+ 0x21, 0x70, 0x1e, 0x0c, 0xef, 0x61, 0x43, 0x20, 0xf9, 0x0f, 0x0e, 0xcf,
+ 0xdd, 0xdc, 0x00, 0xde,
+ 0x1e, 0x0e, 0x30, 0xd0, 0x8c, 0xe0, 0x00, 0xfa, 0x0f, 0x35, 0x32, 0x20,
+ 0x00, 0xcf, 0xe0, 0xc1,
+ 0x24, 0x03, 0xdf, 0x00, 0x00, 0x73, 0x43, 0xfe, 0xdb, 0x00, 0x22, 0x33,
+ 0x07, 0x06, 0xaf, 0xff,
+ 0xd1, 0xc1, 0xf0, 0xe0, 0x22, 0x61, 0x0e, 0x0f, 0x02, 0x65, 0x01, 0x41,
+ 0x14, 0x02, 0xf0, 0xf1,
+ 0xf5, 0xf1, 0x00, 0xe0, 0x10, 0x0f, 0x0e, 0x00, 0x00, 0x43, 0x0b, 0xeb,
+ 0xf0, 0x10, 0xe0, 0x8d,
+ 0xe5, 0xe3, 0xef, 0xfa, 0x30, 0x7e, 0x3f, 0x0f, 0x01, 0x30, 0x2b, 0x1c,
+ 0x0c, 0xef, 0xff, 0xd2,
+ 0xf2, 0x9e, 0x08, 0x0f, 0x10, 0x0e, 0xcf, 0xc0, 0xee, 0x00, 0x20, 0x1d,
+ 0x7d, 0x2e, 0x2c, 0x0c,
+ 0xee, 0x0b, 0x1f, 0x10, 0xef, 0xbd, 0xed, 0xfe, 0x0c, 0xfc, 0x0e, 0xf0,
+ 0xbf, 0xee, 0xf1, 0x43,
+ 0x3e, 0x18, 0x4f, 0x10, 0xc0, 0xe1, 0x00, 0x2c, 0x2e, 0x5e, 0x1f, 0x12,
+ 0xf6, 0xf2, 0xf0, 0xe0,
+ 0xd0, 0xf1, 0x90, 0xd1, 0xe2, 0xe3, 0x01, 0x0d, 0x0d, 0x1d, 0x3d, 0x6f,
+ 0x35, 0x53, 0xee, 0xb9,
+ 0x10, 0x30, 0x54, 0x30, 0x2e, 0x2f, 0x0d, 0xdc, 0xde, 0x0f, 0x2f, 0x0e,
+ 0x1d, 0x06, 0xb3, 0xbf,
+ 0xdd, 0xc0, 0xf0, 0x0e, 0x09, 0x40, 0x60, 0x02, 0x02, 0x12, 0x0f, 0xfb,
+ 0xe1, 0x15, 0x72, 0x00,
+ 0x1d, 0x0d, 0xeb, 0xcf, 0x0e, 0xe0, 0x04, 0x01, 0xf0, 0xf1, 0xf0, 0xc0,
+ 0xfd, 0xff, 0x02, 0x37,
+ 0x53, 0x01, 0x02, 0xe0, 0xd0, 0x01, 0x00, 0x62, 0x25, 0x37, 0xf1, 0xaf,
+ 0x01, 0xf5, 0x12, 0x41,
+ 0x03, 0xd1, 0xd2, 0xc6, 0xc1, 0xe2, 0xd0, 0x1f, 0x21, 0x32, 0x22, 0x34,
+ 0x56, 0x20, 0x40, 0x50,
+ 0x34, 0x02, 0xf5, 0xd0, 0xe0, 0x22, 0x20, 0x32, 0x72, 0x21, 0xd1, 0xd0,
+ 0x03, 0x1f, 0x2c, 0x1c,
+ 0x1d, 0x9e, 0xe0, 0xe2, 0xe4, 0x01, 0x1d, 0x2d, 0x0f, 0x2e, 0x28, 0xed,
+ 0xfd, 0x10, 0x30, 0x4f,
+ 0x00, 0x1e, 0x78, 0x6e, 0x0e, 0x2f, 0xde, 0xbf, 0xf0, 0x00, 0xe0, 0x0b,
+ 0xfd, 0x1e, 0x50, 0x14,
+ 0xef, 0xdb, 0x0e, 0x3e, 0x2e, 0x5e, 0x32, 0x05, 0xc0, 0xec, 0xef, 0xfe,
+ 0x0e, 0xcf, 0xfe, 0xe0,
+ 0x02, 0xf7, 0x01, 0x30, 0xde, 0xae, 0x00, 0x01, 0x65, 0x12, 0x00, 0xec,
+ 0x00, 0x20, 0x63, 0x26,
+ 0x21, 0xd1, 0xc1, 0xe3, 0xe2, 0x01, 0x24, 0x31, 0x01, 0xa2, 0x00, 0xe3,
+ 0x00, 0x0d, 0xf9, 0xf0,
+ 0x00, 0x03, 0x54, 0x00, 0xce, 0xce, 0x00, 0x0f, 0x51, 0x52, 0x30, 0x20,
+ 0x1e, 0x0b, 0xca, 0x0e,
+ 0xd0, 0x04, 0x02, 0xd0, 0xed, 0x00, 0x00, 0xce, 0xe3, 0x17, 0x67, 0x21,
+ 0x10, 0x21, 0x01, 0xe3,
+ 0x01, 0x63, 0x22, 0x12, 0x03, 0x03, 0x04, 0xc1, 0xd1, 0x02, 0x34, 0x42,
+ 0x01, 0xc3, 0xc7, 0xe1,
+ 0xe3, 0x02, 0x22, 0x01, 0xe3, 0x04, 0xe6, 0xa3, 0xf1, 0xe0, 0x1f, 0x70,
+ 0x73, 0x06, 0xd2, 0x02,
+ 0x01, 0x30, 0x43, 0x04, 0x03, 0xd4, 0xe3, 0xf2, 0xc1, 0xd1, 0xe1, 0xf0,
+ 0xe0, 0xe0, 0xe5, 0x14,
+ 0x53, 0x42, 0x21, 0x00, 0x02, 0x13, 0x36, 0xd1, 0x02, 0xe3, 0xd3, 0x23,
+ 0x71, 0x60, 0x1c, 0x0a,
+ 0x1f, 0x00, 0xc0, 0xf0, 0xf4, 0xf2, 0xf8, 0x0d, 0x0d, 0x10, 0x00, 0xb1,
+ 0xe0, 0xdd, 0xec, 0x0b,
+ 0x7e, 0x41, 0x32, 0x0f, 0xec, 0x1e, 0x29, 0x0f, 0x0f, 0x20, 0x0f, 0x20,
+ 0x01, 0x8e, 0xff, 0xfe,
+ 0xee, 0xfe, 0x0e, 0x2f, 0x40, 0x1d, 0x1e, 0x0c, 0x6c, 0x29, 0x2e, 0x0f,
+ 0xef, 0xbe, 0xee, 0xfc,
+ 0x0d, 0xfe, 0x20, 0x2f, 0x2d, 0x0b, 0xcf, 0xef, 0xaf, 0x0c, 0x0c, 0xfd,
+ 0x2d, 0xfd, 0x00, 0x30,
+ 0x0b, 0xb9, 0x0f, 0x30, 0x70, 0x11, 0x22, 0x20, 0xee, 0xaf, 0xf0, 0xd0,
+ 0xf1, 0xe0, 0x09, 0x0f,
+ 0x5f, 0x0f, 0xce, 0x0d, 0x02, 0x02, 0xe0, 0xfd, 0x0b, 0x0b, 0x3f, 0x3e,
+ 0x40, 0x6d, 0x2e, 0x2d,
+ 0x3f, 0x0f, 0xdf, 0xfd, 0x00, 0x5c, 0x08, 0xeb, 0x00, 0x13, 0xd0, 0xb0,
+ 0x01, 0x00, 0x1d, 0x5f,
+ 0x23, 0x07, 0xc5, 0x00, 0x40, 0x40, 0x3f, 0x22, 0x02, 0x03, 0xe4, 0xf0,
+ 0x00, 0x00, 0x41, 0x02,
+ 0xc2, 0xf6, 0xc1, 0xa1, 0xf0, 0xf4, 0x03, 0x33, 0x13, 0xe3, 0xc7, 0xe2,
+ 0xd1, 0xc1, 0x02, 0xe1,
+ 0x03, 0x02, 0x17, 0x72, 0x43, 0xf2, 0xe3, 0x03, 0x34, 0x13, 0x03, 0xd3,
+ 0xa2, 0xa3, 0xe5, 0xd6,
+ 0x02, 0x30, 0x10, 0x10, 0x42, 0xf2, 0xb1, 0x04, 0x07, 0x10, 0x01, 0x02,
+ 0x21, 0x03, 0x33, 0x61,
+ 0x02, 0x02, 0xf1, 0xe0, 0x12, 0x77, 0x12, 0x00, 0x00, 0x02, 0xcf, 0xfc,
+ 0x00, 0x12, 0x12, 0xf0,
+ 0xc2, 0x03, 0xf3, 0xf0, 0x00, 0x0d, 0x08, 0x4e, 0x7e, 0x10, 0x00, 0xf0,
+ 0x2f, 0x3c, 0x3e, 0xfe,
+ 0xcf, 0xe0, 0xf0, 0xc9, 0xde, 0x0e, 0x2f, 0x3e, 0x31, 0x73, 0x0e, 0x09,
+ 0xdd, 0xef, 0xff, 0x0c,
+ 0x0c, 0x0e, 0x7d, 0x3f, 0xde, 0x98, 0xfe, 0xff, 0x0f, 0x3f, 0x0e, 0x2f,
+ 0xfd, 0xbc, 0x0f, 0x0c,
+ 0xde, 0xfe, 0x0d, 0x4c, 0x3d, 0x1c, 0x0f, 0xf0, 0x00, 0x2b, 0x1e, 0x10,
+ 0x0f, 0xb0, 0xf2, 0x00,
+ 0x2b, 0x5c, 0x3f, 0x30, 0xe1, 0x80, 0xcb, 0x00, 0x2e, 0xfd, 0x0c, 0x0f,
+ 0x0f, 0xce, 0xfc, 0x0c,
+ 0x1e, 0x4e, 0x5d, 0x3d, 0x0c, 0x0e, 0x2e, 0x3c, 0x1b, 0x3c, 0x0d, 0x0f,
+ 0xfe, 0xb0, 0xee, 0xac,
+ 0xea, 0x0f, 0x00, 0x31, 0x00, 0xf0, 0xf0, 0x0a, 0x3f, 0x70, 0x20, 0x33,
+ 0x10, 0x2c, 0x1f, 0xc0,
+ 0xf0, 0xff, 0x00, 0x0b, 0xee, 0x0e, 0x5e, 0x10, 0xef, 0x80, 0xe6, 0x00,
+ 0x0e, 0x20, 0x10, 0xbd,
+ 0xbb, 0xf0, 0xf2, 0xf0, 0xf0, 0x2d, 0x3e, 0x4e, 0x3d, 0x0c, 0x31, 0x07,
+ 0xd2, 0x9f, 0x0f, 0xf3,
+ 0x05, 0x01, 0x00, 0xce, 0xf0, 0xe0, 0xf2, 0x00, 0x0e, 0x0e, 0x10, 0x46,
+ 0x23, 0x05, 0x02, 0xed,
+ 0x0f, 0x70, 0x41, 0x04, 0x05, 0x24, 0x32, 0x40, 0x2e, 0x20, 0x00, 0x01,
+ 0x33, 0x14, 0x80, 0xdc,
+ 0x01, 0xd3, 0xd1, 0xf2, 0x02, 0x34, 0x20, 0xd0, 0xbf, 0x02, 0x01, 0x5c,
+ 0x6f, 0x45, 0x12, 0x0b,
+ 0x0d, 0xed, 0xfc, 0xde, 0x10, 0x0f, 0x0c, 0x0d, 0xcb, 0xdd, 0xef, 0x0f,
+ 0x1e, 0x0a, 0x7f, 0x5e,
+ 0x1f, 0x0f, 0x0f, 0xca, 0xfd, 0x0c, 0x1e, 0x3d, 0x0e, 0xff, 0xfd, 0x0d,
+ 0xfc, 0x1e, 0x2f, 0xae,
+ 0xcc, 0xcd, 0xde, 0xdd, 0x0b, 0x5e, 0x1c, 0x0e, 0x0c, 0xdf, 0x00, 0x34,
+ 0x5e, 0x1b, 0x10, 0x10,
+ 0x03, 0xf0, 0x00, 0x60, 0x22, 0x00, 0xf2, 0x07, 0xd4, 0xa0, 0xfe, 0xe1,
+ 0xf2, 0xf0, 0xf0, 0x00,
+ 0xf2, 0x01, 0xe2, 0xf0, 0x03, 0x32, 0x57, 0x77, 0x21, 0x30, 0x3f, 0xf0,
+ 0xe1, 0x03, 0x34, 0x31,
+ 0x4f, 0x2f, 0xcf, 0xd1, 0xc6, 0xe1, 0xc3, 0xd1, 0xff, 0x0f, 0x00, 0x11,
+ 0x53, 0x37, 0x37, 0x20,
+ 0x00, 0x41, 0x61, 0x21, 0xf0, 0xf0, 0xe3, 0xc0, 0xd0, 0xd0, 0x14, 0x60,
+ 0x41, 0x44, 0x02, 0xd2,
+ 0xd2, 0xb2, 0xf2, 0xe5, 0xf3, 0x03, 0xf4, 0x02, 0x03, 0x00, 0x31, 0x23,
+ 0x23, 0x36, 0x44, 0x06,
+ 0xc2, 0xf2, 0x02, 0x03, 0x14, 0xd1, 0xb3, 0xe2, 0xe3, 0xe5, 0x03, 0xe2,
+ 0x91, 0xf1, 0xf3, 0xe4,
+ 0x46, 0x12, 0xb1, 0xd1, 0xf2, 0xd4, 0x05, 0x32, 0x73, 0x30, 0x33, 0x12,
+ 0x02, 0xf2, 0xf1, 0x11,
+ 0x73, 0x72, 0x34, 0x04, 0xf3, 0xe2, 0xd1, 0x03, 0xf1, 0xf4, 0x10, 0x02,
+ 0xc1, 0xf6, 0xf2, 0xf0,
+ 0x0f, 0x2d, 0x3d, 0x70, 0x17, 0x12, 0x00, 0x1c, 0x0e, 0xf0, 0xbd, 0xff,
+ 0xe0, 0x00, 0xf0, 0x2d,
+ 0x1c, 0x3e, 0x00, 0xa4, 0xd2, 0xde, 0x2e, 0x0f, 0xdc, 0x51, 0x6e, 0x18,
+ 0x0c, 0xff, 0xf0, 0x22,
+ 0x10, 0x1f, 0xe0, 0xe1, 0xf0, 0xcf, 0xfc, 0xff, 0x0e, 0xfd, 0x0d, 0x3d,
+ 0x1d, 0xf9, 0x8c, 0xc0,
+ 0xf0, 0xc1, 0xff, 0x4f, 0x40, 0x1f, 0xfe, 0xf5, 0x16, 0x50, 0x31, 0x20,
+ 0xfe, 0xdb, 0xe0, 0x02,
+ 0x03, 0xe2, 0x8f, 0xf9, 0xff, 0xff, 0xff, 0x01, 0x04, 0x0f, 0xbc, 0xde,
+ 0x1e, 0x7e, 0x3e, 0x1a,
+ 0x0f, 0x2e, 0x0f, 0x0f, 0x1d, 0x2c, 0xfb, 0x0d, 0x3e, 0x1d, 0xae, 0xcb,
+ 0xdf, 0xe0, 0xd0, 0x0d,
+ 0x5f, 0x20, 0x40, 0x0e, 0xcb, 0x0e, 0xee, 0x0d, 0x1a, 0x20, 0x1f, 0x00,
+ 0x7e, 0x4e, 0x1c, 0x1d,
+ 0x1e, 0x0c, 0x0f, 0x02, 0xf2, 0xa1, 0xf0, 0xe0, 0xbb, 0x0f, 0x00, 0x02,
+ 0x00, 0x0e, 0x2f, 0x0e,
+ 0x1f, 0x21, 0x67, 0x27, 0x1f, 0x0e, 0x00, 0xe2, 0xc2, 0xd2, 0xd1, 0xf3,
+ 0x23, 0x60, 0x20, 0x05,
+ 0xd2, 0xa1, 0x0d, 0xec, 0x10, 0x11, 0x25, 0x14, 0xd3, 0xc0, 0xf0, 0xe1,
+ 0x00, 0x22, 0x07, 0x12,
+ 0x14, 0x72, 0x30, 0x2d, 0x0e, 0x00, 0x30, 0x26, 0x32, 0xe1, 0x8e, 0xfe,
+ 0x00, 0xef, 0xd0, 0xe0,
+ 0xd3, 0x04, 0xff, 0x3a, 0x7f, 0x6e, 0x1f, 0xfd, 0xff, 0x00, 0x10, 0xf8,
+ 0xee, 0x1f, 0x0f, 0xdc,
+ 0x1d, 0x3e, 0x3f, 0xdd, 0xbf, 0x12, 0x31, 0x0b, 0xdc, 0xde, 0xff, 0xde,
+ 0x0f, 0x7e, 0x5c, 0x1c,
+ 0x3c, 0x0e, 0xfe, 0xdd, 0x0e, 0x00, 0x51, 0x1a, 0xdc, 0xde, 0xef, 0xf0,
+ 0xc0, 0xff, 0xfb, 0x0c,
+ 0x6d, 0x1e, 0x1c, 0x00, 0xdf, 0xfe, 0xfd, 0x2d, 0x0f, 0xbe, 0x2f, 0x70,
+ 0x6f, 0xfc, 0xec, 0xf3,
+ 0x05, 0x00, 0x0f, 0x2c, 0x00, 0xb0, 0xf0, 0xd5, 0xe4, 0xd0, 0xfe, 0x0e,
+ 0x62, 0x02, 0xfe, 0x0d,
+ 0xfd, 0xfc, 0xfd, 0x0f, 0x5f, 0x40, 0x54, 0x12, 0x1c, 0x0d, 0x0d, 0xc8,
+ 0x08, 0x00, 0xf0, 0xff,
+ 0x00, 0x42, 0x0d, 0x1e, 0x2e, 0x4f, 0x02, 0x02, 0xe1, 0xff, 0xbc, 0xe0,
+ 0xe2, 0x11, 0x5f, 0x2a,
+ 0x6f, 0x1d, 0x0e, 0xfe, 0xeb, 0x0f, 0x13, 0x33, 0x2e, 0x2e, 0x05, 0x81,
+ 0xdf, 0xee, 0xe0, 0xe1,
+ 0x1e, 0x4e, 0x21, 0x27, 0xd1, 0xf1, 0xff, 0x0f, 0x0f, 0x62, 0x17, 0xf4,
+ 0xf3, 0x00, 0xd1, 0x00,
+ 0xe0, 0xfe, 0xe3, 0xb4, 0xd1, 0xe1, 0x20, 0x0d, 0xfb, 0xc2, 0xe7, 0xd3,
+ 0x02, 0x02, 0xc0, 0xb2,
+ 0xf3, 0xf5, 0xe1, 0x44, 0x43, 0x02, 0xb1, 0x02, 0x76, 0x52, 0x10, 0x00,
+ 0x01, 0x03, 0x02, 0xf2,
+ 0x03, 0xf3, 0xd2, 0xf0, 0xf3, 0x05, 0x01, 0x01, 0x07, 0x74, 0x11, 0x0e,
+ 0x2c, 0x00, 0xf2, 0x00,
+ 0x22, 0x60, 0x2b, 0x2e, 0x0f, 0x0e, 0xe0, 0xb0, 0x00, 0x0f, 0x1e, 0xec,
+ 0xdd, 0xef, 0x0f, 0x40,
+ 0x52, 0x01, 0x04, 0xeb, 0xfc, 0x6c, 0x4d, 0x00, 0x00, 0xc0, 0x00, 0xdd,
+ 0x2d, 0x2d, 0x3e, 0x25,
+ 0xfe, 0x89, 0xdf, 0x01, 0x00, 0xda, 0xfe, 0xdb, 0x0f, 0xf0, 0x00, 0xef,
+ 0xa0, 0xde, 0x0d, 0x51,
+ 0x54, 0x11, 0x30, 0x00, 0x0f, 0x09, 0xee, 0xf0, 0x15, 0x01, 0xd1, 0xe1,
+ 0xf0, 0xf0, 0xc0, 0xd0,
+ 0x90, 0xde, 0x01, 0x17, 0x22, 0x00, 0x00, 0x00, 0x63, 0x20, 0x51, 0x22,
+ 0x20, 0x00, 0xc0, 0xcd,
+ 0x00, 0x02, 0xf0, 0x3e, 0x4a, 0x50, 0x00, 0xe2, 0xd0, 0x07, 0x07, 0x22,
+ 0x01, 0x00, 0xf5, 0xc2,
+ 0xd0, 0xc1, 0x11, 0x32, 0x60, 0x52, 0x27, 0x02, 0x01, 0x2f, 0x10, 0x0f,
+ 0xe2, 0xe4, 0xd2, 0xf1,
+ 0xe2, 0xf3, 0xf4, 0xe4, 0xb0, 0xcf, 0xf2, 0x05, 0x01, 0x00, 0xd0, 0x0f,
+ 0x40, 0x63, 0x27, 0x01,
+ 0xa0, 0xe1, 0x00, 0x33, 0x12, 0x04, 0x22, 0xf0, 0xbe, 0xf0, 0xf2, 0xf7,
+ 0xf3, 0xef, 0x0a, 0x00,
+ 0xf0, 0xc2, 0xe4, 0xd3, 0xa1, 0xf0, 0xd1, 0x02, 0x24, 0x42, 0x33, 0x75,
+ 0x32, 0x10, 0x31, 0x13,
+ 0x03, 0xf0, 0xe1, 0xd0, 0x05, 0xf2, 0xb0, 0xff, 0xe1, 0x24, 0xf0, 0x14,
+ 0x37, 0xa0, 0xe0, 0xe0,
+ 0x2d, 0x7f, 0x40, 0x0e, 0x00, 0x01, 0x00, 0xff, 0x1e, 0x60, 0x1b, 0x0e,
+ 0xdf, 0x00, 0x01, 0xe2,
+ 0x0d, 0xf9, 0x5f, 0x1d, 0xf9, 0x0f, 0x30, 0x00, 0xcd, 0xdb, 0x0d, 0x2e,
+ 0x7e, 0x4e, 0x1f, 0xdb,
+ 0xdc, 0x0e, 0x1e, 0x50, 0x0f, 0x0f, 0x0c, 0x0e, 0x0d, 0xb9, 0xde, 0xcd,
+ 0xee, 0xdd, 0x0f, 0x1e,
+ 0x3c, 0xfb, 0x0e, 0xf0, 0xce, 0x10, 0x7c, 0x4f, 0x0e, 0xdf, 0xf0, 0x31,
+ 0x33, 0x3e, 0x4b, 0x2e,
+ 0x0f, 0xe0, 0x81, 0xd0, 0xcc, 0xf0, 0x01, 0xf2, 0x15, 0x51, 0x00, 0x00,
+ 0x0f, 0x0c, 0x0f, 0x20,
+ 0x20, 0x33, 0x03, 0xe5, 0x0f, 0x0a, 0x0e, 0x0d, 0xed, 0x2f, 0x61, 0x42,
+ 0x23, 0xf3, 0xe0, 0xec,
+ 0xf1, 0x27, 0xd4, 0x80, 0xf0, 0xf2, 0x00, 0xf0, 0x51, 0x42, 0x30, 0x10,
+ 0x10, 0xfe, 0x01, 0x16,
+ 0x51, 0x31, 0x22, 0xd4, 0xa0, 0xf1, 0x06, 0x06, 0xd1, 0x00, 0x00, 0xf0,
+ 0xa0, 0xf0, 0xf2, 0xf6,
+ 0x02, 0x01, 0x12, 0x44, 0x12, 0x03, 0x15, 0xd2, 0xb2, 0xe2, 0xe1, 0x03,
+ 0xf5, 0x03, 0x43, 0x52,
+ 0xf3, 0xf3, 0x04, 0x22, 0x24, 0xa1, 0xd5, 0xd3, 0x93, 0xf3, 0xd4, 0xf2,
+ 0x03, 0x13, 0x34, 0x46,
+ 0x44, 0x13, 0x02, 0x01, 0x61, 0x12, 0x01, 0x11, 0x14, 0x03, 0xd2, 0xe0,
+ 0x03, 0x35, 0x02, 0xe1,
+ 0x02, 0xe5, 0xc2, 0xb3, 0x00, 0x12, 0x40, 0x1f, 0x20, 0x50, 0x0f, 0xf0,
+ 0x0e, 0x0d, 0xdb, 0xef,
+ 0xf0, 0x72, 0x20, 0x18, 0xee, 0xef, 0xae, 0xee, 0xfd, 0x01, 0x30, 0x0c,
+ 0xe9, 0x0f, 0x10, 0xff,
+ 0xab, 0x0d, 0x3f, 0x3d, 0x40, 0x00, 0x0e, 0xdd, 0x3d, 0x4b, 0x5d, 0x2d,
+ 0xfc, 0xaf, 0xce, 0x00,
+ 0xfc, 0xfd, 0x29, 0x2f, 0x3f, 0xfe, 0xcd, 0xfe, 0xde, 0xfc, 0xdf, 0x3f,
+ 0x72, 0x21, 0x3e, 0x4d,
+ 0x0c, 0xeb, 0xfc, 0x00, 0x52, 0x00, 0xcf, 0xfe, 0xce, 0xff, 0xeb, 0xf0,
+ 0x02, 0x01, 0x0d, 0x1f,
+ 0x40, 0x30, 0x21, 0x00, 0x0a, 0x0c, 0x0d, 0xab, 0x0e, 0x0e, 0x0c, 0x0d,
+ 0x7d, 0x4d, 0x1a, 0x0d,
+ 0x0e, 0xee, 0xec, 0xff, 0x30, 0x1e, 0xfe, 0x8b, 0xcf, 0xfe, 0xf0, 0x00,
+ 0x2d, 0x1a, 0x6f, 0x0e,
+ 0x3d, 0x1f, 0x10, 0x11, 0x0c, 0xdc, 0x0e, 0x0e, 0x1f, 0x1f, 0x1f, 0xbe,
+ 0xcc, 0xf0, 0x01, 0x20,
+ 0x0a, 0xdd, 0xec, 0xf0, 0x0f, 0x41, 0x72, 0x3f, 0x0b, 0xfe, 0x02, 0xf6,
+ 0xb0, 0xde, 0x01, 0x01,
+ 0x20, 0x3d, 0x7f, 0x40, 0xf2, 0xd4, 0x03, 0x00, 0xdb, 0xfd, 0xf0, 0xc0,
+ 0xe4, 0xf2, 0xd3, 0xff,
+ 0x0f, 0xd5, 0x03, 0x14, 0x74, 0x72, 0x03, 0x02, 0x03, 0xf4, 0xf1, 0x01,
+ 0x21, 0x34, 0x20, 0xfe,
+ 0xe0, 0xe2, 0xc2, 0x00, 0xd1, 0x07, 0x17, 0x42, 0x40, 0xd0, 0x9f, 0xe0,
+ 0xff, 0x20, 0x5f, 0x1a,
+ 0x3f, 0x00, 0xe1, 0x0f, 0x0c, 0x1e, 0x3e, 0xff, 0xe0, 0xc1, 0xc0, 0xfc,
+ 0x3d, 0x6d, 0x09, 0x1d,
+ 0xfc, 0xff, 0xf0, 0xee, 0x0e, 0xca, 0x0e, 0x7f, 0x60, 0x20, 0x0e, 0xe9,
+ 0xde, 0xfd, 0x00, 0x0f,
+ 0xf0, 0x10, 0x20, 0xfb, 0x0f, 0x0e, 0x2e, 0x4e, 0xdd, 0x9b, 0x0e, 0xee,
+ 0x0e, 0xef, 0x0f, 0x2e,
+ 0x1e, 0x4a, 0x3f, 0x20, 0x03, 0x20, 0x71, 0x34, 0x1e, 0xda, 0x9f, 0x00,
+ 0xe2, 0xd0, 0xe0, 0xfe,
+ 0xef, 0x00, 0x13, 0x42, 0x01, 0xc7, 0xf3, 0x14, 0x12, 0x00, 0xd0, 0x01,
+ 0x00, 0x00, 0xd0, 0x13,
+ 0x50, 0x2f, 0x7f, 0x5e, 0x2f, 0x10, 0xf2, 0xf6, 0xd2, 0x11, 0x00, 0xd5,
+ 0x04, 0x04, 0xe3, 0xa0,
+ 0xf1, 0x05, 0x74, 0x01, 0x2f, 0x30, 0x22, 0x17, 0x06, 0xf1, 0x50, 0x41,
+ 0x00, 0x00, 0x02, 0xf2,
+ 0xb3, 0xe1, 0x04, 0xf0, 0xd0, 0xe0, 0x04, 0x11, 0x45, 0x12, 0x05, 0x05,
+ 0x3b, 0x00, 0x3e, 0x00,
+ 0x3c, 0x45, 0x7c, 0x34, 0x73, 0x43, 0x79, 0x31, 0x20, 0x32, 0x77, 0x57,
+ 0x22, 0x21, 0x31, 0x31,
+ 0x53, 0x31, 0x33, 0x63, 0x25, 0x40, 0x23, 0x33, 0x13, 0x12, 0x04, 0x22,
+ 0x23, 0x25, 0x31, 0x12,
+ 0x12, 0xf3, 0xe6, 0xf3, 0x02, 0x43, 0x43, 0x45, 0x33, 0x14, 0x11, 0x10,
+ 0x43, 0x11, 0x32, 0x61,
+ 0x36, 0x12, 0xf2, 0xe1, 0x00, 0x13, 0x23, 0x03, 0xc2, 0xb7, 0xe3, 0xc1,
+ 0xf1, 0xf1, 0x00, 0x50,
+ 0x30, 0x32, 0x10, 0xf1, 0x01, 0xe1, 0x23, 0x04, 0x26, 0x72, 0x73, 0x3f,
+ 0xff, 0xe0, 0xf0, 0x03,
+ 0x02, 0xe1, 0x01, 0xc1, 0xf3, 0x06, 0x40, 0x3f, 0x1b, 0x00, 0x01, 0x00,
+ 0x36, 0x72, 0x32, 0x40,
+ 0x10, 0x1f, 0x3d, 0x30, 0x46, 0x00, 0x0e, 0x41, 0x10, 0x0a, 0xfe, 0xc0,
+ 0xf0, 0xcf, 0xfd, 0xdc,
+ 0x0e, 0x1e, 0x7e, 0x5e, 0x0b, 0x1e, 0x20, 0x11, 0x21, 0x0d, 0x19, 0x1e,
+ 0x0f, 0x0f, 0xfe, 0xef,
+ 0xef, 0xaa, 0xee, 0x0f, 0x11, 0x12, 0xce, 0xbe, 0x00, 0xd0, 0xca, 0xee,
+ 0xe0, 0xdc, 0xbd, 0xfd,
+ 0x0e, 0x0b, 0x0c, 0xfc, 0x1e, 0x2e, 0xde, 0xbe, 0xdf, 0xe0, 0x8e, 0xd8,
+ 0xee, 0xff, 0xef, 0xcd,
+ 0xd0, 0xd0, 0xdc, 0xbe, 0xfc, 0xef, 0xed, 0x00, 0x1e, 0x2e, 0x2d, 0x21,
+ 0xe2, 0xdf, 0xcc, 0xff,
+ 0x1d, 0x7d, 0x4d, 0x00, 0xcd, 0xf9, 0x01, 0x42, 0x0e, 0x3d, 0x30, 0x00,
+ 0xdd, 0xdb, 0x01, 0x00,
+ 0xcf, 0x0e, 0x44, 0x64, 0x14, 0x00, 0x00, 0x3c, 0x1b, 0x0d, 0x20, 0x76,
+ 0x44, 0x00, 0xec, 0x0e,
+ 0x00, 0xfe, 0xfe, 0x00, 0xf3, 0xc0, 0xde, 0xd0, 0xe0, 0xe5, 0xf0, 0xe2,
+ 0x00, 0xc6, 0x82, 0xf1,
+ 0xe2, 0xd0, 0xf0, 0x00, 0x25, 0x34, 0x02, 0x91, 0xd0, 0xd0, 0xe0, 0xd7,
+ 0xd4, 0xe3, 0xd0, 0xd0,
+ 0x02, 0xf2, 0x8f, 0xdf, 0xde, 0xdf, 0xd1, 0xa2, 0xf7, 0x02, 0x00, 0xfa,
+ 0x0f, 0xf0, 0xf0, 0xd2,
+ 0x01, 0xd0, 0xe1, 0xbe, 0xde, 0xe0, 0x00, 0xbd, 0xe9, 0xdf, 0xee, 0xdd,
+ 0x00, 0x5e, 0x0d, 0x0d,
+ 0xce, 0xfd, 0xfb, 0xef, 0x0c, 0x2b, 0x7d, 0x1c, 0x2d, 0x1e, 0x1c, 0xff,
+ 0xcc, 0x0c, 0x0f, 0x0c,
+ 0xae, 0xdb, 0xee, 0xef, 0xce, 0xfd, 0xfc, 0x0e, 0x3f, 0x1f, 0x4f, 0x10,
+ 0xfe, 0xcd, 0x0c, 0x4d,
+ 0xfd, 0xbb, 0xed, 0x00, 0xf3, 0xf0, 0x0b, 0xcd, 0xe0, 0xf2, 0xd4, 0xc2,
+ 0xc2, 0xb2, 0xd0, 0xb1,
+ 0xe1, 0xd1, 0xe0, 0xd9, 0x0f, 0x3f, 0xad, 0xdf, 0xee, 0xef, 0xec, 0x0e,
+ 0x70, 0x10, 0x19, 0x0e,
+ 0xbe, 0xee, 0xf2, 0xf2, 0xed, 0x08, 0xcf, 0xdf, 0xee, 0xd1, 0x00, 0xeb,
+ 0x0e, 0x70, 0x35, 0x00,
+ 0x00, 0xed, 0x00, 0x0d, 0x0f, 0x2f, 0x4e, 0x4f, 0x4e, 0x2c, 0x1d, 0x2c,
+ 0x09, 0x2e, 0x60, 0x34,
+ 0x00, 0xfe, 0x0e, 0xff, 0xee, 0xff, 0x20, 0x60, 0x04, 0x12, 0xf0, 0x0d,
+ 0x02, 0x65, 0x53, 0x20,
+ 0x20, 0x2d, 0x0f, 0x00, 0xdf, 0x1f, 0x00, 0xe3, 0xcf, 0x07, 0xf7, 0xd5,
+ 0xd0, 0x80, 0xe2, 0xd2,
+ 0xf4, 0xd3, 0xd4, 0xf4, 0x11, 0x52, 0x01, 0xf1, 0xe0, 0xe2, 0xf2, 0xe5,
+ 0x04, 0xf4, 0xd2, 0xe2,
+ 0x32, 0x52, 0xf2, 0xb2, 0xd2, 0xe6, 0x02, 0xb2, 0xf1, 0x01, 0x13, 0x20,
+ 0x20, 0x23, 0xd1, 0x9c,
+ 0x0e, 0x71, 0x21, 0x10, 0x00, 0x07, 0x03, 0x00, 0x10, 0x30, 0x1f, 0x09,
+ 0x0e, 0x4f, 0x10, 0x10,
+ 0xff, 0xda, 0x1e, 0x5e, 0x0e, 0x40, 0x51, 0x20, 0x2c, 0x6f, 0x40, 0x3d,
+ 0x1d, 0x3f, 0x1f, 0x1c,
+ 0x3d, 0x10, 0x38, 0xee, 0xee, 0xee, 0x00, 0x20, 0x3f, 0x0a, 0xbd, 0x0f,
+ 0x7f, 0x1e, 0x4f, 0x41,
+ 0x20, 0x0c, 0x00, 0x01, 0xe2, 0x20, 0x3e, 0x6c, 0x3e, 0x30, 0x33, 0x07,
+ 0x04, 0xf0, 0xf2, 0xd2,
+ 0x15, 0x12, 0x02, 0xd1, 0xd4, 0x93, 0xe3, 0x14, 0x75, 0x31, 0x10, 0x00,
+ 0x01, 0x21, 0x20, 0x20,
+ 0x50, 0x34, 0x33, 0x22, 0x03, 0xc1, 0x0f, 0xcf, 0xd0, 0xc3, 0xf2, 0xe7,
+ 0x03, 0xee, 0xfd, 0xc0,
+ 0x03, 0x41, 0x67, 0x25, 0x00, 0xd1, 0xf1, 0x04, 0x20, 0x40, 0x32, 0x20,
+ 0x0f, 0x10, 0x23, 0x25,
+ 0x02, 0x51, 0x3f, 0x4f, 0x33, 0x67, 0x16, 0x0f, 0xce, 0xef, 0xe0, 0xe2,
+ 0x05, 0x52, 0x43, 0x31,
+ 0x31, 0x52, 0x43, 0x20, 0x1f, 0x1e, 0x33, 0x16, 0x63, 0x20, 0x1f, 0x3f,
+ 0x1e, 0x10, 0x03, 0x17,
+ 0xe4, 0xd3, 0xd4, 0xc1, 0xf1, 0x12, 0x70, 0x33, 0x04, 0xd3, 0xf3, 0x06,
+ 0x42, 0x21, 0x22, 0x13,
+ 0xf4, 0xf3, 0x05, 0xf0, 0xc2, 0xd0, 0xd0, 0x01, 0x43, 0xb5, 0xb2, 0xd0,
+ 0xd2, 0xc0, 0xf1, 0x00,
+ 0x1f, 0x0f, 0xc0, 0xdd, 0xed, 0x30, 0x0e, 0xb8, 0xcd, 0xf5, 0xe3, 0xc0,
+ 0xff, 0x0f, 0xef, 0xb0,
+ 0xdc, 0xdd, 0x0e, 0xeb, 0xed, 0xdf, 0xbc, 0xac, 0xed, 0xde, 0xee, 0x00,
+ 0x1c, 0xfc, 0xee, 0x10,
+ 0x52, 0x20, 0x39, 0x3d, 0x3e, 0x0d, 0x1f, 0xa0, 0xdb, 0xbc, 0xee, 0x0d,
+ 0xfb, 0x0d, 0x2e, 0x10,
+ 0xbf, 0xfd, 0xde, 0x2e, 0x3d, 0x0c, 0xdb, 0x0f, 0x00, 0x00, 0xec, 0x0d,
+ 0x7f, 0x5f, 0x10, 0x30,
+ 0x00, 0x0c, 0xde, 0x00, 0x01, 0xe4, 0x02, 0x23, 0xf4, 0x80, 0x9c, 0xff,
+ 0xe1, 0xf5, 0xff, 0xee,
+ 0xef, 0x0f, 0x0f, 0x4a, 0x20, 0x30, 0xfb, 0xae, 0x00, 0x0f, 0xe0, 0xc0,
+ 0xcf, 0xed, 0xed, 0xdc,
+ 0xfc, 0xdb, 0xd0, 0xd0, 0xe3, 0xdd, 0xcd, 0x00, 0x16, 0x31, 0x31, 0x00,
+ 0xdb, 0x9f, 0x00, 0x21,
+ 0x51, 0x31, 0x64, 0x23, 0x30, 0x40, 0x20, 0x30, 0x3b, 0x10, 0x23, 0x37,
+ 0x01, 0xe0, 0x32, 0x5f,
+ 0x30, 0x41, 0x47, 0x12, 0x13, 0x23, 0x25, 0x74, 0x53, 0x20, 0x41, 0x21,
+ 0x33, 0x22, 0x21, 0x31,
+ 0x10, 0x40, 0x25, 0x13, 0x35, 0x02, 0x25, 0x32, 0x21, 0x02, 0x30, 0x43,
+ 0x33, 0x13, 0x64, 0x23,
+ 0x23, 0x12, 0x22, 0x11, 0x57, 0x22, 0x24, 0x31, 0x44, 0x22, 0xf2, 0xe0,
+ 0xf2, 0xe5, 0xd1, 0xd3,
+ 0xf1, 0xe1, 0x92, 0xf2, 0xe2, 0x00, 0x22, 0x42, 0x14, 0x05, 0xb1, 0xe0,
+ 0xf0, 0x2f, 0x50, 0x00,
+ 0x4d, 0x17, 0x12, 0xa0, 0x00, 0x02, 0x00, 0xfb, 0xef, 0x10, 0x02, 0xb0,
+ 0xbc, 0xde, 0xdd, 0xed,
+ 0xf0, 0x30, 0x4e, 0x1c, 0x0e, 0xe0, 0x01, 0x1f, 0x1a, 0x3e, 0x3e, 0xdd,
+ 0x8a, 0xde, 0xff, 0xeb,
+ 0xfe, 0xff, 0x0e, 0x10, 0xe0, 0x8a, 0x0e, 0xee, 0x0d, 0xdc, 0x0d, 0x3d,
+ 0x1f, 0xdd, 0xca, 0x1e,
+ 0x1e, 0x0c, 0x1d, 0x3b, 0x1f, 0xbf, 0xdc, 0x0f, 0x60, 0x10, 0xef, 0xbe,
+ 0xff, 0xbd, 0xde, 0xce,
+ 0xe0, 0xce, 0xd8, 0xdf, 0x0e, 0x1e, 0x0d, 0xfd, 0xdd, 0xbd, 0xf9, 0xef,
+ 0x0f, 0xef, 0xbe, 0xde,
+ 0xeb, 0xdf, 0xcd, 0xbc, 0xee, 0xbc, 0xec, 0xef, 0xdf, 0x00, 0xe0, 0xeb,
+ 0xee, 0xed, 0xc0, 0xb0,
+ 0xf0, 0xdf, 0xdf, 0xec, 0x0d, 0x4d, 0x1e, 0x10, 0x0d, 0xcc, 0xfe, 0xff,
+ 0x0c, 0x20, 0x1d, 0xd9,
+ 0xbf, 0x0e, 0x20, 0x0e, 0xcc, 0xee, 0xcf, 0x01, 0x15, 0x01, 0x12, 0x32,
+ 0x10, 0x20, 0x5d, 0x3d,
+ 0x3d, 0x50, 0x52, 0x4f, 0x08, 0x0c, 0xee, 0x1d, 0x20, 0x0d, 0x0f, 0x43,
+ 0x15, 0xf1, 0x9f, 0xee,
+ 0xcf, 0xef, 0x02, 0x07, 0x01, 0xb0, 0xef, 0x00, 0xe0, 0x00, 0x00, 0x27,
+ 0x24, 0x04, 0xb1, 0xc2,
+ 0xf0, 0xd3, 0xe0, 0xd1, 0xc1, 0xf4, 0xd5, 0x91, 0xe0, 0xe0, 0xc1, 0xe0,
+ 0x02, 0x07, 0x02, 0xa0,
+ 0xd0, 0xe0, 0xef, 0xd0, 0x02, 0x02, 0x10, 0x0c, 0xe0, 0xf1, 0xf7, 0xd1,
+ 0xdf, 0xcd, 0xa0, 0xde,
+ 0xbd, 0xff, 0xee, 0xeb, 0xdb, 0x0f, 0x5f, 0x2f, 0x0f, 0x1d, 0x2e, 0x2d,
+ 0x2d, 0x4f, 0x2a, 0x1c,
+ 0x0f, 0x3e, 0x1d, 0x1c, 0x2c, 0x0c, 0x1d, 0x3d, 0x3d, 0x5d, 0x50, 0x2e,
+ 0x09, 0x0e, 0x3d, 0x2d,
+ 0x3e, 0x5d, 0x0d, 0xfc, 0xcc, 0xfd, 0x0c, 0x7d, 0x7e, 0x2e, 0x1d, 0x1d,
+ 0x10, 0x20, 0x0d, 0x1b,
+ 0x00, 0xd3, 0xd0, 0xe3, 0x06, 0xe0, 0xdd, 0xdd, 0x02, 0x33, 0x01, 0xd6,
+ 0xe4, 0x23, 0x70, 0x71,
+ 0x74, 0x10, 0xf0, 0x01, 0xe5, 0x01, 0xf0, 0xe0, 0x02, 0x12, 0x22, 0x31,
+ 0xe3, 0xc2, 0xe7, 0x12,
+ 0xe0, 0xae, 0x04, 0x05, 0x02, 0x23, 0x61, 0x11, 0x00, 0x21, 0x36, 0x52,
+ 0x24, 0x42, 0x32, 0x22,
+ 0x32, 0x22, 0x21, 0x30, 0x5e, 0x2e, 0x44, 0x27, 0x21, 0x1f, 0x20, 0x24,
+ 0x12, 0x33, 0x76, 0x42,
+ 0x31, 0x01, 0x22, 0x53, 0x10, 0x40, 0x32, 0x34, 0x42, 0x14, 0x33, 0x11,
+ 0x20, 0x10, 0x40, 0x27,
+ 0x44, 0x12, 0x13, 0x14, 0x02, 0xd0, 0x02, 0x42, 0x54, 0x02, 0x45, 0x02,
+ 0xe1, 0x02, 0x12, 0x14,
+ 0x44, 0x34, 0x13, 0x04, 0x01, 0x04, 0x22, 0x02, 0x32, 0x44, 0x11, 0x12,
+ 0x12, 0x43, 0x13, 0x22,
+ 0x03, 0x33, 0x27, 0x24, 0x61, 0x33, 0x30, 0x02, 0x00, 0x71, 0x73, 0x73,
+ 0x04, 0x03, 0x14, 0x00,
+ 0x02, 0x05, 0x00, 0xff, 0x00, 0x02, 0x01, 0x01, 0xf0, 0x1f, 0x41, 0x31,
+ 0x1f, 0x2e, 0x24, 0x03,
+ 0x3f, 0x6f, 0x53, 0x20, 0x3d, 0x30, 0x46, 0x00, 0x2b, 0x0c, 0x2d, 0x0b,
+ 0x20, 0x52, 0x11, 0x1f,
+ 0x1b, 0x0e, 0x1e, 0x4f, 0x1f, 0xfd, 0xcb, 0xed, 0x0d, 0x1f, 0x7f, 0x78,
+ 0x3e, 0x0b, 0xef, 0x0f,
+ 0x00, 0x0f, 0x00, 0xfe, 0x1f, 0x2f, 0x11, 0xe0, 0xb0, 0xdf, 0xcf, 0xdc,
+ 0xd0, 0xf0, 0xff, 0x3d,
+ 0x60, 0x00, 0x1a, 0x11, 0x00, 0xbb, 0xef, 0x00, 0x11, 0x00, 0x0d, 0x08,
+ 0xde, 0xae, 0xcb, 0xff,
+ 0xef, 0xed, 0xbe, 0xdd, 0xde, 0xcd, 0xb9, 0xef, 0xec, 0xdf, 0xee, 0xf0,
+ 0xcd, 0xf0, 0xde, 0xcd,
+ 0xdb, 0x00, 0x21, 0x31, 0x0f, 0x0c, 0xcd, 0xcd, 0xcb, 0xfd, 0x0e, 0x1d,
+ 0x0e, 0xc0, 0xd1, 0xc0,
+ 0xbb, 0xed, 0xfe, 0x02, 0x03, 0x00, 0x0f, 0xc1, 0xfe, 0xe8, 0x1f, 0x70,
+ 0x50, 0x1d, 0x22, 0x12,
+ 0x08, 0xfd, 0x00, 0x1f, 0x30, 0xf0, 0x0e, 0xf1, 0xf2, 0xf2, 0xef, 0xcb,
+ 0xe0, 0xe0, 0xe0, 0x10,
+ 0x51, 0x32, 0x1d, 0x0c, 0xef, 0xe6, 0x17, 0x32, 0x22, 0x81, 0xc0, 0xd2,
+ 0x14, 0x31, 0xd1, 0x20,
+ 0x44, 0x13, 0x05, 0xd2, 0xc0, 0xb0, 0xd2, 0x90, 0xf0, 0xf3, 0xe4, 0xef,
+ 0x00, 0x25, 0x32, 0x01,
+ 0x10, 0x32, 0x01, 0xb0, 0xbf, 0x0f, 0xde, 0x0e, 0xec, 0xdd, 0xa0, 0xd0,
+ 0xef, 0xee, 0xdb, 0xba,
+ 0xde, 0xcd, 0xe0, 0xf5, 0xed, 0xe9, 0x00, 0x10, 0x0d, 0xee, 0xee, 0xaf,
+ 0xee, 0xfd, 0x1e, 0x5b,
+ 0x0d, 0x0b, 0xfe, 0xdd, 0xbe, 0xcd, 0xe0, 0xdf, 0x0f, 0xfc, 0xdc, 0xed,
+ 0xfd, 0x1b, 0xfb, 0xee,
+ 0xbc, 0x0e, 0x0e, 0x5f, 0x72, 0x2f, 0x0c, 0x0e, 0x0e, 0xfe, 0xef, 0x00,
+ 0xd3, 0xe0, 0xbc, 0xf0,
+ 0xd2, 0xe0, 0xcc, 0xfe, 0xe0, 0xd4, 0x01, 0x32, 0x06, 0xb0, 0xbe, 0xf8,
+ 0x0f, 0x20, 0x20, 0x0e,
+ 0xfe, 0xed, 0xbd, 0x90, 0x0e, 0xff, 0xff, 0xfe, 0xf8, 0xc8, 0xdf, 0xb0,
+ 0xe2, 0xed, 0xd9, 0xff,
+ 0xd0, 0xe5, 0xd0, 0xcc, 0xd0, 0xc0, 0xd5, 0x0f, 0x7e, 0x6f, 0x00, 0x03,
+ 0xbf, 0x0c, 0x50, 0x01,
+ 0xf3, 0xde, 0x0b, 0x00, 0x22, 0x32, 0x0e, 0xca, 0xc0, 0x02, 0x13, 0x2f,
+ 0x0e, 0xff, 0xf0, 0x42,
+ 0x4f, 0xde, 0xf1, 0x26, 0x7f, 0x0d, 0xe0, 0xf4, 0x30, 0x7e, 0x0d, 0xe3,
+ 0xe7, 0x22, 0x2f, 0x0e,
+ 0xcd, 0xff, 0x21, 0x56, 0x01, 0xdd, 0xee, 0x21, 0x43, 0x01, 0xc1, 0x0f,
+ 0x4e, 0x20, 0xf7, 0xb4,
+ 0x00, 0x2d, 0x20, 0x01, 0xd4, 0x02, 0x10, 0x4f, 0xff, 0xd1, 0x11, 0x00,
+ 0xdf, 0x80, 0xd1, 0xf4,
+ 0x34, 0x4f, 0x0d, 0xf3, 0x05, 0x70, 0x20, 0x00, 0xb3, 0x0e, 0x1c, 0x0f,
+ 0x14, 0xf7, 0xf1, 0x0c,
+ 0xee, 0xf0, 0xf0, 0x05, 0x70, 0x10, 0xfe, 0x0f, 0x00, 0x10, 0x02, 0xf1,
+ 0xf0, 0x10, 0x50, 0x0e,
+ 0xef, 0xe1, 0x03, 0x4b, 0x09, 0xf0, 0xe0, 0x02, 0x00, 0xfb, 0x11, 0x43,
+ 0x01, 0xed, 0x1c, 0x7f,
+ 0x01, 0xd3, 0xf5, 0x0d, 0x2b, 0x70, 0xf1, 0xd4, 0xe0, 0x0d, 0x3e, 0x50,
+ 0x14, 0x02, 0x00, 0x0f,
+ 0x0c, 0xee, 0x0f, 0x31, 0xe2, 0xc2, 0xf0, 0x0d, 0x6c, 0x60, 0x02, 0xe3,
+ 0xc6, 0x00, 0x30, 0x2f,
+ 0x2f, 0xe2, 0xf1, 0x02, 0x11, 0xe1, 0xa3, 0xf0, 0x0b, 0x00, 0x31, 0x13,
+ 0x46, 0x30, 0x1f, 0x0c,
+ 0xb3, 0xf7, 0x11, 0x00, 0x0e, 0x11, 0x12, 0x0d, 0x8d, 0xe2, 0x07, 0x03,
+ 0x2e, 0x1c, 0x00, 0xc0,
+ 0x20, 0x3d, 0x40, 0x04, 0x07, 0xf0, 0x0c, 0x0d, 0x11, 0x13, 0x34, 0x40,
+ 0x2b, 0x1f, 0x10, 0xb2,
+ 0xd2, 0x01, 0x2e, 0x7c, 0x20, 0x02, 0xd0, 0xdf, 0x21, 0x21, 0x3d, 0x4d,
+ 0x7f, 0x32, 0xf3, 0xa2,
+ 0x0e, 0x0e, 0x06, 0x02, 0xf2, 0xf2, 0x12, 0x7d, 0x0c, 0xff, 0xed, 0x02,
+ 0x07, 0x16, 0x10, 0xfe,
+ 0x0d, 0x40, 0xf2, 0xd4, 0xd5, 0x00, 0x0f, 0x1d, 0x10, 0x54, 0x12, 0x01,
+ 0xc0, 0xe0, 0x00, 0xc0,
+ 0xd0, 0xd1, 0xf4, 0x01, 0x4e, 0x6f, 0x00, 0xd3, 0xe5, 0x13, 0x41, 0x31,
+ 0x23, 0x05, 0xef, 0xbb,
+ 0xf0, 0xf1, 0x06, 0x20, 0x10, 0x0b, 0xa0, 0xf0, 0x00, 0x32, 0x5f, 0x0c,
+ 0xe0, 0xf2, 0xd2, 0x00,
+ 0x0d, 0x2f, 0x1e, 0x0e, 0x1d, 0x30, 0x04, 0xc0, 0xdd, 0x5b, 0x7d, 0x3f,
+ 0x00, 0xbf, 0x0e, 0x0e,
+ 0x01, 0x0d, 0xe8, 0x0f, 0x4f, 0x2f, 0x0e, 0xdc, 0xdd, 0xfd, 0xef, 0xc1,
+ 0xf7, 0x31, 0x7d, 0x2c,
+ 0xf0, 0xd0, 0xf1, 0xf0, 0x00, 0xe0, 0x0f, 0x2b, 0x50, 0x22, 0x01, 0xd2,
+ 0xd2, 0xee, 0xad, 0xe1,
+ 0xf6, 0x12, 0x6f, 0x3d, 0x02, 0xf6, 0x91, 0x01, 0xff, 0xe0, 0x04, 0x15,
+ 0x10, 0x0e, 0x0c, 0xe0,
+ 0x00, 0x26, 0x31, 0x10, 0x0f, 0xde, 0xf1, 0x14, 0x40, 0x21, 0xf0, 0xb1,
+ 0xf0, 0x00, 0xe0, 0xe1,
+ 0x01, 0x7f, 0x7c, 0x2f, 0x00, 0xd0, 0xe5, 0x13, 0x20, 0x1a, 0x0f, 0x30,
+ 0x20, 0xfe, 0xc1, 0xf3,
+ 0x00, 0x4a, 0x5f, 0x30, 0x23, 0x02, 0xfe, 0xfd, 0x00, 0xf0, 0xd4, 0x20,
+ 0x60, 0x4e, 0x3a, 0x2f,
+ 0x1c, 0xf0, 0xc3, 0x05, 0xf0, 0x0e, 0x4c, 0x30, 0x13, 0x06, 0xb0, 0x00,
+ 0x20, 0xe0, 0xe0, 0x00,
+ 0x13, 0x7e, 0x30, 0x23, 0x07, 0xc0, 0xdd, 0xf0, 0xf2, 0x25, 0x72, 0x40,
+ 0x1e, 0xee, 0xd3, 0xf6,
+ 0x03, 0x02, 0x10, 0xe0, 0xce, 0xd1, 0xd3, 0xe2, 0x02, 0x40, 0x61, 0x12,
+ 0xe2, 0xb5, 0x04, 0x22,
+ 0x70, 0x10, 0x07, 0xf4, 0xe1, 0xf0, 0x00, 0x0f, 0x10, 0x3f, 0x1f, 0x10,
+ 0xd2, 0xf0, 0x0c, 0x3d,
+ 0x3d, 0xe0, 0xf3, 0x05, 0x50, 0x1a, 0x00, 0x8e, 0xf0, 0xef, 0x00, 0x50,
+ 0x3f, 0x28, 0x0f, 0xee,
+ 0xb0, 0x03, 0x03, 0x00, 0x48, 0x0f, 0x00, 0xf0, 0xe0, 0x0f, 0xfc, 0x00,
+ 0x00, 0xe0, 0xde, 0x0f,
+ 0x7e, 0x2f, 0x00, 0xe5, 0xcf, 0xdc, 0xd0, 0x00, 0x50, 0x51, 0x20, 0xee,
+ 0xcc, 0x00, 0xf0, 0x03,
+ 0x14, 0xf0, 0x0f, 0x0b, 0x2e, 0xf0, 0xf3, 0x03, 0x02, 0x0f, 0xae, 0xe3,
+ 0xb2, 0xf0, 0xfd, 0x02,
+ 0x02, 0xd0, 0xef, 0xec, 0xce, 0xee, 0xf0, 0x5d, 0x4a, 0x11, 0x17, 0xe7,
+ 0xd1, 0xff, 0xcf, 0xe0,
+ 0xd0, 0x00, 0x2f, 0x00, 0xf2, 0xb0, 0xfe, 0x08, 0x0d, 0x30, 0x23, 0x6f,
+ 0x2c, 0xfb, 0x8f, 0x00,
+ 0xe0, 0xf2, 0x1e, 0x2a, 0x3f, 0x30, 0x0f, 0xde, 0xcf, 0xde, 0x02, 0x04,
+ 0x0f, 0x4a, 0x4f, 0x2f,
+ 0x01, 0xf3, 0x2e, 0xec, 0xad, 0x0f, 0xdf, 0x30, 0x30, 0x1f, 0x2b, 0xde,
+ 0xaf, 0xe0, 0xe6, 0xc2,
+ 0x0f, 0x5d, 0x3d, 0x20, 0xb5, 0xe0, 0xe2, 0x00, 0x1e, 0x01, 0x00, 0x00,
+ 0xed, 0x00, 0xab, 0x01,
+ 0x4e, 0xd6, 0x72, 0xf3, 0x15, 0xdc, 0x30, 0xef, 0xc3, 0xe4, 0x35, 0x72,
+ 0x71, 0x33, 0x14, 0x04,
+ 0xf3, 0xe2, 0xf1, 0x02, 0xf2, 0xe4, 0xb3, 0xb0, 0xd0, 0xd1, 0xd0, 0xfe,
+ 0x0c, 0x1e, 0x10, 0x22,
+ 0x52, 0x3f, 0x3d, 0x11, 0x17, 0x07, 0x22, 0x50, 0x3f, 0x1e, 0x00, 0xc0,
+ 0xdd, 0xec, 0x2b, 0x7d,
+ 0x3d, 0x2b, 0x0e, 0xed, 0xff, 0xf0, 0xfe, 0x0c, 0xec, 0xed, 0xed, 0x2d,
+ 0x7c, 0x4e, 0x2d, 0x0c,
+ 0x0d, 0x1d, 0x3f, 0x70, 0x30, 0x30, 0x3f, 0x0d, 0x00, 0x00, 0x0e, 0x1d,
+ 0x2d, 0x2d, 0x0e, 0xdc,
+ 0xcc, 0xef, 0xf3, 0xe7, 0xd1, 0xc2, 0xd1, 0xe1, 0xf1, 0x14, 0x74, 0x24,
+ 0x05, 0xb3, 0xd3, 0xc2,
+ 0xe3, 0xe4, 0x04, 0x13, 0x33, 0x33, 0x35, 0x13, 0xf4, 0xd3, 0xe2, 0xd2,
+ 0x03, 0xd7, 0x83, 0xa1,
+ 0xd0, 0xa1, 0xe0, 0xc1, 0xf2, 0xf0, 0x0f, 0x0e, 0x0e, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x21, 0x32, 0x40,
+ 0x1d, 0x0c, 0xee, 0xc1, 0xf7, 0xe3, 0xf0, 0xfc, 0x1d, 0x4a, 0x4e, 0x2d,
+ 0x0f, 0x0f, 0x0c, 0x2c,
+ 0x5e, 0x4f, 0x30, 0x3e, 0x5e, 0x3c, 0x3d, 0x0c, 0x0d, 0xff, 0x00, 0x10,
+ 0x61, 0x40, 0x40, 0x10,
+ 0x06, 0x03, 0x11, 0x30, 0x60, 0x3f, 0x30, 0x20, 0x11, 0x10, 0x21, 0x26,
+ 0x11, 0x01, 0x01, 0x07,
+ 0x03, 0x52, 0x51, 0x32, 0x15, 0xf5, 0xb4, 0xd2, 0xc1, 0xe1, 0x01, 0x03,
+ 0x07, 0xe2, 0xf1, 0x11,
+ 0x41, 0x32, 0x23, 0x13, 0x13, 0x12, 0x23, 0x13, 0xe3, 0x82, 0x83, 0xd2,
+ 0xd0, 0xee, 0xe9, 0xfc,
+ 0xed, 0xdb, 0xde, 0xff, 0x00, 0x3e, 0x2d, 0x4e, 0x2f, 0x21, 0x06, 0x03,
+ 0xf3, 0xf1, 0xd0, 0xb0,
+ 0xe0, 0xef, 0x3c, 0x5c, 0x2d, 0x0b, 0xcd, 0xdd, 0xde, 0xee, 0x0e, 0x0d,
+ 0x39, 0x0e, 0xdd, 0xcc,
+ 0xdd, 0x0d, 0x6d, 0x4f, 0x1e, 0x1c, 0x3d, 0x6d, 0x3f, 0x21, 0x22, 0x31,
+ 0x3e, 0x3d, 0x4f, 0x3f,
+ 0x3d, 0x4a, 0x4d, 0x1f, 0x00, 0xc2, 0xdd, 0xd9, 0xfd, 0x0e, 0x4f, 0x30,
+ 0x20, 0x0e, 0xee, 0xbf,
+ 0xd0, 0x90, 0xe2, 0xd4, 0xf1, 0xf1, 0xe5, 0xc5, 0xc2, 0xe1, 0xf3, 0x26,
+ 0x52, 0x23, 0x11, 0x12,
+ 0x12, 0x16, 0x05, 0xb3, 0xb1, 0xd1, 0xd0, 0xdf, 0xdf, 0xde, 0xb0, 0xee,
+ 0xee, 0x0b, 0x0d, 0x2b,
+ 0x2d, 0x3e, 0x1f, 0x00, 0xf0, 0xff, 0xd1, 0xc2, 0xd2, 0xf0, 0x20, 0x5e,
+ 0x1c, 0x1c, 0xfb, 0xcc,
+ 0xde, 0xcf, 0x00, 0x3f, 0x7b, 0x2e, 0x1e, 0x0f, 0xff, 0x0f, 0x4c, 0x5e,
+ 0x2f, 0x1f, 0x10, 0x1c,
+ 0x3e, 0x50, 0x36, 0x25, 0x02, 0x01, 0xf0, 0x10, 0x60, 0x40, 0x31, 0x12,
+ 0x00, 0xfd, 0xfe, 0x0e,
+ 0x2f, 0x1e, 0x40, 0x40, 0x61, 0x20, 0x14, 0x16, 0x03, 0xf3, 0xe7, 0xe3,
+ 0xd2, 0xd1, 0xd1, 0xa2,
+ 0xd5, 0xa5, 0xe3, 0xf1, 0x02, 0x41, 0x22, 0x13, 0x15, 0x14, 0x13, 0x03,
+ 0x03, 0xe1, 0xb2, 0xc3,
+ 0xc4, 0xd1, 0xc0, 0xd0, 0xc0, 0xd0, 0xef, 0xfb, 0x0d, 0x2d, 0x41, 0x26,
+ 0x12, 0x00, 0x02, 0x03,
+ 0x07, 0x22, 0x32, 0x60, 0x11, 0x11, 0x10, 0x1f, 0x1c, 0x2d, 0x0f, 0x0f,
+ 0xfd, 0xfb, 0x0c, 0x3d,
+ 0x4d, 0x1e, 0x0e, 0xdc, 0xda, 0xed, 0x1c, 0x7d, 0x5e, 0x1f, 0x0f, 0x0e,
+ 0x4d, 0x4f, 0x10, 0x00,
+ 0x20, 0x5f, 0x5d, 0x4f, 0x20, 0x0f, 0x0b, 0x00, 0xef, 0xfc, 0x0e, 0x1a,
+ 0x3d, 0x2c, 0x0d, 0xed,
+ 0xff, 0x10, 0x2f, 0x1d, 0x0d, 0xec, 0xdd, 0x9e, 0xb1, 0xc5, 0xb0, 0xd0,
+ 0xe0, 0xf0, 0x00, 0x34,
+ 0x25, 0x13, 0x05, 0x02, 0x04, 0x13, 0x11, 0xf3, 0xb7, 0xb3, 0xd3, 0xc1,
+ 0xc2, 0xd1, 0xb3, 0xe3,
+ 0xe2, 0x00, 0x10, 0x2f, 0x0f, 0x00, 0xe0, 0xd0, 0xd0, 0x06, 0x25, 0x12,
+ 0xf1, 0xb1, 0xf0, 0x01,
+ 0x51, 0x20, 0x00, 0x0b, 0x0c, 0x1c, 0x4e, 0x5e, 0x4f, 0x2f, 0x2c, 0x2e,
+ 0x2e, 0x2c, 0x4b, 0x3d,
+ 0x7d, 0x1e, 0x2e, 0x1e, 0x0d, 0x2c, 0x0e, 0x1f, 0x10, 0x20, 0x50, 0x3f,
+ 0x3e, 0x2d, 0x0d, 0x02,
+ 0x17, 0x02, 0xfc, 0xeb, 0x4e, 0x5f, 0x0e, 0x01, 0x05, 0x11, 0x00, 0x20,
+ 0x41, 0x13, 0x36, 0x23,
+ 0xc2, 0x92, 0xc2, 0xc1, 0xd4, 0xc1, 0xce, 0xe0, 0xf6, 0x14, 0x13, 0x01,
+ 0x04, 0x03, 0x12, 0x00,
+ 0x00, 0x37, 0x44, 0x02, 0xb2, 0x80, 0xce, 0xdc, 0xdf, 0x16, 0x23, 0xf0,
+ 0xe0, 0xff, 0xfd, 0x00,
+ 0x01, 0x03, 0x02, 0x20, 0x10, 0x20, 0x52, 0x47, 0x32, 0x00, 0xec, 0xcc,
+ 0x51, 0x77, 0x10, 0xee,
+ 0x0f, 0x10, 0x0f, 0x1f, 0x00, 0x0f, 0xfd, 0x0f, 0x60, 0x1d, 0x1a, 0x0e,
+ 0x1e, 0x0e, 0x0e, 0x20,
+ 0x2e, 0x0b, 0x3f, 0x4f, 0x2f, 0x1e, 0x0c, 0x2e, 0x73, 0x55, 0x00, 0x0e,
+ 0xec, 0x0e, 0x30, 0x11,
+ 0xed, 0xde, 0x45, 0x54, 0x00, 0xfd, 0xff, 0x00, 0x01, 0x02, 0xe0, 0xe0,
+ 0xe0, 0xa0, 0xd0, 0xf5,
+ 0x03, 0xdf, 0xcb, 0xf1, 0x26, 0x00, 0xbf, 0x10, 0x42, 0x12, 0x23, 0x15,
+ 0xf0, 0xd0, 0xb3, 0xe3,
+ 0xe6, 0xf2, 0xc1, 0xd1, 0xa0, 0xe0, 0x02, 0x01, 0x01, 0x22, 0x01, 0xff,
+ 0xdc, 0xca, 0x11, 0x77,
+ 0x31, 0x00, 0xf0, 0xde, 0xf0, 0x11, 0x00, 0xff, 0x10, 0x11, 0xf0, 0x32,
+ 0x22, 0x00, 0xbc, 0xba,
+ 0x0e, 0x71, 0x10, 0x0d, 0x1e, 0x20, 0x0e, 0xfa, 0xdd, 0x0e, 0x20, 0x51,
+ 0x0d, 0xfb, 0x00, 0x21,
+ 0x22, 0x1f, 0xdb, 0xac, 0x0f, 0x32, 0x21, 0xee, 0x0e, 0x30, 0x31, 0x00,
+ 0xef, 0xfd, 0x50, 0x3d,
+ 0x61, 0x27, 0xff, 0x00, 0x24, 0xed, 0xf0, 0x14, 0xb0, 0xc0, 0x27, 0xf1,
+ 0xaf, 0xff, 0xcd, 0x00,
+ 0x36, 0x11, 0x20, 0x42, 0x00, 0xfe, 0x14, 0x02, 0xcf, 0x00, 0x05, 0xe0,
+ 0xe1, 0xe1, 0xc0, 0xc0,
+ 0xdf, 0xbc, 0x13, 0x26, 0xef, 0xdf, 0x01, 0x12, 0x10, 0x1f, 0x00, 0xd0,
+ 0x04, 0x74, 0x41, 0x0f,
+ 0xd9, 0x51, 0x77, 0x00, 0xef, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0xfd, 0xcb, 0x10, 0x22,
+ 0xef, 0xec, 0x30, 0x50, 0xfd, 0xec, 0x20, 0x51, 0x0e, 0x0e, 0x21, 0x0f,
+ 0xfa, 0x20, 0x72, 0x0f,
+ 0xb9, 0x00, 0x33, 0x11, 0xdd, 0xee, 0x11, 0x31, 0x00, 0x0f, 0xfd, 0x00,
+ 0x54, 0xfe, 0xef, 0x11,
+ 0xfe, 0xdb, 0x22, 0x03, 0x90, 0xde, 0xee, 0xe0, 0x14, 0x14, 0xef, 0xff,
+ 0x10, 0x10, 0x54, 0x12,
+ 0x02, 0x47, 0x01, 0xc0, 0xc0, 0xf2, 0x05, 0x13, 0x13, 0xc0, 0x8c, 0xf0,
+ 0x02, 0x00, 0x0f, 0x00,
+ 0x12, 0x13, 0xfe, 0xd8, 0x12, 0x54, 0xee, 0xee, 0x11, 0x21, 0x31, 0x11,
+ 0xde, 0xe0, 0x14, 0x00,
+ 0xde, 0x40, 0x75, 0x00, 0x0e, 0xfd, 0xfc, 0x0f, 0x63, 0x12, 0xf8, 0xff,
+ 0x20, 0x40, 0x0d, 0x0d,
+ 0x00, 0x41, 0x21, 0xfc, 0xdc, 0x0e, 0x73, 0x56, 0x0f, 0xec, 0x00, 0x21,
+ 0x0f, 0x00, 0x43, 0x00,
+ 0x0d, 0xfc, 0x10, 0x54, 0x0f, 0xfd, 0x35, 0x32, 0x00, 0x0e, 0x22, 0x11,
+ 0xd0, 0x9e, 0x04, 0x17,
+ 0xe0, 0xae, 0x01, 0x02, 0xf1, 0x24, 0x33, 0x0f, 0xde, 0x12, 0x37, 0x00,
+ 0xa0, 0x00, 0x14, 0x00,
+ 0xd1, 0xd0, 0xc1, 0xe0, 0xc0, 0xf0, 0xf0, 0xbe, 0x01, 0x12, 0xeb, 0xf0,
+ 0x05, 0xe0, 0xde, 0x32,
+ 0xe0, 0xcc, 0x72, 0x34, 0x0f, 0x0f, 0x12, 0x46, 0x00, 0xdd, 0xfe, 0x1f,
+ 0x73, 0x00, 0xfb, 0xee,
+ 0x00, 0x54, 0x0d, 0xda, 0x0f, 0x00, 0x0f, 0xfe, 0xfd, 0xfd, 0xee, 0x10,
+ 0x72, 0x00, 0xf9, 0xfe,
+ 0x10, 0x40, 0x11, 0x00, 0x00, 0xf0, 0xff, 0x0e, 0x42, 0x22, 0xcc, 0xcc,
+ 0xff, 0x33, 0x52, 0x0e,
+ 0xeb, 0x10, 0x23, 0x0e, 0x0f, 0x44, 0x00, 0xbe, 0xf2, 0xf6, 0xd0, 0xbf,
+ 0xf0, 0x13, 0xff, 0xdc,
+ 0x00, 0x23, 0x54, 0x12, 0xfe, 0xde, 0x16, 0x22, 0x22, 0x25, 0xb0, 0x9e,
+ 0x02, 0x06, 0xe0, 0xcd,
+ 0x00, 0x00, 0xde, 0xf0, 0x00, 0x00, 0xf0, 0xdb, 0xef, 0x41, 0x30, 0x0d,
+ 0x2e, 0x74, 0xec, 0xdb,
+ 0x55, 0x43, 0xfe, 0xcc, 0xff, 0x33, 0x11, 0xed, 0x00, 0x11, 0x00, 0x0c,
+ 0x0f, 0x1e, 0x20, 0x0c,
+ 0x2f, 0x73, 0x1e, 0xe9, 0x00, 0x73, 0x22, 0x0e, 0xda, 0x10, 0x54, 0x00,
+ 0xde, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0xab, 0x00, 0x44, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x20,
+ 0x10, 0x77, 0x22, 0xf0,
+ 0xee, 0x00, 0xf2, 0xc0, 0x02, 0x16, 0xf0, 0xd0, 0xe0, 0xe0, 0x02, 0x11,
+ 0xde, 0x20, 0x77, 0x53,
+ 0xed, 0xee, 0x13, 0x46, 0xf0, 0xcf, 0xf0, 0x13, 0xf0, 0xcd, 0x11, 0x03,
+ 0xcc, 0xdf, 0x02, 0xef,
+ 0xdf, 0x02, 0xef, 0xed, 0x13, 0x24, 0x00, 0xcc, 0xfd, 0x32, 0x77, 0x01,
+ 0x11, 0x11, 0x10, 0x20,
+ 0xfe, 0xac, 0x15, 0x44, 0x00, 0xfd, 0xfe, 0x00, 0x0f, 0xec, 0xff, 0x10,
+ 0x30, 0x1c, 0xda, 0xee,
+ 0x50, 0x72, 0x20, 0x0e, 0x2f, 0x0d, 0xea, 0x10, 0x73, 0x21, 0x0d, 0x0f,
+ 0x10, 0x11, 0x0f, 0xec,
+ 0xdc, 0x00, 0x63, 0x20, 0xfa, 0xed, 0x2f, 0x50, 0x10, 0x11, 0x21, 0x0d,
+ 0xf0, 0x00, 0xdd, 0xcb,
+ 0x01, 0x12, 0xdf, 0xc0, 0x03, 0x14, 0xfd, 0xc8, 0x20, 0x72, 0x24, 0x00,
+ 0x02, 0x14, 0xf0, 0xf2,
+ 0x02, 0x03, 0xf1, 0xd3, 0xb1, 0xe3, 0x05, 0xe2, 0xb0, 0xe2, 0xe2, 0xe2,
+ 0x37, 0xf0, 0x8d, 0xef,
+ 0x26, 0x32, 0xef, 0xf0, 0x00, 0x00, 0x31, 0x32, 0x00, 0xe0, 0xf1, 0xbf,
+ 0x0f, 0x77, 0x01, 0xed,
+ 0x0f, 0x44, 0x21, 0xfe, 0xfd, 0xff, 0x41, 0x21, 0xd8, 0xff, 0x30, 0x40,
+ 0x20, 0x60, 0x10, 0x0e,
+ 0x0e, 0x00, 0x10, 0x0e, 0x40, 0x0a, 0xbc, 0x11, 0x34, 0x00, 0x0e, 0xdb,
+ 0xcd, 0x40, 0x43, 0x1f,
+ 0x31, 0x41, 0xfd, 0xfc, 0x00, 0x11, 0x14, 0xde, 0xce, 0x00, 0xe0, 0xb0,
+ 0xf3, 0xf5, 0xe0, 0xff,
+ 0x43, 0x23, 0x98, 0xff, 0x37, 0x10, 0xd0, 0x00, 0x00, 0xb0, 0x01, 0x03,
+ 0x00, 0x13, 0x01, 0xae,
+ 0xf0, 0xe2, 0xc0, 0xf0, 0x06, 0x12, 0xce, 0xde, 0x03, 0x05, 0x00, 0xff,
+ 0x42, 0x00, 0xab, 0x01,
+ 0x24, 0x21, 0x00, 0x01, 0x11, 0x00, 0xfe, 0x00, 0x00, 0x40, 0x31, 0x21,
+ 0x1f, 0x0b, 0x0e, 0x4f,
+ 0x1d, 0xc8, 0x0e, 0x70, 0x20, 0xeb, 0xdd, 0x30, 0x50, 0x0d, 0x1f, 0x40,
+ 0x1f, 0x40, 0x2e, 0xf8,
+ 0xef, 0x20, 0x31, 0x00, 0x00, 0xfd, 0x0f, 0x72, 0x0e, 0xda, 0x43, 0x21,
+ 0xba, 0x00, 0x52, 0xff,
+ 0xdc, 0x11, 0x35, 0x00, 0x9e, 0xee, 0x00, 0x13, 0x00, 0xff, 0xed, 0xfe,
+ 0x0f, 0x0e, 0x01, 0x25,
+ 0xf0, 0xc0, 0x00, 0x02, 0x23, 0xf2, 0xb0, 0x06, 0x12, 0xd0, 0xcf, 0x25,
+ 0x55, 0xef, 0x9d, 0xff,
+ 0x12, 0x13, 0xff, 0xee, 0x00, 0xfe, 0x22, 0x21, 0xee, 0x15, 0x12, 0xdd,
+ 0xef, 0x44, 0xde, 0x9c,
+ 0x03, 0x12, 0x36, 0x32, 0xcd, 0xdc, 0x00, 0x11, 0x10, 0x00, 0x0e, 0x0e,
+ 0x40, 0x30, 0x10, 0xfa,
+ 0x10, 0x30, 0x0d, 0x2f, 0x60, 0xc8, 0xff, 0x74, 0x31, 0xfe, 0xbc, 0xfe,
+ 0x12, 0x45, 0x0f, 0xee,
+ 0x00, 0xed, 0xff, 0x77, 0x21, 0xfe, 0x00, 0x20, 0x0f, 0x0f, 0x23, 0x10,
+ 0xee, 0x00, 0x01, 0xb0,
+ 0x04, 0x01, 0xcd, 0x01, 0x46, 0x00, 0xcd, 0xed, 0x13, 0x22, 0x00, 0x43,
+ 0x25, 0x00, 0xff, 0xde,
+ 0x56, 0x22, 0xce, 0x00, 0x01, 0xe0, 0xf2, 0xe2, 0xd1, 0xad, 0xf0, 0x16,
+ 0xef, 0xbc, 0x02, 0x23,
+ 0x00, 0x10, 0x23, 0x0f, 0xdd, 0x01, 0x45, 0x32, 0x01, 0x00, 0x47, 0x12,
+ 0xe0, 0x01, 0xef, 0x8a,
+ 0xf0, 0x33, 0x22, 0x00, 0x20, 0xec, 0xac, 0x0f, 0x00, 0x00, 0x0e, 0x30,
+ 0x2f, 0xfa, 0xdd, 0x0f,
+ 0x40, 0x42, 0x10, 0xc9, 0x0f, 0x30, 0x00, 0xe0, 0x53, 0x10, 0xde, 0xfd,
+ 0x0f, 0x20, 0x43, 0x40,
+ 0x2e, 0x1a, 0x2e, 0x20, 0x41, 0x33, 0x00, 0xce, 0xbc, 0x00, 0xf3, 0xe0,
+ 0xef, 0xdd, 0xa8, 0xf0,
+ 0x22, 0x12, 0xcc, 0x00, 0x11, 0xde, 0xcd, 0x14, 0x67, 0x01, 0x22, 0x11,
+ 0xdf, 0xce, 0xf0, 0x03,
+ 0x36, 0x02, 0xcf, 0xc0, 0xe0, 0xe0, 0xd0, 0x22, 0x76, 0x00, 0xdf, 0xff,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x23, 0x12, 0x00, 0xcc, 0x8a, 0x00, 0x36, 0x21, 0xf0, 0xff, 0xe0, 0x0f,
+ 0x0f, 0x41, 0x21, 0xee,
+ 0xdd, 0x10, 0x76, 0xfe, 0xc9, 0xff, 0x30, 0x30, 0x00, 0x0f, 0x10, 0x60,
+ 0x21, 0x0e, 0xfd, 0x0e,
+ 0x0f, 0x0f, 0xfe, 0x00, 0x22, 0x10, 0x0f, 0xfc, 0x30, 0x72, 0x2e, 0x2c,
+ 0x42, 0x0d, 0xfa, 0x01,
+ 0x55, 0x22, 0x00, 0xef, 0xe0, 0x35, 0x23, 0x9f, 0xef, 0x02, 0x01, 0xdf,
+ 0x05, 0x13, 0xf0, 0xf1,
+ 0x01, 0x13, 0x36, 0xe0, 0xb0, 0x44, 0x54, 0x00, 0xe0, 0xf1, 0x01, 0xf2,
+ 0xf3, 0xd1, 0xbf, 0xde,
+ 0xce, 0x05, 0x26, 0xf0, 0xdf, 0xdf, 0x12, 0x22, 0xbf, 0x00, 0x42, 0x0e,
+ 0x00, 0x33, 0x13, 0x03,
+ 0x36, 0x10, 0x10, 0x1f, 0xdd, 0xdf, 0x77, 0x52, 0x0f, 0x0e, 0xec, 0xfe,
+ 0x00, 0x0f, 0xfc, 0x0e,
+ 0xea, 0x0f, 0x70, 0x20, 0xeb, 0xee, 0x70, 0x20, 0x0c, 0x0f, 0x20, 0x21,
+ 0x10, 0xbd, 0xb9, 0x00,
+ 0x32, 0x33, 0x0f, 0x0f, 0x0e, 0xeb, 0x20, 0x62, 0x0f, 0xfd, 0x22, 0x22,
+ 0xde, 0xff, 0x03, 0xf0,
+ 0xcd, 0xf0, 0x47, 0x01, 0xdf, 0x00, 0xce, 0xf0, 0x00, 0xfe, 0xf0, 0x26,
+ 0xe1, 0xb0, 0x02, 0x13,
+ 0x02, 0xe1, 0x05, 0x34, 0x90, 0xad, 0x01, 0x27, 0x02, 0xbe, 0xf0, 0x01,
+ 0x00, 0xfe, 0x01, 0x15,
+ 0x00, 0xff, 0x00, 0x10, 0x53, 0x01, 0xfe, 0xdc, 0x00, 0x03, 0xcd, 0x00,
+ 0x55, 0x10, 0x11, 0x23,
+ 0xee, 0xd9, 0x61, 0x32, 0x0f, 0xec, 0x00, 0x42, 0x0f, 0xfd, 0x0f, 0x43,
+ 0x0f, 0xb8, 0x0f, 0x30,
+ 0x0f, 0xfd, 0x31, 0x11, 0xcd, 0xcc, 0x00, 0x56, 0x32, 0xde, 0xbb, 0x0f,
+ 0x32, 0x20, 0x0f, 0x20,
+ 0x2f, 0x1f, 0x0e, 0x40, 0x31, 0x31, 0x0e, 0xde, 0x46, 0x12, 0x12, 0x11,
+ 0x8c, 0xed, 0x01, 0x26,
+ 0x10, 0x01, 0x00, 0xdf, 0x0f, 0xff, 0xee, 0x35, 0x43, 0x00, 0x75, 0x31,
+ 0xde, 0xae, 0x01, 0x04,
+ 0x01, 0x01, 0xe2, 0xcf, 0xcd, 0xe0, 0xe2, 0xf4, 0x04, 0xd0, 0xcc, 0xdd,
+ 0x47, 0x23, 0xad, 0xfe,
+ 0x14, 0x23, 0xff, 0xef, 0xff, 0x02, 0x36, 0x00, 0xcf, 0xee, 0x22, 0x77,
+ 0x22, 0xef, 0xee, 0x10,
+ 0xef, 0xbd, 0x23, 0x22, 0xed, 0x10, 0x0e, 0xda, 0x40, 0x51, 0x0e, 0x0d,
+ 0x0f, 0x2f, 0x31, 0x43,
+ 0x0f, 0xd9, 0x00, 0xef, 0x00, 0x20, 0xed, 0x0d, 0x60, 0x3f, 0x1b, 0x0d,
+ 0x1e, 0x1c, 0x50, 0x53,
+ 0x33, 0x0e, 0xd8, 0xee, 0x20, 0x00, 0x01, 0x32, 0xde, 0xbc, 0x0f, 0xee,
+ 0xed, 0xff, 0x30, 0x50,
+ 0x0f, 0xdc, 0x21, 0x44, 0xcc, 0xde, 0x47, 0x53, 0x00, 0xe0, 0xd0, 0xf0,
+ 0x13, 0x03, 0xb0, 0x06,
+ 0x02, 0xd0, 0xe0, 0x02, 0xd0, 0x8f, 0x02, 0x25, 0x00, 0x00, 0xe0, 0xe0,
+ 0x13, 0x13, 0xba, 0xef,
+ 0x35, 0x00, 0xd0, 0xf0, 0xd0, 0x23, 0x43, 0x10, 0x10, 0xf0, 0xef, 0xde,
+ 0xe0, 0x56, 0x52, 0x10,
+ 0x0d, 0xeb, 0x10, 0x40, 0x61, 0x32, 0x0c, 0xea, 0x00, 0x00, 0x0e, 0x0f,
+ 0x41, 0x00, 0x12, 0x01,
+ 0xdc, 0xfe, 0x3f, 0x70, 0x31, 0x2f, 0x0a, 0x0d, 0x2f, 0x72, 0x43, 0x0f,
+ 0x0d, 0xfc, 0x0f, 0x13,
+ 0x25, 0x11, 0xfe, 0xbb, 0xe0, 0x03, 0x35, 0x00, 0xcd, 0xcd, 0xee, 0xf0,
+ 0x03, 0x77, 0x13, 0xff,
+ 0xff, 0x12, 0x13, 0xef, 0xcd, 0x15, 0x44, 0x01, 0xcf, 0xdf, 0xcf, 0xe0,
+ 0x05, 0x02, 0xdf, 0xc0,
+ 0xf1, 0xf1, 0xf1, 0x03, 0x03, 0xf0, 0xde, 0xc9, 0xce, 0x32, 0x00, 0x00,
+ 0xde, 0x01, 0xdd, 0x01,
+ 0xd4, 0xc5, 0x4d, 0x43, 0x19, 0xcd, 0xb6, 0x48, 0x32, 0x54, 0xec, 0xec,
+ 0x64, 0x33, 0x0e, 0x01,
+ 0x22, 0xfe, 0xbd, 0xdb, 0xcc, 0x00, 0x54, 0x0e, 0x0b, 0x0e, 0x0d, 0x30,
+ 0x4f, 0x0d, 0x30, 0x11,
+ 0xfb, 0x0e, 0x40, 0x53, 0x00, 0xea, 0xf0, 0x00, 0x10, 0xed, 0x0e, 0x62,
+ 0x00, 0xfa, 0x20, 0x53,
+ 0x0f, 0xfd, 0x23, 0x44, 0x11, 0x00, 0xdc, 0xed, 0x33, 0x45, 0xbd, 0xdb,
+ 0x00, 0x21, 0xef, 0xbd,
+ 0xfe, 0xef, 0x11, 0x34, 0x00, 0xd0, 0x01, 0x45, 0xdf, 0xad, 0x13, 0x57,
+ 0x01, 0xf0, 0xf2, 0xe0,
+ 0xdf, 0x00, 0xf0, 0xf0, 0x26, 0x02, 0xbf, 0xef, 0xff, 0xcd, 0xff, 0x46,
+ 0x11, 0xdf, 0xe0, 0xff,
+ 0xdf, 0x02, 0xf0, 0xad, 0x34, 0x44, 0xef, 0x00, 0x11, 0x01, 0x0f, 0xfe,
+ 0x02, 0x34, 0xff, 0xdc,
+ 0xbb, 0x00, 0x40, 0x10, 0x2f, 0xe9, 0x0e, 0x70, 0x00, 0xfe, 0x00, 0x0e,
+ 0x0e, 0x64, 0x00, 0xfd,
+ 0xef, 0x0e, 0x10, 0x42, 0x20, 0x1c, 0x0e, 0x1d, 0x0c, 0x60, 0x57, 0x11,
+ 0x10, 0x0f, 0x0e, 0xef,
+ 0x01, 0x47, 0x22, 0xdf, 0xbe, 0x00, 0x00, 0xf0, 0x14, 0xfe, 0xbd, 0x13,
+ 0x35, 0xdd, 0xff, 0x55,
+ 0x22, 0x11, 0x22, 0x12, 0xe0, 0xcf, 0xee, 0x47, 0x22, 0x8d, 0xff, 0x05,
+ 0x01, 0xee, 0xf0, 0x14,
+ 0x00, 0xe0, 0x12, 0x00, 0x10, 0x35, 0xd0, 0x8d, 0x03, 0x12, 0xff, 0x00,
+ 0x04, 0x03, 0x02, 0x00,
+ 0x34, 0x44, 0x22, 0xf0, 0xe0, 0x47, 0x01, 0x8d, 0xff, 0x00, 0x0d, 0x00,
+ 0x00, 0x0b, 0xfd, 0x0e,
+ 0x40, 0x2f, 0x0a, 0x0d, 0x1f, 0x61, 0x21, 0x0f, 0x00, 0x0e, 0xe8, 0xde,
+ 0x41, 0x30, 0xfe, 0x0e,
+ 0x0e, 0x40, 0x60, 0xf9, 0xfe, 0x40, 0x52, 0x11, 0x0f, 0x0f, 0xee, 0x0d,
+ 0x23, 0x23, 0xdc, 0xec,
+ 0x00, 0xff, 0xbd, 0x01, 0xf0, 0xff, 0xef, 0xdc, 0x01, 0x35, 0x01, 0xd0,
+ 0x22, 0x67, 0xf0, 0xf2,
+ 0x03, 0x13, 0xd0, 0xe2, 0x27, 0xe2, 0x80, 0xd1, 0x03, 0xb0, 0xe2, 0x14,
+ 0x02, 0xdf, 0x01, 0x45,
+ 0xde, 0xcf, 0x24, 0x01, 0xf2, 0x12, 0x01, 0x13, 0x00, 0xce, 0x01, 0x77,
+ 0x43, 0xf0, 0xdf, 0xdd,
+ 0xe0, 0x12, 0x44, 0x34, 0x11, 0xee, 0xbb, 0x0f, 0x2e, 0x2e, 0x60, 0x20,
+ 0x1e, 0x1d, 0x08, 0xdd,
+ 0x10, 0x61, 0x00, 0x0f, 0x0f, 0x0d, 0xff, 0x00, 0x2f, 0xea, 0xed, 0x2f,
+ 0x50, 0x3f, 0x4f, 0x2d,
+ 0x1c, 0x73, 0x23, 0x0d, 0x1e, 0x10, 0x0e, 0x04, 0x57, 0x03, 0x0f, 0xcc,
+ 0xef, 0x01, 0x02, 0xf3,
+ 0xf1, 0xdf, 0x00, 0x35, 0x43, 0xe0, 0xe0, 0x57, 0x11, 0x00, 0x11, 0x01,
+ 0xd0, 0xe0, 0xe2, 0xf4,
+ 0xe2, 0xa1, 0xf2, 0xe2, 0xa0, 0xc0, 0x05, 0x03, 0x00, 0x03, 0x07, 0xd0,
+ 0xaf, 0xee, 0xee, 0x23,
+ 0x57, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x32, 0x00, 0x00, 0x25, 0x22, 0xc0,
+ 0xac, 0xff, 0x00, 0x01,
+ 0x00, 0x0e, 0x1f, 0x0c, 0xec, 0x0f, 0x3e, 0x0c, 0x0d, 0x60, 0x30, 0x0d,
+ 0xfa, 0xfe, 0x51, 0x10,
+ 0xda, 0xff, 0x40, 0x00, 0xdd, 0xee, 0x0f, 0xfc, 0x60, 0x41, 0x0e, 0xfc,
+ 0xee, 0x20, 0x76, 0x00,
+ 0xec, 0xfe, 0x31, 0x33, 0x00, 0xff, 0xab, 0xff, 0x23, 0xf0, 0xdc, 0x00,
+ 0xde, 0xf0, 0x45, 0xcf,
+ 0xee, 0x22, 0x10, 0xce, 0x10, 0x35, 0xf0, 0xf0, 0xf0, 0x02, 0x44, 0xc0,
+ 0xad, 0xf0, 0x03, 0x35,
+ 0x12, 0xef, 0xaa, 0x00, 0x22, 0xf0, 0xdf, 0xe0, 0xde, 0x00, 0x00, 0xff,
+ 0x01, 0xf0, 0xbc, 0xfc,
+ 0x31, 0x56, 0x00, 0xf0, 0x02, 0xef, 0xde, 0xf0, 0x67, 0x22, 0xc0, 0xee,
+ 0x01, 0x20, 0x0f, 0x0f,
+ 0x10, 0x00, 0x51, 0x44, 0x0c, 0xfd, 0x10, 0x23, 0xfe, 0xba, 0xef, 0x11,
+ 0x45, 0x00, 0xab, 0xed,
+ 0x11, 0x31, 0xfe, 0x30, 0x42, 0x10, 0x20, 0x10, 0x1c, 0x72, 0x36, 0x10,
+ 0x0e, 0x00, 0x12, 0x00,
+ 0xcb, 0x00, 0x32, 0x00, 0xf0, 0x34, 0xde, 0x8a, 0x00, 0x33, 0x32, 0x00,
+ 0xff, 0x0f, 0x20, 0x22,
+ 0x22, 0xf0, 0xdf, 0x12, 0x04, 0xc0, 0xc2, 0xd2, 0xf3, 0x26, 0xb0, 0x9d,
+ 0xf0, 0xf0, 0xee, 0x05,
+ 0x04, 0xd0, 0xcf, 0xde, 0xde, 0xef, 0x00, 0x25, 0x55, 0x00, 0xf0, 0x00,
+ 0x01, 0xf2, 0x05, 0xf1,
+ 0x90, 0x01, 0x25, 0xdf, 0xce, 0x34, 0x32, 0xee, 0xce, 0xfe, 0x00, 0x41,
+ 0x0d, 0xeb, 0x0f, 0x31,
+ 0x53, 0xfe, 0x0e, 0x00, 0xdc, 0xbb, 0x20, 0x41, 0xfd, 0xfd, 0x0e, 0xfb,
+ 0x1f, 0x61, 0x31, 0x20,
+ 0x0a, 0x0e, 0x2f, 0x1e, 0x3f, 0x72, 0x21, 0x10, 0x20, 0x0d, 0x0c, 0x2f,
+ 0xe8, 0x9c, 0x21, 0x43,
+ 0xfe, 0xfc, 0x0f, 0x30, 0xef, 0xfe, 0x42, 0x32, 0x1f, 0x0f, 0x23, 0x03,
+ 0xad, 0xf3, 0x07, 0xe1,
+ 0xd0, 0x13, 0x57, 0xf1, 0xc0, 0xef, 0xf0, 0x01, 0x03, 0x02, 0xe1, 0x9e,
+ 0xee, 0x06, 0x02, 0xce,
+ 0xcc, 0xff, 0x00, 0x24, 0x22, 0xf0, 0xe0, 0x03, 0x02, 0xbe, 0xde, 0x17,
+ 0x22, 0x12, 0x43, 0xef,
+ 0xce, 0x0f, 0x0d, 0x0e, 0x60, 0x0d, 0x08, 0x1e, 0x0e, 0x1e, 0x51, 0x10,
+ 0x0e, 0x55, 0x21, 0xda,
+ 0xbc, 0x00, 0x43, 0x00, 0xee, 0x0f, 0x0e, 0x0f, 0x20, 0x0f, 0x0d, 0x30,
+ 0x72, 0x10, 0x1e, 0x47,
+ 0x32, 0x0f, 0xed, 0x13, 0x35, 0xac, 0xed, 0x34, 0x12, 0xe0, 0xef, 0xd0,
+ 0xdf, 0x02, 0x21, 0x01,
+ 0x35, 0x21, 0x20, 0x21, 0x01, 0xc0, 0xf0, 0x77, 0x23, 0x01, 0xf3, 0xd1,
+ 0xd0, 0x8f, 0x03, 0x27,
+ 0xf3, 0xcf, 0xf0, 0x04, 0xf0, 0x8e, 0x00, 0x04, 0x00, 0xef, 0x00, 0x13,
+ 0x0f, 0x0f, 0x27, 0x22,
+ 0xff, 0x00, 0x12, 0x00, 0xf0, 0xf0, 0xf2, 0x35, 0x00, 0xe1, 0x23, 0xff,
+ 0x88, 0xee, 0x71, 0x21,
+ 0x0c, 0xfe, 0x20, 0x40, 0x1f, 0x1d, 0x1e, 0x1e, 0x2f, 0x30, 0x1f, 0xb8,
+ 0x0e, 0x52, 0x11, 0x00,
+ 0xdb, 0xee, 0x20, 0x51, 0x10, 0x0d, 0xea, 0x20, 0x63, 0x10, 0x10, 0x0f,
+ 0x0d, 0x20, 0x11, 0xfd,
+ 0x00, 0x0f, 0x0f, 0xf0, 0xab, 0xdd, 0x00, 0xfe, 0x13, 0x47, 0xcf, 0xba,
+ 0x00, 0x21, 0x21, 0x01,
+ 0x00, 0xd0, 0xc0, 0x02, 0x14, 0xc0, 0x01, 0x04, 0xd0, 0x01, 0x23, 0xf1,
+ 0xf3, 0xf5, 0x03, 0xf2,
+ 0x8e, 0xbc, 0xf0, 0xf2, 0xf1, 0x16, 0x11, 0xde, 0xef, 0x11, 0x00, 0xbb,
+ 0x01, 0x57, 0x11, 0xe0,
+ 0xf0, 0x31, 0x12, 0x00, 0xe0, 0xf1, 0xd0, 0xf0, 0xab, 0x0f, 0x62, 0x00,
+ 0x0e, 0x20, 0x0c, 0xdb,
+ 0xff, 0x41, 0x31, 0xfe, 0xed, 0x00, 0x53, 0x00, 0xec, 0x0f, 0xed, 0xdb,
+ 0x0f, 0x2f, 0x2d, 0x60,
+ 0x1f, 0x09, 0xff, 0x61, 0x22, 0x0e, 0x30, 0x2e, 0x0d, 0x52, 0x0f, 0xb8,
+ 0x0e, 0x34, 0x22, 0xee,
+ 0xff, 0xbc, 0x00, 0x23, 0x0f, 0xfe, 0xff, 0x0e, 0x23, 0x67, 0x00, 0xef,
+ 0xed, 0xf0, 0x01, 0x22,
+ 0x24, 0xf0, 0xd0, 0xf1, 0x02, 0x26, 0x11, 0xb1, 0x90, 0xe0, 0xe2, 0xe2,
+ 0xf3, 0xf2, 0xd1, 0xf4,
+ 0x47, 0x02, 0xc0, 0xf0, 0x13, 0xce, 0xef, 0x77, 0x24, 0xe0, 0xf0, 0x12,
+ 0x02, 0xf0, 0x01, 0xe1,
+ 0xcf, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0xd9, 0x0e, 0x72, 0x52, 0x0c,
+ 0xfc, 0x10, 0x20, 0x0e,
+ 0x1f, 0x2e, 0x1d, 0x0b, 0x20, 0x0e, 0x88, 0x0f, 0x30, 0x30, 0xed, 0xdc,
+ 0x40, 0x63, 0x0f, 0x2f,
+ 0x20, 0x0d, 0x0d, 0x0e, 0x2f, 0x1f, 0x1f, 0x1e, 0xea, 0xee, 0xef, 0xce,
+ 0xcb, 0x10, 0x41, 0x0f,
+ 0x0f, 0x00, 0xed, 0xee, 0x13, 0x01, 0xbf, 0xc0, 0xc0, 0x07, 0x16, 0xe0,
+ 0xe0, 0x12, 0x23, 0xe1,
+ 0x8f, 0xf2, 0x37, 0x02, 0xb0, 0x00, 0xf1, 0x02, 0xf3, 0xf3, 0xf1, 0xe1,
+ 0xd0, 0xc0, 0xf2, 0x17,
+ 0x01, 0xb0, 0xe0, 0x12, 0x37, 0xf1, 0xa0, 0xe0, 0x01, 0x13, 0x11, 0x00,
+ 0x00, 0xee, 0x44, 0x32,
+ 0xdc, 0x0e, 0x50, 0x0c, 0x0c, 0x30, 0x50, 0x1e, 0x30, 0x10, 0xd8, 0x00,
+ 0x10, 0x20, 0x2f, 0xcc,
+ 0x8c, 0x0e, 0x20, 0x40, 0x1d, 0x1d, 0x3f, 0x60, 0x20, 0x1e, 0x1c, 0x2f,
+ 0x64, 0x23, 0x0e, 0x0d,
+ 0x22, 0x0f, 0xf9, 0xf0, 0x02, 0x03, 0xf0, 0xd0, 0xff, 0x10, 0x20, 0x0f,
+ 0x64, 0x36, 0x00, 0xef,
+ 0x02, 0xf0, 0x9c, 0x01, 0x26, 0x12, 0x02, 0x01, 0xf2, 0xd2, 0xe5, 0xf2,
+ 0xc1, 0x90, 0xd0, 0x03,
+ 0xf2, 0xd0, 0xf4, 0xf1, 0xd0, 0xd0, 0xf2, 0xe0, 0xba, 0x00, 0x53, 0x13,
+ 0x00, 0x25, 0x12, 0xf1,
+ 0xc0, 0xf1, 0x02, 0xcd, 0xd0, 0x17, 0x01, 0xbf, 0x00, 0x00, 0xcd, 0xdc,
+ 0x0f, 0x72, 0x1e, 0x08,
+ 0x0f, 0xfe, 0x00, 0x63, 0x00, 0xfb, 0x00, 0x00, 0xfd, 0xee, 0xe0, 0xed,
+ 0xcc, 0x0e, 0x00, 0x20,
+ 0x0c, 0x0d, 0x50, 0x31, 0x1f, 0x3e, 0x4d, 0x3d, 0x41, 0x47, 0x21, 0x0e,
+ 0xfd, 0xfd, 0xee, 0xcf,
+ 0xe1, 0xf0, 0xfb, 0x0e, 0x1d, 0x62, 0x14, 0xed, 0xdd, 0xef, 0xfe, 0x0e,
+ 0xf0, 0xbd, 0xef, 0x47,
+ 0x25, 0x01, 0x35, 0xf0, 0x8c, 0x00, 0x02, 0x04, 0xe0, 0xf0, 0x01, 0xdf,
+ 0x8c, 0x01, 0x16, 0xff,
+ 0xcc, 0x0f, 0x10, 0x00, 0xfe, 0x0f, 0x00, 0x30, 0x23, 0xdf, 0xac, 0x02,
+ 0x13, 0x01, 0xf2, 0xe2,
+ 0xe4, 0xe2, 0xe1, 0xcf, 0x10, 0x30, 0xfd, 0x10, 0x41, 0xf8, 0x4d, 0x73,
+ 0x1c, 0xea, 0x22, 0x22,
+ 0xee, 0xdd, 0xf0, 0xbc, 0x00, 0x23, 0xbc, 0xdc, 0x00, 0x00, 0x10, 0x2f,
+ 0x0e, 0x50, 0x31, 0x20,
+ 0x73, 0x20, 0x1c, 0x10, 0x23, 0x21, 0x00, 0x00, 0xff, 0xed, 0x37, 0x06,
+ 0xd0, 0x21, 0x62, 0x00,
+ 0xef, 0xee, 0xff, 0x00, 0x66, 0x44, 0x00, 0xff, 0xf0, 0x12, 0x22, 0x00,
+ 0x27, 0x42, 0x00, 0xf2,
+ 0xf1, 0xe1, 0x15, 0x02, 0x80, 0xe1, 0xf3, 0xc0, 0xcf, 0xe0, 0xce, 0xe0,
+ 0x05, 0x00, 0xce, 0xf0,
+ 0x14, 0x00, 0x0f, 0xff, 0xd0, 0x07, 0x56, 0x01, 0xf0, 0xe1, 0xd0, 0xe2,
+ 0xf1, 0x90, 0xf0, 0x03,
+ 0xff, 0xcd, 0x00, 0x20, 0x09, 0x1e, 0x20, 0x30, 0x61, 0x10, 0xfb, 0x0e,
+ 0x51, 0x0e, 0xfa, 0x0f,
+ 0x10, 0x1e, 0xec, 0xbc, 0x0f, 0x10, 0x1e, 0x1e, 0x5e, 0x40, 0x2e, 0x1b,
+ 0x4f, 0x1e, 0x20, 0x51,
+ 0x1e, 0x09, 0x10, 0x31, 0xfe, 0xdb, 0x20, 0x70, 0x20, 0x1f, 0x0f, 0x0e,
+ 0x00, 0x12, 0x00, 0xff,
+ 0x12, 0xf0, 0xd0, 0x27, 0x13, 0xd0, 0xe0, 0xf2, 0x56, 0x12, 0xc0, 0x12,
+ 0x75, 0x12, 0xc0, 0xf2,
+ 0x05, 0xe0, 0xa0, 0xf0, 0x02, 0xf2, 0xdf, 0xe0, 0x04, 0xd0, 0xdf, 0x11,
+ 0x31, 0x02, 0xf6, 0xe2,
+ 0xd1, 0x75, 0x01, 0xd0, 0xf0, 0x03, 0xe1, 0x23, 0x66, 0xef, 0xde, 0x00,
+ 0x30, 0x61, 0x21, 0x10,
+ 0x0d, 0x2e, 0x0c, 0xfe, 0x32, 0x55, 0x0f, 0x0e, 0x0e, 0x0c, 0xed, 0xbd,
+ 0xc9, 0x10, 0x63, 0x0e,
+ 0xfc, 0x20, 0x2e, 0x1e, 0x71, 0x22, 0x0f, 0x1f, 0x1c, 0x1f, 0x21, 0x00,
+ 0x0c, 0x0f, 0x00, 0x0f,
+ 0xff, 0x13, 0x0e, 0xea, 0x00, 0x33, 0x72, 0x00, 0xd8, 0x00, 0x75, 0x30,
+ 0xe0, 0xe0, 0x00, 0x01,
+ 0xf0, 0xf1, 0x02, 0x05, 0x02, 0x02, 0xa0, 0xf2, 0x05, 0xc0, 0xbf, 0x04,
+ 0xf2, 0xb0, 0x01, 0xf1,
+ 0xcd, 0xe0, 0x16, 0x01, 0xf0, 0xf0, 0xf0, 0xe0, 0x02, 0x11, 0xdf, 0x03,
+ 0x27, 0xf1, 0xb0, 0xf1,
+ 0xf2, 0xd1, 0x9d, 0xfe, 0x27, 0x00, 0xed, 0x0f, 0x3e, 0x4f, 0x40, 0x20,
+ 0x1f, 0x0d, 0x22, 0x63,
+ 0x1b, 0x2f, 0x10, 0x0c, 0x0f, 0x10, 0x0b, 0xfd, 0xec, 0xde, 0x0e, 0x1f,
+ 0x5d, 0x3c, 0x7f, 0x3f,
+ 0x3e, 0x0c, 0x0b, 0x0f, 0x2e, 0x0e, 0x30, 0x40, 0x0d, 0x0a, 0x0f, 0x30,
+ 0x1e, 0xaa, 0xf0, 0x40,
+ 0x10, 0xed, 0xfe, 0x10, 0xcc, 0xee, 0x22, 0xe0, 0x89, 0x00, 0x10, 0x00,
+ 0x00, 0xff, 0xef, 0x02,
+ 0x34, 0x01, 0xf1, 0x02, 0xa0, 0xc0, 0xf5, 0xf3, 0xb0, 0xe0, 0xd0, 0xe0,
+ 0xf1, 0xd0, 0xdd, 0xef,
+ 0x02, 0x04, 0xbe, 0xdf, 0x07, 0x04, 0xf1, 0xc2, 0xe3, 0xe7, 0xa1, 0xb0,
+ 0xf2, 0x03, 0x02, 0xf1,
+ 0xde, 0xff, 0x00, 0x12, 0x43, 0x1f, 0x1d, 0x47, 0x21, 0xec, 0x30, 0x72,
+ 0x0f, 0xfc, 0x01, 0x02,
+ 0xce, 0xf0, 0xeb, 0xfe, 0x00, 0x1e, 0x0d, 0x2d, 0x5e, 0x5d, 0x2c, 0x2c,
+ 0x40, 0x31, 0x2d, 0x2a,
+ 0x50, 0x1f, 0x0a, 0x00, 0x43, 0x0f, 0xfc, 0x10, 0x00, 0xeb, 0x0f, 0x60,
+ 0x11, 0xfe, 0x0c, 0x20,
+ 0x30, 0xfd, 0x0e, 0x20, 0x3f, 0x3d, 0x60, 0x22, 0x0f, 0xfc, 0x13, 0x47,
+ 0x01, 0xe2, 0xc2, 0xf6,
+ 0x02, 0x91, 0xd1, 0xd1, 0xd1, 0xf2, 0xf4, 0xa0, 0xe0, 0x03, 0xf1, 0x03,
+ 0x14, 0xff, 0x04, 0x37,
+ 0x01, 0x02, 0xf2, 0x81, 0x07, 0x01, 0xb0, 0xe0, 0x02, 0x02, 0xe0, 0xd0,
+ 0xf0, 0x02, 0x12, 0x00,
+ 0xdd, 0x40, 0x77, 0x00, 0x0f, 0x32, 0x20, 0xfc, 0xfe, 0x00, 0xff, 0xce,
+ 0x00, 0xea, 0xee, 0x30,
+ 0xfd, 0x0c, 0x70, 0x1e, 0x0d, 0x21, 0x3f, 0x0b, 0x3e, 0x40, 0x3e, 0x2d,
+ 0x2b, 0x50, 0x2f, 0x0c,
+ 0x1d, 0x4e, 0x4f, 0x0d, 0x1f, 0x2f, 0x0b, 0xed, 0x40, 0x20, 0xce, 0xcd,
+ 0xee, 0xda, 0xff, 0xfe,
+ 0xee, 0xef, 0xcf, 0xc0, 0x26, 0x51, 0x00, 0x00, 0x13, 0x06, 0xd2, 0xc2,
+ 0xd0, 0xc1, 0xd2, 0xe4,
+ 0xa0, 0xd0, 0xf2, 0xf2, 0xbf, 0xf0, 0x01, 0xe1, 0x05, 0x05, 0xf1, 0xf1,
+ 0x24, 0x03, 0xc4, 0xd2,
+ 0x8f, 0xdf, 0x14, 0x12, 0xff, 0xf0, 0x03, 0xff, 0xea, 0x10, 0x50, 0x00,
+ 0x1c, 0x40, 0x50, 0x20,
+ 0x1e, 0xf8, 0x0f, 0x0f, 0xf0, 0xef, 0xee, 0xfd, 0xdb, 0x20, 0x40, 0xfd,
+ 0x0d, 0x5f, 0x7f, 0x3e,
+ 0x1d, 0x30, 0x20, 0x3f, 0x4e, 0x31, 0x21, 0x20, 0x14, 0x02, 0x43, 0x57,
+ 0x00, 0x02, 0x13, 0x01,
+ 0xe0, 0xf0, 0x26, 0x21, 0xef, 0x22, 0x23, 0xbf, 0xe0, 0x57, 0x42, 0xfe,
+ 0x23, 0x57, 0x01, 0xf0,
+ 0x01, 0x04, 0x13, 0x03, 0x24, 0x03, 0xa2, 0xd0, 0xe4, 0xe2, 0xc1, 0xd2,
+ 0xc1, 0x02, 0x00, 0xf0,
+ 0xf0, 0xde, 0x00, 0x77, 0x16, 0xf0, 0x00, 0x01, 0xd0, 0x02, 0x26, 0xd0,
+ 0x90, 0x00, 0x00, 0xd0,
+ 0xee, 0xe0, 0x01, 0xd0, 0xee, 0x61, 0x53, 0x1e, 0x1f, 0x2f, 0x0d, 0xf9,
+ 0xee, 0x00, 0x2e, 0xc9,
+ 0xee, 0x10, 0x0f, 0xbb, 0x00, 0x00, 0xdc, 0x1f, 0x70, 0x1f, 0x0d, 0x10,
+ 0x22, 0x2f, 0x1c, 0x2d,
+ 0x1e, 0x2f, 0x30, 0x21, 0x0e, 0x2d, 0x5f, 0x30, 0x09, 0x0e, 0x72, 0x1f,
+ 0xea, 0x00, 0x21, 0xdf,
+ 0xbe, 0x00, 0xff, 0xfd, 0x00, 0x12, 0x00, 0xcb, 0xf0, 0x34, 0x00, 0x9d,
+ 0x17, 0x44, 0xf0, 0x01,
+ 0x03, 0xcf, 0xf0, 0x02, 0xd2, 0xe2, 0xe0, 0xed, 0x20, 0x0f, 0xc9, 0x0f,
+ 0x20, 0x01, 0x00, 0x21,
+ 0x01, 0xf2, 0x57, 0x03, 0x80, 0x02, 0x33, 0x13, 0xf2, 0xc1, 0xa0, 0xf0,
+ 0xfe, 0x0f, 0x24, 0x20,
+ 0x0d, 0x20, 0x35, 0x20, 0x0d, 0x1e, 0x3d, 0x0e, 0xcd, 0xbe, 0xe0, 0xcd,
+ 0xb8, 0xeb, 0x00, 0xf1,
+ 0xfd, 0xdc, 0xfd, 0x0d, 0x5e, 0x50, 0x1f, 0x1d, 0x30, 0x2c, 0x3b, 0x50,
+ 0x22, 0x0c, 0x0e, 0x20,
+ 0x30, 0x2e, 0x2e, 0x20, 0x11, 0x0f, 0x0f, 0x00, 0x0e, 0xb8, 0xfe, 0x33,
+ 0x22, 0x00, 0x50, 0x40,
+ 0x2c, 0x2e, 0x22, 0x04, 0x01, 0x75, 0x23, 0x05, 0x05, 0x01, 0xb0, 0xe4,
+ 0xd3, 0xc3, 0xd2, 0xb2,
+ 0xc0, 0xc0, 0xe0, 0x02, 0x02, 0xf2, 0xfe, 0xdc, 0xe4, 0xf6, 0x01, 0xf1,
+ 0x14, 0x24, 0xf1, 0xc1,
+ 0xc2, 0xa0, 0xd2, 0xf4, 0xb1, 0xdf, 0xd0, 0x01, 0xf1, 0x02, 0x17, 0x42,
+ 0x11, 0x20, 0x0f, 0x1f,
+ 0x31, 0x10, 0xfb, 0x10, 0x30, 0x0e, 0xd9, 0x0f, 0x0f, 0xad, 0x05, 0x05,
+ 0x8b, 0x00, 0x6c, 0x00,
+ 0x9c, 0xbe, 0x1e, 0x3a, 0xc5, 0xbd, 0xb5, 0x3c, 0xbc, 0x2e, 0x0b, 0xdf,
+ 0x54, 0x32, 0xfc, 0xfd,
+ 0x0e, 0x5e, 0xb8, 0x0e, 0x54, 0x0f, 0x2f, 0x41, 0x0e, 0xb8, 0x00, 0x21,
+ 0x10, 0x0f, 0x00, 0x21,
+ 0xed, 0xbb, 0x20, 0x43, 0xfe, 0xfc, 0x10, 0x31, 0xff, 0x0e, 0x41, 0x0f,
+ 0x0f, 0x42, 0x10, 0xe0,
+ 0xf1, 0x04, 0x10, 0xb8, 0x10, 0x34, 0xbe, 0xee, 0x10, 0x72, 0xf0, 0xdb,
+ 0x10, 0x13, 0xf0, 0xe0,
+ 0x10, 0x0e, 0x24, 0x35, 0xdf, 0x00, 0xe0, 0x9e, 0x00, 0x06, 0xe0, 0xd0,
+ 0x01, 0x0f, 0x40, 0x34,
+ 0xc0, 0xdd, 0x03, 0x41, 0x0e, 0xf0, 0x35, 0xe0, 0xcf, 0x02, 0xe2, 0x9a,
+ 0x0f, 0x11, 0x14, 0x00,
+ 0xff, 0xdd, 0x00, 0x32, 0x52, 0xfe, 0xdd, 0x30, 0x2f, 0x0f, 0x00, 0xf1,
+ 0x2f, 0x52, 0x02, 0xd8,
+ 0x7c, 0x20, 0x10, 0x15, 0x00, 0xdc, 0x0f, 0x51, 0x21, 0xfc, 0x20, 0x55,
+ 0xde, 0xdc, 0x31, 0x42,
+ 0x0e, 0x1e, 0x30, 0x02, 0x0e, 0x50, 0x32, 0x11, 0x0e, 0x02, 0x01, 0xe1,
+ 0x05, 0x03, 0xfe, 0xae,
+ 0xf5, 0x31, 0x0e, 0xb9, 0xf0, 0x03, 0xee, 0x10, 0x43, 0xd0, 0x00, 0x62,
+ 0x11, 0xef, 0x04, 0x47,
+ 0xd0, 0x8b, 0x01, 0x12, 0xf0, 0xde, 0x14, 0x11, 0xdd, 0x12, 0x56, 0xdf,
+ 0xfe, 0x13, 0x21, 0x00,
+ 0x43, 0xf1, 0xbe, 0x00, 0x37, 0xef, 0xfe, 0x13, 0x00, 0xc0, 0x00, 0x15,
+ 0x00, 0xd0, 0x1d, 0x72,
+ 0x01, 0xce, 0x01, 0x04, 0x0f, 0x44, 0x10, 0xea, 0x11, 0x62, 0xff, 0xff,
+ 0x10, 0x22, 0x20, 0x00,
+ 0x0d, 0x0f, 0x00, 0x11, 0x10, 0x0b, 0x23, 0x2f, 0xb8, 0x0e, 0x22, 0x10,
+ 0x0e, 0x70, 0x20, 0xfa,
+ 0x00, 0x30, 0x00, 0xff, 0xd0, 0xf1, 0xdf, 0x72, 0x67, 0xfe, 0xcc, 0x2f,
+ 0x01, 0x00, 0xf0, 0xfd,
+ 0xee, 0x0f, 0x00, 0x0f, 0x0f, 0x24, 0xde, 0xcf, 0x23, 0x24, 0x8c, 0xda,
+ 0x00, 0x01, 0x04, 0xe0,
+ 0x8b, 0xff, 0x01, 0x10, 0x00, 0x46, 0x00, 0xab, 0x00, 0x11, 0x01, 0x01,
+ 0x10, 0x0e, 0xbf, 0x00,
+ 0x02, 0x01, 0xeb, 0xf0, 0x04, 0x0f, 0xdd, 0x21, 0x21, 0xce, 0xff, 0x00,
+ 0x10, 0x00, 0x0f, 0x2f,
+ 0x0e, 0xe0, 0xff, 0xda, 0x20, 0x21, 0xe0, 0x0f, 0x20, 0xbe, 0xdf, 0xff,
+ 0x1a, 0x7f, 0x00, 0xde,
+ 0xdc, 0x31, 0x00, 0xe9, 0x2f, 0xed, 0x0d, 0x74, 0x70, 0x3d, 0x0b, 0x00,
+ 0x00, 0x02, 0xf2, 0x00,
+ 0x00, 0x20, 0x20, 0x00, 0xce, 0xf1, 0xbe, 0x0b, 0x22, 0xbd, 0xcc, 0x35,
+ 0x20, 0xdc, 0x12, 0x55,
+ 0x00, 0xcd, 0x00, 0x03, 0x03, 0x00, 0xf0, 0xcd, 0xef, 0xd4, 0xe4, 0xd1,
+ 0xf1, 0xd0, 0xb0, 0x10,
+ 0x47, 0xc4, 0xe0, 0x31, 0x1e, 0x30, 0x25, 0x80, 0xfd, 0x00, 0x03, 0x11,
+ 0x03, 0xfe, 0xee, 0x1f,
+ 0x03, 0xd1, 0xcc, 0x00, 0x41, 0xcb, 0xee, 0xf0, 0x24, 0x1e, 0xc9, 0x30,
+ 0x70, 0x0f, 0xfe, 0x00,
+ 0x40, 0x12, 0x0d, 0xeb, 0x2f, 0x40, 0x0d, 0x31, 0x00, 0xa8, 0x0f, 0x00,
+ 0x00, 0xcc, 0x0f, 0x43,
+ 0x1e, 0x08, 0x20, 0x10, 0xf0, 0xe0, 0x2e, 0x20, 0xaf, 0x01, 0x43, 0x10,
+ 0xfe, 0xf0, 0x23, 0x00,
+ 0xdc, 0xb1, 0xf1, 0xed, 0x1f, 0x57, 0xe0, 0xcd, 0x10, 0x21, 0xf2, 0x04,
+ 0x54, 0xff, 0xde, 0x15,
+ 0x10, 0xe0, 0x03, 0xd4, 0xae, 0x11, 0x04, 0xd0, 0x02, 0x42, 0x02, 0xe1,
+ 0xde, 0x51, 0x57, 0x00,
+ 0xee, 0x23, 0x14, 0xe0, 0xfe, 0x00, 0x2f, 0x00, 0xe0, 0xd0, 0x00, 0x70,
+ 0x20, 0xc8, 0xef, 0x27,
+ 0x20, 0xfd, 0x40, 0x41, 0xff, 0xfe, 0x51, 0x01, 0x10, 0x20, 0x2e, 0x0f,
+ 0x10, 0x53, 0x00, 0x0c,
+ 0x40, 0x20, 0x21, 0xe0, 0xec, 0x02, 0x46, 0x0f, 0xec, 0x40, 0x71, 0x11,
+ 0x0e, 0x00, 0x3e, 0x0d,
+ 0x34, 0xf3, 0x00, 0x37, 0x76, 0xff, 0xed, 0x33, 0x35, 0xf0, 0x01, 0xe0,
+ 0x00, 0x12, 0x01, 0xd0,
+ 0xef, 0x10, 0x56, 0x12, 0xf0, 0x00, 0x61, 0x04, 0x02, 0xe2, 0x20, 0x33,
+ 0x02, 0xa0, 0x03, 0xf5,
+ 0xf4, 0xe1, 0x02, 0xd1, 0x13, 0x75, 0x00, 0xc1, 0x03, 0x15, 0x21, 0x00,
+ 0xf0, 0xe1, 0x36, 0x52,
+ 0xde, 0xfe, 0x12, 0xf1, 0xe0, 0x22, 0x31, 0x00, 0xe0, 0xd6, 0xe0, 0x9e,
+ 0xf0, 0x01, 0xc0, 0x2c,
+ 0x73, 0x2f, 0xdc, 0xf4, 0x22, 0x0e, 0x1b, 0x61, 0x11, 0x20, 0x0b, 0xe0,
+ 0x22, 0x10, 0x0f, 0x0f,
+ 0xdc, 0xde, 0x70, 0x12, 0x0d, 0xfa, 0x0f, 0x0f, 0x0e, 0xed, 0x0e, 0x7e,
+ 0x31, 0xd0, 0xed, 0x66,
+ 0x10, 0xfc, 0x00, 0x22, 0x00, 0xec, 0x0e, 0x0f, 0xde, 0xcc, 0x10, 0x20,
+ 0xc9, 0x00, 0x50, 0x01,
+ 0xf0, 0x00, 0x40, 0xde, 0xf2, 0x25, 0x10, 0xbd, 0xcd, 0x06, 0x01, 0xe0,
+ 0x01, 0xc0, 0xfe, 0x01,
+ 0x02, 0xe0, 0x10, 0x67, 0x00, 0xf0, 0xf0, 0xf0, 0xf1, 0xe1, 0xae, 0x0e,
+ 0x14, 0x01, 0xe3, 0xbc,
+ 0xca, 0xf0, 0x07, 0xf0, 0xef, 0x1f, 0x20, 0xcc, 0x00, 0x73, 0xf0, 0xef,
+ 0x01, 0x2f, 0x0b, 0x00,
+ 0x1f, 0x00, 0x30, 0x40, 0x30, 0xf0, 0xab, 0x0f, 0x0f, 0x10, 0x03, 0x0d,
+ 0xc8, 0x30, 0x71, 0x0f,
+ 0x0c, 0x52, 0x10, 0xfc, 0x0e, 0x00, 0x00, 0x1f, 0x43, 0x11, 0xfc, 0x00,
+ 0x52, 0xf0, 0xdb, 0xf2,
+ 0x21, 0xfe, 0xee, 0x31, 0x0e, 0xcf, 0x03, 0xe0, 0x1f, 0x55, 0x24, 0xff,
+ 0xda, 0x10, 0x30, 0xf4,
+ 0xb0, 0xe0, 0xe1, 0xe1, 0x03, 0x02, 0x81, 0xdf, 0xe4, 0x16, 0x00, 0xc0,
+ 0xf1, 0x02, 0x13, 0xe0,
+ 0xc1, 0x27, 0xe1, 0xae, 0x00, 0x35, 0x20, 0xc0, 0xe0, 0xe3, 0xe0, 0xc1,
+ 0xe0, 0xf1, 0xe1, 0xc1,
+ 0xe1, 0x12, 0x0d, 0x9b, 0x00, 0x0e, 0x05, 0x01, 0xca, 0x1e, 0x50, 0x11,
+ 0x21, 0x0f, 0xcc, 0x00,
+ 0x31, 0x20, 0x1e, 0x21, 0xee, 0xec, 0x54, 0x0e, 0xe8, 0x2f, 0x50, 0xef,
+ 0xfe, 0x10, 0x1d, 0x1d,
+ 0x0f, 0x1e, 0x5f, 0x10, 0x33, 0x2e, 0xf8, 0x20, 0x52, 0xfe, 0xdb, 0xf0,
+ 0xc3, 0x20, 0x50, 0xdb,
+ 0xad, 0x00, 0x00, 0x0f, 0x11, 0x33, 0xee, 0xca, 0x10, 0x1e, 0x00, 0x02,
+ 0x04, 0x8f, 0xfc, 0x00,
+ 0x12, 0xdf, 0xcd, 0x11, 0x00, 0xf0, 0x04, 0xef, 0xcd, 0xff, 0x0f, 0x30,
+ 0xe2, 0xe2, 0x1e, 0xe8,
+ 0x00, 0x00, 0xd0, 0xd1, 0x8f, 0x8b, 0x00, 0x01, 0x00, 0xfd, 0x00, 0x0e,
+ 0xea, 0xcf, 0x00, 0x10,
+ 0x0e, 0xee, 0x0f, 0x20, 0x0c, 0x0f, 0x1c, 0xfb, 0x51, 0x32, 0xde, 0xdd,
+ 0x03, 0x26, 0xed, 0x8b,
+ 0xf2, 0x53, 0x0c, 0xfe, 0x12, 0x33, 0xec, 0xba, 0x10, 0x50, 0x02, 0x10,
+ 0x00, 0x0f, 0x2f, 0x20,
+ 0x23, 0xe0, 0x03, 0x24, 0x00, 0xec, 0xf0, 0x10, 0x03, 0xe1, 0xe6, 0x00,
+ 0xee, 0x00, 0x72, 0xf1,
+ 0xff, 0x41, 0x25, 0x0f, 0x0e, 0x50, 0x05, 0xf1, 0xf1, 0xae, 0xf0, 0xe3,
+ 0xf0, 0x25, 0x04, 0xf0,
+ 0xd0, 0xf0, 0xb0, 0xe4, 0x03, 0x64, 0x00, 0xe0, 0x36, 0x51, 0x20, 0x00,
+ 0xbd, 0x03, 0x06, 0x02,
+ 0x10, 0x00, 0xdf, 0x10, 0x02, 0xf2, 0x06, 0x10, 0xd0, 0xe0, 0x00, 0x1f,
+ 0x01, 0xc0, 0x41, 0x73,
+ 0x50, 0x03, 0x00, 0x0b, 0x00, 0x10, 0x62, 0x00, 0x02, 0x27, 0x32, 0x00,
+ 0x1e, 0x1e, 0x0b, 0x2f,
+ 0x10, 0x00, 0xde, 0xeb, 0x3f, 0x70, 0x6e, 0xf9, 0xe0, 0x24, 0x30, 0x2e,
+ 0x31, 0x00, 0xee, 0x00,
+ 0x45, 0x1f, 0x0d, 0x10, 0x44, 0xbd, 0xfe, 0x00, 0x43, 0xff, 0xdc, 0x21,
+ 0x34, 0x0f, 0x0e, 0x10,
+ 0xf1, 0xa0, 0xe3, 0x03, 0x0a, 0xfe, 0x04, 0x23, 0x00, 0xad, 0xde, 0xf4,
+ 0x04, 0xb1, 0x04, 0x30,
+ 0x0c, 0x00, 0x05, 0xf1, 0xc0, 0xe0, 0x11, 0xe0, 0x9e, 0x00, 0x17, 0x02,
+ 0xd0, 0xce, 0x00, 0x00,
+ 0x00, 0x10, 0xaf, 0xcd, 0x07, 0x32, 0xdd, 0x1e, 0x61, 0x00, 0x10, 0x10,
+ 0x0f, 0xfa, 0xf1, 0x00,
+ 0x21, 0x31, 0x02, 0x1d, 0x28, 0x4f, 0x00, 0xd0, 0x00, 0x70, 0x1c, 0x0e,
+ 0x20, 0x6e, 0x0a, 0x00,
+ 0x51, 0x20, 0x0f, 0x0e, 0x2e, 0x00, 0x40, 0x23, 0x10, 0x11, 0x20, 0x0e,
+ 0xe0, 0xdc, 0x31, 0x37,
+ 0xe1, 0xc1, 0x01, 0x2f, 0x60, 0x3f, 0xdc, 0x03, 0x77, 0xf1, 0x0e, 0xe0,
+ 0xf4, 0xd1, 0x02, 0x22,
+ 0x11, 0x12, 0x81, 0xc5, 0x07, 0x00, 0xcf, 0xf1, 0x05, 0xf0, 0x32, 0x10,
+ 0xe0, 0x00, 0x55, 0x01,
+ 0xe0, 0xf0, 0x02, 0xf2, 0xe1, 0x00, 0x52, 0x00, 0xa0, 0x00, 0xf5, 0xf2,
+ 0xf0, 0xfd, 0x00, 0x02,
+ 0x04, 0x22, 0x0e, 0x0b, 0x41, 0x10, 0x1e, 0xed, 0xce, 0x61, 0x33, 0x08,
+ 0x20, 0x31, 0x01, 0x30,
+ 0x0d, 0xea, 0x20, 0x70, 0xfe, 0xed, 0xe0, 0x0e, 0x0b, 0x4e, 0x2c, 0x0e,
+ 0x0f, 0x70, 0x13, 0xfc,
+ 0xed, 0x30, 0x50, 0x1f, 0xff, 0x02, 0x01, 0x0b, 0xac, 0xff, 0x02, 0x0f,
+ 0xcd, 0x24, 0x2f, 0x19,
+ 0x30, 0xd3, 0x8f, 0xec, 0x13, 0x13, 0x0f, 0xff, 0xf0, 0xf1, 0xd3, 0xf7,
+ 0xe0, 0x90, 0xef, 0x01,
+ 0x02, 0xe0, 0xf3, 0x16, 0x22, 0xd0, 0xfe, 0xee, 0xf2, 0xf4, 0xe2, 0x51,
+ 0x01, 0xcd, 0xde, 0x32,
+ 0x25, 0xcf, 0x00, 0xd1, 0x8d, 0xe1, 0x00, 0x03, 0x13, 0x0f, 0x61, 0x0c,
+ 0xd8, 0x10, 0x20, 0x2d,
+ 0x1f, 0x30, 0x20, 0xc8, 0xff, 0x72, 0x10, 0x0a, 0x21, 0x21, 0x01, 0x00,
+ 0x0e, 0x0e, 0xfd, 0x3f,
+ 0x7f, 0x1e, 0x00, 0x02, 0x2b, 0x1b, 0x60, 0x0e, 0x2f, 0x31, 0x21, 0x21,
+ 0x3e, 0x2c, 0x51, 0x11,
+ 0x11, 0x00, 0xdf, 0xcc, 0xe0, 0x25, 0x62, 0xfc, 0x00, 0x42, 0xff, 0xec,
+ 0x13, 0x12, 0xf0, 0x31,
+ 0x4f, 0x20, 0x37, 0xe1, 0x33, 0x12, 0x8b, 0xd0, 0x07, 0x01, 0xa1, 0x01,
+ 0x10, 0x00, 0xe2, 0x01,
+ 0x15, 0xf1, 0x01, 0xe1, 0x00, 0x30, 0x24, 0x23, 0x04, 0xd0, 0x31, 0x02,
+ 0x8e, 0xc0, 0x14, 0xf4,
+ 0xe3, 0xb1, 0xf0, 0xf0, 0x01, 0x07, 0xe1, 0xe0, 0x00, 0x10, 0xc0, 0x31,
+ 0x50, 0xcd, 0x02, 0x37,
+ 0x50, 0x00, 0xe0, 0x42, 0x23, 0xef, 0x03, 0x10, 0xfc, 0xde, 0xfd, 0x00,
+ 0x0c, 0x4b, 0x12, 0xdf,
+ 0xca, 0x50, 0x00, 0xec, 0x4f, 0x70, 0x11, 0x0c, 0x0e, 0x00, 0x01, 0xf0,
+ 0xe8, 0x10, 0x40, 0xed,
+ 0xdf, 0x00, 0x22, 0x0e, 0x4c, 0x1f, 0xef, 0xaf, 0x0e, 0x50, 0x00, 0xfb,
+ 0x01, 0x03, 0xfa, 0xef,
+ 0x1f, 0x00, 0x9f, 0x01, 0x24, 0xdd, 0xd0, 0x12, 0x0d, 0x0d, 0x01, 0xe4,
+ 0xa0, 0xef, 0x01, 0x14,
+ 0x1d, 0xe9, 0xd0, 0x00, 0xf6, 0xf0, 0xcd, 0x90, 0xff, 0xe1, 0xf1, 0x01,
+ 0xcd, 0xef, 0x00, 0xf1,
+ 0xcf, 0x0d, 0xfe, 0x0f, 0x05, 0xcf, 0xc8, 0x10, 0xff, 0xbe, 0x0f, 0x30,
+ 0x00, 0xf3, 0xee, 0x0c,
+ 0xe0, 0xe0, 0x1f, 0x7e, 0x0d, 0x0f, 0x0f, 0xee, 0xc8, 0x0b, 0x30, 0x21,
+ 0xf0, 0x2d, 0x7e, 0x50,
+ 0x10, 0x0d, 0xf1, 0x13, 0x0d, 0x0a, 0x01, 0x40, 0x00, 0x2f, 0xed, 0x8e,
+ 0xf5, 0x11, 0x0b, 0x0f,
+ 0x10, 0x02, 0xf3, 0xfe, 0xfc, 0x40, 0x4c, 0xf0, 0xe5, 0x03, 0xdd, 0x9d,
+ 0x00, 0xe2, 0xd1, 0x05,
+ 0x00, 0xef, 0x00, 0xb2, 0xd0, 0xd0, 0xf1, 0x17, 0x11, 0xf2, 0x02, 0x01,
+ 0xb0, 0xf0, 0x04, 0xc0,
+ 0x12, 0x10, 0xac, 0xe0, 0x05, 0xd0, 0x8d, 0x02, 0x12, 0xfe, 0xe0, 0xe2,
+ 0xf0, 0xf8, 0xee, 0x0f,
+ 0xe0, 0xfd, 0x0f, 0x7f, 0x0c, 0x2f, 0x00, 0xe0, 0xf6, 0x22, 0x0c, 0x1c,
+ 0x71, 0x30, 0xde, 0x0f,
+ 0x00, 0xff, 0xdc, 0x0e, 0x0b, 0x4d, 0x3f, 0x40, 0x1f, 0x0b, 0x51, 0x02,
+ 0x10, 0x3c, 0x00, 0x30,
+ 0x0e, 0xfc, 0x11, 0x12, 0xff, 0x10, 0x63, 0xfd, 0xea, 0xef, 0x41, 0x44,
+ 0x1e, 0x40, 0x65, 0x00,
+ 0xef, 0x1f, 0x10, 0x02, 0x00, 0xd1, 0xff, 0x0e, 0x04, 0x57, 0x06, 0xdd,
+ 0xef, 0x20, 0x34, 0x11,
+ 0x11, 0x00, 0xd0, 0xc0, 0x71, 0x73, 0xf0, 0x03, 0x44, 0xfd, 0xed, 0x04,
+ 0x03, 0x0f, 0xbe, 0x01,
+ 0x06, 0x21, 0xff, 0xe0, 0x33, 0x04, 0xdf, 0xbd, 0x0d, 0x2e, 0x44, 0x24,
+ 0x0e, 0xde, 0x00, 0x40,
+ 0x1e, 0xff, 0x05, 0x14, 0x62, 0x32, 0x00, 0xff, 0x31, 0x11, 0x16, 0x21,
+ 0xd0, 0x0f, 0x3e, 0x7c,
+ 0x50, 0x26, 0x20, 0x0f, 0x2d, 0x31, 0x77, 0x10, 0x11, 0x01, 0x10, 0x21,
+ 0x43, 0x00, 0xe0, 0x00,
+ 0x25, 0xf2, 0xd3, 0x04, 0x30, 0x1e, 0x30, 0x51, 0x24, 0x44, 0x40, 0x10,
+ 0x01, 0xe2, 0xf0, 0x30,
+ 0x53, 0xe0, 0xf2, 0x07, 0xc2, 0xf1, 0x04, 0xf1, 0xd1, 0xe3, 0x06, 0xb0,
+ 0xc0, 0x35, 0x74, 0x00,
+ 0x0f, 0x22, 0x11, 0xf0, 0x11, 0x64, 0x01, 0xf1, 0x05, 0x0f, 0xfe, 0xe2,
+ 0x77, 0x01, 0xe0, 0xd0,
+ 0x12, 0xf1, 0x9d, 0x00, 0x11, 0x11, 0x0f, 0x0e, 0x14, 0x13, 0xff, 0x01,
+ 0x33, 0x70, 0x10, 0x21,
+ 0x07, 0x21, 0x11, 0x01, 0xff, 0xfb, 0x0f, 0x1f, 0x0b, 0x1f, 0x31, 0xd0,
+ 0x2c, 0x70, 0x7d, 0x0e,
+ 0xf0, 0x0f, 0x2d, 0x3f, 0x1e, 0x1b, 0x1e, 0x2f, 0x03, 0x10, 0x2a, 0x1d,
+ 0xbf, 0x02, 0x13, 0xe9,
+ 0xee, 0x32, 0x51, 0x0d, 0x0d, 0xf0, 0xf0, 0xdf, 0x02, 0xf0, 0xa8, 0xfe,
+ 0x11, 0x03, 0xe0, 0xf2,
+ 0xa0, 0xa9, 0xf0, 0x01, 0x02, 0xd1, 0xe0, 0xde, 0xe0, 0x37, 0x62, 0xef,
+ 0xfe, 0xd1, 0xe4, 0xf0,
+ 0xdf, 0xfe, 0xcf, 0xe1, 0x06, 0xf0, 0xc0, 0x02, 0xa0, 0xd0, 0x02, 0xe3,
+ 0xad, 0x01, 0x11, 0x0a,
+ 0x00, 0xf1, 0xb0, 0x00, 0xfd, 0x0c, 0x40, 0x04, 0xeb, 0x0f, 0x42, 0x11,
+ 0xfc, 0xff, 0x00, 0x01,
+ 0x0e, 0xa9, 0x1f, 0x5e, 0x0f, 0x0e, 0x0d, 0x2d, 0x1f, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x1c, 0x4d, 0x71,
+ 0x43, 0xf9, 0xee, 0x0f, 0x0f, 0x10, 0xff, 0xff, 0x22, 0x3f, 0xf9, 0x00,
+ 0x50, 0x11, 0x0f, 0x1f,
+ 0x0e, 0x5e, 0x00, 0xd3, 0xc0, 0xde, 0x12, 0x56, 0x0f, 0xbd, 0x00, 0x05,
+ 0xe0, 0xf2, 0xf6, 0xb0,
+ 0xef, 0x14, 0x21, 0xe0, 0x03, 0x17, 0xd0, 0x9f, 0x00, 0x23, 0xf1, 0xf0,
+ 0x23, 0xf1, 0xcf, 0x02,
+ 0x07, 0xc0, 0x03, 0x01, 0xa0, 0xff, 0x00, 0x36, 0xe0, 0xc0, 0xef, 0xef,
+ 0x00, 0x00, 0x12, 0x10,
+ 0x00, 0x20, 0x01, 0x00, 0x77, 0x41, 0xee, 0x0f, 0x23, 0x00, 0xab, 0x0f,
+ 0x2e, 0x0b, 0x0f, 0x20,
+ 0xf0, 0xcb, 0x00, 0x1d, 0x0f, 0x4f, 0x20, 0x2f, 0x10, 0x0b, 0x3d, 0x0e,
+ 0xef, 0xf0, 0x10, 0xcc,
+ 0xcb, 0x0f, 0x2f, 0xcd, 0xb0, 0x00, 0x0d, 0x71, 0x20, 0xc8, 0xee, 0x00,
+ 0x02, 0x0e, 0xcd, 0x00,
+ 0x00, 0xdb, 0x12, 0x02, 0xbe, 0xca, 0xe0, 0xe0, 0xe0, 0xe0, 0xf3, 0xf0,
+ 0xec, 0xc0, 0x00, 0xce,
+ 0xbf, 0x15, 0x10, 0xfc, 0xef, 0xf0, 0xe1, 0xe0, 0xde, 0x2f, 0x02, 0x82,
+ 0xce, 0xfb, 0x11, 0x14,
+ 0xde, 0xdf, 0x00, 0x1f, 0xf9, 0xdf, 0xbf, 0x00, 0x00, 0x0e, 0xec, 0xed,
+ 0x60, 0x65, 0x00, 0xdb,
+ 0x00, 0x03, 0x0f, 0xee, 0x20, 0x1f, 0xdd, 0x12, 0x32, 0x0b, 0xbb, 0x00,
+ 0x00, 0x11, 0x7e, 0x4f,
+ 0x0c, 0x10, 0x43, 0x10, 0x0e, 0x00, 0x2f, 0x1f, 0x20, 0xf0, 0xde, 0xe4,
+ 0x04, 0x20, 0x41, 0x45,
+ 0x10, 0x10, 0x0d, 0x5f, 0x32, 0x17, 0xf0, 0x11, 0x60, 0x42, 0x12, 0x0f,
+ 0xcb, 0x00, 0x14, 0x05,
+ 0xf2, 0xa0, 0x00, 0x00, 0x22, 0xf5, 0xc2, 0x02, 0xf2, 0x37, 0x10, 0xc0,
+ 0x00, 0x10, 0x53, 0x00,
+ 0x15, 0x12, 0xf0, 0xe0, 0xf1, 0xf1, 0x06, 0x02, 0xe0, 0xe1, 0xe1, 0x04,
+ 0x11, 0x8f, 0x9f, 0xf2,
+ 0x02, 0xf0, 0x0d, 0x00, 0x25, 0x12, 0x20, 0x2e, 0x13, 0xd4, 0x04, 0x73,
+ 0x0e, 0x0f, 0x05, 0x00,
+ 0x1e, 0x62, 0x01, 0xca, 0xf0, 0x00, 0x22, 0x0e, 0xec, 0x0e, 0x01, 0x01,
+ 0x53, 0x00, 0x4c, 0x00,
+ 0x18, 0x09, 0x89, 0x01, 0x2a, 0x06, 0xd8, 0x05, 0x63, 0xf8, 0xf0, 0x21,
+ 0x12, 0xbe, 0xef, 0x27,
+ 0xf0, 0xce, 0x00, 0xe1, 0x26, 0x40, 0xfe, 0x00, 0xd2, 0x8f, 0xe0, 0x30,
+ 0x30, 0x26, 0x00, 0xde,
+ 0x3e, 0x62, 0xd0, 0xc0, 0x01, 0x03, 0xff, 0x2e, 0x0e, 0xbb, 0xf0, 0x27,
+ 0x53, 0xe0, 0xde, 0xff,
+ 0xff, 0x10, 0x62, 0x22, 0xfb, 0xde, 0x20, 0x02, 0x00, 0x0f, 0x1f, 0x0d,
+ 0x0d, 0x27, 0x76, 0xdf,
+ 0xed, 0x0f, 0x51, 0xf1, 0xb0, 0x0f, 0xff, 0x0c, 0x0e, 0x2f, 0x2e, 0x60,
+ 0x05, 0xf0, 0xf3, 0x0e,
+ 0x1e, 0x24, 0x10, 0x00, 0xf5, 0x02, 0x00, 0xbb, 0xfe, 0x00, 0x00, 0xf0,
+ 0x16, 0x00, 0xce, 0x3e,
+ 0x70, 0x02, 0x30, 0x24, 0x10, 0xcf, 0x00, 0xf6, 0xcf, 0xff, 0xe1, 0xf0,
+ 0x0e, 0x33, 0xd0, 0xae,
+ 0x01, 0x15, 0x00, 0x01, 0x12, 0xe0, 0x0c, 0x70, 0x3e, 0x10, 0xf0, 0x9e,
+ 0xfc, 0x06, 0x2f, 0xec,
+ 0xdd, 0x27, 0x32, 0xcd, 0xef, 0xf1, 0xd2, 0x12, 0x41, 0x10, 0xf1, 0x0f,
+ 0x6c, 0x3f, 0x0e, 0x0f,
+ 0xfe, 0x12, 0x43, 0xee, 0x0d, 0x14, 0x2f, 0xf8, 0x40, 0x22, 0x8e, 0xff,
+ 0xfd, 0xef, 0x0f, 0x02,
+ 0xff, 0x08, 0x0e, 0x0d, 0x30, 0x74, 0x41, 0xee, 0x00, 0x23, 0x12, 0x07,
+ 0x00, 0x30, 0x4f, 0x0e,
+ 0xf0, 0xf2, 0xe0, 0xbd, 0xec, 0x04, 0x03, 0xad, 0x0e, 0x13, 0x1e, 0x0d,
+ 0x77, 0x13, 0xfd, 0xbd,
+ 0x03, 0x16, 0x0f, 0x10, 0x12, 0x0f, 0xda, 0x13, 0x44, 0xb0, 0x00, 0x0f,
+ 0xfd, 0xdf, 0x11, 0x34,
+ 0x23, 0xee, 0xb9, 0x00, 0x43, 0xf2, 0xde, 0xfc, 0x41, 0x01, 0xe0, 0xe0,
+ 0x10, 0x00, 0x2f, 0x10,
+ 0x16, 0xf1, 0xaf, 0xec, 0x31, 0x73, 0x01, 0x0f, 0x0d, 0x0d, 0xee, 0x00,
+ 0x24, 0x01, 0x9e, 0x00,
+ 0x20, 0x1a, 0x10, 0x56, 0xf0, 0xde, 0x00, 0xf0, 0xee, 0x0f, 0x10, 0x1e,
+ 0x00, 0xdd, 0x1b, 0x5e,
+ 0x00, 0xf3, 0x01, 0x65, 0x20, 0xfd, 0xe0, 0x57, 0x02, 0xfd, 0x0f, 0x61,
+ 0xf2, 0xc0, 0x00, 0x0b,
+ 0xfe, 0xf0, 0x26, 0x31, 0x3f, 0x2d, 0x10, 0xe0, 0xd1, 0x33, 0x00, 0xdf,
+ 0x34, 0x23, 0xae, 0x0f,
+ 0x22, 0xad, 0xe0, 0xf7, 0xc0, 0xec, 0x04, 0x41, 0xdd, 0x0e, 0x73, 0x02,
+ 0xd9, 0xf0, 0x42, 0x31,
+ 0xee, 0xf0, 0x00, 0xfd, 0x0d, 0x03, 0xe5, 0xc2, 0x00, 0x0f, 0xbe, 0xf0,
+ 0x05, 0x04, 0xf1, 0x1e,
+ 0x7d, 0x50, 0xe4, 0xf3, 0x0f, 0x08, 0x00, 0x21, 0x41, 0x10, 0x10, 0xd0,
+ 0xe0, 0x0d, 0x11, 0x01,
+ 0x9d, 0x04, 0x12, 0x0b, 0xac, 0x02, 0x12, 0x0c, 0x0d, 0x00, 0x43, 0x00,
+ 0x1f, 0xfc, 0x0f, 0x13,
+ 0x47, 0x20, 0x1f, 0x2d, 0x01, 0x13, 0xde, 0x8d, 0x00, 0x02, 0x02, 0xfd,
+ 0xf8, 0x1d, 0x30, 0x14,
+ 0x21, 0xfd, 0x8e, 0x00, 0x02, 0x20, 0x2f, 0x35, 0xf0, 0x9d, 0x00, 0x11,
+ 0xf0, 0xe2, 0x03, 0x0e,
+ 0x0d, 0x17, 0xf1, 0xe1, 0x02, 0xdd, 0x0f, 0x76, 0xf0, 0xce, 0x10, 0x20,
+ 0x03, 0x02, 0xfc, 0xbc,
+ 0x21, 0x04, 0xdf, 0xe1, 0x05, 0xd0, 0xdd, 0x52, 0x77, 0x00, 0xef, 0x10,
+ 0x30, 0xf0, 0xcf, 0xf2,
+ 0x00, 0x1b, 0x4f, 0x10, 0x01, 0xe0, 0x35, 0x20, 0xde, 0x00, 0x77, 0x00,
+ 0xcd, 0xfe, 0x02, 0x12,
+ 0x0e, 0x0e, 0x11, 0xe0, 0xe9, 0x30, 0x41, 0xff, 0xef, 0x50, 0x31, 0x42,
+ 0x33, 0xfe, 0xeb, 0xff,
+ 0x00, 0x13, 0xf0, 0x9f, 0x0c, 0x0f, 0x33, 0x32, 0x0e, 0x00, 0x2e, 0xb8,
+ 0xf0, 0x24, 0x50, 0x0d,
+ 0x10, 0x53, 0x03, 0xef, 0xef, 0xf2, 0xf3, 0x10, 0xfb, 0xa1, 0xe5, 0x01,
+ 0xe0, 0x00, 0x52, 0xcd,
+ 0xdd, 0x11, 0x23, 0x12, 0x05, 0xee, 0x0b, 0x60, 0x21, 0xf0, 0xba, 0x02,
+ 0xf4, 0xee, 0xe0, 0x00,
+ 0x3f, 0x04, 0x05, 0xe1, 0xc0, 0x0c, 0x00, 0x00, 0x50, 0x11, 0x00, 0x00,
+ 0x30, 0x2c, 0x70, 0x13,
+ 0x13, 0x10, 0x0e, 0xfc, 0xdf, 0xf0, 0x03, 0xeb, 0xad, 0x00, 0x22, 0xfe,
+ 0xd9, 0xf0, 0x00, 0x0e,
+ 0xd0, 0x21, 0x75, 0x4c, 0x0d, 0x52, 0x15, 0x0f, 0x0f, 0x20, 0x10, 0xd0,
+ 0x00, 0x10, 0x0c, 0xff,
+ 0xc0, 0xc0, 0x07, 0x20, 0xd0, 0xdb, 0x30, 0x4f, 0xf0, 0x01, 0x43, 0x41,
+ 0x2f, 0x1d, 0x20, 0x25,
+ 0x92, 0xbf, 0x0d, 0x10, 0x11, 0x07, 0xf0, 0xad, 0x00, 0x02, 0xd3, 0x15,
+ 0x0f, 0x0c, 0x31, 0x44,
+ 0x20, 0x2e, 0xd0, 0x9f, 0xff, 0x00, 0x21, 0xaf, 0x01, 0x02, 0x2d, 0xf0,
+ 0x03, 0x47, 0x27, 0xcf,
+ 0xeb, 0x22, 0x10, 0xee, 0x22, 0xf0, 0xcd, 0x1f, 0x70, 0x13, 0xf0, 0xd0,
+ 0x13, 0x5f, 0x0b, 0x00,
+ 0x06, 0xf0, 0x00, 0x0f, 0x0f, 0xdd, 0x10, 0x24, 0x8d, 0x0e, 0x00, 0x1f,
+ 0x0e, 0xfe, 0x32, 0x45,
+ 0x00, 0xf3, 0xf1, 0xcc, 0x10, 0x21, 0x03, 0xae, 0x0e, 0x37, 0x3f, 0xca,
+ 0x12, 0x32, 0xbf, 0xff,
+ 0x10, 0x2c, 0x00, 0x31, 0x26, 0xee, 0xcd, 0xf0, 0x24, 0x01, 0xf0, 0x42,
+ 0xce, 0xcd, 0x00, 0x43,
+ 0x04, 0xd0, 0xe0, 0x00, 0x0e, 0xbb, 0x00, 0x53, 0x13, 0xfd, 0x21, 0x32,
+ 0xcb, 0x0f, 0x02, 0xd0,
+ 0xeb, 0xe0, 0xf1, 0xb5, 0x00, 0x0e, 0x01, 0xe1, 0xd0, 0x2e, 0x3e, 0x02,
+ 0xb2, 0xf0, 0x11, 0x52,
+ 0x32, 0x2b, 0x08, 0x20, 0x73, 0x21, 0xce, 0x00, 0x12, 0xfc, 0x10, 0x34,
+ 0xe3, 0xab, 0x0e, 0x1f,
+ 0x01, 0xc0, 0xdd, 0xef, 0xfd, 0x2f, 0x71, 0x10, 0x00, 0x06, 0x51, 0x0e,
+ 0x1e, 0xf0, 0xf0, 0x15,
+ 0x34, 0x0e, 0xff, 0xd2, 0xf2, 0xfc, 0xfe, 0x00, 0xab, 0x0d, 0x0f, 0x2f,
+ 0x20, 0x05, 0x11, 0x0e,
+ 0xf8, 0x20, 0x71, 0x12, 0x02, 0xe0, 0x0f, 0x60, 0x0f, 0xfb, 0xc1, 0xf5,
+ 0xf3, 0xaf, 0x0e, 0x00,
+ 0x40, 0x01, 0x27, 0x00, 0xce, 0x10, 0x00, 0x11, 0x20, 0xff, 0xd0, 0xd0,
+ 0xef, 0xfd, 0x03, 0x07,
+ 0xc0, 0x10, 0x73, 0xf0, 0xdf, 0xff, 0x0e, 0xe0, 0xf1, 0x06, 0x10, 0x7e,
+ 0x3e, 0x0d, 0xdc, 0x01,
+ 0x35, 0xf0, 0x20, 0x72, 0x21, 0x00, 0xdf, 0x9e, 0x13, 0x0e, 0x08, 0xf0,
+ 0xd0, 0x0f, 0x0d, 0x4d,
+ 0x0f, 0x2f, 0x12, 0x37, 0x20, 0xca, 0x00, 0x50, 0x21, 0xf0, 0xbe, 0x13,
+ 0x35, 0xfe, 0xed, 0x02,
+ 0xe0, 0x00, 0xf3, 0xbf, 0x08, 0x40, 0x51, 0x22, 0x11, 0xee, 0xac, 0x02,
+ 0x42, 0x0e, 0xfd, 0x04,
+ 0x03, 0x10, 0x0f, 0xf1, 0xd4, 0xff, 0xac, 0xf1, 0x03, 0x13, 0x00, 0xec,
+ 0x33, 0x42, 0x0d, 0x0f,
+ 0x30, 0x00, 0x37, 0xbe, 0xdd, 0x00, 0x10, 0xe0, 0xf2, 0xc2, 0x01, 0x26,
+ 0xef, 0x8d, 0xf0, 0xd3,
+ 0x03, 0x25, 0x00, 0xfd, 0x2d, 0x4e, 0x11, 0xf4, 0xe0, 0x10, 0x70, 0x61,
+ 0xfe, 0x0c, 0x00, 0x2d,
+ 0x02, 0x07, 0x00, 0xea, 0xce, 0x0f, 0x32, 0xcf, 0xaa, 0x00, 0x00, 0x10,
+ 0x1f, 0x22, 0x00, 0x0b,
+ 0x00, 0x62, 0x00, 0x2e, 0x20, 0x06, 0x21, 0x22, 0xee, 0xcc, 0xd0, 0x0f,
+ 0xe2, 0x14, 0x0d, 0x1e,
+ 0x10, 0x80, 0x0e, 0xe0, 0x0d, 0x0f, 0x55, 0x01, 0xfe, 0x21, 0x36, 0x00,
+ 0x0f, 0xff, 0xee, 0xf3,
+ 0xe1, 0xf0, 0x12, 0xb3, 0x00, 0xf0, 0xb1, 0x07, 0x17, 0x30, 0x3c, 0x00,
+ 0x80, 0xf1, 0xd0, 0x00,
+ 0x32, 0x1f, 0x0b, 0x00, 0x10, 0x25, 0xcf, 0xc0, 0xf0, 0x00, 0x13, 0x02,
+ 0x9f, 0x0c, 0x00, 0x00,
+ 0xd1, 0x23, 0x30, 0x08, 0x30, 0x41, 0xf1, 0x74, 0x2f, 0xeb, 0x02, 0x23,
+ 0xe0, 0xdb, 0x10, 0xe0,
+ 0xb0, 0x11, 0x11, 0xec, 0xde, 0x30, 0x63, 0xf1, 0xbc, 0xff, 0x20, 0x71,
+ 0x03, 0x12, 0x00, 0x08,
+ 0xf0, 0xf2, 0x01, 0x01, 0x20, 0x1d, 0x10, 0xe0, 0xcf, 0x2f, 0x63, 0x00,
+ 0x0b, 0x0f, 0x0f, 0x23,
+ 0x21, 0x0f, 0x35, 0xf1, 0x0e, 0x7f, 0x14, 0xe4, 0x9e, 0x0d, 0x01, 0xfe,
+ 0xd0, 0x26, 0x1f, 0x0f,
+ 0x23, 0x24, 0xfd, 0xca, 0x00, 0x31, 0x30, 0xed, 0x02, 0x00, 0xce, 0xee,
+ 0xe0, 0xa9, 0x00, 0x16,
+ 0xe0, 0x80, 0xf0, 0x0f, 0xe0, 0x24, 0x45, 0xef, 0xfc, 0x10, 0x02, 0x00,
+ 0x00, 0xc1, 0x00, 0x3d,
+ 0x70, 0x24, 0x02, 0x02, 0x0e, 0xca, 0x12, 0x13, 0xd0, 0xc9, 0x00, 0x41,
+ 0x00, 0xe0, 0x90, 0x0e,
+ 0x0f, 0x20, 0x00, 0x00, 0x00, 0xff, 0x10, 0x70, 0x10, 0x02, 0x01, 0x0d,
+ 0x05, 0x04, 0x0f, 0x1e,
+ 0x5f, 0xd9, 0xf0, 0x23, 0x2e, 0x0b, 0xf0, 0xb0, 0x01, 0x00, 0x0d, 0x1f,
+ 0x42, 0x03, 0x0d, 0x0f,
+ 0x30, 0x20, 0xfe, 0xc0, 0xe0, 0x0e, 0xe7, 0x81, 0xf0, 0x50, 0x1b, 0xf1,
+ 0xf7, 0xf2, 0xdd, 0x00,
+ 0x01, 0x20, 0xde, 0xe0, 0xc0, 0x72, 0x21, 0xed, 0xde, 0x16, 0x01, 0x02,
+ 0xc0, 0x05, 0x22, 0x0f,
+ 0xdc, 0x04, 0xf0, 0xac, 0x0f, 0x01, 0x02, 0x20, 0x10, 0x01, 0x50, 0x30,
+ 0x0e, 0x12, 0x27, 0xd1,
+ 0xf5, 0x73, 0x0e, 0xcc, 0x01, 0x21, 0x00, 0xed, 0xde, 0x0f, 0xff, 0xef,
+ 0x8b, 0x00, 0x5f, 0x1b,
+ 0x00, 0x00, 0x33, 0x0c, 0x0e, 0x00, 0xf1, 0x07, 0x30, 0xef, 0x0c, 0x11,
+ 0x66, 0xf0, 0xbe, 0xf0,
+ 0x00, 0x41, 0x2e, 0xfd, 0x11, 0x24, 0x20, 0x1c, 0x50, 0x13, 0x10, 0x00,
+ 0xee, 0xa1, 0x06, 0x02,
+ 0xee, 0xa0, 0x00, 0x0f, 0x0f, 0x12, 0x13, 0x03, 0xd2, 0xe0, 0x0c, 0x72,
+ 0x33, 0xef, 0xf9, 0x0e,
+ 0x00, 0xe4, 0xdd, 0xdd, 0x00, 0xe2, 0xef, 0xdf, 0xd7, 0xb1, 0x01, 0x44,
+ 0xdf, 0x9d, 0x00, 0x10,
+ 0x12, 0x03, 0xed, 0x08, 0x6e, 0x40, 0x24, 0x03, 0x00, 0xed, 0xee, 0x31,
+ 0x63, 0xf0, 0xff, 0xee,
+ 0x11, 0x00, 0xde, 0xda, 0xca, 0xde, 0x32, 0x71, 0x0e, 0xfe, 0x0f, 0x1f,
+ 0x1e, 0x00, 0x36, 0x21,
+ 0x30, 0x0e, 0xff, 0x03, 0x03, 0x11, 0x20, 0xfb, 0xf0, 0x00, 0x8d, 0xdd,
+ 0x05, 0xd0, 0x00, 0x70,
+ 0x2a, 0xfc, 0x00, 0x26, 0x20, 0xe0, 0xef, 0xcf, 0x1e, 0x61, 0x11, 0x00,
+ 0x04, 0xf2, 0xd0, 0x00,
+ 0xf2, 0xc0, 0xf0, 0xe0, 0xc5, 0x06, 0x10, 0x0f, 0xa0, 0x0f, 0x6d, 0x20,
+ 0xf2, 0xd0, 0xfe, 0x24,
+ 0x26, 0xef, 0xef, 0x20, 0x20, 0xc0, 0x03, 0xf4, 0xbb, 0xcd, 0x0f, 0x22,
+ 0x13, 0x0e, 0x30, 0x71,
+ 0x0e, 0x02, 0xef, 0xd8, 0x32, 0x77, 0x42, 0x0f, 0xed, 0x0e, 0x00, 0x01,
+ 0xe5, 0x00, 0xed, 0x0e,
+ 0xfe, 0x00, 0xc0, 0xf0, 0x0d, 0x1f, 0x10, 0x00, 0x30, 0x6d, 0x02, 0xe7,
+ 0xf0, 0x0e, 0x42, 0x37,
+ 0x70, 0x0f, 0xdd, 0xdf, 0xff, 0x01, 0x03, 0x70, 0x0d, 0xec, 0x22, 0x34,
+ 0xff, 0xef, 0x43, 0x1f,
+ 0xf0, 0xc1, 0xf0, 0x0d, 0x01, 0x27, 0x0e, 0xa9, 0x12, 0x24, 0xe0, 0xef,
+ 0x00, 0xc0, 0xd1, 0x34,
+ 0x70, 0x01, 0x1f, 0x1e, 0x00, 0xb1, 0x03, 0x0f, 0x08, 0x0f, 0xe3, 0xf3,
+ 0x0e, 0x0d, 0xf2, 0xb4,
+ 0xc0, 0xe0, 0xf2, 0xee, 0x00, 0x23, 0x62, 0x0c, 0xc9, 0x11, 0x33, 0x33,
+ 0x41, 0xe8, 0x20, 0x76,
+ 0x0f, 0xde, 0x02, 0x10, 0x10, 0x41, 0xdd, 0xcd, 0x01, 0xd0, 0xfe, 0x00,
+ 0x42, 0x0b, 0x0e, 0xe0,
+ 0x00, 0x11, 0x00, 0x2f, 0x72, 0x30, 0x00, 0x04, 0xfe, 0xf8, 0x74, 0x02,
+ 0xeb, 0xef, 0x00, 0x10,
+ 0x03, 0xd0, 0x0b, 0x40, 0x40, 0xef, 0xde, 0x10, 0x45, 0x0e, 0xec, 0x00,
+ 0x10, 0xd2, 0x0f, 0x71,
+ 0x41, 0xef, 0xef, 0x01, 0x03, 0xd3, 0x03, 0x2f, 0x0e, 0x04, 0xb0, 0x11,
+ 0x46, 0xef, 0xbe, 0x02,
+ 0x05, 0x20, 0xde, 0xfd, 0x21, 0x32, 0xc5, 0xa1, 0x00, 0xf3, 0x24, 0x10,
+ 0xd0, 0xbe, 0xfd, 0x2f,
+ 0x12, 0x03, 0xe2, 0x0a, 0x40, 0x24, 0xbf, 0x0f, 0x01, 0x40, 0x01, 0x33,
+ 0x00, 0xe7, 0x07, 0x0d,
+ 0x3d, 0x11, 0xc2, 0xe0, 0x30, 0xfe, 0xde, 0x61, 0xf8, 0xbd, 0x30, 0x35,
+ 0xd0, 0xfe, 0xe0, 0xde,
+ 0x61, 0x63, 0x00, 0x1f, 0x00, 0x00, 0xef, 0xde, 0x03, 0x20, 0xfc, 0xed,
+ 0x11, 0x61, 0x3e, 0x4f,
+ 0x0c, 0xfe, 0x00, 0x00, 0xf7, 0x05, 0x30, 0x0f, 0x9c, 0x01, 0x12, 0x0f,
+ 0xef, 0xe6, 0xd2, 0xf1,
+ 0x0f, 0x0c, 0x02, 0x71, 0x21, 0x12, 0x02, 0xde, 0xbb, 0x20, 0x43, 0xee,
+ 0x0d, 0x54, 0x10, 0xfc,
+ 0xe0, 0xc3, 0xe5, 0xf0, 0xf0, 0xe0, 0xe0, 0xd2, 0xa5, 0xdf, 0xef, 0x12,
+ 0x1f, 0x2b, 0x1f, 0x30,
+ 0x41, 0x54, 0x10, 0x20, 0x30, 0x10, 0x3e, 0x0f, 0x41, 0xe4, 0x9d, 0x0e,
+ 0xdc, 0xff, 0xe0, 0xdc,
+ 0x0c, 0x01, 0x0f, 0x0d, 0x63, 0xea, 0xdb, 0x30, 0x72, 0x30, 0x20, 0x1e,
+ 0x00, 0x22, 0x43, 0x00,
+ 0xcc, 0xff, 0xf6, 0xf2, 0x00, 0x1d, 0xec, 0xf0, 0x57, 0xf0, 0xb0, 0x0c,
+ 0x00, 0x21, 0x32, 0x2f,
+ 0x3f, 0xfb, 0xcf, 0x40, 0x41, 0x00, 0x00, 0xf5, 0x90, 0xef, 0x00, 0x10,
+ 0x36, 0xe1, 0xb0, 0x00,
+ 0x1f, 0xff, 0xe0, 0x30, 0x4f, 0xf0, 0xd2, 0x10, 0x5c, 0x1e, 0x0f, 0xf7,
+ 0xe3, 0xc0, 0x0d, 0x23,
+ 0x44, 0xd0, 0xae, 0xee, 0xd1, 0x00, 0x00, 0x31, 0xf9, 0xcf, 0x10, 0x11,
+ 0x0a, 0x75, 0x34, 0xfd,
+ 0xcb, 0x01, 0x33, 0x13, 0xef, 0x0d, 0xf0, 0x00, 0x11, 0x02, 0xee, 0x2f,
+ 0xef, 0x8c, 0xdd, 0x13,
+ 0x01, 0xfa, 0xef, 0x51, 0x12, 0x1f, 0x5f, 0x00, 0x00, 0x25, 0x02, 0x88,
+ 0x00, 0x57, 0xde, 0x0f,
+ 0x11, 0x00, 0x1f, 0x11, 0xe0, 0xee, 0x53, 0x00, 0x0c, 0x02, 0x12, 0x21,
+ 0x0d, 0xbb, 0x11, 0x23,
+ 0x01, 0x0f, 0xde, 0x32, 0x10, 0xfd, 0x15, 0xf0, 0xf1, 0xbe, 0xbb, 0x45,
+ 0x10, 0xbb, 0x31, 0x34,
+ 0xce, 0xed, 0x00, 0x33, 0x53, 0xeb, 0xee, 0x02, 0x12, 0xf0, 0xde, 0x20,
+ 0x03, 0xd0, 0xd0, 0xde,
+ 0x00, 0xf0, 0xce, 0xde, 0x03, 0x03, 0x3f, 0x77, 0x70, 0xfd, 0x04, 0x0f,
+ 0xfc, 0x25, 0x0f, 0xfe,
+ 0x36, 0x00, 0xbd, 0x10, 0x22, 0x00, 0xbd, 0xef, 0xe1, 0x15, 0xff, 0xee,
+ 0x0f, 0x60, 0x11, 0x12,
+ 0x0e, 0x10, 0x01, 0x21, 0x0d, 0x4f, 0x12, 0xde, 0x0f, 0x77, 0x0f, 0xfe,
+ 0xf4, 0xeb, 0x00, 0xf2,
+ 0xdf, 0xfd, 0x30, 0x74, 0x30, 0xff, 0xcf, 0x1f, 0x0a, 0x2f, 0x32, 0x14,
+ 0xcf, 0xff, 0xed, 0x44,
+ 0x34, 0xbc, 0xe0, 0x14, 0xfe, 0x00, 0x01, 0xde, 0xce, 0x66, 0x00, 0xe0,
+ 0x0e, 0x00, 0x25, 0x1f,
+ 0xcd, 0xf0, 0x15, 0x20, 0x00, 0x1e, 0x10, 0xd4, 0xb0, 0xcd, 0xee, 0x13,
+ 0x02, 0xec, 0x00, 0xf0,
+ 0x00, 0x33, 0x32, 0x40, 0x1c, 0x0c, 0xf5, 0xa3, 0x00, 0x2f, 0x52, 0x0f,
+ 0x0d, 0x63, 0x04, 0x0e,
+ 0xeb, 0xee, 0xdf, 0x24, 0x00, 0x88, 0x10, 0x50, 0x01, 0x00, 0xf0, 0x0d,
+ 0x02, 0x01, 0x0e, 0xf0,
+ 0x01, 0x00, 0x2f, 0x0d, 0x30, 0x43, 0x23, 0xfb, 0xed, 0x21, 0x77, 0x50,
+ 0x0c, 0x00, 0x01, 0x03,
+ 0xdf, 0xe0, 0x0f, 0x30, 0x50, 0xf1, 0xa0, 0xff, 0x00, 0x14, 0x13, 0x04,
+ 0x01, 0xde, 0x04, 0x02,
+ 0x0d, 0x21, 0x27, 0xf0, 0xba, 0x0f, 0x40, 0x14, 0xe0, 0xec, 0x00, 0x03,
+ 0xc1, 0xd0, 0xd0, 0xae,
+ 0x02, 0x04, 0xad, 0xde, 0xe0, 0x23, 0x02, 0xff, 0xf2, 0x1f, 0x09, 0x72,
+ 0x32, 0x0f, 0x00, 0x04,
+ 0x00, 0x1e, 0x13, 0xf0, 0x0e, 0x73, 0x56, 0xf0, 0xec, 0xff, 0xfc, 0x01,
+ 0x00, 0xc9, 0x02, 0x14,
+ 0xed, 0x0c, 0x2f, 0x51, 0x13, 0xed, 0x0f, 0x32, 0x10, 0x2c, 0x71, 0x23,
+ 0x01, 0x01, 0xdd, 0x0e,
+ 0xdd, 0xf0, 0xe2, 0xf1, 0x04, 0xfd, 0x08, 0x2e, 0x71, 0x31, 0xdf, 0x00,
+ 0x71, 0x0d, 0x3a, 0x00,
+ 0xee, 0xf2, 0x27, 0x0f, 0x4f, 0x00, 0x80, 0xf1, 0x03, 0xe0, 0x03, 0x12,
+ 0x1d, 0xdd, 0xec, 0xde,
+ 0x37, 0x34, 0xdd, 0x3f, 0x71, 0x00, 0xef, 0x02, 0x47, 0xdf, 0x01, 0x05,
+ 0x67, 0x00, 0x33, 0x00,
+ 0x62, 0x06, 0x87, 0xa7, 0x14, 0x07, 0x7e, 0xa8, 0x00, 0xac, 0xda, 0xfb,
+ 0xfc, 0x00, 0xee, 0x0c,
+ 0x3f, 0x4e, 0x3e, 0x0e, 0x2f, 0x10, 0xfd, 0xa8, 0x10, 0x72, 0x20, 0x10,
+ 0x0d, 0x20, 0x05, 0xe1,
+ 0xbd, 0x10, 0x13, 0xf0, 0xc0, 0x00, 0x0e, 0x31, 0x22, 0xf0, 0xbf, 0x08,
+ 0x00, 0x44, 0x10, 0x2f,
+ 0x0f, 0x00, 0xc2, 0x00, 0xff, 0xf0, 0x00, 0x73, 0x10, 0xe9, 0xde, 0x00,
+ 0x14, 0x4f, 0x5f, 0x11,
+ 0xe9, 0xef, 0x44, 0x20, 0x09, 0x00, 0xf0, 0xef, 0x31, 0xef, 0x0d, 0x40,
+ 0xe1, 0xb1, 0xf0, 0xfe,
+ 0x2f, 0x41, 0xf2, 0xd1, 0xdc, 0xda, 0x40, 0x50, 0x0f, 0x0f, 0x00, 0xde,
+ 0x0a, 0x50, 0x01, 0x11,
+ 0xdd, 0xac, 0xe0, 0xe5, 0xb0, 0xd0, 0xfd, 0xf0, 0x23, 0x04, 0xb0, 0xfe,
+ 0x0e, 0x0f, 0x65, 0x14,
+ 0x01, 0xf0, 0x12, 0x24, 0x12, 0x30, 0x55, 0x03, 0xe1, 0x03, 0x25, 0xf1,
+ 0xb0, 0x04, 0x00, 0xb2,
+ 0xf3, 0xe2, 0xf0, 0x04, 0x13, 0x03, 0x04, 0x01, 0x30, 0x74, 0x52, 0x06,
+ 0x02, 0xf0, 0x02, 0x23,
+ 0x20, 0x02, 0x04, 0x05, 0xc0, 0xd0, 0x03, 0x32, 0x41, 0xef, 0x9d, 0x01,
+ 0x26, 0x20, 0x1f, 0x0e,
+ 0x30, 0xf0, 0x0e, 0x20, 0x5e, 0x0d, 0x0c, 0xf1, 0x16, 0x88, 0xff, 0x75,
+ 0x0e, 0xed, 0x13, 0xe0,
+ 0xed, 0x00, 0xf0, 0x0c, 0x52, 0x00, 0xed, 0x0f, 0x10, 0x30, 0xee, 0xdc,
+ 0x00, 0x00, 0xd0, 0xf0,
+ 0x20, 0x0c, 0xbb, 0xee, 0x11, 0x32, 0xf0, 0xcb, 0xce, 0xd0, 0x00, 0x45,
+ 0x30, 0xcc, 0x10, 0x74,
+ 0x30, 0xce, 0x03, 0x23, 0x00, 0xeb, 0x21, 0x24, 0xdf, 0x00, 0x21, 0xbf,
+ 0x01, 0x13, 0x00, 0xd0,
+ 0x0e, 0xdd, 0x36, 0x76, 0xef, 0xdd, 0x21, 0x33, 0x00, 0xf0, 0xf0, 0x0f,
+ 0x62, 0x10, 0xf0, 0xe0,
+ 0xee, 0x10, 0x73, 0x12, 0x01, 0xe0, 0xfb, 0x11, 0x51, 0x1e, 0x23, 0x01,
+ 0xa8, 0x0c, 0x13, 0x00,
+ 0xf0, 0x10, 0x03, 0xf3, 0xee, 0x1e, 0x41, 0xff, 0xf1, 0x27, 0x02, 0xbd,
+ 0x10, 0x42, 0x1f, 0x1c,
+ 0x0d, 0x55, 0x17, 0xc0, 0xbc, 0x00, 0x12, 0x01, 0xb0, 0xe0, 0xe1, 0x10,
+ 0x20, 0x02, 0x04, 0xd0,
+ 0x0e, 0x13, 0x22, 0x0e, 0xd2, 0x01, 0x03, 0x77, 0x64, 0xed, 0x04, 0x00,
+ 0x02, 0x20, 0x01, 0x24,
+ 0x01, 0xc0, 0x17, 0x01, 0xf0, 0xaf, 0x00, 0x10, 0x01, 0x06, 0xde, 0x00,
+ 0x1f, 0x3f, 0x40, 0x54,
+ 0x00, 0xc0, 0x1f, 0x23, 0x10, 0xec, 0xfe, 0x55, 0x03, 0xff, 0xad, 0x0e,
+ 0x13, 0x26, 0x0f, 0xfe,
+ 0x10, 0x13, 0x0e, 0x1f, 0x40, 0x1d, 0x0d, 0xbe, 0x0f, 0x0d, 0x08, 0x00,
+ 0x42, 0xf0, 0xc0, 0xf0,
+ 0x0d, 0x6f, 0x00, 0x00, 0xbd, 0x0b, 0x02, 0xf1, 0x09, 0x40, 0x30, 0x0e,
+ 0x00, 0xff, 0xf1, 0x13,
+ 0xfd, 0xc9, 0x01, 0x01, 0x11, 0x51, 0x21, 0xcf, 0xce, 0xe1, 0xcf, 0xfe,
+ 0xfd, 0x0b, 0x41, 0x00,
+ 0xed, 0xdf, 0x10, 0x47, 0x40, 0x30, 0x11, 0x04, 0xe1, 0xe2, 0x12, 0x0f,
+ 0x00, 0xe7, 0x02, 0xf0,
+ 0x80, 0xcc, 0x00, 0x15, 0xff, 0xce, 0x21, 0x30, 0x30, 0x01, 0xdf, 0x30,
+ 0x74, 0xe8, 0xff, 0x20,
+ 0x0f, 0x0f, 0x00, 0x21, 0x30, 0xfc, 0xaf, 0x00, 0xf2, 0x00, 0x1c, 0x31,
+ 0x12, 0x7d, 0x5c, 0x1d,
+ 0x00, 0x0f, 0xcb, 0x0e, 0xdc, 0x2e, 0x40, 0x30, 0x00, 0xf0, 0x03, 0xed,
+ 0xa8, 0xff, 0xf1, 0x22,
+ 0x10, 0x0c, 0x0f, 0x2e, 0x7f, 0x4e, 0x1a, 0x00, 0x03, 0xbe, 0xe8, 0x30,
+ 0x22, 0x9e, 0xff, 0x0f,
+ 0x1e, 0x0f, 0xf1, 0xe3, 0xe2, 0x00, 0xc8, 0x00, 0x10, 0xf3, 0xcf, 0xfe,
+ 0x23, 0x61, 0x1f, 0x2e,
+ 0x02, 0x07, 0x34, 0x21, 0x02, 0xbe, 0x22, 0x47, 0xd3, 0xd0, 0x0f, 0xc1,
+ 0xf1, 0x15, 0xe0, 0xde,
+ 0x14, 0x11, 0x00, 0x11, 0x74, 0x11, 0x10, 0x01, 0x13, 0x01, 0x01, 0x32,
+ 0x44, 0x02, 0xc1, 0x04,
+ 0xc0, 0x00, 0x37, 0xb3, 0xdf, 0x20, 0x20, 0x10, 0x65, 0x02, 0x0d, 0xff,
+ 0x00, 0x1f, 0x20, 0x2e,
+ 0x0f, 0x50, 0x00, 0x03, 0x12, 0xa8, 0xfd, 0x02, 0x04, 0xf2, 0xcd, 0xed,
+ 0x0e, 0x20, 0x01, 0xad,
+ 0xff, 0xfc, 0x0d, 0x00, 0x42, 0x32, 0x28, 0x0d, 0x00, 0x00, 0x2f, 0xec,
+ 0x0e, 0xfe, 0x8c, 0xef,
+ 0xd1, 0xeb, 0x0c, 0x0f, 0xae, 0xed, 0x00, 0xf1, 0x0f, 0xe8, 0x10, 0x70,
+ 0x40, 0x11, 0x00, 0xff,
+ 0x12, 0x00, 0x00, 0x31, 0x88, 0x10, 0x55, 0xdc, 0x01, 0x12, 0xee, 0x10,
+ 0x10, 0xce, 0x00, 0x34,
+ 0xce, 0x00, 0x3f, 0x00, 0x00, 0x1e, 0x70, 0x01, 0xfc, 0xfe, 0x00, 0x43,
+ 0x0f, 0xfa, 0x0f, 0x00,
+ 0x00, 0xfd, 0x20, 0x10, 0xeb, 0x0f, 0xfd, 0xdd, 0x1e, 0x08, 0x70, 0x70,
+ 0x2f, 0xbe, 0x00, 0x00,
+ 0x0d, 0x0d, 0xfd, 0x02, 0x13, 0x08, 0x0c, 0x42, 0x02, 0xbb, 0x0f, 0x20,
+ 0xff, 0x0f, 0xff, 0xf0,
+ 0x0f, 0x1f, 0x0d, 0x00, 0xbc, 0xfe, 0x00, 0xe0, 0x20, 0x40, 0xd9, 0xd0,
+ 0xf1, 0x8c, 0x00, 0x11,
+ 0x00, 0x0c, 0xd0, 0x0f, 0x41, 0x10, 0x20, 0xf3, 0xf0, 0x77, 0x10, 0x00,
+ 0xe0, 0x00, 0xd0, 0xe4,
+ 0x04, 0x20, 0x0f, 0x00, 0x00, 0xc3, 0xf1, 0xe0, 0x2e, 0x72, 0x77, 0xe0,
+ 0x02, 0x11, 0x0e, 0x01,
+ 0x02, 0xf5, 0x03, 0xed, 0xce, 0x17, 0x43, 0x00, 0x00, 0xe2, 0x11, 0x54,
+ 0x23, 0x21, 0x0f, 0xde,
+ 0x14, 0x00, 0x10, 0x34, 0x32, 0x2f, 0xfd, 0x12, 0xc3, 0x80, 0xe0, 0x12,
+ 0x0c, 0x27, 0x11, 0x01,
+ 0x01, 0x2f, 0x2b, 0xdf, 0xe0, 0x00, 0x2f, 0x1d, 0x0e, 0xff, 0x8a, 0xfe,
+ 0x10, 0x32, 0x1e, 0xf0,
+ 0x80, 0xfc, 0xb9, 0xff, 0x00, 0x1e, 0x1c, 0xed, 0x00, 0x10, 0xed, 0xda,
+ 0x40, 0x51, 0x00, 0xf0,
+ 0x1e, 0x10, 0xbd, 0xc0, 0x27, 0x23, 0x0d, 0x10, 0xd0, 0xdf, 0x33, 0x34,
+ 0x10, 0x40, 0x00, 0xbf,
+ 0x0e, 0x0e, 0x16, 0x34, 0xce, 0xfe, 0x01, 0x23, 0x03, 0xfc, 0x4f, 0x00,
+ 0xa2, 0xe2, 0x05, 0x12,
+ 0x10, 0x41, 0x57, 0xe1, 0xef, 0x00, 0x13, 0xe3, 0xce, 0x20, 0x76, 0x11,
+ 0x2f, 0x0e, 0x31, 0x13,
+ 0xff, 0xce, 0xf2, 0x04, 0x45, 0x00, 0xb2, 0xe3, 0xe0, 0x03, 0x77, 0x24,
+ 0x0f, 0xfe, 0x01, 0x01,
+ 0x10, 0x02, 0x32, 0xf0, 0x0c, 0x22, 0xf3, 0x91, 0xf2, 0xe4, 0xef, 0x10,
+ 0x44, 0xc3, 0xd1, 0xd5,
+ 0xe0, 0xd0, 0xd5, 0xd1, 0xe0, 0xe0, 0x01, 0x63, 0x40, 0x1e, 0x13, 0x67,
+ 0x24, 0x21, 0x01, 0xf0,
+ 0x24, 0x26, 0xb0, 0xce, 0xe0, 0x04, 0x03, 0x00, 0xe0, 0x00, 0xf0, 0xc2,
+ 0xd4, 0xf1, 0x34, 0x72,
+ 0x70, 0x12, 0xf0, 0x03, 0x17, 0x00, 0x0f, 0x01, 0xe5, 0x01, 0x20, 0x00,
+ 0xb1, 0xcc, 0x36, 0x33,
+ 0xde, 0xef, 0x00, 0x00, 0x25, 0xff, 0xcc, 0x60, 0x43, 0x00, 0xfd, 0x20,
+ 0x20, 0x00, 0xee, 0x01,
+ 0x00, 0x0b, 0xf0, 0x01, 0x9f, 0xff, 0xdd, 0x1f, 0x42, 0xdd, 0xd9, 0x21,
+ 0x1f, 0xfa, 0x40, 0x31,
+ 0x00, 0x20, 0xf0, 0xdd, 0x20, 0x65, 0x21, 0xbe, 0xfe, 0x03, 0x21, 0xdc,
+ 0xd0, 0x03, 0xf1, 0xae,
+ 0xf0, 0xe6, 0xde, 0xee, 0x33, 0x74, 0x10, 0x00, 0xf0, 0x0f, 0x32, 0x67,
+ 0x00, 0xff, 0x04, 0x12,
+ 0x0e, 0xf0, 0xf1, 0x01, 0x43, 0x02, 0x8e, 0xe0, 0x06, 0xfe, 0x1d, 0x20,
+ 0x20, 0x12, 0x0e, 0x00,
+ 0xfd, 0x2c, 0x61, 0xfe, 0xe9, 0x00, 0x10, 0x2d, 0x0d, 0xef, 0xd2, 0x04,
+ 0x9a, 0x0f, 0x00, 0x00,
+ 0x2e, 0x1f, 0x1d, 0xda, 0x0e, 0x1f, 0x0d, 0x5e, 0x1e, 0x0d, 0xba, 0x0e,
+ 0x0f, 0x11, 0x10, 0xec,
+ 0x0c, 0x7f, 0x3f, 0x10, 0xfc, 0xbe, 0x00, 0x0d, 0x0c, 0x1f, 0x2d, 0x00,
+ 0xd0, 0xba, 0x24, 0x2f,
+ 0xd8, 0x73, 0x51, 0xab, 0x01, 0x10, 0x01, 0x01, 0xed, 0xf0, 0x01, 0xf0,
+ 0xee, 0x00, 0x13, 0x33,
+ 0x0c, 0x20, 0x21, 0x04, 0x20, 0x00, 0x00, 0x32, 0x11, 0x01, 0x33, 0xb0,
+ 0xce, 0xf0, 0xf3, 0x03,
+ 0x27, 0x77, 0xff, 0xcd, 0x23, 0x13, 0xee, 0x12, 0x34, 0xbc, 0xf0, 0x23,
+ 0x20, 0x0f, 0x1f, 0x30,
+ 0x24, 0x67, 0xe0, 0xce, 0x00, 0x32, 0x22, 0xf1, 0xf0, 0x0f, 0xbf, 0xe0,
+ 0x02, 0x11, 0x0d, 0xf8,
+ 0x20, 0x52, 0xbf, 0xfe, 0x40, 0x30, 0x0e, 0xfe, 0x02, 0xe1, 0xfd, 0xfc,
+ 0x3c, 0x50, 0x00, 0xcd,
+ 0xea, 0x0e, 0x0e, 0x6f, 0x24, 0x00, 0xc9, 0xef, 0x00, 0x0f, 0x10, 0x31,
+ 0xfe, 0xef, 0xdc, 0x0e,
+ 0x41, 0xef, 0x8c, 0x00, 0x1f, 0xfc, 0xcf, 0x1f, 0x3e, 0xe9, 0xef, 0x20,
+ 0x00, 0xad, 0x00, 0x00,
+ 0x10, 0x30, 0x0f, 0xee, 0xdd, 0x00, 0x35, 0x10, 0x21, 0x00, 0x44, 0x13,
+ 0xe0, 0x3c, 0x7e, 0x42,
+ 0xf7, 0xb1, 0xee, 0x0e, 0x00, 0xfe, 0x14, 0x65, 0xef, 0xdc, 0x01, 0x22,
+ 0x12, 0x00, 0xe0, 0x0f,
+ 0x23, 0x34, 0x20, 0x1e, 0x7e, 0x77, 0x40, 0xde, 0x0f, 0x0f, 0x00, 0x0d,
+ 0xdd, 0xeb, 0xef, 0xf0,
+ 0x21, 0x3d, 0xfa, 0xe0, 0x0f, 0x3f, 0x71, 0x71, 0x0d, 0x0d, 0x02, 0x20,
+ 0xf8, 0x0b, 0x40, 0x00,
+ 0xcd, 0x00, 0xe1, 0x01, 0x30, 0x0c, 0xe0, 0xe0, 0xdf, 0xd0, 0xf1, 0xf0,
+ 0x8c, 0xc9, 0xf0, 0x03,
+ 0x00, 0xba, 0x00, 0x10, 0x20, 0x2f, 0x10, 0x00, 0xcd, 0x10, 0x75, 0x11,
+ 0x01, 0xf0, 0xff, 0xf2,
+ 0xf4, 0xe0, 0xe2, 0xf0, 0x05, 0x24, 0x00, 0x12, 0xf0, 0xce, 0x10, 0x64,
+ 0x01, 0x25, 0x01, 0xef,
+ 0xff, 0x22, 0x63, 0x02, 0x02, 0x02, 0xf3, 0xd5, 0x13, 0x21, 0x00, 0x17,
+ 0xd0, 0x90, 0x57, 0x03,
+ 0xdd, 0x20, 0x50, 0x1f, 0x43, 0xe0, 0xdf, 0x0f, 0x44, 0x11, 0xff, 0xff,
+ 0xf0, 0xe0, 0x23, 0x03,
+ 0xcc, 0xd0, 0x21, 0x1d, 0x21, 0x03, 0xd0, 0x63, 0x1b, 0x1e, 0x21, 0x05,
+ 0xff, 0x0a, 0x71, 0x71,
+ 0x0e, 0xea, 0x02, 0xf3, 0xee, 0xed, 0xdf, 0x0f, 0xff, 0xce, 0x00, 0xdf,
+ 0xfd, 0xdb, 0xfd, 0x10,
+ 0x10, 0x3d, 0x50, 0x1e, 0x44, 0x44, 0x1f, 0x00, 0x1f, 0x0d, 0x0e, 0xe5,
+ 0x06, 0xdf, 0xbe, 0x00,
+ 0xf3, 0xf3, 0x22, 0x13, 0x8f, 0x9c, 0x00, 0x14, 0x47, 0x0e, 0xfd, 0x01,
+ 0x22, 0x0e, 0x21, 0x10,
+ 0xfa, 0x11, 0x23, 0xd0, 0xc0, 0xd0, 0x10, 0x73, 0x11, 0xfd, 0xd1, 0x07,
+ 0x01, 0x1f, 0x7f, 0x0f,
+ 0x0e, 0xef, 0xf1, 0x01, 0x31, 0x23, 0x1d, 0x00, 0xd2, 0xd3, 0x27, 0x77,
+ 0x43, 0x00, 0xd0, 0xf1,
+ 0xe4, 0xd1, 0xe0, 0x01, 0x61, 0x02, 0x15, 0x00, 0x01, 0x20, 0x34, 0x65,
+ 0x00, 0x00, 0xb1, 0xf0,
+ 0xd0, 0xf1, 0xf1, 0xee, 0xcd, 0x0f, 0x00, 0xed, 0xef, 0xb8, 0x00, 0x14,
+ 0x60, 0x20, 0x1f, 0x1c,
+ 0x11, 0x03, 0xfd, 0xec, 0xff, 0x22, 0x34, 0x00, 0xcf, 0x02, 0x14, 0xf0,
+ 0x07, 0x03, 0xaf, 0xed,
+ 0xf3, 0x07, 0x01, 0xcf, 0x89, 0x33, 0x34, 0x9d, 0x0e, 0x00, 0x21, 0x23,
+ 0x00, 0xec, 0x12, 0x11,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0xed, 0x03, 0xf4, 0xee, 0x0e, 0x72, 0x24,
+ 0xfe, 0xee, 0x31, 0x21,
+ 0xee, 0xeb, 0x00, 0x63, 0x00, 0x0c, 0x00, 0xe8, 0xd0, 0x63, 0x21, 0xee,
+ 0xde, 0xff, 0xce, 0xfd,
+ 0x45, 0x45, 0xed, 0xdc, 0x41, 0x31, 0x00, 0xed, 0x30, 0x53, 0xff, 0xca,
+ 0x20, 0x20, 0xe0, 0x9f,
+ 0x0e, 0xef, 0xeb, 0x00, 0x11, 0x0e, 0xaa, 0x01, 0x32, 0x0f, 0xfd, 0xf3,
+ 0x12, 0x1d, 0x30, 0x54,
+ 0x23, 0x0e, 0x00, 0xe2, 0x13, 0x52, 0x00, 0x0d, 0xd4, 0xf3, 0xc4, 0xe2,
+ 0x03, 0x01, 0x32, 0x01,
+ 0xb2, 0xef, 0xcb, 0x02, 0x30, 0x0e, 0x23, 0x33, 0xc8, 0xed, 0x10, 0x63,
+ 0x33, 0x46, 0x12, 0xff,
+ 0xd9, 0x20, 0x72, 0x00, 0xfd, 0xdf, 0x0d, 0x0e, 0x0d, 0x02, 0x00, 0xd8,
+ 0x00, 0x12, 0x01, 0xff,
+ 0xbc, 0x1e, 0x70, 0x40, 0x03, 0xe0, 0xfa, 0x1f, 0x20, 0x30, 0x1f, 0xea,
+ 0xe0, 0x10, 0x10, 0xcf,
+ 0xbd, 0x00, 0x03, 0x22, 0xbc, 0xed, 0xee, 0xd0, 0xf4, 0xe1, 0xce, 0xcb,
+ 0x00, 0x21, 0x20, 0x0f,
+ 0x75, 0x21, 0x0f, 0x13, 0x03, 0xd2, 0xf1, 0xc0, 0xf4, 0x07, 0x33, 0x62,
+ 0x04, 0xc0, 0x03, 0x04,
+ 0x01, 0x14, 0x76, 0x33, 0xe0, 0xc0, 0x02, 0x33, 0x02, 0xf3, 0xf2, 0xf2,
+ 0xe2, 0xf2, 0xf5, 0x00,
+ 0x02, 0x03, 0x26, 0x12, 0xe0, 0xdf, 0x12, 0x42, 0x61, 0x54, 0x00, 0xe0,
+ 0x42, 0x33, 0x0e, 0xed,
+ 0x1d, 0x60, 0x04, 0xfc, 0xee, 0x11, 0x23, 0x00, 0xed, 0x0d, 0xda, 0xdd,
+ 0xf0, 0xc1, 0xbf, 0xec,
+ 0xda, 0xfc, 0x3e, 0x1d, 0x0b, 0x50, 0x2e, 0xec, 0x1f, 0x4e, 0x0e, 0x0e,
+ 0xea, 0x50, 0x30, 0x50,
+ 0x20, 0xbd, 0xaa, 0xff, 0x00, 0xe0, 0xfc, 0x0f, 0x20, 0xf0, 0xbb, 0xff,
+ 0x0e, 0x30, 0x2f, 0x0e,
+ 0xef, 0x0f, 0x30, 0x00, 0xcb, 0x00, 0x70, 0x10, 0x01, 0x00, 0xed, 0x10,
+ 0x46, 0x00, 0xff, 0x12,
+ 0xf3, 0xaf, 0x1f, 0x40, 0x14, 0x0e, 0xca, 0x01, 0x00, 0x01, 0x0d, 0x1b,
+ 0x10, 0xe0, 0xe0, 0x01,
+ 0xd1, 0xed, 0x23, 0x75, 0x01, 0x53, 0x1d, 0xf9, 0xf0, 0x20, 0x30, 0x1e,
+ 0x5e, 0x30, 0x0f, 0xdf,
+ 0xeb, 0xfe, 0x11, 0x02, 0xfd, 0xcd, 0x0f, 0xfd, 0x89, 0xce, 0xf0, 0x13,
+ 0x2b, 0x0d, 0x4f, 0x0e,
+ 0x0a, 0x10, 0x60, 0x13, 0x2f, 0x1c, 0x1d, 0x30, 0x10, 0x10, 0xee, 0x8d,
+ 0xf0, 0xe0, 0xdd, 0xc8,
+ 0xff, 0x0f, 0x0f, 0xdf, 0xf0, 0x01, 0x00, 0x1c, 0x5e, 0x2e, 0x11, 0x25,
+ 0x00, 0x0d, 0xfe, 0x0f,
+ 0x1e, 0xce, 0x55, 0x34, 0x10, 0x1f, 0xe0, 0x91, 0xf5, 0xe0, 0xc0, 0x03,
+ 0x11, 0xe0, 0x00, 0x20,
+ 0x55, 0x10, 0x00, 0x12, 0x02, 0x0e, 0x70, 0x27, 0x04, 0xd1, 0x02, 0x02,
+ 0xce, 0xde, 0x27, 0x02,
+ 0xc1, 0x13, 0x63, 0x00, 0x0f, 0xf3, 0x17, 0x31, 0x31, 0x61, 0x00, 0xd0,
+ 0x10, 0x30, 0x03, 0xf2,
+ 0xc4, 0xf3, 0xf3, 0xdc, 0xdc, 0x0f, 0x10, 0x55, 0xf0, 0xbe, 0xfd, 0x00,
+ 0x40, 0x3e, 0x5f, 0x0d,
+ 0xf9, 0x0f, 0x10, 0x30, 0x3d, 0x3f, 0x0b, 0xcd, 0xee, 0xee, 0xf0, 0x10,
+ 0xfd, 0x88, 0xc0, 0xfe,
+ 0xe0, 0xf0, 0xde, 0x1f, 0xee, 0xd0, 0xf2, 0xed, 0xe9, 0x2f, 0x4e, 0x70,
+ 0x31, 0xf0, 0xbf, 0x0d,
+ 0x40, 0x21, 0x0c, 0xf1, 0xf6, 0x00, 0x04, 0xf0, 0xbf, 0x01, 0xf3, 0x01,
+ 0x00, 0xff, 0xf2, 0x01,
+ 0x0f, 0x30, 0x21, 0x2f, 0x32, 0xf7, 0xd7, 0x61, 0x00, 0xb0, 0x15, 0x61,
+ 0x11, 0x01, 0xd2, 0x01,
+ 0x01, 0x00, 0x10, 0x30, 0x00, 0xcf, 0x02, 0x67, 0x07, 0x0f, 0x40, 0x33,
+ 0x00, 0xc1, 0x01, 0x00,
+ 0x60, 0x11, 0x00, 0xdf, 0xde, 0x02, 0x13, 0x1d, 0x60, 0x47, 0x06, 0x0f,
+ 0xd0, 0x21, 0x32, 0x12,
+ 0xff, 0x00, 0x12, 0xc2, 0xb0, 0xf0, 0xdd, 0x0d, 0x02, 0x27, 0x07, 0x80,
+ 0xee, 0xf0, 0xf0, 0x01,
+ 0x13, 0xe2, 0xdf, 0xff, 0x00, 0x30, 0x21, 0xee, 0x0f, 0x77, 0x17, 0xc1,
+ 0x0f, 0x40, 0x02, 0x02,
+ 0x02, 0x02, 0x31, 0x02, 0xc2, 0xf1, 0xe1, 0x11, 0x12, 0x02, 0x06, 0xd0,
+ 0xb1, 0xf3, 0xe3, 0x03,
+ 0x26, 0x00, 0x13, 0x74, 0x71, 0x11, 0xf1, 0xf2, 0x05, 0x21, 0x1f, 0x3f,
+ 0x73, 0x02, 0xe3, 0x27,
+ 0x21, 0xbe, 0xff, 0xf3, 0x04, 0x0e, 0xee, 0x11, 0x22, 0xc3, 0x05, 0x0e,
+ 0x2c, 0x71, 0x27, 0x00,
+ 0xc0, 0xec, 0x10, 0x73, 0x10, 0xff, 0xe0, 0x13, 0x23, 0x0f, 0xed, 0x10,
+ 0x34, 0xf3, 0x03, 0x54,
+ 0x0f, 0xb9, 0xf0, 0x12, 0x11, 0xe0, 0xd2, 0xd3, 0xf4, 0xc1, 0xe0, 0xdf,
+ 0xdc, 0xf2, 0x05, 0xf0,
+ 0x00, 0xdd, 0x40, 0x64, 0x21, 0x32, 0x00, 0xc0, 0x26, 0x10, 0x01, 0x01,
+ 0x29, 0x00, 0x24, 0x00,
+ 0x9d, 0x09, 0xe4, 0x16, 0x97, 0x09, 0x20, 0x16, 0x2b, 0xde, 0x8d, 0xf8,
+ 0x1d, 0x60, 0x11, 0x02,
+ 0xd1, 0xf1, 0xd1, 0xdd, 0xee, 0x43, 0x77, 0x05, 0xde, 0xdd, 0xf0, 0x03,
+ 0x2c, 0x4f, 0x22, 0xe0,
+ 0xef, 0x2d, 0x7e, 0x1c, 0x20, 0x04, 0xdf, 0xe0, 0x05, 0x33, 0xf0, 0xd0,
+ 0xee, 0x05, 0x76, 0x10,
+ 0xef, 0xee, 0x00, 0x20, 0x41, 0xff, 0xed, 0x14, 0x21, 0x5f, 0x5f, 0x31,
+ 0x07, 0x02, 0x12, 0xcc,
+ 0xda, 0x00, 0x33, 0xe0, 0xb0, 0x0e, 0xe0, 0xb0, 0xe2, 0x04, 0xf0, 0xef,
+ 0x20, 0x12, 0x1e, 0x0e,
+ 0x80, 0x02, 0x33, 0x08, 0x1e, 0xf1, 0xf1, 0x20, 0x21, 0xcf, 0xc0, 0xe4,
+ 0x03, 0x62, 0x00, 0xab,
+ 0x03, 0xf7, 0x10, 0x20, 0x0e, 0x20, 0x0f, 0x10, 0x53, 0x00, 0x1b, 0xff,
+ 0x0d, 0xf0, 0xf1, 0xcd,
+ 0x01, 0x33, 0x5f, 0x0b, 0xcf, 0xd1, 0xb0, 0x01, 0x01, 0x09, 0x1e, 0x10,
+ 0x01, 0x62, 0x2e, 0x1b,
+ 0x1d, 0x00, 0x33, 0x03, 0x1d, 0x18, 0x10, 0x01, 0xff, 0xee, 0x21, 0x05,
+ 0xa1, 0xbe, 0xed, 0x00,
+ 0xe0, 0xdd, 0xe3, 0xf2, 0x1d, 0x38, 0x70, 0x72, 0x00, 0x0e, 0xe2, 0x14,
+ 0x30, 0x21, 0x0f, 0x0f,
+ 0xc0, 0xfc, 0xe0, 0x03, 0xe0, 0xdc, 0x05, 0xe4, 0x9e, 0xdc, 0xf1, 0x06,
+ 0x00, 0x00, 0x20, 0x5f,
+ 0x21, 0x00, 0xee, 0x1f, 0x13, 0x36, 0x12, 0x01, 0x02, 0xd2, 0x80, 0xf2,
+ 0xf2, 0x11, 0x30, 0x01,
+ 0x27, 0x5e, 0x0c, 0x30, 0x20, 0xf0, 0xed, 0x02, 0xe0, 0xbf, 0xf0, 0x05,
+ 0xf1, 0xfb, 0x0d, 0x40,
+ 0x0f, 0xf0, 0xf0, 0x00, 0x11, 0x7c, 0x7a, 0x00, 0xd0, 0xdd, 0x1c, 0x2f,
+ 0x10, 0x2d, 0x21, 0x20,
+ 0x0c, 0x10, 0x57, 0x32, 0x10, 0xfb, 0x00, 0x20, 0x8f, 0xe1, 0x06, 0x40,
+ 0x10, 0x0f, 0xc0, 0xd0,
+ 0x04, 0x20, 0x4c, 0x21, 0x00, 0xdf, 0xe0, 0x04, 0x3f, 0xfe, 0x9e, 0x00,
+ 0xf0, 0xcd, 0x12, 0x03,
+ 0xed, 0xc6, 0xf7, 0x01, 0xef, 0xcd, 0xf0, 0xe1, 0xb2, 0x01, 0x22, 0x2e,
+ 0x0a, 0xe0, 0x00, 0x43,
+ 0x54, 0x00, 0x11, 0x03, 0xf1, 0xc1, 0x00, 0x1c, 0xee, 0xe0, 0xf5, 0xd1,
+ 0xe0, 0xc0, 0xdc, 0x7f,
+ 0x3e, 0x0e, 0x01, 0x2f, 0x39, 0x73, 0x15, 0x0f, 0x0d, 0x40, 0xfd, 0xbe,
+ 0x00, 0x06, 0x00, 0xfb,
+ 0xd0, 0x00, 0x52, 0x20, 0x0d, 0xef, 0x21, 0x41, 0x73, 0x01, 0x0d, 0x2b,
+ 0x10, 0x10, 0x20, 0x11,
+ 0xf2, 0xd1, 0x0d, 0x39, 0xff, 0x8e, 0xf5, 0xf3, 0x0f, 0x2c, 0x20, 0xdf,
+ 0xae, 0x00, 0x05, 0x43,
+ 0x11, 0xfd, 0xdc, 0x30, 0x11, 0x00, 0xe0, 0x64, 0x11, 0xcb, 0xf0, 0x00,
+ 0x33, 0x01, 0x90, 0xfd,
+ 0x03, 0xf0, 0xef, 0xb0, 0xf7, 0x03, 0x3e, 0x1d, 0x10, 0xe0, 0xf1, 0x07,
+ 0x12, 0x3e, 0x0f, 0x02,
+ 0x45, 0x50, 0x30, 0x2e, 0xee, 0x04, 0x72, 0x0f, 0xca, 0xfe, 0x00, 0x11,
+ 0x06, 0xd0, 0xce, 0xde,
+ 0x02, 0x02, 0xee, 0xde, 0x00, 0x11, 0x52, 0x20, 0x1c, 0x41, 0x30, 0x60,
+ 0x20, 0xee, 0xd0, 0xe1,
+ 0x0c, 0x0f, 0x3d, 0x24, 0xf4, 0xbe, 0xfe, 0x02, 0x30, 0x2d, 0x43, 0x04,
+ 0xe1, 0x05, 0x32, 0x70,
+ 0x08, 0xdf, 0x50, 0x01, 0x30, 0x10, 0x0d, 0x00, 0x32, 0x21, 0x54, 0x02,
+ 0xcb, 0x9c, 0x0f, 0xf4,
+ 0x13, 0x0a, 0xbd, 0x00, 0xf0, 0x02, 0x10, 0x1d, 0xfa, 0xd0, 0x01, 0x15,
+ 0x6e, 0x3e, 0x22, 0xf0,
+ 0xd0, 0x01, 0x01, 0x02, 0xb0, 0x01, 0xd2, 0xcf, 0xee, 0x27, 0x13, 0x01,
+ 0xa1, 0x0f, 0xfc, 0x20,
+ 0x31, 0xd1, 0xec, 0x2e, 0x60, 0x0e, 0x10, 0x22, 0x17, 0x23, 0xcd, 0xa8,
+ 0x00, 0x30, 0x11, 0xb1,
+ 0xe3, 0x00, 0x00, 0x10, 0x3f, 0x0d, 0xcd, 0xf1, 0x07, 0x30, 0x2e, 0x0d,
+ 0x0f, 0x63, 0x44, 0x0c,
+ 0x0e, 0x11, 0x14, 0x02, 0x00, 0xd0, 0xcc, 0xf0, 0xf0, 0xa0, 0xdf, 0xcd,
+ 0x21, 0x52, 0x1f, 0x11,
+ 0x04, 0xfa, 0xf0, 0x54, 0x44, 0x2f, 0x0b, 0xd0, 0xf1, 0xf0, 0x00, 0x6e,
+ 0x20, 0x1f, 0x00, 0xc1,
+ 0xdf, 0x01, 0xf6, 0x00, 0xd2, 0xef, 0xb0, 0x07, 0x21, 0x0e, 0x0b, 0x00,
+ 0x41, 0x53, 0x0f, 0xcd,
+ 0x0f, 0xd0, 0x01, 0x24, 0x44, 0xce, 0xdf, 0x04, 0x21, 0x0e, 0x20, 0x00,
+ 0xd0, 0xdc, 0x0e, 0x50,
+ 0x1c, 0x2c, 0x43, 0x37, 0xef, 0x89, 0x00, 0x41, 0x02, 0xf1, 0xf0, 0x00,
+ 0xfe, 0xf0, 0xed, 0xd0,
+ 0xf0, 0x11, 0x31, 0x20, 0xdc, 0x01, 0x73, 0x22, 0x3d, 0x0b, 0x1e, 0x70,
+ 0x25, 0xf0, 0xdc, 0xf0,
+ 0xe0, 0x00, 0xf3, 0xe0, 0xa2, 0xe0, 0x00, 0x20, 0x27, 0x43, 0x20, 0x5c,
+ 0x30, 0x4e, 0x1f, 0x02,
+ 0x16, 0x20, 0x30, 0xbe, 0xce, 0xe2, 0x15, 0x30, 0x0e, 0xfe, 0xb0, 0xe7,
+ 0x02, 0x0f, 0xac, 0x02,
+ 0x34, 0x10, 0x0e, 0xd0, 0xef, 0x20, 0x20, 0x45, 0x10, 0xdb, 0xc0, 0x12,
+ 0x12, 0x0f, 0xcf, 0xb0,
+ 0x03, 0x23, 0x10, 0xdc, 0xad, 0x00, 0xf3, 0xf1, 0x00, 0x3d, 0x08, 0xff,
+ 0xee, 0x00, 0x3e, 0x4d,
+ 0x3d, 0x61, 0x34, 0x00, 0xbb, 0xf0, 0x23, 0x10, 0xed, 0xe1, 0xe5, 0xd2,
+ 0x11, 0xec, 0x0e, 0x73,
+ 0x3f, 0xcb, 0xe0, 0x00, 0x2f, 0x60, 0x10, 0x10, 0x00, 0xed, 0x04, 0x10,
+ 0xf0, 0x06, 0x0f, 0xad,
+ 0xff, 0xfe, 0x0e, 0xce, 0xee, 0x07, 0x32, 0xf0, 0xbd, 0x1f, 0x33, 0x37,
+ 0x21, 0x0d, 0x5f, 0x42,
+ 0x20, 0x3c, 0x3b, 0x61, 0x04, 0x01, 0xa1, 0xef, 0xee, 0xe0, 0x01, 0x15,
+ 0xb0, 0xcf, 0xf3, 0x10,
+ 0x10, 0x31, 0xff, 0xdc, 0x02, 0x44, 0x22, 0x0e, 0x0d, 0x00, 0x01, 0x27,
+ 0x66, 0xfe, 0xef, 0x00,
+ 0xf0, 0x14, 0x10, 0x10, 0x0f, 0xdc, 0xbf, 0x00, 0x33, 0x70, 0xff, 0xe2,
+ 0xe0, 0x1d, 0x40, 0x26,
+ 0x00, 0x2e, 0x7e, 0x00, 0x21, 0x14, 0xed, 0xc9, 0x00, 0x20, 0x20, 0x0f,
+ 0xcc, 0x00, 0x03, 0xf4,
+ 0x00, 0x1b, 0x00, 0x10, 0xd2, 0xd0, 0xed, 0x1c, 0xe0, 0x83, 0x06, 0x30,
+ 0x6f, 0x1b, 0x10, 0x40,
+ 0x12, 0x32, 0xe0, 0xee, 0xf0, 0x03, 0x20, 0x22, 0x0f, 0xbc, 0xf0, 0x07,
+ 0x00, 0xcd, 0x52, 0x44,
+ 0xfd, 0xdc, 0x00, 0x31, 0xf4, 0xa0, 0xf0, 0xdc, 0x00, 0x03, 0xe1, 0xe0,
+ 0xfc, 0x00, 0xc0, 0x03,
+ 0xf0, 0xf0, 0xeb, 0xd0, 0x07, 0x85, 0xbe, 0x00, 0x21, 0x00, 0xf1, 0x00,
+ 0x53, 0x00, 0xf0, 0xfc,
+ 0xfd, 0x00, 0x32, 0x1f, 0x0a, 0x70, 0x14, 0xc0, 0xed, 0x11, 0x11, 0x10,
+ 0x42, 0x14, 0x00, 0xac,
+ 0x0f, 0x10, 0x2f, 0xfc, 0xe0, 0x51, 0x42, 0x00, 0x03, 0x27, 0x20, 0x08,
+ 0x00, 0x20, 0x42, 0xf0,
+ 0xbe, 0xef, 0xe0, 0xef, 0xed, 0x3b, 0x5f, 0x00, 0xde, 0x00, 0x51, 0x02,
+ 0xce, 0x00, 0x1f, 0x20,
+ 0x65, 0x23, 0x02, 0xfd, 0x0c, 0x21, 0x2f, 0x1f, 0x25, 0x02, 0xab, 0xce,
+ 0x01, 0x14, 0x00, 0xcf,
+ 0xe0, 0xe2, 0x05, 0x01, 0xb0, 0xda, 0xe0, 0x00, 0x30, 0xf0, 0xee, 0x23,
+ 0x15, 0x00, 0xf1, 0x11,
+ 0x44, 0xf1, 0xaf, 0x0e, 0x33, 0x01, 0x12, 0x46, 0x20, 0x2b, 0x0f, 0x9f,
+ 0xf1, 0x05, 0xff, 0xdf,
+ 0xff, 0x00, 0x03, 0xd0, 0x00, 0xe1, 0x11, 0x73, 0x60, 0xda, 0xde, 0x0f,
+ 0x10, 0x52, 0x00, 0x0a,
+ 0x20, 0x10, 0x14, 0x10, 0x4e, 0x0d, 0x4f, 0x20, 0xe0, 0xbe, 0x03, 0xd2,
+ 0xc8, 0xe0, 0x10, 0x70,
+ 0x01, 0x0f, 0xed, 0x10, 0x56, 0x22, 0x00, 0xed, 0x01, 0x10, 0x0c, 0x10,
+ 0x71, 0x0f, 0x00, 0x07,
+ 0xf0, 0x0d, 0x20, 0x00, 0xef, 0xb1, 0xf1, 0x02, 0x0f, 0xac, 0xef, 0xe2,
+ 0x00, 0x08, 0xfe, 0x21,
+ 0x22, 0x00, 0x10, 0x40, 0x11, 0x03, 0x0d, 0xec, 0x41, 0x05, 0x90, 0xe0,
+ 0x07, 0xf1, 0xc0, 0xe3,
+ 0xd0, 0x0f, 0x51, 0x34, 0x00, 0x0d, 0x0d, 0x20, 0x64, 0x0d, 0x4c, 0x00,
+ 0x01, 0xc1, 0x00, 0xf9,
+ 0xef, 0xf0, 0x01, 0x03, 0xe1, 0xdf, 0xdb, 0x10, 0x10, 0x22, 0x40, 0x3d,
+ 0x71, 0x73, 0x0c, 0xfd,
+ 0x0e, 0x1d, 0x13, 0x27, 0x36, 0x00, 0xfd, 0xcd, 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0xae, 0xd0, 0xf3,
+ 0x02, 0x0f, 0x1d, 0xd1, 0xd7, 0x03, 0x70, 0x3f, 0x3c, 0x33, 0x74, 0x2f,
+ 0x0a, 0xef, 0x0f, 0x12,
+ 0x26, 0x00, 0xe0, 0xad, 0xf0, 0xc2, 0xf4, 0xf0, 0xe1, 0x0e, 0xeb, 0xfe,
+ 0xf0, 0xf0, 0xfd, 0xfc,
+ 0x3f, 0x60, 0xf0, 0xf7, 0x11, 0x2e, 0x0e, 0x46, 0x63, 0x00, 0x0e, 0x11,
+ 0x02, 0x0f, 0x0e, 0x01,
+ 0xd2, 0xcf, 0xc8, 0x00, 0xf0, 0xc1, 0xf0, 0x20, 0x01, 0x8e, 0xf1, 0x12,
+ 0x1f, 0x1d, 0x74, 0x00,
+ 0xed, 0xe0, 0x01, 0x0e, 0x0d, 0x01, 0x00, 0xd9, 0x0e, 0x2e, 0x70, 0x27,
+ 0x02, 0xbf, 0x0e, 0x20,
+ 0x00, 0x0c, 0xe0, 0x1f, 0x30, 0xf0, 0xd0, 0x15, 0x2f, 0x2e, 0x67, 0x01,
+ 0xcf, 0x00, 0x02, 0x11,
+ 0x00, 0x00, 0xf2, 0x33, 0x70, 0x1c, 0x2c, 0x20, 0xf0, 0xbf, 0xf5, 0x27,
+ 0x30, 0x0d, 0xdf, 0x00,
+ 0xc3, 0xd0, 0xbb, 0xff, 0xd1, 0x03, 0x10, 0x0e, 0x3e, 0x00, 0x43, 0x32,
+ 0x10, 0x34, 0x05, 0x80,
+ 0xfe, 0x21, 0x31, 0x0d, 0x05, 0x26, 0xff, 0x0d, 0x00, 0x13, 0x45, 0xee,
+ 0xdd, 0x0e, 0x40, 0x42,
+ 0xe0, 0x90, 0xde, 0xf0, 0x15, 0x10, 0xbc, 0xd0, 0x20, 0x32, 0xed, 0xfd,
+ 0xd0, 0xef, 0x2a, 0x70,
+ 0x30, 0x04, 0xbe, 0xff, 0x23, 0x43, 0x0c, 0xfb, 0x00, 0x30, 0x34, 0x20,
+ 0x1d, 0x41, 0x21, 0xfd,
+ 0xfd, 0x1f, 0x01, 0x85, 0xdd, 0xea, 0xdf, 0xff, 0xf3, 0x27, 0xf0, 0x8d,
+ 0x9e, 0x10, 0x51, 0x12,
+ 0x10, 0x0d, 0xfe, 0x13, 0x15, 0x10, 0x00, 0xff, 0xf0, 0xf5, 0xf3, 0xdc,
+ 0xbc, 0xe0, 0x04, 0xf2,
+ 0x32, 0x1f, 0xdb, 0x00, 0x02, 0x01, 0xce, 0x1f, 0xf2, 0xb4, 0xc0, 0xe1,
+ 0x22, 0x72, 0x2f, 0x0f,
+ 0x05, 0xf1, 0x21, 0x40, 0x20, 0x13, 0xf2, 0xd4, 0xef, 0x00, 0xe2, 0x0b,
+ 0xf2, 0x47, 0xe1, 0xac,
+ 0x0e, 0xef, 0xff, 0xf1, 0x00, 0xf8, 0xcf, 0x0f, 0x50, 0x6e, 0x0e, 0xfe,
+ 0xf0, 0x43, 0x55, 0x0d,
+ 0x0e, 0xf0, 0xe2, 0xe1, 0x01, 0x30, 0x20, 0x0f, 0xdf, 0xe1, 0xd0, 0x0d,
+ 0x1f, 0x60, 0x1d, 0xe9,
+ 0x0e, 0x10, 0x77, 0x06, 0xff, 0xfd, 0x10, 0x41, 0x01, 0xe0, 0x20, 0x31,
+ 0xe0, 0xf4, 0x04, 0xfe,
+ 0x0d, 0x70, 0x64, 0x04, 0xf1, 0xc0, 0xdc, 0xfe, 0x00, 0x12, 0x4e, 0x00,
+ 0x03, 0xdf, 0xa8, 0xf0,
+ 0x04, 0x11, 0x10, 0x0e, 0xf0, 0xd5, 0xd2, 0xaf, 0x0e, 0xf1, 0xe4, 0xe2,
+ 0x47, 0x00, 0xed, 0x20,
+ 0x71, 0x13, 0x0f, 0x0d, 0x0e, 0x0d, 0xff, 0x00, 0x33, 0x0f, 0xc8, 0x00,
+ 0x00, 0xa0, 0xec, 0xf0,
+ 0xf4, 0xf2, 0x0f, 0xfd, 0x00, 0x00, 0xf0, 0x3f, 0x70, 0x42, 0x11, 0x1e,
+ 0x19, 0x70, 0x33, 0x05,
+ 0x31, 0x0d, 0x0e, 0x10, 0x01, 0xee, 0xd8, 0xef, 0xaf, 0xe0, 0xd5, 0xc0,
+ 0xdd, 0xd0, 0x0f, 0x00,
+ 0x4f, 0x60, 0x30, 0x0d, 0x11, 0x75, 0x0f, 0x1e, 0x1f, 0x10, 0xfe, 0xf0,
+ 0x02, 0xf3, 0xd2, 0xe7,
+ 0xf2, 0xde, 0xed, 0x23, 0x23, 0xff, 0x00, 0x47, 0x02, 0x0d, 0x8c, 0x00,
+ 0xd0, 0xf0, 0xfe, 0x12,
+ 0x16, 0xc0, 0xd0, 0xdd, 0x10, 0x47, 0x54, 0x20, 0x00, 0xde, 0x00, 0x10,
+ 0x10, 0xf0, 0xd0, 0xdf,
+ 0xe0, 0xf3, 0xce, 0x00, 0x77, 0x73, 0x00, 0x0f, 0xbb, 0x00, 0x25, 0x00,
+ 0x0d, 0xdf, 0x10, 0x03,
+ 0x00, 0x0d, 0xcf, 0x13, 0x51, 0x1c, 0x0c, 0x13, 0x17, 0x0f, 0x3e, 0x60,
+ 0x02, 0x0f, 0x01, 0x14,
+ 0x00, 0xdb, 0x00, 0x22, 0x44, 0xe0, 0xfe, 0x0e, 0xaf, 0xfe, 0x10, 0x20,
+ 0xed, 0xc8, 0x0f, 0x0f,
+ 0xf0, 0x70, 0x5e, 0x0e, 0x10, 0x0f, 0x11, 0x45, 0x0f, 0xe0, 0x15, 0x20,
+ 0x2e, 0x0f, 0xd0, 0xaf,
+ 0xdd, 0xcf, 0xf0, 0x05, 0x0f, 0x1d, 0x22, 0xd0, 0x99, 0x00, 0xf2, 0x05,
+ 0xf0, 0xbd, 0x00, 0xe2,
+ 0x04, 0x00, 0xc1, 0xe1, 0x02, 0x11, 0x20, 0x04, 0xf5, 0x20, 0x0c, 0x00,
+ 0x70, 0x40, 0x11, 0xcc,
+ 0xff, 0x00, 0x12, 0xef, 0xbc, 0x00, 0x14, 0x00, 0xef, 0xe0, 0x1f, 0x0b,
+ 0xf0, 0x56, 0x21, 0x00,
+ 0x02, 0x02, 0x22, 0x52, 0x20, 0x2b, 0x70, 0x52, 0x10, 0x22, 0x0d, 0xf8,
+ 0xee, 0x00, 0x02, 0xe2,
+ 0xc1, 0xda, 0xde, 0xdf, 0xb0, 0xe3, 0xf0, 0x0f, 0x0c, 0x50, 0x63, 0x1e,
+ 0x4c, 0x21, 0x11, 0x0f,
+ 0xf4, 0x26, 0x30, 0x0e, 0x0e, 0x0e, 0x11, 0x00, 0xed, 0xe1, 0x07, 0xe1,
+ 0x9e, 0xef, 0xe0, 0xd0,
+ 0xe2, 0xd0, 0x8b, 0xff, 0x02, 0x02, 0x00, 0x0c, 0x20, 0x42, 0x15, 0x01,
+ 0x10, 0x01, 0xd0, 0xb3,
+ 0x04, 0x00, 0xde, 0x0f, 0xfc, 0x01, 0xd2, 0xbe, 0x0e, 0x13, 0x57, 0xf1,
+ 0x00, 0xf0, 0x10, 0x30,
+ 0x76, 0x12, 0x0d, 0xed, 0xf1, 0xe0, 0xeb, 0x0f, 0x1e, 0x0d, 0x1d, 0x1f,
+ 0x00, 0x37, 0x64, 0x1d,
+ 0x1e, 0x20, 0x02, 0x01, 0xc0, 0xbd, 0x00, 0x0b, 0x00, 0x71, 0x26, 0x50,
+ 0x0d, 0xe0, 0xe5, 0x01,
+ 0x20, 0xfd, 0x0f, 0x11, 0x03, 0x32, 0x11, 0xfd, 0x2b, 0x72, 0x32, 0xff,
+ 0x9a, 0x0f, 0x21, 0x11,
+ 0x00, 0x0d, 0x37, 0x14, 0xde, 0xf0, 0x10, 0x61, 0x2f, 0x11, 0xd1, 0xb2,
+ 0xee, 0xcc, 0x03, 0xf6,
+ 0xdf, 0xcd, 0x02, 0xe1, 0xdc, 0xee, 0xe0, 0x24, 0x30, 0xdd, 0x8f, 0xf1,
+ 0x33, 0x7d, 0x48, 0xf0,
+ 0x05, 0x00, 0xff, 0x00, 0x0e, 0x10, 0x02, 0xbf, 0x00, 0x26, 0xef, 0xcd,
+ 0x02, 0x12, 0x0e, 0x1b,
+ 0x0f, 0xce, 0x01, 0xf2, 0xad, 0x0e, 0x31, 0x00, 0x03, 0x57, 0x0f, 0x1d,
+ 0x41, 0x56, 0x00, 0xde,
+ 0xfd, 0x22, 0x30, 0x3d, 0xd0, 0xa0, 0xdd, 0x01, 0x07, 0xf3, 0xcb, 0x0e,
+ 0x10, 0x12, 0x0e, 0x1d,
+ 0xf0, 0xcf, 0x2e, 0x74, 0x20, 0x11, 0x01, 0x00, 0x02, 0x04, 0xef, 0x05,
+ 0x67, 0x00, 0xfd, 0x00,
+ 0xe0, 0xd0, 0xe1, 0xff, 0xee, 0xc2, 0xf4, 0xf0, 0xdc, 0x9e, 0x0f, 0x02,
+ 0x64, 0x10, 0x0d, 0xc1,
+ 0xe3, 0x02, 0x13, 0x14, 0x01, 0xe2, 0x13, 0x00, 0x43, 0x47, 0x0b, 0x10,
+ 0x34, 0x42, 0xfd, 0x1f,
+ 0x73, 0x14, 0xf1, 0xc1, 0x0e, 0xea, 0xf0, 0x00, 0x03, 0x20, 0x0a, 0xdd,
+ 0xd0, 0x10, 0x31, 0xe1,
+ 0x30, 0x7b, 0x70, 0x00, 0xf0, 0xd0, 0x0d, 0x1f, 0x20, 0xee, 0xe0, 0x02,
+ 0x00, 0xfa, 0x1f, 0x51,
+ 0x04, 0x02, 0x26, 0x5e, 0x0d, 0x20, 0x04, 0xf2, 0xad, 0x0c, 0x22, 0x54,
+ 0xfd, 0xfe, 0x43, 0x43,
+ 0x0d, 0x0b, 0xe0, 0xe0, 0xf5, 0x03, 0x11, 0x2e, 0x8b, 0xdf, 0x32, 0x76,
+ 0x0f, 0x0d, 0xe0, 0x03,
+ 0x00, 0xef, 0x0e, 0x00, 0x10, 0x00, 0x01, 0xf4, 0xc1, 0xe2, 0xe0, 0xf4,
+ 0x06, 0xb0, 0xec, 0x00,
+ 0x01, 0x05, 0x00, 0x5f, 0x2f, 0x7f, 0x32, 0x01, 0x01, 0x00, 0xfb, 0x0f,
+ 0xdf, 0x02, 0x17, 0x00,
+ 0xb0, 0x00, 0x02, 0x0f, 0x00, 0xe0, 0x8f, 0x0b, 0xf2, 0x01, 0x0d, 0xeb,
+ 0xe0, 0xf1, 0x20, 0x5d,
+ 0x5e, 0x1d, 0x0b, 0x1f, 0x42, 0x27, 0x20, 0x0b, 0xf0, 0x00, 0xd1, 0xf0,
+ 0xcf, 0xfe, 0xb1, 0xe0,
+ 0xf1, 0xf0, 0x4e, 0x1f, 0x20, 0x14, 0x0f, 0x1a, 0x5f, 0x40, 0x20, 0x32,
+ 0xde, 0xbd, 0x03, 0x17,
+ 0x12, 0x0e, 0xff, 0x01, 0x03, 0x80, 0xee, 0x04, 0x01, 0xfd, 0xd0, 0x01,
+ 0x17, 0x00, 0x8d, 0x0e,
+ 0x02, 0x33, 0x00, 0x00, 0xe0, 0xfb, 0x00, 0x00, 0x73, 0x03, 0xc4, 0xe0,
+ 0xef, 0x02, 0x37, 0xf0,
+ 0xdb, 0x50, 0x46, 0xf1, 0xdf, 0xe0, 0x00, 0x10, 0x54, 0x20, 0xf0, 0xdf,
+ 0x31, 0x42, 0x0f, 0xea,
+ 0xbf, 0x0f, 0x1f, 0x2f, 0xd0, 0xa0, 0xe0, 0x0d, 0x0d, 0xe5, 0x00, 0x00,
+ 0x21, 0x01, 0x32, 0x00,
+ 0x32, 0xf0, 0x76, 0x20, 0xa3, 0xf5, 0x50, 0x20, 0xbc, 0xef, 0xe5, 0xf7,
+ 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x0f, 0x3f, 0x5e, 0x30, 0x34, 0x36, 0x21, 0x01, 0x01, 0x12, 0x02,
+ 0x00, 0x1e, 0x6d, 0x4d,
+ 0x29, 0x3e, 0x4d, 0x3d, 0x5c, 0x3e, 0x3e, 0x6d, 0x2d, 0x4f, 0x3e, 0x30,
+ 0x31, 0x34, 0x32, 0x2e,
+ 0x20, 0x1a, 0x3d, 0x5e, 0x3f, 0x4f, 0x18, 0x1b, 0x1e, 0x2d, 0x2e, 0x0e,
+ 0x00, 0xfd, 0xcd, 0xbd,
+ 0xdd, 0xd3, 0xc6, 0xc0, 0xd1, 0xf3, 0xf4, 0xf0, 0xd0, 0xe1, 0xe5, 0xd2,
+ 0xb0, 0xf5, 0x24, 0x23,
+ 0x01, 0x12, 0x23, 0x13, 0xb0, 0xb0, 0xd0, 0xc0, 0xd0, 0xbd, 0xe3, 0xe7,
+ 0xc4, 0xe2, 0xd4, 0xd3,
+ 0xc2, 0xd2, 0xe3, 0xc0, 0xe3, 0x06, 0x11, 0xff, 0x00, 0x21, 0x21, 0x00,
+ 0xee, 0xe2, 0xf5, 0xd0,
+ 0xc0, 0xd0, 0xd3, 0xa4, 0xa0, 0xd1, 0xf7, 0x24, 0x21, 0x30, 0x42, 0x31,
+ 0x21, 0x00, 0x20, 0x61,
+ 0x30, 0x51, 0x31, 0x3f, 0x5e, 0x30, 0x4e, 0x28, 0x3d, 0x3c, 0x3b, 0x1b,
+ 0x2d, 0x2d, 0x1d, 0x0c,
+ 0x2e, 0x4f, 0x2e, 0x0d, 0x1c, 0x2d, 0x3d, 0x7e, 0x1d, 0xf8, 0xee, 0x0f,
+ 0x0e, 0xdc, 0x0f, 0x4f,
+ 0x1f, 0xcd, 0xad, 0x0f, 0x00, 0xdd, 0xba, 0xdd, 0xf0, 0xcf, 0xde, 0xdf,
+ 0xd0, 0xc0, 0xd0, 0xe0,
+ 0xcf, 0xf0, 0x01, 0xde, 0xe9, 0xff, 0x0f, 0x0e, 0xdd, 0xec, 0xbc, 0xbd,
+ 0xba, 0xcc, 0xcd, 0xff,
+ 0xff, 0xdd, 0xdb, 0xef, 0xf0, 0xee, 0xee, 0xef, 0x00, 0xf1, 0xd0, 0xb0,
+ 0xe1, 0x06, 0xd0, 0xd0,
+ 0x03, 0x13, 0xf0, 0x01, 0x51, 0x43, 0x35, 0x11, 0x00, 0x10, 0x77, 0x32,
+ 0x20, 0x21, 0x23, 0x34,
+ 0x44, 0x11, 0x20, 0x40, 0x41, 0x20, 0x32, 0x55, 0x31, 0x1f, 0x0d, 0x30,
+ 0x71, 0x10, 0x08, 0x0d,
+ 0x22, 0x01, 0xde, 0xe0, 0x04, 0xe1, 0xb0, 0xe1, 0x05, 0x04, 0xe1, 0xf2,
+ 0xd1, 0xd0, 0xf2, 0x45,
+ 0x22, 0xd0, 0xe1, 0x66, 0x01, 0xb0, 0x00, 0x05, 0x00, 0xd1, 0xf1, 0xf2,
+ 0x90, 0xcf, 0xe1, 0xf3,
+ 0xd0, 0xad, 0xe0, 0xf5, 0xf2, 0xd0, 0x02, 0x04, 0x01, 0x02, 0x12, 0x00,
+ 0x20, 0x42, 0x21, 0x57,
+ 0x43, 0x00, 0x0e, 0x20, 0x11, 0x00, 0xe0, 0xd1, 0xcf, 0xba, 0xff, 0x00,
+ 0x10, 0x0c, 0xf9, 0xfe,
+ 0x1e, 0x4f, 0x2c, 0x1c, 0x4e, 0x2e, 0x2d, 0x4e, 0x6f, 0x1c, 0x2d, 0x50,
+ 0x20, 0x1b, 0x2e, 0x3f,
+ 0x4f, 0x0b, 0xeb, 0xed, 0x30, 0x3e, 0xfc, 0x0e, 0x2e, 0x3f, 0x3e, 0x4f,
+ 0x62, 0x11, 0x0f, 0x43,
+ 0x36, 0x00, 0xef, 0x02, 0x77, 0x02, 0xdf, 0xc0, 0x03, 0x14, 0xd0, 0xc0,
+ 0xf2, 0x03, 0xd0, 0xb0,
+ 0x04, 0xf3, 0xd0, 0xd1, 0x04, 0x24, 0x00, 0xe0, 0x01, 0x22, 0x01, 0xf2,
+ 0x03, 0x31, 0x40, 0x20,
+ 0x0e, 0xfd, 0x0f, 0x0e, 0x0b, 0x5f, 0x4f, 0x0b, 0x2c, 0x4e, 0x3e, 0x2d,
+ 0x6f, 0x2e, 0x09, 0xdb,
+ 0x9d, 0x0f, 0x43, 0x00, 0xbc, 0x00, 0x02, 0x00, 0xfe, 0x10, 0x20, 0x21,
+ 0x20, 0x10, 0x4f, 0x3d,
+ 0x2c, 0x5e, 0x2c, 0x3c, 0x5c, 0x2c, 0x3d, 0x3f, 0x4f, 0x08, 0x1e, 0x60,
+ 0x00, 0x0c, 0x10, 0x30,
+ 0xfe, 0xec, 0x22, 0x76, 0x00, 0x00, 0x00, 0x03, 0x13, 0x01, 0xe1, 0x02,
+ 0x17, 0xf1, 0x80, 0xf2,
+ 0x03, 0xe2, 0xc2, 0xf6, 0xf2, 0xc1, 0xe2, 0xc1, 0xe3, 0xe6, 0xd1, 0xc1,
+ 0xe1, 0xf2, 0x01, 0x02,
+ 0x03, 0xf3, 0xb0, 0xf3, 0x06, 0xe2, 0xa0, 0xd0, 0xf2, 0x06, 0x02, 0xb0,
+ 0xd0, 0xe2, 0xf1, 0x35,
+ 0x00, 0x0f, 0x61, 0x32, 0x2f, 0x2f, 0x74, 0x11, 0x0d, 0x1e, 0x22, 0x47,
+ 0x10, 0xfd, 0x0f, 0x10,
+ 0x0f, 0x0e, 0x2f, 0xe9, 0xee, 0x30, 0x30, 0x0c, 0xfe, 0x3e, 0x7e, 0x1d,
+ 0x0b, 0x5f, 0x40, 0x2d,
+ 0x0b, 0x4f, 0x40, 0x1e, 0x0c, 0x2f, 0x30, 0x30, 0x0c, 0x1f, 0x20, 0x0d,
+ 0x99, 0x10, 0x64, 0x00,
+ 0xed, 0x0f, 0x21, 0x00, 0xeb, 0xff, 0x41, 0x22, 0xee, 0xde, 0x00, 0x44,
+ 0xef, 0xbc, 0x12, 0x36,
+ 0xe0, 0xaf, 0x02, 0x25, 0xf0, 0xc0, 0x01, 0xf2, 0xe0, 0xf2, 0xf2, 0x04,
+ 0xf1, 0xa0, 0x02, 0x26,
+ 0x01, 0xf0, 0x12, 0x33, 0xc0, 0x01, 0x36, 0xe0, 0xb0, 0x01, 0x02, 0xf1,
+ 0x02, 0xd1, 0x14, 0x54,
+ 0xf0, 0xe0, 0x23, 0x33, 0x00, 0xd0, 0x32, 0x43, 0xdc, 0xbb, 0xff, 0x41,
+ 0x21, 0xec, 0x00, 0x32,
+ 0x0f, 0xda, 0x30, 0x70, 0xfc, 0xdb, 0x40, 0x40, 0xed, 0xfd, 0x20, 0x60,
+ 0x1f, 0x0b, 0x1f, 0x40,
+ 0x1e, 0x2d, 0x2e, 0x3e, 0x2e, 0x0b, 0x1d, 0x4f, 0x0c, 0xdd, 0x0d, 0x51,
+ 0x0e, 0xda, 0x8c, 0x10,
+ 0x35, 0xff, 0xcd, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xed, 0x13, 0x25,
+ 0xbc, 0xee, 0x01, 0x23,
+ 0x00, 0xde, 0xee, 0x03, 0x03, 0xe0, 0xbe, 0xe0, 0x05, 0xcf, 0xde, 0x06,
+ 0xd1, 0x8e, 0xe0, 0x06,
+ 0x02, 0xdf, 0xef, 0x01, 0x25, 0x01, 0xd0, 0xcf, 0x11, 0x43, 0xf0, 0xce,
+ 0x00, 0x15, 0xf0, 0xbf,
+ 0x01, 0x02, 0xcd, 0xf0, 0x16, 0xef, 0xcd, 0x00, 0x23, 0xff, 0xdd, 0xca,
+ 0x00, 0x00, 0x10, 0x51,
+ 0xdc, 0xcb, 0x31, 0x63, 0x0f, 0x0d, 0x1f, 0x20, 0x43, 0x33, 0x0d, 0x0b,
+ 0x30, 0x42, 0x0e, 0x0b,
+ 0x31, 0x31, 0xfd, 0x0d, 0x1f, 0x2d, 0x3e, 0x40, 0xfc, 0x43, 0x54, 0xb8,
+ 0xfe, 0x32, 0x11, 0xdd,
+ 0x0f, 0x10, 0xef, 0xe0, 0x13, 0xcf, 0x9a, 0xf0, 0x33, 0x35, 0xef, 0xcd,
+ 0x02, 0x01, 0xe0, 0x13,
+ 0x02, 0xe0, 0x45, 0x12, 0xc0, 0xef, 0x13, 0xf1, 0xe0, 0x26, 0xe0, 0xcf,
+ 0xf0, 0xe0, 0xe1, 0xe0,
+ 0x8c, 0xdc, 0x23, 0x56, 0xf0, 0xaa, 0xff, 0x23, 0x32, 0xde, 0xcd, 0x01,
+ 0x45, 0x00, 0xdd, 0xff,
+ 0x00, 0x11, 0x21, 0x00, 0xdc, 0x00, 0x73, 0x0e, 0xeb, 0x10, 0x32, 0x31,
+ 0x10, 0x0e, 0x41, 0x32,
+ 0x0f, 0x00, 0x77, 0x46, 0x00, 0x00, 0x31, 0x44, 0x00, 0x00, 0x20, 0x41,
+ 0x32, 0x21, 0x00, 0x1f,
+ 0x63, 0x24, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x22, 0x00, 0x02, 0x36, 0xce,
+ 0xff, 0x77, 0x22, 0xef,
+ 0x00, 0x10, 0x22, 0x31, 0x10, 0x32, 0x44, 0x00, 0x0f, 0x31, 0x10, 0x22,
+ 0x00, 0x89, 0x01, 0x25,
+ 0xdf, 0x8b, 0x00, 0x04, 0xef, 0xde, 0x02, 0x14, 0xdf, 0xbe, 0x02, 0x00,
+ 0x00, 0x01, 0x00, 0xe0,
+ 0xff, 0x23, 0x20, 0xec, 0xdb, 0x00, 0x22, 0xcc, 0x8a, 0xff, 0x22, 0x00,
+ 0xbd, 0xee, 0x02, 0x00,
+ 0xcc, 0xee, 0x00, 0xf0, 0xb8, 0x00, 0x10, 0x00, 0xee, 0x10, 0x40, 0x10,
+ 0x0e, 0x0e, 0x41, 0x10,
+ 0xfc, 0x10, 0x31, 0xca, 0xee, 0x33, 0x10, 0x8a, 0xee, 0x22, 0x11, 0xed,
+ 0xdd, 0x0f, 0x00, 0x10,
+ 0x30, 0x0e, 0xfb, 0x00, 0x52, 0x11, 0xcd, 0xfd, 0x02, 0x02, 0xba, 0xf0,
+ 0x13, 0x02, 0x89, 0xf0,
+ 0x13, 0x01, 0xdc, 0x11, 0x34, 0x00, 0xbd, 0x01, 0x46, 0x00, 0xef, 0xff,
+ 0x43, 0x22, 0xee, 0xed,
+ 0x02, 0x12, 0xff, 0xde, 0x00, 0x04, 0x02, 0xce, 0xdd, 0x11, 0x56, 0xef,
+ 0xbb, 0x00, 0x32, 0x00,
+ 0xec, 0xff, 0x63, 0x00, 0xfd, 0x0f, 0x13, 0x01, 0xcb, 0x00, 0x25, 0x01,
+ 0xef, 0xce, 0x00, 0x43,
+ 0x00, 0xd9, 0x0f, 0x30, 0xfe, 0x20, 0x70, 0x0c, 0x20, 0x53, 0x0f, 0x10,
+ 0x22, 0x30, 0x20, 0x1f,
+ 0x1d, 0x72, 0x11, 0x0c, 0x0e, 0x1e, 0x33, 0x11, 0x11, 0x12, 0xe9, 0xce,
+ 0x24, 0x67, 0x00, 0xe0,
+ 0xcc, 0x00, 0x46, 0x01, 0xce, 0xff, 0x33, 0x01, 0xc0, 0x13, 0x35, 0xe0,
+ 0xe0, 0x02, 0xf1, 0x02,
+ 0x23, 0xd1, 0xd1, 0xd2, 0xa1, 0xf6, 0x02, 0xb0, 0xae, 0x03, 0x05, 0xf0,
+ 0xdf, 0xf0, 0x06, 0xf0,
+ 0xae, 0x00, 0x13, 0x01, 0xdd, 0xee, 0x11, 0x33, 0xfe, 0x0f, 0x54, 0x0d,
+ 0x0c, 0x30, 0x40, 0x0f,
+ 0x30, 0x1e, 0xd8, 0x10, 0x41, 0xfe, 0xcd, 0xdc, 0x00, 0x1f, 0xbb, 0x0f,
+ 0x30, 0x40, 0xdb, 0xfd,
+ 0x72, 0x20, 0x0c, 0x0e, 0x2f, 0x4f, 0x50, 0x10, 0x08, 0x0e, 0x30, 0x30,
+ 0xfe, 0x1e, 0x4f, 0x1f,
+ 0x0c, 0x0f, 0x30, 0x30, 0x0d, 0x0e, 0xfe, 0x31, 0x1f, 0x88, 0x0f, 0x10,
+ 0x21, 0xee, 0xfe, 0x52,
+ 0x12, 0x00, 0xde, 0x03, 0x37, 0x00, 0x8f, 0xf2, 0x06, 0xf0, 0xd0, 0xe2,
+ 0x03, 0xe1, 0x9f, 0x03,
+ 0x05, 0xf0, 0xf1, 0xf2, 0xf2, 0xf1, 0x04, 0x14, 0xc0, 0xf2, 0x13, 0xb0,
+ 0xd0, 0x05, 0x03, 0xe0,
+ 0xe2, 0x04, 0xf0, 0xb0, 0x01, 0x57, 0x23, 0xde, 0xe0, 0x54, 0x23, 0x00,
+ 0x00, 0x12, 0x22, 0x12,
+ 0x12, 0x12, 0x01, 0x00, 0x22, 0x40, 0x0e, 0x1c, 0x72, 0x20, 0xf8, 0x00,
+ 0x53, 0x0f, 0xc9, 0x10,
+ 0x42, 0x0f, 0x1f, 0x30, 0x1e, 0x0d, 0x4f, 0x73, 0x31, 0x0a, 0x0c, 0x1f,
+ 0x51, 0x00, 0x0d, 0x1e,
+ 0x1f, 0x21, 0x10, 0xff, 0xff, 0x01, 0x03, 0xee, 0xdd, 0xec, 0x36, 0x54,
+ 0xce, 0xdd, 0x00, 0x01,
+ 0x22, 0x23, 0x13, 0xf0, 0xf1, 0x04, 0x24, 0x14, 0xe2, 0x80, 0xf5, 0x05,
+ 0xa0, 0xbf, 0x05, 0x03,
+ 0xde, 0xdf, 0xe1, 0x13, 0x02, 0xef, 0xdf, 0x01, 0x36, 0x00, 0xe0, 0x00,
+ 0x52, 0x00, 0x33, 0x77,
+ 0x00, 0xf0, 0x12, 0x55, 0x11, 0x01, 0xf0, 0xf0, 0x46, 0x21, 0xe0, 0xe1,
+ 0xf1, 0x00, 0x01, 0x31,
+ 0x20, 0x0f, 0x00, 0x40, 0x0c, 0xed, 0x3f, 0x70, 0x30, 0x0c, 0x0d, 0x3f,
+ 0x72, 0x20, 0x19, 0x1d,
+ 0x4f, 0x30, 0x3d, 0x09, 0x2f, 0x6f, 0x1f, 0x2d, 0x1b, 0x2f, 0x2f, 0x1e,
+ 0x2e, 0x3f, 0x1d, 0x2d,
+ 0x3d, 0x0c, 0x2e, 0x1d, 0xba, 0xad, 0x00, 0x00, 0xe0, 0xcf, 0xbd, 0xdd,
+ 0x06, 0x03, 0xbd, 0xee,
+ 0x03, 0x02, 0xee, 0xee, 0x13, 0x12, 0xec, 0xbb, 0x00, 0x03, 0xef, 0xbc,
+ 0xf0, 0xe1, 0xbf, 0xdb,
+ 0xe2, 0xf4, 0xcf, 0xca, 0x00, 0x03, 0xde, 0xcd, 0xf0, 0x01, 0x00, 0xfd,
+ 0x01, 0x11, 0x0e, 0x00,
+ 0x17, 0xe0, 0xd0, 0xc0, 0xb0, 0xe0, 0xcf, 0xdd, 0xcf, 0xef, 0xed, 0xdc,
+ 0xeb, 0xdd, 0x0f, 0x00,
+ 0x9b, 0xff, 0x00, 0x00, 0xed, 0x0f, 0x0f, 0xdc, 0x0f, 0x00, 0x0d, 0xeb,
+ 0x1e, 0x71, 0x50, 0x0a,
+ 0x20, 0x40, 0x10, 0x0d, 0x30, 0x32, 0x0e, 0x0c, 0x41, 0x66, 0x0f, 0xea,
+ 0x0f, 0x62, 0x01, 0x0e,
+ 0xff, 0x01, 0x24, 0x00, 0xef, 0xf0, 0x12, 0x14, 0xdf, 0x00, 0x33, 0x32,
+ 0xf0, 0xcc, 0x00, 0x12,
+ 0x11, 0xcf, 0xd0, 0xf3, 0x07, 0xe2, 0x80, 0xc1, 0xe4, 0xd5, 0xe4, 0xe2,
+ 0xb0, 0xdf, 0xe0, 0x03,
+ 0xf0, 0xde, 0xef, 0x01, 0x33, 0x10, 0x64, 0x34, 0x0e, 0x1f, 0x10, 0xfa,
+ 0xde, 0x33, 0x03, 0xbf,
+ 0xac, 0xe0, 0x03, 0xcf, 0xdc, 0xdd, 0x02, 0x02, 0xd8, 0xce, 0x0f, 0x0d,
+ 0x0e, 0xfb, 0xfd, 0xfd,
+ 0x3f, 0x6f, 0x0b, 0x0d, 0x0e, 0x2f, 0x3f, 0x4d, 0x5f, 0x2e, 0x0d, 0x2c,
+ 0x3f, 0x00, 0x33, 0x00,
+ 0xdb, 0x00, 0x50, 0x20, 0x62, 0x12, 0x1c, 0x30, 0x43, 0x11, 0x1e, 0x30,
+ 0x0f, 0xc8, 0x00, 0x01,
+ 0xa0, 0xcf, 0xe2, 0x06, 0xf1, 0xd2, 0x02, 0x04, 0x02, 0x34, 0x41, 0x0f,
+ 0x0e, 0x77, 0x53, 0x10,
+ 0x0f, 0x20, 0x21, 0x00, 0x20, 0x33, 0x11, 0x0f, 0x00, 0xef, 0xcc, 0xef,
+ 0x03, 0xdf, 0xa8, 0xed,
+ 0x00, 0x12, 0xf0, 0xce, 0xff, 0x25, 0x24, 0xd0, 0x0e, 0x71, 0x54, 0x00,
+ 0x0e, 0x0d, 0x31, 0x2f,
+ 0x09, 0x0d, 0x0e, 0xee, 0xed, 0xdc, 0xce, 0x00, 0x0f, 0x0c, 0xbd, 0x01,
+ 0x55, 0x40, 0x2f, 0x40,
+ 0x53, 0x30, 0x2f, 0x42, 0x36, 0x31, 0x31, 0x24, 0x22, 0x22, 0x26, 0x12,
+ 0xf2, 0x02, 0x14, 0x33,
+ 0x02, 0xf1, 0x46, 0x22, 0xf2, 0xb0, 0x03, 0x13, 0x13, 0x03, 0x15, 0xe1,
+ 0x14, 0x33, 0x03, 0xe3,
+ 0x13, 0x23, 0x55, 0x53, 0x21, 0x02, 0x05, 0x03, 0xc3, 0x81, 0xd3, 0xd5,
+ 0xc2, 0xe2, 0xf2, 0xf3,
+ 0xd4, 0xe3, 0xe4, 0xe2, 0x02, 0x02, 0xe1, 0xb1, 0xf1, 0x13, 0x32, 0xe0,
+ 0xa0, 0x24, 0x33, 0xef,
+ 0xad, 0xe0, 0x01, 0xfd, 0xd8, 0xcd, 0xee, 0xee, 0xcb, 0xce, 0xee, 0xfd,
+ 0x0e, 0x4e, 0x2c, 0x0c,
+ 0xfc, 0x4e, 0x5d, 0x1c, 0x0d, 0x2e, 0x3f, 0x1c, 0x0b, 0x0e, 0x2e, 0x5e,
+ 0x3f, 0x4b, 0x3c, 0x4e,
+ 0x3f, 0x4f, 0x5e, 0x3e, 0x3e, 0x2e, 0x2e, 0x1b, 0x3f, 0x61, 0x20, 0x1e,
+ 0x1f, 0x2e, 0x2c, 0x0b,
+ 0x0f, 0xfe, 0xff, 0x0f, 0xde, 0xce, 0xef, 0xd0, 0xbe, 0x01, 0x17, 0x02,
+ 0xf0, 0x33, 0x42, 0xe0,
+ 0xd0, 0x36, 0x34, 0x02, 0x04, 0x44, 0x54, 0x34, 0x33, 0x45, 0x01, 0x03,
+ 0x43, 0x03, 0xb2, 0xf1,
+ 0x02, 0x03, 0xe1, 0x90, 0xe2, 0x04, 0x02, 0xe0, 0xe2, 0xf6, 0xe3, 0xc1,
+ 0xc1, 0xd1, 0x02, 0x54,
+ 0x01, 0xf0, 0x31, 0x52, 0x0f, 0x30, 0x40, 0x1b, 0x1c, 0x5d, 0x1c, 0x0c,
+ 0x0b, 0x0d, 0x2f, 0x2f,
+ 0xed, 0xfd, 0x6e, 0x4e, 0x08, 0x0e, 0x2f, 0x4f, 0x3e, 0x2e, 0x3f, 0x6f,
+ 0x3e, 0x2e, 0x2c, 0x2d,
+ 0x5f, 0x3e, 0x1a, 0x1e, 0x2f, 0x3e, 0x1d, 0x1f, 0x0e, 0xeb, 0xbe, 0xed,
+ 0xcf, 0xbe, 0xdc, 0xcf,
+ 0xdf, 0xbe, 0xdb, 0xde, 0xfe, 0xfe, 0xfe, 0x00, 0xf0, 0xf1, 0xd0, 0xf0,
+ 0xe1, 0xc2, 0xc3, 0xe7,
+ 0xd5, 0x80, 0xc0, 0xd0, 0xe1, 0xd3, 0xc2, 0xc3, 0xe2, 0xd4, 0xe4, 0xc0,
+ 0xd0, 0xf4, 0xe4, 0xe0,
+ 0xf2, 0xf3, 0xd0, 0xd0, 0x07, 0x02, 0xc0, 0xb0, 0xd0, 0xf5, 0xc2, 0xc1,
+ 0xe4, 0xe4, 0xb0, 0xe0,
+ 0xe3, 0xe3, 0x03, 0xf0, 0xfd, 0x10, 0x41, 0x2f, 0x29, 0x4e, 0x4e, 0x2c,
+ 0x3d, 0x50, 0x20, 0x31,
+ 0x4f, 0x2e, 0x40, 0x2d, 0x18, 0x3f, 0x30, 0x2c, 0x0b, 0x2d, 0x6e, 0x2e,
+ 0x2c, 0x3d, 0x5e, 0x40,
+ 0x2d, 0x2c, 0x4e, 0x3e, 0x2c, 0x1d, 0x1d, 0x1d, 0x1f, 0x0f, 0xfe, 0xbd,
+ 0xed, 0xcb, 0xe0, 0xd2,
+ 0xe4, 0xd0, 0xd0, 0xf0, 0x02, 0x10, 0xe9, 0xed, 0x00, 0xff, 0xef, 0x20,
+ 0x41, 0xf2, 0xa2, 0xd3,
+ 0xe7, 0xc4, 0xb3, 0xe4, 0xc3, 0xd1, 0xb1, 0xe0, 0xe2, 0xd0, 0xc0, 0xcf,
+ 0xe0, 0xe0, 0xf0, 0xf1,
+ 0x07, 0x14, 0x12, 0x13, 0x02, 0x01, 0x34, 0x23, 0x01, 0x11, 0x32, 0x02,
+ 0xe1, 0x06, 0x44, 0x03,
+ 0xa1, 0xf2, 0x15, 0x23, 0xe2, 0xa0, 0x02, 0x35, 0x63, 0x12, 0x10, 0x51,
+ 0x30, 0x3f, 0x30, 0x61,
+ 0x2f, 0x1a, 0x2f, 0x3f, 0x4f, 0x3d, 0x2e, 0x40, 0x21, 0x1d, 0x3a, 0x40,
+ 0x41, 0x20, 0x2a, 0x30,
+ 0x50, 0x2c, 0x2d, 0x40, 0x31, 0x2d, 0x3c, 0x30, 0x41, 0x1e, 0x1a, 0x2f,
+ 0x00, 0xf0, 0xd0, 0xbd,
+ 0xce, 0xe2, 0xc2, 0xcd, 0xe2, 0xe7, 0xf6, 0xd0, 0xe0, 0xf2, 0xd2, 0xe2,
+ 0xf2, 0xf3, 0xd1, 0x91,
+ 0xe5, 0xd3, 0xb0, 0xdd, 0xe0, 0xe2, 0xc0, 0xcd, 0xef, 0x01, 0x0e, 0x0a,
+ 0x10, 0x30, 0x11, 0x11,
+ 0x13, 0x27, 0x11, 0xdf, 0xaf, 0xe2, 0xd2, 0xdf, 0xc0, 0xf5, 0xf0, 0xdd,
+ 0xfe, 0xce, 0xba, 0xdd,
+ 0xdd, 0xff, 0x0f, 0x3c, 0x0a, 0xee, 0xae, 0xdb, 0xed, 0xed, 0x0d, 0x3c,
+ 0x4e, 0x0c, 0xfd, 0xed,
+ 0xdd, 0xcb, 0x0e, 0x1c, 0x0e, 0x2f, 0x2f, 0x3e, 0x5d, 0x4f, 0x4f, 0x4d,
+ 0x2d, 0x2b, 0x2f, 0x1e,
+ 0xcc, 0xff, 0x00, 0x80, 0xc0, 0xf3, 0xe5, 0xd3, 0xb3, 0xe5, 0xf3, 0x02,
+ 0xe4, 0xd3, 0xd1, 0xc0,
+ 0xd0, 0xe1, 0xe3, 0xc2, 0xc2, 0xc4, 0xe4, 0xf4, 0xf2, 0x03, 0xf2, 0x12,
+ 0x22, 0x00, 0xf4, 0xf3,
+ 0xf0, 0xce, 0xb4, 0xc4, 0xc2, 0xd5, 0xe4, 0xd2, 0xd1, 0xe2, 0xd2, 0xd0,
+ 0xdd, 0x1c, 0x7f, 0x4e,
+ 0x1d, 0x19, 0x3d, 0x6e, 0x1d, 0x1d, 0x1e, 0x00, 0xf0, 0xcb, 0x01, 0x01,
+ 0x17, 0x00, 0x2a, 0x00,
+ 0x67, 0xc7, 0xbd, 0xe1, 0x6a, 0xc8, 0x27, 0xe1, 0xdf, 0x88, 0xfe, 0x64,
+ 0x42, 0xfb, 0x00, 0x5f,
+ 0x00, 0x23, 0x1f, 0x0f, 0x00, 0x00, 0xed, 0xfe, 0xf5, 0xf4, 0xf0, 0x2e,
+ 0xf0, 0xf5, 0x43, 0xbe,
+ 0x8e, 0x04, 0x37, 0x0f, 0xcd, 0x10, 0x43, 0x03, 0x3f, 0xfd, 0xe0, 0x00,
+ 0xe1, 0x02, 0xf0, 0xef,
+ 0x0f, 0xdc, 0xde, 0x12, 0x47, 0x8f, 0xba, 0x10, 0x23, 0x00, 0xcf, 0x0e,
+ 0x0f, 0x01, 0x26, 0x00,
+ 0x30, 0x3f, 0x0d, 0xec, 0x20, 0x74, 0x30, 0xee, 0xdc, 0x31, 0x31, 0xdb,
+ 0xdf, 0x12, 0xe2, 0xb0,
+ 0x02, 0xe1, 0xae, 0xfd, 0x00, 0x1f, 0x24, 0x00, 0xda, 0x30, 0x51, 0x00,
+ 0x00, 0x6e, 0x0e, 0x10,
+ 0x02, 0x03, 0xfb, 0xcf, 0x00, 0xf1, 0x01, 0xd0, 0xfd, 0xe8, 0xe0, 0xf0,
+ 0xb1, 0x1f, 0x50, 0x22,
+ 0x10, 0x1d, 0x2f, 0x34, 0x67, 0x11, 0x01, 0xf0, 0x0e, 0x20, 0xf2, 0xb3,
+ 0x11, 0x33, 0xde, 0x81,
+ 0x07, 0xe3, 0x0e, 0x02, 0x02, 0xab, 0x12, 0x16, 0xf0, 0xfd, 0x01, 0x53,
+ 0x1e, 0x0c, 0x0f, 0xdf,
+ 0x0f, 0x22, 0x0f, 0xf2, 0xf7, 0xf5, 0xf0, 0xdf, 0xdf, 0x11, 0x33, 0x50,
+ 0x00, 0xbf, 0xf9, 0x0f,
+ 0x70, 0x22, 0x0c, 0xdd, 0x22, 0x65, 0x22, 0xfe, 0xef, 0x01, 0x00, 0x1f,
+ 0x00, 0x03, 0x1c, 0xff,
+ 0xd0, 0xec, 0xdd, 0xee, 0xef, 0x00, 0x70, 0x00, 0xfc, 0xef, 0x00, 0x5e,
+ 0x2e, 0x12, 0x35, 0x00,
+ 0xf3, 0x00, 0x0f, 0x70, 0x0e, 0xa8, 0x0f, 0x44, 0x13, 0xef, 0xdc, 0xfe,
+ 0x10, 0x55, 0x00, 0xfe,
+ 0x0f, 0x09, 0xc0, 0x17, 0x01, 0x0e, 0x2f, 0x41, 0xe1, 0xc0, 0x00, 0x65,
+ 0x00, 0xad, 0x0f, 0x03,
+ 0x25, 0xee, 0xff, 0x22, 0x02, 0xed, 0xcd, 0x0f, 0x43, 0x03, 0xec, 0x0b,
+ 0x00, 0x15, 0x11, 0xef,
+ 0xdf, 0x11, 0xd0, 0xd0, 0x3f, 0x44, 0xe1, 0xb0, 0xf0, 0xee, 0x00, 0x74,
+ 0x71, 0x2a, 0xe0, 0x02,
+ 0x04, 0xde, 0x0e, 0x20, 0x00, 0xeb, 0xf0, 0xff, 0xe2, 0x14, 0x21, 0xea,
+ 0xcf, 0x20, 0x70, 0x00,
+ 0x0e, 0x00, 0x01, 0x03, 0xfb, 0x0f, 0x4f, 0x00, 0x10, 0x50, 0x10, 0x50,
+ 0x2e, 0x4f, 0x01, 0xdd,
+ 0xf8, 0x0d, 0x33, 0x04, 0x2f, 0x0e, 0x8c, 0xd0, 0x12, 0x10, 0x0f, 0xf3,
+ 0xd0, 0xd0, 0x30, 0x77,
+ 0x23, 0xd9, 0x20, 0x61, 0xf1, 0xe0, 0xf0, 0x0f, 0x00, 0xd2, 0x03, 0xac,
+ 0xee, 0xd2, 0x12, 0x32,
+ 0x10, 0xdd, 0xce, 0x33, 0x57, 0xfc, 0xdc, 0x22, 0x44, 0xff, 0x0d, 0x24,
+ 0x12, 0xdd, 0xc0, 0xf5,
+ 0x01, 0xf2, 0x12, 0x30, 0x0c, 0xcd, 0xcd, 0xd0, 0x67, 0x04, 0xad, 0x0f,
+ 0x21, 0x23, 0xff, 0xdd,
+ 0x00, 0x44, 0x50, 0x0f, 0xfc, 0xfe, 0x00, 0x41, 0x00, 0xbb, 0x10, 0x01,
+ 0x04, 0xcf, 0x00, 0xf1,
+ 0xf0, 0x02, 0x67, 0x00, 0x0c, 0xff, 0x10, 0x43, 0x0f, 0x1e, 0x22, 0x1e,
+ 0x0d, 0x00, 0x36, 0x62,
+ 0x0e, 0xfc, 0x02, 0x34, 0xfe, 0xde, 0xc0, 0x17, 0x02, 0xbb, 0xf0, 0x10,
+ 0xf0, 0xa0, 0x0f, 0x30,
+ 0x00, 0x00, 0x30, 0x10, 0x10, 0x02, 0xd0, 0x02, 0x24, 0x45, 0xff, 0xcd,
+ 0x00, 0x0f, 0xaf, 0xd0,
+ 0xd0, 0xec, 0xcf, 0xf7, 0xd0, 0xed, 0x02, 0x54, 0xff, 0xff, 0x10, 0x43,
+ 0x47, 0x00, 0x1b, 0x00,
+ 0x2f, 0x31, 0xe1, 0xf0, 0xd0, 0x70, 0x45, 0xdf, 0xee, 0xdf, 0x02, 0xc3,
+ 0xf2, 0xe0, 0xf0, 0xdc,
+ 0xfc, 0x0e, 0x7c, 0x5e, 0x1e, 0x13, 0x07, 0x00, 0x0c, 0x1f, 0x20, 0xf0,
+ 0x00, 0x31, 0x20, 0xe0,
+ 0x74, 0x5f, 0xfe, 0xf0, 0xef, 0x00, 0x17, 0x31, 0xfb, 0x30, 0x71, 0x10,
+ 0x12, 0x0f, 0x0d, 0x0f,
+ 0x56, 0x00, 0x0c, 0x0f, 0xc0, 0xd0, 0x03, 0x4e, 0x1d, 0xe4, 0x81, 0x02,
+ 0xf3, 0x00, 0xff, 0xe0,
+ 0xdd, 0x0d, 0x00, 0x77, 0x02, 0x0f, 0x1b, 0x1f, 0x21, 0x12, 0xfe, 0x0b,
+ 0x22, 0x01, 0x9d, 0xe0,
+ 0xf7, 0x06, 0xdf, 0xcc, 0x01, 0x02, 0x10, 0x20, 0x30, 0x00, 0xe3, 0xaf,
+ 0x0e, 0x41, 0x20, 0xfd,
+ 0x00, 0x17, 0xf0, 0xae, 0x01, 0x46, 0xff, 0xfe, 0x0f, 0x00, 0x02, 0xfe,
+ 0xde, 0xdf, 0x00, 0x20,
+ 0xde, 0xc0, 0xf1, 0x66, 0x0f, 0x1c, 0x70, 0x02, 0x0f, 0x30, 0x35, 0xef,
+ 0x0f, 0x40, 0x01, 0x00,
+ 0xe0, 0x01, 0x45, 0x01, 0xee, 0x40, 0x77, 0x20, 0xeb, 0x00, 0x01, 0xdf,
+ 0xee, 0xf0, 0x04, 0xf0,
+ 0xaa, 0x10, 0x74, 0x00, 0xef, 0xee, 0x03, 0x12, 0xef, 0xdf, 0x00, 0xf3,
+ 0xef, 0x0e, 0x00, 0x55,
+ 0x12, 0xde, 0xdd, 0x50, 0x6e, 0x10, 0x37, 0xf0, 0xdd, 0xf0, 0xe2, 0xb0,
+ 0x0f, 0xf4, 0xd2, 0xcf,
+ 0xd0, 0xf0, 0x00, 0x2d, 0x5d, 0x00, 0x21, 0x1b, 0x5c, 0x2f, 0x1d, 0x40,
+ 0x10, 0xd9, 0xdf, 0x04,
+ 0x34, 0x10, 0x10, 0xfa, 0x00, 0xb2, 0xd0, 0x00, 0x11, 0xee, 0xcd, 0xef,
+ 0xec, 0x1c, 0x71, 0xf1,
+ 0xcb, 0x3e, 0x71, 0x34, 0xdd, 0xec, 0x20, 0x50, 0x05, 0x00, 0xf0, 0xef,
+ 0xbc, 0x00, 0x14, 0x36,
+ 0xde, 0xbc, 0x10, 0x53, 0x00, 0x0f, 0xf0, 0x1f, 0x30, 0x00, 0x1f, 0x0e,
+ 0xe2, 0x01, 0xf2, 0xd1,
+ 0x0b, 0xfe, 0x01, 0x27, 0xa2, 0xd0, 0x03, 0x12, 0xd0, 0x9f, 0x03, 0x23,
+ 0x20, 0xe1, 0xb2, 0x07,
+ 0x31, 0x1b, 0x20, 0xf2, 0xc3, 0xff, 0xeb, 0x21, 0x42, 0xf0, 0xbd, 0x01,
+ 0x57, 0x02, 0xe0, 0xdd,
+ 0xff, 0x01, 0xd1, 0x9c, 0x0f, 0x0f, 0x31, 0x16, 0x10, 0x3e, 0x30, 0x4f,
+ 0x60, 0x11, 0x53, 0x08,
+ 0x1e, 0x0f, 0xe0, 0xd0, 0xec, 0xef, 0xef, 0xd1, 0xb1, 0xef, 0x0d, 0xf2,
+ 0xe4, 0xd0, 0x63, 0x3f,
+ 0x08, 0x30, 0x32, 0xe3, 0xc9, 0x30, 0x70, 0x00, 0xff, 0x0f, 0x50, 0x01,
+ 0xe0, 0xee, 0x04, 0x12,
+ 0xfb, 0xcf, 0x0f, 0x21, 0x02, 0xe0, 0xed, 0xf1, 0xd2, 0xe0, 0x6d, 0x52,
+ 0x12, 0x0f, 0x02, 0x15,
+ 0x0f, 0x03, 0x07, 0x05, 0xcf, 0xe0, 0x00, 0xf1, 0xc0, 0xd1, 0x24, 0x33,
+ 0xe1, 0xac, 0x0a, 0x00,
+ 0x04, 0xd1, 0x00, 0x00, 0xf0, 0xb0, 0xc0, 0xff, 0x00, 0x2f, 0x1f, 0x04,
+ 0xe2, 0x7e, 0x3b, 0x10,
+ 0x23, 0x17, 0xd0, 0x8f, 0xfd, 0x01, 0x02, 0x0f, 0x0f, 0x32, 0x00, 0x00,
+ 0x20, 0x73, 0x50, 0x08,
+ 0x09, 0x02, 0x13, 0x00, 0x1f, 0x0f, 0x00, 0xf0, 0xdd, 0x10, 0x11, 0xca,
+ 0xbe, 0xf0, 0xd0, 0xd0,
+ 0x1d, 0x40, 0x74, 0x0d, 0x0a, 0x00, 0x74, 0x01, 0x00, 0x0d, 0x20, 0x00,
+ 0xf0, 0x10, 0x30, 0xf3,
+ 0xb0, 0x0c, 0x0f, 0xf0, 0xef, 0xd0, 0x14, 0x44, 0xee, 0xfe, 0x14, 0x02,
+ 0xd0, 0xc8, 0x2f, 0x31,
+ 0x06, 0x10, 0xff, 0xb0, 0x00, 0x01, 0x03, 0xa2, 0xdf, 0xfe, 0x01, 0x24,
+ 0xde, 0xee, 0x72, 0x37,
+ 0xcf, 0xbd, 0xe0, 0xef, 0x00, 0x40, 0x11, 0x10, 0xe0, 0xf1, 0xf0, 0xf0,
+ 0x07, 0x71, 0x2e, 0xed,
+ 0x01, 0x27, 0x22, 0x00, 0x30, 0x7f, 0x10, 0x00, 0x0d, 0x0e, 0x10, 0xc0,
+ 0xfe, 0x11, 0x15, 0x1e,
+ 0x09, 0x40, 0x02, 0xcf, 0xbd, 0xf4, 0x04, 0xe0, 0xbc, 0xee, 0x11, 0x44,
+ 0x30, 0x0a, 0xe0, 0x50,
+ 0x14, 0x3e, 0x4e, 0x51, 0x00, 0x0c, 0x3f, 0x31, 0xe1, 0xbd, 0x0e, 0xf1,
+ 0x01, 0xc9, 0x0f, 0x13,
+ 0x02, 0xfe, 0xee, 0xf3, 0x07, 0x20, 0x30, 0x40, 0x33, 0xce, 0xde, 0x57,
+ 0x03, 0xed, 0x10, 0x32,
+ 0x00, 0x9e, 0xdc, 0xdf, 0x00, 0x04, 0xa0, 0xce, 0x0f, 0xc0, 0xe5, 0xd0,
+ 0x01, 0x02, 0xe1, 0x23,
+ 0x7e, 0x08, 0x00, 0x0f, 0x40, 0x1e, 0x0d, 0xfe, 0x10, 0x13, 0xe7, 0xa0,
+ 0x0f, 0x13, 0x37, 0x00,
+ 0xce, 0x0f, 0x00, 0xde, 0xf0, 0xe1, 0xf0, 0x1d, 0x62, 0x01, 0x2e, 0x2c,
+ 0xec, 0xf0, 0x04, 0x53,
+ 0x1f, 0x2f, 0x0c, 0x1c, 0xcd, 0xe1, 0x04, 0xe0, 0x8b, 0xaf, 0x03, 0x05,
+ 0x0d, 0x1c, 0x21, 0x33,
+ 0x31, 0x3e, 0x2e, 0x30, 0x22, 0x7f, 0x1f, 0x30, 0x01, 0x00, 0x0e, 0x05,
+ 0xe2, 0xbb, 0x00, 0xf7,
+ 0xd2, 0xae, 0x0f, 0xe3, 0x00, 0x0c, 0xeb, 0x02, 0x34, 0x0e, 0x2c, 0x11,
+ 0x51, 0x52, 0x20, 0x20,
+ 0x04, 0x20, 0x1d, 0xb0, 0xe5, 0xf2, 0x00, 0xec, 0xa0, 0xf0, 0xe3, 0xde,
+ 0xef, 0x04, 0xe0, 0xfa,
+ 0x50, 0x50, 0x00, 0xe0, 0x03, 0x64, 0x00, 0x0c, 0xf0, 0x0f, 0x2f, 0xf1,
+ 0xf4, 0xf1, 0x03, 0xe0,
+ 0xeb, 0x0e, 0xff, 0x02, 0x75, 0x10, 0xfb, 0xd3, 0xe2, 0xcd, 0xfc, 0x20,
+ 0x00, 0x2d, 0x30, 0x2f,
+ 0x0d, 0xfe, 0x54, 0x76, 0x22, 0x11, 0x3e, 0x73, 0x17, 0xf2, 0xe0, 0x00,
+ 0xf1, 0xef, 0x00, 0xee,
+ 0xfa, 0x00, 0x50, 0x20, 0x20, 0x20, 0x23, 0x13, 0x0e, 0xf0, 0x37, 0x11,
+ 0x8f, 0xf0, 0xd3, 0xe1,
+ 0xbb, 0xdb, 0xf1, 0x15, 0x40, 0x0d, 0xcf, 0x22, 0x52, 0x00, 0x0e, 0x1e,
+ 0x0e, 0x0b, 0xde, 0x22,
+ 0x04, 0xc1, 0xad, 0x0b, 0x00, 0x01, 0xef, 0xfd, 0x01, 0x25, 0xef, 0x9c,
+ 0x00, 0x33, 0x00, 0xee,
+ 0xf1, 0x05, 0x00, 0x30, 0x00, 0x41, 0x33, 0xcf, 0xd8, 0x20, 0x70, 0x33,
+ 0x00, 0xff, 0xb9, 0xef,
+ 0x00, 0x01, 0x02, 0x90, 0x0f, 0x00, 0x2d, 0x0e, 0x31, 0x02, 0xdd, 0xfa,
+ 0x50, 0x53, 0x02, 0x0b,
+ 0xdc, 0x00, 0x00, 0x43, 0x31, 0x11, 0x04, 0x02, 0x00, 0x0f, 0x4f, 0x0f,
+ 0x2d, 0x3c, 0x12, 0xe7,
+ 0x83, 0xec, 0x0e, 0x53, 0x25, 0x00, 0xcd, 0xf1, 0xf1, 0xe0, 0xf1, 0xb0,
+ 0x0e, 0xf2, 0x02, 0x01,
+ 0xf3, 0x0f, 0xca, 0xef, 0x11, 0x24, 0x21, 0x21, 0x0e, 0xa9, 0xe0, 0xf2,
+ 0x24, 0x30, 0x1e, 0x12,
+ 0x34, 0x71, 0x22, 0xb0, 0x01, 0x14, 0x11, 0xc2, 0xef, 0x1f, 0x1e, 0x09,
+ 0xcf, 0x32, 0x01, 0xb9,
+ 0x00, 0x45, 0x10, 0xfc, 0x1e, 0x70, 0x30, 0x02, 0xae, 0x0f, 0x13, 0x02,
+ 0xfe, 0x0d, 0xe0, 0xef,
+ 0xfd, 0x20, 0x24, 0x04, 0xcc, 0xe9, 0x0f, 0x30, 0x72, 0x4e, 0x0e, 0x00,
+ 0x0f, 0x2f, 0x0f, 0x0f,
+ 0x01, 0x04, 0x0d, 0x30, 0x37, 0x10, 0x0d, 0xbf, 0xa2, 0xf2, 0x07, 0x10,
+ 0x0c, 0xf0, 0x02, 0x01,
+ 0xa0, 0x0f, 0xe0, 0x03, 0x47, 0x00, 0xed, 0xfe, 0x20, 0x30, 0xdb, 0xef,
+ 0x53, 0x20, 0xf1, 0xe3,
+ 0xe5, 0xb1, 0xd0, 0x8f, 0xf2, 0xd3, 0xf4, 0x11, 0x2f, 0x0a, 0x20, 0x73,
+ 0x22, 0x10, 0x1d, 0xfb,
+ 0x1f, 0x40, 0x04, 0xf0, 0xf1, 0xd0, 0xc0, 0xc2, 0xd3, 0xd1, 0xe0, 0xe0,
+ 0xc0, 0x17, 0x32, 0x6d,
+ 0x3c, 0x32, 0x2f, 0x18, 0x0e, 0x20, 0x73, 0x30, 0xfd, 0x00, 0x30, 0x0b,
+ 0xde, 0xde, 0xed, 0xde,
+ 0xd0, 0xd0, 0x3d, 0x48, 0x8c, 0xd1, 0x05, 0x10, 0x00, 0x0f, 0x72, 0x72,
+ 0x00, 0xee, 0x1e, 0x20,
+ 0x00, 0x01, 0x0f, 0x2f, 0x0b, 0xff, 0xf0, 0x01, 0xc5, 0xc2, 0x02, 0x13,
+ 0xfe, 0x89, 0x00, 0xf0,
+ 0xf0, 0xff, 0xee, 0xf0, 0x03, 0x00, 0x2d, 0x10, 0x20, 0x34, 0x65, 0x16,
+ 0x00, 0xe0, 0xef, 0xef,
+ 0xf1, 0x04, 0xd0, 0xc1, 0x03, 0xae, 0xc8, 0xf0, 0x00, 0x03, 0x21, 0x3f,
+ 0x20, 0x64, 0x01, 0x00,
+ 0x20, 0x00, 0x00, 0x31, 0x10, 0xbf, 0xd0, 0x1c, 0x48, 0x00, 0x01, 0xa2,
+ 0xff, 0x00, 0x13, 0xff,
+ 0xda, 0x0f, 0x20, 0x32, 0x11, 0x0f, 0x20, 0x5f, 0x0b, 0x00, 0x74, 0x61,
+ 0x0c, 0x10, 0x14, 0x01,
+ 0xd0, 0x0d, 0x02, 0x01, 0xe8, 0xce, 0x00, 0x42, 0x00, 0xbf, 0x0c, 0x30,
+ 0x60, 0x10, 0x1f, 0x24,
+ 0x1f, 0x0a, 0x00, 0xf5, 0xd1, 0xd0, 0x0f, 0x00, 0x02, 0x01, 0xf0, 0xd1,
+ 0x20, 0x3f, 0xff, 0x30,
+ 0x74, 0x0f, 0x0d, 0x00, 0xd2, 0x8b, 0xec, 0xe1, 0xe6, 0xb0, 0xfd, 0x00,
+ 0x04, 0xf1, 0x01, 0x22,
+ 0x16, 0xbd, 0xee, 0x31, 0x74, 0x01, 0x01, 0xf1, 0xfd, 0xdd, 0xfe, 0xfd,
+ 0xe0, 0xe2, 0xc2, 0x11,
+ 0x41, 0x20, 0x40, 0x20, 0x1c, 0x0d, 0x10, 0x07, 0xe2, 0x01, 0xcb, 0xfd,
+ 0x11, 0x56, 0xf1, 0xd0,
+ 0x0f, 0xfc, 0xd2, 0x52, 0x7c, 0x3d, 0x2d, 0xdd, 0xdb, 0x00, 0x60, 0xf1,
+ 0xcf, 0xf0, 0x06, 0xef,
+ 0xcc, 0xd0, 0xf2, 0x47, 0x30, 0x2d, 0x40, 0x50, 0x10, 0x11, 0x3d, 0x0c,
+ 0x10, 0x53, 0x13, 0x1e,
+ 0x0b, 0xdf, 0xc0, 0x01, 0x05, 0x21, 0xae, 0xdb, 0x00, 0x03, 0xef, 0xdd,
+ 0xf0, 0x04, 0x11, 0x52,
+ 0x03, 0xf0, 0x40, 0x41, 0x02, 0x1f, 0x0e, 0x42, 0x00, 0xc0, 0xdc, 0xcc,
+ 0xf1, 0xd5, 0xf1, 0xf5,
+ 0x17, 0x00, 0x8f, 0xec, 0xf1, 0x02, 0x02, 0xe0, 0xde, 0x1d, 0x7e, 0x1e,
+ 0x25, 0x23, 0x1c, 0x2e,
+ 0x10, 0x10, 0x72, 0x10, 0x0f, 0xb9, 0x01, 0x03, 0xc2, 0x00, 0x3e, 0x00,
+ 0xc0, 0x00, 0x1d, 0x1e,
+ 0xef, 0xfd, 0x3e, 0x46, 0x22, 0x20, 0x4e, 0x03, 0x44, 0x04, 0xa3, 0xf5,
+ 0x13, 0x41, 0xfd, 0xba,
+ 0x0c, 0x0f, 0x0f, 0x13, 0xf1, 0xdb, 0x00, 0x00, 0x20, 0x2e, 0x22, 0xf7,
+ 0xf3, 0x0c, 0x40, 0x74,
+ 0x23, 0x20, 0x4f, 0x32, 0x13, 0x0c, 0x1e, 0x02, 0xb3, 0xc0, 0xeb, 0xde,
+ 0xd1, 0xf4, 0xcf, 0xcd,
+ 0xdd, 0x02, 0x35, 0x00, 0xf0, 0x0e, 0x0f, 0x0d, 0x0b, 0x70, 0x70, 0x01,
+ 0xe1, 0xcf, 0x0c, 0x01,
+ 0x05, 0x10, 0x22, 0x0f, 0xcc, 0xd3, 0x02, 0x0b, 0xea, 0xed, 0xff, 0x70,
+ 0x45, 0x01, 0x0f, 0x1c,
+ 0x0d, 0x10, 0x44, 0x0f, 0x0d, 0x00, 0x22, 0xf1, 0xf0, 0x10, 0x90, 0xda,
+ 0x11, 0x36, 0x9f, 0xdf,
+ 0x0f, 0x00, 0x10, 0x00, 0xdf, 0xdb, 0x10, 0x73, 0x33, 0x2e, 0x0c, 0x2e,
+ 0x0d, 0x20, 0x53, 0x56,
+ 0x0f, 0x0e, 0xe1, 0x02, 0xf0, 0x07, 0x06, 0x00, 0xbd, 0x12, 0x33, 0x30,
+ 0x2d, 0x3e, 0x0f, 0xc0,
+ 0x00, 0x10, 0x50, 0x03, 0xa3, 0x00, 0x01, 0x05, 0x05, 0xd0, 0xcc, 0xf0,
+ 0xf1, 0xc0, 0xdd, 0xe0,
+ 0x06, 0x30, 0x0e, 0x70, 0x01, 0x01, 0x03, 0x02, 0x05, 0x20, 0x2c, 0x3e,
+ 0x1f, 0x1f, 0x9d, 0xdc,
+ 0x00, 0x10, 0x01, 0xc0, 0x0c, 0x62, 0x14, 0x01, 0x0f, 0xeb, 0xfe, 0x03,
+ 0x02, 0x88, 0xee, 0x00,
+ 0x23, 0x20, 0x2f, 0xd1, 0xc1, 0x50, 0x21, 0xf0, 0xeb, 0x00, 0x31, 0xbf,
+ 0xed, 0xf1, 0x37, 0x10,
+ 0xdb, 0xcf, 0xff, 0x00, 0xfe, 0x40, 0x71, 0x10, 0xf0, 0xf0, 0x4f, 0x4d,
+ 0x0d, 0xed, 0x07, 0x07,
+ 0xc0, 0xbc, 0xf0, 0x02, 0x24, 0x20, 0x20, 0x22, 0x0f, 0xfe, 0xfe, 0x33,
+ 0x43, 0x3f, 0x2f, 0x72,
+ 0xf0, 0xdf, 0xe0, 0xb1, 0xe7, 0xf5, 0xf0, 0xdd, 0x12, 0x44, 0xd0, 0xc0,
+ 0xe0, 0xec, 0xeb, 0xd0,
+ 0x12, 0x30, 0xfb, 0xe0, 0x63, 0x62, 0x10, 0x03, 0x06, 0x10, 0x3d, 0x00,
+ 0xc0, 0xf3, 0x03, 0x03,
+ 0xed, 0xec, 0x00, 0xc2, 0xa1, 0x0f, 0x1c, 0x3f, 0x40, 0x4f, 0x40, 0x22,
+ 0x08, 0x0b, 0x10, 0x60,
+ 0x00, 0x0d, 0x00, 0x10, 0xec, 0xd9, 0xf0, 0xe2, 0x14, 0x4f, 0x0f, 0x0e,
+ 0xc2, 0xf0, 0x50, 0x53,
+ 0x10, 0x3d, 0x2b, 0x50, 0x12, 0x0f, 0xf8, 0xfe, 0xff, 0x10, 0x00, 0xe4,
+ 0xf1, 0x61, 0x10, 0x00,
+ 0x01, 0xd0, 0xf2, 0xb4, 0xa1, 0xe0, 0xe9, 0xcf, 0x10, 0x43, 0x00, 0x0d,
+ 0xd2, 0x03, 0x2f, 0x00,
+ 0x05, 0x2f, 0x3b, 0x0f, 0xd0, 0x82, 0xde, 0xee, 0xd7, 0xd1, 0xb0, 0xff,
+ 0xf2, 0x07, 0x10, 0x21,
+ 0x30, 0x0e, 0x01, 0x73, 0x51, 0x1f, 0x0e, 0x0f, 0x22, 0x43, 0xeb, 0xbb,
+ 0x00, 0x21, 0x02, 0xe3,
+ 0xd0, 0x0f, 0x00, 0xcf, 0xbd, 0x0f, 0x33, 0x03, 0xba, 0x0e, 0x30, 0x20,
+ 0x20, 0x44, 0x32, 0x08,
+ 0x1d, 0x52, 0x22, 0x3e, 0xdb, 0xcf, 0xe0, 0x1f, 0x31, 0xd2, 0xdd, 0x1e,
+ 0x1d, 0x0e, 0xfe, 0x2b,
+ 0x7e, 0x1f, 0x04, 0x04, 0xee, 0xee, 0x3f, 0x75, 0x75, 0x10, 0x00, 0x00,
+ 0xed, 0x00, 0x12, 0x00,
+ 0x4a, 0x1f, 0x7e, 0x08, 0xe2, 0x1b, 0x28, 0x09, 0x33, 0x57, 0x31, 0x3d,
+ 0x3a, 0x3e, 0x4e, 0x2c,
+ 0x30, 0x30, 0x2f, 0x0b, 0x1e, 0x0b, 0xed, 0x0f, 0x0e, 0xcb, 0xcc, 0xfe,
+ 0xf0, 0xff, 0xbd, 0xeb,
+ 0xee, 0xee, 0xd0, 0xdf, 0xdf, 0xc1, 0xb3, 0xc3, 0xe4, 0xc5, 0xd1, 0xd2,
+ 0xc4, 0xd7, 0xc1, 0xc1,
+ 0xd1, 0xd3, 0xe3, 0xd3, 0xd4, 0xe4, 0xd3, 0xe5, 0xf3, 0xd3, 0xd4, 0xd2,
+ 0xa2, 0xd3, 0xc4, 0xd2,
+ 0xa1, 0xd2, 0xb1, 0xd0, 0xd0, 0xcd, 0xdb, 0xcd, 0xed, 0xfd, 0xee, 0xf0,
+ 0xde, 0xec, 0xde, 0xcf,
+ 0xdd, 0xeb, 0x0e, 0x1e, 0x2e, 0x3e, 0x4b, 0x2c, 0x3d, 0x5d, 0x4e, 0x3e,
+ 0x5a, 0x2c, 0x3d, 0x2c,
+ 0x1c, 0x1c, 0x1d, 0x1e, 0x1e, 0x2d, 0x1d, 0x0d, 0x1c, 0x0c, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0xfe, 0xdb,
+ 0x1e, 0x7e, 0x4f, 0x0c, 0xfd, 0x0d, 0xdd, 0xdd, 0xdc, 0xad, 0xaa, 0xdd,
+ 0xcd, 0xed, 0xce, 0xdb,
+ 0xde, 0xef, 0xd0, 0xd0, 0xd0, 0xc0, 0xd1, 0xe3, 0x03, 0xe3, 0x92, 0xd2,
+ 0xc3, 0xe7, 0xc7, 0xd1,
+ 0xe2, 0xe2, 0xf3, 0xe1, 0xe0, 0xc0, 0xde, 0xce, 0xe0, 0xf1, 0xd1, 0xa0,
+ 0xce, 0xce, 0xdf, 0xd1,
+ 0xc3, 0xe3, 0xe4, 0xe4, 0xf3, 0x03, 0x05, 0x04, 0x03, 0x25, 0x65, 0x43,
+ 0x42, 0x32, 0x52, 0x22,
+ 0x31, 0x30, 0x2d, 0x2c, 0x2c, 0x2c, 0x2c, 0x1d, 0x0f, 0x11, 0x23, 0x35,
+ 0x55, 0x43, 0x53, 0x43,
+ 0x45, 0x32, 0x32, 0x42, 0x30, 0x31, 0x42, 0x44, 0x31, 0x31, 0x32, 0x33,
+ 0x33, 0x33, 0x35, 0x23,
+ 0x33, 0x13, 0x11, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x0c, 0x0a, 0x0e,
+ 0x10, 0x10, 0x50, 0x21,
+ 0x05, 0x17, 0x74, 0x43, 0x03, 0xe3, 0xe4, 0xf3, 0xb5, 0xb2, 0xd2, 0xa1,
+ 0xe1, 0xd2, 0xf2, 0xe1,
+ 0xf2, 0xe3, 0xf1, 0xf2, 0x02, 0xf3, 0xf0, 0xed, 0xd8, 0xdd, 0xed, 0xcd,
+ 0xab, 0xcc, 0xde, 0xdf,
+ 0xbe, 0xcd, 0xdd, 0xcc, 0xcd, 0xdd, 0xdf, 0xed, 0xea, 0xfc, 0xec, 0xfe,
+ 0x1d, 0x6d, 0x4d, 0x3d,
+ 0x4e, 0x4d, 0x2d, 0x3d, 0x2b, 0x2d, 0x2e, 0x1e, 0x0e, 0x0d, 0xfd, 0xfb,
+ 0xee, 0xdd, 0xbb, 0xdd,
+ 0xff, 0xef, 0x0d, 0x1e, 0x4f, 0x40, 0x30, 0x50, 0x45, 0x24, 0x33, 0x33,
+ 0x32, 0x24, 0x03, 0x07,
+ 0x02, 0xd2, 0xa2, 0xd2, 0xd4, 0xc5, 0xe3, 0xe4, 0xf3, 0xd3, 0xc4, 0xe2,
+ 0x03, 0x04, 0x12, 0x23,
+ 0x34, 0x23, 0x23, 0x53, 0x55, 0x43, 0x33, 0x23, 0x44, 0x45, 0x32, 0x31,
+ 0x21, 0x02, 0xf2, 0xe2,
+ 0xe1, 0xc0, 0xb0, 0xe0, 0xf0, 0x10, 0x3f, 0x2f, 0x4c, 0x3c, 0x3d, 0x5e,
+ 0x3e, 0x5e, 0x20, 0x20,
+ 0x20, 0x2f, 0x10, 0x00, 0x01, 0x0f, 0xe8, 0xda, 0xdb, 0x1d, 0x7e, 0x2e,
+ 0x3d, 0x2a, 0x2d, 0x2d,
+ 0x0e, 0xed, 0xec, 0x1f, 0x3e, 0x2f, 0x4e, 0x5e, 0x2f, 0x5e, 0x4f, 0x4f,
+ 0x50, 0x31, 0x45, 0x23,
+ 0x34, 0x32, 0x34, 0x56, 0x23, 0x23, 0x12, 0x33, 0x43, 0x12, 0x13, 0x22,
+ 0x12, 0x02, 0xc4, 0xd4,
+ 0xe4, 0xc2, 0xb4, 0xc4, 0xc4, 0xd4, 0xc3, 0xc3, 0xd3, 0xe4, 0xd4, 0xc2,
+ 0xd1, 0xd3, 0xd4, 0xc3,
+ 0xf4, 0xf2, 0x03, 0x02, 0x04, 0xf2, 0xf1, 0xf2, 0xf2, 0xe1, 0xc0, 0xf0,
+ 0xe0, 0xe0, 0xe0, 0xec,
+ 0x0c, 0x1c, 0x1a, 0x0c, 0xdd, 0x9e, 0xdc, 0x0e, 0x1e, 0x2f, 0xdf, 0x8c,
+ 0xed, 0xde, 0xdf, 0xdf,
+ 0x0e, 0xfd, 0xed, 0x0d, 0x5c, 0x59, 0x3d, 0x5b, 0x4e, 0x2d, 0x2d, 0x3b,
+ 0x3d, 0x1d, 0x3d, 0x5d,
+ 0x4d, 0x3d, 0x3c, 0x3d, 0x0c, 0x0d, 0xfb, 0x2d, 0x6f, 0x1e, 0x2d, 0x1c,
+ 0x2d, 0x2d, 0x1c, 0x5e,
+ 0x5e, 0x3f, 0x3d, 0x2c, 0x4e, 0x2e, 0x3f, 0x0e, 0x1f, 0x00, 0xcf, 0x9e,
+ 0xdf, 0xb0, 0xde, 0xcd,
+ 0xd0, 0xd2, 0xc4, 0xd7, 0xc2, 0xd1, 0xc0, 0xd2, 0xd2, 0xd1, 0xdf, 0xdc,
+ 0xdc, 0xe0, 0xd3, 0xd2,
+ 0xb1, 0xd7, 0xd6, 0xd2, 0xc1, 0xd2, 0xd3, 0xe2, 0xc4, 0xc3, 0xc0, 0xd0,
+ 0xc0, 0xe5, 0xf3, 0xd1,
+ 0xd1, 0xd2, 0xd2, 0xe3, 0xe3, 0xd1, 0xd1, 0xe3, 0xe5, 0xf2, 0x01, 0x1e,
+ 0x0b, 0x6e, 0x5d, 0x2c,
+ 0x1d, 0x10, 0x1e, 0x09, 0xfd, 0x0d, 0x0e, 0x0c, 0x40, 0x60, 0x30, 0x5f,
+ 0x4e, 0x5b, 0x4b, 0x3e,
+ 0x3d, 0x5c, 0x3c, 0x4e, 0x3e, 0x30, 0x40, 0x21, 0x21, 0x22, 0x13, 0x25,
+ 0x03, 0x14, 0x01, 0x00,
+ 0x10, 0x30, 0x21, 0x30, 0x1c, 0x1d, 0x0e, 0xde, 0xbe, 0xf2, 0xf3, 0xc0,
+ 0xc2, 0xb6, 0xc3, 0xb2,
+ 0xc0, 0xd2, 0xc7, 0xe6, 0xd1, 0xd3, 0xd6, 0xe2, 0xe4, 0xf3, 0xf4, 0x03,
+ 0x04, 0x02, 0xe3, 0xe1,
+ 0xf2, 0x02, 0x13, 0x11, 0xe0, 0x80, 0xe0, 0xd0, 0xe0, 0xd5, 0xc3, 0xd2,
+ 0xc2, 0xc3, 0xc3, 0xc3,
+ 0xd3, 0xd3, 0xd6, 0xd3, 0xf3, 0x03, 0x23, 0x3f, 0x5b, 0x4d, 0x4e, 0x50,
+ 0x30, 0x4c, 0x3b, 0x3d,
+ 0x4d, 0x2a, 0x2c, 0x2c, 0x2d, 0x1c, 0x2d, 0x1d, 0x2c, 0x2d, 0x2d, 0x2d,
+ 0x4c, 0x5c, 0x4e, 0x4d,
+ 0x3e, 0x4c, 0x3d, 0x2c, 0x3d, 0x4f, 0x4f, 0x30, 0x3e, 0x3e, 0x3e, 0x2f,
+ 0x2f, 0x0f, 0x0e, 0xff,
+ 0xdd, 0xbb, 0xde, 0xcd, 0xdd, 0xba, 0xdd, 0xdd, 0xef, 0xe0, 0xd0, 0xd0,
+ 0xdf, 0xe0, 0xd0, 0xc2,
+ 0xc3, 0xe4, 0xb3, 0xc0, 0xc2, 0xe5, 0xd5, 0xc3, 0xd5, 0xe3, 0xe3, 0xc5,
+ 0xe3, 0xf2, 0xf2, 0x05,
+ 0xe2, 0x01, 0x23, 0x35, 0x02, 0x12, 0x12, 0x12, 0xf2, 0xd5, 0xb3, 0xc3,
+ 0xb3, 0xd2, 0xc2, 0xe2,
+ 0xe3, 0x02, 0xf1, 0xf0, 0x01, 0x13, 0x46, 0x41, 0x31, 0x20, 0x21, 0x34,
+ 0x63, 0x34, 0x47, 0x43,
+ 0x43, 0x42, 0x23, 0x47, 0x52, 0x32, 0x31, 0x31, 0x32, 0x42, 0x34, 0x33,
+ 0x22, 0x33, 0x13, 0x35,
+ 0x43, 0x33, 0x34, 0x44, 0x32, 0x43, 0x32, 0x41, 0x23, 0x33, 0x24, 0x23,
+ 0x12, 0x22, 0x01, 0x00,
+ 0xe1, 0xb0, 0xcf, 0xc0, 0xe4, 0xf2, 0xee, 0xfc, 0x0d, 0xf0, 0xe3, 0xd2,
+ 0xa4, 0xd7, 0xe7, 0xd2,
+ 0xd2, 0xe3, 0x05, 0x02, 0xd2, 0xf2, 0x12, 0x62, 0x20, 0x32, 0x43, 0x1f,
+ 0x0c, 0xfc, 0xfd, 0xed,
+ 0x8b, 0xbb, 0xde, 0xac, 0xee, 0xde, 0xce, 0xee, 0xce, 0xed, 0xdd, 0xfe,
+ 0xee, 0x0f, 0x00, 0x00,
+ 0x20, 0x50, 0x34, 0x50, 0x30, 0x4d, 0x38, 0x3d, 0x3d, 0x30, 0x30, 0x2d,
+ 0x3c, 0x3e, 0x2f, 0x1d,
+ 0x1f, 0x10, 0x0e, 0x0e, 0xff, 0xf0, 0x03, 0x17, 0x54, 0x12, 0x53, 0x77,
+ 0x24, 0x21, 0x22, 0x34,
+ 0x43, 0x32, 0x21, 0x32, 0x33, 0x24, 0x00, 0x0f, 0xf0, 0xd0, 0xa0, 0xd0,
+ 0xd0, 0xd2, 0xb0, 0xd0,
+ 0xe3, 0xe7, 0xf5, 0x10, 0x20, 0x1d, 0x2f, 0x51, 0x36, 0x42, 0x44, 0x24,
+ 0x45, 0x23, 0x03, 0x04,
+ 0xd0, 0x67, 0xa0, 0xce, 0x37, 0xd0, 0xdf, 0x00, 0xe0, 0xf0, 0x9c, 0x01,
+ 0x24, 0xed, 0xee, 0x00,
+ 0x12, 0xfe, 0xdc, 0x00, 0x20, 0xef, 0xdd, 0xde, 0xdd, 0xab, 0xdd, 0xed,
+ 0xed, 0xec, 0xcc, 0xfe,
+ 0xec, 0xee, 0x0e, 0x3d, 0x1c, 0x3e, 0x70, 0x5d, 0x09, 0x1e, 0x50, 0x20,
+ 0x0e, 0x2e, 0x0e, 0x20,
+ 0x0f, 0x0f, 0x10, 0xef, 0x13, 0xdf, 0x9d, 0x05, 0xef, 0xf0, 0xf2, 0xbc,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0xe0, 0x04, 0xf2, 0xbe, 0xf3, 0x07, 0xd0, 0xe3, 0xf5, 0xb0, 0xe2, 0xd2,
+ 0xe4, 0xf6, 0xc2, 0xa1,
+ 0xd1, 0xd4, 0xe4, 0xd2, 0xc2, 0xe4, 0xe1, 0xd3, 0xf4, 0x04, 0xf2, 0xf1,
+ 0x02, 0x52, 0x56, 0x21,
+ 0x00, 0x00, 0x12, 0x23, 0xf0, 0xd1, 0xd1, 0xd1, 0x90, 0xef, 0xdf, 0xbc,
+ 0xee, 0xed, 0xed, 0xfe,
+ 0xd8, 0xfe, 0x10, 0x2f, 0x2e, 0x3e, 0x7f, 0x4e, 0x3c, 0x5f, 0x3f, 0x1c,
+ 0x3f, 0x2d, 0x1a, 0x3e,
+ 0x3c, 0x3e, 0x4e, 0x3f, 0x4f, 0x2d, 0x2d, 0x3c, 0x1c, 0x1d, 0x0c, 0x0c,
+ 0x0e, 0xec, 0xdd, 0xdd,
+ 0xad, 0xee, 0x0f, 0x00, 0xde, 0x00, 0x63, 0x00, 0x00, 0x13, 0x41, 0x12,
+ 0x02, 0xe3, 0xf3, 0xe5,
+ 0xc2, 0xb3, 0xc2, 0xc0, 0xc4, 0xd3, 0xd7, 0xe5, 0xc1, 0xb0, 0xe4, 0xf6,
+ 0x02, 0x01, 0x03, 0x02,
+ 0xf3, 0xf3, 0x04, 0x03, 0x03, 0x06, 0x02, 0xf2, 0x43, 0x73, 0x32, 0x34,
+ 0x32, 0x33, 0x31, 0x12,
+ 0x53, 0x33, 0x21, 0x1f, 0x1d, 0x5f, 0x30, 0x4d, 0x3a, 0x2d, 0x4f, 0x2d,
+ 0x08, 0x3e, 0x7d, 0x3d,
+ 0x2d, 0x3d, 0x2c, 0x1d, 0x1d, 0x50, 0x3e, 0x2a, 0x4f, 0x4f, 0x3e, 0x5f,
+ 0x3e, 0x2d, 0x4e, 0x3f,
+ 0x4f, 0x3d, 0x3b, 0x4d, 0x3f, 0x3c, 0x4f, 0x31, 0x30, 0x2f, 0x52, 0x26,
+ 0x11, 0x11, 0x10, 0x00,
+ 0x03, 0x01, 0xcb, 0xee, 0x13, 0x16, 0xe0, 0xbe, 0xef, 0xbe, 0xe0, 0xf1,
+ 0x02, 0xff, 0xe0, 0xf6,
+ 0xf3, 0xd4, 0xa1, 0xd1, 0xd3, 0xb5, 0xc1, 0xa0, 0xe4, 0xf6, 0xd2, 0xc2,
+ 0xd2, 0xe3, 0xd3, 0xe4,
+ 0xe5, 0xc1, 0xe0, 0xe0, 0xf3, 0xe1, 0xe0, 0xcf, 0xce, 0xcf, 0xde, 0xdf,
+ 0xde, 0xce, 0xd0, 0xc2,
+ 0xdc, 0xbc, 0xee, 0xd0, 0xd1, 0xd2, 0xbc, 0xeb, 0xdf, 0xcd, 0xec, 0x0b,
+ 0xf0, 0xc8, 0x33, 0x77,
+ 0xc9, 0xf0, 0x72, 0x00, 0xfd, 0x01, 0x22, 0xec, 0xee, 0x33, 0x21, 0xde,
+ 0xed, 0x00, 0x10, 0x00,
+ 0x0f, 0x2f, 0x0d, 0x3e, 0x4f, 0x2d, 0x2c, 0x2c, 0x60, 0x30, 0x1d, 0x1d,
+ 0x50, 0x0e, 0x0c, 0x56,
+ 0x00, 0x0d, 0x00, 0x11, 0x11, 0x0d, 0xee, 0x23, 0x12, 0xea, 0xf0, 0x00,
+ 0x01, 0x00, 0xcd, 0x00,
+ 0xef, 0x01, 0xab, 0xcc, 0x01, 0x01, 0xcd, 0xdd, 0xd1, 0xd4, 0x9e, 0xe0,
+ 0xf4, 0xe2, 0xe2, 0xe0,
+ 0xcf, 0x04, 0x06, 0xe0, 0x00, 0x01, 0x23, 0x55, 0xff, 0xfe, 0x02, 0x56,
+ 0x00, 0xee, 0x01, 0x22,
+ 0xde, 0x00, 0x13, 0xe0, 0xb0, 0xf1, 0x07, 0xe2, 0x9f, 0x02, 0x04, 0xe0,
+ 0xe1, 0xf2, 0x34, 0x55,
+ 0x00, 0xed, 0x31, 0x77, 0x30, 0xfe, 0x20, 0x74, 0x21, 0x0e, 0x10, 0x32,
+ 0x21, 0x0d, 0x1f, 0x43,
+ 0x11, 0x1f, 0x0d, 0x30, 0x55, 0x1f, 0x1f, 0x42, 0x21, 0x20, 0x3e, 0x20,
+ 0x33, 0x42, 0x36, 0x31,
+ 0x0c, 0x0e, 0x46, 0x32, 0x00, 0xbd, 0xe0, 0x03, 0xf2, 0xbe, 0xf0, 0x04,
+ 0xd0, 0xe1, 0xd2, 0xc0,
+ 0xcd, 0xf5, 0x07, 0xc0, 0xd0, 0xf1, 0xe1, 0xbf, 0xdd, 0x02, 0x05, 0xf0,
+ 0xde, 0xef, 0xdd, 0x00,
+ 0x00, 0xfe, 0xca, 0xfe, 0xf0, 0xde, 0x8b, 0xde, 0x00, 0x02, 0xef, 0xcb,
+ 0x00, 0x03, 0xf0, 0xab,
+ 0x00, 0x34, 0x21, 0xfe, 0x0e, 0x40, 0x52, 0x10, 0x1c, 0x20, 0x3f, 0x1e,
+ 0x10, 0x41, 0x0e, 0xe9,
+ 0xf0, 0x0e, 0xac, 0x0f, 0x53, 0x10, 0x0b, 0x1e, 0x40, 0x31, 0x30, 0x20,
+ 0x2f, 0x30, 0x41, 0x20,
+ 0x2f, 0x31, 0x77, 0x25, 0x1f, 0x10, 0x20, 0x53, 0x22, 0x0f, 0x0e, 0x23,
+ 0x37, 0x00, 0xd0, 0xe0,
+ 0x14, 0x13, 0xd2, 0xb0, 0xd1, 0xf3, 0x04, 0xf2, 0xc1, 0xe2, 0xd1, 0xf4,
+ 0xa0, 0xf2, 0x06, 0x03,
+ 0xc0, 0xe0, 0x02, 0xf2, 0x80, 0xe0, 0x07, 0x01, 0xf0, 0x01, 0x15, 0x01,
+ 0xd0, 0xf0, 0x42, 0x33,
+ 0xe0, 0x0f, 0xec, 0x41, 0x51, 0x22, 0x1e, 0x20, 0x0c, 0x1f, 0x20, 0xff,
+ 0xb9, 0x9a, 0x00, 0xe0,
+ 0x47, 0x89, 0xf0, 0x54, 0xbc, 0x00, 0x11, 0x00, 0x11, 0xed, 0x00, 0x33,
+ 0x21, 0xed, 0xdd, 0x21,
+ 0x43, 0x0f, 0x0e, 0x0f, 0x11, 0x33, 0x0e, 0x00, 0xfe, 0x21, 0x34, 0x00,
+ 0xfe, 0x00, 0xff, 0x43,
+ 0x13, 0x0c, 0x32, 0xfd, 0x77, 0x31, 0xdd, 0x32, 0x45, 0x11, 0xde, 0xd0,
+ 0x43, 0xf0, 0xbe, 0xf0,
+ 0x17, 0x01, 0xbe, 0xe0, 0x14, 0x12, 0xf0, 0xc0, 0xd0, 0x02, 0x15, 0xe0,
+ 0xd0, 0xf1, 0x12, 0x00,
+ 0x11, 0x75, 0x10, 0x10, 0x31, 0x31, 0x32, 0x10, 0xdb, 0x42, 0x33, 0xac,
+ 0xcc, 0x00, 0x13, 0xef,
+ 0xcb, 0xf0, 0x02, 0x00, 0xf0, 0xde, 0xef, 0x21, 0x0f, 0xfa, 0x2f, 0x70,
+ 0x40, 0x2e, 0x30, 0x31,
+ 0x31, 0xe9, 0x00, 0x4f, 0x0f, 0xcd, 0xed, 0x0e, 0xea, 0xdd, 0x50, 0x0f,
+ 0xb8, 0x10, 0x30, 0x0e,
+ 0xfe, 0x40, 0x40, 0x0e, 0xfd, 0xfd, 0x1f, 0x30, 0xfd, 0xcc, 0xee, 0x51,
+ 0x43, 0x0e, 0xfc, 0xbc,
+ 0x00, 0x06, 0xd0, 0xae, 0xde, 0xbc, 0xf0, 0xf2, 0xef, 0xcd, 0xff, 0xf1,
+ 0xee, 0xef, 0xf4, 0xf0,
+ 0xe0, 0xf1, 0xf6, 0xc0, 0xd1, 0xd3, 0x8f, 0xe0, 0xf5, 0xf4, 0xe0, 0xd0,
+ 0xf1, 0x04, 0x04, 0xf0,
+ 0xe0, 0x02, 0xf1, 0xe1, 0x04, 0x01, 0xc0, 0xf0, 0x02, 0x14, 0x23, 0x0f,
+ 0xad, 0xf1, 0x37, 0x34,
+ 0xae, 0xdd, 0x00, 0x01, 0x0f, 0x0f, 0x2f, 0xf9, 0x0e, 0x2f, 0x3e, 0x5f,
+ 0x4e, 0x4f, 0x2d, 0x29,
+ 0x7f, 0x40, 0x2e, 0x1d, 0x3f, 0x50, 0x20, 0x2f, 0x2e, 0x30, 0x3f, 0x3b,
+ 0x50, 0x32, 0x0c, 0x1b,
+ 0x20, 0x0e, 0x41, 0x42, 0x0d, 0x0d, 0x20, 0x1e, 0x0c, 0x0f, 0x45, 0x0f,
+ 0xa9, 0x11, 0x00, 0x00,
+ 0x02, 0xe0, 0xf2, 0xc0, 0xdf, 0x05, 0x02, 0x77, 0x77, 0xac, 0xcb, 0x45,
+ 0x10, 0xdf, 0x00, 0x33,
+ 0xf0, 0x9b, 0x11, 0x23, 0x00, 0xee, 0xf0, 0x11, 0x12, 0xf0, 0x0f, 0x00,
+ 0x01, 0xf0, 0xe0, 0xf0,
+ 0x12, 0x01, 0xe0, 0x01, 0x02, 0x00, 0xe1, 0xbe, 0x01, 0x27, 0xff, 0xd0,
+ 0x10, 0xdf, 0xff, 0x20,
+ 0x10, 0x1f, 0xfc, 0x20, 0x73, 0x2f, 0xf9, 0x00, 0x3f, 0x50, 0x10, 0x1e,
+ 0x0e, 0x0d, 0x10, 0x0c,
+ 0x2f, 0x2e, 0xfc, 0x2e, 0x3d, 0xea, 0x70, 0x50, 0x0f, 0xfc, 0x0e, 0x20,
+ 0x30, 0x0b, 0x40, 0x60,
+ 0x00, 0x31, 0x21, 0x0d, 0x00, 0x22, 0x12, 0x24, 0xde, 0xcd, 0xef, 0xbc,
+ 0xf0, 0xef, 0x00, 0x04,
+ 0xcb, 0xbb, 0x21, 0x32, 0x0f, 0xfe, 0xed, 0xff, 0x01, 0x02, 0xe0, 0x8b,
+ 0xf0, 0x03, 0x03, 0x04,
+ 0xde, 0xee, 0x35, 0x01, 0x13, 0x12, 0x9c, 0x01, 0x37, 0x01, 0x00, 0xf1,
+ 0x01, 0x21, 0x00, 0x75,
+ 0x12, 0xff, 0x0f, 0x00, 0x01, 0x02, 0xe0, 0xad, 0xdc, 0xf0, 0x27, 0x32,
+ 0xd0, 0xbf, 0xf0, 0x01,
+ 0xf0, 0x00, 0x32, 0x00, 0xba, 0xff, 0x61, 0x33, 0x10, 0x0e, 0x2e, 0x41,
+ 0x45, 0x32, 0x1f, 0x0c,
+ 0x21, 0x56, 0x00, 0x00, 0x32, 0x11, 0x00, 0xef, 0x20, 0x77, 0x31, 0x11,
+ 0x10, 0x11, 0x75, 0x11,
+ 0xfd, 0x0f, 0x32, 0x12, 0x10, 0x00, 0x10, 0x12, 0xdc, 0xef, 0x24, 0xf0,
+ 0xbe, 0xef, 0xe1, 0xf1,
+ 0xf2, 0xe1, 0xf2, 0xd0, 0xd0, 0xc0, 0xf3, 0x27, 0x47, 0xf0, 0xc0, 0x00,
+ 0x21, 0x12, 0xae, 0xff,
+ 0x00, 0xf1, 0xe2, 0xcf, 0x88, 0xf0, 0xf1, 0xdf, 0xe0, 0xf0, 0xd0, 0xbf,
+ 0xe0, 0xdd, 0xe0, 0xf2,
+ 0xe0, 0xee, 0xb8, 0x01, 0x11, 0xef, 0xfe, 0x44, 0x0f, 0xef, 0xde, 0x00,
+ 0x20, 0x10, 0x77, 0x88,
+ 0x10, 0x45, 0xcb, 0x00, 0x00, 0x32, 0x31, 0x9b, 0x0f, 0x33, 0x01, 0xfd,
+ 0xfe, 0x12, 0x21, 0xec,
+ 0x00, 0x32, 0x41, 0x10, 0x0f, 0x00, 0x20, 0x30, 0x2f, 0x31, 0x0f, 0x1c,
+ 0x3f, 0x40, 0x43, 0x0e,
+ 0x0e, 0x76, 0x0e, 0xeb, 0x32, 0x21, 0x0f, 0xfe, 0x44, 0x43, 0xca, 0xcd,
+ 0x22, 0x45, 0x00, 0xde,
+ 0xff, 0x22, 0x01, 0xf0, 0xf0, 0x21, 0x22, 0xf0, 0xe0, 0x01, 0x03, 0xf0,
+ 0xd0, 0x03, 0x04, 0x8f,
+ 0xf1, 0x27, 0xce, 0xce, 0x35, 0x11, 0xde, 0xe0, 0xdf, 0xde, 0xac, 0x12,
+ 0x46, 0xce, 0xdd, 0x01,
+ 0x03, 0xf0, 0xe0, 0xce, 0xef, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xba, 0x0f,
+ 0x00, 0x32, 0x12, 0xdc,
+ 0xfd, 0xfe, 0xbd, 0x00, 0xf0, 0xb8, 0xfe, 0x11, 0x10, 0xfe, 0xee, 0x31,
+ 0x00, 0xdd, 0x32, 0x30,
+ 0x43, 0xbc, 0xfe, 0x32, 0xfd, 0x10, 0x75, 0x21, 0x10, 0x33, 0x04, 0x00,
+ 0x59, 0x00, 0x63, 0x00,
+ 0x23, 0x0b, 0xc0, 0xf9, 0xe4, 0x08, 0xc2, 0xf7, 0x2c, 0x53, 0x34, 0xb8,
+ 0xfd, 0x54, 0x22, 0xde,
+ 0xcc, 0xd0, 0x03, 0x37, 0xc0, 0xb0, 0xe0, 0xf3, 0xc0, 0xc0, 0xf3, 0xf2,
+ 0xe0, 0xe1, 0xe2, 0xf4,
+ 0xe0, 0xe0, 0xe0, 0xd2, 0x04, 0x00, 0xbe, 0xde, 0x06, 0x02, 0x8c, 0xcc,
+ 0xe1, 0x05, 0xe0, 0xbe,
+ 0xf0, 0xf0, 0xde, 0xf0, 0x15, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x0f,
+ 0x0e, 0x62, 0x34, 0x88,
+ 0x0c, 0x45, 0xff, 0xee, 0x00, 0x20, 0x00, 0xcc, 0x00, 0x22, 0x0f, 0xcb,
+ 0x00, 0x21, 0x0f, 0x0e,
+ 0x20, 0x41, 0x10, 0x3f, 0x40, 0x20, 0x0c, 0x1e, 0x40, 0x40, 0x30, 0x1e,
+ 0x3f, 0x65, 0x10, 0x0e,
+ 0x31, 0x22, 0x0b, 0x22, 0x55, 0xec, 0xef, 0x00, 0x00, 0xef, 0xbc, 0x11,
+ 0x02, 0xef, 0x00, 0x14,
+ 0xf0, 0xb0, 0x05, 0xf2, 0xbe, 0xd0, 0x05, 0xe1, 0xc0, 0xd0, 0xb0, 0xe1,
+ 0x05, 0xf2, 0xe0, 0x03,
+ 0xf0, 0xe0, 0xf0, 0xef, 0x46, 0x42, 0x0f, 0xed, 0x00, 0x21, 0x10, 0x01,
+ 0xfe, 0xbd, 0xdf, 0xd0,
+ 0xbe, 0xcb, 0xee, 0xdf, 0xef, 0xdc, 0xe0, 0xf0, 0x0f, 0x0e, 0xfb, 0x73,
+ 0x36, 0x0e, 0x0e, 0x51,
+ 0x20, 0x0e, 0x0e, 0x00, 0x45, 0x0f, 0xea, 0xff, 0x50, 0x10, 0xfd, 0x10,
+ 0x30, 0x50, 0x1e, 0x09,
+ 0x0f, 0x4f, 0x40, 0x52, 0x10, 0x2d, 0x3f, 0x41, 0x43, 0x41, 0x30, 0x30,
+ 0x10, 0x20, 0x63, 0x10,
+ 0x19, 0x20, 0x20, 0x11, 0x14, 0x56, 0x21, 0x11, 0x13, 0x00, 0x00, 0x01,
+ 0x04, 0x15, 0xf0, 0xd0,
+ 0x04, 0x36, 0x32, 0x01, 0x02, 0x12, 0x01, 0x33, 0x64, 0x13, 0xdf, 0xcf,
+ 0x35, 0xe0, 0x8d, 0xde,
+ 0x15, 0x67, 0x01, 0xde, 0xac, 0x00, 0x02, 0x00, 0xf1, 0xf1, 0xef, 0xef,
+ 0x00, 0x02, 0xf0, 0xdf,
+ 0xe0, 0x03, 0xe1, 0xd0, 0xc0, 0xd0, 0xe0, 0xd0, 0x03, 0x05, 0x13, 0xf0,
+ 0xaa, 0xed, 0xff, 0xde,
+ 0xdf, 0xbc, 0xed, 0xfa, 0xed, 0xd0, 0xc0, 0x0e, 0x2d, 0xfc, 0x1f, 0x4f,
+ 0x60, 0x20, 0x2f, 0x1b,
+ 0x2d, 0x7f, 0x2e, 0x0c, 0x0c, 0x1e, 0x40, 0x1e, 0x0b, 0x0e, 0xfe, 0x0e,
+ 0xda, 0xce, 0xbe, 0xcd,
+ 0xfe, 0xef, 0xcc, 0xdf, 0xd0, 0xbb, 0xcd, 0xff, 0xe0, 0xce, 0xee, 0xde,
+ 0xdd, 0xc1, 0xdf, 0xd1,
+ 0xd5, 0xf7, 0x90, 0x98, 0x13, 0x02, 0xcb, 0x01, 0x01, 0x01, 0x02, 0xab,
+ 0x00, 0x25, 0x00, 0xde,
+ 0xdf, 0x12, 0x11, 0xcf, 0xf0, 0x01, 0xe0, 0xf0, 0xf1, 0xe0, 0xd0, 0xf1,
+ 0xe1, 0xb0, 0x05, 0xf0,
+ 0xce, 0xf1, 0x03, 0x03, 0xdc, 0xcc, 0x11, 0x36, 0x20, 0xad, 0x0f, 0x43,
+ 0x11, 0x0f, 0x0f, 0x10,
+ 0x10, 0x21, 0x20, 0x0e, 0x0f, 0x24, 0x0f, 0x88, 0x00, 0x31, 0x0f, 0x20,
+ 0x32, 0x2f, 0x1c, 0x40,
+ 0x42, 0x32, 0x2e, 0x0b, 0x62, 0x34, 0x0e, 0x00, 0x20, 0x0e, 0xfe, 0x00,
+ 0x24, 0x21, 0x00, 0x10,
+ 0x00, 0xff, 0x12, 0x26, 0x02, 0xcf, 0x00, 0x14, 0xe0, 0xb1, 0x14, 0x32,
+ 0xef, 0xad, 0x14, 0x24,
+ 0xce, 0x45, 0xff, 0x8a, 0x11, 0x12, 0x00, 0x00, 0x01, 0xf1, 0xac, 0xef,
+ 0x03, 0x02, 0xec, 0xce,
+ 0xf1, 0xe0, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0x01, 0xf0, 0xce, 0xce, 0xeb,
+ 0x06, 0x02, 0xcf, 0xd0,
+ 0x01, 0x0f, 0xdd, 0x01, 0x04, 0xdf, 0x99, 0x00, 0x10, 0x21, 0x00, 0xed,
+ 0x0f, 0x21, 0x00, 0xef,
+ 0xdd, 0x0d, 0x63, 0x30, 0x42, 0x57, 0x32, 0x41, 0x23, 0x26, 0x43, 0x21,
+ 0x32, 0x55, 0x21, 0x30,
+ 0x41, 0x10, 0x12, 0x10, 0x30, 0x62, 0x10, 0x1f, 0x20, 0x19, 0x2e, 0x1e,
+ 0x0f, 0x42, 0x1f, 0x2c,
+ 0x0f, 0xef, 0x32, 0x77, 0x21, 0xe9, 0x41, 0x64, 0xf0, 0xff, 0x1f, 0x31,
+ 0x21, 0x20, 0x41, 0x20,
+ 0x20, 0xfd, 0x30, 0x76, 0x0e, 0x0d, 0x22, 0x12, 0x0d, 0x00, 0x00, 0x1f,
+ 0x0f, 0xe0, 0x02, 0x00,
+ 0x31, 0x00, 0xc8, 0xe0, 0x11, 0x00, 0x11, 0xff, 0x30, 0x72, 0x0b, 0x77,
+ 0x32, 0xdb, 0x10, 0x53,
+ 0x11, 0x0f, 0x1e, 0x10, 0x21, 0x00, 0x00, 0x00, 0x0e, 0xef, 0x00, 0x65,
+ 0x21, 0x20, 0x3e, 0x41,
+ 0x35, 0x11, 0x32, 0x62, 0x31, 0x21, 0x34, 0x41, 0x20, 0x30, 0x20, 0x20,
+ 0x42, 0x65, 0x00, 0x1e,
+ 0x0b, 0x2e, 0x41, 0x21, 0x2f, 0x2d, 0x0c, 0x10, 0x12, 0x0e, 0x3f, 0x67,
+ 0x21, 0x0e, 0x00, 0x46,
+ 0x23, 0x10, 0x30, 0x50, 0x2f, 0x30, 0x55, 0x31, 0x1f, 0x0f, 0x31, 0x56,
+ 0x21, 0x10, 0x10, 0x20,
+ 0x20, 0x0f, 0x00, 0x00, 0xf0, 0xbb, 0xff, 0x21, 0x22, 0x00, 0xdb, 0xef,
+ 0x02, 0xf2, 0x8b, 0xdd,
+ 0x23, 0x40, 0xe8, 0xff, 0x32, 0x00, 0xcc, 0x11, 0xee, 0x0e, 0x30, 0x3e,
+ 0x60, 0x0b, 0x0f, 0xed,
+ 0xdd, 0xff, 0xcb, 0x00, 0x51, 0x77, 0x10, 0xc9, 0x00, 0x31, 0x10, 0x0f,
+ 0x20, 0x20, 0x0f, 0x0e,
+ 0x30, 0x41, 0x10, 0x10, 0x30, 0x31, 0x00, 0x0e, 0xde, 0x10, 0x60, 0x1c,
+ 0x20, 0x1f, 0xeb, 0xed,
+ 0x00, 0x21, 0x21, 0x51, 0x43, 0x00, 0xdc, 0xe0, 0xc3, 0xe5, 0xe1, 0xbf,
+ 0xce, 0xe0, 0xf3, 0xe4,
+ 0xe1, 0xd0, 0xf6, 0x05, 0xe1, 0xc0, 0x00, 0x01, 0x01, 0x13, 0xf1, 0x8f,
+ 0xac, 0xff, 0xf0, 0xee,
+ 0xcb, 0xef, 0xdf, 0xe1, 0xd2, 0xbf, 0xdc, 0xc0, 0xd0, 0xcb, 0xe0, 0x05,
+ 0xd0, 0xd0, 0x16, 0x88,
+ 0x00, 0x56, 0xde, 0x00, 0x10, 0x10, 0x11, 0xac, 0x00, 0x33, 0x00, 0xef,
+ 0xdc, 0xf0, 0x33, 0xe0,
+ 0xbb, 0x00, 0x11, 0x00, 0xdf, 0xf0, 0xf0, 0xf0, 0x00, 0x20, 0x41, 0x11,
+ 0x00, 0x22, 0x10, 0x53,
+ 0x23, 0xd8, 0x41, 0x53, 0xfe, 0xfe, 0x10, 0x34, 0x0f, 0xef, 0x12, 0x01,
+ 0x00, 0xd0, 0xff, 0x26,
+ 0xf1, 0x80, 0xe0, 0xe0, 0xe0, 0xf0, 0x25, 0x02, 0xce, 0xe0, 0xc0, 0xe3,
+ 0x05, 0xf0, 0xd0, 0xd0,
+ 0x80, 0x04, 0xe0, 0xdd, 0xf3, 0xd1, 0x8a, 0x00, 0x03, 0x00, 0xf1, 0x04,
+ 0xf0, 0xef, 0xe0, 0x01,
+ 0x15, 0xf0, 0xdd, 0xdd, 0xf1, 0x06, 0xd0, 0xcf, 0x22, 0xf0, 0xcf, 0xff,
+ 0x0d, 0x30, 0x20, 0x1e,
+ 0xfc, 0xcb, 0xde, 0xbd, 0xee, 0xbc, 0xdc, 0x00, 0xcc, 0xcd, 0x00, 0x00,
+ 0xcd, 0xca, 0xf0, 0x01,
+ 0x11, 0xfe, 0xdb, 0xdf, 0xf0, 0x43, 0x34, 0xff, 0x9d, 0x0e, 0x21, 0x20,
+ 0x20, 0x1d, 0x2c, 0x50,
+ 0x2e, 0x1b, 0x3f, 0x30, 0x30, 0x1c, 0xfc, 0xfd, 0xbd, 0xdf, 0xdf, 0xcb,
+ 0xee, 0x9c, 0xff, 0x13,
+ 0xf0, 0x98, 0xf0, 0x02, 0x00, 0xef, 0xe0, 0xf1, 0xe0, 0xd0, 0xd0, 0xe2,
+ 0xad, 0xd0, 0xe4, 0xe1,
+ 0x07, 0xd0, 0xc0, 0xd0, 0xe0, 0xe1, 0xb0, 0xb0, 0xee, 0xf3, 0xf3, 0xcf,
+ 0xd0, 0xcd, 0xe1, 0xd7,
+ 0xd4, 0xc0, 0xd0, 0xd1, 0xc0, 0xe3, 0xe4, 0xd1, 0xf0, 0xe2, 0xe1, 0xbf,
+ 0x07, 0xf3, 0xe1, 0x17,
+ 0x00, 0x01, 0xc0, 0xd0, 0xe2, 0xb0, 0xd0, 0x01, 0x77, 0x15, 0xbb, 0x00,
+ 0x22, 0x11, 0x20, 0x00,
+ 0x11, 0x00, 0x00, 0x63, 0x34, 0x10, 0x1e, 0x30, 0x67, 0x21, 0x10, 0x20,
+ 0x2f, 0x30, 0x40, 0x10,
+ 0x2f, 0x20, 0x20, 0x1e, 0x0e, 0x22, 0x22, 0x0d, 0x56, 0x0f, 0xdc, 0x22,
+ 0x13, 0x34, 0x21, 0xcd,
+ 0xfe, 0x42, 0x10, 0x2f, 0x73, 0x10, 0x1d, 0x1e, 0x41, 0x57, 0x11, 0x0e,
+ 0x12, 0x11, 0x0d, 0x02,
+ 0x01, 0xdb, 0x00, 0x02, 0xdd, 0x23, 0x54, 0x0c, 0x00, 0x13, 0x00, 0x36,
+ 0x23, 0xbc, 0x0f, 0x33,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0xe0, 0xdf, 0x12, 0x12, 0xf0, 0x37, 0xd0,
+ 0xae, 0x01, 0x01, 0xf0,
+ 0x10, 0x00, 0x61, 0x2f, 0x2c, 0x41, 0x1e, 0x53, 0x1e, 0x2e, 0x77, 0x27,
+ 0x0e, 0x10, 0x10, 0x31,
+ 0x20, 0x1f, 0x40, 0x20, 0x1e, 0x3d, 0x5f, 0x2e, 0x1c, 0x2c, 0x50, 0x10,
+ 0x1a, 0x30, 0x40, 0x20,
+ 0x31, 0x0e, 0x2d, 0x33, 0x10, 0x1f, 0x0e, 0xeb, 0x0f, 0x20, 0x40, 0x00,
+ 0x00, 0x41, 0x11, 0x31,
+ 0x64, 0x31, 0x20, 0x56, 0x20, 0x1e, 0x1e, 0x52, 0x34, 0x1d, 0x1d, 0x20,
+ 0x1c, 0x2e, 0x64, 0x10,
+ 0x0a, 0xfe, 0xf0, 0xf1, 0xd0, 0xe0, 0xcc, 0xcb, 0xf0, 0x01, 0xf0, 0xfd,
+ 0x51, 0x31, 0x0c, 0x30,
+ 0x40, 0x3d, 0x09, 0x2f, 0x4f, 0x21, 0xdd, 0x88, 0xf0, 0x02, 0xbb, 0xff,
+ 0x00, 0x11, 0xee, 0xcb,
+ 0x11, 0x22, 0x0f, 0xdd, 0x0f, 0x32, 0x00, 0xcc, 0x01, 0x22, 0x00, 0x02,
+ 0xde, 0xde, 0x76, 0x11,
+ 0x0f, 0x11, 0xf0, 0xab, 0x01, 0x14, 0xf0, 0xce, 0x00, 0x13, 0xde, 0xde,
+ 0x27, 0x01, 0xe0, 0xd0,
+ 0xf2, 0x03, 0xa0, 0xe0, 0xf2, 0xe1, 0xe4, 0xc0, 0xbe, 0xf0, 0x05, 0xe0,
+ 0xe1, 0x14, 0xcd, 0xce,
+ 0x36, 0xf0, 0x9e, 0xff, 0x00, 0xf0, 0xdd, 0x0f, 0x0e, 0xee, 0xf0, 0xce,
+ 0xee, 0xcd, 0xdd, 0xcf,
+ 0xdd, 0xe0, 0xe5, 0xdf, 0xcb, 0xf2, 0xd1, 0xce, 0x02, 0x35, 0xff, 0xeb,
+ 0x10, 0x0d, 0x10, 0x64,
+ 0x00, 0xdc, 0xee, 0x42, 0xff, 0xca, 0xef, 0xef, 0xef, 0x01, 0x33, 0xce,
+ 0x8a, 0xf0, 0xf0, 0xf1,
+ 0xef, 0xf0, 0x14, 0x01, 0xf0, 0x21, 0x41, 0x53, 0x31, 0x0e, 0x41, 0x47,
+ 0x00, 0xfe, 0xff, 0x00,
+ 0x32, 0x24, 0x13, 0x00, 0xdf, 0xf0, 0x16, 0x74, 0x00, 0xee, 0xf0, 0x35,
+ 0x10, 0x00, 0x00, 0x35,
+ 0x74, 0x01, 0x00, 0xe0, 0x00, 0x74, 0x10, 0x22, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x3f, 0x51,
+ 0x47, 0x10, 0x31, 0x54, 0x20, 0x23, 0x23, 0x20, 0x32, 0x22, 0x35, 0x01,
+ 0x00, 0xc2, 0xc1, 0xf1,
+ 0x0f, 0x33, 0x23, 0x30, 0x2f, 0xf8, 0x0e, 0x73, 0x73, 0x19, 0x0c, 0x1e,
+ 0x2f, 0x3f, 0x1d, 0x72,
+ 0x0f, 0x08, 0x20, 0x51, 0x0f, 0x0e, 0x53, 0x22, 0xfb, 0x0f, 0x11, 0x21,
+ 0x31, 0x0d, 0x0b, 0x62,
+ 0x22, 0x2f, 0x30, 0x41, 0x32, 0x0b, 0x1e, 0x74, 0x11, 0x0d, 0x2f, 0x20,
+ 0x10, 0x1f, 0x10, 0x0c,
+ 0xef, 0x00, 0xe0, 0xf4, 0xd0, 0xce, 0x05, 0x02, 0x9d, 0xff, 0x01, 0x17,
+ 0x02, 0xee, 0x00, 0x20,
+ 0xed, 0x01, 0x22, 0xcc, 0xd0, 0xc0, 0xce, 0x05, 0x02, 0xd0, 0xd0, 0xc0,
+ 0xf1, 0x17, 0xe0, 0x9e,
+ 0x01, 0x13, 0xf0, 0xcd, 0xcc, 0xe0, 0x06, 0xd0, 0x9c, 0xf0, 0xf1, 0xf0,
+ 0xe0, 0xcd, 0xef, 0xf2,
+ 0xcf, 0xed, 0xe0, 0xdf, 0xcd, 0xf5, 0xe0, 0xd0, 0xde, 0xbb, 0xe0, 0xed,
+ 0xfe, 0x00, 0xe9, 0xde,
+ 0x10, 0x00, 0xec, 0xf0, 0x00, 0xde, 0xfe, 0xab, 0x00, 0xf0, 0xbc, 0x34,
+ 0x10, 0xa8, 0x00, 0x41,
+ 0x00, 0xfe, 0x21, 0x42, 0x0d, 0x0e, 0x61, 0x00, 0x1e, 0x10, 0x0e, 0x0c,
+ 0x00, 0x12, 0xee, 0xdc,
+ 0xe1, 0xc0, 0xcc, 0xe0, 0xe0, 0xe0, 0x03, 0x03, 0xbb, 0xef, 0x13, 0x13,
+ 0x02, 0x01, 0xf2, 0xe4,
+ 0xd2, 0x07, 0xd3, 0x80, 0xd0, 0xd0, 0xc0, 0xe3, 0xe3, 0xbf, 0xc9, 0xcf,
+ 0xe1, 0xf4, 0xc0, 0xd0,
+ 0xc2, 0xe3, 0xe2, 0xd3, 0xf3, 0xe2, 0xf5, 0xe1, 0xd0, 0xf1, 0xf0, 0xf0,
+ 0x27, 0x44, 0x00, 0xe0,
+ 0xd0, 0x00, 0x23, 0xe0, 0x9d, 0xef, 0x01, 0xe1, 0xcd, 0xdb, 0x0f, 0xff,
+ 0xed, 0xee, 0xdd, 0x00,
+ 0x10, 0xca, 0xd0, 0x05, 0x31, 0x40, 0x2c, 0x70, 0x41, 0x12, 0x23, 0x46,
+ 0x52, 0x22, 0x10, 0x0e,
+ 0x0e, 0x1e, 0x0f, 0x0a, 0x0e, 0x40, 0x20, 0x00, 0x00, 0x23, 0x43, 0x53,
+ 0x34, 0x27, 0x21, 0x31,
+ 0x41, 0x21, 0x21, 0x23, 0x45, 0x00, 0x00, 0x31, 0x74, 0x42, 0xfd, 0xee,
+ 0xd0, 0xe3, 0x07, 0xb0,
+ 0xbd, 0xee, 0x01, 0x03, 0x11, 0x30, 0x52, 0x27, 0x01, 0x00, 0xf1, 0xf3,
+ 0xf2, 0xde, 0xff, 0xf0,
+ 0xab, 0xeb, 0xee, 0x0f, 0x0f, 0x0d, 0x20, 0x72, 0x10, 0x1c, 0x0e, 0x0f,
+ 0x21, 0x32, 0x1e, 0x0a,
+ 0x0d, 0x10, 0x10, 0xe9, 0xcd, 0x4d, 0x71, 0x32, 0x00, 0x0f, 0x00, 0x00,
+ 0x11, 0x12, 0xf1, 0xf2,
+ 0xef, 0x00, 0x55, 0x25, 0x22, 0x43, 0x72, 0x33, 0x43, 0x34, 0x24, 0x36,
+ 0x42, 0x20, 0x30, 0x50,
+ 0x24, 0x22, 0x10, 0x1e, 0x0c, 0xff, 0x00, 0x02, 0xd0, 0xbc, 0xdd, 0xec,
+ 0x1e, 0x50, 0x1f, 0xfb,
+ 0x01, 0x03, 0x10, 0x1f, 0x50, 0x21, 0x12, 0x15, 0x00, 0xce, 0xed, 0x13,
+ 0x06, 0xe0, 0xe0, 0x21,
+ 0x72, 0x67, 0x22, 0x20, 0x10, 0x10, 0x22, 0x45, 0x11, 0x00, 0x10, 0x10,
+ 0x32, 0x12, 0xdd, 0x99,
+ 0xdd, 0xe0, 0x01, 0x0f, 0x0c, 0xff, 0x30, 0x50, 0x2d, 0x0b, 0xfe, 0x00,
+ 0x0f, 0x40, 0x00, 0xfd,
+ 0xdd, 0x9b, 0xdc, 0xdc, 0x72, 0x34, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x2a,
+ 0x61, 0x23, 0x10, 0x0f,
+ 0x00, 0x56, 0x44, 0x21, 0x0e, 0x0c, 0xfe, 0x53, 0x67, 0x00, 0xec, 0xef,
+ 0xf0, 0xef, 0xef, 0xf0,
+ 0x00, 0xdf, 0x00, 0x35, 0xe0, 0xa0, 0xdf, 0x01, 0xe0, 0xf0, 0x01, 0xe0,
+ 0xd0, 0x03, 0x57, 0x01,
+ 0xe0, 0xf1, 0x23, 0x77, 0x52, 0x11, 0x00, 0xfe, 0x00, 0x24, 0x01, 0xfe,
+ 0xef, 0x44, 0x33, 0x0e,
+ 0xfc, 0xed, 0xee, 0x41, 0x31, 0xfb, 0x1f, 0x71, 0x21, 0x10, 0x41, 0x34,
+ 0x0f, 0xe9, 0x00, 0x62,
+ 0x0f, 0xda, 0xf0, 0x20, 0x10, 0x31, 0x61, 0x00, 0x0d, 0x0f, 0x0f, 0x31,
+ 0x33, 0x1e, 0x0d, 0xfb,
+ 0x20, 0x75, 0x00, 0x00, 0x21, 0x00, 0xfd, 0xee, 0xdc, 0x10, 0x77, 0x00,
+ 0x00, 0x0f, 0x0e, 0x0f,
+ 0x31, 0x20, 0x0b, 0x40, 0x40, 0x00, 0x20, 0x00, 0x00, 0xbe, 0xbc, 0xf0,
+ 0x47, 0x13, 0xff, 0xe0,
+ 0x01, 0x01, 0xbe, 0xdc, 0xe0, 0x01, 0x24, 0x00, 0xef, 0x00, 0x02, 0x14,
+ 0x02, 0x8c, 0xca, 0xe0,
+ 0x02, 0x12, 0xfe, 0xde, 0x01, 0x03, 0x00, 0xbe, 0xcc, 0xe0, 0xe0, 0xd1,
+ 0xd0, 0xc0, 0x01, 0xd0,
+ 0xba, 0x03, 0x04, 0xed, 0xdc, 0x35, 0x21, 0xce, 0xee, 0xdd, 0x00, 0x77,
+ 0x00, 0x00, 0x11, 0xff,
+ 0xde, 0x10, 0x11, 0xec, 0x30, 0x74, 0x10, 0x13, 0x23, 0x12, 0x10, 0x00,
+ 0x0e, 0x77, 0x34, 0x00,
+ 0x0e, 0x00, 0x21, 0x10, 0x0d, 0xfd, 0xfc, 0x0e, 0x20, 0xfe, 0xa9, 0xbc,
+ 0x00, 0x44, 0xf0, 0xcb,
+ 0xff, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0xc0, 0xce, 0x00, 0x11, 0x00,
+ 0xe0, 0x25, 0x22, 0xc0,
+ 0xde, 0x13, 0x45, 0xf0, 0x00, 0x43, 0x00, 0xfe, 0x42, 0x66, 0xee, 0xba,
+ 0x00, 0x54, 0x01, 0xfe,
+ 0x0f, 0x00, 0x00, 0xf0, 0xf1, 0xe0, 0x03, 0x35, 0xe0, 0xd0, 0x00, 0xc0,
+ 0xff, 0x44, 0x21, 0x00,
+ 0x0f, 0xef, 0xf0, 0x24, 0x32, 0x22, 0x31, 0x43, 0x01, 0x25, 0xe0, 0x01,
+ 0x77, 0x30, 0xff, 0x1e,
+ 0x3e, 0x1e, 0x3e, 0x71, 0x1e, 0xc8, 0x0e, 0x50, 0x11, 0x10, 0x10, 0x20,
+ 0x30, 0xec, 0x9c, 0x01,
+ 0x12, 0xda, 0xef, 0x10, 0x20, 0x41, 0x10, 0x0e, 0xfe, 0x31, 0x52, 0x21,
+ 0x43, 0x42, 0x23, 0x20,
+ 0x08, 0xed, 0x0e, 0x31, 0x10, 0xbb, 0xf0, 0x00, 0x00, 0xbc, 0x00, 0x13,
+ 0x02, 0xdf, 0xd0, 0xd0,
+ 0xcf, 0x04, 0x67, 0x00, 0xe0, 0xff, 0xf0, 0xde, 0x01, 0xf0, 0xc0, 0xe0,
+ 0xd0, 0xe0, 0xd2, 0xe4,
+ 0x04, 0x05, 0xd2, 0x80, 0xe0, 0xf5, 0xe2, 0xb0, 0xcf, 0xf0, 0xf4, 0xe0,
+ 0xbe, 0xe0, 0xe0, 0xe2,
+ 0x07, 0x01, 0xe0, 0xef, 0xee, 0x33, 0x22, 0x8c, 0xf0, 0x16, 0xf0, 0xe0,
+ 0xf0, 0xf1, 0x01, 0xdf,
+ 0xde, 0xe0, 0xee, 0x41, 0x2f, 0xc8, 0x0e, 0x4f, 0x1f, 0x0d, 0x0d, 0xb9,
+ 0xee, 0x31, 0x42, 0x00,
+ 0x30, 0x50, 0x41, 0x20, 0x0b, 0xfe, 0x0f, 0x40, 0x41, 0xfb, 0xec, 0x40,
+ 0x64, 0x00, 0x0e, 0x00,
+ 0x10, 0x22, 0x00, 0xcd, 0xff, 0x00, 0x02, 0x04, 0x03, 0xde, 0x00, 0x00,
+ 0x4c, 0x02, 0x4e, 0x03,
+ 0x39, 0xe1, 0xe0, 0xa7, 0x9d, 0xf4, 0x66, 0xb7, 0x23, 0x77, 0x01, 0xff,
+ 0x00, 0x11, 0x32, 0x33,
+ 0xf1, 0xc0, 0xf1, 0x15, 0xf0, 0xb0, 0xf1, 0xe2, 0x03, 0x02, 0xce, 0xf0,
+ 0x35, 0x02, 0xf2, 0x02,
+ 0x02, 0x25, 0x01, 0x11, 0x76, 0x21, 0xaf, 0xf0, 0x35, 0x33, 0xf0, 0xcf,
+ 0xf0, 0x32, 0x33, 0xfe,
+ 0x00, 0x30, 0x0d, 0x00, 0x53, 0x12, 0x0f, 0x3f, 0x19, 0x4f, 0x60, 0x12,
+ 0x11, 0x1d, 0xe8, 0x0e,
+ 0x70, 0x20, 0x0d, 0x0c, 0x1f, 0x0e, 0x1e, 0x75, 0x43, 0x0d, 0xd9, 0x00,
+ 0x40, 0x00, 0x0e, 0x2f,
+ 0x20, 0x11, 0x0f, 0xfd, 0xed, 0x21, 0x0f, 0x0c, 0x52, 0x00, 0xed, 0xde,
+ 0x02, 0x46, 0xef, 0xbd,
+ 0x00, 0x11, 0x11, 0xff, 0xee, 0xcf, 0x47, 0x47, 0xd0, 0xbe, 0x11, 0x22,
+ 0x00, 0xf0, 0x02, 0xf0,
+ 0xbe, 0xf0, 0x04, 0xce, 0x02, 0x37, 0xd0, 0xdf, 0x22, 0xf0, 0xc0, 0x54,
+ 0x24, 0xd0, 0xf0, 0x01,
+ 0xce, 0xe0, 0x22, 0xae, 0xf0, 0x17, 0xf0, 0xad, 0xee, 0xf0, 0x01, 0x01,
+ 0xf0, 0x00, 0xed, 0xeb,
+ 0x31, 0x42, 0xfd, 0xd8, 0x10, 0x60, 0x00, 0xf0, 0x00, 0xfe, 0x00, 0x32,
+ 0x22, 0xee, 0xfd, 0x1f,
+ 0x1c, 0x73, 0x77, 0x00, 0x0e, 0x0f, 0x20, 0x0f, 0xfc, 0x0f, 0x10, 0x33,
+ 0x00, 0xe9, 0xef, 0x10,
+ 0x01, 0xdf, 0xef, 0x52, 0x21, 0xfe, 0x0e, 0xf0, 0x13, 0x67, 0xe0, 0xcd,
+ 0x00, 0x1f, 0x0f, 0x55,
+ 0x21, 0xdd, 0xfd, 0x01, 0xf0, 0xcd, 0xf0, 0xcf, 0xce, 0xf0, 0xef, 0xed,
+ 0xcc, 0xe0, 0x07, 0x05,
+ 0xd0, 0x01, 0xf1, 0xe0, 0x20, 0xe0, 0x8c, 0x11, 0x45, 0xef, 0xcc, 0x23,
+ 0x44, 0xdd, 0xbc, 0x10,
+ 0x33, 0x0f, 0xff, 0x00, 0xdf, 0xcd, 0x14, 0x21, 0x98, 0xee, 0x00, 0x00,
+ 0xcd, 0xed, 0x02, 0x12,
+ 0x00, 0xef, 0x00, 0x35, 0xf0, 0x9e, 0x00, 0x17, 0x11, 0xff, 0xdf, 0xff,
+ 0xfe, 0x0f, 0x72, 0x20,
+ 0x0d, 0x10, 0x1f, 0x0c, 0x20, 0x21, 0xfe, 0x0f, 0x41, 0x20, 0x1f, 0xf9,
+ 0x9b, 0x00, 0x31, 0xed,
+ 0xdd, 0x00, 0x12, 0x32, 0x10, 0xfe, 0xff, 0x0f, 0x10, 0x45, 0x00, 0x0e,
+ 0xfe, 0x0e, 0x20, 0x20,
+ 0x77, 0x52, 0xca, 0xcd, 0x21, 0x57, 0x00, 0xff, 0x11, 0x01, 0xef, 0xef,
+ 0x13, 0x12, 0xcd, 0xbe,
+ 0x00, 0x05, 0x21, 0xf0, 0xfe, 0x55, 0x22, 0x0f, 0xfe, 0x0f, 0x20, 0x63,
+ 0x20, 0x0e, 0x00, 0x00,
+ 0x0d, 0x13, 0x15, 0x01, 0x03, 0xe0, 0xbc, 0xed, 0xf0, 0xff, 0x00, 0x57,
+ 0x02, 0x0f, 0x0f, 0x40,
+ 0x41, 0x0f, 0x47, 0x45, 0xf0, 0xf0, 0x10, 0x35, 0x42, 0x02, 0xf0, 0x01,
+ 0x21, 0x31, 0x62, 0x00,
+ 0x0e, 0x22, 0x20, 0xfa, 0x50, 0x40, 0x0e, 0x0d, 0x10, 0x13, 0x22, 0x0f,
+ 0xff, 0x04, 0x37, 0x12,
+ 0xbf, 0x00, 0x23, 0x00, 0x11, 0x01, 0x8e, 0xf0, 0x03, 0x0e, 0x20, 0x77,
+ 0x02, 0xec, 0x02, 0x24,
+ 0x0f, 0xf0, 0x13, 0xff, 0xdc, 0x0f, 0xdd, 0xff, 0x42, 0x11, 0xbb, 0xaa,
+ 0xdd, 0xf0, 0x01, 0x13,
+ 0xff, 0xaa, 0xf0, 0x00, 0xf0, 0xf1, 0x03, 0xe1, 0xdf, 0xee, 0x11, 0x23,
+ 0x00, 0xcd, 0x00, 0x14,
+ 0xcc, 0xed, 0x57, 0x10, 0xbf, 0xdd, 0x00, 0x03, 0x15, 0x11, 0xe0, 0xbd,
+ 0x01, 0x46, 0x20, 0xff,
+ 0x20, 0x32, 0x00, 0x0e, 0x32, 0x32, 0xfe, 0xff, 0x77, 0x76, 0x00, 0x0f,
+ 0xff, 0x00, 0x10, 0x20,
+ 0x10, 0xef, 0xfe, 0x10, 0x42, 0x10, 0x0d, 0x00, 0x0c, 0xfc, 0x0f, 0x10,
+ 0xdc, 0xab, 0x31, 0x32,
+ 0xed, 0xbb, 0xfd, 0x31, 0x75, 0x10, 0x0e, 0x0e, 0xed, 0x2f, 0x76, 0x10,
+ 0x0f, 0x10, 0x11, 0xfe,
+ 0xee, 0x22, 0x00, 0xdd, 0x12, 0x01, 0xdd, 0xf0, 0x27, 0xe0, 0xe0, 0x43,
+ 0x02, 0xbe, 0xdc, 0x21,
+ 0x34, 0x01, 0x24, 0xe0, 0x90, 0xf0, 0x03, 0x36, 0xf0, 0xbf, 0x01, 0x01,
+ 0xf1, 0x16, 0x11, 0xd0,
+ 0x9d, 0x00, 0x13, 0xee, 0xcc, 0xf0, 0xf0, 0xe0, 0xde, 0xd0, 0xbb, 0xee,
+ 0x0f, 0x00, 0x0d, 0x0f,
+ 0x10, 0x00, 0x0d, 0xc9, 0x22, 0x00, 0x8a, 0xff, 0x32, 0x44, 0x00, 0x00,
+ 0x0f, 0xed, 0x00, 0x10,
+ 0x41, 0x20, 0x00, 0x0f, 0xfb, 0xee, 0xfe, 0xef, 0xee, 0xbb, 0xed, 0xff,
+ 0x0e, 0x0d, 0x30, 0x73,
+ 0x0c, 0xc8, 0xff, 0x0f, 0x10, 0xe0, 0xee, 0x00, 0xed, 0xac, 0x0e, 0x10,
+ 0x0f, 0xfc, 0xde, 0x0f,
+ 0xf0, 0xdc, 0xee, 0x40, 0xf0, 0x8b, 0xd0, 0x26, 0x10, 0xc0, 0x00, 0x01,
+ 0xf1, 0xd0, 0xe1, 0x05,
+ 0x43, 0x34, 0xf0, 0xaf, 0xf0, 0x03, 0xf0, 0x24, 0x65, 0xf0, 0xde, 0xf0,
+ 0x01, 0x11, 0x22, 0x22,
+ 0x01, 0xe0, 0xd1, 0xd1, 0xb0, 0xb0, 0x04, 0x17, 0x03, 0xe0, 0xcc, 0xde,
+ 0x21, 0x74, 0x22, 0x21,
+ 0x0e, 0xed, 0x00, 0x01, 0x44, 0x44, 0x00, 0x0c, 0x00, 0x42, 0x10, 0xfa,
+ 0x0f, 0x50, 0x32, 0x10,
+ 0x1f, 0x2f, 0x51, 0x32, 0x1f, 0x0a, 0xfe, 0x0e, 0x0d, 0x2f, 0x4f, 0x3d,
+ 0x2e, 0x1d, 0x0a, 0x20,
+ 0x62, 0x0f, 0x0d, 0x1f, 0x1d, 0x30, 0x32, 0x13, 0x27, 0x11, 0xcf, 0xcd,
+ 0x45, 0x77, 0x00, 0xef,
+ 0x00, 0x10, 0x11, 0x12, 0x02, 0x03, 0xf1, 0xe0, 0xe0, 0x14, 0x02, 0xbf,
+ 0x24, 0x67, 0xf1, 0xd0,
+ 0xd0, 0x02, 0x24, 0xf1, 0xb0, 0xe1, 0xf0, 0xe1, 0x15, 0x22, 0xc0, 0xf0,
+ 0x22, 0x76, 0x21, 0x00,
+ 0x10, 0x31, 0x00, 0x00, 0x12, 0xf0, 0x00, 0x43, 0xdf, 0xab, 0xff, 0x0f,
+ 0x0e, 0x21, 0x53, 0x0e,
+ 0x0e, 0x0d, 0x01, 0x47, 0x13, 0x12, 0x01, 0xe0, 0xc0, 0x27, 0x01, 0x8e,
+ 0xff, 0x26, 0x21, 0xde,
+ 0x00, 0x53, 0x33, 0x0f, 0xe8, 0xef, 0x20, 0x72, 0x10, 0x00, 0x1e, 0x20,
+ 0x0d, 0x0f, 0x11, 0x21,
+ 0x0f, 0x20, 0x40, 0x0c, 0xfd, 0xfe, 0xdb, 0xee, 0x43, 0x77, 0x00, 0xe0,
+ 0x00, 0x00, 0xef, 0x00,
+ 0xef, 0xf0, 0xd2, 0xcf, 0xe0, 0xbf, 0xcd, 0x0f, 0x0f, 0x0d, 0xfb, 0xcb,
+ 0xce, 0x04, 0x56, 0x00,
+ 0xbc, 0xf0, 0x00, 0xe0, 0xde, 0xe0, 0x02, 0xd0, 0xde, 0x00, 0x10, 0x61,
+ 0x1e, 0x1a, 0x1f, 0x41,
+ 0x22, 0x0e, 0x21, 0x24, 0x11, 0x23, 0x00, 0xab, 0xf0, 0x25, 0x21, 0xed,
+ 0xfe, 0x30, 0x3e, 0x0c,
+ 0x0b, 0x30, 0x50, 0x10, 0x0e, 0x00, 0x11, 0x13, 0xd2, 0x05, 0xe1, 0x8e,
+ 0xff, 0x13, 0x37, 0x00,
+ 0xbf, 0xbd, 0x00, 0x23, 0x20, 0x0e, 0x10, 0x21, 0x1e, 0x3d, 0x5d, 0x1c,
+ 0x0f, 0xe9, 0xce, 0x10,
+ 0x00, 0x1f, 0x1d, 0xa8, 0xde, 0xf0, 0x34, 0x21, 0x00, 0xee, 0xce, 0xf0,
+ 0xef, 0xbb, 0x10, 0x01,
+ 0xde, 0x52, 0x23, 0xbb, 0xde, 0x00, 0x13, 0x00, 0x0f, 0x00, 0xdc, 0x9a,
+ 0x0f, 0x00, 0x20, 0x10,
+ 0xec, 0xcc, 0xef, 0x12, 0x01, 0x8b, 0xef, 0x12, 0x12, 0x0f, 0xf0, 0xf0,
+ 0x03, 0x33, 0x0f, 0xb9,
+ 0xff, 0x13, 0x56, 0x00, 0xdf, 0xee, 0x01, 0xbf, 0xee, 0x15, 0x00, 0xd0,
+ 0x01, 0xd0, 0xbf, 0x00,
+ 0x02, 0xe1, 0xe1, 0x04, 0x03, 0x03, 0x24, 0x01, 0xf0, 0x01, 0x22, 0x77,
+ 0x32, 0xf0, 0xf0, 0x24,
+ 0x13, 0x00, 0x01, 0x10, 0xde, 0x0f, 0x74, 0x51, 0x0d, 0xd8, 0xff, 0x20,
+ 0x42, 0x31, 0x21, 0xee,
+ 0x0f, 0x1f, 0xec, 0xdf, 0x00, 0x10, 0x0e, 0xdb, 0xfd, 0x7f, 0x4e, 0xc8,
+ 0x0f, 0x50, 0x20, 0x0d,
+ 0x0d, 0x0d, 0x1d, 0x6f, 0x0c, 0x0a, 0x10, 0x10, 0x0f, 0xff, 0xff, 0xcc,
+ 0xcc, 0x00, 0x1f, 0xcc,
+ 0xdf, 0xef, 0xcf, 0xf0, 0xf0, 0x9a, 0x00, 0x35, 0x00, 0xf0, 0x10, 0x30,
+ 0x51, 0x21, 0x00, 0x11,
+ 0x02, 0xe0, 0xd0, 0xf4, 0x04, 0xf2, 0xb1, 0xb0, 0xdf, 0xe0, 0xe0, 0x03,
+ 0x02, 0xb9, 0xde, 0xe0,
+ 0xf0, 0xed, 0xe0, 0xe2, 0xcf, 0x03, 0x04, 0xcf, 0xef, 0x0f, 0x42, 0x47,
+ 0x13, 0xf0, 0xdd, 0x03,
+ 0x67, 0x34, 0x00, 0x00, 0xe0, 0xf0, 0x22, 0x33, 0x10, 0xef, 0xdc, 0x0f,
+ 0x61, 0x64, 0x1d, 0xf9,
+ 0xed, 0x0f, 0x0f, 0x20, 0x76, 0x21, 0xff, 0xfd, 0x30, 0x41, 0xfe, 0xec,
+ 0x42, 0x44, 0x0f, 0x0d,
+ 0x0d, 0x0e, 0x00, 0x41, 0x00, 0x0b, 0x0f, 0x30, 0x30, 0x1e, 0x40, 0x53,
+ 0x21, 0x22, 0x01, 0xff,
+ 0x47, 0x17, 0xb0, 0xf1, 0xf2, 0xd0, 0xe0, 0x43, 0x34, 0xf0, 0x31, 0x76,
+ 0x20, 0x00, 0x0f, 0x00,
+ 0x33, 0x55, 0x00, 0xe0, 0xf1, 0xd0, 0xf2, 0xe4, 0xc2, 0x02, 0xdf, 0xac,
+ 0x00, 0x04, 0x12, 0xf0,
+ 0xd0, 0xe1, 0xf0, 0xd0, 0xae, 0x01, 0x17, 0x01, 0xe0, 0x27, 0x31, 0xe0,
+ 0xe0, 0x53, 0x23, 0x00,
+ 0x10, 0x00, 0xfc, 0x70, 0x42, 0x0e, 0xeb, 0x20, 0x73, 0x00, 0x0e, 0x10,
+ 0x0e, 0x2f, 0x10, 0x00,
+ 0xfc, 0xfe, 0x0e, 0xe8, 0xdc, 0x50, 0x63, 0x0f, 0x1e, 0x21, 0x10, 0x1f,
+ 0x3f, 0x20, 0x30, 0x43,
+ 0x11, 0xfe, 0xe0, 0xf0, 0xdb, 0x0f, 0x67, 0x12, 0x00, 0x00, 0x10, 0x00,
+ 0x62, 0x0f, 0x10, 0x67,
+ 0x14, 0x0f, 0xf0, 0x02, 0xf0, 0x0f, 0x00, 0x01, 0x02, 0xde, 0xec, 0x0e,
+ 0x10, 0x20, 0x02, 0x02,
+ 0x9b, 0xf0, 0x17, 0xf1, 0xc0, 0xf2, 0xb0, 0xf0, 0x27, 0x00, 0xfe, 0xff,
+ 0x0f, 0x00, 0x10, 0x21,
+ 0x00, 0xde, 0x9c, 0xee, 0x12, 0x47, 0x11, 0x01, 0x00, 0xd0, 0xb0, 0xf0,
+ 0x26, 0x21, 0xbf, 0xe0,
+ 0x01, 0x00, 0xe1, 0x01, 0xbf, 0xcd, 0x22, 0x20, 0xd8, 0xfd, 0x30, 0x20,
+ 0x0f, 0x3f, 0x0c, 0xcc,
+ 0xed, 0xfe, 0x71, 0x00, 0xb9, 0xff, 0x31, 0x20, 0xce, 0x00, 0x21, 0x00,
+ 0x20, 0x20, 0x0d, 0x12,
+ 0x47, 0xb0, 0xcd, 0x01, 0x12, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x1f,
+ 0x41, 0x01, 0xbb, 0x02,
+ 0x57, 0xf2, 0x9b, 0xf0, 0x00, 0xf1, 0xf1, 0xe2, 0xe0, 0xe0, 0xf1, 0x01,
+ 0x02, 0x0e, 0xee, 0x00,
+ 0x15, 0x43, 0x00, 0x00, 0xdf, 0x9a, 0xee, 0x23, 0x13, 0xff, 0xdd, 0xdd,
+ 0x24, 0x14, 0x8c, 0xed,
+ 0x13, 0x33, 0x0f, 0xfc, 0xfd, 0xc8, 0xfe, 0x40, 0x31, 0xee, 0x0f, 0x42,
+ 0x00, 0xf0, 0x11, 0x22,
+ 0x13, 0xf3, 0xd3, 0x05, 0x11, 0xad, 0xcb, 0x10, 0x21, 0x0f, 0xff, 0x10,
+ 0x3d, 0x4d, 0x50, 0x44,
+ 0x2f, 0x08, 0x1f, 0x1f, 0xed, 0x0e, 0x70, 0x0f, 0xfc, 0x0f, 0x00, 0xe8,
+ 0x0f, 0x60, 0x00, 0x00,
+ 0x01, 0xf0, 0x02, 0xd0, 0xcd, 0x0f, 0x66, 0x22, 0x0f, 0xec, 0xfe, 0x0f,
+ 0x60, 0x23, 0x10, 0x10,
+ 0xf8, 0xce, 0xef, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xcb, 0xbc, 0x10,
+ 0x31, 0x00, 0x10, 0x02,
+ 0x00, 0xcf, 0x01, 0x17, 0xc0, 0xaf, 0x0f, 0x00, 0xf1, 0xe0, 0xcc, 0xcc,
+ 0x00, 0xd0, 0xbd, 0xf0,
+ 0xe0, 0xcb, 0xf1, 0x06, 0x02, 0xe0, 0xae, 0x0f, 0x21, 0x23, 0x24, 0x11,
+ 0x00, 0x00, 0x22, 0x46,
+ 0x00, 0xe0, 0x34, 0x23, 0x00, 0x01, 0x00, 0x32, 0x63, 0x10, 0x10, 0x0e,
+ 0x0d, 0x3f, 0x1e, 0xcb,
+ 0x9a, 0x0f, 0x00, 0xfd, 0x00, 0x10, 0x00, 0xdc, 0xeb, 0xee, 0x71, 0x54,
+ 0x0f, 0xfe, 0x0f, 0xfe,
+ 0xfe, 0x0f, 0x0c, 0x2f, 0x73, 0x30, 0x08, 0x1e, 0x3f, 0x60, 0x20, 0x10,
+ 0x21, 0x21, 0x0f, 0xff,
+ 0x01, 0x03, 0xe1, 0xc0, 0xf0, 0xe4, 0xcf, 0xd9, 0xee, 0x22, 0x10, 0xcc,
+ 0x00, 0x35, 0x12, 0xd1,
+ 0x05, 0x12, 0xf1, 0x64, 0x33, 0xf1, 0xb0, 0xd1, 0x04, 0x15, 0xc0, 0x8e,
+ 0xef, 0x03, 0x14, 0x01,
+ 0xe2, 0xd0, 0xd1, 0x04, 0xd0, 0xe1, 0x04, 0xce, 0x01, 0x25, 0xaf, 0xef,
+ 0x24, 0x01, 0xef, 0xf0,
+ 0x00, 0xff, 0x0f, 0x0f, 0x20, 0x50, 0xf9, 0xcd, 0x0f, 0x21, 0x31, 0x0f,
+ 0xda, 0x8b, 0x0f, 0x20,
+ 0x0f, 0xdc, 0x0f, 0x1f, 0x5f, 0x2d, 0x2d, 0x30, 0x2e, 0x1c, 0x3e, 0x71,
+ 0x32, 0x0e, 0x2f, 0x20,
+ 0x0e, 0x0c, 0x1f, 0x76, 0x21, 0x0f, 0x0d, 0x43, 0x32, 0x1c, 0x1b, 0x2f,
+ 0x2f, 0x31, 0x22, 0xef,
+ 0xbe, 0xf1, 0x05, 0xc1, 0xc1, 0xf4, 0x05, 0x23, 0x01, 0xc0, 0xee, 0x34,
+ 0x13, 0xf1, 0x24, 0x33,
+ 0x03, 0x24, 0x02, 0xf2, 0x66, 0x43, 0x01, 0xd1, 0xf2, 0x14, 0xf2, 0xa0,
+ 0xf1, 0x02, 0xf2, 0x04,
+ 0x14, 0xa0, 0xde, 0x03, 0x27, 0x42, 0x01, 0x01, 0x01, 0x02, 0x03, 0x13,
+ 0xd0, 0xb1, 0x15, 0x02,
+ 0xd1, 0xd1, 0xf2, 0x21, 0x72, 0x1f, 0x0b, 0x3f, 0x4d, 0x2d, 0x71, 0x20,
+ 0x2a, 0x0c, 0x1c, 0x0e,
+ 0x1f, 0x0e, 0x1e, 0x2f, 0x1e, 0x0c, 0x0c, 0x4d, 0x3d, 0x6e, 0x2c, 0x2c,
+ 0x60, 0x30, 0x0b, 0x1e,
+ 0x41, 0x32, 0x0e, 0x0e, 0x00, 0x30, 0x30, 0x0c, 0xed, 0x00, 0x52, 0x1f,
+ 0x0d, 0x0f, 0x02, 0xbc,
+ 0xdd, 0x04, 0x01, 0xcf, 0xe0, 0xf3, 0xcf, 0xef, 0x05, 0xf7, 0xe1, 0x8f,
+ 0xed, 0xff, 0xdd, 0xe0,
+ 0x04, 0xe0, 0xc1, 0xf4, 0xd0, 0xe1, 0xe2, 0x9c, 0xed, 0x07, 0x07, 0xe0,
+ 0xb0, 0xf1, 0xf1, 0xb0,
+ 0xe0, 0xf1, 0xf1, 0xef, 0xec, 0xfe, 0xff, 0xed, 0x11, 0x00, 0xec, 0xdd,
+ 0x31, 0x65, 0xf0, 0xe0,
+ 0xe0, 0xef, 0xd0, 0xd3, 0xf4, 0xe0, 0xbf, 0xee, 0x23, 0x0e, 0xa8, 0xec,
+ 0x0e, 0x1f, 0x4f, 0x1f,
+ 0xfb, 0x0e, 0x4f, 0x2e, 0xfb, 0x0e, 0x70, 0x40, 0x3f, 0x4f, 0x1c, 0x1e,
+ 0x20, 0x1d, 0x1e, 0x2f,
+ 0x0e, 0xdc, 0xef, 0xbe, 0xdc, 0x00, 0x00, 0x0b, 0x71, 0x10, 0xe8, 0xde,
+ 0x0f, 0x21, 0x00, 0xae,
+ 0xff, 0xee, 0xff, 0xf0, 0xcf, 0xcd, 0xf0, 0xf1, 0xde, 0xce, 0xf6, 0x03,
+ 0xbf, 0xcd, 0xf4, 0x07,
+ 0xc0, 0xef, 0x14, 0x12, 0xe0, 0xe2, 0xd0, 0xe1, 0x03, 0xe0, 0xc0, 0xf4,
+ 0xe2, 0xe3, 0xe3, 0xe1,
+ 0xcd, 0xeb, 0x43, 0x25, 0xf1, 0xf1, 0x0f, 0xdb, 0xbc, 0x51, 0x54, 0x00,
+ 0xfd, 0x20, 0x63, 0x00,
+ 0xfc, 0x01, 0x46, 0x00, 0x10, 0x31, 0x20, 0x10, 0x11, 0x55, 0x21, 0x00,
+ 0x00, 0x10, 0x0e, 0x0f,
+ 0x0f, 0x0f, 0x73, 0x31, 0x30, 0x53, 0x1f, 0x18, 0x2d, 0x75, 0x21, 0x0d,
+ 0x1d, 0x20, 0x11, 0x10,
+ 0x0e, 0xfd, 0xff, 0x00, 0x13, 0x0e, 0xd8, 0x10, 0x72, 0x23, 0x03, 0x00,
+ 0x00, 0x35, 0x44, 0x12,
+ 0xef, 0xcf, 0x03, 0x47, 0x01, 0xf1, 0xf0, 0xef, 0x10, 0x01, 0xf0, 0x12,
+ 0x12, 0x00, 0x12, 0xd1,
+ 0xe2, 0x04, 0xd1, 0x77, 0x44, 0xa0, 0xde, 0x00, 0x12, 0x21, 0x01, 0x03,
+ 0xe2, 0xaf, 0x00, 0x02,
+ 0xde, 0xff, 0xdd, 0xc8, 0x00, 0x01, 0xd0, 0xe1, 0xe0, 0x01, 0x12, 0xbf,
+ 0xa8, 0xf0, 0x12, 0x12,
+ 0x53, 0x14, 0x00, 0x00, 0x43, 0x10, 0x0b, 0x12, 0x77, 0x23, 0x0f, 0xf0,
+ 0x10, 0x21, 0x00, 0x11,
+ 0x10, 0x10, 0x2f, 0x0e, 0x40, 0x72, 0x1e, 0x20, 0x21, 0x0c, 0x09, 0x0f,
+ 0x21, 0x01, 0xdf, 0xbf,
+ 0x02, 0x27, 0x00, 0xf0, 0x10, 0x0f, 0x0e, 0x5f, 0x4f, 0x3d, 0x4d, 0x1b,
+ 0x0c, 0xfe, 0x31, 0x31,
+ 0x0e, 0x2f, 0x1f, 0xff, 0x32, 0xcd, 0x88, 0xdd, 0x33, 0x00, 0xcd, 0xbb,
+ 0xcb, 0x00, 0x00, 0x0e,
+ 0xee, 0xf0, 0x01, 0x35, 0x43, 0x10, 0xff, 0xee, 0x00, 0x01, 0x04, 0xf1,
+ 0xae, 0xef, 0xd0, 0xf3,
+ 0xf6, 0xe2, 0xa0, 0xdd, 0xf0, 0xe0, 0xf2, 0xe1, 0xe2, 0xcf, 0x03, 0x27,
+ 0xf2, 0x8e, 0xf2, 0x04,
+ 0xfd, 0xdc, 0x44, 0x12, 0xfd, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x00, 0xcf,
+ 0x0e, 0x10, 0xf0, 0xef,
+ 0xe0, 0xd0, 0xbd, 0x1f, 0x77, 0x22, 0xe8, 0xdd, 0x1f, 0x2f, 0x1f, 0x0c,
+ 0x0e, 0x0e, 0x1f, 0x42,
+ 0xf0, 0x8c, 0x0f, 0x33, 0x22, 0xda, 0xde, 0x40, 0x42, 0x1f, 0x2e, 0x2d,
+ 0x0b, 0x0d, 0x1f, 0x5f,
+ 0x2f, 0x1e, 0x0d, 0xee, 0xdf, 0xbe, 0xba, 0xdd, 0xee, 0xf0, 0x05, 0x05,
+ 0x8c, 0x00, 0x7c, 0x00,
+ 0x6c, 0xf3, 0xce, 0xcf, 0xd3, 0xf8, 0x76, 0xcd, 0xdd, 0x88, 0x00, 0x33,
+ 0x0f, 0xcc, 0xf0, 0xf0,
+ 0x26, 0x30, 0x9c, 0x01, 0x04, 0x00, 0xdc, 0xcf, 0x12, 0x33, 0x8b, 0xff,
+ 0x01, 0x00, 0xff, 0x0f,
+ 0xff, 0x00, 0xf1, 0xef, 0xf0, 0xe0, 0x12, 0x02, 0x8b, 0xfe, 0xf0, 0x04,
+ 0xf3, 0xed, 0xdc, 0x22,
+ 0x01, 0xce, 0x00, 0xe0, 0x10, 0x46, 0x0e, 0x99, 0x00, 0x01, 0xe0, 0xec,
+ 0x20, 0x11, 0xef, 0xff,
+ 0xec, 0xdd, 0x32, 0x11, 0xeb, 0x10, 0xed, 0x9f, 0x0f, 0x40, 0x00, 0xe9,
+ 0xdf, 0x10, 0x43, 0xfe,
+ 0xeb, 0xff, 0x40, 0x61, 0xf0, 0xda, 0x21, 0x31, 0xed, 0xcc, 0x21, 0x32,
+ 0x00, 0xed, 0xef, 0x30,
+ 0x1f, 0xfe, 0xee, 0x74, 0x01, 0x9a, 0x00, 0x00, 0xf0, 0xf0, 0x20, 0x23,
+ 0xdd, 0xde, 0x10, 0x22,
+ 0x02, 0x23, 0xfd, 0xc8, 0xad, 0x11, 0x67, 0xef, 0xee, 0x12, 0x00, 0xcf,
+ 0x00, 0x03, 0xe0, 0xec,
+ 0x00, 0x64, 0xff, 0xee, 0x13, 0x00, 0xea, 0xdf, 0x20, 0x40, 0xcd, 0x01,
+ 0x35, 0x0f, 0xf0, 0x32,
+ 0xdf, 0xbe, 0x13, 0x32, 0x30, 0xd8, 0xb0, 0x0f, 0xe0, 0x11, 0x56, 0xce,
+ 0xdd, 0x31, 0x10, 0xdd,
+ 0x00, 0x31, 0x00, 0x0f, 0x1d, 0x50, 0x01, 0xdf, 0xee, 0x11, 0x10, 0xfc,
+ 0xfe, 0xed, 0x21, 0x77,
+ 0x52, 0xea, 0xee, 0x20, 0x20, 0xf0, 0xd3, 0x00, 0xfd, 0x0f, 0xf0, 0x30,
+ 0x77, 0xf0, 0xbe, 0x0f,
+ 0x01, 0x11, 0x00, 0x01, 0xd0, 0x12, 0x77, 0xef, 0xef, 0x11, 0xff, 0xca,
+ 0x01, 0x54, 0x01, 0xce,
+ 0x00, 0x12, 0xf0, 0xcc, 0x26, 0x32, 0xbe, 0xde, 0x12, 0x23, 0xef, 0xfd,
+ 0x01, 0xf0, 0x25, 0x02,
+ 0x9c, 0x00, 0x14, 0x20, 0xf0, 0xff, 0x01, 0x01, 0x01, 0x12, 0x10, 0x1d,
+ 0x2f, 0xf3, 0x77, 0x35,
+ 0xdc, 0x31, 0x72, 0xef, 0xff, 0x35, 0x10, 0xdc, 0x12, 0x20, 0xd0, 0x41,
+ 0x43, 0xbc, 0xff, 0x22,
+ 0x20, 0x1f, 0x21, 0x22, 0x20, 0xff, 0x0f, 0x74, 0x00, 0x21, 0x23, 0x20,
+ 0x20, 0x20, 0x00, 0xec,
+ 0x43, 0x77, 0x00, 0xfb, 0x01, 0x20, 0x00, 0x01, 0x22, 0x1d, 0x40, 0x37,
+ 0x53, 0xf0, 0xbc, 0x01,
+ 0x23, 0x20, 0xe0, 0x01, 0x23, 0xee, 0xde, 0x0e, 0x53, 0x47, 0xf0, 0xdc,
+ 0x22, 0x44, 0xec, 0xf0,
+ 0x12, 0xee, 0x44, 0x33, 0xef, 0xdd, 0x54, 0x32, 0xde, 0xff, 0x00, 0xe2,
+ 0x13, 0x62, 0x0f, 0xfe,
+ 0x01, 0xe0, 0x15, 0x21, 0xdf, 0x46, 0x51, 0xdc, 0xe0, 0x16, 0x31, 0xff,
+ 0xee, 0x20, 0x31, 0x63,
+ 0xf0, 0xba, 0x20, 0x44, 0x0f, 0xf0, 0x00, 0x23, 0xff, 0xbd, 0xf0, 0x35,
+ 0x13, 0xee, 0x0d, 0x32,
+ 0x22, 0xbc, 0x0d, 0x52, 0x12, 0x24, 0x31, 0xeb, 0xcc, 0x65, 0x12, 0xee,
+ 0xdd, 0x63, 0x16, 0x0f,
+ 0xee, 0xf0, 0xf0, 0x02, 0x20, 0x00, 0x00, 0x31, 0xed, 0x30, 0x77, 0x10,
+ 0xf0, 0x10, 0x0e, 0x20,
+ 0x02, 0xf0, 0x30, 0x64, 0xec, 0xcc, 0x34, 0x11, 0xdc, 0xde, 0x12, 0x31,
+ 0x00, 0xac, 0x10, 0x24,
+ 0xe0, 0x0d, 0x31, 0x1f, 0x01, 0x47, 0xff, 0xff, 0x61, 0x00, 0xdd, 0x32,
+ 0x35, 0xdf, 0x20, 0x43,
+ 0xae, 0xfe, 0x01, 0x34, 0x22, 0x01, 0xdd, 0xee, 0x03, 0x00, 0xf0, 0x57,
+ 0x06, 0xce, 0x0f, 0x40,
+ 0x02, 0xf1, 0xff, 0xcc, 0x64, 0x34, 0xbc, 0xff, 0x12, 0x00, 0x00, 0x12,
+ 0x00, 0xac, 0x00, 0x00,
+ 0x01, 0x33, 0xed, 0xfe, 0x04, 0x10, 0x00, 0x01, 0x10, 0xeb, 0xd0, 0x32,
+ 0x33, 0xfe, 0x8a, 0xde,
+ 0x33, 0x66, 0xee, 0xdd, 0x00, 0x12, 0x11, 0x0f, 0x0d, 0x00, 0x20, 0x32,
+ 0x00, 0xfa, 0x10, 0x50,
+ 0xc9, 0x00, 0x74, 0xef, 0xfd, 0x00, 0x10, 0xdc, 0x12, 0x54, 0xed, 0xcd,
+ 0x11, 0x10, 0x01, 0x31,
+ 0x0e, 0xcd, 0x23, 0x33, 0xfe, 0xf1, 0x37, 0x00, 0xef, 0xcd, 0x35, 0x75,
+ 0xef, 0xef, 0x31, 0x11,
+ 0x00, 0x30, 0x02, 0xcf, 0xeb, 0x53, 0x33, 0xef, 0x00, 0xf2, 0xf1, 0x33,
+ 0x00, 0xe0, 0x35, 0x13,
+ 0xd0, 0x91, 0x05, 0x13, 0x01, 0x10, 0x23, 0xf4, 0xb0, 0xe0, 0x47, 0x12,
+ 0x00, 0x54, 0x00, 0xff,
+ 0x00, 0x26, 0x20, 0xe0, 0xcd, 0x43, 0x42, 0xe0, 0xcf, 0x43, 0x22, 0xdd,
+ 0x01, 0x57, 0xee, 0xff,
+ 0x32, 0x01, 0xde, 0x20, 0x30, 0xf1, 0x31, 0x2f, 0x0e, 0x40, 0x0e, 0xc8,
+ 0x10, 0x75, 0x40, 0xdb,
+ 0x00, 0x11, 0x10, 0x1f, 0x00, 0xfe, 0x00, 0x01, 0x00, 0xfd, 0xde, 0x30,
+ 0x21, 0xdd, 0xee, 0x76,
+ 0x52, 0xed, 0xca, 0x20, 0x31, 0x10, 0x00, 0xac, 0x11, 0x00, 0x0f, 0x00,
+ 0xef, 0xcd, 0x15, 0xdf,
+ 0xa9, 0x21, 0x32, 0xbe, 0xfe, 0x00, 0x00, 0xdf, 0x10, 0x0f, 0xfd, 0x01,
+ 0xdf, 0xcc, 0x00, 0x03,
+ 0x31, 0xd9, 0xef, 0x10, 0x35, 0x8e, 0xe0, 0x01, 0xff, 0x9c, 0x11, 0x24,
+ 0xdd, 0xed, 0x03, 0x00,
+ 0xd9, 0x20, 0x42, 0xdf, 0xdd, 0x0e, 0x2f, 0x0f, 0xcd, 0xf2, 0xef, 0xc8,
+ 0xf0, 0x01, 0xe0, 0x9c,
+ 0x00, 0x20, 0x00, 0xbd, 0xff, 0x0f, 0x50, 0x00, 0xf8, 0xe0, 0x10, 0x0f,
+ 0x0f, 0x00, 0xbd, 0x00,
+ 0xff, 0xdc, 0x21, 0x00, 0x8b, 0x00, 0x0e, 0x0e, 0x0e, 0xdd, 0xfc, 0x11,
+ 0x10, 0xcb, 0x20, 0x13,
+ 0xed, 0xbd, 0xfd, 0x01, 0xe0, 0xeb, 0xed, 0xcc, 0x02, 0x04, 0x9c, 0xfe,
+ 0x12, 0xfe, 0xbc, 0x10,
+ 0x01, 0xe0, 0xff, 0xf0, 0xeb, 0xdf, 0x0f, 0xcd, 0xe0, 0x15, 0xcc, 0xce,
+ 0x02, 0xef, 0xcd, 0x0f,
+ 0x13, 0x03, 0xf9, 0x0e, 0x31, 0xd1, 0x9f, 0x0f, 0x01, 0xf0, 0xed, 0xf0,
+ 0x04, 0xdd, 0x9b, 0x01,
+ 0x12, 0xde, 0xef, 0x00, 0x10, 0x0d, 0xed, 0xcd, 0x23, 0x17, 0x04, 0x0e,
+ 0xbc, 0xff, 0x00, 0x01,
+ 0x04, 0x02, 0x0d, 0x2b, 0x11, 0x31, 0x10, 0xeb, 0x5f, 0x63, 0xe0, 0xcd,
+ 0x20, 0x32, 0xf0, 0xf0,
+ 0x0f, 0xcc, 0x00, 0x77, 0x00, 0x00, 0xef, 0xec, 0x20, 0x75, 0x00, 0xee,
+ 0x00, 0x23, 0x00, 0xee,
+ 0x40, 0x24, 0xfe, 0x1e, 0x52, 0x26, 0x01, 0x0e, 0xfe, 0x10, 0x21, 0x13,
+ 0x04, 0x11, 0x0f, 0xed,
+ 0x31, 0x74, 0x1d, 0x10, 0x23, 0x10, 0xed, 0x01, 0x17, 0x01, 0xcd, 0x10,
+ 0x32, 0x01, 0x22, 0x21,
+ 0xf0, 0x73, 0x77, 0x10, 0x00, 0x24, 0x10, 0x0f, 0x36, 0x54, 0x00, 0xee,
+ 0x34, 0x10, 0x90, 0x00,
+ 0x47, 0x00, 0xbd, 0x13, 0x32, 0xef, 0x0e, 0x42, 0x14, 0x00, 0x23, 0x23,
+ 0x10, 0x10, 0x00, 0x46,
+ 0x10, 0x02, 0x11, 0x01, 0x75, 0x10, 0x01, 0x00, 0xf0, 0x11, 0x46, 0x00,
+ 0x0f, 0x62, 0x11, 0x00,
+ 0x35, 0x44, 0x00, 0x10, 0x60, 0x11, 0x0e, 0x00, 0x24, 0x12, 0x00, 0xff,
+ 0x23, 0x30, 0x0f, 0x02,
+ 0x23, 0x1d, 0x21, 0x77, 0x55, 0x0f, 0x0f, 0x02, 0x45, 0x0f, 0xfd, 0x34,
+ 0x10, 0xf0, 0x21, 0x63,
+ 0xff, 0xfe, 0x01, 0x35, 0x11, 0x1f, 0x0e, 0xe0, 0x26, 0x51, 0xf0, 0x00,
+ 0x12, 0x22, 0x22, 0xff,
+ 0x54, 0x57, 0xef, 0xee, 0x13, 0x53, 0x00, 0x04, 0x11, 0x0f, 0xd0, 0x11,
+ 0x16, 0x00, 0xbf, 0x0f,
+ 0x23, 0xf0, 0xce, 0x42, 0x34, 0xef, 0x10, 0x32, 0xbb, 0x22, 0x02, 0xe0,
+ 0x00, 0xf1, 0x03, 0x25,
+ 0xbe, 0xee, 0x02, 0x10, 0xef, 0x0d, 0x1f, 0xfe, 0x0e, 0x73, 0x30, 0xd8,
+ 0x20, 0x73, 0x10, 0x00,
+ 0x0f, 0xee, 0x2c, 0x0b, 0x10, 0x74, 0x0d, 0xec, 0x12, 0x10, 0x0e, 0xfd,
+ 0x2f, 0x0d, 0x3f, 0x33,
+ 0x35, 0xfe, 0xea, 0xcf, 0x50, 0x41, 0x00, 0xe0, 0xef, 0xf2, 0xf2, 0x67,
+ 0x42, 0xef, 0xe0, 0x35,
+ 0x0f, 0x0e, 0x12, 0xf1, 0xaf, 0x00, 0x02, 0x23, 0x00, 0xcc, 0x0f, 0xf0,
+ 0x04, 0x02, 0x0d, 0xfe,
+ 0x07, 0x34, 0x22, 0x90, 0xef, 0x14, 0x01, 0xd0, 0xa0, 0xe6, 0xa1, 0x00,
+ 0xf3, 0x00, 0xe3, 0xef,
+ 0xec, 0x02, 0x46, 0x01, 0x01, 0x00, 0xff, 0x00, 0xf2, 0x54, 0x21, 0xde,
+ 0x00, 0xce, 0xa8, 0x01,
+ 0x13, 0xf0, 0xde, 0xe0, 0x1f, 0x0e, 0x20, 0x52, 0xef, 0x0a, 0x30, 0xf0,
+ 0xef, 0x51, 0x40, 0x0e,
+ 0x00, 0x30, 0x22, 0x1e, 0x08, 0xdd, 0x5f, 0x52, 0xf0, 0xda, 0x10, 0x53,
+ 0x0f, 0xfe, 0x20, 0x11,
+ 0x0e, 0x30, 0x2e, 0x30, 0x60, 0x0e, 0xda, 0x00, 0x53, 0x02, 0x2e, 0x0e,
+ 0x12, 0xd0, 0x00, 0x27,
+ 0x20, 0x32, 0x61, 0xdc, 0xbb, 0xf0, 0x05, 0x0f, 0x00, 0x01, 0x03, 0xbc,
+ 0xde, 0x13, 0x32, 0xef,
+ 0x00, 0x45, 0xee, 0xac, 0x01, 0x13, 0x00, 0x11, 0x43, 0xd0, 0xcc, 0xe1,
+ 0x07, 0xf0, 0xbc, 0x12,
+ 0x32, 0xcf, 0xed, 0x10, 0x30, 0xdd, 0xdd, 0x24, 0x10, 0xbc, 0x01, 0x03,
+ 0xca, 0x00, 0x11, 0xf0,
+ 0xdd, 0xee, 0xcc, 0x0f, 0x50, 0xc9, 0x00, 0x1e, 0x0f, 0x2f, 0x31, 0x0e,
+ 0xfe, 0x0f, 0xee, 0x0c,
+ 0x21, 0x62, 0xdc, 0xed, 0x30, 0xcb, 0x8b, 0xfe, 0x00, 0x30, 0x04, 0xde,
+ 0xda, 0x00, 0x2f, 0x60,
+ 0x1f, 0xfe, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0xce, 0xe0, 0xa2, 0xdc, 0x0f,
+ 0x00, 0xd0, 0xd1, 0x10,
+ 0xee, 0xbd, 0xf3, 0xf2, 0xde, 0x07, 0x04, 0x8c, 0xdc, 0xf2, 0xf4, 0xef,
+ 0xdd, 0x01, 0xc3, 0xee,
+ 0xdf, 0xe0, 0xe4, 0xe0, 0xee, 0xef, 0xfe, 0x04, 0x16, 0x90, 0xd0, 0xf2,
+ 0x15, 0x0e, 0xfc, 0xf2,
+ 0xf3, 0x9e, 0x0d, 0x34, 0x02, 0xff, 0xfc, 0xce, 0xef, 0x11, 0x61, 0xff,
+ 0xcf, 0x00, 0x0f, 0x10,
+ 0x03, 0x67, 0x0e, 0xfa, 0x21, 0x33, 0xdb, 0x0f, 0x51, 0x11, 0x1f, 0x30,
+ 0x10, 0x0b, 0x20, 0x71,
+ 0x31, 0x0f, 0x3d, 0x0e, 0x00, 0x01, 0x0f, 0x10, 0xf0, 0x0d, 0x4e, 0x0c,
+ 0xa0, 0x03, 0x06, 0x22,
+ 0x73, 0x09, 0xee, 0x14, 0x21, 0xfe, 0x00, 0x13, 0x10, 0x00, 0x00, 0x01,
+ 0x03, 0xe3, 0x57, 0x22,
+ 0x0f, 0xfe, 0xe0, 0xbf, 0x16, 0x14, 0xee, 0xae, 0x02, 0x25, 0xc0, 0xef,
+ 0x00, 0xee, 0xee, 0xc1,
+ 0xe0, 0x0e, 0x64, 0x24, 0xcd, 0xed, 0xf0, 0xf2, 0x00, 0x23, 0x03, 0xeb,
+ 0xce, 0x03, 0x04, 0xf0,
+ 0x12, 0xcd, 0xf0, 0x34, 0x13, 0x88, 0xcc, 0x20, 0x32, 0x02, 0xce, 0xeb,
+ 0x00, 0x41, 0x10, 0x2f,
+ 0x55, 0xff, 0xbb, 0x00, 0x21, 0x11, 0x10, 0x1d, 0xee, 0xde, 0xf0, 0x22,
+ 0x3f, 0x0c, 0x52, 0x22,
+ 0xdb, 0x0d, 0x30, 0x60, 0x00, 0x00, 0x10, 0x1d, 0x0d, 0x0e, 0x74, 0x13,
+ 0x01, 0x0d, 0xe8, 0x1e,
+ 0x21, 0x12, 0xfe, 0x0b, 0x00, 0x1f, 0x0e, 0x4f, 0x32, 0x02, 0xcc, 0x2f,
+ 0x72, 0x21, 0x00, 0x10,
+ 0xe0, 0x01, 0x05, 0x0f, 0x0b, 0x0e, 0x0f, 0xe0, 0xd1, 0x8c, 0xc9, 0xe0,
+ 0x11, 0x11, 0xff, 0xf0,
+ 0x02, 0x0f, 0x0e, 0x54, 0xd1, 0xd0, 0x27, 0x20, 0xd1, 0xe1, 0x23, 0xd0,
+ 0x8e, 0x80, 0x07, 0x12,
+ 0x00, 0xf0, 0xfd, 0x0e, 0x00, 0x10, 0x04, 0x00, 0x0e, 0xdb, 0x00, 0x36,
+ 0xc0, 0xbd, 0x00, 0xf0,
+ 0x01, 0x00, 0xa0, 0x0e, 0x00, 0x0d, 0xbd, 0x00, 0x00, 0xfc, 0x0d, 0x00,
+ 0x01, 0xed, 0x2d, 0x53,
+ 0x09, 0x0f, 0x01, 0x22, 0xd8, 0xcf, 0x00, 0x20, 0xbf, 0xfd, 0xff, 0x3e,
+ 0x61, 0x01, 0xdc, 0x1b,
+ 0x3f, 0x1f, 0x32, 0x00, 0x98, 0xf0, 0x0f, 0x10, 0x0f, 0x01, 0x12, 0x00,
+ 0xbb, 0x01, 0x03, 0x00,
+ 0x1f, 0x20, 0xf4, 0xc0, 0x00, 0x43, 0xe3, 0x9c, 0x01, 0x06, 0xd0, 0xf0,
+ 0xf3, 0x01, 0x10, 0x71,
+ 0x13, 0xf1, 0xd0, 0x26, 0x11, 0x00, 0x16, 0x32, 0xa0, 0xf1, 0x04, 0x12,
+ 0x13, 0xf1, 0xd4, 0xf1,
+ 0x14, 0x00, 0xc2, 0x43, 0x10, 0x01, 0xe1, 0x02, 0x77, 0x64, 0x00, 0x00,
+ 0x03, 0x34, 0x00, 0x12,
+ 0x42, 0x02, 0x10, 0x33, 0x00, 0xe0, 0x00, 0x23, 0x14, 0x44, 0x75, 0x10,
+ 0x00, 0x41, 0x42, 0x00,
+ 0x01, 0x46, 0x0f, 0x0f, 0x21, 0x32, 0x30, 0x20, 0x15, 0x10, 0x0d, 0x3e,
+ 0x70, 0x53, 0x10, 0x00,
+ 0x1c, 0x10, 0x21, 0x10, 0x10, 0x47, 0x11, 0x00, 0x41, 0x32, 0x44, 0x06,
+ 0x00, 0x0e, 0x20, 0x52,
+ 0x03, 0xed, 0x22, 0x57, 0x00, 0xf0, 0xef, 0x13, 0x24, 0x0f, 0xde, 0x11,
+ 0x52, 0xee, 0xdd, 0xe0,
+ 0x20, 0x55, 0x16, 0xf0, 0xcd, 0x00, 0xf1, 0xf2, 0x03, 0x04, 0x00, 0xd0,
+ 0x01, 0xff, 0xbc, 0x25,
+ 0x73, 0x00, 0xff, 0x00, 0x03, 0x30, 0x00, 0xce, 0x0d, 0x14, 0x41, 0xec,
+ 0x01, 0x16, 0xef, 0xfe,
+ 0x3f, 0x20, 0xbe, 0xcd, 0x07, 0x02, 0xcc, 0xcc, 0x00, 0x0e, 0x60, 0x50,
+ 0x00, 0xeb, 0x10, 0x30,
+ 0x1f, 0x1d, 0x20, 0x03, 0x00, 0x0b, 0xcf, 0x00, 0xf0, 0xcc, 0x00, 0x00,
+ 0xfc, 0x0c, 0x2f, 0xef,
+ 0xce, 0xed, 0x40, 0x21, 0xbc, 0xfa, 0x4f, 0x30, 0x8e, 0xf0, 0x11, 0x0d,
+ 0xd8, 0xf1, 0x01, 0x00,
+ 0xdd, 0xd0, 0xdf, 0xdf, 0xa0, 0xdf, 0xaa, 0xff, 0xe0, 0xf1, 0xdd, 0xff,
+ 0xf0, 0xbf, 0xdc, 0xf1,
+ 0x04, 0x0e, 0x88, 0xff, 0xf0, 0x01, 0xf0, 0xef, 0xee, 0x00, 0x02, 0xbe,
+ 0xee, 0x00, 0x10, 0xf1,
+ 0xdf, 0x00, 0xf0, 0xdc, 0xec, 0xfe, 0xf0, 0xf0, 0xbd, 0xe9, 0xdf, 0xde,
+ 0x01, 0x43, 0x0e, 0xc8,
+ 0x0f, 0xec, 0xaf, 0x01, 0x02, 0xce, 0xbd, 0x00, 0x0d, 0x0d, 0xf0, 0x00,
+ 0x1c, 0x1d, 0x40, 0x2f,
+ 0x2d, 0x1c, 0x0b, 0x1e, 0x31, 0x00, 0xdb, 0xac, 0x2f, 0x30, 0x00, 0xbf,
+ 0x31, 0x1d, 0xdb, 0xf0,
+ 0x12, 0x0d, 0xcb, 0x20, 0x11, 0xc2, 0xef, 0x0e, 0xcb, 0x9f, 0x12, 0x34,
+ 0xfc, 0xde, 0x12, 0x22,
+ 0x25, 0x00, 0x8c, 0x00, 0x00, 0x27, 0xf0, 0xcf, 0x0f, 0xef, 0x00, 0xd1,
+ 0x01, 0x03, 0xef, 0x0f,
+ 0xf0, 0x9d, 0xec, 0x03, 0x57, 0xff, 0xde, 0xd0, 0x00, 0x11, 0x00, 0xf0,
+ 0x16, 0xf0, 0xcc, 0x10,
+ 0x70, 0x02, 0x00, 0xd1, 0x0f, 0x1e, 0xf0, 0xf2, 0x00, 0x10, 0xff, 0x24,
+ 0x72, 0xf9, 0xe0, 0x40,
+ 0x51, 0x02, 0x00, 0xec, 0x0c, 0x30, 0x22, 0x23, 0xdd, 0xc9, 0x20, 0x72,
+ 0x52, 0x00, 0x0e, 0x10,
+ 0x10, 0x02, 0x00, 0x0a, 0x22, 0x43, 0x00, 0x04, 0x51, 0x0e, 0x00, 0x04,
+ 0x35, 0x10, 0x20, 0x20,
+ 0x32, 0x30, 0x63, 0x14, 0x0f, 0x0e, 0x01, 0x07, 0x23, 0x4f, 0x0d, 0x10,
+ 0x20, 0x20, 0x10, 0x77,
+ 0x23, 0x0e, 0xff, 0x30, 0x30, 0x10, 0x46, 0x01, 0xd0, 0xc0, 0x21, 0x60,
+ 0xed, 0xf0, 0x21, 0x30,
+ 0x10, 0x0e, 0xdd, 0x30, 0x76, 0x50, 0xf1, 0xe2, 0x27, 0x11, 0x12, 0x23,
+ 0x12, 0x00, 0x00, 0xf3,
+ 0x01, 0x74, 0x43, 0x00, 0xff, 0x22, 0x43, 0x00, 0x11, 0x32, 0x32, 0x00,
+ 0x36, 0x57, 0x00, 0x0e,
+ 0x1f, 0xff, 0xf0, 0x15, 0x00, 0x8e, 0xdf, 0x13, 0x47, 0x0f, 0x0e, 0x41,
+ 0x33, 0xff, 0x0e, 0x75,
+ 0x03, 0x0f, 0xed, 0x10, 0x44, 0xf0, 0xff, 0x05, 0x01, 0x1f, 0x10, 0x12,
+ 0xe1, 0x14, 0x73, 0x0f,
+ 0x1c, 0x20, 0x2f, 0x1f, 0x00, 0x14, 0x12, 0x0d, 0x1c, 0x50, 0x00, 0x25,
+ 0x60, 0x0f, 0x0f, 0x11,
+ 0x16, 0x02, 0x31, 0x10, 0xf1, 0xf2, 0x34, 0x44, 0x10, 0x03, 0xf2, 0x32,
+ 0xe0, 0x8f, 0xc3, 0x27,
+ 0x46, 0xf1, 0xf0, 0x1e, 0x50, 0x34, 0x12, 0x00, 0x01, 0x43, 0x21, 0x35,
+ 0x01, 0x01, 0x10, 0x00,
+ 0x05, 0x13, 0x33, 0xd3, 0xb0, 0xf0, 0x25, 0x12, 0xe1, 0x71, 0x74, 0x02,
+ 0x01, 0x00, 0x02, 0x42,
+ 0x02, 0x07, 0x14, 0x01, 0xe1, 0x11, 0x02, 0x31, 0x11, 0x01, 0x14, 0x33,
+ 0xcf, 0xaa, 0xf0, 0x30,
+ 0x75, 0x21, 0xe0, 0x00, 0x01, 0x40, 0x33, 0x26, 0x00, 0xbc, 0x00, 0x22,
+ 0x20, 0x0f, 0x0e, 0x01,
+ 0x00, 0x1e, 0x7e, 0x21, 0x02, 0xfb, 0x0e, 0x01, 0x41, 0x1e, 0x01, 0x01,
+ 0x3a, 0x00, 0x42, 0x00,
+ 0xf1, 0x26, 0x99, 0xf1, 0xc4, 0x25, 0xa9, 0xf3, 0xb2, 0x27, 0x33, 0xdb,
+ 0xae, 0xf2, 0xf4, 0xf1,
+ 0x00, 0xed, 0xdd, 0x03, 0x47, 0x41, 0xce, 0xbc, 0x00, 0x21, 0x00, 0xff,
+ 0xfd, 0x30, 0x51, 0xe0,
+ 0xfe, 0x30, 0x24, 0xdf, 0xfe, 0x77, 0x13, 0x10, 0x0e, 0xdf, 0xbf, 0x27,
+ 0x31, 0xbd, 0xfd, 0x12,
+ 0x20, 0xed, 0x12, 0x33, 0x2e, 0x2e, 0x33, 0x76, 0x1f, 0xfb, 0xe0, 0x00,
+ 0xe1, 0xbf, 0xdf, 0x00,
+ 0xf3, 0xdd, 0xeb, 0x41, 0x41, 0xca, 0x01, 0x65, 0x10, 0x0d, 0x00, 0x00,
+ 0xee, 0x0e, 0x42, 0x26,
+ 0x00, 0xee, 0xaf, 0x00, 0xf0, 0x33, 0x33, 0xe0, 0xd0, 0x25, 0x10, 0xef,
+ 0x8c, 0xff, 0xf0, 0x13,
+ 0x34, 0x0f, 0xfc, 0xf0, 0x00, 0x51, 0x23, 0x1f, 0xfe, 0xb0, 0x15, 0x44,
+ 0xed, 0xcb, 0x03, 0x13,
+ 0x01, 0x03, 0x0b, 0xbb, 0x00, 0x34, 0x01, 0xaf, 0x0e, 0x11, 0x01, 0x0f,
+ 0x0b, 0x00, 0x32, 0xf2,
+ 0xf0, 0x0f, 0x52, 0x22, 0x0c, 0x0f, 0x02, 0x25, 0x1f, 0xfb, 0xf1, 0x02,
+ 0x1f, 0x0f, 0xd0, 0x90,
+ 0x33, 0x3f, 0xf9, 0x70, 0x32, 0x10, 0x00, 0x0d, 0x0f, 0x54, 0xf2, 0xbc,
+ 0xff, 0x01, 0xe0, 0x0d,
+ 0x00, 0xfd, 0xe0, 0x01, 0x22, 0xed, 0xec, 0x55, 0x45, 0x0e, 0x0c, 0x20,
+ 0x65, 0x11, 0xff, 0xce,
+ 0x11, 0x56, 0x00, 0xde, 0x0f, 0x10, 0x01, 0x22, 0x0f, 0x8b, 0x00, 0x03,
+ 0x21, 0xef, 0xcd, 0xff,
+ 0x00, 0x20, 0x05, 0xe1, 0xcc, 0x0e, 0x43, 0x26, 0xfe, 0xde, 0x11, 0x34,
+ 0xee, 0xde, 0x0f, 0x23,
+ 0xd1, 0x8f, 0x23, 0x36, 0xfe, 0x0f, 0x50, 0x01, 0xad, 0x00, 0x25, 0x00,
+ 0x0f, 0x09, 0x00, 0x00,
+ 0x01, 0x13, 0xf0, 0x9e, 0x00, 0x20, 0x01, 0x13, 0x31, 0x20, 0xfe, 0xce,
+ 0xfd, 0xfa, 0x0e, 0x12,
+ 0xb1, 0xf0, 0x11, 0x61, 0x2f, 0x31, 0x24, 0x0c, 0x00, 0xf2, 0xd3, 0xdb,
+ 0xef, 0x02, 0xdf, 0xbb,
+ 0x01, 0xd0, 0x00, 0x11, 0x30, 0x38, 0x1f, 0x20, 0x72, 0x63, 0x0f, 0xde,
+ 0x1f, 0x0e, 0x00, 0x17,
+ 0x42, 0xdc, 0xdf, 0x03, 0xf0, 0xd3, 0x77, 0x20, 0xdc, 0xd0, 0x10, 0x23,
+ 0xe0, 0xbe, 0x0f, 0x20,
+ 0xef, 0xe0, 0x61, 0x1d, 0x0d, 0x00, 0xe0, 0x00, 0x25, 0xf3, 0xeb, 0x20,
+ 0x31, 0xe2, 0xb1, 0x02,
+ 0x03, 0xc0, 0x15, 0x01, 0xdc, 0xdc, 0xe1, 0x05, 0xc0, 0xcf, 0x2b, 0x7f,
+ 0x41, 0x02, 0x0e, 0xd9,
+ 0x00, 0x33, 0x00, 0x0e, 0x0f, 0x00, 0x33, 0xe1, 0x81, 0x02, 0x00, 0x05,
+ 0xe3, 0xbf, 0xff, 0x00,
+ 0x3a, 0xfd, 0x74, 0x23, 0x2d, 0x1f, 0x21, 0x01, 0x1d, 0x0b, 0xf1, 0xd3,
+ 0x9d, 0xfc, 0xf0, 0x26,
+ 0x00, 0xb0, 0xfc, 0xf0, 0x00, 0x00, 0x0c, 0x10, 0x11, 0x22, 0x10, 0xeb,
+ 0x00, 0x73, 0x35, 0xdf,
+ 0xfd, 0x42, 0x04, 0x8f, 0x0f, 0x31, 0x00, 0xfd, 0xf0, 0x00, 0x0f, 0x24,
+ 0x23, 0xff, 0x00, 0x1d,
+ 0xd8, 0xef, 0x76, 0x30, 0xaf, 0x0e, 0x0f, 0x00, 0x11, 0x03, 0x00, 0xec,
+ 0x00, 0x12, 0x00, 0x62,
+ 0x05, 0x00, 0x0e, 0x11, 0xe0, 0xa0, 0x04, 0x11, 0xfc, 0xda, 0xf0, 0x25,
+ 0x00, 0xce, 0x0f, 0x00,
+ 0xd0, 0x02, 0x61, 0xf0, 0x10, 0x72, 0x1f, 0x10, 0x02, 0x00, 0x1d, 0xf0,
+ 0x02, 0xd0, 0xef, 0x03,
+ 0x11, 0x30, 0xef, 0x9b, 0x02, 0x00, 0x28, 0x21, 0x25, 0xd0, 0xf2, 0x10,
+ 0xfc, 0xdf, 0x20, 0x0d,
+ 0xdc, 0x02, 0xc2, 0x8d, 0xfc, 0x42, 0x13, 0x01, 0x14, 0xe1, 0x00, 0x49,
+ 0x0d, 0xfb, 0x00, 0xf3,
+ 0x71, 0x30, 0xeb, 0xc0, 0x30, 0x25, 0xf0, 0xdd, 0x00, 0x41, 0xe1, 0xcf,
+ 0x0e, 0xf0, 0x04, 0x61,
+ 0xcd, 0xdb, 0x30, 0x00, 0xec, 0x21, 0x75, 0x20, 0xdd, 0xf0, 0x12, 0x00,
+ 0x00, 0x30, 0x13, 0x02,
+ 0xb0, 0xc2, 0x07, 0x00, 0xd0, 0xfd, 0xf3, 0x13, 0x75, 0x1f, 0xfa, 0xbf,
+ 0x00, 0xf0, 0xef, 0xe0,
+ 0x32, 0x2e, 0x0e, 0x30, 0x13, 0xf0, 0xd0, 0x07, 0xf1, 0xc0, 0xed, 0xde,
+ 0x00, 0x75, 0x62, 0xd0,
+ 0xff, 0x12, 0x2e, 0xea, 0x11, 0x72, 0x0f, 0xdd, 0x00, 0x42, 0x03, 0x20,
+ 0xfe, 0xde, 0x23, 0x16,
+ 0x0f, 0xdd, 0x00, 0xe0, 0xdb, 0x10, 0xef, 0x9a, 0x10, 0x30, 0x11, 0xa0,
+ 0x0f, 0x0e, 0x50, 0x34,
+ 0x02, 0x20, 0x1b, 0xee, 0x01, 0x26, 0x51, 0x00, 0xbf, 0xed, 0xef, 0x00,
+ 0x13, 0x01, 0xb1, 0x24,
+ 0x00, 0xea, 0x02, 0x75, 0xff, 0xec, 0x00, 0x12, 0x10, 0x1f, 0x00, 0x23,
+ 0x0e, 0xcd, 0x00, 0x21,
+ 0x11, 0x04, 0x32, 0xf0, 0x8f, 0x00, 0x0d, 0xfe, 0xd0, 0xf3, 0x04, 0xf0,
+ 0xf3, 0xd9, 0xbd, 0x20,
+ 0x67, 0x00, 0xff, 0x0f, 0x03, 0x22, 0x41, 0x01, 0x04, 0xe0, 0xdd, 0xcb,
+ 0x00, 0x57, 0x0f, 0xbe,
+ 0x00, 0x12, 0x31, 0xfc, 0x10, 0x73, 0x13, 0x1e, 0x0f, 0x0f, 0x0f, 0x20,
+ 0xfa, 0xce, 0x22, 0x13,
+ 0xd8, 0xf0, 0x21, 0x11, 0xd0, 0xe0, 0x4f, 0xfe, 0xd0, 0x00, 0x42, 0x31,
+ 0x10, 0x0d, 0x10, 0xce,
+ 0xfc, 0x11, 0x24, 0x74, 0x73, 0x0f, 0xd9, 0x01, 0x02, 0x24, 0x00, 0xf0,
+ 0x2f, 0x1b, 0xf0, 0x33,
+ 0xf0, 0x81, 0xee, 0xec, 0x21, 0x01, 0xc0, 0x00, 0xf1, 0xfc, 0x0f, 0x31,
+ 0x05, 0x11, 0x31, 0xbf,
+ 0xd0, 0xf5, 0xef, 0x0d, 0x60, 0x06, 0x32, 0xe0, 0xbc, 0xe0, 0x01, 0xd1,
+ 0xf1, 0xf2, 0xfe, 0x08,
+ 0x0e, 0xf0, 0x76, 0x71, 0x50, 0xed, 0xff, 0xf0, 0xf1, 0x12, 0x00, 0x0f,
+ 0xbf, 0x0f, 0x01, 0x35,
+ 0x00, 0x0c, 0xec, 0x00, 0x12, 0x71, 0x0e, 0xfb, 0x00, 0x20, 0x34, 0x11,
+ 0xdf, 0xef, 0x00, 0x20,
+ 0xde, 0xef, 0x63, 0x05, 0xf0, 0xfd, 0xf0, 0xc0, 0xdc, 0xee, 0x43, 0x52,
+ 0x0f, 0x0e, 0x0f, 0x20,
+ 0x37, 0x52, 0x0b, 0xcd, 0x01, 0x47, 0x00, 0x00, 0x00, 0xe0, 0xe2, 0xf0,
+ 0x40, 0x51, 0xf1, 0xd0,
+ 0x00, 0xe0, 0xa9, 0xf0, 0x00, 0x00, 0x3d, 0x40, 0xf0, 0xc0, 0x02, 0x3f,
+ 0x0e, 0x07, 0x04, 0xed,
+ 0xee, 0xe0, 0x03, 0x54, 0x11, 0x9e, 0xec, 0xf5, 0x11, 0x2f, 0x0c, 0xe0,
+ 0xd0, 0xbe, 0xf0, 0x23,
+ 0x51, 0x1c, 0x10, 0xed, 0xab, 0x0f, 0x55, 0x21, 0xed, 0xde, 0x03, 0x25,
+ 0xf0, 0xec, 0xe0, 0x00,
+ 0x03, 0x32, 0xef, 0xcf, 0x0e, 0x70, 0x33, 0x24, 0x10, 0x11, 0x05, 0x0f,
+ 0xfd, 0x10, 0x20, 0xdb,
+ 0xb1, 0x26, 0xef, 0xbb, 0x00, 0x01, 0xf0, 0x10, 0x40, 0xf0, 0x1f, 0x2f,
+ 0xfd, 0xce, 0xf1, 0x54,
+ 0x00, 0xc9, 0xe0, 0x00, 0x33, 0x45, 0xb0, 0xdd, 0x10, 0x32, 0x0d, 0x00,
+ 0x77, 0x00, 0xbd, 0x01,
+ 0x12, 0x0f, 0xfe, 0x01, 0x03, 0x10, 0x4e, 0x20, 0x00, 0xed, 0xf3, 0x04,
+ 0xda, 0xfe, 0x00, 0xb0,
+ 0xef, 0x0e, 0x40, 0x56, 0x12, 0x00, 0xe1, 0x15, 0x01, 0xf0, 0xbc, 0xd0,
+ 0x01, 0x10, 0x43, 0xf1,
+ 0xad, 0x0c, 0x44, 0x11, 0xef, 0xcb, 0x01, 0x36, 0x0f, 0x0c, 0x01, 0x12,
+ 0x42, 0x21, 0xff, 0xaa,
+ 0x00, 0x52, 0x00, 0xf0, 0xfe, 0x10, 0xe0, 0xde, 0x10, 0x54, 0x1f, 0x0d,
+ 0xf0, 0xf0, 0x00, 0xf0,
+ 0x04, 0x23, 0x0d, 0xdb, 0x00, 0x0f, 0x50, 0xe1, 0x8c, 0xfe, 0x13, 0x22,
+ 0x1e, 0x2e, 0x20, 0x3f,
+ 0x37, 0x25, 0xc0, 0xaa, 0xfe, 0x1f, 0x32, 0x03, 0xf0, 0x10, 0x71, 0x00,
+ 0xdd, 0xf3, 0xf4, 0x00,
+ 0x20, 0xcd, 0xcb, 0x00, 0x26, 0x1f, 0xbc, 0xef, 0x31, 0x41, 0xee, 0x0d,
+ 0x10, 0x25, 0x20, 0x22,
+ 0x30, 0xf0, 0xa1, 0xdf, 0x0f, 0x23, 0xf0, 0xc0, 0x07, 0xc1, 0x03, 0x1f,
+ 0xfc, 0x00, 0x22, 0x00,
+ 0xa1, 0x00, 0xed, 0x30, 0x64, 0x0d, 0xd9, 0x01, 0x02, 0xff, 0x10, 0x00,
+ 0xcd, 0xb0, 0x07, 0x32,
+ 0x0f, 0xdf, 0x00, 0x10, 0x2e, 0xec, 0x42, 0x77, 0x40, 0x0c, 0x00, 0x41,
+ 0xf2, 0xe2, 0xfc, 0xfe,
+ 0x30, 0x62, 0xe0, 0xcd, 0x0f, 0x00, 0x47, 0x35, 0xcf, 0xca, 0xf0, 0x41,
+ 0x20, 0x00, 0xf0, 0x0f,
+ 0x0e, 0xd0, 0xf1, 0x33, 0x40, 0x0d, 0x03, 0x00, 0x2d, 0x3e, 0x00, 0xe0,
+ 0x12, 0x00, 0x8b, 0xcd,
+ 0xf1, 0x05, 0x0f, 0xc8, 0xf0, 0x15, 0x11, 0xe0, 0xbc, 0xf0, 0xf0, 0x31,
+ 0x73, 0x01, 0xed, 0x1e,
+ 0x40, 0x25, 0x31, 0xf1, 0xe0, 0x13, 0x00, 0xdc, 0xcf, 0x21, 0x26, 0xae,
+ 0xed, 0xe2, 0xf0, 0x00,
+ 0x02, 0x24, 0xef, 0x0e, 0x10, 0x9c, 0xfe, 0x43, 0x34, 0xb0, 0x02, 0x01,
+ 0x1c, 0xfb, 0xd1, 0x05,
+ 0x11, 0x30, 0x1f, 0x2f, 0xed, 0xed, 0x51, 0x55, 0x12, 0xf0, 0xcd, 0x1f,
+ 0x7f, 0x20, 0x25, 0x10,
+ 0x0e, 0xdf, 0xfd, 0xf1, 0x05, 0x1d, 0xec, 0xd0, 0x00, 0x00, 0x2d, 0x70,
+ 0x77, 0x35, 0xed, 0xbe,
+ 0x00, 0x10, 0x23, 0x00, 0xed, 0xee, 0x00, 0x12, 0x01, 0x00, 0x32, 0x43,
+ 0xf0, 0xe2, 0x00, 0xb8,
+ 0x10, 0x53, 0x0f, 0x0c, 0x00, 0xe0, 0xf2, 0xd0, 0x00, 0xed, 0xfd, 0xb0,
+ 0xe2, 0x07, 0x52, 0x00,
+ 0x01, 0xde, 0xef, 0x02, 0x37, 0x1f, 0x21, 0x16, 0x8f, 0xde, 0xf0, 0xf2,
+ 0xff, 0xfd, 0x01, 0x22,
+ 0xce, 0xf8, 0x10, 0x73, 0xf0, 0xf0, 0x15, 0x30, 0x3e, 0xfe, 0xc0, 0xf0,
+ 0x00, 0x05, 0x40, 0xff,
+ 0x8b, 0x00, 0x00, 0x21, 0x22, 0xf0, 0xc0, 0x20, 0x3f, 0x2e, 0x1e, 0x1e,
+ 0xfa, 0x30, 0x73, 0x00,
+ 0xef, 0x0e, 0x2f, 0x22, 0x37, 0x07, 0x8e, 0xfd, 0x10, 0x45, 0xff, 0xad,
+ 0x00, 0x12, 0x0f, 0xee,
+ 0x01, 0x31, 0x00, 0x0f, 0x20, 0x00, 0xf0, 0x30, 0x30, 0x0e, 0xca, 0xd0,
+ 0xf3, 0xf1, 0xfe, 0xd0,
+ 0xe5, 0x04, 0x00, 0x1f, 0xf0, 0x00, 0x77, 0x71, 0x10, 0xae, 0xfe, 0x00,
+ 0x20, 0x10, 0xea, 0xf0,
+ 0x22, 0x35, 0x11, 0xf0, 0xbd, 0x00, 0x02, 0x20, 0xc1, 0xa1, 0x01, 0x00,
+ 0x0f, 0x0e, 0xf0, 0xd4,
+ 0x02, 0x4e, 0x28, 0x1d, 0x02, 0x00, 0x00, 0x5e, 0x20, 0x00, 0xec, 0xae,
+ 0xf2, 0xf7, 0x0f, 0x0d,
+ 0x03, 0xf1, 0xbe, 0x30, 0x53, 0x00, 0x09, 0x0f, 0x00, 0xe0, 0x15, 0x60,
+ 0x0f, 0x0e, 0x03, 0x53,
+ 0x03, 0xed, 0xdd, 0x01, 0x10, 0x0b, 0x30, 0x04, 0x11, 0x6d, 0x0b, 0xde,
+ 0xe1, 0x35, 0x20, 0xdc,
+ 0xd0, 0x00, 0xdf, 0x20, 0x60, 0x40, 0x34, 0xbf, 0xa9, 0x00, 0x21, 0x21,
+ 0xe0, 0xe2, 0x03, 0x11,
+ 0x1e, 0xcc, 0xf0, 0x12, 0x00, 0xe1, 0x27, 0x41, 0x00, 0xfd, 0xbe, 0x10,
+ 0x32, 0x01, 0xcd, 0x1c,
+ 0x50, 0x11, 0x05, 0x00, 0x0f, 0x00, 0xf3, 0x11, 0x54, 0xfe, 0xdb, 0xe0,
+ 0xdf, 0xbd, 0xfc, 0x16,
+ 0x32, 0xe1, 0xcf, 0x1d, 0x50, 0x24, 0x00, 0xf0, 0xe1, 0xf2, 0x21, 0x5f,
+ 0xfd, 0xbf, 0x0f, 0x07,
+ 0x15, 0x0e, 0xdf, 0x30, 0x51, 0x00, 0xd2, 0x30, 0x6c, 0x20, 0x46, 0x04,
+ 0x10, 0xec, 0xdf, 0x0e,
+ 0xe0, 0x02, 0x12, 0x51, 0x0e, 0xc0, 0xd0, 0xee, 0x0d, 0x3d, 0x67, 0x16,
+ 0xde, 0xac, 0x0f, 0xf0,
+ 0x10, 0x31, 0x01, 0x21, 0x30, 0xfe, 0xed, 0x0e, 0x1e, 0x26, 0x11, 0xff,
+ 0x9f, 0xdf, 0xde, 0x12,
+ 0x27, 0x22, 0xe0, 0xbd, 0x02, 0x12, 0x0e, 0x0d, 0xdd, 0x2e, 0x6e, 0x00,
+ 0x12, 0xfe, 0xb8, 0xf9,
+ 0x22, 0x00, 0xdf, 0xef, 0x00, 0x64, 0x51, 0x11, 0xef, 0xcc, 0x00, 0x11,
+ 0x47, 0x01, 0xdd, 0x9e,
+ 0x00, 0x15, 0x20, 0xff, 0xfe, 0x10, 0x24, 0x10, 0xff, 0xf0, 0xd0, 0xf0,
+ 0x20, 0xdc, 0xdf, 0xe3,
+ 0x27, 0x30, 0x90, 0xdc, 0x10, 0x71, 0x00, 0xdc, 0x11, 0x73, 0x00, 0x00,
+ 0x00, 0xf0, 0xfe, 0x02,
+ 0x24, 0x00, 0xeb, 0xd0, 0x0f, 0x23, 0x53, 0x0d, 0x0e, 0x3f, 0x0e, 0xe0,
+ 0x17, 0x20, 0xbd, 0xec,
+ 0x21, 0xf2, 0x01, 0x73, 0xeb, 0xbc, 0x22, 0x25, 0x00, 0xec, 0xf0, 0x33,
+ 0x21, 0x00, 0x1f, 0x1e,
+ 0x00, 0xc0, 0x0e, 0x70, 0x01, 0xc0, 0xeb, 0x00, 0x35, 0xef, 0xaf, 0x00,
+ 0x21, 0x01, 0xdf, 0xef,
+ 0xdf, 0x0e, 0x37, 0x74, 0x51, 0xff, 0xee, 0x0f, 0x10, 0x0e, 0xe0, 0x25,
+ 0x23, 0xef, 0xcf, 0x00,
+ 0x0a, 0x1f, 0x10, 0xe0, 0xf1, 0x27, 0x00, 0xce, 0x1f, 0x72, 0x12, 0xe0,
+ 0x00, 0xe0, 0xdd, 0xcd,
+ 0x0c, 0xf3, 0xd3, 0xd1, 0x00, 0x60, 0x37, 0x30, 0x0e, 0x1e, 0x60, 0x36,
+ 0x00, 0xf0, 0xdc, 0x31,
+ 0x35, 0xc0, 0xd1, 0x0e, 0x1f, 0x70, 0x62, 0xf2, 0xff, 0x0c, 0x0d, 0x0d,
+ 0x10, 0x34, 0x24, 0xde,
+ 0xcd, 0x0f, 0xfb, 0x22, 0x67, 0x01, 0xde, 0xec, 0x20, 0x31, 0xef, 0x00,
+ 0x01, 0xe0, 0xfb, 0x31,
+ 0x73, 0x21, 0xf0, 0xe3, 0x02, 0xef, 0xfd, 0x10, 0x1e, 0x0e, 0xad, 0xde,
+ 0x14, 0x34, 0xce, 0x0f,
+ 0x77, 0x52, 0xff, 0xfe, 0x10, 0x12, 0x00, 0x05, 0xf2, 0xbc, 0xeb, 0xf0,
+ 0xf0, 0xe2, 0x04, 0x00,
+ 0xd1, 0xdf, 0xfe, 0x1f, 0x3f, 0x03, 0xb7, 0x00, 0x0b, 0x1e, 0x3f, 0x73,
+ 0x54, 0xf0, 0xf0, 0x0f,
+ 0xed, 0x10, 0x03, 0xc1, 0x10, 0x40, 0x0e, 0xf0, 0xf6, 0xf0, 0xcb, 0x10,
+ 0x21, 0xf0, 0xe0, 0x70,
+ 0x60, 0xfe, 0x00, 0x36, 0x2c, 0xec, 0x00, 0x04, 0x11, 0xce, 0xdf, 0x1f,
+ 0x30, 0xe0, 0xc2, 0x25,
+ 0x00, 0xab, 0xde, 0x01, 0x40, 0x10, 0x10, 0x0d, 0x11, 0x21, 0x21, 0x33,
+ 0x11, 0x0e, 0x20, 0x32,
+ 0x9d, 0xb9, 0xe0, 0x07, 0x00, 0x00, 0x32, 0xff, 0x0f, 0x00, 0xd5, 0xd0,
+ 0x0d, 0x73, 0x02, 0x1c,
+ 0x2d, 0x0d, 0xf2, 0xe6, 0x01, 0x61, 0x00, 0xd0, 0x04, 0xdf, 0xad, 0x00,
+ 0xf1, 0xee, 0x1d, 0x45,
+ 0xe3, 0xbe, 0xda, 0xf0, 0x0e, 0x50, 0x01, 0xf3, 0x04, 0x2e, 0x3c, 0x30,
+ 0x00, 0xb1, 0xd1, 0x01,
+ 0x2e, 0xfa, 0xbf, 0x02, 0x03, 0x2f, 0xf9, 0x31, 0x60, 0x0c, 0x00, 0x54,
+ 0x11, 0xcf, 0xde, 0x14,
+ 0x42, 0x0f, 0x0e, 0x0e, 0x10, 0x31, 0x76, 0x20, 0xe2, 0xb0, 0x0f, 0xfa,
+ 0xee, 0xfe, 0x35, 0x52,
+ 0xfe, 0xff, 0x01, 0x21, 0x3e, 0x0f, 0x00, 0xe3, 0xfe, 0x0e, 0xd8, 0xff,
+ 0x30, 0x72, 0xc2, 0xb0,
+ 0xd0, 0x0f, 0x3f, 0x22, 0x24, 0xd0, 0xcd, 0xf0, 0xee, 0x03, 0x26, 0x13,
+ 0xcf, 0xb8, 0x00, 0x42,
+ 0x10, 0x0e, 0x60, 0x02, 0x11, 0xe0, 0x0d, 0x00, 0x32, 0x02, 0xe0, 0xe3,
+ 0xf1, 0xff, 0xfe, 0x20,
+ 0x50, 0xf2, 0xa0, 0x0e, 0x28, 0x18, 0x10, 0x33, 0x33, 0x20, 0xcb, 0xf0,
+ 0xcf, 0xe2, 0xf4, 0xbf,
+ 0xfe, 0x10, 0x12, 0xdf, 0xdd, 0x65, 0x03, 0xde, 0x0e, 0x00, 0x60, 0x50,
+ 0x00, 0x01, 0x01, 0xf8,
+ 0x0f, 0x52, 0x35, 0xf0, 0xfd, 0xe0, 0xee, 0xff, 0x00, 0x12, 0xc4, 0xe2,
+ 0x00, 0x2c, 0xcd, 0xd0,
+ 0x00, 0xff, 0xee, 0x50, 0x53, 0x0f, 0x1d, 0x50, 0x08, 0xfb, 0x13, 0x46,
+ 0xdf, 0xbc, 0xf0, 0x01,
+ 0x12, 0x32, 0x01, 0x00, 0x0e, 0xd0, 0xdf, 0xf3, 0x12, 0xad, 0xd9, 0x00,
+ 0x12, 0x40, 0x1e, 0x20,
+ 0x00, 0xfd, 0x00, 0x36, 0x71, 0x20, 0x0d, 0xc0, 0x10, 0x20, 0x00, 0x00,
+ 0xaf, 0xfd, 0xd1, 0x10,
+ 0x08, 0x0e, 0x22, 0x25, 0x01, 0x70, 0x3f, 0x0d, 0xd0, 0x03, 0x14, 0xc0,
+ 0xb0, 0x01, 0x13, 0xdf,
+ 0xcd, 0xe2, 0x00, 0x0e, 0x0c, 0x12, 0x53, 0x27, 0x11, 0x0e, 0x0b, 0x10,
+ 0x0e, 0xdf, 0x01, 0x14,
+ 0x70, 0x14, 0x55, 0x0f, 0x1b, 0xe0, 0xd1, 0xf2, 0xde, 0xcf, 0x04, 0x73,
+ 0x4f, 0xfd, 0xde, 0xff,
+ 0x22, 0x23, 0xf1, 0xf0, 0x20, 0x48, 0xfa, 0xd0, 0x01, 0x01, 0x00, 0x80,
+ 0xfe, 0x10, 0x10, 0x00,
+ 0x21, 0x30, 0x21, 0xfd, 0x0b, 0x00, 0x03, 0xe0, 0xeb, 0x8e, 0xef, 0x01,
+ 0x06, 0x0e, 0x0e, 0x71,
+ 0x13, 0x04, 0xdd, 0xdc, 0x01, 0x05, 0x21, 0x41, 0xcd, 0xec, 0x01, 0x01,
+ 0x10, 0x00, 0x43, 0x00,
+ 0x0a, 0xee, 0xc6, 0xba, 0x49, 0xee, 0x84, 0xbb, 0x06, 0x01, 0x2e, 0x8d,
+ 0xad, 0x02, 0x35, 0x10,
+ 0x0c, 0x20, 0x64, 0x01, 0x0f, 0xa8, 0x00, 0x01, 0x24, 0xd0, 0xee, 0x01,
+ 0x01, 0xf0, 0xde, 0x01,
+ 0x02, 0x00, 0x1e, 0x50, 0x0f, 0xc0, 0xe3, 0x02, 0x00, 0x10, 0x77, 0x50,
+ 0x0f, 0x01, 0xe0, 0xdd,
+ 0x0e, 0x0c, 0x33, 0x67, 0x21, 0xfd, 0x0f, 0x32, 0x32, 0xdf, 0xbc, 0x00,
+ 0x17, 0x50, 0xfc, 0xfd,
+ 0x00, 0x20, 0x03, 0xc0, 0xec, 0x0d, 0x00, 0x15, 0x30, 0x1f, 0xfd, 0x40,
+ 0x75, 0x22, 0xff, 0xdc,
+ 0xff, 0x30, 0x74, 0x12, 0xce, 0xeb, 0x00, 0x54, 0x00, 0xe0, 0xf0, 0x0d,
+ 0x0e, 0xf0, 0xe1, 0x00,
+ 0x00, 0x3f, 0x74, 0x46, 0x00, 0xe0, 0xfe, 0x01, 0x03, 0xff, 0xee, 0xc0,
+ 0xd0, 0xdc, 0x00, 0xd0,
+ 0x04, 0x00, 0xec, 0xdf, 0xb0, 0xee, 0x11, 0x74, 0x01, 0xe1, 0x00, 0x35,
+ 0x50, 0x0d, 0xdb, 0x02,
+ 0x14, 0x01, 0x01, 0xd3, 0x00, 0xcd, 0xca, 0xf1, 0x00, 0x10, 0x53, 0x1e,
+ 0x0c, 0x25, 0x14, 0xfe,
+ 0x0e, 0x61, 0x20, 0x00, 0x2e, 0x0d, 0x0f, 0x0c, 0xff, 0xf1, 0x17, 0x24,
+ 0xeb, 0xf0, 0x40, 0xae,
+ 0xee, 0x20, 0x45, 0xe0, 0xbd, 0x30, 0x71, 0x0e, 0xdb, 0x00, 0x55, 0x00,
+ 0xfe, 0x10, 0x21, 0x03,
+ 0xe0, 0xce, 0x00, 0x01, 0xdf, 0xbb, 0x00, 0x24, 0x42, 0x0e, 0xdd, 0x02,
+ 0x31, 0x41, 0x10, 0x0e,
+ 0x00, 0x00, 0x0f, 0xd2, 0xf4, 0x76, 0x44, 0xf2, 0xa0, 0xfb, 0xfe, 0x0f,
+ 0x15, 0x24, 0xe0, 0xcc,
+ 0x0e, 0x10, 0x70, 0x16, 0x01, 0xcf, 0xfd, 0x00, 0x02, 0x20, 0x11, 0xd0,
+ 0xe3, 0x12, 0x4f, 0xfc,
+ 0xd0, 0x0f, 0xed, 0xcd, 0x01, 0x07, 0x72, 0x20, 0xdc, 0xde, 0x11, 0x31,
+ 0x1e, 0x1e, 0x21, 0x15,
+ 0xf0, 0xea, 0x1f, 0x10, 0xe1, 0xe1, 0x00, 0xd2, 0x82, 0xac, 0x00, 0x32,
+ 0x15, 0x3e, 0x0c, 0xe0,
+ 0x0f, 0x1e, 0x50, 0x14, 0xf0, 0xfd, 0x60, 0x44, 0x00, 0x0d, 0x1f, 0x1d,
+ 0x10, 0x22, 0x07, 0xd2,
+ 0xa0, 0xdc, 0xf0, 0x00, 0x03, 0x8c, 0xfd, 0x03, 0x01, 0x00, 0xea, 0xee,
+ 0x01, 0x65, 0x23, 0x22,
+ 0x0f, 0xfd, 0x11, 0x21, 0xdd, 0xf0, 0x17, 0x0f, 0xdb, 0xf1, 0xc2, 0x00,
+ 0x0f, 0x0f, 0xb1, 0x02,
+ 0x70, 0x00, 0xfe, 0x0f, 0x00, 0x02, 0x37, 0x2f, 0x88, 0xf0, 0x11, 0x74,
+ 0x00, 0xee, 0xf0, 0x00,
+ 0x01, 0x01, 0x00, 0xf2, 0xd0, 0xee, 0xfd, 0x13, 0x20, 0x0c, 0x30, 0x77,
+ 0x04, 0x1d, 0x30, 0x20,
+ 0x00, 0x0c, 0x20, 0x02, 0x8e, 0x0d, 0x01, 0x25, 0x11, 0x00, 0xd0, 0x00,
+ 0x34, 0x41, 0xfe, 0xdf,
+ 0x01, 0xbe, 0xc8, 0x0e, 0x01, 0x01, 0x51, 0x0f, 0xfc, 0x10, 0x10, 0x20,
+ 0x42, 0x22, 0xf3, 0xdd,
+ 0xe8, 0x0f, 0xf0, 0xc0, 0xbf, 0x05, 0x12, 0x0e, 0xcc, 0x00, 0x02, 0x21,
+ 0x12, 0xdc, 0x9c, 0x33,
+ 0x63, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x03, 0x26, 0x00, 0xcf, 0xee, 0xdc,
+ 0x00, 0x62, 0x20, 0x10,
+ 0x00, 0x0d, 0xfd, 0xce, 0x00, 0x0f, 0x00, 0x17, 0x27, 0x21, 0x2e, 0x1f,
+ 0xe1, 0x8f, 0xef, 0xd1,
+ 0xf5, 0xf0, 0xee, 0xfe, 0x21, 0xf1, 0xef, 0xe1, 0x56, 0x40, 0x3f, 0x2f,
+ 0x20, 0xbc, 0xfb, 0x51,
+ 0x26, 0xf0, 0xd0, 0x00, 0xed, 0xe0, 0xc0, 0xe0, 0x01, 0x12, 0x62, 0x30,
+ 0x40, 0xf0, 0x0d, 0xfe,
+ 0x03, 0xe1, 0x0d, 0xd9, 0xce, 0xf0, 0x20, 0x75, 0xf0, 0xde, 0x5f, 0x21,
+ 0x0e, 0x0e, 0x32, 0xd1,
+ 0xab, 0x16, 0x45, 0x20, 0x0d, 0xff, 0x01, 0xb0, 0xfe, 0x00, 0x01, 0x5d,
+ 0xfd, 0x01, 0x07, 0x11,
+ 0x1c, 0x0d, 0x22, 0x04, 0xa0, 0xfe, 0xdf, 0xf2, 0xe2, 0x12, 0x25, 0x00,
+ 0xce, 0xfc, 0x01, 0x25,
+ 0xe0, 0x2b, 0x70, 0xf0, 0xe1, 0x51, 0x30, 0x0e, 0xbf, 0x02, 0x11, 0xf0,
+ 0xd1, 0x04, 0x1f, 0x3e,
+ 0x13, 0x07, 0xa1, 0xdb, 0xdf, 0xff, 0x42, 0x45, 0xf0, 0xd0, 0x10, 0x30,
+ 0x0f, 0xd0, 0xa0, 0x0e,
+ 0x10, 0x63, 0x12, 0x00, 0xe4, 0xff, 0x19, 0x00, 0x30, 0x10, 0x21, 0x72,
+ 0xf0, 0xb0, 0x16, 0x20,
+ 0x0b, 0x00, 0x00, 0x12, 0xed, 0x00, 0x30, 0x3e, 0x00, 0x03, 0xf0, 0x3d,
+ 0x70, 0x3c, 0xea, 0x00,
+ 0x03, 0x00, 0xcd, 0x27, 0x73, 0x0e, 0xca, 0x00, 0x02, 0x00, 0x10, 0x0e,
+ 0xdf, 0xde, 0x00, 0x13,
+ 0x71, 0x33, 0x1f, 0xfc, 0xf0, 0x03, 0xf0, 0xec, 0x1d, 0x74, 0x27, 0x13,
+ 0x02, 0x0f, 0xae, 0xe0,
+ 0x00, 0x0f, 0xdf, 0x02, 0x00, 0xde, 0xe7, 0xd0, 0xca, 0xe0, 0x70, 0x10,
+ 0xb0, 0x00, 0x62, 0xe0,
+ 0x00, 0x00, 0x13, 0xf3, 0xe0, 0x42, 0x00, 0xc8, 0xef, 0x01, 0x16, 0x0f,
+ 0x2f, 0x20, 0x20, 0x00,
+ 0xbc, 0x0f, 0x02, 0x11, 0x20, 0x3e, 0xe3, 0x06, 0x50, 0xfd, 0xee, 0x51,
+ 0x46, 0xf0, 0xcb, 0x00,
+ 0xff, 0xff, 0x11, 0x41, 0xe0, 0xeb, 0x0f, 0x50, 0x10, 0x20, 0x01, 0x12,
+ 0xf0, 0xf1, 0xd0, 0xdf,
+ 0x6e, 0x33, 0xf0, 0xd0, 0x25, 0x00, 0xbd, 0x0c, 0x02, 0xf4, 0xee, 0x0d,
+ 0x2f, 0x0d, 0x75, 0x24,
+ 0x0e, 0xcc, 0x01, 0x12, 0xe0, 0x14, 0x77, 0xfe, 0xdf, 0xe0, 0x21, 0x11,
+ 0x02, 0x02, 0x04, 0xaf,
+ 0xec, 0x0f, 0x00, 0x01, 0xe1, 0x00, 0x0e, 0x0b, 0x21, 0xd0, 0x00, 0x77,
+ 0x63, 0xde, 0xfe, 0x00,
+ 0x0e, 0x0c, 0xf0, 0xf4, 0xa1, 0xfe, 0x00, 0x53, 0x0f, 0xfc, 0x00, 0x35,
+ 0x04, 0x0e, 0xdd, 0x00,
+ 0x2f, 0x01, 0x10, 0x2b, 0x1f, 0x30, 0xfc, 0xe0, 0xf4, 0xa0, 0x0e, 0x2f,
+ 0x40, 0x24, 0x25, 0x01,
+ 0x8e, 0xca, 0x01, 0x10, 0x01, 0x0d, 0x1f, 0x30, 0x0f, 0x5f, 0x10, 0x23,
+ 0x3f, 0x60, 0x12, 0xfd,
+ 0xdb, 0x33, 0x24, 0xdc, 0xce, 0x15, 0x01, 0x9c, 0xff, 0x01, 0xd0, 0xf0,
+ 0x02, 0x25, 0xf0, 0xcf,
+ 0xde, 0x00, 0x11, 0x1f, 0x08, 0x60, 0x37, 0x21, 0x00, 0xdd, 0x00, 0x03,
+ 0x00, 0x3e, 0xc0, 0xb0,
+ 0xdf, 0xf0, 0xe2, 0xff, 0x10, 0x73, 0x04, 0x22, 0x31, 0xe8, 0xef, 0x31,
+ 0x70, 0x00, 0xcf, 0x00,
+ 0xff, 0x00, 0xf4, 0x01, 0xcd, 0xf2, 0xe4, 0x0e, 0x50, 0x25, 0xf0, 0xcf,
+ 0x00, 0x67, 0x02, 0x0b,
+ 0xff, 0x00, 0xf0, 0xfe, 0x20, 0x41, 0x21, 0x52, 0x11, 0x01, 0x00, 0xf8,
+ 0xf0, 0xc0, 0x00, 0xf2,
+ 0x02, 0xf0, 0x0f, 0xec, 0x30, 0x2f, 0x0e, 0x50, 0xf3, 0x89, 0x0e, 0x10,
+ 0x41, 0x21, 0x00, 0x0e,
+ 0xff, 0xf0, 0x15, 0x34, 0xbe, 0xeb, 0xe0, 0xc2, 0x01, 0x71, 0x10, 0x0d,
+ 0xff, 0xd1, 0xe2, 0x20,
+ 0x3e, 0x41, 0xf7, 0xd0, 0xd0, 0x0e, 0x1e, 0x21, 0xe0, 0x97, 0x02, 0x02,
+ 0x30, 0x8d, 0x0f, 0x5f,
+ 0xcc, 0x10, 0x11, 0xf8, 0x0d, 0xd1, 0x44, 0x30, 0xee, 0xc0, 0x00, 0x2f,
+ 0x40, 0xf0, 0xe4, 0x00,
+ 0xf0, 0x01, 0xf2, 0x00, 0xee, 0x1f, 0x27, 0xe2, 0xe0, 0xee, 0x10, 0x6e,
+ 0x20, 0x07, 0x37, 0xde,
+ 0x0e, 0x11, 0x51, 0x50, 0x0d, 0xd0, 0x01, 0x52, 0x0e, 0xff, 0xf0, 0x02,
+ 0x1e, 0xfd, 0xb2, 0x02,
+ 0xfe, 0x10, 0x20, 0xfe, 0xee, 0x12, 0x0e, 0xed, 0x35, 0x71, 0x10, 0x0c,
+ 0x0e, 0x63, 0x06, 0x07,
+ 0x04, 0xfe, 0xec, 0xed, 0xff, 0x00, 0x35, 0xb1, 0xde, 0x0e, 0x40, 0x24,
+ 0xf2, 0x01, 0x0d, 0xdc,
+ 0x20, 0x75, 0x20, 0x0b, 0xd0, 0xf4, 0x1f, 0x6d, 0xff, 0xcf, 0xdf, 0x00,
+ 0x07, 0xf1, 0xd0, 0x00,
+ 0xdd, 0xd3, 0x25, 0x41, 0xf0, 0xbd, 0x0e, 0xfe, 0x2f, 0x71, 0x21, 0x00,
+ 0x00, 0x12, 0x01, 0xf0,
+ 0x01, 0xed, 0x12, 0x27, 0x04, 0xb1, 0xde, 0x01, 0x22, 0x9d, 0xf1, 0x05,
+ 0x3d, 0x1d, 0xe4, 0xc1,
+ 0xf0, 0xe0, 0x34, 0x4e, 0x00, 0x13, 0x22, 0xd8, 0x0d, 0x72, 0x44, 0xf0,
+ 0xcf, 0x0e, 0x20, 0x10,
+ 0x42, 0x62, 0xfc, 0xe1, 0x14, 0x1e, 0xfa, 0xde, 0xee, 0x10, 0x67, 0x00,
+ 0xff, 0x40, 0x40, 0x1f,
+ 0x20, 0x01, 0xc0, 0x0d, 0x37, 0x41, 0x00, 0xc0, 0xd0, 0xec, 0x31, 0x50,
+ 0x0f, 0xcd, 0xfd, 0xfb,
+ 0xe2, 0x14, 0x1e, 0x2b, 0x2f, 0x0f, 0x00, 0xe1, 0x04, 0x73, 0x41, 0x00,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0xf0, 0xfc, 0xaf, 0xf1, 0xf7, 0xe5, 0xfe, 0x10, 0x20, 0xd0, 0x9e, 0x00,
+ 0x3f, 0x03, 0xd0, 0xdb,
+ 0x0f, 0xef, 0x9e, 0xcf, 0x00, 0x37, 0x02, 0x0f, 0xf1, 0x12, 0xc0, 0xd0,
+ 0x2e, 0x5f, 0x22, 0xd7,
+ 0xd1, 0x0e, 0x0a, 0x40, 0x71, 0xa0, 0xf0, 0x7c, 0x00, 0xc4, 0x12, 0x30,
+ 0xef, 0xd4, 0x45, 0x10,
+ 0xee, 0xe0, 0x1d, 0x40, 0x01, 0xef, 0x0b, 0x0f, 0x2b, 0x0e, 0x10, 0x13,
+ 0x03, 0x01, 0xe1, 0x2b,
+ 0x0f, 0xf0, 0x00, 0xd3, 0x00, 0x3e, 0xda, 0x20, 0x31, 0x81, 0x00, 0x00,
+ 0x01, 0xef, 0xdb, 0x30,
+ 0x74, 0x00, 0x0e, 0xe0, 0xf0, 0x21, 0x10, 0x0d, 0xce, 0xff, 0x02, 0x26,
+ 0x22, 0x33, 0xc1, 0xd1,
+ 0xf4, 0xf2, 0x70, 0x41, 0xe2, 0xe7, 0x16, 0x30, 0xdd, 0xd0, 0x30, 0x40,
+ 0x04, 0xf0, 0x8f, 0xbb,
+ 0x00, 0x20, 0x04, 0x00, 0x12, 0x13, 0x0d, 0xca, 0x00, 0x41, 0x04, 0xc0,
+ 0xcb, 0xf0, 0x10, 0x42,
+ 0x03, 0xde, 0xfb, 0x20, 0x4f, 0x0f, 0x22, 0x01, 0x00, 0x30, 0x65, 0x0f,
+ 0xdd, 0xff, 0x10, 0x0d,
+ 0xc0, 0x01, 0xff, 0x0a, 0x10, 0x80, 0x01, 0x07, 0x11, 0x0e, 0x0c, 0x10,
+ 0x0f, 0xde, 0x40, 0x62,
+ 0x22, 0x20, 0x0f, 0xff, 0x10, 0x6f, 0x21, 0x27, 0xe4, 0xb0, 0xf0, 0x0f,
+ 0xef, 0x00, 0x11, 0x0c,
+ 0x8c, 0x0f, 0xf0, 0x04, 0x24, 0xfc, 0x0e, 0x11, 0x36, 0xf0, 0xff, 0xfe,
+ 0x10, 0x00, 0xd4, 0xf2,
+ 0x0f, 0xde, 0x03, 0xe0, 0xaf, 0x2f, 0x00, 0xcc, 0x00, 0x54, 0x52, 0x0c,
+ 0xcf, 0x02, 0x1e, 0x00,
+ 0xe3, 0x34, 0x0a, 0xfb, 0xc0, 0x32, 0x74, 0x11, 0xff, 0xcc, 0x00, 0x02,
+ 0xf5, 0xf0, 0xf0, 0xed,
+ 0x41, 0x54, 0x01, 0x00, 0x0f, 0xfe, 0x0f, 0x33, 0x50, 0x0b, 0xe0, 0x23,
+ 0x67, 0x20, 0x00, 0xf0,
+ 0xcc, 0xf0, 0x0f, 0xf1, 0x02, 0x2f, 0xfd, 0xde, 0xf0, 0xe5, 0x01, 0x0f,
+ 0x7f, 0x10, 0xe0, 0x20,
+ 0x40, 0x0c, 0x0b, 0x62, 0x16, 0xff, 0xbb, 0x00, 0x02, 0x0f, 0x0e, 0xb0,
+ 0x31, 0x11, 0x80, 0x09,
+ 0x10, 0x31, 0x03, 0xb0, 0x0e, 0x4e, 0xee, 0xf2, 0x05, 0x20, 0x0f, 0xcf,
+ 0x11, 0x12, 0x0f, 0xf0,
+ 0xf3, 0x01, 0x07, 0x01, 0x0d, 0xea, 0x00, 0x35, 0x60, 0xfd, 0xfe, 0xf1,
+ 0x11, 0x40, 0xed, 0xe0,
+ 0x20, 0x01, 0x11, 0x43, 0x1e, 0xfa, 0x80, 0xf1, 0x12, 0x30, 0xcb, 0xd1,
+ 0x03, 0x14, 0x1d, 0xff,
+ 0xf0, 0x10, 0x30, 0x13, 0x22, 0x1f, 0x0c, 0x01, 0x30, 0x7e, 0x30, 0xf1,
+ 0xfd, 0x2c, 0xbb, 0xdb,
+ 0x10, 0x06, 0xb3, 0x00, 0xdd, 0x0d, 0x21, 0x40, 0x0f, 0xd0, 0x01, 0x3e,
+ 0x50, 0x15, 0x0f, 0xeb,
+ 0xf1, 0x13, 0x00, 0x01, 0x34, 0xde, 0x8c, 0x21, 0x47, 0x01, 0x00, 0xac,
+ 0x00, 0x10, 0x00, 0x02,
+ 0xf0, 0xe9, 0xe0, 0x4f, 0x12, 0x03, 0xfe, 0x2c, 0x00, 0x50, 0x32, 0x00,
+ 0x00, 0x06, 0xe2, 0xff,
+ 0x8d, 0xee, 0xf0, 0xf0, 0x06, 0x00, 0xec, 0x00, 0x12, 0x01, 0xf0, 0xa0,
+ 0x31, 0x62, 0xff, 0xca,
+ 0x0f, 0x30, 0x41, 0x03, 0xff, 0xec, 0x00, 0x32, 0xd1, 0xe3, 0x0c, 0x0d,
+ 0xf5, 0x16, 0xf0, 0xfc,
+ 0x51, 0x11, 0xd1, 0xe0, 0xfe, 0xde, 0xd0, 0x73, 0x20, 0x0f, 0xdf, 0x35,
+ 0x74, 0x12, 0xcc, 0xec,
+ 0x20, 0x32, 0xf1, 0x00, 0xdd, 0xdf, 0x74, 0x22, 0x0e, 0x0f, 0x02, 0x03,
+ 0xcc, 0xfb, 0x32, 0x45,
+ 0x70, 0x4c, 0xc0, 0xf3, 0x23, 0x2f, 0x0a, 0xd0, 0x00, 0x10, 0xf1, 0xf1,
+ 0x40, 0x20, 0xf1, 0xd3,
+ 0xec, 0x0c, 0x00, 0x00, 0xdd, 0xae, 0x00, 0x15, 0x70, 0x3f, 0x10, 0xbb,
+ 0xff, 0x10, 0x00, 0xe3,
+ 0x23, 0x31, 0xf3, 0x10, 0x1a, 0xc1, 0x13, 0x30, 0x0d, 0x00, 0xc0, 0x27,
+ 0x02, 0xff, 0x70, 0x41,
+ 0xe0, 0xef, 0x13, 0x00, 0x98, 0x0f, 0x00, 0xe4, 0xf0, 0x02, 0xc0, 0x0a,
+ 0x12, 0x31, 0xd0, 0x0e,
+ 0x10, 0x0d, 0xff, 0xc0, 0x45, 0x10, 0x0e, 0x30, 0x20, 0x01, 0xe0, 0x8e,
+ 0xff, 0x07, 0x42, 0xf2,
+ 0xc0, 0xec, 0x0f, 0x12, 0x14, 0xf1, 0x10, 0x0e, 0xfd, 0x0d, 0x70, 0x73,
+ 0x11, 0xf8, 0xeb, 0x10,
+ 0x30, 0x2f, 0x1f, 0xff, 0xf2, 0x15, 0x01, 0x10, 0x0e, 0x9e, 0xef, 0xf0,
+ 0x01, 0x2d, 0xeb, 0xd1,
+ 0x24, 0x30, 0x0b, 0x20, 0x01, 0xf1, 0x30, 0x7f, 0x54, 0x02, 0x0f, 0xbb,
+ 0xff, 0xe0, 0x1f, 0x21,
+ 0xf2, 0xc0, 0x0b, 0xf0, 0x14, 0x64, 0x00, 0x00, 0xf1, 0xe3, 0x00, 0x10,
+ 0x0e, 0xeb, 0xf0, 0x54,
+ 0x20, 0x0c, 0xd1, 0x03, 0xd0, 0x8a, 0xf0, 0x01, 0x21, 0x01, 0x04, 0x32,
+ 0x00, 0xac, 0xe0, 0x13,
+ 0x42, 0x0e, 0xdd, 0x8f, 0x00, 0x0f, 0x3f, 0x0e, 0xe4, 0x07, 0x12, 0x30,
+ 0x30, 0x30, 0xfa, 0xff,
+ 0x4f, 0x55, 0x02, 0xbe, 0xfb, 0xdf, 0x0f, 0xe0, 0x01, 0x03, 0xe0, 0xde,
+ 0xdb, 0x00, 0x42, 0x11,
+ 0x51, 0x2e, 0x4f, 0x3e, 0x0b, 0x10, 0x02, 0x31, 0x1b, 0x5f, 0x42, 0x01,
+ 0x0f, 0xff, 0xd2, 0xf5,
+ 0xf2, 0xef, 0x8a, 0xcf, 0x10, 0x31, 0x21, 0xee, 0xce, 0x0e, 0xf0, 0x05,
+ 0x24, 0x31, 0xdc, 0xbf,
+ 0x13, 0xf3, 0xef, 0x0f, 0x7d, 0xed, 0xe0, 0xf1, 0x17, 0x02, 0x00, 0x10,
+ 0x12, 0x24, 0xfe, 0x0d,
+ 0x1f, 0x7f, 0xe0, 0xa5, 0x60, 0x0b, 0xb0, 0x25, 0x00, 0x1f, 0x0d, 0xbf,
+ 0x10, 0x32, 0xf3, 0xb5,
+ 0x02, 0x30, 0x0b, 0xd0, 0x01, 0x34, 0xff, 0x0b, 0x00, 0x02, 0x01, 0x0f,
+ 0x00, 0x00, 0x7f, 0x01,
+ 0xf4, 0x00, 0x01, 0x1e, 0xfe, 0x06, 0x50, 0x0e, 0xee, 0xd0, 0x10, 0x50,
+ 0x0f, 0xdc, 0x0a, 0xfc,
+ 0x00, 0x40, 0x16, 0x01, 0xe0, 0x0f, 0x00, 0x13, 0x7f, 0x0e, 0xef, 0x20,
+ 0x00, 0xaf, 0x0d, 0x01,
+ 0x10, 0x09, 0xe0, 0x12, 0x40, 0xea, 0xae, 0x1f, 0x31, 0x03, 0x01, 0x00,
+ 0x01, 0x06, 0xf0, 0x00,
+ 0xfd, 0x00, 0x01, 0xc2, 0xf2, 0xe3, 0xfc, 0x9b, 0xf0, 0xf5, 0x21, 0x20,
+ 0x00, 0xfe, 0x41, 0x43,
+ 0xf0, 0x0d, 0xfd, 0xcf, 0x7b, 0x1f, 0x00, 0xd0, 0x01, 0x27, 0xf3, 0xcc,
+ 0x0f, 0x00, 0xe1, 0xe0,
+ 0xeb, 0xbf, 0xf0, 0x01, 0x00, 0x10, 0x32, 0x73, 0x25, 0x10, 0xed, 0x0e,
+ 0x77, 0x25, 0xe0, 0x0d,
+ 0x20, 0x0f, 0xf0, 0x02, 0xef, 0xdd, 0xee, 0xfd, 0x00, 0xcf, 0x05, 0x45,
+ 0x71, 0x32, 0xe0, 0xeb,
+ 0xe0, 0xfe, 0x20, 0x11, 0x1f, 0x00, 0x00, 0x40, 0x52, 0x01, 0xe1, 0xe1,
+ 0x0d, 0xc8, 0x01, 0x26,
+ 0x00, 0xcf, 0xdd, 0x0f, 0x20, 0x60, 0x13, 0x03, 0xfe, 0xda, 0x1f, 0x60,
+ 0x01, 0x03, 0xf0, 0x0e,
+ 0x30, 0x30, 0x00, 0xcc, 0xe1, 0xe7, 0x60, 0xef, 0x82, 0x00, 0xf0, 0x0c,
+ 0x10, 0x25, 0x00, 0xff,
+ 0xdf, 0xef, 0x50, 0x23, 0xa0, 0x0d, 0x0c, 0x31, 0x03, 0x00, 0xdc, 0x24,
+ 0x25, 0x0e, 0x00, 0x10,
+ 0xde, 0xd0, 0x03, 0x13, 0xe0, 0x8c, 0xcf, 0x12, 0x24, 0x14, 0x00, 0x52,
+ 0xf2, 0xbc, 0x30, 0x20,
+ 0x02, 0xde, 0x01, 0x37, 0x02, 0xad, 0xff, 0x03, 0x10, 0x09, 0xee, 0x0f,
+ 0x10, 0x04, 0x00, 0x0d,
+ 0x0c, 0x72, 0x34, 0x0e, 0xdc, 0x53, 0x42, 0x0f, 0x0e, 0x12, 0x00, 0x02,
+ 0x17, 0x23, 0x0d, 0xda,
+ 0xf0, 0x24, 0x01, 0x9f, 0xdd, 0x0d, 0x10, 0x64, 0x11, 0x00, 0x1b, 0x10,
+ 0x1f, 0xef, 0x00, 0x42,
+ 0x00, 0xfc, 0xfd, 0xaf, 0xd0, 0xe5, 0x01, 0x43, 0x43, 0x10, 0x01, 0x01,
+ 0x14, 0x00, 0x11, 0x00,
+ 0x61, 0xf7, 0xaa, 0xff, 0xf3, 0xf3, 0xc3, 0xff, 0xf9, 0x8e, 0xf0, 0x36,
+ 0x73, 0x1c, 0xc8, 0xee,
+ 0x00, 0x35, 0x20, 0xdf, 0xa0, 0x00, 0xe2, 0xf0, 0x00, 0xd0, 0x12, 0x04,
+ 0xef, 0x8f, 0xd0, 0x10,
+ 0x2c, 0xdb, 0xd0, 0x63, 0x02, 0x1f, 0x1b, 0x00, 0x21, 0xd0, 0x12, 0x37,
+ 0xf2, 0x00, 0xdc, 0xe0,
+ 0xb0, 0x01, 0x90, 0xb1, 0x33, 0x21, 0xeb, 0xde, 0x1f, 0x30, 0x02, 0x20,
+ 0x1c, 0x0f, 0x53, 0x47,
+ 0x20, 0xfd, 0xef, 0x20, 0x2f, 0x0e, 0xf0, 0xcf, 0x00, 0x20, 0x10, 0xbf,
+ 0x14, 0x65, 0x0f, 0xfa,
+ 0xf0, 0xdf, 0x0f, 0x00, 0x00, 0xef, 0x52, 0x27, 0x21, 0x0e, 0x5e, 0x10,
+ 0x01, 0xb0, 0x0f, 0x0c,
+ 0xe0, 0x02, 0x03, 0x01, 0xdd, 0xec, 0x53, 0x27, 0xe0, 0xf2, 0x21, 0x00,
+ 0x20, 0x31, 0x23, 0x12,
+ 0x9e, 0xdf, 0xce, 0x0e, 0x1e, 0x1e, 0x00, 0x30, 0xb5, 0xf6, 0x53, 0x81,
+ 0x1d, 0x41, 0xa3, 0x17,
+ 0x03, 0x0d, 0x0d, 0xdf, 0x1e, 0x40, 0x07, 0xe5, 0xfd, 0x2c, 0x30, 0x04,
+ 0xa0, 0x1f, 0x30, 0xf0,
+ 0xe0, 0x0f, 0x0e, 0x20, 0x15, 0x01, 0xde, 0xef, 0x00, 0xdd, 0xb9, 0x00,
+ 0x02, 0xe2, 0x70, 0x09,
+ 0xef, 0x00, 0x3f, 0x31, 0x02, 0x01, 0x2f, 0xfe, 0xfe, 0x01, 0x63, 0x20,
+ 0x00, 0xee, 0xfe, 0x11,
+ 0x03, 0x00, 0x33, 0x2f, 0xe8, 0xf8, 0x00, 0x60, 0x44, 0xd0, 0xd0, 0xe0,
+ 0xcf, 0x20, 0x24, 0xe0,
+ 0xfd, 0x9f, 0xc1, 0x12, 0x41, 0xe0, 0x06, 0x21, 0xdd, 0xca, 0x00, 0x22,
+ 0x21, 0xe0, 0xe0, 0x0e,
+ 0x70, 0x25, 0x00, 0xe0, 0xff, 0xd0, 0x02, 0x03, 0xef, 0xcd, 0xdf, 0xed,
+ 0x14, 0x12, 0xdd, 0xbe,
+ 0x20, 0x20, 0x0e, 0x0d, 0xe5, 0x05, 0x70, 0x75, 0x43, 0xfe, 0xfe, 0x21,
+ 0x01, 0xf1, 0xe2, 0x17,
+ 0x40, 0x0d, 0xec, 0xf0, 0xf0, 0x22, 0x40, 0x01, 0x26, 0x10, 0x10, 0x20,
+ 0xcf, 0xfa, 0x60, 0x21,
+ 0x21, 0xf0, 0xaa, 0x00, 0xf1, 0xf0, 0x00, 0x02, 0x0e, 0x40, 0x54, 0x0d,
+ 0xea, 0xd0, 0x30, 0x50,
+ 0xef, 0xf0, 0x04, 0xde, 0xbb, 0x00, 0x12, 0x72, 0x0f, 0xfc, 0x21, 0x0f,
+ 0x0d, 0xf0, 0xe3, 0x07,
+ 0x20, 0xd0, 0xae, 0xe1, 0xf0, 0x00, 0xe0, 0xc2, 0xf2, 0xf2, 0x0f, 0x0c,
+ 0x00, 0x14, 0x63, 0x1d,
+ 0x0b, 0x01, 0x23, 0x13, 0x30, 0x3e, 0x5f, 0x13, 0x00, 0x88, 0xdb, 0x00,
+ 0x12, 0xe0, 0xcc, 0x0f,
+ 0x00, 0xf2, 0xc4, 0x0f, 0x7e, 0x10, 0xd2, 0x1f, 0x3a, 0xe0, 0x02, 0x07,
+ 0x50, 0xf0, 0xe0, 0x4e,
+ 0x10, 0x00, 0x13, 0x20, 0x0c, 0x00, 0xb0, 0x0f, 0xdd, 0x0b, 0x1f, 0xec,
+ 0xa1, 0x15, 0x51, 0x0f,
+ 0xee, 0x00, 0x33, 0x10, 0x3d, 0xd0, 0xf2, 0x6f, 0x0c, 0x00, 0xec, 0xb0,
+ 0x03, 0x34, 0xfe, 0xde,
+ 0x22, 0x16, 0x01, 0x01, 0x23, 0x43, 0xe0, 0xa8, 0x00, 0x30, 0x02, 0x10,
+ 0xeb, 0xcf, 0x0f, 0x32,
+ 0x14, 0x5d, 0x10, 0x04, 0x00, 0xd0, 0xcf, 0x23, 0x02, 0x8e, 0x01, 0x33,
+ 0xff, 0xda, 0xfe, 0xcf,
+ 0x03, 0xf6, 0x0f, 0x5d, 0xfb, 0xe0, 0x00, 0x22, 0xf3, 0x10, 0x31, 0x42,
+ 0x0f, 0xdc, 0xff, 0xbe,
+ 0xdc, 0x01, 0x37, 0x61, 0xef, 0xee, 0x4f, 0xf0, 0xc3, 0x01, 0x33, 0x23,
+ 0x24, 0xf1, 0x0e, 0x0d,
+ 0xf0, 0x75, 0x47, 0x00, 0xbc, 0xff, 0x00, 0x0f, 0xd0, 0x00, 0x14, 0x30,
+ 0xeb, 0xaf, 0x0f, 0x51,
+ 0x11, 0x00, 0x00, 0x01, 0x20, 0x20, 0x23, 0x00, 0x0e, 0xef, 0x0f, 0xff,
+ 0xff, 0x92, 0x07, 0x17,
+ 0x00, 0xef, 0xfe, 0x30, 0x71, 0x13, 0x00, 0x00, 0xfa, 0x0e, 0x10, 0x02,
+ 0x02, 0x10, 0x0e, 0xbb,
+ 0xef, 0x00, 0x01, 0x02, 0x3e, 0x01, 0xe6, 0xdf, 0x6f, 0x42, 0x07, 0x00,
+ 0xef, 0x10, 0x40, 0x1e,
+ 0x0d, 0x3f, 0xe1, 0x83, 0x4e, 0x0a, 0xa0, 0x13, 0x21, 0x12, 0xc0, 0xee,
+ 0x11, 0x03, 0xc6, 0x03,
+ 0x10, 0x1a, 0xee, 0xe2, 0x74, 0x10, 0x0f, 0xfe, 0xfe, 0x01, 0x32, 0xff,
+ 0xee, 0x4f, 0x0f, 0xc0,
+ 0x22, 0x10, 0xc5, 0xf3, 0x1d, 0x0c, 0x93, 0x07, 0x17, 0xfd, 0xbf, 0x00,
+ 0x22, 0x30, 0xdd, 0x0e,
+ 0x30, 0x2e, 0x30, 0x00, 0xce, 0x31, 0x77, 0x04, 0x0d, 0x0e, 0xf1, 0x02,
+ 0x3e, 0xee, 0xc0, 0x21,
+ 0x1f, 0xda, 0xf0, 0x64, 0x22, 0xfe, 0xec, 0xde, 0xf0, 0x20, 0x10, 0xfd,
+ 0x0f, 0x30, 0x50, 0x05,
+ 0x21, 0x41, 0x02, 0x8f, 0x0f, 0x10, 0xfc, 0xfe, 0x02, 0x04, 0xf3, 0xed,
+ 0xc8, 0xff, 0x21, 0x76,
+ 0xe0, 0xcd, 0x12, 0x47, 0x00, 0x00, 0x1f, 0x00, 0xdf, 0x00, 0x01, 0xf2,
+ 0xd0, 0xdf, 0x0f, 0xd0,
+ 0xb1, 0x10, 0x00, 0x26, 0x02, 0xdf, 0x0a, 0x30, 0x34, 0xd0, 0x9f, 0x0c,
+ 0x30, 0x73, 0x74, 0xf0,
+ 0xff, 0x0e, 0x00, 0x0f, 0xfe, 0x03, 0x45, 0x0d, 0xde, 0xf4, 0x03, 0x0d,
+ 0x0d, 0x12, 0xd2, 0xc0,
+ 0x2d, 0x18, 0xed, 0x00, 0x55, 0xf0, 0x11, 0x3b, 0xdf, 0x00, 0x0f, 0x00,
+ 0x00, 0x80, 0xdf, 0x30,
+ 0x41, 0x42, 0x0f, 0xec, 0xfb, 0xf0, 0x70, 0x24, 0x2f, 0x0b, 0xe0, 0x11,
+ 0x22, 0x20, 0xf0, 0xe1,
+ 0xd2, 0xa0, 0x0f, 0xfd, 0xe4, 0x07, 0x21, 0xe0, 0x00, 0xf1, 0xa0, 0xd8,
+ 0xb0, 0xef, 0x70, 0x03,
+ 0xf0, 0xfe, 0x2f, 0x22, 0xd2, 0x01, 0x1e, 0xdd, 0x04, 0xd7, 0x03, 0x60,
+ 0xcb, 0xe0, 0x00, 0x00,
+ 0xf0, 0xd0, 0x20, 0x70, 0x1d, 0xcf, 0x01, 0x23, 0x01, 0x22, 0x22, 0xfc,
+ 0xea, 0x0e, 0x03, 0x17,
+ 0x11, 0x00, 0x70, 0x00, 0xc0, 0x10, 0x31, 0x0e, 0xdb, 0xc0, 0x40, 0x00,
+ 0xf0, 0x60, 0x02, 0xed,
+ 0xfd, 0x07, 0x64, 0x10, 0x0c, 0xe0, 0x00, 0x20, 0x0f, 0x0c, 0xb0, 0x01,
+ 0x21, 0x0f, 0x0e, 0xf1,
+ 0xd1, 0x11, 0x72, 0x05, 0xf0, 0x1e, 0x3d, 0xca, 0x0f, 0xe1, 0x31, 0x10,
+ 0xff, 0x0e, 0x2f, 0x02,
+ 0x30, 0x30, 0xd4, 0x8b, 0xde, 0x01, 0x04, 0xf0, 0x11, 0x25, 0xa1, 0xe0,
+ 0x0e, 0xfe, 0x9b, 0x10,
+ 0x26, 0x15, 0xfe, 0xdc, 0x10, 0x42, 0xf1, 0x1f, 0xef, 0x82, 0x23, 0x2f,
+ 0xfd, 0xe1, 0x47, 0x00,
+ 0xec, 0xf0, 0x41, 0x01, 0xcd, 0x0a, 0x00, 0x02, 0x00, 0x00, 0xe2, 0xf3,
+ 0x50, 0x1f, 0xec, 0x00,
+ 0x02, 0x24, 0x41, 0x00, 0xdf, 0x0f, 0x5f, 0x01, 0x1f, 0x0a, 0x0f, 0x00,
+ 0x04, 0x0f, 0x1c, 0x00,
+ 0x1e, 0x50, 0x11, 0x20, 0xd0, 0xc3, 0xb0, 0x0f, 0x33, 0x50, 0x0e, 0x13,
+ 0x10, 0xf8, 0xee, 0x02,
+ 0x12, 0x2c, 0x5f, 0x00, 0xcd, 0x0f, 0x06, 0x06, 0x00, 0xef, 0x80, 0x15,
+ 0x41, 0xec, 0xce, 0xff,
+ 0xf1, 0x22, 0x40, 0xf0, 0xdc, 0x20, 0x31, 0x01, 0xcf, 0x23, 0x23, 0x0e,
+ 0xce, 0xf7, 0x04, 0x0e,
+ 0xaa, 0xe1, 0x13, 0x31, 0xef, 0xf0, 0x15, 0x0e, 0xfd, 0xef, 0xd0, 0x20,
+ 0x71, 0x00, 0xdb, 0xd0,
+ 0x03, 0x20, 0xd0, 0xd4, 0x22, 0x51, 0x22, 0x8b, 0xca, 0x00, 0x51, 0x14,
+ 0x0e, 0xdd, 0x30, 0x53,
+ 0x0f, 0xd0, 0x21, 0x57, 0x22, 0xf0, 0x9d, 0x01, 0x02, 0x10, 0x00, 0xf1,
+ 0xb2, 0x0b, 0x1b, 0x00,
+ 0x0f, 0x20, 0x21, 0x00, 0xfd, 0x01, 0x30, 0x51, 0x12, 0xff, 0xdc, 0xee,
+ 0x02, 0x17, 0x54, 0xfe,
+ 0xdf, 0x03, 0x22, 0x0f, 0x0c, 0x33, 0x73, 0x0f, 0x0f, 0xed, 0xdd, 0x10,
+ 0x31, 0x52, 0x13, 0xdd,
+ 0xe8, 0x30, 0x60, 0x03, 0x07, 0xef, 0xec, 0xe0, 0xf3, 0xe0, 0xc0, 0x0e,
+ 0xef, 0xfc, 0x0e, 0x71,
+ 0x46, 0x10, 0x10, 0x1d, 0x00, 0x26, 0x00, 0xef, 0xcc, 0xe0, 0x00, 0xfe,
+ 0xf0, 0x03, 0x01, 0xcf,
+ 0xc2, 0x13, 0x0f, 0x89, 0xbf, 0xfd, 0x01, 0x17, 0x51, 0x00, 0xfc, 0xf1,
+ 0x22, 0x30, 0x00, 0x0c,
+ 0xff, 0x10, 0x40, 0x00, 0xb2, 0x02, 0x00, 0x0d, 0xee, 0x9f, 0x0e, 0xef,
+ 0x03, 0x27, 0x15, 0xf1,
+ 0xe1, 0xfe, 0x0e, 0x2f, 0x00, 0x03, 0x00, 0x0f, 0x70, 0x0d, 0x0f, 0x02,
+ 0x33, 0x76, 0x32, 0xcb,
+ 0xea, 0xf0, 0x11, 0x10, 0x02, 0xf5, 0x20, 0x5c, 0xfe, 0xfe, 0x10, 0x21,
+ 0x02, 0xe0, 0xef, 0x00,
+ 0x4b, 0xdf, 0x10, 0x70, 0x01, 0xe0, 0xe6, 0x13, 0x50, 0xeb, 0xc0, 0xf0,
+ 0x43, 0x40, 0x00, 0xbc,
+ 0x0f, 0x10, 0x30, 0x00, 0xf0, 0xe2, 0x02, 0x27, 0x43, 0xe0, 0xde, 0xec,
+ 0xf0, 0x14, 0x13, 0x9d,
+ 0xec, 0x05, 0x52, 0x0d, 0xcc, 0xf1, 0x03, 0x3f, 0x0d, 0x04, 0x14, 0x01,
+ 0xde, 0x0d, 0x60, 0x03,
+ 0x02, 0x0e, 0xfc, 0x13, 0x54, 0x00, 0x02, 0x03, 0x03, 0x2e, 0xcb, 0x90,
+ 0x0f, 0x00, 0xf0, 0xe8,
+ 0xef, 0x23, 0x55, 0x10, 0x1f, 0xfd, 0xcd, 0x00, 0x02, 0x2f, 0x2e, 0xff,
+ 0x9c, 0x00, 0x16, 0x32,
+ 0x0f, 0xba, 0x00, 0xf0, 0x01, 0x00, 0x1a, 0x2f, 0x50, 0x34, 0x00, 0xdb,
+ 0x00, 0x30, 0x71, 0x01,
+ 0x00, 0x0f, 0x30, 0x00, 0xe1, 0xa0, 0x02, 0x04, 0x00, 0xdd, 0xc0, 0x02,
+ 0xf3, 0x0f, 0x0f, 0x73,
+ 0x37, 0x00, 0xdc, 0x0c, 0x10, 0x2e, 0xff, 0xc0, 0x01, 0xe5, 0x02, 0xd2,
+ 0x0e, 0x30, 0xb0, 0xd0,
+ 0x02, 0x05, 0x14, 0xe0, 0xb9, 0x0f, 0xb0, 0x0f, 0x00, 0x51, 0x12, 0x0e,
+ 0x00, 0x46, 0x31, 0x00,
+ 0x01, 0xf1, 0xe0, 0xf0, 0xf0, 0xdb, 0x21, 0x75, 0x10, 0x10, 0x00, 0x03,
+ 0x0f, 0xec, 0xc0, 0x1f,
+ 0x1d, 0x2e, 0xed, 0x8f, 0x06, 0x75, 0x10, 0x2f, 0x00, 0x24, 0x01, 0xfd,
+ 0x00, 0x00, 0x0f, 0xbc,
+ 0xcd, 0x00, 0x20, 0x0f, 0x0e, 0xf0, 0xe4, 0x01, 0x0e, 0x30, 0x47, 0x00,
+ 0x00, 0x0e, 0x60, 0x0f,
+ 0xfd, 0x0e, 0x4f, 0x30, 0x30, 0xbf, 0xdd, 0x03, 0x27, 0x77, 0x00, 0xbd,
+ 0x0e, 0x00, 0xf3, 0xff,
+ 0xdc, 0x01, 0xf6, 0x01, 0xd0, 0xec, 0x21, 0x72, 0x21, 0x0f, 0x0d, 0xb0,
+ 0xf1, 0xe1, 0xfb, 0xee,
+ 0x12, 0x51, 0x00, 0x0f, 0x04, 0x01, 0xfd, 0xee, 0x03, 0x40, 0x1e, 0xd8,
+ 0xa9, 0x02, 0x41, 0x10,
+ 0x12, 0x02, 0xe0, 0xde, 0x11, 0x05, 0xf0, 0x9e, 0xee, 0x00, 0x30, 0x24,
+ 0x2e, 0x2d, 0x60, 0x22,
+ 0xe0, 0x00, 0x21, 0x53, 0x1d, 0xe8, 0xc9, 0xde, 0xff, 0x20, 0x32, 0xd0,
+ 0xa0, 0x20, 0x0e, 0x0f,
+ 0x20, 0x21, 0x03, 0x00, 0x34, 0x57, 0xf0, 0xcf, 0x10, 0x3f, 0x00, 0xb0,
+ 0xdc, 0xe0, 0x54, 0x13,
+ 0x00, 0xe0, 0x0e, 0x00, 0x11, 0x02, 0xed, 0xf9, 0xf0, 0x10, 0x5c, 0x30,
+ 0x33, 0x41, 0x03, 0x07,
+ 0x11, 0xad, 0xca, 0xe0, 0xe0, 0xd0, 0xa0, 0x00, 0x01, 0x13, 0x02, 0x0f,
+ 0x21, 0x57, 0x13, 0x00,
+ 0x0d, 0xf0, 0xee, 0xd0, 0xf0, 0x10, 0xee, 0x8c, 0xff, 0x00, 0x0f, 0x06,
+ 0x53, 0x14, 0x0e, 0x0b,
+ 0xff, 0x60, 0x22, 0x00, 0xed, 0x00, 0x05, 0x00, 0xee, 0x13, 0x46, 0x10,
+ 0xfe, 0xc0, 0x01, 0xdf,
+ 0xbf, 0x00, 0x50, 0x14, 0x00, 0xeb, 0xfd, 0x2d, 0x4f, 0x42, 0x04, 0x00,
+ 0xdd, 0xe0, 0xf1, 0xe5,
+ 0x02, 0xff, 0x8c, 0xdf, 0x01, 0x03, 0x02, 0x30, 0x5d, 0x0d, 0x24, 0x27,
+ 0x74, 0x1e, 0x1f, 0x0e,
+ 0x00, 0x01, 0xf0, 0x02, 0x01, 0xd5, 0x24, 0x30, 0xdf, 0xdb, 0xfe, 0xcf,
+ 0xf0, 0xf2, 0x20, 0x4f,
+ 0xdf, 0x10, 0x20, 0x25, 0x12, 0xbc, 0xcc, 0x00, 0x53, 0x40, 0xd0, 0xdc,
+ 0x32, 0x05, 0x00, 0xbf,
+ 0xef, 0x12, 0xdd, 0xba, 0x20, 0x14, 0x00, 0x0f, 0x20, 0x51, 0x03, 0xbb,
+ 0xee, 0x11, 0x63, 0x00,
+ 0x20, 0x01, 0xf3, 0x05, 0x1e, 0x0d, 0x10, 0x35, 0x32, 0xf1, 0xa0, 0xec,
+ 0xdf, 0xed, 0x40, 0x21,
+ 0xf5, 0xb3, 0xec, 0xdb, 0x0f, 0x0f, 0xf4, 0x14, 0xe0, 0x8c, 0xb0, 0x10,
+ 0x10, 0x20, 0xf0, 0x1f,
+ 0x1f, 0x11, 0x22, 0x42, 0x1e, 0x0c, 0xb0, 0xe0, 0x0f, 0x40, 0x32, 0xe0,
+ 0xe4, 0x77, 0x47, 0x00,
+ 0x0f, 0x0c, 0x00, 0x10, 0x0e, 0x0f, 0xe0, 0xce, 0x0e, 0x00, 0x04, 0xdf,
+ 0x8a, 0x0f, 0x0f, 0x00,
+ 0x00, 0x15, 0x0e, 0xfe, 0x00, 0x61, 0x12, 0x0e, 0xf0, 0x10, 0xfd, 0x0d,
+ 0x36, 0x03, 0x92, 0xe2,
+ 0x04, 0xfe, 0xed, 0x02, 0x24, 0x01, 0xd0, 0x00, 0x30, 0x34, 0xe2, 0xbd,
+ 0x36, 0x55, 0x00, 0xfe,
+ 0x10, 0x5e, 0xf0, 0xf2, 0x04, 0x00, 0x0b, 0xa0, 0x01, 0x22, 0x12, 0x0f,
+ 0xcd, 0x10, 0x03, 0x9e,
+ 0x0f, 0x04, 0xf4, 0x11, 0x30, 0x0c, 0x0c, 0x10, 0x30, 0x04, 0x9b, 0x0e,
+ 0x41, 0x00, 0xd9, 0xfe,
+ 0x21, 0x35, 0xd0, 0xb0, 0x0f, 0xd0, 0xe3, 0xf1, 0x01, 0x0f, 0x7c, 0x40,
+ 0x2e, 0x0a, 0x0d, 0x40,
+ 0x63, 0x02, 0x0e, 0xee, 0x0e, 0x10, 0x26, 0x12, 0x0f, 0xec, 0xc0, 0xe0,
+ 0xc0, 0x00, 0xf0, 0xcd,
+ 0xde, 0x00, 0x00, 0x4e, 0xd9, 0xe0, 0x53, 0x52, 0x14, 0x10, 0x0c, 0x0f,
+ 0xf0, 0xe0, 0x0d, 0xe5,
+ 0xe4, 0xe0, 0xf0, 0x06, 0xc0, 0xd3, 0xc0, 0xbf, 0xdc, 0xf0, 0x05, 0xe0,
+ 0xec, 0x20, 0x50, 0x11,
+ 0x30, 0x71, 0x35, 0x10, 0xde, 0xf0, 0x01, 0xb0, 0xfe, 0x01, 0xd2, 0xd0,
+ 0xf0, 0x0f, 0x0d, 0xcd,
+ 0xfe, 0x30, 0x67, 0x46, 0x2e, 0x0d, 0x22, 0x31, 0x21, 0xfe, 0xab, 0x00,
+ 0x20, 0x42, 0x24, 0x21,
+ 0x24, 0xd0, 0xaf, 0x00, 0x11, 0x5c, 0xf9, 0xf0, 0x00, 0x0f, 0x0f, 0xed,
+ 0x34, 0x77, 0x10, 0xce,
+ 0xef, 0x0f, 0x10, 0x30, 0x13, 0x21, 0x00, 0xcd, 0xfc, 0x1e, 0x30, 0x22,
+ 0x24, 0x11, 0xef, 0x0e,
+ 0x4e, 0x1e, 0xdc, 0x8e, 0xff, 0xc0, 0xc8, 0xcc, 0xf0, 0x04, 0x11, 0x11,
+ 0x23, 0x13, 0x01, 0x24,
+ 0x22, 0xaf, 0xdb, 0xf0, 0x00, 0x00, 0xe2, 0x10, 0x63, 0x00, 0xed, 0xfe,
+ 0x10, 0x0e, 0xd0, 0x13,
+ 0x40, 0x19, 0x1d, 0x02, 0x07, 0xc0, 0xef, 0xdf, 0xc2, 0xe4, 0x2f, 0x1b,
+ 0xff, 0x80, 0xa1, 0x00,
+ 0x0f, 0x0c, 0x1f, 0x23, 0x12, 0x1e, 0x3e, 0x73, 0x25, 0x01, 0x33, 0x20,
+ 0x0b, 0xec, 0xdd, 0x0e,
+ 0x0d, 0x0f, 0xc3, 0x47, 0x31, 0xef, 0x9d, 0x1d, 0x30, 0x03, 0xf2, 0xff,
+ 0x60, 0x21, 0x0c, 0xdd,
+ 0x00, 0x21, 0xf4, 0xbc, 0xed, 0x10, 0x07, 0x15, 0x20, 0x20, 0x41, 0x0f,
+ 0x4e, 0x02, 0xe2, 0x8f,
+ 0xfa, 0x00, 0x00, 0x01, 0x20, 0x31, 0x57, 0x00, 0xd0, 0xec, 0xef, 0xef,
+ 0x02, 0x02, 0x12, 0x03,
+ 0xf2, 0x9f, 0xfe, 0xf1, 0x26, 0x33, 0x13, 0x0f, 0xcd, 0xd0, 0xfc, 0xde,
+ 0xe0, 0x8e, 0xff, 0x00,
+ 0x00, 0xe8, 0x09, 0x50, 0x60, 0x20, 0xe2, 0x00, 0x10, 0x21, 0xee, 0xef,
+ 0x23, 0x03, 0xc0, 0xf4,
+ 0x15, 0x00, 0xbd, 0xff, 0x12, 0x14, 0x0f, 0x0c, 0xf0, 0x1e, 0x51, 0x23,
+ 0x42, 0x20, 0x0e, 0x0f,
+ 0x6e, 0x03, 0x04, 0x00, 0xf3, 0x0f, 0xe9, 0xaf, 0x00, 0x34, 0xfc, 0xec,
+ 0x20, 0x31, 0xef, 0x00,
+ 0x53, 0x33, 0x2c, 0xee, 0x00, 0x35, 0x00, 0xfe, 0xe0, 0x34, 0x75, 0x62,
+ 0xe2, 0xd0, 0x0e, 0x01,
+ 0x00, 0x08, 0x2f, 0xf0, 0xa0, 0xf0, 0xfd, 0x00, 0x22, 0x01, 0x51, 0x53,
+ 0xff, 0xc8, 0xee, 0x13,
+ 0x32, 0x0f, 0xf1, 0x05, 0x1e, 0xee, 0x00, 0x12, 0x24, 0xbf, 0xb9, 0x00,
+ 0x00, 0xf0, 0x8b, 0xe0,
+ 0x11, 0x30, 0x11, 0xe0, 0x10, 0x00, 0x00, 0xc0, 0x11, 0x66, 0x20, 0x0b,
+ 0xed, 0x10, 0x42, 0x45,
+ 0x00, 0xae, 0xef, 0xe0, 0x01, 0x16, 0x00, 0xe0, 0x00, 0x22, 0x00, 0xfb,
+ 0xcf, 0x10, 0x11, 0x00,
+ 0xf0, 0x10, 0x30, 0x62, 0x01, 0xe1, 0xf0, 0x10, 0xfb, 0x00, 0x2c, 0x10,
+ 0xc0, 0xb0, 0x0e, 0x20,
+ 0x40, 0xf1, 0xcd, 0x3e, 0x75, 0x42, 0x00, 0x03, 0x17, 0x04, 0x10, 0xfe,
+ 0xea, 0xef, 0xee, 0x21,
+ 0x15, 0xc1, 0xd2, 0x1e, 0x4e, 0x0f, 0x0f, 0x51, 0x21, 0x0e, 0x00, 0x00,
+ 0xc1, 0x00, 0x8e, 0x00,
+ 0x92, 0xf7, 0x5d, 0xe2, 0x04, 0xf6, 0x2e, 0xe4, 0x3d, 0x4a, 0x5e, 0x30,
+ 0x20, 0x2d, 0x3d, 0x4d,
+ 0x2f, 0x40, 0x23, 0x22, 0x22, 0x33, 0x36, 0x24, 0x23, 0x12, 0x13, 0x03,
+ 0x05, 0x03, 0x23, 0x42,
+ 0x46, 0x44, 0x34, 0x22, 0x01, 0xf1, 0xb0, 0xd1, 0xd2, 0xd3, 0xd2, 0xb3,
+ 0x05, 0x04, 0x04, 0x03,
+ 0x02, 0x13, 0x13, 0x05, 0x13, 0x42, 0x74, 0x65, 0x32, 0x33, 0x31, 0x42,
+ 0x22, 0x22, 0x23, 0x47,
+ 0x42, 0x12, 0x01, 0x01, 0xd1, 0xd2, 0xe3, 0xc3, 0xd2, 0xc2, 0xd3, 0xe2,
+ 0xf2, 0xd1, 0xc0, 0xcb,
+ 0xcb, 0xec, 0xbd, 0xdb, 0xce, 0xed, 0xee, 0x0e, 0x1e, 0x3d, 0x2d, 0x3e,
+ 0x2c, 0x3c, 0x4d, 0x3d,
+ 0x5c, 0x3e, 0x2c, 0x0c, 0x0c, 0x0d, 0xfd, 0xec, 0x0e, 0x3e, 0x4e, 0x3f,
+ 0x5e, 0x4f, 0x2e, 0x2d,
+ 0x1e, 0x1d, 0xfd, 0xde, 0xbd, 0xaa, 0xbc, 0xde, 0xd0, 0xd0, 0xbf, 0xe1,
+ 0xd1, 0xd0, 0xdf, 0xcf,
+ 0xe1, 0xc7, 0xe2, 0xd4, 0xe3, 0xe3, 0xe5, 0xd2, 0xd2, 0xb1, 0xc1, 0xc3,
+ 0xd3, 0xb3, 0xe3, 0xe5,
+ 0xe5, 0xe4, 0xf1, 0xf2, 0xf3, 0x15, 0x34, 0x23, 0x33, 0x43, 0x44, 0x33,
+ 0x44, 0x23, 0x12, 0x12,
+ 0x01, 0x33, 0x74, 0x33, 0x13, 0x23, 0x33, 0x52, 0x41, 0x20, 0x3f, 0x4f,
+ 0x2b, 0x2c, 0x2d, 0x2c,
+ 0x1e, 0x20, 0x3f, 0x3f, 0x50, 0x30, 0x2b, 0x3d, 0x5e, 0x40, 0x30, 0x2b,
+ 0x1c, 0x1c, 0x3f, 0x40,
+ 0x30, 0x60, 0x30, 0x60, 0x22, 0x30, 0x30, 0x32, 0x30, 0x3c, 0x2b, 0x2c,
+ 0x1b, 0x1e, 0x0e, 0x0f,
+ 0x10, 0x01, 0xe1, 0xc2, 0xb3, 0xc4, 0xc2, 0xd6, 0xe3, 0xe2, 0xe2, 0xc2,
+ 0xe2, 0xc1, 0xe3, 0xf3,
+ 0x03, 0xe3, 0xc2, 0xe0, 0xcd, 0xc8, 0xce, 0xdd, 0xc0, 0xde, 0xcd, 0xdd,
+ 0xed, 0xd0, 0xe2, 0xc2,
+ 0xe4, 0xd7, 0xd7, 0xd2, 0xe1, 0xe0, 0xe0, 0xf2, 0x02, 0x02, 0x03, 0xd0,
+ 0xfe, 0x2e, 0x5e, 0x0d,
+ 0xfb, 0xdd, 0xef, 0xec, 0xea, 0xfd, 0x0d, 0xfb, 0xdc, 0xfd, 0x7d, 0x7d,
+ 0x4b, 0x1d, 0x0b, 0x0d,
+ 0xfd, 0x0c, 0x0d, 0x4e, 0x4d, 0x1d, 0x0c, 0x0d, 0xfd, 0xdd, 0xfe, 0x20,
+ 0x2f, 0xff, 0x0d, 0x1e,
+ 0x7f, 0x30, 0x3e, 0x4d, 0x2c, 0x0e, 0x0d, 0xed, 0xea, 0x0d, 0xfc, 0x9d,
+ 0xde, 0xed, 0x2d, 0x4b,
+ 0xdd, 0x9b, 0xde, 0xbe, 0xde, 0xc0, 0xce, 0xcf, 0xc0, 0xc0, 0xd0, 0xbe,
+ 0xec, 0xe0, 0xdf, 0xcd,
+ 0xdc, 0xdd, 0xe0, 0xf5, 0xf4, 0xf0, 0xf0, 0xed, 0xfe, 0xe0, 0xe1, 0xc0,
+ 0xce, 0xee, 0xd0, 0xdf,
+ 0xbd, 0xd0, 0xd0, 0xc0, 0xe0, 0xf0, 0x03, 0x00, 0x01, 0x10, 0x2f, 0x25,
+ 0x67, 0x17, 0x10, 0x11,
+ 0x15, 0x14, 0x33, 0x33, 0x23, 0xf1, 0xa1, 0x02, 0x00, 0xec, 0xcb, 0xff,
+ 0x0e, 0xfd, 0x0c, 0x2e,
+ 0x4f, 0x1e, 0x2d, 0x5e, 0x3b, 0x0d, 0x0f, 0x20, 0x71, 0x21, 0x02, 0x00,
+ 0xef, 0x01, 0x57, 0x53,
+ 0x36, 0x22, 0x33, 0x44, 0x55, 0x22, 0x21, 0x22, 0x33, 0x52, 0x22, 0x33,
+ 0x23, 0x24, 0x25, 0x12,
+ 0x12, 0x02, 0xf2, 0xc0, 0xe0, 0xe0, 0xf2, 0xd0, 0xae, 0xd0, 0xf7, 0xe2,
+ 0xd1, 0xc1, 0xf3, 0xf5,
+ 0xd1, 0x81, 0xe0, 0xd0, 0xe3, 0xd2, 0xd1, 0xc2, 0xe3, 0xe1, 0x04, 0x24,
+ 0x44, 0x44, 0x32, 0x30,
+ 0x4f, 0x3d, 0x30, 0x47, 0x42, 0x10, 0x10, 0x10, 0x12, 0x23, 0x13, 0x46,
+ 0x43, 0x44, 0x22, 0x20,
+ 0x00, 0xe0, 0xd0, 0xe0, 0xf3, 0xf3, 0xc2, 0xf4, 0x05, 0xf3, 0xe3, 0xc0,
+ 0xc1, 0xe0, 0xe0, 0x02,
+ 0xf5, 0xf0, 0xbe, 0xeb, 0x2e, 0x72, 0x77, 0x23, 0x23, 0x41, 0x35, 0x43,
+ 0x34, 0x44, 0x33, 0x32,
+ 0x32, 0x43, 0x21, 0x20, 0x31, 0x22, 0x20, 0x2e, 0x2e, 0x4c, 0x3c, 0x6d,
+ 0x2d, 0x2c, 0x3d, 0x2a,
+ 0x4d, 0x5d, 0x2d, 0x2b, 0x2e, 0x2c, 0x1e, 0x2c, 0x1d, 0x1d, 0x0e, 0xfd,
+ 0xee, 0xbd, 0xed, 0xde,
+ 0xef, 0xee, 0xde, 0xff, 0x00, 0xf1, 0x22, 0x77, 0x73, 0x24, 0x15, 0x33,
+ 0x12, 0x11, 0xf0, 0xf3,
+ 0x04, 0x03, 0x12, 0x03, 0xd1, 0xc1, 0xd2, 0x02, 0x42, 0x77, 0x44, 0x32,
+ 0x32, 0x42, 0x25, 0x25,
+ 0x35, 0x43, 0x33, 0x13, 0x23, 0x22, 0x13, 0x03, 0x02, 0x02, 0xe2, 0xd3,
+ 0xa2, 0xc4, 0xd0, 0xc1,
+ 0xd2, 0xe3, 0x05, 0x03, 0x11, 0x11, 0x31, 0x42, 0x30, 0x6f, 0x20, 0x21,
+ 0x20, 0x2f, 0x1c, 0x4b,
+ 0x4d, 0x1b, 0x0c, 0x0d, 0x0c, 0x0d, 0x3e, 0x5c, 0x2b, 0x2d, 0x5e, 0x4e,
+ 0x2d, 0x3c, 0x3e, 0x5e,
+ 0x3e, 0x2c, 0x2c, 0x1c, 0x1e, 0x0e, 0x0e, 0x2e, 0xdc, 0x9c, 0xde, 0xcc,
+ 0xcd, 0xdd, 0xdd, 0xdd,
+ 0xce, 0xe0, 0xe0, 0xe1, 0xef, 0xd0, 0xc0, 0xc2, 0xb0, 0xd1, 0xe7, 0xc4,
+ 0xd0, 0xb0, 0xd0, 0xe4,
+ 0xc4, 0xe2, 0xd2, 0xcf, 0xcd, 0xde, 0xe1, 0xd7, 0xd0, 0xd0, 0xd0, 0xcf,
+ 0xde, 0xd0, 0xd1, 0xd5,
+ 0xe5, 0xe2, 0xd1, 0x01, 0x02, 0x12, 0x01, 0x05, 0x14, 0x43, 0x22, 0x21,
+ 0x72, 0x24, 0x21, 0x20,
+ 0x40, 0x41, 0x20, 0x2e, 0x2c, 0x1b, 0x0b, 0xfd, 0xed, 0xde, 0x0f, 0x7f,
+ 0x50, 0x32, 0x41, 0x52,
+ 0x33, 0x32, 0x43, 0x32, 0x2e, 0x39, 0x30, 0x51, 0x2f, 0x4d, 0x3e, 0x4d,
+ 0x4d, 0x2e, 0x2c, 0x2b,
+ 0x2e, 0x2e, 0x1e, 0x1c, 0x0a, 0x0c, 0xdd, 0xcd, 0xce, 0xcc, 0xde, 0xef,
+ 0xd0, 0xc0, 0xdd, 0xce,
+ 0xec, 0xcd, 0xe0, 0xe2, 0xd0, 0xc0, 0xc0, 0xe2, 0xf4, 0xe3, 0xf7, 0x05,
+ 0x03, 0x03, 0x04, 0x04,
+ 0x04, 0xd3, 0xd4, 0xf3, 0xa3, 0xc3, 0xb3, 0xd3, 0xc1, 0xb0, 0xdf, 0xe0,
+ 0xe3, 0xe2, 0xe2, 0xe2,
+ 0xc1, 0xcf, 0xdd, 0xef, 0xe0, 0xf1, 0x07, 0x01, 0x0d, 0xf8, 0xfc, 0x0d,
+ 0x1f, 0x3d, 0x3b, 0x3d,
+ 0x4c, 0x1e, 0x1c, 0x1c, 0x1d, 0x2d, 0x0b, 0xcd, 0xbc, 0xfd, 0x0d, 0x1c,
+ 0x5e, 0x5e, 0x2e, 0x1d,
+ 0x1d, 0x1e, 0x4f, 0x50, 0x30, 0x2e, 0x2d, 0x3e, 0x5e, 0x3c, 0x2c, 0x1c,
+ 0x1b, 0x1d, 0x3f, 0x70,
+ 0x3f, 0x2d, 0x1c, 0x2d, 0x3d, 0x2e, 0x1e, 0x2e, 0x0e, 0xdd, 0xa1, 0xe7,
+ 0xc3, 0xb1, 0xc2, 0xe6,
+ 0xf4, 0xe3, 0xd2, 0xc1, 0xe3, 0xe3, 0xc3, 0xc1, 0xd2, 0xe3, 0xf3, 0xf3,
+ 0xf5, 0xd2, 0xc2, 0xe3,
+ 0xd1, 0xb0, 0xe0, 0xf0, 0x12, 0x11, 0x0e, 0xeb, 0xcd, 0xed, 0xfb, 0xfc,
+ 0xdc, 0xac, 0xee, 0xee,
+ 0xcb, 0xbd, 0xdf, 0xe1, 0xd1, 0xb0, 0xdd, 0xbc, 0xe0, 0x03, 0x07, 0x21,
+ 0x12, 0x23, 0x23, 0x53,
+ 0x22, 0x11, 0x30, 0x2f, 0x3b, 0x2c, 0x2d, 0x1b, 0x3e, 0x5e, 0x2e, 0x0e,
+ 0x0f, 0x00, 0x30, 0x50,
+ 0x30, 0x34, 0x34, 0x45, 0x53, 0x35, 0x53, 0x32, 0x22, 0x33, 0x34, 0x33,
+ 0x34, 0x42, 0x23, 0x22,
+ 0x12, 0x00, 0x20, 0x32, 0x20, 0x41, 0x55, 0x44, 0x32, 0x23, 0x22, 0x13,
+ 0x15, 0x23, 0x34, 0x33,
+ 0x03, 0xf3, 0xd3, 0xa4, 0xe4, 0xe4, 0x13, 0x13, 0x04, 0x02, 0xd1, 0xe0,
+ 0x01, 0x02, 0x13, 0x05,
+ 0x63, 0x51, 0x20, 0x00, 0x3e, 0x71, 0x30, 0x09, 0x0e, 0x2d, 0x2c, 0xed,
+ 0xab, 0xfd, 0x0c, 0x0e,
+ 0x2f, 0x60, 0x30, 0x30, 0x2e, 0x0b, 0x0f, 0x0e, 0x00, 0x00, 0xb1, 0x9e,
+ 0xcb, 0xde, 0xd0, 0xd3,
+ 0xd1, 0xce, 0xcc, 0xfe, 0xee, 0xdb, 0xdc, 0xee, 0xef, 0xcf, 0xdb, 0xdd,
+ 0xec, 0x0e, 0x00, 0x0f,
+ 0xed, 0xbc, 0xdd, 0xfd, 0x0e, 0x00, 0xef, 0xf0, 0xf0, 0x11, 0x72, 0x62,
+ 0x20, 0x1d, 0x18, 0x2e,
+ 0x30, 0x50, 0x30, 0x51, 0x30, 0x2a, 0x1c, 0x2c, 0x2b, 0x2d, 0x2d, 0x2e,
+ 0x1d, 0x0c, 0x3e, 0x5d,
+ 0x5f, 0x2e, 0x3e, 0x3e, 0x4f, 0x31, 0x64, 0x12, 0x22, 0x14, 0x25, 0x34,
+ 0x23, 0x13, 0x24, 0x14,
+ 0x03, 0x03, 0x04, 0x02, 0x14, 0x34, 0x44, 0x12, 0x02, 0xf3, 0x33, 0x52,
+ 0x01, 0x21, 0x63, 0x45,
+ 0x32, 0x31, 0x34, 0x24, 0x44, 0x44, 0x42, 0x23, 0x43, 0x43, 0x66, 0x33,
+ 0x32, 0x22, 0x34, 0x44,
+ 0x22, 0x01, 0x02, 0x02, 0x03, 0xd2, 0xe2, 0xc2, 0xe3, 0x05, 0x02, 0xf2,
+ 0xd2, 0xd1, 0xe2, 0xd2,
+ 0xe1, 0xc0, 0xbd, 0xdc, 0xbb, 0xdc, 0xcc, 0xfd, 0xfe, 0x0c, 0x0d, 0x0d,
+ 0x0b, 0x2e, 0x4f, 0x4e,
+ 0x4f, 0x2e, 0x4e, 0x1b, 0x1d, 0x4d, 0x4e, 0x0c, 0x0d, 0xea, 0xde, 0xcd,
+ 0xcd, 0xbd, 0xdc, 0xdd,
+ 0xdd, 0xfe, 0xef, 0xfd, 0xdd, 0xdc, 0xdd, 0xbd, 0xdd, 0xce, 0xf0, 0xd0,
+ 0xe5, 0xc1, 0xc1, 0xc0,
+ 0xc2, 0xe6, 0xc1, 0xd3, 0xb2, 0xe3, 0xd2, 0xd0, 0xc1, 0xd1, 0xe4, 0xe3,
+ 0xf6, 0xd2, 0xe4, 0xf3,
+ 0x07, 0x02, 0x03, 0x13, 0x03, 0x05, 0x23, 0x64, 0x02, 0xf3, 0xe2, 0x24,
+ 0x43, 0x22, 0x02, 0x75,
+ 0x43, 0x02, 0x01, 0x42, 0x74, 0x20, 0x21, 0x31, 0x31, 0x30, 0x30, 0x20,
+ 0x1f, 0x0e, 0x0d, 0x2f,
+ 0x0b, 0xab, 0xdc, 0x10, 0x0f, 0x0d, 0x3f, 0x6f, 0x1c, 0x0a, 0x60, 0x40,
+ 0x30, 0x1f, 0x51, 0x33,
+ 0x20, 0x1c, 0x2e, 0x54, 0x10, 0x1f, 0x1f, 0x2e, 0x0d, 0x2e, 0x2d, 0x09,
+ 0x2f, 0x0d, 0xfd, 0x0c,
+ 0xfe, 0xdd, 0xdf, 0x00, 0xef, 0xbd, 0x00, 0x03, 0xef, 0xad, 0xe2, 0x07,
+ 0xf4, 0x90, 0xdd, 0xdf,
+ 0xf0, 0xf6, 0xd1, 0xd0, 0xd0, 0xcf, 0xcf, 0xe0, 0xf4, 0xc0, 0xf2, 0x07,
+ 0xc2, 0xb0, 0xe4, 0x05,
+ 0x13, 0xf1, 0xb0, 0xf0, 0x14, 0x02, 0xbf, 0xf0, 0xe2, 0xf2, 0xf0, 0xf0,
+ 0x03, 0xf0, 0xf0, 0x36,
+ 0x32, 0xcd, 0xba, 0x00, 0x40, 0x00, 0xe9, 0xff, 0x4f, 0x2f, 0xec, 0xfe,
+ 0x2f, 0x1e, 0xec, 0xbc,
+ 0x3f, 0x4f, 0x0d, 0x0d, 0x4f, 0x2e, 0xdb, 0xbd, 0x0e, 0x0f, 0x1f, 0x1e,
+ 0x40, 0x3f, 0x3f, 0x3d,
+ 0x2c, 0x3e, 0x5f, 0x3c, 0x2d, 0x7f, 0x20, 0x1d, 0x1d, 0x2f, 0x0c, 0xfc,
+ 0xfd, 0xf0, 0xbc, 0xb9,
+ 0xde, 0xf0, 0xf0, 0xbd, 0xcb, 0xe0, 0xef, 0xef, 0xe0, 0xe0, 0xc0, 0xdd,
+ 0xee, 0xe0, 0xf2, 0xb0,
+ 0xde, 0xe3, 0xd3, 0xd2, 0xd3, 0xc5, 0xd3, 0xe6, 0xc1, 0xbd, 0xed, 0x00,
+ 0x0f, 0xec, 0x02, 0x10,
+ 0xd8, 0xcd, 0x00, 0x23, 0xe0, 0xbe, 0xe0, 0xe2, 0xf2, 0xab, 0xec, 0x01,
+ 0x36, 0x00, 0xcf, 0xf0,
+ 0x00, 0x01, 0xe0, 0x23, 0x11, 0x00, 0x00, 0x0e, 0x50, 0x53, 0x1a, 0x1d,
+ 0x0b, 0x0c, 0x2e, 0x2f,
+ 0x1e, 0xec, 0xbe, 0x0f, 0x0f, 0x0f, 0xac, 0xee, 0x10, 0x32, 0x00, 0xea,
+ 0xff, 0x00, 0x41, 0x76,
+ 0x00, 0xf0, 0x32, 0x52, 0x10, 0x33, 0x77, 0x21, 0x00, 0x00, 0x33, 0x35,
+ 0x00, 0x00, 0x00, 0x02,
+ 0xf1, 0x02, 0x03, 0xc0, 0xe0, 0x15, 0xf1, 0xb0, 0xe1, 0xf2, 0x03, 0xb0,
+ 0xe0, 0x06, 0x23, 0x02,
+ 0xcf, 0x03, 0x17, 0xe0, 0xa0, 0xf0, 0x13, 0x02, 0xe1, 0xf2, 0x36, 0xf0,
+ 0x8d, 0x12, 0x67, 0x00,
+ 0xdc, 0x10, 0x22, 0x00, 0xde, 0x0f, 0x54, 0x12, 0xff, 0xff, 0x21, 0x44,
+ 0xff, 0xee, 0x33, 0x45,
+ 0xfe, 0xde, 0x11, 0x43, 0xed, 0xbb, 0x10, 0x00, 0xff, 0xee, 0x00, 0x01,
+ 0xed, 0xb9, 0x10, 0x42,
+ 0x00, 0xed, 0x31, 0x10, 0xdc, 0x31, 0x77, 0x00, 0x0f, 0x11, 0x11, 0x21,
+ 0x01, 0x11, 0x54, 0x33,
+ 0x00, 0x00, 0x64, 0x22, 0x10, 0x10, 0x33, 0x43, 0x10, 0x0d, 0x20, 0x67,
+ 0x10, 0xfc, 0x0f, 0x30,
+ 0x0d, 0xfb, 0x20, 0x20, 0xd9, 0xce, 0x30, 0x0f, 0xbc, 0xee, 0x0f, 0x10,
+ 0xfd, 0xbd, 0x00, 0x11,
+ 0x00, 0x00, 0x02, 0x03, 0x04, 0xb0, 0x05, 0x12, 0xe0, 0xc0, 0x02, 0x46,
+ 0x00, 0xce, 0xbd, 0x24,
+ 0x56, 0xef, 0xee, 0x11, 0x21, 0x00, 0x31, 0x32, 0xff, 0x00, 0x77, 0x43,
+ 0xf0, 0x00, 0x33, 0x34,
+ 0x01, 0xf0, 0x00, 0x35, 0x22, 0x00, 0xf0, 0x11, 0x62, 0x00, 0x00, 0x34,
+ 0x01, 0xad, 0x00, 0x27,
+ 0x11, 0xcf, 0xf0, 0x12, 0x34, 0x00, 0xce, 0xef, 0x33, 0x44, 0xef, 0xee,
+ 0x20, 0x75, 0x00, 0x0e,
+ 0x41, 0x10, 0x0d, 0x21, 0x43, 0x0a, 0xfe, 0x32, 0x53, 0x00, 0x0e, 0x0d,
+ 0x10, 0x10, 0x20, 0x42,
+ 0xb8, 0xd8, 0x20, 0x30, 0xdf, 0xef, 0xee, 0xff, 0x40, 0x10, 0xdf, 0xac,
+ 0x00, 0x22, 0xff, 0xee,
+ 0x21, 0x02, 0xde, 0xd0, 0xf2, 0xe2, 0xd2, 0xd3, 0x80, 0x17, 0x15, 0x8d,
+ 0xff, 0x04, 0x01, 0xee,
+ 0xe0, 0x00, 0xcf, 0xf0, 0xf2, 0xde, 0xa8, 0xf0, 0x12, 0x02, 0xde, 0xee,
+ 0x02, 0x01, 0xdf, 0x14,
+ 0xf0, 0xd0, 0x24, 0xf0, 0x9d, 0xf0, 0x15, 0xf0, 0x00, 0x13, 0xee, 0x0f,
+ 0x00, 0x21, 0x34, 0x21,
+ 0xcd, 0xdd, 0x77, 0x45, 0x0f, 0xab, 0x0f, 0x44, 0x10, 0xed, 0xfd, 0x21,
+ 0x54, 0x0f, 0x0e, 0x0f,
+ 0x10, 0x33, 0x32, 0x1f, 0x0d, 0x52, 0x47, 0x0f, 0x0d, 0x30, 0x52, 0x22,
+ 0x0e, 0x0e, 0x30, 0x00,
+ 0x0a, 0xfe, 0x31, 0x22, 0xcb, 0xee, 0x00, 0x21, 0xbe, 0xdd, 0xf0, 0x01,
+ 0xf1, 0xe0, 0xab, 0xee,
+ 0x13, 0x12, 0xba, 0xf0, 0x12, 0xf0, 0xff, 0x01, 0xf0, 0x04, 0x13, 0xcd,
+ 0xf2, 0x77, 0x04, 0xdf,
+ 0xf0, 0xf2, 0x03, 0xe1, 0xc0, 0x04, 0xf4, 0xc0, 0xe0, 0xf1, 0xe1, 0x03,
+ 0xf1, 0xae, 0x16, 0x45,
+ 0xdf, 0x8c, 0x02, 0x23, 0xfe, 0xee, 0x13, 0x14, 0xec, 0xed, 0x11, 0x0f,
+ 0xfd, 0x20, 0x0f, 0xea,
+ 0x0f, 0x2f, 0x2e, 0xed, 0xbb, 0x20, 0x50, 0xfc, 0xbb, 0x00, 0x40, 0x00,
+ 0xcc, 0x0f, 0x20, 0x0f,
+ 0xed, 0x0e, 0x30, 0x1e, 0xeb, 0x30, 0x70, 0x0e, 0x0d, 0x20, 0x40, 0x0e,
+ 0xfa, 0xff, 0x10, 0x0f,
+ 0xfd, 0x32, 0x00, 0x99, 0x0f, 0x22, 0x10, 0xad, 0x0f, 0x25, 0x11, 0xee,
+ 0xcf, 0x01, 0x02, 0x02,
+ 0x03, 0xe1, 0xb0, 0xe2, 0x07, 0xf1, 0xb0, 0xf2, 0x05, 0x02, 0xd0, 0x01,
+ 0x35, 0x11, 0xae, 0x00,
+ 0x57, 0x00, 0xef, 0x10, 0x22, 0xff, 0xcd, 0x00, 0x23, 0xff, 0xac, 0xff,
+ 0x13, 0x12, 0xcc, 0xfe,
+ 0x00, 0x00, 0xd0, 0xfe, 0x00, 0x01, 0x12, 0xfd, 0xec, 0x21, 0x56, 0xfe,
+ 0xcd, 0x11, 0x42, 0x00,
+ 0xe9, 0x10, 0x62, 0x0f, 0xea, 0x0f, 0x30, 0x1f, 0xed, 0x20, 0x72, 0x10,
+ 0x0e, 0xfd, 0x22, 0x46,
+ 0x00, 0xfe, 0x00, 0x33, 0xfe, 0x32, 0x65, 0xff, 0x11, 0x33, 0x00, 0x21,
+ 0x44, 0x11, 0x10, 0x0e,
+ 0x00, 0x65, 0x00, 0x00, 0xf0, 0x01, 0x14, 0xf0, 0xf0, 0xf2, 0xbe, 0xdd,
+ 0x27, 0x45, 0xf0, 0xc0,
+ 0xce, 0x13, 0x57, 0x01, 0xbe, 0x00, 0x25, 0xf0, 0xdf, 0x01, 0x12, 0xf0,
+ 0xe0, 0x01, 0xe0, 0x01,
+ 0x12, 0xe0, 0xe0, 0xf0, 0xff, 0x41, 0x63, 0xf9, 0xdc, 0x51, 0x20, 0x0e,
+ 0xeb, 0x10, 0x51, 0xff,
+ 0xdb, 0x00, 0x74, 0x00, 0xed, 0xfe, 0x01, 0x21, 0xfe, 0x0f, 0x11, 0xfd,
+ 0x0e, 0x32, 0x10, 0xfb,
+ 0x10, 0xfe, 0x89, 0x00, 0x11, 0xfe, 0xde, 0xcd, 0x0f, 0xfd, 0xba, 0x0f,
+ 0x11, 0x00, 0xbb, 0xf0,
+ 0x32, 0x00, 0xfe, 0xff, 0x0f, 0x30, 0x54, 0x00, 0xda, 0xff, 0x73, 0x01,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0xdd, 0xff, 0x12, 0x22, 0xfd, 0x0d, 0x1f, 0x43, 0x0d, 0xa8, 0x0d, 0x31,
+ 0x10, 0xe9, 0xff, 0x40,
+ 0x1f, 0xee, 0xee, 0x22, 0x55, 0x00, 0xcf, 0x23, 0x67, 0x00, 0xf1, 0x02,
+ 0x33, 0x01, 0xd0, 0x33,
+ 0x21, 0xe0, 0xe0, 0x00, 0x00, 0xff, 0x54, 0x34, 0xee, 0x22, 0x63, 0xfd,
+ 0x01, 0x37, 0x24, 0x00,
+ 0x02, 0x32, 0xf0, 0xae, 0x00, 0x77, 0x12, 0xed, 0x00, 0x43, 0x33, 0x00,
+ 0x10, 0x44, 0x34, 0x22,
+ 0x22, 0x22, 0x13, 0x14, 0x24, 0x22, 0xd0, 0xe0, 0x34, 0x22, 0x8f, 0x02,
+ 0x37, 0xe0, 0xbd, 0x00,
+ 0x33, 0x0f, 0x0f, 0x10, 0xfe, 0xeb, 0x20, 0x72, 0x32, 0xfe, 0x01, 0x01,
+ 0xc3, 0x00, 0xc2, 0x00,
+ 0x47, 0x25, 0x1a, 0x20, 0xd5, 0x23, 0x26, 0x20, 0x34, 0xcd, 0xce, 0x10,
+ 0x20, 0x25, 0xce, 0xdb,
+ 0x11, 0x41, 0xe0, 0xcc, 0x00, 0x00, 0x77, 0x00, 0xdc, 0xf0, 0x22, 0x42,
+ 0x00, 0x0f, 0xff, 0xe0,
+ 0x11, 0x11, 0x01, 0x00, 0xee, 0xcd, 0x77, 0x11, 0xab, 0x00, 0x46, 0x0f,
+ 0xce, 0x00, 0x11, 0x21,
+ 0xf0, 0xed, 0x00, 0x23, 0x21, 0xdd, 0xde, 0x24, 0x64, 0xee, 0x00, 0x31,
+ 0xbc, 0xfe, 0x47, 0x21,
+ 0xef, 0xee, 0xff, 0x22, 0x75, 0xfe, 0xdd, 0x01, 0x32, 0x00, 0x01, 0x00,
+ 0xff, 0xfd, 0x01, 0x21,
+ 0x0f, 0xde, 0x67, 0x00, 0xfe, 0xdd, 0x00, 0x00, 0x32, 0xf0, 0xaa, 0x00,
+ 0x33, 0x0f, 0xfd, 0xcd,
+ 0x35, 0x32, 0xf0, 0xed, 0x10, 0x76, 0x00, 0xde, 0x00, 0x32, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x9b, 0x00, 0x67, 0x00, 0x0f, 0xef, 0xee, 0x00, 0x77, 0xf0, 0xdb, 0x01,
+ 0x43, 0x0f, 0xcd, 0x11,
+ 0x13, 0x00, 0x0e, 0xef, 0x32, 0x22, 0xdd, 0xef, 0x12, 0x23, 0xda, 0xcf,
+ 0x42, 0x22, 0xbc, 0xfe,
+ 0x56, 0x00, 0xcd, 0x00, 0x33, 0x01, 0xed, 0xf0, 0x34, 0x00, 0xdb, 0x12,
+ 0x52, 0xff, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0xfc, 0x01, 0x52, 0x00, 0xfe, 0xfd, 0xff, 0x54, 0xf0,
+ 0xc8, 0x30, 0x32, 0xef,
+ 0xde, 0x43, 0xf0, 0xed, 0x11, 0x20, 0xce, 0xcb, 0x23, 0x44, 0xcd, 0xec,
+ 0x23, 0x43, 0xea, 0xef,
+ 0x63, 0x00, 0xed, 0x0f, 0x54, 0x14, 0xdd, 0xec, 0x34, 0x54, 0xef, 0xcd,
+ 0x00, 0x41, 0x04, 0xdd,
+ 0xfe, 0x00, 0x33, 0xef, 0xcc, 0x21, 0x33, 0xff, 0xbc, 0x00, 0x32, 0x05,
+ 0xfe, 0xdf, 0x11, 0x33,
+ 0x00, 0xcd, 0xf0, 0x00, 0x13, 0x01, 0xd3, 0x22, 0xc8, 0xbe, 0x35, 0x52,
+ 0xfd, 0xed, 0x10, 0x43,
+ 0x00, 0xec, 0x23, 0x00, 0x0f, 0x41, 0x02, 0xdc, 0x00, 0x77, 0xef, 0xec,
+ 0xe0, 0x23, 0x30, 0xc0,
+ 0xfe, 0x10, 0x63, 0x0f, 0xcb, 0x23, 0x13, 0x11, 0x10, 0xff, 0xfe, 0x01,
+ 0x54, 0x0f, 0xc9, 0x0f,
+ 0x10, 0x20, 0x1e, 0xfe, 0x01, 0x01, 0xde, 0x0f, 0xe0, 0xf3, 0x07, 0x8e,
+ 0xef, 0x24, 0x00, 0x20,
+ 0x21, 0x01, 0xdc, 0x40, 0x21, 0xf0, 0x20, 0x75, 0xef, 0xee, 0x55, 0x10,
+ 0xf0, 0xe2, 0x33, 0x10,
+ 0xda, 0xc1, 0x11, 0x0f, 0xff, 0x12, 0x12, 0xbb, 0x02, 0x44, 0xdc, 0xbc,
+ 0x11, 0x12, 0x00, 0xf0,
+ 0x20, 0x44, 0xdf, 0xdd, 0x34, 0xe0, 0xcf, 0x23, 0x55, 0xed, 0xcc, 0x00,
+ 0x30, 0x33, 0xcf, 0xdb,
+ 0x31, 0x52, 0xee, 0xba, 0x11, 0x33, 0x10, 0xec, 0x00, 0x20, 0x20, 0x01,
+ 0xd0, 0x1f, 0x10, 0x00,
+ 0x10, 0xfe, 0xb0, 0x35, 0x40, 0xdd, 0xad, 0x23, 0x57, 0xfe, 0xdc, 0x01,
+ 0x42, 0xe0, 0xec, 0x00,
+ 0x21, 0x00, 0xb0, 0x00, 0xfd, 0x0e, 0x27, 0x02, 0x0e, 0x00, 0x31, 0x00,
+ 0x99, 0x11, 0x64, 0xff,
+ 0xdd, 0x00, 0x24, 0x21, 0x00, 0xf0, 0x02, 0x10, 0x30, 0xf2, 0xbf, 0x32,
+ 0x33, 0xf0, 0xef, 0x0c,
+ 0x0b, 0x11, 0x13, 0x1f, 0xf9, 0xaf, 0x10, 0x22, 0xcd, 0xdc, 0xe0, 0xe0,
+ 0xe0, 0x0e, 0xdc, 0xf0,
+ 0x71, 0x11, 0xdb, 0xe0, 0x56, 0x32, 0xe0, 0xa0, 0x00, 0x14, 0x10, 0xcc,
+ 0x02, 0x01, 0x31, 0x00,
+ 0xab, 0x00, 0x40, 0x20, 0xf0, 0xe0, 0x11, 0x0e, 0x40, 0x57, 0x01, 0xaf,
+ 0x0f, 0x21, 0x22, 0xef,
+ 0x00, 0x16, 0x20, 0xff, 0xfe, 0x0d, 0x1f, 0x35, 0x34, 0xf0, 0xed, 0xe0,
+ 0xf0, 0x00, 0x0e, 0xf1,
+ 0x06, 0x30, 0x8d, 0x8b, 0x02, 0x25, 0xee, 0xcd, 0x02, 0x23, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0x23, 0x62,
+ 0x00, 0x0b, 0x12, 0x30, 0x00, 0xf0, 0xf0, 0xcf, 0x00, 0x53, 0x02, 0xb8,
+ 0x00, 0x23, 0x0f, 0xfd,
+ 0x00, 0x14, 0x00, 0xf0, 0xed, 0xdc, 0xfd, 0x21, 0x47, 0x8d, 0xeb, 0x10,
+ 0x31, 0x03, 0x0e, 0xbc,
+ 0x00, 0x23, 0x00, 0xf0, 0x01, 0x55, 0x00, 0xc0, 0x0e, 0x22, 0x13, 0x44,
+ 0xfc, 0x0f, 0x13, 0xf1,
+ 0xcf, 0x0f, 0x0f, 0xdf, 0x04, 0x11, 0xac, 0xee, 0xef, 0x00, 0x57, 0x00,
+ 0xaa, 0x00, 0x44, 0x00,
+ 0xfd, 0xf0, 0x32, 0x22, 0xff, 0xde, 0x20, 0x10, 0x0f, 0xe0, 0xf3, 0x00,
+ 0x1d, 0x4e, 0xe0, 0xf7,
+ 0x32, 0x1b, 0x0f, 0x13, 0x00, 0x8c, 0x0e, 0x45, 0x34, 0xcf, 0xcd, 0x10,
+ 0x42, 0x01, 0xfe, 0xea,
+ 0x00, 0x22, 0x00, 0x1f, 0x6e, 0x10, 0x30, 0x14, 0x02, 0xdf, 0x0e, 0x54,
+ 0x31, 0xe2, 0xe1, 0x0f,
+ 0x4d, 0x1d, 0xef, 0xd0, 0x00, 0x0c, 0xbd, 0xbb, 0x00, 0x04, 0xfd, 0x0c,
+ 0x32, 0xf1, 0x88, 0x9d,
+ 0x23, 0x04, 0x0f, 0xff, 0x04, 0x25, 0xed, 0xfe, 0x22, 0x12, 0xee, 0x0f,
+ 0x23, 0x22, 0xfb, 0xfe,
+ 0x01, 0x34, 0x22, 0xbf, 0xbb, 0x00, 0x13, 0x10, 0x42, 0x32, 0xef, 0x0e,
+ 0xef, 0x01, 0x16, 0xbd,
+ 0xff, 0x24, 0x02, 0x8c, 0x0f, 0x15, 0x20, 0x00, 0xef, 0xfe, 0x20, 0x61,
+ 0x0c, 0xee, 0x31, 0x42,
+ 0xed, 0xdc, 0x01, 0x40, 0x0d, 0xc0, 0xf3, 0xed, 0xd8, 0xd0, 0x22, 0x32,
+ 0xea, 0xbf, 0x10, 0x73,
+ 0x11, 0xeb, 0xef, 0x32, 0x73, 0x0d, 0xec, 0x21, 0x00, 0x00, 0xe2, 0x12,
+ 0x30, 0xf0, 0xff, 0x20,
+ 0x03, 0xb0, 0xff, 0x14, 0x31, 0x0f, 0xce, 0x00, 0x0b, 0x09, 0x2f, 0xf1,
+ 0xc4, 0x01, 0x00, 0xf0,
+ 0xaf, 0xff, 0x02, 0x07, 0x01, 0x01, 0xb2, 0xc0, 0xd0, 0x03, 0x13, 0xeb,
+ 0xc0, 0x64, 0x34, 0x20,
+ 0x0f, 0xe0, 0x20, 0x42, 0x00, 0xfb, 0x20, 0x10, 0xbc, 0xfe, 0x23, 0x44,
+ 0xeb, 0xde, 0x00, 0x54,
+ 0xff, 0xca, 0xff, 0xef, 0x10, 0x20, 0x35, 0x01, 0x9f, 0xdc, 0x00, 0x32,
+ 0x42, 0xd0, 0xff, 0x00,
+ 0x10, 0x1e, 0x3f, 0x4f, 0x01, 0xcf, 0x1e, 0x53, 0x0f, 0x2c, 0x20, 0xeb,
+ 0xd0, 0x45, 0xdf, 0x9a,
+ 0x11, 0x32, 0x01, 0x00, 0x22, 0x13, 0xfd, 0x20, 0x77, 0x02, 0xee, 0x0d,
+ 0x42, 0x10, 0xeb, 0x00,
+ 0x54, 0x01, 0xcf, 0xff, 0x04, 0x10, 0xad, 0xfe, 0x02, 0x03, 0xfe, 0xfd,
+ 0x30, 0x12, 0x0e, 0xfa,
+ 0x00, 0x24, 0x0e, 0xbe, 0xf3, 0xf6, 0xf0, 0x03, 0x00, 0x9d, 0xf0, 0x00,
+ 0x23, 0xf1, 0xcb, 0x20,
+ 0x44, 0x12, 0x00, 0x2c, 0x01, 0xe2, 0x00, 0x7e, 0x1b, 0xef, 0x00, 0x21,
+ 0x0f, 0xcf, 0xfc, 0x0c,
+ 0xde, 0xf0, 0xef, 0x40, 0x21, 0xee, 0x12, 0x77, 0x6c, 0x00, 0x02, 0x00,
+ 0x2f, 0x3f, 0x04, 0x03,
+ 0xf1, 0x1e, 0xe8, 0x9e, 0xf0, 0x00, 0xf0, 0xe0, 0xb0, 0xf3, 0xf0, 0x0c,
+ 0xf1, 0x12, 0x1e, 0x1b,
+ 0xdb, 0x20, 0x7f, 0x0f, 0x0f, 0x11, 0x36, 0x31, 0xee, 0xbf, 0x01, 0xe3,
+ 0x01, 0x17, 0x53, 0x20,
+ 0x10, 0x01, 0xd0, 0xf0, 0x12, 0xae, 0xdc, 0xcc, 0x0e, 0x63, 0x36, 0x0e,
+ 0xcc, 0x0f, 0x4f, 0x13,
+ 0x01, 0x0f, 0xf0, 0xe0, 0x0d, 0xec, 0x03, 0x57, 0x03, 0xdd, 0xed, 0x02,
+ 0x02, 0xe0, 0x27, 0x72,
+ 0xf1, 0xef, 0x1e, 0x44, 0x33, 0x00, 0x2d, 0x3f, 0x10, 0xe0, 0x0d, 0xed,
+ 0x8e, 0xe1, 0xff, 0xe9,
+ 0x00, 0x35, 0x00, 0xaf, 0xfe, 0x14, 0x11, 0x0f, 0x2d, 0x41, 0x42, 0x30,
+ 0x2e, 0x1b, 0x1f, 0x00,
+ 0x06, 0x02, 0xf0, 0x72, 0x70, 0xfe, 0xbd, 0x03, 0x12, 0x0f, 0xd8, 0x00,
+ 0xf3, 0xed, 0xcd, 0x00,
+ 0x32, 0x01, 0x0f, 0x00, 0x26, 0x41, 0x0d, 0xec, 0x40, 0x77, 0x12, 0xec,
+ 0xff, 0x00, 0xfe, 0xee,
+ 0x13, 0x33, 0xe3, 0xd0, 0xdf, 0x1f, 0x40, 0xdd, 0xcb, 0xe0, 0xcd, 0xcd,
+ 0x0c, 0x0a, 0x00, 0xff,
+ 0xce, 0xef, 0xd0, 0x02, 0xf1, 0x00, 0x3f, 0x74, 0x72, 0x00, 0xe0, 0x01,
+ 0x27, 0x35, 0x1f, 0x0f,
+ 0xf0, 0xe0, 0x02, 0xf0, 0x20, 0x75, 0xd4, 0xbe, 0x0b, 0xef, 0xe0, 0x04,
+ 0x61, 0x21, 0xfe, 0xe1,
+ 0x12, 0x40, 0x10, 0xf1, 0xcc, 0xfb, 0x04, 0x64, 0x00, 0xed, 0x00, 0x03,
+ 0x02, 0x11, 0x0d, 0x1f,
+ 0x73, 0x57, 0x03, 0x0d, 0xfe, 0x01, 0x14, 0xff, 0xed, 0xf2, 0x02, 0xee,
+ 0xec, 0xf0, 0xec, 0x22,
+ 0x77, 0x25, 0xcb, 0xff, 0x0f, 0x50, 0x20, 0xf0, 0xff, 0x0f, 0x0e, 0x0d,
+ 0x02, 0x34, 0x10, 0x01,
+ 0xe1, 0xd0, 0x1e, 0x60, 0xf5, 0xb0, 0x0f, 0x22, 0xff, 0xb8, 0x1f, 0x2f,
+ 0x30, 0xf2, 0xdf, 0xfd,
+ 0xdc, 0xe1, 0x04, 0x44, 0x10, 0x8e, 0xe0, 0x00, 0x23, 0xd0, 0xe1, 0x37,
+ 0x72, 0x21, 0xee, 0xed,
+ 0x21, 0x21, 0xe0, 0x17, 0x01, 0xab, 0x00, 0xde, 0xf0, 0xef, 0x0f, 0x74,
+ 0x13, 0xfc, 0xde, 0x12,
+ 0x02, 0xaf, 0x01, 0x13, 0x0d, 0x00, 0xf4, 0x21, 0x42, 0x0e, 0xfb, 0x00,
+ 0x01, 0x32, 0x0f, 0x0a,
+ 0x0f, 0x00, 0x00, 0x00, 0x20, 0x74, 0x22, 0x00, 0xec, 0xbc, 0xff, 0x31,
+ 0x54, 0xcb, 0xef, 0x00,
+ 0xfd, 0xdc, 0x00, 0x20, 0x11, 0x10, 0x40, 0xfc, 0xdc, 0x6f, 0x21, 0x0f,
+ 0xfa, 0x30, 0x76, 0x20,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0xd0, 0x9b, 0x11, 0x23, 0x00, 0xcd,
+ 0x30, 0x0e, 0xdf, 0xb1,
+ 0x16, 0x40, 0xe0, 0xcd, 0x00, 0x00, 0xe0, 0xf1, 0x02, 0xef, 0xe3, 0xcf,
+ 0xb8, 0xeb, 0x00, 0x15,
+ 0x00, 0xd2, 0x62, 0x23, 0xdf, 0xee, 0x20, 0x40, 0x24, 0xf1, 0xeb, 0xfe,
+ 0xef, 0x11, 0x50, 0x21,
+ 0x22, 0x01, 0xf0, 0x40, 0x4d, 0xfb, 0xe0, 0x37, 0x22, 0xbe, 0xee, 0x00,
+ 0x12, 0xe0, 0xe0, 0xe2,
+ 0xbe, 0x2e, 0x70, 0x52, 0x04, 0x00, 0xe9, 0x2f, 0x52, 0x0f, 0xd8, 0x00,
+ 0x23, 0x12, 0xed, 0xfe,
+ 0x00, 0x1d, 0x00, 0xd1, 0xd0, 0x9d, 0x0c, 0x30, 0x00, 0xce, 0x47, 0x22,
+ 0xff, 0x0e, 0x00, 0x20,
+ 0x03, 0x04, 0x77, 0x12, 0xdf, 0x0f, 0x41, 0x01, 0xed, 0xdf, 0x11, 0x00,
+ 0xce, 0x00, 0x26, 0x72,
+ 0x00, 0xca, 0x10, 0x34, 0x21, 0xf0, 0xbd, 0x01, 0x03, 0x00, 0xf0, 0x15,
+ 0xef, 0xc0, 0x01, 0xf1,
+ 0xac, 0xef, 0x01, 0x14, 0x50, 0x01, 0x0d, 0x00, 0x17, 0x33, 0x0d, 0xbd,
+ 0x00, 0x00, 0xfd, 0x00,
+ 0x0f, 0xfb, 0x01, 0x14, 0xac, 0xfd, 0x31, 0x43, 0x0e, 0xfc, 0x00, 0x00,
+ 0x2d, 0x0d, 0x1e, 0x4c,
+ 0x2d, 0x44, 0x77, 0x01, 0xfe, 0x1f, 0x11, 0x02, 0xee, 0xde, 0xfe, 0xbe,
+ 0xc8, 0xee, 0x00, 0x22,
+ 0x02, 0x00, 0x3e, 0x60, 0x0f, 0x00, 0x02, 0x44, 0xef, 0xd8, 0x1f, 0x22,
+ 0xf1, 0xd0, 0xbd, 0x13,
+ 0x57, 0x11, 0x12, 0x34, 0x00, 0x11, 0x01, 0x00, 0xef, 0x23, 0x31, 0xa0,
+ 0xbd, 0xd8, 0xee, 0x00,
+ 0x64, 0x10, 0x2f, 0x1f, 0xf0, 0xe0, 0x0d, 0xda, 0x10, 0x42, 0xb0, 0xfe,
+ 0x30, 0x1d, 0xc0, 0xb1,
+ 0xf0, 0x01, 0x14, 0x00, 0xb2, 0x01, 0xf1, 0x00, 0x01, 0x25, 0xef, 0xed,
+ 0x33, 0x77, 0x57, 0x0f,
+ 0xdc, 0x00, 0xf0, 0xef, 0xf0, 0xf4, 0x00, 0x4c, 0x11, 0x00, 0xf0, 0x50,
+ 0x42, 0x47, 0x20, 0x00,
+ 0x0f, 0x20, 0x30, 0x01, 0x11, 0x61, 0x0f, 0xdb, 0x00, 0xd1, 0xdf, 0x1f,
+ 0x02, 0xd2, 0x05, 0xef,
+ 0x8c, 0xce, 0x1f, 0x12, 0x0f, 0xdd, 0x03, 0x56, 0x0f, 0x2c, 0x21, 0xf3,
+ 0x01, 0xde, 0x0d, 0x0c,
+ 0xe0, 0x11, 0xf1, 0xb0, 0xf3, 0x46, 0x10, 0xef, 0x00, 0x75, 0x42, 0x01,
+ 0xef, 0x1d, 0x20, 0xec,
+ 0xab, 0x01, 0xe2, 0xdb, 0xa9, 0xf0, 0x02, 0xf0, 0xce, 0x00, 0x31, 0x00,
+ 0xee, 0x1f, 0x60, 0x02,
+ 0x00, 0x00, 0x12, 0x47, 0x20, 0x31, 0x11, 0xf0, 0xc0, 0x0e, 0xf0, 0xf1,
+ 0xe3, 0xe0, 0xc0, 0xef,
+ 0xdd, 0xf1, 0x27, 0x10, 0xdf, 0x25, 0x31, 0xcc, 0xdb, 0xe0, 0x31, 0x75,
+ 0x7f, 0xdd, 0xee, 0xfe,
+ 0x0e, 0x00, 0x20, 0x76, 0x31, 0xdf, 0xfe, 0x44, 0x22, 0xfe, 0xe1, 0xf5,
+ 0xcf, 0xed, 0x00, 0x0f,
+ 0xc0, 0x14, 0x52, 0xf0, 0xee, 0x0c, 0x4d, 0x10, 0x0e, 0x32, 0x47, 0x02,
+ 0xcc, 0x0e, 0x23, 0x77,
+ 0x00, 0xdc, 0x00, 0x30, 0x00, 0x21, 0x43, 0x22, 0x0d, 0xab, 0x10, 0x01,
+ 0x10, 0x33, 0x01, 0xd1,
+ 0x22, 0x3f, 0xda, 0xbe, 0x00, 0x01, 0x22, 0xff, 0x8a, 0xff, 0xe0, 0x01,
+ 0x00, 0xe2, 0xe0, 0xcf,
+ 0x00, 0x12, 0x11, 0xe0, 0xd0, 0x14, 0x51, 0x36, 0x0f, 0x0e, 0x50, 0x30,
+ 0x25, 0x0f, 0xca, 0xe0,
+ 0xff, 0x01, 0x32, 0xb0, 0xce, 0xef, 0xd0, 0x05, 0x01, 0x02, 0x24, 0x12,
+ 0x10, 0x72, 0x75, 0x10,
+ 0x1d, 0x1f, 0x0e, 0xed, 0xfb, 0x00, 0x23, 0x42, 0xe0, 0xcd, 0x0f, 0x20,
+ 0x00, 0xb2, 0x06, 0x00,
+ 0xda, 0x00, 0x1f, 0xae, 0xdb, 0x30, 0x50, 0xfe, 0xbe, 0x00, 0x10, 0x1e,
+ 0x11, 0x14, 0x0d, 0xd9,
+ 0x20, 0x30, 0x43, 0xff, 0xbd, 0x00, 0x10, 0x21, 0x12, 0x00, 0x32, 0x67,
+ 0xf0, 0xbe, 0x0f, 0x2d,
+ 0x0e, 0x03, 0x25, 0x2f, 0xeb, 0xe0, 0x00, 0x05, 0xc0, 0xd0, 0x10, 0x12,
+ 0xa0, 0xe0, 0x0a, 0x0f,
+ 0xd0, 0x06, 0x10, 0xd0, 0x80, 0x00, 0x12, 0x01, 0x03, 0x34, 0x22, 0xc1,
+ 0xe0, 0x20, 0x75, 0x22,
+ 0xff, 0xcd, 0x00, 0x02, 0x31, 0x1a, 0x0e, 0xe0, 0x33, 0x3f, 0x1c, 0xfe,
+ 0x0e, 0x32, 0x11, 0x8c,
+ 0x02, 0x06, 0x0f, 0xea, 0xd0, 0x32, 0xe0, 0xaf, 0x1f, 0x20, 0x1e, 0x1e,
+ 0xf0, 0x02, 0x01, 0xeb,
+ 0xdd, 0x00, 0x63, 0xfe, 0xab, 0x00, 0x12, 0x00, 0xca, 0x30, 0x50, 0xef,
+ 0xfe, 0x40, 0x51, 0x17,
+ 0x34, 0x41, 0x00, 0xef, 0xe0, 0x03, 0x20, 0x02, 0xf2, 0x0f, 0x1e, 0x9c,
+ 0xfd, 0x11, 0x35, 0x00,
+ 0xcd, 0x10, 0x51, 0xd0, 0xeb, 0x00, 0x22, 0xd0, 0xa0, 0xfe, 0x05, 0x33,
+ 0x0f, 0xde, 0x26, 0x10,
+ 0xff, 0xde, 0x00, 0x35, 0xbf, 0xbc, 0xe1, 0x04, 0xc0, 0xfe, 0x10, 0x52,
+ 0x11, 0x26, 0x23, 0x11,
+ 0xf0, 0xf0, 0x32, 0x24, 0x2f, 0xd9, 0x8e, 0xae, 0xfd, 0x00, 0x04, 0x11,
+ 0x01, 0x1f, 0x2d, 0x3d,
+ 0x4f, 0x0d, 0x10, 0x43, 0x0e, 0xf8, 0x0b, 0x30, 0x62, 0x14, 0x02, 0xee,
+ 0x0f, 0x00, 0xee, 0xa0,
+ 0xf0, 0x00, 0x0e, 0xef, 0xef, 0x3e, 0x1c, 0x00, 0xc0, 0xcf, 0xf2, 0x36,
+ 0x72, 0x33, 0x23, 0xd8,
+ 0xce, 0x10, 0x2f, 0xdf, 0x8e, 0x01, 0x05, 0x12, 0x02, 0xef, 0xf0, 0x07,
+ 0x33, 0x30, 0xee, 0xee,
+ 0x00, 0x00, 0x10, 0x3f, 0x40, 0xcc, 0xac, 0x0e, 0x30, 0x05, 0x12, 0x00,
+ 0x0e, 0xf1, 0xf3, 0xef,
+ 0x0f, 0x03, 0xd2, 0x0e, 0x2f, 0xef, 0x88, 0xd0, 0x53, 0x34, 0x10, 0xee,
+ 0x00, 0x56, 0x22, 0x23,
+ 0x22, 0x00, 0xce, 0x02, 0x27, 0xc3, 0xdc, 0x1f, 0x00, 0xa2, 0xfc, 0xfa,
+ 0xf0, 0x0f, 0x3f, 0x50,
+ 0x40, 0x22, 0x0e, 0xfe, 0xe0, 0x43, 0x53, 0x00, 0xeb, 0xd0, 0x16, 0x41,
+ 0x0f, 0xe0, 0x13, 0x02,
+ 0xcd, 0xf9, 0xe0, 0x22, 0x53, 0x10, 0xff, 0xcb, 0x0f, 0x0f, 0xf0, 0xef,
+ 0xe2, 0x14, 0x72, 0x00,
+ 0xdd, 0x00, 0x77, 0x23, 0xfe, 0xee, 0x00, 0x00, 0xde, 0x2d, 0x74, 0x01,
+ 0xcf, 0x0b, 0x21, 0x12,
+ 0x00, 0x1f, 0xfc, 0xc1, 0xf5, 0xc0, 0xed, 0xff, 0xc1, 0xdf, 0xcb, 0xee,
+ 0x0f, 0x10, 0xf0, 0xee,
+ 0x40, 0x62, 0xfc, 0xeb, 0x00, 0x0e, 0x0f, 0xcc, 0x01, 0x27, 0x52, 0x12,
+ 0x12, 0x61, 0x00, 0x10,
+ 0x1d, 0x0d, 0x00, 0xff, 0xe0, 0x0f, 0xed, 0xe4, 0x06, 0xc0, 0x00, 0x03,
+ 0xe2, 0xd2, 0x11, 0x71,
+ 0x20, 0x08, 0x08, 0x60, 0x21, 0x02, 0xce, 0xfd, 0x10, 0x53, 0x12, 0x00,
+ 0x02, 0x26, 0x10, 0x01,
+ 0xe2, 0xf0, 0xf1, 0xbf, 0xef, 0xe1, 0x01, 0x3c, 0x6f, 0x13, 0x05, 0x0e,
+ 0xec, 0xde, 0x20, 0x70,
+ 0x22, 0x1d, 0xfc, 0x00, 0x10, 0xcd, 0x04, 0x27, 0x72, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x13, 0x00,
+ 0xbe, 0x1b, 0xb5, 0x40, 0x22, 0x1a, 0x5e, 0x40, 0x1c, 0x64, 0x13, 0xfa,
+ 0xde, 0x0f, 0x60, 0xef,
+ 0xbc, 0xdc, 0x04, 0x37, 0x40, 0xcd, 0x9b, 0x00, 0x00, 0x00, 0x00, 0xf2,
+ 0x23, 0x1e, 0xe0, 0x04,
+ 0x01, 0x12, 0xf3, 0xe2, 0x21, 0x7f, 0x30, 0x0b, 0xda, 0x1f, 0x20, 0x15,
+ 0x51, 0x01, 0xcf, 0xde,
+ 0x00, 0x30, 0xf0, 0x8d, 0xfb, 0x02, 0xf4, 0xe1, 0xff, 0xdb, 0x01, 0x32,
+ 0x52, 0x00, 0x0e, 0xef,
+ 0x0e, 0x00, 0x16, 0x12, 0xec, 0xcc, 0x10, 0x22, 0x72, 0x30, 0xfd, 0xe1,
+ 0x27, 0x71, 0x41, 0xfe,
+ 0x00, 0x40, 0xe2, 0xee, 0xfb, 0xc0, 0xde, 0xce, 0x1e, 0x24, 0x00, 0xdb,
+ 0x20, 0x4f, 0xf0, 0x03,
+ 0x50, 0x0d, 0xff, 0xcc, 0xea, 0x00, 0x12, 0x62, 0x20, 0x3f, 0x1f, 0x3e,
+ 0x5f, 0x2f, 0x0f, 0xd1,
+ 0x04, 0x1e, 0xea, 0x8f, 0xd2, 0x37, 0x22, 0xcc, 0xdf, 0x10, 0x12, 0x00,
+ 0x54, 0x20, 0xfd, 0xae,
+ 0x0d, 0x0e, 0xef, 0xe1, 0x03, 0xe3, 0xd2, 0xf2, 0x07, 0x27, 0xe0, 0xe0,
+ 0x72, 0x22, 0xf0, 0xbb,
+ 0x00, 0x02, 0xf0, 0xec, 0x00, 0x53, 0x00, 0x1f, 0x00, 0x20, 0x0f, 0x24,
+ 0x67, 0xf0, 0x0c, 0xf0,
+ 0xe3, 0xee, 0xeb, 0x00, 0xf2, 0x01, 0x72, 0x50, 0x01, 0x10, 0x0f, 0x00,
+ 0xf1, 0x13, 0x0e, 0xbb,
+ 0x00, 0x0f, 0xfe, 0xfe, 0x23, 0x73, 0x4f, 0xd9, 0x0f, 0x2f, 0x4e, 0x00,
+ 0x0f, 0x0f, 0xef, 0x08,
+ 0xed, 0xcf, 0xf3, 0x03, 0xec, 0xcf, 0x05, 0x55, 0x20, 0x30, 0x01, 0xd0,
+ 0x00, 0x1f, 0x51, 0x21,
+ 0xfc, 0xed, 0x13, 0x45, 0x1e, 0x00, 0xe0, 0xaa, 0x01, 0x22, 0x11, 0xf0,
+ 0xb0, 0x04, 0x03, 0x21,
+ 0xe5, 0xc0, 0x0e, 0x50, 0x15, 0xf0, 0x0f, 0x00, 0x31, 0x15, 0x10, 0x0e,
+ 0x00, 0x90, 0xdf, 0xef,
+ 0xc1, 0xf7, 0x17, 0xdf, 0x8e, 0x00, 0x00, 0x11, 0x11, 0x10, 0x0e, 0xba,
+ 0xdf, 0x00, 0x62, 0x20,
+ 0x0d, 0x10, 0x23, 0x0c, 0xcc, 0xff, 0x31, 0x33, 0xdf, 0xdd, 0x00, 0x53,
+ 0x04, 0x02, 0x01, 0x20,
+ 0x3b, 0x60, 0x00, 0xfd, 0xde, 0x0e, 0x0b, 0x0e, 0x00, 0xde, 0xba, 0xef,
+ 0x30, 0x44, 0x0f, 0x2e,
+ 0x72, 0x27, 0xe0, 0xff, 0x1e, 0x31, 0x00, 0xbc, 0x00, 0x13, 0x02, 0xe0,
+ 0x22, 0x27, 0xe1, 0xd1,
+ 0xf1, 0x82, 0xc0, 0x00, 0x20, 0x22, 0x15, 0x10, 0x4e, 0x2e, 0xf0, 0x00,
+ 0x40, 0x0d, 0xaf, 0x0f,
+ 0xec, 0xde, 0x0f, 0xfd, 0xee, 0xae, 0x00, 0x36, 0x6e, 0x2b, 0xf0, 0xe0,
+ 0x01, 0x54, 0x17, 0x03,
+ 0x8b, 0x0e, 0xe0, 0x02, 0x00, 0xfd, 0xe1, 0x03, 0x1e, 0xff, 0x04, 0x00,
+ 0x2d, 0x0a, 0x21, 0x32,
+ 0xfe, 0x0a, 0x70, 0x76, 0x10, 0x00, 0x00, 0x20, 0x20, 0x04, 0xe0, 0xff,
+ 0x00, 0x2f, 0x0f, 0xcf,
+ 0x02, 0x12, 0x30, 0x20, 0xef, 0xed, 0x3c, 0x61, 0x06, 0xe0, 0xdb, 0x21,
+ 0x10, 0x8f, 0xdd, 0x00,
+ 0x05, 0xf0, 0xad, 0x0f, 0x04, 0x11, 0xff, 0xfe, 0x1f, 0x61, 0x12, 0x3f,
+ 0x22, 0x0f, 0xcb, 0x01,
+ 0x01, 0x04, 0x57, 0x21, 0xf0, 0xdd, 0xcf, 0xcd, 0x00, 0xf3, 0xe4, 0xbf,
+ 0xd8, 0xef, 0x00, 0x01,
+ 0x51, 0x01, 0xfe, 0xef, 0x0f, 0xf0, 0x1d, 0x10, 0x0e, 0x0c, 0x4e, 0x2f,
+ 0x52, 0x22, 0x03, 0x37,
+ 0x04, 0xdf, 0xfe, 0x11, 0x77, 0x00, 0xd0, 0xeb, 0xd0, 0xb1, 0xb2, 0x00,
+ 0x02, 0x52, 0x0e, 0xed,
+ 0x00, 0x44, 0x00, 0xfb, 0x10, 0x00, 0x0b, 0x1f, 0x51, 0xf0, 0xcf, 0x0f,
+ 0x01, 0x03, 0x01, 0x03,
+ 0xe0, 0xcd, 0x10, 0x14, 0x03, 0xfc, 0xb8, 0x0e, 0x11, 0x63, 0xff, 0xeb,
+ 0x21, 0x33, 0x12, 0x13,
+ 0x0d, 0x0c, 0xd0, 0x81, 0xc2, 0x43, 0x1f, 0x09, 0xff, 0x00, 0x73, 0x15,
+ 0x10, 0x00, 0x00, 0x20,
+ 0x00, 0x0f, 0x1e, 0xfc, 0x12, 0x76, 0x50, 0xe0, 0xdc, 0x00, 0x30, 0x00,
+ 0xd0, 0xed, 0xf0, 0xe3,
+ 0xf0, 0xff, 0xc0, 0x00, 0x00, 0xf1, 0xa0, 0x0e, 0x33, 0x52, 0x0a, 0xd2,
+ 0x47, 0x12, 0x0c, 0xdc,
+ 0xce, 0xe0, 0x01, 0xe4, 0x44, 0x30, 0xe0, 0xc0, 0x00, 0x41, 0x10, 0x0f,
+ 0xcf, 0xee, 0xcd, 0xe0,
+ 0xf1, 0x27, 0x40, 0x2f, 0x36, 0x74, 0x10, 0x0e, 0x0f, 0x40, 0x27, 0xf0,
+ 0xd0, 0x00, 0xfe, 0xf0,
+ 0x9d, 0x0f, 0x00, 0x12, 0x32, 0x30, 0x11, 0x0f, 0xd1, 0x20, 0x22, 0xae,
+ 0xc8, 0xe8, 0x2f, 0x00,
+ 0xf1, 0xf3, 0x0f, 0xcb, 0x00, 0x22, 0xe0, 0xdd, 0xc0, 0x90, 0xce, 0x0c,
+ 0x0f, 0xf0, 0x45, 0x51,
+ 0x10, 0x1d, 0x2f, 0x10, 0x53, 0x26, 0x0e, 0xef, 0x40, 0x12, 0xe0, 0xec,
+ 0xf0, 0xe1, 0xd0, 0xdd,
+ 0x0f, 0x50, 0xef, 0xdf, 0x13, 0x77, 0x03, 0xfa, 0xde, 0x00, 0x03, 0x01,
+ 0xbf, 0xcf, 0x05, 0x03,
+ 0x23, 0xe2, 0xd5, 0x00, 0x4f, 0x50, 0x00, 0xe3, 0x00, 0x11, 0xd5, 0xc1,
+ 0xe1, 0x21, 0x4f, 0x0c,
+ 0xf0, 0x01, 0x74, 0x0a, 0x2e, 0x30, 0x41, 0x24, 0x00, 0x0d, 0xdd, 0xef,
+ 0xe0, 0x34, 0x55, 0xf0,
+ 0xaf, 0xfb, 0x00, 0x00, 0x01, 0x02, 0x0f, 0xdc, 0xbd, 0xec, 0xf0, 0x0e,
+ 0x0d, 0xee, 0xa0, 0xdd,
+ 0x1e, 0x70, 0x22, 0x12, 0x17, 0x35, 0x00, 0x2f, 0x10, 0x0f, 0x10, 0x03,
+ 0x11, 0x21, 0x00, 0xe2,
+ 0x02, 0x60, 0xd8, 0x90, 0x02, 0x45, 0x31, 0x21, 0x0f, 0xec, 0x0f, 0xe0,
+ 0x01, 0x37, 0x45, 0xed,
+ 0x9f, 0x0f, 0xe0, 0xd0, 0xf1, 0xe0, 0x02, 0x10, 0xee, 0xed, 0x23, 0x23,
+ 0xe1, 0x8e, 0xff, 0xc8,
+ 0x00, 0x65, 0x02, 0xf1, 0xff, 0xff, 0x01, 0x07, 0x22, 0x00, 0xff, 0xef,
+ 0xdf, 0x8e, 0xe0, 0x03,
+ 0x46, 0x1f, 0x0b, 0xf0, 0x20, 0x3f, 0x0e, 0x10, 0x77, 0x40, 0x0e, 0xdf,
+ 0x00, 0x20, 0xdf, 0xfe,
+ 0x20, 0x62, 0xff, 0xcc, 0x03, 0x34, 0x31, 0x40, 0xfc, 0xed, 0x0f, 0x00,
+ 0xdf, 0xda, 0xce, 0xbf,
+ 0x0f, 0x12, 0x41, 0x0f, 0x4e, 0x0f, 0x10, 0x26, 0x24, 0x10, 0x0e, 0xe1,
+ 0xe0, 0xdc, 0xce, 0xd0,
+ 0xe1, 0x80, 0xef, 0x05, 0x24, 0x40, 0x20, 0x14, 0xe1, 0xb0, 0x0d, 0x03,
+ 0x04, 0xe2, 0xf1, 0xde,
+ 0x9f, 0x02, 0x27, 0x00, 0x2a, 0xff, 0xef, 0xd0, 0x0e, 0x3f, 0x40, 0x10,
+ 0x22, 0x44, 0x00, 0xbd,
+ 0x05, 0x01, 0xd0, 0xc0, 0x07, 0x21, 0x00, 0x14, 0x73, 0x50, 0xfe, 0xee,
+ 0xe1, 0x05, 0x30, 0x0d,
+ 0xff, 0x53, 0x30, 0x0b, 0x30, 0x2f, 0x3f, 0x4f, 0xcc, 0x8c, 0xf0, 0x04,
+ 0x11, 0x21, 0x02, 0x02,
+ 0x42, 0x00, 0xeb, 0xeb, 0x4f, 0x4f, 0xfe, 0xef, 0x41, 0x23, 0xb0, 0xdb,
+ 0x00, 0x26, 0x32, 0xc0,
+ 0xaa, 0x0f, 0x31, 0x11, 0xe0, 0x01, 0x21, 0x30, 0xcb, 0xf0, 0x42, 0x53,
+ 0x01, 0xe0, 0x02, 0x0e,
+ 0x10, 0x35, 0x2f, 0x0e, 0x03, 0x80, 0xd9, 0x0e, 0x30, 0x23, 0xe4, 0x00,
+ 0xfd, 0xf0, 0x8e, 0xfb,
+ 0xf0, 0x13, 0x01, 0xff, 0xcc, 0xfe, 0xce, 0x01, 0x37, 0x02, 0x9d, 0x0c,
+ 0x00, 0x03, 0x0e, 0xfb,
+ 0x00, 0x2f, 0x00, 0x0e, 0xff, 0x30, 0x32, 0x77, 0x43, 0xf1, 0xd0, 0x12,
+ 0x43, 0x01, 0xde, 0xea,
+ 0xdf, 0xfe, 0xe0, 0x12, 0x44, 0x00, 0x0c, 0x50, 0x31, 0x10, 0x30, 0x1f,
+ 0x3f, 0xfc, 0xce, 0xed,
+ 0xdc, 0x01, 0x43, 0x11, 0x43, 0x14, 0x13, 0x06, 0xd2, 0xb0, 0x10, 0x53,
+ 0xee, 0xee, 0xe0, 0x20,
+ 0x64, 0x00, 0xcd, 0x00, 0x44, 0x15, 0x00, 0x01, 0x20, 0x01, 0xd6, 0xd1,
+ 0x1f, 0x7f, 0x11, 0x00,
+ 0x0a, 0x20, 0x20, 0x53, 0x20, 0x2a, 0x2f, 0x52, 0x33, 0xce, 0xa8, 0xff,
+ 0xee, 0x00, 0xef, 0xf2,
+ 0x03, 0xeb, 0xce, 0xd0, 0x21, 0x42, 0xf0, 0xc0, 0x00, 0x10, 0x01, 0xf0,
+ 0xdc, 0x43, 0x47, 0x02,
+ 0x30, 0x0e, 0x0e, 0x10, 0x4f, 0xf0, 0xc2, 0xe4, 0xce, 0xf1, 0xe4, 0x1e,
+ 0x5d, 0x47, 0x47, 0x00,
+ 0xde, 0x0f, 0x1f, 0x00, 0x00, 0x10, 0x8f, 0xea, 0x0f, 0x00, 0x13, 0xe1,
+ 0xd0, 0xb1, 0xa0, 0x0c,
+ 0x10, 0x42, 0x01, 0xe0, 0x0f, 0x3f, 0x0f, 0x4e, 0x51, 0x25, 0x01, 0xec,
+ 0x0f, 0x32, 0xf2, 0xe2,
+ 0xf7, 0x24, 0xc0, 0xc0, 0xfb, 0xce, 0xce, 0xd0, 0x00, 0x30, 0xff, 0x0d,
+ 0x5e, 0x40, 0x31, 0x10,
+ 0x21, 0xea, 0xba, 0x00, 0x00, 0x34, 0x00, 0x9e, 0xff, 0x00, 0x45, 0x10,
+ 0x30, 0x0e, 0xfe, 0x0e,
+ 0x0e, 0x2e, 0x3e, 0x14, 0xc3, 0x8d, 0xfe, 0x15, 0x30, 0x0e, 0xad, 0x01,
+ 0xf7, 0x06, 0xf0, 0xdf,
+ 0x1f, 0x20, 0xe0, 0xd0, 0xe0, 0xe0, 0xb0, 0xd0, 0x06, 0x12, 0x42, 0xdf,
+ 0x8c, 0x0f, 0x00, 0x37,
+ 0xd2, 0xbf, 0x0e, 0x30, 0x00, 0x20, 0x74, 0x11, 0x00, 0x0c, 0xdc, 0x00,
+ 0xe0, 0x0f, 0x2f, 0x11,
+ 0xe6, 0xe0, 0xfc, 0x0f, 0x32, 0xf4, 0x01, 0x71, 0x23, 0x00, 0x00, 0x52,
+ 0x0e, 0x0e, 0xf0, 0x0e,
+ 0xd8, 0x4d, 0x5f, 0x31, 0x20, 0xff, 0x0c, 0x30, 0x21, 0x00, 0x80, 0xe7,
+ 0x1f, 0x0c, 0xc0, 0x20,
+ 0x75, 0x21, 0x20, 0x0e, 0xeb, 0xf0, 0xf2, 0xff, 0xbf, 0xf0, 0x00, 0x00,
+ 0x36, 0xd1, 0xd0, 0x4f,
+ 0x21, 0xf2, 0x9f, 0x0c, 0x24, 0x34, 0xf0, 0xbd, 0x00, 0x00, 0x24, 0x50,
+ 0x10, 0x00, 0x00, 0x46,
+ 0x31, 0xdd, 0xd0, 0x21, 0x27, 0xa1, 0xf0, 0xfe, 0xd0, 0xe3, 0xd5, 0x11,
+ 0x30, 0x02, 0x9e, 0x0e,
+ 0x00, 0x33, 0x60, 0x1c, 0x0e, 0xdf, 0x00, 0x00, 0xcc, 0x02, 0x46, 0x20,
+ 0xdd, 0xad, 0x14, 0x41,
+ 0x0a, 0x0e, 0xe0, 0x02, 0x2f, 0xe8, 0xcf, 0xff, 0x00, 0x00, 0x10, 0x23,
+ 0x30, 0x00, 0x0e, 0x71,
+ 0x62, 0x00, 0xf0, 0xe1, 0x1d, 0x2a, 0xff, 0xec, 0x2f, 0x3f, 0x11, 0xe1,
+ 0xbc, 0x1c, 0x4f, 0x20,
+ 0x13, 0x00, 0xdb, 0x1e, 0x20, 0x11, 0x04, 0x04, 0xe1, 0xc0, 0xd2, 0xd4,
+ 0x54, 0x31, 0xe3, 0x82,
+ 0xc0, 0x0f, 0xef, 0x04, 0x04, 0xa0, 0x00, 0xf0, 0x0f, 0x24, 0x01, 0x24,
+ 0x73, 0x08, 0x0b, 0xf0,
+ 0x30, 0x31, 0x20, 0xe0, 0xee, 0x00, 0x06, 0xd0, 0xf0, 0x1f, 0x12, 0x83,
+ 0xec, 0xde, 0xf0, 0xf0,
+ 0x02, 0xeb, 0xbe, 0xf2, 0xe3, 0xfb, 0x2e, 0x72, 0x17, 0x12, 0x0e, 0xfe,
+ 0x0f, 0xdf, 0x0f, 0x1e,
+ 0x61, 0x22, 0x01, 0x0c, 0x0d, 0x0f, 0x76, 0x74, 0x22, 0xf0, 0xec, 0x00,
+ 0x20, 0x24, 0xee, 0xef,
+ 0x00, 0xef, 0xdf, 0x21, 0x77, 0x10, 0x0f, 0xf0, 0x00, 0xe0, 0xf9, 0x20,
+ 0x41, 0x14, 0xdf, 0xbd,
+ 0x0e, 0xf3, 0x23, 0x33, 0xdf, 0xde, 0x0f, 0x0d, 0xbf, 0x0e, 0x1b, 0x61,
+ 0x14, 0xf0, 0xda, 0x30,
+ 0x50, 0x23, 0x02, 0xd6, 0xd1, 0xc0, 0x00, 0xbe, 0xcd, 0xe0, 0xf1, 0xe0,
+ 0xc0, 0xe8, 0xd0, 0x20,
+ 0x75, 0x0f, 0xfe, 0x00, 0x0e, 0x0f, 0x30, 0x00, 0xe0, 0xff, 0x00, 0xdf,
+ 0x12, 0x77, 0x33, 0x01,
+ 0xdf, 0x0d, 0xe0, 0xef, 0x01, 0x57, 0x30, 0xff, 0xcd, 0xfe, 0xea, 0x00,
+ 0x30, 0x34, 0x51, 0x21,
+ 0x01, 0xff, 0x5f, 0x5f, 0x0d, 0xcb, 0xff, 0xff, 0xf0, 0x32, 0x0e, 0xbc,
+ 0x02, 0x26, 0x30, 0xe0,
+ 0xed, 0x70, 0x34, 0xf0, 0xbd, 0xfe, 0xf0, 0xf4, 0x03, 0xf3, 0x10, 0x01,
+ 0x00, 0x0c, 0xec, 0xcf,
+ 0x10, 0x72, 0x67, 0xff, 0xea, 0xff, 0x0f, 0x21, 0x04, 0x23, 0xe0, 0xdf,
+ 0xfe, 0x64, 0x63, 0x10,
+ 0x0d, 0xf0, 0x03, 0x2c, 0xfc, 0xef, 0x02, 0x14, 0x21, 0xf1, 0x9d, 0xfb,
+ 0x02, 0x23, 0x10, 0xec,
+ 0xd0, 0x15, 0x60, 0x0e, 0xec, 0x03, 0x02, 0x0f, 0xf0, 0x03, 0xfb, 0xfd,
+ 0x00, 0x00, 0xc0, 0xc0,
+ 0x0e, 0xb8, 0xff, 0x00, 0x24, 0x34, 0xf0, 0xfe, 0x40, 0x63, 0x42, 0x3f,
+ 0x1f, 0x02, 0xef, 0xda,
+ 0xed, 0xce, 0xe2, 0x07, 0x12, 0xff, 0xd0, 0xe0, 0x02, 0x01, 0x50, 0x3f,
+ 0x0c, 0xd0, 0x72, 0x53,
+ 0x0d, 0x1f, 0x47, 0x02, 0xc0, 0x0e, 0x0d, 0x00, 0x47, 0x00, 0xee, 0xbc,
+ 0xfe, 0x00, 0x30, 0xe2,
+ 0x8b, 0x0d, 0x03, 0x05, 0x0f, 0x0c, 0xe1, 0xe0, 0xf0, 0xdb, 0xed, 0x00,
+ 0x61, 0x35, 0x1f, 0x10,
+ 0x0f, 0x10, 0x33, 0x21, 0x00, 0xdf, 0x00, 0x40, 0x4b, 0xdf, 0xe0, 0x00,
+ 0x2e, 0xdc, 0x90, 0x01,
+ 0x3f, 0x3c, 0x10, 0xf0, 0x9b, 0xfa, 0xe0, 0xe1, 0x22, 0x20, 0xf0, 0x83,
+ 0xf6, 0x0f, 0x00, 0x23,
+ 0x17, 0x32, 0x31, 0xd0, 0x8f, 0xe0, 0x1e, 0x20, 0xf1, 0xd0, 0x34, 0x32,
+ 0xd0, 0x0c, 0x41, 0x33,
+ 0x22, 0x21, 0x53, 0x32, 0x1d, 0x1c, 0x41, 0x00, 0xf1, 0x16, 0xde, 0xec,
+ 0x1f, 0xde, 0xa0, 0xf1,
+ 0xdc, 0x9c, 0x01, 0x03, 0x20, 0x3e, 0xfa, 0xaa, 0xff, 0x22, 0x22, 0x1d,
+ 0xfb, 0xae, 0x0f, 0x00,
+ 0x30, 0xf2, 0xf0, 0x1e, 0x44, 0x30, 0xf8, 0xee, 0x21, 0x23, 0x55, 0x10,
+ 0x1d, 0x1e, 0x00, 0xf3,
+ 0xd1, 0xd0, 0x02, 0x22, 0xf1, 0xa2, 0xf2, 0x10, 0x20, 0x1e, 0x18, 0x2a,
+ 0x41, 0x52, 0x20, 0x00,
+ 0x9e, 0x01, 0xf1, 0xff, 0xe0, 0x07, 0x22, 0x0f, 0x8c, 0xdf, 0xfd, 0xf2,
+ 0x14, 0x41, 0x00, 0x00,
+ 0xe3, 0x00, 0x10, 0x16, 0x24, 0x02, 0x00, 0xff, 0x52, 0x22, 0xbc, 0x0f,
+ 0x01, 0xf2, 0xad, 0x0c,
+ 0x00, 0x20, 0x0f, 0x20, 0x42, 0x47, 0x01, 0xe9, 0xff, 0x40, 0x10, 0xe0,
+ 0xd0, 0x9a, 0xf0, 0x01,
+ 0x13, 0x5f, 0x0c, 0xe0, 0x00, 0x5f, 0x0f, 0xe0, 0x02, 0x00, 0x2f, 0x1e,
+ 0xe9, 0xcd, 0x0f, 0x41,
+ 0x22, 0x12, 0x63, 0x1f, 0x0e, 0x0c, 0x2e, 0x40, 0x33, 0x11, 0xf9, 0xf0,
+ 0xae, 0xef, 0xee, 0x05,
+ 0x76, 0xde, 0xd0, 0x13, 0x00, 0xc0, 0xd0, 0x07, 0xe0, 0xce, 0x00, 0x47,
+ 0x10, 0xff, 0x0f, 0x40,
+ 0x1f, 0x0f, 0xff, 0x40, 0x33, 0xe0, 0xaa, 0xff, 0x00, 0x00, 0xf0, 0xef,
+ 0xd5, 0xd2, 0x01, 0x0f,
+ 0x8f, 0x36, 0x63, 0x0e, 0xee, 0x22, 0x43, 0x0f, 0xfc, 0x01, 0x11, 0x12,
+ 0x00, 0xbd, 0x00, 0x00,
+ 0x14, 0xce, 0xec, 0xde, 0x00, 0x54, 0x53, 0x2f, 0x20, 0x00, 0x09, 0xfd,
+ 0xee, 0x31, 0x63, 0x00,
+ 0x0c, 0x00, 0xd0, 0xec, 0xfe, 0xe0, 0xd3, 0xd7, 0xce, 0xcd, 0xff, 0x1e,
+ 0x7d, 0x4f, 0x07, 0x47,
+ 0x00, 0xde, 0xfe, 0x0f, 0x33, 0x77, 0x00, 0xe0, 0x0f, 0x0f, 0x21, 0x00,
+ 0xd0, 0x0f, 0x20, 0x10,
+ 0xde, 0xe0, 0x0e, 0x30, 0x04, 0x03, 0xd0, 0xfe, 0x2f, 0x00, 0xb1, 0xe0,
+ 0xef, 0xd4, 0xe6, 0xad,
+ 0xde, 0xc0, 0xd3, 0xae, 0xeb, 0xff, 0xed, 0x00, 0x37, 0x40, 0xfd, 0xde,
+ 0xfc, 0xff, 0xef, 0xcd,
+ 0xbd, 0xef, 0x05, 0x05, 0x12, 0x00, 0x00, 0x74, 0x22, 0x32, 0x71, 0x2f,
+ 0xed, 0x01, 0x22, 0x00,
+ 0xfb, 0xd0, 0xfd, 0xca, 0x0f, 0x4f, 0x21, 0x14, 0xfe, 0xf9, 0x50, 0x40,
+ 0xe1, 0xbd, 0x0e, 0x00,
+ 0x2f, 0x22, 0x63, 0x27, 0x03, 0x10, 0x10, 0xfd, 0xe0, 0xd0, 0x30, 0x21,
+ 0xb1, 0xdc, 0xbb, 0xef,
+ 0xf3, 0x07, 0x45, 0x10, 0x10, 0x00, 0x4f, 0x50, 0x44, 0x10, 0x30, 0x0d,
+ 0xc0, 0x0f, 0xf0, 0xef,
+ 0x00, 0x61, 0x10, 0x08, 0xf0, 0x00, 0xf1, 0x01, 0x21, 0x0f, 0xad, 0xef,
+ 0xdf, 0xfe, 0xe2, 0xf4,
+ 0xf0, 0xde, 0xec, 0x00, 0xff, 0x2d, 0x70, 0x32, 0xfc, 0xd8, 0xd0, 0xf2,
+ 0xb0, 0xe0, 0xe0, 0x04,
+ 0xd2, 0x24, 0x50, 0xfc, 0xb0, 0x0f, 0x20, 0x76, 0x21, 0x01, 0x3e, 0x1c,
+ 0x11, 0x16, 0x01, 0xc0,
+ 0x00, 0x12, 0x10, 0xba, 0xe0, 0x10, 0x31, 0x00, 0xe0, 0xcb, 0xef, 0x9e,
+ 0xde, 0xd0, 0xe1, 0xe0,
+ 0x22, 0x12, 0xda, 0xbe, 0x20, 0x50, 0x15, 0x51, 0x22, 0x13, 0x70, 0x12,
+ 0x0f, 0xfb, 0x0f, 0x10,
+ 0x45, 0x00, 0xde, 0xb8, 0xf0, 0x01, 0x00, 0xd0, 0xc0, 0xf0, 0x01, 0x01,
+ 0x1a, 0x00, 0x2d, 0x00,
+ 0xd8, 0x21, 0x5f, 0x38, 0x5b, 0x22, 0x18, 0x38, 0xba, 0xde, 0x11, 0x10,
+ 0x00, 0x40, 0x63, 0x11,
+ 0x0b, 0xce, 0x2f, 0x00, 0xee, 0x9a, 0x22, 0x57, 0xed, 0x00, 0x32, 0xdd,
+ 0xde, 0x42, 0x25, 0xce,
+ 0x0f, 0x33, 0xfe, 0xcd, 0x00, 0x45, 0x21, 0x0e, 0xd0, 0x0f, 0x0f, 0xdc,
+ 0xbe, 0xf2, 0x06, 0x01,
+ 0x02, 0x20, 0xdd, 0xe0, 0x03, 0xf0, 0xa0, 0x25, 0x02, 0x42, 0x30, 0x0c,
+ 0xf0, 0x01, 0x12, 0x3f,
+ 0xff, 0xbf, 0xe0, 0x2b, 0x50, 0x01, 0x00, 0xfe, 0xba, 0xe0, 0xae, 0xef,
+ 0xf2, 0x02, 0x00, 0x20,
+ 0x47, 0x00, 0x02, 0x75, 0x30, 0xec, 0xf0, 0x12, 0x1f, 0x12, 0x25, 0xe0,
+ 0xfd, 0xe0, 0x1f, 0xff,
+ 0x8d, 0x0d, 0x30, 0x54, 0x00, 0x0e, 0x43, 0x1b, 0x1b, 0x20, 0x21, 0xee,
+ 0xe0, 0x07, 0xf1, 0xbe,
+ 0x0e, 0xc0, 0xcd, 0xcd, 0x14, 0x24, 0xf2, 0xcb, 0xdc, 0x11, 0x66, 0x11,
+ 0x0f, 0xfd, 0x10, 0x74,
+ 0x0f, 0xee, 0x10, 0x42, 0x13, 0xf0, 0xf0, 0x24, 0x10, 0xe2, 0xc3, 0xe0,
+ 0x02, 0xfe, 0xdc, 0xe0,
+ 0x02, 0x01, 0x06, 0x34, 0x10, 0xed, 0xd0, 0x12, 0x64, 0x52, 0x22, 0x20,
+ 0xdc, 0xfc, 0x14, 0x43,
+ 0x02, 0xbc, 0xfe, 0x00, 0xec, 0xab, 0x01, 0x04, 0x20, 0x30, 0x0f, 0x8b,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0x00, 0x4f, 0x1f, 0x0f, 0xee, 0x10, 0x17, 0x22, 0x0f, 0x0d, 0xd0, 0xf0,
+ 0xef, 0x0f, 0x40, 0x4f,
+ 0x3f, 0x52, 0x1b, 0xe8, 0xca, 0x00, 0x40, 0x1d, 0x70, 0x32, 0x00, 0xdf,
+ 0x1e, 0x50, 0x11, 0x22,
+ 0x15, 0x02, 0x00, 0xc0, 0xc1, 0xe3, 0xbf, 0xdb, 0xe0, 0xe6, 0xef, 0xce,
+ 0x11, 0x35, 0xf0, 0xf1,
+ 0x50, 0x41, 0x00, 0xef, 0x0e, 0x50, 0x16, 0xd0, 0xe0, 0x40, 0x35, 0xf0,
+ 0xaf, 0x0c, 0x0f, 0x23,
+ 0x32, 0xec, 0xff, 0x01, 0x22, 0x13, 0xff, 0xab, 0xe0, 0x05, 0x02, 0x01,
+ 0xe0, 0xec, 0xcf, 0xd0,
+ 0x00, 0x21, 0xef, 0x1a, 0x3f, 0x20, 0x50, 0x42, 0x0d, 0xdd, 0xf2, 0x45,
+ 0x42, 0x02, 0xdf, 0xdb,
+ 0xef, 0x3f, 0x71, 0x21, 0x31, 0x20, 0x0b, 0xbe, 0x0f, 0x53, 0x22, 0x20,
+ 0x56, 0x11, 0xfc, 0xfe,
+ 0xff, 0xe2, 0x23, 0x33, 0xef, 0xdd, 0x24, 0x02, 0x56, 0x88, 0xd1, 0x72,
+ 0xca, 0x11, 0x31, 0x00,
+ 0x00, 0xdc, 0x21, 0x63, 0xff, 0xcd, 0x00, 0x02, 0x02, 0x0f, 0x12, 0x04,
+ 0x00, 0x0f, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0xab, 0x00, 0xf0, 0xf0, 0xf2, 0xfe, 0x0c, 0x00, 0xe0,
+ 0xd3, 0x9e, 0xf0, 0x27,
+ 0x34, 0x1e, 0xed, 0xdf, 0xee, 0x0f, 0x31, 0x34, 0x33, 0x00, 0x9b, 0x00,
+ 0x01, 0x21, 0x00, 0x02,
+ 0x10, 0x51, 0x05, 0xf0, 0x00, 0x2e, 0x0b, 0x8a, 0xe0, 0x44, 0x10, 0x00,
+ 0xeb, 0x0f, 0x70, 0x10,
+ 0x0f, 0x10, 0x12, 0xcb, 0xef, 0x00, 0x23, 0xee, 0xbb, 0x12, 0x21, 0xf1,
+ 0x10, 0x45, 0x20, 0x00,
+ 0x00, 0x0e, 0xfe, 0xf0, 0xe0, 0x47, 0x02, 0xd0, 0xcd, 0x8c, 0x00, 0x02,
+ 0x01, 0x22, 0x0f, 0xe8,
+ 0xce, 0x10, 0x53, 0x22, 0xfe, 0x1f, 0x63, 0xef, 0xfd, 0x01, 0xf4, 0xf3,
+ 0x04, 0x63, 0x10, 0x1b,
+ 0xf0, 0xe0, 0x03, 0x00, 0x0d, 0xbe, 0x00, 0x00, 0x15, 0x23, 0x0c, 0x0e,
+ 0x52, 0x37, 0x00, 0xb0,
+ 0xce, 0xfd, 0x0e, 0x0f, 0xe0, 0x14, 0x46, 0xff, 0xad, 0x0e, 0x11, 0x02,
+ 0x13, 0x00, 0xef, 0x00,
+ 0x23, 0x40, 0x4d, 0x0a, 0x30, 0x45, 0x11, 0x12, 0x01, 0x0e, 0xde, 0x23,
+ 0x14, 0x88, 0x8d, 0xf0,
+ 0x02, 0x01, 0x25, 0x00, 0xef, 0x0d, 0x00, 0x33, 0x1e, 0x20, 0x32, 0x2f,
+ 0x50, 0x45, 0x24, 0x10,
+ 0x1f, 0x1c, 0x21, 0xe3, 0xb0, 0xec, 0xed, 0xef, 0x04, 0x23, 0xcf, 0xae,
+ 0xfe, 0xdc, 0xe8, 0x00,
+ 0x2e, 0x20, 0xd0, 0xdb, 0x00, 0x02, 0x11, 0xb0, 0xe0, 0xc3, 0x35, 0x00,
+ 0x0b, 0x00, 0x70, 0x61,
+ 0x00, 0x20, 0x00, 0x0e, 0xcc, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x00,
+ 0x10, 0x31, 0x1d, 0x42,
+ 0x77, 0xa9, 0xfd, 0x77, 0xe1, 0xeb, 0x11, 0x35, 0xde, 0xde, 0x33, 0x22,
+ 0xdd, 0xdf, 0x21, 0x73,
+ 0x00, 0xeb, 0x01, 0x21, 0x00, 0xf1, 0x00, 0x00, 0x13, 0x00, 0xef, 0x0f,
+ 0xf1, 0x11, 0x10, 0x0d,
+ 0x30, 0x23, 0xba, 0x00, 0x71, 0x00, 0x0f, 0x10, 0x04, 0x02, 0xf0, 0xff,
+ 0x10, 0xde, 0xff, 0x44,
+ 0x01, 0xe1, 0xdc, 0x0a, 0x00, 0x01, 0xbc, 0xca, 0x30, 0x60, 0x0f, 0xfd,
+ 0x32, 0x42, 0x12, 0x0f,
+ 0xb9, 0xff, 0x00, 0x13, 0xde, 0xac, 0x01, 0x14, 0x01, 0x00, 0xf0, 0x0e,
+ 0x22, 0x35, 0x12, 0x0f,
+ 0xba, 0x00, 0x20, 0xf1, 0x00, 0x02, 0x72, 0x43, 0x0d, 0x0e, 0x55, 0x10,
+ 0x00, 0xd1, 0xf0, 0xd0,
+ 0x0c, 0xde, 0xc0, 0xcc, 0xf1, 0x02, 0xed, 0xaf, 0x02, 0x07, 0x47, 0xf1,
+ 0x0e, 0x40, 0xf0, 0x34,
+ 0x62, 0x01, 0x10, 0xfb, 0xef, 0x10, 0x01, 0x00, 0xe1, 0xe1, 0x25, 0x0f,
+ 0xed, 0xdf, 0xa0, 0xdc,
+ 0xf0, 0x72, 0x25, 0x1f, 0xfd, 0xdf, 0x00, 0x00, 0x11, 0x42, 0x1b, 0xd0,
+ 0xdf, 0x00, 0x66, 0x0f,
+ 0xeb, 0x00, 0x40, 0x22, 0x01, 0xcd, 0xcc, 0xee, 0x21, 0x76, 0x10, 0x0c,
+ 0xf0, 0x2d, 0x3f, 0x1d,
+ 0x20, 0x77, 0x10, 0xd0, 0xef, 0x00, 0x00, 0x00, 0xa0, 0xf3, 0xe2, 0xff,
+ 0xde, 0x20, 0x57, 0x13,
+ 0xfe, 0x0e, 0x0f, 0x0f, 0x02, 0x17, 0x11, 0xd0, 0xf0, 0x00, 0xbe, 0xdf,
+ 0x10, 0x00, 0xd0, 0xaa,
+ 0x0f, 0x0f, 0x00, 0x20, 0x71, 0x01, 0x0f, 0xdf, 0x00, 0x11, 0x37, 0x24,
+ 0xdf, 0xd0, 0x01, 0x15,
+ 0x53, 0xd3, 0x8f, 0xec, 0x00, 0xf0, 0xeb, 0xf0, 0x43, 0x52, 0x2d, 0x20,
+ 0x2f, 0x0e, 0x57, 0x32,
+ 0x0e, 0xdf, 0x0f, 0xf1, 0xf1, 0x0f, 0xfd, 0x88, 0x00, 0x54, 0xcb, 0x11,
+ 0x10, 0x10, 0x11, 0xca,
+ 0x01, 0x73, 0xfe, 0xec, 0x01, 0x12, 0x00, 0xfe, 0xf0, 0x11, 0x12, 0x00,
+ 0x22, 0x42, 0x33, 0xee,
+ 0xed, 0x10, 0x1d, 0x0c, 0x00, 0xe2, 0xa2, 0xeb, 0x00, 0x45, 0xee, 0x00,
+ 0x67, 0x11, 0xef, 0xee,
+ 0x00, 0x02, 0xfe, 0x1f, 0x77, 0x04, 0xdd, 0xdc, 0x00, 0x55, 0x00, 0x01,
+ 0xd0, 0x0f, 0x0e, 0xce,
+ 0xf0, 0xe0, 0xbc, 0xee, 0xd0, 0xf1, 0xe2, 0x1f, 0x41, 0x35, 0xef, 0x10,
+ 0x62, 0x01, 0x00, 0x02,
+ 0x0f, 0x1e, 0x21, 0xf3, 0x06, 0xce, 0x00, 0x02, 0xe0, 0xdf, 0x00, 0x00,
+ 0xfd, 0x59, 0x2f, 0x3e,
+ 0x61, 0x00, 0x08, 0x0f, 0x0e, 0x71, 0x31, 0x00, 0x11, 0xfe, 0xea, 0x00,
+ 0x00, 0xfe, 0xf1, 0x41,
+ 0x0d, 0x1f, 0xe0, 0x14, 0x16, 0x02, 0x03, 0xc0, 0x13, 0xff, 0xff, 0x51,
+ 0x01, 0x66, 0x21, 0x0f,
+ 0x0d, 0x35, 0x02, 0xf0, 0x21, 0x74, 0xec, 0x9a, 0x10, 0x22, 0x10, 0xf1,
+ 0xe0, 0x00, 0x31, 0x31,
+ 0xe0, 0xd0, 0xf0, 0xf0, 0x99, 0x00, 0x22, 0x34, 0xe0, 0xcc, 0x00, 0x12,
+ 0x0f, 0xb8, 0x00, 0xf1,
+ 0x03, 0x01, 0xbe, 0xed, 0x10, 0xd0, 0x8a, 0xf1, 0x12, 0x0f, 0xca, 0xf0,
+ 0x01, 0x62, 0x01, 0x01,
+ 0x10, 0x0f, 0x2e, 0x31, 0x22, 0x44, 0x02, 0xf0, 0xee, 0x2e, 0x63, 0xd8,
+ 0x11, 0x75, 0xee, 0xdc,
+ 0x01, 0x32, 0xe0, 0xcb, 0x01, 0x00, 0xbf, 0xfe, 0x01, 0x22, 0x00, 0xff,
+ 0x00, 0x22, 0x1e, 0x3f,
+ 0x30, 0x0f, 0xee, 0x2e, 0x74, 0x63, 0xfe, 0xe9, 0x00, 0x36, 0x11, 0x01,
+ 0x00, 0x0d, 0xdf, 0x13,
+ 0x03, 0xaa, 0xf0, 0xcf, 0xe0, 0xf0, 0xf0, 0x31, 0xf0, 0xcb, 0x10, 0x63,
+ 0x01, 0xf2, 0x0f, 0x09,
+ 0x00, 0x00, 0x23, 0x00, 0xff, 0xce, 0xcd, 0x0f, 0x22, 0x56, 0x00, 0x1e,
+ 0xeb, 0x00, 0x73, 0x0f,
+ 0x0e, 0x10, 0x01, 0xda, 0xcf, 0x00, 0x24, 0x12, 0xcf, 0xef, 0x00, 0xfb,
+ 0x80, 0xef, 0x00, 0x02,
+ 0x34, 0x25, 0x2f, 0xfc, 0x02, 0x23, 0x71, 0x31, 0x10, 0xcd, 0x02, 0x05,
+ 0x02, 0x00, 0x00, 0xfd,
+ 0xe0, 0xef, 0x9e, 0x0c, 0xed, 0xfb, 0x0e, 0x22, 0x42, 0x0c, 0xe9, 0xff,
+ 0x00, 0x31, 0x02, 0x32,
+ 0x15, 0xd1, 0xb1, 0x33, 0x41, 0xcd, 0xdf, 0x02, 0xc1, 0xdc, 0x1f, 0x7f,
+ 0x61, 0x0f, 0x08, 0x0f,
+ 0x20, 0x52, 0x03, 0x00, 0x0f, 0x1c, 0x00, 0xe6, 0xf0, 0x01, 0xe0, 0xed,
+ 0x0f, 0xcd, 0xe2, 0xd0,
+ 0xd0, 0xcc, 0xed, 0x11, 0x74, 0x10, 0xeb, 0x2e, 0x40, 0xda, 0xc0, 0x40,
+ 0x75, 0x13, 0x0f, 0xcb,
+ 0x01, 0x45, 0x00, 0xdf, 0x00, 0x02, 0x00, 0xd2, 0x12, 0x10, 0xf0, 0xee,
+ 0x21, 0x42, 0xf0, 0xdc,
+ 0xf1, 0xc3, 0x00, 0x26, 0x75, 0x30, 0x12, 0x55, 0x01, 0xf0, 0x01, 0x30,
+ 0x2d, 0xfe, 0xf0, 0xf0,
+ 0x00, 0xcf, 0xee, 0xff, 0xfc, 0x8a, 0xfd, 0xdc, 0xfe, 0x0f, 0x12, 0x56,
+ 0x11, 0x43, 0x10, 0xcc,
+ 0xff, 0x01, 0x23, 0xf1, 0xcf, 0xe0, 0x03, 0xfd, 0x08, 0x1f, 0x62, 0x13,
+ 0x0e, 0x08, 0xef, 0x1d,
+ 0x70, 0x34, 0x0f, 0x0f, 0x0e, 0xfe, 0xde, 0x1e, 0x52, 0x67, 0x02, 0xfd,
+ 0xfd, 0x12, 0xf0, 0xab,
+ 0x35, 0x00, 0x9c, 0x11, 0x00, 0x02, 0x01, 0x0f, 0x02, 0x55, 0xed, 0xbc,
+ 0x01, 0x47, 0x00, 0xcf,
+ 0x0f, 0x00, 0x0f, 0x10, 0x13, 0xff, 0x0e, 0x01, 0x20, 0x21, 0x12, 0x0d,
+ 0x00, 0x27, 0x01, 0xb0,
+ 0xee, 0x0f, 0x23, 0x13, 0xe0, 0xbd, 0x2e, 0x54, 0x00, 0xf0, 0x02, 0x11,
+ 0xfb, 0xee, 0xff, 0xf0,
+ 0x02, 0xf1, 0xbd, 0xfd, 0x27, 0x14, 0xfd, 0x3f, 0x60, 0xf0, 0xfb, 0x0d,
+ 0x30, 0xf0, 0xaa, 0xfe,
+ 0x33, 0x03, 0xd0, 0xfd, 0x10, 0x22, 0x43, 0x12, 0x47, 0x00, 0xf0, 0xdd,
+ 0xe0, 0x70, 0x55, 0x10,
+ 0x00, 0xeb, 0x20, 0x30, 0x01, 0x01, 0x32, 0x20, 0xde, 0x9b, 0x00, 0x10,
+ 0xf0, 0xf2, 0xbe, 0xdb,
+ 0x15, 0x11, 0x0f, 0x20, 0x50, 0x0f, 0xbd, 0x02, 0x31, 0x0c, 0x0e, 0xf2,
+ 0x07, 0x02, 0xce, 0x1d,
+ 0x13, 0x01, 0x01, 0x05, 0x91, 0xdf, 0xbc, 0xff, 0xef, 0x00, 0xc0, 0x0e,
+ 0x10, 0xfd, 0x10, 0x60,
+ 0xf0, 0xe4, 0x11, 0x40, 0x24, 0xf4, 0xe1, 0xed, 0x20, 0x17, 0xb3, 0xd0,
+ 0xed, 0x00, 0x50, 0x0e,
+ 0x10, 0x23, 0x0a, 0x2d, 0xed, 0xde, 0xf0, 0x02, 0x3e, 0x73, 0x4f, 0x08,
+ 0xdb, 0xd0, 0xf1, 0xc1,
+ 0x0f, 0x0d, 0xfb, 0x0f, 0x21, 0xf0, 0x2d, 0x7f, 0x72, 0x07, 0x01, 0x00,
+ 0x2e, 0x12, 0x17, 0x11,
+ 0xf0, 0xcf, 0x2e, 0x12, 0x8f, 0x00, 0xf2, 0xfe, 0xf8, 0x10, 0x63, 0x00,
+ 0xf0, 0xeb, 0x10, 0x4f,
+ 0xee, 0xe0, 0x10, 0x03, 0xc0, 0xe1, 0xf0, 0x12, 0x37, 0x12, 0x12, 0xee,
+ 0x0d, 0x00, 0xa0, 0x14,
+ 0x41, 0x30, 0xf1, 0xef, 0x0d, 0x7e, 0x00, 0x36, 0xe0, 0xb0, 0x16, 0x1f,
+ 0xec, 0x00, 0x12, 0x01,
+ 0xa0, 0xd0, 0xfe, 0x00, 0x00, 0x0f, 0x54, 0x25, 0x3f, 0x3c, 0x1e, 0x0e,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x24, 0x33, 0x40, 0xd1, 0x9f, 0x01, 0x07, 0xf4, 0xed, 0x0e, 0xed, 0x8c,
+ 0xdf, 0xfe, 0x00, 0x00,
+ 0xd0, 0xd0, 0xf0, 0x15, 0x40, 0x0e, 0x30, 0x77, 0x72, 0x1f, 0x1f, 0x45,
+ 0x00, 0xfe, 0x0d, 0x74,
+ 0x16, 0x01, 0x00, 0xe0, 0x00, 0x00, 0xff, 0xdb, 0xcd, 0xef, 0xee, 0xec,
+ 0xe0, 0xf0, 0x05, 0xf0,
+ 0xce, 0xf0, 0x23, 0x74, 0x10, 0x0f, 0x00, 0x02, 0xef, 0xed, 0x1e, 0x22,
+ 0x27, 0xfd, 0xc8, 0x21,
+ 0x32, 0x8f, 0xec, 0x11, 0x42, 0x03, 0x0f, 0xdb, 0x20, 0x0f, 0x00, 0xcf,
+ 0xf3, 0xf0, 0xcd, 0x3e,
+ 0x73, 0x15, 0xeb, 0xab, 0x21, 0x32, 0xf0, 0xff, 0x00, 0x10, 0x10, 0x06,
+ 0x22, 0x00, 0xc0, 0x00,
+ 0x03, 0x00, 0xac, 0x00, 0x00, 0x21, 0x40, 0x40, 0x0f, 0x0e, 0xcd, 0x00,
+ 0x05, 0x2f, 0xfc, 0x01,
+ 0x46, 0xe0, 0xe0, 0xf3, 0xd1, 0x14, 0x50, 0x2d, 0x10, 0x26, 0x51, 0x10,
+ 0xdd, 0xef, 0x11, 0x70,
+ 0x00, 0x00, 0x50, 0x2d, 0x1f, 0x0f, 0x02, 0x0c, 0xdf, 0x01, 0xfd, 0x19,
+ 0x1f, 0xbd, 0x80, 0xeb,
+ 0xfe, 0xdd, 0xce, 0x03, 0x10, 0x1b, 0x0c, 0xff, 0x21, 0x77, 0x14, 0xac,
+ 0x23, 0x55, 0xca, 0x00,
+ 0x42, 0x00, 0xef, 0xff, 0x10, 0x55, 0xff, 0xee, 0x00, 0x00, 0x14, 0xff,
+ 0xdc, 0x02, 0x30, 0x00,
+ 0xd0, 0x02, 0x00, 0xd0, 0x30, 0x50, 0x13, 0xee, 0xff, 0x02, 0xff, 0x0e,
+ 0x32, 0x21, 0x77, 0x44,
+ 0xbb, 0x00, 0x11, 0x21, 0x0f, 0x00, 0x15, 0x00, 0xad, 0xfe, 0x0f, 0x12,
+ 0x03, 0xcf, 0x0c, 0x0e,
+ 0x0e, 0x1f, 0x40, 0x24, 0xf1, 0xe5, 0xe0, 0x02, 0x10, 0xdd, 0xde, 0xe2,
+ 0xc5, 0x34, 0xcb, 0xce,
+ 0x71, 0x41, 0x0f, 0x2e, 0x32, 0x1f, 0x1b, 0x1f, 0xef, 0xbd, 0x0f, 0x10,
+ 0x0f, 0xd9, 0xff, 0x52,
+ 0x23, 0xf0, 0xab, 0x00, 0x24, 0x10, 0x1f, 0x31, 0x01, 0xf1, 0xce, 0xed,
+ 0x02, 0xe2, 0xd0, 0xe2,
+ 0x03, 0x90, 0xfe, 0x07, 0x23, 0x00, 0x07, 0x02, 0xff, 0xac, 0x0f, 0x31,
+ 0x72, 0x1f, 0xfb, 0xef,
+ 0xfe, 0x00, 0xf0, 0xef, 0xdf, 0x13, 0x56, 0x00, 0x23, 0x1f, 0x0e, 0x02,
+ 0xe1, 0x9f, 0xfd, 0xf0,
+ 0x05, 0x14, 0xf0, 0x91, 0xf2, 0x05, 0x00, 0x0d, 0x4f, 0x4e, 0x37, 0x31,
+ 0xbc, 0xdd, 0x20, 0x55,
+ 0x00, 0xfe, 0x11, 0x20, 0xed, 0xcd, 0x12, 0x36, 0xf0, 0xde, 0x00, 0x02,
+ 0x1e, 0xc9, 0xcf, 0x30,
+ 0x40, 0x01, 0xcf, 0x0e, 0x1f, 0x75, 0x53, 0x0f, 0x0f, 0x01, 0x02, 0x00,
+ 0xfc, 0xff, 0x01, 0x04,
+ 0xee, 0xdd, 0x00, 0x00, 0x21, 0x30, 0x04, 0xa0, 0x06, 0x00, 0xfe, 0x73,
+ 0x31, 0x27, 0x02, 0x00,
+ 0x00, 0xcc, 0x00, 0x45, 0x76, 0x00, 0x9c, 0x01, 0x24, 0x0f, 0xed, 0xee,
+ 0xf0, 0xd1, 0xff, 0x12,
+ 0x0d, 0xea, 0x0f, 0x00, 0x44, 0x00, 0x1f, 0x50, 0x00, 0x12, 0x00, 0x9d,
+ 0x01, 0x07, 0xf1, 0xee,
+ 0xef, 0x01, 0x02, 0x00, 0x23, 0x0f, 0x0f, 0x77, 0x34, 0xfe, 0xdd, 0xcb,
+ 0x10, 0x52, 0x00, 0xfd,
+ 0x10, 0x01, 0x1f, 0x0b, 0x00, 0x30, 0xff, 0xdc, 0x32, 0x20, 0xfa, 0x00,
+ 0xe0, 0xf0, 0x62, 0x44,
+ 0xee, 0xef, 0x20, 0x61, 0x27, 0xf0, 0xae, 0x21, 0x03, 0xee, 0xff, 0x32,
+ 0x10, 0x10, 0xff, 0xef,
+ 0x00, 0x33, 0x33, 0x76, 0x3f, 0xce, 0x03, 0xbe, 0xed, 0x03, 0x13, 0x16,
+ 0x0f, 0xca, 0x51, 0x43,
+ 0x00, 0x22, 0x00, 0x35, 0xdd, 0xbe, 0x24, 0x00, 0xed, 0xf1, 0xf3, 0xe4,
+ 0x00, 0xba, 0xff, 0xbf,
+ 0xeb, 0x10, 0x11, 0x00, 0x00, 0xbd, 0x0f, 0xef, 0x00, 0x67, 0x13, 0x01,
+ 0xff, 0x0d, 0x11, 0x32,
+ 0xfc, 0xff, 0x11, 0x20, 0x2f, 0x72, 0x23, 0x0f, 0xe4, 0xf3, 0xe0, 0x35,
+ 0x62, 0x0c, 0xff, 0x0e,
+ 0xc8, 0xdd, 0xf0, 0x00, 0xd1, 0xa0, 0x02, 0xe1, 0xfd, 0xfd, 0x2f, 0x18,
+ 0x20, 0x30, 0x02, 0x11,
+ 0x3f, 0x7e, 0x7c, 0x0c, 0x1f, 0x33, 0x14, 0x14, 0x23, 0x00, 0xf1, 0xf4,
+ 0x00, 0x00, 0xdc, 0xf0,
+ 0x90, 0xed, 0x88, 0xb8, 0x11, 0x12, 0xfe, 0x00, 0x03, 0x10, 0xed, 0xee,
+ 0x53, 0x24, 0xff, 0xee,
+ 0x00, 0x20, 0xf0, 0xd0, 0x35, 0x42, 0x00, 0x1f, 0xca, 0x00, 0x61, 0x01,
+ 0xef, 0x0e, 0xdf, 0xec,
+ 0x03, 0x02, 0xac, 0xff, 0x14, 0x10, 0xc9, 0xe0, 0x40, 0x03, 0x41, 0x12,
+ 0x1e, 0x1f, 0xde, 0x21,
+ 0x33, 0xf1, 0xf4, 0xc1, 0x00, 0x10, 0x32, 0xce, 0xf2, 0x57, 0xfd, 0x10,
+ 0x75, 0x10, 0xdb, 0x10,
+ 0x10, 0x0f, 0xfe, 0x50, 0x12, 0xdc, 0xbe, 0xfe, 0xe1, 0xd1, 0x00, 0xf0,
+ 0xe3, 0x04, 0x03, 0x0c,
+ 0xdd, 0x45, 0x43, 0x00, 0x77, 0x71, 0xfe, 0xfc, 0x10, 0x11, 0x04, 0x04,
+ 0xcc, 0x00, 0xf5, 0x00,
+ 0xbb, 0xd0, 0x23, 0xc8, 0x9a, 0xd0, 0xe6, 0xc7, 0xdd, 0xbb, 0xdd, 0xed,
+ 0xdc, 0xcd, 0xec, 0xdd,
+ 0xdd, 0xcd, 0xec, 0xcc, 0xbc, 0xed, 0xdd, 0xed, 0xdc, 0xcd, 0xdc, 0xcd,
+ 0xdc, 0xcc, 0xdd, 0xdd,
+ 0xcb, 0xce, 0xed, 0xdd, 0xdc, 0xcd, 0xdd, 0xcd, 0xeb, 0xde, 0xdd, 0xdd,
+ 0xcd, 0xdc, 0xcd, 0xdd,
+ 0xcc, 0xcc, 0xdd, 0xce, 0xdd, 0xdd, 0xbc, 0xed, 0xcd, 0xed, 0xdc, 0xcd,
+ 0xee, 0xed, 0xdc, 0xee,
+ 0xde, 0xde, 0xee, 0xdf, 0xf0, 0xe0, 0xff, 0xd0, 0xef, 0xdf, 0xd0, 0xe0,
+ 0xb0, 0xee, 0xbd, 0xdb,
+ 0xde, 0xcf, 0xd0, 0xcf, 0xde, 0xbe, 0xd0, 0xd0, 0xd0, 0xd2, 0xd7, 0xd5,
+ 0xd3, 0xb3, 0xd3, 0xe5,
+ 0xd3, 0xd4, 0xc2, 0xd4, 0xc4, 0xd2, 0xc4, 0xd3, 0xd3, 0xb3, 0xe3, 0xf3,
+ 0xe2, 0xf3, 0x05, 0x00,
+ 0xef, 0x0f, 0x0f, 0x1d, 0x2c, 0x0a, 0x0d, 0x7e, 0x2e, 0x2d, 0x3c, 0x4e,
+ 0x2d, 0x1c, 0x2d, 0x6d,
+ 0x2d, 0x0a, 0x1e, 0x1c, 0x0d, 0xdc, 0xdd, 0xcd, 0xdd, 0xbb, 0xcd, 0xee,
+ 0xef, 0xed, 0xcd, 0xdd,
+ 0xdc, 0xef, 0xee, 0xdd, 0xbd, 0xda, 0xee, 0xed, 0xed, 0xfd, 0x0d, 0xed,
+ 0x0f, 0x1f, 0x0d, 0x20,
+ 0x76, 0x22, 0x12, 0x03, 0x04, 0x47, 0x23, 0xd2, 0x65, 0x02, 0x80, 0xd0,
+ 0x25, 0x44, 0x01, 0xd0,
+ 0xd0, 0x02, 0x33, 0x00, 0xd0, 0xc0, 0xe2, 0xe2, 0xb1, 0x05, 0x03, 0xd0,
+ 0x8e, 0xe0, 0x27, 0x35,
+ 0x01, 0xbf, 0xdf, 0xe0, 0x12, 0x67, 0x32, 0x00, 0xbd, 0xfe, 0x00, 0x21,
+ 0x11, 0x45, 0x43, 0x00,
+ 0x10, 0x0e, 0x0f, 0x67, 0x45, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x00, 0xed,
+ 0x10, 0x40, 0x65, 0x33,
+ 0x10, 0x32, 0x32, 0x10, 0x0d, 0xec, 0x42, 0x67, 0x22, 0x10, 0x00, 0x0e,
+ 0xdc, 0xee, 0x65, 0x66,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x11, 0x21, 0x11, 0x00, 0x00, 0x31,
+ 0x45, 0x11, 0x0f, 0xce,
+ 0xcc, 0x11, 0x77, 0x34, 0xef, 0xf0, 0x10, 0x01, 0x00, 0x01, 0x22, 0x00,
+ 0x01, 0x45, 0x21, 0xf0,
+ 0xe0, 0x01, 0x01, 0x01, 0x22, 0x01, 0xbf, 0x00, 0x36, 0x11, 0xcf, 0xcd,
+ 0xf0, 0x54, 0x35, 0x21,
+ 0xf0, 0xdd, 0xde, 0x00, 0x32, 0xe0, 0xac, 0x33, 0x77, 0x01, 0x0f, 0xef,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x00, 0x11, 0x10, 0x22, 0x65, 0x11, 0x0f, 0xdb, 0x00, 0x74, 0x11, 0xfd,
+ 0xfe, 0x10, 0x0f, 0x00,
+ 0x22, 0x0f, 0xfc, 0xed, 0xfe, 0x55, 0x32, 0x0f, 0x0f, 0xed, 0x0f, 0x32,
+ 0xfd, 0xfe, 0x66, 0x11,
+ 0xee, 0xdc, 0xab, 0xf0, 0x55, 0x12, 0x00, 0xff, 0xee, 0xee, 0x01, 0x22,
+ 0xde, 0x01, 0x33, 0xdf,
+ 0x35, 0x75, 0x00, 0xef, 0xbd, 0xec, 0x23, 0x45, 0xff, 0x00, 0x12, 0x00,
+ 0xfe, 0xee, 0x00, 0x0f,
+ 0x54, 0x23, 0xff, 0xed, 0x11, 0x67, 0x01, 0xcd, 0xba, 0xff, 0x12, 0x22,
+ 0xef, 0xed, 0x00, 0x01,
+ 0x01, 0x01, 0xed, 0xff, 0x12, 0x23, 0x10, 0xed, 0x33, 0x77, 0xec, 0x0f,
+ 0x76, 0x00, 0xee, 0x54,
+ 0x33, 0x0f, 0xee, 0xdc, 0x00, 0x65, 0x00, 0x00, 0x12, 0x0f, 0xfe, 0x00,
+ 0x11, 0xec, 0xff, 0x32,
+ 0x21, 0x11, 0x10, 0xee, 0xfe, 0xcc, 0x99, 0x11, 0x65, 0x00, 0xef, 0x00,
+ 0x00, 0x11, 0x00, 0xff,
+ 0xef, 0x00, 0x23, 0x12, 0xee, 0x88, 0x00, 0x45, 0x10, 0xce, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0xba, 0xff, 0x11, 0x11, 0xef, 0x00, 0x23, 0xdd, 0xaa, 0x00,
+ 0x32, 0x00, 0xde, 0x00,
+ 0x00, 0xed, 0xee, 0x11, 0xdd, 0x88, 0xff, 0x44, 0x11, 0xde, 0xee, 0x00,
+ 0x00, 0xfe, 0x00, 0xce,
+ 0xdc, 0x65, 0x00, 0xdd, 0x00, 0xff, 0xfe, 0x01, 0x33, 0x00, 0xff, 0xdd,
+ 0xff, 0x44, 0x56, 0x00,
+ 0x00, 0x00, 0xfe, 0x00, 0xf0, 0xdc, 0x75, 0x11, 0xed, 0xdd, 0xff, 0x00,
+ 0x10, 0x66, 0x10, 0xcc,
+ 0xdd, 0x00, 0xf0, 0x00, 0x00, 0xee, 0x23, 0xff, 0x88, 0xfe, 0x33, 0xef,
+ 0xba, 0x00, 0x10, 0x21,
+ 0x00, 0xce, 0xfe, 0x00, 0x00, 0xff, 0x00, 0x21, 0x11, 0x00, 0xba, 0xcc,
+ 0xf0, 0x11, 0x21, 0xef,
+ 0xff, 0x00, 0xef, 0xee, 0xce, 0xfe, 0x02, 0x23, 0xbc, 0xca, 0xdd, 0x00,
+ 0x77, 0x01, 0xed, 0xff,
+ 0x01, 0x00, 0x00, 0x12, 0x21, 0xef, 0xab, 0x00, 0x00, 0xff, 0xee, 0x23,
+ 0x24, 0xde, 0xcd, 0x23,
+ 0x13, 0xde, 0x88, 0xff, 0x35, 0x00, 0xcf, 0xf0, 0x00, 0xef, 0x44, 0x54,
+ 0xee, 0xdd, 0xff, 0x12,
+ 0x45, 0xde, 0xcd, 0x33, 0x23, 0xed, 0xed, 0x22, 0x45, 0xcc, 0xee, 0x00,
+ 0x10, 0x21, 0xff, 0xdc,
+ 0x10, 0x52, 0x00, 0xfe, 0x0f, 0xba, 0xee, 0x32, 0x54, 0xff, 0xfe, 0x22,
+ 0x22, 0xfe, 0xbb, 0x00,
+ 0x01, 0x00, 0x13, 0x11, 0xcc, 0xfe, 0x67, 0x12, 0xfe, 0xee, 0x00, 0x55,
+ 0x00, 0xcb, 0xff, 0x43,
+ 0x11, 0x0f, 0x00, 0x22, 0xfe, 0xbb, 0x0f, 0x35, 0x42, 0xff, 0xce, 0x0f,
+ 0x22, 0x00, 0xef, 0x00,
+ 0x12, 0xdd, 0x89, 0x12, 0x34, 0xff, 0xee, 0x00, 0x00, 0xef, 0x00, 0x00,
+ 0x11, 0x00, 0xde, 0x00,
+ 0x44, 0xff, 0xdd, 0x34, 0xf0, 0x88, 0x01, 0x54, 0x00, 0xee, 0xff, 0x00,
+ 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0x11, 0xfe, 0x0f, 0xed, 0xdc, 0x63, 0x22, 0xeb, 0xed,
+ 0x0f, 0x0e, 0xeb, 0x61,
+ 0x21, 0xfe, 0x0e, 0xfc, 0xfd, 0x40, 0x77, 0x43, 0xeb, 0xdc, 0x10, 0x42,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x20, 0x0f, 0xfe, 0x00, 0x00, 0x1f, 0x74, 0x12, 0xfb, 0xee, 0x10, 0x77,
+ 0x10, 0xff, 0x0f, 0xf0,
+ 0x11, 0x32, 0xff, 0xaa, 0x0f, 0x44, 0x00, 0xdd, 0x11, 0x22, 0xff, 0x00,
+ 0x55, 0xf0, 0xcc, 0x00,
+ 0x13, 0x11, 0x01, 0x24, 0x00, 0xf0, 0x00, 0xd0, 0xbe, 0x35, 0x34, 0xdf,
+ 0x11, 0x11, 0x8c, 0xee,
+ 0x46, 0x00, 0xdf, 0x32, 0x22, 0xee, 0xde, 0x0f, 0x11, 0x33, 0x00, 0xfe,
+ 0x00, 0x0f, 0x10, 0x21,
+ 0x32, 0xff, 0x99, 0xdd, 0x00, 0x77, 0x00, 0xcd, 0x0f, 0x43, 0x23, 0xfe,
+ 0xb9, 0xff, 0x00, 0x32,
+ 0x76, 0xff, 0xee, 0x00, 0x32, 0x00, 0xed, 0x00, 0x12, 0x44, 0x21, 0xf0,
+ 0xfe, 0x11, 0x22, 0xf0,
+ 0xff, 0x67, 0x22, 0xde, 0xfe, 0x11, 0x45, 0x33, 0x00, 0xef, 0x22, 0x22,
+ 0x8b, 0x11, 0x47, 0x00,
+ 0xef, 0x00, 0x22, 0x00, 0xf0, 0x01, 0x12, 0xf0, 0x01, 0x43, 0x11, 0xde,
+ 0xf0, 0x77, 0x11, 0x00,
+ 0x22, 0x00, 0xff, 0x22, 0x01, 0x00, 0x00, 0x44, 0xf0, 0x35, 0x76, 0x00,
+ 0xde, 0xf0, 0x22, 0x64,
+ 0x01, 0xf0, 0x00, 0x00, 0x56, 0x22, 0xde, 0xcd, 0x34, 0x54, 0xee, 0xdd,
+ 0x12, 0x54, 0x01, 0x00,
+ 0xff, 0x00, 0x22, 0x00, 0xfe, 0x01, 0x67, 0x23, 0x0f, 0xed, 0x00, 0x23,
+ 0x44, 0x00, 0x0e, 0x01,
+ 0x11, 0xdb, 0x00, 0x75, 0x00, 0xff, 0x0f, 0x32, 0x22, 0xff, 0xee, 0x00,
+ 0x32, 0xff, 0xff, 0xee,
+ 0xcc, 0x66, 0x45, 0x00, 0xde, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
+ 0xcd, 0x11, 0x77, 0x22,
+ 0xcc, 0xdd, 0x00, 0x23, 0x00, 0x00, 0x11, 0x00, 0xbb, 0xff, 0x01, 0x11,
+ 0x00, 0xef, 0xa9, 0x00,
+ 0x43, 0x00, 0xba, 0x00, 0x32, 0x00, 0xee, 0xff, 0x10, 0x11, 0x00, 0x0f,
+ 0x0f, 0xee, 0xfe, 0x0f,
+ 0xde, 0xcc, 0x76, 0x32, 0xed, 0xbb, 0x00, 0x11, 0x00, 0xed, 0x00, 0x22,
+ 0x0f, 0x98, 0x00, 0x10,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0xee, 0x10, 0x54, 0x00, 0xcc, 0xff, 0x10,
+ 0x11, 0xdc, 0xee, 0x33,
+ 0x00, 0xab, 0x00, 0x33, 0xdc, 0xde, 0x21, 0x22, 0x9b, 0xfe, 0x00, 0x00,
+ 0xf0, 0xff, 0xed, 0xee,
+ 0x00, 0x11, 0x00, 0xaa, 0xca, 0xf0, 0x21, 0xf0, 0xdd, 0x21, 0x00, 0x8a,
+ 0x0f, 0x11, 0xf0, 0xdb,
+ 0xf0, 0x00, 0x00, 0xce, 0x0f, 0x00, 0x00, 0xdf, 0x00, 0xf0, 0x8a, 0xed,
+ 0x00, 0x44, 0x12, 0xcb,
+ 0xdd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xef, 0xdd, 0x00, 0x54,
+ 0x00, 0xdc, 0xdd, 0x00,
+ 0x65, 0x00, 0xfe, 0xee, 0xdd, 0x0f, 0x33, 0x34, 0xee, 0x88, 0xff, 0x43,
+ 0x22, 0xde, 0xee, 0x01,
+ 0x12, 0x00, 0xef, 0x00, 0xef, 0xbc, 0x23, 0x67, 0x01, 0xff, 0xee, 0xff,
+ 0x01, 0x22, 0x12, 0x00,
+ 0xdb, 0xde, 0x75, 0x22, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x11, 0xfe, 0x98,
+ 0x10, 0x44, 0x00, 0xee,
+ 0xcd, 0xfe, 0x33, 0x46, 0x00, 0xac, 0xed, 0x00, 0x23, 0x11, 0xff, 0x00,
+ 0x01, 0xee, 0xdd, 0x01,
+ 0x33, 0xff, 0xef, 0x00, 0xde, 0xdd, 0x45, 0x00, 0xcc, 0x00, 0x75, 0x0f,
+ 0xcc, 0xfe, 0x12, 0x45,
+ 0x11, 0xee, 0xff, 0x11, 0x11, 0x00, 0x00, 0xff, 0x00, 0xff, 0x20, 0x77,
+ 0x00, 0xef, 0x0f, 0xff,
+ 0x22, 0x33, 0xa9, 0xef, 0x32, 0x32, 0x00, 0x00, 0xdd, 0xef, 0x10, 0xef,
+ 0x00, 0x77, 0x42, 0xfe,
+ 0xff, 0x34, 0x43, 0xee, 0x88, 0xee, 0x22, 0x45, 0x11, 0xff, 0xee, 0xf0,
+ 0x00, 0x00, 0x10, 0x32,
+ 0x32, 0x00, 0xde, 0xee, 0x20, 0x31, 0x21, 0x10, 0x0f, 0x0f, 0x0f, 0xfd,
+ 0x63, 0x77, 0x02, 0xeb,
+ 0x00, 0x21, 0x11, 0x00, 0x22, 0x77, 0x00, 0xed, 0x00, 0x44, 0x21, 0x00,
+ 0x00, 0x32, 0x01, 0xfe,
+ 0x22, 0x67, 0x00, 0xde, 0x00, 0x53, 0x12, 0x00, 0x12, 0x00, 0x0f, 0x0f,
+ 0xed, 0x25, 0x77, 0x22,
+ 0x10, 0xff, 0xff, 0x00, 0x00, 0x12, 0x77, 0x33, 0xcd, 0xf0, 0x01, 0x13,
+ 0x11, 0x34, 0x12, 0xe0,
+ 0xef, 0x11, 0x22, 0xdf, 0xf0, 0x77, 0x22, 0xf0, 0xcc, 0xde, 0x11, 0x24,
+ 0x53, 0x24, 0xff, 0xab,
+ 0x00, 0x01, 0x11, 0x32, 0x12, 0xef, 0xfe, 0x23, 0x44, 0xfe, 0xcd, 0xfd,
+ 0x24, 0x34, 0xf0, 0x0f,
+ 0x11, 0x76, 0x00, 0x00, 0xee, 0xf0, 0x11, 0x21, 0x00, 0x0f, 0x0f, 0x64,
+ 0x23, 0x0d, 0x0f, 0x0f,
+ 0x0f, 0x35, 0x10, 0xca, 0xee, 0x31, 0x53, 0xee, 0xff, 0xfd, 0x00, 0x77,
+ 0x22, 0xbc, 0xfe, 0x11,
+ 0x23, 0x0f, 0xff, 0xff, 0x00, 0x02, 0xfe, 0xdd, 0x00, 0x00, 0x36, 0x31,
+ 0xdf, 0xf0, 0x9d, 0x12,
+ 0x77, 0x13, 0xed, 0xfe, 0x01, 0x21, 0x22, 0x0f, 0xee, 0x22, 0x10, 0x11,
+ 0x25, 0xcc, 0xee, 0x43,
+ 0x00, 0xfe, 0x01, 0x14, 0x66, 0x11, 0xee, 0x00, 0x12, 0x00, 0xbe, 0xf0,
+ 0x25, 0x12, 0x10, 0xba,
+ 0xdf, 0x32, 0x54, 0x00, 0xee, 0xee, 0x10, 0x56, 0x10, 0xde, 0xef, 0x43,
+ 0x44, 0xed, 0xf0, 0x11,
+ 0x55, 0x23, 0xed, 0xcb, 0x00, 0x42, 0x33, 0x11, 0x10, 0x10, 0x0f, 0xbb,
+ 0x00, 0x43, 0x00, 0x0e,
+ 0x00, 0x00, 0x0f, 0xfe, 0xdc, 0xff, 0x11, 0x66, 0x00, 0xff, 0x21, 0x0e,
+ 0xcc, 0x22, 0x22, 0xee,
+ 0xdc, 0x01, 0x55, 0x00, 0xbc, 0x00, 0x32, 0xf0, 0xf0, 0xef, 0xcd, 0xdd,
+ 0x67, 0x23, 0xdd, 0xbc,
+ 0x00, 0x12, 0xec, 0x0f, 0x02, 0x0f, 0xef, 0x0f, 0xfe, 0x32, 0x21, 0xcb,
+ 0xcc, 0xef, 0x00, 0x0f,
+ 0x00, 0xff, 0xcc, 0x33, 0x00, 0x89, 0xde, 0x00, 0x20, 0xfe, 0xdd, 0xf0,
+ 0xfe, 0xdc, 0x0f, 0xff,
+ 0xf0, 0xf0, 0xbc, 0xcc, 0xfe, 0x00, 0x00, 0xf0, 0xdf, 0xab, 0x00, 0x00,
+ 0x0f, 0x77, 0x12, 0xed,
+ 0xcc, 0x00, 0x32, 0x23, 0x01, 0xef, 0xdb, 0x10, 0x43, 0xf0, 0xed, 0xee,
+ 0xdf, 0x15, 0xf0, 0xf0,
+ 0x53, 0xcd, 0x88, 0xf0, 0x01, 0x11, 0x01, 0x00, 0xec, 0xff, 0xef, 0xdd,
+ 0x22, 0x12, 0xaa, 0x12,
+ 0x44, 0xee, 0xbb, 0xff, 0x11, 0x11, 0x00, 0x00, 0x00, 0xcd, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0xee,
+ 0xa9, 0x00, 0x34, 0xde, 0x9b, 0x00, 0x11, 0x00, 0x00, 0xfe, 0xff, 0x12,
+ 0x11, 0xdc, 0xbb, 0x00,
+ 0x54, 0x23, 0xfe, 0xdc, 0x00, 0xff, 0xcb, 0x32, 0x32, 0x0f, 0x00, 0xf0,
+ 0xbd, 0x00, 0x33, 0x01,
+ 0xed, 0xdd, 0x0f, 0x32, 0x57, 0x00, 0xde, 0xff, 0xf0, 0x02, 0x23, 0xdd,
+ 0xff, 0x22, 0x01, 0xf0,
+ 0x00, 0xde, 0x8a, 0x00, 0x67, 0x21, 0xff, 0xcc, 0xee, 0x20, 0x22, 0x32,
+ 0x10, 0xfe, 0xfe, 0x10,
+ 0xfe, 0xdb, 0x10, 0x43, 0x10, 0xce, 0xbb, 0x21, 0x33, 0xcc, 0xbb, 0x00,
+ 0x33, 0x12, 0xff, 0xcc,
+ 0xed, 0x22, 0x66, 0xf0, 0xff, 0x12, 0x11, 0x12, 0x01, 0xe0, 0xcc, 0x21,
+ 0x66, 0x00, 0xee, 0x00,
+ 0x01, 0x22, 0x32, 0xcc, 0xed, 0x55, 0x10, 0xdd, 0xf0, 0x00, 0x21, 0x10,
+ 0xff, 0x01, 0x00, 0xdd,
+ 0x9a, 0x00, 0x12, 0x22, 0x00, 0xff, 0xcb, 0xff, 0x00, 0x21, 0x63, 0x0f,
+ 0xb8, 0xee, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x11, 0x24, 0xdd, 0xbd, 0x00, 0x23, 0x22, 0x10, 0xed,
+ 0xa8, 0x00, 0x22, 0x43,
+ 0x00, 0xfd, 0xcd, 0xff, 0x11, 0x21, 0x10, 0xfd, 0xd8, 0xff, 0x31, 0x73,
+ 0x32, 0xec, 0xbb, 0xff,
+ 0xfe, 0x10, 0x75, 0x11, 0xfe, 0xfd, 0x01, 0x22, 0xfd, 0xdb, 0x21, 0x64,
+ 0x00, 0xfe, 0x0f, 0x00,
+ 0x00, 0x23, 0x12, 0x0f, 0xfe, 0x00, 0x00, 0x10, 0x55, 0x22, 0x00, 0x00,
+ 0xdb, 0xcb, 0x41, 0x65,
+ 0xf0, 0x0f, 0x22, 0x00, 0xec, 0x00, 0x43, 0x00, 0x10, 0x23, 0x00, 0xf0,
+ 0xde, 0xbd, 0x02, 0x77,
+ 0x05, 0x00, 0x00, 0xef, 0x00, 0x24, 0x02, 0x11, 0xf0, 0xbf, 0xf0, 0x23,
+ 0x25, 0x00, 0xc0, 0xe0,
+ 0x12, 0x02, 0xcf, 0xef, 0x46, 0x11, 0xce, 0x13, 0x67, 0x0f, 0xee, 0x11,
+ 0x23, 0x12, 0x10, 0x0f,
+ 0xcd, 0x11, 0x77, 0x00, 0xee, 0x00, 0x23, 0x01, 0xed, 0xff, 0xff, 0x10,
+ 0x41, 0x13, 0xff, 0xf0,
+ 0x22, 0xfa, 0x9b, 0x10, 0x55, 0x10, 0x00, 0x11, 0x00, 0xfe, 0x00, 0x20,
+ 0x00, 0x54, 0x23, 0x00,
+ 0x0f, 0x0f, 0xec, 0xfe, 0x77, 0x23, 0x0f, 0x00, 0x01, 0xff, 0x02, 0x11,
+ 0xef, 0x34, 0x77, 0x00,
+ 0x01, 0x11, 0x00, 0x10, 0x23, 0x22, 0x22, 0x22, 0x01, 0x0f, 0x01, 0x67,
+ 0x11, 0x12, 0x00, 0xdf,
+ 0x44, 0x32, 0x00, 0x11, 0xf1, 0xf2, 0x77, 0x42, 0xf0, 0xf0, 0xf0, 0x01,
+ 0x24, 0x44, 0x01, 0xf0,
+ 0xf0, 0xe0, 0x01, 0x66, 0x12, 0x11, 0x00, 0xdf, 0xcf, 0x00, 0x67, 0x32,
+ 0x00, 0xe0, 0x21, 0x12,
+ 0x32, 0x75, 0x00, 0xf0, 0x12, 0x54, 0x00, 0xfe, 0x33, 0x34, 0x12, 0x32,
+ 0x11, 0x0f, 0xee, 0xfe,
+ 0x77, 0x43, 0xfe, 0xdc, 0x22, 0x34, 0xfe, 0xee, 0x11, 0x00, 0x00, 0x40,
+ 0x0e, 0x10, 0x77, 0xff,
+ 0xdc, 0x10, 0x21, 0x10, 0x0f, 0x0f, 0x00, 0x20, 0x00, 0x0f, 0x40, 0x23,
+ 0xee, 0xdb, 0x76, 0x32,
+ 0xbc, 0xde, 0x00, 0x10, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xfe, 0x00, 0xfe,
+ 0x98, 0xff, 0x00, 0x42,
+ 0x11, 0x0f, 0xde, 0xa9, 0xee, 0x10, 0x22, 0xef, 0x0f, 0xee, 0x00, 0x33,
+ 0xcd, 0xa8, 0x00, 0x32,
+ 0x10, 0x00, 0xdf, 0xdd, 0xdc, 0x41, 0x33, 0xcc, 0xdc, 0x00, 0x0f, 0xbd,
+ 0x00, 0x11, 0x0e, 0xee,
+ 0xcc, 0xff, 0x00, 0x0f, 0xcb, 0x0f, 0x31, 0xed, 0xcd, 0x00, 0x20, 0xfa,
+ 0xce, 0x30, 0x22, 0xbb,
+ 0xee, 0x00, 0x9c, 0xee, 0x11, 0x01, 0xcb, 0xff, 0x01, 0xdc, 0xac, 0x00,
+ 0x01, 0xf0, 0xf0, 0x00,
+ 0xff, 0xdc, 0xbb, 0xef, 0x11, 0x22, 0xee, 0x9b, 0xed, 0xfe, 0x00, 0x01,
+ 0x12, 0x11, 0xdc, 0x9a,
+ 0xf0, 0x0f, 0xff, 0x00, 0x10, 0x00, 0xef, 0xdc, 0xac, 0x0f, 0x01, 0xff,
+ 0xff, 0xff, 0xde, 0xdb,
+ 0x00, 0x13, 0xce, 0xbb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcc, 0x10, 0x22,
+ 0xdc, 0xed, 0x00, 0xbd,
+ 0xfe, 0x35, 0x53, 0x0f, 0xb8, 0xef, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0xe3, 0x01, 0x8f, 0x01,
+ 0x04, 0xd4, 0xf5, 0xd5, 0x25, 0xd7, 0x93, 0xd8, 0x32, 0x67, 0xf0, 0xcd,
+ 0x22, 0x24, 0x00, 0x11,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x55, 0x21, 0x31, 0x21, 0xf0, 0xac, 0x00,
+ 0x25, 0x10, 0x41, 0x45,
+ 0xf0, 0xde, 0xdc, 0xdd, 0x30, 0x77, 0x20, 0xef, 0xf0, 0xff, 0x00, 0x11,
+ 0x0f, 0xef, 0x43, 0x55,
+ 0xef, 0xbc, 0xff, 0x00, 0x23, 0x01, 0x00, 0x00, 0x00, 0xdf, 0x01, 0x14,
+ 0xf0, 0xdd, 0x01, 0x52,
+ 0x00, 0xca, 0xff, 0x44, 0x42, 0xdb, 0xef, 0x53, 0x33, 0xee, 0xff, 0x02,
+ 0xff, 0x01, 0x77, 0x00,
+ 0xff, 0xdd, 0x00, 0x57, 0x01, 0xdd, 0xcd, 0x22, 0x55, 0x00, 0x00, 0xee,
+ 0xfe, 0x33, 0x11, 0xfe,
+ 0x00, 0xfd, 0xed, 0x77, 0xf0, 0xec, 0x12, 0x31, 0xde, 0x0f, 0x12, 0x00,
+ 0xf0, 0xf0, 0x10, 0x77,
+ 0x00, 0xcd, 0xff, 0x00, 0x44, 0x22, 0x00, 0xbb, 0x0f, 0x22, 0x11, 0xfe,
+ 0x00, 0xff, 0x11, 0x31,
+ 0x00, 0x12, 0x00, 0xc8, 0xce, 0x31, 0x53, 0x00, 0xff, 0x21, 0xfe, 0xb9,
+ 0x00, 0x54, 0x23, 0xef,
+ 0xed, 0x12, 0x44, 0x00, 0xfe, 0x02, 0x02, 0x44, 0x43, 0xff, 0xed, 0x00,
+ 0x11, 0xff, 0xb9, 0x00,
+ 0x22, 0x54, 0x10, 0xed, 0xbb, 0x12, 0x33, 0xed, 0x00, 0x24, 0x00, 0xf0,
+ 0xf0, 0xcd, 0x11, 0x77,
+ 0x01, 0xff, 0xee, 0x02, 0x00, 0xde, 0x00, 0x34, 0x00, 0xf0, 0x35, 0xbf,
+ 0x8a, 0xf0, 0x12, 0x22,
+ 0x00, 0xef, 0xfe, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x21, 0x0f, 0x00,
+ 0xef, 0x0f, 0x77, 0x00,
+ 0xda, 0xf0, 0x00, 0x0e, 0x20, 0x74, 0x00, 0xf0, 0xfd, 0xee, 0xff, 0x0e,
+ 0x22, 0x46, 0x10, 0xef,
+ 0xee, 0x00, 0x0e, 0x1f, 0x00, 0xca, 0x30, 0x75, 0x0e, 0xcc, 0x31, 0x63,
+ 0xff, 0xec, 0xfe, 0x00,
+ 0x21, 0x10, 0xeb, 0xdf, 0x00, 0x11, 0xf0, 0xee, 0x00, 0xcf, 0xac, 0x11,
+ 0x25, 0xf0, 0xfe, 0x00,
+ 0xde, 0xdf, 0x12, 0x55, 0x22, 0xde, 0xbc, 0x00, 0x00, 0xdf, 0x33, 0x23,
+ 0x01, 0x24, 0x0f, 0x0e,
+ 0x43, 0xcd, 0x88, 0x11, 0x57, 0x00, 0xff, 0x00, 0x10, 0xe0, 0xde, 0x11,
+ 0x33, 0x0f, 0xfe, 0x00,
+ 0x00, 0xdc, 0x01, 0x44, 0xef, 0xbc, 0x10, 0x76, 0x01, 0xff, 0xef, 0xfe,
+ 0x00, 0x13, 0x13, 0x22,
+ 0xfe, 0xed, 0x55, 0x34, 0xee, 0xdd, 0x0f, 0x31, 0x76, 0x32, 0x00, 0xf0,
+ 0x10, 0x10, 0xfe, 0xcc,
+ 0x22, 0x33, 0x21, 0x52, 0x00, 0xdc, 0xee, 0xed, 0x0f, 0x54, 0x00, 0xea,
+ 0xee, 0xdf, 0xee, 0x10,
+ 0x30, 0xeb, 0x73, 0x45, 0xcd, 0xca, 0x00, 0x43, 0x12, 0xef, 0xff, 0xff,
+ 0x00, 0x23, 0x00, 0xbe,
+ 0x00, 0x03, 0xfe, 0xcc, 0x24, 0x55, 0xff, 0xcb, 0x00, 0x13, 0xdd, 0xcc,
+ 0x22, 0x43, 0xff, 0xff,
+ 0xee, 0xed, 0x00, 0x10, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xdd, 0xa8, 0xee,
+ 0x42, 0x43, 0xff, 0xee,
+ 0xee, 0x0d, 0xa8, 0x0e, 0x33, 0x12, 0xcd, 0xfe, 0x34, 0x10, 0xab, 0x00,
+ 0x12, 0x10, 0xed, 0x00,
+ 0x44, 0x0f, 0xee, 0x34, 0x32, 0xef, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x00,
+ 0x77, 0x22, 0x11, 0x33,
+ 0x01, 0xab, 0xfe, 0x57, 0x22, 0xef, 0xee, 0x00, 0x23, 0x00, 0xff, 0xef,
+ 0x00, 0xe1, 0x02, 0xe0,
+ 0x89, 0xef, 0x12, 0x34, 0x00, 0xbe, 0xdd, 0x01, 0x44, 0x12, 0xed, 0xba,
+ 0x00, 0x33, 0x11, 0x00,
+ 0x00, 0xfe, 0x00, 0x01, 0xef, 0x12, 0x20, 0x00, 0x12, 0xdf, 0x89, 0x00,
+ 0x00, 0x22, 0x46, 0xde,
+ 0x9b, 0x00, 0x10, 0x11, 0x11, 0x11, 0x00, 0xed, 0x00, 0x33, 0x0f, 0x0f,
+ 0x23, 0xfe, 0x30, 0x50,
+ 0x0d, 0x00, 0x00, 0x44, 0x32, 0x0a, 0x99, 0x00, 0x10, 0x00, 0x22, 0x11,
+ 0xff, 0xce, 0x11, 0x20,
+ 0xd9, 0xe0, 0x63, 0x24, 0xef, 0xdd, 0x42, 0x33, 0x00, 0x0f, 0x0f, 0xef,
+ 0x01, 0xcb, 0xff, 0x76,
+ 0x20, 0x00, 0x10, 0x00, 0xbd, 0xfd, 0x33, 0x24, 0xff, 0xcd, 0xff, 0x35,
+ 0x31, 0xef, 0x00, 0xfe,
+ 0xcc, 0xf0, 0xf0, 0x0f, 0x20, 0x31, 0x8c, 0xdd, 0x06, 0x24, 0xf0, 0x01,
+ 0x01, 0xe0, 0x43, 0x24,
+ 0x8a, 0xe0, 0x55, 0x22, 0x00, 0x00, 0xed, 0xff, 0x44, 0x10, 0xff, 0x00,
+ 0xef, 0x22, 0x66, 0x11,
+ 0xff, 0xed, 0xff, 0x00, 0x21, 0x12, 0xfe, 0xdd, 0xee, 0xf0, 0x21, 0x33,
+ 0x0f, 0xa9, 0xff, 0x0f,
+ 0xff, 0x00, 0x10, 0xfd, 0x0d, 0x75, 0x32, 0xc9, 0xef, 0x11, 0xde, 0xbb,
+ 0x32, 0x54, 0xff, 0xee,
+ 0x10, 0x11, 0x00, 0x00, 0x02, 0xee, 0x00, 0x32, 0x22, 0x00, 0xf0, 0xf0,
+ 0xde, 0xed, 0x77, 0x75,
+ 0x0e, 0xdd, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x1f, 0xfc, 0x22, 0x00, 0xa8,
+ 0xef, 0x42, 0x43, 0xfe,
+ 0xba, 0x00, 0x23, 0x00, 0x00, 0x21, 0xf0, 0xde, 0xe0, 0x11, 0x12, 0x23,
+ 0x21, 0xff, 0x00, 0x23,
+ 0x00, 0xb8, 0x20, 0x75, 0x00, 0x0f, 0x00, 0xf0, 0xef, 0x11, 0x33, 0xff,
+ 0xed, 0xcd, 0x34, 0x76,
+ 0x0f, 0x0e, 0x11, 0x23, 0x00, 0xcc, 0x00, 0x76, 0x00, 0xf0, 0xf0, 0xf1,
+ 0x00, 0x01, 0xe1, 0x02,
+ 0xf1, 0xe0, 0xd0, 0x03, 0x47, 0x03, 0xcf, 0xde, 0x0f, 0x23, 0x24, 0xd0,
+ 0xac, 0x00, 0x35, 0x21,
+ 0xf0, 0xef, 0xde, 0x74, 0x45, 0xee, 0x0f, 0x21, 0x00, 0xde, 0x10, 0x52,
+ 0x0f, 0x00, 0x01, 0xea,
+ 0xff, 0x01, 0x00, 0x23, 0xe0, 0x88, 0xdf, 0x10, 0x42, 0x00, 0xed, 0xff,
+ 0x21, 0x10, 0x0d, 0xeb,
+ 0xff, 0x72, 0x43, 0x0f, 0xfd, 0x11, 0x10, 0xf9, 0xf0, 0x01, 0x33, 0x21,
+ 0xe0, 0xef, 0x00, 0x11,
+ 0xff, 0x53, 0x77, 0x13, 0x00, 0x02, 0x00, 0xba, 0x00, 0x44, 0x11, 0x00,
+ 0x00, 0x10, 0x00, 0x02,
+ 0x15, 0x10, 0xcf, 0xdd, 0x43, 0x33, 0xde, 0x01, 0x14, 0xf0, 0x00, 0x13,
+ 0xf2, 0x8c, 0xeb, 0x42,
+ 0x34, 0xef, 0x01, 0x32, 0x00, 0xce, 0xee, 0x11, 0xec, 0x9d, 0x07, 0x12,
+ 0x0f, 0x01, 0x00, 0xde,
+ 0xe0, 0xf2, 0x55, 0x20, 0xfe, 0xfe, 0xbb, 0x00, 0x77, 0x01, 0x0f, 0x00,
+ 0x10, 0x00, 0x20, 0x22,
+ 0x00, 0x00, 0x00, 0x53, 0x34, 0x00, 0xfc, 0x00, 0x10, 0xff, 0xdc, 0xee,
+ 0xcc, 0x00, 0x62, 0x01,
+ 0xfb, 0xfe, 0x0d, 0x0d, 0xee, 0xe0, 0xf0, 0xfc, 0x0c, 0x0d, 0x41, 0x42,
+ 0xdd, 0xa9, 0x00, 0x00,
+ 0xff, 0xff, 0xbd, 0xed, 0x23, 0x21, 0xe0, 0x27, 0x00, 0x8b, 0xee, 0x21,
+ 0x23, 0xef, 0xdd, 0x00,
+ 0xfd, 0x98, 0x00, 0x23, 0x00, 0xbb, 0xff, 0x01, 0x00, 0xee, 0xff, 0xf0,
+ 0x20, 0x33, 0xe0, 0x8a,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0xe0, 0x0f, 0x00, 0x0e, 0x0e, 0x01, 0x00,
+ 0x02, 0x23, 0xb9, 0xfe,
+ 0x63, 0x0f, 0xb8, 0x01, 0x22, 0xff, 0xed, 0x00, 0xfd, 0x00, 0x44, 0xee,
+ 0xcc, 0x00, 0x01, 0x10,
+ 0x10, 0xfd, 0xff, 0x0f, 0xee, 0x33, 0x00, 0xcd, 0x00, 0x04, 0x10, 0x0c,
+ 0xce, 0xad, 0xca, 0x11,
+ 0x02, 0xcd, 0x01, 0x15, 0xde, 0xac, 0xdf, 0xde, 0xf0, 0x15, 0x54, 0x10,
+ 0xce, 0xcd, 0x00, 0x11,
+ 0x00, 0x12, 0x35, 0x00, 0xfe, 0xf0, 0xfd, 0x22, 0x24, 0xbc, 0x0f, 0x55,
+ 0x00, 0xec, 0x00, 0xde,
+ 0xef, 0x23, 0x12, 0xad, 0xfd, 0x32, 0x11, 0xed, 0xdd, 0xa9, 0xf1, 0x27,
+ 0x10, 0x00, 0xfe, 0xf0,
+ 0x10, 0x51, 0x0f, 0x01, 0x67, 0x10, 0xff, 0x11, 0x32, 0x0f, 0x0e, 0x30,
+ 0x10, 0x24, 0x52, 0xfd,
+ 0xfd, 0x34, 0x11, 0xdc, 0xf0, 0x43, 0x34, 0x0f, 0xbc, 0x11, 0x34, 0x21,
+ 0x00, 0x40, 0x66, 0x01,
+ 0xff, 0x00, 0x10, 0x12, 0x66, 0x10, 0xee, 0x11, 0x57, 0xf0, 0xbd, 0x00,
+ 0x32, 0x11, 0x00, 0x00,
+ 0xff, 0x00, 0x22, 0x00, 0xf0, 0x32, 0xfe, 0xca, 0x32, 0x32, 0xef, 0xd0,
+ 0xff, 0x01, 0x03, 0x8b,
+ 0xef, 0x43, 0x23, 0xa9, 0x01, 0x15, 0x00, 0xdd, 0xf0, 0x22, 0x11, 0xf0,
+ 0x0f, 0x21, 0xf0, 0xce,
+ 0x20, 0x5f, 0x0d, 0x02, 0x01, 0xec, 0x55, 0x22, 0xdd, 0xef, 0x23, 0x00,
+ 0x33, 0x77, 0x00, 0xcb,
+ 0xf0, 0x00, 0x23, 0x34, 0x00, 0xde, 0x0f, 0x0e, 0xde, 0x64, 0x57, 0x00,
+ 0x0f, 0x10, 0x0f, 0x0f,
+ 0x00, 0xcc, 0x11, 0x77, 0x00, 0xee, 0x00, 0x00, 0xf0, 0x32, 0x33, 0xe0,
+ 0xef, 0xef, 0xff, 0x42,
+ 0x22, 0xee, 0x0f, 0x00, 0xf0, 0xfe, 0x31, 0x10, 0xa9, 0x11, 0x54, 0x32,
+ 0x0f, 0xa8, 0xff, 0x53,
+ 0x11, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x25, 0x21, 0x00,
+ 0xef, 0x54, 0x00, 0xdd,
+ 0x67, 0x23, 0x00, 0x11, 0x32, 0xdd, 0xde, 0x67, 0x22, 0x0f, 0x00, 0xe0,
+ 0xfe, 0x10, 0x30, 0xcd,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x21, 0x00, 0xed, 0x1f, 0x77, 0x01, 0xef,
+ 0x00, 0x00, 0x00, 0x21,
+ 0x13, 0xf0, 0x9e, 0xf0, 0x15, 0x00, 0x00, 0xf2, 0xdf, 0xf2, 0x05, 0x00,
+ 0xf0, 0xef, 0xbf, 0xe0,
+ 0xf3, 0xf3, 0xdf, 0x00, 0x32, 0x30, 0xfc, 0x88, 0xff, 0xf0, 0xfd, 0x11,
+ 0x45, 0x0f, 0xdc, 0xff,
+ 0x11, 0x21, 0xbd, 0xff, 0x57, 0x12, 0xce, 0xfe, 0x11, 0x0e, 0xde, 0x46,
+ 0x00, 0xcd, 0x10, 0x40,
+ 0x0f, 0x0f, 0x0e, 0xdc, 0x21, 0x43, 0x1f, 0x1e, 0x3f, 0xf9, 0xcd, 0x30,
+ 0x63, 0x0f, 0xed, 0xfc,
+ 0xfe, 0x20, 0x0d, 0xdb, 0xe0, 0x00, 0x21, 0x9d, 0xca, 0xf0, 0x01, 0x0f,
+ 0xee, 0x00, 0x33, 0x0e,
+ 0x89, 0x00, 0x11, 0x11, 0x00, 0xed, 0xef, 0x02, 0x10, 0x24, 0x01, 0xbf,
+ 0x04, 0x14, 0xbd, 0x00,
+ 0x66, 0x00, 0xef, 0x01, 0x24, 0x00, 0x01, 0x00, 0x1e, 0x52, 0x02, 0xff,
+ 0xff, 0xfe, 0x00, 0xf0,
+ 0xef, 0x04, 0x46, 0xe0, 0xbd, 0x01, 0xf2, 0xa9, 0x00, 0x36, 0x00, 0xef,
+ 0x11, 0x21, 0xdf, 0xdd,
+ 0x62, 0x34, 0xff, 0xfe, 0x41, 0x44, 0x00, 0xff, 0x02, 0x33, 0x31, 0x22,
+ 0x14, 0xf0, 0xdc, 0x2f,
+ 0x71, 0x22, 0xf0, 0xcc, 0x00, 0x45, 0x0d, 0xfa, 0xef, 0xed, 0x3f, 0x40,
+ 0xdd, 0xdd, 0x22, 0x0e,
+ 0x0c, 0x50, 0xda, 0xd0, 0x21, 0x00, 0x20, 0x0f, 0x8b, 0xf2, 0x14, 0xbd,
+ 0xee, 0x21, 0x34, 0xe0,
+ 0xbe, 0xff, 0x02, 0x04, 0x00, 0xcb, 0xff, 0x45, 0xe0, 0xbe, 0x11, 0x10,
+ 0xed, 0xfe, 0x21, 0x00,
+ 0xd0, 0x02, 0xfd, 0xeb, 0x11, 0xd0, 0x8b, 0x10, 0x00, 0xec, 0x01, 0xf0,
+ 0xac, 0xff, 0x00, 0xf0,
+ 0xed, 0xea, 0x20, 0x20, 0xef, 0xcc, 0xff, 0x00, 0x00, 0xfe, 0x0f, 0xdd,
+ 0x88, 0x10, 0x42, 0x00,
+ 0xf0, 0x01, 0x0f, 0x20, 0x21, 0x01, 0x20, 0x22, 0xf0, 0x35, 0x73, 0x40,
+ 0x1f, 0x20, 0x23, 0x17,
+ 0x11, 0x10, 0x10, 0x21, 0x35, 0x00, 0xef, 0x51, 0x03, 0x8f, 0xf0, 0xf0,
+ 0xe0, 0xef, 0x02, 0xd0,
+ 0xdb, 0x01, 0x22, 0xe0, 0xd4, 0x8a, 0xcd, 0x13, 0x23, 0x0f, 0x01, 0x16,
+ 0x00, 0xfe, 0x00, 0x23,
+ 0xf0, 0xee, 0x00, 0x10, 0x24, 0xe2, 0x8a, 0xdd, 0x20, 0x22, 0x04, 0xe1,
+ 0xef, 0xbb, 0xe0, 0x14,
+ 0xe0, 0xbe, 0x00, 0x31, 0x20, 0xef, 0x02, 0x02, 0xfd, 0x1d, 0x72, 0x30,
+ 0x0c, 0x00, 0x00, 0x3e,
+ 0x6f, 0x08, 0x0f, 0x02, 0x0f, 0xed, 0xfe, 0x12, 0x44, 0xfc, 0x20, 0x54,
+ 0xee, 0xee, 0x32, 0x62,
+ 0xe8, 0x0f, 0x54, 0x00, 0xec, 0x0f, 0x10, 0x12, 0x21, 0x22, 0x11, 0x00,
+ 0xed, 0x30, 0x55, 0x10,
+ 0x10, 0x00, 0x20, 0x40, 0x0f, 0x0f, 0xd8, 0xff, 0x73, 0x53, 0xfc, 0xfd,
+ 0x0e, 0xdb, 0x01, 0x46,
+ 0x00, 0xbf, 0x00, 0x01, 0xf0, 0xef, 0xf0, 0x05, 0x00, 0xa0, 0x02, 0x34,
+ 0x00, 0x01, 0x02, 0x12,
+ 0x00, 0x01, 0x66, 0x53, 0x00, 0x00, 0x23, 0x23, 0x0e, 0x13, 0x24, 0xdd,
+ 0x01, 0x77, 0x00, 0x0f,
+ 0xf0, 0x04, 0x12, 0x0f, 0x0e, 0xfd, 0x00, 0x10, 0xf0, 0xce, 0xed, 0x0f,
+ 0x20, 0xc9, 0xce, 0x42,
+ 0x00, 0x88, 0x00, 0x20, 0x0f, 0xee, 0x00, 0x0f, 0x0d, 0x0e, 0x21, 0x11,
+ 0xdd, 0xfe, 0x43, 0x01,
+ 0x88, 0x00, 0x35, 0xf0, 0x00, 0x22, 0xee, 0xde, 0x21, 0x10, 0x00, 0x10,
+ 0x0e, 0x51, 0x20, 0xfa,
+ 0x0f, 0x30, 0x0f, 0xfe, 0x1e, 0xfd, 0xac, 0x01, 0x13, 0x9b, 0xef, 0x10,
+ 0x22, 0x11, 0x00, 0xdf,
+ 0xee, 0x0d, 0x09, 0x52, 0x22, 0xef, 0xe0, 0x04, 0x01, 0xb0, 0xff, 0x12,
+ 0x35, 0x12, 0xf1, 0x02,
+ 0x13, 0xbf, 0xee, 0x77, 0x33, 0x00, 0x0e, 0x0e, 0xff, 0x21, 0x77, 0x10,
+ 0x00, 0x12, 0x20, 0x0e,
+ 0x42, 0x26, 0xff, 0xef, 0x00, 0x22, 0x01, 0x10, 0x23, 0x26, 0xf1, 0xb0,
+ 0xe1, 0xd1, 0x9f, 0xef,
+ 0x04, 0x06, 0xc1, 0xf1, 0x01, 0x00, 0x00, 0xe2, 0xd4, 0xc1, 0x11, 0x62,
+ 0x12, 0x25, 0x10, 0xed,
+ 0x1f, 0x43, 0x33, 0x43, 0x11, 0x00, 0xba, 0x0f, 0x32, 0x34, 0x24, 0xff,
+ 0x9b, 0xf0, 0x01, 0x01,
+ 0xde, 0x00, 0x10, 0x0f, 0xcb, 0xef, 0xfe, 0x0d, 0x71, 0x1f, 0xe8, 0xfe,
+ 0x1f, 0x1f, 0x0d, 0x30,
+ 0x62, 0x11, 0x0f, 0xea, 0xef, 0x22, 0x22, 0xdf, 0x00, 0x45, 0x00, 0xf0,
+ 0x50, 0x30, 0xf0, 0x02,
+ 0x24, 0x21, 0x72, 0x20, 0x0e, 0x01, 0x37, 0x22, 0x21, 0x31, 0x52, 0xf0,
+ 0xbe, 0x04, 0xf3, 0xf1,
+ 0x57, 0x11, 0xef, 0xdf, 0xf1, 0x12, 0xf0, 0xf0, 0x34, 0x00, 0x8c, 0xef,
+ 0x26, 0x21, 0x00, 0x20,
+ 0x41, 0x00, 0xf0, 0x02, 0xf1, 0xf0, 0x31, 0x31, 0xae, 0xbc, 0xe0, 0xf2,
+ 0xe8, 0xff, 0x23, 0xe1,
+ 0xce, 0xf0, 0x33, 0x64, 0x0e, 0x01, 0x47, 0x11, 0x10, 0x01, 0x00, 0x20,
+ 0x66, 0x11, 0x00, 0x22,
+ 0x0e, 0x0e, 0x41, 0x01, 0x0f, 0x02, 0xfe, 0x0c, 0x41, 0x20, 0xf9, 0xcf,
+ 0xef, 0xed, 0x1d, 0x60,
+ 0x0f, 0xea, 0x00, 0xf0, 0xab, 0xed, 0x0f, 0x2f, 0x10, 0x0e, 0xdc, 0xcd,
+ 0xfe, 0x10, 0x10, 0xef,
+ 0xde, 0xee, 0xed, 0xf0, 0x00, 0xe0, 0x01, 0xb2, 0x8a, 0xed, 0x0e, 0x0d,
+ 0x00, 0x02, 0xb9, 0xdc,
+ 0xf0, 0xee, 0xda, 0x0f, 0x30, 0xe0, 0x8c, 0xef, 0x00, 0xff, 0xfd, 0x00,
+ 0xe0, 0xdf, 0xdd, 0xf0,
+ 0x00, 0xcc, 0xee, 0xf0, 0xed, 0xee, 0x10, 0x0d, 0xcc, 0xc2, 0x07, 0x00,
+ 0xea, 0xde, 0x00, 0xe0,
+ 0x00, 0x60, 0xee, 0xbc, 0x0f, 0x2e, 0xfc, 0xfe, 0x72, 0x11, 0xea, 0xee,
+ 0x10, 0x1f, 0xff, 0x22,
+ 0x53, 0xea, 0x0e, 0x71, 0x00, 0xdb, 0x00, 0x00, 0xfe, 0x20, 0x01, 0xce,
+ 0xce, 0xf1, 0xe1, 0xbc,
+ 0x00, 0x00, 0xce, 0xd1, 0xf7, 0xe2, 0xc0, 0xbf, 0x00, 0x01, 0xec, 0xd0,
+ 0xe1, 0xc0, 0x12, 0x47,
+ 0xef, 0xef, 0x23, 0x32, 0x10, 0x1f, 0x10, 0x32, 0x52, 0x21, 0x00, 0xcb,
+ 0xd0, 0xf2, 0xe0, 0xf6,
+ 0xe2, 0x8f, 0xed, 0x01, 0x01, 0xde, 0x01, 0x26, 0xff, 0xdf, 0x01, 0x5f,
+ 0x1b, 0x0f, 0xf1, 0xf0,
+ 0x32, 0x77, 0x42, 0x0f, 0xef, 0x00, 0x11, 0x22, 0x20, 0x1e, 0x1d, 0x20,
+ 0x20, 0x41, 0x64, 0x1f,
+ 0x10, 0x47, 0x56, 0x00, 0xfe, 0x0e, 0x40, 0x32, 0x26, 0xf0, 0xcd, 0x00,
+ 0x10, 0x0f, 0x77, 0x32,
+ 0x00, 0xfe, 0x00, 0x12, 0x21, 0x43, 0x10, 0xfe, 0xdf, 0x04, 0x44, 0x0e,
+ 0x0e, 0x45, 0x01, 0xe0,
+ 0x11, 0x43, 0x00, 0xfd, 0x00, 0x16, 0x01, 0xf0, 0x20, 0x20, 0xf2, 0xc1,
+ 0x8e, 0xef, 0x04, 0xe4,
+ 0xf1, 0x02, 0xf0, 0xe2, 0xd3, 0xf1, 0x44, 0x34, 0xe1, 0xc0, 0x33, 0x53,
+ 0x00, 0x00, 0x0a, 0xfa,
+ 0x21, 0x56, 0xf0, 0xff, 0x0f, 0x10, 0x00, 0x01, 0xe2, 0xe1, 0x11, 0x71,
+ 0x31, 0x01, 0x02, 0xc0,
+ 0xef, 0x51, 0x2e, 0xc8, 0x21, 0x43, 0x0d, 0x1e, 0x74, 0x45, 0x05, 0x05,
+ 0x57, 0x00, 0x69, 0x00,
+ 0xbf, 0x05, 0xbb, 0x02, 0xbb, 0x06, 0x1b, 0x07, 0x77, 0x22, 0x00, 0x0f,
+ 0x0e, 0x0e, 0x01, 0xf6,
+ 0xe1, 0x31, 0x2e, 0x9b, 0x00, 0x65, 0xf0, 0xe0, 0x30, 0x0f, 0x0f, 0x52,
+ 0xf1, 0xcf, 0x10, 0x43,
+ 0x10, 0x0f, 0x00, 0xe0, 0x1e, 0x12, 0x00, 0xee, 0x21, 0x67, 0xee, 0xea,
+ 0x01, 0x24, 0x11, 0xfd,
+ 0x10, 0x73, 0x03, 0xc0, 0x0d, 0x31, 0x47, 0x00, 0xd0, 0xf1, 0x23, 0x5f,
+ 0x13, 0x05, 0xcc, 0x00,
+ 0x44, 0x20, 0xce, 0x0f, 0x47, 0x10, 0xe0, 0x0f, 0x32, 0x22, 0x00, 0x41,
+ 0x13, 0xee, 0x00, 0x47,
+ 0x50, 0xf0, 0x0e, 0x31, 0x02, 0x0f, 0x01, 0x14, 0xfe, 0x4f, 0x75, 0x12,
+ 0xd0, 0xf0, 0x21, 0x00,
+ 0x12, 0x37, 0xf0, 0xbe, 0x34, 0x20, 0xef, 0x32, 0x03, 0xcd, 0x21, 0x56,
+ 0x00, 0x00, 0x30, 0x11,
+ 0xf0, 0x9e, 0x02, 0x57, 0x00, 0x0c, 0x02, 0x25, 0xff, 0xef, 0x00, 0x11,
+ 0x01, 0x21, 0xf1, 0xe0,
+ 0x21, 0x73, 0xfe, 0xbc, 0x27, 0x12, 0xfe, 0x1f, 0x52, 0xe0, 0xff, 0x21,
+ 0x02, 0xf0, 0x11, 0x20,
+ 0x0d, 0x20, 0x05, 0x00, 0xaf, 0x0f, 0x53, 0x04, 0x0f, 0x0f, 0xf1, 0x00,
+ 0x0f, 0x1f, 0xf0, 0x21,
+ 0x2c, 0xdd, 0x15, 0x1f, 0x29, 0x50, 0xf1, 0xb0, 0x22, 0x64, 0xea, 0xcd,
+ 0x10, 0x56, 0xf0, 0xfe,
+ 0x0f, 0xf0, 0x03, 0x10, 0xff, 0x0d, 0x0f, 0x31, 0x03, 0xd0, 0xfc, 0x60,
+ 0x25, 0xe0, 0xe0, 0x2e,
+ 0x40, 0x10, 0xdf, 0x00, 0x17, 0x61, 0x00, 0xde, 0xff, 0x0f, 0x52, 0xf3,
+ 0xcb, 0xff, 0x32, 0x11,
+ 0xff, 0xdd, 0xfc, 0x75, 0x36, 0xff, 0xee, 0x12, 0xf1, 0xef, 0x40, 0x22,
+ 0x10, 0x2f, 0x04, 0x24,
+ 0xd0, 0xfd, 0x53, 0xe0, 0xfe, 0x73, 0x41, 0xcd, 0x07, 0x14, 0x1e, 0x0d,
+ 0x11, 0x24, 0x01, 0xed,
+ 0xde, 0x33, 0x53, 0xfe, 0x01, 0xfe, 0xf8, 0x51, 0x33, 0x00, 0xbd, 0x00,
+ 0x31, 0x20, 0xee, 0xf0,
+ 0x5f, 0x1f, 0xf0, 0xb1, 0x27, 0x23, 0xd8, 0xf0, 0x21, 0x11, 0x01, 0x00,
+ 0x20, 0x0d, 0xef, 0x02,
+ 0x03, 0x9c, 0xff, 0x22, 0x41, 0xfd, 0x0f, 0x01, 0xce, 0xe0, 0x27, 0x72,
+ 0xe9, 0xdf, 0x11, 0x13,
+ 0xee, 0xfe, 0x00, 0x00, 0xbc, 0x01, 0x02, 0xdb, 0xf0, 0x40, 0x20, 0xcc,
+ 0xbe, 0x02, 0x0e, 0xbc,
+ 0x10, 0x22, 0xfb, 0xac, 0x00, 0x0e, 0xef, 0x00, 0x12, 0x10, 0xf9, 0xef,
+ 0x1f, 0xff, 0x00, 0x56,
+ 0xff, 0x9c, 0x00, 0x31, 0x00, 0xfd, 0xff, 0x24, 0x22, 0xfd, 0xdd, 0xff,
+ 0x30, 0x41, 0xdf, 0xe2,
+ 0xf1, 0xcb, 0x10, 0xff, 0xbf, 0x01, 0x00, 0x0f, 0xec, 0x8e, 0xf0, 0x12,
+ 0xe9, 0xef, 0x33, 0x43,
+ 0xda, 0xef, 0x01, 0xc0, 0x0e, 0x11, 0x23, 0x0d, 0xdd, 0x22, 0xf1, 0x8b,
+ 0xd1, 0x04, 0xeb, 0xef,
+ 0x11, 0xf0, 0xae, 0x0f, 0x02, 0x14, 0x03, 0xad, 0x0b, 0x0f, 0x10, 0xf0,
+ 0xd0, 0x03, 0x00, 0x0e,
+ 0xdd, 0x8a, 0x0f, 0x10, 0x13, 0xd0, 0x0c, 0xf0, 0x12, 0x0c, 0xfb, 0xf0,
+ 0xe4, 0x00, 0x0e, 0xdd,
+ 0xfe, 0x11, 0x40, 0xac, 0xf1, 0x04, 0x00, 0x65, 0xdb, 0xbc, 0x10, 0x12,
+ 0xf0, 0xef, 0x00, 0x2e,
+ 0x0e, 0xf1, 0xf0, 0xde, 0x13, 0x54, 0x0b, 0x0d, 0xff, 0x01, 0xe2, 0xff,
+ 0x3f, 0x7d, 0x0d, 0xdc,
+ 0xed, 0xe1, 0x00, 0x4a, 0x2d, 0xe0, 0xa0, 0xdb, 0x24, 0x74, 0xeb, 0xee,
+ 0x10, 0xf0, 0xfe, 0x33,
+ 0x00, 0x8e, 0x03, 0x12, 0x1f, 0x0b, 0xd0, 0x00, 0x1f, 0x17, 0x15, 0xef,
+ 0xee, 0x30, 0x20, 0x00,
+ 0x72, 0x26, 0xdf, 0xbe, 0x00, 0x30, 0x23, 0xf0, 0xe0, 0x41, 0x02, 0xd0,
+ 0x15, 0x10, 0xed, 0x21,
+ 0x02, 0xe0, 0x23, 0x52, 0xb8, 0x00, 0x30, 0x10, 0xce, 0x11, 0x43, 0xfc,
+ 0xef, 0x11, 0x33, 0x1c,
+ 0x0f, 0x03, 0xa0, 0xfa, 0x10, 0x20, 0xd0, 0xf0, 0x14, 0x21, 0xec, 0xef,
+ 0x10, 0xfe, 0xef, 0x73,
+ 0x75, 0xdd, 0xcc, 0x21, 0x42, 0xdd, 0xfb, 0x22, 0x43, 0x00, 0x00, 0xcc,
+ 0xec, 0x00, 0x40, 0x20,
+ 0xe0, 0xde, 0xfc, 0x30, 0x3d, 0xee, 0xe0, 0xe3, 0xf1, 0xca, 0x3f, 0x70,
+ 0xff, 0xfc, 0x00, 0xe3,
+ 0xe1, 0xda, 0xfd, 0x1f, 0x21, 0x76, 0x0f, 0xbb, 0x00, 0x22, 0xff, 0x00,
+ 0x40, 0xdf, 0x0e, 0x12,
+ 0xef, 0xff, 0x42, 0x33, 0x1e, 0x3d, 0x0e, 0x1c, 0x40, 0x35, 0x0f, 0xff,
+ 0x10, 0xac, 0x0c, 0x73,
+ 0x41, 0xda, 0xee, 0x36, 0x21, 0xdf, 0x00, 0x20, 0x00, 0xf0, 0xd0, 0x03,
+ 0x11, 0x01, 0xe0, 0x00,
+ 0x2d, 0x33, 0x24, 0x72, 0x71, 0xfe, 0xe0, 0x27, 0x21, 0x0f, 0x13, 0x21,
+ 0x0f, 0x37, 0x03, 0x80,
+ 0x01, 0x25, 0x10, 0x2e, 0x00, 0xd4, 0x02, 0x22, 0x00, 0x01, 0x73, 0x10,
+ 0xec, 0x01, 0xf1, 0x24,
+ 0x75, 0x00, 0xff, 0x0e, 0xf1, 0xf2, 0x0f, 0x72, 0x02, 0xdb, 0x03, 0x47,
+ 0xfe, 0xcc, 0x34, 0x12,
+ 0x00, 0xed, 0x21, 0x42, 0xfe, 0x11, 0x47, 0xce, 0xde, 0x75, 0x41, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x11, 0x23, 0x25, 0x00, 0xdd, 0x10, 0x42, 0x14, 0xff, 0xf1, 0x32, 0x10,
+ 0x11, 0x22, 0x51, 0x13,
+ 0x15, 0x14, 0x20, 0x31, 0xef, 0xdd, 0x74, 0x77, 0x12, 0xe0, 0x01, 0x00,
+ 0x01, 0x15, 0x62, 0x0f,
+ 0xde, 0x10, 0x03, 0x00, 0x16, 0x11, 0x00, 0x00, 0x23, 0x20, 0x0f, 0x33,
+ 0x26, 0x01, 0x11, 0x54,
+ 0x40, 0x01, 0x10, 0x41, 0x02, 0x77, 0x42, 0xf0, 0xde, 0x34, 0x20, 0x01,
+ 0x33, 0x03, 0x0f, 0x72,
+ 0x02, 0xe0, 0xef, 0x33, 0x77, 0x01, 0xf0, 0x02, 0x23, 0x0d, 0x0f, 0x02,
+ 0x12, 0x01, 0x54, 0x00,
+ 0x0b, 0x15, 0x22, 0xce, 0x10, 0x74, 0x0f, 0xdc, 0x22, 0x11, 0x0f, 0x20,
+ 0x17, 0x00, 0xbe, 0x11,
+ 0x21, 0x1f, 0x1d, 0x12, 0x15, 0xef, 0x00, 0x4f, 0xcf, 0xf0, 0x33, 0x4d,
+ 0xfd, 0xd0, 0x14, 0xff,
+ 0xb9, 0xf0, 0x30, 0x11, 0xf0, 0x01, 0x00, 0xcc, 0x00, 0x13, 0x0f, 0xda,
+ 0x00, 0x11, 0xa0, 0xff,
+ 0x32, 0xdd, 0x89, 0x02, 0x32, 0xed, 0xcb, 0x10, 0x23, 0xde, 0xdd, 0x01,
+ 0xf1, 0x00, 0x40, 0xfb,
+ 0xad, 0x00, 0x00, 0x24, 0x00, 0xdd, 0xec, 0x00, 0x1d, 0x4e, 0x10, 0x14,
+ 0xfd, 0xa8, 0xde, 0x10,
+ 0x40, 0x30, 0x00, 0xad, 0xdc, 0x10, 0x00, 0x8c, 0x00, 0x02, 0x0f, 0x0c,
+ 0xef, 0xdc, 0xed, 0x21,
+ 0x15, 0xad, 0xeb, 0x10, 0x0f, 0x00, 0x21, 0xcd, 0xfe, 0x02, 0xfe, 0xec,
+ 0x00, 0xdf, 0xdf, 0xf1,
+ 0xbc, 0xee, 0x02, 0x0d, 0xa8, 0xf0, 0x00, 0xef, 0xbc, 0xff, 0x02, 0x0f,
+ 0xdc, 0x10, 0x02, 0xaf,
+ 0xec, 0x00, 0xe0, 0xdb, 0xe0, 0x0f, 0xef, 0xcc, 0x02, 0xe1, 0x8c, 0x0e,
+ 0x2f, 0xfb, 0xb0, 0x01,
+ 0x03, 0x0b, 0xcd, 0x00, 0x10, 0x0f, 0x0d, 0xe4, 0xf2, 0xdc, 0x0e, 0x20,
+ 0xde, 0xde, 0x31, 0x11,
+ 0xcd, 0xbb, 0x00, 0x0d, 0xdd, 0x20, 0x00, 0x0e, 0x31, 0xab, 0xcc, 0x22,
+ 0x00, 0xe9, 0x00, 0x40,
+ 0x10, 0xdb, 0xf1, 0x03, 0xcd, 0xee, 0x1f, 0x0f, 0x70, 0x10, 0xdb, 0xe0,
+ 0x00, 0xdf, 0xbe, 0x12,
+ 0x54, 0xfb, 0x0f, 0x00, 0xdd, 0xf0, 0x06, 0x00, 0xcf, 0x0f, 0x50, 0xff,
+ 0xbf, 0x00, 0x13, 0xf0,
+ 0x00, 0x0e, 0xf9, 0x00, 0x52, 0x05, 0xef, 0x0f, 0xde, 0xfd, 0x22, 0x03,
+ 0xb0, 0x00, 0x0f, 0xdf,
+ 0xe0, 0xfc, 0xf0, 0x02, 0x06, 0x9f, 0xed, 0x21, 0x52, 0xfe, 0xed, 0x02,
+ 0x04, 0xdc, 0xec, 0x00,
+ 0x31, 0x61, 0x1f, 0x11, 0x07, 0xcf, 0x0c, 0x43, 0x20, 0xcd, 0x03, 0x33,
+ 0xe8, 0x0f, 0x11, 0x12,
+ 0x02, 0x1f, 0x0d, 0x11, 0x74, 0x30, 0xac, 0x01, 0x17, 0x3f, 0x0d, 0xd0,
+ 0x11, 0x53, 0x1f, 0xeb,
+ 0xf0, 0x24, 0x10, 0x0e, 0x40, 0x30, 0xf0, 0x01, 0x11, 0x11, 0x31, 0xc0,
+ 0xd0, 0x52, 0x0d, 0x4f,
+ 0x77, 0x14, 0xcf, 0x00, 0x21, 0x00, 0x1e, 0x24, 0x11, 0xc0, 0x16, 0x40,
+ 0x0f, 0x02, 0x03, 0x35,
+ 0x73, 0x0c, 0xde, 0x55, 0xf0, 0x0f, 0x44, 0x00, 0xfd, 0x34, 0x44, 0xff,
+ 0xfd, 0x21, 0x53, 0x13,
+ 0x0e, 0x00, 0x24, 0x0e, 0x0f, 0x77, 0x01, 0xfe, 0x00, 0x33, 0xe0, 0xf0,
+ 0xf1, 0x32, 0x4f, 0x01,
+ 0x17, 0x21, 0xf0, 0x01, 0x0f, 0x4f, 0x73, 0x25, 0xe1, 0xee, 0x31, 0x75,
+ 0xff, 0xed, 0x32, 0x23,
+ 0xde, 0xf3, 0x13, 0x2b, 0x0d, 0x55, 0x25, 0xf0, 0xbf, 0x00, 0x31, 0x1f,
+ 0x0e, 0x24, 0xf3, 0xcf,
+ 0x00, 0x50, 0x11, 0xe0, 0x02, 0x57, 0x00, 0xfe, 0xe0, 0x32, 0x00, 0xef,
+ 0x42, 0x02, 0xdf, 0x42,
+ 0x34, 0xee, 0xd0, 0x15, 0x32, 0x40, 0x10, 0x30, 0x21, 0xd0, 0x26, 0x11,
+ 0xde, 0x2e, 0x4f, 0x41,
+ 0xf1, 0xf0, 0x54, 0x40, 0xed, 0x11, 0x67, 0xee, 0xdb, 0x62, 0x23, 0xed,
+ 0xce, 0x16, 0x10, 0x00,
+ 0x1f, 0x10, 0x00, 0x1e, 0x11, 0x15, 0xc0, 0xf0, 0x21, 0xfd, 0x4e, 0x4f,
+ 0x02, 0xe7, 0x13, 0x0e,
+ 0x00, 0x21, 0x60, 0xfe, 0x01, 0x56, 0x00, 0xfe, 0xe0, 0x22, 0xe0, 0xdd,
+ 0x00, 0xc0, 0x00, 0x45,
+ 0x72, 0x0d, 0xed, 0x16, 0x32, 0x03, 0x00, 0x1c, 0x30, 0x33, 0xe1, 0xcf,
+ 0x40, 0x77, 0x02, 0xfe,
+ 0x21, 0x31, 0xcf, 0xf1, 0x46, 0x10, 0x00, 0x02, 0xae, 0x0f, 0x30, 0x03,
+ 0xf3, 0x01, 0x1b, 0x1e,
+ 0x55, 0x01, 0xef, 0x0e, 0x30, 0x21, 0x1f, 0x2f, 0x42, 0x06, 0x01, 0xb0,
+ 0xd8, 0x0f, 0x60, 0x22,
+ 0xe0, 0xf0, 0xf0, 0x00, 0x60, 0x0d, 0xfe, 0x04, 0x00, 0xe0, 0x54, 0x00,
+ 0xca, 0x10, 0x10, 0x00,
+ 0xe0, 0xf0, 0xf0, 0xcc, 0x0e, 0x65, 0x13, 0xef, 0xcb, 0x0f, 0x21, 0x11,
+ 0xef, 0x12, 0x13, 0xbe,
+ 0x1d, 0x0e, 0xc9, 0x01, 0x01, 0xe0, 0xfe, 0xf1, 0xc0, 0x0d, 0x50, 0xec,
+ 0x99, 0x01, 0x11, 0xec,
+ 0xf0, 0x20, 0xcf, 0xec, 0x00, 0x00, 0x10, 0xff, 0xbb, 0xfe, 0x00, 0x23,
+ 0xed, 0xdb, 0x51, 0x00,
+ 0xdd, 0x00, 0x30, 0x42, 0x20, 0xe9, 0xff, 0x00, 0xc0, 0x00, 0x4f, 0x0c,
+ 0xff, 0xf1, 0xaf, 0xee,
+ 0xf0, 0xec, 0x00, 0x43, 0x00, 0xdb, 0xd0, 0xe0, 0x00, 0xff, 0xf9, 0x0f,
+ 0x20, 0xf1, 0x80, 0xe1,
+ 0xf0, 0xeb, 0xdf, 0x1f, 0x10, 0xc0, 0xd1, 0x01, 0xe3, 0x9b, 0xfc, 0x02,
+ 0xf1, 0x8a, 0x0f, 0x12,
+ 0xf2, 0xce, 0x10, 0x01, 0xcc, 0xff, 0xf0, 0x00, 0x22, 0xf1, 0xbf, 0xd9,
+ 0xf0, 0xf0, 0x13, 0x1e,
+ 0xda, 0xe0, 0xf2, 0xc1, 0x20, 0xf0, 0x88, 0xf0, 0x32, 0x0f, 0xce, 0x00,
+ 0xf2, 0xee, 0x0f, 0xf0,
+ 0x0f, 0x31, 0xd1, 0xdf, 0x0d, 0xef, 0x02, 0xb0, 0xb8, 0x10, 0x41, 0x0f,
+ 0xca, 0xe0, 0x10, 0x33,
+ 0xdd, 0xfc, 0x00, 0xf1, 0xe1, 0xfd, 0x7e, 0x20, 0x01, 0xd2, 0x0d, 0xed,
+ 0x41, 0x30, 0xf8, 0xde,
+ 0xb0, 0xd0, 0x00, 0x4d, 0x0e, 0x1c, 0x20, 0x8e, 0xf0, 0x17, 0x2e, 0xba,
+ 0x01, 0x23, 0x00, 0xfd,
+ 0xe0, 0xf0, 0xef, 0x22, 0x35, 0xae, 0xfe, 0x00, 0x42, 0x00, 0xdc, 0x01,
+ 0x15, 0x11, 0x21, 0x72,
+ 0x00, 0xce, 0xe0, 0x03, 0x45, 0x12, 0x00, 0x00, 0x03, 0xe4, 0x00, 0xf0,
+ 0x00, 0x34, 0x44, 0xff,
+ 0xcf, 0x01, 0x00, 0x0e, 0x77, 0x10, 0xfd, 0xf0, 0x02, 0x10, 0x00, 0x23,
+ 0x3e, 0xb8, 0x00, 0x44,
+ 0x00, 0xfd, 0x10, 0x23, 0xd0, 0x8c, 0x00, 0x31, 0x1f, 0xef, 0x13, 0x10,
+ 0x09, 0xf0, 0x01, 0xde,
+ 0x4f, 0x73, 0x0f, 0xda, 0x01, 0x00, 0x00, 0x40, 0x00, 0x9c, 0x10, 0x21,
+ 0x0f, 0xed, 0x10, 0x10,
+ 0xeb, 0xfe, 0x0f, 0x40, 0x22, 0x24, 0xb8, 0xcc, 0x12, 0x44, 0xfe, 0xde,
+ 0x1f, 0x10, 0x00, 0xe1,
+ 0xce, 0x20, 0x20, 0xf0, 0xd0, 0xf2, 0xef, 0xcb, 0x20, 0x52, 0x00, 0x11,
+ 0xee, 0xaa, 0x22, 0x12,
+ 0x0c, 0x61, 0x02, 0xee, 0x02, 0x67, 0x0e, 0xfd, 0x00, 0x00, 0x23, 0x12,
+ 0x0f, 0x0f, 0x10, 0x00,
+ 0xff, 0x03, 0x01, 0x0a, 0xde, 0x02, 0x51, 0x57, 0x13, 0xdc, 0x0e, 0x52,
+ 0x00, 0x11, 0x34, 0xf0,
+ 0xf0, 0x01, 0x23, 0x0d, 0x30, 0x00, 0xf4, 0x74, 0x42, 0xdc, 0xe1, 0x07,
+ 0x20, 0x40, 0x50, 0x27,
+ 0x01, 0xa0, 0x0d, 0x53, 0x03, 0xff, 0x01, 0x05, 0x10, 0x0d, 0x11, 0x02,
+ 0x14, 0x20, 0xe0, 0x02,
+ 0x21, 0xdc, 0x21, 0x42, 0xe0, 0xef, 0x25, 0xd1, 0xf0, 0x1d, 0x2e, 0x51,
+ 0x47, 0x15, 0xcd, 0xf0,
+ 0x11, 0xf1, 0xdf, 0x71, 0x54, 0x00, 0x0f, 0x00, 0xf0, 0xf2, 0x44, 0x40,
+ 0x00, 0x0d, 0x12, 0x35,
+ 0xf0, 0xef, 0x20, 0x76, 0x32, 0xcf, 0x01, 0x23, 0x00, 0x1e, 0x22, 0x05,
+ 0x23, 0x73, 0x10, 0x0c,
+ 0x11, 0x02, 0xee, 0x20, 0x57, 0x15, 0x00, 0x20, 0x10, 0x30, 0x01, 0xd1,
+ 0x03, 0x64, 0x21, 0x00,
+ 0xf1, 0xcf, 0x1f, 0x63, 0x17, 0x01, 0x12, 0x01, 0x00, 0x0f, 0x50, 0xf4,
+ 0x17, 0x61, 0x00, 0xff,
+ 0x03, 0x32, 0x22, 0x32, 0xf1, 0xf4, 0x44, 0x31, 0x10, 0x13, 0x33, 0x00,
+ 0xf0, 0x02, 0x47, 0x44,
+ 0x2f, 0x4f, 0x31, 0xd2, 0xf3, 0x33, 0x4f, 0x2d, 0x43, 0x27, 0xf1, 0x00,
+ 0x41, 0x10, 0x0f, 0x50,
+ 0x25, 0x00, 0x10, 0x70, 0x01, 0x01, 0x0e, 0x3f, 0x24, 0x03, 0x60, 0x1e,
+ 0xdc, 0xf2, 0x47, 0x10,
+ 0x11, 0x20, 0xce, 0xce, 0x62, 0x10, 0xf9, 0xf1, 0x03, 0x0c, 0x0c, 0x10,
+ 0x20, 0xe2, 0xf2, 0x0f,
+ 0x0e, 0x1c, 0xee, 0xd0, 0x23, 0x74, 0x0d, 0xe0, 0xce, 0x9a, 0x00, 0x1f,
+ 0x20, 0x00, 0xee, 0x0b,
+ 0xe1, 0x03, 0xec, 0xab, 0x00, 0x51, 0xf1, 0xbd, 0x0e, 0xff, 0xec, 0x10,
+ 0x33, 0x02, 0xbd, 0x09,
+ 0x00, 0x1f, 0x0d, 0x00, 0x3f, 0x0f, 0xcf, 0xf0, 0x0d, 0x4f, 0x0c, 0xeb,
+ 0xed, 0x00, 0x14, 0xde,
+ 0xc8, 0x0f, 0x00, 0x0f, 0xd0, 0xcf, 0xe0, 0xce, 0xbc, 0xff, 0xf0, 0xc0,
+ 0xeb, 0x0f, 0xc0, 0xdf,
+ 0x00, 0x0f, 0xbd, 0xde, 0x0e, 0x01, 0xef, 0x88, 0xff, 0x00, 0xf0, 0x0e,
+ 0x00, 0xfe, 0x9e, 0x0f,
+ 0x00, 0x0c, 0x0b, 0xce, 0xe0, 0x01, 0x02, 0xfd, 0xa8, 0xfe, 0x01, 0x01,
+ 0xf0, 0xec, 0xe0, 0xce,
+ 0x00, 0x10, 0xfe, 0xb0, 0xf2, 0x0b, 0xcc, 0xed, 0x00, 0x21, 0xdf, 0xbc,
+ 0xf1, 0xf1, 0xfd, 0xc8,
+ 0x0f, 0xf0, 0x00, 0xf2, 0xcf, 0xcb, 0x00, 0x00, 0x00, 0xf0, 0xe0, 0x0d,
+ 0xed, 0x9f, 0x01, 0x32,
+ 0x0d, 0xa8, 0x00, 0x21, 0xf0, 0xde, 0x0f, 0x0e, 0x0e, 0x1d, 0x0f, 0xce,
+ 0xfd, 0x10, 0x21, 0x05,
+ 0xf0, 0xd9, 0x0f, 0xce, 0xed, 0x61, 0x44, 0xef, 0x9b, 0x0f, 0x00, 0x02,
+ 0x0f, 0xdb, 0x00, 0x10,
+ 0x11, 0x12, 0xbf, 0xef, 0x10, 0x1d, 0x0d, 0x02, 0x05, 0xa0, 0x0e, 0x0e,
+ 0x2f, 0x23, 0xd3, 0xa0,
+ 0x10, 0x44, 0x0f, 0xed, 0xf5, 0x02, 0x00, 0x1f, 0x0d, 0x00, 0xe7, 0xd2,
+ 0xbc, 0x10, 0x33, 0xf6,
+ 0x80, 0xff, 0x0e, 0x30, 0x02, 0x01, 0xe1, 0x00, 0xd2, 0xcf, 0x0b, 0x4e,
+ 0x10, 0x01, 0x10, 0xfd,
+ 0xd5, 0x13, 0x3d, 0x5d, 0x0f, 0x07, 0x02, 0x0d, 0x1d, 0x53, 0x06, 0x11,
+ 0x01, 0xd0, 0x6f, 0x30,
+ 0xed, 0xf2, 0x13, 0x4d, 0x5c, 0x45, 0xe2, 0xde, 0x1f, 0x4e, 0xfc, 0xe0,
+ 0x17, 0x42, 0x20, 0x0f,
+ 0xce, 0xfe, 0x21, 0x57, 0x10, 0x00, 0x21, 0xf0, 0xbe, 0x1f, 0x60, 0x14,
+ 0x01, 0xc0, 0x1f, 0x12,
+ 0x24, 0x00, 0xff, 0x11, 0x25, 0x05, 0x00, 0xae, 0x00, 0x57, 0x13, 0xe0,
+ 0x0e, 0x00, 0x21, 0x11,
+ 0x03, 0x24, 0x30, 0x1e, 0x52, 0x21, 0x14, 0x25, 0x41, 0x0d, 0x10, 0x65,
+ 0x13, 0xe0, 0x30, 0x62,
+ 0x01, 0xe0, 0x35, 0x42, 0xf0, 0xcd, 0x10, 0x44, 0x22, 0x02, 0x01, 0x01,
+ 0x21, 0x00, 0x10, 0x00,
+ 0x63, 0x28, 0xc0, 0x25, 0x6c, 0x29, 0x94, 0x26, 0x50, 0x0f, 0xd6, 0x07,
+ 0x30, 0x0f, 0x60, 0x64,
+ 0x02, 0xdf, 0xe8, 0xef, 0x01, 0x54, 0x40, 0xca, 0xcf, 0x10, 0x22, 0x30,
+ 0x01, 0xc0, 0xfe, 0x01,
+ 0xf2, 0x31, 0x60, 0xeb, 0xdf, 0x36, 0x02, 0xd0, 0xac, 0x0f, 0x3f, 0x43,
+ 0x02, 0xde, 0xbd, 0x00,
+ 0x41, 0x01, 0x02, 0x0f, 0x0c, 0x0f, 0x01, 0xf2, 0x03, 0x2f, 0xfe, 0xe0,
+ 0x25, 0x53, 0x00, 0xe9,
+ 0x00, 0x12, 0x11, 0x99, 0x00, 0x21, 0x20, 0x30, 0x11, 0xb0, 0xdf, 0x00,
+ 0x30, 0x53, 0xfb, 0xab,
+ 0x0f, 0x20, 0x33, 0xf1, 0xb2, 0x0f, 0x0b, 0x0f, 0x00, 0x33, 0xe5, 0xef,
+ 0x1f, 0x10, 0x00, 0x47,
+ 0x00, 0xff, 0xed, 0x00, 0x03, 0x21, 0xee, 0xbe, 0x35, 0x32, 0x23, 0x40,
+ 0xab, 0xdd, 0x0f, 0x01,
+ 0x56, 0xf1, 0x00, 0xec, 0xbd, 0x10, 0x54, 0x00, 0xf1, 0xf0, 0x0c, 0x00,
+ 0x34, 0x10, 0x10, 0x00,
+ 0x0e, 0xe4, 0xe0, 0xfd, 0x30, 0x0e, 0x02, 0x17, 0xc0, 0x8f, 0xdd, 0x10,
+ 0x73, 0x31, 0xce, 0xec,
+ 0xf1, 0x35, 0x30, 0xfe, 0xb0, 0x00, 0x0e, 0x2d, 0x11, 0xe3, 0xdd, 0xea,
+ 0x20, 0x52, 0x20, 0x01,
+ 0x17, 0x10, 0xdb, 0xc0, 0x1f, 0x60, 0x11, 0xf3, 0xd2, 0xde, 0x0a, 0x2f,
+ 0x00, 0x24, 0x50, 0xd0,
+ 0xd1, 0x01, 0x1c, 0x0f, 0x21, 0x33, 0xd1, 0xaf, 0x10, 0x10, 0xfa, 0xef,
+ 0x00, 0x22, 0x00, 0x24,
+ 0x01, 0xde, 0xad, 0x02, 0x04, 0x72, 0x11, 0x03, 0x0b, 0x0a, 0x10, 0x24,
+ 0xe2, 0xff, 0x0d, 0x3f,
+ 0x00, 0xc2, 0xde, 0xac, 0xfe, 0xa0, 0xd0, 0x11, 0x43, 0xe0, 0xee, 0x2f,
+ 0x6a, 0x00, 0x04, 0x24,
+ 0x00, 0xfc, 0x0f, 0x30, 0x14, 0x11, 0x31, 0x1f, 0xbb, 0xf1, 0x02, 0x32,
+ 0x40, 0x0f, 0xe0, 0xc4,
+ 0x0e, 0x0f, 0x0d, 0x10, 0x00, 0xb3, 0xe1, 0x35, 0x01, 0xbf, 0x00, 0x77,
+ 0x12, 0xc0, 0xf9, 0xff,
+ 0x0e, 0x22, 0x04, 0x20, 0x0c, 0xae, 0xf2, 0x15, 0x50, 0xed, 0xe0, 0x01,
+ 0x60, 0x11, 0x01, 0xd0,
+ 0x01, 0xe3, 0x1d, 0x08, 0x0d, 0x03, 0xf3, 0x00, 0x00, 0xcd, 0x0f, 0x0e,
+ 0x23, 0x07, 0x01, 0x7e,
+ 0x1e, 0x00, 0xc1, 0xed, 0x0e, 0x53, 0x27, 0xf1, 0xde, 0x2e, 0x00, 0x00,
+ 0xf1, 0x20, 0x1b, 0x3f,
+ 0x70, 0x31, 0xc0, 0xd7, 0x01, 0xfd, 0x2d, 0x30, 0xf4, 0x01, 0x10, 0x9b,
+ 0xf0, 0x13, 0x10, 0x72,
+ 0x10, 0xf0, 0xeb, 0xef, 0xff, 0x11, 0x23, 0x44, 0x4f, 0x0b, 0xbe, 0xef,
+ 0x00, 0x10, 0x14, 0xf1,
+ 0x22, 0x3f, 0x0b, 0xe0, 0xf2, 0x43, 0x40, 0x9b, 0xd0, 0x12, 0x41, 0xed,
+ 0xd0, 0xf1, 0xf1, 0x2d,
+ 0x74, 0x02, 0xdd, 0x0c, 0x01, 0x07, 0x01, 0xff, 0x2c, 0x20, 0x12, 0xf6,
+ 0xc0, 0xdc, 0x30, 0x71,
+ 0x42, 0xc2, 0xf1, 0x0f, 0x1e, 0x30, 0x03, 0xd1, 0xdf, 0x0e, 0x0f, 0x70,
+ 0x07, 0xe1, 0x00, 0x21,
+ 0x5f, 0xe0, 0xec, 0xeb, 0x20, 0x11, 0x11, 0x0d, 0x8e, 0x04, 0x01, 0x0b,
+ 0x2e, 0x1d, 0xff, 0xff,
+ 0x42, 0x10, 0xc1, 0xe1, 0x00, 0x28, 0x2d, 0x10, 0x25, 0xe0, 0xd2, 0x31,
+ 0xc0, 0xc9, 0x2f, 0x30,
+ 0x94, 0x02, 0x20, 0xfe, 0xec, 0x0f, 0x70, 0x24, 0xf1, 0xaf, 0xfe, 0x00,
+ 0x10, 0x33, 0x01, 0xf1,
+ 0x00, 0x0e, 0xfb, 0xff, 0xf0, 0xc2, 0x17, 0x70, 0x00, 0xcc, 0x00, 0x31,
+ 0x10, 0x00, 0x00, 0x16,
+ 0xf0, 0xf0, 0x0c, 0x00, 0x32, 0x12, 0x80, 0xfd, 0x01, 0x04, 0xf0, 0xff,
+ 0xef, 0xbf, 0x2d, 0x6f,
+ 0x25, 0xe5, 0xd0, 0x2f, 0x3b, 0x1f, 0x00, 0x03, 0x25, 0x10, 0x0e, 0xff,
+ 0xef, 0x2f, 0x4f, 0xd0,
+ 0xe5, 0x04, 0xf0, 0xeb, 0x30, 0x70, 0x33, 0xe1, 0x8e, 0xcc, 0x1d, 0x21,
+ 0x46, 0x01, 0xef, 0xbd,
+ 0x00, 0x23, 0x4f, 0xfe, 0xc0, 0x02, 0x04, 0x30, 0x0f, 0x00, 0xc1, 0xff,
+ 0x1e, 0x20, 0x00, 0xe3,
+ 0x12, 0x1b, 0xfb, 0x00, 0x41, 0x22, 0x30, 0xdf, 0xb4, 0x12, 0x1f, 0xfc,
+ 0xf4, 0x04, 0x00, 0x1e,
+ 0x42, 0x06, 0xce, 0xab, 0x00, 0x22, 0xf0, 0xad, 0x0e, 0x0f, 0x0e, 0x10,
+ 0x01, 0xc3, 0xe1, 0x71,
+ 0x2b, 0xfd, 0xc0, 0x00, 0x12, 0x46, 0xf1, 0xc2, 0x01, 0x2b, 0x0c, 0x40,
+ 0x00, 0xe4, 0xd0, 0x0c,
+ 0x60, 0x05, 0x00, 0x0f, 0x30, 0xff, 0xcf, 0x00, 0x51, 0xff, 0xf3, 0x17,
+ 0x20, 0x0e, 0xef, 0xf0,
+ 0x0f, 0xe1, 0x17, 0x4e, 0x0e, 0x2f, 0xf3, 0xd2, 0xcf, 0x0d, 0x30, 0x11,
+ 0xb3, 0x12, 0x30, 0xdf,
+ 0xa1, 0xfe, 0xc9, 0xd1, 0xe4, 0x21, 0x71, 0x50, 0xec, 0xe9, 0xfe, 0x00,
+ 0x04, 0x01, 0x40, 0x3e,
+ 0x1b, 0xd1, 0xb3, 0x12, 0x30, 0xef, 0xf0, 0x30, 0x00, 0x90, 0x14, 0x35,
+ 0x1e, 0x0b, 0x21, 0x01,
+ 0xa1, 0x0f, 0x1f, 0x3f, 0xf2, 0xd0, 0xe2, 0x0e, 0x2b, 0x2f, 0xf1, 0xa7,
+ 0xe0, 0xdb, 0x1f, 0x41,
+ 0xd0, 0xb0, 0x1e, 0x1e, 0xfe, 0x31, 0x67, 0x00, 0xfe, 0xff, 0x01, 0x24,
+ 0xf0, 0xb0, 0x0d, 0x0d,
+ 0x30, 0x22, 0xf5, 0xf0, 0x0b, 0xf0, 0xd1, 0x13, 0x50, 0x0f, 0x2e, 0x4e,
+ 0xb0, 0xb1, 0x03, 0x01,
+ 0x20, 0x1e, 0xee, 0xef, 0xd2, 0xff, 0x3c, 0x03, 0xe3, 0x1a, 0x7d, 0x73,
+ 0x27, 0xe5, 0xcf, 0x0d,
+ 0x10, 0x01, 0xdf, 0x2f, 0x53, 0x06, 0xd0, 0xef, 0xed, 0x00, 0x01, 0x21,
+ 0x30, 0xfd, 0xbc, 0xfd,
+ 0xf5, 0xf4, 0x2e, 0x7e, 0x40, 0xf6, 0x01, 0x1f, 0x0e, 0x0f, 0x04, 0x54,
+ 0x0f, 0xda, 0x00, 0x4f,
+ 0x42, 0xf3, 0xb0, 0xfe, 0x0c, 0x50, 0x02, 0x01, 0xf1, 0xee, 0x0d, 0x00,
+ 0x02, 0xc0, 0xdf, 0x0d,
+ 0x52, 0x27, 0xe4, 0xbf, 0xec, 0x00, 0x41, 0x20, 0xfd, 0xe1, 0xf3, 0xf1,
+ 0x30, 0x3b, 0x10, 0x06,
+ 0x11, 0x30, 0xe0, 0x8f, 0x00, 0x32, 0x12, 0x90, 0x0e, 0x0a, 0x2f, 0x10,
+ 0xf1, 0xc0, 0x01, 0x00,
+ 0x3f, 0x00, 0xe0, 0x1f, 0x30, 0xf7, 0x01, 0x50, 0x20, 0xea, 0xc0, 0xef,
+ 0xe0, 0x12, 0x61, 0x2d,
+ 0xff, 0xd5, 0x02, 0xfd, 0x0c, 0x30, 0x10, 0x2e, 0xd0, 0xb2, 0x26, 0x70,
+ 0x2f, 0xfb, 0xe0, 0x15,
+ 0x01, 0xe0, 0xbe, 0x10, 0x74, 0x1f, 0x00, 0xf0, 0xf3, 0x00, 0x3d, 0x2e,
+ 0x01, 0xd3, 0xed, 0x08,
+ 0x0d, 0x10, 0x0b, 0xed, 0xd1, 0x77, 0x72, 0x0f, 0xcd, 0xe0, 0x24, 0x32,
+ 0x0f, 0xde, 0xff, 0x00,
+ 0xd2, 0xd0, 0xf1, 0xd0, 0x09, 0x20, 0x33, 0x01, 0x0f, 0x2d, 0x50, 0x05,
+ 0x54, 0x00, 0xfb, 0xe0,
+ 0x30, 0x34, 0x10, 0x80, 0xd0, 0xe0, 0x11, 0x7f, 0x4e, 0xf0, 0xd1, 0xf0,
+ 0x0f, 0x10, 0x01, 0x01,
+ 0x09, 0x0d, 0xdf, 0x17, 0x63, 0x0f, 0xbe, 0xee, 0x01, 0x43, 0x1e, 0x0d,
+ 0xe0, 0xe7, 0xf0, 0x0a,
+ 0x00, 0xff, 0x11, 0x5f, 0x0e, 0x20, 0x05, 0xff, 0xff, 0x20, 0x72, 0x5f,
+ 0x00, 0xe2, 0x03, 0x0d,
+ 0x3f, 0x04, 0xd1, 0x0e, 0x6b, 0x10, 0x03, 0xd2, 0xdd, 0xf8, 0x00, 0x61,
+ 0x43, 0x00, 0xad, 0xe0,
+ 0x10, 0x42, 0xf1, 0xd0, 0xde, 0x01, 0x56, 0x00, 0xfd, 0xff, 0xfe, 0x00,
+ 0x31, 0x45, 0xef, 0xed,
+ 0x00, 0x02, 0x14, 0x22, 0x20, 0xe0, 0xdf, 0xeb, 0xd0, 0x36, 0x31, 0x92,
+ 0xcf, 0xff, 0xf0, 0x1f,
+ 0x00, 0xb0, 0xff, 0x40, 0x77, 0x00, 0x0a, 0xdf, 0x11, 0x66, 0x10, 0xf0,
+ 0xed, 0x20, 0x20, 0x30,
+ 0xe0, 0xbf, 0xf0, 0x01, 0x02, 0x1d, 0x0e, 0xeb, 0x1e, 0x00, 0x05, 0xe3,
+ 0x10, 0xf1, 0xbf, 0x2b,
+ 0x70, 0x1e, 0xd0, 0xc0, 0x23, 0x22, 0xef, 0xcc, 0x0f, 0x2f, 0x1f, 0x34,
+ 0x22, 0xe9, 0x8d, 0xe0,
+ 0x15, 0x41, 0x00, 0xf0, 0x02, 0x3f, 0xfc, 0xcf, 0xe0, 0xf1, 0x56, 0x52,
+ 0x0e, 0xca, 0x0e, 0x00,
+ 0x11, 0x05, 0xd0, 0xf0, 0x2e, 0x20, 0x00, 0xc1, 0xe2, 0xf1, 0x33, 0x72,
+ 0xfc, 0xcb, 0x00, 0x22,
+ 0x00, 0xdf, 0xfe, 0x10, 0x31, 0x44, 0x32, 0x0f, 0x8c, 0x00, 0x02, 0x10,
+ 0x20, 0x04, 0x02, 0x0d,
+ 0x0b, 0xe0, 0xd2, 0x24, 0x4b, 0x2e, 0xf2, 0xd3, 0xdd, 0x1d, 0x72, 0x53,
+ 0xed, 0xfa, 0x0f, 0x0f,
+ 0x00, 0x0f, 0x0d, 0xbf, 0xf2, 0x27, 0x40, 0x0e, 0x0e, 0x13, 0x16, 0xf0,
+ 0xff, 0xdb, 0x01, 0xe4,
+ 0x12, 0x40, 0xec, 0xdf, 0x30, 0x05, 0x80, 0x9f, 0x1e, 0x21, 0x14, 0x00,
+ 0x0d, 0xd0, 0xf0, 0x01,
+ 0x60, 0x00, 0x0c, 0x0e, 0x00, 0x02, 0xe6, 0xf0, 0x00, 0x70, 0x2b, 0x00,
+ 0xf0, 0xc1, 0xf3, 0x10,
+ 0x41, 0x23, 0x0f, 0xfb, 0x00, 0xc2, 0xc3, 0xf6, 0x41, 0x3d, 0xda, 0xc0,
+ 0x02, 0x24, 0xee, 0xee,
+ 0xf0, 0x00, 0x4f, 0x2f, 0xdf, 0x9f, 0x03, 0x31, 0x1d, 0x0b, 0xee, 0xc0,
+ 0x06, 0x44, 0x2f, 0x29,
+ 0xe0, 0xf0, 0xe2, 0x40, 0x60, 0x20, 0x0f, 0xdf, 0x1f, 0x31, 0xd2, 0xb2,
+ 0x0d, 0x3b, 0x20, 0xc4,
+ 0xc1, 0xfc, 0xcf, 0xf0, 0x02, 0x22, 0x01, 0xbe, 0x0b, 0x3f, 0x20, 0xff,
+ 0xc0, 0x00, 0x77, 0x20,
+ 0x31, 0xd0, 0xd0, 0x23, 0x44, 0x00, 0xe2, 0xf3, 0x01, 0x5e, 0xfe, 0xc0,
+ 0xf1, 0xea, 0x0b, 0x2f,
+ 0x3e, 0xf0, 0x90, 0x04, 0x0f, 0x19, 0x00, 0x00, 0xd3, 0x01, 0x40, 0x00,
+ 0xee, 0x0e, 0x50, 0x11,
+ 0x03, 0x00, 0x34, 0xdd, 0xb8, 0x0c, 0x52, 0x64, 0x11, 0x0f, 0xee, 0x00,
+ 0x01, 0x01, 0x01, 0xe0,
+ 0x00, 0xf1, 0xf6, 0x32, 0x20, 0xac, 0x0f, 0x40, 0xe1, 0xb3, 0x04, 0x52,
+ 0x0f, 0xd8, 0x0f, 0x00,
+ 0x4f, 0x00, 0x02, 0xc3, 0xd0, 0x00, 0x00, 0x40, 0x10, 0x2b, 0x11, 0x07,
+ 0xb0, 0x00, 0xff, 0x0e,
+ 0xfd, 0x0f, 0x12, 0x14, 0x3d, 0xfd, 0x80, 0x83, 0x12, 0x10, 0x00, 0x2e,
+ 0x01, 0xd7, 0xf5, 0xff,
+ 0x0c, 0x2f, 0x50, 0x00, 0x0f, 0xf3, 0x04, 0x2f, 0xfd, 0x00, 0x44, 0x31,
+ 0xfe, 0xe8, 0x20, 0x32,
+ 0x40, 0x00, 0x8f, 0xcc, 0x01, 0x22, 0x22, 0x21, 0x00, 0xec, 0xdc, 0xb0,
+ 0x02, 0x36, 0x30, 0x0c,
+ 0xe0, 0x01, 0x11, 0x61, 0x00, 0x2f, 0x1d, 0xd0, 0xe0, 0x3e, 0x6d, 0x0f,
+ 0xde, 0xf5, 0x07, 0xf1,
+ 0x0e, 0xed, 0xd0, 0x25, 0x72, 0x00, 0xbc, 0xdf, 0x00, 0x55, 0x10, 0x20,
+ 0xf0, 0xc0, 0xeb, 0x00,
+ 0x30, 0x32, 0xf2, 0xb1, 0x0f, 0x3a, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xb7,
+ 0xe0, 0x00, 0x7e, 0x1f,
+ 0x02, 0xe5, 0x00, 0xef, 0x32, 0x71, 0x20, 0xec, 0xe0, 0x01, 0xf4, 0x12,
+ 0x4f, 0x0c, 0xbf, 0x01,
+ 0x03, 0x0f, 0xff, 0xef, 0x1e, 0x4d, 0x00, 0x07, 0xf0, 0x0b, 0x2e, 0x60,
+ 0x0f, 0xd0, 0xd0, 0x00,
+ 0x0f, 0x30, 0xcd, 0xfb, 0x1f, 0x10, 0x0e, 0x3d, 0x44, 0xd7, 0xd0, 0x7c,
+ 0x50, 0x00, 0xc2, 0x01,
+ 0x2c, 0xee, 0xe2, 0x05, 0x10, 0x0e, 0xe0, 0xa0, 0xc2, 0xcf, 0x10, 0x53,
+ 0x11, 0xf0, 0xdd, 0x10,
+ 0x35, 0x0e, 0xe9, 0x1e, 0x30, 0x02, 0x04, 0x20, 0x10, 0x3f, 0x32, 0xf5,
+ 0x81, 0xc0, 0xfc, 0xff,
+ 0x00, 0x22, 0x10, 0x10, 0x00, 0xe7, 0xf3, 0x8c, 0xae, 0x33, 0x64, 0x00,
+ 0xe9, 0xe0, 0x00, 0x00,
+ 0x31, 0x20, 0x00, 0xe2, 0x00, 0x00, 0x3c, 0x0f, 0xf0, 0x02, 0xf1, 0x04,
+ 0x75, 0x51, 0x2d, 0xcd,
+ 0xe0, 0xf0, 0x0d, 0x3e, 0x05, 0xf6, 0x01, 0x3f, 0xfb, 0xdf, 0x00, 0x21,
+ 0x22, 0xe0, 0xb1, 0xf0,
+ 0x2f, 0x7e, 0x11, 0x03, 0xde, 0xdc, 0xb1, 0xf0, 0xff, 0x28, 0x6f, 0xf2,
+ 0xe1, 0x00, 0x1f, 0x00,
+ 0x04, 0x32, 0x30, 0xdd, 0x8e, 0xee, 0x0f, 0x64, 0x17, 0x07, 0x02, 0xee,
+ 0xcd, 0x00, 0x40, 0x11,
+ 0x02, 0xd2, 0xcd, 0x1c, 0x11, 0x20, 0x2d, 0xe0, 0xa2, 0x03, 0x3c, 0x0a,
+ 0xde, 0xff, 0x34, 0x34,
+ 0xe0, 0xcc, 0xee, 0x00, 0x73, 0x20, 0xfe, 0xaf, 0x0f, 0x0f, 0x32, 0x16,
+ 0xf0, 0xee, 0xef, 0x10,
+ 0x2d, 0x00, 0x11, 0x0e, 0xf0, 0x37, 0x55, 0xef, 0xfe, 0x4c, 0x7e, 0x01,
+ 0xe6, 0xf1, 0x0e, 0x1e,
+ 0x50, 0x23, 0xd2, 0xc0, 0x01, 0x22, 0x3f, 0xcc, 0xdf, 0xf0, 0x02, 0x22,
+ 0x2e, 0xec, 0xd7, 0x22,
+ 0x6f, 0xfd, 0xef, 0x00, 0x11, 0x04, 0x00, 0xff, 0xbd, 0x01, 0x46, 0x00,
+ 0x0a, 0xcf, 0xe0, 0x03,
+ 0x00, 0x2c, 0x2e, 0x00, 0x04, 0xe5, 0x90, 0x2e, 0x7f, 0x52, 0x04, 0xc0,
+ 0xe0, 0x04, 0x30, 0x1c,
+ 0x00, 0xff, 0xe2, 0xf4, 0x1f, 0x29, 0x20, 0xe1, 0xaf, 0x0d, 0x10, 0x24,
+ 0xd0, 0xa0, 0x0a, 0x1e,
+ 0x00, 0xf2, 0x01, 0xf1, 0xed, 0x00, 0x71, 0x21, 0xdd, 0xfd, 0x42, 0x47,
+ 0x01, 0xde, 0x0d, 0x30,
+ 0x00, 0xf1, 0x0f, 0x0f, 0xe1, 0xb1, 0xfd, 0xc9, 0xef, 0xf3, 0x55, 0x31,
+ 0xe0, 0xbc, 0x0f, 0x1e,
+ 0x30, 0x33, 0x23, 0x11, 0x80, 0x00, 0x18, 0x3d, 0x12, 0xe4, 0xf2, 0xd1,
+ 0xef, 0xec, 0x1e, 0x02,
+ 0x26, 0x11, 0x02, 0xdf, 0xcc, 0x0e, 0x30, 0xd1, 0xd4, 0xe0, 0xa0, 0x1d,
+ 0x7f, 0x20, 0x05, 0xa2,
+ 0xed, 0x0e, 0x34, 0x20, 0xfb, 0xf0, 0xf4, 0x15, 0x70, 0x5d, 0x0e, 0x01,
+ 0xe1, 0x00, 0xf0, 0x02,
+ 0x33, 0x3f, 0x0a, 0xef, 0xb0, 0xf3, 0x00, 0x0e, 0xed, 0xf2, 0x24, 0x20,
+ 0xdb, 0xcf, 0xf0, 0x10,
+ 0x73, 0x0f, 0x0d, 0x05, 0x01, 0xfc, 0xff, 0x03, 0x14, 0xff, 0xdc, 0x00,
+ 0x01, 0x03, 0x20, 0x00,
+ 0x82, 0xb2, 0x24, 0x40, 0x0d, 0x0a, 0x10, 0x15, 0xb1, 0xdc, 0x1c, 0x60,
+ 0x12, 0xe4, 0xe0, 0xfe,
+ 0x0c, 0x22, 0x26, 0x00, 0xd0, 0xeb, 0x20, 0x53, 0x20, 0xe0, 0x0e, 0xe0,
+ 0xb1, 0x20, 0x1d, 0x0e,
+ 0x31, 0x76, 0x0e, 0xde, 0xe0, 0xf2, 0x13, 0x5f, 0x39, 0xff, 0x90, 0x05,
+ 0x01, 0x3e, 0x1f, 0xe0,
+ 0xb4, 0x01, 0x10, 0x0c, 0x40, 0x12, 0x00, 0xef, 0xee, 0x30, 0x67, 0x00,
+ 0x00, 0x0e, 0xef, 0x1f,
+ 0x40, 0x1d, 0x01, 0xf5, 0xd1, 0xff, 0x0e, 0x00, 0xf2, 0xd1, 0xfd, 0xea,
+ 0xb0, 0xc4, 0xf0, 0x09,
+ 0x20, 0x60, 0x05, 0xc0, 0xdf, 0xee, 0x00, 0x70, 0x11, 0x01, 0x21, 0x13,
+ 0x01, 0xc0, 0x0e, 0xfd,
+ 0x00, 0x13, 0x25, 0x31, 0xf1, 0x00, 0x0e, 0x20, 0xa2, 0xc5, 0xf0, 0x2e,
+ 0x72, 0x33, 0xf3, 0xd1,
+ 0xd0, 0x08, 0x2c, 0x0e, 0xf0, 0xb3, 0xf0, 0x00, 0x00, 0x3f, 0x0e, 0x0e,
+ 0xfc, 0xcb, 0xe1, 0x06,
+ 0x70, 0x0d, 0xed, 0x9e, 0x00, 0x01, 0x04, 0x30, 0x0c, 0x77, 0xeb, 0xf0,
+ 0x56, 0xee, 0x0f, 0x51,
+ 0x00, 0xd0, 0x00, 0x33, 0x30, 0xca, 0x00, 0x12, 0x03, 0xbd, 0xee, 0x10,
+ 0x31, 0x01, 0xf0, 0xb0,
+ 0x0e, 0x01, 0x31, 0x0f, 0x1e, 0x0f, 0x00, 0x07, 0x00, 0x3e, 0x00, 0xfe,
+ 0xd0, 0x15, 0x75, 0xcd,
+ 0xdd, 0xe0, 0x13, 0x12, 0xdf, 0x11, 0x0d, 0x40, 0x00, 0x02, 0x05, 0xf0,
+ 0x33, 0xbb, 0x00, 0x74,
+ 0xff, 0x01, 0x12, 0x0f, 0x03, 0x10, 0x1b, 0xcd, 0x0f, 0x34, 0x30, 0xcb,
+ 0x02, 0x10, 0x0b, 0x71,
+ 0x13, 0xcf, 0x0c, 0x10, 0x01, 0x32, 0x11, 0xe0, 0x80, 0x0d, 0xfe, 0x0d,
+ 0x37, 0x30, 0xcd, 0xde,
+ 0x03, 0x14, 0x1c, 0x2e, 0x11, 0x02, 0x02, 0x9d, 0xfe, 0x11, 0x55, 0x02,
+ 0xd2, 0xea, 0xfd, 0x0e,
+ 0x30, 0x36, 0x01, 0xc0, 0xf0, 0x0d, 0x61, 0x30, 0x0c, 0x0f, 0x22, 0xb5,
+ 0xc0, 0xeb, 0x0f, 0x50,
+ 0x31, 0xc3, 0xb0, 0x0e, 0x00, 0x10, 0x12, 0x03, 0xd0, 0xf1, 0x30, 0x18,
+ 0xde, 0xc0, 0x05, 0x31,
+ 0x40, 0x42, 0x1e, 0xdd, 0xbf, 0x00, 0x22, 0x23, 0x03, 0x14, 0x02, 0x60,
+ 0x0d, 0xe0, 0xd2, 0xcf,
+ 0x1c, 0x77, 0x34, 0xcc, 0xec, 0x00, 0x11, 0x30, 0x1d, 0xe2, 0xd2, 0x0e,
+ 0x3b, 0x0e, 0x0e, 0x12,
+ 0x43, 0x41, 0x0f, 0xa9, 0xed, 0x01, 0x24, 0x21, 0x0f, 0x1c, 0x00, 0x03,
+ 0x24, 0x00, 0x38, 0x00,
+ 0xdd, 0x0c, 0x9d, 0x07, 0xf7, 0x0b, 0xae, 0x08, 0x3d, 0x4d, 0x59, 0x2d,
+ 0x00, 0xd4, 0xe0, 0xdd,
+ 0xd9, 0x0f, 0xf1, 0x82, 0xd3, 0xd1, 0x10, 0x50, 0x10, 0x00, 0xf0, 0xc0,
+ 0xc0, 0xf2, 0x11, 0x3d,
+ 0x08, 0xfb, 0x1e, 0x30, 0x00, 0x2f, 0x4d, 0x2d, 0x0f, 0xc0, 0x23, 0x74,
+ 0x73, 0x32, 0x03, 0xe7,
+ 0xe5, 0x02, 0x22, 0x21, 0x52, 0x34, 0x23, 0x14, 0x12, 0x02, 0x00, 0x32,
+ 0x02, 0x93, 0xd3, 0xb2,
+ 0xd0, 0xc0, 0xd1, 0xe5, 0xd3, 0xce, 0xd9, 0xde, 0xe0, 0xd1, 0xc0, 0xff,
+ 0x00, 0x60, 0x3d, 0x3d,
+ 0x2e, 0x3e, 0x35, 0x37, 0x21, 0x1e, 0x2d, 0x1e, 0x00, 0xac, 0xc8, 0xde,
+ 0xcd, 0xee, 0xdd, 0xcc,
+ 0xcd, 0xcd, 0xdd, 0xfd, 0x1d, 0x0b, 0xdc, 0xdd, 0xbf, 0xde, 0xdc, 0x0f,
+ 0x1f, 0x30, 0x00, 0xf0,
+ 0xff, 0x0f, 0x10, 0x40, 0x32, 0x23, 0x22, 0x02, 0x87, 0xb3, 0xe1, 0x00,
+ 0x1f, 0xf0, 0xc4, 0xe4,
+ 0x11, 0xeb, 0x03, 0x07, 0x8b, 0x8f, 0x12, 0x0f, 0xfc, 0x10, 0x01, 0xcb,
+ 0xfe, 0x32, 0x11, 0xee,
+ 0xed, 0xf0, 0x00, 0x1f, 0x1e, 0x0f, 0x00, 0xf0, 0xf0, 0xdd, 0xbb, 0x0e,
+ 0x31, 0x42, 0x0e, 0x0c,
+ 0x10, 0x00, 0x2f, 0x61, 0x0d, 0xfe, 0x17, 0x25, 0x20, 0x10, 0x50, 0x42,
+ 0x14, 0xf0, 0x00, 0x00,
+ 0x30, 0x01, 0xe2, 0xf3, 0x22, 0x42, 0xee, 0x00, 0x77, 0x27, 0x01, 0x01,
+ 0x11, 0x41, 0xe1, 0xc0,
+ 0xe1, 0xd1, 0xc1, 0xd2, 0xb0, 0xd2, 0xb2, 0xc0, 0xf1, 0xe0, 0xe4, 0xd2,
+ 0xc9, 0xde, 0xe3, 0xf7,
+ 0xd1, 0xb0, 0x00, 0x01, 0x01, 0x13, 0x12, 0x00, 0x20, 0x12, 0x45, 0x21,
+ 0x30, 0x31, 0xf1, 0xd0,
+ 0x10, 0x10, 0x10, 0x04, 0x80, 0x8d, 0xf5, 0x05, 0x0f, 0xda, 0x00, 0x22,
+ 0x00, 0xde, 0x00, 0x62,
+ 0x20, 0x1a, 0x2f, 0x50, 0x10, 0x2d, 0x2d, 0x4f, 0x30, 0x1b, 0x1d, 0x20,
+ 0x1f, 0x00, 0x00, 0x10,
+ 0x30, 0x4e, 0x50, 0x1f, 0x08, 0x0f, 0x42, 0x43, 0x20, 0x2c, 0x2d, 0x3c,
+ 0x2d, 0x0b, 0x1f, 0x00,
+ 0xf0, 0x4f, 0x5f, 0x0c, 0x0d, 0x30, 0x63, 0x0f, 0x1e, 0x12, 0x03, 0xd0,
+ 0xc0, 0xe4, 0xf7, 0x03,
+ 0x33, 0x33, 0xf4, 0xd6, 0x03, 0x43, 0x62, 0x13, 0x25, 0x32, 0x12, 0x12,
+ 0x76, 0x23, 0x01, 0x01,
+ 0x23, 0x44, 0x02, 0xe1, 0xf4, 0x04, 0xf3, 0xf1, 0xf0, 0xa1, 0xd0, 0xd0,
+ 0x0f, 0x70, 0x30, 0x3f,
+ 0x40, 0x41, 0x3e, 0x3b, 0x6f, 0x1f, 0x19, 0x0d, 0x2f, 0x1f, 0x0d, 0x1d,
+ 0x1d, 0x0d, 0xfb, 0x0c,
+ 0x0d, 0xfd, 0xfe, 0xdd, 0xac, 0xdf, 0xf0, 0x2e, 0x2a, 0x1d, 0xfe, 0xce,
+ 0xaf, 0xcb, 0xed, 0x2d,
+ 0x2e, 0xfd, 0xcc, 0xdd, 0xdd, 0xfe, 0x0e, 0xde, 0x8d, 0xed, 0xee, 0x0e,
+ 0x00, 0x04, 0xd3, 0xc0,
+ 0xad, 0xe2, 0xf7, 0x04, 0xdf, 0xde, 0x00, 0xf2, 0xb0, 0xe2, 0x07, 0x31,
+ 0x10, 0x20, 0x01, 0xc1,
+ 0xe0, 0xf0, 0x24, 0x24, 0x32, 0x01, 0xcf, 0xf0, 0x00, 0x24, 0xf5, 0x03,
+ 0xf0, 0x42, 0x74, 0x74,
+ 0x21, 0x20, 0x33, 0x57, 0x67, 0xdc, 0x41, 0x56, 0xde, 0x10, 0x21, 0x11,
+ 0x21, 0xee, 0x10, 0x64,
+ 0x01, 0xed, 0xfd, 0x11, 0x24, 0x00, 0x0e, 0x0e, 0x10, 0x10, 0x00, 0x2f,
+ 0x1f, 0x40, 0x10, 0xff,
+ 0x0f, 0x01, 0x31, 0x75, 0x00, 0x0f, 0x01, 0x02, 0x37, 0x05, 0xe0, 0x22,
+ 0x23, 0xe3, 0x81, 0x01,
+ 0x14, 0x01, 0xd1, 0xf4, 0x14, 0x02, 0xd0, 0x10, 0x76, 0x22, 0x01, 0x00,
+ 0xf0, 0x01, 0x23, 0x01,
+ 0xe1, 0xe4, 0xf3, 0xd1, 0xd2, 0xe4, 0x80, 0x9f, 0xe0, 0xf0, 0xf0, 0xee,
+ 0xda, 0xe0, 0xe0, 0xbd,
+ 0xfc, 0x10, 0x30, 0x0c, 0x0c, 0x10, 0x30, 0x00, 0x30, 0x5f, 0x4e, 0x40,
+ 0x1c, 0x0a, 0x1e, 0x10,
+ 0x30, 0x51, 0x31, 0x23, 0x22, 0x0e, 0x31, 0x56, 0x12, 0x00, 0x22, 0x35,
+ 0x21, 0x00, 0x51, 0x20,
+ 0x00, 0x56, 0x34, 0x00, 0x0e, 0x10, 0x40, 0x2f, 0x1c, 0xfd, 0xef, 0xd0,
+ 0xbd, 0xdb, 0xfe, 0x50,
+ 0x13, 0xd1, 0xb1, 0xe1, 0x17, 0x57, 0x11, 0x11, 0x01, 0x11, 0x32, 0x53,
+ 0x12, 0x03, 0x35, 0x33,
+ 0x11, 0x00, 0x02, 0xd2, 0xb1, 0xe1, 0xe2, 0xd1, 0xd3, 0xc3, 0x9f, 0xeb,
+ 0x00, 0x03, 0xe2, 0xd0,
+ 0xf0, 0x00, 0x30, 0x0b, 0xec, 0x0f, 0x2e, 0x1d, 0x3e, 0xfa, 0x8c, 0xde,
+ 0x0f, 0x20, 0x0f, 0x9a,
+ 0xdd, 0xde, 0xee, 0xfe, 0xd9, 0xee, 0x0e, 0xde, 0xdd, 0xfd, 0xfe, 0xdd,
+ 0x0c, 0x0d, 0xdb, 0xbd,
+ 0xee, 0xfd, 0xfd, 0xda, 0x1e, 0x7f, 0x1e, 0xfc, 0xde, 0xde, 0xce, 0xed,
+ 0x0d, 0xee, 0x8c, 0xac,
+ 0xfe, 0xff, 0xee, 0xcc, 0xef, 0xdd, 0xef, 0xde, 0xba, 0xfe, 0x0e, 0xff,
+ 0xee, 0xc0, 0xe0, 0xec,
+ 0xd9, 0x0f, 0xdf, 0xf0, 0xf0, 0xe0, 0x00, 0xe0, 0xcf, 0x02, 0x23, 0x77,
+ 0x77, 0xbc, 0xdc, 0x74,
+ 0x01, 0xee, 0x00, 0x33, 0xff, 0xca, 0x21, 0x33, 0xf0, 0xcd, 0x0f, 0x21,
+ 0x11, 0xef, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f, 0x01, 0x01, 0xdf, 0x11, 0x22, 0x01, 0xe0, 0x8d,
+ 0x03, 0x07, 0xef, 0xfd,
+ 0x00, 0xee, 0xe0, 0x04, 0x01, 0x00, 0xde, 0xde, 0xf2, 0x90, 0xbd, 0xf0,
+ 0xf0, 0x04, 0xf1, 0xd0,
+ 0xde, 0xef, 0xe3, 0xdf, 0xcf, 0xdb, 0xb8, 0xf0, 0xf0, 0xfe, 0x10, 0x21,
+ 0xef, 0xed, 0x0f, 0x64,
+ 0x11, 0xfc, 0x21, 0x23, 0x00, 0x17, 0x12, 0xce, 0x0f, 0xe0, 0xd3, 0xb4,
+ 0x9f, 0xef, 0xff, 0xfd,
+ 0x01, 0x12, 0x14, 0x14, 0xfc, 0x0c, 0x73, 0x45, 0x1f, 0x2e, 0x2c, 0x40,
+ 0x45, 0x42, 0x20, 0x1e,
+ 0x2e, 0x20, 0x11, 0x11, 0x0b, 0x4e, 0x51, 0x01, 0x02, 0x00, 0xf9, 0x1f,
+ 0x30, 0xfe, 0xff, 0xe0,
+ 0xfe, 0x0c, 0xfb, 0x50, 0x0f, 0xcc, 0xfe, 0x00, 0x60, 0x21, 0x11, 0x0f,
+ 0x1e, 0x21, 0x57, 0x15,
+ 0x01, 0x00, 0x02, 0x02, 0xf2, 0x03, 0x35, 0x02, 0xe0, 0x72, 0x77, 0x12,
+ 0x11, 0x21, 0x21, 0x41,
+ 0x23, 0x24, 0x22, 0x01, 0x02, 0x05, 0xe1, 0xf1, 0x03, 0xc2, 0xa0, 0xc0,
+ 0xe1, 0x04, 0xe0, 0xe0,
+ 0xef, 0x00, 0x43, 0x10, 0xe8, 0x2e, 0x71, 0x11, 0x0f, 0x3f, 0x40, 0x31,
+ 0x1e, 0x10, 0x34, 0x00,
+ 0xed, 0x2e, 0x6f, 0x2d, 0x1b, 0x1f, 0x10, 0x1d, 0x0d, 0x2d, 0x5d, 0x64,
+ 0x27, 0x10, 0x10, 0x30,
+ 0x43, 0x13, 0x00, 0x20, 0x35, 0x42, 0x42, 0x3f, 0x19, 0x2f, 0x01, 0x00,
+ 0x10, 0x40, 0xff, 0xc0,
+ 0xf3, 0xf0, 0xf3, 0xe5, 0xe3, 0xd2, 0xa1, 0x07, 0xe6, 0xc1, 0x00, 0x33,
+ 0xd2, 0xd3, 0xd2, 0x64,
+ 0x44, 0x43, 0x23, 0x9a, 0x33, 0x25, 0xce, 0x10, 0x01, 0x54, 0x11, 0xbb,
+ 0x00, 0x33, 0x02, 0xfe,
+ 0xff, 0x22, 0x01, 0xee, 0x00, 0x42, 0x23, 0x10, 0x0f, 0x0e, 0x00, 0x10,
+ 0x2f, 0x20, 0x0e, 0x1d,
+ 0x3f, 0x21, 0x15, 0xe0, 0x00, 0x77, 0xef, 0xeb, 0x50, 0x11, 0xfe, 0xfe,
+ 0x62, 0x23, 0xe8, 0xed,
+ 0x40, 0x52, 0x00, 0xfc, 0x0f, 0x11, 0x00, 0xfe, 0x1e, 0x40, 0x00, 0x0d,
+ 0xed, 0x00, 0x00, 0xce,
+ 0xde, 0x0f, 0xee, 0x98, 0xf0, 0xe1, 0xab, 0xed, 0x02, 0xf1, 0xcd, 0xff,
+ 0xef, 0xfe, 0xed, 0x17,
+ 0x24, 0xbf, 0xee, 0x01, 0x24, 0x22, 0x11, 0xe1, 0xc2, 0x04, 0x03, 0xf4,
+ 0xf3, 0xe1, 0xbf, 0xe1,
+ 0xd5, 0xc3, 0xd1, 0xd0, 0x00, 0x01, 0x00, 0xe2, 0xe1, 0xbb, 0x2e, 0x71,
+ 0x10, 0x0d, 0x1b, 0x3f,
+ 0x1b, 0x1d, 0x6f, 0x1f, 0x2f, 0x0b, 0x0d, 0x30, 0x3d, 0x3f, 0x31, 0x02,
+ 0x01, 0x42, 0x33, 0x00,
+ 0xdc, 0x1f, 0x00, 0x88, 0x0f, 0x61, 0x10, 0x0b, 0x0d, 0xff, 0x01, 0x13,
+ 0x0f, 0xfc, 0x0d, 0x1f,
+ 0xbc, 0xbe, 0xf1, 0xf0, 0x0d, 0x0b, 0xfe, 0xff, 0xfe, 0x0e, 0x30, 0x50,
+ 0x23, 0x12, 0x01, 0x17,
+ 0x77, 0x32, 0x20, 0x00, 0x42, 0x25, 0xf1, 0xc1, 0x01, 0x01, 0xe0, 0xc0,
+ 0xc2, 0xa0, 0xe0, 0xe1,
+ 0xf1, 0xf0, 0xef, 0xdb, 0xde, 0xe3, 0xe5, 0x8a, 0xf0, 0x35, 0xe0, 0xdf,
+ 0x20, 0x41, 0x00, 0xce,
+ 0x00, 0x34, 0x00, 0xfd, 0x1f, 0x20, 0xfd, 0xdc, 0xe0, 0xef, 0xac, 0xfe,
+ 0xef, 0xbb, 0xcc, 0xdc,
+ 0xff, 0x0f, 0x0e, 0xdb, 0xfe, 0xff, 0xbc, 0xed, 0x0d, 0x1d, 0xdc, 0x2f,
+ 0x20, 0xab, 0xfe, 0x10,
+ 0x30, 0xff, 0xde, 0x00, 0x02, 0xa0, 0xf1, 0xf2, 0xe0, 0xdf, 0x14, 0xf3,
+ 0x8e, 0xef, 0x03, 0x01,
+ 0xfe, 0x0d, 0x1c, 0x20, 0x67, 0x12, 0x10, 0x10, 0x00, 0xee, 0xdc, 0xec,
+ 0x12, 0xf2, 0x8c, 0xdc,
+ 0xfe, 0x0e, 0xfd, 0xdd, 0xca, 0xce, 0xff, 0xff, 0xfd, 0xfb, 0x0e, 0x0f,
+ 0x10, 0x10, 0x21, 0x21,
+ 0x20, 0x2e, 0x0d, 0x01, 0xc5, 0x8f, 0xcf, 0x01, 0x31, 0x20, 0x10, 0x02,
+ 0x07, 0x11, 0x0f, 0x7f,
+ 0x33, 0x00, 0xf0, 0x35, 0x56, 0x42, 0x11, 0x10, 0x32, 0x15, 0x23, 0x43,
+ 0x21, 0x00, 0xe0, 0xe0,
+ 0xd3, 0xd2, 0xd0, 0x80, 0xbe, 0xe0, 0x06, 0xc1, 0xc0, 0xf4, 0xe4, 0xd2,
+ 0xf1, 0x15, 0x02, 0x02,
+ 0xf2, 0xf1, 0x04, 0x16, 0x33, 0x23, 0xe0, 0x00, 0x74, 0x75, 0x02, 0x00,
+ 0x02, 0x02, 0xf2, 0xf3,
+ 0x05, 0x01, 0xb0, 0xe0, 0x03, 0xf0, 0xdd, 0x0e, 0x33, 0x67, 0x05, 0xce,
+ 0xcb, 0x10, 0x20, 0x20,
+ 0x10, 0x0f, 0x0e, 0x0e, 0x50, 0x33, 0x20, 0x10, 0x30, 0x32, 0x11, 0x0f,
+ 0x0e, 0x0f, 0x1e, 0x0f,
+ 0x24, 0x77, 0x53, 0x20, 0x2e, 0x3d, 0x4e, 0x3e, 0x3c, 0x2c, 0x4c, 0x3c,
+ 0x3e, 0x10, 0x10, 0x50,
+ 0x5e, 0x2e, 0x22, 0x14, 0x01, 0xf0, 0xf0, 0xdd, 0xeb, 0x0f, 0x0f, 0xfb,
+ 0x1e, 0x60, 0x35, 0x03,
+ 0x00, 0x01, 0x33, 0x55, 0x12, 0x11, 0x11, 0x02, 0x17, 0x15, 0xd1, 0xf2,
+ 0x13, 0x83, 0xd2, 0x03,
+ 0xe4, 0xe3, 0x02, 0xf2, 0xd1, 0x32, 0x32, 0x75, 0x24, 0x75, 0x00, 0xac,
+ 0x76, 0x01, 0xfe, 0x10,
+ 0x21, 0x22, 0x10, 0xba, 0x00, 0x54, 0x00, 0xec, 0x0e, 0x11, 0x11, 0xee,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x0f, 0xee, 0xff, 0xfd, 0xfc, 0x40, 0xfe, 0xca, 0xff, 0x00, 0x20,
+ 0xdc, 0xdd, 0x50, 0x41,
+ 0x00, 0x98, 0x0f, 0x20, 0x00, 0xfe, 0xef, 0xff, 0xf0, 0xf0, 0xe0, 0xce,
+ 0xee, 0x01, 0xc0, 0xab,
+ 0x00, 0x02, 0x00, 0x01, 0x12, 0xff, 0xdd, 0x02, 0x37, 0x43, 0x00, 0xdc,
+ 0x10, 0x03, 0xbf, 0x00,
+ 0x10, 0xfe, 0xdd, 0xfe, 0x03, 0xf0, 0xd0, 0x36, 0x00, 0xf1, 0x74, 0x43,
+ 0x31, 0x0f, 0x00, 0x25,
+ 0x23, 0x53, 0x75, 0x32, 0x22, 0x21, 0x36, 0x22, 0x00, 0x64, 0x01, 0x0f,
+ 0x53, 0x13, 0x10, 0x02,
+ 0x14, 0x00, 0xfb, 0x1e, 0x63, 0x13, 0x0d, 0x0c, 0x1f, 0x00, 0x0e, 0x2d,
+ 0x2e, 0x4d, 0x2d, 0x3d,
+ 0x1e, 0x00, 0xc0, 0xee, 0x17, 0x06, 0xc1, 0x12, 0x23, 0xd2, 0xa2, 0x05,
+ 0x04, 0xd1, 0xd0, 0x02,
+ 0x35, 0x43, 0x11, 0x00, 0x31, 0x53, 0x13, 0x24, 0x34, 0x53, 0x34, 0x32,
+ 0x23, 0x04, 0x03, 0x14,
+ 0xf4, 0xe3, 0xd3, 0x81, 0xe1, 0xd3, 0xb2, 0xd0, 0xce, 0xce, 0xce, 0xed,
+ 0xfd, 0x0e, 0xff, 0x01,
+ 0x15, 0x0e, 0x0a, 0xfd, 0xfb, 0x2f, 0x1d, 0x3c, 0x0e, 0xdc, 0x0e, 0x40,
+ 0xae, 0x88, 0x20, 0x30,
+ 0xff, 0xff, 0x2e, 0x30, 0x12, 0x12, 0x62, 0x21, 0x20, 0x0d, 0x50, 0x47,
+ 0x00, 0x0e, 0x32, 0x11,
+ 0x0f, 0x21, 0x11, 0x30, 0x1d, 0x0b, 0x0e, 0xee, 0xd0, 0xce, 0x0c, 0x2e,
+ 0x20, 0xfe, 0xf0, 0xde,
+ 0x34, 0x44, 0xf0, 0x77, 0x63, 0xdc, 0x01, 0x47, 0x32, 0x00, 0x01, 0x02,
+ 0x12, 0x02, 0x12, 0x02,
+ 0xf2, 0xe2, 0x03, 0x27, 0xd1, 0xa1, 0x01, 0x02, 0x02, 0x80, 0xe1, 0xf2,
+ 0xe1, 0xe1, 0xe2, 0xe1,
+ 0xdc, 0xeb, 0xce, 0xdf, 0x10, 0x40, 0xed, 0xbc, 0xec, 0x0d, 0x00, 0xc0,
+ 0xee, 0xca, 0xad, 0xcc,
+ 0xde, 0xcd, 0xfc, 0x0f, 0xfe, 0xdb, 0xed, 0x20, 0x2e, 0xfc, 0xec, 0xec,
+ 0xdd, 0xfc, 0x4e, 0x5e,
+ 0x0c, 0x0d, 0x1f, 0x40, 0x0d, 0xfc, 0x0e, 0x4f, 0x0f, 0xbd, 0xde, 0xed,
+ 0xdc, 0x89, 0xed, 0xfe,
+ 0xff, 0xcd, 0xdd, 0xdd, 0xef, 0xec, 0xcb, 0xee, 0x00, 0x0f, 0xab, 0xfe,
+ 0x00, 0x00, 0xcd, 0x00,
+ 0xcd, 0xff, 0x01, 0x00, 0x00, 0xee, 0xef, 0xae, 0xe0, 0xf1, 0xec, 0xef,
+ 0x15, 0x77, 0x03, 0xca,
+ 0x00, 0x23, 0x11, 0x00, 0x11, 0x12, 0x00, 0xff, 0x10, 0x22, 0x00, 0xef,
+ 0x00, 0x30, 0x0f, 0x0e,
+ 0x0e, 0x30, 0x11, 0xcf, 0x11, 0x50, 0x08, 0x0d, 0x20, 0x32, 0x12, 0x46,
+ 0x53, 0xf0, 0xd0, 0x02,
+ 0x33, 0x52, 0x01, 0x8f, 0xec, 0xdf, 0xd1, 0xd3, 0xaf, 0xd8, 0xd0, 0xf0,
+ 0xcf, 0xdd, 0xd0, 0xc2,
+ 0xd2, 0x00, 0xfe, 0xe8, 0xdc, 0xef, 0xf0, 0xcf, 0xdd, 0xfe, 0x0e, 0x10,
+ 0x54, 0x33, 0x21, 0x33,
+ 0x10, 0x2d, 0x51, 0x27, 0xd1, 0xe0, 0x36, 0x88, 0xf1, 0x75, 0xad, 0x00,
+ 0x00, 0x01, 0xf1, 0xab,
+ 0x00, 0x23, 0x00, 0xfe, 0xec, 0x00, 0x43, 0x00, 0xec, 0x10, 0x42, 0x11,
+ 0x0f, 0x00, 0x21, 0x11,
+ 0x11, 0x21, 0x24, 0x01, 0x00, 0x10, 0x1f, 0x63, 0x11, 0xe8, 0x40, 0x32,
+ 0xfd, 0xfc, 0x2e, 0x50,
+ 0x0e, 0x0c, 0x1f, 0x0f, 0xfe, 0xed, 0x0f, 0x73, 0x02, 0xef, 0xf0, 0xf0,
+ 0xff, 0x0e, 0x47, 0x12,
+ 0xee, 0x00, 0x01, 0x47, 0x44, 0x00, 0x22, 0x42, 0x21, 0x66, 0x02, 0x11,
+ 0x44, 0x02, 0x00, 0x02,
+ 0x56, 0x01, 0x02, 0x23, 0x01, 0x02, 0x03, 0x43, 0x24, 0xf1, 0xd0, 0xd0,
+ 0x00, 0x33, 0xf0, 0xe0,
+ 0x54, 0x11, 0x01, 0x01, 0x00, 0x41, 0x42, 0x43, 0x10, 0x0d, 0x0b, 0xfc,
+ 0x0e, 0xeb, 0xee, 0x20,
+ 0xed, 0xda, 0x1f, 0xaf, 0x8e, 0xed, 0x10, 0x64, 0x11, 0x00, 0x0c, 0x0e,
+ 0x00, 0x63, 0x24, 0x10,
+ 0x0e, 0x30, 0x53, 0x20, 0x1d, 0x29, 0x1e, 0x30, 0x1f, 0x0e, 0x00, 0x0e,
+ 0x0d, 0x0c, 0xef, 0xd0,
+ 0xa0, 0xe5, 0xf0, 0xfe, 0xeb, 0xbd, 0x02, 0x17, 0x03, 0xcf, 0x01, 0x47,
+ 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0xf2, 0xe2, 0x01, 0x00, 0x43, 0x77, 0x12, 0x32, 0x01, 0xd0, 0xf0,
+ 0x13, 0x34, 0x00, 0x0f,
+ 0x40, 0x73, 0x23, 0x00, 0xef, 0xec, 0x1f, 0x32, 0x23, 0xfe, 0x1d, 0x74,
+ 0x34, 0x26, 0x22, 0x10,
+ 0x10, 0x20, 0x0f, 0xcd, 0x13, 0xe1, 0xe1, 0x65, 0x20, 0x4f, 0x2b, 0x3e,
+ 0x40, 0x0e, 0x0d, 0x63,
+ 0x77, 0x04, 0xf8, 0x2f, 0x50, 0x01, 0x00, 0x0e, 0x00, 0xef, 0xee, 0x01,
+ 0x20, 0x1d, 0x09, 0x0e,
+ 0x21, 0xf1, 0x80, 0xef, 0xdf, 0xef, 0x00, 0xff, 0xfd, 0xfc, 0xcd, 0xdd,
+ 0xee, 0x02, 0xe0, 0xba,
+ 0x10, 0x0f, 0xde, 0x12, 0xf2, 0x05, 0x33, 0xa0, 0xd0, 0xd1, 0x8f, 0xf3,
+ 0x07, 0xf5, 0xf1, 0xe1,
+ 0x01, 0x03, 0xf1, 0xc0, 0xf3, 0x02, 0x10, 0x42, 0x00, 0xed, 0x0f, 0x10,
+ 0x2c, 0x72, 0x2f, 0xf8,
+ 0x0e, 0x00, 0x0f, 0x22, 0x02, 0xcb, 0x3e, 0x70, 0x20, 0x30, 0x22, 0x22,
+ 0x10, 0x0c, 0x0a, 0x30,
+ 0x10, 0x01, 0x65, 0x00, 0xef, 0x20, 0x2f, 0x0d, 0x0f, 0xbf, 0x02, 0xe0,
+ 0x0d, 0x3c, 0x1b, 0x50,
+ 0xfe, 0x0e, 0x77, 0x00, 0x0c, 0x0e, 0x20, 0x01, 0x02, 0xf0, 0x32, 0x11,
+ 0xef, 0xef, 0xd2, 0x91,
+ 0xf1, 0x11, 0x74, 0x11, 0x0d, 0x05, 0x26, 0x12, 0x32, 0x0f, 0xf0, 0x04,
+ 0xd2, 0xc2, 0xe3, 0xe1,
+ 0xf0, 0x80, 0x92, 0xe4, 0xd5, 0x01, 0xe0, 0xde, 0xc0, 0xd1, 0xd3, 0xf2,
+ 0xfd, 0x08, 0x2e, 0x51,
+ 0x25, 0x11, 0x20, 0x40, 0x2c, 0x1c, 0x4f, 0x3f, 0x2e, 0x1d, 0x05, 0x05,
+ 0x20, 0x00, 0x1d, 0x00,
+ 0xa3, 0x0c, 0x2a, 0x12, 0x69, 0x0d, 0x11, 0x14, 0x8d, 0x02, 0xeb, 0x08,
+ 0x71, 0x02, 0xbb, 0xff,
+ 0x34, 0x3f, 0x2b, 0x11, 0x03, 0xd0, 0xce, 0x10, 0x21, 0x35, 0xab, 0xda,
+ 0x74, 0x10, 0xcc, 0x02,
+ 0x11, 0x00, 0xfd, 0xfe, 0x43, 0x02, 0xdd, 0xed, 0x02, 0x22, 0xfe, 0xdb,
+ 0x34, 0x11, 0xbf, 0x0f,
+ 0xec, 0x00, 0x73, 0xff, 0xdc, 0x12, 0xfe, 0xec, 0x23, 0x40, 0xda, 0xaf,
+ 0x00, 0x12, 0xfb, 0xf0,
+ 0x00, 0xd0, 0xe0, 0xf0, 0x10, 0x1f, 0xdb, 0xe0, 0xc0, 0xd0, 0x00, 0xdd,
+ 0x1c, 0x60, 0xf2, 0xbc,
+ 0xf0, 0x00, 0xbc, 0x00, 0x47, 0xff, 0xac, 0x01, 0x01, 0xe0, 0xec, 0xf0,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0e, 0x0d, 0x00, 0x10, 0x2f, 0x30, 0x51, 0xfc, 0x0d, 0x03, 0xff, 0xdb,
+ 0x02, 0xf1, 0xab, 0xdf,
+ 0x00, 0xdf, 0x00, 0x01, 0xfd, 0xe9, 0x20, 0x02, 0x8e, 0xdd, 0x60, 0x00,
+ 0x0e, 0x00, 0xf1, 0xfb,
+ 0xee, 0x44, 0x33, 0x00, 0xbc, 0x02, 0x03, 0xec, 0xfe, 0x02, 0xe1, 0xf1,
+ 0xf0, 0xed, 0x47, 0xe3,
+ 0x8d, 0xbf, 0x01, 0x04, 0x11, 0x00, 0x00, 0x0d, 0x00, 0x03, 0x05, 0x02,
+ 0xdc, 0xdc, 0x13, 0x55,
+ 0xfe, 0xce, 0xf0, 0xf3, 0x01, 0x1c, 0xfe, 0xce, 0xf6, 0xb3, 0xc1, 0x00,
+ 0xff, 0x0b, 0x00, 0x02,
+ 0xd0, 0xc0, 0xe0, 0x0f, 0xbf, 0xd8, 0x20, 0x30, 0x20, 0x10, 0x00, 0xe0,
+ 0xff, 0x0e, 0x7f, 0x2c,
+ 0xff, 0x00, 0x10, 0x20, 0xfd, 0xf3, 0xee, 0x5c, 0x5a, 0x0c, 0x00, 0x03,
+ 0x20, 0xf9, 0xf0, 0xf0,
+ 0x44, 0x00, 0x30, 0x73, 0x4d, 0xcd, 0x17, 0x01, 0xee, 0x01, 0x76, 0x0f,
+ 0xdd, 0x21, 0x54, 0x00,
+ 0xf0, 0xdd, 0xf0, 0x53, 0x00, 0x0f, 0x01, 0x35, 0x01, 0xbd, 0x10, 0x37,
+ 0xef, 0xcf, 0x10, 0x22,
+ 0x20, 0x11, 0xf0, 0xdf, 0x00, 0x01, 0xe2, 0xe1, 0xbd, 0x0d, 0x66, 0x00,
+ 0xdf, 0x00, 0x03, 0x35,
+ 0x1f, 0x0c, 0x73, 0x01, 0xde, 0x04, 0x1e, 0xec, 0x11, 0x10, 0x0e, 0x52,
+ 0xf1, 0xef, 0x20, 0x3d,
+ 0x3e, 0x02, 0x8a, 0xff, 0x15, 0x01, 0xfe, 0xff, 0xcf, 0xf4, 0x05, 0xbc,
+ 0xee, 0x00, 0x10, 0xf0,
+ 0xff, 0x0d, 0x70, 0x13, 0x0b, 0x00, 0x01, 0x00, 0x1e, 0x50, 0x0e, 0xec,
+ 0xef, 0xef, 0x00, 0x0e,
+ 0x40, 0x1f, 0xf8, 0xee, 0x22, 0xf0, 0xab, 0x10, 0x01, 0x0d, 0x0e, 0x0d,
+ 0x75, 0x11, 0xee, 0x15,
+ 0x0d, 0x99, 0x21, 0x33, 0x0f, 0xfe, 0x42, 0x10, 0xdd, 0x10, 0x51, 0x0e,
+ 0xff, 0x00, 0x00, 0xe1,
+ 0xe4, 0x0e, 0x09, 0x40, 0x32, 0xc1, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x31,
+ 0x0a, 0x40, 0x12, 0xc0,
+ 0xf0, 0xee, 0x20, 0x51, 0x10, 0x32, 0xe1, 0xad, 0x13, 0x13, 0xf6, 0x04,
+ 0x01, 0xee, 0xed, 0xc1,
+ 0x17, 0x13, 0xcf, 0xee, 0x02, 0x03, 0x10, 0x30, 0x73, 0x21, 0x33, 0x00,
+ 0x01, 0x47, 0x05, 0x00,
+ 0x63, 0x21, 0x0e, 0x00, 0xe0, 0x12, 0x22, 0xff, 0xbd, 0x10, 0x44, 0x30,
+ 0x06, 0x04, 0x10, 0x00,
+ 0xff, 0x00, 0x63, 0x53, 0x22, 0x21, 0x27, 0x32, 0x01, 0x0f, 0xde, 0x23,
+ 0x32, 0x41, 0x51, 0x30,
+ 0x33, 0xf0, 0xd0, 0x24, 0x31, 0x33, 0x00, 0xad, 0x04, 0x17, 0x21, 0x1f,
+ 0x34, 0x34, 0x42, 0x10,
+ 0x43, 0x41, 0x2e, 0x31, 0x02, 0xbd, 0x0f, 0x01, 0x05, 0xdf, 0xe4, 0x07,
+ 0x57, 0x00, 0xbf, 0x0f,
+ 0x01, 0x13, 0x34, 0xbf, 0xef, 0x50, 0x33, 0xe1, 0xd2, 0x31, 0x75, 0x11,
+ 0x00, 0x1f, 0x30, 0x44,
+ 0x02, 0x00, 0x17, 0x11, 0x00, 0xd0, 0x22, 0x21, 0xe1, 0xa1, 0x05, 0xf3,
+ 0xf0, 0xef, 0x41, 0x73,
+ 0x53, 0x02, 0xe2, 0x01, 0x01, 0x23, 0x1c, 0x09, 0x0f, 0x13, 0x47, 0x03,
+ 0xec, 0x0f, 0x20, 0x00,
+ 0x00, 0x01, 0x01, 0x00, 0xee, 0x0f, 0x71, 0x30, 0x5f, 0x0f, 0x04, 0xf4,
+ 0xff, 0x0d, 0x2f, 0x33,
+ 0x61, 0x2c, 0x20, 0x01, 0x13, 0x1b, 0x3d, 0x0d, 0x1c, 0x00, 0x53, 0xf2,
+ 0xbc, 0xeb, 0xdd, 0xed,
+ 0xf0, 0xf7, 0xa0, 0xfd, 0x01, 0x01, 0x00, 0x0f, 0xd0, 0xd1, 0xb0, 0xfb,
+ 0xec, 0x0d, 0x0f, 0x23,
+ 0x90, 0xdc, 0xd0, 0xe0, 0x0b, 0x00, 0x1f, 0xec, 0xd1, 0xc3, 0xd0, 0xe0,
+ 0x81, 0x00, 0xe0, 0x00,
+ 0x05, 0xe0, 0xe8, 0xee, 0xce, 0xf0, 0xf0, 0xbd, 0x0d, 0x12, 0x64, 0x00,
+ 0xe9, 0xcf, 0x0f, 0x10,
+ 0x1e, 0x30, 0x30, 0xec, 0xff, 0x11, 0x0e, 0x0d, 0x20, 0xdd, 0xd0, 0xef,
+ 0xdc, 0x2d, 0x78, 0x50,
+ 0x03, 0xe2, 0xfe, 0xfd, 0x1f, 0x52, 0x03, 0x00, 0x0e, 0x3e, 0x70, 0x2f,
+ 0xe8, 0x0f, 0x1f, 0x50,
+ 0x21, 0x0d, 0xdc, 0x00, 0x0e, 0x0b, 0xcf, 0xf0, 0xd3, 0x02, 0x53, 0x4f,
+ 0xf9, 0xbf, 0x00, 0xf0,
+ 0xfe, 0xff, 0x0e, 0xf0, 0x00, 0xd3, 0xe5, 0xac, 0xef, 0xe1, 0xee, 0xea,
+ 0xf2, 0xe2, 0x80, 0xd0,
+ 0x02, 0xe0, 0xef, 0xdd, 0xf7, 0xe1, 0xe2, 0xde, 0x8a, 0xee, 0xff, 0x00,
+ 0x50, 0x00, 0x0f, 0x02,
+ 0xe0, 0xf0, 0x0e, 0x08, 0xed, 0xb0, 0xf3, 0xe1, 0xdf, 0xca, 0xf0, 0xee,
+ 0x0f, 0x1f, 0xff, 0x90,
+ 0xf0, 0xeb, 0x0e, 0xee, 0x0c, 0x1f, 0x20, 0x0f, 0xbe, 0xfb, 0xf0, 0x00,
+ 0xee, 0xee, 0x10, 0x10,
+ 0xfe, 0x88, 0xff, 0x0f, 0x00, 0xf0, 0xef, 0xfe, 0x10, 0x0f, 0xcd, 0xff,
+ 0x01, 0x16, 0xe0, 0xf0,
+ 0x50, 0x62, 0x1e, 0x1d, 0x33, 0x02, 0xea, 0x10, 0x5f, 0x41, 0x21, 0xfb,
+ 0xff, 0x10, 0x12, 0xf5,
+ 0xe1, 0xce, 0xef, 0xe1, 0xc2, 0x02, 0x52, 0x2f, 0xde, 0xa0, 0xea, 0xef,
+ 0x01, 0x14, 0x10, 0x1c,
+ 0xf0, 0x00, 0x0d, 0x2c, 0x76, 0x00, 0xf0, 0x00, 0x21, 0x26, 0x00, 0xbf,
+ 0xd1, 0xf1, 0x00, 0x00,
+ 0xdc, 0xe0, 0x61, 0x30, 0x30, 0x11, 0x00, 0xce, 0xfe, 0x12, 0x10, 0x0c,
+ 0x21, 0x71, 0x24, 0x25,
+ 0x11, 0x00, 0x0a, 0x00, 0x44, 0x61, 0xf0, 0xdc, 0x0e, 0x1f, 0x01, 0x13,
+ 0x47, 0x42, 0x31, 0x00,
+ 0x1f, 0x22, 0x01, 0xd1, 0x07, 0x51, 0x31, 0x71, 0x33, 0x13, 0x15, 0x32,
+ 0x1f, 0x0e, 0x41, 0x32,
+ 0x30, 0x43, 0x06, 0xe0, 0x00, 0x45, 0xe0, 0x00, 0x41, 0x71, 0x33, 0x00,
+ 0x02, 0x04, 0x20, 0x0d,
+ 0x42, 0x43, 0x02, 0xf1, 0xe0, 0xf1, 0x13, 0x4d, 0x1e, 0xff, 0xf0, 0x17,
+ 0x37, 0x04, 0xd0, 0xd0,
+ 0x0f, 0x21, 0xd4, 0x90, 0xd1, 0x8e, 0xf0, 0x00, 0x0e, 0x40, 0x35, 0x10,
+ 0x10, 0x0d, 0xfe, 0x0f,
+ 0x0f, 0x46, 0x10, 0xcb, 0xde, 0xe0, 0xff, 0x01, 0x42, 0xe0, 0xb0, 0xe0,
+ 0x00, 0x10, 0x3c, 0x2f,
+ 0xff, 0xe4, 0xd2, 0xe2, 0x1c, 0x18, 0x70, 0x30, 0xa0, 0x02, 0x01, 0x01,
+ 0x00, 0x09, 0x00, 0x31,
+ 0x12, 0x20, 0x10, 0xea, 0xa0, 0xcf, 0xc0, 0x00, 0x31, 0x43, 0x0f, 0xeb,
+ 0xf0, 0x02, 0xcf, 0x00,
+ 0x23, 0x41, 0x7f, 0x51, 0x26, 0x10, 0x0e, 0x00, 0x22, 0x21, 0x0e, 0x1e,
+ 0x01, 0x37, 0x11, 0xfd,
+ 0x00, 0x12, 0x11, 0x10, 0x11, 0xf1, 0x22, 0x30, 0x02, 0x77, 0x77, 0xd0,
+ 0xce, 0x00, 0x00, 0x0f,
+ 0x3f, 0x40, 0x23, 0x25, 0x20, 0x00, 0x22, 0x05, 0xd0, 0x01, 0x22, 0x3f,
+ 0x1d, 0x11, 0x91, 0xe3,
+ 0xf5, 0x04, 0x41, 0x1f, 0x1e, 0x54, 0x03, 0xd0, 0xce, 0x01, 0x11, 0x63,
+ 0x47, 0x31, 0x10, 0x0f,
+ 0x00, 0x03, 0xf2, 0x0e, 0x51, 0x33, 0x22, 0x06, 0x05, 0xf1, 0xfe, 0x4f,
+ 0x50, 0xf0, 0xe1, 0x17,
+ 0x43, 0x00, 0xbf, 0x0f, 0x00, 0x53, 0x33, 0x27, 0x10, 0x50, 0x00, 0x0f,
+ 0x20, 0x30, 0x1d, 0xdf,
+ 0x26, 0x53, 0xef, 0xed, 0xf0, 0x31, 0x5e, 0x1f, 0xf0, 0xd5, 0x10, 0x53,
+ 0x4f, 0x0a, 0xf0, 0x30,
+ 0x01, 0xc0, 0xee, 0xff, 0x0f, 0xe0, 0xfc, 0x2f, 0x52, 0x05, 0x20, 0x40,
+ 0xf0, 0x82, 0xe7, 0xe1,
+ 0xe1, 0x0f, 0xee, 0xd0, 0xd0, 0xc1, 0xf4, 0x0f, 0x08, 0xd0, 0xaf, 0x00,
+ 0x11, 0x20, 0xfb, 0xae,
+ 0x00, 0xe1, 0x00, 0x20, 0xdf, 0xc9, 0xe0, 0x00, 0xd1, 0xad, 0xee, 0xdf,
+ 0x00, 0xe1, 0x0a, 0x0d,
+ 0xd0, 0x10, 0xef, 0x88, 0xdf, 0x00, 0x10, 0x1e, 0x00, 0x0e, 0xfc, 0xb0,
+ 0x00, 0xff, 0x1e, 0x0d,
+ 0xcd, 0x0e, 0x40, 0xec, 0xdb, 0x00, 0x00, 0x9a, 0xce, 0xf0, 0xef, 0xfe,
+ 0xe0, 0x10, 0x31, 0xeb,
+ 0xef, 0x0e, 0x0f, 0x3e, 0x62, 0x10, 0x2f, 0x1a, 0xff, 0xe0, 0xad, 0xfe,
+ 0x0f, 0x01, 0x00, 0xeb,
+ 0x30, 0x40, 0xa0, 0xff, 0xe5, 0xf1, 0xc0, 0xd0, 0x0d, 0x1f, 0xfe, 0xbd,
+ 0xf0, 0xe3, 0x01, 0xf8,
+ 0xef, 0x20, 0x03, 0xb2, 0xd0, 0xe0, 0xdb, 0xad, 0x01, 0x03, 0x01, 0x03,
+ 0xe2, 0xd0, 0xee, 0xdf,
+ 0xe4, 0xaf, 0xd8, 0xe1, 0x03, 0xd0, 0xae, 0x01, 0x04, 0x00, 0x1f, 0x1e,
+ 0x00, 0x12, 0xc0, 0xeb,
+ 0x0e, 0xea, 0xe0, 0x42, 0x40, 0x10, 0x0f, 0xef, 0x6f, 0x3d, 0x19, 0xfe,
+ 0xe1, 0xe3, 0xd0, 0x0d,
+ 0x5f, 0x20, 0x03, 0x03, 0x10, 0x7c, 0x50, 0x0b, 0x10, 0x02, 0x37, 0x55,
+ 0x2f, 0x1e, 0x0f, 0xf1,
+ 0x01, 0xf0, 0x01, 0x22, 0xfe, 0xd0, 0x04, 0x72, 0x71, 0x14, 0x05, 0x01,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x17, 0x40, 0x1f, 0x1f, 0x31, 0x16, 0x10, 0x22, 0x10, 0x22, 0x45, 0x01,
+ 0x00, 0xe1, 0xe2, 0x80,
+ 0xc2, 0xf3, 0xe0, 0x00, 0x10, 0x33, 0xc2, 0xb0, 0xf2, 0x02, 0x0f, 0x3d,
+ 0x35, 0x06, 0x01, 0x10,
+ 0x20, 0x01, 0x90, 0x00, 0x00, 0x0e, 0xf2, 0x05, 0x11, 0xfc, 0xbc, 0xdd,
+ 0x02, 0x07, 0xd0, 0xef,
+ 0x0d, 0x2f, 0x10, 0xbd, 0xdc, 0xf0, 0xbc, 0xef, 0x13, 0x43, 0x1f, 0x0b,
+ 0x20, 0x4f, 0x0d, 0xca,
+ 0x0f, 0x00, 0xef, 0xec, 0xfe, 0x0f, 0xae, 0xf0, 0xd5, 0x8f, 0xb8, 0xf0,
+ 0x1f, 0x10, 0x2f, 0x10,
+ 0x12, 0x00, 0x0e, 0x1f, 0x2e, 0x10, 0x50, 0x31, 0x10, 0x1e, 0xe8, 0x0f,
+ 0x1f, 0x40, 0x3f, 0x61,
+ 0x15, 0xe0, 0xd0, 0x00, 0x00, 0xfe, 0xde, 0x22, 0x74, 0x10, 0x00, 0xde,
+ 0xfa, 0x10, 0x4e, 0x2f,
+ 0xe0, 0xbd, 0x0f, 0xe3, 0x15, 0x2d, 0xfc, 0x02, 0x13, 0x23, 0x71, 0x0c,
+ 0xea, 0xc0, 0xdf, 0xf0,
+ 0xee, 0xfe, 0x00, 0x25, 0x12, 0x12, 0xfd, 0x1b, 0x70, 0x30, 0xf0, 0x00,
+ 0xfe, 0xf0, 0x00, 0x54,
+ 0x45, 0x10, 0x3c, 0x50, 0x31, 0x12, 0x2f, 0xfb, 0x00, 0x65, 0x11, 0x00,
+ 0x4e, 0x00, 0xf1, 0xe3,
+ 0x05, 0x10, 0x1f, 0x21, 0x74, 0x42, 0x30, 0x51, 0x46, 0x11, 0xf0, 0xd0,
+ 0x01, 0x01, 0x22, 0x31,
+ 0x20, 0x10, 0x47, 0x00, 0x00, 0x53, 0x42, 0x20, 0x32, 0x22, 0xf4, 0xe1,
+ 0x12, 0x31, 0x12, 0x13,
+ 0x52, 0x72, 0x45, 0x11, 0x10, 0x01, 0x25, 0x15, 0x23, 0x40, 0x10, 0x12,
+ 0x37, 0x02, 0xe0, 0xf0,
+ 0x14, 0x02, 0x9f, 0xf0, 0x01, 0x03, 0x11, 0x41, 0x14, 0xe0, 0xdd, 0x22,
+ 0x57, 0x01, 0x13, 0x71,
+ 0x20, 0x20, 0x01, 0x01, 0xc0, 0xf0, 0xee, 0xf2, 0x17, 0x47, 0x00, 0x2f,
+ 0x10, 0x02, 0xf1, 0x00,
+ 0x10, 0x72, 0x41, 0x21, 0x02, 0xf3, 0xd0, 0xf2, 0x01, 0x63, 0x32, 0x25,
+ 0x33, 0x43, 0x0f, 0x1e,
+ 0xfd, 0x0e, 0x57, 0x06, 0x0e, 0xe0, 0xa0, 0xde, 0xde, 0x0f, 0x0e, 0x00,
+ 0x00, 0x11, 0x07, 0x12,
+ 0x0f, 0xed, 0x20, 0x30, 0x11, 0x3d, 0x7d, 0x51, 0x33, 0x2e, 0x4a, 0x30,
+ 0x32, 0x22, 0x0f, 0x0f,
+ 0xee, 0xcf, 0x11, 0x33, 0x07, 0xf7, 0xbe, 0x2f, 0x70, 0x02, 0xdb, 0xdd,
+ 0x31, 0x22, 0xde, 0xca,
+ 0x00, 0x00, 0x00, 0xd2, 0x02, 0x21, 0x0b, 0x3f, 0x70, 0xdf, 0x8e, 0x0f,
+ 0xf2, 0x01, 0xed, 0xe9,
+ 0x00, 0xe0, 0x03, 0x1e, 0xed, 0xdf, 0xd0, 0xe0, 0xae, 0xe0, 0x00, 0x36,
+ 0x30, 0xcc, 0xc0, 0xe2,
+ 0xdf, 0xfe, 0x0d, 0x2b, 0x5d, 0x40, 0x10, 0x0e, 0xcb, 0xdb, 0xee, 0x0f,
+ 0xf2, 0xed, 0xdb, 0xef,
+ 0x8e, 0xde, 0x11, 0x74, 0x10, 0x11, 0x1f, 0x00, 0xff, 0xee, 0xfe, 0x03,
+ 0x27, 0xfe, 0xdd, 0x21,
+ 0x30, 0x50, 0x1e, 0xdf, 0xe0, 0xaa, 0x00, 0x00, 0x32, 0x02, 0xe0, 0x01,
+ 0x17, 0x0f, 0xcb, 0x00,
+ 0xd0, 0x00, 0x20, 0x2c, 0x70, 0x72, 0x00, 0x0d, 0xfe, 0xf3, 0xd4, 0xe2,
+ 0xc3, 0x11, 0x01, 0x01,
+ 0x8f, 0xf2, 0xd4, 0xeb, 0xcd, 0xf2, 0xf3, 0xf0, 0xd8, 0x00, 0xe4, 0xc0,
+ 0xcc, 0xdf, 0xff, 0x1d,
+ 0x2e, 0xe1, 0x93, 0xe2, 0xed, 0xe8, 0xe0, 0x00, 0x02, 0xb0, 0xee, 0x0f,
+ 0x0f, 0xdc, 0xfd, 0xfe,
+ 0xec, 0xc0, 0xc0, 0xcf, 0xee, 0xd8, 0xcc, 0xff, 0xee, 0x1e, 0x2c, 0x1f,
+ 0x61, 0x00, 0xcc, 0xfb,
+ 0xe0, 0x0d, 0xdd, 0xbc, 0xef, 0xed, 0xee, 0xfd, 0xee, 0xcb, 0xde, 0x0f,
+ 0x10, 0xdf, 0xbb, 0xde,
+ 0x00, 0xf0, 0xe0, 0x0a, 0x30, 0x60, 0x10, 0x00, 0x2c, 0x0f, 0x1e, 0x5f,
+ 0x20, 0x0f, 0x0d, 0x00,
+ 0x14, 0x03, 0x01, 0x01, 0x11, 0x0e, 0x5a, 0x71, 0x21, 0xe0, 0xd0, 0xe1,
+ 0xd0, 0xbc, 0x12, 0x57,
+ 0x11, 0x00, 0x0f, 0xf1, 0xf4, 0xd0, 0xe2, 0x11, 0x51, 0x11, 0x00, 0xc2,
+ 0xc2, 0xd0, 0x06, 0xd0,
+ 0xcb, 0x00, 0x10, 0x20, 0x02, 0x12, 0x10, 0x02, 0xe7, 0xe2, 0xa0, 0xf0,
+ 0x0f, 0x0e, 0x11, 0x11,
+ 0x44, 0x51, 0x5f, 0x4e, 0x31, 0x13, 0x0d, 0xf8, 0x0f, 0xef, 0xd0, 0x9b,
+ 0xfc, 0x0f, 0x20, 0x10,
+ 0x37, 0x40, 0x30, 0x20, 0xf0, 0xe0, 0x02, 0x13, 0x71, 0x52, 0x0e, 0x0d,
+ 0x03, 0x07, 0x31, 0x31,
+ 0x00, 0x31, 0x40, 0x74, 0x46, 0x01, 0xf0, 0xff, 0x01, 0x05, 0x01, 0x31,
+ 0x52, 0x21, 0x01, 0x01,
+ 0x03, 0x00, 0x3e, 0x50, 0x56, 0x23, 0x13, 0x04, 0x01, 0x10, 0x10, 0x23,
+ 0x27, 0x11, 0x02, 0x15,
+ 0x01, 0xf0, 0xb0, 0xe1, 0x03, 0xf1, 0xf3, 0xd0, 0xf2, 0xe2, 0x00, 0x73,
+ 0x64, 0x00, 0x03, 0x26,
+ 0x04, 0x02, 0xef, 0xf0, 0xe0, 0xf2, 0xef, 0xdd, 0x10, 0x76, 0x63, 0xff,
+ 0xfe, 0xf0, 0x01, 0x03,
+ 0x12, 0x0b, 0xda, 0xf0, 0x01, 0xc0, 0xec, 0x41, 0x62, 0x10, 0x0a, 0x11,
+ 0x01, 0x20, 0x0f, 0xfe,
+ 0xec, 0xde, 0x2f, 0x30, 0xfe, 0xbd, 0x00, 0x00, 0x0b, 0xff, 0x31, 0xb0,
+ 0xab, 0x00, 0xf0, 0x12,
+ 0xf1, 0x02, 0xee, 0x3e, 0x4b, 0x7f, 0x2e, 0xea, 0xee, 0xcd, 0x20, 0x40,
+ 0x0c, 0x2f, 0x31, 0x00,
+ 0x0f, 0x1f, 0x63, 0x05, 0x0d, 0xca, 0x0f, 0x30, 0x32, 0xf0, 0xdf, 0x20,
+ 0x32, 0xdd, 0xff, 0x54,
+ 0x42, 0x2c, 0x2f, 0x22, 0x07, 0xe2, 0x0e, 0x2d, 0x40, 0x76, 0x34, 0xf0,
+ 0xae, 0x0d, 0x00, 0x11,
+ 0x22, 0x03, 0x01, 0x55, 0x11, 0xff, 0xe0, 0x13, 0x36, 0xcf, 0xd0, 0x13,
+ 0x10, 0x0f, 0x4f, 0x64,
+ 0x12, 0xff, 0xff, 0x47, 0x45, 0x00, 0x1f, 0x20, 0x21, 0x00, 0x0e, 0xd1,
+ 0xd0, 0xb0, 0x0f, 0x72,
+ 0x12, 0x34, 0x04, 0xf3, 0x05, 0x1f, 0x0e, 0x0f, 0x04, 0x04, 0x11, 0x72,
+ 0x21, 0x00, 0xf0, 0x22,
+ 0x77, 0x00, 0x00, 0x01, 0x37, 0x00, 0xbe, 0x00, 0x31, 0x12, 0xff, 0xe0,
+ 0x32, 0x55, 0xf0, 0xfe,
+ 0x10, 0x0e, 0x0e, 0x63, 0x13, 0x00, 0x0e, 0x10, 0x10, 0x0b, 0x43, 0x03,
+ 0xfc, 0xdf, 0xe3, 0xd3,
+ 0xe0, 0xbd, 0xcf, 0xf2, 0x00, 0x22, 0xe2, 0xbe, 0x0f, 0x0f, 0xdb, 0xcd,
+ 0x17, 0x44, 0xdf, 0x9b,
+ 0xff, 0xf0, 0x02, 0xe0, 0xfb, 0x10, 0xec, 0xd0, 0x21, 0x32, 0x22, 0xc0,
+ 0x8c, 0xee, 0x01, 0x03,
+ 0x0c, 0xeb, 0xef, 0xce, 0x04, 0x22, 0x0d, 0xfd, 0x22, 0x43, 0x22, 0x00,
+ 0x0e, 0x03, 0xb8, 0xec,
+ 0x00, 0x73, 0x0b, 0xeb, 0x00, 0x31, 0xad, 0xeb, 0xf0, 0x12, 0x00, 0x00,
+ 0xc5, 0x00, 0x96, 0x00,
+ 0x38, 0xe6, 0x10, 0xbb, 0xcb, 0xeb, 0x49, 0xc0, 0xba, 0xff, 0xde, 0xbe,
+ 0xe0, 0xdd, 0xde, 0x0d,
+ 0x21, 0x32, 0x0c, 0x1e, 0x74, 0x30, 0x0b, 0x10, 0x42, 0x31, 0x10, 0x51,
+ 0x34, 0x1f, 0x0e, 0x37,
+ 0x67, 0x01, 0x00, 0x00, 0x14, 0x01, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf1,
+ 0xe3, 0xf3, 0xe2, 0x02,
+ 0x77, 0x34, 0x01, 0xc2, 0xf4, 0xe2, 0xc1, 0xd1, 0x02, 0x34, 0x11, 0x13,
+ 0x24, 0xe1, 0x80, 0xee,
+ 0xf1, 0xf4, 0xf1, 0xd0, 0xd2, 0xe4, 0xa0, 0xcf, 0xf0, 0x05, 0x00, 0x20,
+ 0x57, 0x12, 0x00, 0x10,
+ 0x20, 0x41, 0x0f, 0xed, 0xff, 0x31, 0x20, 0xc8, 0xee, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x10, 0xff, 0xcd,
+ 0x40, 0x42, 0xef, 0xcc, 0x31, 0x77, 0x40, 0x00, 0x0e, 0x62, 0x23, 0x0f,
+ 0x1e, 0x21, 0x34, 0x11,
+ 0x00, 0x13, 0x16, 0x00, 0xee, 0x10, 0x33, 0xe0, 0xdf, 0x02, 0x25, 0x11,
+ 0x00, 0x01, 0x20, 0x60,
+ 0x2c, 0x09, 0x0e, 0x3e, 0x2e, 0x10, 0x71, 0x21, 0x11, 0x03, 0x06, 0xc3,
+ 0xd5, 0xe3, 0xb3, 0xb1,
+ 0xb0, 0xe0, 0x04, 0x26, 0x01, 0xb0, 0xf2, 0xe1, 0xe1, 0xe1, 0xe2, 0xd0,
+ 0xdf, 0xcf, 0xd0, 0xe0,
+ 0xdf, 0xee, 0x1f, 0x2c, 0x4c, 0x4e, 0x2f, 0x1e, 0x30, 0x1e, 0xb8, 0xdf,
+ 0x0f, 0xfd, 0xfb, 0x50,
+ 0x1f, 0xb9, 0xcd, 0x0f, 0x31, 0x0f, 0xdd, 0x1e, 0x4f, 0x3f, 0x2c, 0x1c,
+ 0x4f, 0x7f, 0x0c, 0x0c,
+ 0x1d, 0x0c, 0x0d, 0xfd, 0x1e, 0x0e, 0xbc, 0xde, 0xce, 0xe0, 0x01, 0xff,
+ 0xfe, 0xef, 0xfd, 0xfe,
+ 0xff, 0x0f, 0x0c, 0x2e, 0x74, 0x60, 0x1a, 0x0d, 0x0c, 0x21, 0x41, 0x21,
+ 0x10, 0x3f, 0x31, 0x56,
+ 0x36, 0x00, 0xd0, 0x02, 0xf1, 0xd0, 0xff, 0x63, 0x13, 0xf0, 0xe0, 0x17,
+ 0x43, 0x00, 0xc0, 0x02,
+ 0x37, 0x12, 0x22, 0x12, 0xe1, 0x01, 0x74, 0x23, 0x11, 0x11, 0x32, 0x43,
+ 0xf0, 0xe0, 0x22, 0x34,
+ 0xe0, 0x8e, 0xe0, 0x05, 0xe0, 0xad, 0x00, 0x04, 0x02, 0xfe, 0x00, 0x26,
+ 0x00, 0xcc, 0x22, 0x77,
+ 0x00, 0xee, 0x10, 0x32, 0x00, 0xdb, 0x0f, 0x52, 0x21, 0xfe, 0xfc, 0x10,
+ 0x43, 0xff, 0xde, 0x25,
+ 0x65, 0xf0, 0xdf, 0x21, 0x44, 0x00, 0xff, 0x21, 0x22, 0x21, 0x12, 0x43,
+ 0x56, 0x00, 0x00, 0x32,
+ 0x55, 0x00, 0xf0, 0x11, 0x12, 0xef, 0x01, 0x35, 0xf0, 0xc0, 0xf1, 0xe0,
+ 0xe1, 0xdf, 0xed, 0x50,
+ 0x41, 0x0b, 0xfd, 0x41, 0x21, 0x0e, 0x0e, 0x43, 0x44, 0xfe, 0xda, 0xe0,
+ 0x13, 0x03, 0x8e, 0xf2,
+ 0x03, 0x00, 0xdd, 0x13, 0x14, 0xc9, 0xce, 0x13, 0x02, 0xbd, 0xdc, 0x00,
+ 0x22, 0x11, 0xec, 0x0f,
+ 0x10, 0x0e, 0x1f, 0x0f, 0x0f, 0x01, 0xbd, 0x12, 0x02, 0xda, 0xcd, 0x01,
+ 0x67, 0xff, 0xbc, 0xdc,
+ 0x10, 0x55, 0xff, 0xde, 0x00, 0x11, 0x00, 0x11, 0x21, 0xfe, 0xfe, 0x75,
+ 0x20, 0xeb, 0xfd, 0x10,
+ 0x51, 0x00, 0x0b, 0xff, 0x00, 0x10, 0xfe, 0xde, 0xef, 0xf0, 0xbe, 0xef,
+ 0x25, 0x00, 0x9b, 0xf0,
+ 0x12, 0xf0, 0xbb, 0xff, 0x0f, 0x10, 0x00, 0xec, 0xed, 0x21, 0x41, 0x0d,
+ 0xdb, 0x00, 0x42, 0x10,
+ 0xfe, 0x21, 0x20, 0xcd, 0x11, 0x44, 0xed, 0xdc, 0x32, 0x44, 0x0f, 0xdc,
+ 0xcd, 0x00, 0x0f, 0x00,
+ 0x13, 0x89, 0xbd, 0x03, 0x24, 0x0f, 0xed, 0xfe, 0x0f, 0x14, 0x11, 0xee,
+ 0xbb, 0x00, 0x00, 0xcd,
+ 0xee, 0x03, 0x01, 0xbb, 0xee, 0x00, 0xef, 0x00, 0xf0, 0xdc, 0x01, 0x12,
+ 0x89, 0xf0, 0x13, 0x01,
+ 0xee, 0x00, 0x11, 0xfd, 0x00, 0x31, 0xfd, 0xc8, 0x0f, 0x51, 0x21, 0xed,
+ 0xcc, 0x11, 0x00, 0xef,
+ 0x12, 0xee, 0xcd, 0x33, 0x31, 0xeb, 0x0f, 0x74, 0x01, 0x11, 0x54, 0x10,
+ 0x10, 0x32, 0x21, 0x53,
+ 0x13, 0x0e, 0x02, 0x37, 0x57, 0x02, 0xcf, 0xff, 0x47, 0x11, 0xcf, 0xee,
+ 0x01, 0x43, 0x0f, 0xfd,
+ 0x0f, 0x00, 0x40, 0x11, 0x0f, 0xfc, 0x21, 0x55, 0xff, 0xef, 0x00, 0x23,
+ 0x23, 0xf0, 0xf0, 0x01,
+ 0xf0, 0xad, 0xf2, 0x17, 0x16, 0xc0, 0xd0, 0x11, 0x13, 0xb0, 0xd0, 0xe0,
+ 0x03, 0x11, 0x01, 0xef,
+ 0xdd, 0x46, 0x43, 0xdf, 0xf0, 0x43, 0x00, 0x0f, 0x30, 0xfe, 0x00, 0x0f,
+ 0x88, 0xdd, 0x44, 0x00,
+ 0xdd, 0xff, 0x00, 0x03, 0x02, 0xff, 0x00, 0x54, 0x11, 0x31, 0x63, 0x31,
+ 0x35, 0x2f, 0x09, 0x20,
+ 0x61, 0x0d, 0xb8, 0x10, 0x31, 0xfe, 0xdc, 0x20, 0x31, 0xce, 0xdd, 0x00,
+ 0xfe, 0xef, 0x00, 0xde,
+ 0xcb, 0x0f, 0x10, 0x1f, 0x0e, 0xed, 0x40, 0x74, 0x0e, 0x0a, 0x00, 0x72,
+ 0x00, 0x0d, 0x00, 0x24,
+ 0x10, 0x0f, 0x00, 0x36, 0x00, 0xef, 0x31, 0x74, 0x00, 0x00, 0x03, 0x25,
+ 0x00, 0xc0, 0xf0, 0x03,
+ 0x03, 0xf0, 0x25, 0x12, 0xcf, 0x01, 0x77, 0x21, 0xdf, 0x00, 0x44, 0x22,
+ 0xe0, 0xc0, 0x00, 0x02,
+ 0xf1, 0xf0, 0xd0, 0xcf, 0xe0, 0x03, 0xf1, 0xad, 0xf0, 0x17, 0x02, 0xe0,
+ 0xf0, 0x35, 0x11, 0x8d,
+ 0x00, 0x35, 0x0f, 0xec, 0x10, 0x52, 0xff, 0xdb, 0x11, 0x42, 0x0f, 0xec,
+ 0x0e, 0x53, 0x21, 0xfd,
+ 0xfd, 0x01, 0x20, 0x0e, 0xfe, 0x10, 0x34, 0x20, 0xec, 0xfc, 0x61, 0x44,
+ 0x0f, 0x0d, 0x34, 0x43,
+ 0x10, 0x0e, 0x00, 0x77, 0x02, 0xf0, 0xf1, 0x04, 0x02, 0xd0, 0x11, 0x67,
+ 0x00, 0x00, 0xef, 0x10,
+ 0x34, 0x00, 0xfe, 0x0f, 0x52, 0xfe, 0x01, 0x35, 0xdf, 0x10, 0x32, 0x00,
+ 0x1f, 0x31, 0x01, 0xe1,
+ 0x8f, 0xe0, 0x07, 0xf2, 0xc0, 0xdf, 0xe0, 0x03, 0xd0, 0xbf, 0xef, 0xa8,
+ 0xee, 0x02, 0x23, 0x01,
+ 0xee, 0xdc, 0x00, 0x34, 0x00, 0x8a, 0xff, 0x22, 0x00, 0xed, 0x10, 0x11,
+ 0xed, 0xdd, 0xfe, 0xdd,
+ 0xef, 0xe0, 0xbb, 0xff, 0xed, 0xed, 0x20, 0x41, 0xfa, 0xbb, 0x40, 0x20,
+ 0x0f, 0x0d, 0x1e, 0x60,
+ 0x09, 0xed, 0x0e, 0x51, 0x0f, 0xea, 0xee, 0x10, 0x10, 0xce, 0xff, 0x00,
+ 0xcd, 0xee, 0xf0, 0xf0,
+ 0xbd, 0xff, 0xee, 0xd9, 0x10, 0x31, 0x00, 0x00, 0xef, 0x11, 0x20, 0xff,
+ 0x20, 0x74, 0x34, 0xdc,
+ 0xef, 0x76, 0x21, 0x00, 0x00, 0x10, 0x31, 0x43, 0x00, 0xca, 0xf0, 0x23,
+ 0x01, 0xcf, 0x00, 0x22,
+ 0x01, 0xef, 0xe0, 0x23, 0x46, 0x00, 0x00, 0x30, 0x76, 0x01, 0xe0, 0xf0,
+ 0x12, 0x01, 0xbe, 0xff,
+ 0x01, 0x00, 0xec, 0xbc, 0x01, 0x03, 0xe0, 0xae, 0x01, 0x07, 0xef, 0xef,
+ 0x02, 0x35, 0xf0, 0xbe,
+ 0x12, 0x13, 0x01, 0x00, 0x11, 0x20, 0x0f, 0x40, 0x40, 0xe8, 0x0f, 0x41,
+ 0xee, 0xff, 0x30, 0x40,
+ 0xfd, 0x00, 0x15, 0xf0, 0xbf, 0xff, 0x56, 0x21, 0xdc, 0x10, 0x73, 0x42,
+ 0x00, 0x10, 0x10, 0x24,
+ 0x22, 0x12, 0x14, 0x03, 0x03, 0xf6, 0xf3, 0xd1, 0xd1, 0x33, 0x44, 0xc0,
+ 0x00, 0x76, 0xf0, 0xde,
+ 0x00, 0x44, 0x00, 0x1f, 0x20, 0x00, 0x0e, 0x1f, 0x71, 0x11, 0x0d, 0xf8,
+ 0x10, 0x53, 0x00, 0x00,
+ 0xff, 0x0f, 0x01, 0x00, 0xdf, 0xe0, 0xf0, 0xf1, 0xbe, 0xed, 0xdd, 0x17,
+ 0x24, 0x9e, 0xef, 0xe0,
+ 0x02, 0x01, 0x23, 0x22, 0xfd, 0x0d, 0x0e, 0x1f, 0x43, 0x00, 0xe8, 0x20,
+ 0x41, 0x89, 0xee, 0x23,
+ 0x12, 0xcb, 0xe0, 0xf0, 0x14, 0x12, 0x00, 0x00, 0x51, 0x43, 0x00, 0x0c,
+ 0x00, 0x43, 0x1f, 0x2d,
+ 0x60, 0x08, 0x0d, 0x10, 0x40, 0x1f, 0x0c, 0xed, 0xfe, 0x21, 0x00, 0xca,
+ 0xdf, 0xdf, 0xdf, 0xef,
+ 0x0f, 0x0e, 0xdd, 0x0f, 0x5f, 0x0b, 0xed, 0x20, 0x52, 0x0f, 0xed, 0xdc,
+ 0x1f, 0x72, 0x43, 0x00,
+ 0x10, 0x33, 0x46, 0x20, 0x1e, 0x40, 0x22, 0x24, 0x0f, 0xed, 0x02, 0xf4,
+ 0xd0, 0xe1, 0x02, 0xff,
+ 0x0f, 0x12, 0xf1, 0x17, 0x57, 0xc1, 0xa0, 0x04, 0x23, 0x00, 0xf0, 0xc0,
+ 0xce, 0x25, 0x22, 0x9d,
+ 0xf0, 0x04, 0xf0, 0xcf, 0xf0, 0x16, 0xf1, 0xcf, 0xcf, 0xf1, 0x06, 0xe1,
+ 0xe1, 0x02, 0x23, 0xf1,
+ 0xcf, 0x02, 0x04, 0xbd, 0xdb, 0x11, 0x31, 0xee, 0xce, 0x20, 0x33, 0xfe,
+ 0xed, 0x10, 0x10, 0xcd,
+ 0xe0, 0xe3, 0x8e, 0xec, 0xef, 0xdd, 0x00, 0x20, 0x2a, 0x4e, 0x3d, 0x2c,
+ 0x2c, 0x3e, 0x3e, 0x73,
+ 0x22, 0x0d, 0x00, 0x57, 0x02, 0x00, 0x03, 0x12, 0x0f, 0x01, 0x27, 0x12,
+ 0x00, 0x10, 0x61, 0x00,
+ 0x0e, 0x00, 0x20, 0xf9, 0xcc, 0x50, 0x31, 0x1e, 0x1e, 0x51, 0x33, 0x0d,
+ 0xe8, 0x10, 0x73, 0x00,
+ 0xdd, 0xee, 0x0f, 0x00, 0xff, 0xcd, 0xe0, 0x06, 0xe1, 0x90, 0xf0, 0xf1,
+ 0xf4, 0xe1, 0xd0, 0xf0,
+ 0x07, 0xf2, 0xc1, 0xe2, 0x03, 0x22, 0x00, 0xd0, 0xee, 0xf0, 0xe1, 0xc0,
+ 0xed, 0x88, 0xdc, 0xd0,
+ 0xf0, 0xde, 0xce, 0xe0, 0x02, 0xf2, 0xee, 0x0e, 0x0d, 0xfa, 0x1f, 0x20,
+ 0xdb, 0x0d, 0x70, 0x7f,
+ 0x2b, 0x1c, 0x4e, 0x2f, 0x1c, 0x0d, 0x0d, 0x0f, 0x0d, 0xca, 0xee, 0xef,
+ 0xed, 0xde, 0xad, 0xec,
+ 0xee, 0xfe, 0x0e, 0xfc, 0xee, 0xed, 0xee, 0xfe, 0xed, 0xfd, 0xff, 0xdd,
+ 0x4f, 0x60, 0x20, 0x64,
+ 0x2e, 0x18, 0x30, 0x30, 0x11, 0x22, 0x21, 0x0f, 0x20, 0x20, 0x00, 0xed,
+ 0x00, 0xc0, 0x8c, 0x04,
+ 0x05, 0x01, 0x03, 0x16, 0x32, 0xf0, 0xc0, 0xe1, 0xe1, 0xe3, 0x14, 0x63,
+ 0x00, 0x02, 0x07, 0xf2,
+ 0xc1, 0xe1, 0x02, 0x00, 0xdf, 0xf0, 0x27, 0x15, 0xf1, 0x02, 0xf1, 0xb1,
+ 0xf1, 0x34, 0xf2, 0x80,
+ 0xd0, 0xf2, 0xf1, 0xd0, 0xde, 0x30, 0x72, 0x30, 0x09, 0x0e, 0x40, 0x30,
+ 0x0e, 0xdb, 0xce, 0xf0,
+ 0x01, 0xe0, 0xef, 0x0f, 0x1f, 0x1f, 0x0b, 0xfe, 0x70, 0x73, 0x41, 0x10,
+ 0x20, 0x34, 0x33, 0x24,
+ 0x26, 0x43, 0x23, 0x13, 0x47, 0x44, 0x22, 0x13, 0x22, 0x33, 0x43, 0x25,
+ 0x12, 0x02, 0x02, 0x33,
+ 0x33, 0x31, 0x42, 0x73, 0x24, 0x10, 0x10, 0x22, 0x21, 0x21, 0x33, 0x32,
+ 0x1f, 0x30, 0x32, 0x00,
+ 0xf1, 0xf5, 0xf4, 0x02, 0xf1, 0xcf, 0xa1, 0xd7, 0xb3, 0xc1, 0xb0, 0xef,
+ 0xf2, 0xe3, 0xf0, 0xf3,
+ 0xf5, 0x04, 0x14, 0x32, 0x42, 0x51, 0x31, 0x1f, 0x0b, 0x0e, 0x0e, 0xfd,
+ 0xed, 0x0f, 0x31, 0x5f,
+ 0xf8, 0xbd, 0xee, 0xf0, 0xf2, 0xd0, 0xaf, 0xf0, 0x02, 0x00, 0x01, 0x14,
+ 0x30, 0x61, 0x43, 0x30,
+ 0x18, 0x2d, 0x5e, 0x2e, 0x2b, 0x2f, 0x30, 0x10, 0x0d, 0xeb, 0xfe, 0x00,
+ 0x10, 0x20, 0x50, 0x1d,
+ 0x1f, 0xf3, 0xe2, 0xe1, 0xc2, 0xe2, 0xd0, 0xc8, 0xdc, 0x00, 0x24, 0xf0,
+ 0xcc, 0x1f, 0x71, 0x72,
+ 0x12, 0x11, 0x11, 0x10, 0x0f, 0x0c, 0xea, 0xff, 0x0f, 0xfd, 0xee, 0xff,
+ 0xde, 0xde, 0xf0, 0xe0,
+ 0xac, 0x0d, 0x30, 0x13, 0xf5, 0xe2, 0xe0, 0xff, 0x20, 0x53, 0x26, 0x01,
+ 0x13, 0x67, 0x00, 0xad,
+ 0xdb, 0xde, 0xd0, 0xc0, 0xef, 0xee, 0x0f, 0xef, 0xde, 0xcd, 0xbc, 0xce,
+ 0xdf, 0xcf, 0xdd, 0xee,
+ 0xf0, 0xdd, 0xd8, 0x0d, 0xec, 0xeb, 0x0f, 0x0d, 0xed, 0xde, 0x1f, 0x0d,
+ 0xee, 0xad, 0xdf, 0xe1,
+ 0x9f, 0xa8, 0xee, 0xf0, 0x00, 0xee, 0xfc, 0x10, 0x20, 0x2f, 0x1f, 0x00,
+ 0x0f, 0x2f, 0x20, 0x1d,
+ 0x3c, 0x7e, 0x40, 0x37, 0x25, 0x34, 0x52, 0x11, 0x22, 0x23, 0x22, 0x12,
+ 0x25, 0x23, 0x22, 0x02,
+ 0x32, 0x73, 0x00, 0x1f, 0x1e, 0x20, 0x25, 0x23, 0x31, 0x61, 0x30, 0x2d,
+ 0x3d, 0x43, 0x15, 0x00,
+ 0x10, 0x10, 0x10, 0x00, 0xcf, 0xef, 0xc4, 0x91, 0xce, 0xd0, 0xd3, 0xc0,
+ 0xde, 0xd7, 0xf7, 0xf4,
+ 0xf1, 0xf2, 0x03, 0xb0, 0xd0, 0xf0, 0x02, 0x0f, 0xdb, 0xde, 0xff, 0xde,
+ 0x8b, 0xfe, 0xef, 0xdd,
+ 0xca, 0xdf, 0xd0, 0xc0, 0xd0, 0xae, 0xe0, 0xd0, 0xd0, 0xdd, 0xfa, 0x0c,
+ 0x1c, 0x2e, 0x2e, 0x0d,
+ 0x0f, 0x2f, 0x4e, 0x3e, 0x0d, 0x1b, 0x60, 0x30, 0x0c, 0xdb, 0x0e, 0x0e,
+ 0x3f, 0x1e, 0xfc, 0xee,
+ 0xef, 0x8c, 0xba, 0xed, 0xed, 0xed, 0xbb, 0xee, 0xfe, 0x0e, 0xfd, 0xfd,
+ 0x0e, 0x1d, 0x2d, 0x4e,
+ 0x5f, 0x3f, 0x2b, 0x2d, 0x3f, 0x3d, 0x1b, 0x1e, 0x3f, 0x50, 0x1d, 0x1c,
+ 0x1e, 0x00, 0xe0, 0xb0,
+ 0xf3, 0xf2, 0x03, 0x67, 0x24, 0x22, 0x12, 0x12, 0x12, 0x43, 0x35, 0x13,
+ 0x02, 0x04, 0x12, 0x34,
+ 0x53, 0x12, 0x22, 0x43, 0x23, 0x02, 0xe6, 0x05, 0x03, 0xb2, 0xc2, 0xd3,
+ 0xc4, 0xb3, 0xe3, 0xe4,
+ 0xc1, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf3, 0xb1, 0xc0,
+ 0xd0, 0xba, 0xeb, 0xed,
+ 0x0f, 0xff, 0xcd, 0xec, 0x00, 0x0f, 0x1c, 0x4d, 0x3e, 0x3f, 0x1b, 0x2d,
+ 0x50, 0x4f, 0x3e, 0x3d,
+ 0x60, 0x31, 0x20, 0x2e, 0x31, 0x24, 0x27, 0x34, 0x31, 0x32, 0x33, 0x23,
+ 0x13, 0x03, 0x04, 0x34,
+ 0x31, 0x62, 0x22, 0x10, 0x0f, 0x22, 0x67, 0x20, 0x10, 0x41, 0x43, 0x21,
+ 0x30, 0x61, 0x30, 0x30,
+ 0x23, 0x37, 0x27, 0x01, 0x01, 0xf2, 0xe2, 0xc0, 0xb2, 0xd4, 0xd3, 0xc3,
+ 0xe3, 0xe4, 0xd1, 0xe2,
+ 0x06, 0x43, 0x22, 0x02, 0xb3, 0xd3, 0xd2, 0xe1, 0x00, 0x41, 0x43, 0x00,
+ 0x0f, 0xff, 0xcd, 0xcd,
+ 0xc1, 0xc3, 0xc7, 0xe5, 0xe4, 0xd2, 0xc0, 0xcd, 0xfd, 0xfc, 0xfe, 0x10,
+ 0x53, 0x20, 0x2d, 0x2c,
+ 0x3d, 0x30, 0x30, 0x2a, 0x3b, 0x5d, 0x5e, 0x2c, 0x3d, 0x2f, 0x2e, 0x2d,
+ 0x4e, 0x2c, 0x1c, 0x2c,
+ 0x0d, 0xfa, 0xbe, 0xed, 0xbd, 0xdd, 0xfd, 0xed, 0xeb, 0xcd, 0xff, 0x1f,
+ 0x0e, 0x0e, 0xff, 0x00,
+ 0x20, 0x30, 0x73, 0x43, 0x20, 0x2e, 0x30, 0x31, 0x22, 0x11, 0x11, 0x15,
+ 0x37, 0x33, 0x02, 0x23,
+ 0x52, 0x11, 0x11, 0x05, 0x26, 0x33, 0x12, 0xf2, 0xd2, 0x53, 0x76, 0x22,
+ 0x02, 0xf2, 0xf1, 0x23,
+ 0x43, 0x22, 0x51, 0x31, 0x32, 0x23, 0xe3, 0xb1, 0xe6, 0xc4, 0xc2, 0xc2,
+ 0xe3, 0xd2, 0xc0, 0xde,
+ 0x04, 0x16, 0x10, 0x20, 0x41, 0x20, 0x1f, 0x1e, 0x10, 0x24, 0x00, 0xde,
+ 0xbc, 0xce, 0xd0, 0xd0,
+ 0xcf, 0xce, 0xe1, 0x05, 0xe0, 0xfd, 0x0d, 0x6f, 0x1c, 0x18, 0x1d, 0x3d,
+ 0x4e, 0x4f, 0x3e, 0x4f,
+ 0x40, 0x30, 0x32, 0x43, 0x37, 0x44, 0x13, 0x02, 0x13, 0x15, 0x23, 0x23,
+ 0x53, 0x33, 0x21, 0x03,
+ 0xf5, 0xf2, 0xd1, 0xe2, 0xf2, 0x00, 0x23, 0x17, 0x01, 0x12, 0x73, 0x42,
+ 0x21, 0x21, 0x64, 0x33,
+ 0x20, 0x00, 0x0d, 0xdc, 0xcd, 0xff, 0xef, 0xd0, 0xb0, 0xdc, 0xbb, 0xdd,
+ 0xd0, 0xc0, 0xee, 0xc0,
+ 0xd5, 0xc4, 0xd1, 0xf2, 0xf0, 0xee, 0xda, 0xec, 0xfe, 0x0d, 0x1b, 0x0d,
+ 0xdd, 0xcd, 0xee, 0xbf,
+ 0xad, 0xcb, 0xcd, 0xdd, 0xde, 0xef, 0xcc, 0xdc, 0xce, 0xf0, 0xf0, 0xf0,
+ 0x01, 0x02, 0x21, 0x1d,
+ 0x1d, 0x3c, 0x3a, 0x4d, 0x3e, 0x71, 0x32, 0x51, 0x21, 0x20, 0x2b, 0x2e,
+ 0x20, 0x0c, 0xfc, 0xed,
+ 0xec, 0xdc, 0xdc, 0xcd, 0xca, 0xde, 0xdd, 0xdd, 0xcc, 0xde, 0xad, 0xed,
+ 0xee, 0x0e, 0x1d, 0x4e,
+ 0x2e, 0x2e, 0x2e, 0x0e, 0x0c, 0x3e, 0x5e, 0x3f, 0x4d, 0x1d, 0x1e, 0x20,
+ 0x0c, 0xfb, 0x0e, 0x4e,
+ 0x4d, 0x31, 0x45, 0x33, 0x25, 0x13, 0x04, 0x03, 0x03, 0x13, 0x13, 0x22,
+ 0x64, 0x22, 0x22, 0x72,
+ 0x43, 0x20, 0x2f, 0x1e, 0x01, 0x05, 0xd1, 0xa5, 0xe7, 0xd3, 0xb2, 0xd2,
+ 0xd2, 0xd5, 0xd1, 0xb2,
+ 0xe2, 0xf3, 0x06, 0xf2, 0xf1, 0x03, 0x02, 0xf0, 0x01, 0x03, 0x04, 0xd2,
+ 0xc5, 0xb1, 0xc0, 0xf0,
+ 0x03, 0x03, 0xf2, 0xbe, 0xf0, 0xd0, 0xa8, 0xee, 0xff, 0x0f, 0x0d, 0x0d,
+ 0x1e, 0x1e, 0x10, 0x20,
+ 0x2d, 0x1c, 0x2d, 0x61, 0x25, 0x34, 0x34, 0x33, 0x33, 0x23, 0x05, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xec, 0xee, 0x12, 0x04, 0xcc, 0xec, 0x0c, 0x02, 0x0b, 0xdf, 0xcc, 0xbd,
+ 0x34, 0xa8, 0x8d, 0xf1,
+ 0x27, 0x34, 0x1c, 0x30, 0x40, 0x0f, 0xef, 0x30, 0x53, 0x0f, 0x2c, 0x20,
+ 0x12, 0xf0, 0xff, 0x1c,
+ 0x1f, 0x20, 0x20, 0x20, 0x44, 0x20, 0xe2, 0x80, 0xde, 0x05, 0xe2, 0xe0,
+ 0x03, 0x76, 0x1e, 0x09,
+ 0xd0, 0x23, 0x10, 0x0e, 0x31, 0x63, 0x0e, 0x0e, 0xd0, 0x00, 0x0f, 0xf0,
+ 0xb0, 0xdf, 0xc0, 0x07,
+ 0x07, 0xdf, 0xad, 0x00, 0x11, 0xdf, 0xbe, 0x00, 0xf0, 0xdc, 0xd2, 0x16,
+ 0x0e, 0x0f, 0x10, 0x71,
+ 0x1f, 0x0e, 0xdf, 0xe2, 0xf3, 0x20, 0x2c, 0x1e, 0x42, 0xe0, 0xba, 0xfe,
+ 0xe0, 0xd1, 0xbf, 0x00,
+ 0xe0, 0xfb, 0xbd, 0x02, 0x06, 0xd1, 0xf1, 0xe0, 0x0f, 0x00, 0xee, 0x9d,
+ 0x04, 0x27, 0x14, 0xee,
+ 0xad, 0xff, 0x01, 0x10, 0x02, 0xf0, 0xce, 0x1f, 0x41, 0x03, 0x00, 0x05,
+ 0x35, 0xe0, 0xcd, 0x00,
+ 0x02, 0xbf, 0xe0, 0x05, 0x11, 0xce, 0x0e, 0x32, 0x31, 0x0d, 0x10, 0x12,
+ 0xed, 0xae, 0x03, 0x0f,
+ 0xf8, 0x0f, 0xbf, 0xf4, 0xb3, 0xd0, 0xc3, 0xde, 0x00, 0x02, 0x1f, 0x77,
+ 0x05, 0xe0, 0xdb, 0xf0,
+ 0x00, 0x0f, 0x00, 0x12, 0xf0, 0xff, 0xf0, 0xd0, 0xd1, 0xcf, 0xbc, 0xef,
+ 0xbd, 0xfe, 0x0c, 0xe0,
+ 0xf7, 0xae, 0xeb, 0x01, 0x01, 0x00, 0x0e, 0x00, 0x10, 0x00, 0xbc, 0xe0,
+ 0x14, 0x04, 0x00, 0x13,
+ 0x72, 0x1f, 0x0c, 0x22, 0x04, 0x00, 0xee, 0x00, 0x13, 0x02, 0xef, 0x07,
+ 0x04, 0x0f, 0xeb, 0x30,
+ 0x70, 0x61, 0x12, 0x42, 0x3f, 0x0c, 0x21, 0x53, 0x11, 0x2d, 0x3f, 0x6e,
+ 0x2f, 0x3d, 0x09, 0x1e,
+ 0x20, 0x24, 0x32, 0x10, 0x2d, 0xec, 0xd0, 0xf4, 0x14, 0xed, 0x9b, 0xf0,
+ 0x20, 0x36, 0x20, 0x40,
+ 0x20, 0x4f, 0x40, 0x0e, 0x1f, 0x00, 0x10, 0x11, 0xde, 0x9e, 0xf2, 0xff,
+ 0x0e, 0x60, 0x22, 0xe0,
+ 0xcb, 0xf1, 0xf4, 0x02, 0x3f, 0xfc, 0xf0, 0x34, 0x1f, 0x0f, 0xef, 0xff,
+ 0x11, 0x1f, 0x69, 0x2e,
+ 0x3d, 0x52, 0x56, 0x11, 0x20, 0x2f, 0x0f, 0x62, 0x10, 0x3c, 0x00, 0x1c,
+ 0x0e, 0x00, 0x10, 0xff,
+ 0xde, 0x05, 0x07, 0xe0, 0xbb, 0x00, 0x42, 0x70, 0x31, 0x15, 0x20, 0x00,
+ 0x2e, 0x3f, 0x43, 0x56,
+ 0x00, 0x0e, 0x0e, 0x40, 0x51, 0x21, 0x3f, 0x1e, 0x12, 0x14, 0x00, 0x00,
+ 0x3e, 0x0e, 0x0f, 0x21,
+ 0x01, 0xe0, 0xf4, 0x00, 0x00, 0x29, 0x7e, 0x70, 0x50, 0x0e, 0x37, 0x12,
+ 0x0c, 0xed, 0x0f, 0x22,
+ 0x04, 0xe0, 0x01, 0x47, 0x00, 0xed, 0xee, 0xf2, 0xd2, 0xef, 0x2f, 0x72,
+ 0x70, 0xfb, 0xfe, 0x0f,
+ 0x0f, 0x01, 0x02, 0x23, 0x1f, 0x1b, 0x0e, 0xe0, 0xdf, 0xbc, 0xdf, 0xff,
+ 0xbe, 0xe1, 0x07, 0x05,
+ 0x0e, 0xcb, 0x01, 0x00, 0xd0, 0xae, 0x0e, 0x04, 0xe2, 0xdf, 0xce, 0x04,
+ 0x05, 0x20, 0xfe, 0x20,
+ 0x61, 0x04, 0x00, 0xff, 0x10, 0x02, 0xe2, 0xb0, 0x00, 0xf0, 0xef, 0xfc,
+ 0xe0, 0xdd, 0xfd, 0x75,
+ 0x36, 0x03, 0x00, 0x6e, 0x02, 0x13, 0x32, 0x4e, 0x28, 0x0e, 0x2e, 0x61,
+ 0x02, 0x10, 0x2c, 0x51,
+ 0x31, 0x0e, 0x09, 0x00, 0x02, 0xe1, 0xc2, 0x00, 0xff, 0xf0, 0x00, 0x30,
+ 0x73, 0x15, 0x00, 0x00,
+ 0x0f, 0x1f, 0x60, 0x21, 0x1d, 0xfb, 0xf0, 0x24, 0x2f, 0xfa, 0xc0, 0x0f,
+ 0x10, 0x20, 0xf4, 0xb1,
+ 0xe0, 0xee, 0xde, 0x12, 0xe2, 0x8e, 0xec, 0x00, 0xe0, 0xe9, 0xef, 0x00,
+ 0x14, 0xf0, 0xd0, 0xee,
+ 0xed, 0x20, 0x70, 0x46, 0x01, 0xfe, 0xf0, 0x30, 0x0d, 0xf8, 0xff, 0x10,
+ 0x04, 0x81, 0xdf, 0xa0,
+ 0xee, 0xf0, 0x00, 0xf3, 0x01, 0x0f, 0xce, 0xf2, 0xd6, 0xd0, 0x0f, 0x1f,
+ 0x02, 0xc2, 0xcd, 0x08,
+ 0xce, 0x00, 0x10, 0x01, 0xaf, 0x0e, 0x45, 0x41, 0x0f, 0xd0, 0x02, 0xe0,
+ 0xed, 0xc0, 0xe7, 0xe3,
+ 0xff, 0xec, 0xc0, 0x01, 0x04, 0xd0, 0x00, 0x7f, 0x1f, 0x0e, 0x01, 0x27,
+ 0x33, 0xae, 0xec, 0x12,
+ 0x13, 0xcd, 0xdf, 0x02, 0x05, 0xe3, 0xf1, 0xfe, 0xee, 0x90, 0xfe, 0x16,
+ 0x43, 0x01, 0xee, 0x0c,
+ 0x10, 0x0d, 0x1f, 0x32, 0x14, 0x00, 0xe1, 0x80, 0xe0, 0xf0, 0xcf, 0xed,
+ 0xed, 0xda, 0xfc, 0xfe,
+ 0xf1, 0xbf, 0xeb, 0xde, 0xcc, 0xe0, 0xc1, 0xc0, 0xf7, 0xe2, 0xed, 0xec,
+ 0x1e, 0x00, 0x52, 0x15,
+ 0x00, 0xb1, 0x03, 0xe0, 0xfe, 0x31, 0x40, 0x0f, 0x0e, 0xf0, 0xf2, 0xe4,
+ 0xd0, 0x03, 0x72, 0x45,
+ 0x2e, 0x0b, 0x02, 0x04, 0x0f, 0xec, 0x30, 0x74, 0x4f, 0x19, 0x71, 0x21,
+ 0x0f, 0x0e, 0x4e, 0x10,
+ 0x00, 0x15, 0x10, 0x2f, 0x0f, 0xf0, 0xf3, 0x25, 0x12, 0x0e, 0x0d, 0x21,
+ 0x57, 0xff, 0x1e, 0x73,
+ 0x21, 0x00, 0x0f, 0x22, 0x30, 0x29, 0x2e, 0x2f, 0x00, 0x20, 0x23, 0x10,
+ 0x41, 0x10, 0x0d, 0x1d,
+ 0x10, 0xb4, 0x91, 0xe1, 0xe0, 0x09, 0x1e, 0xff, 0xd0, 0x03, 0x31, 0xd0,
+ 0xb0, 0xdd, 0xde, 0x03,
+ 0x12, 0x70, 0x60, 0x12, 0x2d, 0x19, 0x10, 0x02, 0x10, 0xf8, 0x0d, 0x01,
+ 0x10, 0x1e, 0x10, 0xef,
+ 0x88, 0xdd, 0x00, 0x05, 0x40, 0x51, 0x00, 0x11, 0x02, 0x00, 0xfd, 0xf0,
+ 0xe1, 0xe0, 0x0c, 0xf0,
+ 0x0f, 0x10, 0x51, 0x42, 0x31, 0x10, 0x30, 0x6f, 0x37, 0x37, 0x03, 0xdb,
+ 0x00, 0x00, 0xc4, 0x11,
+ 0x30, 0x0f, 0x31, 0x74, 0x30, 0xff, 0xfa, 0x20, 0x71, 0x44, 0x10, 0x0d,
+ 0x10, 0x00, 0x1e, 0x0f,
+ 0x52, 0x13, 0x0f, 0x00, 0x01, 0x02, 0xe2, 0xe6, 0x03, 0x0f, 0xfd, 0xe0,
+ 0x20, 0x78, 0x30, 0x10,
+ 0x22, 0x4f, 0x1b, 0x0e, 0x00, 0x21, 0x37, 0xd0, 0xef, 0x7f, 0x6f, 0x00,
+ 0x00, 0x0f, 0xe1, 0xe2,
+ 0xef, 0xac, 0xf0, 0x20, 0x22, 0xdb, 0xce, 0xec, 0xdf, 0xf0, 0x02, 0x14,
+ 0x30, 0x4d, 0x32, 0x57,
+ 0x23, 0x0f, 0xee, 0x00, 0x41, 0xff, 0xef, 0xf1, 0x02, 0x2f, 0x7f, 0x77,
+ 0x11, 0x0f, 0xdf, 0x03,
+ 0x16, 0x0f, 0x0b, 0x00, 0x31, 0x75, 0x20, 0x0f, 0x1e, 0x10, 0x6e, 0x22,
+ 0x21, 0x1e, 0x1f, 0x20,
+ 0x00, 0x1c, 0x00, 0x14, 0x10, 0x0d, 0x00, 0xd0, 0xa1, 0xf1, 0x14, 0x3f,
+ 0x03, 0x23, 0x2f, 0xfe,
+ 0xb1, 0xd3, 0x08, 0x3b, 0x20, 0xd0, 0xde, 0x71, 0x75, 0x00, 0xec, 0xf0,
+ 0xf1, 0xe2, 0xf2, 0x01,
+ 0x0a, 0xdf, 0x0e, 0xb1, 0xb0, 0xd1, 0xe0, 0xde, 0xbd, 0xf1, 0xf2, 0xed,
+ 0xde, 0xef, 0xe1, 0xe1,
+ 0xe5, 0x01, 0x0d, 0x00, 0x07, 0x23, 0x30, 0xaf, 0xbc, 0xd1, 0xd0, 0xe2,
+ 0x03, 0x01, 0xbc, 0xdb,
+ 0xe0, 0xff, 0x00, 0xde, 0xe4, 0xf7, 0xd7, 0xce, 0xaf, 0xce, 0xc0, 0xd1,
+ 0xf1, 0xcf, 0xef, 0xf0,
+ 0x0f, 0x10, 0xf0, 0x01, 0xfe, 0x0d, 0x0f, 0xbd, 0x01, 0xc7, 0xf3, 0xc5,
+ 0xe2, 0xbf, 0xfe, 0xf5,
+ 0xf0, 0xc0, 0xce, 0xe1, 0xe4, 0x00, 0x0c, 0x00, 0x00, 0xf2, 0x22, 0x22,
+ 0x1c, 0x2c, 0x60, 0x10,
+ 0xfc, 0x90, 0xf0, 0xe7, 0x04, 0xc2, 0xd0, 0xea, 0x00, 0x60, 0x11, 0x00,
+ 0xb0, 0xf0, 0xff, 0x0f,
+ 0x02, 0x21, 0xfe, 0xd0, 0xf0, 0x00, 0xe2, 0xe0, 0xce, 0xef, 0xf7, 0xb4,
+ 0xd0, 0xfe, 0x00, 0xbf,
+ 0xac, 0xef, 0xd0, 0xba, 0xed, 0xe2, 0x03, 0x0f, 0x0c, 0x00, 0x00, 0xc3,
+ 0x05, 0x00, 0x00, 0xee,
+ 0xe0, 0xfe, 0xdf, 0x06, 0xd4, 0xd0, 0xdf, 0xae, 0xef, 0x1f, 0x32, 0xc7,
+ 0x84, 0xed, 0xde, 0xf0,
+ 0xf2, 0xe0, 0xcf, 0xf0, 0x16, 0x4f, 0x0d, 0x02, 0x30, 0x3d, 0x50, 0x24,
+ 0x60, 0x2c, 0x1f, 0xf0,
+ 0xf2, 0x11, 0x3c, 0x0b, 0xed, 0x2e, 0x64, 0x25, 0x02, 0x0d, 0xcc, 0x01,
+ 0x04, 0x10, 0x0f, 0x40,
+ 0x10, 0x4f, 0x10, 0xfd, 0xad, 0x10, 0x46, 0x11, 0xfd, 0xfe, 0x41, 0x20,
+ 0xfd, 0x00, 0x07, 0x10,
+ 0x1f, 0x40, 0x36, 0x00, 0xe0, 0xa0, 0xdd, 0xd0, 0xa1, 0xee, 0xf0, 0x05,
+ 0xee, 0xbf, 0x00, 0x06,
+ 0x10, 0x1f, 0x30, 0x31, 0x02, 0xff, 0xf0, 0x00, 0xff, 0x0c, 0xef, 0x0e,
+ 0xde, 0xaa, 0x00, 0x02,
+ 0x72, 0x12, 0x0b, 0xfc, 0xdd, 0xcf, 0x00, 0x26, 0xc0, 0xb0, 0xd0, 0xed,
+ 0x00, 0x20, 0x02, 0xd1,
+ 0xf1, 0x00, 0x72, 0x1c, 0x1c, 0x0d, 0x10, 0x05, 0x07, 0x01, 0xf0, 0x0c,
+ 0x2f, 0x20, 0x62, 0x00,
+ 0xa0, 0x03, 0xf5, 0xf1, 0x0f, 0x2e, 0x70, 0x32, 0x10, 0x21, 0x0c, 0x1a,
+ 0x21, 0x23, 0x32, 0x1f,
+ 0x10, 0x20, 0x10, 0x0e, 0x4f, 0x0f, 0x15, 0xe3, 0xc2, 0xd0, 0x60, 0x64,
+ 0x0a, 0x1e, 0x10, 0x22,
+ 0xdf, 0xbc, 0x00, 0x01, 0x6d, 0x01, 0x15, 0x26, 0x12, 0x10, 0x0e, 0x1e,
+ 0x11, 0x02, 0xc0, 0xdc,
+ 0xf1, 0x06, 0xa0, 0xed, 0xeb, 0xe0, 0xf0, 0x51, 0x2f, 0xed, 0xd0, 0x13,
+ 0xed, 0x9e, 0x01, 0x35,
+ 0x50, 0x0f, 0xfd, 0x30, 0x21, 0x0e, 0xcd, 0x0d, 0x65, 0x15, 0x31, 0x00,
+ 0xfe, 0x00, 0x07, 0x01,
+ 0xe1, 0xef, 0x00, 0x61, 0x41, 0x33, 0x01, 0x1f, 0x3c, 0x30, 0x30, 0x74,
+ 0x1f, 0x4f, 0x44, 0x22,
+ 0x29, 0x1e, 0x2f, 0x22, 0x20, 0x21, 0x13, 0x33, 0x3f, 0x5f, 0x47, 0x23,
+ 0x0c, 0x5e, 0x21, 0x30,
+ 0x3d, 0x30, 0x45, 0x32, 0x1d, 0x18, 0x20, 0x10, 0x70, 0x30, 0x00, 0x01,
+ 0x20, 0x30, 0x10, 0x31,
+ 0x30, 0x6f, 0x0f, 0xfd, 0xcb, 0x00, 0xcd, 0xff, 0xec, 0xee, 0xcf, 0xf4,
+ 0x04, 0x43, 0x10, 0x1b,
+ 0x2f, 0x5f, 0x20, 0x37, 0x14, 0x0f, 0xec, 0x00, 0x60, 0x2f, 0x2f, 0x30,
+ 0x33, 0x1c, 0x1d, 0x5f,
+ 0x40, 0x40, 0x2f, 0x0f, 0xe1, 0xc1, 0xf2, 0x17, 0x02, 0x00, 0x01, 0x0d,
+ 0x1d, 0x71, 0x33, 0xff,
+ 0xdd, 0x22, 0x44, 0x11, 0x37, 0x50, 0x4e, 0x59, 0x10, 0x31, 0x02, 0x00,
+ 0x03, 0x37, 0x01, 0x1e,
+ 0x30, 0x42, 0x01, 0x50, 0x24, 0x0f, 0x3b, 0x40, 0x51, 0x30, 0x30, 0x33,
+ 0x20, 0x1d, 0x20, 0x1d,
+ 0x09, 0x0f, 0x00, 0xef, 0xf3, 0x55, 0x30, 0x1d, 0x20, 0x23, 0x00, 0x0c,
+ 0xf0, 0x00, 0xf0, 0x8e,
+ 0x02, 0xe2, 0x0f, 0x17, 0x54, 0x0e, 0x60, 0x32, 0xfd, 0xbf, 0xf3, 0x06,
+ 0x1e, 0x0b, 0x01, 0xe1,
+ 0xdf, 0xfe, 0xde, 0xac, 0xdb, 0xde, 0x00, 0xf2, 0xe1, 0xe0, 0xce, 0xcf,
+ 0xbf, 0xef, 0xdf, 0xb1,
+ 0xf1, 0x0e, 0x20, 0x43, 0x07, 0x06, 0x00, 0xbf, 0xfe, 0xf2, 0xe7, 0xe1,
+ 0xe1, 0xd1, 0xd1, 0xae,
+ 0xe0, 0xd0, 0xe0, 0xd2, 0x03, 0x26, 0x01, 0xdd, 0xcc, 0x23, 0x76, 0x2f,
+ 0x1e, 0x20, 0x00, 0x2d,
+ 0x42, 0x24, 0x0e, 0xbc, 0x10, 0x53, 0x02, 0x00, 0xe1, 0xf4, 0x11, 0x20,
+ 0xe8, 0xe0, 0x30, 0x73,
+ 0x1f, 0xcb, 0xf0, 0x12, 0x1f, 0x0e, 0x20, 0x1c, 0xf0, 0xc2, 0x24, 0x51,
+ 0x00, 0x20, 0x3f, 0x1e,
+ 0x00, 0x07, 0xc1, 0xce, 0xbd, 0xe0, 0xd0, 0xc0, 0xe0, 0xdd, 0xcf, 0xcf,
+ 0xdf, 0x20, 0x4f, 0xe5,
+ 0xd3, 0xf0, 0x12, 0xde, 0x9d, 0xf7, 0xf5, 0xee, 0xee, 0x0d, 0x2b, 0x0c,
+ 0x00, 0x31, 0x01, 0xbf,
+ 0xe0, 0x03, 0x02, 0xdb, 0xbd, 0xdf, 0xe0, 0xd1, 0xa2, 0xd6, 0xb0, 0xdd,
+ 0xd1, 0xe4, 0xd0, 0x0d,
+ 0x02, 0x05, 0xc2, 0xfe, 0xbb, 0xe0, 0xff, 0xff, 0xf0, 0x00, 0x04, 0xbf,
+ 0xbc, 0xe3, 0x06, 0xe0,
+ 0xce, 0xd0, 0x12, 0x11, 0xde, 0xd0, 0xf6, 0x10, 0x4f, 0x1e, 0x10, 0xe0,
+ 0xca, 0xaf, 0xf0, 0xf2,
+ 0x04, 0x0f, 0xcd, 0xf0, 0x12, 0x01, 0xc0, 0xb7, 0xe0, 0xc0, 0xef, 0xdf,
+ 0xdf, 0x00, 0xf3, 0xb4,
+ 0xe0, 0x0d, 0xde, 0xd0, 0x03, 0x37, 0x56, 0x00, 0x30, 0x11, 0xe0, 0x80,
+ 0xf3, 0xe0, 0xed, 0xef,
+ 0x1e, 0x2e, 0x01, 0xff, 0x88, 0x0f, 0xe0, 0xf4, 0xfe, 0xed, 0xf2, 0xb0,
+ 0xef, 0xfe, 0x0f, 0x0d,
+ 0xe1, 0x04, 0x13, 0x4e, 0xf8, 0xb0, 0xe0, 0x00, 0x00, 0xdf, 0xda, 0xd0,
+ 0x02, 0xb4, 0xe1, 0xe0,
+ 0xaf, 0xee, 0x00, 0x04, 0xf3, 0xd0, 0x03, 0x02, 0x2f, 0x3f, 0x70, 0x42,
+ 0x20, 0x08, 0xfd, 0x30,
+ 0x30, 0x5d, 0x20, 0x32, 0x0b, 0x0d, 0x40, 0x34, 0x1f, 0x0e, 0x22, 0x54,
+ 0x54, 0x22, 0xfc, 0x0f,
+ 0x02, 0x33, 0x0c, 0x0e, 0xf1, 0x0e, 0x0b, 0x52, 0x67, 0x11, 0x1e, 0x30,
+ 0x43, 0x34, 0x3f, 0x2d,
+ 0x1f, 0x23, 0x02, 0xee, 0xbd, 0xe6, 0xdf, 0xd9, 0xef, 0x10, 0x50, 0x20,
+ 0x0d, 0xd1, 0xd6, 0xe1,
+ 0x20, 0xe0, 0x8f, 0x0f, 0x00, 0x00, 0x51, 0x0f, 0xda, 0xf1, 0x01, 0x1f,
+ 0x2d, 0x74, 0x20, 0x0e,
+ 0x00, 0x10, 0x10, 0x0f, 0xfc, 0xcd, 0x10, 0x02, 0xd2, 0x92, 0x0f, 0xf0,
+ 0xe6, 0xbb, 0xfc, 0x1f,
+ 0x41, 0x04, 0x21, 0x0f, 0x0d, 0x0e, 0x60, 0x31, 0x26, 0x00, 0xfc, 0x0f,
+ 0x22, 0x03, 0xce, 0xed,
+ 0x02, 0x02, 0x11, 0x77, 0x63, 0x0e, 0xfe, 0x00, 0x02, 0x11, 0x2d, 0x1e,
+ 0x35, 0x42, 0x00, 0x0a,
+ 0x00, 0x23, 0x41, 0x04, 0x46, 0x61, 0x20, 0x0c, 0x00, 0xf2, 0x00, 0xe0,
+ 0x00, 0xe0, 0xfd, 0x2d,
+ 0x72, 0x03, 0xfd, 0x00, 0x22, 0x17, 0x23, 0x31, 0x25, 0x20, 0x1f, 0x30,
+ 0x11, 0x6d, 0x4b, 0x0e,
+ 0xff, 0x00, 0x27, 0x30, 0xce, 0xdc, 0x20, 0xef, 0x8d, 0xf0, 0x11, 0x01,
+ 0xaf, 0x0e, 0x10, 0x5f,
+ 0x0d, 0xe0, 0x07, 0x31, 0x1f, 0x0e, 0x1f, 0x2c, 0x20, 0x23, 0xe2, 0x9f,
+ 0x00, 0xf3, 0xfe, 0xe1,
+ 0x37, 0x07, 0xa1, 0x01, 0x12, 0x40, 0x40, 0x01, 0x21, 0x31, 0x3e, 0x2e,
+ 0x5e, 0x4d, 0x2b, 0x00,
+ 0x21, 0x36, 0x6e, 0x19, 0x10, 0x31, 0x61, 0x1f, 0x00, 0x16, 0x21, 0x31,
+ 0x3f, 0x0c, 0x0f, 0x11,
+ 0x42, 0x00, 0xdf, 0xf0, 0xe0, 0x0d, 0xf0, 0x61, 0x7f, 0x2e, 0x27, 0x01,
+ 0x0b, 0x1f, 0x12, 0x02,
+ 0xfe, 0x0f, 0x35, 0x01, 0xdf, 0xfc, 0xbe, 0xee, 0xb0, 0xff, 0xc0, 0xf1,
+ 0xe1, 0xf2, 0xd5, 0xf0,
+ 0xcf, 0xec, 0xef, 0xdc, 0xcf, 0xf0, 0xcf, 0xd4, 0x07, 0x20, 0xcd, 0xcb,
+ 0x10, 0x31, 0xe0, 0xde,
+ 0x00, 0x31, 0x93, 0xcc, 0xed, 0xe1, 0xe7, 0xe1, 0xc0, 0xce, 0xc0, 0xb1,
+ 0x03, 0xe2, 0xe0, 0xde,
+ 0x23, 0x30, 0x0c, 0x00, 0xe4, 0xbc, 0xee, 0xf0, 0x05, 0x0e, 0xee, 0xef,
+ 0xf1, 0x80, 0xf0, 0xe0,
+ 0xf2, 0xe4, 0x07, 0x41, 0x21, 0x01, 0xd2, 0xce, 0xeb, 0xfe, 0xe0, 0xb0,
+ 0x11, 0x00, 0x01, 0xe6,
+ 0x02, 0x40, 0x2e, 0xc0, 0xf5, 0x00, 0xf1, 0xf1, 0x8f, 0xcd, 0x0f, 0x0d,
+ 0xf9, 0xee, 0x00, 0xe4,
+ 0xe1, 0xe0, 0x0d, 0xe2, 0x17, 0x53, 0xef, 0xbc, 0x14, 0x52, 0x30, 0x0e,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x15, 0x10, 0xdd, 0x8e, 0xe0, 0xcd, 0xed, 0xe0, 0xe7, 0xf0, 0xbe, 0xee,
+ 0xdf, 0xd0, 0xe0, 0xfe,
+ 0xf9, 0xff, 0x00, 0x34, 0x10, 0xbd, 0xff, 0x34, 0x53, 0x2f, 0x1e, 0xce,
+ 0xcd, 0xf3, 0xd7, 0xc7,
+ 0xe0, 0xee, 0xe0, 0xe3, 0xcf, 0x0f, 0x02, 0x24, 0x31, 0x0f, 0x0d, 0x40,
+ 0x71, 0x6e, 0x0c, 0x0e,
+ 0x00, 0x00, 0x0b, 0x00, 0x10, 0x71, 0x44, 0x31, 0x2e, 0x20, 0x23, 0x0e,
+ 0xde, 0x00, 0x00, 0x00,
+ 0x02, 0x27, 0x45, 0xfb, 0x1e, 0x7f, 0x30, 0x1f, 0x20, 0x30, 0x22, 0x47,
+ 0x51, 0x1f, 0x3d, 0x01,
+ 0x10, 0x10, 0x3f, 0x2d, 0xda, 0xe0, 0x01, 0x01, 0xef, 0xde, 0x30, 0x41,
+ 0xf0, 0x90, 0xf0, 0xf0,
+ 0xb1, 0xd0, 0xbf, 0xf7, 0x07, 0x04, 0x0c, 0xee, 0x20, 0x23, 0xbf, 0xed,
+ 0x00, 0x10, 0x70, 0x76,
+ 0x0f, 0x0f, 0x0f, 0xf0, 0x03, 0xe0, 0xfd, 0xfe, 0xf0, 0xd0, 0xd3, 0xe6,
+ 0x01, 0xe0, 0xfe, 0x0c,
+ 0x2e, 0x50, 0x23, 0x1e, 0x0d, 0xe0, 0xcd, 0xf8, 0x0e, 0xe1, 0x01, 0x01,
+ 0x18, 0x00, 0x2a, 0x00,
+ 0x89, 0xf7, 0xe3, 0xfa, 0xaf, 0xf8, 0x8c, 0xfe, 0x21, 0x77, 0x34, 0xee,
+ 0x1f, 0x20, 0xf0, 0x35,
+ 0x04, 0x8e, 0xdc, 0x00, 0x10, 0x31, 0x50, 0x2f, 0x30, 0x04, 0x0f, 0xbf,
+ 0x00, 0x44, 0x33, 0xbe,
+ 0xd0, 0x04, 0x32, 0x0d, 0xfe, 0xe2, 0xf5, 0x00, 0xfe, 0xbc, 0xdd, 0x20,
+ 0x00, 0xc3, 0xd7, 0x11,
+ 0x4e, 0x3e, 0x31, 0x47, 0x01, 0xf0, 0x32, 0x71, 0x5d, 0xeb, 0xc0, 0x0f,
+ 0x21, 0xf3, 0xce, 0xee,
+ 0xff, 0x12, 0x00, 0xff, 0xef, 0xee, 0xd0, 0x37, 0x75, 0xee, 0xdf, 0x0e,
+ 0x2d, 0x7d, 0x2f, 0x23,
+ 0x37, 0x15, 0xdd, 0xee, 0x00, 0x41, 0x31, 0x10, 0xce, 0xbd, 0xf2, 0xf1,
+ 0xcd, 0xf0, 0xf7, 0x12,
+ 0x61, 0x10, 0x3e, 0xfe, 0x02, 0x34, 0x0f, 0xfd, 0xcf, 0x0d, 0x12, 0x24,
+ 0x34, 0x70, 0x1c, 0x0c,
+ 0x00, 0x10, 0x12, 0xf4, 0xe0, 0xb1, 0xe1, 0xc4, 0xe3, 0xfc, 0xef, 0xe0,
+ 0xd2, 0x02, 0x20, 0x6e,
+ 0xf8, 0xcc, 0x23, 0x46, 0x40, 0x00, 0x2f, 0x21, 0x03, 0x13, 0xe0, 0x9d,
+ 0xfe, 0xf0, 0x00, 0x0e,
+ 0x00, 0x11, 0xeb, 0xbd, 0xe9, 0xad, 0xdb, 0x00, 0x20, 0x12, 0xe0, 0xf1,
+ 0x07, 0x10, 0x00, 0xcc,
+ 0x00, 0x22, 0x20, 0xff, 0x20, 0x70, 0x6a, 0x00, 0x30, 0x22, 0x1e, 0x1c,
+ 0x22, 0x33, 0x0d, 0xbb,
+ 0xf0, 0x03, 0x0f, 0xce, 0xc3, 0xc3, 0xff, 0x10, 0x1e, 0xe8, 0x00, 0x70,
+ 0x10, 0x11, 0xff, 0xed,
+ 0x00, 0x21, 0x0b, 0x0d, 0xef, 0x22, 0x31, 0x00, 0x22, 0x07, 0x24, 0x12,
+ 0xf0, 0x80, 0xdf, 0xe0,
+ 0x01, 0xfe, 0x1e, 0x30, 0x77, 0x62, 0x0e, 0x1e, 0x00, 0x01, 0x05, 0x01,
+ 0x02, 0xe4, 0xf0, 0xfe,
+ 0xf0, 0xf4, 0xe4, 0xd1, 0xd0, 0xdf, 0xda, 0xde, 0xce, 0xa0, 0xd0, 0xff,
+ 0x00, 0x0e, 0xcd, 0x9f,
+ 0x03, 0x25, 0x40, 0x2f, 0x35, 0x03, 0xe1, 0xf2, 0x16, 0x10, 0xee, 0xc9,
+ 0x00, 0x30, 0xe2, 0x81,
+ 0xb0, 0x00, 0xf0, 0x0f, 0x10, 0x0d, 0x0c, 0x0f, 0x0d, 0xcd, 0x10, 0x40,
+ 0x22, 0x1d, 0x3c, 0x7f,
+ 0x6e, 0x11, 0x22, 0x0d, 0xe8, 0xd8, 0xef, 0x0f, 0xf0, 0xd4, 0xe0, 0xf1,
+ 0xcf, 0x10, 0x71, 0x12,
+ 0x01, 0xf6, 0x02, 0x31, 0x00, 0xcd, 0xf1, 0x04, 0x01, 0x00, 0x4d, 0x7f,
+ 0x5f, 0x0e, 0x0e, 0x00,
+ 0x03, 0x02, 0x00, 0x1c, 0x13, 0x07, 0xe4, 0xa0, 0xec, 0xc1, 0x01, 0xf0,
+ 0x01, 0x03, 0x00, 0x50,
+ 0x0f, 0xdf, 0x0f, 0x57, 0x05, 0x20, 0x0c, 0x00, 0x04, 0x03, 0x31, 0xdb,
+ 0xdd, 0x00, 0x00, 0x10,
+ 0xef, 0x8e, 0xdd, 0xe3, 0x11, 0x1b, 0xfd, 0xd0, 0xc2, 0xd2, 0x35, 0x11,
+ 0xde, 0xa0, 0x14, 0x33,
+ 0x01, 0x01, 0x0b, 0x2d, 0x3f, 0x30, 0x74, 0x73, 0x4e, 0x1b, 0xfd, 0x0e,
+ 0x1f, 0x01, 0xf2, 0xce,
+ 0xe8, 0xee, 0xee, 0xce, 0x0d, 0xf0, 0x16, 0x75, 0x10, 0x00, 0x0d, 0xf0,
+ 0x10, 0x31, 0xe2, 0xce,
+ 0xfe, 0xeb, 0x0d, 0x20, 0x30, 0x31, 0x00, 0xb1, 0x07, 0x17, 0x00, 0xbe,
+ 0xdf, 0xe0, 0x00, 0x11,
+ 0x22, 0x0f, 0x4e, 0x53, 0x01, 0x0d, 0x09, 0x70, 0x41, 0x23, 0x12, 0x00,
+ 0xaf, 0x0e, 0xf1, 0x46,
+ 0x33, 0x00, 0xcb, 0xf0, 0x00, 0xe3, 0x0f, 0xcd, 0x0f, 0xe0, 0x10, 0x0c,
+ 0xde, 0xdf, 0xac, 0x01,
+ 0x14, 0xee, 0x0f, 0x76, 0x55, 0x00, 0x00, 0x00, 0x1f, 0x10, 0xde, 0xd2,
+ 0x04, 0x31, 0x01, 0x12,
+ 0x11, 0x0d, 0xcd, 0xf2, 0xd4, 0xae, 0xfa, 0xf1, 0xf3, 0x03, 0x2e, 0x0d,
+ 0x60, 0x31, 0x4e, 0x50,
+ 0x25, 0x0d, 0xf8, 0xf0, 0xe2, 0xd1, 0xd0, 0x0d, 0x0c, 0x2e, 0x50, 0x14,
+ 0xd0, 0x9e, 0xf0, 0x07,
+ 0x23, 0x20, 0x00, 0x01, 0xc1, 0xce, 0x0e, 0x10, 0x00, 0x1d, 0x08, 0x20,
+ 0x71, 0x41, 0x00, 0x30,
+ 0x21, 0x1c, 0xde, 0xe0, 0xe3, 0x01, 0x35, 0x23, 0xc0, 0xce, 0xed, 0xce,
+ 0xeb, 0xde, 0x00, 0x47,
+ 0x40, 0xfe, 0xdf, 0x10, 0x4f, 0x4f, 0x00, 0xe0, 0xe2, 0x17, 0x02, 0xce,
+ 0xf0, 0x73, 0x13, 0xdc,
+ 0xde, 0xed, 0xcd, 0xcd, 0xd0, 0x06, 0x01, 0xfc, 0x2e, 0x11, 0x06, 0xe1,
+ 0x91, 0xe0, 0xfe, 0xf0,
+ 0x0f, 0xde, 0x32, 0x77, 0x71, 0x1e, 0x0e, 0x1f, 0x2f, 0x10, 0x15, 0x01,
+ 0x00, 0x0f, 0xfa, 0xce,
+ 0xd0, 0x00, 0x10, 0x0d, 0xbf, 0x01, 0xe3, 0xe6, 0x14, 0x30, 0xde, 0xdd,
+ 0x70, 0x42, 0xfd, 0xed,
+ 0xe0, 0x0c, 0xfd, 0x20, 0x60, 0x2f, 0x1d, 0x02, 0xf6, 0xb1, 0x02, 0x06,
+ 0x20, 0x0d, 0xcc, 0x00,
+ 0x35, 0x30, 0x2f, 0x3f, 0x54, 0xf1, 0xde, 0x4f, 0x40, 0x22, 0x20, 0x42,
+ 0x21, 0xa9, 0xbf, 0x00,
+ 0xf1, 0x04, 0x53, 0x11, 0x00, 0x0e, 0xed, 0xec, 0xdd, 0xe1, 0xb5, 0xe0,
+ 0x0f, 0x0d, 0x20, 0x05,
+ 0x23, 0xf1, 0xe3, 0x64, 0x2d, 0x1e, 0x00, 0xd7, 0x43, 0x20, 0x20, 0x2f,
+ 0x10, 0x31, 0xdd, 0x0d,
+ 0xa4, 0x84, 0xd2, 0xf2, 0xdf, 0xe9, 0x02, 0x45, 0x1e, 0x0d, 0x40, 0x10,
+ 0x0e, 0x0a, 0x30, 0x70,
+ 0x31, 0xf0, 0xf1, 0x10, 0x1d, 0xf9, 0xbe, 0xff, 0xfd, 0xf1, 0x04, 0x00,
+ 0x30, 0x41, 0xc3, 0xe2,
+ 0x01, 0xe1, 0xe2, 0xe0, 0xbb, 0xcd, 0x02, 0x44, 0x30, 0x3e, 0x63, 0x13,
+ 0x20, 0x10, 0x17, 0x11,
+ 0x41, 0x43, 0x1e, 0x0b, 0xcd, 0xfd, 0xc0, 0xf6, 0xf1, 0x00, 0xee, 0x0f,
+ 0x02, 0x20, 0xba, 0xd0,
+ 0xd0, 0xef, 0x12, 0x35, 0x10, 0x1b, 0x40, 0x23, 0xa0, 0xf1, 0x11, 0x32,
+ 0x03, 0xdd, 0xc9, 0x00,
+ 0x00, 0xf0, 0x41, 0x31, 0xdd, 0x8d, 0x0e, 0xe0, 0xe5, 0xb0, 0xc2, 0xe3,
+ 0xf0, 0xc9, 0xe0, 0x03,
+ 0x20, 0x0c, 0xfc, 0x62, 0x46, 0x00, 0x20, 0x00, 0x2d, 0x10, 0x4e, 0x31,
+ 0x22, 0x00, 0xec, 0xaa,
+ 0xfd, 0x00, 0x00, 0x40, 0xfe, 0xe0, 0x06, 0x22, 0x20, 0xe0, 0xef, 0x0f,
+ 0x4f, 0x00, 0xc0, 0x0b,
+ 0x1e, 0x40, 0x03, 0xb0, 0xd0, 0x0e, 0x00, 0x47, 0x35, 0x50, 0x0f, 0xcd,
+ 0xc1, 0xf3, 0x13, 0x63,
+ 0x0d, 0xf9, 0x40, 0x53, 0xff, 0xde, 0x01, 0x30, 0x00, 0x0e, 0x0d, 0x31,
+ 0x17, 0xf6, 0xcf, 0x00,
+ 0x2f, 0x30, 0x50, 0x00, 0xf1, 0x82, 0xf0, 0xef, 0xee, 0xff, 0xf0, 0x20,
+ 0x35, 0xf0, 0xdf, 0xef,
+ 0xbc, 0xf0, 0x04, 0x00, 0x2e, 0x53, 0x57, 0x10, 0x3d, 0x32, 0x0f, 0xff,
+ 0xd2, 0x04, 0x01, 0xe0,
+ 0xff, 0x84, 0xf4, 0xee, 0xea, 0xe0, 0xf1, 0x03, 0x40, 0x0c, 0xee, 0x0f,
+ 0x51, 0x32, 0x51, 0x24,
+ 0x0e, 0xe9, 0xde, 0x0f, 0xf0, 0xfe, 0x0d, 0x7e, 0x2d, 0xef, 0xd0, 0x01,
+ 0x0f, 0xe0, 0x47, 0x77,
+ 0x06, 0xac, 0x00, 0x01, 0xf1, 0x02, 0x01, 0x10, 0x0e, 0x0e, 0x30, 0x53,
+ 0x33, 0x1f, 0x0d, 0x00,
+ 0x13, 0x11, 0x11, 0x20, 0xca, 0xde, 0xf0, 0xf0, 0xd0, 0xa2, 0xde, 0xee,
+ 0x20, 0x20, 0x11, 0xfe,
+ 0xb8, 0xe0, 0x00, 0x64, 0x0d, 0x2e, 0x57, 0x12, 0xf2, 0xd1, 0xde, 0x0e,
+ 0xf0, 0x00, 0x1c, 0x5e,
+ 0x1f, 0x4f, 0x12, 0xe2, 0xad, 0xec, 0xee, 0x1c, 0xee, 0xa0, 0xf0, 0x07,
+ 0xf1, 0xdc, 0x0f, 0xd0,
+ 0x00, 0x00, 0x41, 0x33, 0x3f, 0x4f, 0x63, 0x1c, 0xfb, 0xff, 0x11, 0x51,
+ 0x1a, 0x0e, 0x21, 0x12,
+ 0xfc, 0xae, 0xe0, 0x04, 0xf3, 0xf4, 0x21, 0x33, 0x20, 0xed, 0xab, 0x00,
+ 0xf1, 0x0f, 0xfb, 0x1e,
+ 0x6e, 0x12, 0x04, 0xdf, 0x0d, 0x00, 0x01, 0x11, 0x26, 0x35, 0xf6, 0x90,
+ 0xef, 0xfe, 0x31, 0x60,
+ 0x0f, 0x0d, 0x10, 0x00, 0xf0, 0xee, 0xdb, 0xdd, 0x33, 0x63, 0x54, 0x22,
+ 0x0d, 0xea, 0xe0, 0x02,
+ 0xf7, 0x01, 0x20, 0xee, 0xd0, 0x0e, 0x70, 0x31, 0x0f, 0xcd, 0x02, 0xf1,
+ 0xfe, 0xb8, 0xf0, 0x07,
+ 0x00, 0x00, 0xf1, 0x00, 0x3f, 0x3f, 0x20, 0x21, 0x24, 0x20, 0x5f, 0x30,
+ 0x2f, 0xfe, 0x80, 0xc5,
+ 0xf0, 0xe0, 0x12, 0x10, 0xf0, 0xf0, 0xfd, 0x0c, 0x00, 0x20, 0xd2, 0xf7,
+ 0x03, 0xca, 0x9e, 0x00,
+ 0x21, 0x20, 0x0e, 0x00, 0x41, 0x50, 0x0b, 0x0b, 0x30, 0x71, 0x22, 0xff,
+ 0xdf, 0x01, 0xe2, 0x03,
+ 0xd2, 0xb0, 0xf0, 0xe2, 0xf7, 0xe0, 0xf0, 0xe0, 0x0e, 0x6f, 0x6f, 0x21,
+ 0x0e, 0x00, 0x34, 0x46,
+ 0x01, 0x30, 0x3b, 0x0d, 0x0f, 0xf0, 0xe3, 0xb1, 0xbe, 0x0f, 0x01, 0xf5,
+ 0x00, 0xfd, 0xed, 0x00,
+ 0x00, 0x2f, 0xde, 0x14, 0xb0, 0x9c, 0x01, 0xf7, 0x34, 0x20, 0xed, 0x21,
+ 0x53, 0x00, 0x11, 0x16,
+ 0x31, 0x40, 0x40, 0x0d, 0x0f, 0x8b, 0xe0, 0xd0, 0xf0, 0xf3, 0x06, 0x30,
+ 0x0f, 0xcf, 0xd0, 0xf3,
+ 0xdf, 0x0f, 0x01, 0xe1, 0xf0, 0x47, 0x60, 0xeb, 0xf0, 0x10, 0x5e, 0x0d,
+ 0x0d, 0x0f, 0x2e, 0x1e,
+ 0x00, 0xf2, 0x63, 0x1a, 0xf9, 0xf0, 0x13, 0xff, 0xcf, 0xe3, 0x13, 0x20,
+ 0x4e, 0x3b, 0x40, 0x6d,
+ 0x0e, 0x0e, 0xef, 0xcc, 0xfe, 0x01, 0xf3, 0x07, 0x61, 0x20, 0x11, 0x0f,
+ 0xb8, 0xef, 0xf0, 0x00,
+ 0xf0, 0xff, 0x00, 0xe4, 0x11, 0x4f, 0x71, 0x31, 0xfb, 0xf0, 0x00, 0xf0,
+ 0x03, 0x44, 0x45, 0x22,
+ 0x0f, 0xec, 0xce, 0x10, 0x46, 0x01, 0xf1, 0xd0, 0x0e, 0x01, 0x21, 0x43,
+ 0xb3, 0xaf, 0xdd, 0xff,
+ 0x00, 0xf0, 0x02, 0x00, 0x12, 0x77, 0x41, 0x00, 0xf0, 0xf0, 0x0a, 0xd0,
+ 0x00, 0x00, 0x44, 0x01,
+ 0x8d, 0xff, 0x02, 0xf1, 0xff, 0x11, 0x13, 0x12, 0xf0, 0xef, 0x01, 0xe7,
+ 0xf0, 0xf0, 0x0d, 0x0d,
+ 0x0f, 0xe9, 0xad, 0x20, 0x71, 0x3d, 0x28, 0x1c, 0x20, 0x1e, 0x3f, 0x02,
+ 0xf1, 0xc2, 0x01, 0x22,
+ 0xde, 0xdf, 0x03, 0xd3, 0x80, 0xdc, 0xe2, 0xf3, 0xce, 0xf9, 0x0f, 0x51,
+ 0x32, 0x4b, 0x4e, 0x44,
+ 0x13, 0x04, 0xff, 0xfe, 0xe2, 0x03, 0x31, 0x44, 0xe0, 0xe9, 0x00, 0x10,
+ 0xd0, 0xdf, 0x72, 0x6f,
+ 0xf9, 0xe1, 0x03, 0x00, 0xbf, 0xfe, 0xe1, 0xf4, 0x12, 0x00, 0x41, 0x27,
+ 0x01, 0x21, 0x24, 0x1e,
+ 0xeb, 0x00, 0x72, 0x64, 0x00, 0xdf, 0xfc, 0xf0, 0x0f, 0xef, 0xff, 0xe2,
+ 0xc0, 0xcd, 0xff, 0xe2,
+ 0x00, 0xef, 0x12, 0x77, 0x03, 0xfd, 0x0c, 0x11, 0x00, 0xfe, 0x21, 0x31,
+ 0x3a, 0x7f, 0x10, 0x0f,
+ 0x01, 0x00, 0xf0, 0xd0, 0xe4, 0x01, 0xf1, 0x67, 0x26, 0xee, 0xfc, 0x00,
+ 0x2f, 0x30, 0xf0, 0xcc,
+ 0xf0, 0xb0, 0x00, 0x0d, 0x60, 0x0e, 0x31, 0x01, 0x0e, 0xdd, 0xde, 0xfc,
+ 0xe6, 0x07, 0xe0, 0x9f,
+ 0x0d, 0x00, 0x33, 0xe0, 0x01, 0xde, 0xeb, 0x73, 0x63, 0xfe, 0xfd, 0x01,
+ 0x02, 0x03, 0x04, 0x02,
+ 0x4f, 0x7e, 0x1e, 0x0f, 0x02, 0x07, 0x12, 0x03, 0xe0, 0xad, 0x0d, 0xff,
+ 0xdd, 0x0e, 0xf2, 0xf7,
+ 0x07, 0x00, 0x1f, 0x5e, 0x10, 0x2e, 0x10, 0x21, 0x14, 0xf0, 0x0f, 0x1f,
+ 0x5f, 0x89, 0xff, 0x05,
+ 0x00, 0xff, 0xf0, 0x00, 0x00, 0xad, 0x10, 0x17, 0x01, 0xf0, 0x02, 0xf0,
+ 0xef, 0xdf, 0xe0, 0x02,
+ 0x4f, 0x3e, 0x72, 0x73, 0x0c, 0x00, 0x10, 0x0b, 0xdc, 0x0f, 0x1d, 0x2c,
+ 0x30, 0x34, 0xf1, 0xa3,
+ 0x05, 0xe0, 0x01, 0x02, 0xe0, 0xfc, 0x00, 0xe0, 0x8e, 0x03, 0x07, 0x2f,
+ 0x2d, 0x55, 0x25, 0x00,
+ 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x21, 0x23, 0x0f, 0x1a, 0x6f, 0x11, 0xe1,
+ 0xdf, 0xda, 0xf0, 0x10,
+ 0x2f, 0xb1, 0xd3, 0xf2, 0xfe, 0x88, 0xd0, 0x01, 0x31, 0x51, 0x0f, 0xe0,
+ 0x01, 0x53, 0x20, 0x1c,
+ 0x1f, 0x31, 0x31, 0x0e, 0xcd, 0xff, 0xe2, 0xd0, 0xff, 0xa0, 0xdb, 0xdc,
+ 0xce, 0xf3, 0x07, 0xe4,
+ 0xde, 0xde, 0xd0, 0xe2, 0xd0, 0xe0, 0x40, 0x7f, 0x5a, 0x10, 0x20, 0x13,
+ 0x32, 0x0d, 0xdc, 0x01,
+ 0x15, 0x00, 0x02, 0x11, 0x1e, 0x1c, 0x73, 0xff, 0xdc, 0xf2, 0x17, 0x00,
+ 0x9b, 0x0f, 0x40, 0x0f,
+ 0xff, 0x00, 0x00, 0xf0, 0x00, 0x2c, 0xfc, 0x21, 0x25, 0x90, 0x00, 0x02,
+ 0x22, 0xde, 0xce, 0xef,
+ 0xfc, 0x0c, 0x10, 0x40, 0x00, 0xae, 0x01, 0x34, 0x01, 0x10, 0x10, 0x0a,
+ 0x11, 0x55, 0x20, 0x2d,
+ 0x6f, 0x52, 0x46, 0x33, 0xe0, 0xf0, 0x01, 0x01, 0xff, 0x9c, 0x01, 0xf0,
+ 0xd8, 0xd0, 0x00, 0xf2,
+ 0xde, 0x0f, 0x70, 0x21, 0x90, 0x24, 0x33, 0x00, 0xee, 0x1f, 0x13, 0xc1,
+ 0x00, 0x24, 0x0e, 0xd8,
+ 0x0c, 0x42, 0x35, 0xe0, 0xb1, 0x13, 0x04, 0xf0, 0xab, 0xf0, 0x02, 0x00,
+ 0xf0, 0xf0, 0xe4, 0xe0,
+ 0x0d, 0x1e, 0x10, 0x71, 0x21, 0x0c, 0x2c, 0x00, 0x0d, 0x5e, 0x3f, 0x30,
+ 0x02, 0xf1, 0xef, 0xfb,
+ 0xdf, 0xbf, 0xc0, 0xed, 0x07, 0x17, 0xd0, 0xcc, 0x1f, 0x61, 0x00, 0xee,
+ 0x11, 0x65, 0x00, 0x0f,
+ 0x01, 0x14, 0xff, 0x0e, 0x00, 0x40, 0x20, 0x00, 0x0c, 0xef, 0x34, 0x10,
+ 0xcd, 0x04, 0x65, 0x1f,
+ 0xde, 0xd0, 0x00, 0x10, 0x0e, 0xb0, 0xe1, 0xf2, 0xf0, 0xdf, 0x06, 0x44,
+ 0x63, 0x2f, 0x08, 0x10,
+ 0x10, 0x0f, 0x00, 0x23, 0x00, 0xd0, 0x20, 0x4f, 0xef, 0xaa, 0x0f, 0xbe,
+ 0xcf, 0xd0, 0xf2, 0xd7,
+ 0xb2, 0xf0, 0x0e, 0x41, 0x01, 0x0e, 0x00, 0x0f, 0x20, 0x02, 0x16, 0x5f,
+ 0x0b, 0x00, 0xf0, 0x13,
+ 0x02, 0xbb, 0xf0, 0x00, 0x0f, 0x32, 0x56, 0x00, 0xfd, 0xff, 0x00, 0x00,
+ 0x2a, 0x3f, 0x2e, 0x40,
+ 0x0e, 0x1e, 0x50, 0x10, 0x00, 0x2d, 0x5f, 0xdd, 0xb1, 0x07, 0x07, 0xef,
+ 0xdd, 0x30, 0x01, 0xae,
+ 0xef, 0xff, 0x00, 0x31, 0x04, 0x02, 0x34, 0x0f, 0x8c, 0xb0, 0x01, 0x10,
+ 0x4f, 0x37, 0x24, 0x00,
+ 0x2f, 0x40, 0x31, 0x33, 0x30, 0x51, 0x0f, 0xee, 0xce, 0xd3, 0xc0, 0xdd,
+ 0xec, 0x01, 0xf4, 0x02,
+ 0x10, 0x3b, 0xd1, 0xf7, 0xc0, 0xff, 0x21, 0x72, 0x00, 0x21, 0x02, 0xfd,
+ 0xdc, 0x01, 0x0f, 0x0b,
+ 0x71, 0x76, 0x00, 0xed, 0xd2, 0x05, 0x0f, 0xdd, 0xe1, 0x05, 0x00, 0xd0,
+ 0xe4, 0xc0, 0xc0, 0x0f,
+ 0x5d, 0x11, 0xf0, 0xfe, 0x2a, 0x70, 0x40, 0x0e, 0x40, 0x22, 0x0c, 0x0b,
+ 0xf0, 0x01, 0xe0, 0xf1,
+ 0xc3, 0xaa, 0x00, 0xf0, 0x00, 0xfd, 0x00, 0xde, 0xcf, 0x1e, 0x60, 0x07,
+ 0x01, 0x0f, 0x30, 0x14,
+ 0x33, 0x34, 0x5f, 0xfd, 0xa0, 0x03, 0x17, 0x11, 0x12, 0x42, 0x11, 0x00,
+ 0x00, 0xfa, 0x0e, 0xef,
+ 0xbf, 0xff, 0x02, 0xc3, 0x00, 0xae, 0x30, 0x2d, 0x9a, 0x20, 0x03, 0x00,
+ 0x00, 0xe3, 0x25, 0x52,
+ 0xf1, 0xfc, 0x0b, 0x10, 0x20, 0x01, 0xff, 0xee, 0x00, 0xf2, 0xf1, 0x0f,
+ 0xef, 0xd3, 0xd7, 0x91,
+ 0xfb, 0xff, 0xd0, 0x20, 0x10, 0x10, 0x04, 0xde, 0x2d, 0x20, 0x0d, 0x18,
+ 0x3f, 0x60, 0x02, 0x50,
+ 0x20, 0xfc, 0x00, 0x53, 0x0e, 0xbd, 0xf2, 0x17, 0x1e, 0xfd, 0xf3, 0x53,
+ 0x1e, 0xe8, 0xcf, 0x20,
+ 0x50, 0x11, 0xe0, 0xfc, 0x00, 0x22, 0xd2, 0x22, 0x60, 0xec, 0xf0, 0x1f,
+ 0x42, 0x03, 0xaf, 0xf0,
+ 0x01, 0x08, 0xef, 0x00, 0x14, 0x12, 0xdc, 0xaf, 0x04, 0x23, 0x0f, 0x0d,
+ 0x56, 0x32, 0x51, 0x00,
+ 0x10, 0x0f, 0xfe, 0x0f, 0x22, 0xe2, 0x02, 0x0b, 0xbb, 0xd0, 0x02, 0xf2,
+ 0xed, 0x0f, 0xfd, 0xff,
+ 0x00, 0x66, 0x00, 0xf1, 0x00, 0x1d, 0x0e, 0x16, 0x62, 0x0e, 0x10, 0x00,
+ 0xe6, 0x00, 0x0f, 0x30,
+ 0x4f, 0xdd, 0xc0, 0x17, 0x22, 0x0f, 0x10, 0xb1, 0xd4, 0x04, 0x00, 0x8e,
+ 0xde, 0xe3, 0xa0, 0xdb,
+ 0xdf, 0x40, 0x33, 0x0e, 0x09, 0x70, 0x21, 0x00, 0x0e, 0x1f, 0x1f, 0x0c,
+ 0x00, 0x13, 0x01, 0xfe,
+ 0xed, 0xef, 0xd0, 0x8e, 0xfa, 0x03, 0xf1, 0xed, 0x17, 0x24, 0xed, 0x0f,
+ 0x71, 0x52, 0xe0, 0xe4,
+ 0x00, 0xfd, 0xf1, 0x27, 0x33, 0x5f, 0x40, 0xb8, 0x41, 0x37, 0x04, 0x04,
+ 0xa6, 0x00, 0x66, 0x00,
+ 0x49, 0x01, 0x65, 0x00, 0x26, 0xff, 0x44, 0xff, 0x34, 0x40, 0x57, 0x21,
+ 0x32, 0x32, 0x30, 0x32,
+ 0x53, 0x23, 0x20, 0x1d, 0x31, 0x45, 0x10, 0x00, 0x25, 0x33, 0x45, 0x43,
+ 0x41, 0x31, 0x55, 0x20,
+ 0x42, 0x44, 0x20, 0x30, 0x43, 0x21, 0x31, 0x33, 0x67, 0x37, 0x00, 0x0d,
+ 0x11, 0x44, 0x22, 0x00,
+ 0x00, 0x01, 0x12, 0x23, 0x34, 0x23, 0x01, 0xf0, 0x12, 0x16, 0x63, 0x52,
+ 0x12, 0x03, 0x24, 0x33,
+ 0x25, 0x02, 0x22, 0x11, 0x03, 0x14, 0x33, 0x33, 0x23, 0xf2, 0x04, 0x35,
+ 0x52, 0x01, 0xd0, 0x12,
+ 0x73, 0x44, 0x02, 0x11, 0x01, 0x01, 0x33, 0x34, 0x31, 0x42, 0x32, 0x32,
+ 0x43, 0x22, 0x32, 0x22,
+ 0x23, 0x04, 0x90, 0xe0, 0xdf, 0xbc, 0xe0, 0xf1, 0x00, 0x0d, 0x1c, 0x3f,
+ 0x1b, 0x5d, 0x50, 0x2e,
+ 0x2b, 0x3d, 0x3d, 0x50, 0x30, 0x30, 0x3d, 0x28, 0x3c, 0x4f, 0x2e, 0x4d,
+ 0x3e, 0x0a, 0x1d, 0x4f,
+ 0x4f, 0x3e, 0x3e, 0x50, 0x3e, 0x3f, 0x40, 0x30, 0x2e, 0x3b, 0x62, 0x37,
+ 0x41, 0x20, 0x3e, 0x40,
+ 0x53, 0x23, 0x22, 0x20, 0x22, 0x35, 0x24, 0x33, 0x13, 0x13, 0x04, 0x03,
+ 0x05, 0x03, 0x03, 0xd2,
+ 0xb2, 0x07, 0xf2, 0xe2, 0x03, 0xf2, 0xf1, 0x43, 0x22, 0x02, 0xd1, 0xd2,
+ 0x17, 0xf1, 0x81, 0xe1,
+ 0xbf, 0x01, 0x77, 0x17, 0x9c, 0xff, 0x01, 0x12, 0xf0, 0xff, 0xee, 0xdf,
+ 0x01, 0x01, 0x02, 0x00,
+ 0xe0, 0xcd, 0x01, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x41,
+ 0x20, 0x40, 0x98, 0xeb,
+ 0x75, 0x10, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x43, 0xff, 0x88, 0x00, 0x32,
+ 0x00, 0xee, 0x00, 0x10,
+ 0x00, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x1f, 0x20, 0x0e, 0x0d, 0xcb, 0x42,
+ 0x44, 0xde, 0x00, 0x00,
+ 0x89, 0x00, 0x25, 0x00, 0xde, 0x00, 0xe0, 0xef, 0x33, 0x11, 0xae, 0xff,
+ 0xf0, 0x01, 0x25, 0xf0,
+ 0xbe, 0xf0, 0x02, 0xef, 0xe0, 0x03, 0xf0, 0xd1, 0xab, 0x02, 0x25, 0xde,
+ 0x00, 0x35, 0xbf, 0xf0,
+ 0x23, 0xdf, 0xab, 0x01, 0x02, 0x00, 0x01, 0x01, 0x0f, 0xff, 0x00, 0x34,
+ 0x21, 0xff, 0xcc, 0x00,
+ 0x11, 0xbb, 0xdf, 0x00, 0x9a, 0x00, 0xff, 0xde, 0x00, 0x0f, 0xec, 0xf0,
+ 0x00, 0xfe, 0x00, 0xcc,
+ 0xdc, 0x52, 0xdb, 0xef, 0x20, 0xdc, 0x10, 0xee, 0xad, 0x54, 0x00, 0xdb,
+ 0x21, 0x21, 0xde, 0xed,
+ 0x33, 0x21, 0x89, 0xee, 0x00, 0x00, 0x00, 0xf0, 0xdd, 0xff, 0x00, 0x43,
+ 0x0f, 0x0e, 0x1f, 0x0e,
+ 0x44, 0x0f, 0xfc, 0x0e, 0xed, 0x21, 0x21, 0xaa, 0xde, 0x01, 0x04, 0xbe,
+ 0xcc, 0xe0, 0xdf, 0xcd,
+ 0xf0, 0x27, 0xe0, 0x8b, 0xfe, 0xf0, 0x01, 0x00, 0xef, 0xed, 0xe0, 0x0f,
+ 0xcc, 0x00, 0x00, 0xb9,
+ 0xff, 0x00, 0x0f, 0xff, 0xcc, 0xde, 0xff, 0xff, 0xf0, 0xcd, 0xdd, 0xcd,
+ 0xcb, 0xef, 0x00, 0x00,
+ 0xdf, 0xbb, 0xf0, 0x00, 0x00, 0xdc, 0x00, 0x64, 0x0f, 0x0f, 0x00, 0x0f,
+ 0x00, 0x0e, 0x20, 0x54,
+ 0x10, 0x11, 0x01, 0x01, 0x00, 0x03, 0x17, 0xe0, 0xf0, 0x22, 0xcf, 0xe0,
+ 0x02, 0xf0, 0xac, 0x01,
+ 0x56, 0x53, 0x12, 0x10, 0x0f, 0x33, 0x55, 0x00, 0x10, 0x32, 0x22, 0x21,
+ 0x0e, 0x30, 0x11, 0x00,
+ 0x12, 0x24, 0x47, 0x22, 0x44, 0x66, 0x11, 0x00, 0x00, 0x44, 0x43, 0x00,
+ 0xef, 0x00, 0x02, 0x01,
+ 0x02, 0x02, 0xe2, 0x04, 0x35, 0x22, 0x01, 0x12, 0x23, 0x43, 0x54, 0x33,
+ 0x01, 0xd0, 0xe0, 0x12,
+ 0x45, 0x01, 0xd0, 0xf1, 0x77, 0x63, 0x11, 0x00, 0x01, 0x33, 0x55, 0x33,
+ 0x11, 0xfe, 0xed, 0x23,
+ 0x35, 0x00, 0x00, 0xf0, 0xf1, 0xd0, 0xb0, 0x01, 0x00, 0xbc, 0xf0, 0x04,
+ 0x22, 0x0f, 0xed, 0x00,
+ 0x30, 0x1f, 0x20, 0x43, 0x10, 0x0c, 0xc8, 0xff, 0x73, 0x64, 0x0d, 0x0e,
+ 0x20, 0x0f, 0x0a, 0x00,
+ 0x31, 0xff, 0x00, 0x31, 0x10, 0xed, 0x0f, 0x52, 0x0f, 0x0c, 0x54, 0x20,
+ 0x1e, 0x64, 0x33, 0x08,
+ 0x2f, 0x72, 0x32, 0x0d, 0x0d, 0x20, 0x1d, 0x0c, 0x0e, 0x00, 0x34, 0x11,
+ 0x01, 0x00, 0x03, 0x46,
+ 0x00, 0xe0, 0x31, 0x12, 0x00, 0xf0, 0xe0, 0xd0, 0xce, 0xf0, 0x02, 0x02,
+ 0x47, 0x74, 0x23, 0x55,
+ 0x11, 0x00, 0x00, 0x45, 0x43, 0x00, 0x0f, 0x00, 0xef, 0xee, 0xf0, 0x12,
+ 0x00, 0xe0, 0x01, 0x03,
+ 0x07, 0x03, 0xc2, 0x24, 0x75, 0x51, 0x00, 0x00, 0x0f, 0x31, 0x21, 0x0e,
+ 0x1f, 0x62, 0x32, 0x32,
+ 0x67, 0x10, 0xfb, 0x00, 0x76, 0x22, 0xff, 0xee, 0xff, 0x01, 0x01, 0x23,
+ 0x01, 0x0f, 0x00, 0x42,
+ 0x45, 0x20, 0x0f, 0x2f, 0x40, 0x66, 0x21, 0x1f, 0x1e, 0x20, 0x20, 0x20,
+ 0x20, 0x54, 0x23, 0x00,
+ 0x00, 0x00, 0x13, 0x35, 0x22, 0x00, 0xfe, 0x11, 0x02, 0xfe, 0x00, 0x20,
+ 0xec, 0xab, 0x01, 0x77,
+ 0x57, 0xbe, 0xed, 0x12, 0x35, 0x00, 0xef, 0xf0, 0x01, 0xf1, 0xe0, 0x01,
+ 0x02, 0xc0, 0xbe, 0xf0,
+ 0xe0, 0xce, 0xef, 0xf2, 0x02, 0xf0, 0xf1, 0xf1, 0x04, 0x00, 0x03, 0x15,
+ 0xff, 0xdd, 0x77, 0xed,
+ 0x88, 0x11, 0x34, 0x9b, 0x00, 0xff, 0xff, 0x12, 0x00, 0xdd, 0xdd, 0x22,
+ 0x34, 0xee, 0xcd, 0xff,
+ 0xff, 0x00, 0xff, 0xbb, 0xed, 0x00, 0x11, 0x0f, 0x00, 0x0f, 0xa9, 0x0f,
+ 0x11, 0x11, 0x00, 0x0e,
+ 0x00, 0xed, 0x9a, 0x11, 0x32, 0xdd, 0xdd, 0x11, 0x42, 0x11, 0xca, 0x00,
+ 0x21, 0xdd, 0x0e, 0x74,
+ 0x0e, 0x0d, 0x01, 0x0d, 0xfc, 0x33, 0x22, 0xdc, 0xef, 0x00, 0x0f, 0xf0,
+ 0x00, 0xce, 0x99, 0x00,
+ 0x14, 0xef, 0xef, 0x00, 0xe0, 0xf0, 0xf1, 0xe0, 0xf0, 0xd1, 0xcd, 0xcc,
+ 0xee, 0x01, 0x46, 0xef,
+ 0x9c, 0x00, 0x01, 0x00, 0xfe, 0xee, 0x00, 0x13, 0xdc, 0xcb, 0xe0, 0xef,
+ 0xdf, 0xce, 0xce, 0x01,
+ 0xf2, 0xdf, 0xcc, 0xdc, 0xf0, 0xef, 0xdd, 0x00, 0xca, 0xed, 0x00, 0xbb,
+ 0xdd, 0xdd, 0x0f, 0x61,
+ 0x10, 0x10, 0x00, 0x10, 0x10, 0xfd, 0xc9, 0x22, 0x65, 0xef, 0xcc, 0x00,
+ 0x12, 0xff, 0xde, 0x00,
+ 0x12, 0x43, 0x31, 0x33, 0x42, 0x21, 0x55, 0x57, 0x10, 0x10, 0x10, 0x32,
+ 0x54, 0x00, 0x00, 0x01,
+ 0x45, 0x11, 0x01, 0x11, 0x12, 0x00, 0x14, 0x33, 0x02, 0x24, 0x01, 0xe1,
+ 0x03, 0x03, 0xd1, 0xb1,
+ 0xd0, 0x04, 0x57, 0x02, 0x00, 0xb0, 0x01, 0x37, 0x01, 0x01, 0xe1, 0x90,
+ 0xf0, 0xf1, 0xd0, 0x02,
+ 0x03, 0xcf, 0xdf, 0x02, 0x02, 0x02, 0x02, 0x00, 0x10, 0x10, 0x20, 0xfb,
+ 0x73, 0x36, 0xcc, 0x8a,
+ 0x00, 0x13, 0x00, 0xdc, 0xee, 0xff, 0xff, 0x00, 0x00, 0xbc, 0xcc, 0x00,
+ 0x00, 0xed, 0xdd, 0xfe,
+ 0xdd, 0xdc, 0x01, 0x00, 0xca, 0xef, 0xff, 0x0f, 0x30, 0x00, 0xdd, 0xdc,
+ 0x20, 0x5f, 0x0e, 0xfd,
+ 0xfe, 0x32, 0x10, 0xef, 0xdf, 0x8a, 0x89, 0xff, 0x11, 0x00, 0xff, 0xfe,
+ 0x0e, 0xfd, 0x0e, 0x2f,
+ 0x1e, 0x50, 0x0b, 0xfb, 0x10, 0x40, 0x1e, 0xdb, 0xcd, 0x10, 0x30, 0x21,
+ 0x00, 0x00, 0xdf, 0x32,
+ 0x77, 0x00, 0xc0, 0xff, 0x23, 0x00, 0x77, 0x45, 0x88, 0xef, 0x32, 0x22,
+ 0xf0, 0xde, 0x0f, 0x22,
+ 0x21, 0xef, 0x00, 0x21, 0x10, 0x00, 0x00, 0x0f, 0xef, 0x10, 0x00, 0xee,
+ 0xef, 0x21, 0xe0, 0xcd,
+ 0x23, 0x88, 0xff, 0x57, 0x00, 0xef, 0x10, 0xff, 0x00, 0x74, 0x00, 0xfe,
+ 0x00, 0x22, 0x33, 0x11,
+ 0x0f, 0x0f, 0x22, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0xef,
+ 0x77, 0x22, 0x00, 0x0f,
+ 0x0f, 0x43, 0x65, 0x00, 0x0e, 0x01, 0x21, 0x32, 0x22, 0x10, 0xfc, 0x20,
+ 0x77, 0x10, 0x0f, 0xfe,
+ 0x10, 0x33, 0x10, 0x0e, 0x77, 0x45, 0xee, 0xff, 0x11, 0x33, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0xff,
+ 0xff, 0x01, 0xff, 0xde, 0x34, 0x43, 0xf0, 0xff, 0x33, 0x44, 0x13, 0x01,
+ 0x03, 0x25, 0xe1, 0x8f,
+ 0x02, 0x26, 0xf0, 0xbe, 0xf0, 0x25, 0x22, 0x11, 0x01, 0x22, 0x43, 0x23,
+ 0x34, 0x54, 0x01, 0xfe,
+ 0x00, 0x44, 0x01, 0xdd, 0x01, 0x77, 0x01, 0xf0, 0x00, 0x23, 0x02, 0x01,
+ 0xab, 0x34, 0x56, 0xee,
+ 0xce, 0xde, 0x21, 0x66, 0xfe, 0xcd, 0x00, 0x33, 0x10, 0xfe, 0x0e, 0x00,
+ 0x22, 0x00, 0x0d, 0x00,
+ 0x10, 0x0d, 0xdc, 0x00, 0x42, 0xfe, 0xdb, 0x00, 0x20, 0x0d, 0xfd, 0x61,
+ 0x10, 0xe8, 0xff, 0x40,
+ 0x20, 0x0d, 0x0e, 0x1f, 0x60, 0x20, 0x0d, 0x31, 0x20, 0xfa, 0x10, 0x21,
+ 0x30, 0x10, 0xef, 0xde,
+ 0x43, 0x75, 0xfe, 0xba, 0x00, 0x45, 0x10, 0x00, 0xe0, 0x00, 0x11, 0x21,
+ 0x32, 0x12, 0x12, 0x11,
+ 0x22, 0x54, 0x00, 0x01, 0x24, 0x00, 0xf0, 0xff, 0xf0, 0xc0, 0x8a, 0xee,
+ 0x01, 0x03, 0xd0, 0xcf,
+ 0x02, 0x05, 0xd0, 0xac, 0xf0, 0x02, 0x02, 0xff, 0xfe, 0x00, 0x02, 0xfe,
+ 0xb8, 0xf0, 0x10, 0x32,
+ 0x11, 0x01, 0x01, 0x13, 0x54, 0x21, 0x00, 0xde, 0xad, 0x01, 0x14, 0x00,
+ 0xc9, 0xdf, 0x33, 0x21,
+ 0xdc, 0x0f, 0x64, 0x22, 0x00, 0x0f, 0x1f, 0x10, 0x44, 0x32, 0xea, 0xff,
+ 0x60, 0x0f, 0x0d, 0x43,
+ 0x46, 0x00, 0x0d, 0x21, 0x22, 0xdd, 0xdd, 0x00, 0x44, 0x00, 0xce, 0xdf,
+ 0xde, 0xee, 0x33, 0x00,
+ 0xbf, 0x05, 0x54, 0x23, 0x01, 0xef, 0xdd, 0x57, 0x47, 0xf0, 0xd0, 0xf0,
+ 0x12, 0x02, 0xdf, 0xd0,
+ 0xf0, 0xb0, 0xe0, 0x12, 0x01, 0xcf, 0x04, 0x15, 0xd0, 0x9c, 0x00, 0x35,
+ 0x00, 0xd0, 0xff, 0xef,
+ 0xbe, 0xee, 0x02, 0x02, 0xdf, 0xcc, 0xef, 0xf0, 0x24, 0x02, 0xe0, 0xde,
+ 0x01, 0x01, 0xbd, 0xcb,
+ 0xcd, 0xec, 0xf0, 0xfe, 0x98, 0xfe, 0xff, 0x20, 0x43, 0x00, 0xfb, 0xee,
+ 0x0f, 0x31, 0x00, 0xec,
+ 0xde, 0xbe, 0x00, 0x01, 0xdc, 0x9a, 0xef, 0x00, 0x01, 0x00, 0xff, 0xff,
+ 0xee, 0x00, 0x20, 0x0e,
+ 0xc9, 0x1f, 0x50, 0x20, 0x0f, 0x0e, 0xec, 0xfe, 0x77, 0x74, 0x0e, 0x88,
+ 0x0f, 0x34, 0x12, 0xee,
+ 0xee, 0x00, 0x33, 0x00, 0xde, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x11,
+ 0x22, 0xe0, 0xde, 0xef,
+ 0x01, 0xf0, 0xde, 0xcb, 0xf0, 0xde, 0xcd, 0xff, 0x99, 0xf0, 0xdd, 0xef,
+ 0x76, 0xff, 0xaa, 0x00,
+ 0x01, 0x00, 0xff, 0xf0, 0xff, 0xff, 0xee, 0xee, 0x01, 0x00, 0xef, 0xfe,
+ 0xfe, 0x10, 0x33, 0x00,
+ 0x0d, 0x0e, 0x0c, 0xfe, 0x31, 0xef, 0x88, 0xe0, 0x00, 0x00, 0xab, 0xff,
+ 0x44, 0x23, 0xfe, 0xee,
+ 0x00, 0x34, 0x00, 0xde, 0xff, 0x62, 0x23, 0x0f, 0xfd, 0x00, 0x33, 0x57,
+ 0x00, 0x0d, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x43, 0x46, 0x21, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00,
+ 0xac, 0x11, 0x44, 0xdb,
+ 0xde, 0x10, 0x23, 0x01, 0x00, 0x00, 0x02, 0x12, 0x01, 0x12, 0x22, 0xf0,
+ 0x77, 0xe0, 0x88, 0xf0,
+ 0x33, 0xf0, 0xde, 0xde, 0x00, 0x23, 0xf0, 0xce, 0x10, 0x55, 0x11, 0xff,
+ 0xee, 0x01, 0x55, 0x01,
+ 0x0f, 0xee, 0x00, 0x23, 0x00, 0xee, 0xfe, 0x32, 0x22, 0x0f, 0xde, 0x0f,
+ 0x00, 0xbd, 0xef, 0x04,
+ 0xa9, 0xdd, 0x00, 0x34, 0x12, 0x0f, 0x10, 0x62, 0x00, 0x00, 0x43, 0x11,
+ 0x2f, 0xf8, 0xef, 0x33,
+ 0x41, 0x0e, 0x2f, 0x23, 0x25, 0xf0, 0x8a, 0x00, 0x33, 0x11, 0x00, 0x00,
+ 0x00, 0x64, 0x23, 0x0f,
+ 0x0e, 0x31, 0x43, 0xea, 0xec, 0x0f, 0x20, 0x41, 0x20, 0x20, 0x20, 0x0e,
+ 0x00, 0x52, 0x33, 0x56,
+ 0x10, 0x00, 0x00, 0x43, 0x11, 0xfe, 0xec, 0xba, 0xee, 0x12, 0x34, 0xce,
+ 0xee, 0x33, 0x45, 0x11,
+ 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x64, 0x12, 0x10, 0x0f, 0x20, 0xcd,
+ 0xd0, 0x05, 0x76, 0x22,
+ 0x00, 0xcd, 0xef, 0x35, 0x22, 0x00, 0xd0, 0xdf, 0xf0, 0x54, 0x44, 0xf0,
+ 0x00, 0x32, 0x56, 0x11,
+ 0x10, 0x00, 0xee, 0xcd, 0x77, 0x34, 0xff, 0x0f, 0x12, 0xf0, 0xcd, 0x0f,
+ 0x11, 0x45, 0x21, 0x00,
+ 0xef, 0xee, 0xee, 0x89, 0xcd, 0xfe, 0x01, 0x44, 0x00, 0xfe, 0xee, 0x11,
+ 0x34, 0x76, 0x43, 0x12,
+ 0x11, 0xfe, 0xff, 0x01, 0x11, 0x45, 0x33, 0xf0, 0xef, 0x01, 0x00, 0xe9,
+ 0x74, 0x23, 0xdd, 0xcc,
+ 0x21, 0x76, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x22,
+ 0x01, 0x0e, 0xef, 0x00,
+ 0xe0, 0xba, 0x01, 0x42, 0xef, 0xbb, 0x00, 0x01, 0x00, 0xcd, 0xee, 0x12,
+ 0x45, 0x23, 0x00, 0xfe,
+ 0x01, 0x44, 0x00, 0x00, 0x00, 0x01, 0x33, 0x11, 0xff, 0xee, 0xef, 0xee,
+ 0xff, 0xde, 0xae, 0x02,
+ 0x0e, 0xb8, 0xdc, 0xef, 0x21, 0x0f, 0xbb, 0x00, 0x55, 0x10, 0x00, 0x00,
+ 0x11, 0x43, 0x0f, 0xdc,
+ 0x23, 0x53, 0xdb, 0xee, 0x77, 0x32, 0xff, 0xbc, 0xfe, 0x01, 0x11, 0xff,
+ 0xfe, 0x00, 0xfe, 0xee,
+ 0xed, 0xfe, 0x00, 0x00, 0xfd, 0xed, 0xca, 0x11, 0x31, 0xff, 0xff, 0x42,
+ 0x21, 0xfe, 0xdd, 0x9a,
+ 0xcb, 0xdd, 0xef, 0x00, 0x21, 0x43, 0xff, 0xee, 0x00, 0x46, 0x00, 0xff,
+ 0xdf, 0xde, 0x00, 0x75,
+ 0x55, 0x22, 0x00, 0x00, 0x01, 0x00, 0xba, 0xef, 0x32, 0x43, 0x00, 0xcc,
+ 0xfe, 0xf0, 0x00, 0x00,
+ 0x22, 0xff, 0xce, 0xdb, 0xfe, 0x44, 0x23, 0xfe, 0xcb, 0x00, 0x76, 0x10,
+ 0xf0, 0x00, 0x53, 0x11,
+ 0x00, 0x22, 0x12, 0x21, 0x00, 0x00, 0x33, 0xff, 0x88, 0xed, 0xff, 0x00,
+ 0x11, 0x10, 0xff, 0x00,
+ 0xff, 0x00, 0x00, 0xef, 0xdc, 0x33, 0x66, 0x00, 0xdd, 0xf0, 0x00, 0xef,
+ 0xcc, 0x00, 0x21, 0x34,
+ 0x64, 0x34, 0x00, 0x99, 0xee, 0x01, 0x33, 0xff, 0xdd, 0xf0, 0x00, 0x0f,
+ 0xef, 0x00, 0x54, 0x11,
+ 0xff, 0x00, 0x56, 0x11, 0x00, 0x33, 0x55, 0x00, 0x01, 0x10, 0x11, 0x01,
+ 0x00, 0x11, 0x33, 0xf0,
+ 0x01, 0x76, 0x00, 0xde, 0x00, 0x23, 0x22, 0xff, 0xff, 0x12, 0x45, 0x11,
+ 0x01, 0x00, 0xee, 0x21,
+ 0x45, 0xf0, 0xff, 0xff, 0xad, 0x00, 0x46, 0x00, 0xcd, 0xdc, 0xff, 0x33,
+ 0x01, 0xbb, 0xef, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x42, 0x21, 0x00, 0xdc, 0xab, 0xed, 0x00, 0x21,
+ 0xee, 0xb9, 0xde, 0xef,
+ 0x0f, 0x10, 0x10, 0xff, 0x11, 0x01, 0x89, 0xee, 0x11, 0xf0, 0xcc, 0x00,
+ 0x00, 0x00, 0xf0, 0xde,
+ 0x00, 0x31, 0x00, 0xee, 0xee, 0x00, 0x10, 0xc9, 0xce, 0xff, 0x00, 0xff,
+ 0x10, 0x32, 0x0f, 0xce,
+ 0x88, 0xcd, 0x0f, 0x12, 0x33, 0x11, 0xdd, 0x88, 0xed, 0xdd, 0x12, 0x11,
+ 0xdd, 0x00, 0x11, 0xee,
+ 0x01, 0x57, 0x00, 0xdd, 0xf0, 0x01, 0x21, 0xde, 0xcc, 0x00, 0x11, 0xde,
+ 0xde, 0x43, 0x56, 0x10,
+ 0xce, 0x00, 0x77, 0x22, 0x00, 0x00, 0x11, 0x0f, 0xcd, 0xfe, 0xfe, 0xff,
+ 0x11, 0x45, 0x21, 0x00,
+ 0xff, 0x10, 0x43, 0x23, 0xfd, 0xff, 0x67, 0x11, 0x00, 0x00, 0x11, 0x11,
+ 0x00, 0x11, 0x44, 0x22,
+ 0x00, 0x00, 0x33, 0xdc, 0x9a, 0x11, 0x55, 0x01, 0x0f, 0x00, 0x11, 0x32,
+ 0x11, 0x00, 0x10, 0x55,
+ 0x34, 0x10, 0x00, 0x20, 0x44, 0x11, 0x00, 0x32, 0x33, 0x10, 0x52, 0x00,
+ 0x00, 0x57, 0x10, 0x0f,
+ 0x10, 0x12, 0xfe, 0xde, 0x10, 0x53, 0x36, 0x23, 0x11, 0x00, 0x43, 0x77,
+ 0x11, 0xff, 0xee, 0xff,
+ 0x33, 0x12, 0xef, 0xcc, 0x12, 0x45, 0x11, 0x01, 0x22, 0xf0, 0x00, 0x55,
+ 0x22, 0xf0, 0xe0, 0xde,
+ 0xce, 0x00, 0xde, 0x88, 0xee, 0x13, 0x12, 0xdd, 0xab, 0xff, 0x00, 0x01,
+ 0x00, 0xee, 0x00, 0x13,
+ 0xff, 0xcc, 0x00, 0x01, 0xcd, 0xc8, 0xef, 0x01, 0x00, 0xff, 0x04, 0x00,
+ 0x11, 0x02, 0xce, 0x02,
+ 0xf2, 0xb7, 0x41, 0xd1, 0xfd, 0xb8, 0xf8, 0xd2, 0x11, 0x77, 0x22, 0xf0,
+ 0xde, 0xff, 0x11, 0x55,
+ 0x53, 0x11, 0x00, 0x00, 0x22, 0x22, 0x0d, 0x0e, 0x45, 0x10, 0x21, 0x53,
+ 0x0f, 0xfb, 0xcb, 0x00,
+ 0x32, 0x00, 0xbb, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x53, 0x23, 0x0e, 0xcb,
+ 0x00, 0x11, 0x22, 0x43,
+ 0xff, 0xa8, 0xff, 0x22, 0x00, 0xbc, 0x11, 0x23, 0x00, 0xcc, 0xfe, 0xf0,
+ 0x00, 0x01, 0xef, 0xff,
+ 0x0f, 0x00, 0xe0, 0x14, 0x54, 0x24, 0x44, 0x01, 0xcd, 0xee, 0x77, 0x12,
+ 0xee, 0x00, 0x12, 0x0f,
+ 0xdc, 0xff, 0x00, 0xee, 0xbd, 0xf0, 0x35, 0x11, 0xee, 0x12, 0x44, 0x00,
+ 0x9b, 0x00, 0x13, 0x11,
+ 0x00, 0x11, 0x12, 0x11, 0x0f, 0x00, 0x23, 0x00, 0xa8, 0x0f, 0x12, 0x33,
+ 0x00, 0xcd, 0xff, 0x00,
+ 0xff, 0xff, 0x45, 0x11, 0xdd, 0x21, 0x54, 0x00, 0x12, 0xfd, 0xa8, 0x10,
+ 0x55, 0x00, 0xff, 0x0f,
+ 0x10, 0x21, 0x00, 0xff, 0x10, 0x20, 0x00, 0x1f, 0x30, 0x00, 0xff, 0x00,
+ 0x20, 0x73, 0x13, 0xec,
+ 0x22, 0x67, 0x00, 0xff, 0xff, 0xfd, 0xca, 0x00, 0x42, 0x12, 0x0e, 0xdc,
+ 0xff, 0x00, 0xcd, 0x00,
+ 0x77, 0x22, 0xee, 0xee, 0x22, 0x55, 0x00, 0x0e, 0x00, 0x10, 0xf0, 0x00,
+ 0x22, 0x00, 0x00, 0x76,
+ 0x12, 0xfd, 0xed, 0xff, 0xec, 0xee, 0x00, 0x00, 0x00, 0x10, 0x10, 0x41,
+ 0x54, 0x00, 0x0d, 0x24,
+ 0x57, 0x00, 0xee, 0xdd, 0xee, 0xee, 0x11, 0x31, 0xcb, 0x9b, 0xee, 0xdd,
+ 0x32, 0x66, 0xee, 0xbc,
+ 0x00, 0x01, 0x00, 0xfe, 0x00, 0xee, 0xff, 0xdf, 0x02, 0x13, 0xde, 0xef,
+ 0x02, 0x14, 0x01, 0x16,
+ 0x73, 0x23, 0x21, 0x12, 0x00, 0xdd, 0xce, 0xdd, 0xdb, 0x10, 0xf0, 0x88,
+ 0xce, 0x00, 0x00, 0x12,
+ 0x34, 0x10, 0xef, 0x00, 0x23, 0x34, 0xef, 0x8b, 0xef, 0x01, 0x25, 0xf0,
+ 0xad, 0xff, 0x02, 0x24,
+ 0x01, 0xff, 0xed, 0x11, 0x35, 0x00, 0xff, 0x22, 0x74, 0x00, 0x0f, 0xff,
+ 0x34, 0x43, 0xfe, 0xed,
+ 0x10, 0x23, 0x21, 0x21, 0x34, 0x22, 0xcc, 0xaa, 0x00, 0x00, 0x0e, 0x11,
+ 0x00, 0xfe, 0xff, 0x10,
+ 0x75, 0x33, 0x0f, 0xed, 0xea, 0x10, 0x64, 0x0f, 0xdd, 0x00, 0x00, 0x0f,
+ 0x33, 0x24, 0x89, 0xdd,
+ 0x01, 0x55, 0x01, 0x0f, 0xff, 0x00, 0x01, 0x22, 0x00, 0xff, 0xed, 0xba,
+ 0xff, 0x00, 0xf0, 0xef,
+ 0x00, 0x01, 0x01, 0x01, 0x12, 0x01, 0x22, 0x45, 0xf0, 0xe0, 0x21, 0x00,
+ 0xe0, 0x77, 0x31, 0xe0,
+ 0xff, 0xf0, 0x10, 0x23, 0xbe, 0xca, 0xff, 0x20, 0x01, 0x8b, 0xdd, 0x00,
+ 0x00, 0xf0, 0x00, 0xe0,
+ 0xcf, 0x01, 0x04, 0x11, 0xf0, 0xd0, 0x00, 0x47, 0x01, 0xc0, 0x21, 0x66,
+ 0xf0, 0xdd, 0x10, 0x43,
+ 0x00, 0x00, 0x00, 0x10, 0x0f, 0x10, 0x30, 0x21, 0x00, 0xfd, 0xbb, 0x12,
+ 0x67, 0x00, 0x00, 0x10,
+ 0x21, 0x11, 0x23, 0xfd, 0x98, 0xff, 0x10, 0x21, 0x00, 0x0f, 0x0f, 0xf0,
+ 0x63, 0x34, 0xfe, 0x0f,
+ 0x44, 0x0f, 0xdb, 0x10, 0x75, 0x00, 0x00, 0x33, 0x10, 0xfe, 0xed, 0x0f,
+ 0x32, 0x32, 0xec, 0xbc,
+ 0xed, 0xfe, 0x44, 0x33, 0xfc, 0x00, 0x53, 0xfe, 0xa8, 0x0f, 0x11, 0x11,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x21, 0x10, 0x01, 0x33, 0x31, 0x00, 0xaa, 0xde, 0x10, 0x33, 0x11, 0xff,
+ 0x00, 0x00, 0xef, 0xef,
+ 0x0f, 0xee, 0x01, 0x31, 0x88, 0xde, 0x01, 0x01, 0xe0, 0xcc, 0x12, 0x43,
+ 0xdb, 0xde, 0x23, 0x02,
+ 0xf0, 0x34, 0xbe, 0x9b, 0x00, 0xf1, 0xdf, 0xef, 0x02, 0x25, 0x11, 0xee,
+ 0x01, 0x77, 0x00, 0xee,
+ 0xff, 0x54, 0x33, 0x0f, 0xce, 0xff, 0xf0, 0x01, 0x33, 0x00, 0x0f, 0x10,
+ 0x10, 0x0e, 0x12, 0x35,
+ 0x00, 0x01, 0xce, 0x98, 0xef, 0xdf, 0x10, 0x77, 0x31, 0x00, 0x0f, 0xff,
+ 0x10, 0x10, 0xee, 0xcc,
+ 0x00, 0x00, 0xcc, 0xf0, 0x32, 0x00, 0x0f, 0x00, 0x32, 0x66, 0x22, 0xff,
+ 0xdd, 0xee, 0x10, 0x65,
+ 0xff, 0xdb, 0x00, 0x22, 0xf0, 0xad, 0x00, 0x11, 0x23, 0x22, 0x11, 0xff,
+ 0x22, 0x33, 0xba, 0xef,
+ 0x66, 0x11, 0xcc, 0x00, 0x33, 0x11, 0xdd, 0x0f, 0x12, 0xef, 0xcc, 0x00,
+ 0x23, 0x22, 0xe0, 0xee,
+ 0xee, 0x0f, 0xde, 0x88, 0xdf, 0x33, 0x56, 0x11, 0x00, 0xdf, 0x00, 0x44,
+ 0x00, 0x01, 0x21, 0x00,
+ 0xef, 0x00, 0x44, 0x0f, 0xbc, 0xed, 0x10, 0x32, 0x22, 0x55, 0x21, 0x10,
+ 0x31, 0x55, 0x20, 0xff,
+ 0x0e, 0x0f, 0x00, 0xee, 0xb8, 0xdf, 0xff, 0x00, 0x30, 0x10, 0x00, 0x00,
+ 0xce, 0x8a, 0xff, 0xf0,
+ 0x00, 0xef, 0xff, 0x00, 0x01, 0x24, 0x22, 0x00, 0x00, 0x53, 0x12, 0x13,
+ 0x0f, 0xa8, 0xff, 0x21,
+ 0x00, 0x0f, 0x00, 0xff, 0x0f, 0x21, 0x11, 0x33, 0x33, 0xfd, 0x00, 0x65,
+ 0x0f, 0xb8, 0xff, 0x00,
+ 0x12, 0x42, 0x10, 0x00, 0xfe, 0x00, 0x34, 0x00, 0x0e, 0x50, 0x0f, 0x0e,
+ 0x66, 0x12, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xed, 0xce, 0x00, 0x42, 0x37, 0xdf, 0x88, 0xee,
+ 0x00, 0x01, 0x00, 0xde,
+ 0xcc, 0x00, 0x42, 0xff, 0xdd, 0x00, 0x44, 0x00, 0xfe, 0x11, 0x0f, 0xde,
+ 0x88, 0xce, 0x00, 0x12,
+ 0x02, 0x13, 0x01, 0xed, 0xa8, 0xde, 0x22, 0x34, 0x00, 0x22, 0x33, 0x00,
+ 0xbb, 0xf0, 0x21, 0x10,
+ 0x00, 0x23, 0x32, 0xbe, 0x0f, 0x22, 0xff, 0xee, 0x01, 0x03, 0xf0, 0xe0,
+ 0xee, 0xf3, 0xe4, 0x8c,
+ 0xfd, 0x14, 0x47, 0x00, 0x00, 0x0e, 0x22, 0x67, 0x00, 0xef, 0x32, 0x43,
+ 0xff, 0xff, 0x21, 0x34,
+ 0x00, 0xf0, 0x22, 0x76, 0x31, 0xef, 0xee, 0xf0, 0x11, 0xfe, 0xdd, 0x00,
+ 0x20, 0x75, 0x0e, 0xed,
+ 0x11, 0x65, 0x11, 0x0f, 0x1f, 0x10, 0x0e, 0xea, 0xff, 0x00, 0xed, 0xbd,
+ 0x01, 0x02, 0x00, 0x00,
+ 0xdc, 0xbb, 0xff, 0x00, 0x00, 0xcc, 0xdd, 0x44, 0x22, 0xbb, 0xcd, 0x0f,
+ 0x01, 0x12, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x36, 0x64, 0xfe, 0xab, 0x00, 0x01, 0x12, 0x12, 0x0e,
+ 0xcb, 0xff, 0x00, 0x21,
+ 0x32, 0x34, 0x00, 0xee, 0x01, 0x00, 0x43, 0x22, 0xbc, 0xed, 0x13, 0x13,
+ 0xbb, 0xbb, 0x00, 0x23,
+ 0x00, 0xee, 0xee, 0x00, 0x15, 0x11, 0x00, 0x33, 0x33, 0x01, 0x00, 0x11,
+ 0x63, 0x00, 0xed, 0x11,
+ 0x56, 0x11, 0x00, 0xfc, 0xf0, 0x34, 0x33, 0xee, 0xba, 0xff, 0x42, 0x66,
+ 0x00, 0xdd, 0x00, 0x0f,
+ 0xbc, 0x13, 0x54, 0x00, 0x00, 0x00, 0xef, 0xff, 0x10, 0x12, 0x00, 0xf0,
+ 0x0e, 0x1f, 0x44, 0x00,
+ 0xa8, 0xee, 0xee, 0xef, 0x00, 0xfe, 0xef, 0x43, 0x34, 0xee, 0xfe, 0x10,
+ 0xf0, 0x00, 0x77, 0x31,
+ 0xcd, 0xba, 0xee, 0x22, 0x22, 0x00, 0xee, 0xf0, 0xde, 0xff, 0x11, 0x33,
+ 0x44, 0x53, 0x21, 0xfe,
+ 0xec, 0x32, 0x67, 0x0f, 0xdd, 0x00, 0x42, 0x34, 0x13, 0x22, 0x11, 0x20,
+ 0x00, 0xee, 0xee, 0x00,
+ 0xdc, 0xfe, 0x72, 0x0f, 0xd8, 0x0f, 0x20, 0xde, 0xce, 0x22, 0x33, 0x10,
+ 0x42, 0x00, 0xba, 0x00,
+ 0x11, 0xde, 0xf0, 0xf0, 0x03, 0x35, 0x00, 0xde, 0x8d, 0xec, 0xde, 0xed,
+ 0x00, 0x45, 0x00, 0xf0,
+ 0xdd, 0xed, 0xef, 0x02, 0x77, 0x01, 0x9c, 0xee, 0x01, 0x25, 0x00, 0x00,
+ 0x01, 0x35, 0x22, 0xd0,
+ 0xce, 0x00, 0x11, 0x22, 0x00, 0xf0, 0xdf, 0xee, 0x20, 0x32, 0xcc, 0x8b,
+ 0xff, 0x01, 0xf0, 0x00,
+ 0x02, 0x00, 0xe0, 0x47, 0x35, 0x41, 0x32, 0xde, 0x8c, 0x0f, 0x00, 0x11,
+ 0x45, 0x33, 0xfe, 0xdd,
+ 0x10, 0x43, 0x0f, 0xeb, 0x11, 0x75, 0x00, 0x0d, 0x0f, 0x11, 0x21, 0x20,
+ 0x20, 0xff, 0xfd, 0x10,
+ 0x0d, 0xfc, 0x00, 0x52, 0x00, 0x0c, 0x0f, 0xff, 0x00, 0x52, 0x0f, 0xf0,
+ 0x05, 0xcd, 0xa8, 0xff,
+ 0x10, 0xef, 0xde, 0x01, 0x0f, 0xde, 0xf0, 0x02, 0x12, 0x67, 0x02, 0x00,
+ 0x11, 0xee, 0x10, 0x76,
+ 0x00, 0x00, 0x11, 0x11, 0xff, 0xdd, 0x11, 0x45, 0xf0, 0xdf, 0x44, 0x42,
+ 0xef, 0xbb, 0x11, 0x34,
+ 0xfe, 0xfe, 0x33, 0x00, 0xac, 0x0f, 0x01, 0x13, 0x12, 0x00, 0x0e, 0x01,
+ 0x24, 0xdc, 0x9b, 0x00,
+ 0x23, 0x23, 0x12, 0x22, 0xed, 0xdb, 0x51, 0x34, 0xef, 0xdd, 0x32, 0x41,
+ 0xcc, 0xef, 0x45, 0x10,
+ 0xef, 0x0f, 0x0f, 0xed, 0xee, 0xf0, 0x01, 0x77, 0x54, 0x00, 0xdd, 0xfe,
+ 0x00, 0x00, 0x22, 0x34,
+ 0xed, 0x10, 0x62, 0x0f, 0xed, 0x00, 0x20, 0x34, 0x67, 0x23, 0x11, 0x10,
+ 0xfd, 0xcb, 0x0f, 0x11,
+ 0x12, 0xfe, 0xee, 0x0e, 0xee, 0x00, 0xef, 0xec, 0xef, 0xc0, 0x15, 0x11,
+ 0xce, 0xcd, 0xbc, 0xdd,
+ 0x00, 0x22, 0x11, 0x12, 0x01, 0xf0, 0xff, 0xe3, 0x37, 0x32, 0xd0, 0xbf,
+ 0xfe, 0x77, 0x63, 0xff,
+ 0x0d, 0x0f, 0xfc, 0xdd, 0x01, 0x55, 0x0f, 0xec, 0x0f, 0x10, 0x21, 0x00,
+ 0x0d, 0xcb, 0x00, 0x22,
+ 0xac, 0xdb, 0x01, 0x00, 0xe0, 0xef, 0xcd, 0xcd, 0x01, 0x01, 0xf0, 0x45,
+ 0x02, 0xdd, 0xef, 0x22,
+ 0xef, 0x89, 0x11, 0x00, 0x00, 0x00, 0xed, 0xba, 0x01, 0x34, 0xff, 0xdf,
+ 0xff, 0xcd, 0xf0, 0x01,
+ 0x04, 0xf1, 0xcf, 0x11, 0x44, 0xff, 0xac, 0xec, 0x01, 0x44, 0xe0, 0xcc,
+ 0x01, 0x12, 0x01, 0xe1,
+ 0xe0, 0x05, 0x44, 0x21, 0x01, 0xe0, 0xcf, 0x00, 0x12, 0x23, 0x01, 0x13,
+ 0x21, 0xcc, 0xef, 0x77,
+ 0x65, 0x00, 0x00, 0x0f, 0x0f, 0x11, 0x00, 0xdd, 0xfe, 0x32, 0x56, 0x00,
+ 0xee, 0xee, 0xee, 0x10,
+ 0x42, 0xff, 0xdc, 0x00, 0x10, 0xaa, 0x00, 0x11, 0x00, 0xff, 0xdd, 0xee,
+ 0x31, 0x67, 0x00, 0x00,
+ 0x21, 0x11, 0x00, 0x01, 0x32, 0x00, 0xbb, 0x41, 0x55, 0xff, 0xef, 0x10,
+ 0x12, 0xf0, 0xff, 0x00,
+ 0x12, 0x54, 0x44, 0xfe, 0xc8, 0x10, 0x52, 0x00, 0xf0, 0xff, 0xff, 0x20,
+ 0x11, 0xf0, 0xef, 0x33,
+ 0x33, 0xee, 0xef, 0x20, 0x73, 0x11, 0x13, 0x24, 0x0f, 0xb9, 0xff, 0xff,
+ 0x00, 0x67, 0x11, 0x00,
+ 0x00, 0xf0, 0xfe, 0x00, 0x34, 0x00, 0xef, 0x00, 0x10, 0xff, 0x12, 0x77,
+ 0x10, 0xe0, 0x10, 0x32,
+ 0xe0, 0xee, 0x00, 0x20, 0x75, 0x44, 0x00, 0xfd, 0x0f, 0xcd, 0xcb, 0x00,
+ 0x33, 0xfe, 0x98, 0xee,
+ 0x11, 0x33, 0x00, 0xff, 0xfe, 0x00, 0x21, 0x00, 0xfe, 0xef, 0x45, 0x01,
+ 0xdd, 0xed, 0xfe, 0x0f,
+ 0x43, 0x44, 0x0e, 0xbc, 0xec, 0x00, 0x42, 0xf0, 0xb9, 0xef, 0x10, 0x0e,
+ 0xcd, 0x01, 0x46, 0x11,
+ 0x00, 0xde, 0xdf, 0x31, 0x54, 0x00, 0xef, 0xed, 0x0f, 0x31, 0xf0, 0x9c,
+ 0x00, 0x33, 0x00, 0xee,
+ 0xff, 0x11, 0x67, 0x33, 0x11, 0x21, 0x00, 0xbb, 0x00, 0x00, 0xff, 0xff,
+ 0x11, 0x10, 0xfc, 0xdd,
+ 0xff, 0x35, 0x42, 0xee, 0xdb, 0x31, 0x64, 0xf0, 0x0f, 0x10, 0xde, 0xbd,
+ 0xf0, 0x02, 0x01, 0xe0,
+ 0xab, 0x00, 0x11, 0x0f, 0xfd, 0xff, 0xf0, 0xe0, 0x37, 0x24, 0xc0, 0x01,
+ 0xf0, 0x8f, 0x02, 0x10,
+ 0xe9, 0x00, 0x01, 0xbd, 0x0f, 0x00, 0xff, 0xe0, 0x03, 0x14, 0xf0, 0xdf,
+ 0x23, 0x77, 0x34, 0xdd,
+ 0xff, 0x10, 0x00, 0xef, 0x00, 0xf1, 0xd0, 0x10, 0x10, 0xcf, 0x01, 0x22,
+ 0x77, 0x56, 0x00, 0xf0,
+ 0xef, 0x22, 0x43, 0xfe, 0x00, 0x46, 0x11, 0x00, 0x20, 0x31, 0x20, 0x41,
+ 0x33, 0x10, 0xec, 0x0e,
+ 0x51, 0x21, 0x10, 0x2e, 0x0d, 0x34, 0x77, 0x00, 0x0f, 0x31, 0x42, 0x10,
+ 0x0f, 0xfd, 0x20, 0x77,
+ 0x33, 0xed, 0xb9, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x31, 0x42, 0x0d,
+ 0xfc, 0x32, 0x22, 0xdd,
+ 0xdf, 0x76, 0x12, 0xfd, 0xff, 0x43, 0x22, 0x0f, 0x10, 0xfd, 0xb9, 0x11,
+ 0x53, 0x11, 0x0f, 0xdc,
+ 0xff, 0xff, 0x00, 0x00, 0x02, 0x24, 0x32, 0xff, 0xcc, 0xf0, 0x00, 0x34,
+ 0x75, 0x20, 0xba, 0xef,
+ 0x00, 0x00, 0x00, 0x33, 0x11, 0x01, 0x0f, 0xbc, 0x0e, 0x10, 0x21, 0x0f,
+ 0xda, 0xef, 0x00, 0x11,
+ 0x22, 0x31, 0x12, 0x9e, 0xff, 0x45, 0x00, 0xab, 0x00, 0x11, 0x0f, 0xcc,
+ 0xff, 0xed, 0x00, 0x0f,
+ 0xed, 0xdd, 0xef, 0xe0, 0xe1, 0xfe, 0x20, 0x02, 0xcc, 0x0e, 0x02, 0xce,
+ 0xcd, 0x04, 0x01, 0xd0,
+ 0x07, 0x02, 0x02, 0xaf, 0xde, 0x46, 0x12, 0xcd, 0x43, 0x77, 0x00, 0xff,
+ 0xfe, 0x0f, 0x10, 0x0d,
+ 0xa9, 0x00, 0x14, 0x11, 0x00, 0xee, 0xef, 0xee, 0xe0, 0x13, 0x23, 0xfe,
+ 0xbb, 0x00, 0x03, 0xde,
+ 0xbd, 0x01, 0x05, 0x00, 0xdd, 0x0f, 0x11, 0x01, 0xff, 0xde, 0xe0, 0x45,
+ 0x43, 0x13, 0x00, 0xdc,
+ 0xfe, 0x44, 0x01, 0x8b, 0xdc, 0xef, 0x00, 0xf0, 0xdd, 0xdd, 0x24, 0x76,
+ 0x00, 0xbc, 0xf0, 0x22,
+ 0x12, 0x11, 0x11, 0x00, 0x0e, 0xdb, 0xce, 0xff, 0x10, 0x11, 0x11, 0xe0,
+ 0xef, 0xf2, 0x13, 0x23,
+ 0x77, 0x77, 0x00, 0xdf, 0x00, 0x32, 0x22, 0x0f, 0x00, 0x23, 0x31, 0x31,
+ 0x02, 0xcf, 0xac, 0xfe,
+ 0xfe, 0xec, 0xff, 0x45, 0x22, 0xee, 0xbc, 0x00, 0x03, 0xf0, 0x21, 0x56,
+ 0x00, 0xe0, 0xf0, 0xe0,
+ 0x12, 0x46, 0x30, 0x00, 0x00, 0xef, 0x10, 0x41, 0x21, 0xff, 0x0f, 0x51,
+ 0x00, 0xdd, 0xdc, 0x00,
+ 0x1e, 0x10, 0x66, 0x00, 0xed, 0xfe, 0x62, 0x00, 0xe9, 0xf0, 0x34, 0x21,
+ 0xee, 0xf0, 0x02, 0xf0,
+ 0xcd, 0x40, 0x43, 0xda, 0xee, 0x00, 0x0e, 0x0e, 0x1e, 0x0d, 0x0f, 0x00,
+ 0xce, 0x00, 0x52, 0xdb,
+ 0xa8, 0x22, 0x63, 0x00, 0xed, 0x12, 0x33, 0x0f, 0xda, 0xce, 0xff, 0x10,
+ 0x0e, 0xed, 0xdd, 0xff,
+ 0x74, 0x35, 0x12, 0x11, 0x00, 0x11, 0x33, 0x10, 0xdd, 0x8b, 0xf0, 0x03,
+ 0x02, 0xfe, 0xff, 0xf0,
+ 0x03, 0x04, 0xdb, 0xff, 0x32, 0x12, 0x22, 0x00, 0xef, 0x32, 0x64, 0x45,
+ 0x77, 0x10, 0xfe, 0x00,
+ 0x20, 0x32, 0x23, 0xf0, 0xce, 0xdd, 0xcc, 0x00, 0x12, 0x00, 0x24, 0x00,
+ 0x0d, 0xfe, 0xfe, 0x42,
+ 0x00, 0xe0, 0x27, 0x12, 0x8b, 0xac, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0xdd,
+ 0xff, 0x00, 0xeb, 0xef,
+ 0x56, 0x32, 0xff, 0xcd, 0x10, 0x10, 0xfe, 0xf0, 0x12, 0x01, 0x01, 0xee,
+ 0x11, 0x77, 0x77, 0xff,
+ 0x0e, 0xff, 0xed, 0xde, 0x00, 0x23, 0x11, 0x00, 0x00, 0x33, 0x33, 0x20,
+ 0x32, 0x00, 0xdb, 0xef,
+ 0x41, 0x42, 0x32, 0x0e, 0xba, 0xe0, 0x33, 0x64, 0x10, 0x11, 0x10, 0xee,
+ 0x11, 0x65, 0xdb, 0xab,
+ 0x00, 0x33, 0x00, 0x0e, 0xee, 0xff, 0x35, 0x31, 0x00, 0xe0, 0xbe, 0x00,
+ 0x43, 0x22, 0xeb, 0xdd,
+ 0xef, 0x0e, 0xdd, 0xf0, 0x21, 0x00, 0xd0, 0x00, 0x57, 0x33, 0x00, 0xff,
+ 0xce, 0xdf, 0xcf, 0xe0,
+ 0x25, 0xf0, 0x8d, 0x00, 0x15, 0x00, 0xcf, 0x00, 0xff, 0xcb, 0x01, 0x55,
+ 0x00, 0xde, 0xf0, 0x01,
+ 0x02, 0x12, 0x01, 0x0f, 0x0f, 0x31, 0x22, 0x00, 0xe0, 0xf0, 0xdb, 0x9c,
+ 0x00, 0x45, 0x00, 0xac,
+ 0x00, 0x05, 0x01, 0x12, 0x43, 0x22, 0x00, 0x34, 0x33, 0xdd, 0xcc, 0x21,
+ 0x61, 0x0e, 0xfc, 0x20,
+ 0x56, 0x10, 0x20, 0x32, 0x20, 0x0d, 0x0e, 0x1f, 0x1e, 0x3f, 0x40, 0x10,
+ 0x0e, 0x0d, 0xea, 0xbc,
+ 0xee, 0x10, 0x02, 0x00, 0x10, 0x10, 0x54, 0x56, 0x21, 0x10, 0x0f, 0xee,
+ 0x01, 0x75, 0x21, 0x10,
+ 0x23, 0x33, 0x10, 0xfe, 0xfb, 0x00, 0x0e, 0xde, 0x00, 0x01, 0x0e, 0x73,
+ 0x46, 0x31, 0x32, 0x20,
+ 0x0d, 0x1f, 0x32, 0x30, 0xf9, 0x9c, 0xfe, 0x00, 0x21, 0x11, 0x01, 0xf0,
+ 0x00, 0x10, 0x01, 0x00,
+ 0xbd, 0x15, 0x23, 0x9a, 0xdd, 0x00, 0x23, 0xee, 0xef, 0x02, 0x00, 0x00,
+ 0x12, 0x01, 0x3d, 0x01,
+ 0x49, 0xfc, 0xdf, 0x1d, 0xb0, 0xf8, 0xea, 0x15, 0x00, 0x88, 0x0f, 0x42,
+ 0x00, 0x03, 0x14, 0xdd,
+ 0xbd, 0x10, 0x45, 0x22, 0xef, 0xbd, 0x0f, 0xfd, 0xec, 0xed, 0x0e, 0x11,
+ 0x35, 0xdf, 0x9a, 0x00,
+ 0x11, 0xee, 0xde, 0x32, 0x67, 0x21, 0x00, 0x0e, 0x00, 0x12, 0x00, 0xee,
+ 0x43, 0x21, 0x0d, 0x0f,
+ 0xff, 0xb9, 0x0f, 0x33, 0x24, 0xf0, 0xae, 0xcb, 0xff, 0xf1, 0xe0, 0xff,
+ 0x00, 0xf0, 0x12, 0x41,
+ 0xec, 0x1f, 0x51, 0x0d, 0xec, 0x11, 0x42, 0x1e, 0x0e, 0x2d, 0xf8, 0xcd,
+ 0x56, 0x54, 0x00, 0xcd,
+ 0xf0, 0x21, 0x00, 0xde, 0x01, 0x02, 0x00, 0x00, 0x01, 0xee, 0xff, 0x33,
+ 0x77, 0x21, 0x0f, 0x0e,
+ 0xfe, 0x0f, 0x54, 0x00, 0xb8, 0xff, 0x21, 0x21, 0x00, 0xf0, 0xd0, 0xff,
+ 0xee, 0xdf, 0x00, 0x00,
+ 0xde, 0xbc, 0x0f, 0x41, 0x43, 0x0f, 0xd9, 0xde, 0x11, 0x52, 0x00, 0x0b,
+ 0x0d, 0x10, 0x10, 0x12,
+ 0x00, 0xde, 0xde, 0xe0, 0xbe, 0xfe, 0x23, 0x46, 0xf0, 0xe0, 0xf3, 0xe1,
+ 0xaf, 0x12, 0x77, 0x27,
+ 0x0f, 0x00, 0x21, 0x20, 0x20, 0x31, 0x32, 0x01, 0x00, 0x21, 0x52, 0xff,
+ 0x0e, 0x54, 0x00, 0x88,
+ 0xef, 0x02, 0x01, 0xef, 0xde, 0x00, 0x00, 0x11, 0x00, 0xf2, 0x57, 0x44,
+ 0x00, 0x0f, 0x00, 0x23,
+ 0x32, 0x10, 0x1f, 0x20, 0x41, 0x21, 0x35, 0x33, 0x0f, 0xfd, 0x50, 0x1f,
+ 0xa8, 0x00, 0x00, 0xdf,
+ 0xce, 0x00, 0xdf, 0xba, 0x20, 0x22, 0x00, 0xfe, 0xed, 0xde, 0x11, 0x21,
+ 0x0e, 0xff, 0xe0, 0x00,
+ 0xda, 0x8d, 0x00, 0x12, 0x34, 0x32, 0x11, 0x02, 0x00, 0x56, 0x32, 0xf0,
+ 0x00, 0x77, 0x00, 0xef,
+ 0x0f, 0x00, 0x20, 0x31, 0x33, 0x12, 0xff, 0xbd, 0x0f, 0x00, 0xe0, 0xd0,
+ 0x47, 0x42, 0x12, 0x11,
+ 0xee, 0xef, 0x14, 0xf3, 0xaf, 0xf0, 0xe0, 0xce, 0x14, 0x04, 0xf3, 0x27,
+ 0x42, 0x01, 0x00, 0x41,
+ 0x32, 0xfe, 0xa9, 0xcd, 0xff, 0x42, 0x22, 0x00, 0xf0, 0xbc, 0xee, 0x02,
+ 0x12, 0xff, 0x01, 0x01,
+ 0xcb, 0x00, 0x13, 0xde, 0xaa, 0xef, 0xee, 0x0f, 0x00, 0xde, 0xca, 0x10,
+ 0x41, 0x00, 0x00, 0x62,
+ 0x20, 0x0e, 0x0e, 0x21, 0x22, 0xeb, 0xdc, 0x0e, 0x42, 0x13, 0xe0, 0x01,
+ 0x03, 0xd0, 0xd0, 0x00,
+ 0xf0, 0x67, 0x77, 0x00, 0xdd, 0xfe, 0x00, 0x20, 0xfc, 0xff, 0x00, 0x12,
+ 0x51, 0x0d, 0xfc, 0x21,
+ 0x21, 0xec, 0x41, 0x43, 0xef, 0xf0, 0x01, 0x34, 0x00, 0x99, 0xff, 0x53,
+ 0x20, 0xeb, 0xf0, 0x33,
+ 0x12, 0xed, 0x00, 0x63, 0x00, 0x00, 0xef, 0x01, 0xed, 0xb8, 0x00, 0x22,
+ 0xff, 0xf0, 0xf0, 0xf1,
+ 0x23, 0x00, 0x89, 0xee, 0x01, 0xf0, 0xf0, 0x22, 0x10, 0xed, 0x00, 0x00,
+ 0x0e, 0x41, 0x43, 0x13,
+ 0xff, 0xa8, 0xea, 0x00, 0x54, 0x01, 0xef, 0x00, 0xff, 0xee, 0xff, 0x00,
+ 0x20, 0x76, 0x00, 0xcb,
+ 0x00, 0x22, 0x00, 0x00, 0x01, 0x00, 0x02, 0x11, 0x1e, 0x61, 0x35, 0x00,
+ 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0xe1, 0xc2, 0x05, 0x24, 0x34, 0xaf, 0xde, 0x55, 0x33, 0xdc,
+ 0xff, 0x12, 0x11, 0x00,
+ 0x20, 0x10, 0x00, 0x11, 0x52, 0x11, 0x00, 0x20, 0x10, 0x1f, 0x77, 0x77,
+ 0x00, 0x00, 0x11, 0x0f,
+ 0xef, 0x22, 0x11, 0xfe, 0x00, 0xf0, 0xdc, 0xfc, 0x10, 0x11, 0x01, 0xf1,
+ 0xde, 0xbd, 0xef, 0xde,
+ 0x00, 0x0c, 0xd8, 0x61, 0x44, 0xe0, 0xef, 0xfe, 0xdc, 0x10, 0x52, 0xef,
+ 0xce, 0xf1, 0x27, 0x00,
+ 0xf0, 0x31, 0xe0, 0xdf, 0x00, 0xef, 0xde, 0x0e, 0x0f, 0xdf, 0x8d, 0xab,
+ 0xf0, 0x05, 0x21, 0x00,
+ 0xdd, 0xba, 0xf0, 0x10, 0xf0, 0xe0, 0xf0, 0xdf, 0xdd, 0x10, 0x42, 0x10,
+ 0x01, 0xe2, 0x17, 0x64,
+ 0xf0, 0xff, 0x30, 0x20, 0xfd, 0x42, 0x11, 0x98, 0xfe, 0x00, 0x21, 0x11,
+ 0x11, 0xef, 0x00, 0x41,
+ 0x10, 0x01, 0xf2, 0xef, 0xcb, 0x21, 0x45, 0xff, 0xbe, 0xfe, 0xec, 0xee,
+ 0xfe, 0xcc, 0xfe, 0x21,
+ 0x65, 0x00, 0xcd, 0xfe, 0x0e, 0x0f, 0x20, 0x11, 0x53, 0x10, 0xea, 0x00,
+ 0x03, 0x22, 0x24, 0x01,
+ 0xdf, 0x22, 0x55, 0x11, 0x00, 0x11, 0x54, 0x12, 0xee, 0x0d, 0x74, 0x00,
+ 0xd8, 0x0f, 0x01, 0xe0,
+ 0xcf, 0xff, 0x00, 0x22, 0xf0, 0xce, 0xff, 0xef, 0xde, 0xdb, 0x0f, 0x74,
+ 0x66, 0x00, 0xed, 0x00,
+ 0x14, 0x01, 0x01, 0x12, 0x32, 0x00, 0x00, 0x0f, 0xdd, 0xff, 0x44, 0x10,
+ 0xbb, 0xdd, 0x0f, 0x55,
+ 0x21, 0x00, 0x10, 0x31, 0x0e, 0x1e, 0x64, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+ 0xfd, 0xde, 0x02, 0x67,
+ 0x0f, 0xdd, 0xf0, 0xed, 0xeb, 0x54, 0x24, 0xff, 0x10, 0x43, 0x00, 0x20,
+ 0xfd, 0xbf, 0x07, 0x00,
+ 0x10, 0x31, 0xe0, 0xe0, 0x42, 0xf1, 0xbd, 0x10, 0x56, 0x01, 0xef, 0x00,
+ 0x23, 0x21, 0x02, 0x00,
+ 0x00, 0x77, 0x45, 0xdf, 0x01, 0x32, 0xff, 0xde, 0x13, 0x13, 0x01, 0x02,
+ 0xe0, 0xcb, 0x00, 0x23,
+ 0xdf, 0x10, 0x50, 0xff, 0x16, 0x45, 0xc0, 0xde, 0x00, 0x34, 0x01, 0xae,
+ 0x0f, 0x42, 0x21, 0x00,
+ 0x1f, 0x20, 0x1d, 0x0b, 0xdd, 0xcb, 0xce, 0x20, 0x63, 0xfd, 0xb9, 0x0f,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x22, 0xed, 0xff, 0x10, 0x0d, 0xca, 0xce, 0xef, 0xf0, 0x00, 0x0e,
+ 0xba, 0x00, 0x62, 0x21,
+ 0x0c, 0x10, 0x41, 0x01, 0x0e, 0x0d, 0xee, 0xf0, 0x00, 0xee, 0xee, 0x00,
+ 0x01, 0xf0, 0x00, 0x88,
+ 0xbb, 0x02, 0x12, 0x0f, 0xee, 0xf0, 0xf0, 0xed, 0xee, 0x00, 0x02, 0x02,
+ 0x33, 0x32, 0x27, 0xf3,
+ 0x8f, 0xde, 0x17, 0x32, 0xf1, 0xe0, 0x01, 0x00, 0xf0, 0x62, 0x33, 0x00,
+ 0x2c, 0x2f, 0x22, 0xf0,
+ 0xa8, 0xdf, 0xd0, 0xe1, 0x00, 0x00, 0xf0, 0xe1, 0xb0, 0xdb, 0x40, 0x51,
+ 0x00, 0x01, 0x00, 0xdb,
+ 0xcf, 0x00, 0x33, 0x01, 0x35, 0x66, 0x00, 0xcd, 0x0f, 0x22, 0x10, 0xef,
+ 0x00, 0xef, 0xcc, 0xee,
+ 0xf0, 0x00, 0x03, 0x32, 0x52, 0x30, 0x0e, 0x34, 0x77, 0x13, 0x01, 0x01,
+ 0x32, 0x20, 0xd9, 0xde,
+ 0xee, 0xf0, 0x74, 0x42, 0x10, 0x00, 0x1e, 0xfc, 0xfd, 0x56, 0x23, 0xf0,
+ 0x0f, 0x10, 0x00, 0xef,
+ 0xef, 0x01, 0xd0, 0x9c, 0x05, 0x35, 0x00, 0xef, 0x00, 0x10, 0x01, 0xae,
+ 0x00, 0x34, 0x10, 0xdd,
+ 0x10, 0x54, 0xee, 0xed, 0x00, 0xec, 0xff, 0x75, 0x10, 0xfd, 0xec, 0x01,
+ 0x23, 0xfe, 0xd9, 0xef,
+ 0xfe, 0x00, 0x10, 0xcf, 0xdf, 0x00, 0x21, 0x2f, 0x0e, 0x70, 0x00, 0x99,
+ 0xe0, 0x00, 0x00, 0x01,
+ 0x02, 0x01, 0x02, 0x03, 0x14, 0x22, 0x0e, 0xfd, 0x24, 0x14, 0x8b, 0x01,
+ 0x77, 0x00, 0xf0, 0x22,
+ 0x32, 0x0f, 0x0f, 0xdd, 0xf0, 0x01, 0x0f, 0x00, 0x22, 0xee, 0xee, 0x23,
+ 0x03, 0xd0, 0x13, 0x77,
+ 0x20, 0x41, 0x43, 0x12, 0x00, 0x01, 0x11, 0x46, 0x13, 0xef, 0xcd, 0x00,
+ 0x0f, 0x47, 0x42, 0x0e,
+ 0x0f, 0x00, 0x11, 0xfe, 0xed, 0x13, 0x47, 0x20, 0x00, 0xed, 0xee, 0xac,
+ 0xdc, 0x20, 0x74, 0x12,
+ 0x0e, 0xcb, 0xee, 0x00, 0x51, 0x12, 0xff, 0xec, 0xee, 0xed, 0x00, 0x00,
+ 0xdc, 0xdd, 0x23, 0x55,
+ 0x00, 0xee, 0xef, 0x01, 0x22, 0x10, 0x23, 0x03, 0x9b, 0xeb, 0x10, 0x41,
+ 0x01, 0xef, 0xff, 0x0f,
+ 0x10, 0x01, 0xf1, 0x89, 0x00, 0x24, 0x02, 0xc1, 0xe0, 0xdb, 0xfe, 0x02,
+ 0xf1, 0xc0, 0xed, 0xec,
+ 0xce, 0x11, 0x57, 0xf0, 0xef, 0x01, 0x01, 0xf2, 0x13, 0x64, 0x00, 0x00,
+ 0x00, 0xff, 0xcb, 0x00,
+ 0x35, 0x42, 0x51, 0x21, 0xf0, 0x00, 0x0f, 0x00, 0xfe, 0x14, 0x77, 0x11,
+ 0xff, 0xdd, 0xee, 0x10,
+ 0x22, 0xf1, 0xbe, 0x0e, 0x00, 0x0d, 0xee, 0x21, 0x12, 0x01, 0x16, 0x00,
+ 0x2e, 0x2f, 0xae, 0xcc,
+ 0x00, 0x04, 0xf2, 0xf1, 0x24, 0xdf, 0x8c, 0x03, 0x01, 0xfe, 0x25, 0x75,
+ 0x10, 0x0e, 0xff, 0x00,
+ 0x12, 0x11, 0x0f, 0xfb, 0xbc, 0xdd, 0x00, 0x02, 0x0e, 0xfc, 0xff, 0xef,
+ 0xe0, 0xe0, 0xef, 0x0f,
+ 0x5e, 0x62, 0x16, 0x01, 0x00, 0x00, 0x0e, 0x11, 0x77, 0x14, 0x0f, 0x0d,
+ 0x22, 0x55, 0x00, 0x0f,
+ 0x21, 0x00, 0xfe, 0xf0, 0xee, 0xdb, 0x10, 0x02, 0xe0, 0xd0, 0xbe, 0xdb,
+ 0x20, 0x0f, 0xde, 0x12,
+ 0x10, 0x0e, 0x4d, 0x1a, 0xfc, 0xce, 0xbd, 0xdc, 0xee, 0x0d, 0x1e, 0x0e,
+ 0xef, 0xe0, 0xae, 0xdf,
+ 0x02, 0x26, 0x11, 0xe1, 0x90, 0xd0, 0x01, 0x22, 0x43, 0x0e, 0x00, 0x46,
+ 0x33, 0x36, 0x42, 0x31,
+ 0x52, 0x23, 0x04, 0x00, 0x11, 0x10, 0x56, 0x23, 0xe0, 0x9c, 0xf0, 0x00,
+ 0xff, 0x00, 0x26, 0x00,
+ 0xce, 0xd0, 0x04, 0x01, 0x00, 0x2f, 0x30, 0x22, 0x11, 0x20, 0x41, 0x45,
+ 0x21, 0x41, 0x31, 0x11,
+ 0x02, 0xef, 0xde, 0xee, 0x41, 0x71, 0x19, 0xfc, 0xfe, 0x00, 0x00, 0x20,
+ 0x1f, 0x0c, 0x0e, 0xfe,
+ 0x88, 0xdf, 0x33, 0x22, 0x99, 0xde, 0x00, 0x00, 0xe0, 0xff, 0x20, 0x00,
+ 0x01, 0x33, 0xdd, 0x88,
+ 0xef, 0x00, 0x00, 0x11, 0x43, 0x00, 0x00, 0x30, 0x20, 0x21, 0x42, 0x31,
+ 0x0f, 0x00, 0x12, 0x34,
+ 0x10, 0xfb, 0x0e, 0x70, 0x10, 0xef, 0x02, 0xe2, 0x03, 0x37, 0x04, 0xe1,
+ 0xf0, 0xe0, 0xa0, 0xcd,
+ 0xbc, 0x00, 0x02, 0xf0, 0x04, 0x05, 0x01, 0x11, 0x32, 0x35, 0x32, 0xd0,
+ 0x90, 0xf0, 0x13, 0x00,
+ 0x0f, 0x22, 0xde, 0x8a, 0x00, 0x01, 0x00, 0xce, 0xef, 0xe0, 0x14, 0x67,
+ 0x01, 0xf0, 0xe0, 0xe0,
+ 0x00, 0x0e, 0x0e, 0x20, 0x10, 0xfd, 0x00, 0x00, 0x1d, 0x09, 0xdb, 0xef,
+ 0x20, 0xf0, 0x8e, 0xad,
+ 0x00, 0x30, 0x34, 0x13, 0xf0, 0xe0, 0xff, 0xbb, 0x00, 0x33, 0xf0, 0xcd,
+ 0xfc, 0xff, 0x01, 0x55,
+ 0x22, 0x0f, 0xee, 0x12, 0x64, 0x0a, 0xfc, 0x20, 0x32, 0x0e, 0xdb, 0x00,
+ 0x11, 0x11, 0x00, 0x0f,
+ 0x51, 0x01, 0x2f, 0x2d, 0x0c, 0xdd, 0x8c, 0xff, 0xf0, 0xe0, 0xde, 0x11,
+ 0x77, 0x24, 0x21, 0x10,
+ 0x20, 0x31, 0x13, 0x01, 0x00, 0x21, 0x00, 0xfe, 0xec, 0xbb, 0x11, 0x24,
+ 0xf0, 0xf1, 0x22, 0x0f,
+ 0xdc, 0x41, 0x45, 0x01, 0x00, 0xee, 0xbc, 0x0f, 0x1f, 0xdd, 0xdc, 0x50,
+ 0x0d, 0x9a, 0x01, 0x03,
+ 0x00, 0xd0, 0xf1, 0x04, 0xf1, 0xb0, 0xf1, 0x01, 0xf0, 0xde, 0xec, 0xda,
+ 0xcc, 0xff, 0x20, 0x52,
+ 0x20, 0x0e, 0xef, 0x54, 0x22, 0xe0, 0x06, 0x43, 0x00, 0x00, 0xf1, 0xd0,
+ 0xf0, 0x73, 0x11, 0x0e,
+ 0x00, 0xf1, 0xf2, 0xe3, 0xe6, 0x03, 0x24, 0x13, 0x01, 0x02, 0x24, 0x00,
+ 0x32, 0x31, 0x60, 0x72,
+ 0x34, 0x21, 0x31, 0x30, 0x76, 0x34, 0x00, 0x21, 0x44, 0x45, 0x31, 0x20,
+ 0x1f, 0x0f, 0x0f, 0x0d,
+ 0xf9, 0xef, 0x01, 0x10, 0xcd, 0xff, 0x43, 0x22, 0xef, 0xe0, 0x00, 0xe0,
+ 0xbc, 0xf0, 0xf0, 0x9b,
+ 0xfe, 0x0f, 0x00, 0xdd, 0xce, 0xf4, 0xe0, 0xda, 0x1f, 0x20, 0xc0, 0xbf,
+ 0xf1, 0x02, 0xbe, 0xee,
+ 0xee, 0xed, 0xf0, 0x0e, 0x08, 0x0d, 0x20, 0x0e, 0xfc, 0xfe, 0xde, 0xef,
+ 0x00, 0x10, 0xe2, 0x8d,
+ 0xef, 0x47, 0x11, 0x00, 0x42, 0x12, 0xcd, 0x9a, 0xf0, 0xf0, 0x01, 0x03,
+ 0x05, 0x01, 0x24, 0x43,
+ 0x10, 0x0d, 0x20, 0x77, 0x00, 0x0c, 0x00, 0x0f, 0xed, 0x00, 0x01, 0xef,
+ 0xb0, 0x02, 0xf0, 0x10,
+ 0x15, 0x00, 0xe0, 0xf0, 0x0f, 0x19, 0xdd, 0xbe, 0xff, 0x20, 0x0f, 0xda,
+ 0x20, 0x71, 0x00, 0x0e,
+ 0x20, 0x10, 0x00, 0xf0, 0xde, 0x9b, 0xef, 0x02, 0x24, 0xcd, 0xcb, 0xf0,
+ 0xf1, 0x04, 0x02, 0x00,
+ 0x0e, 0x40, 0x66, 0x12, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0d, 0x41, 0x13,
+ 0xdc, 0xcd, 0x23, 0x66,
+ 0x00, 0x00, 0x00, 0xf0, 0xe0, 0x02, 0x01, 0xfd, 0x0d, 0x46, 0x14, 0xe0,
+ 0xbf, 0xef, 0x00, 0x02,
+ 0x0e, 0x0f, 0x77, 0x53, 0x0f, 0x0f, 0x23, 0x01, 0x0f, 0x1e, 0x11, 0x34,
+ 0x23, 0x12, 0x0d, 0xfd,
+ 0x34, 0x0f, 0xb8, 0xfe, 0x1e, 0xed, 0xde, 0x45, 0x00, 0xae, 0x0e, 0x00,
+ 0x22, 0x10, 0x10, 0x0d,
+ 0xfc, 0xaf, 0xe0, 0x0c, 0x0c, 0x3e, 0x31, 0x04, 0xc0, 0xb0, 0x03, 0x03,
+ 0x12, 0x27, 0xf1, 0xd0,
+ 0xc2, 0xa2, 0xe1, 0x11, 0x00, 0x0f, 0x35, 0x54, 0x11, 0x22, 0x35, 0x52,
+ 0x32, 0x23, 0x10, 0xef,
+ 0xd1, 0x07, 0x22, 0xef, 0x00, 0x41, 0x01, 0xb0, 0xe0, 0x05, 0xd1, 0x8d,
+ 0xf0, 0x14, 0x11, 0xff,
+ 0xed, 0x00, 0x35, 0x22, 0xf0, 0x2f, 0x71, 0x10, 0x1e, 0x1d, 0x0b, 0x31,
+ 0x56, 0x0f, 0xed, 0xee,
+ 0x0f, 0x10, 0x21, 0xeb, 0xee, 0xef, 0xbb, 0xdd, 0x10, 0x21, 0x9d, 0xda,
+ 0x20, 0x30, 0x00, 0x00,
+ 0x1f, 0x0a, 0x2f, 0x71, 0x41, 0x0f, 0xed, 0xde, 0x00, 0x00, 0x31, 0x10,
+ 0x0e, 0xed, 0xab, 0xef,
+ 0x0f, 0x20, 0x1e, 0xdd, 0xf0, 0x46, 0x10, 0xcd, 0xba, 0xde, 0xde, 0xfe,
+ 0x23, 0x02, 0xdf, 0x10,
+ 0x63, 0x02, 0xe1, 0x05, 0xe0, 0xce, 0xdd, 0x03, 0x17, 0x00, 0xe0, 0xdf,
+ 0xf0, 0x45, 0x12, 0xe0,
+ 0x00, 0x71, 0x32, 0x13, 0x13, 0x11, 0x47, 0x52, 0x12, 0x00, 0x0e, 0xdf,
+ 0x01, 0x12, 0xe0, 0xd0,
+ 0xbf, 0x0e, 0x00, 0xf0, 0xcd, 0xe1, 0xd0, 0xc8, 0x0d, 0x71, 0x00, 0x0e,
+ 0x00, 0x26, 0x11, 0xe0,
+ 0xdb, 0x0e, 0x45, 0x01, 0xbe, 0xfe, 0xef, 0xf0, 0x00, 0x30, 0x02, 0xaf,
+ 0xef, 0x01, 0x00, 0x11,
+ 0x00, 0xed, 0xdb, 0xcc, 0xf9, 0x40, 0x74, 0x44, 0x01, 0x32, 0x43, 0x00,
+ 0x00, 0x0e, 0x10, 0x00,
+ 0xff, 0xec, 0xee, 0x21, 0x34, 0x42, 0x43, 0x21, 0x42, 0x20, 0x0f, 0x11,
+ 0x0f, 0xdc, 0xde, 0xbf,
+ 0xe2, 0x00, 0xe8, 0xae, 0x16, 0x44, 0x21, 0x10, 0x22, 0x55, 0x21, 0x21,
+ 0x10, 0xfe, 0xdc, 0xf0,
+ 0x03, 0xc0, 0xde, 0x2f, 0x60, 0x10, 0x32, 0x10, 0x0e, 0x04, 0xf2, 0xed,
+ 0xfd, 0x2e, 0x4e, 0xf8,
+ 0xbe, 0xde, 0xbd, 0xca, 0xef, 0xff, 0xfe, 0xef, 0xce, 0xee, 0xf0, 0xfe,
+ 0xba, 0xf0, 0x01, 0x00,
+ 0xdd, 0xef, 0xff, 0x0f, 0x20, 0x77, 0x65, 0x01, 0x00, 0x00, 0xff, 0xef,
+ 0x03, 0x15, 0x02, 0x01,
+ 0x11, 0x20, 0x00, 0x31, 0x73, 0x00, 0xfc, 0xff, 0x24, 0x22, 0xee, 0xde,
+ 0x33, 0x32, 0xed, 0x11,
+ 0x33, 0x2c, 0x7d, 0x40, 0x00, 0x02, 0x27, 0x22, 0x20, 0x10, 0x2e, 0x53,
+ 0x24, 0x12, 0x47, 0x22,
+ 0x21, 0x72, 0x24, 0x24, 0x22, 0x10, 0x0e, 0xff, 0x20, 0x30, 0x0e, 0x0d,
+ 0xcb, 0xbe, 0xef, 0xcc,
+ 0xdd, 0x00, 0x03, 0x0e, 0x0d, 0xe8, 0x8c, 0xee, 0x00, 0x00, 0xef, 0xdf,
+ 0xee, 0x00, 0x54, 0x0f,
+ 0xfd, 0xff, 0x11, 0x77, 0x12, 0x00, 0x0e, 0xea, 0xee, 0x20, 0x31, 0x0e,
+ 0x1e, 0x00, 0xcf, 0xe1,
+ 0xe1, 0xdf, 0x03, 0x05, 0x8f, 0xde, 0x0f, 0xee, 0xdd, 0xdd, 0x02, 0xf7,
+ 0xb0, 0xe0, 0xd1, 0xd0,
+ 0xdd, 0x0b, 0x1f, 0x31, 0x23, 0xf0, 0xbf, 0x00, 0x43, 0x56, 0x00, 0xe0,
+ 0xd0, 0x01, 0x21, 0x02,
+ 0x16, 0x00, 0xd0, 0xf0, 0xc0, 0xee, 0x31, 0x77, 0x65, 0x00, 0xee, 0x0e,
+ 0x20, 0x30, 0x0f, 0xf0,
+ 0x00, 0x0d, 0x0d, 0x0d, 0xbe, 0xc0, 0xf7, 0x12, 0x00, 0xf0, 0x02, 0x03,
+ 0x12, 0xed, 0xee, 0x26,
+ 0x04, 0xa0, 0xf0, 0xcc, 0xdd, 0x00, 0xf0, 0xbd, 0xf0, 0x04, 0x24, 0x00,
+ 0xbd, 0x00, 0x02, 0xe0,
+ 0xae, 0xff, 0xfc, 0x09, 0x0f, 0x60, 0x00, 0xec, 0xfe, 0x10, 0x10, 0x12,
+ 0x22, 0x10, 0x0f, 0x21,
+ 0x55, 0x22, 0x02, 0xbf, 0xfd, 0x10, 0x22, 0x00, 0x00, 0x17, 0x05, 0x05,
+ 0xcd, 0x00, 0x41, 0x01,
+ 0x9a, 0xe3, 0xfc, 0x02, 0x9e, 0xe5, 0xb8, 0x04, 0xff, 0x74, 0x15, 0xee,
+ 0xd9, 0x00, 0x31, 0x13,
+ 0x40, 0x0d, 0xf0, 0xc0, 0xd0, 0x31, 0x62, 0x0f, 0xff, 0x0f, 0x0d, 0xf3,
+ 0xe0, 0xb8, 0x20, 0x31,
+ 0x03, 0x10, 0x0e, 0xc8, 0xef, 0xa0, 0xee, 0x22, 0x63, 0x0f, 0xcb, 0x00,
+ 0x00, 0xff, 0x02, 0x43,
+ 0x0e, 0xcd, 0xfd, 0x01, 0x35, 0x0d, 0xcd, 0x11, 0x33, 0x01, 0x01, 0x0d,
+ 0xdd, 0x04, 0x46, 0xe0,
+ 0xce, 0x00, 0x20, 0x00, 0x00, 0x0d, 0x1f, 0x10, 0xe3, 0xf2, 0xf4, 0x04,
+ 0xfe, 0xaa, 0x20, 0x00,
+ 0xe5, 0x01, 0x8a, 0xcf, 0x31, 0x54, 0x00, 0xed, 0xe0, 0x20, 0x77, 0x00,
+ 0xfd, 0xf0, 0x02, 0x20,
+ 0xee, 0xe0, 0x14, 0x40, 0xff, 0x0d, 0x43, 0x12, 0xee, 0xfd, 0x14, 0x10,
+ 0x0f, 0x22, 0x72, 0xfb,
+ 0xbd, 0xf0, 0x00, 0x20, 0x0d, 0x04, 0x34, 0xee, 0xbb, 0x11, 0x54, 0x0d,
+ 0xdd, 0x00, 0x24, 0x10,
+ 0x1e, 0xff, 0xab, 0x22, 0x76, 0x00, 0xfd, 0xe0, 0x0f, 0x1f, 0x01, 0x13,
+ 0xfe, 0xdb, 0x21, 0x32,
+ 0xef, 0xdd, 0x12, 0x77, 0x00, 0x0e, 0xff, 0xf0, 0x00, 0x14, 0x1f, 0x30,
+ 0xff, 0xaf, 0x0e, 0xf0,
+ 0x01, 0x22, 0x36, 0x00, 0x01, 0x20, 0xe0, 0xd0, 0xd1, 0x02, 0x23, 0xad,
+ 0xab, 0x37, 0x30, 0xdf,
+ 0xf0, 0x32, 0x10, 0xdf, 0xb0, 0x21, 0x21, 0x11, 0x01, 0xbe, 0x00, 0x31,
+ 0x00, 0x01, 0xdc, 0xe9,
+ 0x01, 0x45, 0xf1, 0x00, 0xf0, 0xce, 0x00, 0x00, 0xef, 0xab, 0x02, 0x35,
+ 0xef, 0xde, 0x40, 0x00,
+ 0x02, 0x74, 0x01, 0xde, 0xce, 0x12, 0x10, 0xcd, 0x01, 0x42, 0xfe, 0xff,
+ 0x15, 0x00, 0xeb, 0x20,
+ 0x43, 0xdf, 0xbd, 0x20, 0x11, 0x00, 0xcc, 0x0e, 0x56, 0xf1, 0xf0, 0x0f,
+ 0x41, 0xff, 0x98, 0x10,
+ 0x37, 0x10, 0xee, 0xe0, 0x0f, 0x10, 0x11, 0x21, 0x00, 0x20, 0x11, 0x00,
+ 0xdf, 0x0e, 0x73, 0x03,
+ 0xba, 0x00, 0x21, 0x0f, 0x20, 0x23, 0x00, 0x00, 0x01, 0xfc, 0x1f, 0x71,
+ 0x12, 0xee, 0xe2, 0x02,
+ 0x09, 0xdc, 0x0f, 0x30, 0xd0, 0xf7, 0x40, 0xef, 0xde, 0xdf, 0x51, 0x63,
+ 0x0f, 0xf0, 0xee, 0xcc,
+ 0xfd, 0x00, 0x45, 0x00, 0xed, 0xe0, 0x00, 0x3f, 0x33, 0x01, 0xd0, 0x0d,
+ 0x36, 0x73, 0xed, 0xbb,
+ 0x01, 0x16, 0x00, 0x0e, 0xdd, 0xf0, 0x76, 0x31, 0xde, 0xde, 0x54, 0x01,
+ 0xec, 0xe0, 0x43, 0x00,
+ 0xff, 0x01, 0x43, 0xec, 0xff, 0x10, 0x36, 0x20, 0x3f, 0x00, 0xc0, 0xff,
+ 0x01, 0x55, 0x42, 0x0f,
+ 0xfc, 0x00, 0x23, 0x20, 0x12, 0x73, 0x00, 0xda, 0x00, 0x41, 0x11, 0x0f,
+ 0xff, 0xf0, 0x00, 0x34,
+ 0x42, 0xfd, 0xdc, 0x13, 0x24, 0x00, 0x40, 0x0d, 0xff, 0xd0, 0x40, 0x01,
+ 0x95, 0x02, 0x0d, 0xe9,
+ 0xf1, 0x42, 0x3f, 0xec, 0xd0, 0x03, 0xf1, 0x40, 0x40, 0x0e, 0xe0, 0x00,
+ 0xdd, 0xff, 0x1e, 0xb8,
+ 0x3f, 0x77, 0x11, 0xdf, 0x00, 0x00, 0xac, 0x00, 0xf0, 0xe0, 0xf0, 0xef,
+ 0x10, 0x72, 0x00, 0xfb,
+ 0xff, 0x24, 0x01, 0xff, 0x0d, 0x0d, 0x00, 0x47, 0xd0, 0xcd, 0x00, 0x00,
+ 0x00, 0x3f, 0xef, 0x8f,
+ 0xff, 0x02, 0x13, 0xfc, 0xee, 0x76, 0x02, 0x00, 0x0c, 0xde, 0x00, 0x23,
+ 0x0f, 0xee, 0xfe, 0x0c,
+ 0xfe, 0x43, 0x05, 0xdd, 0x9d, 0x0e, 0x01, 0x02, 0x2d, 0x0c, 0xb0, 0xff,
+ 0x03, 0x32, 0x1b, 0xdd,
+ 0xc0, 0x0d, 0x02, 0x07, 0xef, 0xa9, 0x10, 0x33, 0x00, 0x10, 0xed, 0xb0,
+ 0x00, 0x1f, 0x00, 0x37,
+ 0x02, 0xad, 0xfd, 0x0d, 0xf0, 0x01, 0x14, 0x30, 0xbb, 0xf0, 0x25, 0x10,
+ 0xbd, 0xf0, 0x12, 0x10,
+ 0xde, 0xdf, 0x00, 0x0e, 0xde, 0xfe, 0x26, 0x10, 0xe0, 0x0e, 0x41, 0xd0,
+ 0xed, 0x75, 0x52, 0xbe,
+ 0x00, 0x03, 0x10, 0x0c, 0xff, 0x00, 0xf0, 0x22, 0x10, 0xfd, 0x37, 0x73,
+ 0xfb, 0xdf, 0x42, 0x43,
+ 0xee, 0xf1, 0xf2, 0xd9, 0x0f, 0x20, 0x02, 0x00, 0x33, 0x30, 0x8b, 0x00,
+ 0x00, 0x00, 0xdd, 0x20,
+ 0x32, 0x02, 0x02, 0xec, 0xdd, 0x03, 0x67, 0x20, 0xec, 0xc0, 0x01, 0x11,
+ 0x62, 0x01, 0xdc, 0x0f,
+ 0x43, 0xf1, 0xe1, 0x34, 0x32, 0x31, 0x04, 0xdd, 0xce, 0x34, 0x43, 0xf0,
+ 0xc0, 0x04, 0x02, 0x33,
+ 0x43, 0xff, 0x00, 0x45, 0x00, 0xcf, 0x10, 0x03, 0xc0, 0xd0, 0x0c, 0x2c,
+ 0x12, 0x37, 0x47, 0x0f,
+ 0x70, 0x43, 0xce, 0xef, 0x31, 0x24, 0xf0, 0xdd, 0x31, 0x64, 0x00, 0x0c,
+ 0x00, 0x02, 0x01, 0x11,
+ 0xfe, 0xef, 0x42, 0x33, 0x00, 0x21, 0x12, 0xfd, 0xbf, 0xd9, 0xbd, 0x0e,
+ 0x47, 0x63, 0x00, 0xeb,
+ 0x00, 0x12, 0x00, 0xfe, 0xf0, 0x2f, 0x10, 0x0f, 0x0e, 0x00, 0x25, 0x0e,
+ 0x1d, 0x30, 0x42, 0x00,
+ 0xdc, 0xce, 0xe1, 0x43, 0x0b, 0x9e, 0x12, 0x21, 0xfe, 0xfe, 0x00, 0x00,
+ 0x0f, 0xdb, 0x9f, 0x00,
+ 0x20, 0x10, 0x01, 0x00, 0x08, 0xee, 0xe0, 0xd0, 0xbd, 0xdd, 0x14, 0x77,
+ 0x74, 0xfe, 0xcc, 0x00,
+ 0x12, 0x00, 0x0f, 0x01, 0x10, 0xc9, 0x00, 0x02, 0x21, 0x31, 0xfe, 0xbf,
+ 0x0f, 0x34, 0x21, 0xff,
+ 0x9d, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0x02, 0x00, 0x0e, 0x02, 0x15, 0x00,
+ 0xe0, 0xf1, 0x23, 0xe8,
+ 0x9e, 0xf0, 0xf1, 0xef, 0xfe, 0x0f, 0xcf, 0xef, 0x23, 0x77, 0x13, 0xfd,
+ 0xdc, 0x22, 0x13, 0xec,
+ 0xcb, 0x00, 0x33, 0x43, 0xef, 0xee, 0x10, 0x20, 0x20, 0x44, 0x03, 0xbf,
+ 0xd9, 0x0f, 0x21, 0x41,
+ 0x0f, 0xe0, 0xf2, 0x00, 0x4d, 0x1e, 0x03, 0x37, 0xff, 0x8e, 0xdf, 0xff,
+ 0x21, 0x43, 0x05, 0x10,
+ 0x0d, 0xdf, 0x00, 0x32, 0x10, 0x00, 0x04, 0x00, 0x2f, 0x2f, 0x22, 0x01,
+ 0xbb, 0x42, 0x56, 0x00,
+ 0x20, 0xef, 0xce, 0x23, 0x54, 0x10, 0x10, 0x30, 0xfb, 0xce, 0x02, 0xf5,
+ 0xaf, 0x0e, 0x42, 0x20,
+ 0x00, 0xce, 0xfd, 0x11, 0x11, 0x00, 0xbc, 0x0d, 0x00, 0x1e, 0x04, 0xfa,
+ 0xbe, 0x34, 0x11, 0x0e,
+ 0xff, 0x43, 0x47, 0x00, 0xce, 0x00, 0xe1, 0xe0, 0x30, 0x33, 0xbe, 0xfb,
+ 0x00, 0x20, 0x02, 0x25,
+ 0x30, 0x4f, 0x3e, 0xc0, 0xb0, 0x57, 0x02, 0xfd, 0xf0, 0x00, 0x0f, 0x10,
+ 0x41, 0x00, 0xde, 0x0f,
+ 0x0d, 0x13, 0x07, 0x45, 0x50, 0x0e, 0x00, 0x02, 0x34, 0x0f, 0xba, 0x10,
+ 0x74, 0x31, 0xe0, 0xed,
+ 0x0e, 0x10, 0x12, 0x12, 0x00, 0x1e, 0x01, 0xf4, 0x11, 0x42, 0x10, 0x32,
+ 0x55, 0xfd, 0x99, 0x00,
+ 0x11, 0x10, 0xfe, 0xf0, 0x03, 0x00, 0x2f, 0x1e, 0x0c, 0x0e, 0xf0, 0x15,
+ 0x74, 0x41, 0x00, 0xec,
+ 0x00, 0xee, 0xe0, 0x22, 0x1e, 0xb8, 0x2f, 0x64, 0xe0, 0xed, 0x12, 0x32,
+ 0x00, 0xed, 0xff, 0x20,
+ 0xf2, 0xa0, 0x0b, 0x20, 0x10, 0xee, 0x35, 0x52, 0x0f, 0xef, 0x00, 0xec,
+ 0xce, 0x00, 0x77, 0x01,
+ 0xef, 0xdd, 0x00, 0x41, 0x0f, 0xee, 0xe1, 0x0f, 0x0e, 0x46, 0x22, 0xed,
+ 0xce, 0x00, 0x10, 0x01,
+ 0x23, 0x22, 0x25, 0x0e, 0xaa, 0x00, 0x02, 0xdf, 0xf0, 0x41, 0xf2, 0xbd,
+ 0xfd, 0x00, 0x12, 0x13,
+ 0x33, 0x00, 0xf1, 0xdd, 0xf8, 0xd0, 0xf3, 0x02, 0xbd, 0xd0, 0xc1, 0xce,
+ 0xfe, 0x47, 0x44, 0xce,
+ 0xce, 0x24, 0x34, 0x00, 0xba, 0xf0, 0x00, 0x13, 0x1f, 0x0f, 0xdd, 0x90,
+ 0x11, 0x23, 0x0f, 0xe0,
+ 0x33, 0x10, 0xfe, 0x12, 0xf2, 0x8f, 0xed, 0x01, 0x0f, 0x1e, 0x1f, 0xf8,
+ 0xdb, 0x10, 0x12, 0x03,
+ 0x01, 0x01, 0xa0, 0xed, 0x22, 0x35, 0x12, 0xe0, 0x00, 0x00, 0xfe, 0x0f,
+ 0x2b, 0x30, 0x20, 0x00,
+ 0x70, 0x57, 0xff, 0xdd, 0x02, 0x35, 0x0f, 0x0f, 0x10, 0x01, 0xf0, 0x0c,
+ 0x1f, 0xd0, 0xa1, 0x00,
+ 0x0c, 0x3d, 0xe0, 0x83, 0x00, 0x51, 0xfa, 0xcb, 0x0f, 0x20, 0x11, 0x00,
+ 0xf3, 0x11, 0x55, 0x00,
+ 0xba, 0xed, 0x11, 0x67, 0xf0, 0xed, 0x00, 0x01, 0x22, 0x0f, 0x00, 0x32,
+ 0x02, 0xef, 0xee, 0x00,
+ 0xee, 0xef, 0x23, 0x30, 0x0a, 0x00, 0xa1, 0xf1, 0x03, 0x50, 0x23, 0x00,
+ 0xf1, 0xcf, 0xf3, 0x37,
+ 0x0e, 0xed, 0xe0, 0x90, 0xfd, 0xfa, 0x40, 0x57, 0x01, 0x0f, 0xef, 0x24,
+ 0x21, 0x1f, 0x0d, 0xff,
+ 0xe2, 0xf3, 0xd0, 0xee, 0x4d, 0x60, 0x00, 0xf0, 0xbf, 0x1e, 0x47, 0x13,
+ 0xfd, 0x01, 0x25, 0x00,
+ 0x8b, 0xff, 0x12, 0x2f, 0x0e, 0x10, 0x01, 0xff, 0xed, 0x00, 0x50, 0x25,
+ 0x0f, 0xeb, 0xf0, 0xf2,
+ 0xc0, 0x0e, 0x43, 0x0f, 0xfa, 0x00, 0x33, 0x1e, 0xcb, 0xf0, 0x01, 0x02,
+ 0x20, 0xed, 0xce, 0x10,
+ 0x53, 0x00, 0xbe, 0x0f, 0x2d, 0x22, 0x57, 0xff, 0xc8, 0x01, 0x42, 0x00,
+ 0x00, 0xdd, 0xe0, 0x01,
+ 0x43, 0x00, 0xe1, 0x00, 0xeb, 0x63, 0x35, 0xee, 0xed, 0xe0, 0xf1, 0x00,
+ 0x41, 0x44, 0xe1, 0xe0,
+ 0xfe, 0x20, 0x00, 0xf2, 0x36, 0x00, 0xc0, 0x0e, 0x23, 0xc0, 0x8b, 0x00,
+ 0x12, 0x02, 0x02, 0xcb,
+ 0xfe, 0x10, 0x43, 0x04, 0xf1, 0x10, 0xfe, 0xdd, 0x00, 0x32, 0xfd, 0x9a,
+ 0xee, 0xdf, 0xff, 0xe0,
+ 0x47, 0x30, 0xee, 0xdd, 0x14, 0x43, 0xbe, 0xdb, 0x00, 0x34, 0x00, 0xbf,
+ 0x0e, 0xff, 0x30, 0x21,
+ 0x01, 0x02, 0xcb, 0xae, 0x00, 0x43, 0x12, 0x0d, 0xfd, 0x01, 0x02, 0x10,
+ 0xff, 0xf2, 0x01, 0x0d,
+ 0xc8, 0x0f, 0x00, 0x1d, 0x0d, 0xf4, 0x75, 0x00, 0xdf, 0xbf, 0x00, 0x40,
+ 0x33, 0xe0, 0xf3, 0x47,
+ 0x1f, 0xd8, 0xf0, 0x40, 0x12, 0x10, 0x00, 0x01, 0xde, 0x20, 0x63, 0x00,
+ 0xff, 0x00, 0x0e, 0x0d,
+ 0x2f, 0xf0, 0xb1, 0x04, 0x2f, 0xe9, 0x13, 0x44, 0xcb, 0x0e, 0x21, 0x01,
+ 0xd0, 0x1c, 0x70, 0x01,
+ 0xd1, 0xe0, 0x0c, 0xe0, 0xde, 0xf0, 0x15, 0x61, 0x20, 0x31, 0xf0, 0xc0,
+ 0x01, 0xed, 0x72, 0x55,
+ 0xed, 0xe0, 0x04, 0x0d, 0x1e, 0x25, 0x12, 0xf0, 0x00, 0x0d, 0x9c, 0x01,
+ 0x44, 0x22, 0x14, 0xdd,
+ 0xbd, 0x04, 0x35, 0xee, 0xfe, 0x33, 0x23, 0xdf, 0xeb, 0x00, 0x24, 0x51,
+ 0x00, 0x40, 0x32, 0x02,
+ 0x00, 0x31, 0x23, 0x0e, 0x23, 0x67, 0x0f, 0xdc, 0x00, 0x00, 0x32, 0x01,
+ 0xff, 0x21, 0x75, 0x30,
+ 0x0f, 0x03, 0x26, 0x00, 0xde, 0xff, 0x10, 0x74, 0x20, 0xec, 0x01, 0x54,
+ 0xee, 0xda, 0x11, 0x52,
+ 0x00, 0xff, 0x00, 0x02, 0x20, 0x11, 0xfe, 0xbb, 0x00, 0x04, 0x10, 0x1e,
+ 0xed, 0xdf, 0x02, 0x33,
+ 0x73, 0x30, 0xcc, 0xf0, 0x20, 0x10, 0xe2, 0xbe, 0x0e, 0x3a, 0x0e, 0x00,
+ 0xe2, 0xe0, 0xdc, 0x0f,
+ 0x75, 0x61, 0xdb, 0xfe, 0x11, 0x04, 0xff, 0xde, 0xee, 0x1f, 0x52, 0x14,
+ 0xef, 0xcb, 0x00, 0x20,
+ 0xe0, 0x00, 0x75, 0x0f, 0xca, 0x00, 0x22, 0x00, 0xdf, 0x10, 0x30, 0x11,
+ 0xef, 0xee, 0x0f, 0x10,
+ 0xde, 0xf0, 0x26, 0xde, 0x8c, 0x02, 0x32, 0xe0, 0xdf, 0x00, 0x2e, 0x71,
+ 0xee, 0xed, 0x12, 0x37,
+ 0x10, 0x9a, 0xef, 0x00, 0x01, 0x00, 0x0d, 0xff, 0x02, 0xf1, 0x12, 0x0d,
+ 0x0c, 0x03, 0x24, 0xbc,
+ 0xee, 0x0e, 0x01, 0xf1, 0xce, 0xdd, 0xe0, 0x04, 0x3f, 0x3d, 0x46, 0xd0,
+ 0xb0, 0x00, 0x44, 0xef,
+ 0xa8, 0x00, 0x11, 0xe0, 0xde, 0xfe, 0xef, 0xd0, 0x64, 0x22, 0xdc, 0xf0,
+ 0x32, 0x12, 0xf0, 0x00,
+ 0x20, 0xcc, 0xcd, 0x24, 0x52, 0x0e, 0xfc, 0x00, 0x00, 0x33, 0x21, 0xff,
+ 0xf0, 0x77, 0x36, 0x11,
+ 0xe0, 0xfd, 0xf0, 0xc0, 0x00, 0x20, 0x61, 0x00, 0xdd, 0xfb, 0x42, 0x53,
+ 0xfe, 0xfe, 0x00, 0xf0,
+ 0xef, 0x02, 0xf1, 0x1e, 0x3d, 0x05, 0x01, 0xff, 0x0c, 0x0d, 0x54, 0xf4,
+ 0x8d, 0x00, 0x37, 0xe1,
+ 0xde, 0x34, 0x75, 0x00, 0xfe, 0x01, 0x12, 0xff, 0xfe, 0x10, 0x34, 0x33,
+ 0x00, 0x9c, 0xf1, 0x03,
+ 0x21, 0x01, 0xf2, 0x14, 0x12, 0x23, 0xef, 0xfb, 0xdf, 0xd0, 0xf7, 0xb0,
+ 0xfc, 0x70, 0x45, 0xe0,
+ 0xfe, 0x12, 0x22, 0x00, 0xf0, 0x11, 0x20, 0x12, 0xcf, 0x00, 0x75, 0x10,
+ 0xfd, 0xf0, 0xf0, 0xed,
+ 0x20, 0x47, 0x00, 0xff, 0x32, 0x11, 0xed, 0xff, 0x10, 0x00, 0x0f, 0x00,
+ 0x34, 0x00, 0xba, 0x0f,
+ 0xca, 0x40, 0x71, 0x11, 0x00, 0xf3, 0xcd, 0xed, 0x02, 0x51, 0x0d, 0xd9,
+ 0x21, 0x21, 0x00, 0xee,
+ 0xfb, 0x10, 0x10, 0xdf, 0xcd, 0x11, 0x31, 0xfe, 0xe0, 0x64, 0x10, 0xfb,
+ 0x0f, 0x00, 0xd0, 0xd1,
+ 0x0e, 0x5a, 0xef, 0xa0, 0xf0, 0x01, 0xee, 0x00, 0x24, 0xcf, 0xe0, 0xe0,
+ 0x30, 0x70, 0x54, 0xe3,
+ 0xdc, 0x0e, 0x0f, 0xfc, 0x11, 0x01, 0xff, 0x13, 0x09, 0xcb, 0x12, 0x23,
+ 0xef, 0xac, 0x11, 0x57,
+ 0x00, 0xcd, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xd1, 0x24, 0x10, 0xde, 0xc1,
+ 0x01, 0xf0, 0x2f, 0x42,
+ 0xde, 0xbb, 0x10, 0x02, 0x0d, 0xba, 0x0f, 0x51, 0xf2, 0xef, 0x12, 0x11,
+ 0xcc, 0xf0, 0x14, 0x31,
+ 0x00, 0x0f, 0x00, 0x25, 0x40, 0xee, 0xee, 0x31, 0x20, 0x0e, 0xc3, 0x80,
+ 0xfe, 0x11, 0x55, 0x00,
+ 0x0d, 0xf1, 0x00, 0x00, 0x07, 0x24, 0x34, 0x1f, 0xdc, 0xaf, 0xfd, 0xf2,
+ 0xe1, 0x00, 0x57, 0x01,
+ 0x9d, 0x0f, 0x25, 0x31, 0x0f, 0xef, 0x14, 0x11, 0x0c, 0x0f, 0x00, 0x22,
+ 0x14, 0x51, 0x0f, 0xdd,
+ 0x00, 0x23, 0x43, 0x15, 0x21, 0x00, 0xdd, 0x00, 0x0f, 0x00, 0x0f, 0x8c,
+ 0xfe, 0xf0, 0x31, 0x10,
+ 0x01, 0x14, 0xef, 0xed, 0xeb, 0xcb, 0x21, 0x77, 0x20, 0x9d, 0x00, 0x02,
+ 0x0c, 0xfe, 0x11, 0x35,
+ 0x22, 0xce, 0xcb, 0x00, 0x20, 0x65, 0xf0, 0xee, 0xf0, 0x00, 0x21, 0x10,
+ 0x00, 0xee, 0xf0, 0x00,
+ 0x53, 0x21, 0xfd, 0xef, 0x35, 0x32, 0xf0, 0xdf, 0x42, 0x20, 0xce, 0x02,
+ 0x37, 0x12, 0xfc, 0xdd,
+ 0x11, 0x72, 0x00, 0xf2, 0x25, 0x20, 0x40, 0x13, 0x00, 0x0f, 0x74, 0x34,
+ 0xfe, 0x1d, 0x30, 0x01,
+ 0x37, 0x60, 0x10, 0x30, 0x02, 0xbf, 0xff, 0x13, 0x12, 0x32, 0x36, 0xec,
+ 0xad, 0x01, 0x35, 0x01,
+ 0x0f, 0x1f, 0x2f, 0x0d, 0xdd, 0x03, 0x27, 0x40, 0xfe, 0x0f, 0x72, 0x44,
+ 0xdf, 0xda, 0xf0, 0x11,
+ 0x41, 0xff, 0xfe, 0x01, 0x00, 0x9c, 0x00, 0x56, 0x00, 0xee, 0xe0, 0x10,
+ 0x20, 0x10, 0x02, 0x00,
+ 0xab, 0x0f, 0x01, 0x23, 0x2f, 0xdb, 0xf0, 0x44, 0x0e, 0xfd, 0x11, 0x44,
+ 0xe0, 0xef, 0x00, 0xf1,
+ 0xef, 0x0f, 0xee, 0x00, 0x31, 0x10, 0xec, 0xad, 0x01, 0x77, 0x11, 0xf0,
+ 0xcd, 0x0f, 0x30, 0x22,
+ 0x13, 0x25, 0xdf, 0xa9, 0x00, 0x41, 0x01, 0x0f, 0xff, 0xf0, 0xc0, 0xe0,
+ 0xff, 0x00, 0x24, 0x21,
+ 0xce, 0x00, 0x24, 0xff, 0x8a, 0x00, 0x45, 0xff, 0xbd, 0x00, 0x34, 0x0f,
+ 0xde, 0x00, 0x14, 0x00,
+ 0xee, 0x00, 0x15, 0x00, 0xce, 0xdf, 0x01, 0x21, 0xee, 0xdf, 0xe0, 0xd0,
+ 0x9e, 0x03, 0x10, 0xf8,
+ 0x01, 0x41, 0xe1, 0x12, 0x00, 0xfc, 0xd0, 0x01, 0xc0, 0x0f, 0x25, 0xf2,
+ 0x8c, 0xeb, 0x0f, 0x31,
+ 0x02, 0x8f, 0xff, 0x00, 0x01, 0x20, 0x03, 0x01, 0x0e, 0xfc, 0xfe, 0x11,
+ 0x40, 0x0a, 0xbf, 0xe0,
+ 0x12, 0x74, 0x0f, 0xea, 0x11, 0x44, 0xff, 0xee, 0x10, 0x21, 0xf0, 0xee,
+ 0xfd, 0x00, 0x1f, 0x0d,
+ 0x00, 0xf0, 0xf9, 0x10, 0x74, 0x12, 0xdf, 0xfd, 0xcd, 0xfc, 0x23, 0x56,
+ 0xff, 0xbb, 0x0f, 0x00,
+ 0x10, 0xe0, 0x0f, 0x02, 0x12, 0xf0, 0xec, 0xfe, 0xf0, 0x34, 0x44, 0xd1,
+ 0xaf, 0x0f, 0x40, 0x20,
+ 0xf0, 0xcb, 0x01, 0x34, 0xee, 0xde, 0x01, 0x34, 0xfe, 0xfd, 0x75, 0x33,
+ 0xee, 0xbe, 0x00, 0x14,
+ 0x24, 0xcb, 0xde, 0x51, 0x11, 0xef, 0xde, 0xf1, 0x02, 0x0f, 0x05, 0x05,
+ 0x6f, 0x00, 0xc9, 0x00,
+ 0x8f, 0xea, 0xf3, 0xf9, 0xd3, 0xea, 0xc6, 0xfb, 0xf2, 0x36, 0x72, 0x23,
+ 0x21, 0x0e, 0x0e, 0x31,
+ 0x00, 0x88, 0x10, 0x34, 0x00, 0xfd, 0x32, 0x11, 0xff, 0x00, 0x01, 0x24,
+ 0x00, 0xbc, 0xce, 0x44,
+ 0x76, 0x0f, 0xdc, 0x0f, 0x00, 0x30, 0x10, 0xf0, 0xd0, 0x40, 0x42, 0x00,
+ 0xd0, 0xec, 0x01, 0x01,
+ 0xff, 0x1c, 0x3f, 0x30, 0x34, 0xff, 0x1f, 0x71, 0x0e, 0xfe, 0x0d, 0xef,
+ 0x11, 0x77, 0x05, 0x0d,
+ 0xee, 0x01, 0x13, 0x72, 0x10, 0x01, 0xe0, 0xdc, 0xdb, 0xfe, 0x32, 0x45,
+ 0x33, 0x01, 0xbd, 0x00,
+ 0x1f, 0x20, 0x25, 0x33, 0x00, 0x0f, 0xee, 0xed, 0xd0, 0xe2, 0xb3, 0xbf,
+ 0xda, 0x04, 0x34, 0x10,
+ 0x0e, 0x71, 0x47, 0xf4, 0xee, 0x0e, 0x31, 0x00, 0xe0, 0xcf, 0xe0, 0xcf,
+ 0x00, 0x21, 0x12, 0x11,
+ 0xd2, 0xc0, 0x11, 0x61, 0x02, 0x02, 0x11, 0x0e, 0xa8, 0x0d, 0x01, 0x20,
+ 0x0e, 0xbc, 0xe0, 0x01,
+ 0x03, 0x2d, 0x1f, 0x06, 0xe0, 0xcc, 0x01, 0x04, 0x31, 0xeb, 0x9c, 0x00,
+ 0x04, 0x0f, 0x0f, 0x10,
+ 0x10, 0x20, 0x60, 0x12, 0xf0, 0xc0, 0xe0, 0x00, 0x24, 0x37, 0x11, 0xde,
+ 0xdd, 0xfe, 0xfc, 0x40,
+ 0x74, 0x23, 0xdb, 0xbf, 0x01, 0x24, 0x0e, 0xee, 0x04, 0x13, 0x2f, 0x3d,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0xe0, 0xc0, 0x33, 0x70, 0xfa, 0xef, 0x45, 0x44, 0x11, 0xcd, 0xfc, 0x02,
+ 0x00, 0x00, 0x5f, 0x0f,
+ 0xdf, 0xfd, 0x22, 0x32, 0xcd, 0xdf, 0x14, 0x0c, 0x0d, 0x20, 0x20, 0x77,
+ 0x0e, 0xda, 0x00, 0x11,
+ 0x00, 0x90, 0x00, 0x00, 0xf0, 0x10, 0x52, 0x10, 0xef, 0xf0, 0x00, 0x36,
+ 0x10, 0xdf, 0x0e, 0x66,
+ 0x00, 0xcd, 0xff, 0x13, 0x31, 0x0c, 0x02, 0x26, 0xce, 0xee, 0x33, 0x76,
+ 0x00, 0xde, 0x21, 0x43,
+ 0x00, 0xdd, 0xde, 0x10, 0x42, 0x36, 0x31, 0xd0, 0xfe, 0x11, 0x22, 0x10,
+ 0xe0, 0x21, 0x77, 0x70,
+ 0x0e, 0xdf, 0x22, 0x00, 0x10, 0x23, 0x00, 0xcc, 0x11, 0x24, 0xff, 0x0e,
+ 0x13, 0x11, 0x47, 0x52,
+ 0xee, 0xfc, 0x10, 0x64, 0x02, 0x00, 0xdd, 0xfe, 0x01, 0x0f, 0x3e, 0x00,
+ 0xe0, 0xae, 0xf3, 0xf4,
+ 0x0e, 0x0d, 0x77, 0x22, 0xcb, 0x0e, 0x01, 0x01, 0x0c, 0x00, 0x13, 0x0e,
+ 0x00, 0x30, 0x31, 0xe0,
+ 0xce, 0x0f, 0x10, 0x00, 0xbe, 0xfe, 0x00, 0x11, 0x4c, 0xfa, 0xed, 0x0d,
+ 0x00, 0xba, 0xe0, 0x21,
+ 0x42, 0xee, 0xde, 0x03, 0x55, 0x1e, 0xda, 0xdf, 0x0f, 0xfe, 0xee, 0x40,
+ 0x31, 0xe0, 0xa0, 0x0d,
+ 0x0e, 0xef, 0x16, 0x22, 0xae, 0xfe, 0x12, 0x10, 0x0c, 0x0d, 0x4d, 0xfa,
+ 0x9e, 0x02, 0x01, 0xdd,
+ 0xf1, 0x26, 0xed, 0xef, 0x53, 0x10, 0xf8, 0xe0, 0x00, 0x00, 0xdf, 0x8c,
+ 0x01, 0x21, 0x00, 0xfc,
+ 0xe0, 0xf4, 0xf0, 0xdd, 0xd0, 0xf0, 0xe0, 0x2e, 0x74, 0x20, 0xbf, 0x00,
+ 0xfc, 0xd8, 0x0f, 0x01,
+ 0xd1, 0xb0, 0x00, 0x0e, 0x10, 0x20, 0xff, 0xbc, 0x02, 0x02, 0xde, 0xfe,
+ 0x15, 0x42, 0x0f, 0xfe,
+ 0xbd, 0xdb, 0x00, 0x42, 0x00, 0xcd, 0x00, 0x44, 0x0e, 0x0f, 0x25, 0x32,
+ 0xf0, 0xdf, 0xee, 0x0f,
+ 0x33, 0xe0, 0xbb, 0x10, 0x2f, 0xdb, 0x23, 0x77, 0x72, 0xff, 0xff, 0x12,
+ 0x00, 0x00, 0x0f, 0x01,
+ 0x12, 0x0f, 0x0f, 0x0e, 0x0c, 0x0d, 0xed, 0x47, 0x66, 0xff, 0xf0, 0x10,
+ 0xff, 0xae, 0x11, 0x24,
+ 0xfe, 0xdf, 0x0f, 0x10, 0x00, 0x56, 0x11, 0x0f, 0xdf, 0x00, 0xe1, 0x21,
+ 0x31, 0xf1, 0xf3, 0x53,
+ 0x20, 0xf0, 0xee, 0x20, 0x72, 0x27, 0xe6, 0xac, 0x0f, 0x33, 0x34, 0xee,
+ 0xcf, 0x13, 0x24, 0xd0,
+ 0xbb, 0x00, 0x64, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x0e, 0xde, 0x03, 0x55,
+ 0x00, 0xfe, 0x02, 0x01,
+ 0x00, 0x31, 0x57, 0x00, 0x0f, 0x01, 0x21, 0xdf, 0xfd, 0x00, 0x0e, 0x51,
+ 0x04, 0x00, 0xff, 0x1f,
+ 0x0e, 0x31, 0x77, 0x02, 0xed, 0xf0, 0x00, 0x43, 0x12, 0x0f, 0xe8, 0xcd,
+ 0x00, 0x75, 0x20, 0xf0,
+ 0xee, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x10, 0x00, 0xfe, 0x0c, 0x0d, 0x10,
+ 0x44, 0xf1, 0xad, 0x00,
+ 0xf1, 0x0e, 0xfb, 0x31, 0x76, 0x10, 0xe0, 0xcd, 0x01, 0x00, 0x1f, 0x4d,
+ 0x00, 0xff, 0x12, 0x0d,
+ 0x88, 0x0f, 0x04, 0x10, 0xff, 0xfe, 0x00, 0x00, 0x23, 0x20, 0x0f, 0x22,
+ 0x22, 0x88, 0xeb, 0x01,
+ 0x33, 0x11, 0x00, 0xbd, 0xff, 0x0f, 0x00, 0x25, 0x01, 0x01, 0x01, 0x01,
+ 0xf1, 0xbf, 0xfc, 0x10,
+ 0x00, 0xab, 0x00, 0x24, 0x00, 0x98, 0x0f, 0x12, 0x12, 0x10, 0x0f, 0x42,
+ 0xf0, 0xe0, 0xed, 0xf0,
+ 0x0f, 0xcf, 0xef, 0x00, 0x54, 0xf0, 0xce, 0x12, 0x23, 0x0c, 0xdf, 0x11,
+ 0x11, 0x11, 0x25, 0x0f,
+ 0xb9, 0xf0, 0x00, 0x00, 0x33, 0xed, 0xef, 0x73, 0x22, 0xeb, 0x0f, 0x46,
+ 0x02, 0xdf, 0xdd, 0x01,
+ 0x52, 0x02, 0x00, 0xfe, 0xe0, 0x12, 0x31, 0x20, 0xda, 0xbd, 0x03, 0xe3,
+ 0x8f, 0xfd, 0x11, 0x46,
+ 0x22, 0x00, 0x0f, 0xdc, 0x10, 0x33, 0x42, 0x01, 0xde, 0x02, 0x36, 0x0d,
+ 0xdd, 0x32, 0x32, 0xd2,
+ 0xb0, 0xe1, 0xee, 0xfe, 0x57, 0x51, 0x0e, 0xed, 0xf0, 0xef, 0xec, 0xff,
+ 0xdc, 0xfe, 0x11, 0x75,
+ 0x10, 0x0d, 0x00, 0xc0, 0x0f, 0x30, 0x19, 0x0f, 0xb0, 0xc0, 0xdf, 0xfe,
+ 0x0f, 0x3f, 0x25, 0x30,
+ 0x0f, 0x0e, 0xb0, 0x00, 0x32, 0x0b, 0x40, 0x0e, 0xfd, 0x47, 0x10, 0xba,
+ 0xff, 0x73, 0x11, 0xee,
+ 0x02, 0x34, 0xff, 0xff, 0x01, 0x12, 0x00, 0x02, 0x10, 0x0c, 0x20, 0x7f,
+ 0x00, 0xee, 0x06, 0x31,
+ 0x60, 0x20, 0xeb, 0xf3, 0x77, 0x11, 0xfe, 0xf0, 0x44, 0x0f, 0xec, 0x41,
+ 0x22, 0x00, 0xd0, 0xf0,
+ 0xff, 0x21, 0x65, 0x00, 0xef, 0x00, 0x02, 0x00, 0x00, 0x2f, 0x42, 0x35,
+ 0x30, 0x1e, 0x0b, 0x00,
+ 0x63, 0x13, 0xdc, 0xdd, 0xf0, 0xff, 0xf0, 0xd0, 0x34, 0x52, 0xfc, 0x0f,
+ 0x31, 0x00, 0xcd, 0xb9,
+ 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0e, 0x20, 0x71, 0x20, 0x00, 0x0e, 0xe0,
+ 0xed, 0x2d, 0x56, 0x13,
+ 0x0f, 0xfb, 0x10, 0x11, 0xe0, 0xbf, 0xee, 0xec, 0x00, 0x65, 0x13, 0x14,
+ 0xcb, 0xdd, 0x60, 0x12,
+ 0x0f, 0xdc, 0x1f, 0x21, 0x12, 0xef, 0xde, 0x00, 0x61, 0x01, 0x01, 0x07,
+ 0x02, 0xff, 0xee, 0x00,
+ 0x20, 0xcf, 0xc0, 0x01, 0xfb, 0xbd, 0x06, 0x12, 0xdc, 0xfe, 0x73, 0x27,
+ 0xef, 0xbd, 0x00, 0x02,
+ 0x24, 0x0f, 0x0e, 0x00, 0x21, 0xe0, 0xbe, 0x02, 0x04, 0xdf, 0xdd, 0xff,
+ 0xee, 0xf0, 0xf5, 0xf0,
+ 0xce, 0x34, 0x32, 0x8b, 0xed, 0x01, 0x34, 0xef, 0xcd, 0xee, 0x00, 0x34,
+ 0x0f, 0xdc, 0x13, 0x16,
+ 0x00, 0xf0, 0xfe, 0x20, 0x52, 0x14, 0xe0, 0x8c, 0xae, 0x00, 0x24, 0x0e,
+ 0x0b, 0xcf, 0x01, 0x35,
+ 0x11, 0xfd, 0x00, 0x42, 0x22, 0xe0, 0xe0, 0x00, 0x0d, 0x0e, 0x32, 0x42,
+ 0xcc, 0xef, 0xe1, 0x02,
+ 0x60, 0x13, 0x06, 0x12, 0x20, 0x0a, 0xc0, 0x02, 0x00, 0xec, 0x00, 0x50,
+ 0x1f, 0x40, 0x0f, 0x00,
+ 0x12, 0xe3, 0xbb, 0x00, 0x64, 0x00, 0xda, 0xef, 0x20, 0x0e, 0xde, 0x00,
+ 0x00, 0x40, 0x05, 0xe0,
+ 0xbd, 0xde, 0xe0, 0x46, 0x31, 0x10, 0xff, 0x02, 0x00, 0x0e, 0xfa, 0x10,
+ 0x76, 0x50, 0xe0, 0xde,
+ 0x00, 0x10, 0xde, 0x01, 0x26, 0x0f, 0xaf, 0x00, 0x12, 0x20, 0x10, 0xc0,
+ 0xe1, 0x14, 0x00, 0xda,
+ 0xf0, 0x01, 0x31, 0x40, 0x00, 0xef, 0xed, 0x61, 0x13, 0x00, 0x01, 0x34,
+ 0x61, 0x0e, 0x0d, 0xfe,
+ 0xf1, 0x17, 0x0f, 0xac, 0x0e, 0x00, 0x12, 0x31, 0x12, 0x10, 0x64, 0x34,
+ 0xf0, 0xdb, 0x00, 0x31,
+ 0x02, 0x8c, 0x0d, 0x10, 0x44, 0x00, 0x0d, 0x11, 0x00, 0x0e, 0x21, 0x00,
+ 0xf0, 0x17, 0x21, 0xfd,
+ 0xbd, 0xde, 0x00, 0xfe, 0xed, 0x0f, 0x12, 0x33, 0x0b, 0x2c, 0x73, 0x77,
+ 0x00, 0xff, 0xee, 0x00,
+ 0x00, 0x21, 0xf1, 0x03, 0x52, 0x0b, 0xec, 0xef, 0x11, 0x11, 0xe1, 0xd2,
+ 0xc0, 0xdf, 0x1f, 0x40,
+ 0x30, 0x26, 0x36, 0xcf, 0xac, 0x00, 0x21, 0x02, 0xd0, 0xf0, 0x20, 0x72,
+ 0x00, 0xdf, 0xce, 0x00,
+ 0x25, 0x34, 0x22, 0xfe, 0xac, 0x14, 0x23, 0x0d, 0xeb, 0xc0, 0xf2, 0xcf,
+ 0xfe, 0x02, 0x00, 0x10,
+ 0x56, 0x01, 0x00, 0x20, 0x00, 0x40, 0x37, 0xe0, 0x8b, 0xd0, 0x10, 0x0f,
+ 0x0f, 0xe2, 0xe0, 0x0f,
+ 0x1f, 0x0f, 0x00, 0x00, 0xd0, 0x33, 0x45, 0xef, 0x9a, 0xff, 0x00, 0x20,
+ 0xdf, 0xd0, 0x53, 0x21,
+ 0x1c, 0xfd, 0x00, 0x03, 0xf1, 0xe1, 0x10, 0x10, 0x41, 0x16, 0xcf, 0x9d,
+ 0x0f, 0x13, 0x33, 0x00,
+ 0xfd, 0x00, 0xda, 0xe0, 0x12, 0x51, 0x25, 0x42, 0x13, 0xf2, 0xcc, 0xeb,
+ 0x1e, 0x30, 0x00, 0x14,
+ 0x20, 0xfd, 0xfd, 0x73, 0x46, 0xe0, 0xdd, 0xf1, 0x03, 0x52, 0x0d, 0xfc,
+ 0x01, 0x02, 0x10, 0x0f,
+ 0x09, 0xdf, 0x10, 0x0f, 0xb0, 0xce, 0x02, 0x21, 0x1e, 0x5e, 0x1f, 0x04,
+ 0x02, 0x00, 0x18, 0x0d,
+ 0xfd, 0xd0, 0x05, 0xd0, 0x80, 0xbc, 0x00, 0x64, 0x00, 0x00, 0x00, 0x04,
+ 0x20, 0x0a, 0xff, 0x21,
+ 0x12, 0xce, 0xf0, 0x42, 0x40, 0xec, 0xe0, 0x35, 0x01, 0xce, 0x00, 0x13,
+ 0x22, 0x01, 0xff, 0x41,
+ 0x30, 0xe0, 0xfd, 0x46, 0xf1, 0x80, 0x05, 0x21, 0x0c, 0x0f, 0x42, 0x34,
+ 0x10, 0x11, 0x01, 0x13,
+ 0x21, 0xee, 0xde, 0x64, 0x77, 0x01, 0xfd, 0x00, 0x00, 0x01, 0x03, 0x02,
+ 0x00, 0x20, 0x01, 0xf2,
+ 0xec, 0x41, 0x67, 0x00, 0xe0, 0x00, 0x44, 0x31, 0xed, 0xdd, 0x22, 0x02,
+ 0xbb, 0xfd, 0x00, 0x23,
+ 0x44, 0x01, 0x23, 0xed, 0xcc, 0xfe, 0xfe, 0x10, 0x00, 0xec, 0xe0, 0x9f,
+ 0xfe, 0x22, 0x52, 0x01,
+ 0x00, 0x00, 0x47, 0x07, 0xeb, 0x0f, 0x00, 0x00, 0x10, 0x2f, 0x50, 0x0f,
+ 0xbe, 0xff, 0xef, 0xfd,
+ 0x10, 0x35, 0x00, 0xf0, 0x01, 0x21, 0xfe, 0x9a, 0xf0, 0xff, 0x22, 0x11,
+ 0xeb, 0xbe, 0x0f, 0x00,
+ 0x01, 0x20, 0x20, 0x46, 0x23, 0xe0, 0x8e, 0xec, 0x0e, 0x00, 0x21, 0x1e,
+ 0x1f, 0xf1, 0xcf, 0xfd,
+ 0x04, 0x44, 0xff, 0x89, 0xef, 0x10, 0x21, 0x0f, 0xed, 0x00, 0x05, 0x30,
+ 0x00, 0xae, 0xfb, 0x02,
+ 0x24, 0x0f, 0xca, 0x00, 0x11, 0xd0, 0xcf, 0xee, 0x00, 0x31, 0xd0, 0xce,
+ 0xf0, 0xf0, 0x0d, 0x0f,
+ 0xc0, 0xcf, 0xde, 0x40, 0x4f, 0xf0, 0xd2, 0xd1, 0xf6, 0x00, 0xda, 0xe1,
+ 0x53, 0x30, 0xed, 0x81,
+ 0xf5, 0xef, 0x0c, 0x30, 0x4f, 0x0c, 0xde, 0xef, 0x04, 0x50, 0x0e, 0x00,
+ 0xf7, 0x23, 0x10, 0x3e,
+ 0x20, 0xde, 0xbf, 0xe1, 0xf0, 0x23, 0x74, 0x30, 0x11, 0x36, 0x01, 0x01,
+ 0x32, 0x01, 0x00, 0xfe,
+ 0xde, 0xfd, 0x64, 0x46, 0x1d, 0x0d, 0x05, 0x03, 0xaf, 0xff, 0x12, 0x31,
+ 0x0f, 0xcb, 0x01, 0x37,
+ 0x10, 0xfe, 0xdf, 0x00, 0x1f, 0x10, 0x32, 0x11, 0x10, 0xee, 0x02, 0x36,
+ 0x8f, 0xbf, 0x03, 0x10,
+ 0xef, 0xdc, 0x13, 0x55, 0x00, 0xfe, 0xd0, 0xf1, 0xef, 0x0e, 0x20, 0x77,
+ 0xf0, 0xbf, 0xff, 0xf1,
+ 0x13, 0x22, 0x20, 0xff, 0xed, 0x20, 0x25, 0x9f, 0xdc, 0x02, 0x45, 0x00,
+ 0xd1, 0x10, 0x10, 0x3f,
+ 0x00, 0xd4, 0x11, 0x60, 0x19, 0x00, 0x11, 0x01, 0xcd, 0xde, 0xf0, 0xe0,
+ 0x2e, 0x50, 0xef, 0xcf,
+ 0x01, 0x55, 0x32, 0x0e, 0xca, 0x11, 0x44, 0x0f, 0xda, 0x10, 0x41, 0x03,
+ 0x0f, 0x0d, 0x20, 0x20,
+ 0x0e, 0x2f, 0x2d, 0x00, 0x04, 0xce, 0xae, 0x02, 0x11, 0xea, 0xbd, 0x00,
+ 0x1f, 0x2e, 0x30, 0x45,
+ 0xf1, 0xef, 0x00, 0x00, 0x0e, 0x30, 0x25, 0x01, 0xce, 0xfc, 0x00, 0x03,
+ 0x04, 0x8a, 0x8d, 0x00,
+ 0x02, 0x20, 0xdb, 0x00, 0x21, 0x00, 0xff, 0xf0, 0x15, 0x2f, 0x0c, 0xfe,
+ 0xf1, 0xf3, 0xee, 0xfd,
+ 0x50, 0x54, 0xe0, 0xbe, 0x02, 0x01, 0x0c, 0x24, 0x57, 0xe0, 0xed, 0x00,
+ 0x00, 0x10, 0x32, 0x22,
+ 0x20, 0xde, 0x89, 0xff, 0x00, 0x42, 0xff, 0xef, 0x03, 0x44, 0x01, 0xe2,
+ 0xf1, 0xfd, 0x3e, 0x60,
+ 0xf0, 0xd9, 0x10, 0x23, 0xf1, 0xd0, 0x21, 0x23, 0x0f, 0x0c, 0x0e, 0xf2,
+ 0x26, 0x21, 0xae, 0xdd,
+ 0x01, 0x02, 0xdf, 0xc0, 0xfd, 0x50, 0x71, 0x27, 0xf0, 0xce, 0xf0, 0x01,
+ 0x01, 0xf0, 0x17, 0x31,
+ 0x00, 0x9f, 0x01, 0x37, 0x00, 0xde, 0xef, 0x13, 0x22, 0xfd, 0xaf, 0x05,
+ 0x02, 0x20, 0x31, 0x23,
+ 0xd1, 0xc0, 0x12, 0x00, 0xbd, 0x05, 0x21, 0x00, 0x00, 0xdb, 0xe0, 0x11,
+ 0x21, 0xef, 0xd1, 0x77,
+ 0x13, 0xfb, 0xff, 0x00, 0x30, 0x31, 0x20, 0x00, 0x2f, 0x1f, 0xad, 0xff,
+ 0x74, 0x10, 0xf8, 0xee,
+ 0x70, 0x01, 0xf1, 0x12, 0x2f, 0xfa, 0x0f, 0x00, 0xdf, 0xbf, 0x00, 0x21,
+ 0x00, 0xfe, 0x0f, 0x0d,
+ 0x10, 0x77, 0x20, 0x0e, 0x0e, 0x32, 0x12, 0xdd, 0xcd, 0x24, 0x02, 0x0f,
+ 0x0d, 0xcf, 0xf1, 0x91,
+ 0xed, 0x00, 0x23, 0xff, 0xe1, 0x37, 0x2f, 0x1c, 0x73, 0x27, 0xf0, 0xfd,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x13, 0x71, 0x27, 0x02, 0xde, 0xff, 0x13, 0x12, 0xed, 0x40, 0x52, 0x06,
+ 0x03, 0xee, 0xef, 0x41,
+ 0x53, 0x00, 0x02, 0x02, 0x01, 0x1d, 0x0d, 0x03, 0x07, 0x07, 0x00, 0xde,
+ 0xf0, 0x0f, 0x61, 0x22,
+ 0x13, 0x01, 0x1c, 0x2e, 0x00, 0x00, 0x00, 0x02, 0x77, 0x74, 0x10, 0x0e,
+ 0xf0, 0xdc, 0xfe, 0xe0,
+ 0x22, 0x41, 0xcc, 0xfc, 0x21, 0x12, 0x0f, 0xdd, 0x64, 0x45, 0xf0, 0xde,
+ 0x00, 0x22, 0x01, 0x63,
+ 0x10, 0x08, 0xd0, 0x00, 0x00, 0xf0, 0xd0, 0xe1, 0x00, 0x6f, 0x00, 0xfc,
+ 0x05, 0x34, 0x30, 0x00,
+ 0x00, 0xe2, 0xe0, 0xff, 0x0f, 0x2d, 0x00, 0xc1, 0x00, 0x0f, 0x27, 0x77,
+ 0xf0, 0xec, 0x00, 0x21,
+ 0xf1, 0xce, 0xcf, 0x01, 0x22, 0xdc, 0x8d, 0x00, 0x55, 0x0e, 0xef, 0x00,
+ 0x10, 0x0f, 0xf0, 0x11,
+ 0x30, 0xef, 0x10, 0x30, 0x0e, 0xed, 0x00, 0x24, 0xf0, 0x8b, 0x8e, 0x00,
+ 0x02, 0xfd, 0x0d, 0x23,
+ 0x05, 0xeb, 0xee, 0x1f, 0x21, 0x00, 0xfc, 0x01, 0x02, 0xfe, 0xee, 0x12,
+ 0x36, 0x8f, 0xe0, 0xef,
+ 0xdd, 0xdf, 0x04, 0xe3, 0xd3, 0x1e, 0x1a, 0x20, 0x0e, 0xce, 0xd0, 0x12,
+ 0x2b, 0x4f, 0x21, 0xb1,
+ 0xac, 0x00, 0x12, 0x24, 0x12, 0x21, 0x10, 0xcf, 0xc1, 0xdf, 0x0e, 0x00,
+ 0xc9, 0x0f, 0x71, 0x02,
+ 0xfd, 0x21, 0x57, 0x00, 0xef, 0x00, 0x3f, 0x0d, 0xd0, 0x01, 0x04, 0x0f,
+ 0xda, 0x10, 0x0e, 0xbd,
+ 0x01, 0x03, 0x0e, 0x0e, 0x20, 0x14, 0x36, 0xef, 0x8b, 0xc0, 0x20, 0x10,
+ 0xdf, 0xef, 0x0f, 0x30,
+ 0x66, 0x00, 0xfd, 0xee, 0x21, 0x34, 0xde, 0xce, 0x03, 0xd0, 0xaa, 0x10,
+ 0x21, 0xf0, 0xf0, 0x00,
+ 0xcf, 0xf5, 0xd1, 0xf1, 0x00, 0xdf, 0x8a, 0xd0, 0x02, 0x03, 0x00, 0xe2,
+ 0xe3, 0xbd, 0x0e, 0x30,
+ 0x21, 0xd0, 0xad, 0x00, 0x06, 0x01, 0xe0, 0x0c, 0x10, 0x23, 0xdb, 0x00,
+ 0x65, 0x0f, 0xec, 0xd0,
+ 0x45, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xf0, 0xfe, 0x53, 0x30, 0x0b, 0x40,
+ 0x64, 0x00, 0xfc, 0xee,
+ 0x50, 0x42, 0x0d, 0x0e, 0xf0, 0x00, 0x0f, 0x1e, 0x3f, 0x6d, 0x0c, 0xdf,
+ 0xf1, 0xf7, 0x22, 0x1e,
+ 0xfa, 0xde, 0xff, 0x00, 0x60, 0x20, 0x1f, 0x20, 0x13, 0x00, 0x4f, 0x32,
+ 0x52, 0x0f, 0x01, 0x17,
+ 0x00, 0xe0, 0xf1, 0x03, 0x89, 0xee, 0x00, 0x53, 0x00, 0x0e, 0x10, 0x10,
+ 0xfe, 0xd9, 0x00, 0x64,
+ 0x25, 0x0f, 0xfe, 0x32, 0x20, 0x0d, 0xf0, 0x36, 0x10, 0xe1, 0x05, 0x05,
+ 0x69, 0x00, 0xd4, 0x00,
+ 0xa9, 0x24, 0xcb, 0x22, 0x89, 0x29, 0x88, 0x1d, 0xce, 0x01, 0x47, 0x75,
+ 0x0e, 0x00, 0x00, 0x01,
+ 0x11, 0x31, 0x22, 0x13, 0x20, 0x0c, 0xc0, 0x02, 0x11, 0xf0, 0x00, 0x1c,
+ 0xd0, 0xe7, 0xf1, 0xd0,
+ 0x70, 0x32, 0xa0, 0xdb, 0x01, 0xf3, 0xd1, 0xd0, 0x00, 0x31, 0x00, 0xde,
+ 0xd0, 0x01, 0x73, 0x03,
+ 0xc0, 0xce, 0x02, 0xfc, 0xd8, 0xbc, 0x11, 0x12, 0xf2, 0xe2, 0x11, 0x2e,
+ 0xd0, 0xc4, 0x01, 0xd9,
+ 0xf0, 0x00, 0x67, 0xf0, 0x80, 0xc0, 0x00, 0x11, 0x11, 0x10, 0x00, 0xe0,
+ 0xe0, 0xf0, 0x01, 0x21,
+ 0x10, 0xd0, 0xde, 0x57, 0x56, 0x0f, 0xcc, 0x01, 0x12, 0x00, 0xef, 0xef,
+ 0x0f, 0x70, 0x2e, 0xb1,
+ 0x13, 0x10, 0x0a, 0x30, 0xe2, 0xae, 0x0e, 0x43, 0x23, 0xec, 0xfc, 0x1f,
+ 0x2f, 0x1d, 0x0e, 0x10,
+ 0x35, 0x2e, 0xea, 0xe0, 0x41, 0x52, 0xf0, 0xec, 0x00, 0xfe, 0x0f, 0x4f,
+ 0x21, 0xdd, 0xbc, 0x21,
+ 0x54, 0xfd, 0xd9, 0x40, 0x54, 0x00, 0x00, 0x20, 0x10, 0xef, 0x0e, 0x0f,
+ 0x15, 0x12, 0x00, 0xac,
+ 0xf1, 0x01, 0x01, 0xf2, 0x00, 0xff, 0x0f, 0x15, 0x00, 0xe2, 0x33, 0x72,
+ 0x2d, 0xe0, 0x02, 0x35,
+ 0x11, 0x00, 0xf2, 0x02, 0x75, 0x42, 0x03, 0xf0, 0xde, 0x02, 0x27, 0x00,
+ 0xd0, 0x10, 0x11, 0xf6,
+ 0x01, 0xf0, 0x6d, 0x31, 0x01, 0x01, 0x67, 0x11, 0xe0, 0xdd, 0xf0, 0x63,
+ 0x10, 0xfc, 0xff, 0x01,
+ 0x03, 0x02, 0xdd, 0x20, 0x32, 0xe0, 0xac, 0x00, 0xfc, 0x00, 0x00, 0x01,
+ 0xd0, 0xed, 0xfe, 0xfc,
+ 0xc8, 0xee, 0x00, 0x74, 0x0f, 0x9b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xfe,
+ 0x31, 0x10, 0xce, 0xcf,
+ 0x00, 0x01, 0x10, 0x1a, 0xfe, 0xbd, 0xfd, 0xd0, 0x14, 0x35, 0x0f, 0xfc,
+ 0xcf, 0xbd, 0xf0, 0x23,
+ 0x25, 0xcf, 0xdd, 0xfe, 0x23, 0x64, 0xec, 0xcc, 0x00, 0x06, 0xff, 0xcc,
+ 0xf0, 0x30, 0x11, 0xc0,
+ 0xee, 0x01, 0x30, 0x20, 0xcd, 0x02, 0xe0, 0xca, 0xed, 0x00, 0x11, 0x0f,
+ 0x4e, 0x4f, 0x3e, 0x00,
+ 0xf1, 0xfe, 0x2c, 0x70, 0x00, 0xfd, 0xe9, 0xfe, 0x1e, 0x1f, 0xe0, 0xcf,
+ 0x0f, 0x1f, 0xbc, 0xcd,
+ 0x00, 0x20, 0x70, 0x0f, 0x08, 0xdc, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0xfb, 0x1e, 0x52,
+ 0x17, 0xbf, 0xad, 0xff, 0xe2, 0x02, 0x01, 0x11, 0x00, 0xdc, 0xaf, 0x0f,
+ 0x10, 0x30, 0x00, 0x02,
+ 0x17, 0x11, 0x20, 0x1f, 0xec, 0xdf, 0xf0, 0x34, 0x57, 0x00, 0xb0, 0x0f,
+ 0x42, 0x23, 0x0f, 0xf0,
+ 0x40, 0x02, 0xd0, 0xf3, 0x22, 0x76, 0x21, 0x0e, 0x10, 0x22, 0x11, 0x41,
+ 0x02, 0xf4, 0xef, 0xdb,
+ 0x20, 0xef, 0x2d, 0x20, 0x87, 0x11, 0x70, 0x00, 0xd2, 0x03, 0x12, 0x41,
+ 0x0f, 0xfc, 0x00, 0x00,
+ 0xee, 0xdd, 0xf0, 0x06, 0x00, 0x1c, 0x43, 0x14, 0x0e, 0xff, 0x04, 0x02,
+ 0xfe, 0x8a, 0xf0, 0x43,
+ 0xf3, 0xd0, 0x10, 0x00, 0x11, 0x34, 0x93, 0xf1, 0xf0, 0xfb, 0xf0, 0x06,
+ 0x23, 0x11, 0x1f, 0x00,
+ 0xd0, 0x80, 0xff, 0x01, 0x27, 0x32, 0xe2, 0xd2, 0x00, 0x0e, 0xbf, 0x02,
+ 0x03, 0x2f, 0x1d, 0xc0,
+ 0xd0, 0x0f, 0x0c, 0x53, 0x02, 0xc9, 0xce, 0x0d, 0x0e, 0x01, 0x13, 0x2e,
+ 0x09, 0x10, 0xde, 0x0e,
+ 0x70, 0x70, 0x0f, 0x0e, 0x36, 0x10, 0xfa, 0xef, 0x20, 0x20, 0x00, 0xcd,
+ 0x32, 0x22, 0xef, 0xcd,
+ 0x00, 0x4f, 0x1d, 0x28, 0x1f, 0x20, 0x10, 0xfe, 0x2f, 0x7e, 0x3f, 0xf0,
+ 0x02, 0x00, 0x2e, 0x02,
+ 0x37, 0x23, 0xae, 0xfd, 0xef, 0xe0, 0xe0, 0x02, 0xfd, 0x0a, 0x01, 0x80,
+ 0x10, 0x53, 0x10, 0xd8,
+ 0xfe, 0x11, 0x13, 0x03, 0x02, 0x1f, 0xed, 0xe1, 0xd4, 0x40, 0x20, 0x8d,
+ 0x03, 0x06, 0x0f, 0x33,
+ 0xc5, 0xe0, 0x40, 0x30, 0xe2, 0xd1, 0x00, 0x52, 0x27, 0x02, 0xde, 0x0f,
+ 0x21, 0xf0, 0xed, 0x60,
+ 0x12, 0xeb, 0xcd, 0x00, 0x01, 0xcf, 0x0f, 0x25, 0x56, 0x00, 0x0d, 0xff,
+ 0x00, 0xf2, 0xee, 0xef,
+ 0x13, 0xf1, 0x88, 0x0f, 0x00, 0x01, 0x43, 0x0f, 0x0d, 0xef, 0xee, 0xf0,
+ 0x22, 0x13, 0xab, 0xe0,
+ 0x04, 0x2e, 0xec, 0x00, 0x37, 0x31, 0xe0, 0xc0, 0x11, 0x21, 0xc0, 0xbf,
+ 0x02, 0x35, 0xce, 0xee,
+ 0x00, 0x34, 0x03, 0xaf, 0xfd, 0x23, 0x24, 0xf0, 0xae, 0x02, 0x17, 0x14,
+ 0x0f, 0xcd, 0xf0, 0xf1,
+ 0x01, 0x01, 0x21, 0xe0, 0xed, 0x21, 0x46, 0xe1, 0x90, 0x00, 0x00, 0xee,
+ 0x0e, 0x10, 0x10, 0x22,
+ 0x0b, 0x1d, 0xfa, 0x1e, 0x70, 0x3f, 0x00, 0x44, 0x0f, 0xbb, 0x1f, 0x20,
+ 0xf0, 0xf0, 0x0c, 0x20,
+ 0x0c, 0xde, 0x2e, 0x31, 0x20, 0x4f, 0x2d, 0x5c, 0x0d, 0xde, 0x0e, 0x73,
+ 0x53, 0x0c, 0x0f, 0x42,
+ 0x0b, 0xfe, 0xe0, 0x03, 0x13, 0x00, 0xca, 0xee, 0xe0, 0x34, 0x00, 0xcb,
+ 0x22, 0x53, 0x0e, 0x1f,
+ 0x01, 0x07, 0x01, 0x40, 0x2f, 0x30, 0x10, 0x00, 0x00, 0x05, 0x01, 0x20,
+ 0x71, 0xe0, 0x00, 0x55,
+ 0x46, 0x11, 0x01, 0x00, 0xf0, 0xe0, 0x20, 0x42, 0x25, 0x00, 0x3f, 0x0e,
+ 0x20, 0x77, 0x61, 0xff,
+ 0xef, 0x0f, 0x21, 0x12, 0x00, 0x0d, 0x00, 0xf0, 0xc0, 0x00, 0x20, 0x30,
+ 0x1f, 0x20, 0x77, 0x02,
+ 0xec, 0xe0, 0x25, 0x30, 0xdf, 0xbd, 0xfb, 0xef, 0x20, 0x12, 0xe0, 0xfd,
+ 0x00, 0xeb, 0xdf, 0x10,
+ 0xf0, 0xc0, 0x70, 0x57, 0x00, 0xdf, 0xfd, 0x01, 0x33, 0x01, 0xbe, 0xed,
+ 0x0f, 0x0f, 0x4c, 0xe0,
+ 0x05, 0x02, 0xee, 0xf0, 0x30, 0xf0, 0x80, 0xa6, 0x22, 0x4f, 0x0f, 0xc3,
+ 0x02, 0x0f, 0x1e, 0x02,
+ 0xe6, 0x00, 0xfc, 0xf0, 0x11, 0x1f, 0xde, 0x13, 0x47, 0xe2, 0xce, 0xe0,
+ 0x02, 0x10, 0x00, 0xcc,
+ 0x0d, 0x0e, 0x30, 0x0e, 0xcd, 0x01, 0x56, 0x43, 0x30, 0xaa, 0xe0, 0x31,
+ 0x23, 0xef, 0xcc, 0x00,
+ 0x10, 0x0e, 0x0e, 0x00, 0x21, 0xfd, 0xf0, 0x21, 0x51, 0x03, 0x00, 0x1e,
+ 0x08, 0x0a, 0x31, 0x60,
+ 0x0f, 0x11, 0xf3, 0xe0, 0xfe, 0xcd, 0xe2, 0x47, 0x40, 0xbe, 0xef, 0xf0,
+ 0x00, 0xff, 0xef, 0x12,
+ 0x55, 0x01, 0xed, 0xdc, 0x20, 0x62, 0x11, 0x02, 0xf1, 0xdf, 0x08, 0x10,
+ 0x32, 0x01, 0xdf, 0x31,
+ 0x02, 0x8f, 0xed, 0x00, 0x37, 0x32, 0x31, 0x30, 0xd0, 0x10, 0x11, 0xc0,
+ 0x21, 0x77, 0x40, 0xde,
+ 0x01, 0x02, 0x33, 0x11, 0xe0, 0xed, 0x0b, 0x2f, 0x0d, 0x90, 0xe0, 0x41,
+ 0x30, 0xe4, 0xf1, 0xfd,
+ 0x2f, 0x23, 0xde, 0xea, 0x50, 0x12, 0xa8, 0xdd, 0x02, 0x32, 0x0c, 0xcd,
+ 0x10, 0x43, 0x13, 0x0e,
+ 0xef, 0xf1, 0xe0, 0xfb, 0xef, 0x00, 0xdf, 0xcc, 0x02, 0x06, 0xbf, 0xff,
+ 0xf1, 0xd0, 0x20, 0x1f,
+ 0xbf, 0xf1, 0x23, 0x01, 0x92, 0x17, 0x11, 0xcb, 0xcf, 0x01, 0x02, 0x03,
+ 0xd2, 0x04, 0x51, 0x00,
+ 0xd0, 0xdf, 0xd1, 0x12, 0x76, 0xf0, 0xdd, 0x01, 0x02, 0x00, 0xe9, 0xc1,
+ 0x14, 0x20, 0xcb, 0xcf,
+ 0x10, 0x44, 0x00, 0x1d, 0x00, 0xfe, 0x0e, 0x20, 0x74, 0x00, 0xee, 0x00,
+ 0x30, 0x42, 0x0f, 0xd9,
+ 0x10, 0x11, 0xce, 0xce, 0x10, 0x73, 0x0f, 0xfb, 0x00, 0x54, 0x0f, 0x0a,
+ 0xdf, 0x10, 0x40, 0xf0,
+ 0xec, 0x10, 0x54, 0x00, 0xed, 0x01, 0x22, 0x00, 0x00, 0xfe, 0x01, 0xd0,
+ 0xdc, 0x02, 0x23, 0x1e,
+ 0xff, 0x04, 0x0f, 0xaa, 0x21, 0x54, 0x0e, 0xed, 0x35, 0x33, 0x0f, 0xef,
+ 0xbc, 0x00, 0x23, 0xe0,
+ 0xda, 0x30, 0x34, 0xf0, 0xcf, 0x00, 0x41, 0x15, 0x10, 0xef, 0x70, 0x45,
+ 0xff, 0xef, 0x10, 0x32,
+ 0x00, 0x1f, 0x51, 0xce, 0xda, 0x31, 0x74, 0x0f, 0xde, 0x00, 0x01, 0x10,
+ 0xf0, 0xde, 0x10, 0x54,
+ 0x01, 0x0f, 0x0d, 0x01, 0x01, 0x53, 0xd0, 0xbb, 0x40, 0x1f, 0xdd, 0xf0,
+ 0x0e, 0x0e, 0x00, 0x47,
+ 0x00, 0xfe, 0xee, 0x0c, 0xf0, 0x03, 0x23, 0xc8, 0x8d, 0x01, 0x23, 0x00,
+ 0xf0, 0x03, 0x03, 0x1f,
+ 0xfc, 0x0f, 0x00, 0xe1, 0x01, 0xb1, 0x0e, 0x15, 0x05, 0xc0, 0xf0, 0xdf,
+ 0xee, 0x32, 0x47, 0x01,
+ 0xdf, 0x02, 0x12, 0x80, 0xed, 0x00, 0x00, 0x20, 0x24, 0xb0, 0xdc, 0xf0,
+ 0x03, 0xf4, 0xfe, 0x32,
+ 0x13, 0x99, 0x00, 0x41, 0xf0, 0xcb, 0x10, 0x11, 0x00, 0xfb, 0xce, 0x20,
+ 0x3f, 0x01, 0x54, 0x0e,
+ 0xec, 0x21, 0x23, 0xbd, 0xef, 0x0f, 0x1e, 0x50, 0x00, 0xc8, 0x0e, 0x30,
+ 0x10, 0x0f, 0xfc, 0x30,
+ 0x50, 0x01, 0x20, 0x33, 0x10, 0xfe, 0x0e, 0xfc, 0x02, 0x26, 0xae, 0x00,
+ 0x45, 0x0f, 0xab, 0x00,
+ 0x00, 0xf0, 0xf2, 0x34, 0x31, 0x0e, 0xed, 0x33, 0x55, 0xf0, 0xef, 0x31,
+ 0x40, 0xf0, 0x00, 0xe3,
+ 0xd1, 0x56, 0x00, 0xff, 0xef, 0x11, 0x11, 0x15, 0x53, 0x11, 0x23, 0x23,
+ 0x00, 0x20, 0x50, 0xcf,
+ 0xd2, 0x75, 0x20, 0xc0, 0xf0, 0x04, 0x77, 0x02, 0xed, 0x0e, 0x12, 0x33,
+ 0xf1, 0xef, 0xfd, 0x0e,
+ 0x21, 0x17, 0x10, 0xed, 0x13, 0x67, 0x0f, 0xef, 0x00, 0x13, 0x00, 0x0e,
+ 0x0f, 0x10, 0x0e, 0xbd,
+ 0x00, 0x64, 0x25, 0xec, 0xdc, 0x00, 0x31, 0x11, 0xe0, 0x00, 0x11, 0x00,
+ 0xed, 0xcd, 0x00, 0x77,
+ 0x20, 0xdd, 0xf0, 0x11, 0x0e, 0xdc, 0x40, 0x30, 0x00, 0xe1, 0xbe, 0xec,
+ 0x34, 0x11, 0xbe, 0x00,
+ 0x24, 0x34, 0xff, 0xaa, 0x00, 0x11, 0x01, 0xf1, 0xe0, 0xed, 0x20, 0x03,
+ 0x9d, 0x0e, 0x05, 0x12,
+ 0xfe, 0x00, 0x03, 0xbc, 0xfd, 0x36, 0x30, 0xab, 0xff, 0x00, 0x00, 0xed,
+ 0x00, 0x01, 0x0f, 0x1e,
+ 0x53, 0x02, 0x00, 0xec, 0xee, 0x00, 0xe8, 0x8d, 0xfe, 0x02, 0x11, 0xfc,
+ 0xff, 0x63, 0x00, 0xe8,
+ 0x00, 0x10, 0x21, 0xee, 0x00, 0x42, 0xfe, 0xdb, 0x00, 0x24, 0x0f, 0x9d,
+ 0xfe, 0x00, 0x04, 0x10,
+ 0x0f, 0xf0, 0xcf, 0x00, 0x23, 0x02, 0xba, 0x00, 0x62, 0x00, 0xfe, 0xfd,
+ 0x01, 0x24, 0x11, 0x00,
+ 0xcc, 0xec, 0xff, 0x12, 0x35, 0xe0, 0xdf, 0x40, 0x11, 0xd0, 0xe0, 0x76,
+ 0x32, 0xdf, 0xef, 0x76,
+ 0x00, 0xfc, 0x00, 0x25, 0x00, 0xde, 0x20, 0x54, 0x00, 0xe0, 0x0f, 0x00,
+ 0x75, 0x0f, 0xdd, 0x00,
+ 0x21, 0x00, 0xf0, 0xe0, 0x20, 0x32, 0x0f, 0x00, 0x34, 0x42, 0x00, 0x9f,
+ 0x10, 0x22, 0x0c, 0xea,
+ 0x00, 0x41, 0xff, 0xde, 0x14, 0x22, 0x1f, 0xdd, 0x03, 0x77, 0x0f, 0xde,
+ 0xff, 0x00, 0x27, 0x00,
+ 0xde, 0x00, 0x51, 0xdf, 0xff, 0x21, 0xd0, 0xf0, 0x55, 0x00, 0x00, 0xc1,
+ 0xf0, 0x02, 0xf0, 0xdc,
+ 0x41, 0x12, 0x00, 0xf3, 0xe6, 0x42, 0x00, 0xdf, 0xe0, 0xaf, 0x02, 0x77,
+ 0x10, 0xbd, 0xff, 0xf0,
+ 0x04, 0x22, 0x10, 0xdc, 0xef, 0x11, 0x10, 0xfc, 0xe1, 0x00, 0xce, 0xfd,
+ 0x3f, 0x00, 0x02, 0x30,
+ 0xed, 0xfe, 0x72, 0x00, 0x0c, 0xfa, 0xbe, 0xfd, 0x00, 0x02, 0xca, 0xeb,
+ 0x00, 0x70, 0xf1, 0xfc,
+ 0x21, 0x63, 0xfc, 0xec, 0x00, 0x42, 0x00, 0xfa, 0xff, 0x10, 0x01, 0x00,
+ 0x31, 0x01, 0xce, 0xfd,
+ 0x00, 0x01, 0x02, 0xf0, 0x9a, 0xf0, 0x0f, 0x30, 0x40, 0xef, 0xf0, 0x10,
+ 0x2c, 0xfc, 0xee, 0x75,
+ 0x02, 0xff, 0xeb, 0xef, 0xf0, 0x32, 0x10, 0x88, 0xf0, 0x22, 0x21, 0xde,
+ 0xef, 0x32, 0x31, 0xf0,
+ 0x00, 0x53, 0x02, 0xef, 0x01, 0x02, 0x00, 0x20, 0x0e, 0x11, 0x10, 0x20,
+ 0xed, 0x25, 0x72, 0x3d,
+ 0xef, 0xe0, 0x15, 0x14, 0xdc, 0xbe, 0x55, 0x44, 0xff, 0xed, 0x03, 0x43,
+ 0x0e, 0xca, 0x12, 0x52,
+ 0xff, 0xea, 0x00, 0x01, 0x11, 0x10, 0x20, 0x1f, 0x23, 0x23, 0x8c, 0x0f,
+ 0x02, 0x03, 0xfb, 0xde,
+ 0x01, 0x23, 0xe0, 0xf2, 0x46, 0x20, 0xae, 0x00, 0x37, 0x21, 0xef, 0xae,
+ 0x02, 0x13, 0x0f, 0x00,
+ 0xf1, 0xf0, 0xff, 0x23, 0x25, 0xff, 0xcf, 0x26, 0x52, 0xd1, 0xd0, 0x01,
+ 0xf0, 0xbd, 0x00, 0x25,
+ 0xf0, 0xf2, 0x02, 0xbf, 0xec, 0x12, 0x45, 0x01, 0xcf, 0xed, 0x01, 0x23,
+ 0x21, 0xed, 0xe0, 0xf0,
+ 0x0c, 0x0b, 0x3f, 0x40, 0x23, 0x45, 0xcf, 0xab, 0xff, 0x00, 0x21, 0xd0,
+ 0xdd, 0x0e, 0x10, 0x4f,
+ 0x0b, 0x0b, 0x00, 0x70, 0x30, 0x0d, 0x0e, 0x51, 0x00, 0x1e, 0x42, 0x01,
+ 0xee, 0x2f, 0x4e, 0xb8,
+ 0xed, 0x12, 0x12, 0x12, 0xdc, 0xcd, 0x11, 0x32, 0xf0, 0xdb, 0x23, 0x55,
+ 0x00, 0x20, 0x10, 0x00,
+ 0x01, 0x42, 0x0f, 0xed, 0x22, 0xf0, 0xce, 0xef, 0x57, 0x00, 0xfd, 0xf0,
+ 0x44, 0x34, 0xf2, 0xbf,
+ 0x11, 0x77, 0x11, 0xfe, 0x00, 0x15, 0x10, 0x0e, 0xf0, 0x01, 0x11, 0x01,
+ 0x30, 0x0e, 0x50, 0x43,
+ 0x46, 0x11, 0xef, 0xcf, 0xff, 0x11, 0x44, 0xef, 0xfb, 0x00, 0x41, 0x03,
+ 0x01, 0x12, 0x0e, 0x0e,
+ 0x22, 0x77, 0x11, 0x0f, 0x30, 0xf0, 0xcc, 0x0e, 0x12, 0x42, 0xe0, 0xe9,
+ 0x00, 0x40, 0x11, 0xfe,
+ 0x42, 0x43, 0xcb, 0xee, 0x11, 0x12, 0x0f, 0x21, 0x56, 0x10, 0x0e, 0x0f,
+ 0xcf, 0xd0, 0xe0, 0x25,
+ 0x00, 0xdb, 0x20, 0x71, 0x22, 0xd0, 0xed, 0x45, 0x01, 0x00, 0x00, 0x00,
+ 0xd1, 0xf1, 0x02, 0x62,
+ 0xfe, 0xad, 0x01, 0x07, 0x03, 0xde, 0x12, 0x11, 0xde, 0xe0, 0xe0, 0x02,
+ 0x12, 0x20, 0xc9, 0xdf,
+ 0x72, 0xfe, 0xb8, 0xf0, 0x31, 0x01, 0xce, 0xef, 0x45, 0x20, 0xcf, 0xd0,
+ 0x00, 0x31, 0xdd, 0xaa,
+ 0x00, 0x1f, 0xf0, 0x0e, 0x12, 0x41, 0xfc, 0x00, 0x31, 0x20, 0xfd, 0xf0,
+ 0x14, 0x60, 0xf0, 0xfd,
+ 0xfd, 0xfa, 0x0e, 0x8e, 0xff, 0x16, 0x43, 0xdd, 0xed, 0x00, 0x13, 0x0f,
+ 0x0e, 0x00, 0xeb, 0x20,
+ 0x45, 0xdf, 0xef, 0x1f, 0x00, 0x02, 0x00, 0x50, 0x0c, 0xcf, 0xdc, 0xe0,
+ 0x47, 0x51, 0xff, 0xde,
+ 0x00, 0xf0, 0x23, 0x42, 0xe0, 0xef, 0x33, 0x30, 0xec, 0xe2, 0x77, 0x02,
+ 0xfd, 0xee, 0x51, 0x25,
+ 0xee, 0xfe, 0x43, 0x21, 0x0f, 0xca, 0x21, 0x31, 0xc0, 0xef, 0x00, 0x0e,
+ 0x00, 0x22, 0xd0, 0x0e,
+ 0x50, 0x45, 0x22, 0x2e, 0xd8, 0xbf, 0x00, 0x00, 0xad, 0x00, 0x44, 0xfd,
+ 0xcd, 0x02, 0x21, 0x01,
+ 0x10, 0x10, 0xfa, 0xf1, 0x01, 0x10, 0xfd, 0xbe, 0xee, 0x00, 0x01, 0xfe,
+ 0x0f, 0xce, 0xf4, 0x13,
+ 0xff, 0xee, 0xff, 0x13, 0x57, 0xd2, 0xbd, 0x03, 0xde, 0xd0, 0x77, 0xf5,
+ 0xdd, 0x32, 0x00, 0xfd,
+ 0x11, 0x67, 0x01, 0xbe, 0xf0, 0x00, 0x15, 0x00, 0xad, 0x01, 0x22, 0x00,
+ 0xbd, 0x0f, 0x00, 0x23,
+ 0x01, 0xfe, 0x00, 0xf0, 0xeb, 0x02, 0x45, 0x0f, 0x0d, 0x00, 0x0f, 0x13,
+ 0x13, 0xed, 0xa9, 0x12,
+ 0x42, 0xec, 0xac, 0x10, 0x12, 0xfe, 0xff, 0x32, 0x45, 0x2f, 0xfd, 0xff,
+ 0x20, 0x20, 0xea, 0x01,
+ 0x74, 0xfe, 0xdd, 0x00, 0x13, 0x20, 0xda, 0x00, 0x23, 0x21, 0xbe, 0x00,
+ 0x01, 0x32, 0xfe, 0x0e,
+ 0x10, 0x42, 0x33, 0x11, 0xee, 0xb9, 0xf0, 0x43, 0x01, 0xab, 0x0f, 0x42,
+ 0x01, 0xfd, 0x0f, 0x11,
+ 0x03, 0xf0, 0xff, 0x32, 0x00, 0xde, 0x47, 0x67, 0x00, 0x20, 0x13, 0xde,
+ 0xdd, 0x11, 0x66, 0x00,
+ 0xff, 0x0f, 0x71, 0x01, 0xf0, 0x01, 0x21, 0x0d, 0xfc, 0x02, 0x16, 0x00,
+ 0xee, 0x11, 0x22, 0x00,
+ 0xff, 0xde, 0x1f, 0x70, 0x00, 0x55, 0x22, 0xed, 0xbb, 0x10, 0x22, 0xff,
+ 0xfe, 0x14, 0x02, 0xde,
+ 0x00, 0x74, 0x12, 0xf0, 0xeb, 0xed, 0x0e, 0x00, 0x10, 0x02, 0xd2, 0x02,
+ 0x32, 0xfe, 0xc0, 0x26,
+ 0x00, 0x8c, 0x00, 0x27, 0xef, 0xef, 0x12, 0x00, 0xbd, 0x02, 0xe0, 0x03,
+ 0x45, 0xef, 0xde, 0x44,
+ 0x35, 0x00, 0xde, 0x00, 0x04, 0xe0, 0xb0, 0xf0, 0x01, 0x05, 0x05, 0x05,
+ 0xb2, 0x00, 0xdc, 0x00,
+ 0xd0, 0xdd, 0x8c, 0x35, 0x40, 0xe3, 0xa3, 0x38, 0xf0, 0x34, 0x77, 0xff,
+ 0xce, 0x00, 0x21, 0xe0,
+ 0xff, 0x20, 0x22, 0x0e, 0xcb, 0x00, 0x11, 0x13, 0x01, 0x00, 0x2b, 0x0e,
+ 0xf0, 0x0f, 0xdc, 0x8e,
+ 0x22, 0x75, 0xec, 0xeb, 0x10, 0x62, 0x0f, 0xfc, 0x00, 0x21, 0x30, 0xdc,
+ 0xef, 0x21, 0x54, 0x20,
+ 0x00, 0xec, 0xf0, 0x00, 0x10, 0x43, 0x11, 0xec, 0xcf, 0x11, 0x23, 0xed,
+ 0x11, 0x53, 0xfd, 0xee,
+ 0x04, 0xf2, 0x03, 0x46, 0x53, 0x0f, 0xee, 0x10, 0x30, 0xdf, 0xbe, 0x27,
+ 0x24, 0xdd, 0x10, 0x77,
+ 0x10, 0xd0, 0xf0, 0x02, 0x33, 0x10, 0xf0, 0x02, 0x25, 0x21, 0xe0, 0x10,
+ 0x00, 0xaa, 0x00, 0x61,
+ 0x23, 0xf1, 0xef, 0x10, 0x44, 0x34, 0x00, 0xce, 0xee, 0x22, 0x00, 0x9e,
+ 0x00, 0x44, 0x00, 0x0f,
+ 0x01, 0x00, 0x1e, 0x0e, 0x34, 0x54, 0xdd, 0xee, 0x05, 0x1f, 0xea, 0xff,
+ 0x10, 0x0c, 0x30, 0x70,
+ 0x01, 0xce, 0xfd, 0x12, 0x63, 0x0c, 0xdc, 0x00, 0x0e, 0x00, 0x00, 0xfe,
+ 0x22, 0x44, 0x0e, 0xa8,
+ 0xfd, 0x01, 0x14, 0x10, 0x0d, 0xbc, 0xf0, 0x00, 0x11, 0x10, 0x01, 0x01,
+ 0x0d, 0xef, 0x36, 0x11,
+ 0xbe, 0x0e, 0x42, 0xdc, 0xde, 0x02, 0xc0, 0xbf, 0x05, 0x33, 0xdb, 0xdf,
+ 0x22, 0x00, 0x0f, 0xdf,
+ 0x0f, 0x11, 0x01, 0x01, 0x0f, 0xb9, 0xdf, 0xef, 0x31, 0xbf, 0xce, 0xef,
+ 0x11, 0x11, 0xfb, 0xbd,
+ 0x0d, 0xed, 0xef, 0xfb, 0xcc, 0x20, 0x1f, 0xa8, 0xef, 0x51, 0x30, 0xee,
+ 0x0e, 0x42, 0x11, 0xfd,
+ 0xfd, 0x14, 0xf0, 0xab, 0x0f, 0x00, 0xec, 0xee, 0x11, 0x34, 0x00, 0xab,
+ 0x00, 0x23, 0x10, 0x0e,
+ 0x10, 0x24, 0x00, 0xee, 0x8d, 0x01, 0x22, 0x1f, 0xeb, 0x00, 0xf0, 0x0f,
+ 0xff, 0x13, 0x24, 0xff,
+ 0xff, 0x20, 0x51, 0x04, 0x06, 0x01, 0x71, 0xfe, 0x00, 0x47, 0xf1, 0x9d,
+ 0x0f, 0x37, 0x51, 0xff,
+ 0xf0, 0x01, 0x22, 0xef, 0x0f, 0x23, 0x53, 0x01, 0xdf, 0x0e, 0x10, 0x15,
+ 0x00, 0x00, 0x22, 0x00,
+ 0xdf, 0x2f, 0x1f, 0x23, 0x67, 0x33, 0x1e, 0xfe, 0xd0, 0x01, 0x01, 0x22,
+ 0xdf, 0xb9, 0x20, 0x70,
+ 0xf0, 0xf0, 0x04, 0x22, 0x20, 0xdb, 0x00, 0x23, 0xf0, 0xdc, 0x10, 0x0f,
+ 0xdf, 0x00, 0xd1, 0x90,
+ 0x17, 0x41, 0x9e, 0xee, 0xf0, 0x11, 0x33, 0xf1, 0xc4, 0x00, 0xf0, 0xee,
+ 0x12, 0x14, 0x01, 0x04,
+ 0x42, 0x33, 0xc1, 0x06, 0x25, 0x00, 0x9f, 0xe0, 0xf0, 0x00, 0xce, 0xf1,
+ 0x15, 0x02, 0x00, 0xba,
+ 0xf0, 0xde, 0x00, 0x32, 0x51, 0x01, 0xff, 0xac, 0x00, 0x02, 0x13, 0xf0,
+ 0xdb, 0xd0, 0x22, 0x1f,
+ 0xdc, 0xe0, 0xe0, 0xed, 0x0d, 0x11, 0x0e, 0x88, 0x0d, 0x74, 0x21, 0x0d,
+ 0x0e, 0xf1, 0x00, 0x1c,
+ 0x0c, 0x00, 0x11, 0x22, 0xff, 0xda, 0xef, 0xff, 0x30, 0x30, 0xfe, 0x00,
+ 0xf0, 0x00, 0x73, 0x72,
+ 0x0e, 0xea, 0x0e, 0x0e, 0xfd, 0x01, 0x56, 0x00, 0x0f, 0xee, 0x0f, 0xfe,
+ 0xec, 0x00, 0x65, 0x10,
+ 0xdb, 0xe0, 0x03, 0x3f, 0x00, 0xe0, 0xfe, 0x00, 0x74, 0x13, 0xf1, 0xcf,
+ 0x13, 0x77, 0x20, 0xe0,
+ 0x00, 0x32, 0x10, 0x00, 0x21, 0x00, 0x00, 0xd3, 0x45, 0x33, 0x10, 0x0e,
+ 0xcc, 0x0e, 0x00, 0x47,
+ 0x45, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x3e, 0x70, 0x45, 0x01, 0xf0, 0xcc,
+ 0x00, 0x34, 0x10, 0xfe,
+ 0x00, 0x42, 0x12, 0xde, 0xce, 0x22, 0x63, 0x10, 0x0b, 0xdf, 0x00, 0x01,
+ 0x04, 0x10, 0x0c, 0xe0,
+ 0x02, 0x05, 0xf1, 0xd0, 0xc0, 0xdc, 0xd1, 0x14, 0x53, 0xec, 0xce, 0xe0,
+ 0x05, 0x12, 0xcf, 0xb0,
+ 0xe2, 0x01, 0x56, 0x12, 0x12, 0x00, 0xe0, 0xe2, 0xd1, 0xa0, 0xce, 0xe1,
+ 0x27, 0xf0, 0xbf, 0xef,
+ 0x24, 0x22, 0x1f, 0x00, 0x02, 0xe3, 0xfd, 0xed, 0x02, 0x65, 0x01, 0xae,
+ 0xf9, 0xef, 0x00, 0xf0,
+ 0x01, 0x00, 0xdb, 0xae, 0x00, 0x52, 0x0c, 0x0e, 0x00, 0x03, 0xe9, 0xce,
+ 0x2e, 0x61, 0x1f, 0x1d,
+ 0x0f, 0xfd, 0xea, 0x0f, 0x10, 0x52, 0x00, 0xfc, 0x0f, 0xe0, 0x0f, 0x30,
+ 0x20, 0xcc, 0xdd, 0x2f,
+ 0x53, 0x10, 0xeb, 0xe0, 0x21, 0x30, 0x0e, 0xe0, 0xbf, 0x03, 0x56, 0x00,
+ 0x0c, 0x10, 0x20, 0x01,
+ 0xdd, 0x01, 0x27, 0x20, 0xef, 0xf0, 0x31, 0xf2, 0x80, 0x03, 0x06, 0x30,
+ 0xee, 0xe0, 0x22, 0x74,
+ 0x64, 0x00, 0xee, 0x0f, 0x00, 0x10, 0x00, 0x13, 0x07, 0x00, 0x00, 0x31,
+ 0x02, 0x10, 0x0d, 0xcf,
+ 0x03, 0x16, 0x11, 0x22, 0x0e, 0xab, 0xef, 0x30, 0x73, 0x30, 0x0f, 0x0e,
+ 0x13, 0x47, 0x21, 0x10,
+ 0x0e, 0xf0, 0xf0, 0xff, 0x4f, 0x10, 0xdf, 0xed, 0x0f, 0x0c, 0x3f, 0x7e,
+ 0x50, 0x26, 0x0f, 0xca,
+ 0x00, 0x04, 0x00, 0x0f, 0x11, 0x10, 0xbb, 0xdf, 0x41, 0x76, 0x0f, 0xec,
+ 0xe0, 0x12, 0x20, 0xe0,
+ 0xfe, 0x42, 0x33, 0x00, 0xf1, 0xe2, 0x01, 0x01, 0x02, 0xe0, 0xf1, 0xb0,
+ 0xef, 0xf3, 0x03, 0xf7,
+ 0xe3, 0x00, 0xd2, 0x82, 0xe2, 0x36, 0x70, 0x0f, 0xfc, 0x06, 0x00, 0xef,
+ 0xee, 0x02, 0x03, 0xcd,
+ 0xdc, 0x01, 0xf1, 0xef, 0xd2, 0xe0, 0x0d, 0x20, 0xf0, 0xcc, 0xbc, 0xf1,
+ 0x15, 0x2b, 0xcc, 0x00,
+ 0x61, 0x00, 0xfc, 0xfd, 0x21, 0x43, 0x11, 0x0e, 0xfd, 0x00, 0x00, 0x0e,
+ 0xca, 0x9d, 0xef, 0x02,
+ 0x35, 0x20, 0x0d, 0xfe, 0x01, 0x21, 0x32, 0x50, 0x0e, 0xe0, 0xbf, 0xff,
+ 0x11, 0x3f, 0x18, 0xfa,
+ 0x10, 0x54, 0xff, 0xbd, 0xf0, 0x22, 0x11, 0x01, 0x0f, 0xff, 0xd0, 0xe2,
+ 0xf7, 0xe0, 0xc0, 0x20,
+ 0x71, 0x21, 0xf0, 0xe3, 0x37, 0x70, 0x11, 0x11, 0x01, 0x01, 0x10, 0x11,
+ 0x22, 0x33, 0x15, 0x1f,
+ 0xca, 0xd0, 0x33, 0x64, 0xff, 0xec, 0x01, 0x00, 0xc0, 0x1f, 0x72, 0x22,
+ 0xfc, 0x00, 0x20, 0x22,
+ 0x32, 0x0a, 0xee, 0x01, 0xb1, 0xcd, 0x0c, 0xfd, 0xe0, 0x44, 0x50, 0x0e,
+ 0x0f, 0xf0, 0x10, 0x34,
+ 0x0f, 0xa8, 0xf0, 0xff, 0x00, 0xe0, 0x00, 0xf0, 0xcf, 0xee, 0xe0, 0xf0,
+ 0x0f, 0x32, 0x15, 0x11,
+ 0x13, 0xee, 0x8a, 0xf0, 0x01, 0x45, 0x30, 0xff, 0xe0, 0x05, 0x10, 0xdf,
+ 0xaf, 0x02, 0xf1, 0xcf,
+ 0xee, 0xe0, 0xf4, 0xe3, 0x13, 0x01, 0xbc, 0xeb, 0x00, 0x44, 0x21, 0xc0,
+ 0x00, 0x43, 0xe0, 0x9f,
+ 0x00, 0x23, 0xed, 0xbb, 0xf1, 0x04, 0x0f, 0x0d, 0xf0, 0x03, 0x00, 0xfb,
+ 0xee, 0x0f, 0x2f, 0x1d,
+ 0x20, 0x57, 0x20, 0x1d, 0xec, 0x00, 0x0f, 0x3f, 0x5f, 0x20, 0x10, 0xd9,
+ 0xee, 0xd0, 0xed, 0x8e,
+ 0x02, 0x42, 0x1f, 0xfe, 0xb0, 0x0f, 0x23, 0x16, 0x00, 0x2f, 0xea, 0xf0,
+ 0x12, 0x21, 0xed, 0xac,
+ 0x20, 0x62, 0xfe, 0xff, 0x00, 0x1d, 0x00, 0x14, 0x02, 0x0e, 0x08, 0xdf,
+ 0x00, 0xd1, 0xb0, 0xe0,
+ 0x02, 0x20, 0x32, 0x76, 0x00, 0xec, 0x00, 0x43, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01,
+ 0x74, 0x22, 0x0e, 0xcc, 0x00, 0x01, 0x13, 0x12, 0xff, 0xfb, 0x0f, 0x32,
+ 0x10, 0xcd, 0x0f, 0x32,
+ 0x33, 0x0f, 0xd9, 0xf0, 0x42, 0x50, 0x1e, 0x10, 0x01, 0x16, 0xdf, 0xbc,
+ 0x0e, 0x40, 0x31, 0x20,
+ 0x3e, 0xe0, 0xbb, 0xee, 0x00, 0x16, 0x43, 0xce, 0xbc, 0xe0, 0x02, 0x02,
+ 0x2e, 0xfd, 0xbe, 0xf0,
+ 0x02, 0x01, 0x2f, 0xe9, 0xf1, 0x44, 0x32, 0xf0, 0xa0, 0x02, 0x47, 0x00,
+ 0xdf, 0x01, 0x04, 0x00,
+ 0xae, 0x00, 0xf4, 0xf0, 0xef, 0xef, 0x01, 0xf0, 0x11, 0x35, 0x32, 0x00,
+ 0x31, 0x12, 0xcd, 0xef,
+ 0x13, 0x57, 0x0f, 0x8b, 0xde, 0xf1, 0x05, 0x2f, 0xec, 0xc0, 0x01, 0x00,
+ 0xfe, 0x00, 0x10, 0x40,
+ 0x0c, 0xee, 0x2e, 0x73, 0x40, 0xec, 0xec, 0x0d, 0x00, 0x2d, 0x09, 0x1f,
+ 0x60, 0x34, 0x0f, 0xed,
+ 0x00, 0x41, 0x31, 0x0f, 0xfe, 0x11, 0x10, 0xdb, 0xf0, 0x43, 0x24, 0xce,
+ 0x0f, 0x63, 0x00, 0xdd,
+ 0x21, 0x64, 0x14, 0x03, 0x04, 0x00, 0xba, 0xff, 0x10, 0x57, 0x00, 0xef,
+ 0x01, 0x11, 0x01, 0xf1,
+ 0xf0, 0xf1, 0x33, 0x44, 0xf0, 0xe0, 0x24, 0x22, 0x0f, 0x02, 0x03, 0xd1,
+ 0x2f, 0x70, 0x23, 0xe5,
+ 0x03, 0x00, 0x33, 0x14, 0xd0, 0x90, 0x12, 0x46, 0x12, 0x00, 0x0f, 0x31,
+ 0x00, 0x0e, 0x2e, 0x00,
+ 0x0f, 0xdc, 0x01, 0x47, 0x67, 0x10, 0x4e, 0x30, 0x00, 0x00, 0xcf, 0x3e,
+ 0x75, 0x20, 0xde, 0xec,
+ 0x1f, 0x7f, 0x00, 0x11, 0x10, 0x0f, 0x0f, 0x01, 0x01, 0xed, 0xac, 0x00,
+ 0x00, 0xf8, 0xed, 0xe0,
+ 0x22, 0x10, 0x0e, 0xff, 0x3f, 0x60, 0x12, 0x0c, 0x30, 0x37, 0xf0, 0xbe,
+ 0x02, 0x35, 0xff, 0xcb,
+ 0xf0, 0x12, 0xf0, 0x8f, 0xed, 0x01, 0x05, 0x00, 0xff, 0xef, 0xf0, 0x03,
+ 0x51, 0x00, 0x00, 0xcd,
+ 0x00, 0x35, 0x00, 0xce, 0xdd, 0xef, 0xd0, 0xc0, 0xdb, 0x00, 0x02, 0xc0,
+ 0x8a, 0x00, 0x02, 0x10,
+ 0xfb, 0xee, 0x00, 0x0e, 0xed, 0x00, 0x00, 0xdd, 0xd9, 0xb0, 0x0f, 0x3f,
+ 0x00, 0x2f, 0x3e, 0x4f,
+ 0x1e, 0x52, 0x00, 0xe8, 0xbf, 0xf0, 0xde, 0xfe, 0x1f, 0x30, 0x31, 0xce,
+ 0xdc, 0x11, 0x54, 0x10,
+ 0x00, 0xfd, 0xba, 0x00, 0x52, 0x00, 0xd9, 0xe0, 0x00, 0xf0, 0xf0, 0x13,
+ 0x62, 0x01, 0x10, 0x21,
+ 0x0f, 0x00, 0xe2, 0xcc, 0xee, 0x16, 0x13, 0x00, 0x50, 0x23, 0x01, 0x00,
+ 0x77, 0x13, 0x00, 0x00,
+ 0xf2, 0x01, 0x42, 0x65, 0x26, 0x10, 0xe0, 0xdd, 0x00, 0x67, 0x00, 0xee,
+ 0x00, 0x42, 0x00, 0xf0,
+ 0xff, 0x01, 0x23, 0x0f, 0xee, 0x11, 0x46, 0x21, 0x30, 0x41, 0xf0, 0xbe,
+ 0x0e, 0x0f, 0x0f, 0xff,
+ 0x0d, 0x0f, 0x40, 0x20, 0x26, 0x42, 0x1f, 0x0e, 0x00, 0x23, 0xe4, 0x8c,
+ 0xac, 0x00, 0x21, 0xf0,
+ 0xcb, 0x0f, 0xfd, 0x10, 0x21, 0x06, 0x01, 0x01, 0x00, 0x00, 0x0d, 0x00,
+ 0x36, 0x0f, 0xbf, 0xe2,
+ 0x03, 0x20, 0x00, 0xc0, 0xf1, 0xf2, 0xe1, 0xb0, 0xf0, 0x07, 0x12, 0x00,
+ 0xb0, 0xbf, 0xfe, 0xf0,
+ 0x0f, 0x14, 0x26, 0x01, 0xf0, 0x8c, 0xef, 0x01, 0x00, 0xec, 0xdf, 0xd0,
+ 0xf0, 0xd0, 0xa8, 0xf0,
+ 0x30, 0x31, 0x0f, 0xda, 0xe0, 0xf0, 0x01, 0x00, 0xde, 0x00, 0xef, 0xbd,
+ 0x0d, 0xfa, 0x00, 0x7e,
+ 0x30, 0x50, 0x01, 0xec, 0xfc, 0x10, 0x11, 0xfc, 0xcc, 0x00, 0xff, 0xf0,
+ 0x21, 0x41, 0x0f, 0x0e,
+ 0x5e, 0x1e, 0x30, 0x01, 0xb8, 0xdf, 0x01, 0x10, 0xe9, 0x00, 0x00, 0x50,
+ 0x30, 0x31, 0x00, 0xfe,
+ 0x1f, 0x00, 0xc0, 0xe0, 0xa0, 0x01, 0x1e, 0x0b, 0xdf, 0x20, 0x74, 0x41,
+ 0xde, 0x02, 0x37, 0x74,
+ 0x01, 0x00, 0xfe, 0x01, 0x23, 0x03, 0x10, 0x00, 0x10, 0x13, 0x02, 0xf0,
+ 0x00, 0x75, 0x32, 0x0d,
+ 0x10, 0x37, 0xf1, 0xbb, 0xf0, 0x25, 0x31, 0x1f, 0x0e, 0x12, 0x00, 0x40,
+ 0xe0, 0xdf, 0x52, 0x47,
+ 0x01, 0xde, 0xef, 0x2f, 0x73, 0x56, 0x00, 0xfd, 0xf0, 0x23, 0x00, 0x00,
+ 0xe0, 0x35, 0x00, 0xab,
+ 0xe0, 0xf0, 0xf1, 0x00, 0x00, 0x22, 0x02, 0xcf, 0x21, 0x56, 0x00, 0x00,
+ 0xef, 0x00, 0x03, 0xe0,
+ 0xe1, 0x27, 0x61, 0x00, 0xe0, 0x00, 0xb1, 0xde, 0x00, 0x36, 0xf0, 0xb1,
+ 0xe1, 0x00, 0xf0, 0xe0,
+ 0xf0, 0x33, 0x74, 0x00, 0x00, 0xf0, 0xf1, 0x04, 0x15, 0x0f, 0x8a, 0xe0,
+ 0x02, 0x00, 0xf1, 0xde,
+ 0x0d, 0x00, 0x30, 0x0f, 0xfc, 0x00, 0x00, 0x1c, 0x4e, 0x10, 0x02, 0x00,
+ 0x08, 0x1f, 0xf0, 0x8b,
+ 0xed, 0x0d, 0x4e, 0x71, 0x35, 0xee, 0xdd, 0xff, 0x21, 0x30, 0xdb, 0x01,
+ 0x52, 0x00, 0xfe, 0x0e,
+ 0x1e, 0x10, 0x31, 0x23, 0x0d, 0xc9, 0xf0, 0x30, 0x73, 0x02, 0x01, 0x01,
+ 0xee, 0xec, 0xf0, 0x12,
+ 0x40, 0x33, 0x15, 0xd0, 0xf1, 0x22, 0x0c, 0xcd, 0x01, 0x23, 0x21, 0x41,
+ 0x64, 0x27, 0x25, 0xfe,
+ 0xe0, 0x20, 0x02, 0x8f, 0xfd, 0x04, 0x67, 0x10, 0x00, 0x01, 0x10, 0xf1,
+ 0xee, 0x00, 0x03, 0x01,
+ 0x31, 0x74, 0x10, 0x0f, 0x0d, 0x01, 0xf5, 0x00, 0xe0, 0x0e, 0x64, 0x35,
+ 0x0f, 0x1e, 0x22, 0x21,
+ 0x1f, 0x40, 0x44, 0xed, 0xcc, 0xf0, 0x22, 0x5d, 0x1f, 0x30, 0x01, 0x00,
+ 0x02, 0x07, 0x1f, 0xfb,
+ 0xc0, 0x41, 0x02, 0xcd, 0xbb, 0x00, 0x00, 0x00, 0x10, 0x43, 0x30, 0x1d,
+ 0xee, 0xe0, 0x47, 0x31,
+ 0x31, 0xd0, 0xee, 0x20, 0x41, 0x02, 0x9f, 0x00, 0x26, 0x43, 0xe0, 0x9c,
+ 0x00, 0x07, 0x00, 0xf0,
+ 0x1f, 0x10, 0x12, 0x11, 0x02, 0xf3, 0xd0, 0xcd, 0x04, 0x55, 0xd0, 0x9a,
+ 0x00, 0x11, 0xf1, 0xbf,
+ 0x0f, 0x00, 0xf1, 0x0f, 0x01, 0x25, 0xfe, 0xbb, 0x00, 0x03, 0xf0, 0xdd,
+ 0xff, 0x10, 0x20, 0xcd,
+ 0xea, 0xfd, 0x0e, 0x00, 0x71, 0x00, 0xfb, 0x00, 0x13, 0x20, 0x0e, 0xcd,
+ 0xff, 0x1d, 0x0f, 0xff,
+ 0x0e, 0xdb, 0x00, 0x73, 0x32, 0x1c, 0xed, 0xfd, 0xed, 0x20, 0x10, 0xbf,
+ 0xd8, 0xff, 0x2f, 0x30,
+ 0xd1, 0xab, 0xfe, 0x01, 0x47, 0x01, 0x00, 0x00, 0xf1, 0xad, 0xed, 0x21,
+ 0x62, 0x00, 0x0e, 0xe0,
+ 0xee, 0x02, 0x37, 0x22, 0x10, 0x00, 0xc0, 0x01, 0x54, 0x10, 0x04, 0x45,
+ 0xef, 0xce, 0x00, 0x00,
+ 0x12, 0x51, 0x12, 0x02, 0x0f, 0xf9, 0xef, 0xe0, 0x24, 0x21, 0xde, 0xbd,
+ 0x10, 0x77, 0x01, 0xec,
+ 0xf0, 0x40, 0x42, 0x0e, 0xa9, 0x00, 0x00, 0x00, 0x10, 0x0e, 0xe0, 0x0f,
+ 0x10, 0x43, 0x01, 0xcd,
+ 0xfc, 0x12, 0x14, 0x0f, 0xca, 0x00, 0xef, 0xde, 0xcd, 0x10, 0x43, 0x01,
+ 0xde, 0x01, 0x77, 0xf0,
+ 0xeb, 0x00, 0x33, 0x00, 0xff, 0xd0, 0xe1, 0x00, 0x0f, 0xc0, 0x22, 0x34,
+ 0xd0, 0xe0, 0xe1, 0xbf,
+ 0xf2, 0x47, 0x30, 0xe0, 0xde, 0x01, 0xd1, 0x8c, 0xf0, 0x04, 0x64, 0xf0,
+ 0xcc, 0x01, 0x01, 0x00,
+ 0x10, 0x02, 0xc2, 0xff, 0xe0, 0x02, 0x0f, 0xcd, 0x07, 0x30, 0xdf, 0xfe,
+ 0x12, 0x53, 0x00, 0x0f,
+ 0x11, 0xe4, 0xc8, 0xcb, 0x20, 0x52, 0x00, 0x00, 0x0d, 0x30, 0x00, 0xdf,
+ 0x1f, 0x4f, 0x10, 0xef,
+ 0x00, 0x21, 0xdb, 0x9c, 0x34, 0x65, 0xfe, 0xed, 0x0f, 0x31, 0x42, 0xff,
+ 0xee, 0x11, 0x20, 0x0b,
+ 0xce, 0x0f, 0x10, 0x01, 0x03, 0xe0, 0x31, 0x41, 0x00, 0x50, 0x0e, 0xec,
+ 0x10, 0x30, 0x0d, 0xb8,
+ 0x2f, 0x54, 0x14, 0x00, 0x0f, 0x20, 0x02, 0x23, 0x11, 0x20, 0x60, 0x25,
+ 0x34, 0x00, 0xf3, 0x45,
+ 0x00, 0xcc, 0xf0, 0x54, 0x52, 0x0e, 0xfd, 0x26, 0x32, 0x0f, 0xff, 0xc0,
+ 0xff, 0x12, 0x12, 0x00,
+ 0xf0, 0x11, 0x00, 0x20, 0x74, 0x21, 0x00, 0xfc, 0x0d, 0x30, 0x37, 0x76,
+ 0x20, 0x00, 0xd0, 0xef,
+ 0xff, 0x0d, 0x01, 0x24, 0x20, 0xfe, 0xaf, 0xff, 0xd0, 0x00, 0xf0, 0x9c,
+ 0x00, 0x44, 0x00, 0xef,
+ 0xfe, 0x00, 0x05, 0x32, 0xff, 0xba, 0xf1, 0xe2, 0xe0, 0x21, 0x25, 0xe0,
+ 0xc0, 0xd0, 0xd5, 0xdf,
+ 0x00, 0x62, 0x02, 0xbe, 0x0f, 0x34, 0x36, 0xe0, 0xaf, 0x00, 0x05, 0x00,
+ 0x0f, 0x22, 0x44, 0xe0,
+ 0xdd, 0x0e, 0xdf, 0xd1, 0xe0, 0xd0, 0xc0, 0xd4, 0xe0, 0xbb, 0xfe, 0x1f,
+ 0x43, 0x03, 0xdc, 0xdd,
+ 0x70, 0x34, 0x00, 0xe9, 0xff, 0x20, 0x60, 0xfe, 0xb8, 0x0f, 0x00, 0x43,
+ 0x10, 0x0e, 0xee, 0x1e,
+ 0x20, 0x30, 0x12, 0xff, 0xbe, 0x00, 0x10, 0x23, 0x64, 0x10, 0x0b, 0x0d,
+ 0xef, 0x22, 0x33, 0xfc,
+ 0x01, 0x27, 0x1f, 0x1e, 0x00, 0xf0, 0xf1, 0xc0, 0x01, 0x33, 0x75, 0x00,
+ 0xe0, 0xef, 0xe0, 0x30,
+ 0x75, 0x00, 0xcf, 0xf0, 0x13, 0x77, 0x02, 0xe0, 0x00, 0x10, 0x05, 0x05,
+ 0x20, 0x00, 0x83, 0x00,
+ 0xa8, 0x06, 0x63, 0x31, 0xd4, 0x07, 0x57, 0x31, 0x15, 0x64, 0x30, 0x00,
+ 0xc1, 0x03, 0x70, 0x3f,
+ 0x01, 0x47, 0xe0, 0xaf, 0x0f, 0x64, 0x14, 0xfd, 0xff, 0xf1, 0x00, 0xe0,
+ 0xf0, 0x01, 0x0c, 0xe0,
+ 0x67, 0x52, 0x00, 0xfa, 0xf0, 0x10, 0x31, 0x10, 0x00, 0x0d, 0x01, 0xf0,
+ 0xfd, 0x30, 0x2f, 0xe1,
+ 0xc0, 0xb8, 0xee, 0x21, 0x74, 0xff, 0xdc, 0xe0, 0xfe, 0x00, 0x50, 0x0f,
+ 0x0f, 0x0f, 0x1f, 0x20,
+ 0x21, 0x30, 0x13, 0xee, 0x9a, 0x00, 0xe0, 0xfe, 0x0d, 0xdd, 0x01, 0x17,
+ 0x00, 0xdd, 0x00, 0x0e,
+ 0x0f, 0x01, 0xd2, 0xb0, 0x40, 0x00, 0x8a, 0xf0, 0x02, 0x0c, 0xf0, 0xf3,
+ 0x02, 0x1e, 0xfd, 0x03,
+ 0xd2, 0x88, 0xdd, 0xf0, 0xef, 0xe0, 0x03, 0xef, 0x0b, 0xf1, 0xe2, 0xad,
+ 0x0e, 0x00, 0xee, 0xec,
+ 0x1d, 0x0d, 0xbd, 0xe8, 0xdd, 0x0f, 0xfd, 0xca, 0x1f, 0x70, 0x12, 0x10,
+ 0xfb, 0x10, 0x40, 0xe0,
+ 0xcb, 0xe0, 0x00, 0x10, 0x0e, 0x0f, 0x30, 0x0f, 0x2e, 0x10, 0x03, 0xdd,
+ 0xfc, 0x3f, 0x33, 0xc0,
+ 0x88, 0x00, 0x01, 0xef, 0x8a, 0x00, 0x43, 0x12, 0x00, 0x10, 0x01, 0xf0,
+ 0xef, 0x0e, 0x20, 0x41,
+ 0xf0, 0xcf, 0x04, 0x13, 0xe0, 0x17, 0x74, 0x1f, 0x0f, 0x34, 0x00, 0xdf,
+ 0x01, 0x57, 0x34, 0xff,
+ 0xdf, 0x00, 0x31, 0x11, 0x22, 0x32, 0x62, 0x10, 0x01, 0xe1, 0xbf, 0xf0,
+ 0x01, 0x22, 0xf3, 0x05,
+ 0x44, 0x43, 0x00, 0xef, 0x00, 0x73, 0x21, 0x0b, 0x00, 0x01, 0x00, 0x00,
+ 0x13, 0x22, 0xff, 0xec,
+ 0x10, 0x51, 0x02, 0xfc, 0xe2, 0x25, 0x00, 0xc0, 0x00, 0x02, 0x88, 0xc9,
+ 0x11, 0x30, 0x10, 0x01,
+ 0x31, 0x23, 0x0f, 0xbe, 0xfd, 0x12, 0x57, 0xdf, 0xee, 0x01, 0x01, 0xf0,
+ 0xff, 0x00, 0x14, 0x13,
+ 0x22, 0xc0, 0x9a, 0x01, 0x25, 0x40, 0xf1, 0xc0, 0xf0, 0xee, 0x0f, 0x01,
+ 0x35, 0x10, 0x0f, 0xd0,
+ 0x01, 0x11, 0xf1, 0x9e, 0xef, 0xe1, 0xb2, 0xee, 0xef, 0x02, 0x13, 0x27,
+ 0xf2, 0x99, 0xff, 0xf1,
+ 0x02, 0x2e, 0xfd, 0x01, 0x41, 0xf0, 0xfb, 0xe0, 0x0e, 0xff, 0x1d, 0x70,
+ 0x0e, 0xd9, 0x0e, 0x10,
+ 0x20, 0x00, 0x01, 0xf0, 0xc8, 0xbf, 0x0f, 0x51, 0x31, 0x00, 0xfd, 0x0e,
+ 0x10, 0x20, 0x0f, 0x00,
+ 0x1c, 0x10, 0x1f, 0x0c, 0x30, 0x23, 0x8d, 0xfc, 0x11, 0x77, 0x21, 0x0f,
+ 0xdb, 0x0f, 0x30, 0x02,
+ 0x00, 0x0d, 0x0f, 0x1d, 0x30, 0x16, 0x21, 0x30, 0x61, 0x41, 0xf1, 0xbf,
+ 0xfc, 0x13, 0x47, 0x01,
+ 0xee, 0x40, 0x56, 0x00, 0xee, 0x11, 0x31, 0x00, 0x20, 0x65, 0x22, 0x00,
+ 0xbe, 0x0f, 0xf0, 0x02,
+ 0x00, 0x03, 0x00, 0xf0, 0x01, 0x01, 0x32, 0x42, 0x0f, 0x1f, 0x21, 0x0d,
+ 0x0c, 0x57, 0x57, 0x21,
+ 0x00, 0x00, 0x00, 0x0e, 0xc0, 0xd0, 0xff, 0x00, 0x21, 0xd3, 0xa2, 0x01,
+ 0xfc, 0x1f, 0x30, 0xce,
+ 0xed, 0x47, 0x35, 0xbf, 0xe0, 0x11, 0x00, 0xdd, 0xf0, 0x03, 0xd0, 0xcd,
+ 0x04, 0x34, 0x00, 0xc3,
+ 0x04, 0x01, 0xde, 0xee, 0x03, 0x43, 0xce, 0x8a, 0x04, 0xf3, 0xdb, 0xff,
+ 0x42, 0x45, 0xce, 0xdd,
+ 0x11, 0x45, 0x01, 0xde, 0xee, 0x01, 0x02, 0xe0, 0xad, 0x0f, 0x03, 0x01,
+ 0xdd, 0xfe, 0xf0, 0xdd,
+ 0x0e, 0x01, 0x00, 0xec, 0x0e, 0x3c, 0x4c, 0xdb, 0xee, 0x2c, 0xea, 0xbf,
+ 0x0d, 0x70, 0x10, 0x0c,
+ 0x0f, 0x0e, 0xff, 0x2e, 0x1f, 0x0f, 0x2f, 0xaa, 0xee, 0xee, 0x0f, 0x73,
+ 0x60, 0x08, 0xef, 0x00,
+ 0x00, 0x0d, 0xf0, 0x23, 0x42, 0x0f, 0x0c, 0xee, 0xfe, 0x00, 0x12, 0x22,
+ 0xe0, 0xeb, 0xff, 0xfe,
+ 0x24, 0x74, 0x2f, 0x40, 0x00, 0xdf, 0xd0, 0x00, 0x22, 0x76, 0x14, 0xf0,
+ 0xec, 0xef, 0x00, 0x02,
+ 0x13, 0x20, 0x22, 0x01, 0x75, 0x65, 0x00, 0x0e, 0x01, 0x10, 0x02, 0x13,
+ 0x00, 0xed, 0xf1, 0x02,
+ 0xeb, 0xff, 0x44, 0x12, 0x0f, 0xce, 0x14, 0x53, 0x24, 0x34, 0x30, 0x30,
+ 0x50, 0x50, 0x12, 0x10,
+ 0x0d, 0x02, 0x37, 0x0f, 0xc9, 0x11, 0x74, 0xfe, 0xcd, 0x10, 0x43, 0x00,
+ 0xdd, 0x00, 0x10, 0x0f,
+ 0xfb, 0x21, 0x52, 0x10, 0xf2, 0xdd, 0xff, 0x15, 0x42, 0x1e, 0xfd, 0x00,
+ 0x14, 0x64, 0x00, 0xed,
+ 0xdf, 0x12, 0x47, 0x00, 0xcf, 0xce, 0xf0, 0x21, 0x47, 0x44, 0x00, 0xdf,
+ 0xf0, 0x00, 0x22, 0x00,
+ 0xce, 0x01, 0x14, 0xdf, 0x01, 0x14, 0x00, 0x90, 0x01, 0xe0, 0xca, 0xff,
+ 0xe2, 0x05, 0x21, 0xc0,
+ 0xa0, 0x00, 0xf0, 0xee, 0xf0, 0xde, 0xed, 0x1d, 0x30, 0x01, 0x9e, 0xd8,
+ 0x0f, 0x10, 0x0d, 0xfa,
+ 0xe0, 0x20, 0x20, 0x10, 0x71, 0x00, 0x0d, 0xfc, 0xfe, 0x1e, 0x0d, 0xee,
+ 0xe0, 0x23, 0x22, 0x19,
+ 0x5e, 0x60, 0x00, 0xed, 0x00, 0x26, 0x1f, 0x0d, 0x12, 0x0f, 0x89, 0xdf,
+ 0x00, 0x44, 0x00, 0xed,
+ 0x00, 0x74, 0x12, 0x0e, 0xff, 0x11, 0x23, 0x22, 0x0d, 0xcc, 0xff, 0xf4,
+ 0xf1, 0xed, 0xff, 0x14,
+ 0x77, 0x02, 0xf0, 0x00, 0x11, 0x54, 0x10, 0x11, 0xf0, 0xf0, 0x01, 0x27,
+ 0x30, 0x61, 0x12, 0x0f,
+ 0xef, 0x0f, 0x00, 0xf0, 0xb0, 0x00, 0xf1, 0x07, 0x10, 0xdf, 0x10, 0x62,
+ 0x20, 0x0c, 0x0c, 0x20,
+ 0x10, 0x13, 0x13, 0x20, 0x4f, 0x41, 0x0f, 0xfd, 0xe0, 0xbe, 0xee, 0xe1,
+ 0xc8, 0xec, 0x22, 0x73,
+ 0x1d, 0xeb, 0xef, 0x0e, 0x00, 0x00, 0x01, 0x16, 0x62, 0x0f, 0xfd, 0xec,
+ 0x31, 0x32, 0xc0, 0xba,
+ 0xff, 0xe0, 0xe3, 0xf0, 0xf0, 0x34, 0x02, 0xae, 0xfc, 0x33, 0x46, 0xef,
+ 0xf0, 0x42, 0x04, 0xef,
+ 0x9d, 0xfe, 0x00, 0x01, 0x12, 0x01, 0xde, 0xf1, 0x07, 0x33, 0x40, 0xaf,
+ 0xdc, 0x00, 0x05, 0xf0,
+ 0xdd, 0xf2, 0x04, 0x20, 0xe0, 0xc2, 0xe0, 0xec, 0xbd, 0x00, 0x53, 0x02,
+ 0x0e, 0xd0, 0x02, 0x0d,
+ 0xea, 0x00, 0x1f, 0x0e, 0x0d, 0xe0, 0x0f, 0xfa, 0xdf, 0x30, 0x61, 0x0d,
+ 0xdb, 0xff, 0x20, 0x50,
+ 0x21, 0x13, 0x3c, 0x1e, 0x9d, 0xc8, 0x00, 0x30, 0x62, 0x00, 0xec, 0xfe,
+ 0x01, 0x01, 0x00, 0xed,
+ 0x30, 0x4f, 0x30, 0x0c, 0x20, 0x71, 0x20, 0xf8, 0xf0, 0xfe, 0xfd, 0xd0,
+ 0x32, 0x44, 0x0f, 0xed,
+ 0x10, 0x64, 0x21, 0x22, 0x11, 0x0e, 0xc9, 0x00, 0x75, 0x51, 0x00, 0xf1,
+ 0x00, 0x11, 0x10, 0x00,
+ 0x24, 0x44, 0x01, 0xef, 0xee, 0x0f, 0x11, 0xf2, 0xce, 0x00, 0x16, 0xf0,
+ 0xd0, 0x20, 0x70, 0x10,
+ 0x20, 0x30, 0x21, 0x05, 0x00, 0x10, 0x55, 0x24, 0x10, 0xee, 0xbd, 0x00,
+ 0xf0, 0xfc, 0xfb, 0xef,
+ 0x00, 0xf0, 0xde, 0x10, 0x74, 0x0d, 0xce, 0x05, 0xf2, 0xde, 0xdc, 0x00,
+ 0x01, 0x9d, 0xfb, 0x00,
+ 0x00, 0x01, 0xa1, 0xfe, 0xf4, 0x04, 0x23, 0x01, 0xee, 0xde, 0x01, 0x67,
+ 0x02, 0xfe, 0xf1, 0x14,
+ 0xef, 0xbb, 0x00, 0x10, 0x13, 0x00, 0xee, 0xd1, 0x04, 0x13, 0x02, 0xfe,
+ 0x1f, 0xd0, 0x8e, 0xbf,
+ 0x06, 0x13, 0xdf, 0xdc, 0xe0, 0x36, 0x12, 0xce, 0xcb, 0x00, 0x11, 0x00,
+ 0xfe, 0xff, 0x20, 0x51,
+ 0xdd, 0xb9, 0x0f, 0x1d, 0xff, 0x00, 0x00, 0x0d, 0xfe, 0x4f, 0x62, 0x0f,
+ 0xe9, 0x00, 0x51, 0xfc,
+ 0xce, 0x32, 0x42, 0x0f, 0x1f, 0x12, 0x00, 0x0a, 0xad, 0x10, 0x66, 0x00,
+ 0x00, 0x0f, 0x01, 0x01,
+ 0xf0, 0x01, 0x40, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x07, 0x56, 0x10, 0xf0,
+ 0xdf, 0x00, 0x22, 0x31,
+ 0xf0, 0x03, 0x00, 0x13, 0x02, 0x8e, 0x00, 0xf1, 0x00, 0x14, 0x37, 0x42,
+ 0x30, 0x24, 0x00, 0xd0,
+ 0x00, 0x76, 0x21, 0x11, 0x00, 0x01, 0xd1, 0xce, 0xf1, 0x13, 0x00, 0xae,
+ 0xff, 0x25, 0x34, 0x00,
+ 0x30, 0x61, 0x0d, 0x0f, 0x46, 0x21, 0xfe, 0x00, 0x66, 0x10, 0xeb, 0xe0,
+ 0x20, 0x44, 0xef, 0xdc,
+ 0x20, 0x31, 0xe0, 0xde, 0x00, 0x73, 0x20, 0xdb, 0xee, 0x00, 0x64, 0x00,
+ 0x0f, 0xfd, 0xf0, 0xfe,
+ 0x00, 0x20, 0x02, 0xf0, 0xf1, 0x10, 0x30, 0xf5, 0x02, 0x0c, 0xbd, 0xbc,
+ 0xde, 0xfe, 0x5f, 0x23,
+ 0x27, 0x03, 0xff, 0xee, 0x0f, 0xde, 0x10, 0x74, 0xfd, 0x89, 0x00, 0x02,
+ 0x10, 0x0f, 0xf0, 0xde,
+ 0xfd, 0xf0, 0xce, 0x03, 0x04, 0x13, 0xf4, 0xd3, 0x00, 0xbc, 0xfe, 0xcc,
+ 0xee, 0xed, 0x12, 0x53,
+ 0xe9, 0xbc, 0x00, 0x00, 0x00, 0x1d, 0x0d, 0xfe, 0x0e, 0x00, 0x31, 0x20,
+ 0x0b, 0xbc, 0xb9, 0x0f,
+ 0x10, 0x3f, 0xfe, 0xde, 0x00, 0x30, 0x75, 0x00, 0xf9, 0xf0, 0x11, 0x11,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0xce, 0xef, 0xfe, 0x00, 0x0f, 0xbe, 0x00, 0x31, 0x00, 0x77, 0x66, 0x00,
+ 0xff, 0x00, 0x21, 0x00,
+ 0xef, 0x0f, 0x01, 0xf0, 0xcc, 0x01, 0x57, 0x01, 0xef, 0xf0, 0x11, 0x43,
+ 0x21, 0x24, 0x52, 0x10,
+ 0x00, 0x11, 0x33, 0x23, 0x33, 0x24, 0xe0, 0xad, 0x00, 0x14, 0x36, 0xd0,
+ 0x90, 0x01, 0x03, 0x32,
+ 0xe0, 0x00, 0x53, 0x23, 0x25, 0x00, 0xdd, 0xe0, 0x23, 0x55, 0x10, 0x1e,
+ 0x1f, 0x35, 0x00, 0xce,
+ 0x12, 0x33, 0xe9, 0xae, 0xff, 0x02, 0x20, 0x2c, 0xf0, 0x01, 0xf0, 0xbd,
+ 0x0e, 0x01, 0x24, 0x12,
+ 0xdc, 0xff, 0x20, 0x30, 0x32, 0xdd, 0x88, 0xae, 0x02, 0x04, 0xfc, 0xef,
+ 0x02, 0x21, 0xf0, 0xdf,
+ 0x32, 0x14, 0x03, 0x21, 0xe2, 0x54, 0x11, 0xdd, 0xbc, 0xf0, 0xda, 0xce,
+ 0x00, 0x04, 0xc0, 0x00,
+ 0x22, 0x20, 0xe0, 0x91, 0xf3, 0xcf, 0xed, 0xd1, 0x16, 0x00, 0xc0, 0xcd,
+ 0xef, 0xff, 0xda, 0xbd,
+ 0x10, 0x03, 0x00, 0xf0, 0xfe, 0xdb, 0xee, 0x11, 0x00, 0x9c, 0x0e, 0x2e,
+ 0xc8, 0xbc, 0xf0, 0x0f,
+ 0x30, 0x30, 0x1e, 0xfc, 0xef, 0x41, 0x13, 0x02, 0xff, 0x0d, 0x0c, 0xfe,
+ 0xbd, 0xed, 0x40, 0x6e,
+ 0x0b, 0xfd, 0x00, 0x11, 0x0c, 0x0e, 0x20, 0x75, 0x0e, 0xf8, 0x00, 0x32,
+ 0x40, 0x00, 0xee, 0x1f,
+ 0x0e, 0x0d, 0x01, 0x43, 0x0f, 0xcc, 0x15, 0x42, 0x0f, 0x0f, 0x76, 0x00,
+ 0x00, 0x11, 0x21, 0x20,
+ 0x21, 0x21, 0x12, 0x21, 0x10, 0x13, 0x10, 0x33, 0x77, 0x14, 0x00, 0x01,
+ 0x01, 0x43, 0x00, 0xe0,
+ 0x0f, 0x23, 0x05, 0xcf, 0x00, 0x63, 0x00, 0x0e, 0x01, 0x77, 0x26, 0xfe,
+ 0xef, 0x52, 0x45, 0x10,
+ 0xf0, 0x00, 0xe1, 0x00, 0xee, 0x00, 0x52, 0xef, 0xdb, 0x00, 0x44, 0x01,
+ 0xef, 0x02, 0x45, 0x20,
+ 0xd0, 0xef, 0xe0, 0xbe, 0xf0, 0xff, 0x11, 0x0f, 0x8c, 0x01, 0x07, 0x00,
+ 0xff, 0x02, 0x13, 0x0f,
+ 0xff, 0x04, 0x01, 0x0f, 0x13, 0x53, 0xdf, 0xb8, 0xff, 0x00, 0x02, 0xf0,
+ 0xde, 0xde, 0x12, 0x56,
+ 0xf0, 0xc0, 0x0f, 0x20, 0xf1, 0xa0, 0xe0, 0x00, 0x25, 0x00, 0xbb, 0xf0,
+ 0x01, 0x14, 0xde, 0x9c,
+ 0x00, 0x01, 0x00, 0x00, 0x1e, 0x20, 0x00, 0xff, 0xdb, 0xf1, 0xff, 0xa8,
+ 0x0f, 0x20, 0x00, 0xef,
+ 0x0f, 0x2f, 0x0c, 0x20, 0x70, 0xfd, 0xdd, 0xf0, 0x00, 0x61, 0x20, 0x0f,
+ 0x00, 0x00, 0xe8, 0xcc,
+ 0x0e, 0x71, 0x13, 0x00, 0x00, 0x0f, 0x00, 0x21, 0x00, 0xe9, 0xef, 0x00,
+ 0x00, 0x0e, 0x22, 0x35,
+ 0xde, 0x0e, 0x71, 0x22, 0xf0, 0xfd, 0x02, 0xf2, 0xf5, 0x12, 0x0f, 0xff,
+ 0xd1, 0x0e, 0x3a, 0x71,
+ 0x62, 0x01, 0x45, 0x13, 0x12, 0xff, 0x00, 0x36, 0x41, 0xf0, 0xff, 0x30,
+ 0x66, 0xf0, 0xb0, 0x00,
+ 0x10, 0x00, 0xee, 0xf0, 0x01, 0x13, 0x34, 0x12, 0x2f, 0x21, 0x77, 0x30,
+ 0xf0, 0xfe, 0x53, 0x45,
+ 0x1e, 0xff, 0xf0, 0x00, 0x00, 0x02, 0x0f, 0x0e, 0x11, 0x41, 0x00, 0x01,
+ 0x57, 0x10, 0xfc, 0xe0,
+ 0x11, 0x75, 0x10, 0xfe, 0xdd, 0x01, 0x11, 0x1e, 0xeb, 0x02, 0x65, 0x00,
+ 0xdd, 0xf0, 0x11, 0x64,
+ 0x10, 0x01, 0xee, 0xce, 0xfd, 0x02, 0x27, 0x00, 0xf0, 0x22, 0x73, 0x0f,
+ 0xfe, 0x03, 0x30, 0xff,
+ 0xce, 0x03, 0x04, 0xec, 0xef, 0x16, 0x52, 0x01, 0xaf, 0xee, 0xf3, 0xf4,
+ 0xe1, 0xf2, 0xe3, 0xec,
+ 0xcc, 0x13, 0x21, 0xec, 0xbd, 0x01, 0x00, 0xbc, 0x0f, 0x02, 0x00, 0xf9,
+ 0xae, 0xfc, 0x00, 0x12,
+ 0xee, 0xdd, 0x20, 0x30, 0x2a, 0x2f, 0x0d, 0xad, 0x0e, 0x11, 0x0f, 0x0c,
+ 0x00, 0x11, 0x1c, 0xdd,
+ 0xcf, 0xfd, 0x0e, 0x74, 0x42, 0x0e, 0xda, 0xfd, 0x0e, 0x33, 0x0f, 0xda,
+ 0xde, 0x0f, 0x20, 0x30,
+ 0x74, 0x31, 0xec, 0x00, 0x65, 0x22, 0xee, 0xde, 0x01, 0x03, 0xac, 0xfe,
+ 0xff, 0x32, 0x10, 0xed,
+ 0xed, 0x55, 0x33, 0x13, 0x25, 0x44, 0x11, 0x1f, 0xff, 0xbf, 0x00, 0x14,
+ 0x32, 0x20, 0xd0, 0xae,
+ 0x14, 0x15, 0x01, 0xf0, 0xde, 0x00, 0x00, 0xe0, 0xf0, 0x57, 0x63, 0x00,
+ 0x0c, 0xef, 0x00, 0x30,
+ 0x00, 0x0c, 0x50, 0x26, 0xf0, 0xce, 0x11, 0x54, 0x0f, 0xcb, 0xdf, 0x00,
+ 0x20, 0x1e, 0x0f, 0x0f,
+ 0x00, 0x62, 0x0f, 0xfd, 0xed, 0x0e, 0x03, 0x16, 0x0f, 0xeb, 0x12, 0x51,
+ 0x0f, 0xdd, 0xce, 0x21,
+ 0x00, 0x00, 0xe7, 0xd0, 0xbf, 0xff, 0xd0, 0xf1, 0x34, 0x40, 0x00, 0x54,
+ 0x36, 0xef, 0xce, 0x00,
+ 0xf2, 0xf0, 0xed, 0xee, 0xbe, 0x00, 0x17, 0x01, 0xad, 0x01, 0x06, 0x00,
+ 0xb1, 0x00, 0x00, 0xd2,
+ 0xc0, 0xe0, 0x02, 0xd0, 0xcc, 0xf0, 0x02, 0xd2, 0x9d, 0x03, 0x37, 0xf0,
+ 0xbf, 0x10, 0x12, 0xff,
+ 0xcc, 0x02, 0x40, 0xff, 0xdb, 0xfe, 0x0f, 0x2d, 0xed, 0xca, 0x00, 0x31,
+ 0x22, 0x00, 0x43, 0x35,
+ 0x0f, 0xbc, 0xce, 0x0d, 0x00, 0x20, 0x50, 0x0f, 0xc9, 0x20, 0x30, 0x0e,
+ 0xe0, 0x41, 0x53, 0x20,
+ 0x0d, 0x0d, 0xf1, 0x01, 0x22, 0x42, 0x1d, 0xe8, 0xeb, 0x10, 0x00, 0xde,
+ 0x00, 0x73, 0x1d, 0x30,
+ 0x47, 0x40, 0x0f, 0xff, 0x31, 0x75, 0x31, 0x0f, 0xe0, 0x20, 0x31, 0xef,
+ 0xfe, 0x23, 0x33, 0x31,
+ 0x44, 0x05, 0xd0, 0x01, 0x12, 0x00, 0xe1, 0xe0, 0x75, 0x41, 0xef, 0x01,
+ 0x23, 0x20, 0x11, 0x23,
+ 0x03, 0x00, 0x30, 0x50, 0x44, 0x77, 0x07, 0x00, 0x00, 0x32, 0xff, 0xce,
+ 0x00, 0x20, 0x00, 0xcd,
+ 0x0d, 0x0e, 0x00, 0xf5, 0x22, 0x22, 0x9e, 0xff, 0x03, 0x24, 0xdf, 0xba,
+ 0x0f, 0x00, 0xed, 0xac,
+ 0xec, 0xef, 0x01, 0x57, 0x12, 0xf0, 0xdf, 0x22, 0x04, 0xe0, 0xe0, 0x00,
+ 0x12, 0x00, 0xf0, 0x00,
+ 0xfb, 0xe0, 0xf0, 0x8f, 0xfd, 0x01, 0x13, 0x0f, 0xc0, 0xf7, 0x43, 0x22,
+ 0xe0, 0xb0, 0xc1, 0xf2,
+ 0xdc, 0xfd, 0x22, 0x26, 0xae, 0xee, 0xe0, 0x24, 0x22, 0xaa, 0xde, 0x01,
+ 0x44, 0x00, 0xff, 0xe0,
+ 0xfd, 0xce, 0x00, 0x0e, 0xe8, 0xf0, 0x1f, 0x31, 0x0f, 0xad, 0x20, 0x42,
+ 0xfc, 0xce, 0x0f, 0x20,
+ 0x60, 0x13, 0x00, 0xeb, 0xed, 0x0d, 0x00, 0x0f, 0x0e, 0x32, 0x42, 0xfc,
+ 0x00, 0x75, 0x21, 0x1d,
+ 0x0e, 0x03, 0x33, 0xd8, 0xff, 0x11, 0x22, 0xf0, 0xf0, 0x20, 0x10, 0xb1,
+ 0xb0, 0x01, 0x37, 0x35,
+ 0x10, 0x3f, 0xe0, 0x8f, 0x0c, 0x13, 0x42, 0x0e, 0xf0, 0x26, 0x62, 0x00,
+ 0xfe, 0xff, 0x03, 0x22,
+ 0xee, 0x01, 0x77, 0x05, 0xef, 0xff, 0x00, 0x00, 0x00, 0x10, 0xf0, 0xff,
+ 0xf0, 0x12, 0x52, 0x0f,
+ 0x01, 0x43, 0x00, 0x0e, 0x02, 0x67, 0x21, 0xed, 0xfd, 0x11, 0x56, 0x00,
+ 0x0d, 0xdd, 0x0f, 0xf0,
+ 0x0f, 0x1e, 0x03, 0x47, 0x12, 0xfd, 0x0d, 0xe0, 0x51, 0x33, 0xda, 0xbe,
+ 0x0f, 0x20, 0xfb, 0xd0,
+ 0x00, 0x20, 0x30, 0x3d, 0x00, 0xc0, 0xf2, 0x01, 0x02, 0xcf, 0x88, 0xbe,
+ 0x0e, 0xfe, 0x00, 0x21,
+ 0x10, 0x0d, 0xfe, 0x02, 0x77, 0x32, 0x00, 0xcc, 0xdc, 0x00, 0x05, 0x01,
+ 0x1a, 0x00, 0x3c, 0x00,
+ 0x9b, 0xf9, 0xd1, 0xe7, 0x2e, 0xfb, 0x7d, 0xe8, 0x9c, 0x01, 0xe7, 0x80,
+ 0xe0, 0xd0, 0x00, 0x06,
+ 0x01, 0xcd, 0xef, 0x12, 0xf0, 0x9d, 0xff, 0xd2, 0xec, 0xed, 0x13, 0x36,
+ 0xed, 0xdd, 0xd0, 0xe1,
+ 0xa0, 0xda, 0xdf, 0xf0, 0x03, 0x11, 0x11, 0x14, 0xfe, 0xfa, 0x71, 0x01,
+ 0xcf, 0x00, 0x34, 0x44,
+ 0xde, 0xad, 0x01, 0x03, 0x26, 0x0f, 0xde, 0x0f, 0x01, 0x40, 0x21, 0x53,
+ 0x10, 0x3f, 0x2f, 0xfe,
+ 0xc8, 0xcf, 0x12, 0x34, 0xe0, 0x00, 0x42, 0x01, 0x30, 0x22, 0xf1, 0xf0,
+ 0x0b, 0xce, 0xfd, 0x50,
+ 0x50, 0xff, 0xfe, 0xec, 0x00, 0x77, 0x44, 0x10, 0x33, 0x22, 0x0d, 0x0b,
+ 0x00, 0xff, 0x22, 0x40,
+ 0xec, 0xe0, 0x00, 0x01, 0xf0, 0xfc, 0x41, 0x32, 0x3f, 0x0d, 0xeb, 0xae,
+ 0x00, 0x77, 0x32, 0xb9,
+ 0x00, 0x10, 0x32, 0x0f, 0xfd, 0x21, 0x64, 0x00, 0x0e, 0x01, 0x31, 0x00,
+ 0xbc, 0x00, 0x00, 0x10,
+ 0x00, 0x12, 0x23, 0x0c, 0xec, 0xf0, 0x11, 0x52, 0x03, 0xf0, 0xff, 0x20,
+ 0x34, 0x13, 0xeb, 0xcc,
+ 0x00, 0x10, 0x45, 0x01, 0x00, 0xe1, 0x04, 0xdf, 0x8d, 0xc0, 0x13, 0xf0,
+ 0xcd, 0x00, 0x27, 0x52,
+ 0x10, 0x01, 0x0e, 0x0b, 0x10, 0x1d, 0xce, 0xd0, 0xd3, 0x02, 0x0f, 0x10,
+ 0x01, 0xd2, 0x9e, 0xe0,
+ 0x17, 0x27, 0xcd, 0xbf, 0x00, 0xe1, 0xd0, 0xcf, 0xcd, 0xdd, 0xdd, 0x02,
+ 0x77, 0x00, 0xef, 0xd0,
+ 0x00, 0x0f, 0xcd, 0xee, 0x03, 0x23, 0xed, 0x88, 0xfd, 0x23, 0x25, 0x00,
+ 0xdd, 0xff, 0x01, 0x23,
+ 0xf1, 0x15, 0x52, 0xf0, 0xdf, 0x0f, 0xff, 0xf1, 0x01, 0x2d, 0x2d, 0x0f,
+ 0x4e, 0x74, 0x11, 0x0d,
+ 0x22, 0x47, 0x25, 0x0e, 0x0e, 0x00, 0x10, 0x72, 0x0e, 0xfc, 0x14, 0x11,
+ 0xec, 0xbe, 0x22, 0x36,
+ 0x0f, 0x0f, 0x11, 0x64, 0x20, 0x0d, 0x01, 0x14, 0x50, 0x1d, 0x30, 0x32,
+ 0x01, 0x0c, 0xfe, 0xf0,
+ 0xff, 0xee, 0x37, 0x52, 0x00, 0x10, 0x31, 0x2f, 0x3c, 0x21, 0xf2, 0xac,
+ 0x0d, 0x00, 0xf1, 0x10,
+ 0x2c, 0x2e, 0x43, 0x44, 0x0c, 0xdb, 0xff, 0x21, 0x75, 0x72, 0x40, 0xdd,
+ 0x0f, 0x00, 0x01, 0x0e,
+ 0x0c, 0xd0, 0x02, 0x32, 0xff, 0xba, 0x00, 0x24, 0xf0, 0xe0, 0xf1, 0xcd,
+ 0xfd, 0x27, 0x42, 0xf0,
+ 0xaa, 0x00, 0x12, 0xef, 0xcd, 0x01, 0x34, 0xd0, 0xd0, 0x12, 0x13, 0xae,
+ 0xdb, 0xf0, 0x01, 0x11,
+ 0xff, 0xdc, 0x00, 0x34, 0x00, 0x2e, 0xce, 0xb0, 0xe0, 0x90, 0xec, 0x12,
+ 0x37, 0x12, 0xef, 0xde,
+ 0xb0, 0x02, 0x12, 0x00, 0xcb, 0x00, 0x13, 0xf1, 0x8b, 0xef, 0x00, 0x02,
+ 0x00, 0xf0, 0xfc, 0xd0,
+ 0x05, 0x22, 0x0f, 0xbc, 0xd0, 0x00, 0xdf, 0xec, 0xd0, 0x10, 0x20, 0x00,
+ 0x66, 0x31, 0x0f, 0xdc,
+ 0xa0, 0x00, 0x13, 0x01, 0xf1, 0x22, 0x00, 0xe0, 0xec, 0xcf, 0xdc, 0xf0,
+ 0x57, 0x20, 0x00, 0x52,
+ 0x33, 0x00, 0x0e, 0x00, 0x01, 0x42, 0x11, 0xc8, 0xcf, 0x10, 0x22, 0x11,
+ 0x00, 0xfe, 0xf0, 0xc0,
+ 0xf1, 0xf0, 0x00, 0x67, 0x35, 0xfc, 0xe0, 0x1f, 0x20, 0x4e, 0x40, 0x11,
+ 0x43, 0x51, 0x0f, 0x0e,
+ 0x21, 0x23, 0x0e, 0xed, 0x00, 0x20, 0x46, 0xef, 0xcd, 0x10, 0x74, 0x14,
+ 0xe9, 0xcf, 0x20, 0x23,
+ 0x0f, 0xdd, 0x10, 0x71, 0x14, 0x0d, 0x0e, 0x11, 0x56, 0x00, 0x0e, 0x1f,
+ 0x00, 0x10, 0x52, 0x00,
+ 0x0a, 0x00, 0xf0, 0x10, 0x00, 0x23, 0x52, 0x00, 0x08, 0xe0, 0x31, 0x43,
+ 0xfe, 0xdd, 0x00, 0x23,
+ 0x1e, 0xfa, 0xbf, 0x01, 0x32, 0x21, 0x13, 0x00, 0xcf, 0x13, 0x77, 0x20,
+ 0x00, 0x0e, 0x0f, 0xee,
+ 0xce, 0xd0, 0x10, 0x72, 0x23, 0xd0, 0xf0, 0x57, 0x43, 0x0f, 0xdc, 0x0f,
+ 0xfc, 0x00, 0x24, 0xef,
+ 0xee, 0xf0, 0xe0, 0xee, 0xcd, 0x12, 0x47, 0xf0, 0xcf, 0x13, 0x0f, 0x9a,
+ 0xc0, 0x01, 0x13, 0xff,
+ 0xbc, 0x01, 0x02, 0xf0, 0xce, 0xff, 0x12, 0x1f, 0xd8, 0xdf, 0xd0, 0xde,
+ 0xf1, 0x77, 0x41, 0xef,
+ 0xce, 0x10, 0x01, 0x00, 0xff, 0x00, 0x44, 0x00, 0xdd, 0x00, 0x15, 0xff,
+ 0x90, 0x01, 0x21, 0x1f,
+ 0x0f, 0x32, 0x35, 0x00, 0x00, 0x5f, 0x0d, 0x10, 0x00, 0x00, 0x0c, 0xf1,
+ 0x07, 0x00, 0x11, 0xf1,
+ 0xa0, 0x1e, 0x70, 0x01, 0x00, 0x00, 0x2f, 0x2f, 0x2f, 0x0a, 0xee, 0x00,
+ 0x1f, 0x0e, 0x01, 0x77,
+ 0x77, 0x01, 0x0e, 0xdd, 0x00, 0x20, 0x03, 0x0f, 0xdc, 0x11, 0x33, 0x00,
+ 0x0e, 0x3f, 0xcd, 0x23,
+ 0x77, 0x10, 0xdb, 0x00, 0x00, 0x10, 0x10, 0x01, 0x0f, 0xae, 0xfe, 0x01,
+ 0x63, 0x10, 0x00, 0x0d,
+ 0x32, 0x45, 0xff, 0xfd, 0xff, 0x33, 0x26, 0xf0, 0xcc, 0xff, 0x10, 0x10,
+ 0xdd, 0xca, 0x00, 0x34,
+ 0x20, 0x20, 0x73, 0x44, 0xee, 0x0d, 0x00, 0xe4, 0x01, 0x01, 0x10, 0x13,
+ 0xf0, 0xa9, 0xf0, 0x20,
+ 0x32, 0xbd, 0xed, 0x03, 0xf1, 0xd2, 0x37, 0x72, 0x1f, 0xfd, 0x00, 0x01,
+ 0xfd, 0xca, 0x00, 0x42,
+ 0xf0, 0x8c, 0x00, 0x02, 0x02, 0xe1, 0x01, 0x10, 0xf0, 0xd1, 0x25, 0x1e,
+ 0xcb, 0xd0, 0x12, 0x01,
+ 0x8b, 0xef, 0x00, 0x02, 0xe0, 0xf2, 0xf2, 0x00, 0xdc, 0xff, 0xec, 0x00,
+ 0xef, 0xbf, 0xcd, 0xfe,
+ 0x26, 0x43, 0xf0, 0xce, 0x0e, 0x0e, 0xe0, 0xdd, 0x00, 0x37, 0x77, 0xf0,
+ 0xcc, 0x11, 0x02, 0xe0,
+ 0xdf, 0x0d, 0x00, 0x74, 0x0f, 0x0c, 0x00, 0x24, 0x31, 0x42, 0x1f, 0xec,
+ 0xef, 0x12, 0x33, 0xf0,
+ 0xc1, 0x20, 0x2f, 0xd9, 0xa0, 0x10, 0x52, 0x00, 0x10, 0x10, 0x67, 0x00,
+ 0x0e, 0x01, 0x34, 0x10,
+ 0x0b, 0x20, 0x73, 0x00, 0x00, 0x10, 0x0c, 0xf0, 0x0f, 0xf0, 0xfe, 0x23,
+ 0x56, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x53, 0x2e, 0xfa, 0xcf, 0x00, 0x30, 0x10, 0x00, 0x0f, 0x2f,
+ 0x13, 0xcf, 0xdc, 0x30,
+ 0x76, 0x61, 0x01, 0xfe, 0xfd, 0xff, 0x02, 0x12, 0xfe, 0xff, 0xea, 0xef,
+ 0x22, 0x41, 0xfe, 0xf0,
+ 0x01, 0x13, 0xec, 0xc0, 0x17, 0xe0, 0x9b, 0x11, 0x24, 0xce, 0xbe, 0xf0,
+ 0x01, 0x02, 0xef, 0x00,
+ 0x14, 0x34, 0xce, 0xbd, 0x00, 0x24, 0x12, 0xf0, 0x98, 0x00, 0x01, 0x21,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0xe0, 0xde, 0x00, 0xe3, 0xf2, 0xe0, 0x0f, 0x0e, 0xd1, 0x16, 0x31, 0xd0,
+ 0x9f, 0xf0, 0x10, 0xf0,
+ 0x8a, 0xde, 0x01, 0x02, 0xff, 0xee, 0x06, 0xf0, 0xae, 0xed, 0x03, 0x42,
+ 0xf8, 0x9d, 0x00, 0xf1,
+ 0x02, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x22, 0x00, 0x06, 0x34,
+ 0xff, 0xcd, 0x03, 0x31,
+ 0x8b, 0xec, 0x01, 0x43, 0x00, 0x14, 0x52, 0x12, 0x20, 0x0c, 0x00, 0x10,
+ 0x36, 0x20, 0xfe, 0xdd,
+ 0xd0, 0x0f, 0x24, 0x11, 0xec, 0xef, 0xe1, 0xbf, 0x0f, 0x77, 0x73, 0x1e,
+ 0x0d, 0x00, 0x02, 0x10,
+ 0x0c, 0xed, 0x10, 0x45, 0x10, 0x00, 0x11, 0x20, 0x01, 0x53, 0x10, 0xf8,
+ 0xbf, 0x02, 0x11, 0x0f,
+ 0xde, 0x53, 0x44, 0x0e, 0xec, 0x00, 0x2e, 0x1d, 0xfe, 0x13, 0x67, 0x02,
+ 0xcc, 0x0f, 0x20, 0x13,
+ 0x1e, 0x0f, 0x2e, 0x33, 0x11, 0x00, 0x20, 0x42, 0x25, 0x10, 0xdb, 0x8f,
+ 0x00, 0x21, 0x20, 0x1f,
+ 0x0f, 0x00, 0x64, 0x00, 0xec, 0x10, 0x10, 0x1e, 0x22, 0xed, 0xcc, 0xf0,
+ 0x27, 0x25, 0xcd, 0x0f,
+ 0x51, 0x24, 0x00, 0x01, 0xce, 0xdd, 0x0e, 0xf1, 0xd1, 0x11, 0x1e, 0x8c,
+ 0x03, 0x27, 0x50, 0x10,
+ 0x00, 0x02, 0x00, 0x0c, 0xaf, 0x0f, 0x02, 0x17, 0x00, 0xee, 0xdd, 0xd0,
+ 0x02, 0xf0, 0x01, 0xf5,
+ 0x51, 0x12, 0xad, 0xda, 0xd0, 0xf0, 0x01, 0x02, 0xc0, 0xdd, 0xdf, 0x02,
+ 0x36, 0x3f, 0x0d, 0x8e,
+ 0xdd, 0xfe, 0xe0, 0x06, 0x01, 0x10, 0x00, 0x00, 0xff, 0xdf, 0xfe, 0x02,
+ 0x01, 0xab, 0x00, 0xf3,
+ 0x02, 0x10, 0xcd, 0xc0, 0xed, 0x30, 0x77, 0x47, 0xf0, 0xff, 0x11, 0x63,
+ 0x00, 0x0c, 0x00, 0x1f,
+ 0xed, 0xd0, 0x05, 0x32, 0x00, 0xef, 0xbe, 0xf0, 0x00, 0x55, 0x21, 0x1f,
+ 0x0d, 0x0f, 0x50, 0x25,
+ 0x0f, 0xfb, 0xf0, 0x40, 0x01, 0x0f, 0x20, 0x55, 0x11, 0x00, 0xf0, 0x3f,
+ 0x0d, 0x8d, 0x03, 0x06,
+ 0x20, 0x0e, 0x10, 0x21, 0x10, 0x24, 0x32, 0x0b, 0xcd, 0xff, 0x20, 0x40,
+ 0xfe, 0xe0, 0x31, 0x0d,
+ 0xfa, 0x9e, 0x10, 0x74, 0x23, 0x01, 0x00, 0x1e, 0x00, 0x20, 0x01, 0xe1,
+ 0xff, 0xfc, 0xfe, 0x1e,
+ 0x75, 0x45, 0x0c, 0xfc, 0x00, 0x10, 0x00, 0xed, 0xf2, 0x23, 0x63, 0x12,
+ 0x0b, 0xf0, 0x16, 0x00,
+ 0xb0, 0x00, 0x14, 0x0f, 0xae, 0x01, 0xf1, 0x00, 0x43, 0x00, 0xdd, 0xda,
+ 0xc0, 0x03, 0x76, 0x0f,
+ 0xfe, 0x01, 0x55, 0x0f, 0xcc, 0x0f, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0,
+ 0x0f, 0x11, 0x04, 0x01,
+ 0xe0, 0xde, 0xee, 0xbf, 0xe0, 0xd7, 0xe0, 0xbe, 0xf0, 0xde, 0xee, 0xbc,
+ 0x02, 0x07, 0x01, 0x00,
+ 0xbc, 0xcd, 0x02, 0x13, 0xee, 0x9b, 0x00, 0x00, 0xf0, 0x01, 0xf1, 0x03,
+ 0x11, 0xee, 0xcb, 0x01,
+ 0x15, 0x21, 0xef, 0xad, 0x01, 0x13, 0x22, 0xec, 0x0f, 0x21, 0x33, 0x1e,
+ 0x0a, 0x30, 0xf0, 0x01,
+ 0x62, 0x40, 0x00, 0x01, 0x04, 0x12, 0x23, 0x25, 0x1e, 0x0a, 0x9e, 0xf0,
+ 0x32, 0x42, 0xff, 0x0f,
+ 0x74, 0x24, 0x30, 0x0f, 0x1d, 0x10, 0x30, 0x0f, 0x1c, 0x12, 0x77, 0x56,
+ 0xfe, 0x0d, 0x00, 0x01,
+ 0xfe, 0x0f, 0x13, 0x02, 0x10, 0x11, 0x53, 0x00, 0xed, 0x1b, 0x51, 0x15,
+ 0x0e, 0xfd, 0x0e, 0x01,
+ 0x63, 0xfa, 0x00, 0x43, 0xfd, 0xfd, 0x13, 0x76, 0x0e, 0xee, 0x04, 0x22,
+ 0xff, 0xfb, 0xf0, 0x21,
+ 0x00, 0xee, 0xff, 0x20, 0x10, 0x00, 0xf3, 0x0e, 0xbb, 0x21, 0x64, 0x00,
+ 0xcc, 0x00, 0x03, 0x31,
+ 0x02, 0x9c, 0x0f, 0x00, 0xf1, 0xef, 0x00, 0x04, 0x01, 0xf1, 0xef, 0xf0,
+ 0x04, 0x24, 0x0f, 0xbc,
+ 0x0e, 0xf0, 0xe1, 0xed, 0x0e, 0x54, 0xfe, 0xa8, 0x00, 0x01, 0x16, 0x0f,
+ 0xde, 0x0f, 0x02, 0xe3,
+ 0xf0, 0xcf, 0xe0, 0xf3, 0x20, 0x11, 0x8d, 0xcb, 0x01, 0xe2, 0x01, 0x00,
+ 0xbf, 0xff, 0x00, 0xf1,
+ 0xc0, 0x00, 0x47, 0x0e, 0xb8, 0xee, 0x00, 0x02, 0x01, 0x00, 0x12, 0x0e,
+ 0xde, 0x20, 0x22, 0xf1,
+ 0xb0, 0xed, 0xdf, 0xef, 0x17, 0x11, 0xbc, 0xce, 0x00, 0x02, 0x42, 0x02,
+ 0x20, 0x0e, 0x11, 0x77,
+ 0x11, 0x12, 0x3e, 0x0e, 0x23, 0x00, 0xde, 0x24, 0x17, 0x8e, 0xed, 0x01,
+ 0x33, 0xe0, 0xaa, 0x00,
+ 0x20, 0x35, 0x41, 0x10, 0x11, 0x0f, 0x0e, 0x00, 0x5e, 0x0e, 0x0e, 0xf0,
+ 0x04, 0x20, 0x2c, 0x11,
+ 0x20, 0x10, 0x21, 0x47, 0x10, 0xfd, 0xd0, 0x24, 0x64, 0x20, 0xdb, 0xf0,
+ 0x51, 0x10, 0xdb, 0xff,
+ 0x70, 0x54, 0x00, 0x00, 0xdc, 0x00, 0x32, 0x11, 0x20, 0x00, 0x10, 0x20,
+ 0x0d, 0x00, 0x47, 0x20,
+ 0xee, 0x0e, 0x00, 0x11, 0x61, 0x21, 0x40, 0x00, 0xff, 0xdc, 0x43, 0x50,
+ 0xfa, 0xfe, 0x30, 0x40,
+ 0xfb, 0xf1, 0x15, 0xef, 0xad, 0x01, 0x24, 0x30, 0xd0, 0xe0, 0x33, 0x63,
+ 0x1f, 0xc9, 0xef, 0x11,
+ 0x10, 0xe0, 0xf0, 0xe1, 0xf1, 0xf0, 0x63, 0x22, 0x0e, 0x10, 0x00, 0x0d,
+ 0x00, 0x23, 0x44, 0x30,
+ 0x0d, 0xa8, 0xed, 0xef, 0xf0, 0xdf, 0x15, 0x65, 0xde, 0xbd, 0xf0, 0x04,
+ 0xf0, 0xff, 0xe1, 0xed,
+ 0xdf, 0xd0, 0xd2, 0x03, 0x55, 0x00, 0x0a, 0xdf, 0xbd, 0x00, 0x14, 0x00,
+ 0xbc, 0xe0, 0x05, 0xef,
+ 0xbe, 0xf1, 0xf1, 0xf0, 0x0e, 0x11, 0xe2, 0x8c, 0x0e, 0x03, 0x16, 0x00,
+ 0xff, 0x32, 0x13, 0x01,
+ 0xff, 0x21, 0xfb, 0x30, 0x77, 0x1d, 0x00, 0x21, 0x9d, 0x02, 0x00, 0x00,
+ 0x26, 0xfe, 0xae, 0x0f,
+ 0x02, 0x13, 0x20, 0x10, 0x21, 0x0f, 0x10, 0x0e, 0x21, 0x20, 0x0e, 0xbc,
+ 0xca, 0x13, 0x77, 0x00,
+ 0xfd, 0xf0, 0x10, 0x30, 0x03, 0xf1, 0xfd, 0xf0, 0x05, 0x00, 0xde, 0xdf,
+ 0x32, 0x64, 0x0c, 0xfe,
+ 0x0f, 0x3f, 0x00, 0x10, 0x33, 0x51, 0xfa, 0xdd, 0xdf, 0x21, 0x51, 0x10,
+ 0x00, 0xf3, 0x36, 0x71,
+ 0x0e, 0xfd, 0x00, 0x24, 0x0e, 0xcc, 0x00, 0x63, 0x01, 0xfb, 0xf0, 0x10,
+ 0x3f, 0xfe, 0xff, 0xfd,
+ 0x0f, 0x77, 0x45, 0x00, 0x00, 0xdf, 0x00, 0x13, 0x21, 0x0d, 0xd0, 0x03,
+ 0x0f, 0xdd, 0x43, 0x22,
+ 0x20, 0x46, 0x9c, 0xff, 0x00, 0xdd, 0xe1, 0x17, 0x61, 0xf0, 0xfc, 0x11,
+ 0x10, 0xbb, 0x00, 0x02,
+ 0x1f, 0x0e, 0x35, 0x12, 0x8f, 0xfe, 0x14, 0x31, 0xef, 0xcb, 0xf0, 0x01,
+ 0x13, 0xd0, 0xed, 0xe0,
+ 0x90, 0xec, 0x01, 0xe0, 0xe1, 0x05, 0x10, 0xee, 0xfd, 0x00, 0x32, 0xe0,
+ 0x9a, 0xff, 0x00, 0xd0,
+ 0xdb, 0x01, 0x04, 0x32, 0x9e, 0xda, 0xf0, 0x13, 0x20, 0xd0, 0xbd, 0x01,
+ 0x01, 0x01, 0x02, 0x52,
+ 0x11, 0x00, 0xe9, 0x0e, 0x10, 0x44, 0x31, 0x0d, 0xde, 0x00, 0x65, 0x32,
+ 0xff, 0xdf, 0x44, 0x41,
+ 0xed, 0xbc, 0x00, 0x0f, 0x20, 0x43, 0x14, 0x10, 0x12, 0x55, 0x10, 0x0c,
+ 0x11, 0x32, 0x1d, 0x2f,
+ 0x42, 0x42, 0x0e, 0xf9, 0x00, 0x75, 0x10, 0x0d, 0xf0, 0x02, 0x33, 0x00,
+ 0xff, 0xe0, 0x20, 0x4f,
+ 0x0d, 0x22, 0x1d, 0x2b, 0x51, 0x04, 0x10, 0x10, 0x1c, 0xff, 0x40, 0x0e,
+ 0xea, 0x01, 0x77, 0x70,
+ 0xf0, 0xfe, 0x00, 0x10, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x66, 0xda, 0xbd,
+ 0x67, 0x00, 0xfe, 0x00,
+ 0x02, 0x0f, 0xfd, 0x03, 0x44, 0xed, 0xef, 0x00, 0x03, 0x20, 0xed, 0xff,
+ 0xf1, 0xf2, 0x00, 0xef,
+ 0xef, 0x00, 0x35, 0x31, 0x23, 0x8b, 0xef, 0x01, 0x01, 0x00, 0x0f, 0xdd,
+ 0x01, 0x34, 0xbd, 0xdc,
+ 0x03, 0x32, 0x20, 0x00, 0x12, 0xe0, 0xcf, 0xdf, 0x00, 0xcf, 0x34, 0x23,
+ 0xba, 0xde, 0xd3, 0xb4,
+ 0xf0, 0xf3, 0xd1, 0x88, 0xff, 0xff, 0xe0, 0x03, 0x33, 0x1e, 0xda, 0xc0,
+ 0x00, 0xff, 0xce, 0xd0,
+ 0xe1, 0xef, 0x13, 0x46, 0xde, 0xbd, 0x04, 0x02, 0xfd, 0x9c, 0x00, 0x02,
+ 0x00, 0xdf, 0x00, 0x02,
+ 0x00, 0xff, 0xfd, 0x36, 0x20, 0x30, 0x76, 0x41, 0xed, 0xef, 0x23, 0x55,
+ 0xfe, 0xff, 0x10, 0x0f,
+ 0xf0, 0x00, 0x43, 0x32, 0xcc, 0xcb, 0x01, 0x52, 0x12, 0x10, 0x00, 0x36,
+ 0x30, 0x0f, 0x0d, 0xfe,
+ 0x30, 0x20, 0xdb, 0xdf, 0xfd, 0x44, 0x74, 0x50, 0xef, 0x00, 0x13, 0x45,
+ 0xfe, 0xde, 0xf0, 0x02,
+ 0x32, 0x1f, 0x4f, 0x0c, 0xbc, 0xed, 0x02, 0x77, 0x45, 0xfd, 0xef, 0xfe,
+ 0x00, 0x13, 0x20, 0x0e,
+ 0x00, 0x03, 0x20, 0x0f, 0xff, 0x25, 0x31, 0xcd, 0xba, 0x00, 0x43, 0x41,
+ 0x0e, 0x0f, 0xf0, 0x1f,
+ 0x20, 0xfc, 0x00, 0x00, 0x32, 0x73, 0xf9, 0xbe, 0x00, 0x02, 0x12, 0x12,
+ 0xec, 0xce, 0x01, 0x02,
+ 0xf2, 0xf6, 0x63, 0x00, 0x0f, 0xdd, 0x00, 0x1d, 0xef, 0xff, 0xf0, 0x00,
+ 0x04, 0xee, 0x0f, 0x77,
+ 0x03, 0xcb, 0xde, 0x02, 0x64, 0x31, 0x12, 0xee, 0xcc, 0x0f, 0x00, 0x0d,
+ 0x0d, 0x04, 0xf2, 0xd0,
+ 0xb0, 0xe0, 0x05, 0x23, 0x02, 0x8c, 0xec, 0xf0, 0xe1, 0xdf, 0x02, 0x05,
+ 0x32, 0x1f, 0xea, 0x02,
+ 0xbe, 0x00, 0x22, 0x89, 0x11, 0x02, 0x0e, 0x01, 0xcd, 0xff, 0x14, 0x00,
+ 0xbb, 0xf0, 0x02, 0x00,
+ 0xee, 0xf0, 0x25, 0x42, 0x00, 0x0d, 0xe0, 0x10, 0x03, 0x10, 0xf0, 0x0f,
+ 0x40, 0x44, 0xee, 0xcc,
+ 0xd0, 0x31, 0x77, 0x0f, 0xdc, 0x00, 0x03, 0x03, 0x00, 0x21, 0x20, 0xd8,
+ 0x10, 0x72, 0x52, 0x00,
+ 0xfc, 0x10, 0x20, 0x00, 0xd0, 0x0f, 0x42, 0x33, 0xfa, 0xf0, 0x00, 0x00,
+ 0x14, 0x00, 0xf5, 0x00,
+ 0x85, 0x15, 0x97, 0x15, 0x4a, 0x14, 0x83, 0x12, 0x22, 0xc4, 0x55, 0x33,
+ 0x80, 0x81, 0xf2, 0x13,
+ 0x00, 0xd0, 0xf1, 0xf0, 0xf1, 0xde, 0x21, 0x76, 0x43, 0x23, 0x0f, 0xfd,
+ 0xfe, 0xee, 0xf0, 0x0f,
+ 0xb9, 0xe0, 0xf0, 0x01, 0x0f, 0x01, 0x65, 0x20, 0x1e, 0x1d, 0x1e, 0x2e,
+ 0x3d, 0x2a, 0x0c, 0x1e,
+ 0x1d, 0x0b, 0xed, 0x0c, 0x1d, 0x0e, 0x2d, 0x2d, 0x4e, 0x0f, 0x8e, 0xde,
+ 0xde, 0xdf, 0x8d, 0xdd,
+ 0xd0, 0xe1, 0x07, 0x03, 0xf1, 0xc0, 0x02, 0x14, 0xf2, 0xd1, 0xf7, 0xe2,
+ 0xc0, 0xe3, 0x04, 0x80,
+ 0xdc, 0xf0, 0x00, 0x10, 0x11, 0x22, 0x11, 0xc0, 0xbe, 0xf0, 0x05, 0x01,
+ 0xdd, 0xbd, 0xd0, 0xb3,
+ 0xe5, 0xd3, 0xd4, 0xc1, 0xbd, 0xd9, 0xde, 0xe0, 0xf1, 0xe1, 0xde, 0xee,
+ 0x00, 0x22, 0x00, 0x0f,
+ 0xda, 0xfe, 0xfd, 0xdd, 0xdb, 0x00, 0xb0, 0x8b, 0xcb, 0xde, 0x0f, 0x30,
+ 0x00, 0x0c, 0x1e, 0x4f,
+ 0x4f, 0x3e, 0x70, 0x22, 0x30, 0x41, 0x2f, 0x1c, 0x1c, 0x3e, 0x3f, 0x2c,
+ 0x2c, 0x2e, 0x2c, 0x1c,
+ 0x50, 0x41, 0x42, 0x12, 0x22, 0x24, 0x12, 0x10, 0x0e, 0x0c, 0x10, 0x54,
+ 0x32, 0x30, 0x65, 0x35,
+ 0x33, 0x22, 0x12, 0x12, 0x22, 0x25, 0x01, 0x01, 0xf1, 0x00, 0x02, 0xf5,
+ 0xe3, 0xc3, 0xd3, 0xe6,
+ 0xc2, 0xb2, 0xd2, 0xd3, 0xc3, 0xd2, 0xe2, 0x04, 0x32, 0x03, 0xf2, 0xd2,
+ 0xb0, 0xe0, 0xd3, 0xd5,
+ 0xb1, 0xc0, 0xd1, 0xd6, 0xd3, 0xd2, 0xa1, 0xd1, 0xf1, 0xf0, 0xf2, 0xc2,
+ 0xba, 0xdb, 0xff, 0x2f,
+ 0x0e, 0xbb, 0xee, 0x0e, 0xfe, 0xcb, 0xed, 0x0f, 0x0f, 0x0e, 0xed, 0xde,
+ 0xce, 0xae, 0xcc, 0xdd,
+ 0xcd, 0xef, 0x01, 0xe0, 0xda, 0xee, 0x00, 0x10, 0x0f, 0x0f, 0xfe, 0xeb,
+ 0xcc, 0xdd, 0x0f, 0x4f,
+ 0xea, 0x9c, 0xfe, 0xee, 0x0f, 0x2f, 0x3f, 0x60, 0x20, 0x30, 0x0f, 0x0f,
+ 0xe0, 0xf0, 0xdf, 0xdd,
+ 0xac, 0xce, 0xf4, 0x07, 0xf6, 0xe1, 0xe1, 0xe0, 0xb0, 0xc0, 0xd0, 0xf1,
+ 0x11, 0x21, 0x23, 0x20,
+ 0x1f, 0x2f, 0x0e, 0xe9, 0xcd, 0x0f, 0x0f, 0xcd, 0xbe, 0xe0, 0xff, 0xcc,
+ 0xdb, 0xfd, 0x1c, 0x0c,
+ 0xfe, 0x5f, 0x50, 0x1e, 0x0b, 0x1e, 0x5f, 0x3f, 0x5e, 0x2f, 0x1e, 0x2d,
+ 0x4f, 0x31, 0x43, 0x30,
+ 0x3f, 0x32, 0x45, 0x10, 0x00, 0x15, 0x57, 0x12, 0xf0, 0xe0, 0xf2, 0x12,
+ 0x43, 0x33, 0x65, 0x44,
+ 0x34, 0x22, 0x21, 0x21, 0x10, 0x00, 0x1f, 0x00, 0x0e, 0xfe, 0xed, 0x02,
+ 0x27, 0x67, 0x11, 0x12,
+ 0x12, 0x02, 0x02, 0x03, 0xd1, 0xb2, 0xe1, 0xe1, 0xc0, 0xf0, 0x43, 0x77,
+ 0x12, 0x01, 0x00, 0x02,
+ 0x23, 0x23, 0x02, 0xd1, 0xe2, 0xd2, 0xaf, 0xd0, 0x04, 0x16, 0x02, 0x00,
+ 0xe0, 0xdf, 0xd0, 0x13,
+ 0x67, 0x22, 0x31, 0x42, 0x0e, 0x30, 0x41, 0xfc, 0x3f, 0x5e, 0x2e, 0x1f,
+ 0xb8, 0xdc, 0xf0, 0xf0,
+ 0xbd, 0xcc, 0xef, 0xd0, 0xde, 0xf0, 0x02, 0xe0, 0xd0, 0x00, 0x67, 0x11,
+ 0x0f, 0xee, 0xdf, 0x00,
+ 0xdd, 0xdc, 0x00, 0x10, 0x20, 0xfe, 0xed, 0x71, 0x77, 0x22, 0x10, 0x0f,
+ 0x10, 0x0f, 0xfc, 0xfe,
+ 0xec, 0xcc, 0xef, 0xdf, 0xd0, 0xc0, 0xe2, 0xe3, 0xbe, 0xdf, 0xe1, 0xce,
+ 0xc8, 0xdd, 0xe0, 0x00,
+ 0xff, 0x0f, 0x13, 0x33, 0x0e, 0xda, 0x10, 0x30, 0x10, 0x00, 0x8c, 0xa9,
+ 0xee, 0xdd, 0xee, 0xcc,
+ 0xed, 0xed, 0x0d, 0x0f, 0x0d, 0x0f, 0x30, 0x71, 0x32, 0x20, 0x20, 0x2f,
+ 0x20, 0x42, 0x47, 0x42,
+ 0x21, 0x1f, 0x1e, 0x1f, 0x2f, 0x34, 0x33, 0x22, 0x15, 0x25, 0x13, 0x02,
+ 0xf0, 0x23, 0x65, 0x00,
+ 0x00, 0x31, 0x77, 0x53, 0x11, 0x10, 0x00, 0x10, 0x20, 0x10, 0x0e, 0xff,
+ 0xef, 0x03, 0x05, 0xf1,
+ 0xe4, 0x15, 0x33, 0xc1, 0x90, 0xf3, 0x07, 0xe1, 0xc1, 0x01, 0x02, 0x01,
+ 0x02, 0x01, 0x43, 0x53,
+ 0x24, 0x22, 0x31, 0x11, 0x00, 0xde, 0xcb, 0xde, 0xdf, 0xdf, 0xde, 0x23,
+ 0x55, 0x11, 0x22, 0x01,
+ 0x00, 0x40, 0x70, 0x52, 0x10, 0x0b, 0x0a, 0x0c, 0xfd, 0xea, 0xfe, 0x3f,
+ 0x40, 0x0d, 0x0e, 0x0e,
+ 0x0d, 0x0e, 0xee, 0xe0, 0xf0, 0x01, 0x90, 0xd0, 0xe5, 0xb1, 0xe2, 0x04,
+ 0x24, 0x02, 0x90, 0xe0,
+ 0xe0, 0x03, 0xf2, 0x16, 0x34, 0xef, 0xad, 0xee, 0xff, 0xed, 0xfc, 0x01,
+ 0x33, 0x0f, 0xcb, 0xfe,
+ 0x00, 0x20, 0xd0, 0x8d, 0xcf, 0xe2, 0xd7, 0xd4, 0xc1, 0xe2, 0xe1, 0xa0,
+ 0xdd, 0xed, 0xf0, 0xf1,
+ 0xe3, 0xe1, 0x03, 0x17, 0x45, 0x11, 0x10, 0x00, 0x01, 0xff, 0xdd, 0xbd,
+ 0xdd, 0xdc, 0xbb, 0xdc,
+ 0xbc, 0xed, 0x0f, 0xfe, 0x0e, 0x0e, 0x0e, 0x2e, 0x4d, 0x4e, 0x5f, 0x3d,
+ 0x38, 0x1c, 0x4e, 0x40,
+ 0x3e, 0x1b, 0x2e, 0x4f, 0x2e, 0x0c, 0x0c, 0x0e, 0x1e, 0x50, 0x30, 0x10,
+ 0x20, 0x11, 0x21, 0x41,
+ 0x20, 0x2f, 0x30, 0x64, 0x46, 0x23, 0x43, 0x34, 0x33, 0x32, 0x44, 0x33,
+ 0x22, 0x22, 0x14, 0x01,
+ 0x22, 0x34, 0x12, 0xf2, 0x04, 0xd2, 0x90, 0xf2, 0xf5, 0xf2, 0xe1, 0xc0,
+ 0xd2, 0xe4, 0xe2, 0xb0,
+ 0xcf, 0xf4, 0x17, 0x12, 0x01, 0xd2, 0xe2, 0xc2, 0xe2, 0xd1, 0xb1, 0xf3,
+ 0x05, 0x24, 0x12, 0xe0,
+ 0xa0, 0xe1, 0xe3, 0xd0, 0xcd, 0xed, 0x10, 0x0c, 0x98, 0xfc, 0x10, 0x00,
+ 0x0e, 0x0f, 0x20, 0x1e,
+ 0xfd, 0xed, 0x10, 0x2f, 0xcc, 0x8a, 0xed, 0xee, 0xfe, 0xdc, 0xde, 0xcf,
+ 0xdf, 0xf0, 0x02, 0x01,
+ 0xe3, 0xf2, 0xbf, 0xdc, 0xee, 0x00, 0x22, 0x00, 0xea, 0xbb, 0xee, 0x30,
+ 0x62, 0x21, 0x30, 0x43,
+ 0x33, 0x31, 0x13, 0x04, 0x01, 0xd0, 0xbc, 0xde, 0xce, 0xe1, 0xe4, 0xc4,
+ 0xe2, 0xe2, 0xf0, 0xf2,
+ 0xe6, 0xd1, 0xe1, 0x04, 0x56, 0x22, 0x02, 0x01, 0x00, 0xcf, 0xcf, 0xf0,
+ 0xff, 0xce, 0xaa, 0xef,
+ 0xdb, 0x00, 0x02, 0x9b, 0xee, 0x00, 0x00, 0x11, 0xfe, 0xec, 0x43, 0x31,
+ 0x0c, 0x09, 0x1f, 0x71,
+ 0x30, 0x0e, 0x3f, 0x50, 0x2f, 0x3e, 0x30, 0x40, 0x30, 0x1e, 0x2f, 0x34,
+ 0x45, 0x10, 0x12, 0x12,
+ 0x12, 0x0f, 0xec, 0x0f, 0x52, 0x34, 0x67, 0x33, 0x41, 0x21, 0x31, 0x43,
+ 0x20, 0x0d, 0x0c, 0xf0,
+ 0xff, 0xdc, 0xee, 0x02, 0x26, 0x01, 0xf0, 0xf3, 0x03, 0xf4, 0xf3, 0xe4,
+ 0xb2, 0xd2, 0x90, 0xed,
+ 0xef, 0xff, 0x23, 0x67, 0x11, 0x01, 0x12, 0x13, 0x13, 0x22, 0x14, 0x13,
+ 0xe2, 0x8f, 0xcd, 0xf2,
+ 0xf3, 0xf1, 0xe3, 0xe2, 0x05, 0x15, 0x22, 0x31, 0x40, 0x55, 0x22, 0x0f,
+ 0x0d, 0xff, 0x22, 0x41,
+ 0xfb, 0xdb, 0xee, 0x0e, 0xec, 0xac, 0xcd, 0xdc, 0xee, 0xcd, 0xbb, 0xde,
+ 0xf0, 0x00, 0xee, 0xff,
+ 0x12, 0x22, 0x00, 0xfc, 0xcf, 0xde, 0xfe, 0xfd, 0xeb, 0xed, 0xff, 0xfe,
+ 0xdc, 0x30, 0x74, 0x70,
+ 0x30, 0x30, 0x4f, 0x30, 0x10, 0x0b, 0x0b, 0xdd, 0xad, 0xec, 0xef, 0xc0,
+ 0xe0, 0xd0, 0xee, 0xef,
+ 0x03, 0x16, 0xe0, 0x9d, 0xee, 0xef, 0x01, 0x02, 0xf3, 0x04, 0xf2, 0x04,
+ 0x05, 0x21, 0x12, 0x43,
+ 0x34, 0x11, 0xe0, 0x9f, 0xdc, 0xab, 0xee, 0xef, 0xde, 0xdb, 0xed, 0xff,
+ 0x0f, 0x1e, 0x2d, 0x3d,
+ 0x40, 0x40, 0x3e, 0x3e, 0x40, 0x30, 0x57, 0x56, 0x10, 0x0f, 0x0e, 0x00,
+ 0x41, 0x22, 0x01, 0x00,
+ 0x04, 0x24, 0x02, 0xf1, 0x01, 0x13, 0x01, 0x02, 0x67, 0x64, 0x24, 0x10,
+ 0x11, 0x42, 0x22, 0x22,
+ 0x00, 0x00, 0x12, 0x14, 0x77, 0x23, 0x01, 0x00, 0xf1, 0x03, 0x23, 0x12,
+ 0x12, 0xf0, 0xbe, 0xe0,
+ 0xe1, 0xe0, 0xe0, 0xe0, 0xfe, 0x25, 0x77, 0x46, 0x10, 0x00, 0x12, 0x00,
+ 0x10, 0xff, 0xf0, 0xdf,
+ 0x9c, 0xdd, 0x00, 0x01, 0x21, 0x22, 0x22, 0x32, 0x2e, 0x3b, 0x71, 0x21,
+ 0x0d, 0x1e, 0x1c, 0x09,
+ 0xfd, 0xec, 0xfd, 0x30, 0x70, 0x1e, 0x0d, 0x0f, 0x0e, 0xec, 0x0f, 0x20,
+ 0x0e, 0xad, 0xcc, 0xf0,
+ 0xf2, 0xf0, 0xf3, 0x15, 0x01, 0xa0, 0xdf, 0xcd, 0xef, 0x02, 0x05, 0x02,
+ 0xcc, 0xdb, 0x00, 0x10,
+ 0xec, 0xfe, 0x2f, 0x40, 0x01, 0xde, 0xcf, 0xcf, 0xe3, 0xc3, 0xaf, 0xd0,
+ 0xd1, 0xac, 0xe0, 0xf7,
+ 0x06, 0xf2, 0xe0, 0xe0, 0xef, 0xdf, 0xe0, 0xcf, 0xdc, 0xe0, 0xe0, 0x02,
+ 0x46, 0x11, 0x13, 0x54,
+ 0x00, 0xed, 0xdc, 0xff, 0xdd, 0x89, 0xbd, 0xfe, 0xef, 0xed, 0xfd, 0xfe,
+ 0x0f, 0x00, 0x42, 0x20,
+ 0x2f, 0x30, 0x63, 0x13, 0x1c, 0x2a, 0x2d, 0x3d, 0x4d, 0x3e, 0x3d, 0x3b,
+ 0x1d, 0x2c, 0x3f, 0x4f,
+ 0x20, 0x3f, 0x2e, 0x54, 0x56, 0x10, 0x20, 0x21, 0x32, 0x30, 0x42, 0x32,
+ 0x54, 0x47, 0x43, 0x21,
+ 0x32, 0x23, 0x11, 0x23, 0x02, 0x12, 0x24, 0x23, 0x00, 0x00, 0xf3, 0xe1,
+ 0x07, 0x03, 0xf4, 0x05,
+ 0xb2, 0xe2, 0xd3, 0xb3, 0xd1, 0xf2, 0x02, 0xe3, 0xb0, 0xe1, 0xf4, 0x06,
+ 0x23, 0xc1, 0xa2, 0xf4,
+ 0xe2, 0xd1, 0xc1, 0xe3, 0xf2, 0x04, 0x26, 0x42, 0x01, 0xf0, 0xbe, 0xdd,
+ 0xef, 0x00, 0xab, 0xdd,
+ 0xfe, 0xed, 0xed, 0xcb, 0xfd, 0x0e, 0x1e, 0xfd, 0xfd, 0x0e, 0xff, 0xdd,
+ 0xa9, 0xdd, 0xdd, 0xed,
+ 0xed, 0xcd, 0xde, 0xdc, 0xce, 0x00, 0x13, 0x01, 0xbf, 0xcb, 0xcc, 0xee,
+ 0xed, 0xed, 0xfc, 0xdb,
+ 0xcc, 0x0d, 0x2f, 0x5e, 0x2e, 0x1e, 0x50, 0x20, 0x20, 0x12, 0x13, 0x00,
+ 0xed, 0xcd, 0xdc, 0xdc,
+ 0xab, 0xdd, 0xbd, 0xf1, 0x16, 0x02, 0xf0, 0xe0, 0xe0, 0xf5, 0x24, 0x32,
+ 0x01, 0xe0, 0xf0, 0x11,
+ 0x22, 0xd0, 0xbe, 0x12, 0x12, 0xad, 0xdc, 0xd0, 0xd1, 0xd0, 0xb0, 0xee,
+ 0x0e, 0xfb, 0xdd, 0x0d,
+ 0x1d, 0x18, 0x0c, 0x3c, 0x1d, 0x0c, 0x0d, 0x6e, 0x7f, 0x40, 0x2f, 0x3e,
+ 0x4f, 0x30, 0x52, 0x23,
+ 0x20, 0x11, 0x20, 0x10, 0x32, 0x77, 0x16, 0x10, 0x10, 0x00, 0x0f, 0x1e,
+ 0x45, 0x56, 0x21, 0x11,
+ 0x21, 0x52, 0x33, 0x22, 0x12, 0x10, 0x00, 0x00, 0x00, 0x10, 0x22, 0x03,
+ 0x03, 0x02, 0x27, 0x04,
+ 0x02, 0xd2, 0x14, 0x45, 0x02, 0x01, 0xb0, 0xbf, 0xe0, 0x12, 0x02, 0xd1,
+ 0xd2, 0xf6, 0x03, 0x14,
+ 0x63, 0x34, 0x12, 0x12, 0xb2, 0x9f, 0xfe, 0x07, 0x23, 0xe0, 0xce, 0x01,
+ 0x13, 0x22, 0x00, 0xff,
+ 0x23, 0x55, 0x00, 0x00, 0x12, 0x23, 0xf0, 0x0f, 0x33, 0x20, 0xe8, 0xef,
+ 0xad, 0xdd, 0xde, 0xdd,
+ 0xaa, 0xdd, 0xdd, 0xef, 0xdf, 0xce, 0xe0, 0x03, 0x04, 0xbf, 0xbd, 0xfe,
+ 0x00, 0xff, 0xd8, 0xed,
+ 0x1e, 0x0e, 0x2f, 0x30, 0x0d, 0x40, 0x40, 0x3f, 0x70, 0x25, 0x23, 0x21,
+ 0x0f, 0xf9, 0xce, 0xed,
+ 0xcc, 0xed, 0xde, 0xcf, 0xdf, 0xff, 0x00, 0x46, 0x10, 0xde, 0xbd, 0xee,
+ 0xef, 0xed, 0xdb, 0xf0,
+ 0x00, 0xc0, 0xdf, 0xd0, 0xbe, 0xee, 0x25, 0x33, 0xe0, 0xbf, 0xe0, 0xe2,
+ 0xbf, 0xc8, 0xdf, 0xdf,
+ 0xce, 0xed, 0xde, 0xee, 0x0e, 0x00, 0x2e, 0x3d, 0x2b, 0x3f, 0x4e, 0x2c,
+ 0x60, 0x41, 0x1e, 0x31,
+ 0x45, 0x0f, 0x0b, 0x20, 0x20, 0x0f, 0x0e, 0x63, 0x10, 0xfd, 0x0f, 0x12,
+ 0x47, 0x21, 0x02, 0x21,
+ 0x33, 0x57, 0x31, 0x31, 0x61, 0x21, 0x20, 0x10, 0x1f, 0x00, 0x20, 0x35,
+ 0x01, 0x01, 0x25, 0x34,
+ 0x13, 0x02, 0xf2, 0x02, 0x02, 0x02, 0x91, 0xe0, 0x01, 0x24, 0xef, 0xbc,
+ 0x01, 0x67, 0x35, 0x32,
+ 0x32, 0x32, 0x01, 0x00, 0xf0, 0xd0, 0x90, 0xcf, 0xd0, 0x02, 0x02, 0xf1,
+ 0x13, 0x35, 0x74, 0x23,
+ 0x32, 0x22, 0x33, 0x56, 0x10, 0x0f, 0x0d, 0x0c, 0xdb, 0xce, 0x0e, 0x10,
+ 0x0f, 0xed, 0xfe, 0x20,
+ 0x50, 0x3e, 0x4d, 0x2e, 0x0d, 0xbc, 0xed, 0xe0, 0x05, 0xf4, 0xe0, 0xc2,
+ 0xd2, 0xb0, 0xee, 0xff,
+ 0x03, 0x04, 0xe0, 0x00, 0x10, 0x23, 0x26, 0x12, 0x00, 0xde, 0xdd, 0xce,
+ 0x8a, 0x12, 0x04, 0xcf,
+ 0xef, 0xde, 0xcd, 0xe4, 0xa0, 0xb8, 0xdf, 0x04, 0x26, 0x00, 0xe0, 0xf0,
+ 0x00, 0x00, 0xd0, 0xcf,
+ 0xee, 0xe0, 0xf0, 0xe0, 0xf1, 0x04, 0xd1, 0xf1, 0x01, 0x00, 0xce, 0xce,
+ 0xb0, 0xbc, 0xb8, 0xef,
+ 0x00, 0xdd, 0xee, 0x0f, 0x0e, 0x0c, 0x0b, 0x20, 0x72, 0x20, 0x2f, 0x2f,
+ 0x3e, 0x4c, 0x2c, 0x1b,
+ 0x0e, 0x3e, 0x40, 0x0c, 0xfc, 0x0e, 0x10, 0x60, 0x2f, 0x1e, 0x2f, 0x41,
+ 0x21, 0x1e, 0x2f, 0x53,
+ 0x21, 0x1e, 0x20, 0x42, 0x55, 0x45, 0x45, 0x23, 0x21, 0x23, 0x33, 0x35,
+ 0x33, 0x34, 0x32, 0x23,
+ 0x01, 0xf0, 0xe0, 0xe0, 0xdf, 0xdf, 0x03, 0x57, 0x02, 0xe2, 0xe2, 0x24,
+ 0x00, 0xa0, 0xd0, 0xc0,
+ 0xf3, 0xd2, 0xd2, 0xe3, 0xe3, 0xf7, 0xe3, 0x80, 0xd0, 0xd2, 0xe4, 0x05,
+ 0xe1, 0xc2, 0x02, 0x02,
+ 0x01, 0x00, 0x01, 0x43, 0x1f, 0xcb, 0xbd, 0xed, 0xf0, 0xdd, 0xc9, 0xfe,
+ 0x0f, 0x0e, 0x0e, 0x0f,
+ 0xff, 0x0e, 0xfe, 0xfc, 0xda, 0xfe, 0xce, 0x8d, 0xed, 0xee, 0xdf, 0xbe,
+ 0xef, 0xcf, 0xdf, 0xef,
+ 0xdc, 0xc9, 0xff, 0xf0, 0xff, 0xfc, 0xcc, 0xdd, 0xed, 0x1e, 0x1d, 0x0c,
+ 0x2e, 0x71, 0x64, 0x00,
+ 0x00, 0x00, 0x02, 0x37, 0x01, 0xd0, 0xce, 0xce, 0xd0, 0xdf, 0xdf, 0xf0,
+ 0xf0, 0xdf, 0xdf, 0xf4,
+ 0x04, 0x04, 0x66, 0x44, 0x12, 0x00, 0xc0, 0xc0, 0xf0, 0xe0, 0xbd, 0xdd,
+ 0xee, 0xee, 0xcd, 0xdd,
+ 0xce, 0xde, 0xd0, 0xf7, 0xf3, 0xac, 0xee, 0x01, 0x36, 0x30, 0x1d, 0x0b,
+ 0x2e, 0x1d, 0x2d, 0x3d,
+ 0x5d, 0x1d, 0x0a, 0x30, 0x72, 0x51, 0x10, 0x10, 0x20, 0x1c, 0x0c, 0x30,
+ 0x51, 0x20, 0x1f, 0x11,
+ 0x30, 0x1d, 0x2c, 0x62, 0x36, 0x31, 0x30, 0x43, 0x65, 0x11, 0x20, 0x11,
+ 0x22, 0x10, 0x0c, 0xfb,
+ 0xfd, 0x00, 0x00, 0xd0, 0xde, 0xf0, 0x01, 0x05, 0x24, 0x13, 0x13, 0x66,
+ 0x22, 0x01, 0xd0, 0xe0,
+ 0x03, 0xf2, 0x04, 0xe2, 0x8d, 0xb1, 0x47, 0x26, 0x01, 0xf0, 0xf2, 0x01,
+ 0xf1, 0xc0, 0x00, 0x01,
+ 0xf0, 0xcf, 0x00, 0x22, 0x10, 0x00, 0x01, 0x66, 0x01, 0xe0, 0xef, 0xe0,
+ 0xe1, 0xae, 0xf0, 0x23,
+ 0x20, 0x1d, 0x0c, 0xe8, 0x0e, 0x50, 0x0f, 0xdc, 0xcc, 0xbd, 0xee, 0xef,
+ 0xdf, 0xde, 0x01, 0xf2,
+ 0xce, 0xde, 0xf0, 0xff, 0x0f, 0x0b, 0xcb, 0x0d, 0x50, 0x2f, 0x1d, 0x1e,
+ 0x3f, 0x3e, 0x5f, 0x50,
+ 0x22, 0x11, 0x1f, 0x1c, 0x1b, 0x0a, 0xcc, 0xbb, 0xde, 0xde, 0xe0, 0xde,
+ 0xef, 0x01, 0x43, 0x34,
+ 0x51, 0x11, 0xde, 0xcd, 0xf0, 0x02, 0xce, 0xbb, 0xe0, 0xf1, 0xe2, 0xe0,
+ 0x02, 0x16, 0x23, 0x04,
+ 0xf3, 0xf5, 0xc2, 0xb0, 0xe2, 0xd0, 0xcf, 0xbe, 0xed, 0xdd, 0xea, 0xfe,
+ 0x0f, 0xfe, 0x0e, 0x30,
+ 0x2f, 0x1d, 0x0c, 0x0f, 0x20, 0x52, 0x32, 0x44, 0x23, 0x33, 0x32, 0x11,
+ 0x20, 0x73, 0x67, 0x02,
+ 0x01, 0x00, 0x03, 0x07, 0x22, 0x10, 0x11, 0x43, 0x44, 0x75, 0x22, 0x11,
+ 0x21, 0x10, 0x21, 0x34,
+ 0x43, 0x11, 0x22, 0x11, 0x01, 0x00, 0x03, 0x77, 0x67, 0x03, 0xff, 0xff,
+ 0x00, 0xff, 0x00, 0x33,
+ 0x21, 0xeb, 0xde, 0xdf, 0xef, 0x77, 0x64, 0x00, 0x00, 0xf0, 0x00, 0x13,
+ 0xf0, 0xaa, 0xff, 0x00,
+ 0x02, 0x33, 0x10, 0x32, 0x22, 0xfe, 0x9a, 0xee, 0x11, 0x67, 0x22, 0x00,
+ 0x00, 0xcb, 0xac, 0xfe,
+ 0x34, 0x54, 0x00, 0x0f, 0xff, 0xed, 0x00, 0x00, 0x11, 0x22, 0x00, 0x0f,
+ 0xed, 0x00, 0x36, 0x21,
+ 0xce, 0x9a, 0xdd, 0x11, 0x77, 0x11, 0xee, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x44,
+ 0x00, 0xfe, 0xef, 0x00, 0xf0, 0x0f, 0x01, 0x00, 0xce, 0xfe, 0x04, 0x04,
+ 0x91, 0x02, 0xe9, 0x01,
+ 0x57, 0x01, 0x18, 0x09, 0xca, 0x02, 0x2c, 0x08, 0xcc, 0xba, 0xf0, 0x45,
+ 0x43, 0x01, 0xee, 0xde,
+ 0xee, 0x00, 0x23, 0xed, 0x99, 0x12, 0x55, 0x00, 0xff, 0xef, 0xff, 0x00,
+ 0x01, 0xf0, 0xff, 0x00,
+ 0xe0, 0xe0, 0x23, 0x23, 0xbc, 0xb9, 0x00, 0x34, 0x00, 0xce, 0xff, 0x00,
+ 0x00, 0x12, 0x21, 0xf0,
+ 0xed, 0xdd, 0xff, 0x64, 0x23, 0x00, 0xfd, 0xda, 0xef, 0x20, 0x0f, 0x0f,
+ 0x52, 0x00, 0xec, 0xdd,
+ 0xa9, 0x10, 0x75, 0x11, 0x00, 0x0f, 0xfd, 0x00, 0x22, 0x10, 0xfd, 0x22,
+ 0x32, 0x10, 0x54, 0x33,
+ 0x00, 0x0f, 0xda, 0xee, 0x76, 0x32, 0xff, 0x00, 0x32, 0x00, 0xef, 0xed,
+ 0x00, 0x22, 0x77, 0x10,
+ 0xf0, 0x00, 0x00, 0x55, 0x11, 0xde, 0xbc, 0x00, 0x35, 0x11, 0xef, 0x00,
+ 0x01, 0x11, 0x01, 0x22,
+ 0x01, 0x01, 0x01, 0x32, 0x34, 0x9e, 0x13, 0x57, 0xde, 0xef, 0x43, 0xf0,
+ 0xdd, 0x45, 0x33, 0xff,
+ 0xdd, 0xab, 0x00, 0x44, 0x00, 0x00, 0x33, 0xff, 0xcb, 0x00, 0x21, 0xde,
+ 0xf0, 0x22, 0x00, 0x00,
+ 0x11, 0xff, 0xbd, 0xca, 0xcd, 0x22, 0x56, 0x00, 0xdd, 0x00, 0x10, 0x00,
+ 0xfe, 0xfe, 0xee, 0x00,
+ 0x43, 0x10, 0xcc, 0xa8, 0x00, 0x75, 0x00, 0xee, 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0xff,
+ 0xcb, 0x00, 0x21, 0x00, 0xdd, 0x21, 0x44, 0xee, 0xcc, 0x00, 0x22, 0x00,
+ 0xef, 0x00, 0xef, 0x9b,
+ 0x00, 0x24, 0xdd, 0x99, 0x00, 0x34, 0x11, 0xde, 0xee, 0x00, 0x00, 0x11,
+ 0x11, 0xbc, 0xff, 0x44,
+ 0x00, 0xdd, 0x0f, 0xee, 0xed, 0x22, 0x21, 0xfe, 0xff, 0xdc, 0xfe, 0x42,
+ 0x55, 0xff, 0xed, 0x0f,
+ 0xed, 0x10, 0xfc, 0xde, 0x74, 0x10, 0xfc, 0xeb, 0x0f, 0x10, 0x32, 0x62,
+ 0x11, 0xdb, 0xfe, 0x10,
+ 0x00, 0x10, 0x30, 0x20, 0x63, 0xfd, 0xa8, 0x0f, 0x44, 0x0f, 0xdd, 0x00,
+ 0x12, 0x44, 0x00, 0xfe,
+ 0xfe, 0x11, 0x11, 0xee, 0x21, 0x55, 0x00, 0xfe, 0xee, 0xdd, 0x01, 0x77,
+ 0x23, 0xff, 0x00, 0x14,
+ 0x01, 0xff, 0xe0, 0x02, 0x23, 0x36, 0xe0, 0x8f, 0xee, 0x01, 0x77, 0x01,
+ 0xff, 0x00, 0x02, 0x00,
+ 0x02, 0x24, 0x11, 0x00, 0xf0, 0x00, 0x45, 0xff, 0xdf, 0x42, 0x54, 0x00,
+ 0x0f, 0x00, 0x00, 0xff,
+ 0xdd, 0x01, 0x67, 0x00, 0xde, 0x01, 0x01, 0xff, 0x44, 0x33, 0xee, 0xdc,
+ 0x00, 0x42, 0x11, 0xba,
+ 0x0f, 0x44, 0x10, 0xee, 0xff, 0x11, 0x64, 0xfe, 0xfd, 0x00, 0x0f, 0x00,
+ 0x0e, 0xdc, 0x00, 0x00,
+ 0xcc, 0x00, 0x46, 0xef, 0x9a, 0x21, 0x33, 0x0f, 0xff, 0x11, 0x22, 0xe0,
+ 0xbc, 0xf0, 0x0f, 0x01,
+ 0x01, 0xf0, 0xbb, 0x00, 0x66, 0x00, 0xee, 0xef, 0x00, 0x24, 0x10, 0xbc,
+ 0xee, 0x00, 0x23, 0x00,
+ 0x0f, 0x0e, 0xec, 0xcb, 0x00, 0x75, 0x21, 0xef, 0xee, 0x10, 0x11, 0x00,
+ 0xef, 0x02, 0x13, 0xdf,
+ 0x9b, 0x01, 0x35, 0xff, 0xcf, 0x11, 0x11, 0xf0, 0xed, 0x00, 0x53, 0x13,
+ 0x0e, 0x00, 0x12, 0x0f,
+ 0x1f, 0x1f, 0x0e, 0x0b, 0x10, 0x77, 0x53, 0x0e, 0xdb, 0x11, 0x43, 0x00,
+ 0x0f, 0x01, 0x0e, 0x00,
+ 0x54, 0x0f, 0x0d, 0x01, 0x00, 0xfc, 0x34, 0x21, 0xdd, 0xfe, 0xff, 0xdd,
+ 0x00, 0x67, 0x21, 0x0f,
+ 0xfe, 0xaa, 0xef, 0x54, 0x34, 0xf0, 0xcc, 0xef, 0x11, 0x22, 0xff, 0xf0,
+ 0x01, 0x12, 0x22, 0xef,
+ 0xcd, 0x00, 0x22, 0x12, 0x47, 0x01, 0xaf, 0xf0, 0x12, 0x35, 0x00, 0xce,
+ 0x01, 0x35, 0xf0, 0xbe,
+ 0x00, 0xef, 0x00, 0x77, 0x00, 0xbd, 0x02, 0x47, 0x00, 0xdd, 0x10, 0x22,
+ 0xff, 0xee, 0x20, 0x00,
+ 0x10, 0x75, 0x00, 0x0e, 0xf0, 0x00, 0x00, 0x33, 0x12, 0xed, 0xf0, 0x03,
+ 0xdd, 0xcd, 0x14, 0xe0,
+ 0xde, 0x77, 0x13, 0xec, 0xcc, 0x00, 0x55, 0x00, 0xff, 0xfe, 0x11, 0x11,
+ 0x0f, 0xf0, 0x0f, 0xfe,
+ 0xee, 0x0f, 0xaa, 0x00, 0x23, 0xee, 0xcc, 0x31, 0x43, 0xed, 0xb9, 0x00,
+ 0xff, 0x00, 0x54, 0x00,
+ 0xff, 0xff, 0x0f, 0x0f, 0xdd, 0x10, 0x55, 0x00, 0xdb, 0xf0, 0x10, 0x00,
+ 0xee, 0xcd, 0xee, 0x22,
+ 0x22, 0x99, 0xde, 0x0f, 0x33, 0x02, 0xde, 0xee, 0x21, 0xee, 0xcb, 0x52,
+ 0x23, 0xff, 0xee, 0x12,
+ 0x44, 0x11, 0xdc, 0xce, 0x36, 0x42, 0xe0, 0xee, 0x00, 0xff, 0x22, 0x65,
+ 0x01, 0x00, 0xf0, 0x11,
+ 0x33, 0xef, 0xac, 0x00, 0x23, 0x0f, 0xf0, 0x36, 0x31, 0x00, 0xee, 0xdd,
+ 0x42, 0x77, 0x21, 0x00,
+ 0x20, 0xff, 0x11, 0x77, 0x00, 0xdf, 0x01, 0x22, 0xe0, 0xef, 0x12, 0x34,
+ 0xe0, 0xef, 0x32, 0x75,
+ 0x0f, 0xbb, 0x00, 0x34, 0x42, 0x0f, 0xee, 0x0f, 0x00, 0x21, 0x33, 0xfe,
+ 0xfe, 0x42, 0x0f, 0xb8,
+ 0x10, 0x31, 0xf0, 0xee, 0x0f, 0x51, 0x00, 0xfc, 0xee, 0x42, 0x44, 0xec,
+ 0xde, 0x00, 0x21, 0x20,
+ 0x21, 0x0f, 0xfc, 0x00, 0xff, 0xee, 0x9b, 0x10, 0x21, 0xba, 0xff, 0x22,
+ 0x12, 0x00, 0xac, 0xcc,
+ 0x00, 0x22, 0xff, 0xff, 0x35, 0x00, 0xbc, 0x0f, 0x00, 0x02, 0x00, 0xe0,
+ 0xdf, 0x00, 0x34, 0x01,
+ 0xae, 0xf0, 0x14, 0x14, 0xcd, 0xcc, 0x03, 0x45, 0xef, 0xee, 0x14, 0x00,
+ 0x8d, 0x02, 0x15, 0xff,
+ 0x00, 0x13, 0xff, 0xdd, 0x01, 0x22, 0x00, 0x0f, 0x31, 0x21, 0xfe, 0xec,
+ 0x42, 0x66, 0x00, 0xf0,
+ 0xee, 0x00, 0x35, 0xef, 0xe0, 0x54, 0x01, 0xed, 0xdd, 0x32, 0x44, 0xdc,
+ 0x00, 0x74, 0x10, 0xfd,
+ 0x11, 0x55, 0x00, 0xfc, 0x0f, 0x11, 0x21, 0xfe, 0x0d, 0x10, 0x20, 0x0e,
+ 0x1e, 0x20, 0xf9, 0xfe,
+ 0x73, 0x60, 0xe8, 0xee, 0x21, 0x32, 0x00, 0x20, 0x1f, 0xdd, 0x10, 0x52,
+ 0x00, 0xfe, 0x0f, 0xfd,
+ 0x10, 0x10, 0xca, 0x10, 0x76, 0x00, 0xfe, 0xf0, 0xef, 0xce, 0x12, 0x57,
+ 0x00, 0xbd, 0xed, 0x12,
+ 0x01, 0x00, 0x00, 0x02, 0x12, 0xf0, 0xee, 0xf0, 0x04, 0x01, 0xf1, 0xe0,
+ 0xae, 0xf1, 0x37, 0x25,
+ 0xd0, 0xbe, 0xe0, 0x00, 0x24, 0x23, 0xdf, 0x8c, 0xee, 0x37, 0x32, 0xcf,
+ 0xf0, 0x00, 0xf0, 0xe0,
+ 0x00, 0x01, 0xef, 0xfe, 0x10, 0x77, 0x32, 0x0f, 0xdd, 0xf0, 0x32, 0x10,
+ 0x10, 0x33, 0xbd, 0xfe,
+ 0x47, 0x00, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x10, 0x00, 0xec, 0x75, 0x43,
+ 0xee, 0xfd, 0xdc, 0x21,
+ 0x76, 0x10, 0xff, 0xed, 0xdd, 0xff, 0x54, 0x0f, 0xda, 0x11, 0x32, 0xcd,
+ 0xcc, 0x32, 0x21, 0xed,
+ 0x11, 0x32, 0xee, 0xee, 0x21, 0xfe, 0x0f, 0x74, 0x00, 0xfb, 0xdd, 0x0f,
+ 0x20, 0x63, 0x11, 0xea,
+ 0xff, 0x0f, 0xef, 0x00, 0x00, 0xef, 0xff, 0xcd, 0xfe, 0x67, 0x12, 0xed,
+ 0xdc, 0x00, 0x74, 0x00,
+ 0xec, 0x11, 0x12, 0x00, 0x11, 0x12, 0xed, 0xde, 0x02, 0xde, 0xf0, 0x57,
+ 0x11, 0x01, 0x00, 0x03,
+ 0x65, 0xf0, 0x9a, 0xf0, 0x33, 0x23, 0x00, 0x02, 0xef, 0xcc, 0xf0, 0x00,
+ 0x11, 0x24, 0x33, 0xff,
+ 0xaa, 0x00, 0x10, 0x11, 0x21, 0x12, 0xff, 0xff, 0x01, 0xff, 0x01, 0x77,
+ 0xf0, 0xcf, 0x00, 0x01,
+ 0x00, 0xf0, 0x24, 0x34, 0xef, 0xcd, 0x11, 0x76, 0x12, 0x0f, 0x00, 0x00,
+ 0x22, 0xff, 0x0f, 0x33,
+ 0x00, 0x99, 0x00, 0x32, 0x21, 0xed, 0x0f, 0x21, 0xfd, 0xca, 0x10, 0x51,
+ 0x21, 0x21, 0x22, 0xdb,
+ 0xcd, 0x21, 0x0f, 0x10, 0x75, 0x21, 0xfd, 0xfe, 0x00, 0x1f, 0x30, 0x43,
+ 0x22, 0xfd, 0xb8, 0xf0,
+ 0x10, 0x00, 0xef, 0x11, 0x21, 0x0f, 0xaa, 0xde, 0x00, 0x44, 0x32, 0x20,
+ 0xff, 0xbd, 0xfe, 0x01,
+ 0x25, 0x11, 0xff, 0x00, 0xf0, 0x01, 0xd0, 0xae, 0xed, 0x00, 0x27, 0xf0,
+ 0xbe, 0x00, 0x36, 0x54,
+ 0xf0, 0xce, 0xee, 0xf1, 0x01, 0xe0, 0xf0, 0xe0, 0xf0, 0xf1, 0xdf, 0xef,
+ 0x33, 0x00, 0xed, 0x12,
+ 0xed, 0x9a, 0x12, 0x25, 0x00, 0xbd, 0xee, 0xdd, 0x03, 0x67, 0xe0, 0xbc,
+ 0x0f, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x10, 0x00, 0xfb, 0x20, 0x32, 0xdd, 0x21, 0x76, 0x10, 0x0f,
+ 0xee, 0x0e, 0x53, 0x35,
+ 0xfe, 0xdc, 0xff, 0x20, 0x61, 0x10, 0x10, 0x0d, 0xea, 0x21, 0x54, 0x0e,
+ 0x0f, 0x00, 0xed, 0x21,
+ 0x54, 0x10, 0x10, 0x32, 0x0f, 0x0f, 0x20, 0x00, 0xfd, 0x35, 0x64, 0x00,
+ 0xff, 0xde, 0x01, 0x37,
+ 0x21, 0xe0, 0xef, 0xef, 0x21, 0x75, 0x20, 0xde, 0xef, 0x64, 0x11, 0xdd,
+ 0x00, 0x25, 0x32, 0x10,
+ 0x9c, 0xdc, 0xf0, 0x47, 0x31, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x22, 0x01,
+ 0xbf, 0x22, 0x23, 0xcf,
+ 0xe0, 0xe0, 0xab, 0xf0, 0x23, 0x23, 0xff, 0xf0, 0x23, 0x0e, 0xec, 0x44,
+ 0x21, 0xfe, 0xdd, 0xff,
+ 0x34, 0xf0, 0x9b, 0x00, 0x01, 0x00, 0xdf, 0xe0, 0xab, 0x0f, 0x33, 0x13,
+ 0xdc, 0xab, 0x00, 0x00,
+ 0xfe, 0x00, 0x12, 0x0e, 0xef, 0xfe, 0xef, 0x57, 0x00, 0xdc, 0xce, 0xee,
+ 0x00, 0xee, 0xfe, 0x00,
+ 0x0d, 0x20, 0x10, 0x88, 0xdd, 0x12, 0x43, 0xde, 0xdc, 0x21, 0x21, 0x0f,
+ 0xfe, 0x1f, 0x20, 0x0f,
+ 0xfa, 0x0e, 0x50, 0x0e, 0xff, 0x12, 0xcd, 0x99, 0x0f, 0xf0, 0x10, 0x44,
+ 0xff, 0xa9, 0xff, 0x21,
+ 0x42, 0x00, 0x00, 0x0f, 0x10, 0x30, 0x10, 0x00, 0x1f, 0x0f, 0xef, 0x23,
+ 0x00, 0x63, 0x37, 0xdd,
+ 0xbd, 0x11, 0x57, 0x11, 0x12, 0x21, 0x00, 0x11, 0x00, 0xdf, 0x34, 0x43,
+ 0xe0, 0x34, 0x34, 0xbe,
+ 0xcc, 0x00, 0x33, 0x32, 0x00, 0x22, 0x01, 0xee, 0x00, 0x21, 0x55, 0x33,
+ 0xf0, 0xe0, 0xcf, 0x37,
+ 0x65, 0xdf, 0xce, 0x12, 0x33, 0x01, 0xe0, 0xdf, 0x01, 0x77, 0x01, 0xef,
+ 0xde, 0x23, 0x77, 0x21,
+ 0xf0, 0xef, 0x10, 0xf0, 0xde, 0x34, 0x22, 0x0f, 0x22, 0x00, 0xbc, 0x10,
+ 0x43, 0x00, 0xef, 0xfe,
+ 0x00, 0x21, 0x46, 0x00, 0xef, 0x00, 0x0f, 0x1f, 0x41, 0x0e, 0x0d, 0x51,
+ 0x22, 0x0d, 0x1d, 0x0e,
+ 0xd8, 0xdf, 0x72, 0x33, 0xdc, 0xaa, 0xfe, 0x00, 0x00, 0x10, 0x32, 0xfe,
+ 0xed, 0x0f, 0x0d, 0x0d,
+ 0x10, 0x53, 0x11, 0xfb, 0xdc, 0x11, 0x30, 0x8a, 0xee, 0x12, 0x22, 0x00,
+ 0xee, 0xdd, 0xdc, 0x32,
+ 0x55, 0xef, 0x01, 0x35, 0x00, 0xe1, 0xf0, 0xa0, 0xcd, 0x00, 0x04, 0xff,
+ 0xef, 0xe0, 0xcc, 0x11,
+ 0x43, 0xdb, 0xcd, 0x33, 0x00, 0xcb, 0xf0, 0xde, 0x00, 0x01, 0xe0, 0xcf,
+ 0xcf, 0xcc, 0xcc, 0xff,
+ 0x12, 0x01, 0x00, 0xdf, 0xcd, 0x00, 0x11, 0x46, 0x44, 0xee, 0xaa, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0xfe, 0x00, 0x12, 0xcb, 0xee, 0x1f, 0x40, 0x10, 0x0c, 0xed, 0xcc, 0xff,
+ 0x41, 0x32, 0x0f, 0xda,
+ 0xbe, 0xfe, 0x10, 0x40, 0x20, 0xfb, 0xdc, 0x0f, 0x40, 0x73, 0x11, 0xfa,
+ 0xdd, 0xef, 0xff, 0x00,
+ 0x63, 0x02, 0xea, 0xef, 0x00, 0x21, 0xde, 0xbc, 0x21, 0x44, 0x00, 0xfe,
+ 0xff, 0xff, 0x00, 0x35,
+ 0x21, 0xef, 0xde, 0xf0, 0xf0, 0x00, 0x11, 0x22, 0x00, 0x01, 0xdf, 0x88,
+ 0x22, 0x65, 0xf0, 0x00,
+ 0x12, 0xe0, 0xbd, 0x02, 0x25, 0xe0, 0xf0, 0x02, 0x00, 0xf0, 0xdf, 0xcd,
+ 0x22, 0x77, 0x12, 0x0f,
+ 0x00, 0xfe, 0x01, 0x33, 0x02, 0x12, 0x00, 0x9b, 0xfe, 0x12, 0x26, 0x00,
+ 0xcf, 0xf0, 0x10, 0x01,
+ 0xe0, 0xe0, 0x45, 0x10, 0xde, 0x43, 0x56, 0xff, 0xde, 0x12, 0x44, 0x11,
+ 0xf0, 0xee, 0xee, 0x32,
+ 0x75, 0x0e, 0xcc, 0x00, 0x43, 0x00, 0xec, 0xe0, 0xff, 0x10, 0x32, 0x00,
+ 0xd0, 0x00, 0x31, 0xc9,
+ 0xac, 0x20, 0x54, 0x10, 0x00, 0x00, 0x0f, 0xfd, 0x00, 0x00, 0x0e, 0x12,
+ 0x12, 0xdd, 0xca, 0xef,
+ 0xbc, 0xfe, 0x44, 0x22, 0xfd, 0x00, 0x20, 0x0e, 0x21, 0x10, 0xdb, 0x62,
+ 0x56, 0x00, 0xfe, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0x45, 0x21, 0x21, 0x10, 0x21, 0x77, 0x12, 0x11,
+ 0x00, 0xff, 0x33, 0x11,
+ 0xd0, 0x01, 0xe1, 0xf2, 0x77, 0x31, 0x00, 0x00, 0x10, 0x21, 0x33, 0x43,
+ 0x31, 0x20, 0x11, 0x00,
+ 0x13, 0x77, 0x14, 0x10, 0x00, 0xe0, 0xe0, 0x01, 0x77, 0x23, 0x00, 0xef,
+ 0x32, 0x11, 0x22, 0x75,
+ 0x01, 0xff, 0x23, 0x46, 0xf0, 0xff, 0x43, 0x22, 0x11, 0x12, 0x10, 0x00,
+ 0xed, 0xfe, 0x76, 0x32,
+ 0xdc, 0xff, 0x32, 0x22, 0xce, 0xee, 0x23, 0x00, 0x0f, 0x20, 0xfd, 0x20,
+ 0x77, 0x00, 0xdb, 0x30,
+ 0x51, 0x00, 0xfe, 0x0f, 0x10, 0x0f, 0xfc, 0x0f, 0x10, 0x00, 0xcd, 0xdc,
+ 0x65, 0x11, 0xcc, 0xed,
+ 0x10, 0x10, 0x11, 0x12, 0x00, 0xff, 0xff, 0x00, 0x10, 0xcd, 0x88, 0xfe,
+ 0x11, 0x34, 0x00, 0x00,
+ 0xf0, 0xcd, 0xee, 0x35, 0x32, 0xe0, 0xe0, 0xcf, 0xe2, 0x17, 0x90, 0xcd,
+ 0x01, 0x16, 0x01, 0xf0,
+ 0xd0, 0xcf, 0xff, 0x22, 0x32, 0xcd, 0xee, 0x12, 0x00, 0xbd, 0x11, 0x13,
+ 0x00, 0xff, 0xdc, 0xe0,
+ 0x04, 0xef, 0x89, 0x00, 0x01, 0xf0, 0xde, 0x12, 0x22, 0x0d, 0x1e, 0x66,
+ 0x11, 0xed, 0x00, 0x22,
+ 0xfe, 0xed, 0x44, 0x11, 0xea, 0x0f, 0x51, 0xec, 0xdb, 0x51, 0x10, 0x00,
+ 0x20, 0x20, 0x20, 0xef,
+ 0xb9, 0xff, 0x21, 0x41, 0xff, 0xbc, 0xed, 0xfd, 0x10, 0x42, 0x42, 0x22,
+ 0xeb, 0xdc, 0xfe, 0x0f,
+ 0xfe, 0x20, 0x33, 0x00, 0xdd, 0x8a, 0xdd, 0x00, 0x12, 0x0f, 0xff, 0x0f,
+ 0xfe, 0xfd, 0x01, 0x36,
+ 0x9e, 0xdd, 0x00, 0x00, 0x00, 0xf0, 0xbc, 0xed, 0x15, 0x12, 0xdc, 0xff,
+ 0x0f, 0xce, 0x00, 0x57,
+ 0x22, 0xf0, 0x9c, 0xff, 0x01, 0x01, 0x03, 0xe1, 0xcf, 0xf0, 0xf0, 0x01,
+ 0xdd, 0xba, 0x12, 0x01,
+ 0x00, 0x00, 0x0e, 0xfc, 0x00, 0x00, 0x20, 0x20, 0x1f, 0x1e, 0xfa, 0xae,
+ 0xbc, 0xf0, 0x00, 0x0d,
+ 0x21, 0x36, 0xe0, 0xab, 0xee, 0xed, 0x21, 0x77, 0x00, 0xfe, 0x00, 0xf0,
+ 0x00, 0x11, 0x0f, 0xfe,
+ 0x32, 0x53, 0xfd, 0xb9, 0xfe, 0x00, 0x10, 0x0f, 0x0e, 0x00, 0xde, 0xcd,
+ 0xf0, 0x00, 0xfe, 0xdd,
+ 0x00, 0x0f, 0xeb, 0xbb, 0xfe, 0x31, 0x20, 0x89, 0xff, 0x21, 0x20, 0xee,
+ 0xff, 0x00, 0xbc, 0x00,
+ 0x12, 0xff, 0xcb, 0xcc, 0x00, 0x22, 0x00, 0x8a, 0xfe, 0x11, 0x23, 0x00,
+ 0x00, 0xee, 0xff, 0x23,
+ 0x00, 0xcc, 0x00, 0xed, 0xdf, 0x36, 0xde, 0xbd, 0x31, 0x21, 0xfd, 0x00,
+ 0x36, 0x00, 0x01, 0x00,
+ 0x12, 0x75, 0x00, 0xcf, 0xe0, 0x01, 0x34, 0x11, 0xe0, 0x9c, 0x00, 0x34,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x30, 0x31, 0x01, 0x34, 0x10, 0xef, 0xcc, 0x43, 0x67, 0x00, 0xf0, 0x02,
+ 0x0f, 0xde, 0x00, 0x77,
+ 0x22, 0xff, 0xe0, 0x22, 0x35, 0x00, 0x11, 0x32, 0x12, 0x63, 0x44, 0x00,
+ 0x00, 0x11, 0x32, 0x00,
+ 0x00, 0x00, 0x63, 0x47, 0x11, 0xee, 0xdd, 0x23, 0x24, 0xee, 0x21, 0x33,
+ 0x00, 0x00, 0xfe, 0xca,
+ 0x40, 0x75, 0x20, 0x0e, 0x0f, 0x11, 0x00, 0xed, 0x20, 0x53, 0x0e, 0x0e,
+ 0x23, 0xc9, 0xaa, 0x00,
+ 0x21, 0x11, 0x00, 0x0e, 0xf0, 0x00, 0x10, 0x21, 0x00, 0xee, 0x00, 0x01,
+ 0xef, 0xce, 0xcd, 0x0f,
+ 0x56, 0x0f, 0xba, 0x00, 0x00, 0x0f, 0x21, 0x34, 0x00, 0xe0, 0xcf, 0xef,
+ 0xe0, 0xe0, 0x05, 0x24,
+ 0xf0, 0x80, 0xf0, 0xf0, 0xe0, 0x03, 0xf2, 0xcd, 0x04, 0x57, 0xf0, 0xef,
+ 0x33, 0x45, 0xff, 0xef,
+ 0xe0, 0x01, 0x22, 0xf0, 0xbd, 0xef, 0x01, 0x04, 0xee, 0xde, 0x01, 0xee,
+ 0xaa, 0x22, 0x44, 0x00,
+ 0xf0, 0x01, 0xf0, 0xf0, 0x23, 0x44, 0x24, 0xfe, 0xee, 0x40, 0x10, 0x1e,
+ 0x76, 0x21, 0x22, 0x33,
+ 0x20, 0x31, 0x54, 0xfd, 0xb8, 0x22, 0x54, 0x00, 0xfd, 0x10, 0x00, 0x00,
+ 0x03, 0x03, 0x5c, 0x02,
+ 0x30, 0x34, 0x30, 0x0f, 0x3b, 0x3e, 0x81, 0x19, 0xed, 0x55, 0x32, 0x0f,
+ 0x0e, 0x10, 0x0f, 0xda,
+ 0x00, 0x13, 0xce, 0xbc, 0x00, 0x33, 0xf0, 0xae, 0xfe, 0xfd, 0x12, 0x12,
+ 0x26, 0x12, 0xef, 0xdd,
+ 0x35, 0x23, 0x8d, 0xda, 0xe0, 0x00, 0x23, 0x33, 0xe0, 0xed, 0x10, 0x20,
+ 0xcc, 0xcd, 0x24, 0x33,
+ 0x22, 0x53, 0xff, 0xcc, 0xf0, 0xf0, 0xe0, 0x26, 0x00, 0xb0, 0xef, 0xcf,
+ 0xde, 0x03, 0x02, 0x0f,
+ 0x77, 0x25, 0xdd, 0xcb, 0x00, 0x62, 0x01, 0x0f, 0xff, 0xfe, 0x0f, 0x12,
+ 0x00, 0xda, 0x00, 0x10,
+ 0xef, 0xde, 0x52, 0x55, 0xff, 0xec, 0x01, 0x23, 0xcd, 0xdc, 0x44, 0x32,
+ 0xff, 0xff, 0xff, 0xef,
+ 0x21, 0x11, 0x0f, 0x30, 0x30, 0x00, 0x0d, 0xdd, 0xab, 0xfe, 0x44, 0x33,
+ 0xf0, 0xd0, 0xdd, 0xdb,
+ 0x9a, 0x00, 0x74, 0x01, 0x0e, 0x0f, 0x24, 0x10, 0xed, 0x0f, 0x43, 0x00,
+ 0xfc, 0x00, 0x12, 0xed,
+ 0xdd, 0x46, 0x21, 0xce, 0x00, 0x31, 0x1f, 0xfe, 0x0f, 0x00, 0x64, 0x11,
+ 0x12, 0x46, 0x00, 0xbc,
+ 0xee, 0x56, 0x22, 0xef, 0xfe, 0x00, 0x33, 0x10, 0x00, 0x10, 0x01, 0x22,
+ 0x45, 0x01, 0xbd, 0x00,
+ 0x56, 0x23, 0x01, 0xcf, 0xde, 0x01, 0x46, 0x11, 0xcf, 0xcd, 0x00, 0x35,
+ 0x11, 0x00, 0x00, 0xed,
+ 0x00, 0x01, 0xf0, 0x11, 0x21, 0x11, 0x12, 0xd0, 0x9d, 0x01, 0x00, 0x37,
+ 0x66, 0xee, 0xbc, 0x00,
+ 0x12, 0x11, 0x02, 0x00, 0xf0, 0xde, 0x01, 0x25, 0xf0, 0x00, 0x32, 0xd0,
+ 0x20, 0x31, 0xdf, 0x00,
+ 0x61, 0x31, 0x0f, 0xc8, 0xad, 0xff, 0x00, 0x00, 0x22, 0x01, 0xba, 0xee,
+ 0x0f, 0x0e, 0xd9, 0x00,
+ 0x40, 0x21, 0xdd, 0xde, 0x60, 0x21, 0x0f, 0xfd, 0xfd, 0xff, 0xff, 0xa8,
+ 0xff, 0x21, 0x00, 0x0e,
+ 0x10, 0x0f, 0xbb, 0xfe, 0x32, 0x31, 0xef, 0xbc, 0xf0, 0x22, 0x11, 0xfe,
+ 0xf0, 0xef, 0xcd, 0xff,
+ 0xff, 0x0d, 0x41, 0x23, 0xca, 0xde, 0x34, 0x33, 0xcf, 0x10, 0x21, 0xef,
+ 0x47, 0xf1, 0x8b, 0xb0,
+ 0x27, 0x22, 0xf0, 0xef, 0xce, 0xf0, 0x22, 0x00, 0xee, 0xe0, 0xff, 0x32,
+ 0x76, 0x00, 0xf0, 0xde,
+ 0xff, 0x00, 0x11, 0x01, 0xff, 0xcc, 0xde, 0x00, 0x22, 0x41, 0xfe, 0xc9,
+ 0xf0, 0x00, 0x02, 0x22,
+ 0x22, 0x00, 0x11, 0x77, 0x31, 0xdf, 0x00, 0x21, 0xcc, 0xdc, 0x73, 0x33,
+ 0xfd, 0xfd, 0x12, 0x22,
+ 0x0e, 0x10, 0x00, 0xfd, 0x00, 0x41, 0x00, 0x0c, 0x0f, 0x0f, 0xe9, 0x0e,
+ 0x75, 0x73, 0x0e, 0xfb,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x0e, 0xfd, 0x12, 0xf0, 0x9a, 0x0f, 0x23,
+ 0x44, 0xed, 0xdb, 0x21,
+ 0x44, 0x00, 0x00, 0x22, 0xf0, 0xce, 0xf0, 0xf0, 0x02, 0x24, 0x22, 0xf0,
+ 0xff, 0x12, 0x00, 0xbc,
+ 0x23, 0x77, 0x00, 0x10, 0x11, 0xf0, 0xf0, 0x04, 0x23, 0x00, 0xd0, 0xc0,
+ 0x07, 0x53, 0xe0, 0xcf,
+ 0x01, 0x14, 0x00, 0xad, 0x00, 0x57, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11,
+ 0x02, 0x10, 0x10, 0xfd,
+ 0xdd, 0xf0, 0x34, 0x00, 0xbc, 0xed, 0x10, 0x44, 0x01, 0xdd, 0xdb, 0x01,
+ 0x55, 0x00, 0x00, 0xdf,
+ 0xde, 0x75, 0x32, 0xde, 0x0f, 0x11, 0x0f, 0xec, 0x20, 0x51, 0x00, 0x11,
+ 0x00, 0xda, 0x00, 0x11,
+ 0x10, 0x11, 0xad, 0x98, 0xff, 0x21, 0x31, 0x00, 0xfd, 0x00, 0x43, 0x10,
+ 0x0d, 0x0d, 0x0f, 0x36,
+ 0x42, 0xef, 0xde, 0x10, 0x0f, 0xaa, 0x00, 0x01, 0x31, 0x10, 0x0f, 0x0e,
+ 0x0f, 0x10, 0xf0, 0x43,
+ 0x77, 0x01, 0x00, 0x00, 0xfe, 0xaa, 0x00, 0x11, 0x11, 0x00, 0x20, 0x0f,
+ 0x00, 0x02, 0x55, 0x21,
+ 0x0f, 0x0e, 0x76, 0x23, 0x00, 0x13, 0x14, 0x00, 0x02, 0x02, 0xf1, 0xae,
+ 0xfd, 0x14, 0x13, 0x01,
+ 0x23, 0x22, 0x01, 0xe0, 0x00, 0x43, 0x0b, 0xce, 0x37, 0x21, 0x00, 0x22,
+ 0x00, 0x8d, 0xfe, 0x01,
+ 0x36, 0x20, 0xee, 0xe0, 0xbc, 0x01, 0x57, 0x01, 0xdf, 0x00, 0x22, 0xff,
+ 0xf0, 0x12, 0x00, 0x00,
+ 0x10, 0x73, 0x23, 0x10, 0x0e, 0x10, 0x01, 0xfe, 0xfd, 0xfb, 0xcc, 0xf0,
+ 0x12, 0x00, 0xaa, 0xfd,
+ 0xfe, 0x0e, 0xee, 0x01, 0x30, 0x1d, 0x0b, 0x0d, 0x71, 0x33, 0xfc, 0xda,
+ 0xef, 0xfe, 0xef, 0xde,
+ 0x8b, 0xfe, 0x20, 0x0e, 0xfd, 0x01, 0x0f, 0xb8, 0x00, 0x31, 0x22, 0xd0,
+ 0xff, 0x20, 0x00, 0x8a,
+ 0xf0, 0x34, 0xf0, 0xac, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x00, 0x11, 0x34,
+ 0xf0, 0xcd, 0x11, 0x23,
+ 0xf0, 0xe2, 0xd3, 0xc4, 0xd1, 0xd0, 0xc0, 0xf0, 0x05, 0xc1, 0xf4, 0x03,
+ 0xbf, 0x11, 0x77, 0x00,
+ 0xdd, 0x15, 0x32, 0xde, 0xde, 0x00, 0xed, 0x10, 0x44, 0xdd, 0xbb, 0x00,
+ 0x11, 0x00, 0x0e, 0xed,
+ 0x00, 0x00, 0xe0, 0x33, 0x10, 0xdd, 0x31, 0x54, 0x42, 0x10, 0x1e, 0x0c,
+ 0x0c, 0x74, 0x43, 0x0e,
+ 0x22, 0x55, 0x1e, 0x0b, 0xee, 0xfe, 0x00, 0x21, 0x54, 0x0f, 0xc9, 0xde,
+ 0x00, 0x21, 0x0f, 0x20,
+ 0x70, 0x00, 0x0f, 0x0d, 0x0c, 0x11, 0x11, 0xdb, 0xfe, 0x31, 0xff, 0xcc,
+ 0x0f, 0xcc, 0xef, 0x22,
+ 0x01, 0xce, 0xff, 0x66, 0x11, 0x00, 0xef, 0xcc, 0xf0, 0x06, 0x00, 0xef,
+ 0xd0, 0xcf, 0xe0, 0x00,
+ 0xdf, 0x02, 0x46, 0xf0, 0xbe, 0x11, 0x43, 0x0e, 0x0f, 0x00, 0xf1, 0x05,
+ 0x02, 0xaf, 0xef, 0x15,
+ 0x01, 0xae, 0xf1, 0x06, 0x12, 0xf0, 0xce, 0x00, 0x02, 0x00, 0x0f, 0x1f,
+ 0x42, 0x00, 0xdd, 0x00,
+ 0x10, 0x22, 0x76, 0x0e, 0xd8, 0x20, 0x63, 0xef, 0xcb, 0x0f, 0x21, 0x10,
+ 0x0f, 0x00, 0xde, 0xe0,
+ 0x31, 0x0f, 0xfe, 0x21, 0xde, 0xac, 0x34, 0x43, 0x0f, 0x2e, 0x1f, 0x31,
+ 0x11, 0xd9, 0x1f, 0x73,
+ 0x2f, 0xa8, 0x00, 0x12, 0xff, 0xcd, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x31,
+ 0x00, 0xfd, 0x30, 0x2d,
+ 0x0c, 0x02, 0xe1, 0xbd, 0x42, 0x00, 0xb8, 0xff, 0x10, 0xff, 0x21, 0x76,
+ 0xfe, 0xdb, 0xf0, 0x00,
+ 0x22, 0x12, 0xef, 0xee, 0xff, 0xee, 0xcd, 0x26, 0x54, 0xf0, 0xe0, 0x00,
+ 0xf0, 0xef, 0xe0, 0xac,
+ 0x20, 0x76, 0x00, 0xfd, 0x11, 0x10, 0x00, 0x45, 0x22, 0xf0, 0xf1, 0xe0,
+ 0x02, 0x34, 0x01, 0xc0,
+ 0x01, 0x02, 0x22, 0x00, 0x53, 0x00, 0xfd, 0x03, 0x47, 0x62, 0x00, 0xda,
+ 0xf0, 0x64, 0x11, 0xee,
+ 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x24, 0x21, 0xef, 0xe0, 0x44,
+ 0xf0, 0xbd, 0x37, 0x14,
+ 0xe0, 0x52, 0x22, 0xde, 0x00, 0x77, 0x42, 0x00, 0x00, 0x00, 0x10, 0x20,
+ 0x10, 0xee, 0x00, 0x03,
+ 0x00, 0xde, 0x00, 0x02, 0x0e, 0xc8, 0x0e, 0x73, 0x00, 0xdc, 0x0f, 0x0e,
+ 0x2f, 0x2f, 0x20, 0xfd,
+ 0x89, 0x00, 0x10, 0x0e, 0x0e, 0x00, 0xfd, 0xfe, 0x0f, 0xfc, 0xed, 0xfd,
+ 0xde, 0xdf, 0xef, 0xe0,
+ 0xf0, 0x00, 0x3f, 0x20, 0xa0, 0x88, 0xf0, 0x00, 0xde, 0x01, 0x34, 0x0d,
+ 0xd8, 0x0f, 0x21, 0x20,
+ 0xde, 0x00, 0x75, 0x21, 0xbf, 0xf0, 0x03, 0xef, 0xd0, 0x37, 0xe0, 0x8e,
+ 0xf0, 0x03, 0xf0, 0x00,
+ 0xf0, 0xef, 0xf2, 0x16, 0x01, 0x12, 0x11, 0xf0, 0xde, 0x34, 0x44, 0xe0,
+ 0xce, 0xfe, 0xfe, 0x30,
+ 0x00, 0xec, 0x00, 0x44, 0x53, 0xee, 0xab, 0x01, 0x23, 0x00, 0x00, 0x13,
+ 0x45, 0x00, 0xcc, 0x21,
+ 0x64, 0x32, 0x21, 0x0f, 0x2f, 0x31, 0x31, 0x44, 0x10, 0x00, 0x44, 0x12,
+ 0xdb, 0x10, 0x74, 0x0f,
+ 0x0d, 0x00, 0x21, 0x00, 0x30, 0x20, 0x2c, 0x62, 0x01, 0x0f, 0xfc, 0x0e,
+ 0x1e, 0x0d, 0x1d, 0x31,
+ 0x45, 0xfb, 0xdc, 0x00, 0xff, 0x8a, 0x00, 0x35, 0x00, 0x0f, 0x20, 0x12,
+ 0xbe, 0xef, 0x24, 0x13,
+ 0xde, 0xbd, 0x00, 0x01, 0xde, 0xce, 0x00, 0x0f, 0x2c, 0x21, 0x22, 0xfe,
+ 0xcc, 0x22, 0x66, 0x00,
+ 0xdf, 0xbf, 0xf2, 0x06, 0xe0, 0xde, 0xd0, 0xcf, 0x01, 0x05, 0xd0, 0xd0,
+ 0x25, 0x00, 0x00, 0x10,
+ 0xb0, 0x03, 0x55, 0x00, 0x00, 0x0e, 0xbc, 0x12, 0x23, 0xca, 0xee, 0x30,
+ 0x31, 0xdf, 0xac, 0x00,
+ 0x11, 0x01, 0x00, 0xdb, 0x0f, 0x53, 0xe0, 0xcf, 0x14, 0x20, 0xfd, 0x0e,
+ 0x72, 0x02, 0x00, 0x11,
+ 0x0c, 0x0e, 0x34, 0xff, 0xed, 0x32, 0x0f, 0xc8, 0x00, 0x01, 0xdf, 0xdd,
+ 0x10, 0x42, 0x10, 0x0d,
+ 0x3f, 0x74, 0x00, 0x0f, 0x20, 0x56, 0x01, 0x00, 0x20, 0x30, 0xec, 0x0e,
+ 0x75, 0x00, 0xfe, 0x0f,
+ 0x0d, 0x2e, 0x22, 0x21, 0x21, 0x24, 0x0f, 0xff, 0x40, 0x20, 0xdc, 0xd0,
+ 0xd3, 0xb3, 0xce, 0xe8,
+ 0xed, 0x00, 0x43, 0x51, 0x1d, 0x51, 0x37, 0x00, 0x10, 0x32, 0x33, 0x01,
+ 0x23, 0x24, 0xef, 0x23,
+ 0x77, 0x03, 0xf3, 0xb0, 0xcd, 0x02, 0x27, 0x11, 0xf1, 0x02, 0x02, 0x00,
+ 0xf0, 0x36, 0x10, 0xd0,
+ 0x0f, 0x10, 0x31, 0x11, 0x9e, 0xdc, 0x00, 0x21, 0x04, 0x01, 0x20, 0xf0,
+ 0xaf, 0x04, 0x01, 0xad,
+ 0xef, 0xf1, 0x04, 0xd0, 0xb0, 0x06, 0xf0, 0xef, 0x20, 0x32, 0x10, 0x03,
+ 0x04, 0x10, 0x73, 0x13,
+ 0xfe, 0x00, 0xef, 0xa8, 0xdd, 0x0e, 0x01, 0x0d, 0x0b, 0x01, 0xef, 0x9c,
+ 0x00, 0x21, 0x0d, 0xf9,
+ 0x20, 0x0f, 0xbb, 0xed, 0x0e, 0x0f, 0x1f, 0x2e, 0x0e, 0x0e, 0xdb, 0xfe,
+ 0x3f, 0x1e, 0x0e, 0xfd,
+ 0x0e, 0x60, 0xfd, 0xdd, 0xca, 0x9c, 0x00, 0x34, 0xef, 0xcd, 0xfd, 0xed,
+ 0xde, 0x35, 0x32, 0xcd,
+ 0xfd, 0x40, 0x30, 0x0c, 0xff, 0x12, 0x01, 0xbd, 0xdf, 0x46, 0x00, 0xd0,
+ 0xe0, 0xd1, 0xa1, 0xce,
+ 0xf0, 0x17, 0x01, 0xc0, 0xf1, 0x15, 0xf0, 0xdf, 0x14, 0xc0, 0xdf, 0x41,
+ 0x23, 0xef, 0x9e, 0xf2,
+ 0x05, 0x00, 0x0d, 0x0e, 0xec, 0x00, 0x03, 0xf0, 0xcc, 0xee, 0xe0, 0xdf,
+ 0x9d, 0x04, 0x06, 0xcf,
+ 0xff, 0x33, 0x13, 0xff, 0x23, 0x75, 0x10, 0x10, 0x33, 0x13, 0x0e, 0xfc,
+ 0x11, 0x41, 0xe8, 0xed,
+ 0x42, 0x10, 0xff, 0x52, 0x1f, 0xfa, 0x20, 0x10, 0x10, 0x20, 0x00, 0x50,
+ 0x42, 0x0d, 0xfa, 0x10,
+ 0x20, 0x1f, 0x0f, 0x1e, 0x0c, 0x10, 0x30, 0xdf, 0xbc, 0x40, 0x51, 0x10,
+ 0x00, 0x0e, 0xfd, 0x10,
+ 0x10, 0x24, 0x35, 0xbf, 0xc0, 0xf4, 0xf4, 0xb0, 0xff, 0x00, 0x35, 0x22,
+ 0x00, 0x11, 0x20, 0x21,
+ 0x00, 0x76, 0x43, 0x01, 0x00, 0xf2, 0xe2, 0xe0, 0x27, 0x33, 0xd1, 0xb1,
+ 0xf2, 0xe1, 0xf3, 0x37,
+ 0xd1, 0x80, 0x00, 0x03, 0x12, 0x00, 0x01, 0x15, 0x23, 0x01, 0x11, 0x12,
+ 0x10, 0x1f, 0x70, 0x25,
+ 0xf0, 0xff, 0x10, 0x1e, 0x0c, 0xbd, 0xe0, 0xce, 0xdc, 0x01, 0x05, 0x13,
+ 0x30, 0x0e, 0x0c, 0x52,
+ 0x22, 0x42, 0x22, 0x0f, 0xfc, 0xdb, 0x50, 0x33, 0x11, 0x1f, 0xb9, 0xdf,
+ 0x00, 0x21, 0x0e, 0xef,
+ 0x32, 0x42, 0xec, 0xdd, 0x0f, 0x0c, 0x70, 0x65, 0x0f, 0xfc, 0x0f, 0x00,
+ 0x00, 0x21, 0x45, 0x11,
+ 0x00, 0xec, 0xed, 0x10, 0x30, 0x00, 0x2f, 0x73, 0x41, 0x0c, 0x1e, 0x21,
+ 0x00, 0xe1, 0x07, 0xe1,
+ 0xe0, 0x00, 0xa0, 0xdd, 0x01, 0x02, 0x0e, 0x3c, 0x70, 0x2e, 0xe8, 0x0f,
+ 0x33, 0x11, 0x63, 0x34,
+ 0x10, 0xf0, 0x01, 0x26, 0x21, 0x02, 0x45, 0x11, 0xd0, 0xa0, 0x13, 0x25,
+ 0x00, 0x00, 0x41, 0x01,
+ 0x00, 0x03, 0x04, 0x00, 0x63, 0x43, 0x11, 0xf0, 0xe1, 0x02, 0x0c, 0x0b,
+ 0x42, 0x11, 0xbc, 0xdd,
+ 0x02, 0x46, 0x00, 0xce, 0xf0, 0x03, 0x03, 0x03, 0xe0, 0xef, 0x32, 0x44,
+ 0x01, 0x42, 0x0f, 0xfa,
+ 0x32, 0x54, 0xf0, 0x01, 0x13, 0x00, 0x42, 0x11, 0xed, 0xac, 0xf0, 0x00,
+ 0xeb, 0x0f, 0x21, 0x0e,
+ 0xff, 0x12, 0xee, 0xd9, 0x4e, 0x60, 0x11, 0x01, 0x0e, 0xcc, 0xfe, 0x1d,
+ 0x2e, 0xe9, 0xbc, 0xfe,
+ 0x1e, 0x3f, 0x0e, 0x0c, 0x0e, 0x00, 0xbf, 0xbb, 0x0e, 0x0f, 0xf0, 0x03,
+ 0xc0, 0xad, 0xff, 0x01,
+ 0xfe, 0xf8, 0x00, 0x10, 0xed, 0xcc, 0x00, 0x00, 0x0d, 0x00, 0x33, 0x00,
+ 0xdf, 0x0f, 0x10, 0xa0,
+ 0xbe, 0xef, 0xde, 0xdf, 0x03, 0x07, 0xd0, 0x81, 0xe4, 0x05, 0x11, 0xe0,
+ 0xf1, 0xf5, 0xf2, 0x03,
+ 0xe3, 0xc0, 0xf0, 0x10, 0x0d, 0xdc, 0x41, 0x54, 0xfc, 0xcc, 0x00, 0x10,
+ 0xdd, 0xc0, 0x04, 0xfd,
+ 0xaa, 0x00, 0x00, 0xbd, 0x0f, 0x00, 0x0e, 0x10, 0x44, 0x11, 0x00, 0x27,
+ 0x42, 0x20, 0x30, 0x52,
+ 0x11, 0x00, 0x10, 0x21, 0x0f, 0x0c, 0x2f, 0x61, 0x0f, 0x0b, 0x00, 0xfe,
+ 0x0e, 0x43, 0x10, 0x09,
+ 0x10, 0x20, 0xfe, 0x0d, 0x0e, 0x0e, 0x0b, 0x0d, 0x0e, 0xdb, 0xbd, 0xfe,
+ 0xfe, 0x2f, 0x71, 0x1d,
+ 0xfa, 0x00, 0x11, 0x00, 0x02, 0x45, 0xd0, 0x80, 0xc0, 0x00, 0xff, 0xdf,
+ 0xef, 0xdd, 0xeb, 0x12,
+ 0x24, 0xff, 0xde, 0x0f, 0x32, 0x44, 0x32, 0x21, 0x10, 0xf0, 0x90, 0xce,
+ 0xf0, 0x04, 0xb1, 0xf6,
+ 0x06, 0xf2, 0xc0, 0xef, 0x10, 0x23, 0x27, 0xe1, 0x8f, 0xee, 0xf0, 0xee,
+ 0x01, 0x46, 0xf0, 0xcc,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0xf0, 0xdf, 0xde, 0x21, 0xed, 0x89, 0x00,
+ 0x00, 0xef, 0xfe, 0x21,
+ 0x10, 0x0e, 0x0f, 0x31, 0x34, 0x10, 0x60, 0x31, 0x22, 0x21, 0x0f, 0x0e,
+ 0x10, 0x0f, 0xfa, 0x0f,
+ 0x30, 0xff, 0x8c, 0xdb, 0x0e, 0x11, 0x01, 0xdd, 0x0e, 0x31, 0x23, 0x20,
+ 0x1a, 0x9a, 0xf0, 0x23,
+ 0x10, 0xde, 0xfc, 0xdf, 0xdf, 0xcf, 0xc0, 0xef, 0x51, 0x50, 0x30, 0x1f,
+ 0x20, 0x01, 0x00, 0x26,
+ 0x15, 0xa0, 0xf0, 0x02, 0xf0, 0xbf, 0xf3, 0x05, 0xef, 0xba, 0x00, 0x00,
+ 0x12, 0x11, 0x31, 0x30,
+ 0x20, 0x40, 0x10, 0x20, 0x20, 0x09, 0xec, 0x20, 0x33, 0xd2, 0x23, 0x62,
+ 0x00, 0x23, 0x47, 0xe0,
+ 0xd1, 0x13, 0x73, 0x25, 0x01, 0x01, 0x12, 0x02, 0x02, 0x21, 0x71, 0x41,
+ 0x22, 0x00, 0x12, 0x36,
+ 0x32, 0x11, 0x00, 0x30, 0x02, 0xc0, 0xcd, 0xed, 0x24, 0x47, 0xe0, 0xb0,
+ 0x02, 0x13, 0x44, 0x34,
+ 0x02, 0xe0, 0x23, 0x77, 0x00, 0x00, 0x10, 0x55, 0x00, 0x00, 0x12, 0x12,
+ 0x11, 0x00, 0x10, 0xf0,
+ 0xb0, 0x04, 0x33, 0x2f, 0x0e, 0x20, 0x21, 0x0d, 0xee, 0x00, 0x0d, 0x08,
+ 0x4e, 0x40, 0xc0, 0xad,
+ 0xfb, 0x0f, 0x1d, 0x50, 0x20, 0x0b, 0x0d, 0x1f, 0x1c, 0x1d, 0x1f, 0xcd,
+ 0xcc, 0x00, 0xf0, 0xbb,
+ 0xff, 0x0f, 0xf0, 0xad, 0xec, 0xf0, 0x1f, 0x0b, 0x0e, 0x00, 0x00, 0xfd,
+ 0xdc, 0x0e, 0xfd, 0x0e,
+ 0xf0, 0xdf, 0xee, 0x2e, 0xef, 0x8c, 0xa4, 0x17, 0x02, 0xff, 0x01, 0x02,
+ 0xce, 0xe1, 0xf6, 0xd1,
+ 0xd2, 0xf2, 0xd1, 0xf2, 0x05, 0x13, 0xf1, 0xf1, 0x73, 0x33, 0x02, 0x01,
+ 0xf0, 0x01, 0xf0, 0xbd,
+ 0xce, 0xe0, 0xf0, 0xcc, 0xd0, 0xdf, 0xdd, 0x05, 0x07, 0xd2, 0xd0, 0x63,
+ 0x33, 0xfe, 0xfb, 0x72,
+ 0x44, 0x22, 0x23, 0x10, 0x10, 0x35, 0x11, 0x10, 0x1e, 0x20, 0x41, 0x23,
+ 0x20, 0x50, 0x47, 0x34,
+ 0x32, 0x50, 0x3f, 0x2e, 0x2f, 0x1f, 0x22, 0x11, 0x1e, 0x1e, 0x10, 0x1b,
+ 0x6d, 0x3e, 0x1a, 0x0c,
+ 0x3f, 0x5e, 0x0c, 0x0c, 0x0d, 0x0e, 0x32, 0x40, 0xed, 0xef, 0xc3, 0xaf,
+ 0xec, 0x00, 0x00, 0xff,
+ 0xde, 0xf2, 0xf0, 0xd9, 0xff, 0xfe, 0xf9, 0x6e, 0x30, 0x0e, 0xc0, 0x03,
+ 0x42, 0x10, 0x00, 0xf1,
+ 0xe4, 0xd0, 0x8f, 0xe0, 0x05, 0xf0, 0xe0, 0xc0, 0xd0, 0xe3, 0x07, 0xf4,
+ 0xc1, 0xc2, 0xe2, 0xf3,
+ 0xd0, 0xe1, 0x10, 0x50, 0x14, 0xe0, 0xef, 0x22, 0x0f, 0xd9, 0xdf, 0xcf,
+ 0xbd, 0xfe, 0xcd, 0xda,
+ 0xbd, 0xff, 0x01, 0xf0, 0xcd, 0x02, 0x24, 0x20, 0x2e, 0x62, 0x05, 0x05,
+ 0x75, 0x00, 0xb9, 0x00,
+ 0x7a, 0xe9, 0x9c, 0x03, 0x95, 0xeb, 0x00, 0x06, 0x23, 0x76, 0x2f, 0x9a,
+ 0x00, 0x13, 0x11, 0x00,
+ 0xff, 0xed, 0xff, 0xf1, 0xf2, 0x30, 0x30, 0x1f, 0x3f, 0xfe, 0x9f, 0xff,
+ 0x01, 0x14, 0xf0, 0x35,
+ 0x21, 0xe0, 0x00, 0xc8, 0xcd, 0x64, 0x31, 0xfe, 0xfc, 0x41, 0x0e, 0xdd,
+ 0x55, 0x24, 0xff, 0x00,
+ 0x10, 0x0d, 0x10, 0x10, 0xe2, 0xd2, 0xec, 0x0f, 0x10, 0x3e, 0x4d, 0x0b,
+ 0x62, 0x47, 0x20, 0x0f,
+ 0x1f, 0x70, 0x14, 0x0f, 0x00, 0x41, 0x0e, 0xbc, 0x22, 0x22, 0x00, 0x11,
+ 0x56, 0x00, 0xed, 0x11,
+ 0x25, 0xef, 0xe0, 0x34, 0x00, 0x0f, 0x70, 0x12, 0xe0, 0x12, 0x34, 0x1e,
+ 0x0f, 0x55, 0x12, 0xf0,
+ 0xdd, 0x21, 0x23, 0x12, 0xe0, 0xe0, 0x12, 0x33, 0x67, 0xe1, 0xdf, 0x01,
+ 0x57, 0x20, 0xd0, 0xf0,
+ 0x00, 0x61, 0x14, 0xf0, 0x01, 0x24, 0x00, 0xe0, 0x51, 0x36, 0xc0, 0xef,
+ 0x02, 0x00, 0xf0, 0x01,
+ 0x30, 0x11, 0xf5, 0xe0, 0x50, 0x32, 0xc0, 0x00, 0x31, 0x26, 0x34, 0xbf,
+ 0xbc, 0xff, 0x00, 0x20,
+ 0x0f, 0xff, 0xee, 0x30, 0x52, 0xec, 0x11, 0x65, 0xfe, 0xf0, 0x21, 0xec,
+ 0xdb, 0x11, 0xf0, 0xde,
+ 0x00, 0x40, 0xfe, 0xdd, 0xde, 0x11, 0x74, 0x1e, 0x09, 0xee, 0x00, 0x41,
+ 0x00, 0x99, 0x00, 0x00,
+ 0x01, 0x10, 0x1f, 0xcb, 0xff, 0x10, 0x1f, 0x00, 0xe2, 0xf2, 0xbb, 0xee,
+ 0x1f, 0x10, 0xd0, 0xc3,
+ 0xc0, 0xcc, 0x0d, 0x30, 0x12, 0xbf, 0x01, 0x10, 0xfc, 0xc0, 0x01, 0xfe,
+ 0xfc, 0xdc, 0x00, 0x04,
+ 0xa0, 0xef, 0xb8, 0x0f, 0x01, 0xe0, 0xef, 0xe0, 0xce, 0xec, 0xf1, 0x02,
+ 0xe1, 0x40, 0x22, 0xce,
+ 0xdd, 0x00, 0x21, 0xe0, 0xd0, 0xe0, 0xa0, 0xd9, 0xed, 0x0e, 0xea, 0xef,
+ 0x64, 0x00, 0xcd, 0x00,
+ 0x45, 0x0f, 0xac, 0xff, 0x24, 0x10, 0xdc, 0x00, 0x23, 0x00, 0xa9, 0xfe,
+ 0x21, 0x31, 0xf0, 0xff,
+ 0x0f, 0xed, 0x3f, 0x42, 0xd0, 0xdc, 0x00, 0x10, 0x0e, 0xcb, 0xf0, 0x00,
+ 0x01, 0xff, 0xe0, 0xbd,
+ 0xfc, 0x21, 0x42, 0x0c, 0x20, 0x00, 0xbf, 0xea, 0x0f, 0x20, 0x41, 0x01,
+ 0xbc, 0xfe, 0x01, 0x02,
+ 0x00, 0x42, 0x10, 0x0b, 0x00, 0xcf, 0xcf, 0x03, 0x27, 0x01, 0x8c, 0xf0,
+ 0x12, 0x20, 0x00, 0xcd,
+ 0xf0, 0x06, 0x11, 0x43, 0x00, 0xde, 0x11, 0x32, 0xe0, 0x02, 0x25, 0xdf,
+ 0xbf, 0xfd, 0xee, 0xf1,
+ 0xe2, 0xef, 0x0d, 0x01, 0x85, 0xe0, 0x02, 0x54, 0x01, 0x2f, 0x00, 0xe1,
+ 0xf4, 0x00, 0xfb, 0xcc,
+ 0x00, 0x55, 0xef, 0xce, 0x02, 0x12, 0xfe, 0xfd, 0x20, 0x75, 0x00, 0xcd,
+ 0xfd, 0x25, 0x10, 0x00,
+ 0xe1, 0x00, 0xee, 0xf0, 0x0c, 0x4f, 0x00, 0xf3, 0x04, 0x0c, 0x2d, 0x74,
+ 0x10, 0x0f, 0x0d, 0xef,
+ 0x10, 0x5f, 0x0c, 0x1f, 0xf0, 0xb4, 0x06, 0x20, 0x0d, 0xef, 0x02, 0x21,
+ 0x10, 0x0d, 0xd8, 0x2f,
+ 0x52, 0x11, 0x4f, 0x0d, 0xfe, 0x07, 0x30, 0x0f, 0xee, 0x2e, 0x72, 0x40,
+ 0xfb, 0x33, 0x67, 0x00,
+ 0xe0, 0x0f, 0x20, 0x30, 0x11, 0x22, 0xd0, 0xa0, 0x26, 0x42, 0xff, 0x00,
+ 0x43, 0x20, 0x00, 0x43,
+ 0x12, 0x12, 0x17, 0x00, 0x30, 0x52, 0x00, 0x0d, 0x0e, 0x12, 0x03, 0xb0,
+ 0x04, 0x57, 0x01, 0xd0,
+ 0x40, 0x35, 0xf0, 0xee, 0x76, 0x21, 0xff, 0x0f, 0x00, 0x02, 0x33, 0x13,
+ 0x10, 0x10, 0x22, 0xe4,
+ 0xe0, 0x2f, 0x73, 0x37, 0x01, 0x01, 0x10, 0xfe, 0x00, 0x13, 0x01, 0x56,
+ 0x52, 0x00, 0x00, 0xf1,
+ 0x03, 0x01, 0x30, 0x41, 0x0e, 0xf0, 0xd0, 0x2f, 0x77, 0x72, 0xfc, 0xf1,
+ 0x14, 0x00, 0x10, 0x1d,
+ 0x10, 0x00, 0xcd, 0x04, 0x36, 0xee, 0xed, 0x13, 0x50, 0x21, 0x00, 0xfd,
+ 0x12, 0x24, 0xdc, 0xde,
+ 0x63, 0x0f, 0xfa, 0x01, 0x22, 0x0f, 0x0e, 0x20, 0x00, 0x20, 0x20, 0xff,
+ 0xff, 0xd0, 0x21, 0xed,
+ 0x88, 0xd0, 0x34, 0xdf, 0xcc, 0x01, 0x01, 0x33, 0x77, 0xd0, 0xce, 0x21,
+ 0x40, 0x00, 0xe0, 0xff,
+ 0xf0, 0x01, 0x13, 0xfe, 0xdf, 0xf0, 0x1f, 0x0f, 0xa4, 0xd6, 0xf0, 0xed,
+ 0xef, 0x11, 0x00, 0xdd,
+ 0x37, 0xc0, 0xbb, 0x71, 0x03, 0xe0, 0x00, 0x05, 0x32, 0x10, 0x0f, 0xe0,
+ 0xed, 0x0f, 0x35, 0x01,
+ 0x8c, 0x0e, 0x31, 0x33, 0xf2, 0xff, 0xf0, 0x04, 0xff, 0x0e, 0x4f, 0xd0,
+ 0xe3, 0x01, 0xa8, 0xfe,
+ 0x20, 0x74, 0x50, 0xeb, 0xf0, 0x10, 0x10, 0x0f, 0xf0, 0x30, 0x11, 0xfe,
+ 0xee, 0xf1, 0xe1, 0xe0,
+ 0x12, 0x63, 0xf8, 0xde, 0x40, 0x12, 0xfe, 0xef, 0x10, 0x00, 0xc8, 0x1e,
+ 0x52, 0xe2, 0xcf, 0x1f,
+ 0x0d, 0xcb, 0x20, 0x72, 0x14, 0xf0, 0xcd, 0x0c, 0x00, 0x00, 0xee, 0x00,
+ 0x06, 0x00, 0xed, 0xe1,
+ 0x03, 0x32, 0x32, 0xee, 0x9a, 0x00, 0xf0, 0xe0, 0xd1, 0x22, 0x30, 0xed,
+ 0x0f, 0x10, 0x00, 0xef,
+ 0x81, 0xde, 0x00, 0x03, 0x00, 0xcd, 0xb8, 0xf8, 0x00, 0x10, 0x00, 0x00,
+ 0xc0, 0x01, 0x32, 0x3e,
+ 0x0e, 0xdf, 0x8a, 0x01, 0x04, 0x02, 0xec, 0xdd, 0x0f, 0x40, 0xf0, 0x01,
+ 0xdf, 0xfe, 0x10, 0xff,
+ 0xca, 0x0e, 0x12, 0x16, 0xa0, 0xcd, 0xee, 0x0f, 0x30, 0xb0, 0xff, 0x0d,
+ 0xee, 0x00, 0x3e, 0x0a,
+ 0x0f, 0x00, 0x00, 0xcf, 0xc9, 0x11, 0x51, 0xde, 0xdf, 0xe0, 0xe1, 0xad,
+ 0xfb, 0x0f, 0xef, 0x10,
+ 0x31, 0x8c, 0xec, 0x00, 0x25, 0x10, 0xca, 0xf0, 0x42, 0xf0, 0xcc, 0x00,
+ 0x30, 0x01, 0x00, 0xdd,
+ 0x10, 0x0e, 0x0f, 0x00, 0xdd, 0xd0, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x10,
+ 0xce, 0x8d, 0xf3, 0x05,
+ 0x0d, 0x31, 0x74, 0xfc, 0xde, 0x21, 0x35, 0x20, 0x12, 0xff, 0xee, 0xff,
+ 0xec, 0x10, 0x11, 0x81,
+ 0xe0, 0x02, 0x14, 0x0d, 0xea, 0x20, 0x53, 0xd0, 0x01, 0x74, 0x0f, 0xe0,
+ 0x07, 0x22, 0x10, 0xfd,
+ 0x01, 0x04, 0xe0, 0x0f, 0x42, 0x01, 0x00, 0x67, 0x02, 0xde, 0x1f, 0x73,
+ 0x02, 0xf3, 0x00, 0x00,
+ 0xf3, 0x26, 0x10, 0x0f, 0xe1, 0x01, 0x10, 0x0f, 0xff, 0xf0, 0xd0, 0x60,
+ 0x76, 0x10, 0x00, 0x06,
+ 0x0f, 0xee, 0x31, 0x10, 0xfa, 0x02, 0x01, 0xf0, 0x0e, 0x0e, 0xbd, 0x00,
+ 0x70, 0x01, 0x04, 0xe0,
+ 0xe9, 0x1e, 0x60, 0x00, 0xf2, 0xe0, 0xfb, 0x00, 0x20, 0x4b, 0x00, 0x01,
+ 0xd1, 0x00, 0x0b, 0x10,
+ 0x20, 0x0f, 0xd0, 0x00, 0x11, 0xad, 0xcd, 0x0f, 0xf0, 0xdc, 0x11, 0x03,
+ 0x01, 0x00, 0xeb, 0x11,
+ 0x66, 0xf1, 0xdf, 0xfe, 0x40, 0x10, 0xf0, 0xd0, 0xa0, 0xe4, 0xf0, 0xfc,
+ 0xbe, 0xdc, 0x03, 0x36,
+ 0xdf, 0xcd, 0x22, 0x25, 0xa0, 0x0f, 0x30, 0xf2, 0xdf, 0x00, 0xf2, 0xb1,
+ 0x26, 0x52, 0xdd, 0xee,
+ 0x10, 0x43, 0xf0, 0x05, 0x13, 0xd0, 0xcb, 0x52, 0x20, 0x10, 0x16, 0x11,
+ 0xd0, 0xff, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x21, 0x73, 0x50, 0x0d, 0x01, 0x21, 0x47, 0x10, 0xff,
+ 0x10, 0x10, 0x00, 0x51,
+ 0x10, 0xec, 0xff, 0x26, 0x10, 0xfe, 0x20, 0x76, 0xf0, 0x0d, 0x10, 0x21,
+ 0x24, 0x20, 0xed, 0xdb,
+ 0x20, 0x51, 0x21, 0x00, 0x1e, 0x42, 0x21, 0x0d, 0x1e, 0x66, 0x12, 0xee,
+ 0x0f, 0x00, 0x1f, 0x11,
+ 0xef, 0x8a, 0x01, 0x23, 0x00, 0x0c, 0x02, 0x47, 0xf1, 0xa0, 0x0e, 0x30,
+ 0x10, 0x01, 0x12, 0xf0,
+ 0xf2, 0x03, 0x0e, 0x2b, 0xcf, 0xf2, 0x17, 0xe0, 0x9e, 0x11, 0x00, 0xce,
+ 0x0e, 0x33, 0x04, 0xde,
+ 0xce, 0x33, 0x64, 0x00, 0xe1, 0x02, 0x00, 0x0e, 0xcd, 0x04, 0x32, 0xde,
+ 0x07, 0x10, 0xee, 0xeb,
+ 0x01, 0x63, 0x00, 0x0c, 0x00, 0x16, 0x00, 0xcf, 0x1f, 0x00, 0xa0, 0xf0,
+ 0x01, 0xe0, 0x10, 0x31,
+ 0x01, 0x10, 0x4d, 0x64, 0x10, 0xfc, 0x00, 0x1f, 0xfc, 0xf0, 0x76, 0x00,
+ 0xee, 0x00, 0x10, 0x32,
+ 0x46, 0x00, 0x0f, 0x0e, 0x10, 0xf2, 0xf1, 0x00, 0x4c, 0x1e, 0x0f, 0x00,
+ 0x11, 0x74, 0x10, 0x2f,
+ 0x51, 0x47, 0x23, 0x0e, 0xfe, 0x00, 0x51, 0x00, 0x1e, 0x11, 0x37, 0x20,
+ 0x01, 0xe0, 0x01, 0x43,
+ 0x1f, 0x52, 0xf2, 0xe3, 0x27, 0x52, 0x02, 0x00, 0x51, 0x25, 0x00, 0x2f,
+ 0x30, 0xf4, 0x04, 0x44,
+ 0x10, 0xe0, 0xef, 0xf0, 0x04, 0xf0, 0x31, 0x45, 0xd0, 0xbe, 0x10, 0x77,
+ 0x12, 0x00, 0x10, 0x00,
+ 0x02, 0xe0, 0x44, 0x32, 0xb0, 0xff, 0x13, 0x00, 0x00, 0x37, 0x04, 0xcf,
+ 0x00, 0x20, 0x30, 0x20,
+ 0x34, 0x12, 0xa1, 0xe1, 0xf2, 0xc2, 0x01, 0x74, 0x14, 0xfd, 0xdf, 0x10,
+ 0x01, 0x00, 0x10, 0x2b,
+ 0x00, 0xd4, 0xee, 0x1e, 0x1a, 0xff, 0x64, 0x01, 0x1f, 0x30, 0xff, 0x8b,
+ 0x20, 0x31, 0xd0, 0xcc,
+ 0x00, 0xec, 0xfd, 0x41, 0x33, 0xbf, 0xfd, 0x00, 0x2c, 0x0c, 0x0f, 0x00,
+ 0x2e, 0x0c, 0xf0, 0x0d,
+ 0xdc, 0x20, 0x31, 0xee, 0x88, 0x0f, 0x2f, 0xed, 0x9c, 0x01, 0x11, 0xee,
+ 0xbd, 0x10, 0x00, 0xdb,
+ 0xcd, 0x11, 0x43, 0x00, 0x0d, 0xe8, 0xcf, 0x11, 0x12, 0x0f, 0xcc, 0x00,
+ 0xf0, 0xe1, 0xbf, 0xdd,
+ 0xff, 0xf0, 0x0e, 0xd9, 0xdf, 0x00, 0xc1, 0xd0, 0xef, 0xee, 0xe0, 0xce,
+ 0xd0, 0xd4, 0x1f, 0x3e,
+ 0x9f, 0xad, 0xf0, 0x00, 0xfd, 0x0f, 0x0b, 0xe8, 0xef, 0x22, 0xe0, 0xce,
+ 0xf0, 0x01, 0x0d, 0xef,
+ 0xe0, 0xc2, 0xbd, 0xee, 0xf3, 0x30, 0xe8, 0x8a, 0xf0, 0x10, 0x30, 0x00,
+ 0xee, 0x20, 0x0d, 0xab,
+ 0x00, 0x42, 0x00, 0xfb, 0xff, 0xfd, 0xe0, 0xfe, 0x00, 0x2f, 0x1f, 0xff,
+ 0xde, 0xee, 0xee, 0xcb,
+ 0xff, 0x61, 0x21, 0xcb, 0xed, 0xff, 0x0c, 0x40, 0x10, 0x0c, 0x00, 0xe0,
+ 0xde, 0x0c, 0x30, 0x20,
+ 0x53, 0x24, 0xec, 0xbd, 0x00, 0xef, 0xab, 0x01, 0x01, 0x27, 0x32, 0xbe,
+ 0xec, 0xf0, 0x23, 0x32,
+ 0x00, 0x1f, 0xf1, 0x90, 0x00, 0x37, 0x04, 0xde, 0x20, 0x10, 0xf0, 0xbf,
+ 0x00, 0x26, 0xff, 0xcf,
+ 0xf0, 0xde, 0xee, 0x45, 0x22, 0xee, 0x30, 0x00, 0x80, 0xf0, 0x07, 0x2f,
+ 0x0f, 0x00, 0x90, 0x00,
+ 0x00, 0x0e, 0x00, 0xf0, 0x03, 0x0e, 0x20, 0x1f, 0x00, 0x04, 0x04, 0x00,
+ 0xed, 0xa0, 0xcb, 0xee,
+ 0x21, 0x45, 0x00, 0xd0, 0xef, 0x00, 0x40, 0x41, 0x30, 0xdc, 0xe1, 0x32,
+ 0x3c, 0xdd, 0xf4, 0x04,
+ 0xfc, 0x2f, 0x70, 0x50, 0xdc, 0x11, 0x03, 0xcf, 0x10, 0x46, 0x11, 0xde,
+ 0xfe, 0x14, 0x00, 0xcd,
+ 0x2d, 0x2c, 0x22, 0x47, 0xd0, 0xef, 0x71, 0x3f, 0xfd, 0x02, 0x47, 0x10,
+ 0x1e, 0x20, 0x11, 0xe0,
+ 0xed, 0x10, 0x55, 0xf2, 0x03, 0x60, 0x0c, 0x1f, 0x23, 0x06, 0x00, 0x62,
+ 0x53, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0x47, 0x35, 0xf0, 0x0f, 0x21, 0x00, 0xdd, 0x01, 0x24, 0x20,
+ 0x2f, 0x42, 0x23, 0x00,
+ 0x6f, 0x34, 0x02, 0x24, 0x61, 0x00, 0xf0, 0x13, 0x37, 0x00, 0xfc, 0x01,
+ 0x26, 0x40, 0x30, 0x60,
+ 0x10, 0x02, 0x02, 0x41, 0x32, 0x11, 0xf1, 0x01, 0x02, 0x13, 0x67, 0xff,
+ 0xee, 0x21, 0x76, 0x10,
+ 0x01, 0x11, 0x32, 0x00, 0xee, 0x00, 0x33, 0x23, 0x30, 0x1c, 0xe0, 0x10,
+ 0x76, 0x40, 0x00, 0x01,
+ 0x10, 0x22, 0x0d, 0xef, 0x12, 0xe7, 0xf0, 0x0c, 0x0f, 0x30, 0x12, 0x12,
+ 0x50, 0x20, 0x0e, 0x1e,
+ 0xdd, 0xc0, 0x76, 0x74, 0x1f, 0x0e, 0xef, 0xfe, 0xf0, 0x2f, 0x50, 0xf0,
+ 0xfd, 0x10, 0xdc, 0xf1,
+ 0x03, 0xcb, 0x10, 0x31, 0x00, 0xff, 0x03, 0xce, 0xe9, 0x73, 0x35, 0xf0,
+ 0x00, 0xbe, 0xfc, 0x00,
+ 0x24, 0x00, 0xeb, 0xd0, 0x03, 0xc1, 0xee, 0x1f, 0x1f, 0xe0, 0xde, 0x11,
+ 0x27, 0xc0, 0xdf, 0x0e,
+ 0xcf, 0xe0, 0x34, 0x01, 0x8d, 0xaf, 0x23, 0x12, 0x00, 0xf2, 0x1e, 0x1f,
+ 0x16, 0x05, 0x20, 0xdd,
+ 0xef, 0x12, 0x63, 0xed, 0xe1, 0x05, 0xee, 0xee, 0x43, 0x55, 0x00, 0xcd,
+ 0x01, 0x00, 0x20, 0x2e,
+ 0x0b, 0xde, 0x00, 0x04, 0x2f, 0x7f, 0x0e, 0xda, 0x00, 0x52, 0x00, 0x0c,
+ 0xe0, 0x03, 0x1f, 0x0c,
+ 0xf0, 0xd3, 0x02, 0x2d, 0x08, 0x2f, 0x30, 0x9f, 0xcd, 0x23, 0x66, 0xfe,
+ 0xee, 0x00, 0xfe, 0x1f,
+ 0x51, 0xf3, 0xfe, 0xfc, 0x2f, 0x1f, 0xbb, 0x01, 0x02, 0xfe, 0xec, 0xd0,
+ 0xee, 0x11, 0x11, 0xff,
+ 0xef, 0x75, 0x01, 0xbd, 0xfd, 0xff, 0x10, 0x33, 0x00, 0xcd, 0x0e, 0xdc,
+ 0xe0, 0xf6, 0xf0, 0x0b,
+ 0xce, 0xe0, 0x32, 0x11, 0xed, 0x90, 0xed, 0xc9, 0x00, 0x10, 0xf0, 0xdd,
+ 0x22, 0x24, 0x00, 0x8b,
+ 0xf0, 0x00, 0x00, 0x0c, 0xff, 0xe0, 0xe0, 0x00, 0x1e, 0xec, 0xdd, 0x00,
+ 0xf4, 0xcf, 0x0b, 0xff,
+ 0x8c, 0xd1, 0xf2, 0xde, 0xeb, 0x10, 0x30, 0xcf, 0xad, 0xed, 0x00, 0x43,
+ 0xea, 0xbc, 0x00, 0x01,
+ 0x0e, 0x30, 0x0e, 0xfd, 0xf0, 0xe0, 0xd0, 0xe0, 0xeb, 0xdc, 0x30, 0x20,
+ 0xbd, 0xee, 0xb2, 0xdf,
+ 0xeb, 0x50, 0xfb, 0x9e, 0x01, 0x10, 0x0b, 0xe0, 0x0f, 0x00, 0x23, 0xfa,
+ 0xde, 0x50, 0x0f, 0xde,
+ 0x11, 0x1d, 0xfa, 0xf1, 0x04, 0x9d, 0xfc, 0xf0, 0x10, 0x12, 0xd0, 0x1e,
+ 0x2f, 0xbe, 0xe0, 0x45,
+ 0x10, 0x0b, 0x23, 0x32, 0xde, 0xef, 0x21, 0x61, 0x23, 0x01, 0xf2, 0xe0,
+ 0xdb, 0xce, 0xfd, 0x0f,
+ 0x30, 0x66, 0xf0, 0xac, 0x00, 0x56, 0x00, 0xff, 0x03, 0x11, 0x0e, 0x0f,
+ 0x01, 0xf2, 0xd0, 0x23,
+ 0x40, 0x0f, 0xd0, 0x23, 0x25, 0xe0, 0x00, 0x77, 0x12, 0xf2, 0x03, 0x03,
+ 0x30, 0xf0, 0xe0, 0x37,
+ 0x61, 0x00, 0xf1, 0x02, 0x00, 0x30, 0x32, 0xc2, 0xc0, 0x67, 0x33, 0xfd,
+ 0xd0, 0x00, 0x43, 0x20,
+ 0x00, 0x0f, 0x21, 0x12, 0x36, 0x20, 0xde, 0x00, 0x21, 0x0f, 0xa8, 0x00,
+ 0x32, 0x3f, 0x9c, 0xf0,
+ 0x23, 0x00, 0xdd, 0x10, 0x6e, 0x0d, 0x0f, 0x02, 0x30, 0xdc, 0xe0, 0x0d,
+ 0x3e, 0x2a, 0x30, 0xf0,
+ 0x8e, 0x0f, 0x1f, 0x08, 0xce, 0x00, 0x00, 0x1d, 0x10, 0xe3, 0xce, 0x0b,
+ 0x00, 0x54, 0x10, 0x10,
+ 0xe0, 0xde, 0x12, 0x77, 0xf0, 0xd0, 0x0f, 0xdc, 0x00, 0x12, 0xe0, 0x8c,
+ 0xfe, 0x00, 0x04, 0x33,
+ 0xf1, 0xcf, 0x00, 0x22, 0x14, 0xe2, 0xb2, 0xf0, 0xeb, 0xed, 0x33, 0x26,
+ 0xe0, 0xe0, 0x01, 0xf0,
+ 0x23, 0x76, 0x01, 0x00, 0xcf, 0xf1, 0x05, 0x20, 0xff, 0xe0, 0x24, 0x43,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x13, 0x75, 0x22, 0x13, 0x00, 0xfe, 0x1c, 0x50, 0x45, 0x21, 0xf0, 0x11,
+ 0x3f, 0x10, 0x21, 0x22,
+ 0x42, 0x20, 0xda, 0xd0, 0x74, 0x31, 0x0c, 0x0e, 0x20, 0x24, 0x00, 0x10,
+ 0xfe, 0x0e, 0x72, 0x73,
+ 0x0a, 0xeb, 0xf0, 0x22, 0x52, 0x0f, 0x0d, 0xf0, 0x10, 0x20, 0x23, 0x27,
+ 0xdf, 0xbb, 0x20, 0x10,
+ 0x0f, 0x00, 0xf1, 0xe0, 0x1f, 0x51, 0xef, 0xfc, 0x65, 0x03, 0x02, 0x11,
+ 0x1f, 0x0d, 0xe1, 0x03,
+ 0x20, 0xf0, 0x9f, 0xfe, 0x0b, 0x00, 0x12, 0xe0, 0x27, 0x64, 0xef, 0xde,
+ 0x0f, 0x0f, 0x01, 0xf3,
+ 0xee, 0xe0, 0xf0, 0xcd, 0x23, 0x04, 0xcf, 0x31, 0x42, 0x00, 0x00, 0xfa,
+ 0x9c, 0x04, 0x06, 0x00,
+ 0xec, 0x00, 0x00, 0x0f, 0xd0, 0xf0, 0x0e, 0x11, 0xc0, 0xe0, 0x23, 0x12,
+ 0x8e, 0x0d, 0x40, 0x02,
+ 0xed, 0xfe, 0x47, 0x12, 0xc8, 0x1e, 0x71, 0x01, 0x00, 0x00, 0x00, 0x0e,
+ 0x10, 0x25, 0x1e, 0x0f,
+ 0x11, 0x24, 0x10, 0x1e, 0x40, 0x22, 0xf0, 0xab, 0x0f, 0x53, 0x00, 0xfc,
+ 0x20, 0x41, 0x13, 0x26,
+ 0x0e, 0x3d, 0x76, 0x42, 0xff, 0xfe, 0x00, 0x20, 0x11, 0x02, 0x2e, 0x00,
+ 0xe1, 0xec, 0x2d, 0x73,
+ 0x37, 0x14, 0xff, 0xdf, 0x20, 0x72, 0x10, 0x01, 0x14, 0x32, 0x05, 0x05,
+ 0x4b, 0x00, 0x85, 0x00,
+ 0xa7, 0x36, 0x29, 0x1d, 0xcb, 0x38, 0xa0, 0x1d, 0x43, 0x66, 0x02, 0xf0,
+ 0xf0, 0x41, 0x35, 0xf0,
+ 0xc1, 0x0f, 0x10, 0x75, 0x12, 0x00, 0xdf, 0x01, 0x23, 0x03, 0x12, 0x00,
+ 0x03, 0x42, 0xed, 0x24,
+ 0x57, 0xc2, 0xe0, 0x22, 0x20, 0x0f, 0x27, 0x34, 0xcf, 0xee, 0x22, 0x22,
+ 0xe0, 0x11, 0x55, 0xe0,
+ 0xaf, 0x00, 0x13, 0x34, 0xf2, 0x03, 0x01, 0x0d, 0x0e, 0x10, 0x41, 0x12,
+ 0xc1, 0xe1, 0x11, 0x4e,
+ 0xf8, 0xd0, 0x11, 0x51, 0x72, 0x00, 0xed, 0x30, 0x42, 0xd9, 0xd0, 0xff,
+ 0xdb, 0xed, 0x0f, 0x00,
+ 0x0f, 0xfe, 0x62, 0xdc, 0xdd, 0x70, 0x2f, 0x08, 0xe0, 0x02, 0x20, 0xfd,
+ 0xb9, 0x2f, 0x30, 0xd0,
+ 0xc0, 0x00, 0x1b, 0x0f, 0xf0, 0xbe, 0xd0, 0x0f, 0x20, 0xdc, 0xad, 0x00,
+ 0x00, 0x00, 0x50, 0xdd,
+ 0xda, 0x00, 0x20, 0x00, 0xee, 0xed, 0xd2, 0xa0, 0xed, 0xfe, 0x0e, 0xec,
+ 0xdc, 0xbc, 0x0f, 0x33,
+ 0xe3, 0x8b, 0xfe, 0xee, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0x03, 0xf1, 0xe8,
+ 0xfb, 0xdf, 0x01, 0x05,
+ 0x00, 0xc0, 0xdc, 0xdf, 0x00, 0x74, 0xe0, 0xac, 0x00, 0xe0, 0xf0, 0x10,
+ 0x02, 0x00, 0xf0, 0xe0,
+ 0xed, 0x00, 0xee, 0xd0, 0x25, 0x62, 0xfa, 0xad, 0x00, 0x0f, 0x20, 0x00,
+ 0x01, 0x03, 0x11, 0x0b,
+ 0xaa, 0x0f, 0x20, 0x01, 0xe0, 0xec, 0xff, 0x10, 0x30, 0xcf, 0xce, 0x00,
+ 0x0e, 0x5f, 0x11, 0xe0,
+ 0xbd, 0x12, 0x2c, 0xf8, 0xfe, 0x01, 0x33, 0xcd, 0xdb, 0x31, 0x72, 0xfe,
+ 0xfc, 0x11, 0x03, 0xf1,
+ 0xee, 0xfb, 0xff, 0x21, 0x12, 0xd0, 0xd0, 0xcb, 0x0f, 0x72, 0x35, 0x00,
+ 0x00, 0xe0, 0xe2, 0x00,
+ 0xff, 0xed, 0x04, 0x03, 0xbe, 0xca, 0x22, 0x74, 0xff, 0xfe, 0x01, 0x02,
+ 0xff, 0xe0, 0xf2, 0xef,
+ 0xed, 0xf0, 0xf1, 0x02, 0x33, 0x00, 0x89, 0x0e, 0x00, 0x30, 0x04, 0xde,
+ 0xcd, 0x14, 0x22, 0xbc,
+ 0xed, 0x0f, 0x23, 0x47, 0xe0, 0xac, 0x00, 0x22, 0x00, 0xcd, 0x02, 0x27,
+ 0xef, 0x0e, 0x0f, 0xff,
+ 0xdf, 0x00, 0x10, 0x72, 0x03, 0x02, 0xff, 0x1d, 0x3f, 0x41, 0x12, 0xeb,
+ 0xac, 0x00, 0x33, 0x0e,
+ 0xe9, 0x00, 0x01, 0x23, 0xff, 0xcb, 0x20, 0x44, 0xe1, 0xf1, 0x10, 0xfc,
+ 0xfe, 0x00, 0x3f, 0x31,
+ 0x76, 0x40, 0x0b, 0x00, 0x43, 0x52, 0x00, 0x00, 0x0e, 0x00, 0x0f, 0x00,
+ 0xee, 0x00, 0x01, 0x20,
+ 0x1e, 0x1f, 0x44, 0x75, 0x53, 0x26, 0x31, 0xff, 0x0e, 0x11, 0x14, 0x02,
+ 0xf0, 0x61, 0x31, 0x02,
+ 0xf0, 0x25, 0x41, 0x01, 0x12, 0x3f, 0x0c, 0x44, 0x37, 0x00, 0xf1, 0x71,
+ 0x10, 0x00, 0x01, 0x13,
+ 0x42, 0x23, 0x20, 0x0e, 0x03, 0x33, 0x00, 0x3e, 0x47, 0x36, 0x42, 0x30,
+ 0x50, 0x34, 0x74, 0x00,
+ 0xf1, 0x00, 0x12, 0x22, 0x35, 0x00, 0xe0, 0x00, 0x53, 0x03, 0x02, 0x03,
+ 0x54, 0x11, 0x12, 0x33,
+ 0x26, 0x00, 0x10, 0x2f, 0x23, 0x01, 0x1f, 0x5d, 0x51, 0x35, 0x25, 0x01,
+ 0x02, 0x52, 0x01, 0x0f,
+ 0x0e, 0xf0, 0xef, 0x03, 0x21, 0xc0, 0xee, 0x2c, 0x70, 0x77, 0xf1, 0xf0,
+ 0x00, 0x33, 0x11, 0x00,
+ 0xfe, 0x1f, 0x43, 0x04, 0x0c, 0xc8, 0xfe, 0x00, 0x0e, 0xfe, 0x20, 0x2e,
+ 0xee, 0xf0, 0x0f, 0x21,
+ 0x30, 0x08, 0x20, 0x24, 0xb0, 0xef, 0x3f, 0x00, 0xd0, 0x01, 0xe0, 0x89,
+ 0xde, 0x50, 0x34, 0xc0,
+ 0xbd, 0x00, 0x0f, 0x31, 0x03, 0xc0, 0x02, 0x06, 0xf0, 0xee, 0xcf, 0xff,
+ 0xe0, 0x0e, 0x1c, 0x00,
+ 0xc3, 0xc3, 0xf1, 0x0f, 0x60, 0x26, 0x12, 0xf2, 0xcf, 0x01, 0x25, 0x1f,
+ 0xcd, 0xf0, 0x04, 0xf2,
+ 0xdf, 0xdf, 0x67, 0x31, 0xe0, 0xc2, 0x05, 0x50, 0x20, 0x0f, 0xd0, 0xd0,
+ 0x0d, 0x00, 0x0d, 0x20,
+ 0x24, 0x21, 0x30, 0x2f, 0x50, 0x57, 0x35, 0xee, 0xbb, 0x00, 0x02, 0xf0,
+ 0x0f, 0x0d, 0x10, 0xe0,
+ 0xe0, 0x0f, 0x60, 0x0f, 0xda, 0x0f, 0x00, 0x21, 0x12, 0x2e, 0x0d, 0x00,
+ 0x7f, 0x51, 0x02, 0xc9,
+ 0xde, 0x10, 0x1f, 0x1c, 0xee, 0xae, 0xfd, 0xfc, 0xfc, 0x10, 0x46, 0x22,
+ 0xd0, 0xde, 0x0f, 0x22,
+ 0x61, 0x00, 0xbd, 0x03, 0x13, 0x0a, 0xce, 0xe0, 0xfc, 0x00, 0x42, 0x01,
+ 0x00, 0xe0, 0xf0, 0xf1,
+ 0xe3, 0xff, 0xd8, 0xcf, 0xd0, 0xcf, 0xca, 0x10, 0x10, 0xd1, 0xb1, 0xfe,
+ 0xfc, 0x0f, 0xe0, 0x34,
+ 0x12, 0x9e, 0xca, 0xe0, 0x0f, 0x2f, 0xfe, 0xbe, 0xe0, 0x00, 0x0f, 0x12,
+ 0xe3, 0xcb, 0xff, 0x20,
+ 0xdb, 0x8e, 0x00, 0xf2, 0xde, 0xeb, 0x0e, 0x0d, 0xff, 0x0e, 0xef, 0xde,
+ 0x01, 0x50, 0x08, 0xbf,
+ 0x00, 0x1f, 0x0e, 0xef, 0xc1, 0x0d, 0xda, 0xdf, 0xe0, 0x0e, 0xcd, 0xb0,
+ 0x03, 0xfb, 0xec, 0xc0,
+ 0x01, 0xff, 0xf9, 0x10, 0x30, 0xe1, 0xce, 0x3e, 0x40, 0x00, 0x0f, 0x00,
+ 0x8c, 0xec, 0xf0, 0x0f,
+ 0xba, 0xdf, 0x10, 0x22, 0x0e, 0xec, 0x00, 0x0f, 0x1f, 0x40, 0x41, 0x02,
+ 0xe0, 0xcd, 0x0e, 0xdf,
+ 0xe0, 0x10, 0x33, 0x32, 0x2f, 0x43, 0x17, 0x0d, 0xca, 0x20, 0x71, 0x02,
+ 0xf0, 0x0e, 0xdc, 0xde,
+ 0x02, 0x34, 0x62, 0x24, 0xdc, 0xad, 0x27, 0x44, 0x00, 0xbe, 0xfe, 0x00,
+ 0x53, 0x01, 0xfc, 0xf0,
+ 0x02, 0x14, 0x14, 0x31, 0xff, 0x00, 0x32, 0x12, 0xd2, 0x04, 0x36, 0x01,
+ 0xf0, 0xf1, 0x40, 0x01,
+ 0xa0, 0xf0, 0x23, 0x75, 0x02, 0x01, 0xff, 0x0f, 0x54, 0x24, 0x00, 0xeb,
+ 0x00, 0x10, 0x34, 0x30,
+ 0x00, 0x20, 0x31, 0x10, 0xdb, 0xb0, 0xff, 0xd0, 0x0f, 0x32, 0xf0, 0xb9,
+ 0x1e, 0x10, 0x0f, 0xf0,
+ 0x71, 0x41, 0x1b, 0x1f, 0x00, 0x00, 0xee, 0xfe, 0xfe, 0x01, 0x10, 0x98,
+ 0xfc, 0x00, 0x01, 0xf0,
+ 0x0d, 0x1f, 0x3e, 0x2e, 0x0d, 0xc0, 0xe0, 0x8f, 0xec, 0x1f, 0x2f, 0x11,
+ 0xf4, 0x00, 0x1b, 0xee,
+ 0x11, 0x31, 0xad, 0xdc, 0xc3, 0xf1, 0xfc, 0xbb, 0x00, 0x02, 0xce, 0xfc,
+ 0x02, 0x04, 0xe3, 0x02,
+ 0xf0, 0x9f, 0xe2, 0x03, 0xde, 0xfe, 0x06, 0x42, 0xe0, 0xe2, 0xe2, 0x01,
+ 0x57, 0x07, 0xf0, 0x02,
+ 0x0f, 0xf0, 0xe0, 0x04, 0x01, 0x80, 0x00, 0x21, 0x23, 0x12, 0x23, 0x02,
+ 0x06, 0x31, 0x42, 0x21,
+ 0x11, 0xdf, 0x00, 0x53, 0x34, 0x23, 0x11, 0x7f, 0x70, 0x34, 0x01, 0xdf,
+ 0x0c, 0x41, 0x37, 0x24,
+ 0x0e, 0x0c, 0x21, 0x22, 0xc0, 0xde, 0x40, 0x32, 0x1f, 0x0d, 0x30, 0x42,
+ 0x11, 0x30, 0x60, 0x1f,
+ 0x38, 0x1f, 0x10, 0x04, 0x33, 0x51, 0x1e, 0x0d, 0xe0, 0x0b, 0x0f, 0x20,
+ 0x6e, 0x19, 0x00, 0x00,
+ 0xf0, 0xe1, 0x52, 0x67, 0x01, 0xff, 0x00, 0x30, 0x03, 0x02, 0x00, 0x1c,
+ 0x00, 0xd1, 0xf1, 0xee,
+ 0xee, 0x02, 0x27, 0x73, 0x22, 0xf1, 0xfe, 0x0e, 0x10, 0xb3, 0xa1, 0x02,
+ 0xe0, 0x01, 0x20, 0xdb,
+ 0xbf, 0xfe, 0x36, 0x33, 0x01, 0xc3, 0x01, 0x00, 0x14, 0x04, 0xbe, 0xd8,
+ 0x00, 0x30, 0x0f, 0xf1,
+ 0xf3, 0xe0, 0x72, 0x20, 0xca, 0xf1, 0x02, 0x02, 0xf0, 0xf0, 0xf0, 0xdf,
+ 0x20, 0x62, 0x12, 0x12,
+ 0x21, 0x0f, 0x08, 0x0d, 0x31, 0x77, 0x32, 0x0e, 0x0e, 0x40, 0x12, 0x00,
+ 0xe0, 0x30, 0x56, 0x00,
+ 0x20, 0xf0, 0x30, 0x32, 0xed, 0xf9, 0x30, 0x72, 0x64, 0x0f, 0x10, 0x20,
+ 0x43, 0x20, 0x00, 0x20,
+ 0x22, 0x17, 0x01, 0xee, 0x0e, 0x00, 0x4f, 0x2c, 0x50, 0x23, 0x02, 0x0d,
+ 0x30, 0x77, 0x22, 0x11,
+ 0x11, 0x32, 0x0f, 0x1e, 0xf0, 0xb0, 0x01, 0x31, 0x35, 0x41, 0x00, 0x06,
+ 0x34, 0x20, 0x0e, 0x51,
+ 0x44, 0x10, 0xff, 0x00, 0x26, 0x11, 0xd0, 0xef, 0x00, 0x52, 0x00, 0xf0,
+ 0x01, 0x33, 0x13, 0x10,
+ 0xf0, 0x92, 0xf1, 0x36, 0x52, 0x04, 0x10, 0x01, 0xf2, 0x22, 0x13, 0x14,
+ 0x0f, 0xe0, 0xf0, 0xd2,
+ 0xd2, 0x57, 0x17, 0xc0, 0xdf, 0xf2, 0x32, 0x61, 0x10, 0x0f, 0xf0, 0x02,
+ 0x12, 0xe1, 0xcd, 0x0e,
+ 0x50, 0x30, 0x43, 0x23, 0x10, 0xfe, 0x01, 0x77, 0x4f, 0xfd, 0xed, 0xaa,
+ 0xc9, 0xff, 0x10, 0x31,
+ 0xbe, 0xee, 0x1f, 0x4f, 0x20, 0x0e, 0x0d, 0x00, 0x25, 0xe0, 0xde, 0xfa,
+ 0xcd, 0xfc, 0xf0, 0xae,
+ 0xed, 0x0d, 0x20, 0x3f, 0x0a, 0xff, 0xfe, 0xce, 0xce, 0xf0, 0xed, 0xfc,
+ 0xcd, 0xdd, 0x0d, 0xfc,
+ 0x9d, 0xec, 0x0f, 0x1d, 0xfc, 0xc0, 0xe0, 0xdd, 0x0c, 0xfc, 0xdf, 0xa0,
+ 0xd0, 0xdc, 0xec, 0xdf,
+ 0xad, 0xfc, 0xe2, 0x00, 0xa8, 0xfe, 0x01, 0xe2, 0xde, 0xee, 0xff, 0xdf,
+ 0xd0, 0xf1, 0xfd, 0x9c,
+ 0xee, 0xf1, 0x01, 0xfd, 0xeb, 0xf0, 0xa0, 0xee, 0xed, 0x00, 0x13, 0xcc,
+ 0xcb, 0xf0, 0x05, 0xf0,
+ 0xcc, 0x00, 0x10, 0xf1, 0xdf, 0xcd, 0xde, 0x0e, 0xd0, 0xeb, 0xde, 0x42,
+ 0x45, 0x0e, 0xec, 0x00,
+ 0x0c, 0x50, 0x1f, 0x00, 0x9d, 0xfd, 0xec, 0xee, 0x0e, 0xec, 0xed, 0xce,
+ 0x00, 0x20, 0x4b, 0x10,
+ 0x0f, 0xf0, 0x00, 0x3b, 0x1d, 0xee, 0x8e, 0xcd, 0x11, 0x22, 0x00, 0x11,
+ 0x3c, 0xc8, 0xbd, 0x0d,
+ 0x1f, 0x10, 0x05, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0x2c, 0xde, 0xef, 0x26,
+ 0x02, 0xc0, 0x20, 0x72,
+ 0x34, 0xde, 0xdc, 0xff, 0xf4, 0xf3, 0x00, 0x3c, 0x40, 0x31, 0xe2, 0xc0,
+ 0xe0, 0x13, 0x01, 0x9f,
+ 0xfe, 0xf0, 0xa2, 0xe0, 0xda, 0x2e, 0x42, 0x37, 0xf1, 0x8e, 0xfc, 0x00,
+ 0x10, 0x0e, 0x0f, 0xd4,
+ 0xe1, 0x0d, 0x0f, 0x11, 0x01, 0xe0, 0xc2, 0x07, 0x40, 0xff, 0xce, 0xeb,
+ 0xed, 0x01, 0x06, 0xb0,
+ 0xdc, 0x00, 0x11, 0x70, 0x00, 0xd0, 0xf0, 0x42, 0x41, 0x11, 0x15, 0x00,
+ 0x1e, 0x0e, 0xde, 0x11,
+ 0x10, 0xfd, 0xa0, 0xf2, 0xe7, 0x02, 0x31, 0x3e, 0x2e, 0x11, 0x06, 0x10,
+ 0x3d, 0x3e, 0x73, 0x64,
+ 0xee, 0xd0, 0x07, 0x72, 0x00, 0x0f, 0x10, 0x01, 0x02, 0x00, 0x2d, 0x00,
+ 0x22, 0x13, 0x0a, 0x1c,
+ 0x0e, 0x43, 0x77, 0x33, 0x00, 0x2e, 0x21, 0x24, 0x21, 0x02, 0x0e, 0x10,
+ 0x66, 0x22, 0x30, 0x40,
+ 0x10, 0x21, 0x12, 0x44, 0x32, 0x52, 0x30, 0x42, 0x14, 0x04, 0x02, 0x02,
+ 0x0f, 0x51, 0x36, 0x10,
+ 0xf1, 0x13, 0x43, 0x30, 0x10, 0x23, 0x11, 0x31, 0x55, 0x34, 0x15, 0x22,
+ 0x70, 0x22, 0x25, 0x12,
+ 0x23, 0x31, 0x01, 0x21, 0x33, 0x36, 0x01, 0xe0, 0x41, 0x77, 0x21, 0x00,
+ 0xf1, 0x23, 0x41, 0x12,
+ 0x12, 0x41, 0x33, 0x31, 0x00, 0x10, 0x32, 0x53, 0x62, 0x15, 0x24, 0x02,
+ 0x02, 0x10, 0x12, 0x02,
+ 0xf4, 0x03, 0xe1, 0xbf, 0x09, 0x5e, 0x10, 0x00, 0x22, 0x13, 0x23, 0x34,
+ 0x4e, 0x1f, 0x14, 0x46,
+ 0x00, 0x00, 0xce, 0x0b, 0x0e, 0xe0, 0xd1, 0x2f, 0x3f, 0x1e, 0x3e, 0x6d,
+ 0x1e, 0x1f, 0xdd, 0xc0,
+ 0x43, 0x3d, 0x18, 0x0f, 0x80, 0x03, 0x0e, 0x5a, 0x0f, 0xdd, 0x0f, 0xf0,
+ 0xf2, 0xf1, 0x20, 0x4e,
+ 0x0c, 0xcb, 0xbd, 0xe0, 0x03, 0x04, 0xef, 0xfe, 0x0e, 0x54, 0x04, 0xee,
+ 0xb9, 0x00, 0x11, 0x01,
+ 0xbe, 0x00, 0x03, 0x12, 0x00, 0x01, 0xf1, 0x05, 0x11, 0x2f, 0x1f, 0x02,
+ 0xc0, 0xee, 0xce, 0xd4,
+ 0xf4, 0x00, 0x0e, 0x10, 0x77, 0x04, 0xd2, 0xd0, 0x10, 0x50, 0xf0, 0x80,
+ 0xee, 0xea, 0x10, 0x55,
+ 0x00, 0xfd, 0xff, 0x10, 0x12, 0x32, 0x21, 0x00, 0xfd, 0xc0, 0xe3, 0xef,
+ 0xe8, 0xee, 0x20, 0x3f,
+ 0xdd, 0x9c, 0x0f, 0x10, 0x53, 0x10, 0x20, 0xf8, 0xe0, 0x02, 0x01, 0x3d,
+ 0x0c, 0x00, 0xd1, 0x01,
+ 0x0e, 0xcb, 0xfe, 0x2e, 0x0e, 0x8e, 0x9a, 0x0f, 0x31, 0x12, 0xe0, 0xee,
+ 0x0d, 0x0f, 0x30, 0x00,
+ 0xf0, 0xff, 0x01, 0xfd, 0xab, 0xf0, 0x01, 0x2f, 0x08, 0xce, 0xe0, 0xf3,
+ 0xe0, 0x1e, 0x5f, 0x12,
+ 0xf5, 0xb0, 0xcb, 0xdd, 0xef, 0x00, 0x00, 0xbd, 0xff, 0xff, 0x02, 0xd0,
+ 0xda, 0xee, 0xf0, 0xef,
+ 0x00, 0x10, 0xbd, 0xbc, 0xee, 0xc9, 0xdf, 0xcf, 0xef, 0xce, 0x0f, 0x22,
+ 0x35, 0xe0, 0x90, 0xfb,
+ 0xfe, 0xff, 0xe0, 0xc0, 0xee, 0xbc, 0xfe, 0xfe, 0xfd, 0xed, 0x0f, 0x2d,
+ 0x00, 0x02, 0x1b, 0x0c,
+ 0xce, 0xe0, 0xd0, 0xdf, 0xd0, 0xcd, 0xa8, 0xdc, 0xe0, 0xf0, 0xdd, 0xee,
+ 0x1f, 0x3c, 0xef, 0xc1,
+ 0xe5, 0xce, 0xfa, 0x20, 0x50, 0xf0, 0xb0, 0xcf, 0xee, 0x0f, 0x60, 0x1f,
+ 0xfc, 0xce, 0xfe, 0x00,
+ 0x22, 0xea, 0xcb, 0x00, 0x00, 0x10, 0x01, 0x00, 0x1b, 0x00, 0x10, 0x10,
+ 0xbf, 0xff, 0x00, 0x0e,
+ 0x9d, 0x12, 0x35, 0x20, 0x00, 0x10, 0x00, 0x3e, 0x20, 0x04, 0x12, 0x10,
+ 0x0f, 0x00, 0x11, 0x0f,
+ 0xdb, 0xe0, 0xc5, 0x01, 0x11, 0xd0, 0x03, 0x74, 0x74, 0x02, 0x14, 0x00,
+ 0xfc, 0xce, 0x01, 0x17,
+ 0x50, 0x01, 0xf2, 0x42, 0x32, 0x01, 0xf2, 0xf2, 0x56, 0x53, 0x14, 0x00,
+ 0x00, 0xe5, 0xf2, 0xf1,
+ 0x00, 0x21, 0x13, 0x00, 0x01, 0x25, 0x75, 0x71, 0x31, 0x10, 0x12, 0x00,
+ 0x00, 0x0f, 0x13, 0x75,
+ 0x01, 0xf0, 0xf0, 0x01, 0x2f, 0x0c, 0x1e, 0x0e, 0x02, 0xf6, 0xc0, 0xfe,
+ 0x3c, 0x70, 0x55, 0x00,
+ 0xcd, 0x00, 0x10, 0x40, 0x0e, 0xed, 0x00, 0x00, 0x0e, 0x0a, 0x0e, 0xce,
+ 0xff, 0x0e, 0x31, 0x4f,
+ 0x0a, 0x0f, 0xee, 0xde, 0x0c, 0xfc, 0x00, 0x00, 0x0e, 0xfe, 0x0e, 0x8b,
+ 0xdf, 0x11, 0x71, 0x1f,
+ 0x00, 0xe1, 0x01, 0xe0, 0xfd, 0x08, 0x1f, 0xf1, 0x92, 0xdc, 0xed, 0xf0,
+ 0x01, 0x25, 0x22, 0x01,
+ 0xc0, 0xbd, 0xe2, 0xe3, 0x03, 0x03, 0x01, 0xed, 0xb0, 0x07, 0xf2, 0x14,
+ 0x40, 0xd1, 0xc5, 0x04,
+ 0x31, 0x20, 0xf1, 0x04, 0x03, 0xa0, 0xd0, 0xf1, 0x32, 0x23, 0xd4, 0xb4,
+ 0x15, 0x23, 0x03, 0xe0,
+ 0x11, 0x60, 0x20, 0x34, 0x00, 0x02, 0x27, 0x73, 0x2e, 0xfe, 0x00, 0x15,
+ 0x72, 0x20, 0x0e, 0xf0,
+ 0x03, 0x15, 0xfe, 0xfc, 0x1f, 0x60, 0x20, 0x12, 0x01, 0x10, 0x31, 0x2e,
+ 0x40, 0x23, 0x13, 0x1f,
+ 0x2b, 0x4f, 0x0c, 0x2f, 0x56, 0x23, 0x1e, 0x0d, 0x40, 0x1c, 0x20, 0x31,
+ 0xef, 0xfd, 0x71, 0x40,
+ 0xfb, 0xdc, 0x02, 0x36, 0x11, 0x20, 0x10, 0x1d, 0x41, 0x56, 0x01, 0x0d,
+ 0x0f, 0x0e, 0xf1, 0xf1,
+ 0x0f, 0x10, 0x36, 0x01, 0x21, 0x10, 0x3f, 0x11, 0xc0, 0x81, 0xc5, 0xc0,
+ 0xfa, 0xf0, 0x03, 0xef,
+ 0xe0, 0xff, 0xfe, 0xd0, 0x11, 0x10, 0x54, 0x22, 0xf0, 0x9b, 0xd0, 0xf2,
+ 0xef, 0x1b, 0x30, 0xe1,
+ 0xc3, 0x20, 0x5d, 0xff, 0xc1, 0xd7, 0xe1, 0xdc, 0xef, 0x61, 0x13, 0xdf,
+ 0xcd, 0x22, 0x62, 0x10,
+ 0x0b, 0xfe, 0x00, 0x15, 0x11, 0x4e, 0x20, 0x12, 0x04, 0xed, 0xbb, 0xe0,
+ 0x11, 0x64, 0x10, 0x10,
+ 0x20, 0x01, 0x10, 0x0e, 0x51, 0x00, 0x1d, 0x13, 0x17, 0x23, 0x40, 0x2f,
+ 0x10, 0x47, 0x23, 0x0f,
+ 0x1c, 0x30, 0x73, 0x31, 0xef, 0x0b, 0x00, 0x3f, 0x2e, 0x42, 0x05, 0xdf,
+ 0x1f, 0x71, 0x25, 0x10,
+ 0x13, 0x12, 0x1d, 0x0d, 0xf0, 0x46, 0x40, 0x01, 0xff, 0x11, 0x32, 0x32,
+ 0x43, 0x52, 0x31, 0x27,
+ 0x04, 0x10, 0x40, 0x01, 0x00, 0xf0, 0xf2, 0xe0, 0x00, 0x32, 0x02, 0xd0,
+ 0x77, 0x62, 0x10, 0xff,
+ 0xd1, 0x25, 0x31, 0x10, 0xe0, 0xd1, 0x07, 0x12, 0x50, 0x4e, 0x30, 0x13,
+ 0x00, 0xd0, 0xd3, 0x04,
+ 0x05, 0x32, 0xd1, 0x92, 0xc0, 0xf2, 0x01, 0x02, 0x46, 0x21, 0x01, 0x02,
+ 0x71, 0x43, 0x00, 0xe1,
+ 0x01, 0x10, 0x01, 0x25, 0x23, 0x00, 0xc1, 0x01, 0x00, 0xe9, 0xee, 0x3f,
+ 0x6a, 0xcd, 0xcf, 0xf0,
+ 0x03, 0x21, 0x1f, 0x3d, 0x0e, 0xdf, 0x40, 0x13, 0xe8, 0xed, 0x05, 0x05,
+ 0x4c, 0x00, 0x66, 0x00,
+ 0x33, 0x00, 0x99, 0xe9, 0xb8, 0xff, 0xf5, 0xe9, 0xdb, 0xac, 0xe0, 0xed,
+ 0xed, 0x1e, 0x4f, 0x1f,
+ 0xdf, 0xde, 0x0b, 0x2c, 0x0e, 0xad, 0xf0, 0x0d, 0xc9, 0xee, 0xef, 0xff,
+ 0xfe, 0xba, 0xef, 0xf0,
+ 0x10, 0xfe, 0x9e, 0x00, 0xf1, 0x0f, 0x0e, 0xcc, 0xbc, 0xed, 0xef, 0x00,
+ 0x0f, 0xde, 0xde, 0xbd,
+ 0xec, 0xee, 0xf0, 0xe2, 0xde, 0xb9, 0xdf, 0xef, 0xdf, 0xbf, 0xe0, 0xe0,
+ 0xea, 0xee, 0x0f, 0xdf,
+ 0xef, 0x00, 0xd3, 0xa0, 0xee, 0x11, 0x14, 0xae, 0xbc, 0xe0, 0xd0, 0x0f,
+ 0x03, 0x1c, 0xca, 0xe0,
+ 0xf1, 0xfe, 0xdb, 0x00, 0x12, 0x25, 0xe1, 0xaf, 0xfc, 0x00, 0x40, 0xf3,
+ 0xcd, 0xfa, 0x10, 0x02,
+ 0xff, 0xd9, 0xcf, 0xdf, 0xef, 0xff, 0xc0, 0xed, 0x0f, 0x60, 0x13, 0x00,
+ 0xf0, 0xf0, 0x1f, 0x0d,
+ 0xcc, 0x0e, 0x2e, 0xbc, 0xca, 0x0f, 0x40, 0x03, 0xfe, 0xd8, 0x20, 0x30,
+ 0x00, 0x0f, 0x3f, 0x01,
+ 0xe0, 0xd0, 0xd0, 0xff, 0x3f, 0xaf, 0x9a, 0xfe, 0x21, 0x76, 0x01, 0x00,
+ 0x00, 0xfe, 0xee, 0xff,
+ 0x24, 0x43, 0x0f, 0x2c, 0xf0, 0xad, 0xf0, 0x00, 0x16, 0x30, 0xee, 0xde,
+ 0xe2, 0xd3, 0xf0, 0xf2,
+ 0x21, 0xfc, 0x89, 0xef, 0x0f, 0x02, 0xd0, 0xff, 0x3e, 0x3f, 0x00, 0x9d,
+ 0xf0, 0x12, 0x32, 0x01,
+ 0xc2, 0xe5, 0xf0, 0xe0, 0x23, 0x0f, 0x98, 0xf0, 0xff, 0xed, 0xdf, 0x01,
+ 0x14, 0x3e, 0xec, 0xb1,
+ 0x10, 0x40, 0x10, 0x03, 0xcf, 0x17, 0x43, 0x20, 0x1f, 0x00, 0xe0, 0xc9,
+ 0xbf, 0xed, 0x00, 0x10,
+ 0x2e, 0x00, 0xe3, 0xe0, 0xfe, 0x02, 0x77, 0x56, 0x0e, 0x0d, 0xc0, 0x03,
+ 0x12, 0x20, 0x20, 0x20,
+ 0x20, 0x00, 0x12, 0x32, 0x52, 0x47, 0x13, 0x10, 0x0c, 0xee, 0xde, 0x2e,
+ 0x3d, 0x0e, 0x26, 0x74,
+ 0x71, 0x01, 0x0f, 0x0e, 0x40, 0x27, 0x01, 0xf0, 0x02, 0x32, 0x22, 0x2e,
+ 0x4e, 0x62, 0x17, 0x01,
+ 0x0f, 0x30, 0x57, 0x21, 0x11, 0x00, 0x03, 0x20, 0x20, 0x1d, 0x11, 0x26,
+ 0x31, 0x70, 0x21, 0xf0,
+ 0x03, 0x03, 0x40, 0x0f, 0x2f, 0x53, 0x27, 0x01, 0xfe, 0x32, 0x77, 0x22,
+ 0x0f, 0x01, 0x03, 0x30,
+ 0x13, 0x13, 0xf0, 0xe0, 0x23, 0x04, 0x04, 0x01, 0x01, 0x74, 0x44, 0x32,
+ 0x03, 0x33, 0x15, 0x11,
+ 0x31, 0x31, 0x43, 0x44, 0x12, 0x33, 0x12, 0x11, 0x04, 0x42, 0x42, 0x33,
+ 0x00, 0xcd, 0x24, 0x45,
+ 0x10, 0x10, 0x45, 0x20, 0x10, 0xdf, 0xbf, 0x00, 0x50, 0x37, 0x51, 0x00,
+ 0xf0, 0x0f, 0x2f, 0x00,
+ 0xdd, 0xfd, 0x01, 0x30, 0xee, 0xd8, 0x1d, 0x70, 0x60, 0x00, 0xfd, 0xe0,
+ 0x10, 0x29, 0xfd, 0x00,
+ 0x12, 0x21, 0xed, 0xdd, 0x0f, 0x2e, 0x3d, 0x0f, 0x00, 0x71, 0x55, 0x0e,
+ 0xe8, 0xad, 0x01, 0x03,
+ 0x1f, 0x0d, 0x10, 0x15, 0x00, 0xbe, 0xee, 0x00, 0x46, 0x00, 0xcc, 0xc0,
+ 0x0f, 0x02, 0x03, 0x01,
+ 0x00, 0xff, 0xfe, 0x0e, 0x42, 0x77, 0x01, 0x01, 0x00, 0xd2, 0x03, 0xf0,
+ 0xff, 0xdb, 0xd1, 0xf6,
+ 0xf1, 0xd0, 0x12, 0x73, 0x0f, 0xec, 0xd0, 0x04, 0x04, 0x00, 0x2f, 0x1f,
+ 0xe1, 0xd2, 0x33, 0x10,
+ 0x0e, 0x62, 0x34, 0x03, 0xd0, 0xae, 0x00, 0x62, 0x0a, 0xcb, 0x00, 0x0f,
+ 0xef, 0x0d, 0x12, 0x54,
+ 0x00, 0x0c, 0x01, 0x12, 0x20, 0x63, 0x0c, 0xee, 0x01, 0xf1, 0xff, 0x1e,
+ 0x3b, 0x2c, 0x10, 0x1e,
+ 0xea, 0x9e, 0x00, 0x32, 0x02, 0xfe, 0x0a, 0x0f, 0xaf, 0xf0, 0xf0, 0x31,
+ 0x1d, 0xcc, 0xd0, 0x13,
+ 0x43, 0x0d, 0x2b, 0x1f, 0xef, 0xe1, 0xf4, 0x0f, 0x8b, 0x00, 0x02, 0x11,
+ 0xc0, 0xde, 0xfd, 0x0b,
+ 0xfe, 0x8d, 0xe0, 0xf5, 0xe0, 0xde, 0xfd, 0xf3, 0xc0, 0xb8, 0xfd, 0xf0,
+ 0xe0, 0x10, 0x10, 0xec,
+ 0xb0, 0x00, 0xdd, 0xdd, 0xd0, 0xc0, 0x00, 0xe0, 0xe0, 0x8f, 0xfc, 0xfb,
+ 0x0c, 0xde, 0xff, 0xe0,
+ 0xde, 0xa8, 0xef, 0xed, 0xe0, 0x00, 0xed, 0xec, 0xe0, 0x00, 0x0e, 0xad,
+ 0xff, 0x04, 0x10, 0xbd,
+ 0xc8, 0xfe, 0xff, 0xf0, 0xe0, 0xdc, 0x0c, 0x0e, 0xdf, 0x02, 0xf1, 0x8d,
+ 0xec, 0xf0, 0x00, 0x0f,
+ 0x3e, 0xde, 0xbc, 0xff, 0x0d, 0xfe, 0xd9, 0x0e, 0x4f, 0x1f, 0x12, 0x00,
+ 0xeb, 0xdd, 0xe0, 0xc1,
+ 0x9c, 0xfc, 0x10, 0x10, 0x0d, 0x0c, 0x00, 0xb0, 0x00, 0x0c, 0xec, 0x0e,
+ 0x00, 0x07, 0x50, 0x30,
+ 0xd0, 0xdd, 0xfe, 0x0f, 0x52, 0x24, 0x10, 0x3e, 0x30, 0x01, 0x12, 0x1d,
+ 0x1d, 0x22, 0x07, 0xd0,
+ 0x8d, 0xc0, 0xf3, 0x17, 0x42, 0xef, 0xce, 0x1f, 0x61, 0x21, 0xde, 0xde,
+ 0x10, 0x57, 0x13, 0xf0,
+ 0xdc, 0x11, 0x75, 0x23, 0xf1, 0xe0, 0x01, 0x14, 0x02, 0xc0, 0x02, 0x13,
+ 0x10, 0xe0, 0xee, 0xf4,
+ 0x26, 0x73, 0x43, 0x22, 0x01, 0x01, 0x21, 0x22, 0x25, 0x02, 0xf3, 0x01,
+ 0xdb, 0x0d, 0x5f, 0x22,
+ 0xef, 0xec, 0x56, 0x22, 0xed, 0x2d, 0x71, 0x13, 0xff, 0xca, 0x00, 0x10,
+ 0x12, 0x0d, 0xee, 0x4d,
+ 0x40, 0x0e, 0x0f, 0xde, 0xfd, 0xfe, 0x20, 0xdd, 0xb8, 0x1f, 0x5e, 0x0a,
+ 0x1d, 0xf1, 0xc1, 0xcb,
+ 0xfe, 0x1e, 0x60, 0x00, 0xed, 0xcd, 0x0f, 0x2f, 0x20, 0xfb, 0xed, 0x1e,
+ 0x2f, 0xf2, 0xc4, 0xf0,
+ 0x3c, 0x60, 0xff, 0xad, 0xfb, 0xff, 0xf1, 0xf1, 0x01, 0x20, 0xe0, 0xc2,
+ 0xc0, 0xf0, 0xf3, 0x02,
+ 0xd2, 0xe6, 0xc0, 0xc0, 0x00, 0x22, 0x31, 0xde, 0xc7, 0x07, 0x52, 0x00,
+ 0x01, 0x24, 0x02, 0x03,
+ 0xe1, 0xc2, 0xc0, 0xde, 0xbd, 0xe0, 0x07, 0x25, 0x01, 0xd0, 0x30, 0x71,
+ 0x22, 0x01, 0x04, 0x24,
+ 0x12, 0x12, 0x1f, 0xef, 0xf0, 0x31, 0x22, 0x42, 0x75, 0x40, 0x01, 0x02,
+ 0x34, 0x52, 0x00, 0x2d,
+ 0x0b, 0x21, 0x02, 0x12, 0x41, 0x11, 0x30, 0x72, 0x77, 0x02, 0xeb, 0x0f,
+ 0x20, 0x13, 0x1e, 0x0f,
+ 0x21, 0x00, 0x0d, 0x02, 0x34, 0x1c, 0x3f, 0x64, 0x00, 0x1f, 0x1f, 0x1f,
+ 0x02, 0x03, 0xec, 0x0f,
+ 0x11, 0x0e, 0x0b, 0x72, 0x47, 0x00, 0xf1, 0x10, 0x40, 0x0d, 0xf1, 0xf2,
+ 0x0f, 0x01, 0x47, 0x20,
+ 0xfe, 0x01, 0x43, 0x15, 0x22, 0x00, 0x10, 0x01, 0xb1, 0xa2, 0xf0, 0xdf,
+ 0xfc, 0xed, 0x0a, 0xbf,
+ 0xf0, 0x03, 0x75, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11, 0xf4, 0xe4, 0x00,
+ 0xec, 0xee, 0x00, 0x44,
+ 0xe0, 0xe1, 0x54, 0x12, 0xd0, 0xcb, 0x12, 0x55, 0x10, 0x0f, 0xff, 0xf0,
+ 0x52, 0x11, 0x0e, 0xdc,
+ 0x74, 0x47, 0x01, 0xd0, 0x0e, 0x30, 0x13, 0x1f, 0x1f, 0x00, 0x02, 0x10,
+ 0x30, 0x1f, 0x75, 0x43,
+ 0x10, 0x0d, 0x03, 0x57, 0x12, 0x00, 0x30, 0x31, 0x02, 0x0f, 0x02, 0x67,
+ 0x30, 0x20, 0x22, 0x11,
+ 0x31, 0x55, 0x11, 0x00, 0xfa, 0x00, 0x22, 0x11, 0x00, 0x50, 0x41, 0x02,
+ 0x00, 0x11, 0x13, 0x52,
+ 0x22, 0x31, 0x02, 0x04, 0x00, 0xd1, 0x22, 0x11, 0x44, 0x77, 0x23, 0x22,
+ 0x11, 0x22, 0x33, 0x10,
+ 0x27, 0x06, 0xcf, 0xcf, 0x00, 0x1f, 0x41, 0x05, 0xd0, 0xdf, 0x70, 0x45,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x21, 0xe2, 0x00, 0x21, 0x42, 0x33, 0x00, 0xb0, 0x04, 0x01, 0x03, 0x31,
+ 0x07, 0x02, 0xc1, 0xb1,
+ 0xd0, 0xdd, 0xf0, 0x17, 0x42, 0x11, 0x33, 0x21, 0x43, 0x00, 0x10, 0x47,
+ 0x11, 0xe1, 0xc1, 0x01,
+ 0x32, 0x20, 0x9b, 0xf0, 0x00, 0x2f, 0xff, 0xde, 0xed, 0x00, 0x03, 0xa1,
+ 0x0c, 0x5b, 0x1f, 0x21,
+ 0xf1, 0x9c, 0xfb, 0x00, 0x2f, 0x00, 0x0d, 0xde, 0xfd, 0x0c, 0x0c, 0xef,
+ 0xae, 0xfb, 0x0e, 0x0e,
+ 0xfe, 0xee, 0xda, 0xfd, 0x0d, 0xbd, 0xef, 0x0d, 0x1b, 0x9c, 0xdf, 0x0d,
+ 0xfe, 0xba, 0xef, 0xfe,
+ 0xfd, 0xce, 0x0f, 0x10, 0x20, 0xa9, 0xef, 0x0f, 0xff, 0xff, 0xde, 0xbe,
+ 0xed, 0xfd, 0xee, 0xff,
+ 0xbf, 0xde, 0xe0, 0xef, 0xfa, 0xcd, 0xfd, 0xcd, 0xdd, 0xcf, 0xff, 0xfb,
+ 0xed, 0xbc, 0xfe, 0xee,
+ 0xf3, 0x04, 0x20, 0xcf, 0xdd, 0xde, 0xae, 0xdf, 0xc0, 0xfb, 0xdb, 0xff,
+ 0xce, 0xef, 0xe0, 0xf0,
+ 0xde, 0xeb, 0xff, 0xc0, 0xf2, 0xf5, 0xd2, 0x90, 0xfb, 0xdd, 0xfc, 0x00,
+ 0xe2, 0xf2, 0xee, 0xe9,
+ 0xf0, 0xee, 0xaf, 0xd0, 0xcf, 0x00, 0x1f, 0x0d, 0x8d, 0xfa, 0x02, 0x27,
+ 0x10, 0x1e, 0x0f, 0xe0,
+ 0xe0, 0xde, 0xbf, 0x00, 0x21, 0x10, 0xdd, 0xba, 0x10, 0x31, 0x0f, 0xbb,
+ 0x01, 0x04, 0x00, 0xfd,
+ 0x10, 0x30, 0x00, 0x9d, 0xeb, 0xfe, 0x01, 0x33, 0x10, 0x00, 0x4f, 0x2f,
+ 0xf1, 0xb1, 0x0f, 0xfb,
+ 0x30, 0x64, 0xfe, 0xb9, 0x00, 0x33, 0x00, 0xef, 0x00, 0x31, 0x01, 0x00,
+ 0xfd, 0x01, 0x06, 0x02,
+ 0xaf, 0xdb, 0xef, 0x0f, 0x2f, 0x0f, 0xed, 0x00, 0x20, 0x10, 0x3f, 0x21,
+ 0x03, 0xe0, 0x8b, 0x00,
+ 0x0e, 0xfd, 0x8c, 0x00, 0xf2, 0xee, 0xe0, 0x0f, 0x18, 0x3d, 0x02, 0xb0,
+ 0xfe, 0x03, 0x03, 0x30,
+ 0xfc, 0xba, 0x00, 0x15, 0x53, 0x10, 0xee, 0x00, 0x04, 0x61, 0x00, 0xde,
+ 0x00, 0xff, 0xdb, 0xfe,
+ 0x00, 0x14, 0x01, 0xf1, 0x32, 0x40, 0x32, 0x12, 0xe2, 0xd7, 0x23, 0x7e,
+ 0x2c, 0xde, 0x01, 0x77,
+ 0x41, 0x00, 0xe2, 0x22, 0x44, 0x43, 0x00, 0x0e, 0x10, 0x12, 0x01, 0xdc,
+ 0xfb, 0x01, 0x77, 0x31,
+ 0x0f, 0x30, 0x40, 0x12, 0x10, 0x22, 0x14, 0x62, 0x20, 0x0f, 0xf0, 0x00,
+ 0x34, 0x40, 0x3f, 0x32,
+ 0x15, 0x60, 0x34, 0x34, 0x13, 0x32, 0x40, 0x11, 0x0f, 0x00, 0x57, 0x01,
+ 0xec, 0x22, 0x76, 0x10,
+ 0x0f, 0x00, 0x23, 0x40, 0x10, 0x1f, 0x22, 0x34, 0x12, 0x10, 0x31, 0x63,
+ 0x03, 0x12, 0x34, 0x04,
+ 0x13, 0x36, 0x41, 0x01, 0x11, 0x01, 0x31, 0x02, 0x13, 0x56, 0x51, 0x21,
+ 0x35, 0x03, 0x20, 0x41,
+ 0x33, 0x42, 0x12, 0x12, 0x22, 0x11, 0x03, 0xf4, 0x11, 0x21, 0x53, 0x24,
+ 0x63, 0x42, 0x03, 0x12,
+ 0x04, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xca, 0xee, 0x21, 0x77, 0x60, 0x02,
+ 0x0f, 0x0f, 0x0f, 0x00,
+ 0x14, 0x11, 0x0e, 0xc8, 0x0e, 0x22, 0x00, 0xee, 0x0e, 0x4f, 0x50, 0x0f,
+ 0x0d, 0xfe, 0x10, 0x32,
+ 0x3c, 0x08, 0xff, 0xed, 0x80, 0xef, 0x00, 0x60, 0x10, 0x0a, 0x0e, 0x20,
+ 0x25, 0xdf, 0xcc, 0x00,
+ 0x30, 0xf0, 0xd0, 0xff, 0xe0, 0xff, 0x00, 0xe0, 0xcf, 0x1f, 0x71, 0x03,
+ 0xdd, 0xfd, 0x0f, 0x03,
+ 0x07, 0xe0, 0x0e, 0x40, 0x42, 0x02, 0xef, 0xe6, 0x15, 0xe0, 0xbf, 0x00,
+ 0xb0, 0xd0, 0xcc, 0x00,
+ 0x01, 0xc4, 0xe1, 0x01, 0xf5, 0xb0, 0x01, 0x11, 0x32, 0xf0, 0xc0, 0x04,
+ 0xd5, 0xb0, 0x0e, 0x10,
+ 0x10, 0xf0, 0xb0, 0xf2, 0x03, 0x00, 0x10, 0x0e, 0xd8, 0xfd, 0xdf, 0xce,
+ 0xd0, 0x00, 0x3e, 0x2b,
+ 0xd0, 0xc4, 0x61, 0x20, 0x2d, 0x1b, 0x0e, 0x30, 0x50, 0x10, 0xec, 0xce,
+ 0xfe, 0xfc, 0x0b, 0x70,
+ 0xf0, 0xcf, 0xec, 0x10, 0x62, 0x00, 0xdb, 0xfc, 0x0e, 0x0d, 0xe0, 0xac,
+ 0x0f, 0xf0, 0x34, 0x4f,
+ 0xeb, 0xdf, 0x0f, 0x00, 0x2f, 0xfc, 0xd0, 0x22, 0x02, 0xcf, 0xa9, 0xff,
+ 0x00, 0x00, 0x20, 0x9d,
+ 0xed, 0xd0, 0xf1, 0x10, 0x09, 0x8f, 0xef, 0xef, 0xed, 0xee, 0x11, 0x40,
+ 0xe9, 0xce, 0x00, 0x01,
+ 0x00, 0xdc, 0xce, 0xfe, 0xe0, 0xee, 0xf2, 0xb2, 0xdd, 0xea, 0xee, 0xdd,
+ 0xdf, 0x00, 0xbe, 0xa8,
+ 0xff, 0xf0, 0x00, 0xef, 0xed, 0xdf, 0xfc, 0xdf, 0xde, 0xcf, 0x00, 0x20,
+ 0x0f, 0xab, 0xef, 0xee,
+ 0xba, 0xef, 0xef, 0xfd, 0xee, 0xfe, 0xef, 0xde, 0xe1, 0x21, 0x1c, 0x0e,
+ 0xd3, 0xe0, 0xb8, 0xfd,
+ 0xdf, 0xc0, 0xc2, 0xfd, 0x19, 0x20, 0x10, 0x01, 0xe0, 0x8f, 0x0c, 0x20,
+ 0x53, 0xf1, 0xde, 0x1e,
+ 0x2f, 0xfc, 0xbc, 0x0e, 0x0d, 0x11, 0xd5, 0xcf, 0xfb, 0x2e, 0x6e, 0xff,
+ 0xe3, 0xf5, 0xf0, 0x0d,
+ 0x3f, 0x4e, 0xfe, 0xc0, 0x13, 0x22, 0x4f, 0x2e, 0x22, 0x14, 0x10, 0x1e,
+ 0x04, 0xf6, 0x90, 0xdc,
+ 0xef, 0x01, 0x16, 0x31, 0x31, 0x10, 0x0e, 0x0f, 0x9f, 0x02, 0x76, 0x32,
+ 0x0f, 0xde, 0x00, 0x52,
+ 0x07, 0xf1, 0xe0, 0x00, 0x32, 0x12, 0x02, 0xe0, 0x02, 0x23, 0xf2, 0x82,
+ 0xcf, 0x0f, 0x34, 0x77,
+ 0x07, 0x10, 0x02, 0x12, 0x21, 0x20, 0x01, 0x14, 0x00, 0xfe, 0xc0, 0x04,
+ 0x12, 0xe0, 0xef, 0x60,
+ 0x4e, 0x10, 0x03, 0x02, 0x36, 0x30, 0xe0, 0xe0, 0xe0, 0x0e, 0x0d, 0x1f,
+ 0x1b, 0xfe, 0x30, 0x12,
+ 0x9c, 0x40, 0x20, 0x43, 0x57, 0xdc, 0xdd, 0x00, 0x40, 0x02, 0xdc, 0xac,
+ 0x0f, 0x3f, 0x0f, 0xfc,
+ 0xdd, 0x02, 0x50, 0x08, 0x30, 0xf1, 0xe2, 0xfd, 0xda, 0x30, 0x33, 0x52,
+ 0x09, 0x3f, 0x00, 0x94,
+ 0x00, 0x1d, 0x7e, 0x60, 0xd2, 0xd0, 0xf0, 0x10, 0x03, 0x1f, 0x1b, 0xe0,
+ 0xc0, 0xf5, 0x20, 0x1d,
+ 0xff, 0xd3, 0x01, 0x1f, 0x9a, 0xf0, 0x03, 0x62, 0x10, 0xd0, 0xd0, 0x15,
+ 0x60, 0x1d, 0x00, 0xd4,
+ 0x02, 0x0f, 0xed, 0xf0, 0x05, 0x10, 0x2d, 0xa0, 0xe5, 0x03, 0x5f, 0x3e,
+ 0xf1, 0xd5, 0x00, 0x00,
+ 0x00, 0x11, 0x02, 0xf0, 0x0e, 0x06, 0x01, 0x3e, 0x2d, 0x20, 0x02, 0xf3,
+ 0x06, 0x74, 0x3f, 0x0d,
+ 0xdf, 0x2f, 0x2f, 0x0e, 0xc4, 0x13, 0x70, 0x7b, 0x30, 0x91, 0x00, 0x20,
+ 0x1d, 0x00, 0x05, 0xf5,
+ 0x0f, 0x1c, 0x00, 0x01, 0x23, 0x00, 0xbf, 0xff, 0x23, 0x23, 0x00, 0xaf,
+ 0x0f, 0x02, 0x20, 0x1d,
+ 0xff, 0x16, 0x72, 0x2f, 0x09, 0xd0, 0xe2, 0x30, 0x6f, 0x0f, 0x04, 0xe3,
+ 0xdb, 0x0f, 0x30, 0x25,
+ 0x10, 0x00, 0x0f, 0x30, 0x03, 0xe1, 0xdf, 0x2e, 0x70, 0x10, 0x0f, 0x0e,
+ 0xbe, 0xf0, 0xff, 0x2a,
+ 0x2e, 0xee, 0xbf, 0x0e, 0x10, 0x27, 0xe2, 0xff, 0x2d, 0x6e, 0x0f, 0xe0,
+ 0x0d, 0x0b, 0x01, 0xe6,
+ 0xcf, 0xec, 0x00, 0x00, 0xe5, 0x01, 0x71, 0x0f, 0xde, 0xd0, 0x00, 0x0f,
+ 0x3c, 0xff, 0xc0, 0x23,
+ 0x00, 0xe0, 0x34, 0x14, 0x0e, 0x09, 0x00, 0xef, 0x70, 0xf5, 0xa0, 0xff,
+ 0x0f, 0x11, 0x00, 0x00,
+ 0x1d, 0x4f, 0x54, 0x17, 0xb1, 0xfe, 0x2e, 0x4f, 0x30, 0x00, 0xb5, 0x03,
+ 0x00, 0x5e, 0x10, 0xf1,
+ 0xf1, 0x01, 0x0e, 0x50, 0x02, 0xf1, 0xfe, 0x21, 0x56, 0x00, 0xc1, 0x10,
+ 0x21, 0x54, 0x04, 0xdf,
+ 0xdc, 0xf0, 0x01, 0x14, 0x23, 0x22, 0x00, 0xce, 0x00, 0x23, 0x52, 0x12,
+ 0x13, 0x50, 0x2c, 0x09,
+ 0xef, 0xed, 0x0e, 0x00, 0x35, 0x04, 0xbf, 0x0d, 0x14, 0x04, 0x0f, 0x0c,
+ 0x30, 0x62, 0x00, 0xff,
+ 0x1d, 0x30, 0x01, 0x14, 0x00, 0x1d, 0x00, 0xc0, 0xcf, 0x00, 0x27, 0x34,
+ 0xbd, 0xbf, 0x00, 0x05,
+ 0x10, 0x4e, 0x00, 0x00, 0xc2, 0xe1, 0x00, 0x03, 0x36, 0x1f, 0x1b, 0x10,
+ 0x05, 0xd5, 0xa1, 0x00,
+ 0xe0, 0x0e, 0x50, 0xf1, 0xc0, 0xff, 0x00, 0x45, 0x32, 0xdf, 0xbd, 0x0e,
+ 0x4f, 0x20, 0xe6, 0xb4,
+ 0x00, 0x1e, 0x3d, 0x0f, 0xc0, 0xee, 0x01, 0x43, 0x14, 0xd0, 0xd9, 0xf0,
+ 0x2f, 0x10, 0xff, 0xc0,
+ 0xff, 0x20, 0x6f, 0x10, 0xf0, 0xba, 0xff, 0x0f, 0x30, 0x40, 0xf0, 0xad,
+ 0x0c, 0x00, 0x0f, 0x0d,
+ 0x2e, 0x1e, 0x41, 0x00, 0xf8, 0xbf, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0xf0,
+ 0xbe, 0xfc, 0xd1, 0x04,
+ 0x0f, 0x2c, 0x20, 0x21, 0x1e, 0x09, 0xde, 0xef, 0x20, 0x7f, 0xfd, 0xdc,
+ 0xee, 0x00, 0x02, 0xd5,
+ 0xf0, 0xcf, 0x00, 0x00, 0x30, 0x4d, 0x00, 0xd1, 0x8f, 0xec, 0xf0, 0x00,
+ 0x07, 0x20, 0x1c, 0xbe,
+ 0xef, 0x02, 0xe7, 0xf3, 0xcf, 0x1d, 0x4e, 0x00, 0xb1, 0xc0, 0x05, 0x05,
+ 0xd9, 0x00, 0x44, 0x00,
+ 0xc7, 0xb6, 0x33, 0x02, 0x94, 0xba, 0x1c, 0x00, 0x12, 0xd1, 0x88, 0xe8,
+ 0x0e, 0x60, 0x13, 0xf5,
+ 0xc4, 0xf0, 0x0f, 0x2e, 0x1f, 0xe2, 0xe1, 0x01, 0x04, 0x03, 0xf0, 0xeb,
+ 0x1e, 0x70, 0x32, 0xe3,
+ 0xd0, 0xe1, 0x01, 0x02, 0x43, 0x1d, 0xcb, 0xef, 0x1e, 0x33, 0x65, 0xf3,
+ 0xc0, 0x0e, 0x0c, 0x1f,
+ 0x0e, 0x00, 0x0f, 0x2c, 0xff, 0xd0, 0xd3, 0x0f, 0x6c, 0x40, 0x31, 0x09,
+ 0xcd, 0xc0, 0x01, 0x06,
+ 0x20, 0x4d, 0x2e, 0x10, 0xfe, 0x0d, 0xef, 0x00, 0x41, 0x32, 0x21, 0x0c,
+ 0xac, 0xfd, 0xd0, 0xf3,
+ 0xd1, 0xe0, 0xe2, 0x03, 0xfe, 0x18, 0x5d, 0x52, 0x23, 0x0f, 0xe8, 0x0d,
+ 0x4e, 0x40, 0x01, 0xed,
+ 0xca, 0x0f, 0xf1, 0xe7, 0xe0, 0x10, 0x3e, 0x6f, 0x10, 0xc1, 0xa1, 0x01,
+ 0x10, 0x3d, 0x30, 0xc1,
+ 0xe0, 0x1c, 0x50, 0x04, 0xe3, 0xd1, 0x00, 0x0d, 0x40, 0x10, 0xf0, 0xc4,
+ 0xf5, 0x03, 0x00, 0xfb,
+ 0xee, 0xfd, 0x0f, 0x52, 0x06, 0xb1, 0xf0, 0x0f, 0x60, 0x11, 0x03, 0xc7,
+ 0x00, 0x02, 0x21, 0x01,
+ 0x00, 0xf0, 0xf2, 0x01, 0x30, 0x30, 0x30, 0x31, 0x12, 0xe3, 0xd3, 0xf2,
+ 0x51, 0x32, 0x7f, 0x2d,
+ 0x00, 0xb5, 0x07, 0x05, 0x02, 0x30, 0x3e, 0x30, 0xff, 0xcf, 0xeb, 0x00,
+ 0x00, 0x64, 0x34, 0x3f,
+ 0x0d, 0x0e, 0xf1, 0x01, 0x20, 0x00, 0x07, 0x41, 0x1f, 0x0b, 0x0e, 0x50,
+ 0x20, 0x12, 0x31, 0x0e,
+ 0x2b, 0x70, 0x71, 0x01, 0xe0, 0xff, 0x0f, 0xf1, 0x07, 0xc2, 0xf1, 0x0e,
+ 0x3f, 0xf1, 0xc5, 0xe2,
+ 0x10, 0x70, 0x4f, 0xfe, 0xfc, 0xed, 0x1e, 0x33, 0x06, 0x01, 0xf1, 0x00,
+ 0x20, 0x22, 0x13, 0xd0,
+ 0xe7, 0xe3, 0x21, 0x70, 0x0e, 0xce, 0x00, 0x31, 0x36, 0x02, 0xa2, 0x0d,
+ 0x1e, 0x20, 0x31, 0xf2,
+ 0xc4, 0xf0, 0x0e, 0x11, 0x42, 0x02, 0xbd, 0xec, 0xee, 0x01, 0x04, 0x1f,
+ 0x0f, 0x10, 0x0f, 0x0b,
+ 0xe0, 0xf5, 0x74, 0x42, 0x10, 0xd0, 0xc1, 0x05, 0x02, 0x12, 0x3f, 0x3e,
+ 0x40, 0x0e, 0xa0, 0x02,
+ 0x07, 0x21, 0x3f, 0x6b, 0x0e, 0x0e, 0x00, 0xf4, 0x01, 0x14, 0x41, 0x12,
+ 0x10, 0xfc, 0xcd, 0x0e,
+ 0xf2, 0x15, 0x12, 0xef, 0xdb, 0x0f, 0x7e, 0x20, 0x01, 0xd0, 0x0f, 0x5c,
+ 0x13, 0xf4, 0xc0, 0x0a,
+ 0x1e, 0x2e, 0x00, 0xb1, 0xf3, 0x01, 0x3f, 0x6b, 0x0e, 0xdd, 0xed, 0xf0,
+ 0x13, 0x33, 0xd1, 0xcc,
+ 0xdd, 0xe0, 0xde, 0xc1, 0xb7, 0xf7, 0xe0, 0x22, 0x40, 0xcd, 0xee, 0x0f,
+ 0x2d, 0x20, 0x00, 0xf2,
+ 0xec, 0x3c, 0x50, 0x2f, 0xf1, 0xb4, 0xe1, 0x01, 0x20, 0x2d, 0x0e, 0xe0,
+ 0xb5, 0x01, 0x00, 0x3e,
+ 0x10, 0x24, 0xf0, 0xde, 0xd0, 0x00, 0x30, 0x65, 0x64, 0x00, 0x0f, 0xc0,
+ 0xf4, 0x07, 0x20, 0x3e,
+ 0x00, 0xd0, 0xff, 0xb0, 0xf0, 0xf0, 0x11, 0x72, 0x2b, 0x0e, 0x00, 0xd6,
+ 0x04, 0x11, 0x01, 0x31,
+ 0x40, 0x20, 0xd1, 0xa0, 0x0f, 0x23, 0x47, 0x17, 0xd0, 0x0f, 0x1d, 0x70,
+ 0x00, 0xf3, 0xf2, 0x10,
+ 0x2f, 0x10, 0x03, 0xe0, 0x0e, 0x1f, 0x2f, 0xd1, 0x92, 0xf2, 0xe3, 0x2f,
+ 0x68, 0x0d, 0xde, 0xec,
+ 0x00, 0x40, 0x34, 0xd0, 0xd9, 0xff, 0x0f, 0x0e, 0xe0, 0xdd, 0xf0, 0x00,
+ 0x01, 0x1d, 0xda, 0xce,
+ 0x00, 0x7e, 0x2f, 0x00, 0xcf, 0xda, 0xfe, 0x0f, 0x0e, 0xc1, 0x82, 0xe0,
+ 0xfe, 0xee, 0x00, 0xe0,
+ 0xd1, 0xf2, 0xe0, 0x08, 0x2e, 0x3b, 0x0f, 0xe0, 0xfd, 0x00, 0x3f, 0x30,
+ 0x22, 0x5e, 0x09, 0x8f,
+ 0xd0, 0xe3, 0x00, 0x10, 0x00, 0x4e, 0x0f, 0xbe, 0xee, 0xe0, 0x05, 0x31,
+ 0x30, 0x2b, 0xcf, 0xe0,
+ 0xe1, 0xf5, 0xd0, 0x00, 0x7e, 0x5f, 0xe1, 0xc2, 0xfe, 0xfd, 0x0f, 0x02,
+ 0x07, 0xce, 0x0c, 0x2e,
+ 0x30, 0x00, 0x07, 0x03, 0x0f, 0x5f, 0x00, 0x03, 0xf0, 0xe1, 0x41, 0x54,
+ 0x01, 0xb0, 0xf4, 0x02,
+ 0x41, 0x30, 0x0c, 0xf0, 0xe2, 0x13, 0x64, 0x22, 0x12, 0x02, 0x00, 0x00,
+ 0x46, 0x03, 0x03, 0xc0,
+ 0xf0, 0x00, 0x00, 0x10, 0xff, 0xef, 0x2e, 0x77, 0x14, 0xef, 0xea, 0x00,
+ 0x60, 0x12, 0x01, 0xd2,
+ 0x00, 0x0d, 0x0c, 0x0c, 0x00, 0xe4, 0x05, 0x02, 0x5c, 0x1d, 0x2f, 0x20,
+ 0x0e, 0xed, 0xd0, 0x02,
+ 0x3e, 0x3d, 0x1e, 0xae, 0x8f, 0xe3, 0xe7, 0xf4, 0xe1, 0x0f, 0x0d, 0x0c,
+ 0xac, 0xf0, 0xfd, 0x10,
+ 0x60, 0x00, 0x0a, 0x0e, 0x0f, 0x0f, 0xe1, 0xf2, 0x0e, 0x5b, 0x2f, 0xf1,
+ 0xb3, 0xfe, 0x0a, 0x00,
+ 0x12, 0x10, 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0x05, 0x02, 0x7d, 0x2c, 0x20,
+ 0xff, 0xc4, 0x04, 0x12,
+ 0x2e, 0xfe, 0xbd, 0xd0, 0xfc, 0x00, 0x20, 0x0f, 0xec, 0xc0, 0x06, 0x31,
+ 0x70, 0x00, 0xee, 0x00,
+ 0x04, 0x27, 0x12, 0xd0, 0xf0, 0x00, 0x32, 0x11, 0x03, 0xd2, 0x21, 0x45,
+ 0x62, 0x30, 0xfe, 0x00,
+ 0x10, 0x73, 0x66, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x1f, 0x04, 0xf5, 0x02,
+ 0x32, 0x00, 0xfe, 0x00,
+ 0x20, 0x11, 0xe2, 0xe2, 0x52, 0x60, 0x1d, 0x00, 0xff, 0x00, 0x00, 0x03,
+ 0xd4, 0x12, 0x70, 0x2c,
+ 0x0c, 0xee, 0x0d, 0x5d, 0x32, 0x2f, 0xf8, 0x08, 0x19, 0x10, 0xf2, 0xa1,
+ 0x01, 0x00, 0x0d, 0xf0,
+ 0xb3, 0xb0, 0xe0, 0x00, 0x0f, 0x51, 0x00, 0xfd, 0xfd, 0x0b, 0x00, 0x2f,
+ 0x00, 0x0f, 0x5f, 0x1d,
+ 0x0b, 0xef, 0xd0, 0x17, 0x32, 0x40, 0x0e, 0xef, 0xc0, 0x00, 0x11, 0x20,
+ 0x00, 0xa0, 0xf0, 0x02,
+ 0x30, 0x61, 0x00, 0x0d, 0x07, 0x07, 0x02, 0x01, 0xdf, 0xdd, 0xfe, 0x00,
+ 0x00, 0xde, 0xbf, 0xe0,
+ 0x15, 0x41, 0x30, 0xf0, 0xb0, 0x00, 0x3f, 0x22, 0xe7, 0xd6, 0xe0, 0x00,
+ 0x1e, 0x10, 0x22, 0x75,
+ 0x11, 0xd1, 0xf0, 0x30, 0x41, 0x20, 0x1f, 0x22, 0x74, 0x31, 0x1f, 0x20,
+ 0x31, 0x30, 0x07, 0xe3,
+ 0x02, 0x00, 0x3c, 0x30, 0xf3, 0x80, 0xd2, 0xf1, 0x01, 0x23, 0x50, 0x4a,
+ 0x1c, 0x0f, 0x11, 0x05,
+ 0x02, 0x00, 0x3e, 0x7c, 0x30, 0xb0, 0xd1, 0xe3, 0x03, 0x72, 0x20, 0x1f,
+ 0x0b, 0xfc, 0x0c, 0x1f,
+ 0x3e, 0x00, 0x23, 0x25, 0x0f, 0xeb, 0xb0, 0xb1, 0xe5, 0x00, 0x00, 0x20,
+ 0xc1, 0xd0, 0xee, 0x00,
+ 0x50, 0x10, 0xee, 0xfd, 0x1e, 0x30, 0x41, 0x0d, 0x0d, 0xf0, 0x17, 0x32,
+ 0x51, 0x00, 0x00, 0x00,
+ 0x2f, 0x1f, 0xf2, 0x85, 0xf0, 0x0b, 0x2e, 0x30, 0x10, 0x01, 0x20, 0x72,
+ 0x06, 0x14, 0x03, 0x11,
+ 0x01, 0xd0, 0x0f, 0x0a, 0x10, 0xf3, 0xc0, 0xfd, 0xff, 0x10, 0x24, 0x01,
+ 0x54, 0x10, 0x01, 0xdf,
+ 0xee, 0x00, 0x36, 0x17, 0xe2, 0xf0, 0x00, 0x70, 0x30, 0x05, 0x80, 0xf2,
+ 0x03, 0x00, 0x32, 0x4f,
+ 0x0f, 0xdd, 0x00, 0x42, 0x17, 0x06, 0x30, 0x7e, 0x2f, 0xf0, 0xd0, 0xd1,
+ 0xe2, 0xe1, 0x31, 0x5e,
+ 0xef, 0xc0, 0xed, 0xf0, 0x00, 0x40, 0x10, 0x00, 0xeb, 0x0b, 0x0e, 0xae,
+ 0xe0, 0xef, 0x20, 0x33,
+ 0x20, 0x98, 0xde, 0x0e, 0x00, 0x4d, 0x5c, 0xfb, 0xfe, 0xff, 0x0d, 0x1f,
+ 0x0e, 0x0e, 0xcd, 0xf0,
+ 0x0e, 0xcf, 0xef, 0xc1, 0xfd, 0xf9, 0xe0, 0xdf, 0xde, 0xfd, 0xf9, 0x0e,
+ 0xff, 0xee, 0x00, 0xdc,
+ 0xee, 0x2d, 0x70, 0x71, 0x00, 0xdf, 0x0d, 0x10, 0x01, 0x00, 0xbe, 0xfb,
+ 0xeb, 0xff, 0xfd, 0xef,
+ 0x1f, 0x20, 0x10, 0x03, 0xf0, 0xea, 0x00, 0x13, 0xf7, 0x91, 0xef, 0xec,
+ 0xce, 0x00, 0x00, 0x91,
+ 0xe0, 0x00, 0x01, 0x20, 0x20, 0xdd, 0x9e, 0x00, 0xf4, 0xf7, 0xe3, 0x0f,
+ 0x2f, 0x6e, 0x00, 0xc2,
+ 0xe5, 0xf5, 0x02, 0x20, 0x2f, 0x1f, 0xd1, 0xb1, 0x01, 0x10, 0x35, 0x22,
+ 0x10, 0x2f, 0x4f, 0x11,
+ 0xf3, 0xf2, 0x05, 0x44, 0x31, 0x0e, 0x9c, 0xd0, 0xc0, 0x14, 0x54, 0x20,
+ 0x00, 0xdf, 0x0f, 0x0d,
+ 0x0f, 0x0e, 0x20, 0x2b, 0x0d, 0xde, 0xe1, 0xd6, 0xd1, 0xee, 0x2d, 0x71,
+ 0x43, 0x2f, 0x08, 0x1e,
+ 0x4d, 0x3f, 0x1f, 0x0e, 0xfe, 0xfe, 0x2f, 0x3f, 0x03, 0x84, 0xdf, 0xcf,
+ 0x02, 0xd7, 0xf1, 0xff,
+ 0xec, 0xce, 0xff, 0xef, 0xee, 0x2d, 0x30, 0x0f, 0xbd, 0x08, 0x1d, 0x60,
+ 0x40, 0x16, 0x01, 0xde,
+ 0xff, 0x1e, 0x10, 0xd0, 0x90, 0xf0, 0xfc, 0x1f, 0x3f, 0x1f, 0x00, 0x0f,
+ 0x05, 0x55, 0x01, 0x00,
+ 0x10, 0x10, 0x2e, 0xf0, 0xa4, 0xd5, 0xc1, 0x00, 0x4b, 0x40, 0x0f, 0xb0,
+ 0xe1, 0x03, 0x02, 0x20,
+ 0x1b, 0x1e, 0x10, 0x13, 0x02, 0xf2, 0xd4, 0x37, 0x51, 0x30, 0x0d, 0x90,
+ 0xf2, 0xd1, 0x11, 0x66,
+ 0x33, 0x00, 0xfd, 0xe0, 0x23, 0x54, 0x22, 0x21, 0x43, 0x00, 0xf2, 0xe0,
+ 0x00, 0x10, 0x00, 0x04,
+ 0x42, 0x06, 0x04, 0xf3, 0x00, 0x3e, 0x50, 0x30, 0x02, 0x0c, 0x1c, 0x1f,
+ 0x42, 0x04, 0x00, 0xd1,
+ 0x01, 0x02, 0x01, 0x43, 0x31, 0x50, 0x0f, 0x59, 0x2d, 0x3a, 0x3f, 0x7f,
+ 0x10, 0x0e, 0x0d, 0x1f,
+ 0x3f, 0x06, 0x06, 0xf1, 0x9f, 0xff, 0x00, 0x01, 0xf2, 0xb2, 0xf0, 0xff,
+ 0x0e, 0x0f, 0x00, 0xdf,
+ 0x00, 0x30, 0x62, 0x21, 0x02, 0x00, 0x5f, 0x24, 0x07, 0xc7, 0xf3, 0x00,
+ 0x2f, 0x3e, 0x2f, 0xf0,
+ 0x93, 0xe2, 0x04, 0x25, 0x40, 0x2f, 0x0f, 0x00, 0x06, 0x01, 0x02, 0xf3,
+ 0x10, 0x52, 0x3f, 0x0c,
+ 0xb0, 0xde, 0xe1, 0x03, 0x23, 0x00, 0x0d, 0xa8, 0xf0, 0xff, 0x10, 0x73,
+ 0x24, 0x01, 0xd0, 0x0d,
+ 0xf1, 0x05, 0x02, 0x1f, 0x0e, 0x21, 0xe2, 0xb4, 0xf0, 0xf0, 0x4f, 0x40,
+ 0x32, 0x12, 0x12, 0x12,
+ 0x33, 0x21, 0x23, 0x1e, 0x38, 0x1c, 0x30, 0x12, 0x03, 0xc3, 0x06, 0x12,
+ 0x72, 0x00, 0xcb, 0x0e,
+ 0x5f, 0x1e, 0xff, 0xcd, 0x0d, 0x0f, 0x20, 0x17, 0xe0, 0xcd, 0xe0, 0x0f,
+ 0x21, 0xf5, 0xb1, 0x00,
+ 0x38, 0x7f, 0x3e, 0x0f, 0xfe, 0x00, 0x2f, 0x2f, 0x00, 0x00, 0xbc, 0xe0,
+ 0xf0, 0xf1, 0xb4, 0xe2,
+ 0xb3, 0x0f, 0x0d, 0xfd, 0xdc, 0x92, 0xf4, 0xf1, 0x0e, 0x4a, 0x0e, 0xde,
+ 0xf0, 0x10, 0x00, 0x06,
+ 0x02, 0x10, 0x4d, 0x10, 0x0e, 0xa0, 0xe0, 0xfd, 0xef, 0x31, 0x32, 0x2c,
+ 0xcc, 0xce, 0x00, 0x27,
+ 0x62, 0x03, 0x0d, 0xeb, 0x00, 0xf3, 0x13, 0x44, 0x10, 0x0a, 0xe0, 0xaf,
+ 0xe0, 0x00, 0xef, 0x10,
+ 0x40, 0x2e, 0x0f, 0xcf, 0xef, 0x00, 0x20, 0x01, 0xe1, 0x00, 0x3f, 0xe0,
+ 0x8c, 0xe9, 0xf0, 0x02,
+ 0x02, 0x0e, 0x0e, 0x23, 0x57, 0x11, 0x02, 0xf1, 0xf0, 0x10, 0x6e, 0x3d,
+ 0x03, 0x16, 0xee, 0xdb,
+ 0x00, 0x00, 0x07, 0xd4, 0xd0, 0x0e, 0x1e, 0x70, 0x00, 0xbf, 0x00, 0x00,
+ 0x0f, 0x1c, 0xfd, 0xcf,
+ 0xe0, 0xff, 0x00, 0xc5, 0xa3, 0xd0, 0xfd, 0x19, 0x5e, 0x0f, 0xcd, 0x0f,
+ 0x3d, 0x3d, 0x2d, 0x0c,
+ 0xec, 0xde, 0x00, 0xd0, 0xf1, 0xed, 0x0c, 0x00, 0xa3, 0xe0, 0x80, 0xe0,
+ 0xe4, 0xfc, 0x09, 0x00,
+ 0xfe, 0xcd, 0xcc, 0x00, 0x10, 0x41, 0x10, 0x1b, 0x0e, 0xd0, 0x00, 0x05,
+ 0x42, 0x00, 0xec, 0xfd,
+ 0xde, 0xd0, 0xd0, 0x0f, 0x3d, 0x71, 0x63, 0xe0, 0xf0, 0x01, 0x00, 0x22,
+ 0x33, 0x27, 0x02, 0x01,
+ 0xf0, 0xb0, 0xec, 0xfe, 0xed, 0x00, 0x0f, 0xec, 0xce, 0x0d, 0x4b, 0x0f,
+ 0xe0, 0xc0, 0x00, 0x70,
+ 0x43, 0x07, 0xe6, 0xe0, 0xee, 0x00, 0x00, 0xf2, 0xf4, 0x00, 0x00, 0x10,
+ 0x40, 0x06, 0xe4, 0x02,
+ 0x71, 0x7f, 0x2e, 0x0f, 0xe1, 0x01, 0x44, 0x33, 0x04, 0xd4, 0x01, 0x01,
+ 0x21, 0x22, 0x02, 0xd3,
+ 0x06, 0x32, 0x4e, 0x4c, 0x1f, 0x00, 0x0f, 0xe2, 0x36, 0x23, 0x00, 0x8e,
+ 0x00, 0xe3, 0xe4, 0xe2,
+ 0xe3, 0x50, 0x5f, 0x3d, 0x41, 0x0f, 0xdc, 0x00, 0x0e, 0x4f, 0x2b, 0x40,
+ 0x09, 0xde, 0xef, 0x02,
+ 0x07, 0x14, 0x10, 0xfe, 0xa0, 0xe0, 0xbf, 0xe0, 0xf0, 0xf0, 0x1f, 0x0e,
+ 0xfb, 0xc0, 0x0e, 0x10,
+ 0x30, 0x71, 0x14, 0x11, 0xe0, 0xde, 0x00, 0xfc, 0x0d, 0x0c, 0x2e, 0x0e,
+ 0x88, 0xd0, 0x0e, 0x00,
+ 0x00, 0x11, 0x22, 0x3f, 0x0d, 0x1e, 0x22, 0xd5, 0x8f, 0xea, 0xff, 0x10,
+ 0x51, 0xff, 0xdd, 0x02,
+ 0x01, 0x0c, 0xee, 0xf1, 0x03, 0x0e, 0x38, 0x0d, 0x90, 0x03, 0x05, 0x20,
+ 0x0f, 0xdf, 0xf1, 0xcf,
+ 0xde, 0xff, 0x22, 0x15, 0x81, 0xd3, 0x00, 0x41, 0x50, 0x0e, 0x00, 0xf5,
+ 0x13, 0x22, 0x12, 0x11,
+ 0x1f, 0x0d, 0xfe, 0xf7, 0x07, 0xf1, 0x22, 0x70, 0x10, 0x31, 0x01, 0x00,
+ 0xde, 0x12, 0x75, 0x20,
+ 0x0e, 0xf0, 0xe0, 0xd1, 0xc3, 0xf6, 0x01, 0x31, 0x3f, 0x1e, 0xe0, 0xf0,
+ 0x53, 0x51, 0x1e, 0x5e,
+ 0x2f, 0xf8, 0xec, 0x00, 0x40, 0x00, 0x0e, 0x10, 0x54, 0x01, 0xcf, 0x01,
+ 0x06, 0x01, 0x00, 0xfe,
+ 0xe1, 0x9f, 0xeb, 0x0e, 0xf0, 0x1f, 0x40, 0x02, 0x00, 0xff, 0x20, 0x21,
+ 0xe0, 0xe5, 0xff, 0xda,
+ 0x5f, 0x10, 0xde, 0x9e, 0x00, 0x20, 0x1d, 0xe0, 0x05, 0x22, 0x2f, 0x09,
+ 0x00, 0x01, 0xe2, 0x90,
+ 0x0f, 0x52, 0x12, 0xfd, 0xde, 0x12, 0x0e, 0xdd, 0xe0, 0xe6, 0xe0, 0xfb,
+ 0x0d, 0x2d, 0x10, 0x04,
+ 0x8f, 0xe1, 0x13, 0x3f, 0x0f, 0x0c, 0xed, 0x02, 0x07, 0xf1, 0xa1, 0x02,
+ 0x01, 0x0f, 0x0f, 0x01,
+ 0x57, 0x34, 0x0f, 0xfd, 0x72, 0x73, 0x0e, 0xea, 0x01, 0x03, 0x01, 0x00,
+ 0x30, 0x03, 0xfe, 0xd0,
+ 0xf4, 0x02, 0x01, 0x70, 0x72, 0x0f, 0xe8, 0x00, 0x12, 0x00, 0xef, 0x14,
+ 0x20, 0xfc, 0xe0, 0x03,
+ 0x15, 0xef, 0x0e, 0x74, 0x43, 0xff, 0xdb, 0x10, 0x31, 0x0e, 0x2d, 0x41,
+ 0x00, 0xf0, 0x0e, 0x4e,
+ 0x10, 0x25, 0x02, 0xe0, 0x54, 0x10, 0xef, 0xc0, 0xf4, 0xe0, 0xdb, 0x00,
+ 0x3f, 0x20, 0xf0, 0xe0,
+ 0x61, 0x21, 0xdd, 0xef, 0x03, 0x55, 0x41, 0x0f, 0x00, 0xef, 0xf0, 0x1d,
+ 0x44, 0x12, 0xc9, 0x10,
+ 0x43, 0x0f, 0x0c, 0x11, 0x47, 0x00, 0xbf, 0xfd, 0x32, 0x77, 0x0f, 0xfe,
+ 0x01, 0x15, 0x00, 0x00,
+ 0xd0, 0x0d, 0x00, 0xff, 0x22, 0x01, 0x9e, 0x00, 0x23, 0x44, 0xfc, 0xec,
+ 0x01, 0x67, 0x00, 0xcf,
+ 0x00, 0x31, 0x00, 0xcf, 0xef, 0x04, 0x02, 0xe0, 0x10, 0x62, 0x00, 0xef,
+ 0x00, 0x05, 0x22, 0x10,
+ 0x40, 0x20, 0x00, 0xf2, 0xd2, 0xf3, 0x06, 0xf0, 0x11, 0x52, 0x21, 0xee,
+ 0xde, 0x00, 0x40, 0x4e,
+ 0x04, 0x07, 0xf0, 0xab, 0xfe, 0xe0, 0x11, 0x24, 0xaf, 0xfd, 0x23, 0x00,
+ 0xee, 0xf0, 0xf0, 0x1d,
+ 0x5b, 0x1f, 0xed, 0xdd, 0xea, 0x2e, 0x5f, 0x0d, 0x0f, 0x10, 0x2f, 0x30,
+ 0x00, 0xd0, 0x8a, 0xd0,
+ 0x0f, 0xed, 0xfd, 0x11, 0xdc, 0x88, 0x0f, 0x01, 0x11, 0xec, 0xde, 0x00,
+ 0x30, 0x10, 0xdc, 0xce,
+ 0x11, 0x34, 0xde, 0xad, 0x10, 0x0f, 0x0c, 0xfe, 0x00, 0xd1, 0xcf, 0xee,
+ 0xec, 0x2e, 0x6f, 0xfc,
+ 0xf0, 0x01, 0xe4, 0xf2, 0x01, 0x00, 0x0a, 0xce, 0x01, 0xd0, 0x8d, 0xeb,
+ 0xf0, 0x22, 0x10, 0xec,
+ 0x9d, 0x01, 0xf5, 0x01, 0x32, 0xf9, 0xdf, 0x11, 0xd0, 0x8e, 0x01, 0x04,
+ 0xf0, 0xea, 0x00, 0x23,
+ 0x01, 0x90, 0x0d, 0x02, 0x32, 0x00, 0x01, 0x0f, 0xdb, 0x20, 0x45, 0xf0,
+ 0xe0, 0xf0, 0x01, 0x32,
+ 0xee, 0x02, 0x47, 0x20, 0x10, 0x1f, 0x50, 0x12, 0xad, 0xfe, 0x21, 0x45,
+ 0x00, 0xcd, 0x02, 0x33,
+ 0xee, 0xba, 0x24, 0x54, 0xdd, 0xed, 0x34, 0x42, 0xdd, 0xdd, 0x11, 0x64,
+ 0x0f, 0xf9, 0x00, 0x32,
+ 0x20, 0xee, 0xfe, 0x54, 0x00, 0xee, 0xef, 0x44, 0x12, 0xec, 0xdf, 0x21,
+ 0x11, 0xef, 0xe0, 0x00,
+ 0x33, 0xdc, 0xbc, 0x52, 0x23, 0xde, 0xed, 0x26, 0x00, 0xcc, 0x05, 0x05,
+ 0x13, 0x01, 0x07, 0x01,
+ 0x36, 0x01, 0x7c, 0xf8, 0x08, 0xf7, 0x35, 0xf1, 0x88, 0x00, 0x01, 0x00,
+ 0xff, 0x00, 0xff, 0x20,
+ 0x31, 0x9b, 0x00, 0x23, 0x00, 0x00, 0x10, 0x22, 0x01, 0xee, 0xe0, 0x06,
+ 0x53, 0xfe, 0xdb, 0x31,
+ 0x00, 0xa0, 0xfe, 0x17, 0x20, 0xde, 0x30, 0x73, 0x00, 0xbd, 0x0f, 0x21,
+ 0x16, 0xff, 0xee, 0x00,
+ 0x21, 0xf0, 0xe0, 0xf2, 0x06, 0x20, 0xff, 0x21, 0x10, 0x9e, 0x10, 0x41,
+ 0x37, 0x0f, 0xde, 0x00,
+ 0x67, 0x21, 0xde, 0xef, 0x43, 0x11, 0x00, 0x02, 0x31, 0xcc, 0x10, 0x65,
+ 0x00, 0xdc, 0x10, 0x63,
+ 0x01, 0xef, 0x0d, 0x00, 0x04, 0x10, 0x00, 0xff, 0x12, 0x24, 0xee, 0x0f,
+ 0x34, 0xde, 0xbb, 0x42,
+ 0x55, 0x0e, 0xdb, 0x10, 0x31, 0x21, 0xff, 0xde, 0x00, 0x64, 0x0f, 0xfd,
+ 0xf0, 0x33, 0x13, 0xcd,
+ 0xee, 0x14, 0x00, 0xdc, 0x41, 0x01, 0xac, 0xff, 0x26, 0x10, 0x0f, 0xde,
+ 0x1f, 0x42, 0x00, 0x03,
+ 0x03, 0xa9, 0x00, 0x51, 0x01, 0xee, 0xe0, 0xf0, 0x01, 0x34, 0x2f, 0xeb,
+ 0xe0, 0x12, 0x02, 0xe0,
+ 0x2f, 0x77, 0x10, 0xce, 0x00, 0x10, 0x00, 0xf1, 0x02, 0xef, 0x34, 0x0f,
+ 0x88, 0x00, 0x23, 0xf0,
+ 0xdd, 0x31, 0x21, 0xbf, 0x00, 0x20, 0xed, 0xde, 0x11, 0x77, 0xf0, 0xcd,
+ 0x01, 0x13, 0x0f, 0xdd,
+ 0x22, 0xff, 0x1e, 0x55, 0xff, 0xdd, 0x00, 0x32, 0xff, 0x0f, 0x54, 0xec,
+ 0x00, 0x04, 0x10, 0x00,
+ 0xff, 0xcc, 0x20, 0x77, 0x31, 0xdd, 0xcc, 0x21, 0x66, 0xff, 0xdc, 0x00,
+ 0x23, 0x21, 0xed, 0xce,
+ 0x10, 0x13, 0x22, 0xf0, 0xcd, 0x0f, 0x23, 0x32, 0xd8, 0xf0, 0x30, 0x20,
+ 0xf0, 0xde, 0x2f, 0x70,
+ 0x10, 0xdc, 0x00, 0x66, 0x00, 0xce, 0x00, 0x22, 0x00, 0xfc, 0xd0, 0x00,
+ 0x03, 0x00, 0xe0, 0xfb,
+ 0x00, 0x75, 0xe0, 0xac, 0x11, 0x22, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x11,
+ 0xcc, 0x13, 0x67, 0xee,
+ 0xfe, 0x00, 0x01, 0x10, 0x00, 0x00, 0x23, 0x11, 0xfe, 0xf0, 0x11, 0x11,
+ 0x43, 0xf0, 0xaa, 0x36,
+ 0x31, 0x9d, 0xfe, 0x36, 0x20, 0xbe, 0x00, 0x34, 0x10, 0xcd, 0x00, 0x22,
+ 0x00, 0xfe, 0x21, 0x10,
+ 0xf0, 0x01, 0x03, 0xef, 0xdf, 0xde, 0x67, 0x01, 0xed, 0xee, 0x44, 0x44,
+ 0xdd, 0xca, 0x22, 0x62,
+ 0x00, 0xee, 0x11, 0x12, 0x0f, 0xcd, 0x25, 0x22, 0xff, 0xff, 0x33, 0x43,
+ 0xfc, 0xef, 0x21, 0x23,
+ 0xff, 0xdd, 0x44, 0x0f, 0xc8, 0x31, 0x74, 0xde, 0xce, 0x22, 0x36, 0xff,
+ 0xbe, 0x00, 0x20, 0x02,
+ 0xff, 0xf0, 0xff, 0x0f, 0x3f, 0x50, 0xed, 0xcc, 0x11, 0x33, 0x1e, 0xfd,
+ 0x13, 0x47, 0xcd, 0xba,
+ 0x11, 0x44, 0xdf, 0xdc, 0x42, 0x01, 0xce, 0xed, 0x23, 0x12, 0xfe, 0xcc,
+ 0x21, 0x54, 0xfe, 0xbc,
+ 0x01, 0x32, 0xf1, 0xfe, 0x0f, 0x00, 0x01, 0x00, 0xfd, 0xfe, 0x22, 0x02,
+ 0xd9, 0xf0, 0x52, 0x10,
+ 0xee, 0xdc, 0x33, 0x76, 0xfe, 0xef, 0x01, 0x21, 0x0f, 0xce, 0x33, 0x34,
+ 0xdd, 0xdd, 0xe0, 0x36,
+ 0x41, 0xce, 0xeb, 0x21, 0x52, 0xed, 0x22, 0x10, 0xac, 0x12, 0x11, 0xfe,
+ 0xf1, 0x02, 0x00, 0xed,
+ 0xde, 0x02, 0x57, 0x00, 0xfe, 0x00, 0x00, 0x42, 0x0f, 0x10, 0x00, 0xcd,
+ 0xf1, 0x37, 0x23, 0xde,
+ 0xac, 0x00, 0x74, 0x25, 0xff, 0xcd, 0x14, 0x43, 0xec, 0x0f, 0x31, 0x00,
+ 0xbe, 0x00, 0x13, 0x00,
+ 0x20, 0x00, 0xed, 0xf1, 0x05, 0x00, 0x04, 0x11, 0xbb, 0x00, 0x32, 0xff,
+ 0xbb, 0x0f, 0x22, 0x52,
+ 0xfd, 0xeb, 0x23, 0x42, 0xde, 0xda, 0x11, 0x53, 0x0f, 0xdc, 0x01, 0x11,
+ 0xef, 0xef, 0x22, 0xf0,
+ 0xcd, 0x10, 0xf0, 0xbb, 0x22, 0x00, 0xdc, 0xee, 0x00, 0x35, 0xef, 0x8d,
+ 0x00, 0x30, 0x01, 0x9a,
+ 0x10, 0x24, 0xfd, 0xde, 0x00, 0x00, 0x10, 0x12, 0x0d, 0xa8, 0x11, 0x23,
+ 0xfe, 0xee, 0x00, 0x31,
+ 0xef, 0xee, 0x10, 0x33, 0xe0, 0xaa, 0xf0, 0x00, 0x12, 0x00, 0xdb, 0x20,
+ 0x52, 0xff, 0xec, 0x11,
+ 0x11, 0x00, 0xbc, 0xf0, 0x21, 0x02, 0xac, 0xed, 0x03, 0x24, 0xce, 0xff,
+ 0x22, 0x50, 0xfa, 0xff,
+ 0x13, 0x01, 0xce, 0x02, 0x10, 0x1f, 0x0c, 0x03, 0x02, 0x9d, 0x37, 0x13,
+ 0xfe, 0x00, 0x32, 0x00,
+ 0xff, 0x00, 0x23, 0x0f, 0xfc, 0x43, 0x67, 0xf0, 0x99, 0x11, 0x23, 0x01,
+ 0xff, 0xff, 0x01, 0x02,
+ 0xe0, 0xff, 0x00, 0x00, 0x01, 0x40, 0x00, 0xfc, 0x00, 0x73, 0xff, 0xf8,
+ 0x21, 0x43, 0xec, 0xef,
+ 0x31, 0x02, 0xee, 0x00, 0x33, 0xce, 0xed, 0x12, 0x77, 0xf0, 0xcc, 0x0f,
+ 0x12, 0x43, 0xed, 0xee,
+ 0x00, 0x01, 0x34, 0x00, 0xed, 0x23, 0x44, 0x00, 0xdc, 0xdf, 0x00, 0x74,
+ 0x0f, 0xdb, 0x00, 0x21,
+ 0x21, 0x00, 0x20, 0x22, 0xef, 0x43, 0x30, 0x40, 0x41, 0xf2, 0xdf, 0x46,
+ 0x00, 0x98, 0x02, 0x57,
+ 0x00, 0xcd, 0x10, 0x32, 0x21, 0xf0, 0xde, 0x00, 0x52, 0x21, 0xfe, 0xfe,
+ 0x01, 0x04, 0xf0, 0x03,
+ 0x03, 0xca, 0xef, 0x73, 0x14, 0x0f, 0xfe, 0xe0, 0x21, 0x67, 0xff, 0xfe,
+ 0x00, 0x02, 0x22, 0x11,
+ 0x12, 0x10, 0x00, 0x13, 0x23, 0xf0, 0x01, 0x57, 0x53, 0x0f, 0x0e, 0xe0,
+ 0x13, 0x54, 0x0f, 0x0e,
+ 0x00, 0x47, 0x22, 0x00, 0xe0, 0x03, 0x11, 0x02, 0xe2, 0x00, 0x34, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x72, 0x76, 0x00, 0x20, 0x0f, 0x0d, 0x0f, 0x66, 0x11, 0x00, 0x02, 0x0d,
+ 0x03, 0x67, 0xf2, 0xda,
+ 0x10, 0x43, 0x00, 0xde, 0x01, 0x12, 0x0f, 0xed, 0x00, 0x54, 0x03, 0x0e,
+ 0x00, 0x23, 0x02, 0xfc,
+ 0xdf, 0x45, 0x20, 0xcd, 0xfe, 0x46, 0x00, 0xdd, 0x00, 0x52, 0x02, 0xf0,
+ 0x0f, 0x63, 0x1f, 0x0a,
+ 0x01, 0x13, 0x0e, 0xf2, 0x03, 0x0f, 0x10, 0x30, 0xf0, 0x07, 0x01, 0xd0,
+ 0x21, 0x20, 0x7d, 0x61,
+ 0x0d, 0xec, 0x02, 0x26, 0xff, 0xf0, 0x10, 0x00, 0xd0, 0xf0, 0xd4, 0xe1,
+ 0x01, 0x74, 0x52, 0xdb,
+ 0xee, 0x02, 0x12, 0xee, 0xed, 0x55, 0x12, 0xfe, 0xf0, 0x27, 0x01, 0xdf,
+ 0xce, 0x65, 0x43, 0xf0,
+ 0xdd, 0x00, 0x33, 0x02, 0xee, 0x0e, 0x61, 0x13, 0x0e, 0xc9, 0x00, 0x23,
+ 0x01, 0xf0, 0xe0, 0x00,
+ 0xf1, 0xd0, 0xec, 0xdf, 0x02, 0x00, 0xec, 0xde, 0xff, 0xe0, 0xcd, 0x08,
+ 0x5f, 0x0c, 0xcf, 0x30,
+ 0x10, 0xab, 0xfe, 0x00, 0x00, 0xfe, 0xce, 0x30, 0xfd, 0xac, 0xff, 0xee,
+ 0xb9, 0x0f, 0x0f, 0x0f,
+ 0xce, 0x0e, 0x00, 0x0d, 0xdb, 0xef, 0xf0, 0x01, 0xad, 0xeb, 0x00, 0x1d,
+ 0x0e, 0xbc, 0xdf, 0xef,
+ 0xfe, 0x00, 0x00, 0x09, 0x0f, 0x00, 0xef, 0xbe, 0xef, 0xf0, 0xec, 0x0e,
+ 0x5f, 0xef, 0x8e, 0xf0,
+ 0xeb, 0x00, 0x14, 0xfe, 0xec, 0xff, 0xef, 0x0d, 0x21, 0x11, 0xeb, 0xef,
+ 0xff, 0x8e, 0xdd, 0x01,
+ 0xe1, 0xdc, 0xdf, 0x04, 0x02, 0xad, 0xeb, 0xff, 0xd0, 0x02, 0x32, 0xeb,
+ 0xcd, 0xe0, 0x02, 0xcf,
+ 0xec, 0x12, 0x17, 0xdf, 0xbe, 0x00, 0x01, 0xf4, 0xd0, 0x01, 0x0f, 0xee,
+ 0x72, 0x15, 0x0d, 0xcd,
+ 0x1f, 0x62, 0x13, 0x0f, 0xc1, 0x03, 0x10, 0x0c, 0xcb, 0x02, 0x06, 0x00,
+ 0xe0, 0xee, 0xf1, 0x03,
+ 0xce, 0xfa, 0x10, 0x20, 0x2e, 0x0f, 0xff, 0xed, 0x70, 0x5d, 0x0c, 0xfe,
+ 0x03, 0x55, 0x0d, 0xeb,
+ 0x00, 0x20, 0xee, 0xae, 0x00, 0xff, 0x0d, 0x1d, 0x1e, 0x0b, 0xdf, 0x03,
+ 0xd1, 0xec, 0x0f, 0x40,
+ 0x40, 0xe9, 0xd0, 0xc0, 0xe0, 0xcb, 0x00, 0x21, 0x00, 0xdd, 0xdf, 0xee,
+ 0xe0, 0x24, 0x4f, 0x0b,
+ 0x3e, 0x1f, 0x00, 0xe1, 0x01, 0x00, 0x60, 0x14, 0xc0, 0x9d, 0xee, 0x02,
+ 0x07, 0xe0, 0x0f, 0x60,
+ 0x3e, 0x01, 0xde, 0xdc, 0x1f, 0x63, 0x06, 0x00, 0xfe, 0x01, 0x03, 0xf1,
+ 0xa0, 0x06, 0x03, 0x00,
+ 0xec, 0x10, 0x43, 0xf1, 0xd0, 0x0d, 0x20, 0x55, 0x01, 0x02, 0xf1, 0x40,
+ 0x34, 0x25, 0x14, 0x03,
+ 0x03, 0x54, 0x42, 0x20, 0x10, 0x31, 0x75, 0x20, 0x10, 0x12, 0x33, 0x02,
+ 0x11, 0x34, 0x51, 0x11,
+ 0x37, 0x04, 0x00, 0x11, 0x01, 0x33, 0x31, 0xf0, 0xa0, 0x25, 0x53, 0x10,
+ 0x1c, 0x20, 0x21, 0x31,
+ 0x40, 0x32, 0x30, 0x4e, 0x72, 0x13, 0x20, 0x05, 0xf1, 0x01, 0x03, 0x42,
+ 0x0f, 0x2f, 0x12, 0x03,
+ 0xd0, 0x17, 0x77, 0x02, 0x10, 0x1e, 0x0f, 0xf0, 0x03, 0x16, 0x40, 0x0f,
+ 0x00, 0x43, 0xf0, 0x0d,
+ 0x13, 0x37, 0x22, 0xf1, 0xe0, 0x41, 0x30, 0xff, 0xf0, 0x62, 0x65, 0x43,
+ 0x13, 0x00, 0x01, 0x03,
+ 0x16, 0x02, 0xf2, 0x04, 0x00, 0x33, 0x72, 0x22, 0xe1, 0x12, 0x54, 0x0f,
+ 0x2e, 0x02, 0x04, 0x45,
+ 0x00, 0xcc, 0x01, 0x45, 0xf1, 0xb0, 0x0f, 0x13, 0x21, 0x00, 0xe0, 0x04,
+ 0x41, 0x11, 0xf0, 0xee,
+ 0xfd, 0x2f, 0x40, 0x01, 0x37, 0x36, 0x01, 0xc2, 0xd0, 0x11, 0x62, 0x30,
+ 0x32, 0x04, 0x20, 0x4e,
+ 0x30, 0x40, 0x00, 0x30, 0x60, 0x14, 0x24, 0x20, 0x20, 0x10, 0x12, 0x27,
+ 0x03, 0xd2, 0xa1, 0x0f,
+ 0x30, 0x20, 0xd0, 0xce, 0xfe, 0x00, 0x22, 0x21, 0x7c, 0x79, 0x1e, 0x0d,
+ 0x00, 0x04, 0x16, 0x10,
+ 0x2d, 0x2f, 0xfc, 0xdd, 0x00, 0x12, 0x00, 0xdb, 0xdf, 0x30, 0x51, 0xbd,
+ 0xfe, 0xf6, 0x00, 0x00,
+ 0x20, 0x22, 0xb0, 0xd9, 0xef, 0xff, 0x01, 0x13, 0xd0, 0xcf, 0xef, 0xcf,
+ 0xb0, 0xf2, 0xf0, 0xfc,
+ 0x3f, 0x7f, 0x10, 0x00, 0xda, 0xfe, 0x12, 0x11, 0xdd, 0xc3, 0x07, 0x01,
+ 0xde, 0xbd, 0x00, 0x03,
+ 0x57, 0xff, 0xfd, 0x30, 0x20, 0xfe, 0xcf, 0x00, 0x40, 0x10, 0xee, 0xd0,
+ 0xbe, 0xe9, 0x00, 0x13,
+ 0x34, 0x00, 0x9f, 0xe0, 0x01, 0x0e, 0xf8, 0xce, 0x0e, 0x1f, 0xfd, 0xe0,
+ 0xe1, 0x0f, 0xec, 0x11,
+ 0x57, 0xd2, 0xb0, 0x0f, 0x30, 0x21, 0x00, 0xbd, 0x00, 0x11, 0x0f, 0x0c,
+ 0x3f, 0x7f, 0x2c, 0x0f,
+ 0xcf, 0xf2, 0x04, 0x15, 0x01, 0x0f, 0xec, 0xdf, 0xb0, 0xe0, 0xd3, 0xdf,
+ 0xca, 0xde, 0x0f, 0x3c,
+ 0x0d, 0xac, 0xfe, 0x0e, 0x4e, 0x0e, 0x00, 0xfb, 0xec, 0xfe, 0xee, 0x0f,
+ 0xed, 0xdb, 0x9d, 0xec,
+ 0xef, 0xbd, 0xee, 0xdf, 0xee, 0x0e, 0xfc, 0xde, 0xae, 0xea, 0xec, 0x0f,
+ 0x10, 0x0f, 0xef, 0xde,
+ 0xc0, 0xbe, 0xb8, 0xf0, 0xff, 0xd0, 0xef, 0x0e, 0x1d, 0x1e, 0xdd, 0x0e,
+ 0x00, 0x10, 0x4e, 0xfd,
+ 0x9a, 0xfe, 0xf2, 0xe1, 0xff, 0x0f, 0xef, 0xcd, 0x0e, 0x22, 0x53, 0xf8,
+ 0xfe, 0x00, 0x10, 0xfe,
+ 0xbc, 0x00, 0xef, 0xf8, 0xf0, 0x10, 0xe0, 0xa1, 0x01, 0xf0, 0xe1, 0xe0,
+ 0x0f, 0xde, 0xcf, 0xdc,
+ 0xed, 0x1e, 0x4b, 0xde, 0xdd, 0xe1, 0xb5, 0xe2, 0xf0, 0x74, 0x53, 0xed,
+ 0xd0, 0x05, 0x03, 0xf1,
+ 0x02, 0x10, 0x4f, 0x3c, 0x0e, 0x02, 0x07, 0x12, 0x40, 0x50, 0x10, 0x21,
+ 0x01, 0xf2, 0xd3, 0x03,
+ 0x07, 0x02, 0xc0, 0xd0, 0x0f, 0xf1, 0xc3, 0xe0, 0x11, 0x73, 0x4e, 0xfb,
+ 0xed, 0x0f, 0x00, 0x43,
+ 0x23, 0x52, 0x47, 0x11, 0xf0, 0xea, 0x0f, 0x1f, 0x0e, 0xf1, 0x02, 0x23,
+ 0xcd, 0xeb, 0xe0, 0xdd,
+ 0xc0, 0x03, 0x22, 0x7f, 0x38, 0xef, 0xc0, 0xe0, 0xf0, 0x00, 0xd0, 0xc0,
+ 0xcd, 0xea, 0xf0, 0xf3,
+ 0x40, 0x1e, 0x0b, 0x20, 0x10, 0x1f, 0xfd, 0x0e, 0x0d, 0xfd, 0xe1, 0x87,
+ 0xc0, 0xff, 0x0f, 0x10,
+ 0x00, 0x21, 0x33, 0x11, 0x50, 0xfc, 0xec, 0x0d, 0x2d, 0x0a, 0x9d, 0xff,
+ 0x12, 0x52, 0x1b, 0x00,
+ 0x05, 0xe2, 0xd0, 0xf0, 0x17, 0x30, 0xdf, 0xdb, 0x00, 0x00, 0x90, 0xe0,
+ 0xff, 0x10, 0x71, 0x31,
+ 0x21, 0xe1, 0xc5, 0x13, 0x01, 0xf1, 0x03, 0x30, 0x30, 0x0f, 0x32, 0x24,
+ 0x75, 0x72, 0x12, 0x21,
+ 0x11, 0x01, 0x21, 0x24, 0x04, 0x34, 0x23, 0x12, 0x05, 0x03, 0xb1, 0xe0,
+ 0x01, 0x36, 0x32, 0xd0,
+ 0xc0, 0xe1, 0xf0, 0x4f, 0x60, 0x13, 0x23, 0x23, 0x54, 0x13, 0x10, 0xfd,
+ 0x0f, 0x53, 0x23, 0x00,
+ 0x08, 0xfd, 0x00, 0xf2, 0xf2, 0xe3, 0x02, 0x00, 0x00, 0x42, 0x76, 0x11,
+ 0x00, 0x2e, 0x30, 0x00,
+ 0xc2, 0xf4, 0xec, 0xfe, 0xd2, 0xe5, 0xf0, 0x01, 0x57, 0x12, 0x0f, 0xdb,
+ 0x70, 0x5f, 0x0f, 0x00,
+ 0xef, 0x0f, 0x20, 0x12, 0x00, 0x0f, 0x02, 0xd7, 0x24, 0x72, 0x30, 0x10,
+ 0x0f, 0x10, 0x1f, 0xf0,
+ 0xe4, 0x4f, 0x69, 0x1e, 0x3f, 0x00, 0x01, 0x05, 0x01, 0xf1, 0x11, 0x41,
+ 0x01, 0xe0, 0xb1, 0xfe,
+ 0xdf, 0xff, 0x00, 0x2b, 0x0a, 0x3f, 0x3e, 0xf0, 0xf3, 0x26, 0x41, 0x00,
+ 0x00, 0x42, 0x01, 0x80,
+ 0xf2, 0x03, 0x75, 0x40, 0xe0, 0xf1, 0x12, 0x2c, 0x3d, 0x21, 0x65, 0x21,
+ 0x11, 0x13, 0x10, 0xf0,
+ 0x04, 0x47, 0x14, 0x22, 0x21, 0x01, 0xbf, 0xc0, 0xe0, 0x01, 0xe0, 0x00,
+ 0x20, 0x60, 0x13, 0x02,
+ 0x13, 0x21, 0x61, 0x23, 0x00, 0x34, 0x13, 0x2f, 0x2d, 0x08, 0x0d, 0x00,
+ 0x42, 0x04, 0xee, 0xcd,
+ 0x11, 0x46, 0x20, 0x0f, 0x32, 0x25, 0xfd, 0x0e, 0x40, 0x31, 0x9f, 0xdd,
+ 0xf3, 0xf5, 0xf2, 0x02,
+ 0x10, 0xdd, 0xfc, 0x50, 0x44, 0x02, 0x0a, 0x5e, 0x1e, 0x0e, 0xcd, 0x00,
+ 0x14, 0x01, 0x1e, 0x2c,
+ 0x40, 0x57, 0x03, 0xd1, 0xef, 0x10, 0x55, 0x11, 0x3e, 0x2d, 0xff, 0xfe,
+ 0x0e, 0x21, 0x02, 0x0e,
+ 0x70, 0x30, 0x00, 0xe7, 0xf7, 0xe1, 0x0f, 0x40, 0x20, 0xb1, 0xe0, 0x0e,
+ 0x0d, 0x20, 0x51, 0x02,
+ 0xbe, 0xed, 0xf2, 0x03, 0xee, 0xd3, 0x27, 0x17, 0x56, 0x00, 0x00, 0xd1,
+ 0xf0, 0x30, 0x42, 0x32,
+ 0x21, 0x60, 0x2f, 0x00, 0xf0, 0x12, 0x51, 0x12, 0x15, 0x35, 0x23, 0xe0,
+ 0xd2, 0xc1, 0xc2, 0xf0,
+ 0xbf, 0xed, 0xd0, 0x00, 0x01, 0xdf, 0x0a, 0x60, 0x24, 0xf1, 0xbd, 0x0c,
+ 0x30, 0x1f, 0x2d, 0x0d,
+ 0xfb, 0xee, 0xdb, 0xdf, 0x0d, 0xfe, 0x9c, 0xee, 0xe0, 0x00, 0xed, 0x0a,
+ 0x2f, 0x2d, 0xcd, 0xcc,
+ 0xdf, 0xdd, 0xfc, 0xde, 0xac, 0xce, 0xdf, 0xcf, 0xdd, 0xde, 0xea, 0x0e,
+ 0x4d, 0x50, 0xdc, 0xba,
+ 0xf0, 0x1f, 0x00, 0xfe, 0xfd, 0x0e, 0x0f, 0xee, 0xae, 0xe2, 0xd1, 0x00,
+ 0x20, 0xf9, 0xce, 0x0f,
+ 0xf0, 0x0d, 0x1f, 0x3f, 0xfd, 0x89, 0x0f, 0x0f, 0x0f, 0xff, 0xd0, 0xd1,
+ 0xe1, 0xd3, 0xd1, 0x8b,
+ 0xed, 0xef, 0x02, 0xf2, 0x0e, 0xfb, 0xde, 0xbd, 0xdb, 0xef, 0xde, 0xe1,
+ 0x16, 0xff, 0xaf, 0x02,
+ 0xd4, 0x02, 0xc2, 0xf0, 0xe3, 0x01, 0x02, 0x0f, 0xc0, 0xe0, 0xfa, 0x0e,
+ 0x70, 0x47, 0x00, 0x00,
+ 0x00, 0x33, 0x34, 0x03, 0xf3, 0xf1, 0xc2, 0xd0, 0xef, 0xdf, 0xbc, 0xf0,
+ 0xf3, 0x03, 0xe0, 0xf1,
+ 0x14, 0x2e, 0x2a, 0x0f, 0x30, 0x60, 0x4f, 0x3f, 0x29, 0x2e, 0x5e, 0x1f,
+ 0x0f, 0xdf, 0xec, 0xfd,
+ 0x1f, 0x1e, 0xed, 0x99, 0xfe, 0xed, 0x2f, 0x5e, 0x2e, 0x3c, 0x0d, 0x0e,
+ 0xa0, 0xe0, 0xc0, 0xdd,
+ 0x0b, 0xfd, 0xfa, 0xbe, 0xee, 0xd0, 0x1f, 0x2e, 0x0f, 0xd8, 0x0e, 0x1f,
+ 0x2e, 0xcd, 0xf0, 0x0f,
+ 0xdd, 0xbf, 0xc0, 0xed, 0xf2, 0xf5, 0xe0, 0x0e, 0x10, 0x02, 0x8e, 0x08,
+ 0xfc, 0x0e, 0x10, 0xdf,
+ 0xfe, 0x3e, 0x52, 0xe2, 0x8c, 0xff, 0x02, 0x07, 0x02, 0x00, 0x0f, 0x10,
+ 0x00, 0xb1, 0xdd, 0xe9,
+ 0xef, 0x00, 0x00, 0x10, 0xbe, 0xff, 0x00, 0x01, 0x14, 0x15, 0x04, 0x00,
+ 0xc1, 0x10, 0x23, 0x01,
+ 0x0f, 0x3e, 0x74, 0x01, 0x20, 0x70, 0x74, 0x01, 0x00, 0x17, 0x23, 0x03,
+ 0x12, 0x01, 0x02, 0x20,
+ 0x00, 0x03, 0xe5, 0x12, 0x20, 0x10, 0x01, 0x02, 0xd3, 0xd0, 0x05, 0x01,
+ 0x71, 0x00, 0x10, 0x00,
+ 0x1e, 0x1f, 0x5a, 0x34, 0x1f, 0x21, 0x58, 0x36, 0x50, 0x36, 0x10, 0x28,
+ 0x29, 0x30, 0x33, 0x2f,
+ 0x3f, 0x70, 0x30, 0x00, 0xcf, 0xf3, 0xf7, 0x01, 0x10, 0x4f, 0x60, 0x0f,
+ 0x1f, 0x04, 0x24, 0x01,
+ 0x0e, 0xdb, 0x01, 0x11, 0xf1, 0xad, 0xfe, 0xf6, 0x02, 0x00, 0x40, 0x1d,
+ 0x20, 0x20, 0x00, 0x0f,
+ 0x10, 0x70, 0x00, 0x0e, 0xdd, 0xe9, 0xe0, 0x07, 0x16, 0x40, 0x60, 0x20,
+ 0x00, 0x00, 0x0f, 0x0e,
+ 0x1e, 0x4f, 0x50, 0x40, 0x0e, 0xef, 0xec, 0x00, 0x55, 0x03, 0x00, 0x00,
+ 0x13, 0x1f, 0xfb, 0xbf,
+ 0x00, 0x11, 0x0e, 0xec, 0x0e, 0x10, 0x2f, 0xfe, 0xd0, 0x0f, 0x20, 0x37,
+ 0xe6, 0x80, 0x0f, 0x00,
+ 0x45, 0xe0, 0xd2, 0x00, 0xfd, 0xfe, 0x3f, 0x7f, 0x6f, 0x0d, 0x0f, 0x51,
+ 0x13, 0x23, 0x02, 0x10,
+ 0x24, 0x00, 0x23, 0x27, 0x10, 0x1e, 0x2e, 0x3f, 0x0c, 0x9d, 0xee, 0xf3,
+ 0x04, 0x10, 0x4b, 0x1f,
+ 0xff, 0xf1, 0x55, 0x42, 0x20, 0x3c, 0x3f, 0x6f, 0x0e, 0x1f, 0xf1, 0x02,
+ 0x0f, 0xfd, 0xf0, 0x0e,
+ 0x1c, 0x52, 0x37, 0x23, 0x10, 0x12, 0x45, 0x21, 0x0f, 0xfc, 0xdf, 0xb2,
+ 0xe0, 0xe2, 0x03, 0xcf,
+ 0xec, 0xf2, 0xf5, 0x00, 0x01, 0x62, 0x30, 0x3b, 0xef, 0xde, 0xed, 0xea,
+ 0x00, 0x00, 0x63, 0x24,
+ 0x12, 0xf1, 0x80, 0x00, 0x01, 0x04, 0x00, 0x2b, 0x0f, 0x0f, 0x2d, 0x2d,
+ 0x1d, 0x10, 0x30, 0x0f,
+ 0x4d, 0x57, 0x37, 0x10, 0xdf, 0x10, 0x53, 0x00, 0xb0, 0xdc, 0x00, 0x50,
+ 0x0d, 0xf0, 0xd1, 0x0d,
+ 0x4e, 0x0f, 0xfd, 0xfb, 0xff, 0xd0, 0x07, 0x06, 0xd0, 0xd1, 0x00, 0xf1,
+ 0x2f, 0x2e, 0x90, 0xe0,
+ 0x1e, 0x70, 0x70, 0x2d, 0x0d, 0xf0, 0x0d, 0x17, 0x35, 0x20, 0x5f, 0x2f,
+ 0x01, 0x14, 0x00, 0xfd,
+ 0x01, 0xe1, 0xde, 0xeb, 0xff, 0x9f, 0xdf, 0xdf, 0xe0, 0x01, 0x22, 0x73,
+ 0x1d, 0x2c, 0x2e, 0xeb,
+ 0x00, 0x11, 0x24, 0xd0, 0xbb, 0xfd, 0xef, 0xc0, 0xf4, 0xf1, 0x11, 0x40,
+ 0x00, 0xc0, 0xf4, 0xf0,
+ 0xe0, 0x05, 0xd1, 0xd1, 0xe2, 0x81, 0xd0, 0xba, 0xf0, 0xf1, 0x07, 0x03,
+ 0x00, 0xff, 0xce, 0xef,
+ 0xdf, 0xfe, 0xee, 0xee, 0xec, 0x00, 0x27, 0xf3, 0x81, 0xed, 0x01, 0x15,
+ 0xd2, 0xd0, 0x10, 0x3d,
+ 0xfe, 0xef, 0x01, 0xff, 0xfa, 0x0f, 0x70, 0x61, 0x02, 0xdf, 0x00, 0x36,
+ 0x01, 0xb0, 0xfd, 0xf0,
+ 0xfe, 0x00, 0xf3, 0xd1, 0xd0, 0xff, 0x50, 0x1e, 0xd8, 0xb8, 0xf0, 0xf0,
+ 0xe1, 0xc0, 0x01, 0x11,
+ 0x00, 0x80, 0xf3, 0xf3, 0xe3, 0x00, 0x0d, 0x4e, 0x2d, 0xe0, 0xdf, 0x20,
+ 0x0e, 0x09, 0x31, 0x42,
+ 0x63, 0x31, 0x00, 0xee, 0x10, 0x47, 0x43, 0x01, 0x00, 0x18, 0x1f, 0xe0,
+ 0xad, 0xd0, 0xf1, 0xe2,
+ 0x00, 0xfc, 0x0f, 0x30, 0x52, 0x00, 0x22, 0x4f, 0x2c, 0x00, 0xdf, 0xef,
+ 0x0c, 0xf0, 0x0e, 0x30,
+ 0x57, 0x24, 0xfd, 0xdd, 0x40, 0x54, 0x23, 0x0e, 0xeb, 0x10, 0x13, 0xc0,
+ 0xb1, 0xe0, 0xec, 0xe0,
+ 0xe1, 0xd7, 0xc2, 0xe0, 0xc0, 0xed, 0xf0, 0xce, 0xbf, 0xf0, 0x00, 0x4d,
+ 0xfd, 0xc0, 0xe0, 0x02,
+ 0x07, 0xf4, 0xd2, 0xb0, 0xe0, 0xf0, 0xe3, 0xc2, 0xe2, 0xfc, 0xee, 0x0f,
+ 0x1b, 0x4c, 0x1e, 0xe1,
+ 0x05, 0x52, 0x01, 0xdd, 0x0c, 0x20, 0xe0, 0x83, 0xd4, 0xf7, 0x00, 0x20,
+ 0x0d, 0x0e, 0xd0, 0x01,
+ 0xef, 0x9d, 0x0d, 0x00, 0x4f, 0x1e, 0xe1, 0xa4, 0xf6, 0x02, 0xe3, 0xd5,
+ 0x12, 0x21, 0x0f, 0xdb,
+ 0xd0, 0xe0, 0xfd, 0x00, 0x51, 0x2f, 0x3d, 0x60, 0x22, 0x12, 0x37, 0x74,
+ 0x11, 0x2e, 0x1e, 0x31,
+ 0x00, 0x0e, 0x1d, 0x00, 0xf2, 0xd6, 0x8e, 0xea, 0xff, 0x00, 0x14, 0x10,
+ 0x3d, 0x4f, 0x0f, 0x10,
+ 0x20, 0x00, 0x00, 0x1e, 0x4e, 0x1e, 0x02, 0xe0, 0x8d, 0xf8, 0x0f, 0x40,
+ 0xf2, 0x02, 0x01, 0x41,
+ 0x10, 0xe0, 0xfb, 0x00, 0x10, 0x06, 0x11, 0x00, 0xee, 0xd2, 0xe6, 0xe1,
+ 0xa0, 0xe0, 0xb1, 0xe0,
+ 0xeb, 0x1f, 0x40, 0x0e, 0xef, 0x00, 0x23, 0x00, 0xfb, 0x20, 0x71, 0x15,
+ 0xc2, 0xc4, 0xe0, 0x00,
+ 0x10, 0x5e, 0x1e, 0xfc, 0x02, 0x34, 0x2f, 0x5b, 0x3f, 0x2d, 0x00, 0x03,
+ 0x0f, 0x0f, 0x2f, 0x43,
+ 0x57, 0x33, 0x23, 0xf0, 0xff, 0x00, 0xee, 0xcb, 0x1e, 0x6f, 0x0c, 0xea,
+ 0xf0, 0x10, 0x20, 0x04,
+ 0xd0, 0x00, 0x12, 0x21, 0xd0, 0xa4, 0xf3, 0xd0, 0x0f, 0x10, 0x61, 0xec,
+ 0x9c, 0x0d, 0x31, 0x44,
+ 0x21, 0x00, 0x0b, 0x00, 0x43, 0x65, 0x10, 0x00, 0x3d, 0x63, 0x03, 0x01,
+ 0xfe, 0xfc, 0xf0, 0x01,
+ 0x01, 0x00, 0xe0, 0x00, 0x1a, 0x0d, 0x2d, 0x1d, 0x1c, 0x51, 0x57, 0x10,
+ 0x1f, 0x0f, 0x0c, 0x10,
+ 0x2f, 0x51, 0x00, 0x0f, 0x3f, 0x72, 0x00, 0x1b, 0x10, 0x36, 0x10, 0x0f,
+ 0x0e, 0x30, 0x42, 0x02,
+ 0xe0, 0xe0, 0xe7, 0xc1, 0xd1, 0xff, 0xee, 0x0e, 0xf0, 0xe2, 0x35, 0x30,
+ 0x7e, 0x2a, 0x2e, 0x00,
+ 0xf3, 0xc0, 0xf0, 0x02, 0x42, 0x0e, 0xf1, 0x92, 0x02, 0xfd, 0x0f, 0x07,
+ 0x41, 0x72, 0x21, 0x0e,
+ 0xfe, 0xfb, 0x0e, 0x21, 0x14, 0x30, 0x4c, 0x3e, 0x11, 0x37, 0xe3, 0xf0,
+ 0x01, 0x61, 0x20, 0x1c,
+ 0xed, 0xee, 0x0c, 0x20, 0x4e, 0x40, 0xf0, 0xdd, 0x3d, 0x32, 0xc4, 0x97,
+ 0x05, 0xf0, 0xf0, 0xc0,
+ 0xd0, 0xcf, 0x00, 0xf0, 0x21, 0x50, 0x1f, 0x01, 0xf1, 0x00, 0x30, 0x7d,
+ 0x0b, 0x30, 0x57, 0x33,
+ 0x0d, 0x0c, 0x00, 0x10, 0x20, 0x01, 0x26, 0xe0, 0xa0, 0xfb, 0xe0, 0xdd,
+ 0xdf, 0x00, 0x2f, 0x20,
+ 0x01, 0x30, 0x4d, 0x00, 0x21, 0xf0, 0xe0, 0x0f, 0xca, 0xd0, 0x4e, 0x0c,
+ 0x8e, 0xe0, 0x02, 0x17,
+ 0x00, 0x0d, 0x4e, 0x0e, 0xf0, 0xc3, 0x06, 0x21, 0x32, 0xd0, 0x80, 0xe2,
+ 0xc2, 0xe2, 0xc3, 0xe1,
+ 0xec, 0x0c, 0x23, 0xf1, 0xab, 0x0e, 0xfe, 0x00, 0xf4, 0x07, 0x20, 0xdf,
+ 0x90, 0x00, 0xe5, 0x01,
+ 0xc1, 0xe0, 0x00, 0x10, 0x24, 0xd1, 0xbe, 0xfc, 0x00, 0x0e, 0x11, 0xee,
+ 0xea, 0x20, 0x42, 0xf2,
+ 0xe1, 0x05, 0x11, 0x00, 0xc0, 0xa0, 0xd0, 0xa1, 0xfe, 0x0d, 0x0f, 0x0c,
+ 0xcd, 0xdd, 0x0b, 0x0f,
+ 0x1f, 0xf1, 0xd4, 0xe5, 0xb1, 0xd3, 0xb0, 0xdb, 0xe0, 0xf2, 0xf4, 0xd0,
+ 0xe0, 0xdf, 0xa0, 0xf0,
+ 0xcb, 0x00, 0xf5, 0x11, 0x2e, 0x0b, 0x00, 0x00, 0x60, 0x00, 0x21, 0x31,
+ 0x02, 0x14, 0x22, 0x10,
+ 0x0c, 0xaf, 0xde, 0xdf, 0xdd, 0xef, 0x0e, 0x5d, 0x2d, 0x0e, 0xd2, 0x26,
+ 0x5f, 0x1c, 0x1f, 0x2d,
+ 0x2a, 0xee, 0xb0, 0x04, 0x30, 0x1f, 0x4d, 0x20, 0x3f, 0x1d, 0x0c, 0x10,
+ 0x72, 0x63, 0x10, 0x08,
+ 0xfd, 0x00, 0x04, 0xe4, 0xf3, 0xe4, 0x00, 0xf0, 0x02, 0xf2, 0xa1, 0xfb,
+ 0xff, 0x0e, 0x0f, 0x20,
+ 0xf0, 0xde, 0xe2, 0xf5, 0xe0, 0x91, 0xe4, 0xf1, 0x40, 0x41, 0xd4, 0x90,
+ 0x00, 0xe2, 0x26, 0x0f,
+ 0x0b, 0xce, 0x0f, 0x00, 0xff, 0x0a, 0x30, 0x35, 0x20, 0xc0, 0xc0, 0xf0,
+ 0x02, 0x02, 0x02, 0x01,
+ 0xdf, 0xef, 0xef, 0xce, 0xfa, 0x0f, 0x3e, 0x71, 0x44, 0x00, 0xcf, 0xdd,
+ 0xee, 0xbf, 0x07, 0xe4,
+ 0xe0, 0xfe, 0x00, 0x32, 0xdf, 0xef, 0x10, 0x01, 0xb1, 0xd0, 0x00, 0x73,
+ 0x4d, 0x29, 0x2e, 0x20,
+ 0x31, 0x77, 0x32, 0x3e, 0x2e, 0x10, 0x13, 0x31, 0x11, 0x0d, 0xd9, 0x0f,
+ 0x10, 0x51, 0xf1, 0xff,
+ 0x10, 0x72, 0x71, 0x0c, 0x0a, 0xff, 0x1e, 0x10, 0x21, 0x00, 0x1f, 0x1c,
+ 0x2f, 0x22, 0x01, 0x10,
+ 0x10, 0x50, 0x43, 0x3c, 0x1d, 0x13, 0x1d, 0x18, 0x2e, 0x32, 0x05, 0x00,
+ 0x72, 0x23, 0x13, 0xe1,
+ 0xe0, 0xf4, 0x20, 0x1d, 0x2b, 0x30, 0x1d, 0xcd, 0xfe, 0x01, 0x73, 0x13,
+ 0x03, 0x0e, 0x1d, 0x06,
+ 0x03, 0x02, 0x23, 0x07, 0xd2, 0xb0, 0x0f, 0xf0, 0xfd, 0x1e, 0x71, 0x5e,
+ 0x2d, 0x44, 0x01, 0x09,
+ 0x2c, 0x50, 0x01, 0x03, 0x13, 0x23, 0x04, 0x00, 0xb9, 0x00, 0x30, 0x20,
+ 0x1f, 0x0d, 0x0e, 0x3f,
+ 0x1e, 0x0c, 0xfb, 0xce, 0xc0, 0xc5, 0xe3, 0x30, 0x51, 0x00, 0xee, 0xdf,
+ 0x23, 0xf4, 0x91, 0xed,
+ 0x00, 0x03, 0xf2, 0xa4, 0xfe, 0x0a, 0x5f, 0x2f, 0x20, 0x12, 0x42, 0x25,
+ 0x22, 0x22, 0x53, 0x0c,
+ 0x0b, 0xfe, 0x00, 0x02, 0xe3, 0xf2, 0x1f, 0x59, 0x10, 0x21, 0x01, 0x20,
+ 0x3d, 0x20, 0x4f, 0x1c,
+ 0x1f, 0x11, 0x33, 0x29, 0xed, 0xc0, 0x14, 0x72, 0x61, 0x1e, 0x2c, 0x01,
+ 0x0e, 0x1a, 0x6f, 0x10,
+ 0x12, 0x1f, 0x1f, 0x10, 0x02, 0x27, 0x14, 0x01, 0xd1, 0xd0, 0xef, 0xe0,
+ 0x9e, 0xef, 0x0f, 0x0f,
+ 0xff, 0xf0, 0xf6, 0xf0, 0xdb, 0x00, 0x41, 0x33, 0x00, 0xb0, 0xe6, 0xc0,
+ 0xc0, 0xd0, 0xd1, 0xc0,
+ 0xef, 0x00, 0x11, 0xd0, 0xad, 0x0b, 0x1e, 0x2e, 0x0d, 0xef, 0x24, 0x57,
+ 0x02, 0xbe, 0xff, 0x0f,
+ 0x03, 0xd7, 0x00, 0x10, 0x2c, 0x3f, 0x30, 0xf1, 0x80, 0xec, 0xe0, 0x0f,
+ 0xf0, 0x1f, 0xe2, 0xb2,
+ 0xef, 0x01, 0x67, 0x00, 0xbe, 0x0e, 0x02, 0xf2, 0xc2, 0xe1, 0xd2, 0xdd,
+ 0xe8, 0x1f, 0x00, 0x00,
+ 0x00, 0x71, 0x31, 0x2f, 0x1f, 0x33, 0x23, 0x0c, 0xee, 0x00, 0x04, 0x02,
+ 0xf1, 0xe0, 0xf4, 0xb4,
+ 0xdd, 0xca, 0xf1, 0x02, 0x0d, 0x2b, 0xf0, 0x82, 0xed, 0xeb, 0x10, 0x10,
+ 0xf1, 0xef, 0x0f, 0x02,
+ 0xf4, 0xb1, 0x00, 0x2c, 0x1e, 0xbf, 0xcc, 0xeb, 0x0d, 0x0e, 0xd0, 0x02,
+ 0xf5, 0xc1, 0xc5, 0xd1,
+ 0xa1, 0xe1, 0xc0, 0xd1, 0xe1, 0x02, 0xf2, 0xa0, 0xcc, 0xed, 0xfe, 0x00,
+ 0x01, 0xee, 0xd1, 0xd7,
+ 0x05, 0xc0, 0xbd, 0xd0, 0xd1, 0xc3, 0x07, 0xe3, 0xb0, 0xec, 0xee, 0x00,
+ 0x02, 0x10, 0xcd, 0x0f,
+ 0x10, 0x4f, 0x0f, 0xce, 0xf4, 0x05, 0x12, 0xf0, 0xb0, 0x01, 0x01, 0x03,
+ 0x0d, 0x0d, 0xfd, 0xdd,
+ 0xf8, 0xdd, 0x00, 0xb1, 0xb2, 0xdf, 0xfc, 0x01, 0x10, 0xdf, 0xbf, 0x00,
+ 0x00, 0xd0, 0xb0, 0xf3,
+ 0xc1, 0xd0, 0xdf, 0xb1, 0xe5, 0xd2, 0xd1, 0x03, 0x37, 0x77, 0x24, 0x0d,
+ 0xec, 0x0f, 0x32, 0x24,
+ 0x10, 0x1f, 0x30, 0x1f, 0x0f, 0xf0, 0x24, 0x35, 0x11, 0x30, 0x1e, 0x0d,
+ 0x0e, 0x0e, 0x7f, 0x3b,
+ 0x1f, 0xfc, 0x0e, 0x0e, 0x00, 0x70, 0x34, 0x01, 0xcf, 0x01, 0x67, 0x30,
+ 0xdd, 0xda, 0x30, 0x7f,
+ 0x5f, 0x0d, 0x21, 0x12, 0x02, 0x11, 0x02, 0x1d, 0xef, 0xf0, 0x07, 0xf7,
+ 0xd2, 0x8f, 0xec, 0xe0,
+ 0x00, 0x21, 0x01, 0xa0, 0x0d, 0x0e, 0x0f, 0xee, 0xd0, 0xf4, 0x02, 0xf2,
+ 0xf3, 0xd2, 0xa1, 0xe1,
+ 0xf7, 0xd5, 0xde, 0xad, 0xfd, 0x01, 0x11, 0x0d, 0xee, 0xcf, 0x00, 0x00,
+ 0x0f, 0x17, 0x43, 0xe1,
+ 0xc4, 0xf4, 0x01, 0x0e, 0x0c, 0xf0, 0x0f, 0x1e, 0xdc, 0xaf, 0xe0, 0xdf,
+ 0xf0, 0x54, 0x40, 0x20,
+ 0x0f, 0xe0, 0x0f, 0x00, 0x37, 0x65, 0x00, 0xdf, 0xbe, 0xd0, 0xee, 0xc1,
+ 0xd3, 0xe2, 0xe1, 0x11,
+ 0x00, 0x59, 0x00, 0x30, 0x72, 0x31, 0x11, 0x10, 0x30, 0x40, 0x21, 0x10,
+ 0x2d, 0x5c, 0x02, 0x07,
+ 0x07, 0x10, 0x0e, 0xff, 0x00, 0x32, 0x50, 0x0c, 0x0e, 0x0f, 0x30, 0x4f,
+ 0x3d, 0x2d, 0x40, 0x47,
+ 0x04, 0xd0, 0xcf, 0xfa, 0x40, 0x40, 0x10, 0x20, 0x20, 0x2f, 0x1d, 0x4e,
+ 0x3c, 0x00, 0x02, 0x34,
+ 0x40, 0x20, 0xf0, 0xa3, 0xe4, 0x01, 0x12, 0x03, 0xc1, 0x10, 0x50, 0x1c,
+ 0xe9, 0xbf, 0x0f, 0xee,
+ 0x0e, 0x0e, 0x50, 0x25, 0xe0, 0xd5, 0x03, 0x21, 0x11, 0x02, 0xd2, 0xe0,
+ 0x0c, 0xee, 0xa0, 0x00,
+ 0x1c, 0x6b, 0x1f, 0x3f, 0x20, 0x1e, 0x00, 0x13, 0x76, 0x23, 0x34, 0x31,
+ 0x0e, 0x09, 0x30, 0x20,
+ 0x11, 0x20, 0x71, 0x30, 0x0f, 0x0d, 0x0f, 0x00, 0x1e, 0x30, 0x30, 0x22,
+ 0x10, 0x00, 0x57, 0x40,
+ 0xfe, 0xae, 0x01, 0xf7, 0xf0, 0x01, 0xb0, 0xef, 0xf0, 0x01, 0x32, 0x10,
+ 0x0d, 0x50, 0x45, 0x41,
+ 0x1e, 0x0b, 0x4f, 0x41, 0x25, 0x11, 0x00, 0x1f, 0x01, 0x23, 0x66, 0x22,
+ 0x03, 0xef, 0x0c, 0x2c,
+ 0x5d, 0x20, 0x20, 0x11, 0x21, 0x30, 0x3f, 0xcc, 0xdf, 0x00, 0x00, 0x01,
+ 0xff, 0x61, 0x6f, 0x08,
+ 0x3d, 0x3f, 0x3e, 0x2e, 0x2a, 0x4f, 0x70, 0x23, 0x02, 0xff, 0x00, 0x10,
+ 0x12, 0x13, 0x27, 0x12,
+ 0x11, 0x21, 0xe0, 0xed, 0x1d, 0x3e, 0x1e, 0x0b, 0x0d, 0x7e, 0x00, 0xf2,
+ 0x03, 0x74, 0x37, 0x04,
+ 0xef, 0xed, 0xe4, 0xf5, 0xe1, 0xdf, 0x1e, 0x7f, 0x3d, 0x0d, 0xfc, 0x0f,
+ 0x10, 0x43, 0x53, 0x14,
+ 0x14, 0x01, 0x21, 0x22, 0x20, 0x10, 0x20, 0x11, 0x50, 0x5e, 0x20, 0x0f,
+ 0xf8, 0x1b, 0x10, 0x20,
+ 0x44, 0x2f, 0x3d, 0x30, 0x50, 0x10, 0xf0, 0x00, 0x03, 0x53, 0xf3, 0xb1,
+ 0xcd, 0xd8, 0xef, 0xf1,
+ 0xd6, 0x92, 0xf0, 0x00, 0x0c, 0x3f, 0x41, 0x13, 0x11, 0x1d, 0x3f, 0x4e,
+ 0x1e, 0x2c, 0x23, 0x24,
+ 0x24, 0x05, 0xf1, 0xd0, 0xdf, 0x3e, 0x40, 0xee, 0xcd, 0x2e, 0x7b, 0x4c,
+ 0x0f, 0xe0, 0xff, 0xe1,
+ 0xe2, 0xc0, 0x0f, 0x50, 0xfc, 0xaf, 0x00, 0x0e, 0x18, 0x0c, 0x1f, 0x2d,
+ 0x1e, 0x0d, 0x0c, 0xf0,
+ 0xde, 0xe0, 0x12, 0x65, 0x01, 0xc5, 0xf5, 0xf2, 0xd0, 0x90, 0xf1, 0xd2,
+ 0xed, 0xdd, 0xfe, 0xbc,
+ 0xdc, 0xff, 0x00, 0x62, 0xf1, 0xe0, 0xfe, 0xe6, 0x07, 0xd4, 0xb2, 0xdf,
+ 0xd0, 0x00, 0xe3, 0xaf,
+ 0xe9, 0xff, 0xe0, 0x1f, 0x01, 0x01, 0xc1, 0x00, 0xf0, 0xf0, 0xf1, 0xf5,
+ 0xf0, 0xf2, 0x10, 0x10,
+ 0xd0, 0x9f, 0xdd, 0x0e, 0xf0, 0xd3, 0xa3, 0xcd, 0xd8, 0x0f, 0xff, 0x0f,
+ 0x0f, 0xc2, 0xe5, 0x00,
+ 0xfd, 0xcf, 0xc1, 0xd4, 0xb0, 0xdf, 0xbe, 0xc0, 0xd0, 0xed, 0xd3, 0xd7,
+ 0x05, 0xe0, 0xe0, 0xcf,
+ 0x0e, 0x20, 0x00, 0xff, 0xbc, 0x00, 0x12, 0x21, 0x00, 0xcf, 0xd2, 0xf7,
+ 0xf2, 0x03, 0x05, 0x50,
+ 0x0c, 0xee, 0x0e, 0x00, 0x0e, 0xdb, 0xe0, 0xf0, 0x0e, 0x00, 0x90, 0xf4,
+ 0xf1, 0x12, 0x0c, 0x10,
+ 0x10, 0x7f, 0x3d, 0x1d, 0x0e, 0x0a, 0x2e, 0x5c, 0x3d, 0x4e, 0x2e, 0x2f,
+ 0x0f, 0x56, 0x42, 0x24,
+ 0x03, 0x00, 0xf1, 0xf3, 0xc0, 0xbe, 0xfc, 0x00, 0x1e, 0x5c, 0xf0, 0xe0,
+ 0xf8, 0x1e, 0x00, 0xf6,
+ 0xc1, 0xe4, 0xf0, 0xb1, 0xb0, 0xd0, 0xf0, 0x11, 0x10, 0x0e, 0xff, 0xfe,
+ 0xe0, 0xdf, 0xe9, 0xf0,
+ 0x10, 0xb3, 0x8f, 0xff, 0x02, 0x15, 0x20, 0x03, 0xf2, 0x12, 0x1f, 0xee,
+ 0xbd, 0x0e, 0x0e, 0xf0,
+ 0xe1, 0xff, 0x0c, 0x22, 0x11, 0x49, 0x7f, 0x56, 0x02, 0xd0, 0x01, 0x30,
+ 0xf1, 0xbc, 0xed, 0xc0,
+ 0xec, 0xc0, 0xf1, 0xe5, 0x02, 0x02, 0x20, 0x0f, 0x2e, 0x24, 0x41, 0x4c,
+ 0x3e, 0x4f, 0x11, 0x00,
+ 0x2a, 0x20, 0x33, 0x41, 0x42, 0x20, 0x46, 0x33, 0x31, 0x3e, 0x3c, 0x5f,
+ 0x2d, 0x4e, 0x2f, 0x0d,
+ 0x1f, 0x20, 0x24, 0x34, 0x0c, 0x0d, 0x4d, 0x50, 0x13, 0x23, 0x50, 0x38,
+ 0x5b, 0x20, 0x20, 0x2e,
+ 0x2b, 0x2e, 0x6f, 0x30, 0x34, 0x11, 0x32, 0x00, 0x1e, 0x33, 0x06, 0xe1,
+ 0xd2, 0x21, 0x60, 0x00,
+ 0x0d, 0x1e, 0x2c, 0x5b, 0x5f, 0x10, 0x00, 0x00, 0xf3, 0xf2, 0x10, 0x14,
+ 0xe5, 0xc3, 0xe0, 0xf0,
+ 0x00, 0x50, 0x04, 0x0d, 0xf9, 0x20, 0x11, 0xe0, 0x8f, 0x0e, 0x41, 0x10,
+ 0x2f, 0x02, 0x57, 0x14,
+ 0x1f, 0x50, 0x21, 0x00, 0xff, 0xff, 0x01, 0xf1, 0xfd, 0x0b, 0x0e, 0x0d,
+ 0x4d, 0x20, 0x4e, 0x3f,
+ 0x63, 0x37, 0x16, 0x0e, 0xae, 0xff, 0x00, 0xf1, 0xfe, 0xbe, 0x01, 0x05,
+ 0x10, 0x00, 0x19, 0x00,
+ 0x7e, 0xff, 0xe9, 0x09, 0xc9, 0x04, 0x26, 0x0c, 0x16, 0xe2, 0x40, 0x70,
+ 0x70, 0x60, 0x20, 0x06,
+ 0x00, 0x0f, 0x0c, 0x4e, 0x01, 0x05, 0x02, 0x02, 0x04, 0xe5, 0x04, 0xe2,
+ 0x00, 0x12, 0x23, 0x00,
+ 0xd1, 0xe1, 0xf2, 0x32, 0x72, 0x01, 0xa5, 0xe6, 0x00, 0x00, 0x10, 0xe7,
+ 0xd4, 0xf2, 0x01, 0x4e,
+ 0x00, 0xef, 0xce, 0x2f, 0x7d, 0x4f, 0x2d, 0x0c, 0x0e, 0x0c, 0x1f, 0x3f,
+ 0x1f, 0x8c, 0xd2, 0xf4,
+ 0xd3, 0x03, 0xe2, 0xed, 0xf8, 0xfc, 0x21, 0x70, 0x1c, 0xee, 0xee, 0x0d,
+ 0x2d, 0x1d, 0xd0, 0xb2,
+ 0x03, 0x10, 0x3e, 0xfe, 0xbf, 0x0d, 0x57, 0x27, 0x00, 0xdc, 0xf0, 0x20,
+ 0x0e, 0xed, 0xff, 0x41,
+ 0x20, 0x0f, 0x70, 0x1f, 0x1e, 0x01, 0x07, 0x46, 0x20, 0xe0, 0xa0, 0x00,
+ 0xf0, 0xff, 0x00, 0x13,
+ 0x1e, 0x0d, 0x72, 0x47, 0xf1, 0xdf, 0x00, 0x00, 0x01, 0xf0, 0xe0, 0xf1,
+ 0xcf, 0xcf, 0x01, 0xe2,
+ 0xf2, 0xf6, 0xe2, 0x02, 0x76, 0x02, 0x12, 0x2f, 0x4d, 0x4f, 0x0e, 0xfe,
+ 0xfb, 0x1d, 0x4f, 0x32,
+ 0x07, 0xd2, 0xf1, 0xf0, 0x00, 0x00, 0x2f, 0xd2, 0xb6, 0x10, 0x61, 0x0f,
+ 0xb0, 0xee, 0x0e, 0x00,
+ 0x10, 0xe2, 0xc3, 0x01, 0x07, 0x03, 0x12, 0x2c, 0xdc, 0x10, 0x50, 0x3e,
+ 0x3e, 0x0e, 0x0c, 0xe9,
+ 0x2c, 0x7e, 0x0c, 0xfe, 0x9d, 0x0e, 0xfe, 0xf0, 0xfd, 0xdc, 0xef, 0x00,
+ 0x2e, 0x2d, 0x18, 0x1f,
+ 0x6d, 0x1c, 0x2d, 0xee, 0xef, 0xfb, 0x0f, 0x1e, 0xff, 0xce, 0x00, 0x00,
+ 0x52, 0x00, 0xde, 0xfb,
+ 0x0e, 0x1f, 0xfe, 0xac, 0x0d, 0x3e, 0x6d, 0x3d, 0x5e, 0x2e, 0x0d, 0x20,
+ 0x30, 0x40, 0x15, 0x04,
+ 0xb2, 0xd0, 0xeb, 0xff, 0xee, 0xde, 0x0d, 0x4f, 0x53, 0x02, 0xef, 0xff,
+ 0x55, 0x32, 0x0e, 0x00,
+ 0xc3, 0xe3, 0xdf, 0x0a, 0x0b, 0xcd, 0xc0, 0xe1, 0xd0, 0xeb, 0x0f, 0xd2,
+ 0x06, 0x21, 0x50, 0x70,
+ 0x2d, 0x0f, 0x1e, 0x2f, 0x20, 0x24, 0x21, 0x03, 0xf2, 0xd2, 0x14, 0x10,
+ 0xf2, 0xc4, 0xe5, 0x02,
+ 0x77, 0x73, 0x04, 0x00, 0xdf, 0x01, 0x12, 0x01, 0xe4, 0xc3, 0x03, 0xd1,
+ 0xd0, 0xee, 0x01, 0xe7,
+ 0x05, 0x01, 0x52, 0x00, 0xe1, 0xf0, 0x70, 0x51, 0x00, 0xfb, 0x0e, 0x1f,
+ 0x3c, 0x0e, 0xae, 0x00,
+ 0x05, 0x13, 0xf1, 0xe1, 0xd0, 0xf0, 0xf1, 0x00, 0xde, 0xe8, 0x0f, 0x0d,
+ 0x2d, 0x1d, 0xce, 0xcc,
+ 0x0e, 0x30, 0x51, 0x13, 0x01, 0xf1, 0xd0, 0x9e, 0x0c, 0x0d, 0x1e, 0x30,
+ 0x0b, 0xdb, 0xfd, 0x0d,
+ 0x3c, 0x7c, 0x7e, 0x3d, 0x10, 0xf0, 0xe2, 0xf0, 0x2e, 0x42, 0x17, 0xe1,
+ 0xdf, 0x0f, 0xee, 0x2f,
+ 0x0d, 0xe0, 0x23, 0x3e, 0x78, 0x60, 0x00, 0x00, 0xfc, 0x00, 0x20, 0x20,
+ 0xcf, 0xdb, 0x00, 0xe0,
+ 0xc2, 0xb0, 0xc2, 0xe0, 0xf0, 0xd2, 0x00, 0x2f, 0x3c, 0x60, 0x2d, 0x4e,
+ 0x34, 0x21, 0xf7, 0x07,
+ 0x10, 0x0e, 0xef, 0xc1, 0xf3, 0x16, 0x31, 0x02, 0xf0, 0x11, 0x70, 0x14,
+ 0xf4, 0xc2, 0xe3, 0x02,
+ 0xd2, 0xe2, 0xc2, 0xd3, 0xf4, 0xe4, 0x04, 0xf4, 0x02, 0x03, 0xd3, 0x34,
+ 0x77, 0x21, 0x21, 0x21,
+ 0x00, 0x2e, 0x30, 0xe0, 0xc0, 0xdf, 0x0f, 0x71, 0x14, 0x94, 0xe1, 0xf4,
+ 0xf3, 0x00, 0xe4, 0x03,
+ 0x52, 0x1e, 0x0e, 0xf0, 0x0c, 0xdd, 0x2f, 0x70, 0x10, 0x00, 0xe2, 0xc1,
+ 0xff, 0x11, 0x57, 0x17,
+ 0x04, 0xb0, 0xf0, 0x00, 0x44, 0x00, 0xd0, 0x00, 0x03, 0x3f, 0x3d, 0x50,
+ 0x10, 0xf4, 0x15, 0x43,
+ 0x10, 0x0f, 0xf0, 0xf2, 0x02, 0x14, 0x25, 0xe1, 0x81, 0xfe, 0xfd, 0x10,
+ 0x35, 0xd2, 0xf1, 0x21,
+ 0x60, 0x1d, 0x0f, 0xf0, 0xe0, 0x09, 0xd0, 0xe0, 0x80, 0xe0, 0xe7, 0xe2,
+ 0xbd, 0xfe, 0x00, 0x3f,
+ 0x10, 0x13, 0x57, 0x11, 0x10, 0x1c, 0x20, 0x31, 0xee, 0x9f, 0x0f, 0x02,
+ 0x26, 0x11, 0x00, 0xff,
+ 0x10, 0x55, 0x13, 0x02, 0xff, 0x01, 0x55, 0x03, 0xf2, 0xd1, 0xf4, 0x00,
+ 0xf2, 0xe2, 0xe4, 0xa4,
+ 0xe2, 0xf5, 0x04, 0x04, 0xf2, 0xd2, 0x00, 0x30, 0x41, 0x20, 0x4e, 0x71,
+ 0x41, 0x10, 0x0d, 0x0f,
+ 0xd2, 0x07, 0x12, 0x23, 0xe3, 0xb3, 0xd5, 0xe0, 0xff, 0x20, 0x50, 0xff,
+ 0xba, 0x0f, 0x1f, 0x00,
+ 0x22, 0xdf, 0xdd, 0xef, 0x00, 0x00, 0x22, 0x02, 0xc2, 0xd3, 0x16, 0x00,
+ 0xad, 0xf0, 0x1e, 0x5e,
+ 0x08, 0x10, 0x00, 0xdb, 0x2e, 0x70, 0x60, 0x0f, 0xed, 0x00, 0x13, 0x21,
+ 0x03, 0x02, 0xf5, 0xf1,
+ 0x0f, 0x0e, 0xbb, 0xed, 0x23, 0x56, 0x13, 0x11, 0x20, 0x10, 0x4b, 0x51,
+ 0x01, 0xe0, 0xce, 0x03,
+ 0xe5, 0xdf, 0xbc, 0xe0, 0xef, 0xcf, 0xf0, 0x06, 0x02, 0xf1, 0x0f, 0x60,
+ 0x35, 0x30, 0xe0, 0x00,
+ 0x20, 0x4e, 0x1f, 0xf1, 0xd5, 0x20, 0x3e, 0x73, 0x07, 0x12, 0x00, 0xe1,
+ 0x00, 0x02, 0xe4, 0x02,
+ 0xf4, 0xe0, 0x1f, 0x40, 0xa0, 0xc1, 0x03, 0x07, 0x33, 0xe1, 0xb3, 0xe4,
+ 0xe2, 0xe0, 0x02, 0x21,
+ 0x70, 0x1f, 0xf9, 0x0d, 0x6e, 0x1e, 0x0e, 0xfc, 0xfe, 0x1d, 0x00, 0xfe,
+ 0xcd, 0xfe, 0xf0, 0x0f,
+ 0x09, 0xed, 0x0c, 0x2e, 0x4c, 0x0c, 0xef, 0xfc, 0x0c, 0xed, 0xdb, 0x2e,
+ 0x6d, 0x2d, 0xfe, 0x0e,
+ 0x2f, 0x3e, 0x1f, 0x00, 0xeb, 0x8c, 0xde, 0x0e, 0xad, 0xeb, 0xfd, 0xfe,
+ 0x2c, 0x3d, 0x5c, 0x5e,
+ 0x4f, 0x20, 0x00, 0x00, 0xfc, 0x1e, 0x2e, 0x0d, 0xcc, 0xde, 0xfd, 0xdf,
+ 0xfe, 0xcb, 0x1f, 0x5e,
+ 0x2d, 0x4c, 0x20, 0x00, 0xef, 0x0a, 0x1f, 0x00, 0xdd, 0x8d, 0xec, 0xde,
+ 0xed, 0xfe, 0xee, 0xc1,
+ 0xf0, 0x20, 0x39, 0x00, 0x10, 0x50, 0x0e, 0x2a, 0x0f, 0x00, 0x0f, 0xff,
+ 0x52, 0x71, 0x3f, 0x0d,
+ 0xd0, 0x13, 0x37, 0x41, 0x12, 0x03, 0xd0, 0xc2, 0x02, 0x3f, 0x51, 0x17,
+ 0x03, 0x12, 0x30, 0xe5,
+ 0xa3, 0xf3, 0xe1, 0xc2, 0xd5, 0x04, 0xf4, 0xf2, 0xf1, 0x20, 0x74, 0x41,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x20, 0xd0, 0xbe, 0xff, 0x01, 0x03, 0xf0, 0xeb, 0x20, 0x52, 0x26, 0x02,
+ 0xff, 0xfc, 0xde, 0xe0,
+ 0xde, 0x98, 0xfd, 0xef, 0xed, 0x0d, 0x1e, 0x00, 0xee, 0xed, 0x5e, 0x62,
+ 0x03, 0xe1, 0xda, 0xde,
+ 0x0e, 0x1f, 0xfd, 0xc8, 0x2e, 0x7d, 0x20, 0x1f, 0xf0, 0x22, 0x3e, 0x0a,
+ 0x0e, 0xdd, 0xf0, 0x00,
+ 0xe0, 0xcd, 0x0e, 0xd1, 0xe0, 0xfe, 0x28, 0x70, 0x72, 0x30, 0x00, 0x20,
+ 0x40, 0x0d, 0xfd, 0xe0,
+ 0x01, 0xe2, 0xfe, 0x0b, 0xa0, 0xdf, 0xd2, 0xe7, 0x05, 0x00, 0xe1, 0xcf,
+ 0xec, 0x00, 0x12, 0x33,
+ 0x51, 0x30, 0x54, 0x13, 0x10, 0x30, 0x10, 0x13, 0x01, 0x66, 0x14, 0x02,
+ 0xd3, 0xe2, 0x11, 0x42,
+ 0x02, 0x23, 0x47, 0x34, 0x11, 0x03, 0xd3, 0xf3, 0xb4, 0xa3, 0xf4, 0xd4,
+ 0xc2, 0xc4, 0xe3, 0x04,
+ 0x03, 0x02, 0x42, 0x64, 0x22, 0x11, 0x0f, 0x01, 0xe2, 0xf0, 0x22, 0x02,
+ 0xb1, 0xff, 0x01, 0xf6,
+ 0x05, 0x03, 0x23, 0x03, 0xa0, 0x00, 0x13, 0x01, 0xc0, 0xe8, 0x00, 0x2f,
+ 0x10, 0xd1, 0x00, 0x50,
+ 0x6e, 0x1f, 0x00, 0xc7, 0x04, 0x10, 0x10, 0xd0, 0xbf, 0xdc, 0x00, 0x0f,
+ 0x00, 0x23, 0x10, 0x00,
+ 0x00, 0x5f, 0x61, 0x24, 0x03, 0x00, 0x1e, 0x10, 0x02, 0xd0, 0xd1, 0x07,
+ 0x06, 0x02, 0x33, 0x00,
+ 0x9e, 0x0d, 0x02, 0x25, 0x40, 0x14, 0x32, 0x10, 0xff, 0xce, 0xed, 0xee,
+ 0xf1, 0xd4, 0x04, 0x03,
+ 0x83, 0xbf, 0xfe, 0xea, 0x0e, 0xfe, 0x0d, 0x00, 0x15, 0x32, 0x5d, 0x0d,
+ 0x1e, 0x4e, 0x21, 0x17,
+ 0x03, 0xd0, 0xcf, 0x15, 0x23, 0xe1, 0xf1, 0x23, 0x72, 0x50, 0x26, 0x23,
+ 0x31, 0x3f, 0x0e, 0x03,
+ 0x25, 0x00, 0xb0, 0xd5, 0xc4, 0xe2, 0xa4, 0xe2, 0x03, 0x05, 0x42, 0x10,
+ 0x12, 0xf1, 0xdf, 0x0d,
+ 0x2e, 0x40, 0xfe, 0xe0, 0x0d, 0xd8, 0x0c, 0x30, 0x43, 0x03, 0xd0, 0x3f,
+ 0x6e, 0xde, 0xa0, 0xe0,
+ 0x0f, 0x1d, 0x0a, 0x0d, 0xcc, 0x0b, 0x2e, 0x4d, 0xff, 0xb0, 0xef, 0xf0,
+ 0x13, 0x0d, 0xdc, 0xef,
+ 0xe0, 0xee, 0x98, 0x0f, 0x30, 0x2d, 0x0e, 0xdc, 0x30, 0x74, 0x0c, 0xfd,
+ 0x51, 0x20, 0xed, 0x0d,
+ 0x01, 0x1e, 0x0b, 0xe1, 0x36, 0xe0, 0xcd, 0x32, 0x01, 0x9c, 0x10, 0x53,
+ 0x16, 0x0f, 0xdc, 0x71,
+ 0x00, 0x0e, 0x32, 0xf1, 0xef, 0x03, 0x04, 0xdf, 0xfd, 0xe1, 0xe3, 0xef,
+ 0xf0, 0xe0, 0xf4, 0x25,
+ 0x10, 0xcd, 0xf1, 0x66, 0x31, 0x21, 0xff, 0x00, 0xd3, 0xe0, 0xcf, 0xde,
+ 0x01, 0x24, 0x40, 0x72,
+ 0x37, 0x02, 0x0f, 0x40, 0x5e, 0x41, 0x24, 0x1f, 0xca, 0xff, 0xff, 0xdf,
+ 0xee, 0xf6, 0xa1, 0xd0,
+ 0x00, 0x10, 0x02, 0x03, 0xe0, 0x32, 0x70, 0x0e, 0x1e, 0x0c, 0x09, 0x0e,
+ 0x30, 0x00, 0xe0, 0xbe,
+ 0x0d, 0x0d, 0x0c, 0xff, 0xe0, 0xd2, 0xaf, 0xe8, 0x0f, 0x3f, 0x1d, 0xfc,
+ 0x1e, 0x4f, 0xfc, 0x0d,
+ 0x1d, 0x2e, 0x50, 0x1c, 0x1d, 0xe0, 0xb2, 0xee, 0x0b, 0x10, 0x12, 0xad,
+ 0xec, 0x00, 0x20, 0xda,
+ 0x00, 0x10, 0x50, 0x3e, 0xfa, 0x1f, 0x7f, 0x30, 0x03, 0x02, 0x0f, 0x0b,
+ 0x00, 0xef, 0xef, 0xf0,
+ 0xf4, 0xf2, 0xa1, 0xfd, 0xfc, 0x70, 0x20, 0x10, 0x1d, 0x3d, 0x10, 0x01,
+ 0x07, 0xe0, 0xdf, 0xff,
+ 0xaf, 0xee, 0xe0, 0xef, 0xc0, 0xef, 0x02, 0xe3, 0xe8, 0x3e, 0x70, 0x51,
+ 0x01, 0x0f, 0xdf, 0x0f,
+ 0x1d, 0x0e, 0xf0, 0xf5, 0x01, 0x10, 0x01, 0xe7, 0xa2, 0x06, 0x52, 0x21,
+ 0x50, 0x0e, 0x0c, 0x10,
+ 0x3f, 0x00, 0x01, 0x04, 0xc0, 0xe1, 0x01, 0x13, 0xd7, 0xb6, 0xe1, 0xc1,
+ 0xf1, 0x00, 0x52, 0x45,
+ 0x9a, 0xfe, 0x47, 0x00, 0xef, 0x0f, 0x21, 0x11, 0xee, 0xf0, 0x32, 0x11,
+ 0xb0, 0x0e, 0x12, 0x24,
+ 0x0f, 0xad, 0x00, 0x22, 0x01, 0x00, 0xfe, 0xed, 0xee, 0x20, 0x33, 0x0d,
+ 0xef, 0x05, 0x02, 0x01,
+ 0xec, 0x10, 0x22, 0x10, 0xf5, 0x80, 0xf0, 0xf1, 0x00, 0xeb, 0x20, 0x50,
+ 0x0d, 0x12, 0x33, 0xfc,
+ 0x1e, 0x72, 0xfc, 0x0f, 0x00, 0x1d, 0x00, 0xd2, 0xcf, 0x07, 0x23, 0xff,
+ 0xbb, 0x00, 0x6f, 0x30,
+ 0x11, 0x0f, 0xdc, 0x00, 0x50, 0x10, 0xf8, 0xf0, 0x22, 0x0f, 0xbb, 0xff,
+ 0x01, 0x24, 0xf0, 0xce,
+ 0xfc, 0x11, 0x21, 0xff, 0xac, 0x00, 0x00, 0x33, 0x0e, 0xca, 0x10, 0x30,
+ 0x00, 0xd0, 0xf0, 0x15,
+ 0x13, 0xd0, 0xec, 0x70, 0x71, 0x00, 0x00, 0x00, 0x1e, 0x0d, 0x0f, 0x20,
+ 0x10, 0xf0, 0xc2, 0xf7,
+ 0xd4, 0xd2, 0x02, 0xf3, 0xbf, 0xe0, 0x02, 0x26, 0x32, 0x00, 0x00, 0x11,
+ 0x33, 0x40, 0xfc, 0x0e,
+ 0x56, 0x02, 0xe0, 0x90, 0xf1, 0x14, 0x02, 0x12, 0x00, 0xd2, 0x06, 0xe0,
+ 0xbe, 0xff, 0x30, 0x24,
+ 0xce, 0xce, 0x0f, 0x10, 0x62, 0x13, 0x00, 0x0e, 0x01, 0x57, 0x07, 0xe0,
+ 0x0f, 0xf1, 0xf0, 0xd0,
+ 0xd0, 0x22, 0x01, 0x10, 0x70, 0x21, 0x34, 0x13, 0xfe, 0x0c, 0x72, 0x30,
+ 0xf1, 0xd6, 0xf2, 0xdd,
+ 0xdf, 0x04, 0x00, 0xb0, 0x33, 0x43, 0x30, 0xfc, 0xbe, 0x11, 0x21, 0x30,
+ 0x2e, 0x1d, 0xee, 0xa8,
+ 0x0b, 0x00, 0x03, 0xf0, 0xbe, 0x0e, 0xfd, 0x1e, 0x23, 0xab, 0x01, 0x02,
+ 0xcb, 0x10, 0x1e, 0x2b,
+ 0x2e, 0x20, 0xbe, 0xee, 0x04, 0x0f, 0xde, 0x03, 0x11, 0xe0, 0xbd, 0x01,
+ 0x00, 0x62, 0x53, 0x1b,
+ 0x09, 0x0d, 0x2e, 0x20, 0x1f, 0x10, 0xf0, 0xe0, 0xe4, 0xe1, 0xe1, 0xd2,
+ 0x27, 0xe3, 0xb0, 0xf3,
+ 0xd1, 0x02, 0x11, 0x10, 0x22, 0x12, 0xf0, 0xff, 0x61, 0x20, 0x42, 0xe0,
+ 0xe5, 0x36, 0x51, 0x01,
+ 0xe4, 0x02, 0x10, 0xf0, 0xa1, 0x03, 0xbf, 0xfe, 0xff, 0x0a, 0x4f, 0x0e,
+ 0x0e, 0x00, 0x71, 0x57,
+ 0x02, 0xe2, 0xe0, 0x03, 0x03, 0xef, 0x03, 0xe3, 0xc0, 0xe0, 0xdd, 0xfb,
+ 0x25, 0x65, 0x11, 0x1f,
+ 0x3c, 0x3f, 0x51, 0x00, 0xdd, 0x01, 0xed, 0x67, 0x8c, 0x0a, 0x57, 0xd0,
+ 0xeb, 0x44, 0x00, 0xee,
+ 0xf0, 0x10, 0x43, 0x0f, 0x00, 0xed, 0xde, 0x75, 0x01, 0xed, 0x00, 0x11,
+ 0x10, 0x01, 0xfe, 0xef,
+ 0x14, 0x00, 0xcd, 0x13, 0x11, 0xfc, 0xdd, 0x34, 0x22, 0xb9, 0x10, 0x21,
+ 0xf0, 0x32, 0xce, 0xee,
+ 0x24, 0x00, 0xbf, 0x10, 0x45, 0x00, 0xcd, 0x30, 0x52, 0x01, 0x0c, 0xee,
+ 0x32, 0x45, 0xdd, 0xcc,
+ 0x22, 0x22, 0x03, 0xff, 0xcc, 0x02, 0x35, 0xe0, 0xcf, 0x00, 0x54, 0xe0,
+ 0xee, 0x32, 0xf0, 0xfe,
+ 0x01, 0x00, 0xed, 0x00, 0x76, 0x10, 0x00, 0xe0, 0xfe, 0xfe, 0x25, 0x52,
+ 0xcc, 0xf0, 0x23, 0xff,
+ 0xb9, 0x00, 0x32, 0x0f, 0xdd, 0x30, 0x32, 0x10, 0xfe, 0x00, 0xee, 0x10,
+ 0x32, 0x00, 0xee, 0x88,
+ 0x11, 0x00, 0xdf, 0x00, 0xf0, 0x44, 0x0e, 0xdc, 0x60, 0xfe, 0x32, 0x23,
+ 0x88, 0x0f, 0x21, 0x00,
+ 0xff, 0x10, 0x0f, 0xfe, 0xf0, 0x14, 0xff, 0xfe, 0x44, 0xfd, 0xbb, 0x10,
+ 0x10, 0x42, 0xff, 0xca,
+ 0x20, 0x73, 0xfd, 0xdc, 0x12, 0x1f, 0x11, 0x0f, 0xcc, 0x13, 0x0f, 0xed,
+ 0x00, 0xfe, 0x21, 0x44,
+ 0xda, 0xdd, 0x30, 0x22, 0xfd, 0xf0, 0x00, 0xac, 0x01, 0x14, 0xef, 0xcd,
+ 0x23, 0x12, 0x0e, 0x1d,
+ 0x75, 0x41, 0x0e, 0xdb, 0x30, 0x44, 0xdd, 0xed, 0x24, 0x20, 0x20, 0xe0,
+ 0xbd, 0x15, 0x12, 0xf0,
+ 0x02, 0x14, 0xe0, 0xde, 0x00, 0xf2, 0x03, 0xf0, 0xef, 0xdf, 0x20, 0x77,
+ 0x72, 0xf0, 0xef, 0xf0,
+ 0x36, 0x21, 0x00, 0xd1, 0x01, 0x00, 0xcf, 0xcc, 0x01, 0x77, 0x00, 0xee,
+ 0xed, 0x31, 0x23, 0xfd,
+ 0x00, 0x35, 0xee, 0xce, 0x0e, 0x22, 0x44, 0xcd, 0xbd, 0x00, 0x05, 0x10,
+ 0x0e, 0x00, 0xf0, 0x0e,
+ 0x1f, 0x42, 0x00, 0xee, 0x2d, 0x2c, 0x0e, 0x20, 0x01, 0xba, 0x02, 0x11,
+ 0x9c, 0x00, 0x00, 0xd0,
+ 0x00, 0x0c, 0x21, 0x01, 0xfc, 0x0f, 0x2a, 0x70, 0x73, 0x0b, 0xf0, 0x1f,
+ 0x1f, 0x00, 0xef, 0xfd,
+ 0x02, 0xef, 0xb8, 0x11, 0x23, 0xdf, 0xed, 0x10, 0x20, 0x40, 0x0f, 0xdb,
+ 0xdf, 0x40, 0xf0, 0x0f,
+ 0x12, 0x8a, 0xe2, 0x04, 0x10, 0x00, 0x01, 0x24, 0x75, 0xfc, 0x88, 0x65,
+ 0x11, 0xcc, 0x00, 0x21,
+ 0x11, 0x00, 0xdd, 0x12, 0x21, 0x00, 0xe0, 0x00, 0x23, 0xf0, 0xee, 0x01,
+ 0x03, 0x00, 0xe0, 0xee,
+ 0x23, 0x34, 0xcd, 0x00, 0x52, 0xf1, 0x00, 0x13, 0x00, 0x14, 0x35, 0xd0,
+ 0xdf, 0xd0, 0x03, 0x54,
+ 0xcd, 0xef, 0x01, 0xfe, 0x00, 0x27, 0x00, 0x00, 0x20, 0x20, 0x3f, 0x72,
+ 0x0f, 0xc0, 0x14, 0x02,
+ 0x02, 0xed, 0xdc, 0x12, 0x25, 0xc0, 0xf1, 0xf1, 0xd0, 0x22, 0xef, 0x2f,
+ 0x70, 0x51, 0x0f, 0xc8,
+ 0x20, 0x45, 0x12, 0xf0, 0xde, 0xf0, 0xe0, 0x23, 0x01, 0x24, 0xc0, 0xbe,
+ 0x13, 0x00, 0x0f, 0x30,
+ 0x0d, 0x21, 0x31, 0x0a, 0x76, 0x00, 0xcd, 0xff, 0xf0, 0x23, 0x01, 0x9b,
+ 0x11, 0x27, 0xf0, 0xdd,
+ 0x11, 0x31, 0x21, 0xff, 0x99, 0x00, 0x30, 0xf0, 0xaf, 0x0f, 0x01, 0x10,
+ 0xf1, 0x00, 0x01, 0x01,
+ 0xfd, 0x02, 0x66, 0x10, 0x0e, 0xdb, 0x30, 0x42, 0x0f, 0xeb, 0x20, 0x62,
+ 0x00, 0xee, 0x02, 0x32,
+ 0x00, 0xc0, 0x00, 0x17, 0x23, 0xbd, 0xee, 0x00, 0x14, 0x11, 0xff, 0xcc,
+ 0x22, 0x31, 0xef, 0x1f,
+ 0x62, 0x01, 0xcd, 0x17, 0x34, 0xfd, 0xe0, 0x1f, 0xef, 0x01, 0x02, 0xf0,
+ 0x00, 0xcd, 0x30, 0x77,
+ 0x0f, 0xdf, 0x0d, 0x56, 0x10, 0xcf, 0x22, 0xcc, 0xed, 0x46, 0x00, 0xde,
+ 0x11, 0x01, 0xf0, 0xf0,
+ 0xe0, 0xfe, 0x00, 0x30, 0x72, 0x0d, 0xdd, 0x33, 0x24, 0xd9, 0x00, 0x04,
+ 0x78, 0x00, 0xac, 0x00,
+ 0x3f, 0x12, 0x86, 0xf2, 0xb9, 0x10, 0x00, 0xf2, 0x53, 0x00, 0xc8, 0xff,
+ 0x02, 0xb0, 0xac, 0xde,
+ 0xe1, 0xf3, 0xe4, 0xd0, 0xd0, 0x03, 0x03, 0x01, 0x00, 0x1f, 0x32, 0x2f,
+ 0x1a, 0x4f, 0x40, 0x0f,
+ 0xeb, 0xf2, 0x57, 0x12, 0xf0, 0xf0, 0x11, 0x42, 0x00, 0xed, 0xfe, 0xba,
+ 0xce, 0xf0, 0xd0, 0x9e,
+ 0xdf, 0xd1, 0xd3, 0xb5, 0xe5, 0xc2, 0xd1, 0xe4, 0xe1, 0xe1, 0x03, 0x12,
+ 0x0e, 0x2f, 0x3f, 0xb8,
+ 0x70, 0x76, 0xfc, 0x0f, 0x22, 0x11, 0x10, 0x0e, 0x00, 0x11, 0x34, 0x23,
+ 0xde, 0xcc, 0x23, 0x33,
+ 0xfe, 0xfd, 0x00, 0x42, 0x21, 0x00, 0x1e, 0x2f, 0x30, 0x64, 0x11, 0x0f,
+ 0x0f, 0x0a, 0x00, 0x00,
+ 0xcc, 0x00, 0xbc, 0xa8, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x0f, 0x0d, 0xeb,
+ 0x0f, 0x30, 0x40, 0x00,
+ 0xcb, 0xee, 0x11, 0x00, 0xbe, 0xee, 0xef, 0x00, 0x00, 0xdf, 0xde, 0x0f,
+ 0x2f, 0x20, 0x1f, 0x30,
+ 0x0d, 0x0d, 0x30, 0x88, 0x00, 0x54, 0xdd, 0xcd, 0x01, 0x02, 0x03, 0xd0,
+ 0xf0, 0x05, 0xe0, 0xcd,
+ 0x10, 0x73, 0x22, 0x0c, 0x0a, 0x1e, 0x1f, 0x40, 0x32, 0x11, 0x00, 0xff,
+ 0x01, 0x12, 0x34, 0xfd,
+ 0x0e, 0x3f, 0xf8, 0x72, 0x1f, 0xc9, 0x0f, 0x20, 0x30, 0xdf, 0x8d, 0x00,
+ 0xe0, 0xe0, 0xe2, 0xc1,
+ 0xd2, 0xc0, 0xba, 0x0f, 0x00, 0x11, 0x00, 0x0c, 0xfc, 0x2f, 0x50, 0x2f,
+ 0x2d, 0x40, 0x20, 0x20,
+ 0x45, 0x11, 0x36, 0x21, 0x32, 0x54, 0x01, 0x00, 0x12, 0x14, 0x22, 0xf0,
+ 0xbe, 0x02, 0x47, 0x00,
+ 0xff, 0x21, 0x44, 0x00, 0x00, 0x12, 0x22, 0x22, 0x00, 0xdf, 0xf0, 0xf0,
+ 0xbe, 0xee, 0xed, 0x10,
+ 0x1d, 0x1c, 0x3d, 0x4d, 0x60, 0x1e, 0x19, 0x0e, 0x0f, 0x01, 0xbe, 0xbb,
+ 0xee, 0xde, 0xf1, 0xe0,
+ 0xbb, 0xef, 0xee, 0xef, 0x00, 0x0f, 0xfd, 0x0e, 0xfa, 0xee, 0xfd, 0x0e,
+ 0xeb, 0xbd, 0xec, 0x10,
+ 0xe0, 0x88, 0xe0, 0x56, 0x8d, 0xfe, 0x02, 0x00, 0x0f, 0xfe, 0x00, 0x10,
+ 0x10, 0x0d, 0x1d, 0x20,
+ 0x23, 0x1e, 0x0b, 0x10, 0x11, 0x10, 0x30, 0x20, 0x2d, 0x5f, 0x2f, 0x2d,
+ 0x50, 0x0a, 0x1c, 0x2f,
+ 0x1d, 0xd9, 0xef, 0x00, 0xb0, 0xd0, 0xb0, 0xc0, 0xf1, 0xf1, 0x02, 0xd0,
+ 0xdd, 0x03, 0x23, 0x2f,
+ 0x61, 0x1e, 0x08, 0x2d, 0x4e, 0x2d, 0x1e, 0x30, 0x40, 0x33, 0x41, 0x22,
+ 0x24, 0x22, 0x22, 0x36,
+ 0x13, 0x13, 0x03, 0x02, 0xd1, 0x03, 0x23, 0x01, 0x23, 0x77, 0x44, 0x00,
+ 0x43, 0x57, 0x11, 0x12,
+ 0x01, 0xe0, 0xe1, 0x04, 0x02, 0xb0, 0xd0, 0xd0, 0xf3, 0x02, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x13,
+ 0x07, 0x90, 0xd0, 0x01, 0xf4, 0xb0, 0xe1, 0xe2, 0xe4, 0xf4, 0x04, 0x02,
+ 0xd1, 0xb1, 0x04, 0x34,
+ 0x22, 0x00, 0x55, 0x43, 0x12, 0x00, 0x00, 0x65, 0x23, 0xf0, 0xe3, 0xe4,
+ 0xb1, 0xe2, 0x04, 0x03,
+ 0x04, 0x01, 0xf0, 0x51, 0x52, 0x10, 0x30, 0x34, 0x0f, 0xfd, 0xfd, 0xff,
+ 0x02, 0xec, 0xbb, 0x00,
+ 0x01, 0xef, 0xfc, 0x40, 0x70, 0x30, 0x1c, 0x1a, 0x0d, 0x0c, 0x10, 0x0f,
+ 0xf0, 0xe0, 0x8d, 0xe3,
+ 0x07, 0xf2, 0xa0, 0xef, 0xf3, 0xf4, 0xf1, 0xe0, 0xef, 0xff, 0x0e, 0x0d,
+ 0x0d, 0x20, 0x2f, 0x08,
+ 0x1f, 0x71, 0x43, 0x11, 0x10, 0x13, 0x47, 0x23, 0x12, 0x01, 0xf1, 0x02,
+ 0x03, 0x04, 0x02, 0x12,
+ 0x44, 0x44, 0x34, 0x32, 0x22, 0x22, 0x33, 0x34, 0x24, 0x02, 0xd2, 0x92,
+ 0x05, 0xf2, 0xb0, 0xf2,
+ 0xf0, 0x01, 0x21, 0x20, 0x20, 0x70, 0x21, 0x2f, 0x0c, 0x0d, 0x21, 0x21,
+ 0xfd, 0x0f, 0x01, 0x9e,
+ 0xdc, 0xe0, 0xd2, 0xe3, 0xc2, 0xd4, 0xe7, 0xf3, 0xe0, 0x00, 0x00, 0xed,
+ 0x1b, 0x60, 0x3f, 0x2e,
+ 0x0c, 0x00, 0x23, 0xb0, 0x88, 0xbf, 0x27, 0xbe, 0xed, 0x15, 0x00, 0xfe,
+ 0xfe, 0x00, 0x00, 0x0f,
+ 0x1f, 0xfc, 0xfc, 0x42, 0x21, 0xdc, 0xee, 0x00, 0x41, 0x21, 0x2f, 0x1f,
+ 0x3d, 0x50, 0x1b, 0xd9,
+ 0x40, 0x20, 0x8a, 0xff, 0x00, 0x00, 0xdf, 0xee, 0xe0, 0xe1, 0xd1, 0xc0,
+ 0xb0, 0xf0, 0x02, 0xdf,
+ 0xdc, 0x00, 0x02, 0x00, 0x0c, 0x0d, 0x3f, 0x72, 0x43, 0x08, 0x0e, 0x53,
+ 0x11, 0x10, 0x00, 0x23,
+ 0x25, 0x00, 0x00, 0x24, 0x01, 0x01, 0xe0, 0xf1, 0x45, 0x11, 0x00, 0x20,
+ 0x74, 0x11, 0x00, 0x01,
+ 0x13, 0x00, 0x02, 0x04, 0x12, 0xf2, 0x88, 0xe0, 0x02, 0xdd, 0xde, 0x00,
+ 0x20, 0x00, 0xdb, 0x00,
+ 0x2f, 0x1f, 0x1f, 0xcd, 0xbb, 0x10, 0x20, 0x00, 0xed, 0xef, 0xdf, 0xbe,
+ 0xef, 0xf0, 0xcf, 0xb9,
+ 0x21, 0x43, 0xed, 0xfd, 0x1f, 0x3d, 0x1a, 0x0d, 0x40, 0x20, 0xdc, 0xac,
+ 0xe0, 0x01, 0xf0, 0xbc,
+ 0xff, 0x00, 0x10, 0x22, 0x31, 0x20, 0x10, 0x1c, 0x4f, 0x2f, 0x1d, 0x0a,
+ 0xff, 0x00, 0x00, 0x42,
+ 0x22, 0xf0, 0x00, 0x70, 0x6f, 0x0e, 0x1d, 0x08, 0x0e, 0x2e, 0x2c, 0x0c,
+ 0xeb, 0x0f, 0xfe, 0x9d,
+ 0xff, 0xe0, 0xbf, 0xe0, 0xd0, 0xe1, 0xe5, 0xe3, 0x9f, 0xe0, 0xff, 0xf0,
+ 0x02, 0xd8, 0xde, 0x20,
+ 0x2f, 0x0d, 0x51, 0x22, 0x20, 0x22, 0x22, 0x43, 0x36, 0x32, 0x35, 0x8c,
+ 0xee, 0x77, 0x02, 0xed,
+ 0x01, 0x22, 0x00, 0x00, 0x00, 0x33, 0x11, 0x00, 0x23, 0x23, 0x23, 0x14,
+ 0x02, 0xe0, 0xf0, 0x27,
+ 0x01, 0xf1, 0xb0, 0xee, 0x52, 0x32, 0x0e, 0x20, 0x40, 0x0e, 0x62, 0x21,
+ 0x20, 0x20, 0xf8, 0xff,
+ 0x0f, 0x0f, 0xee, 0xcd, 0xde, 0xab, 0xdd, 0xef, 0x00, 0x00, 0xb8, 0x1e,
+ 0x40, 0x0e, 0x1e, 0x2f,
+ 0x2f, 0x1e, 0x0c, 0xff, 0x10, 0xee, 0x88, 0xf0, 0x01, 0xdf, 0xef, 0xef,
+ 0xdd, 0x0e, 0x20, 0x20,
+ 0x0c, 0xfd, 0x0e, 0x0e, 0x1f, 0x0d, 0xdb, 0xfe, 0x2f, 0x3f, 0x70, 0x30,
+ 0x0b, 0x2f, 0x70, 0x1e,
+ 0x1a, 0x40, 0x3e, 0x2e, 0x3d, 0x4d, 0x1c, 0x0c, 0xcd, 0xff, 0x02, 0xf3,
+ 0xc1, 0xb1, 0xf7, 0xe3,
+ 0xa1, 0xe1, 0xf3, 0xc0, 0xe0, 0xf0, 0x00, 0x12, 0x0e, 0x0e, 0x31, 0x2e,
+ 0x2e, 0x77, 0x46, 0x21,
+ 0x11, 0x11, 0x44, 0x34, 0x11, 0x02, 0x13, 0x22, 0x25, 0x02, 0x01, 0x23,
+ 0x12, 0x03, 0x54, 0x44,
+ 0x23, 0x32, 0x22, 0x35, 0x53, 0x03, 0x23, 0x24, 0x01, 0xd2, 0xf3, 0x05,
+ 0xd0, 0x81, 0x02, 0xf0,
+ 0xee, 0x13, 0x11, 0xee, 0x44, 0x34, 0x00, 0x1f, 0x41, 0x45, 0xf0, 0xd0,
+ 0xf3, 0x27, 0xd1, 0x80,
+ 0xf2, 0x03, 0x13, 0x00, 0xf0, 0x33, 0x54, 0x11, 0x45, 0x22, 0x00, 0xef,
+ 0xff, 0x00, 0xf3, 0xf4,
+ 0xb1, 0xd1, 0xc1, 0xf3, 0x06, 0x12, 0x12, 0xf1, 0x01, 0x54, 0x11, 0x00,
+ 0x11, 0x23, 0xf0, 0xe0,
+ 0x01, 0x04, 0xd2, 0xb3, 0xd5, 0xe2, 0x35, 0x62, 0x00, 0xff, 0x0f, 0x1f,
+ 0x6f, 0x0c, 0x0b, 0xfd,
+ 0xfd, 0xfe, 0xcf, 0xbf, 0xbf, 0xef, 0xc0, 0xc0, 0xce, 0xe0, 0xda, 0xcb,
+ 0xee, 0xdd, 0xed, 0xfa,
+ 0xee, 0xe0, 0x00, 0x10, 0x0d, 0x0b, 0xfe, 0x1f, 0x41, 0x66, 0xed, 0xed,
+ 0x77, 0x33, 0xbb, 0x11,
+ 0x33, 0xf0, 0xee, 0x00, 0x32, 0x22, 0x01, 0x0f, 0x0f, 0x10, 0x44, 0x00,
+ 0x0f, 0x43, 0x24, 0x00,
+ 0x01, 0xdf, 0xf0, 0x11, 0x0d, 0x0e, 0xec, 0x0d, 0x4e, 0x60, 0x0b, 0x0d,
+ 0x74, 0x0a, 0x0e, 0x62,
+ 0x0f, 0xf9, 0x00, 0x00, 0x0f, 0xee, 0xdd, 0x00, 0x00, 0xcc, 0xde, 0x00,
+ 0x20, 0x00, 0xfc, 0x0e,
+ 0x2f, 0x2d, 0x0c, 0xec, 0x0e, 0x50, 0x0e, 0xbc, 0xdd, 0xe0, 0xef, 0xf0,
+ 0xcf, 0xdc, 0x21, 0xef,
+ 0x88, 0x00, 0x11, 0x00, 0xdd, 0x0f, 0x10, 0x21, 0xf0, 0xff, 0x13, 0x02,
+ 0xdf, 0xe0, 0x46, 0x31,
+ 0x00, 0x0e, 0x70, 0x74, 0x0e, 0x0a, 0x1f, 0x20, 0x20, 0x0f, 0x0d, 0xee,
+ 0xef, 0xe3, 0xa1, 0xdf,
+ 0xe7, 0xc1, 0xc0, 0xd0, 0xf4, 0xe2, 0x9d, 0x02, 0x05, 0x0f, 0x00, 0xff,
+ 0x0f, 0x32, 0x21, 0x20,
+ 0x20, 0x1c, 0x41, 0x32, 0x22, 0x24, 0x11, 0x01, 0x02, 0x01, 0x11, 0x36,
+ 0x11, 0xde, 0x1c, 0x71,
+ 0x76, 0x41, 0x10, 0x43, 0x24, 0x11, 0x14, 0x12, 0x15, 0x01, 0x01, 0x11,
+ 0x01, 0xd0, 0xdf, 0x00,
+ 0x11, 0x01, 0xde, 0x10, 0x74, 0x2c, 0x0a, 0x50, 0x30, 0x0e, 0xca, 0xee,
+ 0x00, 0x0f, 0xce, 0xdf,
+ 0xae, 0xee, 0xf0, 0x00, 0xe0, 0xee, 0x0e, 0x0c, 0x1b, 0x2e, 0x3c, 0x6e,
+ 0x1f, 0x0c, 0x00, 0x20,
+ 0x00, 0xe0, 0x24, 0xd1, 0x8a, 0xf3, 0x47, 0xaf, 0xed, 0x12, 0x11, 0x0f,
+ 0xee, 0xf0, 0x00, 0x0e,
+ 0x20, 0x32, 0xe0, 0xbd, 0x00, 0x14, 0x13, 0x00, 0x34, 0x00, 0x0f, 0x62,
+ 0x10, 0x4d, 0x77, 0x34,
+ 0x0d, 0xda, 0xee, 0xed, 0x10, 0xf0, 0xbc, 0x00, 0x56, 0x12, 0x11, 0x02,
+ 0x13, 0x02, 0xbf, 0xbb,
+ 0xff, 0x02, 0x01, 0xf0, 0xdc, 0xba, 0xcd, 0xdb, 0x00, 0x72, 0x25, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x21, 0x11, 0x23, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0xde, 0xcc, 0xee,
+ 0x56, 0x54, 0xff, 0xcd,
+ 0x0f, 0x00, 0xff, 0xef, 0x00, 0x00, 0xff, 0x12, 0x33, 0xee, 0xca, 0xee,
+ 0xff, 0x0f, 0x0f, 0x2f,
+ 0x0e, 0x0e, 0x40, 0x30, 0x0e, 0x1d, 0xfb, 0x10, 0x76, 0x63, 0x00, 0xed,
+ 0xef, 0x00, 0x23, 0x10,
+ 0xfe, 0x00, 0x56, 0x22, 0x10, 0xed, 0xcb, 0x00, 0x21, 0x00, 0xef, 0x01,
+ 0x12, 0xef, 0xef, 0x56,
+ 0x44, 0xee, 0xad, 0x00, 0x45, 0x00, 0xcb, 0x00, 0x22, 0x00, 0x33, 0x21,
+ 0xf0, 0xff, 0xf0, 0x00,
+ 0x24, 0x43, 0x01, 0xef, 0xee, 0x65, 0x32, 0x0e, 0x11, 0x43, 0x00, 0xfb,
+ 0xcc, 0xcd, 0x21, 0x56,
+ 0x00, 0xf0, 0xf0, 0xef, 0xf0, 0x12, 0xd0, 0xcd, 0x13, 0x01, 0xdf, 0x13,
+ 0x13, 0xcb, 0x99, 0xee,
+ 0x10, 0x77, 0x00, 0xff, 0x00, 0x21, 0x00, 0xde, 0xff, 0x00, 0x12, 0x33,
+ 0xff, 0xff, 0xf0, 0x10,
+ 0x56, 0x00, 0x9c, 0xdb, 0x00, 0x22, 0x00, 0xde, 0x0f, 0x32, 0x21, 0x00,
+ 0xf0, 0xee, 0xff, 0xde,
+ 0xf0, 0xff, 0xab, 0x10, 0xff, 0x99, 0x00, 0x20, 0xdd, 0xfe, 0x64, 0x0e,
+ 0xd8, 0x11, 0xf0, 0xed,
+ 0x53, 0x01, 0x11, 0x00, 0xba, 0x00, 0x22, 0x00, 0xee, 0x10, 0x30, 0x33,
+ 0x42, 0x21, 0x32, 0x22,
+ 0x0f, 0x00, 0x77, 0x56, 0x00, 0xe0, 0x11, 0x11, 0xef, 0x00, 0x03, 0xdd,
+ 0x00, 0x11, 0x00, 0xbe,
+ 0xa8, 0x10, 0x44, 0x00, 0xcd, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00,
+ 0xef, 0xed, 0x11, 0x42,
+ 0x0c, 0xed, 0x43, 0x22, 0xe8, 0xee, 0x52, 0x20, 0x0f, 0x00, 0x32, 0xff,
+ 0xbb, 0x11, 0x21, 0xad,
+ 0xdb, 0x11, 0x55, 0xf0, 0xdc, 0x00, 0x21, 0x01, 0x00, 0x00, 0x0f, 0x10,
+ 0x42, 0xff, 0x00, 0x23,
+ 0xdd, 0x00, 0x77, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x12, 0x01, 0x14,
+ 0x11, 0xf0, 0x01, 0x00,
+ 0x77, 0x45, 0xf0, 0x00, 0x02, 0x11, 0x02, 0x33, 0x47, 0xc0, 0xbf, 0x01,
+ 0x22, 0x02, 0x00, 0x01,
+ 0x23, 0x00, 0xdf, 0xff, 0x30, 0x12, 0xc0, 0x00, 0x13, 0x46, 0x33, 0x02,
+ 0x8f, 0xee, 0x04, 0x14,
+ 0x02, 0x03, 0x12, 0x24, 0x01, 0xbe, 0xed, 0x35, 0x76, 0x00, 0xcd, 0x00,
+ 0x13, 0x00, 0xdd, 0x02,
+ 0x35, 0xe0, 0x00, 0x14, 0xf0, 0x9d, 0x00, 0x34, 0x00, 0xcd, 0xfe, 0xed,
+ 0x0f, 0xf0, 0xef, 0xf0,
+ 0x00, 0xcb, 0xf0, 0x32, 0x13, 0xfe, 0x10, 0x41, 0xfd, 0xfa, 0x20, 0x1e,
+ 0xea, 0x8c, 0x0e, 0x30,
+ 0xfe, 0xcd, 0xfe, 0xfd, 0x0f, 0x20, 0x00, 0xaa, 0xbc, 0xff, 0x13, 0xff,
+ 0xaa, 0x00, 0x01, 0x02,
+ 0x10, 0x0f, 0x0f, 0x21, 0x0f, 0xfc, 0xde, 0xf0, 0x33, 0xdd, 0x88, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0xeb, 0xee, 0x42, 0x32, 0x20, 0xef, 0xfc, 0x75, 0x20, 0xdd, 0x00, 0x0f,
+ 0x64, 0x00, 0xd8, 0x00,
+ 0x41, 0x11, 0xef, 0xde, 0xf0, 0x20, 0x32, 0xff, 0xcc, 0xef, 0x00, 0x21,
+ 0x41, 0x00, 0xbb, 0xbc,
+ 0x0f, 0x22, 0x11, 0xed, 0xee, 0x0f, 0xfd, 0x20, 0x66, 0xec, 0xed, 0x21,
+ 0x31, 0xed, 0xec, 0x1f,
+ 0x2f, 0x40, 0x00, 0xd9, 0x00, 0x4f, 0x10, 0x10, 0x30, 0x40, 0x30, 0x0f,
+ 0x50, 0x51, 0x0d, 0xfc,
+ 0x33, 0x77, 0x10, 0x00, 0x0f, 0x00, 0x32, 0x00, 0xff, 0x03, 0x11, 0xdd,
+ 0x0f, 0x0f, 0xff, 0xef,
+ 0xef, 0xdd, 0xfd, 0xea, 0x0f, 0x51, 0xfd, 0xaa, 0x0f, 0x22, 0x11, 0xdd,
+ 0xdd, 0xf0, 0xcb, 0xff,
+ 0x77, 0x22, 0xae, 0xee, 0x01, 0x14, 0xf0, 0xdd, 0x00, 0x34, 0x00, 0xe0,
+ 0xee, 0x0f, 0x22, 0xff,
+ 0x00, 0x77, 0x45, 0xf0, 0x00, 0x32, 0x21, 0x01, 0x11, 0x22, 0x44, 0x22,
+ 0xf0, 0x00, 0x41, 0x77,
+ 0x22, 0xf0, 0x00, 0x24, 0x43, 0x01, 0x01, 0x02, 0xe2, 0xf3, 0x06, 0xf1,
+ 0xb0, 0x35, 0x22, 0xe0,
+ 0x11, 0x42, 0xf0, 0x12, 0x76, 0x10, 0x00, 0x12, 0x01, 0xe0, 0x01, 0x22,
+ 0xcf, 0x02, 0x45, 0xf0,
+ 0xbe, 0xef, 0x01, 0x44, 0x11, 0xfe, 0xee, 0xfe, 0x24, 0x53, 0x00, 0xdd,
+ 0xff, 0x35, 0x01, 0xde,
+ 0xe0, 0xe0, 0xbe, 0x01, 0x36, 0xf0, 0xbf, 0x00, 0xde, 0xdc, 0x55, 0x33,
+ 0x00, 0xd0, 0xff, 0x11,
+ 0xd0, 0x8b, 0xf1, 0x14, 0x02, 0xef, 0xed, 0x01, 0x12, 0xff, 0xbd, 0x0f,
+ 0x15, 0x10, 0xec, 0xfe,
+ 0xff, 0x55, 0x23, 0xcd, 0xec, 0x10, 0xfe, 0xee, 0x45, 0x00, 0xaf, 0xff,
+ 0xfe, 0xdd, 0xf0, 0xe0,
+ 0xbb, 0xff, 0xf0, 0xee, 0xea, 0xdd, 0x0e, 0x41, 0x10, 0x0d, 0x30, 0x1d,
+ 0x1c, 0x2f, 0xda, 0x0f,
+ 0x71, 0x0f, 0xba, 0x00, 0x33, 0x00, 0xac, 0xfe, 0x11, 0x11, 0x0f, 0x20,
+ 0x1f, 0xfc, 0x00, 0x75,
+ 0x00, 0xfe, 0x0f, 0x21, 0x11, 0xfe, 0xfe, 0x34, 0x11, 0xee, 0xed, 0x42,
+ 0x30, 0xb8, 0xcb, 0x00,
+ 0x40, 0x00, 0xfd, 0x0e, 0xfe, 0xcb, 0x10, 0x40, 0xfe, 0xcd, 0x0f, 0x0f,
+ 0xfc, 0x0e, 0x0d, 0xdc,
+ 0xfd, 0x0f, 0x3f, 0xec, 0x89, 0xde, 0x40, 0x00, 0xbc, 0xee, 0x00, 0x00,
+ 0xfe, 0xfd, 0xfe, 0x0d,
+ 0x0f, 0x1f, 0x1d, 0x0a, 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x72, 0x0e, 0x88,
+ 0xfe, 0x11, 0x22, 0xee,
+ 0x0f, 0x43, 0x0e, 0xda, 0x00, 0x51, 0x00, 0xec, 0x0f, 0x1f, 0x10, 0x0e,
+ 0x0d, 0x41, 0x52, 0x0e,
+ 0xfc, 0x0e, 0x0e, 0x20, 0x40, 0x1e, 0x0c, 0x20, 0x0e, 0x0d, 0x32, 0x21,
+ 0xff, 0x01, 0x22, 0xee,
+ 0xcf, 0xde, 0xdd, 0x77, 0x37, 0xe0, 0x00, 0x10, 0x50, 0x1f, 0x21, 0x77,
+ 0x12, 0x0f, 0x00, 0x32,
+ 0x56, 0x22, 0x01, 0x01, 0x12, 0x00, 0x20, 0x55, 0xf0, 0x00, 0x44, 0x00,
+ 0x00, 0x24, 0x32, 0x01,
+ 0xf0, 0x02, 0x46, 0x21, 0x00, 0x11, 0x32, 0x75, 0x11, 0x00, 0x01, 0x10,
+ 0x11, 0x43, 0x00, 0xcf,
+ 0xf0, 0x04, 0xf1, 0x26, 0x23, 0x8e, 0xcf, 0x26, 0x02, 0xf0, 0x11, 0x23,
+ 0xe0, 0x00, 0x12, 0x00,
+ 0x03, 0x77, 0x02, 0x00, 0xd0, 0xd0, 0x01, 0x24, 0x02, 0x9f, 0xef, 0x02,
+ 0x02, 0xe0, 0x04, 0x27,
+ 0xf1, 0xd0, 0xf2, 0x24, 0x02, 0xc1, 0xd2, 0x36, 0x01, 0x80, 0xe2, 0x23,
+ 0x02, 0xc0, 0xf1, 0x13,
+ 0x44, 0x32, 0x22, 0x00, 0x00, 0x55, 0x44, 0x00, 0x01, 0x04, 0x02, 0xd0,
+ 0xf2, 0x15, 0xe1, 0x80,
+ 0xf0, 0x17, 0x22, 0xf0, 0xd0, 0xe0, 0x12, 0x44, 0x11, 0xe0, 0xd0, 0x00,
+ 0x32, 0x43, 0x01, 0x01,
+ 0xf1, 0xcf, 0xd0, 0x21, 0x43, 0xbb, 0xde, 0x35, 0x21, 0xef, 0xbc, 0x0e,
+ 0x53, 0x45, 0x00, 0x0f,
+ 0x0f, 0xed, 0x11, 0x55, 0x00, 0xff, 0x12, 0x01, 0xde, 0x00, 0x00, 0x00,
+ 0x13, 0x01, 0x48, 0x01,
+ 0x0f, 0x3b, 0x89, 0x0d, 0x7c, 0x41, 0xbe, 0x15, 0xed, 0x74, 0xfd, 0xc8,
+ 0x00, 0x31, 0xee, 0x00,
+ 0x52, 0x00, 0xba, 0xff, 0x01, 0x00, 0x11, 0x33, 0xcd, 0xcc, 0xf0, 0x01,
+ 0x12, 0xee, 0xcd, 0xff,
+ 0xdc, 0xee, 0x25, 0x11, 0x8c, 0xda, 0x11, 0x44, 0xf0, 0xcf, 0x00, 0x01,
+ 0x00, 0x02, 0x00, 0xbe,
+ 0xff, 0xf1, 0xf0, 0xef, 0xf0, 0x02, 0x16, 0xef, 0x0f, 0x75, 0x0f, 0xa9,
+ 0x00, 0x44, 0x12, 0x00,
+ 0x00, 0xed, 0xde, 0x00, 0x12, 0x11, 0x00, 0x0f, 0x0f, 0x0e, 0xfd, 0x0f,
+ 0x02, 0x00, 0x0c, 0x0e,
+ 0x02, 0x04, 0xd0, 0x65, 0x44, 0xce, 0xaa, 0x00, 0x00, 0xf0, 0xee, 0xff,
+ 0x0f, 0xdb, 0xbd, 0x00,
+ 0x10, 0x0f, 0x0c, 0xfc, 0x1f, 0x20, 0x00, 0x30, 0x52, 0xdd, 0x99, 0x10,
+ 0x43, 0x00, 0xfe, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x52, 0x34, 0x23, 0xfd, 0xc0, 0xf0, 0x03, 0x05,
+ 0x36, 0x12, 0xae, 0xef,
+ 0x03, 0x23, 0x21, 0x30, 0x22, 0x12, 0x00, 0xed, 0xff, 0xee, 0xcd, 0x12,
+ 0x67, 0x00, 0xbb, 0xbc,
+ 0xfe, 0x01, 0x03, 0x13, 0x01, 0xeb, 0xcd, 0xfe, 0xff, 0x13, 0x23, 0xde,
+ 0xbb, 0xf0, 0x03, 0xdd,
+ 0xb9, 0xff, 0x11, 0x12, 0x00, 0x0d, 0x52, 0x45, 0x20, 0x0e, 0xec, 0xed,
+ 0x0f, 0x0f, 0x0f, 0x00,
+ 0x00, 0xdf, 0xae, 0xf3, 0x17, 0x00, 0xee, 0xde, 0x01, 0x34, 0x53, 0x00,
+ 0x10, 0x63, 0x10, 0x0c,
+ 0x1f, 0x77, 0x23, 0xfd, 0xfc, 0x20, 0x21, 0x10, 0x00, 0x0f, 0xff, 0x0f,
+ 0xfe, 0x0e, 0x00, 0xd8,
+ 0xde, 0x73, 0x22, 0xee, 0xdd, 0xff, 0x22, 0x54, 0x00, 0x0d, 0x0f, 0x0e,
+ 0x2e, 0x77, 0x11, 0x0f,
+ 0x00, 0x01, 0x16, 0x00, 0xc0, 0x01, 0x02, 0xe0, 0xf1, 0x13, 0x32, 0x77,
+ 0x21, 0x00, 0x11, 0x32,
+ 0x22, 0x34, 0x76, 0x11, 0x00, 0x12, 0x01, 0x11, 0x23, 0x35, 0x12, 0x00,
+ 0xc0, 0x33, 0x76, 0x10,
+ 0xff, 0xf0, 0x33, 0x01, 0xd0, 0x14, 0x65, 0x12, 0xef, 0xad, 0x00, 0x15,
+ 0x12, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x63, 0x10, 0x0c, 0x11, 0x22, 0x00, 0x01, 0xe0, 0xee,
+ 0x01, 0x57, 0x12, 0xde,
+ 0x00, 0x00, 0x0e, 0x1f, 0x41, 0x10, 0x0f, 0x10, 0x31, 0x53, 0x10, 0x22,
+ 0x47, 0x23, 0x0f, 0xf0,
+ 0xcf, 0xcd, 0x13, 0x67, 0x00, 0xb8, 0x0f, 0x20, 0x0f, 0xfd, 0x30, 0x30,
+ 0x0d, 0x0f, 0x10, 0x54,
+ 0x21, 0x0f, 0xec, 0x00, 0x53, 0x0f, 0x0f, 0x22, 0x10, 0x1f, 0x22, 0xf0,
+ 0x88, 0xee, 0x13, 0x00,
+ 0xcd, 0xef, 0x01, 0x01, 0xeb, 0xed, 0x00, 0x00, 0xdf, 0xc9, 0xde, 0x01,
+ 0x00, 0xdf, 0x12, 0xd0,
+ 0xad, 0xf0, 0x01, 0x46, 0x32, 0xe0, 0xab, 0xf0, 0x24, 0x22, 0x00, 0x23,
+ 0x01, 0x00, 0x15, 0x74,
+ 0x24, 0x01, 0xd0, 0xf0, 0x03, 0x01, 0x13, 0x22, 0x8c, 0xfd, 0x11, 0x33,
+ 0x20, 0x10, 0x0d, 0xfa,
+ 0xfe, 0xdb, 0xff, 0x62, 0xef, 0xcd, 0x01, 0xee, 0x88, 0xfe, 0x00, 0x00,
+ 0xed, 0xfe, 0xff, 0xdc,
+ 0xdd, 0x00, 0x10, 0x20, 0xfe, 0xdd, 0x0f, 0x00, 0x45, 0xed, 0x88, 0xef,
+ 0x32, 0x10, 0xff, 0xee,
+ 0xfe, 0x00, 0x20, 0xed, 0xab, 0xfe, 0x10, 0x54, 0x01, 0xff, 0xef, 0x00,
+ 0xab, 0xf0, 0x23, 0x0f,
+ 0x0d, 0x0f, 0xfa, 0xff, 0x20, 0x2f, 0x0e, 0xee, 0xed, 0xee, 0x10, 0x42,
+ 0xff, 0x9b, 0xee, 0xed,
+ 0xf0, 0xe0, 0xcf, 0x01, 0x00, 0xdd, 0xcb, 0x0f, 0xed, 0xde, 0x02, 0x55,
+ 0x00, 0xca, 0xbd, 0xf0,
+ 0x01, 0x00, 0x11, 0x03, 0xd1, 0xf1, 0xe0, 0xe0, 0x02, 0x57, 0x45, 0x22,
+ 0xf0, 0xd0, 0x23, 0x12,
+ 0xaf, 0x00, 0x27, 0x32, 0x01, 0xe1, 0xe0, 0x10, 0x75, 0x20, 0x11, 0x65,
+ 0x11, 0x00, 0x21, 0x21,
+ 0x00, 0xfe, 0x21, 0x32, 0x00, 0x02, 0x00, 0xf0, 0x34, 0x00, 0x8a, 0x14,
+ 0x35, 0xe0, 0xf0, 0x00,
+ 0x21, 0x62, 0x12, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x22, 0x45, 0x00, 0xee,
+ 0xbb, 0xef, 0x21, 0x20,
+ 0x41, 0x11, 0xcb, 0xdd, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0xed, 0x73, 0x20,
+ 0x0b, 0x0f, 0x2e, 0x50,
+ 0x45, 0x00, 0x0e, 0xff, 0x22, 0x34, 0x23, 0x00, 0xcf, 0xbc, 0x0f, 0x11,
+ 0x14, 0x01, 0x00, 0x20,
+ 0x44, 0x64, 0x35, 0x20, 0xff, 0xed, 0xf0, 0xff, 0x13, 0x77, 0xf1, 0xbb,
+ 0xff, 0xf0, 0xf0, 0xcc,
+ 0xee, 0x12, 0x12, 0x0f, 0xdc, 0xee, 0xef, 0x02, 0x35, 0xf0, 0x9d, 0xff,
+ 0x02, 0xe0, 0xe0, 0x05,
+ 0x01, 0xf0, 0x11, 0x00, 0x20, 0x77, 0x40, 0x00, 0x20, 0x21, 0xfd, 0x0e,
+ 0x55, 0x01, 0xff, 0x22,
+ 0x12, 0xdf, 0xbe, 0xd0, 0xe2, 0x27, 0x44, 0xf0, 0x00, 0x00, 0x00, 0x30,
+ 0x42, 0x32, 0x63, 0x0e,
+ 0xe9, 0x00, 0x33, 0x32, 0xf0, 0xce, 0xfd, 0x10, 0x1e, 0xea, 0x2f, 0x70,
+ 0x0a, 0xfe, 0x40, 0x10,
+ 0xed, 0xfe, 0x20, 0x10, 0x0e, 0xed, 0xba, 0xff, 0x51, 0x21, 0xdc, 0xed,
+ 0x30, 0x42, 0xed, 0xcc,
+ 0xed, 0xfc, 0x0f, 0x00, 0xbe, 0xcc, 0xfe, 0xee, 0xbb, 0xed, 0x03, 0x24,
+ 0xee, 0xff, 0x01, 0xf0,
+ 0x00, 0x44, 0x00, 0x21, 0x45, 0x00, 0xe0, 0xee, 0xcc, 0xdd, 0x42, 0x77,
+ 0x12, 0x00, 0x00, 0x00,
+ 0x01, 0x34, 0x00, 0x01, 0x35, 0x01, 0x80, 0xf0, 0x02, 0xd1, 0xe1, 0xe0,
+ 0xf4, 0x03, 0x11, 0x00,
+ 0x00, 0x03, 0x25, 0x33, 0x43, 0xff, 0x42, 0x76, 0x00, 0xf0, 0x00, 0xe0,
+ 0x02, 0x55, 0x0f, 0xfd,
+ 0x00, 0x21, 0x34, 0x44, 0x20, 0x10, 0x20, 0x11, 0x44, 0x67, 0x22, 0x21,
+ 0x12, 0x01, 0xf1, 0xf1,
+ 0x13, 0x75, 0x00, 0x0e, 0x00, 0x21, 0x1f, 0x20, 0x42, 0xfc, 0xed, 0x34,
+ 0x01, 0xcd, 0x00, 0x34,
+ 0x10, 0x00, 0x20, 0xec, 0xfd, 0xfc, 0x7e, 0x74, 0x1e, 0xf8, 0x00, 0x20,
+ 0x0f, 0xcd, 0x13, 0x13,
+ 0xe0, 0x00, 0x01, 0xf0, 0x16, 0x22, 0xad, 0xfe, 0x52, 0x12, 0x10, 0x10,
+ 0x11, 0x00, 0x0e, 0x2f,
+ 0x37, 0x23, 0xe1, 0x9f, 0xf1, 0x27, 0xf0, 0x9e, 0x00, 0x01, 0x02, 0x03,
+ 0x02, 0x01, 0x01, 0x02,
+ 0x03, 0x00, 0xca, 0xee, 0x23, 0x46, 0x10, 0xff, 0x00, 0xf0, 0xbd, 0x0d,
+ 0x43, 0x11, 0x0e, 0xf0,
+ 0x05, 0x67, 0x11, 0xde, 0x0f, 0x21, 0x23, 0xf0, 0xb0, 0xdd, 0xb9, 0xff,
+ 0x01, 0x00, 0xcd, 0xff,
+ 0x00, 0xfe, 0xf0, 0x33, 0x21, 0x10, 0x00, 0xff, 0x34, 0x66, 0x00, 0xed,
+ 0x20, 0x30, 0xfe, 0xfc,
+ 0x41, 0x41, 0x0f, 0x3f, 0x56, 0x02, 0x00, 0x01, 0xe0, 0xbc, 0x00, 0x22,
+ 0x0e, 0xca, 0x31, 0x40,
+ 0xc8, 0x0f, 0x60, 0x00, 0x10, 0x1f, 0x1f, 0x1e, 0x0e, 0xed, 0x00, 0x22,
+ 0x0f, 0x88, 0xed, 0xdd,
+ 0x0f, 0x00, 0x00, 0x2f, 0x3f, 0xfc, 0xfe, 0x0f, 0xff, 0x00, 0x62, 0x22,
+ 0x00, 0x00, 0x98, 0xdc,
+ 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x0c, 0x00, 0x23, 0x22, 0xbe, 0xe0, 0x04,
+ 0x02, 0xe5, 0xc3, 0x91,
+ 0xe1, 0x07, 0xd1, 0xc0, 0xf0, 0xe0, 0xd0, 0x12, 0x53, 0x12, 0x0e, 0xea,
+ 0x20, 0x51, 0x22, 0x11,
+ 0x10, 0x0d, 0x20, 0x43, 0x01, 0xdc, 0xe0, 0x04, 0xf0, 0xd0, 0xe1, 0xa0,
+ 0xe0, 0xf0, 0x03, 0x17,
+ 0x15, 0x11, 0x00, 0x02, 0xc2, 0xc2, 0x24, 0xf0, 0xcf, 0x11, 0x13, 0xbe,
+ 0xca, 0xdc, 0xee, 0x72,
+ 0x23, 0x0f, 0xed, 0xed, 0xeb, 0x00, 0x00, 0xdb, 0x0f, 0x31, 0x00, 0x8b,
+ 0xed, 0x0f, 0x10, 0x20,
+ 0x10, 0x2f, 0x3f, 0x0b, 0x1f, 0x62, 0x00, 0x0b, 0xed, 0x0e, 0x00, 0xee,
+ 0xbc, 0xff, 0x10, 0xff,
+ 0xbc, 0x11, 0x56, 0x00, 0x00, 0xf0, 0x00, 0xef, 0x00, 0xff, 0xbb, 0xdd,
+ 0xcc, 0x00, 0x23, 0xed,
+ 0xa8, 0x00, 0x10, 0x10, 0xf0, 0x00, 0xc0, 0xf0, 0x13, 0xdf, 0xf0, 0xf2,
+ 0x9d, 0x03, 0x15, 0xed,
+ 0x00, 0x24, 0x00, 0xed, 0x23, 0x26, 0x00, 0x31, 0x20, 0x62, 0x23, 0xfe,
+ 0xec, 0x01, 0x45, 0x11,
+ 0xf0, 0xae, 0xdb, 0x00, 0x32, 0xfe, 0xff, 0x0f, 0x2e, 0x71, 0x21, 0x13,
+ 0x13, 0x01, 0xff, 0x00,
+ 0x57, 0x05, 0xe0, 0xef, 0xfe, 0xce, 0xfe, 0x11, 0x64, 0x00, 0xfb, 0x0e,
+ 0x20, 0x10, 0xed, 0xdd,
+ 0xce, 0xed, 0x22, 0x30, 0xb8, 0xfe, 0x00, 0x31, 0x0f, 0x0e, 0x70, 0x63,
+ 0x14, 0x1f, 0xf8, 0xf0,
+ 0x21, 0x00, 0xef, 0x00, 0x01, 0xd0, 0xe0, 0xcf, 0xef, 0x34, 0x43, 0x0f,
+ 0x0e, 0x42, 0x47, 0x00,
+ 0x0f, 0x30, 0x54, 0x01, 0x22, 0x24, 0xcf, 0xd0, 0x35, 0x54, 0x12, 0x01,
+ 0xf0, 0x01, 0x42, 0x23,
+ 0x23, 0x12, 0x32, 0x54, 0x11, 0x13, 0x27, 0x11, 0x32, 0x12, 0xd0, 0xc1,
+ 0x05, 0xe0, 0xb0, 0x13,
+ 0x02, 0x12, 0x11, 0x0e, 0x2f, 0x3e, 0x4e, 0x73, 0x23, 0x0c, 0xdb, 0xdf,
+ 0xdd, 0xcd, 0xff, 0xb9,
+ 0xde, 0x11, 0x01, 0xcd, 0xed, 0x56, 0x12, 0xef, 0xe0, 0x00, 0x24, 0x41,
+ 0x00, 0x10, 0x33, 0x62,
+ 0x33, 0x31, 0x43, 0x30, 0x0b, 0x1d, 0x43, 0x21, 0x0d, 0x0f, 0x0d, 0xc8,
+ 0xef, 0x00, 0xe1, 0xdf,
+ 0x99, 0x0f, 0x0f, 0xdd, 0x0d, 0x2f, 0xfe, 0x0f, 0x0e, 0xfb, 0x20, 0x00,
+ 0x8d, 0xcc, 0x02, 0x03,
+ 0xdb, 0xcd, 0x00, 0x02, 0xbd, 0x00, 0x25, 0x20, 0x20, 0x10, 0x33, 0x00,
+ 0xfe, 0x35, 0x33, 0xf0,
+ 0xe0, 0x55, 0x35, 0xf1, 0xf0, 0xf1, 0x00, 0x62, 0x32, 0x33, 0x21, 0x01,
+ 0x05, 0x45, 0xf0, 0xa0,
+ 0xff, 0x01, 0x13, 0x04, 0xe1, 0xaf, 0xf0, 0x03, 0x02, 0xbb, 0xee, 0x12,
+ 0x20, 0x43, 0x33, 0x0c,
+ 0xfb, 0x0f, 0xfe, 0x00, 0x42, 0x01, 0xcf, 0xdf, 0xcf, 0xf0, 0x14, 0xfe,
+ 0xeb, 0x41, 0xff, 0x88,
+ 0xfd, 0x21, 0x33, 0xfe, 0xed, 0xf0, 0xef, 0x13, 0x33, 0xfe, 0xfd, 0x10,
+ 0x10, 0xde, 0x00, 0x77,
+ 0x40, 0xeb, 0xdd, 0x21, 0x13, 0x89, 0xff, 0x32, 0x00, 0x0e, 0xff, 0xee,
+ 0xfe, 0x20, 0x0d, 0x1d,
+ 0x50, 0x1f, 0x0c, 0x0f, 0x1d, 0x0b, 0x40, 0x73, 0x00, 0xfd, 0xfd, 0xe8,
+ 0xdd, 0xdd, 0x00, 0x00,
+ 0xbd, 0xdc, 0x20, 0x33, 0xcd, 0xb9, 0x00, 0x21, 0xf0, 0xe0, 0x00, 0xf1,
+ 0xce, 0xff, 0x22, 0x00,
+ 0xde, 0x00, 0x2e, 0x1c, 0x0c, 0xdd, 0x12, 0x77, 0x02, 0x13, 0x34, 0xf1,
+ 0xc0, 0x25, 0x76, 0x11,
+ 0xd0, 0xf0, 0x03, 0x22, 0x02, 0x00, 0xf2, 0x02, 0x33, 0x74, 0x21, 0x00,
+ 0x62, 0x37, 0x22, 0x22,
+ 0x00, 0x21, 0x51, 0x33, 0x01, 0xfe, 0xed, 0x32, 0x44, 0x0f, 0x20, 0x10,
+ 0x00, 0x35, 0x01, 0xf0,
+ 0x25, 0x23, 0x12, 0x02, 0xb0, 0xf0, 0x00, 0x2e, 0x77, 0x42, 0xdd, 0xec,
+ 0x40, 0x41, 0x32, 0x11,
+ 0x01, 0xf0, 0xce, 0x03, 0x06, 0xe0, 0xe0, 0xa0, 0xdd, 0xff, 0xff, 0xf0,
+ 0x00, 0x1f, 0x3f, 0x2b,
+ 0x0a, 0x2f, 0x70, 0x20, 0x3f, 0x40, 0x1e, 0x0b, 0x0f, 0x10, 0xfb, 0xac,
+ 0x00, 0x33, 0x11, 0xdd,
+ 0x0f, 0x20, 0xfe, 0xde, 0xe1, 0xc0, 0xc0, 0xd0, 0x98, 0x00, 0x02, 0xfe,
+ 0xff, 0xf0, 0x9c, 0xd9,
+ 0xef, 0x00, 0x00, 0xdf, 0xde, 0xef, 0x00, 0x0f, 0xee, 0xf0, 0xbc, 0xcc,
+ 0xd0, 0xe1, 0x01, 0x02,
+ 0xd0, 0x8c, 0xf0, 0x05, 0x00, 0xf0, 0x11, 0x10, 0x1e, 0x54, 0x0f, 0xd8,
+ 0x10, 0x64, 0x00, 0x0e,
+ 0xfe, 0xed, 0x00, 0x11, 0xfe, 0xed, 0xdd, 0xdd, 0x22, 0x33, 0xee, 0x99,
+ 0xee, 0xff, 0x00, 0x02,
+ 0xff, 0xdc, 0xee, 0xf0, 0x01, 0x22, 0x20, 0xdc, 0xbb, 0xff, 0x00, 0x00,
+ 0x00, 0xee, 0xbb, 0x20,
+ 0x51, 0xfe, 0xa9, 0x0f, 0x0e, 0xec, 0x1f, 0x72, 0x10, 0x0d, 0x0e, 0x10,
+ 0x0f, 0x0e, 0x11, 0xfe,
+ 0xda, 0xdf, 0xde, 0xaf, 0xee, 0xcd, 0xd9, 0xed, 0x0f, 0x41, 0x10, 0xfb,
+ 0x0e, 0x1f, 0x1f, 0x10,
+ 0x40, 0x20, 0x0f, 0x0f, 0x14, 0xe0, 0xae, 0x12, 0x57, 0x11, 0xdd, 0xee,
+ 0x23, 0x23, 0x11, 0x31,
+ 0x21, 0xfe, 0xdf, 0x01, 0x04, 0x02, 0xf3, 0xb4, 0xa2, 0xf7, 0xe4, 0xb0,
+ 0xc0, 0x01, 0x04, 0x01,
+ 0x02, 0x00, 0xee, 0x10, 0x56, 0x22, 0x01, 0xf0, 0xe1, 0x27, 0x32, 0xd0,
+ 0x01, 0x23, 0x02, 0xb0,
+ 0xce, 0x42, 0x44, 0x00, 0xff, 0x10, 0x1f, 0x10, 0x14, 0x35, 0x53, 0x11,
+ 0x00, 0x02, 0x55, 0x55,
+ 0x11, 0x00, 0x00, 0x21, 0x42, 0x21, 0x00, 0x0e, 0x20, 0x20, 0x1d, 0x1d,
+ 0x0c, 0x0d, 0x40, 0x0f,
+ 0xba, 0x00, 0x10, 0x0d, 0x1e, 0x70, 0x1f, 0x1d, 0x40, 0x18, 0x0c, 0x30,
+ 0x0f, 0x10, 0x20, 0xed,
+ 0x9c, 0x00, 0x11, 0x21, 0x00, 0xef, 0x13, 0x56, 0x00, 0xfd, 0xdc, 0xf1,
+ 0x37, 0x11, 0xd0, 0xff,
+ 0x20, 0xf0, 0xce, 0x20, 0x74, 0x11, 0x10, 0x1e, 0x40, 0x31, 0x31, 0x1f,
+ 0x70, 0x23, 0x10, 0x06,
+ 0x14, 0xd0, 0xbe, 0x03, 0x07, 0xf1, 0xe1, 0xd0, 0xb0, 0xe0, 0x04, 0x03,
+ 0x00, 0xee, 0x00, 0x43,
+ 0x05, 0x13, 0x36, 0x11, 0xf0, 0x02, 0x22, 0xf1, 0x80, 0x01, 0x34, 0x01,
+ 0x11, 0x54, 0x01, 0xf0,
+ 0xde, 0x0d, 0x0e, 0xcd, 0x05, 0x46, 0x11, 0x10, 0x52, 0x00, 0x00, 0x43,
+ 0x53, 0x31, 0x0e, 0x20,
+ 0x20, 0x10, 0x66, 0x22, 0x0d, 0xfe, 0x12, 0x10, 0xf9, 0x00, 0xe1, 0xb0,
+ 0xf0, 0x02, 0x33, 0x41,
+ 0x1d, 0x1a, 0x30, 0x2f, 0x1e, 0x3f, 0x2b, 0xfc, 0x0e, 0x20, 0x00, 0x9e,
+ 0xdc, 0xdd, 0xde, 0xee,
+ 0x0f, 0x0e, 0xfd, 0x0b, 0x4d, 0x60, 0x10, 0xfc, 0x0d, 0xfd, 0xfb, 0x0f,
+ 0x1f, 0x9d, 0xfd, 0x21,
+ 0xfd, 0xef, 0x01, 0xdb, 0x8b, 0x00, 0x00, 0x01, 0xee, 0x10, 0x51, 0xfd,
+ 0xd9, 0x03, 0x26, 0xe0,
+ 0xa0, 0x01, 0xf3, 0xe1, 0xf1, 0xf2, 0x02, 0x16, 0x02, 0x90, 0xff, 0x21,
+ 0x32, 0x22, 0x22, 0x22,
+ 0x00, 0x30, 0x31, 0x41, 0x45, 0x12, 0x01, 0xf0, 0xe0, 0xbf, 0x06, 0x12,
+ 0x8c, 0xe0, 0x03, 0xf2,
+ 0xe0, 0x04, 0xe1, 0xdf, 0x15, 0x33, 0xe0, 0x02, 0x76, 0x21, 0x12, 0x34,
+ 0x43, 0x35, 0x31, 0x21,
+ 0x32, 0x00, 0x01, 0x34, 0x11, 0xf0, 0xd0, 0xe0, 0xb0, 0xf0, 0x53, 0x20,
+ 0x4d, 0x60, 0x20, 0x00,
+ 0x0f, 0x08, 0x0e, 0x0d, 0x2f, 0x40, 0x0d, 0xa8, 0xfe, 0x0e, 0x0d, 0x0d,
+ 0x30, 0x2e, 0x0b, 0x0f,
+ 0x0e, 0x2f, 0x71, 0x00, 0xec, 0x00, 0x20, 0x0e, 0xff, 0xff, 0xbb, 0x00,
+ 0xf0, 0xcc, 0xbc, 0x00,
+ 0x10, 0x0c, 0xfc, 0xfd, 0xfd, 0x20, 0x43, 0x00, 0xdd, 0xad, 0xe0, 0xf7,
+ 0xd2, 0xa0, 0xe2, 0xe2,
+ 0xb0, 0xe0, 0x07, 0xf1, 0xef, 0xfe, 0x0f, 0x10, 0x35, 0x10, 0xfd, 0x10,
+ 0x21, 0xff, 0xee, 0x00,
+ 0x1f, 0xff, 0x8a, 0xec, 0xff, 0x0f, 0xfe, 0xfd, 0xfd, 0xdf, 0xad, 0xdb,
+ 0xde, 0xd0, 0xe0, 0xf1,
+ 0xbe, 0xce, 0x07, 0x05, 0xaf, 0xff, 0x00, 0x23, 0x01, 0x00, 0xf0, 0xdb,
+ 0x0f, 0x0f, 0x0e, 0xfd,
+ 0x0c, 0xaa, 0x0f, 0x30, 0x0f, 0x0f, 0x40, 0x2e, 0x3f, 0x2e, 0x0d, 0x50,
+ 0x54, 0x0e, 0xda, 0x10,
+ 0x31, 0xdd, 0xdb, 0x00, 0x0e, 0xdc, 0xce, 0x30, 0x40, 0xfd, 0xff, 0x2f,
+ 0x3e, 0x1f, 0x22, 0x0f,
+ 0x4e, 0x71, 0x30, 0x10, 0x47, 0x22, 0xf1, 0x26, 0x42, 0xcf, 0xde, 0x00,
+ 0x44, 0x33, 0x00, 0x1f,
+ 0x31, 0x41, 0x10, 0x13, 0x47, 0x25, 0xe0, 0xe1, 0xf1, 0xa1, 0xc0, 0xcf,
+ 0xd0, 0x47, 0x33, 0xdf,
+ 0xef, 0x10, 0xf0, 0x02, 0x76, 0x02, 0xf0, 0xe0, 0xe0, 0xe2, 0x03, 0xe2,
+ 0xd1, 0xf2, 0xf0, 0xef,
+ 0x00, 0x33, 0x20, 0xfd, 0x1f, 0x5e, 0x40, 0xea, 0xa9, 0x20, 0x62, 0x00,
+ 0xef, 0x01, 0x03, 0x20,
+ 0x00, 0x31, 0x44, 0x44, 0x33, 0x1f, 0x0a, 0x0f, 0x20, 0xcd, 0x05, 0x01,
+ 0x0b, 0x01, 0xf9, 0x00,
+ 0x57, 0xf4, 0xcf, 0xfb, 0x65, 0xf5, 0xfb, 0xf9, 0xaa, 0x00, 0x02, 0x0f,
+ 0xcd, 0x34, 0x33, 0xdb,
+ 0xde, 0x01, 0x12, 0x00, 0x30, 0xcf, 0xbe, 0x24, 0x12, 0xbc, 0xf0, 0x04,
+ 0x11, 0xee, 0xed, 0x57,
+ 0x12, 0xbc, 0xf0, 0x10, 0x21, 0x11, 0x00, 0x00, 0xcc, 0xf0, 0x34, 0x10,
+ 0xd0, 0xf0, 0xdf, 0xef,
+ 0x42, 0x10, 0xfe, 0xdc, 0x00, 0xf0, 0x00, 0x23, 0x40, 0xfa, 0x00, 0xd1,
+ 0xd0, 0x80, 0xc2, 0x06,
+ 0x0d, 0xdf, 0x11, 0xe0, 0x9f, 0x02, 0x15, 0x0d, 0xfd, 0xef, 0x26, 0x52,
+ 0xde, 0xcb, 0x21, 0x22,
+ 0xf0, 0x11, 0x33, 0x89, 0xf0, 0x10, 0x01, 0xff, 0xf0, 0xce, 0x00, 0x14,
+ 0xe0, 0xe0, 0xef, 0xee,
+ 0xbd, 0xf0, 0x17, 0x02, 0xee, 0xdf, 0xf0, 0x00, 0x5f, 0x00, 0x02, 0x02,
+ 0x20, 0xfd, 0x88, 0x00,
+ 0x04, 0x01, 0xff, 0xdf, 0x11, 0x00, 0xdc, 0xd0, 0x66, 0x00, 0x0e, 0xef,
+ 0xdf, 0x53, 0x24, 0xff,
+ 0xde, 0xdc, 0xe0, 0x24, 0xe0, 0xba, 0x20, 0x12, 0xa0, 0x00, 0x00, 0xe0,
+ 0xf0, 0xfe, 0xdc, 0x02,
+ 0x66, 0xef, 0xde, 0xf0, 0xf2, 0xf0, 0xf0, 0xf3, 0x02, 0xee, 0x9b, 0xf0,
+ 0x04, 0xf0, 0xed, 0x41,
+ 0x32, 0xac, 0x10, 0x37, 0xdf, 0xee, 0x11, 0x33, 0xf0, 0xae, 0x01, 0x23,
+ 0xe0, 0xcc, 0x02, 0x21,
+ 0xfe, 0x00, 0xff, 0xee, 0xda, 0x10, 0x65, 0x00, 0xff, 0xdf, 0x00, 0x75,
+ 0x0f, 0x0e, 0xe0, 0x00,
+ 0x10, 0x42, 0xf0, 0xdc, 0x33, 0x1f, 0xf9, 0x31, 0x01, 0xcf, 0x42, 0x21,
+ 0xfd, 0xfe, 0xf0, 0x25,
+ 0x76, 0x1f, 0xec, 0x41, 0x53, 0x00, 0xfe, 0x0f, 0x11, 0x11, 0x20, 0x1f,
+ 0x0d, 0x74, 0x00, 0xc9,
+ 0x00, 0x53, 0x0e, 0x0e, 0x11, 0x22, 0x00, 0x22, 0x2e, 0x0c, 0x21, 0x20,
+ 0xed, 0x30, 0x76, 0x0d,
+ 0xff, 0x31, 0x0f, 0xfd, 0x23, 0x36, 0x40, 0x0d, 0x30, 0x54, 0x00, 0xfd,
+ 0x22, 0x65, 0x0e, 0x0f,
+ 0x10, 0x2f, 0xfe, 0x02, 0x57, 0x0f, 0xfd, 0x00, 0x21, 0x20, 0x44, 0x1f,
+ 0x0c, 0x10, 0x12, 0x33,
+ 0x50, 0x1f, 0xfc, 0x00, 0x21, 0x13, 0x00, 0x0d, 0xee, 0x11, 0x57, 0x20,
+ 0x0e, 0x00, 0x53, 0xe0,
+ 0x0d, 0x74, 0x13, 0x0c, 0x0f, 0x33, 0xfc, 0x1e, 0x53, 0x00, 0xfd, 0xf8,
+ 0xde, 0x62, 0x36, 0x00,
+ 0x0d, 0x00, 0x20, 0x11, 0x10, 0x32, 0xf0, 0xda, 0xf0, 0xe0, 0x02, 0x33,
+ 0xde, 0x9e, 0x31, 0x41,
+ 0x23, 0x20, 0x0f, 0x1a, 0xff, 0x21, 0x13, 0xdc, 0x40, 0x30, 0xf1, 0x8d,
+ 0xbd, 0x16, 0x11, 0x1d,
+ 0x1f, 0x23, 0xe2, 0xf3, 0x15, 0x00, 0x7e, 0x1c, 0xfd, 0xf2, 0x03, 0x0e,
+ 0xeb, 0x00, 0x32, 0xdd,
+ 0xbd, 0x57, 0xe1, 0xbc, 0x00, 0x22, 0x10, 0xfe, 0x25, 0x00, 0xbc, 0x00,
+ 0x24, 0x10, 0xe0, 0xcf,
+ 0x01, 0x00, 0xad, 0x03, 0x04, 0x0c, 0x00, 0x05, 0x00, 0x1d, 0xde, 0x02,
+ 0x02, 0xee, 0x20, 0x57,
+ 0xc0, 0xcc, 0x00, 0x02, 0xd0, 0x11, 0x03, 0xaf, 0xfe, 0x22, 0xff, 0xdd,
+ 0x02, 0x15, 0x00, 0xac,
+ 0xff, 0x43, 0x00, 0xee, 0x01, 0x01, 0xca, 0xdf, 0x12, 0x74, 0xff, 0xec,
+ 0x02, 0x23, 0xc8, 0xff,
+ 0x23, 0xd0, 0xab, 0x11, 0x10, 0xf1, 0xd0, 0x00, 0x21, 0x00, 0xec, 0x01,
+ 0x23, 0x22, 0x00, 0xfd,
+ 0xd0, 0xd0, 0xe0, 0xd0, 0x8c, 0x01, 0x04, 0xc9, 0xef, 0x52, 0x01, 0xcf,
+ 0x1f, 0x10, 0x00, 0x01,
+ 0x24, 0x01, 0xde, 0xcb, 0x22, 0x10, 0xad, 0xe0, 0x27, 0x00, 0x9e, 0x00,
+ 0x00, 0xfe, 0x03, 0x00,
+ 0xff, 0x12, 0x00, 0x00, 0x55, 0xed, 0x0f, 0x04, 0xf0, 0x00, 0xff, 0xee,
+ 0xac, 0x01, 0x37, 0xf1,
+ 0xbc, 0x30, 0x11, 0x20, 0xf0, 0xdf, 0x00, 0x20, 0x00, 0x0f, 0x45, 0xc0,
+ 0xd0, 0xf0, 0xee, 0x9d,
+ 0xf0, 0x16, 0x10, 0x02, 0xab, 0xff, 0xf1, 0xf3, 0xfd, 0x34, 0x33, 0xee,
+ 0xac, 0x00, 0x04, 0x01,
+ 0x20, 0xfe, 0xbe, 0x03, 0x14, 0x1c, 0x00, 0x03, 0xfc, 0xbd, 0x02, 0x12,
+ 0x12, 0x0e, 0xed, 0xe0,
+ 0xe3, 0xad, 0xff, 0xf4, 0x0d, 0x2c, 0x41, 0x03, 0xf5, 0x15, 0x40, 0x1d,
+ 0x1e, 0x10, 0xe0, 0xdd,
+ 0x14, 0x60, 0xe8, 0xff, 0x00, 0xde, 0x10, 0x66, 0x00, 0x0e, 0x10, 0x41,
+ 0x00, 0xe0, 0x40, 0x20,
+ 0x10, 0x31, 0xfa, 0xef, 0x02, 0x41, 0x1e, 0x09, 0x72, 0x12, 0xed, 0xed,
+ 0x01, 0x44, 0x74, 0x10,
+ 0xda, 0xe0, 0x22, 0x11, 0xe0, 0xf0, 0x11, 0xf0, 0xde, 0xed, 0x0f, 0x73,
+ 0x13, 0xdc, 0x0e, 0x53,
+ 0x32, 0x0d, 0x0d, 0x35, 0xf2, 0xe1, 0x64, 0x14, 0x2f, 0x1d, 0xfb, 0xe0,
+ 0xf2, 0x13, 0x00, 0xfa,
+ 0x01, 0xd0, 0x80, 0x04, 0x53, 0xfd, 0x11, 0x43, 0xda, 0xde, 0x13, 0x64,
+ 0x0e, 0xec, 0x11, 0x23,
+ 0xfd, 0xdd, 0x12, 0x43, 0x0c, 0x0e, 0x42, 0xf3, 0xde, 0xf1, 0x02, 0xdb,
+ 0x20, 0x72, 0x00, 0xee,
+ 0x01, 0x44, 0x10, 0x2e, 0x47, 0x00, 0x0f, 0xee, 0x55, 0x42, 0xfe, 0xed,
+ 0x23, 0x10, 0x0a, 0x32,
+ 0x31, 0x0d, 0x20, 0x40, 0x0e, 0x41, 0x30, 0xfa, 0x30, 0x51, 0x0f, 0x20,
+ 0x3f, 0x0b, 0x51, 0x33,
+ 0xfc, 0xcd, 0x24, 0x31, 0x0d, 0x0f, 0x21, 0x01, 0x10, 0x71, 0x31, 0x0f,
+ 0x62, 0x35, 0x01, 0x14,
+ 0x3e, 0x0d, 0x10, 0x23, 0x3f, 0x1c, 0x0f, 0x43, 0x10, 0x2c, 0x3d, 0x44,
+ 0x47, 0x13, 0xeb, 0xcd,
+ 0x40, 0x55, 0x01, 0x01, 0x20, 0xec, 0xde, 0x00, 0x00, 0x21, 0x55, 0x00,
+ 0xac, 0x00, 0x14, 0x21,
+ 0x00, 0xed, 0x01, 0x00, 0x21, 0x0e, 0x11, 0x14, 0xff, 0x0b, 0x00, 0x2f,
+ 0x71, 0x40, 0xf0, 0xe1,
+ 0x02, 0x20, 0x2c, 0xe0, 0xe2, 0x90, 0xdc, 0xf0, 0xee, 0xb0, 0x17, 0x10,
+ 0xeb, 0xc0, 0x14, 0x12,
+ 0xcd, 0xac, 0x01, 0x25, 0xe0, 0xee, 0x02, 0x0f, 0x9b, 0x22, 0x01, 0xdf,
+ 0x00, 0x00, 0xed, 0x00,
+ 0x07, 0xf0, 0xce, 0x11, 0x13, 0xde, 0x20, 0x73, 0x10, 0xf0, 0xed, 0x01,
+ 0x01, 0xd8, 0x00, 0x71,
+ 0xf0, 0xcb, 0x00, 0x02, 0x31, 0x22, 0x0e, 0xbc, 0x11, 0x22, 0xf0, 0xfe,
+ 0x02, 0x00, 0x00, 0xd0,
+ 0xf3, 0xc1, 0xed, 0x1f, 0x4f, 0x10, 0x42, 0xfe, 0xbb, 0x15, 0x41, 0x20,
+ 0x00, 0x37, 0x00, 0xde,
+ 0xd0, 0x2f, 0x0c, 0x00, 0xf7, 0xd2, 0xbf, 0x20, 0x11, 0x9f, 0xfe, 0x11,
+ 0x35, 0xe0, 0xed, 0x00,
+ 0x10, 0xe4, 0xb0, 0xed, 0x00, 0x20, 0x0f, 0x73, 0x57, 0xfe, 0xa8, 0x00,
+ 0x21, 0x11, 0x01, 0xee,
+ 0xdd, 0xf0, 0x11, 0xef, 0x00, 0x57, 0xdf, 0xac, 0x00, 0x14, 0x11, 0x00,
+ 0x0e, 0xc0, 0xf0, 0x02,
+ 0x31, 0xfe, 0xbd, 0x00, 0x02, 0xed, 0xfe, 0x32, 0x00, 0xbf, 0xfc, 0xe0,
+ 0x07, 0xf2, 0x0f, 0x0e,
+ 0x00, 0xe1, 0xd0, 0xdf, 0x00, 0xf5, 0xd0, 0xcb, 0xdf, 0xaf, 0xf2, 0xf0,
+ 0xf0, 0xbd, 0xc0, 0x03,
+ 0x17, 0x31, 0xfe, 0x00, 0x0f, 0x8c, 0x03, 0xf7, 0x00, 0xdd, 0x00, 0x01,
+ 0x00, 0xd1, 0xc0, 0xf0,
+ 0xfd, 0x00, 0x30, 0x00, 0xb0, 0xe4, 0xe1, 0x10, 0x25, 0xbe, 0xee, 0x21,
+ 0xec, 0x8c, 0x04, 0x35,
+ 0xfe, 0x9c, 0x00, 0x01, 0x02, 0x02, 0x00, 0x0b, 0xd0, 0xf0, 0xf3, 0xe1,
+ 0xf1, 0xde, 0x9a, 0x02,
+ 0x02, 0xf1, 0xe0, 0x0e, 0x0c, 0x02, 0xe4, 0xbf, 0x0e, 0xf0, 0xf0, 0xe3,
+ 0xd0, 0xdf, 0xbb, 0xf0,
+ 0xc2, 0xef, 0xdb, 0x11, 0x13, 0xe0, 0xf0, 0x00, 0x00, 0xae, 0xed, 0x16,
+ 0x22, 0xe0, 0xce, 0xec,
+ 0x2f, 0x35, 0xa1, 0xc0, 0x0e, 0xec, 0xcb, 0x02, 0xf3, 0xef, 0xff, 0x1f,
+ 0xed, 0xe1, 0x07, 0x00,
+ 0x80, 0xfd, 0x02, 0x00, 0xe1, 0x01, 0xe1, 0xa1, 0xda, 0xf0, 0x32, 0x0e,
+ 0xeb, 0xe1, 0xe1, 0xa0,
+ 0x00, 0x03, 0xef, 0xff, 0x13, 0x04, 0x9d, 0xed, 0xf2, 0x00, 0xdb, 0xee,
+ 0x04, 0xe1, 0x02, 0x55,
+ 0xda, 0xe0, 0x31, 0xe2, 0xde, 0x61, 0x25, 0xde, 0xff, 0x10, 0x00, 0xb1,
+ 0xdf, 0x00, 0x00, 0xcc,
+ 0x02, 0x35, 0xf0, 0xb0, 0xec, 0x01, 0x34, 0x00, 0xf1, 0xe0, 0x00, 0x2f,
+ 0x50, 0xed, 0x11, 0x77,
+ 0xf0, 0xf9, 0x30, 0x21, 0xe0, 0x01, 0x00, 0xef, 0x01, 0x10, 0x1f, 0x3f,
+ 0x51, 0x00, 0xe0, 0x0e,
+ 0x72, 0x51, 0x1f, 0xfc, 0x02, 0x35, 0x40, 0x01, 0x11, 0x43, 0x32, 0x0f,
+ 0x0c, 0x31, 0x43, 0x3f,
+ 0x2b, 0x2e, 0x5d, 0x43, 0x20, 0xf8, 0x09, 0x72, 0x32, 0x21, 0x20, 0x0c,
+ 0x00, 0x52, 0x10, 0x0e,
+ 0x1e, 0x30, 0x10, 0x20, 0x0d, 0x3f, 0x71, 0x23, 0x0f, 0x19, 0x30, 0x31,
+ 0x21, 0x37, 0x42, 0x30,
+ 0x3d, 0x5f, 0x10, 0x20, 0x52, 0x1f, 0x09, 0x10, 0x21, 0x52, 0x10, 0x1e,
+ 0x1b, 0x20, 0x75, 0x11,
+ 0x1f, 0x1e, 0x02, 0x10, 0x0e, 0x20, 0x42, 0x11, 0x0e, 0x20, 0x11, 0x1d,
+ 0x42, 0x10, 0x1a, 0x41,
+ 0x56, 0xff, 0x00, 0x04, 0x30, 0x0c, 0x0f, 0x10, 0x31, 0x52, 0x0f, 0x0c,
+ 0x51, 0x11, 0x2f, 0x10,
+ 0x0f, 0x1e, 0x63, 0x00, 0x0d, 0x25, 0x10, 0x10, 0x00, 0xff, 0xf8, 0x5f,
+ 0x25, 0xc0, 0xe0, 0x20,
+ 0x1d, 0x00, 0x11, 0x55, 0xef, 0xf0, 0x0f, 0x1f, 0x4f, 0x11, 0x03, 0xfe,
+ 0xaa, 0x02, 0x25, 0x0e,
+ 0xdc, 0x21, 0x11, 0x00, 0x51, 0x43, 0x0d, 0xec, 0xff, 0x13, 0x46, 0x30,
+ 0x00, 0xec, 0x10, 0xf0,
+ 0xb0, 0x0f, 0x5e, 0x00, 0x0f, 0x00, 0xe0, 0x07, 0x22, 0xff, 0xde, 0xe1,
+ 0xf1, 0x02, 0xe0, 0x8c,
+ 0xae, 0xf0, 0x03, 0xf1, 0x00, 0x2d, 0xec, 0xce, 0x17, 0x13, 0xd0, 0x11,
+ 0x76, 0x0e, 0xfd, 0xf0,
+ 0xf0, 0xf2, 0xe2, 0x12, 0x2e, 0xcc, 0xde, 0x00, 0x57, 0x12, 0xf1, 0xbf,
+ 0xec, 0x12, 0x03, 0xd0,
+ 0xd2, 0x52, 0xec, 0xcb, 0x11, 0x34, 0xff, 0xdc, 0x20, 0x30, 0x02, 0x00,
+ 0xff, 0x8b, 0xc0, 0x21,
+ 0x10, 0x0d, 0xf3, 0xe1, 0xab, 0xf0, 0xe5, 0x00, 0x0f, 0xff, 0xf1, 0xd0,
+ 0x0d, 0x21, 0x13, 0x11,
+ 0x00, 0xda, 0x00, 0x33, 0x60, 0x0f, 0x8c, 0xf0, 0xe0, 0x14, 0x00, 0xcf,
+ 0xec, 0x11, 0x63, 0xfe,
+ 0xfd, 0x02, 0xe0, 0xe9, 0x01, 0x33, 0xd0, 0xc1, 0xf4, 0xfe, 0xdb, 0xd0,
+ 0x10, 0x10, 0x20, 0xe1,
+ 0xc0, 0x0f, 0xab, 0x00, 0x44, 0x22, 0xf0, 0xbe, 0xfe, 0x03, 0x47, 0xf0,
+ 0xcf, 0x00, 0xdf, 0x01,
+ 0x17, 0x00, 0x0c, 0xf0, 0x01, 0xf0, 0x41, 0xde, 0xbd, 0x21, 0x10, 0xb0,
+ 0xf6, 0x00, 0x00, 0xee,
+ 0xb0, 0x00, 0x01, 0x01, 0x00, 0xa8, 0xf0, 0x23, 0x01, 0xdd, 0xbe, 0xf1,
+ 0xc3, 0x02, 0x1f, 0x0f,
+ 0x01, 0x03, 0xee, 0xf0, 0x07, 0x07, 0xef, 0x0d, 0x40, 0xef, 0xdf, 0x02,
+ 0xf3, 0x8d, 0xdc, 0x02,
+ 0x21, 0xdd, 0xe0, 0x35, 0xee, 0xb0, 0x01, 0xee, 0x0e, 0x67, 0x31, 0xf0,
+ 0xde, 0x10, 0xff, 0xcd,
+ 0x23, 0x24, 0xed, 0xd0, 0xce, 0x00, 0x76, 0x40, 0xda, 0xf0, 0x3f, 0x31,
+ 0x12, 0x0d, 0x0f, 0x01,
+ 0x02, 0x01, 0x57, 0x00, 0xef, 0xfb, 0xf0, 0x00, 0x74, 0x30, 0xce, 0x0f,
+ 0x11, 0x31, 0xdd, 0xdf,
+ 0x74, 0x10, 0xfb, 0xf0, 0x22, 0x24, 0xdf, 0xab, 0x00, 0x10, 0x22, 0x11,
+ 0x00, 0x0f, 0x2e, 0x7f,
+ 0x00, 0x13, 0x02, 0x22, 0xfe, 0x0d, 0xfd, 0x11, 0x37, 0xe5, 0xdf, 0xee,
+ 0xfe, 0x70, 0x33, 0x0e,
+ 0xfd, 0x35, 0xd0, 0xaf, 0x0f, 0xf2, 0x05, 0x0f, 0xbd, 0x00, 0x07, 0x01,
+ 0x00, 0x00, 0x20, 0x13,
+ 0x40, 0x0e, 0xed, 0x00, 0x30, 0xf1, 0xbf, 0x00, 0x2e, 0x1a, 0x70, 0xe0,
+ 0xdc, 0x14, 0x35, 0x10,
+ 0xfc, 0xb0, 0x22, 0x52, 0x1f, 0x10, 0x42, 0x00, 0x0e, 0x00, 0x30, 0x30,
+ 0x13, 0xfe, 0x1c, 0x66,
+ 0x02, 0x00, 0x09, 0x2f, 0x3f, 0x40, 0x60, 0x23, 0x00, 0x0d, 0x2f, 0x2f,
+ 0x40, 0x32, 0x0b, 0x10,
+ 0x41, 0x0e, 0x0b, 0x10, 0x00, 0x70, 0x10, 0xe8, 0x0f, 0x62, 0x33, 0x00,
+ 0x10, 0x00, 0x0a, 0x21,
+ 0x43, 0x10, 0x00, 0x10, 0xf0, 0xfe, 0x10, 0x73, 0x10, 0x0a, 0xfe, 0x10,
+ 0x54, 0x10, 0x2e, 0x0f,
+ 0xf0, 0xe4, 0x03, 0x32, 0x40, 0xfb, 0xcf, 0x30, 0x76, 0x10, 0x0d, 0x01,
+ 0x14, 0x10, 0x00, 0x00,
+ 0x0d, 0x13, 0x13, 0xbb, 0xef, 0xf0, 0x21, 0x44, 0xdd, 0x0e, 0x32, 0x63,
+ 0x0f, 0xee, 0x1f, 0x0c,
+ 0x0e, 0x31, 0x02, 0xb0, 0x17, 0x35, 0x8a, 0xef, 0x02, 0x00, 0xd0, 0xff,
+ 0xdf, 0xde, 0x02, 0x03,
+ 0x20, 0xf0, 0xbd, 0xfc, 0xee, 0xe0, 0xf7, 0xe1, 0xa0, 0xf1, 0xf0, 0xbf,
+ 0x0f, 0x01, 0xd0, 0xcc,
+ 0x24, 0x22, 0xfd, 0xd0, 0xe1, 0xfd, 0x23, 0x34, 0x01, 0x11, 0xec, 0x8c,
+ 0xa0, 0x0f, 0x10, 0x12,
+ 0xff, 0xec, 0x03, 0xf0, 0x0e, 0x20, 0x09, 0xfe, 0x13, 0x41, 0xff, 0xf0,
+ 0xd3, 0xa0, 0xfe, 0xeb,
+ 0xef, 0xe3, 0x91, 0xfb, 0x11, 0x22, 0xf0, 0xe6, 0x22, 0x01, 0xf1, 0x0e,
+ 0xcc, 0xe0, 0x05, 0x00,
+ 0x9c, 0x00, 0x22, 0x25, 0xfe, 0x0f, 0x62, 0x03, 0xcd, 0xfe, 0x00, 0x07,
+ 0x46, 0xee, 0xdf, 0xd0,
+ 0xf0, 0xf1, 0x10, 0x12, 0x1f, 0x1c, 0x20, 0x42, 0xf3, 0xff, 0x3c, 0x0e,
+ 0x32, 0x74, 0x00, 0x0c,
+ 0xac, 0xcd, 0xf0, 0xf1, 0x06, 0xb1, 0xdf, 0xbc, 0xf0, 0x00, 0x00, 0x11,
+ 0x02, 0x25, 0x10, 0xdc,
+ 0xd0, 0x43, 0x11, 0xee, 0x8d, 0xf1, 0x04, 0x0f, 0xea, 0xdf, 0x00, 0xd0,
+ 0xdf, 0x52, 0x34, 0xee,
+ 0x01, 0x04, 0xce, 0xed, 0x24, 0x33, 0xbd, 0xda, 0xc0, 0xff, 0x03, 0xe1,
+ 0xef, 0xed, 0xed, 0x50,
+ 0x13, 0x00, 0x00, 0x46, 0x1f, 0xec, 0x00, 0x22, 0xf3, 0xb4, 0xbe, 0xfe,
+ 0x03, 0x14, 0x0e, 0xee,
+ 0x20, 0x1f, 0x40, 0x67, 0xf0, 0x0c, 0x00, 0xef, 0x10, 0x31, 0x54, 0xff,
+ 0x9a, 0x00, 0x00, 0x01,
+ 0x02, 0x10, 0x20, 0x0d, 0x80, 0x02, 0x00, 0x08, 0x00, 0xf2, 0xd1, 0x00,
+ 0x01, 0xe0, 0xcd, 0xe0,
+ 0x23, 0x05, 0xc1, 0xd0, 0xe0, 0xec, 0x02, 0x22, 0x20, 0x32, 0xde, 0x9e,
+ 0xfd, 0xc8, 0x00, 0x14,
+ 0xdf, 0xbd, 0xf1, 0xe3, 0xc0, 0x10, 0x40, 0xf1, 0xe0, 0xf0, 0xe9, 0xf0,
+ 0x06, 0x00, 0x90, 0xfe,
+ 0xed, 0xdf, 0xd0, 0x26, 0x10, 0xbe, 0xce, 0x00, 0x26, 0x00, 0xbf, 0x0e,
+ 0x0f, 0x00, 0xe0, 0xe1,
+ 0x13, 0x11, 0xad, 0xfb, 0x00, 0x11, 0xf2, 0x06, 0xf0, 0xd0, 0xf0, 0xdf,
+ 0xbd, 0x1f, 0x31, 0xe0,
+ 0xbf, 0x02, 0x11, 0xfb, 0xde, 0xb0, 0xe1, 0x00, 0x0f, 0x01, 0x13, 0xe9,
+ 0xce, 0xf0, 0xf6, 0x01,
+ 0xf0, 0x8e, 0xfe, 0x10, 0x02, 0xa1, 0x04, 0xee, 0xe9, 0xf0, 0x02, 0x54,
+ 0x20, 0x01, 0x0f, 0xef,
+ 0xfd, 0xf0, 0x44, 0x03, 0xdc, 0xf0, 0xf0, 0xf0, 0xef, 0x04, 0x92, 0xd0,
+ 0x02, 0x55, 0x0f, 0x00,
+ 0x24, 0x00, 0x25, 0x50, 0x0d, 0x0b, 0x00, 0x00, 0xd0, 0xdd, 0x22, 0x55,
+ 0xee, 0xbb, 0x10, 0x22,
+ 0x0f, 0x40, 0x41, 0x10, 0x11, 0x43, 0x00, 0x2e, 0x30, 0x53, 0x00, 0x01,
+ 0x34, 0x0f, 0x00, 0x73,
+ 0x09, 0x1e, 0x2f, 0x22, 0x44, 0x21, 0x19, 0x0e, 0x61, 0x24, 0x30, 0x1e,
+ 0x30, 0x0d, 0x00, 0x12,
+ 0x61, 0x0e, 0x1a, 0x0f, 0x10, 0x23, 0x50, 0x3f, 0x20, 0x1c, 0x30, 0x63,
+ 0x0f, 0x00, 0x45, 0x21,
+ 0x10, 0x1c, 0x1b, 0x20, 0x44, 0x22, 0x1e, 0x2f, 0x60, 0x33, 0x43, 0x01,
+ 0x1c, 0x0d, 0x2c, 0x2e,
+ 0x51, 0x12, 0x0f, 0x1f, 0x51, 0x12, 0x31, 0x10, 0x1d, 0x26, 0x13, 0x00,
+ 0x1f, 0x19, 0x4e, 0x11,
+ 0x15, 0x12, 0x0d, 0x0f, 0x6f, 0x2b, 0x0e, 0x21, 0x05, 0x31, 0x61, 0x1d,
+ 0x1e, 0x32, 0x35, 0x41,
+ 0x20, 0x1d, 0x10, 0x0f, 0x0c, 0x74, 0x13, 0x0e, 0x0e, 0xff, 0x01, 0x01,
+ 0x22, 0x00, 0x37, 0x00,
+ 0x44, 0x35, 0xad, 0x3f, 0xee, 0x39, 0x61, 0x43, 0x26, 0x01, 0x72, 0x7f,
+ 0xf8, 0x0f, 0x22, 0x44,
+ 0xcf, 0xf0, 0x01, 0xdd, 0xfb, 0x31, 0x12, 0xb0, 0xfc, 0x10, 0x75, 0x01,
+ 0xf0, 0x0f, 0x40, 0x11,
+ 0x00, 0xee, 0x10, 0x36, 0xef, 0xff, 0x10, 0x00, 0xc0, 0xfc, 0xc0, 0x1e,
+ 0x34, 0x32, 0x00, 0xed,
+ 0x1d, 0x0f, 0xe0, 0x57, 0x00, 0x9e, 0x01, 0xf3, 0x0e, 0xfa, 0x11, 0x33,
+ 0xcf, 0xee, 0x01, 0x35,
+ 0x50, 0x11, 0x0f, 0xe0, 0xf0, 0x8c, 0x0e, 0x43, 0x10, 0x1f, 0x0e, 0xfe,
+ 0xe1, 0x35, 0x5f, 0x0d,
+ 0x06, 0xd1, 0xf0, 0x23, 0x67, 0xe0, 0xef, 0x0f, 0xdd, 0xd0, 0x12, 0x75,
+ 0x01, 0xce, 0xdb, 0xff,
+ 0x01, 0x44, 0x32, 0xff, 0x0d, 0x21, 0x33, 0x21, 0x55, 0xee, 0x8a, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0xdd, 0xf0, 0x00, 0x02, 0x3d, 0x20, 0x16, 0x30, 0x03, 0xd0, 0x0e, 0x70,
+ 0x53, 0xdb, 0xdf, 0x12,
+ 0x21, 0x0d, 0xe0, 0xfd, 0x1d, 0x40, 0x04, 0xd0, 0xe0, 0x02, 0x2e, 0x7e,
+ 0x36, 0x04, 0xd0, 0xdd,
+ 0xfe, 0x32, 0x21, 0xfd, 0x8f, 0xff, 0xe8, 0x2b, 0x00, 0x21, 0x55, 0x10,
+ 0x00, 0xcf, 0x00, 0x00,
+ 0x70, 0x01, 0xff, 0xef, 0x02, 0x0f, 0x0d, 0x11, 0x02, 0x00, 0x02, 0x17,
+ 0x23, 0x0e, 0xde, 0xf1,
+ 0xd5, 0x31, 0x53, 0x00, 0xb8, 0xfe, 0x21, 0x22, 0xf0, 0x0f, 0x0f, 0xce,
+ 0xff, 0x10, 0x67, 0x00,
+ 0xdf, 0x20, 0x30, 0xce, 0x00, 0x04, 0xb0, 0xdd, 0xfe, 0xfe, 0xe0, 0x37,
+ 0x75, 0x00, 0xfc, 0x00,
+ 0x74, 0x00, 0x0f, 0x32, 0x00, 0xee, 0xcf, 0x00, 0x11, 0x20, 0xef, 0xc0,
+ 0x10, 0xfe, 0xb8, 0x00,
+ 0x01, 0x51, 0x00, 0x01, 0x30, 0x0f, 0xe0, 0x14, 0x76, 0x0f, 0xcb, 0x00,
+ 0x01, 0x01, 0x0f, 0xdd,
+ 0xf0, 0xf0, 0x00, 0x10, 0x42, 0x31, 0x3c, 0x0e, 0x03, 0x67, 0x10, 0xce,
+ 0xcc, 0x02, 0x46, 0x2f,
+ 0xee, 0xd0, 0xe0, 0xd0, 0x01, 0x52, 0xfe, 0x1f, 0x42, 0x01, 0xee, 0xf0,
+ 0x01, 0xcb, 0x0f, 0x1e,
+ 0x2d, 0x00, 0x10, 0x03, 0xd1, 0x34, 0x50, 0xea, 0xaf, 0x14, 0x01, 0xed,
+ 0xee, 0x11, 0x15, 0xe1,
+ 0xef, 0x0e, 0x3d, 0x40, 0x54, 0x23, 0xfd, 0x9d, 0xfe, 0x02, 0x26, 0x50,
+ 0x00, 0xf2, 0xde, 0xec,
+ 0x12, 0x46, 0xef, 0xdd, 0x01, 0x02, 0xf2, 0xef, 0x20, 0x67, 0x00, 0x00,
+ 0x33, 0x30, 0x00, 0xff,
+ 0x23, 0x0f, 0xff, 0xc1, 0x14, 0x70, 0xea, 0x9b, 0x0e, 0x00, 0x10, 0x1e,
+ 0x20, 0x0e, 0xdf, 0x05,
+ 0x45, 0x10, 0xfe, 0x01, 0x13, 0x11, 0x23, 0x01, 0x8a, 0xef, 0x00, 0x00,
+ 0x43, 0x0f, 0x1f, 0x23,
+ 0x0f, 0xda, 0x30, 0x73, 0x00, 0xff, 0xf0, 0x0d, 0x00, 0x03, 0xa0, 0xec,
+ 0xfd, 0xfc, 0xec, 0x10,
+ 0x10, 0x20, 0x0f, 0xd8, 0x51, 0x43, 0xee, 0xfe, 0x03, 0x02, 0xbc, 0xff,
+ 0x04, 0x43, 0x20, 0xec,
+ 0xad, 0x23, 0x46, 0x0e, 0xce, 0x10, 0x00, 0xfe, 0x12, 0x36, 0x40, 0xfe,
+ 0xcc, 0xf0, 0x00, 0x05,
+ 0x51, 0x10, 0x0f, 0xef, 0xe2, 0xf2, 0x0f, 0x11, 0x32, 0xcc, 0xce, 0xf2,
+ 0x00, 0x00, 0x0f, 0xaa,
+ 0x00, 0x20, 0x21, 0xf3, 0xe2, 0x0d, 0x2c, 0x51, 0x00, 0x23, 0x05, 0xe0,
+ 0x12, 0x4f, 0xe9, 0x02,
+ 0x25, 0xaf, 0xec, 0x01, 0x00, 0xe0, 0xf0, 0x00, 0xef, 0x8c, 0x00, 0x00,
+ 0x02, 0x65, 0x20, 0x0e,
+ 0x10, 0x01, 0xe0, 0x10, 0x04, 0xf0, 0xbe, 0xfe, 0xfe, 0x1f, 0x1b, 0x00,
+ 0x10, 0x21, 0x73, 0x37,
+ 0x00, 0xce, 0x00, 0x24, 0x40, 0xf0, 0xdf, 0xdc, 0xba, 0x10, 0x72, 0x03,
+ 0x0f, 0x0d, 0xfe, 0x00,
+ 0x2f, 0xf0, 0xf4, 0x0f, 0x0c, 0x12, 0xf6, 0xee, 0xfe, 0x72, 0x10, 0xe0,
+ 0xd3, 0x14, 0x00, 0x1f,
+ 0xfe, 0xae, 0x03, 0x12, 0x10, 0x00, 0xe0, 0xda, 0x40, 0x6d, 0x1b, 0x10,
+ 0x03, 0xf0, 0xca, 0xf0,
+ 0x45, 0x32, 0x0f, 0x10, 0x02, 0xe0, 0xc0, 0x00, 0x23, 0x36, 0xc0, 0xaf,
+ 0xff, 0xe0, 0x13, 0x4f,
+ 0x0b, 0xe0, 0x15, 0x21, 0x75, 0x20, 0xee, 0xdd, 0xf0, 0x24, 0x11, 0x22,
+ 0x0f, 0xbb, 0xee, 0x0e,
+ 0x01, 0xa2, 0xec, 0x0f, 0x13, 0x2e, 0xec, 0x10, 0x44, 0x01, 0x21, 0x10,
+ 0x00, 0x14, 0x9e, 0xfb,
+ 0x1f, 0x20, 0xf0, 0xe2, 0x1f, 0x2c, 0xd0, 0x01, 0x70, 0x4f, 0x00, 0x07,
+ 0x05, 0xfc, 0xdf, 0x00,
+ 0x01, 0x30, 0xae, 0xfe, 0x05, 0x01, 0xef, 0x1f, 0x0d, 0x02, 0xd2, 0xae,
+ 0x0b, 0x40, 0x31, 0x13,
+ 0xfe, 0x00, 0x52, 0x10, 0x0b, 0x00, 0x00, 0x02, 0xe3, 0x34, 0x01, 0xae,
+ 0xed, 0xee, 0xe0, 0x37,
+ 0x64, 0x0e, 0xff, 0xce, 0xff, 0x20, 0x46, 0xe0, 0xce, 0xee, 0x0e, 0x22,
+ 0x77, 0x10, 0xff, 0xee,
+ 0x10, 0x00, 0xe0, 0xd0, 0xdf, 0x1f, 0x53, 0xef, 0xdb, 0x00, 0xfe, 0x33,
+ 0x74, 0x20, 0xf0, 0xf2,
+ 0x13, 0x43, 0x0f, 0xda, 0x15, 0x63, 0xef, 0xcb, 0xf0, 0x00, 0x20, 0x0e,
+ 0xee, 0x01, 0xf2, 0xdb,
+ 0xfd, 0x74, 0x34, 0x0f, 0xef, 0x12, 0x33, 0xfe, 0xfe, 0x14, 0x76, 0x0f,
+ 0xad, 0xff, 0xf1, 0x02,
+ 0x1d, 0x1e, 0x0d, 0x01, 0x34, 0xfd, 0x10, 0x77, 0x0f, 0x0c, 0x01, 0x14,
+ 0x01, 0xf0, 0xdd, 0xf0,
+ 0x00, 0x01, 0xf0, 0x11, 0xe0, 0xad, 0x0f, 0x21, 0x20, 0x10, 0xed, 0xf0,
+ 0x06, 0x1e, 0xba, 0x00,
+ 0x1f, 0x3f, 0x71, 0x03, 0xf0, 0xbd, 0x0d, 0x31, 0x0f, 0xb8, 0xf0, 0x15,
+ 0x33, 0x2e, 0xca, 0xc0,
+ 0x10, 0x23, 0x10, 0x00, 0x0e, 0xff, 0xf1, 0x43, 0x52, 0x01, 0xdc, 0xec,
+ 0x2f, 0x40, 0xf0, 0xe4,
+ 0x12, 0xaa, 0xd0, 0x14, 0x01, 0x00, 0xee, 0x54, 0x01, 0xf0, 0x01, 0xf0,
+ 0xe0, 0x40, 0x54, 0x00,
+ 0x02, 0x13, 0x50, 0xfc, 0xbb, 0x00, 0x20, 0x01, 0x0e, 0x0f, 0x00, 0x02,
+ 0xca, 0xfe, 0x30, 0x10,
+ 0x0d, 0x21, 0x47, 0x02, 0xd1, 0x04, 0xf0, 0xfc, 0xf0, 0xd0, 0x0f, 0x4f,
+ 0x31, 0x43, 0x21, 0xdf,
+ 0x30, 0x73, 0x50, 0xa9, 0x00, 0x02, 0x23, 0x10, 0xf0, 0xc0, 0xfe, 0x0b,
+ 0x30, 0x00, 0xcc, 0x0b,
+ 0x1e, 0x0f, 0xd0, 0x02, 0x01, 0x02, 0x4e, 0x09, 0xd0, 0x26, 0x72, 0x30,
+ 0xfc, 0xdf, 0x00, 0x02,
+ 0xef, 0xcf, 0x10, 0x1f, 0x0e, 0x00, 0xe0, 0xd0, 0xee, 0x5c, 0x50, 0xff,
+ 0x17, 0x04, 0xbf, 0xbc,
+ 0x00, 0x22, 0x10, 0x0d, 0x31, 0x03, 0xc0, 0xef, 0x32, 0x1f, 0xeb, 0xd2,
+ 0xe6, 0x80, 0xfb, 0x00,
+ 0x10, 0x02, 0x00, 0x00, 0xee, 0x0d, 0x60, 0x36, 0x10, 0x00, 0x2f, 0x51,
+ 0xe4, 0xb0, 0x00, 0x30,
+ 0x0e, 0xb1, 0x04, 0x01, 0xfc, 0x0e, 0xce, 0xfd, 0x31, 0x31, 0x10, 0x10,
+ 0xfa, 0xbe, 0x23, 0x24,
+ 0x10, 0x0e, 0xc0, 0xdf, 0x02, 0x02, 0xfe, 0xc9, 0x20, 0x51, 0x01, 0xbc,
+ 0x0e, 0x61, 0x00, 0x00,
+ 0xe6, 0x03, 0x0f, 0x1d, 0x12, 0x13, 0xfe, 0xf5, 0x22, 0x1c, 0xdc, 0x20,
+ 0x10, 0xf0, 0x22, 0x4e,
+ 0xfb, 0xb0, 0x02, 0x63, 0x10, 0x0d, 0xfb, 0xf0, 0x12, 0x54, 0x04, 0xa0,
+ 0xfb, 0x00, 0x20, 0x03,
+ 0xe2, 0x02, 0x1e, 0x2c, 0xdf, 0xbe, 0x02, 0x62, 0x00, 0x03, 0x01, 0xf8,
+ 0xdd, 0x22, 0x72, 0x00,
+ 0x10, 0x10, 0xfe, 0xda, 0x00, 0x17, 0x31, 0xcf, 0xbe, 0x01, 0x13, 0x12,
+ 0x0f, 0x0d, 0xef, 0xee,
+ 0x15, 0x10, 0xe1, 0x23, 0x3f, 0x2b, 0x71, 0x65, 0xf0, 0xe0, 0x0d, 0xff,
+ 0x02, 0x46, 0x00, 0xfe,
+ 0xbd, 0xe0, 0x01, 0xf0, 0xea, 0x10, 0x72, 0x00, 0xe0, 0x00, 0x00, 0x33,
+ 0xf2, 0xdf, 0xec, 0x01,
+ 0x21, 0x21, 0x22, 0x00, 0x88, 0xfe, 0x30, 0x61, 0x01, 0x01, 0x0d, 0x0c,
+ 0x21, 0x06, 0xf0, 0xe0,
+ 0xff, 0x1f, 0x50, 0x03, 0x04, 0xf1, 0xdc, 0xde, 0x01, 0x00, 0x40, 0xf0,
+ 0x9c, 0x0f, 0x12, 0x0e,
+ 0xeb, 0x30, 0x20, 0x04, 0x42, 0x43, 0x00, 0xcd, 0xf0, 0x00, 0x0e, 0x00,
+ 0xc6, 0x00, 0x6d, 0x00,
+ 0xe0, 0x00, 0x02, 0xdc, 0xf3, 0x17, 0xf2, 0x0f, 0x70, 0x12, 0x01, 0x00,
+ 0x08, 0xf0, 0x11, 0x40,
+ 0x1f, 0x10, 0xd1, 0xcc, 0xf0, 0xe0, 0x0f, 0x0a, 0xee, 0xd0, 0xc6, 0xf0,
+ 0x72, 0x71, 0x00, 0xcf,
+ 0x01, 0x10, 0x00, 0x36, 0x01, 0xcc, 0xff, 0x01, 0x12, 0x10, 0xee, 0xee,
+ 0x0c, 0xff, 0xcf, 0x10,
+ 0x71, 0x34, 0xf3, 0x04, 0xfc, 0xec, 0x23, 0x13, 0xee, 0xde, 0xe6, 0xc1,
+ 0x00, 0x0e, 0x3f, 0x62,
+ 0xf0, 0xfc, 0x62, 0x11, 0x0d, 0xf9, 0xf0, 0xe0, 0x24, 0x72, 0x0e, 0xeb,
+ 0x00, 0x12, 0x33, 0x00,
+ 0xee, 0xf0, 0xc0, 0xfb, 0x00, 0x42, 0x03, 0x90, 0x0b, 0x0f, 0x1e, 0x01,
+ 0x05, 0x00, 0x0c, 0x0f,
+ 0xb0, 0x0e, 0x00, 0x56, 0x10, 0x0f, 0x0c, 0x10, 0x23, 0xf1, 0xa0, 0xfe,
+ 0xed, 0x00, 0x31, 0xf5,
+ 0xe1, 0xe0, 0xdb, 0xe0, 0x22, 0x31, 0x70, 0x5e, 0xff, 0xf0, 0x01, 0x06,
+ 0x0e, 0x0e, 0xe0, 0xef,
+ 0xcf, 0x0d, 0x21, 0xe1, 0xc3, 0x35, 0x21, 0xa0, 0xf1, 0x15, 0x1e, 0x0f,
+ 0x76, 0x12, 0x00, 0xee,
+ 0x31, 0x57, 0x00, 0xce, 0x00, 0xf1, 0x0f, 0x0e, 0x00, 0x34, 0x01, 0x9f,
+ 0x0c, 0x1f, 0x1d, 0x00,
+ 0x35, 0x52, 0xfe, 0xcd, 0x00, 0x01, 0x15, 0x0f, 0xbc, 0x11, 0x45, 0x00,
+ 0xf0, 0x00, 0x20, 0x0f,
+ 0x0f, 0x12, 0x13, 0xff, 0xfa, 0xf0, 0x13, 0xef, 0x89, 0xf0, 0x0f, 0x00,
+ 0x04, 0xf0, 0xad, 0xff,
+ 0x0f, 0x41, 0x02, 0xe0, 0xdb, 0x0f, 0x20, 0x02, 0x42, 0x10, 0xf8, 0xe0,
+ 0x25, 0x50, 0x0e, 0x20,
+ 0x42, 0x00, 0xf0, 0x00, 0x0e, 0xee, 0xa0, 0xee, 0xe0, 0x04, 0x31, 0x2d,
+ 0xfc, 0xd0, 0x24, 0x73,
+ 0x4f, 0x0c, 0xe0, 0x15, 0x20, 0x00, 0xc1, 0xd3, 0xef, 0xbb, 0xef, 0x42,
+ 0x01, 0xbe, 0xfe, 0x00,
+ 0x04, 0xff, 0xd9, 0x0f, 0x42, 0x53, 0x00, 0x0b, 0xe0, 0x40, 0x77, 0x00,
+ 0xd0, 0xff, 0x00, 0x20,
+ 0x22, 0xf0, 0xbd, 0xff, 0x10, 0x20, 0x21, 0xf0, 0x0f, 0x10, 0x2e, 0x00,
+ 0x04, 0xc0, 0xeb, 0xd0,
+ 0xf0, 0xff, 0xd1, 0xd3, 0x02, 0x4d, 0x0b, 0x00, 0x0f, 0xed, 0x51, 0x73,
+ 0x00, 0xe6, 0x04, 0x20,
+ 0x1e, 0xfc, 0xf0, 0x53, 0x24, 0xd0, 0xf1, 0x31, 0x5a, 0x2f, 0x02, 0xf4,
+ 0x30, 0x1f, 0x99, 0xff,
+ 0x30, 0x62, 0x12, 0xdf, 0xbc, 0x00, 0x04, 0x20, 0x11, 0xff, 0xee, 0xff,
+ 0x00, 0x33, 0x10, 0xfe,
+ 0xf0, 0x00, 0x36, 0x42, 0xce, 0xde, 0x33, 0x52, 0xfd, 0x9a, 0x00, 0x24,
+ 0x0f, 0xea, 0x00, 0x61,
+ 0x12, 0xfd, 0x11, 0x46, 0x00, 0xdc, 0xe1, 0x03, 0x31, 0x00, 0xec, 0x80,
+ 0x03, 0x01, 0x00, 0x0d,
+ 0x20, 0x00, 0xe5, 0x20, 0x11, 0x52, 0x20, 0xfe, 0xfe, 0x05, 0x03, 0xd1,
+ 0xae, 0xfb, 0x0f, 0xff,
+ 0x10, 0x02, 0x14, 0x0c, 0xdb, 0x00, 0x22, 0x63, 0xf0, 0xae, 0xfe, 0x02,
+ 0x10, 0x20, 0x10, 0xf2,
+ 0xac, 0x0e, 0x0d, 0x02, 0x37, 0x2f, 0xfb, 0xe0, 0x00, 0x31, 0x71, 0x13,
+ 0x0e, 0xfa, 0x00, 0x42,
+ 0x24, 0x0f, 0xce, 0x00, 0x00, 0xbf, 0xff, 0x01, 0x03, 0xfd, 0x0f, 0xef,
+ 0x0c, 0x3f, 0x0f, 0xef,
+ 0xfd, 0xfd, 0x1b, 0x4d, 0x0d, 0x00, 0x77, 0x52, 0xee, 0xfe, 0x42, 0x14,
+ 0x02, 0xae, 0xf8, 0x00,
+ 0x27, 0x20, 0xd0, 0xdf, 0x0f, 0x00, 0x31, 0xe2, 0xe1, 0x00, 0x0d, 0x60,
+ 0x52, 0x0e, 0xff, 0x00,
+ 0x01, 0xe0, 0x20, 0x0c, 0xbb, 0x03, 0x12, 0x0a, 0x9d, 0x00, 0xf2, 0x00,
+ 0x03, 0x10, 0x42, 0x00,
+ 0x0e, 0xf3, 0x06, 0x12, 0x53, 0xf2, 0xd1, 0xf0, 0xd8, 0xcf, 0x0f, 0x21,
+ 0x50, 0x20, 0x22, 0xe0,
+ 0x0e, 0x30, 0x27, 0xd1, 0x10, 0x2f, 0xae, 0xc3, 0xe4, 0x0e, 0x3b, 0xef,
+ 0x8f, 0xd0, 0x0f, 0x33,
+ 0x47, 0x10, 0x0d, 0x00, 0x11, 0x10, 0x34, 0x60, 0xf8, 0xff, 0x00, 0x21,
+ 0x00, 0x00, 0x42, 0xdf,
+ 0xee, 0x01, 0xe2, 0x00, 0x74, 0x11, 0xe0, 0xcd, 0xfd, 0xe0, 0x01, 0x12,
+ 0x2c, 0xfe, 0xbe, 0x2f,
+ 0x45, 0x00, 0xe9, 0xcc, 0x1f, 0x73, 0x15, 0x00, 0xdf, 0xee, 0xfe, 0x0e,
+ 0x23, 0x15, 0xdd, 0xad,
+ 0x02, 0x14, 0x10, 0xdf, 0x20, 0x70, 0xfd, 0xdd, 0x25, 0x56, 0x10, 0x0d,
+ 0xe0, 0x00, 0xf0, 0xf1,
+ 0x00, 0xbb, 0xd0, 0x00, 0xf0, 0x00, 0xf2, 0xb0, 0xf0, 0x32, 0x57, 0x41,
+ 0x10, 0x10, 0xf1, 0x36,
+ 0x11, 0xd0, 0xf0, 0xfe, 0xe0, 0x10, 0x20, 0x00, 0x0b, 0xe0, 0xff, 0xe3,
+ 0x00, 0x7f, 0x3e, 0x03,
+ 0xe0, 0xec, 0xfd, 0xcf, 0x34, 0x65, 0x00, 0xce, 0x42, 0x30, 0x0f, 0x01,
+ 0x07, 0xd0, 0xaf, 0x1e,
+ 0x72, 0x16, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0xf1, 0x0f, 0x3d, 0x30,
+ 0x05, 0xf2, 0x90, 0xfa,
+ 0xee, 0x00, 0xfe, 0xe0, 0x07, 0xe0, 0xbe, 0x0e, 0x21, 0x01, 0xf0, 0x22,
+ 0x3f, 0x2d, 0x40, 0x40,
+ 0x05, 0xb1, 0xe0, 0x1b, 0x3d, 0x20, 0xdf, 0x8e, 0xed, 0x13, 0x53, 0xfe,
+ 0xca, 0x01, 0x00, 0x0e,
+ 0x00, 0x03, 0x0f, 0x02, 0x67, 0x0f, 0xdf, 0x01, 0x01, 0x1d, 0x1f, 0x00,
+ 0xc1, 0xd2, 0xed, 0xed,
+ 0xc9, 0xde, 0xff, 0xb3, 0xe2, 0x30, 0x75, 0x00, 0x20, 0x22, 0x01, 0xfe,
+ 0xe1, 0xe6, 0x22, 0x6f,
+ 0x0b, 0xbf, 0x00, 0x26, 0x11, 0x00, 0x2e, 0x1e, 0xef, 0xe2, 0x07, 0xb0,
+ 0xed, 0x0f, 0xf0, 0x01,
+ 0x56, 0x20, 0xcb, 0xbf, 0xed, 0x12, 0x32, 0x10, 0xdd, 0x01, 0x01, 0xe0,
+ 0x05, 0x00, 0x4e, 0x60,
+ 0x01, 0xc1, 0xff, 0x1f, 0x53, 0x14, 0xf0, 0xff, 0x0d, 0x1b, 0x30, 0x30,
+ 0xc2, 0x00, 0x00, 0x07,
+ 0x21, 0x3e, 0x0a, 0xc0, 0x01, 0x12, 0xfe, 0xed, 0xf1, 0x24, 0x71, 0x70,
+ 0x1e, 0xee, 0xf1, 0x06,
+ 0x00, 0xe0, 0xe0, 0x1d, 0x51, 0x03, 0xce, 0xf0, 0x15, 0x0d, 0xd8, 0xff,
+ 0x01, 0x01, 0x70, 0x0f,
+ 0x32, 0x33, 0xfd, 0xed, 0x67, 0x31, 0x00, 0xcf, 0xe0, 0xe0, 0xf0, 0xe0,
+ 0xe0, 0xee, 0x1d, 0x70,
+ 0x30, 0xe3, 0x05, 0x10, 0x3d, 0x0f, 0x57, 0x57, 0xe1, 0xb0, 0x00, 0x0f,
+ 0xee, 0x01, 0xd0, 0x00,
+ 0x31, 0x0d, 0xba, 0x01, 0x21, 0x21, 0x12, 0x00, 0xbd, 0x13, 0x47, 0x0f,
+ 0xfe, 0xe0, 0x01, 0xf0,
+ 0x9c, 0x0f, 0x13, 0x42, 0xfd, 0xed, 0x01, 0x20, 0x10, 0x65, 0x00, 0x0b,
+ 0x11, 0x03, 0x10, 0x30,
+ 0x0e, 0xbb, 0xe0, 0x26, 0x30, 0x00, 0x8d, 0x0f, 0x00, 0x01, 0x22, 0xe0,
+ 0xf0, 0xed, 0x0d, 0x01,
+ 0x00, 0x20, 0x30, 0xe8, 0xbd, 0x01, 0x0f, 0x1b, 0x53, 0x32, 0x1e, 0x40,
+ 0xe1, 0xb1, 0x17, 0x42,
+ 0x00, 0x10, 0xf1, 0xd0, 0x0f, 0x33, 0x35, 0xbf, 0x98, 0xf0, 0x12, 0x11,
+ 0x1f, 0x1f, 0x51, 0x02,
+ 0x0f, 0xff, 0xed, 0x01, 0x05, 0x00, 0x0d, 0xde, 0xdd, 0xcb, 0x00, 0x01,
+ 0x14, 0xe0, 0xee, 0x6e,
+ 0x42, 0xe5, 0xb0, 0x00, 0x41, 0x24, 0xef, 0xed, 0x10, 0x52, 0x01, 0xfd,
+ 0x0d, 0x0f, 0xec, 0xee,
+ 0x47, 0x65, 0xff, 0xce, 0x00, 0x02, 0x44, 0x00, 0xee, 0xef, 0x01, 0x00,
+ 0xbc, 0xf0, 0x13, 0x1e,
+ 0xfc, 0xf0, 0x21, 0x52, 0x1f, 0x1c, 0x21, 0x04, 0x00, 0x34, 0x41, 0xd9,
+ 0xcf, 0x00, 0xf0, 0x11,
+ 0x62, 0x00, 0x01, 0xe0, 0x0e, 0x02, 0x27, 0x0f, 0xed, 0x03, 0xf3, 0xbd,
+ 0x1e, 0x30, 0x31, 0xd0,
+ 0x98, 0xfd, 0x22, 0x53, 0xfe, 0xfd, 0x0f, 0xca, 0xd0, 0x14, 0x54, 0x20,
+ 0x0e, 0xef, 0xce, 0x22,
+ 0x03, 0x9c, 0xfc, 0x00, 0x00, 0x00, 0x10, 0x32, 0x0d, 0xea, 0x01, 0x75,
+ 0x52, 0xec, 0xfe, 0xf0,
+ 0xf1, 0x02, 0xf1, 0xfe, 0xff, 0xec, 0xbc, 0x00, 0x06, 0x20, 0x01, 0x01,
+ 0x51, 0x00, 0x66, 0x00,
+ 0x61, 0x27, 0x21, 0xfc, 0x72, 0x2a, 0xd8, 0x00, 0x32, 0x64, 0x26, 0x02,
+ 0xf1, 0x01, 0x10, 0x00,
+ 0xe0, 0xff, 0x3f, 0x67, 0xe0, 0xdd, 0x0f, 0x00, 0xee, 0xb0, 0x31, 0x53,
+ 0x00, 0x0b, 0xef, 0x0f,
+ 0x10, 0xe3, 0x00, 0x2e, 0x1d, 0xd1, 0x07, 0x70, 0x00, 0xed, 0xb0, 0x02,
+ 0x47, 0x00, 0xf0, 0x10,
+ 0x2f, 0x02, 0xe3, 0xce, 0xf8, 0x30, 0x62, 0xff, 0xf0, 0x00, 0x0e, 0xfd,
+ 0xde, 0x25, 0x63, 0xfd,
+ 0xcc, 0x01, 0x03, 0x01, 0xff, 0xcc, 0x00, 0x52, 0x01, 0xcd, 0x0c, 0x10,
+ 0x2f, 0xfb, 0xf1, 0x56,
+ 0x2f, 0x0e, 0x0f, 0x20, 0x13, 0xff, 0xae, 0xfd, 0x05, 0x02, 0xfe, 0xcc,
+ 0x21, 0x24, 0x00, 0xff,
+ 0xeb, 0x50, 0x44, 0x21, 0x11, 0x11, 0x01, 0xe0, 0xa0, 0x00, 0xf0, 0xdc,
+ 0xca, 0xff, 0x11, 0x43,
+ 0xf0, 0xee, 0x10, 0x0f, 0x88, 0x00, 0x20, 0x23, 0x13, 0x13, 0xf0, 0xf0,
+ 0xed, 0x0e, 0x32, 0x73,
+ 0x0d, 0xdf, 0xf4, 0x05, 0x11, 0x0b, 0xdd, 0x30, 0x01, 0xe1, 0x76, 0x50,
+ 0xdb, 0xc0, 0x00, 0x24,
+ 0x00, 0xfc, 0xce, 0x00, 0xf1, 0xf1, 0x11, 0x0e, 0x0e, 0x20, 0x20, 0x30,
+ 0x57, 0x11, 0xef, 0x10,
+ 0x62, 0x00, 0xf1, 0xf0, 0x0e, 0x10, 0xed, 0xf0, 0x40, 0xf0, 0x98, 0x0f,
+ 0x22, 0x23, 0x0e, 0x0e,
+ 0x01, 0x12, 0xf2, 0xe1, 0x00, 0x10, 0x08, 0x8d, 0x01, 0x65, 0x00, 0xff,
+ 0x00, 0x1f, 0xe1, 0x14,
+ 0x51, 0x02, 0xef, 0xdb, 0x00, 0x44, 0xff, 0xdb, 0x10, 0x63, 0x00, 0x0f,
+ 0x0c, 0x11, 0x42, 0x34,
+ 0xef, 0xdf, 0xf1, 0xf3, 0xd0, 0xb0, 0x0b, 0x20, 0x00, 0xbd, 0xfe, 0x63,
+ 0x11, 0xec, 0xe0, 0x00,
+ 0x00, 0x37, 0x07, 0x00, 0x00, 0x2f, 0x3f, 0x01, 0x03, 0xd0, 0x10, 0x40,
+ 0xda, 0x10, 0x53, 0xcf,
+ 0x9d, 0xf0, 0x12, 0x43, 0x01, 0xde, 0x00, 0x24, 0x0f, 0xec, 0x01, 0x02,
+ 0xcd, 0xdc, 0xe0, 0xf0,
+ 0xcd, 0x1f, 0x52, 0x0e, 0xdd, 0x00, 0x00, 0x60, 0x1c, 0x02, 0x07, 0x10,
+ 0x2c, 0x2f, 0x60, 0x14,
+ 0x04, 0x0e, 0x0c, 0x35, 0xe1, 0x8c, 0x00, 0x0f, 0x0f, 0x03, 0x03, 0xe0,
+ 0x0e, 0x0a, 0xfe, 0xc1,
+ 0x02, 0xed, 0x1b, 0x5e, 0x00, 0x04, 0x60, 0x1e, 0x2f, 0x00, 0xf0, 0x04,
+ 0x67, 0xf1, 0xbd, 0x00,
+ 0x01, 0xd1, 0xdf, 0x0f, 0x01, 0x23, 0x2d, 0x09, 0x30, 0x73, 0x00, 0x00,
+ 0x24, 0x0f, 0xcd, 0xef,
+ 0x26, 0x52, 0xfd, 0xbb, 0xf0, 0x00, 0x10, 0xfe, 0x00, 0x01, 0x00, 0xf1,
+ 0x22, 0x0f, 0xde, 0xc5,
+ 0x43, 0x64, 0x00, 0x0f, 0xfd, 0x10, 0x00, 0xfe, 0xde, 0x33, 0x52, 0xfb,
+ 0xf0, 0x37, 0x35, 0x00,
+ 0x0e, 0xf0, 0xa1, 0xe2, 0x05, 0xcf, 0xcb, 0x11, 0x42, 0xef, 0xcd, 0x00,
+ 0xf0, 0x00, 0x1f, 0x0c,
+ 0x60, 0x43, 0x05, 0xf0, 0x0f, 0x00, 0x1f, 0x10, 0x20, 0x40, 0x12, 0xc0,
+ 0xcd, 0x0e, 0x01, 0x47,
+ 0x13, 0xee, 0xca, 0x32, 0x40, 0xfe, 0xde, 0x07, 0xe0, 0xcf, 0x1d, 0x50,
+ 0x0e, 0x21, 0x01, 0xcd,
+ 0x0c, 0x40, 0xf0, 0x12, 0x61, 0x00, 0x04, 0xb1, 0xed, 0xf0, 0x07, 0x1e,
+ 0xfb, 0x90, 0xf0, 0x03,
+ 0x40, 0x1c, 0x10, 0x11, 0x0f, 0xf1, 0x25, 0x0d, 0xdd, 0x44, 0x24, 0xf0,
+ 0xd0, 0xbf, 0xeb, 0xfe,
+ 0x0e, 0x1f, 0xf1, 0xf3, 0x0d, 0x1f, 0x32, 0x50, 0x03, 0xd3, 0x90, 0x37,
+ 0x67, 0x01, 0xf0, 0x10,
+ 0x04, 0x01, 0x00, 0x00, 0xfe, 0xd0, 0x10, 0x1f, 0x00, 0x0f, 0xee, 0xd0,
+ 0x01, 0x3f, 0x0b, 0x00,
+ 0x45, 0x22, 0x00, 0xfc, 0x72, 0x77, 0xf1, 0xed, 0x0f, 0x2f, 0x12, 0x36,
+ 0x00, 0xdf, 0xce, 0x40,
+ 0x70, 0x34, 0x03, 0xcf, 0xfa, 0x30, 0x33, 0x0e, 0xdf, 0xf0, 0xdf, 0x20,
+ 0x60, 0x02, 0xb0, 0xe9,
+ 0x01, 0x34, 0xd0, 0xcf, 0x0f, 0xde, 0xed, 0x02, 0x03, 0xfd, 0xbb, 0x10,
+ 0x5f, 0x44, 0x11, 0xd8,
+ 0x0e, 0x52, 0x12, 0xe0, 0xef, 0x0f, 0x01, 0x21, 0xcf, 0xdb, 0x10, 0x32,
+ 0x0f, 0xde, 0x30, 0x61,
+ 0x21, 0xff, 0xf2, 0x07, 0x21, 0xac, 0xe0, 0x12, 0x02, 0xd0, 0xd0, 0xe0,
+ 0x0d, 0x0c, 0xee, 0xe0,
+ 0x31, 0x0d, 0x9a, 0x00, 0x53, 0x00, 0x20, 0x05, 0xb1, 0x01, 0x0d, 0x0e,
+ 0x14, 0x02, 0xbd, 0x11,
+ 0x24, 0xed, 0xec, 0x30, 0x4c, 0x52, 0x07, 0xe0, 0x00, 0x50, 0x00, 0xcd,
+ 0x01, 0x04, 0xf0, 0x0f,
+ 0xf9, 0xe0, 0xf0, 0xd0, 0x80, 0xfe, 0x00, 0x10, 0x00, 0x0f, 0xee, 0x11,
+ 0x57, 0x02, 0x2f, 0x00,
+ 0x02, 0x22, 0x61, 0x0f, 0xfc, 0xf2, 0x00, 0x1d, 0x1d, 0x46, 0x31, 0xed,
+ 0xbc, 0xf0, 0xf3, 0x0f,
+ 0x00, 0x44, 0x00, 0xde, 0xea, 0x00, 0x53, 0xe1, 0x00, 0x70, 0x2c, 0x10,
+ 0x43, 0x16, 0xd0, 0xae,
+ 0xfb, 0x00, 0x53, 0x02, 0xd2, 0xfd, 0xfc, 0x00, 0x31, 0x0f, 0xff, 0x00,
+ 0x20, 0x30, 0x22, 0x10,
+ 0x24, 0x02, 0xf0, 0x1f, 0x10, 0x9b, 0xec, 0x32, 0x11, 0xbd, 0xac, 0xfc,
+ 0x00, 0x27, 0x31, 0xdc,
+ 0xdf, 0x02, 0x35, 0xff, 0x0d, 0x72, 0x34, 0x02, 0xf1, 0xe0, 0xef, 0x10,
+ 0x43, 0xe2, 0xbe, 0x0c,
+ 0x20, 0x02, 0x05, 0xf1, 0xde, 0xba, 0x00, 0x21, 0x22, 0x23, 0x31, 0x3e,
+ 0x9d, 0xf1, 0x36, 0x20,
+ 0xce, 0xc8, 0x00, 0x11, 0xc1, 0xce, 0x1e, 0x50, 0x04, 0x00, 0xe0, 0x1e,
+ 0x12, 0x00, 0x5f, 0x43,
+ 0x02, 0x0f, 0xfd, 0xe0, 0xe1, 0x15, 0x41, 0x01, 0xf0, 0xdd, 0xfb, 0xdf,
+ 0xed, 0xbe, 0x01, 0x01,
+ 0xef, 0x28, 0x7f, 0x70, 0x11, 0x12, 0x0f, 0x0b, 0xf0, 0x00, 0x03, 0x05,
+ 0x00, 0xdf, 0xdd, 0x00,
+ 0xf1, 0xd1, 0xe0, 0x21, 0x32, 0x0d, 0x43, 0x77, 0x50, 0xec, 0xe1, 0x15,
+ 0x10, 0x0f, 0xce, 0x10,
+ 0x30, 0xde, 0xc2, 0x03, 0x00, 0x0e, 0x0a, 0xf0, 0x10, 0x32, 0x10, 0xf9,
+ 0xed, 0x73, 0x67, 0xd0,
+ 0xcf, 0xfd, 0x32, 0x62, 0x00, 0xc2, 0x02, 0x10, 0x1e, 0x2d, 0x01, 0x11,
+ 0x03, 0xf0, 0xc8, 0xff,
+ 0x43, 0x13, 0xd0, 0xbe, 0x04, 0x03, 0x00, 0x0c, 0xcf, 0xff, 0x00, 0x11,
+ 0x12, 0xff, 0xc8, 0xef,
+ 0xfe, 0xef, 0x20, 0x40, 0x4d, 0x40, 0x41, 0x35, 0x42, 0xf0, 0xe3, 0xf5,
+ 0x20, 0x40, 0x00, 0x26,
+ 0x62, 0x00, 0x00, 0xdd, 0xcc, 0x00, 0x00, 0xfd, 0xee, 0x67, 0x21, 0x0e,
+ 0xfe, 0xee, 0x02, 0x17,
+ 0x00, 0x5c, 0x31, 0xf0, 0x8e, 0xf0, 0xf0, 0xe1, 0x01, 0x0f, 0xd9, 0xf0,
+ 0x02, 0x20, 0x1f, 0xed,
+ 0x0f, 0x71, 0x14, 0x02, 0xff, 0xe9, 0xff, 0x52, 0x33, 0x01, 0x00, 0xec,
+ 0xef, 0x0f, 0x1d, 0xf0,
+ 0x02, 0xb0, 0x8b, 0xef, 0xf0, 0x11, 0x41, 0x01, 0xf0, 0xe1, 0x16, 0x20,
+ 0x0f, 0x00, 0x02, 0xc2,
+ 0xe1, 0x65, 0x23, 0x03, 0x00, 0x05, 0x62, 0x00, 0xc9, 0x0f, 0x10, 0x02,
+ 0x00, 0x1e, 0x0f, 0xbb,
+ 0xff, 0x01, 0x54, 0x10, 0xf0, 0xde, 0xf0, 0x37, 0x52, 0xf0, 0xdf, 0xef,
+ 0xdf, 0x1e, 0x50, 0x21,
+ 0x03, 0xcc, 0x1f, 0x53, 0x00, 0x09, 0x11, 0x13, 0x10, 0x0d, 0x0f, 0x10,
+ 0x37, 0x12, 0xcc, 0xd0,
+ 0xd0, 0xaf, 0xcf, 0xe0, 0xf1, 0x01, 0x33, 0xd2, 0xcc, 0x1a, 0x50, 0x20,
+ 0x20, 0x00, 0x12, 0x45,
+ 0x10, 0x0d, 0xef, 0xef, 0xe0, 0xe0, 0xdc, 0xab, 0x11, 0x51, 0xff, 0x0b,
+ 0x42, 0x14, 0xe0, 0x2f,
+ 0x62, 0x13, 0xee, 0xde, 0x02, 0x26, 0x2f, 0xbd, 0xf0, 0xf0, 0xe0, 0x00,
+ 0x0f, 0xea, 0x30, 0x42,
+ 0xaf, 0x00, 0x12, 0x2e, 0x9c, 0x0f, 0x1f, 0xef, 0xd1, 0x41, 0x11, 0xf6,
+ 0xd0, 0x25, 0x41, 0xed,
+ 0xef, 0xe0, 0xd1, 0x73, 0x21, 0xdf, 0x25, 0x64, 0x0d, 0xfc, 0x03, 0x12,
+ 0x1e, 0x00, 0xef, 0x0b,
+ 0x01, 0x04, 0x9c, 0xfb, 0x00, 0xf3, 0xe0, 0x01, 0xfd, 0x4f, 0xe0, 0xd0,
+ 0x10, 0x10, 0xec, 0x02,
+ 0x24, 0xc0, 0xc0, 0x44, 0x7f, 0x2c, 0x03, 0x13, 0x00, 0x3c, 0xdf, 0xf0,
+ 0x14, 0x11, 0x20, 0xcd,
+ 0x9b, 0xfc, 0xe0, 0x01, 0x24, 0x31, 0x40, 0xfc, 0xdf, 0x54, 0x34, 0x0f,
+ 0x0c, 0xc0, 0xe0, 0x23,
+ 0x54, 0x00, 0xfc, 0xcd, 0xe0, 0x03, 0x55, 0x0c, 0x00, 0x00, 0x0e, 0xdb,
+ 0x13, 0x57, 0x3f, 0xfe,
+ 0xe0, 0x13, 0x31, 0x01, 0xbf, 0x1f, 0x21, 0x12, 0xdf, 0xb8, 0xf0, 0x01,
+ 0x31, 0x1e, 0xde, 0x33,
+ 0x25, 0xff, 0xdc, 0x40, 0x72, 0x01, 0xd1, 0x00, 0xe2, 0x30, 0x1f, 0xe2,
+ 0x06, 0x40, 0xcc, 0xb0,
+ 0x00, 0x20, 0x16, 0x00, 0x00, 0x30, 0xef, 0xe0, 0xf1, 0xbd, 0xe0, 0xf2,
+ 0x14, 0x73, 0x0e, 0x88,
+ 0x0f, 0x03, 0x11, 0xfd, 0xdf, 0x2e, 0x2d, 0x00, 0x01, 0x15, 0x2e, 0x1e,
+ 0x00, 0xf6, 0x30, 0x00,
+ 0x10, 0x70, 0x21, 0x02, 0xe0, 0xfe, 0x1e, 0x10, 0xae, 0xbb, 0xf1, 0xf2,
+ 0xfb, 0x10, 0x20, 0xdf,
+ 0x0d, 0x7e, 0x1c, 0x0f, 0x00, 0x01, 0x47, 0x02, 0xe0, 0x0d, 0x20, 0xf1,
+ 0xcd, 0xdf, 0xf0, 0x02,
+ 0xf8, 0xef, 0x62, 0x00, 0xcd, 0x20, 0x46, 0x11, 0xdf, 0x00, 0x24, 0x10,
+ 0x50, 0x22, 0x00, 0xb0,
+ 0x02, 0x00, 0xdc, 0xcd, 0x1e, 0x1b, 0xf0, 0xa1, 0x04, 0x00, 0x1b, 0x11,
+ 0x42, 0xed, 0xec, 0x02,
+ 0x46, 0x30, 0x10, 0xb0, 0xfe, 0x00, 0x30, 0xfe, 0xf0, 0x56, 0x10, 0xfd,
+ 0xee, 0x04, 0x15, 0x20,
+ 0x50, 0x0e, 0xe0, 0x02, 0x03, 0x00, 0xe0, 0xd0, 0x8d, 0x0d, 0x01, 0x04,
+ 0xf3, 0xff, 0x0a, 0xce,
+ 0x0e, 0x31, 0x41, 0xdb, 0xdd, 0x43, 0x34, 0xee, 0xe0, 0x45, 0x00, 0xff,
+ 0x30, 0x7f, 0x2f, 0x31,
+ 0x25, 0x13, 0xaf, 0xfe, 0x27, 0x40, 0xde, 0xdd, 0x10, 0x22, 0x0f, 0xba,
+ 0xe0, 0x11, 0x45, 0x00,
+ 0x0e, 0x61, 0x11, 0x00, 0x0e, 0xb0, 0xbe, 0x3e, 0x2e, 0xa0, 0x13, 0x15,
+ 0x0b, 0xfe, 0xf2, 0x03,
+ 0x1f, 0x0c, 0x03, 0x20, 0x0c, 0xf0, 0x04, 0x22, 0x1c, 0x0d, 0xff, 0xcf,
+ 0x00, 0x24, 0x00, 0xc9,
+ 0x00, 0xc0, 0xd1, 0xdf, 0xfd, 0x2e, 0x70, 0xf0, 0xd5, 0xf0, 0x11, 0x40,
+ 0xf1, 0x03, 0x27, 0x33,
+ 0x0f, 0x0c, 0x41, 0x36, 0xa0, 0xdf, 0xef, 0x31, 0x31, 0x21, 0x20, 0x0f,
+ 0xef, 0x3e, 0x71, 0x67,
+ 0x00, 0xee, 0xef, 0x12, 0x22, 0x11, 0x14, 0xf2, 0xb0, 0xcd, 0xf3, 0x26,
+ 0x30, 0x1d, 0x0f, 0x6e,
+ 0x0e, 0xdf, 0x35, 0x21, 0x20, 0x61, 0x10, 0x0c, 0x10, 0x07, 0xf1, 0xff,
+ 0x1f, 0x30, 0xcf, 0x8d,
+ 0xf1, 0xf3, 0xe0, 0xfd, 0x0d, 0xea, 0xf0, 0x01, 0xf1, 0x30, 0x3f, 0x00,
+ 0x04, 0x24, 0x3c, 0x9a,
+ 0xff, 0x60, 0x22, 0x00, 0xdf, 0x0c, 0x10, 0x2f, 0xfe, 0xbc, 0x10, 0x16,
+ 0xff, 0x0f, 0x50, 0xf1,
+ 0xcf, 0xff, 0x00, 0x77, 0x22, 0xee, 0x00, 0xf0, 0xe0, 0x00, 0x03, 0xd9,
+ 0xee, 0x10, 0x13, 0xff,
+ 0xee, 0xe1, 0x02, 0x0d, 0x5b, 0x40, 0xb1, 0xc0, 0x0f, 0x11, 0xff, 0xfc,
+ 0x32, 0x14, 0x02, 0xe2,
+ 0xd0, 0xb0, 0x01, 0x21, 0xef, 0x02, 0x77, 0x22, 0x2c, 0x10, 0x34, 0x40,
+ 0xff, 0xcb, 0xd0, 0x40,
+ 0x0e, 0xde, 0x25, 0xb4, 0xbf, 0x0b, 0xd0, 0x00, 0x0e, 0x00, 0xf2, 0x03,
+ 0x8d, 0xeb, 0x02, 0x32,
+ 0x2e, 0xec, 0x00, 0x31, 0x41, 0x0f, 0x11, 0x44, 0x11, 0x44, 0x20, 0x00,
+ 0xbd, 0xdc, 0xef, 0x14,
+ 0x42, 0x0e, 0x0d, 0xd0, 0xe0, 0x0f, 0x3a, 0x54, 0x04, 0xde, 0x0f, 0x32,
+ 0x34, 0x00, 0x0e, 0x00,
+ 0xad, 0x0d, 0x5f, 0x14, 0xf1, 0xbb, 0x0b, 0x0f, 0x32, 0xe0, 0xf2, 0xf0,
+ 0x1e, 0x2d, 0x30, 0x77,
+ 0x27, 0xf0, 0xce, 0x0f, 0x00, 0xe1, 0xf0, 0x10, 0x00, 0x0f, 0x40, 0xee,
+ 0xe0, 0x74, 0x10, 0x89,
+ 0x20, 0x31, 0xa1, 0x00, 0x41, 0x05, 0xe0, 0xfd, 0xfe, 0x00, 0x11, 0x10,
+ 0xd1, 0x05, 0x61, 0x00,
+ 0xef, 0xff, 0x10, 0x45, 0x00, 0xf1, 0x04, 0xf2, 0xf0, 0x02, 0x1e, 0xd8,
+ 0xae, 0x01, 0x12, 0x32,
+ 0xd0, 0x0a, 0xe0, 0xe0, 0x61, 0xf1, 0xf0, 0x2f, 0x10, 0xe0, 0xdf, 0x10,
+ 0x73, 0x1d, 0x20, 0x03,
+ 0xd3, 0x10, 0x50, 0x01, 0xde, 0x37, 0x27, 0xef, 0xbd, 0x00, 0x01, 0x10,
+ 0x10, 0xef, 0x00, 0xfc,
+ 0xfc, 0x0f, 0x70, 0x1e, 0x14, 0x24, 0xae, 0x0d, 0x3f, 0x1f, 0xf0, 0xe6,
+ 0x03, 0x00, 0xeb, 0xe0,
+ 0x20, 0xeb, 0x8e, 0xf0, 0x04, 0x01, 0x2f, 0x6d, 0x01, 0x01, 0xf3, 0x36,
+ 0x41, 0xf0, 0xec, 0xe0,
+ 0x13, 0x22, 0x01, 0x4f, 0xdd, 0x8c, 0x0e, 0x01, 0x05, 0xf0, 0xed, 0x21,
+ 0x1f, 0xff, 0x01, 0xf4,
+ 0x0f, 0x30, 0x0d, 0xfc, 0x1e, 0x21, 0x02, 0xad, 0xe8, 0x1c, 0x41, 0x03,
+ 0x04, 0x00, 0x0f, 0xf0,
+ 0x56, 0x01, 0xef, 0x0f, 0x02, 0x21, 0x81, 0x12, 0x61, 0x0c, 0xdc, 0xf0,
+ 0x02, 0x23, 0x2e, 0xdb,
+ 0xf1, 0x12, 0xe0, 0xb0, 0x0f, 0xfd, 0x10, 0x14, 0xde, 0xf0, 0x33, 0x0a,
+ 0x5f, 0x30, 0x34, 0x73,
+ 0x11, 0x0e, 0xf2, 0x27, 0x10, 0xf0, 0x0e, 0xef, 0xdf, 0x34, 0x31, 0xed,
+ 0xec, 0x0f, 0x7e, 0x0e,
+ 0xc0, 0xf3, 0x27, 0x62, 0x0c, 0xe0, 0xf3, 0x10, 0x10, 0x0f, 0xbc, 0xde,
+ 0x00, 0xec, 0xdd, 0x20,
+ 0x41, 0x8f, 0x4f, 0x30, 0x80, 0x00, 0x2f, 0x0e, 0xe7, 0x01, 0x10, 0x20,
+ 0xf9, 0xdd, 0x12, 0x37,
+ 0x0f, 0x99, 0x0f, 0x00, 0x20, 0x03, 0x00, 0xee, 0xf0, 0x00, 0x11, 0x46,
+ 0x10, 0xee, 0xf0, 0x21,
+ 0x01, 0x90, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x21, 0x3f, 0x2d, 0x12, 0x07,
+ 0x24, 0x71, 0x00, 0xae,
+ 0x10, 0x25, 0x0f, 0xce, 0x02, 0x00, 0xdd, 0x0d, 0x04, 0x25, 0x00, 0x00,
+ 0xed, 0xf0, 0x04, 0x30,
+ 0x1f, 0xef, 0xe0, 0x0c, 0x1e, 0x7e, 0x76, 0x31, 0xec, 0xfe, 0x2e, 0x22,
+ 0x35, 0x00, 0x90, 0x00,
+ 0xf5, 0xe0, 0xfe, 0x0e, 0x00, 0xd0, 0xff, 0xe1, 0x27, 0x30, 0xc0, 0xbc,
+ 0x00, 0x63, 0x10, 0x0e,
+ 0x0d, 0xf1, 0x03, 0x20, 0xeb, 0xf1, 0x42, 0x2d, 0x0b, 0x10, 0x10, 0xbe,
+ 0x02, 0x02, 0xfb, 0x00,
+ 0xf0, 0x1f, 0x71, 0x32, 0xe0, 0x01, 0x15, 0x53, 0x14, 0xed, 0xde, 0x00,
+ 0xd2, 0xfe, 0x4e, 0xbd,
+ 0xb9, 0xee, 0x00, 0x21, 0x0b, 0xcf, 0x10, 0x77, 0x01, 0x0f, 0xdf, 0x00,
+ 0x00, 0xd0, 0xd1, 0xf3,
+ 0x10, 0x2d, 0x2f, 0xfd, 0x12, 0x60, 0x1c, 0x20, 0x10, 0x11, 0x47, 0x04,
+ 0x0e, 0x30, 0x31, 0x74,
+ 0x20, 0x8f, 0xf9, 0xe0, 0x20, 0x00, 0x02, 0xde, 0xed, 0xd0, 0xde, 0xe6,
+ 0x11, 0x2f, 0x1d, 0xf1,
+ 0x34, 0x6f, 0xfc, 0x00, 0x02, 0x3f, 0x3d, 0x43, 0x03, 0xdc, 0x0c, 0x1f,
+ 0x74, 0x27, 0xf0, 0xce,
+ 0x00, 0x13, 0x4f, 0x4d, 0xe2, 0xd5, 0x01, 0x1c, 0xdc, 0xb1, 0x24, 0x31,
+ 0x0f, 0x9d, 0x02, 0x32,
+ 0x1f, 0x12, 0x25, 0xec, 0x8c, 0x00, 0x44, 0x21, 0xfe, 0xfe, 0x0f, 0xff,
+ 0x03, 0x26, 0x30, 0xde,
+ 0xde, 0xf0, 0x03, 0x55, 0x21, 0x3f, 0x2c, 0xd0, 0xc2, 0x00, 0x00, 0x0e,
+ 0x32, 0x30, 0xe1, 0xc1,
+ 0x0e, 0x7f, 0x31, 0xe0, 0x8d, 0x1b, 0x2e, 0xad, 0x03, 0x46, 0xf0, 0xee,
+ 0x00, 0x2c, 0x0c, 0xe1,
+ 0x07, 0x02, 0x12, 0x40, 0x12, 0xd2, 0xee, 0x0f, 0x0e, 0xc0, 0x07, 0x21,
+ 0x20, 0x40, 0xee, 0x8c,
+ 0x0e, 0x20, 0xc1, 0x03, 0x44, 0xff, 0xd9, 0xf0, 0x14, 0x10, 0x00, 0x0e,
+ 0x00, 0x4e, 0x20, 0xd0,
+ 0x02, 0x73, 0x1f, 0x00, 0xe0, 0xe1, 0x04, 0x41, 0x0f, 0xe0, 0xf2, 0x18,
+ 0xac, 0xe0, 0x01, 0x50,
+ 0x0d, 0xee, 0xfd, 0x2c, 0x1e, 0x12, 0xe7, 0x23, 0x60, 0xee, 0xea, 0x00,
+ 0x10, 0x0f, 0xf2, 0x12,
+ 0x0e, 0xbb, 0x00, 0x00, 0x0f, 0x1c, 0xdf, 0x40, 0x2f, 0xa1, 0x01, 0x01,
+ 0x34, 0x00, 0x30, 0x00,
+ 0xa6, 0xef, 0xd7, 0x03, 0xc1, 0xef, 0xf1, 0x07, 0x43, 0x47, 0xd2, 0x01,
+ 0x75, 0x00, 0xfd, 0xe1,
+ 0x05, 0x00, 0x0e, 0xae, 0xef, 0x0e, 0x00, 0xf3, 0x21, 0x00, 0xbd, 0xf2,
+ 0x44, 0x2d, 0xfc, 0x00,
+ 0x19, 0x0e, 0x01, 0x21, 0x73, 0x21, 0xef, 0xdb, 0x10, 0x54, 0x04, 0xe3,
+ 0x00, 0x0f, 0x00, 0xe1,
+ 0xb0, 0x25, 0x54, 0xfd, 0xed, 0x00, 0x12, 0x16, 0x00, 0xfb, 0xd0, 0x22,
+ 0xf0, 0x8f, 0x00, 0xef,
+ 0xff, 0xfe, 0x0c, 0x10, 0x34, 0x00, 0xec, 0x42, 0x42, 0x01, 0xed, 0xeb,
+ 0x20, 0x42, 0x14, 0x31,
+ 0x22, 0x0f, 0x0d, 0x00, 0xa0, 0x0f, 0x56, 0x31, 0x1d, 0xa1, 0x16, 0x2f,
+ 0xfd, 0xcf, 0x0e, 0x11,
+ 0x06, 0xf0, 0xfe, 0x0f, 0x10, 0x20, 0x03, 0x81, 0xc0, 0x7d, 0x1e, 0xd0,
+ 0x34, 0x00, 0x0a, 0xd0,
+ 0x00, 0x10, 0xf1, 0xf2, 0x11, 0x2e, 0x0a, 0xce, 0xfe, 0xe0, 0x0b, 0x4d,
+ 0x11, 0x04, 0xbd, 0xfd,
+ 0x20, 0x0f, 0xc0, 0x0e, 0x04, 0x27, 0x41, 0xed, 0xd0, 0x12, 0xc2, 0xbf,
+ 0x0d, 0x00, 0x32, 0x11,
+ 0x10, 0x47, 0x33, 0x0c, 0xfd, 0x03, 0xf4, 0x10, 0x60, 0xd3, 0x12, 0x74,
+ 0x43, 0xdf, 0xff, 0x03,
+ 0x31, 0x11, 0x07, 0x32, 0xda, 0x90, 0x10, 0x06, 0x00, 0xf0, 0xee, 0xf0,
+ 0xf0, 0xff, 0x01, 0x73,
+ 0x10, 0x1c, 0x0e, 0x0e, 0x52, 0x34, 0x1f, 0x0b, 0x11, 0x22, 0x02, 0xc1,
+ 0x02, 0x21, 0x11, 0x9b,
+ 0xdf, 0x01, 0xf6, 0xf0, 0xce, 0xec, 0x00, 0x43, 0x00, 0xfd, 0x62, 0x27,
+ 0xee, 0xee, 0xfe, 0xe1,
+ 0x03, 0x21, 0x1b, 0x40, 0x00, 0xdf, 0xec, 0xe0, 0xe1, 0x4f, 0xfb, 0xc0,
+ 0xff, 0x10, 0x71, 0x44,
+ 0xd1, 0xef, 0x30, 0x35, 0x01, 0xdf, 0xf0, 0x0f, 0x0e, 0x0f, 0xef, 0xdd,
+ 0xb3, 0x11, 0x58, 0x3f,
+ 0xfe, 0x80, 0x10, 0x06, 0xf1, 0xf0, 0x0e, 0xdd, 0xd1, 0xe4, 0x21, 0xdf,
+ 0xae, 0x1b, 0x0f, 0x01,
+ 0x60, 0x00, 0x0d, 0xe0, 0x05, 0x03, 0x13, 0x3f, 0x7c, 0x11, 0xf0, 0xdc,
+ 0x40, 0x0f, 0xe0, 0xd0,
+ 0x07, 0x40, 0xdd, 0xcc, 0xf0, 0x07, 0xc1, 0x9e, 0x0e, 0x31, 0x14, 0x00,
+ 0xee, 0xdf, 0x00, 0x00,
+ 0x0f, 0x42, 0x32, 0xd8, 0xff, 0x70, 0x13, 0xe0, 0x00, 0x0d, 0x00, 0x22,
+ 0x54, 0x10, 0x02, 0xc2,
+ 0xfc, 0xdd, 0x10, 0x63, 0x00, 0xdb, 0x00, 0x43, 0x0e, 0xdb, 0xf0, 0x14,
+ 0x31, 0x0f, 0xec, 0x31,
+ 0x64, 0x00, 0xde, 0xca, 0xf0, 0x30, 0x22, 0x00, 0xef, 0xdc, 0x0f, 0x00,
+ 0x74, 0x34, 0x0f, 0xdd,
+ 0xc0, 0x22, 0x65, 0x22, 0xf0, 0xfd, 0xb2, 0x12, 0x7f, 0x0b, 0xb0, 0x20,
+ 0x25, 0xe1, 0xfc, 0x0e,
+ 0x00, 0x23, 0x01, 0xdd, 0x0f, 0x2d, 0x0c, 0x00, 0x05, 0x71, 0xf0, 0xe4,
+ 0x01, 0x0d, 0xfe, 0x03,
+ 0x14, 0xe0, 0xff, 0x27, 0x32, 0xdf, 0xbe, 0x01, 0x75, 0xf0, 0xec, 0x40,
+ 0xf2, 0xe1, 0x00, 0x00,
+ 0x1f, 0xe0, 0xef, 0x0f, 0xf3, 0xc3, 0x1d, 0x61, 0x17, 0x00, 0x0e, 0x10,
+ 0x03, 0xf2, 0xfd, 0xfb,
+ 0x20, 0x4d, 0x24, 0x13, 0x0e, 0x2e, 0xfd, 0xdd, 0xc6, 0x96, 0x00, 0xfb,
+ 0x10, 0x7f, 0x5e, 0xd0,
+ 0xf3, 0x03, 0x0e, 0x09, 0xd0, 0x31, 0x64, 0x0f, 0xde, 0x01, 0x13, 0x0f,
+ 0xdc, 0xff, 0x31, 0x30,
+ 0xbd, 0x02, 0x44, 0x08, 0x0f, 0xff, 0x10, 0x61, 0x10, 0x10, 0xe1, 0xe1,
+ 0x01, 0x23, 0x04, 0x20,
+ 0xe0, 0x8e, 0xd0, 0x23, 0x24, 0xed, 0x0d, 0x04, 0xe0, 0x09, 0xae, 0x00,
+ 0x03, 0x10, 0x1f, 0xda,
+ 0xd0, 0x43, 0x20, 0x1e, 0xfc, 0x0d, 0x11, 0x64, 0x01, 0xc0, 0x00, 0x1f,
+ 0x52, 0x05, 0xf2, 0x12,
+ 0x21, 0xfc, 0x0e, 0x45, 0x33, 0xd0, 0xd0, 0x4f, 0xff, 0xf4, 0x00, 0x09,
+ 0xc0, 0xc3, 0xa0, 0x00,
+ 0x3d, 0xe0, 0xdf, 0x00, 0x4f, 0x03, 0x80, 0xed, 0x25, 0x30, 0x0e, 0x1e,
+ 0xf0, 0xef, 0x1f, 0x27,
+ 0x13, 0x3e, 0x3c, 0x20, 0x33, 0x77, 0x11, 0xee, 0x10, 0x25, 0xee, 0x0c,
+ 0xe0, 0x22, 0x62, 0xd0,
+ 0xad, 0x2f, 0x10, 0x90, 0x01, 0x62, 0x00, 0xe0, 0x03, 0x15, 0x01, 0xe0,
+ 0x00, 0x0e, 0x0f, 0x0b,
+ 0xcd, 0x1f, 0x2d, 0x18, 0x0f, 0x01, 0xd1, 0x0a, 0x0e, 0x10, 0x10, 0x00,
+ 0xe0, 0xb0, 0x10, 0x1e,
+ 0x60, 0x53, 0xe2, 0xd0, 0x05, 0x01, 0xcc, 0x2c, 0x3f, 0xd1, 0xd4, 0xef,
+ 0x0b, 0x33, 0x74, 0x0d,
+ 0xce, 0xe1, 0x36, 0x20, 0x10, 0xdf, 0xdd, 0x00, 0xf0, 0x22, 0x32, 0x1d,
+ 0xee, 0xa0, 0xe1, 0x17,
+ 0x75, 0x3f, 0x0d, 0xd0, 0xc3, 0x02, 0x56, 0x01, 0xef, 0xdd, 0x00, 0x10,
+ 0x00, 0xe1, 0xe0, 0x0b,
+ 0x50, 0x02, 0x13, 0x1e, 0x38, 0x7e, 0x51, 0x05, 0xe0, 0xe0, 0x00, 0x40,
+ 0x10, 0x01, 0xc0, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x03, 0xbe, 0xfd, 0xf2, 0xf4, 0x15, 0x32, 0xce, 0xdc,
+ 0xff, 0x12, 0x34, 0x00,
+ 0x7f, 0x3f, 0xff, 0xdd, 0xeb, 0x3d, 0x30, 0x00, 0xa4, 0xfd, 0xf9, 0x00,
+ 0x43, 0x10, 0x30, 0x10,
+ 0xbb, 0xd0, 0x00, 0x4f, 0x00, 0x33, 0x00, 0xff, 0x01, 0xf2, 0x0d, 0xd8,
+ 0x80, 0x20, 0x64, 0x01,
+ 0x04, 0xf2, 0xff, 0xe8, 0x00, 0x30, 0x12, 0xf0, 0xfe, 0xe0, 0xf2, 0xe0,
+ 0xdf, 0x0f, 0x7f, 0x0e,
+ 0xbf, 0xf3, 0xf3, 0x1c, 0x2d, 0x11, 0xd3, 0xfc, 0x0d, 0x70, 0x43, 0x33,
+ 0xf0, 0xe0, 0x02, 0x10,
+ 0x04, 0xc7, 0x07, 0x02, 0xfe, 0x9c, 0xf0, 0xb0, 0xf0, 0x0e, 0x10, 0x03,
+ 0x0e, 0x30, 0x30, 0xeb,
+ 0xed, 0x0e, 0x10, 0x30, 0x46, 0xf0, 0xda, 0xdf, 0xce, 0x20, 0x35, 0x22,
+ 0x02, 0xcf, 0xde, 0x2e,
+ 0x71, 0x25, 0xcf, 0x0d, 0x00, 0x41, 0x52, 0xd2, 0xdd, 0x70, 0x37, 0x85,
+ 0x10, 0x20, 0xfe, 0xe0,
+ 0xfd, 0x00, 0x33, 0x07, 0x00, 0xce, 0x2f, 0x4f, 0x00, 0xfe, 0x1f, 0x23,
+ 0xe2, 0xf9, 0x00, 0x12,
+ 0x33, 0xfd, 0xfa, 0x00, 0x83, 0x22, 0x21, 0xce, 0x0e, 0x40, 0x01, 0xe0,
+ 0xc0, 0x14, 0x31, 0x1f,
+ 0xed, 0xcd, 0x0f, 0x3f, 0x0d, 0x10, 0xf3, 0xe7, 0x13, 0x70, 0x2d, 0x10,
+ 0xe1, 0xe0, 0xf7, 0x13,
+ 0xe3, 0x20, 0x10, 0x8b, 0xef, 0x0e, 0x3e, 0x0f, 0x01, 0xf1, 0x10, 0x2e,
+ 0xfe, 0xc0, 0x02, 0x46,
+ 0x1f, 0xff, 0xb4, 0xd5, 0xd2, 0x01, 0x2f, 0xe9, 0xff, 0xd1, 0x73, 0x22,
+ 0x0e, 0x0f, 0x31, 0x21,
+ 0x0e, 0xee, 0x71, 0x32, 0xdf, 0xc5, 0x06, 0x00, 0x3f, 0xec, 0xf1, 0x00,
+ 0xd9, 0x10, 0xe0, 0x00,
+ 0x1e, 0x40, 0x31, 0xe2, 0x6e, 0xdc, 0x51, 0x15, 0xbf, 0x10, 0x02, 0xd2,
+ 0x1f, 0xfc, 0x0f, 0x1f,
+ 0x9f, 0x0d, 0x0e, 0x3d, 0x1e, 0x21, 0x01, 0xc1, 0x05, 0x22, 0x22, 0x43,
+ 0xf6, 0xbf, 0xc8, 0x0f,
+ 0x22, 0x03, 0xd1, 0x00, 0x1e, 0xb0, 0xe2, 0x0e, 0x7b, 0x30, 0xf1, 0x00,
+ 0x01, 0x02, 0x2d, 0x0d,
+ 0xf9, 0xbe, 0x0f, 0x02, 0x13, 0x22, 0xde, 0xa9, 0x00, 0x00, 0x11, 0x33,
+ 0x14, 0x00, 0x00, 0xe0,
+ 0x12, 0x50, 0xeb, 0x00, 0x10, 0x32, 0x64, 0x02, 0xc1, 0x00, 0x1c, 0x0e,
+ 0xff, 0xe0, 0x02, 0x00,
+ 0xdc, 0xed, 0xc0, 0xe6, 0x10, 0x10, 0x5d, 0x02, 0xd2, 0xde, 0xfd, 0x30,
+ 0x76, 0x33, 0xff, 0x1b,
+ 0x0e, 0x0f, 0xf0, 0x91, 0xf3, 0x04, 0x56, 0xf1, 0xd0, 0x0e, 0xe0, 0x00,
+ 0x0a, 0x30, 0x70, 0x03,
+ 0xf5, 0x02, 0xf0, 0x7e, 0x2f, 0x1f, 0x1f, 0xe2, 0x37, 0x01, 0xa0, 0x0c,
+ 0x10, 0xff, 0xdf, 0xf1,
+ 0xf2, 0x1e, 0x0b, 0x0d, 0xf0, 0xf1, 0x21, 0x40, 0x1d, 0x6a, 0x1f, 0xdc,
+ 0xce, 0x0f, 0x43, 0x03,
+ 0xa0, 0x00, 0xd2, 0x07, 0x20, 0xec, 0x01, 0x00, 0x1f, 0x0f, 0x04, 0x44,
+ 0x5e, 0x0a, 0xf0, 0x0f,
+ 0x00, 0xe2, 0x11, 0x2f, 0xee, 0x01, 0x16, 0xd0, 0x90, 0x0f, 0x0e, 0x11,
+ 0x33, 0x04, 0x51, 0x21,
+ 0x0f, 0x00, 0x31, 0x54, 0x01, 0xd1, 0xe3, 0xf1, 0x34, 0x01, 0xc0, 0x05,
+ 0x01, 0xde, 0x11, 0x07,
+ 0x9f, 0x0b, 0x50, 0x11, 0x00, 0x10, 0x00, 0x2d, 0x50, 0x40, 0x2d, 0x2f,
+ 0x32, 0x14, 0xee, 0xcc,
+ 0xf0, 0xe0, 0x03, 0xe1, 0xfc, 0xc8, 0xcf, 0x01, 0xe2, 0xb1, 0xf1, 0xcf,
+ 0xdf, 0x52, 0x22, 0xdf,
+ 0xfc, 0xe0, 0xae, 0x30, 0x15, 0x10, 0x0f, 0x0e, 0x05, 0x17, 0x01, 0x0e,
+ 0x30, 0x50, 0x0f, 0xee,
+ 0x10, 0x30, 0x00, 0x02, 0xe1, 0x0d, 0x6e, 0x70, 0x14, 0x00, 0xfd, 0xdc,
+ 0xe9, 0xfe, 0xff, 0xf0,
+ 0xf2, 0xe2, 0xb2, 0x04, 0x03, 0xed, 0xdb, 0xbd, 0xfe, 0xd1, 0x06, 0x22,
+ 0x1e, 0xea, 0x0f, 0x0f,
+ 0x00, 0x32, 0x70, 0xf0, 0x9f, 0xfc, 0x00, 0x10, 0x43, 0x12, 0x0f, 0xfe,
+ 0xf0, 0x09, 0x2e, 0x71,
+ 0x36, 0x00, 0xde, 0xf3, 0x02, 0x02, 0xfd, 0x1c, 0x10, 0xf0, 0x8d, 0xf3,
+ 0xe2, 0xe9, 0xfe, 0x01,
+ 0x13, 0x22, 0x02, 0xd0, 0xe9, 0x3f, 0x7f, 0x21, 0x22, 0x0e, 0xbf, 0xe1,
+ 0x05, 0xf0, 0x1c, 0xcf,
+ 0x9e, 0x0d, 0x00, 0x25, 0x11, 0x12, 0x60, 0x1d, 0x00, 0x03, 0x05, 0x62,
+ 0x0e, 0xfd, 0xf1, 0xe0,
+ 0xfd, 0x02, 0x2e, 0x18, 0xfa, 0xd1, 0x02, 0xe0, 0x30, 0x11, 0xfe, 0xdc,
+ 0x43, 0x67, 0x01, 0xf0,
+ 0xcd, 0x00, 0x01, 0x22, 0x41, 0x01, 0xd0, 0x0f, 0x1c, 0xee, 0x12, 0x33,
+ 0x30, 0x70, 0x3d, 0xeb,
+ 0xe2, 0x26, 0x3f, 0x2f, 0x70, 0x00, 0x0f, 0x00, 0x00, 0x04, 0x22, 0x1e,
+ 0xdb, 0xe2, 0xf6, 0x90,
+ 0xde, 0x0e, 0x20, 0xe0, 0xdf, 0xfe, 0xd2, 0x85, 0x80, 0x03, 0x2e, 0x0b,
+ 0x01, 0x04, 0xf0, 0xf0,
+ 0x10, 0x35, 0x30, 0x21, 0x20, 0x1d, 0x1f, 0xf4, 0xa3, 0x01, 0xcf, 0x1f,
+ 0x15, 0xff, 0x8c, 0x01,
+ 0x02, 0x00, 0x32, 0x65, 0x0f, 0xfa, 0x0e, 0x3d, 0x01, 0x03, 0xce, 0x0e,
+ 0x12, 0x00, 0xde, 0xf1,
+ 0x04, 0x0f, 0xfd, 0xb0, 0xf1, 0x07, 0x15, 0x3f, 0x3c, 0x0f, 0x80, 0xf0,
+ 0x20, 0x50, 0x0e, 0x0d,
+ 0xc9, 0x10, 0x30, 0xf0, 0xde, 0x01, 0x01, 0xee, 0x21, 0x75, 0x1e, 0xec,
+ 0xe1, 0x14, 0x33, 0x0f,
+ 0xec, 0xb1, 0x02, 0xf0, 0x22, 0x42, 0x02, 0xd4, 0xd0, 0xed, 0x03, 0x47,
+ 0x05, 0x20, 0x0e, 0xee,
+ 0xff, 0x1f, 0x2d, 0x5f, 0x40, 0x0f, 0xb0, 0x16, 0x52, 0x1e, 0x0c, 0xe0,
+ 0xd0, 0x0f, 0x30, 0x20,
+ 0x6f, 0x2f, 0x40, 0x01, 0x00, 0x20, 0x37, 0x04, 0x80, 0xf0, 0x03, 0xe0,
+ 0xe0, 0x01, 0x05, 0xce,
+ 0x0f, 0x0f, 0x00, 0xcd, 0x1e, 0x2f, 0x0e, 0xe2, 0xe7, 0x05, 0x41, 0x10,
+ 0x20, 0x34, 0x45, 0x42,
+ 0x30, 0x0f, 0xdd, 0x10, 0x0d, 0x01, 0x62, 0x4c, 0xd8, 0xb0, 0x10, 0x50,
+ 0x20, 0x0e, 0xc0, 0xe0,
+ 0x01, 0x03, 0x05, 0x01, 0xe0, 0xa0, 0x04, 0xf0, 0x00, 0x2c, 0x31, 0xe0,
+ 0xcd, 0xfb, 0x20, 0x74,
+ 0x10, 0x0f, 0xe0, 0x0f, 0x00, 0x00, 0xdc, 0xfb, 0x0f, 0x40, 0xd0, 0xe0,
+ 0x04, 0xdb, 0x8c, 0x0e,
+ 0x40, 0x13, 0x01, 0x10, 0x0f, 0x0e, 0x1d, 0xc2, 0x04, 0xe0, 0xb0, 0xff,
+ 0xe0, 0xf0, 0x0f, 0x0a,
+ 0xee, 0x31, 0x55, 0xd1, 0x06, 0x70, 0x0c, 0xfe, 0xd0, 0x23, 0x10, 0x10,
+ 0xfd, 0x9e, 0x00, 0x24,
+ 0x22, 0x02, 0xe2, 0x24, 0x2f, 0x4e, 0x44, 0x25, 0xb0, 0xec, 0xf0, 0x13,
+ 0x12, 0x21, 0xdb, 0x99,
+ 0x00, 0x10, 0xf2, 0xdf, 0x1f, 0x31, 0x60, 0x0f, 0x0e, 0x32, 0x21, 0x01,
+ 0xe3, 0xf6, 0xf1, 0x01,
+ 0x0d, 0x0e, 0x03, 0xf6, 0x80, 0xbf, 0x12, 0x44, 0x0f, 0x0b, 0xf0, 0xff,
+ 0x21, 0x43, 0x01, 0x01,
+ 0x00, 0xea, 0xdf, 0x10, 0x00, 0xef, 0xc0, 0xd6, 0x10, 0x7c, 0x50, 0x00,
+ 0xc0, 0x0e, 0x51, 0x25,
+ 0x20, 0xff, 0xde, 0x00, 0xde, 0x00, 0x00, 0x00, 0xce, 0xdd, 0xdf, 0xdf,
+ 0x06, 0x05, 0x1f, 0x7c,
+ 0x30, 0xe0, 0x00, 0x70, 0x13, 0x12, 0x01, 0xe0, 0xe2, 0x0f, 0x0f, 0xf3,
+ 0xc3, 0xd0, 0xec, 0x20,
+ 0x3c, 0xc8, 0xdc, 0x00, 0x20, 0x51, 0x1e, 0x0f, 0x60, 0x0a, 0x00, 0x02,
+ 0x25, 0xe0, 0x8e, 0x02,
+ 0xf1, 0x11, 0x31, 0x03, 0xef, 0xe9, 0x0f, 0x00, 0x00, 0x44, 0x20, 0x0d,
+ 0x8c, 0xf1, 0x03, 0x00,
+ 0xed, 0x1f, 0x2e, 0x0e, 0xb0, 0x04, 0xf1, 0x0c, 0xfe, 0xe0, 0x37, 0x43,
+ 0x1d, 0x0d, 0xef, 0xfe,
+ 0x01, 0x41, 0x11, 0x24, 0xf3, 0xe1, 0x01, 0x04, 0x03, 0xff, 0x0e, 0xf1,
+ 0x17, 0x77, 0x74, 0x1f,
+ 0x0f, 0xe0, 0xef, 0x10, 0x10, 0xd0, 0x00, 0x0c, 0x8d, 0x00, 0x43, 0x52,
+ 0x1e, 0x08, 0x00, 0x60,
+ 0x10, 0x00, 0x0e, 0x10, 0xf2, 0x04, 0xe4, 0x0d, 0xdd, 0xf0, 0xf2, 0xcf,
+ 0xfd, 0xf0, 0xf0, 0x10,
+ 0x1d, 0x10, 0x24, 0x62, 0x0b, 0x2d, 0x43, 0x45, 0x03, 0xd0, 0xff, 0x23,
+ 0xf5, 0xa3, 0xf0, 0x03,
+ 0x22, 0xf2, 0xb3, 0x0f, 0x0d, 0x5a, 0x3e, 0x43, 0x07, 0x0f, 0xb8, 0x00,
+ 0x00, 0x01, 0x01, 0x03,
+ 0xf1, 0xae, 0xed, 0x01, 0xf5, 0x00, 0x00, 0xf2, 0x03, 0xdd, 0x0e, 0x20,
+ 0x1f, 0x10, 0x62, 0x31,
+ 0x30, 0x2f, 0xe9, 0xc0, 0x03, 0x12, 0x1d, 0x20, 0x17, 0xd2, 0x80, 0xb9,
+ 0x20, 0x3f, 0x1f, 0xfe,
+ 0xd0, 0x02, 0x01, 0x36, 0x31, 0xdd, 0x8b, 0xe0, 0xd0, 0x01, 0x64, 0x00,
+ 0x0c, 0xce, 0x00, 0x3f,
+ 0x44, 0x00, 0xdd, 0x0d, 0xfe, 0x0f, 0x10, 0x41, 0x0c, 0xbd, 0x01, 0xf4,
+ 0x14, 0x02, 0x00, 0x00,
+ 0x04, 0x10, 0x20, 0x43, 0xfe, 0xf1, 0x07, 0x03, 0xcc, 0x0f, 0x0e, 0x1c,
+ 0x3e, 0x70, 0x43, 0x02,
+ 0xdd, 0xed, 0x20, 0x50, 0xeb, 0xd0, 0xf1, 0xd0, 0xcb, 0x00, 0xf3, 0xdf,
+ 0xce, 0xbb, 0xf0, 0x04,
+ 0x20, 0x10, 0x63, 0x15, 0x20, 0x20, 0xf1, 0xf0, 0x37, 0x63, 0x00, 0x00,
+ 0x1e, 0xff, 0xdf, 0x00,
+ 0x00, 0x0b, 0xe0, 0xf1, 0xb0, 0xdb, 0xdf, 0x21, 0x76, 0x00, 0x00, 0x62,
+ 0x24, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0xc2, 0xe1, 0x0b, 0xed, 0x8d, 0x0e, 0x00, 0x12, 0x00, 0xfb,
+ 0x0c, 0x10, 0x50, 0x12,
+ 0x26, 0x03, 0xf0, 0x0f, 0x01, 0x00, 0x0c, 0x20, 0x47, 0xe3, 0xd0, 0xce,
+ 0x11, 0x55, 0x00, 0xcf,
+ 0x30, 0x4e, 0x0f, 0x0f, 0x01, 0x03, 0x0a, 0xed, 0x10, 0x20, 0xbf, 0xcb,
+ 0xde, 0x20, 0x12, 0x11,
+ 0xf0, 0x8b, 0xd0, 0x04, 0x01, 0xe1, 0x1f, 0x0c, 0xfe, 0x6f, 0x53, 0x04,
+ 0x0f, 0xed, 0x0c, 0xfe,
+ 0x00, 0x45, 0x02, 0xb0, 0xfc, 0xef, 0x11, 0x10, 0xfd, 0x0e, 0x00, 0x1f,
+ 0x45, 0x13, 0xf0, 0xee,
+ 0x23, 0x01, 0xf0, 0xd2, 0xc3, 0x27, 0x76, 0x20, 0xd0, 0x02, 0x31, 0x00,
+ 0x00, 0x01, 0xd2, 0x81,
+ 0xef, 0xf0, 0x01, 0x07, 0xe2, 0x31, 0x70, 0x3b, 0x2c, 0x0f, 0x0f, 0x10,
+ 0x74, 0x20, 0x20, 0x0f,
+ 0x00, 0xf1, 0x02, 0x42, 0xf0, 0xe0, 0xf0, 0xcc, 0xdc, 0xf0, 0x04, 0x10,
+ 0xda, 0x8f, 0x0f, 0xf0,
+ 0x0d, 0x0e, 0x72, 0x00, 0x10, 0xff, 0xd0, 0x06, 0x36, 0x02, 0xd0, 0xce,
+ 0xe1, 0x00, 0x03, 0x13,
+ 0x00, 0x0a, 0x60, 0x4f, 0x30, 0x30, 0xf0, 0xfe, 0x30, 0x5d, 0x1f, 0x02,
+ 0xd9, 0xfd, 0xdf, 0xa3,
+ 0xf4, 0xc0, 0xee, 0xfc, 0x00, 0x0e, 0xdd, 0x02, 0x67, 0x44, 0x20, 0xfd,
+ 0xfb, 0x10, 0x10, 0xe2,
+ 0xa0, 0xe3, 0xf0, 0xde, 0x0d, 0x0c, 0xdd, 0xed, 0x11, 0x77, 0x42, 0x00,
+ 0xf0, 0x20, 0xff, 0x0e,
+ 0x30, 0x3f, 0x0a, 0xed, 0xe0, 0x07, 0xb0, 0xc0, 0xac, 0xf0, 0xf3, 0x00,
+ 0x22, 0x00, 0xed, 0xff,
+ 0x10, 0x2e, 0x51, 0x05, 0xce, 0xee, 0x11, 0x20, 0xfe, 0xbe, 0xde, 0xdf,
+ 0x12, 0x10, 0x21, 0x14,
+ 0x0e, 0xfb, 0x7f, 0x5e, 0x00, 0x17, 0x37, 0xf0, 0xff, 0x00, 0x05, 0x01,
+ 0x16, 0x00, 0x22, 0x00,
+ 0x59, 0x0f, 0xd9, 0x27, 0x4b, 0x11, 0x17, 0x29, 0x0b, 0xf1, 0x83, 0x9e,
+ 0xfa, 0xd0, 0x1f, 0x0e,
+ 0xda, 0xf0, 0x02, 0x34, 0x0e, 0x8e, 0xfe, 0xc1, 0x03, 0x02, 0xd0, 0xff,
+ 0xbb, 0xe0, 0xd1, 0xf7,
+ 0xe5, 0xe0, 0xef, 0xcf, 0xe0, 0xdf, 0x0f, 0xd0, 0x91, 0xc0, 0xdf, 0xd0,
+ 0xd2, 0xe1, 0xf2, 0xc3,
+ 0xe1, 0xbd, 0xeb, 0xf3, 0x27, 0x10, 0x0b, 0xe0, 0xe0, 0x00, 0x12, 0x00,
+ 0xfe, 0x90, 0xf0, 0xcc,
+ 0xce, 0xe0, 0xf3, 0xd5, 0xc1, 0xd0, 0xda, 0xaf, 0xfd, 0x12, 0x11, 0xf1,
+ 0xe1, 0xe2, 0xef, 0xd0,
+ 0xc7, 0xc1, 0xb1, 0xf1, 0xe2, 0xe4, 0xc1, 0xe0, 0xc1, 0xe0, 0xf0, 0xe0,
+ 0xf4, 0xd0, 0xce, 0xef,
+ 0xf0, 0xf3, 0xe9, 0xba, 0xfe, 0x01, 0xc3, 0xf2, 0x01, 0xbc, 0xde, 0xe1,
+ 0x07, 0xc0, 0xdf, 0xd0,
+ 0xcc, 0xdf, 0x02, 0xf5, 0xe0, 0xee, 0xc0, 0xe3, 0xf0, 0xcd, 0xed, 0xee,
+ 0xba, 0xdf, 0xf1, 0xe3,
+ 0xb0, 0xeb, 0xce, 0xee, 0x01, 0x23, 0xc0, 0xce, 0xd0, 0xe4, 0xe0, 0xde,
+ 0xde, 0xb3, 0x07, 0xd0,
+ 0xed, 0xef, 0x10, 0xc0, 0xce, 0xe3, 0xf7, 0x07, 0xc0, 0xde, 0x01, 0xd1,
+ 0x80, 0xcf, 0xf0, 0xe3,
+ 0xd0, 0xc0, 0xef, 0xdf, 0xef, 0xbe, 0xda, 0xe0, 0xfe, 0x0e, 0xde, 0xbd,
+ 0xf0, 0xf3, 0xf7, 0x01,
+ 0x12, 0x01, 0x04, 0xf2, 0xcd, 0xcc, 0xfe, 0x0e, 0x10, 0x40, 0x0f, 0xba,
+ 0xff, 0x00, 0xf0, 0x0f,
+ 0x34, 0xd2, 0x90, 0xf1, 0x07, 0x04, 0xe0, 0xde, 0xb0, 0xe3, 0xe1, 0x02,
+ 0x32, 0xf1, 0xe2, 0x0e,
+ 0x28, 0x70, 0x50, 0x00, 0x1d, 0x10, 0x21, 0x00, 0x2f, 0x0f, 0x0c, 0xf2,
+ 0xf0, 0xdc, 0x0d, 0x73,
+ 0x12, 0x0e, 0x00, 0x47, 0x34, 0x3f, 0x40, 0x13, 0x30, 0x3f, 0x52, 0x46,
+ 0x30, 0x0e, 0x0c, 0x20,
+ 0x1f, 0x31, 0x31, 0x3e, 0x7e, 0x50, 0x20, 0x3a, 0x51, 0x10, 0x1f, 0x1e,
+ 0x1d, 0x2f, 0x41, 0x24,
+ 0x0b, 0xfb, 0xee, 0x01, 0x42, 0x2f, 0x4d, 0x10, 0x22, 0x44, 0x32, 0x31,
+ 0x60, 0x3d, 0x1e, 0x3c,
+ 0x22, 0x31, 0x08, 0x2f, 0x40, 0x21, 0x31, 0x20, 0x0c, 0x3a, 0x4f, 0x2f,
+ 0x00, 0x67, 0x52, 0x22,
+ 0x10, 0x2e, 0x13, 0x35, 0x1f, 0x1c, 0x2f, 0x11, 0x12, 0x00, 0x00, 0xbe,
+ 0x2e, 0x4e, 0x0e, 0x2d,
+ 0x70, 0x4e, 0x0e, 0x21, 0x27, 0x00, 0x0f, 0x0f, 0x41, 0x05, 0x02, 0xd0,
+ 0x0e, 0x1e, 0x22, 0x67,
+ 0x47, 0x2f, 0x3f, 0x31, 0x44, 0x0f, 0x2e, 0x20, 0x5f, 0x2f, 0x10, 0x00,
+ 0xe1, 0x0f, 0x0e, 0x10,
+ 0x16, 0x01, 0x21, 0x70, 0x6d, 0x1e, 0x2f, 0x1f, 0x24, 0x31, 0x3d, 0x20,
+ 0x1f, 0x30, 0x5f, 0x0c,
+ 0x0b, 0x20, 0x30, 0x2d, 0x70, 0x33, 0x0d, 0x09, 0x33, 0x73, 0x2f, 0x1b,
+ 0x30, 0x0f, 0x00, 0x4e,
+ 0x1f, 0x30, 0x27, 0x42, 0x00, 0x21, 0x03, 0x31, 0x21, 0x23, 0x74, 0x10,
+ 0x2b, 0x1f, 0x30, 0x0d,
+ 0xfb, 0x30, 0x6f, 0x1c, 0x00, 0x0f, 0x0e, 0x11, 0x76, 0x20, 0x00, 0x10,
+ 0x00, 0x3e, 0x00, 0x72,
+ 0x26, 0x0c, 0x0c, 0x00, 0x24, 0x00, 0x31, 0x11, 0xf0, 0xfd, 0x21, 0x62,
+ 0x20, 0x3e, 0xfc, 0xbe,
+ 0x03, 0x05, 0xfc, 0xdc, 0xf0, 0xc1, 0xd1, 0xe3, 0xbe, 0xea, 0xef, 0xdf,
+ 0xf0, 0xe0, 0xe2, 0xe1,
+ 0xd3, 0xb1, 0xcf, 0xf1, 0xd4, 0xc0, 0xdd, 0x9d, 0xe6, 0xe4, 0xd3, 0xd1,
+ 0xc6, 0xc0, 0xbe, 0xdf,
+ 0x03, 0xe5, 0xdf, 0xef, 0xd1, 0xf3, 0xf0, 0xcb, 0xed, 0x01, 0xe1, 0xc1,
+ 0xc0, 0xd0, 0xe0, 0xe0,
+ 0xde, 0xdd, 0xc0, 0xc0, 0xc6, 0xe0, 0x0e, 0xda, 0xc0, 0xc0, 0xdc, 0xed,
+ 0x0e, 0xde, 0xc0, 0xf0,
+ 0xfe, 0xed, 0x06, 0xd4, 0x90, 0xf3, 0xe3, 0xe0, 0xf0, 0xe0, 0xbe, 0xf2,
+ 0xe6, 0xe2, 0x04, 0x01,
+ 0xfe, 0xcf, 0x00, 0x40, 0x02, 0x23, 0x2d, 0x08, 0x30, 0xf0, 0x9f, 0x00,
+ 0x13, 0x01, 0x0e, 0xf0,
+ 0xdf, 0x13, 0x77, 0x14, 0x0e, 0x0f, 0xef, 0xef, 0x20, 0x50, 0x04, 0xf0,
+ 0xcf, 0x05, 0x36, 0x00,
+ 0xfd, 0xe0, 0x4d, 0x71, 0x34, 0x01, 0xdf, 0x3f, 0x41, 0x33, 0x10, 0x0c,
+ 0x00, 0x0f, 0xee, 0xcd,
+ 0x07, 0x03, 0x8b, 0xde, 0x0f, 0x20, 0x41, 0x00, 0xcd, 0xfc, 0xef, 0xf1,
+ 0x57, 0x32, 0xed, 0xdc,
+ 0xef, 0xf0, 0x03, 0x2f, 0xca, 0x9f, 0x00, 0xf4, 0xf1, 0x0f, 0xed, 0xf0,
+ 0x1e, 0x20, 0x50, 0x04,
+ 0xe2, 0xe1, 0xd3, 0xe2, 0x05, 0xdf, 0xea, 0xa0, 0x00, 0x01, 0xdf, 0x1e,
+ 0x6f, 0x1d, 0xe9, 0xdf,
+ 0xf0, 0x03, 0x40, 0x30, 0xfa, 0xc0, 0xdf, 0xa0, 0xe1, 0xd1, 0xd1, 0xd3,
+ 0xd1, 0x90, 0xfc, 0xe0,
+ 0x00, 0x13, 0x33, 0x0f, 0xf1, 0x07, 0x20, 0xf0, 0xb1, 0xe3, 0xb0, 0xd0,
+ 0xdf, 0xe0, 0xe0, 0xb3,
+ 0xb2, 0xe0, 0x07, 0x15, 0x1f, 0x0e, 0x05, 0xd0, 0x23, 0x10, 0x1e, 0xac,
+ 0xdf, 0x01, 0x02, 0x27,
+ 0x00, 0xef, 0xbf, 0xfe, 0x0f, 0xf0, 0x02, 0xb8, 0xed, 0xde, 0x01, 0xf2,
+ 0x21, 0xcd, 0xed, 0xb1,
+ 0xd0, 0xe1, 0xc5, 0x06, 0xf0, 0xd4, 0x80, 0xdd, 0xf0, 0x03, 0x10, 0x04,
+ 0x10, 0xde, 0x00, 0x00,
+ 0x63, 0x0e, 0xc8, 0x00, 0x53, 0x01, 0x0e, 0xdd, 0x10, 0x30, 0xa9, 0x00,
+ 0x01, 0x00, 0x0f, 0xe0,
+ 0xf0, 0x00, 0x10, 0xbc, 0x00, 0x00, 0x00, 0xcc, 0x45, 0x21, 0x0f, 0xcc,
+ 0x02, 0x13, 0xf0, 0xf0,
+ 0x0c, 0x75, 0x0d, 0xdf, 0xff, 0xf0, 0x11, 0xec, 0x00, 0xef, 0xf2, 0x8d,
+ 0xe0, 0xf0, 0x0f, 0xdc,
+ 0x57, 0x15, 0xed, 0xf0, 0x11, 0x65, 0xf0, 0xcd, 0xff, 0x15, 0x11, 0xbe,
+ 0xe0, 0x01, 0x02, 0xff,
+ 0xde, 0xf4, 0xe1, 0xbe, 0xf1, 0x27, 0xff, 0x9d, 0x01, 0x34, 0x00, 0xca,
+ 0xf0, 0x14, 0x41, 0xef,
+ 0xee, 0x21, 0x34, 0x0f, 0xdc, 0x00, 0x61, 0xf0, 0x0d, 0x31, 0x32, 0x0e,
+ 0xfc, 0x30, 0x73, 0x0f,
+ 0x0f, 0x2f, 0x01, 0x02, 0x00, 0x00, 0x01, 0x25, 0xf0, 0xfe, 0x13, 0x33,
+ 0x0d, 0x0d, 0x73, 0x61,
+ 0x0b, 0x22, 0x25, 0x2f, 0x1b, 0x0e, 0x31, 0x76, 0x10, 0xfb, 0x11, 0x42,
+ 0x21, 0x2f, 0x3f, 0x3f,
+ 0x0f, 0x2f, 0x42, 0x54, 0x2f, 0x1c, 0x42, 0x11, 0x2e, 0x1e, 0x40, 0x31,
+ 0x31, 0x34, 0x2d, 0x2d,
+ 0x75, 0x30, 0x09, 0x30, 0x33, 0x0f, 0x2d, 0x42, 0x74, 0x0e, 0x0a, 0x00,
+ 0x32, 0x40, 0x1f, 0x0b,
+ 0x00, 0x53, 0x12, 0x1c, 0x0f, 0x41, 0x11, 0x01, 0x32, 0x43, 0x0b, 0x0e,
+ 0x00, 0x31, 0x44, 0x20,
+ 0x0e, 0xfe, 0x0f, 0x30, 0x2f, 0x4f, 0x20, 0x1d, 0x52, 0x47, 0x00, 0x0f,
+ 0xef, 0x22, 0x44, 0x11,
+ 0xed, 0xdd, 0x13, 0x00, 0x47, 0x00, 0x8b, 0x02, 0x35, 0xfe, 0xec, 0x20,
+ 0x43, 0xdd, 0xef, 0x12,
+ 0x63, 0xfd, 0xda, 0x00, 0x14, 0x00, 0xce, 0x11, 0xf0, 0xcf, 0x32, 0x31,
+ 0xdc, 0xe0, 0x0f, 0x44,
+ 0xf1, 0xd0, 0x03, 0x11, 0xdd, 0x89, 0xe0, 0x14, 0xe0, 0xac, 0xf0, 0x02,
+ 0xf2, 0xdd, 0xef, 0x01,
+ 0x01, 0xb9, 0x00, 0x67, 0x01, 0xac, 0x00, 0x23, 0x00, 0xec, 0xf0, 0x24,
+ 0x11, 0xed, 0xcf, 0x01,
+ 0x23, 0x0e, 0xac, 0x12, 0x24, 0xfe, 0xcb, 0x10, 0x44, 0x00, 0xdc, 0x00,
+ 0x13, 0x0f, 0x0f, 0xe0,
+ 0x13, 0x00, 0x8c, 0x00, 0x15, 0x00, 0xed, 0xf1, 0x03, 0xee, 0xfe, 0x36,
+ 0xf0, 0xac, 0x01, 0x01,
+ 0xe0, 0x00, 0xdf, 0x10, 0x21, 0xf1, 0xad, 0x02, 0x24, 0xfe, 0xce, 0x02,
+ 0x25, 0xfe, 0xcd, 0xf0,
+ 0x14, 0x11, 0xab, 0xf0, 0x13, 0x0f, 0xcd, 0x00, 0x37, 0xe0, 0xac, 0x22,
+ 0x11, 0xff, 0xcd, 0x11,
+ 0x26, 0x0f, 0xbd, 0xf0, 0x12, 0x00, 0xd0, 0xfe, 0x00, 0xf1, 0xcd, 0xff,
+ 0x22, 0xf0, 0xdc, 0x0f,
+ 0x55, 0x01, 0xce, 0xcc, 0x23, 0x77, 0xf0, 0xcb, 0x01, 0x12, 0x00, 0xff,
+ 0xf0, 0xf0, 0xcf, 0x23,
+ 0x23, 0xc9, 0xdf, 0x00, 0x44, 0xe0, 0xcd, 0xf0, 0x01, 0x23, 0xd0, 0xdc,
+ 0xe0, 0x02, 0x01, 0x8d,
+ 0x01, 0x13, 0xcb, 0xf0, 0x25, 0x10, 0xcd, 0xfe, 0x13, 0x32, 0x00, 0xcc,
+ 0xfd, 0x01, 0x55, 0xef,
+ 0xec, 0x00, 0x04, 0x10, 0xcd, 0xf1, 0x13, 0xdf, 0xff, 0x36, 0xe0, 0x8d,
+ 0x12, 0x24, 0x0f, 0xcc,
+ 0x00, 0x01, 0x43, 0xf0, 0x0f, 0x0d, 0x99, 0x12, 0x34, 0xff, 0xdc, 0x01,
+ 0x10, 0x33, 0x00, 0x0f,
+ 0xbc, 0x10, 0x24, 0x0f, 0xee, 0x10, 0x45, 0xde, 0xee, 0x22, 0x00, 0x10,
+ 0x30, 0xf1, 0x01, 0x76,
+ 0xed, 0xed, 0x76, 0x11, 0xfe, 0x0e, 0x23, 0x00, 0x0d, 0x23, 0x00, 0xea,
+ 0x00, 0x62, 0x33, 0xdc,
+ 0xde, 0x41, 0x32, 0xfe, 0x00, 0x53, 0xed, 0x11, 0x42, 0xec, 0x00, 0x32,
+ 0x21, 0xea, 0x11, 0x30,
+ 0xef, 0x50, 0x34, 0x0f, 0x2e, 0x0f, 0x0d, 0x64, 0x67, 0x0f, 0xda, 0xf0,
+ 0x53, 0x21, 0xed, 0xcd,
+ 0x23, 0x46, 0xff, 0xde, 0x00, 0x20, 0x23, 0x20, 0xff, 0xed, 0x31, 0x75,
+ 0x0f, 0xcc, 0x11, 0x22,
+ 0x10, 0xf0, 0xfc, 0x00, 0x02, 0x0f, 0xed, 0x23, 0x65, 0xfd, 0xde, 0x44,
+ 0x32, 0x0f, 0xed, 0x00,
+ 0x53, 0x02, 0x1f, 0x0f, 0xee, 0x25, 0x53, 0xeb, 0xee, 0x33, 0x10, 0xff,
+ 0x10, 0x0f, 0xef, 0x52,
+ 0xfd, 0xeb, 0x77, 0x22, 0xdd, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0xef, 0x11, 0x30,
+ 0x2d, 0x3e, 0x98, 0x00, 0x76, 0x20, 0xda, 0x00, 0x74, 0x0f, 0xde, 0x10,
+ 0x54, 0xfe, 0xed, 0x03,
+ 0x20, 0x00, 0x00, 0x00, 0xff, 0x00, 0x21, 0x12, 0x0f, 0x0e, 0x11, 0x67,
+ 0xff, 0xdc, 0x10, 0x76,
+ 0x00, 0xfd, 0xf0, 0x11, 0x32, 0xef, 0xfd, 0x12, 0x30, 0xde, 0x0e, 0x75,
+ 0x00, 0xfc, 0x01, 0x55,
+ 0x00, 0xed, 0x00, 0x10, 0x21, 0x00, 0x10, 0x32, 0xec, 0xde, 0x76, 0x31,
+ 0xcd, 0xfd, 0x34, 0x22,
+ 0xfd, 0xde, 0x11, 0x33, 0x00, 0x00, 0xf0, 0xdd, 0x00, 0x35, 0x10, 0x8c,
+ 0xfe, 0x23, 0x31, 0xcc,
+ 0xfe, 0x35, 0x31, 0x9c, 0xfd, 0x37, 0x20, 0xbf, 0x00, 0x23, 0x00, 0x9a,
+ 0x01, 0x22, 0x00, 0xde,
+ 0xff, 0x13, 0x33, 0xcc, 0xdd, 0x22, 0x23, 0xee, 0xee, 0x03, 0x14, 0x01,
+ 0xde, 0xcd, 0x03, 0x05,
+ 0xee, 0x8b, 0x01, 0x14, 0x0f, 0xdd, 0xff, 0x33, 0x02, 0xca, 0xf0, 0x21,
+ 0x20, 0xcf, 0xed, 0x44,
+ 0xf0, 0xcd, 0xef, 0x00, 0x26, 0xe0, 0xad, 0xf0, 0x12, 0x00, 0xe0, 0x23,
+ 0xe0, 0xbd, 0x27, 0x0f,
+ 0xdf, 0x01, 0x00, 0xef, 0xef, 0xe0, 0x54, 0x00, 0xdc, 0x00, 0x00, 0x43,
+ 0x22, 0xfe, 0x00, 0x0e,
+ 0xbc, 0x24, 0x76, 0x00, 0xed, 0xfe, 0x01, 0x46, 0x10, 0xad, 0xfe, 0x25,
+ 0x20, 0xcd, 0x00, 0x44,
+ 0xff, 0xed, 0x12, 0x21, 0x02, 0x31, 0xfe, 0xfe, 0x10, 0x00, 0x00, 0x45,
+ 0x0f, 0x88, 0x01, 0x44,
+ 0xff, 0xdd, 0x01, 0x52, 0x00, 0xec, 0xf0, 0x56, 0x00, 0xfd, 0xf0, 0x10,
+ 0x33, 0xdf, 0xfe, 0x12,
+ 0x0f, 0xed, 0x21, 0x33, 0xdf, 0x0e, 0x40, 0xda, 0x21, 0x74, 0x0f, 0xdd,
+ 0xf0, 0x11, 0x33, 0xdd,
+ 0xef, 0x36, 0x41, 0xae, 0xdb, 0x44, 0x21, 0xce, 0xfe, 0x11, 0x31, 0x24,
+ 0x0f, 0x9b, 0xfe, 0x34,
+ 0x20, 0xdf, 0xff, 0x20, 0x01, 0xdf, 0xff, 0x10, 0x33, 0xef, 0xdd, 0xf0,
+ 0x35, 0x21, 0x8d, 0x0f,
+ 0x12, 0x44, 0xcc, 0xee, 0x24, 0x00, 0xdf, 0xcd, 0x02, 0x27, 0x00, 0x8c,
+ 0xf0, 0x13, 0x0f, 0xed,
+ 0x00, 0x14, 0x00, 0xcd, 0x01, 0x47, 0xdf, 0xce, 0x01, 0x03, 0x00, 0xef,
+ 0x02, 0xe0, 0xcc, 0x55,
+ 0xef, 0xee, 0x01, 0x32, 0xff, 0xee, 0x23, 0x0f, 0xcb, 0xef, 0x22, 0x55,
+ 0xac, 0xdc, 0x44, 0x00,
+ 0xff, 0xce, 0x00, 0x03, 0x00, 0x0f, 0xff, 0xe0, 0xe0, 0x01, 0x07, 0xd0,
+ 0xbe, 0x01, 0x03, 0xcd,
+ 0xdd, 0x36, 0x00, 0x8d, 0xf0, 0x35, 0xf0, 0xed, 0x00, 0x01, 0xef, 0x00,
+ 0x33, 0x32, 0xbd, 0xba,
+ 0x00, 0x15, 0x00, 0xce, 0x0f, 0xff, 0x01, 0x03, 0xde, 0x0f, 0x10, 0x0e,
+ 0xff, 0xf0, 0x01, 0x26,
+ 0x73, 0xcc, 0xed, 0xf2, 0x11, 0x02, 0xff, 0xff, 0xbb, 0xef, 0xf0, 0xf0,
+ 0xf0, 0x0e, 0xed, 0x13,
+ 0x77, 0xee, 0xbb, 0x34, 0x43, 0xdc, 0xce, 0x12, 0x24, 0x00, 0xde, 0xde,
+ 0x02, 0x23, 0xf0, 0xaa,
+ 0xf0, 0x13, 0x00, 0xdf, 0x20, 0xf1, 0x8d, 0x01, 0x27, 0x00, 0xde, 0xe0,
+ 0xef, 0x25, 0x21, 0xbf,
+ 0xfe, 0xf2, 0x01, 0x10, 0x20, 0x0f, 0xce, 0x0f, 0x55, 0x0f, 0xfc, 0x10,
+ 0x32, 0x0f, 0xed, 0x00,
+ 0x00, 0x53, 0x10, 0xfb, 0xe0, 0x20, 0x44, 0x00, 0xce, 0x0f, 0x33, 0x02,
+ 0x0f, 0xfb, 0x01, 0x54,
+ 0xee, 0x0f, 0x31, 0x00, 0x20, 0x46, 0x0f, 0x1e, 0x72, 0x30, 0xfb, 0x40,
+ 0x46, 0x1f, 0x00, 0x30,
+ 0xed, 0x73, 0x44, 0xfa, 0xf0, 0x30, 0x33, 0xfd, 0x0f, 0x51, 0x34, 0x00,
+ 0x1d, 0x30, 0x53, 0x10,
+ 0x0b, 0x11, 0x51, 0x0e, 0x1d, 0x11, 0x36, 0x2f, 0xfd, 0x20, 0x66, 0x0f,
+ 0x0d, 0x10, 0x52, 0x10,
+ 0x0e, 0x10, 0x32, 0x1f, 0x1d, 0x54, 0x10, 0x1e, 0x21, 0x31, 0x12, 0x2d,
+ 0x0b, 0x20, 0x55, 0x10,
+ 0x2f, 0x2f, 0x1e, 0x40, 0x43, 0x0c, 0x00, 0x65, 0x1f, 0x0c, 0x00, 0x23,
+ 0x0d, 0x0f, 0x22, 0x24,
+ 0x0f, 0x0e, 0x46, 0x11, 0xff, 0x0f, 0x72, 0x00, 0xfc, 0x12, 0x23, 0x0c,
+ 0xcd, 0x31, 0x44, 0x0f,
+ 0xb8, 0x0f, 0x53, 0x03, 0xfd, 0xed, 0x11, 0x46, 0x00, 0xcc, 0x00, 0x22,
+ 0x21, 0xfe, 0x00, 0x31,
+ 0x32, 0xf0, 0xed, 0x00, 0x33, 0x21, 0xcd, 0xcd, 0x04, 0x13, 0xed, 0x99,
+ 0xf0, 0xff, 0xf1, 0xf1,
+ 0x01, 0x00, 0xba, 0x00, 0x15, 0x00, 0xde, 0xe0, 0x22, 0x13, 0xaf, 0xf0,
+ 0x04, 0xdf, 0xef, 0x10,
+ 0xf0, 0xcd, 0x52, 0x25, 0x0f, 0xed, 0x1e, 0x61, 0x0f, 0xda, 0x0f, 0x42,
+ 0x43, 0xeb, 0xfe, 0x22,
+ 0x01, 0x00, 0xff, 0xdf, 0xf1, 0x05, 0x22, 0xf1, 0x8c, 0xcf, 0x00, 0x14,
+ 0xff, 0xff, 0xe1, 0xd0,
+ 0x0b, 0x01, 0x02, 0x02, 0x00, 0x88, 0x00, 0x23, 0x02, 0xf0, 0x01, 0xef,
+ 0xee, 0x04, 0xd1, 0xa1,
+ 0x01, 0xf1, 0xa9, 0x00, 0x34, 0xf0, 0xdd, 0x01, 0x32, 0x00, 0xdd, 0x10,
+ 0x50, 0x00, 0x00, 0x05,
+ 0xf0, 0xcd, 0x23, 0x12, 0x88, 0xef, 0x02, 0xf2, 0xcb, 0xfd, 0x00, 0x10,
+ 0x10, 0x00, 0x2f, 0x00,
+ 0x10, 0x54, 0x00, 0xde, 0xdc, 0x10, 0x33, 0xf3, 0x8a, 0xd0, 0x23, 0x00,
+ 0xdd, 0xbc, 0x12, 0x45,
+ 0xff, 0xdd, 0x20, 0x23, 0x01, 0xcd, 0xdc, 0xf1, 0xd4, 0xb1, 0xd0, 0xc2,
+ 0xd4, 0x03, 0xdd, 0x9b,
+ 0xf3, 0x07, 0xf0, 0xde, 0xf0, 0x03, 0x0e, 0xcc, 0x00, 0x10, 0x21, 0xdd,
+ 0xe0, 0x0d, 0xed, 0x02,
+ 0x06, 0xdf, 0xdc, 0x20, 0x54, 0xaf, 0xed, 0x02, 0x25, 0xbe, 0xef, 0xe1,
+ 0x05, 0xf1, 0xf0, 0xd0,
+ 0xad, 0x00, 0x04, 0xf0, 0xd0, 0x00, 0xf0, 0xd0, 0x10, 0x31, 0x0f, 0xfc,
+ 0x20, 0x10, 0xca, 0xde,
+ 0x72, 0x22, 0xdc, 0xdf, 0xc2, 0xd3, 0x15, 0x00, 0xcd, 0xe0, 0x0e, 0x8e,
+ 0xe1, 0x07, 0x34, 0x00,
+ 0xae, 0xee, 0x01, 0x36, 0xf0, 0xbc, 0x11, 0x42, 0x11, 0x01, 0x00, 0x00,
+ 0x61, 0x0e, 0x0d, 0x02,
+ 0x0e, 0x08, 0x20, 0x11, 0xff, 0xbf, 0x12, 0x23, 0x0e, 0xdd, 0x02, 0x35,
+ 0x0e, 0x0d, 0x20, 0x74,
+ 0x10, 0x1b, 0x20, 0x1d, 0x0d, 0x2f, 0x1d, 0x5f, 0x20, 0x01, 0x11, 0x1c,
+ 0xfb, 0xd1, 0x07, 0x43,
+ 0xcf, 0xcf, 0x00, 0xf2, 0x01, 0xf3, 0xee, 0x1b, 0x70, 0x11, 0xe0, 0x10,
+ 0x31, 0xdc, 0xef, 0x45,
+ 0x92, 0xd0, 0xf1, 0x00, 0x9b, 0xeb, 0xff, 0x11, 0x10, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb1, 0xee, 0x0a, 0xfb, 0x3b, 0xee, 0xfd, 0xfc, 0xcc, 0xaf, 0x0f, 0xf9,
+ 0x61, 0x67, 0x07, 0xe2,
+ 0xfc, 0x11, 0x01, 0x22, 0xcf, 0xee, 0x01, 0x20, 0xfc, 0x20, 0x10, 0xaf,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x63, 0x00, 0xbe, 0x12, 0x04, 0xe0, 0xf5, 0x00, 0x0f, 0xe0, 0x64, 0x11,
+ 0x02, 0xf4, 0xff, 0x43,
+ 0x46, 0xfd, 0xda, 0x10, 0x53, 0xff, 0xda, 0x10, 0x74, 0x00, 0xdb, 0xf0,
+ 0x0e, 0x10, 0x11, 0x00,
+ 0xe0, 0x00, 0x43, 0x02, 0xc0, 0x04, 0x40, 0xff, 0xf0, 0x11, 0x10, 0x0d,
+ 0x2d, 0xf0, 0x92, 0xeb,
+ 0x0e, 0x55, 0x01, 0xfb, 0xef, 0x01, 0x14, 0x00, 0xf0, 0xf0, 0x02, 0x00,
+ 0xef, 0x1e, 0x1c, 0x0a,
+ 0x7f, 0x60, 0x01, 0x00, 0xfe, 0xf0, 0x34, 0x25, 0xdf, 0xad, 0x0e, 0x03,
+ 0xc0, 0xed, 0x00, 0xf7,
+ 0xef, 0x0c, 0x00, 0x00, 0xd0, 0x42, 0x50, 0x1e, 0x2f, 0x00, 0x34, 0xe0,
+ 0x89, 0x11, 0x23, 0x0e,
+ 0xbb, 0x01, 0xf1, 0x03, 0xfd, 0xfc, 0x10, 0x33, 0x01, 0xdd, 0x0e, 0x75,
+ 0x02, 0x0e, 0x1f, 0x01,
+ 0xd4, 0xf0, 0xda, 0x01, 0x00, 0x80, 0x00, 0x27, 0x00, 0xd0, 0xf0, 0x21,
+ 0x54, 0x32, 0x11, 0x3f,
+ 0x10, 0x00, 0xce, 0x10, 0x40, 0x1f, 0xe9, 0xd0, 0x00, 0x1b, 0xbe, 0xff,
+ 0x20, 0x41, 0x0f, 0x4f,
+ 0x23, 0xf1, 0xe0, 0xe0, 0x02, 0x64, 0x0e, 0x8a, 0x00, 0x02, 0x02, 0x0f,
+ 0xfb, 0x01, 0x02, 0x30,
+ 0x30, 0x62, 0x03, 0x0d, 0x20, 0x37, 0x12, 0xde, 0x0f, 0x24, 0x32, 0x0e,
+ 0xac, 0xf0, 0xf2, 0x11,
+ 0x02, 0xd1, 0x0e, 0x1d, 0x55, 0x05, 0xf0, 0xee, 0xdc, 0xf0, 0x00, 0x14,
+ 0xc0, 0x8c, 0xd2, 0x24,
+ 0x0f, 0xae, 0x0f, 0x01, 0x0f, 0x2f, 0x20, 0x67, 0x10, 0x00, 0xf0, 0x06,
+ 0x00, 0xdd, 0xd0, 0x13,
+ 0x00, 0xff, 0xd2, 0xd2, 0xd0, 0xfd, 0x2f, 0x73, 0x53, 0x00, 0x03, 0x0d,
+ 0x2a, 0xfc, 0xab, 0x0e,
+ 0x00, 0x40, 0xf8, 0xca, 0x01, 0xe1, 0xc0, 0xff, 0x11, 0x21, 0x00, 0xf0,
+ 0x23, 0x60, 0xf0, 0x0e,
+ 0x00, 0x40, 0x24, 0x01, 0xab, 0xfe, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0e,
+ 0x20, 0x33, 0x0f, 0xfe,
+ 0xf0, 0x15, 0x4f, 0xe8, 0xfe, 0x40, 0x00, 0x8f, 0xee, 0x11, 0x35, 0xdd,
+ 0xbe, 0x04, 0x13, 0xf0,
+ 0xed, 0x00, 0x10, 0xe0, 0xfb, 0x5f, 0x40, 0x01, 0x0f, 0x12, 0xf2, 0xfd,
+ 0x0a, 0x00, 0x01, 0xde,
+ 0xcf, 0x03, 0x07, 0xd4, 0xce, 0x71, 0x46, 0x10, 0x10, 0x11, 0x22, 0x31,
+ 0x73, 0x00, 0xf1, 0x04,
+ 0x0f, 0xef, 0x01, 0x44, 0x3d, 0x3a, 0x20, 0x3d, 0x0e, 0xcf, 0xf0, 0x42,
+ 0x1d, 0x88, 0xed, 0x02,
+ 0x01, 0xdf, 0xbe, 0xe1, 0xc1, 0xe3, 0x02, 0x46, 0x10, 0xbe, 0x0f, 0x12,
+ 0x42, 0x00, 0x00, 0x3e,
+ 0x41, 0x34, 0x02, 0xf5, 0xf1, 0xee, 0xf1, 0x36, 0x50, 0xdc, 0xc0, 0x20,
+ 0x02, 0xd0, 0xd0, 0xdf,
+ 0x0f, 0x5d, 0x3e, 0x42, 0x31, 0x1a, 0xf0, 0xf1, 0xae, 0xfa, 0x02, 0x05,
+ 0x10, 0xee, 0x9c, 0x0f,
+ 0x02, 0x10, 0xff, 0x0c, 0x5e, 0x3f, 0xff, 0xe0, 0x12, 0x33, 0xdc, 0xb0,
+ 0x02, 0x03, 0xef, 0xd8,
+ 0x00, 0x31, 0x11, 0x00, 0xf2, 0x33, 0xdb, 0xcb, 0x30, 0x75, 0x50, 0xff,
+ 0x0f, 0xd0, 0xe1, 0x00,
+ 0x31, 0xdf, 0x9e, 0xf1, 0xe1, 0xcd, 0xef, 0xf5, 0x05, 0xf1, 0xf1, 0x45,
+ 0x01, 0x23, 0x41, 0x02,
+ 0x43, 0x30, 0x3b, 0x40, 0x72, 0x32, 0x0d, 0x1d, 0x12, 0x54, 0x0d, 0x08,
+ 0x00, 0x30, 0x0f, 0xd0,
+ 0xc0, 0x00, 0x20, 0xff, 0xe2, 0xe2, 0xa1, 0xbb, 0xfd, 0xf1, 0x16, 0x0f,
+ 0xbd, 0xf0, 0x13, 0x56,
+ 0x10, 0x0f, 0xef, 0x1f, 0x20, 0x20, 0x33, 0x00, 0xce, 0x00, 0x22, 0x47,
+ 0xcf, 0xdc, 0x0f, 0x20,
+ 0x61, 0x12, 0x41, 0x2d, 0x0d, 0x02, 0x12, 0x27, 0x03, 0xa0, 0xf0, 0xec,
+ 0xf0, 0xef, 0xee, 0xe1,
+ 0xe5, 0xef, 0xbb, 0x00, 0x03, 0x5e, 0x0a, 0x10, 0x21, 0x00, 0x4f, 0x30,
+ 0xfe, 0x3c, 0x7f, 0xdf,
+ 0xd1, 0xe4, 0xe0, 0xf0, 0xb4, 0xd2, 0xf0, 0x0d, 0x00, 0x30, 0x1e, 0x21,
+ 0x77, 0x11, 0xc8, 0xfc,
+ 0x21, 0x02, 0xf0, 0xdd, 0xcf, 0xf0, 0x02, 0x01, 0xc0, 0xed, 0x21, 0x54,
+ 0x02, 0x13, 0x00, 0xfd,
+ 0xce, 0x00, 0x27, 0x31, 0xb0, 0xee, 0xdf, 0xce, 0x11, 0x17, 0xd0, 0xef,
+ 0xdf, 0xae, 0x12, 0x1f,
+ 0x28, 0x3f, 0x70, 0x20, 0x00, 0x20, 0x23, 0x00, 0x00, 0x10, 0x00, 0xac,
+ 0xf2, 0x07, 0x02, 0x20,
+ 0x30, 0x0e, 0xc0, 0x20, 0x70, 0x30, 0x0e, 0x0c, 0xdb, 0xee, 0xbf, 0xe0,
+ 0x01, 0xf0, 0xde, 0xb2,
+ 0xf6, 0x02, 0x44, 0xfe, 0xdd, 0x31, 0x76, 0x00, 0x0e, 0x00, 0x20, 0x20,
+ 0x23, 0x10, 0x0b, 0xd0,
+ 0x44, 0x57, 0xf0, 0xbf, 0x20, 0x52, 0x0f, 0xfc, 0x10, 0x2e, 0x0d, 0xee,
+ 0x00, 0x23, 0x21, 0xdc,
+ 0xd0, 0xf5, 0xe2, 0xb1, 0xce, 0xee, 0x11, 0x23, 0xf2, 0x00, 0xcb, 0xbe,
+ 0x0c, 0xf0, 0x10, 0x30,
+ 0x73, 0x25, 0xec, 0xd0, 0x23, 0x03, 0xb1, 0xf1, 0xf7, 0x02, 0xd0, 0xef,
+ 0x00, 0x10, 0x30, 0x74,
+ 0x73, 0x00, 0x09, 0x31, 0x23, 0x21, 0x00, 0xbf, 0x01, 0x04, 0x1e, 0xf0,
+ 0xd1, 0xe3, 0x0f, 0xda,
+ 0xad, 0x10, 0x37, 0x00, 0xfd, 0x2e, 0x6e, 0x0c, 0xd0, 0x00, 0x51, 0x02,
+ 0xf0, 0x00, 0x02, 0x01,
+ 0xd0, 0xda, 0xcd, 0xee, 0x22, 0x37, 0xef, 0xfc, 0x70, 0x30, 0xe0, 0x0e,
+ 0x40, 0x0f, 0xde, 0xfe,
+ 0xec, 0xff, 0xe1, 0xf4, 0x03, 0x00, 0xb1, 0x90, 0xf7, 0x03, 0x10, 0xde,
+ 0xf3, 0x17, 0x13, 0x0d,
+ 0x10, 0x31, 0x00, 0x0e, 0x72, 0x74, 0x0d, 0xee, 0x21, 0x10, 0x2d, 0x09,
+ 0xfd, 0x20, 0x71, 0x00,
+ 0xfd, 0xff, 0x0e, 0xd0, 0xf0, 0xf0, 0x17, 0xf0, 0xbe, 0xf0, 0xf3, 0xf0,
+ 0x00, 0x57, 0x01, 0x32,
+ 0x60, 0x0f, 0x0d, 0xe1, 0x17, 0x13, 0xfd, 0xe0, 0xf3, 0xe0, 0x0d, 0x0e,
+ 0xfc, 0x0d, 0x6e, 0x20,
+ 0x11, 0x07, 0x75, 0x00, 0xcc, 0xf0, 0xee, 0xf1, 0xf2, 0x03, 0x30, 0xbc,
+ 0xe1, 0xd4, 0xde, 0x11,
+ 0x76, 0x10, 0x12, 0x2f, 0x4d, 0x1f, 0x21, 0x30, 0x11, 0x10, 0xe0, 0xe1,
+ 0xe6, 0x01, 0xce, 0xe0,
+ 0xa0, 0xf3, 0x07, 0xdf, 0xdf, 0x0f, 0x0e, 0xed, 0x66, 0x63, 0x0f, 0x0b,
+ 0x00, 0x10, 0x12, 0xfc,
+ 0xde, 0x1e, 0x1e, 0xfd, 0xd0, 0xd3, 0xd0, 0x0c, 0x0f, 0x8d, 0xff, 0x30,
+ 0x26, 0x21, 0x11, 0x20,
+ 0x07, 0xe0, 0x01, 0xdd, 0x8d, 0x00, 0xf5, 0xe0, 0xff, 0x02, 0x02, 0xf0,
+ 0x9b, 0x00, 0x41, 0x00,
+ 0x0d, 0xef, 0x10, 0x01, 0x9e, 0x0e, 0x0f, 0x2d, 0xfc, 0x9c, 0xfe, 0x01,
+ 0x32, 0x20, 0x14, 0x03,
+ 0x04, 0xf3, 0x07, 0x71, 0x20, 0x12, 0x06, 0x00, 0xfb, 0xde, 0x10, 0x21,
+ 0x00, 0x0c, 0x00, 0xc1,
+ 0xc2, 0xdf, 0xfe, 0x11, 0xd4, 0xbf, 0x0e, 0x67, 0x25, 0xe0, 0xbf, 0x01,
+ 0xe2, 0x0f, 0xe0, 0x12,
+ 0x10, 0x1e, 0x20, 0x4f, 0x53, 0x2f, 0x4c, 0x1e, 0xff, 0x21, 0x44, 0x0b,
+ 0x0b, 0x1f, 0x31, 0x03,
+ 0x9f, 0xfb, 0xf0, 0xe2, 0x03, 0xf3, 0x00, 0xfb, 0xce, 0x21, 0x72, 0x71,
+ 0x11, 0x0d, 0xff, 0x01,
+ 0x05, 0xff, 0xe1, 0xf2, 0xdc, 0xcc, 0xd1, 0xe0, 0xed, 0xe0, 0xef, 0x22,
+ 0x37, 0x4f, 0x7e, 0x40,
+ 0x10, 0x12, 0x44, 0xf9, 0xdd, 0xee, 0xf0, 0x03, 0xf2, 0xf2, 0xc2, 0x0c,
+ 0x0d, 0xcf, 0x17, 0x32,
+ 0xca, 0xee, 0x70, 0x44, 0x00, 0xdf, 0xfd, 0x31, 0x10, 0xfd, 0xcf, 0x02,
+ 0xf6, 0xf0, 0x02, 0xe0,
+ 0xd0, 0xef, 0xdf, 0x0f, 0x0e, 0xde, 0xe0, 0xf2, 0x54, 0x7b, 0x2d, 0x4f,
+ 0x0b, 0xeb, 0xff, 0x10,
+ 0x00, 0xcd, 0x0f, 0x42, 0xf4, 0x92, 0xf3, 0x07, 0x00, 0xe2, 0xe0, 0xf3,
+ 0x01, 0x33, 0x41, 0xd0,
+ 0xf0, 0x14, 0x04, 0x11, 0x30, 0x5e, 0x30, 0x13, 0x74, 0x32, 0x2c, 0x2d,
+ 0x60, 0x1d, 0xf8, 0xf0,
+ 0xf0, 0xc0, 0xfa, 0x00, 0x01, 0xaf, 0xdb, 0x10, 0x41, 0x10, 0x0e, 0x00,
+ 0x62, 0x00, 0xf0, 0x15,
+ 0x15, 0xef, 0xfc, 0x00, 0x42, 0x10, 0xde, 0xfd, 0x32, 0x34, 0xe0, 0xe0,
+ 0x41, 0x11, 0x20, 0x75,
+ 0x74, 0x10, 0x1f, 0x0f, 0xd0, 0x01, 0x32, 0x0e, 0x00, 0xa0, 0xde, 0xf5,
+ 0x16, 0x10, 0xec, 0xbf,
+ 0x0e, 0x10, 0x33, 0x01, 0xd2, 0x54, 0x2e, 0x1b, 0xf0, 0xef, 0x0d, 0xe0,
+ 0xf2, 0x04, 0xc0, 0xe0,
+ 0x07, 0x23, 0x62, 0x00, 0xcd, 0xf0, 0x13, 0x41, 0x0e, 0x00, 0x07, 0x21,
+ 0xd0, 0xcd, 0x0d, 0xff,
+ 0xe0, 0x90, 0xdb, 0xfc, 0xdb, 0xef, 0x41, 0x75, 0x0f, 0xfc, 0x00, 0x10,
+ 0x62, 0x01, 0x00, 0x00,
+ 0xfe, 0x00, 0xf5, 0xd0, 0xfc, 0xef, 0x00, 0x31, 0xd1, 0x8d, 0x00, 0x23,
+ 0x11, 0xda, 0xd0, 0x10,
+ 0x31, 0xec, 0xe0, 0x2f, 0x5f, 0xff, 0xff, 0x11, 0x20, 0x20, 0x02, 0x14,
+ 0x44, 0x1e, 0xba, 0xe0,
+ 0x50, 0x00, 0xba, 0x00, 0x12, 0x10, 0xfc, 0xf2, 0x23, 0x41, 0xfb, 0x0e,
+ 0x70, 0x0f, 0x0b, 0x00,
+ 0x1f, 0xcf, 0xf0, 0xf0, 0x0f, 0xd3, 0xc7, 0xf4, 0x00, 0x01, 0x80, 0x04,
+ 0x10, 0x23, 0x02, 0x30,
+ 0x05, 0x01, 0x10, 0x7f, 0x30, 0x10, 0x2e, 0x20, 0x11, 0x55, 0x2e, 0xfa,
+ 0xc0, 0xfe, 0xe0, 0x02,
+ 0x01, 0xcf, 0xda, 0xee, 0x00, 0xd0, 0xd1, 0xd1, 0x0f, 0x70, 0x10, 0xf0,
+ 0x11, 0x77, 0x00, 0x0f,
+ 0xec, 0x00, 0xf1, 0xd2, 0x06, 0x41, 0xe0, 0xce, 0xcf, 0xce, 0x10, 0x32,
+ 0x10, 0x0e, 0x20, 0x74,
+ 0x35, 0x02, 0x52, 0x0f, 0x0d, 0xd1, 0xf7, 0x00, 0xea, 0xd0, 0x01, 0xe1,
+ 0xe0, 0xfe, 0x1f, 0x7e,
+ 0x6f, 0x02, 0x03, 0x30, 0x0e, 0x0b, 0xcf, 0x00, 0x23, 0xfe, 0xec, 0x00,
+ 0xe0, 0xb0, 0xc0, 0xf2,
+ 0x0f, 0x0c, 0x20, 0x37, 0x40, 0x0f, 0x0c, 0x40, 0x34, 0x0c, 0x0d, 0x10,
+ 0x65, 0xf1, 0xbf, 0x0d,
+ 0xff, 0xdd, 0xcd, 0xf1, 0x0e, 0xd8, 0x00, 0x00, 0x04, 0x30, 0x0d, 0xd0,
+ 0x07, 0x25, 0xe0, 0xb0,
+ 0xd1, 0x90, 0x00, 0xf0, 0xf1, 0x31, 0x50, 0x50, 0x40, 0x23, 0x1f, 0x1e,
+ 0x42, 0x01, 0x0e, 0x2d,
+ 0x10, 0x10, 0xe0, 0xb9, 0xe0, 0x01, 0xe0, 0xed, 0x02, 0x37, 0x02, 0xdd,
+ 0x1c, 0x60, 0x00, 0x0c,
+ 0xf0, 0x03, 0xfe, 0x8e, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xcb, 0x20, 0x60,
+ 0x00, 0x10, 0x20, 0x12,
+ 0x33, 0x24, 0x00, 0xdb, 0xee, 0x1f, 0x5f, 0x11, 0x06, 0x00, 0xd0, 0xb0,
+ 0xbe, 0x05, 0x01, 0x01,
+ 0x20, 0x41, 0x0b, 0xfd, 0xf0, 0x40, 0x30, 0xdc, 0xde, 0x43, 0x23, 0x8d,
+ 0xe8, 0x00, 0xf0, 0xe0,
+ 0xe0, 0x01, 0x06, 0x50, 0xee, 0x00, 0x13, 0x10, 0xfe, 0x0f, 0x21, 0x03,
+ 0x31, 0x8b, 0xdd, 0xfd,
+ 0x10, 0x20, 0xb0, 0xee, 0x08, 0x1e, 0x6f, 0x00, 0xc0, 0x01, 0x03, 0x21,
+ 0x30, 0x01, 0xc2, 0xd3,
+ 0x03, 0x04, 0x0e, 0xed, 0xb0, 0xff, 0xfe, 0xdf, 0xf1, 0x0a, 0x09, 0x4e,
+ 0x00, 0xb2, 0x04, 0x21,
+ 0x3f, 0xac, 0xe0, 0xd2, 0xef, 0xf1, 0x00, 0x00, 0x20, 0x32, 0x1a, 0x7f,
+ 0x42, 0x24, 0x2f, 0x30,
+ 0x17, 0x11, 0x0c, 0x40, 0x76, 0x00, 0xed, 0xff, 0x12, 0x00, 0xbf, 0x00,
+ 0x20, 0x00, 0xdd, 0x0f,
+ 0x0e, 0xec, 0xee, 0xf0, 0x01, 0x60, 0x0d, 0x91, 0xe7, 0xf6, 0xf0, 0xd0,
+ 0xef, 0x03, 0x43, 0x3c,
+ 0x0c, 0x00, 0x74, 0x2f, 0x20, 0x3f, 0x3f, 0x1e, 0x33, 0x35, 0x10, 0xec,
+ 0xcd, 0x02, 0xe5, 0xef,
+ 0x00, 0x51, 0xf0, 0x9f, 0x0f, 0x55, 0x00, 0x0d, 0x2f, 0x23, 0x04, 0xea,
+ 0xcd, 0x00, 0x04, 0xe0,
+ 0xa0, 0xf0, 0x00, 0xff, 0xdd, 0xe2, 0xe2, 0x00, 0xfd, 0x1f, 0x77, 0x07,
+ 0xf0, 0x0e, 0x31, 0x42,
+ 0x20, 0x0f, 0x01, 0x45, 0x20, 0x10, 0x11, 0x02, 0x20, 0x52, 0xf0, 0xe0,
+ 0x00, 0x50, 0xf0, 0x01,
+ 0xff, 0xda, 0x01, 0x21, 0xb0, 0xda, 0xef, 0xce, 0xcf, 0x30, 0x22, 0xd0,
+ 0xbd, 0xed, 0xd0, 0x0f,
+ 0x30, 0x74, 0x7d, 0x08, 0x00, 0x01, 0x02, 0x02, 0x05, 0xde, 0xc9, 0x00,
+ 0x30, 0xef, 0xcd, 0x2e,
+ 0x3c, 0x4f, 0x50, 0x01, 0xee, 0x1e, 0x50, 0x02, 0xb1, 0x07, 0x05, 0xf0,
+ 0xd0, 0xf2, 0xd2, 0xd0,
+ 0xc0, 0xf1, 0xf0, 0xe2, 0x04, 0x0f, 0x0c, 0x6f, 0x5f, 0x10, 0x2c, 0x01,
+ 0x55, 0x11, 0x0d, 0x2f,
+ 0x02, 0x02, 0xfb, 0xde, 0xee, 0x01, 0x0e, 0x08, 0xcf, 0x01, 0x32, 0x21,
+ 0x60, 0x10, 0x00, 0xf0,
+ 0xe1, 0x12, 0x12, 0x15, 0x81, 0xef, 0xe0, 0x04, 0xe5, 0xbf, 0x20, 0x42,
+ 0x2d, 0x3c, 0x30, 0x30,
+ 0xfe, 0x3c, 0x50, 0x0f, 0xbe, 0x03, 0x37, 0xe0, 0x80, 0xf4, 0x05, 0x10,
+ 0xdf, 0xdd, 0x00, 0x23,
+ 0x64, 0x0f, 0xfd, 0x2f, 0x1c, 0x30, 0x33, 0x1f, 0xe9, 0x00, 0x63, 0x17,
+ 0xe0, 0xce, 0x00, 0x23,
+ 0xf1, 0xc0, 0x1f, 0x01, 0xe1, 0x11, 0x40, 0x02, 0xf4, 0xd0, 0x0e, 0x30,
+ 0x4e, 0xc9, 0xdf, 0x00,
+ 0x01, 0xed, 0xcd, 0x11, 0x74, 0x32, 0x30, 0xe8, 0xdc, 0x00, 0x01, 0x00,
+ 0xdd, 0xbe, 0xdd, 0x00,
+ 0x20, 0x43, 0xe0, 0x31, 0x40, 0x1e, 0x73, 0x05, 0x03, 0xa5, 0xf0, 0xee,
+ 0xfd, 0xc7, 0x13, 0x0f,
+ 0xaa, 0xef, 0xe0, 0x0d, 0x00, 0xef, 0xe0, 0xff, 0x1e, 0x0d, 0x0e, 0x23,
+ 0x31, 0x6e, 0x2d, 0x24,
+ 0x07, 0x33, 0x42, 0x71, 0x10, 0x0f, 0xad, 0xf0, 0x00, 0x09, 0x0d, 0x0f,
+ 0x0f, 0x20, 0x40, 0x20,
+ 0x10, 0x02, 0x02, 0x14, 0x02, 0xcf, 0xcf, 0xc7, 0xc1, 0xd2, 0xc1, 0xc0,
+ 0x00, 0x27, 0x07, 0xd1,
+ 0xef, 0x0f, 0x30, 0x71, 0x60, 0x10, 0x00, 0x20, 0x10, 0x10, 0x05, 0xf0,
+ 0xec, 0xfe, 0x02, 0x15,
+ 0x20, 0xee, 0xcf, 0x2f, 0x3f, 0x41, 0xf2, 0x2e, 0x7c, 0x5e, 0xff, 0xe4,
+ 0x14, 0x0a, 0xfd, 0xf1,
+ 0x02, 0xd0, 0x03, 0x27, 0xe0, 0xbc, 0xc0, 0xf1, 0xe0, 0xea, 0x00, 0x63,
+ 0x01, 0xdd, 0x0f, 0x30,
+ 0x10, 0x0e, 0x0f, 0x30, 0x03, 0x01, 0x05, 0x72, 0x52, 0x02, 0xf0, 0xd1,
+ 0xfd, 0x0b, 0x2e, 0x3f,
+ 0x0d, 0x08, 0x4e, 0x0e, 0x00, 0x31, 0xc1, 0x84, 0xe0, 0xfd, 0xf1, 0xd7,
+ 0x03, 0x2e, 0xed, 0xa0,
+ 0x03, 0x05, 0x1f, 0xfd, 0xd0, 0x00, 0xbd, 0x0f, 0x61, 0x0e, 0x08, 0x0f,
+ 0x10, 0x20, 0x1f, 0x0d,
+ 0x31, 0x73, 0x20, 0xde, 0xed, 0xbf, 0xfd, 0xf0, 0xb1, 0xe0, 0xf5, 0xf3,
+ 0xd5, 0x07, 0x12, 0xef,
+ 0x0f, 0x63, 0x04, 0x32, 0x52, 0x11, 0x32, 0x13, 0xd0, 0xbb, 0x0f, 0x1e,
+ 0x0f, 0x12, 0x07, 0x04,
+ 0x0f, 0xed, 0x01, 0x31, 0x10, 0x0e, 0x50, 0x5c, 0x0c, 0x0e, 0x2f, 0x6e,
+ 0x3e, 0xfc, 0xde, 0x01,
+ 0x17, 0x11, 0x80, 0x00, 0xe0, 0xfe, 0x01, 0xf1, 0x01, 0x20, 0x0d, 0x09,
+ 0x30, 0x3e, 0x50, 0x41,
+ 0x52, 0x11, 0x17, 0x02, 0x00, 0x44, 0x33, 0xd2, 0xe4, 0xf0, 0xd0, 0xf0,
+ 0x01, 0x00, 0xe1, 0x0b,
+ 0x0a, 0x3f, 0x7e, 0x20, 0x12, 0x20, 0xec, 0xe0, 0x34, 0xd0, 0xcd, 0x01,
+ 0xa4, 0xb2, 0xd0, 0xf2,
+ 0xe6, 0x21, 0x4f, 0xec, 0x11, 0x43, 0x0d, 0x0e, 0x42, 0x76, 0x01, 0x13,
+ 0x01, 0xc1, 0x00, 0xfe,
+ 0xdf, 0xfe, 0xf1, 0xee, 0xe8, 0xfd, 0x00, 0xe0, 0xb2, 0xed, 0x5b, 0x50,
+ 0x11, 0x11, 0x1f, 0x0d,
+ 0x0d, 0x24, 0xf5, 0xc2, 0x0f, 0xde, 0x8c, 0xf0, 0x0e, 0x00, 0x20, 0xf0,
+ 0xef, 0x01, 0x07, 0xdf,
+ 0xad, 0x00, 0x01, 0xed, 0xea, 0x10, 0x31, 0xf1, 0xdf, 0x3d, 0x7d, 0x0e,
+ 0x26, 0x57, 0x20, 0x30,
+ 0x00, 0xaf, 0x00, 0x01, 0x00, 0xf0, 0xc0, 0x0b, 0xff, 0x0e, 0x01, 0x01,
+ 0x28, 0x00, 0x29, 0x00,
+ 0x5f, 0xf8, 0x7b, 0x1c, 0x99, 0xf9, 0xb3, 0x1f, 0x0c, 0x00, 0x76, 0x70,
+ 0x0f, 0xfd, 0x03, 0x03,
+ 0x0d, 0xda, 0xe0, 0xd0, 0xe0, 0xd0, 0xe2, 0xd2, 0xf2, 0x22, 0x23, 0x15,
+ 0x75, 0x40, 0x31, 0x44,
+ 0xf1, 0x02, 0x22, 0x30, 0x00, 0x10, 0x12, 0xff, 0xed, 0x30, 0x44, 0x00,
+ 0xfe, 0x0f, 0x3d, 0x08,
+ 0xac, 0x00, 0x60, 0x12, 0x11, 0xee, 0x9b, 0x00, 0xfe, 0xf0, 0xdd, 0xff,
+ 0xdb, 0xbd, 0x00, 0x04,
+ 0x10, 0xec, 0xfe, 0x35, 0x56, 0x00, 0x0f, 0x50, 0x32, 0x11, 0xfe, 0xdd,
+ 0xe0, 0xf3, 0xe0, 0xcc,
+ 0x03, 0x17, 0xf0, 0xe0, 0x60, 0x46, 0x41, 0x21, 0x00, 0x40, 0xf0, 0xef,
+ 0xe0, 0x00, 0x01, 0xff,
+ 0xea, 0xee, 0xdc, 0x0e, 0x60, 0x12, 0x11, 0x4e, 0x01, 0x26, 0x01, 0xbe,
+ 0xee, 0x21, 0x12, 0xbe,
+ 0xcd, 0x02, 0x12, 0x31, 0x20, 0x2b, 0x4f, 0x40, 0x41, 0x0b, 0x0c, 0x0f,
+ 0x3f, 0x20, 0x12, 0x01,
+ 0x0c, 0xab, 0xbe, 0xf0, 0xaa, 0xfe, 0xef, 0xd0, 0xef, 0xd1, 0x07, 0xf2,
+ 0xe1, 0xef, 0x31, 0x63,
+ 0x16, 0x42, 0x10, 0x01, 0x0e, 0xe0, 0xb1, 0xe2, 0x1d, 0x10, 0x34, 0x45,
+ 0x20, 0x00, 0x51, 0x55,
+ 0x40, 0x22, 0x42, 0x1f, 0x0c, 0xfe, 0xef, 0x00, 0x02, 0x0d, 0x8a, 0xf0,
+ 0xf2, 0xf0, 0xe0, 0xf0,
+ 0xd0, 0x0e, 0x0f, 0x24, 0x32, 0x1d, 0x6c, 0x31, 0x01, 0x09, 0xed, 0x31,
+ 0x30, 0xfe, 0xcf, 0xf2,
+ 0xf7, 0xce, 0xed, 0x01, 0x05, 0x00, 0x11, 0x52, 0x51, 0x34, 0x11, 0x23,
+ 0x31, 0x1c, 0xfa, 0xdf,
+ 0xe0, 0xd0, 0xb0, 0x0e, 0x31, 0xe2, 0x8d, 0xdb, 0x01, 0x32, 0x0e, 0x1a,
+ 0x30, 0x02, 0x01, 0xd1,
+ 0x02, 0xf4, 0xae, 0xef, 0x02, 0xf2, 0xec, 0x01, 0x26, 0xe0, 0x00, 0xab,
+ 0xde, 0x2e, 0x50, 0x20,
+ 0xfb, 0xcf, 0xfe, 0xff, 0xe0, 0x12, 0x74, 0xff, 0xac, 0x04, 0x03, 0x0e,
+ 0xbb, 0x11, 0x21, 0x00,
+ 0x0b, 0xf0, 0x00, 0x1f, 0x0f, 0x10, 0x36, 0x10, 0xc0, 0x9f, 0xe0, 0x00,
+ 0xf0, 0xf2, 0xc1, 0x00,
+ 0xde, 0xfc, 0x00, 0x20, 0xee, 0xdf, 0x0e, 0x1f, 0x7e, 0x51, 0x17, 0x23,
+ 0x25, 0x02, 0x11, 0x12,
+ 0x12, 0x32, 0x20, 0xfa, 0xff, 0x0b, 0x1e, 0x20, 0x30, 0x31, 0x5f, 0x2d,
+ 0x01, 0x92, 0xe2, 0xf0,
+ 0xf0, 0xa0, 0xe3, 0xe4, 0xfd, 0xb8, 0xec, 0x02, 0xf1, 0x0f, 0x0c, 0x3e,
+ 0x50, 0x27, 0x61, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x0c, 0xcf, 0x00, 0x02, 0x0d, 0xbc, 0x0f, 0x11,
+ 0x57, 0x04, 0x10, 0x10,
+ 0x55, 0x00, 0x00, 0x10, 0x30, 0x1e, 0x00, 0x0d, 0xfd, 0xed, 0xff, 0x14,
+ 0xf4, 0xae, 0xda, 0xf0,
+ 0xf1, 0x00, 0xf0, 0x32, 0x74, 0x21, 0x00, 0xb2, 0xe1, 0xfd, 0xfd, 0xf3,
+ 0xf5, 0x0e, 0x0b, 0xee,
+ 0xe1, 0x77, 0x71, 0x01, 0x01, 0xf1, 0x14, 0x61, 0x03, 0x01, 0x0f, 0x0f,
+ 0xe0, 0xf0, 0xec, 0xff,
+ 0xf0, 0xe1, 0xfe, 0xd8, 0x0a, 0x61, 0x23, 0x00, 0x0d, 0x21, 0x13, 0xf2,
+ 0xd0, 0x2f, 0x00, 0xc0,
+ 0xcd, 0x1d, 0x44, 0x15, 0xae, 0xfd, 0x0f, 0x30, 0x3d, 0x30, 0x40, 0x2c,
+ 0x08, 0x0d, 0x40, 0x3f,
+ 0xee, 0xd0, 0x0f, 0xd1, 0x90, 0xf0, 0xd6, 0xe0, 0xad, 0xfe, 0xd1, 0x07,
+ 0xf2, 0x00, 0x31, 0xe1,
+ 0xf0, 0x1e, 0xf1, 0xf1, 0x3f, 0x4e, 0x21, 0x43, 0xe0, 0xae, 0xf1, 0xf7,
+ 0x04, 0xdc, 0x1f, 0x5f,
+ 0x53, 0x75, 0x10, 0x0e, 0x1f, 0x0a, 0xfc, 0x00, 0x03, 0x11, 0xe0, 0xfd,
+ 0xe1, 0xd3, 0xd1, 0xb2,
+ 0x02, 0xce, 0xdc, 0x17, 0x62, 0x00, 0x3c, 0x41, 0x02, 0x10, 0x2d, 0x0f,
+ 0x20, 0x10, 0x40, 0x05,
+ 0x02, 0xbf, 0xdc, 0xf0, 0xe5, 0x03, 0x0f, 0xdc, 0x01, 0x13, 0x4e, 0x3d,
+ 0x74, 0x12, 0xff, 0xcb,
+ 0x01, 0x01, 0x00, 0xed, 0xd0, 0x46, 0x72, 0x10, 0xfe, 0x01, 0x00, 0x0d,
+ 0x0c, 0x42, 0x65, 0x00,
+ 0xcf, 0x03, 0x16, 0x01, 0xd1, 0xe0, 0x00, 0x06, 0x13, 0x00, 0x0e, 0x40,
+ 0x32, 0x1e, 0x3a, 0x50,
+ 0xef, 0x00, 0x71, 0xf0, 0xec, 0x1e, 0x50, 0x04, 0xbf, 0x0c, 0xee, 0xdb,
+ 0x00, 0x00, 0x42, 0x10,
+ 0x0b, 0x3e, 0x70, 0x11, 0x01, 0x00, 0xff, 0xf5, 0x04, 0xc0, 0xe0, 0xc0,
+ 0xce, 0xcf, 0xf0, 0x02,
+ 0xfa, 0xdc, 0x0f, 0x10, 0x2c, 0x2e, 0x3f, 0x43, 0xb1, 0xdd, 0x1d, 0x01,
+ 0x93, 0xf5, 0xe5, 0x22,
+ 0xf1, 0xdf, 0xbe, 0x11, 0x15, 0x0d, 0x19, 0x7f, 0x4f, 0x0f, 0x0f, 0x31,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x04, 0xf3, 0xf0, 0x01, 0xe5, 0xd0, 0xa1, 0xd0, 0xed, 0xff, 0xf0, 0x03,
+ 0x24, 0x20, 0xda, 0x22,
+ 0x75, 0x30, 0xee, 0x10, 0x44, 0x31, 0x53, 0x01, 0xc3, 0x00, 0xfd, 0x1f,
+ 0x50, 0x0f, 0x0a, 0x0e,
+ 0x40, 0x56, 0x0f, 0xfd, 0xff, 0x00, 0xe1, 0xf1, 0x45, 0x01, 0x9d, 0xf9,
+ 0x10, 0x21, 0x01, 0x00,
+ 0x00, 0xff, 0x0f, 0x3f, 0x10, 0x14, 0x75, 0x0f, 0xea, 0xd0, 0xe2, 0xc1,
+ 0xff, 0x1e, 0x10, 0xd0,
+ 0xa0, 0xf3, 0xfe, 0x0d, 0x43, 0x25, 0x21, 0x20, 0x40, 0xe0, 0xcf, 0x53,
+ 0x2f, 0x08, 0xdb, 0xdf,
+ 0x0f, 0xf0, 0x01, 0xcf, 0xad, 0x00, 0x42, 0x27, 0x20, 0x0f, 0xbd, 0xf0,
+ 0x02, 0x03, 0xe2, 0xf0,
+ 0x01, 0xb0, 0xec, 0xd0, 0x44, 0x00, 0x2b, 0x2f, 0x30, 0x60, 0x10, 0x2f,
+ 0xf8, 0xf0, 0xf0, 0xdf,
+ 0xfd, 0x0e, 0xe0, 0x80, 0xae, 0x0e, 0x00, 0xe5, 0xe3, 0x04, 0xd0, 0x0f,
+ 0x0b, 0x40, 0x20, 0x44,
+ 0x30, 0x0d, 0x10, 0x07, 0x35, 0xc0, 0xd0, 0xf0, 0x02, 0xe1, 0x90, 0xd0,
+ 0xdf, 0x0f, 0x01, 0x63,
+ 0x52, 0x10, 0x1e, 0x1f, 0x43, 0x10, 0x18, 0x0e, 0xe2, 0x13, 0x3f, 0x20,
+ 0xe3, 0x88, 0xfe, 0xd0,
+ 0x00, 0x02, 0x0d, 0x0c, 0xf0, 0x4f, 0x2d, 0x0f, 0x00, 0x31, 0x61, 0x0f,
+ 0xe9, 0xe0, 0x10, 0x11,
+ 0x07, 0x45, 0x1f, 0x5f, 0x42, 0x21, 0x20, 0x00, 0x40, 0x33, 0x01, 0xde,
+ 0x10, 0x72, 0x42, 0x0d,
+ 0xce, 0xf0, 0xfd, 0x08, 0xee, 0xd1, 0x16, 0x10, 0x0e, 0x00, 0xa1, 0xed,
+ 0xf0, 0x25, 0x10, 0x1f,
+ 0x23, 0x35, 0x71, 0x0e, 0xde, 0x01, 0x63, 0x01, 0x0f, 0xff, 0x01, 0xe0,
+ 0xf1, 0x27, 0x57, 0xd0,
+ 0xae, 0x0e, 0xf1, 0xf3, 0xe0, 0xcf, 0xeb, 0xef, 0x00, 0x01, 0x0f, 0x1d,
+ 0x5d, 0x3d, 0x40, 0x22,
+ 0x57, 0x01, 0x0f, 0xff, 0x00, 0x00, 0xd0, 0xf3, 0xe0, 0xbb, 0xe0, 0xde,
+ 0xde, 0xf0, 0xcf, 0xd9,
+ 0x0e, 0x4f, 0x20, 0x1f, 0x0c, 0x60, 0x30, 0x16, 0x13, 0xc3, 0xa0, 0xed,
+ 0xc0, 0xe0, 0xd3, 0xef,
+ 0x0e, 0x2e, 0x4a, 0x2e, 0x7f, 0x21, 0x30, 0x0d, 0x1d, 0x56, 0x12, 0x0b,
+ 0xcb, 0xff, 0xe0, 0xff,
+ 0xfe, 0x00, 0xd0, 0xcf, 0xe2, 0x07, 0x03, 0xdf, 0x0c, 0xf0, 0x41, 0x72,
+ 0x40, 0x0f, 0xe0, 0x1f,
+ 0x12, 0x24, 0xfe, 0xef, 0x07, 0x45, 0x01, 0xd0, 0xde, 0xf2, 0x73, 0x73,
+ 0x00, 0xff, 0x0e, 0x0d,
+ 0x20, 0x2e, 0x0e, 0xde, 0x0d, 0xfc, 0x0e, 0x00, 0xda, 0xef, 0x23, 0x0f,
+ 0xfa, 0xf0, 0xe1, 0x62,
+ 0x32, 0x00, 0x00, 0xa9, 0xcd, 0xf0, 0x04, 0x10, 0xfc, 0xcf, 0xf0, 0x20,
+ 0x33, 0x02, 0xdf, 0xde,
+ 0x12, 0x47, 0x56, 0x40, 0x00, 0xd0, 0xd0, 0x31, 0x00, 0x80, 0xdf, 0x01,
+ 0x01, 0x31, 0x77, 0x22,
+ 0x0e, 0xec, 0x31, 0x60, 0x03, 0x0e, 0x0c, 0x00, 0xf0, 0xcd, 0x00, 0x10,
+ 0xeb, 0xe0, 0x12, 0x42,
+ 0x10, 0x02, 0x27, 0x07, 0xe0, 0x0d, 0x10, 0x50, 0x21, 0x1e, 0x3c, 0xef,
+ 0xe0, 0x0e, 0x5f, 0x10,
+ 0xdf, 0xee, 0x10, 0x34, 0xc0, 0x9c, 0xdb, 0xde, 0x10, 0x32, 0xe3, 0x80,
+ 0x0d, 0xfd, 0xdc, 0xe0,
+ 0xf2, 0x02, 0x01, 0xbe, 0xfa, 0xf3, 0x06, 0xd3, 0x04, 0x62, 0x12, 0x20,
+ 0x31, 0x43, 0x22, 0x60,
+ 0x0e, 0x3c, 0x2f, 0x02, 0x14, 0x35, 0x2f, 0x00, 0xc3, 0x02, 0xd0, 0xcd,
+ 0xd3, 0xd7, 0xf6, 0x9d,
+ 0xfe, 0xf0, 0xf0, 0x00, 0x2c, 0x3f, 0x0f, 0xfd, 0x1f, 0x71, 0x55, 0x10,
+ 0x0d, 0x0f, 0x00, 0xfe,
+ 0xf0, 0x02, 0xd1, 0xd1, 0xd2, 0x83, 0xf5, 0x00, 0x1e, 0x10, 0x27, 0x76,
+ 0x10, 0x1e, 0x0f, 0x40,
+ 0x01, 0x04, 0xf1, 0x30, 0x0a, 0xcf, 0xf0, 0x03, 0x21, 0xee, 0xcd, 0xf1,
+ 0x01, 0x30, 0xbe, 0xcd,
+ 0x11, 0x03, 0x01, 0x01, 0x31, 0x40, 0x2c, 0x61, 0x17, 0x11, 0x0d, 0x00,
+ 0xde, 0xbd, 0x20, 0x16,
+ 0xd2, 0x8c, 0xfb, 0x00, 0xf0, 0xee, 0xfd, 0x10, 0x0d, 0xff, 0xcc, 0x01,
+ 0x55, 0x00, 0xeb, 0x0e,
+ 0x70, 0x01, 0x02, 0xe1, 0xef, 0xfe, 0xfb, 0xe3, 0x06, 0xf0, 0xcb, 0x20,
+ 0x41, 0xe0, 0xde, 0x1e,
+ 0x20, 0xd1, 0xe0, 0x93, 0xe1, 0xf1, 0xee, 0x8a, 0xef, 0x01, 0x03, 0x10,
+ 0x03, 0x17, 0x33, 0x01,
+ 0x0e, 0x20, 0x51, 0x1f, 0x4b, 0x50, 0x23, 0x0f, 0x0e, 0x32, 0x52, 0x09,
+ 0xed, 0xd0, 0x02, 0xf0,
+ 0xca, 0xe0, 0xe0, 0xd0, 0xc1, 0xd0, 0x00, 0xf0, 0x10, 0x50, 0x55, 0x1c,
+ 0x0e, 0x01, 0xf1, 0xee,
+ 0x08, 0xed, 0xa0, 0xfe, 0xd0, 0xf2, 0x04, 0x01, 0xff, 0xce, 0x13, 0x77,
+ 0x12, 0x22, 0x12, 0x0e,
+ 0x1c, 0x0f, 0x01, 0x51, 0x2f, 0x20, 0x77, 0x21, 0x0d, 0xee, 0x43, 0x44,
+ 0x0f, 0xe9, 0x20, 0x42,
+ 0x11, 0xff, 0xd0, 0x11, 0x21, 0xfd, 0x9c, 0x01, 0xf5, 0xd0, 0xfd, 0xd0,
+ 0x0f, 0x00, 0xb0, 0x03,
+ 0x35, 0x61, 0x0f, 0x1f, 0x04, 0x03, 0x00, 0x23, 0x03, 0xbf, 0x0d, 0x02,
+ 0x06, 0x01, 0xbe, 0x10,
+ 0x65, 0x02, 0x20, 0x0d, 0x1e, 0x21, 0x13, 0xdb, 0xdb, 0xde, 0x8b, 0xf0,
+ 0x02, 0x07, 0xd1, 0xb0,
+ 0x0e, 0x21, 0x75, 0x01, 0x10, 0x1e, 0x10, 0x3f, 0x10, 0x11, 0xec, 0xbc,
+ 0x00, 0xfe, 0x0e, 0x1e,
+ 0xee, 0xd0, 0xee, 0xef, 0x20, 0x47, 0x01, 0x1f, 0x50, 0x30, 0x10, 0x3f,
+ 0x33, 0x0f, 0xcc, 0xdf,
+ 0x89, 0xb0, 0x00, 0xe3, 0xf1, 0xee, 0xef, 0x02, 0x05, 0x22, 0x14, 0x30,
+ 0x4f, 0x30, 0x52, 0x03,
+ 0x1c, 0xfc, 0xe0, 0x04, 0xdf, 0x0d, 0xc0, 0xe0, 0x0f, 0x33, 0x13, 0x0f,
+ 0x0e, 0x71, 0x15, 0x00,
+ 0xfb, 0x3f, 0x4f, 0x00, 0x02, 0x04, 0x00, 0xe0, 0xb7, 0x03, 0x2f, 0xfd,
+ 0xde, 0x30, 0x73, 0x11,
+ 0xfb, 0x00, 0x50, 0x0c, 0xfd, 0x00, 0x13, 0x16, 0x13, 0xf1, 0xf4, 0x35,
+ 0x0f, 0xdc, 0xc0, 0xe2,
+ 0xe0, 0xbc, 0x00, 0x62, 0x20, 0xfc, 0x0f, 0x02, 0xef, 0xee, 0x05, 0x23,
+ 0x0e, 0x1c, 0x03, 0xf5,
+ 0x01, 0x40, 0x1d, 0x23, 0x32, 0x40, 0x6f, 0x17, 0x17, 0x00, 0xfe, 0x20,
+ 0x53, 0xd0, 0xac, 0x01,
+ 0x17, 0x12, 0xe0, 0x9e, 0x00, 0xf1, 0x02, 0x0e, 0x0d, 0x3f, 0xf8, 0x2f,
+ 0x7f, 0x51, 0x01, 0xf0,
+ 0x00, 0x10, 0x00, 0xe0, 0x02, 0x00, 0x0d, 0xdb, 0x00, 0x00, 0x2f, 0x00,
+ 0xe1, 0xd0, 0x3b, 0x3d,
+ 0x2f, 0x03, 0x01, 0x8a, 0xee, 0x00, 0xee, 0xaf, 0xf1, 0xe7, 0xc0, 0xeb,
+ 0xe0, 0xf1, 0xd2, 0xe0,
+ 0xde, 0xef, 0x10, 0x43, 0x1f, 0x20, 0x51, 0x4d, 0x29, 0x31, 0x10, 0xfd,
+ 0xe9, 0x20, 0x63, 0x30,
+ 0x30, 0x1e, 0x00, 0x11, 0x30, 0x00, 0xb3, 0xf1, 0xe2, 0x07, 0x23, 0xd2,
+ 0x8f, 0xdc, 0xf0, 0xd0,
+ 0xe0, 0xae, 0x0d, 0x2f, 0x0d, 0x0f, 0x42, 0x37, 0x16, 0x20, 0x31, 0x66,
+ 0x00, 0xd1, 0x11, 0x13,
+ 0x0f, 0x9d, 0xf0, 0xf0, 0x0d, 0xdc, 0xeb, 0x30, 0x50, 0x20, 0x20, 0x40,
+ 0x30, 0x42, 0x15, 0x22,
+ 0xff, 0xfe, 0xf0, 0x04, 0xd0, 0xd0, 0xcc, 0xdc, 0xfd, 0xd0, 0xb0, 0xf5,
+ 0xf0, 0x1e, 0x2d, 0x30,
+ 0x41, 0xf0, 0xaf, 0x0f, 0xf3, 0xd3, 0xc6, 0x06, 0xe1, 0x9c, 0xef, 0x00,
+ 0x53, 0x00, 0xfa, 0x0e,
+ 0x4e, 0x40, 0x21, 0x30, 0x0c, 0x2f, 0x02, 0xe2, 0xd0, 0xdf, 0xc0, 0xce,
+ 0xd0, 0xe7, 0xc4, 0xde,
+ 0xef, 0xd0, 0xdf, 0x30, 0x74, 0x76, 0x20, 0x0e, 0x0f, 0x11, 0x0f, 0xff,
+ 0xfe, 0x02, 0xe1, 0xa9,
+ 0xdf, 0x00, 0x00, 0xcd, 0xda, 0x0f, 0x70, 0x20, 0x02, 0x0e, 0x0e, 0x30,
+ 0x04, 0xe2, 0xef, 0xfc,
+ 0xff, 0xdd, 0xe0, 0xe2, 0xb0, 0xaa, 0x02, 0x07, 0x21, 0x31, 0x44, 0x21,
+ 0x01, 0x00, 0x02, 0x54,
+ 0x00, 0xe1, 0xd2, 0xee, 0xec, 0x00, 0x04, 0xb0, 0xcc, 0x11, 0x45, 0x30,
+ 0x10, 0x41, 0x41, 0x22,
+ 0xfd, 0xe9, 0x30, 0x50, 0x1f, 0xcf, 0xcd, 0xee, 0x0f, 0xeb, 0xf0, 0xe0,
+ 0x0e, 0x1e, 0x10, 0x73,
+ 0x77, 0x00, 0x00, 0xf1, 0x14, 0x21, 0x0f, 0x00, 0x15, 0x10, 0x01, 0x01,
+ 0xf0, 0xfc, 0xee, 0x11,
+ 0x74, 0x31, 0x30, 0x0e, 0x21, 0x54, 0x35, 0xe0, 0xd9, 0x10, 0x40, 0xc1,
+ 0xc1, 0xcd, 0xdf, 0xe1,
+ 0xf1, 0xf0, 0x0e, 0x20, 0x40, 0x71, 0x31, 0x44, 0x14, 0x02, 0x05, 0xf2,
+ 0x16, 0x22, 0xf3, 0x8e,
+ 0xcc, 0x00, 0xe0, 0x00, 0x05, 0x01, 0xfe, 0xfd, 0x03, 0x06, 0x00, 0xad,
+ 0x0f, 0x00, 0x3d, 0x3f,
+ 0x12, 0x36, 0xee, 0xed, 0x00, 0x46, 0x41, 0x11, 0xef, 0xcd, 0x0f, 0x0e,
+ 0xbf, 0x0d, 0x0a, 0xfc,
+ 0xcd, 0x20, 0x50, 0x00, 0xff, 0xcf, 0xf0, 0xf2, 0xe6, 0xe3, 0xc4, 0x90,
+ 0xe0, 0xd1, 0xf2, 0xf1,
+ 0xf0, 0x0c, 0x3f, 0x6c, 0x2c, 0x0d, 0x10, 0x50, 0x0c, 0x30, 0x23, 0x13,
+ 0x2f, 0x1d, 0x17, 0x21,
+ 0xef, 0xed, 0xe0, 0x80, 0xd8, 0x0f, 0x11, 0x42, 0xfd, 0xba, 0xff, 0x0f,
+ 0x1f, 0x00, 0x00, 0x34,
+ 0x11, 0xff, 0x02, 0x77, 0x10, 0xdd, 0xe0, 0x15, 0x00, 0xc0, 0xf2, 0x11,
+ 0x02, 0x8f, 0x0f, 0x20,
+ 0x10, 0x1e, 0x20, 0x43, 0x14, 0x0e, 0x1c, 0x20, 0x63, 0x21, 0x0d, 0x3d,
+ 0x25, 0x00, 0x9a, 0x00,
+ 0xe0, 0x00, 0xee, 0xbd, 0xf0, 0x05, 0xf0, 0xcc, 0x00, 0x0f, 0x0e, 0x0e,
+ 0x50, 0x20, 0x1c, 0xed,
+ 0x02, 0x77, 0x05, 0xc0, 0x00, 0xe0, 0xf1, 0xe4, 0x12, 0x02, 0xce, 0xee,
+ 0xd0, 0x20, 0x76, 0x21,
+ 0x31, 0x2f, 0x0c, 0x00, 0x6f, 0x10, 0x24, 0x01, 0x0e, 0xf0, 0x17, 0x23,
+ 0xc0, 0xac, 0xff, 0xed,
+ 0x10, 0x32, 0x02, 0x2c, 0x0b, 0x10, 0x50, 0x35, 0x00, 0xc0, 0x00, 0xf0,
+ 0xe0, 0x21, 0x00, 0x9e,
+ 0xea, 0x00, 0x1f, 0x51, 0x0f, 0xdb, 0x0f, 0x5f, 0x20, 0x30, 0x0e, 0x33,
+ 0x00, 0x98, 0xff, 0x01,
+ 0xe2, 0xc0, 0xff, 0xe1, 0xe0, 0xcd, 0xec, 0x01, 0x05, 0x2f, 0x1d, 0x10,
+ 0x03, 0x40, 0x31, 0x64,
+ 0x12, 0x32, 0x27, 0x14, 0x01, 0x11, 0x01, 0x01, 0xf2, 0x9f, 0xfb, 0xef,
+ 0xfe, 0xe0, 0x33, 0x32,
+ 0x0e, 0xcc, 0x20, 0x77, 0x33, 0x0f, 0x0e, 0x2f, 0x2d, 0x00, 0xf0, 0xf6,
+ 0x11, 0xd0, 0x8b, 0xf0,
+ 0x03, 0x1f, 0x0d, 0x00, 0x64, 0x00, 0xde, 0xee, 0xdf, 0x0f, 0x0e, 0x33,
+ 0x37, 0xe0, 0xed, 0x52,
+ 0x01, 0x7f, 0x62, 0x06, 0x0f, 0x0f, 0x11, 0x04, 0x04, 0x01, 0xef, 0xcd,
+ 0xeb, 0xdf, 0x00, 0xff,
+ 0x01, 0x30, 0x3c, 0x30, 0x74, 0x10, 0x0d, 0x4e, 0x43, 0x17, 0x37, 0x10,
+ 0xdd, 0xe0, 0xf0, 0xc1,
+ 0x91, 0xef, 0xcd, 0xdd, 0xf0, 0xf0, 0x00, 0x2f, 0x0f, 0x0d, 0x5e, 0x31,
+ 0x47, 0x01, 0xbd, 0x0b,
+ 0x10, 0x24, 0xe0, 0xdd, 0xd0, 0xcd, 0xc0, 0x01, 0x02, 0xff, 0xfb, 0x60,
+ 0x34, 0x30, 0x20, 0x2b,
+ 0x0c, 0x0e, 0x0f, 0xff, 0xa0, 0xcf, 0xef, 0xc1, 0xb4, 0xe2, 0xe5, 0xf5,
+ 0x00, 0xd0, 0xdd, 0x00,
+ 0x42, 0x35, 0x51, 0x10, 0x3f, 0x08, 0x2f, 0x3f, 0x20, 0x02, 0xf0, 0xd0,
+ 0x20, 0x24, 0x00, 0x10,
+ 0xd1, 0x12, 0x3f, 0x00, 0xe2, 0xde, 0xd9, 0x11, 0x52, 0xce, 0x04, 0x03,
+ 0x43, 0x00, 0xee, 0x00,
+ 0x47, 0x1e, 0x1b, 0x2c, 0xb8, 0x20, 0x63, 0x2e, 0xed, 0xbc, 0xdc, 0xcc,
+ 0xee, 0xcd, 0xbd, 0xec,
+ 0xce, 0xee, 0xdd, 0xbd, 0xdc, 0xcc, 0xdd, 0xbc, 0xed, 0xcc, 0xed, 0xcd,
+ 0xdd, 0xcd, 0xde, 0xdf,
+ 0xce, 0xef, 0xdf, 0xcd, 0xec, 0xdd, 0xcc, 0xec, 0xdc, 0xdd, 0xdb, 0xce,
+ 0xdd, 0xde, 0xdd, 0xde,
+ 0xde, 0xde, 0xcd, 0xdd, 0xdd, 0xde, 0xdd, 0xca, 0xec, 0xcd, 0xdb, 0xcd,
+ 0xdd, 0xcd, 0xcc, 0xcd,
+ 0xdd, 0xbd, 0xee, 0xdf, 0xce, 0xdf, 0xd1, 0xd4, 0xc3, 0xe2, 0xe1, 0xf4,
+ 0xf5, 0xf3, 0xf4, 0xf2,
+ 0xd1, 0xc1, 0xd1, 0xc2, 0xc2, 0xd1, 0xb0, 0xd0, 0xd2, 0xd7, 0xc5, 0xc2,
+ 0xd2, 0xd3, 0xd5, 0xe3,
+ 0xd5, 0xc3, 0xd3, 0xc4, 0xd2, 0xc3, 0xd3, 0xd4, 0xb2, 0xd2, 0xd3, 0xd3,
+ 0xc2, 0xc0, 0xe0, 0xdf,
+ 0xdd, 0xee, 0xee, 0xef, 0xef, 0xec, 0xed, 0xff, 0x02, 0xf4, 0xd0, 0xcc,
+ 0xdb, 0xab, 0xdd, 0xbc,
+ 0xdd, 0xcc, 0xec, 0xcd, 0xdc, 0xed, 0xde, 0xdd, 0xcd, 0xcd, 0xee, 0xd0,
+ 0xc0, 0xd0, 0xc0, 0xd3,
+ 0xc4, 0xc0, 0xdf, 0xcc, 0xcd, 0xee, 0xde, 0xcb, 0xdd, 0xcd, 0xdb, 0xdd,
+ 0xef, 0xdf, 0xcd, 0xee,
+ 0xd0, 0xd3, 0xd4, 0xc2, 0xd3, 0xc4, 0xd2, 0xc0, 0xde, 0xdd, 0xcd, 0xd9,
+ 0xcd, 0xdd, 0xcd, 0xdc,
+ 0xd0, 0xd6, 0xd3, 0xc4, 0xd2, 0xd2, 0xd3, 0xc2, 0xd2, 0xd1, 0xd1, 0xd0,
+ 0xc0, 0xce, 0xee, 0xd2,
+ 0xe7, 0xb1, 0xe1, 0xc1, 0xd1, 0xc4, 0xd7, 0xd3, 0xc4, 0xd2, 0xc1, 0xe1,
+ 0xe1, 0xf1, 0xf2, 0xf1,
+ 0xff, 0x0e, 0x11, 0x36, 0x32, 0x31, 0x42, 0x37, 0x54, 0x24, 0x13, 0x13,
+ 0x05, 0x13, 0x24, 0x24,
+ 0x13, 0x13, 0x33, 0x44, 0x53, 0x54, 0x43, 0x43, 0x43, 0x45, 0x43, 0x33,
+ 0x43, 0x23, 0x33, 0x43,
+ 0x34, 0x33, 0x44, 0x23, 0x43, 0x33, 0x43, 0x45, 0x33, 0x43, 0x43, 0x44,
+ 0x32, 0x33, 0x42, 0x31,
+ 0x40, 0x2f, 0x3e, 0x4e, 0x2f, 0x3e, 0x3f, 0x3f, 0x40, 0x23, 0x37, 0x22,
+ 0x32, 0x32, 0x34, 0x33,
+ 0x34, 0x32, 0x32, 0x30, 0x4d, 0x29, 0x2d, 0x4d, 0x3b, 0x3d, 0x3b, 0x4d,
+ 0x5e, 0x3f, 0x4e, 0x3f,
+ 0x5f, 0x2f, 0x3f, 0x4e, 0x30, 0x4f, 0x2d, 0x39, 0x3d, 0x2d, 0x2b, 0x2d,
+ 0x1c, 0x1d, 0x1c, 0x2d,
+ 0x3e, 0x3d, 0x4e, 0x4e, 0x3e, 0x30, 0x40, 0x3f, 0x3f, 0x3f, 0x21, 0x13,
+ 0x04, 0x04, 0xf4, 0xe3,
+ 0xf4, 0xf4, 0x03, 0x24, 0x43, 0x73, 0x54, 0x21, 0x30, 0x30, 0x3e, 0x5f,
+ 0x40, 0x30, 0x42, 0x43,
+ 0x35, 0x34, 0x45, 0x32, 0x32, 0x32, 0x43, 0x44, 0x32, 0x32, 0x41, 0x20,
+ 0x3d, 0x3b, 0x3e, 0x2d,
+ 0x3c, 0x3d, 0x5f, 0x30, 0x22, 0x21, 0x21, 0x34, 0x44, 0x33, 0x43, 0x43,
+ 0x33, 0x42, 0x31, 0x41,
+ 0x3b, 0x28, 0x3c, 0x4d, 0x3e, 0x4d, 0x3d, 0x4e, 0x4d, 0x3e, 0x50, 0x32,
+ 0x42, 0x20, 0x2d, 0x3c,
+ 0x2d, 0x2b, 0x2c, 0x1e, 0x2d, 0x0c, 0x1c, 0x1d, 0x1c, 0x2f, 0x5f, 0x3f,
+ 0x3f, 0x40, 0x3f, 0x30,
+ 0x2d, 0x2b, 0x7e, 0x09, 0x0d, 0x3f, 0x2e, 0x1c, 0x1c, 0x1e, 0x2e, 0x0c,
+ 0x1d, 0x0b, 0xcc, 0x0d,
+ 0x0c, 0xfd, 0xcd, 0xdd, 0xdc, 0xdd, 0x8d, 0xcc, 0xde, 0xbd, 0xcd, 0xdc,
+ 0xde, 0xbd, 0xcd, 0xdd,
+ 0xce, 0xdf, 0xcf, 0xdf, 0xc0, 0xe2, 0xc1, 0xe0, 0xc2, 0xd2, 0xd1, 0xc2,
+ 0xd5, 0xc4, 0xd4, 0xd3,
+ 0xc3, 0xd4, 0xd2, 0xc0, 0xe1, 0xd1, 0xd0, 0xdc, 0xca, 0xde, 0xdd, 0xcc,
+ 0xcb, 0xde, 0xde, 0xcf,
+ 0xcf, 0xd0, 0xc0, 0xd2, 0xc1, 0xd1, 0xc1, 0xd0, 0xdd, 0xc8, 0xdd, 0xdc,
+ 0xdd, 0xdc, 0xdd, 0xdd,
+ 0xdf, 0xdf, 0xd0, 0xd1, 0xc0, 0xd0, 0xc4, 0xd4, 0xc3, 0xd2, 0xc3, 0xc0,
+ 0xdf, 0xde, 0xcd, 0xed,
+ 0xeb, 0xeb, 0xed, 0x00, 0x01, 0x10, 0x01, 0x13, 0x37, 0x25, 0x33, 0x54,
+ 0x24, 0x33, 0x54, 0x33,
+ 0x34, 0x42, 0x22, 0x33, 0x22, 0x32, 0x44, 0x33, 0x34, 0x22, 0x13, 0x14,
+ 0x54, 0x25, 0x13, 0x13,
+ 0x34, 0x22, 0x03, 0x23, 0x63, 0x33, 0x23, 0x42, 0x62, 0x64, 0x22, 0x32,
+ 0x31, 0x51, 0x21, 0x30,
+ 0x30, 0x30, 0x3e, 0x2b, 0x2e, 0x4f, 0x2f, 0x2f, 0x1f, 0x1e, 0x00, 0x02,
+ 0xf6, 0xe3, 0xb2, 0xc0,
+ 0xdf, 0xb0, 0xd2, 0xc0, 0xdf, 0xe2, 0xe4, 0xd4, 0xf4, 0x04, 0x02, 0x01,
+ 0x21, 0x33, 0x21, 0x10,
+ 0x10, 0x10, 0x20, 0x0e, 0xdc, 0xbf, 0xca, 0xcb, 0xdd, 0xca, 0xdb, 0xbc,
+ 0xdc, 0xdc, 0xed, 0xfd,
+ 0xed, 0xdd, 0xec, 0xfe, 0xee, 0xcd, 0xde, 0xbe, 0xce, 0xce, 0xcf, 0xbe,
+ 0xce, 0xdd, 0xcc, 0xdd,
+ 0xbc, 0xee, 0xee, 0xfd, 0xed, 0xef, 0x03, 0xf4, 0xf3, 0xf4, 0xf2, 0xe0,
+ 0xd0, 0xc0, 0xd1, 0xaf,
+ 0xd9, 0xcd, 0xde, 0xce, 0xda, 0xdb, 0xed, 0xdd, 0xdb, 0xed, 0xff, 0xee,
+ 0xdd, 0xdd, 0xcd, 0xde,
+ 0xcf, 0xad, 0xda, 0xce, 0xc0, 0xd0, 0xcf, 0xdf, 0xce, 0xce, 0xe0, 0xe2,
+ 0xd4, 0xd2, 0xc1, 0xd2,
+ 0xd5, 0xd4, 0xc2, 0xc3, 0xe3, 0xc3, 0xd4, 0xd4, 0xc3, 0xd2, 0xd1, 0xc3,
+ 0xe7, 0xf4, 0xe3, 0xd4,
+ 0xe2, 0xd1, 0xc3, 0xd3, 0xd5, 0xc3, 0xc2, 0xc2, 0xc4, 0xe3, 0xd4, 0xd4,
+ 0xd4, 0xe2, 0xe3, 0xf4,
+ 0x04, 0x13, 0xf0, 0x53, 0x44, 0x00, 0x10, 0x40, 0x40, 0x30, 0x2f, 0x4e,
+ 0x3f, 0x30, 0x30, 0x2f,
+ 0x3c, 0x2a, 0x0b, 0x0d, 0x2d, 0x2e, 0x0c, 0xdb, 0xdd, 0xee, 0xcd, 0xad,
+ 0xdc, 0xdd, 0xcc, 0xde,
+ 0xcd, 0xfe, 0x0f, 0x0e, 0x20, 0x20, 0x40, 0x42, 0x22, 0x23, 0x45, 0x13,
+ 0x01, 0xd1, 0xb2, 0xd2,
+ 0xc2, 0xd1, 0xd3, 0xf6, 0x01, 0x43, 0x67, 0x44, 0x43, 0x33, 0x33, 0x43,
+ 0x25, 0x33, 0x14, 0x13,
+ 0x02, 0x03, 0xe3, 0xd3, 0xe3, 0xd3, 0xd2, 0x02, 0x74, 0x53, 0x33, 0x43,
+ 0x42, 0x33, 0x54, 0x36,
+ 0x33, 0x43, 0x35, 0x34, 0x33, 0x34, 0x33, 0x24, 0x33, 0x32, 0x33, 0x53,
+ 0x43, 0x42, 0x41, 0x31,
+ 0x53, 0x33, 0x43, 0x33, 0x44, 0x36, 0x33, 0x45, 0x32, 0x33, 0x33, 0x44,
+ 0x33, 0x34, 0x42, 0x31,
+ 0x31, 0x52, 0x22, 0x43, 0x22, 0x31, 0x42, 0x34, 0x34, 0x35, 0x42, 0x32,
+ 0x42, 0x34, 0x34, 0x43,
+ 0x22, 0x32, 0x41, 0x32, 0x30, 0x51, 0x21, 0x32, 0x42, 0x31, 0x40, 0x30,
+ 0x3e, 0x4a, 0x3d, 0x3c,
+ 0x5e, 0x20, 0x3f, 0x3c, 0x3c, 0x3d, 0x4c, 0x2d, 0x3e, 0x3d, 0x39, 0x3d,
+ 0x3d, 0x3d, 0x2c, 0x3d,
+ 0x2b, 0x1d, 0x1c, 0x2d, 0x3e, 0x4e, 0x4d, 0x4c, 0x3d, 0x5e, 0x2f, 0x4d,
+ 0x2e, 0x3e, 0x4f, 0x2d,
+ 0x2c, 0x3f, 0x2e, 0x2d, 0x2f, 0x43, 0x24, 0x31, 0x20, 0x3f, 0x3c, 0x3a,
+ 0x5b, 0x2b, 0x1d, 0x2b,
+ 0x1c, 0x0d, 0x0e, 0xec, 0xbd, 0xcd, 0xdd, 0xcd, 0xdd, 0xcc, 0xbd, 0xee,
+ 0xdd, 0xdd, 0xcc, 0xce,
+ 0xdd, 0xdd, 0xdb, 0xbd, 0xdc, 0xce, 0xdd, 0xcd, 0xdc, 0xcd, 0xde, 0xcd,
+ 0xdd, 0xce, 0xde, 0xef,
+ 0xde, 0xdb, 0xdd, 0xdc, 0xed, 0xed, 0xec, 0xdc, 0xcc, 0xcc, 0xdc, 0xce,
+ 0xdd, 0xbe, 0xed, 0xcd,
+ 0xde, 0xdf, 0xcf, 0xd0, 0xcf, 0xde, 0xee, 0xd0, 0xef, 0xdd, 0xdb, 0xca,
+ 0xff, 0x00, 0xcd, 0xee,
+ 0x02, 0x02, 0xd1, 0xd1, 0xd3, 0xd5, 0xa1, 0xc1, 0xc0, 0xdf, 0xd4, 0xc3,
+ 0xcf, 0xde, 0xd0, 0xd7,
+ 0xc4, 0xe4, 0xd3, 0xc3, 0xd4, 0xe4, 0xc4, 0xc2, 0xd2, 0xb1, 0xe2, 0xd2,
+ 0xc1, 0xd3, 0xd3, 0xc0,
+ 0xe3, 0xd5, 0xe2, 0xe5, 0xd2, 0xe2, 0xd0, 0xd0, 0xd1, 0xd5, 0xc2, 0xc0,
+ 0xce, 0xde, 0xe0, 0xdf,
+ 0xbc, 0xdc, 0xec, 0xdd, 0xdd, 0xcc, 0xdd, 0xdd, 0xdb, 0xdd, 0xce, 0xde,
+ 0xac, 0xed, 0xde, 0xbc,
+ 0xee, 0xee, 0xcc, 0xdd, 0xcc, 0xde, 0xde, 0xce, 0xce, 0xde, 0xd0, 0xc0,
+ 0xde, 0xde, 0xde, 0xdb,
+ 0xca, 0xdd, 0xde, 0xd0, 0xc0, 0xd0, 0xdf, 0xc0, 0xd0, 0xd1, 0xc2, 0xd1,
+ 0xd0, 0xcd, 0xc9, 0xd0,
+ 0xb0, 0xde, 0xde, 0xdf, 0xc1, 0xd0, 0xc0, 0xe2, 0xd0, 0xd2, 0xd7, 0xe7,
+ 0xd2, 0xc0, 0xd0, 0xc0,
+ 0xef, 0xd0, 0xcf, 0xcc, 0xcd, 0xef, 0xc3, 0xe7, 0xd4, 0xd2, 0xd2, 0xd4,
+ 0xe5, 0xe4, 0xe2, 0xe1,
+ 0xe0, 0x01, 0x11, 0x00, 0xf0, 0xef, 0xdf, 0xb0, 0xd3, 0xf7, 0xe3, 0xb2,
+ 0xd4, 0xf6, 0x03, 0x04,
+ 0xf2, 0x14, 0x73, 0x34, 0x42, 0x33, 0x33, 0x43, 0x23, 0x23, 0x35, 0x43,
+ 0x23, 0x14, 0x23, 0x34,
+ 0x65, 0x33, 0x54, 0x33, 0x33, 0x53, 0x34, 0x43, 0x33, 0x53, 0x33, 0x42,
+ 0x31, 0x42, 0x42, 0x33,
+ 0x43, 0x44, 0x33, 0x34, 0x44, 0x32, 0x33, 0x43, 0x33, 0x32, 0x33, 0x44,
+ 0x21, 0x2f, 0x30, 0x44,
+ 0x1f, 0x2e, 0x21, 0x31, 0x2e, 0x2c, 0x2e, 0x3f, 0x3d, 0x3a, 0x4d, 0x4d,
+ 0x4d, 0x2a, 0x2d, 0x3d,
+ 0x3d, 0x3c, 0x4d, 0x3f, 0x4e, 0x3f, 0x4f, 0x3e, 0x5f, 0x2c, 0x3c, 0x4d,
+ 0x39, 0x3c, 0x3d, 0x5d,
+ 0x2c, 0x1b, 0x2d, 0x1c, 0x2d, 0x2e, 0x1e, 0x2e, 0x1f, 0x20, 0x20, 0x42,
+ 0x42, 0x32, 0x21, 0x51,
+ 0x33, 0x33, 0x31, 0x3f, 0x3e, 0x4f, 0x20, 0x30, 0x20, 0x22, 0x27, 0x46,
+ 0x43, 0x35, 0x53, 0x33,
+ 0x34, 0x53, 0x43, 0x31, 0x41, 0x30, 0x30, 0x40, 0x40, 0x30, 0x3e, 0x3a,
+ 0x3e, 0x40, 0x34, 0x43,
+ 0x21, 0x30, 0x30, 0x41, 0x42, 0x31, 0x31, 0x41, 0x41, 0x21, 0x32, 0x32,
+ 0x3f, 0x39, 0x2d, 0x3e,
+ 0x3f, 0x2b, 0x1c, 0x1d, 0x3e, 0x4e, 0x60, 0x20, 0x30, 0x4e, 0x4f, 0x30,
+ 0x4e, 0x48, 0x2c, 0x3c,
+ 0x4c, 0x2d, 0x3d, 0x40, 0x3e, 0x2c, 0x1c, 0x2d, 0x1d, 0x1d, 0x3e, 0x2d,
+ 0x1b, 0x2d, 0x4d, 0x3d,
+ 0x5c, 0x2d, 0x30, 0x43, 0x34, 0x23, 0x31, 0x41, 0x2e, 0x2a, 0x1c, 0x2d,
+ 0x2a, 0x2c, 0x2c, 0x4c,
+ 0x5d, 0x2c, 0x1d, 0x1c, 0xfd, 0xdc, 0xdd, 0xae, 0xcd, 0xcc, 0xcd, 0xed,
+ 0xed, 0xcb, 0xde, 0xcd,
+ 0xed, 0xdc, 0xce, 0xce, 0xde, 0xce, 0xcd, 0xde, 0xcf, 0xd0, 0xc0, 0xd0,
+ 0xc2, 0xd1, 0xc1, 0xc2,
+ 0xd4, 0xd2, 0xc1, 0xd0, 0xde, 0xdc, 0xcd, 0xde, 0xc1, 0xe5, 0xd3, 0xc3,
+ 0xd4, 0xd3, 0xb0, 0xd0,
+ 0xdf, 0xcd, 0xdc, 0xcc, 0xcc, 0xdb, 0xdd, 0xdb, 0xce, 0xdd, 0xcc, 0xed,
+ 0xdd, 0xdc, 0xdd, 0xcb,
+ 0xde, 0xde, 0xce, 0xdc, 0xcd, 0xde, 0xce, 0xdc, 0xde, 0xdf, 0xc0, 0xdd,
+ 0xde, 0xd0, 0xd1, 0xd3,
+ 0xd2, 0xc3, 0xe4, 0xc0, 0xe0, 0xdf, 0xce, 0xdb, 0xdb, 0xed, 0xff, 0xf1,
+ 0xf2, 0x05, 0x15, 0x33,
+ 0x33, 0x77, 0x54, 0x12, 0x22, 0x33, 0x45, 0x22, 0x12, 0x22, 0x12, 0x14,
+ 0x13, 0x03, 0x03, 0x06,
+ 0x12, 0x03, 0x04, 0x64, 0x24, 0x22, 0x33, 0x43, 0x43, 0x43, 0x33, 0x22,
+ 0x33, 0x41, 0x20, 0x50,
+ 0x42, 0x31, 0x31, 0x41, 0x44, 0x35, 0x33, 0x44, 0x22, 0x32, 0x22, 0x00,
+ 0x00, 0x00, 0xf0, 0xdf,
+ 0xcc, 0xcc, 0xee, 0xf0, 0xf0, 0xee, 0xfd, 0x12, 0x04, 0x01, 0x04, 0x47,
+ 0x33, 0x02, 0x03, 0x05,
+ 0xe2, 0xe2, 0x81, 0xe2, 0xe3, 0xd3, 0xa1, 0xe0, 0xf0, 0xf0, 0x0f, 0x0d,
+ 0x4d, 0x3a, 0x3c, 0x4d,
+ 0x3d, 0x2b, 0xfa, 0xfd, 0xec, 0x8d, 0xec, 0xcd, 0xdc, 0xcd, 0xcd, 0xee,
+ 0xdd, 0xee, 0xdf, 0xdd,
+ 0xdd, 0xfe, 0xfe, 0xcc, 0xcc, 0xcd, 0xcc, 0xce, 0xdf, 0xb0, 0xd0, 0xd0,
+ 0xc1, 0xe4, 0xc1, 0xe2,
+ 0xe2, 0xe2, 0xd2, 0xe0, 0xd1, 0xe0, 0xce, 0xc9, 0xcd, 0xee, 0xed, 0xd9,
+ 0xdd, 0xdd, 0xdd, 0xee,
+ 0xdf, 0xbd, 0xdb, 0xdd, 0xed, 0xe0, 0xef, 0xcd, 0xbc, 0xcd, 0xdd, 0xdd,
+ 0xce, 0xce, 0xdc, 0xcb,
+ 0xdd, 0xcf, 0xd2, 0xd2, 0xc0, 0xef, 0xd0, 0xd1, 0xc0, 0xe3, 0xc7, 0xd3,
+ 0xd4, 0xc5, 0xc3, 0xd4,
+ 0xc2, 0xd2, 0xc3, 0xd6, 0xc1, 0xd1, 0xc1, 0xe2, 0xf3, 0xd1, 0xe0, 0xf4,
+ 0xf4, 0xe2, 0xf4, 0xf4,
+ 0xf4, 0xe4, 0xf4, 0x03, 0xf3, 0x03, 0x04, 0xd3, 0x03, 0x76, 0x41, 0x00,
+ 0x62, 0x22, 0x31, 0x30,
+ 0x21, 0x41, 0x30, 0x3f, 0x30, 0x40, 0x2e, 0x1b, 0x0c, 0xfc, 0xfc, 0xfd,
+ 0x0d, 0x0d, 0x0b, 0x1d,
+ 0x6e, 0x2d, 0x1c, 0x2e, 0x3e, 0x2d, 0x1c, 0x1e, 0x0e, 0x0d, 0xcd, 0xed,
+ 0xcd, 0xcd, 0xdb, 0xee,
+ 0x0e, 0x0f, 0x3f, 0x20, 0x40, 0x52, 0x11, 0x22, 0x44, 0x01, 0x03, 0xe5,
+ 0xd4, 0xb6, 0xb3, 0xc3,
+ 0xe6, 0xd2, 0xb2, 0xf3, 0xe3, 0xd2, 0x02, 0x02, 0x31, 0x72, 0x34, 0x33,
+ 0x42, 0x33, 0x44, 0x44,
+ 0x34, 0x43, 0x33, 0x23, 0x34, 0x55, 0x33, 0x23, 0x22, 0x42, 0x34, 0x54,
+ 0x23, 0x42, 0x33, 0x32,
+ 0x53, 0x34, 0x33, 0x32, 0x43, 0x45, 0x33, 0x45, 0x32, 0x33, 0x43, 0x33,
+ 0x32, 0x34, 0x54, 0x22,
+ 0x31, 0x31, 0x43, 0x44, 0x31, 0x30, 0x41, 0x41, 0x33, 0x56, 0x23, 0x35,
+ 0x42, 0x22, 0x44, 0x23,
+ 0x33, 0x23, 0x32, 0x33, 0x44, 0x32, 0x32, 0x42, 0x32, 0x41, 0x32, 0x54,
+ 0x21, 0x30, 0x40, 0x30,
+ 0x32, 0x41, 0x43, 0x20, 0x30, 0x4e, 0x3e, 0x42, 0x23, 0x3c, 0x39, 0x3d,
+ 0x4b, 0x2d, 0x3c, 0x2e,
+ 0x3d, 0x38, 0x2d, 0x2c, 0x4d, 0x2d, 0x3b, 0x3e, 0x4d, 0x3e, 0x3d, 0x3d,
+ 0x4e, 0x40, 0x2f, 0x30,
+ 0x41, 0x22, 0x31, 0x32, 0x35, 0x52, 0x10, 0x2e, 0x30, 0x40, 0x31, 0x52,
+ 0x20, 0x47, 0x10, 0x08,
+ 0xe9, 0x40, 0x61, 0x00, 0xfe, 0x0d, 0x0f, 0x0f, 0x0e, 0xfc, 0xdc, 0xee,
+ 0xed, 0x0e, 0x1f, 0x0e,
+ 0xcb, 0xcc, 0xfe, 0x0f, 0x20, 0x31, 0xae, 0x99, 0xed, 0x00, 0x24, 0x12,
+ 0xce, 0xaa, 0xee, 0xf0,
+ 0xef, 0xef, 0x12, 0x13, 0xef, 0xcc, 0xde, 0xee, 0x11, 0x66, 0x00, 0xef,
+ 0xdd, 0xdd, 0x00, 0x00,
+ 0x89, 0xee, 0x00, 0x01, 0x23, 0x02, 0x00, 0x12, 0x00, 0xaa, 0xdc, 0x0f,
+ 0x12, 0x33, 0x01, 0xff,
+ 0xaa, 0xcc, 0xdd, 0x21, 0x67, 0x01, 0x00, 0xff, 0xef, 0xff, 0x00, 0x01,
+ 0x11, 0x00, 0xe0, 0xe0,
+ 0x00, 0x12, 0x12, 0xdf, 0x8a, 0xbb, 0x00, 0x46, 0x22, 0xef, 0xee, 0x00,
+ 0xf0, 0xf0, 0x00, 0x00,
+ 0xd0, 0xf0, 0x23, 0x12, 0xcf, 0xcd, 0xf0, 0x01, 0xe0, 0x01, 0xf1, 0xd0,
+ 0xef, 0xf0, 0x13, 0xdf,
+ 0x88, 0xdd, 0x12, 0x77, 0x13, 0xf0, 0xdc, 0xee, 0x00, 0x00, 0xef, 0xbc,
+ 0x10, 0x46, 0x11, 0xef,
+ 0xde, 0xff, 0x00, 0x10, 0xf0, 0xde, 0x00, 0xe0, 0xe0, 0x22, 0x44, 0xd0,
+ 0x89, 0xef, 0x12, 0x33,
+ 0xce, 0xdc, 0x00, 0x00, 0x00, 0x22, 0xf0, 0xbc, 0xfe, 0xf0, 0x03, 0x14,
+ 0x01, 0xf1, 0xae, 0xdb,
+ 0x03, 0x02, 0xde, 0x01, 0x03, 0xe0, 0xbc, 0xb8, 0xef, 0x43, 0x35, 0x00,
+ 0xef, 0xde, 0xce, 0x00,
+ 0x22, 0xdf, 0xe0, 0x12, 0xd0, 0x00, 0x46, 0x01, 0xc0, 0xad, 0xca, 0x11,
+ 0x44, 0x00, 0xef, 0x11,
+ 0x12, 0xff, 0xbc, 0xfe, 0x01, 0x23, 0x00, 0xde, 0xf0, 0x01, 0x24, 0x23,
+ 0xbd, 0x98, 0xfd, 0x12,
+ 0x34, 0xf0, 0xdd, 0x11, 0x11, 0x00, 0x01, 0x01, 0x00, 0x00, 0x12, 0x67,
+ 0xf0, 0xef, 0x23, 0x00,
+ 0xd0, 0x33, 0x02, 0xbf, 0x57, 0x34, 0xe0, 0xef, 0xcd, 0xee, 0x66, 0x12,
+ 0x00, 0x23, 0x00, 0xfe,
+ 0x10, 0x43, 0xee, 0x0e, 0x56, 0x11, 0x10, 0x32, 0x11, 0x0f, 0x0f, 0xdc,
+ 0x41, 0x77, 0x11, 0x0f,
+ 0x0f, 0x11, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x51, 0x34, 0x0f, 0xb8, 0x0f,
+ 0x74, 0x11, 0xed, 0xfe,
+ 0x11, 0x01, 0x00, 0x00, 0x12, 0x12, 0x0f, 0xc9, 0x00, 0x31, 0x21, 0xee,
+ 0x31, 0x64, 0xff, 0xfc,
+ 0x00, 0x43, 0x00, 0x0e, 0x32, 0x21, 0xdc, 0xfd, 0x74, 0x00, 0x00, 0x00,
+ 0xa2, 0x08, 0xa8, 0x08,
+ 0x9d, 0x14, 0x0b, 0x0d, 0xe6, 0x1f, 0x0d, 0x19, 0x44, 0x33, 0xee, 0xdc,
+ 0x00, 0x22, 0x00, 0x00,
+ 0x00, 0xef, 0x43, 0x00, 0xde, 0x10, 0xf0, 0xbc, 0x12, 0x45, 0x00, 0xee,
+ 0xee, 0xef, 0x22, 0x45,
+ 0x00, 0xff, 0x00, 0xff, 0xf0, 0x00, 0xcd, 0x44, 0x54, 0xff, 0xdc, 0xef,
+ 0x00, 0x33, 0x76, 0x01,
+ 0xdc, 0xee, 0x22, 0x00, 0xe0, 0x01, 0x01, 0x22, 0x00, 0x88, 0xf0, 0x44,
+ 0xff, 0xdd, 0xff, 0x10,
+ 0x33, 0x00, 0xee, 0xde, 0x21, 0x11, 0xdd, 0x10, 0x77, 0x10, 0x00, 0x00,
+ 0xbb, 0xee, 0x32, 0x54,
+ 0xff, 0xed, 0x10, 0x21, 0x00, 0xdc, 0xef, 0x22, 0x65, 0xf0, 0xcb, 0xff,
+ 0x00, 0x54, 0x00, 0xed,
+ 0x00, 0x02, 0x0f, 0xff, 0x22, 0x23, 0xef, 0xbb, 0x00, 0x23, 0xf0, 0xcc,
+ 0x22, 0x45, 0xef, 0xee,
+ 0x21, 0x21, 0xde, 0x89, 0x00, 0x32, 0x01, 0xdc, 0x0f, 0x00, 0xff, 0x31,
+ 0x54, 0xee, 0xcb, 0x00,
+ 0x10, 0x21, 0xf0, 0xdd, 0x00, 0x21, 0xef, 0xff, 0x00, 0x32, 0xcd, 0xdd,
+ 0x00, 0xee, 0x44, 0x11,
+ 0x88, 0x00, 0x23, 0x0f, 0xdd, 0x01, 0xff, 0x88, 0x00, 0x23, 0x00, 0xff,
+ 0xf0, 0x22, 0x22, 0xbb,
+ 0xee, 0x00, 0x34, 0x32, 0xee, 0xdd, 0x00, 0x76, 0x00, 0xdc, 0x00, 0x11,
+ 0xf0, 0x10, 0xf0, 0xac,
+ 0xfe, 0x00, 0x46, 0x32, 0xee, 0xce, 0xff, 0x10, 0x22, 0x10, 0x22, 0x00,
+ 0xdc, 0xcd, 0x44, 0x54,
+ 0xfe, 0xdd, 0x00, 0xfe, 0x00, 0x56, 0x0f, 0xf0, 0x11, 0xdd, 0xee, 0x43,
+ 0x12, 0xed, 0x34, 0x33,
+ 0xed, 0x11, 0x65, 0x00, 0x11, 0x01, 0xfd, 0x13, 0x77, 0x23, 0x00, 0xff,
+ 0x00, 0x02, 0x45, 0x11,
+ 0xf0, 0xbd, 0x02, 0x57, 0x00, 0xde, 0x00, 0x12, 0xff, 0xff, 0x23, 0x32,
+ 0xfe, 0xdc, 0x00, 0x43,
+ 0x11, 0xdb, 0x31, 0x64, 0xdc, 0xac, 0x11, 0x77, 0x00, 0xee, 0xee, 0x11,
+ 0x23, 0xfe, 0xff, 0x12,
+ 0x10, 0x0f, 0xff, 0x0f, 0xff, 0xed, 0xee, 0x77, 0x13, 0xdc, 0xcd, 0x13,
+ 0x67, 0x00, 0xde, 0x00,
+ 0x12, 0x00, 0xe0, 0x00, 0xef, 0xdc, 0x65, 0x22, 0xcc, 0xfe, 0x23, 0x11,
+ 0xfe, 0x0f, 0x00, 0x00,
+ 0xdd, 0x00, 0x00, 0x21, 0x77, 0x00, 0xdd, 0x10, 0x11, 0xcb, 0x00, 0x54,
+ 0x00, 0xee, 0x0f, 0xff,
+ 0xff, 0x22, 0xed, 0xcb, 0x65, 0x22, 0xee, 0xcc, 0x00, 0x44, 0x00, 0xef,
+ 0x00, 0x22, 0xff, 0xef,
+ 0x11, 0x12, 0xdd, 0xdd, 0x22, 0x00, 0x00, 0x23, 0xee, 0xdc, 0x73, 0x77,
+ 0x00, 0xcb, 0x00, 0x00,
+ 0x12, 0x23, 0x00, 0xfd, 0x00, 0x35, 0x00, 0xab, 0x00, 0x22, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0xfe,
+ 0xfe, 0xef, 0x22, 0x34, 0x9a, 0xff, 0x22, 0x00, 0x12, 0x23, 0xde, 0xdd,
+ 0xee, 0xde, 0x01, 0x77,
+ 0x22, 0xcc, 0xee, 0x00, 0x33, 0x00, 0xcc, 0xff, 0x44, 0x10, 0xee, 0x0f,
+ 0xfe, 0xff, 0x77, 0x12,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xee, 0x0f, 0x10, 0xf0, 0x47, 0x75,
+ 0x00, 0xbc, 0x00, 0x42,
+ 0x23, 0xff, 0xed, 0x33, 0x21, 0xee, 0x21, 0x21, 0xfe, 0x0f, 0x00, 0xdb,
+ 0x8a, 0x00, 0x33, 0x11,
+ 0xff, 0xff, 0x11, 0x00, 0x88, 0xee, 0x11, 0x45, 0x10, 0xef, 0x0f, 0xff,
+ 0xf0, 0x10, 0x32, 0x00,
+ 0xe0, 0xee, 0xde, 0x53, 0x24, 0xcd, 0xdc, 0x22, 0x56, 0x00, 0xef, 0xdf,
+ 0x21, 0x44, 0xcd, 0xee,
+ 0x12, 0xf0, 0x00, 0x77, 0x00, 0x0f, 0x00, 0xfe, 0x0f, 0x23, 0x32, 0xed,
+ 0xbb, 0x00, 0x22, 0x33,
+ 0x10, 0xdd, 0xa9, 0x00, 0x32, 0x11, 0x00, 0x54, 0x00, 0xdc, 0x00, 0x33,
+ 0x21, 0xbc, 0x00, 0x11,
+ 0xfe, 0x00, 0x47, 0x11, 0xde, 0x00, 0x53, 0x00, 0xcc, 0x00, 0x24, 0x22,
+ 0xee, 0x00, 0x00, 0xee,
+ 0xde, 0x21, 0x22, 0x33, 0x42, 0xdb, 0x00, 0x62, 0xff, 0x00, 0x67, 0x12,
+ 0x00, 0xff, 0x00, 0x11,
+ 0xee, 0xf0, 0x57, 0xf0, 0xae, 0x00, 0x35, 0x01, 0x00, 0x00, 0x0f, 0xef,
+ 0x0e, 0x43, 0x22, 0xdb,
+ 0x11, 0x76, 0x00, 0xee, 0x00, 0x33, 0x00, 0xef, 0xee, 0x00, 0x00, 0xee,
+ 0xff, 0x33, 0x32, 0xdc,
+ 0xff, 0x74, 0x0f, 0x00, 0x22, 0x98, 0xdc, 0x01, 0x54, 0x00, 0xde, 0xff,
+ 0x00, 0x00, 0xdf, 0x00,
+ 0x23, 0x00, 0x88, 0x00, 0x34, 0x00, 0xcd, 0x00, 0x66, 0x11, 0xee, 0xee,
+ 0x00, 0x11, 0x11, 0x01,
+ 0xfe, 0xdd, 0x00, 0xff, 0xff, 0x34, 0x10, 0xbd, 0xdc, 0x00, 0x10, 0x0e,
+ 0xee, 0x00, 0x65, 0xfe,
+ 0xaa, 0x11, 0x34, 0x00, 0xba, 0xf0, 0x20, 0x22, 0x00, 0xef, 0xee, 0x00,
+ 0x21, 0x32, 0xde, 0xf0,
+ 0x00, 0xcd, 0x00, 0x00, 0x00, 0xdd, 0xba, 0x21, 0x76, 0x11, 0xff, 0xdc,
+ 0xef, 0x31, 0x21, 0x00,
+ 0x00, 0xde, 0xff, 0x42, 0x43, 0x00, 0xcb, 0xff, 0xff, 0x10, 0x21, 0xed,
+ 0x88, 0x00, 0x77, 0x00,
+ 0xee, 0xdd, 0x11, 0x33, 0x00, 0x00, 0x00, 0xcc, 0xed, 0x34, 0x43, 0xef,
+ 0x0f, 0x12, 0x00, 0xcc,
+ 0x00, 0x34, 0x00, 0x00, 0xff, 0x00, 0x00, 0x12, 0xce, 0xee, 0x77, 0x21,
+ 0xcd, 0xec, 0x12, 0x22,
+ 0xff, 0x00, 0x12, 0x0f, 0xbc, 0xfe, 0x25, 0x10, 0xcd, 0xff, 0x12, 0x10,
+ 0x44, 0x11, 0xed, 0xef,
+ 0x0f, 0x54, 0x21, 0xba, 0x00, 0x32, 0x00, 0x00, 0x33, 0x0f, 0xa9, 0xff,
+ 0x32, 0x11, 0x00, 0x00,
+ 0x00, 0x22, 0x33, 0x44, 0xcc, 0x88, 0xef, 0x11, 0x32, 0x22, 0x00, 0xee,
+ 0xbc, 0xff, 0x10, 0x21,
+ 0x01, 0x21, 0x11, 0xf0, 0xcc, 0xed, 0x01, 0x34, 0x12, 0xac, 0xfe, 0x13,
+ 0x11, 0xee, 0x23, 0x23,
+ 0xec, 0xdd, 0xed, 0x23, 0x66, 0x00, 0x00, 0x00, 0xfe, 0xee, 0x00, 0x67,
+ 0x22, 0xee, 0xef, 0x00,
+ 0x00, 0xe0, 0x21, 0x33, 0x89, 0xff, 0x33, 0x12, 0xed, 0x01, 0x13, 0xee,
+ 0xbb, 0x00, 0x23, 0x12,
+ 0x22, 0x55, 0xff, 0x88, 0x00, 0x00, 0x11, 0x22, 0x00, 0xff, 0xef, 0x00,
+ 0x00, 0x11, 0x55, 0x11,
+ 0xff, 0xfe, 0x00, 0x10, 0x10, 0x00, 0x33, 0x55, 0x21, 0xdd, 0x88, 0x00,
+ 0x33, 0x12, 0x11, 0x00,
+ 0xcd, 0xee, 0xf0, 0x23, 0x57, 0x00, 0xee, 0xf0, 0x32, 0x12, 0xdd, 0xdd,
+ 0x10, 0x65, 0x11, 0x00,
+ 0x00, 0x23, 0x55, 0x00, 0xff, 0xee, 0x00, 0x34, 0x00, 0x0f, 0x10, 0x10,
+ 0x42, 0x11, 0x10, 0x32,
+ 0x00, 0x0d, 0x34, 0x42, 0xda, 0xbd, 0x44, 0x56, 0xef, 0xdd, 0x00, 0x21,
+ 0x22, 0xef, 0x8c, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0x01, 0x0f, 0xef, 0xee, 0x01, 0x0f, 0xeb, 0x66,
+ 0x23, 0xed, 0xee, 0x00,
+ 0x00, 0x43, 0x01, 0xfe, 0xff, 0x0f, 0xeb, 0x22, 0x66, 0xf0, 0xff, 0xff,
+ 0x11, 0x33, 0xbd, 0xfd,
+ 0x00, 0xfc, 0xef, 0x43, 0x23, 0x00, 0x10, 0xec, 0xfe, 0x00, 0xcc, 0xa9,
+ 0x11, 0x44, 0x00, 0xde,
+ 0xec, 0xef, 0x21, 0x33, 0x00, 0xfe, 0xed, 0xdd, 0x75, 0x33, 0xca, 0xcd,
+ 0x12, 0x54, 0xfe, 0xfe,
+ 0x01, 0x22, 0x45, 0x00, 0xaa, 0x00, 0x11, 0x22, 0x31, 0x01, 0xef, 0xdd,
+ 0xf0, 0x01, 0x00, 0xbd,
+ 0x12, 0x35, 0xdd, 0xcd, 0x01, 0x11, 0xdc, 0xff, 0x67, 0x22, 0xff, 0xef,
+ 0x00, 0x00, 0x00, 0xef,
+ 0x00, 0x33, 0xce, 0xef, 0x21, 0x10, 0xfd, 0xfd, 0x32, 0x54, 0xdb, 0x89,
+ 0xf0, 0x43, 0x22, 0xdd,
+ 0xcc, 0x12, 0x21, 0xee, 0xff, 0x34, 0x00, 0xe0, 0xf0, 0xf0, 0x54, 0x34,
+ 0xcc, 0xcd, 0x00, 0x12,
+ 0xff, 0x00, 0x23, 0xfe, 0x12, 0x57, 0xde, 0x9a, 0x00, 0x42, 0x00, 0xdd,
+ 0x00, 0x11, 0x00, 0xec,
+ 0x00, 0x33, 0x00, 0xbd, 0xfe, 0x35, 0x00, 0xcc, 0x01, 0x54, 0xff, 0xed,
+ 0x0e, 0x33, 0x77, 0x00,
+ 0xdc, 0xee, 0x11, 0x22, 0x0f, 0xf0, 0x00, 0xde, 0xee, 0x00, 0x01, 0x00,
+ 0xcd, 0xbb, 0x02, 0x13,
+ 0x20, 0x23, 0xec, 0x99, 0x00, 0x11, 0x22, 0x21, 0x00, 0xee, 0xfe, 0x00,
+ 0xcc, 0x00, 0x42, 0xee,
+ 0x22, 0x67, 0xee, 0xcb, 0xef, 0x21, 0x21, 0x00, 0x00, 0x00, 0xee, 0xff,
+ 0x00, 0x00, 0x63, 0x00,
+ 0xdc, 0xba, 0x11, 0x67, 0xef, 0xdd, 0x10, 0x33, 0x00, 0x0f, 0xee, 0x00,
+ 0x22, 0x22, 0xbd, 0xda,
+ 0x00, 0x74, 0x34, 0xff, 0xed, 0x00, 0x00, 0xdc, 0x32, 0x75, 0x00, 0x00,
+ 0x00, 0xff, 0x01, 0x34,
+ 0x01, 0xe0, 0xf0, 0x00, 0x22, 0x55, 0x11, 0xf0, 0x0f, 0xf0, 0x00, 0x44,
+ 0x0f, 0xcd, 0x12, 0x33,
+ 0x00, 0xdf, 0xf0, 0xde, 0xdf, 0x77, 0x45, 0x00, 0xbc, 0xfe, 0x11, 0x22,
+ 0x10, 0x33, 0x00, 0xec,
+ 0x0f, 0x1f, 0x0f, 0x0e, 0x42, 0x22, 0xfe, 0xb9, 0x10, 0x54, 0xee, 0xbc,
+ 0x00, 0x34, 0x11, 0xff,
+ 0xee, 0xef, 0x11, 0x34, 0xde, 0x00, 0x36, 0x00, 0xd0, 0x00, 0xe0, 0x8c,
+ 0xf0, 0x33, 0x00, 0xee,
+ 0x00, 0xde, 0x12, 0x76, 0xee, 0xdc, 0x32, 0x12, 0xde, 0xee, 0xee, 0x12,
+ 0x64, 0x0f, 0xff, 0xff,
+ 0x0f, 0xdb, 0xdd, 0x32, 0x63, 0x00, 0x0f, 0xca, 0xff, 0x00, 0x33, 0x56,
+ 0xf0, 0xac, 0xff, 0x00,
+ 0x00, 0x0f, 0x12, 0x00, 0x0f, 0x12, 0xee, 0xcb, 0x00, 0x22, 0x22, 0x11,
+ 0xff, 0xac, 0xff, 0x24,
+ 0x56, 0x00, 0xff, 0xdf, 0xef, 0x00, 0x21, 0x23, 0xff, 0xaa, 0x00, 0x00,
+ 0x55, 0x21, 0xff, 0xcd,
+ 0xfe, 0x00, 0x00, 0x66, 0x23, 0xfe, 0xee, 0x01, 0x23, 0xf0, 0xca, 0x00,
+ 0x44, 0x00, 0xff, 0xdf,
+ 0xfe, 0xe0, 0x21, 0x33, 0xef, 0xcc, 0x00, 0x01, 0x00, 0x42, 0x44, 0x00,
+ 0xef, 0xdd, 0xb8, 0x10,
+ 0x74, 0x00, 0xf0, 0x10, 0x00, 0xdc, 0x00, 0x43, 0x00, 0x00, 0x24, 0x00,
+ 0x0f, 0xde, 0xdd, 0x00,
+ 0x77, 0x54, 0xff, 0x0f, 0xfe, 0x00, 0x43, 0x00, 0x01, 0x11, 0xfc, 0xec,
+ 0x10, 0x54, 0x10, 0xee,
+ 0xee, 0x00, 0x11, 0xef, 0xba, 0x21, 0x23, 0xcc, 0x00, 0x65, 0x0f, 0xed,
+ 0x00, 0x32, 0x12, 0x0f,
+ 0xfd, 0xca, 0x10, 0x74, 0x00, 0xdd, 0xff, 0x23, 0x12, 0xee, 0xde, 0xf0,
+ 0x10, 0x65, 0x02, 0x00,
+ 0x00, 0x13, 0x0f, 0xb8, 0x00, 0x43, 0x12, 0xff, 0x00, 0x00, 0xce, 0x00,
+ 0x00, 0x0f, 0x25, 0x33,
+ 0xfe, 0xde, 0xff, 0xdc, 0xab, 0x43, 0x44, 0xff, 0xfe, 0x00, 0xfe, 0x00,
+ 0x00, 0xec, 0x32, 0x77,
+ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x22, 0x34, 0x10, 0xf0, 0xce, 0xef,
+ 0x33, 0x12, 0xf0, 0xbe,
+ 0xcb, 0x22, 0x22, 0xec, 0x00, 0x0f, 0xcc, 0x65, 0x33, 0xfe, 0xed, 0x00,
+ 0x01, 0x25, 0x22, 0x00,
+ 0x00, 0xd0, 0xce, 0xf0, 0x66, 0x22, 0x00, 0xf0, 0xdd, 0xcd, 0xff, 0x66,
+ 0x44, 0x0f, 0xde, 0x00,
+ 0x11, 0x11, 0x43, 0x02, 0xcb, 0x12, 0x55, 0xff, 0xdd, 0x23, 0x44, 0x00,
+ 0x12, 0x11, 0xee, 0xdd,
+ 0xed, 0x75, 0x34, 0xdd, 0xdb, 0x11, 0x53, 0xee, 0xdd, 0x22, 0x00, 0xde,
+ 0x10, 0x00, 0xf0, 0x25,
+ 0xe0, 0x8a, 0xf0, 0x22, 0x00, 0xef, 0x00, 0x01, 0x01, 0xf0, 0x00, 0x43,
+ 0x23, 0x00, 0xee, 0x57,
+ 0x33, 0xbc, 0xdd, 0x00, 0x00, 0x00, 0x12, 0xe0, 0xdc, 0xef, 0xf0, 0x11,
+ 0xde, 0x88, 0xfe, 0x11,
+ 0x32, 0x00, 0x00, 0x0f, 0xab, 0xdc, 0x10, 0x43, 0xfe, 0xee, 0xfe, 0xff,
+ 0x44, 0xed, 0x98, 0x00,
+ 0x32, 0x11, 0xf0, 0xff, 0xee, 0xed, 0x10, 0x54, 0xff, 0xdb, 0x00, 0x00,
+ 0xe0, 0x00, 0x20, 0x00,
+ 0x10, 0xdf, 0xdf, 0x32, 0x31, 0xcc, 0x0f, 0x61, 0x00, 0xdb, 0xf0, 0x22,
+ 0xfd, 0xdc, 0x41, 0x44,
+ 0xce, 0xeb, 0x20, 0xf0, 0xad, 0x22, 0x33, 0xeb, 0xde, 0x53, 0xff, 0xb8,
+ 0x11, 0x11, 0x01, 0x12,
+ 0x11, 0x10, 0x00, 0xef, 0xee, 0x43, 0x77, 0x00, 0xee, 0xdd, 0xee, 0x11,
+ 0x44, 0x22, 0x33, 0xef,
+ 0x9b, 0xff, 0x00, 0xff, 0x00, 0x23, 0x12, 0x00, 0xdf, 0xa8, 0x0f, 0x12,
+ 0x22, 0x00, 0x00, 0x0f,
+ 0xfe, 0x00, 0x44, 0x0f, 0xbb, 0x00, 0x10, 0x20, 0x22, 0x00, 0xdc, 0x20,
+ 0x75, 0x0f, 0xfe, 0x00,
+ 0xff, 0xf0, 0x46, 0x42, 0x00, 0xcd, 0xdc, 0x00, 0x21, 0x11, 0x01, 0xde,
+ 0xdd, 0x21, 0x62, 0xfb,
+ 0xcc, 0x11, 0x23, 0x0e, 0x00, 0x01, 0xee, 0xee, 0xf0, 0x00, 0x12, 0x11,
+ 0x43, 0x20, 0xde, 0x88,
+ 0xef, 0x24, 0x1f, 0x20, 0x67, 0x02, 0xef, 0xdd, 0xdc, 0x00, 0x76, 0x10,
+ 0xef, 0x00, 0xe0, 0x0f,
+ 0x00, 0x00, 0xee, 0x21, 0x65, 0x00, 0xbd, 0xfe, 0x00, 0x22, 0x12, 0x00,
+ 0x00, 0x00, 0xed, 0x00,
+ 0x16, 0x00, 0xdf, 0x00, 0x33, 0xe0, 0x9e, 0xdc, 0x14, 0x33, 0xcc, 0xcc,
+ 0x23, 0x56, 0xff, 0xff,
+ 0x00, 0x00, 0x11, 0x76, 0x00, 0x0f, 0x0f, 0x00, 0x34, 0x32, 0xcd, 0xdb,
+ 0x11, 0x65, 0x00, 0x00,
+ 0xf0, 0xde, 0x23, 0x23, 0xde, 0x01, 0x00, 0xee, 0x76, 0x00, 0xee, 0x22,
+ 0x32, 0xee, 0xff, 0x34,
+ 0x10, 0x00, 0x00, 0x21, 0x76, 0x11, 0xee, 0xff, 0x21, 0x65, 0x23, 0x10,
+ 0xed, 0xfe, 0x55, 0x22,
+ 0x0f, 0x00, 0x00, 0x20, 0x32, 0x00, 0x20, 0x21, 0xfe, 0xc8, 0x00, 0x73,
+ 0x01, 0x0f, 0x00, 0xff,
+ 0xcc, 0xef, 0x24, 0x44, 0xe0, 0xbd, 0x00, 0x24, 0x0f, 0xee, 0x00, 0x00,
+ 0x33, 0x57, 0x00, 0xed,
+ 0x00, 0x01, 0x01, 0xcd, 0xde, 0x22, 0x67, 0x12, 0xee, 0xab, 0x00, 0x34,
+ 0xff, 0xff, 0x32, 0x00,
+ 0x00, 0x00, 0xed, 0x0f, 0x77, 0x10, 0xef, 0xee, 0x01, 0x00, 0xcd, 0xfe,
+ 0x33, 0x00, 0x0f, 0x24,
+ 0xff, 0x88, 0xef, 0x11, 0x42, 0x00, 0xfe, 0xef, 0x0f, 0x00, 0x10, 0x00,
+ 0xee, 0x20, 0x33, 0x0f,
+ 0x00, 0x00, 0x20, 0x77, 0x31, 0xdd, 0xfe, 0x11, 0x0e, 0x32, 0x77, 0x01,
+ 0xf0, 0xed, 0xed, 0xfe,
+ 0xee, 0x11, 0x56, 0x00, 0xef, 0xde, 0x0f, 0xdd, 0x00, 0x01, 0xab, 0x00,
+ 0x66, 0x00, 0xcc, 0x11,
+ 0x45, 0xf0, 0xee, 0xf0, 0xff, 0x22, 0x00, 0xee, 0xde, 0x11, 0x33, 0xf0,
+ 0xfd, 0x21, 0xfe, 0x88,
+ 0x00, 0x32, 0x00, 0xff, 0x00, 0xde, 0xde, 0x12, 0x34, 0x23, 0xcf, 0xac,
+ 0x00, 0xf0, 0xee, 0x24,
+ 0x24, 0xf0, 0x23, 0x0f, 0xdd, 0x31, 0xcc, 0x88, 0xf0, 0x54, 0x00, 0xde,
+ 0x0f, 0x10, 0xf0, 0xbc,
+ 0x01, 0x24, 0x00, 0xfe, 0x0f, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xdd, 0x0e,
+ 0x76, 0x42, 0xff, 0xed,
+ 0xfd, 0x00, 0x21, 0x22, 0x11, 0xed, 0xb8, 0x10, 0x33, 0xae, 0xdb, 0xee,
+ 0x00, 0x11, 0x22, 0x00,
+ 0xbf, 0x00, 0x01, 0xed, 0xb9, 0x00, 0x23, 0x10, 0x32, 0x00, 0xcb, 0xef,
+ 0xff, 0x0f, 0x30, 0x21,
+ 0xee, 0xde, 0xbe, 0xde, 0x12, 0x22, 0xea, 0x63, 0x47, 0xde, 0xab, 0x0f,
+ 0x32, 0x22, 0xff, 0xff,
+ 0x0f, 0xff, 0x21, 0x11, 0xee, 0xe0, 0x01, 0xf0, 0xad, 0x13, 0x57, 0x00,
+ 0xcc, 0x00, 0x23, 0xee,
+ 0x98, 0x21, 0x32, 0x00, 0x0e, 0xf0, 0xfe, 0x00, 0x11, 0x00, 0x10, 0x12,
+ 0x11, 0x00, 0xf1, 0xf0,
+ 0xee, 0x75, 0x56, 0x01, 0x00, 0x01, 0x00, 0x0d, 0x0f, 0x67, 0x13, 0xff,
+ 0x0f, 0x23, 0x23, 0xcd,
+ 0xee, 0x36, 0x21, 0xe0, 0xff, 0x33, 0x00, 0xbe, 0x33, 0x55, 0xff, 0xf0,
+ 0x11, 0x10, 0x0f, 0x0e,
+ 0xf0, 0x32, 0x43, 0x0f, 0x21, 0x20, 0xa8, 0xeb, 0x42, 0x64, 0xff, 0xfd,
+ 0x00, 0x12, 0x11, 0x00,
+ 0x0f, 0x00, 0x01, 0x13, 0x01, 0xa9, 0xfe, 0x32, 0x34, 0x01, 0xce, 0xcd,
+ 0x00, 0x22, 0x34, 0xef,
+ 0x9a, 0x00, 0x12, 0x13, 0x00, 0x00, 0xec, 0x00, 0x01, 0xdf, 0x00, 0x11,
+ 0x00, 0x10, 0xde, 0xaa,
+ 0x00, 0x10, 0x20, 0x77, 0x00, 0xab, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00,
+ 0x19, 0x02, 0xdf, 0x01,
+ 0x5a, 0x0a, 0x1f, 0xff, 0x02, 0x10, 0x1e, 0x04, 0xba, 0xff, 0x21, 0xee,
+ 0xee, 0x12, 0xcd, 0x0e,
+ 0x32, 0xef, 0xf0, 0x02, 0x45, 0x21, 0xdf, 0x88, 0xe0, 0x00, 0x00, 0x13,
+ 0x22, 0xce, 0xce, 0x01,
+ 0x20, 0xd9, 0xdf, 0x44, 0x33, 0xdf, 0xac, 0x10, 0x33, 0x00, 0xff, 0x00,
+ 0xef, 0xf0, 0xde, 0xdc,
+ 0x76, 0x31, 0x00, 0x21, 0x00, 0xce, 0xed, 0x44, 0x44, 0xe0, 0xcd, 0xf0,
+ 0x14, 0x22, 0xff, 0x00,
+ 0xff, 0xcd, 0xef, 0xf0, 0x00, 0x21, 0x34, 0xcb, 0xab, 0x11, 0x34, 0xff,
+ 0x0f, 0x10, 0xfc, 0x21,
+ 0x53, 0x99, 0xee, 0x33, 0x45, 0x00, 0xfe, 0xef, 0xee, 0x33, 0x31, 0xef,
+ 0xf0, 0xff, 0x21, 0x77,
+ 0x32, 0x0f, 0xed, 0xff, 0x10, 0x20, 0x32, 0x00, 0xfe, 0xef, 0xf0, 0x34,
+ 0x64, 0x01, 0xee, 0xde,
+ 0x00, 0x02, 0x12, 0x22, 0x0f, 0x0c, 0x75, 0x73, 0xfb, 0xed, 0x01, 0x0d,
+ 0xc8, 0x21, 0x53, 0xf0,
+ 0xed, 0x00, 0x11, 0x0f, 0x00, 0x11, 0xed, 0x0f, 0x22, 0x11, 0x00, 0xf0,
+ 0x02, 0xe0, 0xdc, 0x77,
+ 0x76, 0x00, 0xee, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x0f, 0x01, 0x02,
+ 0xab, 0xed, 0x14, 0x55,
+ 0x0f, 0xbc, 0x00, 0x24, 0x10, 0x00, 0x10, 0x0f, 0xfe, 0x0f, 0x10, 0x20,
+ 0x20, 0x31, 0x00, 0x0f,
+ 0x12, 0x13, 0xee, 0x01, 0x77, 0x34, 0x00, 0x11, 0xff, 0xef, 0x12, 0x33,
+ 0xfe, 0xdd, 0x9b, 0x00,
+ 0x56, 0x0f, 0xee, 0x00, 0x22, 0x01, 0xdc, 0xde, 0x75, 0x22, 0xee, 0xf0,
+ 0x00, 0x01, 0x02, 0x10,
+ 0x11, 0x11, 0x0f, 0xee, 0x00, 0x77, 0x34, 0xef, 0xdc, 0x00, 0x52, 0x13,
+ 0xf0, 0xdc, 0x00, 0x53,
+ 0x02, 0x00, 0xf0, 0xed, 0x35, 0x77, 0x00, 0xe0, 0x21, 0x01, 0xf0, 0x01,
+ 0x53, 0x00, 0x23, 0x23,
+ 0xec, 0x0d, 0x22, 0x22, 0x32, 0x0f, 0x88, 0xed, 0x11, 0x43, 0x00, 0xdd,
+ 0xde, 0x02, 0x02, 0xfe,
+ 0xba, 0xee, 0x23, 0x47, 0xf0, 0xdf, 0x20, 0x31, 0xdf, 0xdf, 0x11, 0x43,
+ 0x22, 0xff, 0xef, 0x00,
+ 0xf0, 0xad, 0x00, 0x67, 0x03, 0xde, 0x00, 0xd0, 0xa8, 0xff, 0x01, 0x02,
+ 0x00, 0x0f, 0xfe, 0xde,
+ 0x00, 0x03, 0x00, 0xda, 0xad, 0x20, 0x31, 0xee, 0x0f, 0x10, 0xfe, 0xfd,
+ 0xff, 0xdd, 0x88, 0xdc,
+ 0x10, 0x21, 0xdf, 0x00, 0x10, 0xff, 0xbd, 0xfe, 0x1f, 0xfa, 0xbd, 0x12,
+ 0x23, 0xed, 0x00, 0x21,
+ 0xcd, 0xbc, 0xf0, 0x26, 0x31, 0xdd, 0xee, 0xcc, 0xde, 0x75, 0x11, 0xec,
+ 0xff, 0x00, 0x0e, 0xfd,
+ 0x00, 0xe0, 0xdd, 0xfe, 0x31, 0x44, 0x00, 0xcc, 0xff, 0x21, 0x00, 0xdd,
+ 0xf0, 0xed, 0x00, 0x77,
+ 0x44, 0x00, 0xff, 0x00, 0x10, 0x00, 0xf4, 0x12, 0x00, 0x00, 0x2f, 0x72,
+ 0x37, 0xf0, 0xdf, 0xf0,
+ 0x00, 0xf0, 0x00, 0xa0, 0xcb, 0x12, 0x32, 0xd0, 0x04, 0x11, 0x99, 0xee,
+ 0x11, 0x43, 0x00, 0xee,
+ 0x0f, 0x1e, 0xc9, 0xf0, 0x73, 0x11, 0xfc, 0xee, 0x23, 0x11, 0x0f, 0x00,
+ 0x0f, 0x42, 0x57, 0x00,
+ 0xce, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0d, 0x0d, 0x20,
+ 0xfe, 0xff, 0x44, 0xd9,
+ 0xcd, 0x74, 0x10, 0xcb, 0x00, 0x34, 0xff, 0xde, 0x0f, 0xee, 0xf0, 0x75,
+ 0xf0, 0xcb, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x10, 0x11, 0xef, 0xe0, 0x01, 0x11,
+ 0x0e, 0xce, 0xcd, 0xa9,
+ 0x00, 0x24, 0xef, 0x00, 0x44, 0x00, 0xdc, 0xde, 0xde, 0x00, 0x62, 0x57,
+ 0x10, 0xee, 0xbd, 0x00,
+ 0x00, 0xff, 0xf0, 0x15, 0xf0, 0xdf, 0xe0, 0xdf, 0xf0, 0x26, 0xc0, 0xee,
+ 0x63, 0x11, 0x0f, 0x0f,
+ 0x0e, 0xfe, 0x24, 0x45, 0xdf, 0xff, 0x73, 0x22, 0x00, 0x00, 0xef, 0x02,
+ 0x37, 0x55, 0x00, 0x00,
+ 0xef, 0x00, 0x33, 0xf0, 0xe0, 0x55, 0x11, 0xe0, 0x02, 0x34, 0x10, 0x0e,
+ 0x10, 0x22, 0x54, 0x34,
+ 0xef, 0xbd, 0x54, 0x12, 0xef, 0x00, 0x16, 0x43, 0x00, 0xff, 0x10, 0x64,
+ 0x12, 0x10, 0x31, 0x53,
+ 0x23, 0x0e, 0x1e, 0x1f, 0x22, 0x57, 0x22, 0xfc, 0x00, 0x57, 0x00, 0xce,
+ 0x0f, 0x12, 0x22, 0x00,
+ 0x01, 0xf0, 0xff, 0x23, 0x00, 0xfe, 0x32, 0x00, 0xa9, 0x22, 0x32, 0xf0,
+ 0xef, 0xfe, 0x01, 0x04,
+ 0xae, 0xec, 0x54, 0x22, 0xcb, 0xf0, 0x25, 0x10, 0xce, 0x0f, 0x32, 0x22,
+ 0x00, 0xfe, 0x33, 0x00,
+ 0xbe, 0x10, 0x42, 0x0f, 0x01, 0xf3, 0xed, 0x23, 0x57, 0xdb, 0xde, 0x11,
+ 0x00, 0x0f, 0x75, 0x0f,
+ 0xca, 0xef, 0xf0, 0x10, 0x22, 0xff, 0xcd, 0xfe, 0xee, 0xcb, 0x00, 0x65,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x0f, 0x00, 0xde, 0x10, 0x77, 0x31, 0xee, 0x00, 0x22, 0xee, 0x32, 0x65,
+ 0xff, 0xff, 0xfe, 0xff,
+ 0x21, 0x10, 0xfd, 0xee, 0x00, 0x0e, 0xde, 0xf0, 0x00, 0xaa, 0xe0, 0x15,
+ 0x42, 0x00, 0x8b, 0xee,
+ 0x24, 0x33, 0xdd, 0xef, 0x00, 0x00, 0x00, 0xed, 0x0f, 0x00, 0x13, 0x10,
+ 0xfb, 0xcd, 0x20, 0x20,
+ 0x88, 0x01, 0x33, 0xef, 0x00, 0x11, 0xcd, 0xcd, 0x25, 0x44, 0xf0, 0xf0,
+ 0xf0, 0xdf, 0x10, 0x31,
+ 0xde, 0xde, 0x57, 0x10, 0xff, 0xfe, 0x01, 0x00, 0xad, 0xeb, 0x32, 0x13,
+ 0x9d, 0xff, 0x00, 0xf0,
+ 0x02, 0x13, 0x00, 0xbb, 0xf0, 0x13, 0x0f, 0x0e, 0x23, 0x0e, 0x0f, 0x54,
+ 0x1f, 0x0b, 0x1d, 0x0e,
+ 0x0f, 0x00, 0x00, 0x0e, 0xec, 0x2f, 0x0b, 0xce, 0x89, 0xdf, 0xf0, 0xdf,
+ 0xf0, 0x11, 0x0f, 0xcb,
+ 0xef, 0x00, 0x21, 0xdd, 0xcd, 0x55, 0x23, 0xcc, 0xee, 0x00, 0xff, 0xbb,
+ 0x03, 0x11, 0xbb, 0x0f,
+ 0x00, 0x0f, 0xfe, 0x0f, 0xcc, 0x00, 0x42, 0x00, 0x1f, 0x2f, 0x0c, 0xdb,
+ 0x11, 0x54, 0x00, 0xff,
+ 0xef, 0xfe, 0x00, 0x00, 0xef, 0xe0, 0x01, 0x45, 0xf0, 0x8b, 0x00, 0x12,
+ 0x00, 0xfe, 0xff, 0x21,
+ 0x10, 0xa8, 0xff, 0x10, 0x21, 0x11, 0xed, 0xee, 0x20, 0x32, 0x41, 0x32,
+ 0xfe, 0x24, 0x67, 0xef,
+ 0x0f, 0x73, 0x22, 0xfe, 0x12, 0x26, 0x00, 0x22, 0x31, 0x20, 0x62, 0x14,
+ 0x00, 0xf1, 0x02, 0x03,
+ 0x24, 0x02, 0x24, 0x46, 0x11, 0xe0, 0x01, 0x12, 0xaf, 0xff, 0x66, 0x11,
+ 0xfe, 0x11, 0x22, 0xfe,
+ 0xec, 0x31, 0x54, 0x0f, 0xed, 0x20, 0x51, 0x0f, 0xfd, 0x01, 0x31, 0x10,
+ 0x21, 0x33, 0x0f, 0xda,
+ 0x10, 0x73, 0x22, 0xf0, 0xe0, 0xf4, 0x46, 0x00, 0xfe, 0xf0, 0xee, 0xff,
+ 0x44, 0xe0, 0x9d, 0x03,
+ 0xf0, 0x0f, 0x02, 0xd9, 0xdf, 0x14, 0x00, 0x00, 0x00, 0x9c, 0x03, 0x27,
+ 0xcf, 0xcd, 0x10, 0x43,
+ 0x0f, 0xcc, 0xff, 0x12, 0x01, 0x10, 0xfa, 0xee, 0x62, 0x01, 0xdc, 0x11,
+ 0x31, 0xec, 0xdd, 0x30,
+ 0x00, 0xc0, 0x00, 0xef, 0xcb, 0x00, 0xf1, 0x8d, 0x02, 0x21, 0xfc, 0x00,
+ 0x04, 0xee, 0xee, 0xf0,
+ 0x03, 0xde, 0xc9, 0x00, 0x11, 0xd0, 0xad, 0xf0, 0x02, 0xf2, 0xe0, 0x03,
+ 0x0f, 0xb8, 0x10, 0x62,
+ 0x01, 0x00, 0x00, 0x00, 0x1f, 0x31, 0x11, 0x10, 0x00, 0xe0, 0x06, 0x44,
+ 0x10, 0xef, 0x00, 0xd1,
+ 0x94, 0xe2, 0xf0, 0xee, 0xf0, 0x25, 0x10, 0xdc, 0x50, 0x34, 0xe0, 0xe0,
+ 0x10, 0x0f, 0xfe, 0x02,
+ 0xe0, 0x8b, 0x11, 0x22, 0x00, 0xf3, 0x99, 0xcc, 0x11, 0x33, 0x0f, 0x0f,
+ 0x25, 0x20, 0x0d, 0x0f,
+ 0x53, 0x11, 0x0d, 0x1f, 0x31, 0x36, 0x22, 0xdd, 0xeb, 0x50, 0x53, 0x14,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x26, 0x01, 0xef, 0xf0, 0x51, 0x43, 0x00, 0xe0, 0x00, 0xff, 0x0b, 0x6f,
+ 0x1f, 0x0d, 0x0f, 0xfe,
+ 0x0d, 0x40, 0x0c, 0xec, 0x00, 0xe0, 0xce, 0xdd, 0x10, 0x64, 0xfc, 0x1f,
+ 0x43, 0xfd, 0xb9, 0x12,
+ 0x43, 0x0b, 0xf0, 0x45, 0x00, 0xef, 0xff, 0x21, 0x14, 0x01, 0x13, 0x23,
+ 0xf1, 0xaf, 0x01, 0x25,
+ 0x00, 0xef, 0xd0, 0xf0, 0x10, 0xfd, 0xee, 0xca, 0xcd, 0x63, 0x34, 0xfd,
+ 0xfd, 0x10, 0x0c, 0x40,
+ 0x77, 0x23, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x10, 0x23, 0x03, 0xee, 0x10,
+ 0x77, 0x20, 0x00, 0x10,
+ 0x00, 0xec, 0xcd, 0x21, 0x53, 0x0e, 0xdc, 0x12, 0x23, 0xda, 0x00, 0x23,
+ 0xaf, 0x00, 0x46, 0x10,
+ 0xf0, 0xf0, 0x02, 0x13, 0x0e, 0x0d, 0x0d, 0x0e, 0x31, 0x23, 0xff, 0xfe,
+ 0x10, 0x76, 0x00, 0xec,
+ 0x45, 0x23, 0x9e, 0x00, 0x35, 0x01, 0xd0, 0x03, 0x23, 0x11, 0x13, 0x45,
+ 0x12, 0xf0, 0x00, 0x74,
+ 0x21, 0xfd, 0x00, 0x77, 0x00, 0x00, 0x33, 0x0e, 0xfd, 0x10, 0x01, 0x01,
+ 0xef, 0xdc, 0x01, 0x02,
+ 0x9b, 0xfe, 0x00, 0xe1, 0xf0, 0xff, 0xe0, 0xef, 0x24, 0x36, 0xc0, 0xe0,
+ 0x42, 0x41, 0x21, 0x01,
+ 0xe0, 0xd0, 0x0f, 0xec, 0x32, 0x13, 0x9d, 0xe0, 0xf7, 0xe1, 0xae, 0xfe,
+ 0xff, 0x01, 0x02, 0x02,
+ 0xe3, 0x01, 0xcb, 0xcc, 0x13, 0x35, 0x0f, 0xbc, 0xfe, 0xdd, 0xfe, 0x31,
+ 0x10, 0xbb, 0xff, 0x0e,
+ 0xda, 0x0f, 0x20, 0xbd, 0xcc, 0xff, 0xff, 0xfd, 0xee, 0xef, 0xfe, 0xdf,
+ 0xcd, 0xed, 0xdc, 0xba,
+ 0xed, 0x20, 0x33, 0xe1, 0xf0, 0x00, 0x2c, 0x0c, 0xd0, 0x80, 0xae, 0x0f,
+ 0x00, 0x00, 0x01, 0x0c,
+ 0xf8, 0xfc, 0x00, 0x0f, 0x2f, 0x1f, 0xed, 0x8b, 0xee, 0x00, 0x10, 0x00,
+ 0x0f, 0xbc, 0xef, 0xf3,
+ 0x01, 0xff, 0x0f, 0x12, 0x20, 0x0c, 0x0f, 0x0f, 0x1e, 0x76, 0x62, 0x0f,
+ 0xff, 0x00, 0x01, 0x00,
+ 0x16, 0x44, 0x23, 0x00, 0xef, 0xee, 0x14, 0x23, 0xd0, 0xd0, 0x35, 0xf1,
+ 0x8d, 0x0e, 0x00, 0xcc,
+ 0xee, 0x01, 0xf0, 0x0f, 0x2b, 0xeb, 0xf0, 0x20, 0x40, 0x20, 0x3f, 0x70,
+ 0x0f, 0xcb, 0x02, 0x04,
+ 0x00, 0x55, 0x32, 0xff, 0xef, 0x01, 0x23, 0x10, 0x32, 0x53, 0x11, 0xd8,
+ 0xee, 0x52, 0x21, 0xfd,
+ 0x1e, 0x40, 0x0e, 0xdd, 0xf0, 0xe2, 0xee, 0x30, 0x40, 0xee, 0xbb, 0xe1,
+ 0x02, 0xe8, 0xfe, 0x62,
+ 0x01, 0xce, 0xfd, 0x00, 0x31, 0xfc, 0xdc, 0x11, 0x01, 0xe2, 0xf0, 0xbd,
+ 0xee, 0x26, 0x01, 0xe0,
+ 0x02, 0xce, 0xb9, 0x30, 0x00, 0xcf, 0xf0, 0xd0, 0x0e, 0x50, 0x10, 0xeb,
+ 0xce, 0xf1, 0xf0, 0xfd,
+ 0x32, 0x44, 0xde, 0xd0, 0xe3, 0x8d, 0xd9, 0xf0, 0x00, 0xf2, 0xe0, 0xae,
+ 0xee, 0xe0, 0x05, 0x22,
+ 0x00, 0xf0, 0x00, 0x20, 0x22, 0x56, 0x31, 0x22, 0x23, 0xe0, 0xe0, 0x22,
+ 0x31, 0x47, 0x34, 0xe0,
+ 0xa0, 0x02, 0x23, 0x00, 0x20, 0x77, 0x52, 0x0f, 0xf0, 0x02, 0x01, 0x10,
+ 0x11, 0x14, 0x01, 0xe1,
+ 0x02, 0xf4, 0xe1, 0xe1, 0x04, 0xf1, 0x03, 0x74, 0x32, 0x12, 0x16, 0x44,
+ 0x52, 0x1f, 0x10, 0x31,
+ 0x23, 0x43, 0x44, 0x11, 0x10, 0x52, 0x33, 0x10, 0x2f, 0x57, 0x24, 0x0f,
+ 0x0f, 0x11, 0x23, 0x00,
+ 0x14, 0x55, 0x00, 0x0e, 0x43, 0x12, 0xff, 0x01, 0x01, 0x00, 0x52, 0x25,
+ 0xff, 0xee, 0x04, 0x00,
+ 0xed, 0x0f, 0x32, 0xe0, 0xc0, 0x05, 0x15, 0xd0, 0xae, 0x30, 0x52, 0xfe,
+ 0xee, 0x02, 0xf1, 0x34,
+ 0x75, 0x0f, 0xef, 0x15, 0x22, 0x00, 0x00, 0x10, 0x32, 0x32, 0x32, 0x11,
+ 0xff, 0xe1, 0x01, 0xcd,
+ 0x01, 0x17, 0xac, 0xbb, 0xff, 0xff, 0xcd, 0xfe, 0x00, 0xdc, 0xad, 0x0f,
+ 0x0d, 0x0a, 0xfe, 0xef,
+ 0xef, 0x0f, 0x74, 0x22, 0x0e, 0xed, 0x00, 0x13, 0x24, 0x21, 0x1e, 0x2f,
+ 0x20, 0x12, 0x00, 0x43,
+ 0x20, 0x09, 0x40, 0x62, 0x00, 0xc8, 0xfe, 0x2f, 0x31, 0x34, 0xcf, 0x9c,
+ 0xff, 0xf0, 0xee, 0x03,
+ 0x37, 0xdf, 0xbd, 0xf0, 0x01, 0x01, 0x11, 0x00, 0xec, 0xbd, 0x00, 0x21,
+ 0x0b, 0xed, 0x20, 0x02,
+ 0xde, 0x00, 0x31, 0x0f, 0xcc, 0xef, 0xf2, 0xf4, 0xb0, 0x10, 0x21, 0x02,
+ 0xf3, 0xac, 0xed, 0x02,
+ 0x04, 0x03, 0x32, 0x20, 0x0e, 0x1e, 0x1b, 0x40, 0x42, 0xf0, 0xaa, 0x00,
+ 0xf0, 0xcc, 0xee, 0xbc,
+ 0xb9, 0xf0, 0xf3, 0xe0, 0xe0, 0xfd, 0x0f, 0x11, 0x04, 0x01, 0x12, 0x41,
+ 0x51, 0x30, 0x2f, 0x10,
+ 0x0d, 0xe9, 0x20, 0x1f, 0xbb, 0xf0, 0x00, 0xed, 0xbc, 0x00, 0x22, 0xee,
+ 0xba, 0xff, 0x00, 0xef,
+ 0xf0, 0x0d, 0xfb, 0xee, 0xe0, 0xd1, 0xd0, 0xe0, 0x8c, 0xed, 0x00, 0xf1,
+ 0xb1, 0xf2, 0xfc, 0xf9,
+ 0x00, 0x00, 0xaf, 0xfe, 0xf0, 0x0e, 0x1f, 0x0e, 0xec, 0x0c, 0x0e, 0xee,
+ 0xcc, 0xfd, 0x40, 0x2d,
+ 0xec, 0xe0, 0x01, 0x03, 0xd0, 0xf0, 0x74, 0x02, 0xd1, 0xbf, 0x0d, 0x11,
+ 0x12, 0xc9, 0xde, 0x0f,
+ 0x0d, 0x3e, 0x30, 0xe8, 0x9d, 0x00, 0x20, 0xfe, 0xcc, 0x12, 0x33, 0xee,
+ 0xec, 0x00, 0x00, 0xf0,
+ 0x40, 0x40, 0x0e, 0xdd, 0x47, 0x75, 0x10, 0x0e, 0x30, 0x41, 0x10, 0x02,
+ 0x15, 0x11, 0x30, 0x76,
+ 0x33, 0x01, 0x02, 0x03, 0x12, 0x04, 0x35, 0x12, 0xe1, 0x03, 0x33, 0x30,
+ 0x11, 0x35, 0xb0, 0x00,
+ 0x32, 0x01, 0x01, 0x70, 0x40, 0x0f, 0xfd, 0xfc, 0x31, 0x52, 0x1d, 0x30,
+ 0x54, 0x13, 0x0f, 0x00,
+ 0x21, 0x20, 0x21, 0x00, 0x0f, 0x21, 0x74, 0x09, 0xea, 0xf1, 0x15, 0x00,
+ 0x0f, 0x61, 0x00, 0xed,
+ 0x00, 0xf2, 0xe0, 0x03, 0x11, 0x0e, 0xfd, 0x00, 0x05, 0x90, 0xce, 0x00,
+ 0x16, 0x02, 0xdf, 0xdf,
+ 0x00, 0xf1, 0xd0, 0xdd, 0x30, 0x42, 0xef, 0xef, 0xfe, 0x08, 0x4e, 0x20,
+ 0xde, 0xf0, 0x72, 0x10,
+ 0xa8, 0xeb, 0x10, 0x10, 0x00, 0xef, 0xce, 0xff, 0xf0, 0xe0, 0xdd, 0xcb,
+ 0x0e, 0xf0, 0xd0, 0xcd,
+ 0x0d, 0x21, 0xd5, 0x80, 0xe0, 0x0f, 0xff, 0xbd, 0xdc, 0xd0, 0xe2, 0xe0,
+ 0xef, 0xed, 0xeb, 0x10,
+ 0x31, 0xfe, 0x0e, 0x46, 0x52, 0x11, 0x1f, 0xfd, 0x00, 0x77, 0x24, 0xff,
+ 0xf0, 0xe1, 0xbf, 0xf0,
+ 0x00, 0x1f, 0x1f, 0x03, 0x27, 0x02, 0xef, 0xf1, 0xa0, 0xee, 0x0e, 0x40,
+ 0xde, 0xd0, 0xf7, 0xf2,
+ 0xff, 0x0f, 0x21, 0x02, 0xef, 0x8a, 0x00, 0x04, 0x00, 0x03, 0xe0, 0xbe,
+ 0x0f, 0x31, 0x24, 0xf0,
+ 0xef, 0x20, 0x60, 0x0c, 0x0d, 0x3c, 0x7d, 0x00, 0x0e, 0x15, 0x35, 0x00,
+ 0xff, 0x23, 0x15, 0x02,
+ 0x12, 0x33, 0x31, 0x00, 0x41, 0x63, 0x00, 0xef, 0x12, 0x53, 0x20, 0x3f,
+ 0x42, 0x0f, 0x00, 0x07,
+ 0x23, 0x0d, 0xc8, 0xef, 0xf1, 0x00, 0x0f, 0x0f, 0xdb, 0x0d, 0x0e, 0x8d,
+ 0xfc, 0x20, 0x50, 0x2e,
+ 0x1c, 0x2f, 0x10, 0x21, 0x00, 0x11, 0x76, 0x32, 0x13, 0x12, 0x00, 0xde,
+ 0x07, 0x34, 0x02, 0x21,
+ 0x42, 0xdf, 0xbf, 0x22, 0x34, 0xd0, 0xe1, 0x02, 0xee, 0x0b, 0x0d, 0xdc,
+ 0xde, 0xd0, 0x50, 0x42,
+ 0x0f, 0x0d, 0x3e, 0x72, 0x47, 0x23, 0x00, 0x00, 0x42, 0x32, 0xfe, 0x31,
+ 0x77, 0x20, 0x0e, 0x00,
+ 0x00, 0x0e, 0x20, 0x74, 0x00, 0x0f, 0x24, 0x22, 0xde, 0xd0, 0x13, 0x01,
+ 0xe0, 0x14, 0x31, 0xfd,
+ 0xe1, 0xb5, 0xef, 0x10, 0x66, 0x02, 0x0e, 0xfc, 0x1e, 0x31, 0x20, 0x00,
+ 0xe0, 0xde, 0x1e, 0x71,
+ 0x10, 0xeb, 0xe0, 0x27, 0x33, 0xf0, 0xb2, 0xe1, 0x22, 0x44, 0x03, 0x07,
+ 0x34, 0x01, 0x00, 0x73,
+ 0x73, 0x12, 0x02, 0x13, 0x22, 0x12, 0x22, 0x32, 0x31, 0x24, 0x02, 0x45,
+ 0x20, 0x0f, 0xee, 0xeb,
+ 0x00, 0x05, 0x80, 0xde, 0xfe, 0xff, 0x00, 0x00, 0xee, 0xbe, 0x04, 0x24,
+ 0x30, 0x33, 0x03, 0xe0,
+ 0x12, 0x67, 0xff, 0xfe, 0x10, 0xf0, 0xd1, 0xf4, 0x00, 0x0f, 0xef, 0xa0,
+ 0xd0, 0xd2, 0xf7, 0x01,
+ 0xbf, 0xd0, 0x14, 0x02, 0xdd, 0xef, 0xc0, 0xe5, 0x55, 0x00, 0xcd, 0xed,
+ 0xfe, 0xdd, 0xdf, 0x12,
+ 0x03, 0x8b, 0xec, 0xfc, 0xfd, 0x0d, 0x10, 0xf0, 0x9b, 0xfd, 0x01, 0x05,
+ 0xab, 0x00, 0x7c, 0x00,
+ 0x4a, 0x15, 0x71, 0x2a, 0xf0, 0x15, 0x4b, 0x2e, 0xba, 0x21, 0x32, 0xc0,
+ 0x00, 0x03, 0x0e, 0x0f,
+ 0x01, 0x64, 0xf2, 0xd3, 0x22, 0x09, 0x00, 0x22, 0x20, 0x0f, 0xd0, 0x9a,
+ 0x00, 0x40, 0x02, 0xff,
+ 0x0e, 0x20, 0xed, 0xde, 0x00, 0x4e, 0x0e, 0xdc, 0x01, 0x12, 0xcb, 0x0d,
+ 0x1d, 0xa8, 0x2d, 0x73,
+ 0x00, 0xcc, 0x00, 0x44, 0x0f, 0xe8, 0x00, 0x30, 0x00, 0xef, 0x20, 0x43,
+ 0xe0, 0x9b, 0x0e, 0x12,
+ 0x22, 0x00, 0xe0, 0xef, 0xfd, 0x50, 0x01, 0xf2, 0xee, 0x02, 0x20, 0x08,
+ 0xee, 0x30, 0x2e, 0xe0,
+ 0xd0, 0x21, 0xfc, 0xdc, 0x70, 0x00, 0xdf, 0x3f, 0x22, 0xdf, 0xcb, 0x20,
+ 0x31, 0x21, 0x20, 0xcb,
+ 0xdf, 0x10, 0x1f, 0x4f, 0x63, 0xff, 0xfa, 0x1f, 0x0f, 0xe0, 0xf1, 0x25,
+ 0xfe, 0x8d, 0xe0, 0x20,
+ 0x6f, 0x0e, 0xd9, 0xef, 0x10, 0x13, 0x20, 0x0d, 0xcb, 0x1f, 0x3f, 0xef,
+ 0x01, 0x43, 0xdc, 0xed,
+ 0xfe, 0x0b, 0x40, 0x00, 0xff, 0x3e, 0x2f, 0xad, 0xef, 0x0c, 0x0f, 0x0f,
+ 0x3d, 0x4d, 0xcd, 0xee,
+ 0x01, 0xfb, 0x09, 0x5f, 0x3e, 0xec, 0x00, 0x42, 0xee, 0xb9, 0x0f, 0x0f,
+ 0x71, 0x0f, 0xb9, 0xf0,
+ 0x21, 0x00, 0x1e, 0xf0, 0xee, 0xfd, 0x10, 0x40, 0x0d, 0xfc, 0x00, 0x32,
+ 0xc8, 0x0f, 0x40, 0x10,
+ 0xd0, 0xfe, 0x00, 0x30, 0x1e, 0x2f, 0x3f, 0xd0, 0x8e, 0x01, 0x40, 0x08,
+ 0x0e, 0xf1, 0x12, 0x0e,
+ 0xdc, 0xff, 0x30, 0x10, 0xe2, 0x51, 0x0c, 0xac, 0x01, 0x01, 0x00, 0x0d,
+ 0xf0, 0x33, 0x0c, 0xbc,
+ 0x33, 0x37, 0xe0, 0x9f, 0x0d, 0x12, 0x40, 0x11, 0x01, 0xe0, 0xde, 0x37,
+ 0x31, 0xbe, 0x20, 0x32,
+ 0xf0, 0xff, 0x02, 0xdf, 0xf0, 0x17, 0x00, 0x51, 0x02, 0x01, 0xcf, 0x2e,
+ 0x22, 0xd5, 0xc0, 0x02,
+ 0x75, 0x00, 0xbe, 0x10, 0x32, 0xde, 0xe2, 0x57, 0xf3, 0xef, 0x00, 0x00,
+ 0x00, 0x27, 0x11, 0xe0,
+ 0xf0, 0xff, 0x90, 0x02, 0x0f, 0x31, 0x14, 0xf1, 0x03, 0x01, 0xef, 0x10,
+ 0x01, 0xb1, 0x47, 0x66,
+ 0x0f, 0xe0, 0x00, 0xf3, 0x01, 0x11, 0x13, 0x20, 0xf1, 0x81, 0x03, 0x36,
+ 0x00, 0xbe, 0x05, 0x22,
+ 0x00, 0xf0, 0x0f, 0x21, 0xef, 0xc0, 0x47, 0x11, 0xef, 0xef, 0x02, 0x20,
+ 0x41, 0xdf, 0xf1, 0x03,
+ 0x02, 0xd0, 0x25, 0x73, 0x0c, 0xf0, 0x34, 0x02, 0xef, 0x1f, 0x23, 0x12,
+ 0x10, 0xff, 0x02, 0xd3,
+ 0xa0, 0x14, 0x00, 0x01, 0x37, 0x07, 0xcf, 0xef, 0xaf, 0xe0, 0x74, 0x12,
+ 0xce, 0x00, 0x14, 0x0f,
+ 0x0d, 0xf1, 0x23, 0x0f, 0xf1, 0x24, 0x11, 0xce, 0x0e, 0x20, 0x53, 0xe0,
+ 0xf2, 0x0e, 0xe9, 0x02,
+ 0x22, 0x0f, 0x01, 0x17, 0x8f, 0xfe, 0x65, 0xf0, 0xc0, 0x20, 0x22, 0x01,
+ 0x12, 0x1f, 0xfe, 0x0f,
+ 0x26, 0x24, 0xbe, 0xed, 0x00, 0x00, 0x02, 0x01, 0xd2, 0x01, 0xc0, 0x02,
+ 0x22, 0x0d, 0x0e, 0x46,
+ 0xe1, 0xde, 0x0e, 0x75, 0x76, 0x0f, 0xde, 0x00, 0x01, 0x00, 0x01, 0x15,
+ 0x41, 0xf0, 0xef, 0xf0,
+ 0x00, 0xe0, 0x10, 0x55, 0xf0, 0xc9, 0x11, 0x41, 0xef, 0xde, 0x01, 0x34,
+ 0x0e, 0xdb, 0x71, 0x00,
+ 0xc1, 0x23, 0x10, 0xd9, 0xd0, 0x40, 0x51, 0x01, 0xd0, 0xdf, 0x00, 0x30,
+ 0xfc, 0xe0, 0x31, 0x21,
+ 0x0f, 0xee, 0xfe, 0x0f, 0x70, 0x1e, 0x0d, 0xda, 0x20, 0x20, 0xcc, 0xde,
+ 0x00, 0x2f, 0x32, 0x51,
+ 0xd9, 0xde, 0x30, 0xe0, 0xb0, 0x01, 0x5f, 0x3f, 0xfd, 0xc8, 0x0e, 0x71,
+ 0xf0, 0xfe, 0xfd, 0xff,
+ 0x12, 0x11, 0x1c, 0x1e, 0xda, 0xef, 0x21, 0x02, 0xdf, 0xdb, 0x2f, 0x5d,
+ 0x2f, 0x10, 0x01, 0xbd,
+ 0x2e, 0x1d, 0xe9, 0x0f, 0x7d, 0x21, 0x02, 0xdf, 0xda, 0x20, 0x5e, 0x00,
+ 0xe1, 0x12, 0x0d, 0xce,
+ 0x13, 0x10, 0x0c, 0x20, 0x04, 0xe1, 0x9c, 0x00, 0x34, 0x0f, 0xeb, 0x12,
+ 0x33, 0xef, 0xbd, 0x20,
+ 0xff, 0xdf, 0x75, 0x40, 0xcc, 0xe0, 0x13, 0x44, 0xec, 0xdd, 0x33, 0x34,
+ 0xcc, 0xfe, 0x32, 0x12,
+ 0xff, 0xce, 0x23, 0x41, 0xfe, 0xff, 0x0f, 0xdf, 0xe3, 0x06, 0x40, 0x2d,
+ 0x00, 0xe3, 0xd1, 0x0b,
+ 0x00, 0xe2, 0x80, 0x03, 0x67, 0x00, 0xda, 0x00, 0x00, 0xe1, 0x22, 0x20,
+ 0xe1, 0xe1, 0xfe, 0x0c,
+ 0x71, 0x24, 0xf1, 0xef, 0x00, 0x12, 0x0d, 0x2c, 0x41, 0xb0, 0xd0, 0x47,
+ 0x10, 0xdd, 0xef, 0x11,
+ 0x66, 0x0f, 0xee, 0x00, 0x0f, 0x00, 0x12, 0x30, 0xeb, 0x10, 0x33, 0x8f,
+ 0xea, 0x10, 0x21, 0xf0,
+ 0x01, 0xce, 0xdd, 0x34, 0x30, 0xed, 0xee, 0x01, 0x30, 0x60, 0x0c, 0xde,
+ 0xed, 0xfc, 0x63, 0x2e,
+ 0x09, 0x45, 0xf0, 0x8e, 0x0f, 0x21, 0x0d, 0x0f, 0x04, 0x00, 0x00, 0x32,
+ 0xec, 0xbc, 0x10, 0x10,
+ 0x21, 0x04, 0xad, 0xf9, 0x10, 0x50, 0x01, 0xe1, 0xf0, 0x00, 0x00, 0x0e,
+ 0x3b, 0x00, 0xf1, 0xe6,
+ 0xef, 0x0e, 0x20, 0x00, 0xff, 0x11, 0x75, 0x0f, 0xdd, 0x00, 0x31, 0xef,
+ 0xfd, 0x61, 0x12, 0x01,
+ 0xfe, 0xfb, 0x00, 0xe0, 0xd0, 0x00, 0x60, 0x1d, 0xff, 0xf0, 0xe0, 0x00,
+ 0xf7, 0x31, 0x2c, 0xda,
+ 0x00, 0x73, 0x21, 0xcd, 0x00, 0x63, 0x01, 0xdf, 0x00, 0x0d, 0xff, 0x37,
+ 0x00, 0x9b, 0x01, 0x36,
+ 0x00, 0xbe, 0x0f, 0x30, 0xf1, 0x00, 0x10, 0xf1, 0xad, 0x00, 0x4e, 0x0a,
+ 0x00, 0x20, 0xe2, 0xf0,
+ 0x0f, 0x00, 0x11, 0x1e, 0x0e, 0x02, 0x15, 0x10, 0xf0, 0xd1, 0xbf, 0x00,
+ 0x35, 0xbf, 0x0e, 0x00,
+ 0xee, 0x33, 0x77, 0x10, 0xcc, 0x02, 0x33, 0xdd, 0xfe, 0x20, 0x01, 0xaf,
+ 0x00, 0x10, 0x11, 0x26,
+ 0xf0, 0xdb, 0x0f, 0x10, 0x32, 0x21, 0x30, 0x0f, 0x02, 0xef, 0x0a, 0x70,
+ 0x23, 0xc2, 0xef, 0x0d,
+ 0x0d, 0x03, 0x27, 0x8e, 0xde, 0x21, 0x46, 0x0f, 0xdd, 0x32, 0x36, 0xd0,
+ 0xbf, 0x10, 0x1f, 0x0e,
+ 0x00, 0x35, 0x01, 0xc0, 0xdf, 0x00, 0x4f, 0x0d, 0x01, 0xf2, 0xe0, 0x73,
+ 0x33, 0xba, 0x0e, 0x00,
+ 0x14, 0x00, 0xcf, 0x01, 0x13, 0x01, 0x00, 0x15, 0x24, 0x10, 0xbc, 0x00,
+ 0x54, 0x23, 0x00, 0x05,
+ 0xe0, 0x00, 0x20, 0x20, 0xd4, 0xa0, 0x12, 0x36, 0xd0, 0x8f, 0x00, 0x43,
+ 0xf0, 0xde, 0x13, 0x26,
+ 0xef, 0x00, 0x42, 0xf1, 0xe0, 0x01, 0x67, 0x00, 0xd0, 0x00, 0x00, 0xf0,
+ 0x15, 0x41, 0xf0, 0xd0,
+ 0x00, 0x22, 0x14, 0x02, 0xd0, 0x00, 0x12, 0x11, 0xb3, 0xd5, 0x11, 0x60,
+ 0x11, 0x01, 0xe3, 0xf3,
+ 0xf3, 0xd3, 0x02, 0x31, 0x57, 0x17, 0xd0, 0xd0, 0x11, 0x14, 0x10, 0xff,
+ 0xe0, 0x62, 0x44, 0xe0,
+ 0xc2, 0x00, 0xdf, 0x71, 0x10, 0xed, 0xe1, 0x47, 0x13, 0xcd, 0x00, 0x32,
+ 0x02, 0xc0, 0x00, 0x0c,
+ 0x02, 0xf6, 0xf0, 0x00, 0x01, 0x20, 0xf0, 0xa0, 0x2f, 0x60, 0x26, 0xe0,
+ 0xdc, 0x10, 0x32, 0x14,
+ 0x1d, 0x0e, 0x00, 0xa0, 0x00, 0x36, 0xfe, 0x8e, 0x12, 0x00, 0x0d, 0x10,
+ 0x25, 0xce, 0xed, 0x10,
+ 0x3f, 0x0b, 0x0f, 0x00, 0x20, 0x0e, 0xef, 0xca, 0x0e, 0x40, 0x53, 0x0f,
+ 0xfc, 0x00, 0x00, 0xb0,
+ 0x00, 0x10, 0x2f, 0xfd, 0xc0, 0x27, 0x10, 0xd8, 0x30, 0x51, 0xe0, 0x01,
+ 0x20, 0xdd, 0xfe, 0x72,
+ 0x01, 0xde, 0xfe, 0xf0, 0xed, 0x2b, 0x70, 0x00, 0xc0, 0x00, 0x0f, 0x29,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x50, 0x01, 0xec, 0xfd, 0x21, 0x24, 0xee, 0xbd, 0x21, 0x3e, 0xd8, 0x00,
+ 0x53, 0xf0, 0xbc, 0x10,
+ 0x54, 0x0f, 0xbc, 0x00, 0x01, 0x21, 0x1f, 0xfe, 0xeb, 0x00, 0x02, 0x10,
+ 0x0e, 0xfd, 0x1f, 0x40,
+ 0x0d, 0xde, 0xfe, 0x0c, 0x0f, 0x2d, 0xfc, 0x40, 0x00, 0xad, 0xe0, 0x0e,
+ 0x1a, 0x1e, 0x0c, 0x0f,
+ 0xdd, 0x52, 0x4f, 0xd8, 0xec, 0x12, 0x00, 0x0c, 0x50, 0x00, 0x0e, 0x11,
+ 0x01, 0xbc, 0x0f, 0xf0,
+ 0x0c, 0x1f, 0x0c, 0xbe, 0x0f, 0x0e, 0x00, 0x10, 0x7f, 0xe8, 0xcd, 0x00,
+ 0x50, 0x10, 0xed, 0xff,
+ 0x21, 0xea, 0xee, 0x20, 0x20, 0x30, 0x0f, 0xfe, 0xdd, 0xee, 0x20, 0x52,
+ 0x1b, 0x2f, 0x2f, 0xe0,
+ 0xd0, 0xeb, 0xdc, 0x70, 0x73, 0xee, 0xed, 0xfe, 0x0d, 0x00, 0x30, 0x0d,
+ 0x0c, 0x25, 0xd1, 0xbe,
+ 0x1c, 0x10, 0x10, 0x01, 0x03, 0xe1, 0x00, 0xfc, 0xe9, 0x20, 0x20, 0x32,
+ 0x75, 0x40, 0xef, 0xef,
+ 0x00, 0x43, 0xf0, 0x24, 0x51, 0xbe, 0xdb, 0x33, 0x24, 0xb0, 0x10, 0x32,
+ 0xef, 0xdc, 0x00, 0x67,
+ 0x00, 0xf2, 0x11, 0xf0, 0xcc, 0x31, 0x66, 0xe0, 0x00, 0x11, 0xf0, 0xce,
+ 0x03, 0x03, 0x30, 0x00,
+ 0xd1, 0xe3, 0x04, 0x10, 0x0e, 0x00, 0x27, 0x91, 0x00, 0x11, 0x30, 0xf0,
+ 0xdf, 0x03, 0x43, 0x25,
+ 0xdf, 0x9d, 0x02, 0x67, 0x13, 0xf0, 0xef, 0xf1, 0x03, 0x24, 0x32, 0x00,
+ 0xbd, 0x04, 0x25, 0x10,
+ 0xf2, 0x01, 0xe1, 0xd1, 0x22, 0x73, 0xf0, 0xe0, 0x01, 0xe3, 0x07, 0x02,
+ 0x20, 0x0f, 0xef, 0xf0,
+ 0x03, 0x05, 0x42, 0xf0, 0xbc, 0x44, 0x34, 0xb0, 0x00, 0x10, 0x00, 0x21,
+ 0x03, 0xf2, 0x12, 0x62,
+ 0x12, 0x00, 0xbe, 0x0f, 0x15, 0x02, 0x07, 0x25, 0x00, 0xbd, 0x00, 0x35,
+ 0xc0, 0xd0, 0x33, 0x22,
+ 0xee, 0x02, 0x00, 0xad, 0x20, 0x54, 0x04, 0xd0, 0x00, 0x10, 0xf9, 0xe0,
+ 0x21, 0x14, 0xe0, 0x0e,
+ 0xf1, 0xb0, 0x01, 0x31, 0x20, 0xdf, 0x14, 0x53, 0xfd, 0x0e, 0x32, 0x23,
+ 0xe0, 0x0c, 0x25, 0x15,
+ 0xb0, 0x20, 0x50, 0xee, 0xc1, 0xe5, 0x01, 0x30, 0x1d, 0xd0, 0xe2, 0x02,
+ 0x23, 0x00, 0x88, 0x00,
+ 0x20, 0x33, 0xc0, 0x0f, 0x44, 0xf0, 0xbf, 0x1f, 0x10, 0x23, 0x06, 0x20,
+ 0xfc, 0xb0, 0x02, 0x13,
+ 0x20, 0x00, 0xe0, 0xf5, 0x00, 0xfc, 0x70, 0x34, 0xc2, 0xdf, 0x0c, 0x30,
+ 0x3f, 0x11, 0x02, 0xb1,
+ 0xfd, 0x1e, 0x0c, 0xdd, 0xf1, 0x77, 0x13, 0xe0, 0xfe, 0xef, 0xbd, 0x00,
+ 0x45, 0x20, 0xdd, 0x1f,
+ 0x1f, 0xfd, 0x06, 0x1f, 0xec, 0x40, 0x30, 0x00, 0x11, 0x9f, 0xda, 0x10,
+ 0x3f, 0x10, 0x14, 0xdf,
+ 0xaa, 0x00, 0x41, 0x00, 0xfd, 0xff, 0x40, 0x00, 0xc0, 0x1f, 0x4f, 0x0c,
+ 0xee, 0x0d, 0x12, 0x22,
+ 0xdf, 0x0b, 0x1c, 0x0e, 0x01, 0x32, 0x8e, 0xdc, 0x31, 0x0e, 0xda, 0x00,
+ 0x10, 0x2d, 0x0d, 0x00,
+ 0x63, 0xec, 0xd8, 0x00, 0x7f, 0x1f, 0x0f, 0x10, 0xfe, 0xcc, 0x0f, 0x30,
+ 0x10, 0x0e, 0x0f, 0xe0,
+ 0xfe, 0x1f, 0x60, 0x0b, 0xdf, 0x0f, 0xc0, 0x32, 0x52, 0xc8, 0xed, 0x43,
+ 0x22, 0xef, 0x0e, 0x00,
+ 0xf1, 0xdf, 0x1f, 0x63, 0x04, 0xe2, 0xda, 0x1e, 0x50, 0x00, 0xdc, 0x00,
+ 0x25, 0x11, 0xd0, 0x1e,
+ 0xfe, 0xed, 0x51, 0x46, 0xe0, 0xd0, 0x0f, 0x60, 0x0e, 0xe0, 0x14, 0x10,
+ 0x0e, 0x0f, 0xde, 0xe0,
+ 0x20, 0x11, 0xce, 0x13, 0x26, 0x90, 0xf0, 0xe0, 0x1e, 0x21, 0x44, 0xee,
+ 0xfd, 0x00, 0xff, 0xf0,
+ 0x07, 0x24, 0xec, 0xfe, 0x40, 0x30, 0x04, 0x01, 0xf1, 0x8f, 0xbf, 0x22,
+ 0x41, 0xf0, 0xdb, 0x1f,
+ 0x72, 0x03, 0xfb, 0xe2, 0x15, 0x1d, 0x1f, 0x2f, 0xce, 0xff, 0x27, 0x01,
+ 0x0e, 0x0f, 0x10, 0xb0,
+ 0xe1, 0x30, 0x2e, 0xec, 0xb1, 0xf0, 0xdd, 0xfc, 0x30, 0x70, 0x00, 0xba,
+ 0x0e, 0x11, 0x30, 0x09,
+ 0xd0, 0x10, 0x11, 0x4e, 0x1e, 0xfd, 0x00, 0xf0, 0xd1, 0x14, 0x01, 0xca,
+ 0x0f, 0x71, 0x1f, 0x0e,
+ 0xe0, 0x02, 0x0d, 0x0e, 0x40, 0xf8, 0xce, 0x14, 0x1f, 0x1d, 0xff, 0xae,
+ 0x27, 0x10, 0xad, 0x00,
+ 0x31, 0xdf, 0x23, 0x01, 0xec, 0x2f, 0x54, 0xe1, 0xbc, 0x0f, 0x4f, 0x11,
+ 0xf1, 0x00, 0x14, 0x0c,
+ 0xed, 0x10, 0x24, 0xdd, 0x00, 0x76, 0x00, 0xbd, 0x00, 0x01, 0x1e, 0x0e,
+ 0x12, 0x03, 0xdc, 0xfd,
+ 0x10, 0x2e, 0x0c, 0x42, 0x55, 0xfe, 0xcc, 0x13, 0x34, 0xfb, 0xf1, 0x34,
+ 0x9e, 0x0f, 0x10, 0x00,
+ 0xff, 0xe2, 0x36, 0x10, 0xde, 0xee, 0x31, 0x01, 0x80, 0x22, 0x4f, 0xe9,
+ 0xe0, 0x11, 0x33, 0x0c,
+ 0xcd, 0x01, 0x32, 0x1f, 0xdc, 0x12, 0x02, 0xdd, 0x4f, 0x32, 0xa0, 0x02,
+ 0x47, 0x00, 0xee, 0xe0,
+ 0x01, 0x11, 0x42, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xbb, 0x0f, 0x14, 0x25,
+ 0xff, 0xbc, 0x32, 0x34,
+ 0xef, 0xab, 0x21, 0x23, 0xde, 0x01, 0x53, 0x0b, 0xcd, 0x10, 0x54, 0xf0,
+ 0xd0, 0x0f, 0x0f, 0x2e,
+ 0x2e, 0x24, 0xf1, 0x9e, 0x10, 0x10, 0x00, 0x01, 0xe0, 0x00, 0x34, 0x00,
+ 0xd2, 0x07, 0x00, 0xdf,
+ 0x0e, 0x71, 0x45, 0xdf, 0xec, 0x22, 0x54, 0xe0, 0xee, 0xed, 0x00, 0x53,
+ 0x03, 0x0e, 0xd8, 0xc0,
+ 0x00, 0x32, 0x43, 0xed, 0xcc, 0x00, 0x51, 0x00, 0x00, 0xf7, 0x02, 0xed,
+ 0x2f, 0x74, 0xf1, 0xdf,
+ 0x02, 0x21, 0x02, 0x25, 0x01, 0xf1, 0x01, 0xf0, 0x02, 0x07, 0x10, 0xd0,
+ 0x00, 0x54, 0xf2, 0xd0,
+ 0x02, 0x01, 0xd0, 0xd0, 0x53, 0x57, 0x02, 0xd0, 0xff, 0x00, 0x42, 0x35,
+ 0xe1, 0xc0, 0xf3, 0x00,
+ 0x14, 0x13, 0xf1, 0x03, 0x01, 0x80, 0x04, 0x37, 0xf0, 0xf0, 0x20, 0x21,
+ 0xf5, 0xd1, 0x01, 0xd0,
+ 0xc0, 0x74, 0x42, 0xd1, 0xa0, 0x02, 0x26, 0x11, 0x00, 0xe3, 0xf2, 0xe0,
+ 0x31, 0x77, 0xf0, 0xc1,
+ 0x00, 0x21, 0x10, 0x22, 0x02, 0x01, 0x05, 0x01, 0xbd, 0x0f, 0x54, 0xf0,
+ 0xd0, 0x27, 0x01, 0xcf,
+ 0x0f, 0x00, 0x32, 0x12, 0xc0, 0xd0, 0x02, 0x52, 0x0e, 0xea, 0x22, 0x45,
+ 0xe0, 0xfe, 0x10, 0x11,
+ 0x51, 0xf0, 0xde, 0x22, 0x23, 0xf0, 0xf0, 0xe1, 0xde, 0x35, 0x32, 0xbf,
+ 0xf0, 0xda, 0xee, 0x30,
+ 0x54, 0xe0, 0xef, 0x2c, 0x60, 0x0f, 0xec, 0x0e, 0x00, 0x1f, 0xfb, 0xdf,
+ 0x2f, 0x00, 0xbd, 0x10,
+ 0x50, 0x0b, 0xed, 0x12, 0x55, 0x0f, 0xbb, 0x10, 0x31, 0xff, 0xef, 0x51,
+ 0x01, 0xeb, 0xff, 0x21,
+ 0xf0, 0xdc, 0x20, 0x42, 0xf0, 0xd0, 0x2e, 0x1c, 0xdf, 0xae, 0x0f, 0x40,
+ 0xf0, 0xdc, 0x10, 0x1a,
+ 0x1f, 0x22, 0xbd, 0xf9, 0x50, 0x10, 0x00, 0x10, 0x30, 0xcb, 0x0f, 0x00,
+ 0x21, 0x42, 0xde, 0xae,
+ 0x0f, 0x1f, 0x30, 0x13, 0xcc, 0xbe, 0x02, 0x21, 0x3a, 0xfd, 0x00, 0x26,
+ 0x0f, 0xdd, 0xff, 0x0f,
+ 0x3f, 0xff, 0xa0, 0x10, 0x2c, 0x00, 0xbb, 0xed, 0x10, 0x30, 0xfc, 0x0f,
+ 0x00, 0xee, 0xd9, 0x70,
+ 0x20, 0xef, 0xde, 0x2e, 0x0c, 0x3f, 0x61, 0xcd, 0xef, 0x13, 0x0b, 0x0b,
+ 0x4f, 0x00, 0xd0, 0x0e,
+ 0x60, 0xfc, 0xde, 0x00, 0x41, 0x1e, 0xc9, 0xee, 0x10, 0x2f, 0xdd, 0xff,
+ 0x41, 0x0c, 0xeb, 0xde,
+ 0x1e, 0x4f, 0xff, 0xe0, 0x10, 0x4f, 0xfb, 0xfd, 0x0e, 0x1f, 0x41, 0x4e,
+ 0xca, 0xe0, 0x0f, 0x3c,
+ 0x70, 0x14, 0xbd, 0x0c, 0x00, 0x60, 0xf0, 0x0f, 0x0e, 0xec, 0x00, 0x34,
+ 0x0e, 0xdb, 0xfe, 0x10,
+ 0x12, 0xe0, 0xac, 0x1f, 0x4f, 0x0f, 0xd4, 0x02, 0x0d, 0x1c, 0x40, 0xf0,
+ 0xe0, 0x33, 0x20, 0xcc,
+ 0x20, 0x53, 0xcd, 0x02, 0x37, 0x00, 0xed, 0xf2, 0xef, 0x0f, 0x31, 0x54,
+ 0xff, 0xb0, 0x04, 0x12,
+ 0x31, 0x32, 0xf0, 0x88, 0x00, 0x67, 0x00, 0xef, 0xe0, 0x11, 0x11, 0x10,
+ 0x0f, 0x00, 0x06, 0x00,
+ 0xe1, 0x00, 0x10, 0xe0, 0xef, 0x14, 0x24, 0xe2, 0xa0, 0xdb, 0x20, 0x73,
+ 0x02, 0x00, 0xd1, 0xde,
+ 0xee, 0x66, 0x11, 0x00, 0x00, 0xf1, 0x01, 0x01, 0xf0, 0xf0, 0x26, 0x64,
+ 0x00, 0xd0, 0x02, 0x01,
+ 0x00, 0x32, 0x22, 0xf5, 0x03, 0xb0, 0xe0, 0x31, 0x13, 0x01, 0x46, 0xd1,
+ 0x8f, 0x00, 0x35, 0x01,
+ 0xc0, 0x02, 0xe1, 0x01, 0x61, 0xf1, 0xe1, 0x07, 0x11, 0x10, 0x01, 0x01,
+ 0x43, 0x00, 0x3a, 0x00,
+ 0xa4, 0x2a, 0x9b, 0x3e, 0x87, 0x2b, 0xb0, 0x41, 0x56, 0xe1, 0xef, 0x41,
+ 0x31, 0xda, 0xff, 0x71,
+ 0x01, 0xc2, 0x07, 0x20, 0x00, 0x0e, 0xff, 0x31, 0x47, 0xb0, 0xdc, 0x1f,
+ 0x31, 0x22, 0x43, 0xe0,
+ 0x8a, 0x00, 0x00, 0x10, 0x30, 0xe1, 0xc0, 0xfd, 0x30, 0x23, 0xbf, 0x0e,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xff, 0x00, 0x15, 0x10, 0x0e, 0x21, 0x45, 0x11, 0xfe, 0xcd, 0x11, 0x66,
+ 0x10, 0xee, 0xdd, 0x44,
+ 0x01, 0xf0, 0xf0, 0x00, 0xef, 0x01, 0x33, 0xc0, 0xef, 0x03, 0xf8, 0x0b,
+ 0x50, 0x01, 0xd3, 0x30,
+ 0x4e, 0xec, 0xdf, 0xbf, 0x0f, 0x52, 0x17, 0x02, 0xd2, 0xef, 0xfd, 0x60,
+ 0x21, 0xd0, 0xf0, 0x05,
+ 0x0f, 0x0b, 0x00, 0x21, 0x0f, 0x70, 0x0e, 0xcd, 0x13, 0x51, 0x0e, 0xe5,
+ 0xf3, 0x10, 0x3f, 0xfb,
+ 0xae, 0x00, 0x16, 0x00, 0xae, 0x1d, 0x11, 0x24, 0xf1, 0xee, 0x0f, 0x0d,
+ 0x2f, 0x15, 0x11, 0xff,
+ 0x10, 0x45, 0xde, 0xee, 0xe0, 0xd1, 0x12, 0x71, 0x52, 0xde, 0xe9, 0x00,
+ 0x00, 0xf2, 0xf4, 0x0f,
+ 0x6c, 0x1e, 0x00, 0xf5, 0xdf, 0x0e, 0x55, 0x00, 0x0b, 0xe0, 0x01, 0x01,
+ 0x11, 0x51, 0xee, 0xff,
+ 0x32, 0xf2, 0x90, 0x1e, 0x2f, 0x00, 0xd3, 0x03, 0xfd, 0x0a, 0x3e, 0x10,
+ 0xf6, 0xf1, 0xee, 0x1e,
+ 0x72, 0x10, 0xae, 0x0c, 0x20, 0x10, 0x11, 0xf3, 0xfd, 0x10, 0x2c, 0xcb,
+ 0x03, 0x27, 0x34, 0x8d,
+ 0x0e, 0x21, 0x11, 0xf3, 0xf1, 0x30, 0x00, 0xcf, 0xf3, 0x13, 0x3c, 0x5e,
+ 0x12, 0xf2, 0xbe, 0x01,
+ 0x06, 0x20, 0x3d, 0xe0, 0xd0, 0xe1, 0x02, 0x0f, 0xec, 0x8e, 0x0e, 0x60,
+ 0x00, 0x05, 0xf0, 0xfc,
+ 0x0b, 0x2f, 0x00, 0x1e, 0x0e, 0x31, 0x27, 0xe2, 0xdf, 0xed, 0xde, 0xe0,
+ 0x43, 0x71, 0x0f, 0xfa,
+ 0xd0, 0x15, 0x03, 0xab, 0x0e, 0x31, 0xf1, 0xd2, 0x33, 0xfc, 0xdd, 0x12,
+ 0x47, 0x01, 0xfe, 0xfc,
+ 0x10, 0x01, 0x02, 0xa1, 0x8d, 0x0c, 0x30, 0x13, 0xf1, 0xd2, 0x00, 0x0c,
+ 0x20, 0x04, 0x00, 0xee,
+ 0x5f, 0x61, 0x20, 0xf0, 0xd0, 0xee, 0x1a, 0x30, 0x30, 0x00, 0xaf, 0xf4,
+ 0x07, 0x0f, 0xed, 0xf0,
+ 0x02, 0x23, 0x00, 0xce, 0x0d, 0xf0, 0x2d, 0x65, 0xe1, 0x9b, 0x0c, 0x30,
+ 0x10, 0xe0, 0xf4, 0x01,
+ 0x00, 0x0f, 0x00, 0x20, 0x03, 0xf2, 0x03, 0x72, 0x36, 0xde, 0xfd, 0x1d,
+ 0x0b, 0xb1, 0x15, 0x71,
+ 0x0c, 0xf0, 0xf1, 0x03, 0x20, 0x0e, 0xee, 0x0f, 0x10, 0x07, 0xb1, 0xff,
+ 0x0d, 0x21, 0xe0, 0xff,
+ 0x22, 0xd0, 0xa1, 0x02, 0x02, 0x73, 0x30, 0xe9, 0xe0, 0x11, 0x1c, 0xfc,
+ 0x24, 0x64, 0xf0, 0xcc,
+ 0x00, 0x0f, 0x01, 0x31, 0xdb, 0xff, 0x14, 0x34, 0x0f, 0x9a, 0xf0, 0x01,
+ 0x41, 0x10, 0x0f, 0xef,
+ 0x0f, 0x20, 0x01, 0x01, 0x10, 0xfb, 0x01, 0xe4, 0x10, 0x71, 0x00, 0xde,
+ 0xf2, 0x06, 0x21, 0x0f,
+ 0xca, 0x41, 0x23, 0x01, 0xbe, 0xec, 0xf0, 0x33, 0x3e, 0xfc, 0x00, 0xe3,
+ 0xaf, 0x0e, 0x30, 0x04,
+ 0xf0, 0x2d, 0x2c, 0x00, 0x06, 0x72, 0x10, 0xcd, 0xe0, 0x0f, 0x2f, 0x30,
+ 0x24, 0xe0, 0xf1, 0x07,
+ 0xcf, 0xec, 0x40, 0x44, 0xf0, 0xdc, 0x00, 0xe3, 0xd0, 0x00, 0xef, 0xe0,
+ 0x00, 0x00, 0xd0, 0x8e,
+ 0x8d, 0x11, 0x67, 0xf0, 0xfd, 0x0e, 0x30, 0x01, 0x02, 0xe0, 0x0b, 0xee,
+ 0x10, 0x57, 0xf0, 0xcf,
+ 0x0f, 0x00, 0x0e, 0x12, 0x35, 0xe0, 0xdd, 0x53, 0x22, 0xfe, 0xdc, 0x01,
+ 0x33, 0x31, 0x21, 0xe1,
+ 0xe0, 0xfd, 0xde, 0xb0, 0x21, 0x67, 0x12, 0xee, 0xda, 0xe0, 0xef, 0x3f,
+ 0x30, 0x22, 0xc0, 0x9f,
+ 0xfd, 0xfe, 0x01, 0x15, 0x11, 0x64, 0x2e, 0xec, 0x00, 0xf6, 0x11, 0x10,
+ 0x9d, 0x00, 0x42, 0x21,
+ 0xef, 0x00, 0x03, 0xe0, 0x03, 0x04, 0x30, 0x2e, 0x2d, 0xe9, 0xb0, 0x06,
+ 0x20, 0x30, 0xdf, 0xb0,
+ 0x0f, 0x5c, 0x00, 0xa0, 0x00, 0x10, 0x34, 0xf0, 0xcc, 0x00, 0x21, 0x22,
+ 0x00, 0xf0, 0x0d, 0xba,
+ 0xff, 0x24, 0x42, 0xf0, 0xee, 0x0f, 0x3f, 0xfe, 0x8b, 0x00, 0x06, 0x21,
+ 0x21, 0x01, 0x1f, 0xeb,
+ 0xde, 0x02, 0xf4, 0xb1, 0xde, 0x1e, 0x50, 0x0f, 0xd1, 0xe1, 0xf0, 0x21,
+ 0x55, 0x0f, 0x0b, 0x20,
+ 0x30, 0xf1, 0x01, 0xee, 0x0f, 0x21, 0x30, 0x71, 0x22, 0x88, 0xfe, 0xf0,
+ 0x00, 0x12, 0x00, 0x10,
+ 0xed, 0xef, 0x16, 0x11, 0xf0, 0x2f, 0x1f, 0xef, 0x00, 0x0c, 0x20, 0x71,
+ 0x1e, 0xfb, 0xe0, 0xe0,
+ 0x05, 0x42, 0x00, 0x10, 0xd2, 0xd1, 0x23, 0x75, 0x3f, 0x0d, 0xee, 0xe0,
+ 0x05, 0xed, 0x2a, 0x10,
+ 0x80, 0xe1, 0x10, 0x2c, 0x0c, 0xe0, 0x12, 0x23, 0xcf, 0xef, 0x10, 0x1f,
+ 0x74, 0x32, 0xbd, 0xbc,
+ 0x03, 0x17, 0x21, 0x00, 0x0e, 0xf0, 0x23, 0x33, 0xe3, 0x12, 0x70, 0x18,
+ 0x1f, 0x13, 0xd0, 0xdf,
+ 0x00, 0x13, 0x00, 0x1f, 0x10, 0xbf, 0x9a, 0xf1, 0x05, 0x10, 0x1d, 0x0d,
+ 0x12, 0x33, 0xf1, 0xfc,
+ 0x3d, 0x30, 0x00, 0x3e, 0x70, 0xf0, 0xb1, 0xf6, 0x12, 0x3f, 0xeb, 0xa0,
+ 0x0d, 0x14, 0x27, 0x22,
+ 0x0c, 0xff, 0xf0, 0xe1, 0x45, 0x20, 0xff, 0x00, 0x00, 0xbe, 0x0d, 0x03,
+ 0x15, 0x0f, 0xdb, 0x40,
+ 0x22, 0xc0, 0xfe, 0x1f, 0xff, 0xd0, 0x02, 0x12, 0xc0, 0x1d, 0x7e, 0x1d,
+ 0xae, 0xf3, 0x05, 0x0e,
+ 0x10, 0x64, 0x0f, 0xdd, 0x01, 0x10, 0x12, 0x07, 0x03, 0xf0, 0x3d, 0x20,
+ 0xb0, 0xe4, 0x0e, 0xfc,
+ 0x31, 0x3f, 0x0d, 0xa5, 0x05, 0x0f, 0x1a, 0x20, 0xe2, 0xc1, 0x10, 0x1e,
+ 0xef, 0xef, 0x00, 0x0d,
+ 0xd1, 0xf2, 0x24, 0x14, 0xb0, 0xb9, 0xf0, 0x20, 0x73, 0x33, 0x1f, 0xed,
+ 0x00, 0x22, 0x25, 0xdf,
+ 0x0e, 0x70, 0x01, 0x00, 0x23, 0x74, 0x00, 0xe9, 0x0f, 0x00, 0xb0, 0xf3,
+ 0x32, 0x10, 0xdc, 0xdd,
+ 0x20, 0x31, 0x00, 0xf2, 0x95, 0xf1, 0x01, 0x2e, 0x10, 0x30, 0x2c, 0x2f,
+ 0x16, 0xd2, 0xed, 0x1f,
+ 0x41, 0xf2, 0xe0, 0x1f, 0x77, 0x70, 0x0b, 0xa0, 0x01, 0x07, 0x0f, 0x0e,
+ 0x20, 0x10, 0x02, 0xdf,
+ 0x0f, 0x10, 0x4f, 0x0d, 0xfc, 0x10, 0x45, 0xe1, 0xd0, 0x0e, 0x11, 0x44,
+ 0x20, 0xff, 0xbc, 0x01,
+ 0x33, 0x00, 0x10, 0xe0, 0x8c, 0xef, 0x00, 0x35, 0x00, 0xea, 0xe0, 0xfe,
+ 0xf1, 0xf0, 0x23, 0x51,
+ 0xfd, 0xfe, 0xff, 0x02, 0x12, 0x03, 0xed, 0x00, 0xc6, 0x80, 0x1e, 0x41,
+ 0xf0, 0xff, 0x12, 0x27,
+ 0x04, 0x1e, 0x4d, 0x33, 0x12, 0x0f, 0xfe, 0xac, 0xdb, 0x00, 0x15, 0x1f,
+ 0xef, 0xe0, 0xa3, 0xdc,
+ 0xfe, 0x30, 0x52, 0xe3, 0xd2, 0x09, 0x3e, 0x20, 0x00, 0x0d, 0x30, 0x21,
+ 0x94, 0xee, 0xfc, 0x20,
+ 0x5e, 0xf0, 0xc4, 0xf0, 0x01, 0x21, 0x53, 0x2e, 0x00, 0xff, 0xde, 0x07,
+ 0x47, 0x51, 0x0f, 0xfe,
+ 0xef, 0x00, 0x32, 0x00, 0xf0, 0xce, 0xfb, 0x00, 0xf4, 0xf0, 0xde, 0x00,
+ 0x0e, 0x1f, 0x82, 0xc2,
+ 0x0f, 0x0f, 0x30, 0xef, 0xfc, 0x2f, 0x1c, 0x2e, 0x70, 0x07, 0x04, 0xe0,
+ 0x3f, 0x32, 0x02, 0xf1,
+ 0xe2, 0x0f, 0xfd, 0x90, 0x07, 0x22, 0x3d, 0x1b, 0xe0, 0x92, 0xf3, 0x0f,
+ 0x5d, 0x41, 0x02, 0xae,
+ 0x0f, 0x0d, 0x1e, 0x0e, 0xf8, 0x0b, 0x01, 0x03, 0xe6, 0x00, 0x0c, 0x00,
+ 0x01, 0x13, 0xef, 0xbd,
+ 0x01, 0x01, 0x51, 0x10, 0x2e, 0x11, 0x17, 0xe1, 0xbd, 0xec, 0x11, 0x73,
+ 0x20, 0xfc, 0xcf, 0x00,
+ 0x02, 0x10, 0x3f, 0xf3, 0xe5, 0xde, 0x0d, 0x1e, 0x3d, 0xef, 0xc0, 0x05,
+ 0x20, 0x42, 0x53, 0x0a,
+ 0xac, 0xf0, 0x01, 0x10, 0x30, 0x15, 0x01, 0xe2, 0xef, 0xfb, 0x2f, 0x51,
+ 0xf1, 0xb0, 0x02, 0x03,
+ 0xcf, 0x0a, 0x30, 0x30, 0x00, 0xff, 0x01, 0x04, 0xbe, 0xfb, 0x30, 0x70,
+ 0x33, 0xce, 0x0e, 0x05,
+ 0x00, 0x00, 0x01, 0x04, 0x0e, 0xab, 0xef, 0x00, 0x53, 0x24, 0x14, 0xf2,
+ 0xbd, 0x0b, 0xff, 0x30,
+ 0x30, 0x02, 0xb0, 0xee, 0x0e, 0x30, 0x10, 0x0a, 0x0e, 0xe2, 0x07, 0x30,
+ 0xec, 0xdf, 0x31, 0x53,
+ 0x00, 0xe1, 0xbf, 0xed, 0x21, 0x65, 0x30, 0x00, 0x9f, 0x00, 0x24, 0x31,
+ 0x36, 0xf1, 0xb0, 0xfc,
+ 0x10, 0x12, 0x00, 0xef, 0xf0, 0x01, 0x12, 0x02, 0xd3, 0x00, 0x28, 0x4d,
+ 0xe0, 0xc7, 0xf1, 0x1f,
+ 0x5f, 0x40, 0x2f, 0xe0, 0xbf, 0x02, 0x40, 0x3e, 0xfd, 0xcc, 0xff, 0x00,
+ 0x12, 0x30, 0xee, 0xc2,
+ 0x04, 0x20, 0xfc, 0x01, 0x33, 0x35, 0xd3, 0xfe, 0x1c, 0xfe, 0x0f, 0x76,
+ 0x01, 0x0d, 0xfd, 0xb4,
+ 0xd3, 0xff, 0xfb, 0x2f, 0xe0, 0x92, 0xf4, 0xc0, 0xff, 0x2b, 0x50, 0x10,
+ 0xd1, 0xc0, 0x01, 0x41,
+ 0x3e, 0xfb, 0xff, 0x00, 0x06, 0x21, 0x4f, 0x1e, 0x01, 0xa0, 0x0e, 0x4d,
+ 0x15, 0xf5, 0xc0, 0x0c,
+ 0x30, 0x0f, 0xc1, 0x02, 0x00, 0xff, 0xff, 0x11, 0x05, 0xbc, 0xcd, 0x3f,
+ 0x55, 0x00, 0xaf, 0x0d,
+ 0x00, 0xf1, 0x00, 0x1f, 0x2f, 0xf3, 0xf4, 0x00, 0x0f, 0xf0, 0x02, 0x77,
+ 0x22, 0x0f, 0xfd, 0x0f,
+ 0x0e, 0x2f, 0x30, 0x12, 0x04, 0xb3, 0xe1, 0x28, 0x7c, 0x01, 0x05, 0xe1,
+ 0xd0, 0x00, 0xe0, 0x0d,
+ 0x0f, 0x02, 0xd5, 0xc0, 0xff, 0x0c, 0x5f, 0x2f, 0x00, 0x02, 0x24, 0x0f,
+ 0x2e, 0x70, 0x21, 0xf3,
+ 0xd0, 0xc0, 0x02, 0x04, 0x4d, 0x0d, 0xcf, 0xf5, 0xf5, 0x30, 0x7c, 0x1d,
+ 0xed, 0xff, 0xff, 0xef,
+ 0x06, 0x62, 0x2e, 0x0c, 0xce, 0x0f, 0x03, 0xf6, 0x0f, 0x1c, 0x72, 0x03,
+ 0x11, 0x00, 0xfe, 0x00,
+ 0xe1, 0x04, 0x41, 0xf2, 0xc1, 0x01, 0x3c, 0xec, 0xc0, 0x14, 0x00, 0xee,
+ 0xfe, 0x2f, 0x50, 0x1d,
+ 0x0c, 0xed, 0xd4, 0x47, 0x00, 0x1e, 0x2f, 0x40, 0xf2, 0x82, 0xfd, 0x0c,
+ 0x6e, 0x00, 0x07, 0xe4,
+ 0x0e, 0x2b, 0x31, 0x03, 0xf1, 0xbe, 0xfe, 0x01, 0x25, 0x00, 0x00, 0xcd,
+ 0xe1, 0x02, 0x00, 0xfd,
+ 0xdf, 0x42, 0x73, 0x09, 0xcd, 0xe0, 0x03, 0x14, 0x50, 0x1e, 0xf9, 0xd0,
+ 0xf2, 0x12, 0x6e, 0x0d,
+ 0x0f, 0xd2, 0xf0, 0x0d, 0x0d, 0x10, 0x2f, 0xf2, 0xb4, 0x0f, 0x1e, 0x67,
+ 0x17, 0x00, 0xd0, 0x0f,
+ 0x10, 0x42, 0x20, 0x0f, 0xc1, 0xe0, 0x0f, 0xff, 0xf3, 0x13, 0x4f, 0x28,
+ 0xff, 0xb0, 0xe1, 0xf0,
+ 0x0d, 0x4f, 0x30, 0x06, 0xc0, 0xcf, 0xeb, 0x0f, 0x41, 0x01, 0x11, 0x10,
+ 0x41, 0xf5, 0xb0, 0x0f,
+ 0x0d, 0x40, 0x04, 0x01, 0x40, 0x00, 0xd0, 0x02, 0x2f, 0x0e, 0x86, 0xf1,
+ 0x11, 0x41, 0x11, 0x02,
+ 0xe4, 0xd1, 0x1d, 0x48, 0x0d, 0xf1, 0xe2, 0x00, 0x0c, 0x02, 0x61, 0x0e,
+ 0xdd, 0x00, 0x00, 0x01,
+ 0xd5, 0x22, 0x5d, 0x0b, 0xcf, 0xff, 0x02, 0x03, 0x0f, 0x7c, 0x30, 0xf2,
+ 0xb0, 0x0a, 0x00, 0x21,
+ 0x0e, 0xed, 0xe7, 0xd4, 0xd0, 0x2d, 0x6e, 0x02, 0xd3, 0xb1, 0xd0, 0xff,
+ 0x0e, 0x7f, 0x21, 0x0f,
+ 0xdb, 0x01, 0x26, 0x20, 0x0b, 0xce, 0x20, 0x35, 0x01, 0xcf, 0x0d, 0x20,
+ 0xf0, 0xf0, 0x33, 0x05,
+ 0xde, 0x0e, 0x0e, 0xa0, 0xf1, 0x02, 0x0d, 0x0d, 0xe0, 0x0f, 0x2b, 0xb1,
+ 0xd5, 0x10, 0x1d, 0x3d,
+ 0x41, 0x55, 0x0f, 0xff, 0xf2, 0x14, 0x11, 0xef, 0x8b, 0xd0, 0x20, 0x26,
+ 0x00, 0x10, 0x2e, 0x2e,
+ 0x60, 0x03, 0x00, 0xeb, 0x1f, 0x30, 0x1d, 0x00, 0xe0, 0x9f, 0xbe, 0xe0,
+ 0xf1, 0x24, 0x0f, 0xdf,
+ 0xb1, 0xf7, 0x01, 0x50, 0x30, 0x10, 0xfc, 0x0e, 0x14, 0x05, 0x40, 0x6d,
+ 0x02, 0xf7, 0xe0, 0x0e,
+ 0xf0, 0x11, 0x15, 0x10, 0xc0, 0xb0, 0x00, 0x0f, 0x5f, 0x0e, 0xf0, 0x04,
+ 0x05, 0xd0, 0xfe, 0x1b,
+ 0x70, 0x51, 0x04, 0xc0, 0x0d, 0x0d, 0x10, 0x32, 0x00, 0xcf, 0x0e, 0x00,
+ 0x0f, 0x1e, 0xe1, 0xd4,
+ 0x02, 0x24, 0x62, 0x10, 0xfc, 0xe4, 0x03, 0x0c, 0x3d, 0x05, 0x04, 0x20,
+ 0x50, 0x00, 0xdf, 0xac,
+ 0x00, 0x0e, 0x20, 0x27, 0xe2, 0xbc, 0x0e, 0x00, 0x70, 0x0f, 0xee, 0xf1,
+ 0xf1, 0x0f, 0x19, 0x00,
+ 0x10, 0x20, 0x10, 0xf0, 0xc0, 0xcb, 0x01, 0x15, 0x51, 0x10, 0x0d, 0xef,
+ 0x02, 0x01, 0xf1, 0x0f,
+ 0x31, 0xd7, 0xe5, 0x3e, 0x3c, 0x0f, 0x32, 0x23, 0x82, 0x9f, 0x0b, 0x20,
+ 0x40, 0xff, 0xc0, 0xf0,
+ 0x00, 0x12, 0x00, 0x2f, 0x2e, 0xfc, 0xc0, 0xf4, 0x07, 0xe0, 0xee, 0x1e,
+ 0xff, 0x82, 0x04, 0x21,
+ 0x70, 0x1e, 0x0f, 0xd1, 0x04, 0x30, 0x0c, 0x0e, 0x40, 0x26, 0x02, 0xc1,
+ 0xf0, 0xfd, 0xff, 0x00,
+ 0x22, 0x02, 0xbf, 0xee, 0x0e, 0x28, 0x1f, 0x02, 0x24, 0x70, 0x0e, 0xee,
+ 0xf0, 0x03, 0x01, 0xef,
+ 0xf4, 0x74, 0x40, 0x0c, 0xef, 0xe1, 0x15, 0x13, 0xef, 0xeb, 0x3e, 0x50,
+ 0x16, 0x00, 0xd0, 0xbd,
+ 0x00, 0x00, 0x03, 0x21, 0x2c, 0x0f, 0xe0, 0x11, 0x7f, 0x7f, 0x2f, 0xe1,
+ 0xe3, 0x02, 0xed, 0x0e,
+ 0x31, 0x27, 0x03, 0xa0, 0x0b, 0x0f, 0x00, 0x02, 0x02, 0x2c, 0x0b, 0x0e,
+ 0xd0, 0xc2, 0x05, 0x4d,
+ 0x1b, 0x0f, 0xa1, 0xc3, 0x03, 0x2e, 0x0a, 0xd0, 0xb6, 0xf0, 0x0e, 0x5f,
+ 0x20, 0x13, 0xf0, 0xc1,
+ 0x00, 0x3e, 0x50, 0x02, 0xd0, 0xfe, 0x00, 0x26, 0x50, 0x0d, 0x00, 0xc5,
+ 0x0f, 0x0e, 0xee, 0xf1,
+ 0x32, 0x32, 0xf0, 0xca, 0xe0, 0x01, 0x03, 0x1e, 0x29, 0xdf, 0xe2, 0xf3,
+ 0xaf, 0x0b, 0x6e, 0x00,
+ 0xe3, 0xf2, 0x0e, 0xfb, 0x00, 0x30, 0x00, 0x93, 0x00, 0x00, 0x1c, 0x1e,
+ 0x41, 0x07, 0xe1, 0x20,
+ 0x6e, 0x10, 0x21, 0x13, 0xff, 0xdd, 0x30, 0x22, 0x26, 0xe0, 0x9f, 0xde,
+ 0xd0, 0xf0, 0x01, 0xfe,
+ 0xd9, 0x0f, 0x72, 0x04, 0xd0, 0xfb, 0x10, 0x40, 0x11, 0x01, 0x01, 0x00,
+ 0x1d, 0xc0, 0xe2, 0x01,
+ 0x4d, 0x3c, 0xe2, 0x85, 0x02, 0x30, 0x1e, 0x0f, 0x22, 0xc3, 0xd5, 0x10,
+ 0x7d, 0x3a, 0xe1, 0xd1,
+ 0x02, 0xe0, 0xef, 0x0d, 0x0e, 0x50, 0x13, 0xff, 0xcb, 0x10, 0x30, 0x16,
+ 0x00, 0x01, 0xce, 0xdb,
+ 0x00, 0xf1, 0xd3, 0xb0, 0x0f, 0x0c, 0x30, 0x12, 0x10, 0x9f, 0xe2, 0x57,
+ 0x53, 0x00, 0x0b, 0x0e,
+ 0x2f, 0x00, 0xa4, 0xf1, 0x02, 0x0e, 0x2f, 0x1f, 0xee, 0xfe, 0x04, 0x20,
+ 0x2a, 0x00, 0x13, 0x43,
+ 0x10, 0xbb, 0xce, 0xee, 0x51, 0x52, 0xf0, 0xd2, 0xe2, 0x0c, 0x2f, 0x30,
+ 0xf1, 0xb0, 0x0c, 0x2f,
+ 0x22, 0x17, 0x01, 0xdf, 0x0b, 0x00, 0x00, 0x14, 0xf0, 0x8f, 0xff, 0x05,
+ 0x52, 0x0b, 0xdd, 0xfe,
+ 0x00, 0x64, 0x11, 0x12, 0xf0, 0xff, 0x00, 0xfe, 0x20, 0x14, 0x14, 0xdd,
+ 0x9d, 0xf0, 0x05, 0x43,
+ 0x01, 0xec, 0xfc, 0x30, 0x40, 0x11, 0xfe, 0xde, 0x02, 0x05, 0xb0, 0x0f,
+ 0x4d, 0x30, 0xed, 0xae,
+ 0xe2, 0xe7, 0x01, 0x7d, 0x1e, 0x00, 0x07, 0xe0, 0x0d, 0x1f, 0x12, 0x47,
+ 0x22, 0xe0, 0xbb, 0x00,
+ 0x2f, 0x32, 0x02, 0xe1, 0xbe, 0x00, 0xf5, 0x01, 0x1f, 0x0e, 0x00, 0x01,
+ 0xf2, 0xf2, 0x13, 0x60,
+ 0x3b, 0x10, 0x00, 0xd0, 0x02, 0xff, 0x1e, 0x30, 0x54, 0x0f, 0xd9, 0xff,
+ 0x0e, 0x00, 0xf5, 0xe1,
+ 0x0e, 0x0e, 0xe0, 0x3f, 0x7e, 0x70, 0x10, 0xe0, 0x04, 0x12, 0x0f, 0x08,
+ 0xff, 0xb0, 0xf3, 0x40,
+ 0x32, 0x03, 0x00, 0xdf, 0x9c, 0xdd, 0xee, 0x25, 0x26, 0x00, 0xdb, 0xd0,
+ 0xd0, 0x91, 0x02, 0x20,
+ 0x30, 0x2f, 0xeb, 0xdf, 0x00, 0x31, 0x63, 0x4f, 0x0b, 0xfe, 0xb0, 0x01,
+ 0x26, 0x22, 0x00, 0x0d,
+ 0x20, 0xf2, 0xc3, 0xf0, 0x0c, 0x3d, 0x00, 0xb6, 0xe1, 0xdd, 0x0d, 0x5e,
+ 0x10, 0xe5, 0xd0, 0x20,
+ 0xfc, 0xa0, 0x03, 0x40, 0x0f, 0xd2, 0xe4, 0xff, 0x0b, 0x10, 0x01, 0x01,
+ 0x27, 0x00, 0x1a, 0x00,
+ 0x74, 0xf3, 0xd6, 0xf7, 0x47, 0xf6, 0xfe, 0xf8, 0xca, 0x00, 0x63, 0x63,
+ 0x10, 0x0d, 0xea, 0x00,
+ 0x13, 0x44, 0x20, 0x0f, 0x01, 0xf7, 0xd0, 0xe1, 0xe1, 0x00, 0x2c, 0x4f,
+ 0xde, 0xbf, 0xf0, 0xd5,
+ 0x01, 0x31, 0x7f, 0x0e, 0xef, 0xdb, 0x0f, 0x03, 0x67, 0x00, 0xf0, 0xee,
+ 0xf0, 0x02, 0x4f, 0x1b,
+ 0x12, 0x26, 0x11, 0xd0, 0xbc, 0x00, 0x11, 0x61, 0x00, 0xff, 0xde, 0xf0,
+ 0xf2, 0x01, 0x0b, 0x2d,
+ 0x7f, 0x00, 0xd0, 0xef, 0x12, 0x70, 0x2f, 0x0f, 0xf3, 0xf7, 0x03, 0xfa,
+ 0x2f, 0x02, 0xe4, 0xe0,
+ 0x30, 0x2f, 0x8e, 0xef, 0x02, 0x33, 0x10, 0x09, 0x20, 0x23, 0xb2, 0xff,
+ 0x0c, 0x20, 0x16, 0xd0,
+ 0xf0, 0x0f, 0x1d, 0x0f, 0xef, 0xc0, 0x00, 0x5f, 0x21, 0x45, 0xfe, 0xde,
+ 0x33, 0x76, 0x60, 0xfe,
+ 0xe0, 0xd0, 0x10, 0x1f, 0x1a, 0x11, 0x04, 0x00, 0xaf, 0x0d, 0xf0, 0x04,
+ 0x00, 0x21, 0x24, 0xcf,
+ 0xdd, 0xff, 0x44, 0x33, 0x0e, 0xfe, 0x01, 0xf0, 0x89, 0xee, 0x00, 0x30,
+ 0x23, 0x30, 0xfa, 0xaf,
+ 0x00, 0x01, 0x30, 0x0e, 0xe0, 0xe1, 0x10, 0x3d, 0xc0, 0xdc, 0x40, 0x51,
+ 0xf7, 0xc4, 0xf1, 0x00,
+ 0x3c, 0x4d, 0x02, 0x16, 0x43, 0x21, 0xff, 0xce, 0x0e, 0xef, 0xd2, 0xf4,
+ 0x20, 0x7c, 0x0e, 0xbf,
+ 0xe1, 0xf3, 0x00, 0x54, 0x00, 0x0c, 0x0d, 0x00, 0x01, 0x0d, 0x0a, 0x3f,
+ 0x31, 0x01, 0xbe, 0xdb,
+ 0xf1, 0x35, 0x53, 0x04, 0xe1, 0xff, 0xfc, 0x10, 0x26, 0x31, 0xef, 0xce,
+ 0xc3, 0xf3, 0x6f, 0x3b,
+ 0x1d, 0xf0, 0xe1, 0x07, 0xe0, 0x10, 0x70, 0x3e, 0xce, 0xd0, 0x04, 0x03,
+ 0xf0, 0x1a, 0x50, 0xf0,
+ 0xc0, 0x00, 0x2f, 0x0f, 0x1f, 0x00, 0x0f, 0x10, 0x00, 0x10, 0x70, 0x10,
+ 0xff, 0xbf, 0xf2, 0xf3,
+ 0xfe, 0x03, 0x16, 0xec, 0x9b, 0x00, 0x03, 0x04, 0x41, 0x00, 0xed, 0xd2,
+ 0xe3, 0x01, 0x30, 0x2b,
+ 0x2d, 0x00, 0xf3, 0x0f, 0xf9, 0x20, 0x5f, 0x53, 0x23, 0x0c, 0x1b, 0xe0,
+ 0xc5, 0x02, 0x31, 0x3f,
+ 0xac, 0xe0, 0xb0, 0xf1, 0x0e, 0x7b, 0x10, 0xf0, 0xc0, 0xfd, 0x0d, 0x3f,
+ 0x0c, 0x0d, 0xd4, 0xe7,
+ 0xc6, 0x0f, 0x3e, 0x40, 0x00, 0xd1, 0xf2, 0xf0, 0x3d, 0x70, 0x30, 0xf1,
+ 0xed, 0x1c, 0x20, 0xe0,
+ 0xf3, 0x20, 0x60, 0x0e, 0xe0, 0xdf, 0x0b, 0xc0, 0xdf, 0x00, 0x00, 0xd5,
+ 0x80, 0xdc, 0x2c, 0x5c,
+ 0x00, 0xe1, 0x06, 0x50, 0x00, 0xff, 0x00, 0x33, 0x0f, 0x1d, 0x01, 0x06,
+ 0xf2, 0xf0, 0xee, 0xf0,
+ 0x33, 0x13, 0x81, 0xf1, 0x01, 0x43, 0x07, 0xd5, 0x30, 0x4c, 0x0e, 0x01,
+ 0x44, 0x11, 0xcf, 0xcf,
+ 0x00, 0x40, 0x3e, 0x0b, 0x0f, 0xe1, 0x05, 0xdf, 0xef, 0x10, 0x60, 0x30,
+ 0x20, 0xd0, 0xff, 0x08,
+ 0xc0, 0xd2, 0xc3, 0x0c, 0xb0, 0x01, 0x72, 0x5e, 0x0d, 0x04, 0xf5, 0xe0,
+ 0x10, 0x0f, 0x32, 0xf4,
+ 0xd1, 0x01, 0x3f, 0xca, 0xcf, 0x0f, 0xee, 0x00, 0xf6, 0x00, 0x4d, 0x5e,
+ 0x00, 0xd2, 0xdf, 0x2d,
+ 0x72, 0x22, 0x0c, 0xeb, 0xcf, 0xf0, 0x04, 0x12, 0x2e, 0xec, 0x11, 0x72,
+ 0x00, 0xce, 0xf1, 0x04,
+ 0x12, 0x03, 0x01, 0x0f, 0x0d, 0x4d, 0x10, 0x37, 0xd6, 0xed, 0xce, 0xd2,
+ 0x04, 0x60, 0x0d, 0x0f,
+ 0xff, 0xef, 0xef, 0xe1, 0x07, 0x20, 0x00, 0x0d, 0x8c, 0xff, 0x0f, 0x00,
+ 0x03, 0xf4, 0x34, 0x4f,
+ 0xf9, 0xaf, 0x01, 0x75, 0x31, 0xf0, 0xd2, 0x1f, 0x5e, 0x20, 0x00, 0xce,
+ 0x00, 0x07, 0x01, 0xf0,
+ 0xfd, 0xff, 0xf1, 0x01, 0x11, 0xf0, 0xcf, 0xee, 0x30, 0x75, 0x30, 0xed,
+ 0x10, 0x43, 0x0f, 0x2f,
+ 0xe1, 0xb4, 0xdb, 0xee, 0x24, 0x76, 0x10, 0xe0, 0xc3, 0x00, 0x10, 0x21,
+ 0x13, 0x18, 0x0c, 0x20,
+ 0x01, 0xe4, 0xbf, 0x0b, 0x4f, 0x61, 0x04, 0xf0, 0xff, 0x0f, 0x00, 0x13,
+ 0x52, 0x00, 0xef, 0xfe,
+ 0x0d, 0x20, 0x15, 0xf0, 0xee, 0xfe, 0x0f, 0x30, 0x71, 0x5d, 0x0c, 0xa1,
+ 0x03, 0x02, 0x1c, 0x0b,
+ 0xde, 0x01, 0x05, 0xff, 0xfd, 0xf0, 0xe0, 0xfc, 0xf2, 0xf4, 0xd5, 0xd2,
+ 0x20, 0x70, 0x7f, 0x1d,
+ 0x0f, 0xe2, 0xf7, 0xf1, 0x2e, 0x5d, 0x0f, 0xdf, 0xff, 0x01, 0x27, 0x14,
+ 0x0e, 0xee, 0xe2, 0xc4,
+ 0x0f, 0x2e, 0x4f, 0x3e, 0xfe, 0xb3, 0xf3, 0x00, 0xd8, 0x0f, 0x70, 0x10,
+ 0xcf, 0xcf, 0x0d, 0x01,
+ 0x16, 0x10, 0x0e, 0x0d, 0xef, 0xe0, 0xf4, 0x10, 0x1d, 0x1c, 0x21, 0x43,
+ 0x5f, 0x3c, 0xfe, 0xf0,
+ 0xf4, 0xf3, 0x43, 0x71, 0x1c, 0x0e, 0xd0, 0x07, 0x34, 0xd0, 0xdf, 0x0f,
+ 0x50, 0x00, 0x90, 0xfe,
+ 0xf0, 0x01, 0x0b, 0x1e, 0xf0, 0x12, 0x22, 0xf1, 0xdf, 0x0d, 0x7a, 0x10,
+ 0xf5, 0xf1, 0x1e, 0x3e,
+ 0xf4, 0x00, 0x0c, 0xbf, 0xd3, 0xf5, 0x1f, 0x10, 0x20, 0x22, 0x5e, 0x0e,
+ 0x82, 0xf5, 0x00, 0x3d,
+ 0x2e, 0x30, 0x02, 0xbf, 0x0e, 0x0e, 0x00, 0xf4, 0xd1, 0xcf, 0xfd, 0x2f,
+ 0x6d, 0xf2, 0xb7, 0x00,
+ 0x1c, 0x2b, 0x0f, 0x10, 0x12, 0xd1, 0xc3, 0x04, 0x20, 0x2e, 0x00, 0xdd,
+ 0x9b, 0x01, 0x27, 0x52,
+ 0x0e, 0x0e, 0x21, 0x52, 0xdf, 0xcf, 0x04, 0x20, 0x2e, 0x00, 0x22, 0xec,
+ 0x8d, 0xf2, 0x07, 0x30,
+ 0x2b, 0xe0, 0xd0, 0x32, 0x4f, 0x0e, 0x0f, 0x2f, 0x0d, 0xb0, 0xf4, 0x04,
+ 0x3f, 0x3d, 0xaf, 0xe1,
+ 0xe2, 0x05, 0x24, 0x20, 0x1a, 0x0f, 0xf0, 0x00, 0xc0, 0xde, 0x20, 0x40,
+ 0x20, 0x11, 0x22, 0xff,
+ 0x8d, 0xe0, 0x03, 0x57, 0x07, 0xf1, 0xee, 0x1f, 0x30, 0x4f, 0x00, 0xd0,
+ 0xdd, 0x3e, 0x43, 0x05,
+ 0xe1, 0x1e, 0x0d, 0xbf, 0xf5, 0x11, 0x1f, 0x0c, 0x3f, 0xcd, 0x84, 0xb3,
+ 0x1d, 0x28, 0x10, 0x12,
+ 0x03, 0xff, 0xdd, 0xf0, 0x20, 0x6f, 0x13, 0x37, 0x30, 0x0f, 0xbe, 0xfd,
+ 0x0b, 0x10, 0x11, 0xf4,
+ 0xe2, 0x03, 0x01, 0x0e, 0xff, 0xc0, 0x05, 0x33, 0x01, 0xb1, 0x01, 0x55,
+ 0x02, 0x9e, 0xfb, 0x00,
+ 0x7f, 0x22, 0x05, 0x05, 0x10, 0xdd, 0xdc, 0x11, 0x54, 0x12, 0xe0, 0xde,
+ 0x1f, 0x3f, 0x00, 0xa4,
+ 0x0e, 0x1a, 0x00, 0x1f, 0x21, 0x2f, 0x5b, 0x10, 0x00, 0xf2, 0x22, 0x4f,
+ 0xfc, 0xc1, 0x05, 0x10,
+ 0x01, 0xc0, 0xee, 0x00, 0xe1, 0xa0, 0x0e, 0xec, 0xc0, 0xd0, 0xf4, 0x5f,
+ 0x20, 0xee, 0xed, 0x2d,
+ 0x40, 0x12, 0x16, 0x05, 0xb0, 0x00, 0x0e, 0x1f, 0x5c, 0x0f, 0xee, 0xd0,
+ 0xf7, 0x02, 0x1e, 0x3d,
+ 0x40, 0x00, 0xc1, 0x02, 0x26, 0x71, 0x40, 0xfc, 0xee, 0xf1, 0xf3, 0xd0,
+ 0xed, 0x2e, 0x40, 0x04,
+ 0x8d, 0xfc, 0xd3, 0x17, 0x30, 0x0f, 0xf0, 0xff, 0x22, 0x15, 0xcc, 0xfa,
+ 0x3f, 0x30, 0xf1, 0x03,
+ 0x10, 0x20, 0x3d, 0x10, 0x4f, 0x21, 0xe5, 0x94, 0x30, 0x70, 0x20, 0xee,
+ 0xcc, 0x00, 0x07, 0xd1,
+ 0x2f, 0x3d, 0xe0, 0x90, 0xfd, 0x02, 0x01, 0xff, 0x0d, 0x30, 0x26, 0x21,
+ 0x2f, 0x1b, 0xf0, 0xc1,
+ 0x07, 0xe2, 0x20, 0x7e, 0x20, 0xe0, 0xd1, 0xc0, 0xad, 0x00, 0x03, 0x13,
+ 0x3f, 0x4b, 0x1d, 0xcd,
+ 0xd0, 0x03, 0x4d, 0x3b, 0x21, 0x05, 0xe0, 0xec, 0x00, 0x00, 0x05, 0xef,
+ 0xdd, 0x70, 0x71, 0x23,
+ 0xe0, 0xe0, 0xf1, 0x06, 0x00, 0x2e, 0x30, 0x11, 0x2e, 0xdf, 0xc0, 0xe4,
+ 0xc1, 0xfe, 0x08, 0x4f,
+ 0x02, 0xf3, 0xe0, 0x0c, 0xc0, 0xc0, 0xf5, 0x00, 0x00, 0x60, 0x20, 0x3e,
+ 0x6e, 0x00, 0xc0, 0x05,
+ 0x11, 0x20, 0x1c, 0x0f, 0x4c, 0x41, 0xe6, 0x01, 0x4f, 0xdc, 0xb0, 0x02,
+ 0x30, 0x31, 0xa1, 0xf0,
+ 0x04, 0xff, 0xeb, 0xc0, 0x0f, 0x02, 0x03, 0x0e, 0x6f, 0x30, 0x01, 0xc1,
+ 0x05, 0x00, 0x3e, 0x49,
+ 0x0f, 0xd0, 0xd1, 0x0f, 0xd0, 0x92, 0xf4, 0xfd, 0x0c, 0x2c, 0x0d, 0x0f,
+ 0x00, 0x53, 0x03, 0x2e,
+ 0x0c, 0x21, 0x37, 0x61, 0x20, 0xff, 0xd0, 0xf4, 0xc4, 0xc1, 0x00, 0x6e,
+ 0x1e, 0xf0, 0xc5, 0x01,
+ 0x0f, 0x00, 0x34, 0x00, 0xec, 0x0b, 0x10, 0xf3, 0x01, 0x70, 0x2e, 0xfe,
+ 0xc0, 0x02, 0x4e, 0x0a,
+ 0xe0, 0x01, 0x13, 0xf1, 0x80, 0x0f, 0x0d, 0x1f, 0x10, 0x01, 0xe5, 0x14,
+ 0x44, 0x13, 0x21, 0x0f,
+ 0xce, 0x08, 0x0f, 0x01, 0x27, 0x20, 0xfe, 0x8f, 0x00, 0x12, 0x03, 0xe4,
+ 0x00, 0x6e, 0x1e, 0xe1,
+ 0xd6, 0x0e, 0x2d, 0x1f, 0x00, 0x00, 0x0e, 0x20, 0x33, 0x0b, 0x0c, 0xf0,
+ 0xff, 0x0f, 0x60, 0x3f,
+ 0x50, 0x00, 0xc5, 0xc3, 0xd0, 0xeb, 0x00, 0x35, 0xf2, 0x80, 0xfd, 0xef,
+ 0x0f, 0x30, 0x10, 0xfc,
+ 0x0e, 0xe0, 0xf1, 0x07, 0x32, 0x30, 0x0e, 0xff, 0x74, 0x57, 0x02, 0xce,
+ 0x0c, 0x10, 0x00, 0x10,
+ 0x00, 0xd1, 0xe1, 0x4d, 0x7b, 0x3e, 0xef, 0xa3, 0x02, 0x02, 0x0d, 0x1a,
+ 0x0f, 0xe0, 0x01, 0x14,
+ 0xc0, 0xbd, 0xff, 0x00, 0x42, 0x01, 0xe3, 0x0f, 0x2d, 0x1e, 0x00, 0x21,
+ 0x24, 0x30, 0x2b, 0x0e,
+ 0x0d, 0x30, 0xde, 0x8d, 0xae, 0x0f, 0x3e, 0x28, 0xee, 0xc0, 0x06, 0x01,
+ 0xef, 0x0f, 0x00, 0x10,
+ 0x0d, 0x0c, 0x70, 0x00, 0xe3, 0xcc, 0x0b, 0x01, 0x13, 0x10, 0x3c, 0x30,
+ 0x50, 0x14, 0xe4, 0xe4,
+ 0xf5, 0x0f, 0x3d, 0x30, 0x01, 0xa3, 0xc1, 0xc0, 0x0c, 0x00, 0x00, 0x00,
+ 0x0f, 0x53, 0x47, 0x36,
+ 0xee, 0xfe, 0x30, 0x30, 0x06, 0xd0, 0xee, 0x70, 0x10, 0xd0, 0xc0, 0x00,
+ 0x01, 0x00, 0xe0, 0x0e,
+ 0x4f, 0x3b, 0x30, 0x20, 0xd0, 0x00, 0x40, 0x20, 0x14, 0x02, 0x70, 0x6d,
+ 0x04, 0xe3, 0xc0, 0x00,
+ 0xf0, 0x11, 0x42, 0x06, 0xbe, 0xd9, 0x0f, 0x40, 0x23, 0xe2, 0xcf, 0x0e,
+ 0x14, 0x0f, 0xdb, 0x0f,
+ 0x40, 0x42, 0x31, 0xfb, 0xaf, 0x00, 0x00, 0x5b, 0x00, 0x02, 0xc2, 0x0f,
+ 0x1d, 0x0d, 0x3c, 0x0f,
+ 0xdf, 0xb5, 0x05, 0x00, 0x10, 0xf1, 0x00, 0x4f, 0x70, 0x03, 0xef, 0xdc,
+ 0x01, 0x57, 0x04, 0xfd,
+ 0xec, 0x1f, 0x3f, 0x01, 0xc0, 0xe1, 0x07, 0x04, 0xef, 0xab, 0xf0, 0x0f,
+ 0x61, 0x12, 0xf0, 0xee,
+ 0x0f, 0x40, 0x25, 0xe0, 0xdb, 0x0f, 0x61, 0x12, 0xf0, 0xee, 0xf0, 0x06,
+ 0x31, 0x0f, 0xbe, 0xf1,
+ 0x14, 0x31, 0x40, 0x0e, 0xbc, 0x00, 0x02, 0x1f, 0x0d, 0x00, 0x06, 0x21,
+ 0x3e, 0xec, 0xce, 0xf1,
+ 0x07, 0x61, 0x21, 0x0f, 0xcc, 0xe0, 0xf2, 0x00, 0x02, 0xe2, 0x12, 0x7f,
+ 0x2b, 0x1e, 0xff, 0xe2,
+ 0xf4, 0x02, 0x1c, 0x1d, 0x3d, 0xe0, 0xc6, 0x02, 0x00, 0x3d, 0x30, 0x10,
+ 0xd0, 0x83, 0xf1, 0x05,
+ 0x21, 0x40, 0x1b, 0x00, 0x2f, 0x52, 0x01, 0x30, 0x4c, 0x1e, 0xee, 0x90,
+ 0xf3, 0x06, 0x3f, 0x1d,
+ 0xed, 0xd0, 0xc1, 0xd2, 0xd3, 0x11, 0x6e, 0x1b, 0x00, 0x02, 0xe2, 0xe0,
+ 0x1d, 0x30, 0x1e, 0x9f,
+ 0xee, 0x10, 0x41, 0x37, 0x14, 0xf0, 0x82, 0xc2, 0x02, 0x04, 0x4d, 0x09,
+ 0xef, 0xd1, 0x14, 0x12,
+ 0x1c, 0x0c, 0x6e, 0x3f, 0x11, 0x05, 0xe1, 0x00, 0x2c, 0x10, 0x00, 0x2f,
+ 0x20, 0x16, 0xe1, 0x8f,
+ 0xde, 0xd0, 0xd2, 0x01, 0x03, 0x2d, 0xfd, 0x9e, 0xf0, 0x10, 0x4d, 0x5b,
+ 0x01, 0xf4, 0xe3, 0xe0,
+ 0x2d, 0x4e, 0x0f, 0xdd, 0x0b, 0x2e, 0x20, 0x07, 0xe4, 0xc0, 0xff, 0xfa,
+ 0x00, 0x1f, 0x22, 0xd2,
+ 0x8f, 0x0e, 0x0f, 0x10, 0x20, 0x04, 0x03, 0x12, 0x1d, 0x3c, 0x1f, 0xdc,
+ 0x00, 0x43, 0x14, 0xe0,
+ 0xca, 0x2f, 0x71, 0x51, 0xb1, 0xf0, 0xff, 0x0c, 0x2f, 0x00, 0xf4, 0xd5,
+ 0x05, 0x4f, 0x3d, 0x0f,
+ 0xce, 0xe2, 0x03, 0x21, 0x5f, 0x2c, 0x00, 0x0f, 0xe2, 0xf4, 0xe1, 0x12,
+ 0x31, 0x51, 0xf2, 0x84,
+ 0xf0, 0xfc, 0x08, 0xdf, 0xf0, 0x00, 0x42, 0x00, 0x20, 0x4e, 0x0a, 0x2f,
+ 0x0f, 0x50, 0x43, 0x03,
+ 0xf2, 0xf0, 0xfd, 0xe1, 0x02, 0x02, 0xe5, 0xb1, 0xed, 0xdb, 0xf0, 0x00,
+ 0x03, 0x61, 0x32, 0x0b,
+ 0xac, 0x0f, 0x12, 0x53, 0x00, 0xff, 0xfe, 0x00, 0x04, 0x02, 0x12, 0x33,
+ 0xf3, 0xd0, 0xed, 0x0b,
+ 0xed, 0xa0, 0x0d, 0xfe, 0x2e, 0x23, 0x17, 0x11, 0xb2, 0xd2, 0x01, 0xd1,
+ 0x01, 0x39, 0x6d, 0x3f,
+ 0x2f, 0x01, 0x11, 0xec, 0xad, 0xfc, 0x00, 0x44, 0x00, 0x03, 0x0d, 0xf8,
+ 0xdf, 0x0e, 0xf0, 0x60,
+ 0x30, 0xd4, 0xd7, 0xd6, 0xe0, 0xec, 0x1e, 0x70, 0x30, 0xf3, 0xc1, 0xf0,
+ 0xff, 0xec, 0xfe, 0x2f,
+ 0x70, 0x52, 0x11, 0xf0, 0xdf, 0x10, 0x24, 0x40, 0x0c, 0x1e, 0xf2, 0xe7,
+ 0xf1, 0xd0, 0xf0, 0x00,
+ 0x32, 0x3e, 0xed, 0xdf, 0xd3, 0x03, 0x13, 0x02, 0xd3, 0x85, 0xd5, 0x22,
+ 0x70, 0x4b, 0xdf, 0xd0,
+ 0xf5, 0x21, 0x12, 0x0e, 0x2b, 0x20, 0x10, 0xe3, 0xd2, 0x00, 0x2b, 0xaf,
+ 0xc0, 0x00, 0xff, 0x10,
+ 0x21, 0x14, 0xf1, 0xcd, 0xdf, 0x0e, 0x5f, 0x6f, 0x31, 0x25, 0x02, 0x00,
+ 0x0e, 0x5e, 0x0f, 0xa1,
+ 0xf2, 0x01, 0x08, 0x1a, 0x00, 0xe3, 0xf1, 0x01, 0x0f, 0x0e, 0x1f, 0x71,
+ 0x23, 0xe3, 0xbf, 0x0b,
+ 0x1d, 0x2c, 0x0b, 0x0f, 0x00, 0xe4, 0xf6, 0x40, 0x3f, 0x1d, 0x9f, 0xd0,
+ 0xe4, 0x02, 0x32, 0x40,
+ 0xed, 0xb0, 0x04, 0xe1, 0x0b, 0x1d, 0x1e, 0x3d, 0x10, 0x31, 0x64, 0x1f,
+ 0x2d, 0x03, 0x04, 0x03,
+ 0x02, 0x03, 0x0c, 0x2b, 0x9f, 0xde, 0xe4, 0xc4, 0x00, 0x10, 0x48, 0x00,
+ 0xf1, 0xd1, 0xd0, 0xef,
+ 0x0e, 0x0f, 0x40, 0x51, 0x24, 0x50, 0x04, 0xd2, 0xee, 0xed, 0x1d, 0x30,
+ 0x17, 0x01, 0x00, 0x21,
+ 0x50, 0xdd, 0xde, 0x00, 0x4e, 0x00, 0xa1, 0xf2, 0xd6, 0xb0, 0x0e, 0x0e,
+ 0x5f, 0x02, 0x07, 0xe5,
+ 0xf0, 0xfd, 0xe0, 0x0f, 0x40, 0x71, 0x20, 0xf0, 0xe0, 0xfe, 0x0f, 0x1f,
+ 0x30, 0x40, 0x00, 0xcf,
+ 0xee, 0xf0, 0x0e, 0x10, 0x17, 0x07, 0xc2, 0xeb, 0x0e, 0x0f, 0xe1, 0xe1,
+ 0x00, 0x6e, 0x0f, 0x3f,
+ 0x3e, 0x60, 0x41, 0x10, 0x00, 0x07, 0x15, 0x00, 0x00, 0xff, 0x3f, 0x4e,
+ 0xf0, 0x9e, 0xec, 0x00,
+ 0xd0, 0x04, 0x20, 0x0f, 0xf2, 0x07, 0xf3, 0xf0, 0xee, 0xbd, 0xe1, 0x02,
+ 0x41, 0x73, 0x46, 0x00,
+ 0x00, 0xfb, 0xd0, 0xf0, 0x00, 0x0e, 0x2d, 0x3d, 0x00, 0xf2, 0x91, 0xe2,
+ 0xff, 0x00, 0x0f, 0xce,
+ 0xb1, 0x00, 0xfc, 0x1e, 0x30, 0x07, 0x47, 0x04, 0x1e, 0x1d, 0x30, 0x50,
+ 0x00, 0xe1, 0xbf, 0xf0,
+ 0xff, 0xfe, 0x01, 0x15, 0xe7, 0xe2, 0x21, 0x4e, 0xf8, 0xa0, 0xff, 0x01,
+ 0x22, 0x50, 0x2f, 0x2c,
+ 0xe0, 0xe0, 0x20, 0x72, 0x10, 0x0b, 0x10, 0x1f, 0x31, 0xe2, 0xc2, 0xf1,
+ 0xe3, 0xe1, 0xb0, 0xfd,
+ 0xee, 0xf0, 0xf2, 0xe7, 0xef, 0x0e, 0x4f, 0x71, 0x61, 0x00, 0x1e, 0xf1,
+ 0xd2, 0x0f, 0x1b, 0x3c,
+ 0x1b, 0x0f, 0x02, 0xc7, 0x03, 0x0f, 0xec, 0x1f, 0x00, 0x01, 0xb1, 0xf2,
+ 0x00, 0xed, 0x00, 0x01,
+ 0x60, 0x40, 0x0b, 0xd1, 0xe7, 0x02, 0x10, 0x1e, 0x1f, 0x12, 0x72, 0x10,
+ 0x01, 0xd2, 0xd0, 0x0e,
+ 0x00, 0x12, 0x00, 0xd0, 0xef, 0xbe, 0xd0, 0xe3, 0xf7, 0x0d, 0x3e, 0x35,
+ 0x43, 0x00, 0xed, 0x48,
+ 0x7f, 0x21, 0xf4, 0xc1, 0x0e, 0x29, 0x1f, 0x30, 0x1f, 0xc0, 0xc2, 0xf1,
+ 0xe0, 0x2d, 0x2d, 0x40,
+ 0x02, 0xf5, 0xf4, 0xc0, 0x0f, 0xce, 0xc2, 0x10, 0x22, 0x32, 0x00, 0x1c,
+ 0x7c, 0x1b, 0xff, 0xe0,
+ 0x01, 0x13, 0x71, 0x32, 0x13, 0x02, 0xd0, 0xb9, 0x0e, 0x2d, 0x5e, 0x1e,
+ 0x0f, 0xd0, 0x04, 0xf2,
+ 0xd0, 0x0c, 0xd1, 0xf4, 0xc4, 0x14, 0x50, 0x2f, 0x0f, 0xc4, 0xf4, 0x01,
+ 0x2f, 0xea, 0x0f, 0x10,
+ 0x55, 0x11, 0x2d, 0x1c, 0x20, 0xe0, 0xc3, 0x11, 0x20, 0xfd, 0x05, 0x05,
+ 0x19, 0x00, 0x1d, 0x00,
+ 0x63, 0x6b, 0xf7, 0x53, 0x13, 0x6c, 0xb0, 0x55, 0x75, 0x00, 0xec, 0xbf,
+ 0xe5, 0x07, 0x33, 0x60,
+ 0x3f, 0x0f, 0x00, 0x00, 0x02, 0x20, 0x3c, 0x30, 0x00, 0x00, 0x92, 0xe6,
+ 0xd2, 0xd0, 0xae, 0xfd,
+ 0x0d, 0xf0, 0xe3, 0x97, 0xd6, 0xe1, 0xe0, 0xdd, 0xc0, 0xd0, 0xf3, 0xe2,
+ 0xb0, 0xca, 0xde, 0xed,
+ 0x0e, 0x50, 0x20, 0x02, 0x00, 0xc1, 0x00, 0x0e, 0x08, 0xef, 0x90, 0xe0,
+ 0xe2, 0xe1, 0xdf, 0xdc,
+ 0xfd, 0x0c, 0xfe, 0xef, 0xb0, 0xe0, 0xff, 0x09, 0x0f, 0x0d, 0x0d, 0x2e,
+ 0x2f, 0x0f, 0x9e, 0xec,
+ 0xcd, 0xee, 0xed, 0xed, 0xed, 0xb8, 0xfd, 0xec, 0xd0, 0xdf, 0xe0, 0xe0,
+ 0xfe, 0xd9, 0xdf, 0xd0,
+ 0x0e, 0xf0, 0x8f, 0xdf, 0xee, 0x1f, 0x3d, 0x4d, 0x1c, 0x2f, 0x0e, 0xde,
+ 0x0d, 0x4a, 0x7d, 0x2c,
+ 0x0e, 0xfd, 0xcd, 0xfd, 0xc0, 0xef, 0xc8, 0xed, 0xce, 0xfe, 0x01, 0x52,
+ 0x0d, 0xab, 0xfc, 0xe0,
+ 0x0e, 0x00, 0xf0, 0x0f, 0xfb, 0xee, 0xee, 0xfd, 0x0c, 0x0d, 0xbe, 0xfd,
+ 0x0f, 0xf0, 0xcb, 0xdd,
+ 0xce, 0xc0, 0xde, 0xeb, 0xcd, 0xeb, 0xfe, 0xff, 0x0e, 0x0f, 0xbe, 0xed,
+ 0xed, 0xcb, 0xed, 0xee,
+ 0xc0, 0x0c, 0x2e, 0x10, 0x0e, 0x0b, 0xce, 0xdd, 0xfc, 0xfe, 0x0b, 0xee,
+ 0x8d, 0xbd, 0x0b, 0xef,
+ 0x00, 0xf1, 0x04, 0x00, 0x2d, 0xff, 0xd0, 0xd2, 0xc0, 0x03, 0xf0, 0xfe,
+ 0x2d, 0x7f, 0x24, 0x05,
+ 0xf1, 0x10, 0x1e, 0x0b, 0x0d, 0x1f, 0x23, 0xe3, 0x83, 0xf2, 0xc3, 0xe1,
+ 0xdf, 0x1f, 0x40, 0x57,
+ 0x07, 0xe1, 0xf1, 0x0f, 0x3f, 0x30, 0x30, 0x25, 0x13, 0xf5, 0x00, 0x00,
+ 0x4d, 0x10, 0x01, 0x13,
+ 0x66, 0x03, 0xd1, 0xa0, 0xf0, 0x22, 0x02, 0xf1, 0xb2, 0xf2, 0xe0, 0xd2,
+ 0xf0, 0x1d, 0x71, 0x76,
+ 0x02, 0x01, 0x10, 0x00, 0xf2, 0x04, 0x15, 0x12, 0x12, 0x00, 0x03, 0x26,
+ 0x03, 0xe1, 0x02, 0x12,
+ 0xe3, 0xe2, 0x51, 0x73, 0x20, 0x00, 0x05, 0x04, 0x43, 0x14, 0x31, 0x41,
+ 0x42, 0x03, 0x07, 0x04,
+ 0x13, 0x30, 0x1e, 0xee, 0x02, 0x34, 0x21, 0x40, 0x2d, 0xe0, 0xc0, 0xe2,
+ 0xf3, 0x73, 0x22, 0x34,
+ 0x12, 0x00, 0xf1, 0x07, 0x27, 0x42, 0x62, 0x51, 0x40, 0x24, 0x11, 0x21,
+ 0x00, 0x1f, 0x20, 0x54,
+ 0x03, 0xf4, 0x03, 0x30, 0x20, 0x22, 0x17, 0x11, 0x01, 0x10, 0x23, 0x13,
+ 0x24, 0x74, 0x35, 0x01,
+ 0x01, 0xd0, 0xd0, 0x20, 0x61, 0x43, 0x34, 0x23, 0x01, 0x20, 0x24, 0x16,
+ 0x03, 0xb3, 0x02, 0x23,
+ 0x5f, 0x2f, 0x01, 0x05, 0xe3, 0x14, 0x51, 0x23, 0x10, 0x02, 0x11, 0x13,
+ 0x10, 0xd0, 0xd4, 0x14,
+ 0x73, 0x75, 0x34, 0x00, 0x01, 0x00, 0x0e, 0x0e, 0x20, 0x30, 0x2a, 0x10,
+ 0x40, 0x13, 0x16, 0x2f,
+ 0x2d, 0x40, 0x30, 0x13, 0x17, 0x22, 0xd0, 0xa0, 0x0f, 0x01, 0x75, 0x43,
+ 0x23, 0x11, 0x23, 0x20,
+ 0x20, 0x10, 0x31, 0x52, 0x16, 0x03, 0xf2, 0xf4, 0x00, 0x20, 0x10, 0x32,
+ 0x65, 0x00, 0x02, 0x05,
+ 0x54, 0x20, 0x20, 0x2f, 0x30, 0xf1, 0xc0, 0xe0, 0xdd, 0xff, 0xff, 0x00,
+ 0x24, 0x13, 0x36, 0x40,
+ 0x50, 0xe0, 0x86, 0xb4, 0xf0, 0xe0, 0x0e, 0xe0, 0xe1, 0xe3, 0xf2, 0xf0,
+ 0xfc, 0xed, 0xee, 0xd0,
+ 0xd2, 0x24, 0x4e, 0x0b, 0xbf, 0xdf, 0xe0, 0x0f, 0xdc, 0xc0, 0xde, 0xef,
+ 0xad, 0xd9, 0x9e, 0xee,
+ 0xee, 0xec, 0xed, 0x0b, 0x0e, 0x0d, 0xbf, 0x0b, 0xed, 0xfd, 0xec, 0xfe,
+ 0x1e, 0x2d, 0x0c, 0xcc,
+ 0xbd, 0xdc, 0xee, 0xdc, 0xee, 0xee, 0xec, 0xfd, 0xdb, 0x0e, 0xac, 0xdf,
+ 0xbc, 0xde, 0xcd, 0xef,
+ 0xdd, 0xdf, 0x00, 0x3f, 0x2a, 0xfe, 0xbe, 0xfe, 0x00, 0x00, 0x0f, 0x3e,
+ 0x1d, 0xdf, 0x9c, 0xef,
+ 0xeb, 0xfd, 0xef, 0x0d, 0x00, 0x2c, 0x2f, 0xf0, 0x92, 0xe4, 0xe1, 0xe0,
+ 0xa0, 0x00, 0x0f, 0x3c,
+ 0x10, 0xde, 0xbe, 0x0e, 0x0b, 0x5b, 0x1e, 0x20, 0xe6, 0xb1, 0xee, 0x0e,
+ 0x0f, 0x00, 0x1f, 0x25,
+ 0x17, 0xe0, 0xc0, 0xe0, 0xdd, 0xbf, 0xe0, 0xff, 0x00, 0xd0, 0xc2, 0xe1,
+ 0x00, 0x20, 0x20, 0x3f,
+ 0x70, 0x00, 0x00, 0xcf, 0x0a, 0x0e, 0x0c, 0x3b, 0x30, 0x70, 0x21, 0xf1,
+ 0xff, 0x2a, 0x3d, 0x5f,
+ 0x1f, 0xe1, 0xf2, 0xf3, 0xf1, 0x1e, 0x20, 0x13, 0x17, 0x54, 0x4d, 0x3c,
+ 0x1f, 0x00, 0x12, 0x34,
+ 0x74, 0x20, 0x3e, 0x20, 0x00, 0x03, 0xd3, 0xe1, 0xf3, 0x00, 0x62, 0x20,
+ 0x55, 0x37, 0x12, 0x00,
+ 0x01, 0x12, 0x01, 0xee, 0xec, 0x3f, 0x3e, 0x0d, 0x5d, 0x30, 0xf3, 0x0d,
+ 0xfc, 0x1f, 0x31, 0x07,
+ 0xa4, 0xb2, 0xc1, 0xd0, 0xb0, 0xb5, 0xe5, 0xe2, 0x00, 0x10, 0xff, 0xa0,
+ 0xe0, 0xef, 0x0f, 0xee,
+ 0x00, 0x1c, 0x0e, 0xef, 0xf0, 0xe4, 0xc0, 0xbd, 0xea, 0xf0, 0xc0, 0xf1,
+ 0xef, 0xdd, 0xdd, 0xbb,
+ 0xee, 0xde, 0xef, 0xf0, 0xfe, 0x0e, 0x20, 0x11, 0xfd, 0xd8, 0xe8, 0x8f,
+ 0xef, 0xef, 0x03, 0x33,
+ 0x0e, 0xeb, 0xde, 0xee, 0xce, 0xec, 0xcc, 0xef, 0xef, 0xfe, 0xec, 0x8e,
+ 0xe0, 0xa1, 0xef, 0xe9,
+ 0xff, 0xff, 0x0f, 0x5f, 0x10, 0x04, 0x1f, 0x0d, 0x1e, 0x11, 0x34, 0x54,
+ 0x10, 0x1a, 0x0f, 0x0f,
+ 0x1e, 0x1e, 0x3f, 0x3f, 0x50, 0x24, 0xe3, 0xe0, 0xef, 0xfe, 0xee, 0xed,
+ 0xe0, 0x07, 0x64, 0x03,
+ 0xd0, 0xed, 0x2e, 0x4f, 0x00, 0xb0, 0xd0, 0xa3, 0xf4, 0xf4, 0x2e, 0x2c,
+ 0x01, 0xf4, 0xe5, 0x31,
+ 0x4e, 0x0c, 0xe0, 0xd0, 0x1f, 0xc0, 0x8f, 0xff, 0xf0, 0x03, 0x06, 0x00,
+ 0x1e, 0x1d, 0x0c, 0xd0,
+ 0xbc, 0xf0, 0x02, 0xf0, 0xff, 0x21, 0x73, 0x6a, 0x0c, 0xfe, 0x0e, 0x2f,
+ 0x1e, 0x0e, 0xfc, 0x0e,
+ 0x40, 0x0e, 0x0a, 0x00, 0x03, 0xf7, 0x01, 0x20, 0x2d, 0x31, 0x71, 0x73,
+ 0x72, 0x14, 0x01, 0x13,
+ 0x00, 0x03, 0x13, 0x01, 0x30, 0x10, 0x21, 0x17, 0x26, 0x12, 0x50, 0x22,
+ 0x32, 0x34, 0x24, 0x02,
+ 0x21, 0x22, 0x02, 0x02, 0x54, 0x42, 0x62, 0x22, 0x12, 0x24, 0x13, 0x34,
+ 0x25, 0x34, 0x41, 0x23,
+ 0x34, 0x23, 0x24, 0x32, 0x34, 0x03, 0xe2, 0xe2, 0x03, 0x33, 0x64, 0x22,
+ 0x43, 0x20, 0xff, 0x03,
+ 0x36, 0x42, 0x33, 0x72, 0x43, 0x31, 0x12, 0x24, 0x14, 0xf3, 0xe2, 0xd6,
+ 0x03, 0x52, 0x32, 0x31,
+ 0x33, 0x03, 0x12, 0x12, 0x34, 0x73, 0x64, 0x11, 0x21, 0x24, 0x05, 0x04,
+ 0x12, 0x11, 0x30, 0x41,
+ 0x32, 0x32, 0x62, 0x20, 0x1e, 0x0e, 0x0e, 0x24, 0x24, 0x14, 0x24, 0xf1,
+ 0xaf, 0xda, 0xe0, 0x1d,
+ 0x50, 0x20, 0x14, 0xf6, 0x01, 0x21, 0x20, 0x3f, 0x00, 0x52, 0x20, 0x41,
+ 0x22, 0x40, 0x31, 0x52,
+ 0x2d, 0x18, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0xef, 0xde, 0xd1, 0xe3, 0x03,
+ 0x71, 0x2e, 0xfb, 0xce,
+ 0xef, 0x0c, 0x4c, 0xfe, 0xbe, 0xef, 0xdd, 0x00, 0x07, 0x04, 0xc0, 0x00,
+ 0x1b, 0x3e, 0x00, 0x80,
+ 0xd1, 0xf3, 0xfe, 0xef, 0xfd, 0xd0, 0xdf, 0xb1, 0xf0, 0xd8, 0xdd, 0xaf,
+ 0xdf, 0xc0, 0x0f, 0xff,
+ 0xf0, 0xff, 0xdb, 0xe0, 0xfe, 0xbf, 0xf9, 0xfe, 0x2c, 0x6f, 0x1e, 0x1c,
+ 0x0e, 0xbc, 0xfe, 0xed,
+ 0xfd, 0xdf, 0xec, 0x0c, 0xec, 0xbe, 0x00, 0xf2, 0x10, 0x41, 0x00, 0x0e,
+ 0x0f, 0xfe, 0xe1, 0xf7,
+ 0x00, 0x00, 0xaf, 0xfd, 0xe0, 0x40, 0x50, 0x13, 0x01, 0xe0, 0xd0, 0x0e,
+ 0x0a, 0x0f, 0x03, 0xf7,
+ 0xd1, 0x10, 0x4d, 0x0e, 0xdd, 0xbe, 0xda, 0xec, 0x6e, 0x6e, 0x10, 0x1f,
+ 0xfc, 0xfe, 0xef, 0xe3,
+ 0xd7, 0xc1, 0xf0, 0xfe, 0x0f, 0xb0, 0xc4, 0xc0, 0xcd, 0xfc, 0xef, 0xee,
+ 0xd0, 0xff, 0x1e, 0x0b,
+ 0x88, 0xef, 0xfe, 0xef, 0x1f, 0x2e, 0xee, 0xbf, 0xe0, 0xe0, 0xec, 0xdc,
+ 0xe0, 0xef, 0xf0, 0xed,
+ 0xc9, 0xde, 0xdd, 0x0b, 0x1e, 0xff, 0x8f, 0xef, 0xef, 0xfd, 0xba, 0xed,
+ 0xee, 0xed, 0xfd, 0x0e,
+ 0x40, 0x0e, 0xdd, 0xda, 0xee, 0xed, 0xfe, 0xdd, 0x9a, 0xde, 0xdd, 0xdf,
+ 0xec, 0xfe, 0xce, 0xed,
+ 0xed, 0xcc, 0xde, 0xde, 0xbe, 0xdd, 0xec, 0xeb, 0xfe, 0xef, 0xee, 0xbe,
+ 0xfc, 0x0e, 0x2e, 0x3d,
+ 0x0c, 0xbe, 0xfc, 0xef, 0xf0, 0x00, 0x04, 0xe2, 0xd0, 0x00, 0x0e, 0x5f,
+ 0x3d, 0xf0, 0xb0, 0x02,
+ 0xe5, 0xb0, 0xf0, 0x13, 0x51, 0x44, 0x26, 0x00, 0xdf, 0xed, 0xe0, 0x03,
+ 0x34, 0x71, 0x32, 0x25,
+ 0x03, 0xe3, 0x02, 0xe0, 0x02, 0x12, 0x62, 0x10, 0x21, 0x07, 0xf7, 0x12,
+ 0x12, 0xe0, 0xc1, 0xe4,
+ 0x01, 0x50, 0x31, 0x22, 0x33, 0x55, 0x51, 0x41, 0x42, 0x23, 0x33, 0x24,
+ 0x21, 0x16, 0x02, 0xf0,
+ 0xc0, 0x10, 0x10, 0x31, 0x37, 0x24, 0x71, 0x31, 0x21, 0x10, 0x23, 0x27,
+ 0x52, 0x41, 0x30, 0x32,
+ 0x32, 0x12, 0x25, 0x31, 0x32, 0x51, 0x22, 0x73, 0x33, 0x33, 0x26, 0x12,
+ 0x03, 0x11, 0x13, 0x25,
+ 0x62, 0x22, 0x53, 0x12, 0x03, 0x02, 0x13, 0x10, 0x41, 0x40, 0x36, 0x14,
+ 0x04, 0x32, 0x21, 0x20,
+ 0x33, 0x24, 0x23, 0x16, 0x02, 0x02, 0x01, 0xf2, 0xb3, 0x03, 0xe4, 0x13,
+ 0x24, 0x13, 0x02, 0x61,
+ 0x41, 0x42, 0x43, 0x15, 0x13, 0x04, 0x34, 0x02, 0x01, 0xf2, 0xc0, 0x01,
+ 0x03, 0x22, 0x54, 0x32,
+ 0x13, 0x16, 0x21, 0x22, 0x22, 0xf0, 0xd0, 0xe0, 0xf0, 0x1f, 0x50, 0x2f,
+ 0x72, 0x72, 0x33, 0x01,
+ 0x30, 0x20, 0x12, 0x0e, 0x0c, 0x4b, 0x18, 0x1d, 0x1d, 0x2d, 0x1f, 0xc0,
+ 0xfc, 0x09, 0x1f, 0xfe,
+ 0xaf, 0xdd, 0xcd, 0xef, 0xd1, 0xc4, 0xe0, 0xfe, 0x6d, 0x7d, 0x1d, 0x1b,
+ 0x0d, 0xfa, 0x00, 0x0e,
+ 0x1f, 0x5f, 0x10, 0x32, 0x01, 0x1f, 0x0b, 0x2f, 0x0d, 0xff, 0x02, 0x34,
+ 0x2f, 0x18, 0x0f, 0x0f,
+ 0xc0, 0xd1, 0xa1, 0xfd, 0xee, 0xff, 0x1e, 0x30, 0x14, 0xa6, 0xe1, 0x00,
+ 0x20, 0x1e, 0x00, 0xc3,
+ 0xe6, 0xd0, 0xee, 0xfc, 0xff, 0xd0, 0xc4, 0xf3, 0x00, 0x2e, 0x8f, 0x80,
+ 0xf0, 0xc5, 0xe0, 0xd0,
+ 0xdd, 0xf0, 0xff, 0x30, 0x30, 0x2d, 0xe8, 0xbf, 0xee, 0xd0, 0xef, 0xeb,
+ 0xdd, 0x0b, 0x2d, 0xaf,
+ 0x9d, 0xee, 0xdc, 0xfd, 0x0c, 0x0f, 0x3f, 0x00, 0xb0, 0xf0, 0xd8, 0xfe,
+ 0xfe, 0xf0, 0x0f, 0x20,
+ 0x41, 0x0e, 0xfa, 0xff, 0x0e, 0x4f, 0x20, 0xf0, 0xce, 0xd0, 0xff, 0xd0,
+ 0xcf, 0xcc, 0xee, 0xd1,
+ 0xc3, 0xd2, 0xef, 0xfb, 0x0c, 0x1d, 0xfd, 0xdd, 0x23, 0x73, 0x71, 0x31,
+ 0x0c, 0xfe, 0x0f, 0x30,
+ 0x14, 0x04, 0x03, 0xd7, 0xc4, 0xc2, 0xc2, 0xd3, 0xe4, 0xdf, 0xee, 0xc0,
+ 0x0f, 0x11, 0x14, 0xf2,
+ 0x20, 0x00, 0xe2, 0x82, 0xb1, 0xe1, 0xf5, 0xd3, 0xe0, 0x0d, 0xe0, 0x00,
+ 0xc3, 0xf3, 0x33, 0x22,
+ 0xb0, 0x98, 0xef, 0xe0, 0xfe, 0x0b, 0x0c, 0xff, 0xe0, 0xd3, 0xd4, 0x3e,
+ 0x5b, 0x20, 0x11, 0x41,
+ 0x3f, 0xeb, 0xcf, 0xfe, 0x10, 0x30, 0x0c, 0x4a, 0x5d, 0x1c, 0x0d, 0xec,
+ 0xde, 0xbc, 0xef, 0xcf,
+ 0xff, 0xdd, 0x0d, 0xee, 0xcf, 0xc0, 0xdb, 0xed, 0x0a, 0x2e, 0x5e, 0x00,
+ 0x02, 0x40, 0x4e, 0x1b,
+ 0x00, 0x00, 0x3e, 0x3d, 0x4e, 0x4f, 0x1f, 0x1c, 0x0f, 0x0d, 0x0b, 0x0f,
+ 0xef, 0xbf, 0xcc, 0xdd,
+ 0xdb, 0x0d, 0x0c, 0xde, 0xd0, 0xf2, 0xd4, 0x0f, 0x7b, 0x7f, 0xf0, 0xb3,
+ 0xd1, 0x00, 0xcf, 0x0d,
+ 0x1f, 0x30, 0x13, 0x05, 0xe1, 0xcf, 0xbb, 0xde, 0xee, 0xe0, 0xe0, 0xd2,
+ 0xb0, 0xcf, 0xdb, 0xcf,
+ 0xde, 0xf0, 0x11, 0x32, 0x02, 0xf4, 0xd6, 0xd0, 0xfb, 0xee, 0xec, 0xff,
+ 0xc1, 0xd1, 0xdf, 0xaa,
+ 0xee, 0xdd, 0x0d, 0xdd, 0xde, 0xf0, 0xe3, 0xb0, 0x98, 0xf0, 0xef, 0xf0,
+ 0xe1, 0x0e, 0x20, 0x2f,
+ 0xe0, 0xde, 0x01, 0x30, 0x30, 0x1c, 0x20, 0x57, 0x23, 0x03, 0x02, 0x00,
+ 0xb0, 0xbd, 0x01, 0x33,
+ 0x23, 0xe6, 0xc1, 0x12, 0x42, 0x42, 0x11, 0x10, 0x50, 0x3c, 0x7e, 0x12,
+ 0x27, 0x13, 0x14, 0x22,
+ 0x10, 0x12, 0xf6, 0xc4, 0xf3, 0xd1, 0xb0, 0xd0, 0xd3, 0x05, 0x31, 0x52,
+ 0x13, 0x03, 0xb3, 0xf2,
+ 0xf3, 0x01, 0x02, 0x01, 0x00, 0xd2, 0xd6, 0xd2, 0xf3, 0x04, 0x52, 0x33,
+ 0x11, 0xf0, 0xf0, 0xf5,
+ 0xb0, 0xe1, 0xa0, 0xe0, 0xf5, 0x02, 0x2f, 0x19, 0x0e, 0xdf, 0xef, 0xde,
+ 0xef, 0x31, 0x76, 0x20,
+ 0x32, 0x21, 0x21, 0x00, 0x1f, 0x2c, 0x6c, 0x3a, 0x1d, 0x1e, 0x20, 0x0e,
+ 0xed, 0x2e, 0x5e, 0x10,
+ 0x00, 0xdf, 0xde, 0x08, 0x7d, 0x4e, 0x3f, 0x00, 0xfe, 0x1e, 0x60, 0x1b,
+ 0x3e, 0x6d, 0x2d, 0x2c,
+ 0x0c, 0x20, 0x30, 0x30, 0x70, 0x40, 0x33, 0x23, 0x1e, 0x1f, 0xf0, 0x00,
+ 0xde, 0x1c, 0x7d, 0x1f,
+ 0x34, 0x27, 0x07, 0x21, 0x10, 0x2e, 0x31, 0x36, 0x23, 0x73, 0x33, 0x10,
+ 0x0f, 0x20, 0x33, 0x35,
+ 0x54, 0x42, 0x31, 0x32, 0x02, 0x11, 0x12, 0x22, 0x10, 0x06, 0x03, 0xe6,
+ 0x02, 0x01, 0x62, 0x23,
+ 0x22, 0x13, 0x74, 0x57, 0x22, 0x10, 0x02, 0x01, 0x23, 0x52, 0x21, 0x13,
+ 0x02, 0x12, 0x42, 0x21,
+ 0x31, 0x24, 0x13, 0x12, 0x33, 0x45, 0x15, 0x24, 0x13, 0x33, 0x40, 0x21,
+ 0x11, 0x33, 0x74, 0x41,
+ 0x42, 0x13, 0x34, 0x37, 0x42, 0x33, 0x52, 0x22, 0x12, 0x14, 0x23, 0x12,
+ 0x45, 0x02, 0x44, 0x22,
+ 0x03, 0x13, 0x02, 0xf3, 0x01, 0x33, 0x32, 0x71, 0x71, 0x21, 0x04, 0x34,
+ 0x00, 0x03, 0x24, 0x03,
+ 0x20, 0x2f, 0x04, 0xf3, 0xa0, 0x05, 0xe2, 0x06, 0x22, 0x10, 0x1e, 0x00,
+ 0xe2, 0x14, 0xe1, 0xd3,
+ 0x8d, 0xce, 0x05, 0xf2, 0x02, 0xff, 0xff, 0x27, 0xf0, 0xc0, 0xce, 0x0f,
+ 0xd0, 0x06, 0x23, 0x8a,
+ 0xb0, 0x11, 0x00, 0xde, 0x00, 0x04, 0xdd, 0x9b, 0x00, 0x12, 0x20, 0xcd,
+ 0xf0, 0x03, 0x01, 0x0f,
+ 0x02, 0x0d, 0xd8, 0x6f, 0x11, 0xff, 0xed, 0xfe, 0x10, 0x0e, 0xc8, 0x2f,
+ 0x32, 0xe0, 0x8c, 0xfe,
+ 0x01, 0x01, 0xeb, 0xdf, 0x20, 0x54, 0xee, 0xdc, 0x00, 0x01, 0xab, 0xee,
+ 0x54, 0x11, 0xeb, 0xdf,
+ 0x41, 0x11, 0xdd, 0xec, 0x32, 0x54, 0xfe, 0xcc, 0x00, 0x32, 0x10, 0xcb,
+ 0x00, 0x12, 0x20, 0xbb,
+ 0x00, 0x22, 0x20, 0xce, 0xfd, 0x12, 0x00, 0x00, 0xee, 0x00, 0x11, 0xcc,
+ 0xee, 0x43, 0x21, 0xc9,
+ 0xff, 0x32, 0xf0, 0xab, 0x22, 0x10, 0xde, 0xff, 0xf0, 0xef, 0xff, 0xd0,
+ 0x0e, 0x24, 0xff, 0x8a,
+ 0x00, 0x13, 0x0f, 0xdc, 0x10, 0x24, 0xf0, 0x9c, 0x00, 0x00, 0x21, 0xee,
+ 0xdc, 0x20, 0x00, 0xbc,
+ 0xff, 0x22, 0x0f, 0x88, 0x00, 0x33, 0xef, 0xdc, 0x00, 0x11, 0x01, 0xee,
+ 0xee, 0x31, 0x00, 0xef,
+ 0xee, 0x00, 0x00, 0x0f, 0xdc, 0x72, 0x0f, 0xdb, 0x0f, 0x43, 0x14, 0xcd,
+ 0xcb, 0x00, 0x56, 0x00,
+ 0xbc, 0xf0, 0x11, 0x11, 0xef, 0x10, 0x00, 0xde, 0x40, 0x57, 0xf0, 0xcb,
+ 0x11, 0x42, 0x00, 0xe0,
+ 0xfe, 0x00, 0x24, 0x00, 0xfe, 0x00, 0x12, 0x31, 0xbe, 0x01, 0x35, 0xee,
+ 0xbe, 0x33, 0x45, 0xef,
+ 0xcd, 0x12, 0x23, 0x11, 0xee, 0xdc, 0x12, 0x76, 0x00, 0xee, 0x00, 0x13,
+ 0x22, 0xee, 0xff, 0x34,
+ 0x00, 0xcc, 0x53, 0x02, 0xdc, 0x00, 0x25, 0x10, 0x0f, 0xcf, 0x11, 0x45,
+ 0x00, 0x01, 0x10, 0x8b,
+ 0x01, 0x65, 0x00, 0x0f, 0xf0, 0x00, 0x21, 0x12, 0x0f, 0xdd, 0x00, 0x43,
+ 0x02, 0xfc, 0x00, 0x35,
+ 0xf0, 0xdc, 0x01, 0x32, 0x00, 0x20, 0x01, 0xd0, 0x72, 0xfe, 0xb8, 0x31,
+ 0x34, 0xee, 0xdf, 0x41,
+ 0x12, 0x0e, 0x21, 0x21, 0xde, 0xed, 0x75, 0x44, 0xff, 0xdc, 0x01, 0x00,
+ 0xdd, 0x00, 0x7f, 0x00,
+ 0xf7, 0x39, 0xd7, 0x13, 0x42, 0x34, 0x6d, 0x0f, 0xad, 0x0b, 0x12, 0xfc,
+ 0x0f, 0x24, 0xcf, 0xdb,
+ 0x20, 0x21, 0xce, 0x00, 0x31, 0xdd, 0x10, 0x56, 0x02, 0x13, 0xe1, 0xdf,
+ 0x61, 0x57, 0x07, 0xa0,
+ 0xfe, 0x10, 0x44, 0xe1, 0xcd, 0x1f, 0x42, 0x03, 0xdf, 0xfd, 0x1f, 0x21,
+ 0x16, 0x01, 0xd0, 0x00,
+ 0x33, 0x14, 0xae, 0x0f, 0x21, 0x22, 0x00, 0xcd, 0x1c, 0x3e, 0xec, 0xca,
+ 0x30, 0x41, 0xdf, 0xcb,
+ 0x2e, 0x40, 0xf0, 0xcd, 0x0d, 0x10, 0x20, 0xf1, 0xf0, 0xed, 0x10, 0x76,
+ 0xf0, 0xdc, 0x20, 0x40,
+ 0xef, 0x00, 0x00, 0x00, 0x13, 0x03, 0xbc, 0x34, 0x37, 0xa1, 0xe0, 0x10,
+ 0x03, 0x22, 0x02, 0xe1,
+ 0x34, 0x12, 0xe0, 0x00, 0x10, 0x00, 0x21, 0xee, 0xda, 0x73, 0x53, 0xab,
+ 0xfc, 0x34, 0x02, 0xdd,
+ 0x0f, 0x63, 0xf4, 0xdd, 0x0e, 0x33, 0xef, 0x00, 0x02, 0x0f, 0x0d, 0x00,
+ 0x23, 0xe0, 0xfb, 0xfd,
+ 0x41, 0x14, 0xcd, 0x0c, 0x65, 0x26, 0xc0, 0xee, 0x20, 0x32, 0xd0, 0xec,
+ 0x2f, 0x41, 0xde, 0xec,
+ 0x50, 0x00, 0xce, 0x0c, 0x20, 0x21, 0xce, 0xfb, 0x1f, 0x30, 0xff, 0x0e,
+ 0x21, 0xff, 0x98, 0x30,
+ 0x41, 0xd0, 0xba, 0x30, 0x20, 0xff, 0xdc, 0x0e, 0x20, 0x0f, 0x0e, 0x0f,
+ 0xee, 0x0c, 0x1f, 0x30,
+ 0xbf, 0xdb, 0x3f, 0x30, 0xdf, 0xbc, 0x40, 0x20, 0xef, 0xb9, 0x40, 0x31,
+ 0xaf, 0x0e, 0x21, 0x01,
+ 0xed, 0xfc, 0x42, 0x02, 0xef, 0xec, 0x31, 0x57, 0xf0, 0xbf, 0x10, 0x21,
+ 0xf1, 0xf0, 0x00, 0x01,
+ 0x24, 0xe1, 0xf0, 0x00, 0x42, 0x03, 0xce, 0x0f, 0x36, 0x12, 0xf0, 0xd0,
+ 0x52, 0x27, 0xc0, 0xe0,
+ 0x12, 0x23, 0xe0, 0xdf, 0x41, 0x23, 0xdf, 0xdd, 0x0e, 0x44, 0x26, 0xb0,
+ 0xff, 0x21, 0x23, 0xc0,
+ 0x42, 0x04, 0xcd, 0x32, 0x02, 0xdf, 0x21, 0x24, 0xf0, 0xf0, 0xed, 0x30,
+ 0x74, 0xed, 0xec, 0x0e,
+ 0x20, 0x26, 0xe0, 0x00, 0x10, 0xcd, 0x0f, 0x66, 0xf2, 0xd0, 0xcb, 0x0e,
+ 0x70, 0x25, 0xe0, 0xcb,
+ 0x40, 0x12, 0xe0, 0xff, 0x21, 0x02, 0xdf, 0x10, 0x13, 0xf3, 0x05, 0xf2,
+ 0xe1, 0x23, 0x02, 0x33,
+ 0x56, 0x02, 0x80, 0x00, 0x34, 0xf1, 0xf0, 0xff, 0x31, 0x25, 0xbe, 0xfc,
+ 0x20, 0x33, 0xbe, 0xfa,
+ 0x0f, 0x51, 0xf1, 0xd0, 0x20, 0x01, 0xff, 0x0f, 0x12, 0xf1, 0xef, 0x21,
+ 0xff, 0xed, 0x75, 0x02,
+ 0xef, 0xff, 0x00, 0x37, 0xf0, 0xd0, 0x42, 0x34, 0xf1, 0x8c, 0x10, 0x44,
+ 0xe0, 0xec, 0x0e, 0x1f,
+ 0x10, 0x13, 0xdc, 0xca, 0x30, 0x51, 0xe0, 0xff, 0x10, 0x23, 0xe0, 0x0e,
+ 0x20, 0x32, 0x02, 0xdf,
+ 0xfe, 0x10, 0x30, 0xb9, 0xeb, 0x5f, 0x30, 0xce, 0xdb, 0x3f, 0x20, 0xe0,
+ 0xbd, 0x0c, 0x30, 0x10,
+ 0xce, 0xdc, 0x30, 0x31, 0xad, 0x0e, 0x40, 0x00, 0xeb, 0xfc, 0x41, 0x00,
+ 0xdd, 0x0e, 0x10, 0x20,
+ 0xfe, 0x31, 0x22, 0xab, 0x21, 0x01, 0xeb, 0x20, 0x31, 0xf1, 0xbf, 0x11,
+ 0x14, 0xd0, 0xdf, 0x03,
+ 0x77, 0xf3, 0xab, 0x20, 0x24, 0xf1, 0xef, 0x00, 0x31, 0x03, 0xe2, 0x02,
+ 0x02, 0x01, 0x01, 0x13,
+ 0x02, 0xcc, 0x10, 0x55, 0xe0, 0xbe, 0x32, 0x27, 0xcf, 0xfd, 0x43, 0x03,
+ 0xee, 0x00, 0x01, 0xf0,
+ 0xf0, 0x54, 0x47, 0xe2, 0xcf, 0x0e, 0x22, 0x13, 0xff, 0xfd, 0x0c, 0x2f,
+ 0x20, 0xff, 0xcc, 0x0f,
+ 0x3f, 0xee, 0xca, 0x0e, 0x1f, 0x73, 0xf1, 0xbd, 0x0e, 0x10, 0x31, 0x00,
+ 0x21, 0x00, 0xfb, 0x0f,
+ 0x1e, 0x20, 0xf2, 0xde, 0x0f, 0x77, 0xf7, 0xa0, 0x02, 0x67, 0xe1, 0xf0,
+ 0x00, 0x01, 0x13, 0x01,
+ 0x01, 0x01, 0x14, 0x12, 0xd0, 0xf0, 0x10, 0x21, 0xd0, 0x43, 0x13, 0xab,
+ 0x0d, 0x43, 0x06, 0xf0,
+ 0xd0, 0xff, 0x32, 0x67, 0xd0, 0xd0, 0x21, 0x01, 0x12, 0x11, 0x12, 0xd1,
+ 0xd1, 0x32, 0x02, 0xc0,
+ 0x01, 0x76, 0x02, 0xf1, 0xe0, 0x00, 0x34, 0x25, 0xe1, 0xd0, 0x30, 0x41,
+ 0x02, 0x8f, 0x0d, 0x10,
+ 0x01, 0x00, 0xfc, 0xee, 0x31, 0x00, 0xef, 0x12, 0x14, 0xf0, 0x13, 0x55,
+ 0x02, 0x43, 0xf2, 0xbd,
+ 0x0e, 0x57, 0x02, 0xe0, 0x1f, 0xf8, 0x0f, 0x72, 0xf0, 0xb9, 0x0f, 0x30,
+ 0xff, 0xde, 0x1f, 0x30,
+ 0xe0, 0xed, 0x0c, 0x20, 0x1f, 0xed, 0x0d, 0x2f, 0x2f, 0xa9, 0x0e, 0x20,
+ 0x10, 0xce, 0xfd, 0x62,
+ 0x00, 0xdc, 0x1d, 0x30, 0x20, 0xdc, 0x0f, 0x20, 0xe0, 0xcd, 0x21, 0x23,
+ 0xca, 0x0e, 0x0c, 0x0e,
+ 0x0e, 0xec, 0xdc, 0x0e, 0x4e, 0x1f, 0x2f, 0x0d, 0x0e, 0x72, 0xce, 0xd8,
+ 0x2f, 0x40, 0xee, 0xfe,
+ 0x40, 0x0f, 0xde, 0x00, 0x0f, 0xed, 0xb9, 0x30, 0x50, 0xde, 0xee, 0x33,
+ 0x04, 0xd0, 0xff, 0x64,
+ 0x02, 0xc0, 0x10, 0x36, 0x02, 0xae, 0x0c, 0x21, 0x44, 0xe0, 0xfc, 0x1f,
+ 0x62, 0x01, 0xce, 0x0b,
+ 0x1e, 0x20, 0xee, 0xdc, 0x2f, 0x10, 0x00, 0xfd, 0xfc, 0x2e, 0x1f, 0x0c,
+ 0xdc, 0x4f, 0x60, 0x01,
+ 0xf0, 0xff, 0x0f, 0x03, 0x03, 0x05, 0xf2, 0xd1, 0xd0, 0x67, 0x14, 0xe0,
+ 0xf0, 0x13, 0x45, 0xf1,
+ 0xd1, 0x14, 0xf1, 0xd1, 0x51, 0x11, 0xff, 0x2f, 0x52, 0xc0, 0xec, 0x0e,
+ 0x61, 0x03, 0xe0, 0xfd,
+ 0x10, 0x37, 0xf0, 0xb0, 0x12, 0x23, 0x03, 0xe1, 0xd0, 0x0e, 0x0e, 0x21,
+ 0x01, 0x9e, 0x0b, 0x0e,
+ 0x00, 0x0e, 0x0b, 0x10, 0x10, 0x0f, 0x22, 0x03, 0x35, 0x75, 0xee, 0xee,
+ 0x21, 0x01, 0xe0, 0x0f,
+ 0xdd, 0xda, 0x50, 0x20, 0x0f, 0x0e, 0x10, 0x9c, 0x0d, 0x21, 0x00, 0xda,
+ 0x1f, 0x60, 0x00, 0xfd,
+ 0x0b, 0x0e, 0x2d, 0x1d, 0x2f, 0xfb, 0xaa, 0x1e, 0x40, 0x0e, 0xcc, 0x0f,
+ 0x10, 0xff, 0xdd, 0x0d,
+ 0x3f, 0x0e, 0x0c, 0x3c, 0xec, 0xcc, 0x1f, 0x00, 0xaf, 0xdc, 0x0e, 0x7e,
+ 0x1f, 0xec, 0xeb, 0x3f,
+ 0x2f, 0xee, 0xec, 0x60, 0x41, 0x03, 0xe2, 0xf0, 0xf2, 0x14, 0x02, 0xf1,
+ 0x01, 0x04, 0x03, 0xf4,
+ 0xf2, 0x03, 0x57, 0x12, 0xb0, 0xf2, 0x34, 0x74, 0xf2, 0xd1, 0x13, 0x25,
+ 0xf2, 0xf1, 0x13, 0x34,
+ 0xc2, 0xf3, 0x02, 0x01, 0x01, 0xf2, 0xb2, 0xf1, 0x05, 0x75, 0x01, 0xe0,
+ 0x02, 0x23, 0xe2, 0xd0,
+ 0xf1, 0x05, 0x13, 0x03, 0x34, 0x01, 0x01, 0x63, 0x01, 0xf0, 0x40, 0x20,
+ 0x03, 0xe5, 0x03, 0xe0,
+ 0x02, 0x16, 0xf2, 0x81, 0xc0, 0x02, 0x34, 0xe0, 0x01, 0x10, 0x40, 0x20,
+ 0x1f, 0x0e, 0x0f, 0x33,
+ 0xf4, 0x8f, 0x0e, 0x1f, 0x20, 0x0d, 0xf8, 0x00, 0x37, 0xe3, 0x81, 0x03,
+ 0x05, 0x43, 0x03, 0xc3,
+ 0x03, 0x24, 0x03, 0xe2, 0x03, 0x14, 0x31, 0x20, 0x11, 0xf2, 0x80, 0x01,
+ 0x35, 0x03, 0xe0, 0x10,
+ 0x41, 0xd1, 0xd0, 0x0f, 0x02, 0x03, 0xe3, 0x22, 0x1e, 0xe9, 0xce, 0xbf,
+ 0x0e, 0xef, 0xf0, 0xf4,
+ 0x16, 0xf0, 0xb0, 0x75, 0x45, 0xf1, 0xe0, 0x01, 0x04, 0x02, 0xf1, 0x01,
+ 0x12, 0x32, 0x01, 0xe0,
+ 0xef, 0x3f, 0xbe, 0xdb, 0x50, 0x00, 0xed, 0xea, 0x50, 0x0f, 0xad, 0x0f,
+ 0x20, 0x00, 0x0a, 0x3d,
+ 0x4b, 0x0d, 0x2e, 0xfe, 0xee, 0xeb, 0x0f, 0x5f, 0xdd, 0xfb, 0x2e, 0x2e,
+ 0x0e, 0x9c, 0x0d, 0xfc,
+ 0x0c, 0xfd, 0x2d, 0x2f, 0xff, 0xcf, 0xfd, 0xdc, 0xec, 0x0e, 0x2c, 0xbc,
+ 0x1e, 0x6f, 0x0e, 0xfe,
+ 0x1d, 0x3d, 0xfd, 0x3f, 0x60, 0xf0, 0xf0, 0x0d, 0x2d, 0x40, 0xe0, 0xa8,
+ 0x0f, 0x40, 0x00, 0xdd,
+ 0x0d, 0x00, 0x01, 0xee, 0xcd, 0x00, 0x34, 0x26, 0x02, 0x03, 0xe1, 0x31,
+ 0x00, 0x8c, 0x0e, 0x00,
+ 0x10, 0x00, 0x04, 0xe1, 0x0f, 0x2e, 0x60, 0x03, 0xde, 0x08, 0x00, 0x05,
+ 0x02, 0xd2, 0x02, 0x04,
+ 0xf3, 0xd3, 0x03, 0x02, 0x00, 0x10, 0x70, 0x5f, 0x0e, 0x3d, 0x60, 0x0c,
+ 0xee, 0xe0, 0xef, 0xfd,
+ 0xd8, 0xea, 0xed, 0x2c, 0x1c, 0x0c, 0xdc, 0xbe, 0x1d, 0x4d, 0x5b, 0x5e,
+ 0x0e, 0xec, 0x0d, 0x4f,
+ 0x0d, 0xfd, 0x0c, 0x6f, 0x0e, 0xed, 0xfd, 0x20, 0x00, 0xff, 0xd0, 0x16,
+ 0x13, 0x01, 0xb1, 0x00,
+ 0x03, 0x25, 0xe2, 0xc1, 0x23, 0x23, 0x02, 0x12, 0x14, 0xc2, 0xe2, 0x02,
+ 0x44, 0x55, 0xf2, 0x02,
+ 0x76, 0x13, 0x00, 0xf1, 0x33, 0x04, 0xc3, 0xc2, 0xf2, 0xf4, 0x02, 0xd1,
+ 0x00, 0x54, 0x05, 0xb2,
+ 0x03, 0x04, 0x12, 0x33, 0x04, 0x24, 0x34, 0xe1, 0xc2, 0xf3, 0xd4, 0x01,
+ 0xd1, 0x10, 0x70, 0x6f,
+ 0xdd, 0xfd, 0xfe, 0x0e, 0xec, 0xfd, 0x00, 0x02, 0x03, 0x02, 0x21, 0x0e,
+ 0xf8, 0x4e, 0x7f, 0x20,
+ 0x00, 0x02, 0x56, 0x22, 0x01, 0xd1, 0xf2, 0x02, 0x20, 0x10, 0x20, 0x0f,
+ 0x1d, 0x0b, 0xad, 0xcb,
+ 0xfc, 0x0d, 0x0d, 0xec, 0x0b, 0xcd, 0xbc, 0xdc, 0x0e, 0x1e, 0x0d, 0x0d,
+ 0x6f, 0x3e, 0x0f, 0xee,
+ 0x0f, 0x40, 0x00, 0x0f, 0xe0, 0x12, 0x76, 0x01, 0x00, 0x31, 0xf0, 0xcf,
+ 0x0b, 0xee, 0x0e, 0x0d,
+ 0x0d, 0x0c, 0x0f, 0xed, 0xca, 0x2f, 0x40, 0xe0, 0x9e, 0x0d, 0x02, 0x24,
+ 0xe1, 0x01, 0x34, 0xf2,
+ 0x01, 0x22, 0x22, 0xaf, 0xe8, 0x1e, 0x5f, 0x0f, 0x2f, 0xde, 0xbe, 0xf2,
+ 0x07, 0xa2, 0xf1, 0xf4,
+ 0x14, 0x12, 0x01, 0x02, 0x23, 0x22, 0x73, 0x26, 0x02, 0x00, 0x12, 0xf3,
+ 0xf3, 0xe1, 0x11, 0x47,
+ 0xe1, 0xb0, 0x00, 0x30, 0x00, 0xef, 0x0d, 0x0d, 0x1c, 0xed, 0x3c, 0x6c,
+ 0x0b, 0x0d, 0xfb, 0x1f,
+ 0x1e, 0x0d, 0xfd, 0x4f, 0x40, 0xf0, 0x00, 0x32, 0xc2, 0x02, 0xf7, 0xe3,
+ 0xe5, 0xb2, 0x02, 0x22,
+ 0x63, 0x52, 0x12, 0xe3, 0xc3, 0xf4, 0x13, 0x02, 0xe0, 0x10, 0x30, 0x33,
+ 0xf7, 0x13, 0x23, 0xf3,
+ 0x33, 0x73, 0x23, 0x05, 0x04, 0xb3, 0xd1, 0xb1, 0xf1, 0xe2, 0xd1, 0x02,
+ 0x15, 0x33, 0xc2, 0xf1,
+ 0x02, 0x12, 0xa1, 0xf3, 0x17, 0x16, 0x02, 0x03, 0x13, 0x22, 0x00, 0x00,
+ 0x41, 0x40, 0xff, 0x1e,
+ 0x70, 0x10, 0xf0, 0xcd, 0xed, 0xed, 0xd9, 0xfd, 0x0c, 0x2f, 0x2e, 0x0d,
+ 0xfe, 0x30, 0x70, 0x21,
+ 0x33, 0x03, 0x01, 0xef, 0x0a, 0x1c, 0x09, 0xfc, 0x7e, 0x5e, 0x2e, 0x2f,
+ 0x0f, 0x1d, 0x0e, 0x0b,
+ 0xbd, 0xfd, 0xee, 0xbe, 0xfb, 0xee, 0x0f, 0x0e, 0xeb, 0xfc, 0x4e, 0x0d,
+ 0xbc, 0x2d, 0x1f, 0x10,
+ 0x1f, 0x3e, 0x7f, 0x50, 0x00, 0xfe, 0xee, 0xfd, 0x0d, 0x0c, 0x0b, 0x0d,
+ 0x2c, 0x2e, 0x9a, 0xee,
+ 0x0f, 0x20, 0xf0, 0xdf, 0x40, 0x31, 0x23, 0xf2, 0xe5, 0xd4, 0xd6, 0xe2,
+ 0x02, 0x03, 0x02, 0x22,
+ 0x32, 0x71, 0x72, 0x24, 0x01, 0x02, 0x33, 0x05, 0xb3, 0xd3, 0xf4, 0xb3,
+ 0xd3, 0xe4, 0xf4, 0xe3,
+ 0xf3, 0x14, 0x02, 0x53, 0x33, 0x13, 0x04, 0x64, 0x24, 0x13, 0x03, 0x01,
+ 0x03, 0xf3, 0xd2, 0x05,
+ 0xd3, 0x94, 0x02, 0x02, 0x01, 0x12, 0x22, 0x13, 0x03, 0xb3, 0xd0, 0xf0,
+ 0x1e, 0x6a, 0x1e, 0x5c,
+ 0x1b, 0xee, 0xee, 0xfd, 0xfd, 0x0b, 0x2d, 0x3f, 0x3f, 0x00, 0xc3, 0xe3,
+ 0xf3, 0x24, 0x42, 0x04,
+ 0x04, 0xf3, 0xe4, 0x03, 0x05, 0x81, 0x91, 0x00, 0x01, 0x02, 0x04, 0x33,
+ 0x72, 0x02, 0xe3, 0x02,
+ 0x11, 0x22, 0x11, 0xe0, 0xfd, 0x01, 0xf0, 0xa8, 0xf9, 0x0e, 0x0d, 0xeb,
+ 0x0e, 0x0d, 0x0e, 0x0f,
+ 0xee, 0xee, 0xde, 0x0f, 0x20, 0x4e, 0x0c, 0x4e, 0x2e, 0x1e, 0x0b, 0xfe,
+ 0xbf, 0xfe, 0x1e, 0x71,
+ 0x02, 0xb0, 0xea, 0xed, 0x1e, 0xfc, 0xcc, 0x0e, 0x2f, 0x3f, 0x1f, 0x4f,
+ 0x1e, 0x0c, 0xfc, 0x0e,
+ 0x3c, 0x6d, 0x0e, 0x0f, 0xfd, 0x3c, 0x7d, 0x5a, 0x0c, 0x3d, 0x0b, 0xee,
+ 0x0d, 0xee, 0xfd, 0x0d,
+ 0x1b, 0x4e, 0x0d, 0xdd, 0x8d, 0x0c, 0x0e, 0xed, 0xec, 0xec, 0x0d, 0x2e,
+ 0x1d, 0xdc, 0x0e, 0x5f,
+ 0x0e, 0x0d, 0x5e, 0x0b, 0x0c, 0x2d, 0x2f, 0xfe, 0xdc, 0x4f, 0x3f, 0xdd,
+ 0x9b, 0x1d, 0x2d, 0x0e,
+ 0xcb, 0x1e, 0x7f, 0x0f, 0xff, 0xf1, 0x03, 0x13, 0xf1, 0xe1, 0x02, 0xe7,
+ 0x03, 0xe2, 0x01, 0x30,
+ 0x70, 0x10, 0x0c, 0x0d, 0xdd, 0x0f, 0xff, 0xfe, 0xcc, 0xfd, 0x2e, 0xef,
+ 0x8c, 0xf3, 0x07, 0xe5,
+ 0xd0, 0x32, 0x74, 0x23, 0x02, 0x14, 0x02, 0xf2, 0x02, 0x02, 0xf1, 0x00,
+ 0x62, 0x12, 0x01, 0xd3,
+ 0x03, 0xe3, 0xd2, 0xf0, 0xf0, 0xd0, 0xfd, 0x1c, 0x2b, 0xdd, 0xfb, 0x3e,
+ 0x2a, 0x0d, 0x7c, 0x7d,
+ 0x7d, 0xfd, 0xfb, 0x0d, 0x0d, 0x0c, 0x0e, 0xff, 0x10, 0x52, 0x13, 0x02,
+ 0xc1, 0x14, 0x04, 0x02,
+ 0xe1, 0x11, 0x14, 0xc4, 0xe4, 0xf4, 0x03, 0xe2, 0x03, 0x34, 0x44, 0x54,
+ 0x24, 0x34, 0x13, 0x04,
+ 0xb2, 0x04, 0x24, 0x22, 0x02, 0x22, 0x42, 0xf2, 0xa0, 0xf1, 0x02, 0xf1,
+ 0xf2, 0x27, 0xf3, 0xa4,
+ 0xe2, 0xe2, 0x04, 0x02, 0x02, 0xf3, 0x43, 0x77, 0x02, 0xf2, 0x02, 0x53,
+ 0x03, 0xf2, 0xf2, 0xe1,
+ 0x01, 0xd1, 0xf0, 0xe1, 0xd0, 0x3f, 0x5f, 0x0c, 0xed, 0xe0, 0x03, 0xc2,
+ 0xf0, 0x10, 0x40, 0x0e,
+ 0x30, 0x47, 0xf5, 0xd1, 0x22, 0x62, 0x21, 0x10, 0x41, 0x14, 0x13, 0x04,
+ 0x04, 0x43, 0x03, 0xe2,
+ 0xd2, 0xf1, 0xdf, 0xca, 0x9d, 0xeb, 0xff, 0xed, 0xba, 0x0f, 0x0e, 0xee,
+ 0xfd, 0x0c, 0x2d, 0x3d,
+ 0x7e, 0x1d, 0x2e, 0x1e, 0x00, 0xfe, 0x0d, 0x4f, 0x0e, 0xcc, 0xef, 0x0f,
+ 0x3b, 0x1b, 0x7d, 0x1c,
+ 0x1d, 0x0e, 0xd0, 0xa0, 0xfe, 0x0d, 0x1f, 0xf0, 0xf0, 0xf1, 0x05, 0xc3,
+ 0xf0, 0x0c, 0x0b, 0x6d,
+ 0x4e, 0x3f, 0x20, 0x0c, 0x0d, 0xde, 0xcc, 0xcc, 0xfc, 0xee, 0xf0, 0xe3,
+ 0x06, 0xd2, 0xd2, 0xe4,
+ 0xe3, 0x03, 0x55, 0x44, 0x63, 0x14, 0x22, 0x03, 0xf2, 0xe1, 0x12, 0x43,
+ 0x13, 0x03, 0x02, 0xf3,
+ 0xd1, 0xc0, 0xc0, 0xad, 0xfc, 0x0f, 0x20, 0x0e, 0xec, 0x1c, 0x6a, 0x1c,
+ 0x0b, 0x0c, 0x0d, 0x0d,
+ 0x0b, 0x1d, 0x0d, 0xdd, 0xfe, 0x2d, 0x7d, 0x2c, 0x4f, 0x0f, 0x20, 0x2f,
+ 0x00, 0xc3, 0xc2, 0xd1,
+ 0xe3, 0x17, 0x03, 0xc2, 0xe1, 0x00, 0xf0, 0x50, 0x30, 0x20, 0x33, 0x37,
+ 0x46, 0xd2, 0xf2, 0x73,
+ 0x73, 0x03, 0xf1, 0xf2, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x2f, 0x0d, 0xdd,
+ 0xf0, 0x8f, 0xcc, 0x00,
+ 0xe5, 0xe4, 0x03, 0x14, 0x54, 0x11, 0x12, 0xf4, 0xf5, 0xf2, 0xe1, 0x01,
+ 0x41, 0x41, 0xf0, 0xcf,
+ 0x00, 0xff, 0x20, 0x0e, 0xfb, 0x0e, 0xec, 0x2f, 0x10, 0xdf, 0x8c, 0x0f,
+ 0x10, 0x00, 0x9c, 0x0d,
+ 0xfb, 0x1c, 0x0b, 0x0d, 0x4d, 0x3e, 0x0d, 0x0e, 0x4e, 0x0a, 0x2d, 0x2c,
+ 0x6d, 0x1e, 0xeb, 0xfd,
+ 0x0e, 0x3d, 0x1c, 0x0b, 0x0d, 0xbe, 0xbe, 0xec, 0xed, 0xed, 0xfb, 0x1d,
+ 0x5c, 0x1d, 0x3e, 0x0d,
+ 0xce, 0x0e, 0xed, 0x0d, 0x2c, 0x4d, 0x0e, 0xde, 0x2e, 0x2e, 0xea, 0xfd,
+ 0x2d, 0x6e, 0x1d, 0x2d,
+ 0x6d, 0x2e, 0x0d, 0xbe, 0xdd, 0xff, 0x0f, 0xd0, 0xe2, 0xf3, 0x46, 0x33,
+ 0x02, 0x24, 0x43, 0x43,
+ 0x24, 0x53, 0x35, 0xf3, 0xc2, 0x03, 0xe4, 0x03, 0xe1, 0xe4, 0xf5, 0xd3,
+ 0xe2, 0x06, 0xb3, 0xb2,
+ 0xf3, 0x14, 0x03, 0xc1, 0x22, 0x53, 0x04, 0x02, 0x22, 0x22, 0x12, 0xd0,
+ 0x0f, 0x41, 0x26, 0xc1,
+ 0xc1, 0xf2, 0x06, 0xb3, 0x03, 0x14, 0x43, 0x33, 0x13, 0x04, 0xe2, 0x02,
+ 0x11, 0xf1, 0xaf, 0x0e,
+ 0x0e, 0x2d, 0x0d, 0xa8, 0x2d, 0x6d, 0x2b, 0x0d, 0x0d, 0xfe, 0xf0, 0x10,
+ 0x02, 0xd2, 0xf2, 0x02,
+ 0x20, 0x00, 0xa2, 0xd5, 0xf3, 0x05, 0x45, 0x33, 0x63, 0x03, 0xf3, 0xe6,
+ 0x13, 0x03, 0xc3, 0x24,
+ 0x02, 0x33, 0x43, 0x23, 0x23, 0x03, 0xe3, 0xc2, 0x01, 0xf1, 0x01, 0x01,
+ 0x26, 0x00, 0x10, 0x00,
+ 0x4a, 0x21, 0x84, 0x10, 0xe1, 0x1f, 0xd1, 0x10, 0xc0, 0xdd, 0xb9, 0x02,
+ 0xe7, 0x02, 0x0f, 0xbe,
+ 0x00, 0x15, 0x20, 0x00, 0x00, 0x61, 0x00, 0xc0, 0xde, 0x0b, 0x1c, 0x1f,
+ 0x50, 0x00, 0x9e, 0x00,
+ 0xf7, 0x12, 0x0d, 0xde, 0x24, 0x25, 0xe0, 0xb0, 0x00, 0x11, 0x0e, 0x0b,
+ 0x10, 0x3f, 0x41, 0x04,
+ 0x00, 0x4d, 0x0c, 0x0f, 0x00, 0x71, 0x53, 0x2e, 0x0c, 0x30, 0x01, 0xd0,
+ 0xe1, 0x00, 0x00, 0xeb,
+ 0xc0, 0x04, 0x0e, 0xeb, 0xbe, 0xf0, 0xe1, 0xc0, 0x02, 0x72, 0x16, 0x34,
+ 0x01, 0xdf, 0xfe, 0xef,
+ 0xee, 0x00, 0x00, 0x19, 0x3e, 0x40, 0x11, 0x33, 0x4e, 0x0d, 0x22, 0x62,
+ 0x12, 0x05, 0xd4, 0x00,
+ 0xcf, 0xce, 0xc0, 0xf7, 0xf3, 0x01, 0x3f, 0x2e, 0x51, 0x00, 0xd0, 0x10,
+ 0x42, 0x2c, 0x00, 0x35,
+ 0xe6, 0xa0, 0xfe, 0xe0, 0x03, 0xef, 0xda, 0xe0, 0xd0, 0xa0, 0xee, 0xd0,
+ 0xf3, 0x04, 0x00, 0x3d,
+ 0x73, 0x74, 0x1f, 0x0b, 0x11, 0x12, 0x00, 0xf9, 0xff, 0xe0, 0xe2, 0xe5,
+ 0x00, 0xe0, 0x0e, 0x0e,
+ 0x4e, 0x30, 0xd3, 0xa2, 0x02, 0x23, 0xfd, 0xc8, 0x1f, 0x4d, 0x0e, 0xee,
+ 0xef, 0xef, 0xef, 0x0e,
+ 0x70, 0x47, 0x43, 0x21, 0x13, 0x12, 0x00, 0xcd, 0x00, 0x21, 0x14, 0xd1,
+ 0xd0, 0x10, 0x35, 0xfd,
+ 0x30, 0x60, 0xe7, 0xb4, 0xef, 0x0f, 0x1f, 0x20, 0x12, 0x33, 0x43, 0xfe,
+ 0xfb, 0x10, 0x70, 0x3a,
+ 0xff, 0xff, 0xf0, 0xff, 0xe0, 0xc1, 0xb0, 0x0f, 0xf0, 0x04, 0xef, 0xe0,
+ 0xf4, 0xf6, 0x00, 0x00,
+ 0x3f, 0x72, 0x40, 0xd0, 0xd7, 0xe3, 0x0f, 0xfa, 0xef, 0xf0, 0x60, 0x22,
+ 0x30, 0x50, 0xfd, 0xbf,
+ 0xfd, 0xb0, 0x00, 0xe5, 0x0f, 0x0d, 0x32, 0x20, 0xdd, 0xb0, 0xf5, 0xd1,
+ 0xf1, 0x0f, 0x1c, 0x20,
+ 0x60, 0x03, 0x30, 0x08, 0x3f, 0x20, 0x4f, 0x41, 0x34, 0x43, 0x30, 0x1d,
+ 0xee, 0xbc, 0xf0, 0xed,
+ 0xec, 0xbd, 0x0d, 0x2a, 0xf1, 0xaf, 0xfc, 0x1e, 0x10, 0xff, 0x02, 0x24,
+ 0xe0, 0xb0, 0x0f, 0xf1,
+ 0xd4, 0xdf, 0x0f, 0x72, 0x36, 0x20, 0x10, 0x2e, 0x1f, 0x1c, 0x0c, 0x0d,
+ 0xff, 0xe2, 0xb3, 0xc4,
+ 0xd7, 0xe3, 0xd1, 0x01, 0x10, 0x6f, 0x1d, 0x02, 0xe3, 0x09, 0x3d, 0x7a,
+ 0x2e, 0x20, 0xf0, 0xf2,
+ 0x03, 0x52, 0x0a, 0xdc, 0xf0, 0x14, 0xf0, 0x9f, 0xc0, 0xe5, 0xe4, 0xf0,
+ 0x0f, 0x2d, 0x40, 0x11,
+ 0x01, 0xe3, 0xe1, 0x0f, 0x11, 0x55, 0x31, 0x21, 0xef, 0xdf, 0x01, 0x00,
+ 0x0f, 0x23, 0x35, 0xc0,
+ 0x11, 0x02, 0xff, 0x18, 0x2d, 0xef, 0x80, 0xdc, 0x0e, 0xff, 0xed, 0x29,
+ 0x7f, 0x7f, 0x11, 0x03,
+ 0x00, 0x00, 0x01, 0xf2, 0x0f, 0x20, 0x03, 0x17, 0x07, 0xf1, 0x00, 0x30,
+ 0x6f, 0xff, 0xe0, 0xf0,
+ 0xf0, 0xe1, 0xd2, 0xf0, 0xfd, 0xee, 0x8f, 0x04, 0x33, 0x26, 0x71, 0x0e,
+ 0x0e, 0x00, 0x24, 0x41,
+ 0x20, 0x0f, 0x33, 0x00, 0xb8, 0xee, 0xff, 0xee, 0xfc, 0x00, 0x43, 0x54,
+ 0xff, 0xcf, 0xe1, 0xe7,
+ 0xc0, 0xfd, 0x11, 0x32, 0xf0, 0xee, 0x00, 0x02, 0xef, 0xba, 0xff, 0x0f,
+ 0x10, 0x31, 0x22, 0x41,
+ 0x22, 0xfc, 0xbb, 0x00, 0x12, 0x56, 0x01, 0xd2, 0x0f, 0x0e, 0x8d, 0xec,
+ 0xc0, 0x00, 0xf0, 0x1f,
+ 0x1b, 0x10, 0x12, 0x41, 0x10, 0x5f, 0x33, 0x54, 0x01, 0x22, 0xf0, 0xee,
+ 0xe1, 0x00, 0xf8, 0x09,
+ 0xd0, 0x10, 0xf0, 0x10, 0x60, 0x0f, 0x00, 0x20, 0x0f, 0x0d, 0xae, 0xf1,
+ 0xdf, 0xd2, 0xc4, 0xef,
+ 0xfe, 0x0d, 0x55, 0x33, 0x40, 0x01, 0x05, 0x44, 0x2f, 0x2b, 0x30, 0x31,
+ 0xf7, 0x82, 0xe1, 0x10,
+ 0x0f, 0x0d, 0x1f, 0x02, 0xf3, 0x91, 0xf0, 0x03, 0x13, 0x37, 0x23, 0x2e,
+ 0x6c, 0x1f, 0x20, 0x00,
+ 0x0e, 0xf7, 0x02, 0xf0, 0xe0, 0xc2, 0xd0, 0xfe, 0xfd, 0xe1, 0xe5, 0xf0,
+ 0xfe, 0xa0, 0x03, 0x13,
+ 0x4b, 0x6d, 0x1f, 0x00, 0xc0, 0xe3, 0x0d, 0xf8, 0xfb, 0xdf, 0x10, 0x70,
+ 0x27, 0x02, 0x00, 0xf0,
+ 0xfd, 0xf0, 0x01, 0x00, 0xa1, 0xe0, 0xf0, 0x0f, 0x0d, 0xfe, 0xde, 0x2c,
+ 0x7e, 0x1f, 0xf2, 0x15,
+ 0x3f, 0xed, 0xf1, 0x03, 0x53, 0x2f, 0x39, 0x30, 0x00, 0x90, 0xec, 0xff,
+ 0x10, 0x00, 0x12, 0x37,
+ 0x63, 0xe1, 0xa0, 0x00, 0x03, 0xf5, 0xe0, 0x3e, 0x30, 0x22, 0x12, 0x1f,
+ 0x2f, 0xd0, 0xc4, 0xf1,
+ 0x12, 0x5f, 0x2a, 0x3e, 0x4a, 0xef, 0xce, 0xef, 0xfd, 0x0d, 0x21, 0xe3,
+ 0xff, 0xee, 0xcf, 0xc0,
+ 0xd9, 0xef, 0xe2, 0xc7, 0x01, 0x10, 0x4f, 0xe0, 0x91, 0x04, 0xdf, 0x1d,
+ 0x50, 0x10, 0x00, 0xe1,
+ 0x0f, 0xe9, 0x05, 0x73, 0x40, 0x0d, 0xce, 0x00, 0xf7, 0xe1, 0xc1, 0xce,
+ 0xfc, 0xee, 0x0e, 0x0f,
+ 0xfe, 0x00, 0x22, 0x71, 0x40, 0x2d, 0x2c, 0x3e, 0x04, 0x16, 0x00, 0xfd,
+ 0x0e, 0x00, 0x40, 0x2d,
+ 0x1b, 0x00, 0xa3, 0xff, 0xfd, 0x2f, 0x1b, 0xdf, 0xa0, 0xe0, 0xb1, 0xd7,
+ 0xf7, 0x00, 0x00, 0x2e,
+ 0x10, 0x20, 0x30, 0x0f, 0x0f, 0x60, 0x00, 0x03, 0xf3, 0x20, 0x6f, 0x2e,
+ 0x40, 0x10, 0x0a, 0xc0,
+ 0xd6, 0xe3, 0x00, 0xbf, 0x0f, 0x30, 0x11, 0x13, 0x21, 0x3e, 0xe9, 0xb0,
+ 0x00, 0x61, 0x31, 0x00,
+ 0xf4, 0x16, 0x01, 0xbf, 0xef, 0x0f, 0xdf, 0xdd, 0xff, 0xf2, 0x16, 0xf1,
+ 0xe0, 0x0d, 0xee, 0x0d,
+ 0x50, 0x10, 0x03, 0x03, 0xfc, 0xeb, 0xc0, 0x02, 0x65, 0x72, 0x41, 0x10,
+ 0x0b, 0xe0, 0xe5, 0xd3,
+ 0xc0, 0x00, 0x0f, 0xfd, 0x00, 0xe0, 0xd0, 0xeb, 0xec, 0xde, 0x2b, 0x3f,
+ 0x70, 0x30, 0x70, 0x2f,
+ 0xe2, 0xd0, 0x0f, 0x1c, 0x11, 0x04, 0x3f, 0x7e, 0x7f, 0x01, 0xf1, 0xf8,
+ 0xf0, 0x02, 0xf1, 0x02,
+ 0xf0, 0x04, 0x32, 0x00, 0xa0, 0x01, 0xf2, 0x13, 0x37, 0x17, 0x12, 0xfe,
+ 0x00, 0x11, 0x11, 0x30,
+ 0x0f, 0x3e, 0x5f, 0x0e, 0xee, 0xf0, 0xe0, 0xc8, 0xe0, 0x10, 0x40, 0x10,
+ 0x00, 0xa2, 0xd7, 0xf0,
+ 0x2f, 0x4f, 0xe0, 0x00, 0x65, 0x02, 0x01, 0xb1, 0xfe, 0xff, 0x00, 0x4f,
+ 0x30, 0x00, 0xe2, 0xf1,
+ 0x1f, 0x6a, 0x2f, 0x0e, 0x0c, 0x02, 0x84, 0xe1, 0xdc, 0xea, 0xf0, 0xdf,
+ 0xe0, 0xe0, 0xfe, 0xff,
+ 0x10, 0x55, 0x21, 0x60, 0x20, 0x13, 0x23, 0x01, 0x0e, 0x0e, 0x24, 0x35,
+ 0x21, 0x61, 0x2e, 0x38,
+ 0x2c, 0x40, 0x2e, 0xf0, 0x9f, 0xdf, 0xff, 0x00, 0xd5, 0xe0, 0x0c, 0x0f,
+ 0xf0, 0x90, 0xe3, 0xf1,
+ 0xf0, 0x1d, 0x10, 0x44, 0x53, 0x12, 0x03, 0x1d, 0x18, 0x1e, 0x11, 0x00,
+ 0xfc, 0xf1, 0x37, 0x51,
+ 0xd0, 0xb0, 0xde, 0xc0, 0xf2, 0x00, 0x0e, 0x51, 0x05, 0x11, 0x11, 0x1f,
+ 0x41, 0x2f, 0x28, 0x30,
+ 0x00, 0xa1, 0xe0, 0xf0, 0xfe, 0xff, 0xe0, 0xf0, 0xf5, 0x21, 0x20, 0xc0,
+ 0x8e, 0xff, 0xee, 0xe0,
+ 0xec, 0x0b, 0x10, 0x03, 0x05, 0xc0, 0x10, 0x2f, 0x20, 0x12, 0x77, 0x57,
+ 0x11, 0x11, 0x00, 0x01,
+ 0xcf, 0xef, 0xfe, 0xe0, 0x0f, 0x4e, 0x0c, 0x2d, 0x2e, 0xf0, 0xe0, 0xe0,
+ 0xec, 0x0e, 0x52, 0x01,
+ 0x1e, 0x0d, 0x01, 0xf3, 0x7f, 0x7d, 0x30, 0x04, 0xf0, 0x00, 0x10, 0xe3,
+ 0xe0, 0x0b, 0x31, 0x20,
+ 0x1f, 0xbf, 0xf6, 0x07, 0xe2, 0xa0, 0x0f, 0x3f, 0x51, 0x05, 0xc1, 0x01,
+ 0x0e, 0x1e, 0x50, 0x0d,
+ 0x2e, 0x10, 0x12, 0x25, 0x1e, 0xfe, 0xef, 0x0c, 0x00, 0x0f, 0xd5, 0xe0,
+ 0xa0, 0xe0, 0xd4, 0xd2,
+ 0x43, 0x52, 0xd1, 0xc6, 0xf3, 0xc0, 0xcd, 0x0f, 0x00, 0xf2, 0xed, 0x0a,
+ 0x00, 0x72, 0x00, 0x3e,
+ 0x3e, 0x31, 0x17, 0x01, 0xeb, 0xfd, 0x9e, 0xf0, 0xb0, 0xe3, 0xe7, 0xc0,
+ 0x0f, 0x0e, 0x2c, 0x1f,
+ 0x2f, 0x20, 0x0f, 0xc3, 0x04, 0xdf, 0x0f, 0x33, 0x24, 0x61, 0x4e, 0x2c,
+ 0x30, 0x10, 0x2d, 0x2b,
+ 0x3d, 0x4e, 0x61, 0x22, 0x0f, 0xc8, 0xcb, 0xf0, 0x00, 0xaf, 0xe0, 0x01,
+ 0x03, 0x01, 0x04, 0x03,
+ 0x0f, 0x1f, 0x0d, 0x60, 0x42, 0x19, 0x0c, 0x20, 0x01, 0xf3, 0x00, 0x40,
+ 0x13, 0xfe, 0xb9, 0xe0,
+ 0xd4, 0xe3, 0xbb, 0xff, 0xf0, 0xf1, 0x12, 0x71, 0x44, 0x01, 0x11, 0xee,
+ 0x0f, 0xfe, 0xff, 0x00,
+ 0x46, 0x21, 0x40, 0xe0, 0xd0, 0x0e, 0xf3, 0x17, 0x14, 0x20, 0x13, 0x03,
+ 0xe1, 0x8d, 0xcc, 0xf0,
+ 0xd0, 0xe3, 0xe2, 0x0a, 0x2b, 0x60, 0x2f, 0x10, 0x02, 0xf3, 0x12, 0x30,
+ 0x00, 0x07, 0xc3, 0x00,
+ 0x00, 0x0d, 0x0f, 0xef, 0x00, 0x40, 0xe5, 0x8f, 0xca, 0xef, 0x0f, 0x0e,
+ 0x1d, 0x1f, 0xf2, 0xe1,
+ 0x6e, 0x1c, 0x0f, 0x11, 0x65, 0x21, 0x00, 0xe0, 0x0e, 0x1f, 0x2d, 0x09,
+ 0x0d, 0x1c, 0x0f, 0xe0,
+ 0x80, 0x00, 0xe0, 0xe3, 0xf4, 0x22, 0x15, 0xd3, 0xb4, 0x13, 0x24, 0x10,
+ 0xe0, 0x03, 0x22, 0x52,
+ 0x30, 0x4d, 0x0a, 0x20, 0x1e, 0xec, 0xdc, 0x0f, 0x7e, 0x2b, 0x1e, 0x3e,
+ 0xe0, 0xb5, 0xf6, 0x11,
+ 0x30, 0xed, 0xee, 0xdc, 0x80, 0xce, 0xb0, 0xf2, 0x00, 0xee, 0xf0, 0x1f,
+ 0x5f, 0x3d, 0x21, 0x23,
+ 0x04, 0xf4, 0xd0, 0xad, 0x02, 0x07, 0xe4, 0xe0, 0xe0, 0xf0, 0xfd, 0xdd,
+ 0xef, 0xc4, 0xe3, 0xec,
+ 0x30, 0x47, 0x26, 0x10, 0xff, 0xce, 0x00, 0x3d, 0x4f, 0x5f, 0x30, 0x63,
+ 0x1f, 0x20, 0x30, 0x48,
+ 0x40, 0x0e, 0x41, 0x00, 0x00, 0xfe, 0xf0, 0xc1, 0x02, 0x00, 0xa0, 0xe2,
+ 0xe5, 0x10, 0x01, 0xe0,
+ 0xb0, 0x0e, 0xfb, 0x3e, 0x60, 0x27, 0x34, 0x0f, 0x3c, 0x0d, 0xd0, 0xa0,
+ 0x01, 0x00, 0x0d, 0xe1,
+ 0xf1, 0x0e, 0xee, 0xe4, 0x17, 0x22, 0x13, 0x40, 0x72, 0x76, 0x02, 0xe3,
+ 0x0e, 0x18, 0x00, 0xff,
+ 0x00, 0x1f, 0x00, 0x02, 0x02, 0x0f, 0x4f, 0x01, 0xd5, 0xe2, 0xf1, 0xa0,
+ 0xef, 0xc2, 0x02, 0x0b,
+ 0x0b, 0x0e, 0x0f, 0x00, 0x00, 0xd5, 0x30, 0x71, 0x4f, 0xf0, 0xf2, 0x04,
+ 0x43, 0x01, 0xf1, 0x01,
+ 0x60, 0x10, 0x02, 0xc0, 0x0f, 0xed, 0xec, 0xec, 0xec, 0xee, 0xf0, 0xd6,
+ 0xd0, 0x1b, 0x1f, 0xf0,
+ 0xd3, 0x70, 0x7f, 0x10, 0x06, 0x1f, 0x2c, 0x3e, 0xf0, 0xfe, 0x0c, 0x2e,
+ 0x30, 0xe0, 0xfe, 0xf9,
+ 0xf0, 0xa0, 0xe2, 0xe4, 0xd3, 0xc1, 0x11, 0x11, 0xe0, 0x15, 0x42, 0x54,
+ 0x55, 0x12, 0x01, 0x10,
+ 0x4e, 0x5f, 0x40, 0x01, 0xde, 0xec, 0x0f, 0x10, 0xd0, 0xde, 0x6f, 0x50,
+ 0x2e, 0x0c, 0x06, 0xe5,
+ 0xe0, 0xc0, 0xef, 0xe0, 0xe5, 0xe1, 0x00, 0x2d, 0x20, 0x51, 0x41, 0x10,
+ 0x19, 0x10, 0x30, 0x04,
+ 0xd5, 0x10, 0x41, 0x00, 0xce, 0xce, 0xed, 0xf0, 0xef, 0xd9, 0xc0, 0xbf,
+ 0xdf, 0xff, 0xed, 0xcd,
+ 0xcf, 0xf0, 0x02, 0x03, 0xd1, 0x8f, 0x02, 0x07, 0x26, 0x21, 0x30, 0x70,
+ 0x2d, 0x01, 0x00, 0x2e,
+ 0x1d, 0x0c, 0x21, 0x32, 0x72, 0x2c, 0xfe, 0xc0, 0xe2, 0xe5, 0xe0, 0xde,
+ 0xed, 0xf0, 0xf3, 0x32,
+ 0x1f, 0xcb, 0xed, 0x18, 0x4d, 0x7f, 0x11, 0x35, 0x10, 0xef, 0xfd, 0xe0,
+ 0xff, 0xd0, 0xff, 0xf0,
+ 0xd1, 0xb7, 0x00, 0x50, 0x0e, 0x00, 0x54, 0x14, 0xf3, 0xe0, 0xff, 0x1e,
+ 0x20, 0x10, 0x2c, 0x4b,
+ 0x70, 0x1e, 0x0e, 0x1e, 0x35, 0x03, 0xd0, 0xef, 0xb3, 0xc3, 0xdf, 0xe0,
+ 0x00, 0xd4, 0xff, 0x0d,
+ 0x10, 0xe4, 0x0e, 0x3d, 0xcd, 0xbc, 0xe0, 0x06, 0x37, 0x34, 0x20, 0x3e,
+ 0x0f, 0xb1, 0x25, 0x72,
+ 0x22, 0x10, 0xde, 0x2e, 0x3e, 0xc0, 0xb2, 0xff, 0xee, 0x0d, 0xf8, 0xde,
+ 0xdd, 0xf0, 0x0f, 0x10,
+ 0xef, 0xf1, 0xd2, 0xe0, 0x3d, 0x4c, 0x3d, 0x79, 0x70, 0x10, 0x02, 0xe2,
+ 0x0e, 0x1c, 0x1f, 0x0c,
+ 0xf0, 0x02, 0xf0, 0xb0, 0xc4, 0xd5, 0xf5, 0x01, 0x02, 0x53, 0x22, 0x44,
+ 0x31, 0x12, 0x00, 0xdd,
+ 0x0f, 0xee, 0x00, 0x20, 0x1d, 0x70, 0x37, 0x5d, 0x28, 0x20, 0x1f, 0x0f,
+ 0x00, 0x20, 0xe4, 0x84,
+ 0xd1, 0x10, 0xef, 0xaf, 0xff, 0xfd, 0x02, 0x00, 0x0d, 0x0f, 0x01, 0x03,
+ 0x30, 0x4f, 0x22, 0x37,
+ 0x31, 0x2c, 0xfe, 0x8e, 0xc1, 0x00, 0xff, 0x02, 0x26, 0x00, 0x0d, 0xc8,
+ 0xe0, 0xcf, 0xf0, 0xef,
+ 0xed, 0x00, 0x03, 0x22, 0x04, 0xb1, 0xef, 0xfc, 0x00, 0xd0, 0x33, 0x72,
+ 0x44, 0x20, 0x20, 0x4b,
+ 0x2d, 0x4e, 0x2b, 0x20, 0x00, 0x12, 0x00, 0xdd, 0xea, 0x0e, 0xfb, 0x8f,
+ 0x80, 0x03, 0x04, 0x00,
+ 0xfd, 0x0d, 0x4f, 0x10, 0x22, 0x00, 0x29, 0xf0, 0xf2, 0xf2, 0x0e, 0x0c,
+ 0xe0, 0xb0, 0x04, 0x21,
+ 0x00, 0x00, 0x06, 0xc4, 0xf3, 0x10, 0x30, 0xff, 0x8e, 0xe0, 0x03, 0x1d,
+ 0x2d, 0x2d, 0x60, 0x0f,
+ 0x1e, 0x0d, 0x20, 0x17, 0x07, 0x22, 0x00, 0x01, 0x00, 0x31, 0xe0, 0xa2,
+ 0x05, 0x03, 0x00, 0xed,
+ 0xbb, 0xe0, 0x00, 0x50, 0x00, 0xf5, 0xe0, 0x0c, 0xe0, 0xf0, 0x01, 0x70,
+ 0x50, 0x02, 0x14, 0xf2,
+ 0xd1, 0xd0, 0xe0, 0x2f, 0x3e, 0x1b, 0xcc, 0xe0, 0x02, 0xb6, 0xd1, 0xe1,
+ 0x1f, 0x4c, 0x20, 0x00,
+ 0x30, 0x00, 0xef, 0xae, 0xeb, 0xee, 0xf0, 0x50, 0x63, 0x2e, 0x4b, 0x10,
+ 0x2b, 0xee, 0xbf, 0xfa,
+ 0xfe, 0x00, 0x01, 0x05, 0xd1, 0x02, 0x30, 0x5e, 0xf1, 0xf2, 0x06, 0x31,
+ 0x00, 0xd0, 0x01, 0xd1,
+ 0xb1, 0xf4, 0x11, 0x7e, 0x5a, 0x1f, 0x20, 0x1f, 0x00, 0x0f, 0xd1, 0x02,
+ 0x53, 0x25, 0x00, 0xef,
+ 0xbe, 0xd0, 0xe3, 0xc0, 0xfa, 0x0f, 0x30, 0x0d, 0x3f, 0x20, 0xbe, 0xe8,
+ 0xfe, 0xfd, 0x0f, 0x11,
+ 0x00, 0x12, 0x04, 0xb4, 0xff, 0xc9, 0x10, 0x41, 0xd0, 0xa0, 0xf3, 0x05,
+ 0xf0, 0xbb, 0x0f, 0xf1,
+ 0x02, 0xc2, 0xe2, 0xe1, 0xfe, 0x0f, 0x31, 0x14, 0x10, 0x3e, 0x6f, 0x10,
+ 0x20, 0x4d, 0x49, 0x4f,
+ 0x4e, 0x5e, 0x10, 0x12, 0x1c, 0x0b, 0xf0, 0xc0, 0xf1, 0xe0, 0xdf, 0xeb,
+ 0xe0, 0x1d, 0x42, 0x56,
+ 0x02, 0x02, 0x21, 0x00, 0x3e, 0x1a, 0xef, 0xc0, 0xf0, 0x01, 0xfd, 0x2a,
+ 0x5e, 0x3d, 0x21, 0xf3,
+ 0xa0, 0xe0, 0xc6, 0xf0, 0x00, 0xee, 0xe0, 0xe0, 0x52, 0x33, 0x2d, 0x0f,
+ 0x21, 0x02, 0x0d, 0x7c,
+ 0x40, 0x32, 0x12, 0x07, 0xd5, 0xd2, 0xd1, 0xf2, 0x32, 0x7e, 0x2f, 0xf4,
+ 0xf5, 0xc0, 0xd0, 0xbf,
+ 0xe2, 0xf0, 0xed, 0x0a, 0x2f, 0x1f, 0xd0, 0x91, 0xff, 0xff, 0x00, 0x11,
+ 0x73, 0x57, 0x03, 0x15,
+ 0x20, 0xff, 0xfc, 0xd0, 0x01, 0xf3, 0xe3, 0x05, 0x50, 0x1f, 0x0a, 0x80,
+ 0xfe, 0xff, 0xf0, 0xd0,
+ 0xff, 0xfe, 0x01, 0x07, 0x20, 0x3f, 0x2d, 0x70, 0x60, 0x0f, 0x2d, 0xfd,
+ 0xec, 0xed, 0xee, 0x00,
+ 0x00, 0x0f, 0x48, 0x50, 0x10, 0xf3, 0xe2, 0xe2, 0x07, 0x13, 0x11, 0x22,
+ 0x24, 0xe1, 0xa1, 0xff,
+ 0xfd, 0x0f, 0x2e, 0x3b, 0x10, 0x72, 0x64, 0x01, 0x20, 0x1d, 0x1c, 0x00,
+ 0xd2, 0xe0, 0x01, 0x06,
+ 0xd0, 0xce, 0xfd, 0xde, 0xdf, 0xe0, 0x03, 0x05, 0xf1, 0x00, 0x4d, 0x3e,
+ 0x70, 0x26, 0x42, 0x12,
+ 0x04, 0xf1, 0xd1, 0xf0, 0xe1, 0x07, 0x12, 0x30, 0xfe, 0xca, 0xdf, 0x8f,
+ 0xef, 0xf1, 0xf2, 0x01,
+ 0xff, 0xda, 0xef, 0xaf, 0xc2, 0xe4, 0xd0, 0xfc, 0xdf, 0x0e, 0x01, 0x11,
+ 0x70, 0x74, 0x13, 0x2e,
+ 0x1b, 0x30, 0x00, 0xe0, 0x13, 0x02, 0x0e, 0xc9, 0xfd, 0xfc, 0xde, 0xdc,
+ 0x2f, 0x72, 0x25, 0xf3,
+ 0xc2, 0xfe, 0x0c, 0x0f, 0x1f, 0x2c, 0x5d, 0x1e, 0xdc, 0xdf, 0xee, 0x0f,
+ 0x5d, 0xfd, 0xff, 0xfd,
+ 0xff, 0xd7, 0xb7, 0xe1, 0xf0, 0xd0, 0x00, 0x2f, 0x60, 0x11, 0x04, 0x00,
+ 0x4d, 0x1c, 0xf0, 0xf0,
+ 0x3d, 0x7d, 0x54, 0xf3, 0xf0, 0x10, 0x25, 0xf1, 0xcf, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x1d, 0x00,
+ 0x6a, 0x25, 0x10, 0x15, 0x9e, 0x24, 0xa3, 0x15, 0x0e, 0x3c, 0xf9, 0x8f,
+ 0xcd, 0xdd, 0xcf, 0xef,
+ 0xf1, 0x02, 0x44, 0x00, 0xf1, 0xf4, 0xf0, 0x06, 0x22, 0x22, 0x21, 0x10,
+ 0xff, 0xb7, 0x03, 0x63,
+ 0x0e, 0x2d, 0x5e, 0x31, 0x26, 0xd0, 0x80, 0xfd, 0xe0, 0xd0, 0x00, 0x0f,
+ 0x0e, 0x0e, 0x3f, 0x4d,
+ 0x0c, 0xfb, 0x0e, 0x0f, 0x51, 0x14, 0x21, 0x10, 0x1f, 0x1b, 0x0e, 0xfc,
+ 0xef, 0x0d, 0x60, 0x40,
+ 0x26, 0x32, 0x00, 0xd2, 0xe1, 0xc3, 0xf7, 0xc2, 0xd1, 0xd0, 0xc0, 0xf0,
+ 0x15, 0x72, 0x1f, 0x1e,
+ 0x6f, 0x10, 0x1c, 0x1f, 0x30, 0x45, 0x21, 0x20, 0x1f, 0x1e, 0xe3, 0xc5,
+ 0xf3, 0xf0, 0xe1, 0xef,
+ 0xeb, 0xbd, 0xef, 0xdf, 0xcc, 0xc0, 0x00, 0xee, 0xe0, 0x15, 0x71, 0x42,
+ 0x11, 0x06, 0x03, 0x14,
+ 0x0f, 0xfc, 0xdf, 0xf0, 0x01, 0x20, 0xf0, 0xfa, 0xde, 0xcd, 0xb0, 0xf0,
+ 0xec, 0xfe, 0xa0, 0xd2,
+ 0xb1, 0xd2, 0xd4, 0xed, 0xeb, 0x00, 0x74, 0x22, 0x2d, 0x23, 0xf7, 0x05,
+ 0x1f, 0x1d, 0x5e, 0x10,
+ 0x31, 0x00, 0x12, 0x00, 0x00, 0xef, 0x0b, 0x1f, 0x0f, 0xf0, 0x00, 0xed,
+ 0x91, 0xf5, 0xdc, 0xec,
+ 0xde, 0x00, 0x70, 0x3f, 0x3b, 0x20, 0x2e, 0x0e, 0xfc, 0xe0, 0x07, 0xf1,
+ 0xe0, 0x11, 0x50, 0xf1,
+ 0xa2, 0xe2, 0xc1, 0xf5, 0x03, 0x2f, 0x4d, 0x21, 0x31, 0x50, 0xfe, 0xcd,
+ 0xfd, 0x3c, 0x4c, 0x12,
+ 0x47, 0x15, 0x00, 0xd0, 0x12, 0x21, 0x50, 0x20, 0x00, 0xd3, 0xb5, 0xe3,
+ 0xe1, 0x0f, 0x2d, 0x40,
+ 0x03, 0x50, 0x3a, 0xe0, 0xcd, 0xdd, 0xdc, 0xed, 0xf2, 0x07, 0x65, 0x21,
+ 0x50, 0x1e, 0x00, 0x20,
+ 0x0f, 0xde, 0xe0, 0x00, 0xe0, 0xa3, 0xe0, 0xdd, 0xcd, 0xe0, 0xed, 0x0d,
+ 0xf3, 0x07, 0x13, 0x40,
+ 0x41, 0x10, 0xfe, 0x0b, 0x4f, 0x00, 0x01, 0xcc, 0xfe, 0xfd, 0x3f, 0x3c,
+ 0x7e, 0x6a, 0x1e, 0x0d,
+ 0xf0, 0x05, 0x02, 0x06, 0x00, 0xfd, 0xbe, 0xd0, 0xd1, 0xc5, 0xe2, 0xe1,
+ 0xe1, 0x0f, 0x3d, 0x70,
+ 0x33, 0x55, 0x23, 0x11, 0x1e, 0x0f, 0x24, 0x10, 0x1e, 0x3d, 0x10, 0x04,
+ 0xd0, 0x9f, 0xfa, 0xd0,
+ 0xf0, 0xdf, 0x0f, 0xfe, 0xef, 0x0c, 0xbd, 0xee, 0x0f, 0x70, 0x5f, 0x0a,
+ 0xed, 0x01, 0xf6, 0xe0,
+ 0xf1, 0x01, 0x00, 0x20, 0x70, 0x00, 0x1e, 0xe1, 0xf7, 0xe7, 0xc1, 0xfe,
+ 0xed, 0x9f, 0xef, 0xe1,
+ 0xf1, 0xe0, 0xf0, 0x10, 0x01, 0x20, 0x16, 0x23, 0x60, 0x4e, 0x10, 0x21,
+ 0xde, 0x08, 0xef, 0x0e,
+ 0x1e, 0x3e, 0x7d, 0x2c, 0x0d, 0xeb, 0x00, 0xd2, 0x01, 0xe0, 0xe1, 0x45,
+ 0x60, 0x11, 0x0d, 0xaf,
+ 0xf2, 0xf1, 0xfd, 0x08, 0x30, 0x1f, 0x10, 0x02, 0xf1, 0x00, 0x10, 0x0e,
+ 0xe0, 0x24, 0x35, 0x05,
+ 0xb2, 0xd0, 0xfc, 0x1d, 0x3f, 0x1f, 0x4f, 0x0d, 0x00, 0xf0, 0xe0, 0xce,
+ 0xf1, 0x77, 0x53, 0x35,
+ 0x51, 0x00, 0xfd, 0xff, 0xf2, 0xf0, 0xef, 0xf1, 0x17, 0x27, 0xff, 0xee,
+ 0x10, 0x30, 0xf0, 0xff,
+ 0xf0, 0xc0, 0xb0, 0xc0, 0xf0, 0xe3, 0xf2, 0xb0, 0xfe, 0x0a, 0x2f, 0x51,
+ 0x03, 0x00, 0x31, 0x77,
+ 0x10, 0x1f, 0x0f, 0xe2, 0xd3, 0xd0, 0x00, 0xc0, 0xf5, 0xff, 0xff, 0xd1,
+ 0xf2, 0xc1, 0xe0, 0x33,
+ 0x07, 0x11, 0x0f, 0xfe, 0x2e, 0x2b, 0x3f, 0x1b, 0x3e, 0x40, 0x3e, 0x2b,
+ 0x6c, 0x4f, 0x0f, 0x0d,
+ 0x00, 0x31, 0xd0, 0x81, 0xd2, 0x06, 0x01, 0x00, 0xb0, 0xf2, 0x01, 0x11,
+ 0x33, 0x17, 0xff, 0x2e,
+ 0x50, 0x00, 0x15, 0x03, 0x44, 0x42, 0x4f, 0x1f, 0x40, 0x20, 0x0e, 0xf0,
+ 0xc6, 0xe2, 0xed, 0xfc,
+ 0xcf, 0xdc, 0xdf, 0x0d, 0x10, 0x14, 0x14, 0xd2, 0xf1, 0x02, 0x26, 0xf0,
+ 0xb1, 0x10, 0x7f, 0x42,
+ 0x24, 0x10, 0x2c, 0x30, 0x04, 0x12, 0x10, 0x5e, 0x0e, 0x0e, 0x8f, 0xd0,
+ 0xde, 0xee, 0xee, 0x0b,
+ 0x0d, 0xfe, 0xe0, 0xe0, 0xc3, 0xf5, 0xf0, 0x20, 0x62, 0x27, 0x43, 0x00,
+ 0x10, 0x2f, 0x0b, 0x0f,
+ 0x0e, 0x3f, 0x40, 0x00, 0xde, 0xee, 0x0e, 0x0a, 0x1f, 0x0d, 0x3f, 0x22,
+ 0xd7, 0xb6, 0x10, 0x0f,
+ 0x0f, 0xcf, 0x5e, 0x60, 0x20, 0x1e, 0x0c, 0xfd, 0xfe, 0xd0, 0xcd, 0xff,
+ 0x02, 0x17, 0x42, 0x2e,
+ 0x0c, 0x80, 0x01, 0x04, 0x00, 0xdf, 0xcd, 0x10, 0x02, 0x27, 0x02, 0x7f,
+ 0x2c, 0x0e, 0xf0, 0x01,
+ 0xf2, 0xf1, 0x17, 0x67, 0x00, 0x20, 0x0f, 0x20, 0xe0, 0x0f, 0xf0, 0xf0,
+ 0x0c, 0xef, 0xfd, 0xde,
+ 0xbd, 0x8e, 0xe0, 0xf1, 0xe3, 0xc3, 0xf5, 0xf0, 0x0e, 0x20, 0x47, 0x52,
+ 0x13, 0xf1, 0x02, 0x04,
+ 0x10, 0x00, 0x00, 0x01, 0xe2, 0x03, 0x05, 0xc1, 0xe3, 0x01, 0x3d, 0x3b,
+ 0x01, 0x23, 0x04, 0x91,
+ 0xe0, 0xfa, 0xeb, 0xed, 0xdf, 0x00, 0x20, 0x0d, 0x2e, 0x50, 0x6e, 0x4d,
+ 0x2b, 0x3b, 0x2e, 0xff,
+ 0x02, 0x13, 0xf3, 0xc1, 0xd0, 0xee, 0xdc, 0xe0, 0x05, 0xe6, 0xb2, 0xf0,
+ 0xe1, 0xde, 0xef, 0x5e,
+ 0x60, 0x20, 0x42, 0x42, 0x24, 0x04, 0x00, 0x02, 0x12, 0xf0, 0xf0, 0x0c,
+ 0x48, 0x20, 0x00, 0xa0,
+ 0x00, 0xd0, 0x11, 0x01, 0x52, 0x11, 0x04, 0xb1, 0xde, 0xe1, 0xf7, 0xc3,
+ 0x0f, 0x0e, 0x30, 0x67,
+ 0x22, 0x01, 0x00, 0x0f, 0x1e, 0x3e, 0x31, 0x35, 0x02, 0x9f, 0x0b, 0xfd,
+ 0xad, 0xf0, 0xed, 0xfd,
+ 0xd0, 0xe2, 0xd3, 0xe4, 0xff, 0xde, 0xf0, 0x25, 0x71, 0x33, 0x21, 0xff,
+ 0xee, 0xfb, 0x0e, 0x50,
+ 0x34, 0x5c, 0x1c, 0x1e, 0x0e, 0x11, 0xf3, 0xb0, 0xfc, 0xef, 0xd2, 0x06,
+ 0x02, 0x41, 0x0f, 0x6c,
+ 0x1d, 0x08, 0xff, 0x0f, 0xfe, 0xe0, 0x00, 0x05, 0x71, 0x31, 0x2e, 0x0c,
+ 0x00, 0x1f, 0x01, 0xe2,
+ 0xe0, 0xcf, 0xa0, 0xf1, 0x02, 0xf3, 0xd0, 0x0c, 0x0e, 0x3e, 0x30, 0xd0,
+ 0x22, 0x77, 0x70, 0x0e,
+ 0x00, 0xe0, 0xf2, 0x03, 0x03, 0x11, 0x3e, 0x61, 0x22, 0x01, 0x21, 0xf4,
+ 0xe5, 0xe3, 0xdf, 0xda,
+ 0x00, 0xe3, 0xc0, 0xee, 0xc0, 0xe3, 0xc0, 0xfe, 0x00, 0x53, 0x47, 0x15,
+ 0x40, 0x13, 0x02, 0x0f,
+ 0x00, 0x2f, 0xfe, 0xde, 0xfe, 0xd0, 0xd0, 0xe1, 0x24, 0x0e, 0xfb, 0xd1,
+ 0xf6, 0xb2, 0xe2, 0xe1,
+ 0xa0, 0xef, 0xb0, 0xe0, 0xfc, 0xfd, 0x1a, 0x4e, 0x4e, 0x3f, 0x1a, 0x0f,
+ 0x0e, 0x21, 0x2f, 0x6c,
+ 0x30, 0x4f, 0x10, 0x0f, 0xd1, 0x87, 0x04, 0xee, 0xed, 0xf0, 0xf0, 0xee,
+ 0x0d, 0xfe, 0xd0, 0xf0,
+ 0x14, 0x40, 0x60, 0x37, 0x36, 0x00, 0xf2, 0x0f, 0x1f, 0x00, 0x00, 0x53,
+ 0x30, 0x13, 0x2f, 0x08,
+ 0xef, 0x10, 0x00, 0xb0, 0xc0, 0x0e, 0x32, 0xf3, 0x9f, 0xfc, 0xde, 0x0c,
+ 0x1e, 0x4f, 0x11, 0x10,
+ 0xfb, 0xf0, 0x00, 0xf2, 0x6c, 0x4d, 0x10, 0x10, 0x00, 0xf1, 0x8e, 0xd9,
+ 0x0f, 0xb2, 0xf5, 0x00,
+ 0xe0, 0xf3, 0xf7, 0xf0, 0x0f, 0x01, 0xf2, 0xb0, 0xef, 0x02, 0x13, 0x73,
+ 0x1e, 0x3d, 0x0d, 0x2b,
+ 0x0b, 0x0e, 0xce, 0x0e, 0x0e, 0xf1, 0x07, 0xe0, 0x1e, 0x5f, 0x21, 0x30,
+ 0xec, 0x00, 0xff, 0x02,
+ 0x03, 0xf1, 0x3f, 0x2d, 0x72, 0x3f, 0x19, 0xff, 0xdf, 0x20, 0x12, 0x1e,
+ 0x1e, 0x0f, 0xf1, 0xf7,
+ 0xc7, 0xa0, 0xee, 0xf0, 0x1f, 0x2f, 0x50, 0x21, 0x11, 0x2f, 0x0e, 0xd1,
+ 0x01, 0xe0, 0xed, 0x57,
+ 0x53, 0x1e, 0x0f, 0x11, 0x31, 0x5f, 0x4e, 0x22, 0x05, 0x02, 0x04, 0x04,
+ 0xc0, 0xdd, 0xde, 0x0e,
+ 0x80, 0xee, 0xe1, 0xd6, 0xff, 0xff, 0x01, 0x14, 0x20, 0x4e, 0x32, 0x44,
+ 0x2f, 0x6d, 0x00, 0x05,
+ 0xd2, 0xad, 0x08, 0x0f, 0x00, 0x40, 0x1e, 0x40, 0xf1, 0xc6, 0x02, 0xc1,
+ 0x02, 0x05, 0x10, 0xf0,
+ 0xa1, 0x04, 0x12, 0xe0, 0xdd, 0xe0, 0xf0, 0x40, 0x4f, 0x1d, 0x0d, 0x0c,
+ 0x18, 0x2c, 0x2e, 0x4e,
+ 0x51, 0x31, 0x12, 0xee, 0xcf, 0xee, 0xdb, 0xcf, 0xbe, 0x01, 0x02, 0xf1,
+ 0xe0, 0x00, 0x20, 0x1d,
+ 0x36, 0x54, 0x42, 0x23, 0x03, 0x35, 0x23, 0x10, 0x0f, 0x5e, 0x40, 0x44,
+ 0x10, 0x20, 0x01, 0x04,
+ 0xe1, 0xdb, 0xbe, 0x11, 0x35, 0xe0, 0xde, 0xfe, 0x90, 0xe1, 0xcd, 0xdc,
+ 0xe3, 0xf6, 0x33, 0x76,
+ 0x51, 0x14, 0x10, 0x1e, 0x30, 0x20, 0x00, 0xf0, 0xf0, 0x03, 0x5f, 0x08,
+ 0x0e, 0x00, 0xef, 0xad,
+ 0xff, 0xc0, 0xe0, 0xc2, 0xd6, 0xe0, 0xe1, 0x03, 0x2f, 0x2c, 0x0d, 0x0d,
+ 0x0f, 0xdd, 0xdb, 0x1e,
+ 0x7e, 0x4f, 0x0e, 0xe2, 0x27, 0x14, 0xe0, 0xf0, 0x30, 0x1f, 0xd0, 0x43,
+ 0x42, 0xd1, 0x80, 0x0f,
+ 0x0e, 0x0c, 0xfe, 0x39, 0x5e, 0x20, 0xf4, 0x00, 0x2f, 0x2b, 0xf0, 0x00,
+ 0x42, 0xdf, 0x8d, 0x00,
+ 0x05, 0x00, 0xde, 0xf9, 0xff, 0xff, 0xf0, 0x00, 0x10, 0x42, 0x00, 0x12,
+ 0x03, 0x90, 0x00, 0x1d,
+ 0x2d, 0x00, 0x37, 0x72, 0x20, 0x0c, 0x10, 0x22, 0x60, 0x33, 0x54, 0x0d,
+ 0xd8, 0xfe, 0xd2, 0xe3,
+ 0xce, 0xcb, 0x0f, 0x1f, 0x10, 0x01, 0xe0, 0xe3, 0xe2, 0xf0, 0xd2, 0xe3,
+ 0x01, 0x70, 0x22, 0x15,
+ 0x12, 0x00, 0xee, 0x1f, 0x7f, 0x56, 0x05, 0xf1, 0x02, 0x00, 0xbf, 0xe3,
+ 0x05, 0xf0, 0x00, 0xf3,
+ 0x07, 0x42, 0xee, 0x9b, 0xf0, 0x0e, 0x2e, 0x00, 0x0c, 0x1f, 0x0d, 0x3e,
+ 0x5f, 0x40, 0x0e, 0x2d,
+ 0x0f, 0x0f, 0xc0, 0xf2, 0xe3, 0xdf, 0xb0, 0xf0, 0x04, 0xe2, 0xdf, 0x0c,
+ 0x0e, 0x00, 0xf5, 0xb4,
+ 0x12, 0x2e, 0x30, 0x57, 0x47, 0x50, 0x1f, 0x10, 0x21, 0x21, 0x01, 0xdf,
+ 0x0f, 0x50, 0x40, 0x21,
+ 0x13, 0x1d, 0x29, 0x0f, 0xaf, 0xff, 0xf0, 0xd1, 0xb4, 0xf2, 0xf0, 0x0c,
+ 0x00, 0x41, 0x00, 0x00,
+ 0xf3, 0xf7, 0xe4, 0xf0, 0x62, 0x60, 0x2f, 0x1e, 0x1e, 0x2f, 0x0e, 0xec,
+ 0xdd, 0xee, 0x9a, 0xea,
+ 0x00, 0xe1, 0xd1, 0x91, 0xf0, 0xe0, 0xf2, 0x0e, 0xfc, 0x0e, 0x00, 0x36,
+ 0x21, 0x00, 0x10, 0x5e,
+ 0x2f, 0x1e, 0x1f, 0x12, 0x46, 0x10, 0x10, 0xe2, 0xc1, 0xdf, 0xfd, 0xe2,
+ 0xc3, 0xe2, 0x00, 0x20,
+ 0x5e, 0x08, 0x0d, 0xfd, 0x7e, 0x4d, 0x0d, 0x00, 0x2f, 0xed, 0xd0, 0xd3,
+ 0x2f, 0x2d, 0x01, 0x41,
+ 0x2f, 0x72, 0x05, 0xbf, 0x0c, 0x00, 0x12, 0x01, 0x0c, 0x1e, 0x13, 0xa2,
+ 0xce, 0xed, 0xd2, 0xf4,
+ 0xfe, 0x2f, 0x70, 0x46, 0x11, 0x01, 0x11, 0x10, 0x20, 0x03, 0x17, 0x12,
+ 0xf0, 0xcc, 0xdf, 0x00,
+ 0xf2, 0xd1, 0x00, 0x30, 0x77, 0x36, 0xd1, 0xef, 0x0e, 0x20, 0xe2, 0x01,
+ 0x72, 0x0f, 0xff, 0x13,
+ 0x23, 0x01, 0x0c, 0x1f, 0x5f, 0x0f, 0x3f, 0x44, 0x37, 0xe1, 0xe3, 0x20,
+ 0x13, 0xe0, 0xa4, 0xd1,
+ 0xb1, 0xd3, 0xe3, 0xe0, 0xce, 0xc0, 0xfa, 0x0e, 0x5f, 0x10, 0x40, 0x09,
+ 0x0e, 0x10, 0x40, 0x3f,
+ 0x1c, 0x0e, 0x0f, 0x00, 0x14, 0x20, 0xdd, 0x89, 0xef, 0xf0, 0xef, 0xc1,
+ 0xe6, 0x02, 0x20, 0x0d,
+ 0x0c, 0x10, 0x70, 0x1f, 0xfe, 0xe0, 0xf1, 0xe4, 0x01, 0x54, 0x40, 0x61,
+ 0x13, 0x22, 0x05, 0xf5,
+ 0x03, 0x00, 0x0d, 0x00, 0x14, 0x22, 0xde, 0x89, 0xff, 0x0e, 0x10, 0xe0,
+ 0xdf, 0x1f, 0x01, 0xf7,
+ 0x02, 0x30, 0x40, 0xf0, 0x3c, 0x7e, 0x5e, 0xfc, 0xed, 0x0d, 0x00, 0x01,
+ 0xf0, 0xcd, 0xd0, 0xe3,
+ 0x91, 0xf3, 0xf4, 0x03, 0xe5, 0x02, 0xd2, 0xf0, 0xd1, 0xf1, 0xf0, 0xf3,
+ 0x10, 0x50, 0x10, 0x14,
+ 0x0b, 0x0b, 0x70, 0x61, 0x13, 0x10, 0x02, 0xf1, 0xfd, 0xcd, 0x0c, 0xed,
+ 0xfc, 0x0e, 0x0a, 0x20,
+ 0x10, 0x02, 0x11, 0x1c, 0x4d, 0x5f, 0x40, 0x51, 0x10, 0x14, 0x0e, 0xda,
+ 0xff, 0xd0, 0x00, 0x22,
+ 0x72, 0x3f, 0x0d, 0xfe, 0xed, 0xee, 0x0e, 0x2f, 0xcf, 0xbe, 0xe0, 0x00,
+ 0xbb, 0xea, 0xee, 0x10,
+ 0x10, 0x43, 0x62, 0x34, 0x00, 0x10, 0x23, 0x23, 0x3f, 0xec, 0x02, 0x07,
+ 0x00, 0xef, 0x10, 0x24,
+ 0x93, 0xdf, 0xec, 0xf1, 0xf2, 0xf2, 0x03, 0xf4, 0xb6, 0x03, 0xf0, 0x2f,
+ 0x30, 0x12, 0x40, 0x75,
+ 0xff, 0xc9, 0x00, 0x3f, 0x10, 0x2f, 0x1e, 0x2f, 0x31, 0x06, 0xd2, 0xa1,
+ 0x01, 0xd0, 0xc3, 0xe5,
+ 0xd2, 0xe2, 0xc2, 0xcf, 0xfb, 0x0f, 0x1d, 0xcf, 0xdb, 0x0f, 0x0e, 0xc2,
+ 0x27, 0x70, 0x7f, 0x4e,
+ 0x0e, 0xef, 0xff, 0x00, 0xf0, 0xeb, 0xef, 0x00, 0x1f, 0x1e, 0x0d, 0x0d,
+ 0x11, 0xc6, 0xd1, 0xf0,
+ 0x0d, 0xe0, 0xc2, 0xf3, 0x33, 0x67, 0x22, 0x30, 0x70, 0x2f, 0x00, 0xf2,
+ 0x04, 0x64, 0x25, 0x02,
+ 0x00, 0x10, 0x0c, 0x10, 0x0f, 0x2f, 0x0d, 0xfd, 0xdc, 0xcf, 0xbf, 0xd0,
+ 0xf2, 0xc2, 0xf2, 0xf4,
+ 0x03, 0x66, 0x22, 0x21, 0x22, 0x10, 0x2f, 0x3c, 0x62, 0x21, 0x0d, 0x00,
+ 0x13, 0x01, 0xbf, 0xdc,
+ 0xee, 0x0f, 0xf0, 0xe4, 0x97, 0xe7, 0xd0, 0xcf, 0xd0, 0xde, 0x0f, 0x0e,
+ 0x41, 0x10, 0x10, 0xfd,
+ 0xbf, 0x1f, 0x0e, 0x0d, 0x24, 0x56, 0x00, 0x03, 0xe0, 0xcd, 0x0d, 0x02,
+ 0x10, 0x00, 0xca, 0x1f,
+ 0x71, 0x71, 0x0d, 0xeb, 0x00, 0x30, 0x00, 0x02, 0xe1, 0xe0, 0x0c, 0xda,
+ 0x0f, 0x00, 0x60, 0x20,
+ 0x20, 0xff, 0x00, 0x3d, 0x0b, 0xac, 0xde, 0xde, 0xd9, 0x9e, 0xee, 0xf1,
+ 0xe0, 0x00, 0xf1, 0x12,
+ 0x32, 0x51, 0x26, 0x33, 0x01, 0x40, 0x23, 0x24, 0x41, 0x3b, 0x0e, 0x10,
+ 0x10, 0x45, 0xfd, 0xbc,
+ 0xd0, 0xe0, 0x0d, 0x0f, 0xbe, 0x00, 0x02, 0xf0, 0xc1, 0x02, 0xcb, 0xfa,
+ 0xe0, 0xbe, 0xf1, 0xd3,
+ 0xf1, 0x01, 0x72, 0x40, 0x2a, 0x20, 0x03, 0x02, 0x04, 0xd4, 0x07, 0x02,
+ 0x31, 0x10, 0xa0, 0xe0,
+ 0xe2, 0xd0, 0x90, 0xd1, 0xe1, 0xfe, 0x0e, 0x00, 0x2f, 0x62, 0x34, 0x2d,
+ 0x0b, 0x1e, 0x0b, 0x0d,
+ 0x0f, 0xff, 0x1f, 0x0d, 0x0e, 0x0f, 0x2b, 0xeb, 0xbf, 0x00, 0x00, 0x03,
+ 0xc0, 0xd1, 0xd1, 0xe6,
+ 0x03, 0xd0, 0xbc, 0x0f, 0x4f, 0x52, 0x13, 0x05, 0x36, 0x32, 0x1f, 0x60,
+ 0x27, 0x31, 0x41, 0x50,
+ 0x20, 0x30, 0xf0, 0xc0, 0x0b, 0xff, 0x0e, 0x10, 0x10, 0xd0, 0xc0, 0xc0,
+ 0xc1, 0x00, 0xee, 0xf0,
+ 0x37, 0x66, 0x20, 0x00, 0xe0, 0xd0, 0x10, 0x41, 0x3f, 0x50, 0x0d, 0x1f,
+ 0x33, 0xfd, 0xdb, 0xf1,
+ 0xe1, 0xf1, 0xfe, 0xdc, 0xbf, 0xbf, 0xc0, 0xdf, 0xd9, 0xef, 0xe0, 0xe0,
+ 0xee, 0x0e, 0x70, 0x10,
+ 0x10, 0x3f, 0x45, 0x14, 0x00, 0x03, 0xf6, 0xe1, 0xa1, 0xf3, 0xe1, 0xed,
+ 0xce, 0x1f, 0x40, 0x44,
+ 0x00, 0x00, 0x1e, 0x2f, 0x0d, 0xcb, 0xed, 0x0b, 0x0f, 0x0f, 0x0f, 0x0e,
+ 0x1d, 0x6d, 0x76, 0x12,
+ 0x20, 0x1f, 0xee, 0xed, 0xf2, 0xff, 0xec, 0xdd, 0xed, 0x0f, 0xeb, 0xa0,
+ 0xfd, 0xfe, 0x03, 0xf2,
+ 0x00, 0x10, 0x50, 0x27, 0x53, 0x23, 0x31, 0x33, 0x50, 0x3f, 0xfd, 0xd1,
+ 0xd2, 0xf0, 0xf0, 0x00,
+ 0x11, 0x5c, 0x2f, 0x30, 0x0f, 0x00, 0xe4, 0xe7, 0x05, 0x01, 0x01, 0x00,
+ 0x50, 0x22, 0x20, 0x1d,
+ 0xee, 0xbe, 0x10, 0x2d, 0xf9, 0x30, 0x70, 0x73, 0x13, 0x00, 0x0e, 0x0f,
+ 0xf0, 0xd7, 0xd3, 0xd3,
+ 0xd1, 0xb0, 0xe0, 0xc1, 0xe0, 0xf8, 0xff, 0xff, 0xef, 0x1e, 0x40, 0x43,
+ 0x27, 0x50, 0x01, 0xf0,
+ 0x0e, 0x00, 0x3e, 0x5f, 0x0f, 0x0f, 0x1f, 0xec, 0x8a, 0x0d, 0x0f, 0x03,
+ 0x04, 0x01, 0xfc, 0x0f,
+ 0xef, 0xc0, 0x00, 0x0f, 0xee, 0x00, 0x26, 0x54, 0xe1, 0xa0, 0xf0, 0x14,
+ 0x1d, 0x61, 0x47, 0x10,
+ 0x10, 0x0f, 0x10, 0x22, 0x20, 0x0b, 0x0e, 0x0f, 0x02, 0xf2, 0xed, 0xcc,
+ 0xde, 0x80, 0xf0, 0xd1,
+ 0x07, 0x04, 0x3e, 0x4f, 0x30, 0xf0, 0x10, 0x6d, 0x00, 0x2e, 0x00, 0x00,
+ 0x9a, 0x00, 0x19, 0x00,
+ 0xae, 0x35, 0xbd, 0x2e, 0xd3, 0x32, 0x38, 0x2e, 0x45, 0x33, 0x41, 0x20,
+ 0x4e, 0x2f, 0x22, 0x20,
+ 0x13, 0x07, 0x07, 0x04, 0xc1, 0xd3, 0xc3, 0xd4, 0xd3, 0xd4, 0xe4, 0xd4,
+ 0xc3, 0xd4, 0xd2, 0xd3,
+ 0xc2, 0xd3, 0xb4, 0xd3, 0xc2, 0xd3, 0xd5, 0xe2, 0xf2, 0x03, 0x03, 0x13,
+ 0x02, 0xf0, 0xaf, 0xdd,
+ 0xcb, 0xcc, 0xbb, 0xde, 0xdc, 0xce, 0xdd, 0xce, 0xfd, 0xfc, 0xfd, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0xfe,
+ 0xfe, 0x0d, 0x0b, 0xfc, 0xab, 0xcd, 0xcd, 0xbc, 0xcc, 0xdd, 0xcc, 0xde,
+ 0xed, 0xdc, 0xee, 0xfd,
+ 0xfc, 0xee, 0xee, 0xed, 0xed, 0xfd, 0x0c, 0x1d, 0x5c, 0x2c, 0x3c, 0x4d,
+ 0x3c, 0x3d, 0x2c, 0x2d,
+ 0x1e, 0x2d, 0x2f, 0x5f, 0x3f, 0x3e, 0x1e, 0xee, 0xdd, 0xbd, 0xad, 0xdb,
+ 0xce, 0xdd, 0xed, 0xdd,
+ 0xdb, 0xfc, 0x0d, 0x2b, 0x6e, 0x4d, 0x3d, 0x3d, 0x0c, 0x0d, 0x0c, 0xde,
+ 0xce, 0xce, 0xc0, 0xd0,
+ 0xa2, 0xd4, 0xd3, 0xd3, 0xb5, 0xe4, 0xe3, 0xf6, 0xf2, 0xd4, 0xd2, 0xd1,
+ 0xd2, 0xd2, 0xf1, 0x00,
+ 0x01, 0xf0, 0xf2, 0xf0, 0xcf, 0xcd, 0xda, 0xcd, 0xdc, 0xbc, 0xdc, 0xcc,
+ 0xbb, 0xcd, 0xdd, 0xcc,
+ 0xce, 0xdd, 0xcd, 0xdd, 0xdd, 0xee, 0xee, 0xdd, 0xff, 0x0e, 0x0f, 0x1d,
+ 0x2e, 0x3d, 0x4b, 0x3d,
+ 0x4c, 0x2c, 0x2c, 0x3d, 0x5d, 0x2d, 0x2d, 0x0e, 0x00, 0xef, 0xee, 0xdf,
+ 0xbf, 0xd0, 0xe0, 0xc4,
+ 0xc3, 0xe2, 0xe1, 0xf2, 0x11, 0x52, 0x67, 0x45, 0x33, 0x53, 0x36, 0x33,
+ 0x45, 0x32, 0x33, 0x43,
+ 0x23, 0x24, 0x13, 0x03, 0x02, 0x03, 0x15, 0x22, 0x22, 0x24, 0x45, 0x22,
+ 0x23, 0x14, 0x13, 0xf3,
+ 0xd2, 0xa4, 0xd3, 0xc5, 0xe2, 0xd3, 0xf3, 0x03, 0xf2, 0x02, 0x02, 0x04,
+ 0x02, 0xf4, 0x03, 0xe4,
+ 0xc4, 0xd2, 0xf2, 0xb3, 0xb3, 0xb4, 0xd1, 0xc3, 0xe3, 0xe3, 0x14, 0x43,
+ 0x65, 0x42, 0x42, 0x32,
+ 0x32, 0x23, 0x21, 0x20, 0x0e, 0x0c, 0xfb, 0xec, 0xec, 0xdc, 0xcc, 0xdd,
+ 0xbc, 0xbe, 0xdd, 0xdd,
+ 0xcf, 0xff, 0x00, 0x11, 0x10, 0x01, 0x20, 0x41, 0x40, 0x40, 0x3d, 0x5d,
+ 0x3c, 0x3c, 0x3c, 0x4c,
+ 0x3c, 0x6d, 0x2e, 0x3e, 0x2f, 0x2f, 0x1f, 0x0f, 0x0e, 0xcb, 0xdb, 0xcd,
+ 0xda, 0xdd, 0xed, 0xdb,
+ 0xdd, 0xed, 0xec, 0x1e, 0x3d, 0x5f, 0x3e, 0x4f, 0x3f, 0x20, 0x2f, 0x10,
+ 0x00, 0xe1, 0xe4, 0xc3,
+ 0x83, 0xd5, 0xd7, 0xb2, 0xb1, 0xf6, 0x03, 0xc1, 0xd0, 0xf1, 0x04, 0xf2,
+ 0xf2, 0xd0, 0xd0, 0xc0,
+ 0x03, 0x04, 0xe0, 0xe0, 0xe0, 0xde, 0xff, 0x22, 0x52, 0x0e, 0xfb, 0xfe,
+ 0x00, 0x21, 0xcd, 0x88,
+ 0xee, 0xdd, 0xf0, 0xce, 0x88, 0xed, 0x27, 0x00, 0x01, 0xef, 0x9b, 0x11,
+ 0x32, 0x00, 0xff, 0x0f,
+ 0x20, 0x20, 0x0f, 0x30, 0x73, 0x0d, 0xe9, 0xfe, 0x21, 0x32, 0x00, 0x0f,
+ 0xff, 0x00, 0x00, 0xbd,
+ 0x00, 0x67, 0x00, 0xef, 0x44, 0x10, 0xec, 0x42, 0x43, 0x00, 0x31, 0x22,
+ 0x0e, 0x20, 0x56, 0x22,
+ 0x11, 0x00, 0x12, 0x24, 0x00, 0x00, 0x23, 0x23, 0x00, 0xf0, 0x00, 0x13,
+ 0x02, 0xce, 0x03, 0x27,
+ 0x8e, 0xff, 0x27, 0x00, 0x9d, 0x12, 0x37, 0xef, 0xef, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x01, 0xe0,
+ 0xe0, 0xf2, 0xb0, 0xbe, 0xe0, 0xf0, 0xe1, 0xef, 0x13, 0x47, 0x01, 0xdd,
+ 0xed, 0x12, 0x42, 0x0f,
+ 0x21, 0x43, 0xda, 0x0f, 0x10, 0x0f, 0x00, 0x0e, 0xcc, 0xee, 0xf0, 0xdf,
+ 0xbd, 0xee, 0xb9, 0x21,
+ 0x21, 0x98, 0x00, 0x00, 0xfe, 0x31, 0x00, 0xcd, 0x32, 0x31, 0xdb, 0x20,
+ 0x71, 0x20, 0x1c, 0x30,
+ 0x40, 0x2e, 0x0d, 0x2d, 0x40, 0x67, 0x10, 0x00, 0xec, 0xff, 0x22, 0x01,
+ 0x00, 0x12, 0x10, 0x20,
+ 0x21, 0x1f, 0x74, 0x22, 0x0b, 0x0e, 0x52, 0x34, 0x31, 0x10, 0x1e, 0x1f,
+ 0x21, 0x33, 0x00, 0xed,
+ 0xf0, 0x07, 0x25, 0xd0, 0xb0, 0x03, 0x24, 0xf1, 0x8d, 0xce, 0x03, 0x27,
+ 0x01, 0xe0, 0xef, 0x11,
+ 0x12, 0x00, 0x13, 0x44, 0x22, 0x10, 0x12, 0x75, 0x22, 0x00, 0xfe, 0x00,
+ 0x21, 0x00, 0xed, 0xdd,
+ 0xbd, 0x02, 0x07, 0xf1, 0x9e, 0xdd, 0xcc, 0xef, 0x02, 0x02, 0xee, 0xdd,
+ 0xdd, 0xf0, 0xee, 0xc8,
+ 0xf0, 0x43, 0x10, 0xeb, 0x0f, 0x21, 0x52, 0x10, 0x00, 0x00, 0x0e, 0x44,
+ 0x34, 0xf0, 0x00, 0xe2,
+ 0xf1, 0x13, 0x33, 0x10, 0x3e, 0x1b, 0x7f, 0x3f, 0x2c, 0x72, 0x42, 0x0e,
+ 0x1d, 0xf8, 0xfc, 0x52,
+ 0x21, 0x0e, 0x0e, 0x2f, 0x0d, 0xfc, 0x21, 0x23, 0x9a, 0xde, 0xf0, 0x13,
+ 0x12, 0xe0, 0xae, 0xe0,
+ 0xf1, 0xcf, 0xdd, 0xe0, 0xe4, 0xe0, 0xa9, 0xf0, 0x04, 0x13, 0x01, 0xbd,
+ 0xed, 0xf1, 0x05, 0xd0,
+ 0xd0, 0xc0, 0xbb, 0xcc, 0xff, 0x02, 0xf2, 0xdd, 0xdb, 0xe0, 0xf0, 0xff,
+ 0xef, 0x00, 0x23, 0x00,
+ 0xff, 0x0f, 0x11, 0x0f, 0xba, 0xdd, 0xed, 0xf0, 0xe0, 0xcc, 0xcc, 0xcb,
+ 0xde, 0x00, 0x01, 0x10,
+ 0x8b, 0xed, 0xff, 0x00, 0x23, 0x12, 0x00, 0xcb, 0xcb, 0xdd, 0x1f, 0x60,
+ 0x10, 0x0c, 0x1d, 0x1c,
+ 0x2f, 0x40, 0x20, 0x1e, 0x1e, 0x1f, 0x41, 0x35, 0x10, 0xcd, 0xef, 0xf0,
+ 0xce, 0xdd, 0xf0, 0xf0,
+ 0xee, 0x88, 0x0f, 0x33, 0x43, 0x0d, 0x09, 0x0e, 0x0f, 0x2f, 0x2f, 0x4f,
+ 0x1f, 0x0c, 0xec, 0x0f,
+ 0x20, 0x32, 0xf0, 0xd0, 0xd0, 0x22, 0x66, 0xb0, 0xd0, 0x01, 0x03, 0xc0,
+ 0xe2, 0x37, 0x22, 0xf0,
+ 0xe0, 0x03, 0x04, 0x33, 0x33, 0xb1, 0x9f, 0x1f, 0x32, 0xef, 0x00, 0x57,
+ 0x10, 0xcc, 0xbc, 0x00,
+ 0x12, 0xef, 0xcc, 0xff, 0x00, 0xde, 0x9a, 0x03, 0x13, 0xfe, 0xdc, 0x0f,
+ 0x11, 0x12, 0x21, 0x10,
+ 0x0d, 0x1f, 0x41, 0x31, 0x31, 0x2f, 0x0b, 0x10, 0x32, 0x02, 0xf3, 0x06,
+ 0xd0, 0x80, 0xe0, 0xf3,
+ 0x36, 0x41, 0x01, 0xe0, 0x0f, 0x51, 0x46, 0x01, 0x00, 0x30, 0x52, 0x11,
+ 0x46, 0x32, 0x11, 0x10,
+ 0x21, 0x74, 0x33, 0x23, 0x11, 0x10, 0x43, 0x57, 0x12, 0x21, 0x11, 0x00,
+ 0x1f, 0x11, 0x03, 0x13,
+ 0x00, 0xed, 0xdd, 0x00, 0x57, 0x33, 0x00, 0x00, 0x21, 0x11, 0x9b, 0xf0,
+ 0x47, 0x10, 0xce, 0xde,
+ 0x01, 0x12, 0xd0, 0xdf, 0x00, 0x00, 0x00, 0x12, 0x43, 0x02, 0x01, 0x02,
+ 0x67, 0xf0, 0xb0, 0x24,
+ 0x12, 0xbc, 0xfe, 0x25, 0x14, 0x01, 0xe0, 0x00, 0x0e, 0xbc, 0x0d, 0x51,
+ 0x32, 0x0e, 0xec, 0x1f,
+ 0x20, 0x0e, 0xf0, 0x14, 0x00, 0x01, 0x23, 0x01, 0x04, 0x13, 0xce, 0xfc,
+ 0x73, 0x56, 0x00, 0x1f,
+ 0x30, 0x2e, 0x2f, 0x30, 0x54, 0x10, 0x0d, 0x0f, 0x21, 0x10, 0x0d, 0xff,
+ 0x03, 0x10, 0xd8, 0x9b,
+ 0x00, 0xf1, 0xde, 0xdc, 0x10, 0x1f, 0xca, 0x30, 0x71, 0x0f, 0xdb, 0x0f,
+ 0x50, 0x33, 0x00, 0xbb,
+ 0x12, 0x47, 0xf0, 0xce, 0xf0, 0x01, 0x01, 0xd0, 0xdf, 0xf0, 0xe0, 0x24,
+ 0x43, 0xf0, 0xad, 0x0e,
+ 0x35, 0x44, 0xff, 0xbc, 0x00, 0x33, 0x00, 0xff, 0x00, 0x10, 0x21, 0xee,
+ 0xee, 0x21, 0x00, 0xce,
+ 0x00, 0x00, 0xef, 0xe2, 0x03, 0xec, 0xbb, 0xf0, 0x06, 0xf1, 0xc0, 0x03,
+ 0x8c, 0xc8, 0x00, 0x33,
+ 0x11, 0x0f, 0xdc, 0xfe, 0xf0, 0x00, 0x30, 0x21, 0x51, 0x11, 0xdc, 0xaa,
+ 0x00, 0x22, 0x20, 0xff,
+ 0xef, 0x00, 0x00, 0x62, 0x22, 0x0e, 0x65, 0xfc, 0xed, 0x77, 0x22, 0xcb,
+ 0x00, 0x55, 0x00, 0xcd,
+ 0xfe, 0x13, 0x22, 0x0f, 0xfe, 0xff, 0x02, 0x22, 0x23, 0xff, 0xba, 0x0f,
+ 0x01, 0x11, 0xe0, 0xdd,
+ 0xfe, 0x01, 0x02, 0x01, 0xf0, 0x89, 0xdc, 0x12, 0x77, 0x00, 0xff, 0x00,
+ 0xff, 0xee, 0x00, 0x22,
+ 0x22, 0x11, 0x00, 0xfe, 0xee, 0x00, 0xcc, 0x88, 0xef, 0x00, 0x33, 0x22,
+ 0x00, 0x00, 0x10, 0x12,
+ 0x55, 0x43, 0x12, 0x11, 0xff, 0xed, 0x00, 0x00, 0x32, 0x34, 0xec, 0xde,
+ 0xfe, 0xcd, 0x10, 0x44,
+ 0x00, 0xbc, 0xcb, 0x00, 0x55, 0x01, 0xfe, 0xff, 0xfe, 0x00, 0x00, 0xff,
+ 0xed, 0xff, 0x11, 0x0f,
+ 0xec, 0x21, 0x22, 0xdc, 0x88, 0xe0, 0x31, 0xe0, 0x8b, 0x00, 0x00, 0x00,
+ 0xee, 0xee, 0x00, 0x44,
+ 0x22, 0x00, 0x00, 0x12, 0x22, 0x11, 0x12, 0x10, 0xec, 0x00, 0x76, 0x00,
+ 0xdd, 0xee, 0x01, 0x11,
+ 0xef, 0xdd, 0x00, 0x12, 0xff, 0x88, 0xde, 0x22, 0x45, 0xff, 0xef, 0x43,
+ 0x33, 0x00, 0xff, 0x23,
+ 0x44, 0x00, 0xed, 0x00, 0x76, 0x00, 0xff, 0x44, 0x44, 0xff, 0xcc, 0xfe,
+ 0x00, 0x11, 0xff, 0xff,
+ 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0x11, 0x00, 0xfd, 0xff, 0xba, 0x10, 0x44,
+ 0x00, 0xee, 0x22, 0x55,
+ 0x00, 0xee, 0xde, 0x9b, 0xed, 0xff, 0x00, 0x33, 0x47, 0x00, 0x00, 0x21,
+ 0x22, 0x21, 0x00, 0x01,
+ 0xde, 0xce, 0x44, 0x77, 0x22, 0x00, 0xef, 0x00, 0x01, 0xdd, 0xbb, 0x11,
+ 0x44, 0x10, 0xde, 0xfe,
+ 0x00, 0x00, 0x00, 0x53, 0x00, 0xed, 0xec, 0x11, 0x55, 0x00, 0x00, 0x00,
+ 0x13, 0x55, 0x00, 0xff,
+ 0x00, 0x46, 0x22, 0x21, 0x01, 0x10, 0x44, 0x11, 0xee, 0x00, 0x00, 0x9c,
+ 0xca, 0xef, 0x0f, 0x00,
+ 0x12, 0x00, 0xe0, 0xef, 0xff, 0x00, 0x00, 0xef, 0x21, 0x44, 0xf0, 0xdd,
+ 0x00, 0xef, 0x9a, 0xdd,
+ 0x01, 0x55, 0x11, 0x10, 0x34, 0x11, 0xcc, 0x8a, 0x00, 0x11, 0x11, 0xed,
+ 0xf0, 0x00, 0x0f, 0xfe,
+ 0x01, 0x34, 0x22, 0xf0, 0x00, 0x53, 0x24, 0xfe, 0x34, 0x77, 0x10, 0x00,
+ 0x00, 0xff, 0xf0, 0x00,
+ 0x21, 0x00, 0xfe, 0xff, 0x54, 0x33, 0xcc, 0xec, 0xf0, 0x32, 0x00, 0xff,
+ 0x00, 0x22, 0xff, 0x0f,
+ 0x11, 0xee, 0xdc, 0x31, 0xff, 0xaa, 0x00, 0xcd, 0xdd, 0x63, 0x01, 0xd8,
+ 0xcd, 0x00, 0x21, 0x20,
+ 0xff, 0xcd, 0xfe, 0x21, 0x22, 0x10, 0x0f, 0x10, 0x65, 0x00, 0xfe, 0xed,
+ 0xcb, 0xee, 0x01, 0x11,
+ 0xcd, 0x98, 0xff, 0x01, 0x22, 0x23, 0xff, 0xec, 0x23, 0x01, 0xbc, 0x0f,
+ 0x00, 0xf0, 0x00, 0x45,
+ 0x21, 0xdf, 0xac, 0x01, 0x57, 0x00, 0xf0, 0xef, 0x00, 0x12, 0x00, 0xde,
+ 0xde, 0x00, 0x42, 0x00,
+ 0x0e, 0x00, 0x34, 0xdc, 0x8a, 0x00, 0x22, 0x33, 0x21, 0xf0, 0xa9, 0xee,
+ 0xef, 0x11, 0x33, 0x00,
+ 0xff, 0x00, 0x11, 0x12, 0x54, 0x00, 0xfe, 0x00, 0x21, 0x44, 0x00, 0xdc,
+ 0x00, 0x53, 0xff, 0x0f,
+ 0x47, 0x42, 0x22, 0x00, 0xee, 0x77, 0x54, 0x00, 0xf0, 0x11, 0x10, 0xee,
+ 0xed, 0xff, 0xee, 0x22,
+ 0x57, 0x11, 0x00, 0xf0, 0x00, 0x31, 0x34, 0x00, 0xff, 0x21, 0x32, 0x11,
+ 0x00, 0xce, 0x00, 0x24,
+ 0xce, 0xef, 0x44, 0x10, 0xac, 0xee, 0x00, 0xdc, 0xde, 0x34, 0x12, 0xbc,
+ 0xf0, 0x12, 0x12, 0x00,
+ 0xf0, 0x01, 0x14, 0x22, 0xff, 0xdd, 0x22, 0x76, 0x0f, 0xde, 0x22, 0x33,
+ 0x0f, 0x00, 0x00, 0xed,
+ 0x22, 0x53, 0xfc, 0xdc, 0xff, 0xdd, 0xbb, 0xfe, 0x00, 0x20, 0x00, 0xfe,
+ 0xfd, 0x74, 0x77, 0x02,
+ 0xfc, 0xfe, 0x00, 0x0f, 0x0d, 0x11, 0x00, 0x0e, 0x10, 0x0f, 0x00, 0x20,
+ 0x1e, 0xfe, 0x0e, 0x67,
+ 0x11, 0xed, 0x98, 0xcd, 0xfd, 0x00, 0xbb, 0xec, 0x00, 0x00, 0xdd, 0xcb,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0x00, 0x32, 0x21, 0xdf, 0xce, 0xef, 0xbc, 0xdc, 0xdf, 0x00, 0x01,
+ 0xef, 0xce, 0xed, 0x25,
+ 0x75, 0x00, 0x00, 0xf0, 0x00, 0x12, 0x65, 0x34, 0x11, 0x11, 0x11, 0x21,
+ 0x33, 0x00, 0x01, 0x34,
+ 0x11, 0x34, 0x43, 0xf0, 0x9c, 0xcb, 0xf0, 0x01, 0x11, 0xcc, 0xdd, 0x00,
+ 0x23, 0x00, 0xfe, 0x34,
+ 0x43, 0x01, 0xed, 0xab, 0x0f, 0x13, 0x22, 0xfe, 0x98, 0xff, 0x11, 0x00,
+ 0xcc, 0x00, 0x33, 0x11,
+ 0xcc, 0xdc, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x20, 0x43, 0x23, 0x22,
+ 0x12, 0x77, 0x24, 0xff,
+ 0xbb, 0x11, 0x64, 0x00, 0xfe, 0x11, 0x00, 0xec, 0xff, 0x11, 0x00, 0xbb,
+ 0xf0, 0x22, 0x21, 0xf0,
+ 0x00, 0x34, 0x32, 0xcd, 0xba, 0x21, 0x33, 0x00, 0x00, 0x33, 0x22, 0x00,
+ 0xdd, 0x01, 0x44, 0xff,
+ 0xcd, 0x11, 0x56, 0x11, 0xde, 0xee, 0x31, 0xef, 0xde, 0x77, 0x22, 0xee,
+ 0x00, 0x32, 0x01, 0x00,
+ 0x00, 0xcd, 0xf0, 0x77, 0x11, 0xff, 0xfd, 0x01, 0x32, 0x20, 0xec, 0xfe,
+ 0x32, 0x20, 0xdc, 0xff,
+ 0xfe, 0xce, 0x00, 0x35, 0x21, 0xae, 0xf0, 0x24, 0x56, 0x00, 0xdf, 0xff,
+ 0xde, 0xdd, 0x0f, 0x74,
+ 0x23, 0x10, 0xfc, 0xff, 0x00, 0xde, 0xcc, 0x66, 0x33, 0xef, 0xbb, 0x01,
+ 0x33, 0x01, 0xee, 0x00,
+ 0x00, 0xe0, 0xee, 0x00, 0x11, 0x0f, 0x33, 0x65, 0x0f, 0xed, 0xcb, 0xfe,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x21, 0x11, 0x43, 0x77, 0x01, 0x0e, 0x13, 0x23, 0x00, 0xee, 0xdf, 0xf0,
+ 0xee, 0x00, 0x31, 0xca,
+ 0x9a, 0xee, 0xee, 0x00, 0x64, 0x00, 0xca, 0xef, 0x10, 0x00, 0xee, 0x0f,
+ 0x10, 0x00, 0xde, 0x01,
+ 0x66, 0x00, 0xde, 0x00, 0x33, 0x12, 0x00, 0x35, 0x73, 0x12, 0x01, 0x22,
+ 0x00, 0xcd, 0xec, 0xff,
+ 0x00, 0xec, 0xbc, 0xfe, 0x00, 0x00, 0x0f, 0x55, 0x23, 0x0f, 0xff, 0x11,
+ 0x13, 0x00, 0xba, 0xdd,
+ 0x00, 0x25, 0x00, 0x8d, 0xed, 0x02, 0x35, 0x22, 0x00, 0xdd, 0x0f, 0x33,
+ 0x33, 0x01, 0x34, 0x44,
+ 0x21, 0x00, 0x00, 0x77, 0x43, 0x00, 0xff, 0x00, 0x22, 0x21, 0x33, 0x55,
+ 0x00, 0xfe, 0xdd, 0xfe,
+ 0x0f, 0x0e, 0x22, 0x12, 0xfe, 0x0d, 0x0e, 0x76, 0x65, 0x00, 0x00, 0xfd,
+ 0x0e, 0x00, 0x0e, 0xfd,
+ 0xec, 0xfe, 0xdd, 0x24, 0x67, 0xdf, 0xab, 0x00, 0x21, 0x24, 0x00, 0xf0,
+ 0xee, 0xff, 0x01, 0x43,
+ 0x00, 0xa9, 0xdd, 0xff, 0x00, 0x00, 0xee, 0xf0, 0x23, 0x22, 0xf0, 0xef,
+ 0x00, 0x35, 0x43, 0xcf,
+ 0xcd, 0x01, 0x14, 0x00, 0x32, 0x11, 0xcd, 0xee, 0x14, 0x23, 0x0e, 0xab,
+ 0xde, 0xec, 0x0e, 0x31,
+ 0xac, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x54, 0x11, 0x0f,
+ 0xff, 0x00, 0x34, 0x43,
+ 0xf0, 0x00, 0x33, 0x22, 0xdc, 0x30, 0x76, 0x00, 0xfd, 0x00, 0x20, 0xff,
+ 0xfc, 0x10, 0x20, 0x01,
+ 0x0f, 0xce, 0xee, 0x22, 0x54, 0x00, 0x11, 0x11, 0xfe, 0xfe, 0xe0, 0x99,
+ 0xfe, 0x00, 0x02, 0x22,
+ 0x00, 0xf2, 0x02, 0x77, 0x46, 0xf0, 0xff, 0x22, 0x21, 0xbc, 0x00, 0x44,
+ 0x00, 0xf0, 0x33, 0x24,
+ 0xde, 0xdd, 0xef, 0x01, 0x24, 0xf0, 0x8a, 0xde, 0xfe, 0x01, 0x22, 0xff,
+ 0x0f, 0x33, 0xee, 0x88,
+ 0xde, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x54,
+ 0x25, 0xde, 0x89, 0x00,
+ 0x21, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xef, 0xfe, 0xee, 0x00, 0x20, 0xdd,
+ 0xdb, 0x20, 0x43, 0x00,
+ 0xdc, 0x1f, 0x72, 0x0f, 0xec, 0x22, 0x21, 0x00, 0x56, 0x00, 0xbd, 0x00,
+ 0x0f, 0xdb, 0xef, 0x21,
+ 0x53, 0x33, 0x12, 0x10, 0x56, 0x23, 0x00, 0xf0, 0x33, 0x55, 0x00, 0xcd,
+ 0xef, 0xf0, 0x03, 0x13,
+ 0x02, 0xef, 0x0f, 0x10, 0x0f, 0x11, 0x35, 0x00, 0xdf, 0xde, 0x89, 0xbc,
+ 0xef, 0x00, 0x35, 0x43,
+ 0x00, 0xff, 0xef, 0x00, 0x12, 0xef, 0x99, 0x0f, 0x00, 0xde, 0xef, 0x22,
+ 0x22, 0x00, 0x0f, 0x31,
+ 0x57, 0x22, 0x00, 0xde, 0xde, 0x00, 0x52, 0x00, 0xda, 0xde, 0x31, 0x00,
+ 0x8b, 0xff, 0x00, 0x32,
+ 0x11, 0x21, 0x00, 0x11, 0x32, 0xec, 0xac, 0x23, 0x23, 0xca, 0x00, 0x54,
+ 0x21, 0xee, 0xff, 0x11,
+ 0x00, 0xee, 0xef, 0x21, 0x45, 0x00, 0xcc, 0xef, 0x10, 0x10, 0x00, 0x04,
+ 0xf8, 0x03, 0xc3, 0x02,
+ 0xf8, 0xc9, 0x59, 0xbf, 0x37, 0xd5, 0x03, 0xc9, 0x22, 0x77, 0x11, 0x0f,
+ 0xfe, 0x00, 0x45, 0x00,
+ 0x00, 0x10, 0x12, 0x00, 0xff, 0x01, 0x10, 0xdd, 0xba, 0x00, 0x31, 0x11,
+ 0x45, 0x32, 0xf0, 0x01,
+ 0x66, 0x32, 0xf0, 0xd0, 0x01, 0x02, 0xf0, 0xae, 0xdc, 0xee, 0x00, 0x21,
+ 0x11, 0x12, 0x13, 0xf0,
+ 0x88, 0xcb, 0x00, 0x00, 0x00, 0xef, 0x00, 0x21, 0x21, 0x20, 0x11, 0x10,
+ 0x52, 0x12, 0x12, 0x02,
+ 0xda, 0xce, 0x10, 0x22, 0x00, 0x10, 0x32, 0x0f, 0x0d, 0xfd, 0x32, 0x77,
+ 0x20, 0xfe, 0x11, 0x31,
+ 0xcc, 0xed, 0x00, 0x54, 0x23, 0x10, 0x10, 0x00, 0xec, 0x34, 0x34, 0xef,
+ 0x31, 0x23, 0xb0, 0x22,
+ 0x47, 0xd0, 0xd0, 0x00, 0xe0, 0x00, 0x30, 0xc0, 0x8b, 0xf0, 0x35, 0x52,
+ 0x00, 0xbd, 0xff, 0x13,
+ 0x03, 0x0f, 0xee, 0xee, 0xf0, 0x23, 0x23, 0xcb, 0xef, 0x67, 0x23, 0x00,
+ 0x02, 0x01, 0x00, 0xdd,
+ 0x89, 0x00, 0x13, 0x12, 0x11, 0x01, 0x0f, 0xc9, 0xad, 0x00, 0x35, 0x11,
+ 0x00, 0x23, 0x11, 0xee,
+ 0xce, 0x11, 0x34, 0x00, 0x00, 0x13, 0xde, 0xdc, 0x43, 0x12, 0xbb, 0xff,
+ 0x01, 0xff, 0xee, 0xee,
+ 0xe0, 0xf0, 0xce, 0xa9, 0x00, 0x44, 0x11, 0x00, 0xfd, 0x20, 0x57, 0x00,
+ 0xce, 0x21, 0x33, 0xfe,
+ 0xee, 0x22, 0x33, 0xff, 0xf0, 0x34, 0x75, 0x22, 0xf0, 0xdf, 0xee, 0x00,
+ 0xef, 0xcd, 0xee, 0x00,
+ 0x34, 0xff, 0x99, 0x00, 0x33, 0x43, 0x01, 0x01, 0x22, 0x00, 0xdb, 0xde,
+ 0x0f, 0xfe, 0xdd, 0xe0,
+ 0x01, 0x33, 0x41, 0xda, 0xad, 0xfe, 0x10, 0x40, 0xda, 0xbc, 0x20, 0x53,
+ 0xfd, 0xc9, 0xff, 0x00,
+ 0x41, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x21, 0x65, 0x00, 0xeb, 0xee, 0x10,
+ 0x32, 0x32, 0x00, 0xed,
+ 0xfe, 0x0f, 0x40, 0x75, 0x34, 0x10, 0xff, 0x00, 0x12, 0x23, 0x12, 0xe0,
+ 0xbe, 0x01, 0x05, 0xd0,
+ 0x8b, 0xfe, 0x03, 0x01, 0xfd, 0xdd, 0x00, 0x34, 0x23, 0x00, 0x12, 0x47,
+ 0x22, 0x01, 0x00, 0x13,
+ 0x01, 0xe0, 0x00, 0x55, 0x11, 0xf0, 0xbe, 0xff, 0x15, 0x44, 0x01, 0xef,
+ 0x00, 0x34, 0x76, 0x11,
+ 0xff, 0xf0, 0x10, 0xe0, 0x00, 0x75, 0x00, 0x12, 0x13, 0xef, 0xde, 0x11,
+ 0x34, 0xef, 0xce, 0x0f,
+ 0x12, 0x44, 0xf0, 0xac, 0xee, 0xee, 0xda, 0xee, 0x00, 0xff, 0x42, 0x21,
+ 0xff, 0xff, 0x23, 0x01,
+ 0x00, 0x76, 0x10, 0xdd, 0xbb, 0xfe, 0x12, 0x45, 0x00, 0xdf, 0xef, 0xef,
+ 0xef, 0xff, 0x00, 0x44,
+ 0x54, 0x22, 0x00, 0xdf, 0x0e, 0x56, 0x23, 0xce, 0xdb, 0x10, 0x65, 0x01,
+ 0x00, 0x02, 0x01, 0x00,
+ 0xe0, 0xdf, 0xe0, 0xe0, 0xdf, 0x00, 0x01, 0xbc, 0xfe, 0x23, 0x00, 0xab,
+ 0x00, 0x02, 0x13, 0x23,
+ 0x11, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x54, 0x22, 0x0b, 0xb8,
+ 0xdd, 0xde, 0xee, 0x1e,
+ 0x50, 0x0e, 0xfb, 0xed, 0xed, 0x0e, 0x0f, 0x60, 0x0e, 0xc8, 0xbd, 0x0f,
+ 0x31, 0x21, 0x10, 0x0d,
+ 0x30, 0x74, 0x0e, 0xda, 0x0f, 0x10, 0x20, 0x0f, 0xfd, 0xfe, 0x0f, 0x0f,
+ 0x10, 0xfd, 0xbb, 0xee,
+ 0xfe, 0xef, 0xee, 0x00, 0x20, 0xfe, 0x10, 0x77, 0x42, 0x23, 0xff, 0xa8,
+ 0xff, 0x10, 0x20, 0x32,
+ 0x43, 0xff, 0xdc, 0x01, 0x42, 0xfe, 0xcc, 0x01, 0x44, 0x00, 0xfe, 0x00,
+ 0x11, 0x10, 0x23, 0x35,
+ 0xdf, 0xbe, 0x0f, 0x00, 0xfd, 0xfe, 0x31, 0x21, 0xfe, 0xfd, 0xfc, 0x0f,
+ 0x72, 0x00, 0xd8, 0x00,
+ 0xd0, 0x89, 0xde, 0x00, 0xfe, 0xcd, 0x00, 0xfe, 0xed, 0xfd, 0xfe, 0x10,
+ 0x53, 0x23, 0x0e, 0x00,
+ 0xfb, 0x0c, 0x52, 0x56, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x00, 0x52, 0x00,
+ 0x0f, 0x14, 0x55, 0x00,
+ 0xee, 0x00, 0x33, 0x0f, 0x00, 0x37, 0x00, 0xae, 0xff, 0x01, 0x22, 0x12,
+ 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0xce, 0xed, 0x14, 0x57, 0x35, 0x22, 0xd0, 0x9e, 0x01, 0x34, 0xf0,
+ 0xbc, 0x00, 0x34, 0x00,
+ 0xdf, 0x12, 0x23, 0xef, 0xff, 0x22, 0x22, 0xee, 0xee, 0x02, 0x77, 0x65,
+ 0x00, 0xef, 0xfe, 0x00,
+ 0x01, 0x13, 0x22, 0xfe, 0xfe, 0x55, 0x02, 0xef, 0xee, 0x10, 0x32, 0x23,
+ 0x33, 0x57, 0x22, 0xce,
+ 0xba, 0xf0, 0x10, 0x10, 0x00, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x21, 0x32,
+ 0x00, 0x24, 0x35, 0x01,
+ 0xd0, 0x8f, 0xcd, 0xf0, 0x01, 0x02, 0x04, 0x02, 0xe0, 0x02, 0x15, 0x44,
+ 0x32, 0x12, 0x01, 0xef,
+ 0x74, 0x55, 0x00, 0x00, 0x10, 0x0f, 0xde, 0xe0, 0x02, 0x20, 0xf0, 0xcc,
+ 0x01, 0x47, 0x11, 0x01,
+ 0xd1, 0xc0, 0xf0, 0xcf, 0xd0, 0x17, 0xf0, 0xbf, 0x12, 0x02, 0xde, 0x0f,
+ 0x32, 0x12, 0x77, 0x43,
+ 0xee, 0xdc, 0x01, 0x21, 0xce, 0x0e, 0x10, 0x00, 0x01, 0xdd, 0x88, 0xff,
+ 0x33, 0x01, 0xdd, 0xdd,
+ 0xcc, 0xfe, 0x00, 0x01, 0xf0, 0xcc, 0x0f, 0x62, 0x00, 0xe9, 0xdc, 0x10,
+ 0x73, 0x00, 0xdc, 0x00,
+ 0x02, 0x00, 0xed, 0xef, 0x01, 0x56, 0x11, 0x10, 0x00, 0xed, 0xee, 0x0e,
+ 0x00, 0x23, 0x10, 0x0e,
+ 0xec, 0xdd, 0x75, 0x67, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xdc, 0xff,
+ 0x22, 0x54, 0x01, 0xff,
+ 0xce, 0xf0, 0x01, 0x13, 0x0f, 0xaa, 0x00, 0x13, 0xed, 0xed, 0x10, 0x32,
+ 0x00, 0xeb, 0xec, 0x51,
+ 0x75, 0x11, 0x00, 0x22, 0x12, 0x00, 0x01, 0x23, 0x00, 0xdc, 0x32, 0x56,
+ 0xff, 0xbd, 0x00, 0x02,
+ 0xef, 0xff, 0x01, 0x00, 0x22, 0x77, 0x12, 0xda, 0x00, 0x32, 0x21, 0xde,
+ 0xde, 0xf0, 0x42, 0x21,
+ 0xee, 0xcf, 0x03, 0x45, 0xef, 0xce, 0x00, 0x22, 0x00, 0xf0, 0x03, 0xe0,
+ 0x88, 0xfd, 0x00, 0x00,
+ 0x11, 0x20, 0x0f, 0xff, 0xff, 0xfd, 0x0f, 0x77, 0x00, 0xdc, 0xff, 0x10,
+ 0x00, 0xef, 0x65, 0x12,
+ 0xee, 0x00, 0x12, 0x00, 0xff, 0x12, 0x22, 0x00, 0x77, 0x22, 0xff, 0x00,
+ 0xff, 0xba, 0xf0, 0x31,
+ 0x00, 0xb9, 0xde, 0x20, 0x61, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x0f, 0xb9,
+ 0xff, 0x0e, 0x0f, 0x10, 0x31, 0x0f, 0xdc, 0xac, 0x0f, 0x31, 0x00, 0xdc,
+ 0xdd, 0x20, 0x00, 0xc9,
+ 0x10, 0x72, 0x12, 0x00, 0xfe, 0xed, 0x00, 0x56, 0x11, 0xff, 0xcd, 0xfd,
+ 0x12, 0x00, 0xcc, 0xee,
+ 0x23, 0x11, 0xdf, 0xef, 0x22, 0x54, 0x44, 0x23, 0x22, 0x01, 0xbc, 0xed,
+ 0x02, 0xf0, 0xc9, 0x00,
+ 0x22, 0xfe, 0xdd, 0xee, 0x01, 0x57, 0x00, 0xff, 0x00, 0x32, 0x11, 0x00,
+ 0x33, 0x00, 0xab, 0xde,
+ 0x00, 0x12, 0x00, 0xbb, 0xee, 0x2f, 0x40, 0x30, 0x0e, 0xfb, 0xde, 0x30,
+ 0x74, 0x11, 0x12, 0x00,
+ 0xea, 0x00, 0x30, 0xdb, 0x1f, 0x61, 0xff, 0xed, 0x0c, 0x0f, 0xfe, 0x20,
+ 0x30, 0x00, 0x0e, 0x30,
+ 0x77, 0x72, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0xde, 0xcb, 0xf0, 0x03,
+ 0xef, 0xdd, 0x00, 0x21,
+ 0x67, 0x01, 0xef, 0xbc, 0x00, 0x46, 0x00, 0xe0, 0x01, 0x11, 0x00, 0x00,
+ 0x22, 0x01, 0x01, 0x02,
+ 0xe0, 0xc0, 0xf0, 0x03, 0x22, 0x01, 0x27, 0x12, 0x02, 0x44, 0x03, 0x01,
+ 0x74, 0x33, 0x12, 0x02,
+ 0x00, 0xf0, 0x77, 0x66, 0x00, 0xce, 0xff, 0x11, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x40, 0x0f, 0xfb,
+ 0x00, 0x01, 0xde, 0xce, 0x35, 0x31, 0xbe, 0xee, 0x00, 0x32, 0x10, 0x00,
+ 0x00, 0xba, 0x10, 0x74,
+ 0x12, 0x00, 0xfd, 0xee, 0xff, 0xfd, 0xfd, 0x02, 0x26, 0x41, 0x00, 0xde,
+ 0xef, 0xf0, 0x22, 0x77,
+ 0x32, 0xdd, 0xac, 0x0f, 0xf0, 0xff, 0x01, 0x02, 0x05, 0x00, 0xee, 0xdd,
+ 0x00, 0x52, 0x00, 0xea,
+ 0xf0, 0x11, 0x01, 0x11, 0x34, 0x22, 0xd0, 0xd0, 0x77, 0x22, 0xc0, 0xdf,
+ 0x00, 0xf1, 0xa0, 0xfe,
+ 0x00, 0x03, 0x10, 0x0d, 0xed, 0x0f, 0xff, 0xfe, 0xfa, 0x30, 0x61, 0x0e,
+ 0x0d, 0x2f, 0x0e, 0xeb,
+ 0x0f, 0x2f, 0x0f, 0x0c, 0xdb, 0xfe, 0x10, 0xfc, 0x5e, 0x70, 0x0b, 0x3f,
+ 0x74, 0x20, 0x0d, 0xfd,
+ 0x0e, 0x33, 0x22, 0xb8, 0xed, 0x10, 0x55, 0x11, 0xff, 0xee, 0x00, 0x00,
+ 0x10, 0x21, 0x21, 0x00,
+ 0xfe, 0x01, 0xf0, 0x9c, 0xed, 0x02, 0x35, 0x0f, 0x0e, 0x10, 0x10, 0x31,
+ 0x10, 0x10, 0x56, 0x33,
+ 0x12, 0x02, 0x00, 0xf0, 0x00, 0x04, 0x17, 0xc1, 0x8e, 0xde, 0x00, 0x02,
+ 0x01, 0x54, 0x46, 0x11,
+ 0xe0, 0xe0, 0x11, 0x33, 0x43, 0x23, 0x13, 0x00, 0xed, 0xbb, 0x00, 0x02,
+ 0x01, 0x00, 0xef, 0xe0,
+ 0xf2, 0xf0, 0x16, 0x77, 0x74, 0x01, 0xe0, 0xff, 0x02, 0x32, 0xf0, 0xe0,
+ 0x02, 0x23, 0x01, 0xc0,
+ 0xb0, 0xc0, 0xe0, 0xf0, 0xff, 0xfe, 0x37, 0x56, 0x00, 0xcd, 0xf0, 0x33,
+ 0x02, 0x0f, 0x32, 0x22,
+ 0xf0, 0xcf, 0xe0, 0x04, 0x37, 0x52, 0x11, 0xd0, 0xbf, 0xf0, 0x10, 0x23,
+ 0x02, 0xed, 0x00, 0x10,
+ 0xcb, 0xbc, 0x00, 0x11, 0x00, 0x01, 0x11, 0xdd, 0xb8, 0x10, 0x20, 0xdf,
+ 0xc0, 0x35, 0x11, 0xd0,
+ 0xd0, 0x00, 0xe0, 0xcf, 0x52, 0x44, 0xeb, 0xcd, 0x00, 0x10, 0x0f, 0x0c,
+ 0x40, 0x10, 0x0f, 0xed,
+ 0x11, 0x65, 0x0f, 0xcc, 0x0e, 0x31, 0xfe, 0xdb, 0x30, 0x52, 0x0f, 0xca,
+ 0xbd, 0x0e, 0x1f, 0x0e,
+ 0x0d, 0xfd, 0xfb, 0x20, 0x63, 0x23, 0x13, 0x10, 0x00, 0x10, 0x01, 0xff,
+ 0xba, 0xe0, 0x04, 0xf0,
+ 0xde, 0xe0, 0x00, 0x00, 0x0e, 0xdc, 0x0f, 0x50, 0x0d, 0x10, 0x0e, 0xd9,
+ 0x00, 0x72, 0x33, 0x10,
+ 0x00, 0xea, 0xee, 0x0f, 0x51, 0x22, 0xde, 0xac, 0xed, 0xd9, 0x00, 0x32,
+ 0x10, 0x20, 0x40, 0x20,
+ 0x0f, 0xfd, 0x31, 0x43, 0xf0, 0x04, 0x34, 0xce, 0x8a, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xfe, 0xeb,
+ 0xed, 0xfd, 0x11, 0x75, 0x10, 0x10, 0x0f, 0x20, 0x2f, 0xfc, 0xee, 0x10,
+ 0x00, 0xfc, 0xcd, 0xef,
+ 0x77, 0x53, 0x00, 0xed, 0xfe, 0xed, 0xdd, 0x01, 0x27, 0x21, 0x01, 0x00,
+ 0x32, 0x11, 0x31, 0x54,
+ 0x00, 0xce, 0x00, 0x45, 0x01, 0x00, 0xf0, 0xd0, 0x8c, 0xf0, 0x02, 0x01,
+ 0x00, 0x01, 0xbc, 0xfe,
+ 0x26, 0xff, 0x89, 0xff, 0x11, 0x00, 0x00, 0xff, 0xff, 0x11, 0x33, 0x00,
+ 0xe0, 0xde, 0xee, 0x34,
+ 0x53, 0x0f, 0xdc, 0xfe, 0x0f, 0xec, 0x0e, 0x32, 0x11, 0xff, 0xee, 0x55,
+ 0x67, 0x11, 0x00, 0x0e,
+ 0x10, 0x0f, 0x0e, 0x21, 0x30, 0xdc, 0xfd, 0x30, 0x20, 0xdc, 0xfc, 0x2c,
+ 0xdc, 0x70, 0x73, 0x41,
+ 0xfb, 0xff, 0x00, 0x0f, 0x10, 0x10, 0xfd, 0xfc, 0x30, 0x63, 0x00, 0xfd,
+ 0xfe, 0x00, 0x0e, 0x0c,
+ 0x31, 0x20, 0xec, 0xcd, 0x11, 0x36, 0x31, 0x52, 0x53, 0x22, 0x15, 0x34,
+ 0xe0, 0xad, 0x00, 0x10,
+ 0x0f, 0xda, 0xf0, 0x31, 0x32, 0x11, 0x32, 0x11, 0xf0, 0xf0, 0xd0, 0xac,
+ 0x00, 0x26, 0x22, 0xd0,
+ 0xa0, 0xef, 0xee, 0xce, 0xfe, 0xef, 0xf0, 0x12, 0x11, 0x67, 0x47, 0x33,
+ 0x11, 0x01, 0xe0, 0xd0,
+ 0x44, 0x53, 0x00, 0x03, 0x04, 0x02, 0x01, 0x00, 0xfe, 0xdc, 0xf0, 0x45,
+ 0x10, 0xef, 0x41, 0x76,
+ 0x21, 0x11, 0x21, 0x23, 0x01, 0x00, 0x01, 0xf1, 0xc0, 0xe0, 0x0f, 0x10,
+ 0x13, 0x01, 0xe0, 0x07,
+ 0x02, 0x01, 0x13, 0xc1, 0xe2, 0x16, 0x80, 0xbe, 0x01, 0x24, 0xf1, 0xc0,
+ 0xe0, 0xf5, 0x02, 0xf2,
+ 0xc0, 0x00, 0x15, 0x13, 0xf2, 0xe1, 0xd2, 0xd2, 0x04, 0x63, 0x24, 0xf1,
+ 0x8f, 0xf0, 0xf1, 0xf0,
+ 0xef, 0xe0, 0x03, 0x17, 0x04, 0xb0, 0xef, 0x23, 0x01, 0xd0, 0x02, 0x57,
+ 0x44, 0x01, 0x00, 0xf0,
+ 0x01, 0x02, 0x00, 0x02, 0x44, 0x01, 0x0e, 0xfe, 0x00, 0x00, 0x1f, 0x0f,
+ 0x10, 0x0f, 0x88, 0xeb,
+ 0xfe, 0x00, 0x00, 0x0e, 0xed, 0x40, 0x51, 0x0d, 0x0f, 0x51, 0x0d, 0xfb,
+ 0x00, 0x44, 0x20, 0x0c,
+ 0x2e, 0x1d, 0xdb, 0x10, 0x76, 0x31, 0xdf, 0xdd, 0x20, 0x42, 0xf0, 0xef,
+ 0x00, 0x00, 0x0f, 0xfe,
+ 0xad, 0xfe, 0x00, 0x01, 0x22, 0xef, 0xdc, 0xcd, 0xcb, 0x25, 0x22, 0xad,
+ 0xed, 0x22, 0x57, 0x00,
+ 0xff, 0xe0, 0x02, 0x22, 0xf0, 0xf0, 0x14, 0x02, 0xbc, 0xfe, 0x33, 0x56,
+ 0x00, 0xff, 0xdf, 0xf0,
+ 0x12, 0x10, 0x10, 0xfc, 0xdb, 0xff, 0x00, 0xf0, 0xd0, 0xcd, 0xdd, 0xbd,
+ 0xdd, 0x0e, 0x70, 0x10,
+ 0xed, 0xda, 0xef, 0xed, 0xec, 0x30, 0x72, 0x0c, 0xfc, 0x2f, 0x1f, 0x2e,
+ 0x3e, 0x0d, 0x00, 0xd0,
+ 0xb9, 0xfd, 0xfe, 0x10, 0x50, 0x0d, 0xa8, 0xcb, 0xf0, 0x00, 0xff, 0xcd,
+ 0xed, 0xfd, 0xff, 0xf0,
+ 0xed, 0x10, 0x74, 0x10, 0x0f, 0x0e, 0x00, 0x23, 0x22, 0x2f, 0x0d, 0x43,
+ 0x37, 0x12, 0x23, 0x22,
+ 0x00, 0x21, 0x23, 0xae, 0xe0, 0x17, 0xe0, 0xbe, 0x01, 0x01, 0xdc, 0x21,
+ 0x77, 0x10, 0x0f, 0xff,
+ 0xff, 0x11, 0x21, 0xfe, 0xfe, 0xdd, 0xef, 0xfe, 0xba, 0xed, 0xee, 0x10,
+ 0x40, 0x31, 0x10, 0x2d,
+ 0x4d, 0x2c, 0x0c, 0x30, 0x76, 0x30, 0xed, 0x0e, 0x40, 0x31, 0x20, 0x00,
+ 0xf0, 0xe0, 0xcd, 0xec,
+ 0x0f, 0xde, 0xab, 0x25, 0x75, 0x11, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0xf0,
+ 0x03, 0x01, 0xcc, 0x0f,
+ 0x00, 0xe0, 0x05, 0x54, 0x03, 0xff, 0xfe, 0x10, 0x22, 0xcc, 0x98, 0xfe,
+ 0x10, 0x42, 0x01, 0x0f,
+ 0xbd, 0xff, 0x03, 0x11, 0xfd, 0x00, 0x23, 0x0d, 0x0b, 0x32, 0x00, 0xc8,
+ 0xde, 0x10, 0x2f, 0x0f,
+ 0xdc, 0xbd, 0x0f, 0x30, 0x0e, 0xfe, 0x61, 0x30, 0x0c, 0xeb, 0x0d, 0x2f,
+ 0x0e, 0xcc, 0x30, 0x70,
+ 0x0e, 0xfe, 0x02, 0x36, 0x00, 0xef, 0xef, 0xef, 0xe0, 0x75, 0x11, 0xdd,
+ 0xdf, 0x00, 0x34, 0xf0,
+ 0xd0, 0xe1, 0x01, 0x55, 0x00, 0xdc, 0x00, 0x43, 0x00, 0x2f, 0x74, 0x04,
+ 0xf2, 0xf2, 0x01, 0xf3,
+ 0xd0, 0xd0, 0x54, 0x43, 0xec, 0xdd, 0x27, 0x43, 0xf0, 0xef, 0x30, 0x35,
+ 0xe1, 0x90, 0xf1, 0xf2,
+ 0xd0, 0xe0, 0x00, 0xde, 0xcf, 0xe2, 0xe4, 0x13, 0x34, 0xbe, 0xaa, 0x00,
+ 0x02, 0x03, 0x23, 0x20,
+ 0xed, 0x00, 0x52, 0x0e, 0x1e, 0x3f, 0x21, 0x03, 0xfc, 0xb8, 0x10, 0x76,
+ 0x01, 0xfe, 0xfe, 0x00,
+ 0x0d, 0xfc, 0x0f, 0x40, 0x53, 0x10, 0x09, 0x0e, 0x20, 0x21, 0x21, 0x10,
+ 0xff, 0xef, 0x0f, 0x0d,
+ 0x5f, 0x53, 0x00, 0x00, 0x02, 0x02, 0x00, 0x10, 0x37, 0x02, 0xc1, 0xe4,
+ 0x15, 0x53, 0xf2, 0xcf,
+ 0x14, 0x45, 0xe0, 0xdf, 0x00, 0x13, 0x12, 0x00, 0xf2, 0xc3, 0xd0, 0xd0,
+ 0xd1, 0xc3, 0xd7, 0xc1,
+ 0xd0, 0x21, 0x77, 0x02, 0x01, 0x02, 0x00, 0xf1, 0x45, 0x74, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0x31,
+ 0x33, 0x00, 0x02, 0xf0, 0xf2, 0xd0, 0xf3, 0x46, 0x20, 0x00, 0x40, 0x74,
+ 0x00, 0xf0, 0xed, 0xda,
+ 0x0f, 0x50, 0x00, 0xed, 0xed, 0x11, 0x11, 0x10, 0x41, 0x24, 0x00, 0x0f,
+ 0x0f, 0x0e, 0x2e, 0x6e,
+ 0x1f, 0xfb, 0xcd, 0xf0, 0x02, 0x03, 0xf0, 0xbb, 0xd9, 0xde, 0x00, 0x00,
+ 0xd1, 0xa0, 0xe1, 0x02,
+ 0x44, 0x23, 0x23, 0x23, 0xf0, 0xf7, 0x24, 0x10, 0xf0, 0x1f, 0x1f, 0xff,
+ 0x53, 0x36, 0xaf, 0xee,
+ 0x00, 0x00, 0x46, 0x12, 0xa0, 0xe0, 0x03, 0x02, 0xae, 0xef, 0xf3, 0xf4,
+ 0x04, 0x06, 0x02, 0x01,
+ 0xf0, 0xe0, 0x00, 0x33, 0x22, 0x00, 0x10, 0x64, 0x03, 0xcc, 0xcd, 0xff,
+ 0x0f, 0xff, 0x00, 0x67,
+ 0x21, 0xec, 0xdd, 0x00, 0x42, 0x11, 0x0f, 0xfa, 0x30, 0x70, 0x10, 0x1f,
+ 0x1e, 0x30, 0x22, 0x00,
+ 0x0f, 0x21, 0x00, 0xcc, 0x03, 0x37, 0xdf, 0xae, 0x00, 0x12, 0x05, 0x05,
+ 0x73, 0x00, 0x76, 0x00,
+ 0xc9, 0x1d, 0xd3, 0xfe, 0xa1, 0x1e, 0x12, 0x02, 0x00, 0x77, 0x24, 0xe9,
+ 0xcf, 0x40, 0x64, 0x20,
+ 0xf0, 0xde, 0x0f, 0x01, 0xf2, 0x02, 0x62, 0x1f, 0x0b, 0x00, 0xef, 0xac,
+ 0x03, 0x46, 0x0f, 0xee,
+ 0xf0, 0x03, 0x30, 0x00, 0x24, 0x22, 0x0e, 0xb9, 0x10, 0x53, 0x02, 0xbd,
+ 0x0e, 0x14, 0x21, 0xef,
+ 0xed, 0x13, 0x57, 0xff, 0xde, 0x00, 0x11, 0x00, 0x12, 0x00, 0xcd, 0x02,
+ 0x11, 0x00, 0x40, 0xdd,
+ 0x9a, 0x14, 0x34, 0x0e, 0x00, 0xee, 0xe0, 0x22, 0xec, 0xcd, 0x20, 0x54,
+ 0xef, 0xcb, 0x00, 0x55,
+ 0x00, 0xed, 0xef, 0x00, 0x75, 0x00, 0xdd, 0xff, 0x22, 0x1f, 0xde, 0x01,
+ 0x01, 0x1f, 0xff, 0xee,
+ 0xda, 0x11, 0x30, 0xbf, 0x1f, 0x41, 0xdc, 0x02, 0x36, 0xce, 0xed, 0x02,
+ 0x34, 0x00, 0x9b, 0x00,
+ 0x01, 0x11, 0x00, 0xcc, 0xfe, 0x01, 0x01, 0xce, 0xfe, 0x00, 0x56, 0x32,
+ 0xde, 0x9b, 0x00, 0x21,
+ 0x00, 0x00, 0xf0, 0x01, 0x23, 0xfd, 0xdd, 0x0f, 0x10, 0xf0, 0xce, 0xff,
+ 0x02, 0x35, 0x0d, 0x88,
+ 0xf0, 0x21, 0x31, 0xed, 0xfe, 0x21, 0x02, 0x0f, 0x0e, 0xd0, 0x02, 0x22,
+ 0x2f, 0xb8, 0xcc, 0x10,
+ 0x31, 0x34, 0xae, 0xdb, 0x00, 0x10, 0x11, 0x21, 0x01, 0xac, 0xed, 0xf0,
+ 0x33, 0x23, 0xdc, 0xbb,
+ 0x10, 0x33, 0xe0, 0xad, 0xff, 0x32, 0x10, 0xee, 0xd0, 0x11, 0x1f, 0x0e,
+ 0x27, 0x42, 0xcc, 0xee,
+ 0x00, 0x21, 0xd0, 0xab, 0x01, 0x25, 0x0f, 0x0e, 0xdf, 0x00, 0x55, 0xf0,
+ 0xdc, 0x51, 0x43, 0xef,
+ 0x0e, 0x01, 0xe2, 0xff, 0x10, 0x74, 0x11, 0xff, 0x01, 0x11, 0xee, 0x00,
+ 0x33, 0xfb, 0x9b, 0x12,
+ 0x23, 0x00, 0x0f, 0x0d, 0x00, 0x03, 0x56, 0x0f, 0x0c, 0xf0, 0x04, 0x20,
+ 0xee, 0xdf, 0x64, 0x22,
+ 0x1e, 0xed, 0xe1, 0x12, 0x01, 0x64, 0x22, 0x0d, 0xee, 0x02, 0xfc, 0xdc,
+ 0x35, 0x65, 0xe0, 0xf0,
+ 0x2f, 0x00, 0xd0, 0xf0, 0x0e, 0x00, 0xe3, 0x24, 0x41, 0xef, 0xab, 0x22,
+ 0x32, 0xde, 0xcf, 0x47,
+ 0x74, 0xff, 0xdc, 0x00, 0x25, 0xff, 0xef, 0x11, 0x00, 0xd0, 0x62, 0x11,
+ 0xff, 0xe0, 0x01, 0x32,
+ 0xfe, 0xff, 0x43, 0x00, 0xfc, 0x14, 0x15, 0x10, 0x00, 0x2d, 0x0f, 0x30,
+ 0x76, 0x30, 0x8c, 0xef,
+ 0x12, 0x32, 0xee, 0x00, 0x00, 0x00, 0x10, 0x35, 0x00, 0x1f, 0x0c, 0x10,
+ 0xf1, 0xc0, 0x62, 0x46,
+ 0xee, 0xcc, 0x32, 0x64, 0xff, 0xfc, 0xf0, 0x02, 0x21, 0x0f, 0x10, 0x22,
+ 0xfe, 0xef, 0x54, 0x02,
+ 0xee, 0xec, 0x10, 0x43, 0x25, 0x22, 0xce, 0xec, 0x21, 0x21, 0x35, 0xf0,
+ 0xad, 0xf0, 0x11, 0x0f,
+ 0x11, 0x57, 0x00, 0xcd, 0x01, 0x34, 0x00, 0xcd, 0x02, 0x02, 0x22, 0x21,
+ 0x00, 0xdc, 0xee, 0xef,
+ 0x54, 0x66, 0x01, 0xdd, 0xdc, 0x00, 0x31, 0x74, 0x01, 0x00, 0xdd, 0xfe,
+ 0x0f, 0x21, 0x24, 0xec,
+ 0xce, 0x32, 0x34, 0xfe, 0xdc, 0xf0, 0x00, 0x22, 0x31, 0xe0, 0xcf, 0xed,
+ 0x1f, 0x72, 0x57, 0xef,
+ 0xdc, 0x33, 0x32, 0x00, 0xed, 0x00, 0x01, 0x43, 0x33, 0xbb, 0xde, 0x00,
+ 0x11, 0x30, 0x03, 0xbe,
+ 0xfa, 0x00, 0x20, 0x00, 0x03, 0x45, 0xcb, 0xd0, 0x11, 0x00, 0x41, 0x04,
+ 0x10, 0x0e, 0xc0, 0x01,
+ 0x01, 0x00, 0x57, 0x12, 0xde, 0x00, 0x42, 0xd0, 0xde, 0x00, 0x00, 0x90,
+ 0x04, 0x57, 0x00, 0xdf,
+ 0xec, 0x00, 0x32, 0x13, 0xe0, 0xbd, 0x00, 0x41, 0xf0, 0xe1, 0x12, 0x0d,
+ 0xda, 0xf0, 0x20, 0x42,
+ 0xee, 0xac, 0x0e, 0x15, 0x11, 0xfe, 0xef, 0x10, 0xf1, 0x9b, 0x01, 0x34,
+ 0xfc, 0x0f, 0x20, 0x0f,
+ 0xcc, 0x0f, 0x03, 0x22, 0x0d, 0xfc, 0xef, 0xac, 0xff, 0x45, 0x42, 0xec,
+ 0xdc, 0x00, 0x23, 0xfe,
+ 0xf0, 0x0f, 0xec, 0x00, 0x73, 0x23, 0xfd, 0xdb, 0x00, 0x12, 0xff, 0x5f,
+ 0x22, 0xcd, 0xfa, 0x11,
+ 0x53, 0x00, 0xdd, 0x0f, 0x0c, 0xe0, 0x03, 0x31, 0xef, 0x0e, 0x00, 0xc0,
+ 0x00, 0xcc, 0xc8, 0x61,
+ 0x13, 0xde, 0x00, 0x11, 0xfb, 0xef, 0x0f, 0x0f, 0xff, 0xe2, 0xff, 0x0b,
+ 0x61, 0x11, 0xfe, 0xe0,
+ 0x23, 0xd0, 0x88, 0x0e, 0x21, 0x12, 0xf0, 0xdd, 0xf0, 0x00, 0x20, 0x2e,
+ 0xce, 0xf0, 0x05, 0x4f,
+ 0x0f, 0xde, 0x0c, 0xfd, 0x10, 0xf5, 0x9e, 0x0f, 0x3e, 0x11, 0x67, 0xd1,
+ 0xaa, 0x00, 0x41, 0xf0,
+ 0xe0, 0x10, 0x10, 0xdf, 0xef, 0x12, 0x10, 0x1d, 0x30, 0x23, 0xe0, 0xdb,
+ 0x10, 0x2f, 0x42, 0x45,
+ 0x00, 0xdd, 0xdd, 0x13, 0x22, 0x8a, 0xff, 0x11, 0x2f, 0xfb, 0xc1, 0x04,
+ 0xf0, 0xdd, 0x31, 0x55,
+ 0xde, 0xde, 0xe0, 0xc2, 0xf1, 0x42, 0x54, 0xde, 0xcb, 0x11, 0x12, 0xef,
+ 0xf0, 0x67, 0x00, 0xce,
+ 0x10, 0x23, 0xed, 0xd0, 0x00, 0x02, 0x13, 0x44, 0xfe, 0xba, 0x00, 0x33,
+ 0x00, 0x00, 0xfe, 0xff,
+ 0xf1, 0x13, 0x42, 0x01, 0xec, 0xfd, 0x72, 0x10, 0xd0, 0x04, 0xf1, 0x03,
+ 0x67, 0x00, 0xf0, 0x10,
+ 0x0c, 0x00, 0x12, 0xee, 0xee, 0x32, 0x15, 0xd0, 0xac, 0x11, 0x30, 0x21,
+ 0x57, 0xf0, 0x89, 0xf0,
+ 0x00, 0x22, 0x00, 0x10, 0x0f, 0x00, 0xde, 0x00, 0x10, 0x00, 0xff, 0x03,
+ 0x01, 0x1c, 0x40, 0x03,
+ 0xd0, 0xa0, 0x00, 0x2e, 0x0c, 0x00, 0x25, 0x00, 0x00, 0xe1, 0xed, 0x10,
+ 0x60, 0x0e, 0xec, 0x0f,
+ 0x01, 0xbe, 0xec, 0x53, 0x43, 0x26, 0xed, 0xec, 0x14, 0x44, 0xff, 0xfd,
+ 0x10, 0xf0, 0xce, 0x13,
+ 0x22, 0xec, 0x01, 0x55, 0xdd, 0xd0, 0x00, 0x72, 0x1d, 0x0c, 0x27, 0x22,
+ 0xec, 0xff, 0x23, 0x02,
+ 0xcf, 0x0f, 0x0e, 0xdf, 0x00, 0x40, 0x2f, 0xa8, 0x00, 0xf3, 0xf0, 0xed,
+ 0xe0, 0x01, 0x20, 0x71,
+ 0x32, 0xed, 0x0c, 0x0e, 0x03, 0x17, 0xf1, 0xff, 0x20, 0xef, 0xef, 0xdd,
+ 0x8a, 0x02, 0x47, 0x01,
+ 0xce, 0xfe, 0x10, 0x23, 0x00, 0x00, 0x41, 0x0f, 0xdf, 0x33, 0x21, 0x00,
+ 0xed, 0xed, 0x70, 0x12,
+ 0xe1, 0xe6, 0x33, 0x01, 0xe2, 0x62, 0x40, 0x01, 0xc0, 0x16, 0x31, 0x00,
+ 0x1f, 0xfc, 0xfd, 0x23,
+ 0x34, 0xef, 0x50, 0x52, 0xf9, 0xf0, 0x43, 0x36, 0xef, 0xef, 0x00, 0x3f,
+ 0x52, 0x00, 0xbc, 0x10,
+ 0x76, 0x00, 0x00, 0xff, 0x10, 0x02, 0x13, 0x03, 0xff, 0xfb, 0x00, 0x01,
+ 0x02, 0xe0, 0x23, 0x53,
+ 0x00, 0xf1, 0x24, 0x20, 0x15, 0x01, 0xee, 0x10, 0x77, 0x20, 0xf0, 0x01,
+ 0x34, 0x51, 0x11, 0x0d,
+ 0xc0, 0x00, 0x32, 0x20, 0x00, 0x17, 0x36, 0xae, 0xee, 0x32, 0x63, 0x00,
+ 0xdd, 0x12, 0x13, 0x0f,
+ 0x21, 0x45, 0xce, 0x0d, 0x32, 0x45, 0x02, 0x00, 0x00, 0xec, 0x0f, 0x71,
+ 0x24, 0xdc, 0xcf, 0x00,
+ 0x22, 0xf0, 0xff, 0x00, 0x0c, 0x00, 0x12, 0x1f, 0xf9, 0x40, 0x32, 0xd0,
+ 0x0e, 0xf0, 0xf1, 0x3f,
+ 0x6f, 0x03, 0xff, 0xed, 0x32, 0x24, 0xd9, 0x0e, 0x52, 0x03, 0x8f, 0x0b,
+ 0xf0, 0x10, 0x20, 0x03,
+ 0x00, 0x00, 0x31, 0x02, 0x9a, 0x00, 0x55, 0x00, 0xcd, 0x0f, 0xff, 0xe0,
+ 0x12, 0x22, 0xee, 0xd0,
+ 0x02, 0x20, 0x0f, 0xcd, 0xe2, 0x27, 0x15, 0xdc, 0xcd, 0xe0, 0xe2, 0x34,
+ 0x20, 0xad, 0xff, 0x00,
+ 0x15, 0xf0, 0xbd, 0x0e, 0x30, 0xc0, 0xba, 0xf0, 0x00, 0x01, 0x00, 0xf0,
+ 0xee, 0xbd, 0x00, 0x11,
+ 0x00, 0xcf, 0xfd, 0x0a, 0xfc, 0xee, 0x0f, 0x00, 0x42, 0xdd, 0xdb, 0x00,
+ 0x3e, 0x71, 0xf3, 0xae,
+ 0x0e, 0x1f, 0x2e, 0x23, 0x17, 0x03, 0xcc, 0x0d, 0x00, 0x10, 0xdd, 0x0e,
+ 0x41, 0x12, 0x01, 0xdc,
+ 0xdd, 0x05, 0x42, 0xc9, 0xbc, 0x42, 0x33, 0xbe, 0xfe, 0x01, 0x01, 0x0f,
+ 0x20, 0x24, 0x10, 0xf0,
+ 0xc0, 0xf0, 0xfe, 0x51, 0x10, 0xb8, 0x0f, 0x00, 0x02, 0xf0, 0x05, 0x00,
+ 0xbf, 0xfd, 0x13, 0x44,
+ 0x00, 0xde, 0x0f, 0x02, 0xce, 0xdc, 0x20, 0x2b, 0x0e, 0x02, 0xf3, 0xc0,
+ 0xaa, 0xf0, 0x10, 0x20,
+ 0xf1, 0xd0, 0x00, 0xe0, 0x8c, 0xf2, 0x45, 0xfc, 0xbc, 0x01, 0x34, 0x00,
+ 0xcb, 0x00, 0x21, 0x21,
+ 0x00, 0x01, 0xe0, 0xbc, 0x00, 0x01, 0x22, 0xfd, 0x00, 0x00, 0xee, 0x03,
+ 0xf0, 0xdd, 0xee, 0x52,
+ 0x31, 0xeb, 0xbc, 0x00, 0x26, 0x20, 0x00, 0x9d, 0x0c, 0x22, 0x47, 0x00,
+ 0xcd, 0x0e, 0x02, 0x14,
+ 0x00, 0xbc, 0x00, 0x01, 0x21, 0x01, 0x1f, 0xfd, 0xdf, 0x0f, 0x10, 0x54,
+ 0x01, 0xbb, 0x0f, 0x32,
+ 0x32, 0xce, 0x00, 0x23, 0xf8, 0xff, 0x62, 0x01, 0xdf, 0x00, 0x00, 0xf0,
+ 0x10, 0x30, 0x1e, 0x1f,
+ 0xd0, 0xdf, 0xb8, 0xfe, 0x40, 0x47, 0xf0, 0xd0, 0x50, 0x0f, 0x0f, 0xce,
+ 0xf0, 0x00, 0x33, 0x41,
+ 0xef, 0xab, 0x10, 0x34, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x10, 0x67,
+ 0x11, 0xff, 0x00, 0x00,
+ 0x22, 0x0e, 0xee, 0x23, 0x75, 0x11, 0xf0, 0xed, 0x00, 0x46, 0x44, 0x00,
+ 0xf0, 0x0e, 0xf0, 0x01,
+ 0x64, 0x01, 0x00, 0xf0, 0x11, 0x40, 0xfd, 0x06, 0x13, 0x0c, 0xdd, 0x65,
+ 0x22, 0x00, 0x0e, 0x02,
+ 0x03, 0x10, 0x0e, 0x33, 0x11, 0x22, 0x22, 0x66, 0x51, 0xff, 0xfd, 0x01,
+ 0x34, 0x34, 0xe0, 0xc0,
+ 0x1e, 0x31, 0x11, 0x03, 0x20, 0xde, 0x30, 0x77, 0x2e, 0x0f, 0x27, 0x12,
+ 0x30, 0x31, 0x80, 0xff,
+ 0x10, 0x30, 0x02, 0xf4, 0xcf, 0xff, 0x22, 0x26, 0x01, 0x21, 0x20, 0x52,
+ 0x0f, 0xff, 0x01, 0xf0,
+ 0xed, 0x36, 0x03, 0x10, 0x72, 0x1f, 0xa9, 0x00, 0x25, 0x21, 0xe0, 0x00,
+ 0x21, 0x22, 0xde, 0xcb,
+ 0xde, 0x01, 0x34, 0xd2, 0x9d, 0xfc, 0x20, 0x32, 0xe0, 0x1f, 0x63, 0xf2,
+ 0xe0, 0xcc, 0x1e, 0x33,
+ 0x00, 0x10, 0x01, 0xe1, 0xde, 0xdc, 0xf1, 0x02, 0x0c, 0x0f, 0xd1, 0x8a,
+ 0xad, 0x11, 0x35, 0x0f,
+ 0xed, 0x00, 0x0e, 0xee, 0x0f, 0x0e, 0x0f, 0x20, 0x55, 0x20, 0xf9, 0x9c,
+ 0x00, 0x00, 0xf1, 0x11,
+ 0x00, 0xdd, 0xee, 0x00, 0x71, 0x0e, 0xda, 0x25, 0x31, 0xdc, 0xcf, 0x22,
+ 0x55, 0xee, 0xdd, 0x10,
+ 0x34, 0xff, 0xdd, 0x31, 0x30, 0x0f, 0xfd, 0xd0, 0x03, 0x24, 0x00, 0x88,
+ 0xef, 0x00, 0x30, 0x01,
+ 0xe0, 0x12, 0x10, 0xaa, 0x10, 0x23, 0xf0, 0xff, 0x0f, 0xef, 0xce, 0x41,
+ 0x54, 0xf0, 0xdd, 0xe0,
+ 0xe1, 0xe0, 0xeb, 0xff, 0x44, 0x12, 0x00, 0x0f, 0xdb, 0x9e, 0xf0, 0x00,
+ 0x54, 0x00, 0xc0, 0x0f,
+ 0x00, 0x20, 0x1f, 0x0f, 0xee, 0x0b, 0x40, 0x45, 0x01, 0xdc, 0x0e, 0x20,
+ 0x23, 0x2e, 0x0c, 0x11,
+ 0x34, 0x8e, 0xf0, 0x25, 0x31, 0x0f, 0x0f, 0xbc, 0xee, 0x20, 0x56, 0xf0,
+ 0xdd, 0x00, 0xe0, 0xe0,
+ 0x12, 0x30, 0x0f, 0xfd, 0xed, 0x1e, 0x75, 0x00, 0xdc, 0xde, 0x02, 0x22,
+ 0x63, 0x01, 0xbb, 0xde,
+ 0x01, 0x55, 0xf0, 0xe0, 0x00, 0x01, 0xf0, 0x01, 0x12, 0x10, 0xee, 0x04,
+ 0x04, 0xb9, 0x10, 0x40,
+ 0x11, 0xbe, 0xfe, 0x06, 0x10, 0x1d, 0x01, 0x16, 0xa0, 0xed, 0x01, 0x22,
+ 0xdf, 0xf0, 0x24, 0xef,
+ 0xed, 0x21, 0x22, 0xd0, 0xef, 0x51, 0x11, 0xed, 0xcc, 0x0e, 0x10, 0x01,
+ 0xcd, 0x30, 0x5f, 0xe8,
+ 0xfc, 0x22, 0x03, 0xed, 0xbc, 0x10, 0x4f, 0x20, 0x20, 0x9a, 0xcc, 0x00,
+ 0x31, 0x00, 0xee, 0x11,
+ 0x2f, 0xee, 0x10, 0x34, 0x20, 0x00, 0xac, 0x10, 0x21, 0x00, 0xfd, 0xef,
+ 0x00, 0xfe, 0x00, 0xfe,
+ 0x34, 0xf4, 0x8d, 0x0c, 0x42, 0x01, 0xc0, 0x17, 0x57, 0x0f, 0xde, 0xef,
+ 0x01, 0x44, 0x21, 0x00,
+ 0xd0, 0xfd, 0xf0, 0xf2, 0x01, 0x11, 0x21, 0xe1, 0x00, 0xe0, 0x0f, 0x72,
+ 0x14, 0xef, 0xef, 0x37,
+ 0x44, 0xfe, 0xee, 0x00, 0xa4, 0x05, 0x20, 0x0c, 0xce, 0xb0, 0xff, 0x32,
+ 0x63, 0xeb, 0xfd, 0x00,
+ 0x01, 0x04, 0x31, 0x1f, 0xfb, 0xce, 0x01, 0x04, 0x00, 0xce, 0x0f, 0xfd,
+ 0xed, 0x0d, 0x34, 0x02,
+ 0xcd, 0x00, 0x00, 0xdf, 0x10, 0x77, 0x62, 0xef, 0xec, 0x10, 0x42, 0x11,
+ 0xed, 0x10, 0x01, 0xef,
+ 0xe0, 0x27, 0x30, 0xdb, 0x00, 0x21, 0x21, 0xb0, 0xa0, 0xf1, 0x00, 0x10,
+ 0x57, 0x33, 0xde, 0xed,
+ 0x33, 0x33, 0xff, 0xc0, 0x05, 0x50, 0x0f, 0xff, 0xa0, 0x14, 0x22, 0x0f,
+ 0xfe, 0x05, 0x05, 0x01,
+ 0xf0, 0x11, 0x10, 0xf1, 0x03, 0x12, 0xed, 0x20, 0x35, 0x8e, 0xeb, 0x51,
+ 0x13, 0xdd, 0xf0, 0x30,
+ 0x2f, 0x0e, 0xaf, 0x00, 0x0d, 0x0c, 0x12, 0x12, 0xdc, 0x01, 0x57, 0x22,
+ 0xfe, 0xdc, 0x2f, 0x34,
+ 0x22, 0x0f, 0x0e, 0x20, 0xa0, 0xeb, 0x10, 0x32, 0x00, 0x10, 0x31, 0x00,
+ 0xdd, 0x10, 0x0f, 0x42,
+ 0x37, 0xf5, 0xbe, 0xef, 0x2f, 0x60, 0x0f, 0x0f, 0x34, 0x52, 0xdd, 0x88,
+ 0x00, 0x43, 0x01, 0x10,
+ 0x00, 0xf0, 0x10, 0x53, 0xfe, 0xfb, 0x00, 0x15, 0x30, 0x0f, 0x11, 0x12,
+ 0xfe, 0x20, 0x70, 0x13,
+ 0x00, 0x04, 0xff, 0x0c, 0x10, 0x42, 0x00, 0xed, 0x00, 0x37, 0xf0, 0xc0,
+ 0x41, 0x44, 0xdd, 0xed,
+ 0x43, 0x20, 0x1f, 0x21, 0x00, 0xcc, 0x43, 0x77, 0x02, 0xcc, 0x1f, 0x13,
+ 0x23, 0xfd, 0xff, 0x15,
+ 0x00, 0xd0, 0x10, 0x0d, 0x0d, 0xe3, 0x16, 0x61, 0x10, 0x0f, 0x0c, 0x00,
+ 0x13, 0x34, 0x73, 0x10,
+ 0xed, 0xfe, 0x12, 0x00, 0xfe, 0xe0, 0xf7, 0xe0, 0x31, 0x42, 0xe0, 0xf0,
+ 0x33, 0x34, 0xf0, 0xfe,
+ 0x32, 0x60, 0x3e, 0x30, 0xd3, 0x83, 0x07, 0x33, 0xe8, 0xdd, 0x51, 0x03,
+ 0xf2, 0x13, 0xff, 0xdd,
+ 0xf0, 0x30, 0x76, 0xf0, 0xdd, 0xfe, 0xff, 0x12, 0x46, 0x00, 0x0f, 0x10,
+ 0x01, 0xd0, 0xab, 0x21,
+ 0x64, 0x0e, 0xdd, 0x21, 0x35, 0x00, 0xce, 0x0d, 0x00, 0x37, 0x41, 0xdf,
+ 0xcd, 0x11, 0x32, 0x00,
+ 0xde, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xae, 0x15, 0x74, 0x00, 0x0d,
+ 0xdf, 0x00, 0x01, 0x52,
+ 0x01, 0xfb, 0xef, 0x00, 0xf1, 0x12, 0x21, 0x0c, 0xbd, 0x01, 0x07, 0x01,
+ 0x00, 0xda, 0x9f, 0x00,
+ 0x02, 0xf0, 0xee, 0x02, 0x01, 0xed, 0xed, 0xf0, 0xd0, 0xfc, 0x0f, 0xc0,
+ 0x90, 0x10, 0x4e, 0x25,
+ 0xca, 0xdd, 0x32, 0x24, 0xdf, 0xe0, 0xee, 0xdf, 0x10, 0x4f, 0xd8, 0xd0,
+ 0xe1, 0xae, 0xfc, 0x31,
+ 0x23, 0xd1, 0xbd, 0xfb, 0xff, 0x0e, 0x50, 0x0f, 0x12, 0x04, 0x0e, 0x0e,
+ 0xac, 0xdd, 0x10, 0x00,
+ 0xde, 0xff, 0x11, 0x00, 0x08, 0x0f, 0xdf, 0x01, 0x53, 0xce, 0xba, 0x10,
+ 0x73, 0x0f, 0x0c, 0xe0,
+ 0x03, 0x00, 0xdb, 0x0f, 0x30, 0x00, 0xc1, 0xde, 0xff, 0x13, 0x00, 0x98,
+ 0x00, 0x42, 0xf1, 0xdf,
+ 0x00, 0xfe, 0xfd, 0xe0, 0xfe, 0xef, 0x00, 0xf1, 0xdd, 0x00, 0xd3, 0x9d,
+ 0xfe, 0xea, 0xec, 0x21,
+ 0x56, 0xc0, 0xcd, 0xfe, 0x02, 0x13, 0x01, 0xc2, 0xfe, 0xfd, 0x16, 0x11,
+ 0xcd, 0xed, 0xf0, 0x00,
+ 0x61, 0x0e, 0xd9, 0xe0, 0x43, 0x10, 0x0d, 0xe3, 0x12, 0x2b, 0x0a, 0xf0,
+ 0xf0, 0x76, 0x60, 0x00,
+ 0xdd, 0x00, 0x03, 0x00, 0x10, 0x20, 0x30, 0x01, 0xe0, 0x0e, 0x11, 0x20,
+ 0xfd, 0xb9, 0x10, 0x75,
+ 0x10, 0xf0, 0x0e, 0x2f, 0x3f, 0x52, 0x05, 0xd0, 0xed, 0x1f, 0x62, 0x01,
+ 0xfc, 0x00, 0x03, 0x32,
+ 0xfe, 0xdf, 0x23, 0x0e, 0xec, 0x05, 0x74, 0x10, 0xd0, 0xf3, 0xef, 0x0c,
+ 0x72, 0x04, 0xe1, 0x02,
+ 0x40, 0x02, 0xe2, 0x24, 0x10, 0xfe, 0x24, 0x23, 0xde, 0xf1, 0x02, 0xe0,
+ 0x17, 0x23, 0x0e, 0x0f,
+ 0x02, 0x93, 0x23, 0x56, 0x32, 0x00, 0xeb, 0x20, 0x64, 0x01, 0x11, 0x2f,
+ 0x41, 0x26, 0x10, 0x00,
+ 0x22, 0x31, 0x10, 0x10, 0xe3, 0xc0, 0x63, 0x47, 0xf0, 0xcc, 0x05, 0x05,
+ 0x82, 0x00, 0xee, 0x00,
+ 0x98, 0x2f, 0x89, 0x33, 0xb1, 0x32, 0xa0, 0x3b, 0x65, 0x01, 0xff, 0xee,
+ 0x00, 0x01, 0x71, 0x00,
+ 0x00, 0xf5, 0x10, 0x30, 0x30, 0xef, 0xdd, 0x30, 0x24, 0x05, 0x23, 0x2d,
+ 0x0c, 0x4f, 0x70, 0x25,
+ 0x02, 0xe0, 0xee, 0x01, 0x31, 0x2f, 0xfd, 0x77, 0x25, 0xff, 0xde, 0x00,
+ 0x00, 0xd2, 0xe0, 0x65,
+ 0x52, 0x00, 0xee, 0xe0, 0x10, 0x02, 0xf0, 0x03, 0x21, 0x2d, 0x2f, 0x43,
+ 0x07, 0x01, 0xd0, 0xed,
+ 0x30, 0x70, 0x26, 0xf0, 0xbe, 0xfe, 0x33, 0x42, 0xfe, 0x00, 0x31, 0xfb,
+ 0x0f, 0x20, 0x22, 0x01,
+ 0xda, 0x8e, 0xfe, 0x00, 0x0e, 0x63, 0x13, 0xfb, 0x0e, 0xce, 0xfc, 0x12,
+ 0x02, 0xec, 0x0f, 0x75,
+ 0x10, 0xcd, 0x0e, 0x11, 0x12, 0x24, 0x54, 0xfe, 0xea, 0xdf, 0x20, 0x55,
+ 0x10, 0xff, 0xcd, 0x0f,
+ 0x00, 0x46, 0x10, 0xef, 0xdf, 0x00, 0x1f, 0x21, 0x02, 0xde, 0x0f, 0x73,
+ 0x04, 0x00, 0xff, 0x00,
+ 0xf0, 0x13, 0x61, 0x0f, 0xdb, 0xf2, 0x04, 0x1f, 0x0f, 0x03, 0xc0, 0x00,
+ 0x37, 0x23, 0xaf, 0xfe,
+ 0x00, 0x03, 0x0c, 0x31, 0x34, 0xe0, 0xee, 0x00, 0x32, 0xf0, 0xe0, 0x75,
+ 0x35, 0xed, 0x8c, 0x00,
+ 0x11, 0x0f, 0xfd, 0x00, 0x10, 0xdd, 0xed, 0x0f, 0x3d, 0xe0, 0x07, 0x01,
+ 0xde, 0x8c, 0xc0, 0x11,
+ 0x33, 0xdb, 0x01, 0x03, 0xfb, 0xbd, 0x0f, 0x02, 0xe0, 0xfc, 0xef, 0x00,
+ 0x22, 0x35, 0x10, 0xac,
+ 0xec, 0x00, 0xf1, 0x00, 0xde, 0x8b, 0xff, 0xf1, 0x11, 0x10, 0x00, 0x0e,
+ 0xfb, 0xf0, 0xf3, 0xd2,
+ 0xdf, 0x3f, 0x71, 0x10, 0xcc, 0xdf, 0x00, 0x10, 0x31, 0xc1, 0xf0, 0x00,
+ 0xf8, 0xcd, 0x0f, 0x00,
+ 0x11, 0x11, 0xfc, 0xcc, 0x1f, 0x40, 0x02, 0xae, 0xe8, 0xdf, 0xef, 0x50,
+ 0x20, 0xef, 0xcd, 0x1f,
+ 0x0e, 0x00, 0x0f, 0xf9, 0x1e, 0x71, 0x10, 0xe0, 0x25, 0x10, 0xca, 0xf0,
+ 0x30, 0x21, 0xcf, 0xdd,
+ 0x20, 0x11, 0xe0, 0x0e, 0x00, 0xcd, 0xd0, 0x23, 0x3f, 0x1d, 0x00, 0x8b,
+ 0xfb, 0x00, 0x31, 0x20,
+ 0xf0, 0xe0, 0xcc, 0xdd, 0xfe, 0xd0, 0xd0, 0x00, 0x62, 0xef, 0xb1, 0x06,
+ 0x11, 0x20, 0x03, 0x41,
+ 0x0d, 0xc8, 0x0f, 0x31, 0x31, 0xde, 0xf0, 0x04, 0x00, 0x0e, 0x6f, 0x0a,
+ 0xbc, 0x00, 0x11, 0xe0,
+ 0x01, 0x65, 0xff, 0xec, 0x00, 0x03, 0x10, 0x0f, 0x3f, 0x10, 0x21, 0xd0,
+ 0xa1, 0x16, 0x20, 0x0f,
+ 0x0f, 0x30, 0x72, 0x02, 0x07, 0x01, 0x1e, 0x1d, 0x01, 0x07, 0x53, 0x0f,
+ 0xf0, 0xe0, 0xff, 0x00,
+ 0x12, 0x01, 0xe0, 0xa3, 0xd0, 0xf0, 0x40, 0x22, 0xc0, 0xe4, 0x05, 0x00,
+ 0xf0, 0xfe, 0x55, 0x03,
+ 0x02, 0x04, 0xfd, 0x9d, 0x16, 0x55, 0x00, 0x0f, 0x00, 0xe0, 0xd2, 0x00,
+ 0x02, 0xe0, 0xaf, 0x00,
+ 0x05, 0x10, 0xda, 0x11, 0x53, 0xe0, 0xcc, 0x01, 0x22, 0xd0, 0xd0, 0xef,
+ 0x00, 0x11, 0x12, 0xe1,
+ 0x00, 0x08, 0xd0, 0xcf, 0xe3, 0x13, 0x6f, 0x0b, 0xcf, 0xff, 0xf0, 0x75,
+ 0x1e, 0xec, 0xc0, 0x00,
+ 0x65, 0x00, 0x0e, 0x00, 0xf0, 0x0e, 0x52, 0x00, 0xd9, 0xe0, 0x11, 0x31,
+ 0x20, 0x50, 0x0f, 0xdb,
+ 0xff, 0x30, 0x12, 0x14, 0x0f, 0xbc, 0xef, 0x11, 0x20, 0x11, 0x42, 0x11,
+ 0xfe, 0x00, 0x52, 0x11,
+ 0x0e, 0x00, 0x16, 0x20, 0xf0, 0x00, 0x10, 0xdf, 0xa0, 0x03, 0xf0, 0x2f,
+ 0x20, 0xe2, 0x33, 0x30,
+ 0xdf, 0xab, 0xec, 0x0d, 0x5d, 0x10, 0xf7, 0xc1, 0x0f, 0x1c, 0x10, 0x10,
+ 0x10, 0x53, 0x16, 0xdf,
+ 0xef, 0x25, 0x21, 0xdf, 0xdd, 0x72, 0x25, 0xee, 0xde, 0x30, 0x12, 0x00,
+ 0x61, 0x04, 0xda, 0xf0,
+ 0x20, 0x14, 0x00, 0x2d, 0x62, 0x10, 0x0e, 0xec, 0x00, 0x11, 0x04, 0x01,
+ 0x2f, 0x7f, 0x20, 0x25,
+ 0x76, 0x00, 0x00, 0x20, 0x20, 0x12, 0xdf, 0x00, 0x61, 0x1f, 0x20, 0x17,
+ 0x00, 0x0e, 0x01, 0x02,
+ 0x00, 0x7f, 0x3f, 0x02, 0x05, 0xd0, 0x0f, 0x0e, 0x60, 0x37, 0x01, 0xcf,
+ 0x0e, 0x11, 0x21, 0xff,
+ 0x15, 0x22, 0xff, 0xdf, 0xe3, 0xe4, 0x10, 0x7e, 0x00, 0x00, 0x37, 0x47,
+ 0xef, 0xdf, 0x40, 0x41,
+ 0x01, 0xe0, 0xe0, 0x00, 0x01, 0x01, 0xe0, 0x0f, 0xdf, 0x10, 0x40, 0xd0,
+ 0xb0, 0x04, 0x03, 0x52,
+ 0x0f, 0xd9, 0x01, 0x23, 0x00, 0xef, 0xef, 0x0e, 0x7c, 0x74, 0x57, 0xf0,
+ 0xee, 0x20, 0x22, 0x01,
+ 0x00, 0x0e, 0x01, 0x12, 0x0e, 0x0e, 0x12, 0x55, 0x31, 0xff, 0xea, 0x0f,
+ 0xef, 0x21, 0x63, 0x00,
+ 0xfb, 0x00, 0x42, 0x00, 0xda, 0x0f, 0x00, 0x02, 0xd0, 0x2f, 0x70, 0x2f,
+ 0xdf, 0xc0, 0x23, 0x37,
+ 0x10, 0xe0, 0xbb, 0xff, 0x21, 0x62, 0x00, 0xf0, 0x10, 0x00, 0xe0, 0x0d,
+ 0x31, 0x10, 0xd0, 0xce,
+ 0xdf, 0xe4, 0x03, 0xba, 0xfd, 0x10, 0x30, 0x01, 0xc0, 0xda, 0x00, 0x40,
+ 0x67, 0xf0, 0xbf, 0xfd,
+ 0x00, 0x20, 0x01, 0x11, 0x01, 0xde, 0xe0, 0x15, 0x10, 0xeb, 0x20, 0x50,
+ 0x00, 0xe0, 0xff, 0xce,
+ 0xe1, 0xe0, 0xbc, 0xed, 0x00, 0x00, 0x0c, 0x0d, 0xd0, 0xe0, 0x05, 0xc0,
+ 0x8d, 0xda, 0x00, 0x40,
+ 0xf2, 0xbd, 0xfb, 0x10, 0x11, 0x00, 0x01, 0xef, 0xfd, 0xef, 0x10, 0x23,
+ 0x12, 0xcb, 0xde, 0x00,
+ 0x30, 0xbd, 0xd8, 0x11, 0x22, 0xc0, 0xe1, 0x0f, 0xcd, 0xbf, 0x00, 0x27,
+ 0x00, 0xad, 0xef, 0xf0,
+ 0x10, 0x20, 0x11, 0xd2, 0xcd, 0x1b, 0x2f, 0xee, 0xa0, 0x02, 0x05, 0x1f,
+ 0x10, 0x01, 0xe0, 0xcc,
+ 0xee, 0x0d, 0x73, 0x17, 0xce, 0xec, 0x10, 0x34, 0x11, 0xdf, 0xbd, 0x0d,
+ 0x0f, 0xee, 0x01, 0x01,
+ 0x09, 0x0f, 0x11, 0xb0, 0xe0, 0x00, 0xdc, 0xdc, 0x10, 0x42, 0xe4, 0xcf,
+ 0xcb, 0xbe, 0xf0, 0x33,
+ 0x41, 0xfd, 0xcc, 0x02, 0x23, 0x00, 0xcd, 0x04, 0x02, 0x0c, 0xcd, 0xf0,
+ 0xff, 0x15, 0x00, 0xa9,
+ 0x00, 0x00, 0x42, 0x21, 0x00, 0xef, 0xee, 0x10, 0x43, 0x00, 0xdf, 0x00,
+ 0x00, 0x26, 0x01, 0x00,
+ 0x0b, 0xbe, 0x00, 0x12, 0x74, 0x0e, 0xe0, 0x00, 0x01, 0x0f, 0x4f, 0x20,
+ 0x13, 0x12, 0x1e, 0x1d,
+ 0x00, 0x10, 0x10, 0x5a, 0x40, 0xe0, 0x9c, 0x1e, 0x5f, 0x01, 0xdf, 0x0a,
+ 0x0d, 0x3f, 0x24, 0xf0,
+ 0xdb, 0x00, 0x11, 0x71, 0x2e, 0xf9, 0xdf, 0x21, 0x44, 0xf3, 0xcc, 0xfe,
+ 0x00, 0x55, 0x31, 0xf0,
+ 0xd0, 0x00, 0xf0, 0xf1, 0x00, 0x33, 0x72, 0xff, 0x00, 0x03, 0x00, 0xed,
+ 0xfb, 0x20, 0x23, 0x47,
+ 0x11, 0xef, 0x0f, 0x14, 0x43, 0xef, 0xce, 0xff, 0x37, 0x32, 0xcf, 0xd0,
+ 0x22, 0x74, 0x50, 0xff,
+ 0x05, 0x02, 0x11, 0x00, 0xf4, 0xf0, 0x00, 0x30, 0x30, 0x01, 0x11, 0x0e,
+ 0x1e, 0x52, 0x43, 0x44,
+ 0x12, 0x32, 0x0f, 0xeb, 0xf0, 0x31, 0x44, 0x01, 0xf1, 0xbf, 0xec, 0x20,
+ 0x71, 0x22, 0x37, 0x0f,
+ 0x10, 0x67, 0x11, 0x0f, 0xfb, 0x00, 0x62, 0x02, 0x0e, 0x11, 0x24, 0x20,
+ 0xfe, 0xff, 0x23, 0x76,
+ 0x10, 0xfd, 0xf0, 0x33, 0x12, 0x0e, 0x03, 0x25, 0xf0, 0xee, 0x01, 0x00,
+ 0x00, 0x22, 0x77, 0x10,
+ 0x11, 0x13, 0x00, 0x1f, 0x40, 0x55, 0x02, 0x13, 0x40, 0x00, 0x1f, 0x01,
+ 0x02, 0x40, 0x42, 0x03,
+ 0xbc, 0x00, 0x03, 0x02, 0xf4, 0xd1, 0xf1, 0x02, 0x02, 0x03, 0x2a, 0x0a,
+ 0x60, 0x65, 0x02, 0xee,
+ 0xcb, 0x10, 0x21, 0x23, 0x10, 0xe0, 0xfd, 0xfd, 0x32, 0x13, 0xad, 0x0c,
+ 0x13, 0x35, 0x10, 0xf0,
+ 0xe0, 0xdf, 0xaa, 0xfd, 0xf0, 0x24, 0x41, 0x0f, 0xcb, 0xff, 0xfe, 0x32,
+ 0x22, 0xe0, 0xac, 0x0f,
+ 0x20, 0x41, 0x00, 0xf2, 0x12, 0xfe, 0xb8, 0xf0, 0x10, 0x00, 0xdf, 0xd0,
+ 0xf2, 0x64, 0x10, 0x0d,
+ 0xc0, 0xff, 0x01, 0x36, 0x42, 0xf0, 0xce, 0xed, 0x0f, 0x32, 0x21, 0xf0,
+ 0x00, 0xd0, 0xab, 0xe0,
+ 0x02, 0xe2, 0xf0, 0xdc, 0xca, 0xee, 0x11, 0x44, 0xd0, 0xcf, 0xfe, 0xcf,
+ 0xde, 0x0d, 0x0f, 0x60,
+ 0x02, 0xe0, 0xed, 0xfb, 0xda, 0x9c, 0xfe, 0x01, 0x00, 0xba, 0x01, 0x22,
+ 0xee, 0xea, 0x00, 0x10,
+ 0x01, 0xd0, 0xe0, 0x10, 0xdb, 0x9e, 0xf0, 0xf0, 0x31, 0x32, 0xdf, 0x9a,
+ 0xff, 0x00, 0x00, 0x21,
+ 0x3f, 0x30, 0x02, 0xd0, 0x0d, 0xec, 0xfe, 0x01, 0x02, 0xef, 0x40, 0x0b,
+ 0xab, 0x00, 0x03, 0x11,
+ 0xcd, 0xfd, 0x03, 0xef, 0x89, 0x00, 0x13, 0x30, 0x60, 0x0f, 0xed, 0xe0,
+ 0x42, 0x00, 0xf0, 0xd1,
+ 0x00, 0x0b, 0x1f, 0xe1, 0xe0, 0x09, 0xef, 0x00, 0x0f, 0x41, 0x00, 0xb0,
+ 0xf2, 0x12, 0x1f, 0x25,
+ 0x03, 0x00, 0x72, 0x20, 0x0f, 0x10, 0x00, 0x55, 0x20, 0xec, 0xdf, 0x0e,
+ 0xf0, 0xd2, 0x93, 0xd0,
+ 0xf0, 0x08, 0x1d, 0x00, 0xd1, 0x47, 0x30, 0xae, 0xef, 0xf1, 0x33, 0x00,
+ 0xf0, 0xcf, 0xeb, 0xfe,
+ 0x12, 0x54, 0xec, 0xdd, 0x02, 0x00, 0x6f, 0x34, 0xff, 0xa9, 0x00, 0x00,
+ 0x12, 0x0f, 0xdc, 0xf0,
+ 0x03, 0x20, 0x1e, 0xc8, 0xde, 0x00, 0x22, 0x12, 0x10, 0xce, 0xcd, 0xed,
+ 0x0f, 0x31, 0xd5, 0x9f,
+ 0x0e, 0x41, 0x03, 0x01, 0xd0, 0xcc, 0x00, 0x04, 0x00, 0xf0, 0x11, 0x16,
+ 0xc0, 0xbf, 0xfe, 0x0f,
+ 0x1f, 0x20, 0x00, 0x15, 0xe0, 0x8e, 0xfd, 0x01, 0x55, 0xff, 0xde, 0x01,
+ 0xf0, 0x0b, 0x10, 0x22,
+ 0xf3, 0x9a, 0x00, 0x0f, 0x2f, 0x01, 0x36, 0x00, 0xef, 0x20, 0x42, 0x1f,
+ 0x0f, 0x01, 0x06, 0xb0,
+ 0x00, 0x00, 0x3e, 0x0e, 0xdc, 0xbf, 0x01, 0x21, 0x2d, 0x1e, 0xe1, 0xd3,
+ 0x0d, 0x0e, 0x45, 0x03,
+ 0xe9, 0x9d, 0xef, 0xf3, 0x46, 0x3f, 0xfb, 0xc0, 0xf0, 0x13, 0x70, 0x00,
+ 0x20, 0x20, 0x0f, 0x0e,
+ 0xf2, 0xe2, 0xd0, 0x35, 0x3f, 0xfe, 0x00, 0x20, 0xb2, 0x80, 0xf0, 0x25,
+ 0x30, 0x20, 0x12, 0xf1,
+ 0xba, 0x0e, 0x10, 0x33, 0x41, 0x00, 0x1f, 0x00, 0xfd, 0x20, 0x57, 0x03,
+ 0xfe, 0xff, 0xff, 0x00,
+ 0x53, 0x27, 0x01, 0xcf, 0xfe, 0x00, 0x22, 0x77, 0x01, 0x00, 0xff, 0x11,
+ 0x32, 0x33, 0xef, 0xcc,
+ 0x00, 0x25, 0x43, 0x01, 0xf0, 0xcc, 0xfe, 0x10, 0x31, 0x12, 0x11, 0x10,
+ 0x20, 0xcf, 0x8e, 0xde,
+ 0x0c, 0x20, 0x46, 0x02, 0xd0, 0xee, 0x01, 0x11, 0x32, 0x23, 0xe0, 0xd5,
+ 0x37, 0x21, 0x8d, 0x8b,
+ 0x02, 0x36, 0x30, 0xf0, 0xde, 0x00, 0xe0, 0x03, 0x21, 0x21, 0xdf, 0xcf,
+ 0x03, 0x43, 0x0e, 0xfd,
+ 0x04, 0x44, 0x00, 0xde, 0x23, 0x77, 0x10, 0xed, 0xf0, 0x00, 0x43, 0x03,
+ 0x1f, 0x0d, 0x0c, 0x12,
+ 0x65, 0x00, 0x20, 0x50, 0x0e, 0x0f, 0x02, 0x03, 0x3d, 0x2b, 0x21, 0x14,
+ 0x1e, 0x0c, 0x00, 0x11,
+ 0x72, 0x5d, 0x0a, 0xf0, 0x04, 0x1f, 0x1e, 0x20, 0x20, 0x00, 0x00, 0x43,
+ 0x1f, 0x08, 0x00, 0x42,
+ 0x21, 0xef, 0xc0, 0x11, 0x41, 0x0f, 0xee, 0x50, 0x64, 0x00, 0xef, 0x00,
+ 0x36, 0x43, 0x21, 0xee,
+ 0xfe, 0xed, 0xef, 0x27, 0x64, 0x0f, 0x0f, 0x54, 0x03, 0xef, 0x00, 0x14,
+ 0x00, 0xde, 0xf0, 0x26,
+ 0x10, 0x0e, 0x31, 0x02, 0xcf, 0x20, 0x77, 0x00, 0xd0, 0x1f, 0x40, 0x10,
+ 0x20, 0x03, 0xc0, 0xf0,
+ 0x11, 0x6f, 0x1e, 0x00, 0x01, 0x00, 0x0e, 0x2e, 0xe9, 0xe2, 0x02, 0x0d,
+ 0x4d, 0x73, 0x01, 0xea,
+ 0xfe, 0x02, 0x24, 0x31, 0x0c, 0xdd, 0x71, 0x35, 0x01, 0xee, 0xcb, 0xe0,
+ 0x10, 0x42, 0x00, 0xf0,
+ 0xdf, 0x15, 0x13, 0x02, 0x0f, 0x0e, 0xd0, 0x80, 0x00, 0x12, 0x20, 0xfe,
+ 0xf7, 0x07, 0xde, 0xac,
+ 0x00, 0x23, 0x00, 0x00, 0xc1, 0xd1, 0x02, 0x23, 0x22, 0x9d, 0xed, 0x00,
+ 0x31, 0x05, 0xd0, 0x9c,
+ 0x12, 0x47, 0xe0, 0xdf, 0xe1, 0xe1, 0xdd, 0xdd, 0x10, 0x42, 0xf0, 0xc0,
+ 0x02, 0x45, 0x0d, 0xeb,
+ 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xca, 0xff, 0x10, 0xd0, 0x8a, 0xf0, 0x40,
+ 0x12, 0xce, 0xee, 0xf1,
+ 0x00, 0x0c, 0x1f, 0x10, 0x11, 0x03, 0xee, 0xd8, 0x1f, 0x50, 0x20, 0xe0,
+ 0xce, 0xfe, 0x2f, 0x1b,
+ 0xde, 0x8f, 0xf1, 0xd2, 0xed, 0xfd, 0x00, 0x2e, 0xea, 0xde, 0xe2, 0x21,
+ 0x50, 0x1f, 0xfd, 0xfd,
+ 0x0c, 0xbc, 0xe0, 0x00, 0x0f, 0x40, 0x0e, 0xf0, 0x9f, 0xe9, 0x00, 0x35,
+ 0x00, 0xcd, 0x0f, 0xf0,
+ 0xe0, 0xbc, 0xfd, 0x35, 0x30, 0x9c, 0xdd, 0xee, 0x10, 0x64, 0x0f, 0xed,
+ 0xff, 0x0e, 0xf0, 0x00,
+ 0x01, 0xe8, 0xdd, 0xd0, 0x00, 0xf1, 0x00, 0x30, 0x3d, 0x0e, 0xcf, 0xe0,
+ 0xf1, 0xa3, 0xe0, 0xcd,
+ 0xc8, 0xfe, 0x01, 0x01, 0x0c, 0x0c, 0x00, 0x0d, 0x11, 0x42, 0xcc, 0xbf,
+ 0x02, 0x03, 0x0f, 0x02,
+ 0xd7, 0x13, 0x2b, 0x0d, 0x01, 0xb2, 0xde, 0xfe, 0x12, 0x45, 0x61, 0x10,
+ 0xdb, 0xd0, 0x22, 0x57,
+ 0xf0, 0xdd, 0x00, 0x33, 0x00, 0xed, 0xff, 0x10, 0x43, 0x31, 0x31, 0x0f,
+ 0xbf, 0x00, 0x00, 0x60,
+ 0x10, 0x25, 0x11, 0xeb, 0xd0, 0x20, 0x75, 0x00, 0xd0, 0xc0, 0xfe, 0x10,
+ 0x45, 0x24, 0x00, 0xac,
+ 0x01, 0x23, 0x0e, 0x00, 0x45, 0x21, 0x00, 0x0e, 0xf2, 0x02, 0x00, 0x30,
+ 0x2f, 0x11, 0x57, 0x04,
+ 0xdd, 0xee, 0x31, 0x15, 0x00, 0xef, 0x30, 0x72, 0x31, 0x30, 0x2f, 0x00,
+ 0x43, 0x76, 0x10, 0xf0,
+ 0x10, 0x20, 0x12, 0x01, 0x10, 0x20, 0x73, 0x0f, 0xea, 0xf1, 0x47, 0x33,
+ 0xf0, 0xdd, 0x0f, 0x70,
+ 0x13, 0x00, 0x00, 0x0e, 0x21, 0x57, 0x12, 0x0f, 0xfe, 0x10, 0x22, 0x01,
+ 0xe1, 0xcf, 0xed, 0x24,
+ 0x50, 0xea, 0x0e, 0x21, 0x43, 0x00, 0xc0, 0x13, 0x66, 0x10, 0x10, 0x0f,
+ 0x0f, 0x01, 0x13, 0x23,
+ 0x30, 0x10, 0x10, 0x40, 0x42, 0x27, 0x01, 0x00, 0x0f, 0x1e, 0x00, 0xe5,
+ 0x03, 0x22, 0x52, 0x32,
+ 0x0c, 0xcb, 0xf0, 0x65, 0x32, 0x10, 0x0d, 0x10, 0x21, 0x12, 0x14, 0x10,
+ 0x61, 0x31, 0xf0, 0xfc,
+ 0x23, 0x74, 0x20, 0x00, 0x00, 0x05, 0x02, 0xcf, 0x0d, 0x0e, 0xea, 0xe0,
+ 0x42, 0x35, 0xf0, 0x8b,
+ 0x0f, 0x21, 0x21, 0xe0, 0xf0, 0x00, 0xc1, 0xf1, 0xf2, 0x11, 0x0f, 0xd8,
+ 0xdf, 0x70, 0x32, 0x01,
+ 0xad, 0x0f, 0xf0, 0x01, 0x04, 0x02, 0x10, 0xff, 0xbe, 0x05, 0x22, 0xe0,
+ 0xee, 0x01, 0x10, 0x0b,
+ 0xe0, 0xe0, 0x01, 0x41, 0x1f, 0xee, 0xad, 0xcc, 0xf0, 0x27, 0x42, 0x0c,
+ 0x0f, 0x20, 0x0f, 0xdf,
+ 0xfe, 0xdf, 0x02, 0x77, 0x43, 0xdb, 0xff, 0x20, 0x10, 0x00, 0x76, 0x21,
+ 0xf0, 0xef, 0x1f, 0x30,
+ 0x01, 0x0f, 0x00, 0x42, 0xf2, 0xdd, 0xeb, 0x00, 0x41, 0x02, 0xd1, 0x0d,
+ 0xea, 0xdf, 0x00, 0x75,
+ 0x70, 0xf0, 0xdc, 0x01, 0x00, 0xf1, 0x00, 0xff, 0x9d, 0x13, 0x15, 0x0e,
+ 0xdd, 0xff, 0xf0, 0x06,
+ 0x00, 0xe0, 0xfe, 0xd0, 0xc0, 0xf0, 0x0f, 0x33, 0xc2, 0xad, 0xfb, 0x11,
+ 0xff, 0xeb, 0x00, 0x44,
+ 0xe0, 0xdd, 0xbd, 0x0f, 0xdd, 0xfd, 0x0e, 0x40, 0x00, 0xec, 0xfa, 0x10,
+ 0x22, 0xd0, 0xd0, 0xfe,
+ 0x1f, 0x1f, 0xbd, 0xf0, 0x17, 0xdf, 0x8b, 0xcf, 0x0d, 0x00, 0x20, 0x1f,
+ 0x0c, 0xf0, 0x0f, 0x5e,
+ 0xdb, 0xef, 0x44, 0x21, 0xab, 0xef, 0x00, 0x00, 0x01, 0x2f, 0x2e, 0xea,
+ 0xbf, 0xef, 0xef, 0xf0,
+ 0x30, 0x3f, 0x0c, 0x00, 0xd1, 0x8d, 0x0e, 0x33, 0x11, 0xf0, 0xbc, 0xe0,
+ 0xd0, 0x05, 0x23, 0xfd,
+ 0xdb, 0x0f, 0x10, 0x02, 0x90, 0x03, 0xf0, 0xda, 0xef, 0x00, 0xb0, 0xdd,
+ 0xfc, 0x43, 0x11, 0xcb,
+ 0xef, 0x0f, 0xff, 0xd1, 0xf6, 0xf1, 0xbe, 0xca, 0x0f, 0x21, 0x42, 0x00,
+ 0x10, 0xff, 0xcf, 0xf0,
+ 0x00, 0x0e, 0x3c, 0x2d, 0x2f, 0x10, 0x1e, 0xd0, 0xad, 0x0e, 0x05, 0x05,
+ 0x45, 0x00, 0x3b, 0x00,
+ 0x15, 0xff, 0x5e, 0xdd, 0x65, 0xfc, 0x5c, 0xde, 0xbd, 0xe8, 0x10, 0x50,
+ 0x00, 0x0f, 0x32, 0x10,
+ 0xfb, 0xac, 0x00, 0x32, 0x51, 0xea, 0xe0, 0x13, 0x43, 0x0d, 0xdc, 0x12,
+ 0x26, 0x00, 0xde, 0x00,
+ 0x36, 0x00, 0x20, 0x0f, 0x50, 0x30, 0x03, 0x00, 0xee, 0xdd, 0x23, 0x47,
+ 0xb3, 0x9e, 0xef, 0x11,
+ 0x35, 0xf0, 0xef, 0x00, 0x32, 0xe1, 0x01, 0x73, 0x42, 0xd1, 0xdf, 0x14,
+ 0x67, 0x22, 0xed, 0xee,
+ 0x21, 0x24, 0x00, 0xe0, 0x00, 0xb0, 0xef, 0xe0, 0x10, 0x11, 0x21, 0xfd,
+ 0xa8, 0x00, 0x34, 0x33,
+ 0xf0, 0xcc, 0xff, 0x10, 0x51, 0x12, 0x10, 0xed, 0x00, 0xff, 0xdd, 0xec,
+ 0x0c, 0xfe, 0xf5, 0xa3,
+ 0xbd, 0xdb, 0x11, 0x65, 0x00, 0xde, 0x00, 0x10, 0x10, 0x21, 0x01, 0x0f,
+ 0x0f, 0x0e, 0x0e, 0x71,
+ 0x0d, 0xb8, 0xfd, 0xf1, 0xf2, 0x00, 0x00, 0xe2, 0xfd, 0xe9, 0x20, 0x20,
+ 0xe1, 0xc1, 0x00, 0x3f,
+ 0x71, 0x16, 0xff, 0xce, 0x00, 0x00, 0xd4, 0xf1, 0x32, 0x77, 0x20, 0xdc,
+ 0xb0, 0xf0, 0x03, 0x31,
+ 0x00, 0xf0, 0xcc, 0x0f, 0x22, 0x22, 0xef, 0xda, 0x20, 0x63, 0xee, 0xdc,
+ 0x00, 0x42, 0x20, 0x0d,
+ 0x00, 0x0f, 0xef, 0x0f, 0x13, 0x42, 0x0c, 0xed, 0x00, 0x00, 0xfa, 0x3f,
+ 0x75, 0x62, 0x0e, 0xde,
+ 0xff, 0xe0, 0x0f, 0x5f, 0x32, 0xee, 0xd0, 0x27, 0x57, 0xff, 0xed, 0x01,
+ 0x52, 0x00, 0x40, 0x11,
+ 0xf0, 0xdc, 0x02, 0x43, 0x21, 0x0f, 0xf0, 0x01, 0x46, 0x13, 0x01, 0x0e,
+ 0x00, 0x56, 0x20, 0x0f,
+ 0x0f, 0x3e, 0x71, 0x27, 0x23, 0x00, 0x1f, 0x10, 0xe0, 0xf0, 0x0f, 0x75,
+ 0x33, 0x00, 0x0c, 0x10,
+ 0x31, 0x00, 0x20, 0x33, 0x22, 0x00, 0x0f, 0x10, 0x53, 0x32, 0x00, 0x2f,
+ 0x64, 0x05, 0x00, 0xd1,
+ 0x00, 0x43, 0x47, 0x33, 0x3f, 0x2f, 0x00, 0x22, 0x25, 0xe0, 0xbd, 0x10,
+ 0x42, 0x04, 0x03, 0xf0,
+ 0x0f, 0x5e, 0x33, 0xe2, 0xc2, 0x02, 0x0d, 0x25, 0x47, 0xe3, 0xef, 0x60,
+ 0x34, 0x01, 0xd0, 0xf0,
+ 0x01, 0x33, 0x46, 0x20, 0xe0, 0xf2, 0x01, 0x10, 0x15, 0x25, 0x51, 0xf0,
+ 0xbd, 0x00, 0x30, 0x12,
+ 0x30, 0xf0, 0x92, 0xd1, 0xe0, 0x11, 0x20, 0x2d, 0x44, 0xd4, 0xd1, 0xdc,
+ 0x88, 0xf0, 0x43, 0x12,
+ 0xde, 0xdc, 0x11, 0x00, 0xee, 0x0e, 0x30, 0x0f, 0x02, 0x75, 0x0d, 0xab,
+ 0x00, 0x12, 0x21, 0x0b,
+ 0xff, 0xf0, 0x03, 0xe0, 0x0d, 0x40, 0x0d, 0x0e, 0x33, 0x21, 0xda, 0xdf,
+ 0xde, 0x2e, 0x0b, 0x20,
+ 0x33, 0xb0, 0xfe, 0x50, 0x51, 0x1e, 0x08, 0xc0, 0x02, 0x14, 0xf0, 0xab,
+ 0xef, 0x00, 0x72, 0x12,
+ 0xec, 0xdf, 0x11, 0x32, 0x2f, 0xdd, 0xe2, 0x24, 0x10, 0xed, 0x8d, 0xed,
+ 0x00, 0x22, 0x10, 0x0d,
+ 0xea, 0x00, 0xd0, 0xde, 0xf1, 0xe2, 0xeb, 0xec, 0xf0, 0xc2, 0xf1, 0xdb,
+ 0xab, 0xff, 0x10, 0x41,
+ 0xcf, 0xdd, 0x12, 0x35, 0xe0, 0x8d, 0xee, 0x00, 0x32, 0x26, 0xbf, 0xec,
+ 0x00, 0x20, 0x00, 0xdf,
+ 0xde, 0x00, 0x02, 0x1e, 0xde, 0xdd, 0xce, 0x42, 0x56, 0xfe, 0xa8, 0x00,
+ 0x0f, 0x20, 0x00, 0xf1,
+ 0xf0, 0x0e, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xed, 0xd0, 0x02, 0x0d, 0xce,
+ 0xd0, 0xf0, 0x32, 0x67,
+ 0x00, 0xee, 0x98, 0xee, 0x01, 0x24, 0xef, 0xdc, 0x00, 0x00, 0xaf, 0xfe,
+ 0x00, 0x01, 0xf2, 0xe0,
+ 0x9e, 0x0f, 0xf4, 0xe3, 0xbc, 0xfd, 0x00, 0x25, 0xf3, 0xe0, 0xdc, 0xf0,
+ 0xce, 0xe0, 0x03, 0xd4,
+ 0xb0, 0xff, 0x00, 0xef, 0xae, 0x07, 0xf2, 0xee, 0x0d, 0x02, 0x25, 0xde,
+ 0xfc, 0x41, 0x44, 0xc0,
+ 0xcb, 0xf0, 0xdf, 0x0f, 0x32, 0x03, 0x90, 0x0b, 0x10, 0x2f, 0x0f, 0x2f,
+ 0x0c, 0xf0, 0x11, 0x04,
+ 0xef, 0xfb, 0x30, 0x2f, 0x0f, 0x61, 0x53, 0x00, 0xeb, 0xde, 0xde, 0x00,
+ 0x44, 0x1e, 0xfb, 0xfe,
+ 0x40, 0x20, 0x1f, 0x0d, 0x20, 0x6e, 0x50, 0x15, 0x00, 0xdc, 0x1f, 0x60,
+ 0x04, 0x0f, 0xff, 0xff,
+ 0xf2, 0x01, 0x0f, 0x44, 0x27, 0x11, 0xee, 0x0f, 0x73, 0x33, 0xe0, 0xd1,
+ 0xf2, 0x57, 0x32, 0xfd,
+ 0xbc, 0x01, 0x04, 0x52, 0x0f, 0x0d, 0x00, 0x14, 0x22, 0x13, 0x00, 0xfe,
+ 0x0d, 0x0e, 0x14, 0x47,
+ 0x03, 0x00, 0x20, 0xfe, 0x0e, 0x40, 0x13, 0x12, 0x10, 0x2c, 0x72, 0x77,
+ 0x12, 0xfe, 0xe0, 0x22,
+ 0x44, 0x20, 0x11, 0x11, 0x00, 0xff, 0x00, 0x04, 0x21, 0x31, 0x55, 0x00,
+ 0xdf, 0xef, 0x22, 0x40,
+ 0x0b, 0x02, 0x04, 0x42, 0x60, 0x1c, 0x20, 0x10, 0x21, 0x02, 0x36, 0x22,
+ 0x10, 0x11, 0x62, 0x23,
+ 0x00, 0x01, 0x47, 0x10, 0x10, 0x20, 0x22, 0x05, 0xe2, 0xf1, 0xf2, 0xc1,
+ 0xcf, 0xfe, 0x75, 0x26,
+ 0x20, 0x23, 0x0f, 0xff, 0xf0, 0x34, 0x65, 0x00, 0xd0, 0x10, 0x73, 0x43,
+ 0xef, 0xe0, 0x02, 0x00,
+ 0x0b, 0x42, 0x33, 0xf0, 0xef, 0x00, 0x12, 0x65, 0x01, 0x01, 0xf1, 0xf0,
+ 0x0f, 0x10, 0x1e, 0xeb,
+ 0xe0, 0x14, 0x72, 0x5f, 0x0e, 0x0d, 0x01, 0x07, 0x03, 0xfd, 0xec, 0x32,
+ 0x41, 0xbb, 0xfd, 0x00,
+ 0x42, 0x00, 0xbb, 0x00, 0x02, 0x21, 0x20, 0x11, 0x01, 0xce, 0xfb, 0xef,
+ 0x10, 0x02, 0xf0, 0x1d,
+ 0x0d, 0x0e, 0xd0, 0x00, 0x0f, 0xb9, 0xd0, 0x00, 0x43, 0x0e, 0xab, 0x00,
+ 0x14, 0x42, 0xfd, 0xdd,
+ 0x11, 0x24, 0x20, 0x5c, 0x00, 0xc0, 0x00, 0x04, 0x3f, 0xea, 0x10, 0x71,
+ 0xf0, 0xb0, 0x02, 0x24,
+ 0x1e, 0xfc, 0xe0, 0x14, 0x11, 0x00, 0xce, 0xfd, 0xfe, 0x0f, 0xc8, 0x0e,
+ 0x71, 0x31, 0xff, 0xed,
+ 0x00, 0x0d, 0x0c, 0xfb, 0xdf, 0x01, 0x46, 0x10, 0xaa, 0xd0, 0x00, 0x11,
+ 0xd1, 0x9f, 0x00, 0xfe,
+ 0xfe, 0x00, 0xd0, 0xee, 0xff, 0xf0, 0x00, 0xe0, 0x8c, 0xfe, 0xee, 0x12,
+ 0x3f, 0xe8, 0xde, 0x00,
+ 0x12, 0xf0, 0xbe, 0xed, 0xef, 0xf0, 0xe0, 0xf0, 0xda, 0xbc, 0x01, 0x03,
+ 0x00, 0xcd, 0xd0, 0xe1,
+ 0xf5, 0xc0, 0xac, 0xef, 0xf1, 0x00, 0x13, 0x42, 0xed, 0xcd, 0x14, 0x31,
+ 0x0d, 0xfd, 0xba, 0xed,
+ 0x0f, 0x01, 0x13, 0xee, 0xdf, 0x01, 0x0d, 0x08, 0x0b, 0xc0, 0xa1, 0x01,
+ 0x73, 0x20, 0xfb, 0xdd,
+ 0x40, 0x32, 0xf0, 0xdf, 0x01, 0x21, 0x50, 0x20, 0x0e, 0xdb, 0x00, 0x04,
+ 0x21, 0x1e, 0xea, 0xb0,
+ 0xe4, 0xe0, 0x0f, 0x0e, 0x10, 0x00, 0xdd, 0x9e, 0x13, 0x34, 0x0f, 0x1e,
+ 0x42, 0x00, 0xd1, 0x16,
+ 0x00, 0xee, 0xdd, 0x61, 0x22, 0xd0, 0xf0, 0x13, 0x0e, 0xfd, 0xbf, 0xce,
+ 0xf7, 0x37, 0x60, 0x1f,
+ 0xe0, 0xe1, 0xf4, 0x10, 0x00, 0x0e, 0xdd, 0x0e, 0x22, 0x33, 0x09, 0x3f,
+ 0x50, 0xe2, 0x00, 0x0e,
+ 0xf2, 0x36, 0x10, 0xfe, 0x9f, 0xd0, 0xb3, 0x22, 0x20, 0xe9, 0x8d, 0x0d,
+ 0x32, 0x35, 0xf0, 0x0f,
+ 0x0e, 0xdf, 0xde, 0x0e, 0x44, 0x53, 0x0f, 0x09, 0x0f, 0x00, 0xef, 0xe3,
+ 0xf2, 0xcc, 0x0f, 0x00,
+ 0xa3, 0x13, 0x60, 0xfe, 0xdf, 0x01, 0x12, 0x61, 0x11, 0xe9, 0xef, 0xff,
+ 0xf1, 0x01, 0xcb, 0x0e,
+ 0x37, 0x23, 0xad, 0x0f, 0x00, 0x0e, 0x10, 0x03, 0x45, 0xf0, 0xd0, 0xe0,
+ 0x0f, 0x00, 0xf1, 0xc0,
+ 0x02, 0xe0, 0x8c, 0xe9, 0xef, 0x01, 0x13, 0x02, 0xcb, 0xde, 0xf0, 0x34,
+ 0x21, 0xe1, 0xaf, 0x0b,
+ 0xff, 0x01, 0x15, 0x10, 0xff, 0x0f, 0x12, 0xc0, 0xad, 0x00, 0xe4, 0xf0,
+ 0x0d, 0x0e, 0x1e, 0x2d,
+ 0x21, 0x04, 0xf0, 0xc9, 0x0e, 0x71, 0x54, 0x00, 0x00, 0x0d, 0xf0, 0x0d,
+ 0x2e, 0x4f, 0x0e, 0xf2,
+ 0xe5, 0x0e, 0x0c, 0x40, 0x30, 0x32, 0xfe, 0xde, 0x23, 0x53, 0xfd, 0xe0,
+ 0x02, 0x67, 0x24, 0x54,
+ 0x24, 0x0f, 0xdd, 0x30, 0x56, 0x32, 0xf0, 0xcf, 0x10, 0x31, 0x0f, 0xd0,
+ 0x02, 0x37, 0x22, 0xef,
+ 0xde, 0x40, 0x60, 0xf0, 0x11, 0x47, 0x02, 0xef, 0xe0, 0xf0, 0xff, 0xdd,
+ 0x20, 0x63, 0x13, 0x04,
+ 0x02, 0xff, 0xec, 0xc0, 0x05, 0x77, 0x20, 0x00, 0xef, 0x00, 0x22, 0x20,
+ 0x00, 0x00, 0x42, 0xb0,
+ 0xcc, 0x13, 0x73, 0x14, 0x10, 0xfe, 0xec, 0x22, 0x56, 0x0f, 0xfe, 0x00,
+ 0x35, 0x21, 0xef, 0x00,
+ 0x00, 0x20, 0x21, 0x03, 0x00, 0x10, 0x0e, 0x1e, 0x20, 0x54, 0x53, 0x10,
+ 0x21, 0x24, 0x0c, 0xcc,
+ 0x02, 0x24, 0x0e, 0x5d, 0x53, 0x0d, 0xfb, 0xf0, 0x34, 0x75, 0x0f, 0x0c,
+ 0x01, 0x33, 0x10, 0x0f,
+ 0x0e, 0x02, 0x24, 0xe0, 0xbb, 0xff, 0x12, 0x23, 0xd0, 0xff, 0x13, 0x20,
+ 0x01, 0x05, 0x44, 0xfe,
+ 0xdb, 0x00, 0x75, 0x41, 0xef, 0x1e, 0x42, 0x00, 0xe0, 0x42, 0x23, 0xd0,
+ 0x8c, 0x00, 0x12, 0x20,
+ 0x0f, 0xf1, 0x07, 0x02, 0xfc, 0x00, 0x1f, 0x00, 0x2f, 0x74, 0x21, 0x10,
+ 0x1c, 0x2f, 0x24, 0x02,
+ 0xfe, 0x1d, 0x20, 0x03, 0x20, 0x1f, 0x0c, 0xf4, 0x43, 0x0e, 0xd9, 0x40,
+ 0x7f, 0x1f, 0xf0, 0x15,
+ 0x30, 0xfe, 0xff, 0x40, 0x72, 0x22, 0xe0, 0xfe, 0x42, 0x20, 0xfb, 0xc2,
+ 0x01, 0x0d, 0x20, 0x6f,
+ 0x0e, 0x00, 0xfc, 0xff, 0x37, 0x77, 0xfd, 0xde, 0x10, 0x34, 0x20, 0xef,
+ 0x0e, 0x13, 0x24, 0xee,
+ 0x9f, 0xff, 0xf0, 0x00, 0x12, 0x13, 0x0f, 0x0e, 0x31, 0xc0, 0xb0, 0xfe,
+ 0xf0, 0x67, 0x17, 0x00,
+ 0xc0, 0x0e, 0x0f, 0x41, 0x04, 0x00, 0xed, 0x00, 0xe1, 0xdf, 0x00, 0x53,
+ 0x00, 0x00, 0x07, 0xe0,
+ 0x9e, 0xf0, 0xf1, 0x21, 0x31, 0x0f, 0xbb, 0x0e, 0x0f, 0x27, 0x03, 0xdd,
+ 0xcc, 0x00, 0x03, 0x31,
+ 0xab, 0xde, 0xf1, 0x02, 0xe0, 0xfe, 0xdc, 0xeb, 0x00, 0xd0, 0xe0, 0x01,
+ 0xdf, 0x8e, 0xe0, 0xee,
+ 0xec, 0xdd, 0xfe, 0xe0, 0xf5, 0xa0, 0xff, 0xef, 0xf0, 0xdf, 0x9b, 0xef,
+ 0x00, 0xf0, 0xec, 0xcb,
+ 0xef, 0xf0, 0x1f, 0x0f, 0xff, 0xd1, 0xde, 0xc9, 0xff, 0x0f, 0x02, 0xcf,
+ 0x88, 0xfe, 0x01, 0x01,
+ 0x00, 0x0f, 0x20, 0xf0, 0xdc, 0xd0, 0xde, 0xff, 0x40, 0x73, 0xfd, 0xba,
+ 0x0e, 0xe0, 0x00, 0x10,
+ 0x0a, 0x0f, 0x00, 0xd0, 0xee, 0x10, 0x51, 0x22, 0xfe, 0xb8, 0xef, 0xf0,
+ 0xff, 0xfd, 0xee, 0x01,
+ 0x42, 0x1d, 0xab, 0xe0, 0xe1, 0x00, 0xff, 0x10, 0x00, 0xa9, 0x00, 0xf0,
+ 0x0f, 0xfe, 0x03, 0xf3,
+ 0xee, 0xcc, 0xef, 0x00, 0x25, 0xf1, 0xae, 0x1e, 0x63, 0x13, 0xff, 0xb8,
+ 0x00, 0x11, 0x23, 0x00,
+ 0xce, 0x01, 0x10, 0xfc, 0xf0, 0x25, 0x31, 0x01, 0xce, 0xff, 0x0f, 0xe0,
+ 0x02, 0x32, 0x70, 0x2d,
+ 0x10, 0x00, 0xf0, 0x02, 0x57, 0x05, 0x0c, 0xff, 0x2e, 0x40, 0x00, 0x1e,
+ 0x01, 0x04, 0x03, 0x11,
+ 0x0f, 0x2d, 0x72, 0x77, 0x02, 0x0e, 0xef, 0x20, 0x02, 0x11, 0x34, 0x40,
+ 0x0e, 0xf1, 0x06, 0x01,
+ 0x1f, 0x30, 0x37, 0x22, 0xff, 0x10, 0x40, 0x02, 0x01, 0xf2, 0xe0, 0x33,
+ 0x0e, 0xfe, 0x74, 0x77,
+ 0x20, 0xd0, 0x02, 0x33, 0x40, 0x00, 0xd1, 0x01, 0x37, 0x32, 0xf0, 0x42,
+ 0x72, 0x20, 0xf0, 0xc1,
+ 0x05, 0x02, 0x34, 0x22, 0x02, 0xef, 0xef, 0x44, 0x43, 0x02, 0x02, 0x01,
+ 0xff, 0xff, 0x35, 0x72,
+ 0x2d, 0xeb, 0x01, 0x33, 0x0e, 0xed, 0xf3, 0x55, 0x32, 0x10, 0x2d, 0x23,
+ 0xee, 0x0c, 0x70, 0x4d,
+ 0x00, 0x23, 0x00, 0x00, 0x34, 0x11, 0x50, 0x3d, 0x42, 0x37, 0x0f, 0x0a,
+ 0x00, 0x22, 0x54, 0x52,
+ 0x22, 0x0f, 0xf9, 0x0f, 0x42, 0x33, 0xe0, 0x1f, 0x73, 0x1f, 0x0f, 0x03,
+ 0x14, 0x31, 0x30, 0x44,
+ 0x01, 0x21, 0x21, 0x22, 0x00, 0x0f, 0x31, 0x35, 0x10, 0x2f, 0x10, 0xe1,
+ 0x02, 0x77, 0x72, 0x01,
+ 0x05, 0x13, 0x0e, 0xdc, 0x0f, 0x01, 0x42, 0x00, 0xd1, 0xe0, 0x1f, 0x4e,
+ 0xfc, 0xe0, 0x42, 0x47,
+ 0x02, 0xfe, 0xbb, 0x00, 0xf0, 0x12, 0x1e, 0xd8, 0xe0, 0x40, 0x00, 0xd1,
+ 0x50, 0x00, 0xbc, 0xe0,
+ 0x03, 0xe0, 0xac, 0x01, 0x12, 0x0e, 0xfc, 0x00, 0x11, 0xf0, 0x00, 0x32,
+ 0x42, 0xcc, 0xce, 0x00,
+ 0x00, 0x20, 0x57, 0x0f, 0xfc, 0x0f, 0x30, 0x76, 0x00, 0xde, 0x00, 0x2f,
+ 0x11, 0xf3, 0xe0, 0xff,
+ 0x00, 0xd1, 0x41, 0x5f, 0x1c, 0x05, 0x13, 0x01, 0x02, 0xd1, 0xe2, 0xd0,
+ 0x01, 0x17, 0xd0, 0x8e,
+ 0xac, 0x00, 0x22, 0x34, 0x11, 0xcc, 0xbe, 0x02, 0x04, 0x01, 0xf1, 0x14,
+ 0xf0, 0x9b, 0xfd, 0xef,
+ 0x0d, 0x0f, 0x00, 0x00, 0xab, 0xff, 0xf2, 0x04, 0x0d, 0xcc, 0x00, 0xf2,
+ 0xef, 0xfd, 0xf0, 0x00,
+ 0x00, 0x02, 0xb8, 0xec, 0xf1, 0xd0, 0xde, 0x00, 0x32, 0xbb, 0xef, 0x0e,
+ 0x0f, 0x10, 0xed, 0xb8,
+ 0xf0, 0x23, 0xf0, 0x8e, 0xfc, 0x00, 0xf0, 0xd0, 0x00, 0x00, 0xfd, 0xbb,
+ 0x10, 0x00, 0xfe, 0xdd,
+ 0x12, 0x53, 0x0e, 0x0d, 0x00, 0xeb, 0x0f, 0xff, 0xbb, 0xff, 0x10, 0x3f,
+ 0xee, 0xab, 0xdc, 0xfd,
+ 0x52, 0x33, 0xdb, 0xdd, 0x00, 0x10, 0x1f, 0x0c, 0xfe, 0xcf, 0xf0, 0xe0,
+ 0x00, 0xd0, 0x10, 0xfb,
+ 0x8c, 0x00, 0x01, 0xe0, 0xea, 0x41, 0x24, 0xcf, 0xec, 0x40, 0x41, 0xfd,
+ 0xde, 0x01, 0x10, 0x0f,
+ 0x10, 0x11, 0xbe, 0x00, 0x10, 0xdb, 0x8d, 0xf1, 0x07, 0xe0, 0xdc, 0x32,
+ 0x30, 0xfe, 0xee, 0xe0,
+ 0xf0, 0xdd, 0x00, 0xfc, 0xfe, 0x3e, 0x52, 0xd6, 0x8f, 0xdd, 0x1f, 0x50,
+ 0x22, 0xff, 0xc8, 0x0e,
+ 0x01, 0x24, 0xde, 0xbe, 0x00, 0x12, 0x24, 0xfe, 0xfd, 0xff, 0x00, 0x04,
+ 0x02, 0x02, 0x71, 0xf9,
+ 0xac, 0x00, 0x00, 0x01, 0x12, 0x03, 0xde, 0xf0, 0x03, 0x33, 0xef, 0xbd,
+ 0xf5, 0xe1, 0xde, 0xfe,
+ 0x22, 0x27, 0xe1, 0x8f, 0xbe, 0x1f, 0x11, 0x14, 0xf0, 0xff, 0x05, 0x02,
+ 0xe0, 0x21, 0x60, 0x24,
+ 0x31, 0xf1, 0xd0, 0xf1, 0xd2, 0x00, 0x44, 0x20, 0xed, 0xb9, 0x02, 0x03,
+ 0x0f, 0xfc, 0x00, 0x00,
+ 0x13, 0x44, 0x64, 0x00, 0xde, 0x0e, 0x57, 0x12, 0xdc, 0x9c, 0x00, 0x10,
+ 0x35, 0x00, 0xbd, 0x0e,
+ 0x22, 0x24, 0x00, 0x00, 0xf0, 0xe0, 0x00, 0x13, 0x42, 0x0f, 0xed, 0xf2,
+ 0x01, 0xde, 0x0f, 0x15,
+ 0x77, 0x43, 0xce, 0xeb, 0x20, 0x11, 0x12, 0x1f, 0x0e, 0xd0, 0x21, 0x0f,
+ 0xe0, 0x36, 0x10, 0x8e,
+ 0xdd, 0x00, 0x13, 0x10, 0xdd, 0x20, 0x72, 0x0d, 0xdd, 0x00, 0x37, 0x30,
+ 0x0d, 0x24, 0x63, 0x0c,
+ 0xcd, 0x11, 0x33, 0xfc, 0xcc, 0x30, 0x43, 0xf1, 0xe1, 0xfc, 0xfd, 0x37,
+ 0x44, 0xcf, 0xde, 0x00,
+ 0x00, 0x20, 0xdd, 0x01, 0x42, 0x30, 0xf1, 0xaf, 0x0b, 0x20, 0x10, 0xff,
+ 0x00, 0x74, 0x04, 0x0d,
+ 0xfc, 0x0e, 0xeb, 0xff, 0x22, 0x02, 0xee, 0x0f, 0x41, 0x01, 0x21, 0x25,
+ 0xf3, 0xc4, 0xa0, 0x0d,
+ 0xed, 0xf0, 0x77, 0x15, 0xff, 0xff, 0xf0, 0xe2, 0x32, 0x61, 0x00, 0x00,
+ 0x01, 0x25, 0x02, 0x30,
+ 0x3f, 0x00, 0xd2, 0xc4, 0x01, 0x03, 0xd2, 0xa0, 0xfb, 0x2f, 0x72, 0x01,
+ 0x00, 0x03, 0x45, 0x22,
+ 0x10, 0x10, 0x51, 0x37, 0x03, 0x0d, 0x00, 0x44, 0x10, 0x00, 0x1e, 0x1f,
+ 0x50, 0x20, 0x03, 0x12,
+ 0x0c, 0x1d, 0x55, 0x27, 0x10, 0x0d, 0x31, 0x53, 0x01, 0x0d, 0x5f, 0x11,
+ 0x02, 0x20, 0x3f, 0x30,
+ 0x36, 0x23, 0x21, 0x1f, 0xe0, 0xd0, 0x1e, 0x74, 0x76, 0x00, 0xe0, 0x01,
+ 0x03, 0x12, 0x01, 0x13,
+ 0x43, 0x11, 0x25, 0xe3, 0xf1, 0x22, 0x42, 0x27, 0x45, 0x22, 0x00, 0xdf,
+ 0x0f, 0x44, 0x34, 0x00,
+ 0x3e, 0x73, 0x14, 0xc0, 0xfe, 0x00, 0x05, 0x22, 0x01, 0x01, 0x22, 0x63,
+ 0x20, 0x00, 0x00, 0xf0,
+ 0x01, 0x75, 0x00, 0xfd, 0x0e, 0x10, 0x01, 0x0e, 0xd0, 0x26, 0x05, 0x05,
+ 0x28, 0x00, 0x29, 0x00,
+ 0x7c, 0x0d, 0x46, 0x0f, 0x5e, 0x0f, 0x13, 0x14, 0x1f, 0x42, 0x77, 0x26,
+ 0xee, 0xbc, 0x00, 0x0e,
+ 0xff, 0xed, 0x30, 0x4f, 0xbc, 0x02, 0x23, 0x0c, 0xfc, 0x01, 0x06, 0x10,
+ 0x1d, 0xcb, 0xff, 0x1f,
+ 0x20, 0x01, 0x04, 0x10, 0xcb, 0x8f, 0xde, 0xf0, 0xe0, 0xa0, 0x03, 0x23,
+ 0x00, 0xa8, 0xef, 0x00,
+ 0x43, 0x01, 0x02, 0xdd, 0xdc, 0x10, 0x34, 0x12, 0xef, 0xfd, 0x01, 0xd1,
+ 0x81, 0x00, 0x0f, 0x0e,
+ 0x05, 0xd0, 0xfb, 0xf0, 0xe1, 0xa1, 0xcd, 0xee, 0x0e, 0x2f, 0x10, 0xdc,
+ 0xb9, 0xfe, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xf0, 0xdb, 0x0e, 0x0d, 0x0d, 0x8c, 0xed, 0xff, 0xef,
+ 0x0f, 0xed, 0xab, 0xfe,
+ 0x0e, 0xde, 0xde, 0x01, 0xf1, 0xdd, 0xfd, 0xf1, 0x0d, 0x08, 0x08, 0xb0,
+ 0xe0, 0x10, 0x4f, 0x0f,
+ 0xb0, 0xdf, 0xca, 0x0f, 0x3f, 0x10, 0xe1, 0xd0, 0x0d, 0xdc, 0xaf, 0xf1,
+ 0x06, 0x00, 0xfe, 0x2f,
+ 0xef, 0x9e, 0xff, 0x00, 0x24, 0xf0, 0xac, 0xf0, 0x10, 0x50, 0x13, 0xf0,
+ 0xbc, 0x00, 0x02, 0x00,
+ 0x0e, 0x0b, 0x00, 0xe1, 0x00, 0x13, 0xf2, 0xab, 0xff, 0x12, 0x21, 0x10,
+ 0xde, 0xd0, 0x03, 0xfb,
+ 0x98, 0xef, 0xff, 0x10, 0x12, 0xa1, 0xf1, 0xfe, 0xfd, 0xf1, 0xd2, 0xf0,
+ 0x21, 0xee, 0x9d, 0x02,
+ 0x01, 0xde, 0xdb, 0x04, 0x13, 0xdc, 0xdf, 0x00, 0xba, 0xf0, 0x37, 0x31,
+ 0xdf, 0xbe, 0x00, 0x01,
+ 0x03, 0x50, 0x0f, 0xf0, 0xbd, 0xda, 0xff, 0x00, 0x20, 0x32, 0x01, 0x80,
+ 0xeb, 0xe0, 0xf0, 0x12,
+ 0x34, 0xe0, 0xbb, 0x0f, 0x11, 0x42, 0x0f, 0xed, 0xad, 0x02, 0x34, 0x2e,
+ 0x0d, 0xe0, 0x03, 0x02,
+ 0x31, 0x10, 0xff, 0x03, 0xf6, 0x04, 0x42, 0x41, 0x0c, 0x9b, 0x00, 0xf4,
+ 0x00, 0x20, 0x21, 0x21,
+ 0x21, 0x0e, 0x0b, 0x00, 0x75, 0x10, 0x0f, 0x24, 0x30, 0x10, 0x5e, 0x21,
+ 0x01, 0xfc, 0x0c, 0x32,
+ 0x75, 0x10, 0xe0, 0xe0, 0xef, 0x24, 0x52, 0x0e, 0x0d, 0x11, 0x30, 0x11,
+ 0x17, 0x12, 0x2f, 0x72,
+ 0x33, 0xfc, 0xfc, 0x00, 0x54, 0x33, 0x00, 0xd0, 0x02, 0x53, 0x20, 0x02,
+ 0x07, 0x11, 0x0f, 0xfc,
+ 0x00, 0x03, 0x21, 0x72, 0x22, 0x12, 0x33, 0x00, 0xfe, 0x10, 0x62, 0x37,
+ 0x17, 0x20, 0x60, 0x10,
+ 0x11, 0xff, 0xf0, 0x0e, 0x10, 0x53, 0x06, 0xf0, 0xfe, 0x43, 0x53, 0x00,
+ 0xf0, 0x36, 0x00, 0x00,
+ 0xf1, 0x22, 0x52, 0x0f, 0xfe, 0x23, 0x76, 0x01, 0x0f, 0x00, 0x23, 0x37,
+ 0x10, 0x11, 0x10, 0x02,
+ 0x23, 0x10, 0x1d, 0x77, 0x03, 0xf0, 0xf0, 0x00, 0x22, 0x00, 0x41, 0x25,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x53, 0x24, 0x42, 0x30, 0x00, 0x10, 0x30, 0x33, 0xf1, 0x92, 0x0f, 0x4d,
+ 0x06, 0xf1, 0xb0, 0x12,
+ 0x13, 0x13, 0x03, 0xdb, 0xef, 0xf6, 0x04, 0x10, 0x3c, 0x00, 0xc0, 0xb1,
+ 0x11, 0x44, 0xf0, 0xcf,
+ 0xf0, 0xf0, 0xe0, 0xd0, 0xcd, 0xe0, 0x13, 0xcd, 0xbc, 0x23, 0x0c, 0xec,
+ 0x15, 0x21, 0x8d, 0x0e,
+ 0x03, 0x04, 0x22, 0xe2, 0xce, 0x0b, 0x1e, 0x10, 0x30, 0x33, 0x08, 0xef,
+ 0xf0, 0x41, 0x51, 0x20,
+ 0xfd, 0xe1, 0x23, 0x1c, 0xd9, 0xdf, 0x10, 0x02, 0xa0, 0x0f, 0x40, 0xfd,
+ 0xbc, 0x00, 0x10, 0x54,
+ 0x00, 0xf8, 0xde, 0x0f, 0x20, 0x2f, 0x2f, 0x3f, 0x20, 0xa0, 0xdc, 0x00,
+ 0x21, 0x20, 0xef, 0xcb,
+ 0xf0, 0xde, 0xec, 0xd0, 0x02, 0xde, 0x88, 0xae, 0x00, 0x00, 0x22, 0xee,
+ 0xee, 0xf0, 0x0f, 0xed,
+ 0x0f, 0xbe, 0xed, 0xdd, 0x0e, 0x32, 0x00, 0xac, 0xfc, 0xec, 0x00, 0xde,
+ 0xca, 0x11, 0x45, 0xee,
+ 0xbc, 0xf0, 0x00, 0x02, 0x1d, 0x00, 0x00, 0xad, 0xfd, 0x03, 0x24, 0x0a,
+ 0xdf, 0x00, 0xff, 0xec,
+ 0xf0, 0x02, 0x62, 0x0e, 0x09, 0xef, 0x10, 0x01, 0xf0, 0xee, 0x2e, 0x51,
+ 0x04, 0xae, 0xc9, 0xff,
+ 0x20, 0x10, 0x00, 0x00, 0x1e, 0x1f, 0x00, 0x02, 0x52, 0x0e, 0x0c, 0x00,
+ 0x00, 0xd8, 0xbf, 0x01,
+ 0xf2, 0xbd, 0x00, 0x40, 0xff, 0xfe, 0x15, 0x01, 0xb0, 0x00, 0x12, 0x02,
+ 0x00, 0x01, 0x10, 0xdf,
+ 0xac, 0x02, 0x37, 0x03, 0xbe, 0x00, 0xf2, 0xf0, 0xdf, 0xe3, 0xee, 0xcd,
+ 0xe4, 0x07, 0xf1, 0xde,
+ 0xf0, 0x15, 0xe1, 0x8c, 0xbd, 0x10, 0x25, 0x21, 0x0f, 0xfd, 0x01, 0x44,
+ 0x01, 0xee, 0xff, 0x00,
+ 0x2e, 0x2f, 0x10, 0x01, 0xcd, 0x9b, 0x00, 0x00, 0x2b, 0xee, 0xef, 0xff,
+ 0x0e, 0x64, 0x26, 0x0f,
+ 0xdd, 0x0f, 0x2f, 0xef, 0xde, 0x0c, 0x3d, 0x21, 0xe2, 0x9d, 0xfb, 0x0f,
+ 0x6f, 0x11, 0xfe, 0xdc,
+ 0xff, 0x0f, 0x0f, 0x11, 0x01, 0xfd, 0xfe, 0xd1, 0xf7, 0x37, 0x9e, 0xdf,
+ 0x01, 0x61, 0x00, 0xef,
+ 0x02, 0x03, 0x00, 0x01, 0x00, 0x1d, 0xcc, 0xc0, 0x02, 0x15, 0xf1, 0x03,
+ 0x62, 0x0a, 0xee, 0xf0,
+ 0xcf, 0xf0, 0x77, 0x10, 0xde, 0xee, 0x02, 0x13, 0xfc, 0x0f, 0x40, 0xeb,
+ 0xd0, 0x02, 0x34, 0xed,
+ 0xbc, 0x0f, 0x31, 0x74, 0x10, 0x0f, 0x00, 0xfd, 0x02, 0x43, 0xf0, 0xd0,
+ 0x00, 0xc8, 0xef, 0x11,
+ 0xe0, 0xbe, 0x00, 0x23, 0x13, 0xdd, 0x0d, 0x5f, 0x33, 0x15, 0xee, 0xbb,
+ 0x00, 0x01, 0x26, 0x20,
+ 0x0d, 0xdf, 0x20, 0x74, 0xfe, 0xab, 0x00, 0x22, 0x01, 0xec, 0xff, 0x12,
+ 0x13, 0xf2, 0x03, 0x20,
+ 0xee, 0xf3, 0x24, 0xe0, 0x8a, 0x01, 0x22, 0x02, 0xf0, 0xef, 0xe0, 0x33,
+ 0x36, 0xb0, 0x00, 0x74,
+ 0x00, 0xe0, 0xe2, 0xd4, 0x40, 0x3e, 0xd0, 0xe5, 0x62, 0x33, 0x0f, 0xdf,
+ 0x0b, 0x00, 0x22, 0x42,
+ 0x22, 0x21, 0xf0, 0xb0, 0xe0, 0xec, 0x0c, 0x54, 0x27, 0xc0, 0xfd, 0x02,
+ 0x45, 0x20, 0x00, 0xfe,
+ 0x11, 0x01, 0xc0, 0x20, 0x44, 0x10, 0x10, 0x30, 0x3f, 0xf1, 0xb5, 0x03,
+ 0x53, 0x20, 0x20, 0x04,
+ 0x05, 0x02, 0x10, 0x4d, 0x50, 0x05, 0xe0, 0x0f, 0x31, 0x45, 0x20, 0x00,
+ 0x0e, 0x00, 0x01, 0x45,
+ 0x52, 0x2f, 0x2c, 0x00, 0x01, 0x44, 0x42, 0x42, 0x01, 0x00, 0x1f, 0x0e,
+ 0x42, 0x32, 0x12, 0x06,
+ 0x00, 0x1c, 0x70, 0x42, 0x21, 0x10, 0x21, 0x00, 0xea, 0xd0, 0x25, 0x72,
+ 0x2d, 0x3e, 0x21, 0x12,
+ 0xee, 0xfc, 0xef, 0x2e, 0x21, 0x57, 0x10, 0x0e, 0x0f, 0xf0, 0x11, 0x74,
+ 0x32, 0x02, 0x00, 0x2e,
+ 0x00, 0x0f, 0x00, 0x47, 0x34, 0x10, 0x3f, 0x30, 0xe0, 0xde, 0x2f, 0x70,
+ 0x74, 0x01, 0x00, 0x13,
+ 0x16, 0x00, 0x0f, 0x00, 0x45, 0x02, 0x0e, 0xdc, 0x10, 0x11, 0x10, 0x30,
+ 0xf3, 0xa0, 0x00, 0xdd,
+ 0x00, 0x76, 0x36, 0x02, 0xd0, 0xdc, 0x11, 0x13, 0xf0, 0x00, 0xf1, 0x11,
+ 0x50, 0x00, 0x01, 0xbd,
+ 0xdd, 0x35, 0x77, 0x00, 0xcf, 0x0e, 0x00, 0x01, 0x1f, 0x0c, 0x0f, 0x20,
+ 0x24, 0x41, 0xfe, 0xdc,
+ 0xef, 0xdc, 0xff, 0x61, 0x22, 0xcc, 0xcd, 0xf0, 0x13, 0x45, 0xef, 0xde,
+ 0xfe, 0x0e, 0x6f, 0x13,
+ 0x27, 0x03, 0xdc, 0x0e, 0x41, 0x11, 0x02, 0xf0, 0x0e, 0x22, 0x03, 0xbd,
+ 0xfc, 0x42, 0x13, 0xe0,
+ 0xde, 0xf6, 0x01, 0x60, 0x20, 0x04, 0x8e, 0xf0, 0x27, 0x37, 0x0f, 0xef,
+ 0x00, 0x10, 0xe2, 0x0f,
+ 0x30, 0xe2, 0x8e, 0x0e, 0xef, 0x10, 0x22, 0x00, 0xff, 0xd2, 0x15, 0x00,
+ 0xc0, 0xad, 0x04, 0x10,
+ 0xdc, 0xcc, 0xdc, 0xed, 0x0f, 0x15, 0xf2, 0xaf, 0xfb, 0xf0, 0x02, 0xe0,
+ 0xfc, 0xfd, 0x01, 0xc2,
+ 0xd0, 0xcb, 0xce, 0x0c, 0x3e, 0x30, 0x00, 0x9d, 0xfb, 0x0f, 0x01, 0x21,
+ 0xcd, 0xcb, 0xff, 0xff,
+ 0xf0, 0xe0, 0x1d, 0x30, 0xf0, 0x98, 0xef, 0x0d, 0x0f, 0x0d, 0x0f, 0x20,
+ 0xe2, 0xac, 0xeb, 0x00,
+ 0x53, 0x00, 0xcc, 0x0e, 0x00, 0x01, 0x00, 0xcb, 0x0f, 0xfe, 0x0f, 0xff,
+ 0x02, 0x10, 0xdb, 0xbe,
+ 0x00, 0xd0, 0xf0, 0x2f, 0x1e, 0xff, 0xe0, 0xb8, 0xbe, 0xef, 0x02, 0xf0,
+ 0xba, 0xe0, 0x00, 0xf0,
+ 0xd0, 0xce, 0xfe, 0xce, 0xe0, 0xd3, 0xd0, 0xeb, 0xd0, 0x21, 0x32, 0xcd,
+ 0xce, 0xef, 0xef, 0x52,
+ 0x23, 0xcd, 0xd1, 0x17, 0x10, 0xec, 0xcc, 0x01, 0x32, 0xf2, 0xa0, 0xdd,
+ 0xd9, 0x11, 0x52, 0x0f,
+ 0x0d, 0xee, 0x0e, 0x1e, 0x0e, 0x2f, 0x0e, 0x00, 0x43, 0x54, 0x10, 0x21,
+ 0x65, 0x0f, 0x1d, 0x0d,
+ 0x1d, 0x0d, 0x3b, 0x10, 0x66, 0x01, 0x00, 0xfd, 0x17, 0x54, 0x20, 0x0e,
+ 0xff, 0x12, 0x45, 0x41,
+ 0x42, 0x22, 0xff, 0xfc, 0x00, 0x34, 0x32, 0xf0, 0x21, 0x73, 0x00, 0xe0,
+ 0x04, 0x24, 0x33, 0x20,
+ 0x00, 0x10, 0x36, 0x63, 0x2f, 0x30, 0x45, 0x12, 0x01, 0x02, 0x24, 0x44,
+ 0x01, 0x10, 0x2e, 0x31,
+ 0xd4, 0x93, 0x03, 0x63, 0x11, 0x20, 0x35, 0x00, 0x0b, 0x00, 0x22, 0x54,
+ 0x00, 0xf0, 0xe1, 0x01,
+ 0x13, 0x14, 0x43, 0x21, 0x0f, 0xd1, 0x35, 0x51, 0x10, 0x4f, 0x0d, 0x34,
+ 0x47, 0x20, 0xce, 0x00,
+ 0x21, 0x13, 0x00, 0x40, 0x75, 0x20, 0xfe, 0x00, 0x0d, 0x0e, 0xdf, 0x02,
+ 0x67, 0x10, 0x0e, 0xe0,
+ 0x42, 0x24, 0x00, 0x0f, 0x51, 0x24, 0x0e, 0x0e, 0x22, 0x35, 0x02, 0x01,
+ 0xe0, 0x01, 0x47, 0x00,
+ 0xae, 0x11, 0x77, 0x00, 0xe0, 0x10, 0x11, 0xd0, 0xe1, 0x20, 0x44, 0x10,
+ 0xdf, 0xcf, 0x10, 0x60,
+ 0x26, 0x01, 0x10, 0x0e, 0xee, 0x10, 0x04, 0xff, 0xf0, 0x41, 0x57, 0xf0,
+ 0xfe, 0x1f, 0x40, 0x11,
+ 0x02, 0x0f, 0x0e, 0x10, 0x1f, 0xbb, 0xcf, 0x2f, 0x40, 0x22, 0x0e, 0x1b,
+ 0x10, 0xe1, 0xe0, 0x10,
+ 0x1c, 0x1b, 0x00, 0xe0, 0xce, 0xce, 0xbe, 0xcb, 0xf0, 0x14, 0x0f, 0xab,
+ 0xf0, 0xf2, 0x23, 0x40,
+ 0x3f, 0x01, 0xd0, 0xdc, 0x20, 0x60, 0x20, 0x2e, 0x04, 0x01, 0xed, 0x0f,
+ 0xd1, 0xd2, 0xdc, 0x01,
+ 0x77, 0x01, 0xde, 0x13, 0x03, 0x31, 0x52, 0xee, 0xef, 0x3f, 0xff, 0xff,
+ 0x4d, 0x0c, 0xf7, 0x14,
+ 0x0f, 0x3f, 0x71, 0x02, 0x10, 0x41, 0x36, 0x12, 0xff, 0xdd, 0x10, 0x00,
+ 0xc3, 0x07, 0x62, 0x3e,
+ 0xea, 0xaf, 0xfe, 0x02, 0x21, 0x02, 0xe1, 0x00, 0x00, 0xea, 0xce, 0xff,
+ 0xbf, 0xbf, 0xdf, 0x02,
+ 0x1f, 0x40, 0xfe, 0x9b, 0xfd, 0xd0, 0xe2, 0x33, 0x2f, 0xb8, 0x9b, 0x01,
+ 0x33, 0x00, 0xfe, 0xde,
+ 0x00, 0x00, 0x00, 0x04, 0x01, 0x20, 0xda, 0xc0, 0xdf, 0xf0, 0x11, 0x13,
+ 0xbd, 0xfa, 0xf0, 0xef,
+ 0xe0, 0x13, 0xf2, 0xcf, 0xe8, 0xb0, 0x00, 0xf2, 0xed, 0xbe, 0x0f, 0x23,
+ 0x03, 0x10, 0x00, 0xae,
+ 0x0c, 0x10, 0x3c, 0x0f, 0xe0, 0xcd, 0xfe, 0x10, 0x2f, 0x0d, 0xe8, 0xac,
+ 0x10, 0x22, 0x20, 0x12,
+ 0x0b, 0xcc, 0xe0, 0xf0, 0xd0, 0xda, 0x00, 0x50, 0x0f, 0xbe, 0x0f, 0x30,
+ 0x62, 0x00, 0xda, 0x0e,
+ 0x00, 0x1f, 0x00, 0xf0, 0x0f, 0xed, 0x1f, 0x00, 0xcd, 0x01, 0x00, 0x5a,
+ 0x20, 0xc3, 0xb1, 0xfd,
+ 0x0b, 0xf0, 0xff, 0x0f, 0x32, 0x14, 0xef, 0xda, 0x20, 0x72, 0x20, 0xed,
+ 0xff, 0x6f, 0x2f, 0xf0,
+ 0xc0, 0xcd, 0x03, 0x07, 0x12, 0x0f, 0xdd, 0x00, 0x11, 0x00, 0xdb, 0x63,
+ 0x24, 0xdf, 0xf0, 0x01,
+ 0x1f, 0x01, 0x90, 0xf9, 0x0e, 0x1f, 0x44, 0x23, 0x00, 0xfb, 0xef, 0x0f,
+ 0xf0, 0xcf, 0xe0, 0xee,
+ 0xc9, 0x41, 0x53, 0xe0, 0xdc, 0x0f, 0xf0, 0xf1, 0x10, 0x11, 0xf1, 0xf2,
+ 0x22, 0x52, 0x01, 0xcf,
+ 0xf1, 0xf0, 0xcd, 0x00, 0x37, 0x56, 0x0f, 0xde, 0xf1, 0x02, 0x30, 0x71,
+ 0x27, 0xe0, 0xee, 0xc0,
+ 0x00, 0x22, 0x33, 0x00, 0xe0, 0xcc, 0xee, 0x25, 0x22, 0xbd, 0xdd, 0xf1,
+ 0x57, 0x44, 0x00, 0xe0,
+ 0xf0, 0x01, 0x22, 0x00, 0xde, 0xaf, 0xf2, 0xe7, 0xd1, 0x22, 0x10, 0xae,
+ 0xc0, 0x03, 0x15, 0x10,
+ 0xe0, 0xf0, 0x13, 0x23, 0xcf, 0xcb, 0x2f, 0x31, 0xf4, 0xbf, 0xec, 0x13,
+ 0x32, 0xfe, 0x9e, 0x11,
+ 0x01, 0x0d, 0xdf, 0x00, 0x13, 0x24, 0xfc, 0x2f, 0x00, 0xe0, 0x1f, 0x0d,
+ 0xfb, 0x70, 0x51, 0x00,
+ 0xf8, 0xbc, 0x0e, 0x40, 0x32, 0xed, 0xe8, 0x20, 0x53, 0x11, 0x0f, 0xed,
+ 0x00, 0xde, 0xfe, 0xee,
+ 0x10, 0x54, 0x02, 0xdf, 0xdd, 0x32, 0x43, 0x30, 0x0f, 0x36, 0x21, 0x0c,
+ 0xef, 0x44, 0x73, 0x0c,
+ 0x0b, 0x00, 0x02, 0xee, 0xfd, 0x74, 0x21, 0x10, 0x53, 0x02, 0xe0, 0xee,
+ 0x12, 0x10, 0xfc, 0xad,
+ 0x00, 0x02, 0xf1, 0x04, 0x45, 0x20, 0x11, 0x32, 0x9c, 0xfc, 0x31, 0x07,
+ 0x00, 0x1f, 0x30, 0x01,
+ 0x00, 0x20, 0x02, 0xd2, 0x0e, 0xe0, 0x07, 0x76, 0x60, 0xfe, 0xcf, 0x00,
+ 0x20, 0x03, 0x00, 0x01,
+ 0x22, 0x43, 0x00, 0x0f, 0x12, 0x53, 0x2c, 0x01, 0x27, 0x10, 0xfc, 0x00,
+ 0x42, 0x54, 0x1f, 0xfe,
+ 0x01, 0x64, 0x00, 0x00, 0x20, 0x1d, 0x0e, 0x22, 0x01, 0x04, 0x33, 0x32,
+ 0x64, 0x0f, 0x0e, 0x03,
+ 0x57, 0x05, 0x1e, 0x20, 0x11, 0x20, 0x00, 0x00, 0x22, 0xe0, 0xae, 0xff,
+ 0x03, 0x07, 0x04, 0x10,
+ 0x00, 0x11, 0x30, 0x74, 0x23, 0xd0, 0xf4, 0x54, 0x22, 0xdf, 0xff, 0x31,
+ 0x21, 0xe0, 0x24, 0x72,
+ 0x0e, 0xd0, 0x02, 0x07, 0x54, 0x00, 0xe0, 0xf0, 0x43, 0x54, 0x02, 0x01,
+ 0x23, 0x00, 0xd8, 0x0e,
+ 0x31, 0x00, 0x02, 0x40, 0xf2, 0x01, 0x0d, 0x0e, 0x75, 0x12, 0xf0, 0x00,
+ 0x10, 0x0e, 0x10, 0x57,
+ 0x00, 0x0f, 0xfd, 0xfd, 0xf0, 0x03, 0x32, 0x6c, 0x0b, 0x02, 0x13, 0x3e,
+ 0x0a, 0x00, 0x02, 0xad,
+ 0xed, 0x03, 0x00, 0xdd, 0xee, 0x70, 0x1e, 0x29, 0x20, 0x01, 0xe2, 0x9d,
+ 0x0e, 0x20, 0x00, 0xfd,
+ 0xed, 0xd6, 0xe2, 0x11, 0x0d, 0x88, 0xe0, 0x42, 0x13, 0x0f, 0xff, 0x21,
+ 0x40, 0x00, 0xf0, 0x00,
+ 0xf1, 0x11, 0x20, 0xed, 0x80, 0x12, 0x74, 0xf2, 0xde, 0x10, 0x31, 0xd8,
+ 0xee, 0x12, 0x02, 0x01,
+ 0x35, 0x01, 0xdc, 0xfd, 0xfe, 0xfe, 0x3f, 0x67, 0x11, 0xfe, 0xcb, 0xf0,
+ 0xef, 0x00, 0x10, 0xec,
+ 0xff, 0xf0, 0xc0, 0xc1, 0xee, 0x0c, 0xa0, 0xbc, 0xe0, 0x00, 0x0d, 0x99,
+ 0x00, 0x21, 0xf0, 0xdc,
+ 0x01, 0x32, 0x0d, 0xff, 0xe0, 0xf4, 0x20, 0xf2, 0xa0, 0xfc, 0x0e, 0xe0,
+ 0xf1, 0xf0, 0xde, 0xd0,
+ 0xeb, 0xfb, 0xdf, 0x8e, 0xee, 0x02, 0x13, 0xcb, 0xec, 0x30, 0x32, 0xe0,
+ 0xcc, 0xef, 0x10, 0x32,
+ 0xdf, 0x9a, 0x00, 0xfe, 0xe0, 0xd0, 0x33, 0x1e, 0xc8, 0xf0, 0x20, 0x10,
+ 0x00, 0x3f, 0x1f, 0x3e,
+ 0xf0, 0xcf, 0xfc, 0x0e, 0x11, 0xa4, 0xbb, 0xfe, 0xee, 0x02, 0x73, 0x1f,
+ 0xe8, 0xbf, 0x00, 0x10,
+ 0x0e, 0xce, 0xee, 0x0e, 0x0f, 0xf3, 0x07, 0xff, 0xcd, 0x00, 0x00, 0xe3,
+ 0xe0, 0xef, 0x00, 0xef,
+ 0x21, 0x27, 0x81, 0xed, 0x00, 0x03, 0x00, 0xde, 0xea, 0x21, 0x76, 0x10,
+ 0xe0, 0xff, 0xde, 0x00,
+ 0x22, 0xf0, 0x80, 0x0e, 0xff, 0x00, 0x00, 0x0e, 0x0c, 0xd0, 0xdf, 0xfe,
+ 0x49, 0x10, 0xf0, 0xe0,
+ 0x64, 0x41, 0x00, 0x30, 0x41, 0x0e, 0xcf, 0x02, 0x34, 0x32, 0x00, 0x00,
+ 0x1d, 0x24, 0xf3, 0x06,
+ 0x70, 0x4e, 0xde, 0x01, 0x62, 0x14, 0x27, 0x00, 0x0d, 0x0f, 0x3e, 0x0e,
+ 0x03, 0x35, 0x4f, 0xfd,
+ 0xe0, 0xff, 0x10, 0x63, 0x00, 0x20, 0x24, 0x01, 0xf1, 0x25, 0x02, 0x03,
+ 0x71, 0x70, 0xf9, 0xff,
+ 0x04, 0x13, 0x00, 0xf0, 0x02, 0x41, 0x21, 0xe3, 0xe4, 0x00, 0x1f, 0x11,
+ 0x02, 0xf0, 0x00, 0xf7,
+ 0xf3, 0x2f, 0x72, 0x01, 0xce, 0x01, 0x07, 0x01, 0x01, 0xe2, 0x02, 0xe7,
+ 0x11, 0x70, 0x30, 0x00,
+ 0xd4, 0x11, 0x72, 0x23, 0x01, 0x10, 0x16, 0x00, 0xd0, 0xcf, 0x05, 0x05,
+ 0x30, 0x00, 0x47, 0x00,
+ 0xa9, 0x11, 0x52, 0x2d, 0xb5, 0x0e, 0xc7, 0x27, 0xe1, 0x98, 0x1f, 0x31,
+ 0xf2, 0xcf, 0x0d, 0x3d,
+ 0x20, 0x30, 0x70, 0x0e, 0x11, 0x51, 0x20, 0x0f, 0x05, 0x23, 0x0d, 0x21,
+ 0x47, 0x07, 0x00, 0x0f,
+ 0x10, 0x00, 0xbf, 0x01, 0x22, 0x44, 0x45, 0x20, 0x00, 0x20, 0x60, 0x01,
+ 0x02, 0x03, 0x65, 0x00,
+ 0xef, 0x02, 0x35, 0x20, 0xfc, 0xf2, 0x44, 0x21, 0x0f, 0x00, 0x1f, 0x30,
+ 0x45, 0x33, 0x01, 0x00,
+ 0x10, 0x72, 0x26, 0x00, 0xe0, 0x00, 0x00, 0x50, 0x11, 0xe0, 0xf0, 0x34,
+ 0x53, 0x0d, 0xcd, 0xfd,
+ 0xfe, 0x00, 0x17, 0x27, 0x0e, 0xbe, 0xe0, 0xb0, 0x00, 0xf0, 0xd0, 0x04,
+ 0x30, 0xde, 0xaf, 0x00,
+ 0x10, 0x00, 0x11, 0xff, 0xeb, 0x05, 0xf2, 0xee, 0x20, 0x2e, 0x0d, 0x40,
+ 0x71, 0x1e, 0xe9, 0xf0,
+ 0x32, 0x40, 0x1e, 0xed, 0xdf, 0x00, 0x00, 0xe0, 0x10, 0xdf, 0xac, 0xda,
+ 0x00, 0x01, 0xb0, 0xdb,
+ 0x20, 0x20, 0xb2, 0x01, 0x3f, 0x0a, 0xcc, 0xd0, 0x01, 0x12, 0x00, 0x90,
+ 0xdd, 0xdb, 0xde, 0xce,
+ 0x00, 0x32, 0x80, 0xbf, 0x0e, 0x0c, 0x0f, 0x01, 0xf0, 0xe9, 0x00, 0x00,
+ 0xff, 0xb9, 0xef, 0xdf,
+ 0xe0, 0x0e, 0xf0, 0xdd, 0xad, 0x0f, 0x0f, 0xf0, 0xb0, 0xfa, 0xfe, 0xfe,
+ 0xcc, 0xe0, 0x10, 0x13,
+ 0xf0, 0xdc, 0xd9, 0xfe, 0xf0, 0xd0, 0xe0, 0x02, 0x71, 0x0e, 0xfa, 0xdf,
+ 0x0f, 0x0f, 0x3c, 0x0e,
+ 0xd0, 0x01, 0xe0, 0x0d, 0x5f, 0xfb, 0xbf, 0x10, 0x0e, 0xbf, 0xfe, 0x1f,
+ 0x2d, 0x10, 0x62, 0x0e,
+ 0xe8, 0x1e, 0x74, 0x10, 0x0c, 0xf0, 0x20, 0x30, 0xd2, 0xf0, 0x0e, 0x50,
+ 0x32, 0x23, 0x10, 0x0a,
+ 0xe0, 0x32, 0x73, 0x10, 0x0b, 0x00, 0x02, 0x1e, 0x0c, 0xdd, 0x0d, 0x63,
+ 0x01, 0xd0, 0x05, 0x53,
+ 0x00, 0x00, 0x02, 0x03, 0x22, 0x10, 0x04, 0x37, 0x43, 0x0f, 0xee, 0xf0,
+ 0x1f, 0x71, 0x26, 0xe0,
+ 0xd0, 0xd2, 0x04, 0x75, 0x21, 0xcf, 0xcf, 0x03, 0x17, 0x21, 0x00, 0xf0,
+ 0x20, 0x12, 0x12, 0x00,
+ 0x71, 0x1f, 0xfc, 0xd0, 0x23, 0x25, 0xce, 0xbf, 0x02, 0x33, 0x01, 0x03,
+ 0x02, 0x01, 0xe1, 0xec,
+ 0x10, 0x77, 0x03, 0xef, 0xf1, 0x00, 0xd9, 0xb0, 0x02, 0x12, 0xdd, 0xd0,
+ 0x03, 0x6e, 0xea, 0xe0,
+ 0x11, 0x20, 0xef, 0xbf, 0x00, 0x01, 0xec, 0xac, 0xf0, 0x00, 0x00, 0xfe,
+ 0xd8, 0xee, 0x11, 0x02,
+ 0xf0, 0xf0, 0x0d, 0xbe, 0xc0, 0xf4, 0x00, 0x3e, 0xfe, 0xd0, 0x00, 0x2f,
+ 0xf3, 0x9d, 0x0f, 0x07,
+ 0xf1, 0xc9, 0x0f, 0x10, 0xf1, 0xf3, 0x4e, 0x2a, 0xee, 0x9e, 0x1f, 0x20,
+ 0x24, 0x10, 0x0f, 0x0e,
+ 0x20, 0x02, 0xf0, 0x24, 0x73, 0x4e, 0xe8, 0x0f, 0x00, 0x10, 0x1e, 0x40,
+ 0x20, 0x00, 0xe0, 0x0d,
+ 0x9f, 0xde, 0x0f, 0x2f, 0x00, 0x15, 0x3f, 0xea, 0xaf, 0x00, 0x34, 0x41,
+ 0xff, 0x02, 0xf3, 0xfc,
+ 0x0e, 0x36, 0x24, 0xdf, 0x8e, 0x00, 0x13, 0x01, 0x00, 0xd1, 0x67, 0x22,
+ 0xfe, 0xef, 0x10, 0x51,
+ 0x0e, 0x00, 0xe0, 0x0e, 0x23, 0x23, 0x0d, 0x0f, 0xd0, 0xe0, 0x04, 0x07,
+ 0x01, 0x5e, 0x0f, 0x02,
+ 0x06, 0x00, 0xd0, 0x00, 0x7f, 0xff, 0x9e, 0x0e, 0x00, 0x55, 0x13, 0x00,
+ 0x0b, 0x0d, 0xe1, 0x27,
+ 0x52, 0x00, 0xfc, 0x00, 0x41, 0x24, 0xce, 0xdc, 0x00, 0x44, 0x12, 0x00,
+ 0x00, 0xfe, 0x00, 0x00,
+ 0xe1, 0xd0, 0x8c, 0x00, 0x03, 0x23, 0xee, 0xce, 0x17, 0x33, 0x00, 0xc2,
+ 0xd1, 0xf1, 0x00, 0x05,
+ 0xf5, 0x42, 0x00, 0x9e, 0x00, 0x02, 0x32, 0x02, 0x02, 0x45, 0x00, 0xd0,
+ 0x0f, 0x21, 0x03, 0x80,
+ 0xf5, 0x11, 0x2f, 0xec, 0xe0, 0x11, 0x43, 0xf0, 0xbd, 0x01, 0x30, 0x08,
+ 0xda, 0x00, 0x42, 0x42,
+ 0x10, 0x3f, 0x1e, 0x21, 0x42, 0x1f, 0x70, 0x21, 0x1d, 0x10, 0x25, 0x0f,
+ 0x1e, 0x53, 0x0e, 0x08,
+ 0x0b, 0x40, 0x22, 0x20, 0x10, 0x2f, 0x7f, 0x0d, 0x13, 0x47, 0xff, 0xfd,
+ 0x00, 0x33, 0x10, 0x1f,
+ 0x3f, 0x30, 0x40, 0x20, 0x0e, 0x0b, 0x21, 0x77, 0x00, 0x11, 0x50, 0x20,
+ 0xef, 0xf0, 0x35, 0x41,
+ 0x10, 0x01, 0x21, 0x00, 0x00, 0x22, 0x35, 0x10, 0xf0, 0xf1, 0xf4, 0x0f,
+ 0xad, 0x10, 0x75, 0x10,
+ 0x00, 0xee, 0xf0, 0x00, 0xf1, 0xf3, 0x0f, 0x4d, 0x00, 0xb0, 0x2e, 0x77,
+ 0x17, 0xf0, 0x0e, 0x02,
+ 0x00, 0xdf, 0x0e, 0xff, 0x01, 0x36, 0x00, 0xa0, 0xff, 0x01, 0x02, 0xfe,
+ 0x1d, 0x34, 0x13, 0x3f,
+ 0x19, 0x00, 0x2f, 0x0d, 0x8e, 0x10, 0x14, 0xfe, 0xcc, 0xfe, 0xce, 0x01,
+ 0x10, 0xcf, 0xef, 0x1e,
+ 0x73, 0x11, 0xdc, 0x02, 0x57, 0x14, 0xef, 0xcc, 0x0e, 0x02, 0x36, 0xf0,
+ 0xae, 0xf0, 0xf2, 0x12,
+ 0x23, 0x10, 0xf0, 0xbf, 0x01, 0x27, 0x01, 0xc0, 0xef, 0x0f, 0x01, 0x01,
+ 0x01, 0xc0, 0xbe, 0x01,
+ 0x37, 0x34, 0xde, 0xd1, 0x23, 0x51, 0x01, 0x00, 0x0e, 0x10, 0x00, 0xb0,
+ 0xe1, 0x05, 0x04, 0xe0,
+ 0x9e, 0xed, 0xef, 0x03, 0xf1, 0xdd, 0x0f, 0x0b, 0x1f, 0x32, 0x04, 0xbe,
+ 0xda, 0xef, 0xfe, 0xed,
+ 0xe0, 0x93, 0xd0, 0xde, 0xf0, 0x1e, 0x08, 0x99, 0x01, 0x02, 0x10, 0x1f,
+ 0x1f, 0x0f, 0xed, 0x00,
+ 0x2f, 0x10, 0xde, 0xcf, 0xec, 0x00, 0x30, 0x8e, 0xba, 0xf0, 0x00, 0x00,
+ 0xed, 0xfb, 0x21, 0x01,
+ 0x8c, 0x0d, 0x31, 0x21, 0xec, 0xdb, 0x00, 0x10, 0xf0, 0xbc, 0xff, 0xfe,
+ 0x00, 0x11, 0x10, 0x1f,
+ 0xed, 0xed, 0x23, 0x2e, 0xc8, 0x1f, 0x60, 0x0e, 0xed, 0xad, 0xfd, 0x21,
+ 0x01, 0xd9, 0x10, 0x0f,
+ 0x8d, 0xef, 0x00, 0x20, 0xeb, 0xbc, 0x00, 0xf2, 0x00, 0xec, 0xee, 0x0f,
+ 0xf0, 0xde, 0xbe, 0xfe,
+ 0xf1, 0xf2, 0x0f, 0xe9, 0x00, 0xfe, 0xd0, 0x02, 0x0e, 0xaa, 0xf0, 0x00,
+ 0x0e, 0xe0, 0x0f, 0x9c,
+ 0x0f, 0x20, 0x10, 0xdd, 0xb8, 0xe0, 0x10, 0x30, 0x00, 0xee, 0xce, 0x0c,
+ 0x1f, 0x30, 0xd0, 0xfe,
+ 0x63, 0x14, 0x0f, 0x00, 0x22, 0x65, 0x02, 0xf2, 0x01, 0x02, 0x01, 0x32,
+ 0xf0, 0x1f, 0x45, 0x37,
+ 0x61, 0x21, 0x22, 0x12, 0x2d, 0x2f, 0x04, 0x04, 0x12, 0x72, 0x34, 0x14,
+ 0x33, 0x00, 0x0d, 0x11,
+ 0x77, 0x01, 0x10, 0x01, 0x30, 0x52, 0x44, 0x01, 0x01, 0x20, 0x00, 0x46,
+ 0x14, 0x32, 0x22, 0x00,
+ 0xfd, 0x00, 0x57, 0x43, 0x0f, 0xff, 0x0f, 0x30, 0x66, 0x11, 0x00, 0x00,
+ 0x01, 0x30, 0x02, 0x23,
+ 0x15, 0x10, 0x0e, 0x00, 0x00, 0x73, 0x22, 0x0e, 0x01, 0x77, 0x10, 0x00,
+ 0x22, 0x12, 0x33, 0x01,
+ 0xf0, 0x14, 0x54, 0x00, 0xc0, 0xf5, 0x23, 0x53, 0xe0, 0xde, 0x03, 0x56,
+ 0x00, 0xf0, 0x34, 0x63,
+ 0xfd, 0xef, 0x01, 0x33, 0x10, 0x0e, 0x00, 0x30, 0x30, 0x00, 0x20, 0x41,
+ 0x0d, 0x00, 0x20, 0x1a,
+ 0xbc, 0x00, 0x51, 0x47, 0x03, 0xec, 0xfe, 0x15, 0x01, 0x8e, 0x0f, 0x01,
+ 0x01, 0x0f, 0x02, 0x37,
+ 0x21, 0xdf, 0x0f, 0x31, 0x32, 0x00, 0x0f, 0x71, 0x04, 0x0f, 0xa9, 0x00,
+ 0x11, 0x22, 0xef, 0xbc,
+ 0x00, 0x21, 0x03, 0x10, 0x51, 0x23, 0x20, 0x0e, 0xfa, 0x10, 0x00, 0x41,
+ 0x13, 0xff, 0xee, 0xec,
+ 0x0e, 0xc0, 0xc0, 0xf0, 0x0d, 0xfb, 0xc0, 0xe2, 0x02, 0x32, 0xcb, 0xce,
+ 0x03, 0x10, 0xcf, 0xbf,
+ 0xee, 0xf2, 0x07, 0xf5, 0x9c, 0x00, 0x01, 0x10, 0x02, 0x00, 0x0f, 0xd0,
+ 0x24, 0x32, 0xff, 0xbc,
+ 0x00, 0x44, 0x01, 0xe0, 0x0f, 0x0d, 0x2e, 0xde, 0xd0, 0x0b, 0xfe, 0x35,
+ 0x64, 0xcd, 0xdb, 0x0f,
+ 0x40, 0x46, 0x21, 0xef, 0xdb, 0x2f, 0x40, 0x50, 0x10, 0xf0, 0xef, 0xdd,
+ 0x10, 0x31, 0xee, 0xbc,
+ 0x31, 0x66, 0x00, 0xec, 0x00, 0x30, 0x0d, 0x4f, 0x21, 0xf0, 0xbb, 0x00,
+ 0xff, 0x00, 0x4f, 0x0e,
+ 0xdf, 0x10, 0x0d, 0xcc, 0x00, 0xf4, 0xcf, 0xee, 0xe1, 0xd2, 0xe0, 0xbd,
+ 0x9d, 0xed, 0x06, 0xf1,
+ 0xae, 0x01, 0x03, 0x03, 0xed, 0xea, 0x13, 0x47, 0x13, 0xde, 0xee, 0xf0,
+ 0x00, 0x12, 0x1f, 0x0c,
+ 0xb1, 0xd0, 0x0d, 0x12, 0x02, 0xdb, 0xdd, 0xd0, 0x82, 0xfb, 0xea, 0x1f,
+ 0x1f, 0x00, 0x00, 0x03,
+ 0xbd, 0xcb, 0x00, 0x20, 0x12, 0xde, 0x20, 0x72, 0x0d, 0xec, 0xee, 0x0d,
+ 0x41, 0x37, 0xf0, 0xfd,
+ 0x2e, 0x50, 0x0e, 0xef, 0x1e, 0x3e, 0xed, 0xab, 0x1f, 0x20, 0x1f, 0xfc,
+ 0x10, 0x00, 0xec, 0x0b,
+ 0x0d, 0x5f, 0x21, 0x1e, 0x29, 0x61, 0x21, 0x0e, 0x0f, 0x0f, 0xcd, 0x9f,
+ 0x02, 0x05, 0xf0, 0xf1,
+ 0xf1, 0xd1, 0x00, 0xe5, 0x32, 0x40, 0xcc, 0xe0, 0x23, 0x13, 0xfd, 0x99,
+ 0xf0, 0x01, 0x04, 0xe0,
+ 0x0d, 0x12, 0x04, 0x8f, 0xfe, 0x01, 0x00, 0x0f, 0x10, 0x0d, 0xdf, 0x00,
+ 0x0c, 0x0f, 0x27, 0x01,
+ 0xde, 0xe0, 0x02, 0x41, 0x20, 0xaf, 0xd8, 0x0e, 0x11, 0x65, 0xf0, 0xdd,
+ 0xfe, 0x00, 0x12, 0xbd,
+ 0xed, 0x45, 0x10, 0xdc, 0xf0, 0x12, 0xee, 0xfd, 0x1f, 0xdb, 0x9d, 0xee,
+ 0x0f, 0x10, 0x4e, 0x0c,
+ 0xdd, 0xfe, 0x0d, 0x00, 0x1e, 0x0b, 0xc0, 0xf2, 0x37, 0x20, 0xb0, 0x8d,
+ 0xd0, 0x03, 0x06, 0x10,
+ 0xed, 0xc0, 0x00, 0x04, 0x03, 0x21, 0x04, 0xc0, 0xae, 0x01, 0x02, 0x21,
+ 0x00, 0xc2, 0x03, 0x21,
+ 0x36, 0x42, 0x31, 0x12, 0xe0, 0x00, 0x75, 0x67, 0x02, 0xf0, 0x0e, 0x00,
+ 0x36, 0x01, 0xe0, 0xdf,
+ 0x01, 0x22, 0x30, 0x13, 0x01, 0x00, 0x23, 0x50, 0xd9, 0xc0, 0x20, 0x52,
+ 0x04, 0x20, 0x22, 0x11,
+ 0xf0, 0xbf, 0xf0, 0xf2, 0xe2, 0xe6, 0xe1, 0xcf, 0x0d, 0x10, 0x02, 0x02,
+ 0x3e, 0x0c, 0x00, 0x52,
+ 0x77, 0x44, 0x00, 0x0b, 0xcf, 0x20, 0x22, 0xed, 0xbf, 0x02, 0x14, 0x3c,
+ 0xed, 0xd0, 0x02, 0x00,
+ 0xed, 0x33, 0x12, 0xd0, 0x0f, 0x0b, 0x8f, 0xd1, 0xf1, 0xed, 0xfd, 0xdb,
+ 0x0d, 0x5e, 0x01, 0xd1,
+ 0xfd, 0x00, 0x57, 0x00, 0x0e, 0x00, 0xdf, 0xde, 0x64, 0x41, 0x10, 0x00,
+ 0x20, 0x19, 0x10, 0x0f,
+ 0xed, 0x11, 0x25, 0x41, 0x10, 0xcf, 0xbd, 0x0e, 0x0d, 0x01, 0xf7, 0xbf,
+ 0xc9, 0x0e, 0x30, 0x61,
+ 0xf2, 0xf1, 0xe0, 0xeb, 0xf0, 0x02, 0xf1, 0x00, 0x70, 0x43, 0x13, 0xeb,
+ 0xdd, 0x00, 0x02, 0xcf,
+ 0x01, 0x52, 0x0f, 0xe0, 0x00, 0x00, 0x0b, 0x2f, 0x40, 0x2e, 0x23, 0x10,
+ 0xf8, 0x10, 0x72, 0x44,
+ 0xed, 0xda, 0x00, 0x23, 0x03, 0x0f, 0xf1, 0x14, 0x4f, 0x40, 0x22, 0x20,
+ 0x6e, 0x40, 0x57, 0x25,
+ 0x1f, 0x1f, 0x21, 0x33, 0x00, 0x2e, 0x31, 0x31, 0xfe, 0xd0, 0x36, 0x61,
+ 0x00, 0x1f, 0x2f, 0x74,
+ 0x36, 0x10, 0xed, 0x20, 0x42, 0x00, 0x20, 0x40, 0x33, 0x00, 0x1d, 0x25,
+ 0x12, 0x00, 0x71, 0x25,
+ 0xf0, 0x00, 0x33, 0x44, 0x10, 0x31, 0x00, 0x10, 0x12, 0x22, 0x27, 0x21,
+ 0x00, 0xc0, 0x03, 0x01,
+ 0xe0, 0x01, 0x35, 0x51, 0x71, 0x37, 0x21, 0xf0, 0xfe, 0x30, 0x63, 0x41,
+ 0x00, 0xb1, 0x03, 0x11,
+ 0xf1, 0xe2, 0x17, 0x13, 0xfd, 0xe1, 0x17, 0xd1, 0xaf, 0x0f, 0xf1, 0x04,
+ 0xf1, 0xd0, 0xf2, 0x02,
+ 0x10, 0xbe, 0xde, 0xbf, 0x01, 0x23, 0x00, 0xde, 0x0d, 0xe9, 0x0f, 0x50,
+ 0x46, 0xfd, 0x9b, 0x00,
+ 0x00, 0x00, 0x0e, 0xe0, 0xf1, 0xdf, 0xef, 0xed, 0xfc, 0x1d, 0x45, 0x33,
+ 0xfb, 0x9d, 0x01, 0x02,
+ 0x01, 0x2f, 0xdc, 0xdd, 0x0e, 0x53, 0x26, 0xd0, 0xdc, 0x01, 0x21, 0xaf,
+ 0xcf, 0x0f, 0x00, 0x20,
+ 0x34, 0x20, 0xb9, 0xef, 0x00, 0x72, 0x02, 0x00, 0x0d, 0xff, 0x10, 0x14,
+ 0x10, 0x10, 0x0c, 0x10,
+ 0x20, 0xf0, 0xfd, 0xcf, 0xef, 0x00, 0x01, 0xab, 0x98, 0xfe, 0xf0, 0x04,
+ 0xff, 0xed, 0x00, 0x01,
+ 0x00, 0xec, 0xd0, 0x13, 0x10, 0xec, 0xcf, 0xff, 0xef, 0x0f, 0x3f, 0xc2,
+ 0x8f, 0xc8, 0x1d, 0x43,
+ 0xf1, 0xcc, 0x00, 0xf0, 0x02, 0x00, 0x0d, 0xee, 0xe0, 0xbd, 0x0d, 0x43,
+ 0x01, 0xb8, 0x0a, 0x00,
+ 0x21, 0x00, 0xf0, 0x00, 0xee, 0x2f, 0x1e, 0x10, 0xe0, 0xe0, 0xe9, 0x3f,
+ 0x50, 0xee, 0xcd, 0x0f,
+ 0xf0, 0xe0, 0x24, 0x72, 0x0b, 0xfc, 0xfe, 0x60, 0x33, 0xfe, 0xdd, 0x0d,
+ 0x2c, 0x00, 0x22, 0xf0,
+ 0xa8, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0xc0, 0xb0, 0xde, 0xe1, 0xf2, 0xef,
+ 0xd0, 0xb1, 0xc0, 0xbb,
+ 0xfe, 0xf2, 0xef, 0xc8, 0x00, 0xf1, 0xf4, 0x12, 0xe1, 0xae, 0xf0, 0x03,
+ 0x25, 0x12, 0xe1, 0xbf,
+ 0x00, 0x03, 0xde, 0xcb, 0x0f, 0xed, 0xfe, 0x06, 0x01, 0xff, 0x0e, 0x1f,
+ 0xdd, 0xbe, 0x00, 0x1f,
+ 0x3c, 0x00, 0xbe, 0xd9, 0xee, 0x00, 0xf2, 0x03, 0x2e, 0xfa, 0xef, 0x51,
+ 0x53, 0x40, 0x51, 0x12,
+ 0x0c, 0x0e, 0x10, 0x10, 0x17, 0x20, 0x1e, 0x20, 0x73, 0x2f, 0xfa, 0xee,
+ 0x21, 0x51, 0x20, 0x32,
+ 0x42, 0x10, 0x0b, 0x0e, 0x41, 0x57, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x37,
+ 0x10, 0x10, 0x0e, 0x00,
+ 0x30, 0x44, 0x31, 0x41, 0x00, 0x40, 0x51, 0x21, 0x20, 0x1f, 0xf0, 0xf1,
+ 0x14, 0x0d, 0x1d, 0x65,
+ 0x14, 0x01, 0x00, 0xff, 0x00, 0x42, 0x44, 0x02, 0xe1, 0xfe, 0xed, 0x41,
+ 0x21, 0xcb, 0xed, 0x62,
+ 0x17, 0xdf, 0xbc, 0x11, 0x57, 0x12, 0x00, 0x0f, 0xf1, 0xe1, 0x10, 0x20,
+ 0x22, 0x12, 0xf3, 0x06,
+ 0x00, 0x00, 0xfe, 0xc0, 0x20, 0x74, 0x72, 0x01, 0x01, 0x0f, 0x0f, 0x40,
+ 0x31, 0x10, 0xff, 0xc9,
+ 0x0f, 0x31, 0x10, 0x2f, 0xf0, 0xd2, 0x0c, 0x00, 0xf5, 0xe1, 0x34, 0x72,
+ 0x01, 0x03, 0x24, 0xf0,
+ 0xfd, 0xe1, 0xe0, 0xc0, 0x07, 0x16, 0xc0, 0x90, 0xce, 0xf1, 0x13, 0x40,
+ 0x04, 0x02, 0xe0, 0x0f,
+ 0x0f, 0x53, 0x15, 0x31, 0x52, 0x01, 0x00, 0xf3, 0x07, 0x31, 0x3f, 0x00,
+ 0x02, 0x01, 0x00, 0xfe,
+ 0x50, 0x55, 0x11, 0x01, 0x0e, 0x00, 0x11, 0x76, 0x21, 0xe0, 0xfd, 0xfc,
+ 0x00, 0x02, 0x26, 0xf0,
+ 0xcf, 0x10, 0x43, 0xe1, 0xae, 0xfe, 0x01, 0x22, 0xfe, 0x10, 0x03, 0xb0,
+ 0x27, 0x52, 0x0c, 0xcb,
+ 0xf0, 0x10, 0x25, 0x30, 0x00, 0xee, 0xf1, 0x00, 0x10, 0x10, 0x00, 0xe1,
+ 0xe2, 0xec, 0xfd, 0xef,
+ 0xf1, 0x77, 0x61, 0xe1, 0xed, 0xed, 0x0f, 0x63, 0x02, 0x00, 0xee, 0xfc,
+ 0xcb, 0x0d, 0x1e, 0x1e,
+ 0x00, 0x35, 0xfc, 0xcd, 0x1e, 0x0d, 0xff, 0x77, 0x52, 0xed, 0xe9, 0xf0,
+ 0x10, 0x40, 0x1e, 0xff,
+ 0xef, 0x10, 0x20, 0xfd, 0xff, 0xde, 0x9a, 0xff, 0x00, 0xe1, 0xef, 0x0d,
+ 0xdf, 0xe0, 0xe1, 0x9e,
+ 0xed, 0xf0, 0xdc, 0xcb, 0xfe, 0xce, 0xfd, 0xfc, 0x00, 0x00, 0xbf, 0xdb,
+ 0xf0, 0x21, 0x35, 0xcd,
+ 0xbd, 0x12, 0x01, 0xfb, 0xcd, 0xe0, 0xff, 0x00, 0xff, 0xaa, 0xf0, 0x0f,
+ 0x0e, 0xd0, 0xf2, 0x00,
+ 0xc9, 0xdf, 0xd0, 0xf1, 0x90, 0xed, 0xff, 0xe0, 0xd0, 0x01, 0x01, 0x0c,
+ 0xfc, 0x11, 0x64, 0x02,
+ 0x00, 0xed, 0x0e, 0x32, 0x66, 0x11, 0x00, 0xc0, 0x03, 0x42, 0x00, 0x0c,
+ 0x30, 0x1d, 0xfc, 0x11,
+ 0x77, 0x3f, 0x0c, 0x00, 0x00, 0x10, 0x53, 0x10, 0x0a, 0x0e, 0xef, 0x0f,
+ 0x70, 0x37, 0x10, 0x0e,
+ 0x0c, 0xe0, 0x00, 0x33, 0x01, 0x21, 0x31, 0xe0, 0xfd, 0x71, 0x25, 0xe0,
+ 0xfc, 0x22, 0x65, 0x00,
+ 0xfe, 0x10, 0x36, 0x01, 0x30, 0x1f, 0x00, 0x11, 0x01, 0x03, 0x33, 0x02,
+ 0xef, 0x1f, 0xfe, 0xc1,
+ 0x02, 0x63, 0x05, 0xf0, 0x10, 0x72, 0x04, 0x03, 0x03, 0x52, 0x37, 0xe3,
+ 0x8e, 0xe0, 0x05, 0x01,
+ 0xd1, 0x11, 0x23, 0xcf, 0x0e, 0x00, 0x01, 0xf0, 0x00, 0x0e, 0x01, 0x05,
+ 0x10, 0x00, 0x20, 0x00,
+ 0x53, 0xf5, 0x27, 0x12, 0x74, 0xf5, 0x5f, 0x14, 0x31, 0xfe, 0xb8, 0x3f,
+ 0xde, 0x8b, 0xff, 0xfd,
+ 0x0d, 0xe9, 0x1e, 0x6e, 0x31, 0x11, 0x1c, 0x0f, 0xe0, 0x12, 0x71, 0x0d,
+ 0xab, 0xf0, 0x02, 0x20,
+ 0x0e, 0x98, 0x0e, 0x00, 0x10, 0x12, 0x2f, 0xfc, 0x00, 0x53, 0x00, 0x0d,
+ 0x0e, 0x11, 0x24, 0x00,
+ 0xcf, 0x0c, 0x22, 0x24, 0xce, 0xd0, 0x42, 0x20, 0xef, 0xf5, 0xe1, 0x21,
+ 0x65, 0x00, 0xe1, 0xf0,
+ 0xef, 0xeb, 0x32, 0x52, 0xcc, 0xdb, 0xe1, 0xf3, 0xf1, 0xe3, 0x00, 0xae,
+ 0xeb, 0x0f, 0x40, 0x46,
+ 0x00, 0xb0, 0x1f, 0x31, 0x23, 0x10, 0x01, 0x00, 0x2f, 0x00, 0x03, 0x1e,
+ 0xec, 0xaa, 0x00, 0x20,
+ 0x10, 0xdd, 0xe0, 0x44, 0x4f, 0x2e, 0x11, 0x03, 0xdf, 0xcb, 0xee, 0x1b,
+ 0x2e, 0xef, 0xc1, 0x03,
+ 0x7f, 0x2d, 0x0c, 0xcd, 0x0e, 0xfd, 0xd0, 0x14, 0x40, 0x08, 0xfd, 0xe0,
+ 0x0f, 0x20, 0x21, 0xc1,
+ 0x2c, 0x5f, 0xe0, 0x07, 0x73, 0x00, 0x10, 0xef, 0xbb, 0x10, 0x20, 0x12,
+ 0x03, 0x13, 0x25, 0xd0,
+ 0x9f, 0x00, 0x00, 0xc0, 0x16, 0x21, 0xd0, 0xc1, 0xdf, 0xed, 0x65, 0x35,
+ 0xd0, 0xcd, 0x00, 0x10,
+ 0x12, 0x33, 0x11, 0xd0, 0xbe, 0x23, 0x15, 0xf2, 0xb0, 0x04, 0x67, 0x21,
+ 0x00, 0xf0, 0xf1, 0x12,
+ 0x74, 0x00, 0xdc, 0x11, 0x12, 0x00, 0xdd, 0x00, 0x13, 0x00, 0xed, 0xf1,
+ 0x37, 0xe2, 0x8a, 0x00,
+ 0x00, 0x23, 0x40, 0x10, 0x10, 0x00, 0x1f, 0x0f, 0x0e, 0xf0, 0x22, 0x13,
+ 0x2f, 0xda, 0x8f, 0x02,
+ 0x35, 0x00, 0xc0, 0x01, 0x01, 0x23, 0x01, 0xac, 0xfe, 0x02, 0x13, 0x22,
+ 0x0e, 0x98, 0x0f, 0x00,
+ 0x46, 0x00, 0x00, 0xfe, 0xef, 0xff, 0xf1, 0x11, 0x10, 0x00, 0x01, 0x32,
+ 0x1d, 0x98, 0x00, 0x14,
+ 0x10, 0x00, 0xe0, 0x00, 0xb2, 0x01, 0x02, 0x40, 0x30, 0x02, 0xbf, 0x0e,
+ 0x0e, 0x02, 0x16, 0x31,
+ 0x52, 0xf2, 0xaf, 0xfd, 0x21, 0x00, 0x09, 0x0f, 0x21, 0xfc, 0xdc, 0x31,
+ 0x50, 0xed, 0x00, 0x11,
+ 0x0e, 0xfd, 0x04, 0xb1, 0xcd, 0x0d, 0x37, 0x31, 0xef, 0xdf, 0x0f, 0xa0,
+ 0x00, 0x30, 0x34, 0x00,
+ 0x7f, 0x31, 0x12, 0xed, 0xa8, 0x0a, 0xef, 0x20, 0x53, 0xf0, 0xdf, 0xf0,
+ 0x00, 0x11, 0x0e, 0x0e,
+ 0x01, 0xeb, 0x1d, 0x40, 0xff, 0x08, 0x7f, 0x43, 0xe0, 0xed, 0xe0, 0x17,
+ 0x42, 0x00, 0xde, 0xe0,
+ 0xe2, 0x01, 0xf3, 0xd0, 0xbe, 0x0c, 0x01, 0x13, 0xf3, 0x21, 0x70, 0x30,
+ 0x17, 0x37, 0xf0, 0x0f,
+ 0x20, 0x03, 0xf0, 0x00, 0x10, 0xe1, 0x55, 0x51, 0x02, 0x9f, 0xed, 0x0f,
+ 0x27, 0x14, 0xdf, 0xfe,
+ 0x01, 0x11, 0x01, 0xc0, 0xc0, 0x10, 0x50, 0x10, 0xf2, 0xd2, 0x0f, 0x2e,
+ 0x32, 0xf2, 0x9b, 0x0d,
+ 0x01, 0x03, 0xe0, 0x1a, 0x5f, 0x00, 0xdf, 0xef, 0x01, 0x0e, 0x0d, 0x77,
+ 0x03, 0xfc, 0x0f, 0xff,
+ 0xef, 0x0f, 0x1e, 0x2f, 0x62, 0x17, 0x02, 0xe0, 0x0f, 0x2e, 0x0e, 0x0f,
+ 0xf0, 0xed, 0xfc, 0x5c,
+ 0x5d, 0x34, 0xde, 0x88, 0x0f, 0x45, 0x00, 0x00, 0xdd, 0xff, 0x0f, 0x20,
+ 0x23, 0x00, 0xfb, 0xde,
+ 0xf0, 0x2d, 0x4e, 0x40, 0x40, 0x0e, 0xc8, 0xed, 0x2f, 0x5f, 0x00, 0x0f,
+ 0xcc, 0xfd, 0x0f, 0x10,
+ 0x30, 0xdc, 0x9d, 0xfc, 0xee, 0x0d, 0x00, 0xfb, 0xcc, 0x00, 0x30, 0x41,
+ 0xfb, 0x0e, 0x0e, 0x0d,
+ 0x60, 0x00, 0xef, 0xfb, 0xde, 0x1d, 0x50, 0x13, 0x0e, 0xec, 0xbe, 0x11,
+ 0x44, 0x00, 0xfd, 0xed,
+ 0x10, 0x21, 0x41, 0x01, 0x1e, 0xe8, 0xe9, 0x00, 0xe1, 0x20, 0x50, 0xee,
+ 0x10, 0x52, 0xff, 0xce,
+ 0x00, 0x00, 0x1c, 0x73, 0x23, 0xee, 0xed, 0x00, 0x17, 0x11, 0x10, 0x00,
+ 0xf0, 0xe0, 0xe0, 0xf0,
+ 0x50, 0x67, 0x13, 0x01, 0xe0, 0x34, 0x40, 0xdd, 0xf0, 0x04, 0x01, 0x12,
+ 0x13, 0xb5, 0xc0, 0xcc,
+ 0xdf, 0x13, 0x35, 0x0f, 0xb0, 0xf0, 0x12, 0x62, 0x27, 0x01, 0xce, 0x00,
+ 0x46, 0x11, 0xf0, 0xbd,
+ 0x00, 0x04, 0x20, 0xd0, 0xde, 0x01, 0x02, 0x13, 0x56, 0x00, 0xf0, 0xf0,
+ 0x00, 0x12, 0x03, 0xb0,
+ 0xf1, 0x03, 0x37, 0x01, 0x90, 0x00, 0xf2, 0x02, 0x22, 0x10, 0x01, 0xf1,
+ 0x14, 0x14, 0x32, 0x00,
+ 0x0f, 0xf0, 0x07, 0xf2, 0xd1, 0xd2, 0x25, 0x42, 0x81, 0xb0, 0x21, 0x25,
+ 0x13, 0xf1, 0xf0, 0x42,
+ 0x55, 0x12, 0x12, 0x01, 0xcf, 0x00, 0x50, 0x15, 0x01, 0x00, 0xee, 0xff,
+ 0x24, 0x53, 0xfe, 0xde,
+ 0x11, 0x00, 0xfe, 0x0d, 0x0c, 0x8a, 0xff, 0x21, 0x33, 0x0c, 0xbc, 0xff,
+ 0x00, 0x02, 0x35, 0xfe,
+ 0xcf, 0x01, 0x02, 0xfd, 0x0d, 0x4d, 0x20, 0x0e, 0x98, 0x0e, 0x13, 0x00,
+ 0xfe, 0x0e, 0x42, 0x34,
+ 0x00, 0xbd, 0x0f, 0x01, 0x34, 0x66, 0x00, 0xf0, 0xe0, 0x00, 0xf1, 0x01,
+ 0x02, 0x42, 0x1f, 0xdb,
+ 0xbe, 0x00, 0x21, 0x45, 0x13, 0xed, 0xda, 0x00, 0x01, 0x04, 0x00, 0xc0,
+ 0xce, 0xdc, 0x11, 0x13,
+ 0xf0, 0xca, 0x00, 0x11, 0x00, 0x00, 0x1e, 0x3f, 0x71, 0x76, 0x10, 0xfd,
+ 0x00, 0x0f, 0x41, 0xf0,
+ 0xd0, 0xfe, 0x0c, 0x0d, 0xf0, 0xf2, 0xee, 0xff, 0x05, 0x04, 0x2d, 0x49,
+ 0x30, 0x70, 0x23, 0xce,
+ 0xcd, 0x0e, 0x3c, 0x20, 0x33, 0x42, 0xfe, 0x89, 0xf0, 0x00, 0x10, 0x0e,
+ 0xf2, 0x05, 0x20, 0xdd,
+ 0xfb, 0xf0, 0x20, 0x50, 0x00, 0xee, 0x30, 0x31, 0x0e, 0x1e, 0x40, 0xee,
+ 0x8c, 0x0f, 0x06, 0x00,
+ 0xdd, 0xeb, 0x20, 0x52, 0x04, 0xfe, 0xcc, 0x00, 0x0f, 0xcd, 0x0f, 0x22,
+ 0x02, 0xff, 0x20, 0x2c,
+ 0xde, 0xe0, 0x15, 0x74, 0x01, 0xd0, 0xbf, 0xfe, 0x0f, 0x44, 0x74, 0x10,
+ 0x0c, 0x01, 0x02, 0x00,
+ 0x01, 0x32, 0x02, 0xe3, 0x0f, 0x1c, 0xf0, 0x01, 0x0e, 0x88, 0xc8, 0x00,
+ 0x11, 0x20, 0xe0, 0x0f,
+ 0x3f, 0x00, 0x01, 0x0f, 0x0d, 0x3f, 0x60, 0x0f, 0x0f, 0x1d, 0x00, 0xbe,
+ 0xe8, 0x0f, 0x40, 0x1f,
+ 0xfe, 0xdf, 0x12, 0x74, 0x11, 0xe0, 0x0e, 0xfa, 0xe0, 0x13, 0x42, 0x12,
+ 0x00, 0x9a, 0xfe, 0xf0,
+ 0x01, 0x32, 0x3f, 0x0d, 0xab, 0x0d, 0x1f, 0x10, 0x13, 0x27, 0xef, 0xce,
+ 0x0f, 0x2f, 0x01, 0xe1,
+ 0xd1, 0xcf, 0x1e, 0xfd, 0x88, 0xfd, 0x22, 0x47, 0x10, 0x00, 0xff, 0x00,
+ 0xf0, 0x10, 0x01, 0x13,
+ 0x01, 0xef, 0xbb, 0x00, 0x33, 0x12, 0xd0, 0xce, 0x0f, 0xf0, 0x30, 0x60,
+ 0x0c, 0xfe, 0x00, 0x52,
+ 0x0f, 0xc8, 0x10, 0x2f, 0xef, 0xb0, 0x00, 0x21, 0x0f, 0xdc, 0xff, 0xce,
+ 0x15, 0x43, 0x00, 0xd0,
+ 0x4f, 0x5d, 0x0f, 0x04, 0x07, 0x15, 0xec, 0xbe, 0x00, 0x20, 0x01, 0xcf,
+ 0xdc, 0x00, 0x33, 0x73,
+ 0x0f, 0xf9, 0xff, 0x20, 0x50, 0xf0, 0xdd, 0x0e, 0x10, 0x40, 0x01, 0xef,
+ 0xbc, 0x0f, 0x03, 0x45,
+ 0xff, 0xdf, 0xe0, 0x10, 0x21, 0x00, 0x00, 0xfe, 0x30, 0x31, 0x2f, 0xb8,
+ 0xda, 0x00, 0x71, 0x53,
+ 0x11, 0x0f, 0x0e, 0xf2, 0x23, 0x54, 0x04, 0xf0, 0xe0, 0x1f, 0x22, 0x01,
+ 0xe3, 0xd1, 0x00, 0x35,
+ 0xf0, 0x8b, 0xe0, 0x35, 0x12, 0xe0, 0x12, 0x01, 0x00, 0xbc, 0xef, 0xd1,
+ 0x55, 0x31, 0x01, 0xf1,
+ 0xb0, 0xd0, 0xfe, 0xf4, 0x12, 0x0f, 0xef, 0xd2, 0x25, 0x66, 0x13, 0x00,
+ 0x00, 0xf0, 0x33, 0x76,
+ 0x00, 0xaf, 0x0f, 0x12, 0x21, 0xff, 0xdd, 0x00, 0x06, 0x11, 0x50, 0x0f,
+ 0x00, 0xf1, 0x00, 0x11,
+ 0x37, 0x11, 0xec, 0xce, 0xf0, 0x01, 0x22, 0x10, 0xcf, 0xac, 0x00, 0x04,
+ 0x21, 0x02, 0x10, 0xfc,
+ 0xcc, 0x1f, 0x70, 0x31, 0x00, 0xee, 0xdf, 0x10, 0x70, 0x01, 0x0d, 0xe1,
+ 0x04, 0x45, 0xf0, 0xcd,
+ 0xe9, 0xff, 0x10, 0x50, 0x16, 0x03, 0xfc, 0xdc, 0x00, 0x40, 0x02, 0x20,
+ 0xdc, 0xad, 0x00, 0x00,
+ 0x01, 0x33, 0xef, 0xce, 0x0f, 0x00, 0xfe, 0xda, 0x01, 0x33, 0x33, 0xf1,
+ 0xd0, 0xda, 0x9e, 0x0f,
+ 0x43, 0x14, 0x1e, 0xfe, 0xe1, 0x66, 0x20, 0x0f, 0xce, 0x00, 0xfe, 0x0d,
+ 0x40, 0x00, 0xfd, 0x0e,
+ 0x05, 0x31, 0x30, 0x44, 0xde, 0xed, 0x74, 0x15, 0x0f, 0xcd, 0x2f, 0x64,
+ 0x04, 0xff, 0xc9, 0x10,
+ 0x51, 0x01, 0x00, 0x0e, 0x00, 0x41, 0x04, 0xe0, 0xfe, 0x11, 0x13, 0xf1,
+ 0xf2, 0xe0, 0xac, 0x00,
+ 0x22, 0xf2, 0xbb, 0x0e, 0x0d, 0x0f, 0x00, 0x2e, 0xfa, 0x10, 0x67, 0x13,
+ 0x10, 0xff, 0xac, 0x01,
+ 0x03, 0x20, 0x00, 0xf0, 0xda, 0x0f, 0x30, 0xe0, 0xc0, 0xf1, 0xd4, 0x14,
+ 0x00, 0xb0, 0xf3, 0x02,
+ 0x03, 0x04, 0xd0, 0x2b, 0x71, 0xf3, 0xd0, 0x55, 0x56, 0x00, 0xef, 0x00,
+ 0x01, 0xf0, 0x00, 0x47,
+ 0x01, 0xef, 0xdd, 0x00, 0x44, 0xf1, 0xb0, 0x00, 0x13, 0x23, 0xe0, 0xde,
+ 0x12, 0x65, 0x11, 0xf0,
+ 0xf1, 0x04, 0x10, 0xd0, 0xe0, 0x45, 0x11, 0x00, 0x31, 0x35, 0xb0, 0xee,
+ 0x20, 0x20, 0x00, 0xef,
+ 0x1f, 0x70, 0x13, 0x31, 0x21, 0x00, 0xda, 0xee, 0x20, 0x32, 0x8d, 0xb8,
+ 0x00, 0x21, 0x21, 0xeb,
+ 0xbf, 0x0f, 0x20, 0x10, 0x00, 0xf0, 0x02, 0x0f, 0x1d, 0x30, 0xd1, 0x88,
+ 0xdc, 0x00, 0x11, 0x00,
+ 0x2f, 0x20, 0x00, 0xc0, 0x00, 0x53, 0x67, 0x02, 0xdd, 0x00, 0x00, 0x21,
+ 0x56, 0x00, 0xd0, 0x0e,
+ 0x0f, 0x00, 0x35, 0x32, 0xd0, 0xbd, 0x00, 0x34, 0xd0, 0xcd, 0x00, 0x0f,
+ 0x5f, 0x00, 0xfe, 0xab,
+ 0x00, 0x23, 0x0d, 0x0c, 0x00, 0x25, 0x0f, 0x0c, 0xcc, 0xfe, 0xfd, 0x64,
+ 0x34, 0xed, 0xcc, 0x0f,
+ 0x20, 0x21, 0x11, 0xdc, 0xab, 0x00, 0x10, 0x00, 0xff, 0xed, 0x20, 0x7e,
+ 0x10, 0x00, 0x20, 0x0d,
+ 0xf9, 0x10, 0x00, 0xdd, 0x0d, 0x40, 0x40, 0xf0, 0xbb, 0xdd, 0xff, 0x34,
+ 0x54, 0xee, 0xac, 0x00,
+ 0x00, 0x12, 0x20, 0xf8, 0x00, 0x30, 0x01, 0x0e, 0x0d, 0xd0, 0x1e, 0x0f,
+ 0x02, 0x11, 0x2f, 0x0c,
+ 0xe0, 0xdd, 0x0d, 0x0e, 0xd0, 0xf3, 0x75, 0x20, 0x1b, 0xba, 0xbe, 0x0f,
+ 0x00, 0x00, 0xad, 0x0d,
+ 0xff, 0x11, 0x00, 0xfa, 0xd0, 0x41, 0x22, 0xcd, 0xba, 0x21, 0x35, 0x32,
+ 0xef, 0xdd, 0x0f, 0x10,
+ 0x52, 0x02, 0x02, 0x40, 0x0c, 0x0e, 0x01, 0x12, 0xde, 0x00, 0x67, 0x10,
+ 0xfd, 0xd0, 0xdd, 0x9c,
+ 0x00, 0x34, 0x21, 0x00, 0xd1, 0x0f, 0x1b, 0x40, 0x52, 0x16, 0x00, 0xd0,
+ 0x0f, 0x60, 0x24, 0xf0,
+ 0xcd, 0x00, 0x00, 0x13, 0x00, 0x0f, 0xf1, 0xf1, 0xef, 0x07, 0x25, 0xd0,
+ 0xdf, 0x30, 0x12, 0x31,
+ 0x11, 0x73, 0x75, 0x10, 0xcc, 0x00, 0xf3, 0xe0, 0xff, 0xe0, 0xe3, 0x45,
+ 0x33, 0xe1, 0x02, 0xf0,
+ 0x00, 0x76, 0x73, 0x0d, 0xb9, 0x0f, 0x10, 0x12, 0x03, 0xff, 0xda, 0x0f,
+ 0x11, 0x04, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x34, 0x00, 0xbf, 0xef, 0x33, 0x60, 0xfb, 0xdd, 0x00,
+ 0x43, 0x21, 0x01, 0xde,
+ 0xbb, 0x00, 0x0e, 0xee, 0xef, 0x12, 0x25, 0x01, 0x30, 0xed, 0xcd, 0x11,
+ 0x67, 0x13, 0x01, 0xd0,
+ 0x12, 0x35, 0xe1, 0xa0, 0xfe, 0xf0, 0x47, 0x24, 0x00, 0x10, 0x11, 0x01,
+ 0x51, 0x14, 0xf0, 0xee,
+ 0x20, 0x54, 0x01, 0xd0, 0xc0, 0xf0, 0xf0, 0x40, 0x23, 0xaa, 0xf0, 0xf3,
+ 0x02, 0x32, 0x30, 0x0e,
+ 0xdb, 0xc0, 0x00, 0x45, 0x00, 0xee, 0xdf, 0x02, 0x02, 0xe0, 0xd0, 0x80,
+ 0xfb, 0x0d, 0x41, 0x41,
+ 0xff, 0xce, 0x00, 0x05, 0x42, 0x57, 0x12, 0x01, 0x0f, 0xe1, 0x37, 0x11,
+ 0xff, 0xff, 0x02, 0x22,
+ 0x01, 0xff, 0x00, 0xef, 0x00, 0x06, 0x01, 0xe0, 0x11, 0x62, 0xf0, 0x00,
+ 0x37, 0x91, 0xc0, 0xf3,
+ 0xf2, 0xe1, 0x02, 0xd3, 0xb1, 0x11, 0x10, 0x01, 0xb2, 0x01, 0x15, 0x43,
+ 0x01, 0x32, 0x37, 0xc3,
+ 0xaf, 0xff, 0x04, 0x13, 0x12, 0x41, 0xf0, 0x8a, 0x00, 0x15, 0x00, 0x1d,
+ 0x1f, 0x02, 0x15, 0x32,
+ 0x0f, 0xbb, 0x00, 0x1f, 0x40, 0x03, 0x13, 0x0e, 0xcc, 0xfe, 0x00, 0x00,
+ 0x12, 0x23, 0xeb, 0xce,
+ 0x1f, 0x50, 0x10, 0xeb, 0xfe, 0x0d, 0x2f, 0x70, 0x0c, 0xca, 0x0f, 0x30,
+ 0x0f, 0x0e, 0x0d, 0xed,
+ 0x1d, 0x0b, 0x0e, 0x3f, 0x20, 0xda, 0x8c, 0x0e, 0x0e, 0x5d, 0x00, 0x02,
+ 0x00, 0xe9, 0xdf, 0xae,
+ 0xee, 0xfd, 0x13, 0x32, 0x0d, 0x88, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00,
+ 0x00, 0xdf, 0x00, 0x30,
+ 0x3e, 0x0f, 0xfc, 0x0e, 0x10, 0x0f, 0xab, 0x00, 0x33, 0x22, 0xda, 0xd0,
+ 0x60, 0x10, 0x0e, 0xcd,
+ 0xfe, 0xdd, 0xca, 0x10, 0x40, 0x1c, 0x1e, 0x60, 0x02, 0x03, 0xfe, 0x0c,
+ 0x30, 0x2f, 0x0d, 0xc0,
+ 0xfc, 0x0d, 0x30, 0x30, 0x00, 0xdf, 0xae, 0xec, 0x0f, 0x35, 0x36, 0x1f,
+ 0x0c, 0xf0, 0x70, 0x40,
+ 0xfd, 0xde, 0x45, 0x54, 0x0e, 0xcb, 0xf0, 0x01, 0xe0, 0x01, 0x00, 0xdd,
+ 0xdd, 0x00, 0x20, 0x76,
+ 0x43, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x10, 0x35, 0xb0, 0xef, 0xce, 0xe0,
+ 0x02, 0x04, 0xf0, 0xe3,
+ 0xf7, 0x03, 0x23, 0xf2, 0x33, 0x60, 0xfe, 0xf3, 0x77, 0x27, 0x00, 0xe0,
+ 0x0e, 0x01, 0x02, 0x13,
+ 0x01, 0x8f, 0xfe, 0x02, 0xf0, 0x05, 0x43, 0x21, 0xf0, 0xff, 0x21, 0x43,
+ 0xe1, 0xd2, 0x16, 0x10,
+ 0x40, 0x21, 0x9e, 0xce, 0x07, 0x04, 0xef, 0xef, 0x12, 0x62, 0x00, 0x00,
+ 0x01, 0x10, 0x20, 0x10,
+ 0x0d, 0xcd, 0x20, 0x22, 0x22, 0xe8, 0xb9, 0x00, 0x3f, 0x10, 0x0f, 0x10,
+ 0x0e, 0x0d, 0x50, 0x12,
+ 0xee, 0xb8, 0xf0, 0x00, 0x00, 0xde, 0x9e, 0xf0, 0x00, 0x1d, 0xfe, 0xfe,
+ 0xed, 0x0d, 0x50, 0x42,
+ 0x0b, 0xd8, 0xfe, 0xff, 0x71, 0x24, 0x00, 0x00, 0x0e, 0x10, 0x14, 0xf0,
+ 0x24, 0x41, 0x00, 0x40,
+ 0x43, 0xbd, 0xdb, 0x12, 0x77, 0x10, 0xfe, 0xdd, 0x01, 0x23, 0x01, 0xef,
+ 0xe0, 0x11, 0x01, 0xf0,
+ 0xd0, 0xbd, 0xed, 0x15, 0x55, 0x10, 0xed, 0xd0, 0x00, 0x22, 0x10, 0x0e,
+ 0x0b, 0xdc, 0xc0, 0x24,
+ 0x02, 0x01, 0x00, 0x40, 0x3f, 0xc0, 0x90, 0xfb, 0x0e, 0x53, 0x36, 0xef,
+ 0xdb, 0x10, 0x50, 0x31,
+ 0x01, 0xef, 0xdc, 0x10, 0x40, 0x34, 0xe1, 0x9e, 0x0e, 0xe1, 0x01, 0x1f,
+ 0x1d, 0xf0, 0x02, 0x27,
+ 0xf0, 0x00, 0x00, 0xff, 0xae, 0x10, 0x54, 0x01, 0xc0, 0x03, 0x05, 0x01,
+ 0x00, 0x32, 0x17, 0xb0,
+ 0x00, 0x10, 0x73, 0x23, 0x04, 0xf0, 0xd0, 0x11, 0x00, 0x0f, 0x20, 0x24,
+ 0x17, 0x10, 0x01, 0xf0,
+ 0x8f, 0xfc, 0xff, 0x24, 0x05, 0xc0, 0xde, 0xee, 0x01, 0x22, 0xd2, 0x02,
+ 0x46, 0x00, 0xdd, 0xe0,
+ 0x74, 0x54, 0xe0, 0xbc, 0x00, 0x00, 0x41, 0x00, 0xf0, 0x01, 0x12, 0x20,
+ 0x15, 0x10, 0xff, 0xba,
+ 0x00, 0x02, 0xe0, 0xcf, 0xfe, 0xfd, 0x0e, 0x17, 0x72, 0x20, 0x0d, 0x00,
+ 0x02, 0x21, 0x00, 0x0f,
+ 0x0f, 0x55, 0x11, 0x00, 0xcf, 0xfd, 0x02, 0x10, 0x00, 0x23, 0xf6, 0xbf,
+ 0xef, 0x34, 0x43, 0x2f,
+ 0x00, 0xf0, 0xc0, 0x36, 0x74, 0x00, 0xfe, 0xdd, 0x00, 0x04, 0x23, 0x10,
+ 0xce, 0xbb, 0xfe, 0x10,
+ 0x25, 0x21, 0x0c, 0x2d, 0x4f, 0x13, 0xd2, 0xbe, 0xfc, 0x0e, 0xe0, 0xed,
+ 0xcd, 0xd8, 0xdf, 0x21,
+ 0x63, 0x00, 0xbb, 0xfd, 0x0f, 0x33, 0x35, 0xe0, 0x4f, 0x10, 0x1e, 0x0d,
+ 0x99, 0x00, 0x21, 0x33,
+ 0xee, 0xbd, 0x00, 0x00, 0xfe, 0x02, 0x34, 0xed, 0xff, 0x40, 0xfe, 0xdc,
+ 0xfd, 0x50, 0x56, 0x00,
+ 0xbc, 0xff, 0x00, 0x01, 0x03, 0x44, 0x13, 0xcd, 0xcc, 0x11, 0x47, 0x00,
+ 0xf0, 0x00, 0x00, 0x24,
+ 0x32, 0xf0, 0xee, 0xdf, 0xf1, 0x37, 0x31, 0x10, 0x2d, 0x10, 0x01, 0x05,
+ 0x20, 0x00, 0x37, 0x00,
+ 0x28, 0xf0, 0xbb, 0x0e, 0x7d, 0xef, 0x51, 0x0f, 0x12, 0x76, 0x22, 0xf0,
+ 0xbe, 0x10, 0x53, 0x00,
+ 0xbd, 0x0a, 0xef, 0x00, 0x11, 0x10, 0xed, 0xdc, 0x0f, 0x0f, 0x22, 0x63,
+ 0x0e, 0xfa, 0xcf, 0x00,
+ 0x10, 0x1b, 0xfc, 0x00, 0x24, 0x62, 0x11, 0x00, 0x13, 0x44, 0xff, 0xee,
+ 0xe0, 0x04, 0x1f, 0x0f,
+ 0x00, 0xec, 0x51, 0x47, 0xe4, 0xbf, 0xff, 0xf0, 0x13, 0x23, 0xd3, 0xa0,
+ 0x0d, 0x0d, 0x1e, 0x00,
+ 0x27, 0x35, 0x00, 0x30, 0x11, 0x12, 0xd0, 0xf0, 0xd3, 0xb3, 0xb2, 0xde,
+ 0xbd, 0x07, 0x36, 0xd0,
+ 0xee, 0x21, 0x52, 0x00, 0xee, 0x10, 0x65, 0x11, 0x11, 0x00, 0xdb, 0x0f,
+ 0x10, 0x00, 0x02, 0xf0,
+ 0x3f, 0x42, 0x03, 0xaf, 0xdd, 0x0f, 0x0c, 0x43, 0x66, 0x00, 0xff, 0xec,
+ 0x1f, 0x40, 0x14, 0x0e,
+ 0x99, 0x00, 0x02, 0x11, 0xeb, 0xdf, 0x20, 0x3f, 0x10, 0xed, 0xff, 0x50,
+ 0x40, 0x00, 0x1c, 0x0e,
+ 0xfa, 0xf0, 0x60, 0x01, 0xcb, 0xcd, 0x0f, 0x00, 0x23, 0x0b, 0xbc, 0x0f,
+ 0x00, 0x20, 0x20, 0x0e,
+ 0xdc, 0xde, 0xf0, 0xef, 0x0e, 0xff, 0x1e, 0x20, 0xfc, 0xdd, 0x3d, 0x00,
+ 0x06, 0x72, 0x60, 0xeb,
+ 0xef, 0xff, 0x0f, 0x10, 0x0d, 0x5e, 0x64, 0x02, 0xdb, 0xee, 0x10, 0x2f,
+ 0x2f, 0x32, 0x02, 0xcb,
+ 0xec, 0xf0, 0x1e, 0x50, 0x1f, 0x00, 0x12, 0x2f, 0x1c, 0x5f, 0x23, 0x01,
+ 0xac, 0x0e, 0x01, 0x42,
+ 0xec, 0xd9, 0x00, 0x34, 0x71, 0x00, 0xfd, 0x00, 0x30, 0xfd, 0x0d, 0x13,
+ 0x13, 0x0d, 0xec, 0xef,
+ 0x03, 0xc2, 0x89, 0xf0, 0x07, 0x32, 0x10, 0xd0, 0xbf, 0x0f, 0x02, 0x34,
+ 0xff, 0xfe, 0x32, 0x23,
+ 0xf0, 0x0f, 0x44, 0x57, 0x12, 0xdf, 0x8c, 0xf0, 0x04, 0x24, 0x00, 0xdd,
+ 0xe0, 0x00, 0x15, 0x11,
+ 0xf0, 0xe0, 0x00, 0x22, 0x77, 0x52, 0xd0, 0xe0, 0x00, 0x11, 0x02, 0x10,
+ 0xe0, 0xe0, 0x12, 0x55,
+ 0xf1, 0xe0, 0x02, 0x23, 0x24, 0xf3, 0xe0, 0xb0, 0x01, 0x15, 0x01, 0x14,
+ 0x35, 0xd0, 0xd2, 0xd2,
+ 0x91, 0xe2, 0x05, 0x24, 0x21, 0xe0, 0xc0, 0x02, 0x63, 0x26, 0x12, 0x10,
+ 0x2f, 0x71, 0x15, 0x11,
+ 0xf0, 0xe0, 0x23, 0x53, 0xef, 0xab, 0x00, 0x02, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0xd0, 0xe1, 0x07,
+ 0x00, 0xbe, 0x0e, 0x20, 0x01, 0x8b, 0xfc, 0x01, 0x12, 0x1f, 0x0d, 0xef,
+ 0xff, 0x12, 0x12, 0xdd,
+ 0xbb, 0x0e, 0x50, 0x00, 0x0d, 0xda, 0x32, 0x54, 0x00, 0x11, 0x42, 0x22,
+ 0x0e, 0x1e, 0x21, 0x32,
+ 0x11, 0x67, 0x00, 0x0f, 0x00, 0x03, 0xf2, 0x04, 0x37, 0xc0, 0x8b, 0xef,
+ 0x01, 0x23, 0x00, 0xcf,
+ 0x0e, 0x30, 0x23, 0x01, 0xcd, 0xed, 0x00, 0x45, 0x10, 0x0c, 0xee, 0xed,
+ 0xd0, 0xe0, 0xc0, 0x0e,
+ 0xfb, 0xfe, 0xfd, 0x0f, 0x72, 0x72, 0xf9, 0xdc, 0x1f, 0x30, 0x1f, 0xee,
+ 0xce, 0x0d, 0xfc, 0x40,
+ 0x00, 0xd9, 0xe0, 0x00, 0x0c, 0x0f, 0x60, 0x15, 0x10, 0x1e, 0x0f, 0x52,
+ 0x02, 0xfe, 0xab, 0x00,
+ 0x21, 0x0e, 0xfe, 0xff, 0xee, 0xc0, 0x0f, 0x10, 0x54, 0x00, 0x0b, 0x0e,
+ 0x40, 0x41, 0x12, 0x0f,
+ 0x30, 0x00, 0xb8, 0x0e, 0x31, 0x02, 0xac, 0xfc, 0xdf, 0x21, 0x00, 0xed,
+ 0x0b, 0x1f, 0x60, 0x23,
+ 0x12, 0xdc, 0xbc, 0x0f, 0x02, 0x00, 0xdf, 0xfd, 0xff, 0xed, 0x0f, 0x10,
+ 0x3e, 0x77, 0x15, 0x00,
+ 0x00, 0x34, 0x50, 0xfe, 0xdd, 0x00, 0x03, 0xf3, 0xf0, 0xd0, 0x20, 0x08,
+ 0xff, 0xe0, 0x16, 0x40,
+ 0x02, 0x8e, 0xec, 0x00, 0x00, 0xf0, 0xee, 0x60, 0x1f, 0x10, 0x11, 0x04,
+ 0x00, 0x02, 0xf1, 0xcf,
+ 0xce, 0xff, 0x10, 0x53, 0x17, 0x10, 0x0f, 0x0d, 0x24, 0x43, 0x0c, 0xff,
+ 0x03, 0x66, 0x33, 0x00,
+ 0x88, 0xed, 0x10, 0x35, 0x20, 0x01, 0x10, 0xee, 0xe0, 0x30, 0x50, 0x20,
+ 0x02, 0xf0, 0xcc, 0x00,
+ 0x00, 0x00, 0xdc, 0xde, 0x30, 0x53, 0xef, 0xb9, 0x10, 0x41, 0x01, 0xc0,
+ 0xfe, 0xee, 0x1d, 0x0c,
+ 0x0e, 0xfd, 0xf1, 0x56, 0x21, 0x0f, 0xfc, 0xe0, 0x32, 0xc1, 0xe0, 0x43,
+ 0x13, 0xa8, 0xcd, 0x00,
+ 0x20, 0x21, 0xf1, 0x00, 0x10, 0x0b, 0xed, 0x9d, 0xff, 0x15, 0x73, 0x01,
+ 0xeb, 0xef, 0xf0, 0x10,
+ 0x21, 0x03, 0x00, 0xdb, 0xe0, 0x22, 0x10, 0xf0, 0xae, 0xff, 0xf2, 0x13,
+ 0x6f, 0x00, 0xec, 0x0f,
+ 0x75, 0x16, 0x0f, 0x0a, 0xe0, 0x10, 0x00, 0x20, 0x00, 0xff, 0xff, 0x00,
+ 0x10, 0x60, 0x00, 0x00,
+ 0xd1, 0x37, 0x0f, 0xcd, 0x0f, 0x0e, 0xbc, 0xde, 0xef, 0x0d, 0x00, 0x32,
+ 0x1a, 0xca, 0xdf, 0x10,
+ 0x72, 0x42, 0x00, 0xcc, 0x0e, 0x00, 0x12, 0x21, 0x0f, 0x20, 0x31, 0x10,
+ 0x73, 0x27, 0x00, 0xb0,
+ 0x10, 0x22, 0x02, 0xff, 0xee, 0x05, 0x46, 0x01, 0xe1, 0xf0, 0xcf, 0xf0,
+ 0x01, 0xe2, 0xe1, 0x12,
+ 0x01, 0x0f, 0x40, 0x27, 0xe2, 0xf0, 0x10, 0x03, 0x56, 0x01, 0x82, 0xd2,
+ 0x04, 0xd0, 0xe0, 0xd1,
+ 0x04, 0xe3, 0x33, 0x0f, 0xee, 0x74, 0x77, 0x31, 0xdf, 0x0f, 0x42, 0x15,
+ 0xe0, 0xce, 0x00, 0x40,
+ 0x00, 0xf0, 0xd0, 0x02, 0x12, 0x10, 0xff, 0x22, 0x34, 0x22, 0x03, 0x22,
+ 0x61, 0xfe, 0xca, 0x0f,
+ 0x1e, 0x0d, 0xcb, 0xff, 0x03, 0x27, 0x11, 0x00, 0x9d, 0xee, 0xe0, 0x33,
+ 0x32, 0x0c, 0x2e, 0x20,
+ 0x76, 0x33, 0xcd, 0xcc, 0x20, 0x53, 0x00, 0xed, 0x02, 0x0f, 0x0a, 0xde,
+ 0x0e, 0x20, 0x1f, 0x01,
+ 0x03, 0x41, 0xfd, 0x9a, 0xf0, 0x04, 0x02, 0xdd, 0x8a, 0xf0, 0x12, 0x03,
+ 0x0e, 0xf0, 0x42, 0x01,
+ 0xfe, 0x00, 0x35, 0x10, 0xe0, 0xe2, 0x01, 0xaa, 0xde, 0xce, 0x0f, 0x3f,
+ 0x0f, 0x53, 0x23, 0x08,
+ 0xee, 0x11, 0x30, 0x00, 0x2e, 0x30, 0xdf, 0x9c, 0xfc, 0x0f, 0xfe, 0xcc,
+ 0x30, 0x74, 0x00, 0xee,
+ 0xfd, 0x0c, 0x51, 0x47, 0x0f, 0xfe, 0x00, 0x32, 0x10, 0x1f, 0x00, 0xf0,
+ 0xec, 0xbd, 0xe0, 0x16,
+ 0x01, 0x0e, 0xfe, 0xe1, 0x01, 0x54, 0x33, 0x00, 0xcc, 0xfe, 0x01, 0x65,
+ 0x23, 0x00, 0xbe, 0x0d,
+ 0x00, 0x02, 0xf3, 0xf2, 0xfe, 0xfa, 0x1e, 0x51, 0xe1, 0xdd, 0x0c, 0x25,
+ 0x04, 0x02, 0xaf, 0xed,
+ 0xf0, 0x00, 0xf2, 0x00, 0xf4, 0xf0, 0xbe, 0xec, 0x12, 0x15, 0x74, 0x44,
+ 0x10, 0x0f, 0x12, 0x01,
+ 0xcc, 0x01, 0x53, 0xf0, 0xc9, 0x00, 0x36, 0x10, 0xae, 0x0f, 0x01, 0x56,
+ 0x00, 0xc0, 0x0e, 0x31,
+ 0x00, 0x12, 0xf0, 0xe0, 0x00, 0x22, 0x03, 0x01, 0xbf, 0xe0, 0x04, 0x27,
+ 0x12, 0xf0, 0xee, 0xde,
+ 0x23, 0x77, 0x62, 0x00, 0xdd, 0x01, 0x33, 0x00, 0xf0, 0xf0, 0xe0, 0x07,
+ 0x22, 0xff, 0xcd, 0x22,
+ 0x67, 0x01, 0x00, 0xff, 0x00, 0xef, 0xf0, 0x01, 0x00, 0x0f, 0x0c, 0x9f,
+ 0xfe, 0xef, 0x0f, 0x1e,
+ 0x1f, 0x10, 0x01, 0xff, 0xca, 0xef, 0xe1, 0xd0, 0x9a, 0x00, 0x70, 0x20,
+ 0x00, 0x31, 0x01, 0x02,
+ 0x35, 0x23, 0x0f, 0xed, 0xc1, 0x24, 0x45, 0xff, 0xcc, 0x02, 0x13, 0x01,
+ 0xdd, 0x0d, 0x00, 0xf1,
+ 0x01, 0x3f, 0x29, 0xfe, 0xdd, 0xef, 0x21, 0x77, 0x2f, 0x1e, 0x1f, 0xd0,
+ 0x8e, 0xfe, 0x47, 0x14,
+ 0xce, 0xcd, 0xe0, 0x10, 0x10, 0xfe, 0xed, 0x51, 0x32, 0xfa, 0xad, 0x10,
+ 0x10, 0x20, 0x01, 0xef,
+ 0x0d, 0xdc, 0xed, 0x1d, 0x31, 0xef, 0xfc, 0x50, 0x45, 0x10, 0x0e, 0xf0,
+ 0x02, 0x00, 0x22, 0x00,
+ 0x88, 0xec, 0xff, 0x10, 0x13, 0x1d, 0x0d, 0x30, 0x33, 0x02, 0xdb, 0xcf,
+ 0x52, 0x46, 0x00, 0xef,
+ 0xdd, 0x2f, 0x50, 0x11, 0xe0, 0x0d, 0x19, 0x5f, 0x30, 0x30, 0xfd, 0x9b,
+ 0xfd, 0x0f, 0x30, 0x0e,
+ 0xaa, 0x0e, 0x0f, 0x20, 0x00, 0xc8, 0xef, 0x00, 0x1f, 0xe0, 0xbd, 0x10,
+ 0x30, 0x00, 0xdb, 0x0f,
+ 0x3f, 0x22, 0x43, 0x01, 0xcd, 0x0c, 0x20, 0x12, 0xe2, 0x9d, 0xfd, 0x0d,
+ 0x0f, 0x06, 0x01, 0xf0,
+ 0x2d, 0x2d, 0x0e, 0x33, 0x57, 0x10, 0x00, 0x02, 0xf0, 0x8d, 0x8d, 0x02,
+ 0x26, 0xf0, 0x01, 0x11,
+ 0x44, 0x12, 0x00, 0x00, 0x34, 0x13, 0x00, 0x04, 0x10, 0xfc, 0xd0, 0x20,
+ 0xf2, 0xb4, 0xf2, 0xf0,
+ 0xeb, 0xdf, 0x04, 0x75, 0x62, 0x02, 0x12, 0xef, 0xdf, 0x03, 0x46, 0x42,
+ 0xf1, 0xcf, 0x0e, 0x02,
+ 0x02, 0x02, 0x0e, 0xdd, 0x00, 0xed, 0xd8, 0xff, 0x60, 0x31, 0x00, 0x11,
+ 0x45, 0x10, 0xfe, 0x8f,
+ 0x00, 0x00, 0x0e, 0xfb, 0x00, 0x04, 0xf3, 0xfc, 0xdc, 0x1f, 0x42, 0x06,
+ 0x20, 0x10, 0x00, 0x72,
+ 0x11, 0xbd, 0xcd, 0x00, 0x02, 0x23, 0xed, 0xda, 0x12, 0x57, 0x00, 0xef,
+ 0xcf, 0xf0, 0xf0, 0x42,
+ 0x06, 0xe0, 0x0f, 0x22, 0x32, 0xc0, 0xfe, 0x01, 0x37, 0x62, 0x01, 0xd0,
+ 0xf0, 0xd0, 0x00, 0x22,
+ 0x52, 0x23, 0x52, 0x25, 0x22, 0xce, 0x0d, 0x23, 0x57, 0x07, 0xcf, 0x0f,
+ 0x00, 0x11, 0x02, 0xe0,
+ 0xdf, 0x00, 0x40, 0x22, 0x31, 0x20, 0xfd, 0xf0, 0x0f, 0xbf, 0x9b, 0xfd,
+ 0xed, 0xeb, 0xf0, 0x32,
+ 0x02, 0xac, 0xfd, 0x00, 0x22, 0xcf, 0xf8, 0x10, 0x51, 0x11, 0x1f, 0x2c,
+ 0x0f, 0x61, 0x13, 0x00,
+ 0x00, 0x35, 0x00, 0xb0, 0x01, 0xf3, 0x12, 0x05, 0x02, 0xd0, 0x0e, 0x00,
+ 0x47, 0x33, 0x11, 0x0f,
+ 0xcf, 0x00, 0x32, 0x77, 0xf2, 0xcf, 0x00, 0x00, 0x00, 0x23, 0xe1, 0xb2,
+ 0xf3, 0x03, 0x25, 0xf0,
+ 0xb0, 0x01, 0x15, 0x23, 0xd0, 0xbe, 0xe1, 0x00, 0x2f, 0x54, 0xe1, 0xdd,
+ 0x01, 0x43, 0x0e, 0x00,
+ 0x15, 0x02, 0x0f, 0x00, 0xff, 0xf8, 0x10, 0x3f, 0xf1, 0x30, 0x2e, 0xdd,
+ 0xff, 0xdf, 0xdd, 0x53,
+ 0x77, 0x2f, 0xdb, 0xbf, 0xfe, 0x10, 0x20, 0x00, 0x2f, 0x2e, 0x0d, 0xdc,
+ 0x10, 0x76, 0x40, 0xdc,
+ 0xdd, 0xf0, 0x00, 0x31, 0x1b, 0x2e, 0x2e, 0x0d, 0x7f, 0x2f, 0xd8, 0xfe,
+ 0x00, 0x0f, 0xff, 0x20,
+ 0x20, 0x8b, 0x8c, 0x0f, 0x21, 0x13, 0x0d, 0xfd, 0xe0, 0x00, 0x00, 0x2d,
+ 0x0b, 0x0f, 0xf0, 0x13,
+ 0x00, 0x0d, 0x0f, 0xfb, 0x50, 0x15, 0xe0, 0xdf, 0xe0, 0xff, 0x20, 0x52,
+ 0xa9, 0xfd, 0x00, 0x52,
+ 0x0d, 0xec, 0xfd, 0x0e, 0x50, 0x21, 0x0c, 0xdb, 0xff, 0xfe, 0xf1, 0x00,
+ 0x1c, 0xfd, 0x00, 0x00,
+ 0xeb, 0x0d, 0x7d, 0x40, 0x32, 0xe0, 0xd9, 0x00, 0x4f, 0x00, 0x1d, 0x2d,
+ 0x00, 0x01, 0xae, 0xfb,
+ 0x00, 0xfb, 0xee, 0x30, 0x75, 0x52, 0xff, 0xcb, 0x0f, 0x11, 0x22, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x43, 0x02, 0x01, 0xb1, 0x05, 0x01, 0xd9, 0xbe, 0x43, 0x33, 0xe0,
+ 0xcc, 0x10, 0x31, 0x01,
+ 0xe1, 0xd1, 0x06, 0x01, 0xe0, 0xaf, 0x00, 0x0e, 0xf0, 0x14, 0x05, 0xe0,
+ 0x42, 0x32, 0xe0, 0x9e,
+ 0x00, 0x37, 0x33, 0xff, 0x9e, 0xfe, 0x11, 0x12, 0x02, 0x00, 0x20, 0xf2,
+ 0xbf, 0x0f, 0x47, 0x34,
+ 0xd0, 0xbf, 0x00, 0xf6, 0x00, 0x01, 0xe0, 0xe3, 0x00, 0x0f, 0x0e, 0x44,
+ 0x53, 0xdd, 0xee, 0x02,
+ 0x03, 0x55, 0x01, 0xbf, 0x01, 0x64, 0x03, 0x0f, 0x0e, 0xf0, 0x03, 0x17,
+ 0x33, 0x00, 0xd0, 0xe0,
+ 0xe2, 0x47, 0x22, 0xed, 0x1f, 0x30, 0xad, 0x00, 0x27, 0x12, 0xde, 0xdc,
+ 0xe0, 0xee, 0xfe, 0xdf,
+ 0x21, 0x31, 0xbd, 0xc8, 0xbc, 0x00, 0x40, 0x31, 0x00, 0x20, 0x1e, 0x0e,
+ 0xdd, 0x21, 0x66, 0x00,
+ 0x40, 0x20, 0x1f, 0x00, 0xbc, 0x20, 0x77, 0x23, 0x0f, 0xcd, 0x00, 0x30,
+ 0x2f, 0x02, 0x0f, 0x0e,
+ 0x00, 0x00, 0x0f, 0xff, 0xdd, 0x9c, 0x03, 0xf6, 0xe0, 0xfd, 0xd0, 0xed,
+ 0xf0, 0x51, 0x00, 0x00,
+ 0x35, 0xfe, 0xde, 0x45, 0x13, 0xc2, 0xa0, 0xfe, 0xe8, 0xde, 0xde, 0xd0,
+ 0x02, 0x53, 0x1d, 0x1c,
+ 0x21, 0x02, 0x20, 0x22, 0x60, 0x54, 0x10, 0x0f, 0xfe, 0xea, 0x00, 0xff,
+ 0xf0, 0x34, 0x40, 0x00,
+ 0xbe, 0x06, 0x73, 0x00, 0x0d, 0xd0, 0x02, 0x00, 0xfe, 0xdf, 0x07, 0x67,
+ 0xe1, 0xde, 0x11, 0x13,
+ 0xe0, 0xd1, 0x23, 0xce, 0xfc, 0x75, 0x32, 0x10, 0x0e, 0x21, 0x40, 0x32,
+ 0x11, 0xdd, 0x10, 0x31,
+ 0xbd, 0xd9, 0xc0, 0xff, 0x02, 0x34, 0x00, 0xcf, 0xba, 0x0f, 0x42, 0x47,
+ 0xf1, 0xbd, 0x10, 0x22,
+ 0xf0, 0xc0, 0xe0, 0x01, 0x01, 0x0f, 0xd0, 0xe4, 0x24, 0x73, 0x14, 0x00,
+ 0xed, 0xfd, 0x00, 0xf1,
+ 0x03, 0x57, 0xf0, 0xac, 0x0f, 0xe1, 0x16, 0x00, 0xce, 0xf0, 0x00, 0x11,
+ 0x21, 0x22, 0xf0, 0x20,
+ 0x77, 0x30, 0xf0, 0x0e, 0x51, 0x01, 0xee, 0x00, 0x36, 0x21, 0xe0, 0xed,
+ 0x12, 0x25, 0x11, 0x50,
+ 0xf1, 0xcf, 0xdd, 0x0f, 0x44, 0x33, 0x57, 0x00, 0xbf, 0x0f, 0x30, 0x00,
+ 0x03, 0x11, 0x10, 0x0d,
+ 0x42, 0x02, 0x00, 0x4e, 0x0f, 0xbb, 0x00, 0xf0, 0xdc, 0x98, 0xfe, 0x20,
+ 0x10, 0xed, 0xde, 0x0c,
+ 0x1e, 0x40, 0x21, 0x0f, 0xdd, 0xdb, 0xfd, 0xfd, 0x10, 0x0c, 0x9d, 0x00,
+ 0x10, 0x0d, 0xbc, 0xee,
+ 0xed, 0xff, 0x75, 0x24, 0xfe, 0xdb, 0xfe, 0x0d, 0x10, 0x0c, 0xb0, 0x31,
+ 0x30, 0x1c, 0x2d, 0x40,
+ 0x00, 0xe0, 0xdf, 0xcb, 0xcc, 0x00, 0x33, 0x75, 0x0f, 0xde, 0xf0, 0x02,
+ 0x20, 0x1d, 0x11, 0x00,
+ 0xad, 0x17, 0x67, 0xf0, 0xce, 0xfe, 0x11, 0x35, 0x31, 0xf0, 0xc1, 0x01,
+ 0x11, 0x10, 0x0d, 0x30,
+ 0x77, 0x32, 0xf0, 0xce, 0x00, 0x0f, 0x30, 0x14, 0x10, 0xdf, 0xcd, 0x01,
+ 0xf5, 0xdf, 0xcc, 0xde,
+ 0xf1, 0xe0, 0xf0, 0xe0, 0x99, 0xde, 0x10, 0x41, 0x21, 0x2e, 0x30, 0x20,
+ 0x30, 0x01, 0xd0, 0xee,
+ 0x64, 0x03, 0xdb, 0xbf, 0x11, 0x15, 0x33, 0x03, 0xdf, 0x8f, 0x12, 0x14,
+ 0x21, 0x02, 0x02, 0x12,
+ 0x77, 0x02, 0xfe, 0xee, 0x00, 0x44, 0x04, 0x25, 0x41, 0xff, 0xbe, 0x02,
+ 0x05, 0x01, 0x00, 0xf0,
+ 0x12, 0xf3, 0xe2, 0x25, 0x53, 0xf2, 0xb0, 0xf2, 0xe1, 0x01, 0xe0, 0xe1,
+ 0x02, 0x41, 0x14, 0x00,
+ 0xef, 0x2b, 0x50, 0x53, 0x37, 0x04, 0xbd, 0xfe, 0x00, 0x02, 0x20, 0x00,
+ 0xab, 0xed, 0x22, 0x67,
+ 0x00, 0xdd, 0x0e, 0x00, 0x31, 0x03, 0xfe, 0xed, 0x21, 0x23, 0x9c, 0xdd,
+ 0x00, 0x22, 0x10, 0xfc,
+ 0xde, 0x20, 0x44, 0x00, 0x1f, 0x1e, 0x08, 0x3f, 0x70, 0x33, 0xff, 0xa8,
+ 0x0f, 0x20, 0x2e, 0x0f,
+ 0x9b, 0x0f, 0xf0, 0x10, 0x0f, 0x1d, 0xfd, 0xfe, 0x0e, 0x2f, 0x1e, 0x2d,
+ 0x2a, 0x1e, 0xfd, 0xfe,
+ 0xff, 0xa0, 0xf2, 0xe1, 0x0d, 0xd8, 0xb0, 0xf0, 0xfe, 0xed, 0x10, 0x50,
+ 0x30, 0x10, 0x52, 0x0d,
+ 0x08, 0x0e, 0x00, 0x30, 0x00, 0x8e, 0xf9, 0xf0, 0x0f, 0xdf, 0xdd, 0x0d,
+ 0x52, 0x21, 0x0d, 0xfc,
+ 0x35, 0x51, 0xfd, 0xfd, 0x10, 0x3e, 0xec, 0xe0, 0x0f, 0x0e, 0x70, 0x15,
+ 0x00, 0x0f, 0x0b, 0xfe,
+ 0x10, 0x71, 0x12, 0x00, 0xfb, 0xdf, 0xf0, 0x04, 0x22, 0x0e, 0xdf, 0x64,
+ 0xf5, 0xd1, 0xd0, 0xbd,
+ 0x00, 0x36, 0x72, 0xf0, 0xef, 0x11, 0x64, 0x00, 0xfe, 0x02, 0xf2, 0x00,
+ 0x00, 0x01, 0xe4, 0xf0,
+ 0x01, 0x30, 0x00, 0x03, 0x04, 0x27, 0x62, 0x00, 0xf0, 0xc0, 0xe0, 0x01,
+ 0x03, 0xf3, 0xc0, 0x03,
+ 0x25, 0x74, 0xf1, 0xcf, 0x1f, 0x44, 0x06, 0xe1, 0x31, 0x42, 0xdf, 0xab,
+ 0x00, 0x00, 0x00, 0x14,
+ 0x34, 0xef, 0xbe, 0x04, 0x14, 0xe0, 0xb1, 0x00, 0x01, 0x05, 0x01, 0xf1,
+ 0x03, 0x12, 0x30, 0x22,
+ 0x05, 0xc2, 0xd0, 0xd0, 0x27, 0x73, 0x51, 0xcf, 0x01, 0x07, 0x11, 0x01,
+ 0x20, 0x44, 0x01, 0xf0,
+ 0xf1, 0x44, 0x32, 0x10, 0x01, 0xe3, 0xc0, 0xc0, 0xf0, 0x02, 0x00, 0x00,
+ 0x10, 0x00, 0x68, 0x00,
+ 0x32, 0x11, 0xf4, 0x29, 0x11, 0x11, 0x59, 0x2b, 0xfc, 0xbc, 0xfe, 0xee,
+ 0x8c, 0x9c, 0xdc, 0xdd,
+ 0xdd, 0xaa, 0xcd, 0xdc, 0xed, 0xde, 0xdd, 0xbd, 0xdb, 0xde, 0xee, 0xe0,
+ 0xee, 0xee, 0xfe, 0xdf,
+ 0xee, 0xe0, 0xf2, 0x03, 0xe2, 0xd0, 0xe2, 0x13, 0x47, 0x74, 0x32, 0x63,
+ 0x32, 0x31, 0x21, 0x43,
+ 0x35, 0x31, 0x30, 0x20, 0x43, 0x44, 0x32, 0x11, 0x20, 0x20, 0x43, 0x23,
+ 0x00, 0x0c, 0x3f, 0x31,
+ 0x33, 0x31, 0x2e, 0x1b, 0x3e, 0x51, 0x00, 0xa8, 0xcd, 0xde, 0xdc, 0xac,
+ 0xdc, 0xcd, 0xde, 0xdf,
+ 0xde, 0xcd, 0xef, 0xdd, 0xdd, 0xef, 0xcc, 0xd9, 0xde, 0xf0, 0xf0, 0xfe,
+ 0x0c, 0x0e, 0xed, 0xef,
+ 0xef, 0x00, 0x21, 0x20, 0xdd, 0xcf, 0xaf, 0xbe, 0xda, 0xb0, 0xf4, 0xe4,
+ 0xd1, 0xe0, 0x02, 0x22,
+ 0x23, 0x34, 0x32, 0x2e, 0x5e, 0x42, 0x43, 0x3d, 0x5a, 0x3f, 0x5e, 0x2d,
+ 0x3c, 0x4d, 0x2a, 0x2d,
+ 0x3d, 0x50, 0x2f, 0x2b, 0x2d, 0x3d, 0x3d, 0x4e, 0x2d, 0x1a, 0x2f, 0x10,
+ 0x10, 0x0f, 0xe0, 0xf5,
+ 0x07, 0x02, 0xb1, 0xd1, 0xd2, 0xf4, 0xe3, 0x04, 0x32, 0x11, 0x22, 0x33,
+ 0x45, 0x24, 0xf1, 0x80,
+ 0xb1, 0xf2, 0xf2, 0xd1, 0xa0, 0xdf, 0xdf, 0xef, 0xcd, 0xdd, 0xe2, 0xf7,
+ 0xe4, 0x03, 0x02, 0xf1,
+ 0xdf, 0xe0, 0xf1, 0xe3, 0xd2, 0xd1, 0xf1, 0xe0, 0x9e, 0xca, 0xd0, 0xf1,
+ 0x01, 0xfd, 0xe9, 0xee,
+ 0xf0, 0x00, 0x33, 0x20, 0xcc, 0xc0, 0x35, 0x73, 0x21, 0x22, 0x43, 0x42,
+ 0x21, 0x30, 0x40, 0x55,
+ 0x45, 0x20, 0x42, 0x32, 0x51, 0x20, 0x2d, 0x31, 0x34, 0x30, 0x1b, 0x2d,
+ 0x1c, 0x2b, 0x1d, 0x1d,
+ 0x1c, 0x4d, 0x4e, 0x40, 0x3f, 0x4f, 0x2f, 0x3d, 0x2d, 0x1e, 0x0b, 0xde,
+ 0xe0, 0x02, 0x05, 0xe3,
+ 0x80, 0xbe, 0xee, 0xee, 0x0e, 0x00, 0xf0, 0xfc, 0xdb, 0xec, 0xde, 0x00,
+ 0x14, 0x04, 0xf0, 0xa0,
+ 0xe0, 0xe2, 0xd1, 0xaf, 0xd0, 0xd2, 0xd5, 0xc3, 0xd0, 0xce, 0xff, 0xef,
+ 0xb8, 0xdb, 0xef, 0xe0,
+ 0xef, 0xce, 0xec, 0xde, 0xee, 0xdf, 0xc0, 0xd0, 0xd0, 0xde, 0xf3, 0x07,
+ 0x21, 0x40, 0x60, 0x20,
+ 0x41, 0x64, 0x22, 0x30, 0x40, 0x20, 0x2f, 0x08, 0x0d, 0x1b, 0x0e, 0x20,
+ 0x21, 0x00, 0x0f, 0xed,
+ 0xdb, 0xbc, 0xde, 0xd0, 0xcf, 0xcf, 0xcc, 0xbb, 0xdc, 0xce, 0xde, 0xf1,
+ 0xe2, 0xd1, 0xe2, 0xe3,
+ 0x16, 0x22, 0x14, 0x12, 0x14, 0x12, 0x02, 0x32, 0x22, 0x23, 0x54, 0x23,
+ 0x33, 0x73, 0x43, 0x32,
+ 0x31, 0x54, 0x47, 0x52, 0x21, 0x20, 0x31, 0x43, 0x23, 0x33, 0x24, 0x33,
+ 0x22, 0x10, 0x00, 0x03,
+ 0x15, 0x01, 0x03, 0x24, 0x11, 0x00, 0xff, 0xb0, 0xf4, 0x06, 0xe1, 0xa0,
+ 0xdf, 0xd0, 0xbf, 0xdf,
+ 0xbd, 0xdd, 0xdb, 0xde, 0xef, 0xef, 0xf0, 0x11, 0x62, 0x1e, 0x19, 0x2f,
+ 0x3f, 0x50, 0x3f, 0x3f,
+ 0x2e, 0x2c, 0x29, 0x2e, 0x1f, 0x20, 0x10, 0x01, 0xb1, 0xb0, 0xde, 0xd0,
+ 0xd0, 0xe3, 0xf7, 0xb1,
+ 0xc0, 0xd0, 0xf3, 0xe3, 0xd0, 0xbe, 0xdd, 0xed, 0xdc, 0xfd, 0x0e, 0x0d,
+ 0x0a, 0xec, 0xfd, 0x1e,
+ 0x2c, 0x5e, 0x5c, 0x3c, 0x3c, 0x2d, 0x1b, 0x3f, 0x6f, 0x1d, 0x0b, 0x1f,
+ 0x10, 0x01, 0xf0, 0xe0,
+ 0x10, 0x50, 0x20, 0x0f, 0x0e, 0x0f, 0x52, 0x43, 0x2e, 0x0a, 0xed, 0xee,
+ 0xe0, 0xff, 0xe0, 0xcf,
+ 0xcb, 0xed, 0xdd, 0xab, 0xcc, 0xcb, 0xcd, 0xdc, 0xdd, 0xdc, 0xcd, 0xdd,
+ 0xee, 0xe0, 0xcd, 0xce,
+ 0xf0, 0x03, 0x02, 0xcf, 0xde, 0xc0, 0xe0, 0xe0, 0xcb, 0xff, 0xf0, 0xf3,
+ 0x06, 0x14, 0x32, 0x30,
+ 0x50, 0x34, 0x26, 0x43, 0x32, 0x32, 0x22, 0x63, 0x45, 0x33, 0x23, 0x11,
+ 0x33, 0x65, 0x22, 0x21,
+ 0x31, 0x43, 0x33, 0x54, 0x21, 0x32, 0x43, 0x45, 0x21, 0x20, 0x10, 0x21,
+ 0x2e, 0x2c, 0x1e, 0x2e,
+ 0x2b, 0x0c, 0x2e, 0x4e, 0x4e, 0x2c, 0x1e, 0x30, 0x42, 0x10, 0xfd, 0xbc,
+ 0xdd, 0xdf, 0xe0, 0x01,
+ 0xe1, 0x9b, 0xd8, 0xde, 0x00, 0x31, 0x10, 0xfd, 0x00, 0x31, 0x11, 0xf0,
+ 0xd1, 0x12, 0x32, 0x12,
+ 0xb1, 0xcf, 0x01, 0x47, 0x37, 0x00, 0xa1, 0xe0, 0x04, 0x03, 0xf1, 0xe1,
+ 0xf3, 0x03, 0x14, 0xc4,
+ 0x82, 0x92, 0xe2, 0xd3, 0xe6, 0xe3, 0xd4, 0xb2, 0xe2, 0xe4, 0xf3, 0x02,
+ 0xd2, 0xf4, 0x14, 0x12,
+ 0x32, 0x43, 0x52, 0x33, 0x31, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0xba,
+ 0xdd, 0xdd, 0xff, 0x1f,
+ 0x0b, 0xdb, 0xac, 0xee, 0x0d, 0x1e, 0xeb, 0xac, 0xcc, 0xdc, 0xde, 0xbd,
+ 0xed, 0xee, 0xee, 0xee,
+ 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x2f, 0x10, 0x0f, 0x0f, 0x00, 0x00,
+ 0x30, 0x52, 0x0f, 0xe9,
+ 0x0e, 0x6f, 0x50, 0x42, 0x63, 0x20, 0x1e, 0x30, 0x37, 0x47, 0x31, 0x32,
+ 0x32, 0x32, 0x10, 0xee,
+ 0xf0, 0x46, 0x53, 0x12, 0x01, 0xf1, 0x11, 0x22, 0x42, 0x32, 0x20, 0x10,
+ 0x02, 0x01, 0xd0, 0x9c,
+ 0xdd, 0xdf, 0xbe, 0xdb, 0xcd, 0xee, 0x0c, 0xee, 0xf1, 0xf2, 0x1f, 0x3d,
+ 0x3b, 0x2b, 0x2b, 0x1d,
+ 0x2d, 0x3d, 0x6f, 0x0d, 0xe9, 0xae, 0xde, 0xe0, 0xc0, 0xd0, 0xc0, 0xe1,
+ 0xc0, 0xdd, 0xf1, 0x17,
+ 0x23, 0x00, 0xf0, 0xfe, 0xdd, 0xcd, 0xbe, 0xe1, 0xf7, 0x13, 0xe0, 0xde,
+ 0x00, 0x2f, 0x1b, 0x5e,
+ 0x7e, 0x6d, 0x2b, 0x1c, 0x2b, 0x2f, 0x3d, 0x2c, 0x0d, 0x3d, 0x3f, 0x3d,
+ 0x3f, 0x1f, 0x0f, 0xf0,
+ 0x06, 0xd1, 0x80, 0xd0, 0xf3, 0x04, 0x02, 0x03, 0xe3, 0x04, 0x04, 0xe3,
+ 0x81, 0xe5, 0x05, 0xf2,
+ 0xe2, 0xd1, 0xe2, 0xd1, 0xd2, 0xf3, 0xd4, 0xb1, 0xc1, 0xc1, 0xd1, 0x90,
+ 0xdf, 0xd2, 0xd7, 0xf2,
+ 0xd1, 0xd1, 0xd2, 0xf3, 0x04, 0xf3, 0x04, 0x01, 0xff, 0xbd, 0xfd, 0x0f,
+ 0x0e, 0xfe, 0x1d, 0x0b,
+ 0x1d, 0x0f, 0xfd, 0x30, 0x72, 0x73, 0x41, 0x11, 0x1e, 0x34, 0x67, 0x23,
+ 0x21, 0x31, 0x44, 0x21,
+ 0x2f, 0x3e, 0x42, 0x47, 0x24, 0x21, 0x31, 0x22, 0x41, 0x20, 0x2f, 0x2d,
+ 0x3c, 0x5c, 0x2c, 0x2b,
+ 0x2e, 0x3d, 0x3f, 0x2e, 0x1d, 0x2d, 0x2d, 0x2e, 0x31, 0x47, 0x32, 0x10,
+ 0x00, 0x2f, 0x70, 0x70,
+ 0x1e, 0x0a, 0x30, 0x31, 0x3f, 0x3c, 0x5f, 0x2f, 0x21, 0x36, 0x12, 0x00,
+ 0x13, 0x13, 0x02, 0xe0,
+ 0xa1, 0xd0, 0xf4, 0x06, 0x01, 0xcf, 0xbe, 0xef, 0xd0, 0xdf, 0x01, 0x00,
+ 0xef, 0xcf, 0xd4, 0xc4,
+ 0x9d, 0xd8, 0xcf, 0xc0, 0xdf, 0xd1, 0xc3, 0xe2, 0xc1, 0xf3, 0xe5, 0x04,
+ 0xf2, 0x03, 0x04, 0x13,
+ 0x24, 0x32, 0x22, 0x30, 0x73, 0x35, 0x32, 0x31, 0x43, 0x42, 0x31, 0x2f,
+ 0x1b, 0x1f, 0x0e, 0xfa,
+ 0xee, 0x0e, 0xec, 0xac, 0xdd, 0xcd, 0xba, 0xdd, 0xab, 0xed, 0xde, 0xf0,
+ 0xdf, 0xcc, 0xde, 0xde,
+ 0xef, 0xf0, 0xf2, 0xf2, 0xf3, 0x04, 0x03, 0x03, 0xf1, 0xd0, 0xe4, 0xf6,
+ 0xc1, 0xc1, 0xd2, 0xe2,
+ 0x24, 0x53, 0x11, 0x33, 0x53, 0x46, 0x53, 0x22, 0x21, 0x21, 0x44, 0x44,
+ 0x22, 0x20, 0x20, 0x31,
+ 0x22, 0x30, 0x31, 0x40, 0x30, 0x40, 0x41, 0x31, 0x20, 0x2f, 0x2f, 0x2d,
+ 0x1a, 0x0c, 0xdb, 0xbe,
+ 0xdf, 0xce, 0xde, 0xcb, 0xab, 0xed, 0xee, 0xfd, 0xed, 0xed, 0xfd, 0x0d,
+ 0x1c, 0x0b, 0x0e, 0x1e,
+ 0x1d, 0x1d, 0x1f, 0xfd, 0x8c, 0xdc, 0xee, 0xdf, 0xbe, 0xce, 0xdf, 0xd0,
+ 0xd2, 0xe0, 0xd3, 0xe6,
+ 0xe2, 0xc0, 0xd0, 0xd0, 0xef, 0xe1, 0x07, 0xe1, 0xc0, 0xf2, 0x04, 0xf1,
+ 0xd0, 0x31, 0x73, 0x60,
+ 0x2e, 0x3b, 0x4c, 0x4d, 0x3b, 0x2c, 0x2c, 0x2e, 0x40, 0x3e, 0x3d, 0x2e,
+ 0x2d, 0x2d, 0x2e, 0x30,
+ 0x2f, 0x3d, 0x1c, 0x2f, 0x41, 0x22, 0x31, 0x74, 0x23, 0x2f, 0x0f, 0x10,
+ 0x05, 0xc3, 0xd3, 0xc2,
+ 0xd1, 0xd2, 0xb2, 0xe6, 0xd5, 0xb1, 0xdf, 0x0e, 0x0d, 0x09, 0xdc, 0xde,
+ 0xef, 0xfe, 0xfd, 0xdc,
+ 0xde, 0x01, 0xe1, 0x80, 0xb1, 0xe6, 0xd2, 0xa0, 0xd1, 0xc0, 0xc1, 0xd1,
+ 0xc0, 0xd0, 0xdc, 0xe0,
+ 0xe2, 0xd0, 0xd0, 0xe2, 0xd2, 0xe4, 0x07, 0x27, 0x11, 0x32, 0x62, 0x24,
+ 0x32, 0x42, 0x55, 0x33,
+ 0x35, 0x21, 0x22, 0x13, 0x22, 0x13, 0x34, 0x43, 0x43, 0x21, 0x41, 0x62,
+ 0x44, 0x52, 0x20, 0x20,
+ 0x4f, 0x2f, 0x32, 0x44, 0x20, 0x2e, 0x20, 0x32, 0x1d, 0x18, 0x0c, 0x1e,
+ 0x2f, 0x4f, 0x2e, 0x2f,
+ 0x3e, 0x1a, 0x1d, 0x2d, 0x6e, 0x40, 0x3f, 0x1e, 0x2e, 0x2d, 0x1d, 0x0d,
+ 0x20, 0x33, 0x00, 0xec,
+ 0xd0, 0x17, 0x52, 0x01, 0xf0, 0xe1, 0xe1, 0xf2, 0xe2, 0xe2, 0xb2, 0xe5,
+ 0xc2, 0xc4, 0xa4, 0xc2,
+ 0xc1, 0xb3, 0xd1, 0xc0, 0xe5, 0xd1, 0xc0, 0xd0, 0xd4, 0xd3, 0xf7, 0x04,
+ 0xf1, 0x01, 0x03, 0x14,
+ 0x02, 0x14, 0x24, 0x01, 0xf1, 0xd1, 0xe3, 0x02, 0x43, 0x52, 0x23, 0x67,
+ 0x24, 0x00, 0x00, 0x00,
+ 0x2f, 0x0d, 0xcb, 0xee, 0xed, 0xab, 0xdc, 0xdd, 0xec, 0xcd, 0xcc, 0xee,
+ 0xcd, 0xcd, 0xdb, 0xce,
+ 0x00, 0xff, 0xce, 0xde, 0xe0, 0xe0, 0xce, 0xde, 0xdf, 0xd0, 0xd3, 0xd1,
+ 0xe1, 0x0f, 0x0c, 0x1f,
+ 0x41, 0x53, 0x30, 0x3d, 0x5e, 0x55, 0x35, 0x31, 0x22, 0x36, 0x32, 0x44,
+ 0x45, 0x21, 0x11, 0x01,
+ 0x13, 0x35, 0x32, 0x21, 0x21, 0x21, 0x73, 0x22, 0x32, 0x34, 0x33, 0x21,
+ 0x00, 0xd0, 0xb1, 0xd2,
+ 0x90, 0xe1, 0xd4, 0xc0, 0xdf, 0xcb, 0xde, 0xf1, 0x03, 0x00, 0xda, 0xed,
+ 0x0f, 0x2f, 0x2f, 0x3f,
+ 0x50, 0x2d, 0x18, 0x4e, 0x60, 0x20, 0x1e, 0x3e, 0x30, 0x2c, 0x2c, 0x2f,
+ 0x51, 0x45, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x13, 0x10, 0xfc, 0xf0, 0xf5, 0xf3, 0xc0, 0xde, 0xbe,
+ 0xef, 0x02, 0x21, 0x30,
+ 0x3e, 0x6d, 0x38, 0x2a, 0x3e, 0x3e, 0x6f, 0x30, 0x40, 0x40, 0x2d, 0x1a,
+ 0x0e, 0x2e, 0x40, 0x00,
+ 0xfe, 0x0f, 0x30, 0xfe, 0xcc, 0xe0, 0xe1, 0x17, 0x54, 0x11, 0x02, 0x43,
+ 0x45, 0x32, 0x13, 0x01,
+ 0xc0, 0xcf, 0x00, 0x03, 0x04, 0xf1, 0xa0, 0xce, 0xf0, 0xf2, 0xef, 0xb8,
+ 0xde, 0xd0, 0xd1, 0xd1,
+ 0xb0, 0xcc, 0xef, 0xd0, 0xd0, 0xc0, 0xe1, 0xf2, 0xf0, 0xec, 0xdc, 0xe1,
+ 0xf5, 0xf0, 0xf0, 0xec,
+ 0xbc, 0xce, 0xde, 0xc0, 0x03, 0xf0, 0xcd, 0xef, 0x02, 0x05, 0x04, 0x24,
+ 0x54, 0x43, 0x21, 0x3f,
+ 0x51, 0x67, 0x12, 0x21, 0x11, 0x23, 0x31, 0x10, 0x20, 0x33, 0x43, 0x31,
+ 0x30, 0x28, 0x1d, 0x1c,
+ 0x2e, 0x4f, 0x4f, 0x2c, 0x2f, 0x3e, 0x0c, 0xfc, 0xed, 0xee, 0xab, 0xbd,
+ 0xcc, 0xef, 0x0f, 0xfe,
+ 0xed, 0xff, 0xed, 0xfc, 0xfd, 0x3f, 0x70, 0x20, 0x0d, 0xfd, 0xec, 0xed,
+ 0xbd, 0xd0, 0xd1, 0xc2,
+ 0xd2, 0xd6, 0xe4, 0x02, 0x22, 0x1f, 0x1c, 0x60, 0x43, 0x22, 0x20, 0x30,
+ 0x41, 0x20, 0x0f, 0x25,
+ 0x04, 0xf0, 0xbe, 0xed, 0xf1, 0x07, 0xe3, 0xa0, 0xde, 0xd0, 0x04, 0x06,
+ 0x02, 0x02, 0x24, 0x34,
+ 0x12, 0x01, 0x73, 0x56, 0x22, 0x11, 0x22, 0x32, 0x53, 0x35, 0x52, 0x22,
+ 0x33, 0x44, 0x33, 0x32,
+ 0x00, 0x0f, 0xfd, 0xed, 0xde, 0xcf, 0xdc, 0xbb, 0xcc, 0xdc, 0xee, 0xfd,
+ 0xdd, 0xed, 0xfe, 0xef,
+ 0xed, 0xde, 0xef, 0xf0, 0xb0, 0xd1, 0xb0, 0xc3, 0xd4, 0xe4, 0xc1, 0xd3,
+ 0xc4, 0xf7, 0xf3, 0xc0,
+ 0xc0, 0xf0, 0x24, 0x57, 0x00, 0xf0, 0xcd, 0xfd, 0x33, 0x77, 0x34, 0xf0,
+ 0xce, 0x00, 0x22, 0x0f,
+ 0x21, 0x77, 0x32, 0x00, 0x00, 0xfe, 0x10, 0x77, 0x32, 0x0f, 0xf0, 0xef,
+ 0x00, 0x11, 0xcd, 0xdc,
+ 0x00, 0x13, 0x77, 0x22, 0x10, 0x22, 0x11, 0xee, 0x89, 0xff, 0x11, 0x33,
+ 0x11, 0x00, 0xed, 0x88,
+ 0xdc, 0x00, 0x55, 0x32, 0xf0, 0xfe, 0xef, 0xff, 0x00, 0x00, 0x10, 0x11,
+ 0x00, 0xee, 0xff, 0x12,
+ 0x44, 0xf0, 0xbc, 0xba, 0xde, 0x44, 0x76, 0x00, 0xee, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0xff,
+ 0x11, 0x33, 0x00, 0xdc, 0xef, 0x10, 0x0f, 0x00, 0x20, 0x0e, 0xdc, 0x00,
+ 0x61, 0x0e, 0xca, 0xed,
+ 0x10, 0x75, 0x22, 0x00, 0xfd, 0xdc, 0xff, 0x22, 0x10, 0xcc, 0xee, 0x76,
+ 0x33, 0xff, 0xee, 0xee,
+ 0x00, 0x21, 0x00, 0xff, 0x00, 0x00, 0xff, 0x23, 0x56, 0x11, 0xdd, 0xcd,
+ 0x23, 0x67, 0x00, 0xdd,
+ 0x00, 0x00, 0xf0, 0x12, 0x12, 0xee, 0xdd, 0xdf, 0x12, 0x77, 0x10, 0xf0,
+ 0xe0, 0xdd, 0x00, 0x22,
+ 0x0f, 0x01, 0x23, 0xff, 0xac, 0xdc, 0xdc, 0x43, 0x77, 0x02, 0x0f, 0xff,
+ 0xed, 0x00, 0x35, 0x00,
+ 0xef, 0x10, 0x01, 0x11, 0x65, 0x11, 0x00, 0xce, 0xdd, 0x00, 0x77, 0x00,
+ 0x0f, 0x11, 0x12, 0x00,
+ 0xed, 0xff, 0x0f, 0x21, 0x45, 0x00, 0xdd, 0x00, 0x52, 0x36, 0xff, 0x9b,
+ 0xee, 0x00, 0x33, 0x00,
+ 0xff, 0x00, 0x11, 0x10, 0x21, 0x00, 0x0d, 0x10, 0x21, 0x35, 0x00, 0xdf,
+ 0x74, 0x00, 0xa8, 0x20,
+ 0x22, 0xdf, 0x00, 0x75, 0x10, 0xee, 0xee, 0xee, 0x22, 0x43, 0xff, 0x13,
+ 0x23, 0xcb, 0xee, 0x22,
+ 0x00, 0xbd, 0x14, 0x13, 0xf0, 0x02, 0x01, 0xd0, 0xd0, 0xaa, 0xee, 0x36,
+ 0x43, 0xee, 0xef, 0x10,
+ 0x32, 0x10, 0xff, 0xff, 0x0f, 0x53, 0x34, 0x00, 0xbb, 0xcd, 0x46, 0x55,
+ 0xff, 0xee, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x10, 0x21, 0xcc, 0xec, 0x21, 0x53, 0xfe, 0xed, 0x22,
+ 0x10, 0xdc, 0xca, 0x00,
+ 0x31, 0xdf, 0x00, 0x00, 0xdf, 0xcd, 0x20, 0x21, 0xab, 0xbb, 0x11, 0x65,
+ 0x00, 0xee, 0xff, 0x00,
+ 0x01, 0x12, 0x00, 0xdd, 0x12, 0x35, 0xef, 0xdf, 0x00, 0xee, 0xff, 0x43,
+ 0x23, 0x0f, 0xde, 0xde,
+ 0x11, 0x77, 0x21, 0x0f, 0x00, 0x10, 0x00, 0x12, 0xde, 0x00, 0x77, 0x00,
+ 0xee, 0xff, 0x10, 0x32,
+ 0x34, 0x33, 0xce, 0x88, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x23, 0xee,
+ 0xaa, 0x22, 0x32, 0xcc,
+ 0xff, 0x00, 0x21, 0x12, 0x0f, 0xec, 0x00, 0x21, 0x00, 0xfe, 0x63, 0x23,
+ 0x00, 0xef, 0xa8, 0xef,
+ 0x00, 0x24, 0xf0, 0xde, 0x00, 0x12, 0x00, 0xf0, 0xfe, 0x10, 0x74, 0x42,
+ 0x0c, 0xdc, 0xfd, 0x33,
+ 0x65, 0xed, 0xed, 0x11, 0x13, 0x00, 0x01, 0x12, 0x00, 0xdc, 0xed, 0x44,
+ 0x32, 0xc9, 0x00, 0x62,
+ 0x00, 0x0f, 0x00, 0x21, 0x00, 0xcc, 0xdd, 0x35, 0x44, 0xde, 0xbe, 0x01,
+ 0x01, 0x00, 0x47, 0x10,
+ 0xdf, 0xde, 0x11, 0x43, 0xf0, 0xac, 0x00, 0x44, 0x00, 0xee, 0x00, 0x17,
+ 0x00, 0xd0, 0x00, 0x10,
+ 0xf0, 0x00, 0xf0, 0xe0, 0x53, 0x11, 0xde, 0x10, 0x21, 0xa8, 0x00, 0x42,
+ 0x01, 0xf0, 0x00, 0x42,
+ 0x20, 0xcc, 0xdc, 0x0f, 0x00, 0x43, 0x01, 0xee, 0xba, 0x10, 0x65, 0xff,
+ 0xdd, 0x0f, 0x11, 0x43,
+ 0x0f, 0xcb, 0x00, 0x11, 0x00, 0x10, 0x44, 0x00, 0xcd, 0xed, 0x24, 0x55,
+ 0x00, 0xed, 0x00, 0x42,
+ 0x11, 0x00, 0x0e, 0x01, 0x01, 0xca, 0x00, 0x65, 0x00, 0xde, 0xf0, 0x23,
+ 0xf0, 0xdd, 0x00, 0x10,
+ 0x22, 0x20, 0x1f, 0x30, 0x2f, 0xd9, 0x1f, 0x70, 0x0f, 0xca, 0x31, 0x64,
+ 0xf0, 0xdd, 0x00, 0x12,
+ 0x01, 0x00, 0x00, 0xfe, 0xee, 0x22, 0x24, 0xff, 0xdf, 0xff, 0xde, 0x0f,
+ 0x64, 0x00, 0xee, 0xf1,
+ 0xbf, 0xdd, 0x00, 0x46, 0x00, 0xee, 0xdd, 0xa9, 0xf0, 0x46, 0x32, 0xdf,
+ 0x8b, 0xfe, 0x22, 0x12,
+ 0xee, 0x01, 0x02, 0x01, 0x01, 0x0f, 0xef, 0x12, 0xf0, 0x14, 0x67, 0xf0,
+ 0xef, 0x00, 0x42, 0x43,
+ 0xfd, 0xde, 0x13, 0x46, 0x00, 0xee, 0xfe, 0xbb, 0x43, 0x34, 0x00, 0x00,
+ 0x66, 0x05, 0xab, 0x05,
+ 0x3e, 0xe0, 0xc8, 0xf8, 0x5d, 0xf2, 0xb4, 0x0e, 0x54, 0x13, 0xfd, 0xff,
+ 0x10, 0xfe, 0xdc, 0x11,
+ 0x00, 0xcb, 0x43, 0x33, 0xee, 0xdd, 0x0f, 0x0e, 0x0f, 0x66, 0x00, 0xee,
+ 0x01, 0x00, 0xcc, 0x10,
+ 0x64, 0xdc, 0x00, 0x77, 0x00, 0xed, 0xff, 0x11, 0x22, 0x00, 0xff, 0xf0,
+ 0x11, 0x01, 0x00, 0x02,
+ 0x01, 0xcf, 0x00, 0xfe, 0x10, 0x77, 0x01, 0xdb, 0x20, 0x42, 0x10, 0xfe,
+ 0xfd, 0xfe, 0x00, 0x56,
+ 0x23, 0x00, 0xd0, 0x22, 0x32, 0x9a, 0xf0, 0x23, 0x02, 0x00, 0xf0, 0xee,
+ 0x10, 0x34, 0x0f, 0xbb,
+ 0x00, 0x34, 0xf0, 0x9d, 0x00, 0x34, 0x23, 0x00, 0xee, 0xef, 0x00, 0xe0,
+ 0xff, 0x67, 0x22, 0xdc,
+ 0xbd, 0x12, 0x23, 0xee, 0xdd, 0x12, 0x33, 0x01, 0x02, 0xe0, 0xcb, 0xef,
+ 0x45, 0x55, 0x00, 0xef,
+ 0x0f, 0x00, 0xff, 0x0f, 0x0f, 0x0e, 0x20, 0x20, 0xed, 0x43, 0x77, 0x0e,
+ 0xdb, 0x10, 0x41, 0x11,
+ 0xf0, 0x00, 0xff, 0xfe, 0x63, 0x11, 0xd9, 0xf0, 0x42, 0x0f, 0x9a, 0x00,
+ 0x31, 0x00, 0x0f, 0xff,
+ 0x11, 0x21, 0xdd, 0xba, 0xf0, 0x33, 0x53, 0xfe, 0xec, 0xff, 0x00, 0x23,
+ 0x0f, 0xec, 0x00, 0x21,
+ 0xee, 0xbb, 0x22, 0x01, 0xbe, 0xed, 0x15, 0x23, 0xd0, 0xbc, 0xf0, 0x14,
+ 0xf0, 0xbd, 0x00, 0x00,
+ 0x10, 0x23, 0x21, 0xea, 0xff, 0x30, 0x00, 0xff, 0x10, 0x43, 0xee, 0xef,
+ 0x34, 0x56, 0x43, 0xf0,
+ 0x8b, 0x00, 0x13, 0x11, 0x0f, 0x11, 0x12, 0xff, 0xdd, 0x00, 0x33, 0x22,
+ 0xec, 0xee, 0xdd, 0x11,
+ 0x77, 0x00, 0xcc, 0x22, 0x33, 0xcc, 0xcc, 0x00, 0x11, 0x10, 0x00, 0x21,
+ 0x00, 0xa9, 0x00, 0x21,
+ 0x00, 0x00, 0x65, 0x00, 0xee, 0x00, 0x01, 0x22, 0x00, 0x10, 0x33, 0x00,
+ 0xbc, 0xff, 0x45, 0x32,
+ 0x0f, 0x0f, 0x0e, 0x00, 0x21, 0x00, 0x67, 0x22, 0xff, 0xde, 0x00, 0x32,
+ 0xf0, 0xde, 0x55, 0x33,
+ 0xce, 0xdd, 0x11, 0x34, 0xdd, 0xdd, 0x22, 0x00, 0xbb, 0x00, 0x11, 0xdf,
+ 0x00, 0x43, 0x0f, 0x0f,
+ 0xdd, 0x13, 0x77, 0xff, 0xca, 0x11, 0x42, 0xff, 0x00, 0x44, 0xde, 0xcc,
+ 0x12, 0x12, 0xdd, 0xf0,
+ 0xf2, 0xd0, 0xd1, 0x9e, 0x02, 0x37, 0x01, 0x22, 0x10, 0xcb, 0xaa, 0x00,
+ 0x52, 0x21, 0xff, 0xda,
+ 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf0, 0x00, 0x31, 0x02,
+ 0x00, 0xf0, 0xdf, 0x32,
+ 0x75, 0x00, 0xdf, 0xab, 0x00, 0x12, 0x55, 0x11, 0xde, 0xdd, 0x01, 0x77,
+ 0x00, 0xff, 0x12, 0x00,
+ 0xf0, 0xff, 0x00, 0x00, 0x00, 0x10, 0x31, 0x77, 0x00, 0xcd, 0x00, 0x02,
+ 0x00, 0x33, 0x01, 0xff,
+ 0xef, 0x00, 0x45, 0x00, 0xef, 0x12, 0x11, 0xed, 0x0d, 0x20, 0xb9, 0x00,
+ 0x76, 0x21, 0xed, 0xcc,
+ 0xff, 0x32, 0x54, 0x00, 0xed, 0xcc, 0xfe, 0x12, 0x44, 0xed, 0x0f, 0x21,
+ 0xff, 0xdb, 0x00, 0x51,
+ 0xff, 0xfe, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0xdc, 0x00, 0x44, 0x01, 0xab,
+ 0xdc, 0x00, 0x43, 0x21,
+ 0x00, 0xdc, 0x00, 0xff, 0xdc, 0x11, 0x22, 0xc0, 0xce, 0xce, 0x03, 0x47,
+ 0xe0, 0xbf, 0xff, 0xf0,
+ 0x23, 0xff, 0xec, 0x21, 0x33, 0x10, 0x0e, 0x0d, 0x0d, 0x0f, 0x40, 0x0e,
+ 0x10, 0x77, 0x02, 0x01,
+ 0x23, 0x57, 0x11, 0xab, 0xde, 0x00, 0x34, 0x32, 0x11, 0xf0, 0xcd, 0xff,
+ 0xf0, 0xee, 0x23, 0x67,
+ 0x01, 0x00, 0xee, 0x00, 0xf0, 0x00, 0x02, 0xf0, 0xcd, 0xf0, 0x01, 0xce,
+ 0x45, 0x32, 0xca, 0xef,
+ 0x00, 0x21, 0x11, 0x32, 0x64, 0x00, 0xdc, 0xde, 0x32, 0x76, 0x00, 0xef,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x22, 0x33, 0xdc, 0xcd, 0x54, 0x44, 0x00, 0xfe, 0x11, 0x00, 0xfd, 0x00,
+ 0x02, 0x24, 0x67, 0x11,
+ 0xee, 0xcd, 0xff, 0x00, 0x0f, 0x35, 0x64, 0xee, 0xdb, 0x00, 0x10, 0x00,
+ 0x10, 0x73, 0x00, 0xec,
+ 0xed, 0x00, 0x00, 0xfe, 0x11, 0x45, 0x10, 0xfd, 0xcb, 0xee, 0x31, 0x53,
+ 0x23, 0x20, 0xcb, 0xdd,
+ 0x00, 0x11, 0x01, 0x03, 0x02, 0xe1, 0xf2, 0x46, 0xcf, 0x8b, 0x0f, 0x01,
+ 0x34, 0x00, 0xfe, 0x0f,
+ 0x53, 0x22, 0xfe, 0xfc, 0xff, 0x00, 0x22, 0x10, 0x13, 0x01, 0x01, 0x01,
+ 0xef, 0xf0, 0x37, 0x01,
+ 0xe0, 0x00, 0x8d, 0xfd, 0x04, 0x57, 0x01, 0x0f, 0xff, 0xff, 0x44, 0x45,
+ 0xe0, 0xce, 0x00, 0x21,
+ 0x00, 0xf0, 0x01, 0x21, 0xff, 0xcd, 0xfe, 0x12, 0x0f, 0x00, 0x75, 0x12,
+ 0x0f, 0xfe, 0xdd, 0x12,
+ 0x67, 0x03, 0xed, 0x00, 0x0f, 0xee, 0x24, 0x54, 0x00, 0x0e, 0xed, 0x01,
+ 0x33, 0xfc, 0x0e, 0x0e,
+ 0xfd, 0x22, 0x57, 0x21, 0x42, 0x01, 0xcd, 0xff, 0xe0, 0xbc, 0x00, 0x37,
+ 0x10, 0x00, 0xee, 0xab,
+ 0x00, 0x33, 0x21, 0xfe, 0xfe, 0xfd, 0x21, 0x32, 0xde, 0x88, 0xf0, 0x33,
+ 0x0f, 0xdc, 0x00, 0x32,
+ 0x53, 0x00, 0xb9, 0xee, 0x10, 0x63, 0x01, 0x00, 0x0f, 0xee, 0xde, 0x00,
+ 0x14, 0xf0, 0xdf, 0xe1,
+ 0xf1, 0xe0, 0xd0, 0xbb, 0xff, 0x0f, 0x11, 0x44, 0xfe, 0x0f, 0x10, 0xd9,
+ 0x0f, 0x71, 0x00, 0xfe,
+ 0xf0, 0x12, 0x22, 0xee, 0xde, 0x23, 0x11, 0xef, 0x02, 0xe2, 0x88, 0xe0,
+ 0x67, 0x01, 0xee, 0xff,
+ 0x21, 0x00, 0xfe, 0x12, 0x34, 0xe0, 0xfe, 0x00, 0x01, 0x64, 0x00, 0xdb,
+ 0xce, 0x00, 0x10, 0x0f,
+ 0x31, 0x10, 0x1f, 0x74, 0x0f, 0xc8, 0x00, 0x32, 0x10, 0xff, 0x00, 0x11,
+ 0x11, 0x10, 0x01, 0x01,
+ 0x11, 0x00, 0xde, 0xed, 0x30, 0x30, 0x31, 0x42, 0xdb, 0x0d, 0x3f, 0x40,
+ 0x77, 0x77, 0x0f, 0xbc,
+ 0xff, 0x33, 0x11, 0xf0, 0xef, 0xef, 0xef, 0x11, 0x10, 0xee, 0x0e, 0xbb,
+ 0xe0, 0x01, 0x00, 0x32,
+ 0x0f, 0x88, 0xed, 0x00, 0x23, 0x01, 0x00, 0x00, 0x0f, 0x0f, 0xeb, 0xde,
+ 0x61, 0x00, 0x0e, 0x67,
+ 0x00, 0xec, 0xce, 0x00, 0x24, 0x00, 0xf0, 0x02, 0xc0, 0xd0, 0xf0, 0x02,
+ 0x02, 0x00, 0xf0, 0xcd,
+ 0xdc, 0x77, 0x22, 0xdb, 0x00, 0x41, 0x31, 0x00, 0x0f, 0x0f, 0x31, 0x64,
+ 0x0f, 0xdb, 0xf0, 0x42,
+ 0x66, 0x00, 0xee, 0x00, 0x00, 0xee, 0x0f, 0x44, 0x10, 0x00, 0x22, 0xef,
+ 0xfe, 0x33, 0x12, 0xdf,
+ 0xee, 0xee, 0x11, 0x56, 0x11, 0xde, 0xde, 0xfe, 0xe0, 0x33, 0x00, 0x9b,
+ 0x00, 0x22, 0x00, 0xe0,
+ 0x00, 0xbf, 0xee, 0x16, 0x64, 0x01, 0xee, 0xcc, 0x00, 0x02, 0x12, 0x25,
+ 0x11, 0xef, 0x0f, 0x1f,
+ 0xfd, 0x00, 0x46, 0x52, 0x10, 0xff, 0x0e, 0x22, 0x11, 0x8a, 0xf0, 0x24,
+ 0x22, 0x00, 0xdf, 0xcd,
+ 0x0f, 0x45, 0x00, 0xfe, 0x22, 0x32, 0x00, 0x0f, 0x0e, 0xb9, 0xee, 0x41,
+ 0x11, 0xff, 0x00, 0xdf,
+ 0xff, 0x31, 0x20, 0x88, 0x1f, 0x42, 0xfe, 0xec, 0x0f, 0x0f, 0x21, 0x00,
+ 0x0f, 0x00, 0xc0, 0xad,
+ 0xee, 0x03, 0x17, 0x02, 0xf0, 0xcf, 0xdd, 0x01, 0x12, 0x46, 0x21, 0xcd,
+ 0xcb, 0x00, 0x20, 0x00,
+ 0x41, 0x10, 0x00, 0x64, 0x01, 0xfd, 0x00, 0x14, 0x22, 0x21, 0x00, 0xdd,
+ 0xcb, 0x11, 0x77, 0x11,
+ 0x00, 0xff, 0xff, 0x00, 0x22, 0x24, 0x11, 0xdf, 0xdd, 0x11, 0x55, 0x44,
+ 0x00, 0xbc, 0xde, 0x00,
+ 0x00, 0x21, 0x77, 0x00, 0xee, 0x00, 0x11, 0x01, 0xdd, 0x0f, 0x54, 0x22,
+ 0x00, 0xed, 0xff, 0xf0,
+ 0x00, 0x35, 0x10, 0xde, 0xef, 0x00, 0x00, 0x11, 0x44, 0x11, 0xf0, 0x0e,
+ 0x99, 0xee, 0x44, 0x22,
+ 0xef, 0x21, 0x32, 0xac, 0xdd, 0x12, 0x23, 0xff, 0x22, 0x23, 0x0f, 0xcd,
+ 0xca, 0xed, 0x44, 0x66,
+ 0x00, 0xfe, 0xff, 0xfe, 0x11, 0x12, 0x00, 0x01, 0x0f, 0xaa, 0x00, 0x30,
+ 0x21, 0x00, 0xec, 0x0f,
+ 0x20, 0x0e, 0xcb, 0x00, 0x51, 0xfe, 0xce, 0x25, 0x22, 0xac, 0xf0, 0x02,
+ 0x13, 0x00, 0xe0, 0xcc,
+ 0xed, 0x46, 0x21, 0xce, 0xed, 0x11, 0x44, 0xfe, 0xee, 0x0f, 0x1f, 0x41,
+ 0x33, 0x01, 0x00, 0x22,
+ 0x12, 0xb9, 0xdd, 0x33, 0x65, 0x0f, 0x00, 0x01, 0xde, 0xff, 0x01, 0x00,
+ 0x11, 0x57, 0x00, 0xe0,
+ 0xff, 0xef, 0xbe, 0x02, 0x57, 0x00, 0xff, 0x00, 0xf0, 0xdf, 0x11, 0xef,
+ 0xee, 0x76, 0x11, 0x00,
+ 0xf0, 0x00, 0x0f, 0x01, 0x12, 0x13, 0x34, 0x00, 0x0f, 0xac, 0x00, 0x35,
+ 0x00, 0x10, 0xee, 0x0f,
+ 0x63, 0x0e, 0x0d, 0x00, 0x0d, 0x53, 0x47, 0x00, 0xfd, 0x0f, 0xff, 0x10,
+ 0x23, 0x00, 0x0f, 0xed,
+ 0xee, 0xcc, 0x12, 0x46, 0x10, 0x00, 0xeb, 0xbc, 0xee, 0x20, 0x75, 0x10,
+ 0xee, 0x0f, 0x01, 0x00,
+ 0x22, 0x22, 0xcd, 0xee, 0x67, 0x10, 0xdc, 0x0f, 0x52, 0x11, 0x10, 0x10,
+ 0x0f, 0xec, 0xdd, 0x00,
+ 0x67, 0x01, 0xbe, 0xf0, 0x14, 0x01, 0xde, 0xf1, 0x03, 0xe0, 0x00, 0x02,
+ 0xee, 0x14, 0x45, 0xac,
+ 0xff, 0x21, 0x10, 0x00, 0x0f, 0x11, 0x12, 0x00, 0x00, 0x21, 0x55, 0x11,
+ 0xdc, 0x00, 0x67, 0xf0,
+ 0xbc, 0x00, 0x10, 0x10, 0x11, 0x00, 0x00, 0x00, 0x01, 0x02, 0x32, 0xdd,
+ 0xca, 0x00, 0x32, 0x32,
+ 0xf0, 0xd0, 0xae, 0xa8, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xef, 0x22, 0x21,
+ 0xab, 0xee, 0x23, 0x44,
+ 0x00, 0xf0, 0xef, 0xdd, 0x00, 0x56, 0x01, 0xdd, 0x00, 0x31, 0xf0, 0xf0,
+ 0x53, 0x21, 0x10, 0x00,
+ 0x0f, 0x22, 0x35, 0x00, 0xed, 0x43, 0x24, 0xce, 0xd0, 0x17, 0x00, 0xbe,
+ 0x10, 0x63, 0xff, 0xda,
+ 0x00, 0x00, 0xdc, 0x0f, 0x32, 0xe0, 0x8c, 0x00, 0x00, 0xc8, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x20,
+ 0x1e, 0xec, 0xed, 0x10, 0x72, 0x30, 0xed, 0xba, 0xee, 0xff, 0x00, 0x23,
+ 0x24, 0xf1, 0x9e, 0xee,
+ 0xf0, 0xff, 0xef, 0x14, 0x03, 0x00, 0xee, 0xa8, 0xfd, 0x11, 0x21, 0x00,
+ 0x10, 0x00, 0x0e, 0x1f,
+ 0x52, 0x11, 0xdb, 0xee, 0x10, 0x20, 0x00, 0x00, 0xec, 0xfd, 0x76, 0x10,
+ 0xff, 0x00, 0x00, 0xde,
+ 0x33, 0x77, 0x11, 0xef, 0xbc, 0x00, 0x11, 0x00, 0x12, 0xf0, 0xdf, 0x00,
+ 0x31, 0x22, 0xb9, 0x00,
+ 0x21, 0x01, 0xf0, 0x00, 0xff, 0xd0, 0xe0, 0x00, 0x35, 0x22, 0x01, 0x11,
+ 0xd0, 0x80, 0xad, 0x04,
+ 0x12, 0x10, 0x47, 0x13, 0xf0, 0xdc, 0xdd, 0xfd, 0x76, 0x53, 0xfe, 0xff,
+ 0x0f, 0x0f, 0x01, 0x02,
+ 0x0f, 0xf0, 0x37, 0x10, 0xcf, 0xdd, 0xff, 0x30, 0x33, 0x10, 0x10, 0x31,
+ 0xdc, 0xdd, 0x32, 0x32,
+ 0xf0, 0xd1, 0x46, 0x21, 0xd0, 0xad, 0x10, 0x77, 0x1f, 0xec, 0x20, 0x72,
+ 0x10, 0x0d, 0x00, 0x1f,
+ 0x0d, 0x24, 0x34, 0x0f, 0xdd, 0xdd, 0x46, 0x55, 0xd0, 0x9d, 0x00, 0x13,
+ 0x13, 0x00, 0xe0, 0xdb,
+ 0x00, 0x44, 0x00, 0x0f, 0x20, 0xee, 0x32, 0x65, 0xee, 0x0f, 0x43, 0x00,
+ 0xfd, 0x12, 0x14, 0x00,
+ 0x00, 0x0f, 0x44, 0x44, 0xfe, 0xdd, 0x00, 0x34, 0x45, 0x10, 0xdf, 0xbd,
+ 0x22, 0x45, 0xf0, 0xff,
+ 0xe0, 0xf0, 0x21, 0x00, 0xe1, 0x03, 0xcf, 0xba, 0xff, 0x23, 0x23, 0xef,
+ 0x01, 0x20, 0xed, 0xcd,
+ 0x36, 0x77, 0x20, 0xd0, 0xe0, 0x31, 0x11, 0xef, 0x00, 0x21, 0x12, 0x75,
+ 0x22, 0x0f, 0x0f, 0x30,
+ 0x21, 0xfe, 0xdc, 0x10, 0x74, 0x44, 0x00, 0xca, 0xef, 0x32, 0x00, 0xff,
+ 0x12, 0x11, 0xf0, 0x0f,
+ 0xdc, 0xcd, 0x51, 0x24, 0xee, 0xba, 0x00, 0x00, 0xce, 0xde, 0x11, 0x13,
+ 0xe0, 0x01, 0x22, 0x88,
+ 0xee, 0x10, 0x42, 0x11, 0x0f, 0xed, 0x0f, 0x1f, 0x20, 0x20, 0x0e, 0x0f,
+ 0x22, 0x03, 0x02, 0xf3,
+ 0xd0, 0x37, 0x54, 0xbf, 0xbd, 0x00, 0xf0, 0xff, 0x27, 0x21, 0xe0, 0xdd,
+ 0xdc, 0xff, 0x0f, 0x20,
+ 0x73, 0x24, 0x0f, 0xfd, 0xff, 0x0f, 0x0d, 0x20, 0x0d, 0xb8, 0x32, 0x31,
+ 0xab, 0x00, 0x32, 0x21,
+ 0xde, 0xee, 0x0f, 0x41, 0x34, 0xef, 0xcd, 0xf0, 0x14, 0x22, 0xdf, 0xff,
+ 0xe0, 0x8a, 0xee, 0x13,
+ 0x02, 0xee, 0x0f, 0xf0, 0xed, 0x00, 0x35, 0x55, 0x01, 0xce, 0xee, 0x01,
+ 0xde, 0xf0, 0x44, 0x01,
+ 0x02, 0x02, 0xdf, 0x22, 0x53, 0xa8, 0xfc, 0x65, 0x22, 0x0f, 0xff, 0x20,
+ 0x10, 0xfe, 0xff, 0x33,
+ 0x21, 0x0f, 0xf0, 0x23, 0x0f, 0xcb, 0x22, 0x11, 0xdd, 0xdb, 0x71, 0x44,
+ 0x0f, 0xec, 0xed, 0xfe,
+ 0x01, 0x12, 0x03, 0x00, 0x9c, 0x0f, 0x26, 0x01, 0xac, 0xfe, 0x00, 0x10,
+ 0x43, 0x10, 0x0d, 0xfd,
+ 0x10, 0x0b, 0xbb, 0x0f, 0x11, 0x10, 0x22, 0x11, 0xce, 0xce, 0xf0, 0xdf,
+ 0x02, 0x06, 0xd0, 0xbe,
+ 0xe0, 0xce, 0xef, 0x03, 0x0e, 0x0e, 0x67, 0x03, 0xba, 0xfe, 0x02, 0x35,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x11, 0x32, 0xf0, 0xde, 0x22, 0x11, 0xdf, 0x10, 0x77, 0x63, 0xfd, 0xee,
+ 0x24, 0x01, 0xdc, 0x00,
+ 0x75, 0x00, 0x0f, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x0d,
+ 0xfe, 0xec, 0xcc, 0x10,
+ 0x74, 0x10, 0xfe, 0xfd, 0x0e, 0xf9, 0xcd, 0x22, 0x46, 0xf0, 0xcd, 0x10,
+ 0x43, 0xef, 0xdc, 0x01,
+ 0x53, 0x0f, 0xfd, 0x22, 0x22, 0xfc, 0x00, 0x66, 0x00, 0x0f, 0x00, 0x11,
+ 0xff, 0xff, 0xf0, 0x01,
+ 0x23, 0x20, 0x10, 0x32, 0xcb, 0x89, 0x00, 0x34, 0x01, 0xdd, 0xe0, 0x01,
+ 0x02, 0xf0, 0xef, 0xe0,
+ 0x00, 0x13, 0x33, 0xce, 0x98, 0x10, 0x62, 0x11, 0x00, 0xea, 0x0f, 0x20,
+ 0x52, 0x00, 0xed, 0xfe,
+ 0x12, 0x46, 0x00, 0x01, 0xf0, 0xdf, 0xf0, 0xd0, 0xde, 0x01, 0x00, 0xf0,
+ 0xf1, 0x9c, 0xfe, 0x0f,
+ 0x0e, 0x37, 0x22, 0x9b, 0xee, 0x00, 0x21, 0x11, 0x10, 0x00, 0xde, 0xbc,
+ 0x10, 0x01, 0xed, 0x12,
+ 0x02, 0xfe, 0x33, 0x01, 0xf1, 0x14, 0x55, 0x43, 0x11, 0xee, 0xcd, 0x16,
+ 0x22, 0x22, 0x66, 0x01,
+ 0xff, 0xff, 0x11, 0x00, 0xdd, 0x12, 0x77, 0x11, 0xef, 0x0f, 0x43, 0x12,
+ 0xf0, 0x00, 0xe0, 0xf1,
+ 0xd0, 0x8b, 0x02, 0x26, 0x00, 0x00, 0x01, 0xe0, 0xcd, 0x00, 0x54, 0x10,
+ 0xfe, 0xfe, 0x22, 0x66,
+ 0x00, 0x0f, 0x10, 0x0f, 0xf0, 0x01, 0x01, 0x10, 0x31, 0x00, 0xc9, 0x0f,
+ 0x43, 0x11, 0xfe, 0x20,
+ 0x0e, 0x0e, 0x54, 0xdd, 0x88, 0x00, 0x47, 0x00, 0x00, 0xef, 0xde, 0x00,
+ 0x42, 0x0f, 0xee, 0xfe,
+ 0xff, 0x31, 0x52, 0x0f, 0xfa, 0xed, 0x0f, 0x20, 0x31, 0x10, 0xef, 0xdf,
+ 0xdf, 0xe1, 0x33, 0x02,
+ 0xad, 0xca, 0xef, 0xe0, 0xf0, 0xf1, 0xf0, 0xdc, 0x31, 0x77, 0x00, 0xcd,
+ 0x00, 0x10, 0xcc, 0x00,
+ 0x77, 0x11, 0xff, 0x0f, 0x01, 0x10, 0x0f, 0x01, 0x00, 0xef, 0x11, 0x41,
+ 0x01, 0x00, 0x10, 0x00,
+ 0xef, 0x23, 0x77, 0x24, 0xdd, 0xee, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xdb,
+ 0xef, 0x21, 0x8e, 0xca,
+ 0x00, 0x54, 0x11, 0xec, 0xee, 0x22, 0x23, 0xff, 0x00, 0x01, 0xdf, 0xde,
+ 0x01, 0x03, 0x24, 0x36,
+ 0x10, 0x00, 0x31, 0x41, 0xf0, 0xee, 0x74, 0x74, 0x00, 0x10, 0x02, 0x0f,
+ 0x00, 0x05, 0x23, 0xff,
+ 0xee, 0x00, 0x67, 0x31, 0xfd, 0x0f, 0x22, 0x20, 0xfe, 0xb9, 0x31, 0x52,
+ 0xff, 0xee, 0xf0, 0x00,
+ 0xf0, 0x00, 0x01, 0x21, 0x10, 0xef, 0xff, 0x34, 0x75, 0x0e, 0x0c, 0x0d,
+ 0x50, 0x33, 0x10, 0x0c,
+ 0x0d, 0x43, 0x36, 0x01, 0x00, 0xc0, 0x00, 0x57, 0x00, 0xc0, 0xf0, 0x01,
+ 0xbf, 0xef, 0x01, 0x01,
+ 0x00, 0x11, 0xff, 0xdc, 0x02, 0x14, 0x23, 0x32, 0xcc, 0xac, 0x00, 0x47,
+ 0x11, 0x00, 0xef, 0x01,
+ 0x23, 0x00, 0xfd, 0xed, 0x12, 0x77, 0x32, 0x00, 0x00, 0x31, 0x00, 0xce,
+ 0x02, 0x13, 0x33, 0x00,
+ 0xed, 0xef, 0xf0, 0xce, 0xcb, 0x45, 0x53, 0xfe, 0xf0, 0x0f, 0x00, 0x00,
+ 0x59, 0x01, 0x36, 0x01,
+ 0xbc, 0x28, 0xe4, 0x39, 0x3c, 0x33, 0x8c, 0x46, 0x43, 0x57, 0x00, 0xf0,
+ 0x0e, 0xee, 0xcf, 0xf3,
+ 0xf5, 0xc0, 0x9c, 0xf0, 0x15, 0x00, 0xed, 0x01, 0x10, 0x0f, 0x1e, 0x30,
+ 0x00, 0xc9, 0x0f, 0x72,
+ 0x11, 0x00, 0x11, 0x12, 0x00, 0xed, 0x10, 0x30, 0xd9, 0x00, 0x53, 0x1f,
+ 0x1e, 0x42, 0x0e, 0xdc,
+ 0xce, 0x00, 0x54, 0x0e, 0xec, 0xdd, 0xba, 0x12, 0x56, 0xff, 0xdf, 0x00,
+ 0x00, 0xfd, 0x0f, 0x10,
+ 0xfd, 0xfc, 0x2f, 0x60, 0x10, 0x0e, 0xfc, 0x10, 0x00, 0xfe, 0xef, 0xdf,
+ 0xbf, 0x03, 0x07, 0xe0,
+ 0xbe, 0xfe, 0xed, 0xcd, 0xd0, 0xe3, 0xff, 0xfe, 0xfc, 0xfd, 0x23, 0x01,
+ 0x9c, 0xff, 0xe0, 0xf0,
+ 0x0d, 0xdc, 0xab, 0xf0, 0x04, 0xff, 0xf2, 0x26, 0xdd, 0x99, 0x00, 0x11,
+ 0x11, 0xf0, 0x0f, 0x30,
+ 0x0f, 0xbc, 0x33, 0x65, 0xfe, 0xdc, 0x00, 0x12, 0xf0, 0xfe, 0x0f, 0x0f,
+ 0x32, 0x22, 0xbb, 0xfd,
+ 0x20, 0x20, 0x0f, 0x1e, 0x0f, 0x0d, 0x20, 0x2f, 0xee, 0x14, 0x15, 0xc1,
+ 0x04, 0xe0, 0x9f, 0x63,
+ 0x37, 0xfe, 0xef, 0x55, 0x11, 0xff, 0x00, 0x10, 0x0f, 0x44, 0x23, 0xdd,
+ 0xef, 0x14, 0x11, 0x21,
+ 0x10, 0x00, 0x31, 0x00, 0x0f, 0x31, 0xcd, 0xcd, 0xf0, 0xf0, 0xf0, 0xcc,
+ 0xad, 0xb8, 0xf0, 0x05,
+ 0xf1, 0xb0, 0x02, 0x01, 0xee, 0xcc, 0xec, 0xfe, 0x10, 0x52, 0x34, 0x0e,
+ 0xea, 0x0f, 0x40, 0x20,
+ 0x00, 0x43, 0x33, 0x01, 0x01, 0xe0, 0xfe, 0x25, 0xf1, 0x9e, 0x03, 0x26,
+ 0xf0, 0x0f, 0xe0, 0xbe,
+ 0x00, 0x05, 0x00, 0xce, 0x10, 0x53, 0x0f, 0x0d, 0xfd, 0xed, 0x27, 0x62,
+ 0x10, 0x0d, 0x0e, 0x1e,
+ 0x20, 0x2e, 0x0c, 0x53, 0x36, 0x0f, 0x0f, 0x43, 0x31, 0x0e, 0x20, 0x11,
+ 0x13, 0x35, 0x11, 0xbd,
+ 0x00, 0x56, 0xff, 0xed, 0x01, 0x45, 0x11, 0xfe, 0xde, 0x10, 0x31, 0x00,
+ 0x0e, 0x40, 0x12, 0xbe,
+ 0xcc, 0xf0, 0xe3, 0x07, 0x14, 0xcf, 0xc0, 0x46, 0x12, 0xbf, 0xde, 0x22,
+ 0x43, 0x02, 0x12, 0x01,
+ 0xe0, 0x14, 0x24, 0xf0, 0x13, 0x45, 0xe0, 0x01, 0x75, 0x21, 0x10, 0x10,
+ 0x10, 0x33, 0x00, 0xed,
+ 0x30, 0x73, 0x1c, 0xda, 0x22, 0x23, 0xde, 0xcd, 0x02, 0x23, 0x00, 0xcd,
+ 0xf0, 0x00, 0x9b, 0xfe,
+ 0x1f, 0x2b, 0x0d, 0x0f, 0xfb, 0x0e, 0x70, 0x00, 0x0b, 0x00, 0x2f, 0x0f,
+ 0x31, 0x32, 0xad, 0xec,
+ 0xf0, 0x01, 0x15, 0x01, 0xdf, 0xcf, 0xff, 0xce, 0xf0, 0x27, 0x32, 0xf0,
+ 0x00, 0x10, 0x01, 0x00,
+ 0xe1, 0xc0, 0x77, 0x74, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x23, 0x01, 0xfe,
+ 0xf0, 0xfd, 0x00, 0x46,
+ 0x00, 0xef, 0x01, 0x01, 0x00, 0xef, 0x10, 0xed, 0xde, 0x46, 0x42, 0x22,
+ 0xad, 0xb8, 0x00, 0x53,
+ 0x00, 0xdc, 0x0f, 0x00, 0x00, 0x0e, 0xfe, 0xf0, 0x00, 0x02, 0xf1, 0xbe,
+ 0xf0, 0x04, 0xdb, 0xd0,
+ 0x56, 0xf0, 0xe0, 0x30, 0x0f, 0xbb, 0x10, 0x63, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x0f, 0xfc,
+ 0x22, 0x35, 0xf0, 0xf0, 0x10, 0x22, 0x0e, 0xe9, 0x70, 0x43, 0xef, 0xee,
+ 0x00, 0x1e, 0x30, 0x30,
+ 0x00, 0xce, 0x9b, 0x02, 0x12, 0x0e, 0x00, 0xfe, 0xdb, 0x00, 0x0e, 0x0a,
+ 0xfe, 0x0d, 0x1e, 0x0f,
+ 0x2f, 0x0e, 0x0e, 0x70, 0x40, 0x1f, 0xfd, 0xcb, 0xf1, 0xe0, 0xd0, 0x16,
+ 0xf1, 0x9e, 0xdd, 0xf0,
+ 0x01, 0xdd, 0x98, 0x00, 0x13, 0x00, 0xcd, 0x00, 0x01, 0xdc, 0x00, 0x27,
+ 0xcf, 0xde, 0x11, 0x00,
+ 0xe0, 0xef, 0xce, 0xd0, 0x42, 0x23, 0x10, 0x20, 0x10, 0xdc, 0xf0, 0x77,
+ 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x33, 0xe0, 0xd1, 0xf3, 0x16, 0x11, 0x8f, 0xf0, 0x21, 0x30, 0x0f,
+ 0x1e, 0x41, 0x42, 0xea,
+ 0xee, 0x20, 0x33, 0x12, 0xcf, 0x9c, 0xf0, 0x02, 0xf3, 0x14, 0x0f, 0x1e,
+ 0x72, 0x0d, 0xf8, 0x10,
+ 0x52, 0x0f, 0x0d, 0x23, 0x10, 0x00, 0x12, 0x20, 0x45, 0x45, 0x11, 0x00,
+ 0x00, 0x20, 0x11, 0x10,
+ 0x30, 0x63, 0x22, 0x0a, 0xfe, 0x10, 0xfc, 0xbb, 0x22, 0x43, 0xfe, 0xef,
+ 0x11, 0xcf, 0xaa, 0xf0,
+ 0x01, 0x00, 0xdb, 0xfe, 0x10, 0x0f, 0xec, 0xff, 0x10, 0x2f, 0x2f, 0x41,
+ 0x11, 0xef, 0xee, 0x32,
+ 0x56, 0x02, 0xb0, 0xe1, 0x07, 0x12, 0xd0, 0xb0, 0xd0, 0xe1, 0x03, 0xf2,
+ 0x80, 0xf3, 0x04, 0xf0,
+ 0x01, 0x00, 0xcc, 0x02, 0x12, 0x0e, 0x1f, 0xe8, 0xde, 0x43, 0x00, 0xc9,
+ 0x0f, 0x40, 0x21, 0xdf,
+ 0xee, 0x00, 0x31, 0x11, 0xff, 0xbb, 0x41, 0x43, 0xce, 0xfe, 0x13, 0x0f,
+ 0xbb, 0x00, 0x12, 0xf0,
+ 0x01, 0x01, 0x0e, 0x0e, 0x02, 0xec, 0x2e, 0x72, 0x1a, 0x0f, 0x12, 0x00,
+ 0xbe, 0xf1, 0x06, 0xf0,
+ 0xe0, 0x0f, 0x52, 0x02, 0x00, 0x00, 0x23, 0x34, 0x00, 0x21, 0x33, 0xfc,
+ 0x0d, 0x77, 0x64, 0x00,
+ 0x02, 0x00, 0x00, 0x23, 0x24, 0x20, 0x21, 0x00, 0x00, 0x22, 0x51, 0x1d,
+ 0x0c, 0x1f, 0x12, 0x13,
+ 0x00, 0x0c, 0xdf, 0x07, 0xf2, 0x8f, 0xff, 0x04, 0xe1, 0xbe, 0xfd, 0xed,
+ 0xfc, 0x0f, 0x20, 0xf9,
+ 0x0e, 0x70, 0x0e, 0x0f, 0x0f, 0xc8, 0x00, 0x30, 0x10, 0xf0, 0x00, 0x01,
+ 0xdf, 0xcd, 0x11, 0x02,
+ 0xad, 0xed, 0xfd, 0xf0, 0x05, 0xdf, 0xaa, 0x00, 0x31, 0x33, 0x02, 0x00,
+ 0x00, 0xed, 0x13, 0x22,
+ 0xda, 0xee, 0x40, 0x70, 0x0e, 0x0e, 0x11, 0x00, 0xfc, 0x31, 0x74, 0x10,
+ 0x10, 0x12, 0x02, 0x36,
+ 0x32, 0xf1, 0x05, 0x13, 0xf1, 0xe1, 0x03, 0x56, 0x01, 0x01, 0x53, 0x22,
+ 0xe0, 0x00, 0x73, 0x1f,
+ 0xea, 0x34, 0x33, 0xdf, 0xdd, 0xe0, 0xf1, 0xd2, 0xf3, 0x05, 0x01, 0x90,
+ 0xee, 0x01, 0x00, 0xef,
+ 0xef, 0xee, 0x30, 0x0e, 0xed, 0xcc, 0x89, 0x00, 0x37, 0x00, 0xb0, 0x00,
+ 0xff, 0xef, 0x25, 0x23,
+ 0xd0, 0xce, 0x10, 0x30, 0x0c, 0x1e, 0x40, 0x30, 0x0e, 0xfe, 0x75, 0x42,
+ 0x0f, 0x00, 0x01, 0xef,
+ 0xcd, 0xf0, 0x27, 0x00, 0xcd, 0xf0, 0x11, 0xed, 0xd9, 0x60, 0x0e, 0xec,
+ 0x50, 0x30, 0x1c, 0x0e,
+ 0x2f, 0x20, 0x10, 0x1c, 0x1d, 0x1e, 0x0f, 0x00, 0xd0, 0xce, 0xee, 0x00,
+ 0x00, 0x9a, 0x00, 0x35,
+ 0xcf, 0xbf, 0x22, 0x13, 0xe0, 0xf1, 0x16, 0x00, 0x00, 0x20, 0x33, 0xf0,
+ 0xcf, 0x01, 0x75, 0x00,
+ 0xfd, 0x65, 0x22, 0xf0, 0x22, 0x13, 0xfd, 0x23, 0x55, 0x01, 0x13, 0x01,
+ 0x03, 0x17, 0x02, 0xe1,
+ 0x02, 0x02, 0xf2, 0xf0, 0x11, 0x01, 0x21, 0x77, 0x11, 0xd0, 0x00, 0x41,
+ 0x22, 0x01, 0xa0, 0xd0,
+ 0x03, 0x00, 0x01, 0x46, 0xf0, 0xef, 0x02, 0x43, 0x0f, 0x0c, 0x1e, 0x3f,
+ 0x20, 0x0e, 0xfe, 0x0f,
+ 0xed, 0x88, 0x0f, 0x42, 0x12, 0x0e, 0xee, 0xee, 0xee, 0x52, 0x53, 0x08,
+ 0xff, 0x0e, 0x0c, 0x2d,
+ 0x40, 0x10, 0xdb, 0xff, 0x00, 0x01, 0xe0, 0xe0, 0xe1, 0xd3, 0x80, 0xd0,
+ 0xe0, 0xde, 0xb8, 0x0f,
+ 0x11, 0x01, 0xff, 0x10, 0x3d, 0x4c, 0x2c, 0x1f, 0x0f, 0x0f, 0x50, 0x32,
+ 0x23, 0x22, 0xfa, 0xbc,
+ 0xf0, 0xd1, 0xe2, 0xe2, 0xd0, 0x8b, 0xdd, 0xf0, 0x02, 0xe2, 0xf2, 0xa9,
+ 0xee, 0x01, 0x03, 0x0f,
+ 0xed, 0x00, 0x01, 0xff, 0xcc, 0xff, 0xdd, 0x01, 0x47, 0xc0, 0xce, 0xff,
+ 0x0f, 0xfe, 0x0f, 0x33,
+ 0x35, 0x00, 0xdf, 0x9c, 0x00, 0x13, 0xf0, 0xbc, 0x03, 0x04, 0xfd, 0xfb,
+ 0x30, 0x1e, 0x0e, 0x0f,
+ 0x1f, 0x0d, 0x2c, 0xeb, 0x9d, 0xfe, 0xf0, 0xfe, 0xcd, 0x0f, 0x00, 0x88,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x42, 0x0e, 0xe8, 0xff, 0x10, 0x2f, 0x0f, 0x30, 0x40, 0xec, 0xcd, 0x21,
+ 0x54, 0x00, 0x00, 0x21,
+ 0x12, 0xf0, 0x00, 0x00, 0x1f, 0x5f, 0x61, 0x1f, 0xfc, 0xfe, 0x03, 0x2e,
+ 0x08, 0x52, 0x25, 0xef,
+ 0xcf, 0x00, 0x12, 0x00, 0xcd, 0xf0, 0xf0, 0xd0, 0xe0, 0xce, 0xc8, 0x00,
+ 0x00, 0xdf, 0xff, 0xfe,
+ 0xb9, 0x1f, 0x50, 0x0f, 0xf0, 0x00, 0xdf, 0x00, 0x20, 0xff, 0xbc, 0xe0,
+ 0xc0, 0xdf, 0xe1, 0x06,
+ 0xd0, 0xd1, 0x04, 0xd2, 0x80, 0x01, 0x03, 0x25, 0x02, 0x01, 0xe1, 0xd1,
+ 0x03, 0x35, 0x01, 0xc0,
+ 0x02, 0x02, 0x12, 0x33, 0x32, 0x63, 0x35, 0x21, 0x00, 0x72, 0x33, 0x43,
+ 0x27, 0x12, 0x00, 0x11,
+ 0x35, 0x21, 0x40, 0x74, 0x23, 0x00, 0x0d, 0x11, 0x22, 0x0e, 0x2f, 0x20,
+ 0x00, 0x0e, 0x1e, 0x31,
+ 0x21, 0x00, 0x27, 0x21, 0x10, 0x61, 0x52, 0x11, 0x03, 0x17, 0x12, 0x2e,
+ 0xfa, 0x0f, 0x40, 0x20,
+ 0x70, 0x21, 0x00, 0x11, 0x23, 0x13, 0x01, 0x27, 0x65, 0x00, 0xd0, 0x00,
+ 0x43, 0x00, 0x11, 0x45,
+ 0x20, 0x1e, 0x51, 0x34, 0x00, 0x00, 0x02, 0x01, 0x14, 0x15, 0xc1, 0x91,
+ 0xf3, 0xf5, 0xd0, 0xe0,
+ 0xf1, 0xc0, 0xd0, 0xe2, 0x03, 0x1f, 0xfc, 0x2d, 0x7f, 0x2c, 0x0d, 0x11,
+ 0x21, 0x20, 0x65, 0x10,
+ 0xfa, 0x00, 0x10, 0x00, 0xde, 0xef, 0xe0, 0xfe, 0xee, 0xce, 0xcd, 0xce,
+ 0xf1, 0xf0, 0xe0, 0x00,
+ 0xda, 0xb9, 0xff, 0x0f, 0xef, 0xef, 0x20, 0x00, 0x9b, 0xee, 0x0f, 0x0c,
+ 0xfd, 0xfe, 0xfe, 0x0c,
+ 0x60, 0x40, 0x0e, 0x0b, 0x0f, 0x10, 0x11, 0x33, 0x31, 0x30, 0x30, 0x44,
+ 0x14, 0x43, 0x53, 0x11,
+ 0x31, 0x66, 0x22, 0x0f, 0xfd, 0x1f, 0x30, 0x35, 0x01, 0x9c, 0xee, 0xf0,
+ 0xde, 0xf0, 0x37, 0xf3,
+ 0x9e, 0xef, 0x00, 0xf0, 0x00, 0x10, 0xfc, 0xdc, 0xee, 0x11, 0x0e, 0xea,
+ 0x10, 0x14, 0xc0, 0xc1,
+ 0x03, 0x23, 0xf0, 0xe0, 0x02, 0x04, 0xb0, 0x00, 0x40, 0x20, 0x31, 0x0e,
+ 0xe8, 0x0f, 0x00, 0x00,
+ 0x12, 0x42, 0x01, 0xe1, 0xd0, 0xe1, 0x02, 0xb6, 0x81, 0xe0, 0x02, 0xf0,
+ 0x0e, 0x1c, 0xf9, 0xee,
+ 0x40, 0x41, 0x1e, 0x4d, 0x4c, 0x1e, 0x2f, 0x0e, 0x0f, 0x00, 0x2e, 0x2d,
+ 0xfb, 0xdd, 0xcf, 0xaf,
+ 0xf0, 0x14, 0xde, 0xd1, 0x57, 0x01, 0xd0, 0x01, 0x54, 0x22, 0xef, 0x00,
+ 0x12, 0x02, 0x02, 0xe2,
+ 0xe0, 0xa0, 0xe1, 0xc4, 0xe4, 0x01, 0x0f, 0xe8, 0x10, 0x40, 0xe0, 0x00,
+ 0x40, 0x1c, 0x3f, 0x41,
+ 0xe0, 0xbf, 0x01, 0x03, 0x03, 0x05, 0x01, 0x0f, 0x10, 0xf0, 0xa1, 0xde,
+ 0x01, 0x13, 0xcc, 0x9b,
+ 0xe0, 0xe0, 0xef, 0xdd, 0x05, 0x04, 0xd1, 0xc0, 0xef, 0x34, 0x54, 0x00,
+ 0xff, 0x00, 0x3f, 0x4e,
+ 0x40, 0x1c, 0xe9, 0x0f, 0x12, 0x01, 0xcf, 0x01, 0x76, 0x00, 0xff, 0x00,
+ 0x03, 0x01, 0x00, 0x4f,
+ 0x3e, 0x0a, 0x1f, 0x50, 0x2e, 0x19, 0x3e, 0x6f, 0x1e, 0x1f, 0x0f, 0xfe,
+ 0xde, 0x00, 0x35, 0xc0,
+ 0x9f, 0xee, 0xee, 0xee, 0xd0, 0x00, 0xdc, 0xfd, 0x00, 0x1a, 0x2c, 0x40,
+ 0x1e, 0xfb, 0x4f, 0x4f,
+ 0x2f, 0x4f, 0x3f, 0x2d, 0x0c, 0xbc, 0xff, 0x10, 0x0c, 0xfe, 0x00, 0x01,
+ 0xa0, 0xef, 0xf0, 0xff,
+ 0x00, 0x10, 0xf2, 0xf2, 0x12, 0x41, 0xb8, 0xc0, 0xf6, 0xe2, 0xdf, 0x00,
+ 0x02, 0xc0, 0x00, 0x14,
+ 0x01, 0xf2, 0x13, 0x20, 0x3d, 0x60, 0x23, 0x03, 0xd0, 0xe0, 0x25, 0x42,
+ 0xe1, 0xe0, 0x17, 0x53,
+ 0x22, 0x10, 0x11, 0x41, 0x3f, 0x00, 0x11, 0x0e, 0x1a, 0x30, 0xee, 0x9d,
+ 0x01, 0x47, 0xcf, 0x9d,
+ 0x00, 0x02, 0xe2, 0xe0, 0xde, 0xde, 0xf0, 0xd1, 0xcb, 0xca, 0xee, 0x00,
+ 0x13, 0x01, 0x00, 0x35,
+ 0x15, 0xf3, 0xf2, 0x33, 0x73, 0x43, 0x02, 0x14, 0x44, 0x34, 0x42, 0x23,
+ 0x32, 0x41, 0x43, 0x21,
+ 0x00, 0x24, 0x57, 0x22, 0x01, 0x01, 0xe0, 0x06, 0x12, 0xf1, 0xe0, 0xf3,
+ 0xb1, 0xd0, 0x00, 0x1f,
+ 0x4e, 0x3f, 0x41, 0x31, 0x2d, 0x4f, 0x3f, 0x0a, 0x0d, 0x7f, 0x1e, 0x0c,
+ 0xe0, 0x0f, 0xfb, 0xdc,
+ 0xef, 0xd0, 0xde, 0x8b, 0xef, 0xf0, 0x00, 0xff, 0x00, 0xfd, 0x0c, 0x30,
+ 0x30, 0xff, 0x9c, 0xee,
+ 0x0f, 0xee, 0xbd, 0xf0, 0x00, 0x00, 0xbe, 0xec, 0x02, 0x1d, 0xf8, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x2e,
+ 0x2e, 0x2c, 0x0d, 0x30, 0x1f, 0xde, 0x01, 0x71, 0x4e, 0x1b, 0x40, 0x1f,
+ 0xfc, 0xdd, 0x0f, 0x4d,
+ 0x08, 0xed, 0x10, 0x00, 0xff, 0xf0, 0xe2, 0xd0, 0xe3, 0x93, 0xe4, 0x15,
+ 0x43, 0x53, 0x32, 0x22,
+ 0x13, 0x22, 0x30, 0x0e, 0x40, 0x74, 0x17, 0x13, 0x00, 0xcf, 0x02, 0x07,
+ 0x14, 0x01, 0x43, 0x21,
+ 0xff, 0x10, 0x43, 0x00, 0x0f, 0x32, 0x3f, 0x2a, 0x5e, 0x0c, 0x0f, 0x00,
+ 0x00, 0x11, 0xd2, 0xa0,
+ 0xe1, 0xf1, 0xf4, 0xc3, 0xa0, 0xcc, 0xee, 0x02, 0xcb, 0xfd, 0x23, 0x21,
+ 0x0b, 0x0e, 0x0f, 0x0d,
+ 0x3e, 0x72, 0x30, 0x1b, 0x20, 0x52, 0x0e, 0x0b, 0x00, 0x10, 0x0f, 0x00,
+ 0x10, 0x0b, 0xed, 0xff,
+ 0xdd, 0xfd, 0x30, 0x51, 0x0c, 0xe9, 0x0e, 0x10, 0x00, 0xd0, 0x91, 0xe2,
+ 0xf1, 0x02, 0x02, 0xd0,
+ 0xd0, 0x37, 0x74, 0x41, 0x10, 0x10, 0x20, 0x42, 0x22, 0x13, 0x46, 0x11,
+ 0x00, 0x31, 0x75, 0x12,
+ 0x01, 0xf3, 0x04, 0x03, 0x03, 0x43, 0x22, 0x23, 0x12, 0x13, 0x46, 0x10,
+ 0x0f, 0x10, 0x40, 0x37,
+ 0x14, 0xd1, 0xc0, 0x02, 0x13, 0x04, 0xa2, 0xb1, 0xd1, 0xf4, 0xf1, 0xe1,
+ 0xf5, 0xb1, 0xe2, 0xf4,
+ 0xe1, 0xd0, 0x03, 0x14, 0xf3, 0x05, 0x32, 0x42, 0x22, 0x21, 0x13, 0x12,
+ 0x43, 0x74, 0x20, 0x20,
+ 0x50, 0x31, 0x0d, 0x09, 0x0f, 0x00, 0x21, 0x41, 0xfe, 0xcb, 0xdf, 0xde,
+ 0xcc, 0xdf, 0xe1, 0xbf,
+ 0xca, 0xed, 0xec, 0x0d, 0x1e, 0x0f, 0xdd, 0xdc, 0x1d, 0x6d, 0x0b, 0x0d,
+ 0x2e, 0x3e, 0x1d, 0x1e,
+ 0x0d, 0xdb, 0xcd, 0xec, 0xfe, 0xbf, 0xe0, 0xde, 0xcc, 0x0e, 0x2f, 0x3f,
+ 0x30, 0x00, 0xdd, 0x1f,
+ 0x61, 0x00, 0xff, 0x01, 0xe1, 0x8f, 0xdb, 0xff, 0xf0, 0xe1, 0xf0, 0xf2,
+ 0xe1, 0xe0, 0xf1, 0xdb,
+ 0xba, 0x20, 0x63, 0x10, 0x00, 0x05, 0x25, 0x00, 0xb0, 0x02, 0x23, 0x00,
+ 0xf0, 0x27, 0x33, 0xd0,
+ 0x8e, 0xff, 0x00, 0x00, 0x02, 0x02, 0xee, 0xfc, 0x10, 0x13, 0xd4, 0xc4,
+ 0xe4, 0xa0, 0xdc, 0xcd,
+ 0xde, 0xed, 0xcd, 0xf1, 0xd0, 0xc9, 0xfe, 0xff, 0xff, 0x0d, 0x10, 0x10,
+ 0xfd, 0xdd, 0x0e, 0x10,
+ 0x54, 0x20, 0x0d, 0x2d, 0x3d, 0x4b, 0x7f, 0x3f, 0x3a, 0x5d, 0x3b, 0x2c,
+ 0x3f, 0x40, 0x31, 0x0f,
+ 0x00, 0x12, 0x23, 0x43, 0x0f, 0xdc, 0xcf, 0xd0, 0xe2, 0xf3, 0xce, 0xdc,
+ 0xdc, 0xdc, 0xce, 0x10,
+ 0x10, 0x11, 0x00, 0x0c, 0x1e, 0x30, 0xfc, 0x2c, 0x7e, 0x0f, 0xce, 0xcb,
+ 0xdd, 0xdd, 0xdb, 0xfd,
+ 0xed, 0xbd, 0xde, 0xdd, 0xdb, 0xef, 0x1f, 0x0d, 0xae, 0xd3, 0xa6, 0xb0,
+ 0xc0, 0xe0, 0xe3, 0x06,
+ 0xd0, 0xb0, 0xf2, 0xf4, 0xf2, 0x03, 0x03, 0xf0, 0xf1, 0x02, 0x11, 0x10,
+ 0x14, 0x37, 0x13, 0xf1,
+ 0x04, 0x55, 0x03, 0x03, 0x04, 0x12, 0x44, 0x31, 0x51, 0x21, 0x10, 0x02,
+ 0x52, 0x51, 0x20, 0x30,
+ 0x36, 0x32, 0x22, 0x20, 0x32, 0x34, 0x33, 0x54, 0x42, 0x10, 0x0f, 0x00,
+ 0x0d, 0x0c, 0xfb, 0x1e,
+ 0x1e, 0xca, 0xfe, 0x00, 0x11, 0xe0, 0xc0, 0xf0, 0x20, 0x72, 0x51, 0x33,
+ 0x1f, 0x34, 0x67, 0x10,
+ 0x1f, 0x3f, 0x5f, 0x2c, 0x3f, 0x2d, 0x2f, 0x43, 0x26, 0x22, 0x33, 0x32,
+ 0x00, 0x1f, 0x1f, 0x00,
+ 0xd0, 0xc1, 0xf5, 0xe2, 0xaf, 0xde, 0xff, 0xfd, 0xcd, 0x17, 0x33, 0x0e,
+ 0x0f, 0x0f, 0x0e, 0x00,
+ 0x13, 0x13, 0x40, 0x43, 0x01, 0xb0, 0xcc, 0xe0, 0x17, 0x17, 0x31, 0x52,
+ 0x11, 0x20, 0x1f, 0xef,
+ 0xd0, 0x17, 0x31, 0x00, 0xf0, 0xb3, 0x92, 0xe2, 0xf4, 0xf1, 0x05, 0x01,
+ 0xa2, 0x00, 0x5c, 0x00,
+ 0x1a, 0x11, 0x74, 0x20, 0xef, 0x13, 0x86, 0x21, 0x0f, 0x77, 0x21, 0xdb,
+ 0x00, 0x03, 0x0f, 0x2f,
+ 0x2f, 0xda, 0xc0, 0x33, 0x14, 0xf0, 0xdd, 0x01, 0x03, 0x01, 0x5d, 0x3e,
+ 0x00, 0xd0, 0x0f, 0x62,
+ 0x25, 0x1d, 0x09, 0x20, 0x62, 0x02, 0x20, 0x00, 0x20, 0x23, 0x30, 0x4f,
+ 0x0f, 0xda, 0x01, 0x76,
+ 0x1e, 0x0e, 0x00, 0x31, 0x21, 0xfc, 0xee, 0x22, 0x73, 0x00, 0x00, 0x12,
+ 0x1f, 0x0c, 0x50, 0x03,
+ 0x00, 0xfe, 0x65, 0x11, 0x0b, 0xfe, 0x11, 0x64, 0x1f, 0x1e, 0x01, 0x13,
+ 0x30, 0xfc, 0xf0, 0x36,
+ 0x20, 0xfc, 0x22, 0x62, 0xfe, 0x0f, 0x00, 0xbf, 0xec, 0x25, 0x41, 0x0d,
+ 0xff, 0x00, 0xfe, 0x01,
+ 0x05, 0x20, 0xfb, 0x10, 0x71, 0x13, 0xfe, 0xde, 0x24, 0x23, 0xdc, 0xdd,
+ 0x0f, 0x20, 0x46, 0xf0,
+ 0x0e, 0x71, 0x00, 0xff, 0x0f, 0x21, 0xc0, 0xf0, 0x02, 0xad, 0x00, 0x04,
+ 0xf0, 0xd0, 0xfd, 0x17,
+ 0x01, 0xac, 0x00, 0x44, 0x00, 0x0d, 0x00, 0x01, 0xcf, 0xec, 0x35, 0x30,
+ 0xfc, 0x24, 0xe2, 0xc0,
+ 0x00, 0xe0, 0xbd, 0xfd, 0x51, 0x34, 0x01, 0xcf, 0x02, 0x1e, 0x08, 0x0f,
+ 0x10, 0x01, 0x43, 0x00,
+ 0xff, 0xf0, 0xe0, 0x10, 0x34, 0xd0, 0xed, 0xf0, 0x8e, 0xb0, 0x16, 0x33,
+ 0xdb, 0xef, 0x21, 0x00,
+ 0xdd, 0xe1, 0xe5, 0x80, 0x22, 0x24, 0xaa, 0x00, 0x01, 0x21, 0x00, 0xe0,
+ 0xce, 0x0f, 0x25, 0x10,
+ 0xeb, 0x41, 0x30, 0xe0, 0xbf, 0x01, 0x03, 0x0f, 0x1d, 0x2f, 0x0f, 0x00,
+ 0x05, 0xe1, 0xf0, 0x9a,
+ 0x00, 0x00, 0xcc, 0x01, 0x25, 0xe0, 0xa0, 0x0e, 0x00, 0x40, 0x00, 0x00,
+ 0xf0, 0x00, 0x42, 0x02,
+ 0xd9, 0x20, 0x72, 0xe0, 0xf0, 0x10, 0x11, 0x0e, 0x1f, 0x52, 0x04, 0xfc,
+ 0xf0, 0x00, 0x0f, 0x0f,
+ 0xe1, 0x15, 0x1f, 0x8e, 0x03, 0xf2, 0x0d, 0x20, 0x00, 0xcb, 0x11, 0x33,
+ 0x1e, 0xd9, 0x01, 0x01,
+ 0x52, 0x0d, 0xee, 0x36, 0x43, 0xcf, 0xcd, 0x06, 0x42, 0xfe, 0xde, 0x01,
+ 0x03, 0x2e, 0x0d, 0x11,
+ 0xe4, 0x9c, 0x20, 0x52, 0xfc, 0xed, 0x11, 0x01, 0x01, 0x27, 0x12, 0x9b,
+ 0xf0, 0x10, 0x10, 0x10,
+ 0xf0, 0xf2, 0xe1, 0xfd, 0xfb, 0x00, 0x0e, 0xd0, 0x8f, 0x05, 0x11, 0x00,
+ 0xfd, 0xc0, 0x07, 0xf0,
+ 0x0f, 0x00, 0xaf, 0xf0, 0x22, 0x10, 0xec, 0xee, 0x01, 0x04, 0x22, 0xec,
+ 0xfe, 0x72, 0x04, 0xce,
+ 0x00, 0x02, 0x13, 0x2e, 0xfd, 0xe0, 0xf3, 0xee, 0xfe, 0xb0, 0xbf, 0xe1,
+ 0xf7, 0x01, 0x0b, 0xe0,
+ 0x03, 0x11, 0xbb, 0xff, 0x30, 0x73, 0x03, 0xce, 0x0f, 0x12, 0x0d, 0xd8,
+ 0x11, 0x44, 0x00, 0x1f,
+ 0xc0, 0xcb, 0x22, 0x70, 0x00, 0x00, 0xf5, 0xf0, 0x0d, 0xf0, 0xfd, 0x2f,
+ 0x01, 0xb5, 0x01, 0x00,
+ 0xfe, 0xee, 0x00, 0x23, 0xef, 0xee, 0xfc, 0xf0, 0x03, 0xeb, 0xcf, 0x20,
+ 0x23, 0x03, 0x91, 0xec,
+ 0x00, 0xe4, 0xc1, 0xf3, 0xf0, 0xd9, 0x22, 0x73, 0xec, 0xce, 0x11, 0x01,
+ 0x0c, 0x0e, 0x52, 0x03,
+ 0xd0, 0x0d, 0x10, 0x20, 0xf3, 0xc3, 0xf4, 0xf0, 0x11, 0x0e, 0xa8, 0xee,
+ 0xf6, 0xe0, 0x0f, 0x00,
+ 0x0e, 0xee, 0x73, 0x34, 0xcd, 0x02, 0x06, 0xf0, 0x00, 0x10, 0x4d, 0xf0,
+ 0xd2, 0x03, 0xf0, 0xbd,
+ 0x01, 0x10, 0x4b, 0x30, 0x00, 0x33, 0x10, 0x2b, 0x73, 0x00, 0x20, 0x40,
+ 0x10, 0xf8, 0xde, 0x20,
+ 0x74, 0x01, 0x0f, 0xef, 0x00, 0xdf, 0x0c, 0x00, 0x31, 0xf2, 0xe0, 0x2e,
+ 0x0e, 0x0e, 0xc2, 0x44,
+ 0x1d, 0x98, 0x0f, 0x15, 0x10, 0xfe, 0xdf, 0x00, 0x21, 0x0f, 0x63, 0x15,
+ 0xf0, 0x2e, 0x42, 0xdd,
+ 0xde, 0x13, 0x35, 0x00, 0xcd, 0xef, 0x00, 0x65, 0xf0, 0xd0, 0x03, 0xef,
+ 0xc8, 0x0f, 0x40, 0x21,
+ 0x11, 0x11, 0xf0, 0x00, 0x3e, 0x3e, 0x00, 0xe0, 0x23, 0x14, 0xf1, 0x55,
+ 0x0f, 0x0a, 0x00, 0x11,
+ 0xe0, 0x00, 0xe0, 0x70, 0x70, 0x41, 0xe0, 0x0f, 0x2c, 0x0e, 0x03, 0x31,
+ 0x21, 0x37, 0x03, 0x6f,
+ 0xf8, 0xcf, 0x31, 0x43, 0x00, 0xfe, 0x00, 0x10, 0x61, 0x30, 0x1f, 0x0e,
+ 0x12, 0x16, 0xee, 0x0f,
+ 0x71, 0x04, 0x00, 0x00, 0x0e, 0x20, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x2d,
+ 0x74, 0x56, 0x00, 0x20,
+ 0x1e, 0x20, 0x20, 0x44, 0x51, 0x3f, 0x0d, 0x04, 0x05, 0x2c, 0x2d, 0x40,
+ 0x01, 0xbd, 0x12, 0x26,
+ 0xfe, 0xfb, 0x20, 0x74, 0x10, 0xfc, 0x00, 0x22, 0x0f, 0x0b, 0x11, 0x41,
+ 0x0f, 0x0f, 0xf0, 0x11,
+ 0xff, 0x2f, 0x7f, 0x0f, 0x01, 0x15, 0x11, 0xff, 0x00, 0x22, 0x40, 0xce,
+ 0xfd, 0x20, 0xf0, 0xb7,
+ 0x17, 0x40, 0xf0, 0xfd, 0x00, 0x00, 0x00, 0x72, 0x20, 0x00, 0xfc, 0xed,
+ 0x11, 0x37, 0x12, 0xfd,
+ 0xf0, 0x22, 0xe1, 0xf0, 0x42, 0xde, 0x8d, 0x12, 0x52, 0x0a, 0x0f, 0x11,
+ 0x24, 0x0f, 0x0d, 0x0f,
+ 0x20, 0x2f, 0x53, 0x12, 0x0c, 0xe2, 0x27, 0x00, 0xae, 0x30, 0x35, 0x0e,
+ 0xde, 0xf0, 0xc0, 0x22,
+ 0x5f, 0xf9, 0xc0, 0x02, 0xe0, 0x2d, 0x20, 0x03, 0xc4, 0xd0, 0x0f, 0x31,
+ 0xcf, 0x0f, 0x64, 0xcc,
+ 0xdd, 0x04, 0x0f, 0xca, 0x11, 0x12, 0xf0, 0xc2, 0x00, 0xfb, 0x20, 0x22,
+ 0x22, 0x72, 0x0b, 0xdd,
+ 0xf0, 0x44, 0x21, 0xf0, 0xdf, 0xde, 0x0e, 0x00, 0x00, 0x1f, 0xe0, 0xb0,
+ 0x0f, 0x00, 0x66, 0x10,
+ 0xd9, 0xc0, 0x00, 0x22, 0x00, 0xdd, 0x10, 0xe0, 0xcf, 0x03, 0xf1, 0xe0,
+ 0x02, 0x41, 0x10, 0x00,
+ 0x9c, 0xdc, 0x01, 0x17, 0x43, 0x00, 0xfd, 0xb1, 0xf4, 0xf2, 0xf0, 0xcf,
+ 0xfa, 0x02, 0x03, 0xde,
+ 0xdb, 0x10, 0xd1, 0x80, 0xe0, 0x00, 0xdc, 0x00, 0x26, 0xc0, 0x90, 0x00,
+ 0x15, 0xe0, 0xde, 0x00,
+ 0x10, 0xe1, 0xe1, 0xe1, 0xab, 0xf2, 0x23, 0x0c, 0x9d, 0x01, 0x11, 0xff,
+ 0xe0, 0x07, 0x01, 0xef,
+ 0xbe, 0xf0, 0x04, 0x11, 0x00, 0xce, 0xfd, 0xef, 0xf2, 0xf0, 0xeb, 0x30,
+ 0x00, 0xcf, 0x16, 0x00,
+ 0xbe, 0xfd, 0x04, 0x10, 0xc0, 0xf3, 0x01, 0xdc, 0xde, 0x12, 0x00, 0x10,
+ 0xd0, 0x8f, 0xdb, 0x20,
+ 0x32, 0x20, 0x0e, 0x02, 0x55, 0x1e, 0x0b, 0x30, 0x42, 0x00, 0xf0, 0x36,
+ 0x20, 0xec, 0x00, 0x01,
+ 0xbf, 0xf0, 0x52, 0x20, 0xdc, 0xfe, 0x32, 0x13, 0x00, 0x71, 0x30, 0xf8,
+ 0x0e, 0x30, 0x33, 0x21,
+ 0x00, 0x0e, 0x20, 0x7f, 0x21, 0x06, 0xee, 0x20, 0x72, 0x0f, 0xef, 0x03,
+ 0x00, 0x2b, 0x10, 0x04,
+ 0x05, 0xff, 0xed, 0x00, 0x25, 0x12, 0xc0, 0xbb, 0x40, 0x10, 0xef, 0x11,
+ 0x31, 0x1f, 0x0e, 0xe0,
+ 0x10, 0x30, 0x33, 0x71, 0x00, 0xb9, 0xe1, 0x44, 0x21, 0xfc, 0xf0, 0x02,
+ 0x0f, 0x4f, 0x4f, 0x0f,
+ 0xbe, 0x11, 0x75, 0x1f, 0x0b, 0x10, 0x00, 0xfe, 0x05, 0x13, 0x4f, 0xfc,
+ 0xff, 0xf0, 0x42, 0x13,
+ 0xdb, 0xdd, 0x30, 0x32, 0x10, 0x01, 0xef, 0xfd, 0x2e, 0x20, 0xe4, 0x04,
+ 0x75, 0x50, 0x1f, 0x0f,
+ 0xe1, 0x12, 0x1c, 0x0e, 0x36, 0x74, 0x00, 0x0b, 0x00, 0x50, 0x20, 0x00,
+ 0x10, 0x63, 0x10, 0x2f,
+ 0x10, 0x0c, 0xfd, 0x44, 0x33, 0x11, 0xf0, 0x0f, 0x1d, 0x2b, 0x20, 0x03,
+ 0x02, 0x71, 0x2e, 0xfe,
+ 0x00, 0x5e, 0x2c, 0x0e, 0xef, 0x02, 0x45, 0x2d, 0xe9, 0xe0, 0x42, 0x21,
+ 0x0e, 0xd1, 0xf5, 0x1e,
+ 0x1d, 0x71, 0x55, 0xcf, 0x00, 0x00, 0x0e, 0x0f, 0x06, 0x11, 0xf0, 0x11,
+ 0x11, 0xef, 0xde, 0x31,
+ 0x22, 0x0e, 0x00, 0xef, 0xaf, 0x0d, 0xfc, 0xef, 0xa0, 0x07, 0x2f, 0xab,
+ 0xd0, 0x01, 0x04, 0x10,
+ 0x01, 0xd3, 0x21, 0xdc, 0x0d, 0x72, 0x04, 0xd1, 0x1f, 0x3b, 0xee, 0x13,
+ 0x13, 0xc0, 0x21, 0x30,
+ 0xda, 0xbf, 0x25, 0x12, 0xef, 0x00, 0x30, 0xd0, 0x8c, 0x00, 0x11, 0x1e,
+ 0x0e, 0x10, 0x3f, 0xea,
+ 0xe0, 0x05, 0x20, 0x1e, 0x60, 0x23, 0xef, 0xbc, 0x13, 0x13, 0xec, 0xcf,
+ 0x34, 0xf0, 0x9e, 0x0e,
+ 0x01, 0xe0, 0x0f, 0x51, 0x0e, 0x10, 0x07, 0x23, 0x1c, 0x2f, 0x0f, 0x01,
+ 0x32, 0xe0, 0xf1, 0xf0,
+ 0xec, 0xcd, 0xc1, 0x17, 0x41, 0xd1, 0xc0, 0xeb, 0x0f, 0x20, 0x01, 0xce,
+ 0xed, 0x43, 0x57, 0xcf,
+ 0xed, 0x10, 0x12, 0xce, 0x21, 0x44, 0xec, 0xf0, 0x1f, 0xf0, 0x0f, 0x50,
+ 0x11, 0x01, 0xe0, 0xf9,
+ 0x00, 0x42, 0xf1, 0x90, 0x03, 0x06, 0xed, 0xce, 0xf0, 0x00, 0x02, 0x00,
+ 0x62, 0xfc, 0x9e, 0x04,
+ 0x11, 0x0d, 0x02, 0xf4, 0xfe, 0xfa, 0x10, 0x00, 0xe0, 0xe0, 0x04, 0x14,
+ 0x02, 0x0f, 0xaa, 0x00,
+ 0x31, 0x41, 0xf0, 0xdf, 0xde, 0x1f, 0x73, 0x23, 0xed, 0x05, 0x22, 0x0d,
+ 0xce, 0x01, 0x04, 0x11,
+ 0x0f, 0xfd, 0x14, 0x65, 0xdd, 0xdc, 0xff, 0x0f, 0x30, 0x13, 0xd0, 0xe0,
+ 0xee, 0xf3, 0xc5, 0xd3,
+ 0x61, 0x0c, 0x8a, 0x01, 0x14, 0x00, 0xef, 0xf2, 0xf0, 0xec, 0xf0, 0x00,
+ 0xff, 0xfb, 0x72, 0x32,
+ 0xca, 0x00, 0x14, 0x20, 0xed, 0x00, 0x01, 0xae, 0xf1, 0x02, 0x03, 0xff,
+ 0xca, 0xd0, 0xe1, 0x23,
+ 0x20, 0x0b, 0xf1, 0xd1, 0xc0, 0x1f, 0x41, 0x11, 0xff, 0xbf, 0x01, 0x03,
+ 0x0c, 0xca, 0xc0, 0xf4,
+ 0x03, 0x20, 0x0a, 0xf0, 0xcf, 0x00, 0x74, 0x01, 0xcf, 0x0d, 0x00, 0x11,
+ 0x01, 0x21, 0x12, 0xcf,
+ 0xd0, 0x25, 0x60, 0x0e, 0x00, 0xe0, 0xf0, 0x2e, 0x2c, 0x01, 0xf2, 0xf2,
+ 0xee, 0xc8, 0x52, 0x12,
+ 0xac, 0xf0, 0x01, 0xf0, 0x23, 0x05, 0xdc, 0xcd, 0x30, 0x20, 0xdf, 0xd0,
+ 0x53, 0x42, 0x0b, 0xcd,
+ 0xf0, 0xf1, 0x00, 0x06, 0x33, 0xcf, 0xde, 0x01, 0xf1, 0xfb, 0x31, 0x02,
+ 0x8f, 0x0f, 0x21, 0xec,
+ 0xfe, 0x01, 0x32, 0x0e, 0x07, 0x01, 0xab, 0xff, 0x20, 0x23, 0xbf, 0xfe,
+ 0x02, 0x10, 0xdc, 0xd1,
+ 0xd4, 0xde, 0x2f, 0x22, 0xae, 0xee, 0x35, 0x33, 0x0c, 0x0e, 0x20, 0x36,
+ 0x01, 0x40, 0x7f, 0xee,
+ 0xe0, 0x22, 0x63, 0x01, 0xd0, 0xf0, 0x10, 0x3f, 0x00, 0x47, 0x02, 0xeb,
+ 0x5f, 0x00, 0x00, 0xfd,
+ 0x40, 0x31, 0xed, 0xf0, 0x13, 0x10, 0x1f, 0x25, 0xe0, 0x0f, 0x2c, 0x0d,
+ 0x2e, 0x60, 0x1e, 0xea,
+ 0xf0, 0xd1, 0x13, 0x47, 0xe0, 0xbc, 0xed, 0xe0, 0x17, 0x02, 0xd0, 0x80,
+ 0xbe, 0x0f, 0x10, 0x11,
+ 0xf0, 0xe3, 0xd1, 0x0d, 0x00, 0x10, 0x9e, 0x0e, 0x14, 0x43, 0xcd, 0xf2,
+ 0x02, 0xe9, 0x03, 0x33,
+ 0xfb, 0xc0, 0x0f, 0xec, 0x52, 0x25, 0xce, 0xdd, 0x00, 0x21, 0x53, 0x22,
+ 0xed, 0xbe, 0x16, 0x33,
+ 0x30, 0xed, 0xf0, 0x2f, 0x2d, 0x4f, 0x30, 0xe6, 0xd0, 0xfd, 0x50, 0x40,
+ 0xfd, 0xe0, 0x16, 0x11,
+ 0x20, 0x41, 0x00, 0xf0, 0x20, 0x52, 0xee, 0xed, 0x02, 0x0e, 0x1d, 0x03,
+ 0x77, 0x57, 0xf0, 0x0c,
+ 0x30, 0x31, 0x20, 0x43, 0x42, 0x0f, 0x0c, 0x4f, 0x0e, 0x11, 0x53, 0x06,
+ 0x0f, 0xfc, 0x10, 0x03,
+ 0x11, 0x42, 0x0d, 0x0c, 0x54, 0x00, 0xfe, 0x2e, 0x71, 0x0f, 0x10, 0x26,
+ 0x00, 0x0b, 0xf0, 0x10,
+ 0x60, 0x21, 0xfe, 0x0f, 0x00, 0x43, 0x0b, 0x0d, 0x11, 0x11, 0x2d, 0x2e,
+ 0x34, 0x01, 0xdd, 0x0e,
+ 0x3d, 0x61, 0x37, 0x14, 0x00, 0xba, 0x20, 0x00, 0x10, 0x50, 0xf0, 0xe2,
+ 0xe0, 0x2f, 0x1c, 0x1f,
+ 0x31, 0x02, 0x00, 0xf1, 0xc5, 0x00, 0x40, 0xfe, 0xf1, 0x27, 0x00, 0xbf,
+ 0x0e, 0x00, 0x00, 0x0c,
+ 0x61, 0x43, 0x00, 0xce, 0x13, 0x12, 0x00, 0x16, 0x61, 0x00, 0xfe, 0xfe,
+ 0x20, 0x2f, 0xef, 0xc4,
+ 0x16, 0x3d, 0x0d, 0x40, 0xef, 0xab, 0x01, 0x44, 0x00, 0x01, 0xe0, 0xf0,
+ 0x01, 0x37, 0xf0, 0xac,
+ 0x00, 0x01, 0xf1, 0xbf, 0xfe, 0x12, 0x20, 0x0f, 0xeb, 0x21, 0x44, 0xfe,
+ 0x0f, 0x54, 0x00, 0x0f,
+ 0x20, 0x02, 0xd1, 0xd0, 0xcc, 0x0f, 0x32, 0xd1, 0xa0, 0x04, 0x0e, 0xe8,
+ 0xf0, 0x00, 0x60, 0x00,
+ 0x02, 0xef, 0xeb, 0x10, 0x02, 0xd0, 0xf3, 0xcc, 0x20, 0x12, 0x8c, 0xe0,
+ 0x31, 0xca, 0xf0, 0x40,
+ 0x0e, 0xfe, 0x34, 0x23, 0xbf, 0xda, 0x00, 0x50, 0x01, 0xe2, 0x05, 0x10,
+ 0xcd, 0xe0, 0x14, 0x00,
+ 0xaf, 0x02, 0x01, 0x0d, 0xf1, 0xe1, 0xef, 0xeb, 0xe0, 0x33, 0x26, 0xcf,
+ 0xbd, 0x0f, 0xf2, 0xf5,
+ 0xd0, 0xcf, 0xec, 0x11, 0x73, 0xfe, 0xce, 0x04, 0x0f, 0xc8, 0x10, 0x13,
+ 0xd0, 0xff, 0x00, 0x02,
+ 0xcf, 0xd0, 0x02, 0x42, 0xce, 0xef, 0x11, 0xe0, 0xbc, 0x02, 0x07, 0xf0,
+ 0xcd, 0xee, 0xf0, 0xe0,
+ 0xae, 0x02, 0xf7, 0xe0, 0xf0, 0x00, 0xab, 0xe0, 0xf2, 0x04, 0xef, 0xbe,
+ 0xe0, 0x01, 0xf1, 0xe1,
+ 0xe0, 0xed, 0x10, 0x51, 0x02, 0xde, 0xfe, 0x10, 0x42, 0xf5, 0xed, 0x0d,
+ 0x0c, 0xee, 0x07, 0x56,
+ 0xbe, 0xfd, 0x00, 0x31, 0xf0, 0xd1, 0x00, 0x2d, 0x1d, 0x30, 0xe2, 0xaf,
+ 0xee, 0x00, 0x11, 0x00,
+ 0x02, 0xf7, 0xcf, 0x0d, 0x1e, 0xee, 0x10, 0x70, 0x30, 0x23, 0x5f, 0xf8,
+ 0xee, 0x02, 0x63, 0x1f,
+ 0x0b, 0x01, 0x14, 0x31, 0x00, 0xf0, 0xd3, 0x16, 0x50, 0x1d, 0xfc, 0xf0,
+ 0x02, 0x01, 0x31, 0x00,
+ 0xdc, 0x1f, 0x50, 0xe3, 0xa3, 0x17, 0x24, 0xdc, 0xce, 0x42, 0x53, 0x01,
+ 0xde, 0xed, 0x00, 0x11,
+ 0x22, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x1d, 0x0f, 0x02, 0x67, 0x57, 0x1e,
+ 0x2f, 0x0f, 0x0f, 0x50,
+ 0x1f, 0x11, 0x11, 0x02, 0xfb, 0xee, 0x1e, 0x70, 0x13, 0xef, 0x0f, 0x0e,
+ 0x13, 0x54, 0x0a, 0xd0,
+ 0xe0, 0xcd, 0x0f, 0x72, 0xf0, 0xc0, 0x02, 0x20, 0x08, 0xf0, 0x14, 0x24,
+ 0x10, 0x2e, 0x40, 0x10,
+ 0x0e, 0x2f, 0x5f, 0x35, 0x02, 0x01, 0x61, 0x0c, 0x0f, 0x45, 0x22, 0xfe,
+ 0x0e, 0x1c, 0x1e, 0x74,
+ 0x14, 0x0e, 0x1e, 0x20, 0x0e, 0x0d, 0x74, 0x02, 0xfc, 0x02, 0x45, 0x0e,
+ 0xfe, 0x01, 0x21, 0x31,
+ 0x1f, 0x0a, 0x00, 0x52, 0x21, 0x0c, 0xfe, 0x54, 0x10, 0x0d, 0x20, 0x01,
+ 0x24, 0x20, 0xfe, 0xff,
+ 0x02, 0x00, 0x10, 0x34, 0xdf, 0xff, 0x00, 0xe9, 0x10, 0x62, 0xdf, 0xf0,
+ 0x21, 0x01, 0xe0, 0xf1,
+ 0xf7, 0xc3, 0xae, 0x0d, 0x33, 0xe1, 0xbd, 0xfb, 0x20, 0xf2, 0x90, 0xff,
+ 0x1f, 0x0c, 0xfc, 0xef,
+ 0x12, 0x06, 0x9e, 0x00, 0x23, 0x10, 0xde, 0x10, 0x34, 0xce, 0xed, 0x33,
+ 0x1f, 0xa9, 0xf2, 0x24,
+ 0x20, 0x0d, 0xce, 0x00, 0x25, 0xe2, 0xd1, 0x30, 0x2d, 0xd0, 0x03, 0xbf,
+ 0xbd, 0x01, 0x1d, 0xdb,
+ 0x03, 0x35, 0xce, 0xef, 0x33, 0x0e, 0xcc, 0x00, 0x03, 0x74, 0x62, 0xfc,
+ 0xed, 0x00, 0x20, 0x26,
+ 0xf0, 0xde, 0x20, 0x70, 0x01, 0xff, 0x0f, 0x10, 0x12, 0x00, 0x10, 0x1b,
+ 0x00, 0xe2, 0x00, 0x24,
+ 0xf1, 0xdf, 0xdd, 0x9c, 0xff, 0x07, 0x11, 0xec, 0xdf, 0x0f, 0x10, 0x21,
+ 0x5c, 0x0c, 0xe0, 0x26,
+ 0xee, 0xee, 0x74, 0x00, 0x8d, 0x11, 0x13, 0xed, 0xf1, 0x07, 0xe1, 0xde,
+ 0x1f, 0x00, 0xf0, 0xd1,
+ 0xe0, 0x00, 0xe9, 0xdf, 0x10, 0x64, 0xf2, 0xe0, 0xfd, 0xd0, 0xa4, 0xf2,
+ 0x00, 0x0f, 0x20, 0xf0,
+ 0xb2, 0xef, 0xf0, 0x01, 0x00, 0xe9, 0xb0, 0x00, 0x00, 0xfd, 0x02, 0xc2,
+ 0xf3, 0x3f, 0x58, 0x01,
+ 0x03, 0xd0, 0xee, 0x0f, 0x53, 0xde, 0xa8, 0x41, 0x44, 0x00, 0xdc, 0x00,
+ 0x32, 0x00, 0xef, 0x2f,
+ 0x51, 0xf0, 0xdd, 0x05, 0x03, 0xdd, 0xdd, 0xdf, 0xb0, 0x07, 0x24, 0xcc,
+ 0xd0, 0x10, 0x31, 0x11,
+ 0x30, 0xed, 0xde, 0x72, 0x53, 0xe0, 0xfc, 0x00, 0x11, 0x35, 0xf0, 0xe1,
+ 0x00, 0x2f, 0x3f, 0xdb,
+ 0xbf, 0x21, 0x63, 0xf8, 0x0f, 0x00, 0x03, 0xf0, 0xbe, 0x0f, 0x01, 0x01,
+ 0x35, 0x00, 0x35, 0x00,
+ 0xa3, 0x01, 0x93, 0x09, 0x6e, 0x02, 0x84, 0x0b, 0x91, 0xf6, 0xf3, 0x0d,
+ 0x1b, 0x71, 0x01, 0x00,
+ 0x0e, 0x0b, 0x0f, 0x32, 0x31, 0xfe, 0xe5, 0xbf, 0xb8, 0x51, 0x22, 0xf0,
+ 0xc1, 0xf2, 0xef, 0x1f,
+ 0x00, 0x00, 0x00, 0x34, 0x00, 0xea, 0x10, 0x51, 0x00, 0x0d, 0x01, 0x03,
+ 0x25, 0x20, 0xcc, 0x30,
+ 0x33, 0xd2, 0x00, 0x30, 0xff, 0xcf, 0x30, 0xd0, 0x80, 0xe3, 0x35, 0x40,
+ 0x1e, 0xfd, 0x0e, 0x71,
+ 0x03, 0xff, 0xff, 0x25, 0x61, 0xf8, 0xde, 0xe0, 0x12, 0xfe, 0xdc, 0x14,
+ 0x22, 0xce, 0xdd, 0x11,
+ 0x44, 0x10, 0xe8, 0xd0, 0x30, 0x63, 0x0f, 0xce, 0x00, 0xd0, 0x22, 0x33,
+ 0xfc, 0xd0, 0x0f, 0xd0,
+ 0x24, 0x77, 0x00, 0xcc, 0x20, 0x61, 0x02, 0xdf, 0x1e, 0x30, 0x00, 0x01,
+ 0xe0, 0xec, 0x0f, 0x31,
+ 0x56, 0x00, 0xef, 0xf0, 0xe0, 0x00, 0x5e, 0x4f, 0x14, 0xd2, 0xac, 0x10,
+ 0x14, 0x0f, 0xd0, 0x02,
+ 0x00, 0x1d, 0x03, 0xe4, 0x00, 0xf0, 0xab, 0xfc, 0x41, 0x61, 0x0f, 0xfc,
+ 0x01, 0x24, 0x0e, 0x0a,
+ 0x00, 0x03, 0x22, 0x0d, 0xce, 0xe4, 0xd0, 0xf0, 0xf1, 0xf2, 0x0d, 0x2b,
+ 0xe0, 0xa1, 0x0e, 0x0b,
+ 0x00, 0x01, 0xe2, 0xda, 0x50, 0x43, 0xd2, 0xa0, 0xfe, 0x00, 0x42, 0x27,
+ 0x11, 0xdf, 0xed, 0x01,
+ 0x00, 0x2e, 0x10, 0x03, 0x31, 0x51, 0x10, 0x0e, 0xd8, 0x10, 0x72, 0x13,
+ 0x02, 0x34, 0xdf, 0xbc,
+ 0x0f, 0x0f, 0xf0, 0x00, 0x42, 0x01, 0x0b, 0x00, 0x20, 0x10, 0x3e, 0x20,
+ 0x57, 0x12, 0xe0, 0xfc,
+ 0xaf, 0xbd, 0x00, 0x33, 0x00, 0xdd, 0xdc, 0xaf, 0x04, 0x47, 0xee, 0xce,
+ 0x10, 0x50, 0x00, 0x1f,
+ 0x00, 0x01, 0x04, 0x01, 0x2e, 0x0f, 0x00, 0x0e, 0x10, 0x17, 0x03, 0x00,
+ 0x73, 0x00, 0xcc, 0x2e,
+ 0x2e, 0xf0, 0xb1, 0x03, 0x04, 0x23, 0xe2, 0xaa, 0xfd, 0x00, 0x16, 0x00,
+ 0xf1, 0xff, 0xec, 0xf0,
+ 0x32, 0x73, 0x10, 0x0b, 0xfe, 0x10, 0x0f, 0xec, 0x00, 0x36, 0x31, 0x01,
+ 0xa0, 0xed, 0xf0, 0x02,
+ 0xd5, 0xe0, 0xf1, 0x3e, 0x5e, 0x0e, 0x10, 0x11, 0xff, 0x0e, 0x31, 0xef,
+ 0x88, 0x0f, 0x20, 0x11,
+ 0xc2, 0xe0, 0x00, 0x00, 0x04, 0x71, 0xfe, 0xed, 0xee, 0xf1, 0x00, 0x3c,
+ 0x0b, 0x20, 0x42, 0x0e,
+ 0x1d, 0x53, 0x02, 0xf0, 0x57, 0x24, 0xff, 0xec, 0x0f, 0x22, 0x57, 0xef,
+ 0xcf, 0x0e, 0x02, 0x33,
+ 0x00, 0xcb, 0x00, 0x02, 0xf0, 0x02, 0x4f, 0xfb, 0xe0, 0x31, 0xf3, 0x8d,
+ 0xfc, 0x01, 0x04, 0x03,
+ 0xc0, 0x0c, 0x10, 0x0f, 0x10, 0x12, 0x00, 0xfd, 0x71, 0x66, 0xf0, 0xff,
+ 0xff, 0xff, 0x00, 0x15,
+ 0x40, 0xf1, 0xf0, 0x10, 0x44, 0x00, 0xcd, 0x01, 0x31, 0x1d, 0x00, 0x11,
+ 0xb0, 0xdb, 0xf0, 0x0e,
+ 0xf0, 0xef, 0x0e, 0x20, 0x05, 0x80, 0xd9, 0x00, 0x11, 0x1f, 0x1c, 0x31,
+ 0xf1, 0xeb, 0x0d, 0x3e,
+ 0x50, 0x30, 0x0c, 0x0f, 0xd1, 0x07, 0x77, 0x00, 0xed, 0xf0, 0xf0, 0xe0,
+ 0x61, 0x22, 0x0c, 0x0e,
+ 0xef, 0xf0, 0xf1, 0x00, 0x0c, 0x41, 0xe3, 0x8e, 0xfd, 0x04, 0x25, 0xf0,
+ 0xed, 0x00, 0x02, 0x07,
+ 0xe0, 0xed, 0xc0, 0x00, 0x74, 0x10, 0x00, 0x0f, 0x5f, 0x1f, 0x10, 0xf5,
+ 0xe0, 0x00, 0x60, 0x22,
+ 0x0e, 0xdd, 0xd0, 0x03, 0xfe, 0x04, 0x37, 0xb0, 0xfc, 0x10, 0x53, 0x01,
+ 0xd0, 0x0c, 0x50, 0x10,
+ 0x21, 0xef, 0xfe, 0x02, 0x40, 0xff, 0xa0, 0xf7, 0xe5, 0x0e, 0x00, 0xef,
+ 0xd0, 0x00, 0x21, 0x01,
+ 0x00, 0x32, 0x00, 0xe9, 0x1e, 0x71, 0x35, 0x42, 0x1f, 0xfd, 0x00, 0x73,
+ 0x10, 0xed, 0x00, 0x25,
+ 0x10, 0xef, 0xf0, 0x53, 0x00, 0xee, 0x00, 0x0e, 0xcf, 0xf4, 0x57, 0x02,
+ 0xca, 0xfe, 0x01, 0x52,
+ 0x01, 0xee, 0xf0, 0x00, 0xfe, 0x2d, 0x40, 0x0b, 0x1d, 0x40, 0x11, 0xe2,
+ 0xb0, 0x0e, 0xea, 0x01,
+ 0x15, 0x01, 0xd0, 0x02, 0x3e, 0xa9, 0xc0, 0x00, 0x63, 0x0f, 0xfe, 0x00,
+ 0x2f, 0x01, 0xf1, 0xfd,
+ 0xfe, 0x21, 0x54, 0x01, 0x04, 0xe3, 0xe0, 0xef, 0xf2, 0x16, 0x41, 0xcd,
+ 0xba, 0x00, 0x11, 0x11,
+ 0x00, 0xff, 0xff, 0xee, 0x54, 0x46, 0x00, 0xf1, 0x00, 0x0e, 0x11, 0x04,
+ 0xef, 0xee, 0x41, 0x00,
+ 0xed, 0xe0, 0x00, 0x24, 0x73, 0x2b, 0xee, 0xd0, 0x32, 0x6e, 0x0d, 0xdf,
+ 0x02, 0xf7, 0xf5, 0xcd,
+ 0xbb, 0x00, 0x21, 0x34, 0xd0, 0x8e, 0x0e, 0x00, 0x31, 0x00, 0x1f, 0x21,
+ 0xe0, 0xfe, 0x10, 0x1e,
+ 0x3f, 0x00, 0xf6, 0xe0, 0x1c, 0x1e, 0x10, 0xf1, 0xfd, 0x0e, 0x77, 0x13,
+ 0xc0, 0xea, 0x4f, 0x40,
+ 0xd1, 0xc2, 0x00, 0xff, 0x42, 0x63, 0xff, 0xbc, 0xf0, 0x0e, 0x02, 0x23,
+ 0x2f, 0x08, 0xf0, 0x0e,
+ 0x4f, 0x1f, 0xde, 0xdf, 0x31, 0x00, 0xe0, 0x07, 0x03, 0x01, 0x31, 0x70,
+ 0x00, 0x90, 0x00, 0x21,
+ 0x45, 0x00, 0xff, 0xeb, 0x00, 0x0d, 0x0c, 0x10, 0xe1, 0xd2, 0x03, 0x0d,
+ 0xad, 0xe3, 0xd5, 0x01,
+ 0xf0, 0x80, 0xee, 0x01, 0x01, 0x30, 0x0b, 0xef, 0xdf, 0x10, 0x77, 0x62,
+ 0x0e, 0xf0, 0x04, 0x04,
+ 0x13, 0x0f, 0x0b, 0xfe, 0x00, 0x13, 0xf5, 0xc0, 0xef, 0x01, 0x04, 0x0e,
+ 0xec, 0x0e, 0x70, 0x0f,
+ 0x21, 0x20, 0x4d, 0x1b, 0x00, 0xe1, 0xe0, 0x9c, 0x01, 0x37, 0x31, 0xbf,
+ 0xee, 0xf3, 0x02, 0x00,
+ 0x3e, 0x33, 0xef, 0xdf, 0x40, 0x2e, 0x1e, 0xe0, 0x07, 0x33, 0x1e, 0x51,
+ 0x27, 0x30, 0xde, 0xd0,
+ 0x10, 0x4e, 0x2f, 0x30, 0x26, 0xf1, 0xf0, 0xfd, 0xdc, 0xce, 0x1f, 0x24,
+ 0x82, 0x91, 0xff, 0xec,
+ 0x20, 0x10, 0xe0, 0xe0, 0x1e, 0x04, 0x00, 0x0f, 0x2b, 0x4d, 0xfb, 0x00,
+ 0x10, 0xe0, 0xa1, 0x01,
+ 0x04, 0x00, 0xe0, 0x8d, 0xd1, 0xf0, 0x40, 0x47, 0xf2, 0xff, 0xff, 0xcd,
+ 0xfc, 0x0d, 0x20, 0x51,
+ 0xf4, 0xd1, 0xfe, 0x10, 0x35, 0x00, 0xfd, 0xf1, 0x27, 0x76, 0x2e, 0x9d,
+ 0x00, 0x12, 0x00, 0x0f,
+ 0x10, 0x00, 0x0d, 0x33, 0x34, 0x10, 0xef, 0xbf, 0x1f, 0x5f, 0x10, 0x07,
+ 0xf2, 0xe0, 0x0b, 0xff,
+ 0xf0, 0xf1, 0xef, 0xf0, 0x12, 0x43, 0x0f, 0x2f, 0x7b, 0x29, 0x00, 0x02,
+ 0xd4, 0x0f, 0x0b, 0x50,
+ 0x21, 0xe0, 0x80, 0xc0, 0x12, 0x20, 0x00, 0xf0, 0xe1, 0x02, 0x43, 0x0e,
+ 0x09, 0x00, 0x14, 0x31,
+ 0x00, 0xfd, 0x00, 0x31, 0x00, 0xff, 0xfe, 0x10, 0x03, 0xc7, 0x01, 0x2f,
+ 0xff, 0xb2, 0xd5, 0xf0,
+ 0x3d, 0x7c, 0x10, 0xd2, 0xb5, 0x01, 0x00, 0x0e, 0x50, 0x00, 0xf2, 0xc2,
+ 0xf3, 0x00, 0x28, 0xee,
+ 0x3f, 0x50, 0xf0, 0xcd, 0xfd, 0x0c, 0x41, 0x02, 0xad, 0x0d, 0x00, 0xe4,
+ 0xe4, 0x00, 0x2f, 0x2d,
+ 0x03, 0x15, 0x40, 0xdb, 0x0f, 0x70, 0x43, 0xfe, 0xcb, 0x10, 0x43, 0x04,
+ 0xc0, 0xfc, 0xf0, 0x04,
+ 0x03, 0xe1, 0x01, 0x33, 0x00, 0xcd, 0xea, 0xd0, 0xf0, 0x42, 0x72, 0x21,
+ 0xe0, 0xfd, 0x1e, 0x40,
+ 0x02, 0x16, 0x32, 0xf2, 0xb2, 0x1f, 0x59, 0x00, 0xf3, 0x05, 0x00, 0xe0,
+ 0xf0, 0x0c, 0x4f, 0x00,
+ 0x13, 0x13, 0x10, 0xeb, 0x1d, 0x4e, 0x0f, 0xa2, 0x02, 0xf2, 0xff, 0xdb,
+ 0xff, 0xe0, 0xe0, 0xcf,
+ 0xce, 0xf1, 0xf3, 0x08, 0xfd, 0x02, 0xe4, 0xde, 0x7b, 0x4e, 0x00, 0x23,
+ 0x20, 0xef, 0xf2, 0x45,
+ 0x71, 0x1f, 0x0f, 0xde, 0xde, 0x15, 0x64, 0x0f, 0xfd, 0x12, 0x43, 0x00,
+ 0xfa, 0xff, 0xff, 0x01,
+ 0x11, 0xf0, 0xd4, 0xe0, 0xee, 0xfc, 0xf0, 0x11, 0x10, 0x10, 0x3d, 0x2c,
+ 0xed, 0x1e, 0x41, 0x80,
+ 0x8f, 0x0c, 0x00, 0x00, 0x00, 0x24, 0x17, 0x07, 0xc0, 0x1d, 0x4e, 0x20,
+ 0x04, 0xd2, 0xf0, 0x0e,
+ 0x61, 0x12, 0xed, 0xda, 0xef, 0x21, 0x36, 0x41, 0xf0, 0xef, 0xef, 0xc1,
+ 0xd0, 0x01, 0xde, 0x0f,
+ 0x70, 0x10, 0xff, 0x8c, 0x01, 0x02, 0x21, 0x2e, 0x09, 0xe0, 0xf2, 0xf2,
+ 0x30, 0x6d, 0xf2, 0xc5,
+ 0x03, 0x0f, 0x0b, 0x00, 0x12, 0x34, 0xf1, 0xe1, 0x5f, 0x3f, 0x40, 0x00,
+ 0xff, 0xec, 0x1f, 0x3e,
+ 0x11, 0x03, 0xd4, 0xb3, 0xcb, 0xcc, 0xf1, 0x05, 0x01, 0x3f, 0x0b, 0xc0,
+ 0xe6, 0xd0, 0x0f, 0x6d,
+ 0x20, 0x31, 0x22, 0xf1, 0xae, 0x1d, 0x21, 0x51, 0x00, 0x00, 0x24, 0x14,
+ 0xf1, 0xdf, 0xea, 0x0f,
+ 0x20, 0x20, 0x53, 0x00, 0xbc, 0xff, 0x0f, 0x20, 0xe6, 0x91, 0x00, 0x13,
+ 0x43, 0x21, 0x00, 0xdf,
+ 0xde, 0x2c, 0x40, 0x11, 0x0f, 0xc9, 0xed, 0xff, 0x10, 0x40, 0x04, 0xd0,
+ 0xd8, 0xd0, 0x21, 0x63,
+ 0x0f, 0xef, 0xe0, 0xd0, 0x00, 0xf2, 0xe0, 0xd9, 0x00, 0x20, 0x01, 0x30,
+ 0x00, 0x0e, 0x70, 0x21,
+ 0x07, 0xc6, 0x10, 0x4e, 0x1f, 0x3f, 0x01, 0x82, 0x90, 0xef, 0x0d, 0x10,
+ 0x42, 0x12, 0xff, 0xcd,
+ 0x03, 0x20, 0x09, 0x1f, 0x2f, 0x13, 0x06, 0xff, 0xde, 0x0e, 0x20, 0x00,
+ 0xd0, 0x07, 0x10, 0x30,
+ 0x5f, 0x0c, 0xe0, 0x71, 0x72, 0x2f, 0x0b, 0x00, 0xef, 0xff, 0x02, 0xe3,
+ 0x00, 0xda, 0xd0, 0xf1,
+ 0xe1, 0xc1, 0xee, 0xc0, 0xe3, 0x01, 0xed, 0xc8, 0x20, 0x72, 0x51, 0xf0,
+ 0xee, 0x0c, 0x40, 0x11,
+ 0x03, 0xf0, 0x0d, 0x03, 0x14, 0x01, 0x21, 0xf1, 0xb0, 0x0f, 0x40, 0x52,
+ 0x00, 0x0a, 0x00, 0xe2,
+ 0x05, 0x4f, 0x1e, 0x00, 0xe5, 0xe1, 0xf2, 0xd2, 0xe0, 0x50, 0x40, 0xf1,
+ 0xbe, 0xf8, 0x0d, 0x00,
+ 0x02, 0x00, 0xee, 0xf0, 0xce, 0xdc, 0x0e, 0x3e, 0x61, 0x17, 0x03, 0xc3,
+ 0xbe, 0xf8, 0x30, 0x70,
+ 0x02, 0xe0, 0xde, 0xfe, 0x10, 0x30, 0x12, 0xf3, 0xc0, 0x10, 0x30, 0x10,
+ 0xef, 0xcc, 0xf0, 0x04,
+ 0x76, 0x20, 0xfa, 0xbf, 0x00, 0x0f, 0xff, 0x00, 0x20, 0x02, 0x40, 0x10,
+ 0x0f, 0xfe, 0xdf, 0x0f,
+ 0x75, 0x16, 0x00, 0xc0, 0x0f, 0x01, 0x01, 0x11, 0x13, 0xf3, 0xee, 0x1d,
+ 0x70, 0x02, 0x47, 0x03,
+ 0x21, 0x1e, 0xea, 0xdf, 0xe0, 0x02, 0x44, 0x00, 0xec, 0xbe, 0xf0, 0xf4,
+ 0xe0, 0xff, 0x1d, 0x03,
+ 0xd7, 0x00, 0x3c, 0x4e, 0x20, 0x22, 0x03, 0xb0, 0xfe, 0x3c, 0x70, 0x07,
+ 0xd2, 0xe0, 0x00, 0xff,
+ 0x00, 0x00, 0x4e, 0x30, 0x10, 0x10, 0x14, 0x13, 0x0c, 0xca, 0xb0, 0xd3,
+ 0xe4, 0x00, 0x30, 0x30,
+ 0xcf, 0x8f, 0xb0, 0x10, 0x1f, 0x0e, 0x30, 0x3e, 0x22, 0x05, 0xef, 0xec,
+ 0x1e, 0x7e, 0x3f, 0x03,
+ 0x05, 0xd0, 0x10, 0x2b, 0x0d, 0x50, 0x17, 0x00, 0xbd, 0xfe, 0x0f, 0xf0,
+ 0xe3, 0xef, 0xff, 0xf0,
+ 0x60, 0x1e, 0xeb, 0xc0, 0xf2, 0x11, 0x02, 0xde, 0xf9, 0x1e, 0x31, 0x13,
+ 0xf0, 0xfb, 0xcf, 0x00,
+ 0x05, 0x70, 0x60, 0x00, 0x03, 0xf0, 0x1e, 0x5f, 0x0e, 0xff, 0xc4, 0x07,
+ 0xe2, 0xfc, 0x00, 0x41,
+ 0x13, 0x02, 0x00, 0x2d, 0x2f, 0x00, 0xf0, 0x13, 0x61, 0x1f, 0xe9, 0x90,
+ 0x02, 0x03, 0x0e, 0x3e,
+ 0xc3, 0xb4, 0xf3, 0x1e, 0x2c, 0xf0, 0xb7, 0xf4, 0xfe, 0x1c, 0x40, 0x20,
+ 0x01, 0xf0, 0x0e, 0x30,
+ 0x62, 0x07, 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x2d, 0x0f, 0xe5, 0x11, 0x0f,
+ 0xfb, 0xcf, 0x4f, 0x70,
+ 0x1f, 0xff, 0xdd, 0xd0, 0x03, 0x12, 0x1a, 0xde, 0xe3, 0x17, 0x00, 0xed,
+ 0xee, 0x1f, 0x12, 0x35,
+ 0x10, 0x8b, 0xff, 0x20, 0x40, 0x01, 0x12, 0x30, 0xff, 0xfd, 0x71, 0x27,
+ 0xc1, 0xd0, 0x0d, 0x40,
+ 0x20, 0x00, 0xb0, 0xfe, 0x0c, 0x11, 0x46, 0x10, 0x0f, 0xcf, 0xe0, 0x01,
+ 0x31, 0x03, 0xaf, 0x1c,
+ 0x20, 0x16, 0xe3, 0xed, 0x0d, 0x0f, 0x11, 0x55, 0xf0, 0xc0, 0x0e, 0x00,
+ 0xf0, 0xb0, 0x00, 0x7f,
+ 0x00, 0xd0, 0xdd, 0x10, 0x20, 0x10, 0x0e, 0xcb, 0xd0, 0xf3, 0x5e, 0x49,
+ 0x01, 0xd6, 0x11, 0x10,
+ 0x00, 0x0f, 0x0f, 0x60, 0x13, 0xe0, 0xc0, 0x00, 0x02, 0x0f, 0x00, 0xf5,
+ 0xf1, 0xcd, 0xec, 0x01,
+ 0x07, 0x03, 0x1f, 0x09, 0x2f, 0x1e, 0x3f, 0x00, 0xd0, 0x32, 0x31, 0x2e,
+ 0x40, 0x30, 0x3c, 0x21,
+ 0xe7, 0x84, 0xd1, 0x1f, 0x7e, 0x70, 0x20, 0xfe, 0xe0, 0x22, 0x0c, 0x0e,
+ 0x13, 0x05, 0xf0, 0xf0,
+ 0xdf, 0xff, 0x04, 0x65, 0x12, 0xd0, 0xd3, 0xe0, 0x0a, 0x2e, 0xff, 0xbf,
+ 0x0d, 0x0e, 0x4f, 0x2f,
+ 0x11, 0x30, 0x2c, 0xce, 0xe0, 0x25, 0x74, 0x0f, 0xfd, 0xc2, 0x12, 0x2f,
+ 0xe8, 0xbf, 0x0f, 0xf0,
+ 0xf0, 0x10, 0x01, 0xe0, 0xb2, 0xf0, 0x10, 0x53, 0x23, 0xf0, 0xb8, 0xf0,
+ 0x02, 0x25, 0x10, 0xc0,
+ 0xde, 0x00, 0x32, 0x20, 0xef, 0xbc, 0x22, 0x35, 0xf0, 0xaf, 0x1e, 0x60,
+ 0x00, 0xe0, 0xe1, 0x03,
+ 0x00, 0x0e, 0x3b, 0x22, 0x07, 0xf1, 0x1c, 0x40, 0x20, 0x57, 0x11, 0x10,
+ 0xee, 0x0f, 0x1f, 0x50,
+ 0x21, 0xf4, 0xcf, 0x0e, 0xf2, 0x17, 0x0f, 0xac, 0xf0, 0xe0, 0x02, 0xd0,
+ 0xf0, 0x0e, 0x3f, 0x40,
+ 0xfe, 0xc0, 0x01, 0x01, 0x5e, 0x0e, 0xf0, 0x37, 0x34, 0x0f, 0x1c, 0x70,
+ 0x22, 0x11, 0x00, 0x0e,
+ 0x0d, 0x00, 0x21, 0x52, 0xfe, 0xdd, 0xf0, 0xf7, 0xf3, 0xc1, 0xef, 0xb0,
+ 0xf1, 0x02, 0x46, 0x02,
+ 0x0f, 0xcd, 0xd0, 0xba, 0xec, 0x01, 0x44, 0x02, 0x3f, 0x2c, 0x00, 0xd1,
+ 0xe0, 0x10, 0x6f, 0x31,
+ 0xf0, 0x9c, 0xfd, 0xe0, 0x07, 0x20, 0x0d, 0xcd, 0xc0, 0x00, 0x01, 0x01,
+ 0xf0, 0x20, 0x71, 0x2f,
+ 0x0b, 0xdf, 0x2f, 0x3f, 0x13, 0xe7, 0xc6, 0xee, 0xdd, 0x10, 0x40, 0x04,
+ 0xd0, 0x01, 0x01, 0xde,
+ 0xff, 0x5f, 0x5e, 0xff, 0xc4, 0x17, 0x10, 0x0e, 0x00, 0x10, 0x00, 0xaf,
+ 0x0f, 0x30, 0x61, 0x00,
+ 0xfe, 0xf2, 0x16, 0x20, 0x1b, 0x1e, 0x00, 0x22, 0x02, 0x10, 0x06, 0xe2,
+ 0x00, 0x60, 0x40, 0xf1,
+ 0xd3, 0xd1, 0xe0, 0x0e, 0x60, 0x08, 0x1e, 0x0f, 0xf0, 0xf0, 0x21, 0x55,
+ 0xe1, 0xb0, 0xf2, 0xd3,
+ 0xf1, 0xf9, 0x0f, 0x11, 0x13, 0xfe, 0xf9, 0x2f, 0x4f, 0x50, 0x4f, 0x20,
+ 0x01, 0xc0, 0x0f, 0x33,
+ 0x23, 0x0e, 0x30, 0x57, 0xa7, 0xcf, 0xee, 0x21, 0x42, 0x00, 0xcf, 0xef,
+ 0x0f, 0x0e, 0xfc, 0x0f,
+ 0x00, 0x01, 0x42, 0x3e, 0xfb, 0xc0, 0x11, 0x44, 0x20, 0x0e, 0xfe, 0x20,
+ 0x12, 0xcc, 0xe9, 0xe0,
+ 0xe0, 0x02, 0x03, 0xce, 0x1c, 0x50, 0xf0, 0xb0, 0x01, 0x61, 0x01, 0xe4,
+ 0xd0, 0xec, 0x02, 0x33,
+ 0x31, 0xe0, 0x80, 0xd5, 0x02, 0x42, 0x34, 0x22, 0x30, 0xe0, 0xfe, 0x0d,
+ 0x2c, 0x03, 0x37, 0x31,
+ 0x1c, 0xa0, 0xdf, 0xe0, 0x20, 0x36, 0x10, 0xa0, 0xe0, 0x00, 0xdf, 0xac,
+ 0xf0, 0x22, 0x75, 0x3f,
+ 0x0b, 0xef, 0x0f, 0x00, 0x12, 0x22, 0xd0, 0xb1, 0x03, 0x10, 0xf0, 0xc0,
+ 0xfc, 0x01, 0x41, 0xed,
+ 0xbd, 0x0e, 0x18, 0x3c, 0xe0, 0xc0, 0xf2, 0x13, 0x03, 0xc0, 0x0d, 0x02,
+ 0x03, 0x17, 0x72, 0x63,
+ 0x1f, 0x08, 0xff, 0x00, 0x33, 0x3f, 0x2c, 0x00, 0x10, 0x00, 0xe2, 0xc1,
+ 0xe0, 0x03, 0x42, 0xf3,
+ 0xa0, 0xea, 0xef, 0x0f, 0x00, 0x10, 0x10, 0x1c, 0x0b, 0xed, 0x0c, 0x60,
+ 0x30, 0x01, 0xb1, 0x07,
+ 0x01, 0x1f, 0x29, 0x30, 0xe2, 0xc1, 0xd0, 0x0e, 0x20, 0x51, 0xe0, 0xc0,
+ 0xf0, 0xf2, 0xf2, 0x3f,
+ 0x3a, 0xe0, 0xd0, 0x44, 0x20, 0xdb, 0x9f, 0xe0, 0xf2, 0x12, 0x03, 0xf0,
+ 0xd0, 0x0d, 0xe0, 0x80,
+ 0xf4, 0x05, 0x11, 0x30, 0x01, 0x10, 0xed, 0xe0, 0x03, 0x55, 0x7f, 0x2c,
+ 0x00, 0xe1, 0xf7, 0x01,
+ 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x11, 0x13, 0x0e, 0x0f, 0x0a,
+ 0xe9, 0xde, 0xc0, 0xd3,
+ 0x01, 0x1f, 0xeb, 0x80, 0x03, 0xe0, 0xfe, 0x2d, 0x70, 0x0e, 0x01, 0x01,
+ 0x10, 0x00, 0x1f, 0x00,
+ 0xef, 0x1f, 0x67, 0x35, 0x70, 0x21, 0x86, 0x36, 0x0e, 0x39, 0x5e, 0x00,
+ 0xf1, 0xf7, 0x93, 0xdf,
+ 0x1d, 0x3f, 0x11, 0x23, 0x04, 0x31, 0x7e, 0x6f, 0x11, 0x12, 0x2a, 0x2d,
+ 0x3f, 0xd1, 0xa0, 0x06,
+ 0x22, 0x02, 0x00, 0xbe, 0x00, 0xf3, 0xe1, 0xc1, 0x00, 0x2d, 0xfd, 0xbd,
+ 0x1b, 0x5d, 0x1a, 0xf0,
+ 0xf3, 0x03, 0x40, 0xfd, 0xfb, 0x30, 0x24, 0x01, 0xc0, 0xe0, 0x03, 0x46,
+ 0x50, 0xef, 0xdb, 0x00,
+ 0x13, 0x30, 0x40, 0x40, 0x10, 0xcc, 0xdd, 0x0c, 0x5b, 0xfe, 0xaf, 0x03,
+ 0xe5, 0xdf, 0xbe, 0x00,
+ 0x03, 0x21, 0x0f, 0xfb, 0xdf, 0x00, 0x04, 0x04, 0x31, 0x5e, 0x2e, 0x10,
+ 0x03, 0x0b, 0xfe, 0x01,
+ 0x24, 0x0f, 0x2e, 0x51, 0x13, 0x3d, 0x6a, 0x10, 0xe2, 0xc3, 0x00, 0x2d,
+ 0x0a, 0x01, 0x06, 0x20,
+ 0x5e, 0x1f, 0xfe, 0xf0, 0x44, 0xf1, 0x91, 0x00, 0x3d, 0x3d, 0x10, 0xb5,
+ 0xe0, 0xee, 0x2f, 0x11,
+ 0x01, 0xad, 0xed, 0xb0, 0xf5, 0x05, 0x01, 0x0e, 0x2f, 0x42, 0x12, 0xf0,
+ 0xf0, 0x10, 0x61, 0x3c,
+ 0x1e, 0x22, 0x01, 0x0d, 0x2c, 0x53, 0x03, 0xef, 0x0e, 0x17, 0xf7, 0xe7,
+ 0xe0, 0xe0, 0xdf, 0x00,
+ 0xe1, 0x90, 0xee, 0xe1, 0x01, 0x0f, 0xfc, 0xd0, 0x00, 0x31, 0xde, 0x0e,
+ 0x74, 0x31, 0x0e, 0x1d,
+ 0xe2, 0xe7, 0x01, 0xe0, 0x83, 0xd0, 0x19, 0x5f, 0x00, 0xbf, 0xf0, 0x01,
+ 0x64, 0x00, 0x1d, 0x1f,
+ 0x21, 0x22, 0x00, 0xe0, 0xcd, 0xf1, 0x25, 0x30, 0xf1, 0xe0, 0xfe, 0xf2,
+ 0x34, 0x7f, 0x0e, 0xa4,
+ 0xe0, 0xf9, 0x1e, 0x4e, 0x1f, 0x00, 0xc1, 0xec, 0x0f, 0x51, 0x05, 0xfe,
+ 0x0a, 0x10, 0x03, 0xd6,
+ 0xd0, 0x1f, 0x5e, 0x5f, 0x10, 0x11, 0x1e, 0x0d, 0x00, 0x21, 0x51, 0x02,
+ 0x02, 0xe0, 0x00, 0xf2,
+ 0x05, 0xd0, 0xd2, 0x00, 0x0c, 0xe0, 0xf5, 0x41, 0x0a, 0x80, 0x95, 0x00,
+ 0x1f, 0x0c, 0xe0, 0xd1,
+ 0x05, 0x11, 0xf1, 0x02, 0x40, 0x0e, 0x2d, 0x11, 0x03, 0xc0, 0x0f, 0x6e,
+ 0x5e, 0x0a, 0x0b, 0xd0,
+ 0x01, 0x06, 0x01, 0x00, 0x11, 0x22, 0xd0, 0xf0, 0x01, 0x35, 0x60, 0xfe,
+ 0xde, 0xd0, 0xf0, 0xeb,
+ 0x0d, 0x7e, 0x3f, 0xe2, 0xd2, 0x0f, 0x0b, 0xde, 0x2e, 0x7e, 0x01, 0xa0,
+ 0xfa, 0xff, 0x02, 0x24,
+ 0x0f, 0x1c, 0x0f, 0xee, 0xf0, 0x02, 0x70, 0x20, 0x20, 0x00, 0xfc, 0x0a,
+ 0x3e, 0xcd, 0xe0, 0xc5,
+ 0x11, 0x11, 0x00, 0xb0, 0xca, 0xe0, 0x14, 0x12, 0xf1, 0xe0, 0x1d, 0x40,
+ 0x21, 0x42, 0x11, 0x20,
+ 0x41, 0x30, 0x30, 0x37, 0xf2, 0x92, 0xe0, 0xe0, 0x11, 0x01, 0x04, 0xf3,
+ 0xd0, 0x0b, 0x2f, 0x7d,
+ 0x1d, 0x00, 0xf3, 0xf0, 0x0d, 0x20, 0xfc, 0xe9, 0x10, 0x40, 0xe0, 0x80,
+ 0xf5, 0x03, 0x00, 0x0f,
+ 0x19, 0xf0, 0xb0, 0xe0, 0xf0, 0xd3, 0xf2, 0xd2, 0xd1, 0xf0, 0x00, 0x00,
+ 0x86, 0x04, 0x21, 0x0c,
+ 0xaa, 0x10, 0x51, 0x00, 0x0e, 0x0c, 0x30, 0x21, 0x30, 0x30, 0x13, 0x03,
+ 0x03, 0x02, 0x0f, 0x4c,
+ 0x40, 0x34, 0xd0, 0x80, 0xd2, 0x01, 0x2a, 0x2f, 0x30, 0xe0, 0xad, 0x07,
+ 0x05, 0x40, 0x2e, 0xfe,
+ 0xe0, 0xf1, 0x21, 0x10, 0x13, 0xdf, 0xfc, 0x00, 0xc0, 0xe2, 0x3f, 0x78,
+ 0x0f, 0xd0, 0x00, 0x42,
+ 0x00, 0x0e, 0x0c, 0x70, 0x12, 0xe1, 0xcd, 0xfb, 0x01, 0x06, 0x00, 0x0e,
+ 0xed, 0xd0, 0xd0, 0x0f,
+ 0x01, 0x24, 0xf4, 0x90, 0x0d, 0xfc, 0x10, 0x6f, 0x11, 0xf3, 0xae, 0x0b,
+ 0x10, 0x02, 0xf4, 0xf5,
+ 0xf0, 0x01, 0xe2, 0xe0, 0x0a, 0x20, 0x4e, 0x00, 0xd0, 0xe4, 0x22, 0x7e,
+ 0x3c, 0x51, 0x23, 0x10,
+ 0xd0, 0x00, 0x00, 0x31, 0x11, 0x37, 0x53, 0xfd, 0x9b, 0x0e, 0x0e, 0xfe,
+ 0x0f, 0xe3, 0x15, 0x13,
+ 0x00, 0x00, 0x0f, 0xde, 0xd2, 0x37, 0x32, 0xe0, 0xce, 0x1d, 0x4f, 0xee,
+ 0xcc, 0x2d, 0x7d, 0x6d,
+ 0x0e, 0x05, 0x13, 0xff, 0xdc, 0xf3, 0x14, 0x53, 0x04, 0xf2, 0xf0, 0x4f,
+ 0x23, 0x03, 0xcc, 0x0a,
+ 0x1e, 0x3d, 0xf0, 0x01, 0x0f, 0x6c, 0x00, 0xf4, 0x00, 0xfc, 0xfe, 0xd5,
+ 0xd6, 0xf0, 0xaf, 0xcf,
+ 0xe0, 0xff, 0xf0, 0x0f, 0x00, 0x4f, 0x31, 0xe2, 0x0f, 0x7f, 0x60, 0x04,
+ 0xd0, 0x1e, 0x2e, 0x0f,
+ 0x14, 0xd5, 0xb0, 0xee, 0xf0, 0x00, 0x2d, 0x1f, 0xcd, 0xce, 0xf7, 0xf7,
+ 0xf0, 0x0f, 0x1f, 0x20,
+ 0x00, 0xeb, 0x60, 0x40, 0x24, 0x0f, 0xcc, 0x00, 0x03, 0xc5, 0xf1, 0x3f,
+ 0x70, 0x02, 0x01, 0xed,
+ 0xf0, 0x16, 0x51, 0x2f, 0x0d, 0xfe, 0x12, 0x36, 0xd0, 0x9d, 0x0e, 0x31,
+ 0x27, 0xe0, 0xd0, 0x00,
+ 0x21, 0x20, 0x0d, 0xbf, 0x01, 0xe3, 0xde, 0x0c, 0x30, 0x1e, 0xbe, 0xdf,
+ 0xe0, 0xf7, 0x43, 0x51,
+ 0x22, 0x20, 0x10, 0x20, 0x01, 0x13, 0x2d, 0x29, 0x20, 0x33, 0x32, 0x08,
+ 0xbc, 0xf0, 0x05, 0xd1,
+ 0x40, 0x71, 0x70, 0x10, 0xfe, 0xd0, 0xef, 0xd0, 0x00, 0x01, 0x0e, 0x3b,
+ 0x0d, 0xd0, 0xc0, 0x05,
+ 0xee, 0xdc, 0x40, 0x21, 0xe4, 0x80, 0xdd, 0xf0, 0xf0, 0xf4, 0x0f, 0x2f,
+ 0x30, 0x30, 0x0e, 0x2d,
+ 0x0f, 0x01, 0x01, 0x7e, 0x3f, 0x4f, 0x3e, 0x0b, 0xe2, 0xe3, 0x89, 0xbd,
+ 0x0e, 0x02, 0x37, 0x03,
+ 0xcf, 0xfc, 0xff, 0xd0, 0x00, 0xf1, 0x0f, 0x2d, 0x2d, 0x5c, 0x3d, 0xfd,
+ 0xa1, 0xf3, 0xf7, 0x07,
+ 0x20, 0xed, 0xd0, 0x11, 0x26, 0x11, 0x30, 0x1f, 0x0f, 0x60, 0x71, 0x32,
+ 0x11, 0x00, 0x00, 0x13,
+ 0x30, 0x08, 0x0f, 0x02, 0x42, 0x10, 0x50, 0x30, 0x0f, 0x9e, 0xe0, 0xe3,
+ 0x00, 0x4b, 0xfd, 0xbc,
+ 0x00, 0x00, 0xe0, 0xc3, 0x05, 0x02, 0x0e, 0x0b, 0x10, 0x10, 0xf3, 0xf1,
+ 0x00, 0x10, 0x29, 0x20,
+ 0x32, 0x63, 0x2c, 0x1d, 0x00, 0x25, 0xc0, 0x81, 0xf1, 0x32, 0x50, 0x00,
+ 0xe0, 0xe1, 0xf1, 0x13,
+ 0x47, 0x06, 0x0f, 0x2d, 0x00, 0xf0, 0x23, 0x52, 0x1f, 0xfc, 0xd0, 0x1f,
+ 0x3f, 0x0b, 0x9f, 0xef,
+ 0x00, 0x11, 0xf4, 0xbf, 0x0c, 0x50, 0x23, 0x00, 0xcb, 0x0f, 0x00, 0x31,
+ 0x0f, 0xfb, 0xe0, 0x01,
+ 0x22, 0x0f, 0xef, 0x0e, 0x3e, 0x0f, 0xc6, 0xf3, 0xd1, 0xcf, 0x00, 0x67,
+ 0x52, 0xfd, 0xbe, 0x00,
+ 0x2f, 0x0e, 0x0b, 0x00, 0x03, 0xe2, 0xff, 0xfe, 0xb2, 0xe1, 0xf0, 0xc0,
+ 0x07, 0x07, 0x42, 0x1f,
+ 0x00, 0xd0, 0xff, 0x1f, 0x2f, 0x60, 0x34, 0x10, 0xff, 0xdd, 0x70, 0x44,
+ 0x23, 0x11, 0x00, 0xf5,
+ 0xd0, 0xe2, 0x00, 0xed, 0xeb, 0xed, 0x00, 0xf2, 0xc1, 0xaf, 0xeb, 0xef,
+ 0x0f, 0x13, 0xe1, 0x80,
+ 0x00, 0x06, 0x30, 0x2b, 0x2e, 0xe0, 0xb1, 0x10, 0x3c, 0x3c, 0x0d, 0x0f,
+ 0x10, 0x52, 0x03, 0xa0,
+ 0x09, 0x00, 0x50, 0x02, 0x01, 0xf1, 0xfe, 0x0d, 0x0f, 0x30, 0x13, 0x00,
+ 0x0e, 0xea, 0x0e, 0x1d,
+ 0xee, 0x83, 0xf6, 0x01, 0x10, 0x1b, 0x00, 0xf0, 0xd4, 0xc0, 0xcd, 0xcd,
+ 0xff, 0x1f, 0x3f, 0x2b,
+ 0x6f, 0x11, 0xf3, 0xe1, 0x1f, 0x40, 0x07, 0x17, 0x31, 0x6f, 0x0d, 0x0f,
+ 0x00, 0x03, 0xe4, 0xaf,
+ 0xfc, 0x21, 0x45, 0x00, 0xb1, 0x00, 0x00, 0xe0, 0x0f, 0x10, 0x0c, 0x0f,
+ 0x30, 0x01, 0x9c, 0x0d,
+ 0x00, 0x00, 0xf7, 0xa2, 0x00, 0xee, 0x03, 0x00, 0xf0, 0x10, 0x22, 0x06,
+ 0x21, 0x31, 0x0c, 0x4f,
+ 0x3d, 0x40, 0x2f, 0x20, 0x00, 0xb0, 0x01, 0xe4, 0x0f, 0x7d, 0x3f, 0x00,
+ 0xc1, 0x14, 0x12, 0x39,
+ 0x1a, 0x1e, 0xe0, 0xad, 0xed, 0x0f, 0x23, 0x07, 0xd0, 0x80, 0xf2, 0xf4,
+ 0xf0, 0xeb, 0x00, 0x71,
+ 0x16, 0x00, 0xdd, 0xef, 0x00, 0x50, 0x00, 0x1f, 0x02, 0x25, 0x20, 0x10,
+ 0x30, 0x01, 0x01, 0x01,
+ 0x05, 0xf2, 0x00, 0xd1, 0xff, 0x2e, 0x7d, 0x1e, 0xe0, 0xc6, 0x12, 0x6f,
+ 0x0c, 0x00, 0x23, 0x00,
+ 0xb1, 0xf5, 0xf0, 0xea, 0xf0, 0x00, 0x22, 0x0d, 0xab, 0x00, 0x02, 0x01,
+ 0x0f, 0x0f, 0x00, 0x1f,
+ 0x30, 0x13, 0xb0, 0xda, 0xed, 0x00, 0x04, 0xf1, 0xc0, 0x90, 0xe1, 0x00,
+ 0x11, 0xef, 0xef, 0x32,
+ 0x70, 0x3b, 0x00, 0xf7, 0x44, 0x7e, 0x2f, 0x11, 0xd4, 0xe1, 0x0f, 0xfa,
+ 0xff, 0x00, 0xf5, 0xd1,
+ 0x00, 0x20, 0x0e, 0xde, 0x0e, 0x50, 0x65, 0x02, 0xf0, 0xec, 0x2e, 0x7d,
+ 0x1f, 0x13, 0xe6, 0xe0,
+ 0xf0, 0x2d, 0x5e, 0x00, 0x00, 0xd5, 0x00, 0xfe, 0x0d, 0xf0, 0xef, 0x0e,
+ 0x60, 0x00, 0xe3, 0xf5,
+ 0xff, 0x0c, 0x00, 0x3f, 0x20, 0x03, 0xd5, 0xdf, 0x8c, 0xd0, 0x02, 0x46,
+ 0x30, 0x0e, 0xec, 0x30,
+ 0x72, 0x02, 0x04, 0xe0, 0xf0, 0x1c, 0x10, 0x13, 0xb0, 0xde, 0x00, 0x12,
+ 0xd6, 0x91, 0x02, 0x30,
+ 0x4b, 0x10, 0x21, 0xf2, 0xd4, 0x10, 0x5d, 0x00, 0xf0, 0xd0, 0xff, 0x0f,
+ 0xe4, 0x05, 0x02, 0xb0,
+ 0xf8, 0x10, 0x7f, 0x00, 0xc3, 0xf0, 0x0d, 0x0d, 0x01, 0xc0, 0x08, 0xee,
+ 0x50, 0x31, 0x01, 0xd0,
+ 0xff, 0xe0, 0x01, 0x02, 0x01, 0xee, 0xee, 0x0d, 0x2b, 0x70, 0x43, 0x03,
+ 0xbd, 0xfa, 0x10, 0x30,
+ 0x00, 0xb2, 0xd3, 0x00, 0xff, 0x1f, 0x15, 0x02, 0xce, 0x0c, 0x14, 0x46,
+ 0x41, 0x10, 0x1d, 0x2f,
+ 0x5f, 0x1f, 0x10, 0x36, 0x42, 0x30, 0x10, 0x12, 0x20, 0xf3, 0x03, 0x13,
+ 0x50, 0xcc, 0xce, 0x20,
+ 0x2e, 0xfc, 0xef, 0xdc, 0x88, 0xca, 0x10, 0x73, 0x01, 0x01, 0xd0, 0x00,
+ 0xec, 0x00, 0x01, 0x00,
+ 0xd0, 0xf2, 0xf0, 0xed, 0xcf, 0xff, 0x0d, 0x0e, 0xd0, 0xb6, 0x03, 0x40,
+ 0x6f, 0x03, 0x17, 0x00,
+ 0x0e, 0x0f, 0x02, 0x66, 0x00, 0xde, 0xe1, 0x00, 0x0d, 0x4d, 0x00, 0x22,
+ 0xe4, 0xb2, 0xf5, 0xf0,
+ 0x0f, 0x6d, 0x0f, 0x0d, 0xe0, 0x03, 0x2d, 0x18, 0x20, 0xf0, 0xd0, 0x00,
+ 0x50, 0x2d, 0x30, 0x24,
+ 0x00, 0xf0, 0xd0, 0x2e, 0x6c, 0x0f, 0x2b, 0xf0, 0xa0, 0x03, 0xde, 0xfc,
+ 0xec, 0xf1, 0xe7, 0x86,
+ 0x00, 0x1d, 0x70, 0x30, 0xff, 0xcf, 0x10, 0x11, 0x00, 0x2e, 0x00, 0x1f,
+ 0x00, 0xc3, 0x02, 0xe0,
+ 0x00, 0xf4, 0xc1, 0xe0, 0x0c, 0x44, 0x07, 0xc1, 0xdd, 0xfa, 0x0e, 0x0f,
+ 0x11, 0x42, 0x62, 0x10,
+ 0x26, 0x01, 0xdf, 0xbf, 0x00, 0x4f, 0x30, 0x04, 0xe3, 0x00, 0x1f, 0x0b,
+ 0xbc, 0xde, 0x00, 0x16,
+ 0xf0, 0xc0, 0xcf, 0xf0, 0x12, 0x34, 0x10, 0x00, 0x00, 0xf1, 0x03, 0x01,
+ 0xbb, 0xcd, 0xff, 0x10,
+ 0x70, 0x3d, 0x0b, 0xef, 0x10, 0x71, 0x13, 0x22, 0x11, 0x20, 0x25, 0x23,
+ 0xf1, 0xb3, 0xe2, 0x0f,
+ 0xfa, 0x00, 0x0d, 0xff, 0xc0, 0xd7, 0xf3, 0x30, 0x60, 0x0b, 0xf0, 0x22,
+ 0x31, 0x4d, 0x2e, 0x10,
+ 0x01, 0x2e, 0x4a, 0x0e, 0xef, 0x1f, 0x0f, 0x80, 0x8f, 0x0d, 0xfa, 0x0e,
+ 0x12, 0x23, 0x00, 0xe1,
+ 0xf0, 0x0f, 0x31, 0xe5, 0xf7, 0x32, 0x10, 0xbb, 0x00, 0x32, 0x32, 0xd1,
+ 0xb2, 0x01, 0x2f, 0x0a,
+ 0x0e, 0xd0, 0xd0, 0xd2, 0xf7, 0x01, 0xd0, 0xaf, 0xbe, 0xaf, 0xdf, 0x00,
+ 0x34, 0x31, 0xfc, 0xcd,
+ 0x10, 0x41, 0x22, 0x0f, 0x0a, 0x50, 0x40, 0x23, 0xe1, 0xbf, 0x0f, 0x03,
+ 0x14, 0x40, 0x04, 0xf4,
+ 0xf1, 0x0f, 0x1f, 0x31, 0x20, 0xca, 0xee, 0x00, 0x61, 0x2e, 0x0d, 0xe1,
+ 0xe7, 0xe1, 0xef, 0xfc,
+ 0x21, 0x45, 0xc1, 0xb0, 0xe1, 0xdf, 0xe9, 0xdf, 0x0e, 0x00, 0x42, 0xf0,
+ 0xcd, 0x2d, 0x70, 0x30,
+ 0xee, 0x01, 0x17, 0x06, 0xad, 0x10, 0x52, 0x02, 0x11, 0x01, 0x02, 0x10,
+ 0x42, 0x10, 0xed, 0xfe,
+ 0x00, 0x02, 0x0e, 0x1d, 0x3f, 0x00, 0xf2, 0xc3, 0xe1, 0x15, 0x2e, 0xa8,
+ 0xfe, 0x02, 0xf2, 0xe6,
+ 0x88, 0x9e, 0x55, 0x00, 0x0f, 0x0f, 0xec, 0x00, 0x55, 0x00, 0xdd, 0x00,
+ 0x02, 0x20, 0xf0, 0xfe,
+ 0x04, 0x10, 0xbc, 0x00, 0x12, 0x34, 0xfe, 0xde, 0xef, 0x11, 0x32, 0x00,
+ 0xca, 0x43, 0x10, 0xad,
+ 0x33, 0x13, 0xa8, 0x00, 0x43, 0xf0, 0xee, 0x11, 0x0f, 0xdd, 0x11, 0x43,
+ 0x0f, 0xed, 0xf0, 0x11,
+ 0x10, 0xfe, 0x03, 0x04, 0x21, 0x00, 0x10, 0x14, 0x02, 0x1f, 0x1d, 0x77,
+ 0x20, 0xab, 0x34, 0x31,
+ 0xdb, 0x00, 0x73, 0xf0, 0xcc, 0x12, 0x12, 0x0f, 0x00, 0xf0, 0xff, 0x00,
+ 0xdd, 0x03, 0xf1, 0xdf,
+ 0x1e, 0x2f, 0x00, 0x0f, 0x41, 0x75, 0x2e, 0xd9, 0xc0, 0x32, 0x24, 0x1f,
+ 0x0d, 0x00, 0xff, 0xae,
+ 0x14, 0x01, 0x0f, 0x20, 0xef, 0xdf, 0x03, 0xf3, 0xce, 0x0f, 0x1f, 0x25,
+ 0x77, 0xae, 0xfb, 0x22,
+ 0x00, 0x31, 0x03, 0xec, 0x00, 0x64, 0xfd, 0xfe, 0x17, 0x20, 0xed, 0xf0,
+ 0x23, 0x10, 0xde, 0x0e,
+ 0x40, 0x35, 0xe0, 0x8d, 0xec, 0x0f, 0x34, 0x32, 0xde, 0x0f, 0x00, 0xff,
+ 0x10, 0x11, 0x11, 0x33,
+ 0xab, 0xed, 0x02, 0x35, 0xf0, 0xde, 0xdd, 0xd0, 0x03, 0x50, 0x0f, 0xbc,
+ 0xf0, 0x05, 0x03, 0x1d,
+ 0xec, 0x11, 0x72, 0x00, 0xf8, 0xbf, 0x23, 0x42, 0x00, 0xdb, 0x00, 0x01,
+ 0x24, 0x0f, 0xff, 0x21,
+ 0x11, 0xf1, 0xdf, 0x30, 0x52, 0x00, 0xfb, 0x20, 0x63, 0xf0, 0xdd, 0xff,
+ 0xf1, 0x13, 0x43, 0x21,
+ 0xf0, 0xe0, 0x0d, 0x01, 0xf7, 0xd6, 0x9d, 0x0f, 0x10, 0xf0, 0x02, 0x2e,
+ 0x4d, 0x73, 0x02, 0xd8,
+ 0xef, 0x30, 0x43, 0x01, 0xff, 0xee, 0xfe, 0x01, 0x55, 0xee, 0xcf, 0x00,
+ 0xef, 0x22, 0x44, 0xff,
+ 0xbc, 0x0f, 0xf0, 0x34, 0x31, 0x30, 0x40, 0xba, 0xef, 0x00, 0x00, 0x15,
+ 0x22, 0xee, 0xed, 0x02,
+ 0xc0, 0xba, 0x11, 0x64, 0x00, 0xed, 0x10, 0x32, 0x00, 0x20, 0xdc, 0x0f,
+ 0x30, 0xe0, 0x9e, 0x00,
+ 0x01, 0x00, 0xec, 0xcd, 0x27, 0x52, 0xf0, 0xbc, 0xfe, 0x02, 0x46, 0x00,
+ 0xff, 0xf0, 0xff, 0xfe,
+ 0x00, 0x73, 0x27, 0xef, 0xcd, 0x00, 0x32, 0x01, 0x00, 0x12, 0x32, 0x00,
+ 0xcb, 0x00, 0x31, 0x00,
+ 0xbe, 0x0f, 0xf0, 0x02, 0x24, 0xf0, 0xdd, 0xde, 0x20, 0x47, 0x11, 0x0d,
+ 0x9c, 0x0e, 0x03, 0x57,
+ 0x00, 0x01, 0xff, 0x0c, 0xfe, 0x0e, 0x03, 0x55, 0x00, 0xfd, 0xe0, 0xe0,
+ 0xe0, 0xe2, 0xe0, 0xef,
+ 0xcf, 0x01, 0x02, 0x12, 0x40, 0xda, 0x0f, 0x52, 0x4d, 0x4c, 0x51, 0x02,
+ 0xf0, 0xea, 0x10, 0x43,
+ 0x34, 0x0f, 0xda, 0xce, 0x00, 0x13, 0x32, 0xf1, 0xc0, 0xdd, 0xde, 0x00,
+ 0x47, 0x00, 0xdf, 0x20,
+ 0x6f, 0x00, 0xf1, 0x00, 0xdf, 0x10, 0x24, 0x22, 0x11, 0x61, 0x10, 0xfa,
+ 0x00, 0x41, 0x45, 0xff,
+ 0xcd, 0x40, 0x31, 0xcd, 0xee, 0x37, 0x63, 0xff, 0xcb, 0xee, 0x01, 0x33,
+ 0x01, 0xee, 0xcf, 0x24,
+ 0x10, 0x0e, 0xbb, 0x12, 0x45, 0xef, 0xcd, 0x0f, 0x22, 0x23, 0xc0, 0xcd,
+ 0xf0, 0x04, 0x00, 0x20,
+ 0xf0, 0xdf, 0xf0, 0x21, 0x47, 0x30, 0x21, 0x40, 0xdf, 0xaa, 0x21, 0x62,
+ 0x02, 0xfe, 0x00, 0x05,
+ 0xdf, 0x0d, 0x31, 0x77, 0x2f, 0xdd, 0xfe, 0x11, 0x33, 0x00, 0x2f, 0x1e,
+ 0xff, 0xd0, 0x01, 0xf0,
+ 0x0f, 0xed, 0xa0, 0x07, 0x06, 0x0f, 0xde, 0xef, 0xa0, 0xff, 0x13, 0x40,
+ 0xfd, 0xcc, 0x00, 0x0f,
+ 0x70, 0x14, 0x00, 0x0e, 0x00, 0xfc, 0xfd, 0x22, 0x47, 0x00, 0xec, 0x00,
+ 0x53, 0x01, 0xe0, 0xe0,
+ 0xe1, 0x00, 0xf2, 0x01, 0x01, 0x33, 0x10, 0x1e, 0x4d, 0x20, 0x25, 0x42,
+ 0x1f, 0x9c, 0xe0, 0xe0,
+ 0x15, 0x24, 0xc0, 0x8b, 0xfe, 0xf1, 0x04, 0x00, 0x00, 0x30, 0x20, 0x0a,
+ 0xee, 0x41, 0x64, 0x10,
+ 0xfc, 0xff, 0x0f, 0x21, 0x22, 0x0f, 0xde, 0xae, 0xf1, 0x07, 0x32, 0xed,
+ 0xad, 0xff, 0x01, 0x30,
+ 0x00, 0x04, 0xd0, 0xed, 0x0d, 0x40, 0x17, 0x53, 0x02, 0xbc, 0x00, 0x00,
+ 0x2e, 0x00, 0x5a, 0x00,
+ 0xa5, 0x16, 0x9f, 0x21, 0x1e, 0x18, 0x8a, 0x21, 0xd2, 0x26, 0x62, 0x01,
+ 0xef, 0xf0, 0xfe, 0xca,
+ 0x0e, 0x30, 0xff, 0x8c, 0xed, 0x0f, 0x73, 0x11, 0x0c, 0x14, 0x54, 0xfb,
+ 0xec, 0x00, 0x01, 0xf0,
+ 0xde, 0x0d, 0x10, 0x73, 0x43, 0x10, 0x10, 0x10, 0x33, 0x57, 0x23, 0x10,
+ 0x10, 0x24, 0x25, 0x13,
+ 0x12, 0xe0, 0xd0, 0x00, 0xcf, 0xcc, 0xef, 0x00, 0x00, 0xec, 0xcc, 0xf0,
+ 0x12, 0x0d, 0xe8, 0x4f,
+ 0x70, 0x20, 0x0f, 0x20, 0x20, 0xc9, 0xde, 0x41, 0x53, 0x00, 0xeb, 0xde,
+ 0x00, 0x32, 0xff, 0x10,
+ 0x20, 0x00, 0xe0, 0x8c, 0x00, 0x04, 0xe1, 0xb0, 0xde, 0xcf, 0xdf, 0xc0,
+ 0xf2, 0xe3, 0xd0, 0xe1,
+ 0xe3, 0xce, 0xf1, 0x07, 0x0f, 0xeb, 0x21, 0x1e, 0xe9, 0x51, 0x10, 0xdd,
+ 0xde, 0xfe, 0x41, 0x0f,
+ 0xa8, 0xf0, 0x00, 0xee, 0xce, 0xef, 0x21, 0x20, 0xdc, 0xbd, 0x01, 0x02,
+ 0x00, 0xe0, 0xe0, 0xf2,
+ 0xe4, 0x90, 0xf3, 0xe3, 0xff, 0xdc, 0x01, 0x07, 0xe1, 0xe0, 0xf2, 0xf1,
+ 0xf1, 0x12, 0x53, 0x34,
+ 0x13, 0xf0, 0xe0, 0x74, 0x56, 0x10, 0x10, 0x10, 0x20, 0x61, 0x3f, 0x3d,
+ 0x60, 0x20, 0x2b, 0x2d,
+ 0x2f, 0x31, 0x2d, 0x09, 0x10, 0x00, 0xdf, 0xc0, 0xd3, 0xb2, 0xdf, 0xbc,
+ 0xef, 0xf4, 0xe3, 0xde,
+ 0xca, 0xee, 0xee, 0xf0, 0xf0, 0xe0, 0xef, 0xcc, 0xdf, 0xf2, 0x07, 0xc0,
+ 0xcf, 0xf0, 0x01, 0xf3,
+ 0xe0, 0x01, 0x24, 0x45, 0x21, 0x30, 0x61, 0x43, 0x44, 0x10, 0x21, 0x23,
+ 0x45, 0x12, 0x12, 0x02,
+ 0xe0, 0xf5, 0x24, 0x43, 0x02, 0xf1, 0xc1, 0xf3, 0x03, 0x01, 0x00, 0xc9,
+ 0xff, 0x0e, 0xca, 0x0f,
+ 0x60, 0x2f, 0x0d, 0xdb, 0x0e, 0x0e, 0xfc, 0x0e, 0x2e, 0x1d, 0x1b, 0x1e,
+ 0x0d, 0x0d, 0x2c, 0x3d,
+ 0x0d, 0xed, 0x1d, 0x7d, 0xea, 0x9e, 0xee, 0xdf, 0xef, 0x00, 0xdf, 0xde,
+ 0xde, 0xf0, 0xd1, 0x92,
+ 0xc2, 0xd0, 0x9d, 0xee, 0xdd, 0xdc, 0xef, 0xf3, 0xc0, 0xdf, 0xe0, 0x00,
+ 0x20, 0x47, 0x12, 0x21,
+ 0x46, 0x32, 0x20, 0x10, 0x2e, 0x30, 0x50, 0x2e, 0x20, 0x20, 0x11, 0x06,
+ 0x45, 0x32, 0x31, 0x55,
+ 0x24, 0x01, 0xd0, 0xcf, 0x02, 0x36, 0xe1, 0xd0, 0xf2, 0xe1, 0xc3, 0x92,
+ 0xe3, 0xe4, 0xd1, 0xb0,
+ 0xf1, 0x25, 0x43, 0x10, 0xe0, 0xf0, 0xf1, 0x02, 0x03, 0x24, 0x25, 0xe1,
+ 0x91, 0x03, 0x57, 0x11,
+ 0x00, 0x00, 0x10, 0x41, 0x23, 0x23, 0x25, 0x01, 0xf0, 0x00, 0x53, 0x46,
+ 0x12, 0x01, 0x02, 0x65,
+ 0x11, 0x11, 0x43, 0x33, 0x23, 0x55, 0x31, 0x32, 0x31, 0x42, 0x32, 0x41,
+ 0x53, 0x34, 0x35, 0x22,
+ 0x20, 0x20, 0x53, 0x34, 0x23, 0x21, 0x20, 0x1f, 0x1e, 0x10, 0x20, 0x0f,
+ 0xea, 0xae, 0xdd, 0xcc,
+ 0xfe, 0x00, 0x11, 0xff, 0xa9, 0xee, 0xe0, 0xef, 0xde, 0xbc, 0xdd, 0xcd,
+ 0xdf, 0xdf, 0xce, 0xee,
+ 0xce, 0xee, 0xe3, 0x07, 0xf3, 0xe0, 0xe0, 0xe0, 0xfe, 0x00, 0x24, 0x0f,
+ 0xea, 0x3d, 0x7d, 0x60,
+ 0x1f, 0x1a, 0x0d, 0x0b, 0x0e, 0x1e, 0x0d, 0x0e, 0x0f, 0xd0, 0xcf, 0xde,
+ 0xbc, 0xff, 0xd0, 0xbf,
+ 0xdd, 0xc0, 0xd0, 0xdf, 0xdf, 0xef, 0xee, 0xda, 0x00, 0x0f, 0x0d, 0x21,
+ 0x77, 0x26, 0x00, 0xcc,
+ 0xff, 0x77, 0x31, 0xef, 0xee, 0x21, 0x63, 0x00, 0x10, 0x20, 0x20, 0x30,
+ 0x20, 0x30, 0x31, 0x20,
+ 0x2f, 0x30, 0x30, 0x0f, 0xfc, 0x9d, 0xee, 0xef, 0xb8, 0xff, 0x03, 0x11,
+ 0xfd, 0xfd, 0xff, 0x03,
+ 0x14, 0x0f, 0xeb, 0xee, 0x21, 0x76, 0x32, 0x00, 0xf1, 0xf2, 0x13, 0x24,
+ 0x01, 0x20, 0x10, 0x20,
+ 0x73, 0x3f, 0x0b, 0x50, 0x42, 0x2f, 0x1c, 0x2e, 0x31, 0x40, 0x2e, 0x1c,
+ 0x1d, 0xfc, 0x10, 0x00,
+ 0xfb, 0xce, 0xde, 0x02, 0x11, 0xce, 0xbb, 0xde, 0xdd, 0x00, 0x03, 0x0f,
+ 0xcb, 0xcd, 0xf0, 0x00,
+ 0x0e, 0xea, 0x0f, 0x70, 0x40, 0x2d, 0x1a, 0x3f, 0x50, 0x2f, 0x3e, 0x1e,
+ 0x1d, 0x1f, 0x0d, 0x00,
+ 0x02, 0xef, 0xdd, 0x05, 0x26, 0x03, 0xc2, 0xd2, 0x03, 0x34, 0x03, 0x05,
+ 0x03, 0x82, 0xb3, 0x07,
+ 0x33, 0x02, 0xf1, 0x03, 0xf3, 0x92, 0xe1, 0x05, 0x44, 0x01, 0xd1, 0x02,
+ 0x44, 0x22, 0x11, 0x43,
+ 0x42, 0x33, 0x45, 0x42, 0x21, 0x11, 0x31, 0x32, 0x43, 0x12, 0x35, 0x32,
+ 0xde, 0xf0, 0x77, 0x33,
+ 0xf0, 0xce, 0x12, 0x22, 0xef, 0x00, 0x03, 0xf0, 0x02, 0x10, 0x0e, 0x20,
+ 0xfe, 0xba, 0x23, 0x22,
+ 0xee, 0x0e, 0x72, 0x20, 0x1c, 0x2f, 0x40, 0x4d, 0xf8, 0x0a, 0x30, 0x10,
+ 0xed, 0xbd, 0x0f, 0x0e,
+ 0xdc, 0xcf, 0xde, 0xad, 0xcb, 0xde, 0xff, 0xef, 0xde, 0xab, 0xee, 0xef,
+ 0xed, 0xff, 0xcd, 0xca,
+ 0xef, 0x00, 0x0f, 0xcd, 0xee, 0xf0, 0x04, 0x11, 0xf0, 0xf0, 0xe0, 0xef,
+ 0xee, 0xed, 0x0f, 0x42,
+ 0x34, 0x10, 0xd8, 0xfe, 0x71, 0x43, 0x20, 0x10, 0x30, 0x30, 0x11, 0x00,
+ 0x74, 0x21, 0x0e, 0xfd,
+ 0xdd, 0xf0, 0xdd, 0xd0, 0xd6, 0x8e, 0xdd, 0xe3, 0xe0, 0xb9, 0xcb, 0xf0,
+ 0xf1, 0xce, 0xdb, 0xdf,
+ 0xef, 0xef, 0xfe, 0xdd, 0xcd, 0x00, 0xff, 0xfe, 0xed, 0xed, 0x1e, 0x30,
+ 0x50, 0x3f, 0x28, 0x0b,
+ 0x3f, 0x50, 0x30, 0x20, 0x0d, 0xfc, 0xed, 0xff, 0xe0, 0xaf, 0xde, 0xcf,
+ 0xde, 0xab, 0xed, 0xf0,
+ 0xfe, 0xec, 0x0e, 0x00, 0x13, 0x0d, 0xfa, 0x20, 0x30, 0x00, 0xde, 0xef,
+ 0x34, 0x52, 0x00, 0x03,
+ 0x47, 0x53, 0x12, 0x0f, 0x3e, 0x50, 0x41, 0x42, 0x40, 0x30, 0x54, 0x21,
+ 0x30, 0x3e, 0x2b, 0x30,
+ 0x35, 0x10, 0x1f, 0x10, 0x12, 0xef, 0x88, 0xde, 0xff, 0xdd, 0xcb, 0xef,
+ 0xe0, 0xe0, 0xd0, 0xc0,
+ 0xe2, 0xd1, 0xd1, 0xd4, 0xd3, 0x91, 0xe4, 0xf4, 0xf3, 0x05, 0xe1, 0xf0,
+ 0x05, 0x44, 0x11, 0x22,
+ 0x53, 0x23, 0x32, 0x22, 0x45, 0x43, 0x21, 0x22, 0x24, 0x02, 0x03, 0x02,
+ 0x02, 0xe2, 0x04, 0x24,
+ 0x12, 0x03, 0x23, 0x02, 0x12, 0x76, 0x73, 0x11, 0x01, 0x02, 0x01, 0xf1,
+ 0x12, 0x1f, 0x0f, 0x00,
+ 0xea, 0xdd, 0x3e, 0x7f, 0x50, 0x1c, 0x2d, 0x3d, 0x3d, 0x3c, 0x2a, 0x3d,
+ 0x4f, 0x60, 0x2f, 0x1b,
+ 0x0d, 0x0d, 0x3e, 0x4e, 0x4e, 0x30, 0x40, 0x2d, 0x2f, 0x20, 0x2f, 0x21,
+ 0x20, 0x10, 0x0f, 0xef,
+ 0xd2, 0xb3, 0xd7, 0xc1, 0xb0, 0xf4, 0xf2, 0xf0, 0xfd, 0x00, 0x47, 0x36,
+ 0x10, 0x1f, 0x4f, 0x4e,
+ 0x2e, 0x3e, 0x31, 0x12, 0x30, 0x0e, 0x0b, 0xf0, 0x02, 0xcd, 0x8a, 0xf0,
+ 0xf1, 0xd0, 0xcc, 0xcd,
+ 0xff, 0x02, 0x01, 0xd0, 0xdf, 0xe0, 0xe7, 0xc1, 0xbf, 0xf0, 0xf5, 0xe2,
+ 0x04, 0xe3, 0xe2, 0xf2,
+ 0xf2, 0x04, 0x33, 0x21, 0x40, 0x41, 0x40, 0x52, 0x30, 0x1e, 0x2a, 0x1c,
+ 0x50, 0x40, 0x1c, 0x1f,
+ 0x31, 0x20, 0x31, 0x21, 0x22, 0x02, 0xef, 0x00, 0x77, 0x00, 0xfd, 0x01,
+ 0x47, 0x33, 0x12, 0xf0,
+ 0x88, 0x00, 0x45, 0x00, 0xcf, 0xf0, 0x00, 0x01, 0x21, 0x00, 0x0e, 0x00,
+ 0x53, 0x23, 0x30, 0x30,
+ 0x50, 0x33, 0x23, 0x2f, 0x1c, 0x2f, 0x43, 0x24, 0x0f, 0x02, 0x27, 0x13,
+ 0xf0, 0x12, 0x64, 0xf0,
+ 0x12, 0x57, 0xee, 0xbc, 0x00, 0x23, 0xf0, 0xef, 0xf0, 0xdf, 0xcf, 0xc0,
+ 0xe0, 0xd0, 0xd3, 0xbf,
+ 0xdc, 0xd0, 0xcf, 0xdb, 0xe0, 0xc0, 0xcd, 0xff, 0xf0, 0xdb, 0xcd, 0xee,
+ 0x12, 0x13, 0x0f, 0xfc,
+ 0xfd, 0xfb, 0x0f, 0x72, 0x0d, 0x08, 0xfd, 0x10, 0x20, 0xec, 0xde, 0xdf,
+ 0xbd, 0xef, 0xce, 0xac,
+ 0xee, 0xcb, 0xe0, 0x02, 0xd0, 0xf0, 0xf0, 0xe0, 0xff, 0x01, 0xf5, 0xf0,
+ 0xde, 0x0f, 0x33, 0x25,
+ 0x00, 0x30, 0x72, 0x62, 0x20, 0x20, 0x41, 0x35, 0x30, 0x30, 0x30, 0x30,
+ 0x64, 0x12, 0x1c, 0x0c,
+ 0x0e, 0xfe, 0x00, 0x0f, 0xdd, 0xfc, 0xc8, 0xee, 0x0e, 0x1f, 0xfc, 0xcb,
+ 0xff, 0x20, 0x41, 0x0f,
+ 0x0e, 0x30, 0x8b, 0xdd, 0x24, 0x57, 0xd0, 0x9c, 0x01, 0x00, 0xf0, 0x01,
+ 0xe0, 0xff, 0x02, 0x01,
+ 0xef, 0x01, 0x13, 0x11, 0x00, 0xf0, 0x24, 0x76, 0x21, 0x20, 0x31, 0x10,
+ 0x0f, 0x20, 0x1f, 0x0d,
+ 0x2f, 0x61, 0x10, 0x01, 0x14, 0x01, 0xc0, 0x04, 0xd0, 0x26, 0x75, 0x01,
+ 0xdf, 0xde, 0x01, 0x23,
+ 0x0e, 0xeb, 0xfd, 0x3f, 0x6f, 0x20, 0x31, 0x30, 0x40, 0x41, 0x1f, 0x0b,
+ 0x0f, 0x41, 0xfd, 0xc8,
+ 0xdd, 0xee, 0xef, 0xab, 0xed, 0xdd, 0xdd, 0xcc, 0xde, 0xdd, 0xbd, 0xed,
+ 0xdf, 0xe0, 0xd0, 0xcf,
+ 0xf0, 0xef, 0xdf, 0xd3, 0xd5, 0xd1, 0xaf, 0xff, 0x07, 0x43, 0x01, 0x10,
+ 0x22, 0x53, 0x47, 0x32,
+ 0x00, 0x10, 0x11, 0x32, 0x01, 0x00, 0x42, 0x44, 0x22, 0x35, 0x43, 0x00,
+ 0x0f, 0xde, 0xdc, 0x00,
+ 0x11, 0xff, 0xff, 0xd0, 0xb0, 0xe0, 0xde, 0xe0, 0x47, 0x23, 0xe1, 0xf2,
+ 0x04, 0x22, 0x02, 0xe1,
+ 0x03, 0x76, 0x72, 0x43, 0x36, 0x43, 0x42, 0x11, 0x10, 0x12, 0x00, 0x00,
+ 0xf0, 0x00, 0x12, 0x04,
+ 0xf2, 0x04, 0xe0, 0xce, 0x01, 0x13, 0x8c, 0xda, 0xf0, 0x01, 0xe0, 0xef,
+ 0xf0, 0x12, 0x12, 0x0f,
+ 0x21, 0x00, 0x32, 0x77, 0xf0, 0xc9, 0x00, 0x41, 0xf0, 0xcc, 0x21, 0x63,
+ 0x00, 0x0d, 0x0f, 0x20,
+ 0x0f, 0x0e, 0x01, 0x35, 0x00, 0xee, 0xfd, 0x30, 0x2f, 0x1e, 0x73, 0x1e,
+ 0x09, 0x0d, 0xcb, 0xdd,
+ 0xee, 0x20, 0x1e, 0xfc, 0xef, 0xdf, 0xe1, 0xc0, 0x8b, 0xbc, 0xe0, 0x03,
+ 0xf0, 0xce, 0xdf, 0xf0,
+ 0xf0, 0xb8, 0xf0, 0x00, 0x00, 0xed, 0x00, 0x11, 0x52, 0x25, 0x11, 0x20,
+ 0x42, 0x20, 0x11, 0x11,
+ 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0e, 0x45, 0x24, 0x11, 0x23, 0x47, 0x43,
+ 0x01, 0xdf, 0xbe, 0x13,
+ 0x25, 0xee, 0xbc, 0xf0, 0xf0, 0xdf, 0x9b, 0xed, 0x00, 0xee, 0xbc, 0x00,
+ 0x02, 0xdd, 0xcd, 0x01,
+ 0x04, 0xe0, 0xde, 0x00, 0x27, 0x23, 0x13, 0x54, 0x22, 0x31, 0x52, 0x77,
+ 0x22, 0x11, 0x20, 0x33,
+ 0x11, 0x10, 0x43, 0x21, 0x10, 0x23, 0x35, 0x31, 0xfe, 0xee, 0x10, 0x2f,
+ 0xdb, 0xdd, 0x10, 0x60,
+ 0x0c, 0xdc, 0x00, 0x31, 0x0f, 0x88, 0x10, 0x33, 0x0f, 0xef, 0x01, 0x10,
+ 0x11, 0x13, 0x24, 0x11,
+ 0x00, 0x01, 0x01, 0x11, 0x35, 0x12, 0xaf, 0xed, 0xf0, 0xff, 0x01, 0xe0,
+ 0x1f, 0x51, 0x0f, 0x03,
+ 0x12, 0xac, 0x06, 0x26, 0xd0, 0x8d, 0xf0, 0x14, 0x00, 0xbd, 0x0f, 0x15,
+ 0x32, 0x0f, 0xfb, 0x0e,
+ 0x71, 0x23, 0x0d, 0x0e, 0x30, 0x10, 0x1f, 0x0e, 0x0d, 0xfc, 0xee, 0x33,
+ 0x22, 0xcc, 0xdc, 0x51,
+ 0x31, 0xf9, 0xac, 0x0e, 0x30, 0xfb, 0xbc, 0xed, 0xfe, 0x10, 0xde, 0xce,
+ 0x00, 0xe0, 0xce, 0x03,
+ 0x16, 0xf0, 0xaf, 0xef, 0x02, 0x02, 0xdd, 0xef, 0x13, 0x35, 0x01, 0x01,
+ 0x34, 0x33, 0x23, 0x02,
+ 0x02, 0x77, 0x53, 0x01, 0x00, 0x03, 0x12, 0x11, 0x45, 0x22, 0xff, 0xdf,
+ 0x01, 0x32, 0x30, 0xf0,
+ 0xd1, 0xe0, 0xe1, 0xd2, 0x24, 0x12, 0x9f, 0xed, 0x00, 0x44, 0x57, 0x00,
+ 0x0f, 0x0e, 0x00, 0x42,
+ 0x11, 0xfc, 0xc9, 0x00, 0x21, 0x9e, 0xdb, 0x10, 0x01, 0x00, 0x0f, 0xed,
+ 0xdc, 0xee, 0x40, 0x72,
+ 0x00, 0x0d, 0x1d, 0x1c, 0x1f, 0x0d, 0xdc, 0xfe, 0x0e, 0xad, 0xc9, 0xee,
+ 0xf0, 0xe0, 0xbc, 0xff,
+ 0x02, 0xe0, 0xdf, 0xde, 0x01, 0x23, 0x00, 0xfb, 0x20, 0x33, 0x00, 0x2f,
+ 0x74, 0x23, 0x11, 0x77,
+ 0x02, 0x0a, 0x12, 0x55, 0x00, 0xfe, 0x01, 0x12, 0xf0, 0x01, 0x33, 0x11,
+ 0xc0, 0x00, 0x34, 0x44,
+ 0xe0, 0x00, 0x45, 0x00, 0xc0, 0xf0, 0x56, 0x21, 0xf0, 0xce, 0x12, 0x44,
+ 0x00, 0x01, 0x11, 0xd0,
+ 0xef, 0x33, 0x01, 0xb0, 0xcb, 0xe0, 0xf0, 0x9c, 0xed, 0x01, 0x14, 0xff,
+ 0xed, 0x21, 0x34, 0x00,
+ 0xdc, 0x1e, 0x73, 0x11, 0x0b, 0xfc, 0x10, 0x00, 0xcb, 0x41, 0x66, 0x00,
+ 0xdd, 0x10, 0x33, 0xff,
+ 0xca, 0x00, 0x41, 0x11, 0xcc, 0xee, 0x10, 0x20, 0xde, 0xcc, 0x21, 0x21,
+ 0xbe, 0xec, 0x12, 0x33,
+ 0xed, 0xdd, 0x00, 0x10, 0x00, 0x0e, 0x20, 0x52, 0xfa, 0xee, 0x51, 0x33,
+ 0xfd, 0xec, 0x32, 0x23,
+ 0xdd, 0x10, 0x10, 0xde, 0x04, 0x02, 0xab, 0x00, 0x00, 0xde, 0x2f, 0x53,
+ 0xee, 0xfa, 0x10, 0x0f,
+ 0x00, 0xfc, 0x30, 0x11, 0x9c, 0xcb, 0xf0, 0x22, 0x00, 0xb0, 0x11, 0x02,
+ 0xe0, 0xe1, 0x16, 0x13,
+ 0x8f, 0xf1, 0x27, 0x01, 0xdf, 0xe0, 0x13, 0x44, 0xff, 0xde, 0x00, 0x11,
+ 0x02, 0x13, 0xed, 0x10,
+ 0x37, 0xe0, 0x31, 0x72, 0x01, 0x13, 0x32, 0x21, 0x01, 0xaf, 0xdd, 0x67,
+ 0x37, 0xef, 0xdf, 0x20,
+ 0x21, 0x10, 0x21, 0x00, 0xbd, 0x11, 0x77, 0x10, 0xee, 0xf0, 0x21, 0x11,
+ 0x00, 0xef, 0x0e, 0x0f,
+ 0x20, 0x20, 0x0e, 0x2d, 0x3f, 0xf9, 0x10, 0x70, 0x0d, 0xb8, 0x10, 0x51,
+ 0x00, 0xed, 0xfe, 0x10,
+ 0x10, 0xef, 0xdd, 0xfe, 0x43, 0x12, 0xdd, 0xba, 0x00, 0x33, 0xff, 0xde,
+ 0x34, 0x00, 0xdf, 0x00,
+ 0xf0, 0x8a, 0xf0, 0x14, 0x00, 0xed, 0xcd, 0xff, 0x00, 0x00, 0x56, 0x11,
+ 0xbb, 0xee, 0x22, 0x12,
+ 0xde, 0xdf, 0xe0, 0x01, 0x13, 0xf0, 0xaf, 0xe0, 0x02, 0x24, 0xf2, 0x06,
+ 0x53, 0x00, 0xef, 0x01,
+ 0x24, 0x01, 0x43, 0x25, 0x01, 0x64, 0x01, 0xef, 0x02, 0x67, 0x01, 0x00,
+ 0x00, 0x01, 0xff, 0x22,
+ 0x33, 0xdd, 0xb9, 0x10, 0x43, 0x00, 0xdd, 0xff, 0x00, 0xef, 0x01, 0x22,
+ 0xef, 0xfe, 0x32, 0x00,
+ 0xcc, 0x21, 0x75, 0x0e, 0x10, 0x34, 0x0f, 0x0e, 0x31, 0x31, 0x65, 0x00,
+ 0xed, 0xeb, 0x63, 0x36,
+ 0xff, 0xac, 0x00, 0x43, 0x00, 0xec, 0xee, 0x32, 0x44, 0x0f, 0xfd, 0xff,
+ 0x10, 0x21, 0x21, 0xfe,
+ 0xec, 0x62, 0x23, 0x0a, 0xff, 0x21, 0x41, 0x10, 0x0f, 0x0f, 0x20, 0x0e,
+ 0xdc, 0x00, 0x66, 0x00,
+ 0xde, 0xf0, 0x13, 0x00, 0xcf, 0xd0, 0x02, 0x01, 0xd0, 0xef, 0xce, 0xd9,
+ 0x63, 0x13, 0xcc, 0x00,
+ 0x21, 0x0f, 0x00, 0x00, 0xed, 0x14, 0xde, 0x88, 0x01, 0x24, 0xe0, 0xbd,
+ 0xf0, 0x00, 0x04, 0x00,
+ 0xff, 0x00, 0x00, 0x12, 0x21, 0x20, 0x0f, 0x10, 0x00, 0xdd, 0x66, 0x44,
+ 0xbd, 0xdb, 0x44, 0x13,
+ 0xef, 0xd0, 0x44, 0x13, 0xcd, 0x00, 0x34, 0x00, 0x0f, 0x32, 0x23, 0x00,
+ 0x0f, 0x52, 0x12, 0xf0,
+ 0xda, 0x32, 0x64, 0xdd, 0xc9, 0x20, 0x64, 0x00, 0xed, 0x10, 0x44, 0x00,
+ 0xfd, 0x00, 0x43, 0x0f,
+ 0xec, 0x10, 0x32, 0xff, 0xee, 0x21, 0x45, 0x00, 0xbe, 0xfe, 0x01, 0x03,
+ 0x01, 0x03, 0xf0, 0x9a,
+ 0x01, 0x25, 0xf0, 0xac, 0x01, 0x24, 0x00, 0xee, 0xef, 0x01, 0x23, 0x12,
+ 0x00, 0xfe, 0xfe, 0x33,
+ 0x67, 0x00, 0xef, 0x00, 0x10, 0x00, 0xcd, 0x0f, 0x57, 0x00, 0xaa, 0x00,
+ 0x33, 0x0f, 0xef, 0x22,
+ 0x31, 0xdd, 0xdd, 0x43, 0x45, 0xff, 0xbc, 0x00, 0x55, 0x00, 0xdd, 0xff,
+ 0x00, 0x00, 0xfd, 0xef,
+ 0x0e, 0x0e, 0xfe, 0xdc, 0xed, 0x1f, 0x2e, 0x98, 0xee, 0x10, 0x1f, 0xed,
+ 0xdc, 0x10, 0x50, 0xfe,
+ 0xdd, 0x0e, 0x10, 0x0e, 0xcb, 0x21, 0x31, 0xcd, 0xcd, 0xff, 0x26, 0x43,
+ 0xf0, 0xce, 0x10, 0x13,
+ 0xef, 0x12, 0x12, 0xcc, 0x23, 0x12, 0xdf, 0xfe, 0xf0, 0xf1, 0xbd, 0xa8,
+ 0x00, 0x23, 0xf0, 0xdc,
+ 0xee, 0x01, 0x45, 0xef, 0xff, 0xff, 0xac, 0xee, 0x21, 0x34, 0x10, 0xde,
+ 0xed, 0x77, 0x43, 0x00,
+ 0xcd, 0x02, 0x45, 0x00, 0xef, 0x11, 0x21, 0xf0, 0xff, 0x00, 0x00, 0x00,
+ 0x92, 0x00, 0xbf, 0x00,
+ 0x91, 0xe8, 0xc5, 0xde, 0x81, 0xe6, 0x2e, 0xdb, 0xdd, 0xce, 0x47, 0x12,
+ 0xe0, 0x43, 0x77, 0xef,
+ 0xcc, 0x21, 0x22, 0xee, 0xbc, 0x10, 0x22, 0xff, 0xbb, 0x10, 0x33, 0x00,
+ 0xbc, 0x0e, 0x12, 0x11,
+ 0xee, 0x00, 0x01, 0xf0, 0x00, 0x03, 0x00, 0xff, 0x02, 0xbb, 0xdc, 0x13,
+ 0x32, 0xff, 0x00, 0x14,
+ 0x76, 0x00, 0xef, 0x23, 0x77, 0x01, 0xee, 0xf0, 0x24, 0xf0, 0xcf, 0x00,
+ 0x02, 0x22, 0x34, 0x00,
+ 0x9d, 0x00, 0x35, 0x10, 0x10, 0x31, 0x32, 0x00, 0x0f, 0x0f, 0x00, 0x33,
+ 0x03, 0xdd, 0xee, 0x37,
+ 0xd1, 0x8e, 0xe0, 0x47, 0x00, 0xce, 0x00, 0x21, 0x12, 0xdf, 0xcd, 0x21,
+ 0x44, 0xff, 0x9a, 0x01,
+ 0x12, 0xff, 0xed, 0x00, 0x12, 0xec, 0xdc, 0x21, 0x21, 0xfe, 0xec, 0x1e,
+ 0x50, 0x00, 0x2c, 0x2f,
+ 0xdd, 0x30, 0x21, 0xbb, 0xf0, 0x21, 0x02, 0x9f, 0xff, 0x00, 0xde, 0xb8,
+ 0xff, 0x34, 0x00, 0xab,
+ 0x00, 0x44, 0x00, 0xf0, 0x0f, 0x12, 0x22, 0x00, 0x00, 0x24, 0x21, 0x21,
+ 0x52, 0x23, 0x00, 0x10,
+ 0x45, 0x33, 0x0f, 0x31, 0x72, 0x0e, 0x0c, 0x21, 0x42, 0x0e, 0x10, 0x2f,
+ 0xf8, 0x0e, 0x20, 0x73,
+ 0x10, 0xf9, 0xee, 0x1f, 0x30, 0xff, 0xfd, 0xfe, 0x0e, 0x20, 0x02, 0xc0,
+ 0xdd, 0xf0, 0xf3, 0xb0,
+ 0xcc, 0xef, 0x47, 0x14, 0xdf, 0xf0, 0x02, 0x11, 0x10, 0x42, 0x33, 0xf0,
+ 0xfe, 0x0e, 0x52, 0x47,
+ 0x00, 0x00, 0x75, 0x22, 0xec, 0xff, 0x65, 0x11, 0xfe, 0xff, 0x11, 0x23,
+ 0x10, 0x0f, 0x11, 0x56,
+ 0x21, 0x00, 0x00, 0x00, 0x23, 0x10, 0x56, 0x22, 0xe0, 0xde, 0x21, 0x64,
+ 0x00, 0xfe, 0xdc, 0x11,
+ 0x75, 0x0e, 0xed, 0x00, 0x10, 0x01, 0x10, 0x1f, 0x0d, 0xed, 0x0f, 0x0f,
+ 0xec, 0xf0, 0x45, 0x44,
+ 0x00, 0x00, 0x00, 0x34, 0x43, 0x00, 0xe0, 0x17, 0x63, 0x01, 0xe0, 0xe1,
+ 0x35, 0x23, 0x02, 0xe1,
+ 0xf2, 0x65, 0x21, 0x01, 0x32, 0x22, 0x00, 0x22, 0x64, 0x11, 0x31, 0x11,
+ 0xff, 0x10, 0x75, 0x32,
+ 0x00, 0x00, 0xb8, 0x00, 0x53, 0x00, 0xbb, 0x00, 0x11, 0x00, 0xee, 0x00,
+ 0x01, 0x00, 0xff, 0xde,
+ 0xf0, 0x01, 0xef, 0xcd, 0x03, 0x13, 0xca, 0xcd, 0x12, 0x33, 0xec, 0xee,
+ 0x44, 0x02, 0xbe, 0xff,
+ 0x11, 0x00, 0xdc, 0xdc, 0x0f, 0xf0, 0x9b, 0xfd, 0x0f, 0xec, 0xec, 0xdc,
+ 0xef, 0x20, 0xff, 0xab,
+ 0x0f, 0x00, 0x00, 0xff, 0xfe, 0x0f, 0x00, 0xff, 0xbc, 0x10, 0x00, 0xed,
+ 0xcd, 0xfe, 0xcc, 0xdc,
+ 0xee, 0xe0, 0xbc, 0xcc, 0xe0, 0x01, 0xdd, 0xa9, 0x00, 0x00, 0xd0, 0xcc,
+ 0x0f, 0x10, 0xff, 0x0e,
+ 0x40, 0x31, 0x0c, 0xcb, 0x30, 0x73, 0x13, 0xfe, 0xeb, 0x10, 0x14, 0xe0,
+ 0xad, 0xfe, 0x00, 0xd0,
+ 0xcd, 0xe0, 0xf2, 0xef, 0xdd, 0xe2, 0x07, 0x02, 0xdf, 0xcd, 0xed, 0x00,
+ 0x20, 0xfe, 0xb8, 0xdd,
+ 0xee, 0xdf, 0x10, 0x22, 0xbc, 0xba, 0xff, 0x00, 0x0f, 0xeb, 0xef, 0x2f,
+ 0x2f, 0x10, 0x30, 0xee,
+ 0xcd, 0xfd, 0xfd, 0xbc, 0xed, 0x1f, 0xfe, 0xaa, 0xcd, 0xfd, 0x00, 0xfe,
+ 0x9b, 0xfc, 0x00, 0x00,
+ 0xef, 0xee, 0xff, 0xff, 0xef, 0xbc, 0xde, 0xe0, 0x00, 0x02, 0xf2, 0xf0,
+ 0x11, 0x45, 0x31, 0x42,
+ 0x55, 0x10, 0x31, 0x42, 0x34, 0x32, 0x21, 0x32, 0x33, 0x42, 0x1f, 0x35,
+ 0x43, 0x00, 0x0e, 0x43,
+ 0x34, 0x0e, 0x0f, 0x22, 0xdc, 0xbe, 0x01, 0x00, 0xb2, 0xd4, 0xe4, 0xf7,
+ 0xc1, 0xc0, 0xe1, 0xd4,
+ 0x04, 0xe3, 0xd0, 0xc0, 0xf1, 0x15, 0x01, 0xf0, 0x23, 0x66, 0x01, 0xf1,
+ 0x00, 0x24, 0x33, 0x03,
+ 0x24, 0x12, 0x01, 0x74, 0x65, 0x12, 0x01, 0x10, 0x54, 0x44, 0x00, 0x00,
+ 0x32, 0x44, 0x11, 0x00,
+ 0x12, 0x46, 0x22, 0x00, 0xf0, 0x01, 0x34, 0x22, 0x00, 0x10, 0x52, 0x10,
+ 0x1f, 0x2f, 0x2f, 0x6f,
+ 0x3d, 0x3e, 0x2c, 0x3c, 0x5e, 0x3e, 0x2d, 0x3e, 0x40, 0x1a, 0x1d, 0x2d,
+ 0x3b, 0x3e, 0x3f, 0x0d,
+ 0xfb, 0xfd, 0x0e, 0xde, 0x9b, 0xe0, 0x00, 0xce, 0xbd, 0xef, 0x00, 0xdf,
+ 0xcb, 0xf0, 0x02, 0xd1,
+ 0xcf, 0xf1, 0xe1, 0xc0, 0x00, 0xf3, 0xf4, 0xf0, 0xef, 0xed, 0x00, 0x2f,
+ 0xfb, 0xcd, 0x00, 0x14,
+ 0x0f, 0xdd, 0x13, 0x76, 0x00, 0x10, 0x42, 0x35, 0x32, 0x42, 0x34, 0x43,
+ 0x54, 0x23, 0x24, 0x36,
+ 0x32, 0x00, 0x00, 0x03, 0x14, 0x42, 0x01, 0x02, 0x04, 0xf1, 0x11, 0x73,
+ 0x54, 0x01, 0x00, 0x31,
+ 0x23, 0x00, 0x10, 0x3f, 0x71, 0x22, 0x1e, 0x0c, 0x10, 0x3e, 0x3e, 0x42,
+ 0x33, 0x42, 0x35, 0x21,
+ 0x21, 0x31, 0x34, 0x47, 0x24, 0x23, 0x32, 0x11, 0x33, 0x75, 0x31, 0x22,
+ 0x77, 0x11, 0x00, 0xfe,
+ 0x01, 0x33, 0x10, 0x00, 0x10, 0x10, 0x00, 0x12, 0x31, 0x32, 0x72, 0x11,
+ 0x10, 0x44, 0x41, 0x1a,
+ 0x0d, 0x40, 0x43, 0x2e, 0x3d, 0x50, 0x20, 0x18, 0x20, 0x42, 0x20, 0x1d,
+ 0x20, 0x22, 0x0d, 0xa8,
+ 0xfe, 0x01, 0xdf, 0xbc, 0xef, 0xe0, 0xef, 0xdd, 0xbc, 0xe0, 0xd2, 0xbe,
+ 0xdb, 0xd0, 0xd0, 0xce,
+ 0xd0, 0xe0, 0xe0, 0xed, 0xef, 0x02, 0xf0, 0x0d, 0xeb, 0x0e, 0x20, 0x1e,
+ 0x0e, 0x77, 0x33, 0x10,
+ 0x1d, 0x43, 0x25, 0x00, 0xbb, 0xef, 0x03, 0x01, 0xbe, 0xf1, 0x05, 0xd0,
+ 0xae, 0xee, 0xf3, 0x05,
+ 0xe0, 0xd0, 0xe1, 0xf1, 0xf1, 0xd0, 0xdf, 0xce, 0xe9, 0x0e, 0x00, 0xe0,
+ 0xef, 0xee, 0x21, 0x77,
+ 0x01, 0xee, 0x00, 0x23, 0x33, 0x0f, 0x0e, 0x70, 0x30, 0x1a, 0x2e, 0x50,
+ 0x3f, 0x3a, 0x3f, 0x5f,
+ 0x30, 0x40, 0x1b, 0x2e, 0x2f, 0x0d, 0xfe, 0x10, 0xff, 0x99, 0xde, 0xee,
+ 0xee, 0xcd, 0xee, 0xe0,
+ 0xdd, 0xdb, 0x0f, 0xf0, 0x00, 0xee, 0xec, 0x00, 0x21, 0x0e, 0xbc, 0x20,
+ 0x64, 0x0f, 0xda, 0xce,
+ 0xff, 0x10, 0x0f, 0x0f, 0x0f, 0xec, 0xcc, 0xfe, 0x00, 0xee, 0xbd, 0xdd,
+ 0xde, 0xcd, 0xcc, 0xd0,
+ 0xb0, 0xc0, 0xcc, 0xd0, 0xe7, 0xe2, 0xc0, 0xe3, 0x04, 0x03, 0xf1, 0xdf,
+ 0xec, 0x33, 0x20, 0x99,
+ 0xed, 0x00, 0x00, 0xfc, 0xfe, 0x20, 0x00, 0x0c, 0xde, 0x0f, 0x6e, 0x0b,
+ 0x0d, 0xfe, 0x0d, 0x0c,
+ 0x2e, 0x0e, 0xcb, 0xfd, 0x1f, 0x40, 0x00, 0xee, 0xae, 0xbd, 0xdf, 0xe2,
+ 0xe3, 0xae, 0xef, 0x03,
+ 0x07, 0x03, 0x04, 0x02, 0x01, 0x03, 0x03, 0x34, 0x22, 0x22, 0x10, 0x0f,
+ 0x63, 0x25, 0x12, 0x24,
+ 0x30, 0x4f, 0x20, 0x0f, 0x12, 0x57, 0x01, 0xce, 0xce, 0x00, 0x11, 0xf1,
+ 0xd2, 0xe4, 0xe1, 0xf5,
+ 0x36, 0x73, 0x22, 0x12, 0x22, 0x55, 0x33, 0x22, 0x00, 0x33, 0x74, 0x22,
+ 0x00, 0x0f, 0x32, 0x55,
+ 0x11, 0x11, 0x03, 0x00, 0xf0, 0xff, 0x10, 0x10, 0xc9, 0xde, 0xfe, 0x00,
+ 0xe0, 0xdd, 0xbb, 0xfe,
+ 0xee, 0x0e, 0x1e, 0x0e, 0xbe, 0xde, 0x01, 0x52, 0xea, 0x9a, 0xf0, 0x00,
+ 0x02, 0xe0, 0xd0, 0xc0,
+ 0xde, 0xce, 0xe0, 0xe0, 0xd0, 0xc0, 0xd2, 0xe3, 0x06, 0x24, 0x00, 0x20,
+ 0x64, 0x21, 0x40, 0x64,
+ 0x34, 0x10, 0x2e, 0x53, 0x35, 0x20, 0x1e, 0x2f, 0x32, 0x35, 0x10, 0x10,
+ 0x31, 0x21, 0x02, 0x04,
+ 0x14, 0xf1, 0xb0, 0x03, 0x17, 0x00, 0xc0, 0x02, 0x34, 0x00, 0xe0, 0x01,
+ 0x12, 0x02, 0xd0, 0xe0,
+ 0x00, 0x02, 0x8f, 0xaa, 0x00, 0x02, 0x00, 0xda, 0xee, 0x00, 0x10, 0x0d,
+ 0xed, 0xdf, 0xcc, 0x0f,
+ 0x70, 0x1f, 0x0b, 0x30, 0x53, 0x1f, 0x0b, 0x00, 0x10, 0x00, 0xee, 0xef,
+ 0xe0, 0xcf, 0xbc, 0xdd,
+ 0xee, 0xd0, 0xe0, 0x89, 0xdc, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x12, 0x02,
+ 0x13, 0x76, 0x22, 0x22,
+ 0x25, 0x43, 0x43, 0x13, 0x11, 0x45, 0x43, 0x22, 0x22, 0x43, 0x20, 0x3e,
+ 0x4e, 0x31, 0x44, 0x2d,
+ 0x0b, 0x20, 0x21, 0x1f, 0x0d, 0xce, 0xe1, 0xd2, 0xa9, 0xdd, 0xde, 0xee,
+ 0xee, 0xdd, 0xcc, 0xed,
+ 0x00, 0x14, 0x01, 0xec, 0xfe, 0x00, 0x00, 0x04, 0x05, 0xf2, 0xd1, 0x03,
+ 0xf3, 0xe4, 0x43, 0x74,
+ 0x02, 0x00, 0x22, 0x73, 0x32, 0x23, 0x10, 0x23, 0x46, 0x10, 0x30, 0x56,
+ 0x02, 0x00, 0x00, 0x02,
+ 0xf2, 0xf0, 0xf0, 0xc0, 0xe0, 0x07, 0x00, 0xee, 0x00, 0x77, 0x42, 0x00,
+ 0x10, 0x61, 0x44, 0x12,
+ 0x0f, 0x0d, 0x1f, 0x51, 0x21, 0x1d, 0x19, 0x20, 0x3f, 0x4f, 0x2d, 0x2d,
+ 0x2e, 0x1d, 0x1c, 0x2d,
+ 0x40, 0x0e, 0xc8, 0xde, 0xee, 0xf0, 0xdf, 0xd0, 0xaf, 0xbd, 0xff, 0x04,
+ 0x01, 0xdd, 0xd0, 0x04,
+ 0x03, 0xf0, 0x02, 0x56, 0x22, 0x12, 0x01, 0x12, 0x42, 0x44, 0x12, 0x12,
+ 0x25, 0x13, 0x01, 0xef,
+ 0x22, 0x74, 0x40, 0x0d, 0x0e, 0x31, 0x2f, 0x2f, 0x33, 0xe8, 0x89, 0xff,
+ 0xf0, 0xe0, 0xbf, 0xef,
+ 0xef, 0xe0, 0xd1, 0xcf, 0xce, 0xf0, 0xf3, 0xd0, 0xe3, 0xf5, 0xc0, 0xde,
+ 0x00, 0x04, 0x12, 0x10,
+ 0x30, 0x66, 0x23, 0x20, 0x50, 0x43, 0x25, 0x20, 0x3d, 0x4d, 0x21, 0x00,
+ 0xfa, 0x00, 0x20, 0x0d,
+ 0xba, 0xff, 0x01, 0xf0, 0xd0, 0xf2, 0x01, 0xc0, 0xef, 0x03, 0x01, 0xce,
+ 0xfe, 0x03, 0xdf, 0x88,
+ 0xdb, 0xf0, 0xf0, 0xc0, 0xbe, 0xff, 0xf0, 0x03, 0xf2, 0xd2, 0xf4, 0xe0,
+ 0xff, 0x21, 0x67, 0x22,
+ 0x20, 0x43, 0x22, 0x22, 0x32, 0x32, 0x00, 0x10, 0x37, 0x43, 0x45, 0x12,
+ 0x11, 0x01, 0x32, 0x75,
+ 0x10, 0x00, 0x00, 0x32, 0x12, 0xff, 0xfe, 0xff, 0xcd, 0xe0, 0xe0, 0x8d,
+ 0xd9, 0xbe, 0xef, 0xde,
+ 0xf0, 0xee, 0xdd, 0xec, 0xec, 0xeb, 0xdd, 0x00, 0xee, 0xeb, 0xfe, 0x3f,
+ 0x2c, 0xfd, 0x0c, 0x0e,
+ 0x0e, 0xed, 0x0d, 0x6e, 0xee, 0xab, 0xee, 0x00, 0xf1, 0x8c, 0xbc, 0xf0,
+ 0xee, 0xdd, 0xce, 0xef,
+ 0xc9, 0xbc, 0xfd, 0xff, 0xef, 0xec, 0xed, 0x0f, 0x00, 0x0f, 0xee, 0x0f,
+ 0xed, 0xfd, 0xff, 0x00,
+ 0x34, 0x55, 0x10, 0x10, 0x43, 0x46, 0x20, 0x30, 0x62, 0x21, 0x10, 0x20,
+ 0x32, 0x20, 0x2e, 0x4f,
+ 0x2d, 0x2e, 0x2e, 0x1c, 0x2f, 0x2d, 0x0b, 0x0e, 0xcc, 0xcb, 0xcb, 0xac,
+ 0xee, 0x00, 0x00, 0xdf,
+ 0xee, 0xef, 0xef, 0xf1, 0x36, 0x11, 0xa0, 0xdf, 0x02, 0x04, 0xf2, 0xb0,
+ 0xf0, 0x15, 0x03, 0x02,
+ 0x13, 0x65, 0x23, 0x22, 0x12, 0x24, 0x53, 0x23, 0x23, 0x26, 0x43, 0x23,
+ 0x01, 0x02, 0x13, 0x13,
+ 0x03, 0x17, 0x42, 0x01, 0xf1, 0x01, 0x63, 0x23, 0x00, 0xf2, 0x46, 0x62,
+ 0x10, 0x00, 0x11, 0x35,
+ 0x20, 0x20, 0x40, 0x31, 0x40, 0x4f, 0x3f, 0x50, 0x2f, 0x2b, 0x2d, 0x3c,
+ 0x3e, 0x3e, 0x3d, 0x2d,
+ 0xf8, 0xcd, 0xee, 0xff, 0xed, 0x9c, 0xee, 0xee, 0xbb, 0xdd, 0xde, 0xef,
+ 0xde, 0xcd, 0xed, 0xdf,
+ 0xef, 0xd0, 0xee, 0xde, 0xe0, 0xf2, 0x03, 0xf0, 0xc0, 0xe2, 0x47, 0x55,
+ 0x00, 0xff, 0x20, 0x23,
+ 0x01, 0x10, 0x50, 0x31, 0x00, 0x01, 0x02, 0xb0, 0xe5, 0xd0, 0xaf, 0xf3,
+ 0xf7, 0xe4, 0xaf, 0xef,
+ 0xe1, 0xf4, 0xe1, 0x04, 0x04, 0xe2, 0xf2, 0x06, 0x12, 0x02, 0x12, 0x12,
+ 0x03, 0x34, 0x74, 0x63,
+ 0x11, 0x21, 0x22, 0x45, 0x32, 0x32, 0x30, 0x11, 0x73, 0x35, 0x10, 0x0f,
+ 0xfe, 0x0f, 0x00, 0x02,
+ 0x00, 0xfd, 0x0c, 0x31, 0x43, 0x0e, 0x1d, 0x4f, 0x2d, 0x1a, 0x40, 0x61,
+ 0x1d, 0x2d, 0x2d, 0x1c,
+ 0x20, 0x3f, 0x0c, 0x01, 0xdf, 0x88, 0xde, 0xef, 0xf0, 0xdd, 0xdd, 0x0f,
+ 0x20, 0x1d, 0x09, 0x2d,
+ 0x7f, 0x50, 0x20, 0x1c, 0x0c, 0x0b, 0x1e, 0x1e, 0x0d, 0xfd, 0x0f, 0xfe,
+ 0xdc, 0xff, 0x30, 0x10,
+ 0xbd, 0xe0, 0x00, 0xce, 0xcc, 0xcc, 0xcf, 0xe1, 0xd2, 0xc0, 0xbb, 0xce,
+ 0xe0, 0xe2, 0xf3, 0xe3,
+ 0xd0, 0xbe, 0xf0, 0xf4, 0x00, 0x12, 0x07, 0x00, 0xed, 0x00, 0x25, 0x02,
+ 0xde, 0xcd, 0xef, 0xf0,
+ 0xe1, 0xc0, 0xac, 0xed, 0x00, 0xf0, 0xf3, 0xff, 0xd9, 0xff, 0xf1, 0xe4,
+ 0xa0, 0xee, 0xe1, 0xd2,
+ 0xb3, 0xc3, 0xf2, 0xf2, 0xe3, 0xe3, 0xbc, 0xe9, 0xf0, 0xf1, 0x03, 0x01,
+ 0x0f, 0x10, 0x27, 0x13,
+ 0x14, 0x35, 0xf0, 0xc0, 0x43, 0x75, 0x21, 0x43, 0x34, 0x43, 0x43, 0x53,
+ 0x23, 0x22, 0x43, 0x47,
+ 0x33, 0x31, 0x21, 0x32, 0x43, 0x42, 0x10, 0x10, 0x34, 0x32, 0x31, 0x10,
+ 0x0c, 0x0f, 0x1e, 0x0e,
+ 0x10, 0x1c, 0x0b, 0x0e, 0x50, 0x51, 0x34, 0x0f, 0x0c, 0x00, 0x3f, 0x1f,
+ 0xfb, 0x0f, 0x0f, 0xfe,
+ 0xec, 0xec, 0xcf, 0xb0, 0xd0, 0x9d, 0xca, 0xdf, 0xee, 0xd0, 0xdd, 0xcd,
+ 0xf0, 0xee, 0xf0, 0xe1,
+ 0xd0, 0xef, 0x01, 0xe7, 0xc3, 0x07, 0x02, 0xf2, 0x81, 0xe1, 0xf2, 0x02,
+ 0xe4, 0x03, 0x02, 0xf2,
+ 0x03, 0x77, 0x56, 0x20, 0x00, 0x20, 0x21, 0x40, 0x20, 0x21, 0x20, 0x10,
+ 0x1e, 0x2e, 0x4d, 0x2d,
+ 0x09, 0xbd, 0xed, 0xeb, 0xff, 0xde, 0xac, 0xcd, 0xed, 0xdd, 0xcb, 0xde,
+ 0xdf, 0xdf, 0xdf, 0xef,
+ 0xae, 0xdb, 0xff, 0x0f, 0xff, 0x00, 0x43, 0x11, 0x00, 0x22, 0x63, 0x25,
+ 0x12, 0x22, 0x33, 0x22,
+ 0x11, 0x35, 0x33, 0x11, 0x20, 0x10, 0x00, 0xe0, 0xd0, 0x00, 0x55, 0x01,
+ 0x00, 0x3e, 0x6d, 0x2a,
+ 0x1e, 0x20, 0x73, 0x1e, 0x0d, 0x0d, 0x20, 0x47, 0x22, 0x00, 0x22, 0x27,
+ 0x12, 0x01, 0x52, 0x52,
+ 0x33, 0x52, 0x11, 0x20, 0x2f, 0x5f, 0x2f, 0x3d, 0x2d, 0x4f, 0x2f, 0x0a,
+ 0x0e, 0xed, 0xce, 0xdc,
+ 0xbd, 0xd9, 0xcd, 0xe0, 0xe0, 0xdc, 0xff, 0xf1, 0xdf, 0xba, 0xee, 0xf1,
+ 0xf0, 0xad, 0xdc, 0xe0,
+ 0xe3, 0xd0, 0xe1, 0xe6, 0xe2, 0xe3, 0x03, 0x03, 0x02, 0x15, 0x74, 0x23,
+ 0x23, 0x65, 0x33, 0x22,
+ 0x33, 0x55, 0x33, 0x24, 0x22, 0x11, 0x11, 0x23, 0x33, 0x13, 0x10, 0x10,
+ 0x21, 0x30, 0x20, 0x40,
+ 0x63, 0x26, 0x42, 0x21, 0x32, 0x44, 0x24, 0x22, 0x24, 0x22, 0x53, 0x13,
+ 0x0e, 0xed, 0x02, 0x05,
+ 0x01, 0xb0, 0xdf, 0xc0, 0xdf, 0xef, 0xef, 0xcc, 0xf2, 0x06, 0xde, 0xbb,
+ 0xff, 0xf0, 0x0f, 0x00,
+ 0x1f, 0x00, 0x0e, 0xeb, 0xfe, 0x0e, 0xfc, 0xff, 0x41, 0xe0, 0x8c, 0x8c,
+ 0xff, 0xf0, 0xef, 0xc9,
+ 0xed, 0xde, 0xde, 0xcd, 0xdd, 0xed, 0xdc, 0xcb, 0xed, 0xed, 0x0e, 0xed,
+ 0xed, 0xee, 0xed, 0xec,
+ 0x0e, 0xf0, 0x9c, 0xcb, 0xef, 0xf0, 0xf1, 0x01, 0xe0, 0xdd, 0xf0, 0x00,
+ 0x10, 0xff, 0xed, 0x22,
+ 0x42, 0x2f, 0x1b, 0xd8, 0xad, 0x1d, 0x4f, 0x10, 0x1d, 0x1a, 0x1e, 0x0e,
+ 0x1e, 0x7e, 0x5e, 0x0b,
+ 0xfc, 0x0e, 0x1f, 0xfe, 0xbb, 0x0f, 0x30, 0x00, 0xde, 0xcd, 0xff, 0xf0,
+ 0x02, 0x00, 0xd0, 0xe0,
+ 0xe2, 0x24, 0x63, 0x14, 0x45, 0x22, 0x21, 0x11, 0xee, 0xbc, 0x00, 0x00,
+ 0xe0, 0xae, 0xed, 0x04,
+ 0xe3, 0xde, 0x05, 0x45, 0x01, 0xe2, 0x04, 0x12, 0xf0, 0xb0, 0x00, 0x02,
+ 0x02, 0x23, 0x02, 0x23,
+ 0x77, 0x73, 0x32, 0x20, 0x34, 0x55, 0x23, 0x33, 0x23, 0x23, 0x32, 0x32,
+ 0x42, 0x10, 0x2d, 0x2c,
+ 0x2a, 0x2e, 0x3f, 0x5f, 0x3d, 0x1d, 0x1c, 0x1e, 0x60, 0x2e, 0x09, 0x0d,
+ 0x0f, 0x20, 0x00, 0xee,
+ 0xbe, 0xdc, 0xef, 0x00, 0x04, 0xc0, 0xbd, 0xdc, 0x00, 0x14, 0x32, 0x44,
+ 0x13, 0x14, 0x25, 0x22,
+ 0x23, 0x74, 0x12, 0x02, 0x02, 0x13, 0x04, 0xf0, 0xc0, 0xf2, 0xf2, 0xb0,
+ 0xdf, 0xd0, 0xb1, 0xdf,
+ 0xcd, 0xd0, 0xd3, 0xb1, 0xd9, 0xcd, 0xce, 0xe2, 0xf2, 0xe0, 0x07, 0xf4,
+ 0xf1, 0x03, 0x14, 0x12,
+ 0x43, 0x77, 0x25, 0x32, 0x22, 0x30, 0x32, 0x32, 0x43, 0x31, 0x05, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x63, 0x09, 0x96, 0x28, 0xec, 0x08, 0x98, 0x27, 0xcb, 0xfc, 0x30, 0x0e,
+ 0x88, 0x9d, 0x17, 0x20,
+ 0xed, 0xdd, 0x44, 0x31, 0xfe, 0xef, 0x44, 0x00, 0x0b, 0x11, 0x61, 0x01,
+ 0xff, 0xe0, 0x12, 0xfd,
+ 0x89, 0x02, 0x15, 0x10, 0xfd, 0xee, 0x01, 0x04, 0x10, 0x1f, 0x20, 0x34,
+ 0x01, 0xee, 0x0f, 0x22,
+ 0x21, 0xbc, 0xec, 0x62, 0x55, 0x00, 0x0c, 0x0f, 0x00, 0x10, 0x20, 0x22,
+ 0x10, 0x40, 0x25, 0x0f,
+ 0xce, 0xfd, 0x24, 0x77, 0x00, 0xdc, 0x00, 0x10, 0x10, 0x21, 0x10, 0x1e,
+ 0x10, 0x2f, 0xee, 0xbf,
+ 0x26, 0x62, 0xf0, 0xdc, 0xf0, 0x22, 0xe0, 0xbd, 0x0e, 0xff, 0x04, 0x01,
+ 0x9d, 0xed, 0xf0, 0xf1,
+ 0x05, 0x22, 0xde, 0xdf, 0xe0, 0xa3, 0x06, 0x00, 0x01, 0xf0, 0xac, 0xff,
+ 0xf0, 0x05, 0xf0, 0xdc,
+ 0xcf, 0xd0, 0xf0, 0xd2, 0xe0, 0xbe, 0x02, 0xd4, 0xae, 0xf1, 0x07, 0xf5,
+ 0xcd, 0xde, 0xd1, 0xe2,
+ 0x00, 0xe0, 0xbc, 0xe0, 0x00, 0x56, 0x00, 0xd0, 0xdd, 0x12, 0x12, 0x00,
+ 0xff, 0xc0, 0xe0, 0xff,
+ 0xcb, 0x12, 0x12, 0xee, 0xad, 0xfe, 0x01, 0x07, 0x21, 0xfd, 0xcf, 0xf0,
+ 0x03, 0x0e, 0x0e, 0xc0,
+ 0xe0, 0xd3, 0x00, 0xd0, 0x2f, 0xd0, 0x8d, 0xa5, 0x07, 0x11, 0xef, 0xed,
+ 0xf0, 0x02, 0x26, 0x01,
+ 0xdd, 0xef, 0xf0, 0xf1, 0xff, 0xda, 0x73, 0xf4, 0xce, 0x30, 0x74, 0x30,
+ 0xce, 0xe9, 0x13, 0x74,
+ 0x00, 0x0d, 0x0d, 0x01, 0x12, 0x00, 0x0c, 0x20, 0x10, 0x0e, 0xee, 0xce,
+ 0x26, 0x33, 0xfe, 0xfd,
+ 0x0f, 0x72, 0x37, 0x22, 0x0d, 0x0c, 0x40, 0x43, 0x42, 0x0c, 0xec, 0x00,
+ 0x40, 0x10, 0x0f, 0xff,
+ 0x00, 0x2c, 0x00, 0x26, 0x30, 0x00, 0x1f, 0x60, 0xf0, 0x0f, 0x20, 0x01,
+ 0xa0, 0xfe, 0x56, 0x22,
+ 0xed, 0xf0, 0x24, 0x0e, 0x1f, 0x23, 0xd1, 0xf0, 0x41, 0x41, 0xf0, 0xca,
+ 0x00, 0x1f, 0x02, 0x14,
+ 0x00, 0xcf, 0xac, 0xff, 0xe2, 0x25, 0x31, 0xdc, 0xbd, 0x00, 0x02, 0xf3,
+ 0x16, 0x40, 0xdc, 0xd0,
+ 0x22, 0x42, 0xce, 0xbd, 0x15, 0x10, 0x22, 0x22, 0xce, 0xdd, 0xe1, 0x36,
+ 0x62, 0x10, 0x0d, 0xce,
+ 0x0d, 0x01, 0x57, 0x02, 0x1c, 0x1f, 0x20, 0x00, 0x10, 0x40, 0x11, 0x0f,
+ 0xfe, 0x0e, 0xed, 0x32,
+ 0x77, 0x4e, 0xa8, 0x00, 0x32, 0x11, 0x0f, 0x0f, 0x00, 0x00, 0x1f, 0x21,
+ 0x33, 0x0e, 0x0d, 0x53,
+ 0x36, 0x30, 0x0e, 0xdd, 0x21, 0x32, 0x01, 0x00, 0x00, 0x0c, 0x40, 0x50,
+ 0x56, 0x00, 0xce, 0x11,
+ 0x43, 0x0d, 0xdd, 0x17, 0x41, 0x0e, 0x0d, 0xe0, 0xd0, 0xee, 0x60, 0x42,
+ 0x00, 0xf0, 0x12, 0x41,
+ 0x40, 0x33, 0x36, 0x62, 0x10, 0x2c, 0x00, 0x20, 0x10, 0x25, 0x21, 0x0d,
+ 0xec, 0x01, 0x03, 0xff,
+ 0xe0, 0x16, 0x60, 0xfe, 0xf0, 0x56, 0x30, 0xcb, 0xde, 0x00, 0x43, 0x12,
+ 0xfe, 0xcb, 0x10, 0x40,
+ 0xf1, 0xe2, 0x12, 0x32, 0xff, 0x88, 0xaf, 0x12, 0x14, 0x0f, 0x00, 0x0f,
+ 0xdf, 0x0f, 0x13, 0x20,
+ 0xec, 0x0e, 0x33, 0x02, 0x90, 0x0e, 0x02, 0x25, 0xde, 0xbc, 0x01, 0x03,
+ 0x03, 0xdc, 0xdc, 0x01,
+ 0x15, 0x0f, 0xcd, 0xcd, 0xce, 0x15, 0x42, 0x00, 0xbc, 0x01, 0xf2, 0xf0,
+ 0x00, 0x54, 0x00, 0x0e,
+ 0x03, 0x11, 0x3a, 0xfe, 0x20, 0x5f, 0x1c, 0x1f, 0x52, 0x12, 0x0c, 0x42,
+ 0x11, 0xfb, 0xdc, 0x11,
+ 0x56, 0x11, 0x10, 0x0f, 0xcc, 0x0f, 0x02, 0x13, 0x1f, 0x00, 0x13, 0x0f,
+ 0xed, 0xe4, 0xb1, 0xed,
+ 0x3f, 0x22, 0x8d, 0xef, 0x37, 0x00, 0xbc, 0xf1, 0x12, 0x01, 0xee, 0xdb,
+ 0x02, 0x25, 0x31, 0x21,
+ 0xce, 0xcd, 0xf2, 0xd2, 0xcf, 0x21, 0x57, 0xce, 0xde, 0x00, 0x00, 0x14,
+ 0xff, 0xcc, 0xe0, 0x12,
+ 0x36, 0xae, 0xde, 0x02, 0x12, 0xdf, 0xdd, 0x01, 0x20, 0x0f, 0x9d, 0x01,
+ 0x12, 0x0c, 0x2f, 0x0f,
+ 0x88, 0xfe, 0x03, 0x35, 0x0f, 0xed, 0xef, 0xf0, 0x12, 0x63, 0x0e, 0xee,
+ 0xd0, 0xf0, 0x25, 0x22,
+ 0xcd, 0xde, 0x14, 0x32, 0xe1, 0xc0, 0x00, 0x24, 0x10, 0x32, 0x76, 0x00,
+ 0xee, 0x52, 0x23, 0x1c,
+ 0x0e, 0x21, 0x20, 0x0a, 0x00, 0x21, 0x20, 0x60, 0x22, 0xd9, 0xae, 0x22,
+ 0x45, 0xfd, 0xdd, 0x32,
+ 0x34, 0xfe, 0xde, 0x0f, 0x10, 0x01, 0x76, 0x10, 0xfc, 0x10, 0x32, 0xf0,
+ 0x10, 0x73, 0x30, 0xfd,
+ 0xde, 0x11, 0x55, 0x11, 0xff, 0xed, 0x01, 0x00, 0x0f, 0xfd, 0xf1, 0x27,
+ 0x32, 0x0f, 0xdc, 0xe0,
+ 0xf2, 0xb0, 0x8a, 0x0e, 0x11, 0x43, 0x0e, 0xfe, 0x00, 0x00, 0x01, 0x03,
+ 0x43, 0x22, 0xba, 0xe0,
+ 0x06, 0x10, 0x0f, 0x10, 0x10, 0xc0, 0xe0, 0x32, 0x02, 0xcf, 0xfe, 0xf0,
+ 0x06, 0x11, 0xfd, 0xcd,
+ 0x74, 0x76, 0x00, 0xea, 0xf0, 0x32, 0x10, 0x0f, 0x00, 0xfe, 0xdf, 0x10,
+ 0x30, 0xf0, 0xdd, 0x10,
+ 0x71, 0x00, 0x22, 0x27, 0x30, 0x70, 0x23, 0x0e, 0x00, 0x31, 0x42, 0x21,
+ 0x00, 0x3f, 0x1e, 0xfa,
+ 0xdd, 0x20, 0x2f, 0xf0, 0x56, 0x70, 0x1c, 0x0f, 0x22, 0x23, 0x2e, 0x5f,
+ 0x30, 0xf9, 0xac, 0x11,
+ 0x25, 0x00, 0x00, 0x0e, 0xef, 0xfe, 0x21, 0x57, 0x1f, 0x0e, 0x1f, 0x11,
+ 0x10, 0x10, 0x32, 0x30,
+ 0x1d, 0x2f, 0x00, 0xf3, 0xc0, 0x8c, 0xe0, 0x06, 0xe1, 0xe0, 0xde, 0x80,
+ 0xd0, 0x02, 0x03, 0x00,
+ 0xc0, 0x04, 0xfc, 0xdd, 0x07, 0x03, 0xef, 0x8c, 0xf0, 0x03, 0x01, 0xd0,
+ 0xf0, 0xf0, 0xee, 0x11,
+ 0x02, 0xae, 0x00, 0x14, 0xfa, 0xff, 0x23, 0x46, 0xee, 0xfc, 0x00, 0x10,
+ 0xf3, 0x00, 0x11, 0xdb,
+ 0xef, 0x21, 0x10, 0xb0, 0x8e, 0xef, 0xf0, 0x27, 0x20, 0xed, 0xd0, 0xdf,
+ 0x02, 0xf0, 0xe0, 0xc1,
+ 0xa2, 0xd2, 0x03, 0xfd, 0xfd, 0x9d, 0xfc, 0x02, 0x17, 0x14, 0x0e, 0xdd,
+ 0xef, 0x00, 0x04, 0x11,
+ 0x03, 0x10, 0xd1, 0xbe, 0xbc, 0x02, 0x07, 0x00, 0x02, 0xb1, 0xca, 0x0f,
+ 0x0f, 0xe1, 0xf3, 0x0f,
+ 0x0c, 0x54, 0x13, 0xcb, 0xcd, 0x52, 0x47, 0x00, 0xfe, 0x10, 0x0f, 0x10,
+ 0x30, 0x31, 0x0d, 0x60,
+ 0x00, 0x0d, 0x0c, 0x41, 0x12, 0x10, 0x1d, 0x21, 0x15, 0x20, 0xee, 0x99,
+ 0x00, 0x31, 0x12, 0xef,
+ 0xce, 0x01, 0x22, 0xff, 0xe0, 0x12, 0xf1, 0x8d, 0xf0, 0x03, 0x05, 0xe4,
+ 0x01, 0xef, 0xde, 0x04,
+ 0x26, 0xae, 0xcd, 0x01, 0x57, 0x0f, 0xee, 0x00, 0xff, 0x00, 0x14, 0xff,
+ 0xbb, 0x00, 0x24, 0x22,
+ 0xde, 0xce, 0xdf, 0xd0, 0x00, 0x02, 0x32, 0x02, 0x9e, 0xea, 0xf0, 0xf2,
+ 0x13, 0x00, 0x1f, 0xff,
+ 0xc0, 0x04, 0xf0, 0x0f, 0x20, 0x11, 0xb0, 0xcb, 0x02, 0x14, 0x00, 0x99,
+ 0x00, 0x00, 0xf0, 0x13,
+ 0x2e, 0x0b, 0x20, 0x42, 0x41, 0x21, 0xee, 0xbb, 0x00, 0x10, 0x52, 0x02,
+ 0xff, 0xeb, 0xf0, 0x11,
+ 0x45, 0x10, 0xfe, 0xe0, 0xf1, 0x10, 0x0e, 0xf0, 0x73, 0x70, 0xfa, 0xd0,
+ 0x10, 0x34, 0x22, 0xcd,
+ 0xeb, 0x32, 0x65, 0x00, 0xdf, 0x0e, 0x20, 0x12, 0x20, 0x10, 0xfe, 0x20,
+ 0x72, 0x0d, 0x09, 0x10,
+ 0x10, 0x32, 0x41, 0x31, 0x0d, 0x2f, 0x32, 0x44, 0x52, 0x20, 0x21, 0x10,
+ 0xfb, 0xed, 0x12, 0x43,
+ 0xdb, 0xde, 0x20, 0x06, 0x8e, 0xcd, 0x00, 0x02, 0xe0, 0xe2, 0x01, 0x30,
+ 0x11, 0xf0, 0x9a, 0x0f,
+ 0x00, 0x21, 0x01, 0xcf, 0xee, 0x00, 0xd0, 0x00, 0x17, 0xd2, 0xf0, 0x20,
+ 0x11, 0x42, 0xee, 0x88,
+ 0x02, 0x45, 0x00, 0xee, 0xe0, 0xec, 0xbd, 0xe0, 0xe6, 0x12, 0xfe, 0x8d,
+ 0xf0, 0xe0, 0x00, 0x14,
+ 0xe0, 0xb0, 0x01, 0x00, 0xfe, 0xcd, 0xf0, 0x06, 0xf0, 0xdb, 0xf2, 0x01,
+ 0x00, 0xbd, 0x00, 0x06,
+ 0x20, 0xf0, 0xbf, 0xed, 0x00, 0x75, 0x00, 0xe0, 0x0f, 0x0f, 0x10, 0x00,
+ 0x02, 0x00, 0x11, 0x00,
+ 0xdc, 0x10, 0x31, 0xef, 0x88, 0x00, 0x02, 0x10, 0xef, 0xe1, 0x00, 0x0f,
+ 0xf1, 0x91, 0xef, 0x26,
+ 0x12, 0xf0, 0xf0, 0x10, 0x10, 0xcc, 0xde, 0x13, 0x77, 0x20, 0x0f, 0xdc,
+ 0x00, 0x21, 0x35, 0x31,
+ 0x10, 0xec, 0x10, 0x76, 0x30, 0xee, 0xe0, 0x0e, 0x10, 0x10, 0xff, 0x02,
+ 0xe2, 0xdf, 0xed, 0x00,
+ 0x10, 0xd2, 0x8c, 0xcf, 0x12, 0x17, 0x42, 0x30, 0xfa, 0x10, 0x51, 0x20,
+ 0x32, 0x50, 0x1e, 0x3e,
+ 0x0e, 0x0d, 0x50, 0x31, 0x10, 0x08, 0x0e, 0x42, 0x76, 0x10, 0x0e, 0x10,
+ 0x2f, 0x20, 0x20, 0x13,
+ 0x0f, 0xe9, 0x20, 0x64, 0xff, 0xdf, 0x10, 0x12, 0x00, 0xce, 0x01, 0x05,
+ 0xdf, 0x00, 0x11, 0x30,
+ 0x2f, 0x52, 0xf2, 0x0e, 0x71, 0x41, 0x0b, 0xee, 0xfc, 0x12, 0x67, 0x00,
+ 0xe0, 0x1d, 0x20, 0x13,
+ 0xf1, 0xcf, 0xff, 0xee, 0x02, 0x65, 0x00, 0x0f, 0x10, 0x0f, 0x0f, 0xf0,
+ 0x41, 0x54, 0x0e, 0xcc,
+ 0x12, 0x35, 0x00, 0xff, 0x00, 0x12, 0x32, 0x10, 0x60, 0x03, 0xf8, 0x0f,
+ 0x60, 0x0e, 0x0f, 0x23,
+ 0x30, 0xf8, 0xff, 0x0f, 0x72, 0x44, 0x0e, 0xfa, 0x00, 0x30, 0x21, 0x51,
+ 0x0f, 0x0e, 0x1f, 0x10,
+ 0x10, 0x1f, 0x34, 0x12, 0x1e, 0x10, 0x27, 0xcf, 0xdc, 0x01, 0x01, 0x23,
+ 0x41, 0xdf, 0x9c, 0xf0,
+ 0x00, 0x34, 0xff, 0xee, 0x25, 0xf0, 0xdd, 0x00, 0x11, 0x31, 0x01, 0x71,
+ 0x71, 0x10, 0x0c, 0xfd,
+ 0x0e, 0x4f, 0x1e, 0x13, 0x12, 0x0b, 0x1e, 0x67, 0x32, 0x12, 0x00, 0x0f,
+ 0x0f, 0x20, 0x73, 0x37,
+ 0xfe, 0xed, 0x01, 0x32, 0x00, 0x0d, 0x00, 0xeb, 0xf0, 0x53, 0x67, 0x11,
+ 0xfd, 0xdd, 0x10, 0xfe,
+ 0xee, 0x24, 0x66, 0xee, 0xce, 0x11, 0x10, 0x01, 0x02, 0x00, 0xea, 0x11,
+ 0x73, 0x00, 0xbd, 0x00,
+ 0x34, 0x10, 0x00, 0x00, 0x00, 0xec, 0x10, 0x25, 0x00, 0xf0, 0xfd, 0x8e,
+ 0xe0, 0xf5, 0x45, 0x00,
+ 0xbc, 0xef, 0x00, 0xf1, 0xf1, 0xef, 0xdc, 0x12, 0x25, 0x00, 0xfe, 0xcf,
+ 0xd0, 0x00, 0x1f, 0x51,
+ 0xf2, 0xc0, 0x11, 0x2e, 0xfa, 0x22, 0x35, 0xce, 0x0f, 0x70, 0x01, 0x00,
+ 0x1e, 0x0d, 0x0f, 0xf0,
+ 0x57, 0x22, 0xec, 0xee, 0x51, 0x23, 0xf0, 0xf0, 0x53, 0x0c, 0xc9, 0x00,
+ 0x22, 0x11, 0xce, 0xf0,
+ 0xf0, 0x00, 0x00, 0xff, 0xd0, 0x43, 0x67, 0x10, 0xff, 0xcd, 0x00, 0x00,
+ 0x34, 0x00, 0xdd, 0x33,
+ 0x22, 0xbc, 0xfd, 0x34, 0x75, 0xff, 0xfe, 0x00, 0x04, 0x23, 0x00, 0xeb,
+ 0x9d, 0x01, 0x04, 0xf1,
+ 0xd0, 0xf0, 0xdd, 0xbd, 0x04, 0xf3, 0xe2, 0xed, 0x0d, 0x0f, 0xfd, 0x35,
+ 0x47, 0xf0, 0xdd, 0x2e,
+ 0x50, 0x11, 0xef, 0xab, 0x00, 0x13, 0x20, 0x00, 0xd0, 0xab, 0x00, 0x0f,
+ 0x00, 0x23, 0x02, 0xee,
+ 0x19, 0x0f, 0x11, 0x03, 0xf0, 0x8c, 0x00, 0x04, 0xf0, 0xf0, 0xd0, 0xf0,
+ 0x00, 0x02, 0x03, 0xde,
+ 0x98, 0x31, 0x44, 0x0f, 0x30, 0x53, 0xed, 0x0d, 0x00, 0x20, 0x11, 0xde,
+ 0xde, 0x24, 0x20, 0x43,
+ 0x10, 0x98, 0x0e, 0x03, 0x12, 0xff, 0xff, 0x32, 0x1f, 0xec, 0xc0, 0x04,
+ 0xf1, 0xe0, 0x0f, 0x99,
+ 0xc0, 0xf1, 0xe3, 0xe0, 0xdd, 0xc2, 0xf5, 0xe0, 0xe0, 0x00, 0x90, 0x04,
+ 0x11, 0x1e, 0xdf, 0x00,
+ 0x00, 0x12, 0xf0, 0xf1, 0x0c, 0xfc, 0x00, 0xb0, 0xbd, 0xeb, 0x05, 0x00,
+ 0xac, 0x00, 0xec, 0x8f,
+ 0x02, 0x07, 0x20, 0xbe, 0xff, 0x03, 0x02, 0xfe, 0xd0, 0x01, 0xe2, 0xf0,
+ 0xef, 0xf2, 0xf4, 0xfd,
+ 0x00, 0x67, 0x03, 0xda, 0xf0, 0x02, 0x21, 0xf0, 0xcd, 0xe0, 0xae, 0x0f,
+ 0x25, 0x21, 0xac, 0xff,
+ 0x12, 0x42, 0x1f, 0x2d, 0x10, 0x2f, 0x30, 0x62, 0x03, 0x1f, 0x2f, 0x46,
+ 0x2f, 0x1e, 0x30, 0x0f,
+ 0x13, 0x47, 0x33, 0x1b, 0x0e, 0x3f, 0x50, 0x0f, 0x2f, 0x30, 0x0f, 0x4f,
+ 0x62, 0x10, 0x09, 0x31,
+ 0x65, 0x10, 0x0c, 0x1f, 0x21, 0x20, 0x20, 0x0d, 0x0c, 0x31, 0x54, 0x31,
+ 0x1f, 0x0a, 0x00, 0x0f,
+ 0x00, 0x23, 0x43, 0x00, 0xdb, 0x00, 0x9f, 0x02, 0x35, 0xde, 0x8d, 0x0f,
+ 0xf1, 0x06, 0x00, 0xfe,
+ 0xc0, 0xef, 0x13, 0x23, 0x9b, 0xee, 0xe2, 0x02, 0x02, 0x25, 0x01, 0xac,
+ 0xee, 0xf0, 0x03, 0x14,
+ 0xff, 0xed, 0xf0, 0xe0, 0x01, 0xf0, 0x0f, 0x03, 0xf0, 0xfb, 0x22, 0xe3,
+ 0xbd, 0x0e, 0x50, 0x00,
+ 0x9b, 0x00, 0x02, 0xff, 0xcb, 0x00, 0xf1, 0xef, 0xf0, 0x13, 0xdc, 0xbd,
+ 0xf1, 0x27, 0xdf, 0xbd,
+ 0xff, 0xe0, 0xe0, 0xf1, 0xd5, 0xbd, 0xf0, 0x07, 0x03, 0xde, 0xfe, 0x00,
+ 0xdf, 0x05, 0x13, 0xf0,
+ 0x9a, 0x21, 0x01, 0xcf, 0xcd, 0x01, 0x26, 0xc0, 0xef, 0x30, 0xff, 0x8f,
+ 0xdf, 0x14, 0x22, 0x11,
+ 0xf0, 0xdd, 0xfd, 0xcf, 0x00, 0xe0, 0x14, 0x6f, 0x0e, 0x0f, 0xff, 0x0f,
+ 0x57, 0x34, 0xfc, 0x0d,
+ 0x21, 0x54, 0x1f, 0x2f, 0x41, 0x0e, 0x1f, 0x20, 0x2d, 0x0b, 0xff, 0x72,
+ 0x22, 0x0e, 0xfd, 0x11,
+ 0x21, 0x2e, 0x0e, 0xe0, 0xdf, 0x04, 0x17, 0xb0, 0xac, 0xf0, 0xe1, 0xe0,
+ 0xf3, 0x17, 0xe3, 0xbc,
+ 0x1f, 0x12, 0x03, 0x01, 0x30, 0x40, 0x12, 0x77, 0x12, 0xfc, 0x0f, 0x42,
+ 0x02, 0x0d, 0x0e, 0x00,
+ 0x10, 0x0f, 0xfe, 0xc0, 0xf1, 0x1f, 0x1d, 0xbc, 0xbc, 0x03, 0x17, 0x35,
+ 0x0e, 0xde, 0xff, 0x11,
+ 0x00, 0xc0, 0x00, 0x21, 0xea, 0xaf, 0x33, 0x56, 0xde, 0x0f, 0x42, 0x00,
+ 0xf1, 0x00, 0x23, 0x10,
+ 0xd9, 0x00, 0x10, 0x72, 0x73, 0x10, 0x0a, 0xf0, 0x1f, 0x20, 0x52, 0x01,
+ 0x0d, 0x0c, 0x42, 0x33,
+ 0xfd, 0xeb, 0x11, 0x32, 0x00, 0x2f, 0x4f, 0x0f, 0xf0, 0x00, 0x31, 0x45,
+ 0x31, 0x1f, 0xc8, 0xcf,
+ 0x10, 0x75, 0x10, 0x00, 0xfe, 0x00, 0x01, 0x41, 0x1e, 0x20, 0x41, 0x23,
+ 0x2f, 0x0a, 0x01, 0x20,
+ 0x3e, 0x4f, 0x32, 0x54, 0x0e, 0xcb, 0x00, 0x21, 0x11, 0x55, 0xff, 0xbc,
+ 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0xf0, 0xde, 0x01, 0x13, 0xee, 0xcd, 0x55, 0x13, 0xfe, 0xcc, 0xf0,
+ 0xf0, 0xf0, 0xd0, 0xdf,
+ 0xf1, 0x67, 0x13, 0xfd, 0xef, 0x00, 0x22, 0x01, 0x32, 0x10, 0x08, 0xef,
+ 0x50, 0x00, 0x8d, 0xdf,
+ 0x23, 0x13, 0x23, 0x0e, 0x98, 0xe0, 0x00, 0x25, 0x11, 0xf0, 0xce, 0xef,
+ 0xd0, 0xe0, 0xb0, 0xdf,
+ 0xe0, 0xcf, 0xe0, 0xf4, 0xbf, 0xec, 0xd0, 0x07, 0x33, 0xb0, 0xbc, 0xf0,
+ 0x00, 0x12, 0xf0, 0x04,
+ 0xef, 0xeb, 0xc0, 0xff, 0xf0, 0xef, 0x02, 0xe3, 0xae, 0x11, 0x35, 0xfe,
+ 0xcf, 0x00, 0x21, 0x37,
+ 0x00, 0x9c, 0x0f, 0x00, 0x33, 0x00, 0xfb, 0x00, 0xf3, 0xff, 0x40, 0x52,
+ 0xfd, 0xcb, 0x11, 0x32,
+ 0x00, 0x0f, 0x0e, 0xfd, 0x9c, 0x03, 0x27, 0x31, 0xdf, 0xac, 0x00, 0x02,
+ 0x56, 0x00, 0x0f, 0xee,
+ 0x20, 0x12, 0x11, 0x34, 0x30, 0xfd, 0xfd, 0x02, 0x00, 0x00, 0x53, 0xee,
+ 0x89, 0xf0, 0x02, 0x12,
+ 0x02, 0xff, 0xcc, 0x01, 0x04, 0x43, 0x0e, 0xca, 0x00, 0x12, 0x10, 0x00,
+ 0x0e, 0xce, 0x0e, 0x75,
+ 0x22, 0x20, 0x0c, 0x0f, 0x00, 0x21, 0x52, 0x20, 0x0c, 0x2e, 0x1d, 0x2e,
+ 0x02, 0x10, 0x0d, 0x29,
+ 0xff, 0x00, 0x02, 0xfe, 0x61, 0x36, 0x30, 0x0f, 0xca, 0xf0, 0x22, 0x11,
+ 0xde, 0xf0, 0x10, 0x01,
+ 0xf0, 0x8c, 0xb0, 0x00, 0x27, 0x32, 0xe1, 0xbd, 0x20, 0x45, 0x01, 0x0f,
+ 0x0d, 0xe0, 0xff, 0x11,
+ 0x41, 0x31, 0x11, 0xe0, 0x11, 0x11, 0x01, 0x37, 0xce, 0xde, 0x01, 0x02,
+ 0x74, 0x20, 0x0a, 0xf0,
+ 0x60, 0x43, 0x00, 0xca, 0xf0, 0x33, 0x20, 0xdc, 0xe1, 0x24, 0x11, 0x0e,
+ 0x7f, 0x34, 0x00, 0x0f,
+ 0x2f, 0x30, 0x4d, 0x4f, 0x3f, 0x30, 0x10, 0x0a, 0x2f, 0x40, 0x05, 0x05,
+ 0x19, 0x00, 0x1d, 0x00,
+ 0x02, 0x12, 0x60, 0x11, 0xdc, 0x10, 0xef, 0x10, 0x77, 0x00, 0x00, 0xff,
+ 0xc0, 0xea, 0x0e, 0x11,
+ 0x12, 0xdc, 0xeb, 0xf0, 0xce, 0xce, 0x4f, 0x70, 0x0d, 0xdd, 0x02, 0x01,
+ 0x0b, 0x0e, 0x03, 0x03,
+ 0xad, 0xfd, 0x27, 0xf0, 0xaf, 0xfd, 0x03, 0x16, 0x10, 0xfb, 0xe0, 0x20,
+ 0x62, 0x11, 0x10, 0x44,
+ 0x00, 0xfe, 0x0f, 0x10, 0x00, 0x1d, 0x63, 0x13, 0x0d, 0x0d, 0x21, 0x55,
+ 0x10, 0x12, 0x37, 0x33,
+ 0x31, 0x0d, 0xec, 0x11, 0x77, 0x11, 0x0f, 0x00, 0xe0, 0xf0, 0x23, 0x00,
+ 0x01, 0x14, 0x01, 0x32,
+ 0x72, 0x76, 0x22, 0xff, 0xfd, 0x33, 0x46, 0x00, 0xdf, 0xcd, 0x00, 0x45,
+ 0x23, 0xf0, 0xbf, 0xff,
+ 0x00, 0x47, 0x21, 0xe0, 0xf0, 0x42, 0x33, 0x01, 0xe3, 0x12, 0xfe, 0x99,
+ 0xf0, 0x23, 0x44, 0x01,
+ 0xdf, 0xfd, 0x0f, 0x02, 0x16, 0x11, 0xe0, 0xa0, 0x00, 0x01, 0xe0, 0xe0,
+ 0x02, 0x66, 0x00, 0xbd,
+ 0x00, 0xe2, 0x0f, 0xe0, 0xf0, 0xf1, 0x02, 0xfe, 0xff, 0xef, 0x02, 0x77,
+ 0x17, 0x10, 0xee, 0xcd,
+ 0xff, 0x20, 0x33, 0xf0, 0xe0, 0x10, 0x0d, 0xfd, 0xfe, 0x53, 0x16, 0x00,
+ 0x1e, 0xde, 0xbb, 0x01,
+ 0x31, 0xde, 0xdb, 0xef, 0xce, 0xee, 0x0e, 0x70, 0x22, 0x0f, 0xcc, 0xdf,
+ 0xcd, 0xeb, 0x0b, 0x70,
+ 0x32, 0xdc, 0xbe, 0x22, 0x1f, 0xd8, 0x00, 0x00, 0xff, 0xbe, 0x00, 0x02,
+ 0xee, 0xbb, 0xe0, 0xef,
+ 0xe0, 0x31, 0x23, 0xce, 0xac, 0xf0, 0x0f, 0xff, 0xed, 0xdf, 0x02, 0xd1,
+ 0x01, 0x10, 0xbc, 0xd0,
+ 0xe1, 0xf0, 0x47, 0x42, 0xdd, 0xdc, 0x32, 0x75, 0x20, 0xeb, 0x00, 0x10,
+ 0x0e, 0xbc, 0x00, 0x00,
+ 0x30, 0x22, 0xdf, 0x9a, 0x00, 0x31, 0x00, 0x0f, 0xf0, 0xfd, 0xfe, 0xfe,
+ 0xfc, 0xeb, 0xee, 0x10,
+ 0x30, 0x0b, 0x60, 0x30, 0x1f, 0x5e, 0x20, 0x31, 0x35, 0x20, 0x00, 0xed,
+ 0xbc, 0xed, 0xde, 0xf0,
+ 0x36, 0xdf, 0x8b, 0xdf, 0xef, 0x0f, 0x00, 0xf0, 0xe0, 0xce, 0xca, 0xfe,
+ 0xde, 0x10, 0x72, 0x0d,
+ 0xd9, 0xdf, 0x00, 0xff, 0xf0, 0xce, 0xbf, 0xfe, 0x22, 0x54, 0xee, 0xca,
+ 0x20, 0x34, 0x00, 0x10,
+ 0x00, 0xbc, 0xf0, 0x11, 0x53, 0x00, 0xde, 0xee, 0x01, 0x04, 0x46, 0x00,
+ 0xbb, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0xbe, 0xfd, 0xff, 0x0e, 0x01, 0x02, 0xf0, 0x33, 0xf2, 0xaf,
+ 0xf2, 0xd1, 0xe6, 0x25,
+ 0x12, 0xd0, 0xc2, 0x04, 0x01, 0xd0, 0xbf, 0x13, 0x45, 0x23, 0xd0, 0xde,
+ 0x76, 0x23, 0x03, 0x00,
+ 0x04, 0x20, 0x00, 0x33, 0x53, 0x01, 0x03, 0x34, 0x42, 0xce, 0xee, 0x33,
+ 0x47, 0x30, 0x75, 0x11,
+ 0x00, 0x01, 0x33, 0x51, 0x22, 0x13, 0x22, 0x12, 0x23, 0x45, 0x31, 0x10,
+ 0x10, 0x0e, 0x10, 0x57,
+ 0x32, 0x51, 0x00, 0x22, 0x05, 0x20, 0x30, 0x22, 0x20, 0xcd, 0xed, 0x00,
+ 0x34, 0x3e, 0x98, 0xde,
+ 0x0f, 0x20, 0x23, 0xfe, 0xcf, 0x0e, 0x0d, 0xfc, 0x00, 0x0e, 0x8a, 0xdf,
+ 0x00, 0xfe, 0xde, 0xce,
+ 0xff, 0xda, 0xbe, 0x10, 0x25, 0x00, 0xbd, 0x00, 0xce, 0xde, 0xef, 0x00,
+ 0x01, 0x01, 0xad, 0xfe,
+ 0xeb, 0xcd, 0x00, 0x01, 0xdf, 0xbf, 0xf3, 0xfd, 0xf1, 0x07, 0xd3, 0xdd,
+ 0xc8, 0xee, 0xe0, 0x12,
+ 0x44, 0xdd, 0xab, 0x00, 0xf2, 0x12, 0x20, 0xcc, 0xdd, 0x01, 0x55, 0x21,
+ 0x00, 0xf0, 0xed, 0xde,
+ 0xfe, 0xe0, 0x11, 0x32, 0xc0, 0x9a, 0xee, 0xff, 0xf0, 0x0d, 0x51, 0x13,
+ 0xef, 0xca, 0x11, 0x34,
+ 0x00, 0xff, 0xe0, 0x0e, 0x20, 0x77, 0x00, 0xbd, 0xfe, 0x25, 0x34, 0x00,
+ 0xfc, 0xd0, 0x01, 0x11,
+ 0x43, 0x21, 0xf0, 0xde, 0x00, 0x45, 0x41, 0x00, 0x20, 0x11, 0x05, 0xf0,
+ 0x1f, 0x61, 0x43, 0x11,
+ 0x00, 0x20, 0x55, 0x12, 0x30, 0x31, 0x0f, 0x1d, 0x75, 0x33, 0x00, 0x00,
+ 0x0c, 0x2d, 0xff, 0xee,
+ 0xfe, 0x1e, 0x63, 0x37, 0xe0, 0xa8, 0xff, 0x00, 0x10, 0x31, 0x10, 0xcd,
+ 0x0e, 0x0f, 0x1e, 0x2f,
+ 0x11, 0x00, 0xfc, 0x10, 0x50, 0x0c, 0xde, 0x21, 0x65, 0x00, 0x0d, 0xee,
+ 0x00, 0x10, 0x00, 0xef,
+ 0xcb, 0xd0, 0x00, 0xb3, 0xdb, 0x0e, 0x70, 0x10, 0xf0, 0xef, 0xcc, 0xef,
+ 0x26, 0x30, 0xff, 0xdf,
+ 0x20, 0x00, 0xd0, 0x23, 0x12, 0x89, 0x8d, 0x02, 0x14, 0x00, 0x10, 0xf4,
+ 0xee, 0x00, 0x67, 0x26,
+ 0x0f, 0xdf, 0x20, 0x22, 0x31, 0x11, 0x12, 0xf1, 0x12, 0x21, 0x00, 0x01,
+ 0x21, 0x75, 0x22, 0x42,
+ 0x01, 0x00, 0x20, 0x11, 0x40, 0x33, 0x67, 0x11, 0xfe, 0xfe, 0x40, 0x34,
+ 0x00, 0x1e, 0x20, 0x44,
+ 0x22, 0x31, 0xfd, 0xea, 0x42, 0x54, 0x10, 0x20, 0x0e, 0x0f, 0x03, 0x22,
+ 0x30, 0x0d, 0xb0, 0xf1,
+ 0xfc, 0xfa, 0x61, 0x21, 0x03, 0x12, 0x0e, 0x08, 0x40, 0x51, 0x0f, 0xff,
+ 0x00, 0x30, 0x44, 0x01,
+ 0xdd, 0xed, 0xc0, 0x0f, 0x43, 0x25, 0x01, 0xbf, 0xfe, 0x25, 0x73, 0x00,
+ 0x0e, 0x04, 0x00, 0xea,
+ 0x00, 0xf3, 0x03, 0x3e, 0x21, 0x77, 0x13, 0xde, 0xfe, 0x13, 0x32, 0x34,
+ 0x31, 0xf0, 0x99, 0x00,
+ 0x20, 0xe0, 0xcc, 0x32, 0x42, 0xd0, 0xbc, 0x01, 0x14, 0x00, 0xfe, 0xe0,
+ 0x00, 0x02, 0x02, 0xef,
+ 0x89, 0x00, 0x00, 0x22, 0xf1, 0xb0, 0x00, 0x01, 0x0e, 0xef, 0xe3, 0xe5,
+ 0xe1, 0xcf, 0x00, 0xe4,
+ 0xce, 0xbb, 0xf0, 0xf0, 0xe3, 0x00, 0xef, 0xde, 0xf0, 0xff, 0xfe, 0x04,
+ 0xf2, 0xe0, 0xde, 0x2d,
+ 0x75, 0xff, 0xbb, 0x10, 0x44, 0x1f, 0x08, 0x1f, 0x20, 0xf1, 0xde, 0x30,
+ 0x72, 0xec, 0xbd, 0xfd,
+ 0xec, 0xfd, 0x12, 0x00, 0x8b, 0xfc, 0xed, 0x0f, 0x03, 0x0e, 0xd8, 0xce,
+ 0x10, 0x32, 0x00, 0xed,
+ 0x0e, 0xef, 0x0f, 0xbd, 0x0f, 0xf0, 0xe0, 0xfd, 0xc8, 0xef, 0xd0, 0x02,
+ 0xef, 0xfe, 0x40, 0x01,
+ 0x9c, 0x00, 0x12, 0xee, 0x01, 0x26, 0x0f, 0xdd, 0x02, 0x46, 0xd0, 0x9e,
+ 0x11, 0x24, 0xb0, 0xbd,
+ 0x01, 0x25, 0x02, 0x00, 0x00, 0xec, 0x23, 0x64, 0x12, 0x1d, 0x10, 0x32,
+ 0x41, 0x20, 0x0f, 0xfc,
+ 0xff, 0x23, 0x55, 0x0e, 0xe9, 0x00, 0x32, 0x00, 0x0f, 0x30, 0x73, 0xee,
+ 0xba, 0x00, 0x22, 0x11,
+ 0xfe, 0xec, 0xf0, 0x20, 0x50, 0x33, 0x00, 0xeb, 0xe0, 0x52, 0x20, 0xdb,
+ 0x12, 0x75, 0x10, 0xed,
+ 0xf0, 0x22, 0x21, 0x0f, 0xdf, 0x20, 0x43, 0x47, 0x21, 0xdd, 0xfe, 0x21,
+ 0x51, 0x00, 0xfc, 0x12,
+ 0x61, 0x32, 0x20, 0xfe, 0xef, 0x20, 0x64, 0x01, 0x24, 0x10, 0xee, 0xff,
+ 0x14, 0x21, 0x27, 0xf1,
+ 0xcf, 0xed, 0x35, 0x75, 0x02, 0xef, 0xe0, 0x30, 0x44, 0xf0, 0xd2, 0x00,
+ 0x00, 0x10, 0x57, 0x11,
+ 0xe0, 0xff, 0x22, 0x20, 0x20, 0x61, 0x10, 0x10, 0x12, 0xee, 0xc8, 0x00,
+ 0x50, 0xf3, 0x9d, 0x00,
+ 0x23, 0x01, 0xb1, 0x00, 0xf2, 0x0f, 0x05, 0x17, 0x02, 0xf0, 0xdf, 0xe0,
+ 0xe0, 0x01, 0x67, 0xf1,
+ 0xcf, 0x1e, 0x10, 0xf1, 0xe1, 0x22, 0x41, 0x03, 0xd1, 0xff, 0xdb, 0xf0,
+ 0x62, 0x54, 0x10, 0xfb,
+ 0xd0, 0xfe, 0x32, 0x52, 0x0f, 0x0e, 0x10, 0x0e, 0xfe, 0x75, 0x33, 0x10,
+ 0x20, 0x21, 0x37, 0x00,
+ 0x00, 0x10, 0xfd, 0xce, 0x53, 0x37, 0x04, 0xbe, 0xed, 0x10, 0x43, 0x10,
+ 0x10, 0x23, 0x00, 0x10,
+ 0x12, 0x44, 0x41, 0x0c, 0xb9, 0x00, 0x63, 0x02, 0x0d, 0x0d, 0x00, 0x10,
+ 0x1f, 0x01, 0x26, 0x0f,
+ 0xfb, 0xd0, 0x20, 0x22, 0xcd, 0xe0, 0xf0, 0xd0, 0xb0, 0xee, 0xf0, 0x01,
+ 0xf3, 0xb1, 0xad, 0xd8,
+ 0xdd, 0x10, 0x54, 0xf0, 0xbc, 0x00, 0x00, 0xee, 0xec, 0xff, 0xcd, 0xf0,
+ 0x04, 0xe0, 0xcb, 0xff,
+ 0x10, 0x20, 0x14, 0x33, 0x01, 0xdc, 0xfd, 0x70, 0x56, 0x00, 0xfb, 0x00,
+ 0x00, 0x21, 0x00, 0x0f,
+ 0x21, 0x23, 0x22, 0x02, 0xad, 0xdd, 0xec, 0x42, 0x37, 0xf0, 0x9c, 0x0e,
+ 0x00, 0x0f, 0x0f, 0x0f,
+ 0xfb, 0xf0, 0x34, 0x10, 0xef, 0xcc, 0xff, 0x0f, 0x72, 0x22, 0x0f, 0xde,
+ 0xfd, 0xf0, 0x0e, 0x0f,
+ 0x02, 0xd0, 0xab, 0x00, 0xd0, 0xb8, 0x02, 0x46, 0x00, 0xc1, 0xef, 0xf0,
+ 0xe1, 0xe1, 0x01, 0x01,
+ 0x03, 0xf2, 0xa0, 0xf1, 0x04, 0x00, 0x02, 0x17, 0x00, 0xc0, 0xe0, 0x01,
+ 0x75, 0x41, 0x01, 0x0f,
+ 0x00, 0x0f, 0x01, 0x02, 0xde, 0x0b, 0x31, 0x03, 0x11, 0x3f, 0x73, 0x34,
+ 0xfc, 0x0b, 0x30, 0x1f,
+ 0x0f, 0x10, 0x21, 0x0a, 0x9c, 0x0f, 0xce, 0xdd, 0x0f, 0x40, 0xfe, 0xca,
+ 0xdf, 0xce, 0xd0, 0x52,
+ 0x01, 0xbb, 0xde, 0xef, 0xec, 0xff, 0x10, 0x21, 0xcd, 0xb8, 0x0f, 0x30,
+ 0x21, 0xff, 0xde, 0xde,
+ 0xef, 0x1f, 0x1e, 0x8b, 0xde, 0x0f, 0x30, 0x0c, 0x8d, 0xf0, 0xff, 0x0e,
+ 0xfc, 0x00, 0x01, 0xfa,
+ 0xcd, 0x00, 0x20, 0x14, 0x0f, 0xfd, 0x9b, 0xf0, 0x00, 0x12, 0x00, 0xdc,
+ 0xef, 0xef, 0x00, 0xde,
+ 0xe0, 0xfc, 0x0e, 0xcd, 0xae, 0xff, 0xfb, 0x10, 0x1f, 0xdc, 0x00, 0x20,
+ 0x0f, 0xcd, 0x0a, 0x51,
+ 0x12, 0xbe, 0xec, 0x12, 0x56, 0x0f, 0xae, 0x00, 0x04, 0x11, 0xf0, 0xdc,
+ 0x02, 0x15, 0x12, 0x00,
+ 0xbf, 0x01, 0x04, 0x21, 0x11, 0xe0, 0x32, 0x75, 0x13, 0x11, 0x00, 0x20,
+ 0x53, 0x13, 0x22, 0x45,
+ 0x23, 0x10, 0x11, 0x31, 0x54, 0x22, 0xf0, 0xff, 0x25, 0x77, 0x12, 0x00,
+ 0x00, 0x12, 0x22, 0x33,
+ 0x42, 0x11, 0x00, 0xf0, 0x13, 0x43, 0x13, 0x00, 0x0c, 0xfd, 0x17, 0x77,
+ 0x72, 0x00, 0x0f, 0x00,
+ 0x01, 0x02, 0x22, 0x10, 0xfe, 0xee, 0xf0, 0x14, 0x20, 0xee, 0xfd, 0x63,
+ 0x21, 0xd8, 0xef, 0x43,
+ 0x54, 0x0f, 0xed, 0x00, 0xf0, 0x01, 0x03, 0xdf, 0xf0, 0xbd, 0xed, 0x17,
+ 0x23, 0x8d, 0xdc, 0x01,
+ 0xf3, 0xf0, 0x00, 0xf2, 0xd2, 0xbc, 0xff, 0x03, 0x03, 0xd1, 0xbe, 0xff,
+ 0xe4, 0xf7, 0xd2, 0xcd,
+ 0xdd, 0x00, 0xf3, 0xe1, 0xf1, 0x47, 0x67, 0xdf, 0xcc, 0xe0, 0x42, 0x35,
+ 0xf0, 0xce, 0x0f, 0xbf,
+ 0x00, 0x03, 0x21, 0xdd, 0xde, 0x14, 0x11, 0xfe, 0xcd, 0x11, 0x32, 0x00,
+ 0xce, 0xec, 0xd9, 0xef,
+ 0x0f, 0x50, 0x00, 0xfa, 0xd0, 0x11, 0x0f, 0xdd, 0x2f, 0x74, 0x70, 0xfd,
+ 0xef, 0x10, 0x20, 0x2e,
+ 0x1f, 0x20, 0xd9, 0xe0, 0x42, 0x10, 0xf9, 0x00, 0x40, 0x02, 0xe0, 0x50,
+ 0xe0, 0x8c, 0x00, 0x01,
+ 0x23, 0xee, 0xdc, 0x00, 0x00, 0x02, 0x31, 0xfb, 0x9a, 0x00, 0x52, 0x11,
+ 0x1f, 0x1d, 0x00, 0x53,
+ 0x25, 0x0e, 0x2f, 0x2f, 0x0e, 0x0d, 0xea, 0xff, 0x41, 0x12, 0xee, 0xbb,
+ 0xef, 0xed, 0x10, 0x73,
+ 0x00, 0xff, 0xed, 0x1e, 0x0e, 0x2f, 0x0d, 0xd8, 0x0f, 0x10, 0x1f, 0xef,
+ 0xde, 0xfe, 0x0f, 0x72,
+ 0x04, 0xfe, 0xdd, 0xee, 0x11, 0x66, 0xee, 0xcc, 0x00, 0x32, 0x21, 0x00,
+ 0x00, 0x11, 0x32, 0x23,
+ 0xd0, 0xa0, 0x0d, 0x1d, 0x57, 0x07, 0x00, 0x0f, 0x70, 0x14, 0xf0, 0xdd,
+ 0x10, 0x31, 0x27, 0x01,
+ 0x00, 0x12, 0x22, 0x02, 0x64, 0x56, 0x32, 0x12, 0xf0, 0xe1, 0x11, 0x76,
+ 0x21, 0x42, 0x11, 0x11,
+ 0x32, 0x22, 0x53, 0x11, 0x45, 0x54, 0x21, 0x01, 0x10, 0x0f, 0x44, 0x46,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x21, 0x41, 0x11, 0x23, 0x13, 0xee, 0xbd, 0x14, 0x67, 0x00,
+ 0xff, 0xff, 0xf0, 0x13,
+ 0x00, 0x00, 0x21, 0xf0, 0x01, 0x35, 0x1f, 0x0f, 0x22, 0xf0, 0x0c, 0xdf,
+ 0x74, 0x45, 0xfd, 0x0d,
+ 0x11, 0x64, 0x0f, 0xda, 0x00, 0x23, 0x40, 0xef, 0xcb, 0xf0, 0xf0, 0x52,
+ 0x00, 0xba, 0x00, 0x02,
+ 0x41, 0xe0, 0x0e, 0x13, 0x22, 0x0f, 0xad, 0xed, 0xf0, 0x17, 0x32, 0x00,
+ 0xfe, 0x00, 0x02, 0x01,
+ 0xc0, 0x00, 0x61, 0x1f, 0x0d, 0xf3, 0x26, 0x30, 0xfb, 0xce, 0x0f, 0x20,
+ 0x0f, 0xab, 0xe0, 0x00,
+ 0x43, 0xfe, 0xcb, 0xce, 0x01, 0x06, 0x00, 0x8f, 0xfd, 0x01, 0x13, 0xf0,
+ 0xca, 0x00, 0x01, 0x21,
+ 0xf0, 0xe0, 0xdf, 0xfe, 0x14, 0x01, 0x8c, 0xca, 0x00, 0x00, 0x20, 0xf0,
+ 0xd0, 0xee, 0xfd, 0xff,
+ 0x2f, 0x1f, 0x1f, 0xee, 0xcc, 0x1e, 0x5e, 0x0f, 0x20, 0xfb, 0x0c, 0x40,
+ 0x12, 0xff, 0xb8, 0xdd,
+ 0xef, 0x41, 0x00, 0x9b, 0xff, 0x00, 0xee, 0xee, 0x0e, 0xcd, 0xff, 0x00,
+ 0xe0, 0xea, 0x21, 0x11,
+ 0xae, 0xda, 0x0f, 0x0e, 0x20, 0x20, 0x10, 0x1e, 0x3f, 0xfb, 0x00, 0x11,
+ 0xd0, 0xee, 0x50, 0x52,
+ 0xfd, 0xf1, 0x37, 0x02, 0x8e, 0xfd, 0x03, 0x04, 0xdd, 0xe0, 0x17, 0x01,
+ 0x80, 0xdf, 0x02, 0x03,
+ 0x15, 0x53, 0xf3, 0xe0, 0xf1, 0xf2, 0x23, 0x42, 0xe0, 0xc0, 0x01, 0x37,
+ 0x24, 0x10, 0x52, 0x33,
+ 0x02, 0x21, 0x65, 0x23, 0x23, 0x00, 0x01, 0x11, 0x16, 0x21, 0xf0, 0xef,
+ 0x31, 0x74, 0x22, 0x12,
+ 0x11, 0x11, 0x20, 0x62, 0x27, 0x02, 0xfc, 0x11, 0x23, 0x00, 0xde, 0x0e,
+ 0xee, 0x13, 0x22, 0x1f,
+ 0x00, 0x35, 0x30, 0x0b, 0x71, 0x73, 0x0e, 0xfc, 0x10, 0x44, 0x42, 0x0d,
+ 0xf8, 0xef, 0x30, 0x53,
+ 0x00, 0x0f, 0x0d, 0xff, 0x00, 0x35, 0x00, 0xfd, 0xfd, 0xec, 0xc0, 0x30,
+ 0x33, 0xdc, 0xef, 0x9c,
+ 0xcc, 0xd0, 0xe0, 0xc1, 0x00, 0xe9, 0xaf, 0xf0, 0x04, 0x00, 0xd0, 0xee,
+ 0x11, 0x31, 0x00, 0x20,
+ 0x00, 0xbf, 0xea, 0x0f, 0x0f, 0x0e, 0xb0, 0x03, 0xfe, 0xfc, 0x52, 0x20,
+ 0x0a, 0xcf, 0x00, 0x10,
+ 0x50, 0xfc, 0x9a, 0x0f, 0xfe, 0x0e, 0xdf, 0xee, 0x00, 0xff, 0x9d, 0x00,
+ 0xe0, 0x04, 0x05, 0x00,
+ 0x9b, 0x00, 0xef, 0x00, 0x01, 0xe0, 0x01, 0x22, 0xdf, 0xdb, 0x00, 0x34,
+ 0x62, 0x12, 0x03, 0xfe,
+ 0xeb, 0x20, 0x74, 0x35, 0x00, 0x0d, 0x10, 0x33, 0x00, 0xfd, 0x10, 0x25,
+ 0xff, 0x00, 0x73, 0x02,
+ 0x01, 0x45, 0x21, 0x32, 0x23, 0x00, 0x33, 0x23, 0xf0, 0x2e, 0x72, 0x13,
+ 0x2f, 0x26, 0x32, 0x10,
+ 0x33, 0x42, 0x65, 0x37, 0x14, 0x0e, 0x0e, 0x40, 0x75, 0x00, 0xed, 0x10,
+ 0x42, 0x22, 0xfd, 0xec,
+ 0x02, 0x31, 0x10, 0x20, 0x01, 0xe1, 0xae, 0xf0, 0x0f, 0xff, 0xff, 0x04,
+ 0x04, 0xbe, 0xed, 0x02,
+ 0xf6, 0xe0, 0xcd, 0xe1, 0xe7, 0xd0, 0x8e, 0xdf, 0x03, 0x07, 0x0f, 0xce,
+ 0xd0, 0x03, 0xe2, 0x0f,
+ 0x00, 0xd1, 0xd0, 0x01, 0x36, 0xd0, 0xbc, 0x31, 0x43, 0xc3, 0xef, 0x01,
+ 0xe1, 0xef, 0xdf, 0x14,
+ 0x34, 0xb0, 0xe0, 0xc0, 0xee, 0xe0, 0xcd, 0xb9, 0x12, 0x46, 0xd0, 0xde,
+ 0x1f, 0x00, 0xc0, 0xfc,
+ 0xee, 0xdf, 0xf4, 0x30, 0xc9, 0x8c, 0xde, 0x72, 0x12, 0x0e, 0xdc, 0x00,
+ 0x0d, 0x10, 0x20, 0x00,
+ 0xfc, 0x0d, 0x00, 0xfd, 0xdd, 0xdb, 0x00, 0x71, 0x22, 0xdb, 0xcd, 0xdd,
+ 0xf0, 0x01, 0x03, 0xf0,
+ 0x9c, 0xe0, 0xe3, 0xf4, 0x13, 0x0b, 0xcd, 0x22, 0x05, 0xde, 0x9c, 0xff,
+ 0x11, 0x32, 0x1f, 0xd9,
+ 0xd0, 0x30, 0x61, 0x35, 0x10, 0x0f, 0x0e, 0x63, 0x01, 0xfe, 0xed, 0xfd,
+ 0xfe, 0x11, 0x21, 0xfa,
+ 0xdd, 0x30, 0x1f, 0xee, 0xaa, 0x0f, 0xf0, 0x01, 0x60, 0x10, 0xca, 0xac,
+ 0x0e, 0x11, 0x20, 0xde,
+ 0xdd, 0x0f, 0x0d, 0x0f, 0x1f, 0x2f, 0x1d, 0x0f, 0x04, 0x10, 0xf9, 0xde,
+ 0x20, 0x11, 0x00, 0x2e,
+ 0xcd, 0xce, 0xed, 0xed, 0xef, 0x32, 0x0b, 0xcb, 0x30, 0x0f, 0xec, 0x4e,
+ 0x60, 0xde, 0xaa, 0x00,
+ 0xfe, 0xff, 0xed, 0x12, 0xf2, 0xac, 0xfd, 0xed, 0xe0, 0x07, 0x42, 0xff,
+ 0xdf, 0xf2, 0x14, 0x30,
+ 0xf0, 0xaf, 0x0f, 0x01, 0x24, 0x02, 0x00, 0x0e, 0x02, 0x01, 0x00, 0x00,
+ 0x60, 0x00, 0x84, 0x00,
+ 0xc6, 0xfb, 0x6c, 0x06, 0x24, 0xfb, 0x6c, 0x05, 0x23, 0x55, 0x33, 0x31,
+ 0x32, 0x33, 0x33, 0x24,
+ 0x23, 0x12, 0xf0, 0xbe, 0xdf, 0xf2, 0xe5, 0xc0, 0xe2, 0xe2, 0xd3, 0xd6,
+ 0x14, 0x64, 0x24, 0x22,
+ 0x32, 0x41, 0x11, 0x42, 0x73, 0x22, 0x20, 0x20, 0x20, 0x1f, 0x31, 0x31,
+ 0x2d, 0x1f, 0x21, 0x66,
+ 0x55, 0x21, 0x1f, 0x1e, 0x2d, 0x3d, 0x08, 0xeb, 0xde, 0x0f, 0x0e, 0x9c,
+ 0xde, 0xdd, 0xdd, 0xf0,
+ 0x10, 0x10, 0x00, 0x10, 0x41, 0x10, 0x0e, 0xde, 0xee, 0x10, 0x0f, 0x9b,
+ 0xec, 0xed, 0x00, 0x23,
+ 0x45, 0x31, 0x21, 0x44, 0x76, 0x32, 0x30, 0x00, 0x0c, 0xdc, 0xee, 0xfe,
+ 0xee, 0xba, 0xfe, 0x0f,
+ 0xad, 0xbd, 0xdd, 0xef, 0xce, 0xec, 0xde, 0xcd, 0xed, 0xe0, 0xf0, 0xdf,
+ 0xba, 0xdd, 0xff, 0xee,
+ 0xfe, 0xdf, 0xe0, 0xd0, 0xd1, 0xc1, 0xc2, 0xd0, 0xd4, 0xe7, 0xc2, 0xb0,
+ 0xe2, 0xe2, 0xf1, 0xde,
+ 0xcb, 0x00, 0x00, 0x00, 0x02, 0xf2, 0x03, 0x25, 0x76, 0x22, 0x01, 0x00,
+ 0x13, 0x77, 0x42, 0x11,
+ 0x11, 0x10, 0x10, 0x2f, 0x3f, 0x31, 0x54, 0x21, 0x10, 0x20, 0x30, 0x1f,
+ 0x2f, 0x73, 0x36, 0x2f,
+ 0x0c, 0x2e, 0x3d, 0x2c, 0x0c, 0x0e, 0x0e, 0xed, 0xbd, 0xce, 0xdd, 0xea,
+ 0xde, 0x00, 0xe5, 0xa0,
+ 0xef, 0xdc, 0x0c, 0x2e, 0x3e, 0x3e, 0x3f, 0x20, 0xee, 0xbf, 0xf3, 0x27,
+ 0x64, 0x13, 0xe2, 0xb3,
+ 0xf5, 0x03, 0x02, 0x02, 0x32, 0x74, 0x42, 0x32, 0x31, 0x21, 0x21, 0x22,
+ 0x52, 0x43, 0x44, 0x21,
+ 0x10, 0x00, 0x21, 0x13, 0x00, 0xf2, 0xd0, 0xcc, 0xeb, 0xff, 0x0e, 0x09,
+ 0x0e, 0x1e, 0x0b, 0xbd,
+ 0xdd, 0x0f, 0x00, 0xad, 0xcc, 0xce, 0xef, 0xbd, 0xda, 0xde, 0xdd, 0xde,
+ 0xdc, 0xcb, 0xee, 0x0e,
+ 0x00, 0x0d, 0xee, 0xee, 0xee, 0xff, 0xef, 0xdf, 0xce, 0xdc, 0x00, 0x56,
+ 0x12, 0x00, 0x02, 0x03,
+ 0x03, 0x03, 0x77, 0x54, 0x12, 0x01, 0x02, 0x01, 0x02, 0xe1, 0x02, 0x13,
+ 0x01, 0x01, 0x41, 0x30,
+ 0x1e, 0x3d, 0x70, 0x52, 0x20, 0x1b, 0x20, 0x65, 0x35, 0x31, 0x52, 0x13,
+ 0x25, 0x23, 0x33, 0x53,
+ 0x35, 0x32, 0x20, 0x2e, 0x1e, 0x1f, 0x00, 0x14, 0x14, 0x00, 0xff, 0xef,
+ 0x00, 0x43, 0x14, 0xf2,
+ 0xe2, 0xe2, 0xdf, 0xef, 0xff, 0xb9, 0xcd, 0xcd, 0xae, 0xcd, 0xcb, 0xcb,
+ 0xdd, 0xdf, 0xde, 0xca,
+ 0xdd, 0xef, 0xff, 0xdd, 0xdc, 0xfe, 0x0f, 0x2f, 0x3e, 0x1e, 0x3d, 0x4e,
+ 0x40, 0x33, 0x36, 0x52,
+ 0x45, 0x33, 0x33, 0x11, 0x00, 0xf0, 0x00, 0x03, 0x01, 0xd0, 0xab, 0xcd,
+ 0xdd, 0xde, 0xdc, 0xcc,
+ 0xde, 0xdf, 0xc1, 0xd7, 0xd2, 0xe2, 0xf2, 0x34, 0x51, 0x31, 0x32, 0x64,
+ 0x35, 0x33, 0x33, 0x33,
+ 0x22, 0x42, 0x55, 0x22, 0x00, 0x00, 0x12, 0x23, 0x01, 0xfe, 0xfe, 0x2f,
+ 0x40, 0x0e, 0xcc, 0xcb,
+ 0xdd, 0xcc, 0xcf, 0xd0, 0xc0, 0xe0, 0xd2, 0xe3, 0xd0, 0xbe, 0xdb, 0xbe,
+ 0xe2, 0xf5, 0xf5, 0xe2,
+ 0x02, 0x02, 0x01, 0xe1, 0xd3, 0xd6, 0xc3, 0xc3, 0xc1, 0xd0, 0xdf, 0xed,
+ 0x09, 0x0e, 0x0d, 0x0d,
+ 0x0c, 0x2d, 0x2b, 0x2e, 0x1b, 0xfd, 0x2d, 0x7d, 0x5e, 0x0d, 0x3f, 0x7e,
+ 0x3d, 0x4b, 0x2d, 0x3c,
+ 0x3d, 0x3d, 0x4d, 0x1c, 0x0b, 0xee, 0xcd, 0xde, 0xaf, 0xde, 0xdf, 0xe0,
+ 0xe1, 0xe1, 0x11, 0x44,
+ 0x53, 0x31, 0x21, 0x31, 0x43, 0x11, 0x10, 0x0f, 0x03, 0xe7, 0xa0, 0xd1,
+ 0xc3, 0xd5, 0xc0, 0xe2,
+ 0xf1, 0xf0, 0x0b, 0x0f, 0x40, 0x2e, 0x3d, 0x1f, 0x22, 0x11, 0x27, 0x04,
+ 0x36, 0xf2, 0xa1, 0x03,
+ 0xc2, 0x27, 0x22, 0xf2, 0x03, 0xe2, 0xb2, 0xf1, 0x01, 0x74, 0x64, 0x00,
+ 0x00, 0xfd, 0xcb, 0xcd,
+ 0x23, 0x77, 0x12, 0x00, 0x00, 0x00, 0xf0, 0x11, 0x31, 0x33, 0x44, 0x00,
+ 0x10, 0x42, 0x67, 0x23,
+ 0x00, 0xec, 0xbb, 0xff, 0x65, 0x22, 0xee, 0xed, 0x00, 0xed, 0xfe, 0x00,
+ 0x10, 0xfe, 0x0f, 0x45,
+ 0x11, 0xed, 0xcc, 0x00, 0x00, 0xed, 0x0f, 0x00, 0xd0, 0xee, 0x35, 0x53,
+ 0xe0, 0xaa, 0xf0, 0x32,
+ 0x77, 0x11, 0xf0, 0xee, 0xef, 0x11, 0x32, 0x00, 0xbc, 0x00, 0x67, 0x11,
+ 0xee, 0xee, 0x0f, 0x00,
+ 0x00, 0xff, 0x0f, 0x00, 0x0f, 0xff, 0x43, 0x45, 0x00, 0xcb, 0xef, 0x32,
+ 0x42, 0xee, 0xde, 0x20,
+ 0x22, 0x43, 0x56, 0x00, 0xff, 0x00, 0xee, 0x00, 0x45, 0x00, 0xf0, 0xbc,
+ 0xff, 0x44, 0x11, 0xff,
+ 0x01, 0x43, 0x00, 0xdd, 0xb9, 0xef, 0x43, 0x24, 0x00, 0xdf, 0xde, 0xde,
+ 0x00, 0x13, 0xdf, 0xdf,
+ 0x22, 0xf0, 0x11, 0x44, 0xfe, 0xcc, 0xa9, 0xde, 0x32, 0x76, 0x00, 0xff,
+ 0x10, 0x01, 0xff, 0xde,
+ 0xff, 0x01, 0x33, 0x12, 0xed, 0xef, 0x22, 0x65, 0x11, 0xfd, 0x88, 0xed,
+ 0x00, 0x32, 0x00, 0xee,
+ 0x0f, 0x00, 0x11, 0x21, 0xfd, 0xdb, 0xf0, 0x0f, 0x21, 0xce, 0xff, 0x44,
+ 0xbb, 0xee, 0x43, 0x00,
+ 0xaa, 0x11, 0x45, 0x00, 0xde, 0xed, 0xff, 0x43, 0x12, 0x00, 0x22, 0x10,
+ 0xcc, 0x0f, 0x23, 0xee,
+ 0xed, 0x57, 0x22, 0x11, 0x33, 0x01, 0x00, 0x00, 0xef, 0x23, 0x77, 0x43,
+ 0xff, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0xcc, 0xff, 0x12, 0x00, 0xcd, 0x98, 0xed, 0x45, 0x22, 0xdd,
+ 0xdd, 0x00, 0xff, 0x00,
+ 0x22, 0x10, 0x10, 0x00, 0xaa, 0x0f, 0x21, 0x22, 0xee, 0x20, 0x65, 0x00,
+ 0xed, 0x0f, 0x33, 0x22,
+ 0x0e, 0x11, 0x22, 0xfe, 0xf0, 0x66, 0x00, 0x9a, 0xfe, 0x24, 0x43, 0xee,
+ 0xee, 0x11, 0x12, 0x0f,
+ 0x00, 0x10, 0x00, 0x46, 0x21, 0x00, 0x11, 0x00, 0xce, 0x22, 0x67, 0x00,
+ 0xff, 0xef, 0xff, 0x10,
+ 0x22, 0x10, 0xf0, 0xfe, 0xfe, 0xff, 0x00, 0x1f, 0x64, 0x34, 0xfe, 0xdc,
+ 0x0f, 0x11, 0x34, 0x43,
+ 0x02, 0xad, 0xdb, 0x03, 0x11, 0xd0, 0x23, 0x33, 0x35, 0xf0, 0x89, 0xe0,
+ 0x43, 0x00, 0xcc, 0xf0,
+ 0x10, 0x22, 0x00, 0xee, 0xef, 0x11, 0x01, 0xdd, 0x00, 0x77, 0x12, 0x00,
+ 0xe0, 0xde, 0xee, 0x22,
+ 0x55, 0xdd, 0xbc, 0x12, 0x11, 0xfe, 0xcc, 0xff, 0x21, 0x12, 0xfe, 0xdc,
+ 0xee, 0x00, 0x64, 0x00,
+ 0xda, 0xff, 0x0f, 0xcd, 0xff, 0x22, 0x00, 0xbc, 0xdd, 0x0f, 0x01, 0xf0,
+ 0x0f, 0x12, 0x12, 0xff,
+ 0xff, 0x10, 0xdc, 0xaa, 0xfe, 0x00, 0x54, 0x0e, 0xba, 0x00, 0x10, 0xcc,
+ 0x22, 0x76, 0x0f, 0xdc,
+ 0xf0, 0x31, 0x12, 0xed, 0xee, 0x43, 0x22, 0x00, 0xfe, 0x12, 0x44, 0xed,
+ 0xfd, 0x22, 0x0f, 0x0d,
+ 0x54, 0x0f, 0xd9, 0x21, 0x21, 0xef, 0x00, 0xdf, 0x8a, 0x00, 0x34, 0x00,
+ 0xf0, 0x21, 0x33, 0x00,
+ 0xde, 0xe0, 0x20, 0x43, 0x34, 0x11, 0xbd, 0xf0, 0x67, 0x23, 0xee, 0xee,
+ 0x01, 0x45, 0x11, 0xde,
+ 0xce, 0x11, 0x12, 0x00, 0x33, 0x11, 0xbb, 0xdd, 0x00, 0x64, 0x25, 0x00,
+ 0xee, 0x00, 0x00, 0x23,
+ 0x00, 0xf0, 0x00, 0xd0, 0xde, 0x22, 0x56, 0xef, 0xef, 0x53, 0x00, 0xdc,
+ 0xee, 0x21, 0x77, 0x00,
+ 0xfe, 0x00, 0x21, 0x0f, 0x10, 0x42, 0xed, 0xda, 0x32, 0x76, 0x10, 0xef,
+ 0xff, 0x11, 0x43, 0x00,
+ 0x00, 0x01, 0xe0, 0xef, 0x22, 0x01, 0xee, 0xf0, 0xf0, 0xef, 0x01, 0x01,
+ 0x00, 0x54, 0x00, 0xa8,
+ 0xff, 0x32, 0x23, 0xff, 0xef, 0x9b, 0xee, 0x45, 0x55, 0x00, 0xde, 0xee,
+ 0x11, 0x22, 0xf0, 0xf0,
+ 0x11, 0x11, 0x12, 0xef, 0xbb, 0x01, 0x01, 0xef, 0x23, 0x12, 0xcd, 0xf0,
+ 0x57, 0x55, 0x00, 0xcc,
+ 0x00, 0x43, 0x00, 0xee, 0x00, 0x00, 0x0f, 0x66, 0x00, 0xdc, 0x00, 0x52,
+ 0x00, 0xfd, 0x01, 0x44,
+ 0xfe, 0xeb, 0x00, 0x00, 0x20, 0x43, 0x00, 0xed, 0x10, 0x0f, 0xba, 0x21,
+ 0x54, 0x0f, 0xff, 0x10,
+ 0x0f, 0xed, 0x12, 0x10, 0xcb, 0x33, 0x65, 0xff, 0xdd, 0xff, 0x22, 0x01,
+ 0xdd, 0x00, 0x12, 0xf0,
+ 0xdd, 0x00, 0x02, 0xdd, 0xba, 0x00, 0x0f, 0x12, 0x32, 0xbc, 0xec, 0x21,
+ 0x65, 0x00, 0xdd, 0xcc,
+ 0x00, 0x35, 0x53, 0xff, 0xdd, 0x01, 0x23, 0xff, 0x99, 0x00, 0x23, 0x00,
+ 0xef, 0xee, 0xff, 0x00,
+ 0x00, 0xec, 0xcc, 0x00, 0x32, 0xdc, 0x9b, 0x00, 0x21, 0x22, 0x0f, 0xde,
+ 0x00, 0x00, 0xdc, 0x00,
+ 0x76, 0x10, 0xde, 0xf0, 0x00, 0x11, 0xce, 0xed, 0xf0, 0x12, 0x01, 0xfe,
+ 0xcc, 0xee, 0x22, 0x67,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x33, 0xf0, 0xbd, 0x37,
+ 0x76, 0xf0, 0xdd, 0xef,
+ 0x00, 0x43, 0x01, 0x00, 0x01, 0xee, 0xf0, 0x67, 0x00, 0xdd, 0x00, 0x00,
+ 0x10, 0x00, 0xfe, 0xdd,
+ 0x42, 0x77, 0xff, 0xfe, 0x10, 0x11, 0xed, 0xff, 0x77, 0x00, 0x0e, 0x0f,
+ 0xfe, 0x0f, 0x22, 0x31,
+ 0x0e, 0x00, 0xff, 0xed, 0x12, 0x55, 0xdd, 0xcc, 0x23, 0x34, 0xee, 0xcd,
+ 0x0f, 0x00, 0x00, 0xec,
+ 0x00, 0x11, 0xbc, 0x10, 0x77, 0x10, 0xff, 0x00, 0x13, 0x21, 0xf0, 0xf0,
+ 0x01, 0xdf, 0xde, 0x36,
+ 0x54, 0xf0, 0xad, 0xee, 0x00, 0x11, 0x01, 0x45, 0x45, 0x0f, 0xcd, 0xff,
+ 0x01, 0x22, 0x01, 0xff,
+ 0xdd, 0xed, 0x46, 0x23, 0xbd, 0xef, 0x23, 0x35, 0xef, 0xbd, 0x00, 0x34,
+ 0x10, 0xdd, 0x22, 0x21,
+ 0xaa, 0x00, 0x42, 0xff, 0xff, 0x44, 0x00, 0xfe, 0xee, 0x00, 0x46, 0x32,
+ 0xf0, 0xf0, 0x01, 0x01,
+ 0x21, 0x32, 0x12, 0x56, 0x01, 0xcf, 0x10, 0x64, 0x24, 0x11, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x44, 0x43, 0x0f, 0xed, 0x11, 0x44, 0xfd, 0xdc, 0x21, 0x22, 0xff, 0xca,
+ 0xfe, 0x11, 0x64, 0x00,
+ 0xfe, 0x0f, 0x00, 0x01, 0x66, 0xff, 0xbb, 0xff, 0x00, 0x12, 0x00, 0x00,
+ 0x00, 0xaa, 0xf0, 0x21,
+ 0x00, 0xef, 0x00, 0xf0, 0xee, 0x23, 0x0f, 0xdc, 0x00, 0x62, 0x11, 0xeb,
+ 0xba, 0xfe, 0x0e, 0x20,
+ 0x72, 0x0e, 0xb8, 0x0f, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x22, 0x00,
+ 0xdf, 0xdd, 0x45, 0x75, 0x00, 0xee, 0xee, 0x33, 0x57, 0x00, 0x00, 0xf0,
+ 0x00, 0x12, 0x22, 0x00,
+ 0x01, 0x23, 0xcd, 0xdd, 0x34, 0x22, 0x9c, 0xff, 0x23, 0x35, 0x21, 0x00,
+ 0xde, 0xf0, 0x34, 0x11,
+ 0x00, 0x02, 0x01, 0xcf, 0x22, 0x54, 0x01, 0xf1, 0xf0, 0xf0, 0x00, 0x77,
+ 0xf0, 0xa9, 0x33, 0x44,
+ 0x00, 0xdd, 0xed, 0x00, 0x64, 0x12, 0x0e, 0xec, 0xfe, 0xed, 0x33, 0x56,
+ 0xff, 0xff, 0x11, 0x00,
+ 0xdd, 0x01, 0x32, 0xee, 0xf0, 0x22, 0xfe, 0xbd, 0x01, 0x12, 0x0f, 0x00,
+ 0x12, 0x0d, 0xa8, 0xfd,
+ 0xf0, 0x12, 0x66, 0x00, 0xdc, 0xef, 0x0f, 0x01, 0x00, 0xee, 0xf0, 0x00,
+ 0xde, 0x32, 0x45, 0xbf,
+ 0xdd, 0xcc, 0x13, 0x23, 0xbb, 0xf0, 0x00, 0xf0, 0x02, 0xf0, 0xba, 0xee,
+ 0x00, 0x00, 0xff, 0x22,
+ 0x11, 0xee, 0x00, 0x12, 0x56, 0xdf, 0x88, 0xdf, 0x21, 0x53, 0x11, 0x00,
+ 0xfe, 0xed, 0xff, 0x00,
+ 0x1f, 0x10, 0x32, 0x21, 0xdc, 0xaa, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xdf,
+ 0xff, 0x00, 0x21, 0x76,
+ 0x11, 0xee, 0xfc, 0x0f, 0x20, 0x43, 0x22, 0x22, 0xfe, 0xcb, 0x00, 0x43,
+ 0x12, 0x0f, 0xcc, 0xf0,
+ 0xf0, 0xde, 0xdf, 0x02, 0x00, 0x88, 0xee, 0x11, 0x34, 0x00, 0xdf, 0xf0,
+ 0xef, 0xdd, 0x00, 0x45,
+ 0x43, 0x12, 0x21, 0xef, 0xac, 0x01, 0x11, 0x01, 0x77, 0x25, 0xee, 0xde,
+ 0x11, 0x21, 0x00, 0x30,
+ 0x32, 0xef, 0xdd, 0x0d, 0x1f, 0x0d, 0x0f, 0x72, 0x10, 0x0c, 0xea, 0x9b,
+ 0xff, 0x33, 0x22, 0xf0,
+ 0xff, 0xdd, 0xed, 0xff, 0xf0, 0x23, 0x34, 0xdf, 0xbc, 0x01, 0x00, 0x9b,
+ 0xfe, 0x00, 0x25, 0x00,
+ 0xf0, 0x01, 0x32, 0x44, 0x23, 0xff, 0xde, 0xdf, 0xe0, 0x00, 0x66, 0x22,
+ 0xff, 0xf0, 0x01, 0x01,
+ 0x12, 0xe0, 0xac, 0x15, 0x11, 0xde, 0xcd, 0x14, 0x45, 0xf0, 0xce, 0xee,
+ 0xf0, 0x65, 0x01, 0xce,
+ 0xff, 0x01, 0x00, 0x00, 0x14, 0x10, 0xff, 0x00, 0xfe, 0xec, 0x50, 0x2f,
+ 0x1e, 0x63, 0x23, 0x0c,
+ 0xfa, 0x0f, 0x54, 0x34, 0x0f, 0xec, 0x0f, 0x20, 0x31, 0x21, 0x00, 0x0f,
+ 0xfd, 0x00, 0x54, 0x0f,
+ 0xda, 0x0f, 0x30, 0x30, 0x31, 0x01, 0x73, 0x56, 0x00, 0xff, 0x00, 0x00,
+ 0xdf, 0x01, 0x47, 0x00,
+ 0x00, 0xff, 0xce, 0x21, 0x33, 0x00, 0x0f, 0xed, 0xde, 0x64, 0x34, 0xdd,
+ 0xbb, 0x22, 0x33, 0xdd,
+ 0xdd, 0x23, 0x45, 0x33, 0xdf, 0x89, 0xe0, 0x43, 0x34, 0x00, 0xf0, 0x00,
+ 0x00, 0xde, 0x11, 0x43,
+ 0xff, 0x00, 0x44, 0x00, 0xdd, 0xf0, 0x01, 0x00, 0x0f, 0x65, 0x23, 0x00,
+ 0x23, 0xf0, 0xcb, 0x33,
+ 0x43, 0xf0, 0xff, 0x00, 0x26, 0x32, 0xcf, 0x00, 0x41, 0x32, 0x11, 0xee,
+ 0x98, 0xff, 0x54, 0x23,
+ 0xee, 0xdd, 0x21, 0x23, 0xed, 0xff, 0x24, 0x01, 0xef, 0x00, 0xf0, 0x01,
+ 0x55, 0xef, 0xab, 0xef,
+ 0x00, 0xf0, 0x02, 0x22, 0x00, 0x02, 0x14, 0xde, 0x9b, 0x00, 0x55, 0x01,
+ 0x0f, 0x00, 0x12, 0x21,
+ 0x01, 0x01, 0x25, 0x01, 0xe0, 0xd0, 0x00, 0x10, 0xed, 0x32, 0x54, 0xcb,
+ 0xdd, 0x1f, 0x72, 0x56,
+ 0x0f, 0xea, 0xee, 0x10, 0x31, 0x0f, 0x0f, 0x00, 0xce, 0xff, 0x10, 0x11,
+ 0x00, 0xcc, 0xbc, 0x01,
+ 0x32, 0x1f, 0x41, 0x0e, 0xe9, 0x00, 0x63, 0x21, 0x11, 0x32, 0x0f, 0xef,
+ 0xf0, 0xdd, 0x00, 0x36,
+ 0xae, 0x00, 0x35, 0xde, 0x8b, 0xef, 0x01, 0x12, 0x00, 0x00, 0x00, 0xdd,
+ 0xf0, 0xf0, 0xf0, 0x03,
+ 0xf0, 0xac, 0xc9, 0x00, 0x14, 0xde, 0xac, 0x01, 0x12, 0x00, 0x00, 0x0f,
+ 0x0f, 0x12, 0x12, 0x0c,
+ 0xca, 0xff, 0x72, 0x34, 0x0e, 0xeb, 0x00, 0x0f, 0xdd, 0x20, 0x53, 0x0e,
+ 0x00, 0x00, 0xba, 0x00,
+ 0x12, 0x00, 0xde, 0xdf, 0xee, 0x00, 0x13, 0x00, 0xaa, 0xee, 0xf0, 0x0f,
+ 0x00, 0xdc, 0xdd, 0x00,
+ 0x0f, 0xde, 0xf0, 0xff, 0xae, 0xff, 0x45, 0x44, 0x00, 0xed, 0xcb, 0x10,
+ 0x34, 0x21, 0x22, 0x00,
+ 0xf0, 0x12, 0x00, 0xd0, 0xf0, 0x55, 0x33, 0x01, 0xbe, 0xf0, 0x55, 0x00,
+ 0xac, 0x01, 0x14, 0x11,
+ 0xf0, 0xee, 0xcd, 0x00, 0x16, 0xe0, 0xef, 0x01, 0xf0, 0xe0, 0x00, 0xee,
+ 0x88, 0xfe, 0x21, 0x1f,
+ 0xfd, 0xfd, 0xfe, 0x10, 0x51, 0xeb, 0xdc, 0x42, 0x22, 0xdc, 0xef, 0x0f,
+ 0x10, 0x52, 0x00, 0x0f,
+ 0x10, 0x10, 0xfd, 0xef, 0x45, 0x76, 0x11, 0x00, 0xef, 0x00, 0x02, 0x23,
+ 0x56, 0x00, 0xcf, 0xff,
+ 0x00, 0x00, 0xf0, 0x11, 0x10, 0x00, 0x21, 0xfe, 0xdc, 0x11, 0x53, 0x43,
+ 0x21, 0x0e, 0xca, 0xff,
+ 0x24, 0x77, 0x00, 0xf0, 0xf0, 0xef, 0x01, 0x34, 0x22, 0x00, 0xd0, 0x00,
+ 0x35, 0x74, 0x32, 0x00,
+ 0xde, 0xf0, 0x00, 0x10, 0x77, 0x43, 0x0f, 0xee, 0x10, 0x23, 0x0f, 0xdb,
+ 0x10, 0x74, 0x11, 0x0f,
+ 0xff, 0xf0, 0x00, 0x23, 0x33, 0x00, 0xfe, 0x11, 0x21, 0x20, 0x44, 0x44,
+ 0x00, 0x10, 0x0e, 0xda,
+ 0x31, 0x77, 0x10, 0x01, 0x33, 0x00, 0xdf, 0x01, 0x76, 0x00, 0x00, 0x33,
+ 0x11, 0x00, 0xe0, 0xd0,
+ 0x00, 0x77, 0x21, 0xf0, 0x00, 0x00, 0x00, 0x32, 0x01, 0x12, 0x21, 0xce,
+ 0xdc, 0x31, 0x63, 0x00,
+ 0xed, 0xed, 0x0f, 0x1f, 0xeb, 0xbc, 0x21, 0x21, 0xcb, 0x00, 0x54, 0x00,
+ 0xda, 0x00, 0x41, 0x20,
+ 0x00, 0x0f, 0xec, 0x10, 0x72, 0x00, 0xeb, 0x0f, 0x22, 0x20, 0xdf, 0xef,
+ 0xdd, 0x0f, 0x71, 0x11,
+ 0x0f, 0xfe, 0x12, 0x0c, 0xb8, 0x0f, 0x53, 0x11, 0x0e, 0x00, 0x00, 0x00,
+ 0x4d, 0x00, 0x38, 0x00,
+ 0xe7, 0x60, 0x88, 0x26, 0x52, 0x67, 0x71, 0x2c, 0xfc, 0x60, 0xe9, 0x77,
+ 0x26, 0x9e, 0xdd, 0xef,
+ 0xdd, 0xbc, 0x11, 0x35, 0xee, 0xee, 0xf0, 0xce, 0xf0, 0xf0, 0xbb, 0x00,
+ 0x35, 0xe0, 0xbe, 0x00,
+ 0xf0, 0xdf, 0xf0, 0x03, 0x13, 0x00, 0xef, 0xff, 0xff, 0x55, 0x23, 0x13,
+ 0x00, 0xec, 0x51, 0x23,
+ 0xfc, 0x00, 0x00, 0xcb, 0x44, 0x53, 0xec, 0xfe, 0xf0, 0xf0, 0x03, 0x24,
+ 0x00, 0xd0, 0xbf, 0xde,
+ 0xf2, 0x37, 0x14, 0x00, 0xd0, 0xb0, 0xde, 0xee, 0x75, 0x44, 0x0f, 0xde,
+ 0x00, 0x12, 0x00, 0x23,
+ 0x01, 0xbd, 0x00, 0x57, 0xf0, 0xdc, 0x01, 0x32, 0x00, 0x00, 0xf0, 0xcc,
+ 0xbb, 0xde, 0x10, 0x32,
+ 0xcb, 0xac, 0x00, 0x22, 0xff, 0xdd, 0x11, 0x01, 0xdf, 0x00, 0x00, 0xdd,
+ 0x03, 0xf1, 0x89, 0xf0,
+ 0x01, 0x00, 0xee, 0xf0, 0xf0, 0xef, 0xed, 0x0f, 0x20, 0x21, 0xfd, 0xc8,
+ 0x60, 0x42, 0xeb, 0xcc,
+ 0x00, 0x2f, 0x0f, 0x00, 0x0d, 0xed, 0xfe, 0xee, 0x10, 0xfd, 0x98, 0xfe,
+ 0x10, 0x41, 0x10, 0x00,
+ 0x0f, 0x0d, 0xdb, 0x30, 0x64, 0x00, 0x0f, 0xff, 0x00, 0x45, 0xf0, 0x9c,
+ 0x00, 0x24, 0x11, 0xf0,
+ 0xf0, 0xff, 0xee, 0x11, 0x65, 0x00, 0xed, 0x00, 0x11, 0x00, 0x01, 0x13,
+ 0x00, 0x01, 0xf0, 0xe0,
+ 0x14, 0x23, 0xcf, 0xf0, 0x47, 0x02, 0xc0, 0xf2, 0x35, 0x00, 0xff, 0x73,
+ 0x26, 0xff, 0xff, 0x30,
+ 0x00, 0x0e, 0x61, 0x43, 0x0d, 0x0c, 0x33, 0x20, 0xd8, 0x40, 0x43, 0x00,
+ 0x20, 0x21, 0x31, 0x00,
+ 0xdd, 0xcd, 0x43, 0x67, 0x00, 0xed, 0xdc, 0xee, 0x00, 0x30, 0x43, 0x32,
+ 0xff, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x43, 0x13, 0x00, 0xf0, 0xca, 0x00, 0x35, 0x11, 0x00, 0x01,
+ 0xe0, 0xdf, 0x00, 0x44,
+ 0xe0, 0x9e, 0x00, 0x02, 0x11, 0x02, 0x00, 0xbb, 0x12, 0x46, 0xf0, 0xdf,
+ 0x01, 0xf0, 0xe0, 0x45,
+ 0x43, 0x00, 0xae, 0xed, 0x02, 0x02, 0x02, 0x02, 0xef, 0xef, 0x00, 0x64,
+ 0x0e, 0xd8, 0x10, 0x31,
+ 0x00, 0x0f, 0x10, 0xee, 0xe0, 0xf0, 0xf0, 0x01, 0x00, 0x30, 0x40, 0x0f,
+ 0xaa, 0x00, 0x63, 0x1e,
+ 0x32, 0x77, 0x05, 0x00, 0x0f, 0x0f, 0x20, 0x57, 0x11, 0xff, 0x00, 0xf0,
+ 0xf0, 0x03, 0x00, 0xff,
+ 0x01, 0x45, 0x00, 0xbe, 0xee, 0x00, 0x32, 0x11, 0x00, 0x12, 0x11, 0xee,
+ 0xf0, 0x36, 0x00, 0xcf,
+ 0x00, 0x13, 0x00, 0x9e, 0xee, 0x26, 0x55, 0xff, 0xdd, 0x22, 0x65, 0x00,
+ 0xff, 0x11, 0x00, 0x1f,
+ 0x42, 0x10, 0x0c, 0xec, 0xfe, 0x41, 0x22, 0xc9, 0xac, 0x00, 0x32, 0x00,
+ 0xf0, 0xdd, 0xbc, 0x01,
+ 0x22, 0xed, 0x0f, 0xee, 0xdb, 0x32, 0x00, 0xaa, 0x20, 0x22, 0xfe, 0xef,
+ 0x22, 0x01, 0xf0, 0xef,
+ 0x00, 0x65, 0x01, 0xee, 0xef, 0x00, 0x56, 0x22, 0x00, 0xdf, 0xdd, 0x54,
+ 0x22, 0xe0, 0x00, 0xf0,
+ 0x00, 0x12, 0xf0, 0xf3, 0xf1, 0x9c, 0xdb, 0x00, 0x36, 0x00, 0xe0, 0x00,
+ 0xe0, 0xad, 0xef, 0x23,
+ 0x46, 0xd0, 0xae, 0x00, 0x02, 0x00, 0xed, 0x0f, 0xf0, 0x12, 0x55, 0x00,
+ 0xfc, 0x0f, 0x31, 0x10,
+ 0x0d, 0xfd, 0x42, 0x77, 0x11, 0xfd, 0xda, 0x00, 0x32, 0xff, 0xfe, 0x20,
+ 0x00, 0x0e, 0x0e, 0xeb,
+ 0x0f, 0x72, 0x40, 0xfd, 0xec, 0x00, 0x00, 0xed, 0xfd, 0x34, 0x00, 0xff,
+ 0x53, 0xff, 0x88, 0xfe,
+ 0x11, 0x33, 0x00, 0xfc, 0xee, 0x00, 0x1f, 0x10, 0x10, 0xfd, 0x10, 0x31,
+ 0xff, 0xce, 0xdf, 0xff,
+ 0x66, 0x00, 0xab, 0xef, 0x01, 0xf0, 0x02, 0x27, 0x01, 0xf0, 0xe0, 0xff,
+ 0xe0, 0x00, 0x44, 0x75,
+ 0x11, 0x00, 0xff, 0x00, 0x10, 0x01, 0x11, 0xee, 0xff, 0x77, 0x01, 0xce,
+ 0x02, 0x46, 0x00, 0xc0,
+ 0xff, 0xf0, 0x11, 0x11, 0xff, 0xef, 0x12, 0x24, 0x00, 0xfe, 0x20, 0x10,
+ 0xad, 0x00, 0x57, 0x00,
+ 0xf0, 0x00, 0xf0, 0xee, 0xf1, 0x25, 0x33, 0xd0, 0x8c, 0x0f, 0xef, 0xed,
+ 0x11, 0x12, 0xf0, 0x01,
+ 0x00, 0xfb, 0x10, 0x0e, 0x88, 0x00, 0x65, 0x00, 0xff, 0x0f, 0x21, 0x00,
+ 0xef, 0x02, 0x33, 0x00,
+ 0xff, 0x01, 0x13, 0xdd, 0xde, 0x25, 0x01, 0xce, 0x0e, 0x75, 0x42, 0x0f,
+ 0x0c, 0xfd, 0x10, 0x43,
+ 0x12, 0x21, 0x0f, 0xf9, 0x10, 0x43, 0xef, 0x9a, 0xff, 0x0f, 0x11, 0x31,
+ 0x00, 0x0e, 0x1f, 0x4f,
+ 0x0b, 0xec, 0x20, 0x62, 0x20, 0x31, 0x10, 0xfd, 0xfe, 0x0e, 0xee, 0x12,
+ 0x24, 0xdd, 0xbe, 0xe0,
+ 0xc0, 0x05, 0x32, 0xfd, 0x46, 0x76, 0xef, 0xcc, 0xef, 0x23, 0x34, 0xf0,
+ 0xde, 0xf0, 0xf0, 0x22,
+ 0x23, 0xcf, 0xe0, 0x35, 0x00, 0xc0, 0x33, 0x77, 0x00, 0xef, 0xf0, 0x33,
+ 0xf0, 0x9c, 0x21, 0x45,
+ 0x00, 0x0e, 0x00, 0xfe, 0x00, 0x1f, 0x0e, 0x20, 0x1f, 0x0f, 0x0f, 0xee,
+ 0xbc, 0xeb, 0x20, 0x63,
+ 0x00, 0xe0, 0xee, 0xeb, 0xdb, 0xfe, 0x63, 0x13, 0xfd, 0xee, 0x43, 0x22,
+ 0xdb, 0xde, 0x44, 0x32,
+ 0xe0, 0x00, 0x36, 0x10, 0xe0, 0x32, 0x74, 0x00, 0xf1, 0x12, 0x11, 0x00,
+ 0x01, 0xe0, 0x23, 0x33,
+ 0x00, 0x13, 0x21, 0x88, 0xcd, 0x32, 0x65, 0xff, 0xed, 0x00, 0x11, 0x01,
+ 0x0f, 0xef, 0xe0, 0xe0,
+ 0x04, 0xf2, 0x8c, 0xec, 0x03, 0x25, 0x00, 0xcf, 0xed, 0xf0, 0x21, 0x23,
+ 0xff, 0xa8, 0x00, 0x11,
+ 0x21, 0x00, 0x00, 0xee, 0xee, 0x11, 0xcd, 0xed, 0x00, 0x0f, 0x0f, 0xdd,
+ 0x98, 0x0e, 0x0f, 0x00,
+ 0x63, 0x0e, 0xd8, 0x0f, 0x10, 0x30, 0x20, 0x11, 0x00, 0xed, 0xef, 0x20,
+ 0xff, 0xbe, 0x01, 0xee,
+ 0xee, 0x22, 0xf0, 0xd0, 0x01, 0x67, 0x22, 0x0f, 0xa9, 0xff, 0x11, 0x00,
+ 0x31, 0x44, 0xf0, 0xef,
+ 0x00, 0x10, 0xcc, 0xde, 0x35, 0x44, 0xcf, 0xbe, 0x01, 0x24, 0x00, 0xef,
+ 0xf0, 0xef, 0x00, 0xe0,
+ 0xed, 0x75, 0x32, 0x0f, 0x30, 0x00, 0xed, 0xdc, 0x32, 0x76, 0x00, 0xee,
+ 0xff, 0x32, 0x43, 0x0e,
+ 0x10, 0x20, 0x0c, 0xfe, 0x10, 0x31, 0x52, 0x33, 0xfc, 0xdb, 0x32, 0x66,
+ 0x00, 0x00, 0x31, 0xff,
+ 0x22, 0x44, 0xbc, 0xde, 0x57, 0x53, 0x00, 0x00, 0xff, 0xef, 0x34, 0x22,
+ 0xf0, 0xf0, 0xe0, 0x01,
+ 0x56, 0x11, 0xf0, 0xcd, 0xfe, 0x00, 0x11, 0x22, 0x00, 0xee, 0xef, 0xf1,
+ 0x27, 0x32, 0xf0, 0xa0,
+ 0xe0, 0xe0, 0xc0, 0xe1, 0xf2, 0xef, 0xdd, 0x54, 0x35, 0xcc, 0xee, 0x20,
+ 0x00, 0xd9, 0x71, 0x53,
+ 0x00, 0xfd, 0x11, 0x11, 0x0f, 0x1f, 0x00, 0xfb, 0xfe, 0x20, 0x0e, 0x0e,
+ 0x0f, 0x0e, 0xed, 0xd9,
+ 0x71, 0x64, 0x0f, 0xec, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x1f, 0xec, 0x00,
+ 0x00, 0x9b, 0xdd, 0x12,
+ 0x54, 0x0f, 0xca, 0x00, 0x12, 0x00, 0x0f, 0x00, 0xf0, 0xcd, 0xef, 0xf0,
+ 0x00, 0xff, 0xe0, 0xcc,
+ 0xde, 0xf0, 0xd0, 0x9b, 0xf0, 0x15, 0x01, 0xf0, 0x01, 0xd0, 0xd0, 0x05,
+ 0x12, 0x00, 0x0f, 0xee,
+ 0x11, 0x77, 0x40, 0xff, 0x10, 0x33, 0x10, 0xee, 0xde, 0x75, 0x11, 0xee,
+ 0xef, 0xf0, 0xff, 0xf0,
+ 0xe0, 0xf0, 0x0f, 0xed, 0xbb, 0x00, 0x24, 0x43, 0x0f, 0xfc, 0x40, 0x63,
+ 0x15, 0x10, 0x0d, 0x00,
+ 0x45, 0x21, 0x10, 0x00, 0xdc, 0x22, 0x66, 0xff, 0xee, 0x00, 0xf0, 0xce,
+ 0xff, 0x11, 0xff, 0xf0,
+ 0x00, 0xb9, 0xfe, 0x00, 0x0f, 0x1f, 0x0e, 0x89, 0xee, 0x00, 0x22, 0x00,
+ 0xdd, 0xf0, 0x02, 0x03,
+ 0xef, 0xcf, 0xce, 0x05, 0x26, 0xe0, 0xaf, 0x00, 0x00, 0xff, 0xee, 0x02,
+ 0x12, 0x11, 0xff, 0xfe,
+ 0x0e, 0x0f, 0xeb, 0x00, 0x75, 0x10, 0xcd, 0x00, 0xee, 0x88, 0xff, 0x00,
+ 0x00, 0x0f, 0xff, 0x0d,
+ 0xfd, 0x0f, 0x11, 0x20, 0x0c, 0xec, 0x71, 0x33, 0x0d, 0x20, 0x34, 0x10,
+ 0x10, 0x43, 0x12, 0xfd,
+ 0xe9, 0x31, 0x76, 0x11, 0x21, 0x33, 0x11, 0x00, 0x11, 0x52, 0x0f, 0xfe,
+ 0x24, 0x55, 0x00, 0x10,
+ 0x33, 0xf0, 0xef, 0xe1, 0x26, 0x32, 0xc0, 0xcf, 0xbf, 0xf0, 0x27, 0x12,
+ 0xcf, 0x00, 0x21, 0x00,
+ 0x0f, 0x40, 0x01, 0x00, 0x41, 0x54, 0x24, 0x21, 0x00, 0x21, 0x23, 0x11,
+ 0x00, 0x21, 0x01, 0x04,
+ 0x67, 0x22, 0xff, 0xef, 0x0e, 0xfd, 0xde, 0xd1, 0x02, 0x00, 0x1e, 0x1c,
+ 0x70, 0x66, 0x00, 0x0c,
+ 0x00, 0x10, 0x20, 0x11, 0x00, 0x0d, 0x53, 0x35, 0x00, 0x13, 0x23, 0xa9,
+ 0xee, 0x21, 0x46, 0x00,
+ 0xf0, 0x30, 0x20, 0xde, 0xef, 0x76, 0x31, 0xed, 0xef, 0x20, 0x12, 0xff,
+ 0xff, 0x00, 0x01, 0x56,
+ 0xe0, 0x8f, 0x00, 0x02, 0xf0, 0xf0, 0xf2, 0xf0, 0xf0, 0x00, 0x00, 0x0e,
+ 0x25, 0x00, 0x01, 0x24,
+ 0xef, 0xcd, 0x74, 0x12, 0xca, 0x00, 0x16, 0xf0, 0xce, 0x00, 0xef, 0xf0,
+ 0x45, 0x00, 0xae, 0x00,
+ 0x12, 0x10, 0x10, 0x10, 0x21, 0x23, 0x11, 0x43, 0x43, 0x0f, 0x10, 0x22,
+ 0x43, 0x2e, 0x0c, 0x0e,
+ 0xfa, 0x21, 0x66, 0x00, 0x02, 0x35, 0x10, 0xf0, 0xe0, 0xef, 0xf0, 0x43,
+ 0x74, 0x21, 0xed, 0xca,
+ 0x00, 0x10, 0x00, 0x10, 0x42, 0x01, 0xf0, 0xf0, 0xef, 0x24, 0x55, 0x00,
+ 0xfe, 0x64, 0x11, 0x0f,
+ 0x00, 0x0f, 0xef, 0x23, 0x35, 0xef, 0xde, 0x62, 0x21, 0x0f, 0x0e, 0xed,
+ 0xff, 0x37, 0x64, 0x0f,
+ 0x0e, 0xfc, 0xff, 0x30, 0x0d, 0xdd, 0x30, 0x1f, 0xb8, 0xf0, 0x20, 0xf0,
+ 0xcc, 0xff, 0xff, 0x11,
+ 0x42, 0xcf, 0xcc, 0x21, 0x23, 0xbd, 0xef, 0x03, 0x07, 0xe1, 0x8f, 0xff,
+ 0x03, 0xf3, 0xe0, 0xf2,
+ 0x04, 0xe2, 0xae, 0xfd, 0xf0, 0xe1, 0x17, 0x01, 0xdd, 0xf0, 0x57, 0x00,
+ 0xbd, 0x0f, 0x13, 0x22,
+ 0x0f, 0xf0, 0xef, 0xcf, 0x02, 0xf0, 0xcd, 0x03, 0xf0, 0xb8, 0x00, 0x23,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x22, 0xee, 0xea, 0x71, 0x31, 0xda, 0xff, 0x32, 0x00, 0xca, 0xff, 0x1f,
+ 0x10, 0xed, 0xcd, 0x1f,
+ 0x0e, 0xab, 0x0e, 0x2f, 0x0c, 0xfe, 0xff, 0xec, 0x3f, 0x4f, 0xdb, 0xde,
+ 0x3f, 0x1e, 0x0e, 0x71,
+ 0x20, 0xa9, 0xff, 0xf0, 0x00, 0x20, 0x00, 0xdf, 0xff, 0xde, 0xbc, 0xf0,
+ 0x13, 0xf0, 0xcc, 0x0f,
+ 0xed, 0xcd, 0xde, 0xab, 0xff, 0x24, 0x00, 0xbb, 0xf0, 0x00, 0xee, 0x00,
+ 0x44, 0x00, 0xd0, 0xfe,
+ 0xfe, 0x22, 0x13, 0xdf, 0xf0, 0x03, 0xe2, 0xd0, 0xf0, 0x23, 0xac, 0xef,
+ 0x16, 0x43, 0x01, 0x8a,
+ 0xee, 0x25, 0x42, 0xee, 0xee, 0x01, 0x11, 0x00, 0x1f, 0x01, 0x13, 0x26,
+ 0x31, 0x00, 0x00, 0x53,
+ 0x11, 0xdc, 0x14, 0x76, 0xf0, 0x00, 0x30, 0xdf, 0xde, 0x44, 0x53, 0x00,
+ 0xff, 0xf0, 0xe0, 0x01,
+ 0x21, 0xec, 0xde, 0x32, 0x22, 0xeb, 0xdf, 0x10, 0x21, 0xcc, 0xdd, 0x77,
+ 0x63, 0xff, 0xf0, 0x12,
+ 0x11, 0x24, 0x23, 0x02, 0xe0, 0xd2, 0x45, 0x01, 0x00, 0x33, 0x00, 0x11,
+ 0x64, 0x10, 0x00, 0x1f,
+ 0x0e, 0x00, 0x00, 0xe1, 0xee, 0xfb, 0x3f, 0x0d, 0xba, 0x8b, 0xee, 0x00,
+ 0xed, 0x0f, 0x00, 0x0c,
+ 0xdc, 0xfe, 0x10, 0x2f, 0xdb, 0xde, 0x70, 0x62, 0x0d, 0xfd, 0x20, 0x1e,
+ 0x0b, 0x43, 0x22, 0xea,
+ 0x00, 0x41, 0x00, 0x00, 0x10, 0xe0, 0x11, 0x66, 0x01, 0x11, 0x31, 0x00,
+ 0xf0, 0x03, 0x57, 0x01,
+ 0xe1, 0xe1, 0xf1, 0x02, 0xf1, 0xb1, 0xf1, 0xf5, 0x02, 0xd0, 0xa0, 0xf0,
+ 0x13, 0x00, 0xf0, 0xf0,
+ 0x23, 0x10, 0xa8, 0x00, 0x10, 0x32, 0x21, 0xee, 0xde, 0x11, 0x02, 0x11,
+ 0x11, 0xdd, 0x30, 0x63,
+ 0xb8, 0xfc, 0x41, 0x20, 0xeb, 0x0f, 0x30, 0x0e, 0x0f, 0x30, 0x3f, 0x71,
+ 0x32, 0xf0, 0xf0, 0x00,
+ 0x24, 0x31, 0x10, 0x31, 0x77, 0x11, 0x0e, 0x21, 0x44, 0xf0, 0xf0, 0x77,
+ 0x21, 0xfe, 0x01, 0x33,
+ 0xef, 0xdc, 0x22, 0x54, 0x00, 0xeb, 0x20, 0x40, 0x0f, 0xfd, 0x01, 0x31,
+ 0x10, 0x10, 0x24, 0x01,
+ 0xc0, 0xff, 0x33, 0x14, 0x82, 0xd0, 0xd4, 0x17, 0x00, 0xa0, 0xef, 0xe0,
+ 0x00, 0x01, 0xcf, 0xcd,
+ 0x03, 0xf1, 0xdc, 0x00, 0xbb, 0xdd, 0xf1, 0xd0, 0xeb, 0xde, 0x8a, 0x00,
+ 0x02, 0xfe, 0xdb, 0x10,
+ 0x31, 0x00, 0xef, 0xff, 0x10, 0x22, 0x00, 0x0f, 0x0d, 0x73, 0x12, 0xeb,
+ 0x21, 0x53, 0x0c, 0xfc,
+ 0x21, 0x22, 0x02, 0x14, 0x31, 0x00, 0x52, 0x14, 0xff, 0x32, 0x64, 0x0e,
+ 0x00, 0x13, 0xfd, 0xeb,
+ 0x0e, 0xf0, 0xec, 0xca, 0x0f, 0x30, 0xe0, 0xbe, 0x0f, 0x00, 0x01, 0xf0,
+ 0x04, 0x01, 0xce, 0x20,
+ 0x77, 0x11, 0x00, 0x12, 0x00, 0x20, 0x45, 0x22, 0x11, 0x33, 0x02, 0x15,
+ 0x74, 0x31, 0x21, 0x21,
+ 0x33, 0x24, 0x31, 0x41, 0x30, 0x32, 0x74, 0x20, 0x0d, 0x30, 0x33, 0x00,
+ 0x10, 0x34, 0x30, 0x20,
+ 0x45, 0x31, 0x0f, 0x60, 0x33, 0x11, 0x36, 0x00, 0xdd, 0x64, 0x44, 0x00,
+ 0x00, 0x13, 0x03, 0xf0,
+ 0x02, 0x17, 0x12, 0xf0, 0x00, 0x43, 0x55, 0x02, 0xff, 0xff, 0x31, 0x44,
+ 0x12, 0x01, 0x01, 0xd0,
+ 0xd2, 0x26, 0xd0, 0x8f, 0x01, 0x02, 0x12, 0xef, 0xe0, 0xf0, 0xcd, 0x0c,
+ 0x50, 0x4f, 0x1c, 0x10,
+ 0x11, 0x30, 0x72, 0x21, 0x01, 0x27, 0x12, 0xf0, 0x00, 0x00, 0x32, 0xfe,
+ 0x0d, 0x41, 0xfb, 0xaa,
+ 0x00, 0x20, 0xeb, 0xee, 0x42, 0xff, 0xa9, 0xfe, 0x00, 0x00, 0x0e, 0x0f,
+ 0x1f, 0xfc, 0xcb, 0x0f,
+ 0x1f, 0x1e, 0x0e, 0xfe, 0x0e, 0x2e, 0xdd, 0xff, 0xcc, 0xde, 0x62, 0x35,
+ 0xce, 0xac, 0xfe, 0xcd,
+ 0xef, 0x04, 0xd0, 0xad, 0xee, 0xff, 0xec, 0xeb, 0xdf, 0xf1, 0xe0, 0xce,
+ 0x00, 0x26, 0x10, 0x00,
+ 0x01, 0x22, 0x00, 0xe0, 0x03, 0x74, 0x00, 0xee, 0x04, 0x03, 0xcc, 0x00,
+ 0x15, 0xae, 0xff, 0x21,
+ 0x20, 0x0d, 0x00, 0x13, 0x23, 0x1b, 0x2d, 0x1e, 0x20, 0x31, 0x12, 0xdf,
+ 0xd0, 0xe0, 0x02, 0xd0,
+ 0x89, 0x13, 0x03, 0x8b, 0x00, 0x23, 0x00, 0xfe, 0xf3, 0x03, 0x00, 0x03,
+ 0x07, 0xe1, 0xbf, 0xdd,
+ 0x12, 0x00, 0x88, 0xfd, 0x12, 0x00, 0xfe, 0x22, 0xfd, 0xd9, 0x20, 0xf0,
+ 0xef, 0xef, 0xcf, 0x00,
+ 0x02, 0xbe, 0xee, 0xe0, 0xbf, 0xe0, 0xef, 0xde, 0xcc, 0x01, 0x06, 0xaf,
+ 0xed, 0x01, 0x12, 0x12,
+ 0x00, 0xbd, 0xf0, 0xf1, 0xdb, 0xf0, 0x04, 0xbd, 0xde, 0xe0, 0xed, 0xc8,
+ 0xfd, 0xfd, 0x0e, 0x0e,
+ 0xfd, 0xfc, 0x0d, 0xec, 0xeb, 0x3f, 0x60, 0x0d, 0x0a, 0xfe, 0x0e, 0x1e,
+ 0x70, 0x3e, 0xfd, 0x0e,
+ 0x0d, 0x0b, 0x2f, 0x61, 0x0f, 0xfd, 0x00, 0x13, 0x33, 0x20, 0x23, 0x47,
+ 0x13, 0x01, 0x03, 0x33,
+ 0x02, 0x00, 0x45, 0x34, 0xf2, 0xf2, 0x21, 0x50, 0xfe, 0xbf, 0xc1, 0xb0,
+ 0x0e, 0x10, 0x01, 0x15,
+ 0x20, 0x08, 0xff, 0x10, 0x32, 0x41, 0x21, 0xf0, 0x90, 0xf0, 0x35, 0x12,
+ 0x12, 0x01, 0xcc, 0xd0,
+ 0x03, 0x01, 0xfe, 0x0f, 0x75, 0x20, 0x0c, 0xfe, 0x0f, 0x2e, 0x71, 0x11,
+ 0xeb, 0xfe, 0x00, 0x0e,
+ 0x0b, 0x30, 0x64, 0x22, 0x10, 0x0c, 0x0d, 0x62, 0x34, 0x10, 0x11, 0x35,
+ 0x41, 0x1f, 0x30, 0x30,
+ 0x10, 0x2f, 0x42, 0x12, 0x3f, 0x5c, 0x1c, 0x00, 0x36, 0x21, 0x10, 0x30,
+ 0x52, 0x00, 0xae, 0x02,
+ 0xe4, 0xf1, 0x27, 0x34, 0xd0, 0xaf, 0x02, 0x03, 0x03, 0x03, 0x36, 0x32,
+ 0xe0, 0xff, 0x43, 0x44,
+ 0x00, 0x10, 0x22, 0xf0, 0xd0, 0xf3, 0xd4, 0xa0, 0x01, 0x13, 0xe1, 0xa1,
+ 0xe5, 0x05, 0xd0, 0xf0,
+ 0x14, 0x03, 0xa0, 0xf1, 0x14, 0x44, 0x00, 0x00, 0x52, 0x22, 0x12, 0x33,
+ 0x10, 0x2e, 0x66, 0x22,
+ 0x10, 0x22, 0x10, 0x1f, 0x54, 0x13, 0x01, 0x26, 0x00, 0x10, 0x01, 0x01,
+ 0x98, 0x00, 0x94, 0x00,
+ 0xbf, 0x42, 0xca, 0x43, 0x9a, 0x3d, 0x8e, 0x41, 0x9a, 0xff, 0x03, 0x00,
+ 0x2f, 0x33, 0xe0, 0xab,
+ 0x00, 0x13, 0xed, 0x0d, 0x23, 0x24, 0x02, 0xe0, 0xd9, 0xe0, 0x41, 0x74,
+ 0x20, 0xce, 0xfe, 0x11,
+ 0x23, 0x00, 0xe0, 0x1f, 0x10, 0x00, 0x9c, 0x0f, 0x31, 0x01, 0x00, 0x06,
+ 0xec, 0xcb, 0x21, 0x32,
+ 0xfe, 0xf0, 0x51, 0xf0, 0xaa, 0x00, 0x24, 0x0f, 0x0c, 0x01, 0xf3, 0xef,
+ 0x0e, 0x21, 0x31, 0xe0,
+ 0xf1, 0x22, 0xee, 0xe0, 0x45, 0x10, 0xbe, 0xd2, 0x14, 0x3e, 0xca, 0xe0,
+ 0x22, 0x10, 0xff, 0x62,
+ 0x00, 0xdd, 0x74, 0x22, 0xfd, 0xe0, 0x47, 0x00, 0xcb, 0xf0, 0x42, 0x01,
+ 0xce, 0x00, 0x32, 0xda,
+ 0x00, 0x53, 0xd0, 0xba, 0x21, 0x12, 0x0e, 0x10, 0x12, 0xef, 0xff, 0x22,
+ 0x11, 0xdc, 0x21, 0x40,
+ 0xaf, 0xf0, 0x12, 0x21, 0x0c, 0xdb, 0x51, 0x12, 0xdc, 0xd0, 0x36, 0x00,
+ 0x2f, 0x40, 0xce, 0xef,
+ 0x43, 0x00, 0xdc, 0x00, 0x10, 0x20, 0x20, 0xef, 0xd1, 0xe0, 0x01, 0x60,
+ 0xfe, 0x06, 0x45, 0xed,
+ 0xd0, 0x23, 0x12, 0xed, 0x02, 0x44, 0xad, 0xee, 0x12, 0x3d, 0x0a, 0xa0,
+ 0x03, 0x00, 0x0f, 0x66,
+ 0x00, 0xba, 0x00, 0x21, 0x03, 0x00, 0x0f, 0x2f, 0xff, 0x01, 0xf4, 0x00,
+ 0x42, 0xfe, 0xde, 0x44,
+ 0x46, 0xdf, 0xaa, 0x00, 0x40, 0x03, 0x01, 0xee, 0xcb, 0x11, 0x31, 0xf0,
+ 0x32, 0x33, 0x8a, 0xff,
+ 0x00, 0x23, 0x10, 0x0f, 0x0f, 0xee, 0xf2, 0x13, 0x41, 0xda, 0xf0, 0x52,
+ 0x01, 0xcf, 0x10, 0x32,
+ 0x0e, 0xed, 0x01, 0x25, 0x01, 0xe0, 0x2e, 0x10, 0xe0, 0xf0, 0xbc, 0x0f,
+ 0x21, 0x01, 0x00, 0xf0,
+ 0x0d, 0x0f, 0xf1, 0x20, 0x61, 0x07, 0xb4, 0xfc, 0x30, 0x20, 0xc0, 0x10,
+ 0x0e, 0xda, 0x14, 0x45,
+ 0xde, 0xcc, 0x30, 0x00, 0x02, 0x11, 0x00, 0x10, 0x2e, 0x0e, 0xf1, 0xcf,
+ 0xe0, 0xd2, 0xfe, 0x70,
+ 0x40, 0x8d, 0x07, 0x34, 0xe9, 0xe0, 0x21, 0x42, 0xce, 0xdd, 0x22, 0x11,
+ 0x01, 0x00, 0x2f, 0x1b,
+ 0x20, 0x14, 0xf0, 0x00, 0x4f, 0xdb, 0x00, 0x72, 0x12, 0xaf, 0x10, 0x2e,
+ 0x0d, 0x26, 0xe1, 0xcd,
+ 0x10, 0x36, 0x00, 0xe0, 0xdf, 0x1f, 0x21, 0x02, 0xc1, 0x00, 0x0f, 0x53,
+ 0xef, 0xde, 0xf0, 0xe5,
+ 0x21, 0xec, 0x0e, 0x72, 0xe1, 0xbf, 0x0c, 0x21, 0x44, 0x00, 0xdb, 0xf1,
+ 0x34, 0x0f, 0x3f, 0x11,
+ 0x9e, 0xf0, 0x13, 0x52, 0xd9, 0xe0, 0x43, 0x23, 0xda, 0xff, 0x00, 0x33,
+ 0x0f, 0x1f, 0x31, 0xaf,
+ 0xfd, 0x12, 0x54, 0xfb, 0xd0, 0x10, 0x10, 0xef, 0xd0, 0x04, 0x2f, 0x2e,
+ 0x74, 0x00, 0xdf, 0xe0,
+ 0x20, 0x20, 0x0e, 0x47, 0x01, 0xcf, 0x20, 0x30, 0xd8, 0x01, 0x32, 0xc0,
+ 0xfe, 0x31, 0xf1, 0x00,
+ 0x20, 0x0d, 0x90, 0xdd, 0x00, 0x77, 0x00, 0x0b, 0x00, 0x14, 0xe0, 0xbe,
+ 0x0f, 0x00, 0x12, 0x00,
+ 0xe0, 0xe0, 0x11, 0x53, 0xc9, 0xce, 0x22, 0x25, 0xed, 0x00, 0x51, 0x00,
+ 0xbd, 0x11, 0x14, 0x0f,
+ 0x0e, 0x10, 0x01, 0x12, 0x01, 0xe1, 0xbf, 0x0f, 0x23, 0x24, 0x00, 0xd9,
+ 0x00, 0x54, 0x0e, 0x0d,
+ 0xf0, 0x43, 0x1e, 0xdc, 0xf0, 0x10, 0x30, 0x20, 0xe0, 0xce, 0x12, 0x77,
+ 0xf0, 0xa8, 0x0f, 0x42,
+ 0x02, 0xd0, 0x10, 0x0d, 0xf2, 0x11, 0x00, 0x1d, 0x0f, 0x10, 0x34, 0xc1,
+ 0xff, 0x2e, 0x65, 0xe2,
+ 0xef, 0xfc, 0x30, 0x1f, 0xcc, 0xef, 0x13, 0x36, 0x10, 0x0e, 0xdf, 0xe0,
+ 0x41, 0x24, 0xc0, 0xdf,
+ 0x54, 0x22, 0x00, 0xec, 0x9d, 0x11, 0x47, 0x02, 0xdc, 0x10, 0x01, 0xdf,
+ 0x40, 0x42, 0x00, 0x1e,
+ 0x02, 0xf4, 0xed, 0xeb, 0x11, 0xc0, 0xed, 0x71, 0x43, 0xbb, 0xff, 0x14,
+ 0x10, 0x0d, 0x0f, 0x02,
+ 0x23, 0xed, 0xde, 0x17, 0x21, 0xee, 0x01, 0x00, 0xec, 0x40, 0x23, 0xe2,
+ 0xaf, 0xec, 0x11, 0x21,
+ 0xd0, 0xf0, 0x30, 0x73, 0xf2, 0xbd, 0x25, 0x43, 0xe9, 0xf0, 0x01, 0x13,
+ 0x0e, 0x10, 0xfe, 0xfd,
+ 0xfe, 0x04, 0x31, 0xcb, 0xe0, 0x21, 0x61, 0x0d, 0xff, 0x04, 0xef, 0xf0,
+ 0x36, 0x70, 0x0b, 0xce,
+ 0x13, 0x35, 0x0f, 0xef, 0x00, 0x0f, 0x00, 0xc1, 0xd1, 0x10, 0x55, 0x00,
+ 0x0d, 0x0e, 0xb0, 0xf5,
+ 0xfd, 0x0c, 0xff, 0x30, 0x42, 0xef, 0xcb, 0xfd, 0xff, 0x65, 0x23, 0x0d,
+ 0x2f, 0x10, 0xc0, 0xee,
+ 0x37, 0x01, 0xaf, 0x00, 0x42, 0xeb, 0x00, 0x00, 0xe1, 0xf1, 0x01, 0x10,
+ 0x20, 0xcd, 0xfe, 0x11,
+ 0x47, 0x01, 0xc0, 0xdd, 0x0f, 0x74, 0x10, 0xca, 0x11, 0x44, 0xfe, 0xde,
+ 0x13, 0x10, 0x0f, 0x20,
+ 0x33, 0xde, 0xef, 0x77, 0x10, 0xbb, 0x00, 0x02, 0x10, 0x1d, 0x11, 0x00,
+ 0xcf, 0x00, 0x12, 0x00,
+ 0x0e, 0x32, 0x02, 0x9b, 0x0f, 0x10, 0x15, 0xf0, 0xde, 0x02, 0x10, 0x2d,
+ 0x31, 0xe1, 0xa0, 0x03,
+ 0x24, 0x4d, 0xfb, 0xf2, 0x01, 0x41, 0x10, 0xde, 0x15, 0x30, 0xaa, 0xff,
+ 0x12, 0x43, 0xdc, 0xbf,
+ 0x11, 0x01, 0x00, 0x1f, 0x10, 0x0f, 0x00, 0x06, 0x32, 0x00, 0xba, 0x10,
+ 0x10, 0x22, 0x02, 0x9e,
+ 0x0a, 0x00, 0x33, 0x01, 0xe0, 0xad, 0xfc, 0x23, 0x34, 0x0f, 0xf0, 0xf0,
+ 0xde, 0x42, 0x33, 0xa8,
+ 0x0f, 0x31, 0xf1, 0xe0, 0x04, 0x0e, 0x1e, 0x20, 0x02, 0xd1, 0x00, 0x20,
+ 0x40, 0xd9, 0x00, 0x72,
+ 0x10, 0xdc, 0xf0, 0xf0, 0xf4, 0x70, 0x1b, 0xdd, 0xf0, 0x23, 0x20, 0x02,
+ 0x32, 0xd1, 0xbb, 0x1f,
+ 0x60, 0x02, 0x14, 0x04, 0xf0, 0xcd, 0x10, 0x64, 0x00, 0xcb, 0x01, 0x33,
+ 0x00, 0xe1, 0x02, 0x0d,
+ 0x0e, 0x10, 0x11, 0xf1, 0xe0, 0x02, 0xfa, 0xcd, 0x10, 0x40, 0x11, 0xb2,
+ 0xcc, 0x0f, 0x54, 0x04,
+ 0xfe, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x42, 0xfe, 0xdb, 0x24, 0x14, 0xfe,
+ 0xfd, 0x4d, 0x0b, 0x13,
+ 0x77, 0x00, 0xed, 0xe1, 0x44, 0x10, 0xaa, 0x01, 0x42, 0x0f, 0xcd, 0x10,
+ 0x26, 0x0f, 0xce, 0xff,
+ 0x41, 0x22, 0x00, 0xf0, 0x00, 0x0d, 0x32, 0x24, 0xe0, 0xcf, 0x01, 0x20,
+ 0xcc, 0x0f, 0x00, 0x1f,
+ 0xff, 0xe1, 0x05, 0xed, 0xdc, 0x71, 0x02, 0xe0, 0x31, 0x13, 0xd0, 0xcc,
+ 0x01, 0x16, 0x62, 0x00,
+ 0xdc, 0xde, 0x01, 0x00, 0x41, 0x24, 0x0e, 0xfb, 0x10, 0xf0, 0xc0, 0x32,
+ 0x76, 0xee, 0xad, 0x11,
+ 0x14, 0x2f, 0xff, 0xbd, 0xf1, 0x02, 0x02, 0x20, 0xf0, 0xed, 0x20, 0x34,
+ 0x01, 0x07, 0x11, 0x0f,
+ 0xed, 0x0e, 0x0d, 0x41, 0x22, 0xfe, 0x4d, 0x61, 0xe2, 0xee, 0xf8, 0x2e,
+ 0x72, 0x03, 0x10, 0xf0,
+ 0xf2, 0xf0, 0x0e, 0x0b, 0x51, 0x00, 0xea, 0xe2, 0x06, 0x00, 0x8b, 0x00,
+ 0x00, 0x42, 0x00, 0xcf,
+ 0xf0, 0x11, 0x20, 0x01, 0x34, 0xdd, 0xde, 0x03, 0x20, 0x0d, 0x1f, 0x15,
+ 0x44, 0xde, 0x0d, 0x73,
+ 0x34, 0xc0, 0xf0, 0x00, 0x03, 0x00, 0x0b, 0x10, 0xb1, 0xce, 0x00, 0x50,
+ 0x0d, 0x0d, 0xf4, 0x01,
+ 0x0b, 0xfc, 0xe0, 0x30, 0x11, 0xf2, 0x22, 0x08, 0x8e, 0x01, 0x02, 0xf1,
+ 0x0f, 0x1e, 0x52, 0xdf,
+ 0xfb, 0x34, 0x44, 0xdf, 0xdc, 0x00, 0x20, 0x11, 0x30, 0x41, 0xc3, 0xa0,
+ 0x27, 0x00, 0xdb, 0x11,
+ 0x52, 0x0f, 0xee, 0x10, 0xfe, 0x00, 0x06, 0x00, 0x10, 0x50, 0xf0, 0xff,
+ 0xfd, 0x00, 0x03, 0x00,
+ 0xf0, 0x63, 0xee, 0xa9, 0x11, 0x41, 0xee, 0xcc, 0x33, 0x0f, 0xfd, 0x02,
+ 0x00, 0x0d, 0x25, 0x23,
+ 0x00, 0x00, 0x0c, 0xc0, 0xe0, 0x0e, 0x71, 0x27, 0xe0, 0xe3, 0x01, 0x0d,
+ 0xfb, 0xbe, 0xef, 0x25,
+ 0x73, 0x0d, 0xeb, 0xe0, 0x00, 0x0d, 0x10, 0x41, 0xf0, 0xfe, 0xde, 0x00,
+ 0x73, 0x00, 0xcb, 0x17,
+ 0x12, 0x0f, 0x0f, 0x0d, 0xee, 0x13, 0x47, 0xf0, 0xde, 0x00, 0x02, 0x40,
+ 0x10, 0x2e, 0x10, 0xc0,
+ 0xf0, 0x02, 0xf4, 0x00, 0x3c, 0x2f, 0x42, 0xe5, 0xc1, 0x0f, 0xfe, 0xdf,
+ 0x40, 0x70, 0x22, 0xcf,
+ 0xef, 0x17, 0x20, 0xca, 0xf0, 0x13, 0x41, 0x00, 0x89, 0xf0, 0x11, 0x31,
+ 0xdf, 0xf1, 0x10, 0x10,
+ 0x30, 0x1f, 0x00, 0x0e, 0x13, 0x57, 0xf1, 0xcf, 0x0f, 0x01, 0x51, 0x00,
+ 0xd0, 0x03, 0x22, 0x1d,
+ 0xcc, 0x10, 0x77, 0x00, 0x0d, 0x01, 0x01, 0x0f, 0x01, 0x01, 0xb8, 0x00,
+ 0x52, 0x00, 0xee, 0xef,
+ 0x0f, 0x00, 0x00, 0x03, 0x0e, 0xbb, 0x10, 0x43, 0x02, 0xee, 0x0d, 0x37,
+ 0x01, 0xbe, 0x0e, 0x00,
+ 0x32, 0xf0, 0xbe, 0x00, 0x33, 0x10, 0x0b, 0x22, 0xe0, 0xad, 0x12, 0x13,
+ 0x0f, 0x1f, 0x0f, 0x0f,
+ 0xfd, 0x0f, 0x67, 0xd3, 0xc8, 0x10, 0x30, 0x01, 0xe1, 0x21, 0x02, 0xaf,
+ 0x00, 0x35, 0x0b, 0xee,
+ 0x02, 0x14, 0x00, 0xff, 0xbb, 0xfe, 0x2f, 0x70, 0x43, 0xd0, 0xf0, 0x00,
+ 0x0f, 0x0a, 0x22, 0x01,
+ 0x10, 0x11, 0xf1, 0x01, 0xef, 0x0f, 0x61, 0x01, 0x01, 0x46, 0x01, 0x9f,
+ 0xfd, 0x36, 0x22, 0xee,
+ 0xff, 0x21, 0xce, 0xee, 0x14, 0xf2, 0xbf, 0x33, 0x2f, 0xb8, 0xfe, 0x01,
+ 0x24, 0xf0, 0xde, 0x00,
+ 0x53, 0xf1, 0xcc, 0x2e, 0x32, 0x12, 0xed, 0xff, 0x14, 0x14, 0xff, 0x1a,
+ 0x70, 0x20, 0xf0, 0x00,
+ 0xf4, 0x00, 0x10, 0xce, 0xff, 0x2f, 0x32, 0x80, 0xf0, 0x02, 0x0d, 0xf8,
+ 0x20, 0x53, 0x00, 0x0c,
+ 0x00, 0x00, 0x34, 0x50, 0xee, 0xf0, 0xf1, 0x16, 0x00, 0xcb, 0x20, 0x71,
+ 0xe0, 0xe0, 0x1f, 0x10,
+ 0x0f, 0xdb, 0x01, 0x76, 0x00, 0xfe, 0xe0, 0xf1, 0xf0, 0x10, 0x30, 0xe0,
+ 0xe3, 0x02, 0xb8, 0xf0,
+ 0x20, 0x32, 0x01, 0xdf, 0x3d, 0x10, 0xb0, 0x00, 0x00, 0xe0, 0x55, 0x42,
+ 0xcb, 0xcf, 0x10, 0x13,
+ 0x00, 0xcc, 0x23, 0x24, 0xcd, 0x0e, 0x21, 0xef, 0xdd, 0x23, 0x15, 0x00,
+ 0x44, 0xf0, 0x8e, 0x0f,
+ 0x30, 0x11, 0xfd, 0xf2, 0x02, 0xeb, 0x2c, 0x3f, 0x2c, 0xef, 0x00, 0x26,
+ 0x50, 0x00, 0xab, 0xe0,
+ 0x44, 0x22, 0xfe, 0xef, 0x10, 0x00, 0xf0, 0x31, 0x60, 0x00, 0x1d, 0x21,
+ 0x03, 0x00, 0x0d, 0x00,
+ 0x06, 0xb1, 0x11, 0x00, 0x8b, 0x0f, 0x10, 0x24, 0x03, 0xfe, 0xd9, 0xef,
+ 0x10, 0x32, 0xe0, 0xd0,
+ 0x40, 0x50, 0x14, 0xe2, 0xae, 0x00, 0x00, 0x53, 0x01, 0x01, 0xdf, 0x13,
+ 0x24, 0x0a, 0xfc, 0x0f,
+ 0x51, 0x02, 0xe2, 0xe0, 0xee, 0x1b, 0x50, 0xf0, 0x07, 0x03, 0x9d, 0xfc,
+ 0x21, 0x3f, 0x0e, 0xf2,
+ 0xf4, 0x00, 0x0d, 0xed, 0xfe, 0x33, 0x44, 0x01, 0xde, 0xec, 0xef, 0xce,
+ 0x02, 0x77, 0x00, 0x01,
+ 0x02, 0xee, 0xfc, 0x01, 0xe0, 0xe2, 0x63, 0x3f, 0x2c, 0x01, 0x12, 0xe0,
+ 0xa0, 0x27, 0x34, 0xec,
+ 0x0e, 0x01, 0xa1, 0xf1, 0x00, 0x40, 0x0e, 0xcc, 0xf0, 0x10, 0x4f, 0x10,
+ 0xed, 0xfd, 0x06, 0x33,
+ 0x10, 0x51, 0x0f, 0xbb, 0x10, 0x32, 0x02, 0xd0, 0xf5, 0xcf, 0xfd, 0x00,
+ 0x3f, 0x1f, 0xf3, 0xa7,
+ 0xff, 0x0e, 0xf0, 0x11, 0x2c, 0x2b, 0x10, 0xe0, 0xff, 0x3f, 0x41, 0x11,
+ 0xe0, 0xee, 0x00, 0x12,
+ 0x9e, 0xcb, 0x12, 0x24, 0x2f, 0x30, 0xb1, 0xac, 0x0e, 0x40, 0x12, 0xf2,
+ 0xd0, 0x00, 0x3d, 0x02,
+ 0xc1, 0xec, 0x1e, 0x1b, 0xf0, 0xf7, 0x57, 0x20, 0xfe, 0xc0, 0x21, 0xff,
+ 0x0c, 0x64, 0xf1, 0xe0,
+ 0x51, 0x00, 0xcb, 0x01, 0x46, 0xff, 0xbd, 0x21, 0x11, 0x00, 0x10, 0x00,
+ 0xf0, 0xf0, 0xed, 0x0d,
+ 0x2d, 0x00, 0x06, 0x31, 0xc1, 0xd1, 0x0f, 0x4d, 0xe0, 0x8f, 0x03, 0x07,
+ 0x20, 0x21, 0x00, 0x00,
+ 0x3f, 0x00, 0x00, 0x00, 0x23, 0xdd, 0xea, 0x71, 0x77, 0xf1, 0xde, 0xfc,
+ 0xf0, 0x12, 0x52, 0xf0,
+ 0xce, 0x0f, 0x00, 0x1c, 0xee, 0x03, 0x57, 0x00, 0x0e, 0xf2, 0xe0, 0x1e,
+ 0x41, 0xee, 0xed, 0x26,
+ 0x21, 0xfe, 0x00, 0x10, 0xf2, 0xe0, 0x0e, 0x20, 0xff, 0xbe, 0x20, 0x0e,
+ 0xe0, 0x06, 0x32, 0xed,
+ 0x9b, 0x10, 0x45, 0x00, 0x20, 0x51, 0xe0, 0xdb, 0x00, 0xf3, 0xd1, 0xf1,
+ 0x00, 0x70, 0x10, 0xbc,
+ 0x00, 0xe1, 0xf1, 0x20, 0x3e, 0x0c, 0xda, 0x50, 0x41, 0xef, 0xfb, 0x41,
+ 0x01, 0xff, 0x0f, 0x42,
+ 0x03, 0xf3, 0xde, 0x08, 0x30, 0x40, 0xe0, 0x37, 0x30, 0x90, 0xfe, 0x11,
+ 0x22, 0x00, 0xc0, 0x0f,
+ 0x3d, 0xcf, 0xe2, 0x57, 0x52, 0xef, 0xed, 0x01, 0xff, 0xed, 0x44, 0x21,
+ 0xcf, 0xeb, 0xe0, 0x24,
+ 0x22, 0xfd, 0xfc, 0xe0, 0xc2, 0x22, 0x63, 0xfc, 0xdf, 0x14, 0x51, 0x0d,
+ 0x1d, 0x03, 0xf3, 0x11,
+ 0x21, 0xfb, 0xec, 0x10, 0x02, 0x02, 0x10, 0xf0, 0x8e, 0x02, 0x00, 0xff,
+ 0x0f, 0x33, 0x00, 0xf2,
+ 0x27, 0x77, 0x22, 0xc8, 0xf0, 0x21, 0x10, 0x10, 0x4f, 0x00, 0xef, 0x01,
+ 0x02, 0x1f, 0xfe, 0xee,
+ 0x60, 0x32, 0xc1, 0xad, 0x0e, 0x01, 0x1e, 0x0f, 0x47, 0xd1, 0xb0, 0x0d,
+ 0x21, 0x12, 0xf3, 0x01,
+ 0x21, 0x0f, 0xfb, 0x00, 0x46, 0x33, 0xb0, 0x0c, 0xe0, 0x00, 0x12, 0x0d,
+ 0xfc, 0x03, 0xd1, 0xdd,
+ 0x30, 0x53, 0xea, 0x9d, 0x01, 0x05, 0x21, 0x20, 0x30, 0xcc, 0xaf, 0x01,
+ 0x04, 0x0f, 0x00, 0x13,
+ 0xec, 0xef, 0x25, 0x01, 0xdd, 0x0d, 0x73, 0x21, 0xfe, 0xfc, 0x04, 0x33,
+ 0x0d, 0xfc, 0x2f, 0x61,
+ 0xe1, 0xe0, 0x31, 0x40, 0x0c, 0xce, 0x0e, 0xf0, 0x14, 0x31, 0x0b, 0x1f,
+ 0x34, 0x25, 0xdf, 0x8f,
+ 0x10, 0x0f, 0x0c, 0x21, 0x35, 0xd0, 0xbe, 0x00, 0xf1, 0x54, 0x00, 0xda,
+ 0xe0, 0x72, 0x13, 0xde,
+ 0xf0, 0x00, 0xef, 0xf0, 0x17, 0x31, 0x0f, 0xef, 0xf0, 0xe0, 0xd0, 0x32,
+ 0x75, 0x3f, 0x0e, 0xec,
+ 0xf0, 0x20, 0x0f, 0x4f, 0x0e, 0xac, 0xde, 0xf3, 0x05, 0x00, 0xde, 0x0d,
+ 0x64, 0x11, 0xcc, 0xe0,
+ 0x01, 0x30, 0x52, 0x23, 0x0c, 0xed, 0xcc, 0x00, 0x34, 0x0d, 0xec, 0x02,
+ 0xe3, 0xde, 0x10, 0x11,
+ 0xac, 0xff, 0x01, 0x35, 0x23, 0x35, 0x01, 0xcd, 0x1f, 0x63, 0x17, 0x63,
+ 0x0f, 0xb8, 0x00, 0x20,
+ 0x01, 0x00, 0x02, 0xee, 0xff, 0x2f, 0x3f, 0x00, 0xe0, 0xde, 0x51, 0x33,
+ 0xca, 0xbf, 0x00, 0x30,
+ 0x1e, 0xe2, 0xd5, 0xfe, 0xcc, 0x10, 0x62, 0x04, 0xc0, 0x0f, 0x12, 0x2f,
+ 0xfc, 0xc0, 0x13, 0x32,
+ 0x01, 0xe3, 0x0b, 0xeb, 0x10, 0x71, 0x01, 0xdc, 0xd0, 0x24, 0x42, 0x0b,
+ 0xfe, 0x00, 0xe0, 0x12,
+ 0x71, 0x0f, 0xdf, 0xf1, 0x12, 0x61, 0x1f, 0x0b, 0xf1, 0x03, 0xcd, 0x03,
+ 0x27, 0x1e, 0xfb, 0x01,
+ 0x34, 0xf0, 0x80, 0x0d, 0x00, 0x21, 0x02, 0xf1, 0xf2, 0x00, 0x1d, 0x2a,
+ 0x21, 0xe3, 0xe4, 0x11,
+ 0x71, 0x1f, 0x99, 0xff, 0xf0, 0x22, 0x11, 0x13, 0x00, 0xfa, 0x0e, 0x2f,
+ 0x20, 0xd2, 0xf2, 0x33,
+ 0x50, 0x0e, 0xdd, 0xff, 0xf0, 0x22, 0x47, 0x03, 0x05, 0xb0, 0x9c, 0x00,
+ 0x31, 0x02, 0xf1, 0x02,
+ 0x40, 0x0d, 0xc0, 0x33, 0x41, 0x0d, 0xc0, 0x06, 0x2f, 0x0b, 0xff, 0x0f,
+ 0x00, 0x00, 0xed, 0xde,
+ 0x13, 0xf0, 0xd8, 0x4f, 0xf0, 0xa0, 0xf3, 0x14, 0x5f, 0x1c, 0xe0, 0xf3,
+ 0x36, 0x62, 0xfe, 0xed,
+ 0xfd, 0x00, 0x02, 0xf2, 0xf0, 0x21, 0x32, 0xff, 0xd8, 0xfe, 0x11, 0x65,
+ 0x0f, 0xec, 0xe0, 0xa0,
+ 0xf0, 0x20, 0x10, 0x11, 0x10, 0xe0, 0x0e, 0x70, 0x12, 0xf6, 0x02, 0x10,
+ 0x3f, 0xf0, 0x9c, 0xe0,
+ 0x02, 0x45, 0x20, 0xfd, 0xcc, 0xe0, 0x00, 0x46, 0x10, 0xfd, 0xb0, 0x0f,
+ 0x20, 0x20, 0x1d, 0x00,
+ 0x20, 0xfd, 0xc0, 0x05, 0xf1, 0x3f, 0x5e, 0xed, 0x05, 0x05, 0x0f, 0xac,
+ 0x20, 0x72, 0x04, 0xf0,
+ 0xe0, 0x00, 0x11, 0x0c, 0xd0, 0x35, 0x51, 0xe0, 0xc0, 0xf0, 0x01, 0x01,
+ 0x27, 0x00, 0x13, 0x00,
+ 0x74, 0xf4, 0x19, 0xc5, 0x7e, 0xf2, 0x69, 0xc3, 0xf9, 0x8f, 0xee, 0x16,
+ 0x03, 0xe0, 0xeb, 0xec,
+ 0xf0, 0x02, 0x44, 0xf2, 0xe2, 0xaf, 0x0d, 0x53, 0x02, 0xfc, 0x2e, 0x4e,
+ 0x10, 0x07, 0x0f, 0x3d,
+ 0x30, 0x0e, 0xcb, 0x11, 0x34, 0xbe, 0xcd, 0xf0, 0xf4, 0x00, 0x41, 0x01,
+ 0xa0, 0xfc, 0x21, 0x77,
+ 0x0e, 0xdc, 0xf0, 0x12, 0x34, 0x1e, 0xec, 0x00, 0x43, 0x00, 0x0d, 0x0f,
+ 0x00, 0x90, 0x01, 0x44,
+ 0x10, 0xd4, 0xdf, 0xfc, 0x3f, 0x50, 0xf2, 0xf5, 0x03, 0xfd, 0xdf, 0x16,
+ 0x22, 0xfd, 0xdb, 0x71,
+ 0x32, 0x02, 0xd1, 0xee, 0x0a, 0x20, 0x01, 0xf2, 0x00, 0x20, 0x8a, 0xdf,
+ 0xe0, 0x10, 0x0f, 0xe0,
+ 0x01, 0x05, 0x01, 0xd0, 0xde, 0x10, 0x1f, 0x10, 0x76, 0x11, 0xae, 0xfc,
+ 0x00, 0x25, 0x00, 0x10,
+ 0x1f, 0xde, 0xdf, 0x42, 0x53, 0x00, 0xd2, 0xdd, 0x3c, 0x50, 0x00, 0x0d,
+ 0x2b, 0x20, 0x30, 0x21,
+ 0xd1, 0xd0, 0x7d, 0x3e, 0x33, 0xe3, 0xa0, 0x03, 0x2b, 0xc8, 0x0d, 0x34,
+ 0xf4, 0xc1, 0x1e, 0x1d,
+ 0x0e, 0xf0, 0x14, 0x30, 0x51, 0x10, 0x0c, 0xf0, 0x00, 0x04, 0x01, 0x0e,
+ 0xfe, 0x35, 0x91, 0xaf,
+ 0x1e, 0x52, 0x00, 0xe0, 0x03, 0x06, 0xef, 0xee, 0x20, 0x33, 0x00, 0x10,
+ 0x0c, 0x01, 0xe6, 0xbf,
+ 0x0d, 0x30, 0x10, 0xc2, 0xcf, 0x09, 0x10, 0x1f, 0x03, 0xe4, 0xe3, 0x00,
+ 0x3b, 0x70, 0x02, 0xf2,
+ 0xe0, 0x0d, 0x4f, 0x40, 0x95, 0xee, 0x1b, 0x50, 0x0e, 0xd1, 0x14, 0x1d,
+ 0x2e, 0xff, 0xbe, 0x12,
+ 0x33, 0x23, 0x27, 0x03, 0xde, 0xcf, 0x0f, 0x0e, 0x33, 0x15, 0x8f, 0xef,
+ 0x20, 0x00, 0xfd, 0xfe,
+ 0x31, 0x50, 0x04, 0xf5, 0x01, 0x30, 0xfc, 0xdf, 0x16, 0x20, 0xef, 0xcb,
+ 0x30, 0x41, 0xf1, 0xf1,
+ 0x00, 0x1e, 0x0e, 0xc1, 0x14, 0x33, 0x00, 0x4c, 0x10, 0xa2, 0xd2, 0x00,
+ 0x2c, 0xdc, 0xb0, 0x00,
+ 0x61, 0x03, 0xdf, 0x98, 0x0d, 0x10, 0x10, 0x15, 0x04, 0xde, 0xdb, 0xff,
+ 0x00, 0x03, 0x0f, 0x5f,
+ 0x10, 0x21, 0xf0, 0xbd, 0x10, 0x20, 0x30, 0x13, 0x52, 0xe8, 0xbd, 0x0f,
+ 0x12, 0x00, 0x0f, 0xde,
+ 0x01, 0x34, 0x03, 0xfe, 0x2c, 0x30, 0xc1, 0xf4, 0x05, 0xc0, 0xe1, 0x30,
+ 0x70, 0x22, 0x21, 0xe0,
+ 0xb0, 0x01, 0x0e, 0x18, 0xef, 0x00, 0x75, 0x20, 0xca, 0x01, 0x02, 0x0f,
+ 0xbe, 0x20, 0x23, 0x10,
+ 0xde, 0x00, 0x00, 0xf0, 0xd0, 0xff, 0xed, 0x0e, 0x20, 0x77, 0x46, 0xce,
+ 0xf0, 0x00, 0x43, 0x44,
+ 0xef, 0xdd, 0x10, 0x4f, 0x10, 0xe2, 0xf4, 0xe0, 0xf8, 0x00, 0x0f, 0x20,
+ 0xe2, 0xe0, 0x00, 0x1f,
+ 0x00, 0x03, 0x70, 0xed, 0xef, 0x26, 0x34, 0xee, 0xdd, 0xf0, 0xc3, 0x20,
+ 0x7f, 0x00, 0x01, 0xfc,
+ 0xfe, 0x00, 0x50, 0x15, 0x02, 0x0d, 0x3c, 0x0f, 0xe0, 0x10, 0x24, 0xaf,
+ 0xfa, 0xf0, 0xcf, 0x00,
+ 0x44, 0xde, 0x9c, 0x02, 0x26, 0xf0, 0x0f, 0x40, 0x00, 0xd2, 0x11, 0x0d,
+ 0xbc, 0x01, 0x54, 0x20,
+ 0x0f, 0xd0, 0xef, 0x10, 0x73, 0x31, 0xdf, 0xdb, 0xfe, 0x20, 0x41, 0x06,
+ 0xcf, 0x0d, 0x0f, 0x1e,
+ 0x20, 0x00, 0x01, 0x00, 0x0b, 0xf0, 0x0f, 0x42, 0x64, 0x03, 0xa1, 0x04,
+ 0x00, 0x2a, 0x02, 0x12,
+ 0xf0, 0x0f, 0xf0, 0xc0, 0x00, 0x40, 0x0f, 0xde, 0x01, 0x47, 0x06, 0xdf,
+ 0xff, 0x2f, 0x21, 0xe2,
+ 0xef, 0x0f, 0xd3, 0x05, 0x00, 0xbc, 0xbd, 0x00, 0x53, 0x12, 0x1d, 0x4d,
+ 0x32, 0x05, 0xb2, 0x00,
+ 0x0a, 0x40, 0x10, 0xf3, 0xcf, 0x0e, 0x0c, 0xdf, 0xaf, 0x04, 0x33, 0x11,
+ 0xf1, 0xdf, 0x3e, 0x61,
+ 0x05, 0x04, 0xf1, 0x0d, 0x0c, 0x3d, 0x61, 0x05, 0x10, 0xea, 0xee, 0x00,
+ 0x11, 0x31, 0x3f, 0xdf,
+ 0xc2, 0xe5, 0x01, 0x30, 0xec, 0xd0, 0x03, 0x53, 0xcf, 0xfd, 0x20, 0x10,
+ 0x0e, 0x7d, 0x21, 0xd4,
+ 0xf2, 0x0d, 0xeb, 0x04, 0x57, 0xe0, 0xde, 0xe0, 0xbf, 0x02, 0x71, 0x0c,
+ 0xce, 0xfc, 0xfc, 0x30,
+ 0x47, 0xf0, 0xa0, 0xff, 0x0e, 0x0f, 0x00, 0x34, 0x03, 0x00, 0xec, 0xe0,
+ 0xe1, 0x0f, 0xf0, 0xd3,
+ 0x02, 0x70, 0x1e, 0xf0, 0xd2, 0x20, 0x0d, 0x10, 0x36, 0x02, 0xdd, 0x0b,
+ 0x2f, 0x20, 0x14, 0x10,
+ 0x7c, 0x2d, 0xfd, 0x0f, 0x42, 0x07, 0xb1, 0xdd, 0x2d, 0x71, 0x53, 0xef,
+ 0x0d, 0x0e, 0xfe, 0xd5,
+ 0x46, 0x40, 0x1f, 0xee, 0x00, 0x04, 0x0f, 0xdf, 0x21, 0x66, 0x00, 0xde,
+ 0xff, 0x00, 0x12, 0x01,
+ 0xe4, 0xe0, 0x10, 0x35, 0xcd, 0xcf, 0x10, 0x45, 0x1f, 0xbe, 0xef, 0x10,
+ 0x50, 0x00, 0xbf, 0xfe,
+ 0xf0, 0x1f, 0x31, 0x05, 0xeb, 0xdd, 0xf0, 0x11, 0x45, 0xff, 0xed, 0x00,
+ 0x03, 0x52, 0x03, 0x9d,
+ 0x08, 0x30, 0x44, 0xd2, 0xbf, 0x0c, 0x1f, 0x20, 0x11, 0xe0, 0xdc, 0x0f,
+ 0x1f, 0x71, 0x13, 0xff,
+ 0xf3, 0x17, 0x0e, 0xff, 0xf0, 0x02, 0x41, 0x23, 0x32, 0x0d, 0xbf, 0x04,
+ 0x03, 0x4c, 0xfc, 0xdd,
+ 0xfc, 0x10, 0x52, 0x06, 0xc0, 0xd0, 0xed, 0x10, 0x0d, 0x09, 0xf0, 0x33,
+ 0x33, 0xde, 0xbd, 0xe0,
+ 0xfb, 0x10, 0xf2, 0x05, 0x40, 0xcf, 0xbe, 0x40, 0x40, 0x13, 0xe0, 0xd0,
+ 0xe0, 0xf3, 0x21, 0x71,
+ 0x30, 0xee, 0xdc, 0x00, 0x10, 0x21, 0xe2, 0xd4, 0x05, 0x0f, 0x0b, 0xc0,
+ 0xf0, 0x2f, 0x4d, 0x61,
+ 0xf4, 0xc0, 0x00, 0x4d, 0xe8, 0xec, 0x41, 0x12, 0xf0, 0xdf, 0x1f, 0x30,
+ 0x00, 0xdf, 0xbe, 0xcf,
+ 0x0c, 0x5d, 0x12, 0xd7, 0x07, 0x20, 0x4f, 0x0f, 0x00, 0x00, 0x34, 0x33,
+ 0xff, 0xfa, 0xf0, 0x10,
+ 0x50, 0x10, 0xf2, 0x84, 0x0f, 0xfd, 0x0f, 0x40, 0x10, 0x04, 0xb0, 0xfd,
+ 0xfa, 0x21, 0x54, 0x00,
+ 0xcd, 0x00, 0xf0, 0x11, 0x30, 0x00, 0x03, 0xb3, 0xfe, 0x0e, 0x06, 0x02,
+ 0x23, 0xfe, 0xdd, 0x63,
+ 0x46, 0x33, 0x02, 0xee, 0xfc, 0x2f, 0x30, 0x0f, 0xd0, 0xce, 0x11, 0x01,
+ 0x0c, 0x0c, 0xe0, 0xb0,
+ 0xf3, 0xf1, 0xe1, 0xc0, 0xef, 0xd9, 0xf0, 0x51, 0x23, 0xed, 0x0d, 0x50,
+ 0x2b, 0x0d, 0xe2, 0xf7,
+ 0xf3, 0xff, 0x2d, 0xef, 0x8e, 0xfe, 0xdd, 0x12, 0x77, 0x66, 0xfe, 0xfe,
+ 0x00, 0x30, 0x0e, 0x01,
+ 0x04, 0x00, 0x0e, 0x20, 0xf1, 0xee, 0x0e, 0x11, 0xe6, 0x00, 0x4f, 0xcd,
+ 0xd5, 0x43, 0xff, 0xbc,
+ 0xff, 0x01, 0x51, 0x01, 0xb3, 0x00, 0x1d, 0x10, 0xf2, 0xbc, 0xec, 0x10,
+ 0x2e, 0xfc, 0x02, 0x23,
+ 0x6e, 0x0a, 0x10, 0x0c, 0x00, 0xe0, 0xf5, 0x01, 0x7f, 0x20, 0xf1, 0xce,
+ 0x0d, 0x04, 0x24, 0xcf,
+ 0x0d, 0x50, 0x2d, 0xef, 0xf6, 0x02, 0x31, 0x01, 0x01, 0x0e, 0xbc, 0xf3,
+ 0x07, 0x13, 0xf0, 0xbd,
+ 0xff, 0xf0, 0xd2, 0xd2, 0x12, 0x71, 0x1e, 0xed, 0x04, 0x33, 0x08, 0x2d,
+ 0x62, 0x16, 0x00, 0xed,
+ 0x0f, 0x30, 0x03, 0x00, 0xfe, 0xca, 0xe0, 0x00, 0x32, 0x90, 0xca, 0xf0,
+ 0x00, 0x23, 0x03, 0x00,
+ 0xbb, 0x10, 0x40, 0x31, 0x03, 0x00, 0x0c, 0x0f, 0x10, 0x02, 0xdd, 0xfd,
+ 0x71, 0x74, 0xe0, 0xee,
+ 0x01, 0x07, 0x02, 0x1f, 0x0d, 0xf1, 0xf1, 0xf0, 0x0e, 0xf0, 0x01, 0x4f,
+ 0x7f, 0x24, 0x01, 0xbc,
+ 0x00, 0x04, 0x00, 0x10, 0x1f, 0x08, 0xf0, 0x26, 0x01, 0xcf, 0xce, 0x0f,
+ 0x00, 0x02, 0x0f, 0x0d,
+ 0xed, 0x10, 0x37, 0xc2, 0xbd, 0x0e, 0x00, 0xf2, 0xf4, 0xed, 0xcd, 0xc0,
+ 0x23, 0x67, 0x02, 0xbc,
+ 0x0e, 0x01, 0x32, 0x12, 0xf0, 0xde, 0xfb, 0x20, 0x75, 0x00, 0xef, 0x00,
+ 0xf0, 0x0e, 0x10, 0x01,
+ 0xf0, 0x2e, 0x7d, 0x4e, 0x01, 0xc2, 0x00, 0x0c, 0x1e, 0x1e, 0x02, 0x15,
+ 0xe0, 0xc0, 0x00, 0x00,
+ 0x1a, 0xef, 0x00, 0x54, 0x00, 0xff, 0x4b, 0x70, 0x01, 0x01, 0xf0, 0x00,
+ 0x52, 0x02, 0x0d, 0xcd,
+ 0x07, 0x16, 0x21, 0xe0, 0xd1, 0x02, 0xfd, 0xed, 0x01, 0x01, 0x01, 0x1e,
+ 0xd9, 0xbe, 0x00, 0x54,
+ 0x2f, 0x0d, 0x01, 0x06, 0xf0, 0xf1, 0x0f, 0xdd, 0x00, 0x13, 0x81, 0xd1,
+ 0x04, 0x11, 0x0e, 0xcf,
+ 0x12, 0x77, 0x00, 0x0e, 0xe0, 0x10, 0x55, 0x2f, 0x0b, 0xe0, 0x00, 0x00,
+ 0x1c, 0xe0, 0x30, 0x25,
+ 0xb0, 0xef, 0xf0, 0x02, 0x1f, 0x0e, 0xd1, 0x23, 0x75, 0x30, 0xcc, 0xdf,
+ 0x01, 0x55, 0x10, 0x0d,
+ 0xef, 0x0f, 0xf0, 0x14, 0x21, 0x0f, 0x1c, 0x00, 0xf7, 0x00, 0x1f, 0xfd,
+ 0x20, 0x43, 0x45, 0x00,
+ 0x9d, 0x0e, 0x20, 0x23, 0x11, 0xee, 0x8e, 0x00, 0x24, 0x6f, 0x0b, 0xdf,
+ 0xe0, 0x00, 0x34, 0x00,
+ 0xf1, 0xe0, 0x0d, 0xe9, 0xce, 0xc1, 0x05, 0x32, 0xbf, 0xab, 0x00, 0x00,
+ 0x10, 0x11, 0x00, 0x13,
+ 0x01, 0xfd, 0x0d, 0x5f, 0xfe, 0x0c, 0x4e, 0x11, 0x04, 0xcc, 0xfd, 0x01,
+ 0x01, 0x0c, 0x0e, 0xf3,
+ 0xb0, 0xf8, 0x01, 0x52, 0xe1, 0xde, 0x3d, 0x73, 0x03, 0x00, 0x0d, 0x0b,
+ 0xf0, 0x07, 0x63, 0x00,
+ 0xef, 0xef, 0x00, 0x00, 0x11, 0x02, 0xf0, 0x00, 0x13, 0x0c, 0xec, 0xee,
+ 0xf0, 0x0e, 0x5f, 0x30,
+ 0xf2, 0xe4, 0x21, 0xcc, 0xce, 0x00, 0x55, 0x11, 0x11, 0x00, 0xd0, 0x06,
+ 0x32, 0x50, 0xf0, 0xb0,
+ 0xf0, 0x17, 0x62, 0x02, 0xd0, 0x11, 0x32, 0x3e, 0xea, 0x9e, 0x00, 0x25,
+ 0x21, 0xcd, 0xdc, 0x00,
+ 0x71, 0x02, 0xff, 0xed, 0xf3, 0x07, 0x22, 0xff, 0xed, 0x1f, 0x1f, 0x0f,
+ 0x03, 0x13, 0x0f, 0x10,
+ 0x32, 0x28, 0x7d, 0x10, 0xe1, 0xc1, 0x20, 0x31, 0xf0, 0xd0, 0x0f, 0x0f,
+ 0xdd, 0x77, 0x44, 0xed,
+ 0xa9, 0x01, 0x01, 0x11, 0x0f, 0x0e, 0xf0, 0x0f, 0x2f, 0xfe, 0xd2, 0x24,
+ 0x41, 0x32, 0xf0, 0xd0,
+ 0x0b, 0x30, 0x45, 0xe3, 0xa1, 0xee, 0x1e, 0x3f, 0xee, 0xef, 0x00, 0x00,
+ 0x04, 0x41, 0xee, 0xbb,
+ 0x1d, 0x60, 0x01, 0x12, 0x0f, 0xc8, 0xf0, 0x23, 0x70, 0x0e, 0xee, 0xdf,
+ 0x0d, 0x00, 0x24, 0x34,
+ 0xe0, 0xed, 0xff, 0x00, 0x03, 0x77, 0x43, 0xfc, 0xe0, 0x24, 0x32, 0x4e,
+ 0x0f, 0x0f, 0xf0, 0xd0,
+ 0xf7, 0x02, 0x01, 0xd0, 0x8d, 0xcf, 0xf0, 0x05, 0x22, 0x00, 0x3f, 0x0b,
+ 0x00, 0xf0, 0x1d, 0x5c,
+ 0x00, 0x12, 0x04, 0x61, 0x0d, 0xea, 0xe0, 0x01, 0x02, 0xe1, 0x02, 0x1f,
+ 0xdf, 0x00, 0x0e, 0x8d,
+ 0x07, 0x06, 0x30, 0x50, 0x10, 0x0f, 0x1e, 0x62, 0x01, 0x00, 0x00, 0x21,
+ 0x3d, 0xea, 0xe0, 0x02,
+ 0xd0, 0x01, 0x21, 0x50, 0x1c, 0xfc, 0xad, 0xe1, 0xd7, 0x01, 0x30, 0x6f,
+ 0x1b, 0x00, 0xf0, 0xd2,
+ 0x12, 0x21, 0x0f, 0x0e, 0x1f, 0x40, 0xc0, 0xb5, 0xf2, 0x00, 0x1f, 0x1e,
+ 0xce, 0x00, 0x57, 0x16,
+ 0x10, 0xfb, 0xf0, 0xc0, 0xc0, 0x00, 0x30, 0x31, 0xa0, 0xdc, 0xf0, 0x10,
+ 0x11, 0xe1, 0xde, 0x0f,
+ 0x41, 0x27, 0xe2, 0xff, 0xfe, 0xa0, 0xf0, 0x00, 0xe2, 0xc0, 0xfc, 0x2f,
+ 0x20, 0xd0, 0x91, 0xef,
+ 0x21, 0x77, 0x22, 0x0c, 0x00, 0x21, 0x10, 0x1e, 0x00, 0x03, 0x10, 0x09,
+ 0x30, 0x01, 0xa2, 0xe0,
+ 0xfe, 0x1b, 0x30, 0x0f, 0xef, 0xc0, 0x72, 0x51, 0x0b, 0x00, 0xf2, 0x27,
+ 0x10, 0x0e, 0x01, 0x32,
+ 0x00, 0x8e, 0xff, 0x02, 0x07, 0xe1, 0xdc, 0x0f, 0x32, 0x02, 0x00, 0xcd,
+ 0x20, 0x21, 0x00, 0xdd,
+ 0x00, 0x32, 0x0d, 0xbc, 0x02, 0x24, 0x2f, 0xdb, 0xde, 0x01, 0x44, 0xe4,
+ 0x80, 0xff, 0x10, 0xed,
+ 0xcd, 0x0e, 0x52, 0x06, 0x12, 0xf3, 0xf0, 0x0b, 0x0d, 0x1d, 0x70, 0x20,
+ 0x10, 0xf3, 0xe0, 0xdb,
+ 0x1d, 0x00, 0x03, 0x12, 0x06, 0x23, 0x4d, 0xc8, 0x8f, 0xf2, 0x03, 0x20,
+ 0x0d, 0x10, 0x20, 0x00,
+ 0xd0, 0x00, 0x1d, 0x3d, 0x2f, 0x1e, 0x00, 0xd3, 0xf7, 0xb0, 0xfc, 0xf0,
+ 0x30, 0x53, 0xc0, 0xcc,
+ 0x03, 0x05, 0x0f, 0x0c, 0x20, 0xe1, 0x00, 0x71, 0x13, 0x10, 0x0b, 0x00,
+ 0x10, 0xb0, 0xd0, 0x03,
+ 0x10, 0x58, 0x00, 0xe2, 0x05, 0x20, 0xff, 0xff, 0x22, 0x95, 0x90, 0x0d,
+ 0x00, 0x02, 0xfe, 0x0f,
+ 0x01, 0xf2, 0x0c, 0x2d, 0x73, 0x57, 0x00, 0xfb, 0xde, 0x0f, 0x00, 0x32,
+ 0x11, 0x0e, 0xc0, 0xd0,
+ 0xf0, 0xeb, 0x00, 0x0f, 0xd0, 0xe1, 0x42, 0x5e, 0x2e, 0x0f, 0x2c, 0x60,
+ 0x37, 0x07, 0xc0, 0x0d,
+ 0x00, 0x51, 0x01, 0xe2, 0xe1, 0xee, 0x00, 0x31, 0x50, 0xfc, 0x00, 0xd2,
+ 0xef, 0x02, 0x66, 0x0e,
+ 0xcb, 0x00, 0x10, 0x21, 0x00, 0x0e, 0x00, 0x00, 0x10, 0x03, 0x17, 0x04,
+ 0x00, 0x1f, 0x10, 0x90,
+ 0xe3, 0xd3, 0x10, 0x3e, 0x00, 0x20, 0x71, 0x13, 0xfe, 0x09, 0x20, 0xf0,
+ 0xb0, 0x0d, 0x4f, 0xf0,
+ 0xd3, 0xf5, 0x0f, 0xed, 0xf1, 0xe7, 0xd1, 0xee, 0x1e, 0x20, 0x82, 0xc0,
+ 0xfd, 0x18, 0x4f, 0x30,
+ 0x02, 0x02, 0x40, 0xec, 0xcd, 0x0f, 0x72, 0x15, 0x24, 0x01, 0xfe, 0xdd,
+ 0x00, 0x44, 0xf0, 0xeb,
+ 0x10, 0x62, 0x00, 0x0f, 0x2d, 0x50, 0x00, 0x02, 0xff, 0xed, 0xdc, 0xe1,
+ 0x35, 0x30, 0x8e, 0xd0,
+ 0x03, 0xe0, 0x0a, 0x4d, 0x23, 0xf5, 0xe0, 0x10, 0x6f, 0xfd, 0xde, 0xff,
+ 0xf3, 0xf4, 0x02, 0x23,
+ 0x4f, 0x0a, 0x9e, 0xfd, 0x0f, 0x22, 0x57, 0x13, 0x00, 0x0c, 0x0e, 0x0e,
+ 0xf0, 0x05, 0x01, 0xf0,
+ 0xcd, 0x00, 0x0f, 0x3e, 0x00, 0xf0, 0xe0, 0x20, 0x31, 0xf3, 0xae, 0x1b,
+ 0x70, 0x57, 0xf5, 0xdf,
+ 0xfe, 0xf0, 0xf4, 0x01, 0x21, 0x0f, 0xae, 0xf1, 0x00, 0x31, 0x46, 0x22,
+ 0xe1, 0xf0, 0xfc, 0x0d,
+ 0x60, 0x20, 0xf0, 0xdf, 0xe0, 0x0d, 0x61, 0x02, 0x0a, 0xcc, 0xfe, 0xf3,
+ 0x24, 0x02, 0xfe, 0xfc,
+ 0x0f, 0x02, 0x16, 0x00, 0xde, 0x1f, 0x71, 0x62, 0xff, 0xd0, 0xf4, 0x1f,
+ 0x4d, 0x13, 0x05, 0xcf,
+ 0x0b, 0x10, 0x11, 0x14, 0x00, 0x1e, 0x00, 0xd0, 0x03, 0x01, 0x10, 0x5d,
+ 0x3b, 0x10, 0xd7, 0xd2,
+ 0x0e, 0x2e, 0x7f, 0x50, 0xee, 0xc2, 0xf0, 0x22, 0x20, 0x00, 0xeb, 0xe1,
+ 0x06, 0x22, 0x50, 0xcc,
+ 0xbd, 0x01, 0x15, 0x00, 0xeb, 0xf0, 0x01, 0x02, 0x0f, 0xbc, 0x0e, 0xf0,
+ 0x11, 0x12, 0xe0, 0xfe,
+ 0xe2, 0xe6, 0x00, 0x4c, 0x2f, 0xb0, 0xd5, 0xe1, 0xe2, 0xef, 0x0c, 0x70,
+ 0x70, 0xe0, 0xd0, 0x00,
+ 0x31, 0x42, 0x00, 0x30, 0x00, 0xef, 0xe0, 0x30, 0x57, 0x00, 0xb8, 0x0f,
+ 0xff, 0x02, 0x01, 0xae,
+ 0x0d, 0x2f, 0x0e, 0xf1, 0x02, 0x2f, 0x08, 0x1e, 0x70, 0x32, 0x00, 0xef,
+ 0x22, 0x47, 0x01, 0xfe,
+ 0xff, 0x10, 0x04, 0xf0, 0xef, 0xbf, 0x00, 0x05, 0xf0, 0xcd, 0xe0, 0x23,
+ 0x71, 0x30, 0xe0, 0xf0,
+ 0xfb, 0x00, 0x00, 0x00, 0xfe, 0xce, 0xc4, 0xf2, 0x0d, 0x1a, 0x22, 0x04,
+ 0xd1, 0xb2, 0xd0, 0xe0,
+ 0x4d, 0x41, 0x05, 0xf2, 0x02, 0x0f, 0xe8, 0x0f, 0x40, 0x70, 0x24, 0x20,
+ 0xef, 0xff, 0x0e, 0x30,
+ 0x42, 0xf1, 0x8e, 0xf1, 0x04, 0x20, 0x0e, 0xf0, 0xe1, 0xf4, 0x00, 0x7b,
+ 0x20, 0x10, 0xf0, 0xf0,
+ 0x10, 0x17, 0x65, 0x10, 0x0b, 0xee, 0xff, 0x01, 0x05, 0x00, 0xef, 0x00,
+ 0x10, 0x24, 0xd0, 0x90,
+ 0xff, 0xf0, 0x20, 0x50, 0x00, 0xf1, 0x00, 0x1e, 0x2f, 0x00, 0x01, 0x0c,
+ 0x1c, 0x50, 0x10, 0x0c,
+ 0xff, 0xe0, 0x8d, 0xcb, 0xf0, 0x02, 0x05, 0x10, 0x0e, 0xa2, 0xe6, 0xcf,
+ 0x1c, 0x20, 0x11, 0xf4,
+ 0xd0, 0xed, 0x3f, 0x61, 0x04, 0xdd, 0xfb, 0x00, 0x22, 0x42, 0x0f, 0x0c,
+ 0xed, 0xc0, 0xe1, 0xd0,
+ 0xb9, 0xff, 0x3f, 0x71, 0xff, 0xcb, 0x00, 0x01, 0x42, 0x20, 0x1d, 0x0f,
+ 0xf0, 0x07, 0x56, 0x3e,
+ 0x0e, 0xd0, 0xf1, 0x02, 0x00, 0xd0, 0x0e, 0x02, 0x03, 0xa0, 0x01, 0x01,
+ 0x23, 0x00, 0x3a, 0x00,
+ 0x57, 0x19, 0x8c, 0x09, 0x84, 0x1b, 0xeb, 0x0b, 0x65, 0x23, 0x0f, 0xdb,
+ 0xff, 0x0e, 0x40, 0x50,
+ 0x11, 0x00, 0x00, 0xfd, 0xd0, 0xd3, 0xe7, 0x32, 0x70, 0x30, 0xb3, 0xe5,
+ 0x00, 0x1e, 0x0e, 0x32,
+ 0x24, 0xc2, 0xef, 0x09, 0x20, 0x50, 0x22, 0x00, 0x1f, 0x40, 0x05, 0xa0,
+ 0xef, 0xee, 0x02, 0x02,
+ 0xf2, 0xfe, 0xde, 0xbf, 0x00, 0x0d, 0x00, 0xc7, 0xf1, 0x1e, 0x7e, 0x3e,
+ 0x10, 0xf6, 0xc3, 0x10,
+ 0x4b, 0x2e, 0x00, 0xf1, 0xee, 0xfd, 0x05, 0x76, 0x20, 0xfb, 0xd0, 0x00,
+ 0x30, 0x00, 0x02, 0x1f,
+ 0x1e, 0xdf, 0x9e, 0x00, 0x12, 0x10, 0x0f, 0x1e, 0xe0, 0xad, 0xec, 0x0e,
+ 0x0f, 0x1c, 0x1e, 0x17,
+ 0x27, 0x03, 0x0e, 0x2d, 0x21, 0xb4, 0xd0, 0x90, 0xe0, 0x0d, 0x30, 0x73,
+ 0x01, 0xef, 0xff, 0x0f,
+ 0x2f, 0x30, 0x2f, 0x0e, 0x02, 0x17, 0x16, 0x0d, 0xed, 0xce, 0xb0, 0xe5,
+ 0xf1, 0xde, 0xfb, 0x1f,
+ 0xff, 0xf0, 0x73, 0x30, 0x1f, 0x40, 0x31, 0x23, 0xf2, 0xc5, 0x00, 0xfd,
+ 0x32, 0x14, 0xc0, 0xce,
+ 0xef, 0xe4, 0xa3, 0xf0, 0x0d, 0xcf, 0xfc, 0x32, 0x77, 0x14, 0x20, 0x00,
+ 0x1d, 0x40, 0x00, 0x22,
+ 0x00, 0x0d, 0x0e, 0x0c, 0x1d, 0x31, 0xc7, 0x8f, 0xfd, 0x00, 0x30, 0x05,
+ 0xf2, 0xd2, 0xe2, 0x12,
+ 0x40, 0x0c, 0xf0, 0xde, 0xff, 0xd0, 0xe0, 0x1d, 0x7c, 0x76, 0x02, 0xed,
+ 0x0c, 0x00, 0x33, 0x25,
+ 0x22, 0x00, 0xdd, 0x0f, 0x0e, 0x3e, 0x3e, 0x1d, 0x0f, 0xa2, 0xc7, 0xf0,
+ 0x5d, 0x73, 0x57, 0xf2,
+ 0xdd, 0xfc, 0x10, 0x32, 0x21, 0xe1, 0xcf, 0xf0, 0x03, 0x04, 0x00, 0xef,
+ 0xce, 0xef, 0x0f, 0x0a,
+ 0x0e, 0x00, 0xe1, 0xd5, 0x1d, 0x5c, 0x00, 0x02, 0x10, 0x4d, 0x20, 0xae,
+ 0xca, 0xdf, 0x1e, 0x20,
+ 0x16, 0xbf, 0xdd, 0xf0, 0x04, 0x42, 0x1d, 0xe1, 0xe7, 0x01, 0x0f, 0xed,
+ 0x10, 0x73, 0x55, 0x00,
+ 0x11, 0xf1, 0x00, 0x00, 0x15, 0x12, 0x0d, 0x2e, 0x01, 0xb4, 0xde, 0xfa,
+ 0x0f, 0xfe, 0xc0, 0x01,
+ 0x30, 0x78, 0x40, 0x10, 0x00, 0xe2, 0xee, 0x2f, 0x7e, 0x20, 0x04, 0x00,
+ 0xf1, 0xf0, 0x0e, 0xf0,
+ 0x05, 0x43, 0xec, 0xcd, 0xe1, 0x07, 0x22, 0x0e, 0xef, 0xdf, 0x00, 0x13,
+ 0x74, 0x70, 0x0f, 0xfe,
+ 0xd0, 0xf7, 0xff, 0xfc, 0x0e, 0x00, 0x00, 0x03, 0xe3, 0xcf, 0xce, 0xef,
+ 0x1f, 0x21, 0xd0, 0xaf,
+ 0x06, 0x41, 0x0d, 0x2b, 0x20, 0x34, 0x01, 0x0e, 0x1a, 0x50, 0x00, 0xd0,
+ 0xbe, 0x01, 0x44, 0x51,
+ 0x0f, 0xcf, 0xf0, 0xf1, 0x07, 0xe1, 0xe0, 0x1c, 0x3f, 0x00, 0x02, 0x30,
+ 0xfe, 0x00, 0x00, 0x3e,
+ 0x4b, 0x3e, 0x00, 0xc3, 0xf1, 0x50, 0x60, 0x00, 0xae, 0xee, 0x03, 0xf6,
+ 0x1f, 0x2f, 0x04, 0xe2,
+ 0xed, 0x0f, 0x4d, 0xeb, 0x01, 0x65, 0x31, 0x1f, 0x0d, 0x0f, 0xd0, 0x05,
+ 0x10, 0x49, 0x0f, 0xb1,
+ 0xc3, 0x02, 0x1d, 0x1d, 0xc1, 0xc7, 0xe1, 0xe0, 0x2e, 0x52, 0x02, 0xd1,
+ 0xd2, 0x0f, 0x5c, 0x42,
+ 0x13, 0x0d, 0x0a, 0xe3, 0x13, 0x70, 0x1c, 0xf0, 0xc0, 0x00, 0x0c, 0xdc,
+ 0xef, 0x1d, 0x20, 0xfd,
+ 0x99, 0x0e, 0xef, 0x00, 0x40, 0x1c, 0x00, 0x05, 0x14, 0x20, 0x0c, 0x2f,
+ 0x61, 0x16, 0x11, 0xff,
+ 0xd0, 0x0f, 0x00, 0xf0, 0xf3, 0xff, 0x0f, 0x0d, 0x0f, 0x20, 0x16, 0xf0,
+ 0x6d, 0x70, 0x10, 0x10,
+ 0x03, 0xf0, 0xe9, 0x20, 0x43, 0x11, 0x10, 0xb0, 0xc1, 0xf0, 0xf0, 0xe0,
+ 0xd1, 0x00, 0x5e, 0x04,
+ 0xf7, 0xe4, 0x2e, 0x50, 0x00, 0x00, 0xf2, 0xf4, 0x00, 0x1c, 0x20, 0xe0,
+ 0xd4, 0x71, 0x10, 0xd0,
+ 0xa0, 0x03, 0x00, 0x2a, 0x00, 0xf5, 0xb1, 0xe1, 0xf0, 0x49, 0x0f, 0xf0,
+ 0x02, 0x33, 0x2f, 0xec,
+ 0xdd, 0x1e, 0x72, 0x60, 0xf0, 0xf1, 0x01, 0x00, 0x4f, 0x11, 0x14, 0xff,
+ 0xfc, 0x03, 0x37, 0xd0,
+ 0xae, 0x0e, 0x21, 0x01, 0x0d, 0xdf, 0x00, 0x14, 0x10, 0x3b, 0x31, 0x42,
+ 0x28, 0x2d, 0xf0, 0x90,
+ 0x01, 0x01, 0x22, 0x52, 0xff, 0xcd, 0xf1, 0xd2, 0xe0, 0xed, 0x04, 0x07,
+ 0x00, 0xfe, 0xae, 0xf0,
+ 0x1f, 0x73, 0x67, 0x00, 0xc0, 0x00, 0xf0, 0x11, 0x22, 0x0d, 0xdc, 0x00,
+ 0xf8, 0x0e, 0x0f, 0x10,
+ 0x00, 0x0c, 0xef, 0xe1, 0x36, 0x40, 0xdd, 0xe2, 0x64, 0x62, 0x00, 0xec,
+ 0xf0, 0x10, 0x33, 0x20,
+ 0x0e, 0xd0, 0xd0, 0xd0, 0x00, 0x23, 0x57, 0xf5, 0xcf, 0xee, 0x01, 0x13,
+ 0x51, 0x12, 0xee, 0xca,
+ 0x31, 0x74, 0x1e, 0x0c, 0xcf, 0x00, 0x02, 0x01, 0xf0, 0x4f, 0x20, 0xeb,
+ 0x9f, 0xf0, 0xf5, 0x02,
+ 0x40, 0x1b, 0xf0, 0xe2, 0x0f, 0x0d, 0x10, 0x14, 0x63, 0x10, 0x0d, 0xeb,
+ 0xfd, 0x10, 0x76, 0x13,
+ 0xf1, 0xdd, 0x0f, 0x02, 0x01, 0xfe, 0x0e, 0xe0, 0xf3, 0x03, 0xf0, 0x11,
+ 0x7e, 0x18, 0x10, 0x12,
+ 0x04, 0x00, 0x0f, 0x0e, 0x0f, 0x53, 0x02, 0xd0, 0xfc, 0x1e, 0x0e, 0x05,
+ 0x24, 0x01, 0xcf, 0xfb,
+ 0x0f, 0x0e, 0xde, 0x8f, 0xc2, 0x07, 0x21, 0xf0, 0xac, 0xff, 0xcf, 0xf0,
+ 0x11, 0x61, 0x10, 0x0d,
+ 0xe0, 0xdd, 0xec, 0x0e, 0x13, 0x37, 0x03, 0x0c, 0xee, 0xb0, 0x07, 0x10,
+ 0x61, 0x00, 0x0f, 0x0e,
+ 0xef, 0xe0, 0x03, 0x67, 0x30, 0xfb, 0xb0, 0x00, 0x00, 0x00, 0xf4, 0x0e,
+ 0xfd, 0x10, 0x0f, 0xef,
+ 0xf0, 0x2f, 0x3d, 0x20, 0x25, 0xf0, 0x0e, 0x7e, 0x60, 0x12, 0x04, 0xd0,
+ 0x20, 0x50, 0x04, 0x00,
+ 0x0f, 0x2c, 0x02, 0x27, 0x43, 0x0d, 0xde, 0x11, 0xe3, 0xae, 0xff, 0x11,
+ 0x71, 0x10, 0xdb, 0xe0,
+ 0xf0, 0x03, 0x10, 0x1d, 0x1b, 0xef, 0xb0, 0xf0, 0xd3, 0xf7, 0x17, 0x4e,
+ 0x0e, 0xb0, 0x03, 0xe2,
+ 0xe0, 0xdf, 0x10, 0x7f, 0x1f, 0x0e, 0x0e, 0xfe, 0x35, 0x56, 0x10, 0xef,
+ 0x0f, 0x10, 0xd2, 0xdf,
+ 0x2d, 0x23, 0xf7, 0xd2, 0xf0, 0xfd, 0xd0, 0x70, 0x71, 0x3e, 0x0c, 0xff,
+ 0x03, 0x25, 0x30, 0x30,
+ 0x2b, 0x00, 0xf0, 0x80, 0xf2, 0x01, 0x22, 0x30, 0x0e, 0xc4, 0xd2, 0x0e,
+ 0x0a, 0x0e, 0x12, 0x17,
+ 0x40, 0x10, 0xfe, 0xaf, 0x00, 0xd2, 0xf0, 0x0f, 0x0a, 0x50, 0x32, 0x01,
+ 0xfe, 0xeb, 0x2f, 0x30,
+ 0x03, 0xb0, 0xfd, 0x0f, 0x01, 0xa2, 0xcf, 0xed, 0xe1, 0xd4, 0xb3, 0xf0,
+ 0xcc, 0xf0, 0x4f, 0x3e,
+ 0x04, 0xc7, 0xe5, 0x0f, 0x30, 0x2f, 0x2f, 0x4f, 0xc0, 0x90, 0xfd, 0x0c,
+ 0xef, 0x0a, 0xfe, 0xfd,
+ 0xdf, 0xcc, 0xfe, 0x20, 0x50, 0x1c, 0x2f, 0x31, 0x22, 0xf2, 0x07, 0x24,
+ 0x5e, 0x2f, 0x40, 0x01,
+ 0xf2, 0x01, 0x10, 0x1b, 0xde, 0xb0, 0xfd, 0x0f, 0x50, 0x07, 0x00, 0x30,
+ 0x4f, 0x02, 0xb2, 0xe5,
+ 0x00, 0x2c, 0x0c, 0xc0, 0x03, 0x64, 0x00, 0xbc, 0x0f, 0xe0, 0x01, 0xf1,
+ 0x04, 0x00, 0x6f, 0x20,
+ 0xe2, 0xb0, 0x13, 0x25, 0x31, 0x20, 0x00, 0xff, 0x00, 0x10, 0xec, 0xe9,
+ 0x30, 0x73, 0x04, 0xa1,
+ 0xf0, 0x0f, 0xf1, 0x15, 0x23, 0xe1, 0xc0, 0xff, 0x0f, 0x27, 0x30, 0xec,
+ 0xaf, 0xf0, 0xe4, 0x10,
+ 0x4e, 0x1b, 0x00, 0xf0, 0x00, 0x03, 0x6f, 0x4c, 0x0f, 0xee, 0x00, 0x02,
+ 0x06, 0x21, 0x3d, 0x3e,
+ 0xf0, 0xa0, 0xf1, 0xff, 0x0e, 0x10, 0xf0, 0xbf, 0x0d, 0xef, 0x0f, 0x5e,
+ 0x31, 0x02, 0xc0, 0x08,
+ 0x0f, 0x2f, 0x14, 0x24, 0x0f, 0x9b, 0xe0, 0x17, 0x41, 0x0f, 0xdc, 0xe1,
+ 0xe3, 0xe1, 0x01, 0x70,
+ 0x2d, 0x10, 0x02, 0xf0, 0xfd, 0x0f, 0x21, 0x00, 0xd0, 0x11, 0x40, 0x0a,
+ 0xbf, 0x03, 0x03, 0xea,
+ 0xee, 0xcf, 0x00, 0x90, 0xef, 0x0f, 0x6f, 0x2e, 0xfc, 0xbf, 0x03, 0x05,
+ 0x20, 0x20, 0x10, 0xf5,
+ 0xd7, 0x03, 0x20, 0x2d, 0x0f, 0x10, 0xf2, 0x01, 0x31, 0x00, 0x30, 0x77,
+ 0x50, 0x0c, 0xff, 0x10,
+ 0x10, 0x21, 0x1f, 0x41, 0x21, 0x12, 0x14, 0xf0, 0xbd, 0xdc, 0x0f, 0x20,
+ 0xb2, 0x91, 0xf8, 0xff,
+ 0x1f, 0x0e, 0xd0, 0x0e, 0x24, 0x33, 0x0f, 0x20, 0x76, 0x34, 0x0f, 0xed,
+ 0x02, 0x02, 0xdf, 0xfd,
+ 0xe1, 0x12, 0x35, 0xf3, 0x03, 0x70, 0x4d, 0x00, 0xe2, 0x67, 0x30, 0x2d,
+ 0x02, 0x22, 0x00, 0xbf,
+ 0xe0, 0x02, 0x0b, 0x5e, 0xfd, 0xe9, 0xef, 0xdd, 0xce, 0x10, 0x47, 0x30,
+ 0xdd, 0xf0, 0x33, 0x42,
+ 0x0c, 0xe2, 0xd7, 0x80, 0xee, 0xf0, 0xe5, 0x00, 0x0c, 0x2f, 0x00, 0xd1,
+ 0xf2, 0x30, 0x6f, 0x1e,
+ 0x0f, 0x00, 0xe0, 0x3d, 0x1e, 0x10, 0xe0, 0x9c, 0xd0, 0x07, 0x02, 0x0d,
+ 0x3e, 0x23, 0xb7, 0xb2,
+ 0x00, 0x02, 0x53, 0x0d, 0xbb, 0xf0, 0xe2, 0x03, 0x45, 0x00, 0x0b, 0xf0,
+ 0x30, 0x21, 0xc0, 0xf0,
+ 0x00, 0x40, 0x21, 0x0f, 0xeb, 0x0f, 0x3d, 0x7c, 0x32, 0x01, 0xcd, 0xf9,
+ 0xe1, 0x34, 0x71, 0x0d,
+ 0x0e, 0x01, 0x24, 0xf0, 0xd0, 0x22, 0x42, 0x0f, 0x0c, 0xc0, 0x10, 0x2f,
+ 0x0c, 0xe0, 0x22, 0x34,
+ 0x1e, 0xf9, 0xa0, 0xe2, 0xd4, 0xe0, 0xd0, 0x84, 0xf1, 0xed, 0x2e, 0xff,
+ 0xbf, 0xe1, 0xd3, 0x00,
+ 0x00, 0x08, 0x40, 0x30, 0x3c, 0x2f, 0x62, 0x27, 0x10, 0x1d, 0x3f, 0xe0,
+ 0xce, 0x01, 0x24, 0x21,
+ 0xce, 0x9d, 0xde, 0xe0, 0xf0, 0x05, 0x73, 0x10, 0xff, 0xde, 0x0d, 0x10,
+ 0x37, 0x06, 0xfc, 0x0e,
+ 0x30, 0x03, 0xb1, 0xee, 0xeb, 0x1f, 0x71, 0x14, 0xee, 0xcc, 0x00, 0x12,
+ 0x33, 0x20, 0xff, 0xf0,
+ 0x10, 0x62, 0x03, 0xed, 0xee, 0x04, 0x10, 0xec, 0xd0, 0x5f, 0x6e, 0x0e,
+ 0xe4, 0xe6, 0x31, 0x50,
+ 0xfd, 0xcf, 0x01, 0x00, 0xff, 0xf3, 0x27, 0x00, 0xaa, 0x00, 0x00, 0xf2,
+ 0xd3, 0x22, 0x60, 0x2f,
+ 0x0a, 0xe0, 0x04, 0x03, 0x11, 0x00, 0x30, 0xff, 0xbc, 0x0c, 0xe0, 0xf1,
+ 0x00, 0x0c, 0xec, 0x8f,
+ 0xff, 0x00, 0x13, 0x0c, 0x2a, 0x10, 0xe0, 0xe3, 0x00, 0x1f, 0x1e, 0x72,
+ 0x31, 0xe1, 0xce, 0x0d,
+ 0x12, 0x47, 0x36, 0x4e, 0x0e, 0xdf, 0xf0, 0x01, 0x02, 0x00, 0x0c, 0x51,
+ 0x34, 0x50, 0x1c, 0xfe,
+ 0xbf, 0x03, 0x03, 0x31, 0x50, 0xf8, 0xdf, 0xe0, 0x03, 0x24, 0xd0, 0xdf,
+ 0x0f, 0x20, 0x14, 0xa0,
+ 0xcf, 0xef, 0x10, 0x21, 0x41, 0x0f, 0x40, 0x07, 0x06, 0x00, 0x6f, 0x1f,
+ 0xff, 0xd0, 0x01, 0xd3,
+ 0x0f, 0x00, 0x01, 0xf2, 0xa1, 0xc4, 0xd3, 0xf2, 0x03, 0x0c, 0x0a, 0x3f,
+ 0x41, 0x03, 0x03, 0xf0,
+ 0x09, 0xe0, 0x70, 0x40, 0x0e, 0x0e, 0x3f, 0x0f, 0x1e, 0x3c, 0x0f, 0x05,
+ 0x72, 0x40, 0xed, 0xe3,
+ 0x56, 0x2f, 0xee, 0xf2, 0x14, 0x10, 0xce, 0xcd, 0x00, 0x41, 0x1d, 0x0a,
+ 0xee, 0x2e, 0x30, 0x32,
+ 0x21, 0x0e, 0x2c, 0x5f, 0xfd, 0x9e, 0xc0, 0xf2, 0xf3, 0x0f, 0x24, 0x07,
+ 0xde, 0x8d, 0xf0, 0x07,
+ 0x51, 0x00, 0x00, 0x0f, 0x0f, 0x20, 0x02, 0xe2, 0x20, 0x1c, 0xef, 0xb0,
+ 0xff, 0x0e, 0x1d, 0xeb,
+ 0xd1, 0xe5, 0x05, 0x01, 0x0d, 0x0b, 0x2e, 0x20, 0x01, 0xae, 0xff, 0x57,
+ 0x53, 0x0e, 0x1c, 0x10,
+ 0x01, 0xc2, 0xf2, 0x00, 0x00, 0xf2, 0xf2, 0x00, 0x1c, 0x0c, 0x61, 0x02,
+ 0xe0, 0x0d, 0x62, 0x53,
+ 0x05, 0x13, 0xfe, 0x08, 0xe0, 0xf0, 0x02, 0x42, 0x42, 0xff, 0xab, 0xf0,
+ 0xe3, 0x0e, 0x1e, 0x00,
+ 0x35, 0x11, 0xdf, 0xbd, 0x0f, 0x1f, 0x50, 0x37, 0x12, 0x20, 0xf0, 0xf0,
+ 0x00, 0x3d, 0x1f, 0xee,
+ 0xb0, 0x00, 0xd2, 0xf3, 0xfc, 0xca, 0xf1, 0xf5, 0x04, 0x41, 0x00, 0x00,
+ 0xc0, 0x01, 0xf5, 0x32,
+ 0x6e, 0x39, 0x40, 0x22, 0x32, 0x00, 0xab, 0x1f, 0x50, 0x20, 0x00, 0xd0,
+ 0x14, 0x50, 0x02, 0x03,
+ 0xf1, 0xcb, 0xed, 0xd0, 0xf5, 0x02, 0x30, 0xdb, 0x8f, 0xff, 0xe1, 0xe0,
+ 0x0e, 0x0b, 0x00, 0xe0,
+ 0x30, 0x0f, 0xef, 0x30, 0x72, 0xf1, 0xcc, 0x0d, 0x20, 0x14, 0xd2, 0x21,
+ 0x51, 0xe0, 0xb0, 0xeb,
+ 0xf0, 0x00, 0x23, 0x47, 0xf2, 0xbf, 0x0d, 0x01, 0x62, 0x10, 0x01, 0x00,
+ 0xfb, 0xf0, 0x03, 0x01,
+ 0x0a, 0xce, 0xde, 0xef, 0xfe, 0x0f, 0x42, 0x41, 0x08, 0xcd, 0x0f, 0x03,
+ 0x34, 0x20, 0x70, 0x3f,
+ 0x01, 0xd3, 0xfe, 0x45, 0x54, 0x0d, 0x0a, 0xf0, 0x20, 0x43, 0x02, 0xbe,
+ 0x0b, 0x2f, 0x1e, 0x01,
+ 0xd2, 0xf3, 0x01, 0x13, 0x2d, 0xcd, 0xe0, 0xd3, 0xd7, 0xc4, 0x3f, 0x4e,
+ 0xbc, 0xce, 0xe0, 0xd5,
+ 0x02, 0x1f, 0x4e, 0x0f, 0xd0, 0x11, 0x11, 0x02, 0x32, 0x72, 0x7f, 0x12,
+ 0x07, 0x34, 0x0c, 0xdc,
+ 0xc0, 0x02, 0xe5, 0x20, 0x3f, 0x00, 0xe3, 0x01, 0xff, 0xf0, 0x24, 0x70,
+ 0x20, 0x45, 0x10, 0x10,
+ 0xe0, 0xcf, 0xfe, 0x0b, 0x5e, 0x40, 0x15, 0xef, 0xfd, 0x32, 0x24, 0xbe,
+ 0xed, 0x00, 0x21, 0x54,
+ 0x01, 0xfe, 0xef, 0x05, 0xd2, 0xde, 0xff, 0x24, 0x72, 0x5d, 0xf0, 0xe6,
+ 0x00, 0x0e, 0xfe, 0x0d,
+ 0x5c, 0x10, 0xfd, 0xdb, 0x0e, 0x2f, 0xfc, 0xbb, 0xdf, 0xe0, 0x17, 0x22,
+ 0x10, 0xbe, 0xbe, 0xe1,
+ 0xf7, 0x02, 0xe0, 0xce, 0x0e, 0x10, 0x30, 0x10, 0x10, 0x30, 0xfe, 0xbd,
+ 0x0e, 0x1e, 0x0a, 0xdf,
+ 0xd2, 0xa4, 0xff, 0xcb, 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x72, 0x3e, 0x0c,
+ 0xae, 0x00, 0x00, 0x32,
+ 0x32, 0x0f, 0x00, 0x0e, 0x08, 0xf0, 0xe5, 0x11, 0x0c, 0xfe, 0x0e, 0xff,
+ 0x8f, 0x00, 0x12, 0x10,
+ 0x1a, 0x0f, 0x11, 0x63, 0x31, 0x3f, 0xfe, 0xbd, 0xff, 0xd7, 0xd4, 0x32,
+ 0x70, 0x0f, 0xee, 0xe4,
+ 0xf4, 0x11, 0x20, 0x0f, 0xfd, 0x0e, 0x71, 0x23, 0xe5, 0x13, 0x63, 0x1d,
+ 0x0c, 0x04, 0x13, 0x01,
+ 0xf0, 0xca, 0x00, 0xe0, 0xc3, 0xb3, 0x01, 0xf0, 0x11, 0x17, 0x01, 0xbf,
+ 0xe0, 0x04, 0xf2, 0x00,
+ 0xff, 0xec, 0xfc, 0x0e, 0x00, 0x57, 0x4f, 0x0b, 0x00, 0x60, 0x0f, 0x0d,
+ 0xef, 0x46, 0x62, 0x00,
+ 0x00, 0xde, 0x00, 0x20, 0x00, 0x1f, 0x01, 0xe1, 0xfe, 0x20, 0x3c, 0xbc,
+ 0xec, 0x01, 0x22, 0x40,
+ 0x00, 0x4b, 0x3f, 0xd0, 0xc4, 0xc2, 0xfd, 0x3f, 0x43, 0xf2, 0x8c, 0xec,
+ 0x01, 0x06, 0x30, 0x01,
+ 0xef, 0xef, 0x01, 0x36, 0x11, 0x21, 0x1f, 0x2d, 0x5e, 0x00, 0x45, 0x14,
+ 0x00, 0xcb, 0xfe, 0xf0,
+ 0xee, 0x90, 0xf0, 0xf2, 0x25, 0x40, 0xfd, 0xbe, 0xd0, 0xf6, 0x01, 0x0f,
+ 0x0f, 0x0f, 0x1f, 0x10,
+ 0x11, 0xd3, 0xc0, 0x29, 0x40, 0x50, 0x12, 0x00, 0x12, 0x30, 0x00, 0x00,
+ 0x50, 0x33, 0x0b, 0x1f,
+ 0x42, 0x37, 0x30, 0xcd, 0xa0, 0x0e, 0x60, 0x11, 0x0f, 0xe0, 0x27, 0x24,
+ 0x0f, 0xcf, 0x00, 0x31,
+ 0x20, 0x10, 0xd1, 0xef, 0xdd, 0x80, 0xff, 0xfa, 0x0f, 0x01, 0x34, 0x4f,
+ 0x3d, 0x1e, 0x1d, 0x05,
+ 0x05, 0xf4, 0x00, 0x60, 0x2b, 0xe0, 0xc0, 0x04, 0xb0, 0xff, 0xf0, 0x12,
+ 0x10, 0xdd, 0xe1, 0x27,
+ 0x71, 0x1f, 0x0d, 0x00, 0x00, 0x00, 0x11, 0x5f, 0x3b, 0x5f, 0x10, 0x0f,
+ 0x00, 0x22, 0x13, 0x37,
+ 0x32, 0xdf, 0x4d, 0x01, 0x93, 0xc1, 0xe0, 0xce, 0xfe, 0xee, 0xb1, 0x02,
+ 0x0d, 0x4b, 0x00, 0xdf,
+ 0x0c, 0x4e, 0x3d, 0x3d, 0x00, 0xe7, 0xce, 0x09, 0x20, 0x10, 0xf1, 0xc0,
+ 0xce, 0xb0, 0xf0, 0xf3,
+ 0xed, 0xe0, 0x47, 0x13, 0xbf, 0xe0, 0xf3, 0x20, 0x73, 0x25, 0xf0, 0xe1,
+ 0x22, 0x20, 0x1a, 0x40,
+ 0x00, 0xcc, 0xdf, 0x02, 0x16, 0x00, 0xee, 0xcf, 0xfe, 0x00, 0x05, 0xb2,
+ 0xc0, 0xfa, 0x30, 0x2f,
+ 0x1f, 0x3f, 0x72, 0x11, 0x2f, 0x3c, 0x3e, 0x00, 0x22, 0x11, 0x0f, 0x2e,
+ 0x1f, 0xe0, 0xe4, 0x0f,
+ 0x52, 0x27, 0xe0, 0xe2, 0xf2, 0xbf, 0x09, 0xef, 0xb0, 0xd1, 0x01, 0x01,
+ 0x14, 0x00, 0x1a, 0x00,
+ 0x5e, 0x34, 0xc4, 0x2e, 0x21, 0x34, 0x69, 0x2e, 0xe3, 0x27, 0x72, 0x00,
+ 0xaf, 0x00, 0xfd, 0x09,
+ 0x0e, 0xcf, 0x04, 0x65, 0x3f, 0x1d, 0xfe, 0xc0, 0x02, 0x21, 0x10, 0x0f,
+ 0x0e, 0xe3, 0xe4, 0x00,
+ 0x0d, 0xa8, 0xef, 0x00, 0x41, 0x00, 0xd1, 0xc2, 0x0f, 0x4d, 0x1f, 0x0f,
+ 0x16, 0xf5, 0xc0, 0xf0,
+ 0x1b, 0x3f, 0xe0, 0xd3, 0xe2, 0x1d, 0x0d, 0xf0, 0x20, 0x51, 0x41, 0x51,
+ 0x1e, 0x12, 0x37, 0x02,
+ 0xef, 0xee, 0x22, 0x66, 0x01, 0xde, 0xbb, 0xcf, 0xd0, 0x12, 0x20, 0x3f,
+ 0xe9, 0xef, 0x40, 0x20,
+ 0xd0, 0xa1, 0x01, 0x61, 0x1f, 0x00, 0x04, 0xe4, 0x02, 0x11, 0x12, 0xd2,
+ 0x9f, 0x0d, 0x00, 0x22,
+ 0x00, 0xd0, 0xd1, 0x37, 0x71, 0x2f, 0x0c, 0x02, 0xf0, 0xf9, 0xee, 0xf0,
+ 0x01, 0xc0, 0xca, 0x0e,
+ 0x2e, 0xff, 0xb1, 0xe1, 0xee, 0x0f, 0x32, 0x14, 0xed, 0xec, 0x20, 0x72,
+ 0x3f, 0x0e, 0xdf, 0xf1,
+ 0x07, 0x77, 0x11, 0x2e, 0x0d, 0xff, 0x0f, 0x30, 0x62, 0x00, 0xff, 0xef,
+ 0x0f, 0x7e, 0x00, 0x01,
+ 0xf3, 0xeb, 0x0c, 0xf1, 0x17, 0x11, 0xef, 0xdb, 0x00, 0x12, 0x25, 0x00,
+ 0xd1, 0xef, 0x10, 0x7f,
+ 0x7e, 0xf0, 0xe0, 0x00, 0x21, 0x03, 0xe2, 0x0f, 0xfb, 0x10, 0x34, 0x01,
+ 0x91, 0xf5, 0x11, 0x12,
+ 0x02, 0xd4, 0xc0, 0xee, 0xe0, 0x04, 0x07, 0x00, 0xc3, 0x91, 0xff, 0xfc,
+ 0x1f, 0x10, 0x13, 0x45,
+ 0x20, 0x0c, 0xef, 0x5f, 0x40, 0x1d, 0x20, 0x24, 0x15, 0x0e, 0xdb, 0x20,
+ 0x61, 0x12, 0x00, 0x01,
+ 0xef, 0x10, 0x60, 0x10, 0x12, 0x13, 0x18, 0x0c, 0x20, 0xff, 0x10, 0x73,
+ 0xe1, 0x8d, 0x00, 0x10,
+ 0x2c, 0xd9, 0xef, 0xf0, 0x35, 0x30, 0x1e, 0xe0, 0xf3, 0xf0, 0xfd, 0x00,
+ 0x02, 0x43, 0x00, 0xa0,
+ 0xd0, 0xf1, 0xf3, 0x0e, 0x2d, 0x5f, 0x0e, 0xab, 0x00, 0x11, 0x50, 0x08,
+ 0xee, 0xd0, 0xf4, 0x00,
+ 0x30, 0x6f, 0xf1, 0xb3, 0xf2, 0xe0, 0xe4, 0xff, 0xfa, 0xf0, 0xef, 0xee,
+ 0x12, 0x25, 0x3e, 0x7d,
+ 0x01, 0x00, 0xe3, 0x75, 0x21, 0xf0, 0xf2, 0x00, 0x19, 0x0f, 0x00, 0xf4,
+ 0x0f, 0x2c, 0x3f, 0x2e,
+ 0x20, 0x10, 0xfe, 0x6c, 0x73, 0x13, 0xe4, 0xd7, 0x04, 0x20, 0xed, 0xc0,
+ 0x00, 0x02, 0x05, 0x10,
+ 0x0e, 0x9d, 0x0e, 0x44, 0x47, 0x0e, 0xfd, 0x00, 0x42, 0x03, 0xfd, 0xdc,
+ 0x02, 0x04, 0x2e, 0x1c,
+ 0xf0, 0x01, 0x05, 0x01, 0xf1, 0xd0, 0xcc, 0xd0, 0xef, 0x01, 0x43, 0xc0,
+ 0xb1, 0x14, 0x30, 0x2f,
+ 0xec, 0x20, 0x22, 0x02, 0x56, 0x71, 0x1d, 0x1d, 0x22, 0x17, 0xf2, 0xdf,
+ 0xee, 0x00, 0x42, 0x14,
+ 0xcf, 0x00, 0xff, 0xfd, 0x0a, 0x90, 0xd0, 0xb1, 0xec, 0xec, 0x51, 0x21,
+ 0x0f, 0xcb, 0xe0, 0x0f,
+ 0x30, 0x2f, 0xdd, 0xef, 0x5f, 0x0d, 0xac, 0x00, 0x13, 0x05, 0x00, 0xe2,
+ 0x14, 0x01, 0xec, 0xee,
+ 0x00, 0xf2, 0xd0, 0x07, 0x72, 0x54, 0x0f, 0xeb, 0xcf, 0x00, 0x52, 0x33,
+ 0x1e, 0xea, 0xc0, 0x04,
+ 0x13, 0x0e, 0xbd, 0x0e, 0xf0, 0x00, 0x02, 0xe3, 0xdf, 0xfa, 0x30, 0x3e,
+ 0x4e, 0x10, 0x06, 0xd0,
+ 0x30, 0x7f, 0x4e, 0x0c, 0xc0, 0x00, 0x65, 0x00, 0x0e, 0x10, 0x04, 0xef,
+ 0xcc, 0x00, 0x40, 0x22,
+ 0x35, 0xf0, 0xc0, 0x00, 0x11, 0x00, 0xfd, 0xb0, 0x00, 0x04, 0xe0, 0xf3,
+ 0x03, 0x70, 0x09, 0xdd,
+ 0x00, 0x44, 0x20, 0xfe, 0xcc, 0x13, 0x24, 0x01, 0xe0, 0xfc, 0x0f, 0x42,
+ 0xe1, 0x8e, 0xfd, 0x04,
+ 0x21, 0x1e, 0x0c, 0x22, 0x37, 0x01, 0xf1, 0x00, 0xfe, 0xe1, 0x03, 0x36,
+ 0x74, 0x00, 0xb0, 0x0d,
+ 0x31, 0x32, 0x14, 0xef, 0xfb, 0x6f, 0x3f, 0x0e, 0xde, 0x15, 0x43, 0x00,
+ 0xdd, 0x10, 0x45, 0xe0,
+ 0xc0, 0x12, 0x35, 0x00, 0xed, 0xba, 0xe0, 0x0f, 0xf1, 0x11, 0x30, 0xce,
+ 0xec, 0x70, 0x32, 0xff,
+ 0xad, 0xf0, 0x00, 0x0d, 0xff, 0xf2, 0x07, 0x02, 0xad, 0x0f, 0xf1, 0x25,
+ 0xf0, 0x00, 0x33, 0x2f,
+ 0x0d, 0xc1, 0x02, 0x0e, 0x2e, 0x04, 0xf7, 0xbf, 0xfd, 0x0e, 0x20, 0x00,
+ 0x90, 0x0b, 0xfd, 0x2d,
+ 0x40, 0xcf, 0xa0, 0x05, 0x12, 0x0d, 0xdb, 0x00, 0x04, 0x11, 0xfd, 0x9d,
+ 0x02, 0x03, 0x00, 0x2a,
+ 0xec, 0xfe, 0x32, 0x71, 0x2e, 0x0c, 0x01, 0xd3, 0x0f, 0x1c, 0x40, 0x20,
+ 0x0f, 0xd9, 0xc0, 0x00,
+ 0x52, 0x3f, 0x1c, 0x0e, 0x0f, 0x25, 0x05, 0xd0, 0xde, 0x10, 0xe3, 0x85,
+ 0xd0, 0xef, 0x1f, 0x40,
+ 0x10, 0xe1, 0x01, 0x72, 0x20, 0x2d, 0x00, 0xe0, 0xf8, 0xff, 0x21, 0x77,
+ 0x20, 0xf0, 0xfd, 0x01,
+ 0x15, 0xd2, 0xbf, 0xef, 0xe1, 0x12, 0x01, 0xef, 0x8e, 0x0f, 0xf3, 0x03,
+ 0x02, 0xdf, 0xe8, 0x0f,
+ 0x0f, 0x43, 0x27, 0x10, 0x10, 0xfd, 0xa0, 0x00, 0x2d, 0x20, 0x33, 0x07,
+ 0x8e, 0xfe, 0x10, 0x40,
+ 0x10, 0x03, 0x10, 0x0d, 0xe0, 0x12, 0x61, 0x0a, 0x0f, 0x11, 0xd3, 0xbc,
+ 0x2d, 0x60, 0x0f, 0xef,
+ 0xfd, 0x15, 0x42, 0xfb, 0xdc, 0x10, 0x05, 0x00, 0xf2, 0xcc, 0x01, 0x77,
+ 0x0e, 0xdf, 0xf0, 0xf0,
+ 0x63, 0x23, 0xed, 0xca, 0x00, 0x21, 0x12, 0x00, 0x00, 0x20, 0x0f, 0xec,
+ 0x00, 0x52, 0x06, 0xff,
+ 0xde, 0x00, 0xff, 0xe0, 0x90, 0xff, 0x15, 0x0f, 0xcc, 0x11, 0x02, 0xce,
+ 0x10, 0x34, 0xde, 0x0f,
+ 0x21, 0x0f, 0x0f, 0x76, 0x30, 0xe0, 0xab, 0x01, 0x21, 0xf0, 0xee, 0x10,
+ 0x44, 0x11, 0x0e, 0xef,
+ 0x3f, 0x50, 0x01, 0x22, 0x14, 0xfd, 0x0e, 0x67, 0x02, 0xea, 0x00, 0x63,
+ 0xef, 0xcd, 0x23, 0x01,
+ 0x0e, 0x11, 0x00, 0xe0, 0x0f, 0x0e, 0x01, 0x30, 0x0b, 0xf0, 0x00, 0xf1,
+ 0x13, 0x44, 0x30, 0xea,
+ 0xbf, 0xf0, 0x02, 0x35, 0xbf, 0xe0, 0x02, 0x00, 0xce, 0x00, 0x9d, 0x01,
+ 0x05, 0x20, 0x0e, 0xef,
+ 0x11, 0x21, 0x75, 0x30, 0x13, 0x00, 0xf8, 0x42, 0x42, 0xed, 0xd0, 0x00,
+ 0x00, 0x75, 0x00, 0xec,
+ 0xf0, 0x23, 0x00, 0xfd, 0xe1, 0xe5, 0xef, 0xfd, 0x11, 0x03, 0xa1, 0xed,
+ 0x09, 0x5f, 0x0e, 0x44,
+ 0xf0, 0xe0, 0x2f, 0x00, 0xfe, 0xe0, 0x9d, 0x10, 0x41, 0xd0, 0xbf, 0x06,
+ 0x33, 0x0f, 0xf0, 0xee,
+ 0x0f, 0x11, 0x23, 0x0e, 0xfb, 0x41, 0x04, 0x11, 0xfe, 0x10, 0x46, 0x01,
+ 0xd0, 0x8b, 0x00, 0x44,
+ 0x22, 0xef, 0xac, 0xff, 0xf1, 0x04, 0xd0, 0x0f, 0x10, 0x0d, 0xef, 0x11,
+ 0x57, 0x00, 0xdc, 0x0f,
+ 0x50, 0x32, 0x00, 0xed, 0x30, 0x41, 0x00, 0x23, 0x10, 0x0c, 0xff, 0x0e,
+ 0x01, 0x25, 0x10, 0x0f,
+ 0xfd, 0xbf, 0x02, 0x27, 0xc1, 0x90, 0x2e, 0x2b, 0xcd, 0xf1, 0x06, 0x11,
+ 0x0f, 0xcd, 0xfe, 0xe0,
+ 0x04, 0x45, 0xcf, 0xef, 0x11, 0x21, 0x10, 0xdf, 0xdd, 0x70, 0x1c, 0x0e,
+ 0x31, 0xe3, 0xd2, 0xef,
+ 0x38, 0x71, 0x5f, 0xee, 0x33, 0x25, 0xf0, 0xaf, 0x10, 0x10, 0x0c, 0xd0,
+ 0xb2, 0xcd, 0x09, 0x11,
+ 0x12, 0x01, 0xc0, 0xfe, 0x30, 0x52, 0xff, 0xee, 0x04, 0x35, 0x31, 0x0f,
+ 0xfe, 0x04, 0x32, 0x2f,
+ 0xa9, 0xcf, 0x23, 0x55, 0x0e, 0xde, 0xf0, 0xde, 0x20, 0x20, 0x32, 0x30,
+ 0x0c, 0xdd, 0x22, 0x75,
+ 0xf0, 0xcb, 0x00, 0x04, 0x0f, 0xcd, 0xe0, 0x00, 0x64, 0x01, 0xf0, 0xf0,
+ 0x12, 0x12, 0xff, 0xfe,
+ 0x05, 0x55, 0x00, 0xde, 0xee, 0xde, 0xff, 0x02, 0x66, 0x40, 0x1d, 0x0e,
+ 0xce, 0x0f, 0x0e, 0x34,
+ 0x22, 0xbe, 0x0e, 0xec, 0xbe, 0x00, 0xc2, 0xee, 0x0f, 0x0f, 0x34, 0xb0,
+ 0xfc, 0x12, 0x1c, 0x00,
+ 0x37, 0x43, 0x50, 0x0c, 0xde, 0x12, 0x35, 0x30, 0x11, 0x00, 0xff, 0x99,
+ 0xff, 0x00, 0x45, 0x10,
+ 0xff, 0xcd, 0x0f, 0x1f, 0x21, 0x34, 0x11, 0x2f, 0x00, 0xfd, 0xd1, 0x04,
+ 0x00, 0x9d, 0x0f, 0x11,
+ 0x23, 0x0f, 0xcc, 0x0e, 0x7d, 0x30, 0x35, 0x27, 0xef, 0xad, 0x00, 0x01,
+ 0xf1, 0xf1, 0x03, 0x55,
+ 0x01, 0x90, 0xfe, 0x01, 0x05, 0x01, 0x10, 0xf0, 0x02, 0x02, 0xe0, 0xeb,
+ 0x37, 0x22, 0x8c, 0xff,
+ 0x0f, 0x33, 0x11, 0xdf, 0xb0, 0x01, 0x53, 0x0f, 0x0c, 0x00, 0x00, 0x3f,
+ 0x2e, 0x36, 0x33, 0x10,
+ 0xed, 0xca, 0x10, 0x34, 0x32, 0x00, 0xac, 0x0e, 0x01, 0xe0, 0x11, 0x41,
+ 0x00, 0xec, 0xfc, 0x4f,
+ 0x60, 0x03, 0xf0, 0x11, 0x30, 0x19, 0xe0, 0x80, 0xfd, 0x00, 0xe0, 0x03,
+ 0x25, 0xff, 0xfe, 0x00,
+ 0xfd, 0x0e, 0x32, 0x77, 0x02, 0xec, 0xcf, 0x00, 0x0f, 0x52, 0x23, 0xfe,
+ 0xdd, 0xf0, 0x09, 0x00,
+ 0x62, 0x05, 0xef, 0xdf, 0x00, 0x01, 0xe1, 0xee, 0xd0, 0xb1, 0xe2, 0x10,
+ 0x40, 0x14, 0xd3, 0xd0,
+ 0xde, 0x1d, 0x31, 0x07, 0x12, 0x3c, 0xfb, 0xe0, 0x52, 0x67, 0x10, 0xed,
+ 0xba, 0x00, 0x40, 0x21,
+ 0x00, 0x00, 0x12, 0x10, 0xee, 0x00, 0x60, 0x14, 0x10, 0xf0, 0x02, 0xe1,
+ 0xe0, 0xff, 0xdd, 0xde,
+ 0xf0, 0x54, 0x36, 0x00, 0x0c, 0x70, 0x40, 0xf1, 0xe0, 0x21, 0x77, 0x00,
+ 0xd0, 0x0f, 0x20, 0x51,
+ 0x02, 0x00, 0xdc, 0xfc, 0x00, 0xf1, 0x05, 0x41, 0x00, 0x2c, 0x12, 0xd0,
+ 0xa1, 0x03, 0x1e, 0x09,
+ 0xb0, 0xf1, 0x05, 0x22, 0xee, 0xee, 0x73, 0x10, 0xc9, 0x21, 0x54, 0x00,
+ 0x0f, 0x0e, 0xe0, 0x13,
+ 0x34, 0x0f, 0x9d, 0x00, 0xf0, 0xf2, 0x11, 0x0d, 0xea, 0xe1, 0x22, 0x2f,
+ 0x0b, 0xff, 0xed, 0x22,
+ 0x42, 0xfe, 0x0f, 0x21, 0xe0, 0x2e, 0x6e, 0xcd, 0xb0, 0xf2, 0xb8, 0x0e,
+ 0x14, 0x33, 0x0f, 0xfc,
+ 0x04, 0xd0, 0x88, 0x21, 0x74, 0x00, 0xcc, 0x00, 0x10, 0x13, 0x00, 0xff,
+ 0x00, 0x0e, 0x31, 0x01,
+ 0xd0, 0x33, 0x13, 0xda, 0xce, 0x00, 0x14, 0x01, 0xbf, 0x00, 0xfd, 0xee,
+ 0xf0, 0xef, 0x1f, 0x72,
+ 0x24, 0xfa, 0x00, 0x01, 0x0c, 0xf0, 0x77, 0x00, 0xde, 0x00, 0x52, 0x01,
+ 0xff, 0xcd, 0x14, 0x00,
+ 0x0d, 0x0e, 0x01, 0x56, 0x00, 0xfb, 0xf0, 0x13, 0x00, 0x1f, 0x2f, 0x11,
+ 0x32, 0xf1, 0x90, 0xfd,
+ 0x0f, 0x00, 0x20, 0x11, 0xe0, 0xcb, 0x00, 0x42, 0xf0, 0xfd, 0x00, 0x01,
+ 0x02, 0x10, 0xcb, 0x32,
+ 0x77, 0x32, 0xac, 0x00, 0xf0, 0x23, 0x34, 0xe0, 0xfd, 0x32, 0x10, 0x10,
+ 0x02, 0x0f, 0xfd, 0xda,
+ 0xf0, 0x15, 0x00, 0x11, 0x63, 0x01, 0x00, 0xb0, 0x0c, 0x52, 0x27, 0xf0,
+ 0xb0, 0x0d, 0x30, 0x21,
+ 0x23, 0x10, 0xda, 0xe0, 0x1e, 0x52, 0x34, 0xd0, 0x89, 0xf0, 0x20, 0x12,
+ 0xef, 0xdc, 0x20, 0x54,
+ 0x00, 0xed, 0xce, 0x12, 0x24, 0x20, 0x0e, 0xff, 0xd1, 0x00, 0xf2, 0xd0,
+ 0x80, 0x00, 0x26, 0x42,
+ 0x0f, 0xed, 0xff, 0x03, 0x46, 0xef, 0xfd, 0xed, 0xeb, 0x22, 0xf2, 0xc0,
+ 0x65, 0x3f, 0xca, 0xdf,
+ 0xff, 0x21, 0x01, 0xf0, 0x01, 0xa0, 0xed, 0x00, 0x00, 0x1f, 0x01, 0xe0,
+ 0xd0, 0xee, 0x04, 0x57,
+ 0x00, 0x9a, 0x00, 0x41, 0x03, 0x00, 0x0d, 0xe0, 0x20, 0x30, 0x50, 0x21,
+ 0x0e, 0xfd, 0x0c, 0xf0,
+ 0xf0, 0x0e, 0x4f, 0x35, 0x01, 0xad, 0x0d, 0xb0, 0xd2, 0x00, 0x0f, 0x3f,
+ 0x00, 0xf5, 0x22, 0x0b,
+ 0xb9, 0x10, 0x43, 0x30, 0x3f, 0x0d, 0xef, 0x03, 0x33, 0x23, 0x40, 0xd0,
+ 0x07, 0xe7, 0x8e, 0x0d,
+ 0x22, 0x76, 0x00, 0xef, 0xde, 0x01, 0x73, 0x12, 0x0f, 0xff, 0xf1, 0x00,
+ 0xee, 0x00, 0xf0, 0xe6,
+ 0xde, 0xbc, 0x01, 0xd0, 0xe0, 0xde, 0x01, 0x22, 0x0e, 0xed, 0x57, 0x17,
+ 0x0f, 0x0d, 0x00, 0x73,
+ 0x22, 0x10, 0x0f, 0x00, 0xbb, 0x00, 0x40, 0x54, 0x0f, 0xdc, 0x00, 0x31,
+ 0x53, 0xfd, 0xed, 0x13,
+ 0x31, 0x13, 0x1f, 0xec, 0xcd, 0x00, 0x01, 0x03, 0xf1, 0xdd, 0xc8, 0x00,
+ 0x00, 0xbe, 0x0f, 0x43,
+ 0x47, 0x04, 0x00, 0x0b, 0xe0, 0x10, 0x50, 0x03, 0xe0, 0xcc, 0x00, 0x0e,
+ 0x20, 0x74, 0x21, 0xff,
+ 0xbd, 0x0f, 0x00, 0xf0, 0x0f, 0xf2, 0x01, 0x01, 0xd2, 0xef, 0xd8, 0x0f,
+ 0xf0, 0xb0, 0xef, 0x46,
+ 0x23, 0xdf, 0xee, 0xef, 0xfd, 0xd0, 0x17, 0x21, 0x8f, 0xfd, 0x00, 0x51,
+ 0x54, 0x0e, 0xed, 0x00,
+ 0x31, 0x44, 0x00, 0x1d, 0x11, 0x03, 0x00, 0x04, 0x10, 0x1c, 0x0c, 0xb1,
+ 0xe1, 0x00, 0x46, 0x1f,
+ 0x0d, 0x0e, 0x20, 0x5e, 0x10, 0x44, 0x02, 0x00, 0x77, 0x22, 0xdb, 0xbe,
+ 0xeb, 0x76, 0x34, 0xdd,
+ 0xbd, 0x01, 0x34, 0x10, 0xed, 0xf0, 0xe1, 0x00, 0x10, 0x10, 0x21, 0x02,
+ 0xbf, 0x0e, 0x11, 0x01,
+ 0xf0, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0x54, 0x47, 0xff, 0xee, 0x30, 0x43,
+ 0x36, 0xf0, 0xdf, 0xed,
+ 0x00, 0x65, 0x02, 0xe0, 0xec, 0x00, 0x51, 0x11, 0xe0, 0xde, 0x10, 0x4e,
+ 0x51, 0x16, 0xdd, 0xde,
+ 0x01, 0x00, 0xe0, 0xfe, 0x51, 0x02, 0xdb, 0xb0, 0x10, 0x00, 0xed, 0x12,
+ 0x00, 0x0c, 0x0d, 0x14,
+ 0x66, 0x00, 0xde, 0x0f, 0x00, 0x00, 0x71, 0x00, 0x0d, 0xeb, 0x01, 0x16,
+ 0x20, 0x0f, 0xee, 0x04,
+ 0x23, 0xc1, 0x8c, 0xf0, 0x00, 0x03, 0x01, 0xd0, 0xed, 0x10, 0x00, 0xfa,
+ 0xf0, 0x01, 0xad, 0x3f,
+ 0x64, 0x14, 0xf0, 0xec, 0xff, 0x32, 0x32, 0xe0, 0xbe, 0x00, 0x30, 0x30,
+ 0x25, 0xd0, 0xbb, 0x20,
+ 0x60, 0xff, 0xeb, 0x00, 0x37, 0xf0, 0xcd, 0x00, 0x42, 0x00, 0xe0, 0x0c,
+ 0x11, 0xf2, 0xf2, 0x52,
+ 0x0e, 0xbc, 0xdf, 0xff, 0x10, 0x41, 0x0f, 0xe1, 0xfc, 0xe8, 0x73, 0x77,
+ 0x0f, 0xcd, 0x00, 0x23,
+ 0x00, 0xff, 0x10, 0x01, 0xfe, 0x03, 0x0c, 0x0f, 0x00, 0x0d, 0x20, 0x46,
+ 0xdf, 0xbb, 0x20, 0x32,
+ 0xe0, 0xd0, 0xd0, 0xcf, 0xf0, 0xce, 0x14, 0x55, 0xdd, 0x0e, 0x22, 0x35,
+ 0xc0, 0xef, 0x53, 0x10,
+ 0x0d, 0xee, 0x23, 0x24, 0x10, 0xff, 0xeb, 0x73, 0x41, 0xde, 0xff, 0xeb,
+ 0xfe, 0x44, 0x42, 0xed,
+ 0xcc, 0x12, 0x24, 0xf0, 0xcd, 0x0f, 0x21, 0x10, 0xef, 0xe0, 0x00, 0xc1,
+ 0x16, 0x50, 0xbd, 0xda,
+ 0x24, 0x54, 0x00, 0x0e, 0xee, 0x00, 0x13, 0x00, 0x30, 0x31, 0xff, 0xbb,
+ 0x00, 0x10, 0x00, 0xd0,
+ 0x11, 0x5f, 0xd8, 0x00, 0x23, 0xcf, 0xac, 0x00, 0x44, 0x01, 0xed, 0xde,
+ 0x20, 0x12, 0x00, 0x02,
+ 0xac, 0x00, 0x11, 0x10, 0x1f, 0xef, 0x14, 0x55, 0x00, 0xe0, 0xea, 0xee,
+ 0x20, 0x65, 0x31, 0x01,
+ 0xce, 0xee, 0x00, 0x20, 0x03, 0x21, 0xed, 0x00, 0xfe, 0xfd, 0xfe, 0x20,
+ 0x24, 0x0f, 0x7f, 0x3d,
+ 0x33, 0x44, 0xe9, 0x00, 0x10, 0xe0, 0xde, 0x0f, 0x42, 0xe1, 0x8b, 0xdf,
+ 0x13, 0x34, 0x13, 0xcb,
+ 0xce, 0x22, 0x46, 0x12, 0x00, 0x0f, 0xe0, 0x02, 0x31, 0x02, 0xb0, 0xba,
+ 0x12, 0x04, 0xbd, 0xfe,
+ 0x65, 0x12, 0xec, 0xae, 0x14, 0x22, 0xfd, 0xf0, 0xf0, 0x02, 0x34, 0x0f,
+ 0x00, 0x14, 0x21, 0x0f,
+ 0x1f, 0xee, 0xdf, 0x63, 0x36, 0x00, 0x0d, 0xbb, 0x10, 0x72, 0x12, 0xfa,
+ 0x00, 0x02, 0x0f, 0xfe,
+ 0x10, 0x23, 0x0f, 0xca, 0x00, 0x43, 0x00, 0xde, 0xde, 0x0d, 0x70, 0x04,
+ 0xf0, 0xdf, 0x0e, 0x30,
+ 0x0e, 0xc0, 0x37, 0x04, 0x0d, 0x0f, 0x42, 0x01, 0xf0, 0xed, 0xdf, 0x44,
+ 0x10, 0xca, 0xfe, 0x21,
+ 0x11, 0xc0, 0xae, 0x01, 0x31, 0x0e, 0xe0, 0xd3, 0xf0, 0x77, 0x37, 0xe0,
+ 0x9d, 0x00, 0xf1, 0x22,
+ 0x10, 0xf0, 0xe1, 0xf0, 0x00, 0xef, 0xcb, 0xff, 0x01, 0x00, 0x30, 0x0f,
+ 0xfc, 0xf0, 0x20, 0x77,
+ 0x4f, 0xff, 0xe0, 0xf1, 0x1e, 0x2f, 0x42, 0x02, 0x8a, 0x0d, 0x10, 0x10,
+ 0xfd, 0xdc, 0x14, 0x35,
+ 0x10, 0x1f, 0x0e, 0x20, 0x76, 0x30, 0xf0, 0xef, 0x11, 0x31, 0x01, 0x01,
+ 0x1e, 0x00, 0x13, 0x00,
+ 0x60, 0xcd, 0x46, 0xcb, 0xaf, 0xcc, 0x6b, 0xcb, 0xff, 0x37, 0x72, 0x42,
+ 0x05, 0x03, 0x12, 0x10,
+ 0xec, 0xee, 0x03, 0xf1, 0x0e, 0x12, 0x30, 0xa8, 0xca, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xfe, 0xe0,
+ 0x54, 0xb0, 0xde, 0xe0, 0xd1, 0x07, 0xaf, 0xfe, 0x45, 0x21, 0xf0, 0x11,
+ 0x13, 0xff, 0xbb, 0x00,
+ 0x41, 0x42, 0xec, 0x00, 0x46, 0x11, 0x00, 0x1e, 0xcc, 0xce, 0x75, 0x33,
+ 0xcb, 0xce, 0x00, 0x22,
+ 0x10, 0x20, 0x0f, 0xae, 0x11, 0x02, 0x00, 0x1c, 0x01, 0xf1, 0xd1, 0xfe,
+ 0xed, 0x0e, 0x10, 0x33,
+ 0xbb, 0xed, 0x34, 0x54, 0x1f, 0x0b, 0x11, 0x23, 0x00, 0x13, 0x42, 0x98,
+ 0x0f, 0x04, 0x31, 0xef,
+ 0xce, 0x00, 0x01, 0xe0, 0x00, 0xe0, 0x1f, 0x32, 0x0d, 0xff, 0x10, 0xff,
+ 0xed, 0xf1, 0xb0, 0x02,
+ 0x74, 0x0e, 0xba, 0xf0, 0x03, 0x02, 0x2d, 0x0d, 0x00, 0xd1, 0xe4, 0x47,
+ 0x53, 0xf9, 0xdf, 0x21,
+ 0x74, 0x00, 0xec, 0xf2, 0x00, 0x00, 0x31, 0x0f, 0xde, 0xef, 0xee, 0x72,
+ 0x43, 0xfe, 0x02, 0xff,
+ 0x09, 0x30, 0x33, 0x00, 0xfd, 0xbd, 0xf0, 0x04, 0x13, 0x0f, 0x0e, 0xe1,
+ 0x03, 0x31, 0x42, 0x37,
+ 0x00, 0xf0, 0xde, 0x0e, 0x63, 0x67, 0x0e, 0xed, 0x0f, 0xf0, 0x00, 0x10,
+ 0xcb, 0xcc, 0x23, 0x32,
+ 0xb3, 0x06, 0x01, 0xdb, 0xcf, 0x42, 0x56, 0x00, 0x0f, 0x02, 0x11, 0xbb,
+ 0x21, 0x77, 0x00, 0xbb,
+ 0x00, 0x33, 0x0f, 0x00, 0x00, 0xfe, 0x10, 0x33, 0xde, 0xff, 0x01, 0x31,
+ 0xdf, 0xbf, 0x00, 0x12,
+ 0x20, 0xcc, 0x00, 0x42, 0xee, 0xed, 0x25, 0x00, 0x0e, 0x01, 0xff, 0xdc,
+ 0x13, 0x12, 0xb0, 0xf0,
+ 0x06, 0x0f, 0x20, 0x21, 0x8b, 0xdf, 0x43, 0x76, 0x0f, 0xec, 0xf0, 0x0e,
+ 0x21, 0x12, 0x00, 0x10,
+ 0xdd, 0xdf, 0x01, 0xe1, 0xef, 0x23, 0x21, 0xaa, 0xef, 0x00, 0x04, 0x11,
+ 0x1e, 0xed, 0x9d, 0x00,
+ 0x02, 0x22, 0x10, 0x1e, 0x15, 0x01, 0x30, 0xca, 0x0f, 0x00, 0xef, 0x04,
+ 0x64, 0xf0, 0xaa, 0xff,
+ 0x20, 0x65, 0xff, 0xce, 0x00, 0x31, 0xff, 0x00, 0x10, 0xef, 0xdd, 0x00,
+ 0x65, 0x0e, 0x0d, 0x10,
+ 0x00, 0x0f, 0x47, 0x20, 0xde, 0xfd, 0xf0, 0x01, 0x15, 0xe0, 0xce, 0x33,
+ 0x75, 0x00, 0xde, 0x00,
+ 0x34, 0x64, 0xde, 0x0d, 0x63, 0x00, 0x0e, 0xdd, 0x10, 0x35, 0xee, 0xdd,
+ 0x00, 0x14, 0xf0, 0xaf,
+ 0xfe, 0xe0, 0x03, 0xcf, 0x00, 0xe4, 0xf1, 0x02, 0x00, 0xd3, 0x01, 0xf8,
+ 0x1c, 0x76, 0x61, 0xf0,
+ 0xf0, 0x10, 0x40, 0x10, 0x00, 0x00, 0x24, 0x20, 0xed, 0x01, 0x34, 0x4f,
+ 0xdc, 0xac, 0x12, 0x13,
+ 0x00, 0xeb, 0x10, 0x10, 0x10, 0xee, 0xef, 0x51, 0x00, 0xfe, 0x00, 0x30,
+ 0xe3, 0xd6, 0xcd, 0xed,
+ 0xf0, 0xe0, 0x77, 0x75, 0xdd, 0xe0, 0x0f, 0x0e, 0x11, 0x72, 0x02, 0x0d,
+ 0x0e, 0xe0, 0x01, 0x00,
+ 0x0c, 0x0d, 0x10, 0x07, 0x03, 0xce, 0xfc, 0x22, 0x11, 0xad, 0xdc, 0x35,
+ 0x10, 0x89, 0xf0, 0x03,
+ 0x0f, 0x0e, 0xf0, 0x02, 0x00, 0x1f, 0x00, 0x10, 0xf2, 0xff, 0x41, 0x00,
+ 0xf1, 0x00, 0x40, 0x1f,
+ 0x34, 0xf0, 0x57, 0x23, 0xde, 0x88, 0xff, 0x00, 0x65, 0x01, 0xed, 0xfe,
+ 0x31, 0x12, 0x10, 0x0e,
+ 0x2f, 0x72, 0x03, 0x0f, 0x0d, 0x1f, 0x0f, 0x25, 0x01, 0xcd, 0xfb, 0xf2,
+ 0x02, 0xe3, 0x21, 0x77,
+ 0x02, 0xde, 0xdc, 0x20, 0x41, 0x10, 0xfd, 0xf0, 0xff, 0xce, 0x01, 0x30,
+ 0xfc, 0x01, 0x33, 0xcd,
+ 0xe0, 0x17, 0x02, 0x8c, 0xef, 0x17, 0x43, 0xf0, 0xbc, 0x02, 0x22, 0x01,
+ 0x42, 0xba, 0xed, 0x77,
+ 0x23, 0xdb, 0x10, 0x12, 0xff, 0x0f, 0x40, 0x02, 0xff, 0x0f, 0x10, 0x00,
+ 0xf0, 0x13, 0xf0, 0x8a,
+ 0x00, 0x00, 0x12, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0x0f, 0x0d, 0x20, 0x66,
+ 0x0f, 0xaa, 0x01, 0x21,
+ 0x00, 0x00, 0xcc, 0x11, 0x44, 0x00, 0xff, 0xff, 0xff, 0x34, 0x22, 0xcd,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0xbd, 0x01, 0x22, 0x1f, 0x0e, 0xe3, 0x03, 0x3e, 0x1f, 0xaf, 0xe2, 0x17,
+ 0x23, 0xfd, 0xca, 0xcd,
+ 0xfd, 0x13, 0x15, 0xe0, 0x00, 0x0f, 0xfc, 0x21, 0x76, 0x10, 0xdf, 0xcd,
+ 0x33, 0x76, 0x00, 0xec,
+ 0x00, 0x44, 0x00, 0xdf, 0x00, 0x20, 0xfd, 0xb0, 0xee, 0x22, 0x45, 0xfd,
+ 0xdd, 0x11, 0x43, 0x0e,
+ 0xeb, 0x42, 0x10, 0xf0, 0x01, 0x20, 0xfe, 0xff, 0x35, 0xaf, 0xdb, 0x01,
+ 0x33, 0xd0, 0x01, 0x00,
+ 0x31, 0x4f, 0x00, 0x75, 0x2e, 0xb8, 0x00, 0x42, 0x01, 0x0e, 0xdd, 0xff,
+ 0x21, 0x63, 0xda, 0xef,
+ 0x00, 0x55, 0xf0, 0xcd, 0x00, 0x13, 0xf0, 0xd0, 0x03, 0x22, 0xff, 0xdb,
+ 0x01, 0x63, 0x00, 0xf0,
+ 0xfb, 0x10, 0x75, 0x00, 0x1f, 0x0f, 0xff, 0xef, 0x00, 0x26, 0x10, 0xed,
+ 0xd0, 0xd0, 0xf0, 0xff,
+ 0x0e, 0x75, 0x10, 0x9e, 0x0e, 0x12, 0x33, 0x02, 0x11, 0xa8, 0x0c, 0x77,
+ 0x00, 0xbe, 0x00, 0x21,
+ 0x01, 0x0e, 0x02, 0xf0, 0xee, 0x21, 0x11, 0x00, 0x20, 0x00, 0xee, 0x00,
+ 0x13, 0x0f, 0x00, 0xde,
+ 0x0d, 0x0e, 0x22, 0x37, 0xbe, 0xdc, 0x00, 0x02, 0x0f, 0xee, 0x74, 0x01,
+ 0xee, 0xeb, 0x22, 0x23,
+ 0xca, 0xee, 0x42, 0x02, 0xf0, 0xef, 0x0f, 0x10, 0x53, 0xe0, 0x0f, 0x53,
+ 0xf0, 0xa8, 0x00, 0x45,
+ 0x21, 0xf0, 0xee, 0x01, 0xf0, 0xef, 0x01, 0x43, 0xeb, 0x9d, 0x01, 0x45,
+ 0xfe, 0xd9, 0x11, 0x62,
+ 0xff, 0x0f, 0x0f, 0x00, 0x30, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0xed, 0xe0,
+ 0x02, 0x24, 0xde, 0xf0,
+ 0x12, 0x31, 0x77, 0x31, 0xce, 0x00, 0x30, 0x35, 0x21, 0x9f, 0xea, 0x10,
+ 0x54, 0x00, 0xbe, 0x0f,
+ 0x22, 0x00, 0xee, 0x00, 0x07, 0x10, 0xdf, 0xd0, 0x21, 0x04, 0xae, 0xee,
+ 0x01, 0x00, 0x0f, 0x20,
+ 0x44, 0x51, 0x11, 0xfc, 0x00, 0x64, 0x1f, 0xfd, 0x04, 0x33, 0xfe, 0xec,
+ 0xfe, 0x00, 0x22, 0xe0,
+ 0x0f, 0xfd, 0xfe, 0xdb, 0x41, 0x45, 0xed, 0xdc, 0x74, 0x42, 0xed, 0xff,
+ 0x03, 0x35, 0xee, 0xaa,
+ 0x00, 0x22, 0x21, 0xce, 0xfe, 0x02, 0x25, 0x0e, 0xfc, 0x11, 0x01, 0xb0,
+ 0x0e, 0x75, 0x21, 0xf0,
+ 0xdb, 0x11, 0x42, 0xef, 0xde, 0x21, 0x45, 0xde, 0xce, 0x11, 0x22, 0x00,
+ 0xfd, 0xf1, 0x04, 0xb0,
+ 0xfc, 0xbe, 0x01, 0x15, 0xff, 0xce, 0x00, 0x31, 0xf0, 0xbc, 0x00, 0x44,
+ 0x00, 0x0d, 0x12, 0x10,
+ 0xec, 0x11, 0x26, 0xf0, 0x00, 0x10, 0x0f, 0xaf, 0xcc, 0xf0, 0x34, 0x55,
+ 0xfe, 0xcb, 0x10, 0x31,
+ 0x30, 0x00, 0x50, 0x44, 0x0f, 0xcd, 0x22, 0x55, 0x0f, 0xdf, 0x00, 0x04,
+ 0x0f, 0xee, 0xf0, 0x02,
+ 0x31, 0xfe, 0x34, 0x53, 0x0e, 0xec, 0x30, 0x32, 0xf2, 0xbc, 0x0f, 0x00,
+ 0x3f, 0xf9, 0xef, 0x31,
+ 0x00, 0x8c, 0x10, 0x24, 0xe0, 0xc0, 0xde, 0xe2, 0x47, 0x03, 0x8b, 0x00,
+ 0x03, 0xfe, 0xf0, 0x22,
+ 0x0f, 0xeb, 0x63, 0x01, 0x0f, 0x20, 0x0f, 0xff, 0x33, 0x20, 0x20, 0xf1,
+ 0xc0, 0x01, 0x01, 0x0f,
+ 0x0d, 0xc2, 0xd0, 0xe0, 0xda, 0xa8, 0x0f, 0x63, 0x23, 0xdc, 0xdb, 0x10,
+ 0x60, 0x02, 0x0f, 0xef,
+ 0x00, 0x32, 0x00, 0x0d, 0x0f, 0xf2, 0xe0, 0x14, 0x10, 0xef, 0x10, 0x41,
+ 0x00, 0x05, 0x11, 0xcd,
+ 0x01, 0x67, 0x0f, 0xdf, 0x00, 0xe2, 0xee, 0x0f, 0x31, 0x15, 0xa0, 0x88,
+ 0x0f, 0x11, 0x11, 0xfe,
+ 0xcd, 0x00, 0x02, 0xff, 0xb9, 0x00, 0x32, 0xef, 0xf0, 0x22, 0x12, 0x00,
+ 0x03, 0x01, 0x10, 0xec,
+ 0x53, 0x05, 0x00, 0x02, 0xed, 0x30, 0x74, 0x34, 0xbb, 0xed, 0x00, 0x22,
+ 0x53, 0xed, 0xce, 0x0d,
+ 0x0f, 0x75, 0x01, 0xea, 0x00, 0x10, 0x20, 0x00, 0x02, 0x44, 0xff, 0xcb,
+ 0x00, 0x00, 0x12, 0x00,
+ 0xdf, 0xfe, 0x43, 0x56, 0xee, 0xec, 0x51, 0x33, 0xf0, 0xdd, 0x10, 0x22,
+ 0xea, 0x0f, 0x43, 0x34,
+ 0xed, 0xce, 0x21, 0x04, 0x8e, 0xff, 0x25, 0x13, 0xef, 0xcd, 0x12, 0x24,
+ 0x10, 0x0f, 0x11, 0x55,
+ 0xff, 0xec, 0x00, 0x32, 0x53, 0xfe, 0xfd, 0x11, 0x14, 0xfc, 0xcc, 0x01,
+ 0x44, 0x01, 0xed, 0xdd,
+ 0x10, 0x01, 0x00, 0x02, 0xcf, 0x88, 0x11, 0x23, 0x12, 0xdd, 0xde, 0x01,
+ 0xd0, 0x42, 0x12, 0xea,
+ 0x01, 0x65, 0xee, 0xfe, 0x41, 0x20, 0x11, 0x54, 0x00, 0xda, 0xd0, 0x31,
+ 0x63, 0xff, 0xdc, 0x01,
+ 0x42, 0xde, 0xab, 0x00, 0x01, 0x21, 0x10, 0xfe, 0xe0, 0xee, 0x00, 0x64,
+ 0xf0, 0xf0, 0xf0, 0x0b,
+ 0xee, 0x21, 0x22, 0xee, 0xaf, 0x00, 0x00, 0xf8, 0x21, 0x11, 0xbf, 0x0f,
+ 0x36, 0x32, 0x1e, 0xee,
+ 0xbe, 0x26, 0x32, 0x00, 0xde, 0xf0, 0x10, 0x0f, 0xff, 0xc0, 0xbf, 0x0e,
+ 0x21, 0x2f, 0x0e, 0xda,
+ 0xef, 0x20, 0x20, 0x0d, 0x7f, 0x75, 0xe1, 0xef, 0x0e, 0x11, 0x47, 0xe1,
+ 0xcd, 0x0f, 0x12, 0x0f,
+ 0xce, 0x24, 0x35, 0x00, 0x1d, 0x52, 0x22, 0xfd, 0x21, 0x57, 0x02, 0x0d,
+ 0xfe, 0x00, 0x00, 0x01,
+ 0xbf, 0xec, 0x00, 0x02, 0xaf, 0xe8, 0x01, 0x25, 0xd0, 0xbe, 0x01, 0x02,
+ 0x0d, 0xbf, 0x24, 0x33,
+ 0xcd, 0xec, 0x33, 0x53, 0x00, 0xfe, 0x10, 0x12, 0x04, 0x0f, 0x0d, 0x37,
+ 0x10, 0xbd, 0x0f, 0x42,
+ 0x14, 0x1f, 0x0c, 0x1f, 0x22, 0x00, 0xee, 0xcf, 0x11, 0x41, 0x54, 0x13,
+ 0xed, 0xa8, 0x0f, 0x01,
+ 0x33, 0x11, 0xed, 0xfd, 0xf1, 0xd0, 0xec, 0x34, 0x33, 0xad, 0xeb, 0x21,
+ 0x32, 0x00, 0xb0, 0x0e,
+ 0x33, 0x71, 0xfe, 0xda, 0x11, 0x20, 0xed, 0xdc, 0x77, 0x04, 0xcb, 0xf0,
+ 0x20, 0x01, 0xd0, 0x0f,
+ 0x11, 0xef, 0xdd, 0x00, 0x64, 0xff, 0xdd, 0xff, 0x12, 0x75, 0x1e, 0xec,
+ 0x03, 0x02, 0x00, 0x00,
+ 0x0f, 0x02, 0xd1, 0xcc, 0x01, 0x03, 0xef, 0xeb, 0x32, 0x67, 0xde, 0xbc,
+ 0x21, 0x42, 0x00, 0x10,
+ 0x1f, 0x20, 0x20, 0x10, 0xf0, 0x3e, 0x72, 0x22, 0xeb, 0x01, 0x24, 0x30,
+ 0xce, 0x22, 0x42, 0xee,
+ 0xf2, 0xf5, 0x13, 0xfe, 0xb9, 0x11, 0x53, 0x0f, 0xec, 0x00, 0x42, 0xff,
+ 0xea, 0x00, 0x54, 0xfe,
+ 0xce, 0x00, 0x52, 0x02, 0xbd, 0x00, 0x05, 0xe2, 0xf0, 0xf0, 0x14, 0x12,
+ 0x00, 0xbf, 0x0d, 0x00,
+ 0x41, 0x31, 0x0e, 0x2d, 0x1e, 0x2f, 0x67, 0x27, 0xf1, 0xbd, 0x10, 0x23,
+ 0xe0, 0xcc, 0x11, 0x36,
+ 0x00, 0xee, 0x00, 0xf0, 0xfd, 0x41, 0x44, 0xf0, 0xcb, 0xff, 0x00, 0x40,
+ 0x02, 0x0f, 0x1f, 0x10,
+ 0xf0, 0xbb, 0x0e, 0x12, 0x01, 0xf0, 0x00, 0x00, 0xdc, 0xcb, 0x72, 0x54,
+ 0xff, 0xdd, 0x13, 0x02,
+ 0x00, 0x32, 0x10, 0xe1, 0xcf, 0x00, 0x10, 0x00, 0xe0, 0xdd, 0xa8, 0x14,
+ 0x47, 0xbe, 0xdd, 0x10,
+ 0x32, 0xf0, 0xaf, 0xfe, 0xf1, 0x11, 0x00, 0xff, 0xba, 0xf0, 0xee, 0x02,
+ 0x77, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x0f, 0xbc, 0x00, 0x00, 0x23, 0x00, 0xdd,
+ 0x0f, 0x00, 0x10, 0x1e,
+ 0x0d, 0x00, 0x21, 0x20, 0x42, 0x32, 0xee, 0xbd, 0x01, 0x67, 0x03, 0xcf,
+ 0x00, 0x00, 0xea, 0xff,
+ 0x23, 0x02, 0x99, 0x00, 0x51, 0x01, 0x1f, 0x0d, 0x11, 0x11, 0x21, 0x11,
+ 0x1c, 0x0f, 0x00, 0xde,
+ 0xcb, 0x02, 0x02, 0xdb, 0x2f, 0x00, 0xde, 0x80, 0xe0, 0xf7, 0x01, 0x21,
+ 0x52, 0xf0, 0xdf, 0x00,
+ 0x02, 0x01, 0x37, 0xee, 0xdd, 0x42, 0x00, 0x9f, 0x00, 0x55, 0x01, 0xfa,
+ 0xef, 0x00, 0x53, 0x00,
+ 0xe0, 0x10, 0x01, 0x0d, 0xf0, 0x04, 0xff, 0x8c, 0x02, 0x22, 0x0d, 0xf1,
+ 0xf0, 0x0e, 0x10, 0x22,
+ 0x04, 0x00, 0x0f, 0xfb, 0x1d, 0x74, 0x27, 0xe0, 0xbe, 0x10, 0x21, 0xf0,
+ 0xec, 0x00, 0xf4, 0xff,
+ 0xfd, 0x30, 0x77, 0x01, 0xad, 0x0b, 0x02, 0x45, 0x0f, 0xcd, 0x00, 0x31,
+ 0x11, 0xe0, 0xee, 0x0f,
+ 0xfd, 0x52, 0x25, 0xf0, 0xcc, 0xfe, 0x10, 0x10, 0x20, 0x33, 0xe2, 0xbb,
+ 0x0f, 0x11, 0x43, 0x57,
+ 0xf0, 0xdf, 0xde, 0x00, 0x26, 0xe0, 0x9d, 0x00, 0x01, 0x01, 0x12, 0xff,
+ 0xdc, 0x00, 0x20, 0x3e,
+ 0x22, 0x00, 0xed, 0xed, 0x0e, 0x3d, 0x73, 0x67, 0xde, 0xda, 0x00, 0x63,
+ 0x02, 0xed, 0xed, 0x01,
+ 0x42, 0xf0, 0xea, 0x00, 0x03, 0x21, 0x63, 0x13, 0x0f, 0x1e, 0x1e, 0x3f,
+ 0x15, 0x12, 0xee, 0x02,
+ 0x22, 0xdf, 0x88, 0xee, 0x35, 0xf0, 0xac, 0x00, 0x04, 0xd0, 0xde, 0x00,
+ 0x33, 0x31, 0xe0, 0x00,
+ 0x21, 0xf0, 0x00, 0xe0, 0x3f, 0x72, 0x40, 0xe0, 0x03, 0xec, 0x0b, 0x20,
+ 0x75, 0x11, 0x00, 0x00,
+ 0xef, 0x01, 0x00, 0x20, 0x42, 0x02, 0xee, 0x0e, 0x09, 0x0d, 0x50, 0x11,
+ 0x22, 0xf2, 0xbd, 0x2e,
+ 0x34, 0xe2, 0xb9, 0xec, 0x01, 0x67, 0x03, 0xdb, 0xff, 0x10, 0x00, 0xd0,
+ 0x0e, 0x73, 0x65, 0xed,
+ 0xfe, 0x10, 0x22, 0x13, 0x20, 0xfc, 0xe0, 0xe4, 0xdf, 0x0f, 0x00, 0x1f,
+ 0xf0, 0xd0, 0xe2, 0x9c,
+ 0xe9, 0x00, 0x43, 0xf0, 0x9e, 0x0f, 0xff, 0x01, 0x00, 0xeb, 0x33, 0x34,
+ 0xdd, 0xec, 0x21, 0x32,
+ 0x00, 0x01, 0x46, 0xe0, 0x8f, 0xd0, 0x02, 0x01, 0xfe, 0xff, 0x14, 0x02,
+ 0x98, 0xfe, 0x30, 0x20,
+ 0x20, 0x20, 0x22, 0x1f, 0x1a, 0x0f, 0x70, 0x63, 0x04, 0x00, 0xe0, 0x02,
+ 0x42, 0x10, 0x00, 0xf6,
+ 0xc0, 0xff, 0x10, 0x33, 0x12, 0xed, 0x0d, 0x50, 0x0d, 0x10, 0x7f, 0x47,
+ 0x34, 0xfb, 0xdd, 0x00,
+ 0x64, 0x00, 0xde, 0xff, 0x01, 0x04, 0xab, 0xf0, 0x00, 0x02, 0xcd, 0xec,
+ 0x03, 0x04, 0x00, 0x1c,
+ 0x10, 0x52, 0x01, 0xf0, 0xff, 0x01, 0x00, 0x01, 0x43, 0xee, 0xdf, 0x25,
+ 0x20, 0x03, 0x0d, 0xf0,
+ 0xe3, 0xe4, 0x52, 0x3e, 0x0d, 0x47, 0x57, 0xff, 0x2f, 0x51, 0xde, 0xfb,
+ 0x40, 0x00, 0x00, 0x00,
+ 0xf0, 0xdd, 0xbc, 0x20, 0x40, 0xf0, 0xcf, 0x00, 0x0c, 0x43, 0x37, 0xbe,
+ 0xdd, 0xe0, 0x02, 0x44,
+ 0xff, 0x00, 0x00, 0xf0, 0xe5, 0x32, 0x7f, 0x0c, 0x00, 0x46, 0x00, 0xad,
+ 0xfd, 0x35, 0x31, 0xae,
+ 0xee, 0x00, 0x00, 0x0f, 0xba, 0xf0, 0x00, 0x13, 0xcd, 0x0e, 0x22, 0x34,
+ 0x10, 0xff, 0xef, 0x12,
+ 0x55, 0x24, 0x00, 0xff, 0xcf, 0x01, 0x11, 0xf0, 0xa1, 0xff, 0x01, 0x00,
+ 0xc8, 0x0c, 0x32, 0x21,
+ 0xed, 0xee, 0x43, 0x31, 0xad, 0x00, 0x27, 0x1f, 0x0e, 0x20, 0x11, 0x24,
+ 0x00, 0xdc, 0x00, 0x00,
+ 0x61, 0x30, 0x00, 0x30, 0xe0, 0xca, 0x63, 0x44, 0xfe, 0xec, 0x00, 0x50,
+ 0x23, 0x00, 0x0d, 0x53,
+ 0xf1, 0xfb, 0xfe, 0x20, 0x12, 0xef, 0xcf, 0x07, 0x14, 0xce, 0xad, 0x03,
+ 0x14, 0x24, 0xee, 0xdf,
+ 0x23, 0x33, 0x1e, 0x40, 0x00, 0xcd, 0x0c, 0x31, 0x75, 0x30, 0xee, 0x04,
+ 0x12, 0x0d, 0xdc, 0x00,
+ 0x00, 0x02, 0xa0, 0xef, 0x07, 0xef, 0xcb, 0x11, 0x52, 0xf0, 0xb0, 0xfb,
+ 0x00, 0x33, 0x33, 0x20,
+ 0xdd, 0xab, 0x00, 0x21, 0x55, 0x00, 0xef, 0x0e, 0x13, 0x32, 0xeb, 0x0f,
+ 0x11, 0x23, 0xbd, 0xdc,
+ 0x13, 0x10, 0xcc, 0xff, 0x12, 0x25, 0xdf, 0x1e, 0x3d, 0x30, 0x73, 0xed,
+ 0xcc, 0x01, 0x35, 0x0e,
+ 0xab, 0x11, 0x22, 0xce, 0xbb, 0x01, 0x22, 0x0f, 0x0e, 0xfe, 0x00, 0x03,
+ 0x24, 0x12, 0x0d, 0xea,
+ 0x31, 0x74, 0x21, 0xf1, 0xcd, 0x00, 0xe1, 0xcf, 0xf1, 0xa0, 0xfb, 0x01,
+ 0x33, 0x20, 0x00, 0xdd,
+ 0x88, 0x00, 0x30, 0x32, 0x00, 0xdf, 0xdb, 0xff, 0x00, 0x46, 0x00, 0xff,
+ 0xff, 0xdd, 0x00, 0x21,
+ 0x00, 0x54, 0x63, 0xf0, 0xda, 0x10, 0x52, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x1b, 0x00, 0x18, 0x00,
+ 0x5a, 0x0c, 0xe6, 0x00, 0x78, 0x0c, 0x4e, 0x02, 0x52, 0x37, 0x00, 0xea,
+ 0x10, 0x40, 0x21, 0x01,
+ 0xbd, 0xfc, 0x23, 0xf3, 0x8b, 0xcd, 0x01, 0x27, 0xf0, 0xbf, 0x00, 0xf0,
+ 0xf1, 0x02, 0x23, 0x1f,
+ 0x0d, 0xe0, 0xe0, 0x11, 0x46, 0x62, 0x00, 0xfe, 0x00, 0x11, 0x15, 0xf0,
+ 0xcd, 0x12, 0x77, 0x11,
+ 0x0f, 0xfb, 0x00, 0x33, 0x62, 0x00, 0x0e, 0xff, 0xee, 0x0f, 0x01, 0x14,
+ 0xfe, 0xcb, 0xf0, 0xf0,
+ 0x02, 0x11, 0xfe, 0xdb, 0x21, 0x41, 0x0f, 0x2f, 0x42, 0xdd, 0xc9, 0x62,
+ 0x24, 0xd0, 0xcc, 0xee,
+ 0x01, 0x34, 0x11, 0xbf, 0xdc, 0x00, 0x61, 0x23, 0x00, 0xed, 0xce, 0x00,
+ 0x37, 0x30, 0xdb, 0xef,
+ 0x31, 0xd0, 0xa0, 0x0d, 0x01, 0x20, 0xef, 0xef, 0x00, 0x20, 0x42, 0x00,
+ 0xfb, 0x74, 0x15, 0xdf,
+ 0x9d, 0xf0, 0x05, 0x11, 0xee, 0xcf, 0x01, 0xd0, 0x02, 0x10, 0x0a, 0x2f,
+ 0x31, 0x00, 0xfb, 0x40,
+ 0x75, 0x40, 0xee, 0x2f, 0x32, 0x14, 0x00, 0x1f, 0x52, 0x13, 0xf1, 0xed,
+ 0xec, 0x50, 0x44, 0x10,
+ 0xf0, 0xef, 0x0f, 0x00, 0x2f, 0x00, 0x21, 0x09, 0x4e, 0x71, 0x04, 0xf0,
+ 0xdd, 0xff, 0x35, 0x12,
+ 0xee, 0xc0, 0xde, 0xab, 0x03, 0xe1, 0x14, 0xf0, 0x8a, 0xf1, 0x23, 0x21,
+ 0x20, 0x23, 0xe0, 0x00,
+ 0x20, 0x0c, 0x11, 0x65, 0x01, 0xde, 0xfd, 0xff, 0x13, 0x66, 0x23, 0xff,
+ 0xcb, 0x01, 0x32, 0x00,
+ 0xe3, 0x02, 0x0e, 0x1f, 0x30, 0x21, 0x61, 0x20, 0x2f, 0xfd, 0xb9, 0xdc,
+ 0xfd, 0x0e, 0x61, 0xdc,
+ 0xf0, 0x00, 0x20, 0x44, 0x0f, 0xc8, 0x00, 0x40, 0x03, 0x0f, 0x10, 0x1f,
+ 0x0d, 0x02, 0x27, 0xa0,
+ 0xdc, 0x32, 0x34, 0xef, 0xfe, 0x60, 0x44, 0x23, 0xc0, 0xc9, 0xf0, 0x20,
+ 0x21, 0xd0, 0x8e, 0xff,
+ 0x00, 0x0f, 0xfe, 0xbc, 0x0f, 0x00, 0x03, 0xf1, 0x26, 0x24, 0xf0, 0xdb,
+ 0x00, 0x43, 0x41, 0x01,
+ 0xd0, 0xde, 0xff, 0x55, 0x41, 0xdd, 0xdf, 0x44, 0x21, 0xcb, 0xfe, 0x32,
+ 0x52, 0xdf, 0xec, 0xe0,
+ 0x03, 0xef, 0xec, 0x1f, 0x70, 0x14, 0xe0, 0xca, 0x10, 0x53, 0x22, 0xfd,
+ 0xee, 0xf1, 0x02, 0xf0,
+ 0x56, 0x00, 0xeb, 0xef, 0x30, 0x13, 0x00, 0xfd, 0x2e, 0x6d, 0x32, 0x20,
+ 0xff, 0x0f, 0x54, 0x20,
+ 0x0e, 0x20, 0xcf, 0xb8, 0xf0, 0x16, 0x20, 0xee, 0xcf, 0xe0, 0x02, 0xf1,
+ 0xee, 0x10, 0x26, 0x20,
+ 0x0f, 0xfe, 0x51, 0x13, 0x8e, 0x0f, 0x05, 0x10, 0xfb, 0x00, 0x11, 0x02,
+ 0xc0, 0xfe, 0x01, 0xe0,
+ 0xfe, 0x36, 0x31, 0xce, 0xff, 0x21, 0x24, 0xed, 0xfd, 0x73, 0x55, 0xd0,
+ 0xcc, 0xed, 0x00, 0x23,
+ 0x01, 0xce, 0x21, 0x13, 0xea, 0x00, 0x61, 0x36, 0x00, 0xed, 0x00, 0xe2,
+ 0x20, 0x20, 0xf0, 0x8e,
+ 0x00, 0xe1, 0xf0, 0x07, 0x60, 0x00, 0x1f, 0x22, 0x00, 0xcc, 0x0e, 0x20,
+ 0x44, 0xff, 0xfc, 0x00,
+ 0x0c, 0x1e, 0x31, 0xdf, 0x9b, 0x00, 0x23, 0x02, 0x11, 0x34, 0x0d, 0xcd,
+ 0x00, 0x0f, 0xec, 0x24,
+ 0x05, 0x8b, 0xe0, 0x42, 0x03, 0xbd, 0x00, 0x02, 0xff, 0xef, 0xef, 0x15,
+ 0x36, 0x00, 0xfe, 0xde,
+ 0xe0, 0x90, 0xfc, 0x01, 0x40, 0xfc, 0xff, 0x12, 0x20, 0xb9, 0x0f, 0x42,
+ 0x65, 0xfe, 0xee, 0xf1,
+ 0x32, 0x22, 0x0f, 0x10, 0x40, 0xdc, 0xee, 0x20, 0x24, 0x74, 0x1d, 0x0b,
+ 0x00, 0x32, 0x14, 0xce,
+ 0x0f, 0x32, 0x00, 0x8d, 0xf0, 0x04, 0x00, 0xe0, 0x10, 0xf0, 0xfe, 0xed,
+ 0xd1, 0x07, 0x33, 0x00,
+ 0x00, 0x23, 0x10, 0xef, 0x8c, 0x03, 0x57, 0x02, 0xec, 0xde, 0x00, 0x12,
+ 0x77, 0x30, 0xef, 0xdb,
+ 0x21, 0x53, 0x02, 0x1f, 0x0d, 0x11, 0x43, 0x00, 0xed, 0x00, 0x15, 0xff,
+ 0x9c, 0x0f, 0xf1, 0x00,
+ 0xef, 0xef, 0x22, 0x53, 0x0d, 0x0d, 0x05, 0x11, 0x20, 0x43, 0x37, 0xdd,
+ 0xab, 0x00, 0x32, 0x20,
+ 0x01, 0xce, 0xff, 0x04, 0x2f, 0xe9, 0x10, 0x73, 0x01, 0xcf, 0x00, 0x10,
+ 0x0f, 0xef, 0x01, 0x02,
+ 0xe0, 0xfb, 0xee, 0xfd, 0xfd, 0x11, 0x01, 0xcf, 0xff, 0xbc, 0x32, 0x77,
+ 0x14, 0xcc, 0x00, 0x06,
+ 0xe0, 0xbd, 0x00, 0x00, 0x02, 0xd0, 0xf0, 0x0d, 0x00, 0x30, 0x20, 0xeb,
+ 0x00, 0x41, 0x55, 0xef,
+ 0xde, 0x10, 0x71, 0x24, 0x00, 0xed, 0x11, 0x46, 0x10, 0xef, 0x0f, 0x51,
+ 0x02, 0x0f, 0x22, 0x33,
+ 0x01, 0x30, 0xeb, 0x00, 0x75, 0x32, 0x1f, 0xdc, 0xf0, 0x22, 0x20, 0x1b,
+ 0x30, 0x11, 0xd0, 0x00,
+ 0x4f, 0x00, 0xaf, 0xdf, 0xee, 0xe0, 0xef, 0x03, 0xfc, 0x88, 0xc0, 0x33,
+ 0x23, 0x0f, 0xcd, 0x00,
+ 0x21, 0x44, 0x0e, 0x0b, 0xaf, 0x02, 0x27, 0x10, 0x10, 0xef, 0xbd, 0xf1,
+ 0x27, 0x01, 0x00, 0x01,
+ 0x0f, 0xdf, 0x10, 0x74, 0x63, 0x0f, 0xff, 0x0d, 0x10, 0x34, 0x00, 0xee,
+ 0x03, 0xfa, 0xdd, 0xfe,
+ 0xf1, 0xce, 0xda, 0x00, 0x41, 0x30, 0xdd, 0xfc, 0x00, 0x73, 0x47, 0xff,
+ 0xed, 0x11, 0x12, 0x21,
+ 0x00, 0x00, 0x44, 0x02, 0x8d, 0xdb, 0x43, 0x33, 0xee, 0xde, 0x03, 0x20,
+ 0xf8, 0xef, 0xc0, 0x00,
+ 0x32, 0x11, 0x8e, 0xcb, 0x00, 0x00, 0xf0, 0x00, 0x12, 0xee, 0xbd, 0x24,
+ 0x44, 0x11, 0x10, 0xef,
+ 0xdc, 0x00, 0x33, 0x32, 0xf0, 0xaa, 0xe0, 0x02, 0x03, 0xe0, 0xde, 0xbb,
+ 0xe0, 0x20, 0x21, 0xf4,
+ 0xad, 0x0c, 0x22, 0x63, 0x0e, 0xf9, 0x00, 0x22, 0x23, 0x00, 0xf0, 0x0f,
+ 0x31, 0xe2, 0xb0, 0xee,
+ 0x0d, 0x10, 0x32, 0x57, 0x0f, 0x0a, 0x50, 0x32, 0x0f, 0x1d, 0x2d, 0x0d,
+ 0x10, 0x31, 0x10, 0x1c,
+ 0x32, 0xe3, 0x00, 0x50, 0x04, 0xb1, 0x01, 0x04, 0x06, 0xbf, 0xdf, 0x03,
+ 0x27, 0x64, 0x0f, 0xee,
+ 0x13, 0x32, 0x0e, 0x40, 0x32, 0xf0, 0xe3, 0x21, 0x51, 0x02, 0xb8, 0xec,
+ 0x01, 0xf0, 0xd3, 0xe2,
+ 0xbe, 0x0c, 0x00, 0x54, 0x00, 0xdf, 0xe0, 0x00, 0x41, 0x21, 0x10, 0xee,
+ 0xe1, 0x01, 0xd9, 0xde,
+ 0xe1, 0xf3, 0xf0, 0x0b, 0x62, 0x34, 0xde, 0x0f, 0x33, 0x64, 0x11, 0x00,
+ 0x1f, 0x25, 0x30, 0x0f,
+ 0xf0, 0x8c, 0xdd, 0x0e, 0x2c, 0xfd, 0x0f, 0x12, 0xf0, 0xe0, 0x47, 0x23,
+ 0x98, 0xea, 0x01, 0x11,
+ 0x30, 0x21, 0xc0, 0xbe, 0x10, 0x20, 0x1e, 0xf0, 0xde, 0xcf, 0x01, 0x22,
+ 0x00, 0x72, 0x02, 0xfd,
+ 0xfe, 0x33, 0x00, 0xca, 0x13, 0x27, 0xc3, 0xff, 0x0f, 0xfe, 0x8f, 0xd0,
+ 0xe0, 0x00, 0x15, 0x03,
+ 0xaa, 0xfe, 0x10, 0x1f, 0x30, 0x24, 0xf0, 0xce, 0xc9, 0x00, 0x23, 0x10,
+ 0x00, 0x0d, 0xf0, 0xdf,
+ 0xbe, 0xee, 0x23, 0x36, 0xef, 0x0e, 0x41, 0x21, 0x20, 0x72, 0x33, 0x2e,
+ 0x0a, 0x01, 0x10, 0x71,
+ 0x31, 0xf9, 0x00, 0x32, 0x01, 0x9d, 0x0e, 0x02, 0xf0, 0x0e, 0xf1, 0xc3,
+ 0xf1, 0x04, 0x04, 0xe0,
+ 0xdc, 0xdf, 0xf2, 0x02, 0xd3, 0x06, 0x32, 0x3e, 0x0d, 0xe1, 0xc3, 0xf3,
+ 0x47, 0x50, 0x20, 0x55,
+ 0x14, 0xcc, 0x0f, 0x53, 0x37, 0x0f, 0xad, 0x00, 0x34, 0x11, 0xef, 0x00,
+ 0x10, 0x00, 0xdd, 0x0f,
+ 0x00, 0x20, 0x03, 0xdc, 0xbd, 0x00, 0x32, 0x01, 0xcd, 0xfb, 0x01, 0x55,
+ 0x00, 0xee, 0xbb, 0x20,
+ 0x76, 0x00, 0xde, 0x0f, 0xf0, 0x00, 0x01, 0x10, 0x10, 0x11, 0xdd, 0xde,
+ 0x00, 0x66, 0x00, 0xb9,
+ 0x00, 0x00, 0x32, 0x20, 0x0e, 0xcb, 0x00, 0x32, 0xe0, 0xce, 0xf0, 0x01,
+ 0x53, 0x00, 0x00, 0x00,
+ 0xee, 0x44, 0x10, 0xb8, 0xfe, 0x12, 0x01, 0xc0, 0xfe, 0x11, 0x01, 0x9d,
+ 0xff, 0x02, 0xe0, 0xf1,
+ 0x17, 0x13, 0xba, 0xef, 0x0f, 0x73, 0x35, 0xff, 0xed, 0x11, 0x53, 0x12,
+ 0x0e, 0x20, 0x10, 0xe0,
+ 0x00, 0x12, 0x46, 0x12, 0xfe, 0xed, 0x0e, 0x10, 0x31, 0x54, 0x32, 0xca,
+ 0x1e, 0x72, 0x20, 0xe1,
+ 0x01, 0xed, 0x0b, 0x23, 0x04, 0xe0, 0xce, 0x03, 0x26, 0x00, 0xbe, 0xdf,
+ 0xde, 0x23, 0x74, 0x30,
+ 0x00, 0xcf, 0xec, 0x02, 0x64, 0x00, 0x0f, 0x00, 0x0b, 0xf0, 0x06, 0x02,
+ 0x9d, 0xfe, 0x25, 0x33,
+ 0xed, 0xcb, 0x11, 0x34, 0x33, 0x30, 0xef, 0xed, 0x42, 0x23, 0x32, 0x20,
+ 0x0d, 0x01, 0xef, 0x0c,
+ 0xfc, 0x9a, 0x00, 0x00, 0x10, 0xfd, 0xdb, 0x00, 0x64, 0xf0, 0xee, 0x72,
+ 0x12, 0x0f, 0xf2, 0x06,
+ 0x10, 0xfd, 0xef, 0x30, 0x62, 0x01, 0x00, 0xed, 0x02, 0x62, 0x0a, 0xcb,
+ 0x00, 0x24, 0x01, 0xd0,
+ 0xff, 0xfe, 0xbf, 0xef, 0x11, 0x00, 0xc9, 0xd0, 0xfe, 0xcf, 0x00, 0x23,
+ 0x03, 0x2f, 0x10, 0x37,
+ 0x43, 0x22, 0xde, 0xdd, 0x0f, 0x72, 0x04, 0xc0, 0xed, 0xee, 0xec, 0x22,
+ 0x77, 0x00, 0xdd, 0xdc,
+ 0xd0, 0x34, 0x20, 0x10, 0x2e, 0x00, 0x33, 0x01, 0xbd, 0x32, 0x65, 0xec,
+ 0xdc, 0x00, 0x01, 0x11,
+ 0xf0, 0x02, 0x44, 0xce, 0xaa, 0x00, 0x02, 0x30, 0x10, 0x2d, 0x4f, 0x20,
+ 0x0e, 0x1e, 0x3e, 0x5d,
+ 0x3d, 0x29, 0x0f, 0x00, 0xfe, 0x21, 0x77, 0x23, 0x8a, 0x00, 0x02, 0x01,
+ 0x11, 0xef, 0xef, 0x00,
+ 0x36, 0x10, 0xed, 0xdd, 0x01, 0x22, 0x10, 0x21, 0xe0, 0x8c, 0x02, 0x16,
+ 0x10, 0xdc, 0xd0, 0x00,
+ 0xf2, 0xff, 0x30, 0x75, 0xc0, 0xef, 0xf0, 0x00, 0x01, 0xd0, 0xf1, 0x04,
+ 0xbd, 0xdc, 0x32, 0x62,
+ 0xfd, 0xd9, 0x0f, 0x51, 0x01, 0x0f, 0x1f, 0x42, 0x27, 0xd0, 0xc0, 0x31,
+ 0x45, 0x0f, 0xad, 0x00,
+ 0x14, 0x12, 0x00, 0x0f, 0x1e, 0x00, 0xeb, 0xef, 0x00, 0x22, 0x25, 0x50,
+ 0xdd, 0xce, 0x11, 0x66,
+ 0x11, 0xef, 0xcc, 0x10, 0x10, 0xf0, 0x0f, 0x4d, 0x2d, 0x30, 0xc0, 0x98,
+ 0x0e, 0x33, 0x24, 0x00,
+ 0x0f, 0x10, 0x42, 0x00, 0x00, 0xde, 0x0f, 0x14, 0xf0, 0x8c, 0xbf, 0x01,
+ 0x23, 0x01, 0xf0, 0xcc,
+ 0xf0, 0xdf, 0x02, 0xf7, 0xf1, 0x0f, 0x0d, 0xee, 0x12, 0x46, 0x31, 0x0e,
+ 0xda, 0xee, 0x00, 0x01,
+ 0xe2, 0x50, 0x5d, 0x20, 0xec, 0xad, 0x02, 0x17, 0x03, 0x1c, 0x2e, 0x20,
+ 0x21, 0x50, 0x00, 0x0e,
+ 0x1c, 0x71, 0x23, 0x10, 0xfc, 0x00, 0x01, 0xf1, 0x02, 0xf0, 0xb0, 0xff,
+ 0xef, 0xe6, 0x17, 0xf1,
+ 0x8e, 0xdd, 0x0f, 0x10, 0x27, 0x21, 0xe0, 0xee, 0x01, 0x22, 0x00, 0x00,
+ 0x11, 0x32, 0x40, 0x0c,
+ 0x3f, 0x52, 0x13, 0x00, 0x12, 0x55, 0x1f, 0x0c, 0x10, 0x00, 0x07, 0x45,
+ 0x00, 0xfd, 0x01, 0x02,
+ 0x00, 0xcc, 0x20, 0x22, 0x80, 0xfd, 0x20, 0x72, 0x0f, 0xfb, 0xf0, 0x16,
+ 0x42, 0xf0, 0xee, 0x00,
+ 0x23, 0x35, 0xe0, 0xcf, 0x20, 0x0d, 0xdd, 0xed, 0xdf, 0x30, 0x35, 0xcd,
+ 0xb8, 0xff, 0x40, 0x74,
+ 0x20, 0xde, 0xfe, 0x00, 0x34, 0x21, 0xce, 0xdc, 0x02, 0x03, 0xec, 0x9d,
+ 0xef, 0x00, 0xef, 0x03,
+ 0x57, 0x00, 0x20, 0x0e, 0x00, 0x10, 0x20, 0x15, 0xf0, 0xae, 0x0f, 0x01,
+ 0xe0, 0xcd, 0x00, 0x03,
+ 0xec, 0xf0, 0xd0, 0xc0, 0x12, 0x40, 0x00, 0x00, 0x1f, 0x3f, 0x72, 0x67,
+ 0x17, 0x12, 0xed, 0xfd,
+ 0xf0, 0x03, 0x35, 0x1f, 0x0d, 0x00, 0x03, 0xb0, 0x00, 0x33, 0x30, 0x0e,
+ 0x41, 0x36, 0xef, 0x8b,
+ 0x00, 0x10, 0x20, 0x2f, 0x12, 0xd0, 0x8d, 0x0f, 0x15, 0x22, 0xfe, 0xfe,
+ 0x0e, 0x0e, 0x14, 0x77,
+ 0x00, 0xeb, 0x00, 0x0e, 0xc0, 0x01, 0x15, 0x0f, 0xdd, 0xde, 0xc0, 0xf0,
+ 0x36, 0x72, 0x0f, 0xbb,
+ 0x11, 0x32, 0x01, 0x00, 0x02, 0xf1, 0x01, 0xef, 0x10, 0x14, 0xfe, 0x00,
+ 0x73, 0x35, 0xfe, 0xc9,
+ 0x00, 0x50, 0x20, 0x00, 0xf0, 0x0f, 0x0d, 0xff, 0xff, 0xf0, 0xc0, 0x11,
+ 0x53, 0x0f, 0xcc, 0x23,
+ 0x57, 0x14, 0x0f, 0x1f, 0x0f, 0x2d, 0x1f, 0x43, 0xf4, 0x8d, 0x0f, 0xee,
+ 0xfc, 0xe1, 0x03, 0x10,
+ 0x0f, 0x0c, 0xbf, 0xff, 0x0d, 0x0b, 0x00, 0xf0, 0x0e, 0x0d, 0xc0, 0xed,
+ 0xbc, 0x06, 0x44, 0xff,
+ 0xbc, 0x12, 0x57, 0x11, 0x0e, 0xdd, 0x01, 0x31, 0x11, 0xff, 0xed, 0xf0,
+ 0x00, 0xcd, 0xd0, 0xf2,
+ 0x01, 0xcd, 0x88, 0xe0, 0x37, 0x01, 0xee, 0xdf, 0xf0, 0x02, 0x1f, 0x63,
+ 0x03, 0x1d, 0x0e, 0x02,
+ 0x00, 0xdc, 0x33, 0x47, 0x32, 0x0f, 0xfc, 0x10, 0x50, 0x40, 0x0f, 0x1c,
+ 0x61, 0x12, 0x1c, 0x0c,
+ 0x2d, 0x20, 0x45, 0x00, 0x0e, 0x0e, 0xe1, 0x01, 0xe0, 0x67, 0x22, 0xe0,
+ 0xdf, 0x22, 0x32, 0xf0,
+ 0xe2, 0x74, 0x10, 0x1f, 0xfc, 0xf1, 0xd0, 0xc0, 0x36, 0x40, 0xcb, 0xcf,
+ 0x00, 0x35, 0x22, 0x33,
+ 0xbc, 0xdd, 0x0f, 0x62, 0x05, 0xe0, 0xef, 0x01, 0x00, 0xee, 0xe2, 0xc0,
+ 0xed, 0x2d, 0x10, 0xbd,
+ 0x01, 0x77, 0x00, 0xed, 0x22, 0x57, 0x01, 0xdd, 0xec, 0x12, 0x44, 0x03,
+ 0xee, 0xec, 0x10, 0x23,
+ 0x0f, 0xef, 0x50, 0x32, 0xdc, 0xde, 0x01, 0x36, 0x61, 0xfe, 0xca, 0xf0,
+ 0x01, 0x01, 0xef, 0xdd,
+ 0x32, 0x22, 0x0d, 0x1c, 0x60, 0x22, 0xee, 0xbc, 0x1e, 0x00, 0x21, 0x20,
+ 0xdb, 0x9b, 0x00, 0x56,
+ 0x01, 0x0e, 0xef, 0x00, 0x20, 0x35, 0x31, 0x0f, 0xbf, 0xff, 0xdf, 0x02,
+ 0xf1, 0xbf, 0x00, 0xe4,
+ 0xff, 0xdc, 0xff, 0xe0, 0xb1, 0xf1, 0x02, 0x0d, 0xba, 0x12, 0x77, 0x10,
+ 0x0f, 0xee, 0x01, 0xe0,
+ 0xee, 0x0f, 0x0e, 0xc0, 0x01, 0xf2, 0x88, 0xef, 0x23, 0x21, 0x0b, 0xef,
+ 0x53, 0x33, 0x0d, 0x1c,
+ 0x53, 0x21, 0x00, 0x21, 0xff, 0xfb, 0x00, 0x01, 0xfd, 0x01, 0x45, 0xef,
+ 0xac, 0x00, 0x0f, 0x33,
+ 0x02, 0xed, 0xb2, 0x05, 0x02, 0xff, 0xee, 0x01, 0x13, 0xbf, 0xd0, 0xee,
+ 0x33, 0x77, 0x03, 0xfa,
+ 0x00, 0x61, 0x00, 0x11, 0x14, 0x02, 0x00, 0xf0, 0x13, 0x36, 0x00, 0xc0,
+ 0xd0, 0x04, 0x0f, 0x0d,
+ 0x2f, 0x51, 0x00, 0xfa, 0x50, 0x1f, 0xdd, 0x00, 0x23, 0x00, 0xce, 0xac,
+ 0xf0, 0x27, 0x67, 0xef,
+ 0xbc, 0x00, 0x35, 0x00, 0xff, 0xe0, 0xff, 0x0f, 0x0f, 0x10, 0x00, 0x00,
+ 0xe0, 0x0f, 0xfe, 0xd0,
+ 0xd0, 0xff, 0x74, 0x23, 0xdd, 0xef, 0x43, 0x21, 0x30, 0x0e, 0x0b, 0x00,
+ 0xcc, 0xca, 0x00, 0x00,
+ 0x11, 0x72, 0x10, 0xfa, 0x00, 0x44, 0x10, 0x00, 0x40, 0x21, 0x8c, 0xeb,
+ 0x01, 0x02, 0x00, 0xf0,
+ 0xee, 0xcc, 0xcd, 0x03, 0x35, 0xfe, 0xdd, 0xe1, 0x03, 0x11, 0x54, 0x53,
+ 0x00, 0xfc, 0x0f, 0x22,
+ 0x25, 0x00, 0x00, 0x61, 0x12, 0x1f, 0xfe, 0xe0, 0x01, 0x01, 0x12, 0x65,
+ 0x01, 0x10, 0x2d, 0x08,
+ 0x30, 0x76, 0x10, 0xde, 0xdd, 0x00, 0x26, 0x10, 0x00, 0x10, 0x20, 0xf0,
+ 0x90, 0x01, 0x00, 0x23,
+ 0x1f, 0xcb, 0x0e, 0x11, 0x55, 0x00, 0xec, 0x0e, 0x00, 0x42, 0x03, 0xf0,
+ 0xbc, 0xf0, 0x04, 0x22,
+ 0x00, 0xa0, 0x00, 0x15, 0x35, 0x00, 0x0e, 0xce, 0x00, 0x72, 0x23, 0x42,
+ 0x00, 0xcd, 0x00, 0x42,
+ 0x1f, 0x0e, 0xc8, 0x0f, 0x00, 0x26, 0x1f, 0xed, 0xd0, 0xcf, 0x10, 0x00,
+ 0x0f, 0x00, 0x30, 0x42,
+ 0x02, 0x34, 0x76, 0x30, 0x10, 0x13, 0xf0, 0xdb, 0x30, 0x42, 0xff, 0xed,
+ 0xcf, 0xfd, 0x72, 0x00,
+ 0xc8, 0xb9, 0x12, 0x33, 0xfd, 0xdf, 0xff, 0xf0, 0x02, 0x02, 0xbe, 0xdd,
+ 0x01, 0x01, 0xad, 0x01,
+ 0x27, 0x00, 0xde, 0xf0, 0x05, 0x41, 0x32, 0x0f, 0x9a, 0x11, 0x44, 0x0f,
+ 0xcd, 0x00, 0x21, 0x02,
+ 0xff, 0xfc, 0xf0, 0x00, 0xdd, 0xff, 0x23, 0x02, 0xd0, 0xdd, 0xff, 0xf0,
+ 0x57, 0x37, 0xbe, 0xcf,
+ 0x21, 0x46, 0xff, 0xdd, 0xe0, 0x00, 0x11, 0x34, 0xde, 0xdb, 0x50, 0x62,
+ 0x01, 0x2f, 0x0e, 0xfe,
+ 0xed, 0x21, 0x72, 0x53, 0x00, 0xfa, 0xee, 0x00, 0x12, 0x20, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x78, 0x22, 0xf3, 0x32, 0x04, 0x21, 0xc7, 0x33, 0x12, 0xd2, 0xb0, 0xdc,
+ 0x0f, 0x77, 0x01, 0xdc,
+ 0x0f, 0x24, 0x62, 0xfd, 0xfa, 0x00, 0x00, 0x11, 0x02, 0xcd, 0xef, 0xe1,
+ 0xe4, 0x35, 0x73, 0xdf,
+ 0xbc, 0x00, 0xf1, 0x00, 0xd0, 0xcd, 0xfc, 0xf0, 0x25, 0x32, 0x0f, 0x0c,
+ 0x30, 0x11, 0x01, 0x12,
+ 0x00, 0x46, 0x0e, 0xbb, 0x11, 0x32, 0x34, 0xf0, 0x8e, 0xfb, 0x22, 0x00,
+ 0xf1, 0xf0, 0x44, 0x52,
+ 0x00, 0xff, 0xde, 0x00, 0x33, 0x67, 0x0f, 0xdd, 0xf0, 0xf0, 0x00, 0x31,
+ 0xdd, 0xac, 0x0f, 0x00,
+ 0x04, 0xe0, 0x41, 0x45, 0xfe, 0xdc, 0x0f, 0x1f, 0x2f, 0x1d, 0x73, 0x45,
+ 0x0e, 0x08, 0x0f, 0x0f,
+ 0x42, 0x12, 0x21, 0x41, 0x00, 0x00, 0xc1, 0xe0, 0xdf, 0xcc, 0xce, 0xff,
+ 0xe0, 0xc0, 0xd2, 0xec,
+ 0xde, 0xcc, 0xab, 0x03, 0xf4, 0x11, 0x42, 0xf0, 0xbb, 0x16, 0x12, 0x10,
+ 0x00, 0xde, 0xec, 0xcf,
+ 0x0f, 0x02, 0xe1, 0xaa, 0x0f, 0x10, 0x51, 0x32, 0x3e, 0x0b, 0x13, 0x42,
+ 0x10, 0x1c, 0x0f, 0x70,
+ 0x24, 0x0d, 0xed, 0x00, 0x10, 0xe8, 0xce, 0x00, 0x14, 0x11, 0xd0, 0xbd,
+ 0xef, 0x22, 0x36, 0xd0,
+ 0xaf, 0x01, 0x02, 0xfe, 0x00, 0x3f, 0x00, 0xe1, 0x00, 0xcb, 0x20, 0x75,
+ 0x30, 0xfe, 0x17, 0x42,
+ 0xf0, 0x0e, 0x31, 0xf2, 0xd1, 0xf2, 0x8c, 0xf0, 0x24, 0x20, 0xee, 0x30,
+ 0x73, 0x1e, 0xe8, 0xf0,
+ 0x11, 0x64, 0x10, 0xfe, 0xef, 0x00, 0x15, 0x12, 0x00, 0xdf, 0xee, 0x11,
+ 0x23, 0xd0, 0xdf, 0xe1,
+ 0x00, 0x2e, 0x1e, 0x10, 0x57, 0x10, 0xfb, 0x10, 0x3e, 0x61, 0xff, 0xdb,
+ 0xe0, 0x10, 0x02, 0x00,
+ 0xbb, 0xde, 0x10, 0x44, 0xe0, 0xf0, 0x20, 0x0f, 0xff, 0xce, 0x0f, 0x75,
+ 0x02, 0x0e, 0xea, 0xdf,
+ 0x10, 0x52, 0x13, 0x20, 0x20, 0xff, 0xee, 0x42, 0xf3, 0x99, 0xee, 0x01,
+ 0xf2, 0xce, 0xce, 0x01,
+ 0x00, 0xd0, 0xd8, 0xd0, 0xee, 0xf0, 0x43, 0x74, 0x2e, 0x30, 0x35, 0x00,
+ 0xe1, 0x76, 0x20, 0xf0,
+ 0xff, 0xdf, 0x01, 0x16, 0xdf, 0xdf, 0xe0, 0x00, 0x41, 0xff, 0xff, 0x00,
+ 0x41, 0x53, 0x31, 0x30,
+ 0x0f, 0xf4, 0xe4, 0x0f, 0x23, 0x32, 0xcc, 0xa8, 0xff, 0x00, 0x02, 0x00,
+ 0x0e, 0x2e, 0x2e, 0x20,
+ 0xff, 0xfd, 0x10, 0x09, 0x20, 0x20, 0xde, 0x00, 0x61, 0x02, 0xac, 0xed,
+ 0x00, 0x37, 0x47, 0xe0,
+ 0xc0, 0x00, 0x12, 0x11, 0x00, 0x10, 0xf0, 0x00, 0x12, 0x64, 0x11, 0x01,
+ 0x0c, 0xcb, 0x33, 0x53,
+ 0xec, 0xfb, 0x00, 0x20, 0x52, 0x01, 0xdd, 0xee, 0x00, 0x72, 0x20, 0xea,
+ 0x01, 0x04, 0xfe, 0x0f,
+ 0x44, 0x12, 0x00, 0xf0, 0x13, 0x20, 0x12, 0xed, 0xeb, 0x1e, 0x0c, 0xce,
+ 0xf1, 0xf0, 0xa8, 0xf0,
+ 0x00, 0x22, 0xe0, 0xcd, 0xc0, 0xc1, 0x03, 0x26, 0xff, 0x8c, 0xff, 0x01,
+ 0x30, 0xf0, 0xe1, 0x0f,
+ 0xda, 0xff, 0x20, 0x76, 0x41, 0xef, 0xfc, 0x00, 0x00, 0x20, 0x22, 0x02,
+ 0x8c, 0xff, 0x0f, 0x0d,
+ 0xc0, 0x00, 0xeb, 0xdc, 0x11, 0x27, 0xef, 0xef, 0x01, 0x63, 0x22, 0x30,
+ 0xf3, 0xd0, 0xf0, 0x24,
+ 0x42, 0xf0, 0xde, 0xcb, 0xcc, 0x00, 0x63, 0x23, 0x0d, 0x09, 0x00, 0x4f,
+ 0x42, 0x10, 0x0c, 0x00,
+ 0x30, 0x31, 0x05, 0x00, 0xfd, 0x20, 0x03, 0xed, 0xbb, 0xf0, 0xf0, 0x42,
+ 0x20, 0x0f, 0x62, 0x12,
+ 0x00, 0x11, 0x27, 0x02, 0x12, 0x00, 0x0c, 0xf0, 0x51, 0x47, 0xf2, 0xbd,
+ 0x0f, 0x11, 0x01, 0xd0,
+ 0x14, 0x11, 0xdd, 0xdd, 0x53, 0x27, 0xcf, 0xac, 0xf0, 0xf3, 0x00, 0xed,
+ 0xfd, 0x0f, 0x63, 0x17,
+ 0x00, 0xdd, 0xed, 0x0f, 0x20, 0x41, 0x03, 0x25, 0x33, 0xee, 0x8a, 0x00,
+ 0x23, 0x12, 0xdd, 0xbc,
+ 0x03, 0x35, 0x42, 0xff, 0xdb, 0x00, 0x31, 0x42, 0x10, 0x20, 0x10, 0xed,
+ 0xce, 0x21, 0x11, 0xad,
+ 0xe9, 0xe0, 0x0e, 0x10, 0x12, 0x04, 0xcf, 0xfb, 0x00, 0x7f, 0x2f, 0xf0,
+ 0xfe, 0x32, 0x32, 0x0f,
+ 0x00, 0xe0, 0xc9, 0x10, 0x11, 0x33, 0x21, 0x20, 0xfd, 0xff, 0x23, 0x07,
+ 0x12, 0xad, 0xef, 0x01,
+ 0x01, 0xa0, 0x00, 0xe3, 0xe0, 0xfd, 0xf0, 0xf2, 0xdd, 0xb8, 0x11, 0x12,
+ 0xc0, 0x04, 0x10, 0xb8,
+ 0xe0, 0xe0, 0x02, 0xe0, 0x8b, 0xd0, 0x10, 0x20, 0x13, 0x20, 0xfa, 0x20,
+ 0x62, 0x0f, 0xfe, 0x40,
+ 0x30, 0x12, 0x1f, 0x3f, 0x30, 0x20, 0x66, 0x00, 0xab, 0x00, 0xf0, 0x11,
+ 0x02, 0xef, 0x00, 0x03,
+ 0xff, 0xec, 0x0e, 0xe0, 0x13, 0x73, 0x1f, 0x3e, 0x00, 0xee, 0x05, 0x31,
+ 0x00, 0xf1, 0x06, 0x34,
+ 0xd3, 0xb0, 0xe1, 0x00, 0x00, 0x20, 0x24, 0xdf, 0x9b, 0x00, 0x36, 0x2f,
+ 0xeb, 0x01, 0x73, 0x20,
+ 0x0f, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0xc3, 0x02, 0x1f, 0x30, 0x06, 0x9c,
+ 0xed, 0xff, 0x13, 0x26,
+ 0x00, 0xdf, 0xdf, 0xee, 0x02, 0x57, 0x00, 0xbe, 0x0e, 0x10, 0x10, 0x2e,
+ 0x0f, 0x0e, 0x0d, 0x3d,
+ 0x0f, 0xac, 0xec, 0x22, 0x57, 0x06, 0xff, 0xee, 0xce, 0x00, 0x24, 0x10,
+ 0xff, 0x0f, 0x0f, 0x10,
+ 0x3f, 0x70, 0x5f, 0x0d, 0xf0, 0x13, 0x2f, 0xf8, 0x12, 0x64, 0x00, 0xba,
+ 0xf0, 0x00, 0xdf, 0x0e,
+ 0xce, 0xfe, 0xf0, 0x00, 0xf0, 0x0f, 0xfc, 0x00, 0x35, 0x23, 0x24, 0x44,
+ 0xe0, 0xde, 0xe0, 0x10,
+ 0x77, 0x51, 0xe0, 0xff, 0x0f, 0x10, 0x32, 0x0f, 0x0d, 0xff, 0x30, 0x77,
+ 0x44, 0xee, 0xdf, 0x21,
+ 0x02, 0xf0, 0x26, 0x41, 0xbe, 0xeb, 0x21, 0x43, 0x00, 0xef, 0xfd, 0x10,
+ 0x31, 0x10, 0x0c, 0x11,
+ 0x63, 0xef, 0xfc, 0x01, 0xe0, 0xfe, 0x22, 0x53, 0x0f, 0xbb, 0x11, 0x00,
+ 0x00, 0x0e, 0x47, 0x04,
+ 0xf0, 0x00, 0x03, 0x0f, 0x20, 0x35, 0x33, 0xd0, 0xaf, 0xfd, 0x00, 0x24,
+ 0x34, 0xef, 0x88, 0x00,
+ 0x10, 0x21, 0x00, 0x0d, 0xef, 0xf0, 0x32, 0x43, 0x2f, 0x1f, 0x77, 0x00,
+ 0x0d, 0xdf, 0x24, 0x44,
+ 0xfe, 0x10, 0x65, 0xfe, 0xfe, 0x01, 0x24, 0x44, 0x10, 0x3e, 0x0d, 0xae,
+ 0x0f, 0x10, 0x20, 0x0f,
+ 0xfc, 0xed, 0xdc, 0xbd, 0xf0, 0x07, 0x00, 0x8b, 0xe0, 0xf3, 0xe0, 0xce,
+ 0x02, 0x12, 0xfe, 0xdf,
+ 0x00, 0x01, 0x3e, 0x30, 0x33, 0xf0, 0x0c, 0x00, 0x1f, 0x33, 0x15, 0x00,
+ 0x0e, 0xc9, 0xe0, 0x00,
+ 0x01, 0xfe, 0xbc, 0xfe, 0xdb, 0x01, 0x15, 0xef, 0xff, 0x61, 0x17, 0xf0,
+ 0xb0, 0x00, 0x21, 0x12,
+ 0x03, 0xde, 0xac, 0x01, 0x54, 0x0f, 0xe9, 0xf0, 0x30, 0x40, 0x00, 0xfe,
+ 0xe1, 0x21, 0x51, 0x0f,
+ 0xee, 0xee, 0x02, 0x23, 0x20, 0x08, 0xde, 0xff, 0x41, 0x20, 0x41, 0x1f,
+ 0x0c, 0xbd, 0xfe, 0x57,
+ 0x22, 0xfe, 0x00, 0x41, 0xe0, 0xf0, 0x52, 0x36, 0xf0, 0x9b, 0x00, 0x11,
+ 0x11, 0x13, 0x0f, 0xcf,
+ 0xed, 0xe0, 0x04, 0x54, 0xef, 0xbb, 0x00, 0x22, 0x01, 0xce, 0xfe, 0x00,
+ 0x00, 0xd0, 0x20, 0x40,
+ 0xfd, 0xde, 0x00, 0xe0, 0x15, 0x23, 0xec, 0x89, 0x00, 0x13, 0x56, 0x00,
+ 0xcd, 0x00, 0x31, 0x23,
+ 0x10, 0x0f, 0xf0, 0x14, 0x51, 0x00, 0xe0, 0x16, 0x30, 0xe0, 0xd0, 0x20,
+ 0x14, 0x9e, 0xba, 0x00,
+ 0x00, 0x00, 0x42, 0xfd, 0xdb, 0x00, 0x53, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x53, 0x0f, 0xeb, 0x0f,
+ 0x21, 0x41, 0x0c, 0xeb, 0xff, 0x40, 0x32, 0x20, 0x0c, 0xe0, 0xe0, 0x00,
+ 0x46, 0x11, 0x01, 0xc0,
+ 0xfe, 0xd1, 0xbf, 0xca, 0xe0, 0x0f, 0xae, 0xbb, 0x0f, 0x02, 0x06, 0x01,
+ 0xd0, 0xee, 0xd0, 0x00,
+ 0x25, 0x00, 0xb0, 0xf2, 0x01, 0x0f, 0x0b, 0xde, 0x0f, 0x7f, 0x30, 0x30,
+ 0x22, 0x0c, 0x0c, 0x5e,
+ 0x43, 0x24, 0xef, 0xdd, 0x20, 0x41, 0x10, 0x21, 0x13, 0xab, 0xed, 0xff,
+ 0xef, 0x0c, 0x1c, 0x0e,
+ 0xde, 0xf0, 0x67, 0x34, 0xeb, 0x0f, 0x20, 0x62, 0x14, 0xdf, 0xde, 0x23,
+ 0x64, 0x11, 0xe0, 0xde,
+ 0xf0, 0x03, 0x12, 0x47, 0x22, 0xbd, 0xed, 0x01, 0x43, 0x24, 0x10, 0x1c,
+ 0x0e, 0xbe, 0x03, 0x77,
+ 0x03, 0x0c, 0xdf, 0x2f, 0x21, 0x13, 0xf0, 0xe1, 0xf2, 0x12, 0x02, 0x13,
+ 0x55, 0x01, 0xfe, 0xef,
+ 0x01, 0xf0, 0x24, 0x44, 0xfc, 0xad, 0x10, 0x56, 0x01, 0x00, 0xfd, 0xeb,
+ 0x10, 0x32, 0x22, 0x0f,
+ 0xdb, 0xee, 0x30, 0x10, 0xed, 0x8b, 0xef, 0x00, 0x05, 0x10, 0x0d, 0xef,
+ 0xf0, 0xff, 0x00, 0x76,
+ 0x10, 0x11, 0x2f, 0x3f, 0x22, 0xd1, 0xd0, 0x1c, 0x1f, 0x0e, 0x0f, 0xbd,
+ 0x0c, 0xe1, 0x17, 0x01,
+ 0xfe, 0x0d, 0xd0, 0x25, 0x00, 0xbe, 0xef, 0xf0, 0x01, 0x0f, 0xdd, 0x02,
+ 0x07, 0x73, 0x02, 0xdd,
+ 0xdb, 0x02, 0x52, 0x33, 0x22, 0x0f, 0xba, 0x00, 0x10, 0x10, 0x10, 0x01,
+ 0xc3, 0x01, 0x0f, 0xd0,
+ 0x06, 0x01, 0xd1, 0xe0, 0x02, 0x76, 0x00, 0xeb, 0x12, 0x64, 0x00, 0x0d,
+ 0xac, 0x0f, 0x24, 0x20,
+ 0x0d, 0xef, 0xf0, 0x0f, 0x1d, 0x20, 0x31, 0x0d, 0xde, 0x34, 0x22, 0x1a,
+ 0x4e, 0x1f, 0x00, 0xf2,
+ 0x9e, 0xf0, 0x07, 0xf4, 0x11, 0x43, 0x00, 0xdf, 0x01, 0x11, 0xef, 0x0e,
+ 0x35, 0x22, 0x00, 0x1f,
+ 0x10, 0xdc, 0xcb, 0x30, 0x50, 0x0b, 0xf0, 0xf2, 0x00, 0x4d, 0x2f, 0x37,
+ 0xf2, 0xbf, 0x1f, 0x53,
+ 0x26, 0xde, 0xfd, 0x01, 0x54, 0x11, 0x0e, 0x0e, 0x43, 0x43, 0x0f, 0x10,
+ 0x04, 0xed, 0xdc, 0x11,
+ 0x30, 0xe8, 0xbc, 0x01, 0xd0, 0xc0, 0xad, 0xf0, 0xff, 0xcd, 0x01, 0xf7,
+ 0x05, 0xe0, 0xcc, 0xe0,
+ 0x01, 0x22, 0x50, 0x1f, 0x00, 0xb0, 0x0e, 0x1d, 0x0e, 0x0e, 0x0c, 0x2f,
+ 0x0c, 0x32, 0x77, 0x0f,
+ 0xba, 0x00, 0x00, 0x33, 0xe0, 0xbe, 0xfe, 0xf0, 0x25, 0x00, 0xae, 0xf0,
+ 0xf0, 0xf4, 0x01, 0x00,
+ 0x00, 0x14, 0x12, 0x00, 0xed, 0x54, 0x34, 0x0c, 0xdd, 0x2f, 0x74, 0x23,
+ 0x00, 0xf9, 0xde, 0x10,
+ 0x31, 0x23, 0x20, 0xef, 0xfd, 0x41, 0x30, 0xff, 0x0c, 0x51, 0x35, 0x20,
+ 0xfd, 0x10, 0x20, 0x0e,
+ 0x20, 0x21, 0x54, 0x10, 0x0b, 0x12, 0x41, 0x12, 0x76, 0x44, 0xf0, 0xed,
+ 0xff, 0x01, 0x46, 0xe0,
+ 0xc0, 0x02, 0xe0, 0xd0, 0xcd, 0x00, 0x42, 0x04, 0xdf, 0xfe, 0xeb, 0xff,
+ 0x22, 0x42, 0xfd, 0xde,
+ 0xf0, 0xd1, 0xcc, 0xfc, 0x20, 0x41, 0xf1, 0xbf, 0xfd, 0xde, 0xec, 0x0f,
+ 0x55, 0x22, 0xfc, 0x12,
+ 0x77, 0x24, 0x0e, 0x30, 0x02, 0xdf, 0xe0, 0x14, 0x41, 0xff, 0xef, 0xf1,
+ 0xcf, 0xfe, 0x32, 0x00,
+ 0xd8, 0x0d, 0x20, 0x70, 0x22, 0xfd, 0xbd, 0x00, 0x24, 0x10, 0xe9, 0xcf,
+ 0xe0, 0xf1, 0x01, 0x74,
+ 0x0e, 0xf8, 0x00, 0x20, 0x52, 0x00, 0x0c, 0x22, 0x22, 0xff, 0xed, 0x02,
+ 0x01, 0x10, 0x00, 0x00,
+ 0xf2, 0x24, 0x11, 0x00, 0xef, 0x9c, 0x0e, 0xef, 0xe1, 0xe1, 0xe9, 0xa0,
+ 0xe1, 0xe2, 0xcf, 0xee,
+ 0xcf, 0xf4, 0xf5, 0x0d, 0xcd, 0xf0, 0x04, 0x04, 0x2e, 0x3a, 0x0e, 0xfd,
+ 0x00, 0x51, 0x30, 0x1c,
+ 0x40, 0x03, 0x22, 0x24, 0x21, 0x13, 0x00, 0xe9, 0xef, 0x00, 0x71, 0x33,
+ 0x0b, 0xec, 0x0f, 0x11,
+ 0x22, 0x0f, 0xab, 0xff, 0x10, 0x75, 0x21, 0xee, 0xec, 0x23, 0x43, 0xf0,
+ 0xf0, 0xff, 0xce, 0x12,
+ 0x47, 0x23, 0x00, 0xac, 0x00, 0xf0, 0x14, 0x35, 0xfe, 0xab, 0x00, 0x23,
+ 0x10, 0x01, 0x0f, 0xde,
+ 0x0f, 0x20, 0x40, 0x05, 0xf0, 0x0e, 0x43, 0xd0, 0x9e, 0xf0, 0xf2, 0x06,
+ 0x01, 0xef, 0xf0, 0x00,
+ 0x21, 0x01, 0x10, 0x2c, 0x60, 0x04, 0x11, 0x00, 0x0e, 0x12, 0x13, 0x13,
+ 0x24, 0x20, 0xca, 0xcc,
+ 0xf0, 0xff, 0xed, 0xdd, 0xf0, 0x20, 0x09, 0xcd, 0x0f, 0x00, 0xf0, 0x35,
+ 0xf1, 0x8d, 0xf0, 0x27,
+ 0x51, 0x00, 0x01, 0xff, 0x0e, 0x11, 0x74, 0x10, 0x1a, 0x0e, 0xef, 0x0e,
+ 0x20, 0x0e, 0xdd, 0x00,
+ 0x00, 0x01, 0xb0, 0x11, 0x26, 0xcd, 0xab, 0xf0, 0x00, 0xf2, 0xff, 0xd9,
+ 0xf0, 0x11, 0x42, 0x01,
+ 0xf0, 0xee, 0x13, 0x55, 0x0f, 0x11, 0x21, 0xff, 0x00, 0x44, 0x00, 0x02,
+ 0x23, 0x20, 0xca, 0xdf,
+ 0x55, 0x65, 0x00, 0xff, 0x01, 0xe0, 0xf0, 0x21, 0x41, 0x24, 0x00, 0x00,
+ 0x0d, 0x0c, 0xee, 0x2f,
+ 0x61, 0x0e, 0xd0, 0x00, 0xfc, 0x0e, 0x00, 0x25, 0x1f, 0xe9, 0xff, 0x10,
+ 0x74, 0x43, 0xfe, 0xdc,
+ 0x01, 0x33, 0x25, 0x0f, 0xdd, 0x00, 0x45, 0x02, 0xf1, 0xe2, 0xd0, 0xcb,
+ 0x00, 0x30, 0xe0, 0xf1,
+ 0x00, 0x41, 0x00, 0x30, 0x0b, 0x0e, 0xfe, 0x65, 0x13, 0xed, 0xcd, 0x23,
+ 0x14, 0x0f, 0xf0, 0x00,
+ 0x00, 0x77, 0x55, 0x00, 0xeb, 0xf1, 0x53, 0x33, 0x0f, 0xed, 0x00, 0x00,
+ 0x34, 0x20, 0x21, 0xed,
+ 0xbb, 0x00, 0x1f, 0x0e, 0x0c, 0x10, 0xf1, 0x80, 0xee, 0xfd, 0x00, 0x04,
+ 0xb0, 0xef, 0xe4, 0xe6,
+ 0xf0, 0xe0, 0xed, 0xdc, 0x00, 0x73, 0x02, 0x0f, 0x3d, 0x2f, 0x1c, 0x0c,
+ 0xed, 0xee, 0x0d, 0x77,
+ 0x35, 0xf0, 0xbb, 0xf0, 0x02, 0x22, 0x10, 0xde, 0xdf, 0x01, 0x00, 0xae,
+ 0xf0, 0xe0, 0x03, 0x20,
+ 0xff, 0x01, 0xf0, 0x37, 0x76, 0x00, 0xf0, 0x0e, 0x2f, 0x00, 0x00, 0x02,
+ 0x30, 0xfc, 0xcc, 0xde,
+ 0xf0, 0x01, 0x30, 0x50, 0xd0, 0xce, 0xff, 0x99, 0x01, 0x57, 0x00, 0x1f,
+ 0xee, 0x0e, 0x0f, 0x40,
+ 0x15, 0x1f, 0xec, 0xef, 0x30, 0x52, 0x0e, 0xf1, 0x03, 0xdd, 0x22, 0x77,
+ 0x15, 0xdd, 0xf0, 0x30,
+ 0x33, 0x0f, 0xce, 0xd0, 0x00, 0x13, 0x10, 0x1e, 0x00, 0xbf, 0xde, 0xdf,
+ 0x02, 0xef, 0xdd, 0xd1,
+ 0xae, 0xfe, 0x00, 0x11, 0xdb, 0xa9, 0x00, 0x20, 0x23, 0xf0, 0xed, 0x10,
+ 0x53, 0x13, 0x20, 0xcd,
+ 0xfb, 0x46, 0x42, 0x00, 0x01, 0x22, 0x23, 0x10, 0xe0, 0xee, 0xce, 0xd0,
+ 0x12, 0x37, 0x33, 0x22,
+ 0xd0, 0x0f, 0x31, 0xec, 0xba, 0x31, 0x44, 0x00, 0xfc, 0xbf, 0x00, 0x30,
+ 0xe0, 0xbd, 0xe0, 0x01,
+ 0x02, 0x14, 0x20, 0xcc, 0xec, 0x41, 0x77, 0x41, 0x0f, 0x0d, 0x00, 0x1e,
+ 0x1d, 0x30, 0x30, 0x1c,
+ 0x1a, 0x51, 0x44, 0xef, 0xcc, 0xe0, 0x05, 0xf1, 0xc0, 0xc0, 0xdd, 0xb0,
+ 0xe3, 0xe2, 0x9a, 0xfe,
+ 0xf1, 0xf0, 0xf0, 0xee, 0x05, 0x21, 0x0e, 0x0c, 0xf0, 0x10, 0x35, 0x21,
+ 0x0f, 0x1e, 0x3f, 0x40,
+ 0xfe, 0xd0, 0xc0, 0x24, 0x20, 0x0a, 0xf0, 0x20, 0x71, 0x12, 0x11, 0x0e,
+ 0x2c, 0x5d, 0xfb, 0x13,
+ 0x32, 0x1f, 0x2d, 0xff, 0xeb, 0xee, 0xdd, 0xff, 0x44, 0x03, 0xdf, 0xfd,
+ 0x14, 0x34, 0xde, 0xde,
+ 0x03, 0x47, 0x16, 0xff, 0xff, 0x41, 0xe1, 0xc0, 0x30, 0x41, 0xf0, 0xbd,
+ 0xed, 0x0f, 0x72, 0x47,
+ 0x04, 0xfe, 0xef, 0x10, 0x45, 0x01, 0xf0, 0xbd, 0x00, 0x05, 0x21, 0x00,
+ 0xef, 0x10, 0x21, 0x01,
+ 0xe0, 0x1f, 0x43, 0x47, 0x20, 0x11, 0x00, 0xd1, 0xe1, 0xd0, 0xff, 0x00,
+ 0xde, 0x0f, 0x63, 0xfa,
+ 0xcf, 0x20, 0x40, 0x08, 0xde, 0x10, 0x0f, 0xde, 0x30, 0x76, 0x20, 0xbb,
+ 0xef, 0x00, 0x03, 0xf0,
+ 0x00, 0x0f, 0xff, 0x31, 0x55, 0x0f, 0xed, 0x30, 0x73, 0x10, 0x21, 0x0e,
+ 0xdc, 0x0f, 0x01, 0x32,
+ 0xcb, 0xee, 0x00, 0x00, 0xf0, 0x02, 0x47, 0x05, 0x8b, 0xdf, 0x10, 0x42,
+ 0x00, 0xbf, 0xff, 0x00,
+ 0x01, 0x20, 0x0e, 0xf0, 0xfe, 0x14, 0x33, 0xfc, 0x0d, 0x67, 0x33, 0xef,
+ 0xbc, 0x00, 0x02, 0x02,
+ 0xe0, 0xee, 0xe1, 0x05, 0xe3, 0xcf, 0xac, 0x00, 0x27, 0x31, 0xf0, 0xdf,
+ 0x0f, 0x72, 0x11, 0x2f,
+ 0xff, 0xee, 0x2f, 0x30, 0x0f, 0x0d, 0xfa, 0xad, 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x41, 0xd9, 0xfd, 0xe3, 0x55, 0xd9, 0x2f, 0xe4, 0xfe, 0xd8, 0x0f, 0x74,
+ 0x33, 0xf0, 0xd0, 0x1d,
+ 0x51, 0x03, 0x00, 0xf1, 0x00, 0xed, 0x23, 0x77, 0x23, 0xea, 0xf0, 0x21,
+ 0x43, 0x02, 0xdc, 0xdd,
+ 0x01, 0x25, 0xef, 0x8a, 0x00, 0x01, 0x10, 0xe0, 0xee, 0x00, 0x01, 0x20,
+ 0x40, 0x30, 0x01, 0x56,
+ 0x63, 0x02, 0x1f, 0x0e, 0xe0, 0x11, 0x34, 0x33, 0xfd, 0xfd, 0x2f, 0x0a,
+ 0x00, 0x0e, 0x00, 0x20,
+ 0x54, 0x01, 0xbc, 0xdd, 0x04, 0x54, 0xf0, 0xde, 0xdf, 0xd0, 0xc1, 0xe1,
+ 0xd0, 0xe1, 0xe2, 0xbb,
+ 0xc9, 0xf0, 0x01, 0x62, 0x10, 0x0e, 0x2f, 0x11, 0x0f, 0x1c, 0x4f, 0xf9,
+ 0xde, 0x30, 0x31, 0xb0,
+ 0xbd, 0xfb, 0x12, 0x33, 0xfc, 0xce, 0xf0, 0xc2, 0xf3, 0xd0, 0xf1, 0xf3,
+ 0x9b, 0xdb, 0xf0, 0x25,
+ 0x31, 0x00, 0x00, 0x62, 0x00, 0x10, 0x02, 0x67, 0x01, 0xfd, 0x00, 0x23,
+ 0x00, 0xec, 0x00, 0xf0,
+ 0xff, 0xe0, 0xbb, 0x10, 0x32, 0x43, 0xe0, 0xec, 0x0f, 0x70, 0x40, 0x1c,
+ 0x0d, 0x30, 0x57, 0x03,
+ 0x0d, 0xdc, 0x10, 0x0e, 0x00, 0x24, 0xd0, 0xce, 0x00, 0x72, 0x03, 0x27,
+ 0x04, 0x11, 0x00, 0xf0,
+ 0x63, 0x27, 0x00, 0xcd, 0x00, 0x05, 0x00, 0xff, 0xee, 0x1f, 0x0e, 0xb0,
+ 0xe0, 0xce, 0xdc, 0x0f,
+ 0x76, 0x01, 0xdd, 0xcd, 0x00, 0x20, 0x02, 0x00, 0xfe, 0xeb, 0x02, 0x77,
+ 0xf0, 0xed, 0xfe, 0xff,
+ 0x63, 0x33, 0x01, 0x02, 0xe2, 0xf2, 0x05, 0x51, 0x00, 0x00, 0xc0, 0xee,
+ 0x03, 0x32, 0xf9, 0x20,
+ 0x64, 0x00, 0x0b, 0xff, 0x00, 0x30, 0x20, 0x0e, 0x00, 0x20, 0x01, 0xef,
+ 0xd0, 0xd3, 0xbd, 0x0f,
+ 0x03, 0xed, 0x89, 0xf0, 0x10, 0x55, 0x1f, 0x0d, 0x1f, 0x10, 0x0d, 0x51,
+ 0x0f, 0x1b, 0x21, 0x15,
+ 0x21, 0x01, 0xe2, 0xf6, 0xf0, 0x9c, 0xe0, 0xe1, 0xd1, 0xc0, 0xf1, 0xe0,
+ 0xca, 0xce, 0xd0, 0xee,
+ 0xce, 0x10, 0x24, 0x31, 0xfd, 0xcd, 0xf0, 0x02, 0x27, 0x01, 0x00, 0x2f,
+ 0x0f, 0xed, 0xff, 0x43,
+ 0x01, 0xb9, 0xee, 0x20, 0x34, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x40, 0x3c,
+ 0x0a, 0x2e, 0x73, 0x72,
+ 0xfb, 0xfe, 0x00, 0x00, 0x00, 0x2e, 0x23, 0x04, 0xbc, 0xfd, 0x02, 0x07,
+ 0x33, 0x10, 0xcd, 0xed,
+ 0x00, 0x45, 0x22, 0x00, 0x0e, 0x1f, 0x1f, 0x00, 0x43, 0x34, 0x0e, 0xdc,
+ 0xb0, 0xf4, 0xf2, 0xcf,
+ 0x0e, 0x11, 0x15, 0xf2, 0x9f, 0xea, 0xee, 0xe0, 0x22, 0x52, 0x0f, 0xe0,
+ 0x37, 0x35, 0xde, 0xbf,
+ 0x00, 0x65, 0x11, 0xf0, 0xef, 0x00, 0x12, 0x21, 0xfe, 0x0e, 0xf0, 0x0e,
+ 0x0f, 0x0f, 0x1e, 0x10,
+ 0x10, 0x02, 0xd1, 0x8a, 0x0e, 0xee, 0x0e, 0x03, 0x26, 0x00, 0xed, 0x0f,
+ 0x40, 0x00, 0xec, 0xdf,
+ 0x01, 0x77, 0x35, 0x0f, 0xdd, 0x1f, 0x31, 0x40, 0x52, 0x32, 0xfd, 0xd8,
+ 0xf0, 0x1e, 0x60, 0x0e,
+ 0x0f, 0xbc, 0x0f, 0x02, 0x15, 0x0f, 0xde, 0xce, 0xf1, 0x01, 0xf2, 0xdf,
+ 0xb9, 0xef, 0xf0, 0xf0,
+ 0xe1, 0xef, 0x0e, 0x73, 0x25, 0x00, 0xdd, 0x01, 0x57, 0x24, 0x0f, 0xff,
+ 0x20, 0x72, 0x03, 0x02,
+ 0xe0, 0xfe, 0xee, 0xf0, 0x25, 0x34, 0xd0, 0xe0, 0x13, 0x0f, 0x2e, 0x20,
+ 0x01, 0x00, 0xfc, 0x51,
+ 0x54, 0xf9, 0xfe, 0x1f, 0x10, 0xf0, 0x0f, 0xfd, 0xdc, 0x00, 0x24, 0x00,
+ 0xdf, 0xef, 0x17, 0x52,
+ 0xfd, 0xdc, 0x00, 0x77, 0x73, 0x00, 0xff, 0x0f, 0xfe, 0x12, 0x35, 0x00,
+ 0xfc, 0xf1, 0x23, 0x00,
+ 0xde, 0xfe, 0x00, 0x00, 0x54, 0xfe, 0xdd, 0xfc, 0x01, 0x12, 0x22, 0x00,
+ 0x0d, 0x06, 0x02, 0xee,
+ 0x00, 0x27, 0x74, 0x10, 0xef, 0xff, 0x00, 0x61, 0x31, 0x43, 0x00, 0xfc,
+ 0x00, 0x10, 0x2f, 0x1a,
+ 0x00, 0x30, 0xf3, 0x8f, 0xf0, 0xfe, 0xed, 0x01, 0x17, 0x01, 0xbe, 0x0d,
+ 0xf1, 0xf0, 0xd0, 0xf0,
+ 0xab, 0xdb, 0xf0, 0x03, 0x00, 0x0d, 0x1e, 0xdc, 0x23, 0x35, 0xfd, 0x2e,
+ 0x61, 0x0f, 0xd9, 0xfd,
+ 0x0e, 0x64, 0x01, 0xef, 0xe0, 0xee, 0xdf, 0x13, 0x37, 0xe0, 0xb0, 0x00,
+ 0xff, 0x0f, 0x11, 0xf0,
+ 0x0f, 0x72, 0x32, 0xfe, 0xeb, 0x02, 0x45, 0x12, 0x33, 0xf0, 0xab, 0xff,
+ 0xf1, 0x05, 0x21, 0xbd,
+ 0xdc, 0xee, 0x00, 0x1f, 0x1f, 0xfe, 0xd0, 0x01, 0x23, 0x00, 0xf0, 0x01,
+ 0x42, 0x21, 0x0d, 0xb8,
+ 0x10, 0x30, 0x1f, 0xdc, 0x00, 0x70, 0x1f, 0x10, 0x02, 0x20, 0x10, 0x23,
+ 0x05, 0x45, 0x23, 0x21,
+ 0xf2, 0xcf, 0xfd, 0x23, 0x35, 0xff, 0xee, 0x0f, 0x0d, 0xea, 0xcf, 0xf1,
+ 0xe0, 0x10, 0x23, 0xf0,
+ 0x9d, 0xd8, 0xee, 0x26, 0x31, 0xaf, 0xed, 0x00, 0x0f, 0x0f, 0x0e, 0x30,
+ 0x2f, 0x00, 0x54, 0x00,
+ 0xcd, 0xef, 0x37, 0x44, 0x00, 0xdf, 0xd2, 0xe1, 0x13, 0x60, 0x37, 0x00,
+ 0xdc, 0x00, 0x31, 0x10,
+ 0x41, 0x00, 0x0f, 0x2f, 0x01, 0x15, 0x11, 0xee, 0xe0, 0x15, 0xf1, 0x8e,
+ 0xcd, 0x25, 0x23, 0x00,
+ 0xa8, 0x00, 0xf0, 0x10, 0x10, 0x1f, 0x0e, 0x40, 0x44, 0x0f, 0x0f, 0x40,
+ 0x22, 0x1e, 0xfb, 0xe0,
+ 0x0e, 0x43, 0x02, 0x21, 0x00, 0xcb, 0xd0, 0xef, 0xa0, 0xe5, 0x01, 0xef,
+ 0xed, 0xcf, 0xef, 0xc0,
+ 0xe2, 0xbd, 0xe8, 0xff, 0x00, 0x01, 0xbf, 0x0f, 0x13, 0x44, 0x0f, 0xed,
+ 0xf0, 0x16, 0x44, 0xe0,
+ 0xcd, 0x0f, 0x20, 0x00, 0xcf, 0xdb, 0x20, 0x70, 0x32, 0x0f, 0x1d, 0x0c,
+ 0x50, 0x46, 0x11, 0xfd,
+ 0x0d, 0x1e, 0x10, 0x0f, 0xf0, 0xe0, 0xf0, 0xee, 0xec, 0xee, 0xee, 0xce,
+ 0xfe, 0xf0, 0x26, 0x43,
+ 0x10, 0x32, 0x20, 0x10, 0x54, 0x36, 0x24, 0x0f, 0xdc, 0x01, 0x73, 0x01,
+ 0xdf, 0x00, 0xf2, 0x01,
+ 0x00, 0xfd, 0xee, 0x02, 0x67, 0x23, 0x10, 0x12, 0x00, 0xbd, 0x0f, 0x35,
+ 0xf1, 0xc2, 0x13, 0x35,
+ 0x22, 0xdf, 0xab, 0x03, 0xf3, 0xe1, 0x01, 0x67, 0x0f, 0x0e, 0x21, 0x34,
+ 0x00, 0xed, 0xfe, 0x00,
+ 0x10, 0xed, 0xfd, 0x14, 0xfd, 0xb8, 0xf0, 0xf0, 0x0e, 0x51, 0x46, 0x00,
+ 0xdd, 0x10, 0x32, 0x30,
+ 0xfc, 0xce, 0xef, 0x00, 0x12, 0x12, 0x40, 0x11, 0x1e, 0xdd, 0x32, 0x67,
+ 0x22, 0x0f, 0xd9, 0xff,
+ 0x31, 0x74, 0x00, 0xde, 0xcc, 0x11, 0x41, 0xf0, 0xd0, 0xfe, 0x01, 0x01,
+ 0x54, 0x00, 0xca, 0xef,
+ 0x00, 0x13, 0xee, 0x0b, 0x0f, 0x3f, 0x20, 0x23, 0x00, 0x02, 0xf3, 0xef,
+ 0xca, 0x02, 0x13, 0xb2,
+ 0xf3, 0xe3, 0x03, 0x22, 0x99, 0xab, 0x00, 0x01, 0x05, 0x31, 0xe0, 0xfd,
+ 0x01, 0x33, 0x12, 0xf0,
+ 0xdb, 0x30, 0x40, 0x10, 0xf0, 0x00, 0x0e, 0x2f, 0x0d, 0xc9, 0xef, 0xe0,
+ 0x41, 0x53, 0x0d, 0xec,
+ 0x24, 0x75, 0x00, 0x0f, 0x31, 0x33, 0x33, 0x20, 0x0f, 0x0d, 0x0e, 0xec,
+ 0x20, 0x20, 0xf0, 0xe2,
+ 0xde, 0xcb, 0x00, 0x11, 0x1f, 0xca, 0x00, 0xf3, 0x0f, 0x1f, 0x10, 0xda,
+ 0xf0, 0xff, 0xdf, 0x10,
+ 0x36, 0x00, 0xf0, 0xf3, 0x00, 0x00, 0x23, 0x77, 0x11, 0x0f, 0x30, 0x44,
+ 0x11, 0xf0, 0x1c, 0x72,
+ 0x22, 0x0f, 0xea, 0x00, 0x02, 0x30, 0xf2, 0xd1, 0x8c, 0xed, 0xf2, 0x07,
+ 0x33, 0xcf, 0xcd, 0x01,
+ 0x01, 0xcd, 0xda, 0xf1, 0x02, 0xeb, 0x00, 0x51, 0x00, 0x0f, 0x2e, 0x20,
+ 0x30, 0x0e, 0xfc, 0x10,
+ 0x10, 0x00, 0xee, 0xeb, 0xba, 0xdf, 0x00, 0xc0, 0xc0, 0x0e, 0x2f, 0x00,
+ 0xb1, 0xf0, 0x00, 0xfe,
+ 0x47, 0x17, 0xbf, 0xfe, 0x00, 0x62, 0x10, 0xef, 0xee, 0x15, 0x42, 0x00,
+ 0xef, 0x00, 0xe1, 0xc1,
+ 0x02, 0x44, 0x20, 0x0e, 0x3f, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0c, 0x1b,
+ 0x3f, 0x62, 0x02, 0xef,
+ 0x0e, 0x30, 0x50, 0x0b, 0x1b, 0x00, 0x02, 0x11, 0x20, 0x20, 0x01, 0x00,
+ 0x04, 0x25, 0x10, 0x31,
+ 0x74, 0x02, 0xf0, 0xfe, 0x32, 0x37, 0x12, 0x21, 0x31, 0x20, 0xdd, 0xaf,
+ 0xee, 0x03, 0xf2, 0xb8,
+ 0xfe, 0xe1, 0x04, 0xef, 0xab, 0x00, 0x0f, 0xfd, 0x0e, 0x1f, 0x41, 0x46,
+ 0x20, 0xda, 0xcf, 0x10,
+ 0x53, 0x11, 0xf0, 0xc0, 0xe1, 0xf0, 0x03, 0x03, 0x1f, 0x0d, 0xf0, 0x65,
+ 0x42, 0x01, 0x1e, 0x1f,
+ 0x52, 0x22, 0x10, 0xd9, 0xf0, 0x03, 0x13, 0x12, 0xff, 0xab, 0xf0, 0xf3,
+ 0x03, 0xef, 0xc8, 0x0f,
+ 0x64, 0xf1, 0xcc, 0xdd, 0x0f, 0x22, 0x40, 0xfc, 0xff, 0x21, 0x20, 0x43,
+ 0x53, 0x2e, 0x1b, 0x30,
+ 0x33, 0x00, 0x1f, 0x30, 0x00, 0x00, 0x06, 0xe1, 0xa0, 0xdc, 0x01, 0xf4,
+ 0xe0, 0xba, 0xbf, 0xee,
+ 0x01, 0x04, 0x40, 0xdc, 0xbb, 0x10, 0x21, 0x01, 0xdf, 0xd0, 0x00, 0xf1,
+ 0x02, 0x12, 0xc0, 0xcc,
+ 0xe1, 0xc3, 0x00, 0xb8, 0x0f, 0x00, 0x30, 0x41, 0x0e, 0x0e, 0x51, 0x01,
+ 0x1c, 0x20, 0x46, 0x20,
+ 0x00, 0xf0, 0x10, 0x60, 0x00, 0x00, 0xfa, 0xce, 0x00, 0x11, 0x30, 0x0b,
+ 0xf1, 0x02, 0xbf, 0xfc,
+ 0xe0, 0x03, 0x47, 0x42, 0x10, 0x0d, 0x22, 0x42, 0x54, 0x20, 0xfc, 0xdf,
+ 0x0f, 0x10, 0x23, 0xeb,
+ 0xbe, 0xe0, 0xe0, 0xf2, 0xc6, 0xc0, 0xef, 0xe0, 0xf0, 0x12, 0x13, 0xf0,
+ 0x51, 0x36, 0x0f, 0xda,
+ 0xf0, 0x32, 0x54, 0x00, 0xd0, 0x0f, 0xf0, 0xf1, 0xf5, 0x12, 0x01, 0x01,
+ 0x10, 0x2f, 0x0e, 0xff,
+ 0x50, 0x11, 0xca, 0xef, 0xef, 0xfd, 0xff, 0x36, 0x31, 0xce, 0xde, 0xf0,
+ 0x01, 0x44, 0x0f, 0xf0,
+ 0x36, 0x40, 0x00, 0xb9, 0x00, 0x20, 0x40, 0xee, 0xf0, 0x31, 0xd0, 0x0c,
+ 0x21, 0x72, 0x21, 0x0e,
+ 0x0c, 0x0d, 0xed, 0x33, 0x4f, 0x1e, 0x21, 0x0e, 0xc9, 0x8e, 0xff, 0x00,
+ 0xf0, 0xeb, 0xce, 0x0f,
+ 0x04, 0x32, 0x0e, 0xec, 0xfc, 0x20, 0x30, 0x33, 0x25, 0x11, 0x31, 0x73,
+ 0x02, 0xde, 0xd0, 0xf6,
+ 0x01, 0x02, 0xef, 0xb0, 0x00, 0x05, 0x45, 0x01, 0xdd, 0xee, 0x31, 0x55,
+ 0x00, 0x02, 0xf0, 0xff,
+ 0x0f, 0x20, 0x51, 0x0f, 0xdc, 0x01, 0x12, 0x09, 0xed, 0x3f, 0x60, 0x0f,
+ 0xc8, 0x00, 0x03, 0x11,
+ 0xe0, 0xbe, 0x12, 0x23, 0x35, 0x53, 0x0f, 0x0d, 0x21, 0x53, 0x42, 0x11,
+ 0x1f, 0x0e, 0x0e, 0x1d,
+ 0x0f, 0x13, 0xe1, 0xd1, 0xe2, 0xe1, 0xf1, 0xc0, 0xde, 0x0e, 0x47, 0x40,
+ 0xe0, 0xeb, 0x00, 0x20,
+ 0x3f, 0x20, 0x10, 0x00, 0x13, 0x27, 0xf1, 0xcf, 0x0e, 0x22, 0x47, 0x31,
+ 0x20, 0x10, 0x50, 0x12,
+ 0x1f, 0x4e, 0x21, 0x34, 0xff, 0x99, 0x10, 0x12, 0x21, 0x03, 0xcd, 0x9b,
+ 0x00, 0x04, 0x10, 0xff,
+ 0xed, 0x13, 0x03, 0xfd, 0xbb, 0xff, 0xff, 0x0f, 0xff, 0x01, 0x43, 0x00,
+ 0x88, 0x0d, 0xf0, 0x00,
+ 0x10, 0x0d, 0xe0, 0x05, 0x0d, 0xfd, 0x00, 0x3f, 0x40, 0x36, 0xd0, 0xad,
+ 0xf0, 0x12, 0x37, 0x10,
+ 0xcc, 0xf1, 0x32, 0x22, 0xe0, 0xdc, 0x31, 0x73, 0x0f, 0xda, 0x00, 0x10,
+ 0x52, 0x01, 0xd0, 0xf0,
+ 0xf1, 0xf1, 0x01, 0x00, 0xf0, 0xcb, 0xcd, 0x01, 0x05, 0xad, 0xfb, 0x00,
+ 0x0e, 0xdf, 0xfe, 0x00,
+ 0x21, 0x00, 0x10, 0x60, 0x2f, 0x10, 0xf4, 0x17, 0x41, 0x1f, 0x1e, 0x00,
+ 0xde, 0xfe, 0x34, 0x46,
+ 0x00, 0xfe, 0xff, 0x20, 0x36, 0x20, 0x40, 0x41, 0x02, 0x01, 0x12, 0x31,
+ 0x20, 0xd1, 0xae, 0xe8,
+ 0xbf, 0xfe, 0xff, 0xef, 0x00, 0x12, 0xeb, 0xad, 0x00, 0x20, 0x2f, 0x0e,
+ 0x0f, 0x32, 0x37, 0xff,
+ 0xbe, 0xee, 0xed, 0x32, 0x37, 0xb0, 0xcf, 0xef, 0x00, 0x53, 0x26, 0x0f,
+ 0xed, 0x00, 0x77, 0x21,
+ 0x00, 0x10, 0x11, 0x11, 0x0f, 0xfe, 0xf0, 0x01, 0x01, 0xe4, 0xd3, 0xd0,
+ 0xbd, 0xf0, 0x05, 0x00,
+ 0xbd, 0xee, 0x02, 0x57, 0x05, 0xee, 0xed, 0xfd, 0x1f, 0x70, 0x14, 0x10,
+ 0x0d, 0xfd, 0x20, 0x71,
+ 0x26, 0x10, 0x00, 0x23, 0x51, 0x0c, 0xde, 0xe0, 0x10, 0x34, 0x10, 0xac,
+ 0xd9, 0xfe, 0x23, 0x43,
+ 0xbd, 0xc8, 0xf0, 0x00, 0x01, 0x00, 0x00, 0xe0, 0x02, 0xe0, 0xed, 0xdf,
+ 0xde, 0xef, 0xf4, 0xe1,
+ 0xe0, 0xff, 0xdd, 0xdf, 0x0f, 0x3f, 0x50, 0x12, 0x06, 0x11, 0x1e, 0x5f,
+ 0x30, 0x00, 0xec, 0x1c,
+ 0x2e, 0x51, 0x23, 0x1d, 0x0a, 0xf0, 0x20, 0x1d, 0x1c, 0x1f, 0x21, 0x13,
+ 0xde, 0xac, 0xf0, 0xf5,
+ 0x15, 0xfd, 0xcb, 0x01, 0x32, 0x13, 0x50, 0x34, 0x20, 0x0d, 0x0f, 0x60,
+ 0x33, 0x43, 0x06, 0xe0,
+ 0xdf, 0xfc, 0xd0, 0x01, 0x05, 0xe0, 0xbd, 0x02, 0x03, 0x00, 0x00, 0x34,
+ 0x42, 0x11, 0xfe, 0xfc,
+ 0x12, 0x01, 0x0f, 0x2f, 0x44, 0x35, 0x00, 0xce, 0xe0, 0x17, 0x34, 0xd0,
+ 0x02, 0xf0, 0xad, 0xff,
+ 0x02, 0x22, 0x31, 0x01, 0xf0, 0x98, 0x0e, 0x00, 0x0d, 0x30, 0x00, 0x02,
+ 0xff, 0x01, 0x24, 0x1f,
+ 0xe8, 0xe0, 0x20, 0x74, 0x00, 0x0f, 0x00, 0xe0, 0xda, 0x0f, 0x41, 0x62,
+ 0x00, 0xfe, 0x0e, 0x31,
+ 0x25, 0x23, 0x23, 0x4f, 0x0c, 0x00, 0x20, 0xff, 0xfd, 0x13, 0x05, 0xcb,
+ 0xac, 0x0d, 0x00, 0x13,
+ 0x0d, 0xcd, 0xf1, 0x16, 0x41, 0xfe, 0xec, 0x20, 0x76, 0x10, 0xc0, 0xec,
+ 0x00, 0x00, 0xff, 0x01,
+ 0xf1, 0xe0, 0x10, 0x21, 0xe3, 0xbf, 0xf0, 0x07, 0x55, 0xf0, 0xad, 0x02,
+ 0x12, 0x0f, 0xc0, 0x0f,
+ 0xff, 0xdd, 0x0e, 0x23, 0x77, 0x00, 0xee, 0x10, 0x11, 0x20, 0x0c, 0xd0,
+ 0x00, 0x15, 0x10, 0xd0,
+ 0xbe, 0x03, 0x11, 0x0c, 0xfb, 0x01, 0x53, 0x42, 0x44, 0x42, 0x1e, 0x08,
+ 0x30, 0x43, 0x00, 0x10,
+ 0x11, 0xfe, 0xad, 0x10, 0x15, 0x0f, 0xba, 0x00, 0x00, 0x20, 0xdd, 0xc0,
+ 0x11, 0x46, 0x00, 0xff,
+ 0xf0, 0xed, 0xdf, 0xd1, 0xe0, 0x10, 0x53, 0x00, 0xfe, 0xed, 0x00, 0x26,
+ 0x62, 0x34, 0x41, 0x12,
+ 0x10, 0x11, 0x35, 0x20, 0x43, 0x24, 0x00, 0x9a, 0xdd, 0x00, 0x14, 0xf0,
+ 0xce, 0x00, 0x00, 0xf0,
+ 0x22, 0x05, 0xd0, 0x00, 0x12, 0x02, 0xef, 0x9b, 0x01, 0xe3, 0xfe, 0xf0,
+ 0xfd, 0xb8, 0xed, 0xf0,
+ 0xef, 0xfc, 0x20, 0x2f, 0xff, 0x10, 0x53, 0x11, 0xf8, 0xef, 0x00, 0x00,
+ 0x00, 0xfc, 0xbf, 0x0f,
+ 0xe0, 0xbe, 0xef, 0x00, 0x01, 0x75, 0x0f, 0xfc, 0xf0, 0x17, 0x43, 0x12,
+ 0xed, 0xde, 0x35, 0x22,
+ 0xe1, 0xd1, 0xf0, 0xde, 0x0e, 0x44, 0x52, 0xee, 0xfe, 0x21, 0x2d, 0x4e,
+ 0x10, 0x00, 0xac, 0x01,
+ 0x17, 0x01, 0x0d, 0xce, 0x20, 0x1d, 0x0d, 0x04, 0x23, 0x0d, 0x4b, 0x2f,
+ 0x31, 0x32, 0xea, 0x00,
+ 0x41, 0x22, 0x34, 0xf0, 0x03, 0xf4, 0x00, 0x13, 0x42, 0x0f, 0x02, 0x35,
+ 0xe1, 0xf3, 0xff, 0xec,
+ 0x10, 0x00, 0x11, 0xe0, 0xa8, 0xee, 0xef, 0x00, 0xe0, 0x03, 0x0d, 0xaa,
+ 0x00, 0x24, 0x0f, 0xdd,
+ 0x30, 0x74, 0x00, 0xec, 0xfe, 0x10, 0x61, 0x22, 0x00, 0xde, 0xe9, 0xf1,
+ 0x24, 0x42, 0x00, 0x0f,
+ 0x30, 0x22, 0x11, 0x43, 0x05, 0x21, 0x22, 0xf0, 0xcc, 0xff, 0xe0, 0xc1,
+ 0xe3, 0x14, 0xfd, 0x8a,
+ 0xff, 0xf0, 0x15, 0x43, 0xfd, 0xdb, 0x11, 0x44, 0x0e, 0x0d, 0x10, 0x51,
+ 0x11, 0x02, 0x00, 0xbd,
+ 0x0b, 0x01, 0x44, 0x00, 0xd0, 0x21, 0x76, 0x21, 0x02, 0x1e, 0xeb, 0x00,
+ 0x00, 0x20, 0xdc, 0x1f,
+ 0x32, 0x01, 0x80, 0xea, 0xcf, 0x00, 0x35, 0x00, 0xdf, 0xe0, 0xff, 0xe0,
+ 0xdd, 0xbe, 0xcc, 0xe0,
+ 0x00, 0xe0, 0xd0, 0xef, 0xed, 0x0d, 0x00, 0x52, 0x01, 0xff, 0x00, 0x47,
+ 0x30, 0xfe, 0xfe, 0x40,
+ 0x1f, 0x2e, 0x32, 0x32, 0x0b, 0x0e, 0x41, 0xe1, 0xe2, 0x47, 0x2f, 0xec,
+ 0xc0, 0x02, 0x14, 0xb0,
+ 0x0f, 0x11, 0x00, 0xdd, 0xff, 0x3f, 0x2d, 0x1e, 0x20, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x5a, 0x13, 0x5a, 0x0b, 0x36, 0x13, 0xa8, 0x0c, 0x34, 0x00, 0x0c, 0xef,
+ 0x12, 0x35, 0xe0, 0xbd,
+ 0xcc, 0xf3, 0x04, 0xee, 0xde, 0x04, 0x04, 0xf0, 0xcc, 0x00, 0x42, 0x36,
+ 0x40, 0x31, 0x01, 0x55,
+ 0x00, 0xae, 0x0e, 0x01, 0xe0, 0x02, 0x37, 0xdf, 0xbe, 0x03, 0x25, 0xff,
+ 0xdf, 0x00, 0x03, 0xfd,
+ 0x30, 0x77, 0x52, 0xff, 0xdb, 0x0f, 0x0f, 0xff, 0xdf, 0x0f, 0x31, 0x33,
+ 0xee, 0x8b, 0x01, 0xf0,
+ 0x03, 0x33, 0x20, 0x08, 0xf0, 0x23, 0x0f, 0x00, 0x50, 0x11, 0x0d, 0xef,
+ 0x30, 0x2e, 0x10, 0x24,
+ 0xee, 0xfa, 0x60, 0x34, 0x01, 0xcf, 0xfa, 0x21, 0x22, 0xcc, 0xab, 0x00,
+ 0x0f, 0x41, 0x01, 0xdc,
+ 0xce, 0x1f, 0x21, 0x02, 0x0f, 0x0f, 0x01, 0x00, 0x02, 0x31, 0x01, 0xf0,
+ 0xc2, 0xf6, 0xe0, 0x00,
+ 0x22, 0x07, 0x41, 0xd0, 0x8f, 0x00, 0x01, 0xf4, 0x24, 0x40, 0xe1, 0xf0,
+ 0xfe, 0xde, 0x02, 0x40,
+ 0x0b, 0xfe, 0x13, 0x34, 0xfe, 0xa8, 0x00, 0x60, 0x00, 0xff, 0xcf, 0x03,
+ 0x25, 0x0f, 0x00, 0x32,
+ 0xff, 0xcc, 0x13, 0x54, 0x0f, 0xfd, 0x55, 0x42, 0x02, 0x00, 0x10, 0x0d,
+ 0x00, 0x57, 0x13, 0x0c,
+ 0xff, 0xe1, 0x04, 0x01, 0x0e, 0xde, 0x0e, 0x74, 0x03, 0xdc, 0xf0, 0x11,
+ 0xfe, 0xdc, 0x31, 0x56,
+ 0x00, 0x0c, 0x1f, 0x0f, 0xe0, 0x31, 0x02, 0x0e, 0x21, 0x03, 0x14, 0x42,
+ 0x33, 0x05, 0x02, 0xf3,
+ 0xff, 0x0b, 0x11, 0x73, 0x22, 0xfe, 0xfa, 0xff, 0xdf, 0x00, 0x32, 0x02,
+ 0xfa, 0x10, 0x04, 0x03,
+ 0x01, 0xce, 0xdf, 0xcf, 0xf0, 0xf1, 0x12, 0xd0, 0xba, 0xdc, 0xed, 0x3f,
+ 0x0e, 0xbe, 0x10, 0x23,
+ 0xde, 0xdb, 0xdf, 0x0e, 0x43, 0x15, 0xd0, 0x00, 0x54, 0x0e, 0x2e, 0xed,
+ 0xd8, 0x0e, 0x00, 0x10,
+ 0x10, 0xdf, 0x0c, 0x64, 0x37, 0xf0, 0xb0, 0x0f, 0x01, 0x24, 0x00, 0x2e,
+ 0x0f, 0xe0, 0xe0, 0x00,
+ 0x2d, 0x1f, 0x12, 0x11, 0xfd, 0xce, 0xf1, 0xd1, 0xf4, 0x03, 0x15, 0xe0,
+ 0xad, 0xee, 0xed, 0xea,
+ 0x0f, 0x3f, 0x3d, 0x2f, 0x10, 0xff, 0x1f, 0x10, 0x00, 0x15, 0x55, 0x00,
+ 0xef, 0xff, 0x25, 0x22,
+ 0x01, 0x00, 0x3f, 0xed, 0xcd, 0x20, 0x74, 0x46, 0x10, 0x01, 0x01, 0x03,
+ 0x10, 0x0b, 0x00, 0xe1,
+ 0xbf, 0xf0, 0xf0, 0xd0, 0xb8, 0xed, 0xf0, 0x00, 0x21, 0xdd, 0xf0, 0x33,
+ 0xfd, 0xea, 0x00, 0x30,
+ 0x24, 0xde, 0xcc, 0x00, 0x1f, 0x20, 0x0e, 0xf0, 0x0f, 0xdb, 0x00, 0x54,
+ 0x22, 0x32, 0x44, 0x26,
+ 0x22, 0x10, 0x0f, 0xe1, 0x04, 0xcf, 0xe0, 0x12, 0x26, 0xcd, 0xac, 0x0f,
+ 0xf0, 0xe1, 0xef, 0x00,
+ 0x67, 0x23, 0xfe, 0xad, 0x00, 0x05, 0x22, 0x11, 0xff, 0xcb, 0x00, 0x32,
+ 0x22, 0xf0, 0x0c, 0x30,
+ 0x20, 0xff, 0x00, 0x63, 0x44, 0x13, 0x10, 0x0e, 0x3d, 0x20, 0x10, 0xfe,
+ 0xc8, 0xde, 0xe0, 0x0f,
+ 0x0e, 0x9a, 0xdf, 0x00, 0x00, 0xe3, 0xd0, 0xe0, 0xb0, 0xcf, 0xfe, 0x00,
+ 0xd0, 0xde, 0xbd, 0xdc,
+ 0x0f, 0x11, 0x13, 0xd0, 0xd9, 0xf0, 0x0f, 0x41, 0x36, 0x00, 0x00, 0x0f,
+ 0x20, 0x3f, 0x5e, 0x1d,
+ 0x2d, 0x4f, 0x1e, 0x5e, 0x1e, 0x0c, 0xf0, 0xdf, 0xdf, 0x12, 0x15, 0xe0,
+ 0xd1, 0xee, 0xfb, 0xef,
+ 0x00, 0x05, 0x32, 0x3e, 0x3e, 0x0f, 0x2c, 0x5e, 0x22, 0x47, 0x22, 0xfe,
+ 0xde, 0x03, 0x46, 0x23,
+ 0xd0, 0x8e, 0xef, 0xf0, 0x02, 0x00, 0xfe, 0xd0, 0x47, 0x36, 0x0f, 0x1f,
+ 0x3f, 0x40, 0x42, 0x12,
+ 0x00, 0xe1, 0x02, 0x02, 0x1e, 0xf8, 0xcf, 0xd0, 0xf1, 0xf1, 0xe2, 0x34,
+ 0x20, 0xed, 0xf1, 0x17,
+ 0x11, 0x01, 0xdf, 0x0f, 0x43, 0x00, 0xad, 0xee, 0x11, 0x22, 0xe8, 0xfb,
+ 0x21, 0x00, 0x00, 0x62,
+ 0x31, 0x21, 0xfe, 0x00, 0x33, 0x12, 0x12, 0x20, 0x21, 0xf0, 0xdb, 0x0d,
+ 0x40, 0x77, 0x10, 0x0e,
+ 0x00, 0x10, 0x24, 0x88, 0xfd, 0x77, 0x03, 0xdc, 0x00, 0x20, 0x01, 0xef,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0d, 0xe0, 0x01, 0x0f, 0xec, 0x10, 0x10, 0x11, 0xf0, 0xe0, 0x53, 0x33,
+ 0x32, 0xfe, 0xad, 0x00,
+ 0xf0, 0xf2, 0x37, 0x00, 0xb0, 0xff, 0x00, 0xad, 0xf1, 0xf2, 0x00, 0x17,
+ 0x04, 0xe0, 0xcd, 0x0f,
+ 0x50, 0x1f, 0xb9, 0xff, 0xf0, 0x10, 0x35, 0xdf, 0x9d, 0x00, 0x12, 0x25,
+ 0xf0, 0xaf, 0x00, 0x12,
+ 0x11, 0x02, 0x0f, 0xeb, 0x10, 0x43, 0x2d, 0x2e, 0x40, 0x42, 0x27, 0x40,
+ 0xfe, 0x1e, 0x64, 0x01,
+ 0x01, 0x02, 0xf0, 0xed, 0xdb, 0x00, 0x0f, 0xda, 0xe0, 0x01, 0x01, 0x10,
+ 0x0f, 0xff, 0xf0, 0xee,
+ 0x00, 0x77, 0x00, 0x00, 0x22, 0xdd, 0xdc, 0xf0, 0xef, 0xdf, 0x1f, 0x77,
+ 0x12, 0xfd, 0x00, 0x62,
+ 0x07, 0x00, 0x21, 0x21, 0x11, 0x0f, 0x30, 0x33, 0x25, 0xe0, 0xdd, 0xfd,
+ 0x01, 0x01, 0xdf, 0x47,
+ 0x23, 0xe0, 0xde, 0xbd, 0xd0, 0xc1, 0xf1, 0x00, 0x37, 0x07, 0x8f, 0xcb,
+ 0x10, 0x01, 0xf0, 0xee,
+ 0x00, 0xef, 0x00, 0x1f, 0xed, 0xf0, 0x00, 0x00, 0x60, 0x0e, 0xfa, 0xf0,
+ 0x51, 0x23, 0xed, 0xb9,
+ 0x00, 0x00, 0xf0, 0x9f, 0x00, 0x01, 0x02, 0x22, 0x00, 0xdf, 0x34, 0x55,
+ 0x12, 0x30, 0xfb, 0x02,
+ 0x00, 0x10, 0x21, 0x00, 0x02, 0xd3, 0xb0, 0xe1, 0x88, 0xec, 0x06, 0x10,
+ 0x0f, 0xe0, 0x22, 0x50,
+ 0xdd, 0x0f, 0x70, 0x00, 0xeb, 0x00, 0x1f, 0x30, 0x00, 0xd0, 0x01, 0x01,
+ 0x02, 0x04, 0x00, 0x3f,
+ 0x00, 0xc0, 0x14, 0x74, 0x00, 0x0d, 0x00, 0x46, 0x10, 0xfc, 0x02, 0x05,
+ 0x00, 0x00, 0x10, 0x20,
+ 0x11, 0xbf, 0xdf, 0xf1, 0x36, 0x31, 0xee, 0x9a, 0xf0, 0x00, 0xf0, 0x00,
+ 0x40, 0x22, 0xf0, 0xcc,
+ 0xec, 0x10, 0x4f, 0x20, 0x1e, 0x2d, 0x0d, 0x0c, 0x0d, 0x65, 0x34, 0xfb,
+ 0xcf, 0x00, 0x11, 0x57,
+ 0x02, 0xd0, 0x00, 0x00, 0x01, 0x00, 0xf0, 0xb0, 0xff, 0x10, 0x42, 0x00,
+ 0xa8, 0xfe, 0x00, 0x23,
+ 0x54, 0xf0, 0x00, 0x02, 0x03, 0xad, 0x25, 0xc8, 0x01, 0x77, 0xee, 0xfe,
+ 0x11, 0x11, 0x00, 0xef,
+ 0x30, 0x51, 0xf0, 0x00, 0xee, 0xed, 0x67, 0x22, 0xee, 0xef, 0x1f, 0x42,
+ 0x02, 0xfe, 0xef, 0x21,
+ 0x0f, 0xcb, 0x11, 0x0f, 0xae, 0x00, 0x35, 0xdd, 0xde, 0x01, 0x00, 0x14,
+ 0xf0, 0xb9, 0x23, 0x10,
+ 0xe0, 0xde, 0x00, 0x10, 0xbf, 0x0f, 0x00, 0xe0, 0x00, 0xfc, 0xde, 0x76,
+ 0x21, 0xce, 0x0e, 0x22,
+ 0x20, 0x00, 0x10, 0x23, 0x0f, 0x0c, 0xcf, 0x1f, 0x42, 0xd0, 0x9c, 0x05,
+ 0x20, 0xe0, 0x00, 0x45,
+ 0x0e, 0xfd, 0x15, 0x20, 0xec, 0xdf, 0x50, 0x75, 0x1f, 0xec, 0xf0, 0x13,
+ 0x11, 0x0f, 0x0d, 0xed,
+ 0x47, 0x12, 0xae, 0xff, 0x12, 0x02, 0x0d, 0x00, 0x13, 0xcf, 0xdd, 0x01,
+ 0x67, 0x32, 0xfb, 0xb0,
+ 0x00, 0x10, 0x03, 0xfe, 0x12, 0x13, 0xa8, 0x00, 0x21, 0xe0, 0x12, 0x0e,
+ 0x10, 0x46, 0xe0, 0xbd,
+ 0x01, 0x23, 0x31, 0xe0, 0x00, 0xe1, 0xcc, 0xf0, 0x00, 0x55, 0x0f, 0xd8,
+ 0x40, 0x22, 0xbf, 0xee,
+ 0x31, 0x42, 0x10, 0x21, 0x9e, 0x00, 0x04, 0x0e, 0x0e, 0x00, 0x44, 0xf0,
+ 0x88, 0x21, 0x33, 0xf0,
+ 0xed, 0x10, 0x10, 0x21, 0x00, 0xde, 0x00, 0x37, 0x20, 0xdf, 0xfd, 0x22,
+ 0x20, 0x0f, 0x0e, 0x20,
+ 0xde, 0xa8, 0xff, 0x51, 0x01, 0xcc, 0xde, 0x00, 0x12, 0x31, 0xce, 0xfe,
+ 0x03, 0x44, 0x45, 0x00,
+ 0x10, 0x10, 0x0f, 0x00, 0x03, 0x03, 0x9f, 0xc9, 0x00, 0x03, 0x23, 0xed,
+ 0xcd, 0x00, 0x26, 0x10,
+ 0x00, 0x20, 0x3f, 0x31, 0xf0, 0xab, 0x1e, 0x54, 0x02, 0xdc, 0xbf, 0x02,
+ 0xf1, 0xf0, 0xee, 0x03,
+ 0x14, 0xee, 0xce, 0x13, 0x41, 0xfa, 0x20, 0x70, 0x45, 0x0e, 0x10, 0x57,
+ 0x00, 0xfe, 0x12, 0x10,
+ 0x23, 0x14, 0xba, 0x01, 0x20, 0x02, 0x00, 0x67, 0x89, 0xde, 0x77, 0x10,
+ 0xcd, 0x21, 0x02, 0x10,
+ 0xee, 0x0f, 0x01, 0x23, 0xfe, 0xfe, 0x01, 0x21, 0x02, 0xec, 0xf0, 0x0f,
+ 0x11, 0x33, 0xdd, 0x00,
+ 0xf0, 0xf0, 0x44, 0x20, 0xef, 0xef, 0x00, 0x24, 0x30, 0xe0, 0x0f, 0x10,
+ 0x51, 0x41, 0xdb, 0xde,
+ 0x44, 0x11, 0x0e, 0x01, 0x11, 0xf2, 0xa1, 0xee, 0x0e, 0x67, 0x00, 0xc0,
+ 0xfd, 0xfe, 0x04, 0x20,
+ 0xfc, 0x00, 0xdb, 0x0f, 0x00, 0x23, 0x00, 0xdb, 0x9f, 0xff, 0x14, 0x62,
+ 0xef, 0xec, 0x14, 0x10,
+ 0xdd, 0xef, 0x20, 0x62, 0x01, 0xca, 0x0f, 0x0f, 0x21, 0x31, 0xee, 0xfe,
+ 0x77, 0x23, 0xed, 0x01,
+ 0x35, 0x0e, 0xe0, 0x21, 0xf0, 0xef, 0xcf, 0x00, 0x21, 0xd0, 0x9d, 0x01,
+ 0xe0, 0xdc, 0xcc, 0x02,
+ 0x77, 0xf0, 0xda, 0x11, 0x20, 0x00, 0xf0, 0xe0, 0x1e, 0x20, 0xf1, 0x01,
+ 0x00, 0xde, 0xc0, 0xcf,
+ 0x34, 0x77, 0xff, 0xe0, 0x21, 0x00, 0x20, 0x41, 0x20, 0x20, 0x0e, 0x0d,
+ 0x74, 0x32, 0xfd, 0x13,
+ 0x11, 0xfe, 0xcf, 0x05, 0x77, 0xc0, 0xfb, 0x01, 0xf0, 0x03, 0xdf, 0xd9,
+ 0xf0, 0x11, 0x70, 0xff,
+ 0xcd, 0x21, 0x01, 0xfc, 0x00, 0x40, 0x0f, 0x00, 0x23, 0xbc, 0x00, 0x44,
+ 0x0e, 0xf0, 0x00, 0x00,
+ 0xf2, 0x15, 0x53, 0x1e, 0xfd, 0xf0, 0x13, 0x64, 0xed, 0xef, 0x37, 0x01,
+ 0xdd, 0x00, 0xf1, 0xab,
+ 0xff, 0x04, 0x33, 0xde, 0xe0, 0x25, 0x34, 0x8f, 0xab, 0x00, 0x24, 0x10,
+ 0xff, 0x00, 0x0f, 0x00,
+ 0x01, 0x42, 0x10, 0x10, 0x32, 0x0f, 0xff, 0x37, 0x61, 0x0f, 0xed, 0xee,
+ 0x20, 0x64, 0x26, 0xf0,
+ 0xdb, 0x0f, 0x00, 0xee, 0x00, 0x52, 0x8b, 0xfd, 0x47, 0xd0, 0xcb, 0x43,
+ 0x00, 0xde, 0xe0, 0x10,
+ 0x43, 0xee, 0xf0, 0x02, 0xdb, 0x21, 0x32, 0xce, 0xde, 0x10, 0x41, 0x01,
+ 0xe0, 0xff, 0x0e, 0x01,
+ 0x13, 0xfc, 0x0f, 0x73, 0x20, 0xfe, 0xf0, 0xd8, 0x74, 0x0f, 0xd8, 0x63,
+ 0x00, 0xce, 0x10, 0x21,
+ 0x02, 0xff, 0xfd, 0x00, 0x25, 0x10, 0xde, 0xed, 0x52, 0x33, 0x00, 0xca,
+ 0x00, 0x01, 0x20, 0x32,
+ 0x00, 0xdf, 0xe0, 0xbf, 0xff, 0x47, 0x32, 0xad, 0x00, 0x01, 0xff, 0x45,
+ 0x00, 0xdc, 0x00, 0x30,
+ 0x31, 0x12, 0xef, 0xee, 0x20, 0x52, 0xde, 0xd0, 0x77, 0x12, 0xdd, 0xd0,
+ 0x10, 0x42, 0x03, 0xbf,
+ 0xfc, 0x00, 0xf2, 0x25, 0x0f, 0x00, 0x33, 0x88, 0x10, 0x32, 0xf0, 0x14,
+ 0xec, 0xdd, 0x55, 0x21,
+ 0x00, 0x9b, 0x00, 0x22, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0xff, 0x11,
+ 0x42, 0x0f, 0xfe, 0x01,
+ 0x46, 0x00, 0x10, 0xff, 0xff, 0x10, 0x10, 0x41, 0xf1, 0x8d, 0x0e, 0x01,
+ 0x05, 0x10, 0x1d, 0x02,
+ 0xf0, 0xec, 0x20, 0xac, 0xfd, 0x36, 0xed, 0xcc, 0x10, 0x21, 0x20, 0xef,
+ 0xfe, 0x33, 0x23, 0x40,
+ 0x00, 0xd9, 0x53, 0x57, 0x00, 0xff, 0x10, 0xd0, 0x9e, 0x00, 0xef, 0xfd,
+ 0x03, 0x33, 0xdc, 0xce,
+ 0x0f, 0x01, 0x12, 0x21, 0x22, 0xe0, 0x10, 0xbc, 0x00, 0x07, 0x9e, 0x01,
+ 0xf4, 0x9b, 0xfe, 0xf0,
+ 0x16, 0xee, 0xba, 0x77, 0x00, 0xcc, 0x21, 0x22, 0x10, 0xf0, 0x0e, 0x42,
+ 0x00, 0xf0, 0x0f, 0xff,
+ 0x10, 0x21, 0x01, 0xe0, 0xfe, 0x00, 0x34, 0x00, 0xcc, 0xe0, 0x21, 0x45,
+ 0x10, 0x0d, 0xe0, 0x10,
+ 0x61, 0xf1, 0xdd, 0xfe, 0x00, 0x20, 0x01, 0x12, 0x20, 0xfd, 0x00, 0x13,
+ 0xc8, 0x20, 0x32, 0xc0,
+ 0xae, 0x01, 0x27, 0x20, 0x20, 0x10, 0xe0, 0x02, 0x62, 0x21, 0x42, 0x1f,
+ 0xf8, 0xdf, 0x20, 0x75,
+ 0x21, 0xf0, 0xbc, 0x01, 0x12, 0x0f, 0xcf, 0x02, 0x07, 0x00, 0xee, 0x00,
+ 0xf0, 0x8e, 0x00, 0x01,
+ 0x34, 0x0e, 0xca, 0x00, 0x11, 0x32, 0xf0, 0xdd, 0xff, 0xdd, 0x03, 0x01,
+ 0x89, 0xbf, 0x21, 0x34,
+ 0xff, 0xcd, 0x0d, 0x00, 0x33, 0x02, 0x0e, 0xd9, 0x11, 0x50, 0x00, 0xcf,
+ 0x0e, 0x53, 0x13, 0x00,
+ 0xff, 0x13, 0x10, 0x0d, 0x17, 0x47, 0xae, 0x0f, 0x02, 0xf0, 0xff, 0x01,
+ 0xef, 0xde, 0xf0, 0xf4,
+ 0x0e, 0x0a, 0x41, 0x43, 0x30, 0x0e, 0xfe, 0xd0, 0x30, 0x6f, 0x10, 0xe2,
+ 0xc0, 0x02, 0xe0, 0xcd,
+ 0xdc, 0xe0, 0x04, 0x02, 0xcd, 0x16, 0x73, 0x2e, 0x1f, 0x30, 0x1f, 0x65,
+ 0x21, 0x0b, 0x20, 0x22,
+ 0xff, 0xf1, 0x03, 0x03, 0xe1, 0xaf, 0xf2, 0x07, 0xf2, 0x8b, 0x00, 0xf2,
+ 0x00, 0x0e, 0x00, 0x22,
+ 0x3d, 0xe8, 0x00, 0x42, 0x20, 0xfa, 0xef, 0x30, 0x71, 0x10, 0x01, 0x32,
+ 0xef, 0xbc, 0x00, 0x0f,
+ 0x21, 0x16, 0xee, 0x8d, 0x24, 0x33, 0x0e, 0xeb, 0x00, 0x34, 0x0f, 0xee,
+ 0x22, 0x72, 0x02, 0xbe,
+ 0xb8, 0x32, 0x67, 0xde, 0xdd, 0x34, 0x00, 0xff, 0xff, 0xf0, 0x23, 0x10,
+ 0x0e, 0xe0, 0xef, 0x42,
+ 0x56, 0xff, 0xee, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x42, 0xee, 0xaa,
+ 0x54, 0x0f, 0xbb, 0x22,
+ 0x32, 0xf0, 0xf0, 0x0e, 0x01, 0xf0, 0xff, 0x20, 0xf0, 0xcd, 0x00, 0xdc,
+ 0x01, 0x21, 0x0f, 0x00,
+ 0xde, 0xde, 0x21, 0x67, 0x04, 0x0d, 0x01, 0xd0, 0x9e, 0x11, 0x0f, 0xfc,
+ 0xe0, 0xee, 0xcf, 0xe9,
+ 0x00, 0x22, 0xdd, 0x31, 0x72, 0x0d, 0x35, 0x00, 0x00, 0x52, 0xfe, 0xff,
+ 0x21, 0x03, 0xf0, 0xbb,
+ 0x01, 0x45, 0x98, 0xf0, 0x43, 0xef, 0xeb, 0x21, 0x11, 0x32, 0x00, 0xef,
+ 0x10, 0x1f, 0x31, 0x00,
+ 0xc0, 0x0e, 0x20, 0x02, 0x04, 0xe0, 0x8c, 0xee, 0xff, 0x03, 0x27, 0xdd,
+ 0x40, 0x62, 0xef, 0xff,
+ 0x34, 0xfd, 0xdc, 0x02, 0x77, 0x00, 0xfd, 0xdf, 0xf0, 0x10, 0x24, 0x12,
+ 0x00, 0xcb, 0x00, 0x44,
+ 0xef, 0xff, 0xf0, 0x00, 0x43, 0xde, 0xe0, 0x01, 0x53, 0x22, 0xfd, 0xde,
+ 0x00, 0x50, 0x22, 0xe0,
+ 0xcb, 0x0f, 0x75, 0xfd, 0xd9, 0x01, 0x10, 0xfe, 0xd0, 0x0f, 0xe0, 0x00,
+ 0x31, 0x14, 0x00, 0x0d,
+ 0x34, 0x76, 0x10, 0x11, 0x10, 0x0f, 0x0e, 0x20, 0x77, 0x52, 0xda, 0xf0,
+ 0x01, 0x10, 0xf0, 0xcf,
+ 0xee, 0x32, 0xef, 0x0e, 0x77, 0xde, 0xab, 0x11, 0x33, 0x0f, 0xcb, 0x00,
+ 0x11, 0x32, 0x00, 0xfd,
+ 0x00, 0x23, 0x00, 0xbe, 0x10, 0x14, 0x21, 0x00, 0x01, 0xff, 0xbd, 0x0f,
+ 0x20, 0x06, 0xcd, 0x00,
+ 0x44, 0xdc, 0xf0, 0x54, 0xdf, 0x0e, 0x00, 0x00, 0x04, 0x63, 0xfe, 0x98,
+ 0x00, 0x01, 0x01, 0x00,
+ 0xdc, 0xf0, 0x03, 0x52, 0x00, 0xbc, 0x02, 0x32, 0x00, 0x0e, 0x22, 0x01,
+ 0x0f, 0x40, 0x47, 0x00,
+ 0xfd, 0x10, 0x2f, 0x00, 0x13, 0x23, 0x00, 0x01, 0xf4, 0x25, 0xf0, 0x8e,
+ 0xff, 0x22, 0x57, 0x03,
+ 0xe9, 0xe0, 0x1f, 0x10, 0x51, 0x00, 0x20, 0xfe, 0xee, 0x00, 0x34, 0x01,
+ 0x9e, 0xfd, 0x24, 0x13,
+ 0xac, 0xff, 0x03, 0x11, 0xfe, 0x0c, 0xfe, 0x0e, 0x67, 0x11, 0x10, 0x10,
+ 0x41, 0xde, 0xcb, 0x10,
+ 0x35, 0x01, 0xd0, 0x0f, 0x01, 0x33, 0xee, 0xdd, 0xcf, 0x23, 0x00, 0x77,
+ 0x40, 0xaa, 0x01, 0x32,
+ 0xf0, 0xfd, 0xe0, 0x13, 0x00, 0xfe, 0x00, 0x22, 0xee, 0xed, 0x20, 0x1f,
+ 0x31, 0x8f, 0xe8, 0x0f,
+ 0x00, 0x34, 0xf0, 0xbb, 0x00, 0x00, 0x11, 0xf0, 0xdf, 0x2f, 0x3e, 0xdf,
+ 0x10, 0x70, 0x10, 0x0e,
+ 0x00, 0x34, 0x77, 0x03, 0xfc, 0xe0, 0x07, 0x10, 0x00, 0x00, 0xd0, 0xcf,
+ 0xf0, 0xcd, 0x01, 0x01,
+ 0xae, 0xf9, 0xfe, 0x22, 0x52, 0x00, 0xef, 0x0f, 0x00, 0x67, 0x02, 0xcd,
+ 0x00, 0x00, 0x02, 0xef,
+ 0xa9, 0x00, 0x00, 0x02, 0xff, 0x10, 0x0f, 0xf0, 0x13, 0x77, 0xd9, 0x10,
+ 0x77, 0x1e, 0xcf, 0x53,
+ 0x0f, 0xff, 0x00, 0xef, 0x11, 0x22, 0x0f, 0xde, 0x00, 0x00, 0x01, 0x01,
+ 0x17, 0x00, 0x31, 0x00,
+ 0x1e, 0x21, 0x79, 0x24, 0x9a, 0x21, 0x8d, 0x24, 0x00, 0x67, 0xef, 0xf0,
+ 0x00, 0xad, 0x33, 0xfe,
+ 0x0d, 0x67, 0xee, 0xfc, 0x42, 0x01, 0xde, 0x31, 0x0f, 0xeb, 0x75, 0x00,
+ 0xee, 0x0f, 0x13, 0x01,
+ 0x1f, 0x0d, 0xf0, 0x34, 0x00, 0xdd, 0xdf, 0x32, 0x77, 0x0f, 0xbd, 0x02,
+ 0x01, 0xf0, 0x0f, 0x00,
+ 0x23, 0xe0, 0xca, 0x02, 0x42, 0xd0, 0xfd, 0xe0, 0xef, 0x77, 0x01, 0xbd,
+ 0x01, 0x35, 0x00, 0xef,
+ 0x01, 0x10, 0x10, 0x00, 0x30, 0x24, 0x40, 0x6f, 0xfd, 0xd0, 0x13, 0x73,
+ 0x0b, 0xe0, 0x11, 0x11,
+ 0xfe, 0xdb, 0xf1, 0x00, 0xff, 0xeb, 0xde, 0xfe, 0x13, 0x32, 0x88, 0xff,
+ 0x00, 0x00, 0x76, 0xfe,
+ 0xcd, 0x35, 0xff, 0x00, 0x01, 0xde, 0x11, 0x0f, 0xce, 0x13, 0x0e, 0xee,
+ 0x01, 0x8b, 0x00, 0x43,
+ 0x00, 0xc9, 0x00, 0x43, 0x13, 0x0d, 0xdd, 0x44, 0x13, 0xdd, 0xec, 0x21,
+ 0x10, 0x11, 0x00, 0x0e,
+ 0xee, 0xe0, 0x00, 0x20, 0xd9, 0x21, 0x76, 0x1f, 0xce, 0x01, 0x42, 0x00,
+ 0x1f, 0x0f, 0xf0, 0x21,
+ 0x64, 0xed, 0xdc, 0x33, 0x32, 0xbe, 0xcd, 0x02, 0x26, 0xf0, 0xce, 0x32,
+ 0x57, 0xce, 0xfe, 0x10,
+ 0x24, 0x41, 0xdd, 0xfd, 0x53, 0x04, 0xb8, 0x00, 0x75, 0xee, 0xff, 0x11,
+ 0x11, 0x01, 0xde, 0x00,
+ 0x42, 0xf0, 0xef, 0x0f, 0x00, 0x10, 0x24, 0x11, 0xff, 0xcd, 0x11, 0x24,
+ 0x00, 0xdf, 0xcc, 0x11,
+ 0x11, 0x62, 0x02, 0xea, 0xf0, 0x1f, 0x31, 0x21, 0x00, 0x0d, 0x73, 0x24,
+ 0xfd, 0xff, 0x36, 0x43,
+ 0x00, 0xce, 0x22, 0x26, 0x0f, 0xbe, 0x00, 0x44, 0x00, 0xdb, 0xf0, 0x00,
+ 0x00, 0x52, 0x0e, 0xcb,
+ 0x01, 0x31, 0x00, 0xf0, 0x00, 0xbe, 0xfd, 0x00, 0x07, 0xf0, 0x9a, 0x42,
+ 0x01, 0xde, 0x0e, 0x42,
+ 0x02, 0x00, 0x0c, 0xd0, 0x21, 0x43, 0x10, 0x34, 0x00, 0xb9, 0x11, 0xe0,
+ 0xcd, 0x33, 0x10, 0x00,
+ 0x8c, 0xde, 0x33, 0x00, 0xff, 0x01, 0x98, 0x11, 0x23, 0xf0, 0xf0, 0xdc,
+ 0xf1, 0x12, 0x20, 0x00,
+ 0xaf, 0x0f, 0xef, 0x10, 0x02, 0x00, 0x0e, 0x40, 0x17, 0x01, 0x00, 0x60,
+ 0x00, 0xfb, 0x11, 0x65,
+ 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf0, 0xed, 0x23, 0x00, 0x0e, 0x37, 0x10,
+ 0xbc, 0x32, 0x73, 0x0f,
+ 0x0c, 0xef, 0xfd, 0x12, 0x57, 0x00, 0xce, 0x00, 0xf0, 0x00, 0x0f, 0xed,
+ 0x25, 0x33, 0xff, 0xcb,
+ 0x52, 0x00, 0x00, 0x30, 0x0e, 0xee, 0x00, 0x43, 0x44, 0xf0, 0xee, 0x73,
+ 0x07, 0x88, 0xff, 0x67,
+ 0x00, 0xac, 0x22, 0x01, 0x0f, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x0f,
+ 0x00, 0xf3, 0x00, 0x00, 0x10, 0xee, 0xf2, 0x02, 0x42, 0xc8, 0x88, 0x33,
+ 0x12, 0xcb, 0x00, 0x21,
+ 0xf0, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x20, 0x00, 0xdf, 0x0f, 0x20, 0x22,
+ 0xdf, 0x20, 0x10, 0xe0,
+ 0x64, 0x00, 0xbc, 0x00, 0x27, 0x00, 0x8b, 0x22, 0x24, 0x0e, 0xde, 0xf0,
+ 0x31, 0x22, 0xad, 0x10,
+ 0x13, 0x0f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x03, 0x34, 0xbd, 0xff, 0x01,
+ 0x14, 0xea, 0xcf, 0x20,
+ 0x32, 0xbe, 0xd8, 0x31, 0x32, 0x10, 0x40, 0xcf, 0x0f, 0x73, 0x00, 0xe0,
+ 0x11, 0x56, 0x00, 0xfe,
+ 0xef, 0x10, 0x34, 0x00, 0xbb, 0x01, 0x12, 0xf0, 0xee, 0x02, 0x23, 0xeb,
+ 0xe0, 0x22, 0x40, 0x01,
+ 0x01, 0x53, 0x0a, 0xaa, 0x31, 0x23, 0xdc, 0x00, 0x42, 0xef, 0xdc, 0x42,
+ 0x21, 0xf0, 0x00, 0x4f,
+ 0xef, 0x10, 0x32, 0x42, 0xed, 0xac, 0x24, 0x53, 0x0f, 0xdb, 0xf0, 0x10,
+ 0xef, 0xd0, 0x37, 0x00,
+ 0x9c, 0x00, 0x15, 0x0f, 0xf0, 0x00, 0x00, 0xe0, 0xef, 0x20, 0x00, 0xc0,
+ 0x75, 0xf0, 0xff, 0xff,
+ 0xed, 0x46, 0x10, 0x42, 0x01, 0xcc, 0x22, 0x11, 0x40, 0x45, 0xee, 0x88,
+ 0x22, 0x42, 0xde, 0x0f,
+ 0x00, 0x00, 0x34, 0xac, 0x00, 0x21, 0x00, 0xf0, 0x00, 0xee, 0x00, 0x35,
+ 0x0f, 0xce, 0x0f, 0x01,
+ 0x11, 0x00, 0xfe, 0x01, 0x13, 0xbb, 0xef, 0x00, 0x54, 0x01, 0xed, 0xdd,
+ 0x21, 0x66, 0xfd, 0xcd,
+ 0x10, 0x13, 0x23, 0x00, 0xca, 0x00, 0x31, 0x00, 0xf0, 0x02, 0x00, 0xed,
+ 0x12, 0x10, 0xcb, 0x44,
+ 0x00, 0xde, 0xed, 0xe0, 0x74, 0x00, 0xcb, 0x11, 0x13, 0x00, 0xfc, 0xf0,
+ 0x04, 0x20, 0x2f, 0x50,
+ 0xe1, 0xab, 0x32, 0x23, 0xdc, 0x0f, 0x23, 0xff, 0x9a, 0x12, 0x11, 0x01,
+ 0x01, 0xec, 0xce, 0x77,
+ 0x00, 0x0f, 0x10, 0xdf, 0x10, 0x30, 0xf0, 0xe1, 0xee, 0xf0, 0x11, 0xfd,
+ 0x01, 0x04, 0xf0, 0x34,
+ 0xdf, 0xdf, 0x2f, 0x1d, 0x54, 0x36, 0x20, 0xef, 0x01, 0x11, 0xfe, 0xbe,
+ 0xdf, 0xe1, 0xf1, 0xf0,
+ 0x11, 0xdd, 0x88, 0x0e, 0x10, 0x54, 0xf0, 0xf9, 0x10, 0x00, 0x1f, 0x31,
+ 0x11, 0x31, 0x03, 0x01,
+ 0x31, 0x00, 0x05, 0x23, 0x11, 0xcf, 0xfd, 0x00, 0x00, 0x03, 0x0e, 0x2b,
+ 0x41, 0x22, 0xfe, 0xc9,
+ 0x10, 0x64, 0x00, 0xce, 0x10, 0x12, 0xf0, 0xba, 0x00, 0x01, 0xec, 0xef,
+ 0x10, 0x10, 0x20, 0xef,
+ 0xed, 0x75, 0x11, 0xdd, 0x32, 0x45, 0xce, 0xf0, 0x34, 0xfe, 0xf0, 0x43,
+ 0x0e, 0x0c, 0xf0, 0x30,
+ 0x3f, 0xa9, 0x00, 0xe2, 0xf0, 0x0d, 0x34, 0xf2, 0x8f, 0xec, 0xe0, 0x27,
+ 0x01, 0x8e, 0x00, 0x02,
+ 0x0d, 0x00, 0x04, 0x0e, 0x1d, 0x0f, 0xed, 0x00, 0x22, 0x55, 0x12, 0x00,
+ 0x32, 0x55, 0x13, 0x0f,
+ 0xfe, 0x00, 0x63, 0x13, 0x04, 0xf0, 0x0c, 0x32, 0x04, 0x0e, 0x0e, 0x12,
+ 0x56, 0xfe, 0xe0, 0x35,
+ 0x53, 0x10, 0x0e, 0x00, 0xe0, 0xfd, 0x0e, 0xdc, 0x54, 0x33, 0xb9, 0xff,
+ 0xfe, 0x10, 0x21, 0xf0,
+ 0x02, 0x23, 0x50, 0xc8, 0xfb, 0x22, 0x62, 0x00, 0xcc, 0x00, 0x45, 0x00,
+ 0xbd, 0x00, 0x12, 0xf1,
+ 0xde, 0x11, 0x02, 0xee, 0x02, 0x25, 0x0f, 0x61, 0x12, 0xee, 0xf9, 0x10,
+ 0x51, 0x23, 0x32, 0xee,
+ 0xcb, 0x32, 0x24, 0x10, 0xd0, 0xdf, 0xe0, 0x20, 0xff, 0x8d, 0xf0, 0x47,
+ 0x00, 0xba, 0x00, 0x30,
+ 0x11, 0xce, 0x0e, 0xf0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xf0, 0xef, 0x0f,
+ 0xfe, 0x43, 0x57, 0xfe,
+ 0x9c, 0x13, 0x35, 0x0f, 0xdd, 0xef, 0x00, 0x02, 0x20, 0x44, 0x03, 0xdc,
+ 0x0d, 0x54, 0x25, 0xfe,
+ 0x0f, 0x41, 0x02, 0xce, 0xcc, 0x10, 0x02, 0xe0, 0x03, 0x9d, 0xc8, 0x0f,
+ 0x14, 0x02, 0xde, 0xff,
+ 0x0e, 0x9c, 0x00, 0x13, 0x34, 0x1e, 0xec, 0xd0, 0x32, 0x00, 0x00, 0x74,
+ 0x12, 0xfd, 0x03, 0x35,
+ 0x20, 0x0d, 0x22, 0x12, 0xcb, 0x0f, 0x0e, 0x03, 0xf2, 0xbd, 0x10, 0x47,
+ 0xef, 0xe0, 0xd0, 0xce,
+ 0x02, 0x77, 0xfe, 0xcb, 0x42, 0x11, 0xde, 0x2f, 0x50, 0x11, 0xfd, 0xe0,
+ 0x10, 0x0f, 0xee, 0x01,
+ 0x22, 0x54, 0x11, 0xee, 0xd8, 0x00, 0x71, 0x11, 0x0e, 0x0d, 0x22, 0x77,
+ 0xf1, 0xec, 0x01, 0x00,
+ 0x01, 0xee, 0xde, 0x01, 0xf2, 0x02, 0x04, 0xb0, 0xda, 0x01, 0x43, 0xae,
+ 0xdb, 0xf0, 0x14, 0x52,
+ 0x00, 0x0f, 0xdf, 0x02, 0x55, 0x11, 0x13, 0x0f, 0x0c, 0xe0, 0x34, 0x74,
+ 0x0f, 0xdc, 0x00, 0x10,
+ 0x20, 0x01, 0x10, 0xcd, 0xf0, 0x26, 0x0e, 0xce, 0x01, 0x43, 0x00, 0xb9,
+ 0xe0, 0x20, 0x40, 0x00,
+ 0xae, 0xfc, 0x00, 0x55, 0x00, 0xef, 0xec, 0x00, 0x02, 0xf0, 0xfd, 0xf0,
+ 0xe0, 0xfe, 0x31, 0x76,
+ 0xcd, 0xff, 0x02, 0x1e, 0xe8, 0x00, 0x43, 0x10, 0xff, 0xe0, 0xff, 0x0f,
+ 0xfe, 0xf0, 0x57, 0x21,
+ 0xbc, 0x00, 0x11, 0xff, 0x30, 0x32, 0xcc, 0xf0, 0x62, 0xf0, 0xdb, 0x63,
+ 0x12, 0x0d, 0xe0, 0xf1,
+ 0x00, 0x00, 0x12, 0x54, 0x01, 0xcb, 0xfe, 0x12, 0x23, 0xe0, 0xbf, 0x00,
+ 0x12, 0x21, 0x00, 0xe0,
+ 0xff, 0x00, 0x10, 0x30, 0x27, 0x00, 0xfe, 0xff, 0x0d, 0x0f, 0x74, 0x0f,
+ 0xea, 0xff, 0xff, 0x34,
+ 0x74, 0x00, 0xde, 0x32, 0x14, 0xbf, 0xf0, 0x27, 0x73, 0xf0, 0xdd, 0x10,
+ 0x02, 0x00, 0xde, 0xfd,
+ 0x0f, 0x0e, 0x0d, 0x00, 0x12, 0x10, 0x0c, 0x1d, 0x77, 0x53, 0xff, 0x14,
+ 0x00, 0xfe, 0xed, 0x24,
+ 0x77, 0x00, 0xdd, 0x11, 0x11, 0x23, 0x12, 0x0d, 0x45, 0x10, 0xed, 0xe1,
+ 0x65, 0x33, 0xec, 0xcd,
+ 0x11, 0x32, 0x01, 0xf0, 0xee, 0xed, 0xdc, 0xce, 0xbb, 0x13, 0x33, 0xda,
+ 0x8e, 0x00, 0x37, 0x10,
+ 0xce, 0x0f, 0x22, 0x00, 0x00, 0x02, 0x61, 0xff, 0xfd, 0x0e, 0x0c, 0x11,
+ 0x00, 0x0c, 0x53, 0xfe,
+ 0xfd, 0x37, 0x11, 0xde, 0xcf, 0xff, 0xff, 0xae, 0x05, 0x02, 0x0d, 0xcf,
+ 0x0d, 0xcf, 0x02, 0x57,
+ 0xe2, 0xc9, 0xff, 0x02, 0x42, 0x0e, 0xcd, 0xf0, 0xf3, 0xe0, 0x0e, 0x11,
+ 0xfe, 0xf0, 0x57, 0x10,
+ 0x01, 0xfe, 0x50, 0x52, 0x12, 0x12, 0x11, 0x0d, 0x00, 0x2f, 0x12, 0x23,
+ 0xdb, 0xf2, 0x37, 0x01,
+ 0xf0, 0x02, 0xfd, 0xfd, 0x76, 0x00, 0xf0, 0x10, 0x53, 0xfe, 0xdd, 0x11,
+ 0x54, 0x0c, 0xde, 0x00,
+ 0x1f, 0x0d, 0x00, 0x57, 0x01, 0xca, 0xef, 0x31, 0x65, 0x00, 0xfd, 0xf0,
+ 0x44, 0x01, 0xde, 0xde,
+ 0x21, 0x01, 0xe0, 0xbe, 0x00, 0x22, 0xf0, 0x0c, 0x60, 0x27, 0x0f, 0xed,
+ 0x22, 0x77, 0x00, 0xcc,
+ 0x01, 0x23, 0xf0, 0xbd, 0x03, 0x22, 0xd0, 0xfd, 0x23, 0x03, 0xea, 0xce,
+ 0x00, 0x33, 0x20, 0xcb,
+ 0x1f, 0x71, 0x01, 0xfe, 0xed, 0x0e, 0x0e, 0xfd, 0xe0, 0x11, 0x57, 0x04,
+ 0xee, 0x9a, 0xf0, 0x10,
+ 0x20, 0x11, 0xf0, 0xce, 0x2f, 0x30, 0xf1, 0xf0, 0xef, 0x0b, 0x13, 0x36,
+ 0x00, 0x00, 0x30, 0x11,
+ 0xd0, 0xf2, 0x42, 0xff, 0xce, 0x02, 0xfd, 0xde, 0xe2, 0xee, 0xfc, 0xf0,
+ 0xcd, 0x00, 0xf1, 0xed,
+ 0x15, 0x37, 0xbe, 0xbc, 0x00, 0x20, 0x22, 0xe0, 0x00, 0x0e, 0xfc, 0x21,
+ 0x55, 0x0f, 0x0c, 0x01,
+ 0x24, 0x1f, 0x30, 0x41, 0x12, 0x10, 0x01, 0x44, 0xe1, 0xf0, 0x11, 0xee,
+ 0xaa, 0x00, 0x03, 0x00,
+ 0xff, 0xe3, 0x0f, 0x0b, 0x10, 0x64, 0x00, 0x10, 0x3e, 0x23, 0x11, 0x0b,
+ 0x3d, 0x2f, 0x65, 0x00,
+ 0xd9, 0x0f, 0x0e, 0x2e, 0x63, 0x01, 0x0e, 0x1e, 0x52, 0x10, 0xf0, 0x06,
+ 0x33, 0xeb, 0xd0, 0xf1,
+ 0xe1, 0xe1, 0x8b, 0xf0, 0xff, 0xf0, 0x01, 0xcd, 0x01, 0x24, 0xff, 0x0f,
+ 0x27, 0x67, 0xdf, 0xef,
+ 0xef, 0x00, 0x03, 0x1f, 0xff, 0xf0, 0x14, 0x0e, 0x2f, 0x75, 0x42, 0xed,
+ 0xf0, 0x33, 0x21, 0x0f,
+ 0x1d, 0x21, 0x01, 0x22, 0x66, 0xf0, 0xbd, 0x0d, 0x01, 0xf0, 0xec, 0x02,
+ 0x24, 0xef, 0xc0, 0x0d,
+ 0xfd, 0x36, 0x01, 0x00, 0x0c, 0x0c, 0x11, 0x42, 0x00, 0xdc, 0xde, 0x00,
+ 0xf3, 0x0f, 0x5f, 0xfd,
+ 0xcd, 0x11, 0xfe, 0xdc, 0x35, 0x1f, 0xeb, 0xd0, 0x02, 0xe0, 0x10, 0x00,
+ 0xfa, 0xde, 0xff, 0xf0,
+ 0x23, 0x00, 0xfc, 0x23, 0x00, 0x01, 0x02, 0x0f, 0xf0, 0x0e, 0xf0, 0xf1,
+ 0xce, 0xed, 0xf4, 0xff,
+ 0xc8, 0x0f, 0x53, 0x01, 0x1e, 0x53, 0x17, 0x00, 0xed, 0x00, 0x75, 0x00,
+ 0xde, 0x0f, 0xf0, 0x12,
+ 0x00, 0xbe, 0xfe, 0xed, 0x13, 0x12, 0xfc, 0xde, 0x43, 0x43, 0x0a, 0x0d,
+ 0xfc, 0xf0, 0x34, 0x77,
+ 0xef, 0xdd, 0x21, 0x02, 0xdf, 0x01, 0x44, 0x00, 0x11, 0x22, 0xee, 0xef,
+ 0x23, 0x43, 0xeb, 0xcc,
+ 0xff, 0x10, 0x01, 0xcb, 0xfe, 0x10, 0x00, 0xcf, 0xdb, 0x0f, 0x71, 0x14,
+ 0x00, 0xff, 0xfd, 0x10,
+ 0x35, 0xf0, 0xb0, 0x46, 0x31, 0xcd, 0xe0, 0x12, 0x23, 0x00, 0x66, 0x34,
+ 0xdf, 0xcb, 0x31, 0x73,
+ 0x10, 0x00, 0x0f, 0xed, 0x0f, 0x00, 0x22, 0x23, 0x00, 0x88, 0xee, 0x00,
+ 0x03, 0x03, 0xef, 0xca,
+ 0x10, 0x24, 0x21, 0x00, 0xfb, 0xd0, 0x50, 0x30, 0x21, 0x1f, 0x20, 0x00,
+ 0xde, 0x0f, 0xfe, 0x0f,
+ 0x31, 0x04, 0x8e, 0x0e, 0x01, 0xf0, 0x06, 0x2f, 0xed, 0xe2, 0xe0, 0xde,
+ 0x20, 0x51, 0xef, 0xca,
+ 0xde, 0x00, 0x57, 0x03, 0xe0, 0xec, 0x00, 0x01, 0x33, 0xdd, 0xdd, 0x41,
+ 0x13, 0xed, 0xf0, 0x32,
+ 0x0e, 0xfe, 0x37, 0x67, 0xee, 0x00, 0x73, 0x33, 0xff, 0xfe, 0x23, 0x11,
+ 0xfd, 0x00, 0x33, 0xfd,
+ 0xde, 0x23, 0x57, 0x03, 0xae, 0x0f, 0x12, 0x27, 0x01, 0xf0, 0x0e, 0x52,
+ 0x00, 0xc8, 0x20, 0x50,
+ 0x00, 0x00, 0x00, 0x0d, 0x30, 0xed, 0xf0, 0x14, 0x00, 0xf0, 0xc0, 0x01,
+ 0x02, 0x21, 0xd5, 0xb0,
+ 0xdc, 0xdd, 0xed, 0xee, 0xee, 0x0f, 0x67, 0x01, 0xfc, 0x10, 0x61, 0x00,
+ 0x12, 0x47, 0x12, 0x04,
+ 0x10, 0xdc, 0x01, 0x24, 0xe0, 0xf0, 0xde, 0xcf, 0x10, 0x63, 0x0f, 0xed,
+ 0x12, 0x2f, 0xe8, 0x10,
+ 0x71, 0x01, 0xed, 0x2f, 0x74, 0xed, 0xdb, 0x22, 0x02, 0x0f, 0xca, 0xe0,
+ 0x00, 0xdf, 0x00, 0x21,
+ 0xdf, 0xcc, 0x00, 0x33, 0x21, 0xdc, 0x0e, 0x74, 0x21, 0xcc, 0x11, 0x55,
+ 0x00, 0xff, 0xf0, 0x02,
+ 0x22, 0x11, 0x0f, 0xeb, 0xe0, 0x25, 0x73, 0xed, 0xec, 0x02, 0x01, 0xcf,
+ 0xee, 0x24, 0x00, 0x89,
+ 0xff, 0x01, 0xd0, 0x10, 0x32, 0x00, 0xbd, 0x00, 0x01, 0x10, 0x11, 0x10,
+ 0x1d, 0x0c, 0xcc, 0x12,
+ 0x22, 0x00, 0x04, 0x00, 0xe1, 0x0e, 0x10, 0x37, 0x01, 0xf2, 0x33, 0x01,
+ 0x0d, 0x9a, 0x00, 0x01,
+ 0x1d, 0x0d, 0x02, 0xd4, 0x10, 0x20, 0xd0, 0xf0, 0x47, 0x00, 0xee, 0x26,
+ 0xe0, 0x9a, 0x00, 0x50,
+ 0x12, 0x0f, 0x1f, 0x20, 0x0e, 0x1f, 0x30, 0x0e, 0x20, 0x63, 0x23, 0x11,
+ 0xed, 0x0e, 0x27, 0x13,
+ 0x10, 0x0f, 0xca, 0xbf, 0xf0, 0x0e, 0xe0, 0xf0, 0xcf, 0x02, 0xdf, 0xf0,
+ 0xf6, 0xbf, 0xf0, 0x14,
+ 0x12, 0xff, 0xae, 0xf0, 0xf7, 0x01, 0x01, 0xf1, 0xbd, 0xfa, 0x20, 0x76,
+ 0x21, 0x02, 0xfe, 0xff,
+ 0x10, 0x12, 0x43, 0x32, 0xed, 0x00, 0x65, 0x0e, 0xff, 0x00, 0x12, 0xef,
+ 0x0f, 0x20, 0xdb, 0xde,
+ 0x12, 0x02, 0x0e, 0xff, 0xbc, 0xed, 0x00, 0x3f, 0xfb, 0xc0, 0x00, 0x4d,
+ 0x0b, 0xcc, 0xcd, 0x00,
+ 0x12, 0x00, 0x0e, 0xed, 0xba, 0xfe, 0x00, 0xe0, 0x01, 0x27, 0xff, 0x9b,
+ 0x00, 0x20, 0x32, 0x00,
+ 0xea, 0xb0, 0x00, 0x10, 0x72, 0x04, 0x0e, 0xcd, 0x01, 0x23, 0x00, 0x0f,
+ 0x0e, 0xfe, 0x00, 0x0e,
+ 0xcb, 0x0f, 0x22, 0x55, 0x0f, 0xff, 0x02, 0x12, 0x02, 0x17, 0x01, 0xef,
+ 0xff, 0x26, 0x00, 0x9f,
+ 0xfc, 0x00, 0xe0, 0x00, 0x50, 0xec, 0xcc, 0x22, 0x67, 0x00, 0x0e, 0xdf,
+ 0x20, 0x44, 0x00, 0xee,
+ 0xff, 0x45, 0x10, 0xee, 0xf0, 0xf1, 0x00, 0x41, 0xff, 0xef, 0x46, 0x21,
+ 0xe0, 0xfe, 0x54, 0x14,
+ 0xef, 0xcc, 0x01, 0x12, 0xae, 0xff, 0x0f, 0x1e, 0xed, 0xf0, 0x00, 0x1f,
+ 0x72, 0x26, 0xff, 0x01,
+ 0x37, 0x40, 0xf1, 0xe0, 0xf1, 0x00, 0x66, 0x11, 0xfe, 0xee, 0x40, 0x10,
+ 0x53, 0x25, 0x0f, 0x5f,
+ 0x11, 0x12, 0xfd, 0xe0, 0x24, 0x12, 0xeb, 0xce, 0xdf, 0x00, 0x16, 0xd0,
+ 0xb0, 0xcd, 0xee, 0x12,
+ 0x02, 0xed, 0x00, 0x13, 0x30, 0x1f, 0x2d, 0x0d, 0x41, 0x25, 0x21, 0xed,
+ 0xdb, 0x20, 0x52, 0xec,
+ 0xb9, 0x11, 0x43, 0xfe, 0xdc, 0x01, 0x10, 0xff, 0xde, 0x32, 0x77, 0x1f,
+ 0xcd, 0x01, 0x02, 0xfe,
+ 0xf0, 0xe0, 0xaa, 0xed, 0x00, 0x15, 0x10, 0xd0, 0xe1, 0xcd, 0xee, 0x11,
+ 0x45, 0x00, 0xcd, 0xf0,
+ 0xb0, 0xf0, 0x0e, 0x20, 0x0f, 0xff, 0x45, 0x54, 0x10, 0x10, 0x44, 0x12,
+ 0x10, 0x01, 0x02, 0x0e,
+ 0x36, 0x32, 0xce, 0x10, 0x31, 0x00, 0xd2, 0xb0, 0x10, 0x66, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x13, 0xd6, 0xc0, 0xd8, 0x86, 0xd5, 0x41, 0xd7, 0x0e, 0x11, 0x0e, 0xfb,
+ 0x21, 0x73, 0x0d, 0x0e,
+ 0x21, 0x16, 0x10, 0xc9, 0xbe, 0x01, 0x43, 0x10, 0xf0, 0xde, 0x00, 0x77,
+ 0x00, 0xef, 0xfd, 0x00,
+ 0x0d, 0x00, 0x10, 0x0e, 0x2d, 0x00, 0xd1, 0x01, 0x20, 0x00, 0xf7, 0xe1,
+ 0xf2, 0x03, 0xe1, 0xf3,
+ 0x9e, 0xed, 0x14, 0x0d, 0x01, 0x67, 0xff, 0xfe, 0x00, 0x2e, 0x0f, 0x57,
+ 0x00, 0x0f, 0xf0, 0x02,
+ 0x10, 0x00, 0x00, 0xba, 0xf0, 0x50, 0x23, 0xdf, 0xde, 0x0d, 0xfd, 0xeb,
+ 0xac, 0xf0, 0x23, 0x0d,
+ 0xa9, 0x01, 0x11, 0x10, 0x33, 0xef, 0xd9, 0x11, 0x52, 0x00, 0x20, 0x00,
+ 0xfc, 0xf0, 0x12, 0x04,
+ 0xd0, 0xdd, 0x00, 0x12, 0x24, 0xd0, 0xb2, 0x01, 0x1f, 0x0b, 0xd0, 0xbe,
+ 0xcb, 0x24, 0x32, 0xb9,
+ 0xdd, 0xf0, 0x44, 0x21, 0x00, 0xe0, 0xcb, 0x10, 0x55, 0x00, 0x0d, 0x22,
+ 0xe0, 0xaf, 0x0c, 0x11,
+ 0x43, 0xff, 0x00, 0x31, 0xe0, 0x22, 0x45, 0xfe, 0xef, 0x01, 0xe3, 0x23,
+ 0x00, 0xed, 0xcd, 0x10,
+ 0x33, 0x00, 0xda, 0xf0, 0x01, 0x00, 0x11, 0x21, 0x35, 0x30, 0x00, 0x1f,
+ 0x0f, 0xfb, 0x52, 0x63,
+ 0x0c, 0x0e, 0x32, 0x0f, 0x2a, 0xfd, 0x00, 0x30, 0xee, 0xfb, 0xf0, 0x21,
+ 0x74, 0x00, 0x00, 0x00,
+ 0xef, 0xee, 0x00, 0xf2, 0xcf, 0x0e, 0xe0, 0xaa, 0xe0, 0x01, 0xe0, 0xf6,
+ 0xb0, 0xec, 0x23, 0x45,
+ 0xe0, 0xce, 0x02, 0x11, 0x00, 0x00, 0x00, 0xdc, 0x11, 0x63, 0x00, 0x10,
+ 0x47, 0x21, 0xfe, 0xff,
+ 0x21, 0x75, 0x11, 0x0f, 0xf0, 0x02, 0x21, 0x34, 0x01, 0x89, 0xe0, 0x22,
+ 0x0f, 0xee, 0x01, 0x00,
+ 0xf0, 0x00, 0x01, 0x1d, 0x50, 0x22, 0x13, 0x02, 0xba, 0xec, 0x20, 0x77,
+ 0x0f, 0xcc, 0xf0, 0xf0,
+ 0xff, 0x00, 0x01, 0x0f, 0xdd, 0xd0, 0x10, 0x64, 0x32, 0x1f, 0xc8, 0xff,
+ 0x10, 0x52, 0x00, 0x01,
+ 0xde, 0xdc, 0xe0, 0xe0, 0x14, 0x00, 0x9c, 0x01, 0x45, 0xff, 0xed, 0x20,
+ 0x22, 0xff, 0xbb, 0x21,
+ 0x55, 0x00, 0xdd, 0x01, 0x13, 0x01, 0xdf, 0xdf, 0x01, 0x15, 0xff, 0xef,
+ 0xff, 0xd0, 0x3e, 0x40,
+ 0xbb, 0xdd, 0x33, 0x01, 0x0d, 0x00, 0x0f, 0xda, 0x02, 0x03, 0xec, 0x31,
+ 0x04, 0xcb, 0x41, 0x72,
+ 0x11, 0xfe, 0xff, 0x14, 0x00, 0xec, 0xff, 0x23, 0x34, 0xd1, 0xe0, 0xf0,
+ 0x05, 0x20, 0x00, 0x0c,
+ 0x0f, 0xfd, 0x20, 0x0f, 0xe9, 0xff, 0xdd, 0xed, 0xfe, 0xf0, 0x03, 0xf1,
+ 0xbb, 0x14, 0x37, 0x00,
+ 0xbe, 0xf1, 0x03, 0xf0, 0x30, 0x71, 0x33, 0x0e, 0x0e, 0x1f, 0x53, 0x16,
+ 0x20, 0x21, 0x24, 0xee,
+ 0xd0, 0x46, 0x11, 0xf0, 0xe0, 0xad, 0xde, 0x13, 0x47, 0xf1, 0xcf, 0xec,
+ 0x0f, 0xf0, 0x04, 0x00,
+ 0x0e, 0xf0, 0xce, 0x20, 0x54, 0xec, 0xfd, 0x55, 0x31, 0xec, 0xed, 0x32,
+ 0x43, 0xfd, 0x00, 0xbf,
+ 0xd9, 0xe0, 0x40, 0x24, 0xdd, 0xcf, 0x0f, 0xd0, 0x53, 0x44, 0x10, 0x2d,
+ 0xdf, 0x0e, 0x23, 0x11,
+ 0x23, 0xcc, 0x88, 0xfe, 0x05, 0x12, 0xff, 0xef, 0xf0, 0xd0, 0x0e, 0x20,
+ 0x45, 0x00, 0xee, 0x40,
+ 0x1d, 0x20, 0x63, 0xfe, 0xff, 0x46, 0x23, 0xef, 0x22, 0x34, 0xb0, 0xfd,
+ 0x15, 0x24, 0x10, 0xff,
+ 0x00, 0xe0, 0x00, 0x00, 0x11, 0x14, 0x30, 0x1f, 0x01, 0x31, 0x57, 0x20,
+ 0xf0, 0xe0, 0x00, 0x6e,
+ 0x27, 0x30, 0xdd, 0x11, 0x54, 0xee, 0xca, 0xde, 0xef, 0x21, 0x13, 0xe0,
+ 0xbb, 0xff, 0xf0, 0x40,
+ 0x35, 0x10, 0xec, 0xef, 0x31, 0x62, 0x00, 0xfe, 0xe0, 0xe1, 0x31, 0x21,
+ 0xe1, 0xb1, 0xf0, 0x23,
+ 0x67, 0x06, 0xd0, 0xdd, 0xf0, 0x43, 0x53, 0x10, 0x0c, 0x00, 0x02, 0x0e,
+ 0x1a, 0x20, 0x63, 0x00,
+ 0xeb, 0x00, 0x12, 0x10, 0x3f, 0xdf, 0xb0, 0x10, 0x2f, 0x03, 0xe0, 0xbb,
+ 0xfe, 0xde, 0xcf, 0xed,
+ 0xdb, 0x00, 0x0e, 0xe0, 0x56, 0x30, 0xfd, 0x01, 0x56, 0x1f, 0xfe, 0x30,
+ 0x53, 0x03, 0x21, 0xf1,
+ 0xcc, 0x01, 0xf4, 0xdf, 0xbe, 0xe0, 0xf4, 0x04, 0x0d, 0x9a, 0x22, 0x22,
+ 0x0f, 0xee, 0xfe, 0x00,
+ 0x71, 0x0f, 0xd8, 0xfe, 0x01, 0x25, 0xcf, 0xee, 0x11, 0xd1, 0xbf, 0xfe,
+ 0x00, 0x23, 0x10, 0xca,
+ 0xdf, 0x00, 0x62, 0x11, 0xff, 0x0f, 0x05, 0x21, 0x01, 0x33, 0x02, 0xbb,
+ 0xe0, 0x10, 0x33, 0xdf,
+ 0xec, 0x00, 0xdc, 0x10, 0x36, 0xf0, 0xdf, 0x01, 0xf0, 0xf0, 0x00, 0xf0,
+ 0x44, 0x33, 0xfc, 0x51,
+ 0x37, 0x10, 0x1e, 0x4e, 0x20, 0x62, 0x1e, 0x08, 0xfe, 0x31, 0x10, 0xe0,
+ 0xac, 0x31, 0x45, 0x00,
+ 0x00, 0x01, 0x0e, 0x22, 0x10, 0xbf, 0xdd, 0x0f, 0x22, 0xef, 0xa8, 0xff,
+ 0xf0, 0xf1, 0x9d, 0xfe,
+ 0xf4, 0x07, 0x21, 0xe0, 0xcd, 0xe1, 0x01, 0x13, 0x22, 0xfe, 0xde, 0x10,
+ 0x20, 0x0e, 0x40, 0x77,
+ 0x16, 0xee, 0x10, 0x30, 0x23, 0x12, 0xf1, 0xde, 0xff, 0x33, 0x02, 0xd0,
+ 0x34, 0x0f, 0xd9, 0xdf,
+ 0x00, 0x0f, 0x22, 0x55, 0x0f, 0xdc, 0x20, 0x50, 0x02, 0xab, 0x0e, 0x00,
+ 0x2e, 0xff, 0xf0, 0xe0,
+ 0xfb, 0xe0, 0x00, 0xcc, 0xbd, 0x10, 0x12, 0xf0, 0xce, 0x0f, 0x43, 0x04,
+ 0x02, 0x0d, 0xd8, 0xf0,
+ 0x10, 0x44, 0xdc, 0xcd, 0x11, 0xe0, 0xdd, 0x0e, 0x23, 0x54, 0x10, 0x21,
+ 0xe2, 0xe0, 0x2f, 0x43,
+ 0xe0, 0xc1, 0xf2, 0x01, 0x00, 0x0e, 0x12, 0x14, 0xc9, 0xcf, 0x23, 0x12,
+ 0xfd, 0x31, 0x03, 0xff,
+ 0x1f, 0x45, 0x0f, 0x89, 0x00, 0x12, 0x00, 0xed, 0xde, 0x12, 0x0f, 0xfb,
+ 0xf0, 0x11, 0x5f, 0x10,
+ 0x47, 0x22, 0x00, 0x00, 0x73, 0x04, 0x00, 0x00, 0xed, 0xed, 0x0f, 0x45,
+ 0xf0, 0xdd, 0x02, 0x67,
+ 0x00, 0x1e, 0x00, 0x0e, 0xde, 0x10, 0x24, 0x00, 0xdf, 0xcb, 0xf0, 0x15,
+ 0x30, 0xee, 0xd0, 0xcf,
+ 0x02, 0x22, 0x67, 0x22, 0x0f, 0x0f, 0x23, 0x21, 0x10, 0x74, 0x20, 0x1c,
+ 0x01, 0x00, 0x0d, 0x23,
+ 0x77, 0x01, 0xfe, 0x0d, 0x00, 0x25, 0x02, 0xce, 0xff, 0x01, 0x02, 0xb0,
+ 0x02, 0x11, 0xdd, 0xef,
+ 0xfd, 0xff, 0xdf, 0xdc, 0x12, 0x30, 0x0d, 0x37, 0xe0, 0xc0, 0x40, 0x40,
+ 0xf0, 0xeb, 0xff, 0x40,
+ 0x32, 0x00, 0xeb, 0x10, 0xed, 0xbb, 0x00, 0x0f, 0x0c, 0xff, 0xff, 0x22,
+ 0x74, 0x26, 0x00, 0x9a,
+ 0x00, 0x11, 0x33, 0xef, 0xcb, 0xef, 0x00, 0x00, 0xf0, 0xdf, 0x20, 0x01,
+ 0xbb, 0x00, 0x13, 0x10,
+ 0xf0, 0xee, 0xff, 0xf0, 0x13, 0x01, 0xee, 0x32, 0x67, 0x00, 0xce, 0x02,
+ 0x04, 0x10, 0x32, 0x24,
+ 0x00, 0xf0, 0x12, 0x35, 0xfc, 0x0f, 0x73, 0x00, 0x13, 0x26, 0xf0, 0x00,
+ 0x35, 0x00, 0x0e, 0x0e,
+ 0x75, 0x44, 0xf0, 0xec, 0xf0, 0x20, 0x32, 0x00, 0xee, 0xcd, 0xdb, 0x20,
+ 0x51, 0x00, 0xe0, 0x0c,
+ 0x00, 0x11, 0x52, 0x01, 0xfe, 0xcd, 0x00, 0x23, 0x2c, 0xfb, 0xcf, 0xc0,
+ 0x01, 0x0f, 0x2f, 0x10,
+ 0xae, 0xeb, 0x06, 0x64, 0x00, 0x00, 0xf2, 0xcf, 0x10, 0x34, 0x10, 0x13,
+ 0x00, 0xc8, 0xef, 0x20,
+ 0x52, 0x11, 0x01, 0x0d, 0x0f, 0x64, 0x14, 0xee, 0xfd, 0x00, 0x04, 0x01,
+ 0xf0, 0xde, 0xae, 0xfe,
+ 0x01, 0xed, 0xb8, 0x1e, 0x10, 0xfc, 0x01, 0x33, 0x00, 0x1f, 0x62, 0x00,
+ 0x0d, 0x12, 0x14, 0x26,
+ 0xef, 0xef, 0x00, 0xf0, 0xbd, 0xdf, 0xff, 0xcd, 0xd1, 0x04, 0x0f, 0xc8,
+ 0xf0, 0x56, 0x20, 0xff,
+ 0xd0, 0x10, 0x00, 0x0f, 0x00, 0xce, 0xad, 0xfd, 0x00, 0x00, 0x22, 0x27,
+ 0xed, 0xee, 0x34, 0x22,
+ 0x10, 0x0d, 0x21, 0x36, 0x00, 0xe0, 0x20, 0x40, 0x00, 0xfe, 0x00, 0x2f,
+ 0x0d, 0xb0, 0x35, 0x32,
+ 0xeb, 0xe0, 0x46, 0xe0, 0xdf, 0xdf, 0xcf, 0x10, 0x25, 0xf0, 0xbf, 0xde,
+ 0x01, 0x35, 0x4f, 0x0e,
+ 0x40, 0x31, 0x43, 0x31, 0x2e, 0x7c, 0x1f, 0x20, 0x16, 0x30, 0xfb, 0xdf,
+ 0x10, 0x30, 0xfe, 0x0f,
+ 0x31, 0xef, 0xee, 0x65, 0x21, 0xed, 0xe0, 0x23, 0x03, 0xdd, 0xbd, 0xf5,
+ 0xf3, 0x8a, 0xff, 0x01,
+ 0x00, 0xce, 0x00, 0x12, 0xef, 0xf3, 0x26, 0x01, 0x12, 0x21, 0x0e, 0x24,
+ 0x67, 0x00, 0xdc, 0xbe,
+ 0x0f, 0x44, 0x12, 0x00, 0xfd, 0x00, 0x33, 0x03, 0x00, 0x20, 0x1d, 0x0e,
+ 0x47, 0x77, 0x00, 0x00,
+ 0x00, 0xe0, 0xff, 0x00, 0x00, 0xfe, 0xe1, 0xf2, 0x00, 0x1d, 0x0f, 0x33,
+ 0x0d, 0xb8, 0x00, 0x52,
+ 0x12, 0x0f, 0x1e, 0x0f, 0xdf, 0xde, 0x02, 0x20, 0xbb, 0xf0, 0xff, 0xe8,
+ 0xbf, 0x00, 0x25, 0x0f,
+ 0xfd, 0x00, 0x4f, 0x20, 0x30, 0xe1, 0xff, 0x0e, 0xcd, 0xda, 0xf0, 0x53,
+ 0x47, 0xf0, 0xbd, 0x00,
+ 0xf1, 0x01, 0x00, 0xe0, 0xf0, 0xf2, 0xee, 0x1f, 0x03, 0xf0, 0xf1, 0x03,
+ 0xbd, 0xfd, 0x01, 0x12,
+ 0x10, 0x23, 0x00, 0xcb, 0x10, 0x0e, 0xfa, 0x0f, 0x3f, 0x40, 0xb0, 0xda,
+ 0x00, 0x20, 0xe1, 0xe0,
+ 0x00, 0x02, 0x17, 0x12, 0xd0, 0x0e, 0x30, 0x61, 0x01, 0x36, 0x41, 0xdc,
+ 0xee, 0x1f, 0x30, 0x10,
+ 0xdf, 0xae, 0x0d, 0x26, 0x63, 0xfe, 0xdc, 0x0f, 0xf1, 0x00, 0xef, 0xef,
+ 0x0e, 0xeb, 0x00, 0x34,
+ 0xde, 0xbc, 0x00, 0x10, 0x54, 0x24, 0xff, 0x00, 0x57, 0x00, 0x20, 0x12,
+ 0x21, 0x30, 0x43, 0xef,
+ 0xb9, 0x00, 0x31, 0x02, 0xef, 0x00, 0x21, 0xd0, 0xf4, 0x34, 0x20, 0xce,
+ 0xf2, 0x06, 0xed, 0x20,
+ 0x55, 0xd0, 0xcd, 0x1f, 0x32, 0xff, 0xcd, 0xff, 0x00, 0x02, 0xff, 0x10,
+ 0x65, 0x00, 0xea, 0x00,
+ 0x10, 0x0f, 0x50, 0x23, 0x0e, 0xfa, 0xef, 0xcd, 0xed, 0x32, 0x54, 0xdc,
+ 0xee, 0x02, 0xf3, 0x13,
+ 0x23, 0xeb, 0xef, 0x21, 0x46, 0x00, 0xcf, 0xbc, 0x0f, 0xff, 0xfd, 0x1f,
+ 0x43, 0x04, 0xef, 0x2c,
+ 0x52, 0x13, 0x02, 0xff, 0xee, 0x57, 0x24, 0xf0, 0xab, 0x00, 0x21, 0xf1,
+ 0xe0, 0xde, 0x00, 0x12,
+ 0x00, 0x02, 0x55, 0x13, 0xdd, 0x22, 0x24, 0x20, 0x30, 0x27, 0x10, 0xf0,
+ 0xef, 0x10, 0x43, 0x02,
+ 0xe0, 0xeb, 0x42, 0x44, 0xf0, 0xc0, 0x1e, 0x2e, 0x31, 0x35, 0x31, 0x0c,
+ 0xca, 0x0f, 0x10, 0x41,
+ 0x10, 0xbb, 0xdf, 0x00, 0x20, 0x52, 0x10, 0x1f, 0x01, 0xc0, 0xf0, 0x10,
+ 0xe0, 0xf0, 0x03, 0xec,
+ 0x01, 0x27, 0xd0, 0xad, 0x00, 0x04, 0x21, 0x22, 0x13, 0x00, 0x34, 0x5f,
+ 0xfb, 0x02, 0x76, 0x00,
+ 0xec, 0xfd, 0x11, 0x63, 0xff, 0xff, 0x0f, 0x0e, 0x12, 0x36, 0xcd, 0x00,
+ 0x15, 0x0f, 0xdd, 0xf0,
+ 0x00, 0x40, 0xe0, 0xbd, 0x1d, 0x0d, 0x0d, 0x0f, 0xee, 0x01, 0x11, 0x10,
+ 0x25, 0xf0, 0xfe, 0x77,
+ 0x04, 0xef, 0x00, 0x01, 0xe0, 0x1f, 0x10, 0xaf, 0xea, 0x01, 0x33, 0x1f,
+ 0xef, 0xd0, 0xfd, 0xef,
+ 0x02, 0x54, 0x20, 0xfe, 0xcb, 0x01, 0x01, 0xde, 0xfd, 0xa8, 0xfd, 0x00,
+ 0x00, 0xf0, 0x14, 0x11,
+ 0xd0, 0xf0, 0x01, 0x33, 0xe1, 0xcf, 0x00, 0x53, 0x0b, 0x0f, 0x12, 0x00,
+ 0x09, 0xf0, 0x00, 0x33,
+ 0xbc, 0xde, 0x14, 0x01, 0xf0, 0xe5, 0x22, 0xfe, 0xbd, 0x11, 0x27, 0xf0,
+ 0xdf, 0xef, 0x30, 0x63,
+ 0x00, 0xeb, 0x00, 0x31, 0x54, 0x00, 0x21, 0x1f, 0x1e, 0x1f, 0x41, 0x44,
+ 0x1f, 0x3c, 0x10, 0x0d,
+ 0x30, 0x60, 0xf8, 0xef, 0x01, 0x31, 0x10, 0x32, 0x03, 0x00, 0xce, 0xde,
+ 0xda, 0xe0, 0x31, 0xce,
+ 0x8a, 0x0f, 0x00, 0xfe, 0xf0, 0xe2, 0xf3, 0x0f, 0x01, 0x17, 0xf3, 0xd0,
+ 0x0e, 0xd0, 0x24, 0x77,
+ 0xf0, 0xa9, 0x00, 0xf0, 0x00, 0x40, 0x01, 0xe0, 0x1f, 0x23, 0x22, 0x22,
+ 0x13, 0xf1, 0xcf, 0x00,
+ 0x67, 0x12, 0xff, 0xff, 0x10, 0x1d, 0x0c, 0x00, 0x40, 0x01, 0xbb, 0x0f,
+ 0x30, 0xfe, 0xf0, 0x25,
+ 0x00, 0xe0, 0x00, 0xe0, 0xab, 0xff, 0x01, 0x0f, 0xfa, 0xc0, 0xed, 0x20,
+ 0x11, 0xcc, 0xee, 0xfe,
+ 0xef, 0x03, 0x66, 0xfe, 0xfe, 0x00, 0x00, 0x04, 0x00, 0xdb, 0xf0, 0x1f,
+ 0x0f, 0x10, 0x1e, 0x33,
+ 0x24, 0xdd, 0xe0, 0x27, 0x01, 0xd0, 0x10, 0x33, 0xd0, 0xdf, 0x0e, 0x63,
+ 0x03, 0xeb, 0xef, 0x0f,
+ 0x1f, 0x3f, 0x00, 0xbe, 0xc8, 0xff, 0x12, 0x64, 0xfd, 0xcc, 0x11, 0x26,
+ 0xf0, 0xcc, 0xe0, 0x10,
+ 0x00, 0x00, 0x01, 0x10, 0x60, 0x26, 0x11, 0x00, 0x3f, 0x01, 0x11, 0x40,
+ 0x54, 0x10, 0xfe, 0xcb,
+ 0x10, 0x33, 0xee, 0xcc, 0x31, 0x22, 0xfe, 0x01, 0xf1, 0xd0, 0x01, 0x11,
+ 0xd0, 0xd0, 0xed, 0x00,
+ 0x05, 0xf0, 0xba, 0x00, 0x20, 0x00, 0x02, 0x44, 0x62, 0x02, 0x25, 0x52,
+ 0x00, 0xeb, 0x01, 0x55,
+ 0x11, 0x1f, 0x0f, 0xde, 0xff, 0x21, 0x12, 0xfc, 0x00, 0x54, 0xf0, 0xef,
+ 0x12, 0x11, 0x02, 0xd2,
+ 0xe1, 0x02, 0x04, 0x11, 0x0f, 0xbb, 0xfd, 0xef, 0x13, 0x31, 0xec, 0xff,
+ 0x10, 0xec, 0xf1, 0x57,
+ 0x12, 0xed, 0x2f, 0x30, 0x01, 0x32, 0x11, 0x10, 0xe8, 0xcd, 0x00, 0x40,
+ 0x12, 0xbc, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf1, 0x02, 0x08, 0xae, 0x0f, 0x20, 0x32, 0xf0, 0xb8, 0xdf,
+ 0x0f, 0x30, 0xef, 0x00,
+ 0xf0, 0xd0, 0xfe, 0x03, 0x27, 0xf1, 0xbf, 0x0f, 0xf0, 0xd1, 0xef, 0x0e,
+ 0x11, 0x21, 0x10, 0xec,
+ 0x00, 0x01, 0x37, 0x53, 0x00, 0xfd, 0xe1, 0x37, 0x32, 0x22, 0x21, 0x01,
+ 0x02, 0x14, 0x1f, 0xec,
+ 0x01, 0x65, 0x11, 0x0e, 0xee, 0x42, 0x46, 0x00, 0x00, 0xdf, 0x0e, 0xf0,
+ 0x44, 0x51, 0xee, 0xd9,
+ 0xf0, 0x2f, 0x10, 0x00, 0xee, 0x0d, 0x51, 0x30, 0x11, 0x00, 0xbf, 0x0c,
+ 0x22, 0x45, 0xde, 0xbc,
+ 0x00, 0x02, 0x00, 0xdf, 0xeb, 0xf0, 0xc0, 0xe1, 0x02, 0x10, 0x21, 0x77,
+ 0x05, 0xff, 0x0f, 0x10,
+ 0x22, 0x63, 0x00, 0x0d, 0xee, 0x10, 0x03, 0x00, 0x0f, 0xfc, 0xe0, 0xf1,
+ 0x27, 0x31, 0xe1, 0xb0,
+ 0x20, 0x22, 0xed, 0xca, 0x21, 0x43, 0x0e, 0xfc, 0x0f, 0x1a, 0x00, 0x40,
+ 0x00, 0xbe, 0x00, 0x02,
+ 0xf0, 0x01, 0x47, 0x00, 0xe0, 0xc2, 0xdf, 0x00, 0xf0, 0xaa, 0x0f, 0x0f,
+ 0x01, 0xf0, 0xcd, 0x0e,
+ 0xe1, 0xe0, 0xbc, 0x13, 0x11, 0xeb, 0xdf, 0xdd, 0xde, 0x21, 0x43, 0x0f,
+ 0xcd, 0xeb, 0x00, 0x24,
+ 0x54, 0x11, 0xed, 0x02, 0x77, 0x11, 0xff, 0xfd, 0x22, 0x31, 0x00, 0x00,
+ 0x73, 0x1c, 0xfd, 0xfe,
+ 0x1f, 0x0e, 0xef, 0xf5, 0xe0, 0xdc, 0xbe, 0x03, 0x05, 0xdf, 0xb0, 0x00,
+ 0x14, 0x03, 0xef, 0xd9,
+ 0x00, 0x43, 0x52, 0x0f, 0xe9, 0x00, 0x71, 0x20, 0x00, 0x45, 0x00, 0xec,
+ 0x20, 0x52, 0x21, 0x00,
+ 0x0f, 0x10, 0x21, 0x00, 0xcc, 0x0c, 0xf0, 0x02, 0x20, 0x30, 0xde, 0xbb,
+ 0x11, 0x33, 0xf0, 0xf1,
+ 0xef, 0xe0, 0xd0, 0xc0, 0x01, 0x0d, 0xcf, 0x06, 0xb0, 0xcb, 0x02, 0x03,
+ 0x00, 0x00, 0x01, 0xdc,
+ 0xcb, 0x43, 0x64, 0x00, 0xdb, 0x10, 0x10, 0x10, 0x11, 0x12, 0xf1, 0xde,
+ 0x22, 0x77, 0x12, 0xe0,
+ 0x00, 0x11, 0x31, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x51, 0x12, 0x1e, 0x12,
+ 0x03, 0xe9, 0x11, 0x33,
+ 0xdf, 0x00, 0x12, 0x15, 0xf0, 0xfb, 0xe0, 0x01, 0x10, 0x0e, 0xeb, 0xde,
+ 0x10, 0x12, 0xdf, 0xfd,
+ 0xee, 0xdd, 0xf0, 0x0f, 0x0d, 0x45, 0x30, 0xfd, 0x0d, 0x3d, 0xf8, 0x10,
+ 0x41, 0x00, 0xbd, 0xee,
+ 0x03, 0x03, 0x0f, 0x8b, 0xf1, 0xf6, 0xe0, 0x01, 0x02, 0xd0, 0x2f, 0x42,
+ 0xf0, 0xef, 0x2d, 0x76,
+ 0x20, 0xd9, 0xff, 0x10, 0x01, 0xe0, 0xae, 0xfd, 0xe1, 0x01, 0xc0, 0xfd,
+ 0xf0, 0x04, 0xf0, 0x00,
+ 0x00, 0x20, 0xf0, 0xe0, 0x1f, 0x7f, 0x12, 0x0f, 0xec, 0x37, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc3, 0x13, 0x6f, 0x19, 0xad, 0x14, 0x19, 0x1a, 0x00, 0x67, 0x11, 0x20,
+ 0xed, 0xdc, 0x00, 0x10,
+ 0x1f, 0xfb, 0x01, 0x11, 0xde, 0xee, 0x02, 0x0e, 0xb8, 0x00, 0x13, 0x10,
+ 0x0e, 0xff, 0xab, 0x10,
+ 0x13, 0x0c, 0x1f, 0x20, 0x14, 0xe0, 0xf0, 0x01, 0x14, 0x67, 0x21, 0xd0,
+ 0xed, 0x21, 0x54, 0x00,
+ 0x01, 0x0f, 0x0c, 0xe0, 0x00, 0x12, 0x61, 0x01, 0xdf, 0x13, 0x26, 0x00,
+ 0xf0, 0x17, 0x01, 0xb0,
+ 0x0f, 0x12, 0x01, 0xce, 0xdd, 0x10, 0x44, 0x1e, 0xdb, 0xef, 0x51, 0x00,
+ 0xe9, 0x00, 0x33, 0x40,
+ 0x00, 0x0f, 0xde, 0x0f, 0x65, 0x24, 0x0e, 0xac, 0x00, 0x10, 0x00, 0xef,
+ 0xde, 0x0f, 0x0d, 0xfe,
+ 0xe0, 0x22, 0x33, 0x0f, 0xe8, 0x3f, 0x30, 0x11, 0x20, 0x43, 0x20, 0x00,
+ 0xef, 0xfe, 0xff, 0x01,
+ 0x04, 0xe0, 0xbe, 0xee, 0x00, 0x01, 0x32, 0x33, 0x24, 0xde, 0xba, 0x21,
+ 0x53, 0x00, 0xfa, 0xf0,
+ 0x15, 0x00, 0xce, 0xf0, 0xf2, 0xe2, 0xd0, 0x10, 0x34, 0xf1, 0xf4, 0x42,
+ 0x00, 0xed, 0x42, 0x57,
+ 0xf1, 0xe0, 0x51, 0x21, 0x0f, 0x00, 0x03, 0x0f, 0xec, 0x00, 0x31, 0x30,
+ 0x1b, 0x20, 0x11, 0xfb,
+ 0x0f, 0x3e, 0x0d, 0xed, 0xea, 0x20, 0x56, 0xef, 0xbd, 0x11, 0x12, 0x0f,
+ 0xe0, 0xf1, 0x00, 0xfe,
+ 0x00, 0x00, 0x2d, 0x57, 0xf1, 0xad, 0x0f, 0x01, 0x21, 0x03, 0x47, 0x04,
+ 0xdd, 0x0f, 0x31, 0x23,
+ 0xfe, 0x0e, 0x72, 0x0f, 0xdc, 0x23, 0x22, 0x0b, 0xe0, 0x32, 0x11, 0x0e,
+ 0xde, 0x00, 0x14, 0x00,
+ 0xdc, 0xde, 0x1f, 0x61, 0x10, 0x0d, 0xff, 0x0f, 0x0c, 0xfc, 0x10, 0x24,
+ 0xe1, 0xac, 0x0e, 0x37,
+ 0x47, 0xf0, 0xd0, 0xff, 0x11, 0x21, 0x21, 0x00, 0xbc, 0x00, 0xe0, 0xe1,
+ 0x00, 0x30, 0xcd, 0xcc,
+ 0xdd, 0xf0, 0x03, 0xdd, 0xee, 0x00, 0x10, 0x0d, 0x01, 0x04, 0xfe, 0xfe,
+ 0x20, 0x02, 0xf9, 0xe0,
+ 0x10, 0x22, 0xf1, 0xd3, 0x00, 0xeb, 0xfe, 0xf2, 0x14, 0x53, 0x0d, 0x0d,
+ 0x20, 0x2e, 0x0c, 0x30,
+ 0x00, 0xe1, 0xd0, 0xd0, 0xec, 0xd0, 0x07, 0xf4, 0xa0, 0xdc, 0x02, 0x04,
+ 0xff, 0xed, 0x10, 0x32,
+ 0x10, 0x30, 0x40, 0x30, 0x0c, 0x3f, 0x54, 0x57, 0x01, 0xed, 0x00, 0x24,
+ 0x51, 0x01, 0x0f, 0x1f,
+ 0x20, 0x0f, 0x52, 0x1f, 0xe8, 0x0a, 0x22, 0x40, 0xf0, 0xdf, 0xde, 0x01,
+ 0x54, 0xde, 0xbd, 0x12,
+ 0x14, 0x00, 0xde, 0xee, 0xe0, 0xb0, 0xdc, 0xcc, 0xde, 0x01, 0x47, 0xf0,
+ 0xbe, 0x00, 0x0f, 0x00,
+ 0xe2, 0x32, 0x54, 0xef, 0xce, 0x00, 0x45, 0xf0, 0xed, 0x00, 0x26, 0x20,
+ 0x31, 0x12, 0x02, 0x41,
+ 0x00, 0xe0, 0x01, 0x63, 0x12, 0x00, 0x1f, 0x21, 0x10, 0x0e, 0xfc, 0x00,
+ 0x0c, 0xec, 0xee, 0x10,
+ 0x77, 0x05, 0x0d, 0xdf, 0xf0, 0xf0, 0xf1, 0xf0, 0xee, 0xec, 0xdf, 0xef,
+ 0xfe, 0x00, 0xfe, 0xea,
+ 0xed, 0x0d, 0xff, 0x31, 0x32, 0xff, 0xec, 0xfe, 0x0c, 0x00, 0xe0, 0x10,
+ 0x47, 0x01, 0xbf, 0xfe,
+ 0x01, 0x11, 0xd0, 0xe2, 0x26, 0x32, 0xe0, 0xcd, 0x13, 0x57, 0xff, 0x0e,
+ 0x10, 0x62, 0x11, 0x1f,
+ 0xfd, 0xcc, 0xfe, 0xff, 0xeb, 0xab, 0xff, 0x03, 0x03, 0xd9, 0xbf, 0x01,
+ 0x01, 0x00, 0x10, 0x01,
+ 0x23, 0x31, 0x21, 0x40, 0x2f, 0x0c, 0x32, 0x57, 0x12, 0x20, 0xeb, 0x00,
+ 0x72, 0x02, 0x00, 0x33,
+ 0x0f, 0xed, 0x13, 0x00, 0xfd, 0xee, 0xde, 0xee, 0x00, 0xee, 0xc9, 0xff,
+ 0x22, 0x31, 0xcc, 0xff,
+ 0x10, 0x24, 0x34, 0x00, 0x00, 0x11, 0x22, 0x33, 0xd1, 0xe0, 0x04, 0x77,
+ 0x12, 0x0f, 0xfd, 0x02,
+ 0x20, 0x0c, 0x76, 0x32, 0xed, 0xdd, 0x21, 0x32, 0x13, 0x00, 0xdd, 0x02,
+ 0x47, 0xf2, 0xc0, 0x0f,
+ 0x02, 0xd0, 0xd0, 0x00, 0x10, 0x02, 0xfc, 0xff, 0x20, 0x11, 0x0d, 0xfa,
+ 0x00, 0x2f, 0x1f, 0x10,
+ 0x14, 0x24, 0x34, 0x01, 0xdf, 0xff, 0x22, 0x13, 0xfe, 0xde, 0x20, 0x30,
+ 0xe8, 0xaf, 0x0d, 0x0f,
+ 0x0f, 0xed, 0xec, 0xfe, 0x31, 0x35, 0x0e, 0xce, 0x0e, 0x51, 0x00, 0xdc,
+ 0x00, 0x35, 0x0f, 0xea,
+ 0xf0, 0x0f, 0xbf, 0xee, 0x01, 0x25, 0xd0, 0xcc, 0xf0, 0x33, 0x42, 0xdf,
+ 0xf0, 0x22, 0x21, 0x00,
+ 0x0c, 0x0e, 0xe0, 0x07, 0x22, 0xad, 0x00, 0x05, 0x13, 0x0f, 0xd1, 0x16,
+ 0x21, 0x12, 0x21, 0x01,
+ 0x01, 0x21, 0x31, 0x32, 0x21, 0x3f, 0x0e, 0xfe, 0x06, 0x41, 0x1e, 0xfe,
+ 0xdd, 0x0f, 0x25, 0x44,
+ 0x0e, 0xfb, 0x10, 0x32, 0x00, 0x0e, 0xc8, 0xf0, 0x50, 0x10, 0xcd, 0xff,
+ 0x20, 0x22, 0xff, 0xdf,
+ 0x00, 0x0f, 0x00, 0xe2, 0x0e, 0xee, 0x24, 0x04, 0x0f, 0xf0, 0xff, 0x0f,
+ 0x20, 0x16, 0x00, 0xff,
+ 0xff, 0xf0, 0x67, 0x35, 0xff, 0xef, 0xf0, 0x10, 0x34, 0x00, 0xff, 0xfe,
+ 0x33, 0x03, 0xcb, 0xed,
+ 0x33, 0x54, 0xfe, 0xfc, 0x00, 0x20, 0x21, 0x40, 0x11, 0x13, 0xde, 0xd9,
+ 0xf0, 0x0f, 0x01, 0xd0,
+ 0xaa, 0xf0, 0x24, 0x11, 0xf0, 0xf0, 0x00, 0x30, 0x13, 0xe0, 0xcd, 0xec,
+ 0xef, 0xf0, 0xfc, 0xbb,
+ 0xdd, 0xe0, 0xf0, 0xef, 0xb8, 0xf0, 0xf0, 0xe0, 0xee, 0x11, 0x65, 0x0f,
+ 0xee, 0x25, 0x41, 0xff,
+ 0xe0, 0x21, 0x00, 0xeb, 0x31, 0x65, 0x00, 0xff, 0x0f, 0x10, 0x0e, 0x30,
+ 0x72, 0x22, 0x0f, 0x10,
+ 0x22, 0x00, 0xdd, 0xe0, 0xae, 0xd9, 0x00, 0xcf, 0xff, 0xd0, 0xe0, 0xcf,
+ 0xf0, 0x03, 0x22, 0x0f,
+ 0x30, 0x33, 0x32, 0x12, 0x77, 0x10, 0x0e, 0x0f, 0x11, 0x34, 0x31, 0xf2,
+ 0xea, 0xde, 0x31, 0x54,
+ 0x20, 0x30, 0x10, 0x3e, 0x62, 0x35, 0xfe, 0xb9, 0x00, 0x33, 0x20, 0xde,
+ 0xdf, 0x10, 0x00, 0xf0,
+ 0x01, 0xcd, 0x1f, 0x35, 0xaf, 0xed, 0x03, 0x37, 0xdf, 0x99, 0x00, 0xf0,
+ 0x03, 0x0f, 0xe0, 0x01,
+ 0xef, 0x0e, 0x1f, 0x21, 0x46, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xd1, 0xe0,
+ 0x20, 0x03, 0xdd, 0x12,
+ 0x27, 0x01, 0x33, 0x20, 0x0e, 0x00, 0x42, 0x40, 0x43, 0x37, 0x40, 0xef,
+ 0xec, 0x21, 0x55, 0x00,
+ 0xcd, 0xff, 0x02, 0x36, 0x11, 0xef, 0xbf, 0x00, 0xf2, 0x01, 0x01, 0x10,
+ 0x0b, 0xdf, 0x1f, 0x1f,
+ 0xea, 0x00, 0x61, 0x00, 0x0b, 0xe0, 0x30, 0x0f, 0xac, 0xee, 0x12, 0x01,
+ 0xec, 0x00, 0x73, 0x00,
+ 0xbe, 0x00, 0xf1, 0xfc, 0xef, 0x12, 0x27, 0x00, 0xd0, 0x00, 0x02, 0xfd,
+ 0x00, 0x35, 0x2e, 0x10,
+ 0x45, 0xee, 0xec, 0x00, 0xe2, 0xcf, 0xb9, 0xdf, 0xe0, 0xe0, 0xc0, 0xf0,
+ 0xbd, 0xfe, 0x03, 0x47,
+ 0x31, 0x10, 0x0e, 0x00, 0x64, 0x00, 0x2d, 0x10, 0x1e, 0xfe, 0x11, 0x36,
+ 0x01, 0xff, 0xf0, 0xd0,
+ 0xf1, 0x35, 0x21, 0xd0, 0xfd, 0x73, 0x12, 0xe8, 0xdc, 0x00, 0x2f, 0x0e,
+ 0x0f, 0x3e, 0xd0, 0xc0,
+ 0x10, 0x0f, 0xff, 0x47, 0x04, 0x8e, 0x0e, 0x03, 0x02, 0x10, 0x00, 0x02,
+ 0xda, 0xe0, 0x30, 0x76,
+ 0x20, 0x1f, 0x0d, 0xdf, 0x43, 0x37, 0x20, 0x00, 0xd0, 0x00, 0x23, 0x01,
+ 0xb0, 0x0f, 0xf2, 0xf1,
+ 0xce, 0x00, 0x17, 0x00, 0xbf, 0xfe, 0x0f, 0x00, 0x42, 0x21, 0x20, 0x46,
+ 0x30, 0xef, 0xed, 0x33,
+ 0xff, 0xca, 0xf0, 0xff, 0x22, 0x24, 0x00, 0x10, 0x10, 0xf2, 0x02, 0x20,
+ 0xf9, 0xe0, 0x52, 0x21,
+ 0xb9, 0xdf, 0x20, 0x20, 0xfe, 0xac, 0x11, 0x12, 0xfd, 0xfd, 0x24, 0x20,
+ 0xef, 0x0e, 0x21, 0x56,
+ 0x11, 0xff, 0xcd, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xf2, 0xf0, 0xfe, 0xed,
+ 0x22, 0x62, 0x00, 0x37,
+ 0x02, 0x00, 0x0e, 0xfe, 0x12, 0x03, 0xcb, 0xce, 0xf2, 0xd5, 0xe1, 0xf1,
+ 0xdf, 0xce, 0xef, 0x07,
+ 0x57, 0x20, 0xf0, 0x11, 0x70, 0x22, 0x10, 0x01, 0x0f, 0x2f, 0x10, 0x11,
+ 0xf0, 0x14, 0x1f, 0xb8,
+ 0x00, 0x22, 0xf0, 0xae, 0x1f, 0x33, 0x41, 0x0f, 0xd9, 0x0f, 0x30, 0x31,
+ 0xff, 0xdc, 0x10, 0x21,
+ 0x02, 0xfe, 0xec, 0x33, 0x43, 0xde, 0xac, 0x00, 0x23, 0x0f, 0x10, 0x02,
+ 0xed, 0xdb, 0xf0, 0x03,
+ 0x37, 0x10, 0x10, 0x00, 0xfe, 0xf1, 0x14, 0x20, 0x20, 0x23, 0x32, 0x12,
+ 0x0e, 0x0e, 0x10, 0xfd,
+ 0xe9, 0x00, 0x0f, 0x30, 0xf2, 0xcc, 0xee, 0x20, 0x74, 0x11, 0x0e, 0x14,
+ 0x02, 0xfe, 0x1d, 0x42,
+ 0x26, 0xff, 0xdc, 0x01, 0x03, 0x16, 0x00, 0x11, 0x00, 0xc0, 0xf2, 0x24,
+ 0x11, 0xde, 0xbc, 0xef,
+ 0xff, 0xeb, 0xee, 0x00, 0xed, 0xee, 0x31, 0xf2, 0xbe, 0xfd, 0xff, 0xed,
+ 0xfe, 0x01, 0x07, 0xf0,
+ 0xdd, 0xf0, 0x03, 0x00, 0xeb, 0x0e, 0x20, 0x20, 0x73, 0x13, 0x0b, 0x00,
+ 0x01, 0x23, 0x12, 0x32,
+ 0x13, 0x01, 0xac, 0x0f, 0x24, 0x00, 0xce, 0xec, 0xed, 0xcd, 0xcd, 0xf0,
+ 0x06, 0x00, 0x88, 0x00,
+ 0x15, 0x21, 0xff, 0xff, 0x32, 0x20, 0x00, 0x42, 0x00, 0x0d, 0x20, 0x60,
+ 0x00, 0x0f, 0x12, 0x00,
+ 0x0d, 0x57, 0x21, 0xf0, 0x0f, 0x23, 0x66, 0x20, 0x0f, 0xed, 0xff, 0x30,
+ 0x63, 0x0d, 0xd8, 0x0f,
+ 0x40, 0xf2, 0xbc, 0x0f, 0x31, 0xd2, 0xce, 0x0f, 0xd0, 0x00, 0xf1, 0xd0,
+ 0xfc, 0xdd, 0xdc, 0x00,
+ 0x0e, 0x01, 0xf3, 0xef, 0x0d, 0x0e, 0xff, 0x27, 0x02, 0xf0, 0xf3, 0x13,
+ 0xee, 0xbf, 0xf1, 0x02,
+ 0xff, 0x00, 0x47, 0x00, 0x0d, 0x13, 0x11, 0x1e, 0x50, 0x47, 0x21, 0x33,
+ 0x21, 0xbc, 0xfc, 0x21,
+ 0x36, 0x10, 0xde, 0xef, 0xe0, 0xef, 0x22, 0x23, 0xef, 0xcd, 0x00, 0x02,
+ 0x25, 0x0f, 0x0c, 0x22,
+ 0x00, 0x88, 0xfc, 0x11, 0x20, 0xef, 0xfe, 0x10, 0xee, 0xdf, 0x0f, 0xe0,
+ 0xef, 0xee, 0x22, 0x02,
+ 0xbc, 0x00, 0x27, 0x01, 0xb0, 0x11, 0x00, 0xea, 0xf0, 0x63, 0x00, 0x00,
+ 0x10, 0x45, 0xee, 0x0c,
+ 0x42, 0x35, 0xe0, 0x0e, 0x00, 0xe1, 0xe0, 0xbc, 0xce, 0x00, 0xdf, 0xbb,
+ 0xf0, 0x00, 0xdf, 0xdb,
+ 0xf0, 0x01, 0x11, 0x63, 0x21, 0x02, 0x42, 0x34, 0x00, 0x12, 0x21, 0x2c,
+ 0x0c, 0x13, 0x67, 0x00,
+ 0xce, 0x00, 0x01, 0x04, 0x20, 0xfc, 0xf0, 0x10, 0x42, 0x1f, 0xea, 0xff,
+ 0x10, 0x40, 0xeb, 0xcf,
+ 0x52, 0x03, 0xfd, 0xde, 0x23, 0x02, 0xd4, 0xe4, 0x03, 0xcd, 0x0d, 0x10,
+ 0x47, 0x32, 0x00, 0xda,
+ 0x30, 0x73, 0x22, 0x11, 0x0f, 0x0e, 0x03, 0x43, 0xf0, 0x03, 0x01, 0x02,
+ 0x47, 0x11, 0xf0, 0xac,
+ 0x00, 0x03, 0x0e, 0xcd, 0x00, 0x0f, 0xf1, 0x13, 0x01, 0x00, 0x33, 0x0d,
+ 0x00, 0x25, 0x2f, 0xfd,
+ 0x20, 0x25, 0x10, 0x32, 0x0f, 0xb8, 0x00, 0x13, 0x33, 0x0f, 0xef, 0x01,
+ 0x14, 0xee, 0xe0, 0x23,
+ 0x10, 0xd9, 0xde, 0xfe, 0xef, 0x0e, 0x1e, 0x3d, 0x0d, 0xfd, 0x0d, 0x20,
+ 0x0e, 0xec, 0x11, 0x42,
+ 0xdb, 0xf0, 0x1f, 0x10, 0xe0, 0xdf, 0x00, 0x0a, 0xcc, 0xf0, 0x00, 0x20,
+ 0x10, 0x33, 0xfd, 0xdb,
+ 0x02, 0x35, 0x33, 0x00, 0xe2, 0x33, 0xef, 0xab, 0xe0, 0x00, 0x03, 0xed,
+ 0xd1, 0x17, 0x24, 0x00,
+ 0xcd, 0xe0, 0x04, 0x02, 0x34, 0x73, 0x12, 0x11, 0x00, 0x34, 0x20, 0x0e,
+ 0xcc, 0x00, 0x42, 0x10,
+ 0x0c, 0xc0, 0x02, 0x01, 0xfe, 0xfd, 0x00, 0x05, 0x31, 0x10, 0xc8, 0xfd,
+ 0x31, 0x73, 0x0f, 0xec,
+ 0x10, 0x40, 0xfd, 0xed, 0x20, 0x31, 0x00, 0xdd, 0xde, 0x23, 0x01, 0x0e,
+ 0xf2, 0x35, 0x00, 0xab,
+ 0xff, 0xf0, 0x12, 0x35, 0x20, 0xf0, 0x01, 0xe0, 0x10, 0x52, 0x07, 0x00,
+ 0x00, 0x00, 0x24, 0x00,
+ 0x0f, 0x11, 0x00, 0xe0, 0xc8, 0xef, 0x10, 0x10, 0x0f, 0x00, 0x01, 0x00,
+ 0x62, 0x15, 0x10, 0x00,
+ 0xfb, 0x00, 0x15, 0x32, 0xf0, 0xbc, 0xed, 0x12, 0x54, 0x01, 0xcd, 0x20,
+ 0x21, 0xef, 0xee, 0xf2,
+ 0xd3, 0xcb, 0xff, 0x11, 0xbd, 0xb8, 0xed, 0x03, 0x00, 0xab, 0x00, 0x01,
+ 0xdf, 0xfe, 0x22, 0x11,
+ 0xff, 0xfe, 0x00, 0x0d, 0xfd, 0x67, 0x44, 0x0f, 0x0e, 0x02, 0x10, 0x1e,
+ 0x44, 0x23, 0x11, 0x0c,
+ 0xfd, 0x22, 0x67, 0x0f, 0xfe, 0x10, 0x30, 0xe0, 0xab, 0x00, 0x01, 0xde,
+ 0xfe, 0xb0, 0xf0, 0xf0,
+ 0xbe, 0xe9, 0x02, 0x26, 0x00, 0xce, 0x21, 0x22, 0x20, 0x20, 0x20, 0x11,
+ 0x00, 0x6f, 0x20, 0x00,
+ 0x10, 0x27, 0x11, 0x00, 0x00, 0x42, 0x33, 0xdd, 0x30, 0x77, 0x34, 0x0d,
+ 0xed, 0x01, 0x31, 0x00,
+ 0x40, 0x1e, 0xec, 0xbd, 0x02, 0x13, 0x10, 0xde, 0xbb, 0xfe, 0xe0, 0xfe,
+ 0xf0, 0x07, 0x00, 0x00,
+ 0x0e, 0xca, 0xd0, 0x01, 0x01, 0xee, 0xd0, 0x00, 0xd1, 0xf1, 0x01, 0xe0,
+ 0xf1, 0xe2, 0xd0, 0xf2,
+ 0x24, 0x61, 0x00, 0x20, 0x11, 0x0f, 0xea, 0x20, 0x63, 0x24, 0x11, 0x00,
+ 0x1d, 0x22, 0x47, 0x22,
+ 0x0f, 0x00, 0x00, 0xf3, 0x13, 0x13, 0xdb, 0xef, 0x46, 0x12, 0x00, 0x00,
+ 0x32, 0x0f, 0x0e, 0x24,
+ 0x01, 0xcd, 0xfd, 0x40, 0x00, 0xb8, 0x0c, 0x62, 0xf0, 0xec, 0xff, 0x0f,
+ 0xff, 0xde, 0x00, 0x13,
+ 0x00, 0xbc, 0x01, 0x10, 0xee, 0xe0, 0x01, 0x1d, 0x10, 0x00, 0xdd, 0x0d,
+ 0x1d, 0x01, 0x57, 0x06,
+ 0xbe, 0xed, 0x12, 0x34, 0xdf, 0xef, 0x00, 0xf1, 0xe0, 0xce, 0xde, 0xee,
+ 0x0e, 0xcc, 0xdf, 0x10,
+ 0xff, 0xa9, 0xff, 0x00, 0x25, 0x10, 0x20, 0x11, 0x21, 0x23, 0x43, 0x31,
+ 0x00, 0x1d, 0x0c, 0xff,
+ 0x20, 0x12, 0xef, 0xcc, 0x01, 0x35, 0x20, 0xda, 0xf0, 0x42, 0x21, 0xfd,
+ 0x0d, 0x10, 0xfe, 0xf0,
+ 0x00, 0x20, 0x0f, 0x00, 0xa0, 0xdb, 0x0f, 0xff, 0xfe, 0xf1, 0x02, 0xfc,
+ 0x0f, 0x13, 0x77, 0x12,
+ 0x0d, 0x0e, 0x00, 0x43, 0x25, 0x20, 0x02, 0x03, 0x00, 0xdf, 0xef, 0xf2,
+ 0x06, 0x00, 0xd0, 0xf2,
+ 0x23, 0x10, 0x00, 0x04, 0x10, 0xf0, 0xdb, 0xee, 0x00, 0x20, 0xf1, 0x07,
+ 0x10, 0xe0, 0xde, 0x0f,
+ 0x21, 0x53, 0x00, 0xfd, 0x17, 0x51, 0xee, 0x0d, 0x23, 0x64, 0xff, 0x00,
+ 0x03, 0x22, 0xfb, 0xef,
+ 0x13, 0x01, 0xe9, 0x02, 0x42, 0xbc, 0xfc, 0x01, 0x22, 0x1e, 0xfc, 0xf0,
+ 0xef, 0x0e, 0x00, 0x00,
+ 0xf0, 0xf0, 0xf0, 0xeb, 0x0f, 0x3f, 0xf1, 0x02, 0x0d, 0x2d, 0x41, 0x11,
+ 0x0e, 0x2e, 0x43, 0x15,
+ 0xff, 0xfd, 0x05, 0x41, 0x00, 0xf1, 0xe3, 0x01, 0xfe, 0xfe, 0xbe, 0x00,
+ 0xf1, 0xed, 0xcb, 0x04,
+ 0xe5, 0xd0, 0xef, 0x01, 0x24, 0xdf, 0x04, 0x53, 0xff, 0xff, 0x12, 0x55,
+ 0x20, 0x00, 0x2f, 0x11,
+ 0x21, 0xf0, 0xff, 0xfd, 0x10, 0x27, 0x02, 0xfd, 0xbc, 0x23, 0x43, 0x0f,
+ 0x0c, 0x0e, 0x3e, 0x2f,
+ 0x41, 0x10, 0x0e, 0x3c, 0x20, 0x22, 0xd9, 0xde, 0xf0, 0x00, 0xe0, 0xde,
+ 0xdc, 0xce, 0xf0, 0x47,
+ 0x32, 0xf0, 0xdb, 0x30, 0x42, 0x10, 0x12, 0x22, 0x00, 0xfe, 0xe0, 0xf3,
+ 0x17, 0xfe, 0xbf, 0x00,
+ 0x22, 0x22, 0x1f, 0x0b, 0x00, 0x46, 0x20, 0xed, 0xdc, 0x30, 0x73, 0x00,
+ 0xde, 0x02, 0x21, 0x0e,
+ 0x00, 0x77, 0xf2, 0xff, 0x23, 0x44, 0xfe, 0xeb, 0x00, 0x23, 0x30, 0x21,
+ 0x45, 0x00, 0xa0, 0x00,
+ 0x23, 0xf0, 0xad, 0x00, 0xfe, 0xf1, 0xe0, 0xfb, 0xef, 0xed, 0xca, 0xee,
+ 0xee, 0xee, 0xf1, 0x00,
+ 0xfd, 0x00, 0x02, 0xf0, 0xef, 0xfd, 0x02, 0x45, 0x0f, 0x0c, 0x43, 0x12,
+ 0x0b, 0x2e, 0x52, 0x02,
+ 0x00, 0x12, 0x0e, 0x0f, 0x03, 0x02, 0xde, 0x0e, 0x25, 0xf0, 0x9d, 0x03,
+ 0x35, 0x0f, 0xcc, 0xf0,
+ 0xf1, 0xce, 0x0d, 0xf1, 0x01, 0x00, 0xf0, 0xd0, 0xf0, 0xff, 0x32, 0x57,
+ 0x02, 0x32, 0x10, 0x0d,
+ 0xf0, 0x56, 0x20, 0xff, 0xff, 0x20, 0x45, 0x10, 0x0f, 0xee, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc5, 0x14, 0x33, 0x1d, 0x1f, 0x14, 0x13, 0x1c, 0x32, 0x54, 0x22, 0x00,
+ 0x0e, 0x0f, 0x1e, 0x0d,
+ 0xfc, 0x21, 0x33, 0xcb, 0xcc, 0xef, 0x00, 0xef, 0xcb, 0xfd, 0xde, 0x0e,
+ 0x44, 0x34, 0x00, 0xfb,
+ 0xdf, 0x11, 0x13, 0xbe, 0xde, 0xee, 0xe0, 0xd1, 0xe6, 0xd0, 0xbb, 0xf0,
+ 0x04, 0x22, 0x10, 0x0e,
+ 0x00, 0x20, 0x74, 0x1f, 0xfd, 0x00, 0x43, 0x02, 0x15, 0x01, 0xed, 0xdc,
+ 0x44, 0x35, 0xdf, 0xef,
+ 0x00, 0x55, 0x31, 0x00, 0x00, 0x11, 0x0f, 0x0f, 0x57, 0x21, 0xfe, 0xdc,
+ 0x22, 0x22, 0xf0, 0xbc,
+ 0x00, 0xff, 0xdf, 0x0d, 0x0e, 0xed, 0x00, 0xfe, 0xca, 0xf0, 0xe0, 0xff,
+ 0xec, 0xd0, 0x0f, 0xf0,
+ 0xc0, 0xea, 0x00, 0x20, 0x00, 0x0d, 0x44, 0x45, 0xfe, 0xed, 0x42, 0x56,
+ 0x00, 0x01, 0x01, 0xc0,
+ 0x10, 0x11, 0x00, 0x9c, 0xfd, 0x00, 0xed, 0xed, 0x00, 0x10, 0x00, 0xdd,
+ 0xc8, 0xdf, 0xf0, 0x00,
+ 0x00, 0xfe, 0xd1, 0x03, 0x00, 0x12, 0x01, 0x32, 0x23, 0x43, 0x25, 0x00,
+ 0xfc, 0x00, 0x76, 0x20,
+ 0xfc, 0xe0, 0x11, 0x12, 0x20, 0x0e, 0x10, 0x12, 0xf0, 0xfe, 0x44, 0x10,
+ 0xfe, 0xdf, 0x0e, 0x0b,
+ 0xef, 0x11, 0x23, 0xd0, 0xf0, 0xfc, 0xdd, 0x00, 0x17, 0x01, 0xcd, 0x00,
+ 0x53, 0x12, 0x13, 0x45,
+ 0x0f, 0x0e, 0x53, 0x26, 0x11, 0x02, 0x21, 0xef, 0xcc, 0x12, 0x03, 0xdc,
+ 0xcf, 0x14, 0x46, 0x00,
+ 0x00, 0xe1, 0x22, 0x30, 0xfe, 0xfe, 0x0f, 0xea, 0x00, 0x12, 0x00, 0xef,
+ 0x0e, 0x15, 0x52, 0xfd,
+ 0xca, 0x21, 0x35, 0x10, 0x22, 0x21, 0xee, 0xcd, 0x24, 0x32, 0xee, 0xbc,
+ 0x24, 0x53, 0xff, 0xdd,
+ 0x0d, 0xff, 0x23, 0x75, 0x0e, 0xdd, 0x0f, 0x30, 0xfc, 0xed, 0x00, 0x11,
+ 0xe8, 0xde, 0x0f, 0x01,
+ 0xc0, 0xfb, 0x0f, 0x10, 0x1f, 0x0e, 0x10, 0x66, 0x00, 0x0d, 0xff, 0xff,
+ 0x00, 0x30, 0x12, 0xf1,
+ 0xf1, 0x0e, 0xfe, 0xf0, 0x03, 0xff, 0xee, 0xe1, 0xe7, 0x02, 0x23, 0x00,
+ 0xae, 0xf0, 0xf0, 0xf5,
+ 0x13, 0x12, 0xff, 0xee, 0x00, 0x35, 0x11, 0x24, 0x11, 0x21, 0x57, 0x00,
+ 0xdf, 0x00, 0x23, 0xf1,
+ 0xdd, 0xf0, 0xf3, 0x00, 0xec, 0xf0, 0x21, 0x20, 0x0d, 0x0e, 0x31, 0x44,
+ 0x2f, 0x1b, 0x41, 0x11,
+ 0x0d, 0x0d, 0x41, 0x10, 0x0c, 0xde, 0xfb, 0xfe, 0x00, 0x10, 0xfc, 0xcd,
+ 0x0c, 0x11, 0x33, 0x46,
+ 0x21, 0xf1, 0xf1, 0x02, 0x22, 0x44, 0x02, 0xcf, 0xc9, 0xf0, 0xf1, 0x01,
+ 0xfd, 0xcc, 0x01, 0x65,
+ 0x11, 0x00, 0x12, 0x32, 0xf0, 0xf0, 0x00, 0x01, 0x02, 0xe0, 0xef, 0xbb,
+ 0xed, 0x00, 0x63, 0x0d,
+ 0xfa, 0x31, 0x23, 0x30, 0x36, 0x22, 0x21, 0xfe, 0x0e, 0x32, 0x05, 0xdf,
+ 0xe0, 0xe0, 0xf0, 0xd0,
+ 0xbd, 0xc9, 0xde, 0x00, 0x23, 0xf0, 0xaa, 0xf0, 0xdd, 0xef, 0xfe, 0x02,
+ 0x02, 0xac, 0x0f, 0xf0,
+ 0xf4, 0xdb, 0xee, 0x31, 0x44, 0xff, 0xdc, 0x50, 0x43, 0x13, 0x20, 0xfc,
+ 0x0e, 0x40, 0x57, 0x01,
+ 0x10, 0x1f, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x0d, 0xff, 0x00, 0xf4, 0xdf,
+ 0xcb, 0xfe, 0xde, 0xf3,
+ 0xe5, 0xcd, 0xba, 0x00, 0x00, 0xd2, 0xe0, 0x01, 0x10, 0x00, 0x74, 0x25,
+ 0x10, 0x0f, 0x2f, 0x32,
+ 0x11, 0x0f, 0x0f, 0x46, 0x12, 0x10, 0x00, 0x22, 0x22, 0x11, 0x02, 0x32,
+ 0x51, 0x1f, 0x00, 0x12,
+ 0x55, 0x1f, 0xf9, 0x00, 0x11, 0x00, 0xdd, 0xcc, 0xef, 0x22, 0x22, 0xbc,
+ 0xdb, 0xf0, 0x00, 0x00,
+ 0x02, 0x11, 0xef, 0xe0, 0x00, 0xf0, 0xf3, 0xf0, 0xe0, 0x9b, 0xf0, 0xf0,
+ 0xfd, 0xed, 0x23, 0x34,
+ 0x00, 0x02, 0x66, 0x10, 0x10, 0x11, 0x20, 0x01, 0xdb, 0x00, 0x66, 0x00,
+ 0xdd, 0x01, 0x02, 0x01,
+ 0x01, 0x52, 0x0f, 0xdb, 0x33, 0x77, 0x33, 0x01, 0x20, 0xfe, 0xe0, 0x53,
+ 0x13, 0x0e, 0xfe, 0x15,
+ 0x00, 0xec, 0xb0, 0x00, 0x13, 0x34, 0xfd, 0xec, 0x00, 0xcb, 0xcc, 0xff,
+ 0x32, 0x11, 0xc9, 0x00,
+ 0x1f, 0xdf, 0xdc, 0x11, 0x10, 0xe0, 0xdd, 0x10, 0x32, 0x36, 0xe0, 0xb0,
+ 0xfe, 0x00, 0xff, 0xce,
+ 0x01, 0x57, 0x00, 0xfd, 0xf0, 0xd1, 0xbd, 0xed, 0x00, 0x22, 0x00, 0x02,
+ 0xf2, 0xdf, 0xfc, 0xdf,
+ 0x03, 0x03, 0xdb, 0xcc, 0xce, 0x0e, 0x02, 0x34, 0xed, 0x0f, 0x65, 0x13,
+ 0x22, 0x0f, 0x1d, 0x56,
+ 0x12, 0x0e, 0xec, 0x01, 0x10, 0x01, 0xcf, 0x0c, 0x0f, 0x21, 0x13, 0xff,
+ 0xfd, 0x0f, 0xea, 0xf0,
+ 0x23, 0x11, 0xd9, 0xef, 0x21, 0x11, 0x02, 0xdd, 0xdb, 0xff, 0x30, 0x12,
+ 0xef, 0xcd, 0x0f, 0x31,
+ 0x43, 0x27, 0x32, 0x21, 0x0f, 0xef, 0x12, 0x25, 0x44, 0xf0, 0xbf, 0x00,
+ 0x0d, 0xce, 0x00, 0x00,
+ 0x04, 0x14, 0x11, 0x00, 0x0f, 0x00, 0x57, 0x02, 0xad, 0x0e, 0x04, 0x10,
+ 0xed, 0x00, 0x00, 0xe0,
+ 0xd0, 0x31, 0x23, 0x0b, 0x0e, 0x65, 0x12, 0x01, 0x32, 0x0f, 0x1d, 0x33,
+ 0x47, 0xe0, 0xef, 0x10,
+ 0x34, 0xff, 0xdd, 0xdf, 0x12, 0x44, 0x00, 0xfd, 0x04, 0x21, 0xa8, 0xec,
+ 0x02, 0x20, 0x00, 0x0e,
+ 0x10, 0xee, 0xdf, 0x1e, 0x10, 0xfc, 0xee, 0x0f, 0x1d, 0x35, 0x32, 0x01,
+ 0x42, 0x43, 0xfa, 0xdc,
+ 0x20, 0x54, 0x10, 0xff, 0xee, 0x00, 0xe0, 0xf0, 0xcd, 0x13, 0x26, 0xd0,
+ 0xe1, 0x04, 0xbe, 0x00,
+ 0xf0, 0xe0, 0x26, 0x33, 0xb0, 0xdd, 0xdf, 0x11, 0x16, 0x00, 0x0e, 0x03,
+ 0x36, 0x30, 0x00, 0x11,
+ 0x65, 0xff, 0xfe, 0xf1, 0x22, 0x00, 0x02, 0x20, 0x00, 0x20, 0x10, 0xf0,
+ 0xdc, 0x53, 0x10, 0xe8,
+ 0x0f, 0x61, 0x01, 0x0d, 0x0e, 0x40, 0x20, 0x0e, 0xe8, 0xde, 0x00, 0x30,
+ 0x02, 0x0f, 0xce, 0xff,
+ 0x00, 0x04, 0x22, 0x20, 0x13, 0xfd, 0xec, 0x22, 0x34, 0x0f, 0xef, 0x00,
+ 0xfd, 0xe0, 0xf0, 0xe0,
+ 0x01, 0x23, 0x37, 0x01, 0xd0, 0x1e, 0x76, 0x11, 0xfe, 0xdd, 0x21, 0x12,
+ 0x0d, 0xdc, 0x00, 0x00,
+ 0x0f, 0x44, 0x55, 0x0f, 0x0e, 0x42, 0x17, 0x31, 0x32, 0x11, 0x2f, 0x10,
+ 0x31, 0x33, 0x00, 0xce,
+ 0xbd, 0xff, 0xfe, 0xce, 0xfe, 0xe2, 0xf0, 0xde, 0xf1, 0xb0, 0xca, 0x0f,
+ 0x01, 0xf0, 0xdc, 0xfe,
+ 0x10, 0x0d, 0xfd, 0x0e, 0xdd, 0x0e, 0x21, 0xf0, 0xdd, 0x0e, 0x0f, 0x02,
+ 0x27, 0x42, 0x0f, 0xcb,
+ 0x20, 0x73, 0x12, 0x00, 0x2e, 0x10, 0x00, 0xfd, 0xf0, 0x14, 0x21, 0xef,
+ 0xe1, 0xf3, 0xef, 0xf0,
+ 0xce, 0xbd, 0xf2, 0x05, 0x0f, 0xcb, 0xf0, 0x0f, 0x12, 0x12, 0x00, 0xfa,
+ 0xf0, 0x65, 0x11, 0x0f,
+ 0x10, 0x24, 0x31, 0x00, 0xee, 0x0f, 0xf0, 0x10, 0x14, 0x33, 0x31, 0xf0,
+ 0xdf, 0x0f, 0x02, 0x40,
+ 0x11, 0x23, 0x23, 0x00, 0xfb, 0x20, 0x62, 0x00, 0x1a, 0xec, 0xff, 0xfe,
+ 0xff, 0x0d, 0x00, 0x0c,
+ 0xbe, 0xff, 0xd0, 0x27, 0x54, 0xf0, 0xbe, 0xf0, 0xef, 0xff, 0x0f, 0x03,
+ 0x00, 0x98, 0x00, 0x00,
+ 0x0f, 0xeb, 0x21, 0x64, 0x0f, 0xff, 0x01, 0x33, 0x12, 0xff, 0xfe, 0x00,
+ 0x05, 0x11, 0xf0, 0xad,
+ 0xee, 0x01, 0x45, 0x00, 0xff, 0x0e, 0x42, 0x23, 0x57, 0x21, 0x10, 0x00,
+ 0x32, 0x25, 0x31, 0xf0,
+ 0xbc, 0x23, 0x01, 0xcd, 0xcc, 0x01, 0x00, 0xf0, 0xf2, 0xd2, 0xb8, 0x0e,
+ 0x00, 0x10, 0x0e, 0xde,
+ 0x0c, 0x00, 0x42, 0x00, 0xea, 0x00, 0x00, 0xe0, 0xc0, 0xed, 0x10, 0x43,
+ 0x03, 0xb2, 0x02, 0x20,
+ 0x0a, 0xef, 0x00, 0x53, 0x00, 0xfd, 0xec, 0x00, 0x10, 0xff, 0xee, 0xef,
+ 0xdf, 0xcf, 0x11, 0x04,
+ 0xf0, 0xbb, 0xdd, 0x00, 0x05, 0xed, 0xbb, 0x00, 0x33, 0x00, 0xcc, 0x0f,
+ 0x32, 0x65, 0x10, 0x10,
+ 0x00, 0x31, 0x35, 0x00, 0x0e, 0x01, 0x31, 0x10, 0x00, 0xff, 0xfd, 0x1f,
+ 0x0e, 0xf0, 0x05, 0x0f,
+ 0xfe, 0x11, 0x35, 0xf0, 0xdd, 0xef, 0xff, 0x00, 0x10, 0x10, 0x10, 0xfc,
+ 0xf0, 0x0f, 0x50, 0x22,
+ 0x04, 0xfe, 0xed, 0x37, 0x33, 0x10, 0x34, 0x30, 0xf1, 0xf0, 0xf1, 0x03,
+ 0x10, 0xeb, 0x02, 0x26,
+ 0x0f, 0xbc, 0x01, 0x24, 0x20, 0xfd, 0xf1, 0x24, 0x21, 0xff, 0x01, 0x24,
+ 0xff, 0xdc, 0xf0, 0xff,
+ 0xed, 0xee, 0x0f, 0x00, 0x02, 0x12, 0x10, 0x00, 0x20, 0x33, 0x44, 0x22,
+ 0x02, 0x01, 0x32, 0x32,
+ 0x21, 0x23, 0xff, 0xc9, 0x00, 0x13, 0xff, 0xfb, 0x01, 0x13, 0xcf, 0xfe,
+ 0x0f, 0x00, 0x03, 0x11,
+ 0xd8, 0x0e, 0x10, 0x0e, 0x1d, 0x0e, 0x40, 0x00, 0xfd, 0x0d, 0xfc, 0x0e,
+ 0x00, 0x10, 0x34, 0x00,
+ 0xcb, 0xef, 0x20, 0x1f, 0x10, 0xf1, 0xbd, 0x0d, 0x02, 0xe0, 0x00, 0x34,
+ 0x11, 0xe2, 0x27, 0x14,
+ 0x00, 0xe0, 0xe0, 0x00, 0x02, 0xd0, 0x9d, 0x00, 0x17, 0x00, 0xcf, 0x0f,
+ 0x01, 0x03, 0xff, 0x21,
+ 0x45, 0x01, 0x16, 0x42, 0x01, 0xd0, 0xff, 0xff, 0xf0, 0x01, 0x02, 0x10,
+ 0x0c, 0x2d, 0x30, 0x14,
+ 0x1f, 0xfc, 0x0f, 0x61, 0x12, 0x0a, 0x0f, 0x22, 0x22, 0x53, 0x0d, 0xd8,
+ 0x0f, 0x10, 0x0f, 0x0f,
+ 0x1f, 0x1f, 0xcc, 0x01, 0x22, 0x52, 0x0f, 0x01, 0x17, 0x10, 0xfe, 0xf0,
+ 0x03, 0xdf, 0xcc, 0x23,
+ 0x36, 0xcf, 0xdc, 0x01, 0x02, 0xde, 0x00, 0x30, 0x01, 0x02, 0x37, 0x10,
+ 0xcf, 0xfe, 0x00, 0x02,
+ 0x01, 0x00, 0xc8, 0x00, 0x60, 0x24, 0x00, 0x0f, 0x0f, 0x41, 0x36, 0x20,
+ 0x42, 0x30, 0x01, 0xcf,
+ 0x0e, 0x11, 0xdf, 0xcc, 0xf0, 0xd2, 0xcf, 0xdb, 0xe0, 0xef, 0xbe, 0x00,
+ 0xe0, 0xd0, 0x00, 0xcb,
+ 0xcc, 0x0f, 0xf0, 0x0f, 0xcc, 0xe0, 0x0d, 0xec, 0x01, 0xf1, 0xe0, 0x11,
+ 0x00, 0x0d, 0x23, 0x32,
+ 0x30, 0x55, 0x2f, 0xfb, 0x32, 0x52, 0x0e, 0x40, 0x12, 0xff, 0xfd, 0x01,
+ 0x00, 0xed, 0xc0, 0x04,
+ 0xe2, 0xf0, 0xfc, 0xde, 0xf1, 0x04, 0xcd, 0xa8, 0x0f, 0x20, 0x04, 0x10,
+ 0xff, 0xfe, 0xf0, 0x02,
+ 0x52, 0x01, 0x23, 0x01, 0x23, 0x00, 0x02, 0x11, 0x02, 0x57, 0x12, 0xff,
+ 0x0f, 0x00, 0x11, 0x64,
+ 0x13, 0x0c, 0xfe, 0x36, 0x52, 0x00, 0xea, 0x00, 0x40, 0x22, 0x0e, 0xed,
+ 0x00, 0x30, 0xfd, 0xff,
+ 0x12, 0xe0, 0xb9, 0xee, 0xf1, 0x02, 0x00, 0xf2, 0x04, 0xe0, 0xcc, 0xe0,
+ 0xfe, 0xfc, 0xcc, 0xef,
+ 0x12, 0x00, 0xfa, 0x10, 0x52, 0x02, 0x02, 0xf0, 0x00, 0x12, 0x36, 0x11,
+ 0xef, 0xce, 0x12, 0x33,
+ 0x22, 0xfe, 0xca, 0x0f, 0x1f, 0x41, 0x33, 0x13, 0x0f, 0x21, 0x57, 0x25,
+ 0x10, 0x51, 0x33, 0x00,
+ 0xcf, 0x11, 0x02, 0x1f, 0x12, 0x14, 0xff, 0xdd, 0xec, 0xee, 0xff, 0xf1,
+ 0xf0, 0x00, 0x2e, 0x0f,
+ 0x00, 0xdd, 0x0e, 0x0f, 0x1e, 0xee, 0xdc, 0x0e, 0x0d, 0xcb, 0x00, 0x22,
+ 0x10, 0xcc, 0xfd, 0xcd,
+ 0x00, 0x36, 0x20, 0xdd, 0xff, 0x22, 0x21, 0xdc, 0xfe, 0x14, 0xf1, 0xdc,
+ 0xf0, 0xf1, 0xcd, 0xdc,
+ 0xe0, 0x05, 0xf1, 0xde, 0xf0, 0x04, 0x0f, 0xda, 0xee, 0xd0, 0x0f, 0x21,
+ 0x20, 0x10, 0x21, 0x1e,
+ 0x0e, 0x20, 0x43, 0x46, 0x00, 0x00, 0x01, 0x02, 0xfc, 0x0f, 0x11, 0x10,
+ 0xf0, 0xed, 0xfb, 0x02,
+ 0x01, 0xcc, 0xfe, 0x11, 0x03, 0xd0, 0x11, 0x0d, 0xfb, 0xef, 0x00, 0x1e,
+ 0x10, 0x20, 0xfa, 0xdf,
+ 0x44, 0x65, 0xfe, 0xee, 0xf0, 0x11, 0x00, 0x00, 0x15, 0x41, 0xf0, 0x00,
+ 0x42, 0x01, 0xcb, 0x0f,
+ 0x63, 0xf2, 0xdd, 0x00, 0x13, 0x13, 0x02, 0xae, 0xfc, 0xf1, 0x27, 0x10,
+ 0xe0, 0x10, 0x13, 0xe0,
+ 0xee, 0x21, 0x00, 0xea, 0xcf, 0x00, 0x33, 0x00, 0xbb, 0x00, 0x66, 0x10,
+ 0x0f, 0x00, 0x57, 0x00,
+ 0x2f, 0x00, 0x22, 0x00, 0xde, 0x00, 0x44, 0x00, 0xf0, 0xbe, 0x00, 0x02,
+ 0xe0, 0xfe, 0x22, 0x11,
+ 0xec, 0xde, 0xfe, 0x20, 0x30, 0xfb, 0xfe, 0x50, 0x0f, 0x0d, 0xf0, 0x1e,
+ 0x0f, 0x0f, 0xfc, 0xcd,
+ 0xe0, 0x34, 0x32, 0x1d, 0x0c, 0x00, 0x1e, 0xfc, 0x2f, 0x54, 0x00, 0xdf,
+ 0x12, 0x45, 0xf0, 0xbe,
+ 0x00, 0x07, 0xf2, 0xd0, 0xcf, 0x00, 0xe1, 0x0e, 0x00, 0xee, 0xfd, 0x02,
+ 0x25, 0x00, 0x02, 0x01,
+ 0xf4, 0xf4, 0x02, 0x00, 0xd0, 0xf3, 0x17, 0x02, 0x00, 0xfe, 0x0f, 0x01,
+ 0x21, 0x10, 0x2b, 0x51,
+ 0x12, 0x0e, 0xfb, 0x10, 0x23, 0x01, 0x31, 0x40, 0xea, 0xcd, 0x21, 0x20,
+ 0x0e, 0x2e, 0x1b, 0x0e,
+ 0x0f, 0x50, 0x10, 0xfc, 0xce, 0x1f, 0x0f, 0x00, 0x44, 0x36, 0xef, 0xef,
+ 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x00, 0xe1, 0x03, 0xe0, 0xef, 0xed, 0xf0, 0x03, 0xef, 0xcc, 0x01,
+ 0x77, 0x02, 0x0f, 0x00,
+ 0x11, 0x12, 0x10, 0x30, 0x1c, 0x0d, 0x56, 0x34, 0xfe, 0x30, 0x50, 0xff,
+ 0x00, 0x35, 0x44, 0x11,
+ 0x20, 0x00, 0x13, 0xff, 0xcd, 0xff, 0xf0, 0x04, 0xd0, 0xbc, 0x00, 0xe0,
+ 0xdc, 0xdf, 0x01, 0xd0,
+ 0xe0, 0xeb, 0x9d, 0x0d, 0xf0, 0xf1, 0x00, 0x00, 0xea, 0xff, 0x0e, 0x10,
+ 0xfe, 0x00, 0x12, 0x1f,
+ 0x0d, 0xdd, 0x22, 0x55, 0x20, 0x1e, 0x12, 0x23, 0x0e, 0x40, 0x12, 0x20,
+ 0x22, 0x02, 0xf1, 0xbb,
+ 0xee, 0xf0, 0xd6, 0xe2, 0xff, 0xff, 0xf0, 0xf2, 0x02, 0x0e, 0xc9, 0x10,
+ 0x41, 0x00, 0xfc, 0x00,
+ 0x11, 0x10, 0x01, 0x01, 0x03, 0xf0, 0xd0, 0x13, 0x24, 0xe0, 0xfd, 0x05,
+ 0x04, 0x00, 0xfe, 0x00,
+ 0x21, 0x67, 0x00, 0x0d, 0xff, 0x00, 0x54, 0x20, 0x1f, 0x00, 0x0e, 0xfc,
+ 0x00, 0x65, 0x10, 0x0b,
+ 0xbe, 0x11, 0x13, 0x00, 0x0e, 0xf0, 0xa8, 0x0f, 0xf1, 0x00, 0xf0, 0x0e,
+ 0x02, 0x0e, 0xdc, 0x00,
+ 0x40, 0xfc, 0xe0, 0x11, 0x00, 0xeb, 0xd0, 0x11, 0x14, 0xe0, 0xba, 0x00,
+ 0x03, 0x01, 0xde, 0xfe,
+ 0x00, 0x01, 0x33, 0x45, 0x0e, 0xdc, 0x11, 0x44, 0x10, 0x00, 0x12, 0x22,
+ 0x0e, 0xf0, 0x17, 0x53,
+ 0x22, 0x22, 0xfe, 0xef, 0x01, 0xf0, 0x1e, 0x45, 0x23, 0xf0, 0xec, 0x0f,
+ 0x20, 0xe1, 0xb0, 0x0f,
+ 0x01, 0x0d, 0xfc, 0x00, 0xf0, 0xee, 0xff, 0xff, 0xdb, 0x0f, 0x20, 0x0f,
+ 0xed, 0xf0, 0xf2, 0xdb,
+ 0xec, 0xf0, 0xf0, 0x03, 0x42, 0x0d, 0x0f, 0x20, 0x0e, 0xed, 0x1f, 0x30,
+ 0x0e, 0x12, 0xf5, 0xad,
+ 0xfc, 0xdf, 0xed, 0xe3, 0xf3, 0xcf, 0xec, 0xf0, 0xf0, 0x0f, 0xfe, 0x00,
+ 0x30, 0x0d, 0x0e, 0x00,
+ 0x20, 0x33, 0x21, 0x10, 0x33, 0x01, 0xee, 0x14, 0x57, 0x12, 0xee, 0xee,
+ 0x00, 0x44, 0xf0, 0xdb,
+ 0x00, 0x52, 0x24, 0xdd, 0xdc, 0x00, 0x0f, 0x10, 0x44, 0x13, 0x00, 0xb9,
+ 0xf0, 0x20, 0x42, 0x2f,
+ 0x0f, 0x10, 0x01, 0x10, 0x10, 0x12, 0x11, 0xfd, 0xdf, 0x03, 0x00, 0x02,
+ 0x27, 0x20, 0xe0, 0x02,
+ 0x01, 0x00, 0x00, 0x44, 0x23, 0xf0, 0xee, 0xef, 0x12, 0x01, 0xeb, 0xdf,
+ 0x32, 0x26, 0xdf, 0x01,
+ 0x01, 0xdf, 0xee, 0x47, 0x11, 0xdc, 0xdf, 0x20, 0x21, 0x0e, 0x10, 0x31,
+ 0x10, 0x0e, 0x20, 0x54,
+ 0x35, 0x10, 0xef, 0x33, 0x37, 0xd0, 0xcd, 0x10, 0x34, 0xf0, 0xcf, 0xed,
+ 0x11, 0x12, 0x00, 0xeb,
+ 0xf0, 0x23, 0x40, 0xef, 0x0f, 0x71, 0x0f, 0xdc, 0x0f, 0x2c, 0x1e, 0xfd,
+ 0x10, 0x2f, 0xdb, 0xee,
+ 0xed, 0xd9, 0x0e, 0xe0, 0x20, 0x53, 0x12, 0xfe, 0xcb, 0x20, 0x44, 0x10,
+ 0xdd, 0xf0, 0x46, 0x02,
+ 0xf0, 0xac, 0x00, 0x01, 0xe0, 0xe1, 0x01, 0xff, 0xf0, 0x01, 0x06, 0x11,
+ 0x00, 0xe0, 0x05, 0xf0,
+ 0xe0, 0x00, 0xf2, 0x02, 0x05, 0x20, 0xec, 0xde, 0x05, 0x02, 0x00, 0x0e,
+ 0x00, 0x23, 0x22, 0x01,
+ 0x0d, 0x01, 0x57, 0x02, 0x0f, 0xfd, 0x00, 0x00, 0x21, 0x11, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x7b, 0xdd, 0x37, 0xe8, 0x89, 0xdd, 0x40, 0xe7, 0x0e, 0x10, 0x50, 0x0d,
+ 0x3f, 0x44, 0xfc, 0xec,
+ 0x0f, 0x43, 0x32, 0xda, 0x00, 0x31, 0x00, 0x0e, 0x20, 0x57, 0x00, 0xce,
+ 0x0e, 0xf1, 0x00, 0xff,
+ 0x22, 0x02, 0xe1, 0xf0, 0xe1, 0xf1, 0xdd, 0xca, 0xe0, 0xf0, 0x02, 0x04,
+ 0x0f, 0xde, 0x01, 0x77,
+ 0x01, 0x00, 0x0e, 0x30, 0x02, 0xfe, 0x21, 0x44, 0x21, 0x00, 0xda, 0x10,
+ 0x64, 0x01, 0x20, 0x12,
+ 0x12, 0x00, 0xf0, 0x00, 0x30, 0x0e, 0xad, 0xf1, 0xf2, 0xfd, 0xcc, 0x00,
+ 0xd0, 0xcc, 0xe0, 0xde,
+ 0xd0, 0xde, 0xc9, 0xcf, 0x0f, 0x00, 0xd0, 0x01, 0x40, 0x0b, 0xce, 0x01,
+ 0x43, 0x0e, 0xe8, 0xce,
+ 0x00, 0x63, 0x33, 0x1f, 0x0c, 0x20, 0x44, 0x0f, 0x0f, 0x40, 0x04, 0x00,
+ 0xff, 0xe0, 0x0f, 0xce,
+ 0x03, 0x13, 0xef, 0xba, 0xff, 0x00, 0x22, 0x10, 0xee, 0x00, 0x0f, 0x0b,
+ 0xef, 0x11, 0x56, 0xf0,
+ 0xcf, 0x00, 0x05, 0x00, 0xfe, 0xe2, 0x57, 0x12, 0xdd, 0xf0, 0x43, 0x53,
+ 0xec, 0xee, 0x30, 0x65,
+ 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x11, 0x33, 0x20, 0x0d, 0xff, 0x0f, 0x23,
+ 0x46, 0x10, 0xde, 0xb9,
+ 0x10, 0x11, 0x10, 0xef, 0xff, 0x00, 0xce, 0xed, 0xdd, 0x11, 0x13, 0x00,
+ 0xd0, 0x13, 0x0d, 0xeb,
+ 0x02, 0x25, 0xff, 0xcc, 0x01, 0x02, 0xee, 0xfe, 0xef, 0xfe, 0xfe, 0x34,
+ 0x56, 0x00, 0xde, 0x00,
+ 0x20, 0x53, 0x25, 0x11, 0x01, 0xf0, 0x0d, 0xff, 0x14, 0x45, 0x00, 0x20,
+ 0x22, 0x02, 0x11, 0x42,
+ 0x01, 0x26, 0x42, 0xc0, 0x00, 0x61, 0xf5, 0x00, 0x01, 0xef, 0x0f, 0xff,
+ 0xfd, 0x11, 0x00, 0xef,
+ 0xe0, 0xf1, 0x2f, 0x0c, 0xd0, 0x01, 0x1f, 0x10, 0x40, 0xdb, 0xdc, 0x20,
+ 0x10, 0xee, 0xec, 0xed,
+ 0xac, 0x0e, 0x33, 0x15, 0xff, 0xda, 0x00, 0x33, 0x00, 0xf0, 0x0e, 0xde,
+ 0x03, 0xc1, 0xbb, 0xfe,
+ 0xd1, 0x00, 0xc0, 0xdd, 0xeb, 0x00, 0x20, 0x20, 0x10, 0x00, 0x1f, 0x20,
+ 0x33, 0x24, 0x1f, 0x0c,
+ 0xff, 0x11, 0x46, 0x0e, 0xcb, 0x00, 0x53, 0x14, 0xff, 0xdc, 0x00, 0x43,
+ 0x21, 0xcd, 0xfd, 0x01,
+ 0xe2, 0xf0, 0x00, 0x0e, 0xba, 0xff, 0x01, 0x23, 0xdd, 0xeb, 0x00, 0x00,
+ 0x20, 0x40, 0x15, 0x0e,
+ 0xed, 0x01, 0x23, 0x32, 0x0d, 0xd0, 0x03, 0x11, 0x0f, 0x0e, 0x02, 0x02,
+ 0x02, 0x01, 0x3f, 0xea,
+ 0x00, 0x62, 0x02, 0xf0, 0x02, 0xe1, 0x00, 0xf2, 0x05, 0xee, 0x9c, 0xf0,
+ 0x04, 0x00, 0xf0, 0xfe,
+ 0x0e, 0xf1, 0x06, 0x20, 0x20, 0x20, 0x2f, 0x00, 0x10, 0x10, 0x11, 0x26,
+ 0x30, 0x00, 0x10, 0xfd,
+ 0xf0, 0x44, 0x32, 0x02, 0x02, 0x33, 0x10, 0x00, 0x03, 0x52, 0x12, 0xe0,
+ 0xc0, 0x0f, 0x01, 0x11,
+ 0x00, 0xee, 0xd0, 0x01, 0x0e, 0xfc, 0x20, 0x40, 0x01, 0x0d, 0x0d, 0x20,
+ 0xfc, 0xde, 0x20, 0x40,
+ 0xc9, 0xbc, 0xf0, 0x22, 0x42, 0x00, 0x0f, 0x00, 0x23, 0x10, 0xfb, 0xdc,
+ 0x40, 0x12, 0xd0, 0xff,
+ 0x32, 0x21, 0xff, 0x8c, 0x0f, 0xf3, 0x05, 0x12, 0x00, 0xe2, 0x01, 0xe0,
+ 0xf1, 0xf2, 0x02, 0x01,
+ 0xcf, 0xf0, 0xf4, 0x33, 0xfb, 0xad, 0x13, 0x27, 0x10, 0xf1, 0xf1, 0x11,
+ 0x20, 0xf2, 0xf1, 0x20,
+ 0x42, 0xfd, 0xed, 0x20, 0x0c, 0x0c, 0x02, 0x52, 0xeb, 0xff, 0x21, 0x0e,
+ 0x1b, 0x52, 0x11, 0x00,
+ 0x09, 0x2f, 0x30, 0x70, 0xd0, 0xe0, 0x70, 0x41, 0xab, 0x1e, 0x11, 0x03,
+ 0xf0, 0x02, 0x01, 0x0e,
+ 0xfd, 0xff, 0x01, 0x14, 0x11, 0xe1, 0xe0, 0x01, 0x34, 0x0e, 0x99, 0x00,
+ 0x11, 0x02, 0x21, 0x11,
+ 0xff, 0x03, 0x23, 0x33, 0x47, 0x00, 0x0f, 0x0d, 0x20, 0x32, 0x01, 0x02,
+ 0x63, 0x21, 0xed, 0x0f,
+ 0x11, 0x56, 0x02, 0x00, 0x10, 0x64, 0xf0, 0xed, 0xf0, 0x04, 0xf0, 0xec,
+ 0xbd, 0x00, 0xcd, 0xdc,
+ 0x0f, 0xee, 0xf1, 0xf4, 0xd0, 0xcd, 0xfc, 0x20, 0x02, 0xf0, 0x0e, 0x2e,
+ 0xdc, 0xfc, 0x1f, 0x73,
+ 0x00, 0xf8, 0xee, 0x10, 0x31, 0x01, 0x10, 0x00, 0x53, 0x25, 0xef, 0xde,
+ 0x11, 0x03, 0x23, 0x02,
+ 0xd0, 0x0f, 0xcd, 0xfe, 0x0f, 0xdc, 0x0f, 0x00, 0x22, 0x11, 0x01, 0x10,
+ 0x2f, 0xf0, 0xcf, 0x23,
+ 0x36, 0x00, 0xcc, 0xd1, 0x13, 0xef, 0xab, 0x01, 0x24, 0xf0, 0xed, 0xe0,
+ 0x45, 0x32, 0xf0, 0xde,
+ 0x1f, 0x40, 0x34, 0x30, 0x01, 0x00, 0x01, 0x01, 0xfd, 0xff, 0x00, 0x22,
+ 0xee, 0xf1, 0x14, 0x40,
+ 0x2d, 0xf0, 0x00, 0x50, 0xfd, 0xf9, 0x00, 0x54, 0x0f, 0xdd, 0x10, 0xee,
+ 0xde, 0x20, 0x03, 0xce,
+ 0xdc, 0x0e, 0xf0, 0x1f, 0x10, 0xee, 0xdc, 0x0e, 0x00, 0xf0, 0x0f, 0xfe,
+ 0xcb, 0xfe, 0x01, 0x56,
+ 0xf0, 0xef, 0x00, 0x31, 0x04, 0x01, 0x02, 0x20, 0xf0, 0xfe, 0xef, 0x00,
+ 0x04, 0x62, 0x10, 0x02,
+ 0x01, 0x0f, 0x31, 0x17, 0x12, 0x32, 0x10, 0x1d, 0x03, 0x16, 0x21, 0xfe,
+ 0xdf, 0x20, 0x22, 0xf0,
+ 0x02, 0xf0, 0xb8, 0xf0, 0x00, 0x02, 0xcd, 0xdf, 0x13, 0x21, 0xed, 0x0b,
+ 0x00, 0xec, 0x0d, 0x00,
+ 0x20, 0x41, 0xde, 0xa9, 0x30, 0x00, 0xe1, 0x3e, 0x00, 0xe5, 0x01, 0xff,
+ 0xda, 0xaf, 0x0f, 0x00,
+ 0xf2, 0xdf, 0xfb, 0xc0, 0xc0, 0xed, 0x1f, 0x10, 0xde, 0x00, 0x16, 0x41,
+ 0x10, 0xce, 0x00, 0x64,
+ 0x02, 0x0e, 0xf9, 0xf0, 0x54, 0x10, 0xcf, 0x3e, 0x02, 0xf2, 0x00, 0x21,
+ 0x23, 0xd2, 0x16, 0x42,
+ 0xfe, 0xcb, 0x00, 0x01, 0x30, 0x51, 0xff, 0xdc, 0x0f, 0x4e, 0x10, 0x23,
+ 0x03, 0xe0, 0xcb, 0xe0,
+ 0x23, 0x51, 0xfe, 0xef, 0xf0, 0x03, 0x11, 0x3e, 0x0e, 0x22, 0x47, 0x00,
+ 0xec, 0x20, 0x43, 0x00,
+ 0xf2, 0x23, 0xe0, 0xed, 0x56, 0x12, 0xbf, 0xef, 0x00, 0x36, 0xf0, 0xcc,
+ 0xf0, 0x03, 0x00, 0x00,
+ 0xff, 0xed, 0x33, 0x03, 0x22, 0x54, 0x02, 0x0f, 0xec, 0xf0, 0x40, 0x19,
+ 0x00, 0xe0, 0x30, 0x5f,
+ 0xff, 0xee, 0x20, 0x25, 0x13, 0xf0, 0x00, 0x34, 0x23, 0xdf, 0x04, 0x34,
+ 0x00, 0x0f, 0x0e, 0xf0,
+ 0x00, 0x0f, 0x0b, 0x10, 0x31, 0x02, 0xdf, 0x0d, 0x30, 0x02, 0x00, 0x12,
+ 0x33, 0xe9, 0xee, 0xdd,
+ 0x10, 0x64, 0xec, 0xdd, 0x0e, 0x10, 0x1e, 0x0e, 0xdf, 0x10, 0x67, 0x11,
+ 0xff, 0xcc, 0x10, 0x11,
+ 0xf1, 0x01, 0x01, 0xe0, 0xe0, 0x0d, 0xf0, 0xf0, 0xf0, 0x02, 0x26, 0xf1,
+ 0xcf, 0x00, 0xe0, 0x03,
+ 0x57, 0x01, 0xee, 0xdf, 0x12, 0x11, 0xd0, 0xe0, 0x00, 0x14, 0x02, 0xf2,
+ 0x00, 0xf0, 0x07, 0x72,
+ 0x0d, 0x9e, 0x11, 0x15, 0x10, 0x00, 0xf0, 0x1e, 0x0d, 0xee, 0x00, 0x16,
+ 0x31, 0x0e, 0xfc, 0x00,
+ 0x43, 0x30, 0x2f, 0x4e, 0xec, 0x00, 0x74, 0x20, 0x0c, 0x10, 0x47, 0x00,
+ 0xfc, 0xf0, 0xf1, 0xef,
+ 0x0e, 0x11, 0x01, 0xf0, 0xe0, 0xe0, 0x0f, 0xdb, 0xdf, 0x11, 0x13, 0xdc,
+ 0xd0, 0x04, 0xbe, 0x0d,
+ 0xf0, 0x01, 0xf2, 0x03, 0x0f, 0x0e, 0x14, 0x45, 0x01, 0x00, 0x2f, 0x10,
+ 0x10, 0x20, 0x31, 0x64,
+ 0x00, 0x0b, 0x12, 0x42, 0x00, 0xf0, 0x04, 0x56, 0xf0, 0xf0, 0xfd, 0xe0,
+ 0x00, 0xe0, 0xac, 0x00,
+ 0x02, 0xfe, 0xb9, 0xf0, 0xe0, 0x03, 0xed, 0xdc, 0xcf, 0xdf, 0x0e, 0x11,
+ 0xf0, 0xee, 0x0d, 0x0d,
+ 0x1a, 0x20, 0x21, 0x0f, 0x0d, 0x2f, 0x10, 0xf0, 0x02, 0x46, 0x32, 0x21,
+ 0xfe, 0xdc, 0x10, 0x12,
+ 0x23, 0x00, 0xd0, 0x0b, 0x0e, 0x10, 0x1f, 0x0f, 0xcd, 0xed, 0xf0, 0x01,
+ 0x07, 0x31, 0x01, 0x00,
+ 0x13, 0x02, 0x0f, 0xcb, 0x00, 0x11, 0x01, 0x01, 0xf0, 0xef, 0x00, 0x23,
+ 0x14, 0x0e, 0xf2, 0x57,
+ 0x14, 0xee, 0x0e, 0xf0, 0x00, 0x22, 0x33, 0x42, 0x1f, 0xa8, 0x0e, 0x01,
+ 0x33, 0x30, 0x00, 0x00,
+ 0x00, 0xef, 0x0e, 0x51, 0x0f, 0xfe, 0x01, 0x33, 0x0c, 0x0e, 0x13, 0x33,
+ 0xfe, 0xbf, 0xea, 0xee,
+ 0x00, 0x11, 0xde, 0xf0, 0x00, 0x10, 0x01, 0xff, 0xd8, 0xef, 0x21, 0x32,
+ 0x00, 0xf0, 0xff, 0xbb,
+ 0xf0, 0x21, 0x24, 0x00, 0xe0, 0x21, 0x54, 0xf0, 0x0d, 0x01, 0x43, 0x02,
+ 0xb0, 0x20, 0x61, 0xf5,
+ 0xf0, 0x3f, 0x02, 0x02, 0xdd, 0x00, 0x47, 0x32, 0xf1, 0xe2, 0xf0, 0x21,
+ 0x20, 0xf0, 0x05, 0x31,
+ 0x0f, 0x00, 0x10, 0x02, 0x02, 0x0e, 0xdc, 0xbe, 0x1e, 0x01, 0xb2, 0x10,
+ 0x10, 0x10, 0x0c, 0xfe,
+ 0xfa, 0xff, 0x40, 0x73, 0x00, 0xc8, 0x0f, 0x00, 0x11, 0x00, 0xdc, 0x12,
+ 0x00, 0xb0, 0x0e, 0xef,
+ 0x0f, 0xef, 0xde, 0xe0, 0xef, 0xff, 0xee, 0xdf, 0x0f, 0xff, 0xb8, 0xf0,
+ 0x20, 0x43, 0xde, 0x10,
+ 0x77, 0x00, 0x20, 0xed, 0x0f, 0x11, 0x30, 0x13, 0x10, 0x00, 0xdd, 0xec,
+ 0x12, 0x43, 0xb0, 0xf1,
+ 0x24, 0x00, 0xc9, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x23, 0x00, 0xb8, 0x00,
+ 0xf0, 0xff, 0x12, 0x00,
+ 0xcf, 0xfd, 0xf2, 0x24, 0x0f, 0xd8, 0x10, 0x41, 0x11, 0x1f, 0x0f, 0x43,
+ 0x43, 0x04, 0xde, 0x0d,
+ 0x3f, 0x00, 0x03, 0xe0, 0xed, 0x00, 0x00, 0x10, 0x25, 0xcf, 0xfe, 0x01,
+ 0x02, 0xf2, 0xce, 0xf0,
+ 0xe0, 0xf3, 0x05, 0x01, 0xf0, 0xdb, 0x11, 0x12, 0x10, 0x00, 0x20, 0x30,
+ 0x11, 0x1f, 0x09, 0x10,
+ 0x30, 0x30, 0x24, 0x00, 0xd0, 0x00, 0x13, 0x24, 0x23, 0x35, 0x03, 0xcd,
+ 0xfe, 0x02, 0x32, 0x20,
+ 0x2e, 0x01, 0x23, 0x10, 0x1e, 0xfc, 0xf1, 0x24, 0x11, 0xff, 0xd0, 0xff,
+ 0xf1, 0x14, 0x32, 0x20,
+ 0xf8, 0x8e, 0x00, 0x10, 0x30, 0x0d, 0xcd, 0x0e, 0x00, 0x20, 0xfd, 0xfe,
+ 0x11, 0x43, 0x12, 0x24,
+ 0x0e, 0x0c, 0xfe, 0x0d, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0xed, 0xdf, 0x00,
+ 0xe0, 0xd0, 0xd1, 0xf1,
+ 0x17, 0x24, 0x0f, 0xbf, 0x20, 0x22, 0xff, 0xe1, 0x34, 0xf0, 0xdc, 0x02,
+ 0x04, 0xf0, 0xf0, 0x11,
+ 0x04, 0xf1, 0xce, 0xfe, 0xf2, 0xf0, 0x00, 0x12, 0x24, 0x1d, 0x0a, 0x0f,
+ 0x2f, 0x31, 0x11, 0xff,
+ 0x2e, 0x1d, 0x2f, 0x42, 0x10, 0x0d, 0x1f, 0x1f, 0x2f, 0x2e, 0x4e, 0x22,
+ 0x14, 0x11, 0x33, 0xfd,
+ 0xec, 0x00, 0x0f, 0xfe, 0xe0, 0x01, 0x01, 0x03, 0x0f, 0xef, 0x10, 0x00,
+ 0xe2, 0x01, 0x00, 0xf0,
+ 0xce, 0xdf, 0x01, 0x05, 0x11, 0x00, 0xd0, 0x21, 0x25, 0xee, 0xdd, 0x77,
+ 0x63, 0x0e, 0xff, 0x00,
+ 0x10, 0x31, 0x23, 0x14, 0x0e, 0xff, 0x0f, 0x11, 0x00, 0xf3, 0x05, 0xfe,
+ 0xf2, 0xf4, 0xe1, 0xec,
+ 0xee, 0xf0, 0x02, 0x13, 0xfd, 0xbb, 0x0f, 0xf0, 0xf0, 0xe1, 0xdf, 0xed,
+ 0xff, 0xfc, 0xfd, 0xef,
+ 0x21, 0x10, 0x2e, 0x10, 0x10, 0x21, 0x0e, 0xfa, 0xe0, 0xf1, 0xf1, 0xf0,
+ 0x10, 0x23, 0x31, 0xfd,
+ 0xdd, 0x10, 0x33, 0x10, 0x0e, 0x10, 0xff, 0x00, 0x10, 0x04, 0x00, 0xde,
+ 0xcb, 0xe0, 0xf2, 0xdf,
+ 0x00, 0x37, 0x12, 0xf0, 0xef, 0x0f, 0x0e, 0xe0, 0x32, 0x41, 0xed, 0xdd,
+ 0x01, 0x25, 0x43, 0xf0,
+ 0xcf, 0x14, 0x00, 0xde, 0xe0, 0xf0, 0xaf, 0x00, 0x72, 0xe2, 0x01, 0x10,
+ 0x0c, 0x0e, 0x0e, 0x24,
+ 0x25, 0x51, 0xf0, 0xef, 0x00, 0x20, 0x01, 0x03, 0x00, 0x0b, 0xf0, 0x20,
+ 0x00, 0x00, 0x61, 0x01,
+ 0xca, 0x0e, 0xfe, 0x00, 0x00, 0x0f, 0xdc, 0x0e, 0x00, 0xff, 0x2a, 0xfe,
+ 0xc0, 0x10, 0x2f, 0xed,
+ 0xf0, 0xee, 0xfb, 0xe0, 0x23, 0x05, 0xbf, 0x00, 0x21, 0x02, 0xd0, 0xee,
+ 0x21, 0x26, 0x00, 0x0d,
+ 0x00, 0x10, 0x35, 0x41, 0x10, 0x0f, 0x22, 0xf1, 0xe0, 0x57, 0x03, 0x01,
+ 0x01, 0x01, 0x00, 0x03,
+ 0x33, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x2d, 0x01, 0xd0, 0xcc, 0x00, 0x14,
+ 0xeb, 0xbf, 0x11, 0x10,
+ 0x00, 0x00, 0x0d, 0x21, 0x22, 0xfd, 0xed, 0xfb, 0x0f, 0x00, 0xe1, 0xff,
+ 0xd9, 0xff, 0x30, 0x01,
+ 0xc1, 0x0e, 0xbd, 0xfe, 0xfd, 0xde, 0x20, 0xff, 0xac, 0x11, 0x02, 0xda,
+ 0xeb, 0xc0, 0x20, 0x32,
+ 0xe0, 0xcf, 0x00, 0x21, 0x54, 0x01, 0x00, 0x12, 0x74, 0xff, 0xfe, 0x10,
+ 0x31, 0x00, 0x00, 0x20,
+ 0x00, 0x02, 0x00, 0xf3, 0xf4, 0x13, 0x10, 0xec, 0xcf, 0xfa, 0x01, 0x53,
+ 0x00, 0xca, 0x00, 0x20,
+ 0x20, 0x00, 0xef, 0x0f, 0x11, 0x14, 0x00, 0xfd, 0x0f, 0x33, 0x02, 0x00,
+ 0x2d, 0x01, 0x56, 0x11,
+ 0x10, 0x0f, 0xfe, 0xf0, 0x22, 0x00, 0xa0, 0x00, 0x41, 0xe1, 0xdf, 0x11,
+ 0x27, 0x12, 0xa0, 0x0e,
+ 0x13, 0xf1, 0xdf, 0xed, 0x24, 0x13, 0xfd, 0x00, 0x21, 0xfc, 0x0f, 0x2e,
+ 0x10, 0x13, 0x00, 0x1c,
+ 0x1e, 0x50, 0x35, 0x01, 0xee, 0x10, 0x35, 0x00, 0xbe, 0x00, 0x21, 0x02,
+ 0x03, 0xf0, 0x10, 0x0d,
+ 0x00, 0x00, 0x10, 0x33, 0x45, 0x01, 0x00, 0x20, 0x1e, 0xe2, 0x04, 0xf0,
+ 0x0f, 0x40, 0xff, 0xbe,
+ 0x01, 0x43, 0xff, 0xf9, 0x0f, 0x00, 0x0f, 0x1e, 0x31, 0xff, 0xce, 0x2e,
+ 0x0e, 0xeb, 0xff, 0x2f,
+ 0x30, 0xf3, 0x15, 0x0e, 0xda, 0x10, 0x32, 0x0f, 0xac, 0x01, 0x03, 0x00,
+ 0xed, 0xdd, 0x01, 0xf3,
+ 0xc2, 0xe0, 0x00, 0x02, 0x15, 0x21, 0xe4, 0x40, 0x10, 0x02, 0x04, 0xfe,
+ 0xec, 0x01, 0x25, 0x11,
+ 0xf1, 0xe1, 0x01, 0xcf, 0x00, 0xf5, 0xe0, 0xcf, 0x0f, 0xef, 0x00, 0x55,
+ 0x11, 0x0e, 0xfe, 0x41,
+ 0x35, 0x10, 0x0c, 0x31, 0x11, 0x00, 0x0f, 0x30, 0x1f, 0x1d, 0x52, 0x02,
+ 0x0d, 0xeb, 0x60, 0x36,
+ 0x11, 0x0f, 0xff, 0x00, 0x40, 0xe0, 0xed, 0xee, 0x00, 0x00, 0xef, 0xee,
+ 0x0d, 0x0e, 0xed, 0xdd,
+ 0x11, 0x16, 0xae, 0xed, 0x04, 0xe2, 0xd0, 0x00, 0x01, 0xe0, 0x12, 0x42,
+ 0xff, 0xac, 0x13, 0x77,
+ 0x10, 0xee, 0x20, 0x3f, 0xf0, 0x04, 0x11, 0x32, 0x00, 0x02, 0x01, 0xf3,
+ 0xf1, 0x04, 0xf2, 0xdf,
+ 0xf0, 0x00, 0xdc, 0x01, 0x00, 0xee, 0xec, 0x0e, 0x0d, 0xbc, 0xcd, 0x2f,
+ 0x30, 0xa1, 0x0f, 0xfa,
+ 0xff, 0xe0, 0x02, 0x01, 0x0e, 0xfb, 0x00, 0x20, 0x12, 0x00, 0x0e, 0x2e,
+ 0x0f, 0xdc, 0x1f, 0x10,
+ 0x20, 0x0f, 0x11, 0x33, 0x40, 0xf0, 0xd1, 0x10, 0x1c, 0xe0, 0x03, 0x01,
+ 0x0e, 0x0d, 0xc1, 0x12,
+ 0x00, 0xae, 0xfb, 0x0f, 0x03, 0x36, 0x01, 0x20, 0x32, 0x00, 0x01, 0x10,
+ 0x20, 0xf2, 0xe2, 0x12,
+ 0x43, 0x01, 0xbe, 0xfb, 0xf0, 0x01, 0x02, 0xf3, 0xe0, 0xfd, 0xff, 0xff,
+ 0x33, 0x73, 0x0e, 0xeb,
+ 0x11, 0x33, 0x20, 0x10, 0x02, 0x22, 0x12, 0xfd, 0xdc, 0xfd, 0x43, 0x14,
+ 0xf0, 0x0f, 0x1f, 0x30,
+ 0x01, 0x10, 0x0e, 0xdf, 0x0f, 0x00, 0xee, 0x0f, 0x0c, 0xcb, 0xe0, 0x40,
+ 0x22, 0xef, 0xec, 0x0f,
+ 0x0f, 0x01, 0x04, 0x02, 0xf0, 0xcf, 0x0f, 0x21, 0x00, 0xc0, 0x11, 0x77,
+ 0xf0, 0xeb, 0x00, 0x40,
+ 0x13, 0x11, 0x10, 0x0f, 0xf0, 0x10, 0x11, 0x36, 0x12, 0x20, 0xdf, 0xe0,
+ 0x25, 0x02, 0xe0, 0xfe,
+ 0xdf, 0x10, 0x56, 0x13, 0x10, 0xe0, 0x00, 0xf0, 0xfe, 0x42, 0xe1, 0x90,
+ 0x33, 0x34, 0xbc, 0x0b,
+ 0xf0, 0x21, 0x22, 0xf0, 0x0e, 0x3e, 0x0f, 0x10, 0x2e, 0xe0, 0x01, 0x0e,
+ 0xff, 0xbf, 0xec, 0xfd,
+ 0xfd, 0xef, 0xe0, 0x33, 0x0c, 0x8a, 0x00, 0x00, 0x00, 0x0d, 0x01, 0x00,
+ 0xcc, 0x0d, 0xff, 0xdf,
+ 0xee, 0xef, 0x00, 0x0f, 0xd0, 0x00, 0x10, 0x20, 0x24, 0x41, 0x21, 0x0d,
+ 0x3f, 0x43, 0x27, 0x20,
+ 0x0f, 0xce, 0x00, 0xf0, 0x00, 0xef, 0xcf, 0x02, 0x12, 0xef, 0xbc, 0x0d,
+ 0x0f, 0xef, 0x0f, 0x10,
+ 0x35, 0xe0, 0xed, 0x1f, 0x03, 0xf1, 0x02, 0xf2, 0xcf, 0x0b, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x88, 0x13, 0xa4, 0x0f, 0xc4, 0x14, 0x10, 0x11, 0x42, 0x01, 0xef, 0x4e,
+ 0x1e, 0x22, 0x31, 0xf0,
+ 0x22, 0x20, 0x01, 0x12, 0xd0, 0xe0, 0xf0, 0xcf, 0x0f, 0x11, 0xf1, 0xef,
+ 0xfe, 0x02, 0x12, 0xef,
+ 0xf1, 0x01, 0x00, 0xe0, 0xf0, 0x0f, 0x00, 0x14, 0x0f, 0xed, 0x01, 0x2e,
+ 0x00, 0x33, 0x23, 0x00,
+ 0x10, 0x30, 0xfe, 0xef, 0x11, 0x11, 0x22, 0x02, 0x05, 0xf0, 0x00, 0x24,
+ 0x00, 0x00, 0x33, 0x10,
+ 0x10, 0x20, 0x30, 0x34, 0x21, 0x12, 0x00, 0xfc, 0x11, 0x25, 0xe0, 0xdf,
+ 0xfd, 0xe0, 0xf3, 0xf2,
+ 0x01, 0x1f, 0x0d, 0x00, 0x00, 0x0d, 0x10, 0x20, 0x2e, 0x21, 0x0f, 0x0a,
+ 0xee, 0xfd, 0x20, 0x45,
+ 0x00, 0x0d, 0xbd, 0x01, 0x34, 0x01, 0xbc, 0xee, 0x00, 0x10, 0xdb, 0xff,
+ 0xf0, 0xf1, 0x01, 0xde,
+ 0xdf, 0x23, 0x24, 0x12, 0x03, 0xf0, 0x04, 0x30, 0x00, 0x05, 0x13, 0xef,
+ 0xe0, 0xe1, 0xf0, 0xdc,
+ 0xcd, 0xf1, 0x07, 0x01, 0xe0, 0x00, 0xfe, 0xde, 0x02, 0x12, 0x32, 0x00,
+ 0x2f, 0x1f, 0x3c, 0x0e,
+ 0x41, 0x12, 0x10, 0x2d, 0x0f, 0x0e, 0x00, 0x30, 0x3f, 0x0f, 0x24, 0x42,
+ 0x0f, 0x3d, 0x43, 0x33,
+ 0x00, 0x0f, 0x00, 0x00, 0x0b, 0x0f, 0xee, 0xe0, 0xf0, 0x23, 0x02, 0xce,
+ 0xff, 0xe0, 0x00, 0xbf,
+ 0x02, 0xf6, 0xf0, 0x02, 0xc0, 0xdb, 0x00, 0x31, 0x44, 0x0e, 0xfd, 0x2f,
+ 0x40, 0x41, 0x57, 0x13,
+ 0x10, 0x0e, 0x0f, 0x12, 0x52, 0x05, 0x00, 0x03, 0x20, 0xf0, 0x01, 0xd0,
+ 0xde, 0x01, 0x33, 0x02,
+ 0xfe, 0xda, 0xff, 0x0f, 0x20, 0x15, 0x11, 0xfe, 0xcb, 0xd0, 0x12, 0x10,
+ 0xde, 0xd0, 0xf0, 0xf0,
+ 0xf1, 0xed, 0x0d, 0x00, 0x1d, 0xff, 0x0e, 0x12, 0x64, 0x00, 0x2d, 0x00,
+ 0xe0, 0xea, 0x10, 0x32,
+ 0xf0, 0xef, 0x0d, 0x12, 0x37, 0x00, 0xdf, 0xcd, 0xef, 0x00, 0x01, 0xe0,
+ 0xf0, 0xf0, 0x00, 0xe0,
+ 0xcd, 0xea, 0x12, 0x43, 0x12, 0xf0, 0x03, 0x20, 0x20, 0x21, 0x34, 0x00,
+ 0xf0, 0xd0, 0x01, 0x00,
+ 0x00, 0xff, 0xcb, 0xdf, 0x01, 0x15, 0xff, 0xde, 0xee, 0xe0, 0x25, 0x42,
+ 0x20, 0x20, 0x2f, 0x10,
+ 0x23, 0x00, 0x22, 0x13, 0x01, 0xf0, 0xcd, 0x0e, 0x01, 0x02, 0x12, 0x03,
+ 0x0e, 0x0a, 0x00, 0xf0,
+ 0x40, 0x20, 0x00, 0x0e, 0x2d, 0x0c, 0x0e, 0xea, 0xde, 0x20, 0x41, 0xf0,
+ 0xdd, 0x0e, 0xee, 0xec,
+ 0xcf, 0xe0, 0x03, 0x00, 0x0f, 0xde, 0x0f, 0x00, 0x21, 0xf0, 0x0f, 0x10,
+ 0x0e, 0xf0, 0x02, 0x34,
+ 0x24, 0x12, 0xff, 0xed, 0xff, 0x11, 0x55, 0x13, 0x13, 0xf0, 0xef, 0x25,
+ 0x12, 0x02, 0xe0, 0xf2,
+ 0x23, 0x11, 0x01, 0x00, 0xee, 0xfc, 0x33, 0x52, 0xff, 0xef, 0x00, 0x00,
+ 0x30, 0x0e, 0x01, 0xe2,
+ 0x0f, 0x20, 0x00, 0xcf, 0x01, 0x01, 0x0f, 0xee, 0xf0, 0x0c, 0x0e, 0x00,
+ 0xff, 0xdb, 0x0e, 0x1f,
+ 0x0e, 0xf0, 0xdd, 0x0f, 0x00, 0xe0, 0xf1, 0xdc, 0xbb, 0xff, 0xf0, 0x0f,
+ 0xbe, 0xdb, 0x0e, 0xef,
+ 0xfe, 0x0f, 0x10, 0x00, 0x20, 0x24, 0x44, 0x23, 0x23, 0x20, 0x21, 0x44,
+ 0x02, 0xf0, 0x13, 0x0f,
+ 0x1e, 0x00, 0xef, 0xed, 0xfe, 0x00, 0xf1, 0x01, 0x10, 0xe1, 0x02, 0x01,
+ 0x00, 0x0e, 0x10, 0x13,
+ 0x00, 0xed, 0xff, 0x31, 0x10, 0x00, 0x00, 0xdd, 0xfc, 0xfd, 0x20, 0x32,
+ 0x22, 0x10, 0x32, 0x00,
+ 0x10, 0x20, 0x04, 0x35, 0x00, 0xcd, 0x11, 0x03, 0x00, 0xc0, 0x00, 0x00,
+ 0x24, 0xde, 0xbc, 0x01,
+ 0x37, 0xc0, 0xe0, 0x00, 0x21, 0x00, 0x0f, 0x03, 0x31, 0xfd, 0xfe, 0x20,
+ 0x34, 0x0e, 0x0b, 0x00,
+ 0x42, 0x02, 0xfe, 0x10, 0x40, 0xff, 0xec, 0x23, 0x22, 0x00, 0xe0, 0x0e,
+ 0x00, 0x01, 0x00, 0xf2,
+ 0x14, 0x31, 0x10, 0xf0, 0x0e, 0x30, 0x13, 0x13, 0x46, 0x20, 0xdf, 0xde,
+ 0x11, 0x56, 0x01, 0xff,
+ 0xfe, 0x00, 0xe1, 0x0e, 0x01, 0x20, 0x10, 0x00, 0x01, 0x2e, 0x2c, 0x1f,
+ 0x21, 0x12, 0x1d, 0xfc,
+ 0xdd, 0x0c, 0x0e, 0x0f, 0xef, 0xe0, 0x02, 0x1f, 0xff, 0xcb, 0xf0, 0x01,
+ 0xe0, 0xca, 0x00, 0x01,
+ 0xd0, 0xed, 0x21, 0x25, 0x02, 0x00, 0x11, 0x00, 0x13, 0x12, 0x13, 0x33,
+ 0x03, 0xd0, 0xd0, 0x10,
+ 0x33, 0xf1, 0xd1, 0xe0, 0xcd, 0xf1, 0x17, 0x00, 0xef, 0xef, 0xe0, 0x0f,
+ 0x02, 0xf2, 0x00, 0x4f,
+ 0x10, 0x32, 0x11, 0xfe, 0x20, 0x31, 0x22, 0x10, 0x00, 0xfe, 0x00, 0x30,
+ 0x44, 0x22, 0x0f, 0xcc,
+ 0x4f, 0x30, 0x34, 0x41, 0x1e, 0x0e, 0x1f, 0x0d, 0x0e, 0xfe, 0xfe, 0x00,
+ 0x04, 0xdf, 0xbd, 0x0f,
+ 0xd0, 0xd0, 0xbc, 0xef, 0x02, 0xf0, 0xf0, 0x00, 0xd9, 0x10, 0x32, 0x21,
+ 0x30, 0x0e, 0xee, 0x0f,
+ 0x42, 0x37, 0x01, 0x22, 0x12, 0xfe, 0x00, 0x04, 0x44, 0x00, 0x0f, 0xe0,
+ 0x32, 0x21, 0x00, 0xf0,
+ 0x14, 0x32, 0xf0, 0xc8, 0x0f, 0x0f, 0x00, 0x00, 0x05, 0x0f, 0xcc, 0xdf,
+ 0xf0, 0x00, 0xdf, 0xcf,
+ 0xf0, 0x00, 0xcf, 0xed, 0x0f, 0xfd, 0x10, 0x11, 0x12, 0x20, 0xdd, 0xfd,
+ 0x43, 0x47, 0x0f, 0xec,
+ 0x0f, 0x10, 0x31, 0xf0, 0xee, 0x22, 0x12, 0x10, 0x00, 0xe0, 0xef, 0x00,
+ 0xcd, 0xee, 0x01, 0x00,
+ 0xe0, 0x00, 0x0e, 0x00, 0x20, 0x02, 0x14, 0x21, 0x11, 0x13, 0x13, 0x03,
+ 0x12, 0x43, 0x03, 0xef,
+ 0xec, 0x00, 0x13, 0xe0, 0xba, 0x0f, 0xe0, 0x00, 0x00, 0x01, 0xf1, 0xe0,
+ 0xfd, 0x00, 0x20, 0x31,
+ 0x45, 0x34, 0x20, 0x0f, 0xff, 0x00, 0x10, 0x10, 0xee, 0xf0, 0x01, 0x02,
+ 0x10, 0x2e, 0x02, 0x11,
+ 0xfd, 0x0d, 0x12, 0x54, 0x00, 0x0e, 0x0e, 0x00, 0x12, 0xfe, 0xfa, 0xef,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x10, 0xed, 0xdd, 0x01, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f,
+ 0x10, 0x34, 0x01, 0xed,
+ 0x00, 0x33, 0x31, 0x12, 0x20, 0xfd, 0xee, 0x02, 0x57, 0x12, 0x00, 0xd0,
+ 0xef, 0xd0, 0x01, 0x05,
+ 0xf1, 0xef, 0xf0, 0xf1, 0xe0, 0x31, 0x11, 0x00, 0x03, 0x3f, 0x1f, 0x1e,
+ 0x44, 0x26, 0x00, 0x01,
+ 0x20, 0x01, 0x00, 0x0e, 0xed, 0x00, 0x01, 0x1f, 0x12, 0x00, 0xfc, 0xee,
+ 0x21, 0x45, 0x01, 0x1f,
+ 0xea, 0xdf, 0x10, 0x0d, 0xf0, 0xe0, 0xe0, 0xec, 0xee, 0xcd, 0xeb, 0xde,
+ 0xed, 0xce, 0xfe, 0xcc,
+ 0xfe, 0x0e, 0xf2, 0x01, 0x10, 0xfe, 0xef, 0x0f, 0x31, 0x54, 0x15, 0x31,
+ 0x00, 0xf0, 0x1f, 0x30,
+ 0x2e, 0x0f, 0xf0, 0x13, 0x22, 0xfd, 0xdc, 0xef, 0xee, 0x03, 0xf4, 0xd2,
+ 0xd0, 0xff, 0xdc, 0xf0,
+ 0x23, 0x55, 0x00, 0xfe, 0xcd, 0x0e, 0x0d, 0x0e, 0x0e, 0x10, 0xff, 0x01,
+ 0x01, 0x0e, 0xff, 0x03,
+ 0x34, 0x02, 0x00, 0x2e, 0x21, 0x02, 0x20, 0x0e, 0x00, 0x11, 0xf0, 0xec,
+ 0x01, 0xf1, 0x01, 0x10,
+ 0xcf, 0xf0, 0xf0, 0xe1, 0xee, 0xf0, 0x14, 0x11, 0x0f, 0x10, 0x13, 0xff,
+ 0xeb, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x01, 0x12, 0xe0, 0x01, 0x22, 0x0f, 0xfe, 0x00, 0x22, 0x35,
+ 0x30, 0x00, 0x02, 0x43,
+ 0x21, 0x00, 0x01, 0x14, 0x11, 0x10, 0x10, 0x0e, 0xcf, 0x13, 0x56, 0x0f,
+ 0x0f, 0xf0, 0x10, 0x06,
+ 0x00, 0x01, 0x10, 0x0e, 0x00, 0xef, 0x12, 0x23, 0x22, 0x0d, 0xce, 0x0f,
+ 0x2e, 0x41, 0x14, 0x1f,
+ 0xfe, 0xdb, 0x0d, 0x0e, 0x10, 0x0e, 0x0d, 0xde, 0x00, 0x02, 0xff, 0x0f,
+ 0x00, 0x11, 0xdc, 0xbb,
+ 0x0f, 0xfe, 0x11, 0x21, 0xe0, 0xf0, 0xe0, 0xf0, 0x10, 0x12, 0x03, 0xf2,
+ 0xe1, 0xf2, 0x37, 0x22,
+ 0xef, 0xd0, 0xf0, 0x13, 0x12, 0xef, 0xd8, 0xe0, 0x0f, 0x00, 0x13, 0xe0,
+ 0xde, 0xdf, 0x0f, 0x0f,
+ 0xf1, 0xf2, 0x31, 0x30, 0x10, 0x11, 0x30, 0x52, 0x01, 0x0c, 0x10, 0x10,
+ 0x20, 0x0c, 0x2f, 0x41,
+ 0x13, 0x01, 0x20, 0x4f, 0x53, 0x00, 0x0a, 0x00, 0x32, 0xf1, 0x03, 0x21,
+ 0xf0, 0xde, 0xe0, 0xef,
+ 0xcd, 0xe0, 0xd1, 0xf0, 0xda, 0x00, 0x02, 0x00, 0x0f, 0x1f, 0xfd, 0xff,
+ 0x20, 0x22, 0x33, 0x23,
+ 0x13, 0x00, 0x00, 0x20, 0x02, 0x04, 0x22, 0x00, 0xff, 0x44, 0x43, 0x1f,
+ 0x0f, 0x01, 0x33, 0x10,
+ 0x0f, 0x01, 0x02, 0x01, 0x00, 0xf1, 0x22, 0xdd, 0xca, 0xf0, 0x14, 0x00,
+ 0xed, 0xee, 0x00, 0x02,
+ 0x1f, 0x00, 0xef, 0xfe, 0x00, 0x0f, 0xf1, 0x21, 0x1e, 0xfd, 0x00, 0x20,
+ 0x0f, 0x01, 0x13, 0x21,
+ 0x02, 0x0d, 0xd9, 0x10, 0x30, 0xe2, 0xff, 0x0f, 0x0f, 0xdf, 0x00, 0xf0,
+ 0xff, 0x00, 0xc0, 0xfe,
+ 0xe0, 0xeb, 0xed, 0x00, 0x27, 0x31, 0xff, 0xd0, 0x20, 0x11, 0x12, 0x02,
+ 0xf2, 0xf1, 0x01, 0x24,
+ 0x42, 0xfe, 0xde, 0x0f, 0x00, 0x0f, 0x1e, 0x0d, 0xcd, 0x0f, 0x03, 0x14,
+ 0xf2, 0xef, 0xde, 0xf0,
+ 0x00, 0x02, 0x01, 0x42, 0x15, 0x20, 0x00, 0x0d, 0xee, 0xff, 0x10, 0x04,
+ 0x11, 0x02, 0xee, 0xfe,
+ 0x21, 0x24, 0x00, 0xed, 0x20, 0x52, 0x0f, 0x0b, 0x0e, 0x20, 0x21, 0x20,
+ 0xfa, 0xee, 0x0e, 0x0f,
+ 0xdf, 0xff, 0xf2, 0xf0, 0xc8, 0x00, 0x00, 0xef, 0xf0, 0x00, 0x02, 0x1f,
+ 0x0c, 0x0e, 0x2e, 0x0f,
+ 0x33, 0x24, 0xef, 0x0f, 0xf2, 0xf0, 0x04, 0x03, 0x00, 0xe0, 0x14, 0x01,
+ 0x01, 0x03, 0xe0, 0x12,
+ 0x22, 0x34, 0x12, 0x0f, 0xfe, 0x01, 0xf2, 0x01, 0x00, 0x00, 0xf1, 0xf1,
+ 0x00, 0x01, 0x41, 0x01,
+ 0x01, 0xe0, 0x1f, 0x10, 0x0e, 0xf0, 0x24, 0x02, 0x1f, 0xfb, 0xdf, 0xee,
+ 0x12, 0x45, 0x00, 0x00,
+ 0x01, 0x00, 0x1e, 0xfc, 0xde, 0x0d, 0xeb, 0x0f, 0xed, 0xde, 0xff, 0xef,
+ 0xdc, 0xef, 0xee, 0xcd,
+ 0xed, 0xdc, 0xfe, 0xdf, 0x00, 0x21, 0x02, 0x11, 0xff, 0x0b, 0x0f, 0x21,
+ 0x12, 0x02, 0x13, 0x41,
+ 0x11, 0x30, 0x03, 0x33, 0x00, 0x01, 0x01, 0x22, 0xf0, 0xec, 0x00, 0x04,
+ 0xf0, 0xc1, 0xff, 0x02,
+ 0x12, 0xdb, 0xde, 0x10, 0x33, 0x11, 0x0d, 0x0e, 0x10, 0x1e, 0x0d, 0x01,
+ 0x23, 0x0f, 0xed, 0x0f,
+ 0x2f, 0x11, 0x04, 0x00, 0x2e, 0x22, 0x01, 0xcf, 0x10, 0x64, 0x03, 0xff,
+ 0xef, 0x0e, 0xf1, 0x03,
+ 0x03, 0x02, 0xe0, 0xee, 0x01, 0x00, 0x00, 0xfd, 0xf1, 0x03, 0x21, 0x20,
+ 0x12, 0x10, 0x0e, 0xda,
+ 0x00, 0x24, 0x20, 0x00, 0xff, 0xfe, 0x00, 0xff, 0x00, 0x32, 0x10, 0x0e,
+ 0x0e, 0x0e, 0x11, 0x32,
+ 0x25, 0x21, 0x20, 0x10, 0xfd, 0xf0, 0x04, 0x03, 0x02, 0x0e, 0xdd, 0x00,
+ 0x00, 0x03, 0x15, 0x31,
+ 0x11, 0x00, 0x00, 0x54, 0x00, 0x10, 0x25, 0x20, 0xf0, 0xee, 0x00, 0x21,
+ 0x00, 0x0f, 0x0f, 0x2f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x0d, 0xdd, 0xfc, 0xfd, 0xee, 0x0f,
+ 0x12, 0xff, 0xfc, 0xf0,
+ 0xe1, 0xec, 0xfc, 0xf0, 0x00, 0xf0, 0x1d, 0x00, 0x02, 0x00, 0x00, 0x04,
+ 0x23, 0xf1, 0xe2, 0xf2,
+ 0x12, 0x12, 0x22, 0x01, 0xd1, 0xf1, 0x12, 0x21, 0x0f, 0xec, 0xe1, 0xf1,
+ 0xdf, 0xdf, 0xf0, 0x03,
+ 0x03, 0xe0, 0x02, 0x0f, 0x01, 0x14, 0x1e, 0x0c, 0x10, 0x23, 0x22, 0x20,
+ 0x32, 0x00, 0xfc, 0xee,
+ 0x3f, 0x52, 0x24, 0x10, 0x21, 0x43, 0x32, 0x11, 0x20, 0x0f, 0xfe, 0x00,
+ 0x01, 0x00, 0xe0, 0xfc,
+ 0xff, 0xde, 0xfe, 0xde, 0xcf, 0xfc, 0xf0, 0x0f, 0xfd, 0xef, 0x00, 0x32,
+ 0x11, 0xff, 0xdc, 0xee,
+ 0xef, 0x23, 0x57, 0x00, 0xed, 0xf0, 0x01, 0x02, 0x14, 0x12, 0x10, 0x02,
+ 0x21, 0x22, 0x11, 0x21,
+ 0x46, 0x21, 0x22, 0x0f, 0x0f, 0x1d, 0x00, 0xd2, 0x05, 0x0f, 0xda, 0xef,
+ 0xe0, 0xef, 0xf0, 0xf0,
+ 0xef, 0xfd, 0xf0, 0xfe, 0xee, 0x0e, 0x10, 0x00, 0xf0, 0x0f, 0x0c, 0x0e,
+ 0x00, 0x13, 0x44, 0x0e,
+ 0xdc, 0x00, 0x02, 0x24, 0x0e, 0x00, 0x13, 0x00, 0xfc, 0xef, 0x0e, 0xec,
+ 0x00, 0x03, 0x2f, 0x0e,
+ 0xff, 0xf0, 0x01, 0x00, 0xde, 0xf0, 0x01, 0x13, 0x12, 0x13, 0x00, 0xf0,
+ 0xd0, 0x00, 0x32, 0xef,
+ 0xd0, 0x00, 0x34, 0x34, 0x10, 0xec, 0xe0, 0x00, 0x31, 0x01, 0xf0, 0xff,
+ 0xf0, 0xce, 0x00, 0x01,
+ 0x21, 0x00, 0xef, 0x0e, 0x00, 0x11, 0x43, 0x00, 0x12, 0x12, 0x00, 0xfd,
+ 0xf0, 0x01, 0x03, 0x10,
+ 0xff, 0xfe, 0x00, 0x20, 0x01, 0x31, 0x30, 0x20, 0x21, 0x21, 0x0f, 0x0f,
+ 0x10, 0x25, 0x10, 0xfe,
+ 0xed, 0xf0, 0xff, 0xdc, 0xf0, 0xf1, 0x00, 0xed, 0xfe, 0x00, 0x00, 0x00,
+ 0x52, 0x1f, 0x0e, 0x10,
+ 0x0d, 0xee, 0x46, 0x42, 0x02, 0x0f, 0xbc, 0xf0, 0xff, 0x00, 0x05, 0x10,
+ 0x0f, 0xe0, 0x00, 0x11,
+ 0x11, 0xe0, 0x00, 0x04, 0x14, 0x00, 0xef, 0x05, 0x02, 0xd0, 0x0e, 0x0e,
+ 0x00, 0xee, 0x01, 0x25,
+ 0x20, 0x1f, 0x20, 0x35, 0x00, 0x2f, 0x12, 0x22, 0x15, 0x11, 0x00, 0x00,
+ 0x20, 0x02, 0x10, 0xf0,
+ 0xfd, 0x10, 0x31, 0x00, 0x0c, 0x10, 0x44, 0xec, 0xcd, 0xfd, 0xdb, 0xfe,
+ 0xff, 0xf0, 0xcf, 0xcb,
+ 0xff, 0xee, 0xfd, 0xcd, 0xf0, 0xdd, 0xee, 0x0e, 0x0d, 0x0f, 0x00, 0x0e,
+ 0x1f, 0x41, 0x11, 0x00,
+ 0x0f, 0x00, 0x15, 0x21, 0x00, 0x11, 0x25, 0xfe, 0x00, 0x23, 0x02, 0xe0,
+ 0xee, 0xf0, 0xf0, 0xed,
+ 0xf0, 0x01, 0x04, 0xff, 0xcb, 0x00, 0x02, 0x10, 0x0d, 0x10, 0x11, 0xe0,
+ 0xeb, 0xfe, 0x00, 0x21,
+ 0xf0, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x23, 0x10, 0x0f, 0xdf, 0x23,
+ 0x24, 0x0f, 0xfd, 0x1f,
+ 0xfe, 0xee, 0x02, 0x13, 0xef, 0xee, 0x00, 0x02, 0x00, 0x0f, 0xd0, 0x00,
+ 0x21, 0xff, 0xff, 0x00,
+ 0x01, 0x0f, 0x0f, 0x0f, 0x11, 0x00, 0xde, 0xf0, 0x01, 0x00, 0x01, 0x33,
+ 0x23, 0x1f, 0x0d, 0x01,
+ 0x04, 0x31, 0x22, 0x22, 0x22, 0x0f, 0xff, 0x20, 0x25, 0x11, 0x00, 0x02,
+ 0xef, 0xca, 0x10, 0x25,
+ 0x31, 0x10, 0x11, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x0f, 0x0f, 0xee,
+ 0x00, 0x22, 0x23, 0x12,
+ 0xfe, 0xdd, 0x10, 0x22, 0x10, 0x11, 0x02, 0x1f, 0xfb, 0xef, 0xfe, 0x0d,
+ 0x0b, 0x00, 0x21, 0x11,
+ 0xeb, 0xcd, 0x0d, 0x10, 0xf0, 0xd0, 0xf1, 0xe0, 0x0f, 0x00, 0xe0, 0xff,
+ 0xf0, 0x01, 0x13, 0x30,
+ 0x00, 0xf0, 0xc0, 0x11, 0x34, 0x10, 0xdf, 0xee, 0x11, 0x37, 0x01, 0xf0,
+ 0xdf, 0xe0, 0xd0, 0xee,
+ 0xbe, 0xf0, 0x01, 0xe4, 0x00, 0xf0, 0x0e, 0x20, 0x10, 0x1c, 0x21, 0x43,
+ 0x0e, 0x3e, 0x52, 0x10,
+ 0x0e, 0x20, 0x02, 0x12, 0x31, 0x21, 0x00, 0x30, 0x24, 0x33, 0x10, 0x00,
+ 0x00, 0x00, 0x1f, 0x23,
+ 0x01, 0xed, 0xef, 0x00, 0x0e, 0xfc, 0xee, 0x02, 0xe2, 0xef, 0xed, 0xff,
+ 0xdf, 0x0e, 0x00, 0x21,
+ 0x14, 0x0f, 0xee, 0x00, 0x20, 0x44, 0x12, 0x0f, 0xdf, 0x00, 0x43, 0x27,
+ 0x20, 0xff, 0xff, 0x10,
+ 0x42, 0x35, 0x21, 0x00, 0x22, 0x10, 0x00, 0x0e, 0xf1, 0xf1, 0x01, 0x04,
+ 0xf0, 0xdc, 0xee, 0xe0,
+ 0x13, 0x0f, 0xb8, 0x00, 0x20, 0x10, 0x11, 0x00, 0x10, 0x0d, 0x00, 0x22,
+ 0x00, 0x0f, 0x01, 0x16,
+ 0x10, 0x0f, 0x0f, 0xcd, 0x00, 0x30, 0x05, 0x0f, 0xfe, 0x0e, 0x00, 0x00,
+ 0x1d, 0x00, 0x00, 0xff,
+ 0xef, 0xfe, 0xfd, 0xe2, 0x02, 0xe2, 0xef, 0xdc, 0xf0, 0xe1, 0x00, 0x10,
+ 0x24, 0x12, 0xdf, 0xfd,
+ 0x20, 0x33, 0x00, 0xcf, 0x00, 0x14, 0xf1, 0x00, 0x00, 0x0d, 0x00, 0x13,
+ 0x00, 0x10, 0x10, 0xe0,
+ 0xdd, 0xfd, 0x32, 0x13, 0x02, 0x02, 0xf0, 0xee, 0xfe, 0x00, 0x24, 0x02,
+ 0xe1, 0xee, 0x0c, 0x00,
+ 0x21, 0x01, 0xe0, 0x00, 0x10, 0x1f, 0x10, 0x42, 0x12, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb1, 0x1a, 0x5f, 0x28, 0x58, 0x1a, 0x4e, 0x27, 0x0d, 0xec, 0x0e, 0x20,
+ 0x23, 0x0f, 0xed, 0xfe,
+ 0xfd, 0x0a, 0xde, 0xff, 0x10, 0x20, 0x11, 0x01, 0x00, 0x0f, 0x0d, 0x0f,
+ 0x11, 0x12, 0x0f, 0xfc,
+ 0x10, 0x0e, 0xe0, 0x00, 0x11, 0x00, 0xde, 0x00, 0x12, 0x13, 0x01, 0xe2,
+ 0x05, 0x33, 0x01, 0x00,
+ 0xe1, 0x01, 0xe0, 0x00, 0x03, 0x34, 0xf0, 0xec, 0x00, 0xe1, 0xec, 0x00,
+ 0x33, 0xd0, 0xf0, 0x0f,
+ 0x31, 0x14, 0x22, 0x12, 0x11, 0x0f, 0x0f, 0x10, 0x22, 0x10, 0x11, 0x00,
+ 0x0e, 0x00, 0x02, 0x0f,
+ 0x0f, 0xe0, 0xf0, 0x00, 0x11, 0x02, 0xdc, 0xec, 0x00, 0x10, 0xfd, 0xdc,
+ 0xee, 0xdb, 0xee, 0xdf,
+ 0xfd, 0xe0, 0xee, 0x00, 0xca, 0xee, 0xf0, 0x00, 0x10, 0x11, 0x10, 0x00,
+ 0x0d, 0x4f, 0x00, 0x12,
+ 0x10, 0x03, 0x13, 0x12, 0x22, 0x11, 0x02, 0x01, 0x02, 0x02, 0xf1, 0x02,
+ 0xe0, 0xca, 0xf0, 0x10,
+ 0x03, 0x00, 0x20, 0xfc, 0xdf, 0x0e, 0x21, 0x21, 0x11, 0xf0, 0x0b, 0x00,
+ 0x1f, 0x1e, 0x00, 0x00,
+ 0xe0, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x22, 0x04, 0xfe, 0xf0, 0x11, 0x42,
+ 0x14, 0x00, 0xe0, 0x00,
+ 0x01, 0x11, 0x00, 0xdd, 0xdf, 0x02, 0x14, 0x10, 0xf0, 0xff, 0xff, 0xf0,
+ 0x00, 0x01, 0x02, 0xff,
+ 0x0f, 0x2f, 0x1f, 0x21, 0x03, 0x00, 0x31, 0x0e, 0x1d, 0x10, 0x0f, 0xfe,
+ 0x00, 0x34, 0x10, 0xfa,
+ 0x00, 0x13, 0x00, 0x00, 0x02, 0x01, 0x10, 0x0f, 0x03, 0x03, 0x00, 0x02,
+ 0x0e, 0xe1, 0x02, 0x20,
+ 0x33, 0x23, 0x1f, 0x00, 0x33, 0x0d, 0xf0, 0x23, 0x45, 0x00, 0xef, 0x01,
+ 0x44, 0x00, 0xde, 0x10,
+ 0x01, 0x20, 0x02, 0x1f, 0xed, 0x00, 0x0e, 0x1f, 0x0d, 0x1e, 0x1d, 0x0e,
+ 0x0f, 0x30, 0xfd, 0xca,
+ 0x00, 0x00, 0xe0, 0xe0, 0xce, 0x01, 0xd0, 0x00, 0xf0, 0x0e, 0xff, 0xef,
+ 0x0e, 0x51, 0x33, 0x00,
+ 0xdf, 0x00, 0x14, 0x32, 0xf1, 0xd0, 0x01, 0x03, 0x04, 0xf4, 0x00, 0xf1,
+ 0xd0, 0xb8, 0xe0, 0x11,
+ 0x02, 0xef, 0xef, 0x00, 0x20, 0x0f, 0x00, 0x10, 0x40, 0x02, 0x10, 0x00,
+ 0x20, 0x22, 0x32, 0x01,
+ 0xf0, 0x00, 0x55, 0x11, 0x10, 0x20, 0x00, 0xff, 0x12, 0x46, 0x00, 0x0e,
+ 0x20, 0x10, 0x00, 0xc0,
+ 0x0f, 0xfe, 0xfc, 0xfc, 0xff, 0xf0, 0x0f, 0x01, 0x10, 0xed, 0xdc, 0xec,
+ 0x0f, 0xf0, 0x15, 0x31,
+ 0xe0, 0xdd, 0xec, 0xf0, 0x00, 0x34, 0x01, 0xce, 0x22, 0x45, 0x00, 0x00,
+ 0xef, 0x35, 0x54, 0x00,
+ 0x1f, 0x12, 0x00, 0xe3, 0x25, 0x22, 0x0d, 0xfb, 0xd0, 0xf0, 0x01, 0xf0,
+ 0xfc, 0xee, 0x00, 0xdd,
+ 0xfd, 0x0e, 0x10, 0x21, 0x04, 0x0d, 0xfc, 0x00, 0x00, 0x20, 0x0e, 0x00,
+ 0x02, 0x0f, 0x0f, 0x01,
+ 0xf0, 0xcc, 0x10, 0x21, 0x03, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x20, 0x10,
+ 0x00, 0x1e, 0x0e, 0xee,
+ 0xfe, 0x00, 0xf2, 0xe0, 0x01, 0xf0, 0xdf, 0xde, 0x03, 0x01, 0x13, 0x01,
+ 0xef, 0xfd, 0x0f, 0x13,
+ 0x20, 0x0f, 0xf1, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x14, 0x20, 0x12,
+ 0x01, 0xdd, 0xed, 0xfe,
+ 0xf0, 0x04, 0x00, 0x23, 0x12, 0xef, 0xdb, 0xf0, 0x0f, 0x21, 0x22, 0x11,
+ 0x11, 0x10, 0x1f, 0x00,
+ 0x01, 0x22, 0x01, 0x2f, 0x00, 0x20, 0x11, 0x02, 0x02, 0x11, 0x22, 0x0e,
+ 0xda, 0x10, 0x20, 0x02,
+ 0x01, 0x01, 0x0f, 0x09, 0xff, 0xf0, 0x00, 0x02, 0x10, 0x21, 0xf0, 0x0e,
+ 0x1f, 0x00, 0x00, 0x0e,
+ 0x30, 0xf0, 0xfb, 0x0f, 0xfe, 0x01, 0x24, 0x11, 0x10, 0xe0, 0xef, 0x11,
+ 0x01, 0x01, 0x03, 0x00,
+ 0xff, 0x01, 0x00, 0xd0, 0x02, 0x03, 0xee, 0xec, 0xff, 0xf1, 0x02, 0xf2,
+ 0x04, 0x20, 0x00, 0xf0,
+ 0x01, 0xe0, 0x00, 0x03, 0x45, 0x11, 0x20, 0x30, 0x21, 0x20, 0x22, 0x35,
+ 0xee, 0x10, 0x31, 0x23,
+ 0x20, 0x00, 0xf1, 0x01, 0x00, 0x1e, 0xfe, 0xfd, 0xe0, 0x13, 0x12, 0xfc,
+ 0xec, 0xec, 0xdc, 0xef,
+ 0x0e, 0xce, 0xff, 0xdd, 0xec, 0xef, 0xee, 0x00, 0xdc, 0x0e, 0x0e, 0xef,
+ 0xfe, 0x10, 0x30, 0x20,
+ 0x10, 0x0f, 0xf1, 0x22, 0x03, 0xdf, 0x00, 0x03, 0x23, 0x01, 0x01, 0x02,
+ 0x00, 0x02, 0x03, 0x1f,
+ 0xfc, 0xe0, 0xff, 0x02, 0x52, 0x0f, 0xef, 0xed, 0xf0, 0x01, 0xfe, 0xee,
+ 0x00, 0x10, 0xf0, 0xee,
+ 0x00, 0x00, 0xdd, 0x0f, 0x20, 0x22, 0xf0, 0xde, 0x21, 0x22, 0x01, 0xf0,
+ 0xff, 0x11, 0x24, 0x00,
+ 0xf0, 0xef, 0xfd, 0x1f, 0x0f, 0x00, 0xf0, 0xdf, 0x00, 0x00, 0x00, 0x10,
+ 0x02, 0xf0, 0xf1, 0x0f,
+ 0x0f, 0x00, 0xf1, 0xf0, 0xfd, 0x21, 0x12, 0x10, 0x0c, 0xff, 0x20, 0x10,
+ 0x02, 0x01, 0x25, 0x00,
+ 0x00, 0x00, 0x0e, 0xe0, 0x02, 0x56, 0x12, 0x10, 0x00, 0x00, 0x10, 0x22,
+ 0x04, 0x10, 0xfe, 0xfc,
+ 0xf0, 0x04, 0x10, 0x24, 0x12, 0x20, 0x10, 0x1f, 0xff, 0x00, 0x16, 0x11,
+ 0x11, 0x0f, 0xf0, 0x23,
+ 0x10, 0xed, 0xff, 0x02, 0x11, 0x0f, 0xfd, 0x0f, 0x20, 0x00, 0x23, 0x01,
+ 0x0c, 0x0c, 0xfe, 0x0f,
+ 0x20, 0xf0, 0x0f, 0xcc, 0xef, 0x0f, 0x00, 0xe0, 0xdd, 0xfe, 0x0e, 0xf0,
+ 0x0e, 0x2e, 0x10, 0x0d,
+ 0x42, 0x36, 0xff, 0xbe, 0x01, 0x01, 0x01, 0xe2, 0xf2, 0xe1, 0xd1, 0x01,
+ 0xf2, 0xef, 0xdd, 0xdf,
+ 0xf0, 0x12, 0x0f, 0x0e, 0xf0, 0x13, 0x0f, 0x0f, 0x10, 0x0f, 0x00, 0x1f,
+ 0x20, 0x02, 0x0f, 0x1f,
+ 0x31, 0x13, 0x20, 0x20, 0x32, 0x36, 0x20, 0x00, 0x0f, 0x21, 0x54, 0x10,
+ 0x01, 0xf1, 0x02, 0x30,
+ 0x00, 0xf0, 0xfe, 0xed, 0x0d, 0xf0, 0x00, 0xdd, 0xf0, 0xf0, 0x01, 0x21,
+ 0xed, 0xbe, 0x01, 0xf0,
+ 0x00, 0x1f, 0x41, 0x01, 0xcb, 0x0f, 0x41, 0x34, 0x10, 0x1e, 0x10, 0x12,
+ 0x14, 0x21, 0x02, 0x02,
+ 0x12, 0x00, 0x03, 0x11, 0x11, 0xf2, 0x00, 0x44, 0xff, 0x0e, 0x0f, 0xfd,
+ 0xf2, 0x04, 0x00, 0x0b,
+ 0xe0, 0xf0, 0xf0, 0xf0, 0x02, 0x20, 0x00, 0x10, 0x30, 0x00, 0xed, 0x1f,
+ 0x20, 0x00, 0x2f, 0x12,
+ 0x00, 0x00, 0x12, 0xf0, 0xf0, 0xec, 0x10, 0x11, 0x01, 0x11, 0x02, 0x2f,
+ 0x0d, 0xf0, 0x0e, 0x2f,
+ 0x00, 0x00, 0xff, 0xbd, 0xff, 0xdf, 0x00, 0x24, 0xe3, 0xbd, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0xfd,
+ 0x0f, 0x33, 0x11, 0x11, 0x23, 0x00, 0xcc, 0x10, 0x03, 0x01, 0x00, 0xe0,
+ 0x00, 0x11, 0x12, 0x01,
+ 0x11, 0xf1, 0xfe, 0xea, 0x00, 0x1f, 0x43, 0x04, 0xf0, 0xed, 0xee, 0xff,
+ 0x00, 0x01, 0xf2, 0xf0,
+ 0x02, 0xf0, 0x0f, 0x20, 0x31, 0x00, 0x0e, 0xfe, 0x01, 0x00, 0x1c, 0x10,
+ 0x12, 0xf2, 0xde, 0x0d,
+ 0x10, 0x23, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0x0c, 0x1e, 0x20, 0x20, 0x0d,
+ 0x0e, 0x00, 0x10, 0x0f,
+ 0x0d, 0xfe, 0x22, 0x32, 0xed, 0xfe, 0x02, 0xf1, 0xee, 0x1e, 0x32, 0x12,
+ 0xe0, 0x03, 0x12, 0xf0,
+ 0xff, 0xe0, 0xf0, 0xdf, 0x01, 0x26, 0x11, 0x01, 0xcf, 0xff, 0x00, 0x20,
+ 0x03, 0xf3, 0xef, 0xfe,
+ 0x00, 0x21, 0x12, 0xe0, 0xef, 0x00, 0x10, 0x00, 0x10, 0x10, 0x24, 0x21,
+ 0x21, 0x0f, 0x0f, 0xfe,
+ 0x22, 0x46, 0x00, 0xf0, 0x11, 0x22, 0xff, 0xde, 0x0f, 0xe0, 0x00, 0x23,
+ 0xfe, 0xce, 0x0f, 0x2e,
+ 0xdc, 0xde, 0xfc, 0xf0, 0xdd, 0xeb, 0xde, 0x0d, 0xff, 0xdf, 0x0f, 0x1e,
+ 0x0f, 0x10, 0x0c, 0xee,
+ 0x11, 0x44, 0x00, 0x0d, 0x23, 0x02, 0xdd, 0xfe, 0xf1, 0x07, 0x11, 0xe0,
+ 0xee, 0x01, 0x13, 0x02,
+ 0x12, 0x02, 0x33, 0xfc, 0xdd, 0x00, 0x20, 0x23, 0x01, 0x00, 0xce, 0x0d,
+ 0x0e, 0x0e, 0xfd, 0xdf,
+ 0xfe, 0x02, 0x53, 0x10, 0xfc, 0xfe, 0x00, 0x43, 0x02, 0xf0, 0x00, 0x21,
+ 0x44, 0xfd, 0xde, 0x13,
+ 0x20, 0x13, 0x11, 0xf1, 0xde, 0x0f, 0xe1, 0xf1, 0xf0, 0xfe, 0xf0, 0xf0,
+ 0x01, 0x13, 0x04, 0x23,
+ 0x0e, 0xda, 0x00, 0x10, 0x10, 0x0e, 0x00, 0x64, 0x00, 0x0b, 0x10, 0x1f,
+ 0x1f, 0x12, 0x05, 0x0f,
+ 0xdc, 0x01, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x0e, 0x10, 0x13, 0x01, 0x1f,
+ 0x31, 0x12, 0x01, 0x00,
+ 0x0f, 0x10, 0x02, 0x02, 0x04, 0xf0, 0x00, 0x04, 0x22, 0x10, 0x01, 0x01,
+ 0x02, 0x45, 0x1f, 0xfd,
+ 0xff, 0x00, 0x55, 0x01, 0x10, 0x31, 0x00, 0xfe, 0x0d, 0xff, 0x00, 0x12,
+ 0x21, 0x13, 0x21, 0x00,
+ 0xfb, 0xef, 0x0e, 0xfe, 0xcc, 0xec, 0x0f, 0x00, 0x1e, 0xf0, 0x01, 0xde,
+ 0x0d, 0x0f, 0x2f, 0x0f,
+ 0x10, 0x01, 0x23, 0x0f, 0x20, 0x00, 0xe0, 0xd0, 0x01, 0xf3, 0xf1, 0xdf,
+ 0xd0, 0xf3, 0xe0, 0x04,
+ 0x10, 0x01, 0xf0, 0x02, 0xed, 0x00, 0x10, 0x20, 0x00, 0x0e, 0xf0, 0x01,
+ 0x23, 0x0f, 0xfd, 0xf1,
+ 0xf2, 0xe0, 0x24, 0x20, 0x10, 0x34, 0x23, 0x21, 0x01, 0x23, 0x10, 0x20,
+ 0x1d, 0x30, 0x24, 0x01,
+ 0x03, 0x00, 0x0e, 0x0f, 0x0e, 0xef, 0xf1, 0x02, 0x0f, 0xda, 0xff, 0xee,
+ 0xff, 0x0e, 0x00, 0x04,
+ 0xfd, 0xda, 0xff, 0x0e, 0x22, 0x22, 0x00, 0xdd, 0x1f, 0x20, 0x12, 0x00,
+ 0xe0, 0x13, 0x14, 0x00,
+ 0x0f, 0xed, 0x04, 0x44, 0x01, 0x13, 0x11, 0xfd, 0xff, 0x02, 0x04, 0x21,
+ 0x0f, 0x00, 0x0f, 0xed,
+ 0xef, 0x0e, 0x0e, 0xf0, 0x13, 0x1e, 0x0c, 0xff, 0x2f, 0x10, 0x10, 0x00,
+ 0xe0, 0x10, 0xf0, 0xef,
+ 0x0d, 0xff, 0xf0, 0x02, 0x00, 0x00, 0x1e, 0x30, 0xff, 0xf0, 0x22, 0x22,
+ 0x10, 0x0e, 0x10, 0x22,
+ 0x22, 0xee, 0xe0, 0x03, 0x00, 0xde, 0xde, 0xed, 0xfe, 0xe0, 0xf0, 0xe1,
+ 0xf0, 0xef, 0x0e, 0x00,
+ 0x33, 0x00, 0x10, 0x00, 0xe0, 0x00, 0x32, 0x13, 0xf0, 0xe0, 0xf0, 0xe0,
+ 0xfe, 0xe0, 0xef, 0xff,
+ 0x0f, 0x01, 0x23, 0x00, 0x31, 0x00, 0x00, 0x20, 0x21, 0x01, 0x03, 0x00,
+ 0xf0, 0x0f, 0x10, 0xf0,
+ 0xfe, 0xf1, 0x01, 0x00, 0x2f, 0x0e, 0x10, 0x44, 0x11, 0x10, 0x11, 0x01,
+ 0x0e, 0xff, 0x00, 0x01,
+ 0xe3, 0x12, 0x31, 0x00, 0x00, 0x0d, 0xef, 0x01, 0x23, 0x1d, 0xfd, 0x0f,
+ 0x1f, 0x0c, 0xff, 0x03,
+ 0x26, 0x00, 0xfd, 0x0e, 0x00, 0x02, 0x42, 0x13, 0x2f, 0x0d, 0xdc, 0x00,
+ 0x2f, 0x10, 0x12, 0x02,
+ 0xfe, 0xff, 0xf0, 0x0e, 0xd0, 0xf1, 0xf2, 0x02, 0xdf, 0x00, 0x02, 0xe0,
+ 0xd0, 0x01, 0x1f, 0xef,
+ 0xe0, 0x11, 0x02, 0x00, 0xf2, 0x24, 0x10, 0xff, 0x00, 0x10, 0x12, 0x11,
+ 0x33, 0x22, 0x30, 0x22,
+ 0x00, 0x00, 0x00, 0x44, 0x22, 0x11, 0x31, 0x00, 0x00, 0x01, 0x22, 0x0f,
+ 0xcd, 0x0e, 0xfe, 0x01,
+ 0x23, 0xdc, 0xed, 0xec, 0xed, 0x0e, 0xff, 0xeb, 0xdd, 0xed, 0x00, 0x00,
+ 0xda, 0xef, 0x00, 0x21,
+ 0x0f, 0xec, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x20, 0x23, 0xf0, 0xff, 0x02,
+ 0xf2, 0xe0, 0xf0, 0x03,
+ 0x04, 0x20, 0x01, 0x24, 0x11, 0x10, 0x00, 0xcc, 0xfd, 0x00, 0x44, 0xf0,
+ 0xdc, 0xf0, 0x0f, 0xdd,
+ 0xfd, 0xf1, 0xe0, 0x00, 0x24, 0x10, 0xed, 0x0f, 0x00, 0x20, 0x10, 0xff,
+ 0xfd, 0x00, 0x02, 0x12,
+ 0x0f, 0xff, 0x0e, 0xf0, 0x00, 0xf2, 0xe0, 0x00, 0x05, 0x10, 0x00, 0xdf,
+ 0xff, 0xed, 0xef, 0x00,
+ 0x33, 0x00, 0x0e, 0x0e, 0x0f, 0x00, 0x20, 0x00, 0x22, 0xfe, 0x0f, 0x42,
+ 0x01, 0xcf, 0x0f, 0x22,
+ 0x01, 0x0f, 0xd0, 0x00, 0x10, 0x01, 0x04, 0x00, 0x0e, 0x10, 0x42, 0x12,
+ 0x12, 0x23, 0x21, 0x00,
+ 0x0d, 0xef, 0x01, 0x37, 0x11, 0x01, 0x00, 0xe0, 0xff, 0xfe, 0x00, 0x02,
+ 0x47, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x12, 0x11, 0x10, 0x0e, 0x10, 0x02, 0x34, 0x00, 0xfe,
+ 0xf0, 0xff, 0x20, 0x23,
+ 0x00, 0x03, 0x22, 0xfe, 0xd9, 0x1f, 0x10, 0xff, 0xde, 0x0f, 0x0f, 0x0f,
+ 0xee, 0x0e, 0x1d, 0x0e,
+ 0x0e, 0x12, 0x32, 0x00, 0xfe, 0xfe, 0x0f, 0x00, 0xf0, 0xff, 0x02, 0xe1,
+ 0xe0, 0xe1, 0xd0, 0xcd,
+ 0xfe, 0xe0, 0xe1, 0x03, 0x00, 0x10, 0x00, 0x12, 0x0e, 0xde, 0x21, 0x12,
+ 0x10, 0x00, 0x00, 0xef,
+ 0x00, 0x02, 0x00, 0xed, 0x10, 0x32, 0x02, 0x41, 0x44, 0x10, 0x21, 0x54,
+ 0x01, 0x00, 0x30, 0x02,
+ 0x33, 0x02, 0x01, 0x10, 0xf0, 0xdf, 0xfe, 0xe0, 0x00, 0x04, 0x0f, 0xec,
+ 0x00, 0xde, 0xe9, 0xf0,
+ 0x0f, 0x31, 0x12, 0xff, 0x0e, 0xfd, 0x00, 0x25, 0x12, 0x0d, 0x0d, 0x22,
+ 0x21, 0x12, 0x11, 0x10,
+ 0x00, 0x1f, 0x10, 0x00, 0x11, 0x15, 0x14, 0x00, 0x01, 0xdf, 0x0f, 0x11,
+ 0x02, 0xe4, 0x00, 0x20,
+ 0xfd, 0xee, 0x0f, 0x0f, 0x10, 0x32, 0x24, 0x10, 0xf0, 0x00, 0x0f, 0x01,
+ 0x00, 0xf0, 0xfe, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x2f, 0x0e, 0x0f, 0x2f, 0x40, 0x13, 0x0f, 0x20,
+ 0x00, 0x13, 0x23, 0x0f,
+ 0x0e, 0x00, 0x03, 0xdf, 0x0f, 0xe0, 0xfe, 0xee, 0xdd, 0xed, 0xf0, 0xe0,
+ 0x0f, 0x00, 0x00, 0xf0,
+ 0xe0, 0x00, 0xf3, 0x11, 0x12, 0x0e, 0xef, 0xf0, 0x00, 0xf1, 0x02, 0xee,
+ 0x0d, 0xf0, 0x01, 0x02,
+ 0x01, 0xfd, 0xee, 0xf0, 0x01, 0x32, 0x44, 0x03, 0x00, 0xef, 0x10, 0x00,
+ 0x0e, 0x10, 0x0e, 0xf1,
+ 0x00, 0xed, 0xfd, 0x00, 0x00, 0x02, 0x20, 0xee, 0xf0, 0x02, 0x32, 0x00,
+ 0x0f, 0x00, 0xe0, 0xed,
+ 0x00, 0x01, 0x10, 0xff, 0x01, 0x11, 0xfc, 0x00, 0x20, 0x03, 0xfe, 0x0e,
+ 0x20, 0x00, 0x11, 0xff,
+ 0x0b, 0x00, 0x20, 0x20, 0x0f, 0x0e, 0x10, 0x33, 0x11, 0x0f, 0x0e, 0x00,
+ 0x20, 0xf0, 0xf1, 0x00,
+ 0x0c, 0xfe, 0x12, 0x13, 0xef, 0xff, 0x12, 0x04, 0xff, 0xcd, 0x00, 0xf1,
+ 0xf5, 0x02, 0x02, 0xff,
+ 0xdd, 0x00, 0x01, 0xf0, 0xff, 0xe1, 0xf0, 0x0f, 0x0f, 0xfe, 0x00, 0x11,
+ 0x32, 0x00, 0x00, 0x1f,
+ 0x20, 0x35, 0x12, 0x11, 0x13, 0x00, 0x00, 0x0f, 0x10, 0x10, 0xe0, 0x03,
+ 0x13, 0x00, 0x0f, 0x0f,
+ 0xff, 0x0e, 0x02, 0xe3, 0xfe, 0x0d, 0xff, 0x0e, 0xfc, 0xff, 0x0e, 0xfd,
+ 0xec, 0x0e, 0xfc, 0xdd,
+ 0x0e, 0xf0, 0x12, 0x0e, 0xfc, 0xee, 0x00, 0x11, 0x00, 0x02, 0xf3, 0x00,
+ 0x1d, 0x00, 0x01, 0x03,
+ 0xf0, 0xe1, 0xe1, 0xe0, 0x00, 0x00, 0x22, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00,
+ 0x02, 0xf0, 0xff, 0x0d, 0xed, 0x0f, 0x10, 0x22, 0x12, 0x00, 0x0c, 0x0f,
+ 0x40, 0x21, 0xe0, 0x0e,
+ 0x22, 0x22, 0x00, 0xee, 0x11, 0x04, 0x00, 0xdf, 0x02, 0xe4, 0xe0, 0xee,
+ 0xff, 0x00, 0xe0, 0x00,
+ 0x21, 0xfd, 0x0c, 0x10, 0x21, 0x0f, 0x0e, 0x54, 0x25, 0x00, 0xff, 0xf0,
+ 0x00, 0x21, 0xf0, 0xe0,
+ 0x0e, 0xfe, 0x10, 0x22, 0x00, 0x0e, 0x0e, 0x0f, 0x10, 0x00, 0x00, 0x30,
+ 0x01, 0x13, 0x03, 0x12,
+ 0x00, 0xff, 0x00, 0xf0, 0xe1, 0x03, 0x00, 0x03, 0x33, 0x0f, 0x00, 0xf0,
+ 0x10, 0x12, 0x24, 0x10,
+ 0x10, 0x00, 0x23, 0x03, 0x22, 0x0e, 0xee, 0x02, 0x41, 0x00, 0x00, 0x11,
+ 0x00, 0x10, 0x35, 0x10,
+ 0x0e, 0xee, 0x12, 0x36, 0xf0, 0xe0, 0xfb, 0x0f, 0x0f, 0x00, 0xfe, 0x0e,
+ 0x1e, 0x0f, 0xfd, 0x10,
+ 0x21, 0x0e, 0xfd, 0xf0, 0x13, 0x21, 0x01, 0xce, 0x00, 0xff, 0xf0, 0xee,
+ 0x00, 0x02, 0x00, 0x03,
+ 0xdf, 0xfd, 0xe0, 0xe0, 0x00, 0xf0, 0x11, 0x26, 0x00, 0xd0, 0x00, 0x00,
+ 0xe0, 0x02, 0x1e, 0xfe,
+ 0xf0, 0x03, 0x21, 0x00, 0xfb, 0xf0, 0x10, 0x34, 0x10, 0x14, 0x43, 0x20,
+ 0x12, 0x10, 0x23, 0x01,
+ 0x02, 0x34, 0x21, 0x0d, 0xf0, 0x01, 0x01, 0xe0, 0xfe, 0xef, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x71, 0xf0, 0x78, 0xf2, 0xef, 0xef, 0x45, 0xf1, 0xff, 0xce, 0x00, 0x00,
+ 0x00, 0xdd, 0xf8, 0xff,
+ 0x30, 0x11, 0xf0, 0x10, 0x2f, 0xfc, 0xef, 0x20, 0x33, 0x00, 0xf0, 0xf0,
+ 0x01, 0x0e, 0x00, 0x00,
+ 0xf2, 0x01, 0x00, 0x00, 0x13, 0x01, 0x01, 0x03, 0x0f, 0x0d, 0x00, 0x02,
+ 0x23, 0x10, 0x00, 0x10,
+ 0x10, 0xe0, 0xfe, 0xff, 0x00, 0x1f, 0x0f, 0xf0, 0x00, 0x00, 0xee, 0xfc,
+ 0x00, 0x0e, 0x10, 0x02,
+ 0x00, 0x01, 0x00, 0x1f, 0x1d, 0x0d, 0x31, 0x24, 0x11, 0x00, 0x1d, 0x11,
+ 0x01, 0xe0, 0x1f, 0x24,
+ 0x05, 0x00, 0xfd, 0xcd, 0xf0, 0xf0, 0xf1, 0xf2, 0xff, 0xfc, 0xf0, 0x11,
+ 0x02, 0xf0, 0x00, 0xff,
+ 0xee, 0xf0, 0x10, 0x02, 0x00, 0x00, 0xe0, 0xee, 0xef, 0x00, 0x0f, 0x00,
+ 0x02, 0x01, 0xe0, 0x00,
+ 0xf1, 0xff, 0xfd, 0x00, 0x03, 0x34, 0x13, 0x11, 0x0d, 0x0f, 0x0f, 0x40,
+ 0x00, 0x11, 0x03, 0x20,
+ 0xee, 0xff, 0x00, 0xf0, 0x00, 0x23, 0x01, 0x10, 0x21, 0x10, 0x00, 0x00,
+ 0x0f, 0x02, 0x20, 0x0e,
+ 0xfe, 0x0f, 0x01, 0xf3, 0x12, 0x22, 0xff, 0xed, 0x00, 0xf1, 0x01, 0x00,
+ 0x03, 0x2f, 0xfb, 0xff,
+ 0x1f, 0x30, 0x0e, 0x12, 0x35, 0x30, 0x00, 0xfd, 0xf0, 0x21, 0x13, 0x11,
+ 0x00, 0xec, 0x0d, 0x1f,
+ 0x20, 0xee, 0xee, 0x0f, 0x02, 0x02, 0x00, 0xe0, 0xf0, 0xf0, 0xe3, 0xe0,
+ 0xf1, 0xe1, 0xe0, 0x0f,
+ 0x00, 0x02, 0xef, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x32, 0x25, 0x21, 0x0f,
+ 0x10, 0x00, 0x23, 0x23,
+ 0x34, 0x01, 0x10, 0x11, 0x12, 0x1f, 0x0e, 0x00, 0x22, 0x00, 0x20, 0x23,
+ 0x01, 0x01, 0x20, 0xfc,
+ 0xef, 0x13, 0x01, 0xfd, 0xed, 0xfe, 0xed, 0x10, 0x0e, 0xda, 0xed, 0x0f,
+ 0x0f, 0xfd, 0xff, 0xf0,
+ 0x00, 0x0e, 0x0d, 0xff, 0xef, 0x00, 0x00, 0xf1, 0x04, 0x21, 0x0e, 0x0f,
+ 0x11, 0xf2, 0xf0, 0xe0,
+ 0x02, 0x0f, 0xde, 0xff, 0xe0, 0x13, 0x02, 0x02, 0x12, 0x00, 0x00, 0x00,
+ 0x0e, 0x01, 0xf0, 0xec,
+ 0x0f, 0x11, 0x00, 0xfe, 0xeb, 0x0f, 0x11, 0x01, 0xff, 0x00, 0x20, 0x0e,
+ 0x10, 0x00, 0x14, 0xee,
+ 0x0e, 0xf0, 0x02, 0xe1, 0x00, 0xe1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xed,
+ 0x01, 0x35, 0x1f, 0xfc,
+ 0x00, 0x10, 0x31, 0x00, 0x00, 0x00, 0x0f, 0x23, 0x25, 0xff, 0xcf, 0x0e,
+ 0x02, 0x01, 0x0d, 0x0d,
+ 0x1f, 0x00, 0x01, 0x22, 0x2f, 0x0f, 0x30, 0x00, 0xf1, 0x06, 0x21, 0x12,
+ 0x00, 0xef, 0xff, 0x02,
+ 0x15, 0x21, 0x00, 0xdc, 0xe0, 0x01, 0x43, 0x02, 0x00, 0x20, 0x12, 0x0f,
+ 0x10, 0x11, 0x0f, 0xf0,
+ 0x02, 0x25, 0x00, 0x0f, 0x00, 0x01, 0xf1, 0x0f, 0x11, 0x12, 0x0e, 0x00,
+ 0x13, 0x25, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0xfd, 0xfe, 0x00, 0x31, 0x00, 0x0e, 0x0b, 0x0e,
+ 0x0f, 0x00, 0x1e, 0x00,
+ 0x22, 0x0d, 0xdb, 0x20, 0x13, 0xff, 0xdc, 0xfd, 0xe0, 0x0f, 0x0f, 0x20,
+ 0xf0, 0xd1, 0xf0, 0xf1,
+ 0xf0, 0xee, 0xdd, 0xe0, 0x01, 0xc0, 0x02, 0x02, 0xf0, 0xed, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x10, 0x10, 0x00, 0x11, 0x33, 0x03, 0x10, 0x11, 0x12, 0x22, 0x42,
+ 0x10, 0x22, 0x35, 0x30,
+ 0x00, 0x00, 0x32, 0xf0, 0xf1, 0x02, 0xef, 0xed, 0x02, 0xf3, 0xce, 0xeb,
+ 0xf1, 0x01, 0x10, 0xd9,
+ 0xff, 0x10, 0x3f, 0x0f, 0x21, 0x12, 0x0e, 0x0e, 0x11, 0x23, 0x01, 0x10,
+ 0x10, 0x01, 0x11, 0x00,
+ 0x1e, 0x0f, 0x12, 0x02, 0x1e, 0x0f, 0x1f, 0x0f, 0x01, 0x03, 0x06, 0x11,
+ 0x10, 0x00, 0x02, 0xf0,
+ 0xf0, 0x03, 0x11, 0x00, 0xfe, 0x0e, 0x01, 0x20, 0xff, 0xff, 0x00, 0x11,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x04, 0x11, 0x12, 0x00, 0x31, 0x0e, 0x0c, 0x00, 0x20, 0x22, 0x32, 0x0e,
+ 0x2f, 0x0f, 0x00, 0xfe,
+ 0x11, 0x22, 0x01, 0x00, 0xe0, 0xe0, 0x01, 0x01, 0xff, 0xce, 0x0f, 0xf0,
+ 0x0f, 0xef, 0x10, 0x00,
+ 0xfe, 0x02, 0x10, 0xdc, 0xe0, 0xe0, 0xf0, 0x01, 0xf2, 0xee, 0x0e, 0x02,
+ 0x03, 0x02, 0x10, 0xe0,
+ 0xff, 0x01, 0x10, 0xe0, 0xec, 0xef, 0xff, 0x00, 0x12, 0x31, 0x01, 0x01,
+ 0x30, 0x0f, 0xfd, 0x10,
+ 0x40, 0x00, 0x02, 0x11, 0xdc, 0xfe, 0xf1, 0x01, 0x0e, 0xdc, 0x02, 0x02,
+ 0x20, 0xfe, 0xf0, 0x04,
+ 0x10, 0x0d, 0xf0, 0xff, 0xde, 0x12, 0x34, 0xfd, 0xde, 0x01, 0x00, 0xf0,
+ 0x01, 0x33, 0x11, 0x00,
+ 0x0d, 0x0f, 0x1e, 0x10, 0x20, 0x10, 0x20, 0x20, 0x21, 0x22, 0xef, 0x0e,
+ 0x30, 0x0f, 0x01, 0x10,
+ 0xfe, 0x0f, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xef, 0xf1, 0x05, 0x11, 0xd0,
+ 0xde, 0xef, 0xf2, 0xf2,
+ 0xef, 0xce, 0xf0, 0x00, 0x00, 0x0d, 0xee, 0x00, 0x00, 0x10, 0x23, 0x10,
+ 0x11, 0x21, 0x10, 0x00,
+ 0xcd, 0x0f, 0xf2, 0x26, 0x41, 0x00, 0xf1, 0xf0, 0x00, 0x22, 0x13, 0x0e,
+ 0x1e, 0x32, 0x16, 0x11,
+ 0x01, 0x11, 0x0e, 0xec, 0x01, 0x02, 0xfe, 0xee, 0x0f, 0xee, 0x0e, 0xfd,
+ 0xda, 0xf0, 0x10, 0x30,
+ 0xdd, 0xfe, 0xfd, 0xfe, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x2f, 0x0f, 0x0f,
+ 0xdd, 0x00, 0x12, 0x00,
+ 0xf1, 0x00, 0x00, 0xd1, 0xc0, 0xfe, 0xc0, 0x01, 0xd0, 0x00, 0xf0, 0x07,
+ 0x31, 0x00, 0x0e, 0xff,
+ 0xfe, 0x0e, 0x40, 0x03, 0x0f, 0x1e, 0x21, 0x21, 0x0f, 0xec, 0x00, 0x12,
+ 0x00, 0x02, 0x23, 0x20,
+ 0x0f, 0xef, 0x10, 0x00, 0x01, 0x03, 0x00, 0xfa, 0x00, 0x01, 0x00, 0xe0,
+ 0x0f, 0xf0, 0x0f, 0x00,
+ 0x02, 0xe0, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x13, 0x04, 0x12,
+ 0x00, 0x1c, 0xf0, 0x0f,
+ 0x1f, 0x20, 0x10, 0x0f, 0x0f, 0x1f, 0x10, 0x0d, 0x1f, 0x10, 0x24, 0x01,
+ 0xf2, 0x03, 0x01, 0xfe,
+ 0xde, 0xf3, 0x15, 0x00, 0x0f, 0xf0, 0x02, 0x10, 0x10, 0x10, 0x13, 0x11,
+ 0x20, 0x20, 0x00, 0x02,
+ 0x23, 0xe0, 0xfe, 0x02, 0x02, 0x11, 0x14, 0x13, 0x01, 0x00, 0x01, 0xff,
+ 0x0c, 0x0e, 0x0f, 0x55,
+ 0x13, 0x10, 0x0d, 0x0e, 0x10, 0x10, 0x01, 0x00, 0x0d, 0x00, 0x33, 0x11,
+ 0x0e, 0xdb, 0x0f, 0xfe,
+ 0x0f, 0x41, 0x01, 0x0c, 0xfe, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xee,
+ 0xf0, 0x00, 0x02, 0x13,
+ 0xf0, 0xcf, 0x00, 0x0e, 0xe0, 0xd0, 0xdf, 0xf0, 0x0f, 0xfe, 0xee, 0xf0,
+ 0x03, 0x12, 0x12, 0x21,
+ 0x01, 0x0f, 0x00, 0x21, 0xf0, 0x00, 0x11, 0x32, 0x10, 0x10, 0x00, 0x24,
+ 0x12, 0x00, 0x13, 0x42,
+ 0x01, 0x01, 0x15, 0x11, 0xe0, 0x01, 0x01, 0xee, 0xdd, 0xf0, 0x0f, 0xe0,
+ 0x01, 0xfd, 0xdc, 0x0f,
+ 0x10, 0x23, 0x10, 0x10, 0x0e, 0xca, 0x0f, 0x00, 0x11, 0x20, 0xef, 0xfe,
+ 0x00, 0x12, 0x1f, 0x0e,
+ 0x0f, 0xfe, 0x0f, 0x20, 0x22, 0x00, 0x1f, 0x00, 0x20, 0x02, 0x00, 0x02,
+ 0x01, 0x02, 0xf2, 0x01,
+ 0x00, 0xf0, 0xe0, 0xed, 0xf0, 0x20, 0x01, 0x0e, 0xff, 0x01, 0x00, 0x11,
+ 0x1f, 0x00, 0x10, 0x00,
+ 0xfe, 0xef, 0x10, 0x11, 0x1f, 0x00, 0x20, 0x02, 0x1e, 0x0f, 0x10, 0x0d,
+ 0xff, 0x00, 0x20, 0x01,
+ 0x12, 0x11, 0x02, 0x00, 0x0f, 0x12, 0x00, 0xe1, 0x00, 0xee, 0x00, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00,
+ 0xff, 0xed, 0xf0, 0x20, 0x10, 0xd0, 0xee, 0xf0, 0xe1, 0x02, 0x00, 0x0f,
+ 0xef, 0xff, 0x00, 0x03,
+ 0x11, 0x0e, 0x0f, 0x00, 0x00, 0x01, 0xb0, 0x00, 0xee, 0xfe, 0xff, 0x01,
+ 0x33, 0x00, 0x00, 0x34,
+ 0x43, 0x0f, 0x1c, 0x22, 0x12, 0x11, 0x12, 0x0f, 0xfd, 0xff, 0x1e, 0x01,
+ 0x02, 0x02, 0xf0, 0x0e,
+ 0x1e, 0x00, 0x13, 0x12, 0x00, 0x10, 0x23, 0xfe, 0xdc, 0x0f, 0x00, 0x03,
+ 0x12, 0x02, 0xee, 0xed,
+ 0xe0, 0x22, 0x24, 0x00, 0xff, 0x0d, 0x1e, 0x10, 0x10, 0x1f, 0x20, 0x24,
+ 0x22, 0x0e, 0x0d, 0x00,
+ 0x53, 0x02, 0x10, 0x0c, 0xf0, 0x00, 0xfb, 0xef, 0x10, 0x00, 0xf1, 0x01,
+ 0x01, 0xe0, 0xde, 0xef,
+ 0xef, 0xd1, 0x02, 0xe0, 0xf2, 0x00, 0xf0, 0xfe, 0xff, 0x00, 0x02, 0x10,
+ 0x1f, 0x10, 0x11, 0x00,
+ 0x10, 0x01, 0x01, 0xf0, 0x00, 0x01, 0x32, 0x02, 0x13, 0x10, 0x14, 0x43,
+ 0x02, 0x1e, 0xfd, 0x11,
+ 0x33, 0x10, 0x00, 0x00, 0x0e, 0x1c, 0x13, 0x32, 0xf0, 0xfd, 0xf0, 0xfd,
+ 0xfd, 0xef, 0xff, 0xfe,
+ 0xfe, 0x00, 0x11, 0x0d, 0xf9, 0xe0, 0x0e, 0x00, 0xee, 0x00, 0x21, 0x21,
+ 0x1f, 0x00, 0xf2, 0x00,
+ 0x02, 0x0f, 0xff, 0xd0, 0x04, 0x02, 0xd0, 0xef, 0xd0, 0xde, 0xfd, 0xed,
+ 0xf0, 0xf2, 0x11, 0x43,
+ 0x13, 0x0f, 0x09, 0xf0, 0x11, 0x00, 0x00, 0x10, 0x11, 0xfc, 0x0e, 0xfe,
+ 0xef, 0x01, 0x13, 0x00,
+ 0x0e, 0xe0, 0xf0, 0x10, 0x00, 0xe0, 0x1f, 0x12, 0x01, 0xdd, 0xef, 0xff,
+ 0x00, 0x00, 0xe0, 0xec,
+ 0x00, 0x00, 0x15, 0x21, 0xe0, 0x0f, 0x00, 0x01, 0x0f, 0xee, 0x0d, 0xf0,
+ 0x24, 0x33, 0x01, 0x0c,
+ 0xdd, 0x00, 0x10, 0x42, 0x11, 0x0d, 0x0c, 0x10, 0x02, 0x22, 0x23, 0x00,
+ 0xf0, 0x00, 0x15, 0x01,
+ 0xf0, 0xd1, 0xf0, 0xee, 0x00, 0x11, 0x11, 0x00, 0x44, 0x12, 0xfd, 0xfe,
+ 0x20, 0x20, 0x35, 0xf0,
+ 0x00, 0x01, 0x01, 0xf1, 0xff, 0xff, 0xf0, 0x01, 0x23, 0xf2, 0x01, 0x12,
+ 0x01, 0x22, 0x00, 0xda,
+ 0x00, 0x00, 0x13, 0x33, 0x1f, 0xfe, 0x02, 0x21, 0x00, 0x10, 0x00, 0x10,
+ 0x0f, 0x2f, 0x00, 0x0f,
+ 0x0c, 0x00, 0x0d, 0x1e, 0x30, 0x10, 0x00, 0xfc, 0xde, 0x1f, 0x20, 0x10,
+ 0x0f, 0xee, 0xf1, 0x02,
+ 0x01, 0x0e, 0xec, 0xde, 0xef, 0x02, 0x02, 0xde, 0xed, 0xbe, 0xfd, 0xdf,
+ 0xdf, 0xf0, 0xf0, 0x01,
+ 0x15, 0x10, 0xfd, 0x0f, 0x02, 0x22, 0x30, 0x23, 0x20, 0x10, 0x20, 0x44,
+ 0x0f, 0xe0, 0x03, 0x34,
+ 0x42, 0x01, 0x02, 0x35, 0x11, 0x01, 0x01, 0x0f, 0xdd, 0x00, 0x10, 0x21,
+ 0x01, 0xdf, 0xf0, 0xff,
+ 0x0f, 0xfe, 0xf0, 0xf0, 0x04, 0x00, 0x10, 0x0d, 0xcd, 0x0d, 0x00, 0x31,
+ 0x00, 0x0d, 0x01, 0x20,
+ 0x10, 0x20, 0x12, 0x21, 0x10, 0x0e, 0x0f, 0x10, 0x32, 0x13, 0x01, 0x31,
+ 0x00, 0x0e, 0x01, 0x02,
+ 0xf0, 0xf0, 0x01, 0xf1, 0xef, 0x00, 0xe0, 0x00, 0x12, 0x25, 0xf0, 0x02,
+ 0x00, 0x0f, 0x0e, 0xfe,
+ 0xff, 0x01, 0x43, 0x01, 0x00, 0xfd, 0x0d, 0x10, 0x44, 0x24, 0x00, 0xfd,
+ 0x20, 0x32, 0x01, 0x00,
+ 0x00, 0xfd, 0x0f, 0x00, 0x21, 0x10, 0x0e, 0x00, 0x32, 0x12, 0x01, 0xef,
+ 0xfd, 0x00, 0x00, 0xf3,
+ 0xf0, 0x0e, 0xf0, 0xfe, 0xef, 0xdf, 0x10, 0x21, 0x01, 0xdf, 0xee, 0xef,
+ 0x00, 0xe0, 0xf2, 0xe0,
+ 0x13, 0x13, 0x00, 0xdd, 0xef, 0xf0, 0xfe, 0x00, 0x00, 0xf0, 0x0f, 0x0e,
+ 0xee, 0x0f, 0x0f, 0x0f,
+ 0x32, 0x10, 0x01, 0x22, 0x00, 0x0d, 0x02, 0x65, 0x00, 0xea, 0x00, 0x00,
+ 0xff, 0xdf, 0x10, 0x23,
+ 0x00, 0xca, 0x00, 0x22, 0xf0, 0xe0, 0x02, 0x31, 0xff, 0xee, 0xf0, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0xee, 0x11, 0x24, 0x00, 0x00, 0x0f, 0x42, 0x13, 0x2f, 0xfe,
+ 0x0f, 0x40, 0x0f, 0x20,
+ 0x00, 0x30, 0x10, 0x10, 0x12, 0x00, 0x0c, 0xf0, 0x00, 0xff, 0xf0, 0x00,
+ 0x00, 0xf0, 0xe0, 0x02,
+ 0xe0, 0xd0, 0x0f, 0xe0, 0xef, 0x0f, 0xf0, 0xff, 0xee, 0xfe, 0x01, 0x25,
+ 0x1f, 0xfe, 0xf0, 0x00,
+ 0xef, 0xec, 0x00, 0x02, 0x33, 0x10, 0x00, 0x00, 0x02, 0x04, 0x32, 0xf0,
+ 0x0f, 0x01, 0x35, 0x13,
+ 0x00, 0xfd, 0xfe, 0x12, 0x33, 0x00, 0x0e, 0xf0, 0x12, 0x11, 0x14, 0x00,
+ 0xfe, 0xed, 0xfe, 0x00,
+ 0xf1, 0xee, 0xfb, 0x0f, 0x10, 0x20, 0x0c, 0xfe, 0x0f, 0x1d, 0x0e, 0x0d,
+ 0x0f, 0x22, 0x01, 0x00,
+ 0xd0, 0x01, 0x01, 0xe0, 0xef, 0xf1, 0xc0, 0xec, 0xef, 0xf0, 0xf0, 0xee,
+ 0xf0, 0xff, 0xde, 0xdf,
+ 0x11, 0x44, 0x01, 0xf0, 0xff, 0x00, 0x23, 0x10, 0x0f, 0x0e, 0x11, 0x01,
+ 0x00, 0xfc, 0x0f, 0x30,
+ 0x13, 0x10, 0x0f, 0x34, 0x02, 0x0f, 0x00, 0x20, 0x0e, 0x0e, 0x31, 0x01,
+ 0xde, 0xfe, 0x0f, 0xfd,
+ 0xe0, 0x0f, 0xef, 0x01, 0x04, 0x01, 0xd0, 0xfe, 0xf0, 0xf1, 0x00, 0x03,
+ 0x33, 0x0e, 0xca, 0x00,
+ 0x40, 0x30, 0x10, 0x00, 0x31, 0x10, 0x02, 0x30, 0x1f, 0xff, 0xdf, 0x00,
+ 0x22, 0x01, 0x00, 0xef,
+ 0x01, 0x04, 0x01, 0x10, 0x0e, 0xef, 0x0f, 0x10, 0x11, 0x12, 0x24, 0x12,
+ 0x01, 0x10, 0x00, 0x00,
+ 0xf1, 0x02, 0xf0, 0x00, 0x11, 0x02, 0x0f, 0xff, 0xf0, 0x13, 0x02, 0x10,
+ 0x14, 0x10, 0x10, 0x14,
+ 0xf1, 0x0e, 0xff, 0x0f, 0x30, 0x01, 0x00, 0x00, 0x10, 0x0e, 0x21, 0x33,
+ 0x20, 0x0e, 0x0f, 0x00,
+ 0x00, 0x03, 0x0f, 0x3e, 0x0c, 0xee, 0x0f, 0x43, 0x01, 0x0c, 0x0f, 0x0d,
+ 0x00, 0x10, 0x21, 0x01,
+ 0xf1, 0x02, 0x00, 0xef, 0xed, 0xf2, 0xf2, 0xee, 0xf0, 0x01, 0xf0, 0xbb,
+ 0xff, 0xee, 0xef, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x10, 0x22, 0x12, 0x00, 0x33, 0x00, 0x10, 0x10, 0x11,
+ 0x13, 0x24, 0x00, 0x20,
+ 0x11, 0xef, 0xee, 0x03, 0x35, 0x11, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x01,
+ 0xf1, 0xf1, 0x00, 0x0f,
+ 0x01, 0x00, 0xf0, 0xee, 0xfe, 0x01, 0xf0, 0xff, 0xee, 0x00, 0x00, 0xdb,
+ 0x00, 0x01, 0x1f, 0x0c,
+ 0x10, 0x0f, 0x20, 0x32, 0x10, 0x1d, 0x00, 0x2f, 0x1f, 0x00, 0x0e, 0x01,
+ 0x01, 0x21, 0x00, 0x0e,
+ 0x0f, 0xf0, 0xf0, 0x04, 0x01, 0x01, 0x0e, 0xdd, 0xf2, 0x01, 0xf1, 0x12,
+ 0x32, 0xff, 0x0f, 0x01,
+ 0x00, 0xef, 0xfd, 0x0d, 0xf0, 0x10, 0x41, 0x00, 0xee, 0x00, 0x00, 0x00,
+ 0x12, 0x21, 0x20, 0x02,
+ 0x01, 0x0f, 0x00, 0x0e, 0xfe, 0x00, 0x11, 0x22, 0x00, 0xfd, 0x00, 0x22,
+ 0x11, 0x00, 0x00, 0xef,
+ 0x02, 0xf1, 0xf1, 0x00, 0x0f, 0x00, 0x0e, 0xce, 0xf0, 0x11, 0x44, 0x10,
+ 0xff, 0xac, 0x00, 0x00,
+ 0xf0, 0x00, 0xe2, 0x10, 0x00, 0xff, 0xd0, 0xf0, 0xfe, 0x00, 0x01, 0xfd,
+ 0xdf, 0x12, 0x00, 0x01,
+ 0x00, 0x0f, 0x0f, 0x0f, 0x11, 0x37, 0x20, 0x01, 0x10, 0x1f, 0x0e, 0x0f,
+ 0x02, 0x33, 0x12, 0x0d,
+ 0x0d, 0x00, 0x00, 0x00, 0x01, 0x24, 0x12, 0x00, 0xfe, 0x01, 0x23, 0x00,
+ 0xfd, 0xe0, 0xef, 0xfd,
+ 0x0e, 0x02, 0x01, 0x01, 0xfe, 0xd0, 0xf1, 0x12, 0x10, 0x00, 0x01, 0x25,
+ 0x31, 0x00, 0xfc, 0xfd,
+ 0x30, 0x51, 0x01, 0x11, 0x30, 0x10, 0x0c, 0x01, 0x00, 0x10, 0x10, 0x02,
+ 0xd0, 0x00, 0x01, 0xe0,
+ 0xed, 0xff, 0xe0, 0x02, 0xee, 0xfe, 0xf0, 0x10, 0x00, 0xdf, 0xfc, 0x00,
+ 0x01, 0x01, 0x0f, 0xf0,
+ 0xf0, 0x03, 0x11, 0xde, 0xec, 0xf0, 0x00, 0x45, 0x01, 0x21, 0x0f, 0x00,
+ 0x13, 0x31, 0x0e, 0x0f,
+ 0x24, 0x33, 0x03, 0x00, 0x01, 0x0f, 0x2f, 0x11, 0x03, 0x01, 0x00, 0x00,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0x0c, 0xdf, 0x10, 0x20, 0x0b, 0x0f, 0x10, 0x0f, 0x2f, 0xfd, 0x00, 0x2f,
+ 0x0d, 0x00, 0x02, 0xf1,
+ 0xdd, 0x01, 0x12, 0x00, 0xff, 0xf0, 0x02, 0xf1, 0xd0, 0x10, 0x0e, 0xbd,
+ 0xed, 0xf0, 0x02, 0x01,
+ 0x00, 0x20, 0xcb, 0xff, 0xf0, 0xf1, 0x02, 0x11, 0x23, 0x00, 0x0b, 0xef,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0d, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x23, 0x0f, 0xdd, 0x00, 0x2f, 0x00,
+ 0x0f, 0x03, 0x02, 0xfd,
+ 0xfc, 0xee, 0xdf, 0x01, 0x02, 0x05, 0x00, 0xdf, 0xdf, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x8c, 0x11, 0x68, 0x09, 0xce, 0x12, 0x6f, 0x0a, 0x00, 0xf1, 0x00, 0x00,
+ 0x0e, 0x0e, 0x10, 0x32,
+ 0x22, 0x2f, 0x1f, 0x10, 0x00, 0x02, 0x12, 0x10, 0xfd, 0xe0, 0x00, 0x10,
+ 0x03, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0x01, 0xf0, 0x00, 0x11, 0x01, 0x20,
+ 0x21, 0x00, 0x01, 0x13,
+ 0xfe, 0xfd, 0x01, 0x22, 0xe0, 0xf1, 0x00, 0x00, 0x03, 0x02, 0x00, 0xe0,
+ 0xe1, 0x13, 0x23, 0x13,
+ 0x10, 0x0d, 0xed, 0x00, 0x00, 0x12, 0x01, 0x1f, 0x31, 0x23, 0x01, 0x0f,
+ 0xff, 0x1e, 0x10, 0x00,
+ 0x00, 0x20, 0x30, 0x00, 0x0a, 0x20, 0x1f, 0x10, 0x1e, 0x2e, 0x00, 0x10,
+ 0x01, 0x01, 0x02, 0x00,
+ 0xf0, 0xed, 0xe0, 0xdf, 0xdd, 0xdd, 0xee, 0xff, 0xff, 0xed, 0xcd, 0xf0,
+ 0xef, 0x0f, 0xec, 0xef,
+ 0xdf, 0x02, 0x26, 0x00, 0x00, 0x11, 0x30, 0x22, 0x12, 0x00, 0xf0, 0x00,
+ 0x31, 0x32, 0x11, 0x10,
+ 0x0f, 0x00, 0x05, 0x32, 0x12, 0x22, 0x01, 0xf0, 0x02, 0x22, 0x03, 0x31,
+ 0xfd, 0xdc, 0x00, 0x00,
+ 0x00, 0x0f, 0xff, 0xed, 0xf0, 0xe0, 0xe1, 0xf1, 0xf2, 0x00, 0xde, 0xfe,
+ 0x00, 0x30, 0x20, 0x31,
+ 0x00, 0x0f, 0x5f, 0x20, 0x2f, 0x00, 0x21, 0x31, 0x00, 0xff, 0xf0, 0x00,
+ 0xf0, 0x01, 0x03, 0x01,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0xf0, 0xf1, 0x01, 0x02,
+ 0x00, 0x0f, 0x23, 0x00,
+ 0xbe, 0x0f, 0x0e, 0x22, 0x34, 0x02, 0x0e, 0xfd, 0x00, 0x32, 0x23, 0x22,
+ 0x00, 0xf0, 0x0f, 0x33,
+ 0x11, 0x0f, 0xfc, 0xff, 0x0f, 0x23, 0x00, 0x0c, 0x20, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x21,
+ 0x00, 0x00, 0xee, 0xf0, 0x02, 0xee, 0xf0, 0xf0, 0xf0, 0xfe, 0xf0, 0x03,
+ 0xed, 0xdf, 0x00, 0xf0,
+ 0xf1, 0x01, 0xe0, 0x0e, 0xe1, 0x03, 0x0f, 0xfd, 0xef, 0x0f, 0x00, 0x02,
+ 0xf0, 0x00, 0xfd, 0xdc,
+ 0x0f, 0x0f, 0x0f, 0x1f, 0x34, 0x12, 0x00, 0x0c, 0xf0, 0x20, 0x31, 0x11,
+ 0x00, 0xfc, 0x00, 0x20,
+ 0xf0, 0xff, 0xf0, 0x10, 0x12, 0xff, 0xdf, 0xf0, 0x00, 0xe0, 0x00, 0x02,
+ 0xff, 0x0d, 0x00, 0x02,
+ 0xf2, 0xf0, 0x23, 0x10, 0xec, 0x01, 0x01, 0x02, 0x14, 0x01, 0x20, 0x00,
+ 0x1f, 0x0d, 0x0e, 0x20,
+ 0x2f, 0x21, 0x53, 0x11, 0x0f, 0x0e, 0x00, 0x13, 0x02, 0xf0, 0x0f, 0xde,
+ 0xff, 0xf0, 0xe0, 0x0f,
+ 0x00, 0x20, 0xff, 0xed, 0xed, 0x00, 0x01, 0x10, 0x0f, 0xde, 0xf0, 0xef,
+ 0xf0, 0xf1, 0x01, 0x00,
+ 0x01, 0xf0, 0xff, 0xda, 0x00, 0x10, 0x23, 0x21, 0x0e, 0x0f, 0x21, 0x12,
+ 0x00, 0xe1, 0x12, 0x24,
+ 0x03, 0x24, 0xe0, 0xff, 0xf0, 0xf0, 0x00, 0x03, 0x30, 0x0d, 0x00, 0x02,
+ 0x02, 0x00, 0x0e, 0xfd,
+ 0x00, 0x40, 0x01, 0x1f, 0xfe, 0xee, 0x0f, 0x20, 0x2f, 0x0c, 0x00, 0x0f,
+ 0xe0, 0x00, 0x10, 0x0e,
+ 0xe0, 0xf0, 0x0f, 0xf0, 0xe0, 0x01, 0xf1, 0xfe, 0xeb, 0xcf, 0xde, 0xff,
+ 0x01, 0x04, 0x10, 0xff,
+ 0xdd, 0xe0, 0xee, 0xe0, 0x00, 0x01, 0x02, 0x03, 0x01, 0x00, 0x0d, 0x00,
+ 0x0f, 0x1e, 0x2f, 0x30,
+ 0x10, 0x23, 0x12, 0x20, 0x30, 0x0f, 0xef, 0x00, 0x32, 0x01, 0x10, 0x0f,
+ 0xdd, 0x00, 0x0d, 0xef,
+ 0xff, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0xce, 0x01, 0xf3, 0xf0, 0x01, 0x00,
+ 0xf0, 0x02, 0x30, 0xff,
+ 0xed, 0x10, 0x41, 0x33, 0x30, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xfd,
+ 0x0f, 0x01, 0xf4, 0x01,
+ 0x02, 0x20, 0x0f, 0xff, 0x20, 0x12, 0x21, 0x00, 0x0f, 0x00, 0xf2, 0x00,
+ 0x0e, 0x01, 0x45, 0x00,
+ 0xf0, 0xf0, 0x01, 0xf0, 0xf1, 0x02, 0x02, 0xf0, 0x10, 0x03, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x34, 0x01, 0x00, 0xf0, 0x02, 0x00, 0xf0, 0xff, 0xfd, 0x0e, 0x12,
+ 0x56, 0x10, 0x0f, 0xee,
+ 0x00, 0x3d, 0x10, 0x20, 0x53, 0x10, 0x0d, 0x00, 0x12, 0x30, 0x30, 0x02,
+ 0x00, 0x00, 0xfe, 0x00,
+ 0x00, 0x10, 0x00, 0xd2, 0x00, 0xec, 0x0f, 0xff, 0xdc, 0xdf, 0x01, 0xf1,
+ 0xe0, 0xf0, 0xfe, 0xff,
+ 0x00, 0x00, 0xe0, 0xfe, 0xee, 0xf0, 0x0e, 0x00, 0x33, 0x00, 0x32, 0x33,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x11, 0x13, 0x14, 0x00, 0x00, 0xf1, 0x04, 0xf0, 0xe0, 0x00, 0x33,
+ 0x11, 0x11, 0xf0, 0xee,
+ 0xf0, 0x12, 0x01, 0xf0, 0xed, 0xee, 0xe0, 0x03, 0xc0, 0xe0, 0x0f, 0xfe,
+ 0x0f, 0xdf, 0x00, 0x10,
+ 0x40, 0x00, 0x2d, 0x2f, 0x1b, 0x30, 0x20, 0x00, 0x23, 0x10, 0x1e, 0xfd,
+ 0xed, 0x00, 0x02, 0x00,
+ 0x01, 0x31, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0xde, 0x00,
+ 0x00, 0x02, 0xf0, 0xed,
+ 0x00, 0xf0, 0x11, 0x10, 0xed, 0xee, 0x11, 0x45, 0x01, 0xf0, 0x0d, 0x10,
+ 0x24, 0x21, 0xf0, 0xef,
+ 0x0e, 0x20, 0x01, 0x01, 0xf0, 0x0e, 0x0f, 0x00, 0x40, 0xf0, 0xeb, 0x00,
+ 0x22, 0x21, 0x01, 0x01,
+ 0x33, 0x00, 0xef, 0xf1, 0xf0, 0xff, 0x01, 0x31, 0xe0, 0xdd, 0x00, 0xff,
+ 0xf0, 0x02, 0x01, 0x00,
+ 0x0c, 0xe0, 0x00, 0x01, 0xf2, 0xef, 0x00, 0x01, 0xff, 0xde, 0x01, 0x03,
+ 0x0f, 0xed, 0x00, 0x00,
+ 0xfe, 0x00, 0x15, 0x10, 0xee, 0xee, 0x0f, 0x42, 0x13, 0xff, 0xf0, 0x10,
+ 0x22, 0x42, 0x00, 0x10,
+ 0x2f, 0x0f, 0x00, 0x11, 0x1f, 0x2f, 0x00, 0x11, 0x03, 0xe0, 0x02, 0xff,
+ 0x0d, 0xf0, 0x00, 0x11,
+ 0xd0, 0xf0, 0xf0, 0xf1, 0x10, 0x00, 0x0d, 0xe0, 0xf0, 0xef, 0x00, 0x01,
+ 0x30, 0x10, 0x03, 0x41,
+ 0x00, 0x1d, 0x11, 0x42, 0x23, 0x01, 0x00, 0xee, 0x00, 0x43, 0xf0, 0xee,
+ 0x10, 0x0f, 0xde, 0x00,
+ 0x10, 0xff, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xf1, 0xee, 0xed, 0xfe, 0xdd,
+ 0xfd, 0x02, 0x15, 0x0f,
+ 0x0d, 0xef, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x10, 0x23, 0x00, 0x21, 0x11,
+ 0x12, 0xf0, 0xe1, 0x02,
+ 0x00, 0x00, 0x20, 0x14, 0x03, 0x00, 0xf0, 0x00, 0x10, 0x14, 0x1f, 0x10,
+ 0x00, 0x0e, 0xed, 0x13,
+ 0x43, 0x1e, 0x0c, 0x00, 0x00, 0x20, 0x10, 0x10, 0x0d, 0x00, 0x0e, 0x00,
+ 0x02, 0x45, 0xf0, 0x00,
+ 0x00, 0x0e, 0xfe, 0xe0, 0xee, 0x00, 0x23, 0x00, 0xfd, 0xf0, 0x00, 0xf0,
+ 0xdd, 0x00, 0xf0, 0xf0,
+ 0xf0, 0x03, 0x01, 0xce, 0xdc, 0xdc, 0xdf, 0xef, 0xfe, 0xf0, 0x02, 0x12,
+ 0x2e, 0x0d, 0x0d, 0x1f,
+ 0x31, 0x22, 0x01, 0x0f, 0xf0, 0x0f, 0x2f, 0xff, 0x00, 0x03, 0x02, 0x00,
+ 0xfd, 0xed, 0xfe, 0x00,
+ 0x10, 0x00, 0x01, 0xf1, 0x00, 0xef, 0xff, 0xf0, 0xe1, 0xd0, 0xd0, 0x01,
+ 0x20, 0xe0, 0xff, 0x00,
+ 0x00, 0x00, 0x31, 0x20, 0x00, 0x20, 0x32, 0x00, 0x2f, 0x00, 0xef, 0x00,
+ 0x10, 0xf0, 0xd0, 0x00,
+ 0x02, 0x00, 0x01, 0x10, 0x02, 0x10, 0x01, 0x20, 0x32, 0x21, 0x0f, 0xff,
+ 0x10, 0x00, 0xe0, 0x00,
+ 0x01, 0x11, 0x00, 0xf0, 0x03, 0xf0, 0xf0, 0x0f, 0x00, 0x11, 0x01, 0x00,
+ 0x00, 0x04, 0x32, 0x13,
+ 0x00, 0xdb, 0xf0, 0x00, 0xf2, 0x04, 0x21, 0xff, 0xef, 0x01, 0x01, 0x00,
+ 0xdc, 0x00, 0x30, 0x00,
+ 0x10, 0x20, 0x2d, 0x30, 0x01, 0x00, 0x32, 0x32, 0x20, 0x30, 0x1f, 0x00,
+ 0x0e, 0x10, 0x21, 0x10,
+ 0x10, 0xfe, 0xfd, 0x01, 0x00, 0xee, 0xfe, 0xfd, 0xff, 0xf0, 0x01, 0xbe,
+ 0xfe, 0xef, 0x0e, 0xdc,
+ 0xef, 0x0f, 0x00, 0xdf, 0xf0, 0x0f, 0xdd, 0xff, 0xef, 0x00, 0xf0, 0x02,
+ 0x14, 0x53, 0x01, 0x0d,
+ 0xf0, 0xf0, 0x25, 0x42, 0x34, 0x10, 0x00, 0xfe, 0x11, 0x35, 0x01, 0x21,
+ 0x01, 0x0f, 0x10, 0x12,
+ 0x02, 0x00, 0xfd, 0x01, 0x00, 0xe0, 0xfe, 0xf1, 0xe3, 0xf1, 0xde, 0xed,
+ 0x0f, 0xff, 0xde, 0x00,
+ 0x33, 0x13, 0x33, 0x3f, 0x0c, 0x10, 0x20, 0x1f, 0x20, 0x00, 0x2e, 0x10,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x01, 0x01, 0x22, 0x31, 0x13, 0x01, 0x00, 0xdf, 0xfe, 0x11, 0x12,
+ 0x0e, 0x0f, 0xff, 0x00,
+ 0xf0, 0xef, 0xf0, 0x11, 0x35, 0x02, 0x00, 0x01, 0xfe, 0x11, 0x34, 0xf0,
+ 0xef, 0x00, 0x42, 0x13,
+ 0x0f, 0x1f, 0xfc, 0xfe, 0x00, 0x12, 0x33, 0x0e, 0xfe, 0x10, 0x31, 0x13,
+ 0x10, 0xfe, 0xfe, 0x00,
+ 0x32, 0x00, 0x00, 0x1e, 0xf0, 0x01, 0xf0, 0x00, 0xef, 0xfe, 0x11, 0x23,
+ 0xf0, 0xd0, 0xed, 0xf0,
+ 0x14, 0x00, 0xed, 0x01, 0xf3, 0xe0, 0x00, 0xff, 0xec, 0x0e, 0xf0, 0xf2,
+ 0xf1, 0xf0, 0xee, 0xff,
+ 0x00, 0x11, 0xff, 0xfe, 0x00, 0xf2, 0x00, 0x0e, 0xfd, 0x0f, 0x30, 0x00,
+ 0xf0, 0x20, 0x2d, 0x1f,
+ 0x20, 0x12, 0x11, 0x0e, 0x0f, 0x11, 0x00, 0xee, 0x00, 0x02, 0xf0, 0xe1,
+ 0x00, 0xf0, 0xfe, 0xf0,
+ 0x02, 0x01, 0x01, 0x10, 0x00, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xf0, 0x02,
+ 0x13, 0x0d, 0xff, 0xef,
+ 0x01, 0x13, 0x45, 0x20, 0x10, 0x2f, 0x00, 0x32, 0x13, 0x1e, 0x1c, 0x00,
+ 0x0d, 0x00, 0x31, 0x14,
+ 0x01, 0xde, 0xde, 0x0f, 0x00, 0x00, 0xf2, 0xf1, 0x00, 0x0f, 0xce, 0x0d,
+ 0xfe, 0xef, 0x0f, 0x0e,
+ 0x00, 0x00, 0xec, 0x0f, 0x10, 0x0f, 0xf0, 0xf1, 0x01, 0x20, 0xf0, 0xf0,
+ 0x00, 0x11, 0x11, 0x00,
+ 0xf0, 0xf2, 0x03, 0x0f, 0x00, 0x01, 0xe2, 0x00, 0x01, 0x11, 0x02, 0x00,
+ 0x02, 0x35, 0x00, 0xde,
+ 0xfd, 0x10, 0x22, 0x1f, 0xfc, 0xf0, 0x22, 0x22, 0x10, 0x0e, 0xe0, 0x00,
+ 0x00, 0x00, 0x20, 0x00,
+ 0x10, 0x0f, 0xef, 0x0f, 0x20, 0x20, 0x10, 0x0c, 0xdf, 0x0d, 0x00, 0xf0,
+ 0xe3, 0x00, 0x00, 0xef,
+ 0xf1, 0xd0, 0xce, 0xff, 0xef, 0xe0, 0xde, 0xed, 0xff, 0xef, 0xfd, 0xe0,
+ 0x01, 0xf1, 0x0f, 0x1f,
+ 0x30, 0x13, 0x22, 0x01, 0x10, 0x00, 0x00, 0x30, 0x0d, 0x0f, 0x1f, 0x31,
+ 0x21, 0x20, 0x0e, 0x0e,
+ 0x10, 0x01, 0xf0, 0xe0, 0x0f, 0x21, 0x00, 0xcf, 0xef, 0x0f, 0xff, 0xf0,
+ 0xfd, 0xf1, 0x10, 0xf0,
+ 0xef, 0x0f, 0x01, 0x01, 0x41, 0x22, 0x00, 0xd0, 0x13, 0x23, 0x3f, 0x0f,
+ 0xec, 0xff, 0x00, 0xf1,
+ 0x00, 0x0f, 0x02, 0x22, 0x01, 0x00, 0x23, 0x22, 0x10, 0x00, 0x10, 0x14,
+ 0x0f, 0xff, 0x00, 0x12,
+ 0x11, 0xfe, 0xed, 0x0f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x00, 0xef, 0x22,
+ 0x12, 0xf0, 0x04, 0x20,
+ 0x00, 0xe2, 0xf0, 0xff, 0xed, 0x02, 0x02, 0xdf, 0x00, 0x00, 0x12, 0x00,
+ 0x11, 0x01, 0xf0, 0x0f,
+ 0x30, 0x0f, 0x20, 0x00, 0x2e, 0x30, 0x20, 0x10, 0x30, 0x42, 0x12, 0x23,
+ 0x20, 0x00, 0x0e, 0x0e,
+ 0x10, 0x55, 0xf0, 0xf0, 0x00, 0x00, 0x21, 0x0f, 0xee, 0x11, 0x02, 0x0e,
+ 0xde, 0x00, 0xf0, 0xd0,
+ 0xec, 0xf0, 0xfe, 0xd0, 0xef, 0xef, 0x10, 0x0d, 0xde, 0xed, 0x00, 0x30,
+ 0x01, 0xf0, 0x10, 0x11,
+ 0x11, 0x11, 0x01, 0x12, 0x0f, 0xde, 0x22, 0x35, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xf0, 0x0e,
+ 0x01, 0x15, 0x01, 0xf2, 0xf0, 0xfe, 0xef, 0x03, 0x02, 0xcf, 0xef, 0x00,
+ 0xe2, 0xef, 0xfd, 0xef,
+ 0xfe, 0x00, 0x00, 0x20, 0x1e, 0x2e, 0x11, 0x20, 0x21, 0x20, 0x20, 0x0d,
+ 0x0c, 0x10, 0x10, 0xff,
+ 0xdd, 0x0f, 0x43, 0x02, 0x1f, 0x00, 0x01, 0x02, 0x11, 0x00, 0x0d, 0x01,
+ 0xf0, 0xfe, 0x00, 0xfe,
+ 0xf0, 0x00, 0x00, 0xf0, 0xfd, 0xde, 0x00, 0x27, 0x31, 0x00, 0xd0, 0x1f,
+ 0x10, 0xf3, 0x00, 0x00,
+ 0x1f, 0x1e, 0x00, 0x11, 0x00, 0xf0, 0xfc, 0x00, 0x21, 0x33, 0xe0, 0x0d,
+ 0x11, 0x12, 0x11, 0x22,
+ 0x0f, 0xff, 0xfe, 0xf0, 0x00, 0x10, 0x02, 0xff, 0x0f, 0x0f, 0xfe, 0xfe,
+ 0x14, 0x24, 0x01, 0x00,
+ 0xfd, 0xff, 0x00, 0xf0, 0x03, 0x20, 0xf1, 0xf0, 0xfd, 0x01, 0x00, 0xee,
+ 0xff, 0xff, 0xff, 0xe1,
+ 0x02, 0x03, 0xf0, 0xe0, 0xee, 0x01, 0x22, 0x00, 0xf0, 0x0e, 0xfe, 0x0e,
+ 0x0e, 0x10, 0x30, 0x0f,
+ 0x20, 0x02, 0x22, 0x03, 0xff, 0x0f, 0x10, 0x12, 0x00, 0x03, 0x21, 0x01,
+ 0xfe, 0x0f, 0x20, 0x0e,
+ 0xdd, 0x00, 0x10, 0x14, 0x22, 0x00, 0xfe, 0xdf, 0xee, 0xf0, 0x00, 0x21,
+ 0xff, 0xf0, 0xef, 0x00,
+ 0x01, 0xf0, 0x0e, 0x00, 0x25, 0x31, 0x11, 0x10, 0x12, 0x11, 0x21, 0x00,
+ 0x1f, 0x10, 0x00, 0x00,
+ 0x00, 0x30, 0xf0, 0xf0, 0x00, 0x1f, 0xf0, 0xe0, 0x01, 0x03, 0x00, 0xee,
+ 0x0d, 0xff, 0xff, 0xdc,
+ 0x0f, 0x1f, 0x0e, 0x00, 0x0f, 0x0d, 0xee, 0xdc, 0x00, 0x21, 0x23, 0x10,
+ 0x01, 0x01, 0xf2, 0xf1,
+ 0x00, 0xed, 0x01, 0x22, 0x05, 0xff, 0xef, 0xf0, 0x00, 0x22, 0x00, 0x01,
+ 0x10, 0x00, 0x24, 0x44,
+ 0x00, 0xfe, 0x00, 0x0d, 0xf1, 0x35, 0x1f, 0x1f, 0x10, 0x00, 0xfe, 0x0e,
+ 0x11, 0x54, 0x01, 0x10,
+ 0x00, 0xeb, 0x01, 0x30, 0x01, 0x00, 0x22, 0x20, 0x00, 0x00, 0xe0, 0x12,
+ 0x0f, 0xed, 0xe0, 0xff,
+ 0xef, 0x01, 0x03, 0xe0, 0xcb, 0xdf, 0xee, 0x0f, 0xed, 0xdf, 0x00, 0x10,
+ 0xf0, 0xec, 0xff, 0xfe,
+ 0xfe, 0x00, 0x35, 0x00, 0xee, 0x0e, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x0e,
+ 0x0f, 0x0f, 0x20, 0x00,
+ 0xe0, 0x00, 0x02, 0x10, 0xff, 0xdd, 0x00, 0x44, 0xf0, 0xbd, 0x01, 0x10,
+ 0x00, 0xfd, 0xf0, 0xef,
+ 0xef, 0x01, 0x24, 0x00, 0xed, 0x01, 0x11, 0x13, 0x01, 0x01, 0x0e, 0x0f,
+ 0x21, 0x00, 0x0e, 0xee,
+ 0x00, 0x00, 0x00, 0x31, 0x01, 0x01, 0x02, 0xf1, 0x01, 0x33, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x0f,
+ 0xff, 0x10, 0x0e, 0x0e, 0x10, 0x00, 0x00, 0x02, 0x13, 0x11, 0x00, 0x02,
+ 0x11, 0x12, 0x25, 0x01,
+ 0xf0, 0xef, 0x00, 0xff, 0x00, 0x00, 0xf3, 0xee, 0xfe, 0xf0, 0x02, 0xf0,
+ 0xf1, 0x00, 0xf0, 0x26,
+ 0x00, 0x0e, 0x00, 0x0e, 0x10, 0x10, 0x20, 0x10, 0x20, 0x30, 0x10, 0x1f,
+ 0x00, 0x10, 0x20, 0x56,
+ 0x1f, 0xff, 0x0e, 0x01, 0x43, 0x03, 0x00, 0x1d, 0x1d, 0xfe, 0x00, 0x31,
+ 0xe0, 0xdc, 0x00, 0x00,
+ 0xfd, 0x9b, 0x0f, 0xef, 0x00, 0x02, 0xde, 0xec, 0x00, 0x0f, 0xdf, 0xff,
+ 0x00, 0xfe, 0x00, 0xe0,
+ 0x00, 0x10, 0x01, 0xf2, 0x01, 0x14, 0x32, 0x0d, 0xfe, 0x35, 0x33, 0x0f,
+ 0x00, 0x40, 0x22, 0x12,
+ 0x21, 0x01, 0x00, 0x12, 0xf1, 0xf0, 0xf2, 0xf1, 0xf0, 0x02, 0xe2, 0x01,
+ 0xde, 0xec, 0xff, 0x00,
+ 0xde, 0xff, 0x00, 0x10, 0x20, 0x00, 0x20, 0x21, 0xf0, 0xf0, 0x11, 0x20,
+ 0x42, 0x10, 0x0e, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x21, 0xee, 0xdd, 0x77, 0x32, 0xcb, 0x22, 0x12, 0x0f,
+ 0x0f, 0xff, 0x01, 0x12,
+ 0x0f, 0xee, 0x00, 0x33, 0x12, 0xdf, 0xed, 0x00, 0x11, 0x02, 0xf1, 0x14,
+ 0x10, 0xee, 0x01, 0x24,
+ 0x00, 0xe0, 0x00, 0x11, 0x20, 0x0e, 0x01, 0x11, 0x1f, 0x0e, 0x1f, 0x10,
+ 0x33, 0x00, 0xe0, 0x10,
+ 0x21, 0x22, 0x1f, 0xfd, 0xe0, 0x30, 0x13, 0xff, 0xfc, 0x00, 0x11, 0x13,
+ 0x00, 0xfe, 0xf0, 0xfe,
+ 0x01, 0x13, 0x00, 0xff, 0xcc, 0x00, 0xf3, 0x21, 0x11, 0xee, 0xe0, 0x00,
+ 0xf0, 0xcd, 0x01, 0x24,
+ 0xff, 0xbd, 0x01, 0xe2, 0x00, 0xed, 0xef, 0x10, 0x2f, 0x0f, 0x0f, 0x32,
+ 0x11, 0x1d, 0x0c, 0x0d,
+ 0xf0, 0x20, 0x12, 0x00, 0x00, 0x03, 0xe0, 0x0d, 0xee, 0x0f, 0x00, 0x12,
+ 0x23, 0x0e, 0xfc, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0xe1, 0x02, 0x01, 0xf0, 0xff, 0xe0, 0xf1,
+ 0xef, 0x00, 0x00, 0xf1,
+ 0x02, 0x01, 0x00, 0x0f, 0x2e, 0x0d, 0xf0, 0x46, 0x32, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x18, 0x17, 0x77, 0x18, 0xbc, 0x16, 0xd3, 0x17, 0x00, 0x1f, 0x20, 0x32,
+ 0x12, 0xed, 0xfe, 0x01,
+ 0x11, 0x11, 0x00, 0xe0, 0x00, 0xf0, 0x02, 0xff, 0xee, 0x00, 0x0f, 0x00,
+ 0xef, 0x0d, 0x0d, 0x1e,
+ 0x0c, 0x0d, 0xe0, 0x20, 0xf0, 0xee, 0x0f, 0x20, 0x01, 0xe2, 0x02, 0xf1,
+ 0xf0, 0xff, 0x0f, 0x01,
+ 0x00, 0xf0, 0x00, 0x12, 0x00, 0x00, 0xfe, 0x0f, 0xef, 0x02, 0x15, 0x21,
+ 0x03, 0xe0, 0xe0, 0x02,
+ 0x01, 0xe0, 0xff, 0x00, 0x20, 0x2e, 0x00, 0x0f, 0xfd, 0x10, 0x32, 0x20,
+ 0x11, 0x1f, 0x00, 0x01,
+ 0x00, 0x10, 0x11, 0x00, 0x0e, 0x31, 0x11, 0x01, 0x1f, 0x0f, 0xf1, 0xff,
+ 0xfe, 0x0e, 0xcd, 0xf1,
+ 0x17, 0xd0, 0xcd, 0x01, 0xde, 0xcd, 0xee, 0x01, 0xf2, 0xef, 0xf0, 0x0d,
+ 0xfd, 0xff, 0x00, 0xef,
+ 0x0e, 0x02, 0x22, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x33, 0x0f, 0xfc, 0x30,
+ 0x20, 0x20, 0x0f, 0x00,
+ 0x41, 0x00, 0xee, 0x31, 0x0f, 0xce, 0x10, 0x10, 0x02, 0xf0, 0xed, 0xff,
+ 0xf0, 0x01, 0x0f, 0xef,
+ 0x00, 0x00, 0x0d, 0xef, 0xfe, 0x12, 0x33, 0x22, 0x00, 0xf0, 0xf0, 0x00,
+ 0xf0, 0x22, 0x24, 0xef,
+ 0xfe, 0x11, 0x12, 0x23, 0x00, 0xff, 0x0e, 0x01, 0x32, 0x00, 0x0f, 0x20,
+ 0x13, 0x00, 0xde, 0x00,
+ 0x31, 0x10, 0xfe, 0x13, 0x13, 0xfe, 0xff, 0x02, 0x03, 0x10, 0x00, 0xf0,
+ 0x03, 0x02, 0x20, 0x00,
+ 0x00, 0xef, 0xff, 0x02, 0xe3, 0xf0, 0x11, 0x00, 0xd0, 0xdc, 0xf0, 0x01,
+ 0x20, 0x01, 0x34, 0x00,
+ 0x0f, 0x00, 0x20, 0x11, 0x2f, 0x0e, 0x2e, 0x20, 0x35, 0x21, 0x00, 0x0e,
+ 0x20, 0x20, 0x21, 0x23,
+ 0x20, 0x10, 0x22, 0x12, 0x21, 0x21, 0xff, 0x00, 0x30, 0x01, 0xf1, 0xef,
+ 0xff, 0x0f, 0xdd, 0xdf,
+ 0xf0, 0x00, 0xe0, 0xfd, 0xde, 0x00, 0xfc, 0x00, 0x01, 0xff, 0x0e, 0x00,
+ 0x10, 0x0f, 0x11, 0x00,
+ 0xdd, 0xee, 0x00, 0x00, 0x11, 0x22, 0xff, 0xf0, 0x03, 0x21, 0x00, 0x1e,
+ 0x23, 0x22, 0x01, 0x12,
+ 0x23, 0x00, 0xe0, 0xd0, 0x04, 0xd0, 0xd0, 0xe0, 0x02, 0xe0, 0xdd, 0x22,
+ 0xf0, 0xcd, 0x01, 0x20,
+ 0x00, 0x0e, 0xfd, 0x21, 0x11, 0x10, 0x0f, 0x0f, 0x10, 0x0e, 0x00, 0x21,
+ 0x0f, 0x00, 0x31, 0x00,
+ 0xfc, 0xff, 0x10, 0x01, 0x00, 0x20, 0x22, 0x2f, 0xfd, 0x00, 0x00, 0x00,
+ 0x00, 0x22, 0xf0, 0x0e,
+ 0xf0, 0xfd, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xdd, 0xef, 0x24, 0x05, 0x00,
+ 0xe0, 0x00, 0x00, 0x12,
+ 0x11, 0x00, 0xed, 0x10, 0x14, 0x20, 0x0d, 0xfd, 0x00, 0x00, 0x23, 0x10,
+ 0x0f, 0xec, 0xf0, 0x10,
+ 0x35, 0x01, 0x00, 0x13, 0x00, 0x00, 0xdb, 0xff, 0x10, 0x31, 0x02, 0xf0,
+ 0x2f, 0x0e, 0xfd, 0x02,
+ 0x11, 0x00, 0x00, 0x0f, 0xf1, 0xf1, 0x12, 0x01, 0x01, 0xe1, 0xff, 0xff,
+ 0x01, 0x01, 0xdf, 0xdc,
+ 0x02, 0xf1, 0x00, 0xfe, 0xed, 0x10, 0x12, 0x1f, 0x1e, 0x12, 0x10, 0x00,
+ 0x00, 0x0e, 0xf0, 0x03,
+ 0x03, 0x0e, 0xff, 0x00, 0xee, 0x0f, 0xf0, 0x11, 0x32, 0x10, 0x23, 0x10,
+ 0x00, 0x1f, 0x20, 0x00,
+ 0xf0, 0x20, 0x11, 0x00, 0xe0, 0xe0, 0xff, 0xf0, 0xe0, 0xce, 0xfd, 0x02,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0xff, 0x10, 0x32, 0x1f, 0x0e, 0x0f, 0x01, 0x33, 0x33, 0x10, 0x10, 0x11,
+ 0x01, 0x14, 0x11, 0x01,
+ 0xf0, 0x0e, 0xf0, 0xf0, 0xe2, 0x01, 0x12, 0x10, 0x0e, 0xff, 0xfe, 0xfd,
+ 0xfd, 0x10, 0x0e, 0x2f,
+ 0x30, 0xf0, 0x00, 0xfd, 0xdc, 0x00, 0x0f, 0xfd, 0x00, 0x01, 0xd0, 0xee,
+ 0x00, 0x12, 0x11, 0x0d,
+ 0xf0, 0x11, 0x0e, 0x0f, 0x12, 0x24, 0x23, 0xe0, 0xdc, 0x00, 0x17, 0x00,
+ 0xcd, 0x13, 0x10, 0x0f,
+ 0x00, 0xf0, 0x25, 0x20, 0x21, 0x00, 0xf0, 0x00, 0x32, 0x22, 0x00, 0xee,
+ 0x00, 0x0f, 0x1f, 0x1f,
+ 0x33, 0x33, 0xed, 0xfe, 0x53, 0x1f, 0x0e, 0x12, 0x25, 0x20, 0x01, 0x01,
+ 0x03, 0xde, 0xfd, 0x00,
+ 0xd1, 0xe0, 0xde, 0xed, 0xff, 0xf1, 0x00, 0xdd, 0xfb, 0xee, 0x10, 0x2f,
+ 0x00, 0xf0, 0xf0, 0xf0,
+ 0xee, 0xf0, 0xee, 0x0f, 0xef, 0xe0, 0xf0, 0xcc, 0x00, 0x1f, 0x00, 0x1f,
+ 0x0e, 0x10, 0x21, 0x11,
+ 0x20, 0x20, 0x0d, 0x0f, 0x10, 0x02, 0xe2, 0x01, 0x01, 0xff, 0xdc, 0xf0,
+ 0x04, 0xff, 0xfe, 0x00,
+ 0x00, 0xf0, 0x00, 0xff, 0x20, 0x00, 0xd0, 0x0e, 0x00, 0x11, 0x23, 0x01,
+ 0x00, 0xf0, 0xf1, 0x00,
+ 0x00, 0x0f, 0xf0, 0x01, 0x01, 0x10, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0x20,
+ 0x01, 0x00, 0x0f, 0x20,
+ 0x01, 0x10, 0x10, 0x12, 0x22, 0x02, 0x20, 0x00, 0xff, 0x00, 0x0f, 0xff,
+ 0x03, 0x23, 0x01, 0x01,
+ 0x02, 0x00, 0xf0, 0xf0, 0xf0, 0x12, 0x12, 0xff, 0xdc, 0xe0, 0x04, 0xf0,
+ 0xef, 0x0f, 0x0e, 0xfd,
+ 0xe0, 0x10, 0x03, 0x21, 0x21, 0x0e, 0x00, 0x00, 0x10, 0x0f, 0x21, 0x44,
+ 0x10, 0x0c, 0x0e, 0x10,
+ 0x31, 0x44, 0x23, 0x20, 0x0e, 0x2e, 0x00, 0x00, 0x31, 0x24, 0x0f, 0xfe,
+ 0x23, 0xdd, 0xcc, 0x00,
+ 0x02, 0xfe, 0xbc, 0x00, 0xfe, 0xef, 0xff, 0xf0, 0x00, 0xff, 0xed, 0xe0,
+ 0x0f, 0x10, 0xff, 0xef,
+ 0x11, 0x14, 0x0e, 0xcb, 0x0f, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x20, 0x46,
+ 0x00, 0x21, 0x22, 0x01,
+ 0x22, 0x34, 0x11, 0x0e, 0xee, 0xe0, 0x01, 0xf2, 0xdf, 0xee, 0x00, 0x02,
+ 0xf1, 0xe1, 0x00, 0xfd,
+ 0x00, 0x10, 0x02, 0x22, 0xfe, 0xec, 0x02, 0x31, 0x00, 0x0d, 0xfe, 0x00,
+ 0x10, 0x01, 0x32, 0x22,
+ 0x00, 0x00, 0x10, 0x1f, 0x00, 0x20, 0x21, 0x33, 0x0f, 0x0f, 0x00, 0x00,
+ 0x10, 0x10, 0x11, 0x00,
+ 0x10, 0x00, 0xff, 0x00, 0x0f, 0xe0, 0x22, 0x14, 0x00, 0x00, 0xe0, 0xef,
+ 0xe0, 0xf0, 0x01, 0x00,
+ 0x23, 0x13, 0x10, 0x12, 0x20, 0xee, 0xed, 0x20, 0x10, 0x00, 0x00, 0x12,
+ 0x01, 0x32, 0x00, 0x0d,
+ 0x0f, 0xf0, 0x00, 0x13, 0x12, 0x10, 0x31, 0x02, 0xff, 0xfd, 0xfe, 0x01,
+ 0x31, 0x00, 0x30, 0x0e,
+ 0xdc, 0xef, 0x0f, 0x12, 0x22, 0xf0, 0xee, 0xf0, 0x01, 0x03, 0x01, 0xf0,
+ 0xed, 0xf0, 0xf1, 0x03,
+ 0xf0, 0xd0, 0xfc, 0xef, 0x0f, 0xfd, 0xee, 0x11, 0x35, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x20, 0x0f,
+ 0x0f, 0x01, 0x00, 0xff, 0xfc, 0x00, 0x0f, 0xee, 0x00, 0xef, 0x0e, 0x10,
+ 0x10, 0x22, 0x22, 0x01,
+ 0x10, 0x02, 0x10, 0xfe, 0xf0, 0x00, 0x00, 0xc0, 0xef, 0xe0, 0x01, 0x01,
+ 0xf1, 0xf2, 0xf0, 0xf0,
+ 0xff, 0x0f, 0xfb, 0x01, 0x75, 0x0f, 0xfe, 0x23, 0x10, 0x0f, 0x00, 0x00,
+ 0x23, 0x23, 0x00, 0xf0,
+ 0x02, 0x23, 0x12, 0xdf, 0xfe, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x20, 0x0f,
+ 0x0f, 0x11, 0xfe, 0xfb,
+ 0x00, 0x2f, 0x10, 0x00, 0xef, 0x0f, 0x10, 0x00, 0xfd, 0xfd, 0xfe, 0xe0,
+ 0x0f, 0xff, 0x00, 0x0f,
+ 0x2f, 0xfe, 0xf0, 0x15, 0x22, 0x00, 0xcf, 0x00, 0x02, 0xf0, 0xf1, 0x00,
+ 0xf2, 0xf0, 0x0f, 0xef,
+ 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x03, 0x30, 0xf1, 0x02, 0xf2, 0x01, 0x00,
+ 0x11, 0x0f, 0xfd, 0x0e,
+ 0x0d, 0x10, 0x32, 0x10, 0x0f, 0x10, 0x40, 0x11, 0x12, 0x12, 0x23, 0x34,
+ 0xf0, 0xee, 0xff, 0xf0,
+ 0x02, 0xf0, 0xef, 0x0f, 0xee, 0xdb, 0xfe, 0xef, 0xf0, 0x02, 0x00, 0x0d,
+ 0xe0, 0x00, 0xe0, 0xff,
+ 0xf0, 0xe0, 0x00, 0x0d, 0xdb, 0xef, 0xfe, 0xe0, 0x02, 0xee, 0xfd, 0x10,
+ 0x00, 0x0f, 0x10, 0x55,
+ 0x12, 0x10, 0x0d, 0x11, 0x32, 0xfe, 0x0f, 0x1f, 0x10, 0x0f, 0xef, 0x0e,
+ 0xef, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x11, 0x0e, 0xde, 0x00, 0x10, 0x10, 0x12, 0x00, 0xff, 0x10,
+ 0x33, 0xe0, 0x0f, 0x00,
+ 0x02, 0x00, 0xf1, 0x03, 0x02, 0x01, 0x01, 0xe0, 0x00, 0xfd, 0x00, 0x00,
+ 0x20, 0x00, 0x01, 0xff,
+ 0x1f, 0x51, 0x01, 0xf1, 0x32, 0xef, 0x00, 0x54, 0x01, 0x10, 0xef, 0xef,
+ 0x0f, 0x10, 0x33, 0x00,
+ 0xef, 0x0f, 0xf0, 0x15, 0x12, 0xf0, 0x00, 0xf0, 0x03, 0xe0, 0xd0, 0xff,
+ 0xef, 0x00, 0x00, 0x00,
+ 0x0f, 0xef, 0x0f, 0x22, 0x00, 0xf0, 0x1f, 0x20, 0x10, 0x32, 0x13, 0x20,
+ 0x01, 0x00, 0x54, 0x00,
+ 0x0e, 0x0c, 0x21, 0x52, 0x13, 0x12, 0x1f, 0x20, 0x20, 0x33, 0x13, 0x1f,
+ 0x10, 0x20, 0xf0, 0x02,
+ 0x02, 0x01, 0xe0, 0xed, 0xff, 0x0f, 0xde, 0xee, 0xe0, 0xfe, 0x00, 0x0f,
+ 0xfd, 0x00, 0x01, 0xf0,
+ 0xef, 0x0d, 0x0f, 0x20, 0x00, 0xfc, 0xee, 0xfd, 0x00, 0x01, 0x02, 0x10,
+ 0x00, 0x01, 0x14, 0x00,
+ 0x00, 0x03, 0x20, 0x01, 0x12, 0x02, 0xf0, 0xce, 0xfe, 0xf0, 0x01, 0x02,
+ 0x00, 0xf1, 0xd1, 0x03,
+ 0x03, 0xe0, 0x0c, 0xf0, 0x00, 0x01, 0x00, 0x0e, 0x00, 0xed, 0x0d, 0x10,
+ 0x21, 0x00, 0x01, 0x10,
+ 0x10, 0x0e, 0xff, 0x01, 0x11, 0x21, 0x23, 0x20, 0xff, 0xfd, 0x20, 0x3f,
+ 0x1e, 0xec, 0x0f, 0x0f,
+ 0x1f, 0x21, 0x02, 0x01, 0xf0, 0x0f, 0xe0, 0xf0, 0x00, 0x12, 0x03, 0xf1,
+ 0x00, 0xdd, 0x00, 0x00,
+ 0xff, 0x0e, 0x00, 0x11, 0x34, 0x01, 0x00, 0x10, 0x00, 0xde, 0xee, 0x47,
+ 0x00, 0xae, 0x11, 0x11,
+ 0xfe, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x10, 0x1f, 0x0f, 0x02, 0x34,
+ 0x10, 0x00, 0x00, 0x0e,
+ 0x00, 0xf1, 0xf0, 0xfc, 0x0f, 0x0e, 0xef, 0x32, 0x12, 0xe0, 0x02, 0x22,
+ 0xf1, 0x00, 0xde, 0x00,
+ 0x13, 0x00, 0xe0, 0x00, 0xff, 0xff, 0xef, 0x0e, 0xee, 0x0f, 0x23, 0x11,
+ 0x0f, 0xde, 0x10, 0x25,
+ 0x11, 0x01, 0xdf, 0x20, 0x12, 0xdc, 0xfe, 0x0f, 0x0f, 0x00, 0x10, 0x11,
+ 0x21, 0x00, 0x00, 0x11,
+ 0x12, 0x10, 0x02, 0x00, 0x00, 0x02, 0x02, 0xf0, 0x0f, 0xcd, 0xed, 0x0f,
+ 0x0f, 0xee, 0xff, 0x13,
+ 0x10, 0x00, 0x10, 0x0f, 0x0e, 0x0f, 0x00, 0x03, 0x42, 0x01, 0x01, 0x0f,
+ 0x00, 0x01, 0x02, 0x12,
+ 0x01, 0x00, 0x00, 0xf1, 0x04, 0x11, 0x00, 0x00, 0x01, 0x12, 0x0e, 0x0f,
+ 0xff, 0x0f, 0x20, 0x10,
+ 0x0e, 0x0f, 0xfb, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff, 0x0d,
+ 0x0f, 0x0f, 0x10, 0x0f,
+ 0xfe, 0xed, 0x00, 0x31, 0x11, 0x01, 0x22, 0x00, 0x00, 0xd0, 0x03, 0xf0,
+ 0xed, 0x00, 0x01, 0xf1,
+ 0xf1, 0x00, 0xe0, 0x03, 0x10, 0x0f, 0xe0, 0x00, 0x21, 0x02, 0x24, 0x11,
+ 0x00, 0x0f, 0x10, 0x31,
+ 0x00, 0xff, 0x22, 0x00, 0x2f, 0x20, 0x0e, 0xee, 0x31, 0x45, 0x00, 0x02,
+ 0x21, 0x54, 0x02, 0xed,
+ 0xff, 0x12, 0x00, 0xff, 0x00, 0xe0, 0xf0, 0x0f, 0xed, 0xdd, 0xf0, 0x12,
+ 0x21, 0xed, 0xcc, 0x11,
+ 0x13, 0xed, 0xed, 0xff, 0x0f, 0xef, 0xee, 0xee, 0xed, 0x0f, 0xfd, 0x00,
+ 0xee, 0xee, 0x00, 0x44,
+ 0x01, 0x00, 0x1e, 0x0f, 0x0e, 0x11, 0x12, 0x00, 0xfe, 0x0f, 0x0f, 0x11,
+ 0x01, 0xcf, 0xfe, 0x00,
+ 0x03, 0x00, 0xff, 0xff, 0x01, 0x11, 0xf1, 0x0f, 0x0e, 0x0f, 0x00, 0x30,
+ 0x00, 0xef, 0x00, 0x02,
+ 0xf0, 0xff, 0x01, 0x01, 0xdf, 0x00, 0xe2, 0x13, 0x00, 0xfe, 0x0e, 0x03,
+ 0x00, 0x1f, 0x1f, 0x00,
+ 0x10, 0x2f, 0x0e, 0x00, 0xf0, 0x11, 0x24, 0x12, 0x1f, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x10, 0x1e,
+ 0x11, 0x22, 0x01, 0x00, 0xf1, 0xf1, 0x01, 0x10, 0xf0, 0xe1, 0xf2, 0x01,
+ 0xf1, 0xe0, 0x0f, 0xed,
+ 0xff, 0xee, 0xff, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0xfe, 0x01, 0x25,
+ 0x32, 0x00, 0x0f, 0x1f,
+ 0x11, 0x12, 0x32, 0x00, 0x1d, 0x0d, 0x0d, 0x10, 0x42, 0x22, 0x10, 0x21,
+ 0x00, 0x42, 0x13, 0x20,
+ 0xf0, 0x01, 0x01, 0xf1, 0x00, 0x0e, 0xed, 0x00, 0xff, 0xff, 0xdf, 0x0f,
+ 0xe0, 0xfd, 0xed, 0xf0,
+ 0x00, 0x01, 0xf1, 0x0e, 0xfe, 0xfd, 0xdf, 0x0f, 0x00, 0x00, 0x0e, 0x10,
+ 0x01, 0x10, 0x00, 0x02,
+ 0x02, 0x11, 0x11, 0x12, 0x10, 0x02, 0x01, 0x02, 0xf0, 0x01, 0x0f, 0xf0,
+ 0xef, 0x02, 0x13, 0x00,
+ 0xfe, 0xdf, 0x00, 0x11, 0xf0, 0xfe, 0x02, 0x00, 0x11, 0x11, 0x0e, 0xde,
+ 0x1f, 0x00, 0x10, 0x31,
+ 0x02, 0xff, 0x00, 0x02, 0x00, 0x00, 0x0f, 0x22, 0x33, 0x10, 0x20, 0x10,
+ 0x10, 0x1f, 0xfd, 0x10,
+ 0x20, 0x12, 0x0f, 0x00, 0x10, 0x01, 0xf1, 0x02, 0x10, 0x0f, 0x0f, 0xf0,
+ 0x03, 0x12, 0x00, 0x0d,
+ 0x0e, 0xff, 0x10, 0x22, 0x01, 0xf2, 0x12, 0x00, 0x00, 0x01, 0xe1, 0x01,
+ 0xe0, 0x01, 0x00, 0xf0,
+ 0x11, 0x00, 0xdd, 0x21, 0x32, 0x20, 0x10, 0x1f, 0xff, 0x00, 0x31, 0x01,
+ 0x01, 0x21, 0x22, 0x00,
+ 0x0f, 0x0f, 0xef, 0x0f, 0x20, 0x0d, 0xff, 0xfe, 0xff, 0x00, 0x01, 0x22,
+ 0x00, 0x00, 0xe0, 0xff,
+ 0xe0, 0x13, 0x01, 0xef, 0x0f, 0xff, 0xef, 0x0e, 0x01, 0xf0, 0x0f, 0x00,
+ 0xf1, 0x01, 0xf0, 0x0f,
+ 0x00, 0xff, 0xf0, 0x00, 0x20, 0x2f, 0x00, 0xff, 0x00, 0x0d, 0x2e, 0x0f,
+ 0x1e, 0x10, 0x12, 0x02,
+ 0x00, 0xef, 0xf0, 0x12, 0x22, 0xd0, 0xee, 0xf0, 0x01, 0x02, 0x00, 0xec,
+ 0xef, 0x00, 0x0f, 0xde,
+ 0x00, 0x01, 0x12, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x11, 0x11, 0x10,
+ 0x12, 0x10, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x12, 0x02, 0xf1, 0x02, 0x02, 0x02, 0x00, 0x20, 0x00,
+ 0x02, 0x11, 0x0f, 0xfe,
+ 0x2f, 0x1f, 0xfe, 0x0e, 0x20, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0xee, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0b,
+ 0xff, 0x00, 0x1e, 0x0f, 0x1f, 0x0e, 0x01, 0x32, 0x11, 0x02, 0x01, 0xf0,
+ 0xde, 0xf0, 0xf2, 0xef,
+ 0x00, 0x01, 0xf2, 0xe0, 0xd0, 0x0f, 0x00, 0x00, 0xfd, 0xce, 0x00, 0x02,
+ 0x13, 0x12, 0x12, 0x00,
+ 0x0f, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x10, 0x1e, 0x0f, 0x00, 0x12, 0x20,
+ 0x12, 0x22, 0x10, 0x11,
+ 0x01, 0x00, 0x02, 0x11, 0x23, 0x0e, 0x0f, 0xdf, 0x00, 0x12, 0x00, 0xeb,
+ 0x00, 0xef, 0x0f, 0xf0,
+ 0xf0, 0xee, 0xff, 0xef, 0xfe, 0xdc, 0xfe, 0xe0, 0x00, 0xf0, 0xee, 0x0e,
+ 0xff, 0xee, 0x00, 0x0f,
+ 0x0f, 0x00, 0x12, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x22, 0x1f,
+ 0xfa, 0x00, 0x20, 0x00,
+ 0xf0, 0x00, 0x00, 0x0e, 0x10, 0x00, 0xef, 0x10, 0x22, 0x00, 0x0e, 0x00,
+ 0x10, 0x21, 0x03, 0x00,
+ 0x00, 0xff, 0xee, 0xf0, 0x03, 0x13, 0xe0, 0xe0, 0xf1, 0x02, 0x01, 0x00,
+ 0x00, 0xfe, 0x00, 0x12,
+ 0x21, 0x11, 0x10, 0xfd, 0xff, 0x00, 0x31, 0x0f, 0x0f, 0x11, 0x11, 0x00,
+ 0x00, 0x35, 0x10, 0x10,
+ 0x00, 0x0f, 0xf0, 0x12, 0x22, 0x10, 0x02, 0x00, 0xdf, 0x02, 0x00, 0xc0,
+ 0x01, 0x11, 0xf0, 0xe0,
+ 0xed, 0xf0, 0xf0, 0xff, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x21,
+ 0x01, 0x00, 0x23, 0x33,
+ 0x00, 0x10, 0x00, 0x20, 0x21, 0x33, 0x2f, 0x0e, 0x3f, 0x30, 0x12, 0x12,
+ 0x31, 0x21, 0x21, 0x23,
+ 0x22, 0x01, 0xf0, 0x02, 0x01, 0x0f, 0xfe, 0xee, 0xf0, 0x01, 0x12, 0x00,
+ 0xfc, 0xf0, 0xfe, 0xef,
+ 0xff, 0xff, 0x00, 0x12, 0x10, 0x0f, 0xdc, 0xfd, 0xff, 0x0e, 0x00, 0x1e,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xef, 0x00, 0x0f, 0x00, 0xf0, 0x05, 0x22, 0xe0, 0xff, 0x02, 0x02,
+ 0xfe, 0xee, 0x00, 0x14,
+ 0x01, 0xf0, 0xfe, 0xff, 0xdf, 0x01, 0x01, 0xf1, 0xe0, 0x00, 0xf0, 0x0f,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x01, 0x31, 0x0e, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0x0f, 0x22, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xa6, 0xed, 0x88, 0xf3, 0x86, 0xed, 0x56, 0xf3, 0x00, 0x10, 0x11, 0xff,
+ 0x0f, 0x0e, 0x0f, 0x20,
+ 0x00, 0x00, 0xf0, 0x00, 0x0e, 0x10, 0x10, 0xff, 0x00, 0x00, 0x02, 0x01,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x10, 0xf1, 0xf2, 0xf0, 0xf0, 0x01, 0x02, 0x02, 0x0f,
+ 0x0f, 0xf0, 0xee, 0x00,
+ 0x10, 0x22, 0x10, 0x11, 0x20, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0xfe, 0x00,
+ 0x21, 0x13, 0x12, 0x01,
+ 0x00, 0xdd, 0x0f, 0x0f, 0x10, 0x0e, 0xe0, 0x00, 0x01, 0x21, 0x10, 0x0f,
+ 0xee, 0x10, 0x0f, 0xff,
+ 0x02, 0x33, 0xf0, 0x0f, 0xf1, 0xe1, 0x02, 0xf1, 0xff, 0xfe, 0x01, 0x00,
+ 0xf0, 0xff, 0x0f, 0x00,
+ 0x01, 0x0e, 0x00, 0x20, 0x00, 0x20, 0x01, 0x01, 0x0f, 0x00, 0x20, 0x02,
+ 0x00, 0xf1, 0x01, 0xe0,
+ 0x00, 0xff, 0x00, 0x11, 0x00, 0xff, 0x00, 0x02, 0x10, 0xee, 0xfd, 0x01,
+ 0x00, 0x00, 0x01, 0x0e,
+ 0xfe, 0x01, 0xf0, 0xf0, 0x00, 0x10, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x34,
+ 0x10, 0xf0, 0x0f, 0x11,
+ 0x01, 0xf4, 0x01, 0x02, 0xde, 0x0f, 0x02, 0x10, 0x01, 0x11, 0x21, 0x00,
+ 0x02, 0x1f, 0x0d, 0x0e,
+ 0x10, 0x13, 0x10, 0xe0, 0x0d, 0xff, 0xfe, 0xfd, 0xfe, 0x0d, 0x0f, 0x20,
+ 0x0f, 0x1f, 0x1f, 0x1f,
+ 0x10, 0x0e, 0x10, 0x0e, 0x10, 0x10, 0x01, 0xd0, 0x03, 0x10, 0xe0, 0xef,
+ 0xf0, 0xf0, 0xdf, 0x00,
+ 0x01, 0x12, 0xf0, 0x0f, 0x00, 0x03, 0x11, 0xf1, 0xf0, 0xff, 0x00, 0x00,
+ 0xf0, 0x13, 0x11, 0x10,
+ 0x10, 0x21, 0x12, 0x10, 0x00, 0x0f, 0x0f, 0x10, 0x12, 0x32, 0x20, 0x02,
+ 0x11, 0x00, 0x22, 0x01,
+ 0x00, 0x23, 0x10, 0x0f, 0x01, 0xf1, 0x02, 0x00, 0x01, 0x00, 0xfc, 0xdd,
+ 0x00, 0x10, 0xef, 0xff,
+ 0x00, 0xfe, 0xff, 0xee, 0xf0, 0x0e, 0x00, 0x00, 0xfe, 0xfd, 0x0f, 0xee,
+ 0x0f, 0x00, 0xf0, 0xf0,
+ 0xfe, 0x0f, 0xde, 0x00, 0x10, 0x00, 0xed, 0x00, 0x12, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0x02, 0x00, 0xff, 0xff, 0x10, 0x00, 0x0f, 0x00, 0xee, 0x00,
+ 0x11, 0x34, 0x12, 0xfe,
+ 0xcc, 0x01, 0x01, 0xe0, 0x01, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x02, 0x00,
+ 0x02, 0x20, 0xff, 0x0e,
+ 0x00, 0x00, 0x20, 0x12, 0xfd, 0xfd, 0x01, 0x22, 0x01, 0x00, 0x20, 0x10,
+ 0x13, 0x10, 0x21, 0x11,
+ 0x03, 0x10, 0x01, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xe0, 0xf0, 0x02, 0x00,
+ 0xde, 0xf0, 0xf0, 0xdd,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0x0f, 0xff, 0x00, 0x00,
+ 0xf0, 0x00, 0x21, 0x00,
+ 0x1f, 0x0f, 0x20, 0x10, 0x35, 0x30, 0x10, 0x1f, 0x20, 0x34, 0x20, 0x1f,
+ 0x0f, 0x01, 0x22, 0x23,
+ 0x10, 0x10, 0x00, 0xf0, 0xfd, 0x01, 0x03, 0x12, 0x22, 0x00, 0xf0, 0xee,
+ 0xff, 0xff, 0xdd, 0x0e,
+ 0xff, 0x0e, 0xfe, 0xf0, 0x01, 0xfe, 0xfe, 0x0e, 0x00, 0x0d, 0x00, 0x02,
+ 0x00, 0xff, 0x11, 0x01,
+ 0x00, 0x01, 0xf0, 0xe0, 0x11, 0x22, 0x00, 0xed, 0xf1, 0x02, 0x32, 0x11,
+ 0xf0, 0x00, 0xf1, 0x00,
+ 0xf0, 0xff, 0xee, 0x00, 0x12, 0xf0, 0xe0, 0xef, 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x11, 0x33, 0x11,
+ 0x10, 0x00, 0x00, 0x01, 0x30, 0x00, 0xf0, 0x1f, 0x1f, 0x11, 0x02, 0x22,
+ 0x11, 0x00, 0x20, 0x01,
+ 0x0f, 0x10, 0x12, 0x21, 0x0f, 0xda, 0x00, 0x31, 0x21, 0x00, 0xe0, 0x1f,
+ 0x10, 0x0e, 0xf0, 0x00,
+ 0x10, 0x13, 0x33, 0x02, 0xef, 0x00, 0x00, 0xe1, 0xf1, 0xd0, 0x0f, 0x01,
+ 0x01, 0xf1, 0x01, 0x00,
+ 0xff, 0x0f, 0x30, 0x01, 0x20, 0x10, 0x20, 0x24, 0x12, 0x11, 0x11, 0xed,
+ 0xdd, 0x00, 0x00, 0x21,
+ 0x01, 0x32, 0x0f, 0x0d, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x0d, 0x0f,
+ 0x0f, 0x0f, 0xf0, 0xf0,
+ 0xe0, 0x0f, 0x02, 0xf0, 0xf2, 0xd0, 0x0f, 0x00, 0x03, 0x0f, 0x00, 0x0e,
+ 0xef, 0xef, 0xff, 0x0f,
+ 0x2f, 0x0f, 0x0f, 0x21, 0x01, 0x11, 0x11, 0x11, 0x31, 0xfe, 0xff, 0x0f,
+ 0x10, 0x10, 0x01, 0x01,
+ 0x10, 0xff, 0xdc, 0xf0, 0xf1, 0xf1, 0x02, 0x00, 0xfc, 0xf1, 0xf1, 0xe0,
+ 0xff, 0x00, 0x20, 0xf0,
+ 0xef, 0x0e, 0x00, 0x00, 0x10, 0xee, 0x00, 0x0f, 0xf0, 0x00, 0x04, 0x10,
+ 0x00, 0x01, 0x12, 0x10,
+ 0x10, 0x00, 0x02, 0x22, 0x02, 0xe1, 0x00, 0xfd, 0x0f, 0x00, 0x22, 0x24,
+ 0x01, 0x00, 0x03, 0x01,
+ 0x21, 0xff, 0xee, 0x01, 0x21, 0xfd, 0xec, 0x0f, 0x0f, 0xfe, 0x0e, 0x1f,
+ 0x0d, 0x20, 0x10, 0x0f,
+ 0x0f, 0x10, 0x22, 0x10, 0x00, 0x1f, 0x11, 0x00, 0x00, 0xef, 0xf0, 0x00,
+ 0xee, 0xfe, 0x00, 0xe0,
+ 0xe0, 0x00, 0x02, 0xf0, 0xf0, 0xf0, 0xff, 0x0f, 0xe1, 0x14, 0x00, 0xef,
+ 0xee, 0xff, 0xf0, 0xef,
+ 0x00, 0xf0, 0x10, 0x21, 0x01, 0x11, 0x01, 0x00, 0x03, 0x21, 0x20, 0x00,
+ 0x10, 0x00, 0x32, 0x11,
+ 0x01, 0x10, 0x30, 0x02, 0x01, 0x13, 0x10, 0xf0, 0x00, 0x00, 0x21, 0x00,
+ 0xee, 0xee, 0xf0, 0x00,
+ 0xed, 0x0e, 0xee, 0xfe, 0xff, 0xfe, 0xef, 0xff, 0x0f, 0x00, 0xf0, 0xf0,
+ 0xfe, 0xee, 0xfd, 0xff,
+ 0x00, 0x10, 0xff, 0x00, 0xff, 0xf0, 0x00, 0x20, 0x0d, 0xcd, 0x00, 0x11,
+ 0x02, 0x22, 0x0f, 0xff,
+ 0x0f, 0x10, 0x1f, 0x1f, 0x10, 0x0e, 0x00, 0x1e, 0x0f, 0xff, 0x01, 0x33,
+ 0x01, 0xf0, 0x00, 0x01,
+ 0x02, 0x00, 0x00, 0x03, 0x00, 0xf0, 0xf0, 0x00, 0xe0, 0xed, 0x01, 0x01,
+ 0x01, 0x00, 0x0f, 0x02,
+ 0x12, 0x01, 0x00, 0xff, 0x00, 0x00, 0x1e, 0x0f, 0x0f, 0x21, 0x22, 0x00,
+ 0x00, 0x1e, 0x21, 0x01,
+ 0x11, 0x32, 0x13, 0x10, 0x00, 0xe0, 0x12, 0x00, 0xff, 0x00, 0x00, 0xf3,
+ 0x00, 0xee, 0x00, 0xe0,
+ 0xef, 0xf0, 0xff, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x02, 0x20, 0x2e, 0x20, 0x20, 0x20, 0x25, 0x42, 0x12, 0x31, 0x10, 0x1e,
+ 0x00, 0x0f, 0x10, 0x20,
+ 0x11, 0x00, 0x21, 0x00, 0x01, 0x03, 0x01, 0xf0, 0x12, 0x22, 0x01, 0xff,
+ 0xff, 0x00, 0x0e, 0xff,
+ 0x22, 0x0e, 0xec, 0x00, 0xfe, 0xfe, 0xff, 0x00, 0x10, 0x10, 0x0e, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0xec, 0x00, 0x33, 0xf0, 0xff, 0x01, 0x10, 0xef, 0xfd, 0x02,
+ 0xf2, 0x01, 0x01, 0x03,
+ 0x00, 0xe0, 0xf0, 0xf0, 0xee, 0xff, 0xf0, 0xf0, 0xff, 0xdd, 0xf0, 0x02,
+ 0xf1, 0x00, 0x30, 0x13,
+ 0x00, 0x10, 0x11, 0x00, 0x0f, 0x0f, 0x10, 0x10, 0x0e, 0x00, 0xf0, 0x02,
+ 0x20, 0x0e, 0x0e, 0x10,
+ 0x14, 0x00, 0x00, 0x22, 0x12, 0x00, 0x0b, 0xf0, 0xfd, 0xfe, 0x1f, 0x32,
+ 0x00, 0x10, 0x11, 0x0f,
+ 0xef, 0xe0, 0x11, 0x13, 0x01, 0x01, 0xf0, 0x01, 0xf1, 0x00, 0xf1, 0xe0,
+ 0xfd, 0x0f, 0x0f, 0x10,
+ 0x00, 0x03, 0x10, 0x0e, 0x1f, 0x22, 0x03, 0x00, 0xf0, 0x00, 0xf0, 0x12,
+ 0x01, 0xf0, 0x0e, 0xef,
+ 0x0e, 0x00, 0x20, 0x10, 0x1f, 0x30, 0x0f, 0xf0, 0x10, 0x12, 0x10, 0x12,
+ 0x01, 0xee, 0xfd, 0xef,
+ 0x00, 0x01, 0x20, 0x0e, 0xd0, 0x00, 0x04, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x02, 0x11,
+ 0x00, 0xee, 0x0f, 0x10, 0x0f, 0x20, 0x0f, 0xf0, 0x11, 0x21, 0x1f, 0x00,
+ 0xf0, 0x01, 0x01, 0x02,
+ 0x22, 0x01, 0xdf, 0x00, 0x10, 0xff, 0x00, 0xe0, 0x00, 0x02, 0x0f, 0x0e,
+ 0xdf, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x01, 0x0f, 0xee, 0xf0, 0x0e, 0x0f, 0xfe, 0xef, 0x0e, 0x00,
+ 0x02, 0x01, 0x01, 0x10,
+ 0x00, 0x01, 0x34, 0x11, 0x0f, 0xff, 0x00, 0x02, 0xf0, 0x00, 0x02, 0x00,
+ 0x03, 0x21, 0x00, 0xfe,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0xf0, 0x0e, 0x0f, 0x0f, 0xec, 0x0f, 0x2f,
+ 0x1f, 0x1e, 0x0d, 0x1e,
+ 0x20, 0x01, 0x21, 0x00, 0x0d, 0x00, 0x0f, 0x0f, 0x20, 0x01, 0x11, 0x0f,
+ 0xee, 0xef, 0x0e, 0x0f,
+ 0xf0, 0x02, 0x01, 0xf0, 0xf0, 0x01, 0x01, 0x03, 0x01, 0xff, 0xee, 0x01,
+ 0x02, 0x00, 0xc0, 0x0f,
+ 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x22, 0x11, 0x11, 0x11, 0x00, 0x33,
+ 0x01, 0x20, 0x23, 0x20,
+ 0x12, 0x01, 0x10, 0x1e, 0x00, 0xf0, 0x03, 0x22, 0x13, 0x11, 0x00, 0x00,
+ 0xf0, 0xff, 0x00, 0x10,
+ 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0xef, 0x0f, 0x00, 0x0e, 0xee, 0x0f, 0xf0,
+ 0xed, 0xf0, 0x00, 0xff,
+ 0x0f, 0xed, 0xfe, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0xf0, 0xfe,
+ 0xef, 0x00, 0x00, 0xf2,
+ 0xf0, 0x0f, 0x0d, 0x00, 0x01, 0x21, 0x00, 0x0e, 0x0f, 0x0e, 0xdb, 0x00,
+ 0x00, 0x12, 0x24, 0x00,
+ 0xf0, 0xff, 0x01, 0x02, 0x02, 0x00, 0x10, 0xef, 0xfe, 0xf1, 0xf0, 0x00,
+ 0x00, 0xe0, 0xff, 0xfe,
+ 0xf0, 0x01, 0x13, 0x12, 0x01, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x20, 0x23,
+ 0x1f, 0x0e, 0x10, 0x2e,
+ 0xff, 0x00, 0x12, 0x22, 0x33, 0x10, 0x00, 0x02, 0x01, 0xf0, 0xf0, 0x11,
+ 0x11, 0x00, 0xf0, 0xee,
+ 0xff, 0xee, 0xe0, 0x00, 0xed, 0x00, 0x01, 0x01, 0xf1, 0xf1, 0x00, 0xde,
+ 0x0f, 0x0f, 0xe0, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01, 0x31, 0x10, 0x1e, 0x21, 0x21, 0x21, 0x10, 0x21,
+ 0x21, 0x11, 0x11, 0x10,
+ 0x10, 0x12, 0x10, 0x01, 0x00, 0x00, 0xf1, 0x13, 0x22, 0x00, 0x21, 0x02,
+ 0x11, 0x01, 0x00, 0x0e,
+ 0x0d, 0xef, 0x1e, 0x10, 0x00, 0xf0, 0xff, 0xee, 0x0e, 0xff, 0xe0, 0x0e,
+ 0x00, 0x00, 0x02, 0xff,
+ 0x0e, 0x0f, 0x0f, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0xf0, 0x10, 0x00,
+ 0x01, 0xf0, 0xe0, 0x02,
+ 0x02, 0x00, 0xf0, 0xef, 0x00, 0xf0, 0xf0, 0x0f, 0xe0, 0x0f, 0xff, 0xdf,
+ 0xed, 0x00, 0x12, 0x00,
+ 0x11, 0x21, 0x02, 0x12, 0x34, 0x00, 0x00, 0x1d, 0x00, 0x10, 0x12, 0x00,
+ 0x13, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x02, 0x01, 0x31, 0x10, 0x00, 0x00, 0x20, 0x0e, 0x10, 0x20,
+ 0x1f, 0x0e, 0x0f, 0x00,
+ 0x11, 0x13, 0x00, 0x00, 0xff, 0xef, 0x12, 0x14, 0x00, 0xe0, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x10, 0x12, 0x02, 0x00, 0xe0, 0x0f, 0x02, 0x24, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x1f,
+ 0x00, 0x01, 0x11, 0x30, 0x0f, 0xee, 0x00, 0x31, 0x00, 0x10, 0x0f, 0x1e,
+ 0x0f, 0x01, 0x33, 0x00,
+ 0xee, 0xfb, 0x00, 0xf0, 0x00, 0xef, 0x00, 0xf0, 0xf0, 0xf1, 0xf0, 0xee,
+ 0xe0, 0x00, 0x14, 0x0f,
+ 0xf0, 0x1e, 0x10, 0x0f, 0x0e, 0x2f, 0x10, 0x21, 0x10, 0x10, 0x01, 0xf0,
+ 0xf0, 0x00, 0x12, 0x12,
+ 0x01, 0xf0, 0xef, 0x00, 0xf0, 0xf0, 0x1f, 0x30, 0xff, 0x0f, 0xf0, 0xff,
+ 0x00, 0x00, 0xef, 0xf0,
+ 0x01, 0x01, 0xff, 0xef, 0x02, 0x00, 0xee, 0x0e, 0xf0, 0x0e, 0xff, 0xfe,
+ 0x0f, 0xe0, 0x23, 0x11,
+ 0x0f, 0xff, 0xf0, 0x01, 0x34, 0x12, 0x22, 0x0f, 0xe0, 0x00, 0x00, 0x01,
+ 0x21, 0x01, 0x00, 0x12,
+ 0x02, 0xf0, 0xf0, 0x01, 0xf1, 0x01, 0x00, 0xef, 0x00, 0x0e, 0x00, 0x20,
+ 0x2f, 0x10, 0x0d, 0x0f,
+ 0x0d, 0x00, 0x30, 0x0f, 0x20, 0x10, 0x00, 0x00, 0x0e, 0xf0, 0x00, 0x01,
+ 0x22, 0x0e, 0xdd, 0x00,
+ 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x0f, 0xe0, 0xff, 0xf0, 0xef, 0x00,
+ 0xe0, 0xee, 0x00, 0xe1,
+ 0xe1, 0xe0, 0xff, 0xfe, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x12, 0x10, 0x22,
+ 0x0f, 0x00, 0x35, 0x21,
+ 0xf0, 0x00, 0x32, 0x12, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x03, 0x10,
+ 0x00, 0x33, 0x00, 0xef,
+ 0x0f, 0x20, 0x22, 0x0e, 0xcc, 0x10, 0x00, 0xfd, 0x0f, 0x00, 0x0f, 0xed,
+ 0xff, 0xe0, 0xed, 0xfe,
+ 0xf0, 0x00, 0x00, 0x0d, 0xef, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0xfe, 0xff,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xef, 0xfe, 0x0e, 0x10, 0x10, 0x20, 0x10, 0x10, 0x00, 0x0e, 0x10,
+ 0x0f, 0xff, 0xef, 0x21,
+ 0x03, 0x02, 0x21, 0x01, 0xf0, 0xf0, 0x11, 0x00, 0x00, 0x10, 0x03, 0x0f,
+ 0x0f, 0xf0, 0xff, 0x00,
+ 0xf0, 0xf0, 0x01, 0xf1, 0xf2, 0xf1, 0xf1, 0xff, 0xfe, 0x00, 0x12, 0x00,
+ 0x20, 0x10, 0x1e, 0x0e,
+ 0x20, 0x0f, 0x30, 0x23, 0x00, 0x0e, 0x11, 0x22, 0x01, 0x03, 0x22, 0x01,
+ 0xf2, 0x0e, 0xff, 0x0f,
+ 0x00, 0xf0, 0xf0, 0xff, 0x00, 0x01, 0xf0, 0xf1, 0xf1, 0x00, 0xe1, 0xf0,
+ 0x00, 0xe0, 0x00, 0x00,
+ 0x00, 0x02, 0x02, 0x20, 0x0f, 0x00, 0x00, 0x20, 0x40, 0x12, 0x21, 0x00,
+ 0x1f, 0x1f, 0x11, 0x34,
+ 0x11, 0x21, 0x00, 0x00, 0x10, 0x12, 0x00, 0x11, 0x00, 0x01, 0x10, 0x00,
+ 0x11, 0x22, 0x02, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f, 0xfe, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x0c, 0xde,
+ 0x00, 0x20, 0x02, 0x00,
+ 0xff, 0x00, 0x0e, 0x0d, 0xfe, 0x10, 0x00, 0x00, 0x31, 0x12, 0x00, 0xec,
+ 0xff, 0x00, 0x13, 0x00,
+ 0x0f, 0xf0, 0xc0, 0x00, 0xf1, 0xe0, 0xf1, 0x00, 0xe0, 0xeb, 0xf0, 0x01,
+ 0x00, 0xdf, 0xfe, 0x00,
+ 0x10, 0xf0, 0xee, 0x00, 0x12, 0x23, 0x00, 0x02, 0x00, 0xff, 0x00, 0x31,
+ 0x02, 0x11, 0x00, 0x10,
+ 0x0f, 0xfe, 0xff, 0x10, 0x20, 0x12, 0x12, 0x0e, 0xff, 0x10, 0x00, 0x11,
+ 0x21, 0x21, 0xfd, 0xef,
+ 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0xed, 0x0f, 0x00, 0xf0, 0x01, 0x03,
+ 0x01, 0x0f, 0x0f, 0x0f,
+ 0xf1, 0x01, 0x02, 0x0f, 0x10, 0x00, 0x13, 0xff, 0xef, 0xfe, 0x00, 0x03,
+ 0x12, 0x1f, 0x0d, 0xff,
+ 0x00, 0x00, 0x00, 0x23, 0x10, 0x23, 0x00, 0xee, 0x0e, 0x0f, 0x10, 0x20,
+ 0x00, 0x0e, 0xff, 0x00,
+ 0x11, 0x12, 0x00, 0x00, 0x0e, 0xe0, 0x01, 0x03, 0xef, 0xee, 0x01, 0x01,
+ 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x10, 0x1f, 0x00, 0x0f, 0x21, 0x00, 0x00, 0x12, 0x10, 0x10, 0x1f,
+ 0x00, 0xe1, 0x01, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x20, 0x35, 0x10, 0x00,
+ 0xf0, 0xf1, 0x02, 0xf0,
+ 0xf0, 0x0d, 0xe0, 0xfe, 0xff, 0xf0, 0xff, 0x00, 0x10, 0x0f, 0xdc, 0x00,
+ 0x0f, 0xff, 0x00, 0x11,
+ 0x00, 0xfe, 0x02, 0x22, 0x0e, 0xee, 0x01, 0x22, 0x00, 0x01, 0x33, 0x00,
+ 0xff, 0x01, 0x12, 0x10,
+ 0xf1, 0xe0, 0xf0, 0x01, 0xf1, 0x00, 0xe0, 0xf0, 0x00, 0xf0, 0x01, 0x11,
+ 0x10, 0x0d, 0x2f, 0x1d,
+ 0x0e, 0x20, 0x10, 0x22, 0x0f, 0x1e, 0x0d, 0x0e, 0xff, 0x00, 0x2f, 0x0f,
+ 0x20, 0xf0, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x02, 0xe0, 0x00, 0xdf,
+ 0xf0, 0xff, 0xef, 0xfe,
+ 0x01, 0xf1, 0xe0, 0x01, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x00, 0x0e, 0xef,
+ 0x00, 0x41, 0x01, 0x11,
+ 0x22, 0x24, 0x10, 0x00, 0x12, 0x00, 0x10, 0x23, 0x01, 0x00, 0x00, 0x11,
+ 0x01, 0x01, 0x01, 0x01,
+ 0x0f, 0x10, 0x31, 0x00, 0x01, 0x21, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x1e,
+ 0x00, 0x00, 0x00, 0xe0,
+ 0x0f, 0xec, 0xff, 0xee, 0x00, 0x01, 0x11, 0x00, 0x0e, 0xef, 0x00, 0xfd,
+ 0xed, 0xf0, 0xf0, 0x01,
+ 0x00, 0x0d, 0xe0, 0xfc, 0xee, 0xf0, 0x00, 0x10, 0x11, 0x11, 0x0e, 0xff,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xef, 0xec, 0xf0, 0x12, 0x01, 0x10, 0x01, 0x00, 0xf0, 0x0e, 0x01, 0x12,
+ 0x01, 0x11, 0x01, 0xf0,
+ 0xf0, 0x0f, 0xef, 0xf0, 0x02, 0x01, 0xff, 0xee, 0xef, 0xf0, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xab, 0x0e, 0xdf, 0x09, 0xca, 0x0f, 0x8c, 0x0a, 0x00, 0x10, 0x20, 0x10,
+ 0x00, 0x20, 0x00, 0x0f,
+ 0x11, 0x43, 0x11, 0x00, 0xde, 0x00, 0x31, 0x00, 0x00, 0x10, 0x0f, 0x10,
+ 0x12, 0xff, 0xf0, 0x02,
+ 0x00, 0x00, 0xef, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0x00, 0xff, 0xfd, 0xee,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x12, 0x30, 0x00, 0x00, 0x03, 0x10, 0x10, 0x0e, 0x00, 0x00, 0x11, 0xff,
+ 0x0d, 0x12, 0x23, 0x22,
+ 0x21, 0x01, 0x12, 0x22, 0x01, 0x10, 0x10, 0x01, 0x23, 0x00, 0x13, 0x10,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x10, 0xfc, 0xef, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x00,
+ 0xff, 0xed, 0x0e, 0x00, 0x20, 0x00, 0x10, 0x00, 0x11, 0x01, 0x01, 0xe0,
+ 0x10, 0x22, 0xe0, 0xd0,
+ 0xfe, 0xdf, 0xee, 0xf0, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xf0, 0x00, 0x00,
+ 0xff, 0xfe, 0x00, 0xf1,
+ 0x01, 0x02, 0x02, 0x22, 0xf0, 0xee, 0x02, 0x12, 0x10, 0x11, 0x21, 0x23,
+ 0x00, 0x10, 0x00, 0x20,
+ 0x01, 0x10, 0x00, 0xff, 0x00, 0x21, 0x12, 0x00, 0xff, 0x0f, 0x00, 0x21,
+ 0x11, 0x21, 0x0f, 0x00,
+ 0x00, 0x1f, 0x1f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x03, 0x10, 0x00,
+ 0x04, 0x00, 0x00, 0xee, 0x00, 0x02, 0x12, 0xf0, 0xff, 0x00, 0x00, 0xf0,
+ 0x03, 0x10, 0x00, 0x0e,
+ 0x22, 0x20, 0x00, 0x11, 0x23, 0x21, 0x0e, 0xfe, 0x0d, 0x00, 0x20, 0x1f,
+ 0x00, 0x00, 0xee, 0x00,
+ 0x12, 0x10, 0x00, 0xf0, 0xf1, 0x0f, 0xe0, 0x0e, 0xde, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x0e,
+ 0x0f, 0xff, 0x10, 0x21, 0x11, 0x00, 0x00, 0x12, 0x00, 0x10, 0x02, 0x00,
+ 0xff, 0x0e, 0xf0, 0x0f,
+ 0xf0, 0x00, 0x32, 0x12, 0x10, 0xf0, 0xf0, 0x10, 0x21, 0x02, 0x10, 0x02,
+ 0xf0, 0x0f, 0xfe, 0xcf,
+ 0x0e, 0xe0, 0xee, 0x00, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xef, 0x00, 0x10,
+ 0x00, 0xf0, 0x0e, 0xfe,
+ 0x0f, 0xf0, 0x10, 0x11, 0x00, 0x00, 0x00, 0x14, 0x10, 0x02, 0x13, 0x00,
+ 0x00, 0xf0, 0x00, 0x02,
+ 0x03, 0x13, 0x00, 0xef, 0xee, 0x0f, 0xf0, 0x00, 0x11, 0x22, 0x01, 0x0e,
+ 0x00, 0x00, 0x2e, 0x10,
+ 0x10, 0x02, 0x1f, 0x0e, 0x0d, 0x00, 0x0f, 0x10, 0x10, 0x0e, 0x0e, 0x00,
+ 0x11, 0x00, 0x10, 0x31,
+ 0x01, 0x01, 0x00, 0x0d, 0xe0, 0x00, 0xf0, 0x00, 0xff, 0xdd, 0xfd, 0xf0,
+ 0xf0, 0xe0, 0x00, 0xe0,
+ 0xf0, 0xee, 0x00, 0x01, 0xf0, 0x02, 0xf0, 0x02, 0x00, 0xdd, 0x00, 0xec,
+ 0x00, 0x02, 0x0f, 0x21,
+ 0x25, 0x00, 0x01, 0x00, 0x02, 0x03, 0x10, 0x13, 0x22, 0x11, 0xf0, 0x00,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x2e, 0x00, 0x0f, 0x11, 0x00, 0x00, 0x0c, 0x00, 0xff, 0x01, 0x21, 0xff,
+ 0xef, 0x0f, 0x00, 0xfd,
+ 0xee, 0xec, 0x00, 0xe0, 0x11, 0x00, 0x0f, 0xdd, 0x0f, 0x11, 0x01, 0xfe,
+ 0x0d, 0x01, 0xff, 0xee,
+ 0x10, 0x01, 0xfe, 0xef, 0x10, 0x0f, 0x1f, 0x01, 0x00, 0xff, 0x00, 0x10,
+ 0x00, 0xf0, 0x10, 0x00,
+ 0x0e, 0x00, 0xf0, 0x1f, 0x21, 0x11, 0x02, 0x00, 0xe0, 0x11, 0x23, 0x00,
+ 0xdf, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0xf1, 0x02, 0xf0, 0xdd, 0xe0, 0x0f, 0xff, 0xf0, 0x00, 0x00,
+ 0x11, 0x10, 0x44, 0x00,
+ 0x10, 0x10, 0x2f, 0x10, 0x0e, 0x20, 0x21, 0x11, 0xff, 0x0e, 0x10, 0x00,
+ 0x11, 0x03, 0x01, 0x01,
+ 0x01, 0x02, 0x01, 0xff, 0xef, 0xe0, 0x02, 0x12, 0x00, 0xdc, 0xee, 0xf0,
+ 0x01, 0x00, 0xf0, 0x02,
+ 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x22, 0x20, 0x00, 0x0f, 0x10, 0x10,
+ 0x00, 0x11, 0x0e, 0xec,
+ 0x10, 0x44, 0x22, 0x00, 0x14, 0x22, 0x00, 0x01, 0x21, 0x00, 0x00, 0x02,
+ 0x11, 0x10, 0x00, 0xfe,
+ 0x0f, 0xf0, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x23,
+ 0x10, 0x0d, 0x1f, 0x10,
+ 0x0c, 0xde, 0x00, 0x2f, 0x20, 0x00, 0x10, 0x00, 0x01, 0x03, 0x21, 0x00,
+ 0xfe, 0xff, 0x0e, 0xef,
+ 0x00, 0x00, 0xf0, 0x00, 0xde, 0xed, 0xfd, 0xf0, 0x00, 0xe0, 0x03, 0x11,
+ 0xf0, 0xee, 0xe0, 0xef,
+ 0xf0, 0xdd, 0x00, 0x00, 0xf1, 0x0f, 0xff, 0x00, 0x20, 0x12, 0x13, 0x01,
+ 0x10, 0x10, 0x12, 0x12,
+ 0x01, 0x00, 0x20, 0x11, 0x00, 0xfe, 0x01, 0x00, 0xfe, 0x00, 0x30, 0x00,
+ 0xee, 0x10, 0x33, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x1f,
+ 0x00, 0xf0, 0x00, 0x11,
+ 0x10, 0x11, 0x02, 0xf1, 0xf0, 0xff, 0xe0, 0x00, 0x03, 0x10, 0xfe, 0xec,
+ 0x00, 0xf0, 0x12, 0x10,
+ 0x00, 0x1f, 0x10, 0x11, 0x0f, 0x00, 0x23, 0x22, 0x00, 0x0e, 0x0f, 0x0f,
+ 0xef, 0x00, 0x13, 0x0e,
+ 0x0e, 0xef, 0x00, 0x0f, 0x01, 0x03, 0x10, 0x02, 0xf1, 0x02, 0x0e, 0xee,
+ 0x01, 0x11, 0x00, 0xfd,
+ 0x10, 0x11, 0x0f, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x10, 0x11, 0x00, 0xf0,
+ 0x01, 0x20, 0x00, 0x00,
+ 0x0f, 0xee, 0x00, 0x11, 0x12, 0x11, 0x11, 0x01, 0x12, 0x01, 0xf2, 0x01,
+ 0x12, 0x00, 0x01, 0x00,
+ 0xcd, 0xfd, 0xff, 0x00, 0x01, 0xf0, 0xed, 0x00, 0x00, 0x00, 0x0e, 0xef,
+ 0x10, 0x01, 0x00, 0x00,
+ 0xfe, 0xf0, 0xfd, 0x00, 0x00, 0x2f, 0x00, 0x0e, 0xf0, 0x00, 0x13, 0x13,
+ 0x11, 0xff, 0xe0, 0x12,
+ 0x13, 0xf0, 0xee, 0x01, 0x02, 0x00, 0x01, 0xd0, 0x0f, 0x0f, 0xf0, 0x10,
+ 0x0f, 0x0e, 0x00, 0x11,
+ 0x30, 0x00, 0x1e, 0x10, 0x10, 0x10, 0x0e, 0x0d, 0x0f, 0x0e, 0x20, 0x11,
+ 0x10, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x10, 0x21, 0x01, 0x00, 0xf1, 0x0f, 0xf0, 0xfe, 0xf0, 0xfe,
+ 0xde, 0xf0, 0x01, 0x01,
+ 0xe0, 0xff, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0x12, 0x11, 0x00, 0x00, 0x0e,
+ 0xef, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x21, 0x02, 0xf0, 0x12, 0x12, 0x00, 0x13, 0x34, 0x01, 0x01,
+ 0x11, 0x01, 0x0f, 0x0f,
+ 0x1f, 0x1f, 0x0f, 0x00, 0x22, 0x00, 0x00, 0x00, 0x12, 0x0f, 0x0f, 0x00,
+ 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0x00, 0x0f, 0xef, 0xfd, 0x00, 0x0f, 0x0f, 0xff, 0xf0, 0xff,
+ 0x21, 0x10, 0xff, 0xed,
+ 0xff, 0xff, 0x0f, 0xf0, 0x00, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0xe0, 0xfd,
+ 0xff, 0x00, 0xed, 0x00,
+ 0x02, 0x01, 0x11, 0x00, 0x0f, 0xed, 0x10, 0x0f, 0x00, 0x00, 0x11, 0x12,
+ 0xf0, 0x01, 0x02, 0x01,
+ 0x00, 0xe0, 0x00, 0xe0, 0x01, 0xe0, 0x01, 0x00, 0xef, 0xde, 0x00, 0x01,
+ 0x0f, 0x0f, 0x00, 0x01,
+ 0x31, 0x22, 0x21, 0x00, 0x20, 0x0e, 0xff, 0x20, 0x01, 0x00, 0x10, 0x0d,
+ 0xee, 0x10, 0x11, 0x15,
+ 0x20, 0x01, 0xd0, 0x0e, 0x00, 0xe0, 0x00, 0x02, 0x10, 0xf0, 0xee, 0x0f,
+ 0xee, 0xf0, 0xfe, 0x00,
+ 0x0f, 0xf0, 0x00, 0x10, 0x02, 0x00, 0x11, 0x01, 0x00, 0x20, 0x00, 0xef,
+ 0x00, 0xff, 0x00, 0x01,
+ 0x21, 0x00, 0x0f, 0x00, 0x10, 0x35, 0x10, 0x12, 0x20, 0x12, 0x10, 0x11,
+ 0x13, 0x13, 0x01, 0x00,
+ 0x01, 0xff, 0xff, 0x0e, 0x01, 0x13, 0x11, 0x0f, 0x11, 0x00, 0xfe, 0x0e,
+ 0x00, 0x0e, 0x30, 0x11,
+ 0x10, 0x0e, 0xfd, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x01, 0x02, 0x00,
+ 0x12, 0x1f, 0x0f, 0x0f,
+ 0xff, 0xfe, 0xfe, 0x01, 0x22, 0x00, 0xec, 0xe0, 0x0f, 0x00, 0xd1, 0x01,
+ 0xf0, 0xef, 0xde, 0x00,
+ 0x01, 0xe0, 0xf0, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x10, 0x01, 0x21, 0x02,
+ 0x21, 0x02, 0x11, 0x02,
+ 0x01, 0x01, 0x02, 0x20, 0x00, 0x10, 0x0f, 0x31, 0xf1, 0xff, 0x00, 0x01,
+ 0x20, 0x00, 0x0f, 0x20,
+ 0x02, 0x00, 0x11, 0x21, 0x10, 0x00, 0x00, 0x0e, 0x0f, 0x10, 0x10, 0x00,
+ 0x00, 0x0f, 0xfe, 0x00,
+ 0x13, 0x01, 0x02, 0x00, 0xfe, 0x03, 0x04, 0x0f, 0xef, 0x0e, 0xf1, 0x02,
+ 0x11, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x10, 0x23, 0x23, 0x00, 0x10, 0x10, 0x10, 0x00,
+ 0x00, 0x10, 0x0d, 0xf0,
+ 0x0f, 0x00, 0x20, 0xee, 0x0f, 0x01, 0x00, 0xff, 0xf0, 0x00, 0x11, 0x01,
+ 0x00, 0xe0, 0x0e, 0x0f,
+ 0xfe, 0x00, 0x0f, 0x00, 0x0f, 0xde, 0x0e, 0x00, 0x11, 0x00, 0x00, 0x01,
+ 0x02, 0x00, 0x1f, 0x0f,
+ 0x00, 0x40, 0x02, 0x01, 0x10, 0x01, 0x11, 0xff, 0x01, 0x22, 0x01, 0xe0,
+ 0x12, 0x10, 0x00, 0xf1,
+ 0x00, 0xf0, 0x00, 0xfe, 0xf0, 0x00, 0x10, 0xef, 0xfe, 0x00, 0xf1, 0xff,
+ 0x00, 0x0e, 0xef, 0xff,
+ 0x00, 0xfe, 0xf0, 0x00, 0x0e, 0xfe, 0xfe, 0x00, 0x22, 0x11, 0x00, 0x00,
+ 0xf0, 0x00, 0x11, 0x02,
+ 0xf1, 0x04, 0x23, 0x00, 0x00, 0xde, 0x00, 0x01, 0x11, 0xf1, 0x00, 0xe0,
+ 0x00, 0x31, 0xf0, 0xee,
+ 0x00, 0x00, 0x10, 0x11, 0x00, 0x2f, 0x00, 0x01, 0x20, 0x00, 0x2e, 0x0e,
+ 0x00, 0x20, 0x00, 0x21,
+ 0x00, 0x1f, 0x0f, 0x1f, 0x00, 0x00, 0x11, 0x01, 0x00, 0x0d, 0xdf, 0x00,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0xe0, 0xf0, 0xed, 0xef, 0xff, 0xef, 0x01, 0x00, 0xfe, 0xf0, 0x00, 0x00,
+ 0xdf, 0x00, 0x00, 0x0f,
+ 0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x02, 0x04, 0x10, 0x01, 0x01, 0xf0, 0x02,
+ 0x23, 0x23, 0x11, 0x00,
+ 0x1e, 0x20, 0x00, 0x01, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x10,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x0c, 0x00, 0x10, 0x0e, 0x0f, 0x00, 0xff, 0x0e, 0xff, 0xff, 0xf0, 0x00,
+ 0x00, 0xff, 0xfe, 0x00,
+ 0x23, 0x00, 0xed, 0xee, 0x0f, 0x10, 0x00, 0x0d, 0xfe, 0xf0, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xf0,
+ 0xff, 0xee, 0x00, 0x01, 0x22, 0x00, 0x0e, 0x2f, 0x0f, 0x00, 0x2f, 0x00,
+ 0x12, 0x11, 0xf0, 0xe1,
+ 0x01, 0x01, 0xe0, 0x02, 0x02, 0xf0, 0xef, 0xef, 0xff, 0xf1, 0x00, 0x00,
+ 0xf0, 0x10, 0x1f, 0x00,
+ 0x01, 0x20, 0x00, 0x10, 0x2f, 0x10, 0x00, 0x11, 0x10, 0x10, 0x00, 0x10,
+ 0x0f, 0x00, 0x10, 0x11,
+ 0x10, 0x00, 0x02, 0x01, 0xf0, 0xff, 0x00, 0x03, 0x00, 0xf0, 0x00, 0x00,
+ 0x02, 0xef, 0x0f, 0x0f,
+ 0xf0, 0xf0, 0x01, 0x11, 0xf0, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x11, 0x01, 0x11, 0x0f,
+ 0x0e, 0x00, 0x0f, 0x20, 0x21, 0x00, 0x10, 0x23, 0x21, 0x00, 0xf0, 0x02,
+ 0x32, 0x03, 0x02, 0x00,
+ 0x13, 0x00, 0xf0, 0x00, 0x0f, 0x0e, 0x00, 0x13, 0x0f, 0xfd, 0x00, 0x22,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x20, 0x10, 0x12, 0x10, 0x00, 0x1f, 0x20, 0x0f, 0x0f, 0x00, 0x0e, 0x0f,
+ 0x22, 0x11, 0xff, 0xfd,
+ 0x0f, 0x20, 0x12, 0x00, 0xef, 0xfe, 0x0f, 0x01, 0xe0, 0x0f, 0x0f, 0x0e,
+ 0xef, 0xdf, 0x0f, 0xdf,
+ 0xed, 0xf1, 0xe0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x24,
+ 0x01, 0x01, 0xff, 0x00, 0x13, 0x00, 0x11, 0x10, 0x01, 0x02, 0x10, 0x12,
+ 0x00, 0xfd, 0x00, 0x00,
+ 0x10, 0x00, 0x10, 0x12, 0x10, 0x00, 0x0e, 0x0f, 0x0f, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x02, 0x12,
+ 0x00, 0xfd, 0xdf, 0x0f, 0x00, 0xf0, 0xf0, 0x01, 0x13, 0x10, 0x0e, 0xde,
+ 0x0f, 0xff, 0x01, 0x22,
+ 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xf0, 0x23, 0x12, 0x10, 0x11, 0x0e, 0xfe,
+ 0x00, 0x10, 0x11, 0x11,
+ 0x00, 0xfd, 0xf0, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x01, 0x01, 0x00, 0xee,
+ 0x12, 0x12, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x12, 0xf0, 0xfe, 0x0f, 0xed, 0xff, 0xfe,
+ 0x00, 0x11, 0x12, 0x20,
+ 0x0f, 0x1f, 0x00, 0x00, 0x22, 0x32, 0x00, 0x00, 0x02, 0xf0, 0xff, 0x00,
+ 0x13, 0x24, 0x00, 0xde,
+ 0x00, 0xf0, 0x02, 0x31, 0xe0, 0x00, 0x0f, 0x00, 0x01, 0x01, 0xfe, 0xf0,
+ 0x01, 0x0f, 0xdb, 0xf0,
+ 0x00, 0x00, 0x01, 0xef, 0x0e, 0xef, 0x0e, 0x0e, 0xff, 0x10, 0x10, 0x01,
+ 0x20, 0x00, 0x00, 0xf0,
+ 0xff, 0x00, 0x01, 0xf2, 0x01, 0x03, 0x00, 0xee, 0xf0, 0x01, 0x02, 0xf0,
+ 0x0e, 0x01, 0x00, 0x0f,
+ 0x00, 0xf0, 0x0e, 0x00, 0x10, 0x20, 0x00, 0xfe, 0x00, 0x20, 0x00, 0x30,
+ 0x21, 0x0f, 0xff, 0x10,
+ 0x20, 0x11, 0x00, 0x1f, 0x0f, 0x1f, 0x00, 0x1f, 0x10, 0x11, 0x00, 0xf1,
+ 0x01, 0x10, 0xef, 0xf0,
+ 0x00, 0x00, 0x00, 0xe0, 0xee, 0xdc, 0x00, 0x02, 0x11, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0xe0, 0x00, 0x01, 0xf3, 0x00, 0xe0, 0x0e, 0x00, 0xf2, 0x0f,
+ 0x01, 0x33, 0x01, 0x22,
+ 0x22, 0x00, 0x01, 0x20, 0x12, 0x12, 0x00, 0xf0, 0x10, 0x0f, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x20,
+ 0x22, 0x01, 0x10, 0x01, 0x10, 0x00, 0x00, 0xfe, 0x0f, 0x11, 0x00, 0xef,
+ 0x0d, 0x00, 0x01, 0x0f,
+ 0x0d, 0x00, 0x01, 0x00, 0xff, 0xfd, 0xfe, 0xfe, 0xfe, 0x00, 0x10, 0xe0,
+ 0x00, 0x00, 0xdd, 0xee,
+ 0xf0, 0x00, 0xee, 0xff, 0x00, 0x0f, 0x10, 0x0e, 0xff, 0x01, 0x10, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1,
+ 0x03, 0x00, 0xf0, 0xdf, 0x01, 0xe0, 0xf0, 0xf0, 0x01, 0xe1, 0x01, 0xf0,
+ 0x0f, 0x00, 0x12, 0x11,
+ 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x1f, 0x0f, 0x00, 0x11, 0x21, 0x00, 0xff,
+ 0x0e, 0x00, 0x11, 0x01,
+ 0x02, 0x20, 0x00, 0x00, 0xf1, 0x00, 0xfe, 0x0f, 0x0f, 0x1f, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0xf1,
+ 0x01, 0xee, 0xfe, 0xf0, 0x00, 0xf2, 0x00, 0xe0, 0x00, 0x10, 0x01, 0x00,
+ 0xfe, 0x0e, 0x00, 0x20,
+ 0x12, 0x1f, 0x0f, 0x0f, 0x00, 0x13, 0x22, 0x01, 0x01, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0x13, 0x21,
+ 0x01, 0x11, 0x01, 0x00, 0x01, 0x02, 0x31, 0x13, 0x0f, 0xef, 0x0f, 0x00,
+ 0xee, 0x11, 0x23, 0x0f,
+ 0xfc, 0x0f, 0x10, 0x1f, 0x21, 0x00, 0x21, 0x00, 0x0d, 0x0f, 0x11, 0x11,
+ 0x0f, 0xf0, 0x10, 0x00,
+ 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0f, 0xed, 0x00, 0x02, 0x11,
+ 0x00, 0xee, 0xee, 0xe0,
+ 0xf0, 0xef, 0xdf, 0x0f, 0xdf, 0xf0, 0xff, 0x00, 0x00, 0x02, 0x01, 0x10,
+ 0x0f, 0x10, 0x01, 0x0f,
+ 0x00, 0x00, 0x03, 0x01, 0x01, 0x13, 0x0e, 0xe1, 0x00, 0x00, 0x03, 0x12,
+ 0x31, 0x02, 0x21, 0x00,
+ 0xfe, 0x00, 0x20, 0x31, 0x0f, 0x0f, 0x10, 0x00, 0x10, 0x22, 0x00, 0xed,
+ 0x12, 0x21, 0xf0, 0xff,
+ 0x02, 0x32, 0x01, 0xfd, 0xff, 0x00, 0xf1, 0xff, 0xf0, 0x00, 0x10, 0x11,
+ 0x01, 0x00, 0x00, 0x10,
+ 0x13, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x34, 0x11,
+ 0xf0, 0x0e, 0x0f, 0x0f,
+ 0x1f, 0x21, 0x22, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x10, 0x10, 0xf0, 0xff,
+ 0xfe, 0xff, 0x00, 0x0e,
+ 0xf0, 0x02, 0x0f, 0x00, 0xff, 0x00, 0x12, 0xff, 0x0f, 0x0e, 0xee, 0xff,
+ 0x0f, 0x00, 0xf0, 0x0e,
+ 0xff, 0x10, 0x11, 0x00, 0x10, 0x22, 0x23, 0x00, 0x12, 0x00, 0x21, 0xf1,
+ 0xff, 0xff, 0x00, 0x01,
+ 0x33, 0x00, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x10, 0x12, 0x00, 0xf0, 0x11,
+ 0x00, 0xdd, 0x11, 0x00,
+ 0xdb, 0x00, 0xfe, 0xe0, 0x00, 0x0e, 0xdc, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x0e, 0x00, 0x22, 0x01,
+ 0x00, 0x00, 0x11, 0xf0, 0xef, 0x00, 0x01, 0xf0, 0xe3, 0x01, 0xff, 0xf0,
+ 0x02, 0x10, 0x11, 0x03,
+ 0x00, 0x00, 0xf0, 0x00, 0x11, 0x0f, 0x0f, 0x10, 0x00, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3b, 0x17, 0x17, 0x1a, 0x23, 0x17, 0x83, 0x19, 0x00, 0x1f, 0x10, 0x10,
+ 0x10, 0x11, 0x21, 0x00,
+ 0x0e, 0x10, 0x10, 0x00, 0x1f, 0x00, 0x23, 0x0f, 0xee, 0x0f, 0x00, 0x10,
+ 0x00, 0xf1, 0xfe, 0xfe,
+ 0xfe, 0x00, 0xff, 0xee, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x02, 0x00,
+ 0xfe, 0xdf, 0xff, 0x0f,
+ 0xff, 0xef, 0x13, 0x04, 0xf0, 0xee, 0xf0, 0xf0, 0xf0, 0x00, 0x12, 0x01,
+ 0x01, 0x02, 0x00, 0x02,
+ 0x10, 0x12, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0e, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x10, 0x01, 0x0f, 0x0f, 0x20, 0x0e, 0x00, 0x01, 0x22, 0x00, 0xfc, 0x00,
+ 0x0f, 0x0d, 0xef, 0xff,
+ 0x10, 0x12, 0x00, 0xff, 0xef, 0xfd, 0x0e, 0x02, 0x01, 0x00, 0xf0, 0xee,
+ 0x0f, 0x0e, 0xf0, 0xf0,
+ 0xf0, 0xfe, 0x0f, 0x0f, 0x0e, 0x0f, 0x01, 0x21, 0x12, 0x00, 0x00, 0x20,
+ 0x01, 0xe0, 0x00, 0x0f,
+ 0xf0, 0xf1, 0xef, 0x00, 0xe1, 0xf2, 0xf0, 0xe0, 0x01, 0xff, 0xf0, 0x10,
+ 0x21, 0x12, 0x11, 0x00,
+ 0x1e, 0x10, 0x1f, 0xfd, 0x0f, 0xff, 0x20, 0x13, 0x00, 0x11, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x20,
+ 0x10, 0x01, 0x0f, 0x0f, 0x0f, 0x21, 0x0f, 0x10, 0x0f, 0xf1, 0xf0, 0x00,
+ 0x03, 0x03, 0x00, 0xe1,
+ 0x01, 0xf0, 0xdf, 0xf0, 0x00, 0x01, 0x10, 0xfd, 0x00, 0x22, 0x01, 0x10,
+ 0x0e, 0x00, 0x10, 0x13,
+ 0x0f, 0x0f, 0x31, 0x03, 0x11, 0x34, 0xff, 0xff, 0xf0, 0x00, 0x11, 0x00,
+ 0x11, 0x10, 0x01, 0x01,
+ 0x12, 0x02, 0x01, 0x11, 0x12, 0x0f, 0xf0, 0x11, 0x00, 0xf0, 0x00, 0x0e,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x1f, 0x11, 0x22, 0x00, 0x0d, 0x21, 0x24, 0x00, 0x0e, 0x0e,
+ 0x00, 0x40, 0x00, 0xfe,
+ 0x0f, 0x0d, 0x10, 0x34, 0x00, 0xfe, 0x01, 0x10, 0xf0, 0xfd, 0xf0, 0x0f,
+ 0xff, 0xee, 0xff, 0xe0,
+ 0xed, 0xed, 0xef, 0xed, 0x0f, 0xf0, 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x00, 0xde, 0x01,
+ 0x12, 0x01, 0x00, 0xff, 0xef, 0x00, 0x04, 0x21, 0xf0, 0xf0, 0x01, 0x23,
+ 0x21, 0x21, 0x00, 0x00,
+ 0x1f, 0x20, 0x00, 0x21, 0x00, 0xf0, 0x00, 0x0e, 0x0f, 0x00, 0x22, 0x02,
+ 0x01, 0xf0, 0xfe, 0x01,
+ 0x01, 0x00, 0xfd, 0xf0, 0x01, 0x00, 0xee, 0x0f, 0xff, 0x00, 0x1f, 0x00,
+ 0x02, 0x32, 0xfe, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x20, 0x0f, 0xff, 0x00, 0x11,
+ 0x20, 0x00, 0x0f, 0x0f,
+ 0x22, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x03, 0x10, 0xf1,
+ 0xe0, 0xfd, 0x00, 0x00,
+ 0xef, 0x01, 0x24, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0xff, 0x10, 0x0e, 0x0e,
+ 0xf0, 0x0e, 0xfe, 0x10,
+ 0x02, 0x20, 0x22, 0x00, 0x0f, 0x00, 0x0f, 0x01, 0x12, 0x34, 0x01, 0xee,
+ 0xfe, 0x01, 0x01, 0x24,
+ 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0xfe,
+ 0xf0, 0x0f, 0x0f, 0x0f,
+ 0xef, 0xff, 0xee, 0x0e, 0xf0, 0xfe, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x10,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x0f, 0xfe, 0x00, 0xef, 0xf0, 0xe0, 0x01, 0x12, 0xf1, 0x01, 0xe0,
+ 0x00, 0xf0, 0x02, 0x10,
+ 0x00, 0xff, 0x00, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x0e, 0x10, 0x00, 0x0f,
+ 0x0f, 0x02, 0x54, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x1f, 0x10, 0x21, 0x10, 0x10, 0x00, 0x0f, 0xff,
+ 0x10, 0x20, 0x00, 0xf0,
+ 0xf0, 0xf0, 0xff, 0x00, 0xe1, 0x00, 0x10, 0xf0, 0xfd, 0xff, 0x01, 0x21,
+ 0x00, 0xe0, 0x0f, 0x1f,
+ 0xf0, 0xef, 0x01, 0x01, 0x00, 0xf0, 0x03, 0xe0, 0x0e, 0x00, 0xe1, 0x01,
+ 0x44, 0x00, 0xee, 0x00,
+ 0x10, 0x11, 0x01, 0x12, 0x22, 0x11, 0x00, 0x12, 0x00, 0xf1, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0xff,
+ 0xf0, 0x23, 0x20, 0x00, 0x10, 0x11, 0x00, 0x1f, 0x10, 0x22, 0x11, 0x00,
+ 0xff, 0xed, 0x0f, 0x10,
+ 0x10, 0xed, 0x0f, 0x00, 0xfe, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0xdd, 0x00, 0xfe, 0xed,
+ 0x0f, 0xfd, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0xfe, 0xed, 0x0f, 0x11, 0x22,
+ 0x00, 0xf2, 0xf0, 0xe0,
+ 0x01, 0xf0, 0xed, 0xe0, 0x00, 0xef, 0xe0, 0x01, 0x01, 0xf2, 0x00, 0x00,
+ 0x01, 0x01, 0x20, 0x10,
+ 0x00, 0x00, 0x00, 0x30, 0xf0, 0xf0, 0x00, 0x0f, 0xfe, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x21, 0x10,
+ 0x00, 0x10, 0x20, 0x00, 0xfe, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0xf2, 0xf0, 0x00, 0x00,
+ 0x00, 0xe0, 0xfe, 0x00, 0x00, 0xf0, 0x01, 0x11, 0xfe, 0xfe, 0x0f, 0x10,
+ 0x12, 0x11, 0x00, 0x0e,
+ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0x01,
+ 0x12, 0x01, 0x00, 0xf0,
+ 0x01, 0x03, 0x13, 0x22, 0x01, 0xfe, 0x00, 0x01, 0x12, 0x21, 0x01, 0xe0,
+ 0x0f, 0x1f, 0xfd, 0xfe,
+ 0x00, 0x22, 0x01, 0x00, 0x1f, 0x10, 0x01, 0x1f, 0x0e, 0x00, 0x20, 0x10,
+ 0x11, 0x10, 0x1f, 0x10,
+ 0x20, 0x00, 0x1f, 0x0e, 0xff, 0x00, 0x01, 0x23, 0xf0, 0x01, 0xf0, 0xed,
+ 0xff, 0x0e, 0xe0, 0x00,
+ 0x0f, 0xee, 0x00, 0x0f, 0xde, 0x0f, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0xf0,
+ 0x00, 0x0f, 0xf2, 0x02,
+ 0x20, 0x01, 0xce, 0x0f, 0x01, 0x00, 0xe1, 0x00, 0x11, 0x01, 0xf1, 0x02,
+ 0x11, 0x01, 0x01, 0x42,
+ 0x10, 0x00, 0x10, 0x20, 0x20, 0x12, 0x00, 0x21, 0xfe, 0xff, 0x00, 0x00,
+ 0x11, 0x01, 0x11, 0x00,
+ 0xf1, 0x00, 0x0e, 0x00, 0x12, 0x12, 0x10, 0x0f, 0x0e, 0xef, 0x00, 0x10,
+ 0x00, 0x11, 0x02, 0x23,
+ 0x0f, 0xdf, 0xff, 0x00, 0xe0, 0x0e, 0x00, 0x02, 0x00, 0x10, 0x1f, 0x0e,
+ 0x22, 0x23, 0x1f, 0x20,
+ 0x00, 0xfe, 0x00, 0x34, 0x11, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x00, 0x0f,
+ 0x01, 0x01, 0x00, 0xfe,
+ 0x00, 0xd0, 0x0f, 0x20, 0xf1, 0x00, 0xff, 0xee, 0x00, 0x00, 0x00, 0x1f,
+ 0x10, 0x0f, 0xee, 0xfe,
+ 0x0f, 0xf0, 0x00, 0x10, 0x10, 0x11, 0x11, 0x01, 0x01, 0xf0, 0x00, 0x11,
+ 0x11, 0x01, 0x10, 0x02,
+ 0x11, 0x13, 0x21, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x24, 0x11, 0x00, 0xff,
+ 0x00, 0x1e, 0x00, 0xf1,
+ 0x0f, 0xed, 0xfe, 0x00, 0x0e, 0x0f, 0xe0, 0xf0, 0xed, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xee,
+ 0x00, 0x10, 0x10, 0x01, 0x01, 0xf0, 0xf0, 0xf1, 0xe0, 0xfe, 0xf0, 0x05,
+ 0x10, 0xe0, 0x01, 0x02,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x11, 0x00, 0x22, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x10, 0x11, 0x11, 0x11, 0x10, 0x21, 0x10, 0x1f, 0x0e, 0x10, 0x10, 0x01,
+ 0x10, 0x00, 0xff, 0x0e,
+ 0x00, 0x01, 0xf0, 0x00, 0xed, 0x0e, 0xef, 0x0f, 0x10, 0x0e, 0x10, 0xfd,
+ 0x01, 0x00, 0xf0, 0xef,
+ 0xfd, 0xdf, 0x00, 0xe0, 0x00, 0xf2, 0xff, 0xf0, 0xef, 0x00, 0xf0, 0xf0,
+ 0xff, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0xe0, 0x00, 0x13, 0x00, 0x01, 0x04, 0x20, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x0f,
+ 0x1f, 0x10, 0x10, 0x00, 0x01, 0x1f, 0x1e, 0x11, 0x13, 0x10, 0x0f, 0xfe,
+ 0x00, 0x20, 0xff, 0xfe,
+ 0x10, 0x32, 0x0f, 0xee, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0xfc,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0xdd, 0x10, 0x0e, 0x0e, 0xfd, 0x0e, 0x00, 0x12, 0x00, 0x12, 0x00, 0xee,
+ 0x0f, 0x01, 0x02, 0xf0,
+ 0xe0, 0x00, 0xfe, 0xf0, 0xf0, 0x01, 0x00, 0xff, 0x00, 0xde, 0x00, 0x01,
+ 0xf0, 0x01, 0x01, 0x12,
+ 0x00, 0x10, 0xf0, 0x00, 0x01, 0x10, 0x0f, 0x20, 0x00, 0x00, 0x10, 0x00,
+ 0xfe, 0xfe, 0x10, 0x12,
+ 0x10, 0x10, 0x10, 0x00, 0x00, 0x21, 0x23, 0x00, 0x0f, 0x0f, 0xf0, 0x0f,
+ 0x00, 0x02, 0x01, 0x00,
+ 0x00, 0xef, 0xf0, 0x01, 0xf2, 0x00, 0xf0, 0xe0, 0x10, 0x00, 0xf0, 0x0f,
+ 0x00, 0x10, 0x11, 0x22,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x23, 0x0f, 0x0f, 0x00, 0x23, 0x02, 0x10,
+ 0x00, 0x22, 0x01, 0x0f,
+ 0x00, 0x14, 0x00, 0x0e, 0xf2, 0x23, 0x00, 0xff, 0xff, 0x00, 0x03, 0x0f,
+ 0x00, 0x02, 0x13, 0x00,
+ 0x0e, 0x00, 0x0f, 0x00, 0x02, 0x10, 0x00, 0x0f, 0x01, 0x11, 0x10, 0x1e,
+ 0x10, 0x20, 0x11, 0x20,
+ 0x10, 0x20, 0x10, 0x20, 0x21, 0x10, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0xfe, 0x10,
+ 0x00, 0xef, 0x1e, 0xfe, 0xed, 0x00, 0x0f, 0xdd, 0x00, 0x00, 0xf0, 0xf0,
+ 0xee, 0xf0, 0xef, 0xf0,
+ 0xf0, 0xf1, 0x01, 0x01, 0x00, 0xdf, 0xf0, 0x01, 0x00, 0xef, 0x00, 0x00,
+ 0x23, 0x01, 0x01, 0xf1,
+ 0x00, 0x10, 0x33, 0x11, 0x21, 0x01, 0x21, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x0f, 0xf0, 0xf2, 0x00,
+ 0x01, 0xef, 0x10, 0x10, 0xf0, 0xfd, 0x01, 0x01, 0x10, 0x10, 0x00, 0xff,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0xef, 0x0f, 0x00, 0x0c, 0xff, 0x00, 0x01,
+ 0x32, 0x10, 0x0e, 0x20,
+ 0x35, 0x00, 0x0f, 0x0f, 0x01, 0x02, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0xf1,
+ 0x01, 0x12, 0x00, 0xf0,
+ 0x0f, 0xf2, 0x02, 0x02, 0x0f, 0xef, 0x01, 0x10, 0x00, 0xef, 0x10, 0x10,
+ 0xfe, 0x0e, 0x00, 0x10,
+ 0x12, 0x0f, 0x00, 0x0f, 0x0f, 0xfd, 0xee, 0x20, 0x11, 0x12, 0x02, 0x00,
+ 0x0f, 0xf0, 0x00, 0x03,
+ 0x21, 0x12, 0x0f, 0xff, 0x01, 0x31, 0x01, 0x00, 0x02, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x0e, 0x00, 0xe0, 0x00, 0x0f, 0xdd, 0x0f, 0x00, 0x10, 0xfd,
+ 0xfe, 0x0f, 0x00, 0x22,
+ 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x01, 0xe2, 0x00, 0xf0, 0xfd, 0xe0,
+ 0xfe, 0x00, 0xf1, 0xe0,
+ 0x0f, 0x00, 0x00, 0xef, 0x00, 0x22, 0x00, 0x11, 0x01, 0x00, 0x0d, 0x00,
+ 0x00, 0xf0, 0x11, 0x11,
+ 0x0f, 0xff, 0x10, 0x00, 0x31, 0x00, 0x21, 0x21, 0x1f, 0x10, 0x22, 0x01,
+ 0x10, 0x01, 0x10, 0x0f,
+ 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x22, 0x00, 0xfe, 0xfe, 0xff, 0x0f, 0x00,
+ 0x03, 0x21, 0x00, 0xfe,
+ 0x00, 0xf0, 0xfe, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xef, 0x11,
+ 0x11, 0x11, 0x00, 0xf0,
+ 0x00, 0xf1, 0xf1, 0x02, 0x10, 0x0f, 0xe0, 0x01, 0x00, 0x01, 0xe1, 0x01,
+ 0x21, 0x00, 0x00, 0x0f,
+ 0x00, 0x14, 0x00, 0x33, 0x10, 0x00, 0xf0, 0x0f, 0x1f, 0x20, 0x12, 0x11,
+ 0x00, 0xec, 0x00, 0x00,
+ 0x12, 0x32, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x10, 0x01, 0x00, 0xf0, 0x00,
+ 0x0d, 0xf0, 0x0e, 0x0f,
+ 0x1f, 0x0d, 0xef, 0x1f, 0x1e, 0x00, 0x0f, 0xf0, 0x00, 0xef, 0xff, 0x0f,
+ 0x01, 0xef, 0xee, 0xf0,
+ 0x00, 0xff, 0xf0, 0xff, 0xf0, 0xfe, 0xe0, 0x00, 0x02, 0x00, 0x00, 0xf0,
+ 0x01, 0xe1, 0x00, 0xff,
+ 0xf1, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x01, 0x1f, 0x1f, 0x00, 0x2f,
+ 0x00, 0xf0, 0x12, 0x00,
+ 0x0d, 0x00, 0xff, 0x0f, 0x01, 0x43, 0x00, 0xff, 0x0f, 0x0f, 0x1f, 0x0f,
+ 0xff, 0x00, 0x11, 0x00,
+ 0xf1, 0x02, 0x00, 0x00, 0xee, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xff,
+ 0x00, 0x11, 0x0f, 0x0f,
+ 0x0f, 0x10, 0x00, 0x03, 0x21, 0xf0, 0xff, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x03, 0x00, 0x10, 0x32,
+ 0x02, 0xf0, 0x01, 0x33, 0x02, 0xe0, 0xf0, 0x02, 0x22, 0xf0, 0xef, 0x02,
+ 0x01, 0x10, 0xff, 0x0f,
+ 0x01, 0x00, 0xf1, 0x00, 0x2f, 0x11, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x0f,
+ 0x20, 0x0e, 0x00, 0x30,
+ 0x22, 0x33, 0x0f, 0x0f, 0x10, 0x20, 0x0f, 0x11, 0x22, 0x00, 0xf0, 0x0e,
+ 0xfe, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x0e, 0x00, 0xee, 0x0f, 0x01, 0x01, 0x0f, 0x0f, 0xef,
+ 0xef, 0x00, 0xfe, 0xe0,
+ 0xff, 0x00, 0xf0, 0xd0, 0x00, 0x02, 0x01, 0xf0, 0xf0, 0x00, 0x00, 0xf0,
+ 0xf0, 0x00, 0x12, 0x02,
+ 0x11, 0xf0, 0x0f, 0x00, 0x02, 0x32, 0x10, 0x11, 0x21, 0x01, 0x20, 0x01,
+ 0x01, 0x20, 0x01, 0x0f,
+ 0xff, 0x00, 0x01, 0x10, 0x12, 0x01, 0x10, 0x00, 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x12, 0x00, 0x00,
+ 0xff, 0x00, 0x02, 0x0f, 0xcd, 0x00, 0x10, 0x00, 0xee, 0x0f, 0x00, 0x0e,
+ 0x10, 0x24, 0x10, 0x21,
+ 0x0f, 0x0e, 0x01, 0x31, 0x02, 0x21, 0x10, 0x01, 0xfd, 0xfe, 0x00, 0x00,
+ 0x12, 0x10, 0x00, 0x21,
+ 0x01, 0xe0, 0x00, 0x23, 0x00, 0x00, 0xd0, 0x0e, 0x00, 0x00, 0xee, 0xf0,
+ 0x0f, 0x0e, 0xed, 0x00,
+ 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x30, 0x01, 0xef, 0x0f, 0x10, 0x00, 0xf2,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x23, 0x20, 0x01, 0x00, 0x13, 0x00, 0x20, 0x01, 0x00,
+ 0x11, 0x01, 0x01, 0xff,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xfd, 0xf0, 0x00, 0x00, 0xfd, 0x00,
+ 0x0e, 0x0f, 0x00, 0xff,
+ 0xfe, 0x00, 0x02, 0x00, 0xed, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0xed,
+ 0xff, 0xf0, 0xe0, 0x00,
+ 0x02, 0x01, 0xf0, 0xff, 0x01, 0xf0, 0xf0, 0x00, 0x01, 0x33, 0x10, 0x00,
+ 0xf0, 0x0e, 0x00, 0x02,
+ 0x0f, 0x0f, 0x00, 0x12, 0x23, 0x0f, 0xff, 0x01, 0x21, 0x10, 0x00, 0x10,
+ 0x10, 0x22, 0x0f, 0xf0,
+ 0x00, 0x30, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xed,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x0f, 0xee, 0xf0, 0x0e, 0xe0, 0x0f, 0xf0, 0x00, 0xde, 0xf0, 0xf0,
+ 0xf0, 0xfe, 0x10, 0x01,
+ 0x00, 0xed, 0x00, 0xe0, 0x03, 0x12, 0x00, 0xf2, 0xf0, 0xff, 0xe0, 0x01,
+ 0xf2, 0x01, 0x02, 0x0f,
+ 0x0f, 0x00, 0x11, 0x33, 0xfe, 0x00, 0x40, 0x02, 0x0e, 0x10, 0x30, 0xe0,
+ 0x0f, 0x00, 0x11, 0x0f,
+ 0xde, 0x10, 0x01, 0x11, 0x11, 0x11, 0x00, 0xff, 0x11, 0x11, 0x0f, 0x0c,
+ 0x0f, 0xff, 0x00, 0x10,
+ 0x0f, 0x0f, 0x0e, 0x01, 0x01, 0x0e, 0xfe, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x0f, 0x0e, 0xe0, 0x0f,
+ 0xff, 0x00, 0xfe, 0xef, 0xff, 0x01, 0x01, 0xff, 0x00, 0xf2, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0xff, 0xf0, 0x0f, 0xf0, 0xff, 0x01, 0x01, 0xef, 0x00, 0x33, 0x00, 0xfd,
+ 0x00, 0x11, 0x32, 0x11,
+ 0x00, 0x00, 0x2f, 0xfe, 0xfe, 0x10, 0x22, 0x10, 0x00, 0x01, 0x0f, 0x00,
+ 0x20, 0x02, 0x00, 0x00,
+ 0xf0, 0x01, 0xf0, 0x02, 0x10, 0x02, 0xff, 0xfe, 0xed, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x02, 0x10,
+ 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x10, 0x0f, 0x00, 0x13,
+ 0x10, 0x11, 0x11, 0x00,
+ 0x1f, 0x11, 0x02, 0x21, 0x12, 0x02, 0x23, 0x00, 0xee, 0xe0, 0x02, 0x00,
+ 0x01, 0xf0, 0x00, 0x11,
+ 0xef, 0xff, 0x01, 0x01, 0xf0, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x2e, 0x01, 0x20,
+ 0x00, 0x01, 0x22, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10, 0x30, 0x13, 0x11,
+ 0x1e, 0x0d, 0x0f, 0x00,
+ 0x30, 0x0e, 0x0f, 0x20, 0x00, 0xfe, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0x0e,
+ 0xcd, 0x0f, 0x00, 0xf0,
+ 0xdf, 0x00, 0xde, 0x0e, 0xef, 0xe0, 0xff, 0xf1, 0x02, 0x02, 0xf0, 0x0f,
+ 0xf0, 0xe0, 0x02, 0x10,
+ 0xf0, 0xf0, 0x00, 0x11, 0x00, 0xf0, 0x01, 0x13, 0x10, 0x12, 0x01, 0x10,
+ 0x00, 0x21, 0x00, 0x03,
+ 0x11, 0x10, 0x10, 0x00, 0xee, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc7, 0xf1, 0x0e, 0xee, 0x8f, 0xf1, 0xab, 0xed, 0x00, 0xff, 0x02, 0x02,
+ 0x0f, 0xdd, 0x0f, 0x00,
+ 0x01, 0x01, 0xe0, 0x0f, 0x0e, 0x0d, 0xff, 0x00, 0x00, 0x20, 0x0f, 0x11,
+ 0x10, 0x11, 0x00, 0x1f,
+ 0x10, 0x00, 0x0f, 0x0f, 0x10, 0x12, 0x00, 0x0f, 0x01, 0x01, 0x00, 0x01,
+ 0x01, 0x23, 0x00, 0xf0,
+ 0x02, 0x00, 0x0f, 0xf0, 0x00, 0x24, 0xf0, 0xf0, 0xff, 0x00, 0x00, 0x0e,
+ 0xfe, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf0, 0x00, 0x0e,
+ 0x01, 0x10, 0x00, 0xe0,
+ 0x00, 0x22, 0x22, 0x01, 0x00, 0x02, 0x11, 0x01, 0x22, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0xff, 0x0f,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x1e,
+ 0x00, 0x02, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x00, 0xf0,
+ 0x00, 0xf0, 0xfe, 0xee,
+ 0x00, 0xf0, 0xff, 0x01, 0x00, 0x0f, 0xef, 0x00, 0x02, 0x10, 0x01, 0x00,
+ 0xff, 0x00, 0x0f, 0x10,
+ 0x02, 0x21, 0x02, 0x00, 0x0d, 0x10, 0x11, 0x21, 0x00, 0x10, 0x11, 0x12,
+ 0x00, 0x10, 0x11, 0x11,
+ 0x10, 0x21, 0x01, 0xf0, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x0e,
+ 0x00, 0x00, 0xff, 0xf1,
+ 0x11, 0x01, 0x00, 0x0f, 0x00, 0xed, 0xf0, 0x0f, 0x00, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0x12, 0x01,
+ 0x00, 0xf0, 0x00, 0xde, 0x01, 0x02, 0xf1, 0xf2, 0x02, 0xff, 0xff, 0xf0,
+ 0xff, 0x00, 0x00, 0x10,
+ 0x21, 0x01, 0x11, 0x12, 0x22, 0x21, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0x03, 0xf0, 0x00,
+ 0x0f, 0xff, 0x00, 0x12, 0x20, 0x01, 0x00, 0x10, 0x20, 0x00, 0x0f, 0x1f,
+ 0x1f, 0xff, 0x00, 0x1f,
+ 0x0e, 0x10, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0xf0, 0x0d, 0xee, 0x0e,
+ 0xed, 0x10, 0x01, 0x01,
+ 0xef, 0xfe, 0xf0, 0xef, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xe0, 0xf0, 0x01,
+ 0x01, 0xf0, 0xf0, 0xff,
+ 0xdd, 0xfe, 0x01, 0xf2, 0x02, 0x00, 0xfd, 0xf0, 0x00, 0x21, 0x00, 0x10,
+ 0x10, 0x11, 0x31, 0xff,
+ 0x0e, 0x01, 0x20, 0x0f, 0x00, 0x0f, 0xf0, 0x10, 0x00, 0x0f, 0xf0, 0x00,
+ 0x02, 0x10, 0x11, 0x00,
+ 0xee, 0xf0, 0x00, 0x10, 0xf0, 0x0e, 0xf0, 0x00, 0x0f, 0x02, 0x00, 0xed,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x11, 0xfe, 0xf0, 0x0f, 0x1f, 0x00, 0x20, 0x01, 0x12, 0x10,
+ 0x12, 0x00, 0x00, 0x12,
+ 0x01, 0x12, 0x12, 0x11, 0x00, 0xe2, 0x00, 0x01, 0x02, 0x00, 0xe0, 0x02,
+ 0x00, 0x00, 0xdf, 0x00,
+ 0x01, 0x00, 0x0e, 0xf0, 0x00, 0x11, 0x11, 0x01, 0x10, 0x20, 0x0f, 0x0f,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0x21, 0x21, 0xfe, 0x00, 0x20, 0x10, 0x10, 0x10, 0x20,
+ 0x10, 0x00, 0x00, 0x30,
+ 0x0e, 0x0f, 0x00, 0x00, 0xef, 0x00, 0x20, 0xf0, 0xef, 0x00, 0x0f, 0xef,
+ 0xee, 0x0e, 0xf0, 0xef,
+ 0x00, 0xf0, 0x0f, 0xe0, 0xf0, 0x01, 0xf1, 0x00, 0xff, 0x00, 0xf0, 0x00,
+ 0xf3, 0x00, 0x01, 0x02,
+ 0x0f, 0x0e, 0xdf, 0x00, 0x20, 0x01, 0x01, 0x03, 0x10, 0x11, 0x01, 0x22,
+ 0x00, 0x10, 0x21, 0x01,
+ 0x10, 0x00, 0x12, 0x12, 0x21, 0x0f, 0xed, 0x01, 0x11, 0x12, 0x00, 0x0f,
+ 0xf0, 0x00, 0x02, 0x0f,
+ 0xfe, 0x02, 0x01, 0x0f, 0xef, 0x0f, 0xff, 0xfd, 0x01, 0x22, 0x00, 0x0f,
+ 0x0f, 0x1f, 0x0f, 0x1f,
+ 0x10, 0x20, 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x03, 0x11, 0x11, 0x00, 0xff,
+ 0x00, 0x01, 0x11, 0x11,
+ 0x13, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x1f, 0x00, 0x03, 0xf0, 0xff, 0x0f,
+ 0xef, 0x00, 0x00, 0xef,
+ 0x0e, 0x00, 0xff, 0xfd, 0x0f, 0x00, 0x11, 0x33, 0x0f, 0x00, 0x10, 0xff,
+ 0xed, 0x00, 0xf1, 0x02,
+ 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x02, 0x1f, 0x10, 0x00, 0x12, 0x10,
+ 0x11, 0x21, 0x01, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x02, 0x22, 0x00, 0xed, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x00, 0x20, 0x0f,
+ 0xee, 0x00, 0x0f, 0x00, 0x01, 0x03, 0x00, 0xdd, 0xf0, 0xf0, 0xf0, 0xf0,
+ 0x00, 0x00, 0x01, 0x0f,
+ 0xef, 0x00, 0x00, 0xe0, 0x00, 0x10, 0xe0, 0x0f, 0xf0, 0xf0, 0xe1, 0x01,
+ 0x12, 0x00, 0x10, 0x0f,
+ 0x10, 0x00, 0x0f, 0x10, 0x14, 0x21, 0x00, 0xff, 0xff, 0x01, 0x22, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x20, 0x02, 0x10, 0x20, 0x10, 0x00, 0x0f, 0xfd, 0xf0, 0x10, 0x00, 0x10,
+ 0x00, 0x0f, 0xe0, 0x0f,
+ 0x00, 0x0f, 0x0f, 0xfe, 0xfe, 0x0f, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0xfe,
+ 0x0e, 0xde, 0x0f, 0xf1,
+ 0x01, 0x03, 0xf0, 0xf0, 0xe0, 0xff, 0xe0, 0x0f, 0xf1, 0xf1, 0xf0, 0x00,
+ 0x11, 0x00, 0x01, 0xf1,
+ 0x00, 0x0f, 0x00, 0x11, 0x10, 0x01, 0x12, 0x01, 0x00, 0x2f, 0x00, 0x01,
+ 0x00, 0x00, 0x0e, 0xf0,
+ 0xf0, 0x10, 0x24, 0x0f, 0x0f, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10,
+ 0x0e, 0x00, 0x00, 0x21,
+ 0x10, 0x00, 0x0f, 0x1f, 0x0f, 0xff, 0x00, 0x10, 0xff, 0x0f, 0xf1, 0x01,
+ 0x00, 0xfd, 0x0f, 0xff,
+ 0x0e, 0x10, 0x00, 0x01, 0xf0, 0xff, 0x0f, 0xef, 0xf0, 0xf0, 0xf0, 0xe0,
+ 0x00, 0x00, 0xe0, 0x00,
+ 0xf0, 0xe1, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0xff, 0x00, 0x11,
+ 0x22, 0x12, 0x0f, 0x0f,
+ 0x00, 0x10, 0x10, 0x00, 0x21, 0x11, 0x00, 0x0f, 0x10, 0x11, 0x11, 0x00,
+ 0xe0, 0x0f, 0x10, 0x10,
+ 0x01, 0x01, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0x00, 0x21, 0xf0, 0xf0, 0x00,
+ 0xf1, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x01, 0x10, 0x12, 0x10, 0x11,
+ 0x22, 0x00, 0x11, 0x22,
+ 0x12, 0x10, 0x00, 0x00, 0x21, 0x01, 0xe0, 0x13, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0xe2, 0x00,
+ 0xff, 0xef, 0x00, 0x11, 0xfe, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0x10, 0x02,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x22, 0x20, 0x00, 0x20, 0x10, 0x30,
+ 0x10, 0x10, 0x1e, 0x20,
+ 0x10, 0x30, 0x00, 0x10, 0x31, 0xff, 0xfc, 0xf0, 0x00, 0x0d, 0xff, 0xff,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0xed, 0xff, 0x0f, 0xff, 0xef, 0xf0, 0x00, 0x02, 0xf0, 0xd0, 0xf0, 0xef,
+ 0x00, 0x00, 0xd1, 0x00,
+ 0x00, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x13, 0x0f, 0xf0, 0x00, 0xf1, 0x01,
+ 0x24, 0x21, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x11, 0x10, 0x10, 0x01, 0x00, 0x0e, 0x00, 0x12, 0x03,
+ 0x02, 0xff, 0xdd, 0x00,
+ 0x00, 0xe1, 0xff, 0x00, 0x02, 0x10, 0x0f, 0xff, 0xff, 0x10, 0x0e, 0x0e,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x0e, 0x0e, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x33, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x11, 0x11, 0xf2, 0x00, 0x11, 0x00, 0x02, 0x00,
+ 0xe0, 0xff, 0x00, 0x10,
+ 0x00, 0xf1, 0x01, 0x0e, 0xff, 0xfe, 0x0e, 0xfe, 0xff, 0x10, 0x20, 0x12,
+ 0x11, 0x00, 0xff, 0xf0,
+ 0x0f, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x02, 0x10, 0x11, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x12,
+ 0x10, 0x00, 0x02, 0x20, 0x00, 0xee, 0xff, 0x00, 0x12, 0x00, 0x0e, 0x00,
+ 0x0e, 0x01, 0x01, 0x0f,
+ 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x0f, 0xff,
+ 0xfe, 0x00, 0x00, 0xe0,
+ 0x1f, 0x00, 0xef, 0x00, 0xf0, 0xef, 0x0f, 0xf0, 0x0f, 0xef, 0xf0, 0xfe,
+ 0xf0, 0x00, 0xf1, 0xff,
+ 0x0f, 0x01, 0x00, 0xf1, 0x01, 0x20, 0x33, 0x00, 0x00, 0x0f, 0x00, 0x33,
+ 0x00, 0x01, 0x22, 0x0f,
+ 0x0f, 0x20, 0x13, 0x00, 0x10, 0x10, 0x00, 0x21, 0x02, 0x01, 0x00, 0x00,
+ 0x10, 0x0d, 0xf0, 0x00,
+ 0x00, 0x10, 0x10, 0x0e, 0xfe, 0xfe, 0x00, 0x0e, 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0xf0, 0x10,
+ 0x13, 0x00, 0xed, 0xe0, 0xff, 0x01, 0x00, 0xee, 0x01, 0x01, 0xf0, 0xff,
+ 0x00, 0xf0, 0x01, 0x33,
+ 0xf0, 0xf0, 0x0f, 0xf0, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0x10, 0x12, 0x12, 0xf1,
+ 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x32, 0x00, 0x20, 0x0f, 0x0f, 0x1f, 0x10, 0x10, 0x0f, 0x1f, 0x0f, 0x0d,
+ 0xef, 0x0e, 0x00, 0x01,
+ 0x0e, 0x0e, 0xee, 0x10, 0x02, 0x00, 0x00, 0xee, 0xd0, 0xfd, 0xe0, 0xf0,
+ 0x02, 0xe0, 0xf2, 0xee,
+ 0xee, 0xfe, 0xff, 0xf1, 0x00, 0xf1, 0x00, 0xee, 0x00, 0x00, 0xe0, 0x0f,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xff, 0x10, 0x12, 0x20, 0x0f, 0x10, 0x11, 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x12, 0x00, 0x0d,
+ 0xde, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0xe0, 0x00,
+ 0xed, 0x00, 0xf0, 0x00, 0x0f, 0x1f, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x00,
+ 0x10, 0x00, 0x20, 0x03,
+ 0x12, 0x01, 0x12, 0x10, 0x00, 0xef, 0x01, 0x11, 0x12, 0x01, 0x00, 0xf1,
+ 0x00, 0x00, 0x03, 0x02,
+ 0x02, 0x0f, 0x00, 0xdf, 0x0f, 0x00, 0xf0, 0x00, 0x02, 0x00, 0x0d, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x11, 0x02, 0x22, 0x00, 0x00, 0xff, 0x00, 0x0e, 0x10, 0x20, 0x31,
+ 0x22, 0x00, 0x0e, 0x10,
+ 0x32, 0x10, 0x10, 0x10, 0x0f, 0x10, 0x20, 0x00, 0xf0, 0xfe, 0x0f, 0x0f,
+ 0x0f, 0xee, 0xef, 0x10,
+ 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0xff, 0x00, 0xf1, 0xef,
+ 0xe0, 0x0f, 0xf0, 0xff,
+ 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x11, 0xf0, 0xf0, 0x02, 0x11, 0x01,
+ 0x00, 0xe0, 0x00, 0x10,
+ 0x10, 0x00, 0x10, 0x22, 0x22, 0x00, 0x10, 0x11, 0x02, 0x11, 0x12, 0x12,
+ 0x0f, 0xf0, 0xf1, 0x00,
+ 0x00, 0xdd, 0x01, 0x12, 0x00, 0xfd, 0xf0, 0x11, 0x00, 0x0f, 0x10, 0x0f,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x0e, 0xe0, 0x1f, 0x0f, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x00, 0xfe,
+ 0x0f, 0x0f, 0x21, 0x23,
+ 0x12, 0x03, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x0e,
+ 0xfe, 0x12, 0x01, 0x11,
+ 0x00, 0xfe, 0xff, 0x00, 0xf0, 0x0e, 0xf0, 0xff, 0x00, 0x0f, 0x0f, 0xef,
+ 0x0f, 0x00, 0x01, 0x22,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x00, 0xf0,
+ 0x0f, 0x21, 0x01, 0x02,
+ 0x00, 0x10, 0x00, 0x21, 0x10, 0x02, 0x20, 0x10, 0x0e, 0xee, 0x00, 0x32,
+ 0x00, 0x0f, 0xff, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xf0, 0x10, 0x00, 0xf0, 0x03,
+ 0x0f, 0xee, 0x00, 0xef,
+ 0x00, 0xf0, 0x00, 0xff, 0xf0, 0x01, 0x01, 0x0e, 0xff, 0xdd, 0x00, 0x01,
+ 0x01, 0xf0, 0x01, 0xf1,
+ 0xf0, 0xed, 0xf0, 0x00, 0x01, 0x01, 0x11, 0x11, 0x10, 0x00, 0x11, 0x11,
+ 0x10, 0x00, 0x12, 0x0f,
+ 0x0f, 0xf0, 0x01, 0x22, 0x02, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x21,
+ 0x12, 0x0f, 0xff, 0x0f,
+ 0x20, 0x0f, 0x10, 0x0f, 0x0f, 0xff, 0x0d, 0x0f, 0xff, 0x0f, 0x10, 0x00,
+ 0xff, 0x0f, 0xff, 0xfe,
+ 0x00, 0xff, 0xf0, 0x0f, 0x00, 0xe0, 0xff, 0xff, 0xf0, 0xee, 0xf0, 0x00,
+ 0x01, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x0f, 0x00, 0x11,
+ 0x04, 0x10, 0x01, 0x00, 0x10, 0xf0, 0xee, 0x12, 0x22, 0x11, 0x00, 0x0d,
+ 0x00, 0x00, 0xff, 0x10,
+ 0x11, 0x01, 0x21, 0x00, 0x00, 0x01, 0x0f, 0x1f, 0x20, 0x0f, 0x1f, 0x00,
+ 0x10, 0x00, 0x0e, 0xfe,
+ 0x10, 0x0f, 0x00, 0x0e, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x00, 0xee, 0x00,
+ 0xe0, 0xf0, 0xee, 0x00,
+ 0xe0, 0x00, 0x00, 0xde, 0xff, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0xf0, 0x01,
+ 0x00, 0xf0, 0x00, 0xff,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x31, 0x01, 0x10, 0x10, 0x23, 0x22,
+ 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x0e, 0x00, 0x0f, 0x10, 0x03, 0x10, 0x00, 0x00, 0xf0, 0x00, 0xf1,
+ 0x01, 0x00, 0x00, 0xff,
+ 0xde, 0xf0, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x1f, 0x00, 0x10, 0x01, 0x10,
+ 0x12, 0x10, 0x00, 0x01,
+ 0x31, 0x12, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x15, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x12, 0x11, 0x00, 0xf1, 0x00, 0xe0, 0x00, 0x0e, 0xe0, 0xf0, 0x00, 0xff,
+ 0x00, 0x0e, 0xf0, 0xf1,
+ 0x02, 0x00, 0x10, 0x0f, 0xf0, 0x12, 0x03, 0x10, 0x10, 0x10, 0x00, 0x1f,
+ 0x00, 0x20, 0x20, 0x02,
+ 0x20, 0x20, 0x00, 0x20, 0x20, 0x0f, 0x21, 0x20, 0x11, 0x1e, 0x1e, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x0e,
+ 0x00, 0x00, 0xee, 0xff, 0xfe, 0x0f, 0x11, 0x11, 0x00, 0xdf, 0x0e, 0xef,
+ 0x00, 0xe0, 0xe0, 0xfe,
+ 0xf0, 0xff, 0xf0, 0xe0, 0xf1, 0x01, 0x03, 0xf0, 0xe0, 0x00, 0x00, 0x00,
+ 0x03, 0x10, 0x0f, 0xfd,
+ 0x00, 0x00, 0x00, 0x11, 0x21, 0x02, 0x02, 0x00, 0x0f, 0x00, 0x11, 0x24,
+ 0x13, 0x00, 0xff, 0x0e,
+ 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x02, 0x10, 0xf0, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x1f, 0x0f,
+ 0x0e, 0xf0, 0x10, 0x10, 0x0f, 0x10, 0x0e, 0x1f, 0x0e, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x33, 0x02, 0x10, 0x01, 0x10, 0x0f, 0xf0, 0x01, 0x13, 0x00,
+ 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x0f,
+ 0x0f, 0x0f, 0x0e, 0x00,
+ 0x01, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x0e, 0x11, 0x01, 0x01,
+ 0x00, 0x10, 0x00, 0xf2, 0x0f, 0xef, 0x00, 0x01, 0x11, 0x11, 0x10, 0xff,
+ 0x0f, 0x1f, 0x00, 0x0f,
+ 0x0f, 0x20, 0x11, 0x01, 0x01, 0x10, 0x00, 0xff, 0xf0, 0x10, 0x00, 0x00,
+ 0x0f, 0x01, 0x03, 0x1f,
+ 0x0d, 0xde, 0x00, 0x0e, 0x0e, 0xef, 0xf0, 0x00, 0x12, 0x00, 0xce, 0x00,
+ 0x01, 0xe0, 0xee, 0xff,
+ 0xff, 0xe0, 0x0f, 0x00, 0xef, 0xff, 0x00, 0x10, 0x0f, 0x10, 0x02, 0x00,
+ 0x44, 0x00, 0x00, 0x11,
+ 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x01, 0x20,
+ 0x01, 0x00, 0x1f, 0x00,
+ 0x1f, 0x00, 0x21, 0x01, 0x0f, 0x0f, 0x10, 0x0f, 0x0e, 0xf0, 0x0f, 0x0e,
+ 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xef, 0xff, 0x0f, 0xe0,
+ 0x0e, 0x00, 0x04, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0xf0, 0xff,
+ 0x00, 0x01, 0xf0, 0x01,
+ 0x01, 0x11, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0xff, 0x00, 0x10, 0x13,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x20, 0x01, 0xff, 0x10, 0x11, 0x00, 0x20, 0x00, 0x20, 0x20, 0x0e,
+ 0x1e, 0x10, 0x10, 0x2f,
+ 0x00, 0x0d, 0x0e, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0xfe, 0xf0, 0xf0, 0x0f,
+ 0x00, 0xe0, 0xf0, 0xf0,
+ 0xee, 0xff, 0xef, 0xf0, 0xe0, 0xfe, 0xee, 0xe0, 0x00, 0x11, 0xf0, 0xf0,
+ 0xf0, 0xe0, 0x00, 0x00,
+ 0x0f, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0x20, 0x11, 0x00, 0x10,
+ 0x12, 0x21, 0x10, 0x0f,
+ 0x0f, 0xef, 0x10, 0x00, 0x21, 0x11, 0x01, 0xff, 0x00, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x8d, 0x07, 0x9e, 0x04, 0xe1, 0x07, 0x33, 0x05, 0x00, 0xf1, 0xf0, 0x00,
+ 0xef, 0xfe, 0xfe, 0x00,
+ 0x00, 0xfd, 0xf0, 0x00, 0x00, 0x22, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10,
+ 0x00, 0x11, 0x02, 0x11,
+ 0x10, 0xff, 0x00, 0x11, 0x00, 0x01, 0x01, 0x10, 0x00, 0x02, 0x03, 0x20,
+ 0x01, 0xf1, 0x02, 0x10,
+ 0x01, 0x10, 0xf0, 0x01, 0x00, 0xe0, 0x0f, 0xff, 0x00, 0x02, 0xf0, 0xfe,
+ 0xef, 0x0f, 0x01, 0x12,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x10, 0x10, 0x11, 0x10, 0x0f, 0x00, 0x21,
+ 0x10, 0x11, 0x10, 0x0f,
+ 0x1f, 0x00, 0x20, 0x0f, 0x11, 0x21, 0x10, 0x00, 0x1f, 0x0e, 0x00, 0x20,
+ 0x00, 0x10, 0x0f, 0x0d,
+ 0xf0, 0xf0, 0x00, 0x0e, 0x00, 0x11, 0x00, 0xf1, 0xf0, 0xfd, 0xf0, 0xf0,
+ 0xf0, 0x0f, 0xf0, 0xf0,
+ 0xe1, 0xf0, 0x00, 0xef, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x10, 0x0d, 0xf1,
+ 0x01, 0x00, 0x00, 0x02, 0x02, 0x10, 0x13, 0x10, 0x00, 0x01, 0x01, 0x12,
+ 0x10, 0x00, 0xef, 0x00,
+ 0x00, 0x12, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0x01, 0x10, 0x0e, 0xf0,
+ 0x0f, 0x0f, 0xff, 0x0f,
+ 0x10, 0x1f, 0x0e, 0x00, 0x0f, 0x0e, 0x11, 0x00, 0x0f, 0x00, 0x1e, 0x00,
+ 0x01, 0x20, 0x00, 0x11,
+ 0x01, 0x00, 0x33, 0x10, 0xf1, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x20, 0xf0, 0xee, 0x0f, 0x0f, 0x02, 0x11,
+ 0x00, 0xef, 0x00, 0xfe,
+ 0x0f, 0xe0, 0x00, 0x10, 0x02, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x0f, 0xf0,
+ 0x02, 0x00, 0x02, 0x01,
+ 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x31, 0x01, 0x20, 0x0f,
+ 0x20, 0x21, 0x00, 0xfd,
+ 0x00, 0x02, 0x00, 0x00, 0x01, 0x22, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x0f,
+ 0xe0, 0x10, 0x02, 0xe0, 0xfe, 0xf0, 0xef, 0x00, 0xf1, 0xf1, 0xf0, 0xf0,
+ 0x00, 0xf0, 0xff, 0xee,
+ 0x00, 0xff, 0x0f, 0xfe, 0x00, 0x11, 0x12, 0x00, 0x12, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x02, 0x00,
+ 0x22, 0x00, 0xd0, 0x10, 0x00, 0x0f, 0x01, 0x23, 0x13, 0x20, 0xf0, 0x0f,
+ 0x00, 0x20, 0x01, 0x11,
+ 0x11, 0x0f, 0x0f, 0x0d, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0d, 0x00, 0xf0,
+ 0x00, 0x0e, 0x0f, 0xff,
+ 0x0f, 0x0e, 0x0f, 0xee, 0x00, 0xf0, 0x0f, 0xef, 0xff, 0x0f, 0x00, 0xff,
+ 0x01, 0x02, 0x01, 0x01,
+ 0x10, 0x00, 0xff, 0xee, 0x00, 0x02, 0x10, 0x00, 0xdf, 0x00, 0x01, 0x00,
+ 0xf0, 0x01, 0x12, 0xff,
+ 0x00, 0xff, 0x00, 0x03, 0x12, 0x02, 0x10, 0xfd, 0x01, 0x01, 0x11, 0x00,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0x00, 0x12, 0x00, 0x0f, 0x1f, 0x00, 0x2f, 0x2f, 0x00, 0x20,
+ 0x10, 0x11, 0x1f, 0x0e,
+ 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0x01, 0x00, 0xe0, 0x0e, 0xf0, 0x0f,
+ 0x00, 0x02, 0x10, 0xfd,
+ 0xdf, 0x00, 0xf1, 0xf0, 0xee, 0xf0, 0x00, 0xf0, 0xf1, 0xf0, 0xee, 0x00,
+ 0x0f, 0xef, 0x00, 0x0f,
+ 0x01, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x0e, 0x01, 0x23, 0x00, 0x00, 0x21,
+ 0x12, 0x0f, 0x10, 0x00,
+ 0x1e, 0x10, 0x02, 0x20, 0x01, 0x00, 0xf2, 0x01, 0x10, 0x0f, 0xe0, 0xff,
+ 0x0f, 0xe0, 0x00, 0xf0,
+ 0xff, 0x00, 0x00, 0x0e, 0x10, 0x0f, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x01,
+ 0x01, 0x10, 0x00, 0x12,
+ 0x0f, 0xff, 0x00, 0x11, 0x20, 0x12, 0x01, 0x11, 0x22, 0x01, 0x00, 0x01,
+ 0x11, 0x01, 0x02, 0x00,
+ 0x12, 0x10, 0x00, 0xe0, 0xf0, 0x0f, 0x00, 0x0f, 0xee, 0x00, 0x00, 0x01,
+ 0x02, 0x00, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0xf0, 0xf2, 0x00, 0x10, 0x10, 0x01, 0x01, 0x21, 0x20,
+ 0x00, 0x00, 0x00, 0x2e,
+ 0x00, 0x01, 0x22, 0x11, 0x10, 0x10, 0x10, 0x00, 0x2f, 0x0f, 0x30, 0x10,
+ 0x1e, 0x20, 0x1f, 0x0f,
+ 0x20, 0x0f, 0x0e, 0x10, 0x00, 0xfe, 0xff, 0xff, 0x00, 0x13, 0x00, 0xde,
+ 0xff, 0xe0, 0x00, 0x00,
+ 0x0e, 0xe0, 0xf1, 0xf1, 0xf0, 0xee, 0x00, 0xf0, 0x01, 0xe1, 0x00, 0xef,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x02, 0x00, 0x0e, 0x10, 0x0f, 0xf0, 0x03, 0x11, 0x10, 0x02, 0x01,
+ 0x00, 0x11, 0x02, 0xf2,
+ 0xfe, 0x0f, 0x00, 0xf1, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x12, 0xff, 0x0f,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x0f, 0x0e, 0xef, 0x1e, 0x10, 0x11, 0x10, 0x00, 0x0f,
+ 0x0e, 0x0f, 0x10, 0x11,
+ 0x00, 0x10, 0x02, 0x00, 0x1e, 0x01, 0x11, 0x00, 0x01, 0x01, 0x00, 0x01,
+ 0x02, 0x00, 0xf1, 0x01,
+ 0x00, 0x0e, 0x01, 0x23, 0x00, 0x0f, 0xf0, 0x10, 0x10, 0xf0, 0xfd, 0x00,
+ 0x10, 0x00, 0xf0, 0x01,
+ 0x01, 0x10, 0xfe, 0xef, 0x0f, 0x11, 0x01, 0x11, 0x01, 0xf0, 0xf1, 0x12,
+ 0x00, 0x00, 0x0e, 0xf0,
+ 0x01, 0xff, 0xff, 0xff, 0x10, 0x01, 0x00, 0x0f, 0x0f, 0xef, 0x10, 0x11,
+ 0x01, 0x1f, 0x1f, 0x01,
+ 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1e, 0xff, 0x0f, 0x00, 0x22, 0x11,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x0f, 0xff, 0x00, 0x12, 0x00, 0xf0, 0xf0, 0x0e, 0xe0, 0xef, 0x00, 0xee,
+ 0x00, 0xe0, 0x0f, 0xff,
+ 0x00, 0xef, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0xf1, 0xf0, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x02, 0x21, 0x01, 0x11,
+ 0x11, 0x00, 0x00, 0x1f,
+ 0x00, 0x10, 0x0f, 0x20, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x1f, 0x10, 0x12,
+ 0xff, 0xfe, 0x01, 0x00,
+ 0x10, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0x00, 0x01, 0x11, 0x00,
+ 0xe0, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x02, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x02, 0xf0, 0x00, 0x01, 0xf0, 0xf0, 0x02, 0x01, 0x00, 0xf0, 0x02, 0x02,
+ 0x01, 0x00, 0x01, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x01, 0x22, 0x00, 0x0e, 0x1f, 0x10, 0x20, 0x00,
+ 0x30, 0x20, 0x1f, 0x20,
+ 0x00, 0x1e, 0x0f, 0x1f, 0x00, 0x10, 0x00, 0xff, 0x0e, 0xff, 0x00, 0xf0,
+ 0x00, 0xfe, 0x0f, 0x01,
+ 0xf0, 0x00, 0xf0, 0xe0, 0xfd, 0xf0, 0xf0, 0xdd, 0xf0, 0xf1, 0xe0, 0xe0,
+ 0x0f, 0xf0, 0xfe, 0xe0,
+ 0x0f, 0x00, 0x10, 0x01, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x0f, 0x1f, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x14, 0x20, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x01, 0x01, 0xe0, 0x0f,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xe1, 0xff, 0xfd, 0xff, 0x00, 0x02, 0x10, 0x11, 0x00, 0xe0, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x20, 0xfe, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x00, 0x10, 0x22, 0x03,
+ 0x00, 0x10, 0x02, 0x02,
+ 0x00, 0x10, 0x00, 0x01, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x01, 0x01, 0x00,
+ 0xff, 0xf0, 0xf1, 0x01,
+ 0x00, 0xff, 0xf0, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x22, 0x01, 0x21,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x20, 0x01, 0x1f, 0x1e, 0x00, 0x20, 0x10,
+ 0x10, 0x1f, 0x0e, 0x20,
+ 0x10, 0x00, 0x20, 0x01, 0x10, 0x00, 0x1f, 0xfe, 0xff, 0x00, 0xef, 0x10,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x02, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0x00, 0xe0, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x11, 0x10, 0x01, 0x01, 0xe0, 0x00, 0x00, 0xf2, 0x00,
+ 0x0f, 0x21, 0x02, 0xf0,
+ 0x01, 0x02, 0x11, 0x0f, 0xff, 0xef, 0x01, 0x12, 0x12, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0xfe, 0x0f, 0x0f, 0xfd, 0x0f, 0x00, 0x1f, 0x00, 0x0e, 0x00,
+ 0x12, 0x10, 0x00, 0x0e,
+ 0x00, 0x10, 0x0f, 0x11, 0x11, 0x10, 0x01, 0x00, 0x10, 0x10, 0x00, 0x01,
+ 0xf2, 0x00, 0x01, 0x12,
+ 0x01, 0xe0, 0x00, 0x20, 0x00, 0x01, 0x00, 0x0f, 0x2f, 0x00, 0x21, 0x00,
+ 0xe0, 0x0f, 0x00, 0x1f,
+ 0x00, 0xef, 0x00, 0x0f, 0xf0, 0x01, 0xe0, 0x00, 0x00, 0x01, 0x01, 0x00,
+ 0xff, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0x00, 0x22, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x1f, 0x00, 0x10, 0x20, 0x00, 0x11, 0x10, 0x10, 0x0f, 0x00, 0x0f, 0x11,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0xe0, 0x0f, 0xef, 0xf0,
+ 0xff, 0xe0, 0xff, 0x00,
+ 0xf0, 0x01, 0xf0, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
+ 0xf0, 0xf0, 0x01, 0xf0,
+ 0xff, 0x00, 0xf1, 0xf0, 0x00, 0x01, 0x12, 0x10, 0x02, 0x10, 0x00, 0x10,
+ 0x12, 0x00, 0x11, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x00, 0x1f,
+ 0x10, 0x00, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0f, 0xfe, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0x0f, 0xee, 0x00,
+ 0xf0, 0x0f, 0xff, 0x00,
+ 0x01, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x01, 0x0f, 0xee, 0x10, 0x02, 0x10,
+ 0x00, 0xf0, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0x01, 0x02, 0x01, 0x01, 0x00, 0xf0, 0xf0, 0xf1, 0x01, 0x01,
+ 0x02, 0xf0, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x01, 0x11, 0x00, 0x01, 0x10, 0x1f, 0x00, 0x0e,
+ 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x0f, 0x10, 0x1f, 0x10, 0x0f, 0x10, 0x1f, 0x00, 0xfe, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0xfe,
+ 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xee, 0xff, 0xff,
+ 0xef, 0xe0, 0x0f, 0xee,
+ 0xf0, 0x00, 0x02, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xf0, 0x00, 0x20, 0x0f,
+ 0x11, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x11, 0x21, 0x00, 0x00, 0x02, 0x21, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x11, 0xf0, 0xf0, 0xff, 0xee, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xff,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x20, 0x01, 0x00, 0x10, 0x21, 0x13, 0x10, 0xf0, 0x00,
+ 0x11, 0x12, 0x00, 0x01,
+ 0x11, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x02, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0xf1, 0x11,
+ 0x01, 0x00, 0x10, 0x02, 0x10, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x30, 0x00,
+ 0x20, 0x11, 0x20, 0x0e,
+ 0x10, 0x30, 0x00, 0x00, 0x20, 0x1f, 0x1e, 0x10, 0x0e, 0x20, 0x0f, 0xff,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xe0, 0x0f, 0xf1, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xef, 0xee, 0xf0, 0x0f,
+ 0xf0, 0xee, 0x01, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x11, 0x01,
+ 0x01, 0xf2, 0x00, 0x01, 0xf1, 0x00, 0xf0, 0xf0, 0x02, 0x01, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x1e, 0x00, 0x21,
+ 0x00, 0x0f, 0x0e, 0x0f, 0x00, 0x2f, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x01, 0x02,
+ 0x00, 0x0f, 0xe0, 0x00, 0x20, 0x01, 0x00, 0x22, 0x00, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x11, 0x00, 0xfe, 0xf1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0xf0,
+ 0x0f, 0xf0, 0x0f, 0x01, 0x01, 0x00, 0x00, 0xef, 0xf0, 0xfe, 0x0f, 0xe0,
+ 0x10, 0x01, 0x00, 0xfe,
+ 0x00, 0x0f, 0x00, 0x10, 0x11, 0x11, 0x0f, 0x0f, 0x00, 0x20, 0x1f, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x10, 0x23, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0xf1, 0xf0,
+ 0xf0, 0x0e, 0xef, 0xfe,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x1f, 0x00, 0xef, 0x00, 0x01, 0x00,
+ 0x00, 0xef, 0x00, 0xff,
+ 0xe0, 0x00, 0xf0, 0x00, 0xe0, 0x00, 0xf1, 0x00, 0x00, 0x12, 0x10, 0x01,
+ 0x31, 0x01, 0xf0, 0x10,
+ 0x11, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0x00, 0x10,
+ 0x0f, 0x0f, 0x20, 0x00,
+ 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00,
+ 0x00, 0xef, 0x0f, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf1, 0x01, 0xf0, 0xe0,
+ 0x01, 0xf1, 0x02, 0xf1,
+ 0xf1, 0xf1, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x10, 0x11, 0x10, 0x00,
+ 0x11, 0x10, 0x20, 0x10,
+ 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x31, 0x0f, 0x0f, 0x2f, 0x10, 0x00, 0x1e,
+ 0x0f, 0x0d, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xef, 0xff, 0xff, 0xef, 0x00, 0xe0,
+ 0xee, 0x00, 0xee, 0xef,
+ 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xf0, 0xff, 0x10,
+ 0x0e, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x21, 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x21, 0x01, 0x00,
+ 0xff, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0xe0, 0x0f, 0x01,
+ 0x00, 0xf1, 0xf0, 0x0f,
+ 0x0f, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x11, 0x10, 0x0f, 0x21, 0x00,
+ 0x11, 0x00, 0x0f, 0x01,
+ 0x00, 0x12, 0x00, 0x01, 0xf0, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x02, 0x00, 0xf0, 0x01, 0x01,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x0f, 0x00,
+ 0x12, 0x10, 0x20, 0x0f,
+ 0x0f, 0x30, 0x00, 0x1f, 0x10, 0x10, 0x1f, 0x00, 0x0e, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x02, 0x10, 0x00, 0xe0, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0xef, 0x00,
+ 0xf0, 0xf0, 0x01, 0x01, 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0xf0, 0x01, 0x02, 0x00, 0xf0, 0xf0, 0x02, 0xf2, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x01, 0x00, 0x0e, 0x0f, 0x00, 0xf0, 0xfe, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0x1f, 0x0e,
+ 0x1f, 0x0f, 0x1f, 0x10, 0x0f, 0x10, 0x00, 0x00, 0x22, 0x00, 0x01, 0x01,
+ 0xf0, 0x0f, 0xf0, 0x11,
+ 0x02, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x21, 0x00,
+ 0xf1, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0e, 0xf0, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0xe0, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0f, 0xf0, 0xe0, 0x00, 0x02, 0x00, 0xf0, 0x0e, 0xe0, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x10, 0x1f, 0x10, 0x10,
+ 0x10, 0x0f, 0x1f, 0x11,
+ 0x10, 0x10, 0x00, 0x00, 0x12, 0x01, 0x01, 0x11, 0x00, 0xee, 0x01, 0xf0,
+ 0x00, 0x00, 0x00, 0xfe,
+ 0xf0, 0x00, 0xff, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0xf0, 0x00,
+ 0x10, 0x00, 0xff, 0xf0,
+ 0xff, 0xff, 0x00, 0xf0, 0x00, 0xfe, 0x01, 0xe2, 0x00, 0x00, 0xe0, 0x01,
+ 0x00, 0x20, 0x01, 0x00,
+ 0x12, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x9c, 0x0d, 0x11, 0x11, 0xb1, 0x0d, 0x7d, 0x10, 0x00, 0x11, 0x00, 0x0d,
+ 0x10, 0x11, 0x00, 0x1e,
+ 0x1f, 0x0f, 0x1f, 0x0f, 0x00, 0x00, 0x0e, 0xf0, 0x10, 0x00, 0xf0, 0xff,
+ 0x0e, 0xff, 0xff, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x0e, 0x00, 0x1f, 0x10, 0x00, 0xff, 0x00, 0x02,
+ 0x00, 0xfe, 0x00, 0x02,
+ 0x00, 0x0e, 0xf0, 0xf1, 0x00, 0x00, 0xf0, 0xf2, 0x01, 0xf1, 0x01, 0x01,
+ 0x01, 0xf1, 0x01, 0xe0,
+ 0x00, 0xf2, 0x01, 0x11, 0x12, 0x00, 0x0f, 0xf0, 0x0f, 0x11, 0x00, 0x10,
+ 0x11, 0x00, 0x10, 0x00,
+ 0x0f, 0x10, 0x0e, 0x00, 0x0e, 0x2f, 0x1f, 0x10, 0x11, 0x21, 0x0f, 0x0f,
+ 0x20, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0xef, 0x00, 0x01, 0xef, 0x0f, 0xff, 0xff, 0xef,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0xf0, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0xf0, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x04, 0x00, 0x11, 0x10, 0x00, 0x01, 0x10,
+ 0x0f, 0x1f, 0x10, 0x01,
+ 0x21, 0xee, 0xff, 0x00, 0x01, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0xe0, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f,
+ 0x0f, 0x00, 0x1f, 0x00, 0x22, 0x10, 0x00, 0x00, 0x11, 0x01, 0x02, 0x22,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x12, 0x01, 0x10, 0x01, 0x00, 0x0e, 0x00, 0xf0, 0x01, 0x21,
+ 0x00, 0x00, 0xf0, 0x02,
+ 0x10, 0x0f, 0xfe, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x00,
+ 0xf0, 0xf1, 0x00, 0xf0,
+ 0x00, 0xf1, 0x01, 0x00, 0x00, 0x11, 0x10, 0x00, 0x10, 0x11, 0x20, 0x10,
+ 0x10, 0x10, 0x1f, 0x10,
+ 0x10, 0x01, 0x30, 0x00, 0x10, 0x0e, 0x20, 0x0e, 0x10, 0x10, 0x10, 0x0f,
+ 0x10, 0x00, 0x00, 0xef,
+ 0x0f, 0x00, 0x10, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0xef,
+ 0x0f, 0x0f, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0xf1, 0xf0, 0x0f, 0xe0, 0x03, 0x11, 0x01, 0xf0, 0x02, 0x00,
+ 0x01, 0x0f, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xef, 0x0e, 0x0f, 0x00, 0xf0, 0x0f,
+ 0x1f, 0x10, 0x00, 0x0f,
+ 0x2f, 0x00, 0x0f, 0x10, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x01, 0x10, 0x01, 0x10, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x00, 0x21,
+ 0x01, 0xf0, 0x0f, 0x01,
+ 0x01, 0x01, 0x10, 0x10, 0x00, 0xff, 0x00, 0x20, 0x00, 0x21, 0x01, 0xf1,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0xef, 0x00, 0x00, 0xef, 0x00, 0xf0, 0x0f, 0xf0,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10, 0x0e, 0xff, 0x0f, 0x20,
+ 0x00, 0x11, 0x11, 0x10,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x11, 0x00, 0x01, 0x00, 0xf1, 0x0f, 0x0f,
+ 0x0f, 0x00, 0xf0, 0x0f,
+ 0x10, 0x12, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xe0, 0x0f, 0x00,
+ 0xff, 0xf0, 0x00, 0xf0,
+ 0x00, 0xff, 0xf0, 0xff, 0xf0, 0x01, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x11, 0x11,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x20,
+ 0x00, 0x00, 0x1f, 0x10,
+ 0x1f, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x20, 0xf0,
+ 0xff, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x10, 0xff,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xff, 0xef, 0x00, 0x01, 0xf1,
+ 0x03, 0xf0, 0xf0, 0x02,
+ 0xf1, 0x02, 0xf0, 0x02, 0xf0, 0x0f, 0x00, 0xf2, 0x01, 0x00, 0x12, 0x11,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x11, 0x30, 0x00, 0x0f, 0x20, 0x0f, 0x10, 0x1e, 0x00, 0x20, 0x10,
+ 0x11, 0x20, 0x0f, 0x1f,
+ 0x0f, 0x00, 0xff, 0x0f, 0xff, 0x00, 0xee, 0x00, 0x00, 0xef, 0x0f, 0x00,
+ 0xe0, 0xf0, 0xff, 0x0f,
+ 0xef, 0x00, 0xf0, 0xff, 0x0f, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x0e, 0xf0,
+ 0x0f, 0x10, 0x00, 0x01,
+ 0x00, 0x01, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x11,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0xf1, 0xf0, 0x00, 0xf0, 0xf0,
+ 0xf0, 0x0f, 0xff, 0x00,
+ 0x0e, 0x00, 0x10, 0x11, 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x11, 0x00,
+ 0x10, 0x00, 0xff, 0x00, 0x10, 0x01, 0x11, 0x01, 0x00, 0x10, 0x01, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0xf0, 0x02, 0x01,
+ 0x10, 0xf1, 0xf0, 0x00,
+ 0x02, 0xf0, 0xf0, 0x01, 0x00, 0x0e, 0xf0, 0x01, 0x10, 0x21, 0x01, 0x20,
+ 0x01, 0x00, 0x1f, 0x00,
+ 0x10, 0x21, 0x00, 0x10, 0x0f, 0x0f, 0x2f, 0x00, 0x0f, 0x0f, 0x20, 0x00,
+ 0x00, 0x0e, 0x10, 0x01,
+ 0x10, 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x0f, 0xef, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xfe, 0xf0, 0x11, 0x00, 0x02, 0x00, 0xff, 0xf0, 0x00,
+ 0xff, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0xf2, 0x01, 0x00, 0xf0, 0xf1, 0xf0, 0x01, 0x02,
+ 0xf0, 0x01, 0x00, 0x10,
+ 0x00, 0x0e, 0x00, 0x01, 0x00, 0x1e, 0x10, 0xf0, 0x0f, 0x00, 0x0e, 0xf0,
+ 0x0f, 0xf0, 0x00, 0x1e,
+ 0x10, 0x0f, 0x10, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x01, 0x00, 0x00, 0x01, 0x11, 0x01, 0x00, 0x0e, 0x10, 0x02, 0x00, 0xf0,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x20, 0x00, 0xfe, 0x00, 0x20, 0x00, 0x00, 0x01,
+ 0x21, 0xf0, 0x00, 0x00,
+ 0xf0, 0xf0, 0x01, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0xf0, 0xff, 0xff, 0x00,
+ 0x01, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x0e, 0x10, 0x00, 0x10,
+ 0x00, 0x22, 0x11, 0x10, 0x00, 0xff, 0x10, 0x01, 0x00, 0x00, 0x01, 0x1f,
+ 0x0f, 0xf0, 0xf1, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xe0,
+ 0x0f, 0x00, 0x00, 0xe1,
+ 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0x01, 0x01, 0x11, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x0f,
+ 0x00, 0x11, 0x10, 0x20,
+ 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x1f, 0x00, 0x1f, 0x11, 0x00, 0x00, 0xf0,
+ 0xfe, 0x0e, 0xe0, 0x10,
+ 0x0f, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x20, 0x0f, 0xff,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x02, 0xf2, 0xf1,
+ 0x02, 0xf1, 0x01, 0xf2, 0x00, 0x01, 0xe0, 0xf0, 0x01, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x01, 0x20,
+ 0x00, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x10, 0x10, 0x1f, 0x00,
+ 0x1f, 0x10, 0x00, 0x20,
+ 0x0f, 0x00, 0x20, 0x0e, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0xff, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0xf0,
+ 0x00, 0xef, 0x0f, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0xff, 0x00, 0xef, 0x0f,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0x02, 0x10, 0x0e, 0x00, 0x02, 0x00, 0x20, 0x01, 0x00, 0xf0, 0x0f,
+ 0x01, 0x10, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x0f, 0xfe, 0xf0, 0x00, 0xf0,
+ 0xf1, 0x00, 0x0f, 0x0f,
+ 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0x00, 0xff, 0x00, 0xf2, 0x02, 0x20,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x00, 0x20, 0x10, 0x21, 0x10, 0x0f, 0x1f, 0x10, 0x0f, 0x10, 0x10, 0x11,
+ 0x00, 0x1f, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x1f, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x10, 0x00, 0x0e,
+ 0xf0, 0x00, 0xfe, 0xe0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0xff, 0x00, 0x01,
+ 0xf0, 0x00, 0x02, 0x00, 0x01, 0x01, 0xf1, 0x01, 0xf1, 0x01, 0x00, 0x00,
+ 0xf0, 0xf1, 0x00, 0xf1,
+ 0x01, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x02, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+ 0xef, 0x00, 0x10, 0x0f,
+ 0x10, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x12, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x10, 0x0f, 0x11, 0x00,
+ 0x12, 0x00, 0x10, 0x01,
+ 0x11, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0x00, 0xe1, 0x00, 0x0f, 0xe0, 0x00,
+ 0xff, 0xf0, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0xff, 0x0f, 0x00,
+ 0x00, 0x11, 0x10, 0x01, 0x00, 0x10, 0x1f, 0x00, 0x10, 0x1f, 0x10, 0x02,
+ 0x10, 0x00, 0x0f, 0xf0,
+ 0x01, 0x11, 0x01, 0x00, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x0e, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xe0, 0x00, 0xfe, 0xf0, 0x00, 0x01, 0x01, 0xf0, 0xff, 0x0f, 0xef, 0x00,
+ 0xf0, 0xff, 0x00, 0x02,
+ 0xf0, 0x00, 0xe0, 0x00, 0x10, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x10, 0x0f, 0x0f, 0x00, 0x10,
+ 0x01, 0x01, 0x10, 0x0e,
+ 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x20, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xfe,
+ 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xf0, 0x00, 0x11, 0x00,
+ 0xf2, 0x00, 0x00, 0x00,
+ 0xe1, 0x02, 0xf1, 0xf0, 0x00, 0xf1, 0xf0, 0xf1, 0x01, 0xf0, 0x02, 0x01,
+ 0xf0, 0xf1, 0xf1, 0x00,
+ 0x12, 0x01, 0x00, 0x20, 0x11, 0x00, 0x00, 0x2f, 0x00, 0x0f, 0x10, 0x20,
+ 0x01, 0x1f, 0x1f, 0x10,
+ 0x0f, 0x00, 0x20, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0e,
+ 0x00, 0x00, 0xee, 0x00,
+ 0x00, 0xff, 0x00, 0xf0, 0xfe, 0xff, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0xef,
+ 0x0f, 0x0f, 0xe0, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x00, 0xe0, 0x00,
+ 0x00, 0x00, 0xe0, 0x00,
+ 0xf0, 0x0e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x01, 0x10, 0x11, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x02, 0x10, 0x00, 0xf2, 0x00, 0xf1, 0x01, 0x00, 0xf0, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x20, 0x00, 0x10, 0x1f, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x0e, 0xf0,
+ 0x01, 0x10, 0x10, 0x0f, 0x10, 0x0f, 0x00, 0x12, 0x0f, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xe0, 0x0f, 0x00, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x10, 0x0e, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0xe0, 0x00, 0x02, 0x00, 0x00, 0xf2, 0xf0, 0x01, 0x01, 0xe0, 0x00,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x20, 0x01, 0x01,
+ 0x10, 0x00, 0xf0, 0x00, 0x11, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0x01, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x01, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0e, 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x30, 0x01, 0x0f, 0x00, 0x00, 0x10, 0x10, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x01, 0xf1, 0x00, 0x11, 0x10, 0xf0, 0x00, 0xf1, 0x00, 0x21, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x02,
+ 0x0f, 0xf0, 0xff, 0xf0,
+ 0x00, 0xe0, 0x00, 0xf1, 0x00, 0xe0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x01,
+ 0x11, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x2f, 0x00, 0xf0, 0x00, 0x10,
+ 0x0f, 0x1f, 0x0f, 0x0f,
+ 0x00, 0x0e, 0x0e, 0xf0, 0xff, 0x0f, 0x00, 0x1f, 0x00, 0x11, 0xf0, 0xf0,
+ 0x01, 0xf0, 0x01, 0x01,
+ 0x00, 0x00, 0xf1, 0x01, 0xf1, 0xf0, 0x01, 0x00, 0xf1, 0xf1, 0xf1, 0xf1,
+ 0xf1, 0x01, 0x01, 0xf0,
+ 0xf0, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x20, 0x0f, 0x0f, 0x10,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x10, 0x0e, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x2f,
+ 0x0f, 0x00, 0x0f, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0xef, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0xff, 0x0f,
+ 0xf0, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x11, 0x00, 0x01,
+ 0x0f, 0x00, 0x00, 0x00, 0x11, 0x01, 0xf1, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x11, 0x02,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x11, 0x10, 0x11, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x10,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x10, 0x11, 0x00, 0x1f, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x20, 0x01, 0x10,
+ 0x00, 0x0e, 0xff, 0x00,
+ 0x00, 0xff, 0x00, 0x1f, 0x00, 0x0f, 0xf0, 0xf0, 0x0e, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x02, 0xf0, 0x00, 0x02, 0x00,
+ 0xf0, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0xf0, 0x0f, 0xf0, 0x01, 0x00, 0x02, 0x00, 0xf0, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0e, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3a, 0xfc, 0xb9, 0xfa, 0x57, 0xfc, 0x99, 0xfa, 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x01, 0x21,
+ 0x01, 0x00, 0x02, 0xff,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xef,
+ 0x00, 0x10, 0x0f, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x20, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x11, 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xe0,
+ 0x0e, 0x01, 0xe0, 0x00,
+ 0x0f, 0xf0, 0x00, 0xe0, 0x00, 0x00, 0x11, 0x00, 0xf1, 0x00, 0x01, 0x11,
+ 0x00, 0x1f, 0x0f, 0x00,
+ 0x10, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x0f,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x10, 0x00, 0x0d, 0xf0, 0x00, 0x10, 0x10, 0x01, 0x0f, 0x00, 0x0f, 0x0f,
+ 0xf0, 0x00, 0x01, 0xf0,
+ 0xf0, 0x01, 0xf0, 0x02, 0xf0, 0x00, 0xf2, 0xe0, 0x00, 0xf1, 0x02, 0xf1,
+ 0x01, 0x02, 0xf0, 0xff,
+ 0x00, 0x02, 0x10, 0x00, 0x01, 0x00, 0x01, 0x10, 0x11, 0x00, 0x0f, 0x0f,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x10, 0x00, 0x10, 0x1e, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x0e,
+ 0x00, 0x10, 0x0f, 0x0f,
+ 0xef, 0x0f, 0xfe, 0x00, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0xef, 0x0f,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x12, 0x00, 0xf1,
+ 0x00, 0x00, 0x11, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0xfe, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x01, 0x12, 0x11, 0x00,
+ 0x10, 0x10, 0x0f, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x01,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0xf1, 0xf0, 0x10, 0x01, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x01,
+ 0x10, 0x01, 0x00, 0xf1,
+ 0x00, 0x1f, 0x10, 0x01, 0x10, 0x11, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x12, 0x00, 0x00,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x0f, 0x00, 0x0f, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x01, 0xf0, 0x01, 0xf0, 0xf1, 0x00, 0xf0, 0x01, 0xf0, 0x00,
+ 0x00, 0x10, 0x03, 0x00,
+ 0xf0, 0xf0, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0xf0, 0x10, 0x0f, 0x10, 0x12, 0x00,
+ 0xfe, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x1f, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x01, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0xf1, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x01,
+ 0x21, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xf1, 0x00, 0x0e, 0xe0, 0xf0,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xef, 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x01, 0xe0, 0x00, 0x10, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x1f, 0x10, 0x10, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00,
+ 0x1f, 0x0f, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x00, 0x1f, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0xf1, 0xf0, 0x00,
+ 0xf0, 0xf1, 0x00, 0x01, 0xe0, 0x02, 0x00, 0x01, 0xe0, 0x01, 0xf0, 0x01,
+ 0xf0, 0xf1, 0x01, 0x00,
+ 0x02, 0xf0, 0x00, 0x11, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x10,
+ 0x02, 0x0f, 0x00, 0x1f,
+ 0x00, 0x00, 0xff, 0x10, 0x20, 0x01, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x10,
+ 0x00, 0x1f, 0x00, 0x20,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xfe, 0x00, 0xf0, 0x00, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x01, 0xf0, 0x01,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x01, 0x00, 0x01, 0x00, 0x01, 0xff, 0x10, 0x00, 0x11,
+ 0x00, 0x0f, 0x10, 0x11,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x10, 0x0f, 0xef, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0xf2, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x20, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x21, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x1f, 0x00, 0x10, 0x0e, 0x00, 0xf0,
+ 0x0f, 0x20, 0x00, 0xff,
+ 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x01, 0xe0, 0x01, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0x00,
+ 0xf0, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x01, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x1f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0xff, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x0e, 0x0f, 0x00, 0x1f, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x10,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x12, 0x10, 0x00, 0x00,
+ 0x00, 0x02, 0x10, 0x01,
+ 0x11, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xe0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0xe0, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0xf0, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0xff,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x02, 0x20, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x10, 0x00, 0x00, 0xff, 0x00,
+ 0x10, 0x1f, 0x00, 0x0f,
+ 0x10, 0x0f, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x0f, 0x20, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0x01,
+ 0xf1, 0x01, 0xe0, 0x00,
+ 0xf1, 0x01, 0xf0, 0x00, 0xf1, 0x01, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00,
+ 0xf0, 0x02, 0x00, 0x11,
+ 0x00, 0x10, 0x00, 0x1f, 0x00, 0x10, 0x1f, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x1f, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x0e, 0xf0, 0x00,
+ 0x0f, 0xff, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0xfe, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x11, 0x00, 0x00, 0xf1, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x21, 0x01, 0x10,
+ 0x00, 0x1f, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x20, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00, 0x01, 0xf0, 0xf1, 0x00, 0x01, 0x00, 0x01, 0xf0,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x20, 0x01,
+ 0xf1, 0x00, 0x00, 0x10,
+ 0x11, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x0f, 0x1f, 0x00, 0x0f, 0x1f,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x1f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xff, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0xf0, 0xf2, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xf0, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0xf0, 0x02, 0x10, 0x0e, 0x00,
+ 0xf0, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x01, 0x10,
+ 0x1f, 0x00, 0x00, 0x00,
+ 0xff, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x11, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0xf1, 0x00, 0xf0, 0xf0, 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x0e, 0x10, 0x00, 0x10, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x01, 0x10, 0x11, 0x12,
+ 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0xf1,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x1f, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x1f, 0x00,
+ 0x0f, 0x10, 0x1f, 0x0f,
+ 0x10, 0x1f, 0x00, 0x10, 0x1f, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x10,
+ 0x0f, 0x00, 0xfe, 0xf0,
+ 0x00, 0x1f, 0x0f, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x01, 0x01,
+ 0x00, 0xe0, 0x00, 0x01,
+ 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf0, 0x02, 0xf0, 0x01, 0x01, 0xf0,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x20, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x10,
+ 0x11, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x0f, 0x00, 0x1f, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0x01, 0xf0, 0xf1, 0x00, 0xf0, 0x00, 0x11, 0x12, 0x01, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x00, 0x01,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x11, 0x10, 0x01, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x0f, 0x0f, 0x1e,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x20,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0xf0, 0x01, 0x00, 0xf1, 0xf0, 0x00, 0x02, 0x00, 0x00, 0xf1, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0xf0, 0x0e, 0x00,
+ 0x10, 0x01, 0x0f, 0x00, 0x1f, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x20, 0x01,
+ 0xf1, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0xff, 0x00, 0xff, 0x0e,
+ 0x00, 0xf0, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x11, 0x10, 0x01, 0x20, 0x00,
+ 0x01, 0x00, 0x20, 0x10,
+ 0x01, 0x10, 0x00, 0x1f, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0xf1, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x11, 0x10, 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x02, 0x10, 0x1f,
+ 0x00, 0x00, 0xff, 0x1f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,
+ 0x0f, 0x10, 0x0f, 0x10,
+ 0x0f, 0x00, 0x10, 0x0e, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x01, 0xf1, 0xf0,
+ 0x00, 0x01, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0xf1, 0x01, 0xe0, 0x01, 0x00,
+ 0xe2, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x11, 0x11, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x10, 0x10, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0x1e, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0e, 0x0f, 0x00, 0x0f, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x11, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0xf0,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xe9, 0xfd, 0xc7, 0xfa, 0x57, 0xfe, 0x1d, 0xfb, 0x00, 0x10, 0x01, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x00, 0x00, 0x02, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x10,
+ 0x11, 0x0f, 0xf0, 0x0e,
+ 0x00, 0xf1, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0xf0, 0xf0,
+ 0x00, 0x11, 0x00, 0x02,
+ 0x00, 0x00, 0x0f, 0x00, 0x20, 0x01, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0x10, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x10, 0x1e, 0x00, 0x00, 0x1f,
+ 0x00, 0x1f, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0xf1, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x20, 0x01,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x10, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x00,
+ 0x10, 0x0f, 0x00, 0x10, 0x01, 0x10, 0x0f, 0x00, 0xf1, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x01,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0xff, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x0e, 0xe0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x20, 0x01, 0x00, 0x10,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x11, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x21, 0x00,
+ 0x1e, 0x00, 0x10, 0x10, 0x0f, 0x0f, 0x20, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0xfe, 0x00, 0x0f, 0x10, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0xf0,
+ 0xf0, 0x02, 0xf0, 0x00,
+ 0xf1, 0xf0, 0x01, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x01,
+ 0x00, 0x10, 0x01, 0xf0,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x0f, 0xf0, 0x00, 0x0f, 0x10, 0x00,
+ 0x1f, 0x10, 0x0f, 0xf0,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x1f, 0x00, 0xff, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x02, 0xf0, 0x0e, 0xf0,
+ 0x01, 0x00, 0xf0, 0x0f,
+ 0xf0, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x01, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x20, 0x00,
+ 0x00, 0x0f, 0x01, 0x10,
+ 0x00, 0x0f, 0x10, 0xf0, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x02, 0x00, 0xfe,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x01, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x10, 0x10, 0x1f,
+ 0x00, 0x0f, 0x0f, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0xf1, 0x00, 0x01, 0xf0,
+ 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xff, 0x00, 0x01, 0x11, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf0,
+ 0x01, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0x0f, 0x10, 0x00, 0x00,
+ 0x20, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x01, 0x11, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xf0, 0xff, 0x00,
+ 0xff, 0x00, 0xff, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x01, 0x20, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x0f, 0x00, 0xe1, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf1, 0x00,
+ 0x01, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x1f, 0x00, 0x00, 0x10,
+ 0x0f, 0x1f, 0x10, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00, 0xf0, 0xf1, 0x00, 0xf2, 0x00, 0xf0,
+ 0xf0, 0x00, 0xf2, 0x00,
+ 0x00, 0x01, 0xf0, 0x00, 0x11, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x00,
+ 0x0f, 0x0f, 0x10, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0xf0, 0xff, 0x00, 0xf1,
+ 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x10,
+ 0x01, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x10, 0x10, 0x00, 0x10,
+ 0x00, 0x11, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf0, 0xf1,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x10, 0x10, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x1f, 0x00,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x1e, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x10,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf2, 0x00, 0x00, 0x10, 0x0f, 0xe0, 0x00, 0xf1, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0xff, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xe0,
+ 0x0f, 0x0f, 0x00, 0xf0,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x11, 0x01, 0x00, 0x0f,
+ 0x10, 0x02, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xe1, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0xff, 0xf0, 0x00,
+ 0x00, 0xe0, 0x00, 0xf0,
+ 0xff, 0xf0, 0x02, 0xf0, 0xff, 0x00, 0x00, 0x01, 0x10, 0x0e, 0x00, 0x01,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x10, 0x02, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x10, 0x10, 0x0e, 0x00,
+ 0x20, 0x00, 0x20, 0x0f,
+ 0x0f, 0x10, 0x0f, 0x10, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01, 0xf0, 0xff, 0x00, 0x01, 0xe0, 0x01, 0x01, 0xf0,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x10, 0x11, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x0f, 0x0f, 0x10, 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0xf0, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xf0, 0x00,
+ 0x1f, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x10, 0x10,
+ 0x01, 0x0f, 0x10, 0x20,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0xff, 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x01, 0xf0, 0x00, 0xff, 0x01, 0x11, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0xf0, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x0e, 0x10, 0x10, 0x0f, 0x10, 0x0f, 0x10, 0x0f, 0x0f, 0x10, 0x00,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0xe1, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0xf0, 0x01, 0x10, 0x10,
+ 0x0f, 0x00, 0x10, 0x10,
+ 0x10, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xe0, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01,
+ 0x10, 0x21, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x10, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x11, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x01,
+ 0x10, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x21, 0x00,
+ 0x1f, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0x1f, 0x0f, 0xf0,
+ 0x00, 0x01, 0x00, 0x0f, 0xff, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0xf0, 0x01, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0xff, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0xff, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0xef, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x20, 0x00,
+ 0x00, 0x10, 0x00, 0x10, 0x02, 0x1f, 0xf0, 0x0f, 0xf0, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0xe0, 0x0f, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x20, 0x00, 0x01,
+ 0xf0, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0xf1, 0xf0, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x1f, 0x10, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x10,
+ 0x00, 0x01, 0x00, 0x1e,
+ 0x00, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x02, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0xf2, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x00, 0xe1, 0x01, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x20, 0x00, 0x10, 0x00, 0x10, 0x0f, 0x0f, 0xf0, 0x00, 0x20, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x10,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x01, 0x00, 0x10, 0x10, 0x00,
+ 0xf0, 0x00, 0x01, 0x11,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0x00, 0xf1, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x00, 0xf1, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xff,
+ 0x00, 0x20, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0xf1, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x04, 0x03, 0xf2, 0x05, 0x47, 0x03, 0xe1, 0x05, 0x00, 0x00, 0x20, 0x00,
+ 0x01, 0x20, 0x1f, 0x00,
+ 0x20, 0x00, 0x0f, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xff, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x01, 0xf0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00,
+ 0x0e, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x0f, 0x00, 0x1f,
+ 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x01, 0x01,
+ 0x00, 0xf1, 0x01, 0x00,
+ 0xf0, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x10, 0x0f,
+ 0x00, 0x00, 0x20, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xe1, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x11, 0x10, 0x10,
+ 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xef, 0x00, 0x0f, 0x10,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x22,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0xff, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0,
+ 0x01, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x01, 0x0f,
+ 0xe0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x0f, 0xe0, 0x01, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x20, 0x00, 0x10,
+ 0x00, 0x11, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0f,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x0e, 0xe0, 0x11, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x10, 0x00,
+ 0xf0, 0x11, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x00,
+ 0xf1, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x11, 0x10,
+ 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x20, 0x00, 0x10, 0x12, 0x00, 0x10, 0x02, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x01,
+ 0x00, 0x1e, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01,
+ 0xf0, 0xff, 0x00, 0x00,
+ 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x0e, 0x02, 0x00,
+ 0x1f, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x0f, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0xf0, 0x01,
+ 0x00, 0x0f, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0xff, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xef, 0x00, 0x01,
+ 0xf1, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0x10,
+ 0x01, 0x20, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xf0, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x01, 0xf1, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10,
+ 0xf1, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0x0f, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf1, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xef,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x11,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x10, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0xf1, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0x01, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0x00, 0x00,
+ 0x0e, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x20, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0xf0, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x1f, 0x00, 0xf1,
+ 0x00, 0x00, 0x21, 0x00,
+ 0xf0, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf1, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x11, 0x10, 0x01, 0x10, 0x10, 0x01, 0x10, 0x00, 0x0f, 0x21,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0xf0,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x0f, 0xf0, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x10,
+ 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x01, 0x10, 0x01, 0xf0, 0x0f, 0xf0, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0xf0,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x11,
+ 0x00, 0x0f, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x0f, 0xf0, 0x00,
+ 0x0f, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0xf0, 0x0f, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x10, 0x0f,
+ 0x00, 0xf0, 0x00, 0x20,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0xf1, 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x02, 0x1f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x10, 0x0f,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x0f, 0xf0, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x1e,
+ 0x00, 0xf1, 0xf0, 0x0f,
+ 0x1f, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x01, 0x00,
+ 0xf0, 0x00, 0x20, 0xf0,
+ 0x01, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x10, 0x10, 0x00, 0xf0, 0x00, 0x21, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x10, 0x01,
+ 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x2f, 0x00,
+ 0x02, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x1f, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0x00,
+ 0xff, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x01, 0xf1, 0x00, 0x00,
+ 0xf1, 0x01, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x7f, 0x00, 0x77, 0xff, 0x8d, 0x00, 0x3d, 0xff, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x2f, 0xf0, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0xff, 0x01,
+ 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0xff, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x00, 0x21, 0x00, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xf0, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0xff, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0xe0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1f,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x20, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x10, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf1, 0x00, 0xff, 0x00, 0xf0, 0x01, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x01, 0xf0, 0x0f, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x01,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xf1,
+ 0x00, 0x0f, 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x1f, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x10, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x0f, 0x0f, 0x00, 0x21, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x1f, 0x00, 0xf0, 0x00, 0xf0, 0x0f,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x00,
+ 0xf0, 0x01, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00,
+ 0x11, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0xf0, 0x10, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x20, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0xf0,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0xf0, 0x0f,
+ 0x10, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x11, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x1f,
+ 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xff, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0xf0, 0x00, 0x10,
+ 0x00, 0xe0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x11, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0xf0,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x1f, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00,
+ 0xff, 0x00, 0x11, 0x00,
+ 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0x01, 0x10,
+ 0xf0, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0xf1,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x01, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xff, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x01,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x11,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf1,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x1f,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xf0,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f,
+ 0x10, 0x0f, 0x10, 0x00,
+ 0x00, 0x10, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x0f, 0xf0, 0x00, 0x0f, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x01, 0x00, 0x00,
+ 0x0f, 0xf1, 0x00, 0x01, 0x10, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x0e, 0x00, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x01, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x01, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0xff,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0xf0, 0xf0, 0x00, 0x10,
+ 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1,
+ 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x02, 0x00, 0x1f,
+ 0x00, 0x02, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x0e, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0x1f, 0x00, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x00, 0x11, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x01, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x10, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x51, 0xfc, 0x95, 0xf8, 0x41, 0xfc, 0xb6, 0xf8, 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x1f,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x0f, 0x00, 0x10, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x20,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0xf0,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x20, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x10, 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x01, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x10,
+ 0x00, 0x01, 0xf0, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0xf1, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x1f, 0x0f, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x1f,
+ 0x00, 0x10, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0xf1, 0x00, 0x11, 0x00,
+ 0x00, 0x1f, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x01, 0xf0, 0x00,
+ 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0x01, 0x01, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x10, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x00, 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0xf0, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x1f, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x1f,
+ 0x00, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00,
+ 0x01, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x11,
+ 0x00, 0x10, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x1f,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x10, 0xf0, 0x00, 0x00, 0x01, 0x00,
+ 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x0f, 0x10, 0x10,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x0f, 0xe0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0xf0,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0x01, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0xf0, 0x0f, 0xf0,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf1, 0x00, 0x1e, 0x10, 0x01, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf1, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf1, 0xf0,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xe0, 0x0f, 0x10, 0x00, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x1f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0xff, 0x00, 0x02, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0xff, 0x0f, 0x00,
+ 0x01, 0x00, 0xf0, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc9, 0xff, 0x3c, 0x00, 0xcc, 0xff, 0x43, 0x00, 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x01, 0x10, 0x0f, 0xe0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x10, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0, 0xf1,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x10,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x0f, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x0f, 0xf0, 0x00,
+ 0x0f, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x11, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x01, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x1f, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x10, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0xf1,
+ 0xf0, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xff, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x0f, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0xff, 0xf0, 0x01,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x0f,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x0f,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x01, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x01, 0x11, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x0f, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x00, 0xf0,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x10, 0x01, 0x00, 0xfe,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xff, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0,
+ 0xf1, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x0e, 0x00, 0x01, 0xf0, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0xff, 0x00, 0x00, 0x1f,
+ 0x00, 0xf0, 0x01, 0xf0, 0x0e, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x01, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0xff, 0x00, 0x01,
+ 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x10, 0x01, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x00, 0xf0, 0x01, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb0, 0xff, 0xe7, 0xfe, 0xa9, 0xff, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0e, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x01,
+ 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x10, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0xff, 0x00, 0x11, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x10, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x01, 0x00, 0x10, 0x0f, 0xf0, 0x01, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0x0f,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf1, 0x00, 0x2f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0xff, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x0f, 0x01,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x1f, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x1f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x0f, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x0f, 0x10, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0e,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x11, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x11, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x11, 0x00, 0xf0, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0xff,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0e, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x1f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf1, 0x00,
+ 0x0f, 0x00, 0xf1, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0x01, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x10,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0xff,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf1, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x10, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3b, 0xfe, 0x38, 0xfe, 0x41, 0xfe, 0x56, 0xfe, 0x00, 0xfe, 0xf0, 0x0f,
+ 0xff, 0xf0, 0x0e, 0xf0,
+ 0x0f, 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f,
+ 0x00, 0xff, 0xff, 0x0f,
+ 0xf0, 0x0f, 0xf0, 0x0e, 0xf0, 0x0f, 0x00, 0xfe, 0x00, 0xf0, 0x0f, 0xff,
+ 0x0f, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xff, 0x00,
+ 0xff, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x10, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x11,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x11, 0x01, 0x10, 0x00,
+ 0x00, 0x11, 0x00, 0x10,
+ 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xff, 0x00, 0xf0, 0x0f, 0x0f,
+ 0xf0, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0xf0, 0x00, 0x0f, 0x0f,
+ 0xf0, 0xf0, 0x0f, 0x00,
+ 0xff, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0xf0,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0xf0, 0x01,
+ 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x01,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x10, 0x01, 0x10, 0x00, 0x10, 0x10, 0x01, 0x10, 0x11, 0x00, 0x10, 0x11,
+ 0x00, 0x11, 0x00, 0x11,
+ 0x10, 0x01, 0x11, 0x10, 0x00, 0x12, 0x00, 0x11, 0x10, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x01,
+ 0x10, 0x01, 0x11, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x11, 0x00,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x10, 0x01, 0x00,
+ 0xf0, 0x01, 0x11, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0xf1, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0f, 0xf0,
+ 0x0f, 0xff, 0x00, 0xff,
+ 0x0f, 0xf0, 0x0f, 0x00, 0xfe, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f,
+ 0x0f, 0xff, 0x00, 0xff,
+ 0x00, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x0f,
+ 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x11, 0x00, 0x10, 0x00, 0x01, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xf0,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x01, 0x11, 0x10, 0x00, 0x00, 0x11, 0x00, 0x11, 0x01, 0x10, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x10, 0x01, 0x10, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x11, 0x10, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x00, 0x10, 0x01, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0,
+ 0x00, 0xff, 0x0f, 0x0f,
+ 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0x0f, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xff,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x14, 0x00, 0x2f, 0x00, 0x1b, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x00, 0x11, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x01, 0x10, 0x00, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x01, 0x10, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x0f, 0x00, 0x00,
+ 0xff, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xf6, 0xff, 0xc8, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0xf0,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x1f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xd1, 0xff, 0xc4, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xfe, 0xef, 0x0e, 0xef,
+ 0xfe, 0xff, 0xee, 0xfe, 0xff, 0xee, 0xfe, 0xef, 0xfd, 0xff, 0xee, 0xfe,
+ 0xee, 0xfe, 0xfe, 0xee,
+ 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xfd,
+ 0xef, 0x0d, 0xee, 0xfe,
+ 0xfe, 0xfd, 0xfe, 0xfe, 0xee, 0x0e, 0xed, 0x0f, 0xed, 0xff, 0xfd, 0xff,
+ 0xfe, 0xfe, 0xee, 0x0f,
+ 0xee, 0x0e, 0xef, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xf0, 0x0f, 0xef, 0x00, 0xff, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x11, 0x00, 0x10, 0x01, 0x10, 0x10,
+ 0x01, 0x10, 0x10, 0x01,
+ 0x10, 0x10, 0x01, 0x10, 0x11, 0x00, 0x10, 0x01, 0x11, 0x10, 0x00, 0x11,
+ 0x01, 0x10, 0x00, 0x11,
+ 0x01, 0x10, 0x00, 0x01, 0x11, 0x00, 0x11, 0x00, 0x01, 0x11, 0x00, 0x11,
+ 0x00, 0x01, 0x11, 0x00,
+ 0x01, 0x10, 0x01, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01,
+ 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10, 0x10, 0x00, 0x00,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x00, 0x10, 0x11, 0x00, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x01, 0x10,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x11, 0x10, 0x01, 0x10, 0x10, 0x01, 0x11, 0x10, 0x00, 0x11, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x11,
+ 0x00, 0x01, 0x10, 0x01, 0x11, 0x00, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
+ 0xf0, 0x0f, 0xf0, 0x00,
+ 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x0f, 0xe0, 0x0f,
+ 0xf0, 0x00, 0xff, 0xf0,
+ 0x0f, 0xf0, 0xff, 0x00, 0xff, 0x00, 0xef, 0x00, 0x0f, 0xef, 0x00, 0xf0,
+ 0x0e, 0xe0, 0x00, 0xff,
+ 0x0f, 0xe0, 0x0f, 0xf0, 0xff, 0x00, 0xef, 0x00, 0xf0, 0xff, 0xf0, 0x00,
+ 0xef, 0x00, 0xf0, 0xf0,
+ 0xff, 0x00, 0xf0, 0xf0, 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0xf0,
+ 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x01, 0x10, 0x10, 0x01, 0x00, 0x10, 0x11, 0x00, 0x00, 0x10, 0x11,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x01, 0x00, 0x10, 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x11, 0x00,
+ 0x10, 0x00, 0x10, 0x11,
+ 0x00, 0x10, 0x10, 0x01, 0x10, 0x10, 0x00, 0x21, 0x00, 0x10, 0x11, 0x10,
+ 0x10, 0x01, 0x20, 0x00,
+ 0x11, 0x10, 0x00, 0x21, 0x00, 0x10, 0x01, 0x20, 0x00, 0x11, 0x00, 0x11,
+ 0x10, 0x00, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x00, 0x10, 0x01, 0x01, 0x10, 0x00, 0x01, 0x10, 0x01,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x01, 0x00, 0x10, 0x01, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0xf1, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f,
+ 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x0f,
+ 0xff, 0x0f, 0xff, 0x0f, 0xf0, 0x0e, 0xf0, 0x0e, 0xf0, 0x0f, 0xff, 0x0f,
+ 0xff, 0x0f, 0xf0, 0x0e,
+ 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0xf0, 0x0f,
+ 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+#endif /* WAVEDATA_H */
diff --git a/usr/src/cmd/audio/mixerctl/Makefile b/usr/src/cmd/audio/mixerctl/Makefile
index 258b75f792..bc800eb4a6 100644
--- a/usr/src/cmd/audio/mixerctl/Makefile
+++ b/usr/src/cmd/audio/mixerctl/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Makefile for cmd/audio/mixerctl
PROG= mixerctl
diff --git a/usr/src/cmd/audio/mixerctl/mixerctl.c b/usr/src/cmd/audio/mixerctl/mixerctl.c
index 16509a5b71..2449003649 100644
--- a/usr/src/cmd/audio/mixerctl/mixerctl.c
+++ b/usr/src/cmd/audio/mixerctl/mixerctl.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,680 +19,1181 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <strings.h>
+#include <locale.h>
+#include <libintl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/param.h>
+#include <sys/soundcard.h>
+
+#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
+#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
+#endif
+
+#define _(s) gettext(s)
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
+#define AUDIO_CTRL_STEREO_LEFT(v) ((uint8_t)((v) & 0xff))
+#define AUDIO_CTRL_STEREO_RIGHT(v) ((uint8_t)(((v) >> 8) & 0xff))
+#define AUDIO_CTRL_STEREO_VAL(l, r) (((l) & 0xff) | (((r) & 0xff) << 8))
+
/*
- * mixerctl command:
- * mixerctl [-a|-d dev] [-iv] [-e|-o]
- *
- * NOTE: Option D is not documented, it is for debugging.
+ * Column display information
+ * All are related to the types enumerated in col_t and any change should be
+ * reflected in the corresponding indices and offsets for all the variables
+ * accordingly. Most tweaks to the display can be done by adjusting the
+ * values here.
*/
-#include <stdio.h>
-#include <stdlib.h> /* getopt() */
-#include <errno.h> /* errno */
-#include <strings.h> /* strrchr(), strcpy(), strcat(), strerror() */
-#include <locale.h> /* setlocale() */
-#include <libintl.h> /* textdomain(), gettext() */
-#include <sys/types.h> /* open(), fstat() */
-#include <sys/stat.h> /* open(), fstat() */
-#include <fcntl.h> /* open() */
-#include <unistd.h> /* close(), ioctl() */
-#include <stropts.h> /* ioctl() */
-#include <ctype.h> /* isdigit() */
-#include <dirent.h> /* opendir(), readdir(), closedir() */
-#include <sys/audioio.h>
-#include <sys/mixer.h>
-
-#define GETOPT "ad:iveoD"
-
-#define DEFAULT_DEVICE "/dev/audioctl"
-#define CONTROL "ctl"
-
-#define SOUND_DIR "/dev/sound"
-#define DOT "."
-#define DOTDOT ".."
-#define SLASH "/"
-
-#define ENV "AUDIODEV"
-
-#define AUX1 "AUX1"
-#define AUX2 "AUX2"
-#define CD "CD"
-#define HDPHONE "HDPHONE"
-#define LINE "LINE"
-#define LOOPBACK "CODEC LOOPBACK"
-#define MIC "MIC"
-#define NONE "NONE"
-#define SPDIF "SPDIF"
-#define SPEAKER "SPKR"
-#define SUNVTSLB "SunVTS LOOPBACK"
-#define UNKNOWN "UNKNOWN"
-#define SEPARATOR "|"
-
-#define ALL_PLAY_PORTS (AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT|\
- AUDIO_SPDIF_OUT|AUDIO_AUX1_OUT|AUDIO_AUX2_OUT)
-#define ALL_REC_PORTS (AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CD|\
- AUDIO_SPDIF_IN|AUDIO_AUX1_IN|AUDIO_AUX2_IN|\
- AUDIO_CODEC_LOOPB_IN|AUDIO_SUNVTS)
-
-#define BUF_SIZE 128
-#define PPORT_STR_SIZE 30
-
-#define NOT_SUPPORTED (-1)
-
-typedef struct info {
- char *pgm;
- char *opt;
- char *device;
- int all;
- int debug;
- int disable;
- int enable;
- int info;
- int verbose;
-} info_t;
-
-/* local functions */
-static int doit(info_t *, char *);
-static void pport2str(uint_t, char *);
-static void rport2str(uint_t, char *);
+/* types of columns displayed */
+typedef enum { COL_DV = 0, COL_NM, COL_VAL, COL_TYP, COL_SEL} col_t;
-int
-main(const int argc, char * const *argv)
+/* corresponding sizes of columns; does not include trailing null */
+#define COL_DV_SZ 16
+#define COL_NM_SZ 24
+#define COL_VAL_SZ 10
+#define COL_TYP_SZ 8
+#define COL_SEL_SZ 20
+#define COL_MAX_SZ 64
+
+/* corresponding sizes of columns, indexed by col_t value */
+static int col_sz[] = {
+ COL_DV_SZ, COL_NM_SZ, COL_VAL_SZ, COL_TYP_SZ, COL_SEL_SZ
+};
+
+/* used by callers of the printing function */
+typedef struct col_prt {
+ char *col_dv;
+ char *col_nm;
+ char *col_val;
+ char *col_typ;
+ char *col_sel;
+} col_prt_t;
+
+/* columns displayed in order with vopt = 0 */
+static int col_dpy[] = {COL_DV, COL_NM, COL_VAL, COL_SEL};
+static int col_dpy_len = sizeof (col_dpy) / sizeof (*col_dpy);
+
+/* tells the printing function what members to use; follows col_dpy[] */
+static size_t col_dpy_prt[] = {
+ offsetof(col_prt_t, col_dv),
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val),
+ offsetof(col_prt_t, col_sel)
+};
+
+/* columns displayed in order with vopt = 1 */
+static int col_dpy_vopt[] = { COL_NM, COL_VAL, COL_TYP, COL_SEL};
+static int col_dpy_vopt_len = sizeof (col_dpy_vopt) / sizeof (*col_dpy_vopt);
+
+/* tells the printing function what members to use; follows col_dpy_vopt[] */
+static size_t col_dpy_prt_vopt[] = {
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val),
+ offsetof(col_prt_t, col_typ),
+ offsetof(col_prt_t, col_sel)
+};
+
+/* columns displayed in order with tofile = 1 */
+static int col_dpy_tofile[] = { COL_NM, COL_VAL};
+static int col_dpy_tofile_len = sizeof (col_dpy_tofile) /
+ sizeof (*col_dpy_tofile);
+
+/* tells the printing function what members to use; follows col_dpy_tofile[] */
+static size_t col_dpy_prt_tofile[] = {
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val)
+};
+
+
+/*
+ * mixer and control accounting
+ */
+
+typedef struct cinfo {
+ oss_mixext ci;
+ oss_mixer_enuminfo *enump;
+} cinfo_t;
+
+typedef struct mlist {
+ oss_card_info cdi;
+ oss_mixerinfo mi;
+
+ int cmax;
+ cinfo_t *controls;
+
+ int mfd;
+
+ struct mlist *nextp;
+} mlist_t;
+
+
+/*PRINTFLIKE1*/
+static void
+msg(char *fmt, ...)
{
- DIR *dirp;
- struct dirent *dp;
- info_t info;
- char dev_buffer[BUF_SIZE];
- int c;
- int errflag = 0;
+ va_list ap;
- (void) setlocale(LC_ALL, "");
+ va_start(ap, fmt);
+ (void) vprintf(fmt, ap);
+ va_end(ap);
+}
-#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
-#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
-#endif
- (void) textdomain(TEXT_DOMAIN);
+/*PRINTFLIKE1*/
+static void
+warn(char *fmt, ...)
+{
+ va_list ap;
- /* make sure info structure is zeroed out */
- (void) memset(&info, 0, sizeof (info));
+ va_start(ap, fmt);
+ (void) vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
- if (info.pgm = strrchr(argv[0], '/')) {
- ++info.pgm;
- } else {
- info.pgm = argv[0];
- }
- info.opt = GETOPT;
+static void
+mixers_free(mlist_t **mlistpp)
+{
+ mlist_t *mlp = *mlistpp;
+ mlist_t *nextp;
+ int i;
- /* check for options, they're listed at the top */
- while ((c = getopt(argc, argv, info.opt)) != EOF) {
- switch (c) {
- case 'a': info.all++; break;
- case 'd': (void) strcpy(dev_buffer, optarg);
- info.device = dev_buffer;
- break;
- case 'e': info.enable++; break;
- case 'o': info.disable++; break;
- case 'i': info.info++; break;
- case 'v': info.verbose++; break;
- case 'D': info.debug++; break;
- default: errflag++; break;
+ while (mlp != NULL) {
+ nextp = mlp->nextp;
+
+ for (i = 0; i < mlp->cmax; i++) {
+ if (mlp->controls[i].enump != NULL)
+ free(mlp->controls[i].enump);
}
+
+ if (mlp->mfd >= 0)
+ (void) close(mlp->mfd);
+
+ free(mlp);
+ mlp = nextp;
}
- /* now we do some checks to make sure we haven't done anything bad */
- if (errflag || (info.all && info.device) ||
- (info.enable && info.disable) || optind != argc) {
- (void) fprintf(stderr,
- gettext("usage: %s [-a|-d dev] [-iv] [-e|-o]\n"),
- info.pgm);
- return (1);
+ *mlistpp = NULL;
+}
+
+
+/*
+ * adds to the end of mlistpp and returns a pointer to the new entry
+ */
+static mlist_t *
+mlist_addnew(mlist_t **mlistpp)
+{
+ mlist_t *p;
+ mlist_t *mlp = calloc(1, sizeof (*mlp));
+
+ mlp->cdi.card = -1;
+ mlp->mi.dev = -1;
+ mlp->mfd = -1;
+
+ if (*mlistpp == NULL)
+ *mlistpp = mlp;
+ else {
+ for (p = *mlistpp; p->nextp != NULL; p = p->nextp) {}
+
+ p->nextp = mlp;
+ }
+ return (mlp);
+}
+
+
+/*
+ * cinfop->enump needs to be present
+ * idx should be: >= 0 to < cinfop->ci.maxvalue
+ */
+static char *
+get_enum_str(cinfo_t *cinfop, int idx)
+{
+ int sz = sizeof (*cinfop->ci.enum_present) * 8;
+
+ if (cinfop->ci.enum_present[idx / sz] & (1 << (idx % sz)))
+ return (cinfop->enump->strings + cinfop->enump->strindex[idx]);
+
+ return (NULL);
+}
+
+
+/*
+ * caller fills in mlistp->mi.devnode; func fills in the rest
+ */
+static int
+mlist_getinfo(mlist_t *mlistp)
+{
+ int mfd = -1;
+ int rv = -1;
+ int i;
+ char *mpath = mlistp->mi.devnode;
+ cinfo_t *cinfop;
+
+ mfd = open(mpath, O_RDWR);
+ if (mfd < 0) {
+ rv = errno;
+ perror(_("Error opening mixer"));
+ goto OUT;
}
+ mlistp->mfd = mfd;
- /* make sure we have something to do */
- if (!info.disable && !info.enable && !info.info && !info.verbose) {
- info.info++;
+ if (ioctl(mfd, SNDCTL_CARDINFO, &mlistp->cdi) < 0) {
+ rv = errno;
+ perror(_("Error getting card info"));
+ goto OUT;
}
- /* if "all" then we loop, otherwise we just take care of business */
- if (info.all) {
- /*
- * Devices in /dev/sound are in the form of:
- * dev_number{function}
- *
- * Currently there are only entries like /dev/sound/0 (audio
- * device) and /dev/sound/0ctl (audio control device).
- */
- if ((dirp = opendir(SOUND_DIR)) == NULL) {
- (void) fprintf(stderr, gettext(
- "Couldn't open directory %s: %s\n"), SOUND_DIR,
- strerror(errno));
- return (1);
+ mlistp->cmax = -1;
+ if (ioctl(mfd, SNDCTL_MIX_NREXT, &mlistp->cmax) < 0) {
+ rv = errno;
+ perror(_("Error getting control count"));
+ goto OUT;
+ }
+
+ mlistp->controls = calloc(mlistp->cmax, sizeof (*mlistp->controls));
+
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
+
+ cinfop->ci.dev = -1;
+ cinfop->ci.ctrl = i;
+
+ if (ioctl(mfd, SNDCTL_MIX_EXTINFO, &cinfop->ci) < 0) {
+ rv = errno;
+ perror(_("Error getting control info"));
+ goto OUT;
}
- while ((dp = readdir(dirp)) != NULL) {
- char *cp = dp->d_name;
+ if (cinfop->ci.type == MIXT_ENUM) {
+ cinfop->enump = calloc(1, sizeof (*cinfop->enump));
+ cinfop->enump->dev = -1;
+ cinfop->enump->ctrl = cinfop->ci.ctrl;
- /* skip . and .. */
- if (strcmp(cp, DOT) == 0 || strcmp(cp, DOTDOT) == 0) {
- if (info.debug) {
- (void) printf(gettext("Skipping %s\n"),
- cp);
- }
- continue;
+ if (ioctl(mfd, SNDCTL_MIX_ENUMINFO,
+ cinfop->enump) < 0) {
+ rv = errno;
+ perror(_("Error getting enum info"));
+ goto OUT;
}
+ }
+ }
- /* go past the device number */
- while (isdigit(*cp)) {
- cp++;
- }
+ rv = 0;
- /* if next char is NULL then not an audio ctl device */
- if (*cp == '\0') {
- if (info.debug) {
- (void) printf(gettext("Skipping %s\n"),
- dp->d_name);
- }
- continue;
- }
+OUT:
+ if (rv != 0) {
+ (void) close(mfd);
+ mlistp->mfd = -1;
+ }
+ return (rv);
+}
- if (strcmp(cp, CONTROL) == 0) {
- /* we've got a control device, so call it */
- (void) strcpy(dev_buffer, SOUND_DIR);
- (void) strcat(dev_buffer, SLASH);
- (void) strcat(dev_buffer, dp->d_name);
- if (info.debug) {
- (void) printf(gettext(
- "Found device: %s\n"), dev_buffer);
- }
+static int
+mixers_getinfo(char *devname, mlist_t **mlistpp)
+{
+ int rv = -1;
+ int fd = -1;
+ int i;
+ oss_sysinfo si;
+ oss_mixerinfo mi;
+ mlist_t *mlp;
+ char *mdef;
- /* we don't bother with the return code */
- (void) doit(&info, dev_buffer);
- }
+ mdef = devname ? devname : "/dev/mixer";
+
+ if ((fd = open(mdef, O_RDWR)) < 0) {
+ rv = errno;
+ warn(_("Error opening mixer\n"));
+ goto OUT;
+ }
+
+ if (devname == NULL) {
+ if (ioctl(fd, SNDCTL_SYSINFO, &si) < 0) {
+ rv = errno;
+ perror(_("Error getting system information"));
+ goto OUT;
}
- (void) closedir(dirp);
+ for (i = 0; i < si.nummixers; i++) {
+ mi.dev = i;
+ if (ioctl(fd, SNDCTL_MIXERINFO, &mi) != 0)
+ continue;
+
+ mi.dev = -1;
+ mlp = mlist_addnew(mlistpp);
+ mlp->mi = mi;
+
+ rv = mlist_getinfo(mlp);
+ if (rv != 0)
+ goto OUT;
+ }
} else {
- /* make sure we've got a good device */
- if (info.device == NULL) {
- if ((info.device = getenv(ENV)) == NULL) {
- if (info.debug) {
- (void) printf(gettext(
- "using default device: %s\n"),
- DEFAULT_DEVICE);
- }
- info.device = DEFAULT_DEVICE;
- } else {
- /* using ENV value, so get it */
- (void) strcpy(dev_buffer, info.device);
- info.device = dev_buffer;
- if (info.debug) {
- (void) printf(gettext(
- "using ENV device: %s\n"),
- info.device);
- }
- }
+ mi.dev = -1;
+ if (ioctl(fd, SNDCTL_MIXERINFO, &mi) != 0) {
+ rv = errno;
+ perror(_("Error getting mixer information"));
+ goto OUT;
}
- /* we have a device, make sure it is a control device */
- if (strspn(CONTROL, info.device) != strlen(CONTROL)) {
- (void) strcpy(dev_buffer, info.device);
- (void) strcat(dev_buffer, CONTROL);
- info.device = dev_buffer;
+ mi.dev = -1;
+ mlp = mlist_addnew(mlistpp);
+ mlp->mi = mi;
+
+ rv = mlist_getinfo(mlp);
+ if (rv != 0)
+ goto OUT;
+ }
+
+ rv = 0;
+
+OUT:
+ if (fd >= 0)
+ (void) close(fd);
+ return (rv);
+}
+
+
+static void
+mixers_prt_mlist(FILE *sfp, int tofile, mlist_t *mlistp)
+{
+ oss_card_info *cdip = &mlistp->cdi;
+
+ if (tofile) {
+ (void) fprintf(sfp, "# Device: %s\n", mlistp->mi.devnode);
+ (void) fprintf(sfp, "# Name = %s\n", cdip->shortname);
+ (void) fprintf(sfp, "# Config = %s\n", cdip->longname);
+
+ if (strlen(cdip->hw_info)) {
+ (void) fprintf(sfp, "# HW Info = %s",
+ cdip->hw_info);
}
- if (info.debug) {
- (void) printf(
- gettext("calling doit(%s)\n"), info.device);
+ (void) fprintf(sfp, "#\n");
+ } else {
+ msg(_("Device: %s\n"), mlistp->mi.devnode);
+ msg(_(" Name = %s\n"), cdip->shortname);
+ msg(_(" Config = %s\n"), cdip->longname);
+
+ if (strlen(cdip->hw_info)) {
+ msg(_(" HW Info = %s"), cdip->hw_info);
}
- return (doit(&info, info.device));
+
+ msg("\n");
}
+}
- return (0);
-} /* main() */
+static char *
+ctype_str(int type)
+{
+ switch (type) {
+ case MIXT_DEVROOT:
+ return (_("root"));
+ case MIXT_ONOFF:
+ return (_("boolean"));
+ case MIXT_ENUM:
+ return (_("enum"));
+ case MIXT_MONOSLIDER:
+ return (_("mono"));
+ case MIXT_STEREOSLIDER:
+ return (_("stereo"));
+ case MIXT_MARKER:
+ return (_("marker"));
+ case MIXT_GROUP:
+ return (_("group"));
+ default:
+ return (_("unknown"));
+ }
+}
+
-/*
- * doit()
- *
- * Description:
- * This routine does all the real work
- *
- * Arguments:
- * info_t *info Program info
- * char *dev Device
- *
- * Returns:
- * 1 Error
- * 0 Okay
- */
static int
-doit(info_t *info, char *dev)
+ctype_valid(int type)
{
- audio_device_t dev_info;
- audio_info_t audio_info;
- struct stat buf;
- char *pencoding;
- char *rencoding;
- char pport_buf[BUF_SIZE];
- char rport_buf[BUF_SIZE];
- int fd;
- int mode;
- int new_mode;
- int rc = 0;
-
- /* first, make sure the device is there */
- if ((fd = open(dev, O_RDONLY)) < 0) {
- /* return a meaningful error message if possible */
- switch (errno) {
- case EPERM :
- case EACCES :
- (void) fprintf(stderr,
- gettext("%s: device %s permission denied\n"),
- info->pgm, dev);
- break;
- case ENOENT :
- case ENXIO :
- case ENODEV :
- (void) fprintf(stderr,
- gettext("%s: device %s does not exist\n"),
- info->pgm, dev);
- break;
- default:
- (void) fprintf(stderr,
- gettext("%s: device %s not available\n"),
- info->pgm, dev);
- break;
- }
+ switch (type) {
+ case MIXT_ONOFF:
+ case MIXT_ENUM:
+ case MIXT_MONOSLIDER:
+ case MIXT_STEREOSLIDER:
return (1);
+ default:
+ return (0);
}
+}
- /* make sure it is a special device */
- if (fstat(fd, &buf) < 0) {
- (void) fprintf(stderr,
- gettext("%s: fstat() of %s failed\n"), info->pgm, dev);
- (void) close(fd);
- return (1);
+
+static void
+mixers_prt_ctl_line(FILE *sfp, int tofile, col_prt_t *colp, int vopt)
+{
+ int i;
+ size_t *col_prtp;
+ int *col_dpyp;
+ int col_cnt;
+ int col_type;
+ int width;
+ char *colstr;
+ char cbuf[COL_MAX_SZ + 1];
+ char line[128];
+ char *colsep = " ";
+
+ if (tofile) {
+ col_prtp = col_dpy_prt_tofile;
+ col_dpyp = col_dpy_tofile;
+ col_cnt = col_dpy_tofile_len;
+ } else if (vopt) {
+ col_prtp = col_dpy_prt_vopt;
+ col_dpyp = col_dpy_vopt;
+ col_cnt = col_dpy_vopt_len;
+ } else {
+ col_prtp = col_dpy_prt;
+ col_dpyp = col_dpy;
+ col_cnt = col_dpy_len;
}
- if (!S_ISCHR(buf.st_mode)) {
- (void) fprintf(stderr,
- gettext("%s: %s is not a character special device\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
+
+ line[0] = '\0';
+
+ for (i = 0; i < col_cnt; i++) {
+ col_type = col_dpyp[i];
+ width = col_sz[col_type];
+ colstr = *(char **)(((size_t)colp) + col_prtp[i]);
+
+ (void) snprintf(cbuf, sizeof (cbuf), "%- *s",
+ width > 0 ? width : 1,
+ (colstr == NULL) ? "" : colstr);
+
+ (void) strlcat(line, cbuf, sizeof (line));
+ if (i < col_cnt - 1)
+ (void) strlcat(line, colsep, sizeof (line));
}
- /* if verbose or info wanted, we get the device info */
- if (info->verbose || info->info) {
- if (ioctl(fd, AUDIO_GETDEV, &dev_info) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: AUDIO_GETDEV ioctl() for device %s failed\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
- }
+ (void) fprintf(sfp, "%s\n", line);
+}
- (void) printf(gettext("Device %s:\n"), dev);
- (void) printf(gettext(" Name = %s\n"), dev_info.name);
- (void) printf(gettext(" Version = %s\n"), dev_info.version);
- (void) printf(gettext(" Config = %s\n"), dev_info.config);
- }
-
- /* get the mixer mode, if there is a mixer */
- if (ioctl(fd, AUDIO_MIXERCTL_GET_MODE, &mode) < 0) {
- (void) printf(
- gettext("\n%s doesn't support the audio mixer function\n"),
- dev);
- mode = NOT_SUPPORTED;
- } else if (!info->enable && !info->disable) {
- (void) printf(gettext("\nAudio mixer for %s is %s\n"),
- dev, (mode == AM_MIXER_MODE ?
- gettext("enabled") : gettext("disabled")));
- } else if (info->enable) {
- new_mode = AM_MIXER_MODE;
- if (mode != AM_MIXER_MODE) {
- if (ioctl(fd, AUDIO_MIXERCTL_SET_MODE, &new_mode) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: couldn't enable audio mixer for %s\n"),
- info->pgm, dev);
- rc = 1;
- }
- }
- if (!rc) {
- (void) printf(gettext(
- "Audio mixer for %s is enabled\n"), dev);
- }
+
+static void
+mixers_prt_ctl_hdr(FILE *sfp, int tofile, int vopt)
+{
+ col_prt_t col;
+
+ if (tofile) {
+ col.col_nm = _("#CONTROL");
+ col.col_val = _("VALUE");
} else {
- /* sanity check */
- if (!info->disable) {
- (void) fprintf(stderr,
- gettext("%s: program error #1\n"), info->pgm);
- rc = 1;
- } else if (mode != AM_COMPAT_MODE) {
- new_mode = AM_COMPAT_MODE;
- if (ioctl(fd, AUDIO_MIXERCTL_SET_MODE, &new_mode) < 0) {
- (void) fprintf(stderr, gettext("%s: "
- "couldn't disable audio mixer for %s\n"),
- info->pgm, dev);
- rc = 1;
- }
- }
- if (!rc) {
- (void) printf(gettext(
- "Audio mixer for %s is disabled\n"), dev);
- }
+ col.col_dv = _("DEVICE");
+ col.col_nm = _("CONTROL");
+ col.col_val = _("VALUE");
+ col.col_typ = _("TYPE");
+ col.col_sel = _("POSSIBLE");
}
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
+}
- /* only for verbose do we get the device's info_t structure */
- if (info->verbose) {
- if (ioctl(fd, AUDIO_GETINFO, &audio_info) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: AUDIO_GETINFO ioctl() for device %s failed\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
- }
- switch (audio_info.play.encoding) {
- case AUDIO_ENCODING_ULAW:
- pencoding = gettext("u-law");
- break;
- case AUDIO_ENCODING_ALAW:
- pencoding = gettext("A-law");
- break;
- case AUDIO_ENCODING_LINEAR:
- pencoding = gettext("linear");
- break;
- default:
- pencoding = gettext("UNKNOWN");
- break;
- }
+static int
+mixers_prt_cinfo(FILE *sfp, int tofile, mlist_t *mlistp, cinfo_t *cinfop,
+ int vopt)
+{
+ int mfd = mlistp->mfd;
+ char *devnm = mlistp->cdi.shortname;
+ oss_mixer_value cval;
+ char *str;
+ int i;
+ int idx = -1;
+ int rv = -1;
+ char valbuf[COL_VAL_SZ + 1];
+ char selbuf[COL_SEL_SZ + 1];
+ col_prt_t col;
- switch (audio_info.record.encoding) {
- case AUDIO_ENCODING_ULAW:
- rencoding = gettext("u-law");
- break;
- case AUDIO_ENCODING_ALAW:
- rencoding = gettext("A-law");
- break;
- case AUDIO_ENCODING_LINEAR:
- rencoding = gettext("linear");
- break;
- default:
- rencoding = gettext("UNKNOWN");
- break;
- }
+ cval.dev = -1;
+ cval.ctrl = cinfop->ci.ctrl;
- (void) printf(
- gettext("Sample Rate\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.sample_rate, audio_info.record.sample_rate);
- (void) printf(gettext("Channels\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.channels, audio_info.record.channels);
- (void) printf(
- gettext("Precision\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.precision, audio_info.record.precision);
- (void) printf(gettext("Encoding\n Play\t\t%u (%s)\n"),
- audio_info.play.encoding, pencoding);
- (void) printf(gettext(" Record\t%u (%s)\n"),
- audio_info.record.encoding, rencoding);
- (void) printf(gettext("Gain\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.gain, audio_info.record.gain);
- (void) printf(gettext("Balance\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.balance, audio_info.record.balance);
- pport2str(audio_info.play.port, pport_buf),
- rport2str(audio_info.record.port, rport_buf),
- (void) printf(
- gettext("Port\n Play\t\t0x%08x %s\n Record\t0x%08x %s\n"),
- audio_info.play.port, pport_buf,
- audio_info.record.port, rport_buf);
- pport2str(audio_info.play.avail_ports, pport_buf),
- rport2str(audio_info.record.avail_ports, rport_buf),
- (void) printf(
- gettext("Avail Ports\n Play\t\t0x%08x %s\n"
- " Record\t0x%08x %s\n"),
- audio_info.play.avail_ports, pport_buf,
- audio_info.record.avail_ports, rport_buf);
- pport2str(audio_info.play.mod_ports, pport_buf),
- rport2str(audio_info.record.mod_ports, rport_buf),
- (void) printf(
- gettext("Mod Ports\n Play\t\t0x%08x %s\n"
- " Record\t0x%08x %s\n"),
- audio_info.play.mod_ports, pport_buf,
- audio_info.record.mod_ports, rport_buf);
- (void) printf(gettext("Samples\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.samples, audio_info.record.samples);
- (void) printf(gettext("Active\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.active, audio_info.record.active);
- (void) printf(gettext("Pause\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.pause, audio_info.record.pause);
- (void) printf(gettext("Error\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.error, audio_info.record.error);
- (void) printf(gettext("EOF Count\n Play\t\t%u\n"),
- audio_info.play.eof);
- (void) printf(gettext("Waiting\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.waiting, audio_info.record.waiting);
- (void) printf(gettext("Open\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.open, audio_info.record.open);
- (void) printf(gettext("HW Features\t\t0x%08x\n"),
- audio_info.hw_features);
- if (audio_info.hw_features & AUDIO_HWFEATURE_PLAY) {
- (void) printf(gettext(" PLAY\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_RECORD) {
- (void) printf(gettext(" RECORD\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_DUPLEX) {
- (void) printf(gettext(" DUPLEX\n"));
+ if (ctype_valid(cinfop->ci.type)) {
+ if (ioctl(mfd, SNDCTL_MIX_READ, &cval) < 0) {
+ rv = errno;
+ perror(_("Error reading control\n"));
+ return (rv);
}
- if (audio_info.hw_features & AUDIO_HWFEATURE_MSCODEC) {
- (void) printf(gettext(" MULTI-STREAM CODEC\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_IN2OUT) {
- (void) printf(gettext(" INPUT TO OUTPUT LOOPBACK\n"));
+ } else {
+ /* if verbose, then continue to display the "pseudo" ctrls */
+ if (vopt < 2 || tofile)
+ return (0);
+ }
+
+ /*
+ * convert the control value into a string
+ */
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ (void) snprintf(valbuf, sizeof (valbuf), "%s",
+ cval.value ? _("on") : _("off"));
+ break;
+
+ case MIXT_MONOSLIDER:
+ (void) snprintf(valbuf, sizeof (valbuf), "%d",
+ cval.value & 0xff);
+ break;
+
+ case MIXT_STEREOSLIDER:
+ (void) snprintf(valbuf, sizeof (valbuf), "%d:%d",
+ (int)AUDIO_CTRL_STEREO_LEFT(cval.value),
+ (int)AUDIO_CTRL_STEREO_RIGHT(cval.value));
+ break;
+
+ case MIXT_ENUM:
+ str = get_enum_str(cinfop, cval.value);
+ if (str == NULL) {
+ warn(_("Bad enum index %d for control '%s'\n"),
+ cval.value, cinfop->ci.extname);
+ return (EINVAL);
}
- (void) printf(gettext("SW Features\t\t0x%08x\n"),
- audio_info.sw_features);
- if (audio_info.sw_features & AUDIO_SWFEATURE_MIXER) {
- (void) printf(gettext(" MIXER\n"));
+
+ (void) snprintf(valbuf, sizeof (valbuf), "%s", str);
+ break;
+
+ default:
+ (void) snprintf(valbuf, sizeof (valbuf), "-");
+ }
+
+ /*
+ * possible control values (range/selection)
+ */
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ (void) snprintf(selbuf, sizeof (selbuf), _("on,off"));
+ break;
+
+ case MIXT_MONOSLIDER:
+ (void) snprintf(selbuf, sizeof (selbuf), "%d-%d",
+ cinfop->ci.minvalue, cinfop->ci.maxvalue);
+ break;
+ case MIXT_STEREOSLIDER:
+ (void) snprintf(selbuf, sizeof (selbuf), "%d-%d:%d-%d",
+ cinfop->ci.minvalue, cinfop->ci.maxvalue,
+ cinfop->ci.minvalue, cinfop->ci.maxvalue);
+ break;
+
+ case MIXT_ENUM:
+ /*
+ * display the first choice on the same line, then display
+ * the rest on multiple lines
+ */
+ selbuf[0] = 0;
+ for (i = 0; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if ((strlen(str) + 1 + strlen(selbuf)) >=
+ sizeof (selbuf)) {
+ break;
+ }
+ if (strlen(selbuf)) {
+ (void) strlcat(selbuf, ",", sizeof (selbuf));
+ }
+
+ (void) strlcat(selbuf, str, sizeof (selbuf));
}
- (void) printf(gettext("SW Features Enabled\t0x%08x\n"),
- audio_info.sw_features_enabled);
- if (audio_info.sw_features_enabled & AUDIO_SWFEATURE_MIXER) {
- (void) printf(gettext(" MIXER\n"));
+ idx = i;
+ break;
+
+ default:
+ (void) snprintf(selbuf, sizeof (selbuf), "-");
+ }
+
+ col.col_dv = devnm;
+ col.col_nm = strlen(cinfop->ci.extname) ?
+ cinfop->ci.extname : cinfop->ci.id;
+ while (strchr(col.col_nm, '_') != NULL) {
+ col.col_nm = strchr(col.col_nm, '_') + 1;
+ }
+ col.col_val = valbuf;
+ col.col_typ = ctype_str(cinfop->ci.type);
+ col.col_sel = selbuf;
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
+
+ /* print leftover enum value selections */
+ while ((!tofile) && (idx >= 0) && (idx < cinfop->ci.maxvalue)) {
+ selbuf[0] = 0;
+ for (i = idx; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if ((strlen(str) + 1 + strlen(selbuf)) >=
+ sizeof (selbuf)) {
+ break;
+ }
+ if (strlen(selbuf)) {
+ (void) strlcat(selbuf, ",", sizeof (selbuf));
+ }
+
+ (void) strlcat(selbuf, str, sizeof (selbuf));
}
+ idx = i;
+ col.col_dv = NULL;
+ col.col_nm = NULL;
+ col.col_val = NULL;
+ col.col_typ = NULL;
+ col.col_sel = selbuf;
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
}
- (void) close(fd);
+ return (0);
+}
- (void) printf("\n");
- return (rc);
+static int
+mixers_prt_controls(FILE *sfp, int tofile, mlist_t *mlistp, char *cname,
+ int vopt)
+{
+ cinfo_t *cinfop;
+ char *n;
+ int i;
+ int rv;
+ int rval = 0;
-} /* doit() */
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
-/*
- * pport2str()
- *
- * Description:
- * Convert the play port bit map into strings. This makes the port number
- * a bit more readable. The returned string is in parenthesis and always
- * has 30 valid characters for spacing.
- *
- * Arguments:
- * uint port The port to convert
- * char *buf The storage to put the string into
- *
- * Returns:
- * void
- */
-static void
-pport2str(uint_t port, char *buf)
+ n = cinfop->ci.extname;
+ while (strchr(n, '_') != NULL) {
+ n = strchr(n, '_') + 1;
+ }
+ if (cname != NULL && strcmp(cname, n) != 0)
+ continue;
+
+ rv = mixers_prt_cinfo(sfp, tofile, mlistp, cinfop, vopt);
+ if (rv != 0)
+ rval = rv;
+ }
+
+ return (rval);
+}
+
+
+static int
+mixers_sav_prt(FILE *sfp, int tofile, mlist_t *mlistp, char *cname,
+ int eopt, int lopt, int vopt)
{
- int sep = 0;
+ mlist_t *mlp;
+ int rv;
+ int rval = 0;
+
+ for (mlp = mlistp; mlp != NULL; mlp = mlp->nextp) {
+
+ if ((mlp->mi.enabled == 0) && (vopt == NULL))
+ continue;
- (void) strcpy(buf, gettext("("));
+ if ((lopt) || (vopt) || (tofile))
+ mixers_prt_mlist(sfp, tofile, mlp);
- if (port & AUDIO_SPEAKER) {
- (void) strcat(buf, gettext(SPEAKER));
- sep++;
+ if (eopt)
+ msg(_("Audio mixer for %s is enabled\n"),
+ mlp->mi.devnode);
+
+ if ((lopt || eopt) && !tofile)
+ continue;
+
+ if ((mlistp->cmax > 0) && (vopt || (mlp == mlistp)))
+ mixers_prt_ctl_hdr(sfp, tofile, vopt);
+ rv = mixers_prt_controls(sfp, tofile, mlp, cname, vopt);
+ if (rv != 0)
+ rval = rv;
+
+ if (vopt)
+ msg("\n");
}
- if (port & AUDIO_HEADPHONE) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ return (rval);
+}
+
+static int
+mixers_save(mlist_t *mlistp, char *sstr, int ovopt, int vopt)
+{
+ FILE *sfp;
+ int fp;
+ int retval;
+ struct stat sbuf;
+
+ if (stat(sstr, &sbuf) == 0) {
+ if (!ovopt) {
+ warn(_("Would over write existing file [%s]\n"), sstr);
+ return (EINVAL);
} else {
- sep++;
+ if (unlink(sstr)) {
+ retval = errno;
+ perror(_("Failed to unlink existing file"));
+ return (retval);
+ }
}
- (void) strcat(buf, gettext(HDPHONE));
}
- if (port & AUDIO_LINE_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(LINE));
+
+ if ((fp = open(sstr, O_WRONLY|O_CREAT|O_EXCL, 0666)) == 0) {
+ retval = errno;
+ perror(_("Failed to create file"));
+ return (retval);
}
- if (port & AUDIO_SPDIF_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ sfp = fdopen(fp, "w");
+ if (sfp == NULL)
+ return (errno);
+ retval = mixers_sav_prt(sfp, 1, mlistp, NULL, 0, 0, vopt);
+ if (fclose(sfp))
+ return (errno);
+ return (retval);
+}
+
+static int
+mixers_set_cinfo(mlist_t *mlistp, cinfo_t *cinfop, char *wstr, int vopt)
+{
+ int mfd = mlistp->mfd;
+ oss_mixer_value cval;
+ int wlen = strlen(wstr);
+ int lval, rval;
+ char *lstr, *rstr;
+ char *str;
+ int i;
+ int rv = -1;
+
+ cval.dev = -1;
+ cval.ctrl = cinfop->ci.ctrl;
+ cval.value = 0;
+
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ cval.value = (strncmp(_("on"), wstr, wlen) == 0) ? 1 : 0;
+ break;
+
+ case MIXT_MONOSLIDER:
+ cval.value = atoi(wstr);
+ break;
+
+ case MIXT_STEREOSLIDER:
+ lstr = wstr;
+ rstr = strchr(wstr, ':');
+ if (rstr != NULL) {
+ *rstr = '\0';
+ rstr++;
+
+ rval = atoi(rstr);
+ lval = atoi(lstr);
+
+ rstr--;
+ *rstr = ':';
} else {
- sep++;
+ lval = atoi(lstr);
+ rval = lval;
}
- (void) strcat(buf, gettext(SPDIF));
- }
- if (port & AUDIO_AUX1_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ cval.value = AUDIO_CTRL_STEREO_VAL(lval, rval);
+ break;
+
+ case MIXT_ENUM:
+ for (i = 0; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if (strncmp(wstr, str, wlen) == 0) {
+ cval.value = i;
+ break;
+ }
}
- (void) strcat(buf, gettext(AUX1));
- }
- if (port & AUDIO_AUX2_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (i >= cinfop->ci.maxvalue) {
+ warn(_("Invalid enumeration value"));
+ return (EINVAL);
}
- (void) strcat(buf, gettext(AUX2));
+ break;
+
+ default:
+ warn(_("Unsupported control type\n"));
+ return (EINVAL);
}
- if (port & ~ALL_PLAY_PORTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(UNKNOWN));
+
+ if (vopt) {
+ msg(_("%s: '%s' set to '%s'\n"), mlistp->cdi.shortname,
+ cinfop->ci.extname, wstr);
}
- if (sep == 0) {
- (void) strcat(buf, gettext(NONE));
+ if (ioctl(mfd, SNDCTL_MIX_WRITE, &cval) < 0) {
+ rv = errno;
+ perror(_("Error writing control"));
+ return (rv);
}
- (void) strcat(buf, gettext(")"));
+ rv = 0;
+ return (rv);
+}
-} /* pport2str() */
-/*
- * rport2str()
- *
- * Description:
- * Convert the record port bit map into strings. This makes the port
- * number a bit more readable. The returned string in parenthesis.
- *
- * Arguments:
- * uint port The port to convert
- * char *buf The storage to put the string into
- *
- * Returns:
- * void
- */
-static void
-rport2str(uint_t port, char *buf)
+static int
+mixers_set_controls(mlist_t *mlistp, char *cname, char *wstr, int vopt)
{
- int sep = 0;
+ cinfo_t *cinfop;
+ char *n;
+ int i;
+ int rv;
+ int rval = 0;
- (void) strcpy(buf, gettext("("));
+ /*
+ * Note errors that occur but continue on to the next control;
+ * XXX
+ * we allow multiple controls with the same name
+ */
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
+ n = cinfop->ci.extname;
+ while (strchr(n, '_') != NULL) {
+ n = strchr(n, '_') + 1;
+ }
+ if (cname != NULL && strcmp(cname, n) != 0)
+ continue;
- if (port & AUDIO_MICROPHONE) {
- (void) strcat(buf, gettext(MIC));
- sep++;
+ rv = mixers_set_cinfo(mlistp, cinfop, wstr, vopt);
+ if (rv != 0)
+ rval = rv;
}
- if (port & AUDIO_LINE_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(LINE));
+
+ return (rval);
+}
+
+
+static int
+mixers_set(mlist_t *mlistp, char *cname, char *wstr, int vopt)
+{
+ mlist_t *mlp;
+ int rv;
+ int rval = 0;
+
+ /*
+ * Note errors that occur but continue on to the next mixer; this is
+ * to allow us to specify a single control to set on all mixers,
+ * if such a control is available on the mixer
+ */
+ for (mlp = mlistp; mlp != NULL; mlp = mlp->nextp) {
+
+ rv = mixers_set_controls(mlp, cname, wstr, vopt);
+ if (rv != 0)
+ rval = rv;
}
- if (port & AUDIO_CD) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ return (rval);
+}
+
+static int
+mixers_restore(mlist_t *mlistp, char *sstr, int vopt)
+{
+ FILE *sfp;
+ int retval = 0;
+ int rv;
+ int lineno = 0;
+ char linebuf[PATH_MAX];
+ char *col_nm, *col_val;
+
+ sfp = fopen(sstr, "r");
+ if (sfp == NULL)
+ return (errno);
+
+ while (fgets(linebuf, sizeof (linebuf), sfp) != NULL) {
+ lineno++;
+ if (linebuf[strlen(linebuf) - 1] != '\n') {
+ warn(_("Warning: line too long at line %d\n"), lineno);
+ /* read in the rest of the line and discard it */
+ while (fgets(linebuf, sizeof (linebuf), sfp) != NULL &&
+ (linebuf[strlen(linebuf) - 1] != '\n')) {
+ continue;
+ }
+ continue;
}
- (void) strcat(buf, gettext(CD));
- }
- if (port & AUDIO_SPDIF_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+ /* now we have a good line ... */
+ col_nm = strtok(linebuf, " \t\n");
+ /* skip comments and blank lines */
+ if ((col_nm == NULL) || (col_nm[0] == '#')) {
+ continue;
}
- (void) strcat(buf, gettext(SPDIF));
- }
- if (port & AUDIO_AUX1_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+ col_val = strtok(NULL, " \t\n");
+ if ((col_val == NULL) || (*col_val == 0)) {
+ warn(_("Warning: missing value at line %d\n"), lineno);
+ continue;
}
- (void) strcat(buf, gettext(AUX1));
+
+ rv = mixers_set(mlistp, col_nm, col_val, vopt);
+ if (rv)
+ retval = rv;
}
- if (port & AUDIO_AUX2_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (fclose(sfp))
+ return (errno);
+ return (retval);
+}
+
+
+static void
+help(void)
+{
+#define HELP_STR _( \
+"mixerctl [ -d <device> | -a ] [ -f ] [ -s <file> | -r <file> ]\n" \
+"mixerctl [ -d <device> | -a ] [ -Civ ]\n" \
+"mixerctl [ -d <device> | -a ] [ -v ] -c <ctrl> [ -w <value> ]\n" \
+"\n" \
+" -d <device> = audio device path\n" \
+" -s <file> = save control settings to file\n" \
+" -r <file> = restore control settings from file\n" \
+" -f force overwrite of existing control settings file\n" \
+" -a process all audio devices\n" \
+" -C dump all audio controls\n" \
+" -i list audio device info\n" \
+" -v verbose output; also affects output for -w;\n" \
+" multiple uses increase verbosity\n" \
+" -c <ctrl> = control name\n" \
+" -w <value> = control value\n" \
+" {integer} for mono; {integer:integer} for stereo;\n" \
+" {string} for enum; {on|off} for boolean\n" \
+"\n" \
+" without arguments, device info for all devices will be listed\n")
+
+ (void) fprintf(stderr, HELP_STR);
+}
+
+
+#define strstarts(s, prefix) strncmp(s, prefix, strlen(prefix))
+
+int
+main(int argc, char **argv)
+{
+ int rv = -1;
+ int opt;
+ char *dstr = NULL;
+ char *cstr = NULL;
+ char *wstr = NULL;
+ char *sstr = NULL;
+ int aopt = 0;
+ int iopt = 0;
+ int vopt = 0;
+ int eopt = 0;
+ int oopt = 0;
+ int Copt = 0;
+ int sopt = 0;
+ int ropt = 0;
+ int ovopt = 0;
+ mlist_t *mlistp = NULL;
+
+ (void) setlocale(LC_ALL, "");
+ (void) textdomain(TEXT_DOMAIN);
+
+ while ((opt = getopt(argc, argv, "Cd:c:w:fs:r:ivhaeo")) != EOF) {
+ switch (opt) {
+ case 'C':
+ Copt++;
+ break;
+ case 'a':
+ aopt++;
+ break;
+ case 'e':
+ eopt++;
+ break;
+ case 'f':
+ ovopt++;
+ break;
+ case 'o':
+ oopt++;
+ break;
+ case 'd':
+ dstr = optarg;
+ break;
+
+ case 'c':
+ cstr = strdup(optarg);
+ break;
+ case 'w':
+ wstr = strdup(optarg);
+ break;
+ case 's':
+ sopt++;
+ sstr = strdup(optarg);
+ break;
+ case 'r':
+ ropt++;
+ sstr = strdup(optarg);
+ break;
+ case 'i':
+ iopt++;
+ break;
+ case 'v':
+ vopt++;
+ break;
+ case 'h':
+ help();
+ rv = 0;
+ goto OUT;
+ default:
+ help();
+ rv = EINVAL;
+ goto OUT;
}
- (void) strcat(buf, gettext(AUX2));
}
- if (port & AUDIO_CODEC_LOOPB_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (((eopt || oopt) && (Copt || sopt || ropt)) ||
+ (Copt && cstr) ||
+ ((Copt || cstr) && (sopt || ropt)) ||
+ (aopt && dstr) ||
+ (sopt && ropt)) {
+ warn(_("Illegal combination of options.\n"));
+ rv = EINVAL;
+ goto OUT;
+ }
+
+ if ((Copt) && (dstr == NULL)) {
+ /* asume -a when dumping controls with -C */
+ aopt++;
+ }
+
+ if ((!aopt) && (dstr == NULL)) {
+ /* if no mixer specified, assume a default */
+ dstr = getenv("AUDIODEV");
+ if (dstr == NULL) {
+ dstr = "/dev/audio";
}
- (void) strcat(buf, gettext(LOOPBACK));
}
- if (port & AUDIO_SUNVTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ if (oopt) {
+ /* legacy option, nuke it */
+ warn(_("Cannot disable audio mixer\n"));
+ rv = EINVAL;
+ goto OUT;
+ }
+
+ if (dstr != NULL) {
+ char scratch[MAXPATHLEN + 1];
+ char *s;
+ char *bn;
+ int num = -1;
+ /*
+ * User may have specified:
+ *
+ * /dev/dsp[<num>]
+ * /dev/mixer[<num>]
+ * /dev/audio[<num>9]
+ * /dev/audioctl[<num>]
+ * /dev/sound/<num>{,ctl,dsp,mixer}
+ * /dev/sound/<driver>:<num>{,ctl,dsp,mixer}
+ *
+ * We want to deal only with SADA names though.
+ */
+
+ if (strcmp(dstr, "/dev/mixer") == 0) {
+ /* /dev/mixer node doesn't point to real hw */
+ dstr = "/dev/dsp";
+ }
+ if ((bn = strrchr(dstr, '/')) != NULL) {
+ bn++;
} else {
- sep++;
+ bn = dstr;
}
- (void) strcat(buf, gettext(SUNVTSLB));
- }
- if (port & ~ALL_REC_PORTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+ if ((strstarts(dstr, "/dev/sound/") == 0) &&
+ ((strrchr(dstr, ':')) != NULL)) {
+ char *colon;
+ int n;
+
+ (void) strlcpy(scratch, dstr, sizeof (scratch));
+ colon = strrchr(scratch, ':');
+ colon++;
+ n = atoi(colon);
+ *colon = '\0';
+ (void) snprintf(colon,
+ sizeof (scratch) - strlen(scratch), "%dmixer", n);
+
+ dstr = strdup(scratch);
+
+ } else if ((strcmp(dstr, "/dev/audio") == 0) ||
+ (strcmp(dstr, "/dev/audioctl") == 0) ||
+ (strcmp(dstr, "/dev/dsp") == 0)) {
+ /* "default" device, read the link */
+ if (readlink(dstr, scratch, sizeof (scratch)) >= 0) {
+ if ((s = strchr(scratch, '/')) != NULL) {
+ num = atoi(s + 1);
+ }
+ }
+
+ } else if ((strstarts(dstr, "/dev/sound/") == 0) &&
+ (isdigit(bn[0]))) {
+ num = atoi(bn);
+ }
+ if (num >= 0) {
+ /* Convert SADA name to OSS name */
+ (void) snprintf(scratch, sizeof (scratch),
+ "/dev/mixer%d", num);
+ dstr = strdup(scratch);
} else {
- sep++;
+ dstr = strdup(dstr);
}
- (void) strcat(buf, gettext(UNKNOWN));
}
- if (sep == 0) {
- (void) strcat(buf, gettext(NONE));
+ if (wstr != NULL && cstr == NULL) {
+ warn(_("Control value specified without name\n"));
+ rv = EINVAL;
+ goto OUT;
}
- (void) strcat(buf, gettext(")"));
+ if ((cstr == NULL) && (Copt == 0) && (eopt == 0) &&
+ (ropt == 0) && (sopt == 0)) {
+ iopt = 1;
+ }
+
+ rv = mixers_getinfo(dstr, &mlistp);
+ if (rv != 0)
+ goto OUT;
+
+ if (wstr != NULL) {
+ rv = mixers_set(mlistp, cstr, wstr, vopt);
+ goto OUT;
+ }
+
+ if (ropt) {
+ rv = mixers_restore(mlistp, sstr, vopt);
+ goto OUT;
+ }
+
+ if (sopt) {
+ rv = mixers_save(mlistp, sstr, ovopt, vopt);
+ goto OUT;
+ }
+
+ rv = mixers_sav_prt(stdout, 0, mlistp, cstr, eopt, iopt, vopt);
+ if (rv != 0)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ if (dstr != NULL)
+ free(dstr);
+ if (cstr != NULL)
+ free(cstr);
+ if (wstr != NULL)
+ free(wstr);
+ if (sstr != NULL)
+ free(sstr);
-} /* rport2str() */
+ mixers_free(&mlistp);
+ return (rv);
+}
diff --git a/usr/src/cmd/devfsadm/audio_link.c b/usr/src/cmd/devfsadm/audio_link.c
index 6b3e08a66f..9552b0aa4e 100644
--- a/usr/src/cmd/devfsadm/audio_link.c
+++ b/usr/src/cmd/devfsadm/audio_link.c
@@ -19,19 +19,22 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <regex.h>
#include <devfsadm.h>
#include <strings.h>
+#include <ctype.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
+#include <syslog.h>
#include <bsm/devalloc.h>
+#include <sys/audio.h>
+#include <sys/soundcard.h>
+#include <unistd.h>
#define MAX_AUDIO_LINK 100
#define RE_SIZE 64
@@ -39,13 +42,18 @@
extern int system_labeled;
static void check_audio_link(char *secondary_link,
- const char *primary_link_format);
+ const char *primary_link_format);
+
static int audio_process(di_minor_t minor, di_node_t node);
+static int sndstat_process(di_minor_t minor, di_node_t node);
static devfsadm_create_t audio_cbt[] = {
{ "audio", "ddi_audio", NULL,
- TYPE_EXACT, ILEVEL_0, audio_process
- }
+ TYPE_EXACT, ILEVEL_0, audio_process
+ },
+ { "pseudo", "ddi_pseudo", "audio",
+ TYPE_EXACT|DRV_EXACT, ILEVEL_0, sndstat_process
+ },
};
DEVFSADM_CREATE_INIT_V0(audio_cbt);
@@ -55,54 +63,49 @@ DEVFSADM_CREATE_INIT_V0(audio_cbt);
* because recurse_dev_re() would not work.
*/
static devfsadm_remove_t audio_remove_cbt[] = {
- { "audio",
- "^audio(ctl)?$",
- RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
+ /*
+ * Secondary links.
+ */
+
+ /* /dev/audio, /dev/audioctl, /dev/dsp */
+ { "audio", "^(audio|audioctl|dsp)$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^sound/[0-9]+.*$",
- RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ /* /dev/mixer0, /dev/dsp0 */
+ { "audio", "^(mixer|dsp)[0-9]+$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/mgt$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
+ /* /dev/sound/0, 0ctl */
+ { "audio", "^sound/[0-9]+(ctl)?$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/aux/0(ctl)?$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
+ /* /dev/mixer */
+ { "pseudo", "^(mixer)$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/(nt)|(te)/((dtrace)|(mgt)|(b1)|(b2)|(d))$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
- }
-};
-DEVFSADM_REMOVE_INIT_V0(audio_remove_cbt);
-
-static regex_t isdn_re;
+ /*
+ * Primary links.
+ */
-#define ISDN_RE "((nt)|(te)|(aux))\\,((0)|(0ctl)|(d)|(b1)|(b2)|(mgt)|(dtrace))"
-#define F 1
-#define S 5
+ /* /dev/sndstat */
+ { "pseudo", "^sndstat$",
+ RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ },
+ /* /dev/sound/audio810:0, 0ctl, etc */
+ { "audio", "^sound/.*:[0-9]+(ctl|dsp|mixer)?$",
+ RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ },
+};
-int
-minor_init(void)
-{
- if (0 != regcomp(&isdn_re, ISDN_RE, REG_EXTENDED)) {
- devfsadm_errprint("SUNW_audio_link: minor_init: regular "
- "expression bad: '%s'\n", ISDN_RE);
- return (DEVFSADM_FAILURE);
- } else {
- return (DEVFSADM_SUCCESS);
- }
-}
+DEVFSADM_REMOVE_INIT_V0(audio_remove_cbt);
int
minor_fini(void)
{
- regfree(&isdn_re);
check_audio_link("audio", "sound/%d");
check_audio_link("audioctl", "sound/%dctl");
+ check_audio_link("dsp", "dsp%d");
return (DEVFSADM_SUCCESS);
}
@@ -111,6 +114,82 @@ minor_fini(void)
pm[pos].rm_eo - pm[pos].rm_so); \
to[pm[pos].rm_eo - pm[pos].rm_so] = 0;
+static void
+send_number(long num)
+{
+ char buf[PATH_MAX+1];
+
+ /*
+ * This is not safe with -r.
+ */
+ if (strcmp(devfsadm_root_path(), "/") != 0)
+ return;
+
+ (void) snprintf(buf, sizeof (buf), "/dev/mixer%ld", num);
+ if (device_exists(buf)) {
+ int fd;
+
+ if ((fd = open(buf, O_RDWR)) < 0)
+ return;
+
+ (void) ioctl(fd, SNDCTL_SUN_SEND_NUMBER, &num);
+ (void) close(fd);
+ devfsadm_print(CHATTY_MID,
+ "sent devnum audio %ld to %s\n", num, buf);
+ }
+}
+
+static void
+send_all(void)
+{
+ /*
+ * This module traverses /dev/sound to look for nodes that
+ * have been previously created.
+ */
+ finddevhdl_t fh;
+ const char *path;
+
+ /*
+ * This is not safe with -r.
+ */
+ if ((strcmp(devfsadm_root_path(), "/") == 0) &&
+ (finddev_readdir("/dev", &fh) == 0)) {
+ static int doneit = 0;
+
+ while ((!doneit) && ((path = finddev_next(fh)) != NULL)) {
+ long num;
+ char *ep;
+ if ((strncmp(path, "mixer", 5) != 0) ||
+ (!isdigit(path[5]))) {
+ continue;
+ }
+ num = strtol(path + 5, &ep, 10);
+ send_number(num);
+ }
+ finddev_close(fh);
+ doneit = 1;
+ }
+}
+
+static int
+sndstat_process(di_minor_t minor, di_node_t node)
+{
+ char *mn;
+
+ mn = di_minor_name(minor);
+
+ /*
+ * "Special" handling for /dev/sndstat and /dev/mixer.
+ */
+ if (strcmp(mn, "sound,sndstat0") == 0) {
+ (void) devfsadm_mklink("sndstat", node, minor, 0);
+ (void) devfsadm_secondary_link("mixer", "sndstat", 0);
+ send_all();
+ }
+
+ return (DEVFSADM_CONTINUE);
+}
+
/*
* This function is called for every audio node.
* Calls enumerate to assign a logical unit id, and then
@@ -120,113 +199,167 @@ static int
audio_process(di_minor_t minor, di_node_t node)
{
int flags = 0;
- char path[PATH_MAX + 1];
+ char devpath[PATH_MAX + 1];
+ char newpath[PATH_MAX + 1];
char *buf;
char *mn;
- char m1[10];
- char m2[10];
- char *devfspath;
+ char *tmp;
+ char *ep;
char re_string[RE_SIZE+1];
devfsadm_enumerate_t rules[1] = {NULL};
- regmatch_t pmatch[12];
- char *au_mn;
+ if (system_labeled)
+ flags = DA_ADD|DA_AUDIO;
mn = di_minor_name(minor);
- if ((devfspath = di_devfs_path(node)) == NULL) {
+ if ((tmp = di_devfs_path(node)) == NULL) {
return (DEVFSADM_CONTINUE);
}
- (void) strcpy(path, devfspath);
- (void) strcat(path, ":");
- (void) strcat(path, mn);
- di_devfs_path_free(devfspath);
-
- if (strstr(mn, "sound,") != NULL) {
- (void) snprintf(re_string, RE_SIZE, "%s", "^sound$/^([0-9]+)");
- } else {
- (void) strcpy(re_string, "isdn/([0-9]+)");
- }
+ (void) snprintf(devpath, sizeof (devpath), "%s:%s", tmp, mn);
+ di_devfs_path_free(tmp);
/*
- * We want a match against the physical path
- * without the minor name component.
+ * "Special" handling for /dev/sndstat and /dev/mixer.
*/
- rules[0].re = re_string;
- rules[0].subexp = 1;
- rules[0].flags = MATCH_ADDR;
+ if (strcmp(mn, "sound,sndstat0") == 0) {
+ (void) strlcpy(newpath, "sound/sndstat", sizeof (newpath));
- /*
- * enumerate finds the logical audio id, and stuffs
- * it in buf
- */
- if (devfsadm_enumerate_int(path, 0, &buf, rules, 1)) {
+ (void) devfsadm_mklink(newpath, node, minor, flags);
+ (void) devfsadm_secondary_link("sndstat", newpath, flags);
+ (void) devfsadm_secondary_link("mixer", newpath, flags);
+ send_all();
return (DEVFSADM_CONTINUE);
}
- path[0] = '\0';
+ if (strncmp(mn, "sound,", 6) == 0) {
+ char base[PATH_MAX + 1];
+ char linksrc[PATH_MAX + 1];
+ char linkdst[PATH_MAX + 1];
+ long num;
+ long inst;
+ int i;
+ char *driver;
+
+ /* strlen("sound,") */
+ (void) strlcpy(base, mn + 6, sizeof (base));
+ mn = base;
+
+ driver = di_driver_name(node);
+
+ /* if driver name override in minor name */
+ if ((tmp = strchr(mn, ',')) != NULL) {
+ driver = mn;
+ *tmp = '\0';
+ mn = tmp + 1;
+ }
- if (strstr(mn, "sound,") != NULL) {
- (void) strcpy(path, "sound/");
- (void) strcat(path, buf);
+ /* skip past "audio" portion of the minor name */
+ if (strncmp(mn, "audio", 5) == 0) {
+ mn += 5;
+ }
- /* if this is a minor node, tack on the correct suffix */
- au_mn = strchr(mn, ',');
- if (strcmp(++au_mn, "audio") != 0) {
+ /* parse the instance number */
+ for (i = strlen(mn); i; i--) {
+ if (!isdigit(mn[i - 1]))
+ break;
+ }
+ inst = strtol(mn + i, &ep, 10);
+ mn[i] = 0; /* lop off the instance number */
+
+ /*
+ * First we create a node with the driver under /dev/sound.
+ * Note that "instance numbers" used by the audio framework
+ * are guaranteed to be unique for each driver.
+ */
+ (void) snprintf(newpath, sizeof (newpath), "sound/%s:%d%s",
+ driver, inst, mn);
+ (void) devfsadm_mklink(newpath, node, minor, flags);
+
+ /*
+ * The rest of this logic is a gross simplification that
+ * is made possible by the fact that each audio node will
+ * have several different minors associated with it. Rather
+ * processing each node separately, we just create the links
+ * all at once.
+ *
+ * This reduces the chances of the various links being out
+ * of sync with each other.
+ */
+ if (strcmp(mn, "mixer") != 0) {
+ return (DEVFSADM_CONTINUE);
+ }
- /*
- * audioctl is a special case. It is handled
- * by stripping off the audio from the node name
- */
- if (strcmp(au_mn, "audioctl") == 0)
- au_mn = strstr(au_mn, "ctl");
- (void) strcat(path, au_mn);
+ /*
+ * Its the control node, so create the various
+ * secondary links.
+ */
+
+ /*
+ * We want a match against the physical path
+ * without the minor name component.
+ */
+ (void) snprintf(re_string, RE_SIZE, "%s", "^mixer([0-9]+)");
+ rules[0].re = re_string;
+ rules[0].subexp = 1;
+ rules[0].flags = MATCH_ALL;
+
+ /*
+ * enumerate finds the logical audio id, and stuffs
+ * it in buf
+ */
+ (void) strlcpy(devpath, newpath, sizeof (devpath));
+ if (devfsadm_enumerate_int(devpath, 0, &buf, rules, 1)) {
+ return (DEVFSADM_CONTINUE);
}
- }
+ num = strtol(buf, &ep, 10);
+ free(buf);
- if (regexec(&isdn_re, mn, sizeof (pmatch) / sizeof (pmatch[0]),
- pmatch, 0) == 0) {
- COPYSUB(m1, mn, pmatch, F);
- COPYSUB(m2, mn, pmatch, S);
- (void) strcpy(path, "isdn/");
- (void) strcat(path, buf);
- (void) strcat(path, "/");
- (void) strcat(path, m1);
- (void) strcat(path, "/");
- (void) strcat(path, m2);
- }
+ /* /dev/sound/0 */
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ld",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "sound/%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
- if (strstr("mgt,mgt", mn) != NULL) {
- (void) strcpy(path, "isdn/");
- (void) strcat(path, buf);
- (void) strcat(path, "/mgt");
- }
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ldctl",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "sound/%ldctl", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
+
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%lddsp",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "dsp%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
- free(buf);
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ldmixer",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "mixer%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
+
+ /* Send control number */
+ send_number(num);
- if (path[0] == '\0') {
- devfsadm_errprint("SUNW_audio_link: audio_process: can't find"
- " match for'%s'\n", mn);
return (DEVFSADM_CONTINUE);
}
- if (system_labeled)
- flags = DA_ADD|DA_AUDIO;
+ if (strncmp(mn, "internal,", 9) == 0) {
+ /* we don't set up internal nodes in /dev */
+ return (DEVFSADM_CONTINUE);
+ }
- (void) devfsadm_mklink(path, node, minor, flags);
+ devfsadm_errprint("SUNW_audio_link: can't find match for'%s'\n", mn);
return (DEVFSADM_CONTINUE);
}
-
static void
-check_audio_link(char *secondary_link, const char *primary_link_format)
+check_audio_link(char *secondary, const char *primary_format)
{
- char primary_link[PATH_MAX + 1];
+ char primary[PATH_MAX + 1];
int i;
int flags = 0;
/* if link is present, return */
- if (devfsadm_link_valid(secondary_link) == DEVFSADM_TRUE) {
+ if (devfsadm_link_valid(secondary) == DEVFSADM_TRUE) {
return;
}
@@ -234,10 +367,11 @@ check_audio_link(char *secondary_link, const char *primary_link_format)
flags = DA_ADD|DA_AUDIO;
for (i = 0; i < MAX_AUDIO_LINK; i++) {
- (void) sprintf(primary_link, primary_link_format, i);
- if (devfsadm_link_valid(primary_link) == DEVFSADM_TRUE) {
- (void) devfsadm_secondary_link(secondary_link,
- primary_link, flags);
+ (void) sprintf(primary, primary_format, i);
+ if (devfsadm_link_valid(primary) == DEVFSADM_TRUE) {
+ /* we read link to get it to the master "real" link */
+ (void) devfsadm_secondary_link(secondary,
+ primary, flags);
break;
}
}
diff --git a/usr/src/cmd/mdb/Makefile.common b/usr/src/cmd/mdb/Makefile.common
index bb341fdc8f..109b110645 100644
--- a/usr/src/cmd/mdb/Makefile.common
+++ b/usr/src/cmd/mdb/Makefile.common
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# MDB modules used for debugging user processes that every ISA's build
@@ -52,7 +52,6 @@ COMMON_MODULES_PROC_32BIT = \
#
COMMON_MODULES_KVM = \
arp \
- audiosup \
cpc \
crypto \
dtrace \
diff --git a/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c b/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c
deleted file mode 100644
index ab98383de7..0000000000
--- a/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <mdb/mdb_modapi.h>
-#include <sys/types.h>
-#include <sys/audio/audio_trace.h>
-
-typedef struct audiotrace_walk_data {
- uintptr_t aw_bufstart;
- uintptr_t aw_bufend;
- int aw_cnt;
-} audiotrace_walk_data_t;
-
-int
-audiotrace_walk_init(mdb_walk_state_t *wsp)
-{
- size_t size;
- uint_t seq, pos;
- GElf_Sym sym;
- audio_trace_buf_t *buffer;
- audio_trace_buf_t atb[2];
- audiotrace_walk_data_t *aw;
-
- if (mdb_readvar(&size, "audio_tb_siz") == -1) {
- mdb_warn("failed to read 'audio_tb_siz'");
- return (WALK_ERR);
- }
-
- if (size == 0)
- return (WALK_DONE);
-
- if (mdb_lookup_by_name("audio_trace_buffer", &sym) == -1) {
- mdb_warn("failed to find 'audio_trace_buffer'");
- return (WALK_ERR);
- }
-
- buffer = (audio_trace_buf_t *)(uintptr_t)sym.st_value;
-
- if (mdb_readvar(&seq, "audio_tb_seq") == -1) {
- mdb_warn("failed to read 'audio_tb_seq'");
- return (WALK_ERR);
- }
-
- if (mdb_readvar(&pos, "audio_tb_pos") == -1) {
- mdb_warn("failed to read 'audio_tb_pos'");
- return (WALK_ERR);
- }
-
- /* by default start the walk with the first buffer entry */
- wsp->walk_addr = (uintptr_t)buffer;
-
- if (seq > size && pos > 0) {
- /* start the walk with the oldest buffer entry */
-
- if (mdb_vread(&atb, sizeof (atb),
- (uintptr_t)(buffer + pos - 1)) == -1) {
- mdb_warn("failed to read audio_trace_buf_t at %p",
- buffer + pos - 1);
- return (WALK_ERR);
- }
-
- if (atb[1].atb_seq < atb[0].atb_seq)
- wsp->walk_addr = (uintptr_t)(buffer + pos);
- }
-
- aw = mdb_alloc(sizeof (audiotrace_walk_data_t), UM_SLEEP);
- aw->aw_bufstart = (uintptr_t)buffer;
- aw->aw_bufend = (uintptr_t)(buffer + size);
- aw->aw_cnt = MIN(seq, size);
- wsp->walk_data = aw;
-
- return (WALK_NEXT);
-}
-
-int
-audiotrace_walk_step(mdb_walk_state_t *wsp)
-{
- uintptr_t addr = wsp->walk_addr;
- audiotrace_walk_data_t *aw = wsp->walk_data;
- audio_trace_buf_t atb;
-
- if (aw->aw_cnt == 0)
- return (WALK_DONE);
-
- aw->aw_cnt--;
- wsp->walk_addr += sizeof (audio_trace_buf_t);
-
- if (wsp->walk_addr >= aw->aw_bufend)
- wsp->walk_addr = aw->aw_bufstart;
-
- if (mdb_vread(&atb, sizeof (atb), addr) == -1) {
- mdb_warn("failed to read audio_trace_buf_t at %p", addr);
- return (WALK_DONE);
- }
-
- return (wsp->walk_callback(addr, &atb, wsp->walk_cbdata));
-}
-
-void
-audiotrace_walk_fini(mdb_walk_state_t *wsp)
-{
- mdb_free(wsp->walk_data, sizeof (audiotrace_walk_data_t));
-}
-
-
-/*ARGSUSED*/
-int
-audiotrace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
-{
- int count;
- uint_t seq;
- const mdb_arg_t *argp = &argv[0];
- audio_trace_buf_t atb;
- char str[256];
-
- if (!(flags & DCMD_ADDRSPEC)) {
- if (mdb_walk_dcmd("audiotrace", "audiotrace", argc, argv)
- == -1) {
- mdb_warn("can't walk audio trace buffer entries");
- return (DCMD_ERR);
- }
- return (DCMD_OK);
- }
-
- if (argc > 1)
- return (DCMD_USAGE);
-
- /*
- * Specifying an address and a count at the same time doesn't make
- * sense.
- */
- if (argc == 1 && !(flags & DCMD_LOOP))
- return (DCMD_USAGE);
-
- if (DCMD_HDRSPEC(flags))
- mdb_printf("%<u>%6s %?s %-40s%</u>\n",
- "SEQNO", "DATA", "COMMENT");
-
- if (mdb_vread(&atb, sizeof (atb), addr) == -1) {
- mdb_warn("failed to read audiotrace_t at %p", addr);
- return (DCMD_ERR);
- }
-
- if (argc == 1) {
- /*
- * Display the last 'count' entries only. Skip any other
- * entries.
- */
- if (mdb_readvar(&seq, "audio_tb_seq") == -1) {
- mdb_warn("failed to read 'audio_tb_seq'");
- return (DCMD_ERR);
- }
-
- if (argp->a_type == MDB_TYPE_IMMEDIATE)
- count = argp->a_un.a_val;
- else
- count = mdb_strtoull(argp->a_un.a_str);
-
- if (atb.atb_seq < seq - count)
- return (DCMD_OK);
- }
-
- if (mdb_readstr(str, sizeof (str), (uintptr_t)atb.atb_comment) == -1) {
- mdb_warn("failed to read string at %p", atb.atb_comment);
- return (DCMD_ERR);
- }
-
- mdb_printf("%6d %?x %s\n", atb.atb_seq, atb.atb_data, str);
-
- return (DCMD_OK);
-}
-
-void
-audiotrace_help(void)
-{
- mdb_printf(
- "If count is specified ::audiotrace prints the specified\n"
- "number of entries from the logical end of the trace buffer.\n");
-}
-
-/*
- * MDB module linkage
- */
-static const mdb_dcmd_t dcmds[] = {
- { "audiotrace", "?[count]", "display audio trace buffer entries",
- audiotrace, audiotrace_help },
- { NULL }
-};
-
-static const mdb_walker_t walkers[] = {
- { "audiotrace", "walk audio trace buffer entries", audiotrace_walk_init,
- audiotrace_walk_step, audiotrace_walk_fini },
- { NULL }
-};
-
-static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, walkers };
-
-const mdb_modinfo_t *
-_mdb_init(void)
-{
- return (&modinfo);
-}
diff --git a/usr/src/cmd/svc/milestone/Makefile b/usr/src/cmd/svc/milestone/Makefile
index df0e542f76..d727a17ebb 100644
--- a/usr/src/cmd/svc/milestone/Makefile
+++ b/usr/src/cmd/svc/milestone/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -60,7 +60,8 @@ MAINMILESTONES= \
MAINMANIFESTS= $(MAINMILESTONES:%=$(ROOTSVCMILESTONE)/%)
SYSDEVSVCS= \
- devices-local.xml
+ devices-local.xml \
+ devices-audio.xml
SYSDEVMANIFESTS= $(SYSDEVSVCS:%=$(ROOTSVCSYSTEMDEVICE)/%)
@@ -94,6 +95,7 @@ MANIFEST= $(FSSVCS) $(NETSVCS) $(MAINMILESTONES) $(SYSTEMSVCS) \
SVCMETHOD=\
boot-archive \
console-login \
+ devices-audio \
devices-local \
fs-local \
fs-minimal \
diff --git a/usr/src/cmd/svc/milestone/devices-audio b/usr/src/cmd/svc/milestone/devices-audio
new file mode 100644
index 0000000000..74c2457588
--- /dev/null
+++ b/usr/src/cmd/svc/milestone/devices-audio
@@ -0,0 +1,44 @@
+#!/sbin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+. /lib/svc/share/smf_include.sh
+
+smf_is_globalzone || exit $SMF_EXIT_OK
+
+#
+# In order to populate the initial startup mapping of devfs links to
+# the audio subsystem (necessary to properly report numbers in
+# /dev/sndstat and in the OSS sysinfo ioctls -- thank you Linux!) we
+# need to run some code at boot. We key this off of the handler in
+# devfsadm for the audio node(s).
+#
+# Additionally, we need to make sure the streams audio module is
+# loaded so that the symbolic links are properly created for STREAMs
+# devices and point to a reasonable device node.
+#
+/usr/sbin/devfsadm -i audio
+/usr/sbin/devfsadm -i austr
+exit $SMF_EXIT_OK
diff --git a/usr/src/cmd/svc/milestone/devices-audio.xml b/usr/src/cmd/svc/milestone/devices-audio.xml
new file mode 100644
index 0000000000..48dee7299e
--- /dev/null
+++ b/usr/src/cmd/svc/milestone/devices-audio.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0'?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ Use is subject to license terms.
+
+ CDDL HEADER START
+
+ The contents of this file are subject to the terms of the
+ Common Development and Distribution License (the "License").
+ You may not use this file except in compliance with the License.
+
+ You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ or http://www.opensolaris.org/os/licensing.
+ See the License for the specific language governing permissions
+ and limitations under the License.
+
+ When distributing Covered Code, include this CDDL HEADER in each
+ file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ If applicable, add the following below this CDDL HEADER, with the
+ fields enclosed by brackets "[]" replaced with your own identifying
+ information: Portions Copyright [yyyy] [name of copyright owner]
+
+ CDDL HEADER END
+
+ NOTE: This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade. Make customizations in a different
+ file.
+
+ Service manifest for audio.
+-->
+
+<service_bundle type='manifest' name='SUNWcsr:devices-audio'>
+
+<service
+ name='system/device/audio'
+ type='service'
+ version='1'>
+
+ <create_default_instance enabled='true' />
+
+ <single_instance/>
+
+ <!--
+ We don't really ndeed devices, just /usr. However this
+ avoids thrashing in devfsadm.
+ -->
+ <dependency
+ name='devices'
+ grouping='require_all'
+ restart_on='none'
+ type='service'>
+ <service_fmri value='svc:/milestone/devices' />
+ </dependency>
+
+ <dependent
+ name='devices_audio_multi-user'
+ grouping='require_all'
+ restart_on='none'>
+ <service_fmri value='svc:/milestone/multi-user' />
+ </dependent>
+
+ <exec_method
+ type='method'
+ name='start'
+ exec='/lib/svc/method/devices-audio'
+ timeout_seconds='30' />
+
+ <exec_method
+ type='method'
+ name='stop'
+ exec=':true'
+ timeout_seconds='1' />
+
+ <property_group name='startd' type='framework'>
+ <propval name='duration' type='astring' value='transient' />
+ </property_group>
+
+ <stability value='Evolving' />
+
+ <template>
+ <common_name>
+ <loctext xml:lang='C'>
+ Solaris audio device configuration.
+ </loctext>
+ </common_name>
+ </template>
+</service>
+
+</service_bundle>
diff --git a/usr/src/pkgdefs/SUNWad810/Makefile b/usr/src/pkgdefs/SUNWad810/Makefile
index 057f909322..9811a569cb 100644
--- a/usr/src/pkgdefs/SUNWad810/Makefile
+++ b/usr/src/pkgdefs/SUNWad810/Makefile
@@ -19,19 +19,19 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
DATAFILES += i.preserve
.KEEP_STATE:
-all: $(FILES) depend postinstall preremove
+all: $(FILES) depend
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWad810/postinstall b/usr/src/pkgdefs/SUNWad810/postinstall.tmpl
index 27f0fcd2e2..acee80b819 100644
--- a/usr/src/pkgdefs/SUNWad810/postinstall
+++ b/usr/src/pkgdefs/SUNWad810/postinstall.tmpl
@@ -20,52 +20,31 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# SUNWad810 postinstall script
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-
-#
-# Audio810(7d) driver had been released before solaris had
-# update_drv(1M) command so that we have to manually add
-# aliases via echo(1).
-#
-update_driver() {
- driver=$1
- aliases=$2
- for alias in ${aliases}
- do
- egrep "^${driver}[ ]+${alias}" ${BASEDIR}/etc/driver_aliases>/dev/null 2>&1
- if [ $? -ne 0 ]
- then
- echo "${driver} ${alias}" >> ${BASEDIR}/etc/driver_aliases
- fi
- done
-}
-
-EXIT=0
+include drv_utils
I810_ALIASES="\
\"pci1022,7445\" \
\"pci1022,746d\" \
+ \"pci1039,7012\" \
+ \"pci8086,2415\" \
+ \"pci8086,2425\" \
+ \"pci8086,2445\" \
\"pci8086,2485\" \
\"pci8086,24c5\" \
\"pci8086,24d5\" \
\"pci8086,266e\" \
+ \"pci8086,25a6\" \
+ \"pci8086,2698\" \
\"pci8086,27de\" \
+ \"pci8086,7195\" \
+ \"pci10de,1b1\" \
\"pci10de,6a\" \
+ \"pci10de,8a\" \
\"pci10de,da\" \
\"pci10de,ea\" \
\"pci10de,59\" \
@@ -73,16 +52,4 @@ I810_ALIASES="\
\"pci10de,26b\" \
"
-case "${ARCH}" in
- i386)
- not_installed audio810
- if [ $? -ne 0 ]
- then
- add_drv -b "${BASEDIR}" -i "${I810_ALIASES}" -n audio810 || EXIT=1
- else
- update_driver audio810 "${I810_ALIASES}" || EXIT=1
- fi
- ;;
-esac
-
-exit ${EXIT}
+pkg_drvadd -i "${I810_ALIASES}" audio810 || exit 1
diff --git a/usr/src/pkgdefs/SUNWad810/preremove b/usr/src/pkgdefs/SUNWad810/preremove
deleted file mode 100644
index 6a075b1a8c..0000000000
--- a/usr/src/pkgdefs/SUNWad810/preremove
+++ /dev/null
@@ -1,52 +0,0 @@
-#! /bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWad810 preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-EXIT=0
-
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
-
-case "${ARCH}" in
- i386)
- installed audio810 || rem_drv -b ${BASEDIR} audio810 || EXIT=1
- ;;
-esac
-
-exit ${EXIT}
diff --git a/usr/src/cmd/mdb/intel/ia32/audiosup/Makefile b/usr/src/pkgdefs/SUNWad810/preremove.tmpl
index 6e7a229eaa..4b1e20cc4e 100644
--- a/usr/src/cmd/mdb/intel/ia32/audiosup/Makefile
+++ b/usr/src/pkgdefs/SUNWad810/preremove.tmpl
@@ -1,10 +1,10 @@
+#! /bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,16 +20,11 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
+# SUNWad810 preremove script
-MODULE = audiosup.so
-MDBTGT = kvm
+include drv_utils
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../Makefile.ia32
-include ../../../Makefile.module
+pkg_drvrem audio810 || exit 1
diff --git a/usr/src/pkgdefs/SUNWadixp/Makefile b/usr/src/pkgdefs/SUNWadixp/Makefile
index 10ffbabe4d..c131ff1b31 100644
--- a/usr/src/pkgdefs/SUNWadixp/Makefile
+++ b/usr/src/pkgdefs/SUNWadixp/Makefile
@@ -18,20 +18,19 @@
#
# CDDL HEADER END
#
-
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
.KEEP_STATE:
-all: $(FILES) depend postinstall preremove
+all: $(FILES) depend
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWadixp/postinstall b/usr/src/pkgdefs/SUNWadixp/postinstall.tmpl
index 5e82d6ebfd..018ca2b1a7 100644
--- a/usr/src/pkgdefs/SUNWadixp/postinstall
+++ b/usr/src/pkgdefs/SUNWadixp/postinstall.tmpl
@@ -21,33 +21,21 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# SUNWadixp postinstall script
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-EXIT=0
-
-case "${ARCH}" in
- i386)
- not_installed audioixp|| \
- add_drv -b "${BASEDIR}" \
- -i '"pci1002,4370" "pci1002,4341"' \
- -n audioixp || \
- EXIT=1
+include drv_utils
- ;;
-esac
-
-exit ${EXIT}
+#
+# We could probably also do SB600, pci1002,4382, but we don't have any
+# hardware to confirm with.
+#
+IXP_ALIASES="\
+ \"pci1002,4370\" \
+ \"pci1002,4361\" \
+ \"pci1002,4341\" \
+ "
+
+pkg_drvadd -i "${IXP_ALIASES}" audioixp || exit 1
diff --git a/usr/src/cmd/mdb/intel/amd64/audiosup/Makefile b/usr/src/pkgdefs/SUNWadixp/preremove.tmpl
index d31cbe9363..d5e761cbad 100644
--- a/usr/src/cmd/mdb/intel/amd64/audiosup/Makefile
+++ b/usr/src/pkgdefs/SUNWadixp/preremove.tmpl
@@ -1,10 +1,10 @@
+#! /bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,17 +20,11 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
+# SUNWadixp preremove script
-MODULE = audiosup.so
-MDBTGT = kvm
+include drv_utils
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../../../Makefile.cmd.64
-include ../../Makefile.amd64
-include ../../../Makefile.module
+pkg_drvrem audioixp || exit 1
diff --git a/usr/src/pkgdefs/SUNWauda/prototype_com b/usr/src/pkgdefs/SUNWauda/prototype_com
index 582e28748c..0006160282 100644
--- a/usr/src/pkgdefs/SUNWauda/prototype_com
+++ b/usr/src/pkgdefs/SUNWauda/prototype_com
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,10 +19,8 @@
# CDDL HEADER END
#
#
-# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
-# All rights reserved.
-#
-#pragma ident "%Z%%M% %I% %E% SMI"
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
@@ -49,5 +46,6 @@ d none usr/bin 755 root bin
f none usr/bin/audioplay 555 root bin
f none usr/bin/audiorecord 555 root bin
f none usr/bin/audioconvert 555 root bin
+f none usr/bin/audiotest 555 root bin
d none usr/sbin 755 root bin
f none usr/sbin/mixerctl 555 root bin
diff --git a/usr/src/pkgdefs/SUNWaudd/Makefile b/usr/src/pkgdefs/SUNWaudd/Makefile
index 2f359c8e57..c6aee2f3cc 100644
--- a/usr/src/pkgdefs/SUNWaudd/Makefile
+++ b/usr/src/pkgdefs/SUNWaudd/Makefile
@@ -19,16 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
DATAFILES += depend
-LICENSEFILES += $(OSBL)
.KEEP_STATE:
@@ -36,3 +34,4 @@ all: $(FILES)
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl b/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
index f265f0f084..b7d9bb4c46 100644
--- a/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
+++ b/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
@@ -20,11 +20,9 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
#
# This required package information file describes characteristics of the
@@ -36,7 +34,7 @@ NAME="Audio Drivers"
ARCH="ISA"
VERSION="ONVERS,REV=0.0.0"
CATEGORY="system"
-DESC="SunOS audio device drivers using the new audio driver architecture"
+DESC="SunOS audio device drivers"
SUNW_PRODNAME="SunOS"
SUNW_PRODVERS="RELEASE/VERSION"
SUNW_PKGTYPE="root"
diff --git a/usr/src/pkgdefs/SUNWaudd/postinstall b/usr/src/pkgdefs/SUNWaudd/postinstall
deleted file mode 100644
index 93f2039cdb..0000000000
--- a/usr/src/pkgdefs/SUNWaudd/postinstall
+++ /dev/null
@@ -1,69 +0,0 @@
-#! /bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-
-#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWaudd postinstall script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-EXIT=0
-
-case "${ARCH}" in
- sparc)
- not_installed audiocs || \
- add_drv -b ${BASEDIR} -i '"SUNW,CS4231"' -n audiocs || EXIT=1
-
- not_installed audioens || \
- add_drv -b "${BASEDIR}" \
- -i '"pci1274,1371" "pci1274,5880"' \
- -n audioens || \
- EXIT=1
-
- not_installed audiots || \
- add_drv -b ${BASEDIR} -i '"pci10b9,5451"' -n audiots || EXIT=1
-
- not_installed audio1575 || \
- add_drv -b ${BASEDIR} -i '"pci10b9,5455"' -n audio1575 || EXIT=1
- ;;
- i386)
- not_installed audioens || \
- add_drv -b "${BASEDIR}" \
- -i '"pci1274,1371" "pci1274,5880"' \
- -n audioens || \
- EXIT=1
-
- ;;
-esac
-
-exit ${EXIT}
diff --git a/usr/src/pkgdefs/SUNWaudd/preremove b/usr/src/pkgdefs/SUNWaudd/postinstall.tmpl
index f646f7ecfa..1077780acb 100644
--- a/usr/src/pkgdefs/SUNWaudd/preremove
+++ b/usr/src/pkgdefs/SUNWaudd/postinstall.tmpl
@@ -21,37 +21,28 @@
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWaudd preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
+# SUNWaudd postinstall script
+include drv_utils
EXIT=0
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
+# common drivers first
+pkg_drvadd -n -m '* 0666 root sys' audio || EXIT=1
+pkg_drvadd -n austr || EXIT=1
+pkg_drvadd -n -i '"pci1274,1371" "pci1274,5880"' audioens || EXIT=1
+pkg_drvadd -n -i '"pci1274,5000"' audiopci || EXIT=1
case "${ARCH}" in
- sparc)
- installed audiocs || rem_drv -b ${BASEDIR} audiocs || EXIT=1
- installed audioens || rem_drv -b ${BASEDIR} audioens || EXIT=1
- installed audiots || rem_drv -b ${BASEDIR} audiots || EXIT=1
- installed audio1575 || rem_drv -b ${BASEDIR} audio1575 || EXIT=1
+ sparc)
+
+ pkg_drvadd -n -i '"SUNW,CS4231"' audiocs || EXIT=1
+ pkg_drvadd -n -i '"pci10b9,5451"' audiots || EXIT=1
+ pkg_drvadd -n -i '"pci10b9,5455"' audio1575 || EXIT=1
;;
- i386)
- installed audioens || rem_drv -b ${BASEDIR} audioens || EXIT=1
+ i386)
;;
esac
diff --git a/usr/src/pkgdefs/SUNWadixp/preremove b/usr/src/pkgdefs/SUNWaudd/preremove.tmpl
index a81ab22365..670212c5de 100644
--- a/usr/src/pkgdefs/SUNWadixp/preremove
+++ b/usr/src/pkgdefs/SUNWaudd/preremove.tmpl
@@ -21,32 +21,27 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWadixp preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
+# SUNWaudd preremove script
+include drv_utils
EXIT=0
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
-
case "${ARCH}" in
- i386)
- installed audioixp|| rem_drv -b ${BASEDIR} audioixp || EXIT=1
+ sparc)
+ pkg_drvrem audiocs || EXIT=1
+ pkg_drvrem audiots || EXIT=1
+ pkg_drvrem audio1575 || EXIT=1
+ ;;
+ i386)
;;
esac
+pkg_drvrem audioens || EXIT=1
+pkg_drvrem audiopci || EXIT=1
+pkg_drvrem austr || EXIT=1
+pkg_drvrem audio || EXIT=1
+
exit ${EXIT}
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_com b/usr/src/pkgdefs/SUNWaudd/prototype_com
index 8f3468eb41..628b244651 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_com
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_com
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 1999-2003 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -49,4 +46,7 @@ i preremove
d none kernel 755 root sys
d none kernel/misc 755 root sys
d none kernel/drv 755 root sys
+f none kernel/drv/audio.conf 644 root sys
f none kernel/drv/audioens.conf 644 root sys
+f none kernel/drv/audiopci.conf 644 root sys
+f none kernel/drv/austr.conf 644 root sys
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_i386 b/usr/src/pkgdefs/SUNWaudd/prototype_i386
index 11b7f9c956..2e8ec83faa 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_i386
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_i386
@@ -18,12 +18,11 @@
#
# CDDL HEADER END
#
+
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -47,13 +46,13 @@
#
d none kernel/misc/amd64 755 root sys
d none kernel/drv/amd64 755 root sys
-f none kernel/misc/amsrc1 755 root sys
-f none kernel/misc/amsrc2 755 root sys
-f none kernel/misc/audiosup 755 root sys
-f none kernel/misc/mixer 755 root sys
+f none kernel/misc/ac97 755 root sys
+f none kernel/drv/audio 755 root sys
f none kernel/drv/audioens 755 root sys
-f none kernel/misc/amd64/amsrc1 755 root sys
-f none kernel/misc/amd64/amsrc2 755 root sys
-f none kernel/misc/amd64/audiosup 755 root sys
-f none kernel/misc/amd64/mixer 755 root sys
+f none kernel/drv/audiopci 755 root sys
+f none kernel/drv/austr 755 root sys
+f none kernel/misc/amd64/ac97 755 root sys
+f none kernel/drv/amd64/audio 755 root sys
f none kernel/drv/amd64/audioens 755 root sys
+f none kernel/drv/amd64/audiopci 755 root sys
+f none kernel/drv/amd64/austr 755 root sys
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_sparc b/usr/src/pkgdefs/SUNWaudd/prototype_sparc
index b74cce5a43..d47f7d6d53 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_sparc
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -48,12 +46,12 @@ f none kernel/drv/audiocs.conf 644 root sys
f none kernel/drv/audiots.conf 644 root sys
f none kernel/drv/audio1575.conf 644 root sys
d none kernel/drv/sparcv9 755 root sys
+f none kernel/drv/sparcv9/audio 755 root sys
f none kernel/drv/sparcv9/audiocs 755 root sys
f none kernel/drv/sparcv9/audioens 755 root sys
+f none kernel/drv/sparcv9/audiopci 755 root sys
f none kernel/drv/sparcv9/audiots 755 root sys
f none kernel/drv/sparcv9/audio1575 755 root sys
+f none kernel/drv/sparcv9/austr 755 root sys
d none kernel/misc/sparcv9 755 root sys
-f none kernel/misc/sparcv9/amsrc1 755 root sys
-f none kernel/misc/sparcv9/amsrc2 755 root sys
-f none kernel/misc/sparcv9/audiosup 755 root sys
-f none kernel/misc/sparcv9/mixer 755 root sys
+f none kernel/misc/sparcv9/ac97 755 root sys
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_com b/usr/src/pkgdefs/SUNWaudh/prototype_com
index f8b1084510..992b63d102 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_com
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_com
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -45,20 +43,16 @@ i depend
#
d none usr 755 root sys
d none usr/include 755 root bin
+d none usr/include/audio 755 root bin
+f none usr/include/audio/au.h 644 root bin
d none usr/include/sys 755 root bin
f none usr/include/sys/audio.h 644 root bin
f none usr/include/sys/audioio.h 644 root bin
-f none usr/include/sys/audiovar.h 644 root bin
f none usr/include/sys/mixer.h 644 root bin
+f none usr/include/sys/soundcard.h 644 root bin
d none usr/include/sys/audio 755 root bin
-d none usr/include/audio 755 root bin
-f none usr/include/audio/au.h 644 root bin
f none usr/include/sys/audio/ac97.h 644 root bin
-f none usr/include/sys/audio/am_src1.h 644 root bin
-f none usr/include/sys/audio/audioens.h 644 root bin
-f none usr/include/sys/audio/audio_apm.h 644 root bin
-f none usr/include/sys/audio/audio_mixer.h 644 root bin
-f none usr/include/sys/audio/audio_src.h 644 root bin
-f none usr/include/sys/audio/audio_support.h 644 root bin
-f none usr/include/sys/audio/audio_trace.h 644 root bin
+f none usr/include/sys/audio/audio_common.h 644 root bin
+f none usr/include/sys/audio/audio_driver.h 644 root bin
+f none usr/include/sys/audio/audio_oss.h 644 root bin
f none usr/include/sys/audio/g711.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_i386 b/usr/src/pkgdefs/SUNWaudh/prototype_i386
index 7050a4f45d..08f9663c82 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_i386
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_i386
@@ -20,11 +20,9 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -46,7 +44,3 @@
#
# SUNWaudh
#
-f none usr/include/sys/audio/audio810.h 644 root bin
-f none usr/include/sys/audio/audiohd.h 644 root bin
-f none usr/include/sys/audio/audioixp.h 644 root bin
-f none usr/include/sys/audio/audiovia823x.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_sparc b/usr/src/pkgdefs/SUNWaudh/prototype_sparc
index 5c59192742..0e3250562d 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_sparc
@@ -20,11 +20,9 @@
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -44,7 +42,3 @@
#
# SUNWaudh
#
-f none usr/include/sys/audio/audio_4231.h 644 root bin
-f none usr/include/sys/audio/audiots.h 644 root bin
-f none usr/include/sys/audio/audio1575.h 644 root bin
-f none usr/include/sys/audio/am_src2.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudiohd/postinstall b/usr/src/pkgdefs/SUNWaudiohd/postinstall
index e02d59e4f5..77af8bf454 100644
--- a/usr/src/pkgdefs/SUNWaudiohd/postinstall
+++ b/usr/src/pkgdefs/SUNWaudiohd/postinstall
@@ -20,10 +20,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
#
# SUNWaudiohd postinstall script
@@ -55,6 +54,7 @@ AUDIOHD_ALIASES="\
\"pci8086,2668\" \
\"pci10de,371\" \
\"pciclass,0403\" \
+ \"pciexclass,0403\"\
"
case "${ARCH}" in
diff --git a/usr/src/pkgdefs/SUNWcsr/prototype_com b/usr/src/pkgdefs/SUNWcsr/prototype_com
index d3bbcae315..1d3ca9cf52 100644
--- a/usr/src/pkgdefs/SUNWcsr/prototype_com
+++ b/usr/src/pkgdefs/SUNWcsr/prototype_com
@@ -349,6 +349,7 @@ d none lib/svc/method 0755 root bin
f none lib/svc/method/boot-archive 0555 root bin
f none lib/svc/method/boot-archive-update 0555 root bin
f none lib/svc/method/console-login 0555 root bin
+f none lib/svc/method/devices-audio 0555 root bin
f none lib/svc/method/devices-local 0555 root bin
f none lib/svc/method/fs-local 0555 root bin
f none lib/svc/method/fs-minimal 0555 root bin
@@ -531,6 +532,7 @@ d none var/svc/manifest/system 755 root sys
f manifest var/svc/manifest/system/boot-archive.xml 0444 root sys
f manifest var/svc/manifest/system/boot-archive-update.xml 0444 root sys
d none var/svc/manifest/system/device 755 root sys
+f manifest var/svc/manifest/system/device/devices-audio.xml 0444 root sys
f manifest var/svc/manifest/system/device/devices-local.xml 0444 root sys
f manifest var/svc/manifest/system/device/mpxio-upgrade.xml 0444 root sys
d none var/svc/manifest/system/filesystem 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWmdb/prototype_i386 b/usr/src/pkgdefs/SUNWmdb/prototype_i386
index fb1a898f13..09e244c11c 100644
--- a/usr/src/pkgdefs/SUNWmdb/prototype_i386
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_i386
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -57,7 +57,6 @@ f none usr/platform/i86xpv/lib/mdb/kvm/xpv_psm.so 555 root sys
f none usr/platform/i86xpv/lib/mdb/kvm/xpv_uppc.so 555 root sys
d none usr/lib/mdb/kvm/amd64 755 root sys
f none usr/lib/mdb/kvm/amd64/arp.so 555 root sys
-f none usr/lib/mdb/kvm/amd64/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpc.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpu.generic.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpu_ms.AuthenticAMD.15.so 555 root sys
@@ -91,7 +90,6 @@ f none usr/lib/mdb/kvm/amd64/uhci.so 555 root sys
f none usr/lib/mdb/kvm/amd64/usba.so 555 root sys
f none usr/lib/mdb/kvm/amd64/sockfs.so 555 root sys
f none usr/lib/mdb/kvm/arp.so 555 root sys
-f none usr/lib/mdb/kvm/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/cpc.so 555 root sys
f none usr/lib/mdb/kvm/cpu.generic.so 555 root sys
f none usr/lib/mdb/kvm/cpu_ms.AuthenticAMD.15.so 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdb/prototype_sparc b/usr/src/pkgdefs/SUNWmdb/prototype_sparc
index eae343b703..8724dadf21 100644
--- a/usr/src/pkgdefs/SUNWmdb/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_sparc
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -38,7 +38,6 @@ f none usr/bin/sparcv9/mdb 555 root bin
l none usr/bin/sparcv9/adb=../../../usr/bin/sparcv9/mdb
d none usr/lib/mdb/kvm/sparcv9 755 root sys
f none usr/lib/mdb/kvm/sparcv9/arp.so 555 root sys
-f none usr/lib/mdb/kvm/sparcv9/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/cpc.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/crypto.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/genunix.so 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdbr/prototype_i386 b/usr/src/pkgdefs/SUNWmdbr/prototype_i386
index 662f4cb1e3..bc503a6419 100644
--- a/usr/src/pkgdefs/SUNWmdbr/prototype_i386
+++ b/usr/src/pkgdefs/SUNWmdbr/prototype_i386
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -27,7 +27,6 @@
d none kernel/kmdb/amd64 755 root sys
f none kernel/kmdb/amd64/arp 555 root sys
-f none kernel/kmdb/amd64/audiosup 555 root sys
f none kernel/kmdb/amd64/cpc 555 root sys
f none kernel/kmdb/amd64/cpu.generic 555 root sys
f none kernel/kmdb/amd64/cpu_ms.AuthenticAMD.15 555 root sys
@@ -60,7 +59,6 @@ f none kernel/kmdb/amd64/ufs 555 root sys
f none kernel/kmdb/amd64/uhci 555 root sys
f none kernel/kmdb/amd64/usba 555 root sys
f none kernel/kmdb/arp 555 root sys
-f none kernel/kmdb/audiosup 555 root sys
f none kernel/kmdb/cpc 555 root sys
f none kernel/kmdb/cpu.generic 555 root sys
f none kernel/kmdb/cpu_ms.AuthenticAMD.15 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdbr/prototype_sparc b/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
index 0e3e805552..d290db813d 100644
--- a/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -27,7 +27,6 @@
#
d none kernel/kmdb/sparcv9 755 root sys
f none kernel/kmdb/sparcv9/arp 555 root sys
-f none kernel/kmdb/sparcv9/audiosup 555 root sys
f none kernel/kmdb/sparcv9/cpc 555 root sys
f none kernel/kmdb/sparcv9/crypto 555 root sys
f none kernel/kmdb/sparcv9/genunix 555 root sys
diff --git a/usr/src/pkgdefs/SUNWtsg/prototype_com b/usr/src/pkgdefs/SUNWtsg/prototype_com
index ce19bf8603..c1c0897e0f 100644
--- a/usr/src/pkgdefs/SUNWtsg/prototype_com
+++ b/usr/src/pkgdefs/SUNWtsg/prototype_com
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -76,14 +74,17 @@ e devallocdefs etc/security/tsol/devalloc_defaults 0644 root sys
# Device clean scripts for the window system.
#
d none etc/security/lib 755 root sys
-f none etc/security/lib/audio_clean_wrapper 555 root sys
-s none etc/security/lib/audio_clean_wrapper.windowing=./audio_clean_wrapper
+s none etc/security/lib/audio_clean.windowing=./audio_clean
f none etc/security/lib/disk_clean 555 root sys
s none etc/security/lib/disk_clean.windowing=./disk_clean
s none etc/security/lib/st_clean.windowing=./st_clean
f none etc/security/lib/wdwmsg 555 root sys
f none etc/security/lib/wdwwrapper 555 root sys
#
+# Directory for saved audio settings
+#
+d none etc/security/audio 755 root sys
+#
# smf glue
d none lib 755 root bin
d none lib/svc 755 root bin
diff --git a/usr/src/pkgdefs/SUNWusb/prototype_i386 b/usr/src/pkgdefs/SUNWusb/prototype_i386
index 3f11cdcf2c..f838cda4e1 100644
--- a/usr/src/pkgdefs/SUNWusb/prototype_i386
+++ b/usr/src/pkgdefs/SUNWusb/prototype_i386
@@ -23,7 +23,6 @@
# Use is subject to license terms.
#
-
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
@@ -48,7 +47,6 @@
#
# SUNWusb
#
-f none kernel/dacf/usb_ac_dacf 0755 root sys
f none kernel/drv/uhci 0755 root sys
f none kernel/drv/ohci 0755 root sys
f none kernel/drv/ehci 0755 root sys
@@ -72,7 +70,6 @@ f none kernel/strmod/usbkbm 0755 root sys
f none kernel/strmod/usbms 0755 root sys
f none kernel/strmod/usb_ah 0755 root sys
d none kernel/dacf/amd64 0755 root sys
-f none kernel/dacf/amd64/usb_ac_dacf 0755 root sys
d none kernel/drv/amd64 0755 root sys
f none kernel/drv/amd64/uhci 0755 root sys
f none kernel/drv/amd64/ohci 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWusb/prototype_sparc b/usr/src/pkgdefs/SUNWusb/prototype_sparc
index 032085ff5a..afe299a46b 100644
--- a/usr/src/pkgdefs/SUNWusb/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWusb/prototype_sparc
@@ -48,7 +48,6 @@
# SUNWusb
#
d none kernel/dacf/sparcv9 0755 root sys
-f none kernel/dacf/sparcv9/usb_ac_dacf 0755 root sys
d none kernel/drv/sparcv9 0755 root sys
f none kernel/drv/sparcv9/ohci 0755 root sys
f none kernel/drv/sparcv9/ehci 0755 root sys
diff --git a/usr/src/pkgdefs/etc/exception_list_sparc b/usr/src/pkgdefs/etc/exception_list_sparc
index ac70d0ee47..b78baab717 100644
--- a/usr/src/pkgdefs/etc/exception_list_sparc
+++ b/usr/src/pkgdefs/etc/exception_list_sparc
@@ -822,21 +822,6 @@ kernel/drv/usbskel.conf sparc
#
usr/include/sys/libdevid.h sparc
#
-# amd 8111 audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audio810 sparc
-kernel/drv/audio810.conf sparc
-#
-# High definition audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audiohd sparc
-kernel/drv/audiohd.conf sparc
-#
-# VIA VT823x audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audiovia823x sparc
-kernel/drv/audiovia823x.conf sparc
-#
# The following files are installed in the proto area by the build of
# libprtdiag. libprtdiag contains interfaces which are all private.
# Only the shared object is shipped.
diff --git a/usr/src/tools/findunref/exception_list.open b/usr/src/tools/findunref/exception_list.open
index 8d70459071..1d0c7a43b5 100644
--- a/usr/src/tools/findunref/exception_list.open
+++ b/usr/src/tools/findunref/exception_list.open
@@ -20,7 +20,7 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -117,11 +117,6 @@
./src/*.ref
#
-# Ignore warlock-related goop; not used during a nightly.
-#
-./src/uts/sparc/amsrc*/main.c
-
-#
# Ignore internal test directories and test programs.
#
*/tests
@@ -250,7 +245,6 @@
./src/uts/sparc/si3124/Makefile
./src/uts/sparc/nv_sata/Makefile
./src/uts/sparc/ahci/Makefile
-./src/uts/sparc/audioixp/Makefile
#
# Ignore uttrack.c. It is provided as part of the standard
diff --git a/usr/src/tools/scripts/bfu.sh b/usr/src/tools/scripts/bfu.sh
index ee62f02801..58614feb6d 100644
--- a/usr/src/tools/scripts/bfu.sh
+++ b/usr/src/tools/scripts/bfu.sh
@@ -302,6 +302,7 @@ superfluous_nonglobal_zone_files="
kernel
lib/libmeta.so
lib/libmeta.so.1
+ lib/svc/method/devices-audio
lib/svc/method/fc-fabric
lib/svc/method/iscsi-initiator
lib/svc/method/npivconfig
@@ -379,6 +380,7 @@ superfluous_nonglobal_zone_files="
var/svc/manifest/platform/sun4u/sf880drd.xml
var/svc/manifest/platform/sun4v
var/svc/manifest/system/cvc.xml
+ var/svc/manifest/system/device/devices-audio.xml
var/svc/manifest/system/device/devices-fc-fabric.xml
var/svc/manifest/system/dumpadm.xml
var/svc/manifest/system/filesystem/rmvolmgr.xml
@@ -963,6 +965,33 @@ nfsmapid_cfg() {
}
#
+# Detect Boomer audio framework; used to emit a notice at the end of BFU
+# telling the user to run update_audio to complete the upgrade.
+#
+BOOMER_PRESENT_SYS=false
+BOOMER_PRESENT_BFU=false
+BOOMER_DRIVERS="audio austr"
+
+check_boomer_sys() {
+ typeset root=$1
+ typeset n2m=$root/etc/name_to_major
+ typeset drv
+
+ for drv in $BOOMER_DRIVERS; do
+ if ! grep -w $drv $n2m > /dev/null 2>&1; then
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+check_boomer_bfu() {
+ $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null |
+ grep devices-audio.xml > /dev/null 2>&1
+}
+
+#
# Define global variables
#
CALL_DEVID_DESTROY=""
@@ -1646,6 +1675,16 @@ smf_cleanup_vt() {
)
}
+smf_cleanup_boomer() {
+ (
+ smf_delete_manifest var/src/manifest/system/devices-audio.xml
+ cd $root
+ rm -f lib/svc/method/devices-audio
+
+ /tmp/bfubin/svccfg delete -f svc:/system/device/audio
+ )
+}
+
old_mfst_dir="var/svc/manifest.orig"
new_mfst_dir="var/svc/manifest"
@@ -1980,6 +2019,13 @@ smf_apply_conf () {
smf_cleanup_vt
fi
+ #
+ # Remove the Boomer audio service when BFUing to legacy audio bits
+ #
+ if ! check_boomer_bfu && [ $zone = global ]; then
+ smf_cleanup_boomer
+ fi
+
print "Disabling unneeded inetd.conf entries ..."
smf_inetd_disable
smf_tftp_reinstall
@@ -6679,7 +6725,6 @@ mondo_loop() {
$root/kernel/misc/consconfig \
$root/kernel/misc/dada \
$root/kernel/misc/des \
- $root/kernel/misc/diaudio \
$root/kernel/misc/fctl \
$root/kernel/misc/fssnap_if \
$root/kernel/misc/gld \
@@ -7035,6 +7080,64 @@ mondo_loop() {
fi
#
+ # Remove obsolete audio bits. The SADA modules are removed as
+ # no driver uses them any more. We don't ship certain device
+ # private headers anymore, as well as headers for the now
+ # obsolete (and never documented) legacy audio driver API.
+ #
+ rm -f $usr/include/sys/audiovar.h
+ rm -f $usr/include/sys/audio/am_src1.h
+ rm -f $usr/include/sys/audio/am_src2.h
+ rm -f $usr/include/sys/audio/audio1575.h
+ rm -f $usr/include/sys/audio/audio810.h
+ rm -f $usr/include/sys/audio/audioens.h
+ rm -f $usr/include/sys/audio/audiohd.h
+ rm -f $usr/include/sys/audio/audioixp.h
+ rm -f $usr/include/sys/audio/audiots.h
+ rm -f $usr/include/sys/audio/audiovia823x.h
+ rm -f $usr/include/sys/audio/audio_4231.h
+ rm -f $usr/include/sys/audio/audio_apm.h
+ rm -f $usr/include/sys/audio/audio_mixer.h
+ rm -f $usr/include/sys/audio/audio_src.h
+ rm -f $usr/include/sys/audio/audio_support.h
+ rm -f $usr/include/sys/audio/audio_trace.h
+ rm -f $root/kernel/misc/amsrc1
+ rm -f $root/kernel/misc/amsrc2
+ rm -f $root/kernel/misc/audiosup
+ rm -f $root/kernel/misc/diaudio
+ rm -f $root/kernel/misc/mixer
+ rm -f $root/kernel/misc/amd64/amsrc1
+ rm -f $root/kernel/misc/amd64/amsrc2
+ rm -f $root/kernel/misc/amd64/audiosup
+ rm -f $root/kernel/misc/amd64/diaudio
+ rm -f $root/kernel/misc/amd64/mixer
+ rm -f $root/kernel/misc/sparcv9/amsrc1
+ rm -f $root/kernel/misc/sparcv9/amsrc2
+ rm -f $root/kernel/misc/sparcv9/audiosup
+ rm -f $root/kernel/misc/sparcv9/diaudio
+ rm -f $root/kernel/misc/sparcv9/mixer
+
+ #
+ # Determine whether to emit update_audio notice or not
+ #
+ check_boomer_sys $root && BOOMER_PRESENT_SYS=true
+ check_boomer_bfu && BOOMER_PRESENT_BFU=true
+
+ # Cleanup audio devlinks when bfu'ing back to legacy audio bits.
+ # We also cleanup devlinks the first time when upgrading from legacy
+ # to Boomer bits in the update_audio script
+ #
+ if $BOOMER_PRESENT_SYS && ! $BOOMER_PRESENT_BFU; then
+ rm -f $root/dev/mixer*
+ rm -f $root/dev/sndstat*
+ rm -f $root/dev/audio*
+ rm -f $root/dev/dsp*
+ rm -f $root/dev/sound/*
+
+ touch $root/reconfigure
+ fi
+
+ #
# Diskless clients have already extracted /usr so don't delete this
# Non-global zones never extracts /usr so don't delete these
#
@@ -8220,6 +8323,17 @@ mondo_loop() {
$epilogue || print "WARNING: $epilogue failed with code $?"
fi
+ #
+ # Emit notice about upgrading the audio sub-system
+ #
+ if $BOOMER_PRESENT_BFU && ! $BOOMER_PRESENT_SYS; then
+ print
+ print "NOTICE: you must run the 'update_audio' script (from"
+ print "${GATE}/public/bin) to complete the upgrade of "
+ print "the audio sub-system"
+ print
+ fi
+
((seconds = SECONDS))
((min = seconds / 60))
((sec = seconds % 60))
diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files
index e39f3c4273..c94490f6e5 100644
--- a/usr/src/uts/common/Makefile.files
+++ b/usr/src/uts/common/Makefile.files
@@ -418,16 +418,31 @@ DCPC_OBJS += dcpc.o
#
IPP_OBJS += ippctl.o
+AUDIO_OBJS += audio_client.o audio_ddi.o audio_engine.o \
+ audio_fltdata.o audio_format.o audio_ctrl.o \
+ audio_grc3.o audio_output.o audio_input.o \
+ audio_oss.o audio_sun.o
+
+AUSTR_OBJS += austr.o
+
+AUDIOENS_OBJS += audioens.o
+
AUDIOVIA823X_OBJS += audiovia823x.o
+AUDIO1575_OBJS += audio1575.o
+
AUDIO810_OBJS += audio810.o
AUDIOHD_OBJS += audiohd.o
AUDIOIXP_OBJS += audioixp.o
+AUDIOPCI_OBJS += audiopci.o
+
AUDIOTS_OBJS += audiots.o
+AC97_OBJS += ac97.o ac97_ad.o ac97_alc.o ac97_cmi.o
+
CARDBUS_OBJS += cardbus.o cardbus_hp.o cardbus_cfg.o
CONSKBD_OBJS += conskbd.o
@@ -669,9 +684,7 @@ USBVC_OBJS += usbvc.o usbvc_v4l2.o
HIDPARSER_OBJS += hidparser.o
-USB_AC_OBJS += usb_ac.o
-
-USB_AC_DACF_OBJS += usb_ac_dacf.o
+USB_AC_OBJS += usb_ac.o audio_shim.o
USB_AS_OBJS += usb_as.o
@@ -1446,12 +1459,6 @@ KSSL_OBJS += kssl.o ksslioctl.o ksslapi.o ksslrec.o
# misc. modules
#
-AMSRC2_OBJS += am_src2.o
-
-AUDIO_SUP_OBJS += audio_support.o
-
-MIXER_OBJS += am_main.o am_ad.o am_ioctl.o
-
C2AUDIT_OBJS += adr.o audit.o audit_event.o audit_io.o \
audit_path.o audit_start.o audit_syscalls.o audit_token.o \
audit_mem.o audit_zone.o
diff --git a/usr/src/uts/common/Makefile.rules b/usr/src/uts/common/Makefile.rules
index c78620958b..0aa7d11769 100644
--- a/usr/src/uts/common/Makefile.rules
+++ b/usr/src/uts/common/Makefile.rules
@@ -532,31 +532,43 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/atu/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/impl/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/ac97/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audioens/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audio1575/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audio810/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/framework/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiohd/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/mixer/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audioixp/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiopci/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiots/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiovia823x/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
@@ -1695,25 +1707,34 @@ $(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/ath/%.c
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/atu/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/impl/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/ac97/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audio1575/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audio810/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/mixer/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audioens/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/framework/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiohd/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audioixp/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiopci/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiots/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiovia823x/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/bge/%.c
diff --git a/usr/src/uts/common/brand/lx/io/lx_audio.c b/usr/src/uts/common/brand/lx/io/lx_audio.c
index 8f80c61853..957e3de108 100644
--- a/usr/src/uts/common/brand/lx/io/lx_audio.c
+++ b/usr/src/uts/common/brand/lx/io/lx_audio.c
@@ -1086,30 +1086,14 @@ lxa_audio_getinfo(lxa_state_t *lxa_state, intptr_t arg, int mode)
static int
lxa_mixer_ai_from_lh(ldi_handle_t lh, audio_info_t *ai)
{
- am_control_t *actl;
- int rv, ch_count, junk;
+ int rv, junk;
ASSERT((lh != NULL) && (ai != NULL));
- /* get the number of channels for the underlying device */
- if ((rv = ldi_ioctl(lh, AUDIO_GET_NUM_CHS,
- (intptr_t)&ch_count, FKIOCTL, kcred, &junk)) != 0)
- return (rv);
-
- /* allocate the am_control_t structure */
- actl = kmem_alloc(AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count), KM_SLEEP);
-
/* get the device state and channel state */
- if ((rv = ldi_ioctl(lh, AUDIO_MIXERCTL_GETINFO,
- (intptr_t)actl, FKIOCTL, kcred, &junk)) != 0) {
- kmem_free(actl, AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count));
- return (rv);
- }
+ rv = ldi_ioctl(lh, AUDIO_GETINFO, (intptr_t)ai, FKIOCTL, kcred, &junk);
- /* return the audio_info structure */
- *ai = actl->dev_info;
- kmem_free(actl, AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count));
- return (0);
+ return (rv);
}
static int
@@ -1199,18 +1183,8 @@ lxa_mixer_set_common(lxa_state_t *lxa_state, int cmd, intptr_t arg, int mode)
break;
}
- /*
- * we're going to cheat here. normally the
- * MIXERCTL_SETINFO ioctl take am_control_t and the
- * AUDIO_SETINFO takes an audio_info_t. as it turns
- * out the first element in a am_control_t is an
- * audio_info_t. also, the rest of the am_control_t
- * structure is normally ignored for a MIXERCTL_SETINFO
- * ioctl. so here we'll try to fall back to the code
- * that handles AUDIO_SETINFO ioctls.
- */
- return (lxa_audio_setinfo(lxa_state, AUDIO_MIXERCTL_SETINFO,
- (intptr_t)&ai, FKIOCTL));
+ return (lxa_audio_setinfo(lxa_state, AUDIO_SETINFO, (intptr_t)&ai,
+ FKIOCTL));
}
static int
@@ -1665,6 +1639,7 @@ lxa_read(dev_t dev, struct uio *uiop, cred_t *credp)
{
lxa_state_t *lxa_state;
minor_t minor = getminor(dev);
+ int rv;
/* get the handle for this device */
if (mod_hash_find(lxa_state_hash, (mod_hash_key_t)(uintptr_t)minor,
@@ -1683,7 +1658,13 @@ lxa_read(dev_t dev, struct uio *uiop, cred_t *credp)
return (EBADF);
/* pass the request on */
- return (ldi_read(lxa_state->lxas_idev_lh, uiop, kcred));
+ while (uiop->uio_resid != 0) {
+ rv = ldi_read(lxa_state->lxas_idev_lh, uiop, kcred);
+ if ((rv != 0) || (uiop->uio_fmode & (FNONBLOCK|FNDELAY))) {
+ break;
+ }
+ }
+ return (rv);
}
static int
@@ -1692,6 +1673,7 @@ lxa_write(dev_t dev, struct uio *uiop, cred_t *credp)
{
lxa_state_t *lxa_state;
minor_t minor = getminor(dev);
+ int rv;
/* get the handle for this device */
if (mod_hash_find(lxa_state_hash, (mod_hash_key_t)(uintptr_t)minor,
@@ -1710,7 +1692,13 @@ lxa_write(dev_t dev, struct uio *uiop, cred_t *credp)
return (EBADF);
/* pass the request on */
- return (ldi_write(lxa_state->lxas_odev_lh, uiop, kcred));
+ while (uiop->uio_resid != 0) {
+ rv = ldi_write(lxa_state->lxas_odev_lh, uiop, kcred);
+ if ((rv != 0) || (uiop->uio_fmode & (FNONBLOCK|FNDELAY))) {
+ break;
+ }
+ }
+ return (rv);
}
static int
diff --git a/usr/src/uts/common/io/audio/ac97/ac97.c b/usr/src/uts/common/io/audio/ac97/ac97.c
new file mode 100644
index 0000000000..783e1d1efe
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97.c
@@ -0,0 +1,1974 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+/*
+ * This is the initial value for many controls. This is
+ * a 75% level.
+ */
+#define INIT_VAL_MAIN ((75 << 8) | 75)
+#define INIT_VAL_ST ((75 << 8) | 75)
+#define INIT_VAL_MN 75
+#define INIT_IGAIN_ST ((50 << 8) | 50)
+#define INIT_IGAIN_MN 50
+
+/*
+ * In AC'97 v2.3, the registers are carved up as follows:
+ *
+ * Audio Base Registers: 0x00 - 0x26
+ * Audio Extended Registers: 0x28 - 0x3A
+ * Modem Extended Registers: 0x3C - 0x58
+ * Vendor Reserved Registers: 0x5A - 0x5F
+ * Page Registers: 0x60 - 0x6F
+ * Vendor Reserved Registers: 0x70 - 0x7A
+ * Vendor ID Registers: 0x7C - 0x7F
+ *
+ * We only need to shadow the normal audio registers by default.
+ * TBD: Handling of codec-specific registers in vendor reserved space.
+ * We cannot necessarily meaningfully shadow them.
+ */
+#define LAST_SHADOW_REG 0x3A
+#define NUM_SHADOW ((LAST_SHADOW_REG / sizeof (uint16_t)) + 1)
+#define SHADOW(ac, reg) ((ac)->shadow[((reg) / sizeof (uint16_t))])
+
+/*
+ * Record source selection.
+ */
+#define INPUT_MIC 0
+#define INPUT_CD 1
+#define INPUT_VIDEO 2
+#define INPUT_AUXIN 3
+#define INPUT_LINEIN 4
+#define INPUT_STEREOMIX 5
+#define INPUT_MONOMIX 6
+#define INPUT_PHONE 7
+
+static const char *ac97_insrcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_VIDEO,
+ AUDIO_PORT_AUX1IN,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_STEREOMIX,
+ AUDIO_PORT_MONOMIX,
+ AUDIO_PORT_PHONE,
+ NULL,
+};
+
+/*
+ * Per audio device state structure
+ */
+struct ac97 {
+ dev_info_t *dip; /* DDI device instance */
+ audio_dev_t *d;
+ void *private; /* drivers devc */
+ ac97_rd_t rd; /* drivers port read routine */
+ ac97_wr_t wr; /* drivers port write routine */
+ char name[128]; /* driver instance name */
+
+ uint16_t shadow[NUM_SHADOW];
+
+ boolean_t suspended; /* true if suspended */
+ kt_did_t resumer; /* resumer if suspended */
+ uint32_t flags;
+#define AC97_FLAG_AMPLIFIER (1 << 0) /* ext. amp on by default */
+#define AC97_FLAG_MICBOOST (1 << 1) /* micboost on by default */
+#define AC97_FLAG_SPEAKER (1 << 2) /* mono out on by default */
+
+#define AC97_FLAG_AUX_HP (1 << 4) /* possible uses for AUX_OUT */
+#define AC97_FLAG_AUX_4CH (1 << 5)
+#define AC97_FLAG_AUX_LVL (1 << 6)
+#define AC97_FLAG_SPEAKER_OK (1 << 7) /* expose mono out */
+#define AC97_FLAG_NO_HEADPHONE (1 << 8) /* do not expose headphone */
+#define AC97_FLAG_NO_CDROM (1 << 9) /* do not expose CDROM */
+#define AC97_FLAG_NO_PHONE (1 << 10) /* do not expose phone in */
+#define AC97_FLAG_NO_VIDEO (1 << 11) /* do not expose video in */
+#define AC97_FLAG_NO_AUXIN (1 << 12) /* do not expose aux in */
+#define AC97_FLAG_NO_AUXOUT (1 << 13) /* do not expose aux out */
+#define AC97_FLAG_NO_LINEIN (1 << 14) /* do not expose linein */
+#define AC97_FLAG_NO_MIC (1 << 15) /* do not expose mic */
+
+ uint32_t vid; /* Vendor ID for CODEC */
+ uint16_t caps;
+
+ void (*codec_init)(ac97_t *);
+ void (*codec_reset)(ac97_t *);
+
+ kmutex_t ac_lock;
+ list_t ctrls;
+
+ uint64_t inputs;
+};
+
+struct modlmisc ac97_modlmisc = {
+ &mod_miscops,
+ "Audio Codec '97 Support"
+};
+
+struct modlinkage ac97_modlinkage = {
+ MODREV_1,
+ { &ac97_modlmisc, NULL }
+};
+
+int
+_init(void)
+{
+ return (mod_install(&ac97_modlinkage));
+}
+
+int
+_fini(void)
+{
+ return (mod_install(&ac97_modlinkage));
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&ac97_modlinkage, modinfop));
+}
+
+
+#if 0
+/*
+ * The following table, and the code to scale it, works in percentages.
+ * This may be convenient for humans, but it would be faster if the table
+ * entries were rescaled to 256. (Division by 100 is painful. Divison by
+ * 256 is trivial.)
+ */
+static const char ac97_val_cvt[101] = {
+ 0, 0, 3, 7, 10, 13, 16, 19,
+ 21, 23, 26, 28, 30, 32, 34, 35,
+ 37, 39, 40, 42, 43, 45, 46, 47,
+ 49, 50, 51, 52, 53, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65,
+ 65, 66, 67, 68, 69, 70, 70, 71,
+ 72, 73, 73, 74, 75, 75, 76, 77,
+ 77, 78, 79, 79, 80, 81, 81, 82,
+ 82, 83, 84, 84, 85, 85, 86, 86,
+ 87, 87, 88, 88, 89, 89, 90, 90,
+ 91, 91, 92, 92, 93, 93, 94, 94,
+ 95, 95, 96, 96, 96, 97, 97, 98,
+ 98, 98, 99, 99, 100
+};
+#endif
+
+/*
+ * This code has three main functions. All related to converting
+ * a standard controls value to hardware specific values. All
+ * Standard passed in values are 0-100 as in percent.
+ *
+ * First it takes a value passed in as volume or gain and
+ * converts to attenuation or gain correspondingly. Since this is
+ * what the hardware needs.
+ *
+ * Second it adjusts the value passed in to compensate for the none
+ * linear nature of human hearing, sound loudness, sensitivity. It
+ * converts the linear value to a logarithmic value. This gives users
+ * the perception that the controls are linear.
+ *
+ * Third it converts the value to the number of bits that a hardware
+ * register needs to be.
+ *
+ * On input the following are supplied:
+ * left - The gain or volume in percent for left channel.
+ * right - The gain or volume in percent for right channel.
+ * bits - The number of bits the hardware needs. If this value
+ * is negetive then right and left are gain else they
+ * are volume.
+ *
+ * On return the following is returned:
+ *
+ * bit: 15 8 7 0
+ * ----------------------------------
+ * | left channel | right channel |
+ * ----------------------------------
+ * ( each channel is "bits" wide )
+ */
+uint16_t
+ac97_val_scale(int left, int right, int bits)
+{
+ ASSERT(left <= 100);
+ ASSERT(right <= 100);
+
+ if (bits < 0) { /* This is gain not ATTN */
+ left = 100 - left;
+ right = 100 - right;
+ bits = -bits;
+ }
+
+#if 0
+ /*
+ * 4Front's code used a table to smooth the transitions
+ * somewhat. Without this change, the volume levels adjusted
+ * near the top of the table seem to have less effect. Its
+ * hard to notice a volume change from 100 to 95, without the
+ * val_cvt table, for example. However, the scaling has an
+ * ugly side effect, which is at the default volumes (75%), we
+ * wind up having the level set too high for some
+ * codec/amplifier combinations.
+ *
+ * Legacy Sun code didn't have this table, and some
+ * qualitative testing shows that it isn't really necessary.
+ */
+ left = 100 - ac97_val_cvt[left];
+ right = 100 - ac97_val_cvt[right];
+#else
+ left = 100 - left;
+ right = 100 - right;
+#endif
+ return (((left * ((1 << bits) - 1) / 100) << 8) |
+ (right * ((1 << bits) - 1) / 100));
+}
+
+uint16_t
+ac97_mono_scale(int val, int bits)
+{
+ ASSERT(val <= 100);
+
+ if (bits < 0) { /* This is gain not ATTN */
+ bits = -bits;
+ } else {
+ val = 100 - val; /* convert to attenuation */
+ }
+ return (val * ((1 << bits) - 1) / 100);
+}
+
+
+audio_dev_t *
+ac97_get_dev(ac97_t *ac)
+{
+ return (ac->d);
+}
+
+int
+ac97_get_prop(ac97_t *ac, char *prop, int defval)
+{
+ int rv;
+
+ rv = ddi_prop_get_int(DDI_DEV_T_ANY, ac->dip, DDI_PROP_DONTPASS,
+ prop, defval);
+ return (rv);
+}
+
+/*
+ * This calls the Hardware drivers access write routine
+ * to write to a device register.
+ */
+#define WR(r, v) (ac)->wr((ac)->private, (r), (v))
+#define RD(r) (ac)->rd((ac)->private, (r))
+
+/*
+ * Probe routines for optional controls
+ *
+ * These routines each probe one aspect of hardware
+ * for controls presents.
+ * If the control is present these routines should
+ * return none zero.
+ */
+
+/*
+ * Is the named register implemented? This routine saves and
+ * restores the original value, and relies on the fact that the
+ * registers (if implemented) will have at least one bit that acts
+ * as a mute (0x8000, 0x8080), so we can probe "silently".
+ *
+ * The probe logic is suggested by the AC'97 2.3 spec. (Unimplemented
+ * registers are required to return zero to facilitate this sort of
+ * detection.)
+ */
+static int
+ac97_probe_reg(ac97_t *ac, uint8_t reg)
+{
+ uint16_t val;
+ int rv = 0;
+
+ /* get the original value */
+ val = RD(reg);
+ WR(reg, 0xffff);
+ if (RD(reg) != 0) {
+ rv = 1;
+ }
+ /* restore the original value */
+ WR(reg, val);
+ return (rv);
+}
+
+/*
+ * Does this device have bass/treble controls?
+ */
+static int
+ac97_probe_tone(ac97_t *ac)
+{
+ /* Bass/Treble contols present */
+ if (ac->caps & RR_BASS_TREBLE)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * If there is a loudness switch?
+ */
+static int
+ac97_probe_loud(ac97_t *ac)
+{
+ /* loudness contol present */
+ if (ac->caps & RR_LOUDNESS_SUPPORT)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a mono-mic input volume control?
+ */
+static int
+ac97_probe_mmic(ac97_t *ac)
+{
+ /* mono mic present */
+ if (ac->caps & RR_DEDICATED_MIC)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a simulated stereo switch?
+ */
+static int
+ac97_probe_stsim(ac97_t *ac)
+{
+ /* simulated stereocontol present */
+ if (ac->caps & RR_PSEUDO_STEREO)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a PC beeper input volume control?
+ */
+static int
+ac97_probe_pcbeep(ac97_t *ac)
+{
+ return (ac97_probe_reg(ac, AC97_PC_BEEP_REGISTER));
+}
+
+/*
+ * Does this device have AUX output port volume control?
+ */
+static int
+ac97_probe_rear(ac97_t *ac)
+{
+ if (ac->flags & AC97_FLAG_AUX_4CH)
+ return (1);
+ else
+ return (0);
+
+}
+
+/*
+ * Does this device have a mic?
+ */
+static int
+ac97_probe_mic(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_MIC)) &&
+ (ac97_probe_reg(ac, AC97_MIC_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_MIC);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * If this device has an AUX output port is it used for headphones?
+ */
+static int
+ac97_probe_headphone(ac97_t *ac)
+{
+ /* headphone control present */
+ if ((ac->flags & AC97_FLAG_AUX_HP) &&
+ !(ac->flags & AC97_FLAG_NO_HEADPHONE)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have AUX output port volume control?
+ */
+static int
+ac97_probe_auxout(ac97_t *ac)
+{
+ /* ALT PCM control present */
+ if ((ac->flags & AC97_FLAG_AUX_LVL) &&
+ !(ac->flags & AC97_FLAG_NO_AUXOUT)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have an AUX input port volume control?
+ */
+static int
+ac97_probe_auxin(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_AUXIN)) &&
+ (ac97_probe_reg(ac, AC97_AUX_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_AUXIN);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a phone input port with a volume control?
+ */
+static int
+ac97_probe_phone(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_PHONE)) &&
+ (ac97_probe_reg(ac, AC97_PHONE_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_PHONE);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a mono output port with volume control?
+ */
+static int
+ac97_probe_mono(ac97_t *ac)
+{
+ if (!(ac->flags & AC97_FLAG_SPEAKER_OK)) {
+ return (0);
+ }
+ if (ac97_probe_reg(ac, AC97_MONO_MASTER_VOLUME_REGISTER)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a line input port with volume control?
+ */
+static int
+ac97_probe_linein(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_LINEIN)) &&
+ (ac97_probe_reg(ac, AC97_LINE_IN_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_LINEIN);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a cdrom input port with volume control?
+ */
+static int
+ac97_probe_cdrom(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_CDROM)) &&
+ (ac97_probe_reg(ac, AC97_CD_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_CD);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a video input port with volume control?
+ */
+static int
+ac97_probe_video(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_VIDEO)) &&
+ (ac97_probe_reg(ac, AC97_VIDEO_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_VIDEO);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a 3D sound enhancement?
+ */
+static int
+ac97_probe_3d(ac97_t *ac)
+{
+ /* 3D control present */
+ if (ac->caps & RR_3D_STEREO_ENHANCE_MASK)
+ return (1);
+ else
+ return (0);
+}
+
+static int
+ac97_probe_3d_impl(ac97_t *ac, uint16_t mask)
+{
+ int rv = 0;
+ uint16_t val;
+
+ if ((ac->caps & RR_3D_STEREO_ENHANCE_MASK) == 0)
+ return (0);
+
+ /* get the original value */
+ val = RD(AC97_THREE_D_CONTROL_REGISTER);
+ WR(AC97_THREE_D_CONTROL_REGISTER, mask);
+ if ((RD(AC97_THREE_D_CONTROL_REGISTER) & mask) != 0) {
+ rv = 1;
+ }
+ /* restore the original value */
+ WR(AC97_THREE_D_CONTROL_REGISTER, val);
+ return (rv);
+}
+
+static int
+ac97_probe_3d_depth(ac97_t *ac)
+{
+ return (ac97_probe_3d_impl(ac, TDCR_DEPTH_MASK));
+}
+
+static int
+ac97_probe_3d_center(ac97_t *ac)
+{
+ return (ac97_probe_3d_impl(ac, TDCR_CENTER_MASK));
+}
+
+/*
+ * Does this device have a center output port with volume control?
+ */
+static int
+ac97_probe_center(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* center volume present */
+ if (val & EAR_CDAC)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a LFE (Sub-woofer) output port with
+ * a volume control?
+ */
+static int
+ac97_probe_lfe(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* We have LFE control */
+ if (val & EAR_LDAC)
+ return (1);
+ else
+ return (0);
+
+}
+
+/*
+ * Are we a multichannel codec?
+ */
+static int
+ac97_probe_front(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* Are any of the Surround, Center, or LFE dacs present? */
+ if (val & (EAR_SDAC | EAR_CDAC | EAR_LDAC))
+ return (1);
+ else
+ return (0);
+}
+
+static int
+ac97_probe_lineout(ac97_t *ac)
+{
+ /* if not multichannel, then use "lineout" instead of "front" label */
+ return (!ac97_probe_front(ac));
+}
+
+static const char *ac97_mics[] = {
+ AUDIO_PORT_MIC1,
+ AUDIO_PORT_MIC2,
+ NULL,
+};
+
+static const char *ac97_monos[] = {
+ AUDIO_PORT_MONOMIX,
+ AUDIO_PORT_MIC,
+ NULL
+};
+
+/*
+ * This calls the Hardware drivers access write routine
+ * to write to a device register.
+ */
+void
+ac97_wr(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
+ SHADOW(ac, reg) = val;
+ }
+
+ /*
+ * Don't touch hardware _unless_ if we are suspended, unless we
+ * are in the process of resuming.
+ */
+ if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
+ ac->wr(ac->private, reg, val);
+ }
+}
+
+/*
+ * This obtains the shadowed value of a register. If the register is
+ * out of range, zero is returned.
+ *
+ * To read a hardware register, use the RD() macro above.
+ */
+uint16_t
+ac97_rd(ac97_t *ac, uint8_t reg)
+{
+ if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
+ return (SHADOW(ac, reg));
+ }
+ if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
+ return (ac->rd(ac->private, reg));
+ }
+ return (0);
+}
+
+/*
+ * This calls the hardware driver's access read/write routine
+ * to set bits in a device register.
+ */
+void
+ac97_set(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ ac97_wr(ac, reg, ac->rd(ac->private, reg) | val);
+}
+
+/*
+ * This calls the hardware driver's access read/write routine
+ * to clear bits in a device register.
+ */
+void
+ac97_clr(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ ac97_wr(ac, reg, ac->rd(ac->private, reg) & ~val);
+}
+
+/*
+ * Look for a control attached to this device based
+ * on its control number.
+ *
+ * If this control number is found the per controls state
+ * structure is returned.
+ */
+ac97_ctrl_t *
+ac97_control_find(ac97_t *ac, const char *name)
+{
+ ac97_ctrl_t *ctrl;
+ list_t *l = &ac->ctrls;
+
+ /* Validate that ctrlnum is real and usable */
+ mutex_enter(&ac->ac_lock);
+ for (ctrl = list_head(l); ctrl; ctrl = list_next(l, ctrl)) {
+ if (strcmp(ctrl->actrl_name, name) == 0) {
+ mutex_exit(&ac->ac_lock);
+ return (ctrl);
+ }
+ }
+ mutex_exit(&ac->ac_lock);
+ return (NULL);
+}
+
+/*
+ * This will update all the codec registers from the shadow table.
+ */
+static void
+ac97_restore(ac97_t *ac)
+{
+ /*
+ * If we are restoring previous settings, just reload from the
+ * shadowed settings.
+ */
+ for (int i = 2; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
+ ac->wr(ac->private, i, SHADOW(ac, i));
+ }
+
+ /*
+ * Then go and do the controls. This is important because some of
+ * the controls might use registers that aren't shadowed. Doing it
+ * a second time also may help guarantee that it all works.
+ */
+ for (ac97_ctrl_t *ctrl = list_head(&ac->ctrls); ctrl;
+ ctrl = list_next(&ac->ctrls, ctrl)) {
+ ctrl->actrl_write_fn(ctrl, ctrl->actrl_value);
+ }
+}
+
+/*
+ * This will update all the hardware controls to the initial values at
+ * start of day.
+ */
+static void
+ac97_init_values(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ mutex_enter(&ac->ac_lock);
+ for (ctrl = list_head(&ac->ctrls); ctrl;
+ ctrl = list_next(&ac->ctrls, ctrl)) {
+ ctrl->actrl_value = ctrl->actrl_initval;
+ ctrl->actrl_write_fn(ctrl, ctrl->actrl_initval);
+ }
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Select the input source for recording. This is the set routine
+ * for the control AUDIO_CONTROL_INPUTS.
+ */
+static void
+ac97_insrc_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t set_val;
+
+ set_val = ddi_ffs(value & 0xffff);
+ if ((set_val > 0) && (set_val <= 8)) {
+ set_val--;
+ ac97_wr(ac, AC97_RECORD_SELECT_CTRL_REGISTER,
+ set_val | (set_val << 8));
+ }
+}
+
+static void
+ac97_gpr_toggle(ac97_ctrl_t *ctrl, int bit, uint64_t onoff)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t v;
+
+ v = SHADOW(ac, AC97_GENERAL_PURPOSE_REGISTER);
+ if (onoff) {
+ v |= bit;
+ } else {
+ v &= ~bit;
+ }
+ ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, v);
+}
+
+static void
+ac97_3donoff_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_3D_STEREO_ENHANCE, value);
+}
+
+static void
+ac97_loudness_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_BASS_BOOST, value);
+}
+
+static void
+ac97_loopback_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_LPBK, value);
+}
+
+/*
+ * This will set simulated stereo control to on or off.
+ */
+static void
+ac97_stsim_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_ST, value);
+}
+
+/*
+ * This will set mic select control to mic1=0 or mic2=1.
+ */
+static void
+ac97_selmic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_MS_MIC2, value & 2);
+}
+
+/*
+ * This will set mono source select control to mix=0 or mic=1.
+ */
+static void
+ac97_monosrc_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_MONO_MIC_IN, value & 2);
+}
+
+static void
+ac97_stereo_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t left, right;
+ uint16_t mute;
+
+ left = (value >> 8) & 0xff;
+ right = value & 0xff;
+ mute = value ? 0 : ctrl->actrl_muteable;
+
+ ac97_wr(ac, reg, ac97_val_scale(left, right, ctrl->actrl_bits) | mute);
+}
+
+static void
+ac97_mono_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg, int shift)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t val;
+ uint16_t mute, v;
+ uint16_t mask;
+
+ val = value & 0xff;
+ mute = val ? 0 : ctrl->actrl_muteable;
+
+ mask = ctrl->actrl_muteable |
+ (((1 << ABS(ctrl->actrl_bits)) - 1) << shift);
+
+ v = SHADOW(ac, reg);
+ v &= ~mask; /* clear all of our bits, preserve others */
+
+ /* now set the mute bit, and volume bits */
+ v |= mute;
+ v |= (ac97_mono_scale(val, ctrl->actrl_bits) << shift);
+
+ ac97_wr(ac, reg, v);
+}
+
+static void
+ac97_master_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ value = value | (value << 8);
+ ac97_stereo_set(ctrl, value, AC97_PCM_OUT_VOLUME_REGISTER);
+}
+
+static void
+ac97_lineout_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_MASTER_VOLUME_REGISTER);
+}
+
+static void
+ac97_surround_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_EXTENDED_LRS_VOLUME_REGISTER);
+}
+
+static void
+ac97_aux1out_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
+}
+
+static void
+ac97_headphone_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
+}
+
+static void
+ac97_cd_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_CD_VOLUME_REGISTER);
+}
+
+static void
+ac97_video_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_VIDEO_VOLUME_REGISTER);
+}
+
+static void
+ac97_auxin_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_AUX_VOLUME_REGISTER);
+}
+
+static void
+ac97_linein_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_LINE_IN_VOLUME_REGISTER);
+}
+
+/*
+ * This will set mono mic gain control.
+ */
+static void
+ac97_monomic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_RECORD_GAIN_MIC_REGISTER, 0);
+}
+
+static void
+ac97_phone_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_PHONE_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_mic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MIC_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_speaker_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MONO_MASTER_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_pcbeep_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_PC_BEEP_REGISTER, 1);
+}
+
+static void
+ac97_recgain_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_RECORD_GAIN_REGISTER);
+}
+
+static void
+ac97_center_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_lfe_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 8);
+}
+
+static void
+ac97_bass_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 8);
+}
+
+static void
+ac97_treble_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 0);
+}
+
+static void
+ac97_3ddepth_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ /*
+ * XXX: This is all wrong... 3D depth/center cannot necessarily
+ * be scaled, because the technology in use may vary. We
+ * need more information about each of the options available
+ * to do the right thing.
+ */
+ ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 0);
+}
+
+static void
+ac97_3dcent_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ /*
+ * XXX: This is all wrong... 3D depth/center cannot necessarily
+ * be scaled, because the technology in use may vary. We
+ * need more information about each of the options available
+ * to do the right thing.
+ */
+ ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 8);
+}
+
+static void
+ac97_micboost_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t v;
+
+ v = SHADOW(ac, AC97_MIC_VOLUME_REGISTER);
+ if (value) {
+ v |= MICVR_20dB_BOOST;
+ } else {
+ v &= ~MICVR_20dB_BOOST;
+ }
+ ac97_wr(ac, AC97_MIC_VOLUME_REGISTER, v);
+}
+
+/*
+ * This will return the stored value for any control that has been set.
+ * Note this does not return the actual hardware value from a port. But
+ * instead returns the cached value from the last write to the hardware
+ * port.
+ *
+ * arg - This control structure for this control.
+ * value - This is a pointer to the location to put the
+ * controls value.
+ *
+ * On success zero is returned.
+ */
+static int
+ac97_control_get(void *arg, uint64_t *value)
+{
+ ac97_ctrl_t *ctrl = arg;
+ ac97_t *ac = ctrl->actrl_ac97;
+
+ mutex_enter(&ac->ac_lock);
+ *value = ctrl->actrl_value;
+ mutex_exit(&ac->ac_lock);
+
+ return (0);
+}
+
+static int
+ac97_control_set(void *arg, uint64_t value)
+{
+ ac97_ctrl_t *ctrl = arg;
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t v1, v2;
+
+ /* a bit of quick checking */
+ switch (ctrl->actrl_type) {
+ case AUDIO_CTRL_TYPE_STEREO:
+ v1 = (value >> 8) & 0xff;
+ v2 = value & 0xff;
+ if ((v1 < ctrl->actrl_minval) || (v1 > ctrl->actrl_maxval) ||
+ (v2 < ctrl->actrl_minval) || (v2 > ctrl->actrl_maxval) ||
+ (value > 0xffff)) {
+ return (EINVAL);
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_ENUM:
+ if ((value & ~ctrl->actrl_minval) !=
+ (ctrl->actrl_maxval & ~ctrl->actrl_minval)) {
+ return (EINVAL);
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ if ((value < ctrl->actrl_minval) ||
+ (value > ctrl->actrl_maxval)) {
+ return (EINVAL);
+ }
+ break;
+ }
+
+ mutex_enter(&ac->ac_lock);
+ ctrl->actrl_value = value;
+ ctrl->actrl_write_fn(ctrl, value);
+ mutex_exit(&ac->ac_lock);
+
+ return (0);
+}
+
+/*
+ * This simply sets a flag to block calls to the underlying
+ * hardware driver to get or set hardware controls. This is usually
+ * called just before a power down of devices. Once this gets called any
+ * calls to set controls will not touch the real hardware. But
+ * since all control updates are always saved in soft registers it
+ * is a simple mater to update the hardware with the latest values
+ * on resume which also unblocks calls to the hardware controls.
+ */
+void
+ac97_suspend(ac97_t *ac)
+{
+ mutex_enter(&ac->ac_lock);
+
+ /* This will prevent any new operations from starting! */
+ ac->suspended = B_TRUE;
+ ac->resumer = 0;
+
+ /* XXX - should we powerdown codec's here?? */
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Reset the analog codec hardware
+ *
+ * Reset all analog AC97 hardware, input ADC's, output DAC's and MIXER.
+ * Wait a resonable amount of time for hardware to become ready.
+ */
+static void
+ac97_analog_reset(ac97_t *ac)
+{
+ uint16_t tmp;
+ int wait = 1000; /* delay for up to 1s */
+
+ /* Clear stale data and resync register accesses */
+ tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
+
+ /* reset the codec */
+ WR(AC97_RESET_REGISTER, 0);
+ tmp = RD(AC97_RESET_REGISTER);
+
+ /* power up */
+ WR(AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
+
+ /* Wait for ADC/DAC/MIXER to become ready */
+ while (wait--) {
+ /* 1 msec delay */
+ drv_usecwait(1000);
+
+ /* If all ready - end delay */
+ tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
+ SHADOW(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER) = tmp;
+ if ((tmp & PCSR_POWERD_UP) == PCSR_POWERD_UP) {
+ return;
+ }
+ }
+
+ audio_dev_warn(ac->d, "AC'97 analog powerup timed out");
+}
+
+/*
+ * This is the internal hardware reset routine.
+ * It has no locking and we must be locked before it is
+ * called!
+ *
+ * This will reset and re-initialize the device.
+ * It has two modes of operation that affect how it handles
+ * all controls.
+ *
+ * It re-initializes the device and reloads values with
+ * last updated versions.
+ */
+static void
+ac97_hw_reset(ac97_t *ac)
+{
+ /*
+ * Fully Power up the device
+ */
+ if (ac->flags & AC97_FLAG_AMPLIFIER) {
+ /* power up - external amp powerd up */
+ ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
+ } else {
+ /* power up - external amp powered down */
+ ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_EAPD);
+ }
+
+ ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, 0);
+
+ switch (ac->vid) {
+ case AC97_CODEC_STAC9708:
+#if 0
+ /* non-inverted phase */
+ /* ac97_rd(ac, AC97_VENDOR_REGISTER_11) & ~0x8); */
+#endif
+ WR(AC97_VENDOR_REGISTER_11, 8);
+ break;
+
+ case AC97_CODEC_EM28028:
+ ac97_wr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
+ (ac97_rd(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER) &
+ ~3800) | 0xE0);
+ break;
+
+ case AC97_CODEC_AD1886:
+ /* jack sense */
+ WR(AC97_VENDOR_REGISTER_13,
+ (RD(AC97_VENDOR_REGISTER_13) & ~0xEF) | 0x10);
+ break;
+
+ case AC97_CODEC_AD1888:
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+#if 0
+ /* GED: This looks fishy to me, so I'm nuking it for now */
+ /* headphone/aux volume (?) */
+ ac97_wr(ac, AC97_HEADPHONE_VOLUME_REGISTER, 0x0808);
+#endif
+ break;
+
+ case AC97_CODEC_AD1980:
+#if 0
+ /* set jacksense to mute line if headphone is plugged */
+ WR(AC97_VENDOR_REGISTER_13,
+ (RD(AC97_VENDOR_REGISTER_13) & ~0xe00) | 0x400);
+#endif
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+ break;
+
+ case AC97_CODEC_AD1985:
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+ break;
+
+ case AC97_CODEC_WM9704:
+ /* enable I2S */
+ WR(AC97_VENDOR_REGISTER_01, RD(AC97_VENDOR_REGISTER_01) | 0x80);
+ break;
+
+ case AC97_CODEC_VT1612A:
+ case AC97_CODEC_VT1617A:
+ case AC97_CODEC_VT1616:
+ /* Turn off Center, Surround, and LFE DACs */
+ ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
+ EASCR_PRI | EASCR_PRJ | EASCR_PRK);
+ WR(AC97_VENDOR_REGISTER_01, 0x0230);
+ break;
+
+ case AC97_CODEC_YMF753:
+ /* set TX8 + 3AWE */
+ WR(AC97_VENDOR_REGISTER_07, RD(AC97_VENDOR_REGISTER_07) | 0x9);
+ break;
+
+ default:
+ break;
+ }
+
+ /* call codec specific reset hook */
+ if (ac->codec_reset != NULL) {
+ ac->codec_reset(ac);
+ }
+
+ /* Turn off variable sampling rate support */
+ ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
+}
+
+/*
+ * This will reset and re-initialize the device.
+ * It has two modes of operation that affect how it handles
+ * all controls.
+ *
+ * It re-initializes the device and then can either reset
+ * all controls back to their initial values or it can
+ * re-load all controls with their last updated values.
+ *
+ * initval - If this is none zero then all controls will
+ * be restored to their initial values.
+ */
+void
+ac97_reset(ac97_t *ac)
+{
+ /* If we are about to suspend so no point in going on */
+ mutex_enter(&ac->ac_lock);
+ if (ac->suspended) {
+ mutex_exit(&ac->ac_lock);
+ return;
+ }
+ ac97_analog_reset(ac);
+ ac97_hw_reset(ac);
+ ac97_restore(ac);
+
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Given the need to resume the hardware this reloads the base hardware
+ * and then takes the stored values for each control and sends them
+ * to the hardware again.
+ */
+void
+ac97_resume(ac97_t *ac)
+{
+
+ /*
+ * This should only be called when already suspended.
+ * this takes us out of suspend state after it brings the
+ * controls back to life.
+ */
+ ASSERT(ac->suspended);
+ mutex_enter(&ac->ac_lock);
+ ac->resumer = ddi_get_kt_did();
+
+ /* We simply call reset since the operation is the same */
+ ac97_analog_reset(ac);
+ ac97_hw_reset(ac);
+ ac97_restore(ac);
+
+ ac->resumer = 0;
+ ac->suspended = B_FALSE;
+ mutex_exit(&ac->ac_lock);
+}
+
+
+/*
+ * Register a control -- if it fails, it will generate a message to
+ * syslog, but the driver muddles on. (Failure to register a control
+ * should never occur, and is generally benign if it happens.)
+ */
+void
+ac97_alloc_control(ac97_t *ac, ac97_ctrl_probe_t *cpt)
+{
+ ac97_ctrl_t *ctrl;
+ audio_ctrl_desc_t ctrl_des;
+
+ ASSERT(ac);
+ ASSERT(ac->d);
+
+ ctrl = kmem_zalloc(sizeof (ac97_ctrl_t), KM_SLEEP);
+
+ bzero(&ctrl_des, sizeof (ctrl_des));
+ ctrl_des.acd_name = cpt->cp_name;
+ ctrl_des.acd_minvalue = cpt->cp_minval;
+ ctrl_des.acd_maxvalue = cpt->cp_maxval;
+ ctrl_des.acd_type = cpt->cp_type;
+ ctrl_des.acd_flags = cpt->cp_flags;
+ if (cpt->cp_enum) {
+ for (int e = 0; e < 64; e++) {
+ if (cpt->cp_enum[e] == NULL)
+ break;
+ ctrl_des.acd_enum[e] = cpt->cp_enum[e];
+ }
+ }
+
+ ctrl->actrl_ac97 = ac;
+ /*
+ * Warning for extended controls this field gets changed
+ * by audio_dev_add_control() to be a unique value.
+ */
+ ctrl->actrl_minval = cpt->cp_minval;
+ ctrl->actrl_maxval = cpt->cp_maxval;
+ ctrl->actrl_initval = cpt->cp_initval;
+ ctrl->actrl_muteable = cpt->cp_muteable;
+ ctrl->actrl_write_fn = cpt->cp_write_fn;
+ ctrl->actrl_bits = cpt->cp_bits;
+ ctrl->actrl_type = cpt->cp_type;
+ ctrl->actrl_name = cpt->cp_name;
+
+ /* Register control with framework */
+ ctrl->actrl_ctrl = audio_dev_add_control(ac->d, &ctrl_des,
+ ac97_control_get, ac97_control_set, ctrl);
+ if (!ctrl->actrl_ctrl) {
+ audio_dev_warn(ac->d, "AC97 %s alloc failed", cpt->cp_name);
+ kmem_free(ctrl, sizeof (ac97_ctrl_t));
+ return;
+ }
+
+ /*
+ * Not that it can not be referenced until in is in the
+ * list. So again by adding to the list last we avoid the need
+ * for control locks.
+ */
+ mutex_enter(&ac->ac_lock);
+ list_insert_tail(&ac->ctrls, ctrl);
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * De-Register and free up a control
+ *
+ * Note ctrl_lock read write must be held for writing when calling
+ * this function
+ */
+void
+ac97_free_control(ac97_ctrl_t *ctrl)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+
+ mutex_enter(&ac->ac_lock);
+ list_remove(&ac->ctrls, ctrl);
+ mutex_exit(&ac->ac_lock);
+
+ audio_dev_del_control(ctrl->actrl_ctrl);
+ kmem_free(ctrl, sizeof (ac97_ctrl_t));
+}
+
+/*
+ * This is the master list of all controls known and handled by
+ * the AC97 framework. This is the list used to probe, allocate
+ * and configure controls. If a control is not in this list it
+ * will not be handled. If a control is in this list but does not
+ * have a probe routine then it will always be included. If a
+ * control in list has a probe routine then it must return true
+ * for that control to be included.
+ */
+
+#define MONCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_MONITOR)
+#define PLAYCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_REC)
+#define T3DCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_3D)
+#define TONECTL (AC97_FLAGS | AUDIO_CTRL_FLAG_TONE)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+
+ac97_ctrl_probe_t ctrl_probe_tbl[] = {
+
+ /* Master PCM Volume */
+ {AUDIO_CTRL_ID_VOLUME, INIT_VAL_MAIN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ PCMVOL, PCMOVR_MUTE, ac97_master_set, NULL, 5},
+
+ /* LINE out volume */
+ {AUDIO_CTRL_ID_LINEOUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_lineout, 6},
+
+ /* Front volume */
+ {AUDIO_CTRL_ID_FRONT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_front, 6},
+
+ /* 4CH out volume (has one of three possible uses, first use) */
+ {AUDIO_CTRL_ID_SURROUND, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_surround_set, ac97_probe_rear, 6},
+
+ /* ALT out volume (has one of three possible uses, second use) */
+ {AUDIO_CTRL_ID_HEADPHONE, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_headphone_set, ac97_probe_headphone, 6},
+
+ /* ALT out volume (has one of three possible uses, third use) */
+ {AUDIO_CTRL_ID_AUX1OUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_aux1out_set, ac97_probe_auxout, 6},
+
+ /* center out volume */
+ {AUDIO_CTRL_ID_CENTER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, EXLFEVR_CENTER_MUTE, ac97_center_set, ac97_probe_center, 6},
+
+ /* LFE out volume (sub-woofer) */
+ {AUDIO_CTRL_ID_LFE, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, EXLFEVR_LFE_MUTE, ac97_lfe_set, ac97_probe_lfe, 6},
+
+ /* MONO out volume */
+ {AUDIO_CTRL_ID_SPEAKER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, MMVR_MUTE, ac97_speaker_set, ac97_probe_mono, 6},
+
+ /* Record in GAIN */
+ {AUDIO_CTRL_ID_RECGAIN, INIT_IGAIN_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ RECVOL, RGR_MUTE, ac97_recgain_set, NULL, -4},
+
+ /* MIC in volume */
+ {AUDIO_CTRL_ID_MIC, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, MICVR_MUTE, ac97_mic_set, ac97_probe_mic, 5},
+
+ /* LINE in volume */
+ {AUDIO_CTRL_ID_LINEIN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, LIVR_MUTE, ac97_linein_set, ac97_probe_linein, 5},
+
+ /* CD in volume */
+ {AUDIO_CTRL_ID_CD, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, CDVR_MUTE, ac97_cd_set, ac97_probe_cdrom, 5},
+
+ /* VIDEO in volume */
+ {AUDIO_CTRL_ID_VIDEO, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, VIDVR_MUTE, ac97_video_set, ac97_probe_video, 5},
+
+ /* AUX in volume */
+ {AUDIO_CTRL_ID_AUX1IN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, AUXVR_MUTE, ac97_auxin_set, ac97_probe_auxin, 5},
+
+ /* PHONE in volume */
+ {AUDIO_CTRL_ID_PHONE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MONVOL, PVR_MUTE, ac97_phone_set, ac97_probe_phone, 5},
+
+ /* PC BEEPER in volume (motherboard speaker pins) */
+ {AUDIO_CTRL_ID_BEEP, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ AC97_RW, PCBR_MUTE, ac97_pcbeep_set, ac97_probe_pcbeep, 4},
+
+ /* BASS out level (note, zero is hardware bypass) */
+ {AUDIO_CTRL_ID_BASS, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ TONECTL, 0, ac97_bass_set, ac97_probe_tone, 4},
+
+ /* TREBLE out level (note, zero is hardware bypass) */
+ {AUDIO_CTRL_ID_TREBLE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ TONECTL, 0, ac97_treble_set, ac97_probe_tone, 4},
+
+ /* Loudness on/off switch */
+ {AUDIO_CTRL_ID_LOUDNESS, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ TONECTL, 0, ac97_loudness_set, ac97_probe_loud, 0},
+
+ /* 3D depth out level */
+ {AUDIO_CTRL_ID_3DDEPTH, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ T3DCTL, 0, ac97_3ddepth_set, ac97_probe_3d_depth, 4},
+
+ /* 3D center out level */
+ {AUDIO_CTRL_ID_3DCENT, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ T3DCTL, 0, ac97_3dcent_set, ac97_probe_3d_center, 4},
+
+ /* 3D enhance on/off switch */
+ {AUDIO_CTRL_ID_3DENHANCE, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ T3DCTL, 0, ac97_3donoff_set, ac97_probe_3d, 0},
+
+ /* MIC BOOST switch */
+ {AUDIO_CTRL_ID_MICBOOST, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ RECCTL, 0, ac97_micboost_set, ac97_probe_mic, 0},
+
+ /* Loopback on/off switch */
+ {AUDIO_CTRL_ID_LOOPBACK, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_RW, 0, ac97_loopback_set, NULL, 0},
+
+ /*
+ * The following selectors *must* come after the others, as they rely
+ * on the probe results of other controls.
+ */
+ /* record src select (only one port at a time) */
+ {AUDIO_CTRL_ID_RECSRC, (1U << INPUT_MIC), 0, 0, AUDIO_CTRL_TYPE_ENUM,
+ RECCTL, 0, ac97_insrc_set, NULL, 0, ac97_insrcs},
+
+ /* Start of non-standard private controls */
+
+ /* Simulated stereo on/off switch */
+ {AUDIO_CTRL_ID_STEREOSIM, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_RW, 0, ac97_stsim_set, ac97_probe_stsim, 0},
+
+ /* mono MIC GAIN */
+ {AUDIO_CTRL_ID_MICGAIN, INIT_IGAIN_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ RECCTL, RGMR_MUTE, ac97_monomic_set, ac97_probe_mmic, -4},
+
+ /* MIC select switch 0=mic1 1=mic2 */
+ {AUDIO_CTRL_ID_MICSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
+ RECCTL, 0, ac97_selmic_set, ac97_probe_mic, 0, ac97_mics},
+
+ /* MONO out src select 0=mix 1=mic */
+ {AUDIO_CTRL_ID_SPKSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
+ AC97_RW, 0, ac97_monosrc_set, ac97_probe_mono, 0, ac97_monos},
+
+ {NULL}
+};
+
+/*
+ * Probe all possible controls and register existing
+ * ones and set initial values
+ *
+ * Returns zero on success
+ */
+static int
+ac97_probeinit_ctrls(ac97_t *ac, int vol_bits, int enh_bits)
+{
+ ac97_ctrl_probe_t *cpt;
+ ac97_ctrl_probe_t my_cpt;
+
+ ASSERT(ac);
+
+ /*
+ * Set some ports which are always present.
+ */
+ ac->inputs = (1U << INPUT_STEREOMIX) | (1U << INPUT_MONOMIX);
+ for (cpt = &ctrl_probe_tbl[0]; cpt->cp_name != NULL; cpt++) {
+ bcopy(cpt, &my_cpt, sizeof (my_cpt));
+
+ if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_RECSRC) == 0) {
+ my_cpt.cp_minval |= ac->inputs;
+ my_cpt.cp_maxval |= ac->inputs;
+ }
+
+ if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_MICBOOST) == 0) {
+ if (ac->flags & AC97_FLAG_MICBOOST)
+ my_cpt.cp_initval = 1;
+ }
+
+ if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_FRONT) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_HEADPHONE) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SURROUND) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SPEAKER) == 0)) {
+ my_cpt.cp_bits = vol_bits;
+ }
+
+ if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DDEPTH) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DCENT) == 0)) {
+ my_cpt.cp_bits = enh_bits;
+ }
+
+ if (!my_cpt.cp_probe || my_cpt.cp_probe(ac)) {
+ ac97_alloc_control(ac, &my_cpt);
+ }
+ }
+
+ if (ac->codec_init != NULL) {
+ ac->codec_init(ac);
+ }
+
+ return (0);
+}
+
+/*
+ * Allocate an AC97 instance for use by a hardware driver.
+ *
+ * returns an allocated and initialize ac97 structure.
+ */
+ac97_t *
+ac97_alloc(dev_info_t *dip, ac97_rd_t rd, ac97_wr_t wr, void *priv)
+{
+ ac97_t *ac;
+
+ ac = kmem_zalloc(sizeof (ac97_t), KM_SLEEP);
+ ac->dip = dip;
+ ac->rd = rd;
+ ac->wr = wr;
+ ac->private = priv;
+
+ list_create(&ac->ctrls, sizeof (struct ac97_ctrl),
+ offsetof(struct ac97_ctrl, actrl_linkage));
+
+ mutex_init(&ac->ac_lock, NULL, MUTEX_DRIVER, NULL);
+
+#define PROP_FLAG(prop, flag, def) \
+ if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, \
+ (prop), (def))) { \
+ ac->flags |= (flag); \
+ } else { \
+ ac->flags &= ~(flag); \
+ }
+
+ /*
+ * Engage the external amplifier by default, suppress with
+ * a property of the form "ac97-amplifier=0".
+ */
+ PROP_FLAG(AC97_PROP_AMPLIFIER, AC97_FLAG_AMPLIFIER, 1);
+
+ /*
+ * We cannot necessarily know if the headphone jack is present
+ * or not. There's a technique to probe the codec for
+ * headphone support, but many vendors seem to simply hang the
+ * headphone jack on the line out circuit, and have some kind
+ * of jack sense detection to enable or disable it by default.
+ * None of this is visible in the AC'97 registers.
+ *
+ * We cannot do much about it, but what we can do is offer users
+ * a way to suppress the option for a headphone port. Users and
+ * administrators can then set a flag in the driver.conf to suppress
+ * the option from display.
+ *
+ * It turns out that this problem exists for other signals as
+ * well.
+ */
+ PROP_FLAG(AC97_PROP_NO_HEADPHONE, AC97_FLAG_NO_HEADPHONE, 0);
+ PROP_FLAG(AC97_PROP_NO_AUXOUT, AC97_FLAG_NO_AUXOUT, 0);
+ PROP_FLAG(AC97_PROP_NO_CDROM, AC97_FLAG_NO_CDROM, 0);
+ PROP_FLAG(AC97_PROP_NO_AUXIN, AC97_FLAG_NO_AUXIN, 0);
+ PROP_FLAG(AC97_PROP_NO_VIDEO, AC97_FLAG_NO_VIDEO, 0);
+ PROP_FLAG(AC97_PROP_NO_LINEIN, AC97_FLAG_NO_LINEIN, 0);
+ PROP_FLAG(AC97_PROP_NO_MIC, AC97_FLAG_NO_MIC, 0);
+
+ /*
+ * Most SPARC systems use the AC97 monoaural output for the
+ * built-in speaker. On these systems, we want to expose and
+ * enable the built-in speaker by default.
+ *
+ * On most x86 systems, the mono output is not connected to
+ * anything -- the AC'97 spec makes it pretty clear that the
+ * output was actually intended for use with speaker phones.
+ * So on those systems, we really don't want to activate the
+ * speaker -- we don't even want to expose it's presence
+ * normally.
+ *
+ * However, there could be an exception to the rule here. To
+ * facilitate this, we allow for the presence of the property
+ * to indicate that the speaker should be exposed. Whether it
+ * is enabled by default or not depends on the value of the
+ * property. (Generally on SPARC, we enable by default. On
+ * other systems we do not.)
+ */
+#ifdef __sparc
+ ac->flags |= AC97_FLAG_SPEAKER_OK;
+ PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 1);
+#else
+ if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ AC97_PROP_SPEAKER)) {
+ ac->flags |= AC97_FLAG_SPEAKER_OK;
+ PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 0);
+ }
+#endif
+
+ /*
+ * Enable microphone boost (20dB normally) by default?
+ */
+ PROP_FLAG(AC97_PROP_MICBOOST, AC97_FLAG_MICBOOST, 0);
+
+ return (ac);
+}
+
+/*
+ * Free an AC97 instance.
+ */
+void
+ac97_free(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /* Clear out any controls that are still attached */
+ while ((ctrl = list_head(&ac->ctrls)) != NULL) {
+ ac97_free_control(ctrl);
+ }
+
+ list_destroy(&ac->ctrls);
+ mutex_destroy(&ac->ac_lock);
+ kmem_free(ac, sizeof (ac97_t));
+}
+
+static struct vendor {
+ unsigned id;
+ const char *name;
+} vendors[] = {
+ { AC97_VENDOR_ADS, "Analog Devices" },
+ { AC97_VENDOR_AKM, "Asahi Kasei" },
+ { AC97_VENDOR_ALC, "Realtek" },
+ { AC97_VENDOR_ALG, "Avance Logic" },
+ { AC97_VENDOR_CMI, "C-Media" },
+ { AC97_VENDOR_CRY, "Cirrus Logic" },
+ { AC97_VENDOR_CXT, "Conexant" },
+ { AC97_VENDOR_ESS, "ESS Technology" },
+ { AC97_VENDOR_EV, "Ectiva" },
+ { AC97_VENDOR_ICE, "ICEnsemble" },
+ { AC97_VENDOR_ST, "SigmaTel" },
+ { AC97_VENDOR_TRA, "TriTech", },
+ { AC97_VENDOR_VIA, "VIA Technologies" },
+ { AC97_VENDOR_WML, "Wolfson" },
+ { AC97_VENDOR_YMH, "Yamaha" },
+ { 0, NULL },
+};
+
+static struct codec {
+ unsigned id;
+ const char *name;
+ int enh_bits;
+ void (*init)(ac97_t *ac);
+ void (*reset)(ac97_t *ac);
+} codecs[] = {
+ { AC97_CODEC_AK4540, "AK4540" },
+ { AC97_CODEC_STAC9700, "STAC9700" },
+ { AC97_CODEC_STAC9701, "STAC9701" },
+ { AC97_CODEC_STAC9701_2, "STAC9701" },
+ { AC97_CODEC_STAC9704, "STAC9704" },
+ { AC97_CODEC_STAC9705, "STAC9705" },
+ { AC97_CODEC_STAC9721, "STAC9721" },
+ { AC97_CODEC_STAC9708, "STAC9708", 2 },
+ { AC97_CODEC_STAC9744, "STAC9744" },
+ { AC97_CODEC_STAC9750, "STAC9750", 3 },
+ { AC97_CODEC_STAC9752, "STAC9752", 3 },
+ { AC97_CODEC_STAC9756, "STAC9756", 3 },
+ { AC97_CODEC_STAC9758, "STAC9758", 3 },
+ { AC97_CODEC_STAC9766, "STAC9766", 3 },
+ { AC97_CODEC_TR28028, "TR28028" },
+ { AC97_CODEC_TR28028_2, "TR28028" },
+ { AC97_CODEC_TR28023, "TR28023" },
+ { AC97_CODEC_TR28023_2, "TR28023" },
+ { AC97_CODEC_EM28028, "EM28028" },
+ { AC97_CODEC_CX20468, "CX20468" },
+ { AC97_CODEC_CX20468_2, "CX20468" },
+ { AC97_CODEC_CX20468_21, "CX20468-21" },
+ { AC97_CODEC_CS4297, "CS4297" },
+ { AC97_CODEC_CS4297A, "CS4297A" },
+ { AC97_CODEC_CS4294, "CS4294" },
+ { AC97_CODEC_CS4299, "CS4299" },
+ { AC97_CODEC_CS4202, "CS4202" },
+ { AC97_CODEC_CS4205, "CS4205" },
+ { AC97_CODEC_AD1819B, "AD1819B" },
+ { AC97_CODEC_AD1881, "AD1881" },
+ { AC97_CODEC_AD1881A, "AD1881A" },
+ { AC97_CODEC_AD1885, "AD1885" },
+ { AC97_CODEC_AD1886, "AD1886" },
+ { AC97_CODEC_AD1887, "AD1887" },
+ { AC97_CODEC_AD1888, "AD1888" },
+ { AC97_CODEC_AD1980, "AD1980" },
+ { AC97_CODEC_AD1981, "AD1981" }, /* no data sheet */
+ { AC97_CODEC_AD1981A, "AD1981A", 0, ad1981a_init },
+ { AC97_CODEC_AD1981B, "AD1981B", 0, ad1981b_init },
+ { AC97_CODEC_AD1985, "AD1985" },
+ { AC97_CODEC_WM9701A, "WM9701A" },
+ { AC97_CODEC_WM9703, "WM9703" },
+ { AC97_CODEC_WM9704, "WM9704" },
+ { AC97_CODEC_ES1921, "ES1921" },
+ { AC97_CODEC_ICE1232, "ICE1232/VT1611A" },
+ { AC97_CODEC_VT1612A, "VT1612A" },
+ { AC97_CODEC_VT1616, "VT1616" },
+ { AC97_CODEC_VT1616A, "VT1616A" },
+ { AC97_CODEC_VT1617A, "VT1617A" },
+ { AC97_CODEC_VT1618, "VT1618" },
+ { AC97_CODEC_ALC100, "ALC100", 2 },
+ { AC97_CODEC_ALC200P, "ALC200P", 2 },
+ { AC97_CODEC_ALC202, "ALC202", 2 },
+ { AC97_CODEC_ALC203, "ALC203", 2 },
+ { AC97_CODEC_ALC250, "ALC250", 2 },
+ { AC97_CODEC_ALC250_2, "ALC250", 2 },
+ { AC97_CODEC_ALC650, "ALC650", 2, alc650_init },
+ { AC97_CODEC_ALC655, "ALC655", 2, alc650_init },
+ { AC97_CODEC_ALC658, "ALC658", 2, alc650_init },
+ { AC97_CODEC_ALC850, "ALC850", 2, alc850_init },
+ { AC97_CODEC_EV1938, "EV1938" },
+ { AC97_CODEC_CMI9738, "CMI9738", 0, cmi9738_init },
+ { AC97_CODEC_CMI9739, "CMI9739", 0, cmi9739_init },
+ { AC97_CODEC_CMI9780, "CMI9780" },
+ { AC97_CODEC_CMI9761, "CMI9761A", 0, cmi9761_init },
+ { AC97_CODEC_CMI9761_2, "CMI9761B", 0, cmi9761_init },
+ { AC97_CODEC_CMI9761_3, "CMI9761A+", 0, cmi9761_init },
+ { AC97_CODEC_YMF743, "YMF743" },
+ { AC97_CODEC_YMF753, "YMF753" },
+ { 0, NULL }
+};
+
+/*
+ * Init the actual hardware related to a previously
+ * allocated instance of an AC97 device.
+ *
+ * Return zero on success.
+ */
+int
+ac97_init(ac97_t *ac, struct audio_dev *d)
+{
+ uint32_t vid1, vid2;
+ const char *name = NULL;
+ const char *vendor = NULL;
+ int enh_bits;
+ int vol_bits;
+ uint32_t flags;
+ char nmbuf[128];
+ char buf[128];
+
+ /* Save audio framework instance structure */
+ ac->d = d;
+
+ ac97_analog_reset(ac);
+
+ vid1 = RD(AC97_VENDOR_ID1_REGISTER);
+ vid2 = RD(AC97_VENDOR_ID2_REGISTER);
+
+ if (vid1 == 0xffff) {
+ audio_dev_warn(d, "AC'97 codec unresponsive");
+ return (-1);
+ }
+
+ ac->vid = (vid1 << 16) | vid2;
+
+ /*
+ * Find out kind of codec we have and set any special case
+ * settings needed.
+ */
+ for (int i = 0; codecs[i].id; i++) {
+ if (ac->vid == codecs[i].id) {
+ name = codecs[i].name;
+ enh_bits = codecs[i].enh_bits;
+ ac->codec_init = codecs[i].init;
+ break;
+ }
+ }
+ for (int i = 0; vendors[i].id; i++) {
+ if ((ac->vid & 0xffffff00) == vendors[i].id) {
+ vendor = vendors[i].name;
+ break;
+ }
+ }
+ if (name == NULL) {
+ (void) snprintf(nmbuf, sizeof (nmbuf), "0x%04x%04x",
+ vid1, vid2);
+ name = nmbuf;
+ }
+ if (vendor == NULL) {
+ vendor = "Unknown";
+ }
+
+ /*
+ * Populate the initial shadow table.
+ */
+ for (int i = 0; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
+ SHADOW(ac, i) = RD(i);
+ }
+
+ ac->caps = RD(AC97_RESET_REGISTER);
+
+ enh_bits = 4;
+ vol_bits = 6;
+ flags = 0;
+
+ /* detect the bit width of the master volume controls */
+ WR(AC97_MASTER_VOLUME_REGISTER, 0x20);
+ if ((RD(AC97_MASTER_VOLUME_REGISTER) & 0x1f) == 0x1f) {
+ vol_bits = 5;
+ }
+
+ /*
+ * AC'97 2.3 spec indicates three possible uses for AUX_OUT
+ * (aka LNLVL_OUT aka HP_OUT). We have to figure out which one
+ * is in use.
+ */
+ if (ac->caps & RR_HEADPHONE_SUPPORT) {
+ /* it looks like it is probably headphones */
+ if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
+ /* it is implemented */
+ ac->flags |= AC97_FLAG_AUX_HP;
+ }
+ }
+
+ /*
+ * If not a headphone, is it 4CH_OUT (surround?)
+ */
+ if ((!(ac->flags & AC97_FLAG_AUX_HP)) &&
+ (RD(AC97_EXTENDED_AUDIO_REGISTER) & EAR_SDAC)) {
+ if (ac97_probe_reg(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER)) {
+ ac->flags |= AC97_FLAG_AUX_4CH;
+ }
+ }
+
+ /*
+ * If neither, then maybe its an auxiliary line level output?
+ */
+ if (!(ac->flags & (AC97_FLAG_AUX_HP | AC97_FLAG_AUX_4CH))) {
+ if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
+ ac->flags |= AC97_FLAG_AUX_LVL;
+ }
+ }
+
+ ac->flags |= flags;
+ (void) snprintf(ac->name, sizeof (ac->name), "%s %s", vendor, name);
+
+ (void) snprintf(buf, sizeof (buf), "AC'97 codec: %s", ac->name);
+ audio_dev_add_info(d, buf);
+
+ cmn_err(CE_CONT, "?%s#%d: AC'97 codec id %s (%x, caps %x)\n",
+ ddi_driver_name(ac->dip), ddi_get_instance(ac->dip),
+ ac->name, ac->vid, ac->caps);
+
+ /*
+ * Probe and register all known controls with framework
+ */
+ if (ac97_probeinit_ctrls(ac, vol_bits, enh_bits)) {
+ audio_dev_warn(d, "AC97 controls init failed");
+
+ /* XXX - need to free all controls registered? */
+ return (-1);
+ }
+
+ ac97_hw_reset(ac);
+ ac97_init_values(ac);
+
+ return (0);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_ad.c b/usr/src/uts/common/io/audio/ac97/ac97_ad.c
new file mode 100644
index 0000000000..1faddcb6fa
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_ad.c
@@ -0,0 +1,257 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * ADS (Analog Devices) codec extensions.
+ */
+
+/*
+ * TODO:
+ *
+ * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
+ * line-out jack. So far we haven't found which vendors don't
+ * do that. So we assume that all vendors swap the surr-out
+ * and the line-out outputs. So we need swap the two outputs.
+ *
+ * Historically we internally processed the "ad198x-swap-output"
+ * property. If someday some vendors do not swap the outputs, we would
+ * set "ad198x-swap-output = 0" in the driver.conf file, and unload
+ * and reload the driver (or reboot).
+ *
+ * TODO:
+ *
+ * Since we don't have access (at present) to any such systems, we have
+ * not implemented this swapping property. Once we can test it, we will
+ * add it. This is noted as CR 6819556.
+ *
+ * The old code did this:
+ *
+ * if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
+ * DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
+ * statep->swap_out = B_TRUE;
+ * (void) audioixp_read_ac97(statep, CODEC_AD_REG_MISC, &tmp);
+ * (void) audioixp_write_ac97(statep,
+ * CODEC_AD_REG_MISC,
+ * tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+#define ADS_EQ_CTRL_REGISTER 0x60
+#define AECR_EQM 0x8000 /* disable EQ */
+#define AECR_SYM 0x0080
+
+#define ADS_EQ_DATA_REGISTER 0x62
+
+#define ADS_MIXER_ADC_IGAIN_REGISTER 0x64
+#define AMADIR_LEFT_MASK 0x0f00
+#define AMADIR_RIGHT_MASK 0x000f
+#define AMADIR_MXM 0x8000
+
+#define ADS_JS_INTS_STATUS_REGISTER 0x72
+#define AJISR_JS0INT 0x0001
+#define AJISR_JS1INT 0x0002
+#define AJISR_JS0ST 0x0004
+#define AJISR_JS1ST 0x0008
+#define AJISR_JS0MD 0x0010
+#define AJISR_JS1MD 0x0020
+#define AJISR_JS0TMR 0x0040
+#define AJISR_JS1TMR 0x0080
+#define AJISR_JS0EQB 0x0100
+#define AJISR_JS1EQB 0x0200
+#define AJISR_JSMT_MASK 0x1c00
+#define AJISR_JSMT_NONE 0x0000
+#define AJISR_JSMT_HP_LNOUT 0x0400 /* hp mutes line out */
+#define AJISR_JSMT_HP_BOTH 0x0800 /* hp mutes both mono & line */
+#define AJISR_JSMT_LNOUT_MONO 0x1000 /* lineout mutes mono */
+#define AJISR_JSMT_ALL 0x1800 /* all JS muting enabled */
+
+#define ADS_SERIAL_CFG_REGISTER 0x74
+#define ASCR_SPLNK 0x0001
+#define ASCR_SPDZ 0x0002
+#define ASCR_SPAL 0x0004
+#define ASCR_INTS 0x0010
+#define ASCR_CHEN 0x0100
+#define ASCR_REGM0 0x1000
+#define ASCR_REGM1 0x2000
+#define ASCR_REGM2 0x4000
+#define ASCR_SLOT16 0x8000
+
+#define ADS_MISC_CFG_REGISTER 0x76
+#define AMCR_MBG_MASK 0x0003
+#define AMCR_MBG_20dB 0x0000
+#define AMCR_MBG_10dB 0x0001
+#define AMCR_MBG_30dB 0x0002
+#define AMCR_VREFD 0x0004
+#define AMCR_VREFH 0x0008
+#define AMCR_MADST 0x0010 /* AD1981B */
+#define AMCR_SRU 0x0010 /* AD1980 */
+#define AMCR_LOSEL 0x0020 /* AD1980 */
+#define AMCR_2CMIC 0x0040
+#define AMCR_MADPD 0x0080 /* AD1981B */
+#define AMCR_SPRD 0x0080 /* AD1980 */
+#define AMCR_DMIX_6TO2 0x0100 /* AD1980 */
+#define AMCR_DMIX_FORCE 0x0200 /* AD1980 */
+#define AMCR_FMXE 0x0200 /* AD1981B */
+#define AMCR_HPSEL 0x0400 /* AD1980 */
+#define AMCR_CLDIS 0x0800 /* AD1980 */
+#define AMCR_LODIS 0x1000 /* AD1980 */
+#define AMCR_DAM 0x0800 /* AD1981B */
+#define AMCR_MSPLT 0x2000
+#define AMCR_AC97NC 0x4000 /* AD1980 */
+#define AMCR_DACZ 0x8000
+
+static void
+ads_set_micboost(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+ uint16_t v;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1:
+ /* 0db */
+ ac97_clr(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ break;
+ case 0x2:
+ /* 10dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_10dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ case 0x4:
+ /* 20dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_20dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ case 0x8:
+ /* 30dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_30dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ }
+}
+
+static void
+ads_set_micsrc(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1: /* mic1 */
+ ac97_clr(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_clr(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ case 0x2: /* mic2 */
+ ac97_clr(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_set(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ case 0x4: /* stereo - ms bit clear to allow MIC1 to be mixed */
+ ac97_set(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_clr(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ }
+}
+
+static void
+ads_setup_micsrc(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+ static const char *values[] = {
+ AUDIO_PORT_MIC1,
+ AUDIO_PORT_MIC2,
+ AUDIO_PORT_STEREO,
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICSRC, 1, 0x7, 0x7, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, ads_set_micsrc,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICSRC);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+static void
+ads_setup_micboost(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ static const char *values[] = {
+ AUDIO_VALUE_OFF, /* 0dB */
+ AUDIO_VALUE_LOW, /* 10dB */
+ AUDIO_VALUE_MEDIUM, /* 20dB */
+ AUDIO_VALUE_HIGH, /* 30dB */
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICBOOST, 1, 0xf, 0xf, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, ads_set_micboost,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICBOOST);
+ if (ctrl) {
+ if (ctrl->actrl_initval) {
+ /* 20dB by default */
+ cpt.cp_initval = 2;
+ }
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+void
+ad1981a_init(ac97_t *ac)
+{
+ ads_setup_micboost(ac);
+}
+
+void
+ad1981b_init(ac97_t *ac)
+{
+ ads_setup_micboost(ac);
+ ads_setup_micsrc(ac); /* this part can use a mic array */
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_alc.c b/usr/src/uts/common/io/audio/ac97/ac97_alc.c
new file mode 100644
index 0000000000..1c621c5094
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_alc.c
@@ -0,0 +1,219 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * ALC (Realtek/Advance Logic) codec extensions.
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+#define ALC_DATA_FLOW_CTRL_REGISTER 0x6a
+#define ADFC_SPDIFIN_EN 0x8000
+#define ADFC_SPDIFIN_MON_EN 0x4000
+#define ADFC_SPDIF_OUT_MASK 0x3000
+#define ADFC_SPDIF_OUT_ACLINK 0x0000
+#define ADFC_SPDIF_OUT_ADC 0x1000
+#define ADFC_SPDIF_OUT_BYPASS 0x2000
+#define ADFC_PCM_SPDIFIN 0x0800
+#define ADFC_BACK_SURROUND 0x0400 /* ALC850 only */
+#define ADFC_CENTER_LFE 0x0400 /* ALC650 series */
+#define ADFC_MIC 0x0000
+#define ADFC_SURROUND 0x0200
+#define ADFC_LINEIN 0x0000
+#define ADFC_FRONT_MIC_MONO_OUT 0x0100 /* ALC850 */
+#define ADFC_ANALOG_INPUT_PASS_CLFE 0x0020
+#define ADFC_ANALOG_INPUT_PASS_SURROUND 0x0010
+#define ADFC_SURROUND_MIRROR 0x0001
+
+#define ALC_SURROUND_DAC_REGISTER 0x64
+#define ASD_SURROUND_MUTE 0x8000
+#define ASD_SURR_LEFT_VOL 0x1f00
+#define ASD_SURR_RIGHT_VOL 0x001f
+
+#define ALC_CEN_LFE_DAC_REGISTER 0x66
+#define ACLD_CEN_LFE_MUTE 0x8000
+#define ACLD_LFE_VOL 0x1f00
+#define ACLD_CEN_VOL 0x001f
+
+#define ALC_MISC_CTRL_REGISTER 0x7a
+#define AMC_XTLSEL 0x8000
+#define AMC_VREFOUT_DIS 0x1000
+#define AMC_INDEP_MUTE_CTRL 0x0800
+#define AMC_JD2_SURR_CEN_LFE 0x0008
+#define AMC_JD1_SURR_CEN_LFE 0x0004
+#define AMC_PIN47_SPDIF 0x0002
+#define AMC_PIN47_EAPD 0x0000
+#define AMC_JD0_SURR_CEN_LFE 0x0001
+
+static void
+alc650_set_linein_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_SURROUND);
+ } else {
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_SURROUND);
+ }
+}
+
+static void
+alc650_set_mic_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_MISC_CTRL_REGISTER, AMC_VREFOUT_DIS);
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_CENTER_LFE);
+ } else {
+ ac97_clr(ac, ALC_MISC_CTRL_REGISTER, AMC_VREFOUT_DIS);
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_CENTER_LFE);
+ }
+}
+
+#if 0
+static void
+alc850_set_auxin_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_BACK_SURROUND);
+ } else {
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_BACK_SURROUND);
+ }
+}
+#endif
+
+static void
+alc650_set_pcm(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+ uint16_t adj_value;
+ uint16_t mute;
+ uint8_t vol;
+
+ /* limit input values to 16 bits and split to right and left */
+ vol = value & 0xff;
+
+ /* If this control is mute-able than set as muted if needed */
+ mute = vol ? 0 : ASD_SURROUND_MUTE;
+ adj_value = ac97_val_scale(vol, vol, 5) | mute;
+
+ /* select page 0 */
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0);
+ /* adjust all three PCM volumes */
+ ac97_wr(ac, AC97_PCM_OUT_VOLUME_REGISTER, adj_value);
+ ac97_wr(ac, ALC_SURROUND_DAC_REGISTER, adj_value);
+ ac97_wr(ac, ALC_CEN_LFE_DAC_REGISTER, adj_value);
+}
+
+static const char *alc_linein_funcs[] = {
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_SURROUND,
+ NULL
+};
+
+static const char *alc_mic_funcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CENLFE,
+ NULL
+};
+
+static ac97_ctrl_probe_t alc650_linein_func_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, alc650_set_linein_func, NULL, 0, alc_linein_funcs
+};
+static ac97_ctrl_probe_t alc650_mic_func_cpt = {
+ AUDIO_CTRL_ID_JACK2, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, alc650_set_mic_func, NULL, 0, alc_mic_funcs
+};
+
+static void
+alc_pcm_override(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /* override master PCM volume function */
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_VOLUME);
+ if (ctrl != NULL) {
+ ctrl->actrl_write_fn = alc650_set_pcm;
+ }
+}
+
+void
+alc650_init(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ bcopy(&alc650_linein_func_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&alc650_mic_func_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_MIC_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ alc_pcm_override(ac);
+}
+
+void
+alc850_init(ac97_t *ac)
+{
+ /*
+ * NB: We could probably enable 7.1 here using the AUXIN source,
+ * but there are a few details still missing from the data sheet.
+ * (Such as, how is volume from the back-surround DAC managed?,
+ * and what SDATA slots are the back surround delivered on?)
+ *
+ * Also, the AC'97 controllers themselves don't necessarily support
+ * 7.1, so we'd have to figure out how to coordinate detection
+ * with the controller. 5.1 should be good enough for now.
+ *
+ * Unlike other products, ALC850 has separate pins for 5.1 data,
+ * so jack retasking isn't needed. However, it can retask
+ * some jacks, but we don't have full details for that right
+ * now. We've not seen it on any systems (yet) where this was
+ * necessary, though.
+ */
+
+ alc_pcm_override(ac);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_cmi.c b/usr/src/uts/common/io/audio/ac97/ac97_cmi.c
new file mode 100644
index 0000000000..50351cb08c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_cmi.c
@@ -0,0 +1,311 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * CMI (C-Media) codec extensions.
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+/*
+ * C-Media 9739 part is weird. Instead of having independent volume
+ * controls for each of the channels, it uses a single master volume
+ * and just provides mute support for the other bits. It does this
+ * for PCM volume as well, so we can't use it either. Ugh. It also
+ * has an optional 30 dB mic boost. Apparently the 9761 behaves in
+ * much the same fashion as the 9739.
+ *
+ * C-Media 9738 is a more or less typical 4CH device according to the
+ * datasheet. It however supports jack retasking allowing the line in
+ * jack to function as a surround output. Google suggests that the
+ * volume controls on this part are about as busted as on the other
+ * parts. So, we just use synthetic volume for it.
+ *
+ * C-Media 9780 is largely a mystery (ENODATASHEET).
+ */
+
+
+#define CMI_TASK_REGISTER 0x5A /* 9738 jack retasking */
+#define CTR_F2R 0x2000 /* front routed to rear */
+#define CTR_S2LNI 0x0400 /* surround to line in */
+
+#define CMI_MULTICH_REGISTER 0x64 /* 9739 and 9761a */
+#define CMR_PCBSW 0x8000 /* PC Beep volume bypass */
+#define CMR_P47 0x4000 /* configure P47 function */
+#define CMR_REFCTL 0x2000 /* enable vref output */
+#define CMR_CLCTL 0x1000 /* center/lfe output enable */
+#define CMR_S2LNI 0x0400 /* surround to line in */
+#define CMR_MIX2S 0x0200 /* analog input pass to surround */
+#define CMR_BSTSEL 0x0001 /* micboost use 30dB */
+
+static void
+cmi_set_micboost(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1:
+ /* 0db */
+ ac97_clr(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ case 0x2:
+ /* 20dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ case 0x4:
+ /* 30dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ }
+}
+
+static void
+cmi_set_linein_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
+ } else {
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
+ }
+}
+
+static void
+cmi_set_mic_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
+ } else {
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
+ }
+}
+
+static void
+cmi_setup_micboost(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ static const char *values[] = {
+ AUDIO_VALUE_OFF, /* 0dB */
+ AUDIO_VALUE_MEDIUM, /* 20dB */
+ AUDIO_VALUE_HIGH, /* 30dB */
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICBOOST, 1, 0xf, 0xf, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, cmi_set_micboost,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICBOOST);
+ if (ctrl) {
+ if (ctrl->actrl_initval) {
+ /* 20dB by default */
+ cpt.cp_initval = 1;
+ }
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+static const char *cmi_linein_funcs[] = {
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_SURROUND,
+ NULL
+};
+
+static const char *cmi_mic_funcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CENLFE,
+ NULL
+};
+
+static void
+cmi_setup_jack_funcs(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ ac97_ctrl_probe_t linein_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_linein_func, NULL, 0, cmi_linein_funcs
+ };
+ ac97_ctrl_probe_t mic_cpt = {
+ AUDIO_CTRL_ID_JACK2, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_mic_func, NULL, 0, cmi_mic_funcs
+ };
+
+ bcopy(&linein_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&mic_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_MIC_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+}
+
+static void
+cmi_set_linein_func_9738(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ if (value & 2) {
+ ac97_set(ac, CMI_TASK_REGISTER, CTR_S2LNI);
+ } else {
+ ac97_clr(ac, CMI_TASK_REGISTER, CTR_S2LNI);
+ }
+}
+
+static void
+cmi_set_spread_9738(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ if (value) {
+ ac97_set(ac, CMI_TASK_REGISTER, CTR_F2R);
+ } else {
+ ac97_clr(ac, CMI_TASK_REGISTER, CTR_F2R);
+ }
+}
+
+static void
+cmi_setup_jack_func_9738(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ ac97_ctrl_probe_t linein_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_linein_func_9738, NULL, 0, cmi_linein_funcs
+ };
+ ac97_ctrl_probe_t spread_cpt = {
+ AUDIO_CTRL_ID_SPREAD, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_FLAGS, 0, cmi_set_spread_9738,
+ };
+
+ bcopy(&linein_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&spread_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_SPREAD, -1);
+ if ((ival >= 0) && (ival <= 1)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+}
+
+
+static void
+cmi_setup_volume(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /*
+ * These CMI parts seem to be really weird. They don't have
+ * *any* functioning volume controls on them (mute only) apart
+ * from the record and monitor sources (excluding PCM). I
+ * don't understand why not. We just eliminate all of the
+ * volume controls and replace with a soft volume control.
+ * Its not an ideal situation, but I don't know what else I
+ * can do about it.
+ */
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_VOLUME);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_FRONT);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_SURROUND);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_CENTER);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_LFE);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+
+ /* make sure we have disabled mute and attenuation on physical ctrls */
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ ac97_wr(ac, AC97_PCM_OUT_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_MASTER_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER, 0);
+
+ (void) audio_dev_add_soft_volume(ac97_get_dev(ac));
+}
+
+void
+cmi9739_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_micboost(ac);
+ cmi_setup_jack_funcs(ac);
+}
+
+void
+cmi9761_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_micboost(ac);
+ cmi_setup_jack_funcs(ac);
+}
+
+void
+cmi9738_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_jack_func_9738(ac);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_impl.h b/usr/src/uts/common/io/audio/ac97/ac97_impl.h
new file mode 100644
index 0000000000..073707c0d9
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_impl.h
@@ -0,0 +1,113 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AC97_IMPL_H
+#define _SYS_AC97_IMPL_H
+
+typedef struct ac97_ctrl ac97_ctrl_t;
+typedef void (*ac97_set_t)(ac97_ctrl_t *, uint64_t);
+
+/*
+ * Per control state
+ */
+struct ac97_ctrl {
+ list_node_t actrl_linkage; /* For private cntrls list */
+ struct ac97 *actrl_ac97;
+ int actrl_bits; /* Port width */
+ uint32_t actrl_type; /* control type */
+ const char *actrl_name; /* control's name */
+ audio_ctrl_t *actrl_ctrl; /* control framework handle */
+ ac97_set_t actrl_write_fn; /* control write function */
+ uint64_t actrl_minval; /* MIN value for control */
+ uint64_t actrl_maxval; /* MAX value for control */
+ uint64_t actrl_value; /* current value in port */
+ uint64_t actrl_initval; /* initial value in port */
+ uint16_t actrl_muteable; /* if muteable, bits to do it */
+};
+
+/*
+ * Function Type used on controls that are optional
+ * This will return non-zero if the control should be
+ * installed and configured.
+ */
+typedef int (*cp_probe_t)(ac97_t *ac);
+
+
+/*
+ * This is used to enumerate and probe all controls that are
+ * supported and configurable on AC97 hardware
+ */
+typedef struct ac97_ctrl_probe {
+ const char *cp_name; /* name of control */
+ uint64_t cp_initval; /* Initial value for control */
+ uint64_t cp_minval; /* MIN value for control */
+ uint64_t cp_maxval; /* MAX value for control */
+ uint32_t cp_type; /* Type of control */
+ uint32_t cp_flags; /* control type flags */
+ uint16_t cp_muteable; /* Mute bit mask */
+ ac97_set_t cp_write_fn; /* control write function */
+ cp_probe_t cp_probe; /* Probe if control exists */
+ int cp_bits; /* Bits for volume controls */
+ const char **cp_enum; /* Enumeration value */
+} ac97_ctrl_probe_t;
+
+typedef struct ac97_hooks {
+ void (*h_detach)(ac97_t *);
+ void (*h_reset)(ac97_t *);
+ void (*h_restore)(ac97_t *);
+} ac97_hooks_t;
+
+/*
+ * These are the flags for most of our controls
+ */
+#define AC97_RW (AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE)
+#define AC97_FLAGS (AC97_RW | AUDIO_CTRL_FLAG_POLL)
+
+void ac97_wr(ac97_t *, uint8_t, uint16_t);
+uint16_t ac97_rd(ac97_t *, uint8_t);
+void ac97_clr(ac97_t *, uint8_t, uint16_t);
+void ac97_set(ac97_t *, uint8_t, uint16_t);
+void ac97_alloc_control(ac97_t *, ac97_ctrl_probe_t *);
+void ac97_free_control(ac97_ctrl_t *);
+ac97_ctrl_t *ac97_control_find(ac97_t *, const char *);
+uint16_t ac97_val_scale(int left, int right, int bits);
+uint16_t ac97_mono_scale(int val, int bits);
+audio_dev_t *ac97_get_dev(ac97_t *);
+int ac97_get_prop(ac97_t *, char *, int);
+
+/* Codec specific initializations */
+
+void ad1981a_init(ac97_t *);
+void ad1981b_init(ac97_t *);
+
+void alc650_init(ac97_t *);
+void alc850_init(ac97_t *);
+
+void cmi9738_init(ac97_t *);
+void cmi9739_init(ac97_t *);
+void cmi9761_init(ac97_t *);
+
+#endif /* _SYS_AC97_IMPL_H */
diff --git a/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c
new file mode 100644
index 0000000000..6820d7fd57
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c
@@ -0,0 +1,1952 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audio1575 Audio Driver
+ *
+ * The driver is primarily targeted at providing audio support for
+ * those systems which use the Uli M1575 audio core.
+ *
+ * The M1575 audio core, in AC'97 controller mode, has independent
+ * channels for PCM in, PCM out, mic in, modem in, and modem out.
+ *
+ * The AC'97 controller is a PCI bus master with scatter/gather
+ * support. Each channel has a DMA engine. Currently, we use only
+ * the PCM in and PCM out channels. Each DMA engine uses one buffer
+ * descriptor list. And the buffer descriptor list is an array of up
+ * to 32 entries, each of which describes a data buffer. Each entry
+ * contains a pointer to a data buffer, control bits, and the length
+ * of the buffer being pointed to, where the length is expressed as
+ * the number of samples. This, combined with the 16-bit sample size,
+ * gives the actual physical length of the buffer.
+ *
+ * TODO: System power management is not yet supported by the driver.
+ *
+ * NOTE:
+ * This driver depends on the drv/audio, misc/ac97
+ * modules being loaded first.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audio1575.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audio1575_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audio1575_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audio1575_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audio1575_close(void *);
+static int audio1575_start(void *);
+static void audio1575_stop(void *);
+static int audio1575_format(void *);
+static int audio1575_channels(void *);
+static int audio1575_rate(void *);
+static uint64_t audio1575_count(void *);
+static void audio1575_sync(void *, unsigned);
+static size_t audio1575_qlen(void *);
+
+static audio_engine_ops_t audio1575_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audio1575_open,
+ audio1575_close,
+ audio1575_start,
+ audio1575_stop,
+ audio1575_count,
+ audio1575_format,
+ audio1575_channels,
+ audio1575_rate,
+ audio1575_sync,
+ audio1575_qlen
+};
+
+/*
+ * interrupt handler
+ */
+static uint_t audio1575_intr(caddr_t, caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audio1575_attach(dev_info_t *);
+static int audio1575_resume(dev_info_t *);
+static int audio1575_detach(dev_info_t *);
+static int audio1575_suspend(dev_info_t *);
+
+static int audio1575_alloc_port(audio1575_state_t *, int);
+static void audio1575_free_port(audio1575_port_t *);
+static void audio1575_start_port(audio1575_port_t *);
+static void audio1575_stop_port(audio1575_port_t *);
+static void audio1575_reset_port(audio1575_port_t *);
+static void audio1575_update_port(audio1575_port_t *);
+
+static int audio1575_setup_intr(audio1575_state_t *);
+static int audio1575_codec_sync(audio1575_state_t *);
+static void audio1575_write_ac97(void *, uint8_t, uint16_t);
+static uint16_t audio1575_read_ac97(void *, uint8_t);
+static int audio1575_chip_init(audio1575_state_t *);
+static int audio1575_map_regs(audio1575_state_t *);
+static void audio1575_unmap_regs(audio1575_state_t *);
+static void audio1575_dma_stop(audio1575_state_t *);
+static void audio1575_pci_enable(audio1575_state_t *);
+static void audio1575_pci_disable(audio1575_state_t *);
+
+static void audio1575_destroy(audio1575_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/*
+ * DDI Structures
+ */
+
+
+/* Device operations structure */
+static struct dev_ops audio1575_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audio1575_ddi_attach, /* devo_attach */
+ audio1575_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ ddi_quiesce_not_supported, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audio1575_modldrv = {
+ &mod_driverops, /* drv_modops */
+ M1575_MOD_NAME, /* drv_linkinfo */
+ &audio1575_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audio1575_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audio1575_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x000000000000ffffLL, /* DMA counter register - 64 bits */
+ 0x0000000000000008LL, /* DMA address align must be 8-bytes */
+ 0x0000003c, /* 1 through 64 byte burst sizes */
+ 0x00000008, /* min xfer DMA size BDList entry */
+ 0x00000000000ffffLL, /* max xfer size, 64K */
+ 0x000000000001fffLL, /* seg, set to PAGESIZE */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000008, /* granularity of device minxfer */
+ 0 /* DMA flags use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x000000000001fffeLL, /* DMA counter register - 16 bits */
+ 0x0000000000000004LL, /* DMA address align 2-byte boundary */
+ 0x0000003c, /* 1 through 60 byte burst sizes */
+ 0x00000004, /* min xfer DMA size BDList entry */
+ 0x000000000001ffffLL, /* max xfer size, 64K */
+ 0x000000000001ffffLL, /* seg, set to 64K */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000004, /* granularity of device minxfer */
+ 0 /* DMA flags use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audio1575_dev_ops, M1575_NAME);
+
+ if ((error = mod_install(&audio1575_modlinkage)) != 0) {
+ audio_fini_ops(&audio1575_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* clean up ops */
+ audio_fini_ops(&audio1575_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audio1575_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audio1575_ddi_attach()
+ *
+ * Description:
+ * Implements the DDI attach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio1575_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audio1575_attach(dip));
+
+ case DDI_RESUME:
+ return (audio1575_resume(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_ddi_detach()
+ *
+ * Description:
+ * Implements the detach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio1575_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audio1575_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audio1575_suspend(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * Each of buffer descriptor has a field IOC(interrupt on completion)
+ * When both this and the IOC bit of correspondent dma control register
+ * is set, it means that the controller should issue an interrupt upon
+ * completion of this buffer. Note that in the clearing of the interrupts
+ * below that the PCM IN and PCM out interrupts ar cleared by their
+ * respective control registers and not by writing a '1' to the INTRSR
+ * the interrupt status register. Only CPRINTR,SPINTR,and GPIOINTR
+ * require a '1' written to the INTRSR register to clear those
+ * interrupts. See comments below.
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audio1575_intr(caddr_t arg, caddr_t dontcare)
+{
+ audio1575_state_t *statep = (void *)arg;
+ uint32_t intrsr;
+ uint8_t index;
+ audio1575_port_t *consume = NULL;
+ audio1575_port_t *produce = NULL;
+
+ _NOTE(ARGUNUSED(dontcare));
+
+ mutex_enter(&statep->lock);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+
+ /* check if device is interrupting */
+ if (intrsr == 0) {
+ if (statep->ksp) {
+ /* increment the spurious ino5 interrupt cnt */
+ M1575_KIOP(statep)->intrs[KSTAT_INTR_SPURIOUS]++;
+ }
+
+ mutex_exit(&statep->lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->ksp) {
+ M1575_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ /*
+ * The Uli M1575 generates an interrupt for each interrupt
+ * type. therefore we only process one interrupt type
+ * per invocation of the audio1575_intr() routine.
+ * WARNING: DO NOT attempt to optimize this by looping
+ * until the INTRSR register is clear as this will
+ * generate spurious ino5 interrupts.
+ */
+ if (GET16(M1575_PCMISR_REG) & M1575_PCMISR_BCIS) {
+ /* Clear PCM IN interrupt */
+ PUT16(M1575_PCMISR_REG, M1575_SR_CLR);
+ /*
+ * Note: This interrupt is not cleared by writing a '1'
+ * to the M1575_INTRSR_REG according to the M1575 Super I/O
+ * data sheet on page 189.
+ */
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = GET8(M1575_PCMICIV_REG);
+ index = (index - 1) % M1575_BD_NUMS;
+ PUT8(M1575_PCMILVIV_REG, index);
+ produce = statep->ports[M1575_REC];
+
+ } else if (GET16(M1575_PCMOSR_REG) & M1575_PCMOSR_BCIS) {
+ /* Clear PCM OUT interrupt */
+ PUT16(M1575_PCMOSR_REG, M1575_SR_CLR);
+ /*
+ * Note: This interrupt is not cleared by writing a '1'
+ * to the M1575_INTRSR_REG according to the M1575 Super I/O
+ * data sheet on page 189.
+ */
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = GET8(M1575_PCMOCIV_REG);
+ index = (index - 1) % M1575_BD_NUMS;
+ PUT8(M1575_PCMOLVIV_REG, index);
+ consume = statep->ports[M1575_PLAY];
+
+ } else {
+ /* Clear other interrupts (there should not be any) */
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ }
+
+ mutex_exit(&statep->lock);
+
+ if (produce) {
+ audio_engine_produce(produce->engine);
+ }
+ if (consume) {
+ audio_engine_consume(consume->engine);
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * audio1575_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audio1575_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audio1575_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = M1575_BD_NUMS;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->lock);
+ audio1575_reset_port(port);
+ mutex_exit(&port->statep->lock);
+
+ return (0);
+}
+
+
+/*
+ * audio1575_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audio1575_close(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ audio1575_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->lock);
+}
+
+/*
+ * audio1575_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audio1575_stop(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ if (port->started) {
+ audio1575_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->lock);
+}
+
+/*
+ * audio1575_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audio1575_start(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ if (!port->started) {
+ audio1575_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->lock);
+ return (0);
+}
+
+/*
+ * audio1575_format()
+ *
+ * Description:
+ * Called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE
+ */
+static int
+audio1575_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audio1575_channels()
+ *
+ * Description:
+ * Called by the framework to query the channels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Number of channels for the device
+ */
+static int
+audio1575_channels(void *arg)
+{
+ audio1575_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audio1575_rate()
+ *
+ * Description:
+ * Called by the framework to query the sample rate for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audio1575_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audio1575_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audio1575_count(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+ uint64_t val;
+
+ mutex_enter(&statep->lock);
+ audio1575_update_port(port);
+ val = port->count + port->picb;
+ mutex_exit(&statep->lock);
+
+ return (val);
+}
+
+/*
+ * audio1575_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audio1575_sync(void *arg, unsigned nframes)
+{
+ audio1575_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audio1575_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audio1575_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+
+/*
+ * audio1575_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to start.
+ */
+static void
+audio1575_start_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == M1575_REC) {
+ /* ULi says do fifo resets here */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+ PUT8(M1575_PCMICR_REG, M1575_PCMICR_IOCE);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMISTART);
+ } else {
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_IOCE);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOSTART);
+ }
+}
+
+/*
+ * audio1575_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to stop.
+ */
+static void
+audio1575_stop_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == M1575_REC) {
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+ } else {
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ }
+}
+
+/*
+ * audio1575_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to reset.
+ */
+static void
+audio1575_reset_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ port->civ = 0;
+ port->picb = 0;
+
+ if (statep->suspended)
+ return;
+
+ if (port->num == M1575_REC) {
+ /* Uli FIFO madness ... */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+
+ PUT8(M1575_PCMICR_REG, 0);
+ PUT8(M1575_PCMICR_REG, M1575_CR_RR | M1575_CR_IOCE);
+
+ PUT32(M1575_PCMIBDBAR_REG, port->bdl_paddr);
+ PUT8(M1575_PCMILVIV_REG, M1575_BD_NUMS - 1);
+
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+
+ } else {
+
+ /* Uli FIFO madness ... */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMORST);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+
+ PUT8(M1575_PCMOCR_REG, 0);
+ PUT8(M1575_PCMOCR_REG, M1575_CR_RR | M1575_CR_IOCE);
+
+ PUT32(M1575_PCMOBDBAR_REG, port->bdl_paddr);
+ PUT8(M1575_PCMOLVIV_REG, M1575_BD_NUMS - 1);
+
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ }
+}
+
+/*
+ * audio1575_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audio1575_port_t *port The port to update.
+ */
+static void
+audio1575_update_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+ uint8_t civ;
+ uint16_t picb;
+ unsigned n;
+ int civoff;
+ int picoff;
+
+ if (port->num == M1575_REC) {
+ civoff = M1575_PCMICIV_REG;
+ picoff = M1575_PCMIPICB_REG;
+ } else {
+ civoff = M1575_PCMOCIV_REG;
+ picoff = M1575_PCMOPICB_REG;
+ }
+
+ if (statep->suspended) {
+ civ = 0;
+ picb = 0;
+ } else {
+ /*
+ * We read the position counters, but we're careful to avoid
+ * the situation where the position counter resets at the end
+ * of a buffer.
+ */
+ for (int i = 0; i < 2; i++) {
+ civ = GET8(civoff);
+ picb = GET16(picoff);
+ if (GET8(civoff) == civ) {
+ /*
+ * Chip did not start a new index, so
+ * the picb is valid.
+ */
+ break;
+ }
+ }
+ if (civ >= port->civ) {
+ n = civ - port->civ;
+ } else {
+ n = civ + (M1575_BD_NUMS - port->civ);
+ }
+ port->count += (n * port->fragfr);
+ }
+ port->civ = civ;
+ port->picb = picb;
+}
+
+/*
+ * audio1575_attach()
+ *
+ * Description:
+ * Attach an instance of the audio1575 driver. This routine does the
+ * device dependent attach tasks. When it is completed, it registers
+ * with the audio framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio1575_attach(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+ audio_dev_t *adev;
+ uint32_t devid;
+ const char *name;
+ const char *rev;
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
+ statep->dip = dip;
+
+ /*
+ * We want the micboost enabled by default as well.
+ */
+ ddi_prop_update_int(DDI_DEV_T_NONE, dip, AC97_PROP_MICBOOST, 1);
+
+ /* allocate common audio dev structure */
+ adev = audio_dev_alloc(dip, 0);
+ if (adev == NULL) {
+ audio_dev_warn(NULL, "unable to allocate audio dev");
+ goto error;
+ }
+ statep->adev = adev;
+
+ /* map in the audio registers */
+ if (audio1575_map_regs(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ if (audio1575_setup_intr(statep) != DDI_SUCCESS) {
+ /* message already noted */
+ goto error;
+ }
+
+ /* Enable PCI I/O and Memory Spaces */
+ audio1575_pci_enable(statep);
+
+ devid = (pci_config_get16(statep->pcih, PCI_CONF_VENID) << 16) |
+ pci_config_get16(statep->pcih, PCI_CONF_DEVID);
+ switch (devid) {
+ case 0x10b95455:
+ name = "Uli M1575 AC'97";
+ rev = "M5455";
+ break;
+ default:
+ name = "Uli AC'97";
+ rev = "Unknown";
+ break;
+ }
+ /* set device information -- this should check PCI config space */
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, rev);
+
+
+ /* allocate port structures */
+ if ((audio1575_alloc_port(statep, M1575_PLAY) != DDI_SUCCESS) ||
+ (audio1575_alloc_port(statep, M1575_REC) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ statep->ac97 = ac97_alloc(dip, audio1575_read_ac97,
+ audio1575_write_ac97, statep);
+ ASSERT(statep->ac97 != NULL);
+
+ if (audio1575_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to init chip");
+ goto error;
+ }
+
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(M1575_NAME,
+ ddi_get_instance(dip), M1575_NAME, "controller",
+ KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+ /* Enable PCI Interrupts */
+ pci_config_put8(statep->pcih, M1575_PCIMISC_REG, M1575_PCIMISC_INTENB);
+
+ /* enable audio interrupts */
+ if (ddi_intr_enable(statep->ih) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_intr_enable() failure");
+ goto error;
+ }
+
+ /* register with the framework */
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audio1575_destroy(statep);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_detach()
+ *
+ * Description:
+ * Detach an instance of the audio1575 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio1575_detach(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio1575_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audio1575_setup_intr()
+ *
+ * Description:
+ * This routine initializes the audio driver's interrupt handle and
+ * mutex.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Interrupt handle & mutex initialized
+ * DDI_FAILURE Interrupt handle & mutex not initialized
+ */
+int
+audio1575_setup_intr(audio1575_state_t *statep)
+{
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ uint_t ipri;
+ int actual;
+ int rv;
+ int itype;
+ int count;
+ ddi_intr_handle_t ih = NULL;
+
+ dip = statep->dip;
+ adev = statep->adev;
+
+ /* get supported interrupt types */
+ rv = ddi_intr_get_supported_types(dip, &itype);
+ if ((rv != DDI_SUCCESS) || (!(itype & DDI_INTR_TYPE_FIXED))) {
+ audio_dev_warn(adev, "Fixed type interrupts not supported");
+ return (DDI_FAILURE);
+ }
+
+ /* make sure we only have one fixed type interrupt */
+ rv = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
+ if ((rv != DDI_SUCCESS) || (count != 1)) {
+ audio_dev_warn(adev, "No fixed interrupts");
+ return (DDI_FAILURE);
+ }
+
+ rv = ddi_intr_alloc(statep->dip, &ih, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_STRICT);
+ if ((rv != DDI_SUCCESS) || (actual != 1)) {
+ audio_dev_warn(adev, "Can't alloc interrupt handle");
+ return (DDI_FAILURE);
+ }
+
+ /* test for a high level interrupt */
+ if (ddi_intr_get_pri(ih, &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "Can't get interrupt priority");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+ if (ipri >= ddi_intr_get_hilevel_pri()) {
+ audio_dev_warn(adev, "Unsupported high level interrupt");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(ih, audio1575_intr, statep, NULL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(adev, "Can't add interrupt handler");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+
+ statep->ih = ih;
+ mutex_init(&statep->lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio1575_alloc_port(audio1575_state_t *statep, int num)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ audio_dev_t *adev;
+ audio1575_port_t *port;
+ uint32_t *kaddr;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ statep->ports[num] = port;
+ port->num = num;
+ port->statep = statep;
+ port->started = B_FALSE;
+
+ if (num == M1575_REC) {
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = 2;
+ } else {
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ /* XXX: possibly support multichannel! */
+ port->nchan = 2;
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, M1575_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < M1575_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, M1575_INTS);
+ port->intrs = M1575_INTS;
+ } else if (port->intrs > M1575_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, M1575_INTS);
+ port->intrs = M1575_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 32 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a shorter BD list.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = M1575_ROUNDUP(port->fragfr, M1575_MOD_SIZE);
+ port->samp_size = port->fragfr * port->nchan * 2;
+ port->samp_size *= M1575_BD_NUMS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wire up the BD list. We do this *before* binding the BD list
+ * so that we don't have to do an extra ddi_dma_sync.
+ */
+ paddr = port->samp_paddr;
+ kaddr = (void *)port->bdl_kaddr;
+ for (int i = 0; i < M1575_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, kaddr, paddr);
+ kaddr++;
+
+ /* set size in frames, and enable IOC interrupt */
+ ddi_put32(port->bdl_acch, kaddr,
+ ((port->fragfr * port->nchan) | (1U << 31)));
+ kaddr++;
+
+ paddr += (port->fragfr * port->nchan * 2);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ port->engine = audio_engine_alloc(&audio1575_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audio810_port_t *port The port structure for a DMA engine.
+ */
+static void
+audio1575_free_port(audio1575_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audio1575_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio1575_map_regs(audio1575_state_t *statep)
+{
+ dev_info_t *dip = statep->dip;
+
+ /* Check for fault management capabilities */
+ if (DDI_FM_ACC_ERR_CAP(ddi_fm_capable(dip))) {
+ dev_attr.devacc_attr_access = DDI_FLAGERR_ACC;
+ }
+
+ /* map the M1575 Audio PCI Cfg Space */
+ if (pci_config_setup(dip, &statep->pcih) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "PCI config map failure");
+ goto error;
+ }
+
+ /* map the M1575 Audio registers in PCI IO Space */
+ if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE, &statep->regsp,
+ 0, 0, &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "Audio IO mapping failure");
+ goto error;
+ }
+ return (DDI_SUCCESS);
+
+error:
+ audio1575_unmap_regs(statep);
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ */
+static void
+audio1575_unmap_regs(audio1575_state_t *statep)
+{
+ if (statep->regsh) {
+ ddi_regs_map_free(&statep->regsh);
+ }
+
+ if (statep->pcih) {
+ pci_config_teardown(&statep->pcih);
+ }
+}
+
+/*
+ * audio1575_chip_init()
+ *
+ * Description:
+ * This routine initializes the M1575 AC97 audio controller and the AC97
+ * codec. The AC97 codec registers are programmed from codec_shadow[].
+ * If we are not doing a restore, we initialize codec_shadow[], otherwise
+ * we use the current values of shadow. This routine expects that the
+ * PCI IO and Memory spaces have been mapped and enabled already.
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ * restore from codec_shadow[]
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audio1575_chip_init(audio1575_state_t *statep)
+{
+ uint32_t ssr;
+ uint32_t rtsr;
+ uint32_t intrsr;
+ int i;
+ int j;
+ uint8_t clk_detect;
+ clock_t ticks;
+ ddi_acc_handle_t pcih;
+
+ /*
+ * clear the interrupt control and status register
+ * READ/WRITE/READ workaround required
+ * for buggy hardware
+ */
+
+ PUT32(M1575_INTRCR_REG, 0);
+ (void) GET32(M1575_INTRCR_REG);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ (void) GET32(M1575_INTRSR_REG);
+
+ ticks = drv_usectohz(M1575_LOOP_CTR);
+
+ /*
+ * SADA only supports stereo, so we set the channel bits
+ * to "00" to select 2 channels.
+ * will also set the following:
+ *
+ * Disable double rate enable
+ * no SPDIF output selected
+ * 16 bit audio record mode
+ * 16 bit pcm out mode
+ * PCM Out 6 chan mode FL FR CEN BL BR LFE
+ * PCM Out 2 channel mode (00)
+ */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Reset the AC97 Codec and default to 2 channel 16 bit mode */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ delay(ticks<<1);
+
+ /* Read the System Status Reg */
+ ssr = GET32(M1575_SSR_REG);
+
+ /* make sure and release the blocked reset bit */
+ if (ssr & M1575_SSR_RSTBLK) {
+ SET32(M1575_INTFCR_REG, M1575_INTFCR_RSTREL);
+ delay(ticks);
+
+ /* Read the System Status Reg */
+ ssr = GET32(M1575_SSR_REG);
+
+ /* make sure and release the blocked reset bit */
+ if (ssr & M1575_SSR_RSTBLK) {
+ return (DDI_FAILURE);
+ }
+
+ /* Reset the controller */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ delay(ticks);
+ }
+
+ /* according AC'97 spec, wait for codec reset */
+ for (j = 0; j < M1575_LOOP_CTR; j++) {
+ if ((GET32(M1575_SCR_REG) & M1575_SCR_COLDRST) == 0) {
+ break;
+ }
+ delay(ticks);
+ }
+
+ /* codec reset failed */
+ if (j >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev,
+ "failure to reset codec");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wait for FACRDY First codec ready. The hardware can
+ * provide the state of
+ * codec ready bit on SDATA_IN[0] and as reflected in
+ * the Recv Tag Slot Reg.
+ */
+ rtsr = GET32(M1575_RTSR_REG);
+ if (rtsr & M1575_RTSR_FACRDY) {
+ break;
+ } else { /* reset the status and wait for new status to set */
+ rtsr |= M1575_RTSR_FACRDY;
+ PUT32(M1575_RTSR_REG, rtsr);
+ drv_usecwait(10);
+ }
+ }
+
+ /* if we could not reset the AC97 codec then report failure */
+ if (i >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev,
+ "no codec ready signal received");
+ return (DDI_FAILURE);
+ }
+
+ /* Magic code from ULi to Turn on the AC_LINK clock */
+ pcih = statep->pcih;
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 4);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ (void) pci_config_get8(pcih, M1575_PCIACD_REG);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 2);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ clk_detect = pci_config_get8(pcih, M1575_PCIACD_REG);
+
+ if (clk_detect != 1) {
+ audio_dev_warn(statep->adev, "No AC97 Clock Detected");
+ return (DDI_FAILURE);
+ }
+
+ /* Magic code from Uli to Init FIFO1 and FIFO2 */
+ PUT32(M1575_FIFOCR1_REG, 0x81818181);
+ PUT32(M1575_FIFOCR2_REG, 0x81818181);
+ PUT32(M1575_FIFOCR3_REG, 0x81818181);
+
+ /* Make sure that PCM in and PCM out are enabled */
+ SET32(M1575_INTFCR_REG, (M1575_INTFCR_PCMIENB | M1575_INTFCR_PCMOENB));
+
+ audio1575_dma_stop(statep);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_dma_stop()
+ *
+ * Description:
+ * This routine is used to put each DMA engine into the quiet state.
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_dma_stop(audio1575_state_t *statep)
+{
+ uint32_t intrsr;
+ int i;
+
+ if (statep->regsh == NULL) {
+ return;
+ }
+
+ /* pause bus master (needed for the following reset register) */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+
+ SET32(M1575_DMACR_REG, M1575_DMACR_PAUSE_ALL);
+ if (GET32(M1575_DMACR_REG) & M1575_DMACR_PAUSE_ALL) {
+ break;
+ }
+ drv_usecwait(10);
+ }
+
+ if (i >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev, "failed to stop DMA");
+ return;
+ }
+
+ /* Pause bus master (needed for the following reset register) */
+ PUT8(M1575_PCMICR_REG, 0);
+ PUT8(M1575_PCMOCR_REG, 0);
+ PUT8(M1575_MICICR_REG, 0);
+ PUT8(M1575_CSPOCR_REG, 0);
+ PUT8(M1575_PCMI2CR_RR, 0);
+ PUT8(M1575_MICI2CR_RR, 0);
+
+ /* Reset the bus master registers for all DMA engines */
+ PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
+ PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
+ PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
+ PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
+ PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
+ PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
+
+ /* Reset FIFOS */
+ PUT32(M1575_FIFOCR1_REG, 0x81818181);
+ PUT32(M1575_FIFOCR2_REG, 0x81818181);
+ PUT32(M1575_FIFOCR3_REG, 0x81818181);
+
+ /* Clear Interrupts */
+ SET16(M1575_PCMISR_REG, M1575_SR_CLR);
+ SET16(M1575_PCMOSR_REG, M1575_SR_CLR);
+ SET16(M1575_MICISR_REG, M1575_SR_CLR);
+ SET16(M1575_CSPOSR_REG, M1575_SR_CLR);
+ SET16(M1575_PCMI2SR_REG, M1575_SR_CLR);
+ SET16(M1575_MICI2SR_REG, M1575_SR_CLR);
+
+ /*
+ * clear the interrupt control and status register
+ * READ/WRITE/READ workaround required
+ * for buggy hardware
+ */
+
+ PUT32(M1575_INTRCR_REG, 0);
+ (void) GET32(M1575_INTRCR_REG);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ (void) GET32(M1575_INTRSR_REG);
+}
+
+/*
+ * audio1575_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audio1575_codec_sync(audio1575_state_t *statep)
+{
+ /* do the Uli Shuffle ... */
+ for (int i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Read the semaphore, and loop till we own it */
+ if ((GET32(M1575_CASR_REG) & 1) == 0) {
+ for (int j = 0; j < M1575_LOOP_CTR; j++) {
+ /* Wait for CWRSUCC 0x8 */
+ if (GET32(M1575_CSPSR_REG) &
+ M1575_CSPSR_SUCC) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(1);
+ }
+ }
+ drv_usecwait(10);
+ }
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_write_ac97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audio1575_write_ac97(void *arg, uint8_t reg, uint16_t data)
+{
+ audio1575_state_t *statep = arg;
+ int i;
+
+ mutex_enter(&statep->ac_lock);
+
+ if (audio1575_codec_sync(statep) != DDI_SUCCESS) {
+ mutex_exit(&statep->ac_lock);
+ return;
+ }
+
+ /* write the data to WRITE to the lo word of the CPR register */
+ PUT16(M1575_CPR_REG, data);
+
+ /* write the address to WRITE to the hi word of the CPR register */
+ PUT16(M1575_CPR_REG+2, reg);
+
+ /* wait until command is completed sucessfully */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Wait for Write Ready 0x01 */
+ if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_WRRDY) {
+ break;
+ }
+ drv_usecwait(1);
+ }
+
+ mutex_exit(&statep->ac_lock);
+
+ if (i < M1575_LOOP_CTR) {
+ (void) audio1575_read_ac97(statep, reg);
+ }
+}
+
+/*
+ * audio1575_read_ac97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register. It also updates codec_shadow[]
+ * with the register value.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * Value of AC97 register. (0xffff in failure situations).
+ */
+static uint16_t
+audio1575_read_ac97(void *arg, uint8_t reg)
+{
+ audio1575_state_t *statep = arg;
+ uint16_t addr = 0;
+ uint16_t data = 0xffff;
+ int i;
+
+ mutex_enter(&statep->ac_lock);
+ if ((audio1575_codec_sync(statep)) != DDI_SUCCESS) {
+ mutex_exit(&statep->ac_lock);
+ return (data);
+ }
+
+ /*
+ * at this point we have the CASR semaphore
+ * and the codec is r/w ready
+ * OR in the READ opcode into the address field
+ */
+
+ addr = (reg | M1575_CPR_READ);
+
+ /* write the address to READ to the hi word of the CPR register */
+ PUT16(M1575_CPR_REG+2, addr);
+
+ /* wait until command is completed sucessfully */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Wait for Read Ready 0x02 */
+ if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_RDRDY) {
+ break;
+ }
+ drv_usecwait(1);
+ }
+
+ if (i < M1575_LOOP_CTR) {
+ /* read back the data and address */
+ data = GET16(M1575_SPR_REG);
+ addr = GET16(M1575_SPR_REG+2);
+ if (addr != reg) {
+ data = 0xffff;
+ }
+ }
+
+ mutex_exit(&statep->ac_lock);
+ return (data);
+}
+
+/*
+ * audio1575_pci_enable()
+ *
+ * Description:
+ * This routine Enables all PCI IO and MEMORY accesses
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_pci_enable(audio1575_state_t *statep)
+{
+ uint16_t pcics_reg;
+
+ pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
+}
+
+/*
+ * audio1575_pci_disable()
+ *
+ * Description:
+ * This routine Disables all PCI IO and MEMORY accesses
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_pci_disable(audio1575_state_t *statep)
+{
+ uint16_t pcics_reg;
+
+ if (statep->pcih == NULL)
+ return;
+ pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
+}
+
+/*
+ * audio1575_resume()
+ *
+ * Description:
+ * Resume operation of the device after sleeping or hibernating.
+ * Note that this should never fail, even if hardware goes wonky,
+ * because the current PM framework will panic if it does.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was resumed
+ */
+static int
+audio1575_resume(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+ audio_dev_t *adev;
+
+ /* we've already allocated the state structure so get ptr */
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+ ASSERT(!mutex_owned(&statep->lock));
+
+ if (audio1575_chip_init(statep) != DDI_SUCCESS) {
+ /*
+ * Note that PM gurus say we should return
+ * success here. Failure of audio shouldn't
+ * be considered FATAL to the system. The
+ * upshot is that audio will not progress.
+ */
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ /* allow ac97 operations again */
+ ac97_resume(statep->ac97);
+
+ mutex_enter(&statep->lock);
+
+ ASSERT(statep->suspended);
+ statep->suspended = B_FALSE;
+
+ for (int i = 0; i < M1575_NUM_PORTS; i++) {
+
+ audio1575_port_t *port = statep->ports[i];
+
+ if (port != NULL) {
+ /* reset framework DMA engine buffer */
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+
+ /* reset and initialize hardware ports */
+ audio1575_reset_port(port);
+ if (port->started) {
+ audio1575_start_port(port);
+ } else {
+ audio1575_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&statep->lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_suspend()
+ *
+ * Description:
+ * Suspend an instance of the audio1575 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was suspended
+ */
+static int
+audio1575_suspend(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ ac97_suspend(statep->ac97);
+
+ mutex_enter(&statep->lock);
+
+ statep->suspended = B_TRUE;
+
+ /*
+ * stop all DMA operations
+ */
+ audio1575_dma_stop(statep);
+
+ mutex_exit(&statep->lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device soft state.
+ *
+ * Returns:
+ * None
+ */
+void
+audio1575_destroy(audio1575_state_t *statep)
+{
+ ddi_acc_handle_t pcih;
+
+ /* stop DMA engines */
+ audio1575_dma_stop(statep);
+
+ if (statep->regsh != NULL) {
+ /* reset the codec */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ }
+
+ if ((pcih = statep->pcih) != NULL) {
+ /* turn off the AC_LINK clock */
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 4);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ }
+
+ /* Disable PCI I/O and Memory Spaces */
+ audio1575_pci_disable(statep);
+
+ if (statep->ih != NULL) {
+ (void) ddi_intr_disable(statep->ih);
+ (void) ddi_intr_remove_handler(statep->ih);
+ (void) ddi_intr_free(statep->ih);
+ mutex_destroy(&statep->lock);
+ mutex_destroy(&statep->ac_lock);
+ }
+
+ if (statep->ksp != NULL) {
+ kstat_delete(statep->ksp);
+ }
+
+ audio1575_free_port(statep->ports[M1575_PLAY]);
+ audio1575_free_port(statep->ports[M1575_REC]);
+
+ audio1575_unmap_regs(statep);
+
+ if (statep->ac97 != NULL) {
+ ac97_free(statep->ac97);
+ }
+
+ if (statep->adev != NULL) {
+ audio_dev_free(statep->adev);
+ }
+
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf
index 78b15ccbeb..cb3986c128 100644
--- a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audio1575 audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -58,17 +46,3 @@ mixer-mode=1;
play-interrupts=175;
record-interrupts=175;
-
-#
-# uncomment the cdrom=1 to enable the CDROM analog input in the
-# audio1575 driver .
-#
-#cdrom=1;
-#
-#
-# Uncomment reset-configuration to cause the audio1575 driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
-
diff --git a/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h
new file mode 100644
index 0000000000..efdfb46cf6
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h
@@ -0,0 +1,468 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef AUDIO1575_H
+#define AUDIO1575_H
+
+/*
+ * Header file for the audio1575 device driver
+ */
+
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define M1575_DEV_NAME "SUNW,audio1575"
+#define M1575_DEV_CONFIG "onboard1"
+#define M1575_DEV_VERSION "a"
+
+/*
+ * Driver supported configuration information
+ */
+#define M1575_NAME "audio1575"
+#define M1575_MOD_NAME "M1575 audio driver"
+
+#define M1575_INTS (175) /* default interrupt rate */
+#define M1575_MIN_INTS (25) /* minimum interrupt rate */
+#define M1575_MAX_INTS (5000) /* maximum interrupt rate */
+
+/*
+ * Implementation specific header file for the audio1575 device driver.
+ */
+
+/* Misc. defines */
+#define M1575_CONFIG_DEVICE_ID M1575_IDNUM
+#define M1575_CONFIG_VENDOR_ID (0x10b9)
+#define M1575_CONFIG_SUBSYSTEM_ID M1575_IDNUM
+#define M1575_CONFIG_SUBSYSTEM_VENDOR_ID M1575_CONFIG_VENDOR_ID
+#define M1575_AUDIO_PCICFG_SPACE (0)
+#define M1575_AUDIO_IO_SPACE (1)
+#define M1575_AUDIO_MEM_SPACE (2)
+
+#define M1575_LOOP_CTR (100)
+
+/* Gain and attenuation shift values */
+#define M1575_GAIN_SHIFT3 (3)
+#define M1575_GAIN_SHIFT4 (4)
+#define M1575_BYTE_SHIFT (8)
+
+/* audio direction */
+#define M1575_PLAY (0)
+#define M1575_REC (1)
+
+#define M1575_DMA_PCM_IN (1)
+#define M1575_DMA_PCM_OUT (2)
+
+/* last AC97 saved register */
+#define M1575_LAST_AC_REG (0x3a)
+
+/* Restore audio flags */
+#define M1575_INIT_RESTORE (0)
+#define M1575_INIT_NO_RESTORE ~M1575_INIT_RESTORE
+
+/* AC97 codec shadow reg to index macro */
+#define M1575_CODEC_REG(r) ((r) >> 1)
+
+/* play and record sample buffer counts */
+#define M1575_PLAY_BUFS (2)
+#define M1575_PLAY_BUF_MSK (M1575_PLAY_BUFS - 1)
+#define M1575_REC_BUFS (4)
+#define M1575_REC_BUF_MSK (M1575_REC_BUFS - 1)
+
+/* Buffer Descriptor List defines */
+#define M1575_BD_NUMS (32)
+#define M1575_NUM_PORTS (2)
+#define M1575_MOD_SIZE (16)
+
+/* default buffer size */
+#define M1575_BSIZE (8*1024)
+#define M1575_MOD_SIZE (16)
+#define M1575_PLAY_BUF_SZ (1024)
+#define M1575_RECORD_BUF_SZ (1024)
+#define M1575_BUF_MIN (512)
+#define M1575_BUF_MAX (8192)
+
+/* kstat interrupt counter define */
+#define M1575_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+#define M1575_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+
+/* PCI CFG SPACE REGISTERS for Audio (Device 29, Function 0) */
+#define M1575_PCIPMR_REG 0x42 /* Power Capabilities 16 */
+#define M1575_PCIPMCSR_REG 0x44 /* Power Cmd & Status 16 */
+#define M1575_PCISCCR_REG 0x48 /* System Cfg Cntrl 16 */
+#define M1575_PCIAPMUCR1_REG 0x54 /* Add. PMU Cntrl Reg 8 */
+#define M1575_PCISCRR_REG 0x57 /* Scratch Reg 8 */
+#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
+#define M1575_PCIGCC_REG 0x59 /* Global Clk Control 16 */
+#define M1575_PCIACD_REG 0x5C /* AC97 Codec Detect 8 */
+#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
+#define M1575_PCIGCLK_REG 0x59 /* Misc Reg 8 */
+#define M1575_PCIMSICTRL_REG 0x62 /* MSI Control Reg 16 */
+#define M1575_PCIMSIADDR_REG 0x64 /* MSI Address Reg 32 */
+#define M1575_PCIMSIDATA_REG 0x68 /* MSI Data Reg 16 */
+#define M1575_PCIMSIMASK_REG 0x6C /* MSI Data Reg 32 */
+#define M1575_PCIMSIPEND_REG 0x70 /* MSI Pend Reg 32 */
+
+/* Bit definitions for PCI AC97 Clk detect Reg */
+#define M1575_PCIACD_CLKDET 0x01
+#define M1575_PCIMISC_INTENB 0x40
+#define M1575_PCIINT_LINE 0x05
+
+/* Base Line Audio I/O Memory Registers */
+#define M1575_SCR_REG 0x00 /* System Control Reg 32 */
+#define M1575_SSR_REG 0x04 /* System System Reg 32 */
+#define M1575_DMACR_REG 0x08 /* DMA Control Reg 32 */
+#define M1575_FIFOCR1_REG 0x0C /* FIFO 1 Control Reg 32 */
+#define M1575_INTFCR_REG 0x10 /* Interface Ctrl Reg 32 */
+#define M1575_INTRCR_REG 0x14 /* Interrupt Ctrl Reg 32 */
+#define M1575_INTRSR_REG 0x18 /* Interrupt Status Reg 32 */
+#define M1575_FIFOCR2_REG 0x1C /* FIFO 2 Control Reg 32 */
+#define M1575_CPR_REG 0x20 /* Cmd Port Reg 32 */
+#define M1575_SPR_REG 0x24 /* Status Port Reg 32 */
+#define M1575_FIFOCR3_REG 0x2C /* FIFO 3 Control Reg 32 */
+#define M1575_TTSR_REG 0x30 /* Tx Tag Slot Reg 32 */
+#define M1575_RTSR_REG 0x34 /* Rx Tag Slot Reg 32 */
+#define M1575_CSPSR_REG 0x38 /* CSP Status Reg 32 */
+#define M1575_CASR_REG 0x3C /* Codec Access Sem Reg 32 */
+
+/* PCM IN Registers */
+#define M1575_PCMIBDBAR_REG 0x40 /* 32 */
+#define M1575_PCMICIV_REG 0x44 /* 8 */
+#define M1575_PCMILVIV_REG 0x45 /* 8 */
+#define M1575_PCMISR_REG 0x46 /* 16 */
+#define M1575_PCMIPICB_REG 0x48 /* 16 */
+#define M1575_PCMICR_REG 0x4B /* 8 */
+
+/* PCM OUT Registers */
+#define M1575_PCMOBDBAR_REG 0x50 /* 32 */
+#define M1575_PCMOCIV_REG 0x54 /* 8 */
+#define M1575_PCMOLVIV_REG 0x55 /* 8 */
+#define M1575_PCMOSR_REG 0x56 /* 16 */
+#define M1575_PCMOPICB_REG 0x58 /* 16 */
+#define M1575_PCMOCR_REG 0x5B /* 8 */
+
+/* MIC In Registers */
+#define M1575_MICIBDBAR_REG 0x60 /* 32 */
+#define M1575_MICICIV_REG 0x64 /* 8 */
+#define M1575_MICILVIV_REG 0x65 /* 8 */
+#define M1575_MICISR_REG 0x66 /* 16 */
+#define M1575_MICIPICB_REG 0x68 /* 16 */
+#define M1575_MICICR_REG 0x6B /* 8 */
+
+/* SPIDOF Registers */
+#define M1575_CSPOBDBAR_REG 0x70 /* 32 */
+#define M1575_CSPOCIV_REG 0x74 /* 8 */
+#define M1575_CSPOLVIV_REG 0x75 /* 8 */
+#define M1575_CSPOSR_REG 0x76 /* 16 */
+#define M1575_CSPOPICB_REG 0x78 /* 16 */
+#define M1575_CSPOCR_REG 0x7B /* 8 */
+
+/* PCM IN2 Registers */
+#define M1575_PCMI2BDBAR_REG 0xd0 /* 32 */
+#define M1575_PCMI2CIV_REG 0xd4 /* 8 */
+#define M1575_PCMI2LVIV_REG 0xd5 /* 8 */
+#define M1575_PCMI2SR_REG 0xd6 /* 16 */
+#define M1575_PCMI2PICB_REG 0xd8 /* 16 */
+#define M1575_PCMI2CR_REG 0xdB /* 8 */
+
+/* MIC2 IN2 Registers */
+#define M1575_MICI2BDBAR_REG 0xe0 /* 32 */
+#define M1575_MICI2CIV_REG 0xe4 /* 8 */
+#define M1575_MICI2LVIV_REG 0xe5 /* 8 */
+#define M1575_MICI2SR_REG 0xe6 /* 16 */
+#define M1575_MICI2PICB_REG 0xe8 /* 16 */
+#define M1575_MICI2CR_REG 0xeB /* 8 */
+
+/* Bits of FIFO Control Register1 */
+#define M1575_FIFOCR1_CSPORST 0x80000000 /* SPDIF Out Reset */
+#define M1575_FIFOCR1_MICIRST 0x00800000 /* MIC In Reset */
+#define M1575_FIFOCR1_PCMORST 0x00008000 /* PCM Out Reset */
+#define M1575_FIFOCR1_PCMIRST 0x00000080 /* PCM In Reset */
+
+/* Bits of FIFO Control Register2 */
+#define M1575_FIFOCR2_SPORST 0x80000000 /* SPDIF Out FIFO Reset */
+#define M1575_FIFOCR2_SPIRST 0x00800000 /* SPDIF In FIFO Reset */
+#define M1575_FIFOCR2_LFEORST 0x00008000 /* LFE Out FIFO Reset */
+#define M1575_FIFOCR2_CENORST 0x00000080 /* CENTER Out Reset */
+
+/* Bits of FIFO Control Register3 */
+#define M1575_FIFOCR3_PCMI2RST 0x00800000 /* PCM In2 FIFO Reset */
+#define M1575_FIFOCR3_MICI2RST 0x00008000 /* MIC In2 FIFO Reset */
+#define M1575_FIFOCR3_I2SIRST 0x00000080 /* I2S In FIFO Reset */
+
+/* Bits of DMA Control Register */
+#define M1575_DMACR_PCMISTART 0x00000001
+#define M1575_DMACR_PCMOSTART 0x00000002
+#define M1575_DMACR_MICISTART 0x00000004
+#define M1575_DMACR_CSPOSTART 0x00000008
+#define M1575_DMACR_CENOSTART 0x00000010
+#define M1575_DMACR_LFEOSTART 0x00000020
+#define M1575_DMACR_SPISTART 0x00000040
+#define M1575_DMACR_SPOSTART 0x00000080
+#define M1575_DMACR_I2SISTART 0x00000100
+#define M1575_DMACR_PCMI2START 0x00000200
+#define M1575_DMACR_MICI2START 0x00000400
+#define M1575_DMACR_PCMIPAUSE 0x00010000
+#define M1575_DMACR_PCMOPAUSE 0x00020000
+#define M1575_DMACR_MICIPAUSE 0x00040000
+#define M1575_DMACR_CSPOPAUSE 0x00080000
+#define M1575_DMACR_CENOPAUSE 0x00100000
+#define M1575_DMACR_LFEOPAUSE 0x00200000
+#define M1575_DMACR_SPIPAUSE 0x00400000
+#define M1575_DMACR_SPOPAUSE 0x00800000
+#define M1575_DMACR_I2SIPAUSE 0x01000000
+#define M1575_DMACR_PCMI2PAUSE 0x02000000
+#define M1575_DMACR_MICI2PAUSE 0x04000000
+
+#define M1575_DMACR_PAUSE_ALL 0x07ff0000
+
+/* Bits of INTRSR Interrupt Status Register */
+#define M1575_INTRSR_GPIOINTR 0x0000002
+#define M1575_INTRSR_SPRINTR 0x0000020
+#define M1575_INTRSR_CPRINTR 0x0000080
+#define M1575_INTRSR_PCMIINTR 0x0010000
+#define M1575_INTRSR_PCMOINTR 0x0020000
+#define M1575_INTRSR_MICIINTR 0x0040000
+#define M1575_INTRSR_CSPOINTR 0x0080000
+#define M1575_INTRSR_CENOINTR 0x0100000
+#define M1575_INTRSR_LFEOINTR 0x0200000
+#define M1575_INTRSR_SPIINTR 0x0400000
+#define M1575_INTRSR_SPOINTR 0x0800000
+#define M1575_INTRSR_I2SIINTR 0x1000000
+#define M1575_INTRSR_PCMI2INTR 0x2000000
+#define M1575_INTRSR_MICI2INTR 0x4000000
+
+#define M1575_INTR_MASK (M1575_INTRSR_GPIOINTR |\
+ M1575_INTRSR_SPRINTR |\
+ M1575_INTRSR_CPRINTR |\
+ M1575_INTRSR_PCMIINTR |\
+ M1575_INTRSR_PCMOINTR |\
+ M1575_INTRSR_MICIINTR |\
+ M1575_INTRSR_CSPOINTR |\
+ M1575_INTRSR_CENOINTR |\
+ M1575_INTRSR_LFEOINTR |\
+ M1575_INTRSR_SPIINTR |\
+ M1575_INTRSR_SPOINTR |\
+ M1575_INTRSR_I2SIINTR |\
+ M1575_INTRSR_PCMI2INTR|\
+ M1575_INTRSR_MICI2INTR)
+
+#define M1575_UNUSED_INTR_MASK (M1575_INTRSR_GPIOINTR |\
+ M1575_INTRSR_SPRINTR |\
+ M1575_INTRSR_CPRINTR |\
+ M1575_INTRSR_MICIINTR |\
+ M1575_INTRSR_CSPOINTR |\
+ M1575_INTRSR_CENOINTR |\
+ M1575_INTRSR_LFEOINTR |\
+ M1575_INTRSR_SPIINTR |\
+ M1575_INTRSR_SPOINTR |\
+ M1575_INTRSR_I2SIINTR |\
+ M1575_INTRSR_PCMI2INTR|\
+ M1575_INTRSR_MICI2INTR)
+
+/* Defines a generic clear for all MIC and PCM Status Registers */
+#define M1575_SR_CLR 0x001e
+#define M1575_SR_DMACS 0x0001
+
+/* Defines a generic RESET for all MIC and PCM Control Registers */
+#define M1575_CR_IOCE 0x10
+#define M1575_CR_RR 0x02
+
+/* Bits of PCM In Status Register */
+#define M1575_PCMISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_PCMISR_CELV 0x02
+#define M1575_PCMISR_LVBCI 0x04
+#define M1575_PCMISR_BCIS 0x08
+#define M1575_PCMISR_FIFOE 0x10
+
+/* Bits in PCM In Control Register */
+#define M1575_PCMICR_RR 0x02 /* Reset */
+#define M1575_PCMICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_PCMICR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits of PCM Out Status Register */
+#define M1575_PCMOSR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_PCMOSR_CELV 0x02
+#define M1575_PCMOSR_LVBCI 0x04
+#define M1575_PCMOSR_BCIS 0x08
+#define M1575_PCMOSR_FIFOE 0x10
+
+/* Bits in PCM Out Control Register */
+#define M1575_PCMOCR_RR 0x02 /* Reset */
+#define M1575_PCMOCR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_PCMOCR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits of MIC In Status Register */
+#define M1575_MICISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_MICISR_CELV 0x02
+#define M1575_MICISR_LVBCI 0x04
+#define M1575_MICISR_BCIS 0x08
+#define M1575_MICISR_FIFOE 0x10
+
+/* Bits in PCM In Control Register */
+#define M1575_MICICR_RR 0x02 /* Reset */
+#define M1575_MICICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_MICICR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits in System Control Register */
+#define M1575_SCR_WARMRST 0x00000001
+#define M1575_SCR_COLDRST 0x00000002
+#define M1575_SCR_DRENT 0x40000000
+#define M1575_SCR_MSTRST 0x80000000
+
+/* Bits in System Status Register */
+#define M1575_SSR_RSTBLK 0x00000002
+#define M1575_SSR_FACCS_MSK 0x00000018
+#define M1575_SSR_SCID 0x00000040
+
+/* Bits in Command Port Register */
+#define M1575_CPR_ACSCS 0x0100 /* Audio Codec for cmd 1=codec 2 */
+#define M1575_CPR_READ 0x0080
+
+/* Bits in Cmd Status Port Register */
+#define M1575_CSPSR_SUCC 0x08 /* cmd successful */
+#define M1575_CSPSR_RDRDY 0x02 /* ready for read cmd */
+#define M1575_CSPSR_WRRDY 0x01 /* ready for write cmd */
+#define M1575_PCMI2CR_RR 0x02 /* Reset */
+#define M1575_MICI2CR_RR 0x02 /* Reset */
+#define M1575_CSPOCR_RR 0x02 /* Reset */
+
+/* Bits in Interface Control Register */
+#define M1575_INTFCR_RSTREL 0x02000000
+#define M1575_INTFCR_RSTBLK 0x00200000
+#define M1575_INTFCR_MICENB 0x00100000
+#define M1575_INTFCR_PCMIENB 0x00080000
+#define M1575_INTFCR_MICI2ENB 0x00040000
+#define M1575_INTFCR_PCMI2ENB 0x00020000
+#define M1575_INTFCR_MICI2SEL 0x00008000
+#define M1575_INTFCR_MICISEL 0x00004000
+#define M1575_INTFCR_PCMOENB 0x00000002
+
+#define M1575_INTRCR_CPRINTR 0x00000080
+#define M1575_INTRCR_SPRINTR 0x00000020
+#define M1575_INTRCR_GPIOINTR 0x00000002
+
+/* Bits of Recv Tag Slot Register */
+#define M1575_RTSR_SACRDY 0x20u /* 2nd Audio Codec Rdy */
+#define M1575_RTSR_FACRDY 0x80u /* 1st Audio Codec Rdy */
+
+/* Semaphore busy */
+#define M1575_CASR_SEMBSY 0x80000000
+
+/*
+ * buffer descripter list entry, see M1575 datasheet
+ */
+#define IOC 0x8000
+#define BUP 0x4000
+
+struct m1575_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t buf_len; /* the number of samples */
+ uint16_t buf_cmd;
+};
+typedef struct m1575_bd_entry m1575_bd_entry_t;
+
+struct audio1575_port {
+ struct audio1575_state *statep;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ int num;
+ unsigned intrs;
+ unsigned fragfr;
+ uint64_t count;
+ uint8_t nchan;
+
+ uint8_t civ;
+ uint16_t picb;
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audio1575_port audio1575_port_t;
+
+
+/*
+ * audio1575_state_t per instance state and operation data
+ */
+struct audio1575_state {
+ kmutex_t lock; /* intr mutex */
+ kmutex_t ac_lock; /* ac'97 mutex */
+ dev_info_t *dip; /* dev instance ptr */
+ audio_dev_t *adev; /* audio handle */
+ ac97_t *ac97; /* ac'97 handle */
+ audio1575_port_t *ports[2]; /* DMA engines */
+
+ ddi_intr_handle_t ih; /* intr handle */
+
+ ddi_acc_handle_t pcih; /* pci config space */
+
+ ddi_acc_handle_t regsh; /* audio i/o regs */
+ caddr_t regsp; /* base of i/o regs */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ boolean_t suspended; /* if DDI_SUSPENDed */
+};
+typedef struct audio1575_state audio1575_state_t;
+
+/* audio i/o register macros */
+#define GET8(reg) \
+ ddi_get8(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define GET16(reg) \
+ ddi_get16(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define GET32(reg) \
+ ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define PUT8(reg, val) \
+ ddi_put8(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define PUT16(reg, val) \
+ ddi_put16(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define PUT32(reg, val) \
+ ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define SET8(reg, bit) PUT8(reg, GET8(reg) | (bit))
+#define SET16(reg, bit) PUT16(reg, GET16(reg) | (bit))
+#define SET32(reg, bit) PUT32(reg, GET32(reg) | (bit))
+#define CLR8(reg, bit) PUT8(reg, GET8(reg) & ~(bit))
+#define CLR16(reg, bit) PUT16(reg, GET16(reg) & ~(bit))
+#define CLR32(reg, bit) PUT32(reg, GET32(reg) & ~(bit))
+
+
+#endif /* AUDIO1575_H */
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.c b/usr/src/uts/common/io/audio/drv/audio810/audio810.c
new file mode 100644
index 0000000000..9d186df9e0
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.c
@@ -0,0 +1,1971 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audio810 Audio Driver
+ *
+ * The driver is primarily targeted at providing audio support for the
+ * W1100z and W2100z systems, which use the AMD 8111 audio core and
+ * the Realtek ALC 655 codec. The ALC 655 chip supports only fixed 48k
+ * sample rate. However, the audio core of AMD 8111 is completely
+ * compatible to the Intel ICHx chips (Intel 8x0 chipsets), so the
+ * driver can work for the ICHx. We only support the 48k maximum
+ * rate, since we only have a single PCM out channel.
+ *
+ * The AMD 8111 audio core, as an AC'97 controller, has independent
+ * channels for PCM in, PCM out, mic in, modem in, and modem out.
+ * The AC'97 controller is a PCI bus master with scatter/gather
+ * support. Each channel has a DMA engine. Currently, we use only
+ * the PCM in and PCM out channels. Each DMA engine uses one buffer
+ * descriptor list. And the buffer descriptor list is an array of up
+ * to 32 entries, each of which describes a data buffer. Each entry
+ * contains a pointer to a data buffer, control bits, and the length
+ * of the buffer being pointed to, where the length is expressed as
+ * the number of samples. This, combined with the 16-bit sample size,
+ * gives the actual physical length of the buffer.
+ *
+ * A workaround for the AD1980 and AD1985 codec:
+ * Most vendors connect the surr-out of the codecs to the line-out jack.
+ * So far we haven't found which vendors don't do that. So we assume that
+ * all vendors swap the surr-out and the line-out outputs. So we need swap
+ * the two outputs. But we still internally process the
+ * "ad198x-swap-output" property. If someday some vendors do not swap the
+ * outputs, we would set "ad198x-swap-output = 0" in the
+ * /kernel/drv/audio810.conf file, and unload and reload the audio810
+ * driver (or reboot).
+ *
+ * NOTE:
+ * This driver depends on the drv/audio and misc/ac97
+ * modules being loaded first.
+ */
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audio810.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audio810_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audio810_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audio810_ddi_quiesce(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audio810_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audio810_close(void *);
+static int audio810_start(void *);
+static void audio810_stop(void *);
+static int audio810_format(void *);
+static int audio810_channels(void *);
+static int audio810_rate(void *);
+static uint64_t audio810_count(void *);
+static void audio810_sync(void *, unsigned);
+static size_t audio810_qlen(void *);
+
+static audio_engine_ops_t audio810_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audio810_open,
+ audio810_close,
+ audio810_start,
+ audio810_stop,
+ audio810_count,
+ audio810_format,
+ audio810_channels,
+ audio810_rate,
+ audio810_sync,
+ audio810_qlen
+};
+
+/*
+ * interrupt handler
+ */
+static uint_t audio810_intr(caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audio810_attach(dev_info_t *);
+static int audio810_resume(dev_info_t *);
+static int audio810_detach(dev_info_t *);
+static int audio810_suspend(dev_info_t *);
+
+static int audio810_alloc_port(audio810_state_t *, int, uint8_t);
+static void audio810_start_port(audio810_port_t *);
+static void audio810_stop_port(audio810_port_t *);
+static void audio810_reset_port(audio810_port_t *);
+static void audio810_update_port(audio810_port_t *);
+static int audio810_codec_sync(audio810_state_t *);
+static void audio810_write_ac97(void *, uint8_t, uint16_t);
+static uint16_t audio810_read_ac97(void *, uint8_t);
+static int audio810_map_regs(dev_info_t *, audio810_state_t *);
+static void audio810_unmap_regs(audio810_state_t *);
+static void audio810_stop_dma(audio810_state_t *);
+static int audio810_chip_init(audio810_state_t *);
+static void audio810_destroy(audio810_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
+static char *audio810_name = I810_NAME;
+
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audio810_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audio810_ddi_attach, /* devo_attach */
+ audio810_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audio810_ddi_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audio810_modldrv = {
+ &mod_driverops, /* drv_modops */
+ I810_MOD_NAME, /* drv_linkinfo */
+ &audio810_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audio810_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audio810_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0000ffff, /* count_max */
+ 8, /* align, BDL must be aligned on a 8-byte boundary */
+ 0x3c, /* burstsize */
+ 8, /* minxfer, set to the size of a BDlist entry */
+ 0x0000ffff, /* maxxfer */
+ 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
+ 1, /* sgllen, there's no scatter-gather list */
+ 8, /* granular, set to the value of minxfer */
+ 0 /* flags, use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0001ffff, /* count_max */
+ 4, /* align, data buffer is aligned on a 4-byte boundary */
+ 0x3c, /* burstsize */
+ 4, /* minxfer, set to the size of a sample data */
+ 0x0001ffff, /* maxxfer */
+ 0x0001ffff, /* seg */
+ 1, /* sgllen, no scatter-gather */
+ 4, /* granular, set to the value of minxfer */
+ 0, /* flags, use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audio810_dev_ops, I810_NAME);
+
+ if ((error = mod_install(&audio810_modlinkage)) != 0) {
+ audio_fini_ops(&audio810_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audio810_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* clean up ops */
+ audio_fini_ops(&audio810_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audio810_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audio810_ddi_attach()
+ *
+ * Description:
+ * Implements the DDI attach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio810_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audio810_attach(dip));
+
+ case DDI_RESUME:
+ return (audio810_resume(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_ddi_detach()
+ *
+ * Description:
+ * Implements the detach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio810_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audio810_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audio810_suspend(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_ddi_quiesce()
+ *
+ * Description:
+ * Implements the quiesce(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was quiesced
+ * DDI_FAILURE The driver couldn't be quiesced
+ */
+static int
+audio810_ddi_quiesce(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ if ((statep = ddi_get_driver_private(dip)) == NULL)
+ return (DDI_FAILURE);
+
+ audio810_stop_dma(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * Each of buffer descriptor has a field IOC(interrupt on completion)
+ * When both this and the IOC bit of correspondent dma control register
+ * is set, it means that the controller should issue an interrupt upon
+ * completion of this buffer.
+ * (AMD 8111 hypertransport I/O hub data sheet. 3.8.3 page 71)
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audio810_intr(caddr_t arg)
+{
+ audio810_state_t *statep;
+ uint16_t gsr;
+
+ statep = (void *)arg;
+ mutex_enter(&statep->inst_lock);
+
+ if (statep->suspended) {
+ mutex_exit(&statep->inst_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ gsr = I810_BM_GET32(I810_REG_GSR);
+
+ /* check if device is interrupting */
+ if ((gsr & I810_GSR_USE_INTR) == 0) {
+ mutex_exit(&statep->inst_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ for (int pnum = 0; pnum < I810_NUM_PORTS; pnum++) {
+ audio810_port_t *port;
+ uint8_t regoff, index;
+
+ port = statep->ports[pnum];
+ if (port == NULL) {
+ continue;
+ }
+ regoff = port->regoff;
+
+ if (!(I810_BM_GET8(port->stsoff) & I810_BM_SR_BCIS))
+ continue;
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = I810_BM_GET8(regoff + I810_OFFSET_CIV);
+ index = (index - 1) % I810_BD_NUMS;
+
+ I810_BM_PUT8(regoff + I810_OFFSET_LVI, index);
+
+ /* clear any interrupt */
+ I810_BM_PUT8(port->stsoff,
+ I810_BM_SR_LVBCI | I810_BM_SR_BCIS | I810_BM_SR_FIFOE);
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->ksp) {
+ I810_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&statep->inst_lock);
+
+ /* notify the framework */
+ if (gsr & I810_GSR_INTR_PIN) {
+ audio_engine_produce(statep->ports[I810_PCM_IN]->engine);
+ }
+ if (gsr & I810_GSR_INTR_POUT) {
+ audio_engine_consume(statep->ports[I810_PCM_OUT]->engine);
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * audio810_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audio810_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audio810_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrag;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->inst_lock);
+ audio810_reset_port(port);
+ mutex_exit(&port->statep->inst_lock);
+
+ return (0);
+}
+
+/*
+ * audio810_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audio810_close(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ audio810_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audio810_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audio810_stop(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (port->started) {
+ audio810_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audio810_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audio810_start(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (!port->started) {
+ audio810_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->inst_lock);
+ return (0);
+}
+
+/*
+ * audio810_format()
+ *
+ * Description:
+ * This is called by the framework to query the format of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Format of the device (fixed at AUDIO_FORMAT_S16_LE)
+ */
+static int
+audio810_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audio810_channels()
+ *
+ * Description:
+ * This is called by the framework to query the num channels of
+ * the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 0 number of channels for device
+ */
+static int
+audio810_channels(void *arg)
+{
+ audio810_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audio810_rate()
+ *
+ * Description:
+ * This is called by the framework to query the rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Rate of device (fixed at 48000 Hz)
+ */
+static int
+audio810_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audio810_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audio810_count(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+ uint64_t val;
+ uint16_t picb;
+ uint64_t count;
+ uint8_t nchan;
+
+ mutex_enter(&statep->inst_lock);
+ audio810_update_port(port);
+ count = port->count;
+ picb = port->picb;
+ nchan = port->nchan;
+ mutex_exit(&statep->inst_lock);
+
+ if (statep->quirk == QUIRK_SIS7012) {
+ val = count + picb / (2 * nchan);
+ } else {
+ val = count + (picb / nchan);
+ }
+
+ return (val);
+}
+
+/*
+ * audio810_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audio810_sync(void *arg, unsigned nframes)
+{
+ audio810_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audio810_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audio810_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audio810_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to start.
+ */
+static void
+audio810_start_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t cr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR);
+ cr |= I810_BM_CR_IOCE;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+ cr |= I810_BM_CR_RUN;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+}
+
+/*
+ * audio810_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to stop.
+ */
+static void
+audio810_stop_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t cr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR);
+ cr &= ~I810_BM_CR_RUN;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+}
+
+/*
+ * audio810_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to reset.
+ */
+static void
+audio810_reset_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint32_t gcr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ port->civ = 0;
+ port->picb = 0;
+
+ if (statep->suspended)
+ return;
+
+ /*
+ * Make sure we put once in stereo, to ensure we always start from
+ * front left.
+ */
+ if (port->num == I810_PCM_OUT) {
+
+ if (statep->quirk == QUIRK_SIS7012) {
+ /*
+ * SiS 7012 needs its own special multichannel config.
+ */
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ gcr &= ~I810_GCR_SIS_CHANNELS_MASK;
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ switch (statep->maxch) {
+ case 2:
+ gcr |= I810_GCR_SIS_2_CHANNELS;
+ break;
+ case 4:
+ gcr |= I810_GCR_SIS_4_CHANNELS;
+ break;
+ case 6:
+ gcr |= I810_GCR_SIS_6_CHANNELS;
+ break;
+ }
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ /*
+ * SiS 7012 has special unmute bit.
+ */
+ I810_BM_PUT8(I810_REG_SISCTL, I810_SISCTL_UNMUTE);
+
+ } else {
+
+ /*
+ * All other devices work the same.
+ */
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ gcr &= ~I810_GCR_CHANNELS_MASK;
+
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ switch (statep->maxch) {
+ case 2:
+ gcr |= I810_GCR_2_CHANNELS;
+ break;
+ case 4:
+ gcr |= I810_GCR_4_CHANNELS;
+ break;
+ case 6:
+ gcr |= I810_GCR_6_CHANNELS;
+ break;
+ }
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+ }
+ }
+
+ /*
+ * Perform full reset of the engine, but leave it turned off.
+ */
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, 0);
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, I810_BM_CR_RST);
+
+ /* program the offset of the BD list */
+ I810_BM_PUT32(port->regoff + I810_OFFSET_BD_BASE, port->bdl_paddr);
+
+ /* we set the last index to the full count -- all buffers are valid */
+ I810_BM_PUT8(port->regoff + I810_OFFSET_LVI, I810_BD_NUMS - 1);
+}
+
+/*
+ * audio810_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audio810_port_t *port The port to update.
+ */
+static void
+audio810_update_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t regoff = port->regoff;
+ uint8_t civ;
+ uint16_t picb;
+ unsigned n;
+
+ if (statep->suspended) {
+ civ = 0;
+ picb = 0;
+ } else {
+ /*
+ * We read the position counters, but we're careful to avoid
+ * the situation where the position counter resets at the end
+ * of a buffer.
+ */
+ for (int i = 0; i < 2; i++) {
+ civ = I810_BM_GET8(regoff + I810_OFFSET_CIV);
+ picb = I810_BM_GET16(port->picboff);
+ if (I810_BM_GET8(regoff + I810_OFFSET_CIV) == civ) {
+ /*
+ * Chip did not start a new index,
+ * so the picb is valid.
+ */
+ break;
+ }
+ }
+
+ if (civ >= port->civ) {
+ n = civ - port->civ;
+ } else {
+ n = civ + (I810_BD_NUMS - port->civ);
+ }
+ port->count += (n * port->fragfr);
+ }
+ port->civ = civ;
+ port->picb = picb;
+}
+
+/*
+ * audio810_attach()
+ *
+ * Description:
+ * Attach an instance of the audio810 driver. This routine does the
+ * device dependent attach tasks, and registers with the audio framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio810_attach(dev_info_t *dip)
+{
+ uint16_t cmdreg;
+ audio810_state_t *statep;
+ audio_dev_t *adev;
+ ddi_acc_handle_t pcih;
+ uint32_t devid;
+ uint32_t gsr;
+ const char *name;
+ const char *vers;
+ uint8_t nch;
+ int maxch;
+
+ /* we don't support high level interrupts in the driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN, "!%s: unsupported high level interrupt",
+ audio810_name);
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
+
+ /* get iblock cookie information */
+ if (ddi_get_iblock_cookie(dip, 0, &statep->iblock) != DDI_SUCCESS) {
+ cmn_err(CE_WARN, "!%s: cannot get iblock cookie",
+ audio810_name);
+ kmem_free(statep, sizeof (*statep));
+ return (DDI_FAILURE);
+ }
+ mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->iblock);
+ mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, statep->iblock);
+
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "!%s: unable to allocate audio dev",
+ audio810_name);
+ goto error;
+ }
+ statep->adev = adev;
+ statep->dip = dip;
+
+ /* map in the registers, allocate DMA buffers, etc. */
+ if (audio810_map_regs(dip, statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ /* set PCI command register */
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "pci conf mapping failed");
+ goto error;
+ }
+ cmdreg = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_config_put16(pcih, PCI_CONF_COMM,
+ cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ devid = pci_config_get16(pcih, PCI_CONF_VENID);
+ devid <<= 16;
+ devid |= pci_config_get16(pcih, PCI_CONF_DEVID);
+ pci_config_teardown(&pcih);
+
+ /*
+ * Override "max-channels" property to prevent configuration
+ * of 4 or 6 (or possibly even 8!) channel audio. The default
+ * is to support as many channels as the hardware can do.
+ *
+ * (Hmmm... perhaps this should be driven in the common
+ * framework. The framework could even offer simplistic upmix
+ * and downmix for various standard configs.)
+ */
+ maxch = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "max-channels", 8);
+ if (maxch < 2) {
+ maxch = 2;
+ }
+
+ gsr = I810_BM_GET32(I810_REG_GSR);
+ if (gsr & I810_GSR_CAP6CH) {
+ nch = 6;
+ } else if (gsr & I810_GSR_CAP4CH) {
+ nch = 4;
+ } else {
+ nch = 2;
+ }
+
+ statep->maxch = (uint8_t)min(nch, maxch);
+ statep->maxch &= ~1;
+ name = "Unknown AC'97";
+ vers = "";
+
+ statep->quirk = QUIRK_NONE;
+ switch (devid) {
+ case 0x80862415:
+ name = "Intel AC'97";
+ vers = "ICH";
+ break;
+ case 0x80862425:
+ name = "Intel AC'97";
+ vers = "ICH0";
+ break;
+ case 0x80867195:
+ name = "Intel AC'97";
+ vers = "440MX";
+ break;
+ case 0x80862445:
+ name = "Intel AC'97";
+ vers = "ICH2";
+ break;
+ case 0x80862485:
+ name = "Intel AC'97";
+ vers = "ICH3";
+ break;
+ case 0x808624C5:
+ name = "Intel AC'97";
+ vers = "ICH4";
+ break;
+ case 0x808624D5:
+ name = "Intel AC'97";
+ vers = "ICH5";
+ break;
+ case 0x8086266E:
+ name = "Intel AC'97";
+ vers = "ICH6";
+ break;
+ case 0x808627DE:
+ name = "Intel AC'97";
+ vers = "ICH7";
+ break;
+ case 0x808625A6:
+ name = "Intel AC'97";
+ vers = "6300ESB";
+ break;
+ case 0x80862698:
+ name = "Intel AC'97";
+ vers = "ESB2";
+ break;
+ case 0x10397012:
+ name = "SiS AC'97";
+ vers = "7012";
+ statep->quirk = QUIRK_SIS7012;
+ break;
+ case 0x10de01b1: /* nForce */
+ name = "NVIDIA AC'97";
+ vers = "MCP1";
+ break;
+ case 0x10de006a: /* nForce 2 */
+ name = "NVIDIA AC'97";
+ vers = "MCP2";
+ break;
+ case 0x10de00da: /* nForce 3 */
+ name = "NVIDIA AC'97";
+ vers = "MCP3";
+ break;
+ case 0x10de00ea:
+ name = "NVIDIA AC'97";
+ vers = "CK8S";
+ break;
+ case 0x10de0059:
+ name = "NVIDIA AC'97";
+ vers = "CK804";
+ break;
+ case 0x10de008a:
+ name = "NVIDIA AC'97";
+ vers = "CK8";
+ break;
+ case 0x10de003a: /* nForce 4 */
+ name = "NVIDIA AC'97";
+ vers = "MCP4";
+ break;
+ case 0x10de026b:
+ name = "NVIDIA AC'97";
+ vers = "MCP51";
+ break;
+ case 0x1022746d:
+ name = "AMD AC'97";
+ vers = "8111";
+ break;
+ case 0x10227445:
+ name = "AMD AC'97";
+ vers = "AMD768";
+ break;
+ }
+ /* set device information */
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, vers);
+
+ /* allocate port structures */
+ if ((audio810_alloc_port(statep, I810_PCM_OUT, statep->maxch) !=
+ DDI_SUCCESS) ||
+ (audio810_alloc_port(statep, I810_PCM_IN, 2) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ /* allocate ac97 handle */
+ statep->ac97 = ac97_alloc(dip, audio810_read_ac97, audio810_write_ac97,
+ statep);
+ if (statep->ac97 == NULL) {
+ audio_dev_warn(adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ /* initialize audio controller and AC97 codec */
+ if (audio810_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to init chip");
+ goto error;
+ }
+
+ /* initialize the AC'97 part */
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(I810_NAME, ddi_get_instance(dip),
+ I810_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, &statep->iblock,
+ NULL, audio810_intr, (caddr_t)statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "bad interrupt specification");
+ goto error;
+ }
+ statep->intr_added = B_TRUE;
+
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audio810_destroy(statep);
+
+ return (DDI_FAILURE);
+}
+
+
+/*
+ * audio810_resume()
+ *
+ * Description:
+ * Resume operation of the device after sleeping or hibernating.
+ * Note that this should never fail, even if hardware goes wonky,
+ * because the current PM framework will panic if it does.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was resumed.
+ */
+static int
+audio810_resume(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+ audio_dev_t *adev;
+
+ /* this should always be valid */
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+
+ ASSERT(statep != NULL);
+ ASSERT(dip == statep->dip);
+
+ /* Restore the audio810 chip's state */
+ if (audio810_chip_init(statep) != DDI_SUCCESS) {
+ /*
+ * Note that PM gurus say we should return
+ * success here. Failure of audio shouldn't
+ * be considered FATAL to the system. The
+ * upshot is that audio will not progress.
+ */
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ /* allow ac97 operations again */
+ ac97_resume(statep->ac97);
+
+ mutex_enter(&statep->inst_lock);
+
+ ASSERT(statep->suspended);
+ statep->suspended = B_FALSE;
+
+ for (int i = 0; i < I810_NUM_PORTS; i++) {
+
+ audio810_port_t *port = statep->ports[i];
+
+ if (port != NULL) {
+ /* reset framework DMA engine buffer */
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+
+ /* reset and initialize hardware ports */
+ audio810_reset_port(port);
+ if (port->started) {
+ audio810_start_port(port);
+ } else {
+ audio810_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&statep->inst_lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_detach()
+ *
+ * Description:
+ * Detach an instance of the audio810 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio810_detach(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ /* don't detach us if we are still in use */
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio810_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_suspend()
+ *
+ * Description:
+ * Suspend an instance of the audio810 driver, in preparation for
+ * sleep or hibernation.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was suspended
+ */
+static int
+audio810_suspend(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ ac97_suspend(statep->ac97);
+
+ mutex_enter(&statep->inst_lock);
+
+ ASSERT(statep->suspended == B_FALSE);
+
+ statep->suspended = B_TRUE; /* stop new ops */
+
+ /* stop DMA engines */
+ audio810_stop_dma(statep);
+
+ mutex_exit(&statep->inst_lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio810_alloc_port(audio810_state_t *statep, int num, uint8_t nchan)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ char *nfprop;
+ audio_dev_t *adev;
+ audio810_port_t *port;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+ i810_bd_entry_t *bdentry;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ statep->ports[num] = port;
+ port->statep = statep;
+ port->started = B_FALSE;
+ port->nchan = nchan;
+ port->num = num;
+
+ switch (num) {
+ case I810_PCM_IN:
+ prop = "record-interrupts";
+ nfprop = "record-fragments";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->regoff = I810_BASE_PCM_IN;
+ break;
+ case I810_PCM_OUT:
+ prop = "play-interrupts";
+ nfprop = "play-fragments";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ port->regoff = I810_BASE_PCM_OUT;
+ break;
+ default:
+ audio_dev_warn(adev, "bad port number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * SiS 7012 swaps status and picb registers.
+ */
+ if (statep->quirk == QUIRK_SIS7012) {
+ port->stsoff = port->regoff + I810_OFFSET_PICB;
+ port->picboff = port->regoff + I810_OFFSET_SR;
+ } else {
+ port->stsoff = port->regoff + I810_OFFSET_SR;
+ port->picboff = port->regoff + I810_OFFSET_PICB;
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, I810_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < I810_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, I810_INTS);
+ port->intrs = I810_INTS;
+ } else if (port->intrs > I810_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, I810_INTS);
+ port->intrs = I810_INTS;
+ }
+
+ port->nfrag = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, nfprop, I810_NFRAGS);
+
+ /*
+ * Note that fragments must divide evenly into I810_BD_NUMS (32).
+ */
+ if (port->nfrag <= 4) {
+ port->nfrag = 4;
+ } else if (port->nfrag <= 8) {
+ port->nfrag = 8;
+ } else if (port->nfrag <= 16) {
+ port->nfrag = 16;
+ } else {
+ port->nfrag = I810_BD_NUMS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 32 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a shorter BD list.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = I810_ROUNDUP(port->fragfr, I810_MOD_SIZE);
+ port->fragsz = port->fragfr * port->nchan * 2;
+ port->samp_size = port->fragsz * port->nfrag;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc (%d) failed: %d",
+ port->samp_size, rc);
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (i810_bd_entry_t) * I810_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ /*
+ * Wire up the BD list.
+ */
+ paddr = port->samp_paddr;
+ bdentry = (void *)port->bdl_kaddr;
+ for (int i = 0; i < I810_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, &bdentry->buf_base, paddr);
+ /*
+ * SiS 7012 counts samples in bytes, all other count
+ * in words.
+ */
+ ddi_put16(port->bdl_acch, &bdentry->buf_len,
+ statep->quirk == QUIRK_SIS7012 ? port->fragsz :
+ port->fragsz / 2);
+ ddi_put16(port->bdl_acch, &bdentry->buf_cmd,
+ BUF_CMD_IOC | BUF_CMD_BUP);
+ paddr += port->fragsz;
+ if ((i % port->nfrag) == (port->nfrag - 1)) {
+ /* handle wrap */
+ paddr = port->samp_paddr;
+ }
+ bdentry++;
+ }
+ (void) ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ port->engine = audio_engine_alloc(&audio810_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audio810_port_t *port The port structure for a DMA engine.
+ */
+static void
+audio810_free_port(audio810_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audio810_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio810_map_regs(dev_info_t *dip, audio810_state_t *statep)
+{
+ uint_t nregs = 0;
+ int *regs_list;
+ int i;
+ int pciBar1 = 0;
+ int pciBar2 = 0;
+ int pciBar3 = 0;
+ int pciBar4 = 0;
+
+ /* check the "reg" property to get the length of memory-mapped I/O */
+ if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "reg", (int **)&regs_list, &nregs) != DDI_PROP_SUCCESS) {
+ audio_dev_warn(statep->adev, "inquire regs property failed");
+ goto error;
+ }
+ /*
+ * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10
+ * and 0x14 BAR separately for native audio mixer BAR and native bus
+ * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5,
+ * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for
+ * higher performance access to the controller register. All features
+ * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14
+ * BAR) capabilities obsolete. However, these controller maintain the
+ * I/O BAR capability to allow for the reuse of legacy code maintaining
+ * backward compatibility. The I/O BAR is disabled unless system BIOS
+ * enables the simultaneous backward compatible capability on the 0x41
+ * register.
+ *
+ * When I/O BAR is enabled, the value of "reg" property should be like
+ * this,
+ * phys_hi phys_mid phys_lo size_hi size_lo
+ * --------------------------------------------------------
+ * 0000fd00 00000000 00000000 00000000 00000000
+ * 0100fd10 00000000 00000000 00000000 00000100
+ * 0100fd14 00000000 00000000 00000000 00000040
+ * 0200fd18 00000000 00000000 00000000 00000200
+ * 0200fd1c 00000000 00000000 00000000 00000100
+ *
+ * When I/O BAR is disabled, the "reg" property of the device node does
+ * not consist of the description for the I/O BAR. The following example
+ * illustrates the vaule of "reg" property,
+ *
+ * phys_hi phys_mid phys_lo size_hi size_lo
+ * --------------------------------------------------------
+ * 0000fd00 00000000 00000000 00000000 00000000
+ * 0200fd18 00000000 00000000 00000000 00000200
+ * 0200fd1c 00000000 00000000 00000000 00000100
+ *
+ * If the hardware has memory-mapped I/O access, first try to use
+ * this facility, otherwise we will try I/O access.
+ */
+ for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) {
+ switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) {
+ case 0x10:
+ pciBar1 = i;
+ break;
+ case 0x14:
+ pciBar2 = i;
+ break;
+ case 0x18:
+ pciBar3 = i;
+ break;
+ case 0x1c:
+ pciBar4 = i;
+ break;
+ default: /* we don't care others */
+ break;
+ }
+ }
+
+ if ((pciBar3 != 0) && (pciBar4 != 0)) {
+ /* map audio mixer registers */
+ if ((ddi_regs_map_setup(dip, pciBar3, &statep->am_regs_base, 0,
+ 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "memory am mapping failed");
+ goto error;
+ }
+
+ /* map bus master register */
+ if ((ddi_regs_map_setup(dip, pciBar4, &statep->bm_regs_base, 0,
+ 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "memory bm mapping failed");
+ goto error;
+ }
+
+ } else if ((pciBar1 != 0) && (pciBar2 != 0)) {
+ /* map audio mixer registers */
+ if ((ddi_regs_map_setup(dip, pciBar1, &statep->am_regs_base, 0,
+ 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "I/O am mapping failed");
+ goto error;
+ }
+
+ /* map bus master register */
+ if ((ddi_regs_map_setup(dip, pciBar2, &statep->bm_regs_base, 0,
+ 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "I/O bm mapping failed");
+ goto error;
+ }
+ } else {
+ audio_dev_warn(statep->adev, "map_regs() pci BAR error");
+ goto error;
+ }
+
+ ddi_prop_free(regs_list);
+
+ return (DDI_SUCCESS);
+
+error:
+ if (nregs > 0) {
+ ddi_prop_free(regs_list);
+ }
+ audio810_unmap_regs(statep);
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ */
+static void
+audio810_unmap_regs(audio810_state_t *statep)
+{
+ if (statep->bm_regs_handle) {
+ ddi_regs_map_free(&statep->bm_regs_handle);
+ }
+
+ if (statep->am_regs_handle) {
+ ddi_regs_map_free(&statep->am_regs_handle);
+ }
+}
+
+/*
+ * audio810_chip_init()
+ *
+ * Description:
+ * This routine initializes the AMD 8111 audio controller.
+ * codec.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audio810_chip_init(audio810_state_t *statep)
+{
+ uint32_t gcr;
+ uint32_t gsr;
+ uint32_t codec_ready;
+ int loop;
+ clock_t ticks;
+
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ ticks = drv_usectohz(100);
+
+ /*
+ * Clear the channels bits for now. We'll set them later in
+ * reset port.
+ */
+ if (statep->quirk == QUIRK_SIS7012) {
+ gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_SIS_CHANNELS_MASK);
+ } else {
+ gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK);
+ }
+
+ /*
+ * Datasheet(ICH5, document number of Intel: 252751-001):
+ * 3.6.5.5(page 37)
+ * if reset bit(bit1) is "0", driver must set it
+ * to "1" to de-assert the AC_RESET# signal in AC
+ * link, thus completing a cold reset. But if the
+ * bit is "1", then a warm reset is required.
+ */
+ gcr |= (gcr & I810_GCR_COLD_RST) == 0 ?
+ I810_GCR_COLD_RST:I810_GCR_WARM_RST;
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+
+ /* according AC'97 spec, wait for codec reset */
+ for (loop = 6000; --loop >= 0; ) {
+ delay(ticks);
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ if ((gcr & I810_GCR_WARM_RST) == 0) {
+ break;
+ }
+ }
+
+ /* codec reset failed */
+ if (loop < 0) {
+ audio_dev_warn(statep->adev, "Failed to reset codec");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wait for codec ready. The hardware can provide the state of
+ * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2]
+ */
+ codec_ready =
+ I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY;
+ for (loop = 7000; --loop >= 0; ) {
+ delay(ticks);
+ gsr = I810_BM_GET32(I810_REG_GSR);
+ if ((gsr & codec_ready) != 0) {
+ break;
+ }
+ }
+ if (loop < 0) {
+ audio_dev_warn(statep->adev, "No codec ready signal received");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ audio810_stop_dma(statep);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_stop_dma()
+ *
+ * Description:
+ * This routine is used to put each DMA engine into the quiet state.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ */
+static void
+audio810_stop_dma(audio810_state_t *statep)
+{
+ if (statep->bm_regs_handle == NULL) {
+ return;
+ }
+ /* pause bus master (needed for the following reset register) */
+ I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, 0x0);
+ I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, 0x0);
+ I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, 0x0);
+
+ /* and then reset the bus master registers for a three DMA engines */
+ I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, I810_BM_CR_RST);
+ I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, I810_BM_CR_RST);
+ I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, I810_BM_CR_RST);
+}
+
+
+/*
+ * audio810_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audio810_codec_sync(audio810_state_t *statep)
+{
+ int i;
+ uint16_t casr;
+
+ for (i = 0; i < 300; i++) {
+ casr = I810_BM_GET8(I810_REG_CASR);
+ if ((casr & 1) == 0) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(10);
+ }
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_write_ac97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audio810_write_ac97(void *arg, uint8_t reg, uint16_t data)
+{
+ audio810_state_t *statep = arg;
+
+ mutex_enter(&statep->ac_lock);
+ if (audio810_codec_sync(statep) == DDI_SUCCESS) {
+ I810_AM_PUT16(reg, data);
+ }
+ mutex_exit(&statep->ac_lock);
+
+ (void) audio810_read_ac97(statep, reg);
+}
+
+/*
+ * audio810_read_ac97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * The register value.
+ */
+static uint16_t
+audio810_read_ac97(void *arg, uint8_t reg)
+{
+ audio810_state_t *statep = arg;
+ uint16_t val = 0xffff;
+
+ mutex_enter(&statep->ac_lock);
+ if (audio810_codec_sync(statep) == DDI_SUCCESS) {
+ val = I810_AM_GET16(reg);
+ }
+ mutex_exit(&statep->ac_lock);
+ return (val);
+}
+
+/*
+ * audio810_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audio810_state_t *state The device soft state.
+ */
+void
+audio810_destroy(audio810_state_t *statep)
+{
+ /* stop DMA engines */
+ audio810_stop_dma(statep);
+
+ if (statep->intr_added) {
+ ddi_remove_intr(statep->dip, 0, NULL);
+ }
+
+ if (statep->ksp) {
+ kstat_delete(statep->ksp);
+ }
+
+ for (int i = 0; i < I810_NUM_PORTS; i++) {
+ audio810_free_port(statep->ports[i]);
+ }
+
+ audio810_unmap_regs(statep);
+
+ if (statep->ac97)
+ ac97_free(statep->ac97);
+
+ if (statep->adev)
+ audio_dev_free(statep->adev);
+
+ mutex_destroy(&statep->inst_lock);
+ mutex_destroy(&statep->ac_lock);
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.conf b/usr/src/uts/common/io/audio/drv/audio810/audio810.conf
new file mode 100644
index 0000000000..1041a2a8d1
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.conf
@@ -0,0 +1,97 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audio810 audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audio810
+# driver enforces a maximum and minimum count.
+#
+# It should also be understood that not all interrupt rates are legal.
+# The hardware is restricted to DMA buffers being allocated on certain
+# boundaries. If those boundaries are violated the driver will not be
+# loaded and an error message is entered into the messages log
+#
+# play-interrupts=250;
+# record-interrupts=250;
+
+#
+# The presence of the ac97-speaker property enables the use of a monoaural
+# output, normally intended for use with a speaker phone. Most systems
+# do not connect this to anything. The value of the property indicates
+# whether the speaker will be enabled by default or not.
+#
+# ac97-speaker=0;
+
+#
+# Uncomment ac97-micboost below to enable the use of a 20dB microphone boost.
+#
+# ac97-micboost=1;
+
+#
+# Uncomment properties below to suppress the AC'97 outputs that are
+# supported by the codec, but not connected to anything. Note
+# that the headphone feature in particular is commonly implemented as
+# an alternate output for the line out, and uses that with jack detection
+# instead of the codec's headphone feature.
+#
+# We don't allow diabling the lineout -- that's such a fundamental
+# part of ac97 that we doubt any vendor isn't using it.
+#
+# ac97-no-headphone=1;
+# ac97-no-auxout=1;
+
+#
+# Uncomment properties below to suppress the AC'97 inputs that are
+# supported by the codec, but not connected to anything. Note that
+# CDROM input support is mandatory in AC'97, so all codecs implement
+# it, even though many systems may not even have a CDROM installed.
+#
+# Generally, you can count on a linein and mic jack being present,
+# although some Toshiba models have been seen that lack a line-level
+# input jack.
+#
+# ac97-no-cdrom=1;
+# ac97-no-auxin=1;
+# ac97-no-video=1;
+# ac97-no-phone=1;
+# ac97-no-linein=1;
+# ac97-no-mic=1;
+
+#
+# Uncomment ac97-amplifier below to power down the external
+# amplifier. Most hardware doesn't need this property. But some
+# devices, such as some Sony Vaio laptops, need to set this property to
+# 0 to correct the inverted polarity of the external amplifier device.
+#
+# ac97-amplifier=0;
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.h b/usr/src/uts/common/io/audio/drv/audio810/audio810.h
new file mode 100644
index 0000000000..65917f0d02
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.h
@@ -0,0 +1,267 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO810_H_
+#define _AUDIO810_H_
+
+/*
+ * Header file for the audio810 device driver
+ */
+
+/*
+ * Driver supported configuration information
+ */
+#define I810_NAME "audio810"
+#define I810_MOD_NAME "audio810 audio driver"
+
+#define I810_INTS (175) /* default interrupt rate */
+#define I810_MIN_INTS (24) /* minimum interrupt rate */
+#define I810_MAX_INTS (5000) /* maximum interrupt rate */
+#define I810_NFRAGS (8) /* default # fragments */
+
+/*
+ * Misc. defines
+ */
+
+#define I810_BD_NUMS (32)
+#define I810_NUM_PORTS (2)
+#define I810_MOD_SIZE (16)
+
+#define I810_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+#define I810_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+/* The size of each entry of "reg" property is 5 integers */
+#define I810_INTS_PER_REG_PROP 5
+
+/* offset from the base of specified DMA engine */
+#define I810_OFFSET_BD_BASE (0x00)
+#define I810_OFFSET_CIV (0x04)
+#define I810_OFFSET_LVI (0x05)
+#define I810_OFFSET_SR (0x06)
+#define I810_OFFSET_PICB (0x08)
+#define I810_OFFSET_PIV (0x0A)
+#define I810_OFFSET_CR (0x0B)
+
+/* DMA engine offset from base */
+#define I810_BASE_PCM_IN (0x00)
+#define I810_BASE_PCM_OUT (0x10)
+#define I810_BASE_MIC (0x20)
+
+#define I810_REG_GCR 0x2C
+#define I810_REG_GSR 0x30
+#define I810_REG_CASR 0x34
+#define I810_REG_SISCTL 0x4C /* SiS 7012 control */
+
+/* bits of bus master status register */
+#define I810_BM_SR_DCH 0x01
+#define I810_BM_SR_CELV 0x02
+#define I810_BM_SR_LVBCI 0x04
+#define I810_BM_SR_BCIS 0x08
+#define I810_BM_SR_FIFOE 0x10
+
+/* bits of bus master control register */
+#define I810_BM_CR_RUN 0x01
+#define I810_BM_CR_RST 0x02
+#define I810_BM_CR_LVBIE 0x04
+#define I810_BM_CR_FEIE 0x08
+#define I810_BM_CR_IOCE 0x10
+
+#define I810_BM_CR_PAUSE 0x00
+
+/*
+ * Global Control Register
+ */
+#define I810_GCR_GPIE 0x00000001
+#define I810_GCR_COLD_RST 0x00000002
+#define I810_GCR_WARM_RST 0x00000004
+#define I810_GCR_ACLINK_OFF 0x00000008
+#define I810_GCR_PRI_INTR_ENABLE 0x00000010
+#define I810_GCR_SEC_INTR_ENABLE 0x00000020
+
+/* For ICH2 or more, bit21:20 is the PCM 4/6-channel enable bits */
+#define I810_GCR_2_CHANNELS (0 << 20)
+#define I810_GCR_4_CHANNELS (1 << 20)
+#define I810_GCR_6_CHANNELS (2 << 20)
+#define I810_GCR_CHANNELS_MASK (3 << 20)
+/* SiS 7012 has its own flags here */
+#define I810_GCR_SIS_2_CHANNELS (0 << 6)
+#define I810_GCR_SIS_4_CHANNELS (1 << 6)
+#define I810_GCR_SIS_6_CHANNELS (2 << 6)
+#define I810_GCR_SIS_CHANNELS_MASK (3 << 6)
+
+
+/*
+ * Global Status Register
+ */
+#define I810_GSR_TRI_READY 0x10000000 /* for ICH4/5 */
+#define I810_GSR_CAP8CH 0x00400000
+#define I810_GSR_CAP6CH 0x00200000
+#define I810_GSR_CAP4CH 0x00100000
+#define I810_GSR_READ_COMPL 0x00008000
+#define I810_GSR_INTR_SEC_RESUME 0x00000800
+#define I810_GSR_INTR_PRI_RESUME 0x00000400
+#define I810_GSR_SEC_READY 0x00000200
+#define I810_GSR_PRI_READY 0x00000100
+#define I810_GSR_INTR_MIC 0x00000080
+#define I810_GSR_INTR_POUT 0x00000040
+#define I810_GSR_INTR_PIN 0x00000020
+#define I810_GSR_INTR_MO 0x00000004
+#define I810_GSR_INTR_MI 0x00000002
+#define I810_GSR_INTR_GSI 0x00000001
+#define I810_GSR_USE_INTR 0x00000060 /* PCM-IN ,PCM-OUT */
+
+/*
+ * SiS Control Register
+ */
+#define I810_SISCTL_UNMUTE 0x01
+
+/*
+ * Macro for AD1980 codec
+ */
+#define AD1980_VID1 0x4144
+#define AD1980_VID2 0x5370
+#define AD1985_VID2 0x5375
+#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
+#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
+#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
+#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
+
+#define I810_PCM_IN 0
+#define I810_PCM_OUT 1
+
+struct audio810_port {
+ struct audio810_state *statep;
+ int num;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ uint64_t count;
+ uint8_t nfrag;
+ uint8_t nchan;
+
+ uint8_t regoff;
+ uint8_t stsoff; /* status offset */
+ uint8_t picboff; /* picb offset */
+ uint8_t civ;
+ uint16_t picb;
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audio810_port audio810_port_t;
+
+/*
+ * buffer descripter list entry, sees datasheet
+ */
+struct i810_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t buf_len; /* the number of samples */
+ uint16_t buf_cmd;
+};
+typedef struct i810_bd_entry i810_bd_entry_t;
+#define BUF_CMD_BUP 0x4000
+#define BUF_CMD_IOC 0x8000
+
+typedef enum i810_quirk {
+ QUIRK_NONE = 0,
+ QUIRK_SIS7012, /* weird registers and such */
+} i810_quirk_t;
+
+/*
+ * audio810_state_t -per instance state and operation data
+ */
+struct audio810_state {
+ kmutex_t inst_lock; /* state protection lock */
+ kmutex_t ac_lock;
+ ddi_iblock_cookie_t iblock;
+ dev_info_t *dip; /* used by audio810_getinfo() */
+ audio_dev_t *adev;
+ ac97_t *ac97;
+ audio810_port_t *ports[2];
+
+ ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
+ ddi_acc_handle_t bm_regs_handle; /* for bus master register */
+ caddr_t am_regs_base; /* base of audio mixer regs */
+ caddr_t bm_regs_base; /* base of bus master regs */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ boolean_t intr_added;
+ boolean_t suspended; /* suspend/resume state */
+ uint8_t maxch;
+ i810_quirk_t quirk;
+};
+typedef struct audio810_state audio810_state_t;
+
+/*
+ * Useful bit twiddlers
+ */
+#define I810_BM_GET8(reg) \
+ ddi_get8(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_GET16(reg) \
+ ddi_get16(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_GET32(reg) \
+ ddi_get32(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_PUT8(reg, val) \
+ ddi_put8(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_BM_PUT16(reg, val) \
+ ddi_put16(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_BM_PUT32(reg, val) \
+ ddi_put32(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_AM_GET16(reg) \
+ ddi_get16(statep->am_regs_handle, \
+ (void *)((char *)statep->am_regs_base + (reg)))
+
+#define I810_AM_PUT16(reg, val) \
+ ddi_put16(statep->am_regs_handle, \
+ (void *)((char *)statep->am_regs_base + (reg)), (val))
+
+#endif /* _AUDIO810_H_ */
diff --git a/usr/src/uts/common/io/audio/drv/audioens/audioens.c b/usr/src/uts/common/io/audio/drv/audioens/audioens.c
new file mode 100644
index 0000000000..f5220f5229
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.c
@@ -0,0 +1,1458 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Creative/Ensoniq AudioPCI97 driver (ES1371/ES1373)
+ *
+ * This driver is used with the original Ensoniq AudioPCI97 card and many
+ * PCI based Sound Blaster cards by Creative Technologies. For example
+ * Sound Blaster PCI128 and Creative/Ectiva EV1938.
+ */
+
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include <sys/pci.h>
+#include "audioens.h"
+
+/*
+ * The original OSS driver used a single duplex engine and a separate
+ * playback only engine. Instead, we expose three engines, one for input
+ * and two for output.
+ */
+
+/*
+ * Set the latency to 32, 64, 96, 128 clocks - some APCI97 devices exhibit
+ * garbled audio in some cases and setting the latency to higer values fixes it
+ * Values: 32, 64, 96, 128 - Default: 64 (or defined by bios)
+ */
+int audioens_latency = 0;
+
+/*
+ * Enable SPDIF port on SoundBlaster 128D or Sound Blaster Digital-4.1 models
+ * Values: 1=Enable 0=Disable Default: 0
+ */
+int audioens_spdif = 0;
+
+/*
+ * Note: Latest devices can support SPDIF with AC3 pass thru.
+ * However, in order to do this, one of the two DMA engines must be
+ * dedicated to this, which would prevent the card from supporting 4
+ * channel audio. For now we don't bother with the AC3 pass through
+ * mode, and instead just focus on 4 channel support. In the future,
+ * this could be selectable via a property.
+ */
+
+#define ENSONIQ_VENDOR_ID 0x1274
+#define CREATIVE_VENDOR_ID 0x1102
+#define ECTIVA_VENDOR_ID 0x1102
+#define ENSONIQ_ES1371 0x1371
+#define ENSONIQ_ES5880 0x8001
+#define ENSONIQ_ES5880A 0x8002
+#define ENSONIQ_ES5880B 0x5880
+#define ECTIVA_ES1938 0x8938
+
+#define DEFRATE 48000
+#define DEFINTS 75
+#define DRVNAME "audioens"
+
+typedef struct audioens_port
+{
+ /* Audio parameters */
+ boolean_t trigger;
+ boolean_t suspended;
+
+ int speed;
+
+ int num;
+#define PORT_DAC 0
+#define PORT_ADC 1
+#define PORT_MAX PORT_ADC
+
+ caddr_t kaddr;
+ uint32_t paddr;
+ ddi_acc_handle_t acch;
+ ddi_dma_handle_t dmah;
+ int nchan;
+ unsigned fragfr;
+ unsigned nfrags;
+ unsigned nframes;
+ unsigned frameno;
+ uint64_t count;
+
+ struct audioens_dev *dev;
+ audio_engine_t *engine;
+} audioens_port_t;
+
+typedef struct audioens_dev
+{
+ audio_dev_t *osdev;
+ kmutex_t mutex;
+ uint16_t devid;
+ uint8_t revision;
+ dev_info_t *dip;
+ boolean_t enabled;
+
+
+ int pintrs;
+ int rintrs;
+
+ kstat_t *ksp;
+
+ audioens_port_t port[PORT_MAX + 1];
+
+ ac97_t *ac97;
+
+ caddr_t regs;
+ ddi_acc_handle_t acch;
+ ddi_intr_handle_t ihandle[1];
+} audioens_dev_t;
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * The hardware appears to be able to address up to 16-bits worth of longwords,
+ * giving a total address space of 256K. Note, however, that we will restrict
+ * this further when we do fragment and memory allocation. At its very highest
+ * clock rate (48 kHz) and sample size (16-bit stereo), and lowest interrupt
+ * rate (32 Hz), we only need 6000 bytes per fragment.
+ *
+ * So with an allocated buffer size of 64K, we can support at least 10 frags,
+ * which is more than enough. (The legacy Sun driver used only 2 fragments.)
+ */
+#define AUDIOENS_BUF_LEN (65536)
+
+static ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_VERSION, /* dma_attr_version */
+ 0x0, /* dma_attr_addr_lo */
+ 0xffffffffU, /* dma_attr_addr_hi */
+ 0x3ffff, /* dma_attr_count_max */
+ 0x8, /* dma_attr_align */
+ 0x7f, /* dma_attr_burstsizes */
+ 0x1, /* dma_attr_minxfer */
+ 0x3ffff, /* dma_attr_maxxfer */
+ 0x3ffff, /* dma_attr_seg */
+ 0x1, /* dma_attr_sgllen */
+ 0x1, /* dma_attr_granular */
+ 0 /* dma_attr_flags */
+};
+
+#define GET8(dev, offset) \
+ ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
+#define GET16(dev, offset) \
+ ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
+#define GET32(dev, offset) \
+ ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
+#define PUT8(dev, offset, v) \
+ ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
+#define PUT16(dev, offset, v) \
+ ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
+#define PUT32(dev, offset, v) \
+ ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
+
+#define CLR8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) & ~(v))
+#define SET8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) | (v))
+#define CLR32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) & ~(v))
+#define SET32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) | (v))
+
+#define KSINTR(dev) ((kstat_intr_t *)((dev)->ksp->ks_data))
+
+static void audioens_init_hw(audioens_dev_t *);
+static void audioens_init_port(audioens_port_t *);
+static void audioens_start_port(audioens_port_t *);
+static void audioens_stop_port(audioens_port_t *);
+static void audioens_update_port(audioens_port_t *);
+
+static uint16_t
+audioens_rd97(void *dev_, uint8_t wAddr)
+{
+ audioens_dev_t *dev = dev_;
+ int i, dtemp;
+
+ mutex_enter(&dev->mutex);
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ /* wait for WIP to go away saving the current state for later */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if ((dtemp & (1UL << 30)) == 0)
+ break;
+ }
+
+ /* write addr w/data=0 and assert read request ... */
+ PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | (1UL << 23));
+
+ /* now wait for the data (RDY) */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if (dtemp & (1UL << 31))
+ break;
+ }
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ mutex_exit(&dev->mutex);
+
+ return (dtemp & 0xffff);
+}
+
+static void
+audioens_wr97(void *dev_, uint8_t wAddr, uint16_t wData)
+{
+ audioens_dev_t *dev = dev_;
+ int i, dtemp;
+
+ mutex_enter(&dev->mutex);
+ /* wait for WIP to go away */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if ((dtemp & (1UL << 30)) == 0)
+ break;
+ }
+
+ PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | wData);
+
+ mutex_exit(&dev->mutex);
+}
+
+static unsigned short
+SRCRegRead(audioens_dev_t *dev, unsigned short reg)
+{
+ int i, dtemp;
+
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ /* wait for ready */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ /* assert a read request */
+ PUT32(dev, CONC_dSRCIO_OFF, (dtemp & SRC_CTLMASK) | ((int)reg << 25));
+
+ /* now wait for the data */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ return ((unsigned short) dtemp);
+}
+
+static void
+SRCRegWrite(audioens_dev_t *dev, unsigned short reg, unsigned short val)
+{
+ int i, dtemp;
+ int writeval;
+
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ /* wait for ready */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ /* assert the write request */
+ writeval = (dtemp & SRC_CTLMASK) | SRC_WENABLE |
+ ((int)reg << 25) | val;
+ PUT32(dev, CONC_dSRCIO_OFF, writeval);
+}
+
+static void
+SRCSetRate(audioens_dev_t *dev, unsigned char base, unsigned short rate)
+{
+ int i, freq, dtemp;
+ unsigned short N, truncM, truncStart;
+
+ if (base != SRC_ADC_BASE) {
+ /* freeze the channel */
+ dtemp = (base == SRC_DAC1_BASE) ?
+ SRC_DAC1FREEZE : SRC_DAC2FREEZE;
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF,
+ (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) | dtemp);
+
+ /* calculate new frequency and write it - preserve accum */
+ freq = ((int)rate << 16) / 3000U;
+ SRCRegWrite(dev, (unsigned short) base + SRC_INT_REGS_OFF,
+ (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
+ & 0x00ffU) | ((unsigned short) (freq >> 6) & 0xfc00));
+ SRCRegWrite(dev, (unsigned short) base + SRC_VFREQ_FRAC_OFF,
+ (unsigned short) freq >> 1);
+
+ /* un-freeze the channel */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i)
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ PUT32(dev, CONC_dSRCIO_OFF,
+ (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) & ~dtemp);
+ } else {
+ /* derive oversample ratio */
+ N = rate / 3000U;
+ if (N == 15 || N == 13 || N == 11 || N == 9)
+ --N;
+
+ /* truncate the filter and write n/trunc_start */
+ truncM = (21 * N - 1) | 1;
+ if (rate >= 24000U) {
+ if (truncM > 239)
+ truncM = 239;
+ truncStart = (239 - truncM) >> 1;
+
+ SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
+ (truncStart << 9) | (N << 4));
+ } else {
+ if (truncM > 119)
+ truncM = 119;
+ truncStart = (119 - truncM) >> 1;
+
+ SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
+ 0x8000U | (truncStart << 9) | (N << 4));
+ }
+
+ /* calculate new frequency and write it - preserve accum */
+ freq = ((48000UL << 16) / rate) * N;
+ SRCRegWrite(dev, base + SRC_INT_REGS_OFF,
+ (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
+ & 0x00ff) | ((unsigned short) (freq >> 6) & 0xfc00));
+ SRCRegWrite(dev, base + SRC_VFREQ_FRAC_OFF,
+ (unsigned short) freq >> 1);
+
+ SRCRegWrite(dev, SRC_ADC_VOL_L, N << 8);
+ SRCRegWrite(dev, SRC_ADC_VOL_R, N << 8);
+ }
+}
+
+static void
+SRCInit(audioens_dev_t *dev)
+{
+ int i;
+
+ /* Clear all SRC RAM then init - keep SRC disabled until done */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF, SRC_DISABLE);
+
+ for (i = 0; i < 0x80; ++i)
+ SRCRegWrite(dev, (unsigned short) i, 0U);
+
+ SRCRegWrite(dev, SRC_DAC1_BASE + SRC_TRUNC_N_OFF, 16 << 4);
+ SRCRegWrite(dev, SRC_DAC1_BASE + SRC_INT_REGS_OFF, 16 << 10);
+ SRCRegWrite(dev, SRC_DAC2_BASE + SRC_TRUNC_N_OFF, 16 << 4);
+ SRCRegWrite(dev, SRC_DAC2_BASE + SRC_INT_REGS_OFF, 16 << 10);
+ SRCRegWrite(dev, SRC_DAC1_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC1_VOL_R, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC2_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC2_VOL_R, 1 << 12);
+ SRCRegWrite(dev, SRC_ADC_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_ADC_VOL_R, 1 << 12);
+
+ /* default some rates */
+ SRCSetRate(dev, SRC_DAC1_BASE, 48000);
+ SRCSetRate(dev, SRC_DAC2_BASE, 48000);
+ SRCSetRate(dev, SRC_ADC_BASE, 48000);
+
+ /* now enable the whole deal */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF, 0);
+}
+
+static void
+audioens_writemem(audioens_dev_t *dev, uint32_t page, uint32_t offs,
+ uint32_t data)
+{
+ /* Select memory page */
+ PUT32(dev, CONC_bMEMPAGE_OFF, page);
+ PUT32(dev, offs, data);
+}
+
+static uint32_t
+audioens_readmem(audioens_dev_t *dev, uint32_t page, uint32_t offs)
+{
+ PUT32(dev, CONC_bMEMPAGE_OFF, page); /* Select memory page */
+ return (GET32(dev, offs));
+}
+
+static uint_t
+audioens_intr(caddr_t arg1, caddr_t arg2)
+{
+ audioens_dev_t *dev = (void *)arg1;
+ int stats;
+ int tmp;
+ unsigned char ackbits = 0;
+ audioens_port_t *port;
+ audio_engine_t *do_dac, *do_adc;
+
+ _NOTE(ARGUNUSED(arg2));
+
+ /*
+ * NB: The old audioens didn't report spurious interrupts. On
+ * a system with shared interrupts (typical!) there will
+ * normally be lots of these (each time the "other" device
+ * interrupts).
+ *
+ * Also, because of the way the interrupt chain handling
+ * works, reporting of spurious interrupts is probably not
+ * terribly useful.
+ *
+ * However, we can count interrupts where the master interrupt
+ * bit is set but none of the ackbits that we are prepared to
+ * process is set. That is probably useful.
+ */
+ mutex_enter(&dev->mutex);
+ if (!dev->enabled) {
+
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ stats = GET32(dev, CONC_dSTATUS_OFF);
+
+ if (!(stats & CONC_STATUS_PENDING)) { /* No interrupt pending */
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ do_dac = do_adc = NULL;
+
+ /* DAC1 (synth) interrupt */
+ if (stats & CONC_STATUS_DAC1INT) {
+
+ ackbits |= CONC_SERCTL_DAC1IE;
+ port = &dev->port[PORT_DAC];
+ if (port->trigger) {
+ do_dac = port->engine;
+ }
+ }
+
+ /* DAC2 interrupt */
+ if (stats & CONC_STATUS_DAC2INT) {
+
+ ackbits |= CONC_SERCTL_DAC2IE;
+ }
+
+ /* ADC interrupt */
+ if (stats & CONC_STATUS_ADCINT) {
+
+ ackbits |= CONC_SERCTL_ADCIE;
+ port = &dev->port[PORT_ADC];
+
+ if (port->trigger) {
+ do_adc = port->engine;
+ }
+ }
+
+ /* UART interrupt - we shouldn't get this! */
+ if (stats & CONC_STATUS_UARTINT) {
+ uint8_t uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ while (uart_stat & CONC_UART_RXRDY)
+ uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ }
+
+ /* Ack the interrupt */
+ tmp = GET8(dev, CONC_bSERCTL_OFF);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp & (~ackbits)); /* Clear bits */
+ PUT8(dev, CONC_bSERCTL_OFF, tmp | ackbits); /* Turn them back on */
+
+ if (dev->ksp) {
+ if (ackbits == 0) {
+ KSINTR(dev)->intrs[KSTAT_INTR_SPURIOUS]++;
+ } else {
+ KSINTR(dev)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&dev->mutex);
+
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ if (do_adc)
+ audio_engine_produce(do_adc);
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+static int
+audioens_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ /* hardware can also do AUDIO_FORMAT_U8, but no need for it */
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+static int
+audioens_channels(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+static int
+audioens_rate(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->speed);
+}
+
+static void
+audioens_init_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+ unsigned tmp;
+
+ if (port->suspended)
+ return;
+
+ switch (port->num) {
+ case PORT_DAC:
+ /* Set physical address of the DMA buffer */
+ audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_dDAC1PADDR_OFF,
+ port->paddr);
+ audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_dDAC2PADDR_OFF,
+ port->paddr + (port->nframes * sizeof (int16_t) * 2));
+
+ /* Set DAC rate */
+ SRCSetRate(dev, SRC_DAC1_BASE, port->speed);
+ SRCSetRate(dev, SRC_DAC2_BASE, port->speed);
+
+ /* Configure the channel setup - SPDIF only uses front */
+ tmp = GET32(dev, CONC_dSTATUS_OFF);
+ tmp &= ~(CONC_STATUS_SPKR_MASK | CONC_STATUS_SPDIF_MASK);
+ tmp |= CONC_STATUS_SPKR_4CH | CONC_STATUS_SPDIF_P1;
+ PUT32(dev, CONC_dSTATUS_OFF, tmp);
+
+ /* Set format */
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+ SET8(dev, CONC_bSERFMT_OFF,
+ CONC_PCM_DAC1_16BIT | CONC_PCM_DAC2_16BIT |
+ CONC_PCM_DAC1_STEREO | CONC_PCM_DAC2_STEREO);
+
+ /* Set the frame count */
+ audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_wDAC1FC_OFF,
+ port->nframes - 1);
+ audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_wDAC2FC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wDAC1IC_OFF, port->fragfr - 1);
+ PUT16(dev, CONC_wDAC2IC_OFF, port->fragfr - 1);
+ break;
+
+ case PORT_ADC:
+ /* Set physical address of the DMA buffer */
+ audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_dADCPADDR_OFF,
+ port->paddr);
+
+ /* Set ADC rate */
+ SRCSetRate(dev, SRC_ADC_BASE, port->speed);
+
+ /* Set format - for input we only support 16 bit input */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_ADC_16BIT;
+ tmp |= CONC_PCM_ADC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_wADCFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wADCIC_OFF, port->fragfr - 1);
+
+ break;
+ }
+
+ port->frameno = 0;
+}
+
+static int
+audioens_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+ int intrs;
+
+ _NOTE(ARGUNUSED(flag));
+
+ mutex_enter(&dev->mutex);
+
+ if (port->num == PORT_ADC) {
+ intrs = dev->rintrs;
+ } else {
+ intrs = dev->pintrs;
+ }
+
+ /* interrupt at least at 25 Hz, and not more than 250 Hz */
+ intrs = min(250, max(25, intrs));
+
+ port->fragfr = (port->speed / intrs);
+ port->nfrags = AUDIOENS_BUF_LEN /
+ (port->fragfr * port->nchan * sizeof (int16_t));
+ port->nfrags = max(4, min(port->nfrags, 1024));
+ port->nframes = port->nfrags * port->fragfr;
+ port->trigger = B_FALSE;
+ port->count = 0;
+
+ audioens_init_port(port);
+
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrags;
+ *bufp = port->kaddr;
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audioens_start_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+
+ if (!port->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ SET8(dev, CONC_bDEVCTL_OFF,
+ CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DAC1IE);
+ break;
+ case PORT_ADC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static void
+audioens_stop_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+
+ if (!port->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ CLR8(dev, CONC_bDEVCTL_OFF,
+ CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DAC1IE);
+ break;
+ case PORT_ADC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static int
+audioens_start(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (!port->trigger) {
+ port->trigger = B_TRUE;
+ audioens_start_port(port);
+ }
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audioens_stop(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (port->trigger) {
+ port->trigger = B_FALSE;
+ audioens_stop_port(port);
+ }
+ mutex_exit(&dev->mutex);
+}
+
+static void
+audioens_update_port(audioens_port_t *port)
+{
+ uint32_t page, offs;
+ int frameno, n;
+
+ switch (port->num) {
+ case PORT_DAC:
+ page = CONC_DAC1CTL_PAGE;
+ offs = CONC_wDAC1FC_OFF;
+ break;
+
+ case PORT_ADC:
+ page = CONC_ADCCTL_PAGE;
+ offs = CONC_wADCFC_OFF;
+ break;
+ }
+
+ /*
+ * Note that the current frame counter is in the high nybble.
+ */
+ frameno = audioens_readmem(port->dev, page, offs) >> 16;
+ n = frameno >= port->frameno ?
+ frameno - port->frameno :
+ frameno + port->nframes - port->frameno;
+ port->frameno = frameno;
+ port->count += n;
+}
+
+static uint64_t
+audioens_count(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+ uint64_t val;
+
+ mutex_enter(&dev->mutex);
+ if (!port->suspended) {
+ audioens_update_port(port);
+ }
+ val = port->count;
+ mutex_exit(&dev->mutex);
+ return (val);
+}
+
+static void
+audioens_close(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ audioens_stop(port);
+}
+
+static void
+audioens_sync(void *arg, unsigned nframes)
+{
+ audioens_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(nframes));
+
+ if (port->num == PORT_ADC) {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORCPU);
+ } else {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+ }
+}
+
+static size_t
+audioens_qlen(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->fragfr);
+}
+
+static void
+audioens_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr)
+{
+ audioens_port_t *port = arg;
+
+ if ((port->num == PORT_DAC) && (chan >= 2)) {
+ *offset = (port->nframes * 2) + (chan % 2);
+ *incr = 2;
+ } else {
+ *offset = chan;
+ *incr = 2;
+ }
+}
+
+audio_engine_ops_t audioens_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audioens_open,
+ audioens_close,
+ audioens_start,
+ audioens_stop,
+ audioens_count,
+ audioens_format,
+ audioens_channels,
+ audioens_rate,
+ audioens_sync,
+ audioens_qlen,
+ audioens_chinfo
+};
+
+void
+audioens_init_hw(audioens_dev_t *dev)
+{
+ int tmp;
+
+ if ((dev->devid == ENSONIQ_ES5880) ||
+ (dev->devid == ENSONIQ_ES5880A) ||
+ (dev->devid == ENSONIQ_ES5880B) ||
+ (dev->devid == 0x1371 && dev->revision == 7) ||
+ (dev->devid == 0x1371 && dev->revision >= 9)) {
+
+ /* Have a ES5880 so enable the codec manually */
+ tmp = GET8(dev, CONC_bINTSUMM_OFF) & 0xff;
+ tmp |= 0x20;
+ PUT8(dev, CONC_bINTSUMM_OFF, tmp);
+ for (int i = 0; i < 2000; i++)
+ drv_usecwait(10);
+ }
+
+ SRCInit(dev);
+
+#if 0
+ PUT8(dev, CONC_bSERCTL_OFF, 0x00);
+ PUT8(dev, CONC_bNMIENA_OFF, 0x00); /* NMI off */
+ PUT8(dev, CONC_wNMISTAT_OFF, 0x00); /* PUT8? */
+#endif
+
+ /*
+ * Turn on CODEC (UART and joystick left disabled)
+ */
+ tmp = GET32(dev, CONC_bDEVCTL_OFF) & 0xff;
+ tmp &= ~(CONC_DEVCTL_PCICLK_DS | CONC_DEVCTL_XTALCLK_DS);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bUARTCSTAT_OFF, 0x00);
+
+ /* Perform AC97 codec warm reset */
+ tmp = GET8(dev, CONC_bMISCCTL_OFF) & 0xff;
+ PUT8(dev, CONC_bMISCCTL_OFF, tmp | CONC_MISCCTL_SYNC_RES);
+ drv_usecwait(200);
+ PUT8(dev, CONC_bMISCCTL_OFF, tmp);
+ drv_usecwait(200);
+
+ if (dev->revision >= 4) {
+ /* XXX: enable SPDIF - PCM only for now */
+ if (audioens_spdif) {
+ /* enable SPDIF */
+ PUT32(dev, 0x04, GET32(dev, 0x04) | (1 << 18));
+ /* SPDIF out = data from DAC */
+ PUT32(dev, 0x00, GET32(dev, 0x00) | (1 << 26));
+ CLR32(dev, CONC_dSPDIF_OFF, CONC_SPDIF_AC3);
+
+ } else {
+ /* disable spdif out */
+ PUT32(dev, 0x04, GET32(dev, 0x04) & ~(1 << 18));
+ PUT32(dev, 0x00, GET32(dev, 0x00) & ~(1 << 26));
+ }
+
+ /* we want to run each channel independently */
+ CLR32(dev, CONC_dSTATUS_OFF, CONC_STATUS_ECHO);
+ }
+
+ dev->enabled = B_TRUE;
+}
+
+static int
+audioens_init(audioens_dev_t *dev)
+{
+
+ audioens_init_hw(dev);
+
+ /*
+ * On this hardware, we want to disable the internal speaker by
+ * default, if it exists. (We don't have a speakerphone on any
+ * of these cards, and no SPARC hardware uses it either!)
+ */
+ ddi_prop_update_int(DDI_DEV_T_NONE, dev->dip, AC97_PROP_SPEAKER, 0);
+
+ /*
+ * Init mixer
+ */
+
+ dev->ac97 = ac97_alloc(dev->dip, audioens_rd97, audioens_wr97, dev);
+ if (dev->ac97 == NULL)
+ return (DDI_FAILURE);
+
+ if (ac97_init(dev->ac97, dev->osdev) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ dev->pintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "play-interrupts", DEFINTS);
+
+ dev->rintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "record-interrupts", DEFINTS);
+
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audioens_port_t *port;
+ unsigned caps;
+ unsigned dmaflags;
+ size_t rlen;
+ ddi_dma_cookie_t c;
+ unsigned ccnt;
+
+ port = &dev->port[i];
+ port->dev = dev;
+
+ switch (i) {
+ case PORT_DAC:
+ port->nchan = 4;
+ port->speed = 48000;
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ break;
+
+ case PORT_ADC:
+ port->nchan = 2;
+ port->speed = 48000;
+ caps = ENGINE_INPUT_CAP;
+ dmaflags = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ break;
+ }
+
+ port->num = i;
+
+ /*
+ * Allocate DMA resources.
+ */
+
+ if (ddi_dma_alloc_handle(dev->dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->dmah) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma handle allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ if (ddi_dma_mem_alloc(port->dmah, AUDIOENS_BUF_LEN, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->kaddr,
+ &rlen, &port->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma memory allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ /* ensure that the buffer is zeroed out properly */
+ bzero(port->kaddr, rlen);
+ if (ddi_dma_addr_bind_handle(port->dmah, NULL, port->kaddr,
+ AUDIOENS_BUF_LEN, dmaflags, DDI_DMA_SLEEP, NULL,
+ &c, &ccnt) != DDI_DMA_MAPPED) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma binding failed", i);
+ return (DDI_FAILURE);
+ }
+ port->paddr = c.dmac_address;
+
+ /*
+ * Allocate and configure audio engine.
+ */
+ port->engine = audio_engine_alloc(&audioens_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(dev->osdev,
+ "port %d: audio_engine_alloc failed", i);
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(dev->osdev, port->engine);
+ }
+
+ /*
+ * Set up kstats for interrupt reporting.
+ */
+ dev->ksp = kstat_create(ddi_driver_name(dev->dip),
+ ddi_get_instance(dev->dip), ddi_driver_name(dev->dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (dev->ksp != NULL) {
+ kstat_install(dev->ksp);
+ }
+
+ if (audio_dev_register(dev->osdev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "unable to register with audio framework");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audioens_setup_interrupts(audioens_dev_t *dev)
+{
+ int actual;
+ uint_t ipri;
+
+ if ((ddi_intr_alloc(dev->dip, dev->ihandle, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) ||
+ (actual != 1)) {
+ audio_dev_warn(dev->osdev, "can't alloc intr handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(dev->ihandle[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't determine intr priority");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(dev->ihandle[0], audioens_intr, dev,
+ NULL) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't add intr handler");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+void
+audioens_destroy(audioens_dev_t *dev)
+{
+ int i;
+
+ if (dev->ihandle[0] != NULL) {
+ (void) ddi_intr_disable(dev->ihandle[0]);
+ (void) ddi_intr_remove_handler(dev->ihandle[0]);
+ (void) ddi_intr_free(dev->ihandle[0]);
+ mutex_destroy(&dev->mutex);
+ }
+
+ if (dev->ksp != NULL) {
+ kstat_delete(dev->ksp);
+ }
+
+ /* free up ports, including DMA resources for ports */
+ for (i = 0; i <= PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+
+ if (port->paddr != 0)
+ (void) ddi_dma_unbind_handle(port->dmah);
+ if (port->acch != NULL)
+ ddi_dma_mem_free(&port->acch);
+ if (port->dmah != NULL)
+ ddi_dma_free_handle(&port->dmah);
+
+ if (port->engine != NULL) {
+ audio_dev_remove_engine(dev->osdev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ }
+
+ if (dev->acch != NULL) {
+ ddi_regs_map_free(&dev->acch);
+ }
+
+ if (dev->ac97) {
+ ac97_free(dev->ac97);
+ }
+
+ if (dev->osdev != NULL) {
+ audio_dev_free(dev->osdev);
+ }
+
+ kmem_free(dev, sizeof (*dev));
+}
+
+int
+audioens_attach(dev_info_t *dip)
+{
+ uint16_t pci_command, vendor, device;
+ uint8_t revision;
+ audioens_dev_t *dev;
+ ddi_acc_handle_t pcih;
+ const char *chip_name;
+ const char *chip_vers;
+
+ dev = kmem_zalloc(sizeof (*dev), KM_SLEEP);
+ dev->dip = dip;
+ ddi_set_driver_private(dip, dev);
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "pci_config_setup failed");
+ kmem_free(dev, sizeof (*dev));
+ return (DDI_FAILURE);
+ }
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+ revision = pci_config_get8(pcih, PCI_CONF_REVID);
+
+ if ((vendor != ENSONIQ_VENDOR_ID && vendor != CREATIVE_VENDOR_ID) ||
+ (device != ENSONIQ_ES1371 && device != ENSONIQ_ES5880 &&
+ device != ENSONIQ_ES5880A && device != ECTIVA_ES1938 &&
+ device != ENSONIQ_ES5880B))
+ goto err_exit;
+
+ chip_name = "AudioPCI97";
+ chip_vers = "unknown";
+
+ switch (device) {
+ case ENSONIQ_ES1371:
+ chip_name = "AudioPCI97";
+ switch (revision) {
+ case 0x02:
+ case 0x09:
+ default:
+ chip_vers = "ES1371";
+ break;
+ case 0x04:
+ case 0x06:
+ case 0x08:
+ chip_vers = "ES1373";
+ break;
+ case 0x07:
+ chip_vers = "ES5880";
+ break;
+ }
+ break;
+
+ case ENSONIQ_ES5880:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880";
+ break;
+ case ENSONIQ_ES5880A:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880A";
+ break;
+ case ENSONIQ_ES5880B:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880B";
+ break;
+
+ case ECTIVA_ES1938:
+ chip_name = "AudioPCI";
+ chip_vers = "ES1938";
+ break;
+ }
+
+ dev->revision = revision;
+ dev->devid = device;
+
+ dev->osdev = audio_dev_alloc(dip, 0);
+ if (dev->osdev == NULL) {
+ goto err_exit;
+ }
+
+ audio_dev_set_description(dev->osdev, chip_name);
+ audio_dev_set_version(dev->osdev, chip_vers);
+
+ /* set the PCI latency */
+ if ((audioens_latency == 32) || (audioens_latency == 64) ||
+ (audioens_latency == 96))
+ pci_config_put8(pcih, PCI_CONF_LATENCY_TIMER,
+ audioens_latency);
+
+ /* activate the device */
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ /* map registers */
+ if (ddi_regs_map_setup(dip, 1, &dev->regs, 0, 0, &acc_attr,
+ &dev->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't map registers");
+ goto err_exit;
+ }
+
+ if (audioens_setup_interrupts(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't register interrupts");
+ goto err_exit;
+ }
+
+ /* This allocates and configures the engines */
+ if (audioens_init(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't init device");
+ goto err_exit;
+ }
+
+ (void) ddi_intr_enable(dev->ihandle[0]);
+
+ pci_config_teardown(&pcih);
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+err_exit:
+ pci_config_teardown(&pcih);
+
+ audioens_destroy(dev);
+
+ return (DDI_FAILURE);
+}
+
+int
+audioens_detach(audioens_dev_t *dev)
+{
+ int tmp;
+
+ /* first unregister us from the DDI framework, might be busy */
+ if (audio_dev_unregister(dev->osdev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ mutex_enter(&dev->mutex);
+
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ dev->enabled = B_FALSE;
+
+ mutex_exit(&dev->mutex);
+
+ audioens_destroy(dev);
+
+ return (DDI_SUCCESS);
+}
+
+/*ARGSUSED*/
+static int
+audioens_resume(audioens_dev_t *dev)
+{
+ /* ask framework to reset/relocate engine data */
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audio_engine_reset(dev->port[i].engine);
+ }
+
+ /* reinitialize hardware */
+ audioens_init_hw(dev);
+
+ /* restore AC97 state */
+ ac97_resume(dev->ac97);
+
+ /* restart ports */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i < PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+ port->suspended = B_FALSE;
+ audioens_init_port(port);
+ /* possibly start it up if was going when we suspended */
+ if (port->trigger) {
+ audioens_start_port(port);
+
+ }
+ }
+ mutex_exit(&dev->mutex);
+ for (int i = 0; i < PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+ /* signal callbacks on resume */
+ if (!port->trigger)
+ continue;
+ if (port->num == PORT_ADC) {
+ audio_engine_produce(port->engine);
+ } else {
+ audio_engine_consume(port->engine);
+ }
+ }
+ return (DDI_SUCCESS);
+}
+
+/*ARGSUSED*/
+static int
+audioens_suspend(audioens_dev_t *dev)
+{
+ /*
+ * Stop all engines/DMA data.
+ */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audioens_stop_port(&dev->port[i]);
+ audioens_update_port(&dev->port[i]);
+ dev->port[i].suspended = B_TRUE;
+ }
+ dev->enabled = B_FALSE;
+ mutex_exit(&dev->mutex);
+
+ /*
+ * Framework needs to save off AC'97 state.
+ */
+ ac97_suspend(dev->ac97);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audioens_quiesce(dev_info_t *dip)
+{
+ audioens_dev_t *dev;
+ uint8_t tmp;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* This disables all DMA engines and interrupts */
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ return (DDI_SUCCESS);
+}
+
+
+static int
+audioens_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audioens_dev_t *dev;
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audioens_attach(dip));
+
+ case DDI_RESUME:
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+ return (audioens_resume(dev));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int
+audioens_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audioens_dev_t *dev;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audioens_detach(dev));
+
+ case DDI_SUSPEND:
+ return (audioens_suspend(dev));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int audioens_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audioens_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+
+static struct dev_ops audioens_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audioens_ddi_attach, /* attach */
+ audioens_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audioens_quiesce, /* quiesce */
+};
+
+static struct modldrv audioens_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Ensoniq 1371/1373 Audio", /* linkinfo */
+ &audioens_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audioens_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audioens_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audioens_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audioens_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf b/usr/src/uts/common/io/audio/drv/audioens/audioens.conf
index 3ec17d2cbc..7e116fffb6 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.conf
@@ -19,51 +19,35 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# Configuration file for the audio810 audio driver.
+# Configuration file for the audioens audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# Uncomment cdrom to enable the audio810 driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
-
-#
# play-interrupts sets the number of interrupts per second when playing.
# This affects the resolution of various things, such as sample counts.
# record-interrupts does the same for record interrupts.
#
# These may be tuned to get more accurate information by increasing the
# count. However, the larger the interrupts per second the larger the
-# load on the system. So use this capability cautiously. The audio810
+# load on the system. So use this capability cautiously. The audioens
# driver enforces a maximum and minimum count.
#
# It should also be understood that not all interrupt rates are legal.
# The hardware is restricted to DMA buffers being allocated on certain
-# boundaries. If those boundaries are violated the driver will not be
-# loaded and an error message is entered into the messages log
+# boundaries. If those boundaries are violated then the value specified
+# will be ignored.
#
-play-interrupts=175;
-record-interrupts=175;
+play-interrupts=75;
+record-interrupts=75;
#
-# Uncomment reset-configuration to cause the audio810 driver's state to
+# Uncomment reset-configuration to cause the audioens driver's state to
# be reset to the default when the driver is loaded. Otherwise this state
# is retained across driver unload/reload cycles, but not across reboots.
#
#reset-configuration=1;
-
-#
-# Uncomment ac97-invert-amp to power down/up external amplifier. Most
-# hardware does't need this property. But some devices, such as some
-# Sony Vaio laptops need to set this property to 1 to correct the
-# inverted polarity of the external amplifier device.
-#
-# ac97-invert-amp=1;
diff --git a/usr/src/uts/common/io/audio/drv/audioens/audioens.h b/usr/src/uts/common/io/audio/drv/audioens/audioens.h
new file mode 100644
index 0000000000..6097e076db
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.h
@@ -0,0 +1,210 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Definitions for the Creative/Ensoniq AudioPCI97 driver.
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#ifndef _AUDIOENS_H
+#define _AUDIOENS_H
+
+/* CONCERT PCI-SIG defines */
+#define CONC_PCI_VENDID 0x1274U
+#define CONC_PCI_DEVID 0x1371U
+
+/* Concert97 direct register offset defines */
+#define CONC_bDEVCTL_OFF 0x00 /* Device control/enable */
+#define CONC_bMISCCTL_OFF 0x01 /* Miscellaneous control */
+#define CONC_bGPIO_OFF 0x02 /* General purpose I/O control */
+#define CONC_bJOYCTL_OFF 0x03 /* Joystick control (decode) */
+#define CONC_dSTATUS_OFF 0x04 /* long status register */
+#define CONC_bINTSUMM_OFF 0x07 /* Interrupt summary status */
+#define CONC_bUARTDATA_OFF 0x08 /* UART data R/W - read clears RX int */
+#define CONC_bUARTCSTAT_OFF 0x09 /* UART control and status */
+#define CONC_bUARTTEST_OFF 0x0a /* UART test control reg */
+#define CONC_bMEMPAGE_OFF 0x0c /* Memory page select */
+#define CONC_dSRCIO_OFF 0x10 /* I/O ctl/stat/data for SRC RAM */
+#define CONC_dCODECCTL_OFF 0x14 /* CODEC control - dword read/write */
+#define CONC_wNMISTAT_OFF 0x18 /* Legacy NMI status */
+#define CONC_bNMIENA_OFF 0x1a /* Legacy NMI enable */
+#define CONC_bNMICTL_OFF 0x1b /* Legacy control */
+#define CONC_dSPDIF_OFF 0x1c /* SPDIF status control */
+#define CONC_bSERFMT_OFF 0x20 /* Serial device control */
+#define CONC_bSERCTL_OFF 0x21 /* Serial device format */
+#define CONC_bSKIPC_OFF 0x22 /* DAC skip count reg */
+#define CONC_wDAC1IC_OFF 0x24 /* Synth int count in sample frames */
+#define CONC_wDAC1CIC_OFF 0x26 /* Synth current int count */
+#define CONC_wDAC2IC_OFF 0x28 /* DAC int count in sample frames */
+#define CONC_wDAC2CIC_OFF 0x2a /* DAC current int count */
+#define CONC_wADCIC_OFF 0x2c /* ADC int count in sample frames */
+#define CONC_wADCCIC_OFF 0x2e /* ADC current int count */
+#define CONC_MEMBASE_OFF 0x30 /* Memory window base - 16 byte window */
+
+/* Concert memory page-banked register offset defines */
+#define CONC_dDAC1PADDR_OFF 0x30 /* Synth host frame PCI phys addr */
+#define CONC_wDAC1FC_OFF 0x34 /* Synth host frame count in DWORDS */
+#define CONC_wDAC1CFC_OFF 0x36 /* Synth host current frame count */
+#define CONC_dDAC2PADDR_OFF 0x38 /* DAC host frame PCI phys addr */
+#define CONC_wDAC2FC_OFF 0x3c /* DAC host frame count in DWORDS */
+#define CONC_wDAC2CFC_OFF 0x3e /* DAC host current frame count */
+#define CONC_dADCPADDR_OFF 0x30 /* ADC host frame PCI phys addr */
+#define CONC_wADCFC_OFF 0x34 /* ADC host frame count in DWORDS */
+#define CONC_wADCCFC_OFF 0x36 /* ADC host current frame count */
+
+/* Concert memory page number defines */
+#define CONC_DAC1RAM_PAGE 0x00 /* Synth host/serial I/F RAM */
+#define CONC_DAC2RAM_PAGE 0x04 /* DAC host/serial I/F RAM */
+#define CONC_ADCRAM_PAGE 0x08 /* ADC host/serial I/F RAM */
+#define CONC_DAC1CTL_PAGE 0x0c /* Page bank for synth host control */
+#define CONC_DAC2CTL_PAGE 0x0c /* Page bank for DAC host control */
+#define CONC_ADCCTL_PAGE 0x0d /* Page bank for ADC host control */
+#define CONC_FIFO0_PAGE 0x0e /* page 0 of UART "FIFO" (rx stash) */
+#define CONC_FIFO1_PAGE 0x0f /* page 1 of UART "FIFO" (rx stash) */
+
+/* SPDIF defines - only newer chips */
+#define CONC_SPDIF_CLKACCURACY 0x00000000U /* normal mode */
+#define CONC_SPDIF_SR48KHZ 0x02000000U /* 48KHZ clock, must be set */
+#define CONC_SPDIF_CHNO_MASK 0x00f00000U /* channel number */
+#define CONC_SPDIF_SRCNO_MASK 0x000f0000U /* source number */
+#define CONC_SPDIF_L 0x00008000U /* 0 = commercial original */
+#define CONC_SPDIF_CATCODE 0x00007f00U /* category code */
+#define CONC_SPDIF_EMPHASIS 0x00000008U /* 2 ch, 50/15 usec preemph */
+#define CONC_SPDIF_COPY 0x00000004U /* copy permitted */
+#define CONC_SPDIF_AC3 0x00000002U /* data is not pcm (AC3) */
+
+/* PCM format defines */
+#define CONC_PCM_DAC1_STEREO 0x01
+#define CONC_PCM_DAC1_16BIT 0x02
+#define CONC_PCM_DAC2_STEREO 0x04
+#define CONC_PCM_DAC2_16BIT 0x08
+#define CONC_PCM_ADC_STEREO 0x10
+#define CONC_PCM_ADC_16BIT 0x20
+
+/* Device Control defines */
+#define CONC_DEVCTL_PCICLK_DS 0x01 /* PCI Clock Disable */
+#define CONC_DEVCTL_XTALCLK_DS 0x02 /* Crystal Clock Disable */
+#define CONC_DEVCTL_JSTICK_EN 0x04 /* Joystick Enable */
+#define CONC_DEVCTL_UART_EN 0x08 /* UART Enable */
+#define CONC_DEVCTL_ADC_EN 0x10 /* ADC Enable (record) */
+#define CONC_DEVCTL_DAC2_EN 0x20 /* DAC2 Enable (playback) */
+#define CONC_DEVCTL_DAC1_EN 0x40 /* DAC1 Enabale (synth) */
+
+/* Misc Control defines */
+#define CONC_MISCCTL_PDLEV_D0 0x00 /* These bits reflect the */
+#define CONC_MISCCTL_PDLEV_D1 0x01 /* power down state of */
+#define CONC_MISCCTL_PDLEV_D2 0x02 /* the part */
+#define CONC_MISCCTL_PDLEV_D3 0x03 /* */
+#define CONC_MISCCTL_CCBINTRM_EN 0x04 /* CCB module interrupt mask */
+
+#define CONC_MISCCTL_SYNC_RES 0x40 /* for AC97 warm reset */
+
+/* Serial Control defines */
+#define CONC_SERCTL_DAC1IE 0x01 /* playback interrupt enable P1_INT_EN */
+#define CONC_SERCTL_DAC2IE 0x02 /* playback interrupt enable P2_INT_EN */
+#define CONC_SERCTL_ADCIE 0x04 /* record interrupt enable R1_INT_EN */
+#define CONC_SERCTL_DAC1PAUSE 0x08 /* playback pause */
+#define CONC_SERCTL_DAC2PAUSE 0x10 /* playback pause */
+#define CONC_SERCTL_ADCLOOP 0x80
+#define CONC_SERCTL_DAC2LOOP 0x40
+#define CONC_SERCTL_DAC1LOOP 0x20
+
+/* Interrupt Status defines */
+#define CONC_STATUS_ADCINT 0x00000001 /* A/D interrupt pending */
+#define CONC_STATUS_DAC2INT 0x00000002 /* DAC2 interrupt pending */
+#define CONC_STATUS_DAC1INT 0x00000004 /* DAC1 interrupt pending */
+#define CONC_STATUS_UARTINT 0x00000008 /* UART interrupt pending */
+#define CONC_STATUS_PENDING 0x80000000 /* any interrupt pending */
+#define CONC_STATUS_SPDIF_MASK 0x18000000
+#define CONC_STATUS_SPDIF_P1P2 0x00000000
+#define CONC_STATUS_SPDIF_P1 0x08000000
+#define CONC_STATUS_SPDIF_P2 0x10000000
+#define CONC_STATUS_SPDIF_REC 0x18000000
+#define CONC_STATUS_ECHO 0x04000000
+#define CONC_STATUS_SPKR_MASK 0x03000000
+#define CONC_STATUS_SPKR_2CH 0x00000000
+#define CONC_STATUS_SPKR_4CH 0x01000000
+#define CONC_STATUS_SPKR_P1 0x02000000
+#define CONC_STATUS_SPKR_P2 0x03000000
+#define CONC_STATUS_EN_SPDIF 0x00040000
+
+/* JOYCTL register defines */
+#define CONC_JOYCTL_200 0x00
+#define CONC_JOYCTL_208 0x01
+#define CONC_JOYCTL_210 0x02
+#define CONC_JOYCTL_218 0x03
+#define CONC_JOYCTL_SPDIFEN_B 0x04
+#define CONC_JOYCTL_RECEN_B 0x08
+
+/* UARTCSTAT register masks */
+#define CONC_UART_RXRDY 0x01
+#define CONC_UART_TXRDY 0x02
+#define CONC_UART_TXINT 0x04
+#define CONC_UART_RXINT 0x80
+
+#define CONC_UART_CTL 0x03
+#define CONC_UART_TXINTEN 0x20
+#define CONC_UART_RXINTEN 0x80
+
+/* defines for the CONCERT97 Sample Rate Converters */
+
+/* register/base equates for the SRC RAM */
+#define SRC_DAC1_FIFO 0x00
+#define SRC_DAC2_FIFO 0x20
+#define SRC_ADC_FIFO 0x40
+#define SRC_ADC_VOL_L 0x6c
+#define SRC_ADC_VOL_R 0x6d
+#define SRC_DAC1_BASE 0x70
+#define SRC_DAC2_BASE 0x74
+#define SRC_ADC_BASE 0x78
+#define SRC_DAC1_VOL_L 0x7c
+#define SRC_DAC1_VOL_R 0x7d
+#define SRC_DAC2_VOL_L 0x7e
+#define SRC_DAC2_VOL_R 0x7f
+
+#define SRC_TRUNC_N_OFF 0x00
+#define SRC_INT_REGS_OFF 0x01
+#define SRC_ACCUM_FRAC_OFF 0x02
+#define SRC_VFREQ_FRAC_OFF 0x03
+
+
+/* miscellaneous control defines */
+#define SRC_IOPOLL_COUNT 0x20000UL
+#define SRC_WENABLE (1UL << 24)
+#define SRC_BUSY (1UL << 23)
+#define SRC_DISABLE (1UL << 22)
+#define SRC_DAC1FREEZE (1UL << 21)
+#define SRC_DAC2FREEZE (1UL << 20)
+#define SRC_ADCFREEZE (1UL << 19)
+#define SRC_CTLMASK 0x00780000UL
+
+#endif /* _AUDIOENS_H */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c
index 7ea73cd696..0b3b5dfee8 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c
@@ -23,66 +23,23 @@
* Use is subject to license terms.
*/
-/*
- * The audiohd driver provides functionality for playing audio on
- * the nVidia MCP55 high-definition audio controller with Realtek
- * ALC88x codec. This enables basic audio functionality for Sun's
- * 2006 line of new workstations and PCs, which are MCP55-based
- * with Realtek ALC88x codec. Due to short time constraints on the
- * production of this software kernel module, we used a minimalistic
- * approach to provide audio functionality for just the nVidia HD
- * audio controller and the Realtek ALC880, ALC883 and ALC885
- * codecs. Certainly, the driver may work and attach to Intel
- * High-Definition audio devices which have same the Realtek Codec.
- *
- * HD audio supports multiple streams, each of which can act as an
- * independent device. However, we just support two streams: the
- * first input stream for recording, and the first output stream
- * for playback. And because ALC880 doesn't support sample rates
- * below 48K (except 44.1K), this driver just supports 48K sample
- * rate in compatible mode.
- *
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/conf.h>
-#include <sys/devops.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
#include <sys/note.h>
#include <sys/pci.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/audiohd.h>
-#include <sys/audio/impl/audiohd_impl.h>
+#include "audiohd.h"
+#define DEFINTS 175
+#define DRVNAME "audiohd"
/*
* Module linkage routines for the kernel
*/
-static int audiohd_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
+
static int audiohd_attach(dev_info_t *, ddi_attach_cmd_t);
static int audiohd_detach(dev_info_t *, ddi_detach_cmd_t);
static int audiohd_quiesce(dev_info_t *);
static int audiohd_resume(audiohd_state_t *);
static int audiohd_suspend(audiohd_state_t *);
-/*
- * Entry point routine prototypes
- */
-static int audiohd_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audiohd_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audiohd_ad_start_play(audiohdl_t, int);
-static int audiohd_ad_start_record(audiohdl_t, int);
-static void audiohd_ad_pause_play(audiohdl_t, int);
-static void audiohd_ad_stop_play(audiohdl_t, int);
-static void audiohd_ad_stop_record(audiohdl_t, int);
-
/* interrupt handler */
static uint_t audiohd_intr(caddr_t);
@@ -99,68 +56,26 @@ static void audiohd_stop_dma(audiohd_state_t *);
static void audiohd_disable_intr(audiohd_state_t *);
static int audiohd_create_codec(audiohd_state_t *);
static void audiohd_build_path(audiohd_state_t *);
-static int audiohd_init_ports(audiohd_state_t *);
static void audiohd_destroy_codec(audiohd_state_t *);
-static int audiohd_reset_stream(audiohd_state_t *, int);
-static int audiohd_fill_pbuf(audiohd_state_t *);
-static void audiohd_refill_pbuf(audiohd_state_t *);
-static void audiohd_preset_rbuf(audiohd_state_t *);
-static void audiohd_get_rbuf(audiohd_state_t *);
-static int audiohd_set_gain(audiohd_state_t *, int, int, int);
-static int audiohd_set_port(audiohd_state_t *, int, int);
-static void audiohd_mute_outputs(audiohd_state_t *, boolean_t);
-static int audiohd_set_monitor_gain(audiohd_state_t *, int);
static int audiohd_alloc_dma_mem(audiohd_state_t *, audiohd_dma_t *,
size_t, ddi_dma_attr_t *, uint_t);
static void audiohd_finish_output_path(hda_codec_t *codec);
-static void audiohd_finish_input_path(hda_codec_t *codec);
-static void audiohd_finish_monitor_path(hda_codec_t *codec);
-
static uint32_t audioha_codec_verb_get(void *, uint8_t,
uint8_t, uint16_t, uint8_t);
static uint32_t audioha_codec_4bit_verb_get(void *, uint8_t,
uint8_t, uint16_t, uint16_t);
static int audiohd_reinit_hda(audiohd_state_t *);
-static void audiohd_set_busy(audiohd_state_t *);
-static void audiohd_set_idle(audiohd_state_t *);
static int audiohd_response_from_codec(audiohd_state_t *statep,
uint32_t *resp, uint32_t *respex);
static void audiohd_restore_codec_gpio(audiohd_state_t *statep);
static void audiohd_change_speaker_state(audiohd_state_t *statep, int on);
-/* anchor for soft state structures */
-static void *audiohd_statep;
-
-/* driver name */
-static char *audiohd_name = AUDIOHD_NAME;
-
-static uint_t audiohd_mixer_srs[] = {
- AUDIOHD_SAMPR5510, AUDIOHD_SAMPR48000, 0
-};
-
-static uint_t audiohd_comp_srs[] = {
- AUDIOHD_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audiohd_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audiohd_mixer_srs
-};
-
-static am_ad_sample_rates_t audiohd_comp_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audiohd_comp_srs
-};
-
-static uint_t audiohd_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audiohd_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
+static int audiohd_allocate_port(audiohd_state_t *statep);
+static void audiohd_free_port(audiohd_state_t *statep);
+static void audiohd_restore_path(audiohd_state_t *statep);
+static int audiohd_add_controls(audiohd_state_t *statep);
+static void audiohd_get_channels(audiohd_state_t *statep);
+static void audiohd_init_path(audiohd_state_t *statep);
+static void audiohd_del_controls(audiohd_state_t *statep);
static ddi_device_acc_attr_t hda_dev_accattr = {
DDI_DEVICE_ATTR_V0,
@@ -168,222 +83,120 @@ static ddi_device_acc_attr_t hda_dev_accattr = {
DDI_STRICTORDER_ACC
};
-/* STREAMS driver id and limit value struct */
-static struct module_info audiohd_modinfo = {
- AUDIOHD_IDNUM,
- AUDIOHD_NAME,
- AUDIOHD_MINPACKET,
- AUDIOHD_MAXPACKET,
- AUDIOHD_HIWATER,
- AUDIOHD_LOWATER,
-};
-
-/* STREAMS queue processing procedures structures for read queue */
-static struct qinit audiohd_rqueue = {
- audio_sup_rput,
- audio_sup_rsvc,
- audio_sup_open,
- audio_sup_close,
- NULL,
- &audiohd_modinfo,
+static const char *audiohd_dtypes[] = {
+ AUDIO_PORT_LINEOUT,
+ AUDIO_PORT_SPEAKER,
+ AUDIO_PORT_HEADPHONES,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_SPDIFOUT,
+ AUDIO_PORT_DIGOUT,
+ AUDIO_PORT_MODEM,
+ AUDIO_PORT_HANDSET,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_AUX1IN,
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_PHONE,
+ AUDIO_PORT_SPDIFIN,
+ AUDIO_PORT_DIGIN,
+ AUDIO_PORT_NONE, /* reserved port, don't use */
+ AUDIO_PORT_OTHER,
NULL,
};
-/* STREAMS queue processing procedures structures for write queue */
-static struct qinit audiohd_wqueue = {
- audio_sup_wput,
- audio_sup_wsvc,
- NULL,
- NULL,
- NULL,
- &audiohd_modinfo,
- NULL
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audiohd_streamtab = {
- &audiohd_rqueue,
- &audiohd_wqueue,
- NULL,
- NULL,
-};
-
-/* Entry points structure */
-static struct cb_ops audiohd_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audiohd_streamtab, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audiohd_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audiohd_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify */
- nulldev, /* devo_probe */
- audiohd_attach, /* devo_attach */
- audiohd_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audiohd_cb_ops, /* devo_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- audiohd_quiesce, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audiohd_modldrv = {
- &mod_driverops, /* drv_modops */
- AUDIOHD_MOD_NAME, /* drv_linkinfo */
- &audiohd_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audiohd_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audiohd_modldrv, /* ml_linkage */
- NULL /* NULL */
-};
-
-
-/*
- * Audio driver ops vector for mixer
- */
-static am_ad_entry_t audiohd_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audiohd_ad_set_config, /* ad_set_config() */
- audiohd_ad_set_format, /* ad_set_format() */
- audiohd_ad_start_play, /* ad_start_play() */
- audiohd_ad_pause_play, /* ad_pause_play() */
- audiohd_ad_stop_play, /* ad_stop_play() */
- audiohd_ad_start_record, /* ad_start_record() */
- audiohd_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-static const uint_t g_outport[] = {
- AUDIO_LINE_OUT,
- AUDIO_SPEAKER,
- AUDIO_HEADPHONE,
- AUDIO_AUX1_OUT,
- AUDIO_AUX2_OUT
+enum {
+ CTL_VOLUME = 0,
+ CTL_FRONT,
+ CTL_SPEAKER,
+ CTL_HEADPHONE,
+ CTL_REAR,
+ CTL_CENTER,
+ CTL_SURROUND,
+ CTL_LFE,
+ CTL_IGAIN,
+ CTL_LINEIN,
+ CTL_MIC,
+ CTL_CD,
+ CTL_MONGAIN,
+ CTL_MONSRC,
+ CTL_RECSRC
};
-
-int
-_init(void)
-{
- int error;
-
- if ((error = ddi_soft_state_init(&audiohd_statep,
- sizeof (audiohd_state_t), 1)) != 0) {
- return (error);
- }
-
- if ((error = mod_install(&audiohd_modlinkage)) != 0) {
- ddi_soft_state_fini(&audiohd_statep);
- }
-
- return (error);
-
-} /* _init() */
-
-
-int
-_fini(void)
-{
- int error;
-
- if ((error = mod_remove(&audiohd_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audiohd_statep);
-
- return (0);
-
-} /* _fini() */
-
-
-int
-_info(struct modinfo *modinfop)
+static void
+audiohd_set_chipset_info(audiohd_state_t *statep)
{
- int error;
+ uint32_t devid;
+ const char *name;
+ const char *vers;
- error = mod_info(&audiohd_modlinkage, modinfop);
+ devid = pci_config_get16(statep->hda_pci_handle, PCI_CONF_VENID);
+ devid <<= 16;
+ devid |= pci_config_get16(statep->hda_pci_handle, PCI_CONF_DEVID);
- return (error);
-
-} /* _info() */
-
-
-int
-audiohd_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audiohd_state_t *statep;
- int instance;
- int error;
+ name = AUDIOHD_DEV_CONFIG;
+ vers = AUDIOHD_DEV_VERSION;
- ATRACE("in audiohd_getinfo()", dip);
- error = DDI_FAILURE;
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((statep = ddi_get_soft_state(audiohd_statep,
- instance)) != NULL) {
- *result = statep->hda_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
+ switch (devid) {
+ case 0x80862668:
+ name = "Intel HD Audio";
+ vers = "ICH6";
break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
+ case 0x808627d8:
+ name = "Intel HD Audio";
+ vers = "ICH7";
break;
-
- default:
+ case 0x8086284b:
+ name = "Intel HD Audio";
+ vers = "ICH8";
+ break;
+ case 0x8086293e:
+ name = "Intel HD Audio";
+ vers = "ICH9";
+ break;
+ case 0x10de0371:
+ name = "NVIDIA HD Audio";
+ vers = "MCP55";
+ break;
+ case 0x10de03f0:
+ name = "NVIDIA HD Audio";
+ vers = "MCP61A";
+ break;
+ case 0x10de026c:
+ name = "NVIDIA HD Audio";
+ vers = "6151";
+ break;
+ case 0x10de03e4:
+ name = "NVIDIA HD Audio";
+ vers = "MCP61";
+ break;
+ case 0x10de044a:
+ name = "NVIDIA HD Audio";
+ vers = "MCP65";
+ break;
+ case 0x10de055c:
+ name = "NVIDIA HD Audio";
+ vers = "MCP67";
+ break;
+ case 0x1002437b:
+ name = "ATI HD Audio";
+ vers = "SB450";
+ break;
+ case 0x10024383:
+ name = "ATI HD Audio";
+ vers = "SB600";
+ break;
+ case 0x11063288:
+ name = "VIA HD Audio";
+ vers = "HDA";
break;
}
+ /* set device information */
+ audio_dev_set_description(statep->adev, name);
+ audio_dev_set_version(statep->adev, vers);
+}
- return (error);
-
-} /* audiohd_getinfo() */
-
-/*
- * audiohd_attach()
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-int
+static int
audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
- audio_sup_reg_data_t data;
audiohd_state_t *statep;
int instance;
@@ -393,8 +206,7 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
break;
case DDI_RESUME:
- ATRACE("audiohd_attach() DDI_RESUME", NULL);
- statep = ddi_get_soft_state(audiohd_statep, instance);
+ statep = ddi_get_driver_private(dip);
ASSERT(statep != NULL);
return (audiohd_resume(statep));
@@ -404,93 +216,54 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
/* High-level interrupt isn't supported by this driver */
if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() unsupported high level interrupt",
- audiohd_name, instance);
+ cmn_err(CE_WARN,
+ "unsupported high level interrupt");
return (DDI_FAILURE);
}
- if (ddi_soft_state_zalloc(audiohd_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() softstate alloc failed",
- audiohd_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() no softstate",
- audiohd_name, instance);
- goto err_attach_exit1;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->hda_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() audio_sup_register() failed",
- audiohd_name, instance);
- goto err_attach_exit2;
- }
-
- /* save private state */
- audio_sup_set_private(statep->hda_ahandle, statep);
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
/* interrupt cookie and initialize mutex */
if (audiohd_init_state(statep, dip) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() audiohd_init_state failed");
+ cmn_err(CE_NOTE,
+ "audiohd_init_state failed");
goto err_attach_exit3;
}
/* Set PCI command register to enable bus master and memeory I/O */
if (audiohd_init_pci(statep, &hda_dev_accattr) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init pci regs");
+ audio_dev_warn(statep->adev,
+ "couldn't init pci regs");
goto err_attach_exit4;
}
+ audiohd_set_chipset_info(statep);
+
if (audiohd_init_controller(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init controller");
+ audio_dev_warn(statep->adev,
+ "couldn't init controller");
goto err_attach_exit5;
}
if (audiohd_create_codec(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't create codec");
+ audio_dev_warn(statep->adev,
+ "couldn't create codec");
goto err_attach_exit6;
}
audiohd_build_path(statep);
- if (audiohd_init_ports(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init ports");
- goto err_attach_exit7;
- }
-
- /*
- * This is a workaround. ALC880 doesn't support 8k sample rate,
- * but solaris requires hardware to be set to 8K by default. This
- * checking is performed in am_attach(). To overcome this flaw,
- * we have to set default sample to 48K before calling am_attach().
- * After we fix bug 6363625 in near future, we will change this
- * and set sample rate to 8K by default.
- */
- statep->hda_info_defaults.play.sample_rate = audiohd_comp_srs[0];
- statep->hda_info_defaults.record.sample_rate = audiohd_comp_srs[0];
-
- if (am_attach(statep->hda_ahandle, cmd, &statep->hda_ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!attach() am_attach() failed");
+ audiohd_get_channels(statep);
+ if (audiohd_allocate_port(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "allocate port failure");
goto err_attach_exit7;
}
-
+ audiohd_init_path(statep);
/* set up kernel statistics */
- if ((statep->hda_ksp = kstat_create(AUDIOHD_NAME, instance,
- AUDIOHD_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ if ((statep->hda_ksp = kstat_create(DRVNAME, instance,
+ DRVNAME, "controller", KSTAT_TYPE_INTR, 1,
KSTAT_FLAG_PERSISTENT)) != NULL) {
kstat_install(statep->hda_ksp);
}
@@ -502,23 +275,38 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
if (ddi_add_intr(dip, 0, &statep->hda_intr_cookie,
(ddi_idevice_cookie_t *)NULL, audiohd_intr, (caddr_t)statep) !=
DDI_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!attach() bad interrupt specification ");
+ audio_dev_warn(statep->adev,
+ "bad interrupt specification ");
goto err_attach_exit8;
}
+
+ /*
+ * Register audio controls.
+ */
+ if (audiohd_add_controls(statep) == DDI_FAILURE) {
+ audio_dev_warn(statep->adev,
+ "unable to allocate controls");
+ goto err_attach_exit9;
+ }
+ if (audio_dev_register(statep->adev) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "unable to register with framework");
+ goto err_attach_exit9;
+ }
ddi_report_dev(dip);
/* enable interrupt */
AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
AUDIOHD_INTCTL_BIT_GIE |
- AUDIOHD_INTCTL_BIT_CIE |
AUDIOHD_INTCTL_BIT_SIE);
return (DDI_SUCCESS);
+err_attach_exit9:
+ audiohd_del_controls(statep);
err_attach_exit8:
if (statep->hda_ksp)
kstat_delete(statep->hda_ksp);
- (void) am_detach(statep->hda_ahandle, DDI_DETACH);
+ audiohd_free_port(statep);
err_attach_exit7:
audiohd_destroy_codec(statep);
@@ -531,40 +319,23 @@ err_attach_exit5:
err_attach_exit4:
mutex_destroy(&statep->hda_mutex);
- cv_destroy(&statep->hda_cv);
err_attach_exit3:
- (void) audio_sup_unregister(statep->hda_ahandle);
+ (void) audio_dev_unregister(statep->adev);
err_attach_exit2:
err_attach_exit1:
- ddi_soft_state_free(audiohd_statep, instance);
return (DDI_FAILURE);
+}
-} /* audiohd_attach() */
-
-/*
- * audiohd_detach()
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-int
+static int
audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
audiohd_state_t *statep;
- int instance;
- instance = ddi_get_instance(dip);
-
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- return (DDI_FAILURE);
- }
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
switch (cmd) {
case DDI_DETACH:
@@ -576,6 +347,8 @@ audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
default:
return (DDI_FAILURE);
}
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
mutex_enter(&statep->hda_mutex);
audiohd_stop_dma(statep);
@@ -584,1143 +357,1488 @@ audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
ddi_remove_intr(dip, 0, statep->hda_intr_cookie);
if (statep->hda_ksp)
kstat_delete(statep->hda_ksp);
- (void) am_detach(statep->hda_ahandle, DDI_DETACH);
+ audiohd_free_port(statep);
audiohd_destroy_codec(statep);
+ audiohd_del_controls(statep);
audiohd_fini_controller(statep);
audiohd_fini_pci(statep);
mutex_destroy(&statep->hda_mutex);
- cv_destroy(&statep->hda_cv);
- (void) audio_sup_unregister(statep->hda_ahandle);
- ddi_soft_state_free(audiohd_statep, instance);
-
+ if (statep->adev)
+ audio_dev_free(statep->adev);
+ kmem_free(statep, sizeof (*statep));
return (DDI_SUCCESS);
+}
+
+static struct dev_ops audiohd_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audiohd_attach, /* attach */
+ audiohd_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audiohd_quiesce, /* quiesce */
+};
-} /* audiohd_detach() */
+static struct modldrv audiohd_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "AudioHD", /* linkinfo */
+ &audiohd_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audiohd_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiohd_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audiohd_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audiohd_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
/*
- * quiesce(9E) entry point.
- *
- * This function is called when the system is single-threaded at high
- * PIL with preemption disabled. Therefore, this function must not be
- * blocked.
- *
- * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
- * DDI_FAILURE indicates an error condition and should almost never happen.
+ * Audio routines
*/
+
static int
-audiohd_quiesce(dev_info_t *dip)
+audiohd_engine_format(void *arg)
{
- audiohd_state_t *statep;
- int instance;
+ _NOTE(ARGUNUSED(arg));
- instance = ddi_get_instance(dip);
+ return (AUDIO_FORMAT_S16_LE);
+}
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- return (DDI_SUCCESS);
- }
+static int
+audiohd_engine_channels(void *arg)
+{
+ audiohd_port_t *port = arg;
- audiohd_stop_dma(statep);
- audiohd_disable_intr(statep);
+ return (port->nchan);
+}
- return (DDI_SUCCESS);
+static int
+audiohd_engine_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
}
+
/*
- * audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
- * Description:
- * This routine is used to change the widget power betwen D0 and D2.
- * D0 is fully on; D2 allows the lowest possible power consuming state
- * from which it can return to the fully on state: D0.
+ * get the max channels the hardware supported
*/
static void
-audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+audiohd_get_channels(audiohd_state_t *statep)
+{
+ int i;
+ uint8_t maxp, assoc;
+
+ maxp = 2;
+ for (i = 0; i < AUDIOHD_MAX_ASSOC; i++) {
+ if (maxp < statep->chann[i]) {
+ maxp = statep->chann[i];
+ assoc = i;
+ }
+ }
+ statep->pchan = maxp;
+ statep->assoc = assoc;
+ /* for record, support stereo so far */
+ statep->rchan = 2;
+}
+static void
+audiohd_init_play_path(audiohd_path_t *path)
{
+ int i;
+ uint32_t ctrl;
+ uint8_t ctrl8;
+ uint8_t nchann;
+ audiohd_widget_t *widget;
+ audiohd_pin_t *pin;
+ wid_t wid;
+ audiohd_pin_color_t color;
+
+ audiohd_state_t *statep = path->statep;
+ hda_codec_t *codec = path->codec;
+
+ /* enable SPDIF output */
+ for (i = 0; i < path->pin_nums; i++) {
+ wid = path->pin_wid[i];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPDIF_OUT) {
+ ctrl = audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_GET_SPDIF_CTL,
+ 0);
+ ctrl |= AUDIOHD_SPDIF_ON;
+ ctrl8 = ctrl &
+ AUDIOHD_SPDIF_MASK;
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_SPDIF_LCL,
+ ctrl8);
+ }
+ }
+ wid = path->pin_wid[0];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+
+ /* two channels supported */
+ if (pin->device == DTYPE_SPEAKER ||
+ pin->assoc != statep->assoc) {
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ statep->port[PORT_DAC]->index <<
+ AUDIOHD_PLAY_TAG_OFF);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 |
+ statep->pchan - 1);
+ /* multichannel supported */
+ } else {
+ color = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ switch (color) {
+ case AUDIOHD_PIN_BLACK:
+ nchann = statep->pchan - 2;
+ break;
+ case AUDIOHD_PIN_ORANGE:
+ nchann = 2;
+ break;
+ case AUDIOHD_PIN_GREY:
+ nchann = 4;
+ break;
+ case AUDIOHD_PIN_GREEN:
+ nchann = 0;
+ break;
+ default:
+ nchann = 0;
+ break;
+ }
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ statep->port[PORT_DAC]->index <<
+ AUDIOHD_PLAY_TAG_OFF |
+ nchann);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 |
+ statep->pchan - 1);
+ }
+}
+static void
+audiohd_init_record_path(audiohd_path_t *path)
+{
+ audiohd_state_t *statep = path->statep;
+ hda_codec_t *codec = path->codec;
int i;
wid_t wid;
- hda_codec_t *codec;
+ audiohd_pin_t *pin;
audiohd_widget_t *widget;
- /* Change power to D2 */
- if (off) {
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- for (wid = codec->first_wid; wid <= codec->last_wid;
- wid++) {
- widget = codec->widget[wid];
- if (widget->widget_cap &
- AUDIOHD_WIDCAP_PWRCTRL) {
- (void) audioha_codec_verb_get(statep,
- codec->index, wid,
- AUDIOHDC_VERB_SET_POWER_STATE,
- AUDIOHD_PW_D2);
- }
- }
+ for (i = 0; i < path->pin_nums; i++) {
+ wid = path->pin_wid[i];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ /*
+ * Since there is no SPDIF input device available for test,
+ * we will use this code in the future to support SPDIF input
+ */
+#if 0
+ if (pin->device == DTYPE_SPDIF_IN) {
+ ctrl = audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_GET_SPDIF_CTL,
+ 0);
+ ctrl |= AUDIOHD_SPDIF_ON;
+ ctrl8 = ctrl &
+ AUDIOHD_SPDIF_MASK;
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_SPDIF_LCL,
+ ctrl8);
+ statep->inmask |= (1U << DTYPE_SPDIF_IN);
}
- /* Change power to D0 */
- } else {
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- for (wid = codec->first_wid; wid <= codec->last_wid;
- wid++) {
- widget = codec->widget[wid];
- if (widget->widget_cap &
- AUDIOHD_WIDCAP_PWRCTRL) {
- (void) audioha_codec_verb_get(statep,
- codec->index, wid,
- AUDIOHDC_VERB_SET_POWER_STATE,
- AUDIOHD_PW_D0);
- }
- }
+#endif
+ if (pin->device == DTYPE_MIC_IN) {
+ if (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_FIXED)
+ statep->port[PORT_ADC]->index = path->tag;
+ }
+ if ((pin->device == DTYPE_LINE_IN) ||
+ (pin->device == DTYPE_CD) ||
+ (pin->device == DTYPE_MIC_IN)) {
+ statep->inmask |= (1U << pin->device);
}
}
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ path->tag <<
+ AUDIOHD_REC_TAG_OFF);
+ (void) audioha_codec_4bit_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 | statep->rchan - 1);
+
}
-/*
- * audiohd_restore_path()
- * Description:
- * This routine is used to restore the path on the codec.
- */
static void
-audiohd_restore_path(audiohd_state_t *statep)
+audiohd_init_path(audiohd_state_t *statep)
{
- int i;
- hda_codec_t *codec;
+ int i;
+ audiohd_path_t *path;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
continue;
- audiohd_finish_output_path(statep->codec[i]);
- audiohd_finish_input_path(statep->codec[i]);
- audiohd_finish_monitor_path(statep->codec[i]);
+ switch (path->path_type) {
+ case PLAY:
+ audiohd_init_play_path(path);
+ break;
+ case RECORD:
+ audiohd_init_record_path(path);
+ break;
+ default:
+ break;
+ }
}
+ statep->in_port = 0;
}
-/*
- * restore_play_and_record()
- */
-static void
-audiohd_restore_play_and_record(audiohd_state_t *statep)
+static int
+audiohd_reset_port(audiohd_port_t *port)
{
- uint64_t sbd_phys_addr;
- uint_t regbase;
+ uint16_t regbase;
+ audiohd_state_t *statep;
+ uint8_t bTmp;
+ int i;
+
+ regbase = port->regoff;
+ statep = port->statep;
+
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ /* stop stream */
+ bTmp &= ~AUDIOHD_REG_RIRBSIZE;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ /* wait 40us for stream to stop as HD spec */
+ drv_usecwait(40);
+
+ /* reset stream */
+ bTmp |= AUDIOHDR_SD_CTL_SRST;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
+ /* Empirical testing time, which works well */
+ drv_usecwait(50);
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ bTmp &= AUDIOHDR_SD_CTL_SRST;
+ if (bTmp)
+ break;
+ }
+
+ if (!bTmp) {
+ audio_dev_warn(statep->adev, "Failed to reset stream %d",
+ port->index);
+ return (AUDIO_FAILURE);
+ }
+
+ /* Empirical testing time, which works well */
+ drv_usecwait(300);
+
+ /* exit reset stream */
+ bTmp &= ~AUDIOHDR_SD_CTL_SRST;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
+ /* Empircal testing time */
+ drv_usecwait(50);
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ bTmp &= AUDIOHDR_SD_CTL_SRST;
+ if (!bTmp)
+ break;
+ }
+
+ if (bTmp) {
+ audio_dev_warn(statep->adev,
+ "Failed to exit reset state for"
+ " stream %d, bTmp=0x%02x", port->index, bTmp);
+ return (AUDIO_FAILURE);
+ }
- regbase = statep->hda_play_regbase;
- sbd_phys_addr = statep->hda_dma_play_bd.ad_paddr;
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
+ (uint32_t)port->bdl_paddr);
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
+ (uint32_t)(port->bdl_paddr >> 32));
AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
AUDIOHD_BDLE_NUMS - 1);
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS);
+ port->samp_size * AUDIOHD_BDLE_NUMS);
AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_play_format);
+ port->format << 4 | port->nchan - 1);
/* clear status */
AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
AUDIOHDR_SD_STS_BCIS | AUDIOHDR_SD_STS_FIFOE |
AUDIOHDR_SD_STS_DESE);
- /* set playback stream tag */
+ /* set stream tag */
AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
AUDIOHD_PLAY_CTL_OFF,
- (statep->hda_play_stag) << AUDIOHD_PLAY_TAG_OFF);
-
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_SRUN);
- }
+ (port->index) << AUDIOHD_PLAY_TAG_OFF);
- regbase = statep->hda_record_regbase;
- sbd_phys_addr = statep->hda_dma_record_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_record_format);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS);
+ return (AUDIO_SUCCESS);
+}
+static int
+audiohd_engine_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
+ _NOTE(ARGUNUSED(flag));
- /* set stream tag to 1 */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_REC_CTL_OFF,
- statep->hda_record_stag << AUDIOHD_REC_TAG_OFF);
+ mutex_enter(&statep->hda_mutex);
+ (void) audiohd_reset_port(port);
+ mutex_exit(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_SRUN);
- }
+ port->started = B_FALSE;
+ port->count = 0;
+ port->curpos = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = AUDIOHD_BDLE_NUMS;
+ *bufp = port->samp_kaddr;
+ return (0);
}
-/*
- * audiohd_reset_pins_ur_cap()
- * Description:
- * Enable the unsolicited response of the pins which have the unsolicited
- * response capability
- */
+
static void
-audiohd_reset_pins_ur_cap(audiohd_state_t *statep)
+audiohd_start_port(audiohd_port_t *port)
{
- hda_codec_t *codec;
- audiohd_pin_t *pin;
- audiohd_widget_t *widget;
- uint32_t urctrl;
- int i;
+ audiohd_state_t *statep = port->statep;
- for (i = 0; i <= AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- pin = codec->first_pin;
- while (pin) {
- /* enable the unsolicited response of the pin */
- widget = codec->widget[pin->wid];
- if ((widget->widget_cap &
- (AUDIOHD_URCAP_MASK) &&
- (pin->cap & AUDIOHD_DTCCAP_MASK)) &&
- ((pin->device == DTYPE_LINEOUT) ||
- (pin->device == DTYPE_SPDIF_OUT) ||
- (pin->device == DTYPE_HP_OUT) ||
- (pin->device == DTYPE_MIC_IN))) {
- urctrl = (uint8_t)(1 <<
- (AUDIOHD_UR_ENABLE_OFF - 1));
- urctrl |= (pin->wid & AUDIOHD_UR_TAG_MASK);
- (void) audioha_codec_verb_get(statep,
- codec->index,
- pin->wid,
- AUDIOHDC_VERB_SET_URCTRL, urctrl);
- }
- pin = pin->next;
- }
+ ASSERT(mutex_owned(&statep->hda_mutex));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
}
+
+ /* Enable interrupt and start DMA */
+ AUDIOHD_REG_SET8(port->regoff + AUDIOHD_SDREG_OFFSET_CTL,
+ AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
}
+
static void
-audiohd_restore_codec_gpio(audiohd_state_t *statep)
+audiohd_stop_port(audiohd_port_t *port)
{
- int i;
- wid_t wid;
- hda_codec_t *codec;
-
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- wid = codec->wid_afg;
-
- /*
- * GPIO controls which are laptop specific workarounds and
- * might be changed. Some laptops use GPIO, so we need to
- * enable and set the GPIO correctly.
- */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DIREC, AUDIOHDC_GPIO_DIRECT);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
-
- /* power-up audio function group */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_POWER_STATE, 0);
+ audiohd_state_t *statep = port->statep;
+ ASSERT(mutex_owned(&statep->hda_mutex));
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
}
+ AUDIOHD_REG_SET8(port->regoff + AUDIOHD_SDREG_OFFSET_CTL, 0);
}
-/*
- * audiohd_resume()
- */
+
static int
-audiohd_resume(audiohd_state_t *statep)
+audiohd_engine_start(void *arg)
{
- uint_t regbase;
- uint8_t rirbsts;
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
mutex_enter(&statep->hda_mutex);
- statep->suspended = B_FALSE;
- /* Restore the hda state */
- if (audiohd_reinit_hda(statep) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_resume() hda reinit failed");
- mutex_exit(&statep->hda_mutex);
- return (DDI_SUCCESS);
+ if (!port->started) {
+ audiohd_start_port(port);
+ port->started = B_TRUE;
+ port->triggered = B_TRUE;
}
- /* reset to enable the capability of unsolicited response for pin */
- audiohd_reset_pins_ur_cap(statep);
- /* Enable interrupt */
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
- AUDIOHD_INTCTL_BIT_GIE |
- AUDIOHD_INTCTL_BIT_SIE);
- /* clear the unsolicited response interrupt */
- rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
- AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
mutex_exit(&statep->hda_mutex);
+ return (0);
+}
- /* Resume playing and recording */
- if (audio_sup_restore_state(statep->hda_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_resume() audioh restore failed");
- audiohd_disable_intr(statep);
- audiohd_stop_dma(statep);
- }
- audiohd_restore_play_and_record(statep);
- /* Enable interrupt and start DMA for play */
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- regbase = statep->hda_play_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
- }
+static void
+audiohd_engine_stop(void *arg)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
- /* Enable interrupt and start DMA for record */
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- regbase = statep->hda_record_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
- }
- /* set widget power to D0 */
- audiohd_change_widget_power_state(statep, AUDIOHD_PW_ON);
mutex_enter(&statep->hda_mutex);
- cv_broadcast(&statep->hda_cv); /* wake up entry points */
+ if (port->started) {
+ audiohd_stop_port(port);
+ }
+ port->started = B_FALSE;
mutex_exit(&statep->hda_mutex);
+}
- return (DDI_SUCCESS);
-} /* audiohd_resume */
+static void
+audiohd_update_port(audiohd_port_t *port)
+{
+ int pos;
+ uint32_t len;
+ audiohd_state_t *statep = port->statep;
-/*
- * audiohd_suspend()
- */
-static int
-audiohd_suspend(audiohd_state_t *statep)
+ pos = AUDIOHD_REG_GET32(port->regoff + AUDIOHD_SDREG_OFFSET_LPIB);
+ pos &= AUDIOHD_POS_MASK;
+ if (pos > port->curpos)
+ len = (pos - port->curpos) & AUDIOHD_POS_MASK;
+ else {
+ len = pos + port->samp_size * AUDIOHD_BDLE_NUMS - port->curpos;
+ len &= AUDIOHD_POS_MASK;
+ }
+ port->curpos += len;
+ if (port->curpos >= port->samp_size * AUDIOHD_BDLE_NUMS)
+ port->curpos -= port->samp_size * AUDIOHD_BDLE_NUMS;
+
+ port->len = len;
+ port->count += len / (port->nchan * 2);
+
+
+}
+
+static uint64_t
+audiohd_engine_count(void *arg)
{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
+ uint64_t val;
+
mutex_enter(&statep->hda_mutex);
- statep->suspended = B_TRUE;
- /* wait for current operations to complete */
- while (statep->hda_busy_cnt != 0)
- cv_wait(&statep->hda_cv, &statep->hda_mutex);
-
- if (audio_sup_save_state(statep->hda_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "audiohd_suspend() audio save failed");
- statep->suspended = B_FALSE;
- cv_broadcast(&statep->hda_cv);
- mutex_exit(&statep->hda_mutex);
- return (DDI_FAILURE);
- }
+ audiohd_update_port(port);
+ val = port->count;
+ mutex_exit(&statep->hda_mutex);
+ return (val);
+}
- /* set widget power to D2 */
- audiohd_change_widget_power_state(statep, AUDIOHD_PW_OFF);
- /* Disable h/w */
- audiohd_disable_intr(statep);
- audiohd_stop_dma(statep);
+static void
+audiohd_engine_close(void *arg)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
+
+ mutex_enter(&statep->hda_mutex);
+ audiohd_stop_port(port);
+ port->started = B_FALSE;
+ port->triggered = B_FALSE;
mutex_exit(&statep->hda_mutex);
+}
- return (DDI_SUCCESS);
-} /* audiohd_suspend */
+static void
+audiohd_engine_sync(void *arg, unsigned nframes)
+{
+ audiohd_port_t *port = arg;
-/*
- * audiohd_disable_pin()
- */
-static int
-audiohd_disable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, port->curpos,
+ port->len, port->sync_dir);
+
+}
+
+static size_t
+audiohd_engine_qlen(void *arg)
{
- AUDIOHD_DISABLE_PIN_OUT(statep, caddr, wid);
- return (AUDIO_SUCCESS);
+ audiohd_port_t *port = arg;
+
+ return (port->fragfr);
}
-/*
- * audiohd_enable_pin()
- */
+audio_engine_ops_t audiohd_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audiohd_engine_open,
+ audiohd_engine_close,
+ audiohd_engine_start,
+ audiohd_engine_stop,
+ audiohd_engine_count,
+ audiohd_engine_format,
+ audiohd_engine_channels,
+ audiohd_engine_rate,
+ audiohd_engine_sync,
+ audiohd_engine_qlen,
+};
+
static int
-audiohd_enable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+audiohd_get_value(void *arg, uint64_t *val)
{
- AUDIOHD_ENABLE_PIN_OUT(statep, caddr, wid);
- return (AUDIO_SUCCESS);
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+
+ mutex_enter(&statep->hda_mutex);
+ *val = pc->val;
+ mutex_exit(&statep->hda_mutex);
+ return (0);
}
-/*
- * audiohd_change_speaker_state()
- */
+
static void
-audiohd_change_speaker_state(audiohd_state_t *statep, int on)
+audiohd_set_output_gain(audiohd_state_t *statep)
{
- hda_codec_t *codec;
- audiohd_ostream_t *ostream;
- audiohd_widget_t *widget;
- audiohd_pin_t *pin;
- int i, j;
-
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i]) {
- codec = statep->codec[i];
- break;
+ int i, j;
+ uint64_t val = statep->controls[CTL_VOLUME]->val;
+ audiohd_path_t *path;
+ uint_t tmp;
+ uint8_t lgain = val;
+ uint8_t rgain = val;
+
+ statep->hda_play_lgain = lgain;
+ statep->hda_play_rgain = rgain;
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type == RECORD)
+ continue;
+ if (path->gain_wid) {
+ tmp = lgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir | tmp);
+ tmp = rgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir | tmp);
+ continue;
}
- }
- if (!codec)
- return;
- if (on) {
- ostream = codec->ostream;
- while (ostream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- widget = codec->widget[ostream->pin_wid[j]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPEAKER) {
- (void) audiohd_enable_pin(statep,
- codec->index, pin->wid);
- }
+ for (j = 0; j < path->pin_nums; j++) {
+ audiohd_widget_t *w;
+ audiohd_pin_t *pin;
+ wid_t wid;
+
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)w->priv;
+ if (pin->gain_wid) {
+ tmp = lgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = rgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
}
- ostream = ostream->next_stream;
}
+ }
+}
- } else {
- ostream = codec->ostream;
- while (ostream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- widget = codec->widget[ostream->pin_wid[j]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPEAKER) {
- (void) audiohd_disable_pin(statep,
- codec->index, pin->wid);
- }
+static void
+audiohd_set_pin_volume(audiohd_state_t *statep, audiohda_device_type_t type)
+{
+ int i, j;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ wid_t wid;
+ audiohd_pin_t *pin;
+ hda_codec_t *codec;
+ uint8_t l, r;
+ uint64_t val;
+ uint_t tmp;
+ audiohd_ctrl_t *control;
+
+ switch (type) {
+ case DTYPE_LINEOUT:
+ control = statep->controls[CTL_FRONT];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_SPEAKER:
+ control = statep->controls[CTL_SPEAKER];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_HP_OUT:
+ control = statep->controls[CTL_HEADPHONE];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_CD:
+ control = statep->controls[CTL_CD];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_LINE_IN:
+ control = statep->controls[CTL_LINEIN];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_MIC_IN:
+ control = statep->controls[CTL_MIC];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ }
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if ((pin->device == type) && pin->gain_wid) {
+ tmp = l * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = r * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
}
- ostream = ostream->next_stream;
}
}
}
-/*
- * audiohd_select_mic()
- *
- * Description:
- * This funciton is used for the recording path which has a selector
- * as the sumwidget. We select the external MIC if it is plugged into the
- * MIC jack, otherwise the internal integrated MIC is selected.
- */
+
+
static void
-audiohd_select_mic(audiohd_state_t *statep, uint8_t index,
-uint8_t id, int select)
+audiohd_set_pin_volume_by_color(audiohd_state_t *statep,
+ audiohd_pin_color_t color)
{
+ int i, j;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ wid_t wid;
+ audiohd_pin_t *pin;
hda_codec_t *codec;
- audiohd_istream_t *istream;
- audiohd_widget_t *widget, *sumwgt;
+ uint8_t l, r;
+ uint64_t val;
+ uint_t tmp;
+ audiohd_pin_color_t clr;
+ audiohd_ctrl_t *control;
+
+ switch (color) {
+ case AUDIOHD_PIN_BLACK:
+ control = statep->controls[CTL_REAR];
+ if (control == NULL)
+ return;
+ val = control->val;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ break;
+ case AUDIOHD_PIN_ORANGE:
+ control = statep->controls[CTL_CENTER];
+ if (control == NULL)
+ return;
+ l = control->val;
+ control = statep->controls[CTL_LFE];
+ if (control == NULL)
+ return;
+ r = control->val;
+ break;
+ case AUDIOHD_PIN_GREY:
+ control = statep->controls[CTL_SURROUND];
+ if (control == NULL)
+ return;
+ val = control->val;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ break;
+ }
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ clr = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ if ((clr == color) && pin->gain_wid) {
+ tmp = l * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = r * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
+ }
+ }
+ }
+}
+
+static int
+audiohd_set_input_pin(audiohd_state_t *statep)
+{
+ uint64_t val;
audiohd_pin_t *pin;
- int i;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ int i, j;
wid_t wid;
- codec = statep->codec[index];
- if (codec == NULL)
- return;
- istream = codec->istream;
- sumwgt = codec->widget[istream->sum_wid];
- while (istream && sumwgt && (sumwgt->type == WTYPE_AUDIO_SEL)) {
- if (select) {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- pin->wid == id &&
- (((pin->config >> AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_JACK)) {
- (void) audioha_codec_verb_get(statep,
- index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
- statep->hda_record_stag = istream->rtag;
- return;
- }
- }
- } else {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
+ val = statep->controls[CTL_RECSRC]->val;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != RECORD)
+ continue;
+ switch ((ddi_ffs(val & 0xffff)) - 1) {
+ case DTYPE_LINE_IN:
+ case DTYPE_MIC_IN:
+ case DTYPE_CD:
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- (((pin->config >> AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)) {
- (void) audioha_codec_verb_get(statep,
- index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
- statep->hda_record_stag = istream->rtag;
- return;
+ if ((1U << pin->device) == val) {
+ AUDIOHD_ENABLE_PIN_IN(statep,
+ path->codec->index,
+ pin->wid);
+ statep->in_port = pin->device;
+ } else if (statep->in_port == pin->device) {
+ AUDIOHD_DISABLE_PIN_IN(statep,
+ path->codec->index,
+ pin->wid);
}
}
- }
- istream = istream->next_stream;
- if (istream == NULL)
break;
- sumwgt = codec->widget[istream->sum_wid];
+ default:
+ break;
+ }
+ break;
}
- /*
- * If the input istream > 1, we should set the the record stream tag
- * repectively. All the input streams sharing one tag may make the
- * record sound distorted.
- */
- if (codec->nistream > 1) {
- istream = codec->istream;
- while (istream) {
- if (select) {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- pin->wid == id &&
- (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_JACK)) {
- statep->hda_record_stag =
- istream->rtag;
- return;
- }
- }
- } else {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)) {
- statep->hda_record_stag =
- istream->rtag;
- return;
- }
- }
+ return (DDI_SUCCESS);
+}
+
+static void
+audiohd_set_pin_monitor_gain(hda_codec_t *codec, audiohd_state_t *statep,
+ uint_t caddr, audiohd_pin_t *pin, uint64_t gain)
+{
+ int i, k;
+ uint_t ltmp, rtmp;
+ audiohd_widget_t *widget;
+ uint8_t l, r;
+
+ l = (gain & 0xff00) >> 8;
+ r = (gain & 0xff);
+
+ for (k = 0; k < pin->num; k++) {
+ ltmp = l * pin->mg_gain[k] / 100;
+ rtmp = r * pin->mg_gain[k] / 100;
+ widget = codec->widget[pin->mg_wid[k]];
+ if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_OUTPUT) {
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT|
+ pin->mg_dir[k] | ltmp);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT|
+ pin->mg_dir[k] | rtmp);
+ } else if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_INPUT) {
+ for (i = 0; i < widget->used; i++) {
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT|
+ widget->selmon[i]<<
+ AUDIOHDC_AMP_SET_INDEX_OFFSET |
+ pin->mg_dir[k] | rtmp);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT|
+ widget->selmon[i]<<
+ AUDIOHDC_AMP_SET_INDEX_OFFSET |
+ pin->mg_dir[k] | ltmp);
}
- istream = istream->next_stream;
}
}
}
-/*
- * audiohd_pin_sense()
- *
- * Description
- *
- * When the earphone is plugged into the jack associtated with the pin
- * complex, we disable the built in speaker. When the earphone is plugged
- * out of the jack, we enable the built in speaker.
- */
+
static void
-audiohd_pin_sense(audiohd_state_t *statep, uint32_t resp, uint32_t respex)
+audiohd_set_monitor_gain(audiohd_state_t *statep)
{
- uint8_t index;
- uint8_t id;
- uint32_t rs;
- audiohd_widget_t *widget;
+ int i, j;
+ audiohd_path_t *path;
+ uint_t caddr;
+ audiohd_widget_t *w;
+ wid_t wid;
audiohd_pin_t *pin;
- hda_codec_t *codec;
+ audiohd_ctrl_t *ctrl;
+ uint64_t val;
- index = respex & AUDIOHD_RIRB_CODEC_MASK;
- id = resp >> (AUDIOHD_RIRB_WID_OFF - 1);
-
- codec = statep->codec[index];
- if (codec == NULL)
- return;
- widget = codec->widget[id];
- if (widget == NULL)
+ ctrl = statep->controls[CTL_MONGAIN];
+ if (ctrl == NULL)
return;
+ val = ctrl->val;
- rs = audioha_codec_verb_get(statep, index, id,
- AUDIOHDC_VERB_GET_PIN_SENSE, 0);
- if (rs >> (AUDIOHD_PIN_PRES_OFF - 1) & 1) {
- /* A MIC is plugged in, we select the MIC as input */
- if ((widget->type == WTYPE_PIN) &&
- (pin = (audiohd_pin_t *)widget->priv) &&
- (pin->device == DTYPE_MIC_IN)) {
- audiohd_select_mic(statep, index, id, 1);
- return;
- }
- /* output pin is plugged */
- audiohd_change_speaker_state(statep, AUDIOHD_SP_OFF);
- } else {
- /*
- * A MIC is unplugged, we select the built in MIC
- * as input.
- */
- if ((widget->type == WTYPE_PIN) &&
- (pin = (audiohd_pin_t *)widget->priv) &&
- (pin->device == DTYPE_MIC_IN)) {
- audiohd_select_mic(statep, index, id, 0);
- return;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (path == NULL || path->path_type != PLAY)
+ continue;
+ caddr = path->codec->index;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)w->priv;
+ audiohd_set_pin_monitor_gain(path->codec, statep,
+ caddr, pin, val);
}
- /* output pin is unplugged */
- audiohd_change_speaker_state(statep, AUDIOHD_SP_ON);
}
}
-/*
- * audiohd_intr()
- *
- * Description
- *
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audiohd_intr(caddr_t arg)
+
+static void
+audiohd_restore_volume(audiohd_state_t *statep)
{
- audiohd_state_t *statep = (audiohd_state_t *)arg;
- uint32_t status;
- uint32_t regbase;
- uint32_t resp, respex;
- uint8_t sdstatus, rirbsts;
- int i, ret;
+ audiohd_set_pin_volume(statep, DTYPE_LINEOUT);
+ audiohd_set_pin_volume(statep, DTYPE_SPEAKER);
+ audiohd_set_pin_volume(statep, DTYPE_HP_OUT);
- mutex_enter(&statep->hda_mutex);
- if (statep->suspended) {
- mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_UNCLAIMED);
- }
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_BLACK);
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_GREY);
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
+}
+static void
+audiohd_configure_output(audiohd_state_t *statep)
+{
+ audiohd_set_output_gain(statep);
+}
+static void
+audiohd_configure_input(audiohd_state_t *statep)
+{
+ (void) audiohd_set_input_pin(statep);
+ audiohd_set_monitor_gain(statep);
+ audiohd_set_pin_volume(statep, DTYPE_LINE_IN);
+ audiohd_set_pin_volume(statep, DTYPE_CD);
+ audiohd_set_pin_volume(statep, DTYPE_MIC_IN);
+}
+static int
+audiohd_set_volume(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- status = AUDIOHD_REG_GET32(AUDIOHD_REG_INTSTS);
- if (status == 0) {
- mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_UNCLAIMED);
- }
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, status);
+ val &= 0xff;
+ if (val > 100)
+ return (EINVAL);
- /*
- * unsolicited response from pins, maybe something plugged in or out
- * of the jack.
- */
- if (status & AUDIOHD_CIS_MASK) {
- /* clear the unsolicited response interrupt */
- rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
- AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
- /*
- * We have to wait and try several times to make sure the
- * unsolicited response is generated by our pins.
- * we need to make it work for audiohd spec 0.9, which is
- * just a draft version and requires more time to wait.
- */
- for (i = 0; i < AUDIOHD_TEST_TIMES; i++) {
- ret = audiohd_response_from_codec(statep, &resp,
- &respex);
- if ((ret == AUDIO_SUCCESS) &&
- (respex & AUDIOHD_RIRB_UR_MASK)) {
- /*
- * A pin may generate more than one ur rirb,
- * we only need handle one of them, and clear
- * the other ones
- */
- statep->hda_rirb_rp =
- AUDIOHD_REG_GET16(AUDIOHD_REG_RIRBWP) &
- AUDIOHD_RIRB_WPMASK;
- break;
- }
- drv_usecwait(30);
- }
- if ((ret == AUDIO_SUCCESS) &&
- (respex & AUDIOHD_RIRB_UR_MASK))
- audiohd_pin_sense(statep, resp, respex);
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_configure_output(statep);
+ mutex_exit(&statep->hda_mutex);
- /* stream intr */
- for (i = 0; i < statep->hda_streams_nums; i++) {
- if ((status & (1<<i)) == 0)
- continue;
+ return (0);
+}
- regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * i;
- sdstatus = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_STS);
+static int
+audiohd_set_recsrc(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- /* clear intrs */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS, sdstatus);
+ if (val & ~(statep->inmask))
+ return (EINVAL);
- if ((sdstatus & AUDIOHDR_SD_STS_DESE) != 0) {
- /*
- * fatal error. Hardware will clear run bit. So,
- * we need to shutdown the stream
- */
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_intr() fatal error, shutdown "
- "stream %d", i);
-
- if (i == statep->hda_input_streams) {
- /* playback */
- mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- mutex_enter(&statep->hda_mutex);
- statep->hda_flags &= ~(AUDIOHD_PLAY_EMPTY |
- AUDIOHD_PLAY_STARTED);
- continue;
- } else if (i == 0) { /* recording */
- statep->hda_flags &= ~(AUDIOHD_RECORD_STARTED);
- continue;
- }
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_configure_input(statep);
+ mutex_exit(&statep->hda_mutex);
+ return (0);
+}
- /* Buffer Complete Intr */
- if (sdstatus & AUDIOHDR_SD_STS_BCIS)
- if (i < statep->hda_input_streams) {
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED)
- audiohd_get_rbuf(statep);
- } else if (statep->hda_flags & AUDIOHD_PLAY_STARTED)
- audiohd_refill_pbuf(statep);
- }
+static int
+audiohd_set_rear(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- /* update the kernel interrupt statistics */
- if (statep->hda_ksp) {
- ((kstat_intr_t *)
- (statep->hda_ksp->ks_data))->intrs[KSTAT_INTR_HARD]++;
- }
+ if (val & ~0xffff)
+ return (EINVAL);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_BLACK);
mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_CLAIMED);
-} /* audiohd_intr() */
+ return (0);
+}
-/*
- * audiohd_ad_start_play()
- *
- * Description:
- * This routine starts the first output stream of hardware
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
static int
-audiohd_ad_start_play(audiohdl_t ahandle, int stream)
+audiohd_set_center(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint64_t sbd_phys_addr;
- uint8_t cTmp;
- uint_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+
+ val &= 0xff;
- ATRACE_32("audiohd_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ if (val > 100)
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
- }
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
+ mutex_exit(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- if (statep->hda_flags & AUDIOHD_PLAY_PAUSED) {
- cTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
- statep->hda_flags |= AUDIOHD_PLAY_STARTED;
- statep->hda_flags &= ~AUDIOHD_PLAY_PAUSED;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- cTmp | AUDIOHDR_SD_CTL_SRUN);
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
- }
+ return (0);
+}
- if (audiohd_reset_stream(statep, statep->hda_input_streams)
- != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!start_play() failed to reset play stream");
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
- }
+static int
+audiohd_set_surround(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- statep->hda_flags |= AUDIOHD_PLAY_STARTED;
+ if (val & ~0xffff)
+ return (EINVAL);
- if (audiohd_fill_pbuf(statep) != AUDIO_SUCCESS) {
- mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
- }
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- sbd_phys_addr = statep->hda_dma_play_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS);
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_GREY);
+ mutex_exit(&statep->hda_mutex);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_play_format);
+ return (0);
+}
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_BCIS | AUDIOHDR_SD_STS_FIFOE |
- AUDIOHDR_SD_STS_DESE);
+static int
+audiohd_set_lfe(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- /* set playback stream tag */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_PLAY_CTL_OFF,
- (statep->hda_play_stag) << AUDIOHD_PLAY_TAG_OFF);
+ val &= 0xff;
- /* Enable interrupt and start DMA */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
+ if (val > 100)
+ return (EINVAL);
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
-} /* audiohd_ad_start_play() */
-
-
-/*
- * audiohd_ad_set_config()
- */
+ return (0);
+}
static int
-audiohd_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
+audiohd_set_speaker(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- int rc = AUDIO_SUCCESS;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- ATRACE_32("audiohd_ad_set_config() stream", stream);
- ATRACE_32("audiohd_ad_set_config() command", command);
- ATRACE_32("audiohd_ad_set_config() dir", dir);
- ATRACE_32("audiohd_ad_set_config() arg1", arg1);
- ATRACE_32("audiohd_ad_set_config() arg2", arg2);
+ if (val & ~0xffff)
+ return (EINVAL);
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audiohd_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audiohd_set_port(statep, dir, arg1);
- break;
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_SPEAKER);
+ mutex_exit(&statep->hda_mutex);
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audiohd_set_monitor_gain(statep, arg1);
- break;
+ return (0);
+}
+static int
+audiohd_set_front(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- audiohd_mute_outputs(statep, arg1);
- break;
+ if (val & ~0xffff)
+ return (EINVAL);
- case AM_MIC_BOOST:
- break;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("audiohd_ad_set_config() unsupported command",
- command);
- break;
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_LINEOUT);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-
- return (rc);
-} /* audiohd_ad_set_config */
-
-/*
- * audiohd_ad_set_format()
- *
- * Description
- * currently, only 48k sample rate, 16-bit precision,
- * 2-channel format is supported.
- */
-/*ARGSUSED*/
+ return (0);
+}
static int
-audiohd_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
+audiohd_set_headphone(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
- hda_codec_t *codec;
- uint_t caddr;
- int i;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- /*
- * we will support other format later. For the time being,
- * AUDIOHD_FMT_PCMOUT is used for 48k-16bit-2channel.
- */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_HP_OUT);
+ mutex_exit(&statep->hda_mutex);
- if (dir == AUDIO_PLAY) {
- statep->hda_psample_rate = sample_rate;
- statep->hda_pchannels = channels;
- statep->hda_pprecision = precision;
- statep->hda_play_format = AUDIOHD_FMT_PCMOUT;
+ return (0);
+}
+static int
+audiohd_set_linein(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i] == NULL)
- continue;
- codec = statep->codec[i];
- caddr = codec->index;
- ostream = codec->ostream;
- while (ostream) {
- if (ostream->in_use == 0)
- break;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, ostream->dac_wid,
- AUDIOHDC_VERB_SET_CONV_FMT,
- AUDIOHD_FMT_PCMOUT);
- ostream = ostream->next_stream;
- }
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- statep->hda_csample_rate = sample_rate;
- statep->hda_cchannels = channels;
- statep->hda_cprecision = precision;
- statep->hda_record_format = AUDIOHD_FMT_PCMIN;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i] == NULL)
- continue;
- codec = statep->codec[i];
- caddr = codec->index;
- istream = codec->istream;
- while (istream) {
- if (istream->in_use == 0)
- break;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, istream->adc_wid,
- AUDIOHDC_VERB_SET_CONV_FMT,
- AUDIOHD_FMT_PCMOUT);
- istream = istream->next_stream;
- }
- }
- }
+ if (val & ~0xffff)
+ return (EINVAL);
- mutex_exit(&statep->hda_mutex);
- return (AUDIO_SUCCESS);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
-} /* audiohd_ad_set_format() */
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_LINE_IN);
+ mutex_exit(&statep->hda_mutex);
+ return (0);
+}
-/*
- * audiohd_ad_pause_play()
- */
-/*ARGSUSED*/
-static void
-audiohd_ad_pause_play(audiohdl_t ahandle, int stream)
+static int
+audiohd_set_mic(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint32_t regbase;
- uint8_t cTmp;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- cTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
- cTmp &= ~AUDIOHDR_SD_CTL_SRUN;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, cTmp);
- statep->hda_flags &= ~AUDIOHD_PLAY_STARTED;
- statep->hda_flags |= AUDIOHD_PLAY_PAUSED;
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_MIC_IN);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-} /* audiohd_ad_pause_play() */
+ return (0);
+}
-/*
- * audiohd_ad_stop_play()
- */
-/*ARGSUSED*/
-static void
-audiohd_ad_stop_play(audiohdl_t ahandle, int stream)
+static int
+audiohd_set_cd(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint32_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ if (val & ~0xffff)
+ return (EINVAL);
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &=
- ~(AUDIOHD_PLAY_EMPTY | AUDIOHD_PLAY_STARTED);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_CD);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-} /* audiohd_ad_stop_play() */
+ return (0);
+}
-/*
- * audiohd_ad_start_record()
- */
-/*ARGSUSED*/
static int
-audiohd_ad_start_record(audiohdl_t ahandle, int stream)
+audiohd_set_mongain(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint64_t sbd_phys_addr;
- uint_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
+ pc->val = val;
+ audiohd_configure_input(statep);
+ mutex_exit(&statep->hda_mutex);
+
+ return (0);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+
+static audiohd_ctrl_t *
+audiohd_alloc_ctrl(audiohd_state_t *statep, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ audiohd_ctrl_t *pc;
+
+ pc = kmem_zalloc(sizeof (*pc), KM_SLEEP);
+ pc->statep = statep;
+ pc->num = num;
+
+ bzero(&desc, sizeof (desc));
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiohd_set_volume;
+ break;
+
+ case CTL_FRONT:
+ desc.acd_name = AUDIO_CTRL_ID_FRONT;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_front;
+ break;
+
+ case CTL_SPEAKER:
+ desc.acd_name = AUDIO_CTRL_ID_SPEAKER;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_speaker;
+ break;
+
+ case CTL_HEADPHONE:
+ desc.acd_name = AUDIO_CTRL_ID_HEADPHONE;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_headphone;
+ break;
+
+ case CTL_REAR:
+ desc.acd_name = AUDIO_CTRL_ID_REAR;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_rear;
+ break;
+
+ case CTL_CENTER:
+ desc.acd_name = AUDIO_CTRL_ID_CENTER;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_center;
+ break;
+
+ case CTL_SURROUND:
+ desc.acd_name = AUDIO_CTRL_ID_SURROUND;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_surround;
+ break;
+
+ case CTL_LFE:
+ desc.acd_name = AUDIO_CTRL_ID_LFE;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_lfe;
+ break;
+
+ case CTL_LINEIN:
+ desc.acd_name = AUDIO_CTRL_ID_LINEIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_linein;
+ break;
+
+ case CTL_MIC:
+ desc.acd_name = AUDIO_CTRL_ID_MIC;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_mic;
+ break;
+
+ case CTL_CD:
+ desc.acd_name = AUDIO_CTRL_ID_CD;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_cd;
+ break;
+
+ case CTL_MONGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_MONGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MONVOL;
+ fn = audiohd_set_mongain;
+ break;
+
+ case CTL_RECSRC:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = statep->inmask;
+ desc.acd_maxvalue = statep->inmask;
+ desc.acd_flags = RECCTL;
+ for (int i = 0; audiohd_dtypes[i]; i++) {
+ desc.acd_enum[i] = audiohd_dtypes[i];
+ }
+ fn = audiohd_set_recsrc;
+ break;
}
- if (audiohd_reset_stream(statep, 0) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!start_record() failed to reset record stream");
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
+ pc->val = val;
+ pc->ctrl = audio_dev_add_control(statep->adev, &desc,
+ audiohd_get_value, fn, pc);
+
+ return (pc);
+}
+
+static void
+audiohd_free_ctrl(audiohd_ctrl_t *pc)
+{
+ if (pc == NULL)
+ return;
+ if (pc->ctrl)
+ audio_dev_del_control(pc->ctrl);
+ kmem_free(pc, sizeof (*pc));
+}
+
+static void
+audiohd_del_controls(audiohd_state_t *statep)
+{
+ int i;
+ for (i = 0; i < CTRL_NUM; i++) {
+ if (statep->controls[i])
+ audiohd_free_ctrl(statep->controls[i]);
}
+}
- audiohd_preset_rbuf(statep);
- statep->hda_rbuf_pos = 0;
- regbase = statep->hda_record_regbase;
- sbd_phys_addr = statep->hda_dma_record_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_record_format);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS);
+static int
+audiohd_add_controls(audiohd_state_t *statep)
+{
+ int i, j;
+ audiohd_path_t *path;
+ wid_t wid;
+ audiohd_pin_t *pin;
+ audiohd_widget_t *widget;
+ hda_codec_t *codec;
+ audiohd_pin_color_t clr;
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
+#define ADD_CTRL(ID, VAL) \
+ if (statep->controls[ID] == NULL) \
+ statep->controls[ID] = audiohd_alloc_ctrl(statep, ID, VAL);\
+ if (statep->controls[ID] == NULL) { \
+ audio_dev_warn(statep->adev, \
+ "Unable to allocate %s control", #ID); \
+ return (DDI_FAILURE); \
+ }
- /* set stream tag to 1 */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_REC_CTL_OFF,
- statep->hda_record_stag << AUDIOHD_REC_TAG_OFF);
- statep->hda_flags |= AUDIOHD_RECORD_STARTED;
+ ADD_CTRL(CTL_VOLUME, 0x4b);
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_LINEOUT) {
+ ADD_CTRL(CTL_FRONT, 0x4b4b);
+ } else if (pin->device == DTYPE_SPEAKER) {
+ ADD_CTRL(CTL_SPEAKER, 0x4b4b);
+ } else if (pin->device == DTYPE_HP_OUT) {
+ ADD_CTRL(CTL_HEADPHONE, 0x4b4b);
+ } else if (pin->device == DTYPE_LINE_IN) {
+ ADD_CTRL(CTL_LINEIN, 0x3232);
+ } else if (pin->device == DTYPE_MIC_IN) {
+ ADD_CTRL(CTL_MIC, 0x3232);
+ } else if (pin->device == DTYPE_CD) {
+ ADD_CTRL(CTL_CD, 0x3232);
+ }
+ clr = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ if (clr == AUDIOHD_PIN_BLACK &&
+ pin->device != DTYPE_HP_OUT &&
+ pin->device != DTYPE_MIC_IN) {
+ ADD_CTRL(CTL_REAR, 0x4b4b);
+ } else if (clr == AUDIOHD_PIN_ORANGE) {
+ ADD_CTRL(CTL_CENTER, 0x4b);
+ ADD_CTRL(CTL_LFE, 0x4b);
+ } else if (clr == AUDIOHD_PIN_GREY) {
+ ADD_CTRL(CTL_SURROUND, 0x4b4b);
+ }
+ }
+ }
- /* start DMA */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
+ if (!statep->monitor_unsupported) {
+ ADD_CTRL(CTL_MONGAIN, 0);
+ }
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
+ ADD_CTRL(CTL_RECSRC, (1U << DTYPE_MIC_IN));
-} /* audiohd_ad_start_record() */
+ audiohd_configure_output(statep);
+ audiohd_configure_input(statep);
+ return (DDI_SUCCESS);
+}
/*
- * audiohd_ad_stop_record()
+ * quiesce(9E) entry point.
+ *
+ * This function is called when the system is single-threaded at high
+ * PIL with preemption disabled. Therefore, this function must not be
+ * blocked.
+ *
+ * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
+ * DDI_FAILURE indicates an error condition and should almost never happen.
*/
-/*ARGSUSED*/
-static void
-audiohd_ad_stop_record(audiohdl_t ahandle, int stream)
+static int
+audiohd_quiesce(dev_info_t *dip)
{
- audiohd_state_t *statep;
- uint32_t regbase;
+ audiohd_state_t *statep;
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ statep = ddi_get_driver_private(dip);
- audiohd_set_busy(statep);
- mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_record_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &= ~(AUDIOHD_RECORD_STARTED);
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-
-} /* audiohd_ad_stop_play */
+ audiohd_stop_dma(statep);
+ audiohd_disable_intr(statep);
+ return (DDI_SUCCESS);
+}
/*
* audiohd_init_state()
*
@@ -1733,158 +1851,36 @@ audiohd_ad_stop_record(audiohdl_t ahandle, int stream)
static int
audiohd_init_state(audiohd_state_t *statep, dev_info_t *dip)
{
- int pints, rints, mode;
+ audio_dev_t *adev;
statep->hda_dip = dip;
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", AUDIOHD_INTS);
- if (pints > AUDIOHD_MAX_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, AUDIOHD_INTS);
- pints = AUDIOHD_INTS;
- } else if (pints < AUDIOHD_MIN_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, AUDIOHD_INTS);
- pints = AUDIOHD_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", AUDIOHD_INTS);
- if (rints > AUDIOHD_MAX_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, AUDIOHD_INTS);
- rints = AUDIOHD_INTS;
- } else if (rints < AUDIOHD_MIN_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- rints, AUDIOHD_INTS);
- rints = AUDIOHD_INTS;
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "unable to allocate audio dev");
+ return (AUDIO_FAILURE);
}
+ statep->adev = adev;
- statep->hda_pint_freq = pints;
- statep->hda_rint_freq = rints;
- statep->hda_pbuf_size = (AUDIOHD_SAMPLER_MAX * AUDIOHD_MAX_CHANNELS *
- AUDIOHD_MAX_PRECISION / 8) / pints;
- statep->hda_pbuf_size = (statep->hda_pbuf_size +
- AUDIOHD_BDLE_BUF_ALIGN - 1) & ~(AUDIOHD_BDLE_BUF_ALIGN - 1);
- statep->hda_rbuf_size = (AUDIOHD_SAMPLER_MAX * AUDIOHD_MAX_CHANNELS *
- AUDIOHD_MAX_PRECISION / 8) / rints;
- statep->hda_rbuf_size = (statep->hda_rbuf_size +
- AUDIOHD_BDLE_BUF_ALIGN - 1) & ~(AUDIOHD_BDLE_BUF_ALIGN - 1);
-
- /* fill in the device default state */
- statep->hda_info_defaults.play.sample_rate = AUDIOHD_DEFAULT_SR;
- statep->hda_info_defaults.play.channels = AUDIOHD_DEFAULT_CH;
- statep->hda_info_defaults.play.precision = AUDIOHD_DEFAULT_PREC;
- statep->hda_info_defaults.play.encoding = AUDIOHD_DEFAULT_ENC;
- statep->hda_info_defaults.play.gain = AUDIOHD_DEFAULT_PGAIN;
- statep->hda_info_defaults.play.buffer_size = AUDIOHD_BSIZE;
- statep->hda_info_defaults.play.balance = AUDIOHD_DEFAULT_BAL;
-
- statep->hda_info_defaults.record.sample_rate = AUDIOHD_DEFAULT_SR;
- statep->hda_info_defaults.record.channels = AUDIOHD_DEFAULT_CH;
- statep->hda_info_defaults.record.precision = AUDIOHD_DEFAULT_PREC;
- statep->hda_info_defaults.record.encoding = AUDIOHD_DEFAULT_ENC;
- statep->hda_info_defaults.record.gain = AUDIOHD_DEFAULT_RGAIN;
- statep->hda_info_defaults.record.buffer_size = AUDIOHD_BSIZE;
- statep->hda_info_defaults.record.balance = AUDIOHD_DEFAULT_BAL;
-
- statep->hda_info_defaults.monitor_gain = AUDIOHD_DEFAULT_MONITOR_GAIN;
- statep->hda_info_defaults.output_muted = B_FALSE;
- statep->hda_info_defaults.ref_cnt = B_FALSE;
- statep->hda_info_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->hda_info_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- statep->hda_psample_rate =
- statep->hda_info_defaults.play.sample_rate;
- statep->hda_pchannels =
- statep->hda_info_defaults.play.channels;
- statep->hda_pprecision =
- statep->hda_info_defaults.play.precision;
- statep->hda_play_format = AUDIOHD_FMT_PCMOUT;
-
- statep->hda_csample_rate =
- statep->hda_info_defaults.record.sample_rate;
- statep->hda_cchannels =
- statep->hda_info_defaults.record.channels;
- statep->hda_cprecision =
- statep->hda_info_defaults.record.precision;
- statep->hda_record_format = AUDIOHD_FMT_PCMIN;
-
-
- /*
- * fill in the ad_info structure
- */
- statep->hda_ad_info.ad_mode = mode;
- statep->hda_ad_info.ad_int_vers = AM_VERSION;
- statep->hda_ad_info.ad_add_mode = NULL;
- statep->hda_ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->hda_ad_info.ad_defaults = &statep->hda_info_defaults;
- statep->hda_ad_info.ad_play_comb = audiohd_combinations;
- statep->hda_ad_info.ad_rec_comb = audiohd_combinations;
- statep->hda_ad_info.ad_entry = &audiohd_entry;
- statep->hda_ad_info.ad_dev_info = &statep->hda_dev_info;
- statep->hda_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->hda_ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->hda_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->hda_ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->hda_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->hda_ad_info.ad_play.ad_mixer_srs = audiohd_mixer_sample_rates;
- statep->hda_ad_info.ad_play.ad_compat_srs = audiohd_comp_sample_rates;
- statep->hda_ad_info.ad_play.ad_conv = &am_src2;
- statep->hda_ad_info.ad_play.ad_sr_info = NULL;
- statep->hda_ad_info.ad_play.ad_chs = audiohd_channels;
- statep->hda_ad_info.ad_play.ad_int_rate = pints;
- statep->hda_ad_info.ad_play.ad_max_chs = AUDIOHD_MAX_OUT_CHANNELS;
- statep->hda_ad_info.ad_play.ad_bsize = AUDIOHD_BSIZE;
-
- /* record capabilities */
- statep->hda_ad_info.ad_record.ad_mixer_srs = audiohd_mixer_sample_rates;
- statep->hda_ad_info.ad_record.ad_compat_srs = audiohd_comp_sample_rates;
- statep->hda_ad_info.ad_record.ad_conv = &am_src2;
- statep->hda_ad_info.ad_record.ad_sr_info = NULL;
- statep->hda_ad_info.ad_record.ad_chs = audiohd_channels;
- statep->hda_ad_info.ad_record.ad_int_rate = rints;
- statep->hda_ad_info.ad_record.ad_max_chs = AUDIOHD_MAX_IN_CHANNELS;
- statep->hda_ad_info.ad_record.ad_bsize = AUDIOHD_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(statep->hda_dev_info.name, AUDIOHD_DEV_NAME);
- (void) strcpy(statep->hda_dev_info.config, AUDIOHD_DEV_CONFIG);
- (void) strcpy(statep->hda_dev_info.version, AUDIOHD_DEV_VERSION);
+ /* set device information */
+ audio_dev_set_description(adev, AUDIOHD_DEV_CONFIG);
+ audio_dev_set_version(adev, AUDIOHD_DEV_VERSION);
if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->hda_intr_cookie) !=
DDI_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
+ audio_dev_warn(statep->adev,
+ "cannot get iblock cookie");
+ goto error;
}
- statep->hda_busy_cnt = 0;
mutex_init(&statep->hda_mutex, NULL,
MUTEX_DRIVER, statep->hda_intr_cookie);
- cv_init(&statep->hda_cv, NULL, CV_DRIVER, NULL);
- statep->hda_outputs_muted = B_FALSE;
statep->hda_rirb_rp = 0;
return (AUDIO_SUCCESS);
-
+error:
+ if (statep->adev != NULL)
+ audio_dev_free(statep->adev);
+ return (AUDIO_FAILURE);
} /* audiohd_init_state() */
/*
@@ -1901,18 +1897,18 @@ audiohd_init_pci(audiohd_state_t *statep, ddi_device_acc_attr_t *acc_attr)
uint16_t vid;
uint8_t cTmp;
dev_info_t *dip = statep->hda_dip;
- audiohdl_t ahandle = statep->hda_ahandle;
+ audio_dev_t *ahandle = statep->adev;
if (pci_config_setup(dip, &statep->hda_pci_handle) == DDI_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() pci config mapping failed");
+ audio_dev_warn(ahandle,
+ "pci config mapping failed");
goto err_init_pci_exit1;
}
if (ddi_regs_map_setup(dip, 1, &statep->hda_reg_base, 0,
0, acc_attr, &statep->hda_reg_handle) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() memory I/O mapping failed");
+ audio_dev_warn(ahandle,
+ "memory I/O mapping failed");
goto err_init_pci_exit2;
}
@@ -2068,8 +2064,8 @@ audiohd_reset_controller(audiohd_state_t *statep)
}
if ((gctl & AUDIOHDR_GCTL_CRST) != 0) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!reset_controller() failed to enter reset state");
+ audio_dev_warn(statep->adev,
+ "failed to enter reset state");
return (AUDIO_FAILURE);
}
@@ -2088,17 +2084,14 @@ audiohd_reset_controller(audiohd_state_t *statep)
}
if ((gctl & AUDIOHDR_GCTL_CRST) == 0) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!reset_controller() failed to exit reset state");
+ audio_dev_warn(statep->adev,
+ "failed to exit reset state");
return (AUDIO_FAILURE);
}
/* HD spec requires to wait 250us at least. we use 500us */
drv_usecwait(500);
- ATRACE_32("in reset_controller: mask is",
- AUDIOHD_REG_GET16(AUDIOHD_REG_STATESTS));
-
/* enable unsolicited response */
AUDIOHD_REG_SET32(AUDIOHD_REG_GCTL,
gctl | AUDIOHDR_GCTL_URESPE);
@@ -2121,12 +2114,12 @@ audiohd_alloc_dma_mem(audiohd_state_t *statep, audiohd_dma_t *pdma,
ddi_dma_cookie_t cookie;
uint_t count;
dev_info_t *dip = statep->hda_dip;
- audiohdl_t ahandle = statep->hda_ahandle;
+ audio_dev_t *ahandle = statep->adev;
if (ddi_dma_alloc_handle(dip, dma_attr_p, DDI_DMA_SLEEP,
- (caddr_t)0, &pdma->ad_dmahdl) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_hanlde failed");
+ NULL, &pdma->ad_dmahdl) != DDI_SUCCESS) {
+ audio_dev_warn(ahandle,
+ "ddi_dma_alloc_handle failed");
goto error_alloc_dma_exit1;
}
@@ -2135,29 +2128,19 @@ audiohd_alloc_dma_mem(audiohd_state_t *statep, audiohd_dma_t *pdma,
DDI_DMA_SLEEP, NULL,
(caddr_t *)&pdma->ad_vaddr, &pdma->ad_real_sz,
&pdma->ad_acchdl) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc failed");
+ audio_dev_warn(ahandle,
+ "ddi_dma_mem_alloc failed");
goto error_alloc_dma_exit2;
}
if (ddi_dma_addr_bind_handle(pdma->ad_dmahdl, NULL,
(caddr_t)pdma->ad_vaddr, pdma->ad_real_sz, dma_flags,
DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_DMA_MAPPED) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle failed");
+ audio_dev_warn(ahandle,
+ "ddi_dma_addr_bind_handle failed");
goto error_alloc_dma_exit3;
}
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(pdma->ad_dmahdl);
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() addr_bind_handle failed, cookies > 1");
- goto error_alloc_dma_exit3;
- }
pdma->ad_paddr = (uint64_t)(cookie.dmac_laddress);
pdma->ad_req_sz = memsize;
@@ -2242,7 +2225,9 @@ audiohd_reinit_hda(audiohd_state_t *statep)
audiohd_restore_codec_gpio(statep);
audiohd_restore_path(statep);
- return (audiohd_init_ports(statep));
+ audiohd_init_path(statep);
+
+ return (AUDIO_SUCCESS);
} /* audiohd_reinit_hda */
/*
@@ -2292,13 +2277,11 @@ audiohd_init_controller(audiohd_state_t *statep)
statep->hda_streams_nums = statep->hda_input_streams +
statep->hda_output_streams;
- statep->hda_record_stag = 1;
- statep->hda_play_stag = statep->hda_input_streams + 1;
+
statep->hda_record_regbase = AUDIOHD_REG_SD_BASE;
statep->hda_play_regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN *
statep->hda_input_streams;
- ATRACE_16("GCAP = ", gcap);
/* stop all dma before starting to reset controller */
audiohd_stop_dma(statep);
@@ -2309,8 +2292,8 @@ audiohd_init_controller(audiohd_state_t *statep)
/* check codec */
statep->hda_codec_mask = AUDIOHD_REG_GET16(AUDIOHD_REG_STATESTS);
if (! statep->hda_codec_mask) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() no codec exists");
+ audio_dev_warn(statep->adev,
+ "no codec exists");
goto err_init_ctlr_exit1;
}
@@ -2319,8 +2302,8 @@ audiohd_init_controller(audiohd_state_t *statep)
AUDIOHD_CDBIO_CORB_LEN, &dma_attr,
DDI_DMA_WRITE | DDI_DMA_STREAMING);
if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for CORB");
+ audio_dev_warn(statep->adev,
+ "failed to alloc DMA for CORB");
goto err_init_ctlr_exit1;
}
@@ -2329,50 +2312,11 @@ audiohd_init_controller(audiohd_state_t *statep)
AUDIOHD_CDBIO_RIRB_LEN, &dma_attr,
DDI_DMA_READ | DDI_DMA_STREAMING);
if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for RIRB");
+ audio_dev_warn(statep->adev,
+ "failed to alloc DMA for RIRB");
goto err_init_ctlr_exit2;
}
- /* allocate DMA for data buffer of playback stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_play_buf,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for playback buf");
- goto err_init_ctlr_exit3;
- }
-
- /* allocate DMA for data buffer of recording stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_record_buf,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_READ | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for recording buf");
- goto err_init_ctlr_exit4;
- }
-
- /* allocate DMA for buffer descriptor list of playback stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_play_bd,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for playback BDL");
- goto err_init_ctlr_exit5;
- }
-
- /* allocate DMA for buffer descriptor list of recording stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_record_bd,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for record BDL");
- goto err_init_ctlr_exit6;
- }
AUDIOHD_REG_SET32(AUDIOHD_REG_SYNC, 0); /* needn't sync stream */
@@ -2399,15 +2343,6 @@ audiohd_init_controller(audiohd_state_t *statep)
return (AUDIO_SUCCESS);
-err_init_ctlr_exit6:
- audiohd_release_dma_mem(&(statep->hda_dma_play_bd));
-
-err_init_ctlr_exit5:
- audiohd_release_dma_mem(&(statep->hda_dma_record_buf));
-
-err_init_ctlr_exit4:
- audiohd_release_dma_mem(&(statep->hda_dma_play_buf));
-
err_init_ctlr_exit3:
audiohd_release_dma_mem(&(statep->hda_dma_rirb));
@@ -2431,10 +2366,6 @@ audiohd_fini_controller(audiohd_state_t *statep)
audiohd_stop_dma(statep);
audiohd_release_dma_mem(&statep->hda_dma_rirb);
audiohd_release_dma_mem(&statep->hda_dma_corb);
- audiohd_release_dma_mem(&statep->hda_dma_play_buf);
- audiohd_release_dma_mem(&statep->hda_dma_record_buf);
- audiohd_release_dma_mem(&statep->hda_dma_record_bd);
- audiohd_release_dma_mem(&statep->hda_dma_play_bd);
} /* audiohd_fini_controller() */
@@ -2460,9 +2391,6 @@ audiohd_get_conns_from_entry(hda_codec_t *codec, audiohd_widget_t *widget,
if (widget->nconns == 0) {
if (input_wid < codec->first_wid ||
(input_wid > codec->last_wid)) {
- ATRACE_32(
- "collection list out of range",
- widget->wid_wid);
break;
}
widget->avail_conn[widget->nconns++] =
@@ -2474,9 +2402,6 @@ audiohd_get_conns_from_entry(hda_codec_t *codec, audiohd_widget_t *widget,
AUDIOHD_MAX_CONN);
if (k < codec->first_wid ||
(k > codec->last_wid)) {
- ATRACE_32(
- "collection out of range",
- widget->wid_wid);
break;
} else {
num = widget->nconns;
@@ -2545,9 +2470,6 @@ audiohd_get_conns(hda_codec_t *codec, wid_t wid)
input_wid = entry & prop.mask_wid;
if ((input_wid < codec->first_wid) ||
(input_wid > codec->last_wid)) {
- ATRACE("node input out of range:", NULL);
- ATRACE_32("node:", wid);
- ATRACE_32("input:", input_wid);
return;
}
widget->avail_conn[0] = input_wid;
@@ -2602,10 +2524,7 @@ audiohd_get_pin_config(audiohd_widget_t *widget)
pin->config = config;
pin->num = 0;
pin->finish = 0;
- /*
- * get the voltage reference state supported by the pin
- * from high level to low level
- */
+
vrefbits = (cap >> AUDIOHD_PIN_VREF_OFF) & AUDIOHD_PIN_VREF_MASK;
if (vrefbits & AUDIOHD_PIN_VREF_L1)
pin->vrefvalue = 0x5;
@@ -2761,10 +2680,8 @@ audiohd_create_widgets(hda_codec_t *codec)
audiohd_get_pin_config(widget);
break;
case WTYPE_BEEP:
- ATRACE("Get a beep widget", NULL);
break;
default:
- ATRACE("Unknown widget", NULL);
break;
}
}
@@ -2788,6 +2705,231 @@ audiohd_destroy_widgets(hda_codec_t *codec)
} /* audiohd_destroy_widgets() */
+static void
+audiohd_set_codec_info(hda_codec_t *codec)
+{
+ char buf[256];
+
+ switch (codec->vid) {
+ case 0x10ec0260:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC260");
+ break;
+ case 0x10ec0262:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC262");
+ break;
+ case 0x10ec0268:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC268");
+ break;
+ case 0x10ec0662:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC662");
+ break;
+ case 0x10ec861:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC861");
+ break;
+ case 0x10ec0862:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC862");
+ break;
+ case 0x10ec0880:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC880");
+ break;
+ case 0x10ec0882:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC882");
+ break;
+ case 0x10ec0883:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC883");
+ break;
+ case 0x10ec0885:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC885");
+ break;
+ case 0x10ec0888:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC888");
+ break;
+ case 0x13f69880:
+ (void) snprintf(buf, sizeof (buf), "CMedia HD codec: CMI19880");
+ break;
+ case 0x434d4980:
+ (void) snprintf(buf, sizeof (buf), "CMedia HD codec: CMI19880");
+ break;
+ case 0x11d41981:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1981");
+ break;
+ case 0x11d41983:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1983");
+ break;
+ case 0x11d41984:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1984");
+ break;
+ case 0x11d41986:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1986A");
+ break;
+ case 0x11d41988:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1988A");
+ break;
+ case 0x11d4198b:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1988B");
+ break;
+ case 0x83847690:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9200");
+ break;
+ case 0x838476a0:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9205");
+ break;
+ case 0x838476a1:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9205D");
+ break;
+ case 0x838476a2:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9204");
+ break;
+ case 0x838476a3:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9204D");
+ break;
+ case 0x83847880:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 A1");
+ break;
+ case 0x83847882:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 A2");
+ break;
+ case 0x83847680:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221 A1");
+ break;
+ case 0x83847681:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 D");
+ break;
+ case 0x83847682:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221");
+ break;
+ case 0x83847683:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221D");
+ break;
+ case 0x83847610:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230XN");
+ break;
+ case 0x83847611:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230DN");
+ break;
+ case 0x83847612:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230XT");
+ break;
+ case 0x83847613:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230DT");
+ break;
+ case 0x83847614:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9229X");
+ break;
+ case 0x83847615:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9229D");
+ break;
+ case 0x83847616:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9228X");
+ break;
+ case 0x83847617:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9228D");
+ break;
+ case 0x83847618:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9227X");
+ break;
+ case 0x83847619:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9227D");
+ break;
+ case 0x838476a4:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9255");
+ break;
+ case 0x838476a5:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9255D");
+ break;
+ case 0x838476a6:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9254");
+ break;
+ case 0x838476a7:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9254D");
+ break;
+ case 0x83847620:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274");
+ break;
+ case 0x83847621:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274D");
+ break;
+ case 0x83847622:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9273X");
+ break;
+ case 0x83847623:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9273D");
+ break;
+ case 0x83847624:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9272X");
+ break;
+ case 0x83847625:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9272D");
+ break;
+ case 0x83847626:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9271X");
+ break;
+ case 0x83847627:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9271D");
+ break;
+ case 0x83847628:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274X5NH");
+ break;
+ case 0x83847629:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274D5NH");
+ break;
+ case 0x83847662:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9872AK");
+ break;
+ case 0x83847664:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9872K");
+ break;
+ default:
+ (void) snprintf(buf, sizeof (buf),
+ "Unkown HD codec");
+ break;
+
+ }
+ audio_dev_add_info(codec->soft_statep->adev, buf);
+}
/*
* audiohd_create_codec()
*
@@ -2851,19 +2993,6 @@ audiohd_create_codec(audiohd_state_t *statep)
}
ASSERT(codec->wid_afg == wid);
- /*
- * GPIO controls which are laptop specific workarounds and
- * might be changed. Some laptops use GPIO, so we need to
- * enable and set the GPIO correctly.
- */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DIREC, AUDIOHDC_GPIO_DIRECT);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
/* power-up audio function group */
(void) audioha_codec_verb_get(statep, i, wid,
@@ -2891,13 +3020,31 @@ audiohd_create_codec(audiohd_state_t *statep)
/*
* We output the codec information to syslog
*/
- ATRACE_32("codec = ", codec->index);
- ATRACE_32("vid = ", codec->vid);
- ATRACE_32("rev = ", codec->revid);
-
statep->codec[i] = codec;
codec->soft_statep = statep;
+ audiohd_set_codec_info(codec);
(void) audiohd_create_widgets(codec);
+
+ /* work around for Sony VAIO laptop with specific codec */
+ if ((codec->vid == AUDIOHD_CODECID_SONY1) ||
+ (codec->vid == AUDIOHD_CODECID_SONY2))
+ continue;
+ else
+ statep->gpio_direct = AUDIOHDC_GPIO_DIRECT;
+ /*
+ * GPIO controls which are laptop specific workarounds and
+ * might be changed. Some laptops use GPIO, so we need to
+ * enable and set the GPIO correctly.
+ */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DIREC, statep->gpio_direct);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
+
}
return (AUDIO_SUCCESS);
@@ -2913,34 +3060,12 @@ audiohd_create_codec(audiohd_state_t *statep)
static void
audiohd_destroy_codec(audiohd_state_t *statep)
{
- audiohd_ostream_t *ostream, *nostream;
- audiohd_istream_t *istream, *nistream;
+ int i;
audiohd_pin_t *pin, *npin;
- for (int i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
if (statep->codec[i]) {
audiohd_destroy_widgets(statep->codec[i]);
-
- /*
- * free output streams
- */
- ostream = statep->codec[i]->ostream;
- while (ostream) {
- nostream = ostream;
- ostream = ostream->next_stream;
- kmem_free(nostream, sizeof (audiohd_ostream_t));
- }
-
- /*
- * free input streams
- */
- istream = statep->codec[i]->istream;
- while (istream) {
- nistream = istream;
- istream = istream->next_stream;
- kmem_free(nistream, sizeof (audiohd_istream_t));
- }
-
/*
* free pins
*/
@@ -2991,6 +3116,7 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
if (widget == NULL)
return (uint32_t)(AUDIO_FAILURE);
+
/*
* If exclusive is true, we try to find a path which doesn't
* share any widget with other paths.
@@ -3011,7 +3137,6 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
wdac = widget->wid_wid;
- ATRACE_32("(DAC:", widget->wid_wid);
break;
case WTYPE_AUDIO_MIX:
@@ -3028,8 +3153,6 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
widget->selconn = i;
wdac = retval;
}
- ATRACE_32("widget:", widget->wid_wid);
- ATRACE_32("type:", widget->type);
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
@@ -3062,10 +3185,13 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
{
audiohd_pin_t *pin;
audiohd_widget_t *widget, *wdac;
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
wid_t wid;
+ audiohd_state_t *statep;
int i;
+ statep = codec->soft_statep;
+
for (pin = codec->first_pin; pin; pin = pin->next) {
if ((pin->cap & AUDIOHD_PIN_CAP_MASK) == 0)
continue;
@@ -3096,29 +3222,25 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
*/
if (wid == (wid_t)AUDIO_FAILURE)
continue;
- ostream = (audiohd_ostream_t *)
- kmem_zalloc(sizeof (audiohd_ostream_t),
+ if (pin->device != DTYPE_SPEAKER)
+ statep->chann[pin->assoc] += 2;
+ path = (audiohd_path_t *)
+ kmem_zalloc(sizeof (audiohd_path_t),
KM_SLEEP);
- ostream->dac_wid = wid;
- ostream->pin_wid[0] = widget->wid_wid;
- ostream->pin_nums = 1;
+ path->adda_wid = wid;
+ path->pin_wid[0] = widget->wid_wid;
+ path->pin_nums = 1;
+ path->path_type = PLAY;
+ path->codec = codec;
+ path->statep = statep;
wdac = codec->widget[wid];
- wdac->priv = ostream;
+ wdac->priv = path;
pin->adc_dac_wid = wid;
pin->finish = 1;
- ATRACE_32("widget:", widget->wid_wid);
- ATRACE_32("type:", widget->type);
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
widget->selconn = i;
- if (codec->ostream == NULL)
- codec->ostream = ostream;
- else {
- audiohd_ostream_t *p = codec->ostream;
- while (p->next_stream)
- p = p->next_stream;
- p->next_stream = ostream;
- }
+ statep->path[statep->pathnum++] = path;
break;
}
}
@@ -3138,14 +3260,17 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
static void
audiohd_build_output_path(hda_codec_t *codec)
{
- audiohd_pin_t *pin;
int mnum = 0;
+ uint8_t mixer_allow = 1;
+ /* work around for hp mini 1000 laptop */
+ if (codec->vid == AUDIOHD_CODECID_HP)
+ mixer_allow = 0;
/* search an exclusive mixer widget path. This is preferred */
- audiohd_do_build_output_path(codec, 1, &mnum, 1, 0);
+ audiohd_do_build_output_path(codec, mixer_allow, &mnum, 1, 0);
/* search a shared mixer widget path for the remained pins */
- audiohd_do_build_output_path(codec, 1, &mnum, 0, 0);
+ audiohd_do_build_output_path(codec, mixer_allow, &mnum, 0, 0);
/* search an exclusive widget path without mixer for the remained pin */
audiohd_do_build_output_path(codec, 0, &mnum, 1, 0);
@@ -3153,22 +3278,6 @@ audiohd_build_output_path(hda_codec_t *codec)
/* search a shared widget path without mixer for the remained pin */
audiohd_do_build_output_path(codec, 0, &mnum, 0, 0);
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((pin->cap & AUDIOHD_PIN_CAP_MASK) == 0) {
- continue;
- }
- if ((pin->config & AUDIOHD_PIN_CONF_MASK) ==
- AUDIOHD_PIN_NO_CONN)
- continue;
- if ((pin->device != DTYPE_LINEOUT) &&
- (pin->device != DTYPE_SPEAKER) &&
- (pin->device != DTYPE_SPDIF_OUT) &&
- (pin->device != DTYPE_HP_OUT))
- continue;
- if (!pin->finish) {
- ATRACE_32("pin has no output path:", pin->wid);
- }
- }
} /* audiohd_build_output_path */
/*
@@ -3180,18 +3289,21 @@ audiohd_build_output_path(hda_codec_t *codec)
static void
audiohd_build_output_amp(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *w, *widget, *wpin, *wdac;
audiohd_pin_t *pin;
wid_t wid;
int weight;
- int i;
+ int i, j;
uint32_t gain;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == RECORD ||
+ path->codec != codec)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
wpin = codec->widget[wid];
pin = (audiohd_pin_t *)wpin->priv;
weight = wpin->out_weight;
@@ -3262,16 +3374,16 @@ audiohd_build_output_amp(hda_codec_t *codec)
* all output pins of this stream to be used for the
* whole stream
*/
- if (ostream->pin_nums == 1) {
- ostream->mute_wid = pin->mute_wid;
- ostream->mute_dir = pin->mute_dir;
- ostream->gain_wid = pin->gain_wid;
- ostream->gain_dir = pin->gain_dir;
- ostream->gain_bits = pin->gain_bits;
+ if (path->pin_nums == 1) {
+ path->mute_wid = pin->mute_wid;
+ path->mute_dir = pin->mute_dir;
+ path->gain_wid = pin->gain_wid;
+ path->gain_dir = pin->gain_dir;
+ path->gain_bits = pin->gain_bits;
} else {
- wdac = codec->widget[ostream->dac_wid];
+ wdac = codec->widget[path->adda_wid];
weight = wdac->out_weight;
- wid = ostream->pin_wid[0];
+ wid = path->pin_wid[0];
w = codec->widget[wid];
while (w && w->out_weight != weight) {
wid = w->avail_conn[w->selconn];
@@ -3283,15 +3395,15 @@ audiohd_build_output_amp(hda_codec_t *codec)
while (widget) {
if (widget->outamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
- ostream->mute_wid = widget->wid_wid;
- ostream->mute_dir =
+ path->mute_wid = widget->wid_wid;
+ path->mute_dir =
AUDIOHDC_AMP_SET_OUTPUT;
break;
}
if (widget->inamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
- ostream->mute_wid = widget->wid_wid;
- ostream->mute_dir =
+ path->mute_wid = widget->wid_wid;
+ path->mute_dir =
AUDIOHDC_AMP_SET_INPUT;
break;
}
@@ -3308,29 +3420,28 @@ audiohd_build_output_amp(hda_codec_t *codec)
gain = (widget->outamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS);
if (gain && gain > pin->gain_bits) {
- ostream->gain_dir =
+ path->gain_dir =
AUDIOHDC_AMP_SET_OUTPUT;
- ostream->gain_bits = gain;
- ostream->gain_wid = widget->wid_wid;
+ path->gain_bits = gain;
+ path->gain_wid = widget->wid_wid;
}
gain = widget->inamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS;
if (gain && (gain > pin->gain_bits) &&
(widget->type != WTYPE_AUDIO_MIX)) {
- ostream->gain_dir =
+ path->gain_dir =
AUDIOHDC_AMP_SET_INPUT;
- ostream->gain_bits = gain;
- ostream->gain_wid = widget->wid_wid;
+ path->gain_bits = gain;
+ path->gain_wid = widget->wid_wid;
}
if (widget->selconn == AUDIOHD_NULL_CONN)
break;
wid = widget->avail_conn[widget->selconn];
widget = codec->widget[wid];
}
- ostream->gain_bits >>= AUDIOHD_GAIN_OFF;
+ path->gain_bits >>= AUDIOHD_GAIN_OFF;
}
- ostream = ostream->next_stream;
}
} /* audiohd_build_output_amp */
@@ -3345,17 +3456,19 @@ static void
audiohd_finish_output_path(hda_codec_t *codec)
{
audiohd_state_t *statep = codec->soft_statep;
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget;
audiohd_pin_t *pin;
uint_t caddr = codec->index;
wid_t wid;
- int i;
+ int i, j;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (!path || path->path_type != PLAY || path->codec != codec)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
widget = codec->widget[wid];
pin = (audiohd_pin_t *)widget->priv;
{
@@ -3432,7 +3545,6 @@ audiohd_finish_output_path(hda_codec_t *codec)
widget = codec->widget[wid];
}
}
- ostream = ostream->next_stream;
}
} /* audiohd_finish_output_path() */
@@ -3449,7 +3561,7 @@ audiohd_finish_output_path(hda_codec_t *codec)
*/
static int
audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
- int depth, audiohd_istream_t *istream)
+ int depth, audiohd_path_t *path)
{
audiohd_widget_t *widget = codec->widget[wid];
audiohd_pin_t *pin;
@@ -3491,9 +3603,8 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
case DTYPE_AUX:
widget->path_flags |= AUDIOHD_PATH_ADC;
widget->in_weight++;
- istream->pin_wid[istream->pin_nums++] = wid;
- pin->adc_dac_wid = istream->adc_wid;
- ATRACE_32("Pin in:", wid);
+ path->pin_wid[path->pin_nums++] = wid;
+ pin->adc_dac_wid = path->adda_wid;
return (AUDIO_SUCCESS);
}
break;
@@ -3507,7 +3618,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
widget->selconn = 0;
retval = audiohd_find_input_pins(codec,
widget->avail_conn[0],
- allowmixer, depth + 1, istream);
+ allowmixer, depth + 1, path);
if (retval != AUDIO_FAILURE) {
widget->path_flags |= AUDIOHD_PATH_ADC;
widget->in_weight++;
@@ -3524,12 +3635,12 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
for (int i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
widget->avail_conn[i], 0, depth + 1,
- istream);
+ path);
if (retval != AUDIO_FAILURE) {
widget->in_weight++;
- num = istream->pin_nums - 1;
- istream->sum_selconn[num] = i;
- istream->sum_wid = wid;
+ num = path->pin_nums - 1;
+ path->sum_selconn[num] = i;
+ path->sum_wid = wid;
widget->path_flags |=
AUDIOHD_PATH_ADC;
if (widget->selconn ==
@@ -3540,7 +3651,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
}
/* return SUCCESS if we found at least one input path */
- if (istream->pin_nums > 0)
+ if (path->pin_nums > 0)
retval = AUDIO_SUCCESS;
} else {
/*
@@ -3550,7 +3661,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
for (i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
widget->avail_conn[i], 0, depth + 1,
- istream);
+ path);
if (retval != AUDIO_FAILURE) {
widget->selconn = i;
widget->path_flags |= AUDIOHD_PATH_ADC;
@@ -3577,11 +3688,12 @@ static void
audiohd_build_input_path(hda_codec_t *codec)
{
audiohd_widget_t *widget;
- audiohd_istream_t *istream = NULL;
+ audiohd_path_t *path = NULL;
wid_t wid;
int i;
int retval;
uint8_t rtag = 0;
+ audiohd_state_t *statep = codec->soft_statep;
for (wid = codec->first_wid; wid <= codec->last_wid; wid++) {
@@ -3591,13 +3703,13 @@ audiohd_build_input_path(hda_codec_t *codec)
if (!widget || widget->type != WTYPE_AUDIO_IN)
continue;
- if (istream == NULL)
- istream = kmem_zalloc(sizeof (audiohd_istream_t),
+ if (path == NULL)
+ path = kmem_zalloc(sizeof (audiohd_path_t),
KM_SLEEP);
else
- bzero(istream, sizeof (audiohd_istream_t));
+ bzero(path, sizeof (audiohd_port_t));
- istream->adc_wid = wid;
+ path->adda_wid = wid;
/*
* Is there any ADC widget which has more than one input ??
@@ -3611,28 +3723,23 @@ audiohd_build_input_path(hda_codec_t *codec)
*/
for (i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
- widget->avail_conn[i], 1, 0, istream);
+ widget->avail_conn[i], 1, 0, path);
if (retval == AUDIO_SUCCESS) {
- istream->rtag = ++rtag;
+ path->codec = codec;
+ path->statep = statep;
+ path->path_type = RECORD;
+ path->tag = ++rtag;
codec->nistream++;
- if (codec->istream) {
- audiohd_istream_t *p =
- codec->istream;
- while (p->next_stream)
- p = p->next_stream;
- p->next_stream = istream;
- } else {
- codec->istream = istream;
- }
+ statep->path[statep->pathnum++] = path;
widget->selconn = i;
- widget->priv = istream;
- istream = NULL;
+ widget->priv = path;
+ path = NULL;
break;
}
}
}
- if (istream)
- kmem_free(istream, sizeof (audiohd_istream_t));
+ if (path)
+ kmem_free(path, sizeof (audiohd_path_t));
} /* audiohd_build_input_path */
/*
@@ -3644,18 +3751,22 @@ audiohd_build_input_path(hda_codec_t *codec)
static void
audiohd_build_input_amp(hda_codec_t *codec)
{
- audiohd_istream_t *istream;
+ audiohd_path_t *path;
audiohd_widget_t *wsum, *wadc, *w;
audiohd_pin_t *pin;
uint_t gain;
wid_t wid;
- int i;
+ int i, j;
int weight;
- istream = codec->istream;
- while (istream) {
- wid = istream->adc_wid;
- wadc = codec->widget[wid];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == PLAY ||
+ path->codec != codec)
+ continue;
+
+ wid = path->adda_wid;
+ wadc = path->codec->widget[wid];
weight = wadc->in_weight;
/*
@@ -3665,21 +3776,21 @@ audiohd_build_input_amp(hda_codec_t *codec)
w = wadc;
while (w) {
if (w->outamp_cap & AUDIOHDC_AMP_CAP_MUTE_CAP) {
- istream->mute_wid = w->wid_wid;
- istream->mute_dir = AUDIOHDC_AMP_SET_OUTPUT;
+ path->mute_wid = w->wid_wid;
+ path->mute_dir = AUDIOHDC_AMP_SET_OUTPUT;
break;
}
if ((w->inamp_cap & AUDIOHDC_AMP_CAP_MUTE_CAP) &&
- (w->wid_wid != istream->sum_wid)) {
- istream->mute_wid = w->wid_wid;
- istream->mute_dir = AUDIOHDC_AMP_SET_INPUT;
+ (w->wid_wid != path->sum_wid)) {
+ path->mute_wid = w->wid_wid;
+ path->mute_dir = AUDIOHDC_AMP_SET_INPUT;
break;
}
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
if (w && w->in_weight != weight)
break;
}
@@ -3692,39 +3803,38 @@ audiohd_build_input_amp(hda_codec_t *codec)
gain = 0;
while (w) {
gain = (w->outamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS);
- if (gain && gain > istream->gain_bits) {
- istream->gain_dir = AUDIOHDC_AMP_SET_OUTPUT;
- istream->gain_bits = gain;
- istream->gain_wid = w->wid_wid;
+ if (gain && gain > path->gain_bits) {
+ path->gain_dir = AUDIOHDC_AMP_SET_OUTPUT;
+ path->gain_bits = gain;
+ path->gain_wid = w->wid_wid;
}
gain = w->inamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS;
- if (gain && (gain > istream->gain_bits) &&
- (w->wid_wid != istream->sum_wid)) {
- istream->gain_dir = AUDIOHDC_AMP_SET_INPUT;
- istream->gain_bits = gain;
- istream->gain_wid = w->wid_wid;
+ if (gain && (gain > path->gain_bits) &&
+ (w->wid_wid != path->sum_wid)) {
+ path->gain_dir = AUDIOHDC_AMP_SET_INPUT;
+ path->gain_bits = gain;
+ path->gain_wid = w->wid_wid;
}
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
- istream->gain_bits >>= AUDIOHD_GAIN_OFF;
+ path->gain_bits >>= AUDIOHD_GAIN_OFF;
/*
* If the input path has one pin only, the mute/amp
* controlling is shared by the whole path and pin
*/
- if (istream->pin_nums == 1) {
- wid = istream->pin_wid[0];
- w = codec->widget[wid];
+ if (path->pin_nums == 1) {
+ wid = path->pin_wid[0];
+ w = path->codec->widget[wid];
pin = (audiohd_pin_t *)w->priv;
- pin->gain_dir = istream->gain_dir;
- pin->gain_bits = istream->gain_bits;
- pin->gain_wid = istream->gain_wid;
- pin->mute_wid = istream->mute_wid;
- pin->mute_dir = istream->mute_dir;
- istream = istream->next_stream;
+ pin->gain_dir = path->gain_dir;
+ pin->gain_bits = path->gain_bits;
+ pin->gain_wid = path->gain_wid;
+ pin->mute_wid = path->mute_wid;
+ pin->mute_dir = path->mute_dir;
continue;
}
@@ -3733,16 +3843,12 @@ audiohd_build_input_amp(hda_codec_t *codec)
* or mixer along the input path, and the sum_wid
* is the widget's node id.
*/
- wid = istream->sum_wid;
- wsum = codec->widget[wid]; /* sum widget */
- if (wsum == NULL) {
- istream = istream->next_stream;
- continue;
- }
+ wid = path->sum_wid;
+ wsum = path->codec->widget[wid]; /* sum widget */
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- w = codec->widget[wid];
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
pin = (audiohd_pin_t *)w->priv;
/* find node for mute */
@@ -3750,8 +3856,8 @@ audiohd_build_input_amp(hda_codec_t *codec)
pin->mute_wid = wsum->wid_wid;
pin->mute_dir = AUDIOHDC_AMP_SET_INPUT;
} else {
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[i]];
+ w = path->codec->widget[wid];
while (w) {
if (w->outamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
@@ -3771,14 +3877,14 @@ audiohd_build_input_amp(hda_codec_t *codec)
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
}
/* find node for amp controlling */
gain = (wsum->inamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS);
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[i]];
+ w = path->codec->widget[wid];
while (w) {
gain = (w->outamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS);
@@ -3797,11 +3903,10 @@ audiohd_build_input_amp(hda_codec_t *codec)
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
pin->gain_bits >>= AUDIOHD_GAIN_OFF;
}
- istream = istream->next_stream;
}
} /* audiohd_build_input_amp() */
@@ -3815,17 +3920,20 @@ static void
audiohd_finish_input_path(hda_codec_t *codec)
{
audiohd_state_t *statep = codec->soft_statep;
- audiohd_istream_t *istream;
+ audiohd_path_t *path;
audiohd_widget_t *w, *wsum;
uint_t caddr = codec->index;
wid_t wid;
- int i;
+ int i, j;
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- wid = istream->adc_wid;
- w = codec->widget[wid];
- while (w && (w->wid_wid != istream->sum_wid) &&
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == PLAY ||
+ path->codec != codec)
+ continue;
+ wid = path->adda_wid;
+ w = path->codec->widget[wid];
+ while (w && (w->wid_wid != path->sum_wid) &&
(w->type != WTYPE_PIN)) {
if ((w->type == WTYPE_AUDIO_SEL) && (w->nconns > 1))
(void) audioha_codec_verb_get(statep, caddr,
@@ -3851,7 +3959,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
}
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
/*
@@ -3866,8 +3974,8 @@ audiohd_finish_input_path(hda_codec_t *codec)
/*
* deal with multi-pin input devices.
*/
- wid = istream->sum_wid;
- wsum = codec->widget[wid];
+ wid = path->sum_wid;
+ wsum = path->codec->widget[wid];
if (wsum == NULL)
continue;
if (wsum->outamp_cap) {
@@ -3878,25 +3986,25 @@ audiohd_finish_input_path(hda_codec_t *codec)
AUDIOHDC_GAIN_MAX);
}
- for (i = 0; i < istream->pin_nums; i++) {
+ for (j = 0; j < path->pin_nums; j++) {
if (wsum->inamp_cap) {
(void) audioha_codec_4bit_verb_get(statep,
caddr,
wsum->wid_wid, AUDIOHDC_VERB_SET_AMP_MUTE,
AUDIOHDC_AMP_SET_LR_INPUT |
AUDIOHDC_GAIN_MAX |
- (istream->sum_selconn[i] <<
+ (path->sum_selconn[j] <<
AUDIOHDC_AMP_SET_INDEX_OFFSET));
}
if (wsum->type == WTYPE_AUDIO_SEL) {
(void) audioha_codec_verb_get(statep, caddr,
wsum->wid_wid,
AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
+ path->sum_selconn[j]);
}
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[j]];
+ w = path->codec->widget[wid];
while (w && w->type != WTYPE_PIN) {
if ((w->type != WTYPE_AUDIO_MIX) &&
(w->nconns > 1))
@@ -3927,7 +4035,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
AUDIOHDC_AMP_SET_INDEX_OFFSET));
}
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
}
} /* end of istream loop */
@@ -3947,7 +4055,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
*/
static int
audiohd_find_inpin_for_monitor(hda_codec_t *codec,
- audiohd_ostream_t *ostream, wid_t id, int mixer)
+ audiohd_path_t *path, wid_t id, int mixer)
{
wid_t wid;
audiohd_widget_t *widget;
@@ -3965,24 +4073,19 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
return (uint32_t)(AUDIO_FAILURE);
switch (pin->device) {
case DTYPE_SPDIF_IN:
- ATRACE("Monitor SPDIF found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_CD:
- ATRACE("Monitor CD found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_LINE_IN:
- ATRACE("Monitor Line in found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_MIC_IN:
- ATRACE("Monitor Mic found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_AUX:
widget->path_flags |= AUDIOHD_PATH_MON;
- ATRACE("Monitor AUX found!", NULL);
return (AUDIO_SUCCESS);
default:
return (uint32_t)(AUDIO_FAILURE);
@@ -4006,7 +4109,7 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
AUDIOHD_PATH_DAC)
continue;
if (audiohd_find_inpin_for_monitor(codec,
- ostream,
+ path,
widget->avail_conn[i], mixer) ==
AUDIO_SUCCESS) {
widget->selmon[widget->used++] = i;
@@ -4021,7 +4124,7 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
AUDIOHD_PATH_DAC)
continue;
if (audiohd_find_inpin_for_monitor(codec,
- ostream,
+ path,
widget->avail_conn[i],
mixer) ==
AUDIO_SUCCESS) {
@@ -4055,99 +4158,106 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
static void
audiohd_build_monitor_path(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
- audiohd_widget_t *widget;
- wid_t wid;
- int i, j, k, find;
- int mixernum = 0;
-
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
- widget = codec->widget[wid];
- k = 0;
-
- while (widget) {
- while (widget && ((widget->type != WTYPE_AUDIO_MIX) ||
- (widget->nconns < 2))) {
- if (widget->selconn == AUDIOHD_NULL_CONN)
- break;
- wid = widget->avail_conn[widget->selconn];
- widget = codec->widget[wid];
- }
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ audiohd_state_t *statep = codec->soft_statep;
+ wid_t wid;
+ int i, j, k, l, find;
+ int mixernum = 0;
- /*
- * No mixer in this output path, we cannot build
- * mixer path for this path, skip it, and continue
- * for next output path.
- */
- if (widget == NULL || widget->selconn ==
- AUDIOHD_NULL_CONN) {
- break;
- }
- mixernum++;
- for (j = 0; j < widget->nconns; j++) {
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec ||path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ l = 0;
+ while (widget) {
+ while (widget &&
+ ((widget->type != WTYPE_AUDIO_MIX) ||
+ (widget->nconns < 2))) {
+ if (widget->selconn ==
+ AUDIOHD_NULL_CONN)
+ break;
+ wid =
+ widget->avail_conn[widget->selconn];
+ widget = codec->widget[wid];
+ }
/*
- * this connection must be routined to DAC
- * instead
- * of an input pin widget, we needn't waste
- * time for
- * it
+ * No mixer in this output path, we cannot build
+ * mixer path for this path, skip it,
+ * and continue
+ * for next output path.
*/
- if (widget->selconn == j)
- continue;
- find = 0;
- if (audiohd_find_inpin_for_monitor(codec,
- ostream,
- widget->avail_conn[j], 0) ==
- AUDIO_SUCCESS) {
- ostream->mon_wid[i][k] = wid;
- widget->selmon[widget->used++] = j;
- widget->path_flags |= AUDIOHD_PATH_MON;
- find = 1;
- ATRACE("Exclusive monitor found",
- NULL);
- } else if (
- audiohd_find_inpin_for_monitor(codec,
- ostream,
- widget->avail_conn[j], 1) ==
- AUDIO_SUCCESS) {
- ostream->mon_wid[i][k] = wid;
- widget->selmon[widget->used++] = j;
- widget->path_flags |= AUDIOHD_PATH_MON;
+ if (widget == NULL || widget->selconn ==
+ AUDIOHD_NULL_CONN) {
+ break;
+ }
+ mixernum++;
+ for (k = 0; k < widget->nconns; k++) {
+
+ /*
+ * this connection must be routined
+ * to DAC instead of an input pin
+ * widget, we needn't waste time for
+ * it
+ */
+ if (widget->selconn == k)
+ continue;
+ find = 0;
+ if (audiohd_find_inpin_for_monitor(
+ codec,
+ path,
+ widget->avail_conn[k], 0) ==
+ AUDIO_SUCCESS) {
+ path->mon_wid[j][l] = wid;
+ widget->selmon[widget->used++] =
+ k;
+ widget->path_flags |=
+ AUDIOHD_PATH_MON;
+ find = 1;
+ } else if (
+ audiohd_find_inpin_for_monitor(
+ codec,
+ path,
+ widget->avail_conn[k], 1) ==
+ AUDIO_SUCCESS) {
+ path->mon_wid[j][l] = wid;
+ widget->selmon[widget->used++] =
+ k;
+ widget->path_flags |=
+ AUDIOHD_PATH_MON;
+ find = 1;
- find = 1;
- ATRACE("Share monitor found", NULL);
+ }
}
+ /*
+ * we needn't check widget->selconn here
+ * since this
+ * widget is a selector or mixer, it cannot
+ * be NULL connection.
+ */
+ if (!find) {
+ path->mon_wid[i][l] = 0;
+ widget->path_flags |=
+ AUDIOHD_PATH_NOMON;
+ }
+ wid = widget->avail_conn[widget->selconn];
+ widget = codec->widget[wid];
+ l++;
}
-
- /*
- * we needn't check widget->selconn here since this
- * widget
- * is a selector or mixer, it cannot be NULL connection.
- */
- if (!find) {
- ATRACE_32(
- "No input pin found on this mixer:",
- widget->wid_wid);
- ostream->mon_wid[i][k] = 0;
- widget->path_flags |= AUDIOHD_PATH_NOMON;
- }
- wid = widget->avail_conn[widget->selconn];
- widget = codec->widget[wid];
- k++;
- }
- ostream->maxmixer[i] = k;
+ path->maxmixer[j] = l;
}
- ostream = ostream->next_stream;
}
if (mixernum == 0)
- ATRACE("Monitor unsupported", NULL);
+ statep->monitor_unsupported = B_TRUE;
+ else
+ statep->monitor_unsupported = B_FALSE;
} /* audiohd_build_monitor_path */
/*
@@ -4192,7 +4302,6 @@ audiohd_do_finish_monitor_path(hda_codec_t *codec, audiohd_widget_t *wgt)
(void) audioha_codec_verb_get(statep, caddr,
widget->wid_wid,
AUDIOHDC_VERB_SET_CONN_SEL, widget->selmon[0]);
- ATRACE("Monitor selector exist!", NULL);
}
widget->finish = 1;
if (widget->used == 0)
@@ -4215,16 +4324,19 @@ audiohd_do_finish_monitor_path(hda_codec_t *codec, audiohd_widget_t *wgt)
static void
audiohd_finish_monitor_path(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget;
+ audiohd_state_t *statep = codec->soft_statep;
wid_t wid;
- int i, j;
+ int i, j, k;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- for (j = 0; j < ostream->maxmixer[j]; j++) {
- wid = ostream->mon_wid[i][j];
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec || path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ for (k = 0; k < path->maxmixer[j]; k++) {
+ wid = path->mon_wid[j][k];
if (wid == 0) {
continue;
}
@@ -4232,7 +4344,6 @@ audiohd_finish_monitor_path(hda_codec_t *codec)
audiohd_do_finish_monitor_path(codec, widget);
}
}
- ostream = ostream->next_stream;
}
} /* audiohd_finish_monitor_path */
@@ -4294,20 +4405,23 @@ audiohd_do_build_monitor_amp(hda_codec_t *codec, audiohd_pin_t *pin,
static void
audiohd_build_monitor_amp(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget, *w;
+ audiohd_state_t *statep = codec->soft_statep;
audiohd_pin_t *pin;
wid_t wid, id;
- int i, j;
+ int i, j, k;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- id = ostream->pin_wid[i];
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec || path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ id = path->pin_wid[j];
w = codec->widget[id];
pin = (audiohd_pin_t *)(w->priv);
- for (j = 0; j < ostream->maxmixer[i]; j++) {
- wid = ostream->mon_wid[i][j];
+ for (k = 0; k < path->maxmixer[j]; k++) {
+ wid = path->mon_wid[j][k];
if (!wid)
continue;
widget = codec->widget[wid];
@@ -4315,10 +4429,10 @@ audiohd_build_monitor_amp(hda_codec_t *codec)
widget);
}
}
- ostream = ostream->next_stream;
}
}
+
/*
* audiohd_build_path()
*
@@ -4350,984 +4464,854 @@ audiohd_build_path(audiohd_state_t *statep)
} /* audiohd_build_path */
/*
- * audiohd_init_ports()
- *
- * Description:
- * Since the Solaris framework only supports 5 types of output port,
- * and each type can have only one instance. So we use a global
- * array (g_outport) to hold all output ports, and when the framework
- * has this restriction lifted, we need to reimplement it.
+ * audiohd_allocate_port()
*/
static int
-audiohd_init_ports(audiohd_state_t *statep)
+audiohd_allocate_port(audiohd_state_t *statep)
{
- hda_codec_t *codec;
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
- audiohd_widget_t *widget;
- audiohd_pin_t *pin;
- uint_t inputs, outputs;
- int i;
- uint32_t ctrl;
- uint8_t ctrl8;
+ int i, j;
+ audiohd_port_t *port;
+ int dir;
+ unsigned caps;
+ char *prop;
+ int rc;
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ uint64_t buf_phys_addr;
+ sd_bdle_t *entry;
+ uint16_t gcap;
+ size_t real_size;
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++)
- if (statep->codec[i]) {
- codec = statep->codec[i];
+ adev = statep->adev;
+ dip = statep->hda_dip;
+
+ ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffffffffffffULL, /* addr_hi */
+ 0x00000000ffffffffULL, /* count_max */
+ 128, /* 128-byte alignment as HD spec */
+ 0xfff, /* burstsize */
+ 1, /* minxfer */
+ 0xffffffff, /* maxxfer */
+ 0xffffffff, /* seg */
+ 1, /* sgllen */
+ 1, /* granular */
+ 0 /* flags */
+ };
+
+ gcap = AUDIOHD_REG_GET16(AUDIOHD_REG_GCAP);
+ if ((gcap & AUDIOHDR_GCAP_64OK) == 0)
+ dma_attr.dma_attr_addr_hi = 0xffffffffUL;
+
+ for (i = 0; i < PORT_MAX; i++) {
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ port->started = B_FALSE;
+ port->triggered = B_FALSE;
+ statep->port[i] = port;
+ port->statep = statep;
+ switch (i) {
+ case PORT_ADC:
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = statep->rchan;
+ port->index = 1;
+ port->regoff = AUDIOHD_REG_SD_BASE;
break;
+ case PORT_DAC:
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ port->nchan = statep->pchan;
+ port->index = statep->hda_input_streams + 1;
+ port->regoff = AUDIOHD_REG_SD_BASE +
+ AUDIOHD_REG_SD_LEN *
+ statep->hda_input_streams;
+ break;
+ default:
+ return (DDI_FAILURE);
}
- if (codec == NULL)
- return (DDI_FAILURE);
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, AUDIOHD_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < AUDIOHD_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, AUDIOHD_INTS);
+ port->intrs = AUDIOHD_INTS;
+ } else if (port->intrs > AUDIOHD_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, AUDIOHD_INTS);
+ port->intrs = AUDIOHD_INTS;
+ }
- if (codec->ostream) {
- outputs = 0;
- ostream = codec->ostream;
- while (ostream) {
- ostream->in_use = 1;
- for (i = 0; i < ostream->pin_nums; i++) {
- widget = codec->widget[ostream->pin_wid[i]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPDIF_OUT) {
- ATRACE("SPDIFOUT found!", NULL);
- pin->sada_porttype = AUDIO_SPDIF_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_SPDIF_OUT;
- ctrl = audioha_codec_verb_get(statep,
- codec->index, ostream->dac_wid,
- AUDIOHDC_VERB_GET_SPDIF_CONTROL, 0);
- ctrl |= AUDIOHD_SPDIF_ON;
- ctrl8 = ctrl & AUDIOHD_SPDIF_MASK;
- (void) audioha_codec_verb_get(statep,
- codec->index,
- ostream->dac_wid,
- AUDIOHDC_VERB_SET_SPDIF_LCONTROL,
- ctrl8);
- } else if (pin->device == DTYPE_LINEOUT) {
- pin->sada_porttype = AUDIO_LINE_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_LINE_OUT;
- } else if (pin->device == DTYPE_SPEAKER) {
- pin->sada_porttype = AUDIO_SPEAKER |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_SPEAKER;
-
- } else if (pin->device == DTYPE_HP_OUT) {
- pin->sada_porttype = AUDIO_HEADPHONE |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_HEADPHONE;
- } else {
- pin->sada_porttype = AUDIO_AUX1_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_AUX1_OUT;
- }
- }
- ostream = ostream->next_stream;
+ port->format = AUDIOHD_FMT_PCM;
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = (port->fragfr + AUDIOHD_FRAGFR_ALIGN - 1) & ~
+ (AUDIOHD_FRAGFR_ALIGN - 1);
+ port->samp_size = port->fragfr * port->nchan * 2;
+ port->samp_size = (port->samp_size +
+ AUDIOHD_BDLE_BUF_ALIGN - 1) & ~
+ (AUDIOHD_BDLE_BUF_ALIGN - 1);
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d",
+ rc);
+ goto error_alloc_dma_exit1;
}
- statep->hda_info_defaults.play.port = outputs;
- statep->hda_info_defaults.play.avail_ports = outputs;
- statep->hda_info_defaults.play.mod_ports = outputs;
- statep->hda_out_ports = outputs;
- ostream = codec->ostream;
- while (ostream) {
- if (ostream->in_use == 0)
- break;
- (void) audioha_codec_verb_get(statep, codec->index,
- ostream->dac_wid, AUDIOHDC_VERB_SET_STREAM_CHANN,
- statep->hda_play_stag << AUDIOHD_PLAY_TAG_OFF);
- ostream = ostream->next_stream;
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size *
+ AUDIOHD_BDLE_NUMS,
+ &hda_dev_accattr,
+ DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &real_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ goto error_alloc_dma_exit2;
}
- }
- /*
- * Init input ports. Because solaris supports just one MIC, so we
- * will enable all MICs if applications select MIC as input sources.
- * For others, we do the same.
- */
- inputs = 0;
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- istream->in_use = 1;
- for (i = 0; i < istream->pin_nums; i++) {
- widget = codec->widget[istream->pin_wid[i]];
- pin = (audiohd_pin_t *)widget->priv;
- switch (pin->device) {
- case DTYPE_SPDIF_IN:
- break;
- case DTYPE_MIC_IN:
- inputs |= AUDIO_MICROPHONE;
- pin->sada_porttype = AUDIO_MICROPHONE |
- AUDIOHD_SADA_INPUT;
- if (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)
- statep->hda_record_stag =
- istream->rtag;
- break;
- case DTYPE_LINE_IN:
- inputs |= AUDIO_LINE_IN;
- pin->sada_porttype = AUDIO_LINE_IN |
- AUDIOHD_SADA_INPUT;
- break;
- case DTYPE_CD:
- inputs |= AUDIO_CD;
- pin->sada_porttype = AUDIO_CD |
- AUDIOHD_SADA_INPUT;
- break;
- case DTYPE_AUX:
- inputs |= AUDIO_AUX1_IN |
- AUDIOHD_SADA_INPUT;
- }
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, real_size, dir,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ goto error_alloc_dma_exit3;
}
- if (inputs & AUDIO_MICROPHONE)
- statep->hda_info_defaults.record.port =
- AUDIO_MICROPHONE;
- else if (inputs & AUDIO_LINE_IN)
- statep->hda_info_defaults.record.port = AUDIO_LINE_IN;
- else if (inputs & AUDIO_CD)
- statep->hda_info_defaults.record.port = AUDIO_CD;
- else if (inputs & AUDIO_AUX1_IN)
- statep->hda_info_defaults.record.port = AUDIO_AUX1_IN;
- else if (inputs & AUDIO_SPDIF_IN)
- statep->hda_info_defaults.record.port = AUDIO_SPDIF_IN;
- else
- statep->hda_info_defaults.record.port = 0;
+ port->samp_paddr = (uint64_t)cookie.dmac_laddress;
- statep->hda_info_defaults.record.avail_ports = inputs;
- statep->hda_info_defaults.record.mod_ports = inputs;
- statep->hda_in_port = 0;
+ /*
+ * now, from here we allocate DMA
+ * memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev,
+ "ddi_dma_alloc_handle(bdlist) failed");
+ goto error_alloc_dma_exit3;
+ }
- (void) audioha_codec_verb_get(statep, codec->index,
- istream->adc_wid, AUDIOHDC_VERB_SET_STREAM_CHANN,
- istream->rtag << AUDIOHD_REC_TAG_OFF);
- }
+ /*
+ * we allocate all buffer descriptors lists in continuous
+ * dma memory.
+ */
+ port->bdl_size = sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &hda_dev_accattr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &real_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev,
+ "ddi_dma_mem_alloc(bdlist) failed");
+ goto error_alloc_dma_exit4;
+ }
- return (DDI_SUCCESS);
-} /* audiohd_init_ports() */
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL,
+ port->bdl_kaddr,
+ real_size, DDI_DMA_WRITE | DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ goto error_alloc_dma_exit5;
+ }
+ port->bdl_paddr = (uint64_t)cookie.dmac_laddress;
-/*
- * audiohd_disable_intr()
- *
- * Description:
- * Disable all possible interrupts.
- */
-static void
-audiohd_disable_intr(audiohd_state_t *statep)
-{
- int i;
- uint32_t base;
+ entry = (sd_bdle_t *)port->bdl_kaddr;
+ buf_phys_addr = port->samp_paddr;
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL, 0);
- base = AUDIOHD_REG_SD_BASE;
- for (i = 0; i < statep->hda_streams_nums; i++) {
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
- base += AUDIOHD_REG_SD_LEN;
+ for (j = 0; j < AUDIOHD_BDLE_NUMS; j++) {
+ entry->sbde_addr = buf_phys_addr;
+ entry->sbde_len = port->samp_size;
+ entry->sbde_ioc = 1;
+ buf_phys_addr += port->samp_size;
+ entry++;
+ }
+ (void) ddi_dma_sync(port->bdl_dmah, 0, sizeof (sd_bdle_t) *
+ AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
+ port->curpos = 0;
+
+ port->engine = audio_engine_alloc(&audiohd_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ goto error_alloc_dma_exit5;
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
}
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, (uint32_t)(-1));
-} /* audiohd_disable_intr() */
+ return (DDI_SUCCESS);
+error_alloc_dma_exit5:
+ ddi_dma_mem_free(&port->bdl_acch);
+error_alloc_dma_exit4:
+ ddi_dma_free_handle(&port->bdl_dmah);
-/*
- * audiohd_reset_stream()
- *
- * Description:
- * Reset specified stream
- */
-static int
-audiohd_reset_stream(audiohd_state_t *statep, int stream)
-{
- uint32_t base;
- uint8_t bTmp;
- int i;
+error_alloc_dma_exit3:
+ ddi_dma_mem_free(&port->samp_acch);
- base = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * stream;
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
+error_alloc_dma_exit2:
+ ddi_dma_free_handle(&port->samp_dmah);
- /* stop stream */
- bTmp &= ~AUDIOHD_REG_RIRBSIZE;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+error_alloc_dma_exit1:
+ return (AUDIO_FAILURE);
- /* wait 40us for stream to stop as HD spec */
- drv_usecwait(40);
+}
- /* reset stream */
- bTmp |= AUDIOHDR_SD_CTL_SRST;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+static void
+audiohd_free_port(audiohd_state_t *statep)
+{
+ int i;
+ audiohd_port_t *port;
- for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
- /* Empirical testing time, which works well */
- drv_usecwait(50);
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
- bTmp &= AUDIOHDR_SD_CTL_SRST;
- if (bTmp)
- break;
+ if (statep == NULL) {
+ return;
}
+ for (i = 0; i < PORT_MAX; i++) {
+ port = statep->port[i];
+ if (port == NULL)
+ continue;
+ if (port->engine) {
+ audio_dev_remove_engine(statep->adev,
+ port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->samp_dmah) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ if (port->bdl_dmah) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
- if (!bTmp) {
- audio_sup_log(NULL, CE_WARN, "!Failed to reset stream %d",
- stream);
- return (AUDIO_FAILURE);
+ kmem_free(port, sizeof (audiohd_port_t));
}
+}
- /* Empirical testing time, which works well */
- drv_usecwait(300);
-
- /* exit reset stream */
- bTmp &= ~AUDIOHDR_SD_CTL_SRST;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
-
- for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
- /* Empircal testing time */
- drv_usecwait(50);
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
- bTmp &= AUDIOHDR_SD_CTL_SRST;
- if (!bTmp)
- break;
- }
+/*
+ * audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+ * Description:
+ * This routine is used to change the widget power betwen D0 and D2.
+ * D0 is fully on; D2 allows the lowest possible power consuming state
+ * from which it can return to the fully on state: D0.
+ */
+static void
+audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+{
+ int i;
+ wid_t wid;
+ hda_codec_t *codec;
+ audiohd_widget_t *widget;
- if (bTmp) {
- audio_sup_log(NULL, CE_WARN,
- "!Failed to exit reset state for"
- " stream %d, bTmp=0x%02x", stream, bTmp);
- return (AUDIO_FAILURE);
+ /* Change power to D2 */
+ if (off) {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ for (wid = codec->first_wid; wid <= codec->last_wid;
+ wid++) {
+ widget = codec->widget[wid];
+ if (widget->widget_cap &
+ AUDIOHD_WIDCAP_PWRCTRL) {
+ (void) audioha_codec_verb_get(statep,
+ codec->index, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE,
+ AUDIOHD_PW_D2);
+ }
+ }
+ }
+ /* Change power to D0 */
+ } else {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ for (wid = codec->first_wid; wid <= codec->last_wid;
+ wid++) {
+ widget = codec->widget[wid];
+ if (widget->widget_cap &
+ AUDIOHD_WIDCAP_PWRCTRL) {
+ (void) audioha_codec_verb_get(statep,
+ codec->index, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE,
+ AUDIOHD_PW_D0);
+ }
+ }
+ }
}
-
- return (AUDIO_SUCCESS);
-
-} /* audiohd_reset_stream() */
-
+}
/*
- * audiohd_preset_rbuf()
- *
+ * audiohd_restore_path()
* Description:
- * Fill out entries of stream descriptor list for
- * recording.
+ * This routine is used to restore the path on the codec.
*/
static void
-audiohd_preset_rbuf(audiohd_state_t *statep)
+audiohd_restore_path(audiohd_state_t *statep)
{
- sd_bdle_t *entry;
- uint64_t buf_phys_addr;
- int i;
-
- entry = (sd_bdle_t *)(statep->hda_dma_record_bd.ad_vaddr);
- buf_phys_addr = statep->hda_dma_record_buf.ad_paddr;
+ int i;
+ hda_codec_t *codec;
- for (i = 0; i < AUDIOHD_BDLE_NUMS; i++) {
- entry->sbde_addr = buf_phys_addr;
- entry->sbde_len = statep->hda_rbuf_size;
- entry->sbde_ioc = 1;
- buf_phys_addr += statep->hda_rbuf_size;
- entry++;
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ audiohd_finish_output_path(statep->codec[i]);
+ audiohd_finish_input_path(statep->codec[i]);
+ audiohd_finish_monitor_path(statep->codec[i]);
}
-
- (void) ddi_dma_sync(statep->hda_dma_record_bd.ad_dmahdl, 0,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
-
-} /* audiohd_preset_rbuf() */
+}
/*
- * audiohd_fill_pbuf()
- *
- * Description:
- * Get pending audio data, and fill out entries of stream descriptor
- * list for playback. This routine returns AUDIO_FAILURE if it doesn't
- * fill any audio samples to DMA buffers. This can happen:
- * 1) when mixer cannot provide any samples;
- * 2) playback has been stopped during fetching samples;
+ * restore_play_and_record()
*/
-static int
-audiohd_fill_pbuf(audiohd_state_t *statep)
+static void
+audiohd_restore_play_and_record(audiohd_state_t *statep)
{
- uint64_t buf_phys_addr;
- sd_bdle_t *entry;
- char *buf;
- int samples;
- int rs;
int i;
+ audiohd_port_t *port;
- entry = (sd_bdle_t *)(statep->hda_dma_play_bd.ad_vaddr);
- buf = (char *)(statep->hda_dma_play_buf.ad_vaddr);
- buf_phys_addr = statep->hda_dma_play_buf.ad_paddr;
-
- /* assume that 2-channel, 16-bit */
- samples = statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS / 2;
-
- mutex_exit(&statep->hda_mutex);
- rs = am_get_audio(statep->hda_ahandle, buf,
- AUDIO_NO_CHANNEL, samples);
mutex_enter(&statep->hda_mutex);
+ for (i = 0; i < PORT_MAX; i++) {
+ port = statep->port[i];
+ if (port == NULL)
+ continue;
+ if (port != NULL)
+ audio_engine_reset(port->engine);
+ if (port->triggered) {
+ (void) audiohd_reset_port(port);
+ audiohd_start_port(port);
+ } else {
+ audiohd_stop_port(port);
- if (rs == 0) {
- /*
- * If system is busy so that no sample is available, an
- * AUDIO_PLAY_EMPTY flag is set. And we will try to get
- * sample to refill play buffer when we receive an interrupt.
- * Only if we still cannot get sample then, we could stop
- * the playback engine.
- */
- statep->hda_flags |= AUDIOHD_PLAY_EMPTY;
-
- } else if (rs < 0) {
- /*
- * Unknown error occurs, we have to stop playback.
- */
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!fill_pbuf() failed to get play sample");
- statep->hda_flags &= ~AUDIOHD_PLAY_STARTED;
- return (AUDIO_FAILURE);
- } else {
-
- (void) ddi_dma_sync(statep->hda_dma_play_buf.ad_dmahdl,
- 0, rs << 2, DDI_DMA_SYNC_FORDEV);
- }
-
- /*
- * Because users can quickly start and stop audio streams, it
- * is possible that playback already stopped before we re-grab
- * mutex. In this case, we dispose fetched samples, and return
- * AUDIO_FAILURE as we didn't get samples.
- */
- if ((statep->hda_flags & AUDIOHD_PLAY_STARTED) == 0) {
- return (AUDIO_FAILURE);
- }
-
- for (i = 0; i < AUDIOHD_BDLE_NUMS; i++) {
- entry->sbde_addr = buf_phys_addr;
- entry->sbde_len = statep->hda_pbuf_size;
- entry->sbde_ioc = 1;
- buf_phys_addr += statep->hda_pbuf_size;
- entry++;
+ }
}
-
- (void) ddi_dma_sync(statep->hda_dma_play_bd.ad_dmahdl, 0,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
-
- if (rs == samples)
- statep->hda_pbuf_pos = 0;
- else
- statep->hda_pbuf_pos = (rs << 1);
-
- return (AUDIO_SUCCESS);
-
-} /* audiohd_fill_pbuf() */
-
+ mutex_exit(&statep->hda_mutex);
+}
/*
- * audiohd_refill_pbuf()
- *
+ * audiohd_reset_pins_ur_cap()
* Description:
- * Called by interrupt handler.
+ * Enable the unsolicited response of the pins which have the unsolicited
+ * response capability
*/
static void
-audiohd_refill_pbuf(audiohd_state_t *statep)
+audiohd_reset_pins_ur_cap(audiohd_state_t *statep)
{
- int rs;
- int pos;
- char *buf;
- uint32_t len;
- uint32_t regbase = statep->hda_play_regbase;
-
- buf = (char *)(statep->hda_dma_play_buf.ad_vaddr);
- buf += statep->hda_pbuf_pos;
- pos = AUDIOHD_REG_GET32(regbase + AUDIOHD_SDREG_OFFSET_LPIB);
- pos &= AUDIOHD_POS_MASK;
+ hda_codec_t *codec;
+ audiohd_pin_t *pin;
+ audiohd_widget_t *widget;
+ uint32_t urctrl;
+ int i;
- if (pos > statep->hda_pbuf_pos) {
- len = (pos - statep->hda_pbuf_pos) & AUDIOHD_POS_MASK;
- } else {
- len = statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS -
- statep->hda_pbuf_pos;
- len &= AUDIOHD_POS_MASK;
+ for (i = 0; i <= AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ pin = codec->first_pin;
+ while (pin) {
+ /* enable the unsolicited response of the pin */
+ widget = codec->widget[pin->wid];
+ if ((widget->widget_cap &
+ (AUDIOHD_URCAP_MASK) &&
+ (pin->cap & AUDIOHD_DTCCAP_MASK)) &&
+ ((pin->device == DTYPE_LINEOUT) ||
+ (pin->device == DTYPE_SPDIF_OUT) ||
+ (pin->device == DTYPE_HP_OUT) ||
+ (pin->device == DTYPE_MIC_IN))) {
+ urctrl = (uint8_t)(1 <<
+ (AUDIOHD_UR_ENABLE_OFF - 1));
+ urctrl |= (pin->wid & AUDIOHD_UR_TAG_MASK);
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ pin->wid,
+ AUDIOHDC_VERB_SET_URCTRL, urctrl);
+ }
+ pin = pin->next;
+ }
}
- mutex_exit(&statep->hda_mutex);
- rs = am_get_audio(statep->hda_ahandle, buf,
- AUDIO_NO_CHANNEL, len / 2);
- mutex_enter(&statep->hda_mutex);
+}
+static void
+audiohd_restore_codec_gpio(audiohd_state_t *statep)
+{
+ int i;
+ wid_t wid;
+ hda_codec_t *codec;
+
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (codec == NULL)
+ continue;
+ wid = codec->wid_afg;
- (void) ddi_dma_sync(statep->hda_dma_play_buf.ad_dmahdl,
- statep->hda_pbuf_pos, rs << 2, DDI_DMA_SYNC_FORDEV);
+ /* power-up audio function group */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE, 0);
- if (rs > 0) {
- statep->hda_flags &= ~AUDIOHD_PLAY_EMPTY;
- statep->hda_pbuf_pos += (rs << 1);
- if (statep->hda_pbuf_pos >= statep->hda_pbuf_size *
- AUDIOHD_BDLE_NUMS)
- statep->hda_pbuf_pos = 0;
- return;
+ /* work around for Sony VAIO laptop with specific codec */
+ if ((codec->vid == AUDIOHD_CODECID_SONY1) ||
+ (codec->vid == AUDIOHD_CODECID_SONY2))
+ continue;
+ /*
+ * GPIO controls which are laptop specific workarounds and
+ * might be changed. Some laptops use GPIO, so we need to
+ * enable and set the GPIO correctly.
+ */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DIREC, statep->gpio_direct);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
}
+}
+/*
+ * audiohd_resume()
+ */
+static int
+audiohd_resume(audiohd_state_t *statep)
+{
+ uint8_t rirbsts;
- /* We didn't get any sample */
- if ((statep->hda_flags & AUDIOHD_PLAY_EMPTY) == 0)
- statep->hda_flags |= AUDIOHD_PLAY_EMPTY;
- else {
- /* once again, we don't get samples, stop it */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &= ~(AUDIOHD_PLAY_EMPTY |
- AUDIOHD_PLAY_STARTED);
-
- /* shutdown the mixer */
+ mutex_enter(&statep->hda_mutex);
+ statep->suspended = B_FALSE;
+ /* Restore the hda state */
+ if (audiohd_reinit_hda(statep) == AUDIO_FAILURE) {
+ audio_dev_warn(statep->adev,
+ "hda reinit failed");
mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- mutex_enter(&statep->hda_mutex);
+ return (DDI_SUCCESS);
}
+ /* reset to enable the capability of unsolicited response for pin */
+ audiohd_reset_pins_ur_cap(statep);
+ /* Enable interrupt */
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
+ AUDIOHD_INTCTL_BIT_GIE |
+ AUDIOHD_INTCTL_BIT_SIE);
+ /* clear the unsolicited response interrupt */
+ rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
+ AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
+ mutex_exit(&statep->hda_mutex);
-} /* audiohd_refill_pbuf() */
+ audiohd_restore_play_and_record(statep);
+ audiohd_configure_output(statep);
+ audiohd_restore_volume(statep);
+ audiohd_configure_input(statep);
+ /* set widget power to D0 */
+ audiohd_change_widget_power_state(statep, AUDIOHD_PW_ON);
+
+ return (DDI_SUCCESS);
+} /* audiohd_resume */
/*
- * audiohd_get_rbuf()
- *
- * Description:
- * Called by interrupt handler.
+ * audiohd_suspend()
*/
-static void
-audiohd_get_rbuf(audiohd_state_t *statep)
+static int
+audiohd_suspend(audiohd_state_t *statep)
{
- uint32_t regbase;
- uint32_t len;
- char *buf;
- int pos;
+ mutex_enter(&statep->hda_mutex);
+ statep->suspended = B_TRUE;
- regbase = statep->hda_record_regbase;
- pos = AUDIOHD_REG_GET32(regbase + AUDIOHD_SDREG_OFFSET_LPIB);
- pos &= AUDIOHD_POS_MASK;
- buf = (char *)statep->hda_dma_record_buf.ad_vaddr;
- buf += statep->hda_rbuf_pos;
+ /* set widget power to D2 */
+ audiohd_change_widget_power_state(statep, AUDIOHD_PW_OFF);
+ /* Disable h/w */
+ audiohd_disable_intr(statep);
+ audiohd_stop_dma(statep);
+ mutex_exit(&statep->hda_mutex);
- if (pos > statep->hda_rbuf_pos) {
- len = (pos - statep->hda_rbuf_pos) & AUDIOHD_POS_MASK;
- mutex_exit(&statep->hda_mutex);
- am_send_audio(statep->hda_ahandle, buf, AUDIO_NO_CHANNEL,
- len / 2);
- mutex_enter(&statep->hda_mutex);
- statep->hda_rbuf_pos += len;
- if (statep->hda_rbuf_pos >= statep->hda_rbuf_size *
- AUDIOHD_BDLE_NUMS)
- statep->hda_rbuf_pos = 0;
- } else {
- len = statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS -
- statep->hda_rbuf_pos;
- mutex_exit(&statep->hda_mutex);
- am_send_audio(statep->hda_ahandle, buf, AUDIO_NO_CHANNEL,
- len / 2);
- mutex_enter(&statep->hda_mutex);
- statep->hda_rbuf_pos = 0;
- }
+ return (DDI_SUCCESS);
+} /* audiohd_suspend */
-} /* audiohd_get_rbuf() */
+/*
+ * audiohd_disable_pin()
+ */
+static int
+audiohd_disable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+{
+ AUDIOHD_DISABLE_PIN_OUT(statep, caddr, wid);
+ return (AUDIO_SUCCESS);
+}
/*
- * auidohd_set_gain()
- *
- * Description:
- * Set gain value for the path
+ * audiohd_enable_pin()
*/
static int
-audiohd_set_gain(audiohd_state_t *statep, int dir, int gain, int channel)
+audiohd_enable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
{
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
+ AUDIOHD_ENABLE_PIN_OUT(statep, caddr, wid);
+ return (AUDIO_SUCCESS);
+}
+/*
+ * audiohd_change_speaker_state()
+ */
+static void
+audiohd_change_speaker_state(audiohd_state_t *statep, int on)
+{
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
audiohd_pin_t *pin;
- hda_codec_t *codec;
- uint_t tmp;
- uint_t caddr;
- uint_t val;
- int i;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i]) {
- codec = statep->codec[i];
- break;
- }
- }
- if (codec == NULL)
- return (DDI_FAILURE);
-
- caddr = codec->index;
- if (dir == AUDIO_PLAY) {
- if (channel == 0) { /* left channel */
- val = AUDIOHDC_AMP_SET_LEFT;
- statep->hda_play_lgain = gain;
- } else { /* right channel */
- val = AUDIOHDC_AMP_SET_RIGHT;
- statep->hda_play_rgain = gain;
- }
-
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- if (ostream->in_use == 0)
- break;
-
- if (ostream->gain_wid) {
- tmp = gain * ostream->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | ostream->gain_dir | tmp);
- continue;
- }
- /* We have to set each pin one by one */
- for (i = 0; i < ostream->pin_nums; i++) {
- audiohd_widget_t *w;
- wid_t wid;
+ int i, j;
+ wid_t wid;
- wid = ostream->pin_wid[i];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- if (pin->gain_wid) {
- tmp = gain * pin->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(
- statep, caddr,
- pin->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | pin->gain_dir | tmp);
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != PLAY)
+ continue;
+ if (on) {
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPEAKER) {
+ (void) audiohd_enable_pin(
+ statep,
+ path->codec->index,
+ pin->wid);
}
-
}
- }
- return (DDI_SUCCESS);
- }
-
- if (dir != AUDIO_RECORD)
- return (DDI_FAILURE);
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- if (istream->in_use == 0)
- break;
- if (istream->gain_wid) {
- tmp = gain * istream->gain_bits / AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(statep, caddr,
- istream->gain_wid, AUDIOHDC_VERB_SET_AMP_MUTE,
- val | istream->gain_dir | tmp);
} else {
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((statep->hda_in_port |
- AUDIOHD_SADA_OUTPUT) ==
- pin->sada_porttype) {
- tmp = gain * pin->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPEAKER) {
+ (void) audiohd_disable_pin(
statep,
- caddr,
- pin->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | pin->gain_dir | tmp);
+ path->codec->index,
+ pin->wid);
}
}
}
}
-
- return (DDI_SUCCESS);
-
-} /* audiohd_set_gain() */
-
+}
/*
- * audiohd_set_port()
+ * audiohd_select_mic()
*
* Description:
- *
+ * This function is used for the recording path which has a selector
+ * as the sumwidget. We select the external MIC if it is plugged into the
+ * MIC jack, otherwise the internal integrated MIC is selected.
*/
-static int
-audiohd_set_port(audiohd_state_t *statep, int dir, int port)
+static void
+audiohd_select_mic(audiohd_state_t *statep, uint8_t index,
+uint8_t id, int select)
{
- int i;
- uint_t tmp_port = 0;
- wid_t pin_wid = 0;
- int caddr;
- audiohd_istream_t *istream;
- audiohd_widget_t *w;
- audiohd_pin_t *pin;
hda_codec_t *codec;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget, *sumwgt;
+ audiohd_pin_t *pin;
+ int i, j;
+ wid_t wid;
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i])
- codec = statep->codec[i];
- }
+ codec = statep->codec[index];
if (codec == NULL)
- return (DDI_FAILURE);
-
- caddr = codec->index;
- if (dir == AUDIO_PLAY) {
- for (i = 0; i < AUDIOHD_PIN_NUMS-1; i++) {
- if (port & g_outport[i]) {
- tmp_port |= g_outport[i];
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT |
- g_outport[i]) ==
- pin->sada_porttype)
- AUDIOHD_ENABLE_PIN_OUT(statep,
- caddr,
- pin->wid);
- pin = pin->next;
- }
- } else if (statep->hda_out_ports & g_outport[i]) {
- tmp_port &= ~(g_outport[i]);
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT |
- g_outport[i]) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_OUT(statep,
- caddr,
- pin->wid);
- pin = pin->next;
+ return;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (path->codec != codec || path->path_type != RECORD)
+ continue;
+ sumwgt = codec->widget[path->sum_wid];
+ if (path && sumwgt &&
+ (sumwgt->type == WTYPE_AUDIO_SEL)) {
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ if (widget == NULL)
+ return;
+ pin = (audiohd_pin_t *)widget->priv;
+ if (select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ (void) audioha_codec_verb_get(
+ statep,
+ index,
+ path->sum_wid,
+ AUDIOHDC_VERB_SET_CONN_SEL,
+ path->sum_selconn[j]);
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ } else if (!select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ (void) audioha_codec_verb_get(
+ statep,
+ index,
+ path->sum_wid,
+ AUDIOHDC_VERB_SET_CONN_SEL,
+ path->sum_selconn[j]);
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
}
}
+ if (path == NULL)
+ break;
+ sumwgt = codec->widget[path->sum_wid];
}
- if (port & AUDIO_SPDIF_OUT) {
- tmp_port |= AUDIO_SPDIF_OUT;
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT | AUDIO_SPDIF_OUT) ==
- pin->sada_porttype)
- AUDIOHD_ENABLE_PIN_OUT(statep, caddr,
- pin->wid);
- pin = pin->next;
- }
-
- } else if (statep->hda_out_ports & AUDIO_SPDIF_OUT) {
- tmp_port &= ~(AUDIO_SPDIF_OUT);
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT | AUDIO_SPDIF_OUT) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_OUT(statep, caddr,
- pin->wid);
- pin = pin->next;
- }
- }
- statep->hda_out_ports = tmp_port;
- return (DDI_SUCCESS);
- }
-
- if (dir != AUDIO_RECORD) {
- return (DDI_FAILURE);
- }
-
- /* now, we handle recording */
- switch (port) {
- case AUDIO_NONE:
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((statep->hda_in_port | AUDIOHD_SADA_INPUT) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_IN(statep, caddr, pin->wid);
- }
- tmp_port = 0;
- pin_wid = 0;
- break;
- case AUDIO_MICROPHONE:
- case AUDIO_LINE_IN:
- case AUDIO_CD:
- case AUDIO_AUX1_IN:
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((port | AUDIOHD_SADA_INPUT) == pin->sada_porttype) {
- AUDIOHD_ENABLE_PIN_IN(statep, caddr, pin->wid);
- pin_wid = pin->wid;
- } else if ((statep->hda_in_port | AUDIOHD_SADA_INPUT) ==
- pin->sada_porttype) {
- AUDIOHD_DISABLE_PIN_IN(statep, caddr, pin->wid);
- }
- }
- tmp_port = port;
- break;
- default:
- break;
}
- statep->hda_in_port = tmp_port;
-
- /*
- * During path searching, we allow one real selector/mixer
- * in the input path. So, if there is a multi-input selector
- * we must set the right input connection for the selector.
- */
- if (pin_wid == 0)
- return (DDI_SUCCESS);
- w = codec->widget[pin_wid];
- pin = (audiohd_pin_t *)w->priv;
-
- /* find ADC widget */
- w = codec->widget[pin->adc_dac_wid];
-
- istream = (audiohd_istream_t *)w->priv;
-
/*
- * If there is a real selector in this input stream,
- * we select the right one input for the selector.
+ * If the input istream > 1, we should set the record stream tag
+ * respectively. All the input streams sharing one tag may make the
+ * record sound distorted.
*/
- if (istream->sum_wid) {
- w = codec->widget[istream->sum_wid];
- if (w->type == WTYPE_AUDIO_SEL) {
- for (i = 0; i < istream->pin_nums; i++)
- if (istream->pin_wid[i] == pin_wid)
- break;
- if (i > istream->pin_nums) {
- cmn_err(CE_WARN, "bug in istream-pin");
- } else {
- (void) audioha_codec_verb_get(
- statep, codec->index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
+ if (codec->nistream > 1) {
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != RECORD)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ if (widget == NULL)
+ return;
+ pin = (audiohd_pin_t *)widget->priv;
+ if (select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ } else if (!select &&
+ pin->device == DTYPE_MIC_IN &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_FIXED)) {
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ }
}
}
}
-
- return (DDI_SUCCESS);
-
-} /* audiohd_set_port() */
-
+}
/*
- * audiohd_do_mute_outputs()
+ * audiohd_pin_sense()
*
- * Description:
- * Mute the output path.
+ * Description
+ *
+ * When the earphone is plugged into the jack associtated with the pin
+ * complex, we disable the built in speaker. When the earphone is plugged
+ * out of the jack, we enable the built in speaker.
*/
static void
-audiohd_do_mute_outputs(audiohd_state_t *statep,
- audiohd_ostream_t *ostream, hda_codec_t *codec,
- boolean_t mute)
+audiohd_pin_sense(audiohd_state_t *statep, uint32_t resp, uint32_t respex)
{
- audiohd_widget_t *w;
+ uint8_t index;
+ uint8_t id;
+ uint32_t rs;
+ audiohd_widget_t *widget;
audiohd_pin_t *pin;
- wid_t wid;
- int lgain, rgain;
- int j;
- uint_t lg, rg;
- uint16_t caddr = codec->index;
-
- if (mute == 0) {
- if (ostream->mute_wid) {
- if (ostream->mute_wid ==
- ostream->gain_wid) {
- lgain = statep->hda_play_lgain *
- ostream->gain_bits /
- AUDIO_MAX_GAIN;
- rgain = statep->hda_play_rgain *
- ostream->gain_bits /
- AUDIO_MAX_GAIN;
- } else {
- lgain = AUDIOHDC_GAIN_MAX;
- rgain = AUDIOHDC_GAIN_MAX;
- }
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_LEFT |
- lgain);
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_RIGHT |
- rgain);
- } else {
- for (j = 0; j < ostream->pin_nums;
- j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- lg = statep->hda_play_lgain;
- rg = statep->hda_play_rgain;
- pin = (audiohd_pin_t *)w->priv;
- if (pin->mute_wid ==
- pin->gain_wid) {
- lgain =
- lg *
- pin->gain_bits /
- AUDIO_MAX_GAIN;
- rgain =
- rg *
- pin->gain_bits /
- AUDIO_MAX_GAIN;
- } else {
- lgain =
- AUDIOHDC_GAIN_MAX;
- rgain =
- AUDIOHDC_GAIN_MAX;
- }
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_LEFT |
- lgain);
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_RIGHT |
- rgain);
- }
+ hda_codec_t *codec;
+
+ index = respex & AUDIOHD_RIRB_CODEC_MASK;
+ id = resp >> (AUDIOHD_RIRB_WID_OFF - 1);
+
+ codec = statep->codec[index];
+ if (codec == NULL)
+ return;
+ widget = codec->widget[id];
+ if (widget == NULL)
+ return;
+
+ rs = audioha_codec_verb_get(statep, index, id,
+ AUDIOHDC_VERB_GET_PIN_SENSE, 0);
+ if (rs >> (AUDIOHD_PIN_PRES_OFF - 1) & 1) {
+ /* A MIC is plugged in, we select the MIC as input */
+ if ((widget->type == WTYPE_PIN) &&
+ (pin = (audiohd_pin_t *)widget->priv) &&
+ (pin->device == DTYPE_MIC_IN)) {
+ audiohd_select_mic(statep, index, id, 1);
+ return;
}
+ /* output pin is plugged */
+ audiohd_change_speaker_state(statep, AUDIOHD_SP_OFF);
} else {
- if (ostream->mute_wid) {
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_LNR |
- AUDIOHDC_AMP_SET_MUTE);
- } else {
- for (j = 0; j < ostream->pin_nums;
- j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_LNR |
- AUDIOHDC_AMP_SET_MUTE);
- }
+ /*
+ * A MIC is unplugged, we select the built in MIC
+ * as input.
+ */
+ if ((widget->type == WTYPE_PIN) &&
+ (pin = (audiohd_pin_t *)widget->priv) &&
+ (pin->device == DTYPE_MIC_IN)) {
+ audiohd_select_mic(statep, index, id, 0);
+ return;
}
+ /* output pin is unplugged */
+ audiohd_change_speaker_state(statep, AUDIOHD_SP_ON);
}
-} /* audiohd_do_mute_outputs() */
+}
/*
- * audiohd_mute_outputs()
+ * audiohd_intr()
*
- * Description:
- * Mute all the output streams
+ * Description
+ *
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
*/
-static void
-audiohd_mute_outputs(audiohd_state_t *statep, boolean_t mute)
+static uint_t
+audiohd_intr(caddr_t arg)
{
- audiohd_ostream_t *ostream;
- hda_codec_t *codec;
- int i;
+ audiohd_state_t *statep = (audiohd_state_t *)arg;
+ uint32_t status;
+ uint32_t regbase;
+ uint32_t resp, respex;
+ uint8_t sdstatus, rirbsts;
+ int i, ret;
+ audio_engine_t *do_adc = NULL;
+ audio_engine_t *do_dac = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- audiohd_do_mute_outputs(statep, ostream, codec, mute);
- }
- }
-} /* audiohd_mute_outputs() */
+ mutex_enter(&statep->hda_mutex);
+ if (statep->suspended) {
+ mutex_exit(&statep->hda_mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
-/*
- * audiohd_set_pin_monitor_gain()
- *
- * Description:
- * Set the gain value for the monitor path.
- */
-static void
-audiohd_set_pin_monitor_gain(hda_codec_t *codec, audiohd_state_t *statep,
- uint_t caddr, audiohd_pin_t *pin, int gain)
-{
- int i, k;
- uint_t tmp;
- audiohd_widget_t *widget;
+ status = AUDIOHD_REG_GET32(AUDIOHD_REG_INTSTS);
+ if (status == 0) {
+ mutex_exit(&statep->hda_mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, status);
- for (k = 0; k < pin->num; k++) {
- tmp = gain * pin->mg_gain[k]/
- AUDIO_MAX_GAIN;
- widget = codec->widget[pin->mg_wid[k]];
- if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_OUTPUT) {
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mg_wid[k],
- AUDIOHDC_VERB_SET_AMP_MUTE,
- AUDIOHDC_AMP_SET_RIGHT|
- AUDIOHDC_AMP_SET_LEFT|
- pin->mg_dir[k] | tmp);
- } else if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_INPUT) {
- for (i = 0; i < widget->used; i++) {
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mg_wid[k],
- AUDIOHDC_VERB_SET_AMP_MUTE,
- AUDIOHDC_AMP_SET_RIGHT|
- AUDIOHDC_AMP_SET_LEFT|
- widget->selmon[i]<<
- AUDIOHDC_AMP_SET_INDEX_OFFSET |
- pin->mg_dir[k] | tmp);
+ /*
+ * unsolicited response from pins, maybe something plugged in or out
+ * of the jack.
+ */
+ if (status & AUDIOHD_CIS_MASK) {
+ /* clear the unsolicited response interrupt */
+ rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
+ AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
+ /*
+ * We have to wait and try several times to make sure the
+ * unsolicited response is generated by our pins.
+ * we need to make it work for audiohd spec 0.9, which is
+ * just a draft version and requires more time to wait.
+ */
+ for (i = 0; i < AUDIOHD_TEST_TIMES; i++) {
+ ret = audiohd_response_from_codec(statep, &resp,
+ &respex);
+ if ((ret == AUDIO_SUCCESS) &&
+ (respex & AUDIOHD_RIRB_UR_MASK)) {
+ /*
+ * A pin may generate more than one ur rirb,
+ * we only need handle one of them, and clear
+ * the other ones
+ */
+ statep->hda_rirb_rp =
+ AUDIOHD_REG_GET16(AUDIOHD_REG_RIRBWP) &
+ AUDIOHD_RIRB_WPMASK;
+ break;
}
}
+ if ((ret == AUDIO_SUCCESS) &&
+ (respex & AUDIOHD_RIRB_UR_MASK)) {
+ audiohd_pin_sense(statep, resp, respex);
+ }
+ }
+
+ /* stream intr */
+ for (i = 0; i < statep->hda_streams_nums; i++) {
+ if ((status & (1<<i)) == 0)
+ continue;
+
+ regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * i;
+ sdstatus = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_STS);
+
+ /* clear intrs */
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS, sdstatus);
+ if (i < statep->hda_input_streams)
+ do_adc = statep->port[PORT_ADC]->engine;
+ else
+ do_dac = statep->port[PORT_DAC]->engine;
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->hda_ksp) {
+ ((kstat_intr_t *)
+ (statep->hda_ksp->ks_data))->intrs[KSTAT_INTR_HARD]++;
}
-} /* audiohd_set_pin_monitor_gain() */
+
+ mutex_exit(&statep->hda_mutex);
+
+ if (do_adc)
+ audio_engine_produce(do_adc);
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ return (DDI_INTR_CLAIMED);
+} /* audiohd_intr() */
+
/*
- * audiohd_set_monitor_gain()
+ * audiohd_disable_intr()
*
* Description:
- * Set the gain value for the monitor widget control
+ * Disable all possible interrupts.
*/
-static int
-audiohd_set_monitor_gain(audiohd_state_t *statep, int gain)
+static void
+audiohd_disable_intr(audiohd_state_t *statep)
{
- int ret;
- int i, j;
- audiohd_ostream_t *ostream;
- audiohd_pin_t *pin;
- hda_codec_t *codec;
- audiohd_widget_t *w;
- uint_t caddr;
- wid_t wid;
-
- ASSERT(statep);
-
- if (gain > AUDIO_MAX_GAIN)
- gain = AUDIO_MAX_GAIN;
- else if (gain < AUDIO_MIN_GAIN)
- gain = AUDIO_MIN_GAIN;
+ int i;
+ uint32_t base;
- /*
- * Allow to set monitor gain even if no input is selected
- */
- statep->hda_monitor_gain = gain;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- caddr = codec->index;
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- audiohd_set_pin_monitor_gain(codec, statep,
- caddr, pin, gain);
- }
- }
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL, 0);
+ base = AUDIOHD_REG_SD_BASE;
+ for (i = 0; i < statep->hda_streams_nums; i++) {
+ AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_STS,
+ AUDIOHDR_SD_STS_INTRS);
+ base += AUDIOHD_REG_SD_LEN;
}
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, (uint32_t)(-1));
+} /* audiohd_disable_intr() */
- ret = AUDIO_SUCCESS;
- return (ret);
-
-} /* audiohd_set_monitor_gain() */
/*
* audiohd_12bit_verb_to_codec()
@@ -5484,9 +5468,9 @@ audioha_codec_verb_get(void *arg, uint8_t caddr, uint8_t wid,
return (resp);
}
- audio_sup_log(NULL, CE_WARN, "!%s: verb_get() timeout when get "
+ audio_dev_warn(statep->adev, "timeout when get "
" response from codec: wid=%d, verb=0x%04x, param=0x%04x",
- audiohd_name, wid, verb, param);
+ wid, verb, param);
return ((uint32_t)(-1));
@@ -5524,76 +5508,10 @@ audioha_codec_4bit_verb_get(void *arg, uint8_t caddr, uint8_t wid,
return (resp);
}
- audio_sup_log(NULL, CE_WARN, "!%s: 4bit_verb_get() timeout when get "
+ audio_dev_warn(statep->adev, "timeout when get "
" response from codec: wid=%d, verb=0x%04x, param=0x%04x",
- audiohd_name, wid, verb, param);
+ wid, verb, param);
return ((uint32_t)(-1));
} /* audioha_codec_4bit_verb_get() */
-
-/*
- * audiohd_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended. It will also block any routine
- * while a suspend is going on.
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audiohd_state_t *statep The device's state structure
- * Returns:
- * void
- */
-static void
-audiohd_set_busy(audiohd_state_t *statep)
-{
- ASSERT(!mutex_owned(&statep->hda_mutex));
-
- mutex_enter(&statep->hda_mutex);
- /* block if we are suspended */
- while (statep->suspended)
- cv_wait(&statep->hda_cv, &statep->hda_mutex);
- /*
- * OK, we aren't suspended, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(statep->hda_busy_cnt >= 0);
- statep->hda_busy_cnt++;
-
- mutex_exit(&statep->hda_mutex);
-} /* audiohd_set_busy() */
-
-/*
- * audiohd_set_idle()
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * Arguments:
- * audiohd_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiohd_set_idle(audiohd_state_t *statep)
-{
- ASSERT(!mutex_owned(&statep->hda_mutex));
-
- mutex_enter(&statep->hda_mutex);
-
- ASSERT(!statep->suspended);
-
- /* decrement the busy count */
- ASSERT(statep->hda_busy_cnt > 0);
- statep->hda_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (statep->hda_busy_cnt == 0)
- cv_broadcast(&statep->hda_cv);
-
- mutex_exit(&statep->hda_mutex);
-} /* audiohd_set_idle() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf
index 105a8bb513..3b66afc3af 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
#
# Configuration file for the audiohd audio driver.
#
@@ -30,12 +29,6 @@
# may change at any time.
#
-# Uncomment cdrom to enable the audiohd driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
-
-#
# play-interrupts sets the number of interrupts per second when playing.
# This affects the resolution of various things, such as sample counts.
# record-interrupts does the same for record interrupts.
@@ -52,10 +45,3 @@
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audiohd driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/common/sys/audio/impl/audiohd_impl.h b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h
index d05663c0a4..3e12767149 100644
--- a/usr/src/uts/common/sys/audio/impl/audiohd_impl.h
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h
@@ -19,25 +19,12 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_AUDIOHD_IMPL_H_
#define _SYS_AUDIOHD_IMPL_H_
-
-#include <sys/types.h>
-#include <sys/thread.h>
-#include <sys/synch.h>
-#include <sys/kstat.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/audiohd.h>
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -49,7 +36,24 @@ extern "C" {
#define AUDIOHD_VID_ATI 0x1002
#define AUDIOHD_VID_NVIDIA 0x10de
+/*
+ * specific codec id used by specific vendors
+ */
+#define AUDIOHD_CODECID_HP 0x111d7608
+#define AUDIOHD_CODECID_SONY1 0x10ec0260
+#define AUDIOHD_CODECID_SONY2 0x10ec0262
+
+#define AUDIO_SUCCESS (0)
+#define AUDIO_FAILURE (-1)
+
+#define AUDIOHD_INTS 50
+#define AUDIOHD_MAX_INTS 1500
+#define AUDIOHD_MIN_INTS 32
+#define AUDIOHD_DEV_CONFIG "onboard1"
+#define AUDIOHD_DEV_VERSION "a"
+
+#define AUDIOHD_FMT_PCM 0x001
/*
* Only for Intel hardware:
* PCI Express traffic class select register in PCI configure space
@@ -90,6 +94,7 @@ extern "C" {
#define AUDIOHD_SP_ON 1
#define AUDIOHD_SP_OFF 0
+#define AUDIOHD_PORT_MAX 15
#define AUDIOHD_CODEC_MAX 16
#define AUDIOHD_MEMIO_LEN 0x4000
@@ -140,6 +145,9 @@ extern "C" {
#define AUDIOHD_PIN_VREF_L4 0x02
#define AUDIOHD_PIN_VREF_OFF 8
#define AUDIOHD_PIN_VREF_MASK 0xff
+#define AUDIOHD_PIN_CLR_MASK 0xf
+#define AUDIOHD_PIN_CLR_OFF 12
+
#define AUDIOHD_VERB_ADDR_OFF 28
#define AUDIOHD_VERB_NID_OFF 20
@@ -163,20 +171,13 @@ extern "C" {
#define AUDIOHD_CODEC_NUM_MASK 0x000000ff
#define AUDIOHD_CODEC_TYPE_MASK 0x000000ff
+#define AUDIOHD_FRAGFR_ALIGN 16
#define AUDIOHD_BDLE_BUF_ALIGN 128
#define AUDIOHD_CMDIO_ENT_MASK 0x00ff /* 256 entries for CORB/RIRB */
#define AUDIOHD_CDBIO_CORB_LEN 1024 /* 256 entries for CORB, 1024B */
#define AUDIOHD_CDBIO_RIRB_LEN 2048 /* 256 entries for RIRB, 2048B */
#define AUDIOHD_BDLE_NUMS 4 /* 4 entires for record/play BD list */
-#define AUDIOHD_MOD_NAME "HD Audio Driver"
-#define AUDIOHD_IDNUM 0x6176
-#define AUDIOHD_NAME "SUNW,audiohd"
-#define AUDIOHD_MINPACKET (0)
-#define AUDIOHD_MAXPACKET (1024)
-#define AUDIOHD_HIWATER (64*1024)
-#define AUDIOHD_LOWATER (32*1024)
-
#define AUDIOHD_PORT_UNMUTE (0xffffffff)
/*
@@ -354,8 +355,8 @@ extern "C" {
#define AUDIOHDC_VERB_SET_EAPD 0x70c
#define AUDIOHDC_VERB_GET_DEFAULT_CONF 0xf1c
-#define AUDIOHDC_VERB_GET_SPDIF_CONTROL 0xf0d
-#define AUDIOHDC_VERB_SET_SPDIF_LCONTROL 0x70d
+#define AUDIOHDC_VERB_GET_SPDIF_CTL 0xf0d
+#define AUDIOHDC_VERB_SET_SPDIF_LCL 0x70d
#define AUDIOHDC_VERB_SET_URCTRL 0x708
#define AUDIOHDC_VERB_GET_PIN_SENSE 0xf09
@@ -524,22 +525,38 @@ enum audiohda_device_type {
DTYPE_OTHER = 0x0f,
};
+enum audiohd_pin_color {
+ AUDIOHD_PIN_UNKNOWN = 0,
+ AUDIOHD_PIN_BLACK,
+ AUDIOHD_PIN_GREY,
+ AUDIOHD_PIN_BLUE,
+ AUDIOHD_PIN_GREEN,
+ AUDIOHD_PIN_RED,
+ AUDIOHD_PIN_ORANGE,
+ AUDIOHD_PIN_YELLOW,
+ AUDIOHD_PIN_PURPLE,
+ AUDIOHD_PIN_PINK,
+ AUDIOHD_PIN_WHITE = 0xe,
+ AUDIOHD_PIN_OTHER = 0xf,
+};
+
+#define CTRL_NUM 15
+
/* values for audiohd_widget.path_flags */
#define AUDIOHD_PATH_DAC (1 << 0)
#define AUDIOHD_PATH_ADC (1 << 1)
#define AUDIOHD_PATH_MON (1 << 2)
#define AUDIOHD_PATH_NOMON (1 << 3)
-
-typedef struct audiohd_ostream audiohd_ostream_t;
-typedef struct audiohd_istream audiohd_istream_t;
+typedef struct audiohd_path audiohd_path_t;
typedef struct audiohd_widget audiohd_widget_t;
-typedef struct audiohd_mixer audiohd_mixer_t;
typedef struct audiohd_state audiohd_state_t;
typedef struct audiohd_pin audiohd_pin_t;
typedef struct hda_codec hda_codec_t;
typedef uint32_t wid_t; /* id of widget */
typedef struct audiohd_entry_prop audiohd_entry_prop_t;
+typedef enum audiohda_device_type audiohda_device_type_t;
+typedef enum audiohd_pin_color audiohd_pin_color_t;
#define AUDIOHD_MAX_WIDGET 128
#define AUDIOHD_MAX_CONN 16
@@ -603,74 +620,84 @@ struct audiohd_widget {
#define AUDIOHD_MAX_MIXER 5
#define AUDIOHD_MAX_PIN 4
-struct audiohd_ostream {
- wid_t dac_wid; /* wid of DAC widget */
- wid_t pin_wid[AUDIOHD_MAX_PINS];
- int pin_nums;
- /*
- * the mixer wid in each ostream path.
- * this is used to build the monitor path
- */
- int mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
- /*
- * The max num of mixer widget on the path of the pin
- */
- int maxmixer[AUDIOHD_MAX_PINS];
- int inuse;
- wid_t mute_wid; /* node used to mute this pin */
- int mute_dir; /* 1: input, 2: output */
- wid_t gain_wid; /* node for gain control */
- int gain_dir; /* _OUTPUT/_INPUT */
- uint32_t gain_bits;
- uint32_t pin_outputs;
- audiohd_ostream_t *next_stream;
- /*
- * this is used to mark the ostream which is now
- * used by sada.
- */
- boolean_t in_use;
-};
+#define PORT_DAC 0
+#define PORT_ADC 1
+#define PORT_MAX 2
+typedef enum {
+ PLAY = 0,
+ RECORD = 1,
+} path_type_t;
-struct audiohd_istream {
- wid_t adc_wid;
+struct audiohd_path {
+ wid_t adda_wid;
- /*
- * wid of sum, which can be a selector or mixer. And all pin
- * widgets whose wid is in pin_wid[] array can route to this
- * sum widget. If there is no such sum, sum_wid is 0, in this
- * case, pin_nums must be 1, that means, this stream has only
- * one pin widget input. But we should remember that sum_wid
- * can be non-zero when pin_nums is 1.
- */
- wid_t sum_wid;
+ wid_t pin_wid[AUDIOHD_MAX_PINS];
+ int sum_selconn[AUDIOHD_MAX_PINS];
+ int mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
+ int pin_nums;
+ int maxmixer[AUDIOHD_MAX_PINS];
- /*
- * the index of sum widget inputs which can go through the
- * path and arrive input pin widget.
- */
- int sum_selconn[AUDIOHD_MAX_PINS];
+ path_type_t path_type;
- wid_t pin_wid[AUDIOHD_MAX_PINS];
- int pin_nums;
+ wid_t mute_wid;
+ int mute_dir;
+ wid_t gain_wid;
+ int gain_dir;
+ uint32_t gain_bits;
- wid_t mute_wid; /* node used to mute this pin */
- int mute_dir; /* 1: input, 2: output */
- wid_t gain_wid; /* node for gain control */
- int gain_dir; /* _OUTPUT/_INPUT */
- uint32_t gain_bits;
+ uint32_t pin_outputs;
+ uint8_t tag;
- audiohd_istream_t *next_stream;
+ hda_codec_t *codec;
- /*
- * this is used to mark the istream which is now
- * used by sada.
- */
+ wid_t sum_wid;
- boolean_t in_use;
- uint8_t rtag;
+ audiohd_state_t *statep;
};
+typedef struct audiohd_port
+{
+ uint8_t nchan;
+ int index;
+ uint16_t regoff;
+ boolean_t started;
+ boolean_t triggered;
+
+ unsigned fragfr;
+ unsigned nframes;
+ uint64_t count;
+ int curpos;
+ int len;
+ int intrs;
+
+ uint_t format;
+ unsigned sync_dir;
+
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint64_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint64_t bdl_paddr;
+
+ audio_engine_t *engine;
+ audiohd_state_t *statep;
+}audiohd_port_t;
+
+typedef struct audiohd_ctrl
+{
+ audiohd_state_t *statep;
+ audio_ctrl_t *ctrl;
+ uint32_t num;
+ uint64_t val;
+} audiohd_ctrl_t;
+
struct audiohd_pin {
audiohd_pin_t *next;
wid_t wid;
@@ -682,7 +709,6 @@ struct audiohd_pin {
uint8_t vrefvalue; /* value of VRef */
- enum audiohda_device_type device;
uint32_t cap;
uint32_t config;
uint32_t ctrl;
@@ -690,6 +716,8 @@ struct audiohd_pin {
uint32_t seq;
wid_t adc_dac_wid; /* AD/DA wid which can route to this pin */
int no_phys_conn;
+ enum audiohda_device_type device;
+
/*
* mg_dir, mg_gain, mg_wid are used to store the monitor gain control
* widget wid.
@@ -700,20 +728,15 @@ struct audiohd_pin {
int num;
int finish;
- /* this is used for SADA driver only. we should remove it later */
-#define AUDIOHD_SADA_OUTPUT 0x8000
-#define AUDIOHD_SADA_INPUT 0x4000
-#define AUDIOHD_SADA_PORTMASK 0x00ff
- uint_t sada_porttype;
};
typedef struct {
ddi_dma_handle_t ad_dmahdl;
ddi_acc_handle_t ad_acchdl;
- caddr_t ad_vaddr; /* virtual addr */
- uint64_t ad_paddr; /* physical addr */
- size_t ad_req_sz; /* required size of memory */
- size_t ad_real_sz; /* real size of memory */
+ caddr_t ad_vaddr; /* virtual addr */
+ uint64_t ad_paddr; /* physical addr */
+ size_t ad_req_sz; /* required size of memory */
+ size_t ad_real_sz; /* real size of memory */
} audiohd_dma_t;
struct hda_codec {
@@ -735,70 +758,52 @@ struct hda_codec {
/* use wid as index to the array of widget pointers */
audiohd_widget_t *widget[AUDIOHD_MAX_WIDGET];
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
+
+
+ audiohd_port_t *port[AUDIOHD_PORT_MAX];
+ uint8_t portnum;
audiohd_pin_t *first_pin;
};
+#define AUDIOHD_MAX_ASSOC 15
struct audiohd_state {
- audiohdl_t hda_ahandle;
dev_info_t *hda_dip;
kstat_t *hda_ksp;
kmutex_t hda_mutex;
uint32_t hda_flags;
- caddr_t hda_reg_base;
- ddi_acc_handle_t hda_pci_handle;
- ddi_acc_handle_t hda_reg_handle;
- ddi_iblock_cookie_t hda_intr_cookie;
+ caddr_t hda_reg_base;
+ ddi_acc_handle_t hda_pci_handle;
+ ddi_acc_handle_t hda_reg_handle;
+ ddi_iblock_cookie_t hda_intr_cookie;
audiohd_dma_t hda_dma_corb;
audiohd_dma_t hda_dma_rirb;
- audiohd_dma_t hda_dma_play_bd;
- audiohd_dma_t hda_dma_play_buf;
- audiohd_dma_t hda_dma_record_bd;
- audiohd_dma_t hda_dma_record_buf;
- int hda_input_streams; /* # of input stream */
- int hda_output_streams; /* # of output stream */
- int hda_streams_nums; /* # of stream */
- int hda_pbuf_pos; /* play buffer position */
- int hda_rbuf_pos; /* record buffer position */
+
uint8_t hda_rirb_rp; /* read pointer for rirb */
uint16_t hda_codec_mask;
- am_ad_info_t hda_ad_info;
- audio_info_t hda_info_defaults;
- audio_device_t hda_dev_info;
-
- int hda_csamples;
- int hda_psamples;
- int hda_psample_rate;
- int hda_pchannels;
- int hda_pprecision;
- int hda_csample_rate;
- int hda_cchannels;
- int hda_cprecision;
+
+ audio_dev_t *adev;
+
+
int hda_pint_freq; /* play intr frequence */
int hda_rint_freq; /* record intr frequence */
- int hda_pbuf_size; /* play buffer size */
- int hda_rbuf_size; /* record buffer size */
- boolean_t hda_outputs_muted;
+ int hda_input_streams; /* # of input stream */
+ int hda_output_streams; /* # of output stream */
+ int hda_streams_nums; /* # of stream */
+
+ uint_t hda_play_regbase;
+ uint_t hda_record_regbase;
+
+ uint8_t gpio_direct;
- uint_t hda_monitor_gain;
uint_t hda_play_stag; /* tag of playback stream */
uint_t hda_record_stag; /* tag of record stream */
- uint_t hda_play_regbase; /* regbase for play stream */
- uint_t hda_record_regbase; /* regbase for record stream */
uint_t hda_play_lgain; /* left gain for playback */
uint_t hda_play_rgain; /* right gain for playback */
- uint_t hda_record_lgain; /* left gain for recording */
- uint_t hda_record_rgain; /* right gain for recording */
- uint_t hda_play_format;
- uint_t hda_record_format;
- uint_t hda_out_ports; /* active outputs */
- uint_t hda_in_port; /* active inputs */
/*
* Now, for the time being, we add some fields
@@ -809,8 +814,27 @@ struct audiohd_state {
* Suspend/Resume used fields
*/
boolean_t suspended;
- int hda_busy_cnt;
- kcondvar_t hda_cv;
+ boolean_t monitor_unsupported;
+
+ audiohd_path_t *path[AUDIOHD_PORT_MAX];
+ uint8_t pathnum;
+ audiohd_port_t *port[PORT_MAX];
+ uint8_t pchan;
+ uint8_t rchan;
+
+ uint64_t inmask;
+
+ uint_t hda_out_ports;
+ uint_t in_port;
+
+ /*
+ * Controls
+ */
+ audiohd_ctrl_t *controls[CTRL_NUM];
+
+ /* for multichannel */
+ uint8_t chann[AUDIOHD_MAX_ASSOC];
+ uint8_t assoc;
};
diff --git a/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c
new file mode 100644
index 0000000000..9c8b5e8e05
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c
@@ -0,0 +1,1675 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * audioixp Audio Driver
+ *
+ * This driver supports audio hardware integrated in ATI IXP400 chipset.
+ *
+ * The IXP400 audio core is an AC'97 controller, which has independent
+ * channels for PCM in, PCM out. The AC'97 controller is a PCI bus master
+ * with scatter/gather support. Each channel has a DMA engine. Currently,
+ * we use only the PCM in and PCM out channels. Each DMA engine uses one
+ * buffer descriptor list. Each entry contains a pointer to a data buffer,
+ * status, length of the buffer being pointed to and the pointer to the next
+ * entry. Length of the buffer is in number of bytes. Interrupt will be
+ * triggered each time a entry is processed by hardware.
+ *
+ * System power management is not yet supported by the driver.
+ *
+ * NOTE:
+ * This driver depends on the misc/ac97 and drv/audio modules being
+ * loaded first.
+ */
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audioixp.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audioixp_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audioixp_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audioixp_quiesce(dev_info_t *);
+static int audioixp_resume(dev_info_t *);
+static int audioixp_suspend(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audioixp_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audioixp_close(void *);
+static int audioixp_start(void *);
+static void audioixp_stop(void *);
+static int audioixp_format(void *);
+static int audioixp_channels(void *);
+static int audioixp_rate(void *);
+static uint64_t audioixp_count(void *);
+static void audioixp_sync(void *, unsigned);
+static size_t audioixp_qlen(void *);
+
+static audio_engine_ops_t audioixp_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audioixp_open,
+ audioixp_close,
+ audioixp_start,
+ audioixp_stop,
+ audioixp_count,
+ audioixp_format,
+ audioixp_channels,
+ audioixp_rate,
+ audioixp_sync,
+ audioixp_qlen
+};
+
+
+/*
+ * interrupt handler
+ */
+static uint_t audioixp_intr(caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audioixp_attach(dev_info_t *);
+static int audioixp_detach(dev_info_t *);
+static int audioixp_alloc_port(audioixp_state_t *, int);
+static void audioixp_start_port(audioixp_port_t *);
+static void audioixp_stop_port(audioixp_port_t *);
+static void audioixp_reset_port(audioixp_port_t *);
+static void audioixp_update_port(audioixp_port_t *);
+
+static int audioixp_codec_sync(audioixp_state_t *);
+static void audioixp_wr97(void *, uint8_t, uint16_t);
+static uint16_t audioixp_rd97(void *, uint8_t);
+static int audioixp_reset_ac97(audioixp_state_t *);
+static int audioixp_map_regs(audioixp_state_t *);
+static void audioixp_unmap_regs(audioixp_state_t *);
+static int audioixp_chip_init(audioixp_state_t *);
+static void audioixp_destroy(audioixp_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audioixp_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audioixp_ddi_attach, /* devo_attach */
+ audioixp_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audioixp_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audioixp_modldrv = {
+ &mod_driverops, /* drv_modops */
+ IXP_MOD_NAME, /* drv_linkinfo */
+ &audioixp_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audioixp_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audioixp_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0000ffff, /* count_max */
+ 8, /* align, BDL must be aligned on a 8-byte boundary */
+ 0x3c, /* burstsize */
+ 8, /* minxfer, set to the size of a BDlist entry */
+ 0x0000ffff, /* maxxfer */
+ 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
+ 1, /* sgllen, there's no scatter-gather list */
+ 8, /* granular, set to the value of minxfer */
+ 0 /* flags, use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0001fffe, /* count_max */
+ 4, /* align, data buffer is aligned on a 2-byte boundary */
+ 0x3c, /* burstsize */
+ 4, /* minxfer, set to the size of a sample data */
+ 0x0001ffff, /* maxxfer */
+ 0x0001ffff, /* seg */
+ 1, /* sgllen, no scatter-gather */
+ 4, /* granular, set to the value of minxfer */
+ 0, /* flags, use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audioixp_dev_ops, IXP_NAME);
+
+ if ((error = mod_install(&audioixp_modlinkage)) != 0) {
+ audio_fini_ops(&audioixp_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audioixp_modlinkage)) != 0) {
+ return (error);
+ }
+
+ audio_fini_ops(&audioixp_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audioixp_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audioixp_ddi_attach()
+ *
+ * Description:
+ * Attach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audioixp_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audioixp_attach(dip));
+
+ /*
+ * now, no suspend/resume supported. we'll do it in the future.
+ */
+ case DDI_RESUME:
+ return (audioixp_resume(dip));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audioixp_ddi_detach()
+ *
+ * Description:
+ * Detach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audioixp_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audioixp_detach(dip));
+
+ /*
+ * now, no suspend/resume supported. we'll do it in the future.
+ */
+ case DDI_SUSPEND:
+ return (audioixp_suspend(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static void
+audioixp_stop_dma(audioixp_state_t *statep)
+{
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+}
+
+static void
+audioixp_disable_intr(audioixp_state_t *statep)
+{
+ PUT32(IXP_AUDIO_INT, GET32(IXP_AUDIO_INT));
+ PUT32(IXP_AUDIO_INT_EN, 0);
+}
+
+/*
+ * quiesce(9E) entry point.
+ *
+ * This function is called when the system is single-threaded at high
+ * PIL with preemption disabled. Therefore, this function must not be blocked.
+ *
+ * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
+ * DDI_FAILURE indicates an error condition and should almost never happen.
+ */
+static int
+audioixp_quiesce(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ /* disable HW interrupt */
+ audioixp_disable_intr(statep);
+
+ /* stop DMA engines */
+ audioixp_stop_dma(statep);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audioixp_suspend(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ ac97_suspend(statep->ac97);
+ mutex_enter(&statep->inst_lock);
+
+ statep->suspended = B_TRUE;
+
+ audioixp_disable_intr(statep);
+ audioixp_stop_dma(statep);
+
+ mutex_exit(&statep->inst_lock);
+ return (DDI_SUCCESS);
+}
+
+static void
+audioixp_resume_port(audioixp_port_t *port)
+{
+ if (port != NULL) {
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+ }
+ audioixp_reset_port(port);
+ if (port->started) {
+ audioixp_start_port(port);
+ } else {
+ audioixp_stop_port(port);
+ }
+}
+
+static int
+audioixp_resume(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+ audio_dev_t *adev;
+ audioixp_port_t *rec_port, *play_port;
+
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+ ASSERT(statep != NULL);
+
+ if (audioixp_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ ac97_resume(statep->ac97);
+ mutex_enter(&statep->inst_lock);
+ statep->suspended = B_FALSE;
+
+ rec_port = statep->rec_port;
+ play_port = statep->play_port;
+
+ audioixp_resume_port(rec_port);
+ audioixp_resume_port(play_port);
+
+ mutex_exit(&statep->inst_lock);
+ return (DDI_SUCCESS);
+}
+/*
+ * audioixp_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * There's a hardware pointer which indicate memory location where
+ * the hardware is processing. We check this pointer to decide whether
+ * to handle the buffer and how many buffers should be handled.
+ * Refer to ATI IXP400/450 Register Reference Manual, page 193,194.
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audioixp_intr(caddr_t arg)
+{
+ audioixp_state_t *statep;
+ uint32_t sr;
+ int claimed = DDI_INTR_UNCLAIMED;
+
+ statep = (void *)arg;
+ mutex_enter(&statep->inst_lock);
+
+ sr = GET32(IXP_AUDIO_INT);
+
+ /* PCM in interrupt */
+ if (sr & IXP_AUDIO_INT_IN_DMA) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA);
+ }
+
+ /* PCM out interrupt */
+ if (sr & IXP_AUDIO_INT_OUT_DMA) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA);
+ }
+
+ /* system is too busy to process the input stream, ignore it */
+ if (sr & IXP_AUDIO_INT_IN_DMA_OVERFLOW) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA_OVERFLOW);
+ }
+
+ /* System is too busy, ignore it */
+ if (sr & IXP_AUDIO_INT_OUT_DMA_UNDERFLOW) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA_UNDERFLOW);
+ }
+
+ /* update the kernel interrupt statistics */
+ if ((claimed == DDI_INTR_CLAIMED) && statep->ksp) {
+ IXP_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&statep->inst_lock);
+
+ if (sr & IXP_AUDIO_INT_IN_DMA) {
+ audio_engine_produce(statep->rec_port->engine);
+ }
+ if (sr & IXP_AUDIO_INT_OUT_DMA) {
+ audio_engine_consume(statep->play_port->engine);
+ }
+
+ return (claimed);
+}
+
+/*
+ * audioixp_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audioixp_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audioixp_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ port->offset = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = IXP_BD_NUMS;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->inst_lock);
+ audioixp_reset_port(port);
+ mutex_exit(&port->statep->inst_lock);
+
+ return (0);
+}
+
+/*
+ * audioixp_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audioixp_close(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ audioixp_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audioixp_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audioixp_stop(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (port->started) {
+ audioixp_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audioixp_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audioixp_start(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (!port->started) {
+ audioixp_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->inst_lock);
+ return (0);
+}
+
+/*
+ * audioixp_format()
+ *
+ * Description:
+ * This is called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE
+ */
+static int
+audioixp_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audioixp_channels()
+ *
+ * Description:
+ * This is called by the framework to query the channels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Number of channels for the device.
+ */
+static int
+audioixp_channels(void *arg)
+{
+ audioixp_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audioixp_rate()
+ *
+ * Description:
+ * This is called by the framework to query the rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audioixp_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audioixp_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audioixp_count(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+ uint64_t val;
+
+ mutex_enter(&statep->inst_lock);
+ audioixp_update_port(port);
+ val = port->count;
+ mutex_exit(&statep->inst_lock);
+
+ return (val);
+}
+
+/*
+ * audioixp_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audioixp_sync(void *arg, unsigned nframes)
+{
+ audioixp_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audioixp_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audioixp_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audioixp_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audioixp_alloc_port(audioixp_state_t *statep, int num)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ audio_dev_t *adev;
+ audioixp_port_t *port;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+ audioixp_bd_entry_t *bdentry;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ port->statep = statep;
+ port->started = B_FALSE;
+ port->num = num;
+
+ switch (num) {
+ case IXP_REC:
+ statep->rec_port = port;
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = 2;
+ break;
+ case IXP_PLAY:
+ statep->play_port = port;
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ /* This could possibly be conditionalized */
+ port->nchan = 6;
+ break;
+ default:
+ audio_dev_warn(adev, "bad port number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, IXP_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < IXP_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, IXP_INTS);
+ port->intrs = IXP_INTS;
+ } else if (port->intrs > IXP_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, IXP_INTS);
+ port->intrs = IXP_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 8 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = IXP_ROUNDUP(port->fragfr, IXP_MOD_SIZE);
+ port->fragsz = port->fragfr * port->nchan * 2;
+ port->samp_size = port->fragsz * IXP_BD_NUMS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (audioixp_bd_entry_t) * IXP_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ /*
+ * Wire up the BD list.
+ */
+ paddr = port->samp_paddr;
+ bdentry = (void *)port->bdl_kaddr;
+
+ for (int i = 0; i < IXP_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, &bdentry->buf_base, paddr);
+ ddi_put16(port->bdl_acch, &bdentry->status, 0);
+ ddi_put16(port->bdl_acch, &bdentry->buf_len, port->fragsz / 4);
+ ddi_put32(port->bdl_acch, &bdentry->next, port->bdl_paddr +
+ (((i + 1) % IXP_BD_NUMS) * sizeof (audioixp_bd_entry_t)));
+ paddr += port->fragsz;
+ bdentry++;
+ }
+ ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ port->engine = audio_engine_alloc(&audioixp_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audioixp_port_t *port The port structure for a DMA engine.
+ */
+static void
+audioixp_free_port(audioixp_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audioixp_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to start.
+ */
+static void
+audioixp_start_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == IXP_REC) {
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN);
+ } else {
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT);
+ }
+}
+
+/*
+ * audioixp_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to stop.
+ */
+static void
+audioixp_stop_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+ if (port->num == IXP_REC) {
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN);
+ } else {
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT);
+ }
+}
+
+/*
+ * audioixp_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to reset.
+ */
+static void
+audioixp_reset_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /*
+ * XXX: reset counters.
+ */
+ port->count = 0;
+
+ if (statep->suspended)
+ return;
+
+ /*
+ * Perform full reset of the engine, and enable its interrupts
+ * but leave it turned off.
+ */
+ if (port->num == IXP_REC) {
+ PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_INTER_IN);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+ PUT32(IXP_AUDIO_IN_DMA_LINK_P,
+ port->bdl_paddr | IXP_AUDIO_IN_DMA_LINK_P_EN);
+
+ } else {
+ uint32_t slot = GET32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD);
+ PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_OUT);
+ /* clear all slots */
+ slot &= ~ (IXP_AUDIO_OUT_DMA_SLOT_3 |
+ IXP_AUDIO_OUT_DMA_SLOT_4 |
+ IXP_AUDIO_OUT_DMA_SLOT_5 |
+ IXP_AUDIO_OUT_DMA_SLOT_6 |
+ IXP_AUDIO_OUT_DMA_SLOT_7 |
+ IXP_AUDIO_OUT_DMA_SLOT_8 |
+ IXP_AUDIO_OUT_DMA_SLOT_9 |
+ IXP_AUDIO_OUT_DMA_SLOT_10 |
+ IXP_AUDIO_OUT_DMA_SLOT_11 |
+ IXP_AUDIO_OUT_DMA_SLOT_12);
+ /* enable 6 channel out, unconditional for now */
+ slot |= IXP_AUDIO_OUT_DMA_SLOT_3 |
+ IXP_AUDIO_OUT_DMA_SLOT_4 |
+ IXP_AUDIO_OUT_DMA_SLOT_6 |
+ IXP_AUDIO_OUT_DMA_SLOT_9 |
+ IXP_AUDIO_OUT_DMA_SLOT_7 |
+ IXP_AUDIO_OUT_DMA_SLOT_8;
+
+ PUT32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD, slot);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_INTER_OUT);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ PUT32(IXP_AUDIO_OUT_DMA_LINK_P,
+ port->bdl_paddr | IXP_AUDIO_OUT_DMA_LINK_P_EN);
+ }
+}
+
+/*
+ * audioixp_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audioixp_port_t *port The port to update.
+ */
+static void
+audioixp_update_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+ unsigned regoff;
+ unsigned n;
+ int loop;
+ uint32_t offset;
+ uint32_t paddr;
+
+ if (statep->suspended) {
+ return;
+ }
+ if (port->num == IXP_REC) {
+ regoff = IXP_AUDIO_IN_DMA_DT_CUR;
+ } else {
+ regoff = IXP_AUDIO_OUT_DMA_DT_CUR;
+ }
+
+ /*
+ * Apparently it may take several tries to get an update on the
+ * position. Is this a hardware bug?
+ */
+ for (loop = 100; loop; loop--) {
+ paddr = GET32(regoff);
+
+ /* make sure address is reasonable */
+ if ((paddr < port->samp_paddr) ||
+ (paddr >= (port->samp_paddr + port->samp_size))) {
+ continue;
+ }
+
+ offset = paddr - port->samp_paddr;
+
+ if (offset >= port->offset) {
+ n = offset - port->offset;
+ } else {
+ n = offset + (port->samp_size - port->offset);
+ }
+ port->offset = offset;
+ port->count += (n / (port->nchan * sizeof (uint16_t)));
+ return;
+ }
+
+ audio_dev_warn(statep->adev, "Unable to update count (h/w bug?)");
+}
+
+
+/*
+ * audioixp_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audioixp_map_regs(audioixp_state_t *statep)
+{
+ dev_info_t *dip = statep->dip;
+
+ /* map PCI config space */
+ if (pci_config_setup(statep->dip, &statep->pcih) == DDI_FAILURE) {
+ audio_dev_warn(statep->adev, "unable to map PCI config space");
+ return (DDI_FAILURE);
+ }
+
+ /* map audio mixer register */
+ if ((ddi_regs_map_setup(dip, IXP_IO_AM_REGS, &statep->regsp, 0, 0,
+ &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "unable to map audio registers");
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ */
+static void
+audioixp_unmap_regs(audioixp_state_t *statep)
+{
+ if (statep->regsh) {
+ ddi_regs_map_free(&statep->regsh);
+ }
+
+ if (statep->pcih) {
+ pci_config_teardown(&statep->pcih);
+ }
+}
+
+/*
+ * audioixp_codec_ready()
+ *
+ * Description:
+ * This routine checks the state of codecs. It checks the flag to confirm
+ * that primary codec is ready.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS codec is ready
+ * DDI_FAILURE codec is not ready
+ */
+static int
+audioixp_codec_ready(audioixp_state_t *statep)
+{
+ uint32_t sr;
+
+ PUT32(IXP_AUDIO_INT, 0xffffffff);
+ drv_usecwait(1000);
+
+ sr = GET32(IXP_AUDIO_INT);
+ if (sr & IXP_AUDIO_INT_CODEC0_NOT_READY) {
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC0_NOT_READY);
+ audio_dev_warn(statep->adev, "primary codec not ready");
+
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audioixp_codec_sync(audioixp_state_t *statep)
+{
+ int i;
+ uint32_t cmd;
+
+ for (i = 0; i < 300; i++) {
+ cmd = GET32(IXP_AUDIO_OUT_PHY_ADDR_DATA);
+ if (!(cmd & IXP_AUDIO_OUT_PHY_EN)) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(10);
+ }
+
+ audio_dev_warn(statep->adev, "unable to synchronize codec");
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_rd97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * Register value.
+ */
+static uint16_t
+audioixp_rd97(void *arg, uint8_t reg)
+{
+ audioixp_state_t *statep = arg;
+ uint32_t value;
+ uint32_t result;
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS)
+ return (0xffff);
+
+ value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC |
+ IXP_AUDIO_OUT_PHY_READ |
+ IXP_AUDIO_OUT_PHY_EN |
+ ((unsigned)reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT);
+ PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS)
+ return (0xffff);
+
+ for (int i = 0; i < 300; i++) {
+ result = GET32(IXP_AUDIO_IN_PHY_ADDR_DATA);
+ if (result & IXP_AUDIO_IN_PHY_READY) {
+ return (result >> IXP_AUDIO_IN_PHY_DATA_SHIFT);
+ }
+ drv_usecwait(10);
+ }
+
+done:
+ audio_dev_warn(statep->adev, "time out reading codec reg %d", reg);
+ return (0xffff);
+}
+
+/*
+ * audioixp_wr97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audioixp_wr97(void *arg, uint8_t reg, uint16_t data)
+{
+ audioixp_state_t *statep = arg;
+ uint32_t value;
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS) {
+ return;
+ }
+
+ value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC |
+ IXP_AUDIO_OUT_PHY_WRITE |
+ IXP_AUDIO_OUT_PHY_EN |
+ ((unsigned)reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT) |
+ ((unsigned)data << IXP_AUDIO_OUT_PHY_DATA_SHIFT);
+ PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
+
+ (void) audioixp_rd97(statep, reg);
+}
+
+/*
+ * audioixp_reset_ac97()
+ *
+ * Description:
+ * Reset AC97 Codec register.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Reset the codec successfully
+ * DDI_FAILURE Failed to reset the codec
+ */
+static int
+audioixp_reset_ac97(audioixp_state_t *statep)
+{
+ uint32_t cmd;
+ int i;
+
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_POWER_DOWN);
+ drv_usecwait(10);
+
+ /* register reset */
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_AC_SOFT_RESET);
+ /* force a read to flush caches */
+ (void) GET32(IXP_AUDIO_CMD);
+
+ drv_usecwait(10);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_AC_SOFT_RESET);
+
+ /* cold reset */
+ for (i = 0; i < 300; i++) {
+ cmd = GET32(IXP_AUDIO_CMD);
+ if (cmd & IXP_AUDIO_CMD_AC_ACTIVE) {
+ cmd |= IXP_AUDIO_CMD_AC_RESET | IXP_AUDIO_CMD_AC_SYNC;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ return (DDI_SUCCESS);
+ }
+ cmd &= ~IXP_AUDIO_CMD_AC_RESET;
+ cmd |= IXP_AUDIO_CMD_AC_SYNC;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ (void) GET32(IXP_AUDIO_CMD);
+ drv_usecwait(10);
+ cmd |= IXP_AUDIO_CMD_AC_RESET;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ drv_usecwait(10);
+ }
+
+ audio_dev_warn(statep->adev, "AC'97 reset timed out");
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_chip_init()
+ *
+ * Description:
+ * This routine initializes ATI IXP audio controller and the AC97
+ * codec.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audioixp_chip_init(audioixp_state_t *statep)
+{
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+
+ /* AC97 reset */
+ if (audioixp_reset_ac97(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "AC97 codec reset failed");
+ return (DDI_FAILURE);
+ }
+
+ if (audioixp_codec_ready(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "AC97 codec not ready");
+ return (DDI_FAILURE);
+ }
+
+ /* enable interrupts */
+ PUT32(IXP_AUDIO_INT, 0xffffffff);
+ PUT32(
+ IXP_AUDIO_INT_EN,
+ IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW |
+ IXP_AUDIO_INT_EN_STATUS |
+ IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW);
+ return (DDI_SUCCESS);
+
+} /* audioixp_chip_init() */
+
+/*
+ * audioixp_attach()
+ *
+ * Description:
+ * Attach an instance of the audioixp driver. This routine does
+ * the device dependent attach tasks.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audioixp_attach(dev_info_t *dip)
+{
+ uint16_t cmdeg;
+ audioixp_state_t *statep;
+ audio_dev_t *adev;
+ uint32_t devid;
+ const char *name;
+ const char *rev;
+
+ /* we don't support high level interrupts in the driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN,
+ "!%s%d: unsupported high level interrupt",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ statep->dip = dip;
+ ddi_set_driver_private(dip, statep);
+
+ if (ddi_get_iblock_cookie(dip, 0, &statep->iblock) != DDI_SUCCESS) {
+ cmn_err(CE_WARN,
+ "!%s%d: cannot get iblock cookie",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ kmem_free(statep, sizeof (*statep));
+ return (DDI_FAILURE);
+ }
+ mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->iblock);
+
+ /* allocate framework audio device */
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "!%s%d: unable to allocate audio dev",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ goto error;
+ }
+ statep->adev = adev;
+
+ /* map in the registers */
+ if (audioixp_map_regs(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ /* set device information -- this could be smarter */
+ devid = ((pci_config_get16(statep->pcih, PCI_CONF_VENID)) << 16) |
+ pci_config_get16(statep->pcih, PCI_CONF_DEVID);
+
+ name = "ATI AC'97";
+ switch (devid) {
+ case IXP_PCI_ID_200:
+ rev = "IXP150";
+ break;
+ case IXP_PCI_ID_300:
+ rev = "SB300";
+ break;
+ case IXP_PCI_ID_400:
+ if (pci_config_get8(statep->pcih, PCI_CONF_REVID) & 0x80) {
+ rev = "SB450";
+ } else {
+ rev = "SB400";
+ }
+ break;
+ case IXP_PCI_ID_SB600:
+ rev = "SB600";
+ break;
+ default:
+ rev = "Unknown";
+ break;
+ }
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, rev);
+
+ /* allocate port structures */
+ if ((audioixp_alloc_port(statep, IXP_PLAY) != DDI_SUCCESS) ||
+ (audioixp_alloc_port(statep, IXP_REC) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ statep->ac97 = ac97_alloc(dip, audioixp_rd97, audioixp_wr97, statep);
+ if (statep->ac97 == NULL) {
+ audio_dev_warn(adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ /* set PCI command register */
+ cmdeg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM,
+ cmdeg | PCI_COMM_IO | PCI_COMM_MAE);
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(IXP_NAME, ddi_get_instance(dip),
+ IXP_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+
+ if (audioixp_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "failed to init chip");
+ goto error;
+ }
+
+ /* initialize the AC'97 part */
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, &statep->iblock, NULL, audioixp_intr,
+ (caddr_t)statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "bad interrupt specification");
+ }
+ statep->intr_added = B_TRUE;
+
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audioixp_destroy(statep);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_detach()
+ *
+ * Description:
+ * Detach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audioixp_detach(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audioixp_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device soft state.
+ */
+void
+audioixp_destroy(audioixp_state_t *statep)
+{
+ if (!statep->suspended) {
+ PUT32(IXP_AUDIO_INT, GET32(IXP_AUDIO_INT));
+ PUT32(IXP_AUDIO_INT_EN, 0);
+
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+ }
+
+ if (statep->intr_added) {
+ ddi_remove_intr(statep->dip, 0, statep->iblock);
+ }
+ if (statep->ksp) {
+ kstat_delete(statep->ksp);
+ }
+
+ audioixp_free_port(statep->play_port);
+ audioixp_free_port(statep->rec_port);
+
+ audioixp_unmap_regs(statep);
+
+ if (statep->ac97) {
+ ac97_free(statep->ac97);
+ }
+
+ if (statep->adev) {
+ audio_dev_free(statep->adev);
+ }
+
+ mutex_destroy(&statep->inst_lock);
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf
index 01efaa0243..c9390e7375 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf
@@ -19,34 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audioixp audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# The compat mode (mixer disabled) may not work as expected on all systems,
-# please refer to the audioixp(7D) manpage.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
-
-#
-# Uncomment cdrom to enable the audioixp driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -65,10 +45,3 @@ mixer-mode=1;
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audioixp driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h
new file mode 100644
index 0000000000..b71f4a866f
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h
@@ -0,0 +1,286 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIOIXP_H_
+#define _AUDIOIXP_H_
+
+/*
+ * Header file for the audioixp device driver
+ */
+
+#define IXP_DEV_CONFIG "onboard1"
+#define IXP_DEV_VERSION "a"
+
+/*
+ * Driver supported configuration information
+ */
+#define IXP_NAME "audioixp"
+#define IXP_MOD_NAME "ATI IXP audio driver"
+#define IXP_CONFIG_REGS (0) /* PCI configure register */
+#define IXP_IO_AM_REGS (1) /* PCI base register 0x10 */
+
+#define IXP_PLAY 0
+#define IXP_REC 1
+
+#define IXP_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+#define IXP_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+#define IXP_BD_NUMS (8)
+#define IXP_MOD_SIZE (32)
+
+
+/*
+ * PCI configuration registers and bits
+ */
+#define IXP_PCI_ID_200 (0x10024341U)
+#define IXP_PCI_ID_300 (0x10024361U)
+#define IXP_PCI_ID_400 (0x10024370U)
+#define IXP_PCI_ID_SB600 (0x10024382U)
+
+/*
+ * Audio controller registers and bits
+ */
+#define IXP_AUDIO_INT (0x00)
+#define IXP_AUDIO_INT_IN_DMA_OVERFLOW (1U<<0)
+#define IXP_AUDIO_INT_IN_DMA (1U<<1)
+#define IXP_AUDIO_INT_OUT_DMA_UNDERFLOW (1U<<2)
+#define IXP_AUDIO_INT_OUT_DMA (1U<<3)
+#define IXP_AUDIO_INT_CODEC0_NOT_READY (1U<<10)
+#define IXP_AUDIO_INT_CODEC1_NOT_READY (1U<<11)
+#define IXP_AUDIO_INT_CODEC2_NOT_READY (1U<<12)
+#define IXP_AUDIO_INT_NEW_FRAME (1U<<13)
+
+#define IXP_AUDIO_INT_EN (0x04)
+#define IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW (1U<<0)
+#define IXP_AUDIO_INT_EN_STATUS (1U<<1)
+#define IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW (1U<<2)
+#define IXP_AUDIO_INT_EN_CODEC0_NOT_READY (1U<<10)
+#define IXP_AUDIO_INT_EN_CODEC1_NOT_READY (1U<<11)
+#define IXP_AUDIO_INT_EN_CODEC2_NOT_READY (1U<<12)
+#define IXP_AUDIO_INT_EN_NEW_FRAME (1U<<13)
+
+#define IXP_AUDIO_CMD (0x08)
+#define IXP_AUDIO_CMD_POWER_DOWN (1U<<0)
+#define IXP_AUDIO_CMD_EN_IN (1U<<1)
+#define IXP_AUDIO_CMD_EN_OUT (1U<<2)
+#define IXP_AUDIO_CMD_EN_IN_DMA (1U<<8)
+#define IXP_AUDIO_CMD_EN_OUT_DMA (1U<<9)
+#define IXP_AUDIO_CMD_INTER_IN (1U<<21)
+#define IXP_AUDIO_CMD_INTER_OUT (1U<<22)
+#define IXP_AUDIO_CMD_BURST_EN (1U<<25)
+#define IXP_AUDIO_CMD_AC_ACTIVE (1U<<28)
+#define IXP_AUDIO_CMD_AC_SOFT_RESET (1U<<29)
+#define IXP_AUDIO_CMD_AC_SYNC (1U<<30)
+#define IXP_AUDIO_CMD_AC_RESET (1U<<31)
+
+#define IXP_AUDIO_OUT_PHY_ADDR_DATA (0x0c)
+#define IXP_AUDIO_OUT_PHY_PRIMARY_CODEC (0u)
+#define IXP_AUDIO_OUT_PHY_SECOND_CODEC (1u)
+#define IXP_AUDIO_OUT_PHY_THIRD_CODEC (2u)
+#define IXP_AUDIO_OUT_PHY_READ (1u<<2)
+#define IXP_AUDIO_OUT_PHY_WRITE (0u)
+#define IXP_AUDIO_OUT_PHY_EN (1u<<8)
+#define IXP_AUDIO_OUT_PHY_ADDR_SHIFT (9)
+#define IXP_AUDIO_OUT_PHY_ADDR_MASK (0x7fu<<9)
+#define IXP_AUDIO_OUT_PHY_DATA_SHIFT (16)
+#define IXP_AUDIO_OUT_PHY_DATA_MASK (0xffffu<<16)
+
+#define IXP_AUDIO_IN_PHY_ADDR_DATA (0x10)
+#define IXP_AUDIO_IN_PHY_READY (1u<<8)
+#define IXP_AUDIO_IN_PHY_ADDR_SHIFT (9)
+#define IXP_AUDIO_IN_PHY_ADDR_MASK (0x7fu<<9)
+#define IXP_AUDIO_IN_PHY_DATA_SHIFT (16)
+#define IXP_AUDIO_IN_PHY_DATA_MASK (0xffffu<<16)
+
+#define IXP_AUDIO_SLOTREQ (0x14)
+#define IXP_AUDIO_COUNTER (0x18)
+#define IXP_AUDIO_IN_FIFO_THRESHOLD (0x1c)
+#define IXP_AUDIO_IN_DMA_LINK_P (0x20)
+#define IXP_AUDIO_IN_DMA_LINK_P_EN (1u<<0)
+
+#define IXP_AUDIO_IN_DMA_DT_START (0x24)
+#define IXP_AUDIO_IN_DMA_DT_NEXT (0x28)
+#define IXP_AUDIO_IN_DMA_DT_CUR (0x2c)
+#define IXP_AUDIO_IN_DT_SIZE_FIFO_INFO (0x30)
+
+#define IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD (0x34)
+#define IXP_AUDIO_OUT_DMA_SLOT_3 (1U<<0)
+#define IXP_AUDIO_OUT_DMA_SLOT_4 (1U<<1)
+#define IXP_AUDIO_OUT_DMA_SLOT_5 (1U<<2)
+#define IXP_AUDIO_OUT_DMA_SLOT_6 (1U<<3)
+#define IXP_AUDIO_OUT_DMA_SLOT_7 (1U<<4)
+#define IXP_AUDIO_OUT_DMA_SLOT_8 (1U<<5)
+#define IXP_AUDIO_OUT_DMA_SLOT_9 (1U<<6)
+#define IXP_AUDIO_OUT_DMA_SLOT_10 (1U<<7)
+#define IXP_AUDIO_OUT_DMA_SLOT_11 (1U<<8)
+#define IXP_AUDIO_OUT_DMA_SLOT_12 (1U<<9)
+#define IXP_AUDIO_OUT_DMA_THRESHOLD_MASK (0x7fU<<11)
+#define IXP_AUDIO_OUT_DMA_THRESHOLD_SHIFT (11)
+
+#define IXP_AUDIO_OUT_DMA_LINK_P (0x38)
+#define IXP_AUDIO_OUT_DMA_LINK_P_EN (1U<<0)
+
+#define IXP_AUDIO_OUT_DMA_DT_START (0x3c)
+#define IXP_AUDIO_OUT_DMA_DT_NEXT (0x40)
+#define IXP_AUDIO_OUT_DMA_DT_CUR (0x44)
+#define IXP_AUDIO_OUT_DT_SIZE_USED_FREE (0x48)
+#define IXP_AUDIO_SPDIF_CMD (0x4c)
+#define IXP_AUDIO_SPDIF_LINK_P (0x50)
+#define IXP_AUDIO_SPDIF_DT_START (0x54)
+#define IXP_AUDIO_SPDIF_DT_NEXT (0x58)
+#define IXP_AUDIO_SPDIF_DT_CUR (0x5c)
+#define IXP_AUDIO_SPDIF_DT_SIZE_FIFO_INFO (0x60)
+#define IXP_AUDIO_MODEM_MIRROR (0x7c)
+#define IXP_AUDIO_AUDIO_MIRROR (0x80)
+#define IXP_AUDIO_6CH_RECORDER_EN (0x84)
+#define IXP_AUDIO_FIFO_FLUSH (0x88)
+#define IXP_AUDIO_FIFO_FLUSH_OUT (1u<<0)
+#define IXP_AUDIO_FIFO_FLUSH_IN (1u<<1)
+
+#define IXP_AUDIO_OUT_FIFO_INFO (0x8c)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG1 (0x90)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG2 (0x94)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG3 (0x98)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG4 (0x9c)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG5 (0xa0)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG6 (0xa4)
+#define IXP_AUDIO_PHY_SEMA (0xa8)
+
+/*
+ * AC97 status and link control registers are located
+ * in PCI configuration space.
+ */
+#define IXP_REG_GSR 0x40
+#define IXP_REG_GCR 0x41
+
+/* AC link interface status register */
+#define IXP_GSR_PRI_READY 0x01
+#define IXP_GSR_SEC_READY 0x04
+#define IXP_GSR_TRI_READY 0x10
+#define IXP_GSR_FOUR_READY 0x20
+
+/* AC link interface control register */
+#define IXP_GCR_ENAC97 0x80
+#define IXP_GCR_RST 0x40
+#define IXP_GCR_RSYNCHI 0x20
+#define IXP_GCR_SDO 0x10
+#define IXP_GCR_VSR 0x08
+#define IXP_GCR_3D_AUDIO_CHANNEL 0x04
+
+/*
+ * Macro for AD1980 codec
+ */
+#define AD1980_VID1 0x4144
+#define AD1980_VID2 0x5370
+#define AD1985_VID2 0x5375
+#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
+#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
+#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
+
+struct audioixp_port {
+ int num;
+ struct audioixp_state *statep;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ uint64_t count;
+ uint32_t offset;
+ uint8_t nchan;
+
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audioixp_port audioixp_port_t;
+
+/*
+ * buffer descriptor list entry, see datasheet
+ */
+struct audioixp_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t status; /* status of the buffer */
+ uint16_t buf_len; /* size of the buffer in DWORD */
+ uint32_t next; /* physical addr of next bd_entry */
+};
+typedef struct audioixp_bd_entry audioixp_bd_entry_t;
+
+/*
+ * audioixp_state_t -per instance state and operation data
+ */
+struct audioixp_state {
+ kmutex_t inst_lock; /* state protection lock */
+ ddi_iblock_cookie_t iblock;
+ dev_info_t *dip;
+ audio_dev_t *adev; /* audio handle */
+ ac97_t *ac97;
+ audioixp_port_t *play_port;
+ audioixp_port_t *rec_port;
+
+ ddi_acc_handle_t pcih; /* pci configuration space */
+ ddi_acc_handle_t regsh; /* for audio mixer register */
+ caddr_t regsp; /* base of audio mixer regs */
+
+ boolean_t suspended;
+ boolean_t intr_added;
+ boolean_t swap_out; /* swap line-out and sur-out */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ uint32_t ixp_codec_not_ready_bits; /* for codec detect */
+};
+typedef struct audioixp_state audioixp_state_t;
+
+/*
+ * Useful bit twiddlers
+ */
+#define GET32(reg) \
+ ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define PUT32(reg, val) \
+ ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define SET32(reg, val) PUT32(reg, GET32(reg) | ((uint32_t)(val)))
+
+#define CLR32(reg, val) PUT32(reg, GET32(reg) & ~((uint32_t)(val)))
+
+#define IXP_INTS (175) /* default interrupt rate */
+#define IXP_MIN_INTS (24) /* minimum interrupt rate */
+#define IXP_MAX_INTS (500) /* maximum interrupt rate */
+
+#endif /* _AUDIOIXP_H_ */
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c
new file mode 100644
index 0000000000..22b7975535
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c
@@ -0,0 +1,1736 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Creative/Ensoniq AudioPCI driver (ES1370)
+ *
+ * This driver is used with the original Ensoniq AudioPCI.
+ */
+
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/audio/audio_driver.h>
+#include <sys/note.h>
+#include <sys/pci.h>
+#include "audiopci.h"
+
+/*
+ * The original OSS driver used a single duplex engine and a separate
+ * playback only engine. Instead, we expose three engines, one for input
+ * and two for output.
+ */
+
+#define ENSONIQ_VENDOR_ID 0x1274
+#define CREATIVE_VENDOR_ID 0x1102
+#define ENSONIQ_ES1370 0x5000
+
+#define DEFINTS 75
+#define DRVNAME "audiopci"
+
+#define INPUT_MIC 0
+#define INPUT_LINEIN 1
+#define INPUT_CD 2
+#define INPUT_VIDEO 3
+#define INPUT_PHONE 4
+#define INSRCS 0x1f /* bits 0-4 */
+
+static const char *audiopci_insrcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_VIDEO,
+ AUDIO_PORT_PHONE,
+ NULL
+};
+
+typedef struct audiopci_port
+{
+ /* Audio parameters */
+ boolean_t trigger;
+
+ int speed;
+ int fmt;
+
+ int num;
+#define PORT_DAC 0
+#define PORT_SYN 1
+#define PORT_ADC 2
+#define PORT_MAX PORT_ADC
+
+ caddr_t kaddr;
+ uint32_t paddr;
+ ddi_acc_handle_t acch;
+ ddi_dma_handle_t dmah;
+ unsigned fragfr;
+ unsigned nfrags;
+ unsigned nframes;
+ unsigned frameno;
+ uint64_t count;
+
+ struct audiopci_dev *dev;
+ audio_engine_t *engine;
+} audiopci_port_t;
+
+typedef enum {
+ CTL_VOLUME = 0,
+ CTL_FRONT,
+ CTL_MONO,
+ CTL_MIC,
+ CTL_LINE,
+ CTL_CD,
+ CTL_VID,
+ CTL_PHONE,
+ CTL_MICBOOST,
+ CTL_RECSRC,
+ CTL_MONSRC,
+ CTL_NUM /* must be last */
+} audiopci_ctrl_num_t;
+
+typedef struct audiopci_ctrl
+{
+ struct audiopci_dev *dev;
+ audio_ctrl_t *ctrl;
+ audiopci_ctrl_num_t num;
+ uint64_t val;
+} audiopci_ctrl_t;
+
+
+typedef struct audiopci_dev
+{
+ audio_dev_t *adev;
+ kmutex_t mutex;
+ uint16_t devid;
+ dev_info_t *dip;
+ boolean_t enabled;
+ boolean_t suspended;
+
+ int pintrs;
+ int rintrs;
+
+ uint8_t ak_regs[0x20];
+ int micbias;
+
+ /*
+ * Controls
+ */
+ audiopci_ctrl_t controls[CTL_NUM];
+#if 0
+ audiopci_ctrl_t *micbias;
+#endif
+
+ kstat_t *ksp;
+
+ audiopci_port_t port[PORT_MAX + 1];
+
+
+ caddr_t regs;
+ ddi_acc_handle_t acch;
+ ddi_intr_handle_t ihandle[1];
+} audiopci_dev_t;
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * The hardware appears to be able to address up to 16-bits worth of longwords,
+ * giving a total address space of 256K. Note, however, that we will restrict
+ * this further when we do fragment and memory allocation. At its very highest
+ * clock rate (48 kHz) and sample size (16-bit stereo), and lowest interrupt
+ * rate (32 Hz), we only need 6000 bytes per fragment.
+ *
+ * So with an allocated buffer size of 64K, we can support at least 10 frags,
+ * which is more than enough. (The legacy Sun driver used only 2 fragments.)
+ */
+#define AUDIOPCI_BUF_LEN (65536)
+
+static ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_VERSION, /* dma_attr_version */
+ 0x0, /* dma_attr_addr_lo */
+ 0xffffffffU, /* dma_attr_addr_hi */
+ 0x3ffff, /* dma_attr_count_max */
+ 0x8, /* dma_attr_align */
+ 0x7f, /* dma_attr_burstsizes */
+ 0x1, /* dma_attr_minxfer */
+ 0x3ffff, /* dma_attr_maxxfer */
+ 0x3ffff, /* dma_attr_seg */
+ 0x1, /* dma_attr_sgllen */
+ 0x1, /* dma_attr_granular */
+ 0 /* dma_attr_flags */
+};
+
+#define GET8(dev, offset) \
+ ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
+#define GET16(dev, offset) \
+ ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
+#define GET32(dev, offset) \
+ ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
+#define PUT8(dev, offset, v) \
+ ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
+#define PUT16(dev, offset, v) \
+ ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
+#define PUT32(dev, offset, v) \
+ ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
+
+#define CLR8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) & ~(v))
+#define SET8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) | (v))
+#define CLR16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) & ~(v))
+#define SET16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) | (v))
+
+#define KSINTR(dev) ((kstat_intr_t *)((dev)->ksp->ks_data))
+
+static void audiopci_init_hw(audiopci_dev_t *);
+static void audiopci_init_port(audiopci_port_t *);
+static void audiopci_start_port(audiopci_port_t *);
+static void audiopci_stop_port(audiopci_port_t *);
+static void audiopci_update_port(audiopci_port_t *);
+static uint16_t audiopci_dac_rate(int);
+static int audiopci_add_controls(audiopci_dev_t *);
+static void audiopci_del_controls(audiopci_dev_t *);
+static void audiopci_ak_write(audiopci_dev_t *, uint16_t, uint8_t);
+
+static int
+audiopci_ak_wait(audiopci_dev_t *dev, uint8_t wstat)
+{
+ for (int i = 4000; i; i--) {
+ if (!(GET8(dev, CONC_bCODECSTAT_OFF) & wstat))
+ return (DDI_SUCCESS);
+ drv_usecwait(10);
+ }
+ return (DDI_FAILURE);
+}
+
+static void
+audiopci_ak_idle(audiopci_dev_t *dev)
+{
+ for (int i = 0; i < 5; i++) {
+ if (audiopci_ak_wait(dev, CONC_CSTAT_CSTAT) == DDI_SUCCESS)
+ return;
+ }
+ audio_dev_warn(dev->adev, "timed out waiting for codec to idle");
+}
+
+static void
+audiopci_ak_write(audiopci_dev_t *dev, uint16_t addr, uint8_t data)
+{
+ uint8_t wstat;
+
+ if (dev->suspended)
+ return;
+
+ /* shadow the value */
+ dev->ak_regs[addr] = data;
+
+ wstat = addr == CODEC_RESET_PWRD ? CONC_CSTAT_CWRIP : CONC_CSTAT_CSTAT;
+
+ /* wait for codec to be available */
+ if (audiopci_ak_wait(dev, wstat) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "timeout waiting for codec");
+ }
+
+ PUT16(dev, CONC_wCODECCTL_OFF, (addr << 8) | data);
+}
+
+static void
+audiopci_writemem(audiopci_dev_t *dev, uint32_t page, uint32_t offs,
+ uint32_t data)
+{
+ /* Select memory page */
+ PUT32(dev, CONC_bMEMPAGE_OFF, page);
+ PUT32(dev, offs, data);
+}
+
+static uint32_t
+audiopci_readmem(audiopci_dev_t *dev, uint32_t page, uint32_t offs)
+{
+ PUT32(dev, CONC_bMEMPAGE_OFF, page); /* Select memory page */
+ return (GET32(dev, offs));
+}
+
+static uint_t
+audiopci_intr(caddr_t arg1, caddr_t arg2)
+{
+ audiopci_dev_t *dev = (void *)arg1;
+ int stats;
+ int tmp;
+ unsigned char ackbits = 0;
+ audiopci_port_t *port;
+ audio_engine_t *do_syn, *do_dac, *do_adc;
+
+ _NOTE(ARGUNUSED(arg2));
+
+ /*
+ * NB: The old driver didn't report spurious interrupts. On
+ * a system with shared interrupts (typical!) there will
+ * normally be lots of these (each time the "other" device
+ * interrupts).
+ *
+ * Also, because of the way the interrupt chain handling
+ * works, reporting of spurious interrupts is probably not
+ * terribly useful.
+ *
+ * However, we can count interrupts where the master interrupt
+ * bit is set but none of the ackbits that we are prepared to
+ * process is set. That is probably useful.
+ */
+ mutex_enter(&dev->mutex);
+ if (!dev->enabled) {
+
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ stats = GET32(dev, CONC_dSTATUS_OFF);
+
+ if (!(stats & CONC_INTSTAT_PENDING)) { /* No interrupt pending */
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ do_syn = do_dac = do_adc = NULL;
+
+ /* synth interrupt */
+ if (stats & CONC_INTSTAT_SYNINT) {
+
+ ackbits |= CONC_SERCTL_SYNIE;
+ port = &dev->port[PORT_SYN];
+ if (port->trigger) {
+ do_syn = port->engine;
+ }
+ }
+
+ /* DAC interrupt */
+ if (stats & CONC_INTSTAT_DACINT) {
+
+ ackbits |= CONC_SERCTL_DACIE;
+ port = &dev->port[PORT_DAC];
+ if (port->trigger) {
+ do_dac = port->engine;
+ }
+ }
+
+ /* ADC interrupt */
+ if (stats & CONC_INTSTAT_ADCINT) {
+
+ ackbits |= CONC_SERCTL_ADCIE;
+ port = &dev->port[PORT_ADC];
+
+ if (port->trigger) {
+ do_adc = port->engine;
+ }
+ }
+
+ /* UART interrupt - we shouldn't get this! */
+ if (stats & CONC_INTSTAT_UARTINT) {
+ uint8_t uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ while (uart_stat & CONC_UART_RXRDY)
+ uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ }
+
+ /* Ack the interrupt */
+ tmp = GET8(dev, CONC_bSERCTL_OFF);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp & (~ackbits)); /* Clear bits */
+ PUT8(dev, CONC_bSERCTL_OFF, tmp | ackbits); /* Turn them back on */
+
+ if (dev->ksp) {
+ if (ackbits == 0) {
+ KSINTR(dev)->intrs[KSTAT_INTR_SPURIOUS]++;
+ } else {
+ KSINTR(dev)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&dev->mutex);
+
+ if (do_syn)
+ audio_engine_consume(do_syn);
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ if (do_adc)
+ audio_engine_produce(do_adc);
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+
+static int
+audiopci_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+static int
+audiopci_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (2);
+}
+
+static int
+audiopci_rate(void *arg)
+{
+ audiopci_port_t *port = arg;
+
+ return (port->speed);
+}
+
+static void
+audiopci_init_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+ unsigned tmp;
+
+ if (dev->suspended)
+ return;
+
+ switch (port->num) {
+ case PORT_DAC:
+
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_DACCTL_PAGE, CONC_dDACPADDR_OFF,
+ port->paddr);
+
+ /* Set DAC rate */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ /* Set format */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_DAC_16BIT;
+ tmp |= CONC_PCM_DAC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_DACCTL_PAGE, CONC_wDACFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wDACIC_OFF, port->fragfr - 1);
+
+ break;
+
+ case PORT_SYN:
+
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_SYNCTL_PAGE, CONC_dSYNPADDR_OFF,
+ port->paddr);
+
+ /* Set rate - we force to 44.1 kHz */
+ SET8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_SYN_44KHZ);
+
+ /* Set format */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_SYN_16BIT;
+ tmp |= CONC_PCM_SYN_STEREO;
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_SYNCTL_PAGE, CONC_wSYNFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wSYNIC_OFF, port->fragfr - 1);
+
+ break;
+
+ case PORT_ADC:
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_ADCCTL_PAGE, CONC_dADCPADDR_OFF,
+ port->paddr);
+
+ /* Set ADC rate */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ /* Set format - for input we only support 16 bit input */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_ADC_16BIT;
+ tmp |= CONC_PCM_ADC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_ADCCTL_PAGE, CONC_wADCFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wADCIC_OFF, port->fragfr - 1);
+
+ break;
+ }
+
+ port->frameno = 0;
+}
+
+static int
+audiopci_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+ int intrs;
+
+ _NOTE(ARGUNUSED(flag));
+
+
+ mutex_enter(&dev->mutex);
+ switch (port->num) {
+ case PORT_ADC:
+ intrs = dev->rintrs;
+ break;
+ case PORT_DAC:
+ intrs = dev->pintrs;
+ break;
+ case PORT_SYN:
+ intrs = dev->pintrs;
+ break;
+ }
+
+ /* interrupt at least at 25 Hz, and not more than 250 Hz */
+ intrs = min(250, max(25, intrs));
+
+ /* NB: frame size = 4 (16-bit stereo) */
+ port->fragfr = (port->speed / intrs);
+ port->nfrags = AUDIOPCI_BUF_LEN / (port->fragfr * 4);
+ port->nfrags = max(4, min(port->nfrags, 1024));
+ port->nframes = port->nfrags * port->fragfr;
+ port->trigger = B_FALSE;
+ port->count = 0;
+
+ audiopci_init_port(port);
+
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrags;
+ *bufp = port->kaddr;
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audiopci_start_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+
+ if (!dev->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_DAC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DACIE);
+ break;
+ case PORT_SYN:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_SYN_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_SYNIE);
+ break;
+ case PORT_ADC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static void
+audiopci_stop_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+
+ if (!dev->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_DAC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DACIE);
+ break;
+ case PORT_SYN:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_SYN_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_SYNIE);
+ break;
+ case PORT_ADC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static int
+audiopci_start(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (!port->trigger) {
+ port->trigger = B_TRUE;
+ audiopci_start_port(port);
+ }
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audiopci_stop(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (port->trigger) {
+ port->trigger = B_FALSE;
+ audiopci_stop_port(port);
+ }
+ mutex_exit(&dev->mutex);
+}
+
+static void
+audiopci_update_port(audiopci_port_t *port)
+{
+ uint32_t page, offs;
+ int frameno, n;
+
+ switch (port->num) {
+ case PORT_DAC:
+ page = CONC_DACCTL_PAGE;
+ offs = CONC_wDACFC_OFF;
+ break;
+
+ case PORT_SYN:
+ page = CONC_SYNCTL_PAGE;
+ offs = CONC_wSYNFC_OFF;
+ break;
+
+ case PORT_ADC:
+ page = CONC_ADCCTL_PAGE;
+ offs = CONC_wADCFC_OFF;
+ break;
+ }
+
+ /*
+ * Note that the current frame counter is in the high nybble.
+ */
+ frameno = audiopci_readmem(port->dev, page, offs) >> 16;
+ n = frameno >= port->frameno ?
+ frameno - port->frameno :
+ frameno + port->nframes - port->frameno;
+ port->frameno = frameno;
+ port->count += n;
+}
+
+static uint64_t
+audiopci_count(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+ uint64_t val;
+
+ mutex_enter(&dev->mutex);
+ if (!dev->suspended) {
+ audiopci_update_port(port);
+ }
+ val = port->count;
+ mutex_exit(&dev->mutex);
+ return (val);
+}
+
+static void
+audiopci_close(void *arg)
+{
+ audiopci_port_t *port = arg;
+
+ audiopci_stop(port);
+}
+
+static void
+audiopci_sync(void *arg, unsigned nframes)
+{
+ audiopci_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(nframes));
+
+ if (port->num == PORT_ADC) {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORCPU);
+ } else {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+ }
+}
+
+static size_t
+audiopci_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ /*
+ * There is actually a small FIFO with 64 bytes -- 16 samples --
+ * onboard, but it is probably not worth the effort to report it,
+ * and the FIFO will not always be full.
+ */
+ return (0);
+}
+
+audio_engine_ops_t audiopci_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audiopci_open,
+ audiopci_close,
+ audiopci_start,
+ audiopci_stop,
+ audiopci_count,
+ audiopci_format,
+ audiopci_channels,
+ audiopci_rate,
+ audiopci_sync,
+ audiopci_qlen,
+ NULL,
+};
+
+static uint16_t
+audiopci_dac_rate(int samPerSec)
+{
+ unsigned short usTemp;
+
+ /* samPerSec /= 2; */
+
+ usTemp = (unsigned short) ((DAC_CLOCK_DIVIDE / 8) / samPerSec);
+
+ if (usTemp & 0x00000001) {
+ usTemp >>= 1;
+ usTemp -= 1;
+ } else {
+ usTemp >>= 1;
+ usTemp -= 2;
+ }
+ return (usTemp);
+}
+
+void
+audiopci_init_hw(audiopci_dev_t *dev)
+{
+ int tmp;
+
+ /* setup DAC frequency */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ CLR8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_CCB_INTRM);
+ SET8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_SYN_44KHZ);
+
+ /* Turn on CODEC (UART and joystick left disabled) */
+ tmp = GET8(dev, CONC_bDEVCTL_OFF);
+ tmp |= CONC_DEVCTL_SERR_DIS;
+ tmp |= CONC_DEVCTL_CODEC_EN;
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ /* Reset the UART */
+ PUT8(dev, CONC_bUARTCSTAT_OFF, 0x00);
+
+ /* Disable NMI */
+ PUT8(dev, CONC_bNMIENA_OFF, 0);
+ PUT16(dev, CONC_wNMISTAT_OFF, 0);
+
+ /* Initialize serial interface */
+ PUT8(dev, CONC_bSERCTL_OFF, 0);
+ PUT8(dev, CONC_bSERFMT_OFF,
+ CONC_PCM_SYN_STEREO | CONC_PCM_SYN_16BIT);
+
+ /* Unmute codec */
+ CLR8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_MUTE);
+
+ /* mixer initialization */
+ audiopci_ak_idle(dev);
+
+ /* power/reset down the codec */
+ audiopci_ak_write(dev, CODEC_RESET_PWRD, 0);
+ drv_usecwait(10);
+
+ /* now powerup and bring out of reset */
+ audiopci_ak_write(dev, CODEC_RESET_PWRD, 0x3);
+ audiopci_ak_idle(dev);
+
+ /* enable PLL for DAC2 */
+ audiopci_ak_write(dev, CODEC_CLKSELECT, 0);
+
+ /* select input mixer */
+ audiopci_ak_write(dev, CODEC_ADSELECT, 0);
+
+ /* mark FM for output mixer */
+ audiopci_ak_write(dev, CODEC_OUT_SW1, CODEC_OUT_ENABLE_SYNTH);
+ audiopci_ak_write(dev, CODEC_OUT_SW2, CODEC_OUT_ENABLE_WAVE);
+
+ /* initialize some reasonable values for the WAVE and SYNTH inputs */
+ audiopci_ak_write(dev, CODEC_VOL_WAVE_L, 6);
+ audiopci_ak_write(dev, CODEC_VOL_WAVE_R, 6);
+ audiopci_ak_write(dev, CODEC_VOL_SYNTH_L, 6);
+ audiopci_ak_write(dev, CODEC_VOL_SYNTH_R, 6);
+
+ /* enable microphone phantom power */
+ if (dev->micbias) {
+ SET16(dev, 2, CONC_DEVCTL_MICBIAS);
+ }
+
+ dev->enabled = B_TRUE;
+}
+
+static int
+audiopci_init(audiopci_dev_t *dev)
+{
+ dev->micbias = 1;
+
+ audiopci_init_hw(dev);
+
+ dev->pintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "play-interrupts", DEFINTS);
+
+ dev->rintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "record-interrupts", DEFINTS);
+
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audiopci_port_t *port;
+ unsigned caps;
+ unsigned dmaflags;
+ size_t rlen;
+ ddi_dma_cookie_t c;
+ unsigned ccnt;
+
+ port = &dev->port[i];
+ port->dev = dev;
+
+ switch (i) {
+ case PORT_SYN:
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ port->speed = 44100;
+ break;
+
+ case PORT_DAC:
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ port->speed = 48000;
+ break;
+
+ case PORT_ADC:
+ caps = ENGINE_INPUT_CAP;
+ dmaflags = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ port->speed = 48000;
+ break;
+ }
+
+ port->num = i;
+
+ /*
+ * Allocate DMA resources.
+ */
+
+ if (ddi_dma_alloc_handle(dev->dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->dmah) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma handle allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ if (ddi_dma_mem_alloc(port->dmah, AUDIOPCI_BUF_LEN, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->kaddr,
+ &rlen, &port->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma memory allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ /* ensure that the buffer is zeroed out properly */
+ bzero(port->kaddr, rlen);
+ if (ddi_dma_addr_bind_handle(port->dmah, NULL, port->kaddr,
+ AUDIOPCI_BUF_LEN, dmaflags, DDI_DMA_SLEEP, NULL,
+ &c, &ccnt) != DDI_DMA_MAPPED) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma binding failed", i);
+ return (DDI_FAILURE);
+ }
+ port->paddr = c.dmac_address;
+
+ /*
+ * Allocate and configure audio engine.
+ */
+ port->engine = audio_engine_alloc(&audiopci_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(dev->adev,
+ "port %d: audio_engine_alloc failed", i);
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(dev->adev, port->engine);
+ }
+
+ /*
+ * Register audio controls.
+ */
+ if (audiopci_add_controls(dev) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Set up kstats for interrupt reporting.
+ */
+ dev->ksp = kstat_create(ddi_driver_name(dev->dip),
+ ddi_get_instance(dev->dip), ddi_driver_name(dev->dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (dev->ksp != NULL) {
+ kstat_install(dev->ksp);
+ }
+
+ if (audio_dev_register(dev->adev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "unable to register with audio framework");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audiopci_setup_interrupts(audiopci_dev_t *dev)
+{
+ int actual;
+ uint_t ipri;
+
+ if ((ddi_intr_alloc(dev->dip, dev->ihandle, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) ||
+ (actual != 1)) {
+ audio_dev_warn(dev->adev, "can't alloc intr handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(dev->ihandle[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't determine intr priority");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(dev->ihandle[0], audiopci_intr, dev,
+ NULL) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't add intr handler");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+void
+audiopci_destroy(audiopci_dev_t *dev)
+{
+ int i;
+
+ if (dev->ihandle[0] != NULL) {
+ (void) ddi_intr_disable(dev->ihandle[0]);
+ (void) ddi_intr_remove_handler(dev->ihandle[0]);
+ (void) ddi_intr_free(dev->ihandle[0]);
+ mutex_destroy(&dev->mutex);
+ }
+
+ if (dev->ksp != NULL) {
+ kstat_delete(dev->ksp);
+ }
+
+ /* free up ports, including DMA resources for ports */
+ for (i = 0; i <= PORT_MAX; i++) {
+ audiopci_port_t *port = &dev->port[i];
+
+ if (port->paddr != 0)
+ (void) ddi_dma_unbind_handle(port->dmah);
+ if (port->acch != NULL)
+ ddi_dma_mem_free(&port->acch);
+ if (port->dmah != NULL)
+ ddi_dma_free_handle(&port->dmah);
+
+ if (port->engine != NULL) {
+ audio_dev_remove_engine(dev->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ }
+
+ if (dev->acch != NULL) {
+ ddi_regs_map_free(&dev->acch);
+ }
+
+ audiopci_del_controls(dev);
+
+ if (dev->adev != NULL) {
+ audio_dev_free(dev->adev);
+ }
+
+ kmem_free(dev, sizeof (*dev));
+}
+
+static void
+audiopci_stereo(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t lreg)
+{
+ uint8_t lval, rval;
+ uint8_t lmute, rmute;
+ uint64_t val;
+ uint8_t rreg;
+
+ rreg = lreg + 1;
+ val = dev->controls[num].val;
+ lval = (val & 0xff00) >> 8;
+ rval = val & 0xff;
+
+ lmute = lval ? 0 : CODEC_ATT_MUTE;
+ rmute = rval ? 0 : CODEC_ATT_MUTE;
+
+ /* convert to attenuation & apply mute if appropriate */
+ lval = ((((100U - lval) * CODEC_ATT_MAX) / 100) & 0xff) | lmute;
+ rval = ((((100U - rval) * CODEC_ATT_MAX) / 100) & 0xff) | rmute;
+
+ audiopci_ak_write(dev, lreg, lval);
+ audiopci_ak_write(dev, rreg, rval);
+}
+
+static void
+audiopci_mono(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t reg)
+{
+ uint64_t val = (dev->controls[num].val & 0xff);
+ uint8_t mute;
+
+ mute = val ? 0 : CODEC_ATT_MUTE;
+ val = ((((100U - val) * CODEC_ATT_MAX) / 100) & 0xff) | mute;
+
+ audiopci_ak_write(dev, reg, val);
+}
+
+static void
+audiopci_mono8(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t reg)
+{
+ uint64_t val = (dev->controls[num].val & 0xff);
+ uint8_t mute;
+
+ mute = val ? 0 : CODEC_ATT_MUTE;
+ val = ((((100U - val) * CODEC_ATT_MONO) / 100) & 0xff) | mute;
+
+ audiopci_ak_write(dev, reg, val);
+}
+
+static int
+audiopci_get_value(void *arg, uint64_t *val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ mutex_enter(&dev->mutex);
+ *val = pc->val;
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static void
+audiopci_configure_output(audiopci_dev_t *dev)
+{
+ uint64_t val;
+ uint8_t tmp;
+
+ /* PCM/Wave level */
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_WAVE_L);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_WAVE_R);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_SYNTH_L);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_SYNTH_R);
+
+ /* front & mono outputs */
+ audiopci_stereo(dev, CTL_FRONT, CODEC_VOL_MASTER_L);
+ audiopci_mono8(dev, CTL_MONO, CODEC_VOL_MONO);
+
+ val = dev->controls[CTL_MONSRC].val;
+
+ /* setup output monitoring as well */
+ tmp = CODEC_OUT_ENABLE_SYNTH;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_OUT_ENABLE_MIC;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_OUT_ENABLE_CD;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_OUT_ENABLE_AUX;
+ audiopci_ak_write(dev, CODEC_OUT_SW1, tmp);
+
+ tmp = CODEC_OUT_ENABLE_WAVE;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_OUT_ENABLE_TV;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_OUT_ENABLE_TAD;
+ audiopci_ak_write(dev, CODEC_OUT_SW2, tmp);
+}
+
+static void
+audiopci_configure_input(audiopci_dev_t *dev)
+{
+ uint64_t val = dev->controls[CTL_RECSRC].val;
+ uint8_t tmp;
+
+ tmp = 0;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_IN_ENABLE_AUX_L;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_IN_ENABLE_CD_L;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_MIC;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_IN_ENABLE_TAD;
+ audiopci_ak_write(dev, CODEC_LIN_SW1, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_IN_ENABLE_AUX_R;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_IN_ENABLE_CD_R;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_IN_ENABLE_TAD;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_MIC;
+ audiopci_ak_write(dev, CODEC_RIN_SW1, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_IN_ENABLE_TV_L;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_TMIC;
+ audiopci_ak_write(dev, CODEC_LIN_SW2, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_IN_ENABLE_TV_R;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_TMIC;
+ audiopci_ak_write(dev, CODEC_RIN_SW2, tmp);
+
+ /* configure volumes */
+ audiopci_mono(dev, CTL_MIC, CODEC_VOL_MIC);
+ audiopci_mono(dev, CTL_PHONE, CODEC_VOL_TAD);
+ audiopci_stereo(dev, CTL_LINE, CODEC_VOL_AUX_L);
+ audiopci_stereo(dev, CTL_CD, CODEC_VOL_CD_L);
+ audiopci_stereo(dev, CTL_VID, CODEC_VOL_TV_L);
+
+ /* activate 30dB mic boost */
+ audiopci_ak_write(dev, CODEC_MICBOOST,
+ dev->controls[CTL_MICBOOST].val ? 1 : 0);
+}
+
+static int
+audiopci_set_reclevel(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+ uint8_t l;
+ uint8_t r;
+
+ l = (val & 0xff00) >> 8;
+ r = val & 0xff;
+
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_micboost(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_monsrc(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ if ((val & ~INSRCS) != 0)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_recsrc(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ if ((val & ~INSRCS) != 0)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_volume(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ val &= 0xff;
+ if (val > 100)
+ return (EINVAL);
+
+ val = (val & 0xff) | ((val & 0xff) << 8);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static int
+audiopci_set_front(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+ uint8_t l;
+ uint8_t r;
+
+ l = (val & 0xff00) >> 8;
+ r = val & 0xff;
+
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_speaker(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ val &= 0xff;
+
+ if (val > 100)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+
+static void
+audiopci_alloc_ctrl(audiopci_dev_t *dev, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ audiopci_ctrl_t *pc;
+
+ bzero(&desc, sizeof (desc));
+
+ pc = &dev->controls[num];
+ pc->num = num;
+ pc->dev = dev;
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiopci_set_volume;
+ break;
+
+ case CTL_FRONT:
+ desc.acd_name = AUDIO_CTRL_ID_LINEOUT;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiopci_set_front;
+ break;
+
+ case CTL_MONO:
+ desc.acd_name = AUDIO_CTRL_ID_SPEAKER;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiopci_set_speaker;
+ break;
+
+ case CTL_MIC:
+ desc.acd_name = AUDIO_CTRL_ID_MIC;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_LINE:
+ desc.acd_name = AUDIO_CTRL_ID_LINEIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_CD:
+ desc.acd_name = AUDIO_CTRL_ID_CD;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_VID:
+ desc.acd_name = AUDIO_CTRL_ID_VIDEO;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_PHONE:
+ desc.acd_name = AUDIO_CTRL_ID_PHONE;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_RECSRC:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = INSRCS;
+ desc.acd_maxvalue = INSRCS;
+ desc.acd_flags = RECCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiopci_insrcs[i]; i++) {
+ desc.acd_enum[i] = audiopci_insrcs[i];
+ }
+ fn = audiopci_set_recsrc;
+ break;
+
+ case CTL_MONSRC:
+ desc.acd_name = AUDIO_CTRL_ID_MONSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = INSRCS;
+ desc.acd_maxvalue = INSRCS;
+ desc.acd_flags = MONCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiopci_insrcs[i]; i++) {
+ desc.acd_enum[i] = audiopci_insrcs[i];
+ }
+ fn = audiopci_set_monsrc;
+ break;
+
+ case CTL_MICBOOST:
+ desc.acd_name = AUDIO_CTRL_ID_MICBOOST;
+ desc.acd_type = AUDIO_CTRL_TYPE_BOOLEAN;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECCTL;
+ fn = audiopci_set_micboost;
+ break;
+ }
+
+ pc->val = val;
+ pc->ctrl = audio_dev_add_control(dev->adev, &desc,
+ audiopci_get_value, fn, pc);
+}
+
+static int
+audiopci_add_controls(audiopci_dev_t *dev)
+{
+ audiopci_alloc_ctrl(dev, CTL_VOLUME, 75);
+ audiopci_alloc_ctrl(dev, CTL_FRONT, ((75) | (75 << 8)));
+ audiopci_alloc_ctrl(dev, CTL_MONO, 75);
+ audiopci_alloc_ctrl(dev, CTL_MIC, 50);
+ audiopci_alloc_ctrl(dev, CTL_LINE, 0);
+ audiopci_alloc_ctrl(dev, CTL_CD, 0);
+ audiopci_alloc_ctrl(dev, CTL_VID, 0);
+ audiopci_alloc_ctrl(dev, CTL_PHONE, 0);
+ audiopci_alloc_ctrl(dev, CTL_RECSRC, (1U << INPUT_MIC));
+ audiopci_alloc_ctrl(dev, CTL_MONSRC, 0);
+ audiopci_alloc_ctrl(dev, CTL_MICBOOST, 1);
+
+ audiopci_configure_output(dev);
+ audiopci_configure_input(dev);
+
+ return (DDI_SUCCESS);
+}
+
+void
+audiopci_del_controls(audiopci_dev_t *dev)
+{
+ for (int i = 0; i < CTL_NUM; i++) {
+ if (dev->controls[i].ctrl) {
+ audio_dev_del_control(dev->controls[i].ctrl);
+ }
+ }
+}
+
+int
+audiopci_attach(dev_info_t *dip)
+{
+ uint16_t pci_command, vendor, device;
+ audiopci_dev_t *dev;
+ ddi_acc_handle_t pcih;
+
+ dev = kmem_zalloc(sizeof (*dev), KM_SLEEP);
+ dev->dip = dip;
+ ddi_set_driver_private(dip, dev);
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "pci_config_setup failed");
+ kmem_free(dev, sizeof (*dev));
+ return (DDI_FAILURE);
+ }
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+
+ if ((vendor != ENSONIQ_VENDOR_ID && vendor != CREATIVE_VENDOR_ID) ||
+ (device != ENSONIQ_ES1370))
+ goto err_exit;
+
+ dev->devid = device;
+
+ dev->adev = audio_dev_alloc(dip, 0);
+ if (dev->adev == NULL) {
+ goto err_exit;
+ }
+
+ audio_dev_set_description(dev->adev, "AudioPCI");
+ audio_dev_set_version(dev->adev, "ES1370");
+ audio_dev_add_info(dev->adev, "Legacy codec: Asahi Kasei AK4531");
+
+ /* activate the device */
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ /* map registers */
+ if (ddi_regs_map_setup(dip, 1, &dev->regs, 0, 0, &acc_attr,
+ &dev->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't map registers");
+ goto err_exit;
+ }
+
+ if (audiopci_setup_interrupts(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't register interrupts");
+ goto err_exit;
+ }
+
+ /* This allocates and configures the engines */
+ if (audiopci_init(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't init device");
+ goto err_exit;
+ }
+
+ (void) ddi_intr_enable(dev->ihandle[0]);
+
+ pci_config_teardown(&pcih);
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+err_exit:
+ pci_config_teardown(&pcih);
+
+ audiopci_destroy(dev);
+
+ return (DDI_FAILURE);
+}
+
+int
+audiopci_detach(audiopci_dev_t *dev)
+{
+ int tmp;
+
+ /* first unregister us from the DDI framework, might be busy */
+ if (audio_dev_unregister(dev->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ mutex_enter(&dev->mutex);
+
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DACIE | CONC_SERCTL_SYNIE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_SYN_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ dev->enabled = B_FALSE;
+
+ mutex_exit(&dev->mutex);
+
+ audiopci_destroy(dev);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_resume(audiopci_dev_t *dev)
+{
+ /* ask framework to reset/relocate engine data */
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audio_engine_reset(dev->port[i].engine);
+ }
+
+ mutex_enter(&dev->mutex);
+ dev->suspended = B_FALSE;
+
+ /* reinitialize hardware */
+ audiopci_init_hw(dev);
+
+ /* restore mixer settings */
+ audiopci_configure_output(dev);
+ audiopci_configure_input(dev);
+
+ /* restart ports */
+ for (int i = 0; i < PORT_MAX; i++) {
+ audiopci_port_t *port = &dev->port[i];
+ audiopci_init_port(port);
+ /* possibly start it up if was going when we suspended */
+ if (port->trigger) {
+ audiopci_start_port(port);
+
+ /* signal callbacks on resume */
+ if (port->num == PORT_ADC) {
+ audio_engine_produce(port->engine);
+ } else {
+ audio_engine_consume(port->engine);
+ }
+ }
+ }
+ mutex_exit(&dev->mutex);
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_suspend(audiopci_dev_t *dev)
+{
+ /*
+ * Stop all engines/DMA data.
+ */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audiopci_stop_port(&dev->port[i]);
+ audiopci_update_port(&dev->port[i]);
+ }
+ dev->suspended = B_TRUE;
+ dev->enabled = B_FALSE;
+ mutex_exit(&dev->mutex);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_quiesce(dev_info_t *dip)
+{
+ audiopci_dev_t *dev;
+ uint8_t tmp;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* This disables all DMA engines and interrupts */
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DACIE | CONC_SERCTL_SYNIE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_SYN_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ return (DDI_SUCCESS);
+}
+
+
+static int
+audiopci_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audiopci_dev_t *dev;
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audiopci_attach(dip));
+
+ case DDI_RESUME:
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+ return (audiopci_resume(dev));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int
+audiopci_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audiopci_dev_t *dev;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audiopci_detach(dev));
+
+ case DDI_SUSPEND:
+ return (audiopci_suspend(dev));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static struct dev_ops audiopci_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audiopci_ddi_attach, /* attach */
+ audiopci_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audiopci_quiesce, /* quiesce */
+};
+
+static struct modldrv audiopci_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Ensoniq 1370 Audio", /* linkinfo */
+ &audiopci_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audiopci_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiopci_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audiopci_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audiopci_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf
new file mode 100644
index 0000000000..ca6a4c8726
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf
@@ -0,0 +1,46 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audiopci audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audiopci
+# driver enforces a maximum and minimum count.
+#
+# It should also be understood that not all interrupt rates are legal.
+# The hardware is restricted to DMA buffers being allocated on certain
+# boundaries. If those boundaries are violated then the value specified
+# will be ignored.
+#
+play-interrupts=75;
+record-interrupts=75;
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h
new file mode 100644
index 0000000000..c922dc2cc4
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h
@@ -0,0 +1,233 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Definitions for the Creative/Ensoniq AudioPCI97 driver.
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#ifndef _AUDIOPCI_H
+#define _AUDIOPCI_H
+
+/* CONCERT PCI-SIG defines */
+#define CONC_PCI_VENDID 0x1274U
+#define CONC_PCI_DEVID 0x5000U
+
+/* used for the development board only!! */
+#define CONC_DEV_PCI_VENDID 0x1274U
+#define CONC_DEV_PCI_DEVID 0x5000U
+
+
+/*
+ * CONCERT Registers
+ */
+
+#define DAC_CLOCK_DIVIDE 22579200UL /* DAC2 (CODEC) clock divide */
+
+/* Concert direct register offset defines */
+
+#define CONC_bDEVCTL_OFF 0x00 /* Device control/enable */
+#define CONC_bMISCCTL_OFF 0x01 /* Miscellaneous control */
+#define CONC_wDACRATE_OFF 0x02 /* CODEC clock divider for PLL */
+#define CONC_dSTATUS_OFF 0x04 /* long status register */
+#define CONC_bCODECSTAT_OFF 0x05 /* CODEC interface status */
+#define CONC_bUARTDATA_OFF 0x08 /* UART data R/W - read clears RX int */
+#define CONC_bUARTCSTAT_OFF 0x09 /* UART control and status */
+#define CONC_bMEMPAGE_OFF 0x0c /* Memory page select */
+#define CONC_wCODECCTL_OFF 0x10 /* CODEC control - word-write-only */
+#define CONC_wNMISTAT_OFF 0x18 /* Legacy NMI status */
+#define CONC_bNMIENA_OFF 0x1a /* Legacy NMI enable */
+#define CONC_bNMICTL_OFF 0x1b /* Legacy control */
+#define CONC_bSERFMT_OFF 0x20 /* Serial device control */
+#define CONC_bSERCTL_OFF 0x21 /* Serial device format */
+#define CONC_bSKIPC_OFF 0x22 /* Skip counts for DAC (wave) */
+#define CONC_wSYNIC_OFF 0x24 /* Synth int count in sample frames */
+#define CONC_wSYNCIC_OFF 0x26 /* Synth current int count */
+#define CONC_wDACIC_OFF 0x28 /* DAC int count in sample frames */
+#define CONC_wDACCIC_OFF 0x2a /* DAC current int count */
+#define CONC_wADCIC_OFF 0x2c /* ADC int count in sample frames */
+#define CONC_wADCCIC_OFF 0x2e /* ADC current int count */
+#define CONC_MEMBASE_OFF 0x30 /* Memory window base - 16 bytes */
+
+/* Device Control defines */
+#define CONC_DEVCTL_SERR_DIS 0x01 /* internal PCI serr bus enable */
+#define CONC_DEVCTL_CODEC_EN 0x02 /* CoDec Enable */
+#define CONC_DEVCTL_JSTICK_EN 0x04 /* Joystick Enable */
+#define CONC_DEVCTL_UART_EN 0x08 /* UART Enable */
+#define CONC_DEVCTL_ADC_EN 0x10 /* ADC Enable (record) */
+#define CONC_DEVCTL_DAC_EN 0x20 /* DAC Enable (playback) */
+#define CONC_DEVCTL_SYN_EN 0x40 /* Synth Enable */
+#define CONC_DEVCTL_MICBIAS 0x4000L /* mic bias switch */
+
+/* Misc Control defines */
+#define CONC_MISCCTL_MUTE 0x01 /* XTL0 wired to mute */
+#define CONC_MISCCTL_CCB_INTRM 0x04 /* CCB interrupt mask */
+#define CONC_MISCCTL_SYN_5KHZ 0x00 /* synth: 5512 Hz */
+#define CONC_MISCCTL_SYN_11KHZ 0x10 /* synth: 11025 Hz */
+#define CONC_MISCCTL_SYN_22KHZ 0x20 /* synth: 22050 Hz */
+#define CONC_MISCCTL_SYN_44KHZ 0x30 /* synth: 44100 Hz */
+
+/* Interrupt Status defines */
+#define CONC_INTSTAT_ADCINT 0x01 /* A/D interrupt pending bit */
+#define CONC_INTSTAT_DACINT 0x02 /* DAC interrupt pending bit */
+#define CONC_INTSTAT_SYNINT 0x04 /* synth interrupt pending bit */
+#define CONC_INTSTAT_UARTINT 0x08 /* UART interrupt pending bit */
+#define CONC_INTSTAT_PENDING 0x80000000
+ /* this bit set high while'st we have an interrupt */
+
+/* Codec Status defines */
+#define CONC_CSTAT_CSTAT 0x4
+#define CONC_CSTAT_CBUSY 0x2
+#define CONC_CSTAT_CWRIP 0x1
+
+/* SERFMT PCM format defines */
+#define CONC_PCM_SYN_STEREO 0x01
+#define CONC_PCM_SYN_16BIT 0x02
+#define CONC_PCM_DAC_STEREO 0x04
+#define CONC_PCM_DAC_16BIT 0x08
+#define CONC_PCM_ADC_STEREO 0x10
+#define CONC_PCM_ADC_16BIT 0x20
+
+/* Serial Control defines */
+#define CONC_SERCTL_SYNIE 0x01 /* synth int enable */
+#define CONC_SERCTL_DACIE 0x02 /* playback interrupt enable */
+#define CONC_SERCTL_ADCIE 0x04 /* record interrupt enable */
+#define CONC_SERCTL_SYNPAUSE 0x10 /* playback pause */
+
+/* Concert memory page-banked register offset defines */
+#define CONC_dSYNPADDR_OFF 0x30 /* Synth host frame PCI phys addr */
+#define CONC_wSYNFC_OFF 0x34 /* Synth host frame count in DWORDS */
+#define CONC_wSYNCFC_OFF 0x36 /* Synth host current frame count */
+#define CONC_dDACPADDR_OFF 0x38 /* DAC host frame PCI phys addr */
+#define CONC_wDACFC_OFF 0x3c /* DAC host frame count in DWORDS */
+#define CONC_wDACCFC_OFF 0x3e /* DAC host current frame count */
+#define CONC_dADCPADDR_OFF 0x30 /* ADC host frame PCI phys addr */
+#define CONC_wADCFC_OFF 0x34 /* ADC host frame count in DWORDS */
+#define CONC_wADCCFC_OFF 0x36 /* ADC host current frame count */
+
+/* Concert memory page number defines */
+#define CONC_SYNRAM_PAGE 0x00 /* Synth host/serial I/F RAM */
+#define CONC_DACRAM_PAGE 0x04 /* DAC host/serial I/F RAM */
+#define CONC_ADCRAM_PAGE 0x08 /* ADC host/serial I/F RAM */
+#define CONC_SYNCTL_PAGE 0x0c /* Page bank for synth host control */
+#define CONC_DACCTL_PAGE 0x0c /* Page bank for DAC host control */
+#define CONC_ADCCTL_PAGE 0x0d /* Page bank for ADC host control */
+#define CONC_FIFO0_PAGE 0x0e /* page 0 of UART "FIFO" (rx stash) */
+#define CONC_FIFO1_PAGE 0x0f /* page 1 of UART "FIFO" (rx stash) */
+
+/* UARTCSTAT register masks */
+#define CONC_UART_RXRDY 0x01
+#define CONC_UART_TXRDY 0x02
+#define CONC_UART_TXINT 0x04
+#define CONC_UART_RXINT 0x80
+
+#define CONC_UART_CTL 0x03
+#define CONC_UART_TXINTEN 0x20
+#define CONC_UART_RXINTEN 0x80
+
+/*
+ * CODEC register map
+ */
+#define NUMREGS 32 /* total number of registers */
+#define NUMVOLS 16 /* number of vol regs */
+
+/* Source and output volume control defines */
+#define CODEC_VOL_MASTER_L 0x00U /* Master out, left */
+#define CODEC_VOL_MASTER_R 0x01U /* Master out, right */
+#define CODEC_VOL_WAVE_L 0x02U /* Wave DAC, left */
+#define CODEC_VOL_WAVE_R 0x03U /* Wave DAC, right */
+#define CODEC_VOL_SYNTH_L 0x04U /* Synth DAC, left */
+#define CODEC_VOL_SYNTH_R 0x05U /* Synth DAC, right */
+#define CODEC_VOL_CD_L 0x06U /* CD audio, left */
+#define CODEC_VOL_CD_R 0x07U /* CD audio, right */
+#define CODEC_VOL_AUX_L 0x08U /* Aux line source, left */
+#define CODEC_VOL_AUX_R 0x09U /* Aux line source, right */
+#define CODEC_VOL_TV_L 0x0aU /* TV Tuner, left */
+#define CODEC_VOL_TV_R 0x0bU /* TV Tuner, right */
+#define CODEC_VOL_TAD 0x0cU /* TAD monitor, mono */
+#define CODEC_VOL_MONO2 0x0dU /* Unused MONO2 */
+#define CODEC_VOL_MIC 0x0eU /* Mic, mono */
+#define CODEC_VOL_MONO 0x0fU /* Mono out volume */
+
+/* Input bus enable defines -SW1 */
+#define CODEC_IN_ENABLE_MIC 0x01U /* Mic enable, mono */
+#define CODEC_IN_ENABLE_CD_R 0x02U /* CD audio enable, right */
+#define CODEC_IN_ENABLE_CD_L 0x04U /* CD audio enable, left */
+#define CODEC_IN_ENABLE_AUX_R 0x08U /* Aux line source enable, right */
+#define CODEC_IN_ENABLE_AUX_L 0x10U /* Aux line source enable, left */
+#define CODEC_IN_ENABLE_SYNTH_R 0x20U /* Synth DAC enable, right */
+#define CODEC_IN_ENABLE_SYNTH_L 0x40U /* Synth DAC enable, left */
+
+/* Input bus enable defines - SW2 */
+#define CODEC_IN_ENABLE_TAD 0x01U /* TAD monitor enable, mono */
+#define CODEC_IN_ENABLE_MONO2 0x02U /* Unused MONO2 enable, mono */
+#define CODEC_IN_ENABLE_WAVE 0x04U /* Wave DAC enable */
+#define CODEC_IN_ENABLE_TV_R 0x08U /* TV Tuner enable, right */
+#define CODEC_IN_ENABLE_TV_L 0x10U /* TV Tuner enable, left */
+#define CODEC_IN_ENABLE_TMONO2 0x20U /* unboosted MONO2 */
+#define CODEC_IN_ENABLE_TMONO1 0x40U /* unboosted MONO1 */
+#define CODEC_IN_ENABLE_TMIC 0x80U /* unboosted MONO3 (mic) */
+
+/* Output bus enable defines - SW1 */
+#define CODEC_OUT_ENABLE_MIC 0x01U /* Mic enable, mono */
+#define CODEC_OUT_ENABLE_CD 0x06U /* CD audio enable, stereo */
+#define CODEC_OUT_ENABLE_AUX 0x18U /* Aux line source enable, stereo */
+#define CODEC_OUT_ENABLE_SYNTH 0x60U /* Synth DAC enable, stereo */
+
+/* Output bus enable defines - SW2 */
+#define CODEC_OUT_ENABLE_TAD 0x01U /* TAD monitor enable, mono */
+#define CODEC_OUT_ENABLE_MONO2 0x02U /* Unused MONO2 enable, mono */
+#define CODEC_OUT_ENABLE_WAVE 0x0cU /* Wave DAC enable, stereo */
+#define CODEC_OUT_ENABLE_TV 0x30U /* TV Tuner enable, stereo */
+
+/* Volume setting constants */
+#define CODEC_ATT_MUTE 0x80U
+#define CODEC_ATT_MAX 0x1fU
+#define CODEC_ATT_MONO 0x07U
+
+/* Control function defines */
+#define CODEC_CTL_4SPKR 0x00U /* 4-spkr output mode enable */
+#define CODEC_CTL_MICBOOST 0x01U /* Mic boost (+30 dB) enable */
+
+/* Miscellaneous CODEC defines for internal use */
+#define CODEC_OUT_SW1 0x10U
+#define CODEC_OUT_SW2 0x11U
+#define CODEC_LIN_SW1 0x12U
+#define CODEC_RIN_SW1 0x13U
+#define CODEC_LIN_SW2 0x14U
+#define CODEC_RIN_SW2 0x15U
+#define CODEC_RESET_PWRD 0x16U
+#define CODEC_CLKSELECT 0x17U
+#define CODEC_ADSELECT 0x18U
+#define CODEC_MICBOOST 0x19U
+
+#endif /* _AUDIOPCI_H */
diff --git a/usr/src/uts/common/io/audio/drv/audiots/audiots.c b/usr/src/uts/common/io/audio/drv/audiots/audiots.c
new file mode 100644
index 0000000000..4c5a19f87b
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.c
@@ -0,0 +1,2015 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audiots Audio Driver
+ *
+ * This Audio Driver controls the T2 audio core in the ALI M1553
+ * southbridge chip. This chip supports multiple play streams, but just
+ * a single record stream. It also supports wave table synthesis and
+ * hardware MIDI and joystick ports. Unfortunately the MIDI ports are
+ * not available because their pins have been re-assigned to expose
+ * interrupts. We also aren't going to do anything with the joystick
+ * ports. The audio core controls an AC-97 V2.1 Codec.
+ *
+ * The DMA engine uses a single buffer which is large enough to hold
+ * two interrupts worth of data. When it gets to the mid point an
+ * interrupt is generated and data is either sent (for record) or
+ * requested and put in that half of the buffer (for play). When the
+ * second half is played we do the same, but the audio core loops the
+ * pointer back to the beginning.
+ *
+ * The audio core has a bug in silicon that doesn't let it read the AC-97
+ * Codec's register. T2 has provided an algorithm that attempts to read the
+ * the Codec several times. This is probably heuristic and thus isn't
+ * absolutely guaranteed to work. However we do have to place a limit on
+ * the looping, otherwise when we read a valid 0x00 we would never exit
+ * the loop. Unfortunately there is also a problem with writing the AC-97
+ * Codec's registers as well. Thus we read it back to verify the write.
+ *
+ * The AC'97 common code provides shadow state for AC'97 registers for us,
+ * so we only need to read those registers during early startup (primarily
+ * to determine codec id and capabilities.)
+ *
+ * We don't save any of the audio controller registers during normal
+ * operation. When we need to save register state we only have to save
+ * the aram and eram. The rest of the controller state is never modified
+ * from the initial programming. Thus restoring the controller state
+ * can be done from audiots_chip_init() as well.
+ *
+ *
+ * WARNING: The SME birdsnest platform uses a PCI bridge chip between the
+ * CPU and the southbridge containing the audio core. There is
+ * a bug in silicon that causes a bogus parity error. With the mixer
+ * reimplementation project, Bug 4374774, the audio driver is always
+ * set to the best precision and number of channels. Thus when turning
+ * the mixer on and off the only thing that changes is the sample rate.
+ * This change in programming doesn't trigger the silicon error.
+ * Thus the supported channels must always be 2 and the precision
+ * must always be 16-bits. This will keep any future change in the
+ * mixer from exposing this bug.
+ *
+ * Due to a hardware bug, system power management is not supported by this
+ * driver.
+ *
+ * CAUTION: If audio controller state is changed outside of aram
+ * and eram then that information must be saved and restored
+ * during power management shutdown and bringup.
+ *
+ * NOTE: The AC-97 Codec's reset pin is set to PCI reset, so we
+ * can't power down the Codec all the way.
+ *
+ * NOTE: This driver depends on the drv/audio and misc/ac97
+ * modules being loaded first.
+ *
+ * NOTE: Don't OR the ap_stop register to stop a play or record. This
+ * will just stop all active channels because a read of ap_stop
+ * returns ap_start. Just set the ap_stop register with the
+ * channels you want to stop. The same goes for ap_start.
+ *
+ * NOTE: There is a hardware problem with P2 rev motherboards. After
+ * prolonged use, reading the AC97 register will always return
+ * busy. The AC97 register is now useless. Consequently, we are no
+ * longer able to program the Codec. This work around disables
+ * audio when this state is detected. It's not great, but its
+ * better than having audio blasting out at 100% all the time.
+ *
+ * NOTE: Power Management testing has also exposed this AC97 timeout
+ * problem. Management has decided this is too risky for customers
+ * and hence they want power management support removed from the
+ * audio subsystem. All PM support is now removed.
+ */
+
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/pci.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/debug.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audiots.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audiots_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audiots_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audiots_quiesce(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audiots_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audiots_close(void *);
+static int audiots_start(void *);
+static void audiots_stop(void *);
+static int audiots_format(void *);
+static int audiots_channels(void *);
+static int audiots_rate(void *);
+static void audiots_chinfo(void *, int, unsigned *, unsigned *);
+static uint64_t audiots_count(void *);
+static void audiots_sync(void *, unsigned);
+static size_t audiots_qlen(void *);
+
+static audio_engine_ops_t audiots_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audiots_open,
+ audiots_close,
+ audiots_start,
+ audiots_stop,
+ audiots_count,
+ audiots_format,
+ audiots_channels,
+ audiots_rate,
+ audiots_sync,
+ audiots_qlen,
+ audiots_chinfo
+};
+
+/*
+ * Local Routine Prototypes
+ */
+static void audiots_power_up(audiots_state_t *);
+static void audiots_chip_init(audiots_state_t *);
+static uint16_t audiots_get_ac97(void *, uint8_t);
+static void audiots_set_ac97(void *, uint8_t, uint16_t);
+static int audiots_init_state(audiots_state_t *, dev_info_t *);
+static uint_t audiots_intr(caddr_t);
+static int audiots_map_regs(dev_info_t *, audiots_state_t *);
+static void audiots_update_port(audiots_port_t *);
+static void audiots_start_port(audiots_port_t *);
+static void audiots_stop_port(audiots_port_t *);
+static uint16_t audiots_read_ac97(audiots_state_t *, int);
+static void audiots_stop_everything(audiots_state_t *);
+static void audiots_destroy(audiots_state_t *);
+static int audiots_alloc_port(audiots_state_t *, int);
+static void audiots_reset_port(audiots_port_t *);
+
+/*
+ * Global variables, but viewable only by this file.
+ */
+
+/* anchor for soft state structures */
+static void *audiots_statep;
+
+/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
+static char *audiots_name = TS_NAME;
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audiots_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audiots_attach, /* devo_attach */
+ audiots_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devo_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audiots_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audiots_modldrv = {
+ &mod_driverops, /* drv_modops */
+ TS_MOD_NAME, /* drv_linkinfo */
+ &audiots_dev_ops /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audiots_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audiots_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/*
+ * NOTE: Grover OBP v4.0.166 and rev G of the ALI Southbridge chip force the
+ * audiots driver to use the upper 2 GB DMA address range. However to maintain
+ * backwards compatibility with older systems/OBP, we're going to try the full
+ * 4 GB DMA range.
+ *
+ * Eventually, this will be set back to using the proper high 2 GB DMA range.
+ */
+
+/* Device attribute structure - full 4 gig address range */
+static ddi_dma_attr_t audiots_attr = {
+ DMA_ATTR_VERSION, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000003fffLL, /* DMA counter register - 16 bits */
+ 0x0000000000000008LL, /* DMA address alignment, 64-bit */
+ 0x0000007f, /* 1 through 64 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x0000000000003fffLL, /* maximum transfer size, 16k */
+ 0x000000000000ffffLL, /* segment boundary, 64k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t ts_acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t ts_regs_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audiots_dev_ops, TS_NAME);
+
+ /* initialize the soft state */
+ if ((error = ddi_soft_state_init(&audiots_statep,
+ sizeof (audiots_state_t), 1)) != 0) {
+ audio_fini_ops(&audiots_dev_ops);
+ return (error);
+ }
+
+ if ((error = mod_install(&audiots_modlinkage)) != 0) {
+ audio_fini_ops(&audiots_dev_ops);
+ ddi_soft_state_fini(&audiots_statep);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audiots_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* free the soft state internal structures */
+ ddi_soft_state_fini(&audiots_statep);
+
+ /* clean up ops */
+ audio_fini_ops(&audiots_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns infomation about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ int error;
+
+ error = mod_info(&audiots_modlinkage, modinfop);
+
+ return (error);
+}
+
+
+/*
+ * audiots_attach()
+ *
+ * Description:
+ * Attach an instance of the audiots driver. This routine does the
+ * device dependent attach tasks.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiots_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ break;
+ case DDI_RESUME:
+
+ /* we've already allocated the state structure so get ptr */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) ==
+ NULL) {
+ /* this will probably panic */
+ cmn_err(CE_WARN,
+ "!%s%d: RESUME get soft state failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ ASSERT(dip == state->ts_dip);
+
+ /* suspend/resume resets the chip, so we have no more faults */
+ if (state->ts_flags & TS_AUDIO_READ_FAILED) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_RESTORED,
+ DDI_DEVICE_FAULT,
+ "check port, gain, balance, and mute settings");
+ /* and clear the fault state flags */
+ state->ts_flags &=
+ ~(TS_AUDIO_READ_FAILED|TS_READ_FAILURE_PRINTED);
+ }
+
+ audiots_power_up(state);
+ audiots_chip_init(state);
+ ac97_resume(state->ts_ac97);
+
+ mutex_enter(&state->ts_lock);
+ /*
+ * Initialize/reset ports. Done under the lock, to
+ * avoid race with interrupt service routine.
+ */
+ state->ts_suspended = B_FALSE;
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ audiots_port_t *port = state->ts_ports[i];
+ if (port != NULL) {
+ /* relocate any streams properly */
+ if (port->tp_engine)
+ audio_engine_reset(port->tp_engine);
+
+ /* do a hardware reset on the port */
+ audiots_reset_port(port);
+ if (port->tp_started) {
+ audiots_start_port(port);
+ } else {
+ audiots_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&state->ts_lock);
+
+ return (DDI_SUCCESS);
+
+ default:
+ cmn_err(CE_WARN, "!%s%d: attach() unknown command: 0x%x",
+ audiots_name, instance, cmd);
+ return (DDI_FAILURE);
+ }
+
+ /* before we do anything make sure that we haven't had a h/w failure */
+ if (ddi_get_devstate(dip) == DDI_DEVSTATE_DOWN) {
+ cmn_err(CE_WARN, "%s%d: The audio hardware has "
+ "been disabled.", audiots_name, instance);
+ cmn_err(CE_CONT, "Please reboot to restore audio.");
+ return (DDI_FAILURE);
+ }
+
+ /* we don't support high level interrupts in this driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN, "!%s%d: unsupported high level interrupt",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the state structure */
+ if (ddi_soft_state_zalloc(audiots_statep, instance) == DDI_FAILURE) {
+ cmn_err(CE_WARN, "!%s%d: soft state allocate failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * WARNING: From here on all errors require that we free memory,
+ * including the state structure.
+ */
+
+ /* get the state structure - cannot fail */
+ state = ddi_get_soft_state(audiots_statep, instance);
+ ASSERT(state != NULL);
+
+ if ((state->ts_adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "unable to allocate audio dev");
+ goto error;
+ }
+
+ /* map in the registers, allocate DMA buffers, etc. */
+ if (audiots_map_regs(dip, state) == DDI_FAILURE) {
+ audio_dev_warn(state->ts_adev, "unable to map registers");
+ goto error;
+ }
+
+ /* initialize the audio state structures */
+ if (audiots_init_state(state, dip) == DDI_FAILURE) {
+ audio_dev_warn(state->ts_adev, "init state structure failed");
+ goto error;
+ }
+
+ /* power up */
+ audiots_power_up(state);
+
+ /* initialize the audio controller */
+ audiots_chip_init(state);
+
+ /* initialize the AC-97 Codec */
+ ac97_init(state->ts_ac97, state->ts_adev);
+
+ /* put the engine interrupts into a known state -- all off */
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_ainten,
+ TS_ALL_DMA_OFF);
+
+ /* call the framework attach routine */
+ if (audio_dev_register(state->ts_adev) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev, "unable to register audio");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ state->ts_ksp = kstat_create(TS_NAME, instance, TS_NAME,
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (state->ts_ksp != NULL) {
+ kstat_install(state->ts_ksp);
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, NULL, NULL, audiots_intr,
+ (caddr_t)state) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "failed to register interrupt handler");
+ goto error;
+ }
+ state->ts_flags |= TS_INTR_INSTALLED;
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audiots_destroy(state);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audiots_detach()
+ *
+ * Description:
+ * Detach an instance of the audiots driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audiots_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ /* get the state structure */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
+ cmn_err(CE_WARN, "!%s%d: detach get soft state failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ break;
+ case DDI_SUSPEND:
+
+ ac97_suspend(state->ts_ac97);
+
+ mutex_enter(&state->ts_lock);
+
+ state->ts_suspended = B_TRUE; /* stop new ops */
+
+ /* we may already be powered down, so only save state if up */
+
+ /* stop playing and recording */
+ (void) audiots_stop_everything(state);
+
+ mutex_exit(&state->ts_lock);
+
+ return (DDI_SUCCESS);
+
+ default:
+ return (DDI_FAILURE);
+ }
+
+ /* attempt to unregister from the framework first */
+ if (audio_dev_unregister(state->ts_adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audiots_destroy(state);
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiots_quiesce()
+ *
+ * Description:
+ * Quiesce an instance of the audiots driver. Stops all DMA and
+ * interrupts.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was quiesced
+ * DDI_SUCCESS The driver was NOT quiesced
+ */
+static int
+audiots_quiesce(dev_info_t *dip)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ /* get the state structure */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ audiots_stop_everything(state);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_power_up()
+ *
+ * Description
+ * Ensure that the device is running in PCI power state D0.
+ */
+static void
+audiots_power_up(audiots_state_t *state)
+{
+ ddi_acc_handle_t pcih = state->ts_pcih;
+ uint8_t ptr;
+ uint16_t pmcsr;
+
+ if ((pci_config_get16(pcih, PCI_CONF_STAT) & PCI_STAT_CAP) == 0) {
+ /* does not implement PCI capabilities -- no PM */
+ return;
+ }
+
+ ptr = pci_config_get8(pcih, PCI_CONF_CAP_PTR);
+ for (;;) {
+ if (ptr == PCI_CAP_NEXT_PTR_NULL) {
+ /* PM capability not found */
+ return;
+ }
+ if (pci_config_get8(pcih, ptr + PCI_CAP_ID) == PCI_CAP_ID_PM) {
+ /* found it */
+ break;
+ }
+ ptr = pci_config_get8(pcih, ptr + PCI_CAP_NEXT_PTR);
+ }
+
+ /* if we got here, then got valid PMCSR pointer */
+ ptr += PCI_PMCSR;
+
+ /* check to see if we are already in state D0 */
+ pmcsr = pci_config_get16(pcih, ptr);
+ if ((pmcsr & PCI_PMCSR_STATE_MASK) != PCI_PMCSR_D0) {
+
+ /* D3hot (or any other state) -> D0 */
+ pmcsr &= ~PCI_PMCSR_STATE_MASK;
+ pmcsr |= PCI_PMCSR_D0;
+ pci_config_put16(pcih, ptr, pmcsr);
+ }
+
+ /*
+ * Wait for it to power up - PCI spec says 10 ms is enough.
+ * We double it. Note that no locks are held when this routine
+ * is called, so we can sleep (we are in attach context only).
+ *
+ * We do this delay even if already powerd up, just to make
+ * sure we aren't seeing something that *just* transitioned
+ * into D0 state.
+ */
+ delay(drv_usectohz(TS_20MS));
+
+ /* clear PME# flag */
+ pmcsr = pci_config_get16(pcih, ptr);
+ pci_config_put16(pcih, ptr, pmcsr | PCI_PMCSR_PME_STAT);
+}
+
+/*
+ * audiots_chip_init()
+ *
+ * Description:
+ * Initialize the audio core.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_chip_init(audiots_state_t *state)
+{
+ ddi_acc_handle_t handle = state->ts_acch;
+ audiots_regs_t *regs = state->ts_regs;
+ int str;
+
+ /* start with all interrupts & dma channels disabled */
+ ddi_put32(handle, &regs->aud_regs.ap_stop, TS_ALL_DMA_ENGINES);
+ ddi_put32(handle, &regs->aud_regs.ap_ainten, TS_ALL_DMA_OFF);
+
+ /* set global music and wave volume to 0dB */
+ ddi_put32(handle, &regs->aud_regs.ap_volume, 0x0);
+
+ /* enable end interrupts for all channels. */
+ ddi_put32(handle, &regs->aud_regs.ap_cir_gc, AP_CIR_GC_ENDLP_IE);
+
+ /* for each stream, set gain and vol settings */
+ for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
+ /*
+ * Set volume to all off, 1st left and then right.
+ * These are never changed, so we don't have to save them.
+ */
+ ddi_put16(handle,
+ &regs->aud_ram[str].eram.eram_gvsel_pan_vol,
+ (ERAM_WAVE_VOL|ERAM_PAN_LEFT|ERAM_PAN_0dB|
+ ERAM_VOL_MAX_ATTEN));
+ ddi_put16(handle,
+ &regs->aud_ram[str].eram.eram_gvsel_pan_vol,
+ (ERAM_WAVE_VOL|ERAM_PAN_RIGHT|ERAM_PAN_0dB|
+ ERAM_VOL_MAX_ATTEN));
+
+ /*
+ * The envelope engine *MUST* remain in still mode (off).
+ * Otherwise bad things like gain randomly disappearing might
+ * happen. See bug #4332773.
+ */
+
+ ddi_put32(handle, &regs->aud_ram[str].eram.eram_ebuf1,
+ ERAM_EBUF_STILL);
+ ddi_put32(handle, &regs->aud_ram[str].eram.eram_ebuf2,
+ ERAM_EBUF_STILL);
+
+ /* program the initial eram and aram rate */
+ ddi_put16(handle, &regs->aud_ram[str].aram.aram_delta,
+ 1 << TS_SRC_SHIFT);
+ ddi_put16(handle, &regs->aud_ram[str].eram.eram_ctrl_ec,
+ ERAM_16_BITS | ERAM_STEREO | ERAM_LOOP_MODE |
+ ERAM_SIGNED_PCM);
+ }
+
+ /* program channel 31 for record */
+ OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_global_control,
+ (AP_CLOGAL_CTRL_E_PCMIN_CH31|AP_CLOGAL_CTRL_PCM_OUT_AC97|
+ AP_CLOGAL_CTRL_MMC_FROM_MIXER|AP_CLOGAL_CTRL_PCM_OUT_TO_AC97));
+
+ /* do a warm reset, which powers up the Codec */
+ OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
+ AP_SCTRL_WRST_CODEC);
+ drv_usecwait(2);
+ AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
+ ~AP_SCTRL_WRST_CODEC);
+
+ /* do a warm reset via the Codec, yes, I'm being paranoid! */
+ audiots_set_ac97(state, AC97_RESET_REGISTER, 0);
+
+ /* Make sure the Codec is powered up. */
+ int i = TS_WAIT_CNT;
+ while ((audiots_get_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER) &
+ PCSR_POWERD_UP) != PCSR_POWERD_UP && i--) {
+ drv_usecwait(1);
+ }
+
+}
+
+/*
+ * audiots_get_ac97()
+ *
+ * Description:
+ * Get the value in the specified AC-97 Codec register. There is a
+ * bug in silicon which forces us to do multiple reads of the Codec's
+ * register. This algorithm was provided by T2 and is heuristic in
+ * nature. Unfortunately we have no guarantees that the real answer
+ * isn't 0x0000, which is what we get when a read fails. So we loop
+ * TS_LOOP_CNT times before we give up. We just have to hope this is
+ * sufficient to give us the correct value.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ *
+ * Returns:
+ * unsigned short The value in the specified register
+ */
+static uint16_t
+audiots_get_ac97(void *arg, uint8_t reg)
+{
+ audiots_state_t *state = arg;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint16_t *data;
+ int count;
+ int delay;
+ uint16_t first;
+ uint16_t next;
+
+ if (state->ts_revid == AC_REV_ID1) {
+ data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
+ } else {
+ data = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ }
+
+ /* make sure the register is good */
+ reg &= AP_ACRD_INDEX_MASK;
+ for (count = TS_LOOP_CNT; count--; ) {
+ if ((first = audiots_read_ac97(state, reg)) != 0) {
+ next = first;
+ break;
+ }
+
+ delay = TS_DELAY_CNT;
+ while (delay--) {
+ (void) ddi_get16(handle, data);
+ }
+
+ if ((next = audiots_read_ac97(state, reg)) != 0) {
+ break;
+ }
+ }
+
+ /*
+ * Arggg, if you let the next read happen too soon then it fails.
+ * 12 usec fails, 13 usec succeeds. So set it to 20 for safety.
+ */
+ drv_usecwait(TS_20US);
+
+ return (next);
+
+}
+
+/*
+ * audiots_init_state()
+ *
+ * Description:
+ * This routine initializes the audio driver's state structure.
+ * This includes reading the properties.
+ *
+ * CAUTION: This routine cannot allocate resources, unless it frees
+ * them before returning for an error. Also, error_destroy:
+ * in audiots_attach() would need to be fixed as well.
+ *
+ * NOTE: birdsnest supports CD ROM input. We check for the cdrom
+ * property. If there we turn it on.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS State structure initialized
+ * DDI_FAILURE State structure not initialized
+ */
+static int
+audiots_init_state(audiots_state_t *state, dev_info_t *dip)
+{
+ state->ts_ac97 = ac97_alloc(dip, audiots_get_ac97,
+ audiots_set_ac97, state);
+
+ if (state->ts_ac97 == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* save the device info pointer */
+ state->ts_dip = dip;
+
+ /* get the iblock cookie needed for interrupt context */
+ if (ddi_get_iblock_cookie(dip, 0, &state->ts_iblock) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "cannot get iblock cookie");
+ return (DDI_FAILURE);
+ }
+
+ /* initialize the state mutexes and condition variables */
+ mutex_init(&state->ts_lock, NULL, MUTEX_DRIVER, state->ts_iblock);
+ state->ts_flags |= TS_MUTEX_INIT;
+
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ if (audiots_alloc_port(state, i) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+ }
+ /* init power management state */
+ state->ts_suspended = B_FALSE;
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiots_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * NOTE: This device needs to make sure any PIO access required to clear
+ * its interrupt has made it out on the PCI bus before returning from its
+ * interrupt handler so that the interrupt has been deasserted. This is
+ * done by rereading the address engine interrupt register.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audiots_intr(caddr_t T)
+{
+ audiots_state_t *state = (void *)T;
+ audiots_regs_t *regs = state->ts_regs;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint32_t interrupts;
+
+ mutex_enter(&state->ts_lock);
+
+ if (state->ts_suspended) {
+ mutex_exit(&state->ts_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ interrupts = ddi_get32(handle, &regs->aud_regs.ap_aint);
+ if (interrupts == 0) {
+ mutex_exit(&state->ts_lock);
+ /* no interrupts to process, so it's not us */
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /*
+ * Clear the interrupts to acknowledge. Also, reread the
+ * interrupt reg to ensure that PIO write has completed.
+ */
+ ddi_put32(handle, &regs->aud_regs.ap_aint, interrupts);
+ (void) ddi_get32(handle, &regs->aud_regs.ap_aint);
+
+ /* update the kernel interrupt statistics */
+ if (state->ts_ksp) {
+ TS_KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&state->ts_lock);
+
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ audiots_port_t *port = state->ts_ports[i];
+
+ if (((interrupts & port->tp_int_mask) == 0) ||
+ (!port->tp_started))
+ continue;
+
+ if (i == TS_INPUT_PORT) {
+ audio_engine_produce(port->tp_engine);
+ } else {
+ audio_engine_consume(port->tp_engine);
+ }
+ }
+
+ return (DDI_INTR_CLAIMED);
+
+}
+
+/*
+ * audiots_map_regs()
+ *
+ * Description:
+ * This routine maps the registers in.
+ *
+ * Once the config space registers are mapped in we determine if the
+ * audio core may be power managed. It should, but if it doesn't,
+ * then trying to may cause the core to hang.
+ *
+ * CAUTION: Make sure all errors call audio_dev_warn().
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ * audiots_state_t *state The device's state structure
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audiots_map_regs(dev_info_t *dip, audiots_state_t *state)
+{
+ char rev[16];
+ char *name;
+
+ /* map in the registers, the config and memory mapped registers */
+ if (pci_config_setup(dip, &state->ts_pcih) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "unable to map PCI configuration space");
+ return (DDI_FAILURE);
+ }
+
+ /* Read the Audio Controller's vendor, device, and revision IDs */
+ state->ts_devid =
+ (pci_config_get16(state->ts_pcih, PCI_CONF_VENID) << 16) |
+ pci_config_get16(state->ts_pcih, PCI_CONF_DEVID);
+ state->ts_revid = pci_config_get8(state->ts_pcih, PCI_CONF_REVID);
+
+ if (ddi_regs_map_setup(dip, TS_MEM_MAPPED_REGS,
+ (caddr_t *)&state->ts_regs, 0, 0, &ts_regs_attr, &state->ts_acch) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "unable to map PCI device registers");
+ return (DDI_FAILURE);
+ }
+
+ switch (state->ts_devid) {
+ case 0x10b95451:
+ name = "ALI M5451";
+ break;
+ default:
+ name = "audiots";
+ break;
+ }
+ (void) snprintf(rev, sizeof (rev), "Rev %x", state->ts_revid);
+ audio_dev_set_description(state->ts_adev, name);
+ audio_dev_set_version(state->ts_adev, rev);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls should always succeed.
+ *
+ * NOTE: ddi_dma_alloc_handle() attempts to use the full 4 GB DMA address
+ * range. This is to work around Southbridge rev E/G OBP issues.
+ * (See Grover OBP note above)
+ *
+ * CAUTION: Make sure all errors call audio_dev_warn().
+ *
+ * Arguments:
+ * audiots_port_t *state The port structure for a device stream
+ * int num The port number
+ *
+ * Returns:
+ * DDI_SUCCESS DMA resources mapped
+ * DDI_FAILURE DMA resources not successfully mapped
+ */
+int
+audiots_alloc_port(audiots_state_t *state, int num)
+{
+ audiots_port_t *port;
+ dev_info_t *dip = state->ts_dip;
+ audio_dev_t *adev = state->ts_adev;
+ char *prop;
+ int dir;
+ unsigned caps;
+ ddi_dma_cookie_t cookie;
+ unsigned count;
+ int rc;
+ ddi_acc_handle_t regsh = state->ts_acch;
+ uint32_t *gcptr = &state->ts_regs->aud_regs.ap_cir_gc;
+ char *namestr;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ state->ts_ports[num] = port;
+ port->tp_num = num;
+ port->tp_state = state;
+ port->tp_started = B_FALSE;
+ port->tp_rate = 48000;
+
+ if (num == TS_INPUT_PORT) {
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->tp_dma_stream = 31;
+ port->tp_int_stream = 2;
+ port->tp_sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ } else {
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->tp_dma_stream = 0;
+ port->tp_int_stream = 1;
+ port->tp_sync_dir = DDI_DMA_SYNC_FORDEV;
+ }
+ port->tp_int_mask = (1U << port->tp_int_stream);
+ port->tp_dma_mask = (1U << port->tp_dma_stream);
+
+ /* get the number of interrupts per second */
+ port->tp_intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, TS_INTS);
+
+ /* make sure the values are good */
+ if (port->tp_intrs < TS_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->tp_intrs, TS_INTS);
+ port->tp_intrs = TS_INTS;
+ } else if (port->tp_intrs > TS_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->tp_intrs, TS_INTS);
+ port->tp_intrs = TS_INTS;
+ }
+
+ /*
+ * Now allocate space. We configure for the worst case. The
+ * worst (biggest) case is 48000 kHz, at 4 bytes per frame
+ * (16-bit stereo), with the lowest interrupt frequency. We
+ * need two fragments though, and each half has to be rounded
+ * up to allow for alignment considerations.
+ */
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
+ NULL, &port->tp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->tp_dmah, TS_BUFSZ, &ts_acc_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->tp_kaddr,
+ &port->tp_size, &port->tp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->tp_dmah, NULL,
+ port->tp_kaddr, port->tp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if (rc != DDI_DMA_MAPPED) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ ASSERT(count == 1);
+
+ port->tp_paddr = cookie.dmac_address;
+ if ((unsigned)port->tp_paddr & 0x80000000U) {
+ ddi_put32(regsh, gcptr,
+ ddi_get32(regsh, gcptr) | AP_CIR_GC_SYS_MEM_4G_ENABLE);
+ } else {
+ ddi_put32(regsh, gcptr,
+ ddi_get32(regsh, gcptr) & ~(AP_CIR_GC_SYS_MEM_4G_ENABLE));
+ }
+ port->tp_engine = audio_engine_alloc(&audiots_engine_ops, caps);
+ if (port->tp_engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->tp_engine, port);
+ audio_dev_add_engine(adev, port->tp_engine);
+
+ state->ts_swapped = B_FALSE;
+
+ /*
+ * SPARCLE platform specific hack. For reasons that I can't
+ * seem to fathom, the SPARCLE platform only gets the
+ * endianness correct when transferring whole 32-bit words and
+ * using little endian mapping. That isn't compatible with
+ * the audio framework's access mode, so we have to set up
+ * explicit swapping of the left and right channels.
+ *
+ * The real mystery here is why this is required for Tadpole
+ * SPARCLE, but not for any other standard Sun platforms that
+ * I've tested.
+ *
+ * "swap_channels" property can be used in driver.conf to
+ * force the left/right as well.
+ */
+ rc = ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(), 0,
+ "name", &namestr);
+ if (rc == DDI_PROP_SUCCESS) {
+ if (strcmp(namestr, "TAD,SPARCLE") == 0) {
+ state->ts_swapped = B_TRUE;
+ }
+ ddi_prop_free(namestr);
+ }
+
+ state->ts_swapped = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, "swap_channels",
+ state->ts_swapped);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_read_ac97()
+ *
+ * Description:
+ * This routine actually reads the AC-97 Codec's register. It may
+ * be called several times to succeed.
+ *
+ * NOTE:
+ * Revision M1535D B1-C of the ALI SouthBridge includes a workaround for
+ * the broken busy flag. Resetting the busy flag requires a software tweak
+ * to go with the worked around hardware. When we detect failure, we make
+ * 10 attempts to reset the chip before we fail. This should reset the new
+ * SB systems. On all SB systems, this will increse the read delay
+ * slightly, but shouldn't bother it otherwise.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ *
+ * Returns:
+ * unsigned short The value in the specified register
+ */
+static uint16_t
+audiots_read_ac97(audiots_state_t *state, int reg)
+{
+ ddi_acc_handle_t acch = state->ts_acch;
+ uint16_t *addr;
+ uint16_t *data;
+ uint32_t *stimer = &state->ts_regs->aud_regs.ap_stimer;
+ uint32_t chk1;
+ uint32_t chk2;
+ int resets = 0;
+ int i;
+
+ if (state->ts_revid == AC_REV_ID1) {
+ addr = &state->ts_regs->aud_regs.ap_acrd_35D_reg;
+ data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
+ } else {
+ addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
+ data = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ }
+
+first_read:
+ /* wait for ready to send read request */
+ for (i = 0; i < TS_READ_TRIES; i++) {
+ if (!(ddi_get16(acch, addr) & AP_ACRD_R_READ_BUSY)) {
+ break;
+ }
+ /* don't beat on the bus */
+ drv_usecwait(1);
+ }
+ if (i >= TS_READ_TRIES) {
+ if (resets < TS_RESET_TRIES) {
+ /* Attempt to reset */
+ drv_usecwait(TS_20US);
+ ddi_put16(acch, addr, TS_SB_RESET);
+ resets++;
+ goto first_read;
+ } else {
+ state->ts_flags |= TS_AUDIO_READ_FAILED;
+ if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
+ "Unable to communicate with AC97 CODEC");
+ audio_dev_warn(state->ts_adev,
+ "The audio AC97 register has timed out.");
+ audio_dev_warn(state->ts_adev,
+ "Audio is now disabled.");
+ audio_dev_warn(state->ts_adev,
+ "Please reboot to restore audio.");
+
+ /* Don't flood the console */
+ state->ts_flags |= TS_READ_FAILURE_PRINTED;
+ }
+ }
+ return (0);
+ }
+
+ /* program the register to read */
+ ddi_put16(acch, addr, (reg|AP_ACRD_W_PRIMARY_CODEC|
+ AP_ACRD_W_READ_MIXER_REG|AP_ACRD_W_AUDIO_READ_REQ&
+ (~AP_ACWR_W_SELECT_WRITE)));
+
+ /* hardware bug work around */
+ chk1 = ddi_get32(acch, stimer);
+ chk2 = ddi_get32(acch, stimer);
+ i = TS_WAIT_CNT;
+ while (chk1 == chk2 && i) {
+ chk2 = ddi_get32(acch, stimer);
+ i--;
+ }
+ OR_SET_SHORT(acch, addr, AP_ACRD_W_READ_MIXER_REG);
+ resets = 0;
+
+second_read:
+ /* wait again for read to send read request */
+ for (i = 0; i < TS_READ_TRIES; i++) {
+ if (!(ddi_get16(acch, addr) & AP_ACRD_R_READ_BUSY)) {
+ break;
+ }
+ /* don't beat on the bus */
+ drv_usecwait(1);
+ }
+ if (i >= TS_READ_TRIES) {
+ if (resets < TS_RESET_TRIES) {
+ /* Attempt to reset */
+ drv_usecwait(TS_20US);
+ ddi_put16(acch, addr, TS_SB_RESET);
+ resets++;
+ goto second_read;
+ } else {
+ state->ts_flags |= TS_AUDIO_READ_FAILED;
+ if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
+ "Unable to communicate with AC97 CODEC");
+ audio_dev_warn(state->ts_adev,
+ "The audio AC97 register has timed out.");
+ audio_dev_warn(state->ts_adev,
+ "Audio is now disabled.");
+ audio_dev_warn(state->ts_adev,
+ "Please reboot to restore audio.");
+
+ /* Don't flood the console */
+ state->ts_flags |= TS_READ_FAILURE_PRINTED;
+ }
+ }
+ return (0);
+ }
+
+ return (ddi_get16(acch, data));
+
+} /* audiots_read_ac97() */
+
+/*
+ * audiots_set_ac97()
+ *
+ * Description:
+ * Set the value in the specified AC-97 Codec register. Just like
+ * reading the AC-97 Codec, it is possible there is a problem writing
+ * it as well. So we loop.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ * uint16_t value The value to write
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_set_ac97(void *arg, uint8_t reg8, uint16_t data)
+{
+ audiots_state_t *state = arg;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint16_t *data_addr = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ uint16_t *reg_addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
+ int count;
+ int i;
+ uint16_t tmp_short;
+ uint16_t reg = reg8;
+
+ reg &= AP_ACWR_INDEX_MASK;
+
+ /* Don't touch the reserved bits on the pre 35D+ SouthBridge */
+ if (state->ts_revid == AC_REV_ID1) {
+ reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG;
+ } else {
+ reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG|
+ AP_ACWR_W_SELECT_WRITE;
+ }
+
+ for (count = TS_LOOP_CNT; count--; ) {
+ /* wait for ready to write */
+ for (i = 0; i < TS_WAIT_CNT; i++) {
+ if (!(ddi_get16(handle, reg_addr) &
+ AP_ACWR_R_WRITE_BUSY)) {
+ /* ready to write */
+ ddi_put16(handle, reg_addr, reg);
+
+ /* Write the data */
+ ddi_put16(handle, data_addr, data);
+ break;
+ }
+ }
+ if (i >= TS_WAIT_CNT) {
+ /* try again */
+ continue;
+ }
+
+ /* wait for write to complete */
+ for (i = 0; i < TS_WAIT_CNT; i++) {
+ if (!(ddi_get16(handle, reg_addr) &
+ AP_ACWR_R_WRITE_BUSY)) {
+ /* done writing */
+ break;
+ }
+ }
+
+ /* verify the value written */
+ tmp_short = audiots_get_ac97(state, reg8);
+ if (data == tmp_short) {
+ /* successfully loaded, so we can return */
+ return;
+ }
+ }
+
+} /* audiots_set_ac97() */
+
+/*
+ * audiots_reset_port()
+ *
+ * Description:
+ * Initializes the hardware for a DMA engine.
+ * We only support stereo 16-bit linear PCM (signed native endian).
+ *
+ * The audio core uses a single DMA buffer which is divided into two
+ * halves. An interrupt is generated when the middle of the buffer has
+ * been reached and at the end. The audio core resets the pointer back
+ * to the beginning automatically. After the interrupt the driver clears
+ * the buffer and asks the mixer for more audio samples. If there aren't
+ * enough then silence is played out.
+ *
+ * Arguments:
+ * audiots_port_t *port The DMA engine to reset
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_reset_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+ ddi_acc_handle_t handle = state->ts_acch;
+ audiots_regs_t *regs = state->ts_regs;
+ audiots_aram_t *aram;
+ audiots_eram_t *eram;
+ unsigned delta;
+ uint16_t ctrl;
+ uint16_t gvsel;
+ uint16_t eso;
+
+ if (state->ts_suspended)
+ return;
+
+ port->tp_cso = 0;
+
+ gvsel = ERAM_WAVE_VOL | ERAM_PAN_0dB | ERAM_VOL_DEFAULT;
+ ctrl = ERAM_16_BITS | ERAM_STEREO | ERAM_LOOP_MODE | ERAM_SIGNED_PCM;
+ for (int i = 0; i < 2; i++) {
+
+ delta = (port->tp_rate << TS_SRC_SHIFT) / TS_RATE;
+
+ if (i == 0) {
+ /* first do the DMA stream */
+ aram = &regs->aud_ram[port->tp_dma_stream].aram;
+ eram = &regs->aud_ram[port->tp_dma_stream].eram;
+ if (port->tp_num == TS_INPUT_PORT) {
+ delta = (TS_RATE << TS_SRC_SHIFT) /
+ port->tp_rate;
+ }
+ eso = port->tp_nframes - 1;
+ } else {
+ /* else do the interrupt stream */
+ aram = &regs->aud_ram[port->tp_int_stream].aram;
+ eram = &regs->aud_ram[port->tp_int_stream].eram;
+ /* interrupt stream is silent */
+ gvsel |= ERAM_VOL_MAX_ATTEN;
+ eso = port->tp_fragfr - 1;
+ }
+
+ /* program the sample rate */
+ ddi_put16(handle, &aram->aram_delta, (uint16_t)delta);
+
+ /* program the precision, number of channels and loop mode */
+ ddi_put16(handle, &eram->eram_ctrl_ec, ctrl);
+
+ /* program the volume settings */
+ ddi_put16(handle, &eram->eram_gvsel_pan_vol, gvsel);
+
+ /* set ALPHA and FMS to 0 */
+ ddi_put16(handle, &aram->aram_alpha_fms, 0x0);
+
+ /* set CSO to 0 */
+ ddi_put16(handle, &aram->aram_cso, 0x0);
+
+ /* set LBA */
+ ddi_put32(handle, &aram->aram_cptr_lba,
+ port->tp_paddr & ARAM_LBA_MASK);
+
+ /* set ESO */
+ ddi_put16(handle, &aram->aram_eso, eso);
+ }
+
+ /* stop the DMA & interrupt engines */
+ ddi_put32(handle, &regs->aud_regs.ap_stop,
+ port->tp_int_mask | port->tp_dma_mask);
+
+ /* enable interrupts */
+ OR_SET_WORD(handle, &regs->aud_regs.ap_ainten, port->tp_int_mask);
+}
+
+/*
+ * audiots_open()
+ *
+ * Description:
+ * Opens a DMA engine for use. Will also ensure the device is powered
+ * up if not already done so.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audiots_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audiots_port_t *port = arg;
+ unsigned nfrag;
+
+ _NOTE(ARGUNUSED(flag));
+
+ /*
+ * Round up - we have to have a sample that is a whole number
+ * of 64-bit words. Since our frames are 4 bytes wide, we
+ * just need an even number of frames.
+ */
+ port->tp_fragfr = port->tp_rate / port->tp_intrs;
+ port->tp_fragfr = (port->tp_fragfr + 1) & ~1;
+ nfrag = port->tp_size / (port->tp_fragfr * TS_FRAMESZ);
+ port->tp_nframes = nfrag * port->tp_fragfr;
+ port->tp_started = B_FALSE;
+ port->tp_count = 0;
+ port->tp_cso = 0;
+ *fragfrp = port->tp_fragfr;
+ *nfragsp = nfrag;
+ *bufp = port->tp_kaddr;
+
+ /*
+ * This should always be true because we used a worst case
+ * assumption when calculating the port->tp_size.
+ */
+ ASSERT((port->tp_fragfr * nfrag) <= port->tp_size);
+
+ mutex_enter(&port->tp_state->ts_lock);
+ audiots_reset_port(port);
+ mutex_exit(&port->tp_state->ts_lock);
+
+ return (0);
+}
+
+/*
+ * audiots_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_close(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ audiots_stop_port(port);
+ port->tp_started = B_FALSE;
+ mutex_exit(&state->ts_lock);
+}
+
+/*
+ * audiots_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ if (port->tp_started) {
+ audiots_stop_port(port);
+ }
+ port->tp_started = B_FALSE;
+ mutex_exit(&state->ts_lock);
+}
+
+/*
+ * audiots_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audiots_start(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ if (!port->tp_started) {
+ audiots_start_port(port);
+ port->tp_started = B_TRUE;
+ }
+ mutex_exit(&state->ts_lock);
+ return (0);
+}
+
+/*
+ * audiots_chinfo()
+ *
+ * Description:
+ * This is called by the framework to query the channel offsets
+ * and ordering.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ * int chan Channel number.
+ * unsigned *offset Starting offset of channel.
+ * unsigned *incr Increment (in samples) between frames.
+ *
+ * Returns:
+ * 0 indicating rate array is range instead of enumeration
+ */
+
+static void
+audiots_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr)
+{
+ audiots_port_t *port = arg;
+
+ /* if channels are swapped (SPARCLE), then deal with it */
+ if (port->tp_state->ts_swapped) {
+ *offset = (chan ? 0 : 1);
+ } else {
+ *offset = chan;
+ }
+ *incr = 2;
+}
+
+/*
+ * audiots_format()
+ *
+ * Description:
+ * Called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE.
+ */
+static int
+audiots_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+
+/*
+ * audiots_channels()
+ *
+ * Description:
+ * Called by the framework to query the channnels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 2 (Stereo).
+ */
+static int
+audiots_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (2);
+}
+
+/*
+ * audiots_rate()
+ *
+ * Description:
+ * Called by the framework to query the sample rates for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Sample rate in HZ (always 48000).
+ */
+static int
+audiots_rate(void *arg)
+{
+ audiots_port_t *port = arg;
+
+ return (port->tp_rate);
+}
+
+/*
+ * audiots_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audiots_count(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+ uint64_t val;
+
+ mutex_enter(&state->ts_lock);
+ audiots_update_port(port);
+
+ val = port->tp_count;
+ mutex_exit(&state->ts_lock);
+ return (val);
+}
+
+/*
+ * audiots_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ * We also leverage this do some endian swapping, because on SPARC
+ * the chip accesses the DMA region using 32-bit little-endian
+ * accesses. Its not enough to just use the framework's sample
+ * conversion logic, because the channels will also be backwards.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_sync(void *arg, unsigned nframes)
+{
+ audiots_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->tp_dmah, 0, 0, port->tp_sync_dir);
+}
+
+/*
+ * audiots_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audiots_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+/*
+ * audiots_start_port()
+ *
+ * Description:
+ * The audio core uses a single DMA buffer which is divided into two
+ * halves. An interrupt is generated when the middle of the buffer has
+ * been reached and at the end. The audio core resets the pointer back
+ * to the beginning automatically. After the interrupt the driver clears
+ * the buffer and asks the mixer for more audio samples. If there aren't
+ * enough then silence is played out.
+ *
+ * Arguments:
+ * audiots_port_t *port The DMA engine to start up
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_start_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+ audiots_regs_t *regs = state->ts_regs;
+ ddi_acc_handle_t handle = state->ts_acch;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ /* if suspended then do nothing else */
+ if (state->ts_suspended) {
+ return;
+ }
+
+ /* make sure it starts playing */
+ ddi_put32(handle, &regs->aud_regs.ap_start,
+ port->tp_dma_mask | port->tp_int_mask);
+
+ ASSERT(mutex_owned(&state->ts_lock));
+}
+
+/*
+ * audiots_stop_port()
+ *
+ * Description:
+ * This routine stops a DMA engine.
+ *
+ * Arguments:
+ * audiots_port_t *port The port to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ if (state->ts_suspended)
+ return;
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_stop,
+ port->tp_int_mask | port->tp_dma_mask);
+
+ ASSERT(mutex_owned(&state->ts_lock));
+}
+
+/*
+ * audiots_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audiots_port_t *port The port to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_update_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+
+ uint16_t cso;
+ unsigned n;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ if (state->ts_suspended)
+ return;
+
+ cso = ddi_get16(state->ts_acch,
+ &state->ts_regs->aud_ram[port->tp_dma_stream].aram.aram_cso);
+
+ n = (cso >= port->tp_cso) ?
+ cso - port->tp_cso :
+ cso + port->tp_nframes - port->tp_cso;
+
+ port->tp_cso = cso;
+ port->tp_count += n;
+}
+
+/*
+ * audiots_stop_everything()
+ *
+ * Description:
+ * This routine disables the address engine interrupt for all 32 DMA
+ * engines. Just to be sure, it then explicitly issues a stop command to
+ * the address engine and envelope engines for all 32 channels.
+ *
+ * NOTE:
+ *
+ * There is a hardware bug that generates a spurious interrupt
+ * when the DMA engines are stopped. It's not consistent - it
+ * happens every 1 out of 6 stops or so. It will show up as a
+ * record interrupt. The problem is that once the driver is
+ * detached or if the system goes into low power mode, nobody
+ * will service that interrupt. The system will eventually become
+ * unusable.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop_everything(audiots_state_t *state)
+{
+ if (state->ts_acch == NULL)
+ return;
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_ainten,
+ TS_ALL_DMA_OFF);
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_stop,
+ TS_ALL_DMA_ENGINES);
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_aint,
+ TS_ALL_DMA_ENGINES);
+}
+
+/*
+ * audiots_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audiots_port_t *port The port structure for a device stream.
+ *
+ * Returns:
+ * None
+ */
+void
+audiots_free_port(audiots_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->tp_engine) {
+ audio_dev_remove_engine(port->tp_state->ts_adev,
+ port->tp_engine);
+ audio_engine_free(port->tp_engine);
+ }
+ if (port->tp_paddr) {
+ (void) ddi_dma_unbind_handle(port->tp_dmah);
+ }
+ if (port->tp_acch) {
+ ddi_dma_mem_free(&port->tp_acch);
+ }
+ if (port->tp_dmah) {
+ ddi_dma_free_handle(&port->tp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audiots_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audiots_state_t *state The device soft state.
+ *
+ * Returns:
+ * None
+ */
+void
+audiots_destroy(audiots_state_t *state)
+{
+ audiots_stop_everything(state);
+
+ if (state->ts_flags & TS_INTR_INSTALLED)
+ ddi_remove_intr(state->ts_dip, 0, NULL);
+
+ if (state->ts_ksp)
+ kstat_delete(state->ts_ksp);
+
+ for (int i = 0; i < TS_NUM_PORTS; i++)
+ audiots_free_port(state->ts_ports[i]);
+
+ if (state->ts_acch)
+ ddi_regs_map_free(&state->ts_acch);
+
+ if (state->ts_pcih)
+ pci_config_teardown(&state->ts_pcih);
+
+ if (state->ts_ac97)
+ ac97_free(state->ts_ac97);
+
+ if (state->ts_adev)
+ audio_dev_free(state->ts_adev);
+
+ if (state->ts_flags & TS_MUTEX_INIT) {
+ mutex_destroy(&state->ts_lock);
+ }
+
+ ddi_soft_state_free(audiots_statep, ddi_get_instance(state->ts_dip));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf b/usr/src/uts/common/io/audio/drv/audiots/audiots.conf
index 09bb31c4f3..598c38c531 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2000-2002 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audiots audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -55,12 +43,10 @@ mixer-mode=1;
# boundaries. If those boundaries are violated the driver will not be
# loaded and an error message is entered into the messages log
#
-play-interrupts=175;
-record-interrupts=175;
+#play-interrupts=175;
+#record-interrupts=175;
#
-# Uncomment reset-configuration to cause the audiots driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
+# ac97-amplifier enables the use of any onboard external amplifier.
#
-#reset-configuration=1;
+#ac97-amplifier=1;
diff --git a/usr/src/uts/common/sys/audio/impl/audiots_impl.h b/usr/src/uts/common/io/audio/drv/audiots/audiots.h
index 1723ad89b7..f239e8f608 100644
--- a/usr/src/uts/common/sys/audio/impl/audiots_impl.h
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,134 +19,83 @@
* CDDL HEADER END
*/
/*
- * Copyright 2000-2003 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#ifndef _SYS_AUDIOTS_IMPL_H
-#define _SYS_AUDIOTS_IMPL_H
+#ifndef _AUDIOTS_H
+#define _AUDIOTS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Header file for the audiots device driver.
+ */
-#ifdef __cplusplus
-extern "C" {
-#endif
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define TS_DEV_NAME "SUNW,audiots"
+#define TS_DEV_CONFIG "onboard1"
+#define TS_DEV_VERSION_A "a" /* grover, sngl strming play */
+#define TS_DEV_VERSION_B "b" /* birdsnest, sngl strm play */
/*
- * Implementation specific header file for the audiots device driver.
+ * Driver supported configuration information
*/
+#define TS_NAME "audiots"
+#define TS_MOD_NAME "audiots audio driver"
-#ifdef _KERNEL
+#define TS_RATE (48000)
+#define TS_STEREO (2) /* stereo */
+#define TS_FRAMESZ (4) /* 16-bit stereo */
+/*
+ * This is how much buffer space we at minimum need. The worst
+ * (biggest) case is 48000 kHz, at 4 bytes per frame (16-bit stereo),
+ * with the lowest interrupt frequency. 48000 x 4 bytes per sample /
+ * 24 is 8000 bytes per fragment. Two such fragments would be 16000.
+ * (At higher data rates, we get better buffering, with more frags.)
+ */
+#define TS_BUFSZ (16000) /* maximum buffer size */
+#define TS_INTS (175) /* default interrupt rate */
+#define TS_MIN_INTS (24) /* minimum interrupt rate */
+#define TS_MAX_INTS (2000) /* maximum interrupt rate */
/*
* Misc. defines
*/
-#define TS_CONFIG_REGS (0)
#define TS_IO_MAPPED_REGS (1)
#define TS_MEM_MAPPED_REGS (2)
#define TS_ALL_DMA_ENGINES (0xffffffff)
#define TS_ALL_DMA_OFF (0x00000000)
-#define TS_IDNUM (0x6175)
-#define TS_MINPACKET (0)
-#define TS_MAXPACKET (1*1024)
-#define TS_HIWATER (64*1024)
-#define TS_LOWATER (32*1024)
-
-#define TS_BSIZE (8*1024)
#define TS_20MS (20000) /* 20,000 microseconds */
#define TS_20US (20) /* 20 microseconds */
-#define TS_GAIN_SHIFT3 (3) /* 5 significan bits */
-#define TS_GAIN_SHIFT4 (4) /* 4 significan bits */
-#define TS_BYTE_SHIFT (8)
-#define TS_LAST_AC_REG (0x23)
-#define TS_REG_SIZE (2)
-#define TS_MOD_SIZE (16)
-#define TS_BUF_HALVES (2)
-#define TS_1ST_HALF (0)
-#define TS_2ND_HALF (1)
#define TS_SRC_SHIFT (12)
-#define TS_NOT_SUSPENDED (0)
-#define TS_SUSPENDED (~TS_NOT_SUSPENDED)
-#define TS_VENDOR_ID1_MASK (0x0000ffff);
-#define TS_PORT_MASK (0x0ff)
-#define TS_MAX_CHANNELS (200) /* force max # chs */
+#define TS_NUM_PORTS (2)
+#define TS_OUTPUT_PORT (0)
+#define TS_INPUT_PORT (1)
+
#define TS_MAX_HW_CHANNELS (32)
-#define TS_MAX_IN_CHANNELS 1
-#define TS_MAX_OUT_CHANNELS (TS_MAX_HW_CHANNELS - TS_MAX_IN_CHANNELS)
-#define TS_INPUT_STREAM (31)
-#define TS_INPUT_CHANNEL_MASK (0x80000000u)
-#define TS_INPUT_CHANNEL (TS_INPUT_CHANNEL_MASK)
-#define TS_OUTPUT_STREAM (0)
-#define TS_OUTPUT_CHANNEL (0x00000001u)
-#define TS_CH_ARRAY_SZIE (TS_MAX_HW_CHANNELS * sizeof (int))
-#define TS_COMPONENT (0)
-#define TS_PWR_OFF (0)
-#define TS_PWR_ON (1)
-#define TS_NO_PWR_MANAGE (0)
-#define TS_PWR_MANAGE (1)
-#define TS_NORMAL_POWER (1)
+
#define TS_KIOP(X) ((kstat_intr_t *)(X->ts_ksp->ks_data))
#define TS_WAIT_CNT (512)
#define TS_LOOP_CNT (10)
#define TS_DELAY_CNT (25)
-#define TS_INIT_RESTORE (0)
-#define TS_INIT_NO_RESTORE ~TS_INIT_RESTORE
#define TS_CODEC_REG(r) ((r) >> 1)
-#define TS_PORT_UNMUTE (0xffffffff)
-#define TS_AC97_ATTEN_HP (0x1818)
-#define TS_AC97_ATTEN_LINE (0x0404)
-#define TS_AC97_ATTEN_SPKR (0x0001)
-#define TS_FIFO_SIZE (8)
/* ALI Hacks */
#define TS_READ_TRIES (TS_WAIT_CNT/10)
#define TS_RESET_TRIES (16)
#define TS_SB_RESET (0x7fff)
-
-/*
- * audiots_config_t - Config space registers
- */
-struct audiots_config {
- uint16_t tsc_vendor_id; /* 00h - 01h */
- uint16_t tsc_device_id; /* 02h - 03h */
- uint16_t tsc_command; /* 04h - 05h */
- uint16_t tsc_status; /* 06h - 07h */
- uint32_t tsc_class_code_rev_id; /* 08h - 0bh */
- uint32_t tsc_bist_cache; /* 0ch - 0fh */
- uint32_t tsc_audio_io_base; /* 10h - 13h */
- uint32_t tsc_audio_mem_base; /* 14h - 17h */
- uint32_t tsc_rsvd1[5]; /* 18h - 2bh */
- uint32_t tsc_sub_ids; /* 2ch - 2fh */
- uint32_t tsc_rsvd2; /* 30h - 33h */
- uint16_t tsc_cap_ptr; /* 34h - 35h */
- uint16_t tsc_rsvd3; /* 36h - 37h */
- uint32_t tsc_rsvd4; /* 38h - 3bh */
- uint32_t tsc_compat1; /* 3ch - 3fh */
- uint32_t tsc_ddma_slave; /* 40h - 43h */
- uint32_t tsc_compat2; /* 44h - 47h */
- uint32_t tsc_compat3; /* 48h - 4bh */
- uint32_t tsc_rsvd5[36]; /* 4ch - dbh */
- uint16_t tsc_pm_id_next_ptr; /* dch - ddh */
- uint16_t tsc_pmc; /* deh - dfh */
- uint16_t tsc_pmcsr; /* e0h - e1h */
- uint16_t tsc_pmcsr_bse_base; /* e2h - e3h */
- uint32_t tsc_rsvd6[7]; /* e4h - ffh */
-};
-typedef struct audiots_config audiots_config_t;
+/* These are the devices we know about */
+#define TS_DEVICE_ALI_M5451 ((0x10b9 << 16) | (0x5451))
+#define TS_DEVICE_TRIDENT_4DWAVEDX ((0x1023 << 16) | (0x2000))
+#define TS_DEVICE_TRIDENT_4DWAVENX ((0x1023 << 16) | (0x2001))
+#define TS_DEVICE_SIS_7018 ((0x1039 << 16) | (0x7018))
#define TS_AD_CODEC_ID 0x4144
#define TS_AD_REV_ID 0x5340
-#define TS_CONFIG_VENDOR_ID 0x10b9
-#define TS_CONFIG_DEVICE_ID 0x5451
-#define TS_CONFIG_SUBSYSTEM_VENDOR_ID 0x10b9
-#define TS_CONFIG_SUBSYSTEM_ID 0x5451
-#define TRI_CONFIG_VENDOR_ID 0x1023
-#define TRI_CONFIG_DEVICE_ID 0x2000
-#define TRI_CONFIG_SUBSYSTEM_VENDOR_ID 0x1023
-#define TRI_CONFIG_SUBSYSTEM_ID 0x2000
#define AC_REV_ID1 0x0001
#define AC_REV_ID2 0x0002
@@ -377,6 +325,7 @@ typedef struct audiots_processor audiots_processor_t;
#define AP_CIR_GC_MIDLP_IE 0x00002000
#define AP_CIR_GC_ETOG_IE 0x00004000
#define AP_CIR_GC_EDROP_IE 0x00008000
+#define AP_CIR_GC_SYS_MEM_4G_ENABLE 0x00010000
#define AP_CIR_GC_PCM_FIFO 0x00000000
#define AP_CIR_GC_MMC_BUFFER 0x00100000
#define AP_CIR_GC_NORMAL_MODE 0x00000000
@@ -485,90 +434,74 @@ typedef struct audiots_regs audiots_regs_t;
/*
* audiots_save_regs_t - Saved audio controller registers.
*/
-struct audiots_save_regs {
- uint16_t aram_delta;
- uint16_t eram_ctrl_ec;
+
+struct audiots_port {
+ struct audiots_state *tp_state;
+ int tp_num;
+ int tp_dma_stream;
+ int tp_int_stream;
+
+ uint32_t tp_dma_mask;
+ uint32_t tp_int_mask;
+
+ boolean_t tp_started;
+ unsigned tp_intrs;
+ unsigned tp_fragfr;
+ unsigned tp_nframes;
+ unsigned tp_rate;
+ uint64_t tp_count;
+ size_t tp_size;
+ caddr_t tp_kaddr;
+ uint32_t tp_paddr;
+ ddi_dma_handle_t tp_dmah;
+ ddi_acc_handle_t tp_acch;
+ unsigned tp_sync_dir;
+
+ audio_engine_t *tp_engine;
+ /* counting cso */
+ uint16_t tp_cso;
};
-typedef struct audiots_save_regs audiots_save_regs_t;
+typedef struct audiots_port audiots_port_t;
/*
* audiots_state_t - per instance state and operation data
*/
struct audiots_state {
kmutex_t ts_lock; /* state protection lock */
- kcondvar_t ts_cv; /* suspend/resume cond. var. */
ddi_iblock_cookie_t ts_iblock; /* iblock cookie */
uint_t ts_flags; /* flags */
kstat_t *ts_ksp; /* kernel statistics */
dev_info_t *ts_dip; /* used by ts_getinfo() */
- audiohdl_t ts_ahandle; /* audio handle */
- audio_info_t ts_defaults; /* default state for the dev */
- am_ad_info_t ts_ad_info; /* audio device info state */
- audiots_config_t *ts_config; /* configuration registers */
+ audio_dev_t *ts_adev; /* audio device handle */
+ ac97_t *ts_ac97; /* ac97 common handle */
audiots_regs_t *ts_regs; /* memory mapped registers */
- audiots_save_regs_t ts_save_regs[TS_MAX_HW_CHANNELS];
- /* saved controller regs */
- ddi_acc_handle_t ts_chandle; /* handle to config regs */
- ddi_acc_handle_t ts_handle; /* handle to mapped regs */
- audio_device_t ts_dev_info; /* device info strings */
- int ts_instance; /* device instance */
- uint16_t ts_shadow[64]; /* ac97 shadow registers */
- boolean_t ts_pm_core; /* power manage audio core? */
- int ts_suspended; /* power management state */
- int ts_powered; /* device powered up? */
- int ts_busy_cnt; /* device busy count */
- ddi_dma_attr_t *ts_dma_attr; /* DMA attributes */
- ddi_dma_handle_t ts_ph; /* play DMA handles */
- ddi_dma_handle_t ts_ch; /* capture DMA handles */
- ddi_dma_cookie_t ts_pc; /* play DMA cookies */
- ddi_dma_cookie_t ts_cc; /* capture DMA cookies */
- ddi_acc_handle_t ts_pmh; /* play DMA memory handles */
- ddi_acc_handle_t ts_cmh; /* capture DMA memory handles */
- size_t ts_pbuf_size; /* size of play buffer */
- size_t ts_pml; /* play DMA memory length */
- size_t ts_cbuf_size; /* size of capture buffer */
- size_t ts_cml; /* capture DMA memory length */
- caddr_t ts_pb; /* play DMA buffers */
- caddr_t ts_cb; /* capture DMA buffers */
- uint16_t *ts_tcbuf; /* temp capture buffer */
- int ts_pcnt[2]; /* play count, in bytes */
- int ts_ccnt; /* capture count, in bytes */
- int ts_psamples[2]; /* play samples */
- uint_t ts_output_muted; /* output muted */
- uint_t ts_psample_rate; /* play sample rate */
- uint_t ts_pchannels; /* play channels */
- uint_t ts_pprecision; /* play precision */
- uint_t ts_csample_rate; /* capture sample rate */
- uint_t ts_cchannels; /* capture channels */
- uint_t ts_cprecision; /* capture precision */
- uint_t ts_output_port; /* current output port */
- uint_t ts_input_port; /* current input port */
- uint16_t ts_monitor_gain; /* monitor gain */
- int ts_rev_id; /* SB Chip Revision ID */
+ audiots_port_t *ts_ports[TS_NUM_PORTS];
+ /* hardware engines */
+
+ ddi_acc_handle_t ts_pcih; /* handle to config regs */
+ ddi_acc_handle_t ts_acch; /* handle to mapped regs */
+ boolean_t ts_suspended; /* power management state */
+ boolean_t ts_swapped; /* swapped left/right? */
+
+ uint32_t ts_devid;
+ uint8_t ts_revid; /* SB Chip Revision ID */
+
};
typedef struct audiots_state audiots_state_t;
_NOTE(MUTEX_PROTECTS_DATA(audiots_state::ts_lock, audiots_state))
_NOTE(READ_ONLY_DATA(audiots_state::ts_instance))
_NOTE(READ_ONLY_DATA(audiots_state::ts_dip))
-_NOTE(READ_ONLY_DATA(audiots_state::ts_ahandle))
+_NOTE(READ_ONLY_DATA(audiots_state::ts_adev))
/* audiots_state.ts_flags defines */
-#define TS_DMA_ENGINE_INITIALIZED 0x0001u /* play DMA eng. initialized */
-#define TS_DMA_ENGINE_PAUSED 0x0002u /* play DMA engine paused */
-#define TS_DMA_ENGINE_EMPTY 0x0004u /* play DMA engine empty */
-#define TS_DMA_RECORD_START 0x0008u /* record DMA engine started */
-#define TS_INTR_PENDING 0x0010u /* interrupt pending at DMA */
- /* stop */
+#define TS_MUTEX_INIT 0x0001u /* mutex initialized */
+#define TS_INTR_INSTALLED 0x0002u /* intr handler installeld */
#define TS_AUDIO_READ_FAILED 0x0020u /* reading the AC97 register */
/* has stopped working */
#define TS_READ_FAILURE_PRINTED 0x0040u /* Flag to avoid flooding the */
/* console with AC97 failure */
/* messages */
-#define TS_ATTACH_PWR 0x0080u /* Power raised at */
- /* attach time */
-#define TS_PM_SUPPORTED 0x0100u /* PM supported? */
-#define TS_PLAY_ACTIVE 0x0200u /* play active, for PM */
/*
* Read and write the AC-97 Codec's registers
@@ -603,10 +536,4 @@ _NOTE(READ_ONLY_DATA(audiots_state::ts_ahandle))
ddi_put32((handle), (uint32_t *)(addr), \
(ddi_get32((handle), (uint32_t *)(addr)) & (uint32_t)(val)));
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOTS_IMPL_H */
+#endif /* _AUDIOTS_H */
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c
new file mode 100644
index 0000000000..f1b05a5a25
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c
@@ -0,0 +1,1070 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Driver for the VIA8233/8235 AC97 audio controller
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+
+#include "audiovia823x.h"
+
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_dma_attr_t dma_attr_sgd = {
+ DMA_ATTR_V0, /* version number */
+ 0x00000000, /* low DMA address range */
+ 0xffffffff, /* high DMA address range */
+ 0x0000ffff, /* DMA counter register */
+ 8, /* DMA address alignment */
+ 0x3c, /* DMA burstsizes */
+ 8, /* min effective DMA size */
+ 0xffffffff, /* max DMA xfer size */
+ 0x00000fff, /* segment boundary */
+ 1, /* s/g length */
+ 8, /* granularity of device */
+ 0 /* Bus specific DMA flags */
+};
+
+static ddi_dma_attr_t dma_attr_buf = {
+ DMA_ATTR_V0, /* version number */
+ 0x00000000, /* low DMA address range */
+ 0xffffffff, /* high DMA address range */
+ 0x0001fffe, /* DMA counter register */
+ 4, /* DMA address alignment */
+ 0x3c, /* DMA burstsizes */
+ 4, /* min effective DMA size */
+ 0x0001ffff, /* max DMA xfer size */
+ 0x0001ffff, /* segment boundary */
+ 1, /* s/g length */
+ 4, /* granularity of device */
+ 0 /* Bus specific DMA flags */
+};
+
+static int auvia_attach(dev_info_t *);
+static int auvia_resume(dev_info_t *);
+static int auvia_detach(auvia_devc_t *);
+static int auvia_suspend(auvia_devc_t *);
+
+static int auvia_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void auvia_close(void *);
+static int auvia_start(void *);
+static void auvia_stop(void *);
+static int auvia_format(void *);
+static int auvia_channels(void *);
+static int auvia_rate(void *);
+static uint64_t auvia_count(void *);
+static void auvia_sync(void *, unsigned);
+static size_t auvia_qlen(void *);
+
+static uint16_t auvia_read_ac97(void *, uint8_t);
+static void auvia_write_ac97(void *, uint8_t, uint16_t);
+static int auvia_alloc_port(auvia_devc_t *, int);
+static void auvia_start_port(auvia_portc_t *);
+static void auvia_stop_port(auvia_portc_t *);
+static void auvia_update_port(auvia_portc_t *);
+static void auvia_reset_input(auvia_portc_t *);
+static void auvia_reset_output(auvia_portc_t *);
+static void auvia_destroy(auvia_devc_t *);
+static int auvia_setup_intrs(auvia_devc_t *);
+static void auvia_hwinit(auvia_devc_t *);
+static uint_t auvia_intr(caddr_t, caddr_t);
+
+static audio_engine_ops_t auvia_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ auvia_open,
+ auvia_close,
+ auvia_start,
+ auvia_stop,
+ auvia_count,
+ auvia_format,
+ auvia_channels,
+ auvia_rate,
+ auvia_sync,
+ auvia_qlen
+};
+
+static uint16_t
+auvia_read_ac97(void *arg, uint8_t index)
+{
+ auvia_devc_t *devc = arg;
+ uint32_t val = 0;
+ int i;
+
+ mutex_enter(&devc->low_mutex);
+
+ val = ((uint32_t)index << 16) | CODEC_RD;
+ OUTL(devc, devc->base + REG_CODEC, val);
+ drv_usecwait(100);
+
+ /* Check AC CODEC access time out */
+ for (i = 0; i < CODEC_TIMEOUT_COUNT; i++) {
+
+ /* if send command over, break */
+ if (INL(devc, devc->base + REG_CODEC) & CODEC_STA_VALID)
+ break;
+ drv_usecwait(50);
+ }
+
+ if (i == CODEC_TIMEOUT_COUNT) {
+ goto failed;
+ }
+
+ /* Check if Index still ours? If yes, return data, else return FAIL */
+ val = INL(devc, devc->base + REG_CODEC);
+ OUTB(devc, devc->base + REG_CODEC + 3, 0x02);
+ if (((val & CODEC_INDEX) >> 16) == index) {
+ mutex_exit(&devc->low_mutex);
+ return (val & CODEC_DATA);
+ }
+
+failed:
+ mutex_exit(&devc->low_mutex);
+ return (0xffff);
+}
+
+static void
+auvia_write_ac97(void *arg, uint8_t index, uint16_t data)
+{
+ auvia_devc_t *devc = arg;
+ uint32_t val = 0;
+ int i = 0;
+
+ mutex_enter(&devc->low_mutex);
+
+ val = ((uint32_t)index << 16) | data | CODEC_WR;
+ OUTL(devc, devc->base + REG_CODEC, val);
+ drv_usecwait(100);
+
+ /* Check AC CODEC access time out */
+ for (i = 0; i < CODEC_TIMEOUT_COUNT; i++) {
+ /* if send command over, break */
+ if (!(INL(devc, devc->base + REG_CODEC) & CODEC_IN_CMD))
+ break;
+ drv_usecwait(50);
+ }
+
+ mutex_exit(&devc->low_mutex);
+}
+
+static uint_t
+auvia_intr(caddr_t argp, caddr_t nocare)
+{
+ auvia_devc_t *devc = (void *)argp;
+ auvia_portc_t *portc;
+ uint32_t gstat;
+ uint8_t status;
+ unsigned intrs = 0;
+
+ _NOTE(ARGUNUSED(nocare));
+
+ mutex_enter(&devc->mutex);
+ if (devc->suspended) {
+ mutex_exit(&devc->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ gstat = INL(devc, devc->base + REG_GSTAT);
+ if (gstat == 0) {
+ mutex_exit(&devc->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ portc = devc->portc[i];
+
+ status = INB(devc, portc->base + OFF_STATUS);
+ if ((status & STATUS_INTR) == 0) {
+ /* clear any other interrupts */
+ continue;
+ }
+
+ /*
+ * NB: The old code did some goofy things to update
+ * the last valid SGD. However, since we don't ever
+ * reach the last valid SGD (because we loop first), I
+ * don't believe we need to do that. It would appear
+ * that NetBSD does the same.
+ */
+ /* port interrupt */
+ if (portc->started) {
+ intrs |= (1U << i);
+ }
+ /* XXX: do we really need to do this? */
+ OUTB(devc, portc->base + OFF_STATUS, status);
+ }
+
+ OUTL(devc, devc->base + REG_GSTAT, gstat);
+
+ mutex_exit(&devc->mutex);
+ if (intrs & (1U << AUVIA_PLAY_SGD_NUM)) {
+ audio_engine_consume(devc->portc[AUVIA_PLAY_SGD_NUM]->engine);
+ }
+ if (intrs & (1U << AUVIA_REC_SGD_NUM)) {
+ audio_engine_produce(devc->portc[AUVIA_REC_SGD_NUM]->engine);
+ }
+ if (devc->ksp) {
+ AUVIA_KIOP(devc)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+
+int
+auvia_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ _NOTE(ARGUNUSED(flag));
+
+ portc->started = B_FALSE;
+ portc->count = 0;
+ *fragfrp = portc->fragfr;
+ *nfragsp = AUVIA_NUM_SGD;
+ *bufp = portc->buf_kaddr;
+
+ mutex_enter(&devc->mutex);
+ portc->reset(portc);
+ mutex_exit(&devc->mutex);
+
+ return (0);
+}
+
+void
+auvia_close(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ auvia_stop_port(portc);
+ portc->started = B_FALSE;
+ mutex_exit(&devc->mutex);
+}
+
+int
+auvia_start(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ if (!portc->started) {
+ auvia_start_port(portc);
+ portc->started = B_TRUE;
+ }
+ mutex_exit(&devc->mutex);
+ return (0);
+}
+
+void
+auvia_stop(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ if (portc->started) {
+ auvia_stop_port(portc);
+ portc->started = B_FALSE;
+ }
+ mutex_exit(&devc->mutex);
+}
+
+int
+auvia_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+int
+auvia_channels(void *arg)
+{
+ auvia_portc_t *portc = arg;
+
+ return (portc->nchan);
+}
+
+int
+auvia_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+void
+auvia_sync(void *arg, unsigned nframes)
+{
+ auvia_portc_t *portc = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(portc->buf_dmah, 0, 0, portc->syncdir);
+}
+
+size_t
+auvia_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+uint64_t
+auvia_count(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+ uint64_t val;
+
+ mutex_enter(&devc->mutex);
+ auvia_update_port(portc);
+ /*
+ * The residual is in bytes. We have to convert to frames,
+ * and then subtract it from the fragment size to get the
+ * number of frames processed. It is somewhat unfortunate thta
+ * this (the division) has to happen under the lock. If we
+ * restricted ourself to stereo out, this would be a simple
+ * shift.
+ */
+ val = portc->count +
+ (portc->fragfr - (portc->resid / (portc->nchan * 2)));
+ mutex_exit(&devc->mutex);
+
+ return (val);
+}
+
+
+/* private implementation bits */
+
+void
+auvia_start_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+
+ ASSERT(mutex_owned(&devc->mutex));
+
+ if (devc->suspended)
+ return;
+
+ /*
+ * Start with autoinit and SGD flag
+ * interrupts enabled.
+ */
+ OUTB(devc, portc->base + OFF_CTRL,
+ CTRL_START | CTRL_AUTOSTART | CTRL_FLAG);
+}
+
+void
+auvia_stop_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE);
+}
+
+void
+auvia_update_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t frag;
+ uint32_t n;
+
+ ASSERT(mutex_owned(&devc->mutex));
+ if (devc->suspended) {
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+ n = 0;
+ } else {
+ frag = INL(devc, portc->base + OFF_COUNT);
+ portc->resid = (frag & 0xffffff);
+ frag >>= 24;
+ frag &= 0xff;
+
+ if (frag >= portc->cur_frag) {
+ n = frag - portc->cur_frag;
+ } else {
+ n = frag + AUVIA_NUM_SGD - portc->cur_frag;
+ }
+ portc->count += (n * portc->fragfr);
+ portc->cur_frag = frag;
+ }
+}
+
+void
+auvia_reset_output(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t cmap;
+
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE); /* Stop */
+ OUTL(devc, portc->base + OFF_DMA, portc->sgd_paddr);
+
+ OUTB(devc, portc->base + OFF_PLAYFMT,
+ PLAYFMT_16BIT | (portc->nchan << 4));
+
+ /* Select channel assignment - not valid for 8233A */
+ if (devc->chip_type != CHIP_8233A) {
+ /*
+ * Undocumented slot mapping table:
+ *
+ * slot 3 = 1 (left)
+ * slot 4 = 2 (right)
+ * slot 6 = 5 (center)
+ * slot 9 = 6 (lfe)
+ * slot 7 = 3 (left rear)
+ * slot 8 = 4 (right rear)
+ */
+ switch (portc->nchan) {
+ case 1:
+ cmap = (1 << 0) | (1 << 4);
+ break;
+ case 2:
+ cmap = (1 << 0) | (2 << 4);
+ break;
+ case 4:
+ cmap = (1 << 0) | (2 << 4) | (3 << 8) | (4 << 12);
+ break;
+ case 6:
+ cmap = (1 << 0) | (2 << 4) |
+ (5 << 8) | (6 << 12) | (3 << 16) | (4 << 20);
+ break;
+ default:
+ cmap = 0;
+ break;
+ }
+ OUTL(devc, portc->base + OFF_CHANNELS, cmap | 0xFF000000U);
+ }
+}
+
+static void
+auvia_reset_input(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t fmt;
+
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE); /* Stop */
+ OUTL(devc, portc->base + OFF_DMA, portc->sgd_paddr);
+
+ fmt = RECFMT_STEREO | RECFMT_16BIT;
+
+ if (devc->chip_type != CHIP_8233A) {
+ fmt |= RECFMT_48K;
+ }
+ fmt |= (0xffU << 24);
+ OUTB(devc, portc->base + OFF_RECFIFO, RECFIFO_ENABLE);
+ OUTL(devc, portc->base + OFF_RECFMT, fmt);
+}
+
+int
+auvia_alloc_port(auvia_devc_t *devc, int num)
+{
+ auvia_portc_t *portc;
+ size_t len;
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ char *prop;
+ unsigned caps;
+ audio_dev_t *adev;
+ uint32_t *desc;
+ uint32_t paddr;
+
+ adev = devc->adev;
+ portc = kmem_zalloc(sizeof (*portc), KM_SLEEP);
+ devc->portc[num] = portc;
+ portc->devc = devc;
+ portc->started = B_FALSE;
+
+ switch (num) {
+ case AUVIA_REC_SGD_NUM:
+ prop = "record-interrupts";
+ portc->base = devc->base + REG_RECBASE;
+ portc->syncdir = DDI_DMA_SYNC_FORKERNEL;
+ portc->nchan = 2;
+ portc->reset = auvia_reset_input;
+ caps = ENGINE_INPUT_CAP;
+ dir = DDI_DMA_READ;
+ break;
+ case AUVIA_PLAY_SGD_NUM:
+ prop = "play-interrupts";
+ portc->base = devc->base + REG_PLAYBASE;
+ portc->syncdir = DDI_DMA_SYNC_FORDEV;
+ portc->nchan = 6;
+ portc->reset = auvia_reset_output;
+ caps = ENGINE_OUTPUT_CAP;
+ dir = DDI_DMA_WRITE;
+ break;
+ default:
+ return (DDI_FAILURE);
+ }
+
+ /* make sure port is shut down */
+ OUTB(portc->devc, portc->base + OFF_CTRL, CTRL_TERMINATE);
+
+ /* figure out fragment configuration */
+ portc->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, devc->dip,
+ DDI_PROP_DONTPASS, prop, AUVIA_INTRS);
+
+ /* make sure the values are good */
+ if (portc->intrs < AUVIA_MIN_INTRS) {
+ audio_dev_warn(adev, "%s too low, %d, reset to %d",
+ prop, portc->intrs, AUVIA_INTRS);
+ portc->intrs = AUVIA_INTRS;
+ } else if (portc->intrs > AUVIA_MAX_INTRS) {
+ audio_dev_warn(adev, "%s too high, %d, reset to %d",
+ prop, portc->intrs, AUVIA_INTRS);
+ portc->intrs = AUVIA_INTRS;
+ }
+
+ portc->fragfr = 48000 / portc->intrs;
+ portc->fragsz = portc->fragfr * portc->nchan * 2;
+ portc->buf_size = portc->fragsz * AUVIA_NUM_SGD;
+
+ /* first allocate up space for SGD list */
+ if (ddi_dma_alloc_handle(devc->dip, &dma_attr_sgd,
+ DDI_DMA_SLEEP, NULL, &portc->sgd_dmah) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate SGD handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_mem_alloc(portc->sgd_dmah,
+ AUVIA_NUM_SGD * 2 * sizeof (uint32_t), &dev_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &portc->sgd_kaddr,
+ &len, &portc->sgd_acch) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate SGD memory");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_addr_bind_handle(portc->sgd_dmah, NULL,
+ portc->sgd_kaddr, len, DDI_DMA_CONSISTENT | DDI_DMA_WRITE,
+ DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed binding SGD DMA handle");
+ return (DDI_FAILURE);
+ }
+ portc->sgd_paddr = cookie.dmac_address;
+
+ /* now buffers */
+ if (ddi_dma_alloc_handle(devc->dip, &dma_attr_buf, DDI_DMA_SLEEP, NULL,
+ &portc->buf_dmah) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate BUF handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_mem_alloc(portc->buf_dmah, portc->buf_size,
+ &buf_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &portc->buf_kaddr, &len, &portc->buf_acch) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate BUF memory");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_addr_bind_handle(portc->buf_dmah, NULL, portc->buf_kaddr,
+ len, DDI_DMA_CONSISTENT | dir, DDI_DMA_SLEEP, NULL, &cookie,
+ &count) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed binding BUF DMA handle");
+ return (DDI_FAILURE);
+ }
+ portc->buf_paddr = cookie.dmac_address;
+
+ /* now wire descriptors up */
+ desc = (void *)portc->sgd_kaddr;
+ paddr = portc->buf_paddr;
+ for (int i = 0; i < AUVIA_NUM_SGD; i++) {
+ uint32_t flags;
+
+ flags = AUVIA_SGD_FLAG | portc->fragsz;
+
+ if (i == (AUVIA_NUM_SGD - 1)) {
+ flags |= AUVIA_SGD_EOL;
+ }
+ ddi_put32(portc->sgd_acch, desc++, paddr);
+ ddi_put32(portc->sgd_acch, desc++, flags);
+ paddr += portc->fragsz;
+ }
+
+ ddi_dma_sync(portc->sgd_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ portc->engine = audio_engine_alloc(&auvia_engine_ops, caps);
+ if (portc->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(portc->engine, portc);
+ audio_dev_add_engine(adev, portc->engine);
+
+ return (DDI_SUCCESS);
+}
+
+int
+auvia_setup_intrs(auvia_devc_t *devc)
+{
+ uint_t ipri;
+ int actual;
+ int rv;
+ ddi_intr_handle_t ih[1];
+
+ rv = ddi_intr_alloc(devc->dip, ih, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_STRICT);
+ if ((rv != DDI_SUCCESS) || (actual != 1)) {
+ audio_dev_warn(devc->adev,
+ "Can't alloc interrupt handle (rv %d actual %d)",
+ rv, actual);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(ih[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "Can't get interrupt priority");
+ (void) ddi_intr_free(ih[0]);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(ih[0], auvia_intr, devc, NULL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "Can't add interrupt handler");
+ (void) ddi_intr_free(ih[0]);
+ return (DDI_FAILURE);
+ }
+
+ devc->ih = ih[0];
+ mutex_init(&devc->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ mutex_init(&devc->low_mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ return (DDI_SUCCESS);
+}
+
+void
+auvia_destroy(auvia_devc_t *devc)
+{
+ if (devc->ih != NULL) {
+ (void) ddi_intr_disable(devc->ih);
+ (void) ddi_intr_remove_handler(devc->ih);
+ (void) ddi_intr_free(devc->ih);
+ mutex_destroy(&devc->mutex);
+ mutex_destroy(&devc->low_mutex);
+ }
+
+ if (devc->ksp) {
+ kstat_delete(devc->ksp);
+ }
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+ auvia_portc_t *portc = devc->portc[i];
+ if (!portc)
+ continue;
+ if (portc->engine) {
+ audio_dev_remove_engine(devc->adev, portc->engine);
+ audio_engine_free(portc->engine);
+ }
+ if (portc->sgd_paddr) {
+ (void) ddi_dma_unbind_handle(portc->sgd_dmah);
+ }
+ if (portc->sgd_acch) {
+ ddi_dma_mem_free(&portc->sgd_acch);
+ }
+ if (portc->sgd_dmah) {
+ ddi_dma_free_handle(&portc->sgd_dmah);
+ }
+ if (portc->buf_paddr) {
+ (void) ddi_dma_unbind_handle(portc->buf_dmah);
+ }
+ if (portc->buf_acch) {
+ ddi_dma_mem_free(&portc->buf_acch);
+ }
+ if (portc->buf_dmah) {
+ ddi_dma_free_handle(&portc->buf_dmah);
+ }
+ kmem_free(portc, sizeof (*portc));
+ }
+
+ if (devc->ac97 != NULL) {
+ ac97_free(devc->ac97);
+ }
+ if (devc->adev != NULL) {
+ audio_dev_free(devc->adev);
+ }
+ if (devc->regsh != NULL) {
+ ddi_regs_map_free(&devc->regsh);
+ }
+ if (devc->pcih != NULL) {
+ pci_config_teardown(&devc->pcih);
+ }
+ kmem_free(devc, sizeof (*devc));
+}
+
+void
+auvia_hwinit(auvia_devc_t *devc)
+{
+ ddi_acc_handle_t pcih = devc->pcih;
+ uint32_t val;
+
+ val = pci_config_get32(pcih, AUVIA_PCICFG);
+ /* we want to disable all legacy */
+ val &= ~AUVIA_PCICFG_LEGACY;
+ val &= ~(AUVIA_PCICFG_FMEN | AUVIA_PCICFG_SBEN);
+
+ /* enable AC'97 link and clear the reset bit */
+ val |= (AUVIA_PCICFG_ACLINKEN | AUVIA_PCICFG_NRST);
+ /* disable SRC (we won't use it) */
+ val &= ~AUVIA_PCICFG_SRCEN;
+ /* enable the SGD engines */
+ val |= AUVIA_PCICFG_SGDEN;
+
+ pci_config_put32(pcih, AUVIA_PCICFG, val);
+
+ drv_usecwait(10);
+}
+
+int
+auvia_attach(dev_info_t *dip)
+{
+ uint8_t pci_revision;
+ uint16_t pci_command, vendor, device;
+ auvia_devc_t *devc;
+ ddi_acc_handle_t pcih;
+ const char *version;
+
+ devc = kmem_zalloc(sizeof (*devc), KM_SLEEP);
+ devc->dip = dip;
+ ddi_set_driver_private(dip, devc);
+
+ if ((devc->adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "audio_dev_alloc failed");
+ goto error;
+ }
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "pci_config_setup failed");
+ goto error;
+ }
+ devc->pcih = pcih;
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+ if ((vendor != VIA_VENDOR_ID) || (device != VIA_8233_ID &&
+ device != VIA_8233A_ID)) {
+ audio_dev_warn(devc->adev, "Hardware not recognized "
+ "(vendor=%x, dev=%x)", vendor, device);
+ goto error;
+ }
+
+ devc->chip_type = CHIP_8233;
+ devc->chip_name = "VIA VT8233";
+ version = "8233";
+
+ pci_revision = pci_config_get8(pcih, PCI_CONF_REVID);
+
+ if (pci_revision == 0x50) {
+ devc->chip_name = "VIA VT8235";
+ version = "8235";
+ }
+
+ if (pci_revision == 0x60) {
+ devc->chip_name = "VIA VT8237";
+ version = "8237";
+ }
+
+ if ((device == VIA_8233A_ID) ||
+ (device == VIA_8233_ID && pci_revision == 0x40)) {
+ devc->chip_type = CHIP_8233A;
+ devc->chip_name = "VIA VT8233A";
+ version = "8233A";
+ }
+ audio_dev_set_description(devc->adev, devc->chip_name);
+ audio_dev_set_version(devc->adev, version);
+
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO | PCI_COMM_MAE;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ if ((ddi_regs_map_setup(dip, 1, &devc->base, 0, 0, &dev_attr,
+ &devc->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "failed to map registers");
+ goto error;
+ }
+
+ auvia_hwinit(devc);
+
+ if ((auvia_alloc_port(devc, AUVIA_PLAY_SGD_NUM) != DDI_SUCCESS) ||
+ (auvia_alloc_port(devc, AUVIA_REC_SGD_NUM) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ if (auvia_setup_intrs(devc) != DDI_SUCCESS) {
+ goto error;
+ }
+
+ devc->ac97 = ac97_alloc(dip, auvia_read_ac97, auvia_write_ac97, devc);
+ if (devc->ac97 == NULL) {
+ audio_dev_warn(devc->adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ if (ac97_init(devc->ac97, devc->adev) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "failed to init ac97");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((devc->ksp = kstat_create(AUVIA_NAME, ddi_get_instance(dip),
+ AUVIA_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(devc->ksp);
+ }
+
+ if (audio_dev_register(devc->adev) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "unable to register with framework");
+ goto error;
+ }
+
+ (void) ddi_intr_enable(devc->ih);
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ auvia_destroy(devc);
+ return (DDI_FAILURE);
+}
+
+int
+auvia_resume(dev_info_t *dip)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ auvia_hwinit(devc);
+
+ /* allow ac97 operations again */
+ ac97_resume(devc->ac97);
+
+ mutex_enter(&devc->mutex);
+ devc->suspended = B_TRUE;
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+
+ if (portc->engine != NULL)
+ audio_engine_reset(portc->engine);
+
+ /* reset the port */
+ portc->reset(portc);
+
+ if (portc->started) {
+ auvia_start_port(portc);
+ } else {
+ auvia_stop_port(portc);
+ }
+ }
+ mutex_exit(&devc->mutex);
+ return (DDI_SUCCESS);
+}
+
+
+int
+auvia_detach(auvia_devc_t *devc)
+{
+ if (audio_dev_unregister(devc->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ auvia_destroy(devc);
+ return (DDI_SUCCESS);
+}
+
+int
+auvia_suspend(auvia_devc_t *devc)
+{
+ ac97_suspend(devc->ac97);
+
+ mutex_enter(&devc->mutex);
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+ auvia_stop_port(portc);
+ }
+ devc->suspended = B_TRUE;
+ mutex_exit(&devc->mutex);
+ return (DDI_SUCCESS);
+}
+
+static int auvia_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int auvia_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int auvia_ddi_quiesce(dev_info_t *);
+
+static struct dev_ops auvia_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ auvia_ddi_attach, /* attach */
+ auvia_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ auvia_ddi_quiesce, /* quiesce */
+};
+
+static struct modldrv auvia_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Via 823x Audio", /* linkinfo */
+ &auvia_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &auvia_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&auvia_dev_ops, AUVIA_NAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&auvia_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&auvia_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
+
+int
+auvia_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (auvia_attach(dip));
+
+ case DDI_RESUME:
+ return (auvia_resume(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+int
+auvia_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (auvia_detach(devc));
+
+ case DDI_SUSPEND:
+ return (auvia_suspend(devc));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+int
+auvia_ddi_quiesce(dev_info_t *dip)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+ auvia_stop_port(portc);
+ }
+ return (DDI_SUCCESS);
+}
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf
new file mode 100644
index 0000000000..4b98468d88
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf
@@ -0,0 +1,41 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audiovia823x audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audiovia823x
+# driver enforces a maximum and minimum count.
+#
+play-interrupts=175;
+record-interrupts=175;
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h
new file mode 100644
index 0000000000..f2eb52ce50
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h
@@ -0,0 +1,191 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Definitions for the via8233 driver
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+#ifndef AUDIOVIA823X_H
+#define AUDIOVIA823X_H
+
+#define AUVIA_NAME "audiovia823x"
+
+#define VIA_VENDOR_ID 0x1106
+#define VIA_8233_ID 0x3059
+#define VIA_8233A_ID 0x7059
+
+/* pci configuration registers */
+#define AUVIA_PCICFG 0x40 /* Via chip specific cfg reg */
+#define AUVIA_PCICFG_LEGACY 0x00ff0000 /* legacy enables mask */
+#define AUVIA_PCICFG_ACLINKEN 0x00008000 /* AC'97 link enable */
+#define AUVIA_PCICFG_NRST 0x00004000 /* inverse of AC'97 reset */
+#define AUVIA_PCICFG_ACSYNC 0x00002000 /* AC'97 sync */
+#define AUVIA_PCICFG_SRCEN 0x00000800 /* sample rate converter en */
+#define AUVIA_PCICFG_SGDEN 0x00000400 /* SGD enable */
+#define AUVIA_PCICFG_FMEN 0x00000200 /* FM synth enable (legacy) */
+#define AUVIA_PCICFG_SBEN 0x00000100 /* SB compat enable (legacy) */
+#define AUVIA_PCICFG_PRIVALID 0x00000001 /* primary codec ready */
+
+#define AUVIA_PLAY_SGD_NUM 1
+#define AUVIA_REC_SGD_NUM 0
+#define AUVIA_NUM_PORTC 2
+#define AUVIA_NUM_SGD 16 /* number of fragments */
+
+#define AUVIA_MAX_INTRS 256
+#define AUVIA_MIN_INTRS 24
+#define AUVIA_INTRS 175
+
+#define AUVIA_SGD_EOL 0x80000000
+#define AUVIA_SGD_FLAG 0x40000000
+
+#define CODEC_TIMEOUT_COUNT 500
+
+#define REG_PLAYBASE 0x40 /* Multichannel SGD */
+#define REG_RECBASE 0x60
+#define REG_CODEC 0x80 /* Access AC97 Codec */
+#define REG_GSTAT 0x84 /* Global status */
+
+/* REG_CODEC */
+#define CODEC_IN_CMD 0x01000000 /* busy in sending */
+#define CODEC_STA_VALID 0x02000000 /* 1:status data is valid */
+#define CODEC_RD 0x00800000 /* Read CODEC status */
+#define CODEC_WR 0x00000000 /* Write CODEC status */
+#define CODEC_INDEX 0x007F0000 /* Index of command register */
+#define CODEC_DATA 0x0000FFFF /* AC97 status register data */
+
+/* registers that are offsets relative to a port */
+#define OFF_STATUS 0x00
+#define OFF_CTRL 0x01
+#define OFF_PLAYFMT 0x02
+#define OFF_RECFIFO 0x02
+#define OFF_DMA 0x04
+#define OFF_CHANNELS 0x08
+#define OFF_RECFMT 0x08
+#define OFF_COUNT 0x0C
+
+/* bits for above offsets */
+#define STATUS_INTR 0x3
+
+#define CTRL_START 0x80
+#define CTRL_TERMINATE 0x40
+#define CTRL_AUTOSTART 0x20
+#define CTRL_MULTICHORDER 0x10 /* SGD 0x40 only, Center/LFE order */
+#define CTRL_FLAG 0x01
+
+#define PLAYFMT_16BIT 0x80
+#define PLAYFMT_STEREO 0x20 /* Num channels (1-6), upper nybble */
+#define PLAYFMT_6CH 0x60
+#define PLAYFMT_4CH 0x40
+
+#define RECFIFO_ENABLE 0x40
+
+#define RECFMT_48K 0x00ffffff
+#define RECFMT_STEREO 0x00100000
+#define RECFMT_16BIT 0x00200000
+
+
+typedef struct {
+ unsigned int phaddr;
+ unsigned int flags;
+} SGD_entry;
+
+typedef struct auvia_portc auvia_portc_t;
+typedef struct auvia_devc auvia_devc_t;
+
+struct auvia_portc {
+ auvia_devc_t *devc;
+ audio_engine_t *engine;
+ caddr_t base; /* base for registers */
+ boolean_t started;
+ int nchan;
+
+ ddi_dma_handle_t sgd_dmah; /* dma for descriptors */
+ ddi_acc_handle_t sgd_acch;
+ uint32_t sgd_paddr;
+ caddr_t sgd_kaddr;
+
+ ddi_dma_handle_t buf_dmah; /* dma for buffers */
+ ddi_acc_handle_t buf_acch;
+ uint32_t buf_paddr;
+ caddr_t buf_kaddr;
+ size_t buf_size;
+ int syncdir;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ unsigned cur_frag;
+ unsigned resid;
+
+ uint64_t count;
+
+ /* helper functions */
+ void (*reset)(auvia_portc_t *);
+};
+
+
+struct auvia_devc {
+ dev_info_t *dip;
+ audio_dev_t *adev;
+ ac97_t *ac97;
+ kstat_t *ksp;
+ boolean_t suspended;
+
+ char *chip_name;
+ int chip_type;
+#define CHIP_8233 0
+#define CHIP_8233A 1
+
+ /* registers */
+ ddi_acc_handle_t pcih;
+ ddi_acc_handle_t regsh;
+ caddr_t base;
+
+ kmutex_t mutex; /* For normal locking */
+ kmutex_t low_mutex; /* For low level routines */
+ ddi_intr_handle_t ih;
+ auvia_portc_t *portc[AUVIA_NUM_PORTC];
+};
+
+#define AUVIA_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+#define INL(devc, reg) ddi_get32(devc->regsh, (void *)(reg))
+
+#define INB(devc, reg) ddi_get8(devc->regsh, (void *)(reg))
+
+#define OUTL(devc, reg, val) ddi_put32(devc->regsh, (void *)(reg), (val))
+
+#define OUTB(devc, reg, val) ddi_put8(devc->regsh, (void *)(reg), (val))
+
+#endif /* AUDIOVIA823X_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio.conf b/usr/src/uts/common/io/audio/impl/audio.conf
new file mode 100644
index 0000000000..ca5a83e886
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio.conf
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the common audio driver.
+#
+
+#
+# We are a pseudo driver.
+#
+name="audio" parent="pseudo" instance=0;
+
+#
+# We want to always be present and never removed. This is important
+# to ensure that device numbering is not lost due to the driver being
+# forced out of memory automatically.
+#
+ddi-forceattach=1;
+ddi-no-autodetach=1;
diff --git a/usr/src/uts/common/io/audio/impl/audio_client.c b/usr/src/uts/common/io/audio/impl/audio_client.c
new file mode 100644
index 0000000000..f3514df49b
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_client.c
@@ -0,0 +1,1675 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include <sys/file.h>
+#include <sys/open.h>
+#include <sys/stat.h>
+#include <sys/errno.h>
+#include <sys/atomic.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Client implementation.
+ */
+
+/*
+ * Attenuation table for dB->linear conversion. Indexed in steps of
+ * 0.5 dB. Table size is 25 dB (first entry is handled as mute).
+ *
+ * Notably, the last item in table is taken as 0 dB (i.e. maximum volume).
+ *
+ * Table contents can be calculated as follows (requires sunmath library):
+ *
+ * scale = AUDIO_VOL_SCALE;
+ * for (i = -50; i <= 0; i++) {
+ * x = exp10(0.05 * i);
+ * printf("%d: %f %.0f\n", i, x, trunc(x * scale));
+ * }
+ *
+ */
+
+const uint16_t auimpl_db_table[AUDIO_DB_SIZE + 1] = {
+ 0, 0, 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
+ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22,
+ 25, 28, 32, 36, 40, 45, 51, 57, 64, 72,
+ 80, 90, 101, 114, 128, 143, 161, 181, 203, 228,
+ 256
+};
+
+void *
+auclnt_get_private(audio_client_t *c)
+{
+ return (c->c_private);
+}
+
+void
+auclnt_set_private(audio_client_t *c, void *private)
+{
+ c->c_private = private;
+}
+
+int
+auclnt_set_rate(audio_stream_t *sp, int rate)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /* basic sanity checks! */
+ if ((rate < 5000) || (rate > 192000)) {
+ return (EINVAL);
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ if (rate != parms.p_rate) {
+ parms.p_rate = rate;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+ return (rv);
+}
+
+int
+auclnt_get_rate(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_rate);
+}
+
+unsigned
+auclnt_get_fragsz(audio_stream_t *sp)
+{
+ return (sp->s_fragbytes);
+}
+
+unsigned
+auclnt_get_framesz(audio_stream_t *sp)
+{
+ return (sp->s_framesz);
+}
+
+unsigned
+auclnt_get_nfrags(audio_stream_t *sp)
+{
+ return (sp->s_nfrags);
+}
+
+unsigned
+auclnt_get_nframes(audio_stream_t *sp)
+{
+ return (sp->s_nframes);
+}
+
+uint64_t
+auclnt_get_head(audio_stream_t *sp)
+{
+ return (sp->s_head);
+}
+
+uint64_t
+auclnt_get_tail(audio_stream_t *sp)
+{
+ return (sp->s_tail);
+}
+
+unsigned
+auclnt_get_hidx(audio_stream_t *sp)
+{
+ return (sp->s_hidx);
+}
+
+unsigned
+auclnt_get_tidx(audio_stream_t *sp)
+{
+ return (sp->s_tidx);
+}
+
+audio_stream_t *
+auclnt_input_stream(audio_client_t *c)
+{
+ return (&c->c_istream);
+}
+
+audio_stream_t *
+auclnt_output_stream(audio_client_t *c)
+{
+ return (&c->c_ostream);
+}
+
+unsigned
+auclnt_get_count(audio_stream_t *sp)
+{
+ unsigned count;
+
+ mutex_enter(&sp->s_lock);
+ ASSERT((sp->s_head - sp->s_tail) <= sp->s_nframes);
+ count = (unsigned)(sp->s_head - sp->s_tail);
+ mutex_exit(&sp->s_lock);
+
+ return (count);
+}
+
+unsigned
+auclnt_consume(audio_stream_t *sp, unsigned n)
+{
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp == &sp->s_client->c_istream);
+ n = max(n, sp->s_head - sp->s_tail);
+ sp->s_tail += n;
+ sp->s_tidx += n;
+ if (sp->s_tidx >= sp->s_nframes) {
+ sp->s_tidx -= sp->s_nframes;
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (n);
+}
+
+unsigned
+auclnt_consume_data(audio_stream_t *sp, caddr_t dst, unsigned n)
+{
+ unsigned nframes;
+ unsigned framesz;
+ unsigned cnt;
+ caddr_t data;
+
+ mutex_enter(&sp->s_lock);
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp == &sp->s_client->c_istream);
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < nframes);
+ ASSERT(sp->s_hidx < nframes);
+
+ cnt = n = min(n, sp->s_head - sp->s_tail);
+ data = sp->s_data + (sp->s_tidx * framesz);
+ do {
+ unsigned nf, nb;
+
+ nf = min(nframes - sp->s_tidx, n);
+ nb = nf * framesz;
+
+ bcopy(data, dst, nb);
+ dst += nb;
+ data += nb;
+
+ n -= nf;
+ sp->s_tail += nf;
+ sp->s_tidx += nf;
+ if (sp->s_tidx == nframes) {
+ sp->s_tidx = 0;
+ data = sp->s_data;
+ }
+ } while (n);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_tidx < nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (cnt);
+}
+
+unsigned
+auclnt_produce(audio_stream_t *sp, unsigned n)
+{
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp == &sp->s_client->c_ostream);
+ n = max(n, sp->s_nframes - (sp->s_head - sp->s_tail));
+ sp->s_head += n;
+ sp->s_hidx += n;
+ if (sp->s_hidx >= sp->s_nframes) {
+ sp->s_hidx -= sp->s_nframes;
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (n);
+}
+
+unsigned
+auclnt_produce_data(audio_stream_t *sp, caddr_t src, unsigned n)
+{
+ unsigned nframes;
+ unsigned framesz;
+ unsigned cnt;
+ caddr_t data;
+
+ mutex_enter(&sp->s_lock);
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp == &sp->s_client->c_ostream);
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < nframes);
+ ASSERT(sp->s_hidx < nframes);
+
+ cnt = n = min(n, nframes - (sp->s_head - sp->s_tail));
+ data = sp->s_data + (sp->s_hidx * framesz);
+ do {
+ unsigned nf, nb;
+
+ nf = min(nframes - sp->s_hidx, n);
+ nb = nf * framesz;
+
+ bcopy(src, data, nb);
+
+ src += nb;
+ data += nb;
+
+ n -= nf;
+ sp->s_head += nf;
+ sp->s_hidx += nf;
+ if (sp->s_hidx == nframes) {
+ sp->s_hidx = 0;
+ data = sp->s_data;
+ }
+ } while (n);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (cnt);
+}
+
+int
+auclnt_read(audio_client_t *c, struct uio *uio)
+{
+ audio_stream_t *sp = &c->c_istream;
+ unsigned cnt;
+ int rv = 0;
+ offset_t loff;
+ int eagain;
+
+ loff = uio->uio_loffset;
+ eagain = EAGAIN;
+
+ mutex_enter(&sp->s_lock);
+
+ if ((!sp->s_paused) && (!sp->s_running)) {
+ mutex_exit(&sp->s_lock);
+ auclnt_start(sp);
+ mutex_enter(&sp->s_lock);
+ }
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ while (uio->uio_resid >= sp->s_framesz) {
+
+ while ((cnt = (sp->s_head - sp->s_tail)) == 0) {
+ if (uio->uio_fmode & (FNONBLOCK|FNDELAY)) {
+ mutex_exit(&sp->s_lock);
+ return (eagain);
+ }
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+
+ cnt = min(cnt, sp->s_nframes - sp->s_tidx);
+ cnt = min(cnt, (uio->uio_resid / sp->s_framesz));
+
+ rv = uiomove(sp->s_data + (sp->s_tidx * sp->s_framesz),
+ cnt * sp->s_framesz, UIO_READ, uio);
+ uio->uio_loffset = loff;
+ eagain = 0;
+
+ if (rv != 0) {
+ mutex_exit(&sp->s_lock);
+ return (rv);
+ }
+
+ sp->s_tail += cnt;
+ sp->s_tidx += cnt;
+ if (sp->s_tidx == sp->s_nframes) {
+ sp->s_tidx = 0;
+ }
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+
+ /* round off any remaining partial bits */
+ uio->uio_resid = 0;
+
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_write(audio_client_t *c, struct uio *uio)
+{
+ audio_stream_t *sp = &c->c_ostream;
+ unsigned cnt;
+ int rv = 0;
+ offset_t loff;
+ int eagain;
+
+ loff = uio->uio_loffset;
+ eagain = EAGAIN;
+
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ while (uio->uio_resid >= sp->s_framesz) {
+
+ while ((cnt = sp->s_nframes - (sp->s_head - sp->s_tail)) == 0) {
+ if (uio->uio_fmode & (FNONBLOCK|FNDELAY)) {
+ mutex_exit(&sp->s_lock);
+ return (eagain);
+ }
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+
+ cnt = min(cnt, sp->s_nframes - sp->s_hidx);
+ cnt = min(cnt, (uio->uio_resid / sp->s_framesz));
+
+ rv = uiomove(sp->s_data + (sp->s_hidx * sp->s_framesz),
+ cnt * sp->s_framesz, UIO_WRITE, uio);
+ uio->uio_loffset = loff;
+ eagain = 0;
+
+ if (rv != 0) {
+ mutex_exit(&sp->s_lock);
+ return (rv);
+ }
+
+ sp->s_head += cnt;
+ sp->s_hidx += cnt;
+ if (sp->s_hidx == sp->s_nframes) {
+ sp->s_hidx = 0;
+ }
+
+ if ((!sp->s_paused) && (!sp->s_running) &&
+ ((sp->s_head - sp->s_tail) > sp->s_fragfr)) {
+ mutex_exit(&sp->s_lock);
+ auclnt_start(sp);
+ mutex_enter(&sp->s_lock);
+ }
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ /* round off any remaining partial bits */
+ uio->uio_resid = 0;
+
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_chpoll(audio_client_t *c, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ audio_stream_t *sp;
+ short nev = 0;
+
+ if (events & (POLLIN | POLLRDNORM)) {
+ sp = &c->c_istream;
+ mutex_enter(&sp->s_lock);
+ if ((sp->s_head - sp->s_tail) > sp->s_fragfr) {
+ nev = POLLIN | POLLRDNORM;
+ }
+ mutex_exit(&sp->s_lock);
+ }
+
+ if (events & POLLOUT) {
+ sp = &c->c_ostream;
+ mutex_enter(&sp->s_lock);
+ if ((sp->s_nframes - (sp->s_head - sp->s_tail)) >
+ sp->s_fragfr) {
+ nev = POLLOUT;
+ }
+ mutex_exit(&sp->s_lock);
+ }
+
+ if (nev) {
+ *reventsp = nev & events;
+ } else {
+ *reventsp = 0;
+ if (!anyyet) {
+ *phpp = &c->c_pollhead;
+ }
+ }
+ return (0);
+}
+
+void
+auclnt_pollwakeup(audio_client_t *c, short events)
+{
+ pollwakeup(&c->c_pollhead, events);
+}
+
+void
+auclnt_get_output_qlen(audio_client_t *c, unsigned *slen, unsigned *flen)
+{
+ audio_stream_t *sp = &c->c_ostream;
+ audio_engine_t *e = sp->s_engine;
+ uint64_t el, sl;
+ unsigned cnt, er, sr;
+
+ if (e == NULL) {
+ /* if no output engine, can't do it! */
+ *slen = 0;
+ *flen = 0;
+ return;
+ }
+
+ mutex_enter(&e->e_lock);
+ mutex_enter(&sp->s_lock);
+ el = ENG_QLEN(e) + (e->e_head - e->e_tail);
+ er = e->e_rate;
+ sl = sp->s_cnv_cnt;
+ sr = sp->s_user_parms->p_rate;
+ cnt = (unsigned)(sp->s_head - sp->s_tail);
+ mutex_exit(&sp->s_lock);
+ mutex_exit(&e->e_lock);
+
+ /* engine frames converted to stream rate, plus stream frames */
+ *slen = cnt;
+ *flen = ((unsigned)(((el * sr) / er) + sl));
+}
+
+int
+auclnt_set_format(audio_stream_t *sp, int fmt)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /*
+ * AC3: If we select an AC3 format, then we have to allocate
+ * another engine. Normally this will be an output only
+ * engine. However, for now we aren't supporting AC3
+ * passthru.
+ */
+
+ switch (fmt) {
+ case AUDIO_FORMAT_U8:
+ case AUDIO_FORMAT_ULAW:
+ case AUDIO_FORMAT_ALAW:
+ case AUDIO_FORMAT_S8:
+ case AUDIO_FORMAT_S16_LE:
+ case AUDIO_FORMAT_S16_BE:
+ case AUDIO_FORMAT_U16_LE:
+ case AUDIO_FORMAT_U16_BE:
+ case AUDIO_FORMAT_S24_LE:
+ case AUDIO_FORMAT_S24_BE:
+ case AUDIO_FORMAT_S32_LE:
+ case AUDIO_FORMAT_S32_BE:
+ case AUDIO_FORMAT_S24_PACKED:
+ break;
+
+ case AUDIO_FORMAT_AC3: /* AC3: PASSTHRU */
+ default:
+ return (ENOTSUP);
+ }
+
+
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+
+ /*
+ * Optimization. Some personalities send us the same format
+ * over and over again. (Sun personality does this
+ * repeatedly.) setup_src is potentially expensive, so we
+ * avoid doing it unless we really need to.
+ */
+ if (fmt != parms.p_format) {
+ /*
+ * Note that setting the format doesn't check that the
+ * audio streams have been paused. As a result, any
+ * data still playing or recording will probably get
+ * misinterpreted. It would be smart if the client
+ * application paused/stopped playback before changing
+ * formats.
+ */
+ parms.p_format = fmt;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_get_format(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_format);
+}
+
+int
+auclnt_get_output_format(audio_client_t *c)
+{
+ return (c->c_ostream.s_user_parms->p_format);
+}
+
+int
+auclnt_get_input_format(audio_client_t *c)
+{
+ return (c->c_istream.s_user_parms->p_format);
+}
+
+int
+auclnt_set_channels(audio_stream_t *sp, int nchan)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /* Validate setting */
+ if ((nchan > AUDIO_MAX_CHANNELS) || (nchan < 1)) {
+ return (EINVAL);
+ }
+
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ if (nchan != parms.p_nchan) {
+ parms.p_nchan = nchan;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_get_channels(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_nchan);
+}
+
+void
+auimpl_set_gain_master(audio_stream_t *sp, uint8_t gain)
+{
+ uint32_t scaled;
+
+ if (gain > 100) {
+ gain = 0;
+ }
+
+ mutex_enter(&sp->s_lock);
+ if (sp->s_gain_master == gain) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ /*
+ * calculate the scaled values. Done now to avoid calculations
+ * later.
+ */
+ scaled = (gain * sp->s_gain_pct * AUDIO_DB_SIZE) / (100 * 100);
+
+ sp->s_gain_master = gain;
+ sp->s_gain_scaled = auimpl_db_table[scaled];
+
+ if (!sp->s_muted) {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ /*
+ * No need to notify clients, since they can't see this update.
+ */
+}
+
+void
+auclnt_set_gain(audio_stream_t *sp, uint8_t gain)
+{
+ uint32_t scaled;
+
+ if (gain > 100) {
+ gain = 0;
+ }
+
+ mutex_enter(&sp->s_lock);
+
+ /* if no change, don't bother doing updates */
+ if (sp->s_gain_pct == gain) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ /*
+ * calculate the scaled values. Done now to avoid calculations
+ * later.
+ */
+ scaled = (gain * sp->s_gain_master * AUDIO_DB_SIZE) / (100 * 100);
+
+ sp->s_gain_pct = gain;
+ sp->s_gain_scaled = auimpl_db_table[scaled];
+
+ if (!sp->s_muted) {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+uint8_t
+auclnt_get_gain(audio_stream_t *sp)
+{
+ return (sp->s_gain_pct);
+}
+
+void
+auclnt_set_muted(audio_stream_t *sp, boolean_t muted)
+{
+ mutex_enter(&sp->s_lock);
+
+ /* if no work change, don't bother doing updates */
+ if (sp->s_muted == muted) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ sp->s_muted = muted;
+ if (muted) {
+ sp->s_gain_eff = 0;
+ } else {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+boolean_t
+auclnt_get_muted(audio_stream_t *sp)
+{
+ return (sp->s_muted);
+}
+
+void
+auclnt_start(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_running = B_TRUE;
+ mutex_exit(&sp->s_lock);
+}
+
+void
+auclnt_stop(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ /* if running, then stop it */
+ if (sp->s_running) {
+ sp->s_running = B_FALSE;
+ /*
+ * if we stopped the engine, we might need to wake up
+ * a thread that is waiting for drain to complete.
+ */
+ cv_broadcast(&sp->s_cv);
+ }
+ mutex_exit(&sp->s_lock);
+}
+
+/*
+ * When pausing, no new data will be played after the most recently
+ * mixed samples have played. However, the audio engine will continue
+ * to play (possibly just silence).
+ *
+ * Note that we don't reference count the device, or release/close the
+ * engine here. Once fired up, the engine continues running unil it
+ * is closed.
+ */
+void
+auclnt_set_paused(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (sp->s_paused) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+ sp->s_paused = B_TRUE;
+ mutex_exit(&sp->s_lock);
+
+ auclnt_stop(sp);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+void
+auclnt_clear_paused(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (!sp->s_paused) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+ sp->s_paused = B_FALSE;
+ mutex_exit(&sp->s_lock);
+}
+
+boolean_t
+auclnt_is_paused(audio_stream_t *sp)
+{
+ return (sp->s_paused);
+}
+
+void
+auclnt_flush(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (sp == &sp->s_client->c_ostream) {
+ sp->s_tail = sp->s_head;
+ sp->s_tidx = sp->s_hidx;
+ } else {
+ sp->s_head = sp->s_tail;
+ sp->s_hidx = sp->s_tidx;
+ }
+ sp->s_cnv_cnt = 0;
+ mutex_exit(&sp->s_lock);
+}
+
+int
+auclnt_get_oflag(audio_client_t *c)
+{
+ return (c->c_omode);
+}
+
+/*
+ * These routines should not be accessed by client "personality"
+ * implementations, but are for private framework use only.
+ */
+
+static list_t auimpl_clients;
+static krwlock_t auimpl_client_lock;
+static audio_client_ops_t *audio_client_ops[AUDIO_MN_TYPE_MASK + 1];
+
+void
+auimpl_client_init(void)
+{
+ rw_init(&auimpl_client_lock, NULL, RW_DRIVER, NULL);
+ list_create(&auimpl_clients, sizeof (struct audio_client),
+ offsetof(struct audio_client, c_global_linkage));
+}
+
+void
+auimpl_client_fini(void)
+{
+ rw_destroy(&auimpl_client_lock);
+ list_destroy(&auimpl_clients);
+}
+
+static int
+auimpl_stream_init(audio_stream_t *sp, audio_client_t *c)
+{
+ mutex_init(&sp->s_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&sp->s_cv, NULL, CV_DRIVER, NULL);
+ sp->s_client = c;
+
+ if (sp == &c->c_ostream) {
+ sp->s_user_parms = &sp->s_cnv_src_parms;
+ sp->s_phys_parms = &sp->s_cnv_dst_parms;
+ sp->s_engcap = ENGINE_OUTPUT_CAP;
+ } else {
+ ASSERT(sp == &c->c_istream);
+ sp->s_user_parms = &sp->s_cnv_dst_parms;
+ sp->s_phys_parms = &sp->s_cnv_src_parms;
+ sp->s_engcap = ENGINE_INPUT_CAP;
+ }
+
+ /* for now initialize conversion parameters */
+ sp->s_src_quality = 3; /* reasonable compromise for now */
+ sp->s_cnv_dst_nchan = 2;
+ sp->s_cnv_dst_format = AUDIO_FORMAT_S24_NE;
+ sp->s_cnv_dst_rate = 48000;
+ sp->s_cnv_src_nchan = 2;
+ sp->s_cnv_src_format = AUDIO_FORMAT_S24_NE;
+ sp->s_cnv_src_rate = 48000;
+
+ /* set volume/gain all the way up */
+ sp->s_muted = B_FALSE;
+ sp->s_gain_pct = 0;
+ sp->s_gain_scaled = AUDIO_VOL_SCALE;
+ sp->s_gain_eff = AUDIO_VOL_SCALE;
+
+ /*
+ * We have to start off with a reasonable buffer and
+ * interrupt configuration.
+ */
+ sp->s_allocsz = 65536;
+ sp->s_data = ddi_umem_alloc(sp->s_allocsz, DDI_UMEM_NOSLEEP,
+ &sp->s_cookie);
+ if (sp->s_data == NULL) {
+ sp->s_allocsz = 0;
+ audio_dev_warn(c->c_dev, "ddi_umem_alloc failed");
+ return (ENOMEM);
+ }
+ /* make sure no stale data left in stream */
+ bzero(sp->s_data, sp->s_allocsz);
+
+ /*
+ * Allocate SRC and data conversion state.
+ */
+ mutex_enter(&sp->s_lock);
+ if (auimpl_format_alloc(sp) != 0) {
+ mutex_exit(&sp->s_lock);
+ return (ENOMEM);
+ }
+
+ mutex_exit(&sp->s_lock);
+
+ return (0);
+}
+
+
+static void
+audio_stream_fini(audio_stream_t *sp)
+{
+ auimpl_format_free(sp);
+ if (sp->s_cnv_buf0)
+ kmem_free(sp->s_cnv_buf0, sp->s_cnv_max);
+ if (sp->s_cnv_buf1)
+ kmem_free(sp->s_cnv_buf1, sp->s_cnv_max);
+ mutex_destroy(&sp->s_lock);
+ cv_destroy(&sp->s_cv);
+ if (sp->s_data != NULL) {
+ ddi_umem_free(sp->s_cookie);
+ sp->s_data = NULL;
+ }
+}
+
+void
+auimpl_client_task(void *arg)
+{
+ audio_client_t *c = arg;
+
+ mutex_enter(&c->c_lock);
+
+ for (;;) {
+ if (c->c_closing) {
+ break;
+ }
+
+ if (c->c_do_output) {
+ c->c_do_output = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_output != NULL)
+ c->c_output(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_input) {
+ c->c_do_input = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_input != NULL)
+ c->c_input(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_notify) {
+ c->c_do_notify = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_notify != NULL)
+ c->c_notify(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_drain) {
+ c->c_do_drain = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_drain != NULL)
+ c->c_drain(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ /* if we got here, we had no work to do */
+ cv_wait(&c->c_cv, &c->c_lock);
+ }
+ mutex_exit(&c->c_lock);
+}
+
+int
+auclnt_start_drain(audio_client_t *c)
+{
+ audio_stream_t *sp;
+ int rv;
+
+ sp = &c->c_ostream;
+
+ /* start an asynchronous drain operation. */
+ mutex_enter(&sp->s_lock);
+ if (sp->s_paused || !sp->s_running) {
+ rv = EALREADY;
+ } else {
+ sp->s_draining = B_TRUE;
+ rv = 0;
+ }
+ mutex_exit(&sp->s_lock);
+ return (rv);
+}
+
+int
+auclnt_drain(audio_client_t *c)
+{
+ audio_stream_t *sp;
+
+ sp = &c->c_ostream;
+
+ /*
+ * Note: Drain logic will automatically "stop" the stream when
+ * the drain threshold has been reached. So all we have to do
+ * is wait for the stream to stop.
+ */
+ mutex_enter(&sp->s_lock);
+ sp->s_draining = B_TRUE;
+ while (sp->s_draining && sp->s_running && !sp->s_paused) {
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+ mutex_exit(&sp->s_lock);
+ return (0);
+}
+
+audio_client_t *
+auimpl_client_create(dev_t dev)
+{
+ audio_client_ops_t *ops;
+ audio_client_t *c;
+ audio_client_t *next;
+ list_t *list = &auimpl_clients;
+ minor_t minor;
+ audio_dev_t *d;
+ char scratch[80];
+ static uint64_t unique = 0;
+
+ /* validate minor number */
+ minor = getminor(dev) & AUDIO_MN_TYPE_MASK;
+ if ((ops = audio_client_ops[minor]) == NULL) {
+ return (NULL);
+ }
+
+ /* lookup device instance */
+ if ((d = auimpl_dev_hold_by_devt(dev)) == NULL) {
+ audio_dev_warn(NULL, "no audio_dev for dev_t %d,%d",
+ getmajor(dev), getminor(dev));
+ return (NULL);
+ }
+
+ if ((c = kmem_zalloc(sizeof (*c), KM_NOSLEEP)) == NULL) {
+ audio_dev_warn(d, "unable to allocate client structure");
+ auimpl_dev_release(d);
+ return (NULL);
+ }
+ c->c_dev = d;
+
+ mutex_init(&c->c_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&c->c_cv, NULL, CV_DRIVER, NULL);
+
+ if ((auimpl_stream_init(&c->c_ostream, c) != 0) ||
+ (auimpl_stream_init(&c->c_istream, c) != 0)) {
+ goto failed;
+ }
+
+ c->c_major = getmajor(dev);
+ c->c_origminor = getminor(dev);
+ c->c_ops = *ops;
+
+ (void) snprintf(scratch, sizeof (scratch), "auclnt%" PRIx64,
+ atomic_inc_64_nv(&unique));
+ c->c_tq = ddi_taskq_create(NULL, scratch, 1, TASKQ_DEFAULTPRI, 0);
+ if (c->c_tq == NULL) {
+ audio_dev_warn(d, "client taskq_create failed");
+ goto failed;
+ }
+
+ /*
+ * We hold the client lock here.
+ */
+ rw_enter(&auimpl_client_lock, RW_WRITER);
+
+ minor = AUDIO_MN_CLONE_MASK;
+ for (next = list_head(list); next; next = list_next(list, next)) {
+ if (next->c_minor > minor) {
+ break;
+ }
+ minor++;
+ }
+ if (minor >= MAXMIN32) {
+ rw_exit(&auimpl_client_lock);
+ goto failed;
+ }
+ c->c_minor = minor;
+ list_insert_before(list, next, c);
+
+ rw_exit(&auimpl_client_lock);
+
+
+ return (c);
+
+failed:
+ auimpl_dev_release(d);
+ if (c->c_tq != NULL) {
+ ddi_taskq_destroy(c->c_tq);
+ }
+ audio_stream_fini(&c->c_ostream);
+ audio_stream_fini(&c->c_istream);
+ mutex_destroy(&c->c_lock);
+ cv_destroy(&c->c_cv);
+ kmem_free(c, sizeof (*c));
+ return (NULL);
+}
+
+void
+auimpl_client_destroy(audio_client_t *c)
+{
+ /* remove us from the global list */
+ rw_enter(&auimpl_client_lock, RW_WRITER);
+ list_remove(&auimpl_clients, c);
+ rw_exit(&auimpl_client_lock);
+
+ ASSERT(!c->c_istream.s_running);
+ ASSERT(!c->c_istream.s_running);
+
+ /* release the device reference count */
+ auimpl_dev_release(c->c_dev);
+ c->c_dev = NULL;
+
+ ddi_taskq_destroy(c->c_tq);
+
+ mutex_destroy(&c->c_lock);
+ cv_destroy(&c->c_cv);
+
+ audio_stream_fini(&c->c_istream);
+ audio_stream_fini(&c->c_ostream);
+ kmem_free(c, sizeof (*c));
+}
+
+void
+auclnt_close(audio_client_t *c)
+{
+ audio_dev_t *d = c->c_dev;
+
+ /* stop the engines if they are running */
+ auclnt_stop(&c->c_istream);
+ auclnt_stop(&c->c_ostream);
+
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ list_remove(&d->d_clients, c);
+ rw_exit(&d->d_clnt_lock);
+
+ mutex_enter(&c->c_lock);
+ /* if in transition need to wait for other thread to release */
+ while (c->c_refcnt) {
+ cv_wait(&c->c_cv, &c->c_lock);
+ }
+ c->c_closing = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+
+ /* make sure taskq has drained */
+ ddi_taskq_wait(c->c_tq);
+
+ /* release any engines that we were holding */
+ auimpl_engine_close(&c->c_ostream);
+ auimpl_engine_close(&c->c_istream);
+}
+
+audio_dev_t *
+auclnt_hold_dev_by_index(int index)
+{
+ return (auimpl_dev_hold_by_index(index));
+}
+
+void
+auclnt_release_dev(audio_dev_t *dev)
+{
+ auimpl_dev_release(dev);
+}
+
+audio_client_t *
+auclnt_hold_by_devt(dev_t dev)
+{
+ minor_t mn = getminor(dev);
+ major_t mj = getmajor(dev);
+ list_t *list;
+ audio_client_t *c;
+
+ list = &auimpl_clients;
+ /* linked list search is kind of inefficient, but it works */
+ rw_enter(&auimpl_client_lock, RW_READER);
+ for (c = list_head(list); c != NULL; c = list_next(list, c)) {
+ if ((c->c_major == mj) && (c->c_minor == mn)) {
+ mutex_enter(&c->c_lock);
+ if (c->c_is_open) {
+ c->c_refcnt++;
+ mutex_exit(&c->c_lock);
+ } else {
+ mutex_exit(&c->c_lock);
+ c = NULL;
+ }
+ break;
+ }
+ }
+ rw_exit(&auimpl_client_lock);
+ return (c);
+}
+
+void
+auclnt_release(audio_client_t *c)
+{
+ mutex_enter(&c->c_lock);
+ c->c_refcnt--;
+ if (c->c_refcnt == 0)
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+}
+
+void
+auclnt_dev_walk_clients(audio_dev_t *d,
+ int (*walker)(audio_client_t *, void *),
+ void *arg)
+{
+ list_t *l = &d->d_clients;
+ audio_client_t *c;
+ int rv;
+
+ rw_enter(&d->d_clnt_lock, RW_READER);
+restart:
+ for (c = list_head(l); c != NULL; c = list_next(l, c)) {
+ rv = (walker(c, arg));
+ if (rv == AUDIO_WALK_STOP) {
+ break;
+ } else if (rv == AUDIO_WALK_RESTART) {
+ goto restart;
+ }
+ }
+ rw_exit(&d->d_clnt_lock);
+}
+
+
+int
+auclnt_open(audio_client_t *c, unsigned fmts, int oflag)
+{
+ audio_stream_t *sp;
+ audio_dev_t *d = c->c_dev;
+ int rv = 0;
+ int flags;
+ audio_parms_t parms;
+
+ flags = 0;
+ if (oflag & FNDELAY)
+ flags |= ENGINE_NDELAY;
+
+ if (oflag & FWRITE) {
+ sp = &c->c_ostream;
+ rv = auimpl_engine_open(d, fmts, flags | ENGINE_OUTPUT, sp);
+
+ if (rv != 0) {
+ goto done;
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ rv = auimpl_format_setup(sp, &parms);
+ mutex_exit(&sp->s_lock);
+ if (rv != 0) {
+ goto done;
+ }
+ }
+
+ if (oflag & FREAD) {
+ sp = &c->c_istream;
+ rv = auimpl_engine_open(d, fmts, flags | ENGINE_INPUT, sp);
+
+ if (rv != 0) {
+ goto done;
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ rv = auimpl_format_setup(sp, &parms);
+ mutex_exit(&sp->s_lock);
+ if (rv != 0) {
+ goto done;
+ }
+ }
+
+ if (ddi_taskq_dispatch(c->c_tq, auimpl_client_task, c, DDI_NOSLEEP) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(d, "unable to start client taskq");
+ rv = ENOMEM;
+ }
+
+done:
+ if (rv != 0) {
+ /* close any engines that we opened */
+ auimpl_engine_close(&c->c_ostream);
+ auimpl_engine_close(&c->c_istream);
+ } else {
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ list_insert_tail(&d->d_clients, c);
+ c->c_ostream.s_gain_master = d->d_pcmvol;
+ c->c_istream.s_gain_master = 100;
+ rw_exit(&d->d_clnt_lock);
+ auclnt_set_gain(&c->c_ostream, 100);
+ auclnt_set_gain(&c->c_istream, 100);
+ }
+
+ return (rv);
+}
+
+minor_t
+auclnt_get_minor(audio_client_t *c)
+{
+ return (c->c_minor);
+}
+
+minor_t
+auclnt_get_original_minor(audio_client_t *c)
+{
+ return (c->c_origminor);
+}
+
+minor_t
+auclnt_get_minor_type(audio_client_t *c)
+{
+ return (c->c_origminor & AUDIO_MN_TYPE_MASK);
+}
+
+pid_t
+auclnt_get_pid(audio_client_t *c)
+{
+ return (c->c_pid);
+}
+
+cred_t *
+auclnt_get_cred(audio_client_t *c)
+{
+ return (c->c_cred);
+}
+
+audio_dev_t *
+auclnt_get_dev(audio_client_t *c)
+{
+ return (c->c_dev);
+}
+
+int
+auclnt_get_dev_number(audio_dev_t *dev)
+{
+ return (dev->d_number);
+}
+
+int
+auclnt_get_dev_index(audio_dev_t *dev)
+{
+ return (dev->d_index);
+}
+
+const char *
+auclnt_get_dev_name(audio_dev_t *dev)
+{
+ return (dev->d_name);
+}
+
+const char *
+auclnt_get_dev_driver(audio_dev_t *dev)
+{
+ return (ddi_driver_name(dev->d_dip));
+}
+
+dev_info_t *
+auclnt_get_dev_devinfo(audio_dev_t *dev)
+{
+ return (dev->d_dip);
+}
+
+const char *
+auclnt_get_dev_hw_info(audio_dev_t *dev, void **iter)
+{
+ struct audio_infostr *isp = *iter;
+ if (isp == NULL) {
+ isp = list_head(&dev->d_hwinfo);
+ } else {
+ isp = list_next(&dev->d_hwinfo, isp);
+ }
+
+ *iter = isp;
+ return (isp ? isp->i_line : NULL);
+}
+
+int
+auclnt_get_dev_instance(audio_dev_t *dev)
+{
+ return (dev->d_instance);
+}
+
+const char *
+auclnt_get_dev_description(audio_dev_t *dev)
+{
+ return (dev->d_desc);
+}
+
+const char *
+auclnt_get_dev_version(audio_dev_t *dev)
+{
+ return (dev->d_vers);
+}
+
+unsigned
+auclnt_get_dev_capab(audio_dev_t *dev)
+{
+ uint32_t flags;
+ unsigned caps = 0;
+
+ flags = dev->d_flags;
+
+ if (flags & DEV_OUTPUT_CAP)
+ caps |= AUDIO_CLIENT_CAP_PLAY;
+ if (flags & DEV_INPUT_CAP)
+ caps |= AUDIO_CLIENT_CAP_RECORD;
+ if (flags & DEV_DUPLEX_CAP)
+ caps |= AUDIO_CLIENT_CAP_DUPLEX;
+
+ /* AC3: deal with formats that don't support mixing */
+
+ return (caps);
+}
+
+void
+auclnt_notify_dev(audio_dev_t *dev)
+{
+ list_t *l = &dev->d_clients;
+ audio_client_t *c;
+
+ rw_enter(&dev->d_clnt_lock, RW_READER);
+ for (c = list_head(l); c != NULL; c = list_next(l, c)) {
+ mutex_enter(&c->c_lock);
+ c->c_do_notify = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+ rw_exit(&dev->d_clnt_lock);
+}
+
+uint64_t
+auclnt_get_samples(audio_stream_t *sp)
+{
+ uint64_t n;
+
+ mutex_enter(&sp->s_lock);
+ n = sp->s_samples;
+ mutex_exit(&sp->s_lock);
+ return (n);
+}
+
+void
+auclnt_set_samples(audio_stream_t *sp, uint64_t n)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_samples = n;
+ mutex_exit(&sp->s_lock);
+}
+
+uint64_t
+auclnt_get_errors(audio_stream_t *sp)
+{
+ uint64_t n;
+ mutex_enter(&sp->s_lock);
+ n = sp->s_errors;
+ mutex_exit(&sp->s_lock);
+ return (n);
+}
+
+void
+auclnt_set_errors(audio_stream_t *sp, uint64_t n)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_errors = n;
+ mutex_exit(&sp->s_lock);
+}
+
+void
+auclnt_register_ops(minor_t minor, audio_client_ops_t *ops)
+{
+ /* we control minor number allocations, no need for runtime checks */
+ ASSERT(minor <= AUDIO_MN_TYPE_MASK);
+
+ audio_client_ops[minor] = ops;
+}
+
+int
+auimpl_create_minors(audio_dev_t *d)
+{
+ char path[MAXPATHLEN];
+ int rv = 0;
+ minor_t minor;
+ audio_client_ops_t *ops;
+ char *nt;
+
+ for (int i = 0; i <= AUDIO_MN_TYPE_MASK; i++) {
+
+ if ((ops = audio_client_ops[i]) == NULL)
+ continue;
+
+ if (ops->aco_dev_init != NULL)
+ d->d_minor_data[i] = ops->aco_dev_init(d);
+
+ switch (i) {
+ case AUDIO_MINOR_SNDSTAT:
+ if (!(d->d_flags & DEV_SNDSTAT_CAP)) {
+ continue;
+ }
+ nt = DDI_PSEUDO;
+ break;
+
+ default:
+ if (!(d->d_flags & (DEV_INPUT_CAP| DEV_OUTPUT_CAP))) {
+ continue;
+ }
+ nt = DDI_NT_AUDIO;
+ break;
+ }
+
+ if (ops->aco_minor_prefix != NULL) {
+
+ minor = AUDIO_MKMN(d->d_instance, i);
+ (void) snprintf(path, sizeof (path),
+ "%s%d", ops->aco_minor_prefix, d->d_instance);
+
+ rv = ddi_create_minor_node(d->d_dip, path, S_IFCHR,
+ minor, nt, 0);
+
+ if (rv != 0)
+ break;
+ }
+ }
+ return (rv);
+}
+
+void
+auimpl_remove_minors(audio_dev_t *d)
+{
+ char path[MAXPATHLEN];
+ audio_client_ops_t *ops;
+
+ for (int i = 0; i <= AUDIO_MN_TYPE_MASK; i++) {
+ if ((ops = audio_client_ops[i]) == NULL)
+ continue;
+ if (ops->aco_minor_prefix != NULL) {
+ (void) snprintf(path, sizeof (path), "%s%d",
+ ops->aco_minor_prefix, d->d_instance);
+ (void) ddi_remove_minor_node(d->d_dip, path);
+ }
+
+ if (ops->aco_dev_fini != NULL)
+ ops->aco_dev_fini(d->d_minor_data[i]);
+ }
+}
+
+void *
+auclnt_get_dev_minor_data(audio_dev_t *d, minor_t mn)
+{
+ ASSERT(mn < (1U << AUDIO_MN_TYPE_NBITS));
+ return (d->d_minor_data[mn]);
+}
+
+void *
+auclnt_get_minor_data(audio_client_t *c, minor_t mn)
+{
+ ASSERT(mn < (1U << AUDIO_MN_TYPE_NBITS));
+ return (c->c_dev->d_minor_data[mn]);
+}
+
+/*
+ * This will walk all controls registered to a clients device and callback
+ * to walker for each one with its audio_ctrl. Note this data
+ * must be considered read only by walker.
+ *
+ * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
+ * or stop walk (AUDIO_WALK_STOP).
+ *
+ */
+void
+auclnt_walk_controls(audio_dev_t *d,
+ int (*walker)(audio_ctrl_t *, void *),
+ void *arg)
+{
+ audio_ctrl_t *ctrl;
+
+ rw_enter(&d->d_ctrl_lock, RW_READER);
+ for (ctrl = list_head(&d->d_controls); ctrl;
+ ctrl = list_next(&d->d_controls, ctrl)) {
+ if (walker(ctrl, arg) == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&d->d_ctrl_lock);
+}
+
+/*
+ * This will search all controls attached to an
+ * audio device for a control with the desired name.
+ *
+ * d - the audio device to look on
+ * name - name of the control being looked for.
+ *
+ * On successful return a ctrl handle will be returned. On
+ * failure NULL is returned.
+ */
+audio_ctrl_t *
+auclnt_find_control(audio_dev_t *d, const char *name)
+{
+ audio_ctrl_t *ctrl;
+
+ /* Verify argument */
+ ASSERT(d);
+
+ rw_enter(&d->d_ctrl_lock, RW_READER);
+ for (ctrl = list_head(&d->d_controls); ctrl;
+ ctrl = list_next(&d->d_controls, ctrl)) {
+ if (strcmp(ctrl->ctrl_name, name) == 0) {
+ rw_exit(&d->d_ctrl_lock);
+ return (ctrl);
+ }
+ }
+ rw_exit(&d->d_ctrl_lock);
+ return (NULL);
+}
+
+/*
+ * Given a known control, get its attributes.
+ *
+ * The caller must supply a audio_ctrl_desc_t structure. Also the
+ * values in the structure are ignored when making the call and filled
+ * in by this function. All data pointed to by elements of desc should
+ * be assumed read only.
+ *
+ * If an error occurs then a non-zero is returned.
+ *
+ */
+int
+auclnt_control_describe(audio_ctrl_t *ctrl, audio_ctrl_desc_t *desc)
+{
+ ASSERT(ctrl);
+ ASSERT(desc);
+
+ bcopy(&ctrl->ctrl_des, desc, sizeof (*desc));
+ return (0);
+}
+
+int
+auclnt_control_read(audio_ctrl_t *ctrl, uint64_t *value)
+{
+ return (audio_control_read(ctrl, value));
+}
+
+int
+auclnt_control_write(audio_ctrl_t *ctrl, uint64_t value)
+{
+ return (audio_control_write(ctrl, value));
+}
+
+void
+auclnt_warn(audio_client_t *c, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ auimpl_dev_vwarn(c ? c->c_dev : NULL, fmt, va);
+ va_end(va);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_client.h b/usr/src/uts/common/io/audio/impl/audio_client.h
new file mode 100644
index 0000000000..d38b1485a8
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_client.h
@@ -0,0 +1,260 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO_CLIENT_H
+#define _AUDIO_CLIENT_H
+
+/*
+ * Structure implementation in audio_impl.h
+ */
+#include <sys/audio/audio_common.h>
+
+typedef struct audio_client_ops {
+ const char *aco_minor_prefix;
+ void *(*aco_dev_init)(audio_dev_t *);
+ void (*aco_dev_fini)(void *);
+ int (*aco_open)(audio_client_t *, int);
+ void (*aco_close)(audio_client_t *);
+ int (*aco_read)(audio_client_t *, struct uio *, cred_t *);
+ int (*aco_write)(audio_client_t *, struct uio *, cred_t *);
+ int (*aco_ioctl)(audio_client_t *, int, intptr_t, int,
+ cred_t *, int *);
+ int (*aco_chpoll)(audio_client_t *, short, int, short *,
+ struct pollhead **);
+ int (*aco_mmap)(audio_client_t *, ...);
+ void (*aco_input)(audio_client_t *);
+ void (*aco_output)(audio_client_t *);
+ void (*aco_notify)(audio_client_t *);
+ void (*aco_drain)(audio_client_t *);
+} audio_client_ops_t;
+
+void *auclnt_get_private(audio_client_t *);
+void auclnt_set_private(audio_client_t *, void *);
+
+int auclnt_drain(audio_client_t *);
+int auclnt_start_drain(audio_client_t *);
+
+int auclnt_set_rate(audio_stream_t *, int);
+int auclnt_get_rate(audio_stream_t *);
+
+int auclnt_set_format(audio_stream_t *, int);
+int auclnt_get_format(audio_stream_t *);
+
+int auclnt_set_channels(audio_stream_t *, int);
+int auclnt_get_channels(audio_stream_t *);
+
+void auclnt_set_gain(audio_stream_t *, uint8_t);
+uint8_t auclnt_get_gain(audio_stream_t *);
+
+void auclnt_set_muted(audio_stream_t *, boolean_t);
+boolean_t auclnt_get_muted(audio_stream_t *);
+
+uint64_t auclnt_get_samples(audio_stream_t *);
+void auclnt_set_samples(audio_stream_t *, uint64_t);
+
+uint64_t auclnt_get_errors(audio_stream_t *);
+void auclnt_set_errors(audio_stream_t *, uint64_t);
+
+uint64_t auclnt_get_eof(audio_stream_t *);
+void auclnt_set_eof(audio_stream_t *, uint64_t);
+
+void auclnt_start(audio_stream_t *);
+void auclnt_stop(audio_stream_t *);
+
+void auclnt_set_paused(audio_stream_t *);
+void auclnt_clear_paused(audio_stream_t *);
+boolean_t auclnt_is_paused(audio_stream_t *);
+
+void auclnt_flush(audio_stream_t *);
+
+void auclnt_get_output_qlen(audio_client_t *, unsigned *, unsigned *);
+
+unsigned auclnt_get_fragsz(audio_stream_t *);
+unsigned auclnt_get_framesz(audio_stream_t *);
+unsigned auclnt_get_nfrags(audio_stream_t *);
+unsigned auclnt_get_nframes(audio_stream_t *);
+unsigned auclnt_get_count(audio_stream_t *);
+uint64_t auclnt_get_head(audio_stream_t *);
+uint64_t auclnt_get_tail(audio_stream_t *);
+unsigned auclnt_get_hidx(audio_stream_t *);
+unsigned auclnt_get_tidx(audio_stream_t *);
+
+audio_stream_t *auclnt_input_stream(audio_client_t *);
+audio_stream_t *auclnt_output_stream(audio_client_t *);
+
+int auclnt_get_oflag(audio_client_t *);
+
+int auclnt_open(audio_client_t *, unsigned, int);
+void auclnt_close(audio_client_t *);
+
+void auclnt_register_ops(minor_t, audio_client_ops_t *);
+
+minor_t auclnt_get_minor(audio_client_t *);
+minor_t auclnt_get_original_minor(audio_client_t *);
+minor_t auclnt_get_minor_type(audio_client_t *);
+
+unsigned auclnt_produce(audio_stream_t *, unsigned);
+unsigned auclnt_produce_data(audio_stream_t *, caddr_t, unsigned);
+unsigned auclnt_consume(audio_stream_t *, unsigned);
+unsigned auclnt_consume_data(audio_stream_t *, caddr_t, unsigned);
+int auclnt_read(audio_client_t *, struct uio *);
+int auclnt_write(audio_client_t *, struct uio *);
+int auclnt_chpoll(audio_client_t *, short, int, short *, struct pollhead **);
+void auclnt_pollwakeup(audio_client_t *, short);
+
+/*
+ * Return the process id that performed the original open() of the client.
+ */
+pid_t auclnt_get_pid(audio_client_t *);
+
+/*
+ * Return the credentials of the process that opened the client.
+ */
+cred_t *auclnt_get_cred(audio_client_t *);
+
+/*
+ * Get an opaque handle the underlying device for an audio client.
+ */
+audio_dev_t *auclnt_get_dev(audio_client_t *);
+audio_dev_t *auclnt_hold_dev_by_index(int);
+void auclnt_release_dev(audio_dev_t *);
+void auclnt_notify_dev(audio_dev_t *);
+int auclnt_get_dev_index(audio_dev_t *);
+int auclnt_get_dev_number(audio_dev_t *);
+void auclnt_set_dev_number(audio_dev_t *, int);
+const char *auclnt_get_dev_name(audio_dev_t *);
+const char *auclnt_get_dev_driver(audio_dev_t *);
+dev_info_t *auclnt_get_dev_devinfo(audio_dev_t *);
+int auclnt_get_dev_instance(audio_dev_t *);
+const char *auclnt_get_dev_description(audio_dev_t *);
+const char *auclnt_get_dev_version(audio_dev_t *);
+const char *auclnt_get_dev_hw_info(audio_dev_t *, void **);
+unsigned auclnt_get_dev_capab(audio_dev_t *);
+#define AUDIO_CLIENT_CAP_PLAY (1U << 0)
+#define AUDIO_CLIENT_CAP_RECORD (1U << 1)
+#define AUDIO_CLIENT_CAP_DUPLEX (1U << 2)
+#define AUDIO_CLIENT_CAP_SNDSTAT (1U << 3)
+
+/*
+ * Walk all the open client structures for a named audio device.
+ * Clients can use this to find "peer" clients accessing the same
+ * audio device. (This is useful for implementing special linkages,
+ * e.g. between /dev/audio and /dev/audioctl.)
+ */
+void auclnt_dev_walk_clients(audio_dev_t *,
+ int (*)(audio_client_t *, void *), void *);
+
+/*
+ * Audio control functions for use by clients.
+ */
+
+/*
+ * This will walk all controls registered to my device and callback
+ * to walker for each one with its audio_ctrl_desc_t..
+ *
+ * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
+ * or stop walk (AUDIO_WALK_STOP).
+ *
+ */
+void auclnt_walk_controls(audio_dev_t *,
+ int (*)(audio_ctrl_t *, void *), void *);
+
+/*
+ * This will search all controls attached to a clients
+ * audio device for a control with the desired name.
+ *
+ * On successful return a ctrl handle will be returned. On
+ * failure NULL is returned.
+ */
+audio_ctrl_t *auclnt_find_control(audio_dev_t *, const char *);
+
+/*
+ * Given a known control, get its attributes.
+ *
+ * The caller must supply a audio_ctrl_desc_t structure. Also the
+ * values in the structure are ignored when making the call and filled
+ * in by this function.
+ *
+ * If an error occurs then a non-zero is returned.
+ */
+int auclnt_control_describe(audio_ctrl_t *, audio_ctrl_desc_t *);
+
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int auclnt_control_read(audio_ctrl_t *, uint64_t *);
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int auclnt_control_write(audio_ctrl_t *, uint64_t);
+
+/*
+ * Walk all the audio devices on the system. Useful for clients
+ * like sndstat, which may need to inquire about every audio device
+ * on the system.
+ */
+void auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *);
+void auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *);
+
+audio_client_t *auclnt_hold_by_devt(dev_t);
+void auclnt_release(audio_client_t *);
+
+/*
+ * Engine rlated accesses. Note that normally clients don't need this level
+ * of information.
+ */
+void auclnt_dev_walk_engines(audio_dev_t *,
+ int (*)(audio_engine_t *, void *), void *);
+int auclnt_engine_get_format(audio_engine_t *);
+int auclnt_engine_get_rate(audio_engine_t *);
+int auclnt_engine_get_channels(audio_engine_t *);
+unsigned auclnt_engine_get_capab(audio_engine_t *);
+
+/*
+ * Retrieve minor-specific data for the instance. This allows for
+ * personality modules to store persistent state data on a physical
+ * device (e.g. to store persistent settings.) Synchronization of
+ * stored settings between personality modules is up to the
+ * personality modules themselves.
+ */
+void *auclnt_get_minor_data(audio_client_t *, minor_t);
+void *auclnt_get_dev_minor_data(audio_dev_t *, minor_t);
+
+/*
+ * Simpler warning message, alternative to cmn_err.
+ */
+void auclnt_warn(audio_client_t *, const char *fmt, ...);
+
+#endif /* _AUDIO_CLIENT_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_ctrl.c b/usr/src/uts/common/io/audio/impl/audio_ctrl.c
new file mode 100644
index 0000000000..64e7ca5549
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_ctrl.c
@@ -0,0 +1,375 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Control functions.
+ */
+
+/*
+ * Given a control structure - free all names
+ * strings allocated to it.
+ *
+ * ctrl - The control who's names that will be free'd.
+ */
+static void
+audio_control_freenames(audio_ctrl_t *ctrl)
+{
+ int indx;
+
+ if (ctrl->ctrl_name != NULL)
+ strfree((char *)ctrl->ctrl_name);
+ ctrl->ctrl_name = NULL;
+
+ for (indx = 0; indx < 64; indx++) {
+ if (ctrl->ctrl_enum[indx] != NULL) {
+ strfree((char *)ctrl->ctrl_enum[indx]);
+ ctrl->ctrl_enum[indx] = NULL;
+ }
+ }
+}
+
+/*
+ * This will allocate and register a control for my audio device.
+ *
+ * d - The audio device the control will be attached to.
+ * desc - Attributes about this new control
+ * read_fn - Callback function in driver to read control
+ * write_fn - Callback function in driver to write control.
+ * arg - driver private context passed to read_fn/write_fn
+ *
+ * On success this will return a control structure else NULL.
+ *
+ * The value passed in for a control number in the audio_ctrl_desc_t
+ * has some special meaning. If it is less then AUDIO_CONTROL_EXTBASE
+ * then the control is assumed to be a known control. If it is
+ * AUDIO_CONTROL_EXTBASE then the framework will allocate a unique
+ * control number and replace it in the audio_ctrl_desc_t structure
+ * and this control is considered an extended driver private control.
+ * The number that is replaced in audio_ctrl_desc_t will be greater
+ * then AUDIO_CONTROL_EXTBASE.
+ *
+ */
+audio_ctrl_t *
+audio_dev_add_control(audio_dev_t *d, audio_ctrl_desc_t *desc,
+ audio_ctrl_rd_t read_fn, audio_ctrl_wr_t write_fn, void *arg)
+{
+ audio_ctrl_t *ctrl;
+ audio_ctrl_desc_t *new_desc;
+ char scratch[16];
+ const char *name;
+
+ /* Verify arguments */
+ ASSERT(d);
+ ASSERT(desc);
+
+ /* We cannot deal with unnamed controls */
+ if ((name = desc->acd_name) == NULL) {
+ return (NULL);
+ }
+
+ /*
+ * If this was called with a control name that was already
+ * added, then we do some special things. First we reuse the
+ * control audio_ctrl_t and as far as outside users are
+ * concerned the handle is reused. To users this looks like we
+ * are changing the controls attributes. But what we really do
+ * is free every thing allocated to the control and then
+ * reinit everything. That way the same code can get used for
+ * both.
+ *
+ * We verify anything that could fail before we change the
+ * control or commit to any changes. If there is something bad
+ * return null to indicate an error but the original control
+ * is still usable and untouched.
+ */
+ ctrl = auclnt_find_control(d, name);
+
+ if (ctrl == NULL) {
+ /* Allocate a new control */
+ ctrl = kmem_zalloc(sizeof (*ctrl), KM_SLEEP);
+ } else {
+ /* Re-configure an existing control */
+ switch (desc->acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ case AUDIO_CTRL_TYPE_STEREO:
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_METER:
+ case AUDIO_CTRL_TYPE_ENUM:
+ break;
+ default:
+ audio_dev_warn(d, "bad control type %d for %s "
+ "not replaced", desc->acd_type, desc->acd_name);
+ return (NULL);
+ }
+
+ /*
+ * By removing it from the list we prevent the need to lock
+ * and check for locks on the control itself.
+ * Also by doing this we can use the normal add code to do
+ * what it normally does below.
+ */
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_remove(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ audio_control_freenames(ctrl);
+ ctrl->ctrl_read_fn = NULL;
+ ctrl->ctrl_write_fn = NULL;
+ ctrl->ctrl_arg = NULL;
+ ctrl->ctrl_dev = NULL;
+ mutex_destroy(&ctrl->ctrl_lock);
+ }
+ new_desc = &ctrl->ctrl_des;
+
+ /* Fill in new control description */
+ new_desc->acd_type = desc->acd_type;
+ new_desc->acd_flags = desc->acd_flags;
+ new_desc->acd_maxvalue = desc->acd_maxvalue;
+ new_desc->acd_minvalue = desc->acd_minvalue;
+ new_desc->acd_name = strdup(name);
+
+ /* Process type of control special actions, if any */
+ switch (desc->acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ case AUDIO_CTRL_TYPE_STEREO:
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_METER:
+ break;
+
+ case AUDIO_CTRL_TYPE_ENUM:
+ for (int bit = 0; bit < 64; bit++) {
+ if (((1U << bit) & desc->acd_maxvalue) == 0)
+ continue;
+ name = desc->acd_enum[bit];
+ if (name == NULL) {
+ (void) snprintf(scratch, sizeof (scratch),
+ "bit%d", bit);
+ name = scratch;
+ }
+ new_desc->acd_enum[bit] = strdup(name);
+ }
+ break;
+ default:
+ audio_dev_warn(d, "bad control type %d for %s",
+ desc->acd_type, desc->acd_name);
+ goto ctrl_fail;
+ }
+
+ ctrl->ctrl_dev = d;
+ if (new_desc->acd_flags & AUDIO_CTRL_FLAG_READABLE) {
+ ASSERT(read_fn);
+ ctrl->ctrl_read_fn = read_fn;
+ ctrl->ctrl_arg = arg;
+ }
+ if (new_desc->acd_flags & AUDIO_CTRL_FLAG_WRITEABLE) {
+ ASSERT(write_fn);
+ ctrl->ctrl_write_fn = write_fn;
+ ctrl->ctrl_arg = arg;
+ }
+
+ mutex_init(&ctrl->ctrl_lock, NULL, MUTEX_DRIVER, NULL);
+
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_insert_tail(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ return (ctrl);
+
+
+ctrl_fail:
+ if (ctrl) {
+ audio_control_freenames(ctrl);
+ kmem_free(ctrl, sizeof (*ctrl));
+ }
+ return (NULL);
+}
+
+/*
+ * This will remove a control from my audio device.
+ *
+ * ctrl - The control will be removed.
+ */
+void
+audio_dev_del_control(audio_ctrl_t *ctrl)
+{
+ audio_dev_t *d;
+
+ /* Verify argument */
+ ASSERT(ctrl);
+ d = ctrl->ctrl_dev;
+ ASSERT(d);
+
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_remove(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ mutex_destroy(&ctrl->ctrl_lock);
+
+ audio_control_freenames(ctrl);
+ kmem_free(ctrl, sizeof (*ctrl));
+}
+
+static int
+auimpl_set_pcmvol(void *arg, uint64_t val)
+{
+ audio_dev_t *d = arg;
+ list_t *l = &d->d_clients;
+ audio_client_t *c;
+
+ if (val > 100) {
+ return (EINVAL);
+ }
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ d->d_pcmvol = val & 0xff;
+ for (c = list_head(l); c; c = list_next(l, c)) {
+ auimpl_set_gain_master(&c->c_ostream, (uint8_t)val);
+ }
+ rw_exit(&d->d_clnt_lock);
+ return (0);
+}
+
+static int
+auimpl_get_pcmvol(void *arg, uint64_t *val)
+{
+ audio_dev_t *d = arg;
+
+ *val = d->d_pcmvol;
+ return (0);
+}
+
+int
+audio_dev_add_soft_volume(audio_dev_t *d)
+{
+ audio_ctrl_desc_t desc;
+
+ bzero(&desc, sizeof (desc));
+ if (d->d_pcmvol_ctrl == NULL) {
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY |
+ AUDIO_CTRL_FLAG_PCMVOL;
+ d->d_pcmvol_ctrl = audio_dev_add_control(d, &desc,
+ auimpl_get_pcmvol, auimpl_set_pcmvol, d);
+ d->d_pcmvol = 75;
+ }
+ return (0);
+}
+
+/*
+ * This will notify clients of need to reread control
+ * values since they have changed.
+ *
+ * There will be a routine that allows a client to register
+ * a callback. All callbacks registered to this device should
+ * get called from this routine.
+ *
+ * d - The device that needs updates.
+ */
+void
+audio_dev_update_controls(audio_dev_t *d)
+{
+ auclnt_notify_dev(d);
+}
+
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * ctrl - should be the valid control being read.
+ * value - is a pointer to the place that will contain the value read.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int
+audio_control_read(audio_ctrl_t *ctrl, uint64_t *value)
+{
+ uint64_t my_value;
+ int ret;
+
+ /* Verify arguments */
+ ASSERT(ctrl);
+ ASSERT(value);
+ ASSERT(ctrl->ctrl_dev);
+
+ if (!(ctrl->ctrl_flags & AUDIO_CTRL_FLAG_READABLE)) {
+ return (ENXIO);
+ }
+
+ ASSERT(ctrl->ctrl_read_fn);
+
+ if ((ret = ctrl->ctrl_read_fn(ctrl->ctrl_arg, &my_value)) != 0) {
+ return (ret);
+ }
+
+ *value = my_value;
+
+ return (ret);
+}
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * ctrl - should be the valid control being written.
+ * value - is value to set the control to.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int
+audio_control_write(audio_ctrl_t *ctrl, uint64_t value)
+{
+ int ret;
+ audio_dev_t *d = ctrl->ctrl_dev;
+
+ /* Verify arguments */
+ ASSERT(ctrl);
+ ASSERT(d);
+
+ if (!(ctrl->ctrl_flags & AUDIO_CTRL_FLAG_WRITEABLE)) {
+ return (ENXIO);
+ }
+
+ ASSERT(ctrl->ctrl_write_fn);
+
+ ret = ctrl->ctrl_write_fn(ctrl->ctrl_arg, value);
+
+ if (ret == 0)
+ audio_dev_update_controls(d);
+
+ return (ret);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_ddi.c b/usr/src/uts/common/io/audio/impl/audio_ddi.c
new file mode 100644
index 0000000000..56138bc28c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_ddi.c
@@ -0,0 +1,465 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/stropts.h>
+#include <sys/strsun.h>
+#include <sys/list.h>
+#include <sys/mkdev.h>
+#include <sys/conf.h>
+#include <sys/note.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio DDI glue implementation.
+ */
+
+/*
+ * The audio module is itself a pseudo driver, as it contains the
+ * logic to support un-associated nodes. (Think generic /dev/mixer
+ * and /dev/sndstat used by OSS.)
+ */
+static int
+audio_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audio_dev_t *adev;
+
+ /* pseudo devices don't need S/R support */
+ if ((cmd != DDI_ATTACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ /* this can't fail */
+ adev = audio_dev_alloc(dip, 0);
+ adev->d_flags = DEV_SNDSTAT_CAP;
+ audio_dev_set_description(adev, "Audio Common Code");
+ audio_dev_set_version(adev, "pseudo");
+ ddi_set_driver_private(dip, adev);
+
+ /* look up our properties! */
+
+ if (audio_dev_register(adev) != NULL) {
+ audio_dev_free(adev);
+ return (DDI_FAILURE);
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audio_dev_t *adev;
+
+ /* pseudo devices don't need S/R support */
+ if (cmd != DDI_DETACH) {
+ return (DDI_FAILURE);
+ }
+
+ if (dip == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ if ((adev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ if (audio_dev_unregister(adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio_dev_free(adev);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resp)
+{
+ dip = NULL;
+
+ if (getminor((dev_t)arg) & AUDIO_MN_CLONE_MASK) {
+ audio_client_t *c;
+ c = auclnt_hold_by_devt((dev_t)arg);
+ if (c != NULL) {
+ dip = c->c_dev->d_dip;
+ auclnt_release(c);
+ }
+ } else {
+ audio_dev_t *adev;
+ if ((adev = auimpl_dev_hold_by_devt((dev_t)arg)) != NULL) {
+ dip = adev->d_dip;
+ auimpl_dev_release(adev);
+ }
+ }
+
+ if (dip == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_INFO_DEVT2DEVINFO:
+ *resp = dip;
+ break;
+ case DDI_INFO_DEVT2INSTANCE:
+ *resp = (void *)(uintptr_t)ddi_get_instance(dip);
+ break;
+ default:
+ *resp = NULL;
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_open(dev_t *devp, int oflag, int otyp, cred_t *credp)
+{
+ int rv;
+ audio_client_t *c;
+
+ if (otyp == OTYP_BLK) {
+ return (ENXIO);
+ }
+
+ if ((c = auimpl_client_create(*devp)) == NULL) {
+ audio_dev_warn(NULL, "client create failed");
+ return (ENXIO);
+ }
+
+ c->c_omode = oflag;
+ c->c_pid = ddi_get_pid();
+ c->c_cred = credp;
+
+ /*
+ * Call client/personality specific open handler. Note that
+ * we "insist" that there is an open. The personality layer
+ * will initialize/allocate any engines required.
+ *
+ * Hmm... do we need to pass in the cred?
+ */
+ if ((rv = c->c_open(c, oflag)) != 0) {
+ audio_dev_warn(c->c_dev, "open failed (rv %d)", rv);
+ auimpl_client_destroy(c);
+ return (rv);
+ }
+
+ /* we do device cloning! */
+ *devp = makedevice(c->c_major, c->c_minor);
+
+ mutex_enter(&c->c_lock);
+ c->c_is_open = B_TRUE;
+ mutex_exit(&c->c_lock);
+
+ auclnt_notify_dev(c->c_dev);
+
+ return (0);
+}
+
+static int
+audio_close(dev_t dev, int flag, int otyp, cred_t *credp)
+{
+ audio_client_t *c;
+ audio_dev_t *d;
+
+ _NOTE(ARGUNUSED(flag));
+ _NOTE(ARGUNUSED(credp));
+ _NOTE(ARGUNUSED(otyp));
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ audio_dev_warn(NULL, "close on bugs devt %x,%x",
+ getmajor(dev), getminor(dev));
+ return (ENXIO);
+ }
+
+ mutex_enter(&c->c_lock);
+ c->c_is_open = B_FALSE;
+ mutex_exit(&c->c_lock);
+
+ /*
+ * Pick up any data sitting around in input buffers. This
+ * avoids leaving record data stuck in queues.
+ */
+ if (c->c_istream.s_engine != NULL)
+ audio_engine_produce(c->c_istream.s_engine);
+
+ /* get a local hold on the device */
+ d = c->c_dev;
+ auimpl_dev_hold(c->c_dev);
+
+ /*
+ * NB: This must be done before c->c_close, since it calls
+ * auclnt_close which will block waiting for the refence count
+ * to drop to zero.
+ */
+ auclnt_release(c);
+
+ /* Call personality specific close handler */
+ c->c_close(c);
+
+ auimpl_client_destroy(c);
+
+ /* notify peers that a change has occurred */
+ auclnt_notify_dev(d);
+
+ /* now we can drop the release we had on the device */
+ auimpl_dev_release(d);
+
+ return (0);
+}
+
+static int
+audio_write(dev_t dev, struct uio *uio, cred_t *credp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_write == NULL) ? ENXIO : c->c_write(c, uio, credp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_read(dev_t dev, struct uio *uio, cred_t *credp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_read == NULL) ? ENXIO : c->c_read(c, uio, credp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_ioctl == NULL) ? ENXIO : c->c_ioctl(c, cmd, arg, mode,
+ credp, rvalp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_chpoll(dev_t dev, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_chpoll == NULL) ?
+ ENXIO :
+ c->c_chpoll(c, events, anyyet, reventsp, phpp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+struct cb_ops audio_cb_ops = {
+ audio_open, /* open */
+ audio_close, /* close */
+ nodev, /* strategy */
+ nodev, /* print */
+ nodev, /* dump */
+ audio_read, /* read */
+ audio_write, /* write */
+ audio_ioctl, /* ioctl */
+ nodev, /* devmap */
+ nodev, /* mmap */
+ nodev, /* segmap */
+ audio_chpoll, /* chpoll */
+ ddi_prop_op, /* prop_op */
+ NULL, /* str */
+ D_MP | D_64BIT, /* flag */
+ CB_REV, /* rev */
+ nodev, /* aread */
+ nodev, /* awrite */
+};
+
+static struct dev_ops audio_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ audio_getinfo, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audio_attach, /* attach */
+ audio_detach, /* detach */
+ nodev, /* reset */
+ &audio_cb_ops, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+};
+
+static struct modldrv modldrv = {
+ &mod_driverops,
+ "Audio Framework",
+ &audio_dev_ops,
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1, /* MODREV_1 indicated by manual */
+ &modldrv,
+ NULL
+};
+
+struct audio_ops_helper {
+ struct cb_ops cbops;
+};
+
+void
+audio_init_ops(struct dev_ops *devops, const char *name)
+{
+ _NOTE(ARGUNUSED(name));
+
+ struct audio_ops_helper *helper;
+
+ helper = kmem_zalloc(sizeof (*helper), KM_SLEEP);
+
+ helper->cbops.cb_open = audio_open;
+ helper->cbops.cb_close = audio_close;
+ helper->cbops.cb_strategy = nodev;
+ helper->cbops.cb_print = nodev;
+ helper->cbops.cb_dump = nodev;
+ helper->cbops.cb_read = audio_read;
+ helper->cbops.cb_write = audio_write;
+ helper->cbops.cb_ioctl = audio_ioctl;
+ helper->cbops.cb_devmap = nodev;
+ helper->cbops.cb_mmap = nodev;
+ helper->cbops.cb_segmap = nodev;
+ helper->cbops.cb_chpoll = audio_chpoll;
+ helper->cbops.cb_prop_op = ddi_prop_op;
+ helper->cbops.cb_str = NULL;
+ helper->cbops.cb_flag = D_MP | D_64BIT;
+ helper->cbops.cb_rev = CB_REV;
+ helper->cbops.cb_aread = nodev;
+ helper->cbops.cb_awrite = nodev;
+
+ devops->devo_cb_ops = &helper->cbops;
+ devops->devo_getinfo = audio_getinfo;
+}
+
+void
+audio_fini_ops(struct dev_ops *devops)
+{
+ kmem_free(devops->devo_cb_ops, sizeof (struct audio_ops_helper));
+ devops->devo_cb_ops = NULL;
+ devops->devo_getinfo = NULL;
+}
+
+void
+auimpl_dev_vwarn(audio_dev_t *dev, const char *fmt, va_list va)
+{
+ char buf[256];
+
+ if (dev != NULL) {
+ (void) snprintf(buf, sizeof (buf), "%s#%d: %s",
+ ddi_driver_name(dev->d_dip), ddi_get_instance(dev->d_dip),
+ fmt);
+ } else {
+ (void) snprintf(buf, sizeof (buf), "audio: %s", fmt);
+ }
+
+ vcmn_err(CE_WARN, buf, va);
+}
+
+
+void
+audio_dev_warn(audio_dev_t *dev, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ auimpl_dev_vwarn(dev, fmt, va);
+ va_end(va);
+}
+
+/*
+ * _init, _info, and _fini DDI glue.
+ */
+int
+_init(void)
+{
+ int rv;
+
+ auimpl_client_init();
+ auimpl_dev_init();
+ auimpl_sun_init();
+ auimpl_oss_init();
+
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ auimpl_dev_fini();
+ auimpl_client_fini();
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) != 0)
+ return (rv);
+
+ auimpl_dev_fini();
+ auimpl_client_fini();
+
+ return (rv);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_engine.c b/usr/src/uts/common/io/audio/impl/audio_engine.c
new file mode 100644
index 0000000000..0d48587991
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_engine.c
@@ -0,0 +1,1197 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/callb.h>
+#include <sys/kstat.h>
+#include <sys/note.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Engine functions.
+ */
+
+audio_dev_t *
+audio_dev_alloc(dev_info_t *dip, int instance)
+{
+ audio_dev_t *d;
+
+ /*
+ * For a card with multiple independent audio ports on it, we
+ * allow the driver to provide a different instance numbering
+ * scheme than the standard DDI instance number. (This is
+ * sort of like the PPA numbering scheme used by NIC drivers
+ * -- by default PPA == instance, but sometimes we need more
+ * flexibility.)
+ */
+ if (instance == 0) {
+ instance = ddi_get_instance(dip);
+ }
+ /* generally this shouldn't occur */
+ if (instance > AUDIO_MN_INST_MASK) {
+ audio_dev_warn(NULL, "bad instance number for %s (%d)",
+ ddi_driver_name(dip), instance);
+ return (NULL);
+ }
+
+ if ((d = kmem_zalloc(sizeof (*d), KM_NOSLEEP)) == NULL) {
+ audio_dev_warn(NULL, "unable to allocate audio device struct");
+ return (NULL);
+ }
+ d->d_dip = dip;
+ d->d_number = -1;
+ d->d_major = ddi_driver_major(dip);
+ d->d_instance = instance;
+ d->d_pcmvol = 100;
+ mutex_init(&d->d_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&d->d_cv, NULL, CV_DRIVER, NULL);
+ rw_init(&d->d_ctrl_lock, NULL, RW_DRIVER, NULL);
+ rw_init(&d->d_clnt_lock, NULL, RW_DRIVER, NULL);
+ list_create(&d->d_clients, sizeof (struct audio_client),
+ offsetof(struct audio_client, c_dev_linkage));
+ list_create(&d->d_engines, sizeof (struct audio_engine),
+ offsetof(struct audio_engine, e_dev_linkage));
+ list_create(&d->d_controls, sizeof (struct audio_ctrl),
+ offsetof(struct audio_ctrl, ctrl_linkage));
+ list_create(&d->d_hwinfo, sizeof (struct audio_infostr),
+ offsetof(struct audio_infostr, i_linkage));
+ (void) snprintf(d->d_name, sizeof (d->d_name), "%s#%d",
+ ddi_driver_name(dip), instance);
+
+ return (d);
+}
+
+void
+audio_dev_free(audio_dev_t *d)
+{
+ struct audio_infostr *isp;
+ while ((isp = list_remove_head(&d->d_hwinfo)) != NULL) {
+ kmem_free(isp, sizeof (*isp));
+ }
+ if (d->d_pcmvol_ctrl != NULL) {
+ audio_dev_del_control(d->d_pcmvol_ctrl);
+ }
+ list_destroy(&d->d_hwinfo);
+ list_destroy(&d->d_engines);
+ list_destroy(&d->d_controls);
+ list_destroy(&d->d_clients);
+ rw_destroy(&d->d_ctrl_lock);
+ mutex_destroy(&d->d_lock);
+ cv_destroy(&d->d_cv);
+ rw_destroy(&d->d_clnt_lock);
+ kmem_free(d, sizeof (*d));
+}
+
+void
+audio_dev_set_description(audio_dev_t *d, const char *desc)
+{
+ (void) strlcpy(d->d_desc, desc, sizeof (d->d_desc));
+}
+
+void
+audio_dev_set_version(audio_dev_t *d, const char *vers)
+{
+ (void) strlcpy(d->d_vers, vers, sizeof (d->d_vers));
+}
+
+void
+audio_dev_add_info(audio_dev_t *d, const char *info)
+{
+ struct audio_infostr *isp;
+
+ /* failure to add information structure is not critical */
+ isp = kmem_zalloc(sizeof (*isp), KM_NOSLEEP);
+ if (isp == NULL) {
+ audio_dev_warn(d, "unable to allocate information structure");
+ } else {
+ (void) snprintf(isp->i_line, sizeof (isp->i_line), info);
+ list_insert_tail(&d->d_hwinfo, isp);
+ }
+}
+
+void
+audio_engine_consume(audio_engine_t *e)
+{
+ mutex_enter(&e->e_lock);
+ e->e_tail = ENG_COUNT(e);
+ if (e->e_tail > e->e_head) {
+ /* want more data than we have, not much we can do */
+ e->e_errors++;
+ }
+ auimpl_output_callback(e);
+ mutex_exit(&e->e_lock);
+}
+
+void
+audio_engine_produce(audio_engine_t *e)
+{
+ mutex_enter(&e->e_lock);
+ e->e_head = ENG_COUNT(e);
+ if ((e->e_head - e->e_tail) > e->e_nframes) {
+ /* no room for engine data, not much we can do */
+ e->e_errors++;
+ }
+ auimpl_input_callback(e);
+ mutex_exit(&e->e_lock);
+}
+
+void
+audio_engine_reset(audio_engine_t *e)
+{
+ char *buf;
+ char *ptr;
+ int nfr;
+ int tail;
+
+
+ if ((e->e_flags & (ENGINE_INPUT | ENGINE_OUTPUT)) == 0) {
+ /* engine not open, nothing to do */
+ return;
+ }
+
+ buf = kmem_alloc(e->e_nbytes, KM_SLEEP);
+ ptr = buf;
+
+ mutex_enter(&e->e_lock);
+
+ tail = e->e_tidx;
+ nfr = min(e->e_head - e->e_tail, e->e_nframes);
+ while (nfr) {
+ int cnt;
+ int nbytes;
+
+ cnt = min((e->e_nframes - tail), nfr);
+ nbytes = cnt * e->e_framesz;
+
+ bcopy(e->e_data + (tail * e->e_framesz), ptr, nbytes);
+ ptr += nbytes;
+ tail += cnt;
+ if (tail >= e->e_framesz) {
+ tail -= e->e_framesz;
+ }
+ nfr -= cnt;
+ }
+
+ nfr = min(e->e_head - e->e_tail, e->e_nframes);
+ if (e->e_flags & ENGINE_INPUT) {
+ /* record */
+ e->e_hidx = 0;
+ e->e_tidx = (e->e_nframes - nfr) % e->e_nframes;
+ } else {
+ /* play */
+ e->e_hidx = nfr % e->e_nframes;
+ e->e_tidx = 0;
+ }
+
+ /* relocate from scratch area to destination */
+ bcopy(buf, e->e_data + (e->e_tidx * e->e_framesz), nfr * e->e_framesz);
+ mutex_exit(&e->e_lock);
+
+ kmem_free(buf, e->e_nbytes);
+}
+
+audio_engine_t *
+audio_engine_alloc(audio_engine_ops_t *ops, unsigned flags)
+{
+ int i;
+ audio_engine_t *e;
+
+ if (ops->audio_engine_version != AUDIO_ENGINE_VERSION) {
+ audio_dev_warn(NULL, "audio engine version mismatch: %d != %d",
+ ops->audio_engine_version, AUDIO_ENGINE_VERSION);
+ return (NULL);
+ }
+
+ /* NB: The ops vector must be held in persistent storage! */
+ e = kmem_zalloc(sizeof (audio_engine_t), KM_NOSLEEP);
+ if (e == NULL) {
+ audio_dev_warn(NULL, "unable to allocate engine struct");
+ return (NULL);
+ }
+ e->e_ops = *ops;
+ mutex_init(&e->e_lock, NULL, MUTEX_DRIVER, NULL);
+ list_create(&e->e_streams, sizeof (struct audio_stream),
+ offsetof(struct audio_stream, s_eng_linkage));
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ e->e_chbufs[i] = kmem_zalloc(sizeof (int32_t) * AUDIO_CHBUFS,
+ KM_NOSLEEP);
+ if (e->e_chbufs[i] == NULL) {
+ audio_dev_warn(NULL, "unable to allocate channel buf");
+ audio_engine_free(e);
+ return (NULL);
+ }
+ }
+
+ e->e_flags = flags & ENGINE_DRIVER_FLAGS;
+ return (e);
+}
+
+void
+audio_engine_free(audio_engine_t *e)
+{
+ int i;
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ if (e->e_chbufs[i] != NULL) {
+ kmem_free(e->e_chbufs[i],
+ sizeof (int32_t) * AUDIO_CHBUFS);
+ }
+ }
+ list_destroy(&e->e_streams);
+ mutex_destroy(&e->e_lock);
+ kmem_free(e, sizeof (*e));
+}
+
+static list_t auimpl_devs_by_index;
+static list_t auimpl_devs_by_number;
+static krwlock_t auimpl_dev_lock;
+
+/*
+ * Not for public consumption: Private interfaces.
+ */
+void
+auimpl_dev_hold(audio_dev_t *d)
+{
+ /* bump the reference count */
+ mutex_enter(&d->d_lock);
+ d->d_refcnt++;
+ mutex_exit(&d->d_lock);
+}
+
+audio_dev_t *
+auimpl_dev_hold_by_devt(dev_t dev)
+{
+ audio_dev_t *d;
+ major_t major;
+ int instance;
+ list_t *l = &auimpl_devs_by_index;
+
+ major = getmajor(dev);
+ instance = (getminor(dev) >> AUDIO_MN_INST_SHIFT) & AUDIO_MN_INST_MASK;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ if ((d->d_major == major) && (d->d_instance == instance)) {
+ auimpl_dev_hold(d);
+ break;
+ }
+ }
+
+ rw_exit(&auimpl_dev_lock);
+ return (d);
+}
+
+audio_dev_t *
+auimpl_dev_hold_by_index(int index)
+{
+ audio_dev_t *d;
+ list_t *l = &auimpl_devs_by_index;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ if (d->d_index == index) {
+ auimpl_dev_hold(d);
+ break;
+ }
+ }
+
+ rw_exit(&auimpl_dev_lock);
+ return (d);
+}
+
+void
+auimpl_dev_release(audio_dev_t *d)
+{
+ mutex_enter(&d->d_lock);
+ d->d_refcnt--;
+ mutex_exit(&d->d_lock);
+}
+
+int
+auimpl_choose_format(int fmts)
+{
+ /*
+ * Choose the very best format we can. We choose 24 bit in
+ * preference to 32 bit because we mix in 24 bit. We do that
+ * to allow overflows to fit within 32-bits. (Very few humans
+ * can tell a difference between 24 and 32 bit audio anyway.)
+ */
+ if (fmts & AUDIO_FORMAT_S24_NE)
+ return (AUDIO_FORMAT_S24_NE);
+
+ if (fmts & AUDIO_FORMAT_S32_NE)
+ return (AUDIO_FORMAT_S32_NE);
+
+ if (fmts & AUDIO_FORMAT_S24_OE)
+ return (AUDIO_FORMAT_S24_OE);
+
+ if (fmts & AUDIO_FORMAT_S32_OE)
+ return (AUDIO_FORMAT_S32_OE);
+
+ if (fmts & AUDIO_FORMAT_S16_NE)
+ return (AUDIO_FORMAT_S16_NE);
+
+ if (fmts & AUDIO_FORMAT_S16_OE)
+ return (AUDIO_FORMAT_S16_OE);
+
+ if (fmts & AUDIO_FORMAT_AC3)
+ return (AUDIO_FORMAT_AC3);
+
+ return (AUDIO_FORMAT_NONE);
+}
+
+int
+auimpl_engine_open(audio_dev_t *d, int fmts, int flags, audio_stream_t *sp)
+{
+ audio_engine_t *e = NULL;
+ list_t *list;
+ unsigned caps;
+ int priority = 0;
+ int rv = ENODEV;
+ int sampsz;
+ int i;
+
+ /*
+ * Engine selection:
+ *
+ * We try hard to avoid consuming an engine that can be used
+ * for another purpose.
+ *
+ */
+
+ /*
+ * Which direction are we opening. (We must open exactly
+ * one direction, otherwise the open is meaningless.)
+ */
+ if (flags & ENGINE_OUTPUT)
+ caps = ENGINE_OUTPUT_CAP;
+ else if (flags & ENGINE_INPUT)
+ caps = ENGINE_INPUT_CAP;
+ else
+ return (EINVAL);
+
+ list = &d->d_engines;
+
+ mutex_enter(&d->d_lock);
+
+ /*
+ * First we want to know if we already have "default" input
+ * and output engines.
+ */
+
+again:
+
+ for (audio_engine_t *t = list_head(list); t; t = list_next(list, t)) {
+ int mypri;
+
+ /* make sure the engine can do what we want it to */
+ mutex_enter(&t->e_lock);
+ if ((((t->e_flags & caps) & caps) == 0) ||
+ ((ENG_FORMAT(t) & fmts) == 0)) {
+ mutex_exit(&t->e_lock);
+ continue;
+ }
+
+ /* if engine is in exclusive use, can't do it */
+ if (t->e_flags & ENGINE_EXCLUSIVE) {
+ mutex_exit(&t->e_lock);
+ rv = EBUSY;
+ continue;
+ }
+
+ /* if engine is in incompatible use, can't do it */
+ if (((flags & ENGINE_INPUT) && (t->e_flags & ENGINE_OUTPUT)) ||
+ ((flags & ENGINE_OUTPUT) && (t->e_flags & ENGINE_INPUT))) {
+ mutex_exit(&t->e_lock);
+ rv = EBUSY;
+ continue;
+ }
+
+ /*
+ * In order to support as many different possible
+ * output streams (e.g. AC3 passthru or AC3 decode),
+ * or multiple exclusive outputs, we treat audio
+ * engines as *precious*.
+ *
+ * This means that we will try hard to reuse an
+ * existing allocated engine. This may not be the
+ * optimal performance configuration (especially if we
+ * wanted to avoid rate conversion, for example), but
+ * it should have fewer cases where the configuration
+ * results in denying service to any client.
+ */
+
+ rv = 0;
+ mypri = 2000;
+
+ /* try not to pick on idle engines */
+ if (list_is_empty(&t->e_streams)) {
+ mypri -= 1000;
+ }
+
+ /* try not to pick on duplex engines first */
+ if ((t->e_flags & ENGINE_CAPS) != caps) {
+ mypri -= 100;
+ }
+
+ /* try not to pick on engines that can do other formats */
+ if (t->e_format & ~fmts) {
+ mypri -= 10;
+ }
+
+ if (mypri > priority) {
+ if (e != NULL) {
+ mutex_exit(&e->e_lock);
+ }
+ e = t;
+ priority = mypri;
+ } else {
+ mutex_exit(&t->e_lock);
+ }
+ }
+
+ if ((rv == EBUSY) && ((flags & ENGINE_NDELAY) == 0)) {
+ ASSERT(e == NULL);
+ if (cv_wait_sig(&d->d_cv, &d->d_lock) == 0) {
+ mutex_exit(&d->d_lock);
+ return (EINTR);
+ }
+ goto again;
+ }
+
+ if (rv != 0) {
+ ASSERT(e == NULL);
+ mutex_exit(&d->d_lock);
+ return (rv);
+ }
+
+ ASSERT(e != NULL);
+ ASSERT(mutex_owned(&e->e_lock));
+
+ /*
+ * If the engine is already open, there is no need for further
+ * work. The first open will be relatively expensive, but
+ * subsequent opens should be as cheap as possible.
+ */
+ if (!list_is_empty(&e->e_streams)) {
+ rv = 0;
+ goto ok;
+ }
+
+ e->e_format = ENG_FORMAT(e);
+ e->e_nchan = ENG_CHANNELS(e);
+ e->e_rate = ENG_RATE(e);
+
+ /* Find out the "best" sample format supported by the device */
+ switch (e->e_format) {
+ case AUDIO_FORMAT_S24_NE:
+ e->e_export = auimpl_export_24ne;
+ e->e_import = auimpl_import_24ne;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S32_NE:
+ e->e_export = auimpl_export_32ne;
+ e->e_import = auimpl_import_32ne;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S24_OE:
+ e->e_export = auimpl_export_24oe;
+ e->e_import = auimpl_import_24oe;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S32_OE:
+ e->e_export = auimpl_export_32oe;
+ e->e_import = auimpl_import_32oe;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S16_NE:
+ e->e_export = auimpl_export_16ne;
+ e->e_import = auimpl_import_16ne;
+ sampsz = 2;
+ break;
+ case AUDIO_FORMAT_S16_OE:
+ e->e_export = auimpl_export_16oe;
+ e->e_import = auimpl_import_16oe;
+ sampsz = 2;
+ break;
+ case AUDIO_FORMAT_AC3:
+ e->e_export = auimpl_export_24ne;
+ e->e_import = auimpl_import_24ne;
+ flags |= ENGINE_EXCLUSIVE;
+ sampsz = 2;
+ break;
+ default:
+ audio_dev_warn(d, "bad format");
+ rv = ENOTSUP;
+ goto done;
+ }
+
+ /* sanity test a few values */
+ if ((e->e_nchan < 0) || (e->e_nchan > AUDIO_MAX_CHANNELS) ||
+ (e->e_rate < 5000) || (e->e_rate > 192000)) {
+ audio_dev_warn(d, "bad engine channels or rate");
+ rv = EINVAL;
+ goto done;
+ }
+
+ rv = ENG_OPEN(e, &e->e_fragfr, &e->e_nfrags, &e->e_data);
+ if (rv != 0) {
+ audio_dev_warn(d, "unable to open engine");
+ goto done;
+ }
+ if ((e->e_fragfr < 1) || (e->e_data == NULL)) {
+ audio_dev_warn(d, "improper engine configuration");
+ rv = EINVAL;
+ goto done;
+ }
+
+ if ((e->e_fragfr > AUDIO_CHBUFS) || (e->e_nfrags < 2)) {
+ rv = EINVAL;
+ audio_dev_warn(d, "invalid fragment configuration");
+ goto done;
+ }
+
+ e->e_framesz = e->e_nchan * sampsz;
+ e->e_fragbytes = e->e_fragfr * e->e_framesz;
+ e->e_nframes = e->e_nfrags * e->e_fragfr;
+ e->e_intrs = e->e_rate / e->e_fragfr;
+ e->e_nbytes = e->e_nframes * e->e_framesz;
+ e->e_head = 0;
+ e->e_tail = 0;
+ e->e_hidx = 0;
+ e->e_tidx = 0;
+ e->e_limiter_state = 0x10000;
+ bzero(e->e_data, e->e_nbytes);
+
+ for (i = 0; i < e->e_nchan; i++) {
+ if (e->e_ops.audio_engine_chinfo == NULL) {
+ e->e_choffs[i] = i;
+ e->e_chincr[i] = e->e_nchan;
+ } else {
+ ENG_CHINFO(e, i, &e->e_choffs[i], &e->e_chincr[i]);
+ }
+ }
+
+ e->e_flags |= (ENGINE_OPEN | (flags & (ENGINE_OUTPUT | ENGINE_INPUT)));
+
+ /*
+ * Start the engine up now.
+ *
+ * AC3: Note that this will need to be modified for AC3, since
+ * for AC3 we can't start the device until we actually have
+ * some data for it from the application. Probably the best
+ * way to do this would be to add a flag, ENGINE_DEFERRED or
+ * somesuch.
+ */
+ if (e->e_ops.audio_engine_start != NULL) {
+ rv = ENG_START(e);
+ if (rv != 0) {
+ ENG_CLOSE(e);
+ goto done;
+ }
+ }
+
+ok:
+ sp->s_phys_parms->p_rate = e->e_rate;
+ sp->s_phys_parms->p_nchan = e->e_nchan;
+
+ list_insert_tail(&e->e_streams, sp);
+ sp->s_engine = e;
+
+done:
+ mutex_exit(&e->e_lock);
+ mutex_exit(&d->d_lock);
+ return (rv);
+}
+
+void
+auimpl_engine_close(audio_stream_t *sp)
+{
+ audio_engine_t *e = sp->s_engine;
+ audio_dev_t *d;
+
+ if (e == NULL)
+ return;
+
+ d = e->e_dev;
+
+ mutex_enter(&d->d_lock);
+ mutex_enter(&e->e_lock);
+ sp->s_engine = NULL;
+ list_remove(&e->e_streams, sp);
+ if (list_is_empty(&e->e_streams)) {
+ /* if last client holding engine open, close it all down */
+ if (e->e_ops.audio_engine_stop != NULL)
+ ENG_STOP(e);
+ e->e_flags &= ENGINE_DRIVER_FLAGS;
+ ENG_CLOSE(e);
+ }
+ mutex_exit(&e->e_lock);
+
+ cv_broadcast(&d->d_cv);
+ mutex_exit(&d->d_lock);
+}
+
+int
+audio_dev_register(audio_dev_t *d)
+{
+ list_t *l;
+ audio_dev_t *srch;
+ int start;
+
+ /*
+ * Make sure we don't automatically unload. This prevents
+ * loss of hardware settings when no audio clients are
+ * running.
+ */
+ (void) ddi_prop_update_int(DDI_DEV_T_NONE, d->d_dip,
+ DDI_NO_AUTODETACH, 1);
+
+ /*
+ * This does an in-order insertion, finding the first available
+ * free index. "Special" devices (ones without any actual engines)
+ * are all numbered 0. There should only be one of them anyway.
+ * All others start at one.
+ */
+ if (d->d_flags & DEV_SNDSTAT_CAP) {
+ start = 0;
+ } else {
+ start = 1;
+ }
+ d->d_index = start;
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ l = &auimpl_devs_by_index;
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ /* skip over special nodes */
+ if (srch->d_index < start)
+ continue;
+ if (srch->d_index > d->d_index) {
+ /* found a free spot! */
+ break;
+ }
+ d->d_index++;
+ }
+ /*
+ * NB: If srch is NULL, then list_insert_before puts
+ * it on the tail of the list. So if we didn't find a
+ * hole, then that's where we want it.
+ */
+ list_insert_before(l, srch, d);
+
+ /* insert in order by number */
+ l = &auimpl_devs_by_number;
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ if (srch->d_number >= d->d_number) {
+ break;
+ }
+ }
+ list_insert_before(l, srch, d);
+
+ rw_exit(&auimpl_dev_lock);
+
+ if (auimpl_create_minors(d) != 0) {
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ auimpl_remove_minors(d);
+ list_remove(&auimpl_devs_by_index, d);
+ list_remove(&auimpl_devs_by_number, d);
+ rw_exit(&auimpl_dev_lock);
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audio_dev_unregister(audio_dev_t *d)
+{
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+
+ mutex_enter(&d->d_lock);
+ /* if we are still in use, we can't unregister */
+ if (d->d_refcnt) {
+ mutex_exit(&d->d_lock);
+ rw_exit(&auimpl_dev_lock);
+ return (DDI_FAILURE);
+ }
+ auimpl_remove_minors(d);
+ list_remove(&auimpl_devs_by_index, d);
+ list_remove(&auimpl_devs_by_number, d);
+ mutex_exit(&d->d_lock);
+
+ rw_exit(&auimpl_dev_lock);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+auimpl_engine_ksupdate(kstat_t *ksp, int rw)
+{
+ audio_engine_t *e = ksp->ks_private;
+ struct audio_stats *st = &e->e_stats;
+
+ if (rw == KSTAT_WRITE) {
+ return (EACCES);
+ }
+
+ mutex_enter(&e->e_lock);
+ st->st_head.value.ui64 = e->e_head;
+ st->st_tail.value.ui64 = e->e_tail;
+ st->st_flags.value.ui32 = e->e_flags;
+ st->st_fragfr.value.ui32 = e->e_fragfr;
+ st->st_nfrags.value.ui32 = e->e_nfrags;
+ st->st_framesz.value.ui32 = e->e_framesz;
+ st->st_nbytes.value.ui32 = e->e_nbytes;
+ st->st_hidx.value.ui32 = e->e_hidx;
+ st->st_tidx.value.ui32 = e->e_tidx;
+ st->st_format.value.ui32 = e->e_format;
+ st->st_nchan.value.ui32 = e->e_nchan;
+ st->st_rate.value.ui32 = e->e_rate;
+ st->st_intrs.value.ui32 = e->e_intrs;
+ st->st_errors.value.ui32 = e->e_errors;
+ st->st_suspended.value.ui32 = e->e_suspended;
+ mutex_exit(&e->e_lock);
+
+ return (0);
+}
+
+static void
+auimpl_engine_ksinit(audio_dev_t *d, audio_engine_t *e)
+{
+ char name[32];
+ struct audio_stats *st;
+
+ (void) snprintf(name, sizeof (name), "engine_%d", e->e_num);
+
+ e->e_ksp = kstat_create(ddi_driver_name(d->d_dip), d->d_instance,
+ name, "misc", KSTAT_TYPE_NAMED,
+ sizeof (struct audio_stats) / sizeof (kstat_named_t), 0);
+
+ if (e->e_ksp == NULL) {
+ audio_dev_warn(d, "unable to initialize kstats");
+ return;
+ }
+
+ st = &e->e_stats;
+ e->e_ksp->ks_data = st;
+ e->e_ksp->ks_private = e;
+ e->e_ksp->ks_lock = NULL;
+ e->e_ksp->ks_update = auimpl_engine_ksupdate;
+ kstat_named_init(&st->st_head, "head", KSTAT_DATA_UINT64);
+ kstat_named_init(&st->st_tail, "tail", KSTAT_DATA_UINT64);
+ kstat_named_init(&st->st_flags, "flags", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_fragfr, "fragfr", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nfrags, "nfrags", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_framesz, "framesz", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nbytes, "nbytes", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_hidx, "hidx", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_tidx, "tidx", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_format, "format", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nchan, "channels", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_rate, "rate", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_intrs, "intrhz", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_errors, "errors", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_suspended, "suspended", KSTAT_DATA_UINT32);
+ kstat_install(e->e_ksp);
+}
+
+void
+audio_dev_add_engine(audio_dev_t *d, audio_engine_t *e)
+{
+ e->e_num = d->d_engno++;
+
+ mutex_enter(&d->d_lock);
+
+ auimpl_engine_ksinit(d, e);
+
+ /* check for duplex */
+ if ((e->e_flags & ENGINE_OUTPUT_CAP) && (d->d_flags & DEV_INPUT_CAP)) {
+ d->d_flags |= DEV_DUPLEX_CAP;
+ }
+ if ((e->e_flags & ENGINE_INPUT_CAP) && (d->d_flags & DEV_OUTPUT_CAP)) {
+ d->d_flags |= DEV_DUPLEX_CAP;
+ }
+ /* add in the direction caps -- must be done after duplex above */
+ if (e->e_flags & ENGINE_OUTPUT_CAP) {
+ d->d_flags |= DEV_OUTPUT_CAP;
+ }
+ if (e->e_flags & ENGINE_INPUT_CAP) {
+ d->d_flags |= DEV_INPUT_CAP;
+ }
+
+ list_insert_tail(&d->d_engines, e);
+ e->e_dev = d;
+ mutex_exit(&d->d_lock);
+}
+
+void
+audio_dev_remove_engine(audio_dev_t *d, audio_engine_t *e)
+{
+ mutex_enter(&d->d_lock);
+ list_remove(&d->d_engines, e);
+ e->e_dev = NULL;
+ if (e->e_ksp)
+ kstat_delete(e->e_ksp);
+ e->e_ksp = NULL;
+ mutex_exit(&d->d_lock);
+}
+
+/*
+ * Change the number.
+ */
+void
+auclnt_set_dev_number(audio_dev_t *d, int num)
+{
+ list_t *l = &auimpl_devs_by_number;
+ audio_dev_t *srch;
+
+ /* reorder our list */
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ d->d_number = num;
+ list_remove(l, d);
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ if (srch->d_number >= d->d_number) {
+ break;
+ }
+ }
+ list_insert_before(l, srch, d);
+
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ boolean_t cont;
+ list_t *l;
+
+ l = &auimpl_devs_by_index;
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ mutex_enter(&d->d_lock);
+ cont = walker(d, arg);
+ mutex_exit(&d->d_lock);
+ if (cont == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ boolean_t cont;
+ list_t *l;
+
+ l = &auimpl_devs_by_number;
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ mutex_enter(&d->d_lock);
+ cont = walker(d, arg);
+ mutex_exit(&d->d_lock);
+ if (cont == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_dev_walk_engines(audio_dev_t *d,
+ int (*walker)(audio_engine_t *, void *),
+ void *arg)
+{
+ audio_engine_t *e;
+ list_t *l = &d->d_engines;
+
+ mutex_enter(&d->d_lock);
+ for (e = list_head(l); e != NULL; e = list_next(l, e)) {
+ if (walker(e, arg) == AUDIO_WALK_STOP) {
+ break;
+ }
+ }
+ mutex_exit(&d->d_lock);
+}
+
+int
+auclnt_engine_get_format(audio_engine_t *e)
+{
+ return (ENG_FORMAT(e));
+}
+
+int
+auclnt_engine_get_channels(audio_engine_t *e)
+{
+ return (ENG_CHANNELS(e));
+}
+
+int
+auclnt_engine_get_rate(audio_engine_t *e)
+{
+ return (ENG_RATE(e));
+}
+
+unsigned
+auclnt_engine_get_capab(audio_engine_t *e)
+{
+ unsigned capab = 0;
+
+ if (e->e_flags & ENGINE_INPUT_CAP) {
+ capab |= AUDIO_CLIENT_CAP_RECORD;
+ }
+ if (e->e_flags & ENGINE_OUTPUT_CAP) {
+ capab |= AUDIO_CLIENT_CAP_PLAY;
+ }
+ return (capab);
+}
+
+static void
+auimpl_walk_engines(int (*walker)(audio_engine_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ audio_engine_t *e;
+ list_t *l1;
+ list_t *l2;
+ boolean_t done = B_FALSE;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ l1 = &auimpl_devs_by_index;
+ for (d = list_head(l1); d; d = list_next(l1, d)) {
+ mutex_enter(&d->d_lock);
+ l2 = &d->d_engines;
+ for (e = list_head(l2); e; e = list_next(l2, e)) {
+ if (walker(e, arg) == AUDIO_WALK_STOP) {
+ done = B_TRUE;
+ break;
+ }
+ }
+ mutex_exit(&d->d_lock);
+ if (done)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+/*
+ * This function suspends an engine. The intent is to pause the
+ * engine temporarily so that it does not underrun while user threads
+ * are suspended. The driver is still responsible for actually doing
+ * the driver suspend work -- all this does is put the engine in a
+ * paused state. It does not prevent, for example, threads from
+ * accessing the hardware.
+ *
+ * A properly implemented driver won't even be aware of the existence
+ * of this routine -- the driver will just handle the suspend &
+ * resume. At the point of suspend & resume, the driver will see that
+ * the engines are not running (as if all threads had "paused" it).
+ *
+ * Failure to execute either of the routines below is not critical,
+ * but will probably lead to underruns and overflows as the kernel
+ * driver gets resumed well in advance of the time when user threads
+ * are ready to start operation.
+ */
+static int
+auimpl_engine_suspend(audio_engine_t *e, void *dontcare)
+{
+ _NOTE(ARGUNUSED(dontcare));
+
+ mutex_enter(&e->e_lock);
+ e->e_suspended = B_TRUE;
+ mutex_exit(&e->e_lock);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+auimpl_engine_resume(audio_engine_t *e, void *dontcare)
+{
+ _NOTE(ARGUNUSED(dontcare));
+ mutex_enter(&e->e_lock);
+ e->e_suspended = B_FALSE;
+ mutex_exit(&e->e_lock);
+ return (AUDIO_WALK_CONTINUE);
+}
+
+boolean_t
+auimpl_cpr(void *arg, int code)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ switch (code) {
+ case CB_CODE_CPR_CHKPT:
+ auimpl_walk_engines(auimpl_engine_suspend, NULL);
+ return (B_TRUE);
+
+ case CB_CODE_CPR_RESUME:
+ auimpl_walk_engines(auimpl_engine_resume, NULL);
+ return (B_TRUE);
+
+ default:
+ return (B_FALSE);
+ }
+}
+
+static callb_id_t auimpl_cpr_id = 0;
+
+void
+auimpl_dev_init(void)
+{
+ rw_init(&auimpl_dev_lock, NULL, RW_DRIVER, NULL);
+ list_create(&auimpl_devs_by_index, sizeof (struct audio_dev),
+ offsetof(struct audio_dev, d_by_index));
+ list_create(&auimpl_devs_by_number, sizeof (struct audio_dev),
+ offsetof(struct audio_dev, d_by_number));
+
+ /*
+ * We "borrow" the CB_CL_CPR_PM class, which gets executed at
+ * about the right time for us. It would be nice to have a
+ * new CB_CL_CPR_AUDIO class, but it isn't critical at this
+ * point.
+ *
+ * Note that we don't care about our thread id.
+ */
+ auimpl_cpr_id = callb_add(auimpl_cpr, NULL, CB_CL_CPR_PM, "audio_cpr");
+}
+
+void
+auimpl_dev_fini(void)
+{
+ (void) callb_delete(auimpl_cpr_id);
+ list_destroy(&auimpl_devs_by_index);
+ list_destroy(&auimpl_devs_by_number);
+ rw_destroy(&auimpl_dev_lock);
+}
+
+void
+audio_engine_set_private(audio_engine_t *eng, void *prv)
+{
+ eng->e_private = prv;
+}
+
+void *
+audio_engine_get_private(audio_engine_t *eng)
+{
+ return (eng->e_private);
+}
+
+void
+audio_dump_bytes(const uint8_t *w, int dcount)
+{
+ char line[64];
+ char *s;
+ int i;
+ const int wrap = 16;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %02x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
+
+void
+audio_dump_words(const uint16_t *w, int dcount)
+{
+ char line[64];
+ char *s;
+ int i;
+ const int wrap = 8;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %04x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
+
+void
+audio_dump_dwords(const uint32_t *w, int dcount)
+{
+ char line[128];
+ char *s;
+ int i;
+ const int wrap = 4;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %08x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_fltdata.c b/usr/src/uts/common/io/audio/impl/audio_fltdata.c
new file mode 100644
index 0000000000..8c5887085e
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_fltdata.c
@@ -0,0 +1,9283 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+
+/*
+ * Purpose: Filter coefficient tables for GRC3
+ */
+
+const int32_t filter_data_L[4097] = {
+ 0, -43570, -87593, -132073, -177009, -222405, -268261, -314581,
+ -361366, -408617, -456336, -504526, -553189, -602325, -651938, -702028,
+ -752598, -803650, -855185, -907205, -959713, -1012709, -1066196,
+ -1120176, -1174650, -1229621, -1285089, -1341058, -1397528, -1454502,
+ -1511982, -1569968, -1628464, -1687470, -1746989, -1807023, -1867572,
+ -1928640, -1990227, -2052336, -2114969, -2178126, -2241810, -2306023,
+ -2370767, -2436042, -2501851, -2568196, -2635079, -2702500, -2770463,
+ -2838968, -2908017, -2977612, -3047755, -3118448, -3189691, -3261488,
+ -3333839, -3406746, -3480211, -3554236, -3628822, -3703971, -3779685,
+ -3855965, -3932813, -4010230, -4088218, -4166780, -4245915, -4325627,
+ -4405917, -4486785, -4568235, -4650267, -4732883, -4816085, -4899874,
+ -4984252, -5069220, -5154780, -5240933, -5327682, -5415027, -5502970,
+ -5591512, -5680656, -5770402, -5860752, -5951708, -6043271, -6135443,
+ -6228224, -6321617, -6415623, -6510244, -6605480, -6701333, -6797805,
+ -6894897, -6992611, -7090947, -7189908, -7289494, -7389707, -7490549,
+ -7592020, -7694123, -7796857, -7900226, -8004230, -8108870, -8214147,
+ -8320064, -8426621, -8533819, -8641661, -8750146, -8859276, -8969053,
+ -9079478, -9190552, -9302276, -9414651, -9527679, -9641360, -9755697,
+ -9870689, -9986339, -10102647, -10219615, -10337243, -10455532,
+ -10574485, -10694101, -10814383, -10935330, -11056944, -11179227,
+ -11302178, -11425800, -11550093, -11675058, -11800696, -11927008,
+ -12053996, -12181659, -12309999, -12439017, -12568714, -12699091,
+ -12830148, -12961887, -13094307, -13227412, -13361200, -13495673,
+ -13630832, -13766677, -13903209, -14040430, -14178339, -14316938,
+ -14456228, -14596208, -14736880, -14878245, -15020302, -15163054,
+ -15306500, -15450641, -15595478, -15741012, -15887242, -16034170,
+ -16181797, -16330122, -16479146, -16628871, -16779295, -16930421,
+ -17082248, -17234777, -17388008, -17541942, -17696580, -17851921,
+ -18007966, -18164716, -18322170, -18480330, -18639196, -18798767,
+ -18959045, -19120029, -19281720, -19444119, -19607224, -19771038,
+ -19935559, -20100788, -20266726, -20433372, -20600727, -20768791,
+ -20937563, -21107045, -21277236, -21448136, -21619746, -21792065,
+ -21965093, -22138831, -22313278, -22488435, -22664301, -22840876,
+ -23018161, -23196155, -23374859, -23554271, -23734392, -23915223,
+ -24096761, -24279008, -24461964, -24645627, -24829998, -25015077,
+ -25200863, -25387356, -25574556, -25762462, -25951074, -26140392,
+ -26330415, -26521143, -26712576, -26904712, -27097553, -27291096,
+ -27485342, -27680290, -27875940, -28072291, -28269343, -28467095,
+ -28665546, -28864695, -29064543, -29265089, -29466331, -29668269,
+ -29870903, -30074231, -30278253, -30482969, -30688377, -30894476,
+ -31101266, -31308746, -31516915, -31725772, -31935317, -32145547,
+ -32356463, -32568064, -32780347, -32993313, -33206961, -33421289,
+ -33636296, -33851981, -34068343, -34285381, -34503094, -34721480,
+ -34940539, -35160268, -35380668, -35601737, -35823472, -36045874,
+ -36268941, -36492671, -36717063, -36942116, -37167828, -37394198,
+ -37621224, -37848905, -38077240, -38306227, -38535863, -38766149,
+ -38997082, -39228661, -39460883, -39693748, -39927254, -40161398,
+ -40396180, -40631598, -40867649, -41104332, -41341645, -41579587,
+ -41818156, -42057349, -42297164, -42537601, -42778656, -43020329,
+ -43262616, -43505516, -43749028, -43993148, -44237875, -44483206,
+ -44729140, -44975675, -45222807, -45470536, -45718859, -45967773,
+ -46217276, -46467367, -46718042, -46969299, -47221137, -47473552,
+ -47726542, -47980105, -48234239, -48488940, -48744207, -49000036,
+ -49256426, -49513373, -49770876, -50028931, -50287535, -50546687,
+ -50806383, -51066621, -51327398, -51588711, -51850557, -52112934,
+ -52375839, -52639268, -52903220, -53167690, -53432677, -53698176,
+ -53964186, -54230703, -54497724, -54765245, -55033265, -55301779,
+ -55570785, -55840279, -56110259, -56380720, -56651661, -56923077,
+ -57194964, -57467321, -57740143, -58013428, -58287171, -58561369,
+ -58836019, -59111118, -59386661, -59662646, -59939068, -60215925,
+ -60493212, -60770926, -61049064, -61327621, -61606594, -61885979,
+ -62165772, -62445970, -62726569, -63007564, -63288953, -63570731,
+ -63852894, -64135438, -64418360, -64701655, -64985319, -65269349,
+ -65553739, -65838487, -66123588, -66409037, -66694831, -66980965,
+ -67267436, -67554238, -67841368, -68128821, -68416593, -68704680,
+ -68993076, -69281779, -69570782, -69860083, -70149675, -70439556,
+ -70729720, -71020162, -71310878, -71601864, -71893114, -72184624,
+ -72476390, -72768406, -73060668, -73353171, -73645909, -73938880,
+ -74232076, -74525494, -74819129, -75112975, -75407028, -75701282,
+ -75995733, -76290376, -76585205, -76880215, -77175401, -77470758,
+ -77766281, -78061964, -78357803, -78653792, -78949925, -79246197,
+ -79542604, -79839139, -80135797, -80432572, -80729460, -81026455,
+ -81323551, -81620742, -81918024, -82215389, -82512834, -82810352,
+ -83107937, -83405584, -83703287, -84001040, -84298837, -84596673,
+ -84894542, -85192437, -85490354, -85788285, -86086225, -86384169,
+ -86682109, -86980041, -87277957, -87575852, -87873720, -88171554,
+ -88469349, -88767098, -89064795, -89362433, -89660007, -89957510,
+ -90254936, -90552278, -90849530, -91146685, -91443738, -91740681,
+ -92037509, -92334214, -92630790, -92927231, -93223529, -93519679,
+ -93815673, -94111506, -94407169, -94702657, -94997963, -95293079,
+ -95588000, -95882717, -96177226, -96471517, -96765585, -97059423,
+ -97353024, -97646380, -97939484, -98232330, -98524911, -98817219,
+ -99109247, -99400988, -99692436, -99983581, -100274419, -100564940,
+ -100855138, -101145006, -101434536, -101723721, -102012553, -102301026,
+ -102589131, -102876861, -103164209, -103451167, -103737727, -104023883,
+ -104309626, -104594949, -104879843, -105164303, -105448319, -105731884,
+ -106014991, -106297631, -106579796, -106861480, -107142674, -107423370,
+ -107703560, -107983236, -108262391, -108541017, -108819105, -109096647,
+ -109373636, -109650063, -109925920, -110201200, -110475893, -110749992,
+ -111023489, -111296375, -111568643, -111840283, -112111288, -112381649,
+ -112651358, -112920406, -113188786, -113456489, -113723506, -113989829,
+ -114255449, -114520359, -114784548, -115048010, -115310735, -115572715,
+ -115833940, -116094404, -116354096, -116613008, -116871131, -117128457,
+ -117384977, -117640682, -117895564, -118149613, -118402820, -118655178,
+ -118906676, -119157307, -119407060, -119655927, -119903900, -120150969,
+ -120397125, -120642359, -120886662, -121130025, -121372438, -121613894,
+ -121854382, -122093893, -122332418, -122569949, -122806475, -123041988,
+ -123276477, -123509935, -123742351, -123973717, -124204022, -124433258,
+ -124661415, -124888484, -125114455, -125339319, -125563066, -125785687,
+ -126007172, -126227512, -126446697, -126664718, -126881565, -127097228,
+ -127311698, -127524965, -127737019, -127947852, -128157452, -128365810,
+ -128572918, -128778764, -128983338, -129186633, -129388636, -129589339,
+ -129788732, -129986805, -130183547, -130378950, -130573002, -130765695,
+ -130957018, -131146961, -131335514, -131522667, -131708411, -131892735,
+ -132075628, -132257082, -132437085, -132615628, -132792701, -132968293,
+ -133142395, -133314995, -133486085, -133655653, -133823690, -133990184,
+ -134155127, -134318508, -134480316, -134640541, -134799172, -134956201,
+ -135111615, -135265405, -135417561, -135568071, -135716926, -135864115,
+ -136009628, -136153454, -136295583, -136436004, -136574707, -136711682,
+ -136846917, -136980402, -137112128, -137242082, -137370255, -137496636,
+ -137621215, -137743980, -137864922, -137984030, -138101292, -138216698,
+ -138330239, -138441902, -138551678, -138659555, -138765523, -138869571,
+ -138971689, -139071865, -139170090, -139266351, -139360639, -139452943,
+ -139543251, -139631554, -139717840, -139802098, -139884317, -139964488,
+ -140042598, -140118638, -140192595, -140264460, -140334221, -140401868,
+ -140467389, -140530774, -140592011, -140651091, -140708001, -140762732,
+ -140815271, -140865608, -140913733, -140959634, -141003299, -141044719,
+ -141083882, -141120778, -141155394, -141187721, -141217746, -141245460,
+ -141270851, -141293908, -141314620, -141332976, -141348965, -141362575,
+ -141373797, -141382618, -141389028, -141393015, -141394570, -141393679,
+ -141390333, -141384520, -141376229, -141365450, -141352170, -141336379,
+ -141318066, -141297220, -141273829, -141247883, -141219370, -141188279,
+ -141154599, -141118320, -141079429, -141037916, -140993770, -140946979,
+ -140897532, -140845419, -140790628, -140733147, -140672967, -140610075,
+ -140544461, -140476114, -140405022, -140331174, -140254559, -140175166,
+ -140092984, -140008001, -139920208, -139829591, -139736141, -139639847,
+ -139540696, -139438679, -139333783, -139225998, -139115313, -139001717,
+ -138885198, -138765745, -138643348, -138517995, -138389675, -138258377,
+ -138124090, -137986803, -137846505, -137703185, -137556831, -137407433,
+ -137254980, -137099461, -136940863, -136779178, -136614393, -136446497,
+ -136275480, -136101331, -135924037, -135743590, -135559977, -135373187,
+ -135183210, -134990034, -134793650, -134594044, -134391208, -134185129,
+ -133975798, -133763202, -133547331, -133328175, -133105722, -132879961,
+ -132650882, -132418474, -132182725, -131943626, -131701164, -131455330,
+ -131206113, -130953501, -130697485, -130438052, -130175193, -129908897,
+ -129639153, -129365950, -129089277, -128809125, -128525481, -128238336,
+ -127947679, -127653499, -127355785, -127054528, -126749716, -126441338,
+ -126129385, -125813845, -125494708, -125171963, -124845601, -124515610,
+ -124181980, -123844700, -123503761, -123159150, -122810860, -122458877,
+ -122103193, -121743798, -121380679, -121013828, -120643234, -120268886,
+ -119890775, -119508889, -119123220, -118733756, -118340487, -117943403,
+ -117542495, -117137751, -116729161, -116316716, -115900406, -115480219,
+ -115056147, -114628179, -114196305, -113760516, -113320800, -112877148,
+ -112429551, -111977998, -111522479, -111062985, -110599506, -110132031,
+ -109660551, -109185057, -108705537, -108221984, -107734386, -107242735,
+ -106747020, -106247232, -105743361, -105235398, -104723333, -104207157,
+ -103686860, -103162432, -102633863, -102101146, -101564269, -101023225,
+ -100478002, -99928593, -99374986, -98817175, -98255148, -97688897,
+ -97118412, -96543685, -95964706, -95381466, -94793956, -94202167,
+ -93606089, -93005714, -92401033, -91792036, -91178715, -90561061,
+ -89939065, -89312718, -88682011, -88046936, -87407483, -86763645,
+ -86115411, -85462774, -84805725, -84144255, -83478356, -82808019,
+ -82133236, -81453997, -80770296, -80082122, -79389469, -78692326,
+ -77990687, -77284543, -76573885, -75858706, -75138996, -74414749,
+ -73685955, -72952607, -72214696, -71472216, -70725156, -69973511,
+ -69217271, -68456429, -67690977, -66920907, -66146211, -65366882,
+ -64582911, -63794292, -63001017, -62203077, -61400466, -60593176,
+ -59781199, -58964527, -58143155, -57317073, -56486275, -55650754,
+ -54810501, -53965511, -53115775, -52261287, -51402039, -50538025,
+ -49669237, -48795669, -47917312, -47034162, -46146210, -45253449,
+ -44355874, -43453477, -42546251, -41634190, -40717287, -39795536,
+ -38868930, -37937462, -37001127, -36059917, -35113826, -34162849,
+ -33206977, -32246207, -31280530, -30309941, -29334435, -28354004,
+ -27368642, -26378345, -25383105, -24382917, -23377775, -22367673,
+ -21352606, -20332568, -19307552, -18277554, -17242567, -16202587,
+ -15157608, -14107623, -13052629, -11992619, -10927588, -9857532,
+ -8782443, -7702319, -6617153, -5526940, -4431675, -3331353, -2225970,
+ -1115521, 0, 1120597, 2246275, 3377039, 4512893, 5653843, 6799891,
+ 7951044, 9107305, 10268679, 11435170, 12606782, 13783521, 14965389,
+ 16152391, 17344532, 18541815, 19744244, 20951823, 22164556, 23382448,
+ 24605501, 25833720, 27067108, 28305668, 29549406, 30798323, 32052423,
+ 33311711, 34576189, 35845860, 37120729, 38400797, 39686069, 40976547,
+ 42272235, 43573135, 44879251, 46190585, 47507140, 48828919, 50155925,
+ 51488160, 52825627, 54168329, 55516268, 56869446, 58227867, 59591532,
+ 60960443, 62334604, 63714015, 65098680, 66488600, 67883777, 69284214,
+ 70689911, 72100872, 73517098, 74938590, 76365350, 77797380, 79234682,
+ 80677257, 82125106, 83578230, 85036632, 86500312, 87969272, 89443512,
+ 90923035, 92407840, 93897929, 95393303, 96893963, 98399909, 99911142,
+ 101427664, 102949474, 104476572, 106008961, 107546640, 109089609,
+ 110637869, 112191420, 113750263, 115314396, 116883822, 118458539,
+ 120038547, 121623847, 123214439, 124810321, 126411494, 128017958,
+ 129629712, 131246756, 132869088, 134496710, 136129619, 137767815,
+ 139411298, 141060066, 142714119, 144373456, 146038076, 147707977,
+ 149383159, 151063621, 152749360, 154440377, 156136668, 157838234,
+ 159545072, 161257181, 162974559, 164697204, 166425116, 168158291,
+ 169896728, 171640425, 173389381, 175143592, 176903057, 178667774,
+ 180437740, 182212953, 183993411, 185779111, 187570050, 189366227,
+ 191167637, 192974280, 194786151, 196603248, 198425568, 200253108,
+ 202085865, 203923836, 205767018, 207615407, 209469001, 211327795,
+ 213191786, 215060971, 216935347, 218814909, 220699654, 222589578,
+ 224484677, 226384948, 228290386, 230200988, 232116749, 234037665,
+ 235963732, 237894945, 239831301, 241772795, 243719422, 245671177,
+ 247628057, 249590056, 251557170, 253529394, 255506722, 257489151,
+ 259476675, 261469288, 263466986, 265469763, 267477615, 269490536,
+ 271508519, 273531561, 275559655, 277592796, 279630977, 281674194,
+ 283722440, 285775710, 287833997, 289897295, 291965599, 294038902,
+ 296117199, 298200481, 300288744, 302381981, 304480185, 306583350,
+ 308691469, 310804535, 312922542, 315045483, 317173351, 319306138,
+ 321443839, 323586445, 325733949, 327886345, 330043625, 332205781,
+ 334372807, 336544694, 338721435, 340903022, 343089448, 345280705,
+ 347476785, 349677680, 351883382, 354093883, 356309174, 358529248,
+ 360754097, 362983712, 365218084, 367457205, 369701067, 371949661,
+ 374202979, 376461011, 378723748, 380991183, 383263305, 385540107,
+ 387821578, 390107710, 392398493, 394693919, 396993977, 399298659,
+ 401607955, 403921855, 406240350, 408563430, 410891085, 413223306,
+ 415560082, 417901404, 420247261, 422597644, 424952542, 427311946,
+ 429675844, 432044226, 434417083, 436794402, 439176175, 441562390,
+ 443953037, 446348105, 448747582, 451151459, 453559723, 455972365,
+ 458389373, 460810735, 463236441, 465666479, 468100838, 470539507,
+ 472982473, 475429726, 477881254, 480337044, 482797086, 485261367,
+ 487729876, 490202600, 492679528, 495160647, 497645945, 500135411,
+ 502629031, 505126793, 507628686, 510134695, 512644810, 515159016,
+ 517677303, 520199656, 522726063, 525256511, 527790987, 530329478,
+ 532871971, 535418453, 537968910, 540523330, 543081699, 545644003,
+ 548210230, 550780365, 553354395, 555932307, 558514086, 561099718,
+ 563689191, 566282490, 568879600, 571480509, 574085201, 576693663,
+ 579305881, 581921839, 584541524, 587164922, 589792017, 592422796,
+ 595057243, 597695344, 600337084, 602982449, 605631423, 608283992,
+ 610940141, 613599853, 616263116, 618929912, 621600227, 624274046,
+ 626951354, 629632134, 632316371, 635004051, 637695156, 640389672,
+ 643087583, 645788873, 648493526, 651201526, 653912857, 656627504,
+ 659345449, 662066678, 664791173, 667518918, 670249898, 672984095,
+ 675721494, 678462077, 681205828, 683952731, 686702768, 689455924,
+ 692212181, 694971522, 697733931, 700499390, 703267882, 706039390,
+ 708813898, 711591388, 714371842, 717155244, 719941575, 722730819,
+ 725522958, 728317974, 731115850, 733916567, 736720110, 739526459,
+ 742335596, 745147504, 747962165, 750779561, 753599674, 756422486,
+ 759247977, 762076132, 764906930, 767740353, 770576384, 773415004,
+ 776256194, 779099935, 781946210, 784794999, 787646284, 790500045,
+ 793356265, 796214924, 799076003, 801939484, 804805347, 807673573,
+ 810544143, 813417038, 816292238, 819169725, 822049479, 824931480,
+ 827815710, 830702148, 833590775, 836481572, 839374518, 842269595,
+ 845166782, 848066059, 850967407, 853870806, 856776236, 859683677,
+ 862593109, 865504511, 868417864, 871333148, 874250341, 877169425,
+ 880090378, 883013180, 885937811, 888864250, 891792477, 894722471,
+ 897654212, 900587679, 903522851, 906459707, 909398227, 912338390,
+ 915280175, 918223561, 921168527, 924115052, 927063115, 930012694,
+ 932963770, 935916320, 938870323, 941825758, 944782604, 947740839,
+ 950700442, 953661392, 956623666, 959587244, 962552104, 965518224,
+ 968485582, 971454158, 974423928, 977394872, 980366968, 983340193,
+ 986314526, 989289944, 992266427, 995243951, 998222495, 1001202037,
+ 1004182555, 1007164025, 1010146427, 1013129738, 1016113936, 1019098998,
+ 1022084902, 1025071625, 1028059146, 1031047441, 1034036489, 1037026266,
+ 1040016750, 1043007919, 1045999750, 1048992219, 1051985306, 1054978985,
+ 1057973236, 1060968035, 1063963359, 1066959186, 1069955492, 1072952255,
+ 1075949451, 1078947057, 1081945052, 1084943410, 1087942110, 1090941128,
+ 1093940441, 1096940026, 1099939860, 1102939919, 1105940180, 1108940619,
+ 1111941215, 1114941942, 1117942777, 1120943698, 1123944681, 1126945702,
+ 1129946738, 1132947764, 1135948759, 1138949697, 1141950556, 1144951312,
+ 1147951940, 1150952419, 1153952722, 1156952828, 1159952711, 1162952349,
+ 1165951718, 1168950793, 1171949551, 1174947968, 1177946019, 1180943682,
+ 1183940932, 1186937744, 1189934096, 1192929963, 1195925320, 1198920145,
+ 1201914412, 1204908098, 1207901179, 1210893629, 1213885426, 1216876545,
+ 1219866962, 1222856652, 1225845591, 1228833755, 1231821120, 1234807662,
+ 1237793355, 1240778176, 1243762101, 1246745104, 1249727162, 1252708250,
+ 1255688343, 1258667418, 1261645450, 1264622414, 1267598286, 1270573041,
+ 1273546655, 1276519103, 1279490361, 1282460404, 1285429208, 1288396747,
+ 1291362998, 1294327936, 1297291536, 1300253773, 1303214624, 1306174062,
+ 1309132064, 1312088605, 1315043660, 1317997205, 1320949214, 1323899663,
+ 1326848528, 1329795783, 1332741404, 1335685366, 1338627645, 1341568215,
+ 1344507051, 1347444130, 1350379426, 1353312914, 1356244570, 1359174369,
+ 1362102286, 1365028296, 1367952374, 1370874496, 1373794637, 1376712771,
+ 1379628875, 1382542922, 1385454889, 1388364751, 1391272482, 1394178058,
+ 1397081453, 1399982644, 1402881606, 1405778312, 1408672739, 1411564862,
+ 1414454656, 1417342095, 1420227156, 1423109813, 1425990041, 1428867816,
+ 1431743112, 1434615906, 1437486171, 1440353883, 1443219018, 1446081551,
+ 1448941456, 1451798708, 1454653284, 1457505158, 1460354306, 1463200702,
+ 1466044321, 1468885140, 1471723133, 1474558275, 1477390542, 1480219909,
+ 1483046351, 1485869843, 1488690361, 1491507880, 1494322374, 1497133821,
+ 1499942194, 1502747469, 1505549621, 1508348626, 1511144459, 1513937095,
+ 1516726510, 1519512679, 1522295577, 1525075180, 1527851463, 1530624402,
+ 1533393972, 1536160149, 1538922907, 1541682223, 1544438072, 1547190429,
+ 1549939270, 1552684570, 1555426306, 1558164452, 1560898984, 1563629877,
+ 1566357108, 1569080652, 1571800485, 1574516582, 1577228919, 1579937471,
+ 1582642215, 1585343126, 1588040180, 1590733352, 1593422619, 1596107956,
+ 1598789339, 1601466744, 1604140146, 1606809523, 1609474849, 1612136101,
+ 1614793254, 1617446285, 1620095169, 1622739883, 1625380402, 1628016704,
+ 1630648763, 1633276556, 1635900059, 1638519248, 1641134100, 1643744591,
+ 1646350697, 1648952394, 1651549658, 1654142467, 1656730796, 1659314621,
+ 1661893920, 1664468669, 1667038843, 1669604420, 1672165376, 1674721688,
+ 1677273332, 1679820285, 1682362524, 1684900025, 1687432765, 1689960721,
+ 1692483869, 1695002186, 1697515650, 1700024237, 1702527924, 1705026688,
+ 1707520506, 1710009354, 1712493211, 1714972053, 1717445857, 1719914600,
+ 1722378260, 1724836813, 1727290238, 1729738511, 1732181610, 1734619511,
+ 1737052193, 1739479633, 1741901809, 1744318697, 1746730275, 1749136522,
+ 1751537414, 1753932930, 1756323047, 1758707742, 1761086994, 1763460781,
+ 1765829080, 1768191869, 1770549126, 1772900830, 1775246958, 1777587488,
+ 1779922398, 1782251667, 1784575273, 1786893194, 1789205409, 1791511895,
+ 1793812631, 1796107596, 1798396768, 1800680125, 1802957646, 1805229311,
+ 1807495096, 1809754982, 1812008946, 1814256968, 1816499026, 1818735100,
+ 1820965168, 1823189210, 1825407204, 1827619129, 1829824964, 1832024690,
+ 1834218284, 1836405726, 1838586996, 1840762073, 1842930937, 1845093566,
+ 1847249940, 1849400040, 1851543844, 1853681332, 1855812485, 1857937281,
+ 1860055701, 1862167724, 1864273331, 1866372501, 1868465215, 1870551452,
+ 1872631194, 1874704419, 1876771108, 1878831243, 1880884802, 1882931767,
+ 1884972117, 1887005834, 1889032899, 1891053291, 1893066991, 1895073981,
+ 1897074241, 1899067752, 1901054494, 1903034450, 1905007600, 1906973925,
+ 1908933406, 1910886025, 1912831762, 1914770600, 1916702519, 1918627502,
+ 1920545529, 1922456583, 1924360644, 1926257695, 1928147718, 1930030694,
+ 1931906605, 1933775433, 1935637160, 1937491769, 1939339241, 1941179559,
+ 1943012705, 1944838661, 1946657410, 1948468934, 1950273215, 1952070238,
+ 1953859983, 1955642434, 1957417573, 1959185384, 1960945850, 1962698952,
+ 1964444675, 1966183002, 1967913915, 1969637399, 1971353435, 1973062009,
+ 1974763103, 1976456700, 1978142785, 1979821341, 1981492351, 1983155800,
+ 1984811672, 1986459950, 1988100618, 1989733661, 1991359063, 1992976807,
+ 1994586878, 1996189261, 1997783940, 1999370900, 2000950124, 2002521598,
+ 2004085307, 2005641235, 2007189366, 2008729687, 2010262182, 2011786836,
+ 2013303634, 2014812562, 2016313604, 2017806746, 2019291974, 2020769273,
+ 2022238629, 2023700027, 2025153454, 2026598894, 2028036334, 2029465759,
+ 2030887157, 2032300512, 2033705812, 2035103042, 2036492189, 2037873238,
+ 2039246178, 2040610993, 2041967672, 2043316200, 2044656565, 2045988752,
+ 2047312750, 2048628546, 2049936125, 2051235476, 2052526587, 2053809443,
+ 2055084032, 2056350343, 2057608363, 2058858079, 2060099479, 2061332551,
+ 2062557282, 2063773662, 2064981677, 2066181316, 2067372568, 2068555420,
+ 2069729861, 2070895879, 2072053463, 2073202601, 2074343283, 2075475496,
+ 2076599231, 2077714475, 2078821218, 2079919449, 2081009157, 2082090331,
+ 2083162962, 2084227037, 2085282547, 2086329481, 2087367829, 2088397581,
+ 2089418727, 2090431256, 2091435159, 2092430425, 2093417045, 2094395009,
+ 2095364308, 2096324932, 2097276871, 2098220116, 2099154657, 2100080487,
+ 2100997594, 2101905971, 2102805608, 2103696497, 2104578628, 2105451993,
+ 2106316584, 2107172391, 2108019406, 2108857622, 2109687029, 2110507619,
+ 2111319385, 2112122318, 2112916410, 2113701654, 2114478042, 2115245566,
+ 2116004218, 2116753991, 2117494877, 2118226870, 2118949962, 2119664145,
+ 2120369413, 2121065759, 2121753176, 2122431657, 2123101195, 2123761783,
+ 2124413416, 2125056087, 2125689789, 2126314515, 2126930261, 2127537019,
+ 2128134784, 2128723550, 2129303311, 2129874061, 2130435794, 2130988506,
+ 2131532190, 2132066841, 2132592453, 2133109023, 2133616544, 2134115011,
+ 2134604419, 2135084765, 2135556042, 2136018246, 2136471373, 2136915418,
+ 2137350376, 2137776244, 2138193017, 2138600691, 2138999262, 2139388726,
+ 2139769079, 2140140317, 2140502437, 2140855436, 2141199308, 2141534052,
+ 2141859663, 2142176139, 2142483477, 2142781673, 2143070724, 2143350628,
+ 2143621381, 2143882982, 2144135427, 2144378714, 2144612841, 2144837804,
+ 2145053603, 2145260235, 2145457697, 2145645988, 2145825106, 2145995050,
+ 2146155816, 2146307405, 2146449814, 2146583042, 2146707087, 2146821949,
+ 2146927626, 2147024118, 2147111422, 2147189539, 2147258468, 2147318207,
+ 2147368757, 2147410117, 2147442286, 2147465264, 2147479051, 2147483647,
+ 2147479051, 2147465264, 2147442286, 2147410117, 2147368757, 2147318207,
+ 2147258468, 2147189539, 2147111422, 2147024118, 2146927626, 2146821949,
+ 2146707087, 2146583042, 2146449814, 2146307405, 2146155816, 2145995050,
+ 2145825106, 2145645988, 2145457697, 2145260235, 2145053603, 2144837804,
+ 2144612841, 2144378714, 2144135427, 2143882982, 2143621381, 2143350628,
+ 2143070724, 2142781673, 2142483477, 2142176139, 2141859663, 2141534052,
+ 2141199308, 2140855436, 2140502437, 2140140317, 2139769079, 2139388726,
+ 2138999262, 2138600691, 2138193017, 2137776244, 2137350376, 2136915418,
+ 2136471373, 2136018246, 2135556042, 2135084765, 2134604419, 2134115011,
+ 2133616544, 2133109023, 2132592453, 2132066841, 2131532190, 2130988506,
+ 2130435794, 2129874061, 2129303311, 2128723550, 2128134784, 2127537019,
+ 2126930261, 2126314515, 2125689789, 2125056087, 2124413416, 2123761783,
+ 2123101195, 2122431657, 2121753176, 2121065759, 2120369413, 2119664145,
+ 2118949962, 2118226870, 2117494877, 2116753991, 2116004218, 2115245566,
+ 2114478042, 2113701654, 2112916410, 2112122318, 2111319385, 2110507619,
+ 2109687029, 2108857622, 2108019406, 2107172391, 2106316584, 2105451993,
+ 2104578628, 2103696497, 2102805608, 2101905971, 2100997594, 2100080487,
+ 2099154657, 2098220116, 2097276871, 2096324932, 2095364308, 2094395009,
+ 2093417045, 2092430425, 2091435159, 2090431256, 2089418727, 2088397581,
+ 2087367829, 2086329481, 2085282547, 2084227037, 2083162962, 2082090331,
+ 2081009157, 2079919449, 2078821218, 2077714475, 2076599231, 2075475496,
+ 2074343283, 2073202601, 2072053463, 2070895879, 2069729861, 2068555420,
+ 2067372568, 2066181316, 2064981677, 2063773662, 2062557282, 2061332551,
+ 2060099479, 2058858079, 2057608363, 2056350343, 2055084032, 2053809443,
+ 2052526587, 2051235476, 2049936125, 2048628546, 2047312750, 2045988752,
+ 2044656565, 2043316200, 2041967672, 2040610993, 2039246178, 2037873238,
+ 2036492189, 2035103042, 2033705812, 2032300512, 2030887157, 2029465759,
+ 2028036334, 2026598894, 2025153454, 2023700027, 2022238629, 2020769273,
+ 2019291974, 2017806746, 2016313604, 2014812562, 2013303634, 2011786836,
+ 2010262182, 2008729687, 2007189366, 2005641235, 2004085307, 2002521598,
+ 2000950124, 1999370900, 1997783940, 1996189261, 1994586878, 1992976807,
+ 1991359063, 1989733661, 1988100618, 1986459950, 1984811672, 1983155800,
+ 1981492351, 1979821341, 1978142785, 1976456700, 1974763103, 1973062009,
+ 1971353435, 1969637399, 1967913915, 1966183002, 1964444675, 1962698952,
+ 1960945850, 1959185384, 1957417573, 1955642434, 1953859983, 1952070238,
+ 1950273215, 1948468934, 1946657410, 1944838661, 1943012705, 1941179559,
+ 1939339241, 1937491769, 1935637160, 1933775433, 1931906605, 1930030694,
+ 1928147718, 1926257695, 1924360644, 1922456583, 1920545529, 1918627502,
+ 1916702519, 1914770600, 1912831762, 1910886025, 1908933406, 1906973925,
+ 1905007600, 1903034450, 1901054494, 1899067752, 1897074241, 1895073981,
+ 1893066991, 1891053291, 1889032899, 1887005834, 1884972117, 1882931767,
+ 1880884802, 1878831243, 1876771108, 1874704419, 1872631194, 1870551452,
+ 1868465215, 1866372501, 1864273331, 1862167724, 1860055701, 1857937281,
+ 1855812485, 1853681332, 1851543844, 1849400040, 1847249940, 1845093566,
+ 1842930937, 1840762073, 1838586996, 1836405726, 1834218284, 1832024690,
+ 1829824964, 1827619129, 1825407204, 1823189210, 1820965168, 1818735100,
+ 1816499026, 1814256968, 1812008946, 1809754982, 1807495096, 1805229311,
+ 1802957646, 1800680125, 1798396768, 1796107596, 1793812631, 1791511895,
+ 1789205409, 1786893194, 1784575273, 1782251667, 1779922398, 1777587488,
+ 1775246958, 1772900830, 1770549126, 1768191869, 1765829080, 1763460781,
+ 1761086994, 1758707742, 1756323047, 1753932930, 1751537414, 1749136522,
+ 1746730275, 1744318697, 1741901809, 1739479633, 1737052193, 1734619511,
+ 1732181610, 1729738511, 1727290238, 1724836813, 1722378260, 1719914600,
+ 1717445857, 1714972053, 1712493211, 1710009354, 1707520506, 1705026688,
+ 1702527924, 1700024237, 1697515650, 1695002186, 1692483869, 1689960721,
+ 1687432765, 1684900025, 1682362524, 1679820285, 1677273332, 1674721688,
+ 1672165376, 1669604420, 1667038843, 1664468669, 1661893920, 1659314621,
+ 1656730796, 1654142467, 1651549658, 1648952394, 1646350697, 1643744591,
+ 1641134100, 1638519248, 1635900059, 1633276556, 1630648763, 1628016704,
+ 1625380402, 1622739883, 1620095169, 1617446285, 1614793254, 1612136101,
+ 1609474849, 1606809523, 1604140146, 1601466744, 1598789339, 1596107956,
+ 1593422619, 1590733352, 1588040180, 1585343126, 1582642215, 1579937471,
+ 1577228919, 1574516582, 1571800485, 1569080652, 1566357108, 1563629877,
+ 1560898984, 1558164452, 1555426306, 1552684570, 1549939270, 1547190429,
+ 1544438072, 1541682223, 1538922907, 1536160149, 1533393972, 1530624402,
+ 1527851463, 1525075180, 1522295577, 1519512679, 1516726510, 1513937095,
+ 1511144459, 1508348626, 1505549621, 1502747469, 1499942194, 1497133821,
+ 1494322374, 1491507880, 1488690361, 1485869843, 1483046351, 1480219909,
+ 1477390542, 1474558275, 1471723133, 1468885140, 1466044321, 1463200702,
+ 1460354306, 1457505158, 1454653284, 1451798708, 1448941456, 1446081551,
+ 1443219018, 1440353883, 1437486171, 1434615906, 1431743112, 1428867816,
+ 1425990041, 1423109813, 1420227156, 1417342095, 1414454656, 1411564862,
+ 1408672739, 1405778312, 1402881606, 1399982644, 1397081453, 1394178058,
+ 1391272482, 1388364751, 1385454889, 1382542922, 1379628875, 1376712771,
+ 1373794637, 1370874496, 1367952374, 1365028296, 1362102286, 1359174369,
+ 1356244570, 1353312914, 1350379426, 1347444130, 1344507051, 1341568215,
+ 1338627645, 1335685366, 1332741404, 1329795783, 1326848528, 1323899663,
+ 1320949214, 1317997205, 1315043660, 1312088605, 1309132064, 1306174062,
+ 1303214624, 1300253773, 1297291536, 1294327936, 1291362998, 1288396747,
+ 1285429208, 1282460404, 1279490361, 1276519103, 1273546655, 1270573041,
+ 1267598286, 1264622414, 1261645450, 1258667418, 1255688343, 1252708250,
+ 1249727162, 1246745104, 1243762101, 1240778176, 1237793355, 1234807662,
+ 1231821120, 1228833755, 1225845591, 1222856652, 1219866962, 1216876545,
+ 1213885426, 1210893629, 1207901179, 1204908098, 1201914412, 1198920145,
+ 1195925320, 1192929963, 1189934096, 1186937744, 1183940932, 1180943682,
+ 1177946019, 1174947968, 1171949551, 1168950793, 1165951718, 1162952349,
+ 1159952711, 1156952828, 1153952722, 1150952419, 1147951940, 1144951312,
+ 1141950556, 1138949697, 1135948759, 1132947764, 1129946738, 1126945702,
+ 1123944681, 1120943698, 1117942777, 1114941942, 1111941215, 1108940619,
+ 1105940180, 1102939919, 1099939860, 1096940026, 1093940441, 1090941128,
+ 1087942110, 1084943410, 1081945052, 1078947057, 1075949451, 1072952255,
+ 1069955492, 1066959186, 1063963359, 1060968035, 1057973236, 1054978985,
+ 1051985306, 1048992219, 1045999750, 1043007919, 1040016750, 1037026266,
+ 1034036489, 1031047441, 1028059146, 1025071625, 1022084902, 1019098998,
+ 1016113936, 1013129738, 1010146427, 1007164025, 1004182555, 1001202037,
+ 998222495, 995243951, 992266427, 989289944, 986314526, 983340193,
+ 980366968, 977394872, 974423928, 971454158, 968485582, 965518224,
+ 962552104, 959587244, 956623666, 953661392, 950700442, 947740839,
+ 944782604, 941825758, 938870323, 935916320, 932963770, 930012694,
+ 927063115, 924115052, 921168527, 918223561, 915280175, 912338390,
+ 909398227, 906459707, 903522851, 900587679, 897654212, 894722471,
+ 891792477, 888864250, 885937811, 883013180, 880090378, 877169425,
+ 874250341, 871333148, 868417864, 865504511, 862593109, 859683677,
+ 856776236, 853870806, 850967407, 848066059, 845166782, 842269595,
+ 839374518, 836481572, 833590775, 830702148, 827815710, 824931480,
+ 822049479, 819169725, 816292238, 813417038, 810544143, 807673573,
+ 804805347, 801939484, 799076003, 796214924, 793356265, 790500045,
+ 787646284, 784794999, 781946210, 779099935, 776256194, 773415004,
+ 770576384, 767740353, 764906930, 762076132, 759247977, 756422486,
+ 753599674, 750779561, 747962165, 745147504, 742335596, 739526459,
+ 736720110, 733916567, 731115850, 728317974, 725522958, 722730819,
+ 719941575, 717155244, 714371842, 711591388, 708813898, 706039390,
+ 703267882, 700499390, 697733931, 694971522, 692212181, 689455924,
+ 686702768, 683952731, 681205828, 678462077, 675721494, 672984095,
+ 670249898, 667518918, 664791173, 662066678, 659345449, 656627504,
+ 653912857, 651201526, 648493526, 645788873, 643087583, 640389672,
+ 637695156, 635004051, 632316371, 629632134, 626951354, 624274046,
+ 621600227, 618929912, 616263116, 613599853, 610940141, 608283992,
+ 605631423, 602982449, 600337084, 597695344, 595057243, 592422796,
+ 589792017, 587164922, 584541524, 581921839, 579305881, 576693663,
+ 574085201, 571480509, 568879600, 566282490, 563689191, 561099718,
+ 558514086, 555932307, 553354395, 550780365, 548210230, 545644003,
+ 543081699, 540523330, 537968910, 535418453, 532871971, 530329478,
+ 527790987, 525256511, 522726063, 520199656, 517677303, 515159016,
+ 512644810, 510134695, 507628686, 505126793, 502629031, 500135411,
+ 497645945, 495160647, 492679528, 490202600, 487729876, 485261367,
+ 482797086, 480337044, 477881254, 475429726, 472982473, 470539507,
+ 468100838, 465666479, 463236441, 460810735, 458389373, 455972365,
+ 453559723, 451151459, 448747582, 446348105, 443953037, 441562390,
+ 439176175, 436794402, 434417083, 432044226, 429675844, 427311946,
+ 424952542, 422597644, 420247261, 417901404, 415560082, 413223306,
+ 410891085, 408563430, 406240350, 403921855, 401607955, 399298659,
+ 396993977, 394693919, 392398493, 390107710, 387821578, 385540107,
+ 383263305, 380991183, 378723748, 376461011, 374202979, 371949661,
+ 369701067, 367457205, 365218084, 362983712, 360754097, 358529248,
+ 356309174, 354093883, 351883382, 349677680, 347476785, 345280705,
+ 343089448, 340903022, 338721435, 336544694, 334372807, 332205781,
+ 330043625, 327886345, 325733949, 323586445, 321443839, 319306138,
+ 317173351, 315045483, 312922542, 310804535, 308691469, 306583350,
+ 304480185, 302381981, 300288744, 298200481, 296117199, 294038902,
+ 291965599, 289897295, 287833997, 285775710, 283722440, 281674194,
+ 279630977, 277592796, 275559655, 273531561, 271508519, 269490536,
+ 267477615, 265469763, 263466986, 261469288, 259476675, 257489151,
+ 255506722, 253529394, 251557170, 249590056, 247628057, 245671177,
+ 243719422, 241772795, 239831301, 237894945, 235963732, 234037665,
+ 232116749, 230200988, 228290386, 226384948, 224484677, 222589578,
+ 220699654, 218814909, 216935347, 215060971, 213191786, 211327795,
+ 209469001, 207615407, 205767018, 203923836, 202085865, 200253108,
+ 198425568, 196603248, 194786151, 192974280, 191167637, 189366227,
+ 187570050, 185779111, 183993411, 182212953, 180437740, 178667774,
+ 176903057, 175143592, 173389381, 171640425, 169896728, 168158291,
+ 166425116, 164697204, 162974559, 161257181, 159545072, 157838234,
+ 156136668, 154440377, 152749360, 151063621, 149383159, 147707977,
+ 146038076, 144373456, 142714119, 141060066, 139411298, 137767815,
+ 136129619, 134496710, 132869088, 131246756, 129629712, 128017958,
+ 126411494, 124810321, 123214439, 121623847, 120038547, 118458539,
+ 116883822, 115314396, 113750263, 112191420, 110637869, 109089609,
+ 107546640, 106008961, 104476572, 102949474, 101427664, 99911142,
+ 98399909, 96893963, 95393303, 93897929, 92407840, 90923035, 89443512,
+ 87969272, 86500312, 85036632, 83578230, 82125106, 80677257, 79234682,
+ 77797380, 76365350, 74938590, 73517098, 72100872, 70689911, 69284214,
+ 67883777, 66488600, 65098680, 63714015, 62334604, 60960443, 59591532,
+ 58227867, 56869446, 55516268, 54168329, 52825627, 51488160, 50155925,
+ 48828919, 47507140, 46190585, 44879251, 43573135, 42272235, 40976547,
+ 39686069, 38400797, 37120729, 35845860, 34576189, 33311711, 32052423,
+ 30798323, 29549406, 28305668, 27067108, 25833720, 24605501, 23382448,
+ 22164556, 20951823, 19744244, 18541815, 17344532, 16152391, 14965389,
+ 13783521, 12606782, 11435170, 10268679, 9107305, 7951044, 6799891,
+ 5653843, 4512893, 3377039, 2246275, 1120597, 0, -1115521, -2225970,
+ -3331353, -4431675, -5526940, -6617153, -7702319, -8782443, -9857532,
+ -10927588, -11992619, -13052629, -14107623, -15157608, -16202587,
+ -17242567, -18277554, -19307552, -20332568, -21352606, -22367673,
+ -23377775, -24382917, -25383105, -26378345, -27368642, -28354004,
+ -29334435, -30309941, -31280530, -32246207, -33206977, -34162849,
+ -35113826, -36059917, -37001127, -37937462, -38868930, -39795536,
+ -40717287, -41634190, -42546251, -43453477, -44355874, -45253449,
+ -46146210, -47034162, -47917312, -48795669, -49669237, -50538025,
+ -51402039, -52261287, -53115775, -53965511, -54810501, -55650754,
+ -56486275, -57317073, -58143155, -58964527, -59781199, -60593176,
+ -61400466, -62203077, -63001017, -63794292, -64582911, -65366882,
+ -66146211, -66920907, -67690977, -68456429, -69217271, -69973511,
+ -70725156, -71472216, -72214696, -72952607, -73685955, -74414749,
+ -75138996, -75858706, -76573885, -77284543, -77990687, -78692326,
+ -79389469, -80082122, -80770296, -81453997, -82133236, -82808019,
+ -83478356, -84144255, -84805725, -85462774, -86115411, -86763645,
+ -87407483, -88046936, -88682011, -89312718, -89939065, -90561061,
+ -91178715, -91792036, -92401033, -93005714, -93606089, -94202167,
+ -94793956, -95381466, -95964706, -96543685, -97118412, -97688897,
+ -98255148, -98817175, -99374986, -99928593, -100478002, -101023225,
+ -101564269, -102101146, -102633863, -103162432, -103686860, -104207157,
+ -104723333, -105235398, -105743361, -106247232, -106747020, -107242735,
+ -107734386, -108221984, -108705537, -109185057, -109660551, -110132031,
+ -110599506, -111062985, -111522479, -111977998, -112429551, -112877148,
+ -113320800, -113760516, -114196305, -114628179, -115056147, -115480219,
+ -115900406, -116316716, -116729161, -117137751, -117542495, -117943403,
+ -118340487, -118733756, -119123220, -119508889, -119890775, -120268886,
+ -120643234, -121013828, -121380679, -121743798, -122103193, -122458877,
+ -122810860, -123159150, -123503761, -123844700, -124181980, -124515610,
+ -124845601, -125171963, -125494708, -125813845, -126129385, -126441338,
+ -126749716, -127054528, -127355785, -127653499, -127947679, -128238336,
+ -128525481, -128809125, -129089277, -129365950, -129639153, -129908897,
+ -130175193, -130438052, -130697485, -130953501, -131206113, -131455330,
+ -131701164, -131943626, -132182725, -132418474, -132650882, -132879961,
+ -133105722, -133328175, -133547331, -133763202, -133975798, -134185129,
+ -134391208, -134594044, -134793650, -134990034, -135183210, -135373187,
+ -135559977, -135743590, -135924037, -136101331, -136275480, -136446497,
+ -136614393, -136779178, -136940863, -137099461, -137254980, -137407433,
+ -137556831, -137703185, -137846505, -137986803, -138124090, -138258377,
+ -138389675, -138517995, -138643348, -138765745, -138885198, -139001717,
+ -139115313, -139225998, -139333783, -139438679, -139540696, -139639847,
+ -139736141, -139829591, -139920208, -140008001, -140092984, -140175166,
+ -140254559, -140331174, -140405022, -140476114, -140544461, -140610075,
+ -140672967, -140733147, -140790628, -140845419, -140897532, -140946979,
+ -140993770, -141037916, -141079429, -141118320, -141154599, -141188279,
+ -141219370, -141247883, -141273829, -141297220, -141318066, -141336379,
+ -141352170, -141365450, -141376229, -141384520, -141390333, -141393679,
+ -141394570, -141393015, -141389028, -141382618, -141373797, -141362575,
+ -141348965, -141332976, -141314620, -141293908, -141270851, -141245460,
+ -141217746, -141187721, -141155394, -141120778, -141083882, -141044719,
+ -141003299, -140959634, -140913733, -140865608, -140815271, -140762732,
+ -140708001, -140651091, -140592011, -140530774, -140467389, -140401868,
+ -140334221, -140264460, -140192595, -140118638, -140042598, -139964488,
+ -139884317, -139802098, -139717840, -139631554, -139543251, -139452943,
+ -139360639, -139266351, -139170090, -139071865, -138971689, -138869571,
+ -138765523, -138659555, -138551678, -138441902, -138330239, -138216698,
+ -138101292, -137984030, -137864922, -137743980, -137621215, -137496636,
+ -137370255, -137242082, -137112128, -136980402, -136846917, -136711682,
+ -136574707, -136436004, -136295583, -136153454, -136009628, -135864115,
+ -135716926, -135568071, -135417561, -135265405, -135111615, -134956201,
+ -134799172, -134640541, -134480316, -134318508, -134155127, -133990184,
+ -133823690, -133655653, -133486085, -133314995, -133142395, -132968293,
+ -132792701, -132615628, -132437085, -132257082, -132075628, -131892735,
+ -131708411, -131522667, -131335514, -131146961, -130957018, -130765695,
+ -130573002, -130378950, -130183547, -129986805, -129788732, -129589339,
+ -129388636, -129186633, -128983338, -128778764, -128572918, -128365810,
+ -128157452, -127947852, -127737019, -127524965, -127311698, -127097228,
+ -126881565, -126664718, -126446697, -126227512, -126007172, -125785687,
+ -125563066, -125339319, -125114455, -124888484, -124661415, -124433258,
+ -124204022, -123973717, -123742351, -123509935, -123276477, -123041988,
+ -122806475, -122569949, -122332418, -122093893, -121854382, -121613894,
+ -121372438, -121130025, -120886662, -120642359, -120397125, -120150969,
+ -119903900, -119655927, -119407060, -119157307, -118906676, -118655178,
+ -118402820, -118149613, -117895564, -117640682, -117384977, -117128457,
+ -116871131, -116613008, -116354096, -116094404, -115833940, -115572715,
+ -115310735, -115048010, -114784548, -114520359, -114255449, -113989829,
+ -113723506, -113456489, -113188786, -112920406, -112651358, -112381649,
+ -112111288, -111840283, -111568643, -111296375, -111023489, -110749992,
+ -110475893, -110201200, -109925920, -109650063, -109373636, -109096647,
+ -108819105, -108541017, -108262391, -107983236, -107703560, -107423370,
+ -107142674, -106861480, -106579796, -106297631, -106014991, -105731884,
+ -105448319, -105164303, -104879843, -104594949, -104309626, -104023883,
+ -103737727, -103451167, -103164209, -102876861, -102589131, -102301026,
+ -102012553, -101723721, -101434536, -101145006, -100855138, -100564940,
+ -100274419, -99983581, -99692436, -99400988, -99109247, -98817219,
+ -98524911, -98232330, -97939484, -97646380, -97353024, -97059423,
+ -96765585, -96471517, -96177226, -95882717, -95588000, -95293079,
+ -94997963, -94702657, -94407169, -94111506, -93815673, -93519679,
+ -93223529, -92927231, -92630790, -92334214, -92037509, -91740681,
+ -91443738, -91146685, -90849530, -90552278, -90254936, -89957510,
+ -89660007, -89362433, -89064795, -88767098, -88469349, -88171554,
+ -87873720, -87575852, -87277957, -86980041, -86682109, -86384169,
+ -86086225, -85788285, -85490354, -85192437, -84894542, -84596673,
+ -84298837, -84001040, -83703287, -83405584, -83107937, -82810352,
+ -82512834, -82215389, -81918024, -81620742, -81323551, -81026455,
+ -80729460, -80432572, -80135797, -79839139, -79542604, -79246197,
+ -78949925, -78653792, -78357803, -78061964, -77766281, -77470758,
+ -77175401, -76880215, -76585205, -76290376, -75995733, -75701282,
+ -75407028, -75112975, -74819129, -74525494, -74232076, -73938880,
+ -73645909, -73353171, -73060668, -72768406, -72476390, -72184624,
+ -71893114, -71601864, -71310878, -71020162, -70729720, -70439556,
+ -70149675, -69860083, -69570782, -69281779, -68993076, -68704680,
+ -68416593, -68128821, -67841368, -67554238, -67267436, -66980965,
+ -66694831, -66409037, -66123588, -65838487, -65553739, -65269349,
+ -64985319, -64701655, -64418360, -64135438, -63852894, -63570731,
+ -63288953, -63007564, -62726569, -62445970, -62165772, -61885979,
+ -61606594, -61327621, -61049064, -60770926, -60493212, -60215925,
+ -59939068, -59662646, -59386661, -59111118, -58836019, -58561369,
+ -58287171, -58013428, -57740143, -57467321, -57194964, -56923077,
+ -56651661, -56380720, -56110259, -55840279, -55570785, -55301779,
+ -55033265, -54765245, -54497724, -54230703, -53964186, -53698176,
+ -53432677, -53167690, -52903220, -52639268, -52375839, -52112934,
+ -51850557, -51588711, -51327398, -51066621, -50806383, -50546687,
+ -50287535, -50028931, -49770876, -49513373, -49256426, -49000036,
+ -48744207, -48488940, -48234239, -47980105, -47726542, -47473552,
+ -47221137, -46969299, -46718042, -46467367, -46217276, -45967773,
+ -45718859, -45470536, -45222807, -44975675, -44729140, -44483206,
+ -44237875, -43993148, -43749028, -43505516, -43262616, -43020329,
+ -42778656, -42537601, -42297164, -42057349, -41818156, -41579587,
+ -41341645, -41104332, -40867649, -40631598, -40396180, -40161398,
+ -39927254, -39693748, -39460883, -39228661, -38997082, -38766149,
+ -38535863, -38306227, -38077240, -37848905, -37621224, -37394198,
+ -37167828, -36942116, -36717063, -36492671, -36268941, -36045874,
+ -35823472, -35601737, -35380668, -35160268, -34940539, -34721480,
+ -34503094, -34285381, -34068343, -33851981, -33636296, -33421289,
+ -33206961, -32993313, -32780347, -32568064, -32356463, -32145547,
+ -31935317, -31725772, -31516915, -31308746, -31101266, -30894476,
+ -30688377, -30482969, -30278253, -30074231, -29870903, -29668269,
+ -29466331, -29265089, -29064543, -28864695, -28665546, -28467095,
+ -28269343, -28072291, -27875940, -27680290, -27485342, -27291096,
+ -27097553, -26904712, -26712576, -26521143, -26330415, -26140392,
+ -25951074, -25762462, -25574556, -25387356, -25200863, -25015077,
+ -24829998, -24645627, -24461964, -24279008, -24096761, -23915223,
+ -23734392, -23554271, -23374859, -23196155, -23018161, -22840876,
+ -22664301, -22488435, -22313278, -22138831, -21965093, -21792065,
+ -21619746, -21448136, -21277236, -21107045, -20937563, -20768791,
+ -20600727, -20433372, -20266726, -20100788, -19935559, -19771038,
+ -19607224, -19444119, -19281720, -19120029, -18959045, -18798767,
+ -18639196, -18480330, -18322170, -18164716, -18007966, -17851921,
+ -17696580, -17541942, -17388008, -17234777, -17082248, -16930421,
+ -16779295, -16628871, -16479146, -16330122, -16181797, -16034170,
+ -15887242, -15741012, -15595478, -15450641, -15306500, -15163054,
+ -15020302, -14878245, -14736880, -14596208, -14456228, -14316938,
+ -14178339, -14040430, -13903209, -13766677, -13630832, -13495673,
+ -13361200, -13227412, -13094307, -12961887, -12830148, -12699091,
+ -12568714, -12439017, -12309999, -12181659, -12053996, -11927008,
+ -11800696, -11675058, -11550093, -11425800, -11302178, -11179227,
+ -11056944, -10935330, -10814383, -10694101, -10574485, -10455532,
+ -10337243, -10219615, -10102647, -9986339, -9870689, -9755697,
+ -9641360, -9527679, -9414651, -9302276, -9190552, -9079478, -8969053,
+ -8859276, -8750146, -8641661, -8533819, -8426621, -8320064, -8214147,
+ -8108870, -8004230, -7900226, -7796857, -7694123, -7592020, -7490549,
+ -7389707, -7289494, -7189908, -7090947, -6992611, -6894897, -6797805,
+ -6701333, -6605480, -6510244, -6415623, -6321617, -6228224, -6135443,
+ -6043271, -5951708, -5860752, -5770402, -5680656, -5591512, -5502970,
+ -5415027, -5327682, -5240933, -5154780, -5069220, -4984252, -4899874,
+ -4816085, -4732883, -4650267, -4568235, -4486785, -4405917, -4325627,
+ -4245915, -4166780, -4088218, -4010230, -3932813, -3855965, -3779685,
+ -3703971, -3628822, -3554236, -3480211, -3406746, -3333839, -3261488,
+ -3189691, -3118448, -3047755, -2977612, -2908017, -2838968, -2770463,
+ -2702500, -2635079, -2568196, -2501851, -2436042, -2370767, -2306023,
+ -2241810, -2178126, -2114969, -2052336, -1990227, -1928640, -1867572,
+ -1807023, -1746989, -1687470, -1628464, -1569968, -1511982, -1454502,
+ -1397528, -1341058, -1285089, -1229621, -1174650, -1120176, -1066196,
+ -1012709, -959713, -907205, -855185, -803650, -752598, -702028,
+ -651938, -602325, -553189, -504526, -456336, -408617, -361366, -314581,
+ -268261, -222405, -177009, -132073, -87593, -43570, 0
+};
+
+const int32_t filter_data_M[8193] = {
+ 0, -5008, -10058, -15150, -20285, -25462, -30682, -35945, -41250,
+ -46598, -51990, -57425, -62903, -68425, -73990, -79599, -85252, -90949,
+ -96690, -102475, -108304, -114178, -120097, -126060, -132068, -138121,
+ -144219, -150362, -156550, -162784, -169063, -175387, -181758, -188174,
+ -194636, -201145, -207699, -214300, -220947, -227641, -234381, -241168,
+ -248001, -254882, -261810, -268785, -275807, -282876, -289993, -297157,
+ -304369, -311629, -318937, -326293, -333697, -341149, -348649, -356197,
+ -363794, -371440, -379134, -386877, -394669, -402510, -410400, -418339,
+ -426328, -434365, -442452, -450589, -458775, -467011, -475297, -483632,
+ -492018, -500453, -508939, -517475, -526061, -534698, -543385, -552122,
+ -560911, -569750, -578639, -587580, -596572, -605615, -614708, -623853,
+ -633050, -642297, -651597, -660947, -670349, -679803, -689309, -698866,
+ -708475, -718136, -727849, -737615, -747432, -757301, -767223, -777197,
+ -787224, -797303, -807434, -817618, -827855, -838144, -848486, -858881,
+ -869329, -879830, -890384, -900990, -911650, -922363, -933129, -943949,
+ -954822, -965748, -976727, -987760, -998846, -1009986, -1021179,
+ -1032426, -1043727, -1055082, -1066490, -1077952, -1089467, -1101037,
+ -1112660, -1124337, -1136069, -1147854, -1159693, -1171587, -1183534,
+ -1195535, -1207591, -1219701, -1231865, -1244083, -1256355, -1268682,
+ -1281063, -1293498, -1305988, -1318532, -1331130, -1343783, -1356490,
+ -1369251, -1382067, -1394937, -1407862, -1420841, -1433874, -1446962,
+ -1460105, -1473302, -1486553, -1499859, -1513219, -1526634, -1540103,
+ -1553627, -1567205, -1580838, -1594525, -1608267, -1622063, -1635913,
+ -1649818, -1663778, -1677791, -1691859, -1705982, -1720159, -1734390,
+ -1748676, -1763015, -1777410, -1791858, -1806361, -1820917, -1835528,
+ -1850194, -1864913, -1879686, -1894514, -1909395, -1924331, -1939320,
+ -1954364, -1969461, -1984612, -1999817, -2015076, -2030388, -2045755,
+ -2061174, -2076648, -2092175, -2107755, -2123389, -2139076, -2154817,
+ -2170611, -2186458, -2202358, -2218312, -2234318, -2250378, -2266490,
+ -2282656, -2298874, -2315144, -2331468, -2347844, -2364273, -2380754,
+ -2397287, -2413873, -2430511, -2447201, -2463943, -2480737, -2497583,
+ -2514481, -2531431, -2548432, -2565485, -2582589, -2599745, -2616951,
+ -2634210, -2651519, -2668879, -2686290, -2703752, -2721265, -2738828,
+ -2756441, -2774105, -2791820, -2809584, -2827399, -2845263, -2863178,
+ -2881142, -2899155, -2917218, -2935331, -2953492, -2971703, -2989963,
+ -3008272, -3026629, -3045035, -3063490, -3081993, -3100544, -3119143,
+ -3137790, -3156485, -3175227, -3194017, -3212855, -3231739, -3250671,
+ -3269650, -3288675, -3307747, -3326866, -3346031, -3365242, -3384499,
+ -3403802, -3423151, -3442545, -3461985, -3481469, -3500999, -3520574,
+ -3540193, -3559857, -3579565, -3599318, -3619114, -3638955, -3658838,
+ -3678766, -3698736, -3718750, -3738807, -3758906, -3779048, -3799232,
+ -3819458, -3839727, -3860037, -3880388, -3900781, -3921215, -3941690,
+ -3962206, -3982762, -4003359, -4023995, -4044672, -4065388, -4086144,
+ -4106939, -4127772, -4148645, -4169557, -4190506, -4211494, -4232520,
+ -4253583, -4274684, -4295822, -4316997, -4338209, -4359457, -4380741,
+ -4402062, -4423418, -4444810, -4466237, -4487699, -4509196, -4530728,
+ -4552293, -4573893, -4595526, -4617193, -4638894, -4660627, -4682393,
+ -4704191, -4726021, -4747884, -4769778, -4791703, -4813660, -4835647,
+ -4857665, -4879713, -4901791, -4923898, -4946036, -4968202, -4990397,
+ -5012620, -5034872, -5057152, -5079459, -5101793, -5124155, -5146544,
+ -5168958, -5191399, -5213866, -5236358, -5258876, -5281418, -5303985,
+ -5326576, -5349191, -5371830, -5394492, -5417177, -5439884, -5462614,
+ -5485366, -5508139, -5530934, -5553750, -5576586, -5599443, -5622320,
+ -5645216, -5668131, -5691066, -5714019, -5736990, -5759979, -5782986,
+ -5806010, -5829050, -5852108, -5875181, -5898270, -5921374, -5944493,
+ -5967627, -5990775, -6013937, -6037113, -6060301, -6083503, -6106717,
+ -6129942, -6153180, -6176428, -6199688, -6222958, -6246238, -6269528,
+ -6292827, -6316134, -6339451, -6362775, -6386107, -6409447, -6432793,
+ -6456146, -6479504, -6502869, -6526239, -6549613, -6572992, -6596375,
+ -6619762, -6643151, -6666544, -6689938, -6713335, -6736733, -6760132,
+ -6783532, -6806931, -6830331, -6853730, -6877127, -6900523, -6923917,
+ -6947309, -6970697, -6994083, -7017464, -7040841, -7064213, -7087580,
+ -7110942, -7134297, -7157646, -7180988, -7204322, -7227648, -7250966,
+ -7274275, -7297575, -7320865, -7344144, -7367413, -7390670, -7413916,
+ -7437149, -7460370, -7483577, -7506771, -7529951, -7553115, -7576265,
+ -7599399, -7622517, -7645618, -7668702, -7691769, -7714817, -7737847,
+ -7760857, -7783848, -7806818, -7829768, -7852697, -7875604, -7898488,
+ -7921350, -7944189, -7967004, -7989794, -8012560, -8035300, -8058014,
+ -8080702, -8103363, -8125996, -8148602, -8171178, -8193726, -8216244,
+ -8238732, -8261189, -8283614, -8306008, -8328370, -8350698, -8372993,
+ -8395254, -8417481, -8439672, -8461827, -8483947, -8506029, -8528074,
+ -8550081, -8572050, -8593979, -8615869, -8637718, -8659527, -8681294,
+ -8703020, -8724702, -8746342, -8767938, -8789490, -8810996, -8832458,
+ -8853873, -8875242, -8896563, -8917837, -8939062, -8960238, -8981365,
+ -9002441, -9023467, -9044441, -9065363, -9086233, -9107050, -9127812,
+ -9148520, -9169174, -9189771, -9210312, -9230797, -9251224, -9271593,
+ -9291903, -9312154, -9332344, -9352475, -9372544, -9392551, -9412496,
+ -9432378, -9452196, -9471949, -9491638, -9511261, -9530818, -9550308,
+ -9569730, -9589084, -9608370, -9627586, -9646732, -9665807, -9684811,
+ -9703743, -9722602, -9741388, -9760100, -9778737, -9797299, -9815785,
+ -9834195, -9852527, -9870782, -9888957, -9907054, -9925071, -9943007,
+ -9960862, -9978635, -9996326, -10013933, -10031457, -10048896,
+ -10066250, -10083518, -10100699, -10117793, -10134799, -10151717,
+ -10168545, -10185284, -10201931, -10218488, -10234952, -10251324,
+ -10267603, -10283787, -10299877, -10315871, -10331769, -10347571,
+ -10363275, -10378880, -10394387, -10409794, -10425102, -10440308,
+ -10455412, -10470414, -10485313, -10500109, -10514799, -10529385,
+ -10543865, -10558238, -10572504, -10586662, -10600712, -10614652,
+ -10628482, -10642201, -10655809, -10669304, -10682687, -10695956,
+ -10709110, -10722150, -10735074, -10747881, -10760571, -10773143,
+ -10785597, -10797931, -10810145, -10822238, -10834210, -10846060,
+ -10857786, -10869389, -10880868, -10892221, -10903449, -10914550,
+ -10925524, -10936370, -10947087, -10957674, -10968131, -10978458,
+ -10988653, -10998715, -11008644, -11018440, -11028100, -11037626,
+ -11047015, -11056268, -11065383, -11074360, -11083198, -11091897,
+ -11100455, -11108871, -11117146, -11125278, -11133267, -11141112,
+ -11148811, -11156366, -11163774, -11171034, -11178147, -11185112,
+ -11191927, -11198592, -11205107, -11211469, -11217680, -11223738,
+ -11229642, -11235391, -11240985, -11246424, -11251705, -11256830,
+ -11261796, -11266603, -11271250, -11275738, -11280064, -11284228,
+ -11288229, -11292067, -11295741, -11299250, -11302594, -11305771,
+ -11308781, -11311624, -11314298, -11316802, -11319136, -11321300,
+ -11323292, -11325112, -11326759, -11328232, -11329531, -11330654,
+ -11331601, -11332372, -11332965, -11333380, -11333616, -11333673,
+ -11333549, -11333243, -11332756, -11332087, -11331233, -11330196,
+ -11328974, -11327566, -11325972, -11324191, -11322222, -11320064,
+ -11317717, -11315181, -11312453, -11309534, -11306422, -11303118,
+ -11299620, -11295928, -11292040, -11287956, -11283676, -11279199,
+ -11274523, -11269648, -11264574, -11259300, -11253825, -11248148,
+ -11242268, -11236185, -11229898, -11223407, -11216710, -11209808,
+ -11202698, -11195381, -11187855, -11180121, -11172176, -11164022,
+ -11155656, -11147078, -11138288, -11129284, -11120067, -11110634,
+ -11100987, -11091123, -11081042, -11070743, -11060227, -11049491,
+ -11038536, -11027360, -11015963, -11004344, -10992502, -10980438,
+ -10968149, -10955636, -10942897, -10929933, -10916742, -10903323,
+ -10889676, -10875800, -10861695, -10847359, -10832793, -10817995,
+ -10802964, -10787701, -10772204, -10756473, -10740507, -10724305,
+ -10707866, -10691191, -10674278, -10657126, -10639735, -10622105,
+ -10604234, -10586122, -10567768, -10549172, -10530332, -10511249,
+ -10491921, -10472349, -10452530, -10432465, -10412153, -10391593,
+ -10370785, -10349728, -10328421, -10306864, -10285055, -10262996,
+ -10240683, -10218118, -10195300, -10172227, -10148899, -10125316,
+ -10101477, -10077381, -10053027, -10028416, -10003546, -9978417,
+ -9953028, -9927378, -9901467, -9875295, -9848860, -9822162, -9795201,
+ -9767976, -9740485, -9712730, -9684708, -9656420, -9627865, -9599042,
+ -9569950, -9540590, -9510960, -9481060, -9450889, -9420447, -9389733,
+ -9358746, -9327487, -9295954, -9264146, -9232064, -9199707, -9167074,
+ -9134164, -9100978, -9067513, -9033771, -8999750, -8965450, -8930870,
+ -8896009, -8860868, -8825446, -8789741, -8753754, -8717485, -8680931,
+ -8644094, -8606972, -8569564, -8531872, -8493893, -8455627, -8417075,
+ -8378234, -8339106, -8299689, -8259982, -8219986, -8179700, -8139123,
+ -8098255, -8057095, -8015644, -7973899, -7931862, -7889531, -7846906,
+ -7803987, -7760772, -7717262, -7673457, -7629355, -7584956, -7540260,
+ -7495266, -7449974, -7404384, -7358495, -7312306, -7265817, -7219028,
+ -7171938, -7124548, -7076855, -7028861, -6980564, -6931964, -6883062,
+ -6833855, -6784345, -6734530, -6684410, -6633986, -6583255, -6532219,
+ -6480876, -6429227, -6377270, -6325007, -6272435, -6219555, -6166367,
+ -6112869, -6059063, -6004947, -5950521, -5895784, -5840737, -5785380,
+ -5729711, -5673730, -5617437, -5560832, -5503915, -5446685, -5389142,
+ -5331285, -5273114, -5214629, -5155830, -5096717, -5037288, -4977544,
+ -4917485, -4857110, -4796419, -4735412, -4674088, -4612447, -4550490,
+ -4488215, -4425622, -4362712, -4299484, -4235937, -4172072, -4107888,
+ -4043386, -3978564, -3913423, -3847962, -3782181, -3716081, -3649660,
+ -3582919, -3515858, -3448476, -3380773, -3312749, -3244403, -3175736,
+ -3106748, -3037438, -2967806, -2897852, -2827576, -2756978, -2686057,
+ -2614814, -2543248, -2471359, -2399147, -2326612, -2253755, -2180573,
+ -2107069, -2033241, -1959090, -1884615, -1809816, -1734694, -1659247,
+ -1583477, -1507383, -1430965, -1354223, -1277157, -1199766, -1122052,
+ -1044013, -965650, -886963, -807951, -728615, -648955, -568970,
+ -488662, -408029, -327071, -245790, -164184, -82254, 0, 82578, 165480,
+ 248707, 332258, 416132, 500331, 584853, 669699, 754868, 840362, 926179,
+ 1012319, 1098782, 1185569, 1272679, 1360112, 1447867, 1535946, 1624347,
+ 1713070, 1802116, 1891484, 1981174, 2071186, 2161520, 2252175, 2343152,
+ 2434450, 2526069, 2618009, 2710269, 2802850, 2895751, 2988972, 3082513,
+ 3176374, 3270554, 3365053, 3459871, 3555008, 3650463, 3746236, 3842327,
+ 3938736, 4035462, 4132505, 4229866, 4327542, 4425535, 4523844, 4622468,
+ 4721408, 4820662, 4920232, 5020116, 5120313, 5220825, 5321649, 5422787,
+ 5524237, 5626000, 5728075, 5830461, 5933158, 6036166, 6139484, 6243112,
+ 6347050, 6451297, 6555852, 6660716, 6765888, 6871368, 6977154, 7083247,
+ 7189646, 7296351, 7403360, 7510675, 7618294, 7726217, 7834442, 7942971,
+ 8051802, 8160935, 8270369, 8380104, 8490139, 8600474, 8711108, 8822040,
+ 8933271, 9044799, 9156625, 9268746, 9381163, 9493876, 9606883, 9720185,
+ 9833780, 9947667, 10061847, 10176319, 10291082, 10406135, 10521477,
+ 10637109, 10753030, 10869238, 10985733, 11102515, 11219583, 11336935,
+ 11454572, 11572493, 11690697, 11809184, 11927952, 12047000, 12166329,
+ 12285938, 12405825, 12525990, 12646433, 12767152, 12888146, 13009416,
+ 13130960, 13252777, 13374866, 13497228, 13619860, 13742763, 13865935,
+ 13989376, 14113084, 14237059, 14361300, 14485807, 14610577, 14735612,
+ 14860908, 14986467, 15112286, 15238366, 15364704, 15491301, 15618155,
+ 15745265, 15872631, 16000251, 16128124, 16256251, 16384629, 16513258,
+ 16642136, 16771263, 16900639, 17030261, 17160128, 17290241, 17420598,
+ 17551197, 17682039, 17813121, 17944443, 18076003, 18207802, 18339837,
+ 18472107, 18604612, 18737351, 18870322, 19003525, 19136957, 19270619,
+ 19404509, 19538626, 19672969, 19807536, 19942327, 20077340, 20212575,
+ 20348030, 20483703, 20619595, 20755703, 20892027, 21028565, 21165316,
+ 21302279, 21439453, 21576836, 21714428, 21852227, 21990231, 22128440,
+ 22266852, 22405467, 22544282, 22683297, 22822510, 22961920, 23101526,
+ 23241327, 23381320, 23521506, 23661882, 23802447, 23943200, 24084139,
+ 24225264, 24366573, 24508064, 24649736, 24791588, 24933619, 25075826,
+ 25218209, 25360767, 25503497, 25646399, 25789470, 25932711, 26076118,
+ 26219691, 26363429, 26507329, 26651391, 26795613, 26939993, 27084530,
+ 27229223, 27374069, 27519068, 27664219, 27809518, 27954966, 28100560,
+ 28246299, 28392181, 28538206, 28684370, 28830674, 28977114, 29123690,
+ 29270400, 29417243, 29564216, 29711319, 29858549, 30005906, 30153386,
+ 30300990, 30448715, 30596559, 30744521, 30892599, 31040792, 31189098,
+ 31337515, 31486042, 31634676, 31783417, 31932262, 32081209, 32230258,
+ 32379407, 32528652, 32677994, 32827430, 32976958, 33126577, 33276285,
+ 33426079, 33575960, 33725923, 33875969, 34026094, 34176298, 34326578,
+ 34476933, 34627360, 34777858, 34928426, 35079060, 35229760, 35380524,
+ 35531349, 35682234, 35833177, 35984177, 36135230, 36286336, 36437492,
+ 36588696, 36739948, 36891244, 37042582, 37193962, 37345380, 37496836,
+ 37648326, 37799849, 37951404, 38102987, 38254598, 38406234, 38557893,
+ 38709574, 38861273, 39012990, 39164722, 39316467, 39468223, 39619988,
+ 39771761, 39923538, 40075319, 40227100, 40378880, 40530657, 40682429,
+ 40834193, 40985948, 41137691, 41289421, 41441135, 41592831, 41744507,
+ 41896161, 42047790, 42199394, 42350969, 42502513, 42654024, 42805501,
+ 42956940, 43108340, 43259699, 43411013, 43562283, 43713504, 43864674,
+ 44015793, 44166856, 44317863, 44468811, 44619697, 44770520, 44921276,
+ 45071965, 45222584, 45373130, 45523601, 45673995, 45824309, 45974542,
+ 46124691, 46274754, 46424728, 46574611, 46724402, 46874096, 47023693,
+ 47173190, 47322584, 47471874, 47621056, 47770129, 47919090, 48067936,
+ 48216667, 48365278, 48513768, 48662134, 48810374, 48958486, 49106467,
+ 49254314, 49402026, 49549600, 49697033, 49844323, 49991468, 50138465,
+ 50285312, 50432007, 50578546, 50724927, 50871148, 51017207, 51163101,
+ 51308828, 51454384, 51599768, 51744978, 51890009, 52034861, 52179531,
+ 52324015, 52468312, 52612419, 52756334, 52900054, 53043576, 53186898,
+ 53330017, 53472931, 53615638, 53758134, 53900418, 54042486, 54184336,
+ 54325965, 54467372, 54608552, 54749505, 54890226, 55030714, 55170966,
+ 55310979, 55450751, 55590279, 55729560, 55868593, 56007373, 56145899,
+ 56284168, 56422177, 56559924, 56697406, 56834620, 56971564, 57108235,
+ 57244630, 57380747, 57516584, 57652136, 57787402, 57922379, 58057064,
+ 58191455, 58325549, 58459343, 58592835, 58726021, 58858900, 58991468,
+ 59123722, 59255660, 59387280, 59518578, 59649552, 59780199, 59910516,
+ 60040500, 60170150, 60299461, 60428432, 60557059, 60685340, 60813272,
+ 60940852, 61068078, 61194946, 61321454, 61447599, 61573379, 61698790,
+ 61823830, 61948496, 62072785, 62196694, 62320221, 62443363, 62566117,
+ 62688480, 62810449, 62932022, 63053195, 63173967, 63294333, 63414292,
+ 63533840, 63652975, 63771693, 63889993, 64007870, 64125323, 64242348,
+ 64358943, 64475104, 64590829, 64706115, 64820960, 64935359, 65049311,
+ 65162813, 65275861, 65388453, 65500586, 65612257, 65723464, 65834202,
+ 65944471, 66054265, 66163584, 66272423, 66380781, 66488653, 66596037,
+ 66702931, 66809331, 66915235, 67020639, 67125541, 67229938, 67333827,
+ 67437205, 67540069, 67642416, 67744244, 67845548, 67946328, 68046579,
+ 68146299, 68245484, 68344132, 68442241, 68539806, 68636826, 68733296,
+ 68829215, 68924580, 69019387, 69113633, 69207316, 69300433, 69392980,
+ 69484956, 69576356, 69667179, 69757420, 69847078, 69936149, 70024630,
+ 70112519, 70199812, 70286506, 70372600, 70458089, 70542971, 70627242,
+ 70710901, 70793944, 70876367, 70958169, 71039346, 71119895, 71199814,
+ 71279099, 71357748, 71435757, 71513124, 71589846, 71665919, 71741341,
+ 71816110, 71890221, 71963672, 72036461, 72108584, 72180038, 72250821,
+ 72320929, 72390359, 72459110, 72527177, 72594558, 72661250, 72727250,
+ 72792555, 72857162, 72921068, 72984271, 73046767, 73108554, 73169628,
+ 73229987, 73289628, 73348548, 73406744, 73464213, 73520952, 73576958,
+ 73632229, 73686762, 73740553, 73793599, 73845899, 73897448, 73948245,
+ 73998286, 74047568, 74096088, 74143844, 74190833, 74237052, 74282497,
+ 74327167, 74371058, 74414167, 74456491, 74498028, 74538775, 74578729,
+ 74617887, 74656246, 74693804, 74730556, 74766502, 74801637, 74835960,
+ 74869466, 74902154, 74934020, 74965062, 74995277, 75024662, 75053214,
+ 75080931, 75107809, 75133846, 75159038, 75183384, 75206881, 75229525,
+ 75251313, 75272244, 75292314, 75311521, 75329861, 75347332, 75363931,
+ 75379655, 75394502, 75408469, 75421553, 75433752, 75445062, 75455481,
+ 75465006, 75473634, 75481363, 75488190, 75494112, 75499127, 75503232,
+ 75506423, 75508699, 75510057, 75510494, 75510007, 75508593, 75506251,
+ 75502977, 75498768, 75493622, 75487537, 75480509, 75472536, 75463616,
+ 75453745, 75442921, 75431142, 75418405, 75404706, 75390045, 75374417,
+ 75357820, 75340253, 75321711, 75302193, 75281696, 75260217, 75237755,
+ 75214305, 75189867, 75164436, 75138011, 75110589, 75082168, 75052745,
+ 75022317, 74990882, 74958438, 74924982, 74890511, 74855023, 74818516,
+ 74780986, 74742433, 74702852, 74662242, 74620600, 74577924, 74534211,
+ 74489459, 74443665, 74396828, 74348944, 74300011, 74250027, 74198989,
+ 74146896, 74093744, 74039531, 73984255, 73927914, 73870505, 73812026,
+ 73752475, 73691848, 73630145, 73567362, 73503498, 73438549, 73372514,
+ 73305391, 73237177, 73167870, 73097467, 73025967, 72953367, 72879664,
+ 72804858, 72728945, 72651923, 72573791, 72494545, 72414184, 72332705,
+ 72250107, 72166387, 72081544, 71995574, 71908476, 71820247, 71730886,
+ 71640391, 71548759, 71455988, 71362077, 71267022, 71170823, 71073477,
+ 70974982, 70875335, 70774536, 70672581, 70569470, 70465199, 70359767,
+ 70253173, 70145413, 70036486, 69926391, 69815124, 69702685, 69589071,
+ 69474281, 69358312, 69241163, 69122831, 69003315, 68882614, 68760724,
+ 68637645, 68513374, 68387910, 68261251, 68133395, 68004340, 67874085,
+ 67742628, 67609966, 67476099, 67341025, 67204741, 67067246, 66928539,
+ 66788617, 66647480, 66505125, 66361550, 66216755, 66070737, 65923495,
+ 65775027, 65625332, 65474407, 65322252, 65168865, 65014245, 64858389,
+ 64701296, 64542965, 64383394, 64222582, 64060527, 63897228, 63732683,
+ 63566891, 63399850, 63231560, 63062018, 62891223, 62719173, 62545869,
+ 62371307, 62195487, 62018407, 61840066, 61660463, 61479596, 61297465,
+ 61114067, 60929401, 60743467, 60556263, 60367788, 60178041, 59987020,
+ 59794724, 59601152, 59406303, 59210175, 59012769, 58814081, 58614112,
+ 58412861, 58210325, 58006505, 57801398, 57595005, 57387323, 57178353,
+ 56968092, 56756540, 56543697, 56329560, 56114129, 55897404, 55679382,
+ 55460064, 55239448, 55017534, 54794321, 54569807, 54343992, 54116875,
+ 53888456, 53658733, 53427705, 53195373, 52961735, 52726790, 52490538,
+ 52252979, 52014110, 51773932, 51532444, 51289646, 51045536, 50800114,
+ 50553379, 50305332, 50055970, 49805295, 49553305, 49299999, 49045377,
+ 48789439, 48532184, 48273612, 48013722, 47752513, 47489986, 47226140,
+ 46960975, 46694489, 46426683, 46157557, 45887110, 45615341, 45342251,
+ 45067839, 44792105, 44515048, 44236669, 43956967, 43675942, 43393594,
+ 43109922, 42824927, 42538608, 42250965, 41961998, 41671707, 41380092,
+ 41087152, 40792889, 40497301, 40200388, 39902152, 39602591, 39301705,
+ 38999496, 38695962, 38391104, 38084922, 37777416, 37468587, 37158433,
+ 36846957, 36534157, 36220034, 35904588, 35587820, 35269729, 34950316,
+ 34629581, 34307525, 33984147, 33659449, 33333430, 33006091, 32677432,
+ 32347454, 32016157, 31683541, 31349607, 31014356, 30677788, 30339903,
+ 30000701, 29660185, 29318353, 28975207, 28630747, 28284974, 27937889,
+ 27589491, 27239783, 26888763, 26536434, 26182796, 25827849, 25471595,
+ 25114034, 24755167, 24394994, 24033517, 23670736, 23306653, 22941268,
+ 22574582, 22206595, 21837310, 21466726, 21094846, 20721669, 20347197,
+ 19971430, 19594371, 19216020, 18836377, 18455445, 18073224, 17689715,
+ 17304920, 16918840, 16531475, 16142828, 15752899, 15361690, 14969201,
+ 14575435, 14180392, 13784074, 13386483, 12987618, 12587483, 12186078,
+ 11783404, 11379464, 10974259, 10567789, 10160057, 9751064, 9340812,
+ 8929302, 8516536, 8102515, 7687241, 7270716, 6852941, 6433918, 6013649,
+ 5592135, 5169378, 4745379, 4320142, 3893666, 3465955, 3037010, 2606833,
+ 2175425, 1742789, 1308927, 873840, 437530, 0, -438749, -878714,
+ -1319895, -1762288, -2205891, -2650704, -3096722, -3543945, -3992370,
+ -4441994, -4892817, -5344835, -5798047, -6252449, -6708041, -7164819,
+ -7622781, -8081925, -8542249, -9003750, -9466426, -9930274, -10395292,
+ -10861478, -11328829, -11797343, -12267017, -12737848, -13209835,
+ -13682974, -14157263, -14632699, -15109280, -15587003, -16065865,
+ -16545864, -17026997, -17509261, -17992654, -18477173, -18962814,
+ -19449576, -19937455, -20426448, -20916554, -21407767, -21900087,
+ -22393509, -22888032, -23383651, -23880364, -24378168, -24877061,
+ -25377038, -25878096, -26380234, -26883447, -27387732, -27893087,
+ -28399507, -28906991, -29415534, -29925134, -30435787, -30947490,
+ -31460239, -31974032, -32488864, -33004733, -33521636, -34039568,
+ -34558526, -35078507, -35599508, -36121524, -36644553, -37168591,
+ -37693634, -38219679, -38746722, -39274760, -39803789, -40333804,
+ -40864804, -41396783, -41929739, -42463667, -42998563, -43534425,
+ -44071247, -44609027, -45147760, -45687443, -46228072, -46769642,
+ -47312150, -47855592, -48399964, -48945262, -49491481, -50038619,
+ -50586671, -51135632, -51685499, -52236267, -52787933, -53340493,
+ -53893941, -54448274, -55003488, -55559578, -56116541, -56674371,
+ -57233065, -57792619, -58353027, -58914286, -59476391, -60039338,
+ -60603122, -61167739, -61733184, -62299454, -62866543, -63434446,
+ -64003160, -64572680, -65143001, -65714119, -66286029, -66858726,
+ -67432205, -68006463, -68581493, -69157292, -69733855, -70311177,
+ -70889253, -71468078, -72047648, -72627957, -73209001, -73790775,
+ -74373274, -74956492, -75540426, -76125070, -76710418, -77296467,
+ -77883210, -78470644, -79058762, -79647560, -80237032, -80827174,
+ -81417980, -82009445, -82601564, -83194331, -83787742, -84381790,
+ -84976472, -85571781, -86167712, -86764260, -87361419, -87959184,
+ -88557550, -89156511, -89756062, -90356197, -90956910, -91558197,
+ -92160052, -92762468, -93365441, -93968965, -94573035, -95177644,
+ -95782787, -96388459, -96994653, -97601364, -98208587, -98816315,
+ -99424542, -100033264, -100642473, -101252165, -101862333, -102472972,
+ -103084075, -103695637, -104307652, -104920114, -105533016, -106146354,
+ -106760120, -107374309, -107988915, -108603931, -109219352, -109835171,
+ -110451383, -111067981, -111684959, -112302311, -112920031, -113538112,
+ -114156548, -114775333, -115394461, -116013925, -116633719, -117253837,
+ -117874272, -118495017, -119116068, -119737416, -120359056, -120980982,
+ -121603186, -122225662, -122848404, -123471405, -124094659, -124718159,
+ -125341898, -125965871, -126590069, -127214487, -127839118, -128463956,
+ -129088992, -129714222, -130339638, -130965233, -131591001, -132216934,
+ -132843027, -133469271, -134095661, -134722189, -135348849, -135975634,
+ -136602536, -137229549, -137856666, -138483880, -139111183, -139738570,
+ -140366032, -140993563, -141621156, -142248804, -142876499, -143504234,
+ -144132003, -144759798, -145387612, -146015437, -146643268, -147271095,
+ -147898913, -148526714, -149154490, -149782234, -150409940, -151037599,
+ -151665205, -152292749, -152920226, -153547626, -154174943, -154802170,
+ -155429298, -156056321, -156683231, -157310021, -157936682, -158563208,
+ -159189591, -159815823, -160441897, -161067806, -161693540, -162319094,
+ -162944459, -163569628, -164194593, -164819346, -165443880, -166068186,
+ -166692258, -167316087, -167939666, -168562986, -169186041, -169808822,
+ -170431321, -171053531, -171675443, -172297050, -172918344, -173539318,
+ -174159962, -174780269, -175400231, -176019841, -176639090, -177257970,
+ -177876473, -178494592, -179112317, -179729642, -180346558, -180963056,
+ -181579129, -182194769, -182809968, -183424717, -184039008, -184652833,
+ -185266184, -185879053, -186491431, -187103311, -187714683, -188325540,
+ -188935874, -189545675, -190154937, -190763650, -191371806, -191979397,
+ -192586415, -193192850, -193798696, -194403942, -195008582, -195612606,
+ -196216006, -196818774, -197420901, -198022379, -198623199, -199223352,
+ -199822831, -200421626, -201019730, -201617132, -202213826, -202809803,
+ -203405053, -203999568, -204593340, -205186360, -205778619, -206370109,
+ -206960821, -207550746, -208139876, -208728202, -209315715, -209902407,
+ -210488268, -211073290, -211657465, -212240783, -212823236, -213404815,
+ -213985511, -214565315, -215144219, -215722214, -216299290, -216875439,
+ -217450653, -218024921, -218598236, -219170588, -219741969, -220312370,
+ -220881781, -221450194, -222017599, -222583989, -223149353, -223713683,
+ -224276970, -224839205, -225400379, -225960482, -226519507, -227077443,
+ -227634282, -228190015, -228744632, -229298125, -229850484, -230401700,
+ -230951765, -231500669, -232048403, -232594958, -233140324, -233684493,
+ -234227456, -234769203, -235309725, -235849013, -236387058, -236923850,
+ -237459380, -237993640, -238526620, -239058310, -239588702, -240117786,
+ -240645553, -241171993, -241697098, -242220859, -242743265, -243264307,
+ -243783977, -244302265, -244819162, -245334658, -245848744, -246361411,
+ -246872650, -247382450, -247890803, -248397700, -248903130, -249407085,
+ -249909556, -250410532, -250910005, -251407964, -251904402, -252399308,
+ -252892673, -253384487, -253874742, -254363427, -254850533, -255336052,
+ -255819972, -256302286, -256782983, -257262054, -257739490, -258215281,
+ -258689417, -259161890, -259632689, -260101806, -260569231, -261034953,
+ -261498965, -261961256, -262421817, -262880637, -263337709, -263793022,
+ -264246567, -264698334, -265148314, -265596497, -266042874, -266487435,
+ -266930171, -267371072, -267810128, -268247331, -268682670, -269116136,
+ -269547720, -269977411, -270405201, -270831079, -271255037, -271677064,
+ -272097152, -272515290, -272931469, -273345680, -273757913, -274168157,
+ -274576405, -274982646, -275386871, -275789069, -276189232, -276587351,
+ -276983414, -277377413, -277769339, -278159181, -278546930, -278932577,
+ -279316112, -279697526, -280076808, -280453949, -280828940, -281201771,
+ -281572433, -281940916, -282307210, -282671306, -283033194, -283392865,
+ -283750310, -284105518, -284458480, -284809186, -285157627, -285503794,
+ -285847677, -286189266, -286528551, -286865524, -287200175, -287532494,
+ -287862471, -288190097, -288515363, -288838259, -289158775, -289476902,
+ -289792630, -290105951, -290416853, -290725329, -291031368, -291334961,
+ -291636098, -291934769, -292230967, -292524680, -292815899, -293104615,
+ -293390819, -293674500, -293955650, -294234259, -294510318, -294783816,
+ -295054745, -295323096, -295588858, -295852022, -296112579, -296370519,
+ -296625834, -296878513, -297128547, -297375927, -297620644, -297862687,
+ -298102048, -298338717, -298572685, -298803942, -299032480, -299258288,
+ -299481358, -299701680, -299919244, -300134042, -300346064, -300555300,
+ -300761742, -300965381, -301166206, -301364208, -301559379, -301751709,
+ -301941189, -302127809, -302311561, -302492435, -302670421, -302845511,
+ -303017695, -303186965, -303353310, -303516723, -303677192, -303834711,
+ -303989268, -304140856, -304289465, -304435086, -304577709, -304717326,
+ -304853928, -304987505, -305118048, -305245549, -305369998, -305491386,
+ -305609704, -305724944, -305837095, -305946150, -306052098, -306154932,
+ -306254642, -306351219, -306444655, -306534939, -306622064, -306706020,
+ -306786799, -306864392, -306938789, -307009982, -307077962, -307142720,
+ -307204248, -307262536, -307317575, -307369358, -307417875, -307463117,
+ -307505075, -307543742, -307579107, -307611163, -307639901, -307665312,
+ -307687386, -307706117, -307721495, -307733510, -307742156, -307747423,
+ -307749302, -307747785, -307742864, -307734529, -307722773, -307707586,
+ -307688961, -307666888, -307641360, -307612367, -307579902, -307543956,
+ -307504521, -307461587, -307415147, -307365193, -307311715, -307254707,
+ -307194158, -307130062, -307062410, -306991193, -306916403, -306838032,
+ -306756072, -306670514, -306581351, -306488574, -306392175, -306292147,
+ -306188479, -306081166, -305970198, -305855568, -305737267, -305615288,
+ -305489622, -305360261, -305227198, -305090425, -304949933, -304805715,
+ -304657762, -304506068, -304350623, -304191420, -304028452, -303861711,
+ -303691188, -303516876, -303338767, -303156854, -302971128, -302781583,
+ -302588210, -302391001, -302189950, -301985049, -301776289, -301563664,
+ -301347165, -301126786, -300902518, -300674355, -300442288, -300206311,
+ -299966416, -299722595, -299474842, -299223148, -298967507, -298707910,
+ -298444352, -298176824, -297905320, -297629831, -297350352, -297066874,
+ -296779390, -296487894, -296192379, -295892836, -295589260, -295281642,
+ -294969977, -294654256, -294334474, -294010623, -293682695, -293350685,
+ -293014586, -292674389, -292330090, -291981680, -291629153, -291272503,
+ -290911722, -290546803, -290177741, -289804529, -289427159, -289045625,
+ -288659921, -288270039, -287875974, -287477719, -287075268, -286668613,
+ -286257749, -285842669, -285423367, -284999835, -284572069, -284140062,
+ -283703807, -283263297, -282818528, -282369493, -281916184, -281458597,
+ -280996726, -280530563, -280060103, -279585340, -279106268, -278622881,
+ -278135172, -277643137, -277146768, -276646061, -276141009, -275631606,
+ -275117847, -274599726, -274077237, -273550374, -273019132, -272483504,
+ -271943486, -271399072, -270850256, -270297032, -269739396, -269177341,
+ -268610862, -268039954, -267464611, -266884827, -266300599, -265711919,
+ -265118783, -264521186, -263919122, -263312586, -262701573, -262086078,
+ -261466096, -260841621, -260212648, -259579173, -258941191, -258298696,
+ -257651684, -257000149, -256344088, -255683494, -255018363, -254348691,
+ -253674472, -252995702, -252312376, -251624490, -250932038, -250235017,
+ -249533421, -248827247, -248116489, -247401144, -246681206, -245956672,
+ -245227536, -244493795, -243755445, -243012480, -242264897, -241512692,
+ -240755860, -239994397, -239228300, -238457563, -237682183, -236902156,
+ -236117479, -235328146, -234534154, -233735499, -232932177, -232124185,
+ -231311519, -230494175, -229672148, -228845437, -228014036, -227177942,
+ -226337152, -225491662, -224641469, -223786568, -222926958, -222062633,
+ -221193591, -220319829, -219441343, -218558130, -217670186, -216777509,
+ -215880095, -214977941, -214071044, -213159401, -212243009, -211321865,
+ -210395966, -209465308, -208529890, -207589708, -206644759, -205695041,
+ -204740551, -203781286, -202817243, -201848420, -200874814, -199896423,
+ -198913244, -197925275, -196932512, -195934954, -194932599, -193925443,
+ -192913485, -191896723, -190875153, -189848774, -188817584, -187781580,
+ -186740761, -185695124, -184644668, -183589390, -182529288, -181464360,
+ -180394606, -179320022, -178240607, -177156359, -176067277, -174973358,
+ -173874601, -172771005, -171662568, -170549288, -169431164, -168308195,
+ -167180378, -166047713, -164910199, -163767833, -162620615, -161468543,
+ -160311616, -159149834, -157983194, -156811696, -155635339, -154454122,
+ -153268044, -152077104, -150881300, -149680633, -148475101, -147264703,
+ -146049440, -144829310, -143604312, -142374446, -141139711, -139900107,
+ -138655633, -137406289, -136152075, -134892989, -133629032, -132360204,
+ -131086504, -129807931, -128524486, -127236169, -125942979, -124644917,
+ -123341982, -122034174, -120721494, -119403941, -118081516, -116754219,
+ -115422050, -114085009, -112743097, -111396314, -110044660, -108688136,
+ -107326742, -105960479, -104589347, -103213348, -101832480, -100446746,
+ -99056145, -97660680, -96260349, -94855155, -93445098, -92030179,
+ -90610398, -89185758, -87756259, -86321901, -84882687, -83438617,
+ -81989693, -80535915, -79077286, -77613805, -76145476, -74672298,
+ -73194275, -71711406, -70223693, -68731139, -67233745, -65731512,
+ -64224442, -62712537, -61195798, -59674228, -58147828, -56616601,
+ -55080547, -53539670, -51993970, -50443451, -48888115, -47327963,
+ -45762997, -44193220, -42618635, -41039243, -39455047, -37866049,
+ -36272253, -34673659, -33070271, -31462091, -29849123, -28231368,
+ -26608829, -24981509, -23349412, -21712538, -20070893, -18424478,
+ -16773296, -15117351, -13456645, -11791182, -10120965, -8445996,
+ -6766279, -5081818, -3392616, -1698675, 0, 1703406, 3411540, 5124399,
+ 6841978, 8564275, 10291285, 12023005, 13759430, 15500559, 17246385,
+ 18996906, 20752118, 22512017, 24276599, 26045859, 27819794, 29598400,
+ 31381673, 33169607, 34962200, 36759446, 38561342, 40367883, 42179065,
+ 43994882, 45815332, 47640409, 49470108, 51304425, 53143356, 54986895,
+ 56835038, 58687780, 60545117, 62407042, 64273553, 66144642, 68020306,
+ 69900540, 71785337, 73674694, 75568605, 77467064, 79370067, 81277609,
+ 83189683, 85106284, 87027407, 88953047, 90883198, 92817854, 94757010,
+ 96700660, 98648799, 100601420, 102558519, 104520088, 106486122,
+ 108456616, 110431564, 112410958, 114394794, 116383065, 118375765,
+ 120372889, 122374429, 124380379, 126390734, 128405486, 130424630,
+ 132448159, 134476066, 136508346, 138544991, 140585995, 142631351,
+ 144681053, 146735094, 148793467, 150856165, 152923182, 154994510,
+ 157070143, 159150073, 161234294, 163322799, 165415580, 167512631,
+ 169613943, 171719511, 173829326, 175943381, 178061669, 180184183,
+ 182310915, 184441857, 186577003, 188716344, 190859873, 193007582,
+ 195159464, 197315510, 199475714, 201640066, 203808560, 205981188,
+ 208157941, 210338811, 212523791, 214712872, 216906046, 219103306,
+ 221304642, 223510047, 225719513, 227933030, 230150591, 232372188,
+ 234597811, 236827453, 239061104, 241298757, 243540402, 245786031,
+ 248035636, 250289207, 252546735, 254808213, 257073630, 259342979,
+ 261616250, 263893434, 266174523, 268459506, 270748376, 273041122,
+ 275337736, 277638209, 279942530, 282250692, 284562684, 286878497,
+ 289198122, 291521549, 293848768, 296179771, 298514547, 300853087,
+ 303195382, 305541421, 307891194, 310244693, 312601907, 314962825,
+ 317327440, 319695739, 322067714, 324443354, 326822650, 329205590,
+ 331592166, 333982366, 336376181, 338773600, 341174613, 343579210,
+ 345987380, 348399112, 350814397, 353233224, 355655582, 358081460,
+ 360510849, 362943737, 365380114, 367819968, 370263290, 372710068,
+ 375160291, 377613949, 380071030, 382531525, 384995420, 387462707,
+ 389933372, 392407406, 394884798, 397365535, 399849607, 402337002,
+ 404827710, 407321718, 409819016, 412319591, 414823433, 417330530,
+ 419840871, 422354443, 424871236, 427391237, 429914435, 432440818,
+ 434970374, 437503092, 440038960, 442577966, 445120097, 447665343,
+ 450213690, 452765128, 455319643, 457877224, 460437859, 463001536,
+ 465568241, 468137964, 470710692, 473286412, 475865112, 478446779,
+ 481031403, 483618969, 486209465, 488802879, 491399199, 493998411,
+ 496600503, 499205463, 501813277, 504423933, 507037418, 509653720,
+ 512272825, 514894721, 517519395, 520146833, 522777023, 525409952,
+ 528045606, 530683974, 533325040, 535968794, 538615220, 541264306,
+ 543916039, 546570406, 549227393, 551886986, 554549173, 557213939,
+ 559881273, 562551159, 565223585, 567898537, 570576001, 573255964,
+ 575938412, 578623331, 581310708, 584000529, 586692781, 589387448,
+ 592084519, 594783978, 597485811, 600190006, 602896547, 605605421,
+ 608316615, 611030112, 613745901, 616463966, 619184293, 621906869,
+ 624631679, 627358708, 630087943, 632819369, 635552972, 638288737,
+ 641026651, 643766698, 646508864, 649253135, 651999496, 654747932,
+ 657498430, 660250974, 663005549, 665762142, 668520737, 671281320,
+ 674043876, 676808390, 679574848, 682343233, 685113533, 687885731,
+ 690659813, 693435764, 696213569, 698993212, 701774680, 704557956,
+ 707343026, 710129874, 712918486, 715708846, 718500939, 721294750,
+ 724090264, 726887464, 729686337, 732486866, 735289037, 738092833,
+ 740898240, 743705242, 746513823, 749323968, 752135662, 754948889,
+ 757763634, 760579880, 763397612, 766216815, 769037473, 771859570,
+ 774683090, 777508018, 780334339, 783162035, 785991092, 788821493,
+ 791653222, 794486265, 797320604, 800156225, 802993110, 805831244,
+ 808670611, 811511195, 814352979, 817195949, 820040087, 822885378,
+ 825731805, 828579352, 831428004, 834277743, 837128554, 839980420,
+ 842833325, 845687253, 848542187, 851398111, 854255009, 857112865,
+ 859971661, 862831382, 865692011, 868553531, 871415927, 874279181,
+ 877143277, 880008198, 882873929, 885740451, 888607750, 891475807,
+ 894344607, 897214133, 900084367, 902955294, 905826897, 908699158,
+ 911572062, 914445591, 917319728, 920194457, 923069761, 925945623,
+ 928822026, 931698954, 934576388, 937454313, 940332712, 943211567,
+ 946090861, 948970578, 951850700, 954731211, 957612093, 960493330,
+ 963374903, 966256797, 969138994, 972021477, 974904229, 977787232,
+ 980670470, 983553925, 986437580, 989321418, 992205421, 995089573,
+ 997973855, 1000858252, 1003742745, 1006627317, 1009511951, 1012396630,
+ 1015281336, 1018166051, 1021050759, 1023935442, 1026820083, 1029704664,
+ 1032589168, 1035473577, 1038357874, 1041242041, 1044126061, 1047009917,
+ 1049893591, 1052777065, 1055660322, 1058543344, 1061426114, 1064308615,
+ 1067190828, 1070072736, 1072954322, 1075835567, 1078716455, 1081596968,
+ 1084477087, 1087356796, 1090236076, 1093114911, 1095993281, 1098871171,
+ 1101748561, 1104625435, 1107501774, 1110377561, 1113252778, 1116127408,
+ 1119001432, 1121874833, 1124747593, 1127619694, 1130491119, 1133361849,
+ 1136231867, 1139101156, 1141969696, 1144837472, 1147704463, 1150570654,
+ 1153436026, 1156300560, 1159164240, 1162027048, 1164888964, 1167749973,
+ 1170610055, 1173469194, 1176327370, 1179184566, 1182040765, 1184895947,
+ 1187750097, 1190603194, 1193455223, 1196306164, 1199155999, 1202004711,
+ 1204852283, 1207698695, 1210543930, 1213387970, 1216230797, 1219072393,
+ 1221912740, 1224751821, 1227589616, 1230426109, 1233261281, 1236095115,
+ 1238927592, 1241758694, 1244588403, 1247416702, 1250243573, 1253068996,
+ 1255892955, 1258715432, 1261536408, 1264355866, 1267173787, 1269990154,
+ 1272804948, 1275618151, 1278429747, 1281239715, 1284048040, 1286854702,
+ 1289659683, 1292462966, 1295264533, 1298064366, 1300862446, 1303658756,
+ 1306453277, 1309245992, 1312036883, 1314825932, 1317613121, 1320398431,
+ 1323181846, 1325963346, 1328742914, 1331520532, 1334296182, 1337069847,
+ 1339841507, 1342611145, 1345378744, 1348144285, 1350907751, 1353669123,
+ 1356428383, 1359185514, 1361940498, 1364693317, 1367443952, 1370192386,
+ 1372938602, 1375682580, 1378424304, 1381163756, 1383900917, 1386635769,
+ 1389368295, 1392098478, 1394826298, 1397551739, 1400274782, 1402995410,
+ 1405713605, 1408429348, 1411142623, 1413853411, 1416561695, 1419267457,
+ 1421970678, 1424671342, 1427369431, 1430064926, 1432757810, 1435448066,
+ 1438135675, 1440820620, 1443502883, 1446182447, 1448859293, 1451533405,
+ 1454204764, 1456873353, 1459539154, 1462202150, 1464862322, 1467519654,
+ 1470174128, 1472825725, 1475474430, 1478120223, 1480763087, 1483403006,
+ 1486039961, 1488673934, 1491304909, 1493932868, 1496557793, 1499179667,
+ 1501798473, 1504414192, 1507026808, 1509636304, 1512242661, 1514845862,
+ 1517445890, 1520042728, 1522636358, 1525226763, 1527813926, 1530397829,
+ 1532978455, 1535555786, 1538129807, 1540700498, 1543267843, 1545831826,
+ 1548392428, 1550949632, 1553503421, 1556053779, 1558600688, 1561144130,
+ 1563684089, 1566220548, 1568753490, 1571282897, 1573808752, 1576331039,
+ 1578849741, 1581364840, 1583876320, 1586384163, 1588888353, 1591388873,
+ 1593885705, 1596378834, 1598868242, 1601353912, 1603835828, 1606313972,
+ 1608788328, 1611258880, 1613725610, 1616188502, 1618647538, 1621102703,
+ 1623553980, 1626001352, 1628444803, 1630884315, 1633319872, 1635751459,
+ 1638179057, 1640602651, 1643022225, 1645437761, 1647849243, 1650256655,
+ 1652659981, 1655059203, 1657454307, 1659845275, 1662232091, 1664614738,
+ 1666993202, 1669367464, 1671737510, 1674103322, 1676464885, 1678822182,
+ 1681175198, 1683523917, 1685868321, 1688208396, 1690544125, 1692875492,
+ 1695202481, 1697525076, 1699843261, 1702157021, 1704466340, 1706771201,
+ 1709071589, 1711367487, 1713658881, 1715945755, 1718228092, 1720505877,
+ 1722779095, 1725047729, 1727311765, 1729571186, 1731825977, 1734076122,
+ 1736321606, 1738562414, 1740798529, 1743029938, 1745256623, 1747478570,
+ 1749695763, 1751908188, 1754115828, 1756318669, 1758516695, 1760709892,
+ 1762898243, 1765081734, 1767260350, 1769434075, 1771602895, 1773766795,
+ 1775925759, 1778079773, 1780228821, 1782372889, 1784511962, 1786646024,
+ 1788775063, 1790899061, 1793018005, 1795131880, 1797240672, 1799344365,
+ 1801442945, 1803536397, 1805624707, 1807707860, 1809785843, 1811858639,
+ 1813926236, 1815988618, 1818045771, 1820097680, 1822144333, 1824185713,
+ 1826221808, 1828252602, 1830278082, 1832298233, 1834313041, 1836322493,
+ 1838326575, 1840325271, 1842318569, 1844306454, 1846288912, 1848265930,
+ 1850237494, 1852203589, 1854164203, 1856119322, 1858068931, 1860013017,
+ 1861951567, 1863884566, 1865812002, 1867733861, 1869650129, 1871560793,
+ 1873465840, 1875365256, 1877259027, 1879147141, 1881029585, 1882906344,
+ 1884777407, 1886642759, 1888502388, 1890356280, 1892204422, 1894046803,
+ 1895883407, 1897714224, 1899539239, 1901358440, 1903171814, 1904979348,
+ 1906781030, 1908576847, 1910366786, 1912150835, 1913928980, 1915701210,
+ 1917467513, 1919227874, 1920982283, 1922730727, 1924473193, 1926209669,
+ 1927940142, 1929664602, 1931383035, 1933095429, 1934801772, 1936502052,
+ 1938196258, 1939884376, 1941566396, 1943242305, 1944912092, 1946575744,
+ 1948233249, 1949884597, 1951529776, 1953168773, 1954801577, 1956428177,
+ 1958048560, 1959662717, 1961270634, 1962872301, 1964467707, 1966056839,
+ 1967639687, 1969216240, 1970786486, 1972350414, 1973908014, 1975459273,
+ 1977004182, 1978542728, 1980074901, 1981600691, 1983120086, 1984633076,
+ 1986139649, 1987639796, 1989133505, 1990620766, 1992101568, 1993575901,
+ 1995043754, 1996505116, 1997959979, 1999408330, 2000850159, 2002285457,
+ 2003714214, 2005136418, 2006552060, 2007961130, 2009363618, 2010759513,
+ 2012148807, 2013531488, 2014907547, 2016276974, 2017639760, 2018995894,
+ 2020345368, 2021688171, 2023024294, 2024353727, 2025676460, 2026992485,
+ 2028301792, 2029604372, 2030900215, 2032189312, 2033471653, 2034747231,
+ 2036016034, 2037278056, 2038533285, 2039781714, 2041023334, 2042258135,
+ 2043486109, 2044707247, 2045921540, 2047128980, 2048329558, 2049523265,
+ 2050710093, 2051890033, 2053063077, 2054229216, 2055388443, 2056540748,
+ 2057686124, 2058824562, 2059956054, 2061080592, 2062198169, 2063308775,
+ 2064412403, 2065509045, 2066598694, 2067681340, 2068756978, 2069825598,
+ 2070887194, 2071941757, 2072989280, 2074029756, 2075063177, 2076089536,
+ 2077108824, 2078121036, 2079126164, 2080124199, 2081115137, 2082098968,
+ 2083075686, 2084045285, 2085007757, 2085963094, 2086911292, 2087852341,
+ 2088786237, 2089712971, 2090632538, 2091544930, 2092450142, 2093348167,
+ 2094238997, 2095122628, 2095999052, 2096868263, 2097730255, 2098585021,
+ 2099432556, 2100272854, 2101105908, 2101931712, 2102750261, 2103561548,
+ 2104365568, 2105162315, 2105951783, 2106733967, 2107508860, 2108276458,
+ 2109036754, 2109789744, 2110535421, 2111273781, 2112004818, 2112728527,
+ 2113444903, 2114153940, 2114855633, 2115549978, 2116236969, 2116916601,
+ 2117588870, 2118253770, 2118911297, 2119561447, 2120204213, 2120839593,
+ 2121467580, 2122088171, 2122701361, 2123307146, 2123905522, 2124496483,
+ 2125080026, 2125656147, 2126224841, 2126786104, 2127339932, 2127886322,
+ 2128425269, 2128956770, 2129480819, 2129997415, 2130506553, 2131008229,
+ 2131502440, 2131989182, 2132468452, 2132940246, 2133404560, 2133861392,
+ 2134310739, 2134752596, 2135186961, 2135613830, 2136033201, 2136445070,
+ 2136849435, 2137246292, 2137635639, 2138017473, 2138391791, 2138758590,
+ 2139117868, 2139469622, 2139813850, 2140150549, 2140479716, 2140801350,
+ 2141115448, 2141422007, 2141721026, 2142012503, 2142296434, 2142572819,
+ 2142841655, 2143102940, 2143356672, 2143602850, 2143841472, 2144072535,
+ 2144296039, 2144511982, 2144720361, 2144921177, 2145114426, 2145300109,
+ 2145478223, 2145648767, 2145811739, 2145967140, 2146114967, 2146255220,
+ 2146387897, 2146512998, 2146630522, 2146740467, 2146842833, 2146937620,
+ 2147024826, 2147104451, 2147176495, 2147240956, 2147297835, 2147347131,
+ 2147388843, 2147422972, 2147449517, 2147468478, 2147479854, 2147483646,
+ 2147479854, 2147468478, 2147449517, 2147422972, 2147388843, 2147347131,
+ 2147297835, 2147240956, 2147176495, 2147104451, 2147024826, 2146937620,
+ 2146842833, 2146740467, 2146630522, 2146512998, 2146387897, 2146255220,
+ 2146114967, 2145967140, 2145811739, 2145648767, 2145478223, 2145300109,
+ 2145114426, 2144921177, 2144720361, 2144511982, 2144296039, 2144072535,
+ 2143841472, 2143602850, 2143356672, 2143102940, 2142841655, 2142572819,
+ 2142296434, 2142012503, 2141721026, 2141422007, 2141115448, 2140801350,
+ 2140479716, 2140150549, 2139813850, 2139469622, 2139117868, 2138758590,
+ 2138391791, 2138017473, 2137635639, 2137246292, 2136849435, 2136445070,
+ 2136033201, 2135613830, 2135186961, 2134752596, 2134310739, 2133861392,
+ 2133404560, 2132940246, 2132468452, 2131989182, 2131502440, 2131008229,
+ 2130506553, 2129997415, 2129480819, 2128956770, 2128425269, 2127886322,
+ 2127339932, 2126786104, 2126224841, 2125656147, 2125080026, 2124496483,
+ 2123905522, 2123307146, 2122701361, 2122088171, 2121467580, 2120839593,
+ 2120204213, 2119561447, 2118911297, 2118253770, 2117588870, 2116916601,
+ 2116236969, 2115549978, 2114855633, 2114153940, 2113444903, 2112728527,
+ 2112004818, 2111273781, 2110535421, 2109789744, 2109036754, 2108276458,
+ 2107508860, 2106733967, 2105951783, 2105162315, 2104365568, 2103561548,
+ 2102750261, 2101931712, 2101105908, 2100272854, 2099432556, 2098585021,
+ 2097730255, 2096868263, 2095999052, 2095122628, 2094238997, 2093348167,
+ 2092450142, 2091544930, 2090632538, 2089712971, 2088786237, 2087852341,
+ 2086911292, 2085963094, 2085007757, 2084045285, 2083075686, 2082098968,
+ 2081115137, 2080124199, 2079126164, 2078121036, 2077108824, 2076089536,
+ 2075063177, 2074029756, 2072989280, 2071941757, 2070887194, 2069825598,
+ 2068756978, 2067681340, 2066598694, 2065509045, 2064412403, 2063308775,
+ 2062198169, 2061080592, 2059956054, 2058824562, 2057686124, 2056540748,
+ 2055388443, 2054229216, 2053063077, 2051890033, 2050710093, 2049523265,
+ 2048329558, 2047128980, 2045921540, 2044707247, 2043486109, 2042258135,
+ 2041023334, 2039781714, 2038533285, 2037278056, 2036016034, 2034747231,
+ 2033471653, 2032189312, 2030900215, 2029604372, 2028301792, 2026992485,
+ 2025676460, 2024353727, 2023024294, 2021688171, 2020345368, 2018995894,
+ 2017639760, 2016276974, 2014907547, 2013531488, 2012148807, 2010759513,
+ 2009363618, 2007961130, 2006552060, 2005136418, 2003714214, 2002285457,
+ 2000850159, 1999408330, 1997959979, 1996505116, 1995043754, 1993575901,
+ 1992101568, 1990620766, 1989133505, 1987639796, 1986139649, 1984633076,
+ 1983120086, 1981600691, 1980074901, 1978542728, 1977004182, 1975459273,
+ 1973908014, 1972350414, 1970786486, 1969216240, 1967639687, 1966056839,
+ 1964467707, 1962872301, 1961270634, 1959662717, 1958048560, 1956428177,
+ 1954801577, 1953168773, 1951529776, 1949884597, 1948233249, 1946575744,
+ 1944912092, 1943242305, 1941566396, 1939884376, 1938196258, 1936502052,
+ 1934801772, 1933095429, 1931383035, 1929664602, 1927940142, 1926209669,
+ 1924473193, 1922730727, 1920982283, 1919227874, 1917467513, 1915701210,
+ 1913928980, 1912150835, 1910366786, 1908576847, 1906781030, 1904979348,
+ 1903171814, 1901358440, 1899539239, 1897714224, 1895883407, 1894046803,
+ 1892204422, 1890356280, 1888502388, 1886642759, 1884777407, 1882906344,
+ 1881029585, 1879147141, 1877259027, 1875365256, 1873465840, 1871560793,
+ 1869650129, 1867733861, 1865812002, 1863884566, 1861951567, 1860013017,
+ 1858068931, 1856119322, 1854164203, 1852203589, 1850237494, 1848265930,
+ 1846288912, 1844306454, 1842318569, 1840325271, 1838326575, 1836322493,
+ 1834313041, 1832298233, 1830278082, 1828252602, 1826221808, 1824185713,
+ 1822144333, 1820097680, 1818045771, 1815988618, 1813926236, 1811858639,
+ 1809785843, 1807707860, 1805624707, 1803536397, 1801442945, 1799344365,
+ 1797240672, 1795131880, 1793018005, 1790899061, 1788775063, 1786646024,
+ 1784511962, 1782372889, 1780228821, 1778079773, 1775925759, 1773766795,
+ 1771602895, 1769434075, 1767260350, 1765081734, 1762898243, 1760709892,
+ 1758516695, 1756318669, 1754115828, 1751908188, 1749695763, 1747478570,
+ 1745256623, 1743029938, 1740798529, 1738562414, 1736321606, 1734076122,
+ 1731825977, 1729571186, 1727311765, 1725047729, 1722779095, 1720505877,
+ 1718228092, 1715945755, 1713658881, 1711367487, 1709071589, 1706771201,
+ 1704466340, 1702157021, 1699843261, 1697525076, 1695202481, 1692875492,
+ 1690544125, 1688208396, 1685868321, 1683523917, 1681175198, 1678822182,
+ 1676464885, 1674103322, 1671737510, 1669367464, 1666993202, 1664614738,
+ 1662232091, 1659845275, 1657454307, 1655059203, 1652659981, 1650256655,
+ 1647849243, 1645437761, 1643022225, 1640602651, 1638179057, 1635751459,
+ 1633319872, 1630884315, 1628444803, 1626001352, 1623553980, 1621102703,
+ 1618647538, 1616188502, 1613725610, 1611258880, 1608788328, 1606313972,
+ 1603835828, 1601353912, 1598868242, 1596378834, 1593885705, 1591388873,
+ 1588888353, 1586384163, 1583876320, 1581364840, 1578849741, 1576331039,
+ 1573808752, 1571282897, 1568753490, 1566220548, 1563684089, 1561144130,
+ 1558600688, 1556053779, 1553503421, 1550949632, 1548392428, 1545831826,
+ 1543267843, 1540700498, 1538129807, 1535555786, 1532978455, 1530397829,
+ 1527813926, 1525226763, 1522636358, 1520042728, 1517445890, 1514845862,
+ 1512242661, 1509636304, 1507026808, 1504414192, 1501798473, 1499179667,
+ 1496557793, 1493932868, 1491304909, 1488673934, 1486039961, 1483403006,
+ 1480763087, 1478120223, 1475474430, 1472825725, 1470174128, 1467519654,
+ 1464862322, 1462202150, 1459539154, 1456873353, 1454204764, 1451533405,
+ 1448859293, 1446182447, 1443502883, 1440820620, 1438135675, 1435448066,
+ 1432757810, 1430064926, 1427369431, 1424671342, 1421970678, 1419267457,
+ 1416561695, 1413853411, 1411142623, 1408429348, 1405713605, 1402995410,
+ 1400274782, 1397551739, 1394826298, 1392098478, 1389368295, 1386635769,
+ 1383900917, 1381163756, 1378424304, 1375682580, 1372938602, 1370192386,
+ 1367443952, 1364693317, 1361940498, 1359185514, 1356428383, 1353669123,
+ 1350907751, 1348144285, 1345378744, 1342611145, 1339841507, 1337069847,
+ 1334296182, 1331520532, 1328742914, 1325963346, 1323181846, 1320398431,
+ 1317613121, 1314825932, 1312036883, 1309245992, 1306453277, 1303658756,
+ 1300862446, 1298064366, 1295264533, 1292462966, 1289659683, 1286854702,
+ 1284048040, 1281239715, 1278429747, 1275618151, 1272804948, 1269990154,
+ 1267173787, 1264355866, 1261536408, 1258715432, 1255892955, 1253068996,
+ 1250243573, 1247416702, 1244588403, 1241758694, 1238927592, 1236095115,
+ 1233261281, 1230426109, 1227589616, 1224751821, 1221912740, 1219072393,
+ 1216230797, 1213387970, 1210543930, 1207698695, 1204852283, 1202004711,
+ 1199155999, 1196306164, 1193455223, 1190603194, 1187750097, 1184895947,
+ 1182040765, 1179184566, 1176327370, 1173469194, 1170610055, 1167749973,
+ 1164888964, 1162027048, 1159164240, 1156300560, 1153436026, 1150570654,
+ 1147704463, 1144837472, 1141969696, 1139101156, 1136231867, 1133361849,
+ 1130491119, 1127619694, 1124747593, 1121874833, 1119001432, 1116127408,
+ 1113252778, 1110377561, 1107501774, 1104625435, 1101748561, 1098871171,
+ 1095993281, 1093114911, 1090236076, 1087356796, 1084477087, 1081596968,
+ 1078716455, 1075835567, 1072954322, 1070072736, 1067190828, 1064308615,
+ 1061426114, 1058543344, 1055660322, 1052777065, 1049893591, 1047009917,
+ 1044126061, 1041242041, 1038357874, 1035473577, 1032589168, 1029704664,
+ 1026820083, 1023935442, 1021050759, 1018166051, 1015281336, 1012396630,
+ 1009511951, 1006627317, 1003742745, 1000858252, 997973855, 995089573,
+ 992205421, 989321418, 986437580, 983553925, 980670470, 977787232,
+ 974904229, 972021477, 969138994, 966256797, 963374903, 960493330,
+ 957612093, 954731211, 951850700, 948970578, 946090861, 943211567,
+ 940332712, 937454313, 934576388, 931698954, 928822026, 925945623,
+ 923069761, 920194457, 917319728, 914445591, 911572062, 908699158,
+ 905826897, 902955294, 900084367, 897214133, 894344607, 891475807,
+ 888607750, 885740451, 882873929, 880008198, 877143277, 874279181,
+ 871415927, 868553531, 865692011, 862831382, 859971661, 857112865,
+ 854255009, 851398111, 848542187, 845687253, 842833325, 839980420,
+ 837128554, 834277743, 831428004, 828579352, 825731805, 822885378,
+ 820040087, 817195949, 814352979, 811511195, 808670611, 805831244,
+ 802993110, 800156225, 797320604, 794486265, 791653222, 788821493,
+ 785991092, 783162035, 780334339, 777508018, 774683090, 771859570,
+ 769037473, 766216815, 763397612, 760579880, 757763634, 754948889,
+ 752135662, 749323968, 746513823, 743705242, 740898240, 738092833,
+ 735289037, 732486866, 729686337, 726887464, 724090264, 721294750,
+ 718500939, 715708846, 712918486, 710129874, 707343026, 704557956,
+ 701774680, 698993212, 696213569, 693435764, 690659813, 687885731,
+ 685113533, 682343233, 679574848, 676808390, 674043876, 671281320,
+ 668520737, 665762142, 663005549, 660250974, 657498430, 654747932,
+ 651999496, 649253135, 646508864, 643766698, 641026651, 638288737,
+ 635552972, 632819369, 630087943, 627358708, 624631679, 621906869,
+ 619184293, 616463966, 613745901, 611030112, 608316615, 605605421,
+ 602896547, 600190006, 597485811, 594783978, 592084519, 589387448,
+ 586692781, 584000529, 581310708, 578623331, 575938412, 573255964,
+ 570576001, 567898537, 565223585, 562551159, 559881273, 557213939,
+ 554549173, 551886986, 549227393, 546570406, 543916039, 541264306,
+ 538615220, 535968794, 533325040, 530683974, 528045606, 525409952,
+ 522777023, 520146833, 517519395, 514894721, 512272825, 509653720,
+ 507037418, 504423933, 501813277, 499205463, 496600503, 493998411,
+ 491399199, 488802879, 486209465, 483618969, 481031403, 478446779,
+ 475865112, 473286412, 470710692, 468137964, 465568241, 463001536,
+ 460437859, 457877224, 455319643, 452765128, 450213690, 447665343,
+ 445120097, 442577966, 440038960, 437503092, 434970374, 432440818,
+ 429914435, 427391237, 424871236, 422354443, 419840871, 417330530,
+ 414823433, 412319591, 409819016, 407321718, 404827710, 402337002,
+ 399849607, 397365535, 394884798, 392407406, 389933372, 387462707,
+ 384995420, 382531525, 380071030, 377613949, 375160291, 372710068,
+ 370263290, 367819968, 365380114, 362943737, 360510849, 358081460,
+ 355655582, 353233224, 350814397, 348399112, 345987380, 343579210,
+ 341174613, 338773600, 336376181, 333982366, 331592166, 329205590,
+ 326822650, 324443354, 322067714, 319695739, 317327440, 314962825,
+ 312601907, 310244693, 307891194, 305541421, 303195382, 300853087,
+ 298514547, 296179771, 293848768, 291521549, 289198122, 286878497,
+ 284562684, 282250692, 279942530, 277638209, 275337736, 273041122,
+ 270748376, 268459506, 266174523, 263893434, 261616250, 259342979,
+ 257073630, 254808213, 252546735, 250289207, 248035636, 245786031,
+ 243540402, 241298757, 239061104, 236827453, 234597811, 232372188,
+ 230150591, 227933030, 225719513, 223510047, 221304642, 219103306,
+ 216906046, 214712872, 212523791, 210338811, 208157941, 205981188,
+ 203808560, 201640066, 199475714, 197315510, 195159464, 193007582,
+ 190859873, 188716344, 186577003, 184441857, 182310915, 180184183,
+ 178061669, 175943381, 173829326, 171719511, 169613943, 167512631,
+ 165415580, 163322799, 161234294, 159150073, 157070143, 154994510,
+ 152923182, 150856165, 148793467, 146735094, 144681053, 142631351,
+ 140585995, 138544991, 136508346, 134476066, 132448159, 130424630,
+ 128405486, 126390734, 124380379, 122374429, 120372889, 118375765,
+ 116383065, 114394794, 112410958, 110431564, 108456616, 106486122,
+ 104520088, 102558519, 100601420, 98648799, 96700660, 94757010,
+ 92817854, 90883198, 88953047, 87027407, 85106284, 83189683, 81277609,
+ 79370067, 77467064, 75568605, 73674694, 71785337, 69900540, 68020306,
+ 66144642, 64273553, 62407042, 60545117, 58687780, 56835038, 54986895,
+ 53143356, 51304425, 49470108, 47640409, 45815332, 43994882, 42179065,
+ 40367883, 38561342, 36759446, 34962200, 33169607, 31381673, 29598400,
+ 27819794, 26045859, 24276599, 22512017, 20752118, 18996906, 17246385,
+ 15500559, 13759430, 12023005, 10291285, 8564275, 6841978, 5124399,
+ 3411540, 1703406, 0, -1698675, -3392616, -5081818, -6766279, -8445996,
+ -10120965, -11791182, -13456645, -15117351, -16773296, -18424478,
+ -20070893, -21712538, -23349412, -24981509, -26608829, -28231368,
+ -29849123, -31462091, -33070271, -34673659, -36272253, -37866049,
+ -39455047, -41039243, -42618635, -44193220, -45762997, -47327963,
+ -48888115, -50443451, -51993970, -53539670, -55080547, -56616601,
+ -58147828, -59674228, -61195798, -62712537, -64224442, -65731512,
+ -67233745, -68731139, -70223693, -71711406, -73194275, -74672298,
+ -76145476, -77613805, -79077286, -80535915, -81989693, -83438617,
+ -84882687, -86321901, -87756259, -89185758, -90610398, -92030179,
+ -93445098, -94855155, -96260349, -97660680, -99056145, -100446746,
+ -101832480, -103213348, -104589347, -105960479, -107326742, -108688136,
+ -110044660, -111396314, -112743097, -114085009, -115422050, -116754219,
+ -118081516, -119403941, -120721494, -122034174, -123341982, -124644917,
+ -125942979, -127236169, -128524486, -129807931, -131086504, -132360204,
+ -133629032, -134892989, -136152075, -137406289, -138655633, -139900107,
+ -141139711, -142374446, -143604312, -144829310, -146049440, -147264703,
+ -148475101, -149680633, -150881300, -152077104, -153268044, -154454122,
+ -155635339, -156811696, -157983194, -159149834, -160311616, -161468543,
+ -162620615, -163767833, -164910199, -166047713, -167180378, -168308195,
+ -169431164, -170549288, -171662568, -172771005, -173874601, -174973358,
+ -176067277, -177156359, -178240607, -179320022, -180394606, -181464360,
+ -182529288, -183589390, -184644668, -185695124, -186740761, -187781580,
+ -188817584, -189848774, -190875153, -191896723, -192913485, -193925443,
+ -194932599, -195934954, -196932512, -197925275, -198913244, -199896423,
+ -200874814, -201848420, -202817243, -203781286, -204740551, -205695041,
+ -206644759, -207589708, -208529890, -209465308, -210395966, -211321865,
+ -212243009, -213159401, -214071044, -214977941, -215880095, -216777509,
+ -217670186, -218558130, -219441343, -220319829, -221193591, -222062633,
+ -222926958, -223786568, -224641469, -225491662, -226337152, -227177942,
+ -228014036, -228845437, -229672148, -230494175, -231311519, -232124185,
+ -232932177, -233735499, -234534154, -235328146, -236117479, -236902156,
+ -237682183, -238457563, -239228300, -239994397, -240755860, -241512692,
+ -242264897, -243012480, -243755445, -244493795, -245227536, -245956672,
+ -246681206, -247401144, -248116489, -248827247, -249533421, -250235017,
+ -250932038, -251624490, -252312376, -252995702, -253674472, -254348691,
+ -255018363, -255683494, -256344088, -257000149, -257651684, -258298696,
+ -258941191, -259579173, -260212648, -260841621, -261466096, -262086078,
+ -262701573, -263312586, -263919122, -264521186, -265118783, -265711919,
+ -266300599, -266884827, -267464611, -268039954, -268610862, -269177341,
+ -269739396, -270297032, -270850256, -271399072, -271943486, -272483504,
+ -273019132, -273550374, -274077237, -274599726, -275117847, -275631606,
+ -276141009, -276646061, -277146768, -277643137, -278135172, -278622881,
+ -279106268, -279585340, -280060103, -280530563, -280996726, -281458597,
+ -281916184, -282369493, -282818528, -283263297, -283703807, -284140062,
+ -284572069, -284999835, -285423367, -285842669, -286257749, -286668613,
+ -287075268, -287477719, -287875974, -288270039, -288659921, -289045625,
+ -289427159, -289804529, -290177741, -290546803, -290911722, -291272503,
+ -291629153, -291981680, -292330090, -292674389, -293014586, -293350685,
+ -293682695, -294010623, -294334474, -294654256, -294969977, -295281642,
+ -295589260, -295892836, -296192379, -296487894, -296779390, -297066874,
+ -297350352, -297629831, -297905320, -298176824, -298444352, -298707910,
+ -298967507, -299223148, -299474842, -299722595, -299966416, -300206311,
+ -300442288, -300674355, -300902518, -301126786, -301347165, -301563664,
+ -301776289, -301985049, -302189950, -302391001, -302588210, -302781583,
+ -302971128, -303156854, -303338767, -303516876, -303691188, -303861711,
+ -304028452, -304191420, -304350623, -304506068, -304657762, -304805715,
+ -304949933, -305090425, -305227198, -305360261, -305489622, -305615288,
+ -305737267, -305855568, -305970198, -306081166, -306188479, -306292147,
+ -306392175, -306488574, -306581351, -306670514, -306756072, -306838032,
+ -306916403, -306991193, -307062410, -307130062, -307194158, -307254707,
+ -307311715, -307365193, -307415147, -307461587, -307504521, -307543956,
+ -307579902, -307612367, -307641360, -307666888, -307688961, -307707586,
+ -307722773, -307734529, -307742864, -307747785, -307749302, -307747423,
+ -307742156, -307733510, -307721495, -307706117, -307687386, -307665312,
+ -307639901, -307611163, -307579107, -307543742, -307505075, -307463117,
+ -307417875, -307369358, -307317575, -307262536, -307204248, -307142720,
+ -307077962, -307009982, -306938789, -306864392, -306786799, -306706020,
+ -306622064, -306534939, -306444655, -306351219, -306254642, -306154932,
+ -306052098, -305946150, -305837095, -305724944, -305609704, -305491386,
+ -305369998, -305245549, -305118048, -304987505, -304853928, -304717326,
+ -304577709, -304435086, -304289465, -304140856, -303989268, -303834711,
+ -303677192, -303516723, -303353310, -303186965, -303017695, -302845511,
+ -302670421, -302492435, -302311561, -302127809, -301941189, -301751709,
+ -301559379, -301364208, -301166206, -300965381, -300761742, -300555300,
+ -300346064, -300134042, -299919244, -299701680, -299481358, -299258288,
+ -299032480, -298803942, -298572685, -298338717, -298102048, -297862687,
+ -297620644, -297375927, -297128547, -296878513, -296625834, -296370519,
+ -296112579, -295852022, -295588858, -295323096, -295054745, -294783816,
+ -294510318, -294234259, -293955650, -293674500, -293390819, -293104615,
+ -292815899, -292524680, -292230967, -291934769, -291636098, -291334961,
+ -291031368, -290725329, -290416853, -290105951, -289792630, -289476902,
+ -289158775, -288838259, -288515363, -288190097, -287862471, -287532494,
+ -287200175, -286865524, -286528551, -286189266, -285847677, -285503794,
+ -285157627, -284809186, -284458480, -284105518, -283750310, -283392865,
+ -283033194, -282671306, -282307210, -281940916, -281572433, -281201771,
+ -280828940, -280453949, -280076808, -279697526, -279316112, -278932577,
+ -278546930, -278159181, -277769339, -277377413, -276983414, -276587351,
+ -276189232, -275789069, -275386871, -274982646, -274576405, -274168157,
+ -273757913, -273345680, -272931469, -272515290, -272097152, -271677064,
+ -271255037, -270831079, -270405201, -269977411, -269547720, -269116136,
+ -268682670, -268247331, -267810128, -267371072, -266930171, -266487435,
+ -266042874, -265596497, -265148314, -264698334, -264246567, -263793022,
+ -263337709, -262880637, -262421817, -261961256, -261498965, -261034953,
+ -260569231, -260101806, -259632689, -259161890, -258689417, -258215281,
+ -257739490, -257262054, -256782983, -256302286, -255819972, -255336052,
+ -254850533, -254363427, -253874742, -253384487, -252892673, -252399308,
+ -251904402, -251407964, -250910005, -250410532, -249909556, -249407085,
+ -248903130, -248397700, -247890803, -247382450, -246872650, -246361411,
+ -245848744, -245334658, -244819162, -244302265, -243783977, -243264307,
+ -242743265, -242220859, -241697098, -241171993, -240645553, -240117786,
+ -239588702, -239058310, -238526620, -237993640, -237459380, -236923850,
+ -236387058, -235849013, -235309725, -234769203, -234227456, -233684493,
+ -233140324, -232594958, -232048403, -231500669, -230951765, -230401700,
+ -229850484, -229298125, -228744632, -228190015, -227634282, -227077443,
+ -226519507, -225960482, -225400379, -224839205, -224276970, -223713683,
+ -223149353, -222583989, -222017599, -221450194, -220881781, -220312370,
+ -219741969, -219170588, -218598236, -218024921, -217450653, -216875439,
+ -216299290, -215722214, -215144219, -214565315, -213985511, -213404815,
+ -212823236, -212240783, -211657465, -211073290, -210488268, -209902407,
+ -209315715, -208728202, -208139876, -207550746, -206960821, -206370109,
+ -205778619, -205186360, -204593340, -203999568, -203405053, -202809803,
+ -202213826, -201617132, -201019730, -200421626, -199822831, -199223352,
+ -198623199, -198022379, -197420901, -196818774, -196216006, -195612606,
+ -195008582, -194403942, -193798696, -193192850, -192586415, -191979397,
+ -191371806, -190763650, -190154937, -189545675, -188935874, -188325540,
+ -187714683, -187103311, -186491431, -185879053, -185266184, -184652833,
+ -184039008, -183424717, -182809968, -182194769, -181579129, -180963056,
+ -180346558, -179729642, -179112317, -178494592, -177876473, -177257970,
+ -176639090, -176019841, -175400231, -174780269, -174159962, -173539318,
+ -172918344, -172297050, -171675443, -171053531, -170431321, -169808822,
+ -169186041, -168562986, -167939666, -167316087, -166692258, -166068186,
+ -165443880, -164819346, -164194593, -163569628, -162944459, -162319094,
+ -161693540, -161067806, -160441897, -159815823, -159189591, -158563208,
+ -157936682, -157310021, -156683231, -156056321, -155429298, -154802170,
+ -154174943, -153547626, -152920226, -152292749, -151665205, -151037599,
+ -150409940, -149782234, -149154490, -148526714, -147898913, -147271095,
+ -146643268, -146015437, -145387612, -144759798, -144132003, -143504234,
+ -142876499, -142248804, -141621156, -140993563, -140366032, -139738570,
+ -139111183, -138483880, -137856666, -137229549, -136602536, -135975634,
+ -135348849, -134722189, -134095661, -133469271, -132843027, -132216934,
+ -131591001, -130965233, -130339638, -129714222, -129088992, -128463956,
+ -127839118, -127214487, -126590069, -125965871, -125341898, -124718159,
+ -124094659, -123471405, -122848404, -122225662, -121603186, -120980982,
+ -120359056, -119737416, -119116068, -118495017, -117874272, -117253837,
+ -116633719, -116013925, -115394461, -114775333, -114156548, -113538112,
+ -112920031, -112302311, -111684959, -111067981, -110451383, -109835171,
+ -109219352, -108603931, -107988915, -107374309, -106760120, -106146354,
+ -105533016, -104920114, -104307652, -103695637, -103084075, -102472972,
+ -101862333, -101252165, -100642473, -100033264, -99424542, -98816315,
+ -98208587, -97601364, -96994653, -96388459, -95782787, -95177644,
+ -94573035, -93968965, -93365441, -92762468, -92160052, -91558197,
+ -90956910, -90356197, -89756062, -89156511, -88557550, -87959184,
+ -87361419, -86764260, -86167712, -85571781, -84976472, -84381790,
+ -83787742, -83194331, -82601564, -82009445, -81417980, -80827174,
+ -80237032, -79647560, -79058762, -78470644, -77883210, -77296467,
+ -76710418, -76125070, -75540426, -74956492, -74373274, -73790775,
+ -73209001, -72627957, -72047648, -71468078, -70889253, -70311177,
+ -69733855, -69157292, -68581493, -68006463, -67432205, -66858726,
+ -66286029, -65714119, -65143001, -64572680, -64003160, -63434446,
+ -62866543, -62299454, -61733184, -61167739, -60603122, -60039338,
+ -59476391, -58914286, -58353027, -57792619, -57233065, -56674371,
+ -56116541, -55559578, -55003488, -54448274, -53893941, -53340493,
+ -52787933, -52236267, -51685499, -51135632, -50586671, -50038619,
+ -49491481, -48945262, -48399964, -47855592, -47312150, -46769642,
+ -46228072, -45687443, -45147760, -44609027, -44071247, -43534425,
+ -42998563, -42463667, -41929739, -41396783, -40864804, -40333804,
+ -39803789, -39274760, -38746722, -38219679, -37693634, -37168591,
+ -36644553, -36121524, -35599508, -35078507, -34558526, -34039568,
+ -33521636, -33004733, -32488864, -31974032, -31460239, -30947490,
+ -30435787, -29925134, -29415534, -28906991, -28399507, -27893087,
+ -27387732, -26883447, -26380234, -25878096, -25377038, -24877061,
+ -24378168, -23880364, -23383651, -22888032, -22393509, -21900087,
+ -21407767, -20916554, -20426448, -19937455, -19449576, -18962814,
+ -18477173, -17992654, -17509261, -17026997, -16545864, -16065865,
+ -15587003, -15109280, -14632699, -14157263, -13682974, -13209835,
+ -12737848, -12267017, -11797343, -11328829, -10861478, -10395292,
+ -9930274, -9466426, -9003750, -8542249, -8081925, -7622781, -7164819,
+ -6708041, -6252449, -5798047, -5344835, -4892817, -4441994, -3992370,
+ -3543945, -3096722, -2650704, -2205891, -1762288, -1319895, -878714,
+ -438749, 0, 437530, 873840, 1308927, 1742789, 2175425, 2606833,
+ 3037010, 3465955, 3893666, 4320142, 4745379, 5169378, 5592135, 6013649,
+ 6433918, 6852941, 7270716, 7687241, 8102515, 8516536, 8929302, 9340812,
+ 9751064, 10160057, 10567789, 10974259, 11379464, 11783404, 12186078,
+ 12587483, 12987618, 13386483, 13784074, 14180392, 14575435, 14969201,
+ 15361690, 15752899, 16142828, 16531475, 16918840, 17304920, 17689715,
+ 18073224, 18455445, 18836377, 19216020, 19594371, 19971430, 20347197,
+ 20721669, 21094846, 21466726, 21837310, 22206595, 22574582, 22941268,
+ 23306653, 23670736, 24033517, 24394994, 24755167, 25114034, 25471595,
+ 25827849, 26182796, 26536434, 26888763, 27239783, 27589491, 27937889,
+ 28284974, 28630747, 28975207, 29318353, 29660185, 30000701, 30339903,
+ 30677788, 31014356, 31349607, 31683541, 32016157, 32347454, 32677432,
+ 33006091, 33333430, 33659449, 33984147, 34307525, 34629581, 34950316,
+ 35269729, 35587820, 35904588, 36220034, 36534157, 36846957, 37158433,
+ 37468587, 37777416, 38084922, 38391104, 38695962, 38999496, 39301705,
+ 39602591, 39902152, 40200388, 40497301, 40792889, 41087152, 41380092,
+ 41671707, 41961998, 42250965, 42538608, 42824927, 43109922, 43393594,
+ 43675942, 43956967, 44236669, 44515048, 44792105, 45067839, 45342251,
+ 45615341, 45887110, 46157557, 46426683, 46694489, 46960975, 47226140,
+ 47489986, 47752513, 48013722, 48273612, 48532184, 48789439, 49045377,
+ 49299999, 49553305, 49805295, 50055970, 50305332, 50553379, 50800114,
+ 51045536, 51289646, 51532444, 51773932, 52014110, 52252979, 52490538,
+ 52726790, 52961735, 53195373, 53427705, 53658733, 53888456, 54116875,
+ 54343992, 54569807, 54794321, 55017534, 55239448, 55460064, 55679382,
+ 55897404, 56114129, 56329560, 56543697, 56756540, 56968092, 57178353,
+ 57387323, 57595005, 57801398, 58006505, 58210325, 58412861, 58614112,
+ 58814081, 59012769, 59210175, 59406303, 59601152, 59794724, 59987020,
+ 60178041, 60367788, 60556263, 60743467, 60929401, 61114067, 61297465,
+ 61479596, 61660463, 61840066, 62018407, 62195487, 62371307, 62545869,
+ 62719173, 62891223, 63062018, 63231560, 63399850, 63566891, 63732683,
+ 63897228, 64060527, 64222582, 64383394, 64542965, 64701296, 64858389,
+ 65014245, 65168865, 65322252, 65474407, 65625332, 65775027, 65923495,
+ 66070737, 66216755, 66361550, 66505125, 66647480, 66788617, 66928539,
+ 67067246, 67204741, 67341025, 67476099, 67609966, 67742628, 67874085,
+ 68004340, 68133395, 68261251, 68387910, 68513374, 68637645, 68760724,
+ 68882614, 69003315, 69122831, 69241163, 69358312, 69474281, 69589071,
+ 69702685, 69815124, 69926391, 70036486, 70145413, 70253173, 70359767,
+ 70465199, 70569470, 70672581, 70774536, 70875335, 70974982, 71073477,
+ 71170823, 71267022, 71362077, 71455988, 71548759, 71640391, 71730886,
+ 71820247, 71908476, 71995574, 72081544, 72166387, 72250107, 72332705,
+ 72414184, 72494545, 72573791, 72651923, 72728945, 72804858, 72879664,
+ 72953367, 73025967, 73097467, 73167870, 73237177, 73305391, 73372514,
+ 73438549, 73503498, 73567362, 73630145, 73691848, 73752475, 73812026,
+ 73870505, 73927914, 73984255, 74039531, 74093744, 74146896, 74198989,
+ 74250027, 74300011, 74348944, 74396828, 74443665, 74489459, 74534211,
+ 74577924, 74620600, 74662242, 74702852, 74742433, 74780986, 74818516,
+ 74855023, 74890511, 74924982, 74958438, 74990882, 75022317, 75052745,
+ 75082168, 75110589, 75138011, 75164436, 75189867, 75214305, 75237755,
+ 75260217, 75281696, 75302193, 75321711, 75340253, 75357820, 75374417,
+ 75390045, 75404706, 75418405, 75431142, 75442921, 75453745, 75463616,
+ 75472536, 75480509, 75487537, 75493622, 75498768, 75502977, 75506251,
+ 75508593, 75510007, 75510494, 75510057, 75508699, 75506423, 75503232,
+ 75499127, 75494112, 75488190, 75481363, 75473634, 75465006, 75455481,
+ 75445062, 75433752, 75421553, 75408469, 75394502, 75379655, 75363931,
+ 75347332, 75329861, 75311521, 75292314, 75272244, 75251313, 75229525,
+ 75206881, 75183384, 75159038, 75133846, 75107809, 75080931, 75053214,
+ 75024662, 74995277, 74965062, 74934020, 74902154, 74869466, 74835960,
+ 74801637, 74766502, 74730556, 74693804, 74656246, 74617887, 74578729,
+ 74538775, 74498028, 74456491, 74414167, 74371058, 74327167, 74282497,
+ 74237052, 74190833, 74143844, 74096088, 74047568, 73998286, 73948245,
+ 73897448, 73845899, 73793599, 73740553, 73686762, 73632229, 73576958,
+ 73520952, 73464213, 73406744, 73348548, 73289628, 73229987, 73169628,
+ 73108554, 73046767, 72984271, 72921068, 72857162, 72792555, 72727250,
+ 72661250, 72594558, 72527177, 72459110, 72390359, 72320929, 72250821,
+ 72180038, 72108584, 72036461, 71963672, 71890221, 71816110, 71741341,
+ 71665919, 71589846, 71513124, 71435757, 71357748, 71279099, 71199814,
+ 71119895, 71039346, 70958169, 70876367, 70793944, 70710901, 70627242,
+ 70542971, 70458089, 70372600, 70286506, 70199812, 70112519, 70024630,
+ 69936149, 69847078, 69757420, 69667179, 69576356, 69484956, 69392980,
+ 69300433, 69207316, 69113633, 69019387, 68924580, 68829215, 68733296,
+ 68636826, 68539806, 68442241, 68344132, 68245484, 68146299, 68046579,
+ 67946328, 67845548, 67744244, 67642416, 67540069, 67437205, 67333827,
+ 67229938, 67125541, 67020639, 66915235, 66809331, 66702931, 66596037,
+ 66488653, 66380781, 66272423, 66163584, 66054265, 65944471, 65834202,
+ 65723464, 65612257, 65500586, 65388453, 65275861, 65162813, 65049311,
+ 64935359, 64820960, 64706115, 64590829, 64475104, 64358943, 64242348,
+ 64125323, 64007870, 63889993, 63771693, 63652975, 63533840, 63414292,
+ 63294333, 63173967, 63053195, 62932022, 62810449, 62688480, 62566117,
+ 62443363, 62320221, 62196694, 62072785, 61948496, 61823830, 61698790,
+ 61573379, 61447599, 61321454, 61194946, 61068078, 60940852, 60813272,
+ 60685340, 60557059, 60428432, 60299461, 60170150, 60040500, 59910516,
+ 59780199, 59649552, 59518578, 59387280, 59255660, 59123722, 58991468,
+ 58858900, 58726021, 58592835, 58459343, 58325549, 58191455, 58057064,
+ 57922379, 57787402, 57652136, 57516584, 57380747, 57244630, 57108235,
+ 56971564, 56834620, 56697406, 56559924, 56422177, 56284168, 56145899,
+ 56007373, 55868593, 55729560, 55590279, 55450751, 55310979, 55170966,
+ 55030714, 54890226, 54749505, 54608552, 54467372, 54325965, 54184336,
+ 54042486, 53900418, 53758134, 53615638, 53472931, 53330017, 53186898,
+ 53043576, 52900054, 52756334, 52612419, 52468312, 52324015, 52179531,
+ 52034861, 51890009, 51744978, 51599768, 51454384, 51308828, 51163101,
+ 51017207, 50871148, 50724927, 50578546, 50432007, 50285312, 50138465,
+ 49991468, 49844323, 49697033, 49549600, 49402026, 49254314, 49106467,
+ 48958486, 48810374, 48662134, 48513768, 48365278, 48216667, 48067936,
+ 47919090, 47770129, 47621056, 47471874, 47322584, 47173190, 47023693,
+ 46874096, 46724402, 46574611, 46424728, 46274754, 46124691, 45974542,
+ 45824309, 45673995, 45523601, 45373130, 45222584, 45071965, 44921276,
+ 44770520, 44619697, 44468811, 44317863, 44166856, 44015793, 43864674,
+ 43713504, 43562283, 43411013, 43259699, 43108340, 42956940, 42805501,
+ 42654024, 42502513, 42350969, 42199394, 42047790, 41896161, 41744507,
+ 41592831, 41441135, 41289421, 41137691, 40985948, 40834193, 40682429,
+ 40530657, 40378880, 40227100, 40075319, 39923538, 39771761, 39619988,
+ 39468223, 39316467, 39164722, 39012990, 38861273, 38709574, 38557893,
+ 38406234, 38254598, 38102987, 37951404, 37799849, 37648326, 37496836,
+ 37345380, 37193962, 37042582, 36891244, 36739948, 36588696, 36437492,
+ 36286336, 36135230, 35984177, 35833177, 35682234, 35531349, 35380524,
+ 35229760, 35079060, 34928426, 34777858, 34627360, 34476933, 34326578,
+ 34176298, 34026094, 33875969, 33725923, 33575960, 33426079, 33276285,
+ 33126577, 32976958, 32827430, 32677994, 32528652, 32379407, 32230258,
+ 32081209, 31932262, 31783417, 31634676, 31486042, 31337515, 31189098,
+ 31040792, 30892599, 30744521, 30596559, 30448715, 30300990, 30153386,
+ 30005906, 29858549, 29711319, 29564216, 29417243, 29270400, 29123690,
+ 28977114, 28830674, 28684370, 28538206, 28392181, 28246299, 28100560,
+ 27954966, 27809518, 27664219, 27519068, 27374069, 27229223, 27084530,
+ 26939993, 26795613, 26651391, 26507329, 26363429, 26219691, 26076118,
+ 25932711, 25789470, 25646399, 25503497, 25360767, 25218209, 25075826,
+ 24933619, 24791588, 24649736, 24508064, 24366573, 24225264, 24084139,
+ 23943200, 23802447, 23661882, 23521506, 23381320, 23241327, 23101526,
+ 22961920, 22822510, 22683297, 22544282, 22405467, 22266852, 22128440,
+ 21990231, 21852227, 21714428, 21576836, 21439453, 21302279, 21165316,
+ 21028565, 20892027, 20755703, 20619595, 20483703, 20348030, 20212575,
+ 20077340, 19942327, 19807536, 19672969, 19538626, 19404509, 19270619,
+ 19136957, 19003525, 18870322, 18737351, 18604612, 18472107, 18339837,
+ 18207802, 18076003, 17944443, 17813121, 17682039, 17551197, 17420598,
+ 17290241, 17160128, 17030261, 16900639, 16771263, 16642136, 16513258,
+ 16384629, 16256251, 16128124, 16000251, 15872631, 15745265, 15618155,
+ 15491301, 15364704, 15238366, 15112286, 14986467, 14860908, 14735612,
+ 14610577, 14485807, 14361300, 14237059, 14113084, 13989376, 13865935,
+ 13742763, 13619860, 13497228, 13374866, 13252777, 13130960, 13009416,
+ 12888146, 12767152, 12646433, 12525990, 12405825, 12285938, 12166329,
+ 12047000, 11927952, 11809184, 11690697, 11572493, 11454572, 11336935,
+ 11219583, 11102515, 10985733, 10869238, 10753030, 10637109, 10521477,
+ 10406135, 10291082, 10176319, 10061847, 9947667, 9833780, 9720185,
+ 9606883, 9493876, 9381163, 9268746, 9156625, 9044799, 8933271, 8822040,
+ 8711108, 8600474, 8490139, 8380104, 8270369, 8160935, 8051802, 7942971,
+ 7834442, 7726217, 7618294, 7510675, 7403360, 7296351, 7189646, 7083247,
+ 6977154, 6871368, 6765888, 6660716, 6555852, 6451297, 6347050, 6243112,
+ 6139484, 6036166, 5933158, 5830461, 5728075, 5626000, 5524237, 5422787,
+ 5321649, 5220825, 5120313, 5020116, 4920232, 4820662, 4721408, 4622468,
+ 4523844, 4425535, 4327542, 4229866, 4132505, 4035462, 3938736, 3842327,
+ 3746236, 3650463, 3555008, 3459871, 3365053, 3270554, 3176374, 3082513,
+ 2988972, 2895751, 2802850, 2710269, 2618009, 2526069, 2434450, 2343152,
+ 2252175, 2161520, 2071186, 1981174, 1891484, 1802116, 1713070, 1624347,
+ 1535946, 1447867, 1360112, 1272679, 1185569, 1098782, 1012319, 926179,
+ 840362, 754868, 669699, 584853, 500331, 416132, 332258, 248707, 165480,
+ 82578, 0, -82254, -164184, -245790, -327071, -408029, -488662, -568970,
+ -648955, -728615, -807951, -886963, -965650, -1044013, -1122052,
+ -1199766, -1277157, -1354223, -1430965, -1507383, -1583477, -1659247,
+ -1734694, -1809816, -1884615, -1959090, -2033241, -2107069, -2180573,
+ -2253755, -2326612, -2399147, -2471359, -2543248, -2614814, -2686057,
+ -2756978, -2827576, -2897852, -2967806, -3037438, -3106748, -3175736,
+ -3244403, -3312749, -3380773, -3448476, -3515858, -3582919, -3649660,
+ -3716081, -3782181, -3847962, -3913423, -3978564, -4043386, -4107888,
+ -4172072, -4235937, -4299484, -4362712, -4425622, -4488215, -4550490,
+ -4612447, -4674088, -4735412, -4796419, -4857110, -4917485, -4977544,
+ -5037288, -5096717, -5155830, -5214629, -5273114, -5331285, -5389142,
+ -5446685, -5503915, -5560832, -5617437, -5673730, -5729711, -5785380,
+ -5840737, -5895784, -5950521, -6004947, -6059063, -6112869, -6166367,
+ -6219555, -6272435, -6325007, -6377270, -6429227, -6480876, -6532219,
+ -6583255, -6633986, -6684410, -6734530, -6784345, -6833855, -6883062,
+ -6931964, -6980564, -7028861, -7076855, -7124548, -7171938, -7219028,
+ -7265817, -7312306, -7358495, -7404384, -7449974, -7495266, -7540260,
+ -7584956, -7629355, -7673457, -7717262, -7760772, -7803987, -7846906,
+ -7889531, -7931862, -7973899, -8015644, -8057095, -8098255, -8139123,
+ -8179700, -8219986, -8259982, -8299689, -8339106, -8378234, -8417075,
+ -8455627, -8493893, -8531872, -8569564, -8606972, -8644094, -8680931,
+ -8717485, -8753754, -8789741, -8825446, -8860868, -8896009, -8930870,
+ -8965450, -8999750, -9033771, -9067513, -9100978, -9134164, -9167074,
+ -9199707, -9232064, -9264146, -9295954, -9327487, -9358746, -9389733,
+ -9420447, -9450889, -9481060, -9510960, -9540590, -9569950, -9599042,
+ -9627865, -9656420, -9684708, -9712730, -9740485, -9767976, -9795201,
+ -9822162, -9848860, -9875295, -9901467, -9927378, -9953028, -9978417,
+ -10003546, -10028416, -10053027, -10077381, -10101477, -10125316,
+ -10148899, -10172227, -10195300, -10218118, -10240683, -10262996,
+ -10285055, -10306864, -10328421, -10349728, -10370785, -10391593,
+ -10412153, -10432465, -10452530, -10472349, -10491921, -10511249,
+ -10530332, -10549172, -10567768, -10586122, -10604234, -10622105,
+ -10639735, -10657126, -10674278, -10691191, -10707866, -10724305,
+ -10740507, -10756473, -10772204, -10787701, -10802964, -10817995,
+ -10832793, -10847359, -10861695, -10875800, -10889676, -10903323,
+ -10916742, -10929933, -10942897, -10955636, -10968149, -10980438,
+ -10992502, -11004344, -11015963, -11027360, -11038536, -11049491,
+ -11060227, -11070743, -11081042, -11091123, -11100987, -11110634,
+ -11120067, -11129284, -11138288, -11147078, -11155656, -11164022,
+ -11172176, -11180121, -11187855, -11195381, -11202698, -11209808,
+ -11216710, -11223407, -11229898, -11236185, -11242268, -11248148,
+ -11253825, -11259300, -11264574, -11269648, -11274523, -11279199,
+ -11283676, -11287956, -11292040, -11295928, -11299620, -11303118,
+ -11306422, -11309534, -11312453, -11315181, -11317717, -11320064,
+ -11322222, -11324191, -11325972, -11327566, -11328974, -11330196,
+ -11331233, -11332087, -11332756, -11333243, -11333549, -11333673,
+ -11333616, -11333380, -11332965, -11332372, -11331601, -11330654,
+ -11329531, -11328232, -11326759, -11325112, -11323292, -11321300,
+ -11319136, -11316802, -11314298, -11311624, -11308781, -11305771,
+ -11302594, -11299250, -11295741, -11292067, -11288229, -11284228,
+ -11280064, -11275738, -11271250, -11266603, -11261796, -11256830,
+ -11251705, -11246424, -11240985, -11235391, -11229642, -11223738,
+ -11217680, -11211469, -11205107, -11198592, -11191927, -11185112,
+ -11178147, -11171034, -11163774, -11156366, -11148811, -11141112,
+ -11133267, -11125278, -11117146, -11108871, -11100455, -11091897,
+ -11083198, -11074360, -11065383, -11056268, -11047015, -11037626,
+ -11028100, -11018440, -11008644, -10998715, -10988653, -10978458,
+ -10968131, -10957674, -10947087, -10936370, -10925524, -10914550,
+ -10903449, -10892221, -10880868, -10869389, -10857786, -10846060,
+ -10834210, -10822238, -10810145, -10797931, -10785597, -10773143,
+ -10760571, -10747881, -10735074, -10722150, -10709110, -10695956,
+ -10682687, -10669304, -10655809, -10642201, -10628482, -10614652,
+ -10600712, -10586662, -10572504, -10558238, -10543865, -10529385,
+ -10514799, -10500109, -10485313, -10470414, -10455412, -10440308,
+ -10425102, -10409794, -10394387, -10378880, -10363275, -10347571,
+ -10331769, -10315871, -10299877, -10283787, -10267603, -10251324,
+ -10234952, -10218488, -10201931, -10185284, -10168545, -10151717,
+ -10134799, -10117793, -10100699, -10083518, -10066250, -10048896,
+ -10031457, -10013933, -9996326, -9978635, -9960862, -9943007, -9925071,
+ -9907054, -9888957, -9870782, -9852527, -9834195, -9815785, -9797299,
+ -9778737, -9760100, -9741388, -9722602, -9703743, -9684811, -9665807,
+ -9646732, -9627586, -9608370, -9589084, -9569730, -9550308, -9530818,
+ -9511261, -9491638, -9471949, -9452196, -9432378, -9412496, -9392551,
+ -9372544, -9352475, -9332344, -9312154, -9291903, -9271593, -9251224,
+ -9230797, -9210312, -9189771, -9169174, -9148520, -9127812, -9107050,
+ -9086233, -9065363, -9044441, -9023467, -9002441, -8981365, -8960238,
+ -8939062, -8917837, -8896563, -8875242, -8853873, -8832458, -8810996,
+ -8789490, -8767938, -8746342, -8724702, -8703020, -8681294, -8659527,
+ -8637718, -8615869, -8593979, -8572050, -8550081, -8528074, -8506029,
+ -8483947, -8461827, -8439672, -8417481, -8395254, -8372993, -8350698,
+ -8328370, -8306008, -8283614, -8261189, -8238732, -8216244, -8193726,
+ -8171178, -8148602, -8125996, -8103363, -8080702, -8058014, -8035300,
+ -8012560, -7989794, -7967004, -7944189, -7921350, -7898488, -7875604,
+ -7852697, -7829768, -7806818, -7783848, -7760857, -7737847, -7714817,
+ -7691769, -7668702, -7645618, -7622517, -7599399, -7576265, -7553115,
+ -7529951, -7506771, -7483577, -7460370, -7437149, -7413916, -7390670,
+ -7367413, -7344144, -7320865, -7297575, -7274275, -7250966, -7227648,
+ -7204322, -7180988, -7157646, -7134297, -7110942, -7087580, -7064213,
+ -7040841, -7017464, -6994083, -6970697, -6947309, -6923917, -6900523,
+ -6877127, -6853730, -6830331, -6806931, -6783532, -6760132, -6736733,
+ -6713335, -6689938, -6666544, -6643151, -6619762, -6596375, -6572992,
+ -6549613, -6526239, -6502869, -6479504, -6456146, -6432793, -6409447,
+ -6386107, -6362775, -6339451, -6316134, -6292827, -6269528, -6246238,
+ -6222958, -6199688, -6176428, -6153180, -6129942, -6106717, -6083503,
+ -6060301, -6037113, -6013937, -5990775, -5967627, -5944493, -5921374,
+ -5898270, -5875181, -5852108, -5829050, -5806010, -5782986, -5759979,
+ -5736990, -5714019, -5691066, -5668131, -5645216, -5622320, -5599443,
+ -5576586, -5553750, -5530934, -5508139, -5485366, -5462614, -5439884,
+ -5417177, -5394492, -5371830, -5349191, -5326576, -5303985, -5281418,
+ -5258876, -5236358, -5213866, -5191399, -5168958, -5146544, -5124155,
+ -5101793, -5079459, -5057152, -5034872, -5012620, -4990397, -4968202,
+ -4946036, -4923898, -4901791, -4879713, -4857665, -4835647, -4813660,
+ -4791703, -4769778, -4747884, -4726021, -4704191, -4682393, -4660627,
+ -4638894, -4617193, -4595526, -4573893, -4552293, -4530728, -4509196,
+ -4487699, -4466237, -4444810, -4423418, -4402062, -4380741, -4359457,
+ -4338209, -4316997, -4295822, -4274684, -4253583, -4232520, -4211494,
+ -4190506, -4169557, -4148645, -4127772, -4106939, -4086144, -4065388,
+ -4044672, -4023995, -4003359, -3982762, -3962206, -3941690, -3921215,
+ -3900781, -3880388, -3860037, -3839727, -3819458, -3799232, -3779048,
+ -3758906, -3738807, -3718750, -3698736, -3678766, -3658838, -3638955,
+ -3619114, -3599318, -3579565, -3559857, -3540193, -3520574, -3500999,
+ -3481469, -3461985, -3442545, -3423151, -3403802, -3384499, -3365242,
+ -3346031, -3326866, -3307747, -3288675, -3269650, -3250671, -3231739,
+ -3212855, -3194017, -3175227, -3156485, -3137790, -3119143, -3100544,
+ -3081993, -3063490, -3045035, -3026629, -3008272, -2989963, -2971703,
+ -2953492, -2935331, -2917218, -2899155, -2881142, -2863178, -2845263,
+ -2827399, -2809584, -2791820, -2774105, -2756441, -2738828, -2721265,
+ -2703752, -2686290, -2668879, -2651519, -2634210, -2616951, -2599745,
+ -2582589, -2565485, -2548432, -2531431, -2514481, -2497583, -2480737,
+ -2463943, -2447201, -2430511, -2413873, -2397287, -2380754, -2364273,
+ -2347844, -2331468, -2315144, -2298874, -2282656, -2266490, -2250378,
+ -2234318, -2218312, -2202358, -2186458, -2170611, -2154817, -2139076,
+ -2123389, -2107755, -2092175, -2076648, -2061174, -2045755, -2030388,
+ -2015076, -1999817, -1984612, -1969461, -1954364, -1939320, -1924331,
+ -1909395, -1894514, -1879686, -1864913, -1850194, -1835528, -1820917,
+ -1806361, -1791858, -1777410, -1763015, -1748676, -1734390, -1720159,
+ -1705982, -1691859, -1677791, -1663778, -1649818, -1635913, -1622063,
+ -1608267, -1594525, -1580838, -1567205, -1553627, -1540103, -1526634,
+ -1513219, -1499859, -1486553, -1473302, -1460105, -1446962, -1433874,
+ -1420841, -1407862, -1394937, -1382067, -1369251, -1356490, -1343783,
+ -1331130, -1318532, -1305988, -1293498, -1281063, -1268682, -1256355,
+ -1244083, -1231865, -1219701, -1207591, -1195535, -1183534, -1171587,
+ -1159693, -1147854, -1136069, -1124337, -1112660, -1101037, -1089467,
+ -1077952, -1066490, -1055082, -1043727, -1032426, -1021179, -1009986,
+ -998846, -987760, -976727, -965748, -954822, -943949, -933129, -922363,
+ -911650, -900990, -890384, -879830, -869329, -858881, -848486, -838144,
+ -827855, -817618, -807434, -797303, -787224, -777197, -767223, -757301,
+ -747432, -737615, -727849, -718136, -708475, -698866, -689309, -679803,
+ -670349, -660947, -651597, -642297, -633050, -623853, -614708, -605615,
+ -596572, -587580, -578639, -569750, -560911, -552122, -543385, -534698,
+ -526061, -517475, -508939, -500453, -492018, -483632, -475297, -467011,
+ -458775, -450589, -442452, -434365, -426328, -418339, -410400, -402510,
+ -394669, -386877, -379134, -371440, -363794, -356197, -348649, -341149,
+ -333697, -326293, -318937, -311629, -304369, -297157, -289993, -282876,
+ -275807, -268785, -261810, -254882, -248001, -241168, -234381, -227641,
+ -220947, -214300, -207699, -201145, -194636, -188174, -181758, -175387,
+ -169063, -162784, -156550, -150362, -144219, -138121, -132068, -126060,
+ -120097, -114178, -108304, -102475, -96690, -90949, -85252, -79599,
+ -73990, -68425, -62903, -57425, -51990, -46598, -41250, -35945, -30682,
+ -25462, -20285, -15150, -10058, -5008, 0
+};
+
+const int32_t filter_data_H[16385] = {
+ 0, -2498, -5007, -7527, -10057, -12598, -15149, -17711, -20283, -22866,
+ -25459, -28063, -30677, -33301, -35936, -38582, -41238, -43904, -46581,
+ -49268, -51966, -54674, -57392, -60121, -62860, -65610, -68370, -71141,
+ -73922, -76713, -79515, -82327, -85149, -87982, -90825, -93678, -96542,
+ -99416, -102301, -105195, -108100, -111016, -113941, -116877, -119823,
+ -122779, -125746, -128723, -131710, -134707, -137714, -140732, -143760,
+ -146798, -149846, -152904, -155972, -159051, -162139, -165238, -168347,
+ -171466, -174594, -177733, -180882, -184041, -187210, -190389, -193578,
+ -196777, -199986, -203205, -206433, -209672, -212920, -216179, -219447,
+ -222725, -226013, -229310, -232618, -235935, -239262, -242599, -245945,
+ -249301, -252667, -256042, -259427, -262822, -266227, -269641, -273064,
+ -276497, -279940, -283392, -286854, -290325, -293805, -297295, -300795,
+ -304304, -307822, -311350, -314886, -318433, -321988, -325553, -329127,
+ -332710, -336303, -339904, -343515, -347135, -350764, -354402, -358050,
+ -361706, -365371, -369045, -372728, -376421, -380122, -383832, -387550,
+ -391278, -395014, -398760, -402514, -406276, -410048, -413828, -417617,
+ -421414, -425220, -429035, -432858, -436690, -440530, -444378, -448235,
+ -452101, -455974, -459857, -463747, -467646, -471553, -475468, -479391,
+ -483323, -487262, -491210, -495166, -499130, -503102, -507082, -511069,
+ -515065, -519069, -523080, -527099, -531126, -535161, -539203, -543253,
+ -547311, -551376, -555449, -559530, -563618, -567713, -571816, -575926,
+ -580044, -584169, -588301, -592440, -596587, -600741, -604902, -609070,
+ -613245, -617427, -621616, -625812, -630015, -634225, -638442, -642665,
+ -646895, -651132, -655376, -659626, -663883, -668146, -672416, -676693,
+ -680975, -685265, -689560, -693862, -698170, -702484, -706805, -711132,
+ -715464, -719803, -724148, -728499, -732855, -737218, -741586, -745961,
+ -750341, -754726, -759117, -763514, -767917, -772325, -776738, -781157,
+ -785581, -790011, -794446, -798886, -803331, -807782, -812237, -816698,
+ -821164, -825634, -830110, -834590, -839075, -843565, -848060, -852559,
+ -857063, -861571, -866084, -870602, -875123, -879650, -884180, -888715,
+ -893254, -897797, -902344, -906895, -911451, -916010, -920573, -925140,
+ -929711, -934285, -938863, -943445, -948031, -952620, -957212, -961808,
+ -966407, -971009, -975615, -980224, -984836, -989451, -994069, -998690,
+ -1003314, -1007941, -1012571, -1017203, -1021838, -1026476, -1031116,
+ -1035759, -1040404, -1045052, -1049702, -1054354, -1059009, -1063665,
+ -1068324, -1072985, -1077648, -1082313, -1086979, -1091648, -1096318,
+ -1100990, -1105663, -1110338, -1115015, -1119693, -1124372, -1129053,
+ -1133735, -1138418, -1143102, -1147787, -1152474, -1157161, -1161849,
+ -1166538, -1171228, -1175918, -1180609, -1185301, -1189993, -1194686,
+ -1199379, -1204072, -1208765, -1213459, -1218153, -1222847, -1227540,
+ -1232234, -1236928, -1241621, -1246314, -1251007, -1255699, -1260391,
+ -1265082, -1269773, -1274463, -1279152, -1283840, -1288528, -1293214,
+ -1297900, -1302584, -1307267, -1311950, -1316630, -1321310, -1325987,
+ -1330664, -1335339, -1340012, -1344683, -1349353, -1354021, -1358687,
+ -1363350, -1368012, -1372672, -1377329, -1381984, -1386637, -1391288,
+ -1395935, -1400581, -1405223, -1409863, -1414500, -1419135, -1423766,
+ -1428394, -1433019, -1437641, -1442260, -1446876, -1451488, -1456097,
+ -1460702, -1465303, -1469901, -1474495, -1479086, -1483672, -1488255,
+ -1492833, -1497407, -1501977, -1506543, -1511105, -1515662, -1520214,
+ -1524762, -1529305, -1533844, -1538377, -1542906, -1547430, -1551949,
+ -1556463, -1560971, -1565474, -1569972, -1574465, -1578952, -1583433,
+ -1587909, -1592378, -1596843, -1601301, -1605753, -1610199, -1614639,
+ -1619073, -1623500, -1627921, -1632336, -1636744, -1641146, -1645540,
+ -1649929, -1654310, -1658684, -1663051, -1667411, -1671764, -1676110,
+ -1680448, -1684779, -1689102, -1693418, -1697726, -1702027, -1706319,
+ -1710604, -1714880, -1719149, -1723409, -1727662, -1731905, -1736141,
+ -1740368, -1744586, -1748796, -1752997, -1757189, -1761372, -1765546,
+ -1769711, -1773867, -1778014, -1782152, -1786280, -1790398, -1794507,
+ -1798606, -1802696, -1806776, -1810845, -1814905, -1818955, -1822995,
+ -1827024, -1831043, -1835051, -1839050, -1843037, -1847014, -1850980,
+ -1854935, -1858879, -1862812, -1866734, -1870645, -1874545, -1878433,
+ -1882310, -1886175, -1890029, -1893871, -1897701, -1901520, -1905326,
+ -1909120, -1912902, -1916672, -1920430, -1924175, -1927908, -1931628,
+ -1935336, -1939030, -1942712, -1946381, -1950037, -1953680, -1957310,
+ -1960926, -1964529, -1968119, -1971695, -1975258, -1978806, -1982341,
+ -1985863, -1989370, -1992863, -1996342, -1999806, -2003257, -2006693,
+ -2010114, -2013521, -2016913, -2020291, -2023654, -2027001, -2030334,
+ -2033651, -2036954, -2040241, -2043513, -2046769, -2050009, -2053234,
+ -2056444, -2059637, -2062815, -2065976, -2069122, -2072251, -2075364,
+ -2078461, -2081541, -2084605, -2087652, -2090682, -2093696, -2096693,
+ -2099672, -2102635, -2105581, -2108509, -2111420, -2114313, -2117189,
+ -2120048, -2122889, -2125712, -2128517, -2131304, -2134073, -2136824,
+ -2139557, -2142272, -2144968, -2147646, -2150305, -2152945, -2155567,
+ -2158170, -2160754, -2163319, -2165865, -2168391, -2170899, -2173387,
+ -2175855, -2178304, -2180734, -2183144, -2185533, -2187904, -2190254,
+ -2192584, -2194893, -2197183, -2199452, -2201701, -2203929, -2206137,
+ -2208324, -2210490, -2212636, -2214760, -2216864, -2218946, -2221007,
+ -2223047, -2225066, -2227063, -2229038, -2230992, -2232924, -2234834,
+ -2236722, -2238589, -2240433, -2242255, -2244055, -2245832, -2247587,
+ -2249320, -2251030, -2252717, -2254382, -2256023, -2257642, -2259238,
+ -2260810, -2262360, -2263886, -2265388, -2266868, -2268323, -2269755,
+ -2271164, -2272548, -2273909, -2275246, -2276558, -2277847, -2279111,
+ -2280351, -2281567, -2282758, -2283924, -2285066, -2286183, -2287276,
+ -2288343, -2289386, -2290403, -2291395, -2292362, -2293304, -2294220,
+ -2295111, -2295976, -2296816, -2297630, -2298418, -2299180, -2299916,
+ -2300626, -2301310, -2301968, -2302600, -2303205, -2303783, -2304335,
+ -2304861, -2305359, -2305831, -2306276, -2306694, -2307086, -2307449,
+ -2307786, -2308096, -2308378, -2308633, -2308860, -2309059, -2309231,
+ -2309375, -2309492, -2309580, -2309640, -2309673, -2309677, -2309653,
+ -2309601, -2309520, -2309411, -2309273, -2309107, -2308912, -2308688,
+ -2308436, -2308154, -2307844, -2307504, -2307135, -2306738, -2306310,
+ -2305854, -2305368, -2304852, -2304307, -2303732, -2303128, -2302493,
+ -2301829, -2301135, -2300410, -2299656, -2298871, -2298057, -2297211,
+ -2296336, -2295430, -2294493, -2293526, -2292528, -2291499, -2290440,
+ -2289350, -2288228, -2287076, -2285892, -2284677, -2283431, -2282154,
+ -2280845, -2279505, -2278133, -2276730, -2275295, -2273828, -2272330,
+ -2270800, -2269237, -2267643, -2266016, -2264358, -2262667, -2260944,
+ -2259189, -2257401, -2255581, -2253728, -2251842, -2249924, -2247974,
+ -2245990, -2243974, -2241924, -2239842, -2237727, -2235578, -2233396,
+ -2231181, -2228933, -2226652, -2224337, -2221988, -2219606, -2217191,
+ -2214741, -2212258, -2209742, -2207191, -2204607, -2201988, -2199336,
+ -2196649, -2193929, -2191174, -2188385, -2185561, -2182703, -2179811,
+ -2176885, -2173923, -2170928, -2167897, -2164832, -2161732, -2158598,
+ -2155428, -2152224, -2148984, -2145710, -2142400, -2139056, -2135676,
+ -2132261, -2128811, -2125325, -2121804, -2118248, -2114656, -2111029,
+ -2107366, -2103667, -2099933, -2096163, -2092357, -2088516, -2084638,
+ -2080725, -2076776, -2072790, -2068769, -2064712, -2060618, -2056488,
+ -2052322, -2048120, -2043881, -2039607, -2035295, -2030947, -2026563,
+ -2022142, -2017685, -2013191, -2008660, -2004093, -1999489, -1994848,
+ -1990171, -1985456, -1980705, -1975916, -1971091, -1966229, -1961329,
+ -1956393, -1951420, -1946409, -1941361, -1936276, -1931154, -1925994,
+ -1920797, -1915563, -1910291, -1904982, -1899636, -1894252, -1888830,
+ -1883371, -1877874, -1872340, -1866768, -1861159, -1855511, -1849826,
+ -1844104, -1838343, -1832545, -1826709, -1820835, -1814923, -1808973,
+ -1802985, -1796959, -1790896, -1784794, -1778654, -1772476, -1766261,
+ -1760007, -1753714, -1747384, -1741016, -1734609, -1728164, -1721681,
+ -1715160, -1708600, -1702002, -1695366, -1688692, -1681979, -1675228,
+ -1668438, -1661610, -1654744, -1647839, -1640896, -1633914, -1626894,
+ -1619836, -1612739, -1605603, -1598429, -1591217, -1583966, -1576676,
+ -1569348, -1561981, -1554576, -1547132, -1539650, -1532129, -1524569,
+ -1516971, -1509334, -1501659, -1493945, -1486192, -1478401, -1470571,
+ -1462702, -1454795, -1446849, -1438865, -1430842, -1422780, -1414680,
+ -1406540, -1398363, -1390147, -1381892, -1373598, -1365266, -1356895,
+ -1348486, -1340038, -1331551, -1323026, -1314462, -1305859, -1297218,
+ -1288538, -1279820, -1271063, -1262268, -1253434, -1244562, -1235651,
+ -1226701, -1217713, -1208687, -1199622, -1190518, -1181376, -1172196,
+ -1162977, -1153720, -1144425, -1135091, -1125718, -1116308, -1106859,
+ -1097371, -1087846, -1078282, -1068680, -1059039, -1049361, -1039644,
+ -1029889, -1020096, -1010265, -1000396, -990488, -980543, -970560,
+ -960538, -950479, -940381, -930246, -920073, -909862, -899613, -889326,
+ -879002, -868640, -858240, -847802, -837327, -826814, -816264, -805676,
+ -795050, -784387, -773687, -762949, -752174, -741362, -730512, -719625,
+ -708700, -697739, -686740, -675704, -664632, -653522, -642375, -631191,
+ -619971, -608713, -597419, -586088, -574720, -563316, -551875, -540397,
+ -528883, -517333, -505746, -494122, -482463, -470767, -459035, -447266,
+ -435462, -423621, -411745, -399832, -387884, -375899, -363879, -351823,
+ -339732, -327605, -315442, -303244, -291010, -278741, -266437, -254097,
+ -241723, -229313, -216868, -204388, -191873, -179323, -166738, -154119,
+ -141465, -128776, -116053, -103295, -90503, -77676, -64815, -51920,
+ -38991, -26028, -13031, 0, 13064, 26163, 39296, 52462, 65661, 78894,
+ 92161, 105461, 118794, 132160, 145559, 158991, 172457, 185955, 199485,
+ 213049, 226645, 240274, 253934, 267628, 281353, 295111, 308901, 322723,
+ 336576, 350462, 364379, 378328, 392308, 406320, 420364, 434438, 448544,
+ 462681, 476848, 491047, 505277, 519537, 533828, 548149, 562501, 576883,
+ 591295, 605737, 620210, 634712, 649244, 663806, 678398, 693019, 707669,
+ 722349, 737058, 751796, 766563, 781359, 796184, 811037, 825919, 840830,
+ 855768, 870735, 885731, 900754, 915805, 930884, 945990, 961124, 976286,
+ 991475, 1006691, 1021934, 1037204, 1052501, 1067825, 1083175, 1098552,
+ 1113956, 1129385, 1144841, 1160323, 1175831, 1191364, 1206923, 1222508,
+ 1238118, 1253754, 1269414, 1285100, 1300811, 1316546, 1332306, 1348091,
+ 1363899, 1379733, 1395590, 1411471, 1427377, 1443306, 1459258, 1475234,
+ 1491234, 1507257, 1523302, 1539371, 1555462, 1571577, 1587713, 1603872,
+ 1620054, 1636257, 1652483, 1668730, 1684999, 1701289, 1717601, 1733935,
+ 1750289, 1766664, 1783060, 1799477, 1815915, 1832373, 1848851, 1865349,
+ 1881867, 1898405, 1914963, 1931540, 1948136, 1964752, 1981387, 1998040,
+ 2014713, 2031404, 2048113, 2064841, 2081587, 2098351, 2115133, 2131932,
+ 2148749, 2165583, 2182435, 2199303, 2216189, 2233091, 2250010, 2266945,
+ 2283896, 2300864, 2317847, 2334846, 2351861, 2368891, 2385936, 2402997,
+ 2420072, 2437162, 2454267, 2471386, 2488520, 2505667, 2522829, 2540004,
+ 2557193, 2574395, 2591610, 2608839, 2626080, 2643334, 2660601, 2677880,
+ 2695171, 2712474, 2729790, 2747116, 2764455, 2781804, 2799165, 2816537,
+ 2833919, 2851312, 2868716, 2886129, 2903553, 2920987, 2938430, 2955883,
+ 2973345, 2990816, 3008297, 3025786, 3043283, 3060790, 3078304, 3095826,
+ 3113356, 3130894, 3148439, 3165992, 3183552, 3201118, 3218692, 3236271,
+ 3253858, 3271450, 3289048, 3306652, 3324261, 3341876, 3359496, 3377121,
+ 3394751, 3412386, 3430024, 3447667, 3465314, 3482965, 3500619, 3518277,
+ 3535938, 3553602, 3571269, 3588938, 3606610, 3624284, 3641960, 3659637,
+ 3677317, 3694997, 3712679, 3730362, 3748046, 3765730, 3783414, 3801099,
+ 3818784, 3836468, 3854152, 3871835, 3889517, 3907199, 3924879, 3942557,
+ 3960234, 3977909, 3995581, 4013251, 4030919, 4048584, 4066246, 4083905,
+ 4101560, 4119212, 4136859, 4154503, 4172143, 4189778, 4207408, 4225033,
+ 4242653, 4260268, 4277877, 4295481, 4313078, 4330669, 4348254, 4365832,
+ 4383403, 4400967, 4418524, 4436073, 4453614, 4471148, 4488673, 4506189,
+ 4523697, 4541196, 4558686, 4576167, 4593638, 4611099, 4628550, 4645991,
+ 4663421, 4680841, 4698250, 4715648, 4733034, 4750409, 4767771, 4785122,
+ 4802460, 4819786, 4837099, 4854400, 4871687, 4888960, 4906220, 4923466,
+ 4940697, 4957915, 4975117, 4992305, 5009478, 5026635, 5043777, 5060903,
+ 5078013, 5095107, 5112184, 5129245, 5146289, 5163315, 5180324, 5197315,
+ 5214289, 5231244, 5248181, 5265099, 5281999, 5298879, 5315740, 5332581,
+ 5349403, 5366204, 5382986, 5399746, 5416486, 5433205, 5449903, 5466579,
+ 5483233, 5499865, 5516476, 5533063, 5549628, 5566170, 5582689, 5599184,
+ 5615656, 5632104, 5648527, 5664927, 5681301, 5697651, 5713975, 5730274,
+ 5746548, 5762795, 5779016, 5795211, 5811380, 5827521, 5843636, 5859722,
+ 5875782, 5891813, 5907817, 5923792, 5939738, 5955656, 5971544, 5987403,
+ 6003233, 6019032, 6034802, 6050541, 6066250, 6081927, 6097574, 6113189,
+ 6128773, 6144325, 6159845, 6175332, 6190787, 6206209, 6221598, 6236953,
+ 6252275, 6267563, 6282817, 6298036, 6313221, 6328371, 6343486, 6358566,
+ 6373610, 6388618, 6403590, 6418526, 6433425, 6448287, 6463112, 6477899,
+ 6492649, 6507361, 6522035, 6536671, 6551267, 6565825, 6580344, 6594823,
+ 6609263, 6623663, 6638022, 6652341, 6666620, 6680857, 6695054, 6709208,
+ 6723322, 6737393, 6751422, 6765408, 6779352, 6793253, 6807110, 6820924,
+ 6834695, 6848421, 6862103, 6875741, 6889334, 6902882, 6916384, 6929841,
+ 6943253, 6956618, 6969937, 6983209, 6996435, 7009613, 7022745, 7035829,
+ 7048864, 7061852, 7074792, 7087683, 7100525, 7113318, 7126062, 7138756,
+ 7151400, 7163994, 7176538, 7189031, 7201474, 7213865, 7226205, 7238493,
+ 7250730, 7262914, 7275046, 7287125, 7299151, 7311125, 7323044, 7334911,
+ 7346723, 7358481, 7370185, 7381834, 7393428, 7404967, 7416451, 7427878,
+ 7439250, 7450566, 7461826, 7473028, 7484174, 7495263, 7506294, 7517268,
+ 7528183, 7539041, 7549840, 7560580, 7571261, 7581884, 7592446, 7602949,
+ 7613393, 7623776, 7634098, 7644360, 7654561, 7664701, 7674779, 7684796,
+ 7694751, 7704643, 7714473, 7724241, 7733946, 7743587, 7753165, 7762680,
+ 7772130, 7781517, 7790839, 7800096, 7809289, 7818416, 7827478, 7836475,
+ 7845406, 7854270, 7863068, 7871800, 7880465, 7889063, 7897593, 7906056,
+ 7914451, 7922778, 7931037, 7939227, 7947349, 7955401, 7963385, 7971299,
+ 7979143, 7986917, 7994621, 8002254, 8009817, 8017309, 8024730, 8032080,
+ 8039358, 8046564, 8053698, 8060759, 8067748, 8074665, 8081508, 8088278,
+ 8094974, 8101597, 8108146, 8114620, 8121021, 8127346, 8133597, 8139772,
+ 8145873, 8151897, 8157846, 8163719, 8169515, 8175235, 8180879, 8186445,
+ 8191934, 8197346, 8202680, 8207936, 8213115, 8218215, 8223236, 8228179,
+ 8233042, 8237827, 8242532, 8247157, 8251703, 8256168, 8260553, 8264858,
+ 8269082, 8273225, 8277286, 8281267, 8285165, 8288982, 8292717, 8296369,
+ 8299939, 8303427, 8306831, 8310152, 8313390, 8316545, 8319615, 8322602,
+ 8325504, 8328322, 8331056, 8333704, 8336268, 8338746, 8341139, 8343446,
+ 8345668, 8347803, 8349852, 8351814, 8353690, 8355479, 8357181, 8358796,
+ 8360323, 8361762, 8363113, 8364377, 8365552, 8366638, 8367636, 8368545,
+ 8369365, 8370096, 8370737, 8371288, 8371750, 8372121, 8372403, 8372593,
+ 8372693, 8372703, 8372621, 8372448, 8372184, 8371828, 8371380, 8370840,
+ 8370208, 8369484, 8368667, 8367758, 8366756, 8365660, 8364471, 8363189,
+ 8361814, 8360344, 8358780, 8357123, 8355371, 8353524, 8351583, 8349547,
+ 8347416, 8345189, 8342867, 8340450, 8337937, 8335328, 8332623, 8329822,
+ 8326924, 8323929, 8320838, 8317650, 8314365, 8310983, 8307503, 8303926,
+ 8300251, 8296478, 8292607, 8288637, 8284570, 8280404, 8276139, 8271775,
+ 8267312, 8262750, 8258089, 8253328, 8248468, 8243508, 8238448, 8233288,
+ 8228027, 8222666, 8217205, 8211643, 8205980, 8200217, 8194352, 8188386,
+ 8182318, 8176149, 8169878, 8163506, 8157031, 8150455, 8143776, 8136995,
+ 8130111, 8123125, 8116036, 8108844, 8101549, 8094151, 8086649, 8079044,
+ 8071336, 8063524, 8055608, 8047588, 8039464, 8031236, 8022904, 8014467,
+ 8005926, 7997280, 7988529, 7979673, 7970713, 7961647, 7952476, 7943200,
+ 7933818, 7924330, 7914737, 7905038, 7895234, 7885323, 7875306, 7865183,
+ 7854953, 7844618, 7834175, 7823626, 7812970, 7802208, 7791338, 7780362,
+ 7769278, 7758087, 7746789, 7735383, 7723870, 7712250, 7700521, 7688685,
+ 7676741, 7664689, 7652529, 7640261, 7627885, 7615401, 7602808, 7590106,
+ 7577297, 7564378, 7551351, 7538215, 7524971, 7511617, 7498154, 7484583,
+ 7470902, 7457112, 7443213, 7429205, 7415087, 7400860, 7386523, 7372077,
+ 7357521, 7342855, 7328080, 7313195, 7298200, 7283095, 7267880, 7252555,
+ 7237120, 7221575, 7205919, 7190154, 7174278, 7158292, 7142195, 7125988,
+ 7109671, 7093243, 7076704, 7060055, 7043296, 7026426, 7009445, 6992353,
+ 6975150, 6957837, 6940413, 6922878, 6905233, 6887476, 6869608, 6851630,
+ 6833540, 6815340, 6797028, 6778606, 6760072, 6741428, 6722672, 6703805,
+ 6684827, 6665738, 6646538, 6627226, 6607804, 6588270, 6568625, 6548869,
+ 6529002, 6509023, 6488934, 6468733, 6448421, 6427998, 6407463, 6386818,
+ 6366061, 6345193, 6324214, 6303124, 6281923, 6260610, 6239187, 6217652,
+ 6196007, 6174250, 6152382, 6130404, 6108314, 6086113, 6063802, 6041379,
+ 6018846, 5996201, 5973446, 5950581, 5927604, 5904517, 5881318, 5858010,
+ 5834590, 5811061, 5787420, 5763669, 5739808, 5715836, 5691754, 5667561,
+ 5643258, 5618845, 5594322, 5569689, 5544946, 5520092, 5495129, 5470056,
+ 5444873, 5419580, 5394178, 5368666, 5343044, 5317313, 5291472, 5265522,
+ 5239463, 5213294, 5187016, 5160630, 5134134, 5107529, 5080815, 5053993,
+ 5027062, 5000022, 4972874, 4945618, 4918253, 4890779, 4863198, 4835508,
+ 4807711, 4779805, 4751792, 4723671, 4695443, 4667107, 4638663, 4610113,
+ 4581455, 4552690, 4523818, 4494839, 4465753, 4436561, 4407262, 4377857,
+ 4348345, 4318727, 4289003, 4259173, 4229238, 4199196, 4169049, 4138797,
+ 4108439, 4077976, 4047408, 4016735, 3985957, 3955074, 3924087, 3892996,
+ 3861800, 3830500, 3799096, 3767588, 3735976, 3704261, 3672443, 3640521,
+ 3608496, 3576368, 3544137, 3511804, 3479368, 3446830, 3414190, 3381447,
+ 3348603, 3315657, 3282609, 3249460, 3216210, 3182859, 3149407, 3115854,
+ 3082201, 3048447, 3014593, 2980639, 2946586, 2912432, 2878180, 2843828,
+ 2809377, 2774827, 2740178, 2705431, 2670585, 2635641, 2600600, 2565460,
+ 2530223, 2494889, 2459457, 2423929, 2388303, 2352582, 2316763, 2280849,
+ 2244839, 2208733, 2172532, 2136235, 2099843, 2063356, 2026775, 1990099,
+ 1953329, 1916465, 1879507, 1842456, 1805311, 1768073, 1730743, 1693320,
+ 1655804, 1618196, 1580496, 1542705, 1504822, 1466848, 1428783, 1390627,
+ 1352381, 1314044, 1275617, 1237101, 1198495, 1159800, 1121016, 1082143,
+ 1043182, 1004132, 964995, 925770, 886457, 847057, 807570, 767997,
+ 728337, 688591, 648759, 608842, 568839, 528751, 488579, 448322, 407980,
+ 367555, 327046, 286454, 245779, 205021, 164181, 123258, 82253, 41167,
+ 0, -41248, -82577, -123987, -165477, -207047, -248696, -290425,
+ -332232, -374118, -416083, -458125, -500245, -542443, -584718, -627069,
+ -669497, -712001, -754580, -797235, -839966, -882771, -925651, -968604,
+ -1011632, -1054733, -1097908, -1141155, -1184475, -1227867, -1271331,
+ -1314866, -1358472, -1402150, -1445898, -1489716, -1533603, -1577560,
+ -1621587, -1665682, -1709845, -1754077, -1798376, -1842743, -1887176,
+ -1931676, -1976243, -2020875, -2065573, -2110336, -2155164, -2200056,
+ -2245013, -2290033, -2335116, -2380263, -2425472, -2470743, -2516076,
+ -2561470, -2606926, -2652442, -2698019, -2743656, -2789352, -2835107,
+ -2880921, -2926794, -2972724, -3018712, -3064757, -3110860, -3157018,
+ -3203233, -3249503, -3295828, -3342209, -3388643, -3435132, -3481675,
+ -3528270, -3574919, -3621619, -3668372, -3715177, -3762032, -3808938,
+ -3855895, -3902902, -3949958, -3997063, -4044217, -4091419, -4138668,
+ -4185966, -4233310, -4280701, -4328137, -4375620, -4423148, -4470720,
+ -4518337, -4565998, -4613702, -4661450, -4709240, -4757072, -4804946,
+ -4852862, -4900818, -4948815, -4996851, -5044927, -5093042, -5141196,
+ -5189388, -5237618, -5285885, -5334189, -5382529, -5430905, -5479316,
+ -5527763, -5576244, -5624759, -5673308, -5721889, -5770504, -5819150,
+ -5867829, -5916538, -5965279, -6014049, -6062850, -6111680, -6160538,
+ -6209425, -6258341, -6307283, -6356253, -6405249, -6454271, -6503318,
+ -6552391, -6601488, -6650609, -6699754, -6748922, -6798112, -6847324,
+ -6896559, -6945814, -6995090, -7044386, -7093701, -7143036, -7192389,
+ -7241761, -7291150, -7340556, -7389979, -7439418, -7488872, -7538342,
+ -7587826, -7637325, -7686836, -7736361, -7785899, -7835448, -7885009,
+ -7934581, -7984164, -8033756, -8083358, -8132969, -8182588, -8232215,
+ -8281850, -8331491, -8381139, -8430792, -8480451, -8530114, -8579781,
+ -8629453, -8679127, -8728804, -8778483, -8828163, -8877845, -8927527,
+ -8977209, -9026890, -9076570, -9126249, -9175925, -9225598, -9275268,
+ -9324935, -9374596, -9424253, -9473905, -9523550, -9573189, -9622820,
+ -9672444, -9722060, -9771667, -9821264, -9870852, -9920429, -9969995,
+ -10019549, -10069092, -10118622, -10168138, -10217641, -10267129,
+ -10316602, -10366060, -10415502, -10464927, -10514335, -10563726,
+ -10613097, -10662451, -10711784, -10761098, -10810391, -10859663,
+ -10908913, -10958141, -11007346, -11056527, -11105685, -11154818,
+ -11203925, -11253007, -11302063, -11351092, -11400093, -11449066,
+ -11498011, -11546926, -11595811, -11644667, -11693491, -11742283,
+ -11791044, -11839772, -11888466, -11937127, -11985753, -12034344,
+ -12082899, -12131418, -12179901, -12228345, -12276752, -12325120,
+ -12373450, -12421739, -12469988, -12518196, -12566362, -12614486,
+ -12662567, -12710605, -12758599, -12806549, -12854453, -12902312,
+ -12950124, -12997890, -13045607, -13093277, -13140898, -13188469,
+ -13235991, -13283462, -13330882, -13378250, -13425566, -13472828,
+ -13520038, -13567193, -13614293, -13661338, -13708327, -13755259,
+ -13802134, -13848951, -13895710, -13942409, -13989049, -14035629,
+ -14082148, -14128606, -14175001, -14221334, -14267603, -14313808,
+ -14359949, -14406025, -14452035, -14497979, -14543855, -14589664,
+ -14635405, -14681077, -14726679, -14772212, -14817673, -14863064,
+ -14908382, -14953628, -14998801, -15043900, -15088925, -15133874,
+ -15178748, -15223546, -15268267, -15312910, -15357476, -15401962,
+ -15446370, -15490697, -15534944, -15579109, -15623193, -15667194,
+ -15711113, -15754947, -15798698, -15842363, -15885943, -15929436,
+ -15972843, -16016163, -16059394, -16102537, -16145591, -16188554,
+ -16231427, -16274209, -16316900, -16359498, -16402002, -16444414,
+ -16486731, -16528953, -16571079, -16613110, -16655044, -16696880,
+ -16738619, -16780258, -16821799, -16863240, -16904580, -16945819,
+ -16986957, -17027992, -17068924, -17109753, -17150477, -17191096,
+ -17231611, -17272019, -17312320, -17352514, -17392600, -17432577,
+ -17472446, -17512204, -17551852, -17591389, -17630815, -17670128,
+ -17709328, -17748414, -17787387, -17826245, -17864987, -17903613,
+ -17942123, -17980515, -18018790, -18056946, -18094983, -18132900,
+ -18170697, -18208373, -18245927, -18283359, -18320668, -18357854,
+ -18394916, -18431853, -18468665, -18505351, -18541911, -18578343,
+ -18614648, -18650824, -18686871, -18722789, -18758576, -18794233,
+ -18829758, -18865152, -18900412, -18935539, -18970533, -19005392,
+ -19040116, -19074704, -19109156, -19143471, -19177648, -19211688,
+ -19245588, -19279349, -19312971, -19346451, -19379791, -19412989,
+ -19446044, -19478957, -19511725, -19544350, -19576830, -19609165,
+ -19641353, -19673395, -19705290, -19737037, -19768635, -19800085,
+ -19831385, -19862535, -19893534, -19924381, -19955077, -19985620,
+ -20016010, -20046246, -20076328, -20106255, -20136027, -20165642,
+ -20195101, -20224402, -20253546, -20282531, -20311356, -20340023,
+ -20368529, -20396874, -20425058, -20453080, -20480939, -20508636,
+ -20536168, -20563536, -20590740, -20617777, -20644649, -20671354,
+ -20697892, -20724263, -20750465, -20776498, -20802361, -20828055,
+ -20853578, -20878929, -20904109, -20929117, -20953951, -20978613,
+ -21003100, -21027412, -21051550, -21075512, -21099297, -21122906,
+ -21146337, -21169590, -21192665, -21215561, -21238277, -21260813,
+ -21283168, -21305342, -21327334, -21349144, -21370770, -21392214,
+ -21413473, -21434548, -21455437, -21476141, -21496659, -21516990,
+ -21537133, -21557089, -21576857, -21596435, -21615825, -21635024,
+ -21654032, -21672850, -21691476, -21709910, -21728152, -21746200,
+ -21764054, -21781715, -21799180, -21816451, -21833525, -21850404,
+ -21867085, -21883569, -21899856, -21915944, -21931833, -21947523,
+ -21963013, -21978302, -21993391, -22008278, -22022963, -22037446,
+ -22051726, -22065802, -22079675, -22093343, -22106806, -22120064,
+ -22133115, -22145961, -22158599, -22171030, -22183254, -22195269,
+ -22207075, -22218671, -22230058, -22241235, -22252201, -22262955,
+ -22273498, -22283828, -22293946, -22303851, -22313542, -22323019,
+ -22332281, -22341329, -22350161, -22358777, -22367176, -22375359,
+ -22383324, -22391072, -22398601, -22405911, -22413003, -22419874,
+ -22426526, -22432957, -22439167, -22445156, -22450923, -22456468,
+ -22461790, -22466889, -22471764, -22476415, -22480842, -22485044,
+ -22489020, -22492771, -22496295, -22499594, -22502665, -22505508,
+ -22508124, -22510511, -22512670, -22514600, -22516300, -22517770,
+ -22519010, -22520019, -22520797, -22521344, -22521659, -22521741,
+ -22521590, -22521207, -22520590, -22519739, -22518653, -22517333,
+ -22515778, -22513988, -22511962, -22509699, -22507200, -22504464,
+ -22501490, -22498279, -22494830, -22491142, -22487216, -22483050,
+ -22478645, -22474000, -22469115, -22463989, -22458622, -22453014,
+ -22447164, -22441072, -22434738, -22428161, -22421341, -22414277,
+ -22406970, -22399419, -22391624, -22383584, -22375298, -22366768,
+ -22357991, -22348969, -22339700, -22330185, -22320423, -22310413,
+ -22300156, -22289651, -22278897, -22267896, -22256645, -22245145,
+ -22233396, -22221397, -22209148, -22196649, -22183899, -22170898,
+ -22157646, -22144143, -22130388, -22116381, -22102121, -22087610,
+ -22072845, -22057827, -22042556, -22027031, -22011252, -21995219,
+ -21978932, -21962390, -21945593, -21928541, -21911233, -21893670,
+ -21875851, -21857776, -21839444, -21820856, -21802011, -21782909,
+ -21763549, -21743932, -21724057, -21703925, -21683533, -21662884,
+ -21641976, -21620809, -21599383, -21577697, -21555753, -21533548,
+ -21511084, -21488359, -21465374, -21442129, -21418623, -21394856,
+ -21370829, -21346540, -21321989, -21297177, -21272103, -21246768,
+ -21221170, -21195310, -21169187, -21142802, -21116155, -21089244,
+ -21062070, -21034633, -21006933, -20978969, -20950741, -20922250,
+ -20893495, -20864476, -20835192, -20805644, -20775832, -20745755,
+ -20715413, -20684807, -20653936, -20622799, -20591397, -20559731,
+ -20527798, -20495600, -20463137, -20430408, -20397413, -20364152,
+ -20330625, -20296832, -20262773, -20228448, -20193856, -20158998,
+ -20123874, -20088483, -20052825, -20016901, -19980710, -19944252,
+ -19907527, -19870535, -19833277, -19795751, -19757958, -19719898,
+ -19681571, -19642977, -19604116, -19564987, -19525591, -19485928,
+ -19445997, -19405799, -19365334, -19324601, -19283601, -19242333,
+ -19200798, -19158996, -19116926, -19074588, -19031984, -18989111,
+ -18945972, -18902565, -18858890, -18814948, -18770739, -18726263,
+ -18681519, -18636508, -18591230, -18545684, -18499872, -18453792,
+ -18407445, -18360832, -18313951, -18266803, -18219389, -18171707,
+ -18123759, -18075545, -18027063, -17978315, -17929301, -17880020,
+ -17830473, -17780660, -17730581, -17680235, -17629624, -17578747,
+ -17527604, -17476195, -17424521, -17372581, -17320376, -17267906,
+ -17215171, -17162171, -17108906, -17055376, -17001582, -16947523,
+ -16893200, -16838612, -16783761, -16728645, -16673266, -16617623,
+ -16561717, -16505548, -16449115, -16392419, -16335461, -16278240,
+ -16220756, -16163010, -16105002, -16046732, -15988200, -15929407,
+ -15870352, -15811036, -15751460, -15691622, -15631524, -15571165,
+ -15510546, -15449667, -15388529, -15327131, -15265473, -15203557,
+ -15141381, -15078948, -15016255, -14953305, -14890096, -14826630,
+ -14762907, -14698926, -14634688, -14570194, -14505443, -14440436,
+ -14375174, -14309655, -14243882, -14177853, -14111569, -14045031,
+ -13978239, -13911193, -13843893, -13776340, -13708534, -13640475,
+ -13572163, -13503600, -13434784, -13365717, -13296399, -13226830,
+ -13157011, -13086941, -13016621, -12946052, -12875233, -12804166,
+ -12732850, -12661286, -12589474, -12517414, -12445108, -12372554,
+ -12299754, -12226708, -12153417, -12079880, -12006098, -11932071,
+ -11857800, -11783286, -11708527, -11633526, -11558283, -11482797,
+ -11407069, -11331100, -11254889, -11178438, -11101747, -11024816,
+ -10947646, -10870236, -10792588, -10714702, -10636579, -10558218,
+ -10479620, -10400786, -10321716, -10242410, -10162870, -10083095,
+ -10003086, -9922843, -9842367, -9761658, -9680717, -9599544, -9518140,
+ -9436505, -9354640, -9272545, -9190221, -9107667, -9024886, -8941876,
+ -8858639, -8775176, -8691485, -8607570, -8523428, -8439062, -8354472,
+ -8269658, -8184620, -8099360, -8013878, -7928174, -7842250, -7756104,
+ -7669739, -7583154, -7496350, -7409328, -7322088, -7234631, -7146957,
+ -7059068, -6970962, -6882642, -6794108, -6705359, -6616398, -6527224,
+ -6437838, -6348241, -6258432, -6168414, -6078186, -5987749, -5897104,
+ -5806251, -5715190, -5623924, -5532451, -5440773, -5348891, -5256804,
+ -5164514, -5072022, -4979327, -4886431, -4793334, -4700037, -4606541,
+ -4512845, -4418952, -4324861, -4230573, -4136089, -4041410, -3946536,
+ -3851467, -3756206, -3660751, -3565105, -3469267, -3373238, -3277020,
+ -3180612, -3084016, -2987232, -2890260, -2793102, -2695759, -2598231,
+ -2500518, -2402622, -2304543, -2206282, -2107839, -2009216, -1910414,
+ -1811432, -1712271, -1612933, -1513419, -1413728, -1313862, -1213821,
+ -1113607, -1013219, -912659, -811928, -711026, -609954, -508713,
+ -407304, -305727, -203984, -102074, 0, 102239, 204641, 307206, 409934,
+ 512822, 615871, 719079, 822446, 925970, 1029652, 1133489, 1237482,
+ 1341630, 1445931, 1550385, 1654991, 1759748, 1864655, 1969711, 2074917,
+ 2180269, 2285769, 2391414, 2497205, 2603140, 2709218, 2815438, 2921800,
+ 3028303, 3134945, 3241726, 3348645, 3455702, 3562894, 3670222, 3777684,
+ 3885280, 3993008, 4100868, 4208859, 4316979, 4425228, 4533606, 4642110,
+ 4750740, 4859496, 4968376, 5077379, 5186504, 5295751, 5405118, 5514605,
+ 5624211, 5733934, 5843773, 5953729, 6063799, 6173982, 6284279, 6394687,
+ 6505207, 6615836, 6726574, 6837420, 6948373, 7059432, 7170595, 7281863,
+ 7393234, 7504706, 7616280, 7727953, 7839726, 7951596, 8063564, 8175627,
+ 8287785, 8400037, 8512382, 8624819, 8737346, 8849964, 8962670, 9075463,
+ 9188344, 9301310, 9414361, 9527495, 9640712, 9754010, 9867389, 9980847,
+ 10094383, 10207997, 10321687, 10435452, 10549291, 10663203, 10777187,
+ 10891241, 11005366, 11119559, 11233820, 11348147, 11462540, 11576997,
+ 11691518, 11806100, 11920744, 12035448, 12150210, 12265030, 12379907,
+ 12494840, 12609827, 12724868, 12839960, 12955104, 13070298, 13185541,
+ 13300831, 13416168, 13531551, 13646978, 13762448, 13877961, 13993514,
+ 14109108, 14224740, 14340410, 14456116, 14571857, 14687633, 14803441,
+ 14919282, 15035153, 15151054, 15266983, 15382939, 15498922, 15614929,
+ 15730960, 15847014, 15963089, 16079184, 16195298, 16311430, 16427579,
+ 16543743, 16659922, 16776114, 16892318, 17008533, 17124757, 17240989,
+ 17357229, 17473475, 17589726, 17705980, 17822237, 17938495, 18054753,
+ 18171009, 18287264, 18403515, 18519761, 18636000, 18752233, 18868457,
+ 18984672, 19100875, 19217067, 19333245, 19449409, 19565556, 19681687,
+ 19797800, 19913893, 20029965, 20146015, 20262042, 20378045, 20494022,
+ 20609972, 20725894, 20841787, 20957648, 21073478, 21189275, 21305038,
+ 21420764, 21536454, 21652106, 21767718, 21883290, 21998820, 22114306,
+ 22229748, 22345145, 22460494, 22575795, 22691046, 22806247, 22921396,
+ 23036491, 23151532, 23266517, 23381444, 23496314, 23611123, 23725872,
+ 23840558, 23955181, 24069739, 24184230, 24298654, 24413010, 24527296,
+ 24641510, 24755652, 24869719, 24983712, 25097628, 25211467, 25325226,
+ 25438905, 25552502, 25666017, 25779447, 25892792, 26006049, 26119219,
+ 26232299, 26345288, 26458186, 26570990, 26683699, 26796312, 26908828,
+ 27021245, 27133562, 27245778, 27357891, 27469901, 27581805, 27693603,
+ 27805293, 27916874, 28028344, 28139702, 28250948, 28362078, 28473094,
+ 28583992, 28694771, 28805431, 28915970, 29026386, 29136678, 29246846,
+ 29356887, 29466800, 29576585, 29686239, 29795761, 29905150, 30014405,
+ 30123524, 30232506, 30341350, 30450054, 30558617, 30667037, 30775314,
+ 30883446, 30991431, 31099269, 31206957, 31314496, 31421882, 31529115,
+ 31636194, 31743117, 31849883, 31956491, 32062939, 32169225, 32275349,
+ 32381310, 32487105, 32592733, 32698194, 32803486, 32908607, 33013556,
+ 33118332, 33222934, 33327359, 33431607, 33535677, 33639567, 33743275,
+ 33846801, 33950143, 34053300, 34156270, 34259051, 34361644, 34464046,
+ 34566256, 34668272, 34770094, 34871719, 34973148, 35074377, 35175406,
+ 35276234, 35376859, 35477280, 35577496, 35677504, 35777305, 35876896,
+ 35976276, 36075444, 36174398, 36273137, 36371661, 36469966, 36568053,
+ 36665920, 36763565, 36860987, 36958184, 37055156, 37151902, 37248418,
+ 37344706, 37440762, 37536586, 37632176, 37727532, 37822651, 37917532,
+ 38012175, 38106577, 38200737, 38294655, 38388328, 38481755, 38574936,
+ 38667868, 38760551, 38852982, 38945162, 39037087, 39128758, 39220173,
+ 39311330, 39402228, 39492865, 39583241, 39673354, 39763203, 39852787,
+ 39942103, 40031152, 40119931, 40208439, 40296675, 40384637, 40472325,
+ 40559736, 40646871, 40733726, 40820302, 40906596, 40992607, 41078335,
+ 41163777, 41248933, 41333801, 41418379, 41502668, 41586664, 41670367,
+ 41753777, 41836890, 41919706, 42002224, 42084443, 42166361, 42247976,
+ 42329288, 42410296, 42490997, 42571391, 42651477, 42731253, 42810717,
+ 42889869, 42968708, 43047231, 43125438, 43203328, 43280899, 43358150,
+ 43435079, 43511686, 43587969, 43663926, 43739558, 43814861, 43889836,
+ 43964480, 44038793, 44112774, 44186420, 44259731, 44332706, 44405342,
+ 44477640, 44549598, 44621214, 44692487, 44763417, 44834001, 44904239,
+ 44974129, 45043671, 45112862, 45181701, 45250189, 45318322, 45386100,
+ 45453522, 45520587, 45587293, 45653639, 45719623, 45785246, 45850505,
+ 45915399, 45979927, 46044088, 46107880, 46171303, 46234355, 46297036,
+ 46359343, 46421275, 46482832, 46544013, 46604815, 46665238, 46725281,
+ 46784943, 46844222, 46903117, 46961627, 47019751, 47077487, 47134835,
+ 47191794, 47248361, 47304537, 47360319, 47415707, 47470700, 47525296,
+ 47579495, 47633294, 47686694, 47739692, 47792288, 47844481, 47896269,
+ 47947652, 47998628, 48049195, 48099354, 48149103, 48198440, 48247365,
+ 48295876, 48343973, 48391654, 48438919, 48485765, 48532193, 48578200,
+ 48623786, 48668950, 48713691, 48758007, 48801897, 48845361, 48888398,
+ 48931006, 48973183, 49014930, 49056246, 49097128, 49137576, 49177589,
+ 49217166, 49256306, 49295007, 49333269, 49371091, 49408472, 49445410,
+ 49481905, 49517956, 49553561, 49588720, 49623431, 49657694, 49691507,
+ 49724870, 49757781, 49790240, 49822245, 49853796, 49884891, 49915530,
+ 49945712, 49975435, 50004699, 50033502, 50061844, 50089724, 50117141,
+ 50144093, 50170580, 50196602, 50222156, 50247242, 50271859, 50296006,
+ 50319683, 50342887, 50365619, 50387878, 50409662, 50430970, 50451803,
+ 50472158, 50492034, 50511432, 50530350, 50548787, 50566742, 50584215,
+ 50601204, 50617709, 50633729, 50649262, 50664309, 50678867, 50692937,
+ 50706517, 50719607, 50732206, 50744313, 50755926, 50767046, 50777671,
+ 50787801, 50797435, 50806571, 50815210, 50823350, 50830990, 50838130,
+ 50844769, 50850906, 50856540, 50861671, 50866297, 50870419, 50874034,
+ 50877143, 50879745, 50881838, 50883423, 50884498, 50885062, 50885116,
+ 50884657, 50883686, 50882201, 50880203, 50877689, 50874660, 50871115,
+ 50867053, 50862473, 50857375, 50851758, 50845621, 50838963, 50831785,
+ 50824084, 50815861, 50807115, 50797845, 50788051, 50777731, 50766886,
+ 50755514, 50743615, 50731188, 50718233, 50704749, 50690735, 50676191,
+ 50661116, 50645510, 50629372, 50612700, 50595496, 50577758, 50559485,
+ 50540677, 50521333, 50501454, 50481037, 50460083, 50438591, 50416561,
+ 50393992, 50370883, 50347234, 50323044, 50298313, 50273041, 50247226,
+ 50220868, 50193968, 50166523, 50138534, 50110001, 50080922, 50051297,
+ 50021126, 49990409, 49959144, 49927332, 49894971, 49862062, 49828604,
+ 49794597, 49760039, 49724931, 49689273, 49653063, 49616301, 49578988,
+ 49541122, 49502703, 49463731, 49424205, 49384126, 49343491, 49302302,
+ 49260558, 49218258, 49175402, 49131990, 49088021, 49043496, 48998413,
+ 48952772, 48906573, 48859816, 48812500, 48764625, 48716191, 48667198,
+ 48617644, 48567530, 48516856, 48465621, 48413825, 48361467, 48308548,
+ 48255067, 48201024, 48146419, 48091251, 48035520, 47979226, 47922369,
+ 47864948, 47806963, 47748414, 47689301, 47629624, 47569382, 47508575,
+ 47447204, 47385267, 47322765, 47259697, 47196064, 47131864, 47067099,
+ 47001768, 46935870, 46869406, 46802376, 46734778, 46666614, 46597884,
+ 46528586, 46458721, 46388288, 46317289, 46245722, 46173588, 46100886,
+ 46027616, 45953779, 45879374, 45804402, 45728861, 45652753, 45576077,
+ 45498833, 45421021, 45342641, 45263693, 45184177, 45104093, 45023442,
+ 44942222, 44860434, 44778079, 44695155, 44611664, 44527605, 44442979,
+ 44357784, 44272022, 44185693, 44098796, 44011332, 43923300, 43834701,
+ 43745535, 43655802, 43565502, 43474636, 43383202, 43291203, 43198636,
+ 43105504, 43011805, 42917541, 42822710, 42727314, 42631353, 42534826,
+ 42437734, 42340077, 42241855, 42143069, 42043719, 41943804, 41843326,
+ 41742283, 41640678, 41538509, 41435777, 41332483, 41228626, 41124206,
+ 41019225, 40913682, 40807578, 40700913, 40593687, 40485900, 40377554,
+ 40268647, 40159181, 40049155, 39938571, 39827428, 39715727, 39603468,
+ 39490651, 39377277, 39263347, 39148860, 39033817, 38918218, 38802064,
+ 38685355, 38568091, 38450274, 38331903, 38212978, 38093501, 37973472,
+ 37852890, 37731757, 37610073, 37487839, 37365054, 37241720, 37117837,
+ 36993405, 36868425, 36742897, 36616822, 36490200, 36363033, 36235319,
+ 36107061, 35978258, 35848911, 35719021, 35588588, 35457612, 35326095,
+ 35194037, 35061438, 34928299, 34794620, 34660403, 34525647, 34390354,
+ 34254524, 34118158, 33981256, 33843819, 33705847, 33567342, 33428303,
+ 33288732, 33148630, 33007996, 32866832, 32725138, 32582915, 32440163,
+ 32296884, 32153079, 32008746, 31863889, 31718507, 31572601, 31426171,
+ 31279219, 31131746, 30983751, 30835236, 30686202, 30536649, 30386579,
+ 30235991, 30084887, 29933268, 29781134, 29628487, 29475326, 29321654,
+ 29167470, 29012776, 28857572, 28701859, 28545639, 28388912, 28231679,
+ 28073940, 27915698, 27756952, 27597703, 27437953, 27277702, 27116952,
+ 26955703, 26793956, 26631712, 26468973, 26305738, 26142009, 25977788,
+ 25813074, 25647869, 25482174, 25315990, 25149319, 24982160, 24814514,
+ 24646384, 24477770, 24308673, 24139094, 23969035, 23798495, 23627477,
+ 23455981, 23284008, 23111560, 22938638, 22765242, 22591374, 22417034,
+ 22242225, 22066947, 21891201, 21714989, 21538310, 21361168, 21183562,
+ 21005495, 20826966, 20647978, 20468531, 20288627, 20108266, 19927451,
+ 19746182, 19564460, 19382287, 19199664, 19016592, 18833072, 18649105,
+ 18464694, 18279839, 18094540, 17908801, 17722621, 17536003, 17348947,
+ 17161454, 16973527, 16785165, 16596372, 16407147, 16217493, 16027410,
+ 15836900, 15645964, 15454604, 15262821, 15070616, 14877990, 14684946,
+ 14491484, 14297606, 14103313, 13908606, 13713488, 13517958, 13322020,
+ 13125674, 12928921, 12731764, 12534202, 12336239, 12137875, 11939112,
+ 11739952, 11540395, 11340443, 11140098, 10939361, 10738234, 10536718,
+ 10334815, 10132526, 9929852, 9726796, 9523359, 9319542, 9115346,
+ 8910774, 8705827, 8500507, 8294814, 8088752, 7882320, 7675521, 7468356,
+ 7260828, 7052937, 6844685, 6636074, 6427105, 6217780, 6008101, 5798069,
+ 5587686, 5376954, 5165874, 4954447, 4742676, 4530563, 4318108, 4105313,
+ 3892181, 3678713, 3464911, 3250775, 3036309, 2821514, 2606391, 2390942,
+ 2175169, 1959073, 1742658, 1525923, 1308871, 1091504, 873823, 655830,
+ 437528, 218917, 0, -219222, -438746, -658572, -878698, -1099120,
+ -1319839, -1540851, -1762155, -1983749, -2205631, -2427800, -2650254,
+ -2872990, -3096007, -3319303, -3542877, -3766725, -3990847, -4215240,
+ -4439903, -4664834, -4890030, -5115490, -5341212, -5567194, -5793434,
+ -6019931, -6246681, -6473684, -6700937, -6928439, -7156187, -7384179,
+ -7612414, -7840889, -8069603, -8298553, -8527738, -8757156, -8986804,
+ -9216680, -9446783, -9677111, -9907661, -10138432, -10369421,
+ -10600626, -10832046, -11063678, -11295521, -11527572, -11759828,
+ -11992289, -12224952, -12457815, -12690876, -12924133, -13157583,
+ -13391225, -13625056, -13859075, -14093279, -14327667, -14562235,
+ -14796983, -15031907, -15267006, -15502277, -15737719, -15973330,
+ -16209106, -16445046, -16681148, -16917410, -17153829, -17390404,
+ -17627132, -17864010, -18101038, -18338212, -18575530, -18812991,
+ -19050592, -19288330, -19526204, -19764211, -20002350, -20240617,
+ -20479011, -20717530, -20956171, -21194931, -21433810, -21672804,
+ -21911911, -22151129, -22390455, -22629889, -22869426, -23109065,
+ -23348804, -23588640, -23828571, -24068595, -24308710, -24548912,
+ -24789200, -25029572, -25270025, -25510557, -25751166, -25991849,
+ -26232604, -26473428, -26714320, -26955277, -27196296, -27437375,
+ -27678513, -27919706, -28160952, -28402249, -28643594, -28884986,
+ -29126421, -29367898, -29609413, -29850966, -30092552, -30334170,
+ -30575818, -30817493, -31059192, -31300913, -31542655, -31784414,
+ -32026187, -32267974, -32509770, -32751575, -32993384, -33235197,
+ -33477009, -33718820, -33960627, -34202426, -34444217, -34685995,
+ -34927760, -35169507, -35411236, -35652943, -35894625, -36136282,
+ -36377909, -36619505, -36861067, -37102592, -37344079, -37585524,
+ -37826925, -38068280, -38309586, -38550841, -38792042, -39033186,
+ -39274272, -39515296, -39756256, -39997150, -40237975, -40478728,
+ -40719408, -40960011, -41200535, -41440978, -41681336, -41921608,
+ -42161791, -42401882, -42641878, -42881778, -43121579, -43361278,
+ -43600873, -43840360, -44079738, -44319004, -44558155, -44797189,
+ -45036104, -45274895, -45513563, -45752102, -45990512, -46228789,
+ -46466930, -46704934, -46942798, -47180519, -47418094, -47655521,
+ -47892797, -48129920, -48366888, -48603696, -48840344, -49076828,
+ -49313146, -49549294, -49785272, -50021075, -50256702, -50492149,
+ -50727414, -50962495, -51197389, -51432093, -51666605, -51900921,
+ -52135040, -52368959, -52602675, -52836186, -53069488, -53302580,
+ -53535458, -53768121, -54000564, -54232787, -54464786, -54696558,
+ -54928101, -55159412, -55390489, -55621329, -55851929, -56082287,
+ -56312400, -56542265, -56771880, -57001242, -57230349, -57459197,
+ -57687785, -57916109, -58144166, -58371956, -58599473, -58826717,
+ -59053684, -59280371, -59506777, -59732897, -59958731, -60184274,
+ -60409525, -60634480, -60859138, -61083494, -61307548, -61531295,
+ -61754734, -61977862, -62200676, -62423173, -62645351, -62867207,
+ -63088738, -63309942, -63530817, -63751359, -63971565, -64191434,
+ -64410962, -64630147, -64848986, -65067477, -65285616, -65503402,
+ -65720831, -65937901, -66154610, -66370953, -66586930, -66802537,
+ -67017771, -67232630, -67447112, -67661213, -67874931, -68088263,
+ -68301207, -68513759, -68725918, -68937681, -69149045, -69360007,
+ -69570564, -69780715, -69990456, -70199784, -70408698, -70617194,
+ -70825270, -71032923, -71240150, -71446949, -71653318, -71859252,
+ -72064751, -72269811, -72474430, -72678604, -72882332, -73085610,
+ -73288436, -73490808, -73692723, -73894177, -74095169, -74295696,
+ -74495755, -74695344, -74894459, -75093099, -75291261, -75488941,
+ -75686138, -75882849, -76079071, -76274802, -76470039, -76664779,
+ -76859019, -77052758, -77245992, -77438719, -77630937, -77822642,
+ -78013832, -78204505, -78394657, -78584287, -78773391, -78961968,
+ -79150014, -79337527, -79524504, -79710943, -79896841, -80082195,
+ -80267004, -80451264, -80634973, -80818128, -81000726, -81182766,
+ -81364244, -81545158, -81725506, -81905284, -82084491, -82263124,
+ -82441179, -82618655, -82795550, -82971860, -83147582, -83322716,
+ -83497257, -83671203, -83844553, -84017302, -84189450, -84360992,
+ -84531928, -84702253, -84871967, -85041065, -85209546, -85377408,
+ -85544647, -85711261, -85877247, -86042604, -86207329, -86371419,
+ -86534872, -86697684, -86859855, -87021381, -87182259, -87342488,
+ -87502065, -87660987, -87819252, -87976858, -88133801, -88290081,
+ -88445693, -88600636, -88754907, -88908505, -89061425, -89213667,
+ -89365227, -89516103, -89666293, -89815794, -89964604, -90112720,
+ -90260141, -90406863, -90552885, -90698203, -90842816, -90986721,
+ -91129916, -91272399, -91414166, -91555216, -91695546, -91835154,
+ -91974038, -92112195, -92249623, -92386320, -92522282, -92657509,
+ -92791997, -92925745, -93058749, -93191008, -93322519, -93453280,
+ -93583289, -93712544, -93841041, -93968780, -94095757, -94221970,
+ -94347417, -94472096, -94596004, -94719140, -94841501, -94963084,
+ -95083888, -95203910, -95323148, -95441600, -95559263, -95676136,
+ -95792216, -95907501, -96021989, -96135677, -96248563, -96360646,
+ -96471923, -96582391, -96692049, -96800895, -96908925, -97016139,
+ -97122534, -97228108, -97332859, -97436784, -97539882, -97642150,
+ -97743586, -97844188, -97943954, -98042883, -98140971, -98238217,
+ -98334618, -98430173, -98524880, -98618736, -98711739, -98803888,
+ -98895180, -98985613, -99075186, -99163896, -99251741, -99338719,
+ -99424828, -99510066, -99594432, -99677922, -99760536, -99842271,
+ -99923126, -100003097, -100082184, -100160384, -100237696, -100314117,
+ -100389645, -100464279, -100538017, -100610856, -100682796, -100753833,
+ -100823966, -100893194, -100961514, -101028924, -101095423, -101161008,
+ -101225679, -101289432, -101352266, -101414180, -101475171, -101535238,
+ -101594379, -101652591, -101709874, -101766226, -101821644, -101876127,
+ -101929673, -101982280, -102033947, -102084672, -102134453, -102183288,
+ -102231176, -102278115, -102324103, -102369138, -102413220, -102456345,
+ -102498513, -102539721, -102579969, -102619254, -102657575, -102694930,
+ -102731317, -102766736, -102801183, -102834658, -102867159, -102898685,
+ -102929233, -102958803, -102987392, -103014999, -103041623, -103067261,
+ -103091913, -103115577, -103138252, -103159935, -103180625, -103200322,
+ -103219022, -103236725, -103253430, -103269135, -103283838, -103297538,
+ -103310233, -103321922, -103332604, -103342278, -103350941, -103358592,
+ -103365230, -103370854, -103375462, -103379053, -103381625, -103383178,
+ -103383709, -103383217, -103381702, -103379161, -103375594, -103370999,
+ -103365375, -103358720, -103351034, -103342314, -103332561, -103321771,
+ -103309945, -103297081, -103283178, -103268234, -103252249, -103235220,
+ -103217148, -103198030, -103177866, -103156655, -103134394, -103111084,
+ -103086723, -103061309, -103034842, -103007321, -102978745, -102949111,
+ -102918420, -102886671, -102853861, -102819991, -102785059, -102749064,
+ -102712004, -102673880, -102634690, -102594433, -102553108, -102510713,
+ -102467249, -102422714, -102377107, -102330428, -102282674, -102233846,
+ -102183942, -102132962, -102080904, -102027769, -101973554, -101918259,
+ -101861883, -101804425, -101745885, -101686261, -101625553, -101563761,
+ -101500882, -101436917, -101371864, -101305724, -101238494, -101170175,
+ -101100765, -101030264, -100958672, -100885986, -100812208, -100737336,
+ -100661369, -100584306, -100506148, -100426893, -100346541, -100265091,
+ -100182543, -100098895, -100014148, -99928301, -99841352, -99753303,
+ -99664151, -99573897, -99482539, -99390079, -99296514, -99201844,
+ -99106069, -99009189, -98911203, -98812110, -98711910, -98610603,
+ -98508188, -98404664, -98300032, -98194291, -98087441, -97979480,
+ -97870410, -97760228, -97648936, -97536533, -97423018, -97308391,
+ -97192651, -97075800, -96957835, -96838758, -96718567, -96597262,
+ -96474844, -96351312, -96226665, -96100904, -95974028, -95846038,
+ -95716932, -95586711, -95455375, -95322924, -95189356, -95054673,
+ -94918874, -94781960, -94643929, -94504782, -94364518, -94223139,
+ -94080643, -93937031, -93792303, -93646458, -93499497, -93351420,
+ -93202226, -93051916, -92900490, -92747947, -92594289, -92439514,
+ -92283624, -92126618, -91968496, -91809258, -91648905, -91487436,
+ -91324853, -91161154, -90996341, -90830413, -90663370, -90495214,
+ -90325943, -90155559, -89984061, -89811450, -89637726, -89462889,
+ -89286940, -89109879, -88931706, -88752422, -88572026, -88390520,
+ -88207904, -88024177, -87839341, -87653396, -87466341, -87278179,
+ -87088908, -86898530, -86707045, -86514454, -86320756, -86125952,
+ -85930044, -85733031, -85534914, -85335693, -85135369, -84933943,
+ -84731415, -84527786, -84323056, -84117226, -83910296, -83702268,
+ -83493141, -83282917, -83071597, -82859180, -82645667, -82431060,
+ -82215358, -81998564, -81780676, -81561697, -81341627, -81120466,
+ -80898216, -80674877, -80450450, -80224936, -79998335, -79770649,
+ -79541879, -79312025, -79081088, -78849069, -78615969, -78381788,
+ -78146529, -77910191, -77672776, -77434285, -77194718, -76954077,
+ -76712362, -76469575, -76225716, -75980787, -75734789, -75487723,
+ -75239589, -74990390, -74740125, -74488796, -74236405, -73982952,
+ -73728439, -73472866, -73216235, -72958546, -72699802, -72440004,
+ -72179152, -71917248, -71654292, -71390288, -71125234, -70859134,
+ -70591987, -70323796, -70054562, -69784286, -69512969, -69240613,
+ -68967219, -68692788, -68417323, -68140823, -67863291, -67584728,
+ -67305136, -67024515, -66742868, -66460196, -66176500, -65891781,
+ -65606042, -65319284, -65031508, -64742716, -64452910, -64162090,
+ -63870259, -63577418, -63283569, -62988714, -62692853, -62395989,
+ -62098123, -61799256, -61499392, -61198531, -60896674, -60593825,
+ -60289984, -59985152, -59679333, -59372527, -59064737, -58755964,
+ -58446210, -58135476, -57823765, -57511078, -57197418, -56882786,
+ -56567183, -56250612, -55933075, -55614574, -55295110, -54974686,
+ -54653302, -54330962, -54007668, -53683420, -53358222, -53032075,
+ -52704981, -52376942, -52047961, -51718039, -51387178, -51055380,
+ -50722648, -50388984, -50054389, -49718866, -49382417, -49045043,
+ -48706748, -48367534, -48027402, -47686354, -47344393, -47001522,
+ -46657742, -46313055, -45967464, -45620971, -45273579, -44925288,
+ -44576103, -44226025, -43875057, -43523200, -43170457, -42816831,
+ -42462324, -42106938, -41750675, -41393538, -41035530, -40676653,
+ -40316909, -39956300, -39594830, -39232500, -38869313, -38505272,
+ -38140379, -37774637, -37408047, -37040613, -36672338, -36303223,
+ -35933271, -35562485, -35190868, -34818422, -34445149, -34071053,
+ -33696135, -33320400, -32943848, -32566483, -32188308, -31809326,
+ -31429538, -31048948, -30667558, -30285372, -29902391, -29518619,
+ -29134059, -28748713, -28362584, -27975675, -27587988, -27199527,
+ -26810294, -26420293, -26029525, -25637995, -25245704, -24852656,
+ -24458854, -24064300, -23668998, -23272950, -22876159, -22478629,
+ -22080362, -21681361, -21281630, -20881171, -20479987, -20078081,
+ -19675457, -19272118, -18868066, -18463304, -18057836, -17651665,
+ -17244793, -16837225, -16428962, -16020009, -15610369, -15200043,
+ -14789037, -14377352, -13964992, -13551961, -13138261, -12723896,
+ -12308869, -11893183, -11476842, -11059848, -10642205, -10223916,
+ -9804985, -9385415, -8965209, -8544371, -8122903, -7700810, -7278094,
+ -6854759, -6430809, -6006246, -5581074, -5155297, -4728918, -4301940,
+ -3874367, -3446202, -3017449, -2588111, -2158192, -1727695, -1296624,
+ -864982, -432773, 0, 433333, 867223, 1301666, 1736658, 2172197,
+ 2608278, 3044897, 3482052, 3919738, 4357952, 4796690, 5235949, 5675725,
+ 6116014, 6556813, 6998117, 7439924, 7882229, 8325029, 8768320, 9212098,
+ 9656360, 10101101, 10546319, 10992008, 11438166, 11884789, 12331873,
+ 12779414, 13227408, 13675851, 14124740, 14574070, 15023839, 15474041,
+ 15924674, 16375732, 16827213, 17279113, 17731426, 18184151, 18637282,
+ 19090816, 19544748, 19999075, 20453793, 20908898, 21364386, 21820253,
+ 22276494, 22733107, 23190086, 23647428, 24105128, 24563184, 25021590,
+ 25480343, 25939438, 26398872, 26858640, 27318738, 27779162, 28239909,
+ 28700973, 29162352, 29624039, 30086033, 30548327, 31010919, 31473804,
+ 31936978, 32400437, 32864175, 33328190, 33792478, 34257033, 34721851,
+ 35186929, 35652262, 36117846, 36583677, 37049749, 37516060, 37982605,
+ 38449379, 38916379, 39383599, 39851036, 40318685, 40786542, 41254603,
+ 41722862, 42191317, 42659963, 43128794, 43597807, 44066998, 44536362,
+ 45005894, 45475591, 45945448, 46415460, 46885623, 47355932, 47826384,
+ 48296973, 48767696, 49238547, 49709523, 50180619, 50651830, 51123152,
+ 51594580, 52066110, 52537738, 53009458, 53481267, 53953160, 54425132,
+ 54897178, 55369295, 55841478, 56313722, 56786022, 57258375, 57730775,
+ 58203217, 58675698, 59148213, 59620757, 60093325, 60565913, 61038516,
+ 61511130, 61983750, 62456371, 62928989, 63401599, 63874196, 64346776,
+ 64819334, 65291866, 65764366, 66236830, 66709254, 67181632, 67653961,
+ 68126234, 68598449, 69070599, 69542680, 70014688, 70486617, 70958463,
+ 71430222, 71901887, 72373456, 72844923, 73316282, 73787531, 74258662,
+ 74729673, 75200558, 75671312, 76141931, 76612410, 77082743, 77552927,
+ 78022956, 78492825, 78962530, 79432066, 79901428, 80370612, 80839611,
+ 81308423, 81777041, 82245461, 82713678, 83181687, 83649483, 84117062,
+ 84584419, 85051548, 85518445, 85985105, 86451523, 86917694, 87383613,
+ 87849276, 88314678, 88779813, 89244677, 89709264, 90173571, 90637591,
+ 91101321, 91564754, 92027887, 92490714, 92953230, 93415431, 93877312,
+ 94338866, 94800091, 95260980, 95721529, 96181732, 96641586, 97101084,
+ 97560222, 98018995, 98477398, 98935426, 99393074, 99850336, 100307209,
+ 100763687, 101219766, 101675439, 102130702, 102585551, 103039979,
+ 103493983, 103947557, 104400696, 104853395, 105305650, 105757454,
+ 106208804, 106659694, 107110119, 107560074, 108009554, 108458555,
+ 108907070, 109355096, 109802626, 110249657, 110696183, 111142198,
+ 111587699, 112032679, 112477135, 112921060, 113364450, 113807300,
+ 114249605, 114691360, 115132559, 115573198, 116013272, 116452775,
+ 116891703, 117330051, 117767813, 118204984, 118641560, 119077535,
+ 119512905, 119947664, 120381807, 120815330, 121248226, 121680492,
+ 122112122, 122543111, 122973454, 123403146, 123832183, 124260557,
+ 124688266, 125115304, 125541665, 125967345, 126392339, 126816642,
+ 127240248, 127663152, 128085351, 128506837, 128927607, 129347656,
+ 129766978, 130185568, 130603422, 131020534, 131436899, 131852512,
+ 132267369, 132681463, 133094791, 133507347, 133919126, 134330123,
+ 134740333, 135149751, 135558372, 135966191, 136373202, 136779402,
+ 137184785, 137589345, 137993078, 138395980, 138798044, 139199265,
+ 139599640, 139999162, 140397828, 140795631, 141192567, 141588630,
+ 141983817, 142378121, 142771538, 143164064, 143555691, 143946417,
+ 144336236, 144725143, 145113132, 145500200, 145886341, 146271550,
+ 146655821, 147039151, 147421535, 147802966, 148183440, 148562953,
+ 148941500, 149319074, 149695673, 150071290, 150445920, 150819559,
+ 151192202, 151563844, 151934479, 152304104, 152672713, 153040300,
+ 153406863, 153772394, 154136890, 154500346, 154862756, 155224116,
+ 155584421, 155943667, 156301847, 156658958, 157014994, 157369950,
+ 157723823, 158076606, 158428295, 158778886, 159128373, 159476751,
+ 159824016, 160170163, 160515187, 160859083, 161201847, 161543473,
+ 161883957, 162223294, 162561479, 162898508, 163234375, 163569077,
+ 163902607, 164234962, 164566136, 164896125, 165224925, 165552529,
+ 165878934, 166204135, 166528128, 166850906, 167172467, 167492804,
+ 167811914, 168129791, 168446432, 168761830, 169075982, 169388883,
+ 169700528, 170010913, 170320033, 170627882, 170934458, 171239755,
+ 171543767, 171846492, 172147924, 172448058, 172746890, 173044416,
+ 173340630, 173635528, 173929106, 174221359, 174512282, 174801872,
+ 175090122, 175377030, 175662589, 175946797, 176229648, 176511137,
+ 176791261, 177070014, 177347393, 177623392, 177898008, 178171236,
+ 178443070, 178713508, 178982545, 179250175, 179516395, 179781200,
+ 180044586, 180306549, 180567083, 180826185, 181083851, 181340075,
+ 181594854, 181848183, 182100057, 182350473, 182599427, 182846913,
+ 183092928, 183337467, 183580526, 183822101, 184062187, 184300780,
+ 184537876, 184773471, 185007560, 185240140, 185471205, 185700752,
+ 185928777, 186155275, 186380242, 186603674, 186825567, 187045916,
+ 187264719, 187481969, 187697664, 187911799, 188124371, 188335374,
+ 188544805, 188752660, 188958934, 189163625, 189366727, 189568236,
+ 189768149, 189966462, 190163171, 190358271, 190551758, 190743629,
+ 190933880, 191122507, 191309505, 191494871, 191678602, 191860692,
+ 192041138, 192219937, 192397084, 192572575, 192746407, 192918576,
+ 193089078, 193257909, 193425065, 193590543, 193754338, 193916448,
+ 194076868, 194235594, 194392623, 194547951, 194701574, 194853489,
+ 195003692, 195152179, 195298946, 195443991, 195587308, 195728895,
+ 195868748, 196006864, 196143238, 196277867, 196410748, 196541877,
+ 196671250, 196798864, 196924716, 197048802, 197171118, 197291661,
+ 197410427, 197527413, 197642616, 197756032, 197867657, 197977489,
+ 198085524, 198191758, 198296188, 198398811, 198499623, 198598621,
+ 198695802, 198791163, 198884699, 198976408, 199066287, 199154333,
+ 199240541, 199324909, 199407434, 199488112, 199566940, 199643916,
+ 199719035, 199792295, 199863693, 199933225, 200000889, 200066681,
+ 200130598, 200192637, 200252796, 200311071, 200367458, 200421956,
+ 200474561, 200525270, 200574080, 200620988, 200665991, 200709087,
+ 200750272, 200789544, 200826899, 200862335, 200895849, 200927438,
+ 200957100, 200984831, 201010629, 201034490, 201056413, 201076394,
+ 201094431, 201110521, 201124661, 201136849, 201147082, 201155357,
+ 201161671, 201166023, 201168409, 201168827, 201167274, 201163748,
+ 201158246, 201150766, 201141305, 201129860, 201116430, 201101011,
+ 201083601, 201064198, 201042800, 201019404, 200994007, 200966607,
+ 200937202, 200905790, 200872368, 200836934, 200799485, 200760020,
+ 200718535, 200675030, 200629501, 200581947, 200532365, 200480753,
+ 200427108, 200371430, 200313715, 200253961, 200192167, 200128331,
+ 200062449, 199994521, 199924544, 199852516, 199778436, 199702301,
+ 199624109, 199543858, 199461547, 199377173, 199290735, 199202231,
+ 199111658, 199019016, 198924302, 198827514, 198728651, 198627711,
+ 198524692, 198419593, 198312411, 198203145, 198091794, 197978355,
+ 197862827, 197745209, 197625498, 197503694, 197379794, 197253798,
+ 197125703, 196995507, 196863211, 196728811, 196592308, 196453698,
+ 196312981, 196170155, 196025219, 195878172, 195729012, 195577737,
+ 195424347, 195268841, 195111216, 194951472, 194789608, 194625621,
+ 194459512, 194291278, 194120919, 193948434, 193773821, 193597079,
+ 193418207, 193237205, 193054070, 192868803, 192681401, 192491864,
+ 192300191, 192106382, 191910434, 191712347, 191512121, 191309754,
+ 191105245, 190898594, 190689800, 190478862, 190265779, 190050551,
+ 189833176, 189613654, 189391984, 189168166, 188942199, 188714081,
+ 188483814, 188251395, 188016825, 187780102, 187541227, 187300198,
+ 187057016, 186811679, 186564187, 186314540, 186062737, 185808779,
+ 185552663, 185294391, 185033961, 184771374, 184506629, 184239725,
+ 183970664, 183699443, 183426063, 183150524, 182872826, 182592967,
+ 182310950, 182026772, 181740434, 181451936, 181161278, 180868459,
+ 180573480, 180276341, 179977042, 179675582, 179371962, 179066182,
+ 178758241, 178448141, 178135880, 177821460, 177504881, 177186142,
+ 176865243, 176542186, 176216970, 175889596, 175560063, 175228373,
+ 174894525, 174558520, 174220358, 173880040, 173537566, 173192936,
+ 172846152, 172497212, 172146119, 171792872, 171437471, 171079919,
+ 170720214, 170358358, 169994352, 169628195, 169259889, 168889435,
+ 168516832, 168142082, 167765186, 167386144, 167004956, 166621625,
+ 166236151, 165848534, 165458776, 165066876, 164672838, 164276660,
+ 163878345, 163477892, 163075304, 162670581, 162263724, 161854735,
+ 161443614, 161030363, 160614982, 160197473, 159777837, 159356075,
+ 158932188, 158506178, 158078046, 157647793, 157215421, 156780930,
+ 156344323, 155905600, 155464763, 155021814, 154576753, 154129582,
+ 153680303, 153228918, 152775427, 152319832, 151862135, 151402338,
+ 150940441, 150476448, 150010358, 149542175, 149071899, 148599533,
+ 148125078, 147648535, 147169908, 146689197, 146206404, 145721531,
+ 145234581, 144745554, 144254454, 143761281, 143266037, 142768726,
+ 142269348, 141767906, 141264402, 140758837, 140251215, 139741537,
+ 139229805, 138716021, 138200188, 137682307, 137162382, 136640413,
+ 136116404, 135590357, 135062274, 134532157, 134000009, 133465833,
+ 132929629, 132391402, 131851153, 131308885, 130764600, 130218301,
+ 129669990, 129119671, 128567345, 128013014, 127456683, 126898353,
+ 126338027, 125775708, 125211398, 124645100, 124076817, 123506552,
+ 122934307, 122360086, 121783890, 121205724, 120625589, 120043489,
+ 119459427, 118873406, 118285428, 117695497, 117103615, 116509786,
+ 115914013, 115316298, 114716645, 114115058, 113511539, 112906090,
+ 112298717, 111689421, 111078206, 110465076, 109850033, 109233081,
+ 108614223, 107993462, 107370803, 106746248, 106119800, 105491463,
+ 104861241, 104229138, 103595155, 102959298, 102321569, 101681973,
+ 101040512, 100397191, 99752013, 99104981, 98456100, 97805373, 97152804,
+ 96498396, 95842153, 95184080, 94524179, 93862456, 93198912, 92533554,
+ 91866383, 91197405, 90526623, 89854041, 89179663, 88503494, 87825537,
+ 87145795, 86464275, 85780978, 85095911, 84409075, 83720477, 83030120,
+ 82338007, 81644145, 80948536, 80251184, 79552096, 78851273, 78148722,
+ 77444445, 76738449, 76030736, 75321312, 74610181, 73897346, 73182814,
+ 72466588, 71748673, 71029074, 70307794, 69584839, 68860213, 68133921,
+ 67405967, 66676357, 65945094, 65212184, 64477631, 63741440, 63003617,
+ 62264164, 61523089, 60780395, 60036086, 59290169, 58542648, 57793528,
+ 57042814, 56290511, 55536624, 54781158, 54024117, 53265508, 52505334,
+ 51743602, 50980317, 50215482, 49449105, 48681189, 47911740, 47140764,
+ 46368265, 45594249, 44818721, 44041686, 43263150, 42483118, 41701596,
+ 40918588, 40134101, 39348140, 38560710, 37771816, 36981465, 36189661,
+ 35396411, 34601719, 33805592, 33008035, 32209053, 31408653, 30606839,
+ 29803618, 28998996, 28192978, 27385569, 26576776, 25766604, 24955060,
+ 24142148, 23327876, 22512248, 21695271, 20876950, 20057292, 19236302,
+ 18413986, 17590351, 16765402, 15939146, 15111588, 14282735, 13452592,
+ 12621166, 11788463, 10954488, 10119249, 9282752, 8445002, 7606006,
+ 6765770, 5924300, 5081603, 4237684, 3392552, 2546210, 1698667, 849928,
+ 0, -851111, -1703398, -2556855, -3411476, -4267254, -5124182, -5982254,
+ -6841463, -7701803, -8563267, -9425848, -10289541, -11154337,
+ -12020232, -12887217, -13755286, -14624432, -15494649, -16365930,
+ -17238268, -18111657, -18986089, -19861557, -20738055, -21615576,
+ -22494114, -23373660, -24254208, -25135751, -26018283, -26901796,
+ -27786283, -28671737, -29558151, -30445519, -31333832, -32223084,
+ -33113268, -34004377, -34896403, -35789340, -36683179, -37577914,
+ -38473539, -39370044, -40267424, -41165670, -42064777, -42964735,
+ -43865538, -44767179, -45669651, -46572945, -47477054, -48381972,
+ -49287690, -50194201, -51101498, -52009574, -52918420, -53828029,
+ -54738393, -55649506, -56561359, -57473945, -58387257, -59301286,
+ -60216025, -61131467, -62047603, -62964426, -63881929, -64800103,
+ -65718941, -66638435, -67558578, -68479361, -69400776, -70322817,
+ -71245475, -72168742, -73092610, -74017072, -74942119, -75867744,
+ -76793939, -77720695, -78648005, -79575861, -80504255, -81433179,
+ -82362624, -83292584, -84223048, -85154011, -86085463, -87017396,
+ -87949803, -88882675, -89816004, -90749782, -91684000, -92618651,
+ -93553726, -94489218, -95425117, -96361415, -97298105, -98235178,
+ -99172625, -100110439, -101048611, -101987132, -102925995, -103865191,
+ -104804712, -105744548, -106684693, -107625137, -108565871, -109506888,
+ -110448179, -111389736, -112331549, -113273611, -114215913, -115158447,
+ -116101203, -117044174, -117987350, -118930723, -119874285, -120818027,
+ -121761940, -122706015, -123650245, -124594619, -125539131, -126483770,
+ -127428528, -128373397, -129318368, -130263431, -131208579, -132153802,
+ -133099091, -134044439, -134989835, -135935272, -136880740, -137826230,
+ -138771734, -139717243, -140662748, -141608239, -142553709, -143499147,
+ -144444546, -145389896, -146335189, -147280414, -148225564, -149170629,
+ -150115601, -151060470, -152005227, -152949863, -153894370, -154838737,
+ -155782957, -156727019, -157670916, -158614637, -159558173, -160501517,
+ -161444657, -162387586, -163330294, -164272771, -165215010, -166156999,
+ -167098731, -168040197, -168981386, -169922289, -170862898, -171803203,
+ -172743195, -173682864, -174622202, -175561199, -176499845, -177438132,
+ -178376050, -179313590, -180250742, -181187497, -182123845, -183059778,
+ -183995286, -184930359, -185864989, -186799165, -187732879, -188666120,
+ -189598880, -190531149, -191462917, -192394176, -193324915, -194255125,
+ -195184797, -196113922, -197042488, -197970489, -198897912, -199824750,
+ -200750993, -201676630, -202601653, -203526052, -204449817, -205372939,
+ -206295409, -207217216, -208138351, -209058805, -209978567, -210897629,
+ -211815980, -212733611, -213650513, -214566675, -215482088, -216396743,
+ -217310630, -218223738, -219136059, -220047583, -220958299, -221868199,
+ -222777273, -223685510, -224592902, -225499438, -226405109, -227309904,
+ -228213815, -229116832, -230018944, -230920143, -231820417, -232719759,
+ -233618157, -234515601, -235412083, -236307593, -237202120, -238095654,
+ -238988187, -239879708, -240770207, -241659675, -242548102, -243435477,
+ -244321791, -245207035, -246091198, -246974271, -247856243, -248737106,
+ -249616848, -250495460, -251372933, -252249256, -253124420, -253998414,
+ -254871229, -255742855, -256613282, -257482501, -258350500, -259217271,
+ -260082803, -260947087, -261810112, -262671870, -263532349, -264391540,
+ -265249433, -266106018, -266961285, -267815225, -268667826, -269519081,
+ -270368977, -271217507, -272064659, -272910423, -273754791, -274597751,
+ -275439294, -276279410, -277118089, -277955321, -278791096, -279625404,
+ -280458235, -281289580, -282119428, -282947769, -283774594, -284599892,
+ -285423654, -286245869, -287066528, -287885620, -288703136, -289519066,
+ -290333400, -291146127, -291957238, -292766724, -293574573, -294380776,
+ -295185323, -295988204, -296789409, -297588928, -298386752, -299182870,
+ -299977272, -300769949, -301560889, -302350085, -303137524, -303923199,
+ -304707098, -305489211, -306269530, -307048043, -307824741, -308599613,
+ -309372651, -310143844, -310913182, -311680655, -312446253, -313209966,
+ -313971785, -314731699, -315489699, -316245774, -316999915, -317752112,
+ -318502355, -319250633, -319996938, -320741258, -321483585, -322223908,
+ -322962218, -323698504, -324432757, -325164967, -325895123, -326623217,
+ -327349238, -328073176, -328795021, -329514764, -330232395, -330947903,
+ -331661280, -332372514, -333081597, -333788518, -334493268, -335195837,
+ -335896215, -336594392, -337290358, -337984104, -338675620, -339364895,
+ -340051921, -340736687, -341419183, -342099400, -342777329, -343452958,
+ -344126280, -344797282, -345465957, -346132294, -346796284, -347457916,
+ -348117182, -348774071, -349428573, -350080679, -350730380, -351377665,
+ -352022525, -352664950, -353304930, -353942456, -354577519, -355210108,
+ -355840214, -356467827, -357092937, -357715536, -358335613, -358953158,
+ -359568163, -360180618, -360790512, -361397837, -362002582, -362604739,
+ -363204297, -363801248, -364395581, -364987287, -365576357, -366162781,
+ -366746550, -367327653, -367906083, -368481828, -369054880, -369625229,
+ -370192866, -370757781, -371319965, -371879408, -372436102, -372990036,
+ -373541201, -374089588, -374635188, -375177990, -375717987, -376255168,
+ -376789524, -377321045, -377849723, -378375549, -378898512, -379418604,
+ -379935815, -380450136, -380961558, -381470071, -381975667, -382478336,
+ -382978069, -383474856, -383968689, -384459559, -384947455, -385432370,
+ -385914294, -386393217, -386869131, -387342027, -387811895, -388278727,
+ -388742512, -389203244, -389660911, -390115506, -390567019, -391015441,
+ -391460763, -391902977, -392342073, -392778042, -393210876, -393640565,
+ -394067100, -394490474, -394910676, -395327698, -395741531, -396152166,
+ -396559594, -396963807, -397364796, -397762552, -398157066, -398548329,
+ -398936333, -399321069, -399702528, -400080701, -400455581, -400827157,
+ -401195422, -401560367, -401921983, -402280261, -402635194, -402986771,
+ -403334986, -403679829, -404021291, -404359365, -404694041, -405025311,
+ -405353167, -405677601, -405998603, -406316165, -406630279, -406940937,
+ -407248130, -407551850, -407852088, -408148836, -408442085, -408731829,
+ -409018057, -409300762, -409579936, -409855570, -410127656, -410396186,
+ -410661152, -410922546, -411180359, -411434583, -411685211, -411932233,
+ -412175643, -412415431, -412651590, -412884112, -413112989, -413338213,
+ -413559775, -413777669, -413991885, -414202417, -414409255, -414612393,
+ -414811822, -415007535, -415199523, -415387779, -415572295, -415753064,
+ -415930077, -416103326, -416272805, -416438506, -416600420, -416758540,
+ -416912858, -417063367, -417210059, -417352927, -417491963, -417627159,
+ -417758509, -417886003, -418009636, -418129399, -418245286, -418357287,
+ -418465397, -418569608, -418669913, -418766303, -418858772, -418947313,
+ -419031918, -419112580, -419189292, -419262046, -419330835, -419395653,
+ -419456491, -419513344, -419566203, -419615061, -419659912, -419700749,
+ -419737564, -419770351, -419799102, -419823811, -419844470, -419861073,
+ -419873612, -419882082, -419886474, -419886783, -419883001, -419875121,
+ -419863138, -419847044, -419826832, -419802495, -419774028, -419741423,
+ -419704674, -419663774, -419618716, -419569494, -419516102, -419458533,
+ -419396780, -419330837, -419260698, -419186356, -419107804, -419025037,
+ -418938048, -418846831, -418751379, -418651686, -418547746, -418439552,
+ -418327099, -418210380, -418089389, -417964121, -417834568, -417700724,
+ -417562585, -417420143, -417273392, -417122328, -416966943, -416807232,
+ -416643188, -416474807, -416302082, -416125007, -415943576, -415757784,
+ -415567625, -415373093, -415174183, -414970888, -414763204, -414551124,
+ -414334643, -414113755, -413888455, -413658738, -413424597, -413186027,
+ -412943023, -412695579, -412443691, -412187351, -411926557, -411661301,
+ -411391578, -411117384, -410838714, -410555561, -410267921, -409975788,
+ -409679158, -409378025, -409072384, -408762231, -408447559, -408128365,
+ -407804643, -407476389, -407143596, -406806261, -406464379, -406117944,
+ -405766953, -405411399, -405051279, -404686587, -404317320, -403943472,
+ -403565038, -403182015, -402794397, -402402180, -402005359, -401603930,
+ -401197889, -400787230, -400371950, -399952044, -399527508, -399098338,
+ -398664529, -398226076, -397782976, -397335225, -396882818, -396425751,
+ -395964020, -395497621, -395026549, -394550802, -394070374, -393585262,
+ -393095461, -392600969, -392101780, -391597892, -391089299, -390576000,
+ -390057988, -389535262, -389007817, -388475650, -387938756, -387397133,
+ -386850776, -386299683, -385743848, -385183270, -384617945, -384047868,
+ -383473037, -382893449, -382309099, -381719985, -381126103, -380527450,
+ -379924023, -379315818, -378702833, -378085064, -377462509, -376835163,
+ -376203024, -375566089, -374924355, -374277819, -373626479, -372970330,
+ -372309371, -371643598, -370973009, -370297600, -369617370, -368932315,
+ -368242433, -367547721, -366848177, -366143797, -365434580, -364720522,
+ -364001622, -363277877, -362549284, -361815841, -361077546, -360334396,
+ -359586389, -358833523, -358075795, -357313204, -356545746, -355773421,
+ -354996225, -354214158, -353427216, -352635397, -351838701, -351037124,
+ -350230665, -349419322, -348603093, -347781977, -346955971, -346125073,
+ -345289283, -344448598, -343603017, -342752538, -341897159, -341036879,
+ -340171697, -339301610, -338426618, -337546719, -336661911, -335772194,
+ -334877565, -333978025, -333073570, -332164201, -331249915, -330330712,
+ -329406591, -328477550, -327543589, -326604706, -325660900, -324712171,
+ -323758517, -322799938, -321836433, -320868001, -319894640, -318916351,
+ -317933133, -316944985, -315951905, -314953895, -313950952, -312943077,
+ -311930269, -310912527, -309889851, -308862241, -307829696, -306792215,
+ -305749799, -304702448, -303650160, -302592936, -301530775, -300463677,
+ -299391643, -298314672, -297232764, -296145919, -295054137, -293957418,
+ -292855762, -291749170, -290637641, -289521175, -288399774, -287273436,
+ -286142163, -285005955, -283864811, -282718733, -281567721, -280411776,
+ -279250897, -278085085, -276914342, -275738667, -274558061, -273372525,
+ -272182059, -270986665, -269786343, -268581093, -267370917, -266155816,
+ -264935790, -263710841, -262480969, -261246175, -260006461, -258761828,
+ -257512275, -256257806, -254998421, -253734121, -252464907, -251190781,
+ -249911745, -248627798, -247338944, -246045183, -244746516, -243442946,
+ -242134474, -240821100, -239502828, -238179659, -236851593, -235518634,
+ -234180783, -232838041, -231490410, -230137892, -228780490, -227418205,
+ -226051038, -224678993, -223302070, -221920273, -220533602, -219142061,
+ -217745652, -216344376, -214938236, -213527234, -212111372, -210690654,
+ -209265080, -207834654, -206399379, -204959256, -203514288, -202064477,
+ -200609827, -199150340, -197686018, -196216864, -194742882, -193264073,
+ -191780440, -190291987, -188798717, -187300631, -185797733, -184290027,
+ -182777515, -181260199, -179738085, -178211173, -176679468, -175142972,
+ -173601690, -172055624, -170504777, -168949153, -167388755, -165823587,
+ -164253652, -162678954, -161099495, -159515280, -157926313, -156332596,
+ -154734133, -153130929, -151522986, -149910309, -148292902, -146670768,
+ -145043910, -143412334, -141776043, -140135041, -138489331, -136838919,
+ -135183807, -133524001, -131859504, -130190320, -128516454, -126837910,
+ -125154692, -123466805, -121774253, -120077040, -118375170, -116668649,
+ -114957481, -113241670, -111521220, -109796137, -108066425, -106332089,
+ -104593133, -102849562, -101101382, -99348596, -97591209, -95829227,
+ -94062655, -92291497, -90515758, -88735444, -86950559, -85161109,
+ -83367098, -81568532, -79765416, -77957756, -76145556, -74328822,
+ -72507559, -70681773, -68851468, -67016651, -65177327, -63333502,
+ -61485180, -59632368, -57775071, -55913295, -54047045, -52176328,
+ -50301149, -48421513, -46537427, -44648897, -42755927, -40858526,
+ -38956697, -37050448, -35139784, -33224711, -31305236, -29381364,
+ -27453102, -25520456, -23583433, -21642037, -19696277, -17746158,
+ -15791686, -13832868, -11869711, -9902220, -7930403, -5954266,
+ -3973815, -1989057, 0, 1993351, 3990989, 5992908, 7999099, 10009557,
+ 12024275, 14043245, 16066462, 18093917, 20125604, 22161515, 24201645,
+ 26245985, 28294529, 30347269, 32404199, 34465310, 36530596, 38600050,
+ 40673664, 42751430, 44833342, 46919392, 49009572, 51103875, 53202294,
+ 55304821, 57411447, 59522167, 61636972, 63755854, 65878805, 68005819,
+ 70136886, 72272000, 74411152, 76554335, 78701540, 80852759, 83007986,
+ 85167211, 87330427, 89497625, 91668797, 93843936, 96023032, 98206079,
+ 100393067, 102583988, 104778834, 106977597, 109180268, 111386839,
+ 113597301, 115811647, 118029866, 120251952, 122477895, 124707686,
+ 126941318, 129178781, 131420066, 133665166, 135914071, 138166772,
+ 140423261, 142683529, 144947566, 147215364, 149486915, 151762208,
+ 154041235, 156323988, 158610456, 160900631, 163194503, 165492064,
+ 167793304, 170098214, 172406785, 174719008, 177034872, 179354369,
+ 181677490, 184004225, 186334564, 188668498, 191006017, 193347113,
+ 195691775, 198039994, 200391760, 202747064, 205105895, 207468245,
+ 209834102, 212203459, 214576304, 216952628, 219332421, 221715674,
+ 224102375, 226492516, 228886086, 231283075, 233683473, 236087271,
+ 238494457, 240905023, 243318957, 245736249, 248156890, 250580868,
+ 253008175, 255438798, 257872729, 260309957, 262750470, 265194260,
+ 267641315, 270091624, 272545178, 275001966, 277461978, 279925201,
+ 282391627, 284861244, 287334042, 289810010, 292289136, 294771412,
+ 297256824, 299745364, 302237020, 304731780, 307229635, 309730572,
+ 312234582, 314741654, 317251775, 319764936, 322281124, 324800329,
+ 327322541, 329847747, 332375936, 334907097, 337441220, 339978292,
+ 342518303, 345061240, 347607094, 350155852, 352707502, 355262035,
+ 357819437, 360379698, 362942806, 365508749, 368077516, 370649096,
+ 373223477, 375800646, 378380593, 380963306, 383548773, 386136982,
+ 388727921, 391321579, 393917945, 396517005, 399118748, 401723162,
+ 404330236, 406939958, 409552314, 412167294, 414784886, 417405076,
+ 420027854, 422653207, 425281123, 427911590, 430544596, 433180128,
+ 435818174, 438458723, 441101761, 443747277, 446395257, 449045691,
+ 451698565, 454353867, 457011584, 459671705, 462334217, 464999106,
+ 467666362, 470335970, 473007919, 475682196, 478358789, 481037684,
+ 483718870, 486402333, 489088061, 491776040, 494466260, 497158705,
+ 499853365, 502550225, 505249274, 507950497, 510653883, 513359419,
+ 516067091, 518776887, 521488793, 524202797, 526918886, 529637047,
+ 532357266, 535079530, 537803827, 540530143, 543258465, 545988781,
+ 548721076, 551455337, 554191552, 556929708, 559669790, 562411785,
+ 565155681, 567901464, 570649121, 573398637, 576150001, 578903198,
+ 581658215, 584415039, 587173656, 589934052, 592696215, 595460130,
+ 598225784, 600993163, 603762255, 606533045, 609305519, 612079664,
+ 614855467, 617632914, 620411990, 623192683, 625974978, 628758862,
+ 631544321, 634331341, 637119908, 639910009, 642701630, 645494757,
+ 648289375, 651085472, 653883033, 656682043, 659482491, 662284360,
+ 665087638, 667892309, 670698362, 673505780, 676314550, 679124659,
+ 681936091, 684748834, 687562872, 690378191, 693194778, 696012619,
+ 698831698, 701652002, 704473517, 707296228, 710120121, 712945183,
+ 715771397, 718598751, 721427230, 724256820, 727087505, 729919273,
+ 732752108, 735585996, 738420923, 741256874, 744093835, 746931791,
+ 749770728, 752610632, 755451487, 758293280, 761135996, 763979620,
+ 766824137, 769669534, 772515796, 775362907, 778210854, 781059622,
+ 783909195, 786759561, 789610703, 792462607, 795315258, 798168642,
+ 801022745, 803877550, 806733044, 809589212, 812446038, 815303509,
+ 818161610, 821020325, 823879639, 826739539, 829600009, 832461034,
+ 835322599, 838184690, 841047292, 843910389, 846773967, 849638011,
+ 852502506, 855367437, 858232788, 861098546, 863964696, 866831221,
+ 869698107, 872565339, 875432903, 878300782, 881168963, 884037429,
+ 886906166, 889775160, 892644394, 895513853, 898383523, 901253389,
+ 904123434, 906993645, 909864006, 912734502, 915605118, 918475838,
+ 921346648, 924217532, 927088475, 929959462, 932830478, 935701506,
+ 938572534, 941443544, 944314522, 947185452, 950056319, 952927109,
+ 955797805, 958668393, 961538857, 964409182, 967279352, 970149352,
+ 973019168, 975888783, 978758182, 981627351, 984496273, 987364933,
+ 990233316, 993101407, 995969190, 998836650, 1001703771, 1004570539,
+ 1007436937, 1010302950, 1013168564, 1016033762, 1018898529, 1021762849,
+ 1024626709, 1027490091, 1030352980, 1033215361, 1036077219, 1038938538,
+ 1041799303, 1044659498, 1047519108, 1050378117, 1053236511, 1056094272,
+ 1058951387, 1061807839, 1064663612, 1067518693, 1070373065, 1073226712,
+ 1076079619, 1078931771, 1081783151, 1084633746, 1087483539, 1090332514,
+ 1093180656, 1096027950, 1098874380, 1101719930, 1104564586, 1107408331,
+ 1110251150, 1113093028, 1115933949, 1118773897, 1121612857, 1124450814,
+ 1127287751, 1130123654, 1132958507, 1135792294, 1138625000, 1141456610,
+ 1144287107, 1147116476, 1149944702, 1152771769, 1155597662, 1158422365,
+ 1161245863, 1164068139, 1166889179, 1169708968, 1172527488, 1175344726,
+ 1178160665, 1180975290, 1183788586, 1186600536, 1189411126, 1192220340,
+ 1195028162, 1197834577, 1200639569, 1203443123, 1206245223, 1209045854,
+ 1211845000, 1214642646, 1217438776, 1220233375, 1223026428, 1225817918,
+ 1228607830, 1231396150, 1234182860, 1236967947, 1239751393, 1242533185,
+ 1245313306, 1248091742, 1250868475, 1253643492, 1256416776, 1259188313,
+ 1261958086, 1264726080, 1267492280, 1270256671, 1273019236, 1275779961,
+ 1278538831, 1281295828, 1284050940, 1286804149, 1289555440, 1292304799,
+ 1295052209, 1297797656, 1300541123, 1303282596, 1306022060, 1308759498,
+ 1311494895, 1314228237, 1316959508, 1319688692, 1322415774, 1325140739,
+ 1327863572, 1330584256, 1333302778, 1336019121, 1338733271, 1341445211,
+ 1344154928, 1346862404, 1349567627, 1352270579, 1354971246, 1357669612,
+ 1360365663, 1363059382, 1365750756, 1368439768, 1371126404, 1373810648,
+ 1376492485, 1379171901, 1381848879, 1384523404, 1387195462, 1389865038,
+ 1392532116, 1395196681, 1397858718, 1400518212, 1403175148, 1405829511,
+ 1408481285, 1411130456, 1413777009, 1416420929, 1419062200, 1421700808,
+ 1424336737, 1426969973, 1429600501, 1432228305, 1434853371, 1437475684,
+ 1440095228, 1442711990, 1445325953, 1447937104, 1450545427, 1453150907,
+ 1455753530, 1458353281, 1460950144, 1463544105, 1466135149, 1468723262,
+ 1471308429, 1473890634, 1476469863, 1479046101, 1481619334, 1484189547,
+ 1486756725, 1489320854, 1491881918, 1494439903, 1496994794, 1499546578,
+ 1502095238, 1504640761, 1507183132, 1509722336, 1512258360, 1514791187,
+ 1517320804, 1519847196, 1522370348, 1524890247, 1527406877, 1529920225,
+ 1532430275, 1534937014, 1537440426, 1539940498, 1542437215, 1544930562,
+ 1547420526, 1549907092, 1552390245, 1554869972, 1557346257, 1559819088,
+ 1562288449, 1564754326, 1567216705, 1569675572, 1572130912, 1574582712,
+ 1577030957, 1579475633, 1581916726, 1584354222, 1586788106, 1589218366,
+ 1591644985, 1594067952, 1596487251, 1598902868, 1601314790, 1603723003,
+ 1606127492, 1608528243, 1610925244, 1613318479, 1615707936, 1618093599,
+ 1620475456, 1622853492, 1625227694, 1627598048, 1629964539, 1632327156,
+ 1634685882, 1637040706, 1639391613, 1641738589, 1644081622, 1646420696,
+ 1648755800, 1651086918, 1653414038, 1655737146, 1658056228, 1660371271,
+ 1662682262, 1664989187, 1667292032, 1669590784, 1671885430, 1674175956,
+ 1676462350, 1678744597, 1681022684, 1683296598, 1685566326, 1687831854,
+ 1690093170, 1692350260, 1694603110, 1696851709, 1699096042, 1701336096,
+ 1703571858, 1705803316, 1708030456, 1710253265, 1712471731, 1714685839,
+ 1716895578, 1719100934, 1721301894, 1723498446, 1725690576, 1727878272,
+ 1730061521, 1732240310, 1734414627, 1736584458, 1738749790, 1740910612,
+ 1743066911, 1745218673, 1747365887, 1749508539, 1751646617, 1753780108,
+ 1755909000, 1758033281, 1760152938, 1762267958, 1764378329, 1766484039,
+ 1768585075, 1770681424, 1772773076, 1774860016, 1776942233, 1779019715,
+ 1781092450, 1783160425, 1785223627, 1787282046, 1789335668, 1791384482,
+ 1793428476, 1795467637, 1797501954, 1799531414, 1801556006, 1803575717,
+ 1805590536, 1807600451, 1809605450, 1811605521, 1813600652, 1815590832,
+ 1817576048, 1819556289, 1821531544, 1823501800, 1825467047, 1827427272,
+ 1829382463, 1831332610, 1833277700, 1835217723, 1837152667, 1839082519,
+ 1841007270, 1842926907, 1844841419, 1846750795, 1848655023, 1850554092,
+ 1852447992, 1854336710, 1856220236, 1858098558, 1859971665, 1861839546,
+ 1863702190, 1865559587, 1867411724, 1869258591, 1871100178, 1872936472,
+ 1874767464, 1876593142, 1878413495, 1880228513, 1882038186, 1883842501,
+ 1885641449, 1887435018, 1889223199, 1891005980, 1892783351, 1894555301,
+ 1896321820, 1898082898, 1899838523, 1901588686, 1903333375, 1905072582,
+ 1906806294, 1908534502, 1910257196, 1911974366, 1913686000, 1915392090,
+ 1917092624, 1918787593, 1920476987, 1922160795, 1923839008, 1925511615,
+ 1927178607, 1928839973, 1930495704, 1932145790, 1933790221, 1935428987,
+ 1937062078, 1938689486, 1940311199, 1941927208, 1943537504, 1945142077,
+ 1946740917, 1948334016, 1949921363, 1951502948, 1953078764, 1954648799,
+ 1956213045, 1957771492, 1959324131, 1960870953, 1962411949, 1963947109,
+ 1965476424, 1966999885, 1968517483, 1970029209, 1971535053, 1973035008,
+ 1974529063, 1976017210, 1977499440, 1978975744, 1980446113, 1981910538,
+ 1983369012, 1984821524, 1986268067, 1987708631, 1989143208, 1990571790,
+ 1991994367, 1993410932, 1994821475, 1996225989, 1997624465, 1999016895,
+ 2000403269, 2001783581, 2003157821, 2004525982, 2005888055, 2007244032,
+ 2008593904, 2009937665, 2011275306, 2012606818, 2013932194, 2015251425,
+ 2016564505, 2017871425, 2019172176, 2020466752, 2021755145, 2023037347,
+ 2024313349, 2025583145, 2026846727, 2028104088, 2029355219, 2030600113,
+ 2031838763, 2033071161, 2034297301, 2035517173, 2036730772, 2037938090,
+ 2039139119, 2040333853, 2041522284, 2042704405, 2043880210, 2045049690,
+ 2046212839, 2047369650, 2048520115, 2049664229, 2050801984, 2051933373,
+ 2053058390, 2054177028, 2055289279, 2056395138, 2057494597, 2058587651,
+ 2059674291, 2060754513, 2061828309, 2062895673, 2063956599, 2065011080,
+ 2066059109, 2067100681, 2068135789, 2069164427, 2070186589, 2071202268,
+ 2072211459, 2073214155, 2074210351, 2075200040, 2076183216, 2077159874,
+ 2078130008, 2079093611, 2080050678, 2081001203, 2081945181, 2082882605,
+ 2083813470, 2084737771, 2085655502, 2086566657, 2087471231, 2088369219,
+ 2089260614, 2090145412, 2091023607, 2091895195, 2092760169, 2093618524,
+ 2094470256, 2095315359, 2096153828, 2096985658, 2097810844, 2098629381,
+ 2099441264, 2100246488, 2101045049, 2101836941, 2102622160, 2103400701,
+ 2104172559, 2104937730, 2105696208, 2106447991, 2107193072, 2107931447,
+ 2108663112, 2109388063, 2110106295, 2110817803, 2111522584, 2112220634,
+ 2112911947, 2113596520, 2114274349, 2114945429, 2115609757, 2116267329,
+ 2116918140, 2117562186, 2118199465, 2118829971, 2119453701, 2120070652,
+ 2120680819, 2121284199, 2121880788, 2122470582, 2123053579, 2123629775,
+ 2124199165, 2124761747, 2125317517, 2125866472, 2126408608, 2126943923,
+ 2127472413, 2127994074, 2128508904, 2129016900, 2129518058, 2130012376,
+ 2130499850, 2130980477, 2131454255, 2131921181, 2132381251, 2132834464,
+ 2133280816, 2133720305, 2134152928, 2134578682, 2134997565, 2135409574,
+ 2135814707, 2136212961, 2136604334, 2136988824, 2137366428, 2137737144,
+ 2138100969, 2138457902, 2138807941, 2139151082, 2139487325, 2139816667,
+ 2140139106, 2140454640, 2140763267, 2141064986, 2141359794, 2141647690,
+ 2141928672, 2142202738, 2142469887, 2142730117, 2142983427, 2143229814,
+ 2143469278, 2143701817, 2143927429, 2144146114, 2144357869, 2144562694,
+ 2144760588, 2144951548, 2145135575, 2145312666, 2145482822, 2145646040,
+ 2145802320, 2145951661, 2146094061, 2146229521, 2146358039, 2146479615,
+ 2146594247, 2146701936, 2146802680, 2146896478, 2146983331, 2147063238,
+ 2147136198, 2147202210, 2147261275, 2147313392, 2147358561, 2147396781,
+ 2147428052, 2147452375, 2147469748, 2147480172, 2147483647, 2147480172,
+ 2147469748, 2147452375, 2147428052, 2147396781, 2147358561, 2147313392,
+ 2147261275, 2147202210, 2147136198, 2147063238, 2146983331, 2146896478,
+ 2146802680, 2146701936, 2146594247, 2146479615, 2146358039, 2146229521,
+ 2146094061, 2145951661, 2145802320, 2145646040, 2145482822, 2145312666,
+ 2145135575, 2144951548, 2144760588, 2144562694, 2144357869, 2144146114,
+ 2143927429, 2143701817, 2143469278, 2143229814, 2142983427, 2142730117,
+ 2142469887, 2142202738, 2141928672, 2141647690, 2141359794, 2141064986,
+ 2140763267, 2140454640, 2140139106, 2139816667, 2139487325, 2139151082,
+ 2138807941, 2138457902, 2138100969, 2137737144, 2137366428, 2136988824,
+ 2136604334, 2136212961, 2135814707, 2135409574, 2134997565, 2134578682,
+ 2134152928, 2133720305, 2133280816, 2132834464, 2132381251, 2131921181,
+ 2131454255, 2130980477, 2130499850, 2130012376, 2129518058, 2129016900,
+ 2128508904, 2127994074, 2127472413, 2126943923, 2126408608, 2125866472,
+ 2125317517, 2124761747, 2124199165, 2123629775, 2123053579, 2122470582,
+ 2121880788, 2121284199, 2120680819, 2120070652, 2119453701, 2118829971,
+ 2118199465, 2117562186, 2116918140, 2116267329, 2115609757, 2114945429,
+ 2114274349, 2113596520, 2112911947, 2112220634, 2111522584, 2110817803,
+ 2110106295, 2109388063, 2108663112, 2107931447, 2107193072, 2106447991,
+ 2105696208, 2104937730, 2104172559, 2103400701, 2102622160, 2101836941,
+ 2101045049, 2100246488, 2099441264, 2098629381, 2097810844, 2096985658,
+ 2096153828, 2095315359, 2094470256, 2093618524, 2092760169, 2091895195,
+ 2091023607, 2090145412, 2089260614, 2088369219, 2087471231, 2086566657,
+ 2085655502, 2084737771, 2083813470, 2082882605, 2081945181, 2081001203,
+ 2080050678, 2079093611, 2078130008, 2077159874, 2076183216, 2075200040,
+ 2074210351, 2073214155, 2072211459, 2071202268, 2070186589, 2069164427,
+ 2068135789, 2067100681, 2066059109, 2065011080, 2063956599, 2062895673,
+ 2061828309, 2060754513, 2059674291, 2058587651, 2057494597, 2056395138,
+ 2055289279, 2054177028, 2053058390, 2051933373, 2050801984, 2049664229,
+ 2048520115, 2047369650, 2046212839, 2045049690, 2043880210, 2042704405,
+ 2041522284, 2040333853, 2039139119, 2037938090, 2036730772, 2035517173,
+ 2034297301, 2033071161, 2031838763, 2030600113, 2029355219, 2028104088,
+ 2026846727, 2025583145, 2024313349, 2023037347, 2021755145, 2020466752,
+ 2019172176, 2017871425, 2016564505, 2015251425, 2013932194, 2012606818,
+ 2011275306, 2009937665, 2008593904, 2007244032, 2005888055, 2004525982,
+ 2003157821, 2001783581, 2000403269, 1999016895, 1997624465, 1996225989,
+ 1994821475, 1993410932, 1991994367, 1990571790, 1989143208, 1987708631,
+ 1986268067, 1984821524, 1983369012, 1981910538, 1980446113, 1978975744,
+ 1977499440, 1976017210, 1974529063, 1973035008, 1971535053, 1970029209,
+ 1968517483, 1966999885, 1965476424, 1963947109, 1962411949, 1960870953,
+ 1959324131, 1957771492, 1956213045, 1954648799, 1953078764, 1951502948,
+ 1949921363, 1948334016, 1946740917, 1945142077, 1943537504, 1941927208,
+ 1940311199, 1938689486, 1937062078, 1935428987, 1933790221, 1932145790,
+ 1930495704, 1928839973, 1927178607, 1925511615, 1923839008, 1922160795,
+ 1920476987, 1918787593, 1917092624, 1915392090, 1913686000, 1911974366,
+ 1910257196, 1908534502, 1906806294, 1905072582, 1903333375, 1901588686,
+ 1899838523, 1898082898, 1896321820, 1894555301, 1892783351, 1891005980,
+ 1889223199, 1887435018, 1885641449, 1883842501, 1882038186, 1880228513,
+ 1878413495, 1876593142, 1874767464, 1872936472, 1871100178, 1869258591,
+ 1867411724, 1865559587, 1863702190, 1861839546, 1859971665, 1858098558,
+ 1856220236, 1854336710, 1852447992, 1850554092, 1848655023, 1846750795,
+ 1844841419, 1842926907, 1841007270, 1839082519, 1837152667, 1835217723,
+ 1833277700, 1831332610, 1829382463, 1827427272, 1825467047, 1823501800,
+ 1821531544, 1819556289, 1817576048, 1815590832, 1813600652, 1811605521,
+ 1809605450, 1807600451, 1805590536, 1803575717, 1801556006, 1799531414,
+ 1797501954, 1795467637, 1793428476, 1791384482, 1789335668, 1787282046,
+ 1785223627, 1783160425, 1781092450, 1779019715, 1776942233, 1774860016,
+ 1772773076, 1770681424, 1768585075, 1766484039, 1764378329, 1762267958,
+ 1760152938, 1758033281, 1755909000, 1753780108, 1751646617, 1749508539,
+ 1747365887, 1745218673, 1743066911, 1740910612, 1738749790, 1736584458,
+ 1734414627, 1732240310, 1730061521, 1727878272, 1725690576, 1723498446,
+ 1721301894, 1719100934, 1716895578, 1714685839, 1712471731, 1710253265,
+ 1708030456, 1705803316, 1703571858, 1701336096, 1699096042, 1696851709,
+ 1694603110, 1692350260, 1690093170, 1687831854, 1685566326, 1683296598,
+ 1681022684, 1678744597, 1676462350, 1674175956, 1671885430, 1669590784,
+ 1667292032, 1664989187, 1662682262, 1660371271, 1658056228, 1655737146,
+ 1653414038, 1651086918, 1648755800, 1646420696, 1644081622, 1641738589,
+ 1639391613, 1637040706, 1634685882, 1632327156, 1629964539, 1627598048,
+ 1625227694, 1622853492, 1620475456, 1618093599, 1615707936, 1613318479,
+ 1610925244, 1608528243, 1606127492, 1603723003, 1601314790, 1598902868,
+ 1596487251, 1594067952, 1591644985, 1589218366, 1586788106, 1584354222,
+ 1581916726, 1579475633, 1577030957, 1574582712, 1572130912, 1569675572,
+ 1567216705, 1564754326, 1562288449, 1559819088, 1557346257, 1554869972,
+ 1552390245, 1549907092, 1547420526, 1544930562, 1542437215, 1539940498,
+ 1537440426, 1534937014, 1532430275, 1529920225, 1527406877, 1524890247,
+ 1522370348, 1519847196, 1517320804, 1514791187, 1512258360, 1509722336,
+ 1507183132, 1504640761, 1502095238, 1499546578, 1496994794, 1494439903,
+ 1491881918, 1489320854, 1486756725, 1484189547, 1481619334, 1479046101,
+ 1476469863, 1473890634, 1471308429, 1468723262, 1466135149, 1463544105,
+ 1460950144, 1458353281, 1455753530, 1453150907, 1450545427, 1447937104,
+ 1445325953, 1442711990, 1440095228, 1437475684, 1434853371, 1432228305,
+ 1429600501, 1426969973, 1424336737, 1421700808, 1419062200, 1416420929,
+ 1413777009, 1411130456, 1408481285, 1405829511, 1403175148, 1400518212,
+ 1397858718, 1395196681, 1392532116, 1389865038, 1387195462, 1384523404,
+ 1381848879, 1379171901, 1376492485, 1373810648, 1371126404, 1368439768,
+ 1365750756, 1363059382, 1360365663, 1357669612, 1354971246, 1352270579,
+ 1349567627, 1346862404, 1344154928, 1341445211, 1338733271, 1336019121,
+ 1333302778, 1330584256, 1327863572, 1325140739, 1322415774, 1319688692,
+ 1316959508, 1314228237, 1311494895, 1308759498, 1306022060, 1303282596,
+ 1300541123, 1297797656, 1295052209, 1292304799, 1289555440, 1286804149,
+ 1284050940, 1281295828, 1278538831, 1275779961, 1273019236, 1270256671,
+ 1267492280, 1264726080, 1261958086, 1259188313, 1256416776, 1253643492,
+ 1250868475, 1248091742, 1245313306, 1242533185, 1239751393, 1236967947,
+ 1234182860, 1231396150, 1228607830, 1225817918, 1223026428, 1220233375,
+ 1217438776, 1214642646, 1211845000, 1209045854, 1206245223, 1203443123,
+ 1200639569, 1197834577, 1195028162, 1192220340, 1189411126, 1186600536,
+ 1183788586, 1180975290, 1178160665, 1175344726, 1172527488, 1169708968,
+ 1166889179, 1164068139, 1161245863, 1158422365, 1155597662, 1152771769,
+ 1149944702, 1147116476, 1144287107, 1141456610, 1138625000, 1135792294,
+ 1132958507, 1130123654, 1127287751, 1124450814, 1121612857, 1118773897,
+ 1115933949, 1113093028, 1110251150, 1107408331, 1104564586, 1101719930,
+ 1098874380, 1096027950, 1093180656, 1090332514, 1087483539, 1084633746,
+ 1081783151, 1078931771, 1076079619, 1073226712, 1070373065, 1067518693,
+ 1064663612, 1061807839, 1058951387, 1056094272, 1053236511, 1050378117,
+ 1047519108, 1044659498, 1041799303, 1038938538, 1036077219, 1033215361,
+ 1030352980, 1027490091, 1024626709, 1021762849, 1018898529, 1016033762,
+ 1013168564, 1010302950, 1007436937, 1004570539, 1001703771, 998836650,
+ 995969190, 993101407, 990233316, 987364933, 984496273, 981627351,
+ 978758182, 975888783, 973019168, 970149352, 967279352, 964409182,
+ 961538857, 958668393, 955797805, 952927109, 950056319, 947185452,
+ 944314522, 941443544, 938572534, 935701506, 932830478, 929959462,
+ 927088475, 924217532, 921346648, 918475838, 915605118, 912734502,
+ 909864006, 906993645, 904123434, 901253389, 898383523, 895513853,
+ 892644394, 889775160, 886906166, 884037429, 881168963, 878300782,
+ 875432903, 872565339, 869698107, 866831221, 863964696, 861098546,
+ 858232788, 855367437, 852502506, 849638011, 846773967, 843910389,
+ 841047292, 838184690, 835322599, 832461034, 829600009, 826739539,
+ 823879639, 821020325, 818161610, 815303509, 812446038, 809589212,
+ 806733044, 803877550, 801022745, 798168642, 795315258, 792462607,
+ 789610703, 786759561, 783909195, 781059622, 778210854, 775362907,
+ 772515796, 769669534, 766824137, 763979620, 761135996, 758293280,
+ 755451487, 752610632, 749770728, 746931791, 744093835, 741256874,
+ 738420923, 735585996, 732752108, 729919273, 727087505, 724256820,
+ 721427230, 718598751, 715771397, 712945183, 710120121, 707296228,
+ 704473517, 701652002, 698831698, 696012619, 693194778, 690378191,
+ 687562872, 684748834, 681936091, 679124659, 676314550, 673505780,
+ 670698362, 667892309, 665087638, 662284360, 659482491, 656682043,
+ 653883033, 651085472, 648289375, 645494757, 642701630, 639910009,
+ 637119908, 634331341, 631544321, 628758862, 625974978, 623192683,
+ 620411990, 617632914, 614855467, 612079664, 609305519, 606533045,
+ 603762255, 600993163, 598225784, 595460130, 592696215, 589934052,
+ 587173656, 584415039, 581658215, 578903198, 576150001, 573398637,
+ 570649121, 567901464, 565155681, 562411785, 559669790, 556929708,
+ 554191552, 551455337, 548721076, 545988781, 543258465, 540530143,
+ 537803827, 535079530, 532357266, 529637047, 526918886, 524202797,
+ 521488793, 518776887, 516067091, 513359419, 510653883, 507950497,
+ 505249274, 502550225, 499853365, 497158705, 494466260, 491776040,
+ 489088061, 486402333, 483718870, 481037684, 478358789, 475682196,
+ 473007919, 470335970, 467666362, 464999106, 462334217, 459671705,
+ 457011584, 454353867, 451698565, 449045691, 446395257, 443747277,
+ 441101761, 438458723, 435818174, 433180128, 430544596, 427911590,
+ 425281123, 422653207, 420027854, 417405076, 414784886, 412167294,
+ 409552314, 406939958, 404330236, 401723162, 399118748, 396517005,
+ 393917945, 391321579, 388727921, 386136982, 383548773, 380963306,
+ 378380593, 375800646, 373223477, 370649096, 368077516, 365508749,
+ 362942806, 360379698, 357819437, 355262035, 352707502, 350155852,
+ 347607094, 345061240, 342518303, 339978292, 337441220, 334907097,
+ 332375936, 329847747, 327322541, 324800329, 322281124, 319764936,
+ 317251775, 314741654, 312234582, 309730572, 307229635, 304731780,
+ 302237020, 299745364, 297256824, 294771412, 292289136, 289810010,
+ 287334042, 284861244, 282391627, 279925201, 277461978, 275001966,
+ 272545178, 270091624, 267641315, 265194260, 262750470, 260309957,
+ 257872729, 255438798, 253008175, 250580868, 248156890, 245736249,
+ 243318957, 240905023, 238494457, 236087271, 233683473, 231283075,
+ 228886086, 226492516, 224102375, 221715674, 219332421, 216952628,
+ 214576304, 212203459, 209834102, 207468245, 205105895, 202747064,
+ 200391760, 198039994, 195691775, 193347113, 191006017, 188668498,
+ 186334564, 184004225, 181677490, 179354369, 177034872, 174719008,
+ 172406785, 170098214, 167793304, 165492064, 163194503, 160900631,
+ 158610456, 156323988, 154041235, 151762208, 149486915, 147215364,
+ 144947566, 142683529, 140423261, 138166772, 135914071, 133665166,
+ 131420066, 129178781, 126941318, 124707686, 122477895, 120251952,
+ 118029866, 115811647, 113597301, 111386839, 109180268, 106977597,
+ 104778834, 102583988, 100393067, 98206079, 96023032, 93843936,
+ 91668797, 89497625, 87330427, 85167211, 83007986, 80852759, 78701540,
+ 76554335, 74411152, 72272000, 70136886, 68005819, 65878805, 63755854,
+ 61636972, 59522167, 57411447, 55304821, 53202294, 51103875, 49009572,
+ 46919392, 44833342, 42751430, 40673664, 38600050, 36530596, 34465310,
+ 32404199, 30347269, 28294529, 26245985, 24201645, 22161515, 20125604,
+ 18093917, 16066462, 14043245, 12024275, 10009557, 7999099, 5992908,
+ 3990989, 1993351, 0, -1989057, -3973815, -5954266, -7930403, -9902220,
+ -11869711, -13832868, -15791686, -17746158, -19696277, -21642037,
+ -23583433, -25520456, -27453102, -29381364, -31305236, -33224711,
+ -35139784, -37050448, -38956697, -40858526, -42755927, -44648897,
+ -46537427, -48421513, -50301149, -52176328, -54047045, -55913295,
+ -57775071, -59632368, -61485180, -63333502, -65177327, -67016651,
+ -68851468, -70681773, -72507559, -74328822, -76145556, -77957756,
+ -79765416, -81568532, -83367098, -85161109, -86950559, -88735444,
+ -90515758, -92291497, -94062655, -95829227, -97591209, -99348596,
+ -101101382, -102849562, -104593133, -106332089, -108066425, -109796137,
+ -111521220, -113241670, -114957481, -116668649, -118375170, -120077040,
+ -121774253, -123466805, -125154692, -126837910, -128516454, -130190320,
+ -131859504, -133524001, -135183807, -136838919, -138489331, -140135041,
+ -141776043, -143412334, -145043910, -146670768, -148292902, -149910309,
+ -151522986, -153130929, -154734133, -156332596, -157926313, -159515280,
+ -161099495, -162678954, -164253652, -165823587, -167388755, -168949153,
+ -170504777, -172055624, -173601690, -175142972, -176679468, -178211173,
+ -179738085, -181260199, -182777515, -184290027, -185797733, -187300631,
+ -188798717, -190291987, -191780440, -193264073, -194742882, -196216864,
+ -197686018, -199150340, -200609827, -202064477, -203514288, -204959256,
+ -206399379, -207834654, -209265080, -210690654, -212111372, -213527234,
+ -214938236, -216344376, -217745652, -219142061, -220533602, -221920273,
+ -223302070, -224678993, -226051038, -227418205, -228780490, -230137892,
+ -231490410, -232838041, -234180783, -235518634, -236851593, -238179659,
+ -239502828, -240821100, -242134474, -243442946, -244746516, -246045183,
+ -247338944, -248627798, -249911745, -251190781, -252464907, -253734121,
+ -254998421, -256257806, -257512275, -258761828, -260006461, -261246175,
+ -262480969, -263710841, -264935790, -266155816, -267370917, -268581093,
+ -269786343, -270986665, -272182059, -273372525, -274558061, -275738667,
+ -276914342, -278085085, -279250897, -280411776, -281567721, -282718733,
+ -283864811, -285005955, -286142163, -287273436, -288399774, -289521175,
+ -290637641, -291749170, -292855762, -293957418, -295054137, -296145919,
+ -297232764, -298314672, -299391643, -300463677, -301530775, -302592936,
+ -303650160, -304702448, -305749799, -306792215, -307829696, -308862241,
+ -309889851, -310912527, -311930269, -312943077, -313950952, -314953895,
+ -315951905, -316944985, -317933133, -318916351, -319894640, -320868001,
+ -321836433, -322799938, -323758517, -324712171, -325660900, -326604706,
+ -327543589, -328477550, -329406591, -330330712, -331249915, -332164201,
+ -333073570, -333978025, -334877565, -335772194, -336661911, -337546719,
+ -338426618, -339301610, -340171697, -341036879, -341897159, -342752538,
+ -343603017, -344448598, -345289283, -346125073, -346955971, -347781977,
+ -348603093, -349419322, -350230665, -351037124, -351838701, -352635397,
+ -353427216, -354214158, -354996225, -355773421, -356545746, -357313204,
+ -358075795, -358833523, -359586389, -360334396, -361077546, -361815841,
+ -362549284, -363277877, -364001622, -364720522, -365434580, -366143797,
+ -366848177, -367547721, -368242433, -368932315, -369617370, -370297600,
+ -370973009, -371643598, -372309371, -372970330, -373626479, -374277819,
+ -374924355, -375566089, -376203024, -376835163, -377462509, -378085064,
+ -378702833, -379315818, -379924023, -380527450, -381126103, -381719985,
+ -382309099, -382893449, -383473037, -384047868, -384617945, -385183270,
+ -385743848, -386299683, -386850776, -387397133, -387938756, -388475650,
+ -389007817, -389535262, -390057988, -390576000, -391089299, -391597892,
+ -392101780, -392600969, -393095461, -393585262, -394070374, -394550802,
+ -395026549, -395497621, -395964020, -396425751, -396882818, -397335225,
+ -397782976, -398226076, -398664529, -399098338, -399527508, -399952044,
+ -400371950, -400787230, -401197889, -401603930, -402005359, -402402180,
+ -402794397, -403182015, -403565038, -403943472, -404317320, -404686587,
+ -405051279, -405411399, -405766953, -406117944, -406464379, -406806261,
+ -407143596, -407476389, -407804643, -408128365, -408447559, -408762231,
+ -409072384, -409378025, -409679158, -409975788, -410267921, -410555561,
+ -410838714, -411117384, -411391578, -411661301, -411926557, -412187351,
+ -412443691, -412695579, -412943023, -413186027, -413424597, -413658738,
+ -413888455, -414113755, -414334643, -414551124, -414763204, -414970888,
+ -415174183, -415373093, -415567625, -415757784, -415943576, -416125007,
+ -416302082, -416474807, -416643188, -416807232, -416966943, -417122328,
+ -417273392, -417420143, -417562585, -417700724, -417834568, -417964121,
+ -418089389, -418210380, -418327099, -418439552, -418547746, -418651686,
+ -418751379, -418846831, -418938048, -419025037, -419107804, -419186356,
+ -419260698, -419330837, -419396780, -419458533, -419516102, -419569494,
+ -419618716, -419663774, -419704674, -419741423, -419774028, -419802495,
+ -419826832, -419847044, -419863138, -419875121, -419883001, -419886783,
+ -419886474, -419882082, -419873612, -419861073, -419844470, -419823811,
+ -419799102, -419770351, -419737564, -419700749, -419659912, -419615061,
+ -419566203, -419513344, -419456491, -419395653, -419330835, -419262046,
+ -419189292, -419112580, -419031918, -418947313, -418858772, -418766303,
+ -418669913, -418569608, -418465397, -418357287, -418245286, -418129399,
+ -418009636, -417886003, -417758509, -417627159, -417491963, -417352927,
+ -417210059, -417063367, -416912858, -416758540, -416600420, -416438506,
+ -416272805, -416103326, -415930077, -415753064, -415572295, -415387779,
+ -415199523, -415007535, -414811822, -414612393, -414409255, -414202417,
+ -413991885, -413777669, -413559775, -413338213, -413112989, -412884112,
+ -412651590, -412415431, -412175643, -411932233, -411685211, -411434583,
+ -411180359, -410922546, -410661152, -410396186, -410127656, -409855570,
+ -409579936, -409300762, -409018057, -408731829, -408442085, -408148836,
+ -407852088, -407551850, -407248130, -406940937, -406630279, -406316165,
+ -405998603, -405677601, -405353167, -405025311, -404694041, -404359365,
+ -404021291, -403679829, -403334986, -402986771, -402635194, -402280261,
+ -401921983, -401560367, -401195422, -400827157, -400455581, -400080701,
+ -399702528, -399321069, -398936333, -398548329, -398157066, -397762552,
+ -397364796, -396963807, -396559594, -396152166, -395741531, -395327698,
+ -394910676, -394490474, -394067100, -393640565, -393210876, -392778042,
+ -392342073, -391902977, -391460763, -391015441, -390567019, -390115506,
+ -389660911, -389203244, -388742512, -388278727, -387811895, -387342027,
+ -386869131, -386393217, -385914294, -385432370, -384947455, -384459559,
+ -383968689, -383474856, -382978069, -382478336, -381975667, -381470071,
+ -380961558, -380450136, -379935815, -379418604, -378898512, -378375549,
+ -377849723, -377321045, -376789524, -376255168, -375717987, -375177990,
+ -374635188, -374089588, -373541201, -372990036, -372436102, -371879408,
+ -371319965, -370757781, -370192866, -369625229, -369054880, -368481828,
+ -367906083, -367327653, -366746550, -366162781, -365576357, -364987287,
+ -364395581, -363801248, -363204297, -362604739, -362002582, -361397837,
+ -360790512, -360180618, -359568163, -358953158, -358335613, -357715536,
+ -357092937, -356467827, -355840214, -355210108, -354577519, -353942456,
+ -353304930, -352664950, -352022525, -351377665, -350730380, -350080679,
+ -349428573, -348774071, -348117182, -347457916, -346796284, -346132294,
+ -345465957, -344797282, -344126280, -343452958, -342777329, -342099400,
+ -341419183, -340736687, -340051921, -339364895, -338675620, -337984104,
+ -337290358, -336594392, -335896215, -335195837, -334493268, -333788518,
+ -333081597, -332372514, -331661280, -330947903, -330232395, -329514764,
+ -328795021, -328073176, -327349238, -326623217, -325895123, -325164967,
+ -324432757, -323698504, -322962218, -322223908, -321483585, -320741258,
+ -319996938, -319250633, -318502355, -317752112, -316999915, -316245774,
+ -315489699, -314731699, -313971785, -313209966, -312446253, -311680655,
+ -310913182, -310143844, -309372651, -308599613, -307824741, -307048043,
+ -306269530, -305489211, -304707098, -303923199, -303137524, -302350085,
+ -301560889, -300769949, -299977272, -299182870, -298386752, -297588928,
+ -296789409, -295988204, -295185323, -294380776, -293574573, -292766724,
+ -291957238, -291146127, -290333400, -289519066, -288703136, -287885620,
+ -287066528, -286245869, -285423654, -284599892, -283774594, -282947769,
+ -282119428, -281289580, -280458235, -279625404, -278791096, -277955321,
+ -277118089, -276279410, -275439294, -274597751, -273754791, -272910423,
+ -272064659, -271217507, -270368977, -269519081, -268667826, -267815225,
+ -266961285, -266106018, -265249433, -264391540, -263532349, -262671870,
+ -261810112, -260947087, -260082803, -259217271, -258350500, -257482501,
+ -256613282, -255742855, -254871229, -253998414, -253124420, -252249256,
+ -251372933, -250495460, -249616848, -248737106, -247856243, -246974271,
+ -246091198, -245207035, -244321791, -243435477, -242548102, -241659675,
+ -240770207, -239879708, -238988187, -238095654, -237202120, -236307593,
+ -235412083, -234515601, -233618157, -232719759, -231820417, -230920143,
+ -230018944, -229116832, -228213815, -227309904, -226405109, -225499438,
+ -224592902, -223685510, -222777273, -221868199, -220958299, -220047583,
+ -219136059, -218223738, -217310630, -216396743, -215482088, -214566675,
+ -213650513, -212733611, -211815980, -210897629, -209978567, -209058805,
+ -208138351, -207217216, -206295409, -205372939, -204449817, -203526052,
+ -202601653, -201676630, -200750993, -199824750, -198897912, -197970489,
+ -197042488, -196113922, -195184797, -194255125, -193324915, -192394176,
+ -191462917, -190531149, -189598880, -188666120, -187732879, -186799165,
+ -185864989, -184930359, -183995286, -183059778, -182123845, -181187497,
+ -180250742, -179313590, -178376050, -177438132, -176499845, -175561199,
+ -174622202, -173682864, -172743195, -171803203, -170862898, -169922289,
+ -168981386, -168040197, -167098731, -166156999, -165215010, -164272771,
+ -163330294, -162387586, -161444657, -160501517, -159558173, -158614637,
+ -157670916, -156727019, -155782957, -154838737, -153894370, -152949863,
+ -152005227, -151060470, -150115601, -149170629, -148225564, -147280414,
+ -146335189, -145389896, -144444546, -143499147, -142553709, -141608239,
+ -140662748, -139717243, -138771734, -137826230, -136880740, -135935272,
+ -134989835, -134044439, -133099091, -132153802, -131208579, -130263431,
+ -129318368, -128373397, -127428528, -126483770, -125539131, -124594619,
+ -123650245, -122706015, -121761940, -120818027, -119874285, -118930723,
+ -117987350, -117044174, -116101203, -115158447, -114215913, -113273611,
+ -112331549, -111389736, -110448179, -109506888, -108565871, -107625137,
+ -106684693, -105744548, -104804712, -103865191, -102925995, -101987132,
+ -101048611, -100110439, -99172625, -98235178, -97298105, -96361415,
+ -95425117, -94489218, -93553726, -92618651, -91684000, -90749782,
+ -89816004, -88882675, -87949803, -87017396, -86085463, -85154011,
+ -84223048, -83292584, -82362624, -81433179, -80504255, -79575861,
+ -78648005, -77720695, -76793939, -75867744, -74942119, -74017072,
+ -73092610, -72168742, -71245475, -70322817, -69400776, -68479361,
+ -67558578, -66638435, -65718941, -64800103, -63881929, -62964426,
+ -62047603, -61131467, -60216025, -59301286, -58387257, -57473945,
+ -56561359, -55649506, -54738393, -53828029, -52918420, -52009574,
+ -51101498, -50194201, -49287690, -48381972, -47477054, -46572945,
+ -45669651, -44767179, -43865538, -42964735, -42064777, -41165670,
+ -40267424, -39370044, -38473539, -37577914, -36683179, -35789340,
+ -34896403, -34004377, -33113268, -32223084, -31333832, -30445519,
+ -29558151, -28671737, -27786283, -26901796, -26018283, -25135751,
+ -24254208, -23373660, -22494114, -21615576, -20738055, -19861557,
+ -18986089, -18111657, -17238268, -16365930, -15494649, -14624432,
+ -13755286, -12887217, -12020232, -11154337, -10289541, -9425848,
+ -8563267, -7701803, -6841463, -5982254, -5124182, -4267254, -3411476,
+ -2556855, -1703398, -851111, 0, 849928, 1698667, 2546210, 3392552,
+ 4237684, 5081603, 5924300, 6765770, 7606006, 8445002, 9282752,
+ 10119249, 10954488, 11788463, 12621166, 13452592, 14282735, 15111588,
+ 15939146, 16765402, 17590351, 18413986, 19236302, 20057292, 20876950,
+ 21695271, 22512248, 23327876, 24142148, 24955060, 25766604, 26576776,
+ 27385569, 28192978, 28998996, 29803618, 30606839, 31408653, 32209053,
+ 33008035, 33805592, 34601719, 35396411, 36189661, 36981465, 37771816,
+ 38560710, 39348140, 40134101, 40918588, 41701596, 42483118, 43263150,
+ 44041686, 44818721, 45594249, 46368265, 47140764, 47911740, 48681189,
+ 49449105, 50215482, 50980317, 51743602, 52505334, 53265508, 54024117,
+ 54781158, 55536624, 56290511, 57042814, 57793528, 58542648, 59290169,
+ 60036086, 60780395, 61523089, 62264164, 63003617, 63741440, 64477631,
+ 65212184, 65945094, 66676357, 67405967, 68133921, 68860213, 69584839,
+ 70307794, 71029074, 71748673, 72466588, 73182814, 73897346, 74610181,
+ 75321312, 76030736, 76738449, 77444445, 78148722, 78851273, 79552096,
+ 80251184, 80948536, 81644145, 82338007, 83030120, 83720477, 84409075,
+ 85095911, 85780978, 86464275, 87145795, 87825537, 88503494, 89179663,
+ 89854041, 90526623, 91197405, 91866383, 92533554, 93198912, 93862456,
+ 94524179, 95184080, 95842153, 96498396, 97152804, 97805373, 98456100,
+ 99104981, 99752013, 100397191, 101040512, 101681973, 102321569,
+ 102959298, 103595155, 104229138, 104861241, 105491463, 106119800,
+ 106746248, 107370803, 107993462, 108614223, 109233081, 109850033,
+ 110465076, 111078206, 111689421, 112298717, 112906090, 113511539,
+ 114115058, 114716645, 115316298, 115914013, 116509786, 117103615,
+ 117695497, 118285428, 118873406, 119459427, 120043489, 120625589,
+ 121205724, 121783890, 122360086, 122934307, 123506552, 124076817,
+ 124645100, 125211398, 125775708, 126338027, 126898353, 127456683,
+ 128013014, 128567345, 129119671, 129669990, 130218301, 130764600,
+ 131308885, 131851153, 132391402, 132929629, 133465833, 134000009,
+ 134532157, 135062274, 135590357, 136116404, 136640413, 137162382,
+ 137682307, 138200188, 138716021, 139229805, 139741537, 140251215,
+ 140758837, 141264402, 141767906, 142269348, 142768726, 143266037,
+ 143761281, 144254454, 144745554, 145234581, 145721531, 146206404,
+ 146689197, 147169908, 147648535, 148125078, 148599533, 149071899,
+ 149542175, 150010358, 150476448, 150940441, 151402338, 151862135,
+ 152319832, 152775427, 153228918, 153680303, 154129582, 154576753,
+ 155021814, 155464763, 155905600, 156344323, 156780930, 157215421,
+ 157647793, 158078046, 158506178, 158932188, 159356075, 159777837,
+ 160197473, 160614982, 161030363, 161443614, 161854735, 162263724,
+ 162670581, 163075304, 163477892, 163878345, 164276660, 164672838,
+ 165066876, 165458776, 165848534, 166236151, 166621625, 167004956,
+ 167386144, 167765186, 168142082, 168516832, 168889435, 169259889,
+ 169628195, 169994352, 170358358, 170720214, 171079919, 171437471,
+ 171792872, 172146119, 172497212, 172846152, 173192936, 173537566,
+ 173880040, 174220358, 174558520, 174894525, 175228373, 175560063,
+ 175889596, 176216970, 176542186, 176865243, 177186142, 177504881,
+ 177821460, 178135880, 178448141, 178758241, 179066182, 179371962,
+ 179675582, 179977042, 180276341, 180573480, 180868459, 181161278,
+ 181451936, 181740434, 182026772, 182310950, 182592967, 182872826,
+ 183150524, 183426063, 183699443, 183970664, 184239725, 184506629,
+ 184771374, 185033961, 185294391, 185552663, 185808779, 186062737,
+ 186314540, 186564187, 186811679, 187057016, 187300198, 187541227,
+ 187780102, 188016825, 188251395, 188483814, 188714081, 188942199,
+ 189168166, 189391984, 189613654, 189833176, 190050551, 190265779,
+ 190478862, 190689800, 190898594, 191105245, 191309754, 191512121,
+ 191712347, 191910434, 192106382, 192300191, 192491864, 192681401,
+ 192868803, 193054070, 193237205, 193418207, 193597079, 193773821,
+ 193948434, 194120919, 194291278, 194459512, 194625621, 194789608,
+ 194951472, 195111216, 195268841, 195424347, 195577737, 195729012,
+ 195878172, 196025219, 196170155, 196312981, 196453698, 196592308,
+ 196728811, 196863211, 196995507, 197125703, 197253798, 197379794,
+ 197503694, 197625498, 197745209, 197862827, 197978355, 198091794,
+ 198203145, 198312411, 198419593, 198524692, 198627711, 198728651,
+ 198827514, 198924302, 199019016, 199111658, 199202231, 199290735,
+ 199377173, 199461547, 199543858, 199624109, 199702301, 199778436,
+ 199852516, 199924544, 199994521, 200062449, 200128331, 200192167,
+ 200253961, 200313715, 200371430, 200427108, 200480753, 200532365,
+ 200581947, 200629501, 200675030, 200718535, 200760020, 200799485,
+ 200836934, 200872368, 200905790, 200937202, 200966607, 200994007,
+ 201019404, 201042800, 201064198, 201083601, 201101011, 201116430,
+ 201129860, 201141305, 201150766, 201158246, 201163748, 201167274,
+ 201168827, 201168409, 201166023, 201161671, 201155357, 201147082,
+ 201136849, 201124661, 201110521, 201094431, 201076394, 201056413,
+ 201034490, 201010629, 200984831, 200957100, 200927438, 200895849,
+ 200862335, 200826899, 200789544, 200750272, 200709087, 200665991,
+ 200620988, 200574080, 200525270, 200474561, 200421956, 200367458,
+ 200311071, 200252796, 200192637, 200130598, 200066681, 200000889,
+ 199933225, 199863693, 199792295, 199719035, 199643916, 199566940,
+ 199488112, 199407434, 199324909, 199240541, 199154333, 199066287,
+ 198976408, 198884699, 198791163, 198695802, 198598621, 198499623,
+ 198398811, 198296188, 198191758, 198085524, 197977489, 197867657,
+ 197756032, 197642616, 197527413, 197410427, 197291661, 197171118,
+ 197048802, 196924716, 196798864, 196671250, 196541877, 196410748,
+ 196277867, 196143238, 196006864, 195868748, 195728895, 195587308,
+ 195443991, 195298946, 195152179, 195003692, 194853489, 194701574,
+ 194547951, 194392623, 194235594, 194076868, 193916448, 193754338,
+ 193590543, 193425065, 193257909, 193089078, 192918576, 192746407,
+ 192572575, 192397084, 192219937, 192041138, 191860692, 191678602,
+ 191494871, 191309505, 191122507, 190933880, 190743629, 190551758,
+ 190358271, 190163171, 189966462, 189768149, 189568236, 189366727,
+ 189163625, 188958934, 188752660, 188544805, 188335374, 188124371,
+ 187911799, 187697664, 187481969, 187264719, 187045916, 186825567,
+ 186603674, 186380242, 186155275, 185928777, 185700752, 185471205,
+ 185240140, 185007560, 184773471, 184537876, 184300780, 184062187,
+ 183822101, 183580526, 183337467, 183092928, 182846913, 182599427,
+ 182350473, 182100057, 181848183, 181594854, 181340075, 181083851,
+ 180826185, 180567083, 180306549, 180044586, 179781200, 179516395,
+ 179250175, 178982545, 178713508, 178443070, 178171236, 177898008,
+ 177623392, 177347393, 177070014, 176791261, 176511137, 176229648,
+ 175946797, 175662589, 175377030, 175090122, 174801872, 174512282,
+ 174221359, 173929106, 173635528, 173340630, 173044416, 172746890,
+ 172448058, 172147924, 171846492, 171543767, 171239755, 170934458,
+ 170627882, 170320033, 170010913, 169700528, 169388883, 169075982,
+ 168761830, 168446432, 168129791, 167811914, 167492804, 167172467,
+ 166850906, 166528128, 166204135, 165878934, 165552529, 165224925,
+ 164896125, 164566136, 164234962, 163902607, 163569077, 163234375,
+ 162898508, 162561479, 162223294, 161883957, 161543473, 161201847,
+ 160859083, 160515187, 160170163, 159824016, 159476751, 159128373,
+ 158778886, 158428295, 158076606, 157723823, 157369950, 157014994,
+ 156658958, 156301847, 155943667, 155584421, 155224116, 154862756,
+ 154500346, 154136890, 153772394, 153406863, 153040300, 152672713,
+ 152304104, 151934479, 151563844, 151192202, 150819559, 150445920,
+ 150071290, 149695673, 149319074, 148941500, 148562953, 148183440,
+ 147802966, 147421535, 147039151, 146655821, 146271550, 145886341,
+ 145500200, 145113132, 144725143, 144336236, 143946417, 143555691,
+ 143164064, 142771538, 142378121, 141983817, 141588630, 141192567,
+ 140795631, 140397828, 139999162, 139599640, 139199265, 138798044,
+ 138395980, 137993078, 137589345, 137184785, 136779402, 136373202,
+ 135966191, 135558372, 135149751, 134740333, 134330123, 133919126,
+ 133507347, 133094791, 132681463, 132267369, 131852512, 131436899,
+ 131020534, 130603422, 130185568, 129766978, 129347656, 128927607,
+ 128506837, 128085351, 127663152, 127240248, 126816642, 126392339,
+ 125967345, 125541665, 125115304, 124688266, 124260557, 123832183,
+ 123403146, 122973454, 122543111, 122112122, 121680492, 121248226,
+ 120815330, 120381807, 119947664, 119512905, 119077535, 118641560,
+ 118204984, 117767813, 117330051, 116891703, 116452775, 116013272,
+ 115573198, 115132559, 114691360, 114249605, 113807300, 113364450,
+ 112921060, 112477135, 112032679, 111587699, 111142198, 110696183,
+ 110249657, 109802626, 109355096, 108907070, 108458555, 108009554,
+ 107560074, 107110119, 106659694, 106208804, 105757454, 105305650,
+ 104853395, 104400696, 103947557, 103493983, 103039979, 102585551,
+ 102130702, 101675439, 101219766, 100763687, 100307209, 99850336,
+ 99393074, 98935426, 98477398, 98018995, 97560222, 97101084, 96641586,
+ 96181732, 95721529, 95260980, 94800091, 94338866, 93877312, 93415431,
+ 92953230, 92490714, 92027887, 91564754, 91101321, 90637591, 90173571,
+ 89709264, 89244677, 88779813, 88314678, 87849276, 87383613, 86917694,
+ 86451523, 85985105, 85518445, 85051548, 84584419, 84117062, 83649483,
+ 83181687, 82713678, 82245461, 81777041, 81308423, 80839611, 80370612,
+ 79901428, 79432066, 78962530, 78492825, 78022956, 77552927, 77082743,
+ 76612410, 76141931, 75671312, 75200558, 74729673, 74258662, 73787531,
+ 73316282, 72844923, 72373456, 71901887, 71430222, 70958463, 70486617,
+ 70014688, 69542680, 69070599, 68598449, 68126234, 67653961, 67181632,
+ 66709254, 66236830, 65764366, 65291866, 64819334, 64346776, 63874196,
+ 63401599, 62928989, 62456371, 61983750, 61511130, 61038516, 60565913,
+ 60093325, 59620757, 59148213, 58675698, 58203217, 57730775, 57258375,
+ 56786022, 56313722, 55841478, 55369295, 54897178, 54425132, 53953160,
+ 53481267, 53009458, 52537738, 52066110, 51594580, 51123152, 50651830,
+ 50180619, 49709523, 49238547, 48767696, 48296973, 47826384, 47355932,
+ 46885623, 46415460, 45945448, 45475591, 45005894, 44536362, 44066998,
+ 43597807, 43128794, 42659963, 42191317, 41722862, 41254603, 40786542,
+ 40318685, 39851036, 39383599, 38916379, 38449379, 37982605, 37516060,
+ 37049749, 36583677, 36117846, 35652262, 35186929, 34721851, 34257033,
+ 33792478, 33328190, 32864175, 32400437, 31936978, 31473804, 31010919,
+ 30548327, 30086033, 29624039, 29162352, 28700973, 28239909, 27779162,
+ 27318738, 26858640, 26398872, 25939438, 25480343, 25021590, 24563184,
+ 24105128, 23647428, 23190086, 22733107, 22276494, 21820253, 21364386,
+ 20908898, 20453793, 19999075, 19544748, 19090816, 18637282, 18184151,
+ 17731426, 17279113, 16827213, 16375732, 15924674, 15474041, 15023839,
+ 14574070, 14124740, 13675851, 13227408, 12779414, 12331873, 11884789,
+ 11438166, 10992008, 10546319, 10101101, 9656360, 9212098, 8768320,
+ 8325029, 7882229, 7439924, 6998117, 6556813, 6116014, 5675725, 5235949,
+ 4796690, 4357952, 3919738, 3482052, 3044897, 2608278, 2172197, 1736658,
+ 1301666, 867223, 433333, 0, -432773, -864982, -1296624, -1727695,
+ -2158192, -2588111, -3017449, -3446202, -3874367, -4301940, -4728918,
+ -5155297, -5581074, -6006246, -6430809, -6854759, -7278094, -7700810,
+ -8122903, -8544371, -8965209, -9385415, -9804985, -10223916, -10642205,
+ -11059848, -11476842, -11893183, -12308869, -12723896, -13138261,
+ -13551961, -13964992, -14377352, -14789037, -15200043, -15610369,
+ -16020009, -16428962, -16837225, -17244793, -17651665, -18057836,
+ -18463304, -18868066, -19272118, -19675457, -20078081, -20479987,
+ -20881171, -21281630, -21681361, -22080362, -22478629, -22876159,
+ -23272950, -23668998, -24064300, -24458854, -24852656, -25245704,
+ -25637995, -26029525, -26420293, -26810294, -27199527, -27587988,
+ -27975675, -28362584, -28748713, -29134059, -29518619, -29902391,
+ -30285372, -30667558, -31048948, -31429538, -31809326, -32188308,
+ -32566483, -32943848, -33320400, -33696135, -34071053, -34445149,
+ -34818422, -35190868, -35562485, -35933271, -36303223, -36672338,
+ -37040613, -37408047, -37774637, -38140379, -38505272, -38869313,
+ -39232500, -39594830, -39956300, -40316909, -40676653, -41035530,
+ -41393538, -41750675, -42106938, -42462324, -42816831, -43170457,
+ -43523200, -43875057, -44226025, -44576103, -44925288, -45273579,
+ -45620971, -45967464, -46313055, -46657742, -47001522, -47344393,
+ -47686354, -48027402, -48367534, -48706748, -49045043, -49382417,
+ -49718866, -50054389, -50388984, -50722648, -51055380, -51387178,
+ -51718039, -52047961, -52376942, -52704981, -53032075, -53358222,
+ -53683420, -54007668, -54330962, -54653302, -54974686, -55295110,
+ -55614574, -55933075, -56250612, -56567183, -56882786, -57197418,
+ -57511078, -57823765, -58135476, -58446210, -58755964, -59064737,
+ -59372527, -59679333, -59985152, -60289984, -60593825, -60896674,
+ -61198531, -61499392, -61799256, -62098123, -62395989, -62692853,
+ -62988714, -63283569, -63577418, -63870259, -64162090, -64452910,
+ -64742716, -65031508, -65319284, -65606042, -65891781, -66176500,
+ -66460196, -66742868, -67024515, -67305136, -67584728, -67863291,
+ -68140823, -68417323, -68692788, -68967219, -69240613, -69512969,
+ -69784286, -70054562, -70323796, -70591987, -70859134, -71125234,
+ -71390288, -71654292, -71917248, -72179152, -72440004, -72699802,
+ -72958546, -73216235, -73472866, -73728439, -73982952, -74236405,
+ -74488796, -74740125, -74990390, -75239589, -75487723, -75734789,
+ -75980787, -76225716, -76469575, -76712362, -76954077, -77194718,
+ -77434285, -77672776, -77910191, -78146529, -78381788, -78615969,
+ -78849069, -79081088, -79312025, -79541879, -79770649, -79998335,
+ -80224936, -80450450, -80674877, -80898216, -81120466, -81341627,
+ -81561697, -81780676, -81998564, -82215358, -82431060, -82645667,
+ -82859180, -83071597, -83282917, -83493141, -83702268, -83910296,
+ -84117226, -84323056, -84527786, -84731415, -84933943, -85135369,
+ -85335693, -85534914, -85733031, -85930044, -86125952, -86320756,
+ -86514454, -86707045, -86898530, -87088908, -87278179, -87466341,
+ -87653396, -87839341, -88024177, -88207904, -88390520, -88572026,
+ -88752422, -88931706, -89109879, -89286940, -89462889, -89637726,
+ -89811450, -89984061, -90155559, -90325943, -90495214, -90663370,
+ -90830413, -90996341, -91161154, -91324853, -91487436, -91648905,
+ -91809258, -91968496, -92126618, -92283624, -92439514, -92594289,
+ -92747947, -92900490, -93051916, -93202226, -93351420, -93499497,
+ -93646458, -93792303, -93937031, -94080643, -94223139, -94364518,
+ -94504782, -94643929, -94781960, -94918874, -95054673, -95189356,
+ -95322924, -95455375, -95586711, -95716932, -95846038, -95974028,
+ -96100904, -96226665, -96351312, -96474844, -96597262, -96718567,
+ -96838758, -96957835, -97075800, -97192651, -97308391, -97423018,
+ -97536533, -97648936, -97760228, -97870410, -97979480, -98087441,
+ -98194291, -98300032, -98404664, -98508188, -98610603, -98711910,
+ -98812110, -98911203, -99009189, -99106069, -99201844, -99296514,
+ -99390079, -99482539, -99573897, -99664151, -99753303, -99841352,
+ -99928301, -100014148, -100098895, -100182543, -100265091, -100346541,
+ -100426893, -100506148, -100584306, -100661369, -100737336, -100812208,
+ -100885986, -100958672, -101030264, -101100765, -101170175, -101238494,
+ -101305724, -101371864, -101436917, -101500882, -101563761, -101625553,
+ -101686261, -101745885, -101804425, -101861883, -101918259, -101973554,
+ -102027769, -102080904, -102132962, -102183942, -102233846, -102282674,
+ -102330428, -102377107, -102422714, -102467249, -102510713, -102553108,
+ -102594433, -102634690, -102673880, -102712004, -102749064, -102785059,
+ -102819991, -102853861, -102886671, -102918420, -102949111, -102978745,
+ -103007321, -103034842, -103061309, -103086723, -103111084, -103134394,
+ -103156655, -103177866, -103198030, -103217148, -103235220, -103252249,
+ -103268234, -103283178, -103297081, -103309945, -103321771, -103332561,
+ -103342314, -103351034, -103358720, -103365375, -103370999, -103375594,
+ -103379161, -103381702, -103383217, -103383709, -103383178, -103381625,
+ -103379053, -103375462, -103370854, -103365230, -103358592, -103350941,
+ -103342278, -103332604, -103321922, -103310233, -103297538, -103283838,
+ -103269135, -103253430, -103236725, -103219022, -103200322, -103180625,
+ -103159935, -103138252, -103115577, -103091913, -103067261, -103041623,
+ -103014999, -102987392, -102958803, -102929233, -102898685, -102867159,
+ -102834658, -102801183, -102766736, -102731317, -102694930, -102657575,
+ -102619254, -102579969, -102539721, -102498513, -102456345, -102413220,
+ -102369138, -102324103, -102278115, -102231176, -102183288, -102134453,
+ -102084672, -102033947, -101982280, -101929673, -101876127, -101821644,
+ -101766226, -101709874, -101652591, -101594379, -101535238, -101475171,
+ -101414180, -101352266, -101289432, -101225679, -101161008, -101095423,
+ -101028924, -100961514, -100893194, -100823966, -100753833, -100682796,
+ -100610856, -100538017, -100464279, -100389645, -100314117, -100237696,
+ -100160384, -100082184, -100003097, -99923126, -99842271, -99760536,
+ -99677922, -99594432, -99510066, -99424828, -99338719, -99251741,
+ -99163896, -99075186, -98985613, -98895180, -98803888, -98711739,
+ -98618736, -98524880, -98430173, -98334618, -98238217, -98140971,
+ -98042883, -97943954, -97844188, -97743586, -97642150, -97539882,
+ -97436784, -97332859, -97228108, -97122534, -97016139, -96908925,
+ -96800895, -96692049, -96582391, -96471923, -96360646, -96248563,
+ -96135677, -96021989, -95907501, -95792216, -95676136, -95559263,
+ -95441600, -95323148, -95203910, -95083888, -94963084, -94841501,
+ -94719140, -94596004, -94472096, -94347417, -94221970, -94095757,
+ -93968780, -93841041, -93712544, -93583289, -93453280, -93322519,
+ -93191008, -93058749, -92925745, -92791997, -92657509, -92522282,
+ -92386320, -92249623, -92112195, -91974038, -91835154, -91695546,
+ -91555216, -91414166, -91272399, -91129916, -90986721, -90842816,
+ -90698203, -90552885, -90406863, -90260141, -90112720, -89964604,
+ -89815794, -89666293, -89516103, -89365227, -89213667, -89061425,
+ -88908505, -88754907, -88600636, -88445693, -88290081, -88133801,
+ -87976858, -87819252, -87660987, -87502065, -87342488, -87182259,
+ -87021381, -86859855, -86697684, -86534872, -86371419, -86207329,
+ -86042604, -85877247, -85711261, -85544647, -85377408, -85209546,
+ -85041065, -84871967, -84702253, -84531928, -84360992, -84189450,
+ -84017302, -83844553, -83671203, -83497257, -83322716, -83147582,
+ -82971860, -82795550, -82618655, -82441179, -82263124, -82084491,
+ -81905284, -81725506, -81545158, -81364244, -81182766, -81000726,
+ -80818128, -80634973, -80451264, -80267004, -80082195, -79896841,
+ -79710943, -79524504, -79337527, -79150014, -78961968, -78773391,
+ -78584287, -78394657, -78204505, -78013832, -77822642, -77630937,
+ -77438719, -77245992, -77052758, -76859019, -76664779, -76470039,
+ -76274802, -76079071, -75882849, -75686138, -75488941, -75291261,
+ -75093099, -74894459, -74695344, -74495755, -74295696, -74095169,
+ -73894177, -73692723, -73490808, -73288436, -73085610, -72882332,
+ -72678604, -72474430, -72269811, -72064751, -71859252, -71653318,
+ -71446949, -71240150, -71032923, -70825270, -70617194, -70408698,
+ -70199784, -69990456, -69780715, -69570564, -69360007, -69149045,
+ -68937681, -68725918, -68513759, -68301207, -68088263, -67874931,
+ -67661213, -67447112, -67232630, -67017771, -66802537, -66586930,
+ -66370953, -66154610, -65937901, -65720831, -65503402, -65285616,
+ -65067477, -64848986, -64630147, -64410962, -64191434, -63971565,
+ -63751359, -63530817, -63309942, -63088738, -62867207, -62645351,
+ -62423173, -62200676, -61977862, -61754734, -61531295, -61307548,
+ -61083494, -60859138, -60634480, -60409525, -60184274, -59958731,
+ -59732897, -59506777, -59280371, -59053684, -58826717, -58599473,
+ -58371956, -58144166, -57916109, -57687785, -57459197, -57230349,
+ -57001242, -56771880, -56542265, -56312400, -56082287, -55851929,
+ -55621329, -55390489, -55159412, -54928101, -54696558, -54464786,
+ -54232787, -54000564, -53768121, -53535458, -53302580, -53069488,
+ -52836186, -52602675, -52368959, -52135040, -51900921, -51666605,
+ -51432093, -51197389, -50962495, -50727414, -50492149, -50256702,
+ -50021075, -49785272, -49549294, -49313146, -49076828, -48840344,
+ -48603696, -48366888, -48129920, -47892797, -47655521, -47418094,
+ -47180519, -46942798, -46704934, -46466930, -46228789, -45990512,
+ -45752102, -45513563, -45274895, -45036104, -44797189, -44558155,
+ -44319004, -44079738, -43840360, -43600873, -43361278, -43121579,
+ -42881778, -42641878, -42401882, -42161791, -41921608, -41681336,
+ -41440978, -41200535, -40960011, -40719408, -40478728, -40237975,
+ -39997150, -39756256, -39515296, -39274272, -39033186, -38792042,
+ -38550841, -38309586, -38068280, -37826925, -37585524, -37344079,
+ -37102592, -36861067, -36619505, -36377909, -36136282, -35894625,
+ -35652943, -35411236, -35169507, -34927760, -34685995, -34444217,
+ -34202426, -33960627, -33718820, -33477009, -33235197, -32993384,
+ -32751575, -32509770, -32267974, -32026187, -31784414, -31542655,
+ -31300913, -31059192, -30817493, -30575818, -30334170, -30092552,
+ -29850966, -29609413, -29367898, -29126421, -28884986, -28643594,
+ -28402249, -28160952, -27919706, -27678513, -27437375, -27196296,
+ -26955277, -26714320, -26473428, -26232604, -25991849, -25751166,
+ -25510557, -25270025, -25029572, -24789200, -24548912, -24308710,
+ -24068595, -23828571, -23588640, -23348804, -23109065, -22869426,
+ -22629889, -22390455, -22151129, -21911911, -21672804, -21433810,
+ -21194931, -20956171, -20717530, -20479011, -20240617, -20002350,
+ -19764211, -19526204, -19288330, -19050592, -18812991, -18575530,
+ -18338212, -18101038, -17864010, -17627132, -17390404, -17153829,
+ -16917410, -16681148, -16445046, -16209106, -15973330, -15737719,
+ -15502277, -15267006, -15031907, -14796983, -14562235, -14327667,
+ -14093279, -13859075, -13625056, -13391225, -13157583, -12924133,
+ -12690876, -12457815, -12224952, -11992289, -11759828, -11527572,
+ -11295521, -11063678, -10832046, -10600626, -10369421, -10138432,
+ -9907661, -9677111, -9446783, -9216680, -8986804, -8757156, -8527738,
+ -8298553, -8069603, -7840889, -7612414, -7384179, -7156187, -6928439,
+ -6700937, -6473684, -6246681, -6019931, -5793434, -5567194, -5341212,
+ -5115490, -4890030, -4664834, -4439903, -4215240, -3990847, -3766725,
+ -3542877, -3319303, -3096007, -2872990, -2650254, -2427800, -2205631,
+ -1983749, -1762155, -1540851, -1319839, -1099120, -878698, -658572,
+ -438746, -219222, 0, 218917, 437528, 655830, 873823, 1091504, 1308871,
+ 1525923, 1742658, 1959073, 2175169, 2390942, 2606391, 2821514, 3036309,
+ 3250775, 3464911, 3678713, 3892181, 4105313, 4318108, 4530563, 4742676,
+ 4954447, 5165874, 5376954, 5587686, 5798069, 6008101, 6217780, 6427105,
+ 6636074, 6844685, 7052937, 7260828, 7468356, 7675521, 7882320, 8088752,
+ 8294814, 8500507, 8705827, 8910774, 9115346, 9319542, 9523359, 9726796,
+ 9929852, 10132526, 10334815, 10536718, 10738234, 10939361, 11140098,
+ 11340443, 11540395, 11739952, 11939112, 12137875, 12336239, 12534202,
+ 12731764, 12928921, 13125674, 13322020, 13517958, 13713488, 13908606,
+ 14103313, 14297606, 14491484, 14684946, 14877990, 15070616, 15262821,
+ 15454604, 15645964, 15836900, 16027410, 16217493, 16407147, 16596372,
+ 16785165, 16973527, 17161454, 17348947, 17536003, 17722621, 17908801,
+ 18094540, 18279839, 18464694, 18649105, 18833072, 19016592, 19199664,
+ 19382287, 19564460, 19746182, 19927451, 20108266, 20288627, 20468531,
+ 20647978, 20826966, 21005495, 21183562, 21361168, 21538310, 21714989,
+ 21891201, 22066947, 22242225, 22417034, 22591374, 22765242, 22938638,
+ 23111560, 23284008, 23455981, 23627477, 23798495, 23969035, 24139094,
+ 24308673, 24477770, 24646384, 24814514, 24982160, 25149319, 25315990,
+ 25482174, 25647869, 25813074, 25977788, 26142009, 26305738, 26468973,
+ 26631712, 26793956, 26955703, 27116952, 27277702, 27437953, 27597703,
+ 27756952, 27915698, 28073940, 28231679, 28388912, 28545639, 28701859,
+ 28857572, 29012776, 29167470, 29321654, 29475326, 29628487, 29781134,
+ 29933268, 30084887, 30235991, 30386579, 30536649, 30686202, 30835236,
+ 30983751, 31131746, 31279219, 31426171, 31572601, 31718507, 31863889,
+ 32008746, 32153079, 32296884, 32440163, 32582915, 32725138, 32866832,
+ 33007996, 33148630, 33288732, 33428303, 33567342, 33705847, 33843819,
+ 33981256, 34118158, 34254524, 34390354, 34525647, 34660403, 34794620,
+ 34928299, 35061438, 35194037, 35326095, 35457612, 35588588, 35719021,
+ 35848911, 35978258, 36107061, 36235319, 36363033, 36490200, 36616822,
+ 36742897, 36868425, 36993405, 37117837, 37241720, 37365054, 37487839,
+ 37610073, 37731757, 37852890, 37973472, 38093501, 38212978, 38331903,
+ 38450274, 38568091, 38685355, 38802064, 38918218, 39033817, 39148860,
+ 39263347, 39377277, 39490651, 39603468, 39715727, 39827428, 39938571,
+ 40049155, 40159181, 40268647, 40377554, 40485900, 40593687, 40700913,
+ 40807578, 40913682, 41019225, 41124206, 41228626, 41332483, 41435777,
+ 41538509, 41640678, 41742283, 41843326, 41943804, 42043719, 42143069,
+ 42241855, 42340077, 42437734, 42534826, 42631353, 42727314, 42822710,
+ 42917541, 43011805, 43105504, 43198636, 43291203, 43383202, 43474636,
+ 43565502, 43655802, 43745535, 43834701, 43923300, 44011332, 44098796,
+ 44185693, 44272022, 44357784, 44442979, 44527605, 44611664, 44695155,
+ 44778079, 44860434, 44942222, 45023442, 45104093, 45184177, 45263693,
+ 45342641, 45421021, 45498833, 45576077, 45652753, 45728861, 45804402,
+ 45879374, 45953779, 46027616, 46100886, 46173588, 46245722, 46317289,
+ 46388288, 46458721, 46528586, 46597884, 46666614, 46734778, 46802376,
+ 46869406, 46935870, 47001768, 47067099, 47131864, 47196064, 47259697,
+ 47322765, 47385267, 47447204, 47508575, 47569382, 47629624, 47689301,
+ 47748414, 47806963, 47864948, 47922369, 47979226, 48035520, 48091251,
+ 48146419, 48201024, 48255067, 48308548, 48361467, 48413825, 48465621,
+ 48516856, 48567530, 48617644, 48667198, 48716191, 48764625, 48812500,
+ 48859816, 48906573, 48952772, 48998413, 49043496, 49088021, 49131990,
+ 49175402, 49218258, 49260558, 49302302, 49343491, 49384126, 49424205,
+ 49463731, 49502703, 49541122, 49578988, 49616301, 49653063, 49689273,
+ 49724931, 49760039, 49794597, 49828604, 49862062, 49894971, 49927332,
+ 49959144, 49990409, 50021126, 50051297, 50080922, 50110001, 50138534,
+ 50166523, 50193968, 50220868, 50247226, 50273041, 50298313, 50323044,
+ 50347234, 50370883, 50393992, 50416561, 50438591, 50460083, 50481037,
+ 50501454, 50521333, 50540677, 50559485, 50577758, 50595496, 50612700,
+ 50629372, 50645510, 50661116, 50676191, 50690735, 50704749, 50718233,
+ 50731188, 50743615, 50755514, 50766886, 50777731, 50788051, 50797845,
+ 50807115, 50815861, 50824084, 50831785, 50838963, 50845621, 50851758,
+ 50857375, 50862473, 50867053, 50871115, 50874660, 50877689, 50880203,
+ 50882201, 50883686, 50884657, 50885116, 50885062, 50884498, 50883423,
+ 50881838, 50879745, 50877143, 50874034, 50870419, 50866297, 50861671,
+ 50856540, 50850906, 50844769, 50838130, 50830990, 50823350, 50815210,
+ 50806571, 50797435, 50787801, 50777671, 50767046, 50755926, 50744313,
+ 50732206, 50719607, 50706517, 50692937, 50678867, 50664309, 50649262,
+ 50633729, 50617709, 50601204, 50584215, 50566742, 50548787, 50530350,
+ 50511432, 50492034, 50472158, 50451803, 50430970, 50409662, 50387878,
+ 50365619, 50342887, 50319683, 50296006, 50271859, 50247242, 50222156,
+ 50196602, 50170580, 50144093, 50117141, 50089724, 50061844, 50033502,
+ 50004699, 49975435, 49945712, 49915530, 49884891, 49853796, 49822245,
+ 49790240, 49757781, 49724870, 49691507, 49657694, 49623431, 49588720,
+ 49553561, 49517956, 49481905, 49445410, 49408472, 49371091, 49333269,
+ 49295007, 49256306, 49217166, 49177589, 49137576, 49097128, 49056246,
+ 49014930, 48973183, 48931006, 48888398, 48845361, 48801897, 48758007,
+ 48713691, 48668950, 48623786, 48578200, 48532193, 48485765, 48438919,
+ 48391654, 48343973, 48295876, 48247365, 48198440, 48149103, 48099354,
+ 48049195, 47998628, 47947652, 47896269, 47844481, 47792288, 47739692,
+ 47686694, 47633294, 47579495, 47525296, 47470700, 47415707, 47360319,
+ 47304537, 47248361, 47191794, 47134835, 47077487, 47019751, 46961627,
+ 46903117, 46844222, 46784943, 46725281, 46665238, 46604815, 46544013,
+ 46482832, 46421275, 46359343, 46297036, 46234355, 46171303, 46107880,
+ 46044088, 45979927, 45915399, 45850505, 45785246, 45719623, 45653639,
+ 45587293, 45520587, 45453522, 45386100, 45318322, 45250189, 45181701,
+ 45112862, 45043671, 44974129, 44904239, 44834001, 44763417, 44692487,
+ 44621214, 44549598, 44477640, 44405342, 44332706, 44259731, 44186420,
+ 44112774, 44038793, 43964480, 43889836, 43814861, 43739558, 43663926,
+ 43587969, 43511686, 43435079, 43358150, 43280899, 43203328, 43125438,
+ 43047231, 42968708, 42889869, 42810717, 42731253, 42651477, 42571391,
+ 42490997, 42410296, 42329288, 42247976, 42166361, 42084443, 42002224,
+ 41919706, 41836890, 41753777, 41670367, 41586664, 41502668, 41418379,
+ 41333801, 41248933, 41163777, 41078335, 40992607, 40906596, 40820302,
+ 40733726, 40646871, 40559736, 40472325, 40384637, 40296675, 40208439,
+ 40119931, 40031152, 39942103, 39852787, 39763203, 39673354, 39583241,
+ 39492865, 39402228, 39311330, 39220173, 39128758, 39037087, 38945162,
+ 38852982, 38760551, 38667868, 38574936, 38481755, 38388328, 38294655,
+ 38200737, 38106577, 38012175, 37917532, 37822651, 37727532, 37632176,
+ 37536586, 37440762, 37344706, 37248418, 37151902, 37055156, 36958184,
+ 36860987, 36763565, 36665920, 36568053, 36469966, 36371661, 36273137,
+ 36174398, 36075444, 35976276, 35876896, 35777305, 35677504, 35577496,
+ 35477280, 35376859, 35276234, 35175406, 35074377, 34973148, 34871719,
+ 34770094, 34668272, 34566256, 34464046, 34361644, 34259051, 34156270,
+ 34053300, 33950143, 33846801, 33743275, 33639567, 33535677, 33431607,
+ 33327359, 33222934, 33118332, 33013556, 32908607, 32803486, 32698194,
+ 32592733, 32487105, 32381310, 32275349, 32169225, 32062939, 31956491,
+ 31849883, 31743117, 31636194, 31529115, 31421882, 31314496, 31206957,
+ 31099269, 30991431, 30883446, 30775314, 30667037, 30558617, 30450054,
+ 30341350, 30232506, 30123524, 30014405, 29905150, 29795761, 29686239,
+ 29576585, 29466800, 29356887, 29246846, 29136678, 29026386, 28915970,
+ 28805431, 28694771, 28583992, 28473094, 28362078, 28250948, 28139702,
+ 28028344, 27916874, 27805293, 27693603, 27581805, 27469901, 27357891,
+ 27245778, 27133562, 27021245, 26908828, 26796312, 26683699, 26570990,
+ 26458186, 26345288, 26232299, 26119219, 26006049, 25892792, 25779447,
+ 25666017, 25552502, 25438905, 25325226, 25211467, 25097628, 24983712,
+ 24869719, 24755652, 24641510, 24527296, 24413010, 24298654, 24184230,
+ 24069739, 23955181, 23840558, 23725872, 23611123, 23496314, 23381444,
+ 23266517, 23151532, 23036491, 22921396, 22806247, 22691046, 22575795,
+ 22460494, 22345145, 22229748, 22114306, 21998820, 21883290, 21767718,
+ 21652106, 21536454, 21420764, 21305038, 21189275, 21073478, 20957648,
+ 20841787, 20725894, 20609972, 20494022, 20378045, 20262042, 20146015,
+ 20029965, 19913893, 19797800, 19681687, 19565556, 19449409, 19333245,
+ 19217067, 19100875, 18984672, 18868457, 18752233, 18636000, 18519761,
+ 18403515, 18287264, 18171009, 18054753, 17938495, 17822237, 17705980,
+ 17589726, 17473475, 17357229, 17240989, 17124757, 17008533, 16892318,
+ 16776114, 16659922, 16543743, 16427579, 16311430, 16195298, 16079184,
+ 15963089, 15847014, 15730960, 15614929, 15498922, 15382939, 15266983,
+ 15151054, 15035153, 14919282, 14803441, 14687633, 14571857, 14456116,
+ 14340410, 14224740, 14109108, 13993514, 13877961, 13762448, 13646978,
+ 13531551, 13416168, 13300831, 13185541, 13070298, 12955104, 12839960,
+ 12724868, 12609827, 12494840, 12379907, 12265030, 12150210, 12035448,
+ 11920744, 11806100, 11691518, 11576997, 11462540, 11348147, 11233820,
+ 11119559, 11005366, 10891241, 10777187, 10663203, 10549291, 10435452,
+ 10321687, 10207997, 10094383, 9980847, 9867389, 9754010, 9640712,
+ 9527495, 9414361, 9301310, 9188344, 9075463, 8962670, 8849964, 8737346,
+ 8624819, 8512382, 8400037, 8287785, 8175627, 8063564, 7951596, 7839726,
+ 7727953, 7616280, 7504706, 7393234, 7281863, 7170595, 7059432, 6948373,
+ 6837420, 6726574, 6615836, 6505207, 6394687, 6284279, 6173982, 6063799,
+ 5953729, 5843773, 5733934, 5624211, 5514605, 5405118, 5295751, 5186504,
+ 5077379, 4968376, 4859496, 4750740, 4642110, 4533606, 4425228, 4316979,
+ 4208859, 4100868, 3993008, 3885280, 3777684, 3670222, 3562894, 3455702,
+ 3348645, 3241726, 3134945, 3028303, 2921800, 2815438, 2709218, 2603140,
+ 2497205, 2391414, 2285769, 2180269, 2074917, 1969711, 1864655, 1759748,
+ 1654991, 1550385, 1445931, 1341630, 1237482, 1133489, 1029652, 925970,
+ 822446, 719079, 615871, 512822, 409934, 307206, 204641, 102239, 0,
+ -102074, -203984, -305727, -407304, -508713, -609954, -711026, -811928,
+ -912659, -1013219, -1113607, -1213821, -1313862, -1413728, -1513419,
+ -1612933, -1712271, -1811432, -1910414, -2009216, -2107839, -2206282,
+ -2304543, -2402622, -2500518, -2598231, -2695759, -2793102, -2890260,
+ -2987232, -3084016, -3180612, -3277020, -3373238, -3469267, -3565105,
+ -3660751, -3756206, -3851467, -3946536, -4041410, -4136089, -4230573,
+ -4324861, -4418952, -4512845, -4606541, -4700037, -4793334, -4886431,
+ -4979327, -5072022, -5164514, -5256804, -5348891, -5440773, -5532451,
+ -5623924, -5715190, -5806251, -5897104, -5987749, -6078186, -6168414,
+ -6258432, -6348241, -6437838, -6527224, -6616398, -6705359, -6794108,
+ -6882642, -6970962, -7059068, -7146957, -7234631, -7322088, -7409328,
+ -7496350, -7583154, -7669739, -7756104, -7842250, -7928174, -8013878,
+ -8099360, -8184620, -8269658, -8354472, -8439062, -8523428, -8607570,
+ -8691485, -8775176, -8858639, -8941876, -9024886, -9107667, -9190221,
+ -9272545, -9354640, -9436505, -9518140, -9599544, -9680717, -9761658,
+ -9842367, -9922843, -10003086, -10083095, -10162870, -10242410,
+ -10321716, -10400786, -10479620, -10558218, -10636579, -10714702,
+ -10792588, -10870236, -10947646, -11024816, -11101747, -11178438,
+ -11254889, -11331100, -11407069, -11482797, -11558283, -11633526,
+ -11708527, -11783286, -11857800, -11932071, -12006098, -12079880,
+ -12153417, -12226708, -12299754, -12372554, -12445108, -12517414,
+ -12589474, -12661286, -12732850, -12804166, -12875233, -12946052,
+ -13016621, -13086941, -13157011, -13226830, -13296399, -13365717,
+ -13434784, -13503600, -13572163, -13640475, -13708534, -13776340,
+ -13843893, -13911193, -13978239, -14045031, -14111569, -14177853,
+ -14243882, -14309655, -14375174, -14440436, -14505443, -14570194,
+ -14634688, -14698926, -14762907, -14826630, -14890096, -14953305,
+ -15016255, -15078948, -15141381, -15203557, -15265473, -15327131,
+ -15388529, -15449667, -15510546, -15571165, -15631524, -15691622,
+ -15751460, -15811036, -15870352, -15929407, -15988200, -16046732,
+ -16105002, -16163010, -16220756, -16278240, -16335461, -16392419,
+ -16449115, -16505548, -16561717, -16617623, -16673266, -16728645,
+ -16783761, -16838612, -16893200, -16947523, -17001582, -17055376,
+ -17108906, -17162171, -17215171, -17267906, -17320376, -17372581,
+ -17424521, -17476195, -17527604, -17578747, -17629624, -17680235,
+ -17730581, -17780660, -17830473, -17880020, -17929301, -17978315,
+ -18027063, -18075545, -18123759, -18171707, -18219389, -18266803,
+ -18313951, -18360832, -18407445, -18453792, -18499872, -18545684,
+ -18591230, -18636508, -18681519, -18726263, -18770739, -18814948,
+ -18858890, -18902565, -18945972, -18989111, -19031984, -19074588,
+ -19116926, -19158996, -19200798, -19242333, -19283601, -19324601,
+ -19365334, -19405799, -19445997, -19485928, -19525591, -19564987,
+ -19604116, -19642977, -19681571, -19719898, -19757958, -19795751,
+ -19833277, -19870535, -19907527, -19944252, -19980710, -20016901,
+ -20052825, -20088483, -20123874, -20158998, -20193856, -20228448,
+ -20262773, -20296832, -20330625, -20364152, -20397413, -20430408,
+ -20463137, -20495600, -20527798, -20559731, -20591397, -20622799,
+ -20653936, -20684807, -20715413, -20745755, -20775832, -20805644,
+ -20835192, -20864476, -20893495, -20922250, -20950741, -20978969,
+ -21006933, -21034633, -21062070, -21089244, -21116155, -21142802,
+ -21169187, -21195310, -21221170, -21246768, -21272103, -21297177,
+ -21321989, -21346540, -21370829, -21394856, -21418623, -21442129,
+ -21465374, -21488359, -21511084, -21533548, -21555753, -21577697,
+ -21599383, -21620809, -21641976, -21662884, -21683533, -21703925,
+ -21724057, -21743932, -21763549, -21782909, -21802011, -21820856,
+ -21839444, -21857776, -21875851, -21893670, -21911233, -21928541,
+ -21945593, -21962390, -21978932, -21995219, -22011252, -22027031,
+ -22042556, -22057827, -22072845, -22087610, -22102121, -22116381,
+ -22130388, -22144143, -22157646, -22170898, -22183899, -22196649,
+ -22209148, -22221397, -22233396, -22245145, -22256645, -22267896,
+ -22278897, -22289651, -22300156, -22310413, -22320423, -22330185,
+ -22339700, -22348969, -22357991, -22366768, -22375298, -22383584,
+ -22391624, -22399419, -22406970, -22414277, -22421341, -22428161,
+ -22434738, -22441072, -22447164, -22453014, -22458622, -22463989,
+ -22469115, -22474000, -22478645, -22483050, -22487216, -22491142,
+ -22494830, -22498279, -22501490, -22504464, -22507200, -22509699,
+ -22511962, -22513988, -22515778, -22517333, -22518653, -22519739,
+ -22520590, -22521207, -22521590, -22521741, -22521659, -22521344,
+ -22520797, -22520019, -22519010, -22517770, -22516300, -22514600,
+ -22512670, -22510511, -22508124, -22505508, -22502665, -22499594,
+ -22496295, -22492771, -22489020, -22485044, -22480842, -22476415,
+ -22471764, -22466889, -22461790, -22456468, -22450923, -22445156,
+ -22439167, -22432957, -22426526, -22419874, -22413003, -22405911,
+ -22398601, -22391072, -22383324, -22375359, -22367176, -22358777,
+ -22350161, -22341329, -22332281, -22323019, -22313542, -22303851,
+ -22293946, -22283828, -22273498, -22262955, -22252201, -22241235,
+ -22230058, -22218671, -22207075, -22195269, -22183254, -22171030,
+ -22158599, -22145961, -22133115, -22120064, -22106806, -22093343,
+ -22079675, -22065802, -22051726, -22037446, -22022963, -22008278,
+ -21993391, -21978302, -21963013, -21947523, -21931833, -21915944,
+ -21899856, -21883569, -21867085, -21850404, -21833525, -21816451,
+ -21799180, -21781715, -21764054, -21746200, -21728152, -21709910,
+ -21691476, -21672850, -21654032, -21635024, -21615825, -21596435,
+ -21576857, -21557089, -21537133, -21516990, -21496659, -21476141,
+ -21455437, -21434548, -21413473, -21392214, -21370770, -21349144,
+ -21327334, -21305342, -21283168, -21260813, -21238277, -21215561,
+ -21192665, -21169590, -21146337, -21122906, -21099297, -21075512,
+ -21051550, -21027412, -21003100, -20978613, -20953951, -20929117,
+ -20904109, -20878929, -20853578, -20828055, -20802361, -20776498,
+ -20750465, -20724263, -20697892, -20671354, -20644649, -20617777,
+ -20590740, -20563536, -20536168, -20508636, -20480939, -20453080,
+ -20425058, -20396874, -20368529, -20340023, -20311356, -20282531,
+ -20253546, -20224402, -20195101, -20165642, -20136027, -20106255,
+ -20076328, -20046246, -20016010, -19985620, -19955077, -19924381,
+ -19893534, -19862535, -19831385, -19800085, -19768635, -19737037,
+ -19705290, -19673395, -19641353, -19609165, -19576830, -19544350,
+ -19511725, -19478957, -19446044, -19412989, -19379791, -19346451,
+ -19312971, -19279349, -19245588, -19211688, -19177648, -19143471,
+ -19109156, -19074704, -19040116, -19005392, -18970533, -18935539,
+ -18900412, -18865152, -18829758, -18794233, -18758576, -18722789,
+ -18686871, -18650824, -18614648, -18578343, -18541911, -18505351,
+ -18468665, -18431853, -18394916, -18357854, -18320668, -18283359,
+ -18245927, -18208373, -18170697, -18132900, -18094983, -18056946,
+ -18018790, -17980515, -17942123, -17903613, -17864987, -17826245,
+ -17787387, -17748414, -17709328, -17670128, -17630815, -17591389,
+ -17551852, -17512204, -17472446, -17432577, -17392600, -17352514,
+ -17312320, -17272019, -17231611, -17191096, -17150477, -17109753,
+ -17068924, -17027992, -16986957, -16945819, -16904580, -16863240,
+ -16821799, -16780258, -16738619, -16696880, -16655044, -16613110,
+ -16571079, -16528953, -16486731, -16444414, -16402002, -16359498,
+ -16316900, -16274209, -16231427, -16188554, -16145591, -16102537,
+ -16059394, -16016163, -15972843, -15929436, -15885943, -15842363,
+ -15798698, -15754947, -15711113, -15667194, -15623193, -15579109,
+ -15534944, -15490697, -15446370, -15401962, -15357476, -15312910,
+ -15268267, -15223546, -15178748, -15133874, -15088925, -15043900,
+ -14998801, -14953628, -14908382, -14863064, -14817673, -14772212,
+ -14726679, -14681077, -14635405, -14589664, -14543855, -14497979,
+ -14452035, -14406025, -14359949, -14313808, -14267603, -14221334,
+ -14175001, -14128606, -14082148, -14035629, -13989049, -13942409,
+ -13895710, -13848951, -13802134, -13755259, -13708327, -13661338,
+ -13614293, -13567193, -13520038, -13472828, -13425566, -13378250,
+ -13330882, -13283462, -13235991, -13188469, -13140898, -13093277,
+ -13045607, -12997890, -12950124, -12902312, -12854453, -12806549,
+ -12758599, -12710605, -12662567, -12614486, -12566362, -12518196,
+ -12469988, -12421739, -12373450, -12325120, -12276752, -12228345,
+ -12179901, -12131418, -12082899, -12034344, -11985753, -11937127,
+ -11888466, -11839772, -11791044, -11742283, -11693491, -11644667,
+ -11595811, -11546926, -11498011, -11449066, -11400093, -11351092,
+ -11302063, -11253007, -11203925, -11154818, -11105685, -11056527,
+ -11007346, -10958141, -10908913, -10859663, -10810391, -10761098,
+ -10711784, -10662451, -10613097, -10563726, -10514335, -10464927,
+ -10415502, -10366060, -10316602, -10267129, -10217641, -10168138,
+ -10118622, -10069092, -10019549, -9969995, -9920429, -9870852,
+ -9821264, -9771667, -9722060, -9672444, -9622820, -9573189, -9523550,
+ -9473905, -9424253, -9374596, -9324935, -9275268, -9225598, -9175925,
+ -9126249, -9076570, -9026890, -8977209, -8927527, -8877845, -8828163,
+ -8778483, -8728804, -8679127, -8629453, -8579781, -8530114, -8480451,
+ -8430792, -8381139, -8331491, -8281850, -8232215, -8182588, -8132969,
+ -8083358, -8033756, -7984164, -7934581, -7885009, -7835448, -7785899,
+ -7736361, -7686836, -7637325, -7587826, -7538342, -7488872, -7439418,
+ -7389979, -7340556, -7291150, -7241761, -7192389, -7143036, -7093701,
+ -7044386, -6995090, -6945814, -6896559, -6847324, -6798112, -6748922,
+ -6699754, -6650609, -6601488, -6552391, -6503318, -6454271, -6405249,
+ -6356253, -6307283, -6258341, -6209425, -6160538, -6111680, -6062850,
+ -6014049, -5965279, -5916538, -5867829, -5819150, -5770504, -5721889,
+ -5673308, -5624759, -5576244, -5527763, -5479316, -5430905, -5382529,
+ -5334189, -5285885, -5237618, -5189388, -5141196, -5093042, -5044927,
+ -4996851, -4948815, -4900818, -4852862, -4804946, -4757072, -4709240,
+ -4661450, -4613702, -4565998, -4518337, -4470720, -4423148, -4375620,
+ -4328137, -4280701, -4233310, -4185966, -4138668, -4091419, -4044217,
+ -3997063, -3949958, -3902902, -3855895, -3808938, -3762032, -3715177,
+ -3668372, -3621619, -3574919, -3528270, -3481675, -3435132, -3388643,
+ -3342209, -3295828, -3249503, -3203233, -3157018, -3110860, -3064757,
+ -3018712, -2972724, -2926794, -2880921, -2835107, -2789352, -2743656,
+ -2698019, -2652442, -2606926, -2561470, -2516076, -2470743, -2425472,
+ -2380263, -2335116, -2290033, -2245013, -2200056, -2155164, -2110336,
+ -2065573, -2020875, -1976243, -1931676, -1887176, -1842743, -1798376,
+ -1754077, -1709845, -1665682, -1621587, -1577560, -1533603, -1489716,
+ -1445898, -1402150, -1358472, -1314866, -1271331, -1227867, -1184475,
+ -1141155, -1097908, -1054733, -1011632, -968604, -925651, -882771,
+ -839966, -797235, -754580, -712001, -669497, -627069, -584718, -542443,
+ -500245, -458125, -416083, -374118, -332232, -290425, -248696, -207047,
+ -165477, -123987, -82577, -41248, 0, 41167, 82253, 123258, 164181,
+ 205021, 245779, 286454, 327046, 367555, 407980, 448322, 488579, 528751,
+ 568839, 608842, 648759, 688591, 728337, 767997, 807570, 847057, 886457,
+ 925770, 964995, 1004132, 1043182, 1082143, 1121016, 1159800, 1198495,
+ 1237101, 1275617, 1314044, 1352381, 1390627, 1428783, 1466848, 1504822,
+ 1542705, 1580496, 1618196, 1655804, 1693320, 1730743, 1768073, 1805311,
+ 1842456, 1879507, 1916465, 1953329, 1990099, 2026775, 2063356, 2099843,
+ 2136235, 2172532, 2208733, 2244839, 2280849, 2316763, 2352582, 2388303,
+ 2423929, 2459457, 2494889, 2530223, 2565460, 2600600, 2635641, 2670585,
+ 2705431, 2740178, 2774827, 2809377, 2843828, 2878180, 2912432, 2946586,
+ 2980639, 3014593, 3048447, 3082201, 3115854, 3149407, 3182859, 3216210,
+ 3249460, 3282609, 3315657, 3348603, 3381447, 3414190, 3446830, 3479368,
+ 3511804, 3544137, 3576368, 3608496, 3640521, 3672443, 3704261, 3735976,
+ 3767588, 3799096, 3830500, 3861800, 3892996, 3924087, 3955074, 3985957,
+ 4016735, 4047408, 4077976, 4108439, 4138797, 4169049, 4199196, 4229238,
+ 4259173, 4289003, 4318727, 4348345, 4377857, 4407262, 4436561, 4465753,
+ 4494839, 4523818, 4552690, 4581455, 4610113, 4638663, 4667107, 4695443,
+ 4723671, 4751792, 4779805, 4807711, 4835508, 4863198, 4890779, 4918253,
+ 4945618, 4972874, 5000022, 5027062, 5053993, 5080815, 5107529, 5134134,
+ 5160630, 5187016, 5213294, 5239463, 5265522, 5291472, 5317313, 5343044,
+ 5368666, 5394178, 5419580, 5444873, 5470056, 5495129, 5520092, 5544946,
+ 5569689, 5594322, 5618845, 5643258, 5667561, 5691754, 5715836, 5739808,
+ 5763669, 5787420, 5811061, 5834590, 5858010, 5881318, 5904517, 5927604,
+ 5950581, 5973446, 5996201, 6018846, 6041379, 6063802, 6086113, 6108314,
+ 6130404, 6152382, 6174250, 6196007, 6217652, 6239187, 6260610, 6281923,
+ 6303124, 6324214, 6345193, 6366061, 6386818, 6407463, 6427998, 6448421,
+ 6468733, 6488934, 6509023, 6529002, 6548869, 6568625, 6588270, 6607804,
+ 6627226, 6646538, 6665738, 6684827, 6703805, 6722672, 6741428, 6760072,
+ 6778606, 6797028, 6815340, 6833540, 6851630, 6869608, 6887476, 6905233,
+ 6922878, 6940413, 6957837, 6975150, 6992353, 7009445, 7026426, 7043296,
+ 7060055, 7076704, 7093243, 7109671, 7125988, 7142195, 7158292, 7174278,
+ 7190154, 7205919, 7221575, 7237120, 7252555, 7267880, 7283095, 7298200,
+ 7313195, 7328080, 7342855, 7357521, 7372077, 7386523, 7400860, 7415087,
+ 7429205, 7443213, 7457112, 7470902, 7484583, 7498154, 7511617, 7524971,
+ 7538215, 7551351, 7564378, 7577297, 7590106, 7602808, 7615401, 7627885,
+ 7640261, 7652529, 7664689, 7676741, 7688685, 7700521, 7712250, 7723870,
+ 7735383, 7746789, 7758087, 7769278, 7780362, 7791338, 7802208, 7812970,
+ 7823626, 7834175, 7844618, 7854953, 7865183, 7875306, 7885323, 7895234,
+ 7905038, 7914737, 7924330, 7933818, 7943200, 7952476, 7961647, 7970713,
+ 7979673, 7988529, 7997280, 8005926, 8014467, 8022904, 8031236, 8039464,
+ 8047588, 8055608, 8063524, 8071336, 8079044, 8086649, 8094151, 8101549,
+ 8108844, 8116036, 8123125, 8130111, 8136995, 8143776, 8150455, 8157031,
+ 8163506, 8169878, 8176149, 8182318, 8188386, 8194352, 8200217, 8205980,
+ 8211643, 8217205, 8222666, 8228027, 8233288, 8238448, 8243508, 8248468,
+ 8253328, 8258089, 8262750, 8267312, 8271775, 8276139, 8280404, 8284570,
+ 8288637, 8292607, 8296478, 8300251, 8303926, 8307503, 8310983, 8314365,
+ 8317650, 8320838, 8323929, 8326924, 8329822, 8332623, 8335328, 8337937,
+ 8340450, 8342867, 8345189, 8347416, 8349547, 8351583, 8353524, 8355371,
+ 8357123, 8358780, 8360344, 8361814, 8363189, 8364471, 8365660, 8366756,
+ 8367758, 8368667, 8369484, 8370208, 8370840, 8371380, 8371828, 8372184,
+ 8372448, 8372621, 8372703, 8372693, 8372593, 8372403, 8372121, 8371750,
+ 8371288, 8370737, 8370096, 8369365, 8368545, 8367636, 8366638, 8365552,
+ 8364377, 8363113, 8361762, 8360323, 8358796, 8357181, 8355479, 8353690,
+ 8351814, 8349852, 8347803, 8345668, 8343446, 8341139, 8338746, 8336268,
+ 8333704, 8331056, 8328322, 8325504, 8322602, 8319615, 8316545, 8313390,
+ 8310152, 8306831, 8303427, 8299939, 8296369, 8292717, 8288982, 8285165,
+ 8281267, 8277286, 8273225, 8269082, 8264858, 8260553, 8256168, 8251703,
+ 8247157, 8242532, 8237827, 8233042, 8228179, 8223236, 8218215, 8213115,
+ 8207936, 8202680, 8197346, 8191934, 8186445, 8180879, 8175235, 8169515,
+ 8163719, 8157846, 8151897, 8145873, 8139772, 8133597, 8127346, 8121021,
+ 8114620, 8108146, 8101597, 8094974, 8088278, 8081508, 8074665, 8067748,
+ 8060759, 8053698, 8046564, 8039358, 8032080, 8024730, 8017309, 8009817,
+ 8002254, 7994621, 7986917, 7979143, 7971299, 7963385, 7955401, 7947349,
+ 7939227, 7931037, 7922778, 7914451, 7906056, 7897593, 7889063, 7880465,
+ 7871800, 7863068, 7854270, 7845406, 7836475, 7827478, 7818416, 7809289,
+ 7800096, 7790839, 7781517, 7772130, 7762680, 7753165, 7743587, 7733946,
+ 7724241, 7714473, 7704643, 7694751, 7684796, 7674779, 7664701, 7654561,
+ 7644360, 7634098, 7623776, 7613393, 7602949, 7592446, 7581884, 7571261,
+ 7560580, 7549840, 7539041, 7528183, 7517268, 7506294, 7495263, 7484174,
+ 7473028, 7461826, 7450566, 7439250, 7427878, 7416451, 7404967, 7393428,
+ 7381834, 7370185, 7358481, 7346723, 7334911, 7323044, 7311125, 7299151,
+ 7287125, 7275046, 7262914, 7250730, 7238493, 7226205, 7213865, 7201474,
+ 7189031, 7176538, 7163994, 7151400, 7138756, 7126062, 7113318, 7100525,
+ 7087683, 7074792, 7061852, 7048864, 7035829, 7022745, 7009613, 6996435,
+ 6983209, 6969937, 6956618, 6943253, 6929841, 6916384, 6902882, 6889334,
+ 6875741, 6862103, 6848421, 6834695, 6820924, 6807110, 6793253, 6779352,
+ 6765408, 6751422, 6737393, 6723322, 6709208, 6695054, 6680857, 6666620,
+ 6652341, 6638022, 6623663, 6609263, 6594823, 6580344, 6565825, 6551267,
+ 6536671, 6522035, 6507361, 6492649, 6477899, 6463112, 6448287, 6433425,
+ 6418526, 6403590, 6388618, 6373610, 6358566, 6343486, 6328371, 6313221,
+ 6298036, 6282817, 6267563, 6252275, 6236953, 6221598, 6206209, 6190787,
+ 6175332, 6159845, 6144325, 6128773, 6113189, 6097574, 6081927, 6066250,
+ 6050541, 6034802, 6019032, 6003233, 5987403, 5971544, 5955656, 5939738,
+ 5923792, 5907817, 5891813, 5875782, 5859722, 5843636, 5827521, 5811380,
+ 5795211, 5779016, 5762795, 5746548, 5730274, 5713975, 5697651, 5681301,
+ 5664927, 5648527, 5632104, 5615656, 5599184, 5582689, 5566170, 5549628,
+ 5533063, 5516476, 5499865, 5483233, 5466579, 5449903, 5433205, 5416486,
+ 5399746, 5382986, 5366204, 5349403, 5332581, 5315740, 5298879, 5281999,
+ 5265099, 5248181, 5231244, 5214289, 5197315, 5180324, 5163315, 5146289,
+ 5129245, 5112184, 5095107, 5078013, 5060903, 5043777, 5026635, 5009478,
+ 4992305, 4975117, 4957915, 4940697, 4923466, 4906220, 4888960, 4871687,
+ 4854400, 4837099, 4819786, 4802460, 4785122, 4767771, 4750409, 4733034,
+ 4715648, 4698250, 4680841, 4663421, 4645991, 4628550, 4611099, 4593638,
+ 4576167, 4558686, 4541196, 4523697, 4506189, 4488673, 4471148, 4453614,
+ 4436073, 4418524, 4400967, 4383403, 4365832, 4348254, 4330669, 4313078,
+ 4295481, 4277877, 4260268, 4242653, 4225033, 4207408, 4189778, 4172143,
+ 4154503, 4136859, 4119212, 4101560, 4083905, 4066246, 4048584, 4030919,
+ 4013251, 3995581, 3977909, 3960234, 3942557, 3924879, 3907199, 3889517,
+ 3871835, 3854152, 3836468, 3818784, 3801099, 3783414, 3765730, 3748046,
+ 3730362, 3712679, 3694997, 3677317, 3659637, 3641960, 3624284, 3606610,
+ 3588938, 3571269, 3553602, 3535938, 3518277, 3500619, 3482965, 3465314,
+ 3447667, 3430024, 3412386, 3394751, 3377121, 3359496, 3341876, 3324261,
+ 3306652, 3289048, 3271450, 3253858, 3236271, 3218692, 3201118, 3183552,
+ 3165992, 3148439, 3130894, 3113356, 3095826, 3078304, 3060790, 3043283,
+ 3025786, 3008297, 2990816, 2973345, 2955883, 2938430, 2920987, 2903553,
+ 2886129, 2868716, 2851312, 2833919, 2816537, 2799165, 2781804, 2764455,
+ 2747116, 2729790, 2712474, 2695171, 2677880, 2660601, 2643334, 2626080,
+ 2608839, 2591610, 2574395, 2557193, 2540004, 2522829, 2505667, 2488520,
+ 2471386, 2454267, 2437162, 2420072, 2402997, 2385936, 2368891, 2351861,
+ 2334846, 2317847, 2300864, 2283896, 2266945, 2250010, 2233091, 2216189,
+ 2199303, 2182435, 2165583, 2148749, 2131932, 2115133, 2098351, 2081587,
+ 2064841, 2048113, 2031404, 2014713, 1998040, 1981387, 1964752, 1948136,
+ 1931540, 1914963, 1898405, 1881867, 1865349, 1848851, 1832373, 1815915,
+ 1799477, 1783060, 1766664, 1750289, 1733935, 1717601, 1701289, 1684999,
+ 1668730, 1652483, 1636257, 1620054, 1603872, 1587713, 1571577, 1555462,
+ 1539371, 1523302, 1507257, 1491234, 1475234, 1459258, 1443306, 1427377,
+ 1411471, 1395590, 1379733, 1363899, 1348091, 1332306, 1316546, 1300811,
+ 1285100, 1269414, 1253754, 1238118, 1222508, 1206923, 1191364, 1175831,
+ 1160323, 1144841, 1129385, 1113956, 1098552, 1083175, 1067825, 1052501,
+ 1037204, 1021934, 1006691, 991475, 976286, 961124, 945990, 930884,
+ 915805, 900754, 885731, 870735, 855768, 840830, 825919, 811037, 796184,
+ 781359, 766563, 751796, 737058, 722349, 707669, 693019, 678398, 663806,
+ 649244, 634712, 620210, 605737, 591295, 576883, 562501, 548149, 533828,
+ 519537, 505277, 491047, 476848, 462681, 448544, 434438, 420364, 406320,
+ 392308, 378328, 364379, 350462, 336576, 322723, 308901, 295111, 281353,
+ 267628, 253934, 240274, 226645, 213049, 199485, 185955, 172457, 158991,
+ 145559, 132160, 118794, 105461, 92161, 78894, 65661, 52462, 39296,
+ 26163, 13064, 0, -13031, -26028, -38991, -51920, -64815, -77676,
+ -90503, -103295, -116053, -128776, -141465, -154119, -166738, -179323,
+ -191873, -204388, -216868, -229313, -241723, -254097, -266437, -278741,
+ -291010, -303244, -315442, -327605, -339732, -351823, -363879, -375899,
+ -387884, -399832, -411745, -423621, -435462, -447266, -459035, -470767,
+ -482463, -494122, -505746, -517333, -528883, -540397, -551875, -563316,
+ -574720, -586088, -597419, -608713, -619971, -631191, -642375, -653522,
+ -664632, -675704, -686740, -697739, -708700, -719625, -730512, -741362,
+ -752174, -762949, -773687, -784387, -795050, -805676, -816264, -826814,
+ -837327, -847802, -858240, -868640, -879002, -889326, -899613, -909862,
+ -920073, -930246, -940381, -950479, -960538, -970560, -980543, -990488,
+ -1000396, -1010265, -1020096, -1029889, -1039644, -1049361, -1059039,
+ -1068680, -1078282, -1087846, -1097371, -1106859, -1116308, -1125718,
+ -1135091, -1144425, -1153720, -1162977, -1172196, -1181376, -1190518,
+ -1199622, -1208687, -1217713, -1226701, -1235651, -1244562, -1253434,
+ -1262268, -1271063, -1279820, -1288538, -1297218, -1305859, -1314462,
+ -1323026, -1331551, -1340038, -1348486, -1356895, -1365266, -1373598,
+ -1381892, -1390147, -1398363, -1406540, -1414680, -1422780, -1430842,
+ -1438865, -1446849, -1454795, -1462702, -1470571, -1478401, -1486192,
+ -1493945, -1501659, -1509334, -1516971, -1524569, -1532129, -1539650,
+ -1547132, -1554576, -1561981, -1569348, -1576676, -1583966, -1591217,
+ -1598429, -1605603, -1612739, -1619836, -1626894, -1633914, -1640896,
+ -1647839, -1654744, -1661610, -1668438, -1675228, -1681979, -1688692,
+ -1695366, -1702002, -1708600, -1715160, -1721681, -1728164, -1734609,
+ -1741016, -1747384, -1753714, -1760007, -1766261, -1772476, -1778654,
+ -1784794, -1790896, -1796959, -1802985, -1808973, -1814923, -1820835,
+ -1826709, -1832545, -1838343, -1844104, -1849826, -1855511, -1861159,
+ -1866768, -1872340, -1877874, -1883371, -1888830, -1894252, -1899636,
+ -1904982, -1910291, -1915563, -1920797, -1925994, -1931154, -1936276,
+ -1941361, -1946409, -1951420, -1956393, -1961329, -1966229, -1971091,
+ -1975916, -1980705, -1985456, -1990171, -1994848, -1999489, -2004093,
+ -2008660, -2013191, -2017685, -2022142, -2026563, -2030947, -2035295,
+ -2039607, -2043881, -2048120, -2052322, -2056488, -2060618, -2064712,
+ -2068769, -2072790, -2076776, -2080725, -2084638, -2088516, -2092357,
+ -2096163, -2099933, -2103667, -2107366, -2111029, -2114656, -2118248,
+ -2121804, -2125325, -2128811, -2132261, -2135676, -2139056, -2142400,
+ -2145710, -2148984, -2152224, -2155428, -2158598, -2161732, -2164832,
+ -2167897, -2170928, -2173923, -2176885, -2179811, -2182703, -2185561,
+ -2188385, -2191174, -2193929, -2196649, -2199336, -2201988, -2204607,
+ -2207191, -2209742, -2212258, -2214741, -2217191, -2219606, -2221988,
+ -2224337, -2226652, -2228933, -2231181, -2233396, -2235578, -2237727,
+ -2239842, -2241924, -2243974, -2245990, -2247974, -2249924, -2251842,
+ -2253728, -2255581, -2257401, -2259189, -2260944, -2262667, -2264358,
+ -2266016, -2267643, -2269237, -2270800, -2272330, -2273828, -2275295,
+ -2276730, -2278133, -2279505, -2280845, -2282154, -2283431, -2284677,
+ -2285892, -2287076, -2288228, -2289350, -2290440, -2291499, -2292528,
+ -2293526, -2294493, -2295430, -2296336, -2297211, -2298057, -2298871,
+ -2299656, -2300410, -2301135, -2301829, -2302493, -2303128, -2303732,
+ -2304307, -2304852, -2305368, -2305854, -2306310, -2306738, -2307135,
+ -2307504, -2307844, -2308154, -2308436, -2308688, -2308912, -2309107,
+ -2309273, -2309411, -2309520, -2309601, -2309653, -2309677, -2309673,
+ -2309640, -2309580, -2309492, -2309375, -2309231, -2309059, -2308860,
+ -2308633, -2308378, -2308096, -2307786, -2307449, -2307086, -2306694,
+ -2306276, -2305831, -2305359, -2304861, -2304335, -2303783, -2303205,
+ -2302600, -2301968, -2301310, -2300626, -2299916, -2299180, -2298418,
+ -2297630, -2296816, -2295976, -2295111, -2294220, -2293304, -2292362,
+ -2291395, -2290403, -2289386, -2288343, -2287276, -2286183, -2285066,
+ -2283924, -2282758, -2281567, -2280351, -2279111, -2277847, -2276558,
+ -2275246, -2273909, -2272548, -2271164, -2269755, -2268323, -2266868,
+ -2265388, -2263886, -2262360, -2260810, -2259238, -2257642, -2256023,
+ -2254382, -2252717, -2251030, -2249320, -2247587, -2245832, -2244055,
+ -2242255, -2240433, -2238589, -2236722, -2234834, -2232924, -2230992,
+ -2229038, -2227063, -2225066, -2223047, -2221007, -2218946, -2216864,
+ -2214760, -2212636, -2210490, -2208324, -2206137, -2203929, -2201701,
+ -2199452, -2197183, -2194893, -2192584, -2190254, -2187904, -2185533,
+ -2183144, -2180734, -2178304, -2175855, -2173387, -2170899, -2168391,
+ -2165865, -2163319, -2160754, -2158170, -2155567, -2152945, -2150305,
+ -2147646, -2144968, -2142272, -2139557, -2136824, -2134073, -2131304,
+ -2128517, -2125712, -2122889, -2120048, -2117189, -2114313, -2111420,
+ -2108509, -2105581, -2102635, -2099672, -2096693, -2093696, -2090682,
+ -2087652, -2084605, -2081541, -2078461, -2075364, -2072251, -2069122,
+ -2065976, -2062815, -2059637, -2056444, -2053234, -2050009, -2046769,
+ -2043513, -2040241, -2036954, -2033651, -2030334, -2027001, -2023654,
+ -2020291, -2016913, -2013521, -2010114, -2006693, -2003257, -1999806,
+ -1996342, -1992863, -1989370, -1985863, -1982341, -1978806, -1975258,
+ -1971695, -1968119, -1964529, -1960926, -1957310, -1953680, -1950037,
+ -1946381, -1942712, -1939030, -1935336, -1931628, -1927908, -1924175,
+ -1920430, -1916672, -1912902, -1909120, -1905326, -1901520, -1897701,
+ -1893871, -1890029, -1886175, -1882310, -1878433, -1874545, -1870645,
+ -1866734, -1862812, -1858879, -1854935, -1850980, -1847014, -1843037,
+ -1839050, -1835051, -1831043, -1827024, -1822995, -1818955, -1814905,
+ -1810845, -1806776, -1802696, -1798606, -1794507, -1790398, -1786280,
+ -1782152, -1778014, -1773867, -1769711, -1765546, -1761372, -1757189,
+ -1752997, -1748796, -1744586, -1740368, -1736141, -1731905, -1727662,
+ -1723409, -1719149, -1714880, -1710604, -1706319, -1702027, -1697726,
+ -1693418, -1689102, -1684779, -1680448, -1676110, -1671764, -1667411,
+ -1663051, -1658684, -1654310, -1649929, -1645540, -1641146, -1636744,
+ -1632336, -1627921, -1623500, -1619073, -1614639, -1610199, -1605753,
+ -1601301, -1596843, -1592378, -1587909, -1583433, -1578952, -1574465,
+ -1569972, -1565474, -1560971, -1556463, -1551949, -1547430, -1542906,
+ -1538377, -1533844, -1529305, -1524762, -1520214, -1515662, -1511105,
+ -1506543, -1501977, -1497407, -1492833, -1488255, -1483672, -1479086,
+ -1474495, -1469901, -1465303, -1460702, -1456097, -1451488, -1446876,
+ -1442260, -1437641, -1433019, -1428394, -1423766, -1419135, -1414500,
+ -1409863, -1405223, -1400581, -1395935, -1391288, -1386637, -1381984,
+ -1377329, -1372672, -1368012, -1363350, -1358687, -1354021, -1349353,
+ -1344683, -1340012, -1335339, -1330664, -1325987, -1321310, -1316630,
+ -1311950, -1307267, -1302584, -1297900, -1293214, -1288528, -1283840,
+ -1279152, -1274463, -1269773, -1265082, -1260391, -1255699, -1251007,
+ -1246314, -1241621, -1236928, -1232234, -1227540, -1222847, -1218153,
+ -1213459, -1208765, -1204072, -1199379, -1194686, -1189993, -1185301,
+ -1180609, -1175918, -1171228, -1166538, -1161849, -1157161, -1152474,
+ -1147787, -1143102, -1138418, -1133735, -1129053, -1124372, -1119693,
+ -1115015, -1110338, -1105663, -1100990, -1096318, -1091648, -1086979,
+ -1082313, -1077648, -1072985, -1068324, -1063665, -1059009, -1054354,
+ -1049702, -1045052, -1040404, -1035759, -1031116, -1026476, -1021838,
+ -1017203, -1012571, -1007941, -1003314, -998690, -994069, -989451,
+ -984836, -980224, -975615, -971009, -966407, -961808, -957212, -952620,
+ -948031, -943445, -938863, -934285, -929711, -925140, -920573, -916010,
+ -911451, -906895, -902344, -897797, -893254, -888715, -884180, -879650,
+ -875123, -870602, -866084, -861571, -857063, -852559, -848060, -843565,
+ -839075, -834590, -830110, -825634, -821164, -816698, -812237, -807782,
+ -803331, -798886, -794446, -790011, -785581, -781157, -776738, -772325,
+ -767917, -763514, -759117, -754726, -750341, -745961, -741586, -737218,
+ -732855, -728499, -724148, -719803, -715464, -711132, -706805, -702484,
+ -698170, -693862, -689560, -685265, -680975, -676693, -672416, -668146,
+ -663883, -659626, -655376, -651132, -646895, -642665, -638442, -634225,
+ -630015, -625812, -621616, -617427, -613245, -609070, -604902, -600741,
+ -596587, -592440, -588301, -584169, -580044, -575926, -571816, -567713,
+ -563618, -559530, -555449, -551376, -547311, -543253, -539203, -535161,
+ -531126, -527099, -523080, -519069, -515065, -511069, -507082, -503102,
+ -499130, -495166, -491210, -487262, -483323, -479391, -475468, -471553,
+ -467646, -463747, -459857, -455974, -452101, -448235, -444378, -440530,
+ -436690, -432858, -429035, -425220, -421414, -417617, -413828, -410048,
+ -406276, -402514, -398760, -395014, -391278, -387550, -383832, -380122,
+ -376421, -372728, -369045, -365371, -361706, -358050, -354402, -350764,
+ -347135, -343515, -339904, -336303, -332710, -329127, -325553, -321988,
+ -318433, -314886, -311350, -307822, -304304, -300795, -297295, -293805,
+ -290325, -286854, -283392, -279940, -276497, -273064, -269641, -266227,
+ -262822, -259427, -256042, -252667, -249301, -245945, -242599, -239262,
+ -235935, -232618, -229310, -226013, -222725, -219447, -216179, -212920,
+ -209672, -206433, -203205, -199986, -196777, -193578, -190389, -187210,
+ -184041, -180882, -177733, -174594, -171466, -168347, -165238, -162139,
+ -159051, -155972, -152904, -149846, -146798, -143760, -140732, -137714,
+ -134707, -131710, -128723, -125746, -122779, -119823, -116877, -113941,
+ -111016, -108100, -105195, -102301, -99416, -96542, -93678, -90825,
+ -87982, -85149, -82327, -79515, -76713, -73922, -71141, -68370, -65610,
+ -62860, -60121, -57392, -54674, -51966, -49268, -46581, -43904, -41238,
+ -38582, -35936, -33301, -30677, -28063, -25459, -22866, -20283, -17711,
+ -15149, -12598, -10057, -7527, -5007, -2498, 0
+};
+
+const int32_t filter_data_P[32769] = {
+ 0, -1248, -2498, -3752, -5007, -6266, -7527, -8790, -10057, -11325,
+ -12597, -13870, -15147, -16426, -17707, -18991, -20277, -21566, -22857,
+ -24151, -25447, -26746, -28047, -29350, -30656, -31964, -33275, -34588,
+ -35903, -37221, -38541, -39863, -41188, -42515, -43844, -45176, -46510,
+ -47846, -49184, -50525, -51868, -53213, -54560, -55910, -57261, -58615,
+ -59971, -61330, -62690, -64053, -65417, -66784, -68153, -69524, -70897,
+ -72272, -73649, -75028, -76410, -77793, -79178, -80565, -81955, -83346,
+ -84739, -86134, -87531, -88930, -90331, -91734, -93139, -94545, -95954,
+ -97364, -98776, -100190, -101606, -103024, -104443, -105864, -107287,
+ -108712, -110138, -111567, -112997, -114428, -115861, -117296, -118733,
+ -120171, -121611, -123053, -124496, -125940, -127387, -128835, -130284,
+ -131735, -133188, -134642, -136097, -137554, -139013, -140473, -141934,
+ -143397, -144861, -146327, -147794, -149262, -150732, -152203, -153676,
+ -155150, -156625, -158101, -159579, -161058, -162538, -164020, -165503,
+ -166986, -168472, -169958, -171445, -172934, -174424, -175915, -177407,
+ -178900, -180394, -181889, -183385, -184883, -186381, -187880, -189381,
+ -190882, -192384, -193888, -195392, -196897, -198403, -199910, -201417,
+ -202926, -204435, -205945, -207456, -208968, -210481, -211994, -213508,
+ -215023, -216539, -218055, -219572, -221090, -222608, -224127, -225646,
+ -227166, -228687, -230208, -231730, -233253, -234776, -236299, -237823,
+ -239347, -240872, -242397, -243923, -245449, -246976, -248503, -250030,
+ -251557, -253085, -254614, -256142, -257671, -259200, -260729, -262259,
+ -263789, -265319, -266849, -268379, -269910, -271440, -272971, -274502,
+ -276033, -277564, -279094, -280625, -282157, -283688, -285218, -286749,
+ -288280, -289811, -291342, -292872, -294403, -295933, -297463, -298993,
+ -300523, -302053, -303582, -305111, -306640, -308169, -309697, -311225,
+ -312752, -314280, -315806, -317333, -318859, -320385, -321910, -323435,
+ -324959, -326483, -328006, -329528, -331051, -332572, -334093, -335614,
+ -337133, -338652, -340171, -341689, -343206, -344722, -346238, -347753,
+ -349267, -350780, -352293, -353804, -355315, -356825, -358334, -359843,
+ -361350, -362856, -364362, -365866, -367370, -368872, -370374, -371874,
+ -373373, -374872, -376369, -377865, -379360, -380853, -382346, -383837,
+ -385327, -386816, -388304, -389790, -391275, -392759, -394242, -395723,
+ -397203, -398681, -400158, -401633, -403107, -404580, -406051, -407521,
+ -408989, -410456, -411921, -413384, -414846, -416306, -417765, -419222,
+ -420677, -422131, -423583, -425033, -426482, -427928, -429373, -430816,
+ -432258, -433697, -435135, -436570, -438004, -439436, -440866, -442294,
+ -443720, -445144, -446566, -447986, -449404, -450820, -452234, -453645,
+ -455055, -456462, -457867, -459270, -460671, -462069, -463466, -464860,
+ -466251, -467641, -469028, -470413, -471795, -473175, -474553, -475928,
+ -477300, -478671, -480038, -481404, -482766, -484127, -485484, -486839,
+ -488192, -489542, -490889, -492233, -493575, -494914, -496251, -497584,
+ -498915, -500243, -501569, -502891, -504211, -505528, -506842, -508153,
+ -509461, -510766, -512068, -513367, -514664, -515957, -517247, -518534,
+ -519818, -521099, -522377, -523652, -524924, -526192, -527457, -528719,
+ -529978, -531234, -532486, -533735, -534980, -536223, -537462, -538697,
+ -539930, -541158, -542384, -543606, -544824, -546039, -547251, -548459,
+ -549663, -550864, -552061, -553255, -554445, -555631, -556814, -557993,
+ -559169, -560340, -561508, -562672, -563833, -564989, -566142, -567291,
+ -568436, -569577, -570714, -571848, -572977, -574102, -575224, -576341,
+ -577455, -578564, -579670, -580771, -581868, -582961, -584050, -585135,
+ -586216, -587293, -588365, -589433, -590497, -591556, -592612, -593663,
+ -594709, -595752, -596790, -597823, -598852, -599877, -600898, -601913,
+ -602925, -603932, -604934, -605932, -606926, -607914, -608899, -609878,
+ -610853, -611823, -612789, -613750, -614706, -615658, -616605, -617547,
+ -618484, -619417, -620344, -621267, -622185, -623099, -624007, -624910,
+ -625809, -626702, -627591, -628474, -629353, -630226, -631095, -631959,
+ -632817, -633670, -634519, -635362, -636200, -637032, -637860, -638682,
+ -639500, -640312, -641118, -641920, -642716, -643507, -644293, -645073,
+ -645848, -646617, -647381, -648140, -648893, -649641, -650383, -651120,
+ -651852, -652578, -653298, -654013, -654722, -655426, -656124, -656816,
+ -657503, -658184, -658859, -659529, -660193, -660851, -661504, -662151,
+ -662792, -663427, -664057, -664680, -665298, -665910, -666516, -667116,
+ -667710, -668299, -668881, -669457, -670028, -670592, -671151, -671703,
+ -672250, -672790, -673324, -673852, -674374, -674890, -675400, -675904,
+ -676401, -676892, -677377, -677856, -678329, -678795, -679255, -679709,
+ -680157, -680598, -681033, -681461, -681883, -682299, -682708, -683111,
+ -683508, -683898, -684282, -684659, -685030, -685394, -685752, -686103,
+ -686447, -686785, -687117, -687442, -687760, -688072, -688377, -688675,
+ -688967, -689252, -689530, -689802, -690067, -690325, -690577, -690821,
+ -691059, -691290, -691515, -691732, -691943, -692146, -692343, -692533,
+ -692717, -692893, -693062, -693225, -693380, -693529, -693670, -693805,
+ -693932, -694053, -694167, -694273, -694373, -694465, -694550, -694628,
+ -694700, -694764, -694820, -694870, -694913, -694948, -694976, -694997,
+ -695011, -695018, -695017, -695010, -694994, -694972, -694942, -694906,
+ -694861, -694810, -694751, -694685, -694611, -694530, -694442, -694346,
+ -694243, -694133, -694015, -693890, -693757, -693617, -693469, -693314,
+ -693151, -692981, -692804, -692619, -692426, -692226, -692018, -691803,
+ -691580, -691349, -691111, -690866, -690613, -690352, -690083, -689807,
+ -689523, -689232, -688933, -688626, -688312, -687990, -687660, -687322,
+ -686977, -686624, -686263, -685895, -685518, -685134, -684742, -684343,
+ -683935, -683520, -683097, -682666, -682228, -681781, -681327, -680864,
+ -680394, -679916, -679430, -678937, -678435, -677926, -677408, -676883,
+ -676349, -675808, -675259, -674702, -674137, -673564, -672983, -672394,
+ -671797, -671192, -670579, -669958, -669329, -668692, -668047, -667394,
+ -666733, -666064, -665386, -664701, -664008, -663307, -662597, -661880,
+ -661154, -660420, -659678, -658929, -658171, -657404, -656630, -655848,
+ -655057, -654259, -653452, -652637, -651814, -650983, -650144, -649296,
+ -648440, -647577, -646705, -645824, -644936, -644039, -643135, -642222,
+ -641301, -640371, -639434, -638488, -637534, -636572, -635601, -634623,
+ -633636, -632641, -631637, -630626, -629606, -628578, -627542, -626497,
+ -625445, -624384, -623314, -622237, -621151, -620057, -618955, -617844,
+ -616726, -615599, -614463, -613320, -612168, -611008, -609839, -608663,
+ -607478, -606285, -605083, -603873, -602655, -601429, -600195, -598952,
+ -597701, -596441, -595174, -593898, -592613, -591321, -590020, -588711,
+ -587394, -586068, -584734, -583392, -582042, -580683, -579316, -577941,
+ -576557, -575166, -573766, -572357, -570941, -569516, -568083, -566641,
+ -565192, -563734, -562268, -560794, -559311, -557820, -556321, -554814,
+ -553298, -551775, -550243, -548702, -547154, -545597, -544032, -542459,
+ -540878, -539288, -537691, -536085, -534471, -532848, -531218, -529579,
+ -527932, -526277, -524614, -522943, -521263, -519575, -517879, -516175,
+ -514463, -512743, -511015, -509278, -507533, -505781, -504020, -502251,
+ -500474, -498689, -496895, -495094, -493284, -491467, -489641, -487808,
+ -485966, -484116, -482259, -480393, -478519, -476637, -474747, -472850,
+ -470944, -469030, -467108, -465179, -463241, -461295, -459342, -457380,
+ -455410, -453433, -451448, -449454, -447453, -445444, -443427, -441403,
+ -439370, -437330, -435281, -433225, -431161, -429089, -427010, -424922,
+ -422827, -420724, -418613, -416495, -414368, -412234, -410093, -407943,
+ -405786, -403621, -401449, -399268, -397081, -394885, -392682, -390471,
+ -388253, -386027, -383793, -381552, -379303, -377047, -374783, -372511,
+ -370232, -367946, -365652, -363350, -361041, -358725, -356401, -354070,
+ -351731, -349385, -347032, -344671, -342302, -339927, -337544, -335153,
+ -332756, -330351, -327939, -325519, -323092, -320658, -318217, -315768,
+ -313313, -310850, -308380, -305903, -303418, -300927, -298428, -295922,
+ -293410, -290890, -288363, -285829, -283288, -280740, -278185, -275623,
+ -273054, -270478, -267895, -265306, -262709, -260106, -257495, -254878,
+ -252254, -249623, -246986, -244341, -241690, -239032, -236368, -233696,
+ -231018, -228333, -225642, -222944, -220240, -217528, -214811, -212086,
+ -209355, -206618, -203874, -201124, -198367, -195604, -192834, -190058,
+ -187275, -184486, -181691, -178889, -176081, -173267, -170447, -167620,
+ -164787, -161948, -159102, -156251, -153393, -150529, -147659, -144783,
+ -141901, -139013, -136119, -133219, -130312, -127400, -124482, -121558,
+ -118628, -115692, -112751, -109803, -106850, -103891, -100926, -97955,
+ -94979, -91997, -89009, -86016, -83017, -80012, -77002, -73986, -70965,
+ -67938, -64906, -61868, -58825, -55776, -52722, -49662, -46598, -43527,
+ -40452, -37371, -34285, -31194, -28098, -24996, -21889, -18777, -15660,
+ -12538, -9411, -6279, -3142, 0, 3147, 6299, 9456, 12618, 15784, 18956,
+ 22132, 25313, 28499, 31690, 34885, 38085, 41290, 44499, 47713, 50931,
+ 54154, 57382, 60614, 63850, 67091, 70336, 73586, 76840, 80098, 83361,
+ 86628, 89899, 93174, 96454, 99738, 103026, 106317, 109613, 112913,
+ 116218, 119526, 122838, 126153, 129473, 132797, 136125, 139456, 142791,
+ 146130, 149473, 152819, 156169, 159522, 162880, 166241, 169605, 172973,
+ 176344, 179719, 183097, 186479, 189864, 193252, 196644, 200039, 203437,
+ 206839, 210243, 213651, 217062, 220476, 223893, 227313, 230736, 234162,
+ 237591, 241023, 244457, 247895, 251335, 254779, 258224, 261673, 265124,
+ 268578, 272035, 275494, 278956, 282420, 285887, 289356, 292828, 296302,
+ 299778, 303257, 306738, 310221, 313706, 317194, 320684, 324176, 327670,
+ 331166, 334664, 338164, 341666, 345170, 348676, 352184, 355693, 359205,
+ 362718, 366233, 369749, 373268, 376787, 380309, 383832, 387356, 390882,
+ 394410, 397938, 401469, 405000, 408533, 412067, 415602, 419139, 422677,
+ 426216, 429755, 433296, 436839, 440382, 443926, 447470, 451016, 454563,
+ 458110, 461659, 465208, 468757, 472308, 475859, 479410, 482962, 486515,
+ 490068, 493622, 497176, 500730, 504285, 507840, 511395, 514951, 518507,
+ 522062, 525618, 529175, 532731, 536287, 539843, 543399, 546955, 550511,
+ 554067, 557622, 561177, 564732, 568287, 571841, 575395, 578948, 582501,
+ 586054, 589605, 593157, 596707, 600257, 603807, 607355, 610903, 614450,
+ 617996, 621541, 625085, 628629, 632171, 635712, 639252, 642791, 646329,
+ 649866, 653401, 656936, 660468, 664000, 667530, 671059, 674586, 678111,
+ 681636, 685158, 688679, 692198, 695716, 699232, 702746, 706258, 709768,
+ 713276, 716783, 720287, 723790, 727290, 730789, 734285, 737779, 741271,
+ 744760, 748247, 751732, 755215, 758695, 762172, 765648, 769120, 772590,
+ 776058, 779522, 782984, 786444, 789900, 793354, 796805, 800253, 803698,
+ 807140, 810579, 814015, 817448, 820878, 824304, 827728, 831148, 834565,
+ 837978, 841388, 844795, 848198, 851598, 854994, 858387, 861776, 865161,
+ 868543, 871921, 875295, 878665, 882031, 885394, 888752, 892107, 895458,
+ 898804, 902146, 905485, 908819, 912148, 915474, 918795, 922112, 925425,
+ 928733, 932036, 935335, 938630, 941920, 945205, 948485, 951761, 955032,
+ 958299, 961560, 964816, 968068, 971315, 974556, 977793, 981025, 984251,
+ 987472, 990688, 993899, 997104, 1000304, 1003499, 1006689, 1009872,
+ 1013051, 1016224, 1019391, 1022552, 1025708, 1028859, 1032003, 1035142,
+ 1038275, 1041402, 1044523, 1047638, 1050747, 1053851, 1056948, 1060039,
+ 1063123, 1066202, 1069274, 1072341, 1075400, 1078454, 1081501, 1084541,
+ 1087576, 1090603, 1093624, 1096639, 1099646, 1102647, 1105642, 1108629,
+ 1111610, 1114584, 1117551, 1120511, 1123465, 1126411, 1129350, 1132282,
+ 1135207, 1138125, 1141035, 1143938, 1146834, 1149723, 1152604, 1155478,
+ 1158344, 1161203, 1164055, 1166898, 1169735, 1172563, 1175384, 1178197,
+ 1181002, 1183800, 1186589, 1189371, 1192145, 1194910, 1197668, 1200418,
+ 1203159, 1205893, 1208618, 1211335, 1214044, 1216745, 1219437, 1222121,
+ 1224796, 1227463, 1230121, 1232771, 1235412, 1238045, 1240669, 1243284,
+ 1245891, 1248489, 1251078, 1253658, 1256229, 1258792, 1261345, 1263889,
+ 1266425, 1268951, 1271468, 1273976, 1276475, 1278964, 1281444, 1283915,
+ 1286377, 1288829, 1291271, 1293704, 1296128, 1298542, 1300947, 1303342,
+ 1305727, 1308102, 1310468, 1312824, 1315170, 1317506, 1319833, 1322149,
+ 1324456, 1326752, 1329038, 1331315, 1333581, 1335837, 1338083, 1340318,
+ 1342544, 1344758, 1346963, 1349157, 1351341, 1353514, 1355677, 1357829,
+ 1359971, 1362102, 1364223, 1366332, 1368431, 1370520, 1372597, 1374664,
+ 1376719, 1378764, 1380798, 1382821, 1384833, 1386834, 1388823, 1390802,
+ 1392770, 1394726, 1396671, 1398604, 1400527, 1402438, 1404338, 1406226,
+ 1408103, 1409968, 1411822, 1413664, 1415495, 1417314, 1419121, 1420917,
+ 1422701, 1424473, 1426233, 1427982, 1429719, 1431443, 1433156, 1434857,
+ 1436546, 1438223, 1439887, 1441540, 1443180, 1444809, 1446425, 1448028,
+ 1449620, 1451199, 1452766, 1454320, 1455862, 1457392, 1458909, 1460414,
+ 1461906, 1463385, 1464852, 1466306, 1467748, 1469177, 1470593, 1471996,
+ 1473386, 1474764, 1476129, 1477480, 1478819, 1480145, 1481458, 1482758,
+ 1484045, 1485319, 1486579, 1487827, 1489061, 1490282, 1491490, 1492684,
+ 1493865, 1495033, 1496187, 1497328, 1498456, 1499570, 1500671, 1501758,
+ 1502831, 1503891, 1504938, 1505970, 1506989, 1507995, 1508986, 1509964,
+ 1510928, 1511878, 1512814, 1513737, 1514645, 1515540, 1516420, 1517287,
+ 1518139, 1518978, 1519802, 1520613, 1521409, 1522191, 1522959, 1523712,
+ 1524451, 1525177, 1525887, 1526584, 1527266, 1527933, 1528587, 1529225,
+ 1529850, 1530460, 1531055, 1531636, 1532202, 1532754, 1533291, 1533813,
+ 1534321, 1534814, 1535292, 1535755, 1536204, 1536638, 1537057, 1537461,
+ 1537851, 1538225, 1538585, 1538929, 1539259, 1539574, 1539873, 1540158,
+ 1540427, 1540682, 1540921, 1541145, 1541354, 1541548, 1541726, 1541890,
+ 1542038, 1542171, 1542288, 1542390, 1542477, 1542549, 1542605, 1542646,
+ 1542671, 1542681, 1542675, 1542654, 1542617, 1542565, 1542497, 1542414,
+ 1542315, 1542200, 1542070, 1541924, 1541763, 1541586, 1541393, 1541184,
+ 1540959, 1540719, 1540463, 1540191, 1539904, 1539600, 1539281, 1538945,
+ 1538594, 1538227, 1537844, 1537445, 1537030, 1536599, 1536152, 1535689,
+ 1535209, 1534714, 1534203, 1533676, 1533132, 1532572, 1531997, 1531405,
+ 1530796, 1530172, 1529531, 1528875, 1528202, 1527512, 1526807, 1526085,
+ 1525347, 1524592, 1523821, 1523034, 1522230, 1521411, 1520574, 1519721,
+ 1518852, 1517967, 1517065, 1516146, 1515211, 1514260, 1513292, 1512307,
+ 1511306, 1510289, 1509255, 1508204, 1507137, 1506053, 1504953, 1503836,
+ 1502702, 1501552, 1500385, 1499201, 1498001, 1496784, 1495551, 1494300,
+ 1493033, 1491750, 1490449, 1489132, 1487798, 1486448, 1485080, 1483696,
+ 1482295, 1480878, 1479443, 1477992, 1476524, 1475039, 1473537, 1472019,
+ 1470483, 1468931, 1467362, 1465776, 1464173, 1462554, 1460917, 1459264,
+ 1457593, 1455906, 1454202, 1452481, 1450743, 1448988, 1447217, 1445428,
+ 1443622, 1441800, 1439960, 1438104, 1436230, 1434340, 1432433, 1430508,
+ 1428567, 1426609, 1424634, 1422642, 1420633, 1418607, 1416564, 1414504,
+ 1412427, 1410333, 1408222, 1406094, 1403949, 1401787, 1399608, 1397412,
+ 1395199, 1392969, 1390722, 1388459, 1386178, 1383880, 1381565, 1379233,
+ 1376884, 1374519, 1372136, 1369736, 1367320, 1364886, 1362435, 1359968,
+ 1357483, 1354981, 1352463, 1349927, 1347375, 1344805, 1342219, 1339616,
+ 1336995, 1334358, 1331704, 1329033, 1326345, 1323640, 1320918, 1318179,
+ 1315424, 1312651, 1309862, 1307055, 1304232, 1301392, 1298535, 1295661,
+ 1292770, 1289863, 1286938, 1283997, 1281039, 1278064, 1275073, 1272064,
+ 1269039, 1265997, 1262938, 1259862, 1256770, 1253661, 1250535, 1247392,
+ 1244233, 1241057, 1237864, 1234654, 1231428, 1228185, 1224926, 1221650,
+ 1218357, 1215047, 1211721, 1208379, 1205020, 1201644, 1198251, 1194842,
+ 1191417, 1187975, 1184516, 1181041, 1177550, 1174042, 1170517, 1166977,
+ 1163419, 1159845, 1156255, 1152649, 1149026, 1145387, 1141731, 1138059,
+ 1134371, 1130666, 1126945, 1123208, 1119455, 1115685, 1111900, 1108098,
+ 1104279, 1100445, 1096595, 1092728, 1088845, 1084947, 1081032, 1077101,
+ 1073154, 1069191, 1065212, 1061217, 1057206, 1053179, 1049136, 1045078,
+ 1041003, 1036913, 1032807, 1028685, 1024547, 1020393, 1016224, 1012039,
+ 1007838, 1003622, 999389, 995142, 990878, 986599, 982305, 977995,
+ 973669, 969328, 964971, 960599, 956212, 951809, 947391, 942957, 938508,
+ 934044, 929564, 925069, 920559, 916034, 911494, 906938, 902368, 897782,
+ 893181, 888565, 883934, 879288, 874627, 869952, 865261, 860555, 855835,
+ 851100, 846350, 841585, 836806, 832011, 827202, 822379, 817541, 812688,
+ 807821, 802939, 798043, 793132, 788207, 783267, 778313, 773345, 768362,
+ 763365, 758354, 753329, 748289, 743236, 738168, 733086, 727990, 722880,
+ 717756, 712618, 707467, 702301, 697122, 691928, 686721, 681501, 676266,
+ 671018, 665756, 660481, 655192, 649890, 644574, 639244, 633902, 628545,
+ 623176, 617793, 612397, 606988, 601565, 596130, 590681, 585219, 579744,
+ 574257, 568756, 563242, 557715, 552176, 546624, 541059, 535481, 529891,
+ 524288, 518672, 513044, 507403, 501750, 496084, 490406, 484716, 479013,
+ 473298, 467571, 461832, 456080, 450317, 444541, 438753, 432954, 427142,
+ 421318, 415483, 409636, 403777, 397907, 392024, 386131, 380225, 374308,
+ 368380, 362440, 356489, 350526, 344552, 338567, 332571, 326563, 320544,
+ 314515, 308474, 302422, 296360, 290286, 284202, 278107, 272001, 265884,
+ 259757, 253619, 247471, 241312, 235143, 228963, 222773, 216573, 210362,
+ 204141, 197911, 191670, 185419, 179157, 172886, 166606, 160315, 154014,
+ 147704, 141384, 135054, 128715, 122367, 116008, 109641, 103264, 96877,
+ 90482, 84077, 77663, 71240, 64808, 58366, 51916, 45457, 38989, 32513,
+ 26027, 19533, 13031, 6519, 0, -6528, -13064, -19609, -26163, -32724,
+ -39294, -45872, -52458, -59052, -65654, -72263, -78881, -85507, -92140,
+ -98781, -105429, -112085, -118748, -125419, -132098, -138783, -145476,
+ -152176, -158884, -165598, -172319, -179048, -185783, -192525, -199274,
+ -206030, -212792, -219561, -226337, -233119, -239907, -246702, -253503,
+ -260310, -267124, -273944, -280770, -287601, -294439, -301283, -308132,
+ -314987, -321848, -328715, -335587, -342464, -349347, -356236, -363130,
+ -370029, -376933, -383842, -390757, -397676, -404600, -411530, -418464,
+ -425403, -432346, -439294, -446247, -453204, -460166, -467132, -474102,
+ -481076, -488055, -495038, -502024, -509015, -516010, -523008, -530011,
+ -537017, -544026, -551040, -558056, -565076, -572100, -579127, -586157,
+ -593190, -600227, -607266, -614308, -621354, -628402, -635453, -642506,
+ -649563, -656621, -663683, -670746, -677813, -684881, -691952, -699024,
+ -706099, -713176, -720255, -727336, -734418, -741502, -748588, -755676,
+ -762765, -769856, -776947, -784041, -791135, -798231, -805328, -812426,
+ -819524, -826624, -833725, -840826, -847928, -855031, -862134, -869237,
+ -876341, -883446, -890550, -897655, -904760, -911865, -918970, -926075,
+ -933180, -940284, -947389, -954492, -961596, -968698, -975801, -982902,
+ -990003, -997103, -1004202, -1011300, -1018397, -1025493, -1032588,
+ -1039681, -1046774, -1053864, -1060954, -1068042, -1075128, -1082212,
+ -1089295, -1096376, -1103455, -1110531, -1117606, -1124679, -1131750,
+ -1138818, -1145884, -1152947, -1160008, -1167066, -1174122, -1181175,
+ -1188225, -1195272, -1202317, -1209358, -1216396, -1223431, -1230463,
+ -1237491, -1244516, -1251537, -1258555, -1265570, -1272580, -1279587,
+ -1286590, -1293589, -1300584, -1307575, -1314562, -1321544, -1328522,
+ -1335496, -1342465, -1349430, -1356390, -1363346, -1370297, -1377243,
+ -1384183, -1391119, -1398050, -1404976, -1411897, -1418812, -1425722,
+ -1432626, -1439525, -1446418, -1453306, -1460187, -1467063, -1473933,
+ -1480797, -1487655, -1494507, -1501353, -1508192, -1515025, -1521852,
+ -1528672, -1535485, -1542292, -1549092, -1555885, -1562671, -1569450,
+ -1576222, -1582987, -1589745, -1596496, -1603239, -1609974, -1616703,
+ -1623423, -1630136, -1636841, -1643538, -1650228, -1656909, -1663582,
+ -1670247, -1676904, -1683553, -1690193, -1696825, -1703448, -1710063,
+ -1716669, -1723266, -1729854, -1736434, -1743004, -1749565, -1756118,
+ -1762661, -1769194, -1775719, -1782233, -1788739, -1795234, -1801720,
+ -1808197, -1814663, -1821119, -1827566, -1834002, -1840429, -1846845,
+ -1853250, -1859646, -1866030, -1872405, -1878768, -1885121, -1891464,
+ -1897795, -1904115, -1910425, -1916723, -1923010, -1929286, -1935551,
+ -1941804, -1948046, -1954276, -1960495, -1966702, -1972897, -1979081,
+ -1985252, -1991411, -1997559, -2003694, -2009817, -2015927, -2022026,
+ -2028111, -2034185, -2040245, -2046293, -2052328, -2058351, -2064360,
+ -2070357, -2076340, -2082310, -2088267, -2094211, -2100141, -2106058,
+ -2111961, -2117851, -2123727, -2129589, -2135438, -2141272, -2147093,
+ -2152899, -2158692, -2164470, -2170234, -2175983, -2181718, -2187439,
+ -2193145, -2198836, -2204512, -2210174, -2215821, -2221453, -2227070,
+ -2232671, -2238258, -2243829, -2249385, -2254926, -2260451, -2265960,
+ -2271454, -2276932, -2282395, -2287841, -2293272, -2298686, -2304085,
+ -2309467, -2314833, -2320183, -2325517, -2330834, -2336134, -2341418,
+ -2346685, -2351936, -2357169, -2362386, -2367586, -2372769, -2377934,
+ -2383083, -2388214, -2393328, -2398425, -2403504, -2408565, -2413609,
+ -2418635, -2423644, -2428635, -2433607, -2438562, -2443499, -2448417,
+ -2453318, -2458200, -2463064, -2467909, -2472736, -2477545, -2482335,
+ -2487106, -2491858, -2496592, -2501307, -2506002, -2510679, -2515337,
+ -2519975, -2524594, -2529194, -2533775, -2538336, -2542877, -2547399,
+ -2551902, -2556384, -2560847, -2565290, -2569713, -2574116, -2578499,
+ -2582861, -2587204, -2591526, -2595828, -2600110, -2604371, -2608611,
+ -2612831, -2617030, -2621209, -2625366, -2629503, -2633619, -2637714,
+ -2641787, -2645840, -2649871, -2653881, -2657870, -2661838, -2665783,
+ -2669708, -2673610, -2677492, -2681351, -2685188, -2689004, -2692798,
+ -2696570, -2700319, -2704047, -2707752, -2711435, -2715096, -2718734,
+ -2722350, -2725944, -2729515, -2733063, -2736589, -2740092, -2743572,
+ -2747029, -2750463, -2753874, -2757262, -2760627, -2763969, -2767288,
+ -2770583, -2773855, -2777103, -2780328, -2783530, -2786708, -2789862,
+ -2792992, -2796099, -2799181, -2802240, -2805275, -2808286, -2811273,
+ -2814235, -2817174, -2820088, -2822978, -2825843, -2828684, -2831501,
+ -2834293, -2837060, -2839803, -2842521, -2845214, -2847882, -2850525,
+ -2853144, -2855737, -2858306, -2860849, -2863367, -2865860, -2868328,
+ -2870770, -2873187, -2875578, -2877944, -2880285, -2882599, -2884889,
+ -2887152, -2889390, -2891601, -2893787, -2895947, -2898081, -2900189,
+ -2902271, -2904327, -2906356, -2908360, -2910337, -2912288, -2914212,
+ -2916110, -2917981, -2919826, -2921644, -2923436, -2925201, -2926939,
+ -2928650, -2930335, -2931992, -2933623, -2935227, -2936803, -2938353,
+ -2939875, -2941371, -2942839, -2944280, -2945693, -2947079, -2948438,
+ -2949769, -2951073, -2952349, -2953598, -2954819, -2956012, -2957177,
+ -2958315, -2959425, -2960507, -2961562, -2962588, -2963586, -2964556,
+ -2965499, -2966413, -2967298, -2968156, -2968986, -2969787, -2970560,
+ -2971304, -2972020, -2972708, -2973367, -2973997, -2974599, -2975173,
+ -2975717, -2976234, -2976721, -2977179, -2977609, -2978010, -2978382,
+ -2978725, -2979039, -2979325, -2979581, -2979808, -2980006, -2980175,
+ -2980314, -2980425, -2980506, -2980558, -2980580, -2980574, -2980537,
+ -2980472, -2980377, -2980252, -2980098, -2979915, -2979702, -2979459,
+ -2979186, -2978884, -2978552, -2978191, -2977799, -2977378, -2976927,
+ -2976446, -2975936, -2975395, -2974824, -2974224, -2973593, -2972932,
+ -2972241, -2971520, -2970769, -2969988, -2969177, -2968335, -2967463,
+ -2966561, -2965629, -2964666, -2963673, -2962650, -2961596, -2960511,
+ -2959397, -2958252, -2957076, -2955870, -2954633, -2953366, -2952068,
+ -2950739, -2949380, -2947990, -2946570, -2945119, -2943637, -2942124,
+ -2940581, -2939007, -2937402, -2935766, -2934099, -2932402, -2930673,
+ -2928914, -2927124, -2925303, -2923451, -2921567, -2919653, -2917708,
+ -2915732, -2913725, -2911687, -2909618, -2907517, -2905386, -2903223,
+ -2901030, -2898805, -2896549, -2894262, -2891944, -2889594, -2887213,
+ -2884801, -2882358, -2879884, -2877378, -2874841, -2872273, -2869673,
+ -2867042, -2864380, -2861687, -2858962, -2856206, -2853418, -2850599,
+ -2847749, -2844868, -2841955, -2839010, -2836034, -2833027, -2829989,
+ -2826919, -2823817, -2820684, -2817520, -2814325, -2811097, -2807839,
+ -2804549, -2801227, -2797874, -2794490, -2791074, -2787627, -2784148,
+ -2780638, -2777096, -2773523, -2769918, -2766282, -2762615, -2758916,
+ -2755185, -2751423, -2747630, -2743805, -2739949, -2736061, -2732142,
+ -2728191, -2724209, -2720195, -2716150, -2712073, -2707966, -2703826,
+ -2699655, -2695453, -2691220, -2686954, -2682658, -2678330, -2673971,
+ -2669580, -2665158, -2660705, -2656220, -2651704, -2647157, -2642578,
+ -2637968, -2633327, -2628654, -2623951, -2619215, -2614449, -2609651,
+ -2604822, -2599962, -2595071, -2590148, -2585194, -2580209, -2575193,
+ -2570146, -2565068, -2559958, -2554818, -2549646, -2544443, -2539209,
+ -2533944, -2528648, -2523322, -2517964, -2512575, -2507155, -2501704,
+ -2496223, -2490710, -2485167, -2479593, -2473987, -2468352, -2462685,
+ -2456987, -2451259, -2445500, -2439711, -2433890, -2428039, -2422158,
+ -2416245, -2410303, -2404329, -2398325, -2392291, -2386226, -2380130,
+ -2374005, -2367848, -2361662, -2355445, -2349197, -2342920, -2336612,
+ -2330274, -2323906, -2317507, -2311078, -2304619, -2298131, -2291612,
+ -2285063, -2278484, -2271875, -2265236, -2258567, -2251868, -2245139,
+ -2238381, -2231593, -2224775, -2217927, -2211050, -2204143, -2197207,
+ -2190241, -2183245, -2176220, -2169165, -2162081, -2154968, -2147825,
+ -2140653, -2133451, -2126221, -2118961, -2111672, -2104354, -2097007,
+ -2089631, -2082226, -2074791, -2067328, -2059836, -2052316, -2044766,
+ -2037188, -2029581, -2021945, -2014281, -2006588, -1998867, -1991117,
+ -1983339, -1975532, -1967697, -1959834, -1951942, -1944022, -1936074,
+ -1928098, -1920094, -1912062, -1904002, -1895914, -1887798, -1879654,
+ -1871482, -1863283, -1855056, -1846802, -1838519, -1830210, -1821873,
+ -1813508, -1805116, -1796697, -1788251, -1779777, -1771276, -1762748,
+ -1754193, -1745611, -1737002, -1728367, -1719704, -1711015, -1702298,
+ -1693556, -1684786, -1675991, -1667168, -1658320, -1649444, -1640543,
+ -1631615, -1622661, -1613681, -1604675, -1595643, -1586585, -1577501,
+ -1568392, -1559256, -1550095, -1540908, -1531696, -1522458, -1513194,
+ -1503906, -1494592, -1485252, -1475888, -1466498, -1457083, -1447644,
+ -1438179, -1428690, -1419175, -1409636, -1400072, -1390484, -1380871,
+ -1371234, -1361572, -1351886, -1342176, -1332442, -1322683, -1312900,
+ -1303094, -1293263, -1283409, -1273531, -1263629, -1253704, -1243755,
+ -1233783, -1223787, -1213768, -1203725, -1193660, -1183571, -1173459,
+ -1163325, -1153167, -1142987, -1132784, -1122558, -1112310, -1102039,
+ -1091746, -1081430, -1071092, -1060732, -1050350, -1039946, -1029520,
+ -1019072, -1008602, -998111, -987597, -977063, -966507, -955929,
+ -945330, -934710, -924069, -913407, -902723, -892019, -881294, -870548,
+ -859782, -848995, -838188, -827360, -816512, -805643, -794755, -783846,
+ -772918, -761969, -751001, -740013, -729006, -717979, -706932, -695866,
+ -684781, -673677, -662553, -651411, -640250, -629069, -617871, -606653,
+ -595417, -584163, -572890, -561599, -550289, -538962, -527616, -516253,
+ -504872, -493473, -482057, -470623, -459171, -447702, -436216, -424713,
+ -413193, -401656, -390102, -378531, -366943, -355339, -343719, -332082,
+ -320428, -308759, -297073, -285372, -273655, -261921, -250173, -238408,
+ -226628, -214833, -203022, -191196, -179355, -167499, -155629, -143743,
+ -131843, -119928, -107998, -96055, -84097, -72124, -60138, -48138,
+ -36124, -24096, -12055, 0, 12068, 24150, 36245, 48353, 60474, 72608,
+ 84755, 96915, 109087, 121272, 133469, 145679, 157900, 170134, 182379,
+ 194637, 206906, 219187, 231479, 243783, 256098, 268424, 280761, 293110,
+ 305469, 317838, 330219, 342610, 355011, 367423, 379845, 392277, 404719,
+ 417171, 429632, 442103, 454584, 467074, 479573, 492082, 504599, 517126,
+ 529661, 542205, 554758, 567319, 579888, 592466, 605052, 617646, 630248,
+ 642857, 655475, 668099, 680732, 693371, 706018, 718672, 731332, 744000,
+ 756674, 769355, 782043, 794737, 807437, 820143, 832855, 845573, 858297,
+ 871027, 883762, 896502, 909248, 921999, 934755, 947516, 960282, 973052,
+ 985827, 998607, 1011391, 1024179, 1036971, 1049767, 1062567, 1075370,
+ 1088177, 1100988, 1113802, 1126619, 1139439, 1152262, 1165088, 1177917,
+ 1190749, 1203583, 1216419, 1229257, 1242098, 1254940, 1267784, 1280631,
+ 1293478, 1306327, 1319178, 1332029, 1344882, 1357736, 1370591, 1383446,
+ 1396302, 1409158, 1422015, 1434872, 1447729, 1460586, 1473442, 1486299,
+ 1499155, 1512010, 1524865, 1537719, 1550572, 1563424, 1576274, 1589124,
+ 1601971, 1614818, 1627662, 1640505, 1653346, 1666184, 1679021, 1691855,
+ 1704686, 1717515, 1730341, 1743165, 1755985, 1768802, 1781616, 1794426,
+ 1807233, 1820036, 1832836, 1845631, 1858422, 1871210, 1883993, 1896771,
+ 1909545, 1922314, 1935078, 1947837, 1960591, 1973340, 1986084, 1998822,
+ 2011554, 2024281, 2037001, 2049716, 2062424, 2075126, 2087822, 2100511,
+ 2113194, 2125869, 2138538, 2151199, 2163853, 2176500, 2189140, 2201771,
+ 2214395, 2227011, 2239619, 2252219, 2264811, 2277394, 2289968, 2302534,
+ 2315091, 2327639, 2340177, 2352707, 2365227, 2377738, 2390239, 2402730,
+ 2415212, 2427683, 2440144, 2452595, 2465035, 2477465, 2489884, 2502292,
+ 2514689, 2527075, 2539450, 2551813, 2564165, 2576505, 2588834, 2601150,
+ 2613454, 2625746, 2638026, 2650294, 2662548, 2674790, 2687019, 2699235,
+ 2711438, 2723628, 2735804, 2747967, 2760116, 2772251, 2784372, 2796479,
+ 2808572, 2820650, 2832714, 2844763, 2856798, 2868818, 2880822, 2892812,
+ 2904786, 2916744, 2928687, 2940615, 2952526, 2964422, 2976301, 2988164,
+ 3000011, 3011841, 3023655, 3035451, 3047231, 3058994, 3070739, 3082467,
+ 3094178, 3105871, 3117547, 3129204, 3140843, 3152465, 3164068, 3175652,
+ 3187219, 3198766, 3210294, 3221804, 3233295, 3244766, 3256218, 3267650,
+ 3279063, 3290456, 3301829, 3313183, 3324516, 3335828, 3347121, 3358392,
+ 3369643, 3380874, 3392083, 3403271, 3414438, 3425584, 3436708, 3447810,
+ 3458891, 3469950, 3480986, 3492001, 3502993, 3513963, 3524911, 3535835,
+ 3546737, 3557616, 3568472, 3579304, 3590114, 3600899, 3611661, 3622400,
+ 3633114, 3643805, 3654471, 3665113, 3675731, 3686324, 3696893, 3707436,
+ 3717955, 3728449, 3738918, 3749361, 3759779, 3770171, 3780537, 3790878,
+ 3801193, 3811481, 3821744, 3831980, 3842189, 3852372, 3862528, 3872658,
+ 3882760, 3892835, 3902883, 3912904, 3922897, 3932862, 3942800, 3952710,
+ 3962591, 3972445, 3982270, 3992067, 4001835, 4011575, 4021286, 4030968,
+ 4040621, 4050245, 4059839, 4069404, 4078940, 4088445, 4097922, 4107368,
+ 4116784, 4126170, 4135525, 4144850, 4154145, 4163409, 4172642, 4181845,
+ 4191016, 4200156, 4209265, 4218342, 4227388, 4236402, 4245385, 4254335,
+ 4263254, 4272140, 4280994, 4289816, 4298605, 4307361, 4316085, 4324776,
+ 4333434, 4342059, 4350650, 4359209, 4367733, 4376225, 4384682, 4393106,
+ 4401495, 4409851, 4418172, 4426459, 4434712, 4442930, 4451114, 4459262,
+ 4467376, 4475455, 4483499, 4491507, 4499480, 4507418, 4515320, 4523186,
+ 4531016, 4538811, 4546569, 4554292, 4561978, 4569627, 4577240, 4584817,
+ 4592356, 4599859, 4607325, 4614754, 4622146, 4629500, 4636817, 4644097,
+ 4651338, 4658542, 4665709, 4672837, 4679927, 4686979, 4693992, 4700968,
+ 4707904, 4714802, 4721662, 4728482, 4735264, 4742006, 4748710, 4755374,
+ 4761999, 4768584, 4775129, 4781635, 4788101, 4794528, 4800914, 4807260,
+ 4813566, 4819831, 4826056, 4832241, 4838385, 4844488, 4850550, 4856571,
+ 4862552, 4868491, 4874389, 4880245, 4886060, 4891834, 4897565, 4903255,
+ 4908904, 4914510, 4920074, 4925596, 4931076, 4936513, 4941908, 4947261,
+ 4952570, 4957837, 4963062, 4968243, 4973381, 4978476, 4983528, 4988537,
+ 4993502, 4998423, 5003301, 5008136, 5012926, 5017673, 5022375, 5027034,
+ 5031649, 5036219, 5040745, 5045226, 5049663, 5054055, 5058403, 5062706,
+ 5066963, 5071176, 5075344, 5079467, 5083544, 5087577, 5091563, 5095505,
+ 5099400, 5103250, 5107055, 5110813, 5114526, 5118192, 5121812, 5125387,
+ 5128915, 5132396, 5135831, 5139220, 5142562, 5145858, 5149106, 5152308,
+ 5155463, 5158571, 5161632, 5164646, 5167612, 5170532, 5173403, 5176228,
+ 5179005, 5181734, 5184415, 5187049, 5189635, 5192173, 5194663, 5197105,
+ 5199499, 5201845, 5204142, 5206391, 5208591, 5210743, 5212847, 5214902,
+ 5216908, 5218865, 5220773, 5222633, 5224443, 5226205, 5227917, 5229580,
+ 5231194, 5232759, 5234274, 5235740, 5237156, 5238522, 5239839, 5241106,
+ 5242324, 5243491, 5244609, 5245676, 5246694, 5247661, 5248579, 5249446,
+ 5250263, 5251029, 5251745, 5252411, 5253026, 5253590, 5254104, 5254567,
+ 5254980, 5255341, 5255652, 5255912, 5256121, 5256279, 5256385, 5256441,
+ 5256445, 5256398, 5256300, 5256151, 5255950, 5255698, 5255394, 5255039,
+ 5254632, 5254173, 5253663, 5253101, 5252487, 5251821, 5251104, 5250334,
+ 5249513, 5248639, 5247714, 5246736, 5245706, 5244624, 5243490, 5242303,
+ 5241064, 5239773, 5238430, 5237033, 5235585, 5234084, 5232530, 5230924,
+ 5229265, 5227553, 5225789, 5223972, 5222102, 5220179, 5218204, 5216175,
+ 5214094, 5211959, 5209772, 5207532, 5205238, 5202892, 5200492, 5198039,
+ 5195533, 5192974, 5190361, 5187695, 5184976, 5182204, 5179378, 5176499,
+ 5173567, 5170581, 5167541, 5164448, 5161302, 5158102, 5154848, 5151541,
+ 5148180, 5144766, 5141298, 5137776, 5134201, 5130572, 5126889, 5123152,
+ 5119362, 5115518, 5111620, 5107668, 5103663, 5099604, 5095490, 5091323,
+ 5087102, 5082827, 5078499, 5074116, 5069679, 5065189, 5060644, 5056046,
+ 5051393, 5046687, 5041926, 5037112, 5032243, 5027321, 5022344, 5017313,
+ 5012229, 5007090, 5001897, 4996651, 4991350, 4985995, 4980586, 4975123,
+ 4969606, 4964035, 4958410, 4952730, 4946997, 4941210, 4935368, 4929473,
+ 4923523, 4917520, 4911462, 4905351, 4899185, 4892965, 4886691, 4880364,
+ 4873982, 4867546, 4861056, 4854513, 4847915, 4841263, 4834558, 4827798,
+ 4820985, 4814117, 4807196, 4800221, 4793192, 4786109, 4778972, 4771782,
+ 4764537, 4757239, 4749887, 4742482, 4735022, 4727509, 4719942, 4712322,
+ 4704647, 4696919, 4689138, 4681303, 4673414, 4665472, 4657476, 4649427,
+ 4641324, 4633168, 4624959, 4616696, 4608380, 4600010, 4591587, 4583111,
+ 4574581, 4565998, 4557362, 4548673, 4539931, 4531136, 4522287, 4513386,
+ 4504432, 4495424, 4486364, 4477251, 4468085, 4458866, 4449594, 4440270,
+ 4430893, 4421463, 4411981, 4402446, 4392858, 4383218, 4373526, 4363781,
+ 4353984, 4344134, 4334232, 4324278, 4314272, 4304213, 4294103, 4283940,
+ 4273726, 4263459, 4253140, 4242770, 4232348, 4221874, 4211348, 4200771,
+ 4190142, 4179462, 4168730, 4157946, 4147112, 4136226, 4125288, 4114299,
+ 4103260, 4092169, 4081027, 4069834, 4058590, 4047295, 4035950, 4024553,
+ 4013106, 4001608, 3990060, 3978461, 3966812, 3955113, 3943363, 3931563,
+ 3919712, 3907812, 3895861, 3883861, 3871810, 3859710, 3847560, 3835360,
+ 3823111, 3810812, 3798464, 3786066, 3773619, 3761122, 3748576, 3735982,
+ 3723338, 3710645, 3697903, 3685113, 3672273, 3659385, 3646449, 3633463,
+ 3620430, 3607348, 3594218, 3581039, 3567813, 3554538, 3541216, 3527845,
+ 3514427, 3500961, 3487448, 3473887, 3460278, 3446623, 3432919, 3419169,
+ 3405372, 3391527, 3377636, 3363698, 3349713, 3335682, 3321604, 3307479,
+ 3293308, 3279091, 3264828, 3250519, 3236163, 3221762, 3207315, 3192822,
+ 3178284, 3163700, 3149070, 3134396, 3119676, 3104911, 3090101, 3075246,
+ 3060346, 3045402, 3030413, 3015379, 3000301, 2985179, 2970013, 2954802,
+ 2939548, 2924249, 2908907, 2893521, 2878092, 2862619, 2847103, 2831544,
+ 2815941, 2800296, 2784607, 2768876, 2753102, 2737286, 2721427, 2705526,
+ 2689582, 2673597, 2657569, 2641500, 2625389, 2609236, 2593042, 2576806,
+ 2560529, 2544211, 2527852, 2511452, 2495011, 2478530, 2462007, 2445445,
+ 2428842, 2412199, 2395516, 2378793, 2362030, 2345227, 2328385, 2311504,
+ 2294583, 2277622, 2260623, 2243585, 2226508, 2209393, 2192239, 2175046,
+ 2157815, 2140546, 2123239, 2105895, 2088512, 2071092, 2053634, 2036139,
+ 2018607, 2001037, 1983431, 1965788, 1948108, 1930392, 1912639, 1894850,
+ 1877025, 1859164, 1841267, 1823335, 1805366, 1787363, 1769324, 1751250,
+ 1733141, 1714997, 1696819, 1678606, 1660358, 1642077, 1623761, 1605411,
+ 1587027, 1568610, 1550159, 1531675, 1513157, 1494607, 1476023, 1457407,
+ 1438758, 1420077, 1401363, 1382617, 1363839, 1345030, 1326188, 1307315,
+ 1288411, 1269475, 1250508, 1231510, 1212482, 1193422, 1174333, 1155213,
+ 1136063, 1116882, 1097672, 1078433, 1059163, 1039865, 1020537, 1001180,
+ 981794, 962380, 942937, 923466, 903966, 884438, 864883, 845300, 825689,
+ 806050, 786385, 766692, 746973, 727227, 707454, 687655, 667829, 647978,
+ 628100, 608197, 588268, 568314, 548335, 528331, 508301, 488247, 468169,
+ 448066, 427939, 407788, 387614, 367415, 347193, 326948, 306680, 286388,
+ 266074, 245737, 225378, 204997, 184594, 164168, 143721, 123253, 102763,
+ 82252, 61720, 41167, 20593, 0, -20614, -41248, -61902, -82576, -103269,
+ -123982, -144714, -165465, -186234, -207023, -227829, -248654, -269497,
+ -290358, -311236, -332132, -353045, -373976, -394923, -415887, -436868,
+ -457864, -478877, -499906, -520951, -542012, -563087, -584178, -605284,
+ -626405, -647540, -668690, -689854, -711032, -732224, -753430, -774649,
+ -795881, -817127, -838385, -859656, -880939, -902235, -923543, -944863,
+ -966194, -987537, -1008891, -1030256, -1051632, -1073019, -1094417,
+ -1115824, -1137242, -1158670, -1180107, -1201554, -1223010, -1244475,
+ -1265949, -1287432, -1308924, -1330423, -1351931, -1373446, -1394970,
+ -1416500, -1438038, -1459583, -1481135, -1502694, -1524259, -1545830,
+ -1567407, -1588990, -1610579, -1632173, -1653773, -1675377, -1696986,
+ -1718600, -1740218, -1761841, -1783467, -1805097, -1826731, -1848367,
+ -1870008, -1891651, -1913296, -1934945, -1956595, -1978248, -1999902,
+ -2021558, -2043216, -2064875, -2086535, -2108195, -2129857, -2151518,
+ -2173180, -2194842, -2216504, -2238165, -2259826, -2281485, -2303144,
+ -2324801, -2346457, -2368111, -2389763, -2411412, -2433060, -2454705,
+ -2476347, -2497986, -2519622, -2541254, -2562883, -2584508, -2606128,
+ -2627745, -2649357, -2670964, -2692566, -2714163, -2735755, -2757341,
+ -2778921, -2800495, -2822063, -2843624, -2865179, -2886727, -2908267,
+ -2929800, -2951326, -2972844, -2994354, -3015855, -3037349, -3058833,
+ -3080309, -3101775, -3123233, -3144680, -3166118, -3187546, -3208964,
+ -3230371, -3251768, -3273154, -3294528, -3315892, -3337244, -3358584,
+ -3379912, -3401228, -3422532, -3443823, -3465101, -3486366, -3507618,
+ -3528856, -3550081, -3571291, -3592488, -3613670, -3634837, -3655990,
+ -3677127, -3698250, -3719356, -3740447, -3761523, -3782581, -3803624,
+ -3824650, -3845659, -3866651, -3887626, -3908583, -3929523, -3950444,
+ -3971348, -3992233, -4013099, -4033947, -4054775, -4075585, -4096374,
+ -4117144, -4137895, -4158624, -4179334, -4200023, -4220691, -4241338,
+ -4261964, -4282568, -4303151, -4323711, -4344250, -4364766, -4385259,
+ -4405730, -4426177, -4446602, -4467002, -4487379, -4507732, -4528061,
+ -4548366, -4568646, -4588901, -4609131, -4629336, -4649515, -4669668,
+ -4689796, -4709897, -4729972, -4750021, -4770042, -4790037, -4810004,
+ -4829944, -4849856, -4869740, -4889595, -4909423, -4929222, -4948992,
+ -4968733, -4988445, -5008127, -5027779, -5047402, -5066994, -5086557,
+ -5106088, -5125589, -5145058, -5164497, -5183904, -5203279, -5222622,
+ -5241933, -5261212, -5280458, -5299672, -5318852, -5337999, -5357113,
+ -5376193, -5395239, -5414251, -5433229, -5452172, -5471081, -5489954,
+ -5508792, -5527595, -5546362, -5565094, -5583789, -5602448, -5621070,
+ -5639656, -5658205, -5676717, -5695191, -5713627, -5732026, -5750387,
+ -5768710, -5786994, -5805239, -5823446, -5841614, -5859742, -5877830,
+ -5895879, -5913888, -5931857, -5949786, -5967673, -5985520, -6003326,
+ -6021091, -6038814, -6056496, -6074136, -6091733, -6109289, -6126802,
+ -6144272, -6161699, -6179083, -6196423, -6213721, -6230974, -6248183,
+ -6265348, -6282469, -6299545, -6316576, -6333562, -6350503, -6367399,
+ -6384249, -6401053, -6417811, -6434522, -6451187, -6467806, -6484377,
+ -6500902, -6517379, -6533808, -6550190, -6566524, -6582809, -6599047,
+ -6615236, -6631376, -6647467, -6663509, -6679501, -6695444, -6711337,
+ -6727181, -6742974, -6758716, -6774408, -6790050, -6805640, -6821179,
+ -6836667, -6852103, -6867487, -6882820, -6898100, -6913328, -6928503,
+ -6943625, -6958695, -6973711, -6988674, -7003583, -7018439, -7033241,
+ -7047988, -7062681, -7077320, -7091904, -7106433, -7120906, -7135325,
+ -7149688, -7163995, -7178246, -7192442, -7206581, -7220663, -7234689,
+ -7248658, -7262570, -7276424, -7290222, -7303961, -7317643, -7331267,
+ -7344833, -7358340, -7371789, -7385179, -7398510, -7411782, -7424995,
+ -7438148, -7451241, -7464275, -7477249, -7490162, -7503015, -7515808,
+ -7528539, -7541210, -7553820, -7566368, -7578855, -7591280, -7603644,
+ -7615945, -7628184, -7640361, -7652475, -7664526, -7676515, -7688440,
+ -7700303, -7712101, -7723836, -7735508, -7747115, -7758658, -7770137,
+ -7781552, -7792902, -7804187, -7815407, -7826562, -7837651, -7848675,
+ -7859633, -7870526, -7881352, -7892113, -7902807, -7913434, -7923995,
+ -7934489, -7944916, -7955275, -7965568, -7975793, -7985950, -7996039,
+ -8006061, -8016014, -8025899, -8035716, -8045463, -8055143, -8064753,
+ -8074294, -8083766, -8093168, -8102501, -8111764, -8120957, -8130080,
+ -8139133, -8148116, -8157028, -8165869, -8174640, -8183339, -8191968,
+ -8200525, -8209011, -8217425, -8225768, -8234039, -8242237, -8250364,
+ -8258418, -8266400, -8274309, -8282146, -8289909, -8297600, -8305217,
+ -8312761, -8320232, -8327629, -8334952, -8342202, -8349377, -8356478,
+ -8363505, -8370458, -8377336, -8384139, -8390868, -8397521, -8404100,
+ -8410603, -8417031, -8423383, -8429659, -8435860, -8441985, -8448034,
+ -8454007, -8459903, -8465723, -8471467, -8477134, -8482724, -8488237,
+ -8493673, -8499032, -8504313, -8509517, -8514644, -8519693, -8524664,
+ -8529557, -8534372, -8539109, -8543768, -8548349, -8552851, -8557274,
+ -8561618, -8565884, -8570071, -8574178, -8578207, -8582156, -8586026,
+ -8589816, -8593526, -8597157, -8600708, -8604179, -8607570, -8610881,
+ -8614111, -8617261, -8620331, -8623320, -8626228, -8629056, -8631802,
+ -8634468, -8637052, -8639555, -8641977, -8644317, -8646576, -8648754,
+ -8650849, -8652863, -8654795, -8656645, -8658413, -8660099, -8661702,
+ -8663223, -8664662, -8666018, -8667291, -8668482, -8669590, -8670615,
+ -8671557, -8672416, -8673192, -8673885, -8674494, -8675020, -8675462,
+ -8675821, -8676096, -8676288, -8676395, -8676419, -8676359, -8676215,
+ -8675986, -8675674, -8675277, -8674796, -8674231, -8673581, -8672846,
+ -8672027, -8671123, -8670135, -8669061, -8667903, -8666660, -8665331,
+ -8663918, -8662419, -8660836, -8659167, -8657412, -8655572, -8653647,
+ -8651636, -8649540, -8647358, -8645090, -8642737, -8640297, -8637772,
+ -8635161, -8632464, -8629681, -8626812, -8623857, -8620815, -8617687,
+ -8614474, -8611173, -8607787, -8604313, -8600754, -8597108, -8593375,
+ -8589556, -8585650, -8581658, -8577579, -8573413, -8569160, -8564820,
+ -8560394, -8555880, -8551280, -8546593, -8541818, -8536957, -8532008,
+ -8526973, -8521850, -8516640, -8511343, -8505959, -8500488, -8494929,
+ -8489283, -8483549, -8477728, -8471820, -8465825, -8459742, -8453571,
+ -8447313, -8440968, -8434535, -8428015, -8421407, -8414712, -8407929,
+ -8401058, -8394100, -8387054, -8379921, -8372700, -8365391, -8357995,
+ -8350511, -8342940, -8335281, -8327534, -8319699, -8311777, -8303767,
+ -8295670, -8287485, -8279212, -8270851, -8262403, -8253867, -8245244,
+ -8236533, -8227734, -8218847, -8209873, -8200811, -8191662, -8182425,
+ -8173100, -8163688, -8154188, -8144601, -8134926, -8125164, -8115314,
+ -8105376, -8095351, -8085239, -8075039, -8064751, -8054377, -8043915,
+ -8033365, -8022728, -8012004, -8001193, -7990294, -7979308, -7968235,
+ -7957074, -7945827, -7934492, -7923070, -7911562, -7899966, -7888283,
+ -7876513, -7864657, -7852713, -7840683, -7828565, -7816361, -7804071,
+ -7791693, -7779229, -7766678, -7754041, -7741317, -7728507, -7715611,
+ -7702628, -7689558, -7676403, -7663161, -7649833, -7636419, -7622919,
+ -7609333, -7595660, -7581902, -7568059, -7554129, -7540113, -7526012,
+ -7511826, -7497553, -7483196, -7468752, -7454224, -7439610, -7424911,
+ -7410127, -7395258, -7380303, -7365264, -7350140, -7334931, -7319637,
+ -7304258, -7288795, -7273248, -7257616, -7241899, -7226098, -7210214,
+ -7194244, -7178191, -7162054, -7145833, -7129528, -7113140, -7096667,
+ -7080112, -7063472, -7046750, -7029944, -7013054, -6996082, -6979027,
+ -6961888, -6944667, -6927363, -6909977, -6892508, -6874956, -6857322,
+ -6839606, -6821807, -6803927, -6785964, -6767920, -6749794, -6731586,
+ -6713296, -6694926, -6676473, -6657940, -6639325, -6620630, -6601853,
+ -6582996, -6564057, -6545039, -6525940, -6506760, -6487500, -6468160,
+ -6448740, -6429240, -6409661, -6390002, -6370263, -6350444, -6330547,
+ -6310570, -6290514, -6270380, -6250166, -6229874, -6209503, -6189054,
+ -6168527, -6147921, -6127237, -6106476, -6085636, -6064720, -6043725,
+ -6022653, -6001504, -5980278, -5958975, -5937595, -5916139, -5894605,
+ -5872996, -5851310, -5829548, -5807710, -5785797, -5763807, -5741743,
+ -5719602, -5697387, -5675096, -5652731, -5630291, -5607776, -5585186,
+ -5562523, -5539785, -5516973, -5494087, -5471128, -5448095, -5424989,
+ -5401809, -5378556, -5355231, -5331833, -5308362, -5284818, -5261203,
+ -5237515, -5213756, -5189925, -5166022, -5142047, -5118002, -5093885,
+ -5069698, -5045440, -5021111, -4996712, -4972243, -4947703, -4923094,
+ -4898415, -4873667, -4848849, -4823962, -4799006, -4773982, -4748889,
+ -4723727, -4698497, -4673200, -4647834, -4622401, -4596900, -4571332,
+ -4545696, -4519994, -4494226, -4468390, -4442488, -4416521, -4390487,
+ -4364387, -4338222, -4311992, -4285696, -4259336, -4232910, -4206420,
+ -4179866, -4153248, -4126565, -4099819, -4073009, -4046136, -4019200,
+ -3992201, -3965139, -3938015, -3910828, -3883579, -3856268, -3828896,
+ -3801462, -3773967, -3746411, -3718794, -3691116, -3663378, -3635580,
+ -3607722, -3579804, -3551826, -3523789, -3495694, -3467539, -3439326,
+ -3411054, -3382724, -3354336, -3325890, -3297387, -3268826, -3240209,
+ -3211534, -3182803, -3154016, -3125172, -3096273, -3067318, -3038307,
+ -3009241, -2980120, -2950945, -2921714, -2892430, -2863092, -2833699,
+ -2804253, -2774754, -2745202, -2715597, -2685939, -2656229, -2626467,
+ -2596653, -2566787, -2536870, -2506902, -2476883, -2446813, -2416693,
+ -2386523, -2356303, -2326033, -2295713, -2265345, -2234928, -2204462,
+ -2173948, -2143385, -2112775, -2082117, -2051411, -2020659, -1989860,
+ -1959014, -1928122, -1897183, -1866199, -1835170, -1804095, -1772975,
+ -1741810, -1710601, -1679347, -1648050, -1616709, -1585324, -1553897,
+ -1522426, -1490913, -1459357, -1427760, -1396120, -1364439, -1332717,
+ -1300953, -1269149, -1237305, -1205420, -1173495, -1141531, -1109527,
+ -1077485, -1045403, -1013283, -981125, -948928, -916694, -884423,
+ -852115, -819769, -787387, -754969, -722515, -690025, -657500, -624940,
+ -592344, -559714, -527050, -494352, -461620, -428855, -396057, -363226,
+ -330362, -297466, -264538, -231579, -198588, -165566, -132513, -99429,
+ -66316, -33173, 0, 33202, 66433, 99693, 132982, 166298, 199643, 233014,
+ 266413, 299839, 333292, 366771, 400276, 433806, 467363, 500944, 534549,
+ 568180, 601834, 635513, 669215, 702940, 736688, 770459, 804252, 838067,
+ 871904, 905762, 939642, 973542, 1007462, 1041403, 1075364, 1109344,
+ 1143343, 1177361, 1211398, 1245453, 1279526, 1313617, 1347725, 1381850,
+ 1415992, 1450150, 1484324, 1518514, 1552719, 1586939, 1621174, 1655424,
+ 1689688, 1723965, 1758256, 1792560, 1826877, 1861207, 1895549, 1929902,
+ 1964268, 1998644, 2033031, 2067429, 2101837, 2136255, 2170683, 2205120,
+ 2239566, 2274020, 2308483, 2342954, 2377432, 2411918, 2446411, 2480910,
+ 2515416, 2549927, 2584445, 2618967, 2653495, 2688027, 2722564, 2757104,
+ 2791649, 2826196, 2860747, 2895300, 2929856, 2964413, 2998973, 3033533,
+ 3068095, 3102657, 3137220, 3171782, 3206344, 3240906, 3275466, 3310025,
+ 3344583, 3379138, 3413691, 3448242, 3482789, 3517333, 3551873, 3586409,
+ 3620941, 3655468, 3689989, 3724506, 3759016, 3793521, 3828019, 3862510,
+ 3896994, 3931471, 3965940, 4000401, 4034853, 4069296, 4103730, 4138155,
+ 4172570, 4206974, 4241368, 4275751, 4310123, 4344484, 4378832, 4413168,
+ 4447491, 4481802, 4516099, 4550382, 4584652, 4618907, 4653147, 4687373,
+ 4721583, 4755777, 4789955, 4824117, 4858262, 4892390, 4926500, 4960593,
+ 4994667, 5028723, 5062760, 5096778, 5130776, 5164754, 5198713, 5232650,
+ 5266567, 5300462, 5334336, 5368187, 5402017, 5435823, 5469607, 5503367,
+ 5537104, 5570816, 5604504, 5638168, 5671806, 5705418, 5739005, 5772566,
+ 5806100, 5839607, 5873088, 5906540, 5939965, 5973361, 6006729, 6040067,
+ 6073377, 6106657, 6139906, 6173126, 6206315, 6239472, 6272598, 6305693,
+ 6338755, 6371785, 6404782, 6437746, 6470677, 6503573, 6536436, 6569264,
+ 6602057, 6634814, 6667536, 6700223, 6732872, 6765486, 6798062, 6830601,
+ 6863102, 6895565, 6927990, 6960376, 6992723, 7025030, 7057298, 7089526,
+ 7121713, 7153859, 7185964, 7218028, 7250050, 7282029, 7313966, 7345861,
+ 7377711, 7409519, 7441282, 7473001, 7504675, 7536305, 7567889, 7599427,
+ 7630919, 7662365, 7693765, 7725117, 7756422, 7787679, 7818887, 7850048,
+ 7881160, 7912222, 7943235, 7974199, 8005112, 8035974, 8066786, 8097547,
+ 8128256, 8158913, 8189518, 8220070, 8250569, 8281016, 8311408, 8341747,
+ 8372031, 8402261, 8432436, 8462555, 8492619, 8522627, 8552579, 8582474,
+ 8612312, 8642092, 8671815, 8701480, 8731087, 8760635, 8790124, 8819553,
+ 8848923, 8878233, 8907483, 8936671, 8965799, 8994865, 9023870, 9052812,
+ 9081693, 9110510, 9139265, 9167956, 9196583, 9225146, 9253645, 9282079,
+ 9310449, 9338752, 9366990, 9395162, 9423268, 9451307, 9479279, 9507184,
+ 9535021, 9562790, 9590490, 9618122, 9645685, 9673178, 9700602, 9727956,
+ 9755240, 9782453, 9809595, 9836666, 9863665, 9890592, 9917447, 9944230,
+ 9970940, 9997576, 10024139, 10050628, 10077043, 10103383, 10129648,
+ 10155839, 10181954, 10207993, 10233956, 10259843, 10285653, 10311386,
+ 10337041, 10362619, 10388119, 10413541, 10438884, 10464148, 10489333,
+ 10514438, 10539463, 10564409, 10589274, 10614058, 10638760, 10663382,
+ 10687922, 10712379, 10736755, 10761048, 10785258, 10809384, 10833427,
+ 10857386, 10881261, 10905052, 10928758, 10952378, 10975914, 10999363,
+ 11022727, 11046004, 11069195, 11092299, 11115316, 11138245, 11161086,
+ 11183840, 11206505, 11229081, 11251569, 11273967, 11296276, 11318494,
+ 11340623, 11362661, 11384609, 11406466, 11428231, 11449905, 11471487,
+ 11492976, 11514374, 11535678, 11556890, 11578008, 11599032, 11619963,
+ 11640800, 11661542, 11682190, 11702742, 11723199, 11743561, 11763827,
+ 11783997, 11804070, 11824047, 11843927, 11863709, 11883394, 11902982,
+ 11922471, 11941862, 11961154, 11980348, 11999442, 12018437, 12037333,
+ 12056128, 12074824, 12093418, 12111913, 12130306, 12148598, 12166788,
+ 12184876, 12202863, 12220747, 12238529, 12256208, 12273784, 12291256,
+ 12308625, 12325890, 12343051, 12360107, 12377059, 12393906, 12410648,
+ 12427285, 12443816, 12460241, 12476560, 12492772, 12508878, 12524877,
+ 12540769, 12556554, 12572231, 12587800, 12603262, 12618614, 12633859,
+ 12648994, 12664021, 12678938, 12693745, 12708443, 12723031, 12737509,
+ 12751876, 12766133, 12780278, 12794313, 12808236, 12822047, 12835747,
+ 12849334, 12862810, 12876172, 12889423, 12902560, 12915583, 12928494,
+ 12941291, 12953974, 12966543, 12978997, 12991337, 13003563, 13015673,
+ 13027669, 13039549, 13051313, 13062962, 13074494, 13085911, 13097211,
+ 13108394, 13119461, 13130410, 13141242, 13151957, 13162555, 13173034,
+ 13183395, 13193638, 13203763, 13213769, 13223656, 13233424, 13243073,
+ 13252602, 13262012, 13271302, 13280472, 13289522, 13298451, 13307260,
+ 13315948, 13324515, 13332961, 13341286, 13349489, 13357571, 13365531,
+ 13373368, 13381084, 13388677, 13396147, 13403495, 13410720, 13417822,
+ 13424800, 13431655, 13438387, 13444995, 13451478, 13457838, 13464073,
+ 13470184, 13476171, 13482032, 13487769, 13493381, 13498867, 13504228,
+ 13509464, 13514573, 13519557, 13524415, 13529147, 13533752, 13538231,
+ 13542583, 13546809, 13550907, 13554879, 13558723, 13562440, 13566029,
+ 13569491, 13572825, 13576031, 13579109, 13582059, 13584880, 13587573,
+ 13590138, 13592574, 13594880, 13597058, 13599107, 13601027, 13602817,
+ 13604477, 13606008, 13607410, 13608681, 13609822, 13610834, 13611715,
+ 13612465, 13613086, 13613575, 13613934, 13614163, 13614260, 13614226,
+ 13614061, 13613765, 13613338, 13612779, 13612088, 13611266, 13610313,
+ 13609227, 13608009, 13606659, 13605177, 13603563, 13601817, 13599938,
+ 13597926, 13595782, 13593506, 13591096, 13588553, 13585878, 13583069,
+ 13580128, 13577053, 13573845, 13570503, 13567028, 13563420, 13559677,
+ 13555801, 13551792, 13547648, 13543371, 13538960, 13534414, 13529735,
+ 13524921, 13519973, 13514891, 13509674, 13504323, 13498837, 13493217,
+ 13487463, 13481573, 13475549, 13469390, 13463096, 13456668, 13450104,
+ 13443406, 13436572, 13429604, 13422500, 13415261, 13407887, 13400378,
+ 13392733, 13384954, 13377038, 13368988, 13360802, 13352480, 13344023,
+ 13335431, 13326703, 13317839, 13308840, 13299705, 13290435, 13281029,
+ 13271487, 13261809, 13251996, 13242047, 13231962, 13221742, 13211385,
+ 13200893, 13190265, 13179501, 13168602, 13157566, 13146395, 13135088,
+ 13123645, 13112066, 13100351, 13088501, 13076514, 13064392, 13052134,
+ 13039740, 13027210, 13014544, 13001743, 12988806, 12975733, 12962524,
+ 12949180, 12935699, 12922083, 12908332, 12894444, 12880421, 12866263,
+ 12851969, 12837539, 12822974, 12808273, 12793436, 12778465, 12763357,
+ 12748115, 12732737, 12717223, 12701575, 12685791, 12669872, 12653818,
+ 12637629, 12621304, 12604845, 12588251, 12571522, 12554657, 12537659,
+ 12520525, 12503256, 12485853, 12468316, 12450644, 12432837, 12414896,
+ 12396821, 12378611, 12360267, 12341789, 12323177, 12304431, 12285551,
+ 12266537, 12247389, 12228107, 12208692, 12189144, 12169461, 12149646,
+ 12129697, 12109615, 12089399, 12069051, 12048570, 12027956, 12007209,
+ 11986329, 11965316, 11944172, 11922894, 11901485, 11879943, 11858269,
+ 11836463, 11814525, 11792455, 11770254, 11747921, 11725456, 11702860,
+ 11680133, 11657275, 11634285, 11611165, 11587914, 11564532, 11541019,
+ 11517376, 11493603, 11469699, 11445666, 11421502, 11397209, 11372786,
+ 11348233, 11323551, 11298739, 11273799, 11248729, 11223530, 11198203,
+ 11172747, 11147163, 11121450, 11095609, 11069640, 11043543, 11017318,
+ 10990965, 10964486, 10937878, 10911144, 10884283, 10857295, 10830180,
+ 10802938, 10775571, 10748077, 10720457, 10692711, 10664839, 10636842,
+ 10608720, 10580472, 10552099, 10523602, 10494979, 10466233, 10437361,
+ 10408366, 10379247, 10350004, 10320637, 10291147, 10261533, 10231797,
+ 10201938, 10171956, 10141851, 10111624, 10081275, 10050805, 10020212,
+ 9989498, 9958662, 9927706, 9896628, 9865430, 9834112, 9802672, 9771113,
+ 9739434, 9707636, 9675717, 9643680, 9611523, 9579248, 9546854, 9514341,
+ 9481711, 9448962, 9416096, 9383112, 9350011, 9316792, 9283457, 9250006,
+ 9216437, 9182753, 9148953, 9115037, 9081005, 9046859, 9012597, 8978221,
+ 8943730, 8909125, 8874405, 8839572, 8804626, 8769566, 8734393, 8699107,
+ 8663709, 8628198, 8592576, 8556841, 8520995, 8485038, 8448970, 8412790,
+ 8376501, 8340101, 8303591, 8266972, 8230243, 8193404, 8156457, 8119402,
+ 8082237, 8044965, 8007585, 7970097, 7932502, 7894801, 7856992, 7819077,
+ 7781055, 7742928, 7704695, 7666357, 7627914, 7589366, 7550714, 7511957,
+ 7473097, 7434133, 7395066, 7355895, 7316622, 7277247, 7237770, 7198190,
+ 7158509, 7118727, 7078844, 7038861, 6998777, 6958593, 6918310, 6877927,
+ 6837445, 6796864, 6756185, 6715408, 6674533, 6633560, 6592491, 6551324,
+ 6510061, 6468702, 6427247, 6385696, 6344050, 6302309, 6260474, 6218544,
+ 6176520, 6134403, 6092192, 6049889, 6007493, 5965005, 5922424, 5879753,
+ 5836990, 5794136, 5751191, 5708156, 5665032, 5621818, 5578514, 5535122,
+ 5491641, 5448072, 5404416, 5360672, 5316841, 5272923, 5228918, 5184828,
+ 5140652, 5096391, 5052045, 5007614, 4963099, 4918500, 4873818, 4829052,
+ 4784204, 4739273, 4694260, 4649166, 4603990, 4558734, 4513396, 4467979,
+ 4422482, 4376906, 4331250, 4285516, 4239703, 4193813, 4147845, 4101800,
+ 4055678, 4009480, 3963205, 3916856, 3870431, 3823931, 3777356, 3730708,
+ 3683986, 3637191, 3590323, 3543382, 3496369, 3449285, 3402130, 3354903,
+ 3307606, 3260239, 3212802, 3165296, 3117721, 3070078, 3022367, 2974588,
+ 2926741, 2878828, 2830849, 2782803, 2734692, 2686515, 2638274, 2589969,
+ 2541599, 2493166, 2444670, 2396112, 2347490, 2298808, 2250063, 2201258,
+ 2152392, 2103466, 2054480, 2005435, 1956331, 1907169, 1857948, 1808670,
+ 1759335, 1709943, 1660495, 1610990, 1561431, 1511816, 1462147, 1412424,
+ 1362647, 1312817, 1262934, 1212998, 1163011, 1112972, 1062883, 1012742,
+ 962552, 912311, 862022, 811684, 761297, 710862, 660380, 609851, 559275,
+ 508654, 457986, 407273, 356516, 305714, 254869, 203980, 153048, 102074,
+ 51057, 0, -51098, -102238, -153418, -204637, -255896, -307193, -358529,
+ -409903, -461314, -512762, -564246, -615766, -667322, -718913, -770538,
+ -822198, -873891, -925617, -977376, -1029167, -1080990, -1132844,
+ -1184729, -1236644, -1288589, -1340563, -1392566, -1444597, -1496657,
+ -1548743, -1600857, -1652997, -1705163, -1757355, -1809571, -1861812,
+ -1914077, -1966366, -2018677, -2071012, -2123368, -2175746, -2228145,
+ -2280564, -2333004, -2385463, -2437941, -2490438, -2542953, -2595486,
+ -2648036, -2700603, -2753186, -2805784, -2858398, -2911026, -2963668,
+ -3016324, -3068994, -3121676, -3174370, -3227076, -3279793, -3332521,
+ -3385258, -3438006, -3490763, -3543528, -3596302, -3649083, -3701871,
+ -3754666, -3807468, -3860274, -3913086, -3965903, -4018724, -4071548,
+ -4124376, -4177206, -4230038, -4282872, -4335706, -4388542, -4441377,
+ -4494212, -4547046, -4599878, -4652709, -4705537, -4758362, -4811183,
+ -4864001, -4916813, -4969621, -5022423, -5075219, -5128009, -5180791,
+ -5233566, -5286332, -5339090, -5391838, -5444577, -5497306, -5550023,
+ -5602730, -5655425, -5708107, -5760777, -5813433, -5866075, -5918703,
+ -5971316, -6023914, -6076495, -6129060, -6181609, -6234139, -6286652,
+ -6339146, -6391621, -6444076, -6496511, -6548926, -6601319, -6653691,
+ -6706040, -6758367, -6810670, -6862950, -6915205, -6967435, -7019640,
+ -7071820, -7123972, -7176098, -7228196, -7280267, -7332308, -7384321,
+ -7436304, -7488257, -7540180, -7592071, -7643931, -7695758, -7747553,
+ -7799314, -7851042, -7902735, -7954393, -8006016, -8057603, -8109154,
+ -8160668, -8212144, -8263582, -8314982, -8366343, -8417664, -8468945,
+ -8520185, -8571384, -8622542, -8673657, -8724730, -8775759, -8826744,
+ -8877685, -8928581, -8979432, -9030237, -9080996, -9131707, -9182371,
+ -9232987, -9283554, -9334073, -9384541, -9434960, -9485328, -9535644,
+ -9585909, -9636122, -9686282, -9736389, -9786441, -9836440, -9886383,
+ -9936272, -9986104, -10035880, -10085598, -10135260, -10184863,
+ -10234408, -10283893, -10333319, -10382685, -10431990, -10481235,
+ -10530417, -10579537, -10628594, -10677588, -10726519, -10775385,
+ -10824186, -10872921, -10921591, -10970195, -11018731, -11067200,
+ -11115601, -11163934, -11212197, -11260391, -11308515, -11356569,
+ -11404551, -11452461, -11500300, -11548066, -11595758, -11643377,
+ -11690922, -11738392, -11785786, -11833105, -11880348, -11927514,
+ -11974602, -12021613, -12068545, -12115399, -12162173, -12208867,
+ -12255481, -12302013, -12348465, -12394834, -12441121, -12487325,
+ -12533446, -12579482, -12625434, -12671301, -12717082, -12762778,
+ -12808387, -12853908, -12899343, -12944689, -12989946, -13035115,
+ -13080194, -13125182, -13170081, -13214888, -13259603, -13304226,
+ -13348757, -13393195, -13437539, -13481788, -13525944, -13570004,
+ -13613968, -13657836, -13701608, -13745282, -13788859, -13832338,
+ -13875718, -13918999, -13962181, -14005262, -14048242, -14091122,
+ -14133900, -14176576, -14219149, -14261619, -14303986, -14346249,
+ -14388407, -14430460, -14472407, -14514249, -14555984, -14597612,
+ -14639132, -14680545, -14721849, -14763044, -14804130, -14845106,
+ -14885972, -14926727, -14967370, -15007902, -15048321, -15088627,
+ -15128821, -15168900, -15208866, -15248716, -15288452, -15328072,
+ -15367576, -15406963, -15446233, -15485386, -15524421, -15563337,
+ -15602134, -15640812, -15679370, -15717808, -15756125, -15794321,
+ -15832395, -15870347, -15908176, -15945882, -15983465, -16020924,
+ -16058258, -16095467, -16132551, -16169508, -16206340, -16243045,
+ -16279623, -16316073, -16352394, -16388588, -16424652, -16460587,
+ -16496392, -16532066, -16567610, -16603023, -16638304, -16673452,
+ -16708468, -16743351, -16778101, -16812717, -16847198, -16881545,
+ -16915756, -16949832, -16983771, -17017574, -17051241, -17084769,
+ -17118160, -17151413, -17184527, -17217502, -17250338, -17283033,
+ -17315588, -17348002, -17380275, -17412407, -17444396, -17476243,
+ -17507947, -17539508, -17570925, -17602197, -17633325, -17664309,
+ -17695146, -17725838, -17756384, -17786783, -17817036, -17847140,
+ -17877097, -17906906, -17936566, -17966077, -17995438, -18024650,
+ -18053711, -18082622, -18111381, -18139990, -18168446, -18196750,
+ -18224902, -18252900, -18280746, -18308437, -18335974, -18363357,
+ -18390585, -18417657, -18444574, -18471334, -18497939, -18524386,
+ -18550676, -18576809, -18602783, -18628599, -18654257, -18679755,
+ -18705094, -18730273, -18755292, -18780151, -18804848, -18829384,
+ -18853759, -18877971, -18902021, -18925909, -18949633, -18973194,
+ -18996591, -19019824, -19042893, -19065796, -19088535, -19111108,
+ -19133515, -19155756, -19177830, -19199737, -19221477, -19243050,
+ -19264454, -19285691, -19306758, -19327657, -19348386, -19368946,
+ -19389336, -19409556, -19429605, -19449483, -19469190, -19488726,
+ -19508089, -19527280, -19546299, -19565145, -19583818, -19602317,
+ -19620643, -19638794, -19656771, -19674574, -19692201, -19709653,
+ -19726929, -19744030, -19760954, -19777702, -19794273, -19810667,
+ -19826883, -19842922, -19858782, -19874465, -19889969, -19905294,
+ -19920439, -19935406, -19950192, -19964799, -19979225, -19993471,
+ -20007536, -20021420, -20035122, -20048643, -20061982, -20075139,
+ -20088113, -20100905, -20113513, -20125938, -20138180, -20150238,
+ -20162112, -20173802, -20185307, -20196627, -20207763, -20218712,
+ -20229477, -20240056, -20250448, -20260654, -20270674, -20280507,
+ -20290153, -20299612, -20308883, -20317967, -20326863, -20335570,
+ -20344089, -20352420, -20360561, -20368514, -20376277, -20383851,
+ -20391235, -20398429, -20405432, -20412246, -20418869, -20425301,
+ -20431542, -20437592, -20443450, -20449117, -20454592, -20459875,
+ -20464965, -20469863, -20474569, -20479082, -20483402, -20487528,
+ -20491461, -20495201, -20498747, -20502099, -20505257, -20508220,
+ -20510989, -20513563, -20515943, -20518128, -20520117, -20521911,
+ -20523509, -20524912, -20526119, -20527130, -20527945, -20528564,
+ -20528986, -20529211, -20529240, -20529072, -20528706, -20528144,
+ -20527384, -20526426, -20525271, -20523918, -20522367, -20520618,
+ -20518671, -20516526, -20514182, -20511639, -20508898, -20505958,
+ -20502818, -20499480, -20495943, -20492206, -20488270, -20484134,
+ -20479798, -20475263, -20470528, -20465593, -20460457, -20455122,
+ -20449586, -20443849, -20437913, -20431775, -20425437, -20418898,
+ -20412158, -20405217, -20398075, -20390732, -20383188, -20375442,
+ -20367495, -20359347, -20350997, -20342445, -20333692, -20324737,
+ -20315580, -20306221, -20296660, -20286897, -20276932, -20266765,
+ -20256396, -20245825, -20235051, -20224075, -20212896, -20201515,
+ -20189932, -20178146, -20166157, -20153966, -20141572, -20128976,
+ -20116176, -20103174, -20089970, -20076562, -20062951, -20049138,
+ -20035122, -20020903, -20006481, -19991856, -19977028, -19961997,
+ -19946764, -19931327, -19915687, -19899844, -19883799, -19867550,
+ -19851098, -19834444, -19817586, -19800526, -19783262, -19765796,
+ -19748126, -19730254, -19712179, -19693901, -19675420, -19656736,
+ -19637850, -19618760, -19599468, -19579974, -19560276, -19540376,
+ -19520273, -19499968, -19479460, -19458750, -19437837, -19416722,
+ -19395405, -19373885, -19352163, -19330239, -19308113, -19285785,
+ -19263255, -19240522, -19217588, -19194453, -19171115, -19147576,
+ -19123835, -19099893, -19075749, -19051404, -19026858, -19002110,
+ -18977162, -18952012, -18926661, -18901110, -18875358, -18849405,
+ -18823252, -18796898, -18770344, -18743590, -18716636, -18689481,
+ -18662127, -18634573, -18606819, -18578866, -18550713, -18522361,
+ -18493810, -18465059, -18436110, -18406962, -18377615, -18348070,
+ -18318326, -18288384, -18258243, -18227905, -18197369, -18166635,
+ -18135704, -18104575, -18073249, -18041726, -18010005, -17978088,
+ -17945975, -17913664, -17881158, -17848455, -17815557, -17782462,
+ -17749172, -17715686, -17682005, -17648129, -17614058, -17579792,
+ -17545332, -17510677, -17475828, -17440785, -17405548, -17370118,
+ -17334494, -17298676, -17262666, -17226463, -17190067, -17153479,
+ -17116699, -17079726, -17042562, -17005206, -16967659, -16929920,
+ -16891991, -16853871, -16815560, -16777059, -16738368, -16699488,
+ -16660417, -16621158, -16581709, -16542071, -16502245, -16462230,
+ -16422027, -16381636, -16341058, -16300292, -16259339, -16218199,
+ -16176872, -16135359, -16093660, -16051775, -16009705, -15967449,
+ -15925008, -15882382, -15839571, -15796577, -15753398, -15710036,
+ -15666490, -15622761, -15578849, -15534755, -15490478, -15446020,
+ -15401379, -15356558, -15311555, -15266371, -15221007, -15175462,
+ -15129738, -15083834, -15037751, -14991489, -14945048, -14898428,
+ -14851631, -14804656, -14757503, -14710174, -14662667, -14614984,
+ -14567125, -14519090, -14470880, -14422495, -14373935, -14325200,
+ -14276291, -14227209, -14177953, -14128524, -14078922, -14029148,
+ -13979201, -13929083, -13878794, -13828334, -13777703, -13726902,
+ -13675930, -13624790, -13573480, -13522001, -13470354, -13418539,
+ -13366556, -13314406, -13262089, -13209605, -13156955, -13104140,
+ -13051159, -12998013, -12944702, -12891227, -12837588, -12783786,
+ -12729820, -12675692, -12621402, -12566950, -12512336, -12457561,
+ -12402626, -12347530, -12292275, -12236860, -12181286, -12125553,
+ -12069663, -12013614, -11957408, -11901046, -11844527, -11787851,
+ -11731021, -11674035, -11616894, -11559599, -11502150, -11444547,
+ -11386792, -11328884, -11270824, -11212612, -11154249, -11095735,
+ -11037071, -10978257, -10919293, -10860181, -10800920, -10741511,
+ -10681954, -10622251, -10562400, -10502404, -10442261, -10381974,
+ -10321542, -10260965, -10200245, -10139381, -10078374, -10017225,
+ -9955934, -9894502, -9832928, -9771215, -9709361, -9647368, -9585235,
+ -9522965, -9460556, -9398010, -9335327, -9272507, -9209552, -9146461,
+ -9083235, -9019874, -8956380, -8892752, -8828991, -8765098, -8701073,
+ -8636916, -8572629, -8508211, -8443664, -8378987, -8314182, -8249248,
+ -8184186, -8118998, -8053683, -7988241, -7922674, -7856983, -7791166,
+ -7725226, -7659162, -7592975, -7526667, -7460236, -7393684, -7327011,
+ -7260219, -7193307, -7126275, -7059126, -6991858, -6924473, -6856972,
+ -6789354, -6721620, -6653772, -6585809, -6517732, -6449542, -6381239,
+ -6312823, -6244296, -6175658, -6106910, -6038052, -5969084, -5900007,
+ -5830823, -5761531, -5692132, -5622626, -5553015, -5483298, -5413477,
+ -5343552, -5273523, -5203392, -5133158, -5062823, -4992387, -4921850,
+ -4851214, -4780478, -4709644, -4638712, -4567682, -4496556, -4425333,
+ -4354015, -4282602, -4211094, -4139493, -4067799, -3996013, -3924134,
+ -3852165, -3780105, -3707955, -3635715, -3563387, -3490971, -3418467,
+ -3345877, -3273201, -3200439, -3127592, -3054660, -2981646, -2908548,
+ -2835368, -2762106, -2688763, -2615340, -2541837, -2468255, -2394595,
+ -2320857, -2247041, -2173150, -2099182, -2025139, -1951022, -1876831,
+ -1802566, -1728229, -1653821, -1579341, -1504790, -1430170, -1355480,
+ -1280722, -1205896, -1131003, -1056043, -981017, -905927, -830771,
+ -755552, -680270, -604925, -529518, -454051, -378523, -302935, -227288,
+ -151583, -75820, 0, 75876, 151808, 227795, 303836, 379931, 456078,
+ 532278, 608529, 684831, 761183, 837585, 914035, 990533, 1067079,
+ 1143671, 1220309, 1296992, 1373719, 1450491, 1527305, 1604162, 1681060,
+ 1758000, 1834979, 1911998, 1989056, 2066152, 2143285, 2220455, 2297661,
+ 2374902, 2452178, 2529487, 2606830, 2684204, 2761611, 2839048, 2916515,
+ 2994012, 3071538, 3149092, 3226673, 3304280, 3381913, 3459572, 3537255,
+ 3614961, 3692690, 3770442, 3848215, 3926008, 4003822, 4081655, 4159506,
+ 4237375, 4315261, 4393164, 4471082, 4549015, 4626961, 4704922, 4782894,
+ 4860879, 4938875, 5016881, 5094897, 5172921, 5250954, 5328994, 5407041,
+ 5485094, 5563152, 5641214, 5719280, 5797349, 5875420, 5953492, 6031565,
+ 6109638, 6187710, 6265781, 6343849, 6421914, 6499975, 6578032, 6656083,
+ 6734128, 6812166, 6890197, 6968219, 7046232, 7124235, 7202228, 7280209,
+ 7358177, 7436133, 7514075, 7592003, 7669916, 7747812, 7825692, 7903554,
+ 7981398, 8059223, 8137028, 8214813, 8292576, 8370317, 8448035, 8525730,
+ 8603400, 8681046, 8758665, 8836257, 8913822, 8991359, 9068867, 9146345,
+ 9223793, 9301209, 9378594, 9455945, 9533263, 9610546, 9687795, 9765007,
+ 9842183, 9919321, 9996421, 10073483, 10150504, 10227485, 10304424,
+ 10381322, 10458177, 10534988, 10611754, 10688476, 10765152, 10841781,
+ 10918362, 10994895, 11071380, 11147814, 11224198, 11300531, 11376811,
+ 11453039, 11529213, 11605332, 11681397, 11757405, 11833357, 11909251,
+ 11985087, 12060864, 12136581, 12212237, 12287832, 12363365, 12438835,
+ 12514242, 12589583, 12664860, 12740071, 12815215, 12890291, 12965299,
+ 13040238, 13115107, 13189905, 13264633, 13339287, 13413869, 13488377,
+ 13562811, 13637170, 13711452, 13785658, 13859786, 13933835, 14007806,
+ 14081697, 14155507, 14229235, 14302882, 14376445, 14449925, 14523320,
+ 14596630, 14669854, 14742992, 14816041, 14889002, 14961875, 15034657,
+ 15107349, 15179949, 15252457, 15324872, 15397194, 15469421, 15541553,
+ 15613588, 15685527, 15757369, 15829112, 15900757, 15972301, 16043745,
+ 16115088, 16186328, 16257466, 16328500, 16399430, 16470254, 16540973,
+ 16611585, 16682090, 16752486, 16822774, 16892952, 16963019, 17032976,
+ 17102820, 17172552, 17242171, 17311675, 17381064, 17450338, 17519495,
+ 17588535, 17657457, 17726260, 17794944, 17863508, 17931951, 18000272,
+ 18068470, 18136546, 18204498, 18272324, 18340026, 18407601, 18475050,
+ 18542371, 18609564, 18676627, 18743561, 18810364, 18877035, 18943575,
+ 19009982, 19076255, 19142394, 19208398, 19274267, 19339998, 19405593,
+ 19471050, 19536368, 19601547, 19666585, 19731483, 19796239, 19860853,
+ 19925324, 19989651, 20053834, 20117871, 20181763, 20245508, 20309105,
+ 20372555, 20435855, 20499007, 20562007, 20624858, 20687556, 20750102,
+ 20812495, 20874734, 20936819, 20998748, 21060522, 21122139, 21183598,
+ 21244900, 21306043, 21367026, 21427849, 21488512, 21549013, 21609351,
+ 21669527, 21729539, 21789386, 21849069, 21908586, 21967937, 22027120,
+ 22086136, 22144983, 22203661, 22262169, 22320506, 22378672, 22436667,
+ 22494488, 22552137, 22609611, 22666911, 22724036, 22780984, 22837756,
+ 22894351, 22950767, 23007005, 23063064, 23118942, 23174640, 23230156,
+ 23285490, 23340642, 23395610, 23450395, 23504994, 23559409, 23613637,
+ 23667678, 23721533, 23775199, 23828677, 23881965, 23935064, 23987972,
+ 24040689, 24093214, 24145546, 24197685, 24249631, 24301382, 24352938,
+ 24404299, 24455463, 24506430, 24557199, 24607770, 24658143, 24708316,
+ 24758289, 24808061, 24857631, 24907000, 24956166, 25005129, 25053888,
+ 25102443, 25150792, 25198936, 25246874, 25294604, 25342128, 25389443,
+ 25436549, 25483446, 25530133, 25576609, 25622875, 25668928, 25714770,
+ 25760398, 25805813, 25851014, 25896000, 25940771, 25985326, 26029664,
+ 26073786, 26117690, 26161375, 26204842, 26248090, 26291117, 26333925,
+ 26376511, 26418875, 26461017, 26502937, 26544633, 26586105, 26627353,
+ 26668376, 26709173, 26749745, 26790089, 26830206, 26870096, 26909757,
+ 26949189, 26988392, 27027365, 27066108, 27104619, 27142899, 27180947,
+ 27218762, 27256344, 27293692, 27330806, 27367685, 27404329, 27440738,
+ 27476910, 27512845, 27548542, 27584002, 27619224, 27654206, 27688950,
+ 27723453, 27757716, 27791738, 27825519, 27859057, 27892354, 27925407,
+ 27958217, 27990783, 28023105, 28055182, 28087014, 28118600, 28149939,
+ 28181032, 28211877, 28242475, 28272825, 28302926, 28332777, 28362379,
+ 28391732, 28420833, 28449684, 28478283, 28506630, 28534725, 28562567,
+ 28590156, 28617491, 28644572, 28671398, 28697969, 28724285, 28750345,
+ 28776149, 28801696, 28826985, 28852017, 28876791, 28901307, 28925563,
+ 28949561, 28973298, 28996775, 29019992, 29042948, 29065643, 29088075,
+ 29110246, 29132154, 29153798, 29175180, 29196298, 29217151, 29237740,
+ 29258064, 29278123, 29297916, 29317443, 29336703, 29355697, 29374423,
+ 29392882, 29411073, 29428995, 29446649, 29464034, 29481149, 29497994,
+ 29514570, 29530875, 29546909, 29562672, 29578163, 29593382, 29608330,
+ 29623004, 29637406, 29651535, 29665390, 29678971, 29692278, 29705310,
+ 29718068, 29730550, 29742757, 29754688, 29766343, 29777721, 29788823,
+ 29799648, 29810195, 29820465, 29830457, 29840171, 29849606, 29858762,
+ 29867639, 29876237, 29884555, 29892593, 29900351, 29907829, 29915025,
+ 29921941, 29928575, 29934928, 29940999, 29946788, 29952294, 29957518,
+ 29962459, 29967117, 29971491, 29975582, 29979389, 29982912, 29986151,
+ 29989105, 29991774, 29994159, 29996258, 29998071, 29999599, 30000841,
+ 30001797, 30002467, 30002850, 30002946, 30002756, 30002278, 30001513,
+ 30000460, 29999119, 29997491, 29995574, 29993370, 29990876, 29988094,
+ 29985023, 29981663, 29978014, 29974075, 29969847, 29965329, 29960522,
+ 29955424, 29950036, 29944358, 29938389, 29932129, 29925579, 29918738,
+ 29911605, 29904182, 29896467, 29888460, 29880162, 29871572, 29862691,
+ 29853517, 29844051, 29834293, 29824242, 29813899, 29803264, 29792336,
+ 29781115, 29769601, 29757794, 29745694, 29733301, 29720615, 29707635,
+ 29694362, 29680795, 29666935, 29652781, 29638333, 29623592, 29608557,
+ 29593227, 29577604, 29561687, 29545475, 29528969, 29512170, 29495075,
+ 29477687, 29460004, 29442027, 29423755, 29405189, 29386329, 29367174,
+ 29347724, 29327980, 29307941, 29287607, 29266979, 29246057, 29224839,
+ 29203327, 29181521, 29159419, 29137023, 29114333, 29091347, 29068068,
+ 29044493, 29020624, 28996461, 28972002, 28947250, 28922203, 28896861,
+ 28871225, 28845295, 28819070, 28792551, 28765737, 28738630, 28711228,
+ 28683532, 28655543, 28627259, 28598681, 28569809, 28540644, 28511185,
+ 28481432, 28451386, 28421046, 28390413, 28359487, 28328267, 28296754,
+ 28264948, 28232849, 28200458, 28167773, 28134796, 28101527, 28067965,
+ 28034111, 27999964, 27965526, 27930796, 27895774, 27860460, 27824854,
+ 27788958, 27752770, 27716291, 27679520, 27642460, 27605108, 27567466,
+ 27529533, 27491311, 27452798, 27413995, 27374903, 27335521, 27295850,
+ 27255889, 27215640, 27175102, 27134275, 27093159, 27051756, 27010064,
+ 26968084, 26925817, 26883262, 26840420, 26797291, 26753875, 26710173,
+ 26666183, 26621908, 26577347, 26532500, 26487368, 26441950, 26396247,
+ 26350259, 26303987, 26257431, 26210590, 26163466, 26116058, 26068366,
+ 26020392, 25972135, 25923595, 25874773, 25825669, 25776283, 25726615,
+ 25676667, 25626438, 25575928, 25525137, 25474067, 25422717, 25371087,
+ 25319178, 25266991, 25214525, 25161780, 25108758, 25055458, 25001881,
+ 24948027, 24893896, 24839488, 24784805, 24729846, 24674612, 24619103,
+ 24563319, 24507261, 24450928, 24394323, 24337443, 24280291, 24222867,
+ 24165170, 24107201, 24048961, 23990449, 23931667, 23872615, 23813293,
+ 23753700, 23693839, 23633709, 23573310, 23512644, 23451709, 23390508,
+ 23329039, 23267304, 23205303, 23143036, 23080504, 23017708, 22954646,
+ 22891321, 22827732, 22763880, 22699766, 22635388, 22570750, 22505849,
+ 22440688, 22375266, 22309584, 22243643, 22177442, 22110982, 22044264,
+ 21977289, 21910056, 21842566, 21774819, 21706817, 21638559, 21570046,
+ 21501279, 21432257, 21362982, 21293454, 21223673, 21153640, 21083356,
+ 21012820, 20942034, 20870997, 20799712, 20728176, 20656393, 20584361,
+ 20512082, 20439556, 20366783, 20293764, 20220500, 20146991, 20073237,
+ 19999240, 19924999, 19850516, 19775790, 19700823, 19625614, 19550165,
+ 19474476, 19398547, 19322380, 19245974, 19169331, 19092450, 19015332,
+ 18937979, 18860390, 18782566, 18704508, 18626216, 18547691, 18468933,
+ 18389944, 18310723, 18231271, 18151589, 18071678, 17991538, 17911169,
+ 17830573, 17749749, 17668699, 17587423, 17505922, 17424196, 17342246,
+ 17260073, 17177677, 17095059, 17012219, 16929159, 16845878, 16762378,
+ 16678659, 16594721, 16510566, 16426195, 16341606, 16256803, 16171784,
+ 16086551, 16001104, 15915445, 15829573, 15743489, 15657195, 15570690,
+ 15483976, 15397053, 15309921, 15222583, 15135037, 15047285, 14959328,
+ 14871166, 14782800, 14694231, 14605460, 14516486, 14427311, 14337936,
+ 14248361, 14158587, 14068614, 13978445, 13888078, 13797515, 13706757,
+ 13615804, 13524657, 13433317, 13341785, 13250061, 13158146, 13066040,
+ 12973746, 12881262, 12788591, 12695733, 12602688, 12509457, 12416042,
+ 12322442, 12228660, 12134694, 12040547, 11946219, 11851710, 11757022,
+ 11662156, 11567111, 11471890, 11376492, 11280918, 11185170, 11089248,
+ 10993153, 10896885, 10800446, 10703836, 10607057, 10510108, 10412991,
+ 10315706, 10218255, 10120638, 10022856, 9924910, 9826800, 9728528,
+ 9630094, 9531499, 9432744, 9333830, 9234758, 9135528, 9036141, 8936599,
+ 8836901, 8737050, 8637045, 8536888, 8436579, 8336119, 8235509, 8134751,
+ 8033844, 7932790, 7831590, 7730244, 7628753, 7527119, 7425342, 7323422,
+ 7221362, 7119161, 7016821, 6914342, 6811725, 6708972, 6606083, 6503059,
+ 6399901, 6296610, 6193187, 6089632, 5985947, 5882132, 5778188, 5674117,
+ 5569919, 5465595, 5361146, 5256572, 5151876, 5047057, 4942117, 4837057,
+ 4731877, 4626579, 4521163, 4415630, 4309981, 4204218, 4098340, 3992350,
+ 3886248, 3780034, 3673711, 3567278, 3460737, 3354088, 3247334, 3140473,
+ 3033509, 2926440, 2819270, 2711997, 2604624, 2497152, 2389580, 2281911,
+ 2174145, 2066283, 1958327, 1850276, 1742133, 1633897, 1525571, 1417155,
+ 1308649, 1200056, 1091375, 982609, 873757, 764821, 655803, 546702,
+ 437519, 328257, 218916, 109496, 0, -109572, -219220, -328943, -438738,
+ -548606, -658544, -768553, -878631, -988778, -1098991, -1209270,
+ -1319615, -1430024, -1540495, -1651029, -1761624, -1872279, -1982993,
+ -2093765, -2204593, -2315478, -2426418, -2537411, -2648458, -2759556,
+ -2870705, -2981904, -3093152, -3204447, -3315789, -3427177, -3538609,
+ -3650085, -3761603, -3873163, -3984763, -4096403, -4208081, -4319796,
+ -4431547, -4543334, -4655155, -4767009, -4878895, -4990813, -5102760,
+ -5214736, -5326740, -5438770, -5550827, -5662908, -5775013, -5887140,
+ -5999289, -6111458, -6223647, -6335854, -6448078, -6560319, -6672575,
+ -6784844, -6897127, -7009422, -7121727, -7234043, -7346367, -7458698,
+ -7571037, -7683380, -7795729, -7908080, -8020434, -8132789, -8245145,
+ -8357499, -8469851, -8582200, -8694545, -8806885, -8919218, -9031544,
+ -9143862, -9256170, -9368467, -9480752, -9593025, -9705283, -9817527,
+ -9929755, -10041965, -10154157, -10266330, -10378482, -10490613,
+ -10602721, -10714805, -10826865, -10938898, -11050905, -11162883,
+ -11274833, -11386752, -11498639, -11610495, -11722316, -11834103,
+ -11945854, -12057569, -12169245, -12280883, -12392480, -12504036,
+ -12615549, -12727020, -12838445, -12949825, -13061159, -13172444,
+ -13283681, -13394867, -13506002, -13617085, -13728115, -13839090,
+ -13950010, -14060873, -14171679, -14282425, -14393112, -14503737,
+ -14614301, -14724801, -14835236, -14945607, -15055910, -15166146,
+ -15276314, -15386411, -15496437, -15606392, -15716273, -15826079,
+ -15935811, -16045466, -16155043, -16264542, -16373960, -16483298,
+ -16592554, -16701726, -16810815, -16919818, -17028735, -17137564,
+ -17246304, -17354955, -17463515, -17571982, -17680357, -17788638,
+ -17896823, -18004912, -18112904, -18220797, -18328590, -18436282,
+ -18543873, -18651360, -18758744, -18866022, -18973194, -19080259,
+ -19187215, -19294062, -19400797, -19507421, -19613933, -19720330,
+ -19826612, -19932778, -20038827, -20144757, -20250568, -20356258,
+ -20461826, -20567272, -20672594, -20777791, -20882862, -20987806,
+ -21092621, -21197307, -21301863, -21406287, -21510579, -21614737,
+ -21718760, -21822648, -21926398, -22030010, -22133483, -22236816,
+ -22340008, -22443057, -22545963, -22648724, -22751339, -22853808,
+ -22956129, -23058301, -23160323, -23262194, -23363913, -23465478,
+ -23566890, -23668146, -23769245, -23870187, -23970970, -24071594,
+ -24172057, -24272358, -24372496, -24472470, -24572279, -24671922,
+ -24771397, -24870705, -24969843, -25068811, -25167607, -25266231,
+ -25364681, -25462957, -25561057, -25658980, -25756725, -25854291,
+ -25951678, -26048883, -26145906, -26242747, -26339403, -26435873,
+ -26532158, -26628255, -26724164, -26819884, -26915413, -27010750,
+ -27105895, -27200846, -27295603, -27390164, -27484528, -27578695,
+ -27672662, -27766430, -27859997, -27953362, -28046524, -28139483,
+ -28232236, -28324783, -28417123, -28509255, -28601178, -28692890,
+ -28784392, -28875681, -28966758, -29057619, -29148266, -29238697,
+ -29328910, -29418905, -29508680, -29598236, -29687570, -29776681,
+ -29865570, -29954234, -30042672, -30130885, -30218870, -30306627,
+ -30394154, -30481451, -30568517, -30655350, -30741950, -30828316,
+ -30914447, -31000341, -31085998, -31171417, -31256596, -31341536,
+ -31426234, -31510690, -31594903, -31678872, -31762595, -31846073,
+ -31929304, -32012286, -32095020, -32177504, -32259737, -32341718,
+ -32423447, -32504922, -32586142, -32667106, -32747814, -32828264,
+ -32908456, -32988388, -33068060, -33147471, -33226619, -33305505,
+ -33384126, -33462482, -33540572, -33618395, -33695950, -33773237,
+ -33850254, -33927000, -34003475, -34079677, -34155606, -34231260,
+ -34306640, -34381743, -34456569, -34531118, -34605387, -34679377,
+ -34753086, -34826514, -34899659, -34972521, -35045098, -35117391,
+ -35189398, -35261117, -35332549, -35403693, -35474547, -35545110,
+ -35615383, -35685363, -35755050, -35824443, -35893542, -35962345,
+ -36030851, -36099060, -36166971, -36234583, -36301895, -36368907,
+ -36435617, -36502024, -36568128, -36633928, -36699424, -36764613,
+ -36829496, -36894071, -36958338, -37022296, -37085945, -37149282,
+ -37212308, -37275021, -37337422, -37399508, -37461280, -37522736,
+ -37583875, -37644698, -37705202, -37765388, -37825254, -37884800,
+ -37944024, -38002927, -38061506, -38119763, -38177695, -38235302,
+ -38292583, -38349537, -38406164, -38462463, -38518433, -38574074,
+ -38629384, -38684362, -38739009, -38793323, -38847304, -38900951,
+ -38954262, -39007238, -39059878, -39112181, -39164145, -39215771,
+ -39267058, -39318005, -39368611, -39418876, -39468798, -39518378,
+ -39567614, -39616505, -39665052, -39713253, -39761108, -39808615,
+ -39855775, -39902587, -39949049, -39995161, -40040923, -40086334,
+ -40131393, -40176099, -40220452, -40264451, -40308096, -40351386,
+ -40394319, -40436897, -40479117, -40520979, -40562483, -40603628,
+ -40644413, -40684838, -40724902, -40764604, -40803944, -40842922,
+ -40881535, -40919785, -40957670, -40995190, -41032344, -41069131,
+ -41105551, -41141604, -41177288, -41212603, -41247549, -41282125,
+ -41316330, -41350164, -41383626, -41416715, -41449432, -41481775,
+ -41513744, -41545339, -41576558, -41607402, -41637869, -41667960,
+ -41697673, -41727008, -41755965, -41784542, -41812741, -41840559,
+ -41867996, -41895053, -41921728, -41948020, -41973930, -41999457,
+ -42024601, -42049360, -42073735, -42097724, -42121328, -42144545,
+ -42167377, -42189821, -42211877, -42233545, -42254825, -42275716,
+ -42296218, -42316330, -42336051, -42355381, -42374321, -42392868,
+ -42411024, -42428787, -42446157, -42463133, -42479716, -42495904,
+ -42511698, -42527096, -42542099, -42556706, -42570917, -42584731,
+ -42598147, -42611166, -42623788, -42636010, -42647834, -42659259,
+ -42670285, -42680911, -42691136, -42700961, -42710384, -42719407,
+ -42728028, -42736246, -42744063, -42751476, -42758487, -42765094,
+ -42771297, -42777097, -42782491, -42787481, -42792066, -42796246,
+ -42800020, -42803388, -42806350, -42808905, -42811053, -42812794,
+ -42814127, -42815052, -42815570, -42815679, -42815380, -42814671,
+ -42813554, -42812027, -42810090, -42807744, -42804987, -42801820,
+ -42798242, -42794253, -42789853, -42785041, -42779818, -42774183,
+ -42768136, -42761676, -42754804, -42747520, -42739822, -42731711,
+ -42723187, -42714249, -42704897, -42695132, -42684952, -42674358,
+ -42663350, -42651927, -42640089, -42627836, -42615168, -42602085,
+ -42588586, -42574671, -42560341, -42545595, -42530433, -42514854,
+ -42498860, -42482448, -42465621, -42448376, -42430715, -42412637,
+ -42394142, -42375230, -42355900, -42336153, -42315989, -42295407,
+ -42274408, -42252991, -42231156, -42208904, -42186233, -42163145,
+ -42139639, -42115714, -42091372, -42066611, -42041432, -42015835,
+ -41989820, -41963386, -41936534, -41909264, -41881575, -41853468,
+ -41824942, -41795998, -41766636, -41736855, -41706655, -41676038,
+ -41645002, -41613547, -41581674, -41549383, -41516673, -41483546,
+ -41450000, -41416035, -41381653, -41346852, -41311634, -41275997,
+ -41239943, -41203470, -41166580, -41129272, -41091546, -41053403,
+ -41014842, -40975864, -40936469, -40896656, -40856426, -40815780,
+ -40774716, -40733235, -40691338, -40649024, -40606294, -40563148,
+ -40519585, -40475607, -40431212, -40386402, -40341176, -40295535,
+ -40249478, -40203007, -40156120, -40108819, -40061103, -40012972,
+ -39964427, -39915469, -39866096, -39816310, -39766110, -39715497,
+ -39664471, -39613032, -39561181, -39508917, -39456241, -39403153,
+ -39349653, -39295741, -39241419, -39186685, -39131541, -39075986,
+ -39020021, -38963646, -38906861, -38849667, -38792063, -38734051,
+ -38675630, -38616801, -38557563, -38497918, -38437865, -38377406,
+ -38316539, -38255266, -38193587, -38131501, -38069010, -38006114,
+ -37942813, -37879107, -37814997, -37750484, -37685566, -37620246,
+ -37554522, -37488396, -37421868, -37354938, -37287607, -37219874,
+ -37151741, -37083208, -37014275, -36944942, -36875211, -36805080,
+ -36734552, -36663625, -36592301, -36520580, -36448463, -36375949,
+ -36303039, -36229734, -36156034, -36081940, -36007452, -35932570,
+ -35857295, -35781627, -35705567, -35629116, -35552273, -35475039,
+ -35397415, -35319402, -35240999, -35162207, -35083026, -35003458,
+ -34923503, -34843160, -34762432, -34681317, -34599818, -34517933,
+ -34435664, -34353012, -34269976, -34186558, -34102757, -34018575,
+ -33934012, -33849068, -33763745, -33678042, -33591961, -33505501,
+ -33418664, -33331449, -33243858, -33155892, -33067549, -32978833,
+ -32889742, -32800278, -32710440, -32620231, -32529650, -32438698,
+ -32347375, -32255683, -32163621, -32071191, -31978393, -31885228,
+ -31791696, -31697799, -31603536, -31508908, -31413916, -31318561,
+ -31222844, -31126764, -31030323, -30933522, -30836360, -30738840,
+ -30640961, -30542724, -30444130, -30345179, -30245873, -30146212,
+ -30046196, -29945827, -29845105, -29744031, -29642605, -29540829,
+ -29438703, -29336228, -29233404, -29130233, -29026714, -28922850,
+ -28818640, -28714086, -28609187, -28503946, -28398362, -28292437,
+ -28186171, -28079565, -27972620, -27865337, -27757716, -27649758,
+ -27541465, -27432836, -27323873, -27214576, -27104947, -26994986,
+ -26884694, -26774071, -26663120, -26551840, -26440232, -26328297,
+ -26216037, -26103451, -25990541, -25877308, -25763752, -25649875,
+ -25535677, -25421159, -25306322, -25191167, -25075694, -24959906,
+ -24843802, -24727383, -24610651, -24493606, -24376249, -24258581,
+ -24140604, -24022317, -23903723, -23784821, -23665612, -23546099,
+ -23426281, -23306160, -23185736, -23065010, -22943985, -22822659,
+ -22701035, -22579113, -22456894, -22334380, -22211570, -22088467,
+ -21965072, -21841384, -21717405, -21593137, -21468580, -21343734,
+ -21218602, -21093185, -20967482, -20841495, -20715226, -20588675,
+ -20461843, -20334731, -20207341, -20079673, -19951728, -19823508,
+ -19695013, -19566245, -19437204, -19307891, -19178309, -19048457,
+ -18918337, -18787949, -18657296, -18526377, -18395195, -18263750,
+ -18132043, -18000075, -17867848, -17735362, -17602618, -17469619,
+ -17336364, -17202855, -17069093, -16935079, -16800814, -16666300,
+ -16531537, -16396526, -16261270, -16125768, -15990022, -15854033,
+ -15717803, -15581332, -15444621, -15307672, -15170486, -15033064,
+ -14895407, -14757516, -14619393, -14481039, -14342454, -14203640,
+ -14064599, -13925330, -13785836, -13646118, -13506177, -13366014,
+ -13225630, -13085027, -12944205, -12803166, -12661911, -12520442,
+ -12378759, -12236863, -12094757, -11952441, -11809916, -11667183,
+ -11524245, -11381101, -11237754, -11094204, -10950453, -10806502,
+ -10662352, -10518005, -10373461, -10228723, -10083790, -9938665,
+ -9793349, -9647843, -9502148, -9356266, -9210198, -9063944, -8917507,
+ -8770888, -8624087, -8477107, -8329949, -8182613, -8035101, -7887414,
+ -7739554, -7591523, -7443320, -7294948, -7146408, -6997701, -6848828,
+ -6699792, -6550592, -6401231, -6251710, -6102030, -5952192, -5802198,
+ -5652049, -5501747, -5351292, -5200686, -5049931, -4899027, -4747977,
+ -4596781, -4445441, -4293958, -4142334, -3990569, -3838666, -3686625,
+ -3534448, -3382137, -3229692, -3077115, -2924408, -2771571, -2618607,
+ -2465516, -2312300, -2158961, -2005499, -1851916, -1698214, -1544394,
+ -1390456, -1236404, -1082238, -927959, -773568, -619068, -464460,
+ -309745, -154924, 0, 155027, 310156, 465385, 620712, 776136, 931656,
+ 1087270, 1242977, 1398775, 1554663, 1710639, 1866703, 2022852, 2179085,
+ 2335401, 2491799, 2648276, 2804832, 2961464, 3118173, 3274955, 3431810,
+ 3588736, 3745732, 3902796, 4059926, 4217123, 4374383, 4531705, 4689089,
+ 4846532, 5004033, 5161590, 5319203, 5476869, 5634588, 5792357, 5950175,
+ 6108041, 6265954, 6423911, 6581911, 6739954, 6898036, 7056158, 7214316,
+ 7372511, 7530740, 7689002, 7847296, 8005619, 8163971, 8322349, 8480753,
+ 8639181, 8797632, 8956103, 9114594, 9273103, 9431628, 9590168, 9748721,
+ 9907287, 10065862, 10224447, 10383039, 10541637, 10700240, 10858845,
+ 11017451, 11176057, 11334662, 11493264, 11651860, 11810451, 11969033,
+ 12127607, 12286169, 12444719, 12603256, 12761777, 12920281, 13078766,
+ 13237232, 13395676, 13554097, 13712494, 13870864, 14029207, 14187521,
+ 14345804, 14504055, 14662272, 14820453, 14978598, 15136705, 15294772,
+ 15452797, 15610780, 15768718, 15926609, 16084454, 16242249, 16399993,
+ 16557686, 16715324, 16872908, 17030434, 17187902, 17345310, 17502657,
+ 17659941, 17817160, 17974313, 18131399, 18288415, 18445361, 18602234,
+ 18759034, 18915758, 19072405, 19228974, 19385462, 19541870, 19698194,
+ 19854433, 20010586, 20166652, 20322628, 20478514, 20634306, 20790005,
+ 20945609, 21101115, 21256523, 21411831, 21567037, 21722140, 21877138,
+ 22032029, 22186813, 22341487, 22496050, 22650501, 22804838, 22959059,
+ 23113162, 23267147, 23421012, 23574755, 23728375, 23881869, 24035237,
+ 24188477, 24341587, 24494567, 24647413, 24800125, 24952702, 25105141,
+ 25257441, 25409601, 25561619, 25713494, 25865223, 26016806, 26168240,
+ 26319525, 26470659, 26621640, 26772466, 26923137, 27073650, 27224004,
+ 27374198, 27524230, 27674098, 27823801, 27973337, 28122706, 28271904,
+ 28420931, 28569786, 28718466, 28866970, 29015296, 29163444, 29311412,
+ 29459197, 29606799, 29754215, 29901445, 30048487, 30195340, 30342001,
+ 30488469, 30634743, 30780822, 30926703, 31072385, 31217867, 31363147,
+ 31508224, 31653096, 31797761, 31942218, 32086466, 32230503, 32374328,
+ 32517939, 32661334, 32804512, 32947471, 33090211, 33232728, 33375023,
+ 33517094, 33658938, 33800554, 33941942, 34083099, 34224024, 34364715,
+ 34505172, 34645391, 34785373, 34925115, 35064616, 35203875, 35342889,
+ 35481658, 35620180, 35758453, 35896477, 36034249, 36171768, 36309033,
+ 36446042, 36582793, 36719286, 36855518, 36991489, 37127196, 37262638,
+ 37397815, 37532723, 37667363, 37801732, 37935829, 38069652, 38203200,
+ 38336472, 38469466, 38602181, 38734615, 38866767, 38998635, 39130218,
+ 39261514, 39392522, 39523241, 39653669, 39783805, 39913647, 40043194,
+ 40172444, 40301396, 40430048, 40558400, 40686449, 40814195, 40941635,
+ 41068769, 41195595, 41322111, 41448317, 41574210, 41699790, 41825054,
+ 41950002, 42074633, 42198944, 42322934, 42446603, 42569948, 42692968,
+ 42815661, 42938028, 43060065, 43181772, 43303147, 43424189, 43544897,
+ 43665269, 43785303, 43904999, 44024355, 44143370, 44262041, 44380369,
+ 44498352, 44615987, 44733275, 44850213, 44966800, 45083036, 45198917,
+ 45314444, 45429615, 45544428, 45658882, 45772977, 45886709, 46000079,
+ 46113085, 46225726, 46337999, 46449905, 46561441, 46672607, 46783400,
+ 46893820, 47003866, 47113536, 47222829, 47331743, 47440277, 47548430,
+ 47656201, 47763589, 47870591, 47977208, 48083437, 48189277, 48294727,
+ 48399787, 48504453, 48608726, 48712604, 48816086, 48919170, 49021855,
+ 49124141, 49226025, 49327507, 49428585, 49529259, 49629526, 49729385,
+ 49828837, 49927878, 50026509, 50124727, 50222531, 50319922, 50416896,
+ 50513453, 50609592, 50705312, 50800611, 50895488, 50989943, 51083973,
+ 51177578, 51270756, 51363507, 51455828, 51547720, 51639181, 51730209,
+ 51820804, 51910965, 52000689, 52089977, 52178827, 52267237, 52355208,
+ 52442736, 52529823, 52616465, 52702663, 52788415, 52873720, 52958577,
+ 53042984, 53126942, 53210447, 53293501, 53376100, 53458246, 53539935,
+ 53621167, 53701942, 53782258, 53862113, 53941508, 54020440, 54098909,
+ 54176914, 54254453, 54331526, 54408132, 54484269, 54559937, 54635134,
+ 54709860, 54784113, 54857892, 54931197, 55004027, 55076379, 55148255,
+ 55219651, 55290568, 55361005, 55430959, 55500432, 55569420, 55637925,
+ 55705943, 55773476, 55840521, 55907077, 55973144, 56038721, 56103807,
+ 56168401, 56232501, 56296108, 56359219, 56421835, 56483954, 56545575,
+ 56606697, 56667320, 56727442, 56787064, 56846182, 56904798, 56962910,
+ 57020517, 57077618, 57134212, 57190299, 57245877, 57300947, 57355506,
+ 57409554, 57463090, 57516113, 57568624, 57620619, 57672100, 57723064,
+ 57773512, 57823442, 57872854, 57921746, 57970118, 58017970, 58065300,
+ 58112107, 58158391, 58204151, 58249386, 58294096, 58338279, 58381935,
+ 58425063, 58467663, 58509733, 58551273, 58592282, 58632760, 58672705,
+ 58712117, 58750995, 58789339, 58827148, 58864420, 58901156, 58937355,
+ 58973016, 59008138, 59042720, 59076762, 59110264, 59143224, 59175642,
+ 59207517, 59238849, 59269637, 59299880, 59329577, 59358729, 59387334,
+ 59415391, 59442901, 59469862, 59496274, 59522137, 59547449, 59572209,
+ 59596419, 59620076, 59643181, 59665732, 59687729, 59709172, 59730060,
+ 59750392, 59770168, 59789388, 59808050, 59826154, 59843700, 59860688,
+ 59877115, 59892983, 59908291, 59923038, 59937223, 59950846, 59963907,
+ 59976405, 59988340, 59999710, 60010517, 60020758, 60030435, 60039545,
+ 60048089, 60056067, 60063478, 60070321, 60076596, 60082302, 60087440,
+ 60092009, 60096007, 60099436, 60102295, 60104582, 60106298, 60107443,
+ 60108015, 60108015, 60107443, 60106297, 60104577, 60102284, 60099417,
+ 60095975, 60091958, 60087366, 60082198, 60076454, 60070134, 60063238,
+ 60055765, 60047714, 60039086, 60029881, 60020097, 60009735, 59998794,
+ 59987275, 59975176, 59962499, 59949241, 59935404, 59920986, 59905988,
+ 59890409, 59874250, 59857509, 59840188, 59822284, 59803799, 59784732,
+ 59765083, 59744852, 59724038, 59702642, 59680662, 59658100, 59634955,
+ 59611226, 59586914, 59562018, 59536538, 59510475, 59483827, 59456595,
+ 59428779, 59400379, 59371394, 59341824, 59311670, 59280931, 59249607,
+ 59217698, 59185204, 59152125, 59118461, 59084212, 59049377, 59013957,
+ 58977951, 58941361, 58904184, 58866423, 58828075, 58789143, 58749624,
+ 58709520, 58668831, 58627556, 58585696, 58543250, 58500219, 58456602,
+ 58412400, 58367613, 58322240, 58276282, 58229739, 58182611, 58134898,
+ 58086599, 58037716, 57988248, 57938196, 57887558, 57836336, 57784530,
+ 57732140, 57679165, 57625606, 57571464, 57516737, 57461427, 57405534,
+ 57349057, 57291997, 57234354, 57176128, 57117319, 57057928, 56997955,
+ 56937400, 56876262, 56814543, 56752243, 56689361, 56625899, 56561855,
+ 56497231, 56432027, 56366242, 56299878, 56232934, 56165411, 56097308,
+ 56028627, 55959368, 55889530, 55819114, 55748121, 55676550, 55604403,
+ 55531678, 55458377, 55384501, 55310048, 55235020, 55159417, 55083240,
+ 55006488, 54929162, 54851262, 54772790, 54693744, 54614126, 54533935,
+ 54453173, 54371840, 54289936, 54207461, 54124417, 54040802, 53956619,
+ 53871866, 53786546, 53700657, 53614201, 53527178, 53439588, 53351432,
+ 53262711, 53173425, 53083574, 52993158, 52902180, 52810638, 52718533,
+ 52625866, 52532638, 52438849, 52344499, 52249589, 52154120, 52058091,
+ 51961505, 51864360, 51766659, 51668400, 51569586, 51470216, 51370291,
+ 51269812, 51168779, 51067193, 50965054, 50862364, 50759122, 50655330,
+ 50550987, 50446096, 50340655, 50234666, 50128130, 50021048, 49913419,
+ 49805244, 49696525, 49587262, 49477456, 49367107, 49256215, 49144783,
+ 49032810, 48920297, 48807245, 48693655, 48579527, 48464862, 48349661,
+ 48233924, 48117653, 48000848, 47883510, 47765639, 47647237, 47528304,
+ 47408841, 47288849, 47168329, 47047281, 46925706, 46803605, 46680979,
+ 46557828, 46434154, 46309958, 46185240, 46060000, 45934241, 45807962,
+ 45681165, 45553851, 45426020, 45297673, 45168812, 45039436, 44909548,
+ 44779147, 44648235, 44516813, 44384881, 44252441, 44119494, 43986040,
+ 43852080, 43717616, 43582648, 43447177, 43311204, 43174730, 43037757,
+ 42900285, 42762315, 42623848, 42484885, 42345427, 42205475, 42065031,
+ 41924094, 41782667, 41640750, 41498345, 41355451, 41212071, 41068205,
+ 40923855, 40779021, 40633705, 40487908, 40341630, 40194873, 40047638,
+ 39899926, 39751738, 39603075, 39453939, 39304330, 39154250, 39003699,
+ 38852679, 38701191, 38549236, 38396815, 38243930, 38090581, 37936770,
+ 37782498, 37627766, 37472575, 37316926, 37160821, 37004261, 36847247,
+ 36689780, 36531861, 36373492, 36214674, 36055408, 35895695, 35735537,
+ 35574934, 35413889, 35252401, 35090474, 34928107, 34765301, 34602060,
+ 34438382, 34274271, 34109727, 33944751, 33779345, 33613510, 33447247,
+ 33280558, 33113443, 32945905, 32777945, 32609563, 32440762, 32271542,
+ 32101905, 31931853, 31761386, 31590506, 31419214, 31247512, 31075401,
+ 30902883, 30729958, 30556628, 30382896, 30208761, 30034225, 29859291,
+ 29683958, 29508229, 29332106, 29155588, 28978679, 28801379, 28623690,
+ 28445612, 28267149, 28088301, 27909069, 27729455, 27549461, 27369088,
+ 27188337, 27007210, 26825708, 26643834, 26461587, 26278971, 26095986,
+ 25912634, 25728916, 25544834, 25360389, 25175584, 24990419, 24804896,
+ 24619016, 24432782, 24246194, 24059255, 23871965, 23684326, 23496341,
+ 23308009, 23119334, 22930316, 22740958, 22551260, 22361225, 22170853,
+ 21980147, 21789108, 21597738, 21406038, 21214010, 21021656, 20828977,
+ 20635974, 20442651, 20249007, 20055045, 19860766, 19666172, 19471265,
+ 19276047, 19080518, 18884681, 18688537, 18492088, 18295336, 18098282,
+ 17900928, 17703276, 17505327, 17307084, 17108547, 16909719, 16710601,
+ 16511194, 16311502, 16111524, 15911264, 15710723, 15509902, 15308803,
+ 15107428, 14905780, 14703858, 14501666, 14299205, 14096476, 13893482,
+ 13690224, 13486704, 13282924, 13078886, 12874591, 12670041, 12465238,
+ 12260183, 12054880, 11849328, 11643530, 11437489, 11231205, 11024680,
+ 10817917, 10610917, 10403682, 10196214, 9988514, 9780585, 9572428,
+ 9364045, 9155438, 8946609, 8737559, 8528291, 8318806, 8109107, 7899194,
+ 7689070, 7478737, 7268197, 7057451, 6846502, 6635351, 6424000, 6212451,
+ 6000706, 5788767, 5576636, 5364314, 5151804, 4939107, 4726225, 4513161,
+ 4299915, 4086491, 3872890, 3659114, 3445164, 3231043, 3016753, 2802296,
+ 2587673, 2372886, 2157938, 1942831, 1727565, 1512144, 1296569, 1080842,
+ 864966, 648941, 432771, 216456, 0, -216596, -433331, -650202, -867206,
+ -1084343, -1301611, -1519006, -1736528, -1954173, -2171941, -2389829,
+ -2607836, -2825958, -3044195, -3262544, -3481003, -3699570, -3918244,
+ -4137021, -4355901, -4574881, -4793959, -5013133, -5232401, -5451761,
+ -5671211, -5890749, -6110373, -6330081, -6549871, -6769740, -6989687,
+ -7209710, -7429807, -7649975, -7870213, -8090518, -8310889, -8531323,
+ -8751818, -8972373, -9192985, -9413652, -9634372, -9855144, -10075964,
+ -10296831, -10517743, -10738697, -10959692, -11180726, -11401796,
+ -11622901, -11844038, -12065205, -12286400, -12507622, -12728867,
+ -12950134, -13171421, -13392726, -13614046, -13835380, -14056725,
+ -14278079, -14499441, -14720808, -14942177, -15163548, -15384917,
+ -15606283, -15827644, -16048997, -16270340, -16491671, -16712989,
+ -16934290, -17155574, -17376837, -17598077, -17819294, -18040483,
+ -18261644, -18482774, -18703871, -18924932, -19145957, -19366942,
+ -19587885, -19808785, -20029639, -20250446, -20471202, -20691906,
+ -20912555, -21133148, -21353683, -21574157, -21794568, -22014913,
+ -22235192, -22455402, -22675540, -22895604, -23115593, -23335503,
+ -23555334, -23775083, -23994747, -24214325, -24433814, -24653213,
+ -24872518, -25091729, -25310842, -25529856, -25748768, -25967577,
+ -26186280, -26404875, -26623360, -26841733, -27059991, -27278133,
+ -27496156, -27714058, -27931837, -28149491, -28367018, -28584415,
+ -28801681, -29018813, -29235808, -29452666, -29669384, -29885959,
+ -30102389, -30318673, -30534808, -30750792, -30966622, -31182298,
+ -31397816, -31613174, -31828370, -32043403, -32258269, -32472968,
+ -32687495, -32901851, -33116031, -33330035, -33543859, -33757503,
+ -33970963, -34184238, -34397325, -34610222, -34822927, -35035438,
+ -35247754, -35459870, -35671786, -35883500, -36095009, -36306310,
+ -36517403, -36728284, -36938952, -37149405, -37359640, -37569655,
+ -37779448, -37989016, -38198359, -38407473, -38616357, -38825008,
+ -39033425, -39241604, -39449544, -39657243, -39864699, -40071909,
+ -40278872, -40485585, -40692046, -40898253, -41104204, -41309897,
+ -41515329, -41720499, -41925405, -42130043, -42334413, -42538512,
+ -42742337, -42945888, -43149161, -43352154, -43554867, -43757295,
+ -43959438, -44161293, -44362857, -44564130, -44765109, -44965791,
+ -45166175, -45366258, -45566039, -45765515, -45964684, -46163544,
+ -46362093, -46560330, -46758251, -46955855, -47153139, -47350102,
+ -47546742, -47743056, -47939042, -48134699, -48330023, -48525014,
+ -48719669, -48913986, -49107963, -49301597, -49494888, -49687832,
+ -49880427, -50072673, -50264565, -50456104, -50647285, -50838109,
+ -51028571, -51218671, -51408406, -51597774, -51786773, -51975401,
+ -52163657, -52351537, -52539041, -52726166, -52912909, -53099270,
+ -53285245, -53470833, -53656033, -53840841, -54025255, -54209275,
+ -54392898, -54576121, -54758944, -54941363, -55123377, -55304984,
+ -55486181, -55666968, -55847341, -56027300, -56206841, -56385963,
+ -56564664, -56742943, -56920796, -57098222, -57275219, -57451786,
+ -57627919, -57803618, -57978880, -58153704, -58328087, -58502027,
+ -58675523, -58848572, -59021173, -59193323, -59365022, -59536266,
+ -59707054, -59877384, -60047254, -60216662, -60385607, -60554085,
+ -60722096, -60889638, -61056709, -61223306, -61389428, -61555072,
+ -61720238, -61884924, -62049126, -62212844, -62376075, -62538819,
+ -62701072, -62862833, -63024100, -63184871, -63345145, -63504919,
+ -63664192, -63822962, -63981227, -64138986, -64296235, -64452974,
+ -64609201, -64764914, -64920111, -65074790, -65228950, -65382589,
+ -65535704, -65688295, -65840358, -65991894, -66142899, -66293372,
+ -66443311, -66592715, -66741581, -66889908, -67037695, -67184938,
+ -67331638, -67477791, -67623396, -67768452, -67912956, -68056907,
+ -68200304, -68343144, -68485425, -68627147, -68768307, -68908904,
+ -69048936, -69188401, -69327297, -69465623, -69603378, -69740559,
+ -69877164, -70013193, -70148643, -70283514, -70417802, -70551507,
+ -70684626, -70817159, -70949103, -71080458, -71211220, -71341390,
+ -71470964, -71599942, -71728322, -71856101, -71983280, -72109855,
+ -72235826, -72361191, -72485948, -72610095, -72733632, -72856556,
+ -72978867, -73100561, -73221639, -73342097, -73461936, -73581153,
+ -73699746, -73817715, -73935057, -74051771, -74167856, -74283310,
+ -74398131, -74512319, -74625871, -74738786, -74851063, -74962700,
+ -75073695, -75184048, -75293756, -75402819, -75511234, -75619001,
+ -75726118, -75832583, -75938395, -76043553, -76148055, -76251899,
+ -76355085, -76457611, -76559476, -76660677, -76761215, -76861087,
+ -76960291, -77058828, -77156694, -77253890, -77350413, -77446262,
+ -77541436, -77635933, -77729753, -77822893, -77915353, -78007131,
+ -78098226, -78188637, -78278362, -78367399, -78455749, -78543408,
+ -78630377, -78716654, -78802237, -78887126, -78971318, -79054814,
+ -79137611, -79219708, -79301104, -79381798, -79461789, -79541075,
+ -79619656, -79697529, -79774694, -79851150, -79926895, -80001929,
+ -80076249, -80149856, -80222747, -80294922, -80366379, -80437117,
+ -80507136, -80576434, -80645010, -80712862, -80779990, -80846393,
+ -80912069, -80977018, -81041237, -81104727, -81167487, -81229514,
+ -81290808, -81351368, -81411193, -81470282, -81528634, -81586248,
+ -81643122, -81699256, -81754649, -81809299, -81863207, -81916370,
+ -81968787, -82020459, -82071383, -82121559, -82170986, -82219663,
+ -82267589, -82314763, -82361184, -82406851, -82451763, -82495920,
+ -82539320, -82581963, -82623847, -82664972, -82705337, -82744941,
+ -82783783, -82821862, -82859178, -82895729, -82931515, -82966535,
+ -83000788, -83034273, -83066989, -83098936, -83130113, -83160519,
+ -83190153, -83219014, -83247103, -83274417, -83300956, -83326719,
+ -83351707, -83375917, -83399349, -83422003, -83443878, -83464972,
+ -83485286, -83504818, -83523569, -83541536, -83558721, -83575121,
+ -83590736, -83605566, -83619610, -83632867, -83645337, -83657018,
+ -83667912, -83678016, -83687330, -83695854, -83703586, -83710528,
+ -83716677, -83722033, -83726596, -83730365, -83733340, -83735520,
+ -83736904, -83737492, -83737284, -83736279, -83734476, -83731875,
+ -83728476, -83724277, -83719280, -83713482, -83706884, -83699484,
+ -83691284, -83682282, -83672477, -83661870, -83650460, -83638247,
+ -83625230, -83611408, -83596782, -83581350, -83565114, -83548071,
+ -83530223, -83511568, -83492106, -83471837, -83450761, -83428877,
+ -83406184, -83382684, -83358374, -83333256, -83307328, -83280591,
+ -83253044, -83224687, -83195519, -83165541, -83134752, -83103152,
+ -83070741, -83037518, -83003483, -82968637, -82932978, -82896507,
+ -82859224, -82821128, -82782219, -82742497, -82701962, -82660614,
+ -82618453, -82575478, -82531689, -82487087, -82441670, -82395440,
+ -82348396, -82300538, -82251865, -82202379, -82152078, -82100962,
+ -82049033, -81996289, -81942730, -81888357, -81833170, -81777168,
+ -81720351, -81662721, -81604275, -81545016, -81484942, -81424054,
+ -81362351, -81299834, -81236503, -81172358, -81107400, -81041627,
+ -80975040, -80907640, -80839426, -80770399, -80700558, -80629905,
+ -80558438, -80486158, -80413066, -80339161, -80264444, -80188914,
+ -80112573, -80035420, -79957455, -79878679, -79799091, -79718693,
+ -79637484, -79555465, -79472636, -79388996, -79304547, -79219289,
+ -79133222, -79046345, -78958661, -78870168, -78780867, -78690759,
+ -78599844, -78508122, -78415593, -78322258, -78228118, -78133172,
+ -78037421, -77940866, -77843506, -77745342, -77646375, -77546605,
+ -77446033, -77344658, -77242482, -77139504, -77035726, -76931148,
+ -76825769, -76719591, -76612615, -76504840, -76396267, -76286897,
+ -76176730, -76065767, -75954009, -75841455, -75728106, -75613963,
+ -75499027, -75383298, -75266777, -75149464, -75031359, -74912465,
+ -74792780, -74672306, -74551043, -74428993, -74306155, -74182530,
+ -74058120, -73932924, -73806943, -73680179, -73552631, -73424300,
+ -73295188, -73165295, -73034621, -72903167, -72770935, -72637924,
+ -72504136, -72369571, -72234231, -72098115, -71961225, -71823562,
+ -71685125, -71545917, -71405938, -71265189, -71123670, -70981383,
+ -70838328, -70694506, -70549918, -70404566, -70258449, -70111568,
+ -69963926, -69815522, -69666357, -69516432, -69365749, -69214309,
+ -69062111, -68909157, -68755449, -68600986, -68445771, -68289804,
+ -68133086, -67975617, -67817400, -67658435, -67498723, -67338265,
+ -67177062, -67015116, -66852426, -66688995, -66524824, -66359913,
+ -66194263, -66027876, -65860753, -65692895, -65524303, -65354978,
+ -65184921, -65014134, -64842617, -64670372, -64497399, -64323701,
+ -64149278, -63974132, -63798263, -63621672, -63444362, -63266333,
+ -63087587, -62908124, -62727946, -62547055, -62365450, -62183135,
+ -62000109, -61816375, -61631933, -61446785, -61260932, -61074376,
+ -60887118, -60699158, -60510499, -60321142, -60131087, -59940337,
+ -59748893, -59556757, -59363928, -59170410, -58976203, -58781309,
+ -58585729, -58389464, -58192516, -57994887, -57796578, -57597590,
+ -57397924, -57197583, -56996567, -56794879, -56592519, -56389489,
+ -56185791, -55981426, -55776395, -55570701, -55364344, -55157327,
+ -54949650, -54741315, -54532324, -54322678, -54112380, -53901430,
+ -53689829, -53477581, -53264686, -53051146, -52836962, -52622136,
+ -52406670, -52190565, -51973823, -51756446, -51538435, -51319793,
+ -51100519, -50880617, -50660088, -50438934, -50217156, -49994756,
+ -49771735, -49548096, -49323841, -49098970, -48873486, -48647390,
+ -48420685, -48193371, -47965451, -47736927, -47507799, -47278071,
+ -47047743, -46816819, -46585298, -46353184, -46120477, -45887181,
+ -45653296, -45418825, -45183769, -44948130, -44711911, -44475112,
+ -44237736, -43999785, -43761261, -43522165, -43282499, -43042266,
+ -42801467, -42560103, -42318178, -42075693, -41832650, -41589051,
+ -41344898, -41100192, -40854936, -40609132, -40362781, -40115886,
+ -39868449, -39620472, -39371956, -39122903, -38873317, -38623198,
+ -38372549, -38121372, -37869668, -37617440, -37364691, -37111421,
+ -36857633, -36603330, -36348512, -36093183, -35837345, -35580998,
+ -35324147, -35066792, -34808936, -34550580, -34291728, -34032381,
+ -33772542, -33512212, -33251393, -32990088, -32728299, -32466029,
+ -32203279, -31940051, -31676348, -31412171, -31147524, -30882408,
+ -30616826, -30350779, -30084270, -29817301, -29549875, -29281994,
+ -29013659, -28744873, -28475639, -28205959, -27935834, -27665268,
+ -27394262, -27122819, -26850941, -26578630, -26305889, -26032720,
+ -25759125, -25485107, -25210668, -24935810, -24660536, -24384848,
+ -24108748, -23832238, -23555322, -23278001, -23000278, -22722155,
+ -22443634, -22164719, -21885410, -21605712, -21325625, -21045153,
+ -20764298, -20483062, -20201447, -19919457, -19637094, -19354360,
+ -19071257, -18787788, -18503955, -18219761, -17935209, -17650300,
+ -17365037, -17079423, -16793461, -16507152, -16220499, -15933505,
+ -15646172, -15358503, -15070500, -14782165, -14493502, -14204513,
+ -13915200, -13625566, -13335613, -13045344, -12754761, -12463868,
+ -12172666, -11881158, -11589347, -11297235, -11004825, -10712119,
+ -10419121, -10125832, -9832255, -9538393, -9244249, -8949824, -8655122,
+ -8360146, -8064897, -7769378, -7473593, -7177544, -6881233, -6584663,
+ -6287836, -5990756, -5693425, -5395846, -5098020, -4799952, -4501644,
+ -4203097, -3904316, -3605303, -3306059, -3006589, -2706895, -2406979,
+ -2106844, -1806493, -1505928, -1205153, -904170, -602981, -301590, 0,
+ 301788, 603770, 905944, 1208307, 1510856, 1813588, 2116501, 2419592,
+ 2722858, 3026297, 3329905, 3633680, 3937619, 4241719, 4545978, 4850392,
+ 5154959, 5459677, 5764542, 6069551, 6374702, 6679992, 6985418, 7290977,
+ 7596667, 7902485, 8208427, 8514492, 8820676, 9126976, 9433390, 9739914,
+ 10046547, 10353284, 10660124, 10967063, 11274098, 11581227, 11888447,
+ 12195755, 12503149, 12810624, 13118179, 13425810, 13733515, 14041291,
+ 14349134, 14657043, 14965013, 15273043, 15581130, 15889270, 16197460,
+ 16505698, 16813981, 17122306, 17430670, 17739070, 18047504, 18355967,
+ 18664458, 18972974, 19281511, 19590067, 19898638, 20207223, 20515817,
+ 20824418, 21133024, 21441630, 21750235, 22058835, 22367428, 22676010,
+ 22984578, 23293130, 23601663, 23910173, 24218658, 24527115, 24835541,
+ 25143932, 25452287, 25760601, 26068873, 26377099, 26685276, 26993401,
+ 27301471, 27609484, 27917436, 28225324, 28533146, 28840898, 29148578,
+ 29456182, 29763707, 30071152, 30378511, 30685784, 30992966, 31300055,
+ 31607047, 31913941, 32220732, 32527417, 32833995, 33140461, 33446814,
+ 33753049, 34059164, 34365156, 34671021, 34976758, 35282363, 35587833,
+ 35893164, 36198355, 36503401, 36808301, 37113051, 37417647, 37722088,
+ 38026370, 38330490, 38634445, 38938232, 39241848, 39545290, 39848555,
+ 40151641, 40454543, 40757260, 41059788, 41362124, 41664265, 41966208,
+ 42267951, 42569489, 42870821, 43171943, 43472852, 43773545, 44074020,
+ 44374273, 44674301, 44974101, 45273670, 45573006, 45872105, 46170964,
+ 46469580, 46767951, 47066073, 47363943, 47661559, 47958917, 48256014,
+ 48552848, 48849414, 49145712, 49441736, 49737485, 50032956, 50328144,
+ 50623048, 50917665, 51211991, 51506024, 51799760, 52093196, 52386331,
+ 52679159, 52971680, 53263888, 53555783, 53847360, 54138617, 54429550,
+ 54720158, 55010436, 55300382, 55589992, 55879265, 56168196, 56456784,
+ 56745024, 57032915, 57320452, 57607633, 57894456, 58180917, 58467013,
+ 58752741, 59038099, 59323083, 59607691, 59891919, 60175764, 60459224,
+ 60742296, 61024976, 61307262, 61589152, 61870640, 62151726, 62432406,
+ 62712677, 62992537, 63271981, 63551008, 63829614, 64107797, 64385554,
+ 64662881, 64939776, 65216235, 65492257, 65767838, 66042974, 66317664,
+ 66591905, 66865693, 67139025, 67411899, 67684312, 67956260, 68227742,
+ 68498754, 68769293, 69039356, 69308941, 69578045, 69846664, 70114796,
+ 70382438, 70649587, 70916241, 71182396, 71448050, 71713199, 71977841,
+ 72241974, 72505593, 72768697, 73031283, 73293347, 73554887, 73815901,
+ 74076384, 74336335, 74595750, 74854628, 75112964, 75370756, 75628002,
+ 75884699, 76140843, 76396432, 76651464, 76905935, 77159842, 77413183,
+ 77665956, 77918157, 78169783, 78420832, 78671301, 78921188, 79170489,
+ 79419202, 79667323, 79914851, 80161783, 80408115, 80653846, 80898972,
+ 81143490, 81387398, 81630694, 81873374, 82115436, 82356877, 82597694,
+ 82837885, 83077447, 83316377, 83554673, 83792332, 84029351, 84265728,
+ 84501460, 84736544, 84970978, 85204758, 85437883, 85670350, 85902156,
+ 86133298, 86363774, 86593581, 86822716, 87051178, 87278963, 87506068,
+ 87732492, 87958231, 88183284, 88407646, 88631317, 88854292, 89076570,
+ 89298148, 89519024, 89739194, 89958657, 90177410, 90395450, 90612775,
+ 90829382, 91045268, 91260432, 91474871, 91688581, 91901562, 92113809,
+ 92325321, 92536095, 92746129, 92955420, 93163965, 93371763, 93578811,
+ 93785106, 93990646, 94195428, 94399450, 94602710, 94805205, 95006932,
+ 95207890, 95408076, 95607487, 95806121, 96003976, 96201049, 96397338,
+ 96592840, 96787553, 96981476, 97174604, 97366937, 97558471, 97749205,
+ 97939135, 98128261, 98316578, 98504086, 98690781, 98876662, 99061726,
+ 99245971, 99429394, 99611993, 99793767, 99974712, 100154826, 100334108,
+ 100512555, 100690164, 100866934, 101042862, 101217946, 101392183,
+ 101565573, 101738111, 101909797, 102080628, 102250601, 102419715,
+ 102587968, 102755357, 102921880, 103087534, 103252319, 103416231,
+ 103579269, 103741430, 103902713, 104063115, 104222633, 104381267,
+ 104539014, 104695871, 104851838, 105006911, 105161088, 105314368,
+ 105466749, 105618228, 105768803, 105918473, 106067235, 106215088,
+ 106362029, 106508056, 106653168, 106797362, 106940636, 107082989,
+ 107224419, 107364923, 107504499, 107643146, 107780862, 107917645,
+ 108053493, 108188403, 108322375, 108455406, 108587494, 108718638,
+ 108848835, 108978084, 109106383, 109233729, 109360122, 109485559,
+ 109610039, 109733559, 109856119, 109977715, 110098347, 110218012,
+ 110336709, 110454435, 110571190, 110686972, 110801778, 110915607,
+ 111028457, 111140327, 111251215, 111361118, 111470036, 111577967,
+ 111684909, 111790860, 111895819, 111999784, 112102754, 112204726,
+ 112305699, 112405672, 112504643, 112602610, 112699572, 112795527,
+ 112890473, 112984409, 113077334, 113169246, 113260143, 113350023,
+ 113438886, 113526730, 113613553, 113699353, 113784130, 113867882,
+ 113950606, 114032303, 114112970, 114192606, 114271209, 114348778,
+ 114425312, 114500809, 114575267, 114648687, 114721065, 114792400,
+ 114862692, 114931939, 115000139, 115067291, 115133395, 115198447,
+ 115262448, 115325396, 115387290, 115448127, 115507908, 115566630,
+ 115624293, 115680895, 115736436, 115790912, 115844325, 115896672,
+ 115947951, 115998163, 116047306, 116095377, 116142378, 116188305,
+ 116233159, 116276937, 116319640, 116361265, 116401811, 116441278,
+ 116479664, 116516969, 116553191, 116588328, 116622381, 116655348,
+ 116687228, 116718020, 116747723, 116776335, 116803857, 116830287,
+ 116855623, 116879865, 116903013, 116925065, 116946019, 116965876,
+ 116984634, 117002293, 117018851, 117034307, 117048661, 117061912,
+ 117074059, 117085101, 117095038, 117103867, 117111590, 117118204,
+ 117123709, 117128104, 117131389, 117133562, 117134623, 117134571,
+ 117133406, 117131126, 117127731, 117123220, 117117593, 117110849,
+ 117102986, 117094005, 117083905, 117072685, 117060344, 117046883,
+ 117032299, 117016593, 116999764, 116981811, 116962735, 116942533,
+ 116921206, 116898753, 116875174, 116850468, 116824635, 116797673,
+ 116769583, 116740364, 116710015, 116678537, 116645928, 116612189,
+ 116577318, 116541315, 116504180, 116465913, 116426513, 116385979,
+ 116344312, 116301511, 116257575, 116212505, 116166299, 116118958,
+ 116070482, 116020869, 115970120, 115918234, 115865212, 115811052,
+ 115755755, 115699321, 115641748, 115583037, 115523188, 115462201,
+ 115400075, 115336810, 115272406, 115206863, 115140180, 115072358,
+ 115003397, 114933296, 114862054, 114789674, 114716153, 114641492,
+ 114565691, 114488749, 114410668, 114331446, 114251085, 114169582,
+ 114086940, 114003158, 113918235, 113832172, 113744969, 113656626,
+ 113567143, 113476520, 113384757, 113291854, 113197812, 113102631,
+ 113006310, 112908850, 112810250, 112710512, 112609635, 112507620,
+ 112404467, 112300175, 112194745, 112088178, 111980473, 111871631,
+ 111761652, 111650537, 111538285, 111424898, 111310374, 111194715,
+ 111077921, 110959992, 110840929, 110720732, 110599401, 110476937,
+ 110353340, 110228610, 110102748, 109975755, 109847631, 109718376,
+ 109587990, 109456475, 109323830, 109190056, 109055155, 108919125,
+ 108781968, 108643684, 108504274, 108363739, 108222078, 108079293,
+ 107935383, 107790351, 107644196, 107496919, 107348520, 107199000,
+ 107048361, 106896602, 106743724, 106589728, 106434614, 106278384,
+ 106121038, 105962577, 105803001, 105642312, 105480509, 105317595,
+ 105153568, 104988432, 104822185, 104654830, 104486366, 104316796,
+ 104146118, 103974336, 103801448, 103627457, 103452363, 103276166,
+ 103098869, 102920472, 102740975, 102560380, 102378688, 102195900,
+ 102012016, 101827038, 101640967, 101453803, 101265548, 101076203,
+ 100885769, 100694246, 100501637, 100307941, 100113161, 99917297,
+ 99720351, 99522323, 99323214, 99123026, 98921761, 98719418, 98516000,
+ 98311507, 98105941, 97899303, 97691594, 97482816, 97272969, 97062055,
+ 96850075, 96637031, 96422923, 96207753, 95991523, 95774234, 95555886,
+ 95336482, 95116023, 94894509, 94671943, 94448327, 94223660, 93997945,
+ 93771183, 93543376, 93314524, 93084630, 92853695, 92621720, 92388708,
+ 92154658, 91919574, 91683455, 91446305, 91208124, 90968914, 90728677,
+ 90487414, 90245127, 90001817, 89757486, 89512135, 89265767, 89018382,
+ 88769983, 88520571, 88270147, 88018715, 87766274, 87512827, 87258376,
+ 87002922, 86746467, 86489013, 86230561, 85971114, 85710673, 85449239,
+ 85186815, 84923403, 84659004, 84393620, 84127252, 83859904, 83591576,
+ 83322271, 83051990, 82780736, 82508509, 82235313, 81961148, 81686018,
+ 81409924, 81132867, 80854850, 80575875, 80295943, 80015058, 79733220,
+ 79450432, 79166695, 78882013, 78596386, 78309817, 78022308, 77733862,
+ 77444479, 77154163, 76862915, 76570737, 76277632, 75983602, 75688649,
+ 75392774, 75095981, 74798271, 74499647, 74200111, 73899665, 73598310,
+ 73296051, 72992887, 72688823, 72383860, 72078000, 71771246, 71463601,
+ 71155065, 70845642, 70535334, 70224143, 69912072, 69599122, 69285297,
+ 68970599, 68655029, 68338591, 68021287, 67703119, 67384090, 67064201,
+ 66743457, 66421858, 66099407, 65776108, 65451961, 65126971, 64801139,
+ 64474467, 64146959, 63818617, 63489443, 63159440, 62828611, 62496957,
+ 62164482, 61831189, 61497079, 61162155, 60826420, 60489877, 60152528,
+ 59814376, 59475424, 59135673, 58795128, 58453789, 58111661, 57768746,
+ 57425047, 57080565, 56735305, 56389268, 56042458, 55694877, 55346527,
+ 54997413, 54647536, 54296899, 53945505, 53593357, 53240458, 52886810,
+ 52532417, 52177280, 51821404, 51464790, 51107442, 50749363, 50390555,
+ 50031021, 49670765, 49309789, 48948095, 48585688, 48222570, 47858743,
+ 47494212, 47128978, 46763044, 46396415, 46029092, 45661079, 45292378,
+ 44922993, 44552927, 44182183, 43810763, 43438671, 43065910, 42692483,
+ 42318392, 41943642, 41568235, 41192175, 40815463, 40438104, 40060101,
+ 39681456, 39302173, 38922255, 38541705, 38160527, 37778723, 37396296,
+ 37013250, 36629589, 36245314, 35860430, 35474940, 35088846, 34702152,
+ 34314862, 33926978, 33538504, 33149443, 32759798, 32369573, 31978771,
+ 31587395, 31195449, 30802935, 30409857, 30016219, 29622024, 29227274,
+ 28831974, 28436127, 28039736, 27642805, 27245336, 26847334, 26448801,
+ 26049742, 25650158, 25250055, 24849435, 24448302, 24046659, 23644509,
+ 23241857, 22838705, 22435056, 22030916, 21626286, 21221170, 20815573,
+ 20409497, 20002945, 19595922, 19188431, 18780475, 18372058, 17963184,
+ 17553856, 17144077, 16733851, 16323182, 15912074, 15500529, 15088551,
+ 14676145, 14263313, 13850059, 13436387, 13022301, 12607803, 12192899,
+ 11777590, 11361882, 10945777, 10529279, 10112392, 9695120, 9277466,
+ 8859434, 8441028, 8022251, 7603106, 7183599, 6763732, 6343509, 5922934,
+ 5502010, 5080742, 4659132, 4237186, 3814906, 3392296, 2969360, 2546102,
+ 2122526, 1698635, 1274433, 849924, 425111, 0, -425407, -851107,
+ -1277094, -1703366, -2129918, -2556747, -2983849, -3411219, -3838855,
+ -4266752, -4694906, -5123314, -5551971, -5980874, -6410019, -6839402,
+ -7269020, -7698867, -8128941, -8559237, -8989752, -9420481, -9851421,
+ -10282568, -10713918, -11145467, -11577211, -12009145, -12441267,
+ -12873573, -13306057, -13738717, -14171548, -14604546, -15037708,
+ -15471029, -15904505, -16338133, -16771909, -17205828, -17639886,
+ -18074080, -18508405, -18942858, -19377435, -19812131, -20246942,
+ -20681864, -21116895, -21552028, -21987261, -22422589, -22858008,
+ -23293515, -23729104, -24164773, -24600517, -25036332, -25472213,
+ -25908158, -26344162, -26780220, -27216329, -27652484, -28088682,
+ -28524918, -28961189, -29397490, -29833817, -30270166, -30706533,
+ -31142914, -31579304, -32015701, -32452098, -32888493, -33324882,
+ -33761259, -34197622, -34633966, -35070286, -35506579, -35942840,
+ -36379066, -36815252, -37251394, -37687488, -38123530, -38559516,
+ -38995441, -39431301, -39867093, -40302812, -40738453, -41174014,
+ -41609488, -42044874, -42480165, -42915358, -43350450, -43785435,
+ -44220309, -44655069, -45089710, -45524228, -45958619, -46392879,
+ -46827003, -47260987, -47694827, -48128519, -48562059, -48995442,
+ -49428664, -49861722, -50294610, -50727325, -51159862, -51592218,
+ -52024388, -52456368, -52888153, -53319740, -53751124, -54182301,
+ -54613267, -55044017, -55474548, -55904855, -56334934, -56764781,
+ -57194391, -57623760, -58052885, -58481761, -58910383, -59338747,
+ -59766850, -60194687, -60622254, -61049546, -61476559, -61903290,
+ -62329733, -62755885, -63181742, -63607299, -64032552, -64457496,
+ -64882128, -65306444, -65730439, -66154108, -66577448, -67000455,
+ -67423123, -67845450, -68267431, -68689061, -69110336, -69531253,
+ -69951806, -70371992, -70791807, -71211245, -71630304, -72048979,
+ -72467265, -72885158, -73302655, -73719750, -74136441, -74552721,
+ -74968588, -75384037, -75799064, -76213665, -76627835, -77041570,
+ -77454866, -77867719, -78280125, -78692079, -79103577, -79514615,
+ -79925189, -80335295, -80744928, -81154085, -81562760, -81970950,
+ -82378651, -82785858, -83192568, -83598775, -84004477, -84409668,
+ -84814345, -85218503, -85622138, -86025246, -86427824, -86829865,
+ -87231368, -87632326, -88032737, -88432596, -88831899, -89230641,
+ -89628819, -90026428, -90423464, -90819924, -91215802, -91611096,
+ -92005800, -92399910, -92793423, -93186334, -93578639, -93970334,
+ -94361415, -94751878, -95141719, -95530933, -95919516, -96307465,
+ -96694774, -97081441, -97467461, -97852830, -98237544, -98621598,
+ -99004989, -99387712, -99769764, -100151141, -100531837, -100911850,
+ -101291175, -101669808, -102047745, -102424982, -102801515, -103177340,
+ -103552453, -103926849, -104300525, -104673477, -105045701, -105417193,
+ -105787948, -106157962, -106527233, -106895754, -107263524, -107630537,
+ -107996790, -108362278, -108726998, -109090946, -109454117, -109816508,
+ -110178114, -110538933, -110898959, -111258189, -111616619, -111974245,
+ -112331063, -112687069, -113042259, -113396629, -113750175, -114102894,
+ -114454781, -114805833, -115156046, -115505415, -115853937, -116201608,
+ -116548424, -116894381, -117239475, -117583703, -117927061, -118269544,
+ -118611149, -118951872, -119291709, -119630657, -119968711, -120305868,
+ -120642124, -120977475, -121311917, -121645446, -121978059, -122309752,
+ -122640522, -122970363, -123299273, -123627248, -123954284, -124280377,
+ -124605524, -124929720, -125252963, -125575247, -125896571, -126216929,
+ -126536318, -126854735, -127172176, -127488637, -127804114, -128118604,
+ -128432103, -128744607, -129056113, -129366617, -129676116, -129984605,
+ -130292082, -130598542, -130903982, -131208398, -131511787, -131814145,
+ -132115469, -132415755, -132714999, -133013198, -133310348, -133606446,
+ -133901488, -134195470, -134488390, -134780243, -135071026, -135360736,
+ -135649369, -135936921, -136223390, -136508771, -136793061, -137076257,
+ -137358355, -137639352, -137919244, -138198028, -138475700, -138752257,
+ -139027696, -139302014, -139575206, -139847269, -140118201, -140387997,
+ -140656655, -140924171, -141190541, -141455763, -141719832, -141982746,
+ -142244502, -142505096, -142764524, -143022784, -143279873, -143535786,
+ -143790521, -144044074, -144296443, -144547623, -144797612, -145046407,
+ -145294004, -145540400, -145785592, -146029577, -146272351, -146513912,
+ -146754256, -146993381, -147231282, -147467957, -147703403, -147937616,
+ -148170594, -148402334, -148632832, -148862085, -149090090, -149316845,
+ -149542346, -149766590, -149989574, -150211295, -150431750, -150650936,
+ -150868850, -151085490, -151300852, -151514933, -151727730, -151939240,
+ -152149461, -152358390, -152566023, -152772357, -152977391, -153181120,
+ -153383543, -153584655, -153784455, -153982940, -154180106, -154375952,
+ -154570473, -154763668, -154955533, -155146065, -155335263, -155523123,
+ -155709643, -155894819, -156078649, -156261131, -156442261, -156622037,
+ -156800457, -156977517, -157153215, -157327548, -157500514, -157672110,
+ -157842333, -158011181, -158178651, -158344741, -158509448, -158672770,
+ -158834703, -158995246, -159154396, -159312150, -159468506, -159623461,
+ -159777013, -159929160, -160079899, -160229227, -160377142, -160523642,
+ -160668724, -160812386, -160954626, -161095440, -161234827, -161372785,
+ -161509311, -161644402, -161778057, -161910272, -162041047, -162170378,
+ -162298263, -162424700, -162549686, -162673220, -162795300, -162915922,
+ -163035085, -163152787, -163269025, -163383797, -163497102, -163608936,
+ -163719299, -163828187, -163935598, -164041531, -164145984, -164248954,
+ -164350439, -164450437, -164548947, -164645966, -164741492, -164835523,
+ -164928058, -165019093, -165108628, -165196661, -165283188, -165368210,
+ -165451722, -165533725, -165614215, -165693191, -165770652, -165846594,
+ -165921017, -165993918, -166065297, -166135150, -166203476, -166270274,
+ -166335542, -166399277, -166461479, -166522145, -166581274, -166638864,
+ -166694913, -166749420, -166802384, -166853801, -166903672, -166951994,
+ -166998765, -167043985, -167087651, -167129762, -167170316, -167209312,
+ -167246748, -167282623, -167316936, -167349684, -167380867, -167410483,
+ -167438530, -167465007, -167489913, -167513247, -167535006, -167555189,
+ -167573796, -167590824, -167606274, -167620142, -167632428, -167643130,
+ -167652248, -167659780, -167665725, -167670081, -167672848, -167674024,
+ -167673608, -167671598, -167667994, -167662795, -167655999, -167647605,
+ -167637612, -167626019, -167612825, -167598029, -167581630, -167563627,
+ -167544018, -167522803, -167499981, -167475550, -167449511, -167421861,
+ -167392600, -167361727, -167329241, -167295141, -167259427, -167222097,
+ -167183150, -167142587, -167100405, -167056604, -167011184, -166964143,
+ -166915481, -166865197, -166813290, -166759760, -166704606, -166647826,
+ -166589422, -166529391, -166467733, -166404448, -166339534, -166272992,
+ -166204821, -166135020, -166063588, -165990526, -165915831, -165839505,
+ -165761547, -165681955, -165600730, -165517871, -165433377, -165347249,
+ -165259485, -165170086, -165079051, -164986379, -164892071, -164796126,
+ -164698543, -164599322, -164498464, -164395967, -164291832, -164186058,
+ -164078644, -163969592, -163858900, -163746568, -163632597, -163516986,
+ -163399734, -163280842, -163160310, -163038138, -162914324, -162788871,
+ -162661776, -162533041, -162402665, -162270648, -162136991, -162001693,
+ -161864754, -161726174, -161585954, -161444094, -161300593, -161155452,
+ -161008670, -160860249, -160710188, -160558487, -160405147, -160250167,
+ -160093549, -159935291, -159775395, -159613861, -159450689, -159285879,
+ -159119431, -158951347, -158781626, -158610268, -158437275, -158262646,
+ -158086381, -157908482, -157728948, -157547781, -157364980, -157180547,
+ -156994480, -156806782, -156617453, -156426492, -156233902, -156039681,
+ -155843832, -155646353, -155447248, -155246514, -155044154, -154840169,
+ -154634557, -154427322, -154218462, -154007980, -153795875, -153582148,
+ -153366801, -153149833, -152931247, -152711042, -152489219, -152265780,
+ -152040724, -151814054, -151585770, -151355873, -151124363, -150891242,
+ -150656511, -150420171, -150182222, -149942666, -149701504, -149458736,
+ -149214365, -148968390, -148720813, -148471635, -148220858, -147968482,
+ -147714508, -147458938, -147201773, -146943014, -146682662, -146420719,
+ -146157185, -145892063, -145625353, -145357056, -145087174, -144815709,
+ -144542661, -144268032, -143991823, -143714036, -143434671, -143153732,
+ -142871218, -142587132, -142301474, -142014247, -141725451, -141435089,
+ -141143162, -140849671, -140554618, -140258005, -139959832, -139660103,
+ -139358818, -139055978, -138751586, -138445644, -138138153, -137829114,
+ -137518529, -137206401, -136892731, -136577520, -136260770, -135942484,
+ -135622663, -135301308, -134978423, -134654007, -134328064, -134000596,
+ -133671603, -133341089, -133009055, -132675502, -132340434, -132003851,
+ -131665756, -131326151, -130985038, -130642420, -130298297, -129952672,
+ -129605547, -129256925, -128906807, -128555195, -128202093, -127847501,
+ -127491422, -127133858, -126774812, -126414285, -126052280, -125688800,
+ -125323845, -124957420, -124589525, -124220164, -123849339, -123477051,
+ -123103304, -122728099, -122351440, -121973328, -121593766, -121212757,
+ -120830302, -120446405, -120061067, -119674292, -119286082, -118896439,
+ -118505366, -118112865, -117718939, -117323591, -116926824, -116528639,
+ -116129039, -115728028, -115325607, -114921780, -114516549, -114109917,
+ -113701887, -113292460, -112881641, -112469432, -112055836, -111640855,
+ -111224492, -110806750, -110387633, -109967142, -109545280, -109122052,
+ -108697459, -108271504, -107844190, -107415521, -106985499, -106554127,
+ -106121409, -105687346, -105251943, -104815203, -104377127, -103937720,
+ -103496984, -103054923, -102611540, -102166837, -101720818, -101273487,
+ -100824846, -100374898, -99923646, -99471095, -99017247, -98562105,
+ -98105672, -97647953, -97188949, -96728665, -96267104, -95804268,
+ -95340163, -94874789, -94408152, -93940255, -93471100, -93000692,
+ -92529033, -92056128, -91581979, -91106591, -90629965, -90152107,
+ -89673020, -89192707, -88711171, -88228417, -87744447, -87259266,
+ -86772876, -86285282, -85796488, -85306496, -84815310, -84322935,
+ -83829373, -83334629, -82838707, -82341609, -81843339, -81343902,
+ -80843302, -80341541, -79838624, -79334554, -78829336, -78322972,
+ -77815468, -77306827, -76797052, -76286148, -75774119, -75260967,
+ -74746698, -74231316, -73714823, -73197225, -72678525, -72158727,
+ -71637835, -71115853, -70592785, -70068635, -69543408, -69017107,
+ -68489736, -67961300, -67431803, -66901248, -66369640, -65836983,
+ -65303281, -64768538, -64232759, -63695947, -63158107, -62619244,
+ -62079361, -61538462, -60996552, -60453635, -59909716, -59364798,
+ -58818887, -58271985, -57724099, -57175231, -56625387, -56074570,
+ -55522785, -54970037, -54416330, -53861668, -53306056, -52749498,
+ -52191999, -51633563, -51074194, -50513898, -49952678, -49390539,
+ -48827486, -48263523, -47698654, -47132885, -46566220, -45998664,
+ -45430220, -44860894, -44290691, -43719614, -43147669, -42574860,
+ -42001192, -41426669, -40851297, -40275080, -39698022, -39120129,
+ -38541405, -37961855, -37381483, -36800295, -36218295, -35635488,
+ -35051879, -34467473, -33882274, -33296287, -32709518, -32121970,
+ -31533649, -30944560, -30354708, -29764097, -29172733, -28580620,
+ -27987763, -27394168, -26799839, -26204781, -25608999, -25012498,
+ -24415284, -23817360, -23218733, -22619407, -22019388, -21418679,
+ -20817287, -20215217, -19612473, -19009060, -18404985, -17800251,
+ -17194864, -16588829, -15982152, -15374836, -14766889, -14158314,
+ -13549117, -12939303, -12328877, -11717845, -11106212, -10493982,
+ -9881162, -9267756, -8653770, -8039209, -7424078, -6808382, -6192128,
+ -5575319, -4957962, -4340062, -3721624, -3102653, -2483155, -1863136,
+ -1242600, -621552, 0, 622053, 1244601, 1867638, 2491160, 3115160,
+ 3739634, 4364575, 4989979, 5615839, 6242150, 6868908, 7496106, 8123739,
+ 8751801, 9380286, 10009191, 10638508, 11268232, 11898358, 12528880,
+ 13159793, 13791090, 14422767, 15054818, 15687237, 16320019, 16953158,
+ 17586648, 18220484, 18854660, 19489170, 20124010, 20759172, 21394652,
+ 22030444, 22666542, 23302940, 23939634, 24576616, 25213882, 25851425,
+ 26489240, 27127322, 27765664, 28404260, 29043106, 29682194, 30321521,
+ 30961078, 31600862, 32240866, 32881084, 33521511, 34162140, 34802966,
+ 35443983, 36085186, 36726568, 37368123, 38009847, 38651732, 39293773,
+ 39935964, 40578300, 41220774, 41863381, 42506114, 43148968, 43791937,
+ 44435015, 45078196, 45721474, 46364843, 47008298, 47651832, 48295439,
+ 48939114, 49582851, 50226643, 50870484, 51514370, 52158293, 52802248,
+ 53446228, 54090229, 54734243, 55378265, 56022288, 56666308, 57310317,
+ 57954310, 58598281, 59242223, 59886131, 60529999, 61173821, 61817590,
+ 62461300, 63104946, 63748522, 64392021, 65035437, 65678765, 66321997,
+ 66965129, 67608154, 68251066, 68893858, 69536526, 70179062, 70821461,
+ 71463716, 72105822, 72747772, 73389560, 74031180, 74672626, 75313892,
+ 75954971, 76595859, 77236547, 77877031, 78517304, 79157360, 79797193,
+ 80436797, 81076165, 81715292, 82354171, 82992796, 83631161, 84269260,
+ 84907086, 85544634, 86181898, 86818870, 87455545, 88091918, 88727980,
+ 89363727, 89999153, 90634250, 91269014, 91903436, 92537513, 93171237,
+ 93804601, 94437601, 95070229, 95702480, 96334347, 96965824, 97596906,
+ 98227584, 98857855, 99487710, 100117145, 100746152, 101374726,
+ 102002860, 102630549, 103257785, 103884564, 104510878, 105136721,
+ 105762087, 106386970, 107011364, 107635262, 108258659, 108881547,
+ 109503922, 110125775, 110747103, 111367897, 111988152, 112607862,
+ 113227020, 113845620, 114463657, 115081123, 115698013, 116314320,
+ 116930038, 117545161, 118159682, 118773596, 119386896, 119999577,
+ 120611630, 121223052, 121833835, 122443972, 123053459, 123662289,
+ 124270454, 124877950, 125484770, 126090908, 126696358, 127301112,
+ 127905166, 128508513, 129111147, 129713061, 130314249, 130914706,
+ 131514424, 132113399, 132711622, 133309089, 133905793, 134501729,
+ 135096888, 135691267, 136284858, 136877655, 137469652, 138060842,
+ 138651221, 139240781, 139829516, 140417420, 141004487, 141590712,
+ 142176086, 142760605, 143344263, 143927052, 144508968, 145090003,
+ 145670152, 146249409, 146827767, 147405220, 147981762, 148557388,
+ 149132090, 149705863, 150278700, 150850597, 151421545, 151991540,
+ 152560575, 153128644, 153695741, 154261859, 154826994, 155391138,
+ 155954286, 156516431, 157077568, 157637690, 158196792, 158754866,
+ 159311908, 159867911, 160422869, 160976776, 161529626, 162081413,
+ 162632131, 163181774, 163730335, 164277809, 164824191, 165369473,
+ 165913649, 166456715, 166998663, 167539489, 168079185, 168617745,
+ 169155165, 169691438, 170226557, 170760518, 171293314, 171824938,
+ 172355386, 172884651, 173412728, 173939609, 174465290, 174989765,
+ 175513027, 176035072, 176555891, 177075481, 177593835, 178110947,
+ 178626812, 179141423, 179654774, 180166860, 180677675, 181187214,
+ 181695469, 182202436, 182708109, 183212481, 183715547, 184217302,
+ 184717739, 185216853, 185714637, 186211087, 186706196, 187199958,
+ 187692369, 188183421, 188673110, 189161429, 189648374, 190133938,
+ 190618115, 191100900, 191582287, 192062271, 192540845, 193018005,
+ 193493744, 193968057, 194440939, 194912383, 195382383, 195850936,
+ 196318034, 196783672, 197247845, 197710546, 198171772, 198631515,
+ 199089770, 199546533, 200001796, 200455555, 200907805, 201358539,
+ 201807752, 202255439, 202701595, 203146213, 203589288, 204030816,
+ 204470789, 204909204, 205346055, 205781335, 206215040, 206647165,
+ 207077703, 207506650, 207934001, 208359749, 208783890, 209206418,
+ 209627328, 210046614, 210464272, 210880295, 211294680, 211707419,
+ 212118509, 212527944, 212935718, 213341827, 213746265, 214149027,
+ 214550107, 214949502, 215347204, 215743210, 216137514, 216530111,
+ 216920996, 217310163, 217697608, 218083325, 218467310, 218849557,
+ 219230061, 219608818, 219985821, 220361067, 220734550, 221106265,
+ 221476206, 221844370, 222210751, 222575344, 222938145, 223299147,
+ 223658347, 224015739, 224371319, 224725081, 225077022, 225427134,
+ 225775415, 226121859, 226466462, 226809218, 227150122, 227489171,
+ 227826359, 228161681, 228495133, 228826709, 229156406, 229484218,
+ 229810141, 230134170, 230456300, 230776527, 231094846, 231411252,
+ 231725742, 232038309, 232348950, 232657660, 232964434, 233269268,
+ 233572158, 233873098, 234172085, 234469113, 234764179, 235057277,
+ 235348404, 235637555, 235924725, 236209910, 236493106, 236774308,
+ 237053512, 237330714, 237605909, 237879092, 238150260, 238419408,
+ 238686532, 238951628, 239214691, 239475718, 239734703, 239991642,
+ 240246533, 240499369, 240750148, 240998864, 241245515, 241490095,
+ 241732600, 241973028, 242211372, 242447630, 242681797, 242913869,
+ 243143842, 243371713, 243597477, 243821130, 244042668, 244262087,
+ 244479384, 244694555, 244907595, 245118500, 245327268, 245533893,
+ 245738373, 245940702, 246140879, 246338898, 246534756, 246728449,
+ 246919973, 247109326, 247296502, 247481499, 247664312, 247844939,
+ 248023374, 248199616, 248373659, 248545501, 248715138, 248882567,
+ 249047783, 249210784, 249371565, 249530124, 249686456, 249840559,
+ 249992429, 250142063, 250289456, 250434607, 250577511, 250718164,
+ 250856565, 250992708, 251126592, 251258213, 251387567, 251514651,
+ 251639462, 251761997, 251882253, 252000226, 252115914, 252229312,
+ 252340418, 252449230, 252555743, 252659954, 252761862, 252861462,
+ 252958751, 253053727, 253146387, 253236728, 253324746, 253410438,
+ 253493803, 253574837, 253653536, 253729899, 253803922, 253875603,
+ 253944938, 254011926, 254076563, 254138846, 254198773, 254256341,
+ 254311547, 254364389, 254414864, 254462969, 254508702, 254552060,
+ 254593041, 254631642, 254667860, 254701693, 254733139, 254762195,
+ 254788858, 254813126, 254834997, 254854468, 254871538, 254886202,
+ 254898460, 254908309, 254915746, 254920769, 254923376, 254923565,
+ 254921334, 254916680, 254909600, 254900094, 254888159, 254873792,
+ 254856991, 254837756, 254816082, 254791969, 254765414, 254736415,
+ 254704971, 254671079, 254634737, 254595943, 254554697, 254510994,
+ 254464835, 254416216, 254365137, 254311594, 254255587, 254197114,
+ 254136173, 254072762, 254006879, 253938524, 253867693, 253794386,
+ 253718601, 253640336, 253559590, 253476361, 253390647, 253302448,
+ 253211761, 253118585, 253022919, 252924761, 252824110, 252720964,
+ 252615322, 252507183, 252396545, 252283407, 252167768, 252049626,
+ 251928981, 251805830, 251680173, 251552009, 251421336, 251288153,
+ 251152459, 251014254, 250873535, 250730302, 250584555, 250436290,
+ 250285509, 250132210, 249976391, 249818053, 249657194, 249493812,
+ 249327909, 249159481, 248988530, 248815053, 248639050, 248460521,
+ 248279464, 248095879, 247909765, 247721122, 247529949, 247336245,
+ 247140010, 246941242, 246739943, 246536110, 246329744, 246120843,
+ 245909409, 245695439, 245478934, 245259893, 245038316, 244814202,
+ 244587552, 244358364, 244126639, 243892377, 243655576, 243416237,
+ 243174359, 242929944, 242682989, 242433495, 242181463, 241926891,
+ 241669780, 241410130, 241147941, 240883212, 240615944, 240346138,
+ 240073792, 239798906, 239521483, 239241520, 238959018, 238673979,
+ 238386401, 238096285, 237803631, 237508439, 237210711, 236910446,
+ 236607644, 236302305, 235994432, 235684022, 235371078, 235055599,
+ 234737586, 234417040, 234093960, 233768348, 233440204, 233109529,
+ 232776323, 232440587, 232102322, 231761528, 231418205, 231072356,
+ 230723980, 230373078, 230019651, 229663700, 229305226, 228944229,
+ 228580711, 228214672, 227846113, 227475036, 227101440, 226725328,
+ 226346701, 225965558, 225581902, 225195733, 224807053, 224415863,
+ 224022164, 223625956, 223227243, 222826023, 222422300, 222016073,
+ 221607345, 221196117, 220782389, 220366165, 219947444, 219526228,
+ 219102519, 218676319, 218247628, 217816448, 217382781, 216946628,
+ 216507991, 216066872, 215623272, 215177193, 214728636, 214277604,
+ 213824097, 213368118, 212909669, 212448751, 211985366, 211519515,
+ 211051202, 210580427, 210107193, 209631502, 209153355, 208672754,
+ 208189702, 207704201, 207216252, 206725858, 206233021, 205737742,
+ 205240025, 204739871, 204237282, 203732261, 203224810, 202714931,
+ 202202626, 201687899, 201170750, 200651183, 200129200, 199604803,
+ 199077994, 198548777, 198017154, 197483127, 196946698, 196407871,
+ 195866647, 195323030, 194777022, 194228626, 193677844, 193124679,
+ 192569133, 192011211, 191450913, 190888244, 190323205, 189755800,
+ 189186032, 188613903, 188039416, 187462575, 186883382, 186301840,
+ 185717952, 185131722, 184543151, 183952244, 183359004, 182763433,
+ 182165534, 181565312, 180962768, 180357907, 179750731, 179141244,
+ 178529449, 177915349, 177298948, 176680248, 176059254, 175435969,
+ 174810396, 174182539, 173552400, 172919984, 172285295, 171648335,
+ 171009108, 170367617, 169723867, 169077861, 168429603, 167779096,
+ 167126344, 166471351, 165814120, 165154656, 164492961, 163829041,
+ 163162898, 162494537, 161823961, 161151174, 160476181, 159798985,
+ 159119590, 158438000, 157754220, 157068253, 156380103, 155689775,
+ 154997272, 154302599, 153605760, 152906759, 152205600, 151502287,
+ 150796826, 150089219, 149379472, 148667588, 147953572, 147237429,
+ 146519162, 145798777, 145076277, 144351667, 143624951, 142896135,
+ 142165222, 141432218, 140697126, 139959951, 139220698, 138479372,
+ 137735977, 136990518, 136242999, 135493426, 134741803, 133988134,
+ 133232426, 132474681, 131714907, 130953106, 130189284, 129423447,
+ 128655598, 127885743, 127113887, 126340035, 125564192, 124786363,
+ 124006552, 123224766, 122441009, 121655286, 120867603, 120077964,
+ 119286376, 118492842, 117697369, 116899961, 116100624, 115299364,
+ 114496184, 113691092, 112884092, 112075190, 111264391, 110451700,
+ 109637123, 108820666, 108002333, 107182132, 106360066, 105536142,
+ 104710365, 103882741, 103053275, 102221974, 101388842, 100553886,
+ 99717111, 98878523, 98038128, 97195931, 96351939, 95506157, 94658591,
+ 93809247, 92958130, 92105248, 91250605, 90394207, 89536061, 88676173,
+ 87814549, 86951194, 86086114, 85219317, 84350807, 83480592, 82608677,
+ 81735068, 80859771, 79982794, 79104141, 78223820, 77341836, 76458196,
+ 75572906, 74685972, 73797401, 72907200, 72015374, 71121930, 70226874,
+ 69330213, 68431954, 67532102, 66630665, 65727649, 64823060, 63916906,
+ 63009192, 62099925, 61189112, 60276760, 59362875, 58447463, 57530533,
+ 56612090, 55692141, 54770693, 53847753, 52923327, 51997423, 51070047,
+ 50141206, 49210907, 48279157, 47345963, 46411332, 45475270, 44537786,
+ 43598885, 42658575, 41716863, 40773756, 39829261, 38883385, 37936135,
+ 36987519, 36037543, 35086216, 34133543, 33179532, 32224191, 31267527,
+ 30309547, 29350258, 28389667, 27427783, 26464612, 25500161, 24534439,
+ 23567452, 22599208, 21629714, 20658979, 19687008, 18713811, 17739393,
+ 16763764, 15786930, 14808899, 13829678, 12849276, 11867700, 10884957,
+ 9901055, 8916002, 7929806, 6942474, 5954014, 4964433, 3973740, 2981943,
+ 1989048, 995064, 0, -996138, -1993342, -2991603, -3990914, -4991267,
+ -5992654, -6995066, -7998497, -9002937, -10008380, -11014816,
+ -12022238, -13030638, -14040007, -15050338, -16061623, -17073853,
+ -18087020, -19101116, -20116133, -21132063, -22148897, -23166627,
+ -24185246, -25204744, -26225113, -27246346, -28268434, -29291368,
+ -30315140, -31339743, -32365166, -33391403, -34418445, -35446283,
+ -36474908, -37504313, -38534489, -39565428, -40597120, -41629558,
+ -42662733, -43696636, -44731259, -45766594, -46802631, -47839362,
+ -48876778, -49914872, -50953633, -51993054, -53033126, -54073841,
+ -55115188, -56157161, -57199749, -58242945, -59286739, -60331123,
+ -61376088, -62421625, -63467725, -64514380, -65561581, -66609318,
+ -67657583, -68706367, -69755662, -70805457, -71855745, -72906517,
+ -73957762, -75009473, -76061641, -77114256, -78167309, -79220792,
+ -80274696, -81329010, -82383727, -83438837, -84494331, -85550200,
+ -86606436, -87663027, -88719967, -89777245, -90834852, -91892780,
+ -92951018, -94009558, -95068391, -96127507, -97186897, -98246552,
+ -99306463, -100366620, -101427014, -102487635, -103548476, -104609525,
+ -105670774, -106732213, -107793833, -108855625, -109917580, -110979687,
+ -112041938, -113104323, -114166832, -115229457, -116292188, -117355015,
+ -118417929, -119480920, -120543980, -121607097, -122670264, -123733470,
+ -124796706, -125859962, -126923229, -127986497, -129049756, -130112998,
+ -131176212, -132239389, -133302520, -134365594, -135428601, -136491534,
+ -137554380, -138617132, -139679780, -140742312, -141804721, -142866996,
+ -143929128, -144991107, -146052922, -147114565, -148176026, -149237294,
+ -150298361, -151359216, -152419850, -153480252, -154540413, -155600324,
+ -156659973, -157719353, -158778452, -159837260, -160895769, -161953968,
+ -163011847, -164069397, -165126607, -166183468, -167239969, -168296102,
+ -169351855, -170407219, -171462185, -172516741, -173570879, -174624587,
+ -175677858, -176730679, -177783042, -178834936, -179886352, -180937278,
+ -181987707, -183037626, -184087028, -185135900, -186184234, -187232019,
+ -188279245, -189325903, -190371981, -191417471, -192462362, -193506643,
+ -194550306, -195593340, -196635734, -197677479, -198718564, -199758980,
+ -200798716, -201837762, -202876109, -203913745, -204950661, -205986847,
+ -207022293, -208056987, -209090922, -210124085, -211156467, -212188058,
+ -213218847, -214248825, -215277982, -216306306, -217333788, -218360418,
+ -219386185, -220411080, -221435092, -222458210, -223480426, -224501727,
+ -225522105, -226541549, -227560049, -228577594, -229594175, -230609781,
+ -231624401, -232638027, -233650646, -234662250, -235672827, -236682368,
+ -237690863, -238698300, -239704670, -240709963, -241714168, -242717276,
+ -243719275, -244720155, -245719906, -246718519, -247715982, -248712285,
+ -249707419, -250701372, -251694134, -252685696, -253676047, -254665176,
+ -255653074, -256639729, -257625133, -258609273, -259592141, -260573726,
+ -261554017, -262533004, -263510677, -264487026, -265462040, -266435709,
+ -267408022, -268378970, -269348542, -270316728, -271283517, -272248899,
+ -273212864, -274175402, -275136501, -276096153, -277054346, -278011071,
+ -278966316, -279920072, -280872329, -281823075, -282772301, -283719997,
+ -284666152, -285610755, -286553797, -287495267, -288435156, -289373452,
+ -290310145, -291245225, -292178682, -293110505, -294040685, -294969210,
+ -295896071, -296821258, -297744759, -298666565, -299586666, -300505051,
+ -301421709, -302336632, -303249807, -304161226, -305070878, -305978752,
+ -306884838, -307789127, -308691607, -309592269, -310491103, -311388097,
+ -312283242, -313176528, -314067944, -314957481, -315845127, -316730873,
+ -317614708, -318496623, -319376607, -320254649, -321130740, -322004870,
+ -322877028, -323747204, -324615388, -325481569, -326345738, -327207885,
+ -328067998, -328926069, -329782086, -330636040, -331487921, -332337718,
+ -333185422, -334031021, -334874507, -335715868, -336555095, -337392178,
+ -338227107, -339059870, -339890460, -340718864, -341545074, -342369079,
+ -343190869, -344010434, -344827764, -345642849, -346455678, -347266243,
+ -348074532, -348880536, -349684245, -350485648, -351284736, -352081499,
+ -352875927, -353668009, -354457737, -355245099, -356030085, -356812687,
+ -357592894, -358370696, -359146083, -359919045, -360689572, -361457655,
+ -362223283, -362986447, -363747136, -364505341, -365261052, -366014260,
+ -366764953, -367513123, -368258760, -369001853, -369742393, -370480370,
+ -371215775, -371948597, -372678827, -373406455, -374131471, -374853866,
+ -375573630, -376290752, -377005224, -377717036, -378426177, -379132639,
+ -379836411, -380537484, -381235849, -381931494, -382624412, -383314592,
+ -384002025, -384686701, -385368610, -386047743, -386724090, -387397643,
+ -388068390, -388736323, -389401432, -390063708, -390723140, -391379721,
+ -392033439, -392684286, -393332252, -393977328, -394619504, -395258771,
+ -395895120, -396528540, -397159023, -397786559, -398411139, -399032754,
+ -399651393, -400267049, -400879711, -401489370, -402096017, -402699643,
+ -403300238, -403897793, -404492299, -405083746, -405672126, -406257430,
+ -406839647, -407418769, -407994787, -408567691, -409137472, -409704122,
+ -410267631, -410827990, -411385190, -411939222, -412490077, -413037745,
+ -413582218, -414123487, -414661543, -415196377, -415727979, -416256341,
+ -416781455, -417303310, -417821898, -418337210, -418849238, -419357972,
+ -419863404, -420365525, -420864325, -421359797, -421851931, -422340718,
+ -422826151, -423308219, -423786915, -424262229, -424734154, -425202679,
+ -425667798, -426129500, -426587777, -427042622, -427494024, -427941976,
+ -428386469, -428827494, -429265043, -429699107, -430129679, -430556749,
+ -430980308, -431400349, -431816864, -432229842, -432639277, -433045160,
+ -433447483, -433846236, -434241412, -434633003, -435021000, -435405395,
+ -435786180, -436163346, -436536885, -436906790, -437273051, -437635661,
+ -437994611, -438349894, -438701501, -439049424, -439393655, -439734187,
+ -440071010, -440404117, -440733501, -441059152, -441381063, -441699227,
+ -442013635, -442324279, -442631151, -442934244, -443233549, -443529059,
+ -443820767, -444108663, -444392742, -444672993, -444949411, -445221987,
+ -445490714, -445755583, -446016588, -446273721, -446526973, -446776338,
+ -447021808, -447263375, -447501032, -447734771, -447964585, -448190467,
+ -448412408, -448630401, -448844440, -449054517, -449260623, -449462753,
+ -449660898, -449855052, -450045206, -450231355, -450413490, -450591604,
+ -450765691, -450935742, -451101752, -451263712, -451421615, -451575456,
+ -451725225, -451870917, -452012525, -452150041, -452283458, -452412770,
+ -452537969, -452659049, -452776003, -452888824, -452997505, -453102039,
+ -453202419, -453298639, -453390692, -453478572, -453562270, -453641782,
+ -453717100, -453788217, -453855127, -453917824, -453976300, -454030550,
+ -454080567, -454126343, -454167873, -454205151, -454238170, -454266923,
+ -454291404, -454311607, -454327525, -454339153, -454346483, -454349511,
+ -454348228, -454342630, -454332709, -454318461, -454299878, -454276955,
+ -454249685, -454218063, -454182082, -454141737, -454097021, -454047928,
+ -453994454, -453936590, -453874333, -453807675, -453736612, -453661136,
+ -453581244, -453496927, -453408182, -453315003, -453217382, -453115316,
+ -453008798, -452897823, -452782384, -452662478, -452538097, -452409237,
+ -452275892, -452138057, -451995726, -451848893, -451697554, -451541703,
+ -451381335, -451216445, -451047026, -450873075, -450694585, -450511552,
+ -450323970, -450131835, -449935140, -449733882, -449528055, -449317654,
+ -449102674, -448883110, -448658957, -448430210, -448196864, -447958915,
+ -447716358, -447469187, -447217399, -446960987, -446699948, -446434277,
+ -446163969, -445889020, -445609425, -445325179, -445036277, -444742716,
+ -444444491, -444141597, -443834029, -443521784, -443204857, -442883244,
+ -442556940, -442225941, -441890243, -441549841, -441204731, -440854909,
+ -440500372, -440141114, -439777131, -439408420, -439034977, -438656797,
+ -438273877, -437886212, -437493799, -437096633, -436694711, -436288029,
+ -435876584, -435460370, -435039386, -434613626, -434183087, -433747765,
+ -433307658, -432862761, -432413070, -431958582, -431499294, -431035202,
+ -430566303, -430092593, -429614068, -429130726, -428642563, -428149575,
+ -427651760, -427149114, -426641634, -426129317, -425612159, -425090157,
+ -424563309, -424031611, -423495060, -422953654, -422407388, -421856261,
+ -421300269, -420739409, -420173679, -419603076, -419027596, -418447237,
+ -417861997, -417271872, -416676861, -416076959, -415472166, -414862477,
+ -414247891, -413628405, -413004016, -412374722, -411740521, -411101410,
+ -410457387, -409808449, -409154594, -408495821, -407832125, -407163507,
+ -406489962, -405811489, -405128087, -404439752, -403746483, -403048277,
+ -402345133, -401637049, -400924023, -400206053, -399483137, -398755273,
+ -398022459, -397284694, -396541975, -395794302, -395041672, -394284084,
+ -393521536, -392754027, -391981555, -391204118, -390421715, -389634345,
+ -388842006, -388044696, -387242415, -386435161, -385622932, -384805728,
+ -383983547, -383156388, -382324250, -381487132, -380645032, -379797949,
+ -378945883, -378088833, -377226797, -376359774, -375487764, -374610766,
+ -373728778, -372841801, -371949833, -371052873, -370150921, -369243976,
+ -368332038, -367415105, -366493178, -365566255, -364634336, -363697422,
+ -362755510, -361808601, -360856694, -359899790, -358937887, -357970985,
+ -356999085, -356022185, -355040287, -354053388, -353061490, -352064593,
+ -351062696, -350055799, -349043902, -348027005, -347005109, -345978213,
+ -344946318, -343909423, -342867530, -341820637, -340768746, -339711857,
+ -338649970, -337583085, -336511203, -335434325, -334352450, -333265579,
+ -332173713, -331076853, -329974998, -328868150, -327756309, -326639476,
+ -325517652, -324390837, -323259033, -322122239, -320980458, -319833689,
+ -318681934, -317525194, -316363470, -315196762, -314025072, -312848401,
+ -311666751, -310480121, -309288514, -308091931, -306890373, -305683841,
+ -304472336, -303255861, -302034415, -300808002, -299576622, -298340277,
+ -297098968, -295852697, -294601466, -293345276, -292084128, -290818025,
+ -289546969, -288270960, -286990002, -285704095, -284413241, -283117443,
+ -281816703, -280511022, -279200402, -277884846, -276564356, -275238933,
+ -273908580, -272573299, -271233092, -269887962, -268537910, -267182940,
+ -265823052, -264458251, -263088538, -261713915, -260334386, -258949952,
+ -257560617, -256166382, -254767251, -253363226, -251954310, -250540505,
+ -249121814, -247698241, -246269787, -244836456, -243398250, -241955173,
+ -240507228, -239054417, -237596744, -236134211, -234666822, -233194579,
+ -231717487, -230235548, -228748765, -227257141, -225760681, -224259387,
+ -222753263, -221242311, -219726536, -218205941, -216680530, -215150305,
+ -213615271, -212075431, -210530789, -208981348, -207427112, -205868085,
+ -204304271, -202735673, -201162296, -199584143, -198001217, -196413524,
+ -194821067, -193223849, -191621876, -190015151, -188403677, -186787461,
+ -185166504, -183540813, -181910390, -180275241, -178635369, -176990779,
+ -175341475, -173687462, -172028743, -170365325, -168697210, -167024404,
+ -165346912, -163664737, -161977884, -160286359, -158590165, -156889308,
+ -155183793, -153473623, -151758805, -150039342, -148315240, -146586504,
+ -144853138, -143115148, -141372539, -139625316, -137873484, -136117048,
+ -134356012, -132590384, -130820167, -129045367, -127265989, -125482039,
+ -123693522, -121900444, -120102809, -118300623, -116493892, -114682622,
+ -112866817, -111046484, -109221628, -107392255, -105558371, -103719981,
+ -101877091, -100029706, -98177833, -96321478, -94460646, -92595344,
+ -90725577, -88851351, -86972673, -85089548, -83201982, -81309983,
+ -79413554, -77512704, -75607439, -73697763, -71783685, -69865209,
+ -67942343, -66015093, -64083465, -62147465, -60207101, -58262379,
+ -56313304, -54359885, -52402127, -50440037, -48473622, -46502888,
+ -44527842, -42548492, -40564843, -38576903, -36584678, -34588176,
+ -32587403, -30582366, -28573073, -26559529, -24541744, -22519722,
+ -20493472, -18463001, -16428316, -14389424, -12346332, -10299048,
+ -8247579, -6191932, -4132115, -2068135, 0, 2072283, 4148707, 6229264,
+ 8313947, 10402747, 12495658, 14592671, 16693779, 18798974, 20908249,
+ 23021595, 25139005, 27260471, 29385985, 31515539, 33649126, 35786737,
+ 37928364, 40074000, 42223636, 44377264, 46534876, 48696464, 50862019,
+ 53031534, 55205001, 57382410, 59563755, 61749025, 63938214, 66131312,
+ 68328312, 70529204, 72733981, 74942633, 77155153, 79371531, 81591760,
+ 83815830, 86043733, 88275460, 90511002, 92750351, 94993498, 97240434,
+ 99491150, 101745638, 104003888, 106265892, 108531640, 110801124,
+ 113074335, 115351264, 117631900, 119916237, 122204263, 124495971,
+ 126791351, 129090394, 131393090, 133699430, 136009405, 138323006,
+ 140640224, 142961048, 145285470, 147613479, 149945068, 152280225,
+ 154618942, 156961209, 159307016, 161656355, 164009214, 166365585,
+ 168725458, 171088822, 173455670, 175825989, 178199772, 180577007,
+ 182957686, 185341798, 187729333, 190120281, 192514633, 194912378,
+ 197313507, 199718008, 202125873, 204537091, 206951653, 209369546,
+ 211790763, 214215292, 216643123, 219074246, 221508651, 223946326,
+ 226387263, 228831451, 231278878, 233729536, 236183412, 238640498,
+ 241100782, 243564253, 246030902, 248500717, 250973689, 253449805,
+ 255929057, 258411432, 260896921, 263385513, 265877196, 268371960,
+ 270869795, 273370689, 275874631, 278381611, 280891618, 283404640,
+ 285920667, 288439688, 290961692, 293486667, 296014604, 298545489,
+ 301079313, 303616065, 306155732, 308698305, 311243771, 313792120,
+ 316343340, 318897420, 321454348, 324014114, 326576706, 329142112,
+ 331710321, 334281322, 336855103, 339431653, 342010961, 344593014,
+ 347177801, 349765310, 352355531, 354948451, 357544059, 360142343,
+ 362743291, 365346892, 367953133, 370562004, 373173492, 375787586,
+ 378404273, 381023542, 383645382, 386269779, 388896722, 391526200,
+ 394158200, 396792710, 399429719, 402069213, 404711182, 407355613,
+ 410002494, 412651813, 415303557, 417957715, 420614275, 423273223,
+ 425934549, 428598239, 431264281, 433932664, 436603375, 439276401,
+ 441951730, 444629350, 447309248, 449991412, 452675830, 455362488,
+ 458051376, 460742479, 463435786, 466131283, 468828960, 471528802,
+ 474230797, 476934933, 479641196, 482349576, 485060057, 487772629,
+ 490487278, 493203991, 495922756, 498643560, 501366390, 504091233,
+ 506818077, 509546908, 512277714, 515010482, 517745198, 520481851,
+ 523220427, 525960913, 528703295, 531447562, 534193700, 536941696,
+ 539691537, 542443209, 545196700, 547951997, 550709087, 553467955,
+ 556228590, 558990978, 561755105, 564520959, 567288527, 570057794,
+ 572828748, 575601376, 578375663, 581151598, 583929166, 586708354,
+ 589489149, 592271537, 595055505, 597841039, 600628127, 603416754,
+ 606206907, 608998573, 611791738, 614586389, 617382511, 620180092,
+ 622979118, 625779575, 628581450, 631384729, 634189399, 636995445,
+ 639802854, 642611613, 645421708, 648233124, 651045849, 653859868,
+ 656675168, 659491736, 662309556, 665128616, 667948901, 670770399,
+ 673593094, 676416973, 679242022, 682068228, 684895576, 687724053,
+ 690553644, 693384336, 696216115, 699048966, 701882876, 704717831,
+ 707553817, 710390819, 713228824, 716067817, 718907785, 721748713,
+ 724590588, 727433395, 730277121, 733121750, 735967269, 738813664,
+ 741660921, 744509025, 747357962, 750207719, 753058280, 755909631,
+ 758761760, 761614650, 764468288, 767322660, 770177751, 773033547,
+ 775890034, 778747197, 781605023, 784463496, 787322602, 790182328,
+ 793042658, 795903579, 798765076, 801627134, 804489739, 807352877,
+ 810216534, 813080694, 815945344, 818810468, 821676053, 824542084,
+ 827408547, 830275427, 833142709, 836010379, 838878423, 841746825,
+ 844615572, 847484649, 850354042, 853223735, 856093714, 858963965,
+ 861834472, 864705223, 867576201, 870447392, 873318781, 876190355,
+ 879062098, 881933996, 884806033, 887678196, 890550469, 893422839,
+ 896295290, 899167807, 902040376, 904912983, 907785612, 910658248,
+ 913530878, 916403486, 919276057, 922148578, 925021032, 927893406,
+ 930765684, 933637853, 936509896, 939381799, 942253548, 945125127,
+ 947996522, 950867719, 953738701, 956609455, 959479966, 962350218,
+ 965220197, 968089889, 970959277, 973828348, 976697087, 979565478,
+ 982433508, 985301160, 988168420, 991035274, 993901706, 996767702,
+ 999633246, 1002498324, 1005362921, 1008227022, 1011090612, 1013953676,
+ 1016816200, 1019678167, 1022539565, 1025400377, 1028260588, 1031120185,
+ 1033979151, 1036837472, 1039695133, 1042552119, 1045408415, 1048264007,
+ 1051118878, 1053973015, 1056826403, 1059679025, 1062530869, 1065381918,
+ 1068232157, 1071081573, 1073930149, 1076777870, 1079624723, 1082470692,
+ 1085315761, 1088159917, 1091003143, 1093845426, 1096686750, 1099527100,
+ 1102366461, 1105204819, 1108042158, 1110878463, 1113713720, 1116547913,
+ 1119381028, 1122213049, 1125043962, 1127873752, 1130702403, 1133529902,
+ 1136356232, 1139181379, 1142005328, 1144828063, 1147649571, 1150469837,
+ 1153288844, 1156106578, 1158923025, 1161738170, 1164551996, 1167364490,
+ 1170175637, 1172985422, 1175793829, 1178600844, 1181406452, 1184210637,
+ 1187013386, 1189814683, 1192614513, 1195412862, 1198209714, 1201005055,
+ 1203798869, 1206591142, 1209381858, 1212171004, 1214958564, 1217744523,
+ 1220528866, 1223311579, 1226092646, 1228872053, 1231649785, 1234425827,
+ 1237200164, 1239972782, 1242743665, 1245512798, 1248280168, 1251045758,
+ 1253809555, 1256571543, 1259331707, 1262090033, 1264846506, 1267601112,
+ 1270353834, 1273104660, 1275853573, 1278600559, 1281345603, 1284088691,
+ 1286829807, 1289568938, 1292306067, 1295041182, 1297774266, 1300505305,
+ 1303234285, 1305961190, 1308686006, 1311408719, 1314129313, 1316847774,
+ 1319564087, 1322278238, 1324990211, 1327699993, 1330407569, 1333112923,
+ 1335816042, 1338516911, 1341215515, 1343911839, 1346605870, 1349297591,
+ 1351986990, 1354674051, 1357358759, 1360041101, 1362721061, 1365398625,
+ 1368073779, 1370746508, 1373416797, 1376084633, 1378750000, 1381412884,
+ 1384073270, 1386731145, 1389386494, 1392039302, 1394689554, 1397337237,
+ 1399982336, 1402624837, 1405264725, 1407901986, 1410536606, 1413168569,
+ 1415797863, 1418424472, 1421048382, 1423669579, 1426288049, 1428903777,
+ 1431516749, 1434126950, 1436734368, 1439338986, 1441940792, 1444539770,
+ 1447135907, 1449729189, 1452319601, 1454907129, 1457491759, 1460073476,
+ 1462652268, 1465228119, 1467801015, 1470370943, 1472937888, 1475501836,
+ 1478062774, 1480620687, 1483175561, 1485727381, 1488276136, 1490821809,
+ 1493364387, 1495903857, 1498440204, 1500973414, 1503503474, 1506030369,
+ 1508554086, 1511074610, 1513591929, 1516106027, 1518616892, 1521124509,
+ 1523628865, 1526129946, 1528627738, 1531122227, 1533613400, 1536101243,
+ 1538585742, 1541066883, 1543544653, 1546019038, 1548490025, 1550957600,
+ 1553421749, 1555882458, 1558339715, 1560793505, 1563243816, 1565690632,
+ 1568133942, 1570573731, 1573009986, 1575442693, 1577871840, 1580297412,
+ 1582719396, 1585137779, 1587552548, 1589963688, 1592371188, 1594775032,
+ 1597175209, 1599571705, 1601964506, 1604353599, 1606738972, 1609120610,
+ 1611498500, 1613872631, 1616242987, 1618609557, 1620972326, 1623331282,
+ 1625686413, 1628037703, 1630385142, 1632728715, 1635068410, 1637404213,
+ 1639736112, 1642064093, 1644388145, 1646708253, 1649024405, 1651336588,
+ 1653644789, 1655948995, 1658249194, 1660545373, 1662837519, 1665125619,
+ 1667409660, 1669689630, 1671965516, 1674237305, 1676504985, 1678768543,
+ 1681027966, 1683283243, 1685534359, 1687781303, 1690024062, 1692262624,
+ 1694496976, 1696727106, 1698953001, 1701174649, 1703392037, 1705605153,
+ 1707813985, 1710018520, 1712218747, 1714414651, 1716606223, 1718793448,
+ 1720976316, 1723154813, 1725328928, 1727498648, 1729663961, 1731824856,
+ 1733981320, 1736133340, 1738280906, 1740424004, 1742562624, 1744696752,
+ 1746826377, 1748951487, 1751072071, 1753188116, 1755299610, 1757406541,
+ 1759508899, 1761606670, 1763699844, 1765788408, 1767872350, 1769951660,
+ 1772026325, 1774096334, 1776161675, 1778222336, 1780278306, 1782329574,
+ 1784376128, 1786417955, 1788455046, 1790487388, 1792514971, 1794537781,
+ 1796555810, 1798569044, 1800577472, 1802581084, 1804579868, 1806573812,
+ 1808562907, 1810547139, 1812526499, 1814500974, 1816470555, 1818435230,
+ 1820394987, 1822349816, 1824299705, 1826244645, 1828184623, 1830119629,
+ 1832049652, 1833974681, 1835894705, 1837809714, 1839719696, 1841624641,
+ 1843524538, 1845419376, 1847309145, 1849193834, 1851073432, 1852947929,
+ 1854817314, 1856681577, 1858540707, 1860394693, 1862243526, 1864087194,
+ 1865925687, 1867758996, 1869587108, 1871410015, 1873227706, 1875040170,
+ 1876847398, 1878649379, 1880446103, 1882237559, 1884023738, 1885804630,
+ 1887580224, 1889350510, 1891115479, 1892875121, 1894629424, 1896378381,
+ 1898121979, 1899860211, 1901593065, 1903320533, 1905042604, 1906759268,
+ 1908470516, 1910176338, 1911876725, 1913571666, 1915261153, 1916945175,
+ 1918623723, 1920296788, 1921964360, 1923626430, 1925282988, 1926934024,
+ 1928579530, 1930219496, 1931853913, 1933482771, 1935106061, 1936723775,
+ 1938335902, 1939942434, 1941543362, 1943138676, 1944728368, 1946312428,
+ 1947890847, 1949463617, 1951030728, 1952592172, 1954147940, 1955698022,
+ 1957242411, 1958781096, 1960314071, 1961841325, 1963362850, 1964878638,
+ 1966388680, 1967892967, 1969391490, 1970884242, 1972371214, 1973852396,
+ 1975327782, 1976797362, 1978261128, 1979719072, 1981171185, 1982617459,
+ 1984057887, 1985492459, 1986921167, 1988344004, 1989760961, 1991172031,
+ 1992577204, 1993976474, 1995369832, 1996757271, 1998138781, 1999514356,
+ 2000883988, 2002247669, 2003605391, 2004957146, 2006302927, 2007642725,
+ 2008976534, 2010304346, 2011626153, 2012941947, 2014251722, 2015555469,
+ 2016853181, 2018144851, 2019430472, 2020710035, 2021983535, 2023250962,
+ 2024512311, 2025767574, 2027016744, 2028259814, 2029496777, 2030727625,
+ 2031952351, 2033170949, 2034383412, 2035589732, 2036789904, 2037983919,
+ 2039171771, 2040353454, 2041528960, 2042698283, 2043861416, 2045018353,
+ 2046169086, 2047313610, 2048451918, 2049584003, 2050709859, 2051829480,
+ 2052942858, 2054049988, 2055150863, 2056245477, 2057333824, 2058415897,
+ 2059491691, 2060561199, 2061624414, 2062681332, 2063731946, 2064776249,
+ 2065814237, 2066845902, 2067871240, 2068890243, 2069902908, 2070909226,
+ 2071909194, 2072902804, 2073890052, 2074870932, 2075845438, 2076813564,
+ 2077775305, 2078730656, 2079679611, 2080622164, 2081558311, 2082488045,
+ 2083411362, 2084328257, 2085238723, 2086142755, 2087040350, 2087931501,
+ 2088816203, 2089694451, 2090566241, 2091431566, 2092290424, 2093142807,
+ 2093988712, 2094828133, 2095661066, 2096487506, 2097307449, 2098120889,
+ 2098927821, 2099728243, 2100522147, 2101309531, 2102090390, 2102864719,
+ 2103632513, 2104393769, 2105148481, 2105896646, 2106638260, 2107373317,
+ 2108101815, 2108823748, 2109539112, 2110247904, 2110950119, 2111645754,
+ 2112334804, 2113017265, 2113693133, 2114362406, 2115025078, 2115681145,
+ 2116330605, 2116973454, 2117609687, 2118239301, 2118862293, 2119478658,
+ 2120088394, 2120691497, 2121287963, 2121877789, 2122460972, 2123037508,
+ 2123607394, 2124170626, 2124727202, 2125277118, 2125820372, 2126356959,
+ 2126886877, 2127410122, 2127926693, 2128436585, 2128939797, 2129436324,
+ 2129926164, 2130409315, 2130885774, 2131355537, 2131818602, 2132274967,
+ 2132724629, 2133167585, 2133603833, 2134033369, 2134456193, 2134872301,
+ 2135281691, 2135684361, 2136080307, 2136469529, 2136852024, 2137227789,
+ 2137596822, 2137959122, 2138314686, 2138663512, 2139005598, 2139340943,
+ 2139669543, 2139991398, 2140306506, 2140614864, 2140916471, 2141211325,
+ 2141499425, 2141780769, 2142055355, 2142323181, 2142584247, 2142838550,
+ 2143086090, 2143326864, 2143560871, 2143788111, 2144008581, 2144222280,
+ 2144429208, 2144629363, 2144822743, 2145009348, 2145189177, 2145362229,
+ 2145528502, 2145687996, 2145840710, 2145986642, 2146125793, 2146258161,
+ 2146383745, 2146502545, 2146614560, 2146719790, 2146818233, 2146909890,
+ 2146994759, 2147072841, 2147144134, 2147208639, 2147266355, 2147317281,
+ 2147361418, 2147398765, 2147429322, 2147453089, 2147470065, 2147480251,
+ 2147483646, 2147480251, 2147470065, 2147453089, 2147429322, 2147398765,
+ 2147361418, 2147317281, 2147266355, 2147208639, 2147144134, 2147072841,
+ 2146994759, 2146909890, 2146818233, 2146719790, 2146614560, 2146502545,
+ 2146383745, 2146258161, 2146125793, 2145986642, 2145840710, 2145687996,
+ 2145528502, 2145362229, 2145189177, 2145009348, 2144822743, 2144629363,
+ 2144429208, 2144222280, 2144008581, 2143788111, 2143560871, 2143326864,
+ 2143086090, 2142838550, 2142584247, 2142323181, 2142055355, 2141780769,
+ 2141499425, 2141211325, 2140916471, 2140614864, 2140306506, 2139991398,
+ 2139669543, 2139340943, 2139005598, 2138663512, 2138314686, 2137959122,
+ 2137596822, 2137227789, 2136852024, 2136469529, 2136080307, 2135684361,
+ 2135281691, 2134872301, 2134456193, 2134033369, 2133603833, 2133167585,
+ 2132724629, 2132274967, 2131818602, 2131355537, 2130885774, 2130409315,
+ 2129926164, 2129436324, 2128939797, 2128436585, 2127926693, 2127410122,
+ 2126886877, 2126356959, 2125820372, 2125277118, 2124727202, 2124170626,
+ 2123607394, 2123037508, 2122460972, 2121877789, 2121287963, 2120691497,
+ 2120088394, 2119478658, 2118862293, 2118239301, 2117609687, 2116973454,
+ 2116330605, 2115681145, 2115025078, 2114362406, 2113693133, 2113017265,
+ 2112334804, 2111645754, 2110950119, 2110247904, 2109539112, 2108823748,
+ 2108101815, 2107373317, 2106638260, 2105896646, 2105148481, 2104393769,
+ 2103632513, 2102864719, 2102090390, 2101309531, 2100522147, 2099728243,
+ 2098927821, 2098120889, 2097307449, 2096487506, 2095661066, 2094828133,
+ 2093988712, 2093142807, 2092290424, 2091431566, 2090566241, 2089694451,
+ 2088816203, 2087931501, 2087040350, 2086142755, 2085238723, 2084328257,
+ 2083411362, 2082488045, 2081558311, 2080622164, 2079679611, 2078730656,
+ 2077775305, 2076813564, 2075845438, 2074870932, 2073890052, 2072902804,
+ 2071909194, 2070909226, 2069902908, 2068890243, 2067871240, 2066845902,
+ 2065814237, 2064776249, 2063731946, 2062681332, 2061624414, 2060561199,
+ 2059491691, 2058415897, 2057333824, 2056245477, 2055150863, 2054049988,
+ 2052942858, 2051829480, 2050709859, 2049584003, 2048451918, 2047313610,
+ 2046169086, 2045018353, 2043861416, 2042698283, 2041528960, 2040353454,
+ 2039171771, 2037983919, 2036789904, 2035589732, 2034383412, 2033170949,
+ 2031952351, 2030727625, 2029496777, 2028259814, 2027016744, 2025767574,
+ 2024512311, 2023250962, 2021983535, 2020710035, 2019430472, 2018144851,
+ 2016853181, 2015555469, 2014251722, 2012941947, 2011626153, 2010304346,
+ 2008976534, 2007642725, 2006302927, 2004957146, 2003605391, 2002247669,
+ 2000883988, 1999514356, 1998138781, 1996757271, 1995369832, 1993976474,
+ 1992577204, 1991172031, 1989760961, 1988344004, 1986921167, 1985492459,
+ 1984057887, 1982617459, 1981171185, 1979719072, 1978261128, 1976797362,
+ 1975327782, 1973852396, 1972371214, 1970884242, 1969391490, 1967892967,
+ 1966388680, 1964878638, 1963362850, 1961841325, 1960314071, 1958781096,
+ 1957242411, 1955698022, 1954147940, 1952592172, 1951030728, 1949463617,
+ 1947890847, 1946312428, 1944728368, 1943138676, 1941543362, 1939942434,
+ 1938335902, 1936723775, 1935106061, 1933482771, 1931853913, 1930219496,
+ 1928579530, 1926934024, 1925282988, 1923626430, 1921964360, 1920296788,
+ 1918623723, 1916945175, 1915261153, 1913571666, 1911876725, 1910176338,
+ 1908470516, 1906759268, 1905042604, 1903320533, 1901593065, 1899860211,
+ 1898121979, 1896378381, 1894629424, 1892875121, 1891115479, 1889350510,
+ 1887580224, 1885804630, 1884023738, 1882237559, 1880446103, 1878649379,
+ 1876847398, 1875040170, 1873227706, 1871410015, 1869587108, 1867758996,
+ 1865925687, 1864087194, 1862243526, 1860394693, 1858540707, 1856681577,
+ 1854817314, 1852947929, 1851073432, 1849193834, 1847309145, 1845419376,
+ 1843524538, 1841624641, 1839719696, 1837809714, 1835894705, 1833974681,
+ 1832049652, 1830119629, 1828184623, 1826244645, 1824299705, 1822349816,
+ 1820394987, 1818435230, 1816470555, 1814500974, 1812526499, 1810547139,
+ 1808562907, 1806573812, 1804579868, 1802581084, 1800577472, 1798569044,
+ 1796555810, 1794537781, 1792514971, 1790487388, 1788455046, 1786417955,
+ 1784376128, 1782329574, 1780278306, 1778222336, 1776161675, 1774096334,
+ 1772026325, 1769951660, 1767872350, 1765788408, 1763699844, 1761606670,
+ 1759508899, 1757406541, 1755299610, 1753188116, 1751072071, 1748951487,
+ 1746826377, 1744696752, 1742562624, 1740424004, 1738280906, 1736133340,
+ 1733981320, 1731824856, 1729663961, 1727498648, 1725328928, 1723154813,
+ 1720976316, 1718793448, 1716606223, 1714414651, 1712218747, 1710018520,
+ 1707813985, 1705605153, 1703392037, 1701174649, 1698953001, 1696727106,
+ 1694496976, 1692262624, 1690024062, 1687781303, 1685534359, 1683283243,
+ 1681027966, 1678768543, 1676504985, 1674237305, 1671965516, 1669689630,
+ 1667409660, 1665125619, 1662837519, 1660545373, 1658249194, 1655948995,
+ 1653644789, 1651336588, 1649024405, 1646708253, 1644388145, 1642064093,
+ 1639736112, 1637404213, 1635068410, 1632728715, 1630385142, 1628037703,
+ 1625686413, 1623331282, 1620972326, 1618609557, 1616242987, 1613872631,
+ 1611498500, 1609120610, 1606738972, 1604353599, 1601964506, 1599571705,
+ 1597175209, 1594775032, 1592371188, 1589963688, 1587552548, 1585137779,
+ 1582719396, 1580297412, 1577871840, 1575442693, 1573009986, 1570573731,
+ 1568133942, 1565690632, 1563243816, 1560793505, 1558339715, 1555882458,
+ 1553421749, 1550957600, 1548490025, 1546019038, 1543544653, 1541066883,
+ 1538585742, 1536101243, 1533613400, 1531122227, 1528627738, 1526129946,
+ 1523628865, 1521124509, 1518616892, 1516106027, 1513591929, 1511074610,
+ 1508554086, 1506030369, 1503503474, 1500973414, 1498440204, 1495903857,
+ 1493364387, 1490821809, 1488276136, 1485727381, 1483175561, 1480620687,
+ 1478062774, 1475501836, 1472937888, 1470370943, 1467801015, 1465228119,
+ 1462652268, 1460073476, 1457491759, 1454907129, 1452319601, 1449729189,
+ 1447135907, 1444539770, 1441940792, 1439338986, 1436734368, 1434126950,
+ 1431516749, 1428903777, 1426288049, 1423669579, 1421048382, 1418424472,
+ 1415797863, 1413168569, 1410536606, 1407901986, 1405264725, 1402624837,
+ 1399982336, 1397337237, 1394689554, 1392039302, 1389386494, 1386731145,
+ 1384073270, 1381412884, 1378750000, 1376084633, 1373416797, 1370746508,
+ 1368073779, 1365398625, 1362721061, 1360041101, 1357358759, 1354674051,
+ 1351986990, 1349297591, 1346605870, 1343911839, 1341215515, 1338516911,
+ 1335816042, 1333112923, 1330407569, 1327699993, 1324990211, 1322278238,
+ 1319564087, 1316847774, 1314129313, 1311408719, 1308686006, 1305961190,
+ 1303234285, 1300505305, 1297774266, 1295041182, 1292306067, 1289568938,
+ 1286829807, 1284088691, 1281345603, 1278600559, 1275853573, 1273104660,
+ 1270353834, 1267601112, 1264846506, 1262090033, 1259331707, 1256571543,
+ 1253809555, 1251045758, 1248280168, 1245512798, 1242743665, 1239972782,
+ 1237200164, 1234425827, 1231649785, 1228872053, 1226092646, 1223311579,
+ 1220528866, 1217744523, 1214958564, 1212171004, 1209381858, 1206591142,
+ 1203798869, 1201005055, 1198209714, 1195412862, 1192614513, 1189814683,
+ 1187013386, 1184210637, 1181406452, 1178600844, 1175793829, 1172985422,
+ 1170175637, 1167364490, 1164551996, 1161738170, 1158923025, 1156106578,
+ 1153288844, 1150469837, 1147649571, 1144828063, 1142005328, 1139181379,
+ 1136356232, 1133529902, 1130702403, 1127873752, 1125043962, 1122213049,
+ 1119381028, 1116547913, 1113713720, 1110878463, 1108042158, 1105204819,
+ 1102366461, 1099527100, 1096686750, 1093845426, 1091003143, 1088159917,
+ 1085315761, 1082470692, 1079624723, 1076777870, 1073930149, 1071081573,
+ 1068232157, 1065381918, 1062530869, 1059679025, 1056826403, 1053973015,
+ 1051118878, 1048264007, 1045408415, 1042552119, 1039695133, 1036837472,
+ 1033979151, 1031120185, 1028260588, 1025400377, 1022539565, 1019678167,
+ 1016816200, 1013953676, 1011090612, 1008227022, 1005362921, 1002498324,
+ 999633246, 996767702, 993901706, 991035274, 988168420, 985301160,
+ 982433508, 979565478, 976697087, 973828348, 970959277, 968089889,
+ 965220197, 962350218, 959479966, 956609455, 953738701, 950867719,
+ 947996522, 945125127, 942253548, 939381799, 936509896, 933637853,
+ 930765684, 927893406, 925021032, 922148578, 919276057, 916403486,
+ 913530878, 910658248, 907785612, 904912983, 902040376, 899167807,
+ 896295290, 893422839, 890550469, 887678196, 884806033, 881933996,
+ 879062098, 876190355, 873318781, 870447392, 867576201, 864705223,
+ 861834472, 858963965, 856093714, 853223735, 850354042, 847484649,
+ 844615572, 841746825, 838878423, 836010379, 833142709, 830275427,
+ 827408547, 824542084, 821676053, 818810468, 815945344, 813080694,
+ 810216534, 807352877, 804489739, 801627134, 798765076, 795903579,
+ 793042658, 790182328, 787322602, 784463496, 781605023, 778747197,
+ 775890034, 773033547, 770177751, 767322660, 764468288, 761614650,
+ 758761760, 755909631, 753058280, 750207719, 747357962, 744509025,
+ 741660921, 738813664, 735967269, 733121750, 730277121, 727433395,
+ 724590588, 721748713, 718907785, 716067817, 713228824, 710390819,
+ 707553817, 704717831, 701882876, 699048966, 696216115, 693384336,
+ 690553644, 687724053, 684895576, 682068228, 679242022, 676416973,
+ 673593094, 670770399, 667948901, 665128616, 662309556, 659491736,
+ 656675168, 653859868, 651045849, 648233124, 645421708, 642611613,
+ 639802854, 636995445, 634189399, 631384729, 628581450, 625779575,
+ 622979118, 620180092, 617382511, 614586389, 611791738, 608998573,
+ 606206907, 603416754, 600628127, 597841039, 595055505, 592271537,
+ 589489149, 586708354, 583929166, 581151598, 578375663, 575601376,
+ 572828748, 570057794, 567288527, 564520959, 561755105, 558990978,
+ 556228590, 553467955, 550709087, 547951997, 545196700, 542443209,
+ 539691537, 536941696, 534193700, 531447562, 528703295, 525960913,
+ 523220427, 520481851, 517745198, 515010482, 512277714, 509546908,
+ 506818077, 504091233, 501366390, 498643560, 495922756, 493203991,
+ 490487278, 487772629, 485060057, 482349576, 479641196, 476934933,
+ 474230797, 471528802, 468828960, 466131283, 463435786, 460742479,
+ 458051376, 455362488, 452675830, 449991412, 447309248, 444629350,
+ 441951730, 439276401, 436603375, 433932664, 431264281, 428598239,
+ 425934549, 423273223, 420614275, 417957715, 415303557, 412651813,
+ 410002494, 407355613, 404711182, 402069213, 399429719, 396792710,
+ 394158200, 391526200, 388896722, 386269779, 383645382, 381023542,
+ 378404273, 375787586, 373173492, 370562004, 367953133, 365346892,
+ 362743291, 360142343, 357544059, 354948451, 352355531, 349765310,
+ 347177801, 344593014, 342010961, 339431653, 336855103, 334281322,
+ 331710321, 329142112, 326576706, 324014114, 321454348, 318897420,
+ 316343340, 313792120, 311243771, 308698305, 306155732, 303616065,
+ 301079313, 298545489, 296014604, 293486667, 290961692, 288439688,
+ 285920667, 283404640, 280891618, 278381611, 275874631, 273370689,
+ 270869795, 268371960, 265877196, 263385513, 260896921, 258411432,
+ 255929057, 253449805, 250973689, 248500717, 246030902, 243564253,
+ 241100782, 238640498, 236183412, 233729536, 231278878, 228831451,
+ 226387263, 223946326, 221508651, 219074246, 216643123, 214215292,
+ 211790763, 209369546, 206951653, 204537091, 202125873, 199718008,
+ 197313507, 194912378, 192514633, 190120281, 187729333, 185341798,
+ 182957686, 180577007, 178199772, 175825989, 173455670, 171088822,
+ 168725458, 166365585, 164009214, 161656355, 159307016, 156961209,
+ 154618942, 152280225, 149945068, 147613479, 145285470, 142961048,
+ 140640224, 138323006, 136009405, 133699430, 131393090, 129090394,
+ 126791351, 124495971, 122204263, 119916237, 117631900, 115351264,
+ 113074335, 110801124, 108531640, 106265892, 104003888, 101745638,
+ 99491150, 97240434, 94993498, 92750351, 90511002, 88275460, 86043733,
+ 83815830, 81591760, 79371531, 77155153, 74942633, 72733981, 70529204,
+ 68328312, 66131312, 63938214, 61749025, 59563755, 57382410, 55205001,
+ 53031534, 50862019, 48696464, 46534876, 44377264, 42223636, 40074000,
+ 37928364, 35786737, 33649126, 31515539, 29385985, 27260471, 25139005,
+ 23021595, 20908249, 18798974, 16693779, 14592671, 12495658, 10402747,
+ 8313947, 6229264, 4148707, 2072283, 0, -2068135, -4132115, -6191932,
+ -8247579, -10299048, -12346332, -14389424, -16428316, -18463001,
+ -20493472, -22519722, -24541744, -26559529, -28573073, -30582366,
+ -32587403, -34588176, -36584678, -38576903, -40564843, -42548492,
+ -44527842, -46502888, -48473622, -50440037, -52402127, -54359885,
+ -56313304, -58262379, -60207101, -62147465, -64083465, -66015093,
+ -67942343, -69865209, -71783685, -73697763, -75607439, -77512704,
+ -79413554, -81309983, -83201982, -85089548, -86972673, -88851351,
+ -90725577, -92595344, -94460646, -96321478, -98177833, -100029706,
+ -101877091, -103719981, -105558371, -107392255, -109221628, -111046484,
+ -112866817, -114682622, -116493892, -118300623, -120102809, -121900444,
+ -123693522, -125482039, -127265989, -129045367, -130820167, -132590384,
+ -134356012, -136117048, -137873484, -139625316, -141372539, -143115148,
+ -144853138, -146586504, -148315240, -150039342, -151758805, -153473623,
+ -155183793, -156889308, -158590165, -160286359, -161977884, -163664737,
+ -165346912, -167024404, -168697210, -170365325, -172028743, -173687462,
+ -175341475, -176990779, -178635369, -180275241, -181910390, -183540813,
+ -185166504, -186787461, -188403677, -190015151, -191621876, -193223849,
+ -194821067, -196413524, -198001217, -199584143, -201162296, -202735673,
+ -204304271, -205868085, -207427112, -208981348, -210530789, -212075431,
+ -213615271, -215150305, -216680530, -218205941, -219726536, -221242311,
+ -222753263, -224259387, -225760681, -227257141, -228748765, -230235548,
+ -231717487, -233194579, -234666822, -236134211, -237596744, -239054417,
+ -240507228, -241955173, -243398250, -244836456, -246269787, -247698241,
+ -249121814, -250540505, -251954310, -253363226, -254767251, -256166382,
+ -257560617, -258949952, -260334386, -261713915, -263088538, -264458251,
+ -265823052, -267182940, -268537910, -269887962, -271233092, -272573299,
+ -273908580, -275238933, -276564356, -277884846, -279200402, -280511022,
+ -281816703, -283117443, -284413241, -285704095, -286990002, -288270960,
+ -289546969, -290818025, -292084128, -293345276, -294601466, -295852697,
+ -297098968, -298340277, -299576622, -300808002, -302034415, -303255861,
+ -304472336, -305683841, -306890373, -308091931, -309288514, -310480121,
+ -311666751, -312848401, -314025072, -315196762, -316363470, -317525194,
+ -318681934, -319833689, -320980458, -322122239, -323259033, -324390837,
+ -325517652, -326639476, -327756309, -328868150, -329974998, -331076853,
+ -332173713, -333265579, -334352450, -335434325, -336511203, -337583085,
+ -338649970, -339711857, -340768746, -341820637, -342867530, -343909423,
+ -344946318, -345978213, -347005109, -348027005, -349043902, -350055799,
+ -351062696, -352064593, -353061490, -354053388, -355040287, -356022185,
+ -356999085, -357970985, -358937887, -359899790, -360856694, -361808601,
+ -362755510, -363697422, -364634336, -365566255, -366493178, -367415105,
+ -368332038, -369243976, -370150921, -371052873, -371949833, -372841801,
+ -373728778, -374610766, -375487764, -376359774, -377226797, -378088833,
+ -378945883, -379797949, -380645032, -381487132, -382324250, -383156388,
+ -383983547, -384805728, -385622932, -386435161, -387242415, -388044696,
+ -388842006, -389634345, -390421715, -391204118, -391981555, -392754027,
+ -393521536, -394284084, -395041672, -395794302, -396541975, -397284694,
+ -398022459, -398755273, -399483137, -400206053, -400924023, -401637049,
+ -402345133, -403048277, -403746483, -404439752, -405128087, -405811489,
+ -406489962, -407163507, -407832125, -408495821, -409154594, -409808449,
+ -410457387, -411101410, -411740521, -412374722, -413004016, -413628405,
+ -414247891, -414862477, -415472166, -416076959, -416676861, -417271872,
+ -417861997, -418447237, -419027596, -419603076, -420173679, -420739409,
+ -421300269, -421856261, -422407388, -422953654, -423495060, -424031611,
+ -424563309, -425090157, -425612159, -426129317, -426641634, -427149114,
+ -427651760, -428149575, -428642563, -429130726, -429614068, -430092593,
+ -430566303, -431035202, -431499294, -431958582, -432413070, -432862761,
+ -433307658, -433747765, -434183087, -434613626, -435039386, -435460370,
+ -435876584, -436288029, -436694711, -437096633, -437493799, -437886212,
+ -438273877, -438656797, -439034977, -439408420, -439777131, -440141114,
+ -440500372, -440854909, -441204731, -441549841, -441890243, -442225941,
+ -442556940, -442883244, -443204857, -443521784, -443834029, -444141597,
+ -444444491, -444742716, -445036277, -445325179, -445609425, -445889020,
+ -446163969, -446434277, -446699948, -446960987, -447217399, -447469187,
+ -447716358, -447958915, -448196864, -448430210, -448658957, -448883110,
+ -449102674, -449317654, -449528055, -449733882, -449935140, -450131835,
+ -450323970, -450511552, -450694585, -450873075, -451047026, -451216445,
+ -451381335, -451541703, -451697554, -451848893, -451995726, -452138057,
+ -452275892, -452409237, -452538097, -452662478, -452782384, -452897823,
+ -453008798, -453115316, -453217382, -453315003, -453408182, -453496927,
+ -453581244, -453661136, -453736612, -453807675, -453874333, -453936590,
+ -453994454, -454047928, -454097021, -454141737, -454182082, -454218063,
+ -454249685, -454276955, -454299878, -454318461, -454332709, -454342630,
+ -454348228, -454349511, -454346483, -454339153, -454327525, -454311607,
+ -454291404, -454266923, -454238170, -454205151, -454167873, -454126343,
+ -454080567, -454030550, -453976300, -453917824, -453855127, -453788217,
+ -453717100, -453641782, -453562270, -453478572, -453390692, -453298639,
+ -453202419, -453102039, -452997505, -452888824, -452776003, -452659049,
+ -452537969, -452412770, -452283458, -452150041, -452012525, -451870917,
+ -451725225, -451575456, -451421615, -451263712, -451101752, -450935742,
+ -450765691, -450591604, -450413490, -450231355, -450045206, -449855052,
+ -449660898, -449462753, -449260623, -449054517, -448844440, -448630401,
+ -448412408, -448190467, -447964585, -447734771, -447501032, -447263375,
+ -447021808, -446776338, -446526973, -446273721, -446016588, -445755583,
+ -445490714, -445221987, -444949411, -444672993, -444392742, -444108663,
+ -443820767, -443529059, -443233549, -442934244, -442631151, -442324279,
+ -442013635, -441699227, -441381063, -441059152, -440733501, -440404117,
+ -440071010, -439734187, -439393655, -439049424, -438701501, -438349894,
+ -437994611, -437635661, -437273051, -436906790, -436536885, -436163346,
+ -435786180, -435405395, -435021000, -434633003, -434241412, -433846236,
+ -433447483, -433045160, -432639277, -432229842, -431816864, -431400349,
+ -430980308, -430556749, -430129679, -429699107, -429265043, -428827494,
+ -428386469, -427941976, -427494024, -427042622, -426587777, -426129500,
+ -425667798, -425202679, -424734154, -424262229, -423786915, -423308219,
+ -422826151, -422340718, -421851931, -421359797, -420864325, -420365525,
+ -419863404, -419357972, -418849238, -418337210, -417821898, -417303310,
+ -416781455, -416256341, -415727979, -415196377, -414661543, -414123487,
+ -413582218, -413037745, -412490077, -411939222, -411385190, -410827990,
+ -410267631, -409704122, -409137472, -408567691, -407994787, -407418769,
+ -406839647, -406257430, -405672126, -405083746, -404492299, -403897793,
+ -403300238, -402699643, -402096017, -401489370, -400879711, -400267049,
+ -399651393, -399032754, -398411139, -397786559, -397159023, -396528540,
+ -395895120, -395258771, -394619504, -393977328, -393332252, -392684286,
+ -392033439, -391379721, -390723140, -390063708, -389401432, -388736323,
+ -388068390, -387397643, -386724090, -386047743, -385368610, -384686701,
+ -384002025, -383314592, -382624412, -381931494, -381235849, -380537484,
+ -379836411, -379132639, -378426177, -377717036, -377005224, -376290752,
+ -375573630, -374853866, -374131471, -373406455, -372678827, -371948597,
+ -371215775, -370480370, -369742393, -369001853, -368258760, -367513123,
+ -366764953, -366014260, -365261052, -364505341, -363747136, -362986447,
+ -362223283, -361457655, -360689572, -359919045, -359146083, -358370696,
+ -357592894, -356812687, -356030085, -355245099, -354457737, -353668009,
+ -352875927, -352081499, -351284736, -350485648, -349684245, -348880536,
+ -348074532, -347266243, -346455678, -345642849, -344827764, -344010434,
+ -343190869, -342369079, -341545074, -340718864, -339890460, -339059870,
+ -338227107, -337392178, -336555095, -335715868, -334874507, -334031021,
+ -333185422, -332337718, -331487921, -330636040, -329782086, -328926069,
+ -328067998, -327207885, -326345738, -325481569, -324615388, -323747204,
+ -322877028, -322004870, -321130740, -320254649, -319376607, -318496623,
+ -317614708, -316730873, -315845127, -314957481, -314067944, -313176528,
+ -312283242, -311388097, -310491103, -309592269, -308691607, -307789127,
+ -306884838, -305978752, -305070878, -304161226, -303249807, -302336632,
+ -301421709, -300505051, -299586666, -298666565, -297744759, -296821258,
+ -295896071, -294969210, -294040685, -293110505, -292178682, -291245225,
+ -290310145, -289373452, -288435156, -287495267, -286553797, -285610755,
+ -284666152, -283719997, -282772301, -281823075, -280872329, -279920072,
+ -278966316, -278011071, -277054346, -276096153, -275136501, -274175402,
+ -273212864, -272248899, -271283517, -270316728, -269348542, -268378970,
+ -267408022, -266435709, -265462040, -264487026, -263510677, -262533004,
+ -261554017, -260573726, -259592141, -258609273, -257625133, -256639729,
+ -255653074, -254665176, -253676047, -252685696, -251694134, -250701372,
+ -249707419, -248712285, -247715982, -246718519, -245719906, -244720155,
+ -243719275, -242717276, -241714168, -240709963, -239704670, -238698300,
+ -237690863, -236682368, -235672827, -234662250, -233650646, -232638027,
+ -231624401, -230609781, -229594175, -228577594, -227560049, -226541549,
+ -225522105, -224501727, -223480426, -222458210, -221435092, -220411080,
+ -219386185, -218360418, -217333788, -216306306, -215277982, -214248825,
+ -213218847, -212188058, -211156467, -210124085, -209090922, -208056987,
+ -207022293, -205986847, -204950661, -203913745, -202876109, -201837762,
+ -200798716, -199758980, -198718564, -197677479, -196635734, -195593340,
+ -194550306, -193506643, -192462362, -191417471, -190371981, -189325903,
+ -188279245, -187232019, -186184234, -185135900, -184087028, -183037626,
+ -181987707, -180937278, -179886352, -178834936, -177783042, -176730679,
+ -175677858, -174624587, -173570879, -172516741, -171462185, -170407219,
+ -169351855, -168296102, -167239969, -166183468, -165126607, -164069397,
+ -163011847, -161953968, -160895769, -159837260, -158778452, -157719353,
+ -156659973, -155600324, -154540413, -153480252, -152419850, -151359216,
+ -150298361, -149237294, -148176026, -147114565, -146052922, -144991107,
+ -143929128, -142866996, -141804721, -140742312, -139679780, -138617132,
+ -137554380, -136491534, -135428601, -134365594, -133302520, -132239389,
+ -131176212, -130112998, -129049756, -127986497, -126923229, -125859962,
+ -124796706, -123733470, -122670264, -121607097, -120543980, -119480920,
+ -118417929, -117355015, -116292188, -115229457, -114166832, -113104323,
+ -112041938, -110979687, -109917580, -108855625, -107793833, -106732213,
+ -105670774, -104609525, -103548476, -102487635, -101427014, -100366620,
+ -99306463, -98246552, -97186897, -96127507, -95068391, -94009558,
+ -92951018, -91892780, -90834852, -89777245, -88719967, -87663027,
+ -86606436, -85550200, -84494331, -83438837, -82383727, -81329010,
+ -80274696, -79220792, -78167309, -77114256, -76061641, -75009473,
+ -73957762, -72906517, -71855745, -70805457, -69755662, -68706367,
+ -67657583, -66609318, -65561581, -64514380, -63467725, -62421625,
+ -61376088, -60331123, -59286739, -58242945, -57199749, -56157161,
+ -55115188, -54073841, -53033126, -51993054, -50953633, -49914872,
+ -48876778, -47839362, -46802631, -45766594, -44731259, -43696636,
+ -42662733, -41629558, -40597120, -39565428, -38534489, -37504313,
+ -36474908, -35446283, -34418445, -33391403, -32365166, -31339743,
+ -30315140, -29291368, -28268434, -27246346, -26225113, -25204744,
+ -24185246, -23166627, -22148897, -21132063, -20116133, -19101116,
+ -18087020, -17073853, -16061623, -15050338, -14040007, -13030638,
+ -12022238, -11014816, -10008380, -9002937, -7998497, -6995066,
+ -5992654, -4991267, -3990914, -2991603, -1993342, -996138, 0, 995064,
+ 1989048, 2981943, 3973740, 4964433, 5954014, 6942474, 7929806, 8916002,
+ 9901055, 10884957, 11867700, 12849276, 13829678, 14808899, 15786930,
+ 16763764, 17739393, 18713811, 19687008, 20658979, 21629714, 22599208,
+ 23567452, 24534439, 25500161, 26464612, 27427783, 28389667, 29350258,
+ 30309547, 31267527, 32224191, 33179532, 34133543, 35086216, 36037543,
+ 36987519, 37936135, 38883385, 39829261, 40773756, 41716863, 42658575,
+ 43598885, 44537786, 45475270, 46411332, 47345963, 48279157, 49210907,
+ 50141206, 51070047, 51997423, 52923327, 53847753, 54770693, 55692141,
+ 56612090, 57530533, 58447463, 59362875, 60276760, 61189112, 62099925,
+ 63009192, 63916906, 64823060, 65727649, 66630665, 67532102, 68431954,
+ 69330213, 70226874, 71121930, 72015374, 72907200, 73797401, 74685972,
+ 75572906, 76458196, 77341836, 78223820, 79104141, 79982794, 80859771,
+ 81735068, 82608677, 83480592, 84350807, 85219317, 86086114, 86951194,
+ 87814549, 88676173, 89536061, 90394207, 91250605, 92105248, 92958130,
+ 93809247, 94658591, 95506157, 96351939, 97195931, 98038128, 98878523,
+ 99717111, 100553886, 101388842, 102221974, 103053275, 103882741,
+ 104710365, 105536142, 106360066, 107182132, 108002333, 108820666,
+ 109637123, 110451700, 111264391, 112075190, 112884092, 113691092,
+ 114496184, 115299364, 116100624, 116899961, 117697369, 118492842,
+ 119286376, 120077964, 120867603, 121655286, 122441009, 123224766,
+ 124006552, 124786363, 125564192, 126340035, 127113887, 127885743,
+ 128655598, 129423447, 130189284, 130953106, 131714907, 132474681,
+ 133232426, 133988134, 134741803, 135493426, 136242999, 136990518,
+ 137735977, 138479372, 139220698, 139959951, 140697126, 141432218,
+ 142165222, 142896135, 143624951, 144351667, 145076277, 145798777,
+ 146519162, 147237429, 147953572, 148667588, 149379472, 150089219,
+ 150796826, 151502287, 152205600, 152906759, 153605760, 154302599,
+ 154997272, 155689775, 156380103, 157068253, 157754220, 158438000,
+ 159119590, 159798985, 160476181, 161151174, 161823961, 162494537,
+ 163162898, 163829041, 164492961, 165154656, 165814120, 166471351,
+ 167126344, 167779096, 168429603, 169077861, 169723867, 170367617,
+ 171009108, 171648335, 172285295, 172919984, 173552400, 174182539,
+ 174810396, 175435969, 176059254, 176680248, 177298948, 177915349,
+ 178529449, 179141244, 179750731, 180357907, 180962768, 181565312,
+ 182165534, 182763433, 183359004, 183952244, 184543151, 185131722,
+ 185717952, 186301840, 186883382, 187462575, 188039416, 188613903,
+ 189186032, 189755800, 190323205, 190888244, 191450913, 192011211,
+ 192569133, 193124679, 193677844, 194228626, 194777022, 195323030,
+ 195866647, 196407871, 196946698, 197483127, 198017154, 198548777,
+ 199077994, 199604803, 200129200, 200651183, 201170750, 201687899,
+ 202202626, 202714931, 203224810, 203732261, 204237282, 204739871,
+ 205240025, 205737742, 206233021, 206725858, 207216252, 207704201,
+ 208189702, 208672754, 209153355, 209631502, 210107193, 210580427,
+ 211051202, 211519515, 211985366, 212448751, 212909669, 213368118,
+ 213824097, 214277604, 214728636, 215177193, 215623272, 216066872,
+ 216507991, 216946628, 217382781, 217816448, 218247628, 218676319,
+ 219102519, 219526228, 219947444, 220366165, 220782389, 221196117,
+ 221607345, 222016073, 222422300, 222826023, 223227243, 223625956,
+ 224022164, 224415863, 224807053, 225195733, 225581902, 225965558,
+ 226346701, 226725328, 227101440, 227475036, 227846113, 228214672,
+ 228580711, 228944229, 229305226, 229663700, 230019651, 230373078,
+ 230723980, 231072356, 231418205, 231761528, 232102322, 232440587,
+ 232776323, 233109529, 233440204, 233768348, 234093960, 234417040,
+ 234737586, 235055599, 235371078, 235684022, 235994432, 236302305,
+ 236607644, 236910446, 237210711, 237508439, 237803631, 238096285,
+ 238386401, 238673979, 238959018, 239241520, 239521483, 239798906,
+ 240073792, 240346138, 240615944, 240883212, 241147941, 241410130,
+ 241669780, 241926891, 242181463, 242433495, 242682989, 242929944,
+ 243174359, 243416237, 243655576, 243892377, 244126639, 244358364,
+ 244587552, 244814202, 245038316, 245259893, 245478934, 245695439,
+ 245909409, 246120843, 246329744, 246536110, 246739943, 246941242,
+ 247140010, 247336245, 247529949, 247721122, 247909765, 248095879,
+ 248279464, 248460521, 248639050, 248815053, 248988530, 249159481,
+ 249327909, 249493812, 249657194, 249818053, 249976391, 250132210,
+ 250285509, 250436290, 250584555, 250730302, 250873535, 251014254,
+ 251152459, 251288153, 251421336, 251552009, 251680173, 251805830,
+ 251928981, 252049626, 252167768, 252283407, 252396545, 252507183,
+ 252615322, 252720964, 252824110, 252924761, 253022919, 253118585,
+ 253211761, 253302448, 253390647, 253476361, 253559590, 253640336,
+ 253718601, 253794386, 253867693, 253938524, 254006879, 254072762,
+ 254136173, 254197114, 254255587, 254311594, 254365137, 254416216,
+ 254464835, 254510994, 254554697, 254595943, 254634737, 254671079,
+ 254704971, 254736415, 254765414, 254791969, 254816082, 254837756,
+ 254856991, 254873792, 254888159, 254900094, 254909600, 254916680,
+ 254921334, 254923565, 254923376, 254920769, 254915746, 254908309,
+ 254898460, 254886202, 254871538, 254854468, 254834997, 254813126,
+ 254788858, 254762195, 254733139, 254701693, 254667860, 254631642,
+ 254593041, 254552060, 254508702, 254462969, 254414864, 254364389,
+ 254311547, 254256341, 254198773, 254138846, 254076563, 254011926,
+ 253944938, 253875603, 253803922, 253729899, 253653536, 253574837,
+ 253493803, 253410438, 253324746, 253236728, 253146387, 253053727,
+ 252958751, 252861462, 252761862, 252659954, 252555743, 252449230,
+ 252340418, 252229312, 252115914, 252000226, 251882253, 251761997,
+ 251639462, 251514651, 251387567, 251258213, 251126592, 250992708,
+ 250856565, 250718164, 250577511, 250434607, 250289456, 250142063,
+ 249992429, 249840559, 249686456, 249530124, 249371565, 249210784,
+ 249047783, 248882567, 248715138, 248545501, 248373659, 248199616,
+ 248023374, 247844939, 247664312, 247481499, 247296502, 247109326,
+ 246919973, 246728449, 246534756, 246338898, 246140879, 245940702,
+ 245738373, 245533893, 245327268, 245118500, 244907595, 244694555,
+ 244479384, 244262087, 244042668, 243821130, 243597477, 243371713,
+ 243143842, 242913869, 242681797, 242447630, 242211372, 241973028,
+ 241732600, 241490095, 241245515, 240998864, 240750148, 240499369,
+ 240246533, 239991642, 239734703, 239475718, 239214691, 238951628,
+ 238686532, 238419408, 238150260, 237879092, 237605909, 237330714,
+ 237053512, 236774308, 236493106, 236209910, 235924725, 235637555,
+ 235348404, 235057277, 234764179, 234469113, 234172085, 233873098,
+ 233572158, 233269268, 232964434, 232657660, 232348950, 232038309,
+ 231725742, 231411252, 231094846, 230776527, 230456300, 230134170,
+ 229810141, 229484218, 229156406, 228826709, 228495133, 228161681,
+ 227826359, 227489171, 227150122, 226809218, 226466462, 226121859,
+ 225775415, 225427134, 225077022, 224725081, 224371319, 224015739,
+ 223658347, 223299147, 222938145, 222575344, 222210751, 221844370,
+ 221476206, 221106265, 220734550, 220361067, 219985821, 219608818,
+ 219230061, 218849557, 218467310, 218083325, 217697608, 217310163,
+ 216920996, 216530111, 216137514, 215743210, 215347204, 214949502,
+ 214550107, 214149027, 213746265, 213341827, 212935718, 212527944,
+ 212118509, 211707419, 211294680, 210880295, 210464272, 210046614,
+ 209627328, 209206418, 208783890, 208359749, 207934001, 207506650,
+ 207077703, 206647165, 206215040, 205781335, 205346055, 204909204,
+ 204470789, 204030816, 203589288, 203146213, 202701595, 202255439,
+ 201807752, 201358539, 200907805, 200455555, 200001796, 199546533,
+ 199089770, 198631515, 198171772, 197710546, 197247845, 196783672,
+ 196318034, 195850936, 195382383, 194912383, 194440939, 193968057,
+ 193493744, 193018005, 192540845, 192062271, 191582287, 191100900,
+ 190618115, 190133938, 189648374, 189161429, 188673110, 188183421,
+ 187692369, 187199958, 186706196, 186211087, 185714637, 185216853,
+ 184717739, 184217302, 183715547, 183212481, 182708109, 182202436,
+ 181695469, 181187214, 180677675, 180166860, 179654774, 179141423,
+ 178626812, 178110947, 177593835, 177075481, 176555891, 176035072,
+ 175513027, 174989765, 174465290, 173939609, 173412728, 172884651,
+ 172355386, 171824938, 171293314, 170760518, 170226557, 169691438,
+ 169155165, 168617745, 168079185, 167539489, 166998663, 166456715,
+ 165913649, 165369473, 164824191, 164277809, 163730335, 163181774,
+ 162632131, 162081413, 161529626, 160976776, 160422869, 159867911,
+ 159311908, 158754866, 158196792, 157637690, 157077568, 156516431,
+ 155954286, 155391138, 154826994, 154261859, 153695741, 153128644,
+ 152560575, 151991540, 151421545, 150850597, 150278700, 149705863,
+ 149132090, 148557388, 147981762, 147405220, 146827767, 146249409,
+ 145670152, 145090003, 144508968, 143927052, 143344263, 142760605,
+ 142176086, 141590712, 141004487, 140417420, 139829516, 139240781,
+ 138651221, 138060842, 137469652, 136877655, 136284858, 135691267,
+ 135096888, 134501729, 133905793, 133309089, 132711622, 132113399,
+ 131514424, 130914706, 130314249, 129713061, 129111147, 128508513,
+ 127905166, 127301112, 126696358, 126090908, 125484770, 124877950,
+ 124270454, 123662289, 123053459, 122443972, 121833835, 121223052,
+ 120611630, 119999577, 119386896, 118773596, 118159682, 117545161,
+ 116930038, 116314320, 115698013, 115081123, 114463657, 113845620,
+ 113227020, 112607862, 111988152, 111367897, 110747103, 110125775,
+ 109503922, 108881547, 108258659, 107635262, 107011364, 106386970,
+ 105762087, 105136721, 104510878, 103884564, 103257785, 102630549,
+ 102002860, 101374726, 100746152, 100117145, 99487710, 98857855,
+ 98227584, 97596906, 96965824, 96334347, 95702480, 95070229, 94437601,
+ 93804601, 93171237, 92537513, 91903436, 91269014, 90634250, 89999153,
+ 89363727, 88727980, 88091918, 87455545, 86818870, 86181898, 85544634,
+ 84907086, 84269260, 83631161, 82992796, 82354171, 81715292, 81076165,
+ 80436797, 79797193, 79157360, 78517304, 77877031, 77236547, 76595859,
+ 75954971, 75313892, 74672626, 74031180, 73389560, 72747772, 72105822,
+ 71463716, 70821461, 70179062, 69536526, 68893858, 68251066, 67608154,
+ 66965129, 66321997, 65678765, 65035437, 64392021, 63748522, 63104946,
+ 62461300, 61817590, 61173821, 60529999, 59886131, 59242223, 58598281,
+ 57954310, 57310317, 56666308, 56022288, 55378265, 54734243, 54090229,
+ 53446228, 52802248, 52158293, 51514370, 50870484, 50226643, 49582851,
+ 48939114, 48295439, 47651832, 47008298, 46364843, 45721474, 45078196,
+ 44435015, 43791937, 43148968, 42506114, 41863381, 41220774, 40578300,
+ 39935964, 39293773, 38651732, 38009847, 37368123, 36726568, 36085186,
+ 35443983, 34802966, 34162140, 33521511, 32881084, 32240866, 31600862,
+ 30961078, 30321521, 29682194, 29043106, 28404260, 27765664, 27127322,
+ 26489240, 25851425, 25213882, 24576616, 23939634, 23302940, 22666542,
+ 22030444, 21394652, 20759172, 20124010, 19489170, 18854660, 18220484,
+ 17586648, 16953158, 16320019, 15687237, 15054818, 14422767, 13791090,
+ 13159793, 12528880, 11898358, 11268232, 10638508, 10009191, 9380286,
+ 8751801, 8123739, 7496106, 6868908, 6242150, 5615839, 4989979, 4364575,
+ 3739634, 3115160, 2491160, 1867638, 1244601, 622053, 0, -621552,
+ -1242600, -1863136, -2483155, -3102653, -3721624, -4340062, -4957962,
+ -5575319, -6192128, -6808382, -7424078, -8039209, -8653770, -9267756,
+ -9881162, -10493982, -11106212, -11717845, -12328877, -12939303,
+ -13549117, -14158314, -14766889, -15374836, -15982152, -16588829,
+ -17194864, -17800251, -18404985, -19009060, -19612473, -20215217,
+ -20817287, -21418679, -22019388, -22619407, -23218733, -23817360,
+ -24415284, -25012498, -25608999, -26204781, -26799839, -27394168,
+ -27987763, -28580620, -29172733, -29764097, -30354708, -30944560,
+ -31533649, -32121970, -32709518, -33296287, -33882274, -34467473,
+ -35051879, -35635488, -36218295, -36800295, -37381483, -37961855,
+ -38541405, -39120129, -39698022, -40275080, -40851297, -41426669,
+ -42001192, -42574860, -43147669, -43719614, -44290691, -44860894,
+ -45430220, -45998664, -46566220, -47132885, -47698654, -48263523,
+ -48827486, -49390539, -49952678, -50513898, -51074194, -51633563,
+ -52191999, -52749498, -53306056, -53861668, -54416330, -54970037,
+ -55522785, -56074570, -56625387, -57175231, -57724099, -58271985,
+ -58818887, -59364798, -59909716, -60453635, -60996552, -61538462,
+ -62079361, -62619244, -63158107, -63695947, -64232759, -64768538,
+ -65303281, -65836983, -66369640, -66901248, -67431803, -67961300,
+ -68489736, -69017107, -69543408, -70068635, -70592785, -71115853,
+ -71637835, -72158727, -72678525, -73197225, -73714823, -74231316,
+ -74746698, -75260967, -75774119, -76286148, -76797052, -77306827,
+ -77815468, -78322972, -78829336, -79334554, -79838624, -80341541,
+ -80843302, -81343902, -81843339, -82341609, -82838707, -83334629,
+ -83829373, -84322935, -84815310, -85306496, -85796488, -86285282,
+ -86772876, -87259266, -87744447, -88228417, -88711171, -89192707,
+ -89673020, -90152107, -90629965, -91106591, -91581979, -92056128,
+ -92529033, -93000692, -93471100, -93940255, -94408152, -94874789,
+ -95340163, -95804268, -96267104, -96728665, -97188949, -97647953,
+ -98105672, -98562105, -99017247, -99471095, -99923646, -100374898,
+ -100824846, -101273487, -101720818, -102166837, -102611540, -103054923,
+ -103496984, -103937720, -104377127, -104815203, -105251943, -105687346,
+ -106121409, -106554127, -106985499, -107415521, -107844190, -108271504,
+ -108697459, -109122052, -109545280, -109967142, -110387633, -110806750,
+ -111224492, -111640855, -112055836, -112469432, -112881641, -113292460,
+ -113701887, -114109917, -114516549, -114921780, -115325607, -115728028,
+ -116129039, -116528639, -116926824, -117323591, -117718939, -118112865,
+ -118505366, -118896439, -119286082, -119674292, -120061067, -120446405,
+ -120830302, -121212757, -121593766, -121973328, -122351440, -122728099,
+ -123103304, -123477051, -123849339, -124220164, -124589525, -124957420,
+ -125323845, -125688800, -126052280, -126414285, -126774812, -127133858,
+ -127491422, -127847501, -128202093, -128555195, -128906807, -129256925,
+ -129605547, -129952672, -130298297, -130642420, -130985038, -131326151,
+ -131665756, -132003851, -132340434, -132675502, -133009055, -133341089,
+ -133671603, -134000596, -134328064, -134654007, -134978423, -135301308,
+ -135622663, -135942484, -136260770, -136577520, -136892731, -137206401,
+ -137518529, -137829114, -138138153, -138445644, -138751586, -139055978,
+ -139358818, -139660103, -139959832, -140258005, -140554618, -140849671,
+ -141143162, -141435089, -141725451, -142014247, -142301474, -142587132,
+ -142871218, -143153732, -143434671, -143714036, -143991823, -144268032,
+ -144542661, -144815709, -145087174, -145357056, -145625353, -145892063,
+ -146157185, -146420719, -146682662, -146943014, -147201773, -147458938,
+ -147714508, -147968482, -148220858, -148471635, -148720813, -148968390,
+ -149214365, -149458736, -149701504, -149942666, -150182222, -150420171,
+ -150656511, -150891242, -151124363, -151355873, -151585770, -151814054,
+ -152040724, -152265780, -152489219, -152711042, -152931247, -153149833,
+ -153366801, -153582148, -153795875, -154007980, -154218462, -154427322,
+ -154634557, -154840169, -155044154, -155246514, -155447248, -155646353,
+ -155843832, -156039681, -156233902, -156426492, -156617453, -156806782,
+ -156994480, -157180547, -157364980, -157547781, -157728948, -157908482,
+ -158086381, -158262646, -158437275, -158610268, -158781626, -158951347,
+ -159119431, -159285879, -159450689, -159613861, -159775395, -159935291,
+ -160093549, -160250167, -160405147, -160558487, -160710188, -160860249,
+ -161008670, -161155452, -161300593, -161444094, -161585954, -161726174,
+ -161864754, -162001693, -162136991, -162270648, -162402665, -162533041,
+ -162661776, -162788871, -162914324, -163038138, -163160310, -163280842,
+ -163399734, -163516986, -163632597, -163746568, -163858900, -163969592,
+ -164078644, -164186058, -164291832, -164395967, -164498464, -164599322,
+ -164698543, -164796126, -164892071, -164986379, -165079051, -165170086,
+ -165259485, -165347249, -165433377, -165517871, -165600730, -165681955,
+ -165761547, -165839505, -165915831, -165990526, -166063588, -166135020,
+ -166204821, -166272992, -166339534, -166404448, -166467733, -166529391,
+ -166589422, -166647826, -166704606, -166759760, -166813290, -166865197,
+ -166915481, -166964143, -167011184, -167056604, -167100405, -167142587,
+ -167183150, -167222097, -167259427, -167295141, -167329241, -167361727,
+ -167392600, -167421861, -167449511, -167475550, -167499981, -167522803,
+ -167544018, -167563627, -167581630, -167598029, -167612825, -167626019,
+ -167637612, -167647605, -167655999, -167662795, -167667994, -167671598,
+ -167673608, -167674024, -167672848, -167670081, -167665725, -167659780,
+ -167652248, -167643130, -167632428, -167620142, -167606274, -167590824,
+ -167573796, -167555189, -167535006, -167513247, -167489913, -167465007,
+ -167438530, -167410483, -167380867, -167349684, -167316936, -167282623,
+ -167246748, -167209312, -167170316, -167129762, -167087651, -167043985,
+ -166998765, -166951994, -166903672, -166853801, -166802384, -166749420,
+ -166694913, -166638864, -166581274, -166522145, -166461479, -166399277,
+ -166335542, -166270274, -166203476, -166135150, -166065297, -165993918,
+ -165921017, -165846594, -165770652, -165693191, -165614215, -165533725,
+ -165451722, -165368210, -165283188, -165196661, -165108628, -165019093,
+ -164928058, -164835523, -164741492, -164645966, -164548947, -164450437,
+ -164350439, -164248954, -164145984, -164041531, -163935598, -163828187,
+ -163719299, -163608936, -163497102, -163383797, -163269025, -163152787,
+ -163035085, -162915922, -162795300, -162673220, -162549686, -162424700,
+ -162298263, -162170378, -162041047, -161910272, -161778057, -161644402,
+ -161509311, -161372785, -161234827, -161095440, -160954626, -160812386,
+ -160668724, -160523642, -160377142, -160229227, -160079899, -159929160,
+ -159777013, -159623461, -159468506, -159312150, -159154396, -158995246,
+ -158834703, -158672770, -158509448, -158344741, -158178651, -158011181,
+ -157842333, -157672110, -157500514, -157327548, -157153215, -156977517,
+ -156800457, -156622037, -156442261, -156261131, -156078649, -155894819,
+ -155709643, -155523123, -155335263, -155146065, -154955533, -154763668,
+ -154570473, -154375952, -154180106, -153982940, -153784455, -153584655,
+ -153383543, -153181120, -152977391, -152772357, -152566023, -152358390,
+ -152149461, -151939240, -151727730, -151514933, -151300852, -151085490,
+ -150868850, -150650936, -150431750, -150211295, -149989574, -149766590,
+ -149542346, -149316845, -149090090, -148862085, -148632832, -148402334,
+ -148170594, -147937616, -147703403, -147467957, -147231282, -146993381,
+ -146754256, -146513912, -146272351, -146029577, -145785592, -145540400,
+ -145294004, -145046407, -144797612, -144547623, -144296443, -144044074,
+ -143790521, -143535786, -143279873, -143022784, -142764524, -142505096,
+ -142244502, -141982746, -141719832, -141455763, -141190541, -140924171,
+ -140656655, -140387997, -140118201, -139847269, -139575206, -139302014,
+ -139027696, -138752257, -138475700, -138198028, -137919244, -137639352,
+ -137358355, -137076257, -136793061, -136508771, -136223390, -135936921,
+ -135649369, -135360736, -135071026, -134780243, -134488390, -134195470,
+ -133901488, -133606446, -133310348, -133013198, -132714999, -132415755,
+ -132115469, -131814145, -131511787, -131208398, -130903982, -130598542,
+ -130292082, -129984605, -129676116, -129366617, -129056113, -128744607,
+ -128432103, -128118604, -127804114, -127488637, -127172176, -126854735,
+ -126536318, -126216929, -125896571, -125575247, -125252963, -124929720,
+ -124605524, -124280377, -123954284, -123627248, -123299273, -122970363,
+ -122640522, -122309752, -121978059, -121645446, -121311917, -120977475,
+ -120642124, -120305868, -119968711, -119630657, -119291709, -118951872,
+ -118611149, -118269544, -117927061, -117583703, -117239475, -116894381,
+ -116548424, -116201608, -115853937, -115505415, -115156046, -114805833,
+ -114454781, -114102894, -113750175, -113396629, -113042259, -112687069,
+ -112331063, -111974245, -111616619, -111258189, -110898959, -110538933,
+ -110178114, -109816508, -109454117, -109090946, -108726998, -108362278,
+ -107996790, -107630537, -107263524, -106895754, -106527233, -106157962,
+ -105787948, -105417193, -105045701, -104673477, -104300525, -103926849,
+ -103552453, -103177340, -102801515, -102424982, -102047745, -101669808,
+ -101291175, -100911850, -100531837, -100151141, -99769764, -99387712,
+ -99004989, -98621598, -98237544, -97852830, -97467461, -97081441,
+ -96694774, -96307465, -95919516, -95530933, -95141719, -94751878,
+ -94361415, -93970334, -93578639, -93186334, -92793423, -92399910,
+ -92005800, -91611096, -91215802, -90819924, -90423464, -90026428,
+ -89628819, -89230641, -88831899, -88432596, -88032737, -87632326,
+ -87231368, -86829865, -86427824, -86025246, -85622138, -85218503,
+ -84814345, -84409668, -84004477, -83598775, -83192568, -82785858,
+ -82378651, -81970950, -81562760, -81154085, -80744928, -80335295,
+ -79925189, -79514615, -79103577, -78692079, -78280125, -77867719,
+ -77454866, -77041570, -76627835, -76213665, -75799064, -75384037,
+ -74968588, -74552721, -74136441, -73719750, -73302655, -72885158,
+ -72467265, -72048979, -71630304, -71211245, -70791807, -70371992,
+ -69951806, -69531253, -69110336, -68689061, -68267431, -67845450,
+ -67423123, -67000455, -66577448, -66154108, -65730439, -65306444,
+ -64882128, -64457496, -64032552, -63607299, -63181742, -62755885,
+ -62329733, -61903290, -61476559, -61049546, -60622254, -60194687,
+ -59766850, -59338747, -58910383, -58481761, -58052885, -57623760,
+ -57194391, -56764781, -56334934, -55904855, -55474548, -55044017,
+ -54613267, -54182301, -53751124, -53319740, -52888153, -52456368,
+ -52024388, -51592218, -51159862, -50727325, -50294610, -49861722,
+ -49428664, -48995442, -48562059, -48128519, -47694827, -47260987,
+ -46827003, -46392879, -45958619, -45524228, -45089710, -44655069,
+ -44220309, -43785435, -43350450, -42915358, -42480165, -42044874,
+ -41609488, -41174014, -40738453, -40302812, -39867093, -39431301,
+ -38995441, -38559516, -38123530, -37687488, -37251394, -36815252,
+ -36379066, -35942840, -35506579, -35070286, -34633966, -34197622,
+ -33761259, -33324882, -32888493, -32452098, -32015701, -31579304,
+ -31142914, -30706533, -30270166, -29833817, -29397490, -28961189,
+ -28524918, -28088682, -27652484, -27216329, -26780220, -26344162,
+ -25908158, -25472213, -25036332, -24600517, -24164773, -23729104,
+ -23293515, -22858008, -22422589, -21987261, -21552028, -21116895,
+ -20681864, -20246942, -19812131, -19377435, -18942858, -18508405,
+ -18074080, -17639886, -17205828, -16771909, -16338133, -15904505,
+ -15471029, -15037708, -14604546, -14171548, -13738717, -13306057,
+ -12873573, -12441267, -12009145, -11577211, -11145467, -10713918,
+ -10282568, -9851421, -9420481, -8989752, -8559237, -8128941, -7698867,
+ -7269020, -6839402, -6410019, -5980874, -5551971, -5123314, -4694906,
+ -4266752, -3838855, -3411219, -2983849, -2556747, -2129918, -1703366,
+ -1277094, -851107, -425407, 0, 425111, 849924, 1274433, 1698635,
+ 2122526, 2546102, 2969360, 3392296, 3814906, 4237186, 4659132, 5080742,
+ 5502010, 5922934, 6343509, 6763732, 7183599, 7603106, 8022251, 8441028,
+ 8859434, 9277466, 9695120, 10112392, 10529279, 10945777, 11361882,
+ 11777590, 12192899, 12607803, 13022301, 13436387, 13850059, 14263313,
+ 14676145, 15088551, 15500529, 15912074, 16323182, 16733851, 17144077,
+ 17553856, 17963184, 18372058, 18780475, 19188431, 19595922, 20002945,
+ 20409497, 20815573, 21221170, 21626286, 22030916, 22435056, 22838705,
+ 23241857, 23644509, 24046659, 24448302, 24849435, 25250055, 25650158,
+ 26049742, 26448801, 26847334, 27245336, 27642805, 28039736, 28436127,
+ 28831974, 29227274, 29622024, 30016219, 30409857, 30802935, 31195449,
+ 31587395, 31978771, 32369573, 32759798, 33149443, 33538504, 33926978,
+ 34314862, 34702152, 35088846, 35474940, 35860430, 36245314, 36629589,
+ 37013250, 37396296, 37778723, 38160527, 38541705, 38922255, 39302173,
+ 39681456, 40060101, 40438104, 40815463, 41192175, 41568235, 41943642,
+ 42318392, 42692483, 43065910, 43438671, 43810763, 44182183, 44552927,
+ 44922993, 45292378, 45661079, 46029092, 46396415, 46763044, 47128978,
+ 47494212, 47858743, 48222570, 48585688, 48948095, 49309789, 49670765,
+ 50031021, 50390555, 50749363, 51107442, 51464790, 51821404, 52177280,
+ 52532417, 52886810, 53240458, 53593357, 53945505, 54296899, 54647536,
+ 54997413, 55346527, 55694877, 56042458, 56389268, 56735305, 57080565,
+ 57425047, 57768746, 58111661, 58453789, 58795128, 59135673, 59475424,
+ 59814376, 60152528, 60489877, 60826420, 61162155, 61497079, 61831189,
+ 62164482, 62496957, 62828611, 63159440, 63489443, 63818617, 64146959,
+ 64474467, 64801139, 65126971, 65451961, 65776108, 66099407, 66421858,
+ 66743457, 67064201, 67384090, 67703119, 68021287, 68338591, 68655029,
+ 68970599, 69285297, 69599122, 69912072, 70224143, 70535334, 70845642,
+ 71155065, 71463601, 71771246, 72078000, 72383860, 72688823, 72992887,
+ 73296051, 73598310, 73899665, 74200111, 74499647, 74798271, 75095981,
+ 75392774, 75688649, 75983602, 76277632, 76570737, 76862915, 77154163,
+ 77444479, 77733862, 78022308, 78309817, 78596386, 78882013, 79166695,
+ 79450432, 79733220, 80015058, 80295943, 80575875, 80854850, 81132867,
+ 81409924, 81686018, 81961148, 82235313, 82508509, 82780736, 83051990,
+ 83322271, 83591576, 83859904, 84127252, 84393620, 84659004, 84923403,
+ 85186815, 85449239, 85710673, 85971114, 86230561, 86489013, 86746467,
+ 87002922, 87258376, 87512827, 87766274, 88018715, 88270147, 88520571,
+ 88769983, 89018382, 89265767, 89512135, 89757486, 90001817, 90245127,
+ 90487414, 90728677, 90968914, 91208124, 91446305, 91683455, 91919574,
+ 92154658, 92388708, 92621720, 92853695, 93084630, 93314524, 93543376,
+ 93771183, 93997945, 94223660, 94448327, 94671943, 94894509, 95116023,
+ 95336482, 95555886, 95774234, 95991523, 96207753, 96422923, 96637031,
+ 96850075, 97062055, 97272969, 97482816, 97691594, 97899303, 98105941,
+ 98311507, 98516000, 98719418, 98921761, 99123026, 99323214, 99522323,
+ 99720351, 99917297, 100113161, 100307941, 100501637, 100694246,
+ 100885769, 101076203, 101265548, 101453803, 101640967, 101827038,
+ 102012016, 102195900, 102378688, 102560380, 102740975, 102920472,
+ 103098869, 103276166, 103452363, 103627457, 103801448, 103974336,
+ 104146118, 104316796, 104486366, 104654830, 104822185, 104988432,
+ 105153568, 105317595, 105480509, 105642312, 105803001, 105962577,
+ 106121038, 106278384, 106434614, 106589728, 106743724, 106896602,
+ 107048361, 107199000, 107348520, 107496919, 107644196, 107790351,
+ 107935383, 108079293, 108222078, 108363739, 108504274, 108643684,
+ 108781968, 108919125, 109055155, 109190056, 109323830, 109456475,
+ 109587990, 109718376, 109847631, 109975755, 110102748, 110228610,
+ 110353340, 110476937, 110599401, 110720732, 110840929, 110959992,
+ 111077921, 111194715, 111310374, 111424898, 111538285, 111650537,
+ 111761652, 111871631, 111980473, 112088178, 112194745, 112300175,
+ 112404467, 112507620, 112609635, 112710512, 112810250, 112908850,
+ 113006310, 113102631, 113197812, 113291854, 113384757, 113476520,
+ 113567143, 113656626, 113744969, 113832172, 113918235, 114003158,
+ 114086940, 114169582, 114251085, 114331446, 114410668, 114488749,
+ 114565691, 114641492, 114716153, 114789674, 114862054, 114933296,
+ 115003397, 115072358, 115140180, 115206863, 115272406, 115336810,
+ 115400075, 115462201, 115523188, 115583037, 115641748, 115699321,
+ 115755755, 115811052, 115865212, 115918234, 115970120, 116020869,
+ 116070482, 116118958, 116166299, 116212505, 116257575, 116301511,
+ 116344312, 116385979, 116426513, 116465913, 116504180, 116541315,
+ 116577318, 116612189, 116645928, 116678537, 116710015, 116740364,
+ 116769583, 116797673, 116824635, 116850468, 116875174, 116898753,
+ 116921206, 116942533, 116962735, 116981811, 116999764, 117016593,
+ 117032299, 117046883, 117060344, 117072685, 117083905, 117094005,
+ 117102986, 117110849, 117117593, 117123220, 117127731, 117131126,
+ 117133406, 117134571, 117134623, 117133562, 117131389, 117128104,
+ 117123709, 117118204, 117111590, 117103867, 117095038, 117085101,
+ 117074059, 117061912, 117048661, 117034307, 117018851, 117002293,
+ 116984634, 116965876, 116946019, 116925065, 116903013, 116879865,
+ 116855623, 116830287, 116803857, 116776335, 116747723, 116718020,
+ 116687228, 116655348, 116622381, 116588328, 116553191, 116516969,
+ 116479664, 116441278, 116401811, 116361265, 116319640, 116276937,
+ 116233159, 116188305, 116142378, 116095377, 116047306, 115998163,
+ 115947951, 115896672, 115844325, 115790912, 115736436, 115680895,
+ 115624293, 115566630, 115507908, 115448127, 115387290, 115325396,
+ 115262448, 115198447, 115133395, 115067291, 115000139, 114931939,
+ 114862692, 114792400, 114721065, 114648687, 114575267, 114500809,
+ 114425312, 114348778, 114271209, 114192606, 114112970, 114032303,
+ 113950606, 113867882, 113784130, 113699353, 113613553, 113526730,
+ 113438886, 113350023, 113260143, 113169246, 113077334, 112984409,
+ 112890473, 112795527, 112699572, 112602610, 112504643, 112405672,
+ 112305699, 112204726, 112102754, 111999784, 111895819, 111790860,
+ 111684909, 111577967, 111470036, 111361118, 111251215, 111140327,
+ 111028457, 110915607, 110801778, 110686972, 110571190, 110454435,
+ 110336709, 110218012, 110098347, 109977715, 109856119, 109733559,
+ 109610039, 109485559, 109360122, 109233729, 109106383, 108978084,
+ 108848835, 108718638, 108587494, 108455406, 108322375, 108188403,
+ 108053493, 107917645, 107780862, 107643146, 107504499, 107364923,
+ 107224419, 107082989, 106940636, 106797362, 106653168, 106508056,
+ 106362029, 106215088, 106067235, 105918473, 105768803, 105618228,
+ 105466749, 105314368, 105161088, 105006911, 104851838, 104695871,
+ 104539014, 104381267, 104222633, 104063115, 103902713, 103741430,
+ 103579269, 103416231, 103252319, 103087534, 102921880, 102755357,
+ 102587968, 102419715, 102250601, 102080628, 101909797, 101738111,
+ 101565573, 101392183, 101217946, 101042862, 100866934, 100690164,
+ 100512555, 100334108, 100154826, 99974712, 99793767, 99611993,
+ 99429394, 99245971, 99061726, 98876662, 98690781, 98504086, 98316578,
+ 98128261, 97939135, 97749205, 97558471, 97366937, 97174604, 96981476,
+ 96787553, 96592840, 96397338, 96201049, 96003976, 95806121, 95607487,
+ 95408076, 95207890, 95006932, 94805205, 94602710, 94399450, 94195428,
+ 93990646, 93785106, 93578811, 93371763, 93163965, 92955420, 92746129,
+ 92536095, 92325321, 92113809, 91901562, 91688581, 91474871, 91260432,
+ 91045268, 90829382, 90612775, 90395450, 90177410, 89958657, 89739194,
+ 89519024, 89298148, 89076570, 88854292, 88631317, 88407646, 88183284,
+ 87958231, 87732492, 87506068, 87278963, 87051178, 86822716, 86593581,
+ 86363774, 86133298, 85902156, 85670350, 85437883, 85204758, 84970978,
+ 84736544, 84501460, 84265728, 84029351, 83792332, 83554673, 83316377,
+ 83077447, 82837885, 82597694, 82356877, 82115436, 81873374, 81630694,
+ 81387398, 81143490, 80898972, 80653846, 80408115, 80161783, 79914851,
+ 79667323, 79419202, 79170489, 78921188, 78671301, 78420832, 78169783,
+ 77918157, 77665956, 77413183, 77159842, 76905935, 76651464, 76396432,
+ 76140843, 75884699, 75628002, 75370756, 75112964, 74854628, 74595750,
+ 74336335, 74076384, 73815901, 73554887, 73293347, 73031283, 72768697,
+ 72505593, 72241974, 71977841, 71713199, 71448050, 71182396, 70916241,
+ 70649587, 70382438, 70114796, 69846664, 69578045, 69308941, 69039356,
+ 68769293, 68498754, 68227742, 67956260, 67684312, 67411899, 67139025,
+ 66865693, 66591905, 66317664, 66042974, 65767838, 65492257, 65216235,
+ 64939776, 64662881, 64385554, 64107797, 63829614, 63551008, 63271981,
+ 62992537, 62712677, 62432406, 62151726, 61870640, 61589152, 61307262,
+ 61024976, 60742296, 60459224, 60175764, 59891919, 59607691, 59323083,
+ 59038099, 58752741, 58467013, 58180917, 57894456, 57607633, 57320452,
+ 57032915, 56745024, 56456784, 56168196, 55879265, 55589992, 55300382,
+ 55010436, 54720158, 54429550, 54138617, 53847360, 53555783, 53263888,
+ 52971680, 52679159, 52386331, 52093196, 51799760, 51506024, 51211991,
+ 50917665, 50623048, 50328144, 50032956, 49737485, 49441736, 49145712,
+ 48849414, 48552848, 48256014, 47958917, 47661559, 47363943, 47066073,
+ 46767951, 46469580, 46170964, 45872105, 45573006, 45273670, 44974101,
+ 44674301, 44374273, 44074020, 43773545, 43472852, 43171943, 42870821,
+ 42569489, 42267951, 41966208, 41664265, 41362124, 41059788, 40757260,
+ 40454543, 40151641, 39848555, 39545290, 39241848, 38938232, 38634445,
+ 38330490, 38026370, 37722088, 37417647, 37113051, 36808301, 36503401,
+ 36198355, 35893164, 35587833, 35282363, 34976758, 34671021, 34365156,
+ 34059164, 33753049, 33446814, 33140461, 32833995, 32527417, 32220732,
+ 31913941, 31607047, 31300055, 30992966, 30685784, 30378511, 30071152,
+ 29763707, 29456182, 29148578, 28840898, 28533146, 28225324, 27917436,
+ 27609484, 27301471, 26993401, 26685276, 26377099, 26068873, 25760601,
+ 25452287, 25143932, 24835541, 24527115, 24218658, 23910173, 23601663,
+ 23293130, 22984578, 22676010, 22367428, 22058835, 21750235, 21441630,
+ 21133024, 20824418, 20515817, 20207223, 19898638, 19590067, 19281511,
+ 18972974, 18664458, 18355967, 18047504, 17739070, 17430670, 17122306,
+ 16813981, 16505698, 16197460, 15889270, 15581130, 15273043, 14965013,
+ 14657043, 14349134, 14041291, 13733515, 13425810, 13118179, 12810624,
+ 12503149, 12195755, 11888447, 11581227, 11274098, 10967063, 10660124,
+ 10353284, 10046547, 9739914, 9433390, 9126976, 8820676, 8514492,
+ 8208427, 7902485, 7596667, 7290977, 6985418, 6679992, 6374702, 6069551,
+ 5764542, 5459677, 5154959, 4850392, 4545978, 4241719, 3937619, 3633680,
+ 3329905, 3026297, 2722858, 2419592, 2116501, 1813588, 1510856, 1208307,
+ 905944, 603770, 301788, 0, -301590, -602981, -904170, -1205153,
+ -1505928, -1806493, -2106844, -2406979, -2706895, -3006589, -3306059,
+ -3605303, -3904316, -4203097, -4501644, -4799952, -5098020, -5395846,
+ -5693425, -5990756, -6287836, -6584663, -6881233, -7177544, -7473593,
+ -7769378, -8064897, -8360146, -8655122, -8949824, -9244249, -9538393,
+ -9832255, -10125832, -10419121, -10712119, -11004825, -11297235,
+ -11589347, -11881158, -12172666, -12463868, -12754761, -13045344,
+ -13335613, -13625566, -13915200, -14204513, -14493502, -14782165,
+ -15070500, -15358503, -15646172, -15933505, -16220499, -16507152,
+ -16793461, -17079423, -17365037, -17650300, -17935209, -18219761,
+ -18503955, -18787788, -19071257, -19354360, -19637094, -19919457,
+ -20201447, -20483062, -20764298, -21045153, -21325625, -21605712,
+ -21885410, -22164719, -22443634, -22722155, -23000278, -23278001,
+ -23555322, -23832238, -24108748, -24384848, -24660536, -24935810,
+ -25210668, -25485107, -25759125, -26032720, -26305889, -26578630,
+ -26850941, -27122819, -27394262, -27665268, -27935834, -28205959,
+ -28475639, -28744873, -29013659, -29281994, -29549875, -29817301,
+ -30084270, -30350779, -30616826, -30882408, -31147524, -31412171,
+ -31676348, -31940051, -32203279, -32466029, -32728299, -32990088,
+ -33251393, -33512212, -33772542, -34032381, -34291728, -34550580,
+ -34808936, -35066792, -35324147, -35580998, -35837345, -36093183,
+ -36348512, -36603330, -36857633, -37111421, -37364691, -37617440,
+ -37869668, -38121372, -38372549, -38623198, -38873317, -39122903,
+ -39371956, -39620472, -39868449, -40115886, -40362781, -40609132,
+ -40854936, -41100192, -41344898, -41589051, -41832650, -42075693,
+ -42318178, -42560103, -42801467, -43042266, -43282499, -43522165,
+ -43761261, -43999785, -44237736, -44475112, -44711911, -44948130,
+ -45183769, -45418825, -45653296, -45887181, -46120477, -46353184,
+ -46585298, -46816819, -47047743, -47278071, -47507799, -47736927,
+ -47965451, -48193371, -48420685, -48647390, -48873486, -49098970,
+ -49323841, -49548096, -49771735, -49994756, -50217156, -50438934,
+ -50660088, -50880617, -51100519, -51319793, -51538435, -51756446,
+ -51973823, -52190565, -52406670, -52622136, -52836962, -53051146,
+ -53264686, -53477581, -53689829, -53901430, -54112380, -54322678,
+ -54532324, -54741315, -54949650, -55157327, -55364344, -55570701,
+ -55776395, -55981426, -56185791, -56389489, -56592519, -56794879,
+ -56996567, -57197583, -57397924, -57597590, -57796578, -57994887,
+ -58192516, -58389464, -58585729, -58781309, -58976203, -59170410,
+ -59363928, -59556757, -59748893, -59940337, -60131087, -60321142,
+ -60510499, -60699158, -60887118, -61074376, -61260932, -61446785,
+ -61631933, -61816375, -62000109, -62183135, -62365450, -62547055,
+ -62727946, -62908124, -63087587, -63266333, -63444362, -63621672,
+ -63798263, -63974132, -64149278, -64323701, -64497399, -64670372,
+ -64842617, -65014134, -65184921, -65354978, -65524303, -65692895,
+ -65860753, -66027876, -66194263, -66359913, -66524824, -66688995,
+ -66852426, -67015116, -67177062, -67338265, -67498723, -67658435,
+ -67817400, -67975617, -68133086, -68289804, -68445771, -68600986,
+ -68755449, -68909157, -69062111, -69214309, -69365749, -69516432,
+ -69666357, -69815522, -69963926, -70111568, -70258449, -70404566,
+ -70549918, -70694506, -70838328, -70981383, -71123670, -71265189,
+ -71405938, -71545917, -71685125, -71823562, -71961225, -72098115,
+ -72234231, -72369571, -72504136, -72637924, -72770935, -72903167,
+ -73034621, -73165295, -73295188, -73424300, -73552631, -73680179,
+ -73806943, -73932924, -74058120, -74182530, -74306155, -74428993,
+ -74551043, -74672306, -74792780, -74912465, -75031359, -75149464,
+ -75266777, -75383298, -75499027, -75613963, -75728106, -75841455,
+ -75954009, -76065767, -76176730, -76286897, -76396267, -76504840,
+ -76612615, -76719591, -76825769, -76931148, -77035726, -77139504,
+ -77242482, -77344658, -77446033, -77546605, -77646375, -77745342,
+ -77843506, -77940866, -78037421, -78133172, -78228118, -78322258,
+ -78415593, -78508122, -78599844, -78690759, -78780867, -78870168,
+ -78958661, -79046345, -79133222, -79219289, -79304547, -79388996,
+ -79472636, -79555465, -79637484, -79718693, -79799091, -79878679,
+ -79957455, -80035420, -80112573, -80188914, -80264444, -80339161,
+ -80413066, -80486158, -80558438, -80629905, -80700558, -80770399,
+ -80839426, -80907640, -80975040, -81041627, -81107400, -81172358,
+ -81236503, -81299834, -81362351, -81424054, -81484942, -81545016,
+ -81604275, -81662721, -81720351, -81777168, -81833170, -81888357,
+ -81942730, -81996289, -82049033, -82100962, -82152078, -82202379,
+ -82251865, -82300538, -82348396, -82395440, -82441670, -82487087,
+ -82531689, -82575478, -82618453, -82660614, -82701962, -82742497,
+ -82782219, -82821128, -82859224, -82896507, -82932978, -82968637,
+ -83003483, -83037518, -83070741, -83103152, -83134752, -83165541,
+ -83195519, -83224687, -83253044, -83280591, -83307328, -83333256,
+ -83358374, -83382684, -83406184, -83428877, -83450761, -83471837,
+ -83492106, -83511568, -83530223, -83548071, -83565114, -83581350,
+ -83596782, -83611408, -83625230, -83638247, -83650460, -83661870,
+ -83672477, -83682282, -83691284, -83699484, -83706884, -83713482,
+ -83719280, -83724277, -83728476, -83731875, -83734476, -83736279,
+ -83737284, -83737492, -83736904, -83735520, -83733340, -83730365,
+ -83726596, -83722033, -83716677, -83710528, -83703586, -83695854,
+ -83687330, -83678016, -83667912, -83657018, -83645337, -83632867,
+ -83619610, -83605566, -83590736, -83575121, -83558721, -83541536,
+ -83523569, -83504818, -83485286, -83464972, -83443878, -83422003,
+ -83399349, -83375917, -83351707, -83326719, -83300956, -83274417,
+ -83247103, -83219014, -83190153, -83160519, -83130113, -83098936,
+ -83066989, -83034273, -83000788, -82966535, -82931515, -82895729,
+ -82859178, -82821862, -82783783, -82744941, -82705337, -82664972,
+ -82623847, -82581963, -82539320, -82495920, -82451763, -82406851,
+ -82361184, -82314763, -82267589, -82219663, -82170986, -82121559,
+ -82071383, -82020459, -81968787, -81916370, -81863207, -81809299,
+ -81754649, -81699256, -81643122, -81586248, -81528634, -81470282,
+ -81411193, -81351368, -81290808, -81229514, -81167487, -81104727,
+ -81041237, -80977018, -80912069, -80846393, -80779990, -80712862,
+ -80645010, -80576434, -80507136, -80437117, -80366379, -80294922,
+ -80222747, -80149856, -80076249, -80001929, -79926895, -79851150,
+ -79774694, -79697529, -79619656, -79541075, -79461789, -79381798,
+ -79301104, -79219708, -79137611, -79054814, -78971318, -78887126,
+ -78802237, -78716654, -78630377, -78543408, -78455749, -78367399,
+ -78278362, -78188637, -78098226, -78007131, -77915353, -77822893,
+ -77729753, -77635933, -77541436, -77446262, -77350413, -77253890,
+ -77156694, -77058828, -76960291, -76861087, -76761215, -76660677,
+ -76559476, -76457611, -76355085, -76251899, -76148055, -76043553,
+ -75938395, -75832583, -75726118, -75619001, -75511234, -75402819,
+ -75293756, -75184048, -75073695, -74962700, -74851063, -74738786,
+ -74625871, -74512319, -74398131, -74283310, -74167856, -74051771,
+ -73935057, -73817715, -73699746, -73581153, -73461936, -73342097,
+ -73221639, -73100561, -72978867, -72856556, -72733632, -72610095,
+ -72485948, -72361191, -72235826, -72109855, -71983280, -71856101,
+ -71728322, -71599942, -71470964, -71341390, -71211220, -71080458,
+ -70949103, -70817159, -70684626, -70551507, -70417802, -70283514,
+ -70148643, -70013193, -69877164, -69740559, -69603378, -69465623,
+ -69327297, -69188401, -69048936, -68908904, -68768307, -68627147,
+ -68485425, -68343144, -68200304, -68056907, -67912956, -67768452,
+ -67623396, -67477791, -67331638, -67184938, -67037695, -66889908,
+ -66741581, -66592715, -66443311, -66293372, -66142899, -65991894,
+ -65840358, -65688295, -65535704, -65382589, -65228950, -65074790,
+ -64920111, -64764914, -64609201, -64452974, -64296235, -64138986,
+ -63981227, -63822962, -63664192, -63504919, -63345145, -63184871,
+ -63024100, -62862833, -62701072, -62538819, -62376075, -62212844,
+ -62049126, -61884924, -61720238, -61555072, -61389428, -61223306,
+ -61056709, -60889638, -60722096, -60554085, -60385607, -60216662,
+ -60047254, -59877384, -59707054, -59536266, -59365022, -59193323,
+ -59021173, -58848572, -58675523, -58502027, -58328087, -58153704,
+ -57978880, -57803618, -57627919, -57451786, -57275219, -57098222,
+ -56920796, -56742943, -56564664, -56385963, -56206841, -56027300,
+ -55847341, -55666968, -55486181, -55304984, -55123377, -54941363,
+ -54758944, -54576121, -54392898, -54209275, -54025255, -53840841,
+ -53656033, -53470833, -53285245, -53099270, -52912909, -52726166,
+ -52539041, -52351537, -52163657, -51975401, -51786773, -51597774,
+ -51408406, -51218671, -51028571, -50838109, -50647285, -50456104,
+ -50264565, -50072673, -49880427, -49687832, -49494888, -49301597,
+ -49107963, -48913986, -48719669, -48525014, -48330023, -48134699,
+ -47939042, -47743056, -47546742, -47350102, -47153139, -46955855,
+ -46758251, -46560330, -46362093, -46163544, -45964684, -45765515,
+ -45566039, -45366258, -45166175, -44965791, -44765109, -44564130,
+ -44362857, -44161293, -43959438, -43757295, -43554867, -43352154,
+ -43149161, -42945888, -42742337, -42538512, -42334413, -42130043,
+ -41925405, -41720499, -41515329, -41309897, -41104204, -40898253,
+ -40692046, -40485585, -40278872, -40071909, -39864699, -39657243,
+ -39449544, -39241604, -39033425, -38825008, -38616357, -38407473,
+ -38198359, -37989016, -37779448, -37569655, -37359640, -37149405,
+ -36938952, -36728284, -36517403, -36306310, -36095009, -35883500,
+ -35671786, -35459870, -35247754, -35035438, -34822927, -34610222,
+ -34397325, -34184238, -33970963, -33757503, -33543859, -33330035,
+ -33116031, -32901851, -32687495, -32472968, -32258269, -32043403,
+ -31828370, -31613174, -31397816, -31182298, -30966622, -30750792,
+ -30534808, -30318673, -30102389, -29885959, -29669384, -29452666,
+ -29235808, -29018813, -28801681, -28584415, -28367018, -28149491,
+ -27931837, -27714058, -27496156, -27278133, -27059991, -26841733,
+ -26623360, -26404875, -26186280, -25967577, -25748768, -25529856,
+ -25310842, -25091729, -24872518, -24653213, -24433814, -24214325,
+ -23994747, -23775083, -23555334, -23335503, -23115593, -22895604,
+ -22675540, -22455402, -22235192, -22014913, -21794568, -21574157,
+ -21353683, -21133148, -20912555, -20691906, -20471202, -20250446,
+ -20029639, -19808785, -19587885, -19366942, -19145957, -18924932,
+ -18703871, -18482774, -18261644, -18040483, -17819294, -17598077,
+ -17376837, -17155574, -16934290, -16712989, -16491671, -16270340,
+ -16048997, -15827644, -15606283, -15384917, -15163548, -14942177,
+ -14720808, -14499441, -14278079, -14056725, -13835380, -13614046,
+ -13392726, -13171421, -12950134, -12728867, -12507622, -12286400,
+ -12065205, -11844038, -11622901, -11401796, -11180726, -10959692,
+ -10738697, -10517743, -10296831, -10075964, -9855144, -9634372,
+ -9413652, -9192985, -8972373, -8751818, -8531323, -8310889, -8090518,
+ -7870213, -7649975, -7429807, -7209710, -6989687, -6769740, -6549871,
+ -6330081, -6110373, -5890749, -5671211, -5451761, -5232401, -5013133,
+ -4793959, -4574881, -4355901, -4137021, -3918244, -3699570, -3481003,
+ -3262544, -3044195, -2825958, -2607836, -2389829, -2171941, -1954173,
+ -1736528, -1519006, -1301611, -1084343, -867206, -650202, -433331,
+ -216596, 0, 216456, 432771, 648941, 864966, 1080842, 1296569, 1512144,
+ 1727565, 1942831, 2157938, 2372886, 2587673, 2802296, 3016753, 3231043,
+ 3445164, 3659114, 3872890, 4086491, 4299915, 4513161, 4726225, 4939107,
+ 5151804, 5364314, 5576636, 5788767, 6000706, 6212451, 6424000, 6635351,
+ 6846502, 7057451, 7268197, 7478737, 7689070, 7899194, 8109107, 8318806,
+ 8528291, 8737559, 8946609, 9155438, 9364045, 9572428, 9780585, 9988514,
+ 10196214, 10403682, 10610917, 10817917, 11024680, 11231205, 11437489,
+ 11643530, 11849328, 12054880, 12260183, 12465238, 12670041, 12874591,
+ 13078886, 13282924, 13486704, 13690224, 13893482, 14096476, 14299205,
+ 14501666, 14703858, 14905780, 15107428, 15308803, 15509902, 15710723,
+ 15911264, 16111524, 16311502, 16511194, 16710601, 16909719, 17108547,
+ 17307084, 17505327, 17703276, 17900928, 18098282, 18295336, 18492088,
+ 18688537, 18884681, 19080518, 19276047, 19471265, 19666172, 19860766,
+ 20055045, 20249007, 20442651, 20635974, 20828977, 21021656, 21214010,
+ 21406038, 21597738, 21789108, 21980147, 22170853, 22361225, 22551260,
+ 22740958, 22930316, 23119334, 23308009, 23496341, 23684326, 23871965,
+ 24059255, 24246194, 24432782, 24619016, 24804896, 24990419, 25175584,
+ 25360389, 25544834, 25728916, 25912634, 26095986, 26278971, 26461587,
+ 26643834, 26825708, 27007210, 27188337, 27369088, 27549461, 27729455,
+ 27909069, 28088301, 28267149, 28445612, 28623690, 28801379, 28978679,
+ 29155588, 29332106, 29508229, 29683958, 29859291, 30034225, 30208761,
+ 30382896, 30556628, 30729958, 30902883, 31075401, 31247512, 31419214,
+ 31590506, 31761386, 31931853, 32101905, 32271542, 32440762, 32609563,
+ 32777945, 32945905, 33113443, 33280558, 33447247, 33613510, 33779345,
+ 33944751, 34109727, 34274271, 34438382, 34602060, 34765301, 34928107,
+ 35090474, 35252401, 35413889, 35574934, 35735537, 35895695, 36055408,
+ 36214674, 36373492, 36531861, 36689780, 36847247, 37004261, 37160821,
+ 37316926, 37472575, 37627766, 37782498, 37936770, 38090581, 38243930,
+ 38396815, 38549236, 38701191, 38852679, 39003699, 39154250, 39304330,
+ 39453939, 39603075, 39751738, 39899926, 40047638, 40194873, 40341630,
+ 40487908, 40633705, 40779021, 40923855, 41068205, 41212071, 41355451,
+ 41498345, 41640750, 41782667, 41924094, 42065031, 42205475, 42345427,
+ 42484885, 42623848, 42762315, 42900285, 43037757, 43174730, 43311204,
+ 43447177, 43582648, 43717616, 43852080, 43986040, 44119494, 44252441,
+ 44384881, 44516813, 44648235, 44779147, 44909548, 45039436, 45168812,
+ 45297673, 45426020, 45553851, 45681165, 45807962, 45934241, 46060000,
+ 46185240, 46309958, 46434154, 46557828, 46680979, 46803605, 46925706,
+ 47047281, 47168329, 47288849, 47408841, 47528304, 47647237, 47765639,
+ 47883510, 48000848, 48117653, 48233924, 48349661, 48464862, 48579527,
+ 48693655, 48807245, 48920297, 49032810, 49144783, 49256215, 49367107,
+ 49477456, 49587262, 49696525, 49805244, 49913419, 50021048, 50128130,
+ 50234666, 50340655, 50446096, 50550987, 50655330, 50759122, 50862364,
+ 50965054, 51067193, 51168779, 51269812, 51370291, 51470216, 51569586,
+ 51668400, 51766659, 51864360, 51961505, 52058091, 52154120, 52249589,
+ 52344499, 52438849, 52532638, 52625866, 52718533, 52810638, 52902180,
+ 52993158, 53083574, 53173425, 53262711, 53351432, 53439588, 53527178,
+ 53614201, 53700657, 53786546, 53871866, 53956619, 54040802, 54124417,
+ 54207461, 54289936, 54371840, 54453173, 54533935, 54614126, 54693744,
+ 54772790, 54851262, 54929162, 55006488, 55083240, 55159417, 55235020,
+ 55310048, 55384501, 55458377, 55531678, 55604403, 55676550, 55748121,
+ 55819114, 55889530, 55959368, 56028627, 56097308, 56165411, 56232934,
+ 56299878, 56366242, 56432027, 56497231, 56561855, 56625899, 56689361,
+ 56752243, 56814543, 56876262, 56937400, 56997955, 57057928, 57117319,
+ 57176128, 57234354, 57291997, 57349057, 57405534, 57461427, 57516737,
+ 57571464, 57625606, 57679165, 57732140, 57784530, 57836336, 57887558,
+ 57938196, 57988248, 58037716, 58086599, 58134898, 58182611, 58229739,
+ 58276282, 58322240, 58367613, 58412400, 58456602, 58500219, 58543250,
+ 58585696, 58627556, 58668831, 58709520, 58749624, 58789143, 58828075,
+ 58866423, 58904184, 58941361, 58977951, 59013957, 59049377, 59084212,
+ 59118461, 59152125, 59185204, 59217698, 59249607, 59280931, 59311670,
+ 59341824, 59371394, 59400379, 59428779, 59456595, 59483827, 59510475,
+ 59536538, 59562018, 59586914, 59611226, 59634955, 59658100, 59680662,
+ 59702642, 59724038, 59744852, 59765083, 59784732, 59803799, 59822284,
+ 59840188, 59857509, 59874250, 59890409, 59905988, 59920986, 59935404,
+ 59949241, 59962499, 59975176, 59987275, 59998794, 60009735, 60020097,
+ 60029881, 60039086, 60047714, 60055765, 60063238, 60070134, 60076454,
+ 60082198, 60087366, 60091958, 60095975, 60099417, 60102284, 60104577,
+ 60106297, 60107443, 60108015, 60108015, 60107443, 60106298, 60104582,
+ 60102295, 60099436, 60096007, 60092009, 60087440, 60082302, 60076596,
+ 60070321, 60063478, 60056067, 60048089, 60039545, 60030435, 60020758,
+ 60010517, 59999710, 59988340, 59976405, 59963907, 59950846, 59937223,
+ 59923038, 59908291, 59892983, 59877115, 59860688, 59843700, 59826154,
+ 59808050, 59789388, 59770168, 59750392, 59730060, 59709172, 59687729,
+ 59665732, 59643181, 59620076, 59596419, 59572209, 59547449, 59522137,
+ 59496274, 59469862, 59442901, 59415391, 59387334, 59358729, 59329577,
+ 59299880, 59269637, 59238849, 59207517, 59175642, 59143224, 59110264,
+ 59076762, 59042720, 59008138, 58973016, 58937355, 58901156, 58864420,
+ 58827148, 58789339, 58750995, 58712117, 58672705, 58632760, 58592282,
+ 58551273, 58509733, 58467663, 58425063, 58381935, 58338279, 58294096,
+ 58249386, 58204151, 58158391, 58112107, 58065300, 58017970, 57970118,
+ 57921746, 57872854, 57823442, 57773512, 57723064, 57672100, 57620619,
+ 57568624, 57516113, 57463090, 57409554, 57355506, 57300947, 57245877,
+ 57190299, 57134212, 57077618, 57020517, 56962910, 56904798, 56846182,
+ 56787064, 56727442, 56667320, 56606697, 56545575, 56483954, 56421835,
+ 56359219, 56296108, 56232501, 56168401, 56103807, 56038721, 55973144,
+ 55907077, 55840521, 55773476, 55705943, 55637925, 55569420, 55500432,
+ 55430959, 55361005, 55290568, 55219651, 55148255, 55076379, 55004027,
+ 54931197, 54857892, 54784113, 54709860, 54635134, 54559937, 54484269,
+ 54408132, 54331526, 54254453, 54176914, 54098909, 54020440, 53941508,
+ 53862113, 53782258, 53701942, 53621167, 53539935, 53458246, 53376100,
+ 53293501, 53210447, 53126942, 53042984, 52958577, 52873720, 52788415,
+ 52702663, 52616465, 52529823, 52442736, 52355208, 52267237, 52178827,
+ 52089977, 52000689, 51910965, 51820804, 51730209, 51639181, 51547720,
+ 51455828, 51363507, 51270756, 51177578, 51083973, 50989943, 50895488,
+ 50800611, 50705312, 50609592, 50513453, 50416896, 50319922, 50222531,
+ 50124727, 50026509, 49927878, 49828837, 49729385, 49629526, 49529259,
+ 49428585, 49327507, 49226025, 49124141, 49021855, 48919170, 48816086,
+ 48712604, 48608726, 48504453, 48399787, 48294727, 48189277, 48083437,
+ 47977208, 47870591, 47763589, 47656201, 47548430, 47440277, 47331743,
+ 47222829, 47113536, 47003866, 46893820, 46783400, 46672607, 46561441,
+ 46449905, 46337999, 46225726, 46113085, 46000079, 45886709, 45772977,
+ 45658882, 45544428, 45429615, 45314444, 45198917, 45083036, 44966800,
+ 44850213, 44733275, 44615987, 44498352, 44380369, 44262041, 44143370,
+ 44024355, 43904999, 43785303, 43665269, 43544897, 43424189, 43303147,
+ 43181772, 43060065, 42938028, 42815661, 42692968, 42569948, 42446603,
+ 42322934, 42198944, 42074633, 41950002, 41825054, 41699790, 41574210,
+ 41448317, 41322111, 41195595, 41068769, 40941635, 40814195, 40686449,
+ 40558400, 40430048, 40301396, 40172444, 40043194, 39913647, 39783805,
+ 39653669, 39523241, 39392522, 39261514, 39130218, 38998635, 38866767,
+ 38734615, 38602181, 38469466, 38336472, 38203200, 38069652, 37935829,
+ 37801732, 37667363, 37532723, 37397815, 37262638, 37127196, 36991489,
+ 36855518, 36719286, 36582793, 36446042, 36309033, 36171768, 36034249,
+ 35896477, 35758453, 35620180, 35481658, 35342889, 35203875, 35064616,
+ 34925115, 34785373, 34645391, 34505172, 34364715, 34224024, 34083099,
+ 33941942, 33800554, 33658938, 33517094, 33375023, 33232728, 33090211,
+ 32947471, 32804512, 32661334, 32517939, 32374328, 32230503, 32086466,
+ 31942218, 31797761, 31653096, 31508224, 31363147, 31217867, 31072385,
+ 30926703, 30780822, 30634743, 30488469, 30342001, 30195340, 30048487,
+ 29901445, 29754215, 29606799, 29459197, 29311412, 29163444, 29015296,
+ 28866970, 28718466, 28569786, 28420931, 28271904, 28122706, 27973337,
+ 27823801, 27674098, 27524230, 27374198, 27224004, 27073650, 26923137,
+ 26772466, 26621640, 26470659, 26319525, 26168240, 26016806, 25865223,
+ 25713494, 25561619, 25409601, 25257441, 25105141, 24952702, 24800125,
+ 24647413, 24494567, 24341587, 24188477, 24035237, 23881869, 23728375,
+ 23574755, 23421012, 23267147, 23113162, 22959059, 22804838, 22650501,
+ 22496050, 22341487, 22186813, 22032029, 21877138, 21722140, 21567037,
+ 21411831, 21256523, 21101115, 20945609, 20790005, 20634306, 20478514,
+ 20322628, 20166652, 20010586, 19854433, 19698194, 19541870, 19385462,
+ 19228974, 19072405, 18915758, 18759034, 18602234, 18445361, 18288415,
+ 18131399, 17974313, 17817160, 17659941, 17502657, 17345310, 17187902,
+ 17030434, 16872908, 16715324, 16557686, 16399993, 16242249, 16084454,
+ 15926609, 15768718, 15610780, 15452797, 15294772, 15136705, 14978598,
+ 14820453, 14662272, 14504055, 14345804, 14187521, 14029207, 13870864,
+ 13712494, 13554097, 13395676, 13237232, 13078766, 12920281, 12761777,
+ 12603256, 12444719, 12286169, 12127607, 11969033, 11810451, 11651860,
+ 11493264, 11334662, 11176057, 11017451, 10858845, 10700240, 10541637,
+ 10383039, 10224447, 10065862, 9907287, 9748721, 9590168, 9431628,
+ 9273103, 9114594, 8956103, 8797632, 8639181, 8480753, 8322349, 8163971,
+ 8005619, 7847296, 7689002, 7530740, 7372511, 7214316, 7056158, 6898036,
+ 6739954, 6581911, 6423911, 6265954, 6108041, 5950175, 5792357, 5634588,
+ 5476869, 5319203, 5161590, 5004033, 4846532, 4689089, 4531705, 4374383,
+ 4217123, 4059926, 3902796, 3745732, 3588736, 3431810, 3274955, 3118173,
+ 2961464, 2804832, 2648276, 2491799, 2335401, 2179085, 2022852, 1866703,
+ 1710639, 1554663, 1398775, 1242977, 1087270, 931656, 776136, 620712,
+ 465385, 310156, 155027, 0, -154924, -309745, -464460, -619068, -773568,
+ -927959, -1082238, -1236404, -1390456, -1544394, -1698214, -1851916,
+ -2005499, -2158961, -2312300, -2465516, -2618607, -2771571, -2924408,
+ -3077115, -3229692, -3382137, -3534448, -3686625, -3838666, -3990569,
+ -4142334, -4293958, -4445441, -4596781, -4747977, -4899027, -5049931,
+ -5200686, -5351292, -5501747, -5652049, -5802198, -5952192, -6102030,
+ -6251710, -6401231, -6550592, -6699792, -6848828, -6997701, -7146408,
+ -7294948, -7443320, -7591523, -7739554, -7887414, -8035101, -8182613,
+ -8329949, -8477107, -8624087, -8770888, -8917507, -9063944, -9210198,
+ -9356266, -9502148, -9647843, -9793349, -9938665, -10083790, -10228723,
+ -10373461, -10518005, -10662352, -10806502, -10950453, -11094204,
+ -11237754, -11381101, -11524245, -11667183, -11809916, -11952441,
+ -12094757, -12236863, -12378759, -12520442, -12661911, -12803166,
+ -12944205, -13085027, -13225630, -13366014, -13506177, -13646118,
+ -13785836, -13925330, -14064599, -14203640, -14342454, -14481039,
+ -14619393, -14757516, -14895407, -15033064, -15170486, -15307672,
+ -15444621, -15581332, -15717803, -15854033, -15990022, -16125768,
+ -16261270, -16396526, -16531537, -16666300, -16800814, -16935079,
+ -17069093, -17202855, -17336364, -17469619, -17602618, -17735362,
+ -17867848, -18000075, -18132043, -18263750, -18395195, -18526377,
+ -18657296, -18787949, -18918337, -19048457, -19178309, -19307891,
+ -19437204, -19566245, -19695013, -19823508, -19951728, -20079673,
+ -20207341, -20334731, -20461843, -20588675, -20715226, -20841495,
+ -20967482, -21093185, -21218602, -21343734, -21468580, -21593137,
+ -21717405, -21841384, -21965072, -22088467, -22211570, -22334380,
+ -22456894, -22579113, -22701035, -22822659, -22943985, -23065010,
+ -23185736, -23306160, -23426281, -23546099, -23665612, -23784821,
+ -23903723, -24022317, -24140604, -24258581, -24376249, -24493606,
+ -24610651, -24727383, -24843802, -24959906, -25075694, -25191167,
+ -25306322, -25421159, -25535677, -25649875, -25763752, -25877308,
+ -25990541, -26103451, -26216037, -26328297, -26440232, -26551840,
+ -26663120, -26774071, -26884694, -26994986, -27104947, -27214576,
+ -27323873, -27432836, -27541465, -27649758, -27757716, -27865337,
+ -27972620, -28079565, -28186171, -28292437, -28398362, -28503946,
+ -28609187, -28714086, -28818640, -28922850, -29026714, -29130233,
+ -29233404, -29336228, -29438703, -29540829, -29642605, -29744031,
+ -29845105, -29945827, -30046196, -30146212, -30245873, -30345179,
+ -30444130, -30542724, -30640961, -30738840, -30836360, -30933522,
+ -31030323, -31126764, -31222844, -31318561, -31413916, -31508908,
+ -31603536, -31697799, -31791696, -31885228, -31978393, -32071191,
+ -32163621, -32255683, -32347375, -32438698, -32529650, -32620231,
+ -32710440, -32800278, -32889742, -32978833, -33067549, -33155892,
+ -33243858, -33331449, -33418664, -33505501, -33591961, -33678042,
+ -33763745, -33849068, -33934012, -34018575, -34102757, -34186558,
+ -34269976, -34353012, -34435664, -34517933, -34599818, -34681317,
+ -34762432, -34843160, -34923503, -35003458, -35083026, -35162207,
+ -35240999, -35319402, -35397415, -35475039, -35552273, -35629116,
+ -35705567, -35781627, -35857295, -35932570, -36007452, -36081940,
+ -36156034, -36229734, -36303039, -36375949, -36448463, -36520580,
+ -36592301, -36663625, -36734552, -36805080, -36875211, -36944942,
+ -37014275, -37083208, -37151741, -37219874, -37287607, -37354938,
+ -37421868, -37488396, -37554522, -37620246, -37685566, -37750484,
+ -37814997, -37879107, -37942813, -38006114, -38069010, -38131501,
+ -38193587, -38255266, -38316539, -38377406, -38437865, -38497918,
+ -38557563, -38616801, -38675630, -38734051, -38792063, -38849667,
+ -38906861, -38963646, -39020021, -39075986, -39131541, -39186685,
+ -39241419, -39295741, -39349653, -39403153, -39456241, -39508917,
+ -39561181, -39613032, -39664471, -39715497, -39766110, -39816310,
+ -39866096, -39915469, -39964427, -40012972, -40061103, -40108819,
+ -40156120, -40203007, -40249478, -40295535, -40341176, -40386402,
+ -40431212, -40475607, -40519585, -40563148, -40606294, -40649024,
+ -40691338, -40733235, -40774716, -40815780, -40856426, -40896656,
+ -40936469, -40975864, -41014842, -41053403, -41091546, -41129272,
+ -41166580, -41203470, -41239943, -41275997, -41311634, -41346852,
+ -41381653, -41416035, -41450000, -41483546, -41516673, -41549383,
+ -41581674, -41613547, -41645002, -41676038, -41706655, -41736855,
+ -41766636, -41795998, -41824942, -41853468, -41881575, -41909264,
+ -41936534, -41963386, -41989820, -42015835, -42041432, -42066611,
+ -42091372, -42115714, -42139639, -42163145, -42186233, -42208904,
+ -42231156, -42252991, -42274408, -42295407, -42315989, -42336153,
+ -42355900, -42375230, -42394142, -42412637, -42430715, -42448376,
+ -42465621, -42482448, -42498860, -42514854, -42530433, -42545595,
+ -42560341, -42574671, -42588586, -42602085, -42615168, -42627836,
+ -42640089, -42651927, -42663350, -42674358, -42684952, -42695132,
+ -42704897, -42714249, -42723187, -42731711, -42739822, -42747520,
+ -42754804, -42761676, -42768136, -42774183, -42779818, -42785041,
+ -42789853, -42794253, -42798242, -42801820, -42804987, -42807744,
+ -42810090, -42812027, -42813554, -42814671, -42815380, -42815679,
+ -42815570, -42815052, -42814127, -42812794, -42811053, -42808905,
+ -42806350, -42803388, -42800020, -42796246, -42792066, -42787481,
+ -42782491, -42777097, -42771297, -42765094, -42758487, -42751476,
+ -42744063, -42736246, -42728028, -42719407, -42710384, -42700961,
+ -42691136, -42680911, -42670285, -42659259, -42647834, -42636010,
+ -42623788, -42611166, -42598147, -42584731, -42570917, -42556706,
+ -42542099, -42527096, -42511698, -42495904, -42479716, -42463133,
+ -42446157, -42428787, -42411024, -42392868, -42374321, -42355381,
+ -42336051, -42316330, -42296218, -42275716, -42254825, -42233545,
+ -42211877, -42189821, -42167377, -42144545, -42121328, -42097724,
+ -42073735, -42049360, -42024601, -41999457, -41973930, -41948020,
+ -41921728, -41895053, -41867996, -41840559, -41812741, -41784542,
+ -41755965, -41727008, -41697673, -41667960, -41637869, -41607402,
+ -41576558, -41545339, -41513744, -41481775, -41449432, -41416715,
+ -41383626, -41350164, -41316330, -41282125, -41247549, -41212603,
+ -41177288, -41141604, -41105551, -41069131, -41032344, -40995190,
+ -40957670, -40919785, -40881535, -40842922, -40803944, -40764604,
+ -40724902, -40684838, -40644413, -40603628, -40562483, -40520979,
+ -40479117, -40436897, -40394319, -40351386, -40308096, -40264451,
+ -40220452, -40176099, -40131393, -40086334, -40040923, -39995161,
+ -39949049, -39902587, -39855775, -39808615, -39761108, -39713253,
+ -39665052, -39616505, -39567614, -39518378, -39468798, -39418876,
+ -39368611, -39318005, -39267058, -39215771, -39164145, -39112181,
+ -39059878, -39007238, -38954262, -38900951, -38847304, -38793323,
+ -38739009, -38684362, -38629384, -38574074, -38518433, -38462463,
+ -38406164, -38349537, -38292583, -38235302, -38177695, -38119763,
+ -38061506, -38002927, -37944024, -37884800, -37825254, -37765388,
+ -37705202, -37644698, -37583875, -37522736, -37461280, -37399508,
+ -37337422, -37275021, -37212308, -37149282, -37085945, -37022296,
+ -36958338, -36894071, -36829496, -36764613, -36699424, -36633928,
+ -36568128, -36502024, -36435617, -36368907, -36301895, -36234583,
+ -36166971, -36099060, -36030851, -35962345, -35893542, -35824443,
+ -35755050, -35685363, -35615383, -35545110, -35474547, -35403693,
+ -35332549, -35261117, -35189398, -35117391, -35045098, -34972521,
+ -34899659, -34826514, -34753086, -34679377, -34605387, -34531118,
+ -34456569, -34381743, -34306640, -34231260, -34155606, -34079677,
+ -34003475, -33927000, -33850254, -33773237, -33695950, -33618395,
+ -33540572, -33462482, -33384126, -33305505, -33226619, -33147471,
+ -33068060, -32988388, -32908456, -32828264, -32747814, -32667106,
+ -32586142, -32504922, -32423447, -32341718, -32259737, -32177504,
+ -32095020, -32012286, -31929304, -31846073, -31762595, -31678872,
+ -31594903, -31510690, -31426234, -31341536, -31256596, -31171417,
+ -31085998, -31000341, -30914447, -30828316, -30741950, -30655350,
+ -30568517, -30481451, -30394154, -30306627, -30218870, -30130885,
+ -30042672, -29954234, -29865570, -29776681, -29687570, -29598236,
+ -29508680, -29418905, -29328910, -29238697, -29148266, -29057619,
+ -28966758, -28875681, -28784392, -28692890, -28601178, -28509255,
+ -28417123, -28324783, -28232236, -28139483, -28046524, -27953362,
+ -27859997, -27766430, -27672662, -27578695, -27484528, -27390164,
+ -27295603, -27200846, -27105895, -27010750, -26915413, -26819884,
+ -26724164, -26628255, -26532158, -26435873, -26339403, -26242747,
+ -26145906, -26048883, -25951678, -25854291, -25756725, -25658980,
+ -25561057, -25462957, -25364681, -25266231, -25167607, -25068811,
+ -24969843, -24870705, -24771397, -24671922, -24572279, -24472470,
+ -24372496, -24272358, -24172057, -24071594, -23970970, -23870187,
+ -23769245, -23668146, -23566890, -23465478, -23363913, -23262194,
+ -23160323, -23058301, -22956129, -22853808, -22751339, -22648724,
+ -22545963, -22443057, -22340008, -22236816, -22133483, -22030010,
+ -21926398, -21822648, -21718760, -21614737, -21510579, -21406287,
+ -21301863, -21197307, -21092621, -20987806, -20882862, -20777791,
+ -20672594, -20567272, -20461826, -20356258, -20250568, -20144757,
+ -20038827, -19932778, -19826612, -19720330, -19613933, -19507421,
+ -19400797, -19294062, -19187215, -19080259, -18973194, -18866022,
+ -18758744, -18651360, -18543873, -18436282, -18328590, -18220797,
+ -18112904, -18004912, -17896823, -17788638, -17680357, -17571982,
+ -17463515, -17354955, -17246304, -17137564, -17028735, -16919818,
+ -16810815, -16701726, -16592554, -16483298, -16373960, -16264542,
+ -16155043, -16045466, -15935811, -15826079, -15716273, -15606392,
+ -15496437, -15386411, -15276314, -15166146, -15055910, -14945607,
+ -14835236, -14724801, -14614301, -14503737, -14393112, -14282425,
+ -14171679, -14060873, -13950010, -13839090, -13728115, -13617085,
+ -13506002, -13394867, -13283681, -13172444, -13061159, -12949825,
+ -12838445, -12727020, -12615549, -12504036, -12392480, -12280883,
+ -12169245, -12057569, -11945854, -11834103, -11722316, -11610495,
+ -11498639, -11386752, -11274833, -11162883, -11050905, -10938898,
+ -10826865, -10714805, -10602721, -10490613, -10378482, -10266330,
+ -10154157, -10041965, -9929755, -9817527, -9705283, -9593025, -9480752,
+ -9368467, -9256170, -9143862, -9031544, -8919218, -8806885, -8694545,
+ -8582200, -8469851, -8357499, -8245145, -8132789, -8020434, -7908080,
+ -7795729, -7683380, -7571037, -7458698, -7346367, -7234043, -7121727,
+ -7009422, -6897127, -6784844, -6672575, -6560319, -6448078, -6335854,
+ -6223647, -6111458, -5999289, -5887140, -5775013, -5662908, -5550827,
+ -5438770, -5326740, -5214736, -5102760, -4990813, -4878895, -4767009,
+ -4655155, -4543334, -4431547, -4319796, -4208081, -4096403, -3984763,
+ -3873163, -3761603, -3650085, -3538609, -3427177, -3315789, -3204447,
+ -3093152, -2981904, -2870705, -2759556, -2648458, -2537411, -2426418,
+ -2315478, -2204593, -2093765, -1982993, -1872279, -1761624, -1651029,
+ -1540495, -1430024, -1319615, -1209270, -1098991, -988778, -878631,
+ -768553, -658544, -548606, -438738, -328943, -219220, -109572, 0,
+ 109496, 218916, 328257, 437519, 546702, 655803, 764821, 873757, 982609,
+ 1091375, 1200056, 1308649, 1417155, 1525571, 1633897, 1742133, 1850276,
+ 1958327, 2066283, 2174145, 2281911, 2389580, 2497152, 2604624, 2711997,
+ 2819270, 2926440, 3033509, 3140473, 3247334, 3354088, 3460737, 3567278,
+ 3673711, 3780034, 3886248, 3992350, 4098340, 4204218, 4309981, 4415630,
+ 4521163, 4626579, 4731877, 4837057, 4942117, 5047057, 5151876, 5256572,
+ 5361146, 5465595, 5569919, 5674117, 5778188, 5882132, 5985947, 6089632,
+ 6193187, 6296610, 6399901, 6503059, 6606083, 6708972, 6811725, 6914342,
+ 7016821, 7119161, 7221362, 7323422, 7425342, 7527119, 7628753, 7730244,
+ 7831590, 7932790, 8033844, 8134751, 8235509, 8336119, 8436579, 8536888,
+ 8637045, 8737050, 8836901, 8936599, 9036141, 9135528, 9234758, 9333830,
+ 9432744, 9531499, 9630094, 9728528, 9826800, 9924910, 10022856,
+ 10120638, 10218255, 10315706, 10412991, 10510108, 10607057, 10703836,
+ 10800446, 10896885, 10993153, 11089248, 11185170, 11280918, 11376492,
+ 11471890, 11567111, 11662156, 11757022, 11851710, 11946219, 12040547,
+ 12134694, 12228660, 12322442, 12416042, 12509457, 12602688, 12695733,
+ 12788591, 12881262, 12973746, 13066040, 13158146, 13250061, 13341785,
+ 13433317, 13524657, 13615804, 13706757, 13797515, 13888078, 13978445,
+ 14068614, 14158587, 14248361, 14337936, 14427311, 14516486, 14605460,
+ 14694231, 14782800, 14871166, 14959328, 15047285, 15135037, 15222583,
+ 15309921, 15397053, 15483976, 15570690, 15657195, 15743489, 15829573,
+ 15915445, 16001104, 16086551, 16171784, 16256803, 16341606, 16426195,
+ 16510566, 16594721, 16678659, 16762378, 16845878, 16929159, 17012219,
+ 17095059, 17177677, 17260073, 17342246, 17424196, 17505922, 17587423,
+ 17668699, 17749749, 17830573, 17911169, 17991538, 18071678, 18151589,
+ 18231271, 18310723, 18389944, 18468933, 18547691, 18626216, 18704508,
+ 18782566, 18860390, 18937979, 19015332, 19092450, 19169331, 19245974,
+ 19322380, 19398547, 19474476, 19550165, 19625614, 19700823, 19775790,
+ 19850516, 19924999, 19999240, 20073237, 20146991, 20220500, 20293764,
+ 20366783, 20439556, 20512082, 20584361, 20656393, 20728176, 20799712,
+ 20870997, 20942034, 21012820, 21083356, 21153640, 21223673, 21293454,
+ 21362982, 21432257, 21501279, 21570046, 21638559, 21706817, 21774819,
+ 21842566, 21910056, 21977289, 22044264, 22110982, 22177442, 22243643,
+ 22309584, 22375266, 22440688, 22505849, 22570750, 22635388, 22699766,
+ 22763880, 22827732, 22891321, 22954646, 23017708, 23080504, 23143036,
+ 23205303, 23267304, 23329039, 23390508, 23451709, 23512644, 23573310,
+ 23633709, 23693839, 23753700, 23813293, 23872615, 23931667, 23990449,
+ 24048961, 24107201, 24165170, 24222867, 24280291, 24337443, 24394323,
+ 24450928, 24507261, 24563319, 24619103, 24674612, 24729846, 24784805,
+ 24839488, 24893896, 24948027, 25001881, 25055458, 25108758, 25161780,
+ 25214525, 25266991, 25319178, 25371087, 25422717, 25474067, 25525137,
+ 25575928, 25626438, 25676667, 25726615, 25776283, 25825669, 25874773,
+ 25923595, 25972135, 26020392, 26068366, 26116058, 26163466, 26210590,
+ 26257431, 26303987, 26350259, 26396247, 26441950, 26487368, 26532500,
+ 26577347, 26621908, 26666183, 26710173, 26753875, 26797291, 26840420,
+ 26883262, 26925817, 26968084, 27010064, 27051756, 27093159, 27134275,
+ 27175102, 27215640, 27255889, 27295850, 27335521, 27374903, 27413995,
+ 27452798, 27491311, 27529533, 27567466, 27605108, 27642460, 27679520,
+ 27716291, 27752770, 27788958, 27824854, 27860460, 27895774, 27930796,
+ 27965526, 27999964, 28034111, 28067965, 28101527, 28134796, 28167773,
+ 28200458, 28232849, 28264948, 28296754, 28328267, 28359487, 28390413,
+ 28421046, 28451386, 28481432, 28511185, 28540644, 28569809, 28598681,
+ 28627259, 28655543, 28683532, 28711228, 28738630, 28765737, 28792551,
+ 28819070, 28845295, 28871225, 28896861, 28922203, 28947250, 28972002,
+ 28996461, 29020624, 29044493, 29068068, 29091347, 29114333, 29137023,
+ 29159419, 29181521, 29203327, 29224839, 29246057, 29266979, 29287607,
+ 29307941, 29327980, 29347724, 29367174, 29386329, 29405189, 29423755,
+ 29442027, 29460004, 29477687, 29495075, 29512170, 29528969, 29545475,
+ 29561687, 29577604, 29593227, 29608557, 29623592, 29638333, 29652781,
+ 29666935, 29680795, 29694362, 29707635, 29720615, 29733301, 29745694,
+ 29757794, 29769601, 29781115, 29792336, 29803264, 29813899, 29824242,
+ 29834293, 29844051, 29853517, 29862691, 29871572, 29880162, 29888460,
+ 29896467, 29904182, 29911605, 29918738, 29925579, 29932129, 29938389,
+ 29944358, 29950036, 29955424, 29960522, 29965329, 29969847, 29974075,
+ 29978014, 29981663, 29985023, 29988094, 29990876, 29993370, 29995574,
+ 29997491, 29999119, 30000460, 30001513, 30002278, 30002756, 30002946,
+ 30002850, 30002467, 30001797, 30000841, 29999599, 29998071, 29996258,
+ 29994159, 29991774, 29989105, 29986151, 29982912, 29979389, 29975582,
+ 29971491, 29967117, 29962459, 29957518, 29952294, 29946788, 29940999,
+ 29934928, 29928575, 29921941, 29915025, 29907829, 29900351, 29892593,
+ 29884555, 29876237, 29867639, 29858762, 29849606, 29840171, 29830457,
+ 29820465, 29810195, 29799648, 29788823, 29777721, 29766343, 29754688,
+ 29742757, 29730550, 29718068, 29705310, 29692278, 29678971, 29665390,
+ 29651535, 29637406, 29623004, 29608330, 29593382, 29578163, 29562672,
+ 29546909, 29530875, 29514570, 29497994, 29481149, 29464034, 29446649,
+ 29428995, 29411073, 29392882, 29374423, 29355697, 29336703, 29317443,
+ 29297916, 29278123, 29258064, 29237740, 29217151, 29196298, 29175180,
+ 29153798, 29132154, 29110246, 29088075, 29065643, 29042948, 29019992,
+ 28996775, 28973298, 28949561, 28925563, 28901307, 28876791, 28852017,
+ 28826985, 28801696, 28776149, 28750345, 28724285, 28697969, 28671398,
+ 28644572, 28617491, 28590156, 28562567, 28534725, 28506630, 28478283,
+ 28449684, 28420833, 28391732, 28362379, 28332777, 28302926, 28272825,
+ 28242475, 28211877, 28181032, 28149939, 28118600, 28087014, 28055182,
+ 28023105, 27990783, 27958217, 27925407, 27892354, 27859057, 27825519,
+ 27791738, 27757716, 27723453, 27688950, 27654206, 27619224, 27584002,
+ 27548542, 27512845, 27476910, 27440738, 27404329, 27367685, 27330806,
+ 27293692, 27256344, 27218762, 27180947, 27142899, 27104619, 27066108,
+ 27027365, 26988392, 26949189, 26909757, 26870096, 26830206, 26790089,
+ 26749745, 26709173, 26668376, 26627353, 26586105, 26544633, 26502937,
+ 26461017, 26418875, 26376511, 26333925, 26291117, 26248090, 26204842,
+ 26161375, 26117690, 26073786, 26029664, 25985326, 25940771, 25896000,
+ 25851014, 25805813, 25760398, 25714770, 25668928, 25622875, 25576609,
+ 25530133, 25483446, 25436549, 25389443, 25342128, 25294604, 25246874,
+ 25198936, 25150792, 25102443, 25053888, 25005129, 24956166, 24907000,
+ 24857631, 24808061, 24758289, 24708316, 24658143, 24607770, 24557199,
+ 24506430, 24455463, 24404299, 24352938, 24301382, 24249631, 24197685,
+ 24145546, 24093214, 24040689, 23987972, 23935064, 23881965, 23828677,
+ 23775199, 23721533, 23667678, 23613637, 23559409, 23504994, 23450395,
+ 23395610, 23340642, 23285490, 23230156, 23174640, 23118942, 23063064,
+ 23007005, 22950767, 22894351, 22837756, 22780984, 22724036, 22666911,
+ 22609611, 22552137, 22494488, 22436667, 22378672, 22320506, 22262169,
+ 22203661, 22144983, 22086136, 22027120, 21967937, 21908586, 21849069,
+ 21789386, 21729539, 21669527, 21609351, 21549013, 21488512, 21427849,
+ 21367026, 21306043, 21244900, 21183598, 21122139, 21060522, 20998748,
+ 20936819, 20874734, 20812495, 20750102, 20687556, 20624858, 20562007,
+ 20499007, 20435855, 20372555, 20309105, 20245508, 20181763, 20117871,
+ 20053834, 19989651, 19925324, 19860853, 19796239, 19731483, 19666585,
+ 19601547, 19536368, 19471050, 19405593, 19339998, 19274267, 19208398,
+ 19142394, 19076255, 19009982, 18943575, 18877035, 18810364, 18743561,
+ 18676627, 18609564, 18542371, 18475050, 18407601, 18340026, 18272324,
+ 18204498, 18136546, 18068470, 18000272, 17931951, 17863508, 17794944,
+ 17726260, 17657457, 17588535, 17519495, 17450338, 17381064, 17311675,
+ 17242171, 17172552, 17102820, 17032976, 16963019, 16892952, 16822774,
+ 16752486, 16682090, 16611585, 16540973, 16470254, 16399430, 16328500,
+ 16257466, 16186328, 16115088, 16043745, 15972301, 15900757, 15829112,
+ 15757369, 15685527, 15613588, 15541553, 15469421, 15397194, 15324872,
+ 15252457, 15179949, 15107349, 15034657, 14961875, 14889002, 14816041,
+ 14742992, 14669854, 14596630, 14523320, 14449925, 14376445, 14302882,
+ 14229235, 14155507, 14081697, 14007806, 13933835, 13859786, 13785658,
+ 13711452, 13637170, 13562811, 13488377, 13413869, 13339287, 13264633,
+ 13189905, 13115107, 13040238, 12965299, 12890291, 12815215, 12740071,
+ 12664860, 12589583, 12514242, 12438835, 12363365, 12287832, 12212237,
+ 12136581, 12060864, 11985087, 11909251, 11833357, 11757405, 11681397,
+ 11605332, 11529213, 11453039, 11376811, 11300531, 11224198, 11147814,
+ 11071380, 10994895, 10918362, 10841781, 10765152, 10688476, 10611754,
+ 10534988, 10458177, 10381322, 10304424, 10227485, 10150504, 10073483,
+ 9996421, 9919321, 9842183, 9765007, 9687795, 9610546, 9533263, 9455945,
+ 9378594, 9301209, 9223793, 9146345, 9068867, 8991359, 8913822, 8836257,
+ 8758665, 8681046, 8603400, 8525730, 8448035, 8370317, 8292576, 8214813,
+ 8137028, 8059223, 7981398, 7903554, 7825692, 7747812, 7669916, 7592003,
+ 7514075, 7436133, 7358177, 7280209, 7202228, 7124235, 7046232, 6968219,
+ 6890197, 6812166, 6734128, 6656083, 6578032, 6499975, 6421914, 6343849,
+ 6265781, 6187710, 6109638, 6031565, 5953492, 5875420, 5797349, 5719280,
+ 5641214, 5563152, 5485094, 5407041, 5328994, 5250954, 5172921, 5094897,
+ 5016881, 4938875, 4860879, 4782894, 4704922, 4626961, 4549015, 4471082,
+ 4393164, 4315261, 4237375, 4159506, 4081655, 4003822, 3926008, 3848215,
+ 3770442, 3692690, 3614961, 3537255, 3459572, 3381913, 3304280, 3226673,
+ 3149092, 3071538, 2994012, 2916515, 2839048, 2761611, 2684204, 2606830,
+ 2529487, 2452178, 2374902, 2297661, 2220455, 2143285, 2066152, 1989056,
+ 1911998, 1834979, 1758000, 1681060, 1604162, 1527305, 1450491, 1373719,
+ 1296992, 1220309, 1143671, 1067079, 990533, 914035, 837585, 761183,
+ 684831, 608529, 532278, 456078, 379931, 303836, 227795, 151808, 75876,
+ 0, -75820, -151583, -227288, -302935, -378523, -454051, -529518,
+ -604925, -680270, -755552, -830771, -905927, -981017, -1056043,
+ -1131003, -1205896, -1280722, -1355480, -1430170, -1504790, -1579341,
+ -1653821, -1728229, -1802566, -1876831, -1951022, -2025139, -2099182,
+ -2173150, -2247041, -2320857, -2394595, -2468255, -2541837, -2615340,
+ -2688763, -2762106, -2835368, -2908548, -2981646, -3054660, -3127592,
+ -3200439, -3273201, -3345877, -3418467, -3490971, -3563387, -3635715,
+ -3707955, -3780105, -3852165, -3924134, -3996013, -4067799, -4139493,
+ -4211094, -4282602, -4354015, -4425333, -4496556, -4567682, -4638712,
+ -4709644, -4780478, -4851214, -4921850, -4992387, -5062823, -5133158,
+ -5203392, -5273523, -5343552, -5413477, -5483298, -5553015, -5622626,
+ -5692132, -5761531, -5830823, -5900007, -5969084, -6038052, -6106910,
+ -6175658, -6244296, -6312823, -6381239, -6449542, -6517732, -6585809,
+ -6653772, -6721620, -6789354, -6856972, -6924473, -6991858, -7059126,
+ -7126275, -7193307, -7260219, -7327011, -7393684, -7460236, -7526667,
+ -7592975, -7659162, -7725226, -7791166, -7856983, -7922674, -7988241,
+ -8053683, -8118998, -8184186, -8249248, -8314182, -8378987, -8443664,
+ -8508211, -8572629, -8636916, -8701073, -8765098, -8828991, -8892752,
+ -8956380, -9019874, -9083235, -9146461, -9209552, -9272507, -9335327,
+ -9398010, -9460556, -9522965, -9585235, -9647368, -9709361, -9771215,
+ -9832928, -9894502, -9955934, -10017225, -10078374, -10139381,
+ -10200245, -10260965, -10321542, -10381974, -10442261, -10502404,
+ -10562400, -10622251, -10681954, -10741511, -10800920, -10860181,
+ -10919293, -10978257, -11037071, -11095735, -11154249, -11212612,
+ -11270824, -11328884, -11386792, -11444547, -11502150, -11559599,
+ -11616894, -11674035, -11731021, -11787851, -11844527, -11901046,
+ -11957408, -12013614, -12069663, -12125553, -12181286, -12236860,
+ -12292275, -12347530, -12402626, -12457561, -12512336, -12566950,
+ -12621402, -12675692, -12729820, -12783786, -12837588, -12891227,
+ -12944702, -12998013, -13051159, -13104140, -13156955, -13209605,
+ -13262089, -13314406, -13366556, -13418539, -13470354, -13522001,
+ -13573480, -13624790, -13675930, -13726902, -13777703, -13828334,
+ -13878794, -13929083, -13979201, -14029148, -14078922, -14128524,
+ -14177953, -14227209, -14276291, -14325200, -14373935, -14422495,
+ -14470880, -14519090, -14567125, -14614984, -14662667, -14710174,
+ -14757503, -14804656, -14851631, -14898428, -14945048, -14991489,
+ -15037751, -15083834, -15129738, -15175462, -15221007, -15266371,
+ -15311555, -15356558, -15401379, -15446020, -15490478, -15534755,
+ -15578849, -15622761, -15666490, -15710036, -15753398, -15796577,
+ -15839571, -15882382, -15925008, -15967449, -16009705, -16051775,
+ -16093660, -16135359, -16176872, -16218199, -16259339, -16300292,
+ -16341058, -16381636, -16422027, -16462230, -16502245, -16542071,
+ -16581709, -16621158, -16660417, -16699488, -16738368, -16777059,
+ -16815560, -16853871, -16891991, -16929920, -16967659, -17005206,
+ -17042562, -17079726, -17116699, -17153479, -17190067, -17226463,
+ -17262666, -17298676, -17334494, -17370118, -17405548, -17440785,
+ -17475828, -17510677, -17545332, -17579792, -17614058, -17648129,
+ -17682005, -17715686, -17749172, -17782462, -17815557, -17848455,
+ -17881158, -17913664, -17945975, -17978088, -18010005, -18041726,
+ -18073249, -18104575, -18135704, -18166635, -18197369, -18227905,
+ -18258243, -18288384, -18318326, -18348070, -18377615, -18406962,
+ -18436110, -18465059, -18493810, -18522361, -18550713, -18578866,
+ -18606819, -18634573, -18662127, -18689481, -18716636, -18743590,
+ -18770344, -18796898, -18823252, -18849405, -18875358, -18901110,
+ -18926661, -18952012, -18977162, -19002110, -19026858, -19051404,
+ -19075749, -19099893, -19123835, -19147576, -19171115, -19194453,
+ -19217588, -19240522, -19263255, -19285785, -19308113, -19330239,
+ -19352163, -19373885, -19395405, -19416722, -19437837, -19458750,
+ -19479460, -19499968, -19520273, -19540376, -19560276, -19579974,
+ -19599468, -19618760, -19637850, -19656736, -19675420, -19693901,
+ -19712179, -19730254, -19748126, -19765796, -19783262, -19800526,
+ -19817586, -19834444, -19851098, -19867550, -19883799, -19899844,
+ -19915687, -19931327, -19946764, -19961997, -19977028, -19991856,
+ -20006481, -20020903, -20035122, -20049138, -20062951, -20076562,
+ -20089970, -20103174, -20116176, -20128976, -20141572, -20153966,
+ -20166157, -20178146, -20189932, -20201515, -20212896, -20224075,
+ -20235051, -20245825, -20256396, -20266765, -20276932, -20286897,
+ -20296660, -20306221, -20315580, -20324737, -20333692, -20342445,
+ -20350997, -20359347, -20367495, -20375442, -20383188, -20390732,
+ -20398075, -20405217, -20412158, -20418898, -20425437, -20431775,
+ -20437913, -20443849, -20449586, -20455122, -20460457, -20465593,
+ -20470528, -20475263, -20479798, -20484134, -20488270, -20492206,
+ -20495943, -20499480, -20502818, -20505958, -20508898, -20511639,
+ -20514182, -20516526, -20518671, -20520618, -20522367, -20523918,
+ -20525271, -20526426, -20527384, -20528144, -20528706, -20529072,
+ -20529240, -20529211, -20528986, -20528564, -20527945, -20527130,
+ -20526119, -20524912, -20523509, -20521911, -20520117, -20518128,
+ -20515943, -20513563, -20510989, -20508220, -20505257, -20502099,
+ -20498747, -20495201, -20491461, -20487528, -20483402, -20479082,
+ -20474569, -20469863, -20464965, -20459875, -20454592, -20449117,
+ -20443450, -20437592, -20431542, -20425301, -20418869, -20412246,
+ -20405432, -20398429, -20391235, -20383851, -20376277, -20368514,
+ -20360561, -20352420, -20344089, -20335570, -20326863, -20317967,
+ -20308883, -20299612, -20290153, -20280507, -20270674, -20260654,
+ -20250448, -20240056, -20229477, -20218712, -20207763, -20196627,
+ -20185307, -20173802, -20162112, -20150238, -20138180, -20125938,
+ -20113513, -20100905, -20088113, -20075139, -20061982, -20048643,
+ -20035122, -20021420, -20007536, -19993471, -19979225, -19964799,
+ -19950192, -19935406, -19920439, -19905294, -19889969, -19874465,
+ -19858782, -19842922, -19826883, -19810667, -19794273, -19777702,
+ -19760954, -19744030, -19726929, -19709653, -19692201, -19674574,
+ -19656771, -19638794, -19620643, -19602317, -19583818, -19565145,
+ -19546299, -19527280, -19508089, -19488726, -19469190, -19449483,
+ -19429605, -19409556, -19389336, -19368946, -19348386, -19327657,
+ -19306758, -19285691, -19264454, -19243050, -19221477, -19199737,
+ -19177830, -19155756, -19133515, -19111108, -19088535, -19065796,
+ -19042893, -19019824, -18996591, -18973194, -18949633, -18925909,
+ -18902021, -18877971, -18853759, -18829384, -18804848, -18780151,
+ -18755292, -18730273, -18705094, -18679755, -18654257, -18628599,
+ -18602783, -18576809, -18550676, -18524386, -18497939, -18471334,
+ -18444574, -18417657, -18390585, -18363357, -18335974, -18308437,
+ -18280746, -18252900, -18224902, -18196750, -18168446, -18139990,
+ -18111381, -18082622, -18053711, -18024650, -17995438, -17966077,
+ -17936566, -17906906, -17877097, -17847140, -17817036, -17786783,
+ -17756384, -17725838, -17695146, -17664309, -17633325, -17602197,
+ -17570925, -17539508, -17507947, -17476243, -17444396, -17412407,
+ -17380275, -17348002, -17315588, -17283033, -17250338, -17217502,
+ -17184527, -17151413, -17118160, -17084769, -17051241, -17017574,
+ -16983771, -16949832, -16915756, -16881545, -16847198, -16812717,
+ -16778101, -16743351, -16708468, -16673452, -16638304, -16603023,
+ -16567610, -16532066, -16496392, -16460587, -16424652, -16388588,
+ -16352394, -16316073, -16279623, -16243045, -16206340, -16169508,
+ -16132551, -16095467, -16058258, -16020924, -15983465, -15945882,
+ -15908176, -15870347, -15832395, -15794321, -15756125, -15717808,
+ -15679370, -15640812, -15602134, -15563337, -15524421, -15485386,
+ -15446233, -15406963, -15367576, -15328072, -15288452, -15248716,
+ -15208866, -15168900, -15128821, -15088627, -15048321, -15007902,
+ -14967370, -14926727, -14885972, -14845106, -14804130, -14763044,
+ -14721849, -14680545, -14639132, -14597612, -14555984, -14514249,
+ -14472407, -14430460, -14388407, -14346249, -14303986, -14261619,
+ -14219149, -14176576, -14133900, -14091122, -14048242, -14005262,
+ -13962181, -13918999, -13875718, -13832338, -13788859, -13745282,
+ -13701608, -13657836, -13613968, -13570004, -13525944, -13481788,
+ -13437539, -13393195, -13348757, -13304226, -13259603, -13214888,
+ -13170081, -13125182, -13080194, -13035115, -12989946, -12944689,
+ -12899343, -12853908, -12808387, -12762778, -12717082, -12671301,
+ -12625434, -12579482, -12533446, -12487325, -12441121, -12394834,
+ -12348465, -12302013, -12255481, -12208867, -12162173, -12115399,
+ -12068545, -12021613, -11974602, -11927514, -11880348, -11833105,
+ -11785786, -11738392, -11690922, -11643377, -11595758, -11548066,
+ -11500300, -11452461, -11404551, -11356569, -11308515, -11260391,
+ -11212197, -11163934, -11115601, -11067200, -11018731, -10970195,
+ -10921591, -10872921, -10824186, -10775385, -10726519, -10677588,
+ -10628594, -10579537, -10530417, -10481235, -10431990, -10382685,
+ -10333319, -10283893, -10234408, -10184863, -10135260, -10085598,
+ -10035880, -9986104, -9936272, -9886383, -9836440, -9786441, -9736389,
+ -9686282, -9636122, -9585909, -9535644, -9485328, -9434960, -9384541,
+ -9334073, -9283554, -9232987, -9182371, -9131707, -9080996, -9030237,
+ -8979432, -8928581, -8877685, -8826744, -8775759, -8724730, -8673657,
+ -8622542, -8571384, -8520185, -8468945, -8417664, -8366343, -8314982,
+ -8263582, -8212144, -8160668, -8109154, -8057603, -8006016, -7954393,
+ -7902735, -7851042, -7799314, -7747553, -7695758, -7643931, -7592071,
+ -7540180, -7488257, -7436304, -7384321, -7332308, -7280267, -7228196,
+ -7176098, -7123972, -7071820, -7019640, -6967435, -6915205, -6862950,
+ -6810670, -6758367, -6706040, -6653691, -6601319, -6548926, -6496511,
+ -6444076, -6391621, -6339146, -6286652, -6234139, -6181609, -6129060,
+ -6076495, -6023914, -5971316, -5918703, -5866075, -5813433, -5760777,
+ -5708107, -5655425, -5602730, -5550023, -5497306, -5444577, -5391838,
+ -5339090, -5286332, -5233566, -5180791, -5128009, -5075219, -5022423,
+ -4969621, -4916813, -4864001, -4811183, -4758362, -4705537, -4652709,
+ -4599878, -4547046, -4494212, -4441377, -4388542, -4335706, -4282872,
+ -4230038, -4177206, -4124376, -4071548, -4018724, -3965903, -3913086,
+ -3860274, -3807468, -3754666, -3701871, -3649083, -3596302, -3543528,
+ -3490763, -3438006, -3385258, -3332521, -3279793, -3227076, -3174370,
+ -3121676, -3068994, -3016324, -2963668, -2911026, -2858398, -2805784,
+ -2753186, -2700603, -2648036, -2595486, -2542953, -2490438, -2437941,
+ -2385463, -2333004, -2280564, -2228145, -2175746, -2123368, -2071012,
+ -2018677, -1966366, -1914077, -1861812, -1809571, -1757355, -1705163,
+ -1652997, -1600857, -1548743, -1496657, -1444597, -1392566, -1340563,
+ -1288589, -1236644, -1184729, -1132844, -1080990, -1029167, -977376,
+ -925617, -873891, -822198, -770538, -718913, -667322, -615766, -564246,
+ -512762, -461314, -409903, -358529, -307193, -255896, -204637, -153418,
+ -102238, -51098, 0, 51057, 102074, 153048, 203980, 254869, 305714,
+ 356516, 407273, 457986, 508654, 559275, 609851, 660380, 710862, 761297,
+ 811684, 862022, 912311, 962552, 1012742, 1062883, 1112972, 1163011,
+ 1212998, 1262934, 1312817, 1362647, 1412424, 1462147, 1511816, 1561431,
+ 1610990, 1660495, 1709943, 1759335, 1808670, 1857948, 1907169, 1956331,
+ 2005435, 2054480, 2103466, 2152392, 2201258, 2250063, 2298808, 2347490,
+ 2396112, 2444670, 2493166, 2541599, 2589969, 2638274, 2686515, 2734692,
+ 2782803, 2830849, 2878828, 2926741, 2974588, 3022367, 3070078, 3117721,
+ 3165296, 3212802, 3260239, 3307606, 3354903, 3402130, 3449285, 3496369,
+ 3543382, 3590323, 3637191, 3683986, 3730708, 3777356, 3823931, 3870431,
+ 3916856, 3963205, 4009480, 4055678, 4101800, 4147845, 4193813, 4239703,
+ 4285516, 4331250, 4376906, 4422482, 4467979, 4513396, 4558734, 4603990,
+ 4649166, 4694260, 4739273, 4784204, 4829052, 4873818, 4918500, 4963099,
+ 5007614, 5052045, 5096391, 5140652, 5184828, 5228918, 5272923, 5316841,
+ 5360672, 5404416, 5448072, 5491641, 5535122, 5578514, 5621818, 5665032,
+ 5708156, 5751191, 5794136, 5836990, 5879753, 5922424, 5965005, 6007493,
+ 6049889, 6092192, 6134403, 6176520, 6218544, 6260474, 6302309, 6344050,
+ 6385696, 6427247, 6468702, 6510061, 6551324, 6592491, 6633560, 6674533,
+ 6715408, 6756185, 6796864, 6837445, 6877927, 6918310, 6958593, 6998777,
+ 7038861, 7078844, 7118727, 7158509, 7198190, 7237770, 7277247, 7316622,
+ 7355895, 7395066, 7434133, 7473097, 7511957, 7550714, 7589366, 7627914,
+ 7666357, 7704695, 7742928, 7781055, 7819077, 7856992, 7894801, 7932502,
+ 7970097, 8007585, 8044965, 8082237, 8119402, 8156457, 8193404, 8230243,
+ 8266972, 8303591, 8340101, 8376501, 8412790, 8448970, 8485038, 8520995,
+ 8556841, 8592576, 8628198, 8663709, 8699107, 8734393, 8769566, 8804626,
+ 8839572, 8874405, 8909125, 8943730, 8978221, 9012597, 9046859, 9081005,
+ 9115037, 9148953, 9182753, 9216437, 9250006, 9283457, 9316792, 9350011,
+ 9383112, 9416096, 9448962, 9481711, 9514341, 9546854, 9579248, 9611523,
+ 9643680, 9675717, 9707636, 9739434, 9771113, 9802672, 9834112, 9865430,
+ 9896628, 9927706, 9958662, 9989498, 10020212, 10050805, 10081275,
+ 10111624, 10141851, 10171956, 10201938, 10231797, 10261533, 10291147,
+ 10320637, 10350004, 10379247, 10408366, 10437361, 10466233, 10494979,
+ 10523602, 10552099, 10580472, 10608720, 10636842, 10664839, 10692711,
+ 10720457, 10748077, 10775571, 10802938, 10830180, 10857295, 10884283,
+ 10911144, 10937878, 10964486, 10990965, 11017318, 11043543, 11069640,
+ 11095609, 11121450, 11147163, 11172747, 11198203, 11223530, 11248729,
+ 11273799, 11298739, 11323551, 11348233, 11372786, 11397209, 11421502,
+ 11445666, 11469699, 11493603, 11517376, 11541019, 11564532, 11587914,
+ 11611165, 11634285, 11657275, 11680133, 11702860, 11725456, 11747921,
+ 11770254, 11792455, 11814525, 11836463, 11858269, 11879943, 11901485,
+ 11922894, 11944172, 11965316, 11986329, 12007209, 12027956, 12048570,
+ 12069051, 12089399, 12109615, 12129697, 12149646, 12169461, 12189144,
+ 12208692, 12228107, 12247389, 12266537, 12285551, 12304431, 12323177,
+ 12341789, 12360267, 12378611, 12396821, 12414896, 12432837, 12450644,
+ 12468316, 12485853, 12503256, 12520525, 12537659, 12554657, 12571522,
+ 12588251, 12604845, 12621304, 12637629, 12653818, 12669872, 12685791,
+ 12701575, 12717223, 12732737, 12748115, 12763357, 12778465, 12793436,
+ 12808273, 12822974, 12837539, 12851969, 12866263, 12880421, 12894444,
+ 12908332, 12922083, 12935699, 12949180, 12962524, 12975733, 12988806,
+ 13001743, 13014544, 13027210, 13039740, 13052134, 13064392, 13076514,
+ 13088501, 13100351, 13112066, 13123645, 13135088, 13146395, 13157566,
+ 13168602, 13179501, 13190265, 13200893, 13211385, 13221742, 13231962,
+ 13242047, 13251996, 13261809, 13271487, 13281029, 13290435, 13299705,
+ 13308840, 13317839, 13326703, 13335431, 13344023, 13352480, 13360802,
+ 13368988, 13377038, 13384954, 13392733, 13400378, 13407887, 13415261,
+ 13422500, 13429604, 13436572, 13443406, 13450104, 13456668, 13463096,
+ 13469390, 13475549, 13481573, 13487463, 13493217, 13498837, 13504323,
+ 13509674, 13514891, 13519973, 13524921, 13529735, 13534414, 13538960,
+ 13543371, 13547648, 13551792, 13555801, 13559677, 13563420, 13567028,
+ 13570503, 13573845, 13577053, 13580128, 13583069, 13585878, 13588553,
+ 13591096, 13593506, 13595782, 13597926, 13599938, 13601817, 13603563,
+ 13605177, 13606659, 13608009, 13609227, 13610313, 13611266, 13612088,
+ 13612779, 13613338, 13613765, 13614061, 13614226, 13614260, 13614163,
+ 13613934, 13613575, 13613086, 13612465, 13611715, 13610834, 13609822,
+ 13608681, 13607410, 13606008, 13604477, 13602817, 13601027, 13599107,
+ 13597058, 13594880, 13592574, 13590138, 13587573, 13584880, 13582059,
+ 13579109, 13576031, 13572825, 13569491, 13566029, 13562440, 13558723,
+ 13554879, 13550907, 13546809, 13542583, 13538231, 13533752, 13529147,
+ 13524415, 13519557, 13514573, 13509464, 13504228, 13498867, 13493381,
+ 13487769, 13482032, 13476171, 13470184, 13464073, 13457838, 13451478,
+ 13444995, 13438387, 13431655, 13424800, 13417822, 13410720, 13403495,
+ 13396147, 13388677, 13381084, 13373368, 13365531, 13357571, 13349489,
+ 13341286, 13332961, 13324515, 13315948, 13307260, 13298451, 13289522,
+ 13280472, 13271302, 13262012, 13252602, 13243073, 13233424, 13223656,
+ 13213769, 13203763, 13193638, 13183395, 13173034, 13162555, 13151957,
+ 13141242, 13130410, 13119461, 13108394, 13097211, 13085911, 13074494,
+ 13062962, 13051313, 13039549, 13027669, 13015673, 13003563, 12991337,
+ 12978997, 12966543, 12953974, 12941291, 12928494, 12915583, 12902560,
+ 12889423, 12876172, 12862810, 12849334, 12835747, 12822047, 12808236,
+ 12794313, 12780278, 12766133, 12751876, 12737509, 12723031, 12708443,
+ 12693745, 12678938, 12664021, 12648994, 12633859, 12618614, 12603262,
+ 12587800, 12572231, 12556554, 12540769, 12524877, 12508878, 12492772,
+ 12476560, 12460241, 12443816, 12427285, 12410648, 12393906, 12377059,
+ 12360107, 12343051, 12325890, 12308625, 12291256, 12273784, 12256208,
+ 12238529, 12220747, 12202863, 12184876, 12166788, 12148598, 12130306,
+ 12111913, 12093418, 12074824, 12056128, 12037333, 12018437, 11999442,
+ 11980348, 11961154, 11941862, 11922471, 11902982, 11883394, 11863709,
+ 11843927, 11824047, 11804070, 11783997, 11763827, 11743561, 11723199,
+ 11702742, 11682190, 11661542, 11640800, 11619963, 11599032, 11578008,
+ 11556890, 11535678, 11514374, 11492976, 11471487, 11449905, 11428231,
+ 11406466, 11384609, 11362661, 11340623, 11318494, 11296276, 11273967,
+ 11251569, 11229081, 11206505, 11183840, 11161086, 11138245, 11115316,
+ 11092299, 11069195, 11046004, 11022727, 10999363, 10975914, 10952378,
+ 10928758, 10905052, 10881261, 10857386, 10833427, 10809384, 10785258,
+ 10761048, 10736755, 10712379, 10687922, 10663382, 10638760, 10614058,
+ 10589274, 10564409, 10539463, 10514438, 10489333, 10464148, 10438884,
+ 10413541, 10388119, 10362619, 10337041, 10311386, 10285653, 10259843,
+ 10233956, 10207993, 10181954, 10155839, 10129648, 10103383, 10077043,
+ 10050628, 10024139, 9997576, 9970940, 9944230, 9917447, 9890592,
+ 9863665, 9836666, 9809595, 9782453, 9755240, 9727956, 9700602, 9673178,
+ 9645685, 9618122, 9590490, 9562790, 9535021, 9507184, 9479279, 9451307,
+ 9423268, 9395162, 9366990, 9338752, 9310449, 9282079, 9253645, 9225146,
+ 9196583, 9167956, 9139265, 9110510, 9081693, 9052812, 9023870, 8994865,
+ 8965799, 8936671, 8907483, 8878233, 8848923, 8819553, 8790124, 8760635,
+ 8731087, 8701480, 8671815, 8642092, 8612312, 8582474, 8552579, 8522627,
+ 8492619, 8462555, 8432436, 8402261, 8372031, 8341747, 8311408, 8281016,
+ 8250569, 8220070, 8189518, 8158913, 8128256, 8097547, 8066786, 8035974,
+ 8005112, 7974199, 7943235, 7912222, 7881160, 7850048, 7818887, 7787679,
+ 7756422, 7725117, 7693765, 7662365, 7630919, 7599427, 7567889, 7536305,
+ 7504675, 7473001, 7441282, 7409519, 7377711, 7345861, 7313966, 7282029,
+ 7250050, 7218028, 7185964, 7153859, 7121713, 7089526, 7057298, 7025030,
+ 6992723, 6960376, 6927990, 6895565, 6863102, 6830601, 6798062, 6765486,
+ 6732872, 6700223, 6667536, 6634814, 6602057, 6569264, 6536436, 6503573,
+ 6470677, 6437746, 6404782, 6371785, 6338755, 6305693, 6272598, 6239472,
+ 6206315, 6173126, 6139906, 6106657, 6073377, 6040067, 6006729, 5973361,
+ 5939965, 5906540, 5873088, 5839607, 5806100, 5772566, 5739005, 5705418,
+ 5671806, 5638168, 5604504, 5570816, 5537104, 5503367, 5469607, 5435823,
+ 5402017, 5368187, 5334336, 5300462, 5266567, 5232650, 5198713, 5164754,
+ 5130776, 5096778, 5062760, 5028723, 4994667, 4960593, 4926500, 4892390,
+ 4858262, 4824117, 4789955, 4755777, 4721583, 4687373, 4653147, 4618907,
+ 4584652, 4550382, 4516099, 4481802, 4447491, 4413168, 4378832, 4344484,
+ 4310123, 4275751, 4241368, 4206974, 4172570, 4138155, 4103730, 4069296,
+ 4034853, 4000401, 3965940, 3931471, 3896994, 3862510, 3828019, 3793521,
+ 3759016, 3724506, 3689989, 3655468, 3620941, 3586409, 3551873, 3517333,
+ 3482789, 3448242, 3413691, 3379138, 3344583, 3310025, 3275466, 3240906,
+ 3206344, 3171782, 3137220, 3102657, 3068095, 3033533, 2998973, 2964413,
+ 2929856, 2895300, 2860747, 2826196, 2791649, 2757104, 2722564, 2688027,
+ 2653495, 2618967, 2584445, 2549927, 2515416, 2480910, 2446411, 2411918,
+ 2377432, 2342954, 2308483, 2274020, 2239566, 2205120, 2170683, 2136255,
+ 2101837, 2067429, 2033031, 1998644, 1964268, 1929902, 1895549, 1861207,
+ 1826877, 1792560, 1758256, 1723965, 1689688, 1655424, 1621174, 1586939,
+ 1552719, 1518514, 1484324, 1450150, 1415992, 1381850, 1347725, 1313617,
+ 1279526, 1245453, 1211398, 1177361, 1143343, 1109344, 1075364, 1041403,
+ 1007462, 973542, 939642, 905762, 871904, 838067, 804252, 770459,
+ 736688, 702940, 669215, 635513, 601834, 568180, 534549, 500944, 467363,
+ 433806, 400276, 366771, 333292, 299839, 266413, 233014, 199643, 166298,
+ 132982, 99693, 66433, 33202, 0, -33173, -66316, -99429, -132513,
+ -165566, -198588, -231579, -264538, -297466, -330362, -363226, -396057,
+ -428855, -461620, -494352, -527050, -559714, -592344, -624940, -657500,
+ -690025, -722515, -754969, -787387, -819769, -852115, -884423, -916694,
+ -948928, -981125, -1013283, -1045403, -1077485, -1109527, -1141531,
+ -1173495, -1205420, -1237305, -1269149, -1300953, -1332717, -1364439,
+ -1396120, -1427760, -1459357, -1490913, -1522426, -1553897, -1585324,
+ -1616709, -1648050, -1679347, -1710601, -1741810, -1772975, -1804095,
+ -1835170, -1866199, -1897183, -1928122, -1959014, -1989860, -2020659,
+ -2051411, -2082117, -2112775, -2143385, -2173948, -2204462, -2234928,
+ -2265345, -2295713, -2326033, -2356303, -2386523, -2416693, -2446813,
+ -2476883, -2506902, -2536870, -2566787, -2596653, -2626467, -2656229,
+ -2685939, -2715597, -2745202, -2774754, -2804253, -2833699, -2863092,
+ -2892430, -2921714, -2950945, -2980120, -3009241, -3038307, -3067318,
+ -3096273, -3125172, -3154016, -3182803, -3211534, -3240209, -3268826,
+ -3297387, -3325890, -3354336, -3382724, -3411054, -3439326, -3467539,
+ -3495694, -3523789, -3551826, -3579804, -3607722, -3635580, -3663378,
+ -3691116, -3718794, -3746411, -3773967, -3801462, -3828896, -3856268,
+ -3883579, -3910828, -3938015, -3965139, -3992201, -4019200, -4046136,
+ -4073009, -4099819, -4126565, -4153248, -4179866, -4206420, -4232910,
+ -4259336, -4285696, -4311992, -4338222, -4364387, -4390487, -4416521,
+ -4442488, -4468390, -4494226, -4519994, -4545696, -4571332, -4596900,
+ -4622401, -4647834, -4673200, -4698497, -4723727, -4748889, -4773982,
+ -4799006, -4823962, -4848849, -4873667, -4898415, -4923094, -4947703,
+ -4972243, -4996712, -5021111, -5045440, -5069698, -5093885, -5118002,
+ -5142047, -5166022, -5189925, -5213756, -5237515, -5261203, -5284818,
+ -5308362, -5331833, -5355231, -5378556, -5401809, -5424989, -5448095,
+ -5471128, -5494087, -5516973, -5539785, -5562523, -5585186, -5607776,
+ -5630291, -5652731, -5675096, -5697387, -5719602, -5741743, -5763807,
+ -5785797, -5807710, -5829548, -5851310, -5872996, -5894605, -5916139,
+ -5937595, -5958975, -5980278, -6001504, -6022653, -6043725, -6064720,
+ -6085636, -6106476, -6127237, -6147921, -6168527, -6189054, -6209503,
+ -6229874, -6250166, -6270380, -6290514, -6310570, -6330547, -6350444,
+ -6370263, -6390002, -6409661, -6429240, -6448740, -6468160, -6487500,
+ -6506760, -6525940, -6545039, -6564057, -6582996, -6601853, -6620630,
+ -6639325, -6657940, -6676473, -6694926, -6713296, -6731586, -6749794,
+ -6767920, -6785964, -6803927, -6821807, -6839606, -6857322, -6874956,
+ -6892508, -6909977, -6927363, -6944667, -6961888, -6979027, -6996082,
+ -7013054, -7029944, -7046750, -7063472, -7080112, -7096667, -7113140,
+ -7129528, -7145833, -7162054, -7178191, -7194244, -7210214, -7226098,
+ -7241899, -7257616, -7273248, -7288795, -7304258, -7319637, -7334931,
+ -7350140, -7365264, -7380303, -7395258, -7410127, -7424911, -7439610,
+ -7454224, -7468752, -7483196, -7497553, -7511826, -7526012, -7540113,
+ -7554129, -7568059, -7581902, -7595660, -7609333, -7622919, -7636419,
+ -7649833, -7663161, -7676403, -7689558, -7702628, -7715611, -7728507,
+ -7741317, -7754041, -7766678, -7779229, -7791693, -7804071, -7816361,
+ -7828565, -7840683, -7852713, -7864657, -7876513, -7888283, -7899966,
+ -7911562, -7923070, -7934492, -7945827, -7957074, -7968235, -7979308,
+ -7990294, -8001193, -8012004, -8022728, -8033365, -8043915, -8054377,
+ -8064751, -8075039, -8085239, -8095351, -8105376, -8115314, -8125164,
+ -8134926, -8144601, -8154188, -8163688, -8173100, -8182425, -8191662,
+ -8200811, -8209873, -8218847, -8227734, -8236533, -8245244, -8253867,
+ -8262403, -8270851, -8279212, -8287485, -8295670, -8303767, -8311777,
+ -8319699, -8327534, -8335281, -8342940, -8350511, -8357995, -8365391,
+ -8372700, -8379921, -8387054, -8394100, -8401058, -8407929, -8414712,
+ -8421407, -8428015, -8434535, -8440968, -8447313, -8453571, -8459742,
+ -8465825, -8471820, -8477728, -8483549, -8489283, -8494929, -8500488,
+ -8505959, -8511343, -8516640, -8521850, -8526973, -8532008, -8536957,
+ -8541818, -8546593, -8551280, -8555880, -8560394, -8564820, -8569160,
+ -8573413, -8577579, -8581658, -8585650, -8589556, -8593375, -8597108,
+ -8600754, -8604313, -8607787, -8611173, -8614474, -8617687, -8620815,
+ -8623857, -8626812, -8629681, -8632464, -8635161, -8637772, -8640297,
+ -8642737, -8645090, -8647358, -8649540, -8651636, -8653647, -8655572,
+ -8657412, -8659167, -8660836, -8662419, -8663918, -8665331, -8666660,
+ -8667903, -8669061, -8670135, -8671123, -8672027, -8672846, -8673581,
+ -8674231, -8674796, -8675277, -8675674, -8675986, -8676215, -8676359,
+ -8676419, -8676395, -8676288, -8676096, -8675821, -8675462, -8675020,
+ -8674494, -8673885, -8673192, -8672416, -8671557, -8670615, -8669590,
+ -8668482, -8667291, -8666018, -8664662, -8663223, -8661702, -8660099,
+ -8658413, -8656645, -8654795, -8652863, -8650849, -8648754, -8646576,
+ -8644317, -8641977, -8639555, -8637052, -8634468, -8631802, -8629056,
+ -8626228, -8623320, -8620331, -8617261, -8614111, -8610881, -8607570,
+ -8604179, -8600708, -8597157, -8593526, -8589816, -8586026, -8582156,
+ -8578207, -8574178, -8570071, -8565884, -8561618, -8557274, -8552851,
+ -8548349, -8543768, -8539109, -8534372, -8529557, -8524664, -8519693,
+ -8514644, -8509517, -8504313, -8499032, -8493673, -8488237, -8482724,
+ -8477134, -8471467, -8465723, -8459903, -8454007, -8448034, -8441985,
+ -8435860, -8429659, -8423383, -8417031, -8410603, -8404100, -8397521,
+ -8390868, -8384139, -8377336, -8370458, -8363505, -8356478, -8349377,
+ -8342202, -8334952, -8327629, -8320232, -8312761, -8305217, -8297600,
+ -8289909, -8282146, -8274309, -8266400, -8258418, -8250364, -8242237,
+ -8234039, -8225768, -8217425, -8209011, -8200525, -8191968, -8183339,
+ -8174640, -8165869, -8157028, -8148116, -8139133, -8130080, -8120957,
+ -8111764, -8102501, -8093168, -8083766, -8074294, -8064753, -8055143,
+ -8045463, -8035716, -8025899, -8016014, -8006061, -7996039, -7985950,
+ -7975793, -7965568, -7955275, -7944916, -7934489, -7923995, -7913434,
+ -7902807, -7892113, -7881352, -7870526, -7859633, -7848675, -7837651,
+ -7826562, -7815407, -7804187, -7792902, -7781552, -7770137, -7758658,
+ -7747115, -7735508, -7723836, -7712101, -7700303, -7688440, -7676515,
+ -7664526, -7652475, -7640361, -7628184, -7615945, -7603644, -7591280,
+ -7578855, -7566368, -7553820, -7541210, -7528539, -7515808, -7503015,
+ -7490162, -7477249, -7464275, -7451241, -7438148, -7424995, -7411782,
+ -7398510, -7385179, -7371789, -7358340, -7344833, -7331267, -7317643,
+ -7303961, -7290222, -7276424, -7262570, -7248658, -7234689, -7220663,
+ -7206581, -7192442, -7178246, -7163995, -7149688, -7135325, -7120906,
+ -7106433, -7091904, -7077320, -7062681, -7047988, -7033241, -7018439,
+ -7003583, -6988674, -6973711, -6958695, -6943625, -6928503, -6913328,
+ -6898100, -6882820, -6867487, -6852103, -6836667, -6821179, -6805640,
+ -6790050, -6774408, -6758716, -6742974, -6727181, -6711337, -6695444,
+ -6679501, -6663509, -6647467, -6631376, -6615236, -6599047, -6582809,
+ -6566524, -6550190, -6533808, -6517379, -6500902, -6484377, -6467806,
+ -6451187, -6434522, -6417811, -6401053, -6384249, -6367399, -6350503,
+ -6333562, -6316576, -6299545, -6282469, -6265348, -6248183, -6230974,
+ -6213721, -6196423, -6179083, -6161699, -6144272, -6126802, -6109289,
+ -6091733, -6074136, -6056496, -6038814, -6021091, -6003326, -5985520,
+ -5967673, -5949786, -5931857, -5913888, -5895879, -5877830, -5859742,
+ -5841614, -5823446, -5805239, -5786994, -5768710, -5750387, -5732026,
+ -5713627, -5695191, -5676717, -5658205, -5639656, -5621070, -5602448,
+ -5583789, -5565094, -5546362, -5527595, -5508792, -5489954, -5471081,
+ -5452172, -5433229, -5414251, -5395239, -5376193, -5357113, -5337999,
+ -5318852, -5299672, -5280458, -5261212, -5241933, -5222622, -5203279,
+ -5183904, -5164497, -5145058, -5125589, -5106088, -5086557, -5066994,
+ -5047402, -5027779, -5008127, -4988445, -4968733, -4948992, -4929222,
+ -4909423, -4889595, -4869740, -4849856, -4829944, -4810004, -4790037,
+ -4770042, -4750021, -4729972, -4709897, -4689796, -4669668, -4649515,
+ -4629336, -4609131, -4588901, -4568646, -4548366, -4528061, -4507732,
+ -4487379, -4467002, -4446602, -4426177, -4405730, -4385259, -4364766,
+ -4344250, -4323711, -4303151, -4282568, -4261964, -4241338, -4220691,
+ -4200023, -4179334, -4158624, -4137895, -4117144, -4096374, -4075585,
+ -4054775, -4033947, -4013099, -3992233, -3971348, -3950444, -3929523,
+ -3908583, -3887626, -3866651, -3845659, -3824650, -3803624, -3782581,
+ -3761523, -3740447, -3719356, -3698250, -3677127, -3655990, -3634837,
+ -3613670, -3592488, -3571291, -3550081, -3528856, -3507618, -3486366,
+ -3465101, -3443823, -3422532, -3401228, -3379912, -3358584, -3337244,
+ -3315892, -3294528, -3273154, -3251768, -3230371, -3208964, -3187546,
+ -3166118, -3144680, -3123233, -3101775, -3080309, -3058833, -3037349,
+ -3015855, -2994354, -2972844, -2951326, -2929800, -2908267, -2886727,
+ -2865179, -2843624, -2822063, -2800495, -2778921, -2757341, -2735755,
+ -2714163, -2692566, -2670964, -2649357, -2627745, -2606128, -2584508,
+ -2562883, -2541254, -2519622, -2497986, -2476347, -2454705, -2433060,
+ -2411412, -2389763, -2368111, -2346457, -2324801, -2303144, -2281485,
+ -2259826, -2238165, -2216504, -2194842, -2173180, -2151518, -2129857,
+ -2108195, -2086535, -2064875, -2043216, -2021558, -1999902, -1978248,
+ -1956595, -1934945, -1913296, -1891651, -1870008, -1848367, -1826731,
+ -1805097, -1783467, -1761841, -1740218, -1718600, -1696986, -1675377,
+ -1653773, -1632173, -1610579, -1588990, -1567407, -1545830, -1524259,
+ -1502694, -1481135, -1459583, -1438038, -1416500, -1394970, -1373446,
+ -1351931, -1330423, -1308924, -1287432, -1265949, -1244475, -1223010,
+ -1201554, -1180107, -1158670, -1137242, -1115824, -1094417, -1073019,
+ -1051632, -1030256, -1008891, -987537, -966194, -944863, -923543,
+ -902235, -880939, -859656, -838385, -817127, -795881, -774649, -753430,
+ -732224, -711032, -689854, -668690, -647540, -626405, -605284, -584178,
+ -563087, -542012, -520951, -499906, -478877, -457864, -436868, -415887,
+ -394923, -373976, -353045, -332132, -311236, -290358, -269497, -248654,
+ -227829, -207023, -186234, -165465, -144714, -123982, -103269, -82576,
+ -61902, -41248, -20614, 0, 20593, 41167, 61720, 82252, 102763, 123253,
+ 143721, 164168, 184594, 204997, 225378, 245737, 266074, 286388, 306680,
+ 326948, 347193, 367415, 387614, 407788, 427939, 448066, 468169, 488247,
+ 508301, 528331, 548335, 568314, 588268, 608197, 628100, 647978, 667829,
+ 687655, 707454, 727227, 746973, 766692, 786385, 806050, 825689, 845300,
+ 864883, 884438, 903966, 923466, 942937, 962380, 981794, 1001180,
+ 1020537, 1039865, 1059163, 1078433, 1097672, 1116882, 1136063, 1155213,
+ 1174333, 1193422, 1212482, 1231510, 1250508, 1269475, 1288411, 1307315,
+ 1326188, 1345030, 1363839, 1382617, 1401363, 1420077, 1438758, 1457407,
+ 1476023, 1494607, 1513157, 1531675, 1550159, 1568610, 1587027, 1605411,
+ 1623761, 1642077, 1660358, 1678606, 1696819, 1714997, 1733141, 1751250,
+ 1769324, 1787363, 1805366, 1823335, 1841267, 1859164, 1877025, 1894850,
+ 1912639, 1930392, 1948108, 1965788, 1983431, 2001037, 2018607, 2036139,
+ 2053634, 2071092, 2088512, 2105895, 2123239, 2140546, 2157815, 2175046,
+ 2192239, 2209393, 2226508, 2243585, 2260623, 2277622, 2294583, 2311504,
+ 2328385, 2345227, 2362030, 2378793, 2395516, 2412199, 2428842, 2445445,
+ 2462007, 2478530, 2495011, 2511452, 2527852, 2544211, 2560529, 2576806,
+ 2593042, 2609236, 2625389, 2641500, 2657569, 2673597, 2689582, 2705526,
+ 2721427, 2737286, 2753102, 2768876, 2784607, 2800296, 2815941, 2831544,
+ 2847103, 2862619, 2878092, 2893521, 2908907, 2924249, 2939548, 2954802,
+ 2970013, 2985179, 3000301, 3015379, 3030413, 3045402, 3060346, 3075246,
+ 3090101, 3104911, 3119676, 3134396, 3149070, 3163700, 3178284, 3192822,
+ 3207315, 3221762, 3236163, 3250519, 3264828, 3279091, 3293308, 3307479,
+ 3321604, 3335682, 3349713, 3363698, 3377636, 3391527, 3405372, 3419169,
+ 3432919, 3446623, 3460278, 3473887, 3487448, 3500961, 3514427, 3527845,
+ 3541216, 3554538, 3567813, 3581039, 3594218, 3607348, 3620430, 3633463,
+ 3646449, 3659385, 3672273, 3685113, 3697903, 3710645, 3723338, 3735982,
+ 3748576, 3761122, 3773619, 3786066, 3798464, 3810812, 3823111, 3835360,
+ 3847560, 3859710, 3871810, 3883861, 3895861, 3907812, 3919712, 3931563,
+ 3943363, 3955113, 3966812, 3978461, 3990060, 4001608, 4013106, 4024553,
+ 4035950, 4047295, 4058590, 4069834, 4081027, 4092169, 4103260, 4114299,
+ 4125288, 4136226, 4147112, 4157946, 4168730, 4179462, 4190142, 4200771,
+ 4211348, 4221874, 4232348, 4242770, 4253140, 4263459, 4273726, 4283940,
+ 4294103, 4304213, 4314272, 4324278, 4334232, 4344134, 4353984, 4363781,
+ 4373526, 4383218, 4392858, 4402446, 4411981, 4421463, 4430893, 4440270,
+ 4449594, 4458866, 4468085, 4477251, 4486364, 4495424, 4504432, 4513386,
+ 4522287, 4531136, 4539931, 4548673, 4557362, 4565998, 4574581, 4583111,
+ 4591587, 4600010, 4608380, 4616696, 4624959, 4633168, 4641324, 4649427,
+ 4657476, 4665472, 4673414, 4681303, 4689138, 4696919, 4704647, 4712322,
+ 4719942, 4727509, 4735022, 4742482, 4749887, 4757239, 4764537, 4771782,
+ 4778972, 4786109, 4793192, 4800221, 4807196, 4814117, 4820985, 4827798,
+ 4834558, 4841263, 4847915, 4854513, 4861056, 4867546, 4873982, 4880364,
+ 4886691, 4892965, 4899185, 4905351, 4911462, 4917520, 4923523, 4929473,
+ 4935368, 4941210, 4946997, 4952730, 4958410, 4964035, 4969606, 4975123,
+ 4980586, 4985995, 4991350, 4996651, 5001897, 5007090, 5012229, 5017313,
+ 5022344, 5027321, 5032243, 5037112, 5041926, 5046687, 5051393, 5056046,
+ 5060644, 5065189, 5069679, 5074116, 5078499, 5082827, 5087102, 5091323,
+ 5095490, 5099604, 5103663, 5107668, 5111620, 5115518, 5119362, 5123152,
+ 5126889, 5130572, 5134201, 5137776, 5141298, 5144766, 5148180, 5151541,
+ 5154848, 5158102, 5161302, 5164448, 5167541, 5170581, 5173567, 5176499,
+ 5179378, 5182204, 5184976, 5187695, 5190361, 5192974, 5195533, 5198039,
+ 5200492, 5202892, 5205238, 5207532, 5209772, 5211959, 5214094, 5216175,
+ 5218204, 5220179, 5222102, 5223972, 5225789, 5227553, 5229265, 5230924,
+ 5232530, 5234084, 5235585, 5237033, 5238430, 5239773, 5241064, 5242303,
+ 5243490, 5244624, 5245706, 5246736, 5247714, 5248639, 5249513, 5250334,
+ 5251104, 5251821, 5252487, 5253101, 5253663, 5254173, 5254632, 5255039,
+ 5255394, 5255698, 5255950, 5256151, 5256300, 5256398, 5256445, 5256441,
+ 5256385, 5256279, 5256121, 5255912, 5255652, 5255341, 5254980, 5254567,
+ 5254104, 5253590, 5253026, 5252411, 5251745, 5251029, 5250263, 5249446,
+ 5248579, 5247661, 5246694, 5245676, 5244609, 5243491, 5242324, 5241106,
+ 5239839, 5238522, 5237156, 5235740, 5234274, 5232759, 5231194, 5229580,
+ 5227917, 5226205, 5224443, 5222633, 5220773, 5218865, 5216908, 5214902,
+ 5212847, 5210743, 5208591, 5206391, 5204142, 5201845, 5199499, 5197105,
+ 5194663, 5192173, 5189635, 5187049, 5184415, 5181734, 5179005, 5176228,
+ 5173403, 5170532, 5167612, 5164646, 5161632, 5158571, 5155463, 5152308,
+ 5149106, 5145858, 5142562, 5139220, 5135831, 5132396, 5128915, 5125387,
+ 5121812, 5118192, 5114526, 5110813, 5107055, 5103250, 5099400, 5095505,
+ 5091563, 5087577, 5083544, 5079467, 5075344, 5071176, 5066963, 5062706,
+ 5058403, 5054055, 5049663, 5045226, 5040745, 5036219, 5031649, 5027034,
+ 5022375, 5017673, 5012926, 5008136, 5003301, 4998423, 4993502, 4988537,
+ 4983528, 4978476, 4973381, 4968243, 4963062, 4957837, 4952570, 4947261,
+ 4941908, 4936513, 4931076, 4925596, 4920074, 4914510, 4908904, 4903255,
+ 4897565, 4891834, 4886060, 4880245, 4874389, 4868491, 4862552, 4856571,
+ 4850550, 4844488, 4838385, 4832241, 4826056, 4819831, 4813566, 4807260,
+ 4800914, 4794528, 4788101, 4781635, 4775129, 4768584, 4761999, 4755374,
+ 4748710, 4742006, 4735264, 4728482, 4721662, 4714802, 4707904, 4700968,
+ 4693992, 4686979, 4679927, 4672837, 4665709, 4658542, 4651338, 4644097,
+ 4636817, 4629500, 4622146, 4614754, 4607325, 4599859, 4592356, 4584817,
+ 4577240, 4569627, 4561978, 4554292, 4546569, 4538811, 4531016, 4523186,
+ 4515320, 4507418, 4499480, 4491507, 4483499, 4475455, 4467376, 4459262,
+ 4451114, 4442930, 4434712, 4426459, 4418172, 4409851, 4401495, 4393106,
+ 4384682, 4376225, 4367733, 4359209, 4350650, 4342059, 4333434, 4324776,
+ 4316085, 4307361, 4298605, 4289816, 4280994, 4272140, 4263254, 4254335,
+ 4245385, 4236402, 4227388, 4218342, 4209265, 4200156, 4191016, 4181845,
+ 4172642, 4163409, 4154145, 4144850, 4135525, 4126170, 4116784, 4107368,
+ 4097922, 4088445, 4078940, 4069404, 4059839, 4050245, 4040621, 4030968,
+ 4021286, 4011575, 4001835, 3992067, 3982270, 3972445, 3962591, 3952710,
+ 3942800, 3932862, 3922897, 3912904, 3902883, 3892835, 3882760, 3872658,
+ 3862528, 3852372, 3842189, 3831980, 3821744, 3811481, 3801193, 3790878,
+ 3780537, 3770171, 3759779, 3749361, 3738918, 3728449, 3717955, 3707436,
+ 3696893, 3686324, 3675731, 3665113, 3654471, 3643805, 3633114, 3622400,
+ 3611661, 3600899, 3590114, 3579304, 3568472, 3557616, 3546737, 3535835,
+ 3524911, 3513963, 3502993, 3492001, 3480986, 3469950, 3458891, 3447810,
+ 3436708, 3425584, 3414438, 3403271, 3392083, 3380874, 3369643, 3358392,
+ 3347121, 3335828, 3324516, 3313183, 3301829, 3290456, 3279063, 3267650,
+ 3256218, 3244766, 3233295, 3221804, 3210294, 3198766, 3187219, 3175652,
+ 3164068, 3152465, 3140843, 3129204, 3117547, 3105871, 3094178, 3082467,
+ 3070739, 3058994, 3047231, 3035451, 3023655, 3011841, 3000011, 2988164,
+ 2976301, 2964422, 2952526, 2940615, 2928687, 2916744, 2904786, 2892812,
+ 2880822, 2868818, 2856798, 2844763, 2832714, 2820650, 2808572, 2796479,
+ 2784372, 2772251, 2760116, 2747967, 2735804, 2723628, 2711438, 2699235,
+ 2687019, 2674790, 2662548, 2650294, 2638026, 2625746, 2613454, 2601150,
+ 2588834, 2576505, 2564165, 2551813, 2539450, 2527075, 2514689, 2502292,
+ 2489884, 2477465, 2465035, 2452595, 2440144, 2427683, 2415212, 2402730,
+ 2390239, 2377738, 2365227, 2352707, 2340177, 2327639, 2315091, 2302534,
+ 2289968, 2277394, 2264811, 2252219, 2239619, 2227011, 2214395, 2201771,
+ 2189140, 2176500, 2163853, 2151199, 2138538, 2125869, 2113194, 2100511,
+ 2087822, 2075126, 2062424, 2049716, 2037001, 2024281, 2011554, 1998822,
+ 1986084, 1973340, 1960591, 1947837, 1935078, 1922314, 1909545, 1896771,
+ 1883993, 1871210, 1858422, 1845631, 1832836, 1820036, 1807233, 1794426,
+ 1781616, 1768802, 1755985, 1743165, 1730341, 1717515, 1704686, 1691855,
+ 1679021, 1666184, 1653346, 1640505, 1627662, 1614818, 1601971, 1589124,
+ 1576274, 1563424, 1550572, 1537719, 1524865, 1512010, 1499155, 1486299,
+ 1473442, 1460586, 1447729, 1434872, 1422015, 1409158, 1396302, 1383446,
+ 1370591, 1357736, 1344882, 1332029, 1319178, 1306327, 1293478, 1280631,
+ 1267784, 1254940, 1242098, 1229257, 1216419, 1203583, 1190749, 1177917,
+ 1165088, 1152262, 1139439, 1126619, 1113802, 1100988, 1088177, 1075370,
+ 1062567, 1049767, 1036971, 1024179, 1011391, 998607, 985827, 973052,
+ 960282, 947516, 934755, 921999, 909248, 896502, 883762, 871027, 858297,
+ 845573, 832855, 820143, 807437, 794737, 782043, 769355, 756674, 744000,
+ 731332, 718672, 706018, 693371, 680732, 668099, 655475, 642857, 630248,
+ 617646, 605052, 592466, 579888, 567319, 554758, 542205, 529661, 517126,
+ 504599, 492082, 479573, 467074, 454584, 442103, 429632, 417171, 404719,
+ 392277, 379845, 367423, 355011, 342610, 330219, 317838, 305469, 293110,
+ 280761, 268424, 256098, 243783, 231479, 219187, 206906, 194637, 182379,
+ 170134, 157900, 145679, 133469, 121272, 109087, 96915, 84755, 72608,
+ 60474, 48353, 36245, 24150, 12068, 0, -12055, -24096, -36124, -48138,
+ -60138, -72124, -84097, -96055, -107998, -119928, -131843, -143743,
+ -155629, -167499, -179355, -191196, -203022, -214833, -226628, -238408,
+ -250173, -261921, -273655, -285372, -297073, -308759, -320428, -332082,
+ -343719, -355339, -366943, -378531, -390102, -401656, -413193, -424713,
+ -436216, -447702, -459171, -470623, -482057, -493473, -504872, -516253,
+ -527616, -538962, -550289, -561599, -572890, -584163, -595417, -606653,
+ -617871, -629069, -640250, -651411, -662553, -673677, -684781, -695866,
+ -706932, -717979, -729006, -740013, -751001, -761969, -772918, -783846,
+ -794755, -805643, -816512, -827360, -838188, -848995, -859782, -870548,
+ -881294, -892019, -902723, -913407, -924069, -934710, -945330, -955929,
+ -966507, -977063, -987597, -998111, -1008602, -1019072, -1029520,
+ -1039946, -1050350, -1060732, -1071092, -1081430, -1091746, -1102039,
+ -1112310, -1122558, -1132784, -1142987, -1153167, -1163325, -1173459,
+ -1183571, -1193660, -1203725, -1213768, -1223787, -1233783, -1243755,
+ -1253704, -1263629, -1273531, -1283409, -1293263, -1303094, -1312900,
+ -1322683, -1332442, -1342176, -1351886, -1361572, -1371234, -1380871,
+ -1390484, -1400072, -1409636, -1419175, -1428690, -1438179, -1447644,
+ -1457083, -1466498, -1475888, -1485252, -1494592, -1503906, -1513194,
+ -1522458, -1531696, -1540908, -1550095, -1559256, -1568392, -1577501,
+ -1586585, -1595643, -1604675, -1613681, -1622661, -1631615, -1640543,
+ -1649444, -1658320, -1667168, -1675991, -1684786, -1693556, -1702298,
+ -1711015, -1719704, -1728367, -1737002, -1745611, -1754193, -1762748,
+ -1771276, -1779777, -1788251, -1796697, -1805116, -1813508, -1821873,
+ -1830210, -1838519, -1846802, -1855056, -1863283, -1871482, -1879654,
+ -1887798, -1895914, -1904002, -1912062, -1920094, -1928098, -1936074,
+ -1944022, -1951942, -1959834, -1967697, -1975532, -1983339, -1991117,
+ -1998867, -2006588, -2014281, -2021945, -2029581, -2037188, -2044766,
+ -2052316, -2059836, -2067328, -2074791, -2082226, -2089631, -2097007,
+ -2104354, -2111672, -2118961, -2126221, -2133451, -2140653, -2147825,
+ -2154968, -2162081, -2169165, -2176220, -2183245, -2190241, -2197207,
+ -2204143, -2211050, -2217927, -2224775, -2231593, -2238381, -2245139,
+ -2251868, -2258567, -2265236, -2271875, -2278484, -2285063, -2291612,
+ -2298131, -2304619, -2311078, -2317507, -2323906, -2330274, -2336612,
+ -2342920, -2349197, -2355445, -2361662, -2367848, -2374005, -2380130,
+ -2386226, -2392291, -2398325, -2404329, -2410303, -2416245, -2422158,
+ -2428039, -2433890, -2439711, -2445500, -2451259, -2456987, -2462685,
+ -2468352, -2473987, -2479593, -2485167, -2490710, -2496223, -2501704,
+ -2507155, -2512575, -2517964, -2523322, -2528648, -2533944, -2539209,
+ -2544443, -2549646, -2554818, -2559958, -2565068, -2570146, -2575193,
+ -2580209, -2585194, -2590148, -2595071, -2599962, -2604822, -2609651,
+ -2614449, -2619215, -2623951, -2628654, -2633327, -2637968, -2642578,
+ -2647157, -2651704, -2656220, -2660705, -2665158, -2669580, -2673971,
+ -2678330, -2682658, -2686954, -2691220, -2695453, -2699655, -2703826,
+ -2707966, -2712073, -2716150, -2720195, -2724209, -2728191, -2732142,
+ -2736061, -2739949, -2743805, -2747630, -2751423, -2755185, -2758916,
+ -2762615, -2766282, -2769918, -2773523, -2777096, -2780638, -2784148,
+ -2787627, -2791074, -2794490, -2797874, -2801227, -2804549, -2807839,
+ -2811097, -2814325, -2817520, -2820684, -2823817, -2826919, -2829989,
+ -2833027, -2836034, -2839010, -2841955, -2844868, -2847749, -2850599,
+ -2853418, -2856206, -2858962, -2861687, -2864380, -2867042, -2869673,
+ -2872273, -2874841, -2877378, -2879884, -2882358, -2884801, -2887213,
+ -2889594, -2891944, -2894262, -2896549, -2898805, -2901030, -2903223,
+ -2905386, -2907517, -2909618, -2911687, -2913725, -2915732, -2917708,
+ -2919653, -2921567, -2923451, -2925303, -2927124, -2928914, -2930673,
+ -2932402, -2934099, -2935766, -2937402, -2939007, -2940581, -2942124,
+ -2943637, -2945119, -2946570, -2947990, -2949380, -2950739, -2952068,
+ -2953366, -2954633, -2955870, -2957076, -2958252, -2959397, -2960511,
+ -2961596, -2962650, -2963673, -2964666, -2965629, -2966561, -2967463,
+ -2968335, -2969177, -2969988, -2970769, -2971520, -2972241, -2972932,
+ -2973593, -2974224, -2974824, -2975395, -2975936, -2976446, -2976927,
+ -2977378, -2977799, -2978191, -2978552, -2978884, -2979186, -2979459,
+ -2979702, -2979915, -2980098, -2980252, -2980377, -2980472, -2980537,
+ -2980574, -2980580, -2980558, -2980506, -2980425, -2980314, -2980175,
+ -2980006, -2979808, -2979581, -2979325, -2979039, -2978725, -2978382,
+ -2978010, -2977609, -2977179, -2976721, -2976234, -2975717, -2975173,
+ -2974599, -2973997, -2973367, -2972708, -2972020, -2971304, -2970560,
+ -2969787, -2968986, -2968156, -2967298, -2966413, -2965499, -2964556,
+ -2963586, -2962588, -2961562, -2960507, -2959425, -2958315, -2957177,
+ -2956012, -2954819, -2953598, -2952349, -2951073, -2949769, -2948438,
+ -2947079, -2945693, -2944280, -2942839, -2941371, -2939875, -2938353,
+ -2936803, -2935227, -2933623, -2931992, -2930335, -2928650, -2926939,
+ -2925201, -2923436, -2921644, -2919826, -2917981, -2916110, -2914212,
+ -2912288, -2910337, -2908360, -2906356, -2904327, -2902271, -2900189,
+ -2898081, -2895947, -2893787, -2891601, -2889390, -2887152, -2884889,
+ -2882599, -2880285, -2877944, -2875578, -2873187, -2870770, -2868328,
+ -2865860, -2863367, -2860849, -2858306, -2855737, -2853144, -2850525,
+ -2847882, -2845214, -2842521, -2839803, -2837060, -2834293, -2831501,
+ -2828684, -2825843, -2822978, -2820088, -2817174, -2814235, -2811273,
+ -2808286, -2805275, -2802240, -2799181, -2796099, -2792992, -2789862,
+ -2786708, -2783530, -2780328, -2777103, -2773855, -2770583, -2767288,
+ -2763969, -2760627, -2757262, -2753874, -2750463, -2747029, -2743572,
+ -2740092, -2736589, -2733063, -2729515, -2725944, -2722350, -2718734,
+ -2715096, -2711435, -2707752, -2704047, -2700319, -2696570, -2692798,
+ -2689004, -2685188, -2681351, -2677492, -2673610, -2669708, -2665783,
+ -2661838, -2657870, -2653881, -2649871, -2645840, -2641787, -2637714,
+ -2633619, -2629503, -2625366, -2621209, -2617030, -2612831, -2608611,
+ -2604371, -2600110, -2595828, -2591526, -2587204, -2582861, -2578499,
+ -2574116, -2569713, -2565290, -2560847, -2556384, -2551902, -2547399,
+ -2542877, -2538336, -2533775, -2529194, -2524594, -2519975, -2515337,
+ -2510679, -2506002, -2501307, -2496592, -2491858, -2487106, -2482335,
+ -2477545, -2472736, -2467909, -2463064, -2458200, -2453318, -2448417,
+ -2443499, -2438562, -2433607, -2428635, -2423644, -2418635, -2413609,
+ -2408565, -2403504, -2398425, -2393328, -2388214, -2383083, -2377934,
+ -2372769, -2367586, -2362386, -2357169, -2351936, -2346685, -2341418,
+ -2336134, -2330834, -2325517, -2320183, -2314833, -2309467, -2304085,
+ -2298686, -2293272, -2287841, -2282395, -2276932, -2271454, -2265960,
+ -2260451, -2254926, -2249385, -2243829, -2238258, -2232671, -2227070,
+ -2221453, -2215821, -2210174, -2204512, -2198836, -2193145, -2187439,
+ -2181718, -2175983, -2170234, -2164470, -2158692, -2152899, -2147093,
+ -2141272, -2135438, -2129589, -2123727, -2117851, -2111961, -2106058,
+ -2100141, -2094211, -2088267, -2082310, -2076340, -2070357, -2064360,
+ -2058351, -2052328, -2046293, -2040245, -2034185, -2028111, -2022026,
+ -2015927, -2009817, -2003694, -1997559, -1991411, -1985252, -1979081,
+ -1972897, -1966702, -1960495, -1954276, -1948046, -1941804, -1935551,
+ -1929286, -1923010, -1916723, -1910425, -1904115, -1897795, -1891464,
+ -1885121, -1878768, -1872405, -1866030, -1859646, -1853250, -1846845,
+ -1840429, -1834002, -1827566, -1821119, -1814663, -1808197, -1801720,
+ -1795234, -1788739, -1782233, -1775719, -1769194, -1762661, -1756118,
+ -1749565, -1743004, -1736434, -1729854, -1723266, -1716669, -1710063,
+ -1703448, -1696825, -1690193, -1683553, -1676904, -1670247, -1663582,
+ -1656909, -1650228, -1643538, -1636841, -1630136, -1623423, -1616703,
+ -1609974, -1603239, -1596496, -1589745, -1582987, -1576222, -1569450,
+ -1562671, -1555885, -1549092, -1542292, -1535485, -1528672, -1521852,
+ -1515025, -1508192, -1501353, -1494507, -1487655, -1480797, -1473933,
+ -1467063, -1460187, -1453306, -1446418, -1439525, -1432626, -1425722,
+ -1418812, -1411897, -1404976, -1398050, -1391119, -1384183, -1377243,
+ -1370297, -1363346, -1356390, -1349430, -1342465, -1335496, -1328522,
+ -1321544, -1314562, -1307575, -1300584, -1293589, -1286590, -1279587,
+ -1272580, -1265570, -1258555, -1251537, -1244516, -1237491, -1230463,
+ -1223431, -1216396, -1209358, -1202317, -1195272, -1188225, -1181175,
+ -1174122, -1167066, -1160008, -1152947, -1145884, -1138818, -1131750,
+ -1124679, -1117606, -1110531, -1103455, -1096376, -1089295, -1082212,
+ -1075128, -1068042, -1060954, -1053864, -1046774, -1039681, -1032588,
+ -1025493, -1018397, -1011300, -1004202, -997103, -990003, -982902,
+ -975801, -968698, -961596, -954492, -947389, -940284, -933180, -926075,
+ -918970, -911865, -904760, -897655, -890550, -883446, -876341, -869237,
+ -862134, -855031, -847928, -840826, -833725, -826624, -819524, -812426,
+ -805328, -798231, -791135, -784041, -776947, -769856, -762765, -755676,
+ -748588, -741502, -734418, -727336, -720255, -713176, -706099, -699024,
+ -691952, -684881, -677813, -670746, -663683, -656621, -649563, -642506,
+ -635453, -628402, -621354, -614308, -607266, -600227, -593190, -586157,
+ -579127, -572100, -565076, -558056, -551040, -544026, -537017, -530011,
+ -523008, -516010, -509015, -502024, -495038, -488055, -481076, -474102,
+ -467132, -460166, -453204, -446247, -439294, -432346, -425403, -418464,
+ -411530, -404600, -397676, -390757, -383842, -376933, -370029, -363130,
+ -356236, -349347, -342464, -335587, -328715, -321848, -314987, -308132,
+ -301283, -294439, -287601, -280770, -273944, -267124, -260310, -253503,
+ -246702, -239907, -233119, -226337, -219561, -212792, -206030, -199274,
+ -192525, -185783, -179048, -172319, -165598, -158884, -152176, -145476,
+ -138783, -132098, -125419, -118748, -112085, -105429, -98781, -92140,
+ -85507, -78881, -72263, -65654, -59052, -52458, -45872, -39294, -32724,
+ -26163, -19609, -13064, -6528, 0, 6519, 13031, 19533, 26027, 32513,
+ 38989, 45457, 51916, 58366, 64808, 71240, 77663, 84077, 90482, 96877,
+ 103264, 109641, 116008, 122367, 128715, 135054, 141384, 147704, 154014,
+ 160315, 166606, 172886, 179157, 185419, 191670, 197911, 204141, 210362,
+ 216573, 222773, 228963, 235143, 241312, 247471, 253619, 259757, 265884,
+ 272001, 278107, 284202, 290286, 296360, 302422, 308474, 314515, 320544,
+ 326563, 332571, 338567, 344552, 350526, 356489, 362440, 368380, 374308,
+ 380225, 386131, 392024, 397907, 403777, 409636, 415483, 421318, 427142,
+ 432954, 438753, 444541, 450317, 456080, 461832, 467571, 473298, 479013,
+ 484716, 490406, 496084, 501750, 507403, 513044, 518672, 524288, 529891,
+ 535481, 541059, 546624, 552176, 557715, 563242, 568756, 574257, 579744,
+ 585219, 590681, 596130, 601565, 606988, 612397, 617793, 623176, 628545,
+ 633902, 639244, 644574, 649890, 655192, 660481, 665756, 671018, 676266,
+ 681501, 686721, 691928, 697122, 702301, 707467, 712618, 717756, 722880,
+ 727990, 733086, 738168, 743236, 748289, 753329, 758354, 763365, 768362,
+ 773345, 778313, 783267, 788207, 793132, 798043, 802939, 807821, 812688,
+ 817541, 822379, 827202, 832011, 836806, 841585, 846350, 851100, 855835,
+ 860555, 865261, 869952, 874627, 879288, 883934, 888565, 893181, 897782,
+ 902368, 906938, 911494, 916034, 920559, 925069, 929564, 934044, 938508,
+ 942957, 947391, 951809, 956212, 960599, 964971, 969328, 973669, 977995,
+ 982305, 986599, 990878, 995142, 999389, 1003622, 1007838, 1012039,
+ 1016224, 1020393, 1024547, 1028685, 1032807, 1036913, 1041003, 1045078,
+ 1049136, 1053179, 1057206, 1061217, 1065212, 1069191, 1073154, 1077101,
+ 1081032, 1084947, 1088845, 1092728, 1096595, 1100445, 1104279, 1108098,
+ 1111900, 1115685, 1119455, 1123208, 1126945, 1130666, 1134371, 1138059,
+ 1141731, 1145387, 1149026, 1152649, 1156255, 1159845, 1163419, 1166977,
+ 1170517, 1174042, 1177550, 1181041, 1184516, 1187975, 1191417, 1194842,
+ 1198251, 1201644, 1205020, 1208379, 1211721, 1215047, 1218357, 1221650,
+ 1224926, 1228185, 1231428, 1234654, 1237864, 1241057, 1244233, 1247392,
+ 1250535, 1253661, 1256770, 1259862, 1262938, 1265997, 1269039, 1272064,
+ 1275073, 1278064, 1281039, 1283997, 1286938, 1289863, 1292770, 1295661,
+ 1298535, 1301392, 1304232, 1307055, 1309862, 1312651, 1315424, 1318179,
+ 1320918, 1323640, 1326345, 1329033, 1331704, 1334358, 1336995, 1339616,
+ 1342219, 1344805, 1347375, 1349927, 1352463, 1354981, 1357483, 1359968,
+ 1362435, 1364886, 1367320, 1369736, 1372136, 1374519, 1376884, 1379233,
+ 1381565, 1383880, 1386178, 1388459, 1390722, 1392969, 1395199, 1397412,
+ 1399608, 1401787, 1403949, 1406094, 1408222, 1410333, 1412427, 1414504,
+ 1416564, 1418607, 1420633, 1422642, 1424634, 1426609, 1428567, 1430508,
+ 1432433, 1434340, 1436230, 1438104, 1439960, 1441800, 1443622, 1445428,
+ 1447217, 1448988, 1450743, 1452481, 1454202, 1455906, 1457593, 1459264,
+ 1460917, 1462554, 1464173, 1465776, 1467362, 1468931, 1470483, 1472019,
+ 1473537, 1475039, 1476524, 1477992, 1479443, 1480878, 1482295, 1483696,
+ 1485080, 1486448, 1487798, 1489132, 1490449, 1491750, 1493033, 1494300,
+ 1495551, 1496784, 1498001, 1499201, 1500385, 1501552, 1502702, 1503836,
+ 1504953, 1506053, 1507137, 1508204, 1509255, 1510289, 1511306, 1512307,
+ 1513292, 1514260, 1515211, 1516146, 1517065, 1517967, 1518852, 1519721,
+ 1520574, 1521411, 1522230, 1523034, 1523821, 1524592, 1525347, 1526085,
+ 1526807, 1527512, 1528202, 1528875, 1529531, 1530172, 1530796, 1531405,
+ 1531997, 1532572, 1533132, 1533676, 1534203, 1534714, 1535209, 1535689,
+ 1536152, 1536599, 1537030, 1537445, 1537844, 1538227, 1538594, 1538945,
+ 1539281, 1539600, 1539904, 1540191, 1540463, 1540719, 1540959, 1541184,
+ 1541393, 1541586, 1541763, 1541924, 1542070, 1542200, 1542315, 1542414,
+ 1542497, 1542565, 1542617, 1542654, 1542675, 1542681, 1542671, 1542646,
+ 1542605, 1542549, 1542477, 1542390, 1542288, 1542171, 1542038, 1541890,
+ 1541726, 1541548, 1541354, 1541145, 1540921, 1540682, 1540427, 1540158,
+ 1539873, 1539574, 1539259, 1538929, 1538585, 1538225, 1537851, 1537461,
+ 1537057, 1536638, 1536204, 1535755, 1535292, 1534814, 1534321, 1533813,
+ 1533291, 1532754, 1532202, 1531636, 1531055, 1530460, 1529850, 1529225,
+ 1528587, 1527933, 1527266, 1526584, 1525887, 1525177, 1524451, 1523712,
+ 1522959, 1522191, 1521409, 1520613, 1519802, 1518978, 1518139, 1517287,
+ 1516420, 1515540, 1514645, 1513737, 1512814, 1511878, 1510928, 1509964,
+ 1508986, 1507995, 1506989, 1505970, 1504938, 1503891, 1502831, 1501758,
+ 1500671, 1499570, 1498456, 1497328, 1496187, 1495033, 1493865, 1492684,
+ 1491490, 1490282, 1489061, 1487827, 1486579, 1485319, 1484045, 1482758,
+ 1481458, 1480145, 1478819, 1477480, 1476129, 1474764, 1473386, 1471996,
+ 1470593, 1469177, 1467748, 1466306, 1464852, 1463385, 1461906, 1460414,
+ 1458909, 1457392, 1455862, 1454320, 1452766, 1451199, 1449620, 1448028,
+ 1446425, 1444809, 1443180, 1441540, 1439887, 1438223, 1436546, 1434857,
+ 1433156, 1431443, 1429719, 1427982, 1426233, 1424473, 1422701, 1420917,
+ 1419121, 1417314, 1415495, 1413664, 1411822, 1409968, 1408103, 1406226,
+ 1404338, 1402438, 1400527, 1398604, 1396671, 1394726, 1392770, 1390802,
+ 1388823, 1386834, 1384833, 1382821, 1380798, 1378764, 1376719, 1374664,
+ 1372597, 1370520, 1368431, 1366332, 1364223, 1362102, 1359971, 1357829,
+ 1355677, 1353514, 1351341, 1349157, 1346963, 1344758, 1342544, 1340318,
+ 1338083, 1335837, 1333581, 1331315, 1329038, 1326752, 1324456, 1322149,
+ 1319833, 1317506, 1315170, 1312824, 1310468, 1308102, 1305727, 1303342,
+ 1300947, 1298542, 1296128, 1293704, 1291271, 1288829, 1286377, 1283915,
+ 1281444, 1278964, 1276475, 1273976, 1271468, 1268951, 1266425, 1263889,
+ 1261345, 1258792, 1256229, 1253658, 1251078, 1248489, 1245891, 1243284,
+ 1240669, 1238045, 1235412, 1232771, 1230121, 1227463, 1224796, 1222121,
+ 1219437, 1216745, 1214044, 1211335, 1208618, 1205893, 1203159, 1200418,
+ 1197668, 1194910, 1192145, 1189371, 1186589, 1183800, 1181002, 1178197,
+ 1175384, 1172563, 1169735, 1166898, 1164055, 1161203, 1158344, 1155478,
+ 1152604, 1149723, 1146834, 1143938, 1141035, 1138125, 1135207, 1132282,
+ 1129350, 1126411, 1123465, 1120511, 1117551, 1114584, 1111610, 1108629,
+ 1105642, 1102647, 1099646, 1096639, 1093624, 1090603, 1087576, 1084541,
+ 1081501, 1078454, 1075400, 1072341, 1069274, 1066202, 1063123, 1060039,
+ 1056948, 1053851, 1050747, 1047638, 1044523, 1041402, 1038275, 1035142,
+ 1032003, 1028859, 1025708, 1022552, 1019391, 1016224, 1013051, 1009872,
+ 1006689, 1003499, 1000304, 997104, 993899, 990688, 987472, 984251,
+ 981025, 977793, 974556, 971315, 968068, 964816, 961560, 958299, 955032,
+ 951761, 948485, 945205, 941920, 938630, 935335, 932036, 928733, 925425,
+ 922112, 918795, 915474, 912148, 908819, 905485, 902146, 898804, 895458,
+ 892107, 888752, 885394, 882031, 878665, 875295, 871921, 868543, 865161,
+ 861776, 858387, 854994, 851598, 848198, 844795, 841388, 837978, 834565,
+ 831148, 827728, 824304, 820878, 817448, 814015, 810579, 807140, 803698,
+ 800253, 796805, 793354, 789900, 786444, 782984, 779522, 776058, 772590,
+ 769120, 765648, 762172, 758695, 755215, 751732, 748247, 744760, 741271,
+ 737779, 734285, 730789, 727290, 723790, 720287, 716783, 713276, 709768,
+ 706258, 702746, 699232, 695716, 692198, 688679, 685158, 681636, 678111,
+ 674586, 671059, 667530, 664000, 660468, 656936, 653401, 649866, 646329,
+ 642791, 639252, 635712, 632171, 628629, 625085, 621541, 617996, 614450,
+ 610903, 607355, 603807, 600257, 596707, 593157, 589605, 586054, 582501,
+ 578948, 575395, 571841, 568287, 564732, 561177, 557622, 554067, 550511,
+ 546955, 543399, 539843, 536287, 532731, 529175, 525618, 522062, 518507,
+ 514951, 511395, 507840, 504285, 500730, 497176, 493622, 490068, 486515,
+ 482962, 479410, 475859, 472308, 468757, 465208, 461659, 458110, 454563,
+ 451016, 447470, 443926, 440382, 436839, 433296, 429755, 426216, 422677,
+ 419139, 415602, 412067, 408533, 405000, 401469, 397938, 394410, 390882,
+ 387356, 383832, 380309, 376787, 373268, 369749, 366233, 362718, 359205,
+ 355693, 352184, 348676, 345170, 341666, 338164, 334664, 331166, 327670,
+ 324176, 320684, 317194, 313706, 310221, 306738, 303257, 299778, 296302,
+ 292828, 289356, 285887, 282420, 278956, 275494, 272035, 268578, 265124,
+ 261673, 258224, 254779, 251335, 247895, 244457, 241023, 237591, 234162,
+ 230736, 227313, 223893, 220476, 217062, 213651, 210243, 206839, 203437,
+ 200039, 196644, 193252, 189864, 186479, 183097, 179719, 176344, 172973,
+ 169605, 166241, 162880, 159522, 156169, 152819, 149473, 146130, 142791,
+ 139456, 136125, 132797, 129473, 126153, 122838, 119526, 116218, 112913,
+ 109613, 106317, 103026, 99738, 96454, 93174, 89899, 86628, 83361,
+ 80098, 76840, 73586, 70336, 67091, 63850, 60614, 57382, 54154, 50931,
+ 47713, 44499, 41290, 38085, 34885, 31690, 28499, 25313, 22132, 18956,
+ 15784, 12618, 9456, 6299, 3147, 0, -3142, -6279, -9411, -12538, -15660,
+ -18777, -21889, -24996, -28098, -31194, -34285, -37371, -40452, -43527,
+ -46598, -49662, -52722, -55776, -58825, -61868, -64906, -67938, -70965,
+ -73986, -77002, -80012, -83017, -86016, -89009, -91997, -94979, -97955,
+ -100926, -103891, -106850, -109803, -112751, -115692, -118628, -121558,
+ -124482, -127400, -130312, -133219, -136119, -139013, -141901, -144783,
+ -147659, -150529, -153393, -156251, -159102, -161948, -164787, -167620,
+ -170447, -173267, -176081, -178889, -181691, -184486, -187275, -190058,
+ -192834, -195604, -198367, -201124, -203874, -206618, -209355, -212086,
+ -214811, -217528, -220240, -222944, -225642, -228333, -231018, -233696,
+ -236368, -239032, -241690, -244341, -246986, -249623, -252254, -254878,
+ -257495, -260106, -262709, -265306, -267895, -270478, -273054, -275623,
+ -278185, -280740, -283288, -285829, -288363, -290890, -293410, -295922,
+ -298428, -300927, -303418, -305903, -308380, -310850, -313313, -315768,
+ -318217, -320658, -323092, -325519, -327939, -330351, -332756, -335153,
+ -337544, -339927, -342302, -344671, -347032, -349385, -351731, -354070,
+ -356401, -358725, -361041, -363350, -365652, -367946, -370232, -372511,
+ -374783, -377047, -379303, -381552, -383793, -386027, -388253, -390471,
+ -392682, -394885, -397081, -399268, -401449, -403621, -405786, -407943,
+ -410093, -412234, -414368, -416495, -418613, -420724, -422827, -424922,
+ -427010, -429089, -431161, -433225, -435281, -437330, -439370, -441403,
+ -443427, -445444, -447453, -449454, -451448, -453433, -455410, -457380,
+ -459342, -461295, -463241, -465179, -467108, -469030, -470944, -472850,
+ -474747, -476637, -478519, -480393, -482259, -484116, -485966, -487808,
+ -489641, -491467, -493284, -495094, -496895, -498689, -500474, -502251,
+ -504020, -505781, -507533, -509278, -511015, -512743, -514463, -516175,
+ -517879, -519575, -521263, -522943, -524614, -526277, -527932, -529579,
+ -531218, -532848, -534471, -536085, -537691, -539288, -540878, -542459,
+ -544032, -545597, -547154, -548702, -550243, -551775, -553298, -554814,
+ -556321, -557820, -559311, -560794, -562268, -563734, -565192, -566641,
+ -568083, -569516, -570941, -572357, -573766, -575166, -576557, -577941,
+ -579316, -580683, -582042, -583392, -584734, -586068, -587394, -588711,
+ -590020, -591321, -592613, -593898, -595174, -596441, -597701, -598952,
+ -600195, -601429, -602655, -603873, -605083, -606285, -607478, -608663,
+ -609839, -611008, -612168, -613320, -614463, -615599, -616726, -617844,
+ -618955, -620057, -621151, -622237, -623314, -624384, -625445, -626497,
+ -627542, -628578, -629606, -630626, -631637, -632641, -633636, -634623,
+ -635601, -636572, -637534, -638488, -639434, -640371, -641301, -642222,
+ -643135, -644039, -644936, -645824, -646705, -647577, -648440, -649296,
+ -650144, -650983, -651814, -652637, -653452, -654259, -655057, -655848,
+ -656630, -657404, -658171, -658929, -659678, -660420, -661154, -661880,
+ -662597, -663307, -664008, -664701, -665386, -666064, -666733, -667394,
+ -668047, -668692, -669329, -669958, -670579, -671192, -671797, -672394,
+ -672983, -673564, -674137, -674702, -675259, -675808, -676349, -676883,
+ -677408, -677926, -678435, -678937, -679430, -679916, -680394, -680864,
+ -681327, -681781, -682228, -682666, -683097, -683520, -683935, -684343,
+ -684742, -685134, -685518, -685895, -686263, -686624, -686977, -687322,
+ -687660, -687990, -688312, -688626, -688933, -689232, -689523, -689807,
+ -690083, -690352, -690613, -690866, -691111, -691349, -691580, -691803,
+ -692018, -692226, -692426, -692619, -692804, -692981, -693151, -693314,
+ -693469, -693617, -693757, -693890, -694015, -694133, -694243, -694346,
+ -694442, -694530, -694611, -694685, -694751, -694810, -694861, -694906,
+ -694942, -694972, -694994, -695010, -695017, -695018, -695011, -694997,
+ -694976, -694948, -694913, -694870, -694820, -694764, -694700, -694628,
+ -694550, -694465, -694373, -694273, -694167, -694053, -693932, -693805,
+ -693670, -693529, -693380, -693225, -693062, -692893, -692717, -692533,
+ -692343, -692146, -691943, -691732, -691515, -691290, -691059, -690821,
+ -690577, -690325, -690067, -689802, -689530, -689252, -688967, -688675,
+ -688377, -688072, -687760, -687442, -687117, -686785, -686447, -686103,
+ -685752, -685394, -685030, -684659, -684282, -683898, -683508, -683111,
+ -682708, -682299, -681883, -681461, -681033, -680598, -680157, -679709,
+ -679255, -678795, -678329, -677856, -677377, -676892, -676401, -675904,
+ -675400, -674890, -674374, -673852, -673324, -672790, -672250, -671703,
+ -671151, -670592, -670028, -669457, -668881, -668299, -667710, -667116,
+ -666516, -665910, -665298, -664680, -664057, -663427, -662792, -662151,
+ -661504, -660851, -660193, -659529, -658859, -658184, -657503, -656816,
+ -656124, -655426, -654722, -654013, -653298, -652578, -651852, -651120,
+ -650383, -649641, -648893, -648140, -647381, -646617, -645848, -645073,
+ -644293, -643507, -642716, -641920, -641118, -640312, -639500, -638682,
+ -637860, -637032, -636200, -635362, -634519, -633670, -632817, -631959,
+ -631095, -630226, -629353, -628474, -627591, -626702, -625809, -624910,
+ -624007, -623099, -622185, -621267, -620344, -619417, -618484, -617547,
+ -616605, -615658, -614706, -613750, -612789, -611823, -610853, -609878,
+ -608899, -607914, -606926, -605932, -604934, -603932, -602925, -601913,
+ -600898, -599877, -598852, -597823, -596790, -595752, -594709, -593663,
+ -592612, -591556, -590497, -589433, -588365, -587293, -586216, -585135,
+ -584050, -582961, -581868, -580771, -579670, -578564, -577455, -576341,
+ -575224, -574102, -572977, -571848, -570714, -569577, -568436, -567291,
+ -566142, -564989, -563833, -562672, -561508, -560340, -559169, -557993,
+ -556814, -555631, -554445, -553255, -552061, -550864, -549663, -548459,
+ -547251, -546039, -544824, -543606, -542384, -541158, -539930, -538697,
+ -537462, -536223, -534980, -533735, -532486, -531234, -529978, -528719,
+ -527457, -526192, -524924, -523652, -522377, -521099, -519818, -518534,
+ -517247, -515957, -514664, -513367, -512068, -510766, -509461, -508153,
+ -506842, -505528, -504211, -502891, -501569, -500243, -498915, -497584,
+ -496251, -494914, -493575, -492233, -490889, -489542, -488192, -486839,
+ -485484, -484127, -482766, -481404, -480038, -478671, -477300, -475928,
+ -474553, -473175, -471795, -470413, -469028, -467641, -466251, -464860,
+ -463466, -462069, -460671, -459270, -457867, -456462, -455055, -453645,
+ -452234, -450820, -449404, -447986, -446566, -445144, -443720, -442294,
+ -440866, -439436, -438004, -436570, -435135, -433697, -432258, -430816,
+ -429373, -427928, -426482, -425033, -423583, -422131, -420677, -419222,
+ -417765, -416306, -414846, -413384, -411921, -410456, -408989, -407521,
+ -406051, -404580, -403107, -401633, -400158, -398681, -397203, -395723,
+ -394242, -392759, -391275, -389790, -388304, -386816, -385327, -383837,
+ -382346, -380853, -379360, -377865, -376369, -374872, -373373, -371874,
+ -370374, -368872, -367370, -365866, -364362, -362856, -361350, -359843,
+ -358334, -356825, -355315, -353804, -352293, -350780, -349267, -347753,
+ -346238, -344722, -343206, -341689, -340171, -338652, -337133, -335614,
+ -334093, -332572, -331051, -329528, -328006, -326483, -324959, -323435,
+ -321910, -320385, -318859, -317333, -315806, -314280, -312752, -311225,
+ -309697, -308169, -306640, -305111, -303582, -302053, -300523, -298993,
+ -297463, -295933, -294403, -292872, -291342, -289811, -288280, -286749,
+ -285218, -283688, -282157, -280625, -279094, -277564, -276033, -274502,
+ -272971, -271440, -269910, -268379, -266849, -265319, -263789, -262259,
+ -260729, -259200, -257671, -256142, -254614, -253085, -251557, -250030,
+ -248503, -246976, -245449, -243923, -242397, -240872, -239347, -237823,
+ -236299, -234776, -233253, -231730, -230208, -228687, -227166, -225646,
+ -224127, -222608, -221090, -219572, -218055, -216539, -215023, -213508,
+ -211994, -210481, -208968, -207456, -205945, -204435, -202926, -201417,
+ -199910, -198403, -196897, -195392, -193888, -192384, -190882, -189381,
+ -187880, -186381, -184883, -183385, -181889, -180394, -178900, -177407,
+ -175915, -174424, -172934, -171445, -169958, -168472, -166986, -165503,
+ -164020, -162538, -161058, -159579, -158101, -156625, -155150, -153676,
+ -152203, -150732, -149262, -147794, -146327, -144861, -143397, -141934,
+ -140473, -139013, -137554, -136097, -134642, -133188, -131735, -130284,
+ -128835, -127387, -125940, -124496, -123053, -121611, -120171, -118733,
+ -117296, -115861, -114428, -112997, -111567, -110138, -108712, -107287,
+ -105864, -104443, -103024, -101606, -100190, -98776, -97364, -95954,
+ -94545, -93139, -91734, -90331, -88930, -87531, -86134, -84739, -83346,
+ -81955, -80565, -79178, -77793, -76410, -75028, -73649, -72272, -70897,
+ -69524, -68153, -66784, -65417, -64053, -62690, -61330, -59971, -58615,
+ -57261, -55910, -54560, -53213, -51868, -50525, -49184, -47846, -46510,
+ -45176, -43844, -42515, -41188, -39863, -38541, -37221, -35903, -34588,
+ -33275, -31964, -30656, -29350, -28047, -26746, -25447, -24151, -22857,
+ -21566, -20277, -18991, -17707, -16426, -15147, -13870, -12597, -11325,
+ -10057, -8790, -7527, -6266, -5007, -3752, -2498, -1248, 0
+};
diff --git a/usr/src/uts/common/io/audio/impl/audio_format.c b/usr/src/uts/common/io/audio/impl/audio_format.c
new file mode 100644
index 0000000000..b7385e336c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_format.c
@@ -0,0 +1,894 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Audio format conversion routines used by audio.c
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/g711.h>
+
+#include "audio_impl.h"
+#include "audio_grc3.h"
+
+
+/*
+ * Note: In the function below, the division by the number of channels is
+ * probably fairly expensive. It turns out that we usually deal with stereo
+ * or mono data, so perhaps it would be useful to build custom versions of
+ * this function that only dealt with stereo or mono.
+ */
+static int
+do_src(audio_stream_t *sp, void *p1, void *p2, int len, int nchan)
+{
+ int ch, size;
+
+ /*
+ * Note that we presume that we are doing sample rate
+ * conversions on AUDIO_FORMAT_S24_NE, which means that have 4
+ * byte and 32-bit samples.
+ */
+ size = sp->s_cnv_max / 4; /* sample size is 4 */
+ size /= nchan;
+
+ for (ch = 0; ch < nchan; ch++) {
+ grc3_convert(sp->s_src_state[ch], sp->s_src_quality,
+ p1, p2, len, size, nchan, ch);
+ }
+ return (((grc3state_t *)sp->s_src_state[0])->outsz);
+}
+
+static void
+setup_src(audio_stream_t *sp, int srate, int trate, int sch, int tch)
+{
+ int ch, nch;
+
+ nch = min(sch, tch);
+
+ ASSERT(nch <= AUDIO_MAX_CHANNELS);
+
+ if (sp->s_src_quality < 1)
+ sp->s_src_quality = 1;
+ if (sp->s_src_quality > 5)
+ sp->s_src_quality = 5;
+
+ for (ch = 0; ch < nch; ch++) {
+ grc3_reset(sp->s_src_state[ch]);
+ grc3_setup(sp->s_src_state[ch], srate, trate);
+ }
+}
+
+static int
+cnv_srconly(audio_stream_t *sp, int len)
+{
+ void *src = sp->s_cnv_src;
+ void *dst = sp->s_cnv_dst;
+
+ /*
+ * We must be using 24-bit native signed.
+ */
+ len = do_src(sp, src, dst, len, sp->s_cnv_src_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+
+ return (len);
+}
+
+static int
+cnv_s24oe(audio_stream_t *sp, int len)
+{
+ /*
+ * Endian switch works in both directions. We do it in place.
+ */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *src = ddi_swap32(*src);
+ src++;
+ }
+
+ return (len);
+}
+
+
+static int
+cnv_from_s8(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (*src++) << 16;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u8(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int8_t)((*src++) ^ 0x80) << 16;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_ulaw(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *dst++ = _8ulaw2linear16[(*src++)] << 8;
+ }
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_alaw(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *dst++ = _8alaw2linear16[(*src++)] << 8;
+ }
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s16ne(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (*src++) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s16oe(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)(ddi_swap16(*src++)) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u16ne(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)((*src++) ^ 0x8000) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u16oe(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)(ddi_swap16((*src++) ^ 0x8000)) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s24p(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+ int32_t tmp;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ /* NB: this is a little endian format */
+ tmp = (*src++);
+ tmp |= (*src++) << 8;
+ tmp |= (*src++) << 16;
+ *dst++ = tmp;
+ }
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s32ne(audio_stream_t *sp, int len)
+{
+ /* 32-bit conversions can be done in place */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--, src++)
+ *src = *src >> 8;
+
+ return (len);
+}
+
+static int
+cnv_from_s32oe(audio_stream_t *sp, int len)
+{
+ /* 32-bit conversions can be done in place */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--, src++)
+ *src = (int32_t)(ddi_swap32(*src)) >> 8;
+
+ return (len);
+}
+
+/*
+ * NB: All the destination format conversions use the same or fewer
+ * bytes as the 24-bit unpacked (32-bits used per sample), so we can
+ * convert all of them in place.
+ */
+
+static int
+cnv_to_u8(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = (*src++ >> 16) ^ 0x80;
+
+ return (len);
+}
+
+static int
+cnv_to_s8(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = *src++ >> 16;
+
+ return (len);
+}
+
+static int
+cnv_to_ulaw(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ int idx = *src++;
+ idx >>= 10;
+ idx += G711_ULAW_MIDPOINT;
+ idx &= 0x3fff; /* safety precaution */
+ *dst++ = _14linear2ulaw8[idx];
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_alaw(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ int idx = *src++;
+ idx >>= 11;
+ idx += G711_ALAW_MIDPOINT;
+ idx &= 0x1fff; /* safety precaution */
+ *dst++ = _13linear2alaw8[idx];
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_s16ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = *src++ >> 8;
+
+ return (len);
+}
+
+static int
+cnv_to_s16oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = ddi_swap16(*src++ >> 8);
+
+ return (len);
+}
+
+static int
+cnv_to_u16ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = (*src++ >> 8) ^ 0x8000;
+
+ return (len);
+}
+
+static int
+cnv_to_u16oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = ddi_swap16(*src++ >> 8) ^ 0x8000;
+
+ return (len);
+}
+
+static int
+cnv_to_s24p(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+ int32_t d;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ /* NB: this is a little endian format */
+ d = *src++;
+ *dst++ = d & 0xff;
+ *dst++ = (d >> 8) & 0xff;
+ *dst++ = (d >> 16) & 0xff;
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_s32ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--, src++)
+ *src = *src << 8;
+
+ return (len);
+}
+
+static int
+cnv_to_s32oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--, src++)
+ *src = ddi_swap32(*src << 8);
+
+ return (len);
+}
+
+static int
+cnv_default(audio_stream_t *sp, int len)
+{
+ /*
+ * Note that the formats were already preverified during
+ * select_converter, to ensure that only supported formats are
+ * used.
+ */
+
+ /*
+ * Convert samples to 24 bit (32 bit lsb aligned) if
+ * necessary.
+ */
+
+ switch (sp->s_cnv_src_format) {
+
+ case AUDIO_FORMAT_U8:
+ len = cnv_from_u8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S8:
+ len = cnv_from_s8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ULAW:
+ len = cnv_from_ulaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ len = cnv_from_alaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ len = cnv_from_s16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_OE:
+ len = cnv_from_s16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_NE:
+ len = cnv_from_u16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_OE:
+ len = cnv_from_u16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ len = cnv_from_s32ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_OE:
+ len = cnv_from_s32oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_OE:
+ len = cnv_s24oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_PACKED:
+ len = cnv_from_s24p(sp, len);
+ break;
+ }
+
+ /*
+ * If we aren't decreasing the number of channels, then do the
+ * SRC now. (We prefer to do SRC on the smaller number of channels.)
+ */
+ if (sp->s_cnv_src_rate != sp->s_cnv_dst_rate &&
+ sp->s_cnv_src_nchan <= sp->s_cnv_dst_nchan) {
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+
+ len = do_src(sp, src, dst, len, sp->s_cnv_src_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+ }
+
+ /*
+ * Convert between mono and stereo
+ */
+
+ if (sp->s_cnv_src_nchan != sp->s_cnv_dst_nchan) {
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+ int tc = sp->s_cnv_dst_nchan;
+ int sc = sp->s_cnv_src_nchan;
+ int nc;
+ int i;
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+
+ if (sc == 1) {
+ /*
+ * Mono expansion. We expand into the stereo
+ * channel, and leave other channels silent.
+ */
+ for (i = len; i; i--) {
+ *dst++ = *src;
+ *dst++ = *src++;
+ for (int j = tc - 2; j > 0; j--) {
+ *dst++ = 0;
+ }
+
+ }
+
+ } else if (sc == 2 && tc == 1) {
+ /*
+ * Stereo -> mono. We do stereo separately to make
+ * the division fast (div by const 2 is just shift).
+ */
+ for (i = len; i; i--) {
+ /*
+ * Take just the left channel sample,
+ * discard the right channel.
+ */
+ *dst++ = *src++; /* left */
+ src++; /* right */
+ }
+ } else {
+ /*
+ * Multi channel conversions. We just copy the
+ * minimum number of channels.
+ */
+
+ /* Calculate number of frames */
+
+ nc = min(sc, tc);
+
+ /* Clear destination */
+ bzero(dst, (len * tc * sizeof (int32_t)));
+
+ for (i = len; i; i--) {
+ int c;
+
+ for (c = 0; c < nc; c++)
+ dst[c] = src[c];
+
+ src += sc;
+ dst += tc;
+ }
+ }
+ }
+
+ /*
+ * If we didn't do SRC pre-conversion, then do it now.
+ */
+ if (sp->s_cnv_src_rate != sp->s_cnv_dst_rate &&
+ sp->s_cnv_src_nchan > sp->s_cnv_dst_nchan) {
+
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+
+ len = do_src(sp, src, dst, len, sp->s_cnv_dst_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+ }
+
+ /*
+ * Finally convert samples from internal 24 bit format to target format
+ */
+
+ switch (sp->s_cnv_dst_format) {
+ case AUDIO_FORMAT_U8:
+ len = cnv_to_u8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S8:
+ len = cnv_to_s8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ len = cnv_to_s16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_OE:
+ len = cnv_to_s16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_NE:
+ len = cnv_to_u16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_OE:
+ len = cnv_to_u16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_OE:
+ len = cnv_s24oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_PACKED:
+ len = cnv_to_s24p(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ len = cnv_to_s32ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_OE:
+ len = cnv_to_s32oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ULAW:
+ len = cnv_to_ulaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ len = cnv_to_alaw(sp, len);
+ break;
+ }
+
+ return (len);
+}
+
+static const struct audio_format_info {
+ unsigned format;
+ int sampsize;
+ audio_cnv_func_t from;
+ audio_cnv_func_t to;
+} audio_format_info[] = {
+ { AUDIO_FORMAT_S8, 1, cnv_from_s8, cnv_to_s8 },
+ { AUDIO_FORMAT_U8, 1, cnv_from_u8, cnv_to_u8 },
+ { AUDIO_FORMAT_ULAW, 1, cnv_from_ulaw, cnv_to_ulaw },
+ { AUDIO_FORMAT_ALAW, 1, cnv_from_alaw, cnv_to_alaw },
+ { AUDIO_FORMAT_S16_NE, 2, cnv_from_s16ne, cnv_to_s16ne },
+ { AUDIO_FORMAT_S16_OE, 2, cnv_from_s16oe, cnv_to_s16oe },
+ { AUDIO_FORMAT_U16_NE, 2, cnv_from_u16ne, cnv_to_u16ne },
+ { AUDIO_FORMAT_U16_OE, 2, cnv_from_u16oe, cnv_to_u16oe },
+ { AUDIO_FORMAT_S32_NE, 4, cnv_from_s32ne, cnv_to_s32ne },
+ { AUDIO_FORMAT_S32_OE, 4, cnv_from_s32oe, cnv_to_s32oe },
+
+ /* 24-bit formats are "special" */
+ { AUDIO_FORMAT_S24_NE, 4, NULL, NULL },
+ { AUDIO_FORMAT_S24_OE, 4, cnv_s24oe, cnv_s24oe },
+ { AUDIO_FORMAT_S24_PACKED, 3, cnv_from_s24p, cnv_to_s24p },
+
+ /* sentinel */
+ { AUDIO_FORMAT_NONE, 0, NULL, NULL }
+};
+
+int
+auimpl_format_setup(audio_stream_t *sp, audio_parms_t *uparms)
+{
+ audio_parms_t *source = &sp->s_cnv_src_parms;
+ audio_parms_t *target = &sp->s_cnv_dst_parms;
+ audio_cnv_func_t converter = NULL;
+ const struct audio_format_info *info;
+ int expand = AUDIO_UNIT_EXPAND;
+ unsigned cnv_sampsz = sizeof (uint32_t);
+ unsigned cnv_max;
+
+ if (sp == &sp->s_client->c_ostream) {
+ source = uparms;
+ } else {
+ target = uparms;
+ }
+
+ ASSERT(mutex_owned(&sp->s_lock));
+
+ /*
+ * At least one of the source or target are S24_NE.
+ *
+ * If we have a signed/native endian format, then pick an
+ * optimized converter. While at it, ensure that a valid
+ * format is selected.
+ */
+ if (source->p_format != AUDIO_FORMAT_S24_NE) {
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (source->p_format == info->format) {
+ converter = info->from;
+ expand *= sizeof (int32_t);
+ expand /= info->sampsize;
+ /* save source frame size */
+ cnv_sampsz = info->sampsize;
+ break;
+ }
+ }
+ if (info->format == AUDIO_FORMAT_NONE) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "invalid source format selected");
+ return (EINVAL);
+ }
+
+ } else if (target->p_format != AUDIO_FORMAT_S24_NE) {
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (target->p_format == info->format) {
+ converter = info->to;
+ expand *= info->sampsize;
+ expand /= sizeof (int32_t);
+ break;
+ }
+ }
+ if (info->format == AUDIO_FORMAT_NONE) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "invalid target format selected");
+ return (EINVAL);
+ }
+ }
+
+ if (source->p_nchan != target->p_nchan) {
+ /*
+ * if channels need conversion, then we must use the
+ * default.
+ */
+ converter = cnv_default;
+ expand *= target->p_nchan;
+ expand /= source->p_nchan;
+ }
+
+ if (source->p_rate != target->p_rate) {
+ /*
+ * We need SRC; if we can avoid data conversion, do so.
+ */
+ setup_src(sp, source->p_rate, target->p_rate,
+ source->p_nchan, target->p_nchan);
+
+ converter = (converter == NULL) ? cnv_srconly : cnv_default;
+
+ expand *= target->p_rate;
+ expand /= source->p_rate;
+ }
+
+ ASSERT(sp->s_engine);
+ ASSERT(sp->s_engine->e_intrs);
+
+ /*
+ * Figure out the size of the conversion buffer we need. We
+ * assume room for two full source fragments, which ought to
+ * be enough, even with rounding errors.
+ */
+ cnv_max = 2 * (source->p_rate / sp->s_engine->e_intrs) *
+ cnv_sampsz * source->p_nchan;
+
+ /*
+ * If the conversion will cause us to expand fragments, then
+ * we need to increase cnv_max. Scale by AUDIO_UNIT_EXPAND to
+ * avoid rouding errors or losing bits when doing reducing
+ * conversions.
+ */
+ if (expand > AUDIO_UNIT_EXPAND) {
+ cnv_max *= expand;
+ cnv_max /= AUDIO_UNIT_EXPAND;
+ }
+
+ /*
+ * Now we need to allocate space.
+ */
+ if (sp->s_cnv_max < cnv_max) {
+ uint32_t *buf0, *buf1;
+
+ buf0 = kmem_alloc(cnv_max, KM_NOSLEEP);
+ buf1 = kmem_alloc(cnv_max, KM_NOSLEEP);
+ if ((buf0 == NULL) || (buf1 == NULL)) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "failed to allocate audio conversion buffer "
+ "(%u bytes)", cnv_max);
+ if (buf0)
+ kmem_free(buf0, cnv_max);
+ if (buf1)
+ kmem_free(buf1, cnv_max);
+ return (ENOMEM);
+ }
+
+ if (sp->s_cnv_buf0)
+ kmem_free(sp->s_cnv_buf0, sp->s_cnv_max);
+ if (sp->s_cnv_buf1)
+ kmem_free(sp->s_cnv_buf1, sp->s_cnv_max);
+
+ sp->s_cnv_buf0 = buf0;
+ sp->s_cnv_buf1 = buf1;
+ sp->s_cnv_max = cnv_max;
+ }
+
+ /*
+ * NB: From here on, we must not fail.
+ */
+
+ /*
+ * Configure default fragment setup.
+ */
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (uparms->p_format == info->format) {
+ break;
+ }
+ }
+ ASSERT(info->sampsize);
+
+ sp->s_framesz = info->sampsize * uparms->p_nchan;
+ sp->s_fragfr = (uparms->p_rate / sp->s_engine->e_intrs);
+ sp->s_fragbytes = sp->s_fragfr * sp->s_framesz;
+ sp->s_nfrags = sp->s_allocsz / sp->s_fragbytes;
+ sp->s_nframes = sp->s_nfrags * sp->s_fragfr;
+ sp->s_nbytes = sp->s_nframes * sp->s_framesz;
+ *sp->s_user_parms = *uparms;
+ sp->s_converter = converter;
+
+ /*
+ * Ensure that we toss any stale data -- probably wrong format.
+ * Note that as a consequence of this, all of the offsets and
+ * counters get reset. Clients should not rely on these values
+ * being preserved when changing formats.
+ *
+ * Its critical that we reset the indices, in particular,
+ * because not only will the data be the wrong format, but the
+ * indices themselves are quite possibly going to be invalid.
+ */
+ sp->s_cnv_cnt = 0;
+ sp->s_tail = sp->s_head = 0;
+ sp->s_tidx = sp->s_hidx = 0;
+
+ return (0);
+}
+
+int
+auimpl_format_alloc(audio_stream_t *sp)
+{
+ int i;
+
+ ASSERT(mutex_owned(&sp->s_lock));
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ sp->s_src_state[i] =
+ kmem_zalloc(sizeof (grc3state_t), KM_NOSLEEP);
+ if (sp->s_src_state[i] == NULL) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "unable to allocate SRC state structures");
+ return (ENOMEM);
+ }
+ }
+ return (0);
+}
+
+void
+auimpl_format_free(audio_stream_t *sp)
+{
+ int i;
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ if (sp->s_src_state[i] != NULL) {
+ kmem_free(sp->s_src_state[i], sizeof (grc3state_t));
+ sp->s_src_state[i] = NULL;
+ }
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_grc3.c b/usr/src/uts/common/io/audio/impl/audio_grc3.c
new file mode 100644
index 0000000000..3d42ab8425
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_grc3.c
@@ -0,0 +1,388 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: GRC3 Sample Rate Converter
+ *
+ * GRC library version 3.1
+ */
+
+#include <sys/types.h>
+#include "audio_grc3.h"
+
+extern const int32_t filter_data_L[];
+extern const int32_t filter_data_M[];
+extern const int32_t filter_data_H[];
+extern const int32_t filter_data_P[];
+
+#define filter_data_HX filter_data_H
+#define filter_data_PX filter_data_P
+
+static int32_t
+_muldivu64(uint32_t a, uint32_t val1, uint32_t val2)
+{
+ uint64_t v = ((uint64_t)a) * val1 / val2;
+ return ((uint32_t)(v));
+}
+
+
+static int32_t
+_grc_sat6(int32_t a, int32_t b)
+{
+ int64_t v = ((int64_t)a) * b + (1 << 5);
+ return ((int32_t)(v >> 6));
+}
+
+static int32_t
+_grc_sat31(int32_t a, int32_t b)
+{
+ int64_t v = ((int64_t)a) * b + (1 << 30);
+ return ((int32_t)(v >> 31));
+}
+
+
+#define DEFINE_FILTER(T) \
+static int32_t \
+_filt31_##T(int32_t a, int32_t idx) \
+{ \
+ int64_t v = ((int64_t)a) * filter_data_##T[idx >> 15]; \
+ return ((int32_t)(v >> 31)); \
+}
+
+#define DEFINE_FILTER_HQ(T) \
+static int32_t \
+_filt31_##T(int32_t a, int32_t idx) \
+{ \
+ int32_t idx2 = idx>>15; \
+ int64_t v = ((int64_t)a) * \
+ \
+ (filter_data_##T[idx2] + \
+ (((int64_t)(idx & 32767)) * (filter_data_##T[idx2 + 1] - \
+ filter_data_##T[idx2]) >> 15)); \
+ return ((int32_t)(v>>31)); \
+}
+
+
+DEFINE_FILTER(L)
+DEFINE_FILTER(M)
+DEFINE_FILTER(H)
+DEFINE_FILTER_HQ(HX)
+DEFINE_FILTER(P)
+DEFINE_FILTER_HQ(PX)
+
+#define DEFINE_CONVD(T, SZ) \
+static int32_t \
+_conv31d_##T(int32_t *history, uint32_t filter, uint32_t incv) \
+{ \
+ int32_t accum = 0; \
+ \
+ filter = (1024 << 15) - filter; \
+ \
+ while (filter < ((uint32_t)(SZ << 15))) { \
+ accum += _filt31_##T(*history, filter); \
+ filter += incv; \
+ history--; \
+ } \
+ \
+ return (accum); \
+}
+
+DEFINE_CONVD(L, 4096)
+DEFINE_CONVD(M, 8192)
+DEFINE_CONVD(H, 16384)
+DEFINE_CONVD(HX, 16384)
+DEFINE_CONVD(P, 32768)
+DEFINE_CONVD(PX, 32768)
+
+static int32_t
+_conv31_L(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+#define ITERATION(p) \
+ accum += _filt31_##p(*history, filter); \
+ filter += (1024 << 15); \
+ history--
+
+ ITERATION(L); ITERATION(L); ITERATION(L); ITERATION(L);
+ return (accum);
+}
+
+
+static int32_t
+_conv31_M(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
+ ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
+ return (accum);
+}
+
+static int32_t
+_conv31_H(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ return (accum);
+}
+
+static int32_t
+_conv31_HX(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ return (accum);
+}
+
+static int32_t
+_conv31_P(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ return (accum);
+}
+
+static int32_t
+_conv31_PX(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ return (accum);
+}
+
+#define GRC3_RESAMPLE(QUAL) \
+static void \
+grc3_upsample_##QUAL(grc3state_t *grc, const int32_t *src, \
+ int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ int32_t ptr = grc->ptr; \
+ int32_t srcrate = grc->srcrate; \
+ int32_t dstrate = grc->dstrate; \
+ int32_t *history = grc->historyptr; \
+ int32_t filtfactor = grc->filtfactor; \
+ uint32_t dstsz = 0; \
+ \
+ src += offset; \
+ dst += offset; \
+ \
+ while (sz > 0) { \
+ while (ptr < dstrate) { \
+ if (dstsz >= bufsz) \
+ goto endloop; \
+ dst[0] = (_conv31_##QUAL(history, \
+ _grc_sat6(ptr, filtfactor))); \
+ ptr += srcrate; \
+ dst += inc; \
+ dstsz++; \
+ } \
+ \
+ history++; \
+ if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
+ history -= GRC3_MAXHISTORY; \
+ \
+ history[0] = history[-GRC3_MAXHISTORY] = (*src); \
+ \
+ ptr -= dstrate; \
+ \
+ sz--; \
+ src += inc; \
+ } \
+endloop: \
+ \
+ grc->ptr = ptr; \
+ grc->historyptr = history; \
+ grc->outsz = dstsz; \
+} \
+ \
+static void \
+grc3_dnsample_##QUAL(grc3state_t *grc, const int32_t *src, \
+ int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ int32_t ptr = grc->ptr; \
+ int32_t srcrate = grc->srcrate; \
+ int32_t dstrate = grc->dstrate; \
+ int32_t sat = grc->sat; \
+ int32_t *history = grc->historyptr; \
+ int32_t filtfactor = grc->filtfactor; \
+ uint32_t dstsz = 0; \
+ \
+ src += offset; \
+ dst += offset; \
+ \
+ while (sz > 0) { \
+ while (ptr >= srcrate) { \
+ if (dstsz >= bufsz) \
+ goto endloop; \
+ ptr -= srcrate; \
+ dst[0] = (_conv31d_##QUAL(history, \
+ _grc_sat6(ptr, filtfactor), \
+ grc->ptr_incv)); \
+ dst += inc; \
+ dstsz++; \
+ } \
+ \
+ history++; \
+ if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
+ history -= GRC3_MAXHISTORY; \
+ \
+ /* \
+ * TODO: for better quality multiplier is worth moving \
+ * to output cascade \
+ */ \
+ history[0] = history[-GRC3_MAXHISTORY] = \
+ _grc_sat31((*src), sat); \
+ \
+ ptr += dstrate; \
+ \
+ sz--; \
+ src += inc; \
+ } \
+endloop: \
+ \
+ grc->ptr = ptr; \
+ grc->historyptr = history; \
+ grc->outsz = dstsz; \
+} \
+ \
+static void \
+grc3_resample_##QUAL(grc3state_t *grc, const void *src, void *dst, \
+ uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ if (grc->srcrate <= grc->dstrate) \
+ grc3_upsample_##QUAL(grc, src, dst, sz, \
+ bufsz, inc, offset); \
+ else \
+ grc3_dnsample_##QUAL(grc, src, dst, sz, \
+ bufsz, inc, offset); \
+}
+
+GRC3_RESAMPLE(L)
+GRC3_RESAMPLE(M)
+GRC3_RESAMPLE(H)
+GRC3_RESAMPLE(HX)
+GRC3_RESAMPLE(P)
+GRC3_RESAMPLE(PX)
+
+/*
+ * For performance reasons, we only support 24-bit SRC.
+ */
+void
+grc3_convert(grc3state_t *grc, int quality, const void *src,
+ void *dst, int sz, int bufsz, int inc, int offset)
+{
+
+ switch (quality) {
+ default:
+ case 0:
+ case 1:
+ grc3_resample_L(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 2:
+ grc3_resample_M(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 3:
+ grc3_resample_H(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 4:
+ grc3_resample_HX(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 5:
+ grc3_resample_P(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 6:
+ grc3_resample_PX(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ }
+}
+
+void
+grc3_reset(grc3state_t *grc)
+{
+ int32_t t;
+ grc->ptr = 0;
+ grc->historyptr = grc->history + GRC3_MAXHISTORY;
+
+ for (t = 0; t < GRC3_MAXHISTORY * 2; t++)
+ grc->history[t] = 0;
+}
+
+static void
+grc3_setup_up(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ grc->srcrate = fromRate;
+ grc->dstrate = toRate;
+ grc->filtfactor = 0x80000000U / toRate;
+}
+
+static void
+grc3_setup_dn(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ grc->srcrate = fromRate;
+ grc->dstrate = toRate;
+ grc->filtfactor = 0x80000000U / fromRate;
+ grc->ptr_incv = _muldivu64(1024 << 15, toRate, fromRate);
+ grc->sat = _muldivu64(0x80000000U, toRate, fromRate);
+}
+
+void
+grc3_setup(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ while ((!(fromRate & 1)) && (!(toRate & 1)) && (fromRate > 0)) {
+ fromRate >>= 1;
+ toRate >>= 1;
+ }
+
+ if (fromRate <= toRate)
+ grc3_setup_up(grc, fromRate, toRate);
+ else
+ grc3_setup_dn(grc, fromRate, toRate);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_grc3.h b/usr/src/uts/common/io/audio/impl/audio_grc3.h
new file mode 100644
index 0000000000..0003dc1574
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_grc3.h
@@ -0,0 +1,275 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: GRC library version 3.1 internal definitions
+ *
+ * GRC3 is a high quality sample rate conversion module that uses fixed point
+ * arithmetic.
+ */
+
+#ifndef AUDIO_GRC3_H
+#define AUDIO_GRC3_H
+
+#define GRC3_MAXHISTORY 4096
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef struct grc3state {
+ uint32_t srcrate;
+ uint32_t dstrate;
+ uint32_t ptr;
+ uint32_t ptr_incv;
+
+ uint32_t sat;
+ uint32_t filtfactor;
+ int32_t *historyptr;
+ int32_t dummy_pad1;
+
+ int32_t history[GRC3_MAXHISTORY * 2];
+
+ uint32_t outsz;
+} grc3state_t;
+
+
+/* BEGIN CSTYLED */
+/*****************************************************************************
+
+ Tutorial on how to use GRC3 rate conversion
+
+1. First, you create an instance of grc3state_t for each channel. If you
+ are working with stereo files - you will need 2 of such instances,
+ for quadro - 4.
+
+ The instances may be allocated in either static or dynamic memory - that
+ makes no difference to the convertor. So, if your program has to process
+ one stereo stream, there's no reason why should you use malloc/free to
+ allocate/deallocate structures. Also, in device drivers, you can
+ use static variables as well:
+
+ static grc3state_t grc[2]; // for two channels
+
+
+2. Before starting any conversion, grc3state_t instances should be initialized
+ properly, and you do this with grc3_setup function. Function itself does
+ not allocate additional memory or change anything except grc3state_t
+ structure, so this is thread safe, and you don't have to do additional
+ "deinitialization".
+
+ If you are doing interleaved audio (stereo/quadro/whatever) conversion,
+ you should do setup on each of the channels, and should have separate
+ instance of grc3state_t for each channel. As you will understand further,
+ such conversion is done separately. And now, the setup function:
+
+ int grc3_setup( grc3state_t *grc,
+ uint32_t fromRate,
+ uint32_t toRate );
+
+ grc - pointer to grc3state_t instance
+ fromRate - source sample rate
+ toRate - destination sample rate
+
+ Note, that sample rates itself are not important - the important thing
+ is ratio between those sample rates. So, for example, if you have to
+ convert from 24000Hz to 48000Hz, it's ok to write:
+
+ grc3_setup( &grc[0], 240, 480 );
+
+ Sometimes (in MIDI synths) it would be desired to use fractional sample
+ rates. For example, setup for conversion from 33100.78 to 48000 may look
+ like this:
+
+ grc3_setup( &grc[0], 3310078, 4800000);
+
+ Note, that on stereo, GRC3 setup will look like this:
+
+ static grc3state_t grc[2];
+
+ // ...
+
+ grc3_setup( &grc[0], 3310078, 4800000)
+ grc3_setup( &grc[1], 3310078, 4800000);
+
+
+ Note, that you should not rely on grc3_setup's fast execution or any
+ execution timing. It may contain some massive arithmetic and even huge
+ loops, so avoid putting grc3_setup to inner loops and calling in
+ latency-dependent code.
+
+
+3. Next, before running a stream through grc3_convert function, you should
+ reset each of grc3state_t instance used:
+
+ void grc3_reset(grc3state_t *grc);
+
+
+ grc - pointer to GRC3 instance variable
+
+ So, for stereo, this appears to be:
+
+ static grc3state_t grc[2];
+
+ // ...
+
+ grc3_reset( &grc[0] );
+ grc3_reset( &grc[1] );
+
+
+4. Finally, doing conversion is easy:
+
+ void grc3_convert( grc3state_t *grc,
+ int domain,
+ int quality,
+ const void *src,
+ void *dst,
+ int maxInSize,
+ int maxOutSize,
+ int interleave,
+ int offset );
+
+
+ grc - pointer to initialized grc3state_t instance; you
+ can specify NULL to check whether a particular
+ domain/quality pair is supported, check return value
+
+ quality - quality to use for conversion, supported values are:
+
+ 0 - D lowest quality (normally equals to low quality)
+ 1 - L low quality (spline interpolation)
+ 2 - M medium quality (lagrange interpolation)
+ 3 - H high quality
+ 4 - HX high quality (high quality with extra precision)
+ 5 - P production quality
+
+ 6 - PX production quality (prod quality with extra precision)
+ (PX is currently disabled because it causes a crash)
+
+ src - source audio buffer
+
+ dst - destination audio buffer;
+
+ maxInSize - size of input buffer (in samples per channel!)
+
+ maxOutSize - size of output buffer (in samples per channel!)
+ (will never overrun this size)
+
+ interleave - interleave factor; for MONO or non-interleaved data
+ it should be equal to 1;
+
+ 2 - STEREO interleaved audio
+ 4 - QUADRO interleaved audio
+
+ So, basically, this parameter should be equal to number
+ of interleaved channels
+
+ offset - number of interleaved channel currently processing,
+ starting from 0; for MONO or non-interleaved data
+ it should be equal to 0
+
+
+ For unsupported quality values, it will fall back to
+ "D" quality (the lowest one)
+
+ also on return it sets:
+
+ grc->outsz == number of output samples
+
+ Note, that if quality is not supported,
+ calling the function with real data will fall back
+ to the worst quality available.
+
+ Note that this version of GRC3 only supports 24-bit
+ native endian. (Modified by Sun for performance.)
+
+
+
+5. Interleaved processing of N channels is done like this:
+
+
+ static grc3state_t grc[N];
+ int t;
+
+ //...
+
+
+ for(t=0; t<N; t++)
+ {
+ grc3_setup( &grc[t], 22050, 48000 );
+
+ grc3_reset( &grc[t] );
+ }
+
+
+ //...
+
+ while (...) {
+
+ for(t = 0; t < N; t++) {
+ grc3_convert(&grc[t], // instance pointer
+ 4, // quality
+ in_buffer, // input buffer
+ out_buffer, // input buffer
+ in_samples_count, // number of samples
+ // in in_buffer
+ 2048, // size of out_buffer
+ N, t // num of channels, channel#
+ );
+ }
+
+
+ // Normally, for interleaved data, ->outsz of all instances will
+ // be the same for the same stream
+
+ put_sound_somewhere(out_buffer,
+ grc[0]->outsz * N * sizeof(out_buffer[0]) );
+ }
+
+
+6. If you use the same storage and the same setup for processing few separate
+ non-related sounds, to prevent the feedback of sound1's tail to sound2's
+ beginning - do grc3_reset on the state instances before calling
+ grc_convert.
+
+*****************************************************************************
+*/
+/* END CSTYLED */
+
+void grc3_setup(grc3state_t *, uint32_t fromRate, uint32_t toRate);
+
+void grc3_reset(grc3state_t *);
+
+void grc3_convert(grc3state_t *, int quality,
+ const void *src, void *dst, int sz, int bufsz, int inc, int offset);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* AUDIO_GRC3_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_impl.h b/usr/src/uts/common/io/audio/impl/audio_impl.h
new file mode 100644
index 0000000000..7c8099ea88
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_impl.h
@@ -0,0 +1,472 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO_IMPL_H
+#define _AUDIO_IMPL_H
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/poll.h>
+
+#include <sys/audio/audio_driver.h>
+#include "audio_client.h"
+
+#define AUDIO_MAX_OPENS 256
+#define AUDIO_MAX_CHANNELS 16
+#define AUDIO_UNIT_EXPAND 1024
+#define AUDIO_CHBUFS 2048 /* samples for mixing */
+#define AUDIO_VOL_SCALE 256
+#define AUDIO_DB_SIZE 50
+
+struct audio_parms {
+ int p_format;
+ int p_rate;
+ int p_nchan;
+};
+
+typedef int (*audio_cnv_func_t)(audio_stream_t *, int);
+
+struct audio_buffer {
+ caddr_t b_data;
+ uint64_t b_head;
+ uint64_t b_tail;
+ unsigned b_hidx; /* head % nframes */
+ unsigned b_tidx; /* tail % nframes */
+ unsigned b_fragfr; /* frames per frag */
+ unsigned b_fragbytes; /* bytes per frag */
+ unsigned b_nframes; /* total frames */
+ unsigned b_nbytes; /* total bytes */
+ unsigned b_nfrags; /* total frags */
+ unsigned b_framesz; /* bytes per frame */
+};
+
+/*
+ * struct audio_stream: This structure represents a virtual stream exposed
+ * to a single client. Each client will have at most two of these (one for
+ * record, one for playback.)
+ */
+struct audio_stream {
+ audio_buffer_t s_buf;
+#define s_data s_buf.b_data
+#define s_bufsz s_buf.b_size
+#define s_head s_buf.b_head
+#define s_tail s_buf.b_tail
+#define s_nfrags s_buf.b_nfrags
+#define s_framesz s_buf.b_framesz
+#define s_fragfr s_buf.b_fragfr
+#define s_fragbytes s_buf.b_fragbytes
+#define s_nframes s_buf.b_nframes
+#define s_nbytes s_buf.b_nbytes
+#define s_tidx s_buf.b_tidx
+#define s_hidx s_buf.b_hidx
+ ddi_umem_cookie_t s_cookie;
+ size_t s_allocsz;
+
+ /*
+ * Various counters.
+ */
+ uint64_t s_samples;
+ uint64_t s_errors; /* underrun or overrun count */
+
+ boolean_t s_running;
+ boolean_t s_paused; /* stream paused */
+ boolean_t s_draining; /* stream draining */
+
+ /*
+ * Sample rate conversion (SRC) and format conversion details.
+ */
+ struct grc3state *s_src_state[AUDIO_MAX_CHANNELS];
+ unsigned s_src_quality;
+ int s_cnv_max;
+ audio_cnv_func_t s_converter;
+ uint32_t *s_cnv_buf0;
+ uint32_t *s_cnv_buf1;
+ void *s_cnv_src;
+ void *s_cnv_dst;
+ audio_parms_t s_cnv_src_parms;
+#define s_cnv_src_nchan s_cnv_src_parms.p_nchan
+#define s_cnv_src_rate s_cnv_src_parms.p_rate
+#define s_cnv_src_format s_cnv_src_parms.p_format
+
+ audio_parms_t s_cnv_dst_parms;
+#define s_cnv_dst_nchan s_cnv_dst_parms.p_nchan
+#define s_cnv_dst_rate s_cnv_dst_parms.p_rate
+#define s_cnv_dst_format s_cnv_dst_parms.p_format
+
+ size_t s_cnv_cnt;
+ int32_t *s_cnv_ptr;
+
+ audio_parms_t *s_user_parms;
+ audio_parms_t *s_phys_parms;
+
+ /*
+ * Volume.
+ */
+ uint8_t s_gain_master;
+ uint8_t s_gain_pct;
+ uint16_t s_gain_scaled;
+ uint16_t s_gain_eff;
+ boolean_t s_muted;
+
+ /*
+ * Callbacks.
+ */
+ uint64_t s_drain_idx; /* engine index */
+
+ /*
+ * Other per stream details, e.g. channel offset, etc.
+ */
+ kmutex_t s_lock;
+ kcondvar_t s_cv;
+ list_node_t s_eng_linkage; /* place on engine list */
+ audio_client_t *s_client;
+ audio_engine_t *s_engine;
+ int s_choffs;
+
+ /*
+ * Other bits.
+ */
+ unsigned s_engcap; /* ENGINE_xxx_CAP */
+};
+
+/*
+ * struct audio_client: This structure represents a logical port,
+ * associated with an open file, etc. These are the entities that are
+ * mixed.
+ */
+struct audio_client {
+ audio_stream_t c_istream;
+ audio_stream_t c_ostream;
+ void *c_private;
+
+ /*
+ * DDI support.
+ */
+ major_t c_major;
+ minor_t c_minor;
+ minor_t c_origminor;
+
+ /*
+ * Linkage for per-device list of clients.
+ */
+ list_node_t c_global_linkage;
+ list_node_t c_dev_linkage;
+ int c_refcnt;
+
+ kmutex_t c_lock;
+ kcondvar_t c_cv;
+ ddi_taskq_t *c_tq;
+ boolean_t c_do_output;
+ boolean_t c_do_input;
+ boolean_t c_do_notify;
+ boolean_t c_do_drain;
+ boolean_t c_closing;
+ boolean_t c_is_open;
+
+ /*
+ * Client wide settings... e.g. ops vector, etc.
+ */
+ unsigned c_omode; /* open mode */
+ pid_t c_pid; /* opening process id */
+ audio_dev_t *c_dev;
+ cred_t *c_cred;
+ audio_client_ops_t c_ops;
+#define c_open c_ops.aco_open
+#define c_close c_ops.aco_close
+#define c_read c_ops.aco_read
+#define c_write c_ops.aco_write
+#define c_ioctl c_ops.aco_ioctl
+#define c_chpoll c_ops.aco_chpoll
+#define c_output c_ops.aco_output
+#define c_input c_ops.aco_input
+#define c_notify c_ops.aco_notify
+#define c_drain c_ops.aco_drain
+
+ struct pollhead c_pollhead;
+
+};
+
+struct audio_infostr {
+ char i_line[100];
+ list_node_t i_linkage;
+};
+
+struct audio_stats {
+ kstat_named_t st_head;
+ kstat_named_t st_tail;
+ kstat_named_t st_flags;
+ kstat_named_t st_fragfr;
+ kstat_named_t st_nfrags;
+ kstat_named_t st_framesz;
+ kstat_named_t st_nbytes;
+ kstat_named_t st_hidx;
+ kstat_named_t st_tidx;
+ kstat_named_t st_format;
+ kstat_named_t st_nchan;
+ kstat_named_t st_rate;
+ kstat_named_t st_intrs;
+ kstat_named_t st_errors;
+ kstat_named_t st_suspended;
+};
+
+/*
+ * An audio engine corresponds to a single DMA transfer channel. It can
+ * represent either record or playback, but not both at the same time.
+ * A device that supports simultaneous record and playback will register
+ * separate channels.
+ */
+struct audio_engine {
+ audio_engine_ops_t e_ops;
+ void *e_private;
+ unsigned e_flags;
+
+ /*
+ * Mixing related fields.
+ */
+ unsigned e_limiter_state;
+ int32_t *e_chbufs[AUDIO_MAX_CHANNELS];
+ unsigned e_choffs[AUDIO_MAX_CHANNELS];
+ unsigned e_chincr[AUDIO_MAX_CHANNELS];
+ void (*e_export)(audio_engine_t *);
+ void (*e_import)(audio_engine_t *, audio_stream_t *);
+
+ /*
+ * Underlying physical buffer shared with device driver.
+ */
+ audio_buffer_t e_buf;
+#define e_head e_buf.b_head
+#define e_tail e_buf.b_tail
+#define e_data e_buf.b_data
+#define e_fragfr e_buf.b_fragfr
+#define e_fragbytes e_buf.b_fragbytes
+#define e_framesz e_buf.b_framesz
+#define e_nbytes e_buf.b_nbytes
+#define e_nframes e_buf.b_nframes
+#define e_nfrags e_buf.b_nfrags
+#define e_hidx e_buf.b_hidx
+#define e_tidx e_buf.b_tidx
+
+ int e_intrs;
+ int e_errors;
+
+ audio_parms_t e_parms;
+#define e_format e_parms.p_format
+#define e_nchan e_parms.p_nchan
+#define e_rate e_parms.p_rate
+
+ /*
+ * Statistics.
+ */
+ kstat_t *e_ksp;
+ struct audio_stats e_stats;
+
+
+ /*
+ * Synchronization.
+ */
+ kmutex_t e_lock;
+
+ /*
+ * Linkage for per-device list.
+ */
+ list_node_t e_dev_linkage;
+ audio_dev_t *e_dev;
+ int e_num; /* arbitrary engine number */
+
+ /*
+ * List of of streams attached to this engine.
+ */
+ list_t e_streams;
+ int e_nrunning;
+ boolean_t e_suspended;
+};
+
+struct audio_dev {
+ dev_info_t *d_dip;
+ major_t d_major;
+ int d_instance;
+
+ uint32_t d_flags;
+#define DEV_OUTPUT_CAP (1U << 0)
+#define DEV_INPUT_CAP (1U << 1)
+#define DEV_DUPLEX_CAP (1U << 2)
+#define DEV_SNDSTAT_CAP (1U << 3)
+
+ char d_name[128]; /* generic description */
+ char d_desc[128]; /* detailed config descr */
+ char d_vers[128]; /* detailed version descr */
+ int d_number; /* global /dev/audioXX # */
+ int d_index; /* master device index */
+ int d_engno; /* engine counter */
+
+ list_t d_hwinfo; /* strings of hw info */
+
+ /*
+ * Synchronization.
+ */
+ kmutex_t d_lock;
+ kcondvar_t d_cv;
+ krwlock_t d_ctrl_lock; /* leaf lock */
+ krwlock_t d_clnt_lock;
+ unsigned d_refcnt;
+
+ /*
+ * Lists of virtual clients, controls and engines. Protected by
+ * the d_lock field above.
+ */
+ list_t d_clients;
+ list_t d_engines;
+ list_t d_controls;
+ audio_ctrl_t *d_pcmvol_ctrl;
+ uint64_t d_pcmvol;
+
+ /*
+ * Linkage onto global list of devices.
+ */
+ list_node_t d_by_index;
+ list_node_t d_by_number;
+
+ /*
+ * Personality specific data.
+ */
+ void *d_minor_data[1 << AUDIO_MN_TYPE_NBITS];
+};
+
+/*
+ * Each audio_dev optionally can have controls attached to it.
+ * Controls are separate from audio engines. They are methods of
+ * adjusting pharameters or reading metrics that usually relate to
+ * hardware on devices engine by the driver. They can be things like
+ * master volume for example.
+ *
+ * If the driver does not support controls then it must insure
+ * that any hardware controls are initialized to a usable state.
+ *
+ * For the framework/user-apps to be able to change controls
+ * the driver must create, enable and configure controls with
+ * control API's.
+ *
+ * There are a number of common controls (well-known) that most
+ * hardware supports. These have known names and known ctrl numbers.
+ * In addition a driver can have any number of extention
+ * controls (device-private). These can have any name and any ctrl
+ * number other then the ones, defined as well-knonw ones.
+ *
+ * Only controls created through control API's will be available,
+ * well-known or device-private.
+ */
+struct audio_ctrl {
+ audio_ctrl_desc_t ctrl_des;
+#define ctrl_name ctrl_des.acd_name
+#define ctrl_type ctrl_des.acd_type
+#define ctrl_enum ctrl_des.acd_enum
+#define ctrl_flags ctrl_des.acd_flags
+ audio_dev_t *ctrl_dev;
+ audio_ctrl_rd_t ctrl_read_fn;
+ audio_ctrl_wr_t ctrl_write_fn;
+ list_node_t ctrl_linkage;
+ kmutex_t ctrl_lock;
+ void *ctrl_arg;
+};
+
+
+/*
+ * Prototypes.
+ */
+
+/* audio_format.c */
+int auimpl_format_alloc(audio_stream_t *);
+void auimpl_format_free(audio_stream_t *);
+int auimpl_format_setup(audio_stream_t *, audio_parms_t *);
+
+/* audio_output.c */
+void auimpl_export_16ne(audio_engine_t *);
+void auimpl_export_16oe(audio_engine_t *);
+void auimpl_export_24ne(audio_engine_t *);
+void auimpl_export_24oe(audio_engine_t *);
+void auimpl_export_32ne(audio_engine_t *);
+void auimpl_export_32oe(audio_engine_t *);
+void auimpl_output_callback(audio_engine_t *);
+
+/* audio_input.c */
+void auimpl_import_16ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_16oe(audio_engine_t *, audio_stream_t *);
+void auimpl_import_24ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_24oe(audio_engine_t *, audio_stream_t *);
+void auimpl_import_32ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_32oe(audio_engine_t *, audio_stream_t *);
+void auimpl_input_callback(audio_engine_t *);
+int auimpl_input_drain(audio_stream_t *);
+
+/* audio_client.c */
+void auimpl_client_init(void);
+void auimpl_client_fini(void);
+audio_client_t *auimpl_client_create(dev_t);
+void auimpl_client_destroy(audio_client_t *);
+int auimpl_create_minors(audio_dev_t *);
+void auimpl_remove_minors(audio_dev_t *);
+void auimpl_set_gain_master(audio_stream_t *, uint8_t);
+
+/* audio_engine.c */
+void auimpl_dev_init(void);
+void auimpl_dev_fini(void);
+void auimpl_dev_hold(audio_dev_t *);
+audio_dev_t *auimpl_dev_hold_by_devt(dev_t);
+audio_dev_t *auimpl_dev_hold_by_index(int);
+void auimpl_dev_release(audio_dev_t *);
+int auimpl_choose_format(int);
+
+int auimpl_engine_open(audio_dev_t *, int, int, audio_stream_t *);
+void auimpl_engine_close(audio_stream_t *);
+
+void auimpl_dev_walk_engines(audio_dev_t *,
+ int (*)(audio_engine_t *, void *), void *);
+
+void auimpl_dev_vwarn(audio_dev_t *, const char *, va_list);
+
+/* engine operations */
+#define E_OP(e, entry) ((e)->e_ops.audio_engine_##entry)
+#define E_PRV(e) ((e)->e_private)
+#define ENG_FORMAT(e) E_OP(e, format)(E_PRV(e))
+#define ENG_RATE(e) E_OP(e, rate)(E_PRV(e))
+#define ENG_CHANNELS(e) E_OP(e, channels)(E_PRV(e))
+#define ENG_SYNC(e, num) E_OP(e, sync)(E_PRV(e), num)
+#define ENG_START(e) E_OP(e, start)(E_PRV(e))
+#define ENG_STOP(e) E_OP(e, stop)(E_PRV(e))
+#define ENG_COUNT(e) E_OP(e, count)(E_PRV(e))
+#define ENG_QLEN(e) E_OP(e, qlen)(E_PRV(e))
+#define ENG_CLOSE(e) E_OP(e, close)(E_PRV(e))
+#define ENG_OPEN(e, s, nf, d) E_OP(e, open)(E_PRV(e), e->e_flags, s, nf, d)
+#define ENG_CHINFO(e, c, o, i) E_OP(e, chinfo(E_PRV(e), c, o, i))
+
+/* audio_sun.c */
+void auimpl_sun_init(void);
+
+/* audio_oss.c */
+void auimpl_oss_init(void);
+
+#endif /* _AUDIO_IMPL_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_input.c b/usr/src/uts/common/io/audio/impl/audio_input.c
new file mode 100644
index 0000000000..8646707880
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_input.c
@@ -0,0 +1,229 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Virtual mixing audio input routines
+ *
+ * This file contains the actual mixing and resampling engine for input.
+ */
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sysmacros.h>
+#include "audio_impl.h"
+
+#ifdef DEBUG
+int audio_overruns = 0;
+#endif
+
+#define DECL_AUDIO_IMPORT(NAME, TYPE, SWAP, SHIFT) \
+void \
+auimpl_import_##NAME(audio_engine_t *eng, audio_stream_t *sp) \
+{ \
+ int nch = eng->e_nchan; \
+ int32_t *out; \
+ TYPE *in; \
+ int ch; \
+ void *data; \
+ int vol; \
+ \
+ data = sp->s_cnv_src; \
+ ch = 0; \
+ in = (void *)(eng->e_data + (eng->e_tidx * eng->e_framesz)); \
+ out = data; \
+ vol = sp->s_gain_eff; \
+ \
+ do { /* for each channel */ \
+ TYPE *ip; \
+ int32_t *op; \
+ int i; \
+ \
+ /* get value and adjust next channel offset */ \
+ op = out++; \
+ ip = in++; \
+ \
+ i = eng->e_fragfr; \
+ \
+ do { /* for each frame */ \
+ int32_t sample = (TYPE)SWAP(*ip); \
+ int32_t scaled = sample SHIFT; \
+ \
+ scaled *= vol; \
+ scaled /= AUDIO_VOL_SCALE; \
+ \
+ *op = scaled; \
+ ip += nch; \
+ op += nch; \
+ \
+ } while (--i); \
+ ch++; \
+ } while (ch < nch); \
+}
+
+DECL_AUDIO_IMPORT(16ne, int16_t, /* nop */, << 8)
+DECL_AUDIO_IMPORT(16oe, int16_t, ddi_swap16, << 8)
+DECL_AUDIO_IMPORT(32ne, int32_t, /* nop */, >> 8)
+DECL_AUDIO_IMPORT(32oe, int32_t, ddi_swap32, >> 8)
+DECL_AUDIO_IMPORT(24ne, int32_t, /* nop */, /* nop */)
+DECL_AUDIO_IMPORT(24oe, int32_t, ddi_swap32, /* nop */)
+
+/*
+ * Produce a fragment's worth of data. This is called when the data in
+ * the conversion buffer is exhausted, and we need to refill it from the
+ * source buffer. We always consume data from the client in quantities of
+ * a fragment at a time (assuming that a fragment is available.)
+ */
+static void
+auimpl_produce_fragment(audio_stream_t *sp, unsigned count)
+{
+ unsigned nframes;
+ unsigned framesz;
+ caddr_t cnvsrc;
+ caddr_t data;
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_hidx < nframes);
+ ASSERT(sp->s_tidx < nframes);
+
+ /*
+ * Copy data. We deal properly with wraps. Done as a
+ * do...while to minimize the number of tests.
+ */
+ cnvsrc = sp->s_cnv_src;
+ data = sp->s_data + (sp->s_hidx * framesz);
+ do {
+ unsigned nf;
+ unsigned nb;
+
+ ASSERT(sp->s_hidx < nframes);
+ nf = min(nframes - sp->s_hidx, count);
+ nb = nf * framesz;
+
+ bcopy(cnvsrc, data, nb);
+ data += nb;
+ cnvsrc += nb;
+ sp->s_hidx += nf;
+ sp->s_head += nf;
+ count -= nf;
+ sp->s_samples += nf;
+ if (sp->s_hidx >= nframes) {
+ sp->s_hidx -= nframes;
+ data -= sp->s_nbytes;
+ }
+ } while (count);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+}
+
+void
+auimpl_input_callback(audio_engine_t *eng)
+{
+ int fragfr = eng->e_fragfr;
+ boolean_t overrun;
+ audio_client_t *c;
+
+ /* consume all fragments in the buffer */
+ while ((eng->e_head - eng->e_tail) > fragfr) {
+
+ /*
+ * Consider doing the SYNC outside of the lock.
+ */
+ ENG_SYNC(eng, fragfr);
+
+ for (audio_stream_t *sp = list_head(&eng->e_streams);
+ sp != NULL;
+ sp = list_next(&eng->e_streams, sp)) {
+ int space;
+ int count;
+
+ c = sp->s_client;
+
+ mutex_enter(&sp->s_lock);
+ /* skip over streams paused or not running */
+ if (sp->s_paused || (!sp->s_running) ||
+ eng->e_suspended) {
+ mutex_exit(&sp->s_lock);
+ continue;
+ }
+ sp->s_cnv_src = sp->s_cnv_buf0;
+ sp->s_cnv_dst = sp->s_cnv_buf1;
+ eng->e_import(eng, sp);
+
+ /*
+ * Optionally convert fragment to requested sample
+ * format and rate.
+ */
+ if (sp->s_converter != NULL) {
+ count = sp->s_converter(sp, fragfr);
+ } else {
+ count = fragfr;
+ }
+
+ space = sp->s_nframes - (sp->s_head - sp->s_tail);
+ if (count > space) {
+#ifdef DEBUG
+ audio_overruns++;
+#endif
+ sp->s_errors += count - space;
+ count = space;
+ overrun = B_TRUE;
+ } else {
+ overrun = B_FALSE;
+ }
+
+ auimpl_produce_fragment(sp, count);
+
+ /* wake blocked threads (blocking reads, etc.) */
+ cv_broadcast(&sp->s_cv);
+
+ mutex_exit(&sp->s_lock);
+
+ mutex_enter(&c->c_lock);
+ if (overrun) {
+ c->c_do_notify = B_TRUE;
+ }
+ c->c_do_input = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+
+ /*
+ * Update the tail pointer, and the data pointer.
+ */
+ eng->e_tail += fragfr;
+ eng->e_tidx += fragfr;
+ if (eng->e_tidx >= eng->e_nframes) {
+ eng->e_tidx -= eng->e_nframes;
+ }
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_oss.c b/usr/src/uts/common/io/audio/impl/audio_oss.c
new file mode 100644
index 0000000000..a77fcd1196
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_oss.c
@@ -0,0 +1,2577 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/open.h>
+#include <sys/errno.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_oss.h>
+#include <sys/file.h>
+#include <sys/note.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include "audio_client.h"
+
+#define OSS_FMT AFMT_S16_LE
+#define OSS_RATE 48000
+#define OSS_CHANNELS 2
+
+typedef struct ossclient ossclient_t;
+typedef struct ossdev ossdev_t;
+
+static const struct {
+ int oss;
+ int fmt;
+} oss_formats[] = {
+ { AFMT_MU_LAW, AUDIO_FORMAT_ULAW },
+ { AFMT_A_LAW, AUDIO_FORMAT_ALAW },
+ { AFMT_U8, AUDIO_FORMAT_U8 },
+ { AFMT_S8, AUDIO_FORMAT_S8 },
+ { AFMT_S16_BE, AUDIO_FORMAT_S16_BE },
+ { AFMT_S16_LE, AUDIO_FORMAT_S16_LE },
+ { AFMT_U16_BE, AUDIO_FORMAT_U16_BE },
+ { AFMT_U16_LE, AUDIO_FORMAT_U16_LE },
+ { AFMT_S24_BE, AUDIO_FORMAT_S24_BE },
+ { AFMT_S24_LE, AUDIO_FORMAT_S24_LE },
+ { AFMT_S32_BE, AUDIO_FORMAT_S32_BE },
+ { AFMT_S32_LE, AUDIO_FORMAT_S32_LE },
+ { AFMT_S24_PACKED, AUDIO_FORMAT_S24_PACKED },
+ { AFMT_AC3, AUDIO_FORMAT_AC3 },
+ { AFMT_QUERY, AUDIO_FORMAT_NONE }
+};
+
+/* common structure shared between both mixer and dsp nodes */
+struct ossclient {
+ ossdev_t *o_ossdev;
+ audio_client_t *o_client;
+ /* sndstat */
+ kmutex_t o_ss_lock;
+ char *o_ss_buf;
+ size_t o_ss_len;
+ size_t o_ss_sz;
+ size_t o_ss_off;
+};
+
+struct ossdev {
+ audio_dev_t *d_dev;
+
+ uint_t d_modify_cnt; /* flag apps of ctrl changes */
+ uint_t d_nctrl; /* num actual controls */
+ uint_t d_nalloc; /* num allocated controls */
+ audio_ctrl_t **d_ctrls; /* array of control handles */
+ oss_mixext *d_exts; /* array of mixer descs */
+
+ int d_play_grp;
+ int d_rec_grp;
+ int d_mon_grp;
+ int d_misc_grp;
+
+ kmutex_t d_mx;
+ kcondvar_t d_cv;
+};
+
+static int
+oss_cnt_controls(audio_ctrl_t *ctrl, void *arg)
+{
+ int *pint = (int *)arg;
+ int cnt;
+ audio_ctrl_desc_t desc;
+
+ cnt = *pint;
+ cnt++;
+ *pint = cnt;
+
+ if (auclnt_control_describe(ctrl, &desc) != 0)
+ return (AUDIO_WALK_CONTINUE);
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ for (uint64_t mask = desc.acd_maxvalue; mask; mask >>= 1) {
+ if (mask & 1) {
+ cnt++;
+ }
+ }
+ *pint = cnt;
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+/*
+ * Add one entry to the OSS user control table to internal control
+ * helper table.
+ *
+ * This is used with auimpl_walk_controls. The table must be pre-
+ * allocated before it is walk'd. This includes the root and
+ * extended control markers!
+ */
+static int
+oss_add_control(audio_ctrl_t *ctrl, void *arg)
+{
+ ossdev_t *odev = arg;
+ audio_ctrl_desc_t desc;
+ oss_mixext *ext;
+ int bit;
+ uint64_t mask;
+ const char *name;
+ int parent;
+ int flags;
+ unsigned scope;
+
+ if (auclnt_control_describe(ctrl, &desc))
+ return (AUDIO_WALK_CONTINUE);
+
+ parent = 0;
+
+ /*
+ * Add appropriate group if not already done so.
+ */
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_PLAY) {
+ if (!odev->d_play_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_OUTPUT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "PLAYBACK");
+ odev->d_play_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_OUTPUT;
+ parent = odev->d_play_grp;
+ } else if (desc.acd_flags & AUDIO_CTRL_FLAG_REC) {
+ if (!odev->d_rec_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_INPUT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "RECORD");
+ odev->d_rec_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_INPUT;
+ parent = odev->d_rec_grp;
+ } else if (desc.acd_flags & AUDIO_CTRL_FLAG_MONITOR) {
+ if (!odev->d_mon_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_MONITOR;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "MONITOR");
+ odev->d_mon_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_MONITOR;
+ parent = odev->d_mon_grp;
+ } else {
+ if (!odev->d_misc_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_OTHER;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "MISC");
+ odev->d_misc_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_OTHER;
+ parent = odev->d_misc_grp;
+ }
+
+ name = desc.acd_name ? desc.acd_name : "";
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->timestamp = gethrtime();
+ ext->parent = parent;
+ ext->desc = scope;
+ (void) snprintf(ext->id, sizeof (ext->id), "%s", name);
+ (void) snprintf(ext->extname, sizeof (ext->extname),
+ "%s", name);
+ parent = odev->d_nctrl++;
+ }
+
+ /* Next available open entry */
+ ext = &odev->d_exts[odev->d_nctrl];
+
+ /* Record the underlying control handle */
+ odev->d_ctrls[odev->d_nctrl] = ctrl;
+
+ /*
+ * Now setup the oss entry
+ */
+
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->maxvalue = (int)desc.acd_maxvalue;
+ ext->minvalue = (int)desc.acd_minvalue;
+ ext->timestamp = gethrtime();
+ ext->parent = parent;
+ ext->desc = scope;
+ /* all controls should be pollable for now */
+ flags = MIXF_POLL;
+
+ /*
+ * The following flags are intended to help out applications
+ * which need to figure out where to place certain controls.
+ * A few further words of guidance:
+ *
+ * Apps that just want a single master volume control should
+ * adjust the control(s) that are labelled with MIXF_PCMVOL if
+ * present. They can fall back to adjusting all MAINVOL
+ * levels instead, if no PCMVOL is present.
+ *
+ * Controls that are one type on a certain device might be a
+ * different type on another device. For example,
+ * audiopci/ak4531 can adjust input gains for individual
+ * levels, but lacks a master record gain. AC'97, on the
+ * other hand, has individual monitor gains for inputs, but
+ * only a single master recording gain.
+ */
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_READABLE)
+ flags |= MIXF_READABLE;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_WRITEABLE)
+ flags |= MIXF_WRITEABLE;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_CENTIBEL)
+ flags |= MIXF_CENTIBEL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_DECIBEL)
+ flags |= MIXF_DECIBEL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MAINVOL)
+ flags |= MIXF_MAINVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_PCMVOL)
+ flags |= MIXF_PCMVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_RECVOL)
+ flags |= MIXF_RECVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MONVOL)
+ flags |= MIXF_MONVOL;
+ ext->flags = flags;
+
+ (void) snprintf(ext->id, sizeof (ext->id), "%s", name);
+
+ /*
+ * For now just use the same extname as the real name.
+ */
+ (void) snprintf(ext->extname, sizeof (ext->extname), name);
+
+ /*
+ * Now we deal with various control types.
+ */
+ switch (desc.acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ ext->type = MIXT_ONOFF;
+ ext->enumbit = -1;
+ break;
+ case AUDIO_CTRL_TYPE_STEREO:
+ ext->type = MIXT_STEREOSLIDER;
+ break;
+ case AUDIO_CTRL_TYPE_MONO:
+ ext->type = MIXT_MONOSLIDER;
+ break;
+ case AUDIO_CTRL_TYPE_ENUM:
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ /*
+ * We turn AUDIO_CTRL_FLAG_MULTI into a group
+ * of checkboxes, since OSS can't represent it
+ * natively.
+ */
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ while (mask) {
+ if (mask & 1) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ (void) snprintf(ext->extname,
+ sizeof (ext->extname), "%s.%s",
+ name, desc.acd_enum[bit]);
+ (void) snprintf(ext->id,
+ sizeof (ext->id), "%s",
+ desc.acd_enum[bit]);
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->parent = parent;
+ ext->timestamp = gethrtime();
+ ext->type = MIXT_ONOFF;
+ ext->minvalue = 0;
+ ext->maxvalue = 1;
+ ext->enumbit = bit;
+ ext->flags = flags;
+ odev->d_ctrls[odev->d_nctrl] = ctrl;
+ odev->d_nctrl++;
+ }
+ bit++;
+ mask >>= 1;
+ }
+ return (AUDIO_WALK_CONTINUE);
+ } else {
+ /*
+ * NB: This is sufficient only for controls
+ * with a single value. It cannot express the
+ * richer bitmask capabilities.
+ */
+ ext->type = MIXT_ENUM;
+ ext->minvalue = 0;
+
+ /*
+ * For an enumaration, we need to figure out
+ * which values are present, and set the
+ * appropriate mask and max value.
+ */
+ bzero(ext->enum_present, sizeof (ext->enum_present));
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ while (mask) {
+ if (mask & 1) {
+ ext->enum_present[bit / 8] |=
+ (1 << (bit % 8));
+ }
+ mask >>= 1;
+ bit++;
+ }
+ ext->maxvalue = bit;
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_METER:
+ default:
+ /* Its an unknown or unsupported (for now) control, skip */
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ odev->d_nctrl++;
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+/*
+ * Free up an OSS user land control to internal control,
+ * helper table.
+ */
+static void
+oss_free_controls(ossdev_t *odev)
+{
+ kmem_free(odev->d_ctrls, sizeof (audio_ctrl_t *) * odev->d_nalloc);
+ kmem_free(odev->d_exts, sizeof (oss_mixext) * odev->d_nalloc);
+ odev->d_nctrl = 0;
+ odev->d_nalloc = 0;
+}
+
+/*
+ * Allocate and fill in an OSS user land controls to internal controls
+ * helper table. This is done on one audio_dev device.
+ */
+static void
+oss_alloc_controls(ossdev_t *odev)
+{
+ audio_dev_t *d = odev->d_dev;
+ int nctrl = 0;
+ oss_mixext *ext;
+ oss_mixext_root *root_data;
+
+ /* Find out who many entries we need */
+ auclnt_walk_controls(d, oss_cnt_controls, &nctrl);
+ nctrl++; /* Needs space for the device root node */
+ nctrl++; /* Needs space for the device ext marker */
+ nctrl++; /* Needs space for the play group */
+ nctrl++; /* Needs space for the record group */
+ nctrl++; /* Needs space for the monitor group */
+ nctrl++; /* Needs space for the tone group */
+ nctrl++; /* Needs space for the 3D group */
+ nctrl++; /* Needs space for the misc group */
+
+ /* Allocate the OSS to boomer helper table */
+ odev->d_nalloc = nctrl;
+ odev->d_ctrls = kmem_zalloc(sizeof (audio_ctrl_t *) * nctrl, KM_SLEEP);
+ odev->d_exts = kmem_zalloc(sizeof (oss_mixext) * nctrl, KM_SLEEP);
+
+ /*
+ * Setup special case outputs to output OSS routes helper tables
+ */
+
+ /*
+ * Root node is first, that way all others parent is this one
+ */
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = 0;
+ ext->parent = -1;
+ ext->type = MIXT_DEVROOT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "DEVROOT");
+ /*
+ * Root data... nobody should be using this though.
+ */
+ root_data = (oss_mixext_root *)&ext->data;
+ (void) snprintf(root_data->name, sizeof (root_data->name), "%s",
+ auclnt_get_dev_name(d));
+ (void) snprintf(root_data->id, sizeof (root_data->id), "%s",
+ auclnt_get_dev_name(d));
+
+ odev->d_nctrl++;
+
+ /*
+ * Insert an extra marker -- needed to keep layout apps hapy.
+ * This prevents some apps from assuming we are in "LEGACY" mode.
+ */
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_MARKER;
+ ext->timestamp = gethrtime();
+ ext->parent = 0;
+ odev->d_nctrl++;
+
+ /* Fill in the complete table now */
+ auclnt_walk_controls(d, oss_add_control, odev);
+
+ /* Update the update_counter reference counter for groups */
+ for (nctrl = 0; nctrl < odev->d_nctrl; nctrl++) {
+ int i;
+
+ ext = &odev->d_exts[nctrl];
+ i = ext->parent;
+ while ((i >= 0) && (i < odev->d_nctrl)) {
+
+ ext = &odev->d_exts[i];
+ ASSERT(ext->parent < i);
+ ASSERT((ext->type == MIXT_GROUP) ||
+ (ext->type == MIXT_DEVROOT));
+ ext->update_counter++;
+ i = ext->parent;
+ }
+ }
+
+ ASSERT(odev->d_nctrl <= odev->d_nalloc);
+}
+
+static int
+oss_open(audio_client_t *c, int oflag)
+{
+ int rv;
+ ossdev_t *odev;
+ ossclient_t *sc;
+ audio_stream_t *isp, *osp;
+
+ isp = auclnt_input_stream(c);
+ osp = auclnt_output_stream(c);
+
+ /* note that OSS always uses nonblocking open() semantics */
+ if ((rv = auclnt_open(c, AUDIO_FORMAT_PCM, oflag | FNDELAY)) != 0) {
+ return (rv);
+ }
+
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ auclnt_close(c);
+ return (ENOMEM);
+ }
+ auclnt_set_private(c, sc);
+
+ odev = auclnt_get_minor_data(c, AUDIO_MINOR_DSP);
+
+ /* set a couple of common fields */
+ sc->o_client = c;
+ sc->o_ossdev = odev;
+
+ /* set all default parameters */
+ if (oflag & FWRITE) {
+ if (((rv = auclnt_set_format(osp, OSS_FMT)) != 0) ||
+ ((rv = auclnt_set_rate(osp, OSS_RATE)) != 0) ||
+ ((rv = auclnt_set_channels(osp, OSS_CHANNELS)) != 0)) {
+ goto failed;
+ }
+ }
+
+ if (oflag & FREAD) {
+ if (((rv = auclnt_set_format(isp, OSS_FMT)) != 0) ||
+ ((rv = auclnt_set_rate(isp, OSS_RATE)) != 0) ||
+ ((rv = auclnt_set_channels(isp, OSS_CHANNELS)) != 0)) {
+ goto failed;
+ }
+ }
+
+ return (0);
+
+failed:
+ auclnt_close(c);
+ return (rv);
+}
+
+static void
+oss_close(audio_client_t *c)
+{
+ ossclient_t *sc;
+
+ sc = auclnt_get_private(c);
+
+ if (ddi_can_receive_sig() || (ddi_get_pid() == 0)) {
+ (void) auclnt_drain(c);
+ }
+
+ kmem_free(sc, sizeof (*sc));
+
+ auclnt_close(c);
+}
+
+/*
+ * This is used to generate an array of names for an enumeration
+ */
+static ushort_t
+oss_set_enum(oss_mixer_enuminfo *ei, ushort_t nxt, const char *name)
+{
+ uint32_t n;
+
+ /* Get current entry to fill in */
+ n = ei->nvalues;
+ (void) snprintf(&ei->strings[nxt], ((sizeof (ei->strings) - nxt) - 1),
+ "%s", name);
+ ei->strindex[n] = nxt;
+
+ /* Adjust everything for next entry */
+ nxt += strnlen(name, ((sizeof (ei->strings) - nxt) - 1));
+ ei->strings[nxt++] = '\0';
+
+ ei->nvalues++;
+ return (nxt);
+}
+
+/*
+ * The following two functions are used to count the number of devices
+ * in under the boomer framework.
+ *
+ * We actually report the highest "index", and then if an audio device
+ * is not found, we report a bogus removed device for it in the actual
+ * ioctls. This goofiness is required to make the OSS API happy.
+ */
+int
+oss_dev_walker(audio_dev_t *d, void *arg)
+{
+ int *pcnt = arg;
+ int cnt;
+ int index;
+
+ cnt = *pcnt;
+ index = auclnt_get_dev_index(d);
+ if ((index + 1) > cnt) {
+ cnt = index + 1;
+ *pcnt = cnt;
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+oss_cnt_devs(void)
+{
+ int cnt = 0;
+
+ auclnt_walk_devs(oss_dev_walker, &cnt);
+ return (cnt);
+}
+
+static int
+sndctl_dsp_speed(audio_client_t *c, int *ratep)
+{
+ int rv;
+ int rate;
+ int oflag;
+
+ rate = *ratep;
+
+ oflag = auclnt_get_oflag(c);
+ if (oflag & FREAD) {
+ if ((rv = auclnt_set_rate(auclnt_input_stream(c), rate)) != 0)
+ return (rv);
+ }
+
+ if (oflag & FWRITE) {
+ if ((rv = auclnt_set_rate(auclnt_output_stream(c), rate)) != 0)
+ return (rv);
+ }
+
+ return (0);
+}
+
+static int
+sndctl_dsp_setfmt(audio_client_t *c, int *fmtp)
+{
+ int rv;
+ int fmt;
+ int i;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ if (*fmtp != AFMT_QUERY) {
+ /* convert from OSS */
+ for (i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (oss_formats[i].oss == *fmtp) {
+ fmt = oss_formats[i].fmt;
+ break;
+ }
+ }
+ if (fmt == AUDIO_FORMAT_NONE) {
+ /* if format not known, return ENOTSUP */
+ return (ENOTSUP);
+ }
+
+ if (oflag & FWRITE) {
+ rv = auclnt_set_format(auclnt_output_stream(c), fmt);
+ if (rv != 0)
+ return (rv);
+ }
+
+ if (oflag & FREAD) {
+ rv = auclnt_set_format(auclnt_input_stream(c), fmt);
+ if (rv != 0)
+ return (rv);
+ }
+ }
+
+ if (oflag & FWRITE) {
+ fmt = auclnt_get_format(auclnt_output_stream(c));
+ } else if (oflag & FREAD) {
+ fmt = auclnt_get_format(auclnt_input_stream(c));
+ }
+
+ /* convert back to OSS */
+ *(int *)fmtp = AFMT_QUERY;
+ for (i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (oss_formats[i].fmt == fmt) {
+ *(int *)fmtp = oss_formats[i].oss;
+ }
+ }
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getfmts(audio_client_t *c, int *fmtsp)
+{
+ _NOTE(ARGUNUSED(c));
+
+ /*
+ * For now, we support all the standard ones. Later we might
+ * add in conditional support for AC3.
+ */
+ *fmtsp = (AFMT_MU_LAW | AFMT_A_LAW |
+ AFMT_U8 | AFMT_S8 |
+ AFMT_S16_LE |AFMT_S16_BE |
+ AFMT_S24_LE | AFMT_S24_BE |
+ AFMT_S32_LE | AFMT_S32_BE |
+ AFMT_S24_PACKED);
+
+ return (0);
+}
+
+static int
+sndctl_dsp_channels(audio_client_t *c, int *chanp)
+{
+ int rv;
+ int nchan;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ nchan = *chanp;
+ if (nchan != 0) {
+ if (oflag & FWRITE) {
+ rv = auclnt_set_channels(auclnt_output_stream(c),
+ nchan);
+ if (rv != 0)
+ return (rv);
+ }
+
+ if (oflag & FREAD) {
+ rv = auclnt_set_channels(auclnt_input_stream(c), nchan);
+ if (rv != 0)
+ return (rv);
+ }
+ }
+
+ if (oflag & FWRITE) {
+ nchan = auclnt_get_channels(auclnt_output_stream(c));
+ } else if (oflag & FREAD) {
+ nchan = auclnt_get_channels(auclnt_input_stream(c));
+ }
+ *chanp = nchan;
+ return (0);
+}
+
+static int
+sndctl_dsp_stereo(audio_client_t *c, int *onoff)
+{
+ int nchan;
+
+ switch (*onoff) {
+ case 0:
+ nchan = 1;
+ break;
+ case 1:
+ nchan = 2;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ return (sndctl_dsp_channels(c, &nchan));
+}
+
+static int
+sndctl_dsp_post(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_flush(sp);
+ auclnt_clear_paused(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_getcaps(audio_client_t *c, int *capsp)
+{
+ int ncaps;
+ int osscaps = 0;
+
+ ncaps = auclnt_get_dev_capab(auclnt_get_dev(c));
+
+ if (ncaps & AUDIO_CLIENT_CAP_PLAY)
+ osscaps |= PCM_CAP_OUTPUT;
+ if (ncaps & AUDIO_CLIENT_CAP_RECORD)
+ osscaps |= PCM_CAP_INPUT;
+ if (ncaps & AUDIO_CLIENT_CAP_DUPLEX)
+ osscaps |= PCM_CAP_DUPLEX;
+
+ *capsp = osscaps;
+ return (0);
+}
+
+static int
+sndctl_dsp_gettrigger(audio_client_t *c, int *trigp)
+{
+ int triggers = 0;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ if (oflag & FWRITE) {
+ if (!auclnt_is_paused(auclnt_output_stream(c))) {
+ triggers |= PCM_ENABLE_OUTPUT;
+ }
+ }
+
+ if (oflag & FREAD) {
+ if (!auclnt_is_paused(auclnt_input_stream(c))) {
+ triggers |= PCM_ENABLE_INPUT;
+ }
+ }
+ *trigp = triggers;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_settrigger(audio_client_t *c, int *trigp)
+{
+ int triggers;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+ triggers = *trigp;
+
+ if ((oflag & FWRITE) && (triggers & PCM_ENABLE_OUTPUT)) {
+ auclnt_clear_paused(auclnt_output_stream(c));
+ }
+
+ if ((oflag & FREAD) && (triggers & PCM_ENABLE_INPUT)) {
+ auclnt_clear_paused(auclnt_input_stream(c));
+ }
+
+ return (0);
+}
+
+struct oss_legacy_volume {
+ pid_t pid;
+ uint8_t ogain;
+ uint8_t igain;
+};
+
+static int
+oss_legacy_volume_walker(audio_client_t *c, void *arg)
+{
+ struct oss_legacy_volume *olv = arg;
+
+ if (auclnt_get_pid(c) == olv->pid) {
+ if (olv->ogain <= 100) {
+ auclnt_set_gain(auclnt_output_stream(c), olv->ogain);
+ }
+ if (olv->igain <= 100) {
+ auclnt_set_gain(auclnt_input_stream(c), olv->igain);
+ }
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void
+oss_set_legacy_volume(audio_client_t *c, uint8_t ogain, uint8_t igain)
+{
+ struct oss_legacy_volume olv;
+
+ olv.pid = auclnt_get_pid(c);
+ olv.ogain = ogain;
+ olv.igain = igain;
+ auclnt_dev_walk_clients(auclnt_get_dev(c),
+ oss_legacy_volume_walker, &olv);
+}
+
+static int
+sndctl_dsp_getplayvol(audio_client_t *c, int *volp)
+{
+ int vol;
+
+ /* convert monophonic soft value to OSS stereo value */
+ vol = auclnt_get_gain(auclnt_output_stream(c));
+ *volp = vol | (vol << 8);
+ return (0);
+}
+
+static int
+sndctl_dsp_setplayvol(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+
+ auclnt_set_gain(auclnt_output_stream(c), vol);
+ *volp = (vol | (vol << 8));
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getrecvol(audio_client_t *c, int *volp)
+{
+ int vol;
+
+ vol = auclnt_get_gain(auclnt_input_stream(c));
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sndctl_dsp_setrecvol(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+
+ auclnt_set_gain(auclnt_input_stream(c), vol);
+ *volp = (vol | (vol << 8));
+
+ return (0);
+}
+
+static int
+sound_mixer_write_ogain(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+ oss_set_legacy_volume(c, vol, 255);
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sound_mixer_write_igain(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+ oss_set_legacy_volume(c, 255, vol);
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sndctl_dsp_readctl(audio_client_t *c, oss_digital_control *ctl)
+{
+ /* SPDIF: need to add support with spdif */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(ctl));
+ return (ENOTSUP);
+}
+
+static int
+sndctl_dsp_writectl(audio_client_t *c, oss_digital_control *ctl)
+{
+ /* SPDIF: need to add support with spdif */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(ctl));
+ return (ENOTSUP);
+}
+
+static int
+sndctl_dsp_cookedmode(audio_client_t *c, int *rvp)
+{
+ _NOTE(ARGUNUSED(c));
+
+ /* We are *always* in cooked mode -- at least until we have AC3. */
+ if (*rvp == 0) {
+ return (ENOTSUP);
+ } else {
+ return (0);
+ }
+}
+
+static int
+sndctl_dsp_silence(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_skip(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ auclnt_clear_paused(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt_input(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FREAD) {
+ audio_stream_t *sp = auclnt_input_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt_output(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt(audio_client_t *c)
+{
+ (void) sndctl_dsp_halt_input(c);
+ (void) sndctl_dsp_halt_output(c);
+ return (0);
+}
+
+static int
+sndctl_dsp_sync(audio_client_t *c)
+{
+ return (auclnt_drain(c));
+}
+
+static int
+sndctl_dsp_setfragment(audio_client_t *c, int *fragp)
+{
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(fragp));
+ /*
+ * We don't really implement this "properly" at this time.
+ * The problems with this ioctl are various: the API insists
+ * that fragment sizes be a power of two -- and we can't cope
+ * with accurately reporting fragment sizes in the face of
+ * mixing and format conversion.
+ *
+ * Well behaved applications should really not use this API.
+ *
+ * According to the OSS API documentation, the values provided
+ * are nothing more than a "hint" and not to be relied upon
+ * anyway. And we aren't obligated to report the actual
+ * values back!
+ */
+ return (0);
+}
+
+/*
+ * A word about recsrc, and playtgt ioctls: We don't allow ordinary DSP
+ * applications to change port configurations, because these could have a
+ * bad effect for other applications. Instead, these settings have to
+ * be changed using the master mixer panel. In order to make applications
+ * happy, we just present a single "default" source/target.
+ */
+static int
+sndctl_dsp_get_recsrc_names(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ _NOTE(ARGUNUSED(c));
+
+ ei->nvalues = 1;
+ (void) snprintf(ei->strings, sizeof (ei->strings), "default");
+ ei->strindex[0] = 0;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_get_recsrc(audio_client_t *c, int *srcp)
+{
+ _NOTE(ARGUNUSED(c));
+ *srcp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_set_recsrc(audio_client_t *c, int *srcp)
+{
+ _NOTE(ARGUNUSED(c));
+ *srcp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_get_playtgt_names(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ _NOTE(ARGUNUSED(c));
+
+ ei->nvalues = 1;
+ (void) snprintf(ei->strings, sizeof (ei->strings), "default");
+ ei->strindex[0] = 0;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_get_playtgt(audio_client_t *c, int *tgtp)
+{
+ _NOTE(ARGUNUSED(c));
+ *tgtp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_set_playtgt(audio_client_t *c, int *tgtp)
+{
+ _NOTE(ARGUNUSED(c));
+ *tgtp = 0;
+ return (0);
+}
+
+static int
+sndctl_sysinfo(oss_sysinfo *si)
+{
+ bzero(si, sizeof (*si));
+ (void) snprintf(si->product, sizeof (si->product), "SunOS Audio");
+ (void) snprintf(si->version, sizeof (si->version), "4.0");
+ si->versionnum = OSS_VERSION;
+ si->numcards = oss_cnt_devs();
+ si->nummixers = si->numcards - 1;
+ si->numaudios = si->numcards - 1;
+ si->numaudioengines = si->numaudios;
+ (void) snprintf(si->license, sizeof (si->license), "CDDL");
+ return (0);
+}
+
+static int
+sndctl_cardinfo(audio_client_t *c, oss_card_info *ci)
+{
+ audio_dev_t *d;
+ void *iter;
+ const char *info;
+ int n;
+ boolean_t release;
+
+ if ((n = ci->card) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(ci, sizeof (*ci));
+ ci->card = n;
+
+ if (d == NULL) {
+ /*
+ * If device removed (e.g. for DR), then
+ * report a bogus removed entry.
+ */
+ (void) snprintf(ci->shortname, sizeof (ci->shortname),
+ "<removed>");
+ (void) snprintf(ci->longname, sizeof (ci->longname),
+ "<removed>");
+ return (0);
+ }
+
+ (void) snprintf(ci->shortname, sizeof (ci->shortname),
+ "%s", auclnt_get_dev_name(d));
+ (void) snprintf(ci->longname, sizeof (ci->longname),
+ "%s (%s)", auclnt_get_dev_description(d),
+ auclnt_get_dev_version(d));
+
+ iter = NULL;
+ while ((info = auclnt_get_dev_hw_info(d, &iter)) != NULL) {
+ (void) strlcat(ci->hw_info, info, sizeof (ci->hw_info));
+ (void) strlcat(ci->hw_info, "\n", sizeof (ci->hw_info));
+ }
+
+ /*
+ * We don't report interrupt counts, ack counts (which are
+ * just "read" interrupts, not spurious), or any other flags.
+ * Nothing should be using any of this data anyway ... these
+ * values were intended for 4Front's debugging purposes. In
+ * Solaris, drivers should use interrupt kstats to report
+ * interrupt related statistics.
+ */
+ if (release)
+ auclnt_release_dev(d);
+ return (0);
+}
+
+static int
+audioinfo_walker(audio_engine_t *e, void *a)
+{
+ oss_audioinfo *si = a;
+ int fmt, nchan, rate, cap;
+
+ fmt = auclnt_engine_get_format(e);
+ nchan = auclnt_engine_get_channels(e);
+ rate = auclnt_engine_get_rate(e);
+ cap = auclnt_engine_get_capab(e);
+
+ for (int i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (fmt == oss_formats[i].fmt) {
+ if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ si->oformats |= oss_formats[i].oss;
+ }
+ if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ si->iformats |= oss_formats[i].oss;
+ }
+ break;
+ }
+ }
+ si->max_channels = max(nchan, si->max_channels);
+ si->max_rate = max(rate, si->max_rate);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sndctl_audioinfo(audio_client_t *c, oss_audioinfo *si)
+{
+ audio_dev_t *d;
+ const char *name;
+ int n;
+ boolean_t release;
+ unsigned cap;
+
+ if ((n = si->dev) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ n++; /* skip pseudo device */
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(si, sizeof (*si));
+ si->dev = n - 1;
+
+ if (d == NULL) {
+ /* if device not present, forge a false entry */
+ si->card_number = n;
+ si->mixer_dev = n - 1;
+ si->legacy_device = -1;
+ si->enabled = 0;
+ (void) snprintf(si->name, sizeof (si->name), "<removed>");
+ return (0);
+ }
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(si->name, sizeof (si->name), "%s", name);
+
+ si->legacy_device = auclnt_get_dev_number(d);
+ si->caps = 0;
+
+ auclnt_dev_walk_engines(d, audioinfo_walker, si);
+
+ cap = auclnt_get_dev_capab(d);
+
+ if (cap & AUDIO_CLIENT_CAP_DUPLEX) {
+ si->caps |= PCM_CAP_DUPLEX;
+ }
+ if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ si->caps |= PCM_CAP_OUTPUT;
+ }
+ if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ si->caps |= PCM_CAP_INPUT;
+ }
+
+ if (si->caps != 0) {
+ /* AC3: PCM_CAP_MULTI would be wrong for an AC3 only device */
+ si->caps |= PCM_CAP_BATCH | PCM_CAP_TRIGGER | PCM_CAP_MULTI;
+ /* MMAP: we add PCM_CAP_MMAP when we we support it */
+ si->enabled = 1;
+ si->rate_source = si->dev;
+
+ /* we can convert PCM formats */
+ if ((si->iformats | si->oformats) &
+ AUDIO_FORMAT_PCM) {
+ si->min_channels = min(2, si->max_channels);
+ si->min_rate = min(5000, si->max_rate);
+ si->caps |= PCM_CAP_FREERATE;
+ }
+ (void) snprintf(si->devnode, sizeof (si->devnode),
+ "/dev/sound/%s:%ddsp",
+ auclnt_get_dev_driver(d), auclnt_get_dev_instance(d));
+ } else {
+ si->enabled = 0; /* stops apps from using us directly */
+ si->caps = PCM_CAP_VIRTUAL;
+ (void) snprintf(si->devnode, sizeof (si->devnode),
+ "/dev/sndstat");
+ }
+
+ si->pid = -1;
+ (void) snprintf(si->handle, sizeof (si->handle), "%s", name);
+ (void) snprintf(si->label, sizeof (si->label), "%s", name);
+ si->latency = -1;
+ si->card_number = n;
+ si->mixer_dev = n - 1;
+
+ if (release)
+ auclnt_release_dev(d);
+
+ return (0);
+}
+
+static int
+sound_mixer_info(audio_client_t *c, mixer_info *mi)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ ossclient_t *sc;
+ const char *name;
+
+ sc = auclnt_get_private(c);
+ odev = sc->o_ossdev;
+
+ d = auclnt_get_dev(c);
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(mi->id, sizeof (mi->id), "%s", name);
+ (void) snprintf(mi->name, sizeof (mi->name), "%s", name);
+ (void) snprintf(mi->handle, sizeof (mi->handle), "%s", name);
+ mi->modify_counter = odev->d_modify_cnt;
+ mi->card_number = auclnt_get_dev_index(d);
+ mi->port_number = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_devmask(audio_client_t *c, int *devmask)
+{
+ _NOTE(ARGUNUSED(c));
+ *devmask = SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_IGAIN;
+ return (0);
+}
+
+static int
+sound_mixer_read_recmask(audio_client_t *c, int *recmask)
+{
+ _NOTE(ARGUNUSED(c));
+ *recmask = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_recsrc(audio_client_t *c, int *recsrc)
+{
+ _NOTE(ARGUNUSED(c));
+ *recsrc = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_caps(audio_client_t *c, int *caps)
+{
+ _NOTE(ARGUNUSED(c));
+ /* single recording source... sort of */
+ *caps = SOUND_CAP_EXCL_INPUT;
+ return (0);
+}
+
+static int
+sndctl_mixerinfo(audio_client_t *c, oss_mixerinfo *mi)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ const char *name;
+ int n;
+ boolean_t release = B_FALSE;
+
+ if ((n = mi->dev) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ n++;
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(mi, sizeof (*mi));
+ mi->dev = n - 1;
+
+ if (d == NULL) {
+ mi->card_number = n;
+ mi->enabled = 0;
+ mi->legacy_device = -1;
+ (void) snprintf(mi->name, sizeof (mi->name), "<removed>");
+ (void) snprintf(mi->id, sizeof (mi->id), "<removed>");
+ return (0);
+ }
+
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ if (release)
+ auclnt_release_dev(d);
+ return (EINVAL);
+ }
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(mi->name, sizeof (mi->name), "%s", name);
+ (void) snprintf(mi->id, sizeof (mi->id), "%s", name);
+ (void) snprintf(mi->handle, sizeof (mi->handle), "%s", name);
+ mi->modify_counter = odev->d_modify_cnt;
+ mi->card_number = auclnt_get_dev_index(d);
+ mi->legacy_device = auclnt_get_dev_number(d);
+ if (mi->legacy_device >= 0) {
+ (void) snprintf(mi->devnode, sizeof (mi->devnode),
+ "/dev/sound/%s:%dmixer",
+ auclnt_get_dev_driver(d), auclnt_get_dev_instance(d));
+ mi->enabled = 1;
+ } else {
+ /* special nodes use generic sndstat node */
+ (void) snprintf(mi->devnode, sizeof (mi->devnode),
+ "/dev/sndstat");
+ mi->enabled = 0;
+ }
+ mi->nrext = odev->d_nctrl;
+
+ if (release)
+ auclnt_release_dev(d);
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getblksize(audio_client_t *c, int *fragsz)
+{
+ int oflag = auclnt_get_oflag(c);
+
+ if (oflag & FWRITE)
+ *fragsz = auclnt_get_fragsz(auclnt_output_stream(c));
+ else if (oflag & FREAD)
+ *fragsz = auclnt_get_fragsz(auclnt_input_stream(c));
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getospace(audio_client_t *c, audio_buf_info *bi)
+{
+ audio_stream_t *sp;
+ unsigned n;
+
+ if ((auclnt_get_oflag(c) & FWRITE) == 0) {
+ return (EACCES);
+ }
+
+ sp = auclnt_output_stream(c);
+ n = auclnt_get_nframes(sp) - auclnt_get_count(sp);
+
+ bi->fragsize = auclnt_get_fragsz(sp);
+ bi->fragstotal = auclnt_get_nfrags(sp);
+ bi->bytes = (n * auclnt_get_framesz(sp));
+ bi->fragments = bi->bytes / bi->fragsize;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getispace(audio_client_t *c, audio_buf_info *bi)
+{
+ audio_stream_t *sp;
+ unsigned n;
+
+ if ((auclnt_get_oflag(c) & FREAD) == 0) {
+ return (EACCES);
+ }
+
+ sp = auclnt_input_stream(c);
+ n = auclnt_get_count(sp);
+
+ bi->fragsize = auclnt_get_fragsz(sp);
+ bi->fragstotal = auclnt_get_nfrags(sp);
+ bi->bytes = (n * auclnt_get_framesz(sp));
+ bi->fragments = bi->bytes / bi->fragsize;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getodelay(audio_client_t *c, int *bytes)
+{
+ unsigned framesz;
+ unsigned slen, flen;
+
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ auclnt_get_output_qlen(c, &slen, &flen);
+ *bytes = (slen + flen) * framesz;
+ } else {
+ *bytes = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_current_iptr(audio_client_t *c, oss_count_t *count)
+{
+ if (auclnt_get_oflag(c) & FREAD) {
+ count->samples = auclnt_get_samples(auclnt_input_stream(c));
+ count->fifo_samples = 0; /* not quite accurate */
+ } else {
+ count->samples = 0;
+ count->fifo_samples = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_current_optr(audio_client_t *c, oss_count_t *count)
+{
+ unsigned samples, fifo;
+
+ if (auclnt_get_oflag(c) & FWRITE) {
+ auclnt_get_output_qlen(c, &samples, &fifo);
+ count->samples = samples;
+ count->fifo_samples = fifo;
+ } else {
+ count->samples = 0;
+ count->fifo_samples = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_getoptr(audio_client_t *c, count_info *ci)
+{
+ audio_stream_t *sp;
+ unsigned framesz;
+ unsigned fragsz;
+
+ bzero(ci, sizeof (*ci));
+ if ((auclnt_get_oflag(c) & FWRITE) == 0) {
+ return (0);
+ }
+ sp = auclnt_output_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ fragsz = auclnt_get_fragsz(sp);
+ ci->blocks = auclnt_get_samples(sp) * framesz / fragsz;
+ auclnt_set_samples(sp, 0);
+ ci->bytes = auclnt_get_tail(sp) * framesz;
+ ci->ptr = auclnt_get_tidx(sp) * framesz;
+ return (0);
+}
+
+static int
+sndctl_dsp_getiptr(audio_client_t *c, count_info *ci)
+{
+ audio_stream_t *sp;
+ unsigned framesz;
+ unsigned fragsz;
+
+ bzero(ci, sizeof (*ci));
+ if ((auclnt_get_oflag(c) & FREAD) == 0) {
+ return (0);
+ }
+ sp = auclnt_input_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ fragsz = auclnt_get_fragsz(sp);
+ ci->blocks = auclnt_get_samples(sp) * framesz / fragsz;
+ auclnt_set_samples(sp, 0);
+ ci->bytes = auclnt_get_head(sp) * framesz;
+ ci->ptr = auclnt_get_hidx(sp) * framesz;
+ return (0);
+}
+
+static int
+sndctl_dsp_geterror(audio_client_t *c, audio_errinfo *bi)
+{
+ audio_stream_t *sp;
+ unsigned fragsz;
+ /*
+ * Note: The use of this structure is unsafe... different
+ * meanings for error codes are used by different implementations,
+ * according to the spec. (Even different versions of the same
+ * implementation could have different values.)
+ *
+ * Rather than try to come up with a reliable solution here, we
+ * don't use it. If you want to report errors, or see the result
+ * of errors, use syslog.
+ */
+ bzero(bi, sizeof (*bi));
+
+ sp = auclnt_output_stream(c);
+ fragsz = max(auclnt_get_fragsz(sp), 1);
+ bi->play_underruns = (int)((auclnt_get_errors(sp) + (fragsz - 1)) /
+ fragsz);
+ auclnt_set_errors(sp, 0);
+
+ sp = auclnt_input_stream(c);
+ fragsz = max(auclnt_get_fragsz(sp), 1);
+ bi->rec_overruns = (int)((auclnt_get_errors(sp) + (fragsz - 1)) /
+ fragsz);
+ auclnt_set_errors(sp, 0);
+
+ return (0);
+}
+
+static int
+sndctl_sun_send_number(audio_client_t *c, int *num, cred_t *cr)
+{
+ audio_dev_t *dev;
+ int rv;
+
+ if ((rv = drv_priv(cr)) != 0) {
+ return (rv);
+ }
+
+ dev = auclnt_get_dev(c);
+ auclnt_set_dev_number(dev, *num);
+ return (0);
+}
+
+static int
+oss_getversion(int *versp)
+{
+ *versp = OSS_VERSION;
+ return (0);
+}
+
+static int
+oss_ioctl(audio_client_t *c, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ int sz;
+ void *data;
+ int rv = 0;
+
+ _NOTE(ARGUNUSED(credp));
+
+ sz = OSSIOC_GETSZ(cmd);
+
+ if ((cmd & (OSSIOC_IN | OSSIOC_OUT)) && sz) {
+ if ((data = kmem_zalloc(sz, KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ } else {
+ sz = 0;
+ }
+
+ if (cmd & OSSIOC_IN) {
+ if ((rv = ddi_copyin((void *)arg, data, sz, mode)) != 0) {
+ goto done;
+ }
+ }
+
+ switch (cmd) {
+ /*
+ * DSP specific ioctls
+ */
+ case SNDCTL_DSP_HALT:
+ rv = sndctl_dsp_halt(c);
+ break;
+
+ case SNDCTL_DSP_SYNC:
+ rv = sndctl_dsp_sync(c);
+ break;
+
+ case SNDCTL_DSP_SPEED:
+ rv = sndctl_dsp_speed(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETFMT:
+ rv = sndctl_dsp_setfmt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETFMTS:
+ rv = sndctl_dsp_getfmts(c, (int *)data);
+ break;
+ case SNDCTL_DSP_STEREO:
+ rv = sndctl_dsp_stereo(c, (int *)data);
+ break;
+ case SNDCTL_DSP_CHANNELS:
+ rv = sndctl_dsp_channels(c, (int *)data);
+ break;
+ case SNDCTL_DSP_POST:
+ rv = sndctl_dsp_post(c);
+ break;
+ case SNDCTL_DSP_GETCAPS:
+ rv = sndctl_dsp_getcaps(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETTRIGGER:
+ rv = sndctl_dsp_gettrigger(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETTRIGGER:
+ rv = sndctl_dsp_settrigger(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETPLAYVOL:
+ case SOUND_MIXER_READ_VOLUME: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_PCM: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_OGAIN: /* legacy mixer on dsp */
+ rv = sndctl_dsp_getplayvol(c, (int *)data);
+ break;
+ case SOUND_MIXER_WRITE_VOLUME: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_PCM: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_OGAIN: /* legacy mixer on dsp */
+ rv = sound_mixer_write_ogain(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETPLAYVOL:
+ rv = sndctl_dsp_setplayvol(c, (int *)data);
+ break;
+ case SNDCTL_DSP_READCTL:
+ rv = sndctl_dsp_readctl(c, (oss_digital_control *)data);
+ break;
+ case SNDCTL_DSP_WRITECTL:
+ rv = sndctl_dsp_writectl(c, (oss_digital_control *)data);
+ break;
+ case SNDCTL_DSP_COOKEDMODE:
+ rv = sndctl_dsp_cookedmode(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SILENCE:
+ rv = sndctl_dsp_silence(c);
+ break;
+ case SNDCTL_DSP_SKIP:
+ rv = sndctl_dsp_skip(c);
+ break;
+ case SNDCTL_DSP_HALT_INPUT:
+ rv = sndctl_dsp_halt_input(c);
+ break;
+ case SNDCTL_DSP_HALT_OUTPUT:
+ rv = sndctl_dsp_halt_output(c);
+ break;
+ case SNDCTL_DSP_GET_RECSRC_NAMES:
+ rv = sndctl_dsp_get_recsrc_names(c, (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_DSP_SUBDIVIDE:
+ case SNDCTL_DSP_SETFRAGMENT:
+ rv = sndctl_dsp_setfragment(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GET_RECSRC:
+ rv = sndctl_dsp_get_recsrc(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SET_RECSRC:
+ rv = sndctl_dsp_set_recsrc(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GET_PLAYTGT_NAMES:
+ rv = sndctl_dsp_get_playtgt_names(c,
+ (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_DSP_GET_PLAYTGT:
+ rv = sndctl_dsp_get_playtgt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SET_PLAYTGT:
+ rv = sndctl_dsp_set_playtgt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETRECVOL:
+ case SOUND_MIXER_READ_RECGAIN: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_RECLEV: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_IGAIN: /* legacy mixer on dsp */
+ rv = sndctl_dsp_getrecvol(c, (int *)data);
+ break;
+ case SOUND_MIXER_WRITE_RECGAIN: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_RECLEV: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_IGAIN: /* legacy mixer on dsp */
+ rv = sound_mixer_write_igain(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETRECVOL:
+ rv = sndctl_dsp_setrecvol(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETDUPLEX: /* Ignored */
+ case SNDCTL_DSP_LOW_WATER: /* Ignored */
+ case SNDCTL_DSP_POLICY: /* Ignored */
+ case SNDCTL_DSP_PROFILE: /* Ignored */
+ rv = 0;
+ break;
+ case SNDCTL_DSP_GETBLKSIZE:
+ rv = sndctl_dsp_getblksize(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETOSPACE:
+ rv = sndctl_dsp_getospace(c, (audio_buf_info *)data);
+ break;
+ case SNDCTL_DSP_GETISPACE:
+ rv = sndctl_dsp_getispace(c, (audio_buf_info *)data);
+ break;
+ case SNDCTL_DSP_GETODELAY:
+ rv = sndctl_dsp_getodelay(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETOPTR:
+ rv = sndctl_dsp_getoptr(c, (count_info *)data);
+ break;
+ case SNDCTL_DSP_GETIPTR:
+ rv = sndctl_dsp_getiptr(c, (count_info *)data);
+ break;
+ case SNDCTL_DSP_GETERROR:
+ rv = sndctl_dsp_geterror(c, (audio_errinfo *)data);
+ break;
+ case SNDCTL_DSP_CURRENT_IPTR:
+ rv = sndctl_dsp_current_iptr(c, (oss_count_t *)data);
+ break;
+ case SNDCTL_DSP_CURRENT_OPTR:
+ rv = sndctl_dsp_current_optr(c, (oss_count_t *)data);
+ break;
+
+ /*
+ * Shared ioctls with /dev/mixer.
+ */
+ case OSS_GETVERSION:
+ rv = oss_getversion((int *)data);
+ break;
+ case SNDCTL_CARDINFO:
+ rv = sndctl_cardinfo(c, (oss_card_info *)data);
+ break;
+ case SNDCTL_ENGINEINFO:
+ case SNDCTL_AUDIOINFO:
+ case SNDCTL_AUDIOINFO_EX:
+ rv = sndctl_audioinfo(c, (oss_audioinfo *)data);
+ break;
+ case SNDCTL_SYSINFO:
+ rv = sndctl_sysinfo((oss_sysinfo *)data);
+ break;
+ case SNDCTL_MIXERINFO:
+ rv = sndctl_mixerinfo(c, (oss_mixerinfo *)data);
+ break;
+ case SOUND_MIXER_INFO:
+ rv = sound_mixer_info(c, (mixer_info *)data);
+ break;
+
+ /*
+ * These are mixer ioctls that are virtualized for the DSP
+ * device. They are accessible via either /dev/mixer or
+ * /dev/dsp.
+ */
+ case SOUND_MIXER_READ_RECSRC:
+ case SOUND_MIXER_WRITE_RECSRC:
+ rv = sound_mixer_read_recsrc(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_DEVMASK:
+ case SOUND_MIXER_READ_STEREODEVS:
+ rv = sound_mixer_read_devmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECMASK:
+ rv = sound_mixer_read_recmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_CAPS:
+ rv = sound_mixer_read_caps(c, (int *)data);
+ break;
+
+ /*
+ * Ioctls we have chosen not to support for now. Some
+ * of these are of legacy interest only.
+ */
+ case SNDCTL_SETSONG:
+ case SNDCTL_GETSONG:
+ case SNDCTL_DSP_SYNCGROUP:
+ case SNDCTL_DSP_SYNCSTART:
+ case SNDCTL_DSP_GET_CHNORDER:
+ case SNDCTL_DSP_SET_CHNORDER:
+ case SNDCTL_DSP_GETIPEAKS:
+ case SNDCTL_DSP_GETOPEAKS:
+ case SNDCTL_DSP_GETCHANNELMASK:
+ case SNDCTL_DSP_BIND_CHANNEL:
+ case SNDCTL_DSP_SETSYNCRO:
+ default:
+ rv = EINVAL;
+ break;
+ }
+
+ if ((rv == 0) && (cmd & OSSIOC_OUT)) {
+ rv = ddi_copyout(data, (void *)arg, sz, mode);
+ }
+ if (rv == 0) {
+ *rvalp = 0;
+ }
+
+done:
+ if (sz) {
+ kmem_free(data, sz);
+ }
+ return (rv);
+}
+
+static void
+oss_output(audio_client_t *c)
+{
+ auclnt_pollwakeup(c, POLLOUT);
+}
+
+static void
+oss_input(audio_client_t *c)
+{
+ auclnt_pollwakeup(c, POLLIN | POLLRDNORM);
+}
+
+static void
+oss_notify(audio_client_t *c)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ return;
+ }
+ odev->d_modify_cnt++;
+}
+
+static int
+ossmix_open(audio_client_t *c, int oflag)
+{
+ int rv;
+ ossclient_t *sc;
+ ossdev_t *odev;
+
+ _NOTE(ARGUNUSED(oflag));
+
+ if ((rv = auclnt_open(c, AUDIO_FORMAT_NONE, 0)) != 0) {
+ return (rv);
+ }
+
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ sc->o_ss_sz = 8192;
+ if ((sc->o_ss_buf = kmem_zalloc(sc->o_ss_sz, KM_NOSLEEP)) == NULL) {
+ kmem_free(sc, sizeof (*sc));
+ return (ENOMEM);
+ }
+ auclnt_set_private(c, sc);
+
+ odev = auclnt_get_minor_data(c, AUDIO_MINOR_DSP);
+
+ /* set a couple of common fields */
+ sc->o_client = c;
+ sc->o_ossdev = odev;
+
+ return (rv);
+}
+
+static void
+ossmix_close(audio_client_t *c)
+{
+ ossclient_t *sc;
+
+ sc = auclnt_get_private(c);
+
+ kmem_free(sc->o_ss_buf, sc->o_ss_sz);
+ kmem_free(sc, sizeof (*sc));
+
+ auclnt_close(c);
+}
+
+static int
+sndctl_mix_nrext(audio_client_t *c, int *ncp)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((*ncp != -1) && (*ncp != (auclnt_get_dev_index(d) - 1))) {
+ return (ENXIO);
+ }
+
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ return (EINVAL);
+ }
+
+ *ncp = odev->d_nctrl;
+
+ return (0);
+}
+
+static int
+sndctl_mix_extinfo(audio_client_t *c, oss_mixext *pext)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ int rv = 0;
+ int dev;
+
+ d = auclnt_get_dev(c);
+
+ if (((dev = pext->dev) != -1) && (dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (pext->ctrl >= odev->d_nctrl)) {
+ return (EINVAL);
+ }
+
+ bcopy(&odev->d_exts[pext->ctrl], pext, sizeof (*pext));
+ pext->enumbit = 0;
+ pext->dev = dev;
+
+ return (rv);
+}
+
+static int
+sndctl_mix_enuminfo(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ audio_dev_t *d;
+ audio_ctrl_desc_t desc;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+ uint64_t mask;
+ int bit;
+ ushort_t nxt;
+
+ d = auclnt_get_dev(c);
+
+ if ((ei->dev != -1) && (ei->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (ei->ctrl >= odev->d_nctrl) ||
+ (odev->d_exts[ei->ctrl].type != MIXT_ENUM) ||
+ ((ctrl = odev->d_ctrls[ei->ctrl]) == NULL) ||
+ (auclnt_control_describe(ctrl, &desc) != 0)) {
+ return (EINVAL);
+ }
+
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ nxt = 0;
+ ei->nvalues = 0;
+ bzero(ei->strings, sizeof (ei->strings));
+ bzero(ei->strindex, sizeof (ei->strindex));
+
+ while (mask) {
+ const char *name = desc.acd_enum[bit];
+ nxt = oss_set_enum(ei, nxt, name ? name : "");
+ mask >>= 1;
+ bit++;
+ }
+
+ return (0);
+}
+
+static int
+sndctl_mix_read(audio_client_t *c, oss_mixer_value *vr)
+{
+ int rv;
+ uint64_t v;
+ audio_dev_t *d;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((vr->dev != -1) && (vr->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (vr->ctrl >= odev->d_nctrl) ||
+ ((ctrl = odev->d_ctrls[vr->ctrl]) == NULL)) {
+ return (EINVAL);
+ }
+ if ((rv = auclnt_control_read(ctrl, &v)) == 0) {
+ switch (odev->d_exts[vr->ctrl].type) {
+ case MIXT_ENUM:
+ /* translate this from an enum style bit mask */
+ vr->value = ddi_ffs((unsigned long)v) - 1;
+ break;
+ case MIXT_STEREOSLIDER:
+ vr->value = (int)ddi_swap16(v & 0xffff);
+ break;
+ case MIXT_MONOSLIDER:
+ vr->value = (int)(v | (v << 8));
+ break;
+ case MIXT_ONOFF:
+ /* this could be simple, or could be part of a multi */
+ if (odev->d_exts[vr->ctrl].enumbit >= 0) {
+ uint64_t mask;
+ mask = 1;
+ mask <<= (odev->d_exts[vr->ctrl].enumbit);
+ vr->value = (v & mask) ? 1 : 0;
+ } else {
+ vr->value = v ? 1 : 0;
+ }
+ break;
+
+ default:
+ vr->value = (int)v;
+ break;
+ }
+ }
+
+ return (rv);
+}
+
+static int
+sndctl_mix_write(audio_client_t *c, oss_mixer_value *vr)
+{
+ int rv;
+ uint64_t v;
+ audio_dev_t *d;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((vr->dev != -1) && (vr->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (vr->ctrl >= odev->d_nctrl) ||
+ ((ctrl = odev->d_ctrls[vr->ctrl]) == NULL)) {
+ return (EINVAL);
+ }
+
+ switch (odev->d_exts[vr->ctrl].type) {
+ case MIXT_ONOFF:
+ /* this could be standalone, or it could be part of a multi */
+ if (odev->d_exts[vr->ctrl].enumbit >= 0) {
+ uint64_t mask;
+ if ((rv = auclnt_control_read(ctrl, &v)) != 0) {
+ return (EINVAL);
+ }
+ mask = 1;
+ mask <<= (odev->d_exts[vr->ctrl].enumbit);
+ if (vr->value) {
+ v |= mask;
+ } else {
+ v &= ~mask;
+ }
+ } else {
+ v = vr->value;
+ }
+ break;
+ case MIXT_ENUM:
+ /* translate this to an enum style bit mask */
+ v = 1U << vr->value;
+ break;
+ case MIXT_MONOSLIDER:
+ /* mask off high order bits */
+ v = vr->value & 0xff;
+ break;
+ case MIXT_STEREOSLIDER:
+ /* OSS uses reverse byte ordering */
+ v = vr->value;
+ v = ddi_swap16(vr->value & 0xffff);
+ break;
+ default:
+ v = vr->value;
+ }
+ rv = auclnt_control_write(ctrl, v);
+
+ return (rv);
+}
+
+static int
+sndctl_mix_nrmix(audio_client_t *c, int *nmixp)
+{
+ _NOTE(ARGUNUSED(c));
+ *nmixp = oss_cnt_devs() - 1;
+ return (0);
+}
+
+static int
+ossmix_ioctl(audio_client_t *c, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ int sz;
+ void *data;
+ int rv = 0;
+
+ sz = OSSIOC_GETSZ(cmd);
+
+ if ((cmd & (OSSIOC_IN | OSSIOC_OUT)) && sz) {
+ if ((data = kmem_zalloc(sz, KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ } else {
+ sz = 0;
+ }
+
+ if (cmd & OSSIOC_IN) {
+ if ((rv = ddi_copyin((void *)arg, data, sz, mode)) != 0) {
+ goto done;
+ }
+ }
+
+ switch (cmd) {
+ /*
+ * Mixer specific ioctls
+ */
+ case SNDCTL_MIX_NREXT:
+ rv = sndctl_mix_nrext(c, (int *)data);
+ break;
+ case SNDCTL_MIX_EXTINFO:
+ rv = sndctl_mix_extinfo(c, (oss_mixext *)data);
+ break;
+ case SNDCTL_MIX_ENUMINFO:
+ rv = sndctl_mix_enuminfo(c, (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_MIX_READ:
+ rv = sndctl_mix_read(c, (oss_mixer_value *)data);
+ break;
+ case SNDCTL_MIX_WRITE:
+ rv = sndctl_mix_write(c, (oss_mixer_value *)data);
+ break;
+ case SNDCTL_MIX_NRMIX:
+ rv = sndctl_mix_nrmix(c, (int *)data);
+ break;
+
+ /*
+ * Legacy ioctls. These are treated as soft values only,
+ * and do not affect global hardware state. For use by
+ * legacy DSP applications.
+ */
+ case SOUND_MIXER_READ_VOLUME:
+ case SOUND_MIXER_READ_PCM:
+ case SOUND_MIXER_READ_OGAIN:
+ rv = sndctl_dsp_getplayvol(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_WRITE_VOLUME:
+ case SOUND_MIXER_WRITE_PCM:
+ case SOUND_MIXER_WRITE_OGAIN:
+ rv = sound_mixer_write_ogain(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECGAIN:
+ case SOUND_MIXER_READ_RECLEV:
+ case SOUND_MIXER_READ_IGAIN:
+ rv = sndctl_dsp_getrecvol(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_WRITE_RECGAIN:
+ case SOUND_MIXER_WRITE_RECLEV:
+ case SOUND_MIXER_WRITE_IGAIN:
+ rv = sound_mixer_write_igain(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECSRC:
+ case SOUND_MIXER_WRITE_RECSRC:
+ rv = sound_mixer_read_recsrc(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_DEVMASK:
+ case SOUND_MIXER_READ_STEREODEVS:
+ rv = sound_mixer_read_devmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECMASK:
+ rv = sound_mixer_read_recmask(c, (int *)data);
+ break;
+
+ /*
+ * Common ioctls shared with DSP
+ */
+ case OSS_GETVERSION:
+ rv = oss_getversion((int *)data);
+ break;
+
+ case SNDCTL_CARDINFO:
+ rv = sndctl_cardinfo(c, (oss_card_info *)data);
+ break;
+
+ case SNDCTL_ENGINEINFO:
+ case SNDCTL_AUDIOINFO:
+ case SNDCTL_AUDIOINFO_EX:
+ rv = sndctl_audioinfo(c, (oss_audioinfo *)data);
+ break;
+
+ case SNDCTL_SYSINFO:
+ rv = sndctl_sysinfo((oss_sysinfo *)data);
+ break;
+
+ case SNDCTL_MIXERINFO:
+ rv = sndctl_mixerinfo(c, (oss_mixerinfo *)data);
+ break;
+
+ case SOUND_MIXER_INFO:
+ rv = sound_mixer_info(c, (mixer_info *)data);
+ break;
+
+ case SNDCTL_MIX_DESCRIPTION: /* NOT SUPPORTED: tooltip */
+ rv = EIO; /* OSS returns EIO for this one */
+ break;
+
+ /*
+ * Special implementation-private ioctls.
+ */
+ case SNDCTL_SUN_SEND_NUMBER:
+ rv = sndctl_sun_send_number(c, (int *)data, credp);
+ break;
+
+ /*
+ * Legacy ioctls we don't support.
+ */
+ case SOUND_MIXER_WRITE_MONGAIN:
+ case SOUND_MIXER_READ_MONGAIN:
+ case SOUND_MIXER_READ_BASS:
+ case SOUND_MIXER_READ_TREBLE:
+ case SOUND_MIXER_READ_SPEAKER:
+ case SOUND_MIXER_READ_LINE:
+ case SOUND_MIXER_READ_MIC:
+ case SOUND_MIXER_READ_CD:
+ case SOUND_MIXER_READ_IMIX:
+ case SOUND_MIXER_READ_ALTPCM:
+ case SOUND_MIXER_READ_SYNTH:
+ case SOUND_MIXER_READ_LINE1:
+ case SOUND_MIXER_READ_LINE2:
+ case SOUND_MIXER_READ_LINE3:
+ case SOUND_MIXER_WRITE_BASS:
+ case SOUND_MIXER_WRITE_TREBLE:
+ case SOUND_MIXER_WRITE_SPEAKER:
+ case SOUND_MIXER_WRITE_LINE:
+ case SOUND_MIXER_WRITE_MIC:
+ case SOUND_MIXER_WRITE_CD:
+ case SOUND_MIXER_WRITE_IMIX:
+ case SOUND_MIXER_WRITE_ALTPCM:
+ case SOUND_MIXER_WRITE_SYNTH:
+ case SOUND_MIXER_WRITE_LINE1:
+ case SOUND_MIXER_WRITE_LINE2:
+ case SOUND_MIXER_WRITE_LINE3:
+ /*
+ * Additional ioctls we *could* support, but don't.
+ */
+ case SNDCTL_SETSONG:
+ case SNDCTL_SETLABEL:
+ case SNDCTL_GETSONG:
+ case SNDCTL_GETLABEL:
+ case SNDCTL_MIDIINFO:
+ case SNDCTL_SETNAME:
+ default:
+ rv = EINVAL;
+ break;
+ }
+
+ if ((rv == 0) && (cmd & OSSIOC_OUT)) {
+ rv = ddi_copyout(data, (void *)arg, sz, mode);
+ }
+ if (rv == 0) {
+ *rvalp = 0;
+ }
+
+done:
+ if (sz) {
+ kmem_free(data, sz);
+ }
+ return (rv);
+}
+
+static void *
+oss_dev_init(audio_dev_t *dev)
+{
+ ossdev_t *odev;
+
+ odev = kmem_zalloc(sizeof (*odev), KM_SLEEP);
+ odev->d_dev = dev;
+
+ mutex_init(&odev->d_mx, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&odev->d_cv, NULL, CV_DRIVER, NULL);
+ oss_alloc_controls(odev);
+
+ return (odev);
+}
+
+static void
+oss_dev_fini(void *arg)
+{
+ ossdev_t *odev = arg;
+
+ if (odev != NULL) {
+ oss_free_controls(odev);
+ mutex_destroy(&odev->d_mx);
+ cv_destroy(&odev->d_cv);
+ kmem_free(odev, sizeof (*odev));
+ }
+}
+
+static void
+sndstat_printf(ossclient_t *oc, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ (void) vsnprintf(oc->o_ss_buf + oc->o_ss_len,
+ oc->o_ss_sz - oc->o_ss_len, fmt, va);
+ va_end(va);
+ oc->o_ss_len = strlen(oc->o_ss_buf);
+}
+
+static int
+sndstat_dev_walker(audio_dev_t *d, void *arg)
+{
+ ossclient_t *oc = arg;
+ const char *capstr;
+ unsigned cap;
+
+ cap = auclnt_get_dev_capab(d);
+
+ if (cap & AUDIO_CLIENT_CAP_DUPLEX) {
+ capstr = "DUPLEX";
+ } else if ((cap & AUDIO_CLIENT_CAP_PLAY) &&
+ (cap & AUDIO_CLIENT_CAP_RECORD)) {
+ capstr = "INPUT,OUTPUT";
+ } else if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ capstr = "OUTPUT";
+ } else if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ capstr = "INPUT";
+ } else {
+ capstr = NULL;
+ }
+
+ if (capstr == NULL)
+ return (AUDIO_WALK_CONTINUE);
+
+ sndstat_printf(oc, "%d: %s %s, %s (%s)\n",
+ auclnt_get_dev_number(d), auclnt_get_dev_name(d),
+ auclnt_get_dev_description(d), auclnt_get_dev_version(d), capstr);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sndstat_mixer_walker(audio_dev_t *d, void *arg)
+{
+ ossclient_t *oc = arg;
+ unsigned cap;
+ void *iter;
+ const char *info;
+
+ cap = auclnt_get_dev_capab(d);
+
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY|AUDIO_CLIENT_CAP_RECORD)) == 0)
+ return (AUDIO_WALK_CONTINUE);
+
+ sndstat_printf(oc, "%d: %s %s, %s\n",
+ auclnt_get_dev_number(d), auclnt_get_dev_name(d),
+ auclnt_get_dev_description(d), auclnt_get_dev_version(d));
+ iter = NULL;
+ while ((info = auclnt_get_dev_hw_info(d, &iter)) != NULL) {
+ sndstat_printf(oc, "\t%s\n", info);
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+ossmix_write(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ /* write on sndstat is a no-op */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(uio));
+ _NOTE(ARGUNUSED(cr));
+
+ return (0);
+}
+
+static int
+ossmix_read(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ ossclient_t *oc;
+ unsigned n;
+ int rv;
+
+ _NOTE(ARGUNUSED(cr));
+
+ if (uio->uio_resid == 0) {
+ return (0);
+ }
+
+ oc = auclnt_get_private(c);
+
+ mutex_enter(&oc->o_ss_lock);
+
+ if (oc->o_ss_off == 0) {
+
+ sndstat_printf(oc, "SunOS Audio Framework\n");
+
+ sndstat_printf(oc, "\nAudio Devices:\n");
+ auclnt_walk_devs_by_number(sndstat_dev_walker, oc);
+
+ sndstat_printf(oc, "\nMixers:\n");
+ auclnt_walk_devs_by_number(sndstat_mixer_walker, oc);
+ }
+
+ /*
+ * For simplicity's sake, we implement a non-seekable device. We could
+ * support seekability, but offsets would be rather meaningless between
+ * changes.
+ */
+ n = min(uio->uio_resid, (oc->o_ss_len - oc->o_ss_off));
+
+ rv = uiomove(oc->o_ss_buf + oc->o_ss_off, n, UIO_READ, uio);
+ if (rv != 0) {
+ n = 0;
+ }
+ oc->o_ss_off += n;
+
+ if (n == 0) {
+ /*
+ * end-of-file reached... clear the sndstat buffer so that
+ * subsequent reads will get the latest data.
+ */
+ oc->o_ss_off = oc->o_ss_len = 0;
+ }
+ mutex_exit(&oc->o_ss_lock);
+ return (rv);
+}
+
+int
+oss_read(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ _NOTE(ARGUNUSED(cr));
+
+ auclnt_clear_paused(auclnt_input_stream(c));
+
+ return (auclnt_read(c, uio));
+}
+
+int
+oss_write(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ _NOTE(ARGUNUSED(cr));
+
+ auclnt_clear_paused(auclnt_output_stream(c));
+
+ return (auclnt_write(c, uio));
+}
+
+int
+oss_chpoll(audio_client_t *c, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ return (auclnt_chpoll(c, events, anyyet, reventsp, phpp));
+}
+
+static struct audio_client_ops oss_ops = {
+ "sound,dsp",
+ oss_dev_init,
+ oss_dev_fini,
+ oss_open,
+ oss_close,
+ oss_read,
+ oss_write,
+ oss_ioctl,
+ oss_chpoll,
+ NULL, /* mmap */
+ oss_input,
+ oss_output,
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+static struct audio_client_ops ossmix_ops = {
+ "sound,mixer",
+ NULL,
+ NULL,
+ ossmix_open,
+ ossmix_close,
+ ossmix_read,
+ ossmix_write,
+ ossmix_ioctl,
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* input */
+ NULL, /* output */
+ oss_notify,
+ NULL, /* drain */
+};
+
+/* nearly the same as ossxmix; different minor name helps devfsadm */
+static struct audio_client_ops sndstat_ops = {
+ "sound,sndstat",
+ NULL, /* dev_init */
+ NULL, /* dev_fini */
+ ossmix_open,
+ ossmix_close,
+ ossmix_read,
+ ossmix_write,
+ ossmix_ioctl,
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* input */
+ NULL, /* output */
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+void
+auimpl_oss_init(void)
+{
+ auclnt_register_ops(AUDIO_MINOR_DSP, &oss_ops);
+ auclnt_register_ops(AUDIO_MINOR_MIXER, &ossmix_ops);
+ auclnt_register_ops(AUDIO_MINOR_SNDSTAT, &sndstat_ops);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_output.c b/usr/src/uts/common/io/audio/impl/audio_output.c
new file mode 100644
index 0000000000..be3c66412a
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_output.c
@@ -0,0 +1,463 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Virtual mixing audio output routines
+ *
+ * This file contains the actual mixing and resampling engine for output.
+ */
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sysmacros.h>
+#include "audio_impl.h"
+
+#ifdef DEBUG
+int audio_underruns = 0;
+#endif
+
+#define DECL_AUDIO_EXPORT(NAME, TYPE, SAMPLE) \
+void \
+auimpl_export_##NAME(audio_engine_t *eng) \
+{ \
+ int fragfr = eng->e_fragfr; \
+ int nch = eng->e_nchan; \
+ unsigned hidx = eng->e_hidx; \
+ TYPE *out = (void *)eng->e_data; \
+ int ch = 0; \
+ \
+ do { /* for each channel */ \
+ int32_t *ip; \
+ TYPE *op; \
+ int i; \
+ int incr = eng->e_chincr[ch]; \
+ \
+ /* get value and adjust next channel offset */ \
+ op = out + eng->e_choffs[ch] + (hidx * incr); \
+ ip = eng->e_chbufs[ch]; \
+ \
+ i = fragfr; \
+ \
+ do { /* for each frame */ \
+ int32_t sample = *ip; \
+ \
+ *op = SAMPLE; \
+ op += incr; \
+ ip++; \
+ \
+ } while (--i); \
+ \
+ ch++; \
+ } while (ch < nch); \
+}
+
+DECL_AUDIO_EXPORT(16ne, int16_t, sample >> 8)
+DECL_AUDIO_EXPORT(16oe, int16_t, ddi_swap16(sample >> 8))
+DECL_AUDIO_EXPORT(32ne, int32_t, sample << 8)
+DECL_AUDIO_EXPORT(32oe, int32_t, ddi_swap32(sample << 8))
+DECL_AUDIO_EXPORT(24ne, int32_t, sample)
+DECL_AUDIO_EXPORT(24oe, int32_t, ddi_swap32(sample))
+
+/*
+ * Simple limiter to prevent overflows when using fixed point computations
+ */
+static void
+auimpl_output_limiter(audio_engine_t *eng)
+{
+ int k, t;
+ unsigned int q, amp, amp2;
+ int nchan = eng->e_nchan;
+ int fragfr = eng->e_fragfr;
+ int32_t **chbufs = eng->e_chbufs;
+ unsigned int statevar = eng->e_limiter_state;
+
+ for (t = 0; t < fragfr; t++) {
+
+ amp = (unsigned)ABS(chbufs[0][t]);
+
+ for (k = 1; k < nchan; k++) {
+ amp2 = (unsigned)ABS(chbufs[k][t]);
+ if (amp2 > amp)
+ amp = amp2;
+ }
+
+ amp >>= 8;
+ q = 0x10000;
+
+ if (amp > 0x7FFF)
+ q = 0x7FFF0000 / amp;
+
+ if (statevar > q) {
+ statevar = q;
+ } else {
+ q = statevar;
+
+ /*
+ * Simplier (linear) tracking algo
+ * (gives less distortion, but more pumping)
+ */
+ statevar += 2;
+ if (statevar > 0x10000)
+ statevar = 0x10000;
+
+ /*
+ * Classic tracking algo
+ * gives more distortion with no-lookahead
+ * statevar=0x10000-((0x10000-statevar)*0xFFF4>>16);
+ */
+ }
+
+ for (k = 0; k < nchan; k++) {
+ int32_t in = chbufs[k][t];
+ int32_t out = 0;
+ unsigned int p;
+
+ if (in >= 0) {
+ p = in;
+ p = ((p & 0xFFFF) * (q >> 4) >> 12) +
+ (p >> 16) * q;
+ out = p;
+ } else {
+ p = -in;
+ p = ((p & 0xFFFF) * (q >> 4) >> 12) +
+ (p >> 16) * q;
+ out = -p;
+ }
+ /* safety code */
+ /*
+ * if output after limiter is clamped, then it
+ * can be dropped
+ */
+ if (out > 0x7FFFFF)
+ out = 0x7FFFFF;
+ else if (out < -0x7FFFFF)
+ out = -0x7FFFFF;
+
+ chbufs[k][t] = out;
+ }
+ }
+
+ eng->e_limiter_state = statevar;
+}
+
+/*
+ * Output mixing function. Assumption: all work is done in 24-bit native PCM.
+ */
+static void
+auimpl_output_mix(audio_stream_t *sp, int offset, int nfr)
+{
+ audio_engine_t *eng = sp->s_engine;
+ const int32_t *src;
+ int choffs;
+ int nch;
+ int vol;
+
+ /*
+ * Initial setup.
+ */
+
+ src = sp->s_cnv_ptr;
+ choffs = sp->s_choffs;
+ nch = sp->s_cnv_dst_nchan;
+ vol = sp->s_gain_eff;
+
+ /*
+ * Do the mixing. We de-interleave the source stream at the
+ * same time.
+ */
+ for (int ch = 0; ch < nch; ch++) {
+ int32_t *op;
+ const int32_t *ip;
+
+
+ ip = src + ch;
+ op = eng->e_chbufs[ch + choffs];
+ op += offset;
+
+ for (int i = nfr; i; i--) {
+
+ int64_t samp;
+
+ samp = *ip;
+ samp *= vol;
+ samp /= AUDIO_VOL_SCALE;
+
+ ip += nch;
+ *op += (int32_t)samp;
+ op++;
+ }
+ }
+
+ sp->s_cnv_cnt -= nfr;
+ sp->s_cnv_ptr += (nch * nfr);
+}
+
+/*
+ * Consume a fragment's worth of data. This is called when the data in
+ * the conversion buffer is exhausted, and we need to refill it from the
+ * source buffer. We always consume data from the client in quantities of
+ * a fragment at a time (assuming that a fragment is available.)
+ */
+static void
+auimpl_consume_fragment(audio_stream_t *sp)
+{
+ unsigned count;
+ unsigned avail;
+ unsigned nframes;
+ unsigned fragfr;
+ unsigned framesz;
+ caddr_t cnvbuf;
+
+ sp->s_cnv_src = sp->s_cnv_buf0;
+ sp->s_cnv_dst = sp->s_cnv_buf1;
+
+ fragfr = sp->s_fragfr;
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp->s_head >= sp->s_tail);
+
+ avail = sp->s_head - sp->s_tail;
+ cnvbuf = sp->s_cnv_src;
+
+ count = min(avail, fragfr);
+
+ /*
+ * Copy data. We deal properly with wraps. Done as a
+ * do...while to minimize the number of tests.
+ */
+ do {
+ unsigned n;
+ unsigned nbytes;
+
+ n = min(nframes - sp->s_tidx, count);
+ nbytes = framesz * n;
+ bcopy(sp->s_data + (sp->s_tidx * framesz), cnvbuf, nbytes);
+ cnvbuf += nbytes;
+ count -= n;
+ sp->s_samples += n;
+ sp->s_tail += n;
+ sp->s_tidx += n;
+ if (sp->s_tidx >= nframes)
+ sp->s_tidx -= nframes;
+ } while (count);
+
+ /* Note: data conversion is optional! */
+ count = min(avail, fragfr);
+ if (sp->s_converter != NULL) {
+ sp->s_cnv_cnt = sp->s_converter(sp, count);
+ } else {
+ sp->s_cnv_cnt = count;
+ }
+}
+
+static void
+auimpl_output_callback_impl(audio_engine_t *eng)
+{
+ int fragfr = eng->e_fragfr;
+
+ /* clear any preexisting mix results */
+ for (int i = 0; i < eng->e_nchan; i++)
+ bzero(eng->e_chbufs[i], AUDIO_CHBUFS * sizeof (int32_t));
+
+ for (audio_stream_t *sp = list_head(&eng->e_streams);
+ sp != NULL;
+ sp = list_next(&eng->e_streams, sp)) {
+
+ int need;
+ int avail;
+ int used;
+ int offset;
+ boolean_t underrun = B_FALSE;
+ boolean_t drained = B_FALSE;
+ audio_client_t *c = sp->s_client;
+
+ /*
+ * We need/want a full fragment. If the client has
+ * less than that available, it will cause a client
+ * underrun in auimpl_consume_fragment, but in such a
+ * case we should get silence bytes. Assignments done
+ * ahead of the lock to minimize lock contention.
+ */
+ need = fragfr;
+ offset = 0;
+
+ mutex_enter(&sp->s_lock);
+ /* skip over streams not running or paused */
+ if ((!sp->s_running) || (sp->s_paused) || eng->e_suspended) {
+ mutex_exit(&sp->s_lock);
+ continue;
+ }
+
+ do {
+ /* make sure we have data to chew on */
+ if ((avail = sp->s_cnv_cnt) == 0) {
+ auimpl_consume_fragment(sp);
+ sp->s_cnv_ptr = sp->s_cnv_src;
+ avail = sp->s_cnv_cnt;
+ }
+
+ /*
+ * We might have got more data than we need
+ * right now. (E.g. 8kHz expanding to 48kHz.)
+ * Take only what we need.
+ */
+ used = min(avail, need);
+
+ /*
+ * Mix the results, as much data as we can use
+ * this round.
+ */
+ auimpl_output_mix(sp, offset, used);
+
+ /*
+ * Save the offset for the next round, so we don't
+ * remix into the same location.
+ */
+ offset += used;
+
+ /*
+ * Okay, we mixed some data, but it might not
+ * have been all we need. This can happen
+ * either because we just mixed up some
+ * partial/residual data, or because the
+ * client has a fragment size which expands to
+ * less than a full fragment for us. (Such as
+ * a client wanting to operate at a higher
+ * data rate than the engine.)
+ */
+ need -= used;
+
+ } while (need && avail);
+
+ if (avail == 0) {
+ /* underrun or end of data */
+ if (sp->s_draining) {
+ if (sp->s_drain_idx == 0) {
+ sp->s_drain_idx = eng->e_head;
+ }
+ if (eng->e_tail >= sp->s_drain_idx) {
+ sp->s_drain_idx = 0;
+ sp->s_draining = B_FALSE;
+ /*
+ * After draining, stop the
+ * stream cleanly. This
+ * prevents underrun errors.
+ *
+ * (Stream will auto-start if
+ * client submits more data to
+ * it.)
+ *
+ * AC3: When an AC3 stream
+ * drains we should probably
+ * stop the actual hardware
+ * engine.
+ */
+ ASSERT(mutex_owned(&eng->e_lock));
+ sp->s_running = B_FALSE;
+ drained = B_TRUE;
+ }
+ } else {
+#ifdef DEBUG
+ audio_underruns++;
+#endif
+ underrun = B_TRUE;
+ sp->s_errors += need;
+ }
+ }
+
+ /* wake threads waiting for stream (blocking writes, etc.) */
+ cv_broadcast(&sp->s_cv);
+
+ mutex_exit(&sp->s_lock);
+
+
+ /*
+ * Asynchronously notify clients. We do as much as
+ * possible of this outside of the lock, it avoids
+ * s_lock and c_lock contention and eliminates any
+ * chance of deadlock.
+ */
+
+ mutex_enter(&c->c_lock);
+ c->c_do_output = B_TRUE;
+
+ if (underrun)
+ c->c_do_notify = B_TRUE;
+
+ if (drained)
+ c->c_do_drain = B_TRUE;
+
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+
+ /*
+ * Deal with 24-bit overflows (from mixing) gracefully.
+ */
+ auimpl_output_limiter(eng);
+
+ /*
+ * Export the data (a whole fragment) to the device.
+ */
+ eng->e_export(eng);
+
+ /*
+ * Update the head and offset. The head counts without
+ * wrapping, whereas the offset wraps. Note that the test +
+ * subtraction is faster for dealing with wrap than modulo.
+ */
+ eng->e_head += fragfr;
+ eng->e_hidx += fragfr;
+ if (eng->e_hidx >= eng->e_nframes)
+ eng->e_hidx -= eng->e_nframes;
+
+ /*
+ * Consider doing the SYNC outside of the lock.
+ */
+ ENG_SYNC(eng, fragfr);
+}
+
+/*
+ * Outer loop attempts to keep playing until we hit maximum playahead.
+ */
+
+void
+auimpl_output_callback(audio_engine_t *eng)
+{
+ unsigned fragfr;
+ int64_t cnt;
+
+ fragfr = eng->e_fragfr;
+ cnt = eng->e_head - eng->e_tail;
+
+ /* stay a bit ahead */
+ while (cnt < (fragfr * 4)) {
+ auimpl_output_callback_impl(eng);
+ cnt = eng->e_head - eng->e_tail;
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_sun.c b/usr/src/uts/common/io/audio/impl/audio_sun.c
new file mode 100644
index 0000000000..d75366f439
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_sun.c
@@ -0,0 +1,1967 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Sun audio(7I) and mixer(7I) personality.
+ *
+ * There are some "undocumented" details of how legacy Sun audio
+ * interfaces work. The following "rules" were derived from reading the
+ * legacy Sun mixer code, and to the best of our knowledge are not
+ * documented elsewhere.
+ *
+ * - We create a "fake" audio device, which behaves like a classic
+ * exclusive audio device, for each PID, as determined during open(2).
+ *
+ * - Different processes don't interfere with each other. Even though
+ * they are running concurrently, they each think they have exclusive
+ * control over the audio device.
+ *
+ * - Read and write directions operate independent of each other. That
+ * is, a device open for reading won't intefere with a future open for
+ * writing, and vice versa. This is true even within the same process.
+ *
+ * - Because the virtualization is by PID, strange behavior may occur
+ * if a process tries to open an audio device at the same time it
+ * has already received a file descriptor from another process (such
+ * through inheritence via fork()).
+ *
+ * - The "fake" audio device has no control over physical settings.
+ * It sees only the software attenuation-based volumes for play and
+ * record, and has no support for alternate input or output ports or
+ * access to the monitoring features of the hardware.
+ *
+ * - Explicit notificaton signals (SIGPOLL) are only ever sent up the
+ * audioctl node -- never up a regular audio node. (The stream head
+ * may still issue SIGPOLL based on readability/writability of
+ * course.)
+ *
+ * - Corollary: processes that want asynch. notifications will open
+ * /dev/audioctl as well as /dev/audio.
+ *
+ * - We don't support the MIXER mode at all.
+ *
+ * - By corollary, a process is only allowed to open /dev/audio once
+ * (in each direction.)
+ *
+ * - Attempts to open /dev/audio in duplex mode (O_RDWR) fail (EBUSY)
+ * if the device cannot support duplex operation.
+ *
+ * - Attempts to open a device with FREAD set fail if the device is not
+ * capable of recording. (Likewise for FWRITE and playback.)
+ *
+ * - No data transfer is permitted for audioctl nodes. (No actual
+ * record or play.)
+ *
+ * - Sun audio does not support any formats other than linear and
+ * ULAW/ALAW. I.e. it will never support AC3 or other "opaque"
+ * streams which require special handling.
+ *
+ * - Sun audio only supports stereo or monophonic data streams.
+ */
+
+#include <sys/types.h>
+#include <sys/open.h>
+#include <sys/errno.h>
+#include <sys/audio.h>
+#include <sys/mixer.h>
+#include <sys/file.h>
+#include <sys/stropts.h>
+#include <sys/strsun.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include <sys/note.h>
+#include <sys/stat.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include "audio_client.h"
+
+typedef struct sclient sclient_t;
+typedef struct sdev sdev_t;
+typedef struct sproc sproc_t;
+typedef struct sioc sioc_t;
+
+typedef enum {
+ COPYIN,
+ COPYOUT,
+ IOCTL,
+ ACK,
+ NAK,
+ FINI
+} sioc_state_t;
+
+struct sioc {
+ sclient_t *i_sc;
+ int i_cmd;
+ size_t i_size;
+ void *i_data;
+ mblk_t *i_bcont;
+ int i_step;
+ uint_t i_model;
+ sioc_state_t i_state;
+ mblk_t *i_mp;
+ caddr_t i_addr;
+ int i_error;
+};
+
+/* common structure shared between both audioctl and audio nodes */
+struct sclient {
+ sproc_t *s_proc;
+ sdev_t *s_sdev;
+ audio_client_t *s_client;
+ queue_t *s_rq;
+ queue_t *s_wq;
+ ldi_handle_t s_lh;
+ unsigned s_eof;
+ list_t s_eofcnt;
+ kmutex_t s_lock;
+ mblk_t *s_draining;
+};
+
+struct eofcnt {
+ list_node_t linkage;
+ uint64_t tail;
+};
+
+struct sdev {
+ audio_dev_t *d_dev;
+
+ list_t d_procs;
+ kmutex_t d_mx;
+ kcondvar_t d_cv;
+};
+
+struct sproc {
+ pid_t p_id;
+ struct audio_info p_info;
+ int p_refcnt;
+ int p_oflag;
+ list_node_t p_linkage;
+ sdev_t *p_sdev;
+ sclient_t *p_writer;
+ sclient_t *p_reader;
+};
+
+int sproc_hold(audio_client_t *, int);
+void sproc_release(sclient_t *);
+static void sproc_update(sproc_t *);
+
+
+static kmutex_t sdev_lock;
+static dev_info_t *sdev_dip;
+
+/*
+ * Alloc extra room for ioctl buffer, in case none was supplied or copyin was
+ * shorter than we need for the whole struct. On failure, returns an
+ * appropriate errno, zero on success. Any original data is preserved.
+ */
+static int
+sioc_alloc(sioc_t *ip, size_t size)
+{
+ mblk_t *nmp;
+
+ /* if we already have enough, just use what we've got */
+ if (ip->i_size >= size)
+ return (0);
+
+ if ((nmp = allocb(size, BPRI_MED)) == NULL) {
+ ip->i_state = NAK;
+ ip->i_error = ENOMEM;
+ return (ENOMEM);
+ }
+ bzero(nmp->b_rptr, size);
+
+ /* if there was already some data present, preserve it */
+ if (ip->i_size != 0) {
+ bcopy(ip->i_data, nmp->b_rptr, ip->i_size);
+ freemsg(ip->i_bcont);
+ }
+ ip->i_bcont = nmp;
+ ip->i_data = nmp->b_rptr;
+ ip->i_size = size;
+
+ return (0);
+}
+
+static void
+sioc_copyin(sioc_t *ip, size_t size)
+{
+ ip->i_state = COPYIN;
+ ip->i_size = size;
+ if (ip->i_bcont != NULL) {
+ freemsg(ip->i_bcont);
+ ip->i_bcont = NULL;
+ }
+
+ mcopyin(ip->i_mp, ip, size, ip->i_addr);
+}
+
+static void
+sioc_copyout(sioc_t *ip, size_t size)
+{
+ mblk_t *bcont;
+
+ ASSERT(ip->i_size >= size);
+
+ bcont = ip->i_bcont;
+
+ ip->i_state = COPYOUT;
+ ip->i_bcont = NULL;
+
+ mcopyout(ip->i_mp, ip, size, ip->i_addr, bcont);
+}
+
+static void
+sioc_error(sioc_t *ip, int error)
+{
+ ip->i_state = NAK;
+ ip->i_error = error;
+}
+
+static void
+sioc_success(sioc_t *ip)
+{
+ ip->i_state = ACK;
+}
+
+static void
+sioc_fini(sioc_t *ip)
+{
+ if (ip->i_bcont != NULL)
+ freemsg(ip->i_bcont);
+
+ kmem_free(ip, sizeof (*ip));
+}
+
+static void
+sioc_finish(sioc_t *ip)
+{
+ mblk_t *mp;
+ sclient_t *sc;
+
+ sc = ip->i_sc;
+ mp = ip->i_mp;
+ ip->i_mp = NULL;
+
+ switch (ip->i_state) {
+ case ACK:
+ miocack(sc->s_wq, mp, 0, 0);
+ break;
+
+ case IOCTL: /* caller didn't use sioc_success */
+ ip->i_error = ECANCELED;
+ miocnak(sc->s_wq, mp, 0, ip->i_error);
+ break;
+
+ case NAK:
+ miocnak(sc->s_wq, mp, 0, ip->i_error);
+ break;
+
+ case COPYOUT:
+ case COPYIN:
+ /* data copy to be done */
+ qreply(sc->s_wq, mp);
+ return;
+
+ case FINI:
+ if (mp != NULL) {
+ freemsg(mp);
+ }
+ break;
+ }
+
+ sioc_fini(ip);
+}
+
+static int
+sun_compose_format(audio_prinfo_t *prinfo)
+{
+ switch (prinfo->precision) {
+ case 8:
+ switch (prinfo->encoding) {
+ case AUDIO_ENCODING_ULAW:
+ return (AUDIO_FORMAT_ULAW);
+ case AUDIO_ENCODING_ALAW:
+ return (AUDIO_FORMAT_ALAW);
+ case AUDIO_ENCODING_LINEAR8:
+ return (AUDIO_FORMAT_U8);
+ case AUDIO_ENCODING_LINEAR:
+ return (AUDIO_FORMAT_S8);
+ }
+ break;
+ case 16:
+ if (prinfo->encoding == AUDIO_ENCODING_LINEAR)
+ return (AUDIO_FORMAT_S16_NE);
+ break;
+ case 32:
+ if (prinfo->encoding == AUDIO_ENCODING_LINEAR)
+ return (AUDIO_FORMAT_S32_NE);
+ break;
+ }
+ return (AUDIO_FORMAT_NONE);
+
+}
+
+static void
+sun_decompose_format(audio_prinfo_t *prinfo, int afmt)
+{
+ int e, p;
+
+ /*
+ * N.B.: Even though some of the formats below can't be set by
+ * this personality, reporting them (using the closest match)
+ * allows this personality to roughly approximate settings for
+ * other streams. It would be incredibly poor form for any
+ * personality to modify the format settings for a different
+ * personality, so we don't worry about that case.
+ */
+
+ switch (afmt) {
+ case AUDIO_FORMAT_ULAW:
+ e = AUDIO_ENCODING_ULAW;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ e = AUDIO_ENCODING_ALAW;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_U8:
+ e = AUDIO_ENCODING_LINEAR8;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_S8:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ case AUDIO_FORMAT_S16_OE:
+ case AUDIO_FORMAT_U16_NE:
+ case AUDIO_FORMAT_U16_OE:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 16;
+ break;
+
+ case AUDIO_FORMAT_S24_NE:
+ case AUDIO_FORMAT_S24_OE:
+ case AUDIO_FORMAT_S24_PACKED:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 24;
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ case AUDIO_FORMAT_S32_OE:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 32;
+ break;
+
+ default:
+ /* all other formats (e.g. AC3) are uninterpreted */
+ e = AUDIO_ENCODING_NONE;
+ p = 32;
+ break;
+ }
+
+ prinfo->encoding = e;
+ prinfo->precision = p;
+}
+
+static sproc_t *
+sproc_alloc(sclient_t *sc)
+{
+ audio_client_t *c;
+ audio_info_t *info;
+ audio_prinfo_t *prinfo;
+ uint32_t caps;
+ sproc_t *proc;
+
+ c = sc->s_client;
+ if ((proc = kmem_zalloc(sizeof (*proc), KM_NOSLEEP)) == NULL) {
+ return (NULL);
+ }
+ info = &proc->p_info;
+
+ /*
+ * audio(7I) says: Upon the initial open() of the audio
+ * device, the driver resets the data format of the device to
+ * the default state of 8-bit, 8Khz, mono u-Law data.
+ */
+ prinfo = &info->play;
+ prinfo->channels = 1;
+ prinfo->sample_rate = 8000;
+ prinfo->encoding = AUDIO_ENCODING_ULAW;
+ prinfo->precision = 8;
+ prinfo->gain = AUDIO_MAX_GAIN;
+ prinfo->balance = AUDIO_MID_BALANCE;
+ prinfo->buffer_size = 8192;
+ prinfo->pause = B_FALSE;
+ prinfo->waiting = B_FALSE;
+ prinfo->open = B_FALSE;
+ prinfo->active = B_FALSE;
+ prinfo->samples = 0;
+ prinfo->eof = 0;
+ prinfo->error = 0;
+ prinfo->minordev = 0;
+ prinfo->port = AUDIO_SPEAKER;
+ prinfo->avail_ports = AUDIO_SPEAKER;
+ prinfo->mod_ports = AUDIO_NONE;
+ prinfo->_xxx = 0;
+
+ prinfo = &info->record;
+ prinfo->channels = 1;
+ prinfo->sample_rate = 8000;
+ prinfo->encoding = AUDIO_ENCODING_ULAW;
+ prinfo->precision = 8;
+ prinfo->gain = AUDIO_MAX_GAIN;
+ prinfo->balance = AUDIO_MID_BALANCE;
+ prinfo->buffer_size = 8192;
+ prinfo->waiting = B_FALSE;
+ prinfo->open = B_FALSE;
+ prinfo->active = B_FALSE;
+ prinfo->samples = 0;
+ prinfo->eof = 0;
+ prinfo->error = 0;
+ prinfo->minordev = 0;
+ prinfo->port = AUDIO_MICROPHONE;
+ prinfo->avail_ports = AUDIO_MICROPHONE;
+ prinfo->mod_ports = AUDIO_MICROPHONE;
+
+ info->output_muted = B_FALSE;
+ /* pretend we don't have a software mixer - we don't support the API */
+ info->hw_features = 0;
+ info->sw_features = 0;
+ info->sw_features_enabled = 0;
+
+ caps = auclnt_get_dev_capab(auclnt_get_dev(c));
+ if (caps & AUDIO_CLIENT_CAP_PLAY)
+ info->hw_features |= AUDIO_HWFEATURE_PLAY;
+ if (caps & AUDIO_CLIENT_CAP_RECORD)
+ info->hw_features |= AUDIO_HWFEATURE_RECORD;
+ if (caps & AUDIO_CLIENT_CAP_DUPLEX)
+ info->hw_features |= AUDIO_HWFEATURE_DUPLEX;
+
+ return (proc);
+}
+
+static void
+sproc_free(sproc_t *proc)
+{
+ kmem_free(proc, sizeof (*proc));
+}
+
+int
+sproc_hold(audio_client_t *c, int oflag)
+{
+ pid_t pid;
+ sproc_t *proc;
+ sdev_t *sdev;
+ sclient_t *sc;
+ list_t *l;
+ audio_dev_t *adev;
+ int rv;
+
+ adev = auclnt_get_dev(c);
+
+ /* first allocate and initialize the sclient private data */
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+
+ mutex_init(&sc->s_lock, NULL, MUTEX_DRIVER, NULL);
+ list_create(&sc->s_eofcnt, sizeof (struct eofcnt),
+ offsetof(struct eofcnt, linkage));
+ auclnt_set_private(c, sc);
+
+ sdev = auclnt_get_dev_minor_data(adev, AUDIO_MINOR_DEVAUDIO);
+ l = &sdev->d_procs;
+ pid = auclnt_get_pid(c);
+
+ /* set a couple of common fields */
+ sc->s_client = c;
+ sc->s_sdev = sdev;
+
+ mutex_enter(&sdev->d_mx);
+ for (proc = list_head(l); proc != NULL; proc = list_next(l, proc)) {
+ if (proc->p_id == pid) {
+ proc->p_refcnt++;
+ break;
+ }
+ }
+ if (proc == NULL) {
+ if ((proc = sproc_alloc(sc)) == NULL) {
+ rv = ENOMEM;
+ goto failed;
+ }
+ proc->p_refcnt = 1;
+ proc->p_id = pid;
+ proc->p_sdev = sdev;
+ list_insert_tail(l, proc);
+ }
+
+ sc->s_proc = proc;
+
+ while (proc->p_oflag & oflag) {
+
+ if (oflag & (FNDELAY|FNONBLOCK)) {
+ rv = EBUSY;
+ goto failed;
+ }
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting++;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting++;
+ if (cv_wait_sig(&sdev->d_cv, &sdev->d_mx) == 0) {
+ /* interrupted! */
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting--;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting--;
+ rv = EINTR;
+ goto failed;
+ }
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting--;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting--;
+ }
+
+ if (oflag & FWRITE) {
+ audio_prinfo_t *play = &proc->p_info.play;
+ audio_stream_t *sp = auclnt_output_stream(c);
+
+ if (((rv = auclnt_set_rate(sp, 8000)) != 0) ||
+ ((rv = auclnt_set_format(sp, AUDIO_FORMAT_ULAW)) != 0) ||
+ ((rv = auclnt_set_channels(sp, 1)) != 0)) {
+ goto failed;
+ }
+
+ auclnt_set_samples(sp, 0);
+ auclnt_set_errors(sp, 0);
+ play->eof = 0;
+ play->buffer_size = 8192;
+
+ auclnt_set_gain(sp, ((play->gain * 100) / AUDIO_MAX_GAIN));
+ auclnt_set_muted(sp, proc->p_info.output_muted);
+ play->open = B_TRUE;
+ proc->p_writer = sc;
+ proc->p_oflag |= FWRITE;
+ }
+
+ if (oflag & FREAD) {
+ audio_prinfo_t *rec = &proc->p_info.record;
+ audio_stream_t *sp = auclnt_input_stream(c);
+
+ if (((rv = auclnt_set_rate(sp, 8000)) != 0) ||
+ ((rv = auclnt_set_format(sp, AUDIO_FORMAT_ULAW)) != 0) ||
+ ((rv = auclnt_set_channels(sp, 1)) != 0)) {
+ goto failed;
+ }
+
+ auclnt_set_samples(sp, 0);
+ auclnt_set_errors(sp, 0);
+ rec->eof = 0;
+ rec->buffer_size = 8192;
+
+ auclnt_set_gain(sp, ((rec->gain * 100) / AUDIO_MAX_GAIN));
+ rec->open = B_TRUE;
+ proc->p_reader = sc;
+ proc->p_oflag |= FREAD;
+ }
+
+ sproc_update(proc);
+
+ mutex_exit(&sdev->d_mx);
+
+ return (0);
+
+failed:
+ mutex_exit(&sdev->d_mx);
+ sproc_release(sc);
+ return (rv);
+
+}
+
+static void
+sun_clear_eof(sclient_t *sc)
+{
+ struct eofcnt *eof;
+ mutex_enter(&sc->s_lock);
+ while ((eof = list_remove_head(&sc->s_eofcnt)) != NULL) {
+ kmem_free(eof, sizeof (*eof));
+ }
+ mutex_exit(&sc->s_lock);
+}
+
+void
+sproc_release(sclient_t *sc)
+{
+ sproc_t *proc;
+ sdev_t *sdev;
+ mblk_t *mp;
+
+ proc = sc->s_proc;
+ sdev = sc->s_sdev;
+ sc->s_proc = NULL;
+
+ mutex_enter(&sdev->d_mx);
+
+ if (proc != NULL) {
+ proc->p_refcnt--;
+ ASSERT(proc->p_refcnt >= 0);
+
+ if (sc == proc->p_writer) {
+ proc->p_oflag &= ~FWRITE;
+ proc->p_writer = NULL;
+ }
+ if (sc == proc->p_reader) {
+ proc->p_oflag &= ~FREAD;
+ proc->p_reader = NULL;
+ }
+ cv_broadcast(&sdev->d_cv);
+
+ if (proc->p_refcnt == 0) {
+ list_remove(&sdev->d_procs, proc);
+ sproc_free(proc);
+ }
+ sc->s_proc = NULL;
+ }
+
+ mutex_exit(&sdev->d_mx);
+
+ sun_clear_eof(sc);
+
+ while ((mp = sc->s_draining) != NULL) {
+ sc->s_draining = mp->b_next;
+ mp->b_next = NULL;
+ freemsg(mp);
+ }
+
+ mutex_destroy(&sc->s_lock);
+ list_destroy(&sc->s_eofcnt);
+ kmem_free(sc, sizeof (*sc));
+}
+
+static void
+sun_sendup(audio_client_t *c)
+{
+ audio_stream_t *sp = auclnt_input_stream(c);
+ sclient_t *sc = auclnt_get_private(c);
+ unsigned framesz = auclnt_get_framesz(sp);
+ queue_t *rq = sc->s_rq;
+ mblk_t *mp;
+ unsigned nbytes = sc->s_proc->p_info.record.buffer_size;
+ unsigned count = nbytes / framesz;
+
+ /*
+ * Potentially send a message upstream with the record data.
+ * We collect this up in chunks of the buffer size requested
+ * by the client.
+ */
+
+ while (auclnt_get_count(sp) >= count) {
+
+ if ((!canputnext(rq)) ||
+ ((mp = allocb(nbytes, BPRI_MED)) == NULL)) {
+ /*
+ * This will apply back pressure to the
+ * buffer. We haven't yet lost any data, we
+ * just can't send it up. The point at which
+ * we have an unrecoverable overrun is in the
+ * buffer, not in the streams queue. So, no
+ * need to do anything right now.
+ *
+ * Note that since recording is enabled, we
+ * expect that the callback routine will be
+ * called repeatedly & regularly, so we don't
+ * have to worry about leaving data orphaned
+ * in the queue.
+ */
+ break;
+ }
+
+ (void) auclnt_consume_data(sp, (caddr_t)mp->b_wptr, count);
+ mp->b_wptr += nbytes;
+ putnext(rq, mp);
+ }
+}
+
+static int
+sun_open(audio_client_t *c, int oflag)
+{
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(oflag));
+ return (0);
+}
+
+static void
+sun_close(audio_client_t *c)
+{
+ _NOTE(ARGUNUSED(c));
+}
+
+static void
+sproc_update(sproc_t *proc)
+{
+ audio_info_t *info;
+ audio_stream_t *sp;
+ sclient_t *sc;
+
+ info = &proc->p_info;
+
+ ASSERT(mutex_owned(&proc->p_sdev->d_mx));
+
+ if ((sc = proc->p_writer) != NULL) {
+ sp = auclnt_output_stream(sc->s_client);
+
+ info->play.sample_rate = auclnt_get_rate(sp);
+ info->play.channels = auclnt_get_channels(sp);
+ sun_decompose_format(&info->play, auclnt_get_format(sp));
+
+ info->play.gain =
+ (auclnt_get_gain(sp) * AUDIO_MAX_GAIN) / 100;
+ info->play.pause = auclnt_is_paused(sp);
+ info->play.active = !info->play.pause;
+ info->play.samples = auclnt_get_samples(sp);
+ info->play.error = auclnt_get_errors(sp) ? B_TRUE : B_FALSE;
+ info->output_muted = auclnt_get_muted(sp);
+ }
+
+ if ((sc = proc->p_reader) != NULL) {
+ sp = auclnt_input_stream(sc->s_client);
+
+ info->record.sample_rate = auclnt_get_rate(sp);
+ info->record.channels = auclnt_get_channels(sp);
+ sun_decompose_format(&info->record, auclnt_get_format(sp));
+
+ info->record.gain =
+ (auclnt_get_gain(sp) * AUDIO_MAX_GAIN) / 100;
+ info->record.pause = auclnt_is_paused(sp);
+ info->record.active = !info->record.pause;
+ info->record.samples = auclnt_get_samples(sp);
+ info->record.error = auclnt_get_errors(sp) ? B_TRUE : B_FALSE;
+ }
+}
+
+static void
+sioc_getinfo(sioc_t *ip)
+{
+ sclient_t *sc = ip->i_sc;
+ sproc_t *proc = sc->s_proc;
+ int rv;
+
+ switch (ip->i_step) {
+ case 0:
+ if ((rv = sioc_alloc(ip, sizeof (audio_info_t))) != 0) {
+ sioc_error(ip, rv);
+ break;
+ }
+
+ mutex_enter(&sc->s_sdev->d_mx);
+ sproc_update(proc);
+ mutex_exit(&sc->s_sdev->d_mx);
+
+ bcopy(&proc->p_info, ip->i_data, sizeof (audio_info_t));
+ sioc_copyout(ip, sizeof (audio_info_t));
+ break;
+ case 1:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+#define CHANGED(new, old, field) \
+ ((new->field != ((uint32_t)~0)) && (new->field != old->field))
+#define CHANGED8(new, old, field) \
+ ((new->field != ((uint8_t)~0)) && (new->field != old->field))
+
+static int
+sun_setinfo(sclient_t *sc, audio_info_t *ninfo)
+{
+ sproc_t *proc = sc->s_proc;
+ audio_info_t *oinfo = &proc->p_info;
+ audio_prinfo_t *npr;
+ audio_prinfo_t *opr;
+
+ int pfmt = AUDIO_FORMAT_NONE;
+ int rfmt = AUDIO_FORMAT_NONE;
+
+ boolean_t reader;
+ boolean_t writer;
+ boolean_t isctl;
+ audio_stream_t *sp;
+ int rv;
+
+ if (auclnt_get_minor_type(sc->s_client) == AUDIO_MINOR_DEVAUDIOCTL) {
+ /* control node can do both read and write fields */
+ isctl = B_TRUE;
+ reader = B_TRUE;
+ writer = B_TRUE;
+ } else {
+ isctl = B_FALSE;
+ writer = sc == proc->p_writer;
+ reader = sc == proc->p_reader;
+ }
+
+ /*
+ * Start by validating settings.
+ */
+ npr = &ninfo->play;
+ opr = &oinfo->play;
+
+ if (writer && CHANGED(npr, opr, sample_rate)) {
+ if ((isctl) ||
+ (npr->sample_rate < 5500) || (npr->sample_rate > 48000)) {
+ return (EINVAL);
+ }
+ }
+ if (writer && CHANGED(npr, opr, channels)) {
+ if ((isctl) || (npr->channels < 1) || (npr->channels > 2)) {
+ return (EINVAL);
+ }
+ }
+ if (writer &&
+ (CHANGED(npr, opr, encoding) || CHANGED(npr, opr, precision))) {
+ if (npr->encoding == (uint32_t)~0)
+ npr->encoding = opr->encoding;
+ if (npr->precision == (uint32_t)~0)
+ npr->precision = opr->precision;
+ pfmt = sun_compose_format(npr);
+ if ((isctl) || (pfmt == AUDIO_FORMAT_NONE)) {
+ return (EINVAL);
+ }
+ }
+
+ /* play fields that anyone can modify */
+ if (CHANGED(npr, opr, gain)) {
+ if (npr->gain > AUDIO_MAX_GAIN) {
+ return (EINVAL);
+ }
+ }
+
+
+ npr = &ninfo->record;
+ opr = &oinfo->record;
+
+ if (reader && CHANGED(npr, opr, sample_rate)) {
+ if ((isctl) ||
+ (npr->sample_rate < 5500) ||
+ (npr->sample_rate > 48000)) {
+ return (EINVAL);
+ }
+ }
+ if (reader && CHANGED(npr, opr, channels)) {
+ if ((isctl) || (npr->channels < 1) || (npr->channels > 2)) {
+ return (EINVAL);
+ }
+ }
+ if (reader &&
+ (CHANGED(npr, opr, encoding) || CHANGED(npr, opr, precision))) {
+ if (npr->encoding == (uint32_t)~0)
+ npr->encoding = opr->encoding;
+ if (npr->precision == (uint32_t)~0)
+ npr->precision = opr->precision;
+ rfmt = sun_compose_format(npr);
+ if ((isctl) || (rfmt == AUDIO_FORMAT_NONE)) {
+ return (EINVAL);
+ }
+ }
+ if (reader && CHANGED(npr, opr, buffer_size)) {
+ if (isctl) {
+ return (EINVAL);
+ }
+ /* make sure we can support 16-bit stereo samples */
+ if ((npr->buffer_size % 4) != 0) {
+ npr->buffer_size = (npr->buffer_size + 3) & ~3;
+ }
+ /* limit the maximum buffer size somewhat */
+ if (npr->buffer_size > 16384) {
+ npr->buffer_size = 16384;
+ }
+ }
+
+ /* record fields that anyone can modify */
+ if (CHANGED(npr, opr, gain)) {
+ if (npr->gain > AUDIO_MAX_GAIN) {
+ return (EINVAL);
+ }
+ }
+
+ /*
+ * Now apply the changes.
+ */
+ if (proc->p_writer != NULL) {
+ sp = auclnt_output_stream(proc->p_writer->s_client);
+ npr = &ninfo->play;
+ opr = &oinfo->play;
+
+ if (CHANGED(npr, opr, sample_rate)) {
+ rv = auclnt_set_rate(sp, npr->sample_rate);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, channels)) {
+ rv = auclnt_set_channels(sp, npr->channels);
+ if (rv != 0)
+ return (rv);
+ }
+ if (pfmt != AUDIO_FORMAT_NONE) {
+ rv = auclnt_set_format(sp, pfmt);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, samples)) {
+ auclnt_set_samples(sp, npr->samples);
+ }
+ if (CHANGED(npr, opr, eof)) {
+ /*
+ * This ugly special case code is required to
+ * prevent problems with realaudio.
+ */
+ if (npr->eof == 0) {
+ sun_clear_eof(proc->p_writer);
+ }
+ opr->eof = npr->eof;
+ }
+ if (CHANGED8(npr, opr, pause)) {
+ if (npr->pause) {
+ auclnt_set_paused(sp);
+ } else {
+ auclnt_clear_paused(sp);
+ /* qenable to start up the playback */
+ qenable(proc->p_writer->s_wq);
+ }
+ }
+ if (CHANGED8(npr, opr, waiting) && (npr->waiting)) {
+ opr->waiting = npr->waiting;
+ }
+ if (CHANGED8(npr, opr, error)) {
+ auclnt_set_errors(sp, npr->error);
+ }
+ if (CHANGED(npr, opr, gain)) {
+ auclnt_set_gain(sp, (npr->gain * 100) / AUDIO_MAX_GAIN);
+ }
+ if (CHANGED8(ninfo, oinfo, output_muted)) {
+ auclnt_set_muted(sp, ninfo->output_muted);
+ }
+ if (CHANGED(npr, opr, buffer_size)) {
+ /*
+ * No checks on the buffer size are performed
+ * for play side. The value of the buffer size
+ * is meaningless for play side anyway.
+ */
+ opr->buffer_size = npr->buffer_size;
+ }
+ } else {
+ /* these vaalues are preserved even if /dev/audio not open */
+ if (CHANGED(npr, opr, gain)) {
+ opr->gain = npr->gain;
+ }
+ if (CHANGED8(ninfo, oinfo, output_muted)) {
+ oinfo->output_muted = ninfo->output_muted;
+ }
+ }
+
+ if (proc->p_reader != NULL) {
+ sp = auclnt_input_stream(proc->p_reader->s_client);
+ npr = &ninfo->record;
+ opr = &oinfo->record;
+
+ if (CHANGED(npr, opr, sample_rate)) {
+ rv = auclnt_set_rate(sp, npr->sample_rate);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, channels)) {
+ rv = auclnt_set_channels(sp, npr->channels);
+ if (rv != 0)
+ return (rv);
+ }
+ if (rfmt != AUDIO_FORMAT_NONE) {
+ rv = auclnt_set_format(sp, rfmt);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, samples)) {
+ auclnt_set_samples(sp, npr->samples);
+ }
+ if (CHANGED(npr, opr, eof)) {
+ opr->eof = npr->eof;
+ }
+ if (CHANGED8(npr, opr, pause)) {
+ if (npr->pause) {
+ auclnt_set_paused(sp);
+ } else {
+ auclnt_clear_paused(sp);
+ auclnt_start(sp);
+ }
+ }
+ if (CHANGED8(npr, opr, waiting) && (npr->waiting)) {
+ opr->waiting = npr->waiting;
+ }
+ if (CHANGED8(npr, opr, error)) {
+ auclnt_set_errors(sp, npr->error);
+ }
+ if (CHANGED(npr, opr, buffer_size)) {
+ opr->buffer_size = npr->buffer_size;
+ }
+ if (CHANGED(npr, opr, gain)) {
+ auclnt_set_gain(sp, (npr->gain * 100) / AUDIO_MAX_GAIN);
+ }
+ } else {
+ /* these values are preserved even if /dev/audio not open */
+ if (CHANGED(npr, opr, gain)) {
+ opr->gain = npr->gain;
+ }
+ }
+
+ return (0);
+}
+
+static void
+sioc_setinfo(sioc_t *ip)
+{
+ int rv;
+ sclient_t *sc = ip->i_sc;
+ audio_info_t *ninfo;
+
+ switch (ip->i_step) {
+ case 0:
+ sioc_copyin(ip, sizeof (audio_info_t));
+ break;
+
+ case 1:
+ ninfo = (audio_info_t *)ip->i_data;
+
+ mutex_enter(&sc->s_sdev->d_mx);
+ rv = sun_setinfo(ip->i_sc, ninfo);
+
+ if (rv != 0) {
+ sioc_error(ip, rv);
+ } else {
+ sproc_update(sc->s_proc);
+
+ bcopy(&sc->s_proc->p_info, ninfo, sizeof (*ninfo));
+ sioc_copyout(ip, sizeof (audio_info_t));
+ }
+ mutex_exit(&sc->s_sdev->d_mx);
+ break;
+
+ case 2:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+static void
+sioc_getdev(sioc_t *ip)
+{
+ int rv;
+ sclient_t *sc = ip->i_sc;
+ audio_client_t *c = sc->s_client;
+ audio_dev_t *d = auclnt_get_dev(c);
+
+ switch (ip->i_step) {
+ case 0:
+ rv = sioc_alloc(ip, sizeof (audio_device_t));
+ if (rv == 0) {
+ audio_device_t *a = ip->i_data;
+
+ (void) snprintf(a->name, sizeof (a->name),
+ "SUNW,%s", auclnt_get_dev_name(d));
+ (void) strlcpy(a->config,
+ auclnt_get_dev_description(d), sizeof (a->config));
+ (void) strlcpy(a->version,
+ auclnt_get_dev_version(d), sizeof (a->version));
+ sioc_copyout(ip, sizeof (*a));
+ } else {
+ sioc_error(ip, rv);
+ }
+ break;
+
+ case 1:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+static void
+sunstr_ioctl(sioc_t *ip)
+{
+ switch (ip->i_cmd) {
+ case AUDIO_GETINFO:
+ sioc_getinfo(ip);
+ break;
+
+ case AUDIO_SETINFO:
+ sioc_setinfo(ip);
+ break;
+
+ case AUDIO_GETDEV:
+ sioc_getdev(ip);
+ break;
+
+ case AUDIO_DIAG_LOOPBACK:
+ /* we don't support this one */
+ sioc_error(ip, ENOTTY);
+ sioc_finish(ip);
+ break;
+
+ case AUDIO_MIXERCTL_GET_MODE:
+ case AUDIO_MIXERCTL_SET_MODE:
+ case AUDIO_MIXERCTL_GET_CHINFO:
+ case AUDIO_MIXERCTL_SET_CHINFO:
+ case AUDIO_MIXERCTL_GETINFO:
+ case AUDIO_MIXERCTL_SETINFO:
+ case AUDIO_GET_NUM_CHS:
+ case AUDIO_GET_CH_NUMBER:
+ case AUDIO_GET_CH_TYPE:
+ case AUDIO_MIXER_SINGLE_OPEN:
+ case AUDIO_MIXER_MULTIPLE_OPEN:
+ case AUDIO_MIXER_GET_SAMPLE_RATES:
+ default:
+ sioc_error(ip, EINVAL);
+ sioc_finish(ip);
+ break;
+ }
+}
+
+static int
+sun_sigpoll(audio_client_t *c, void *arg)
+{
+ sproc_t *proc = arg;
+ sclient_t *sc;
+
+ if (auclnt_get_minor_type(c) == AUDIO_MINOR_DEVAUDIOCTL) {
+ sc = auclnt_get_private(c);
+ /* we only need to notify peers in our own process */
+ if ((sc != NULL) && (sc->s_proc == proc)) {
+ (void) putnextctl1(sc->s_rq, M_PCSIG, SIGPOLL);
+ }
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void
+sun_drain(audio_client_t *c)
+{
+ sclient_t *sc = auclnt_get_private(c);
+ mblk_t *mplist, *mp;
+
+ mutex_enter(&sc->s_lock);
+ mplist = sc->s_draining;
+ sc->s_draining = NULL;
+ mutex_exit(&sc->s_lock);
+
+ while ((mp = mplist) != NULL) {
+ mplist = mp->b_next;
+ mp->b_next = NULL;
+ miocack(sc->s_wq, mp, 0, 0);
+ }
+}
+
+static void
+sun_output(audio_client_t *c)
+{
+ sclient_t *sc = auclnt_get_private(c);
+ sproc_t *proc = sc->s_proc;
+ uint64_t tail;
+ struct eofcnt *eof;
+ int eofs = 0;
+
+ tail = auclnt_get_tail(auclnt_output_stream(c));
+
+ /* get more data! (do this early) */
+ qenable(sc->s_wq);
+
+ mutex_enter(&sc->s_lock);
+ while (((eof = list_head(&sc->s_eofcnt)) != NULL) &&
+ (eof->tail < tail)) {
+ list_remove(&sc->s_eofcnt, eof);
+ kmem_free(eof, sizeof (*eof));
+ eofs++;
+ }
+ proc->p_info.play.eof += eofs;
+ mutex_exit(&sc->s_lock);
+
+ if (eofs) {
+ auclnt_dev_walk_clients(auclnt_get_dev(c),
+ sun_sigpoll, proc);
+ }
+}
+
+static void
+sun_input(audio_client_t *c)
+{
+ sun_sendup(c);
+}
+
+static int
+sun_create_minors(audio_dev_t *adev, void *notused)
+{
+ char path[MAXPATHLEN];
+ minor_t minor;
+ int inst;
+ int index;
+ const char *driver;
+ unsigned cap;
+
+ _NOTE(ARGUNUSED(notused));
+
+ ASSERT(mutex_owned(&sdev_lock));
+
+ /* don't create device nodes for sndstat device */
+ cap = auclnt_get_dev_capab(adev);
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ index = auclnt_get_dev_index(adev);
+ inst = auclnt_get_dev_instance(adev);
+ driver = auclnt_get_dev_driver(adev);
+
+ if (sdev_dip != NULL) {
+
+ minor = AUDIO_MKMN(index, AUDIO_MINOR_DEVAUDIO);
+ (void) snprintf(path, sizeof (path), "sound,%s,audio%d",
+ driver, inst);
+ (void) ddi_create_minor_node(sdev_dip, path, S_IFCHR, minor,
+ DDI_NT_AUDIO, 0);
+
+ minor = AUDIO_MKMN(index, AUDIO_MINOR_DEVAUDIOCTL);
+ (void) snprintf(path, sizeof (path), "sound,%s,audioctl%d",
+ driver, inst);
+ (void) ddi_create_minor_node(sdev_dip, path, S_IFCHR, minor,
+ DDI_NT_AUDIO, 0);
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sun_remove_minors(audio_dev_t *adev, void *notused)
+{
+ char path[MAXPATHLEN];
+ int inst;
+ const char *driver;
+ unsigned cap;
+
+ _NOTE(ARGUNUSED(notused));
+
+ ASSERT(mutex_owned(&sdev_lock));
+
+ cap = auclnt_get_dev_capab(adev);
+ /* if not a play or record device, don't bother creating minors */
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ inst = auclnt_get_dev_instance(adev);
+ driver = auclnt_get_dev_driver(adev);
+
+ if (sdev_dip != NULL) {
+
+ (void) snprintf(path, sizeof (path), "sound,%s,audio%d",
+ driver, inst);
+ ddi_remove_minor_node(sdev_dip, path);
+
+ (void) snprintf(path, sizeof (path), "sound,%s,audioctl%d",
+ driver, inst);
+ ddi_remove_minor_node(sdev_dip, path);
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void *
+sun_dev_init(audio_dev_t *adev)
+{
+ sdev_t *sdev;
+ unsigned cap;
+
+ cap = auclnt_get_dev_capab(adev);
+ /* if not a play or record device, don't bother initializing it */
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (NULL);
+ }
+
+ sdev = kmem_zalloc(sizeof (*sdev), KM_SLEEP);
+ sdev->d_dev = adev;
+ mutex_init(&sdev->d_mx, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&sdev->d_cv, NULL, CV_DRIVER, NULL);
+ list_create(&sdev->d_procs, sizeof (struct sproc),
+ offsetof(struct sproc, p_linkage));
+
+ mutex_enter(&sdev_lock);
+ (void) sun_create_minors(adev, NULL);
+ mutex_exit(&sdev_lock);
+
+ return (sdev);
+}
+
+static void
+sun_dev_fini(void *arg)
+{
+ sdev_t *sdev = arg;
+
+ if (sdev != NULL) {
+
+ /* remove minor nodes */
+ mutex_enter(&sdev_lock);
+ (void) sun_remove_minors(sdev->d_dev, NULL);
+ mutex_exit(&sdev_lock);
+
+ mutex_destroy(&sdev->d_mx);
+ cv_destroy(&sdev->d_cv);
+ list_destroy(&sdev->d_procs);
+ kmem_free(sdev, sizeof (*sdev));
+ }
+}
+
+static struct audio_client_ops sun_ops = {
+ "internal,audio",
+ sun_dev_init,
+ sun_dev_fini,
+ sun_open,
+ sun_close,
+ NULL, /* read */
+ NULL, /* write */
+ NULL, /* ioctl */
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ sun_input,
+ sun_output,
+ NULL, /* notify */
+ sun_drain,
+};
+
+static struct audio_client_ops sunctl_ops = {
+ "internal,audioctl",
+ NULL, /* dev_init */
+ NULL, /* dev_fini */
+ sun_open,
+ sun_close,
+ NULL, /* read */
+ NULL, /* write */
+ NULL, /* ioctl */
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* output */
+ NULL, /* input */
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+void
+auimpl_sun_init(void)
+{
+ mutex_init(&sdev_lock, NULL, MUTEX_DRIVER, NULL);
+ sdev_dip = NULL;
+ auclnt_register_ops(AUDIO_MINOR_DEVAUDIO, &sun_ops);
+ auclnt_register_ops(AUDIO_MINOR_DEVAUDIOCTL, &sunctl_ops);
+}
+
+/*
+ * This is the operations entry points that are streams specific...
+ * We map "instance" numbers.
+ */
+
+static int
+sunstr_open(queue_t *rq, dev_t *devp, int flag, int sflag, cred_t *cr)
+{
+ int rv;
+ minor_t minor;
+ minor_t index;
+ minor_t type;
+ dev_t physdev;
+ ldi_ident_t lid;
+ ldi_handle_t lh = NULL;
+ audio_client_t *c = NULL;
+ sclient_t *sc = NULL;
+ audio_dev_t *adev;
+ unsigned fmt;
+ int oflag;
+ boolean_t isopen = B_FALSE;
+
+ if (sflag != 0) {
+ /* no direct clone or module opens */
+ return (EINVAL);
+ }
+
+ /*
+ * NB: We reuse the partitioning that the core framework is
+ * using for instance numbering. This does mean that we are
+ * limited to at most AUDIO_MN_INST_MASK devices, but this
+ * number is sufficiently large (8192) that not to be a concern.
+ */
+
+ minor = getminor(*devp);
+ index = (minor >> AUDIO_MN_INST_SHIFT) & AUDIO_MN_INST_MASK;
+ type = (minor >> AUDIO_MN_TYPE_SHIFT) & AUDIO_MN_TYPE_MASK;
+
+ /* can't directly open a cloned node! */
+ if (minor & AUDIO_MN_CLONE_MASK) {
+ return (ENXIO);
+ }
+
+ switch (type) {
+ case AUDIO_MINOR_DEVAUDIOCTL:
+ fmt = AUDIO_FORMAT_NONE;
+ oflag = flag & ~(FWRITE | FREAD);
+ break;
+ case AUDIO_MINOR_DEVAUDIO:
+ fmt = AUDIO_FORMAT_PCM;
+ oflag = flag;
+ break;
+ default:
+ /* these minor types are not legal */
+ return (ENXIO);
+ }
+
+ /* look up and hold the matching audio device */
+ adev = auclnt_hold_dev_by_index(index);
+ if (adev == NULL) {
+ return (ENXIO);
+ }
+ /* find the matching physical devt */
+ physdev = makedevice(ddi_driver_major(auclnt_get_dev_devinfo(adev)),
+ AUDIO_MKMN(auclnt_get_dev_instance(adev), type));
+
+ if ((rv = ldi_ident_from_stream(rq, &lid)) == 0) {
+ rv = ldi_open_by_dev(&physdev, OTYP_CHR, flag, cr, &lh, lid);
+ }
+
+ /* ldi open is done, lh holds device, and we can release our hold */
+ auclnt_release_dev(adev);
+
+ if (rv != 0) {
+ goto fail;
+ }
+ /* phys layer clones a device for us */
+ ASSERT((getminor(physdev) & AUDIO_MN_CLONE_MASK) != 0);
+
+ c = auclnt_hold_by_devt(physdev);
+ ASSERT(c != NULL);
+ if ((rv = auclnt_open(c, fmt, oflag)) != 0) {
+ goto fail;
+ }
+ isopen = B_TRUE;
+
+ if ((rv = sproc_hold(c, oflag)) != 0) {
+ goto fail;
+ }
+
+ sc = auclnt_get_private(c);
+ WR(rq)->q_ptr = rq->q_ptr = sc;
+ sc->s_lh = lh;
+ sc->s_rq = rq;
+ sc->s_wq = WR(rq);
+
+ /* start up the input */
+ if (oflag & FREAD) {
+ auclnt_start(auclnt_input_stream(c));
+ }
+
+ auclnt_release(c);
+
+ /* we just reuse same minor number that phys layer used */
+ *devp = makedevice(getmajor(*devp), getminor(physdev));
+
+ qprocson(rq);
+
+ return (0);
+
+fail:
+ if (sc != NULL) {
+ sproc_release(sc);
+ }
+ if (isopen) {
+ auclnt_close(c);
+ }
+ if (lh != NULL) {
+ auclnt_release(c);
+ (void) ldi_close(lh, flag, cr);
+ }
+
+ return (rv);
+}
+
+static int
+sunstr_close(queue_t *rq, int flag, cred_t *cr)
+{
+ sclient_t *sc;
+ audio_client_t *c;
+ int rv;
+
+ sc = rq->q_ptr;
+ c = sc->s_client;
+
+ if ((auclnt_get_minor_type(c) == AUDIO_MINOR_DEVAUDIO) &&
+ (ddi_can_receive_sig() || (ddi_get_pid() == 0))) {
+ rv = auclnt_drain(c);
+ }
+
+ auclnt_stop(auclnt_output_stream(c));
+ auclnt_stop(auclnt_input_stream(c));
+
+ auclnt_close(c);
+
+ qprocsoff(rq);
+
+ (void) ldi_close(sc->s_lh, flag, cr);
+
+ sproc_release(sc);
+
+ return (rv);
+}
+
+static void
+sunstr_miocdata(sclient_t *sc, mblk_t *mp)
+{
+ struct copyresp *csp;
+ sioc_t *ip;
+ mblk_t *bcont;
+
+ csp = (void *)mp->b_rptr;
+
+ /*
+ * If no state, then something "bad" has happened.
+ */
+ if (((ip = (void *)csp->cp_private) == NULL) || (ip->i_sc != sc)) {
+ miocnak(sc->s_wq, mp, 0, EFAULT);
+ return;
+ }
+
+ /*
+ * If we failed to transfer data to/from userland, then we are
+ * done. (Stream head will have notified userland.)
+ */
+ if (csp->cp_rval != 0) {
+ ip->i_state = FINI;
+ ip->i_mp = mp;
+ sioc_finish(ip);
+ return;
+ }
+
+ /*
+ * Buffer area for ioctl is attached to chain.
+ * For an ioctl that didn't have any data to copyin,
+ * we might need to allocate a new buffer area.
+ */
+ bcont = mp->b_cont;
+ ip->i_bcont = bcont;
+ mp->b_cont = NULL;
+
+ if (bcont != NULL) {
+ ip->i_data = bcont->b_rptr;
+ }
+
+ /*
+ * Meaty part of data processing.
+ */
+ ip->i_state = IOCTL;
+ ip->i_mp = mp;
+
+ /* now, call the handler ioctl */
+ sunstr_ioctl(ip);
+}
+
+static void
+sunstr_mioctl(sclient_t *sc, mblk_t *mp)
+{
+ struct iocblk *iocp = (void *)mp->b_rptr;
+ sioc_t *ip;
+
+ /* BSD legacy here: we only support transparent ioctls */
+ if (iocp->ioc_count != TRANSPARENT) {
+ miocnak(sc->s_wq, mp, 0, EINVAL);
+ return;
+ }
+
+ ip = kmem_zalloc(sizeof (*ip), KM_NOSLEEP);
+ if (ip == NULL) {
+ miocnak(sc->s_wq, mp, 0, ENOMEM);
+ return;
+ }
+
+ /* make sure everything is setup in case we need to do copyin/out */
+ ip->i_sc = sc;
+ ip->i_model = iocp->ioc_flag;
+ ip->i_cmd = iocp->ioc_cmd;
+ ip->i_addr = *(caddr_t *)(void *)mp->b_cont->b_rptr;
+ ip->i_state = IOCTL;
+ ip->i_mp = mp;
+ freemsg(mp->b_cont);
+ mp->b_cont = NULL;
+
+ /* now, call the handler ioctl */
+ sunstr_ioctl(ip);
+}
+
+static int
+sunstr_wput(queue_t *wq, mblk_t *mp)
+{
+ sclient_t *sc = wq->q_ptr;
+ struct iocblk *iocp;
+
+ switch (DB_TYPE(mp)) {
+ case M_IOCTL:
+ /* Drain ioctl needs to be handled on the service queue */
+ iocp = (void *)mp->b_rptr;
+ if (iocp->ioc_cmd == AUDIO_DRAIN) {
+ if (auclnt_get_minor_type(sc->s_client) ==
+ AUDIO_MINOR_DEVAUDIO) {
+ (void) putq(wq, mp);
+ } else {
+ miocnak(wq, mp, 0, EINVAL);
+ }
+ } else {
+ sunstr_mioctl(sc, mp);
+ }
+ break;
+
+ case M_IOCDATA:
+ sunstr_miocdata(sc, mp);
+ break;
+
+ case M_FLUSH:
+ /*
+ * We don't flush the engine. The reason is that
+ * other streams might be using the engine. This is
+ * fundamentally no different from the case where the
+ * engine hardware has data buffered in an
+ * inaccessible FIFO.
+ *
+ * Clients that want to ensure no more data is coming
+ * should stop the stream before flushing.
+ */
+ if (*mp->b_rptr & FLUSHW) {
+ flushq(wq, FLUSHALL);
+ auclnt_flush(auclnt_output_stream(sc->s_client));
+ *mp->b_rptr &= ~FLUSHW;
+ }
+ if (*mp->b_rptr & FLUSHR) {
+ flushq(RD(wq), FLUSHALL);
+ auclnt_flush(auclnt_input_stream(sc->s_client));
+ qreply(wq, mp);
+ } else {
+ freemsg(mp);
+ }
+ break;
+
+ case M_DATA:
+ /*
+ * If we don't have an engine, then we can't accept
+ * write() data. audio(7i) says we just ignore it,
+ * so we toss it.
+ */
+ if (auclnt_get_minor_type(sc->s_client) !=
+ AUDIO_MINOR_DEVAUDIO) {
+ freemsg(mp);
+ } else {
+ /*
+ * Defer processing to the queue. This keeps
+ * the data ordered, and allows the wsrv
+ * routine to gather multiple mblks at once.
+ */
+ if (mp->b_cont != NULL) {
+
+ /*
+ * If we need to pullup, do it here to
+ * simplify the rest of the processing
+ * later. This should rarely (if
+ * ever) be necessary.
+ */
+ mblk_t *nmp;
+
+ if ((nmp = msgpullup(mp, -1)) == NULL) {
+ freemsg(mp);
+ } else {
+ freemsg(mp);
+ (void) putq(wq, nmp);
+ }
+ } else {
+ (void) putq(wq, mp);
+ }
+ }
+ break;
+
+ default:
+ freemsg(mp);
+ break;
+ }
+ return (0);
+}
+
+static int
+sunstr_wsrv(queue_t *wq)
+{
+ sclient_t *sc = wq->q_ptr;
+ audio_client_t *c = sc->s_client;
+ audio_stream_t *sp;
+ mblk_t *mp;
+ unsigned framesz;
+
+ sp = auclnt_output_stream(c);
+
+ framesz = auclnt_get_framesz(sp);
+
+ while ((mp = getq(wq)) != NULL) {
+
+ unsigned count;
+
+ /* got a message */
+
+ /* if its a drain ioctl, we need to process it here */
+ if (DB_TYPE(mp) == M_IOCTL) {
+ ASSERT((*(int *)(void *)mp->b_rptr) == AUDIO_DRAIN);
+ mutex_enter(&sc->s_lock);
+ mp->b_next = sc->s_draining;
+ sc->s_draining = mp;
+ mutex_exit(&sc->s_lock);
+
+ if (auclnt_start_drain(c) != 0) {
+ sun_drain(c);
+ }
+ continue;
+ }
+
+ ASSERT(DB_TYPE(mp) == M_DATA);
+
+ /*
+ * Empty mblk require special handling, since they
+ * indicate EOF. We treat them separate from the main
+ * processing loop.
+ */
+ if (MBLKL(mp) == 0) {
+ struct eofcnt *eof;
+
+ eof = kmem_zalloc(sizeof (*eof), KM_NOSLEEP);
+ if (eof != NULL) {
+ eof->tail = auclnt_get_head(sp);
+ mutex_enter(&sc->s_lock);
+ list_insert_tail(&sc->s_eofcnt, eof);
+ mutex_exit(&sc->s_lock);
+ }
+ freemsg(mp);
+ continue;
+ }
+
+ count = auclnt_produce_data(sp, (caddr_t)mp->b_rptr,
+ MBLKL(mp) / framesz);
+
+ mp->b_rptr += count * framesz;
+
+ if (MBLKL(mp) >= framesz) {
+ (void) putbq(wq, mp);
+ break;
+ } else {
+ freemsg(mp);
+ }
+ }
+
+ /* if the stream isn't running yet, start it up */
+ if (!auclnt_is_paused(sp))
+ auclnt_start(sp);
+
+ return (0);
+}
+
+static int
+sunstr_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ if ((cmd != DDI_ATTACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&sdev_lock);
+ sdev_dip = dip;
+ auclnt_walk_devs(sun_create_minors, NULL);
+ mutex_exit(&sdev_lock);
+ ddi_report_dev(dip);
+
+ return (0);
+}
+
+static int
+sunstr_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ if ((cmd != DDI_DETACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&sdev_lock);
+ /* remove all minors */
+ auclnt_walk_devs(sun_remove_minors, NULL);
+ sdev_dip = NULL;
+ mutex_exit(&sdev_lock);
+
+ return (0);
+}
+
+static int
+sunstr_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
+{
+ int error;
+
+ _NOTE(ARGUNUSED(dip));
+ _NOTE(ARGUNUSED(arg));
+
+ switch (cmd) {
+ case DDI_INFO_DEVT2DEVINFO:
+ *result = sdev_dip;
+ error = DDI_SUCCESS;
+ break;
+ case DDI_INFO_DEVT2INSTANCE:
+ *result = 0;
+ error = DDI_SUCCESS;
+ break;
+ default:
+ *result = NULL;
+ error = DDI_FAILURE;
+ }
+ return (error);
+}
+
+static struct module_info sunstr_minfo = {
+ 0, /* used for strlog(1M) only, which we don't use */
+ "austr",
+ 0, /* min pkt size */
+ 2048, /* max pkt size */
+ 65536, /* hi water */
+ 32768, /* lo water */
+};
+
+static struct qinit sunstr_rqinit = {
+ NULL, /* qi_putp */
+ NULL, /* qi_srvp */
+ sunstr_open, /* qi_qopen */
+ sunstr_close, /* qi_qclose */
+ NULL, /* qi_qadmin */
+ &sunstr_minfo, /* qi_minfo */
+ NULL, /* qi_mstat */
+};
+
+static struct qinit sunstr_wqinit = {
+ sunstr_wput, /* qi_putp */
+ sunstr_wsrv, /* qi_srvp */
+ NULL, /* qi_qopen */
+ NULL, /* qi_qclose */
+ NULL, /* qi_qadmin */
+ &sunstr_minfo, /* qi_minfo */
+ NULL, /* qi_mstat */
+};
+
+static struct streamtab sunstr_strtab = {
+ &sunstr_rqinit,
+ &sunstr_wqinit,
+ NULL,
+ NULL
+};
+
+struct cb_ops sunstr_cb_ops = {
+ nodev, /* open */
+ nodev, /* close */
+ nodev, /* strategy */
+ nodev, /* print */
+ nodev, /* dump */
+ nodev, /* read */
+ nodev, /* write */
+ nodev, /* ioctl */
+ nodev, /* devmap */
+ nodev, /* mmap */
+ nodev, /* segmap */
+ nochpoll, /* chpoll */
+ ddi_prop_op, /* prop_op */
+ &sunstr_strtab, /* str */
+ D_MP, /* flag */
+ CB_REV, /* rev */
+ nodev, /* aread */
+ nodev, /* awrite */
+};
+
+static struct dev_ops sunstr_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ sunstr_getinfo, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ sunstr_attach, /* attach */
+ sunstr_detach, /* detach */
+ nodev, /* reset */
+ &sunstr_cb_ops, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+};
+
+static struct modldrv sunstr_modldrv = {
+ &mod_driverops,
+ "Audio Streams Support",
+ &sunstr_dev_ops,
+};
+
+static struct modlinkage sunstr_modlinkage = {
+ MODREV_1, /* MODREV_1 indicated by manual */
+ &sunstr_modldrv,
+ NULL
+};
+
+int
+sunstr_init(void)
+{
+ /*
+ * NB: This *must* be called after the "audio" module's
+ * _init routine has called auimpl_sun_init().
+ */
+ return (mod_install(&sunstr_modlinkage));
+}
+
+int
+sunstr_fini(void)
+{
+ return (mod_remove(&sunstr_modlinkage));
+}
+
+int
+sunstr_info(struct modinfo *modinfop)
+{
+ return (mod_info(&sunstr_modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/impl/austr.c b/usr/src/uts/common/io/audio/impl/austr.c
new file mode 100644
index 0000000000..5f85c483b7
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/austr.c
@@ -0,0 +1,62 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Audio Streams Support driver. This relies on the common audio module.
+ *
+ * The entire driver is a tiny shim for the audio framework, and exists
+ * solely to provide a device node that we can hang STREAMs minor nodes from,
+ * since we can't mix and match STREAMs and character devices in the same
+ * driver, due to limitations in the DDI.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+/* our entire API with "audio" is miniscule */
+extern int sunstr_init(void);
+extern int sunstr_fini(void);
+extern int sunstr_info(struct modinfo *);
+
+int
+_init(void)
+{
+ return (sunstr_init());
+}
+
+int
+_fini(void)
+{
+ return (sunstr_fini());
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (sunstr_info(modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/impl/austr.conf b/usr/src/uts/common/io/audio/impl/austr.conf
new file mode 100644
index 0000000000..4796f135b1
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/austr.conf
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the common austr driver.
+#
+
+#
+# We are a pseudo driver.
+#
+name="austr" parent="pseudo" instance=0;
+
+#
+# We want to always be present and never removed. This is important
+# to ensure that device numbering is not lost due to the driver being
+# forced out of memory automatically.
+#
+ddi-forceattach=1;
+ddi-no-autodetach=1;
diff --git a/usr/src/uts/common/io/audio/inc.flg b/usr/src/uts/common/io/audio/inc.flg
deleted file mode 100644
index 09f67a654c..0000000000
--- a/usr/src/uts/common/io/audio/inc.flg
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-#
-
-# This file brings down all that is needed to build just
-# audio drivers.
-#
-
-find_files "s.*" \
- usr/src/uts/sun/io/audio
-
-find_files "s.*.h" \
- usr/src/uts/common/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/v7/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/v9/sys
-
-find_files "s.*.h" \
- usr/src/uts/intel/sys
-
-find_files "s.*.h" \
- usr/src/uts/intel/ia32/sys
-
-find_files "s.*" \
- usr/src/uts/intel/ia32/ml
-
-find_files "s.*.h" \
- usr/src/uts/sun/sys
-
-find_files "s.*.h" \
- usr/src/uts/i86pc/sys
-
-find_files "s.*.h" \
- usr/src/uts/common/vm
-
-find_files "s.*" \
- usr/src/uts/common/io/warlock
-
-find_files "s.*" \
- usr/src/uts/sparc/ml
-
-find_files "s.*" \
- usr/src/uts/sparc/warlock \
- usr/src/uts/sparc/audiocs \
- usr/src/uts/sparc/audiots \
- usr/src/uts/sparc/audio810 \
- usr/src/uts/sparc/audio1575 \
- usr/src/uts/sparc/audiohd \
- usr/src/uts/sparc/audiosup \
- usr/src/uts/sparc/mixer \
- usr/src/uts/sparc/amsrc2 \
- usr/src/uts/intel/audio810 \
- usr/src/uts/intel/audiohd \
- usr/src/uts/intel/audiosup \
- usr/src/uts/intel/mixer
-
-echo_file usr/src/uts/sparc/os/driver_classes
-echo_file usr/src/uts/sparc/os/driver_aliases
-echo_file usr/src/uts/sparc/os/name_to_major
-echo_file usr/src/uts/intel/os/driver_classes
-echo_file usr/src/uts/intel/os/driver_aliases
-echo_file usr/src/uts/intel/os/name_to_major
-
-echo_file usr/src/Makefile.master
-echo_file usr/src/Makefile.master.64
-echo_file usr/src/req.flg
-echo_file usr/src/Makefile.psm
-echo_file usr/src/Makefile.psm.targ
-echo_file usr/src/uts/Makefile
-echo_file usr/src/uts/Makefile.targ
-echo_file usr/src/uts/Makefile.uts
-echo_file usr/src/uts/sun/Makefile.files
-echo_file usr/src/uts/sun/Makefile.rules
-echo_file usr/src/uts/common/Makefile.files
-echo_file usr/src/uts/common/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile
-echo_file usr/src/uts/sparc/Makefile.files
-echo_file usr/src/uts/sparc/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile.sparc
-echo_file usr/src/uts/sparc/Makefile.sparc.shared
-echo_file usr/src/uts/sparc/Makefile.targ
-echo_file usr/src/uts/sparc/Makefile.targ.shared
-echo_file usr/src/uts/sparc/req.flg
-echo_file usr/src/uts/i86pc/Makefile.i86pc
-echo_file usr/src/uts/i86pc/Makefile.i86pc.shared
-echo_file usr/src/uts/i86pc/Makefile.files
-echo_file usr/src/uts/i86pc/Makefile.rules
-echo_file usr/src/uts/i86pc/Makefile.targ
-echo_file usr/src/uts/i86pc/Makefile.targ.shared
-echo_file usr/src/uts/i86pc/Makefile.workarounds
-echo_file usr/src/uts/intel/Makefile
-echo_file usr/src/uts/intel/Makefile.files
-echo_file usr/src/uts/intel/Makefile.rules
-echo_file usr/src/uts/intel/Makefile.intel
-echo_file usr/src/uts/intel/Makefile.intel.shared
-echo_file usr/src/uts/intel/Makefile.targ
-echo_file usr/src/uts/intel/Makefile.targ.shared
diff --git a/usr/src/uts/common/io/audio/sada/amsrc2/README b/usr/src/uts/common/io/audio/sada/amsrc2/README
deleted file mode 100644
index ee89a89634..0000000000
--- a/usr/src/uts/common/io/audio/sada/amsrc2/README
+++ /dev/null
@@ -1,106 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-Bandlimited Interpolation
-
-In bandlimited interpolation a windowed sinc function is used to
-interpolate input samples and implement sample rate conversion.
-More information on the algorithm can be found on the website at
-http://ccrma-www.stanford.edu/~jos/resample. Choices to be made
-during an implementation include (i) the type of window with which
-to truncate the infinitely long sinc function (ii) the length of
-the latter window (i.e. how many sinc zero-crossings to include)
-(iii) the density of sinc function sampling (iv) the number of bits
-used to encode each sinc coefficient (v) whether to interpolate
-sinc coefficients during sample rate conversion.
-
-In our implementation we (i) use a Kaiser window to truncate
-the sinc function (ii) sample up to the 10th zero crossing (iii)
-sample the interval between each zero crossing 256 times (iv)
-use an integer (32 bits) to encode each coefficient (v) do not,
-for performance reasons, perform coefficient interpolation during
-conversion.
-
-Using the above settings we end up with a conversion table which
-contains (2 * 10 + 1) * 256 = 5376 entries. (We add some more to
-simplify the implementation.) For performance reasons, we use two
-copies of the table, one for up and one for downsampling. Each is
-a reordering of the other. We also use separate functions for up
-and downsampling mono and stereo files giving 4 resampling functions.
-Each can handle, theoretically, any start/target sample rate
-configuration and is accurate to 1Hz.
-
-Upsampling
-
-During conversion the sinc window is centered over the current output
-sample location. We project upwards from input sample values under
-the sinc "umbrella" and multiply and sum corresponding input samples
-and sinc coefficients. The sinc function acts like a low pass filter
-with a cut off frequency of Fs/2 where Fs is the input sample rate.
-The number of multiply-adds is fixed, irrespective of the start and
-target sample rates. Often an input sample location will not intersect
-with a prestored coefficient value and as stated earlier we do not
-interpolate but multiply by the nearest coefficient value.
-
-Downsampling
-
-Downsampling is not as straightforward as upsampling. The stored
-sinc table must be traversed in such a way as to act like a low
-pass filter but this time with a cut off frequency equal to Fs'/2
-where Fs' is the target sample rate. To achieve this the sinc
-coefficients are stretched over a longer interval of the input
-signal (compared to upsampling) and traversed at a slower rate.
-Compared to upsampling there are then more multiply-adds to be
-performed but this is offset by the fact that there are fewer
-output samples to be generated.
-
-Notes
-
-When resampling we are performing an interpolation. This interpolation
-is imperfect and errors will occur. Furthermore, in our implementation
-there is often no direct mapping from filter coefficents to input
-samples and in this case we use the closest filter coefficient which
-introduces more error. These errors lead to unwanted frequencies in
-the audio output signal. Many of these could be removed or reduced by
-(i) employing a greater sampling density over the stored sinc function,
-thereby increasing the overall table size and lowering the error
-introduced by a lack of filter coefficient interpolation or (ii)
-maintaining the same overall table size but interpolating between
-filter coefficients for increased accuracy at a computational cost.
-Implementing either of these would have a significant effect on
-output audio quality.
-
-As is stands our current implementation should theoretically exhibit a
-stopband rejection of 60dB and a transition bandwidth of ~34% (these
-are theoretical values since the errors mentioned above drag quality
-downwards). Our transition band is centered over Fs/2 with the result
-that should there be significant energy in the upper ~17% of the spectrum
-there will be a considerable artifact introduced in the output signal.
-We take that chance. Stopband rejection can be increased at the expense
-of transition bandwidth and transition bandwidth can be lessened by
-using more sinc zero crossings (i.e. lengthening the filter kernel).
diff --git a/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c b/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c
deleted file mode 100644
index 1897eb6934..0000000000
--- a/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c
+++ /dev/null
@@ -1,1037 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Audio Mixer Sample Rate Conversion Routine 2
- *
- * This module is used by the audio mixer to perform sample rate conversion
- * of audio streams. The audio driver actually specifies which sample rate
- * conversion routine it wants to use, and then passes that information to
- * the audio mixer.
- *
- * NOTE: This module depends on the misc/audiosup and misc/mixer
- * modules being loaded 1st.
- *
- * NOTE: We do NOT allocate the buffers used for sample rate conversion.
- * That is the job of the audio mixer.
- */
-
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/cmn_err.h>
-#include <sys/kmem.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/am_src2_impl.h>
-#include <sys/audio/impl/am_src2_table.h>
-
-/*
- * Local sample rate conversion routines.
- */
-static int am_src2_adjust(srchdl_t, int, int);
-static int *am_src2_convert(srchdl_t, int, int, int *, int *, int *, int *);
-static void am_src2_exit(srchdl_t, int);
-static size_t am_src2_init(srchdl_t, int);
-static size_t am_src2_size(srchdl_t, audio_prinfo_t *, int, int, int);
-static int am_src2_update(srchdl_t, audio_prinfo_t *, audio_prinfo_t *,
- void *, int);
-static int am_src2_up_s(am_src2_data_t *, int *, int *, int);
-static int am_src2_up_m(am_src2_data_t *, int *, int *, int);
-static int am_src2_dn_s(am_src2_data_t *, int *, int *, int);
-static int am_src2_dn_m(am_src2_data_t *, int *, int *, int);
-
-/*
- * Global variable to provide generic sample rate conversion facility.
- */
-am_ad_src_entry_t am_src2 = {
- AM_SRC_VERSION,
- am_src2_init,
- am_src2_exit,
- am_src2_update,
- am_src2_adjust,
- am_src2_convert,
- am_src2_size
-};
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc amsrc2_modlmisc = {
- &mod_miscops, /* drv_modops */
- AM_SRC2_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage amsrc2_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&amsrc2_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Loadable Module Configuration Entry Points
- *
- *
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in amsrc2 _init()", 0);
-
- /* Standard linkage call */
- if ((error = mod_install(&amsrc2_modlinkage)) != 0) {
- ATRACE_32("amsrc2 _init() error 1", error);
- return (error);
- }
-
- ATRACE("amsrc2 _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in amsrc2 _fini()", 0);
-
- if ((error = mod_remove(&amsrc2_modlinkage)) != 0) {
- ATRACE_32("amsrc2 _fini() mod_remove failed", error);
- return (error);
- }
-
- ATRACE_32("amsrc2 _fini() successful", error);
-
- return (error);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&amsrc2_modlinkage, modinfop);
-
- ATRACE_32("amsrc2 _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * am_src2_adjust()
- *
- * Description:
- * This routine is used to adjust the number of hardware samples so we
- * know how many channel samples were converted.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int samples The number of hardware samples
- *
- * Returns:
- * >= 0 The number of channel samples
- * AUDIO_FAILURE Couldn't adjust the size
- */
-static int
-am_src2_adjust(srchdl_t handle, int dir, int samples)
-{
- am_src2_data_t *pptr;
- int value;
-
- ATRACE("in am_src2_adjust()", handle);
- ATRACE_32("am_src2_adjust() direction", dir);
- ATRACE_32("am_src2_adjust() samples", samples);
-
- /* Get the conversion info */
- if ((pptr = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_adjust() no pptr");
- return (AUDIO_FAILURE);
- }
-
- /* Do the math */
- mutex_enter(&pptr->src2_lock);
- ATRACE_32("am_src2_adjust() inFs", pptr->src2_inFs);
- ATRACE_32("am_src2_adjust() outFS", pptr->src2_outFs);
- value = (samples * pptr->src2_inFs) / pptr->src2_outFs;
- mutex_exit(&pptr->src2_lock);
-
- ATRACE_32("am_src2_adjust() returning", value);
-
- return (value);
-
-} /* am_src2_adjust() */
-
-/*
- * am_src2_convert()
- *
- * Description:
- * This routine manages the sample rate conversion process. It converts
- * from src2_inFs to src2_outFs. The input stream must be 16-bit Linear
- * PCM held as 32-bit integers.
- *
- * The returned pointer, if valid, must be one of the two passed in
- * pointers. Otherwise memory will become lost.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int channels The number of channels in conversion
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int *src Original data to convert
- * int *ptr1 Conversion buffer
- * int *ptr2 Conversion buffer (not used)
- * int *samples Pointer to the number of samples to
- * convert, and when we return, the number
- * of samples converted.
- *
- * Returns:
- * valid pointer Pointer to the converted audio stream
- * NULL Conversion failed
- */
-/*ARGSUSED*/
-static int *
-am_src2_convert(srchdl_t handle, int channels, int dir, int *src,
- int *ptr1, int *ptr2, int *samples)
-{
- am_src2_data_t *pdata;
- int converted;
-
- ATRACE("in am_src2_convert()", handle);
- ATRACE_32("am_src2_convert() direction", dir);
- ATRACE_32("am_src2_convert() channels", channels);
-
- /* Get the sample rate conversion data */
- if ((pdata = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_convert() no pdata");
- return (NULL);
- }
-
- mutex_enter(&pdata->src2_lock);
-
- /* Set conversion function depending on direction and channels */
- if (dir == AUDIO_PLAY) {
- if (channels == AUDIO_CHANNELS_MONO) {
- pdata->src2_resample = am_src2_up_m;
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- pdata->src2_resample = am_src2_up_s;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (channels == AUDIO_CHANNELS_MONO) {
- pdata->src2_resample = am_src2_dn_m;
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- pdata->src2_resample = am_src2_dn_s;
- }
-
- }
-
- /* Resample */
- converted = pdata->src2_resample(pdata, src, ptr1, *samples);
-
- ATRACE_32("am_src2_convert() final number converted", converted);
- ATRACE("am_src2_convert() final conversions returning", ptr1);
-
- *samples = converted;
-
- mutex_exit(&pdata->src2_lock);
-
- return (ptr1);
-
-} /* am_src2_convert() */
-
-/*
- * am_src2_exit()
- *
- * Description:
- * Free the private data structure allocated in am_src2_init()
- *
- * NOTE: We do NOT free the buffers used for sample rate conversion.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * void
- */
-static void
-am_src2_exit(srchdl_t handle, int dir)
-{
- am_src2_data_t *pdata;
-
- ATRACE_32("am_src2_exit() direction", dir);
-
- /* Get pointers, based on which direction we are going */
- pdata = (am_src2_data_t *)am_get_src_data(handle, dir);
-
- ATRACE("am_src2_exit() data", pdata);
-
- if (pdata == NULL) {
- ATRACE("am_src2_exit() done", pdata);
- return;
- }
-
- /* Get the mutex */
- mutex_enter(&pdata->src2_lock);
-
- /* Free memory for table pointers */
- if (dir == AUDIO_PLAY) {
- kmem_free((void *)pdata->src2_tables,
- sizeof (*pdata->src2_tables) * (AM_SRC2_CPZC + 1));
- }
-
- /* Release and destroy the mutex */
- mutex_exit(&pdata->src2_lock);
-
- mutex_destroy(&pdata->src2_lock);
-
- kmem_free(pdata, sizeof (*pdata));
-
- am_set_src_data(handle, dir, NULL);
-
- ATRACE("am_src2_exit() done", NULL);
-
-} /* am_src2_exit() */
-
-/*
- * am_src2_init()
- *
- * Description:
- * Allocate memory for the sample rate conversion private data
- * structure and initialize the mutex that guarantees we don't
- * mess with buffers and parameters in the middle of a conversion.
- * Because the current output sample depends on the current and
- * past input samples we require room to store past input samples.
- * Here we return the amount of extra room required in bytes.
- * We initialise all we can at this point in order to keep the
- * work required of am_src2_update() to a minimum.
- *
- * CAUTION: This routine may be called only once without calling
- * am_src2_exit(), otherwise we'll have a memory leak.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * size_t prebuffer Prebuffer memory requirement
- */
-static size_t
-am_src2_init(srchdl_t handle, int dir)
-{
- am_src2_data_t *pdata;
- size_t prebuffer;
- int i;
-
- ATRACE("in am_src2_init()", handle);
- ATRACE_32("am_src2_init() direction", dir);
-
- /* Allocate src data structure */
- pdata = kmem_zalloc(sizeof (*pdata), KM_SLEEP);
- ATRACE("am_src2_init() new src data structure", pdata);
-
- /* Set up mutex */
- mutex_init(&pdata->src2_lock, NULL, MUTEX_DRIVER, NULL);
-
- /* Get the mutex */
- mutex_enter(&pdata->src2_lock);
-
- if (dir == AUDIO_PLAY) {
- /* Scale for 32-bit ints */
- prebuffer = (AM_SRC2_PBUFFER << AM_SRC2_SHIFT2);
- pdata->src2_pbsize = AM_SRC2_PBUFFER;
- pdata->src2_i_index = (pdata->src2_pbsize >> AM_SRC2_SHIFT1);
- pdata->src2_delta_c = 0;
- pdata->src2_cover = 0;
- pdata->src2_tables = kmem_alloc(sizeof (*pdata->src2_tables) *
- (AM_SRC2_CPZC + 1), KM_SLEEP);
- for (i = 0; i < AM_SRC2_CPZC + 1; i++) {
- pdata->src2_tables[i] =
- &_amsrc2tables[i * AM_SRC2_COFFS];
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- /* Scale for 32-bit ints */
- prebuffer = (AM_SRC2_RBUFFER << AM_SRC2_SHIFT2);
- pdata->src2_pbsize = AM_SRC2_RBUFFER;
- pdata->src2_i_index = (pdata->src2_pbsize >> AM_SRC2_SHIFT1);
- pdata->src2_delta_c = 0;
- pdata->src2_delta_n = 0;
- pdata->src2_cover = 0;
- pdata->src2_table = _amsrc2table;
- }
-
- /* Set the data */
- am_set_src_data(handle, dir, pdata);
-
- /* Release the mutex */
- mutex_exit(&pdata->src2_lock);
-
- return (prebuffer);
-
-} /* am_src2_init() */
-
-/*
- * am_src2_size()
- *
- * Description:
- * Determine the size of a buffer, in bytes, needed to hold the number
- * of "samples" when they are converted. We adjust the size based on
- * the number of source hardware channels.
- *
- * NOTE: This size of the buffer is based on 32-bit per sample.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * audio_prinfo_t *prinfo Ptr to the channel's information
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int samples The number of samples
- * int hw_channels Number of hardware channels
- *
- * Returns:
- * size The max # of bytes any sample rate conversion
- * step could need in buffer space
- * AUDIO_FAILURE Couldn't find this size
- */
-static size_t
-am_src2_size(srchdl_t handle, audio_prinfo_t *prinfo, int dir, int samples,
- int hw_channels)
-{
- am_src2_data_t *pdata;
- size_t size;
-
- ATRACE("in am_src2_size()", handle);
- ATRACE_32("am_src2_size() direction", dir);
- ATRACE_32("am_src2_size() samples", samples);
- ATRACE_32("am_src2_size() hw_channels", hw_channels);
-
- pdata = (am_src2_data_t *)am_get_src_data(handle, dir);
- if (pdata == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_size() no pdata");
- return ((size_t)AUDIO_FAILURE);
- }
-
- ASSERT(pdata);
-
- mutex_enter(&pdata->src2_lock);
- ASSERT(pdata->src2_inFs);
- ASSERT(pdata->src2_outFs);
- ATRACE_32("am_src2_size() inFs", pdata->src2_inFs);
- ATRACE_32("am_src2_size() outFs", pdata->src2_outFs);
-
- /* Round up to maximum frame size if any leftover */
- size = samples * pdata->src2_outFs;
- if (size % pdata->src2_inFs) {
- size /= pdata->src2_inFs;
- size++;
- } else {
- size /= pdata->src2_inFs;
- }
- if (size % AUDIO_CHANNELS_STEREO) {
- size++;
- }
-
- /* Scale for 32-bit ints */
- size <<= AM_SRC2_SHIFT2;
-
- /* Now adjust for the number of channels */
- if (dir == AUDIO_PLAY) {
- if (prinfo->channels < hw_channels) {
- size *= hw_channels;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (prinfo->channels > hw_channels) {
- size *= prinfo->channels;
- }
- }
-
- mutex_exit(&pdata->src2_lock);
-
- ATRACE_32("am_src2_size() returned size", size);
-
- return (size);
-
-} /* am_src2_size() */
-
-/*
- * am_src2_update()
- *
- * Description:
- * Initialise the sample rate conversion private data structure. Here
- * we (re-)initialise what we couldn't in am_src2_init().
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * audio_prinfo_t *ch_prinfo Ptr to the channel's information
- * audio_prinfo_t *hw_prinfo Ptr to the Codec's information
- * void *src_info Src information (not used)
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * AUDIO_SUCCESS Initialisation succeeded
- * AUDIO_FAILURE Initialisation failed
- */
-/*ARGSUSED*/
-static int
-am_src2_update(srchdl_t handle, audio_prinfo_t *ch_prinfo, audio_prinfo_t
- *hw_prinfo, void *src_info, int dir)
-{
- am_src2_data_t *pdata;
-
- ATRACE("in am_src2_update()", handle);
- ATRACE_32("am_src2_update() direction", dir);
- ATRACE("am_src2_update() ch_prinfo", ch_prinfo);
- ATRACE("am_src2_update() hw_prinfo", hw_prinfo);
-
- /* Get src data structure */
- if ((pdata = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_update() no pdata");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&pdata->src2_lock);
-
- ATRACE("am_src2_update() pdata", pdata);
-
- /*
- * Set direction dependent data. Note: we should probably do some
- * checking here to make sure sane samples rates are being used.
- * Not as strict as amsrc1 but there should be something.
- */
- if (dir == AUDIO_PLAY) {
- pdata->src2_inFs = ch_prinfo->sample_rate;
- pdata->src2_outFs = hw_prinfo->sample_rate;
- pdata->src2_csteps = ((pdata->src2_inFs << AM_SRC2_CPZC_SHIFT) /
- pdata->src2_outFs);
- pdata->src2_cmod = ((pdata->src2_inFs << AM_SRC2_CPZC_SHIFT) %
- pdata->src2_outFs);
- } else {
- ASSERT(dir == AUDIO_RECORD);
- pdata->src2_inFs = hw_prinfo->sample_rate;
- pdata->src2_outFs = ch_prinfo->sample_rate;
- pdata->src2_csteps = (pdata->src2_inFs * ch_prinfo->channels
- << AM_SRC2_CPZC_SHIFT) / pdata->src2_outFs;
- pdata->src2_cmod = ((pdata->src2_inFs * ch_prinfo->channels
- << AM_SRC2_CPZC_SHIFT) % pdata->src2_outFs);
- pdata->src2_tsteps = ((pdata->src2_outFs << AM_SRC2_CPZC_SHIFT)
- / pdata->src2_inFs);
- /*
- * Increment the filter step size if there is any left over.
- * Otherwise we can overrun the end of the input signal when
- * downsampling as the rounding errors accumulate.
- */
- if ((pdata->src2_outFs << AM_SRC2_CPZC_SHIFT)
- % pdata->src2_inFs) {
- pdata->src2_tsteps++;
- }
- }
-
- ATRACE("am_src2_update() ch_prinfo", ch_prinfo);
- ATRACE_32("am_src2_update() src2_inFs", pdata->src2_inFs);
- ATRACE_32("am_src2_update() src2_outFs", pdata->src2_outFs);
-
- mutex_exit(&pdata->src2_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_src2_update() */
-
-/*
- * am_src2_up_m()
- *
- * Description:
- * Carry out upsampling on a mono buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * >= 0 The number of samples after conversion
- */
-static int
-am_src2_up_m(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum; /* Output sample value */
- int k; /* Coefficient counter */
- int *t; /* Pointer into table */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int cmod;
- int cover;
- int csteps;
- int i_index;
- int delta_c;
- int **tables;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- cover = parms->src2_cover;
- tables = parms->src2_tables;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_up_m()", NULL);
- ATRACE_32("in am_src2_up_m() cmod", cmod);
- ATRACE_32("in am_src2_up_m() cover", cover);
- ATRACE_32("in am_src2_up_m() csteps", csteps);
- ATRACE_32("in am_src2_up_m() i_index", i_index);
- ATRACE_32("in am_src2_up_m() delta_c", delta_c);
- ATRACE_32("in am_src2_up_m() outFs", outFs);
- ATRACE_32("in am_src2_up_m() l_index", l_index);
- ATRACE_32("in am_src2_up_m() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient */
- c_index = AM_SRC2_CPZC - delta_c;
- t = tables[c_index];
-
- /* Starting sample */
- s_index = i_index + AM_SRC2_NZCS;
-
- /*
- * Calculate output sample. Note we work from right to left
- * starting with the rightmost sample and going backwards.
- * We do it this way so a while loop can be used for better
- * efficiency. This relies on the fact that t[0] is always
- * zero.
- */
- sum = 0;
- k = AM_SRC2_COFFS - 1;
- while (k) {
- sum += t[k--] * inbuf[s_index--];
- }
-
- /* Write out */
- outbuf[count++] = (sum >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_up_m() */
-
-/*
- * am_src2_up_s()
- *
- * Description:
- * Carry out upsampling on a stereo buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_up_s(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum_l; /* Output sample value */
- long long sum_r; /* Output sample value */
- int c; /* Coefficient value */
- int *t; /* Pointer into table */
- int k; /* Coefficient counter */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int cmod;
- int cover;
- int csteps;
- int i_index;
- int delta_c;
- int **tables;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- cover = parms->src2_cover;
- tables = parms->src2_tables;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_up_s()", NULL);
- ATRACE_32("in am_src2_up_s() cmod", cmod);
- ATRACE_32("in am_src2_up_s() cover", cover);
- ATRACE_32("in am_src2_up_s() csteps", csteps);
- ATRACE_32("in am_src2_up_s() i_index", i_index);
- ATRACE_32("in am_src2_up_s() delta_c", delta_c);
- ATRACE_32("in am_src2_up_s() outFs", outFs);
- ATRACE_32("in am_src2_up_s() l_index", l_index);
- ATRACE_32("in am_src2_up_s() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient */
- c_index = AM_SRC2_CPZC - delta_c;
- t = tables[c_index];
-
- /* Starting sample */
- s_index = i_index + (AM_SRC2_NZCS << AM_SRC2_SHIFT1) + 1;
-
- /*
- * Calculate output sample. Note we work from right to left
- * starting with the rightmost sample and going backwards.
- * We do it this way so a while loop can be used for better
- * efficiency. This relies on the fact that t[0] is always
- * zero.
- */
- sum_l = sum_r = 0;
- k = AM_SRC2_COFFS - 1;
- while (k) {
- c = t[k--];
- sum_r += c * inbuf[s_index--];
- sum_l += c * inbuf[s_index--];
- }
-
- /* Write out */
- outbuf[count++] = (sum_l >> AM_SRC2_COFF_SHIFT);
- outbuf[count++] = (sum_r >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- i_index += (i_index & AM_SRC2_STEREO_MASK);
- delta_c &= AM_SRC2_CPZC_MASK;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_up_s() */
-
-/*
- * am_src2_dn_m()
- *
- * Description:
- * Carry out downsampling on a mono buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_dn_m(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum; /* Output sample value */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int inFs;
- int cmod;
- int cover;
- int csteps;
- int tsteps;
- int *table;
- int i_index;
- int delta_c;
- int delta_n;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- table = parms->src2_table;
- cover = parms->src2_cover;
- tsteps = parms->src2_tsteps;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- delta_n = parms->src2_delta_n;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- inFs = parms->src2_inFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_dn_m()", NULL);
- ATRACE_32("in am_src2_dn_m() cmod", cmod);
- ATRACE_32("in am_src2_dn_m() cover", cover);
- ATRACE_32("in am_src2_dn_m() csteps", csteps);
- ATRACE_32("in am_src2_dn_m() tsteps", tsteps);
- ATRACE_32("in am_src2_dn_m() i_index", i_index);
- ATRACE_32("in am_src2_dn_m() delta_c", delta_c);
- ATRACE_32("in am_src2_dn_m() delta_n", delta_n);
- ATRACE_32("in am_src2_dn_m() outFs", outFs);
- ATRACE_32("in am_src2_dn_m() inFs", inFs);
- ATRACE_32("in am_src2_dn_m() l_index", l_index);
- ATRACE_32("in am_src2_dn_m() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient and sample */
- c_index = AM_SRC2_MIDDLE - delta_n;
- s_index = i_index - ((c_index - AM_SRC2_START) / tsteps);
- c_index -= tsteps * ((c_index - AM_SRC2_START) / tsteps);
-
- /* Calculate output sample */
- sum = 0;
- while (c_index <= AM_SRC2_END) {
- sum += (table[c_index] * inbuf[s_index++]);
- c_index += tsteps;
- }
-
- /* Write out */
- outbuf[count++] = ((sum * outFs / inFs) >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- delta_n = delta_c * outFs / inFs;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_delta_n = delta_n;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_dn_m() */
-
-/*
- * am_src2_dn_s()
- *
- * Description:
- * Carry out downsampling on a stereo buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_dn_s(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum_l; /* Output sample value */
- long long sum_r; /* Output sample value */
- int c; /* Coefficient value */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int inFs;
- int cmod;
- int cover;
- int csteps;
- int *table;
- int tsteps;
- int i_index;
- int delta_c;
- int delta_n;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- table = parms->src2_table;
- cover = parms->src2_cover;
- tsteps = parms->src2_tsteps;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- delta_n = parms->src2_delta_n;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- inFs = parms->src2_inFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_dn_s()", NULL);
- ATRACE_32("in am_src2_dn_s() cmod", cmod);
- ATRACE_32("in am_src2_dn_s() cover", cover);
- ATRACE_32("in am_src2_dn_s() csteps", csteps);
- ATRACE_32("in am_src2_dn_s() tsteps", tsteps);
- ATRACE_32("in am_src2_dn_s() i_index", i_index);
- ATRACE_32("in am_src2_dn_s() delta_c", delta_c);
- ATRACE_32("in am_src2_dn_s() delta_n", delta_n);
- ATRACE_32("in am_src2_dn_s() outFs", outFs);
- ATRACE_32("in am_src2_dn_s() inFs", inFs);
- ATRACE_32("in am_src2_dn_s() l_index", l_index);
- ATRACE_32("in am_src2_dn_s() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient and sample */
- c_index = AM_SRC2_MIDDLE - delta_n;
- s_index = i_index - (i_index & AM_SRC2_STEREO_MASK);
- s_index -= (((c_index - AM_SRC2_START) / tsteps) <<
- AM_SRC2_SHIFT1);
- c_index -= tsteps * ((c_index - AM_SRC2_START) / tsteps);
-
- sum_l = sum_r = 0;
- while (c_index <= AM_SRC2_END) {
- c = table[c_index];
- sum_l += c * inbuf[s_index++];
- sum_r += c * inbuf[s_index++];
- c_index += tsteps;
- }
-
- /* Write out */
- outbuf[count++] = (sum_l * outFs / inFs) >> AM_SRC2_COFF_SHIFT;
- outbuf[count++] = (sum_r * outFs / inFs) >> AM_SRC2_COFF_SHIFT;
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- delta_n = ((i_index & AM_SRC2_STEREO_MASK) <<
- (AM_SRC2_CPZC_SHIFT - 1)) + (delta_c >> AM_SRC2_SHIFT1);
- delta_n = delta_n * outFs / inFs;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_delta_n = delta_n;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_dn_s() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/README b/usr/src/uts/common/io/audio/sada/drv/audio810/README
deleted file mode 100644
index c3cfcd773d..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/README
+++ /dev/null
@@ -1,383 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# Design Document for Metropolis (Amd8111/ALC655) Audio Driver
-
-1. Technical overview
-
-SADA (Solaris audio driver architecture) is the native audio framework of
-Solaris. It supports quickly writing new STREAMS audio drivers by providing
-a number of library modules. There are two types of library modules, the
-audio support module and audio personality modules. The unique audio support
-module provides driver instance, buffer and state management routines. Audio
-personality modules implement the semantics of the device interface. The mixer
-module, as a personality module, implements the semantics of the audio(7I) and
-mixer(7I) man pages. And the another personality module, amsrc2, provides the
-sample rate conversion for mixer. So a SADA driver with mixer function would
-communicate with audio support module, mixer module, and amsrc2 module or
-another conversion module.
-
-
-1.1 Audio support module
-
-The audio support module provides a number of common routines for managing the
-instances and state information for the audio driver. Audio drivers that don't
-need special open(), close(), put(), svc(), and getinfo() routines set their
-qinit and dev_ops data structures as follows:
-
- /* read queue */
- static struct qinit xx_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &xx_modinfo, /* module parameters */
- NULL /* module statistics */
- };
-
- /* write queue */
- static struct qinit xx_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &xx_modinfo, /* module parameters */
- NULL /* module statistics */
- };
-
- /* Device operations structure */
- static struct dev_ops audiots_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio_sup_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- xx_attach, /* devo_attach */
- xx_detach, /* devo_detach */
- nodev, /* devo_reset */
- &xx_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- xx_power /* devo_power */
- };
-
-
- The audio support module manages the device minor nodes for each
- instance of an audio device. Minor nodes are mapped as follows
-
- 0 AUDIO /dev/audio, /dev/sound/?
- 1 AUDIOCTL /dev/audioctl, /dev/sound/?ctl
- 2 WTABLE future wave table synthesizer
- 3 MIDI future hardware MIDI ports
- 4 ATIME future audio timer, probably something like
- SMPTE, which is used to sync audio and video,
- there are a lot of MIDI devices that also
- provide SMPTE information
- 5 - 7 unassigned
- 8 USER1 available for any use
- 9 USER2 available for any use
- 10 USER3 available for any use
-
- 11 - 127 used when the open is cloned
-
- For example, if an app opens /dev/audio that means that minor node 0
- was opened. audiosup sees this and knows that it needs to call
- am_open() in the mixer, which it does. am_open() enforces the open()
- semantics for /dev/audio. Assuming all is legal it checks looks for
- the first clone minor node that isn't being used. It then constructs
- a new device number based on this new minor number and this is
- returned to the kernel. Thus when open() returns you have a cloned
- node. Since the mixer doesn't make the node you don't see an entry
- in /devices, it is invisible.
-
- The number of minor numbers at the beginning is tunable, as is the
- total minor numbers per instance.
-
-
-1.2 Audio Mixer Module
-
- The mixer implements the semantics of the audio(7I) and mixer(7I)
- man pages. Doing so it is the module that provides /dev/audio(ctl).
-
- The mixer supports two modes of operation, mixer on and mixer off.
- When the mixer is off it supports the audio(7I) semantics and just
- a few new ioctl()s from mixer(7I). Essentially it enforces only one
- play and one record stream. Also, the audioctl devices represents
- the hardware.
-
- When the mixer is enabled it takes an audio stream, converts it to
- 32 bit signed linear PCM and saves this converted data as well as
- the original data. When the audio driver needs audio to play the
- mixer scans all clone channels looking for AUDIO play channels. When
- one is found the audio data is retrieved and summed. When all audio
- data is summed it is clipped and converted to the format that the
- audio device is programmed to use. All semantics of audio(7I) and
- mixer(7I) are available. One of the biggest differences is that
- the audioctl channel may now represent either the audio device or the
- clone channel. The rules for this is very complicated and are
- explained elsewhere.
-
- The mixer also supports record, which is essentially the play in
- reverse. The biggest difference is that record doesn't save any
- messages. As for play, the mixer may be on or off. If off then the
- recorded audio is passed straight to the application. If on then
- the mixer scans all clone channels looking for AUDIO record channels.
- When one is found the audio is converted to the right format and
- sent to the application. For both mixer modes the recorded audio is
- queued up in a buffer before it is sent to the application. The size
- of this buffer is set by the record buffer size.
-
-1.3 Amsrc Module
-
- This is the sample rate converted that the mixer uses when the mixer
- is enabled. Currently there are just two sample rate converter modules.
- However the mixer supports the audio driver author providing his/her
- own. This can be for performance or audio quality reasons. In this
- project we use the amsrc2 module.
-
-
-2. Hardware Configuration
-
- This driver is for the low end audio configuration of Metropols
- workstation. This configuration consists of two components, controller
- and codec. The controller is integrated in the southbridge, amd8111, as
- a function of amd8111. And the ALC655 codec is an AC97 2.3 compatible
- codec. It is a 16-bit full-duplex six-channel audio codec with fixed
- 48khz sampling rate.
-
-
-3. Software Environment
-
- Because SADA framework supports only mono/stereo at most, which means
- SADA does not support multi-channel(3, 4, 6 channel), this driver cannot
- support multi-channel unless we modify SADA framework. We plan to use
- Solaris 10&9 as the target operating system for the driver.
-
-
-4. The features/functions
-
- The driver will be placed in /kernel/drv. Like other audio drivers,
- the driver can be added/removed by users via "add_drv/rem_drv" tools.
-
-5. The source code structure
-
- The driver consists of three files, audio810.c, audio810_impl.h and
- audio810.h. The audio810.c is the C source file which contains all
- the C codes of the driver. The audio810.h is the header file containing
- only some baud rate definitions. The audio810_impl.h also a header file
- which contains hardware specific information, such as data structures.
-
- In audio810.c file, we implement the entry functions defined by mixer
- module as follows:
-
- 1) audio810_ad_set_config, /* ad_set_config() */
- 2) audio810_ad_set_format, /* ad_set_format() */
- 3) audio810_ad_start_play, /* ad_start_play() */
- 4) audio810_ad_pause_play, /* ad_pause_play() */
- 5) audio810_ad_stop_play, /* ad_stop_play() */
- 6) audio810_ad_start_record, /* ad_start_record() */
- 7) audio810_ad_stop_record, /* ad_stop_record() */
-
-6. The implementations
- In this section, we describe the design of the driver in detail.
-
-6.1 Main data structure
-
-6.1.1 Buffer descriptor list
- According to the datasheet of amd8111, the buffer descriptor list
- (BDL) allows device drivers to program DMA transfer using by the
- audio controller. The BDL is an array of up to 32 entry, each of
- which describes a data buffer. So we define the BDL entry structure
- as follows:
-
- struct i810_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t reserved:14;
- uint8_t cmd_bup:1; /* interrupt if underflows */
- uint8_t cmd_ioc:1; /* interrupt if completing this entry */
- };
-
- AMD8111 audio function has separated DMA engine for PCM in/out, so
- we must set the two BDLs. For simplification, we allocate continuous
- DMA memory for all BDLs, and define the BDL as follows,
-
- struct i810_bd_list {
- i810_bd_entry_t pcm_in[I810_BD_NUMS];
- i810_bd_entry_t pcm_out[I810_BD_NUMS];
- };
-
-
-6.1.2 Data buffer for BDL entry
-
- For simplification, we allocate DMA buffer for each BDL entry.
-
- struct i810_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- caddr_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
- };
-
-
-6.1.3 Sample buffer
-
- struct i810_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- i810_bdlist_chunk_t chunk[2]; /* 2 chunks for each buffers */
- };
-
-
-6.1.4 Soft state
-
- Every instance of the hardware should have a soft state to save
- instance-wide data in it.
-
- struct audio810_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audio810_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64]; /* shadow of AC97 registers */
-
- boolean_t var_sr; /* variable sample rate ? */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- ddi_acc_handle_t bm_regs_handle; /* for bus master register */
- caddr_t am_regs_base; /* base of audio mixer regs */
- caddr_t bm_regs_base; /* base of bus master regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- i810_bd_list_t *bdl_virtual; /* virtual address of BDL */
- i810_bd_list_t *bdl_phys; /* Physical address of BDL */
- size_t bdl_size; /* real len of BDL */
-
- i810_sample_buf_t play_buf; /* buffer for playback */
- i810_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t i810_defaults; /* default state for dev */
- audio_device_t i810_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *i810_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t i810_psample_rate; /* play sample rate */
- uint_t i810_pchannels; /* play channels */
- uint_t i810_pprecision; /* play precision */
- uint_t i810_csample_rate; /* record sample rate */
- uint_t i810_cchannels; /* record channels */
- uint_t i810_cprecision; /* record precision */
- uint_t i810_output_port; /* current out port */
- uint_t i810_input_port; /* current input port */
- uint_t i810_monitor_gain; /* monitor gain */
- int i810_csamples; /* pcm-in samples/interrupt */
- int i810_psamples; /* pcm-out samples/intr */
-
- uint32_t i810_res_flags; /* resource flags */
- };
-
-6.2 Interrupt handler
-
- We use the BD list (buffer descriptor list) as a round-robin FIFO.
- Both the software and hardware loop around the BD list. For playback,
- the software writes to the buffers pointed by the BD entries of BD
- list, and the hardware sends the data in the buffers out. For record,
- the process is reversed. The structure i810_sample_buf (Refer to 6.1.3)
- is defined for the sample buffer. This structure has two chunks(data
- buffers). The software uses the head, tail and avail fields of this
- structure to manipulate the FIFO. Head field indicates the first valid
- BD hardware can manipulate, and tail indicates the BD after the last
- valid BD, avail indicates how many buffers (chunks) are available.
- There're also two hardware registers to index the FIFO, the CIV (current
- index value) indicates the current BD the hardware is transferring, the
- LVI (last valid index) indicates the last valid BD that contains proper
- data, which the hardware should not pass over. Each time a BD is
- processed, the hardware will update the CIV (plus 1), and issue an
- interrupt if the cmd_ioc field of this processed BD entry is set. If
- the system is busy, there can be more than one BD to be processed when
- the OS has chance to handle the interrupt. Except for the initialization
- at the beginning of playback/record, the driver do not modify the
- content of CIV register.
-
-
- CIV=3 LVI=3 (CIV is updated by hardware)
- ----------------------------------------------------------------
- 0 1 2 3 31
- ----------------------------------------------------------------
- head=2 --> (reclaim, from head to CIV)
- tail=3 --> (fill, from tail to head)
-
- (a) before reclaiming
-
-
- CIV=3 LVI=3
- ----------------------------------------------------------------
- 0 1 2 3 31
- ----------------------------------------------------------------
- head=3 --> (reclaim, from head to CIV)
- tail=3 --> (fill, from tail to head)
-
- (b) after reclaiming/before filling
-
-
- CIV=3 LVI=5(LVI is updated by software)
- ----------------------------------------------------------------
- 0 1 2 3 4 5 31
- ----------------------------------------------------------------
- head=3 --> (reclaim, from head to CIV)
- tail=5 --> (fill, from tail to head)
-
- (c) after filling
-
- Fig 1. Interrupt handler(one pass)
-
- Note:
- Here, we use only two BDs at any time, so when we "fill" BD,
- we can't "fill" all BDs from tail to head.
- tail - head <=2 , when tail>=head;
- tail + 32 - head <=2, when tail<head;
-
- Now, let us explain what the interrupt handler does. It will first
- reclaim the BD(s) which had been transferred, which ranges from
- "head" to (CIV - 1). This job is done in the routine
- audio810_reclaim_play_buf(...). Then it invokes audio810_fill_play_buf
- (...), fills audio samples into buffers pointed by the available BDs
- beginning from "tail", updates the LVI to to the last processed BD
- and update tail to LVI + 1, and update the avail to 0. we use 2 buffers
- and let the 0, 2, 4, 6, ..., 28, 30 BDs pointing to the first buffer,
- let the 1, 3, 5, ..., 29, 31 BDs pointing to the second buffer, so the
- hardware and software will manipulate the two buffer in turn.
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c b/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c
deleted file mode 100644
index 815d48c2e5..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c
+++ /dev/null
@@ -1,3490 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audio810 Audio Driver
- *
- * The driver is primarily targeted at providing audio support for
- * the W1100z and W2100z systems, which use the AMD 8111 audio core
- * and the Realtek ALC 655 codec. The ALC 655 chip supports only
- * fixed 48k sample rate. However, the audio core of AMD 8111 is
- * completely compatible to the Intel ICHx chips (Intel 8x0 chipsets),
- * so the driver can work for the ICHx. In order to support more
- * chipsets, the driver supports variable sample rates, rather than
- * fixed 48k, but it does not support the rates below 8k because some
- * codec chips do not support the sample rates in that scope. Therefore
- * the option of loading the driver in compat mode through the .conf
- * file on the W1100z and W2100z systems is not supported and the
- * "mixer-mode" property has been removed from that file.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The AMD 8111 audio core, as an AC'97 controller, has independent
- * channels for PCM in, PCM out, mic in, modem in, and modem out.
- * The AC'97 controller is a PCI bus master with scatter/gather
- * support. Each channel has a DMA engine. Currently, we use only
- * the PCM in and PCM out channels. Each DMA engine uses one buffer
- * descriptor list. And the buffer descriptor list is an array of up
- * to 32 entries, each of which describes a data buffer. Each entry
- * contains a pointer to a data buffer, control bits, and the length
- * of the buffer being pointed to, where the length is expressed as
- * the number of samples. This, combined with the 16-bit sample size,
- * gives the actual physical length of the buffer.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, i810_sample_buf,
- * to handle BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. There're also two hardware registers to index
- * the FIFO, the CIV (current index value) indicating the current BD the
- * hardware is transferring, and the LVI (last valid index) indicating
- * the last valid BD that contains proper data which the hardware should
- * not pass over. Each time a BD is processed, the hardware will issue an
- * interrupt. If the system is busy, there can be more than one BD to be
- * processed when the OS have chance to handle the interrupt. When an
- * interrupt generated, the interrupt handler will first reclaim the BD(s)
- * which had been transferred, which will be the limit [head, CIV-1], then
- * update the value of the head field to CIV, update the value of avail to
- * CIV - head. And then it will process avail BDs from tail, and set the
- * LVI to the last processed BD and update tail to LVI + 1, and update the
- * avail to 0.
- *
- * We allocate only 2 blocks of DMA memory, say A and B, for every DMA
- * engine, and bind the first, Block A, to the even entries of BDL,
- * while bind the second to the odd entries. That's say, for each buffer
- * descriptor list of DMA engine, entry 0, 2,,, 30 would be bound to Block
- * A, and entry 1, 3,,, 31 would be bound to Block B. Take the playback as
- * an example. At the beginning of playback, we set the entry 0 and 1 to
- * point to block A and B separately, and tell the DMA engine that the last
- * valid entry is entry 1. So the DMA engine doesn't access the entries after
- * entry 1. When the first playback interrupt generated, we reclaim entry
- * 0, and fill the BD entry 2 with the address of Block A, then set the
- * entry 2 to be the last valid entry, and so on. So at any time there are
- * at most two entries available for per DMA engine.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audio810_chip_init()
- *
- * A workaround for the AD1980 and AD1985 codec:
- * Most vendors connect the surr-out of the codecs to the line-out jack.
- * So far we haven't found which vendors don't do that. So we assume that
- * all vendors swap the surr-out and the line-out outputs. So we need swap
- * the two outputs. But we still internally process the
- * "ad198x-swap-output" property. If someday some vendors do not swap the
- * outputs, we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audio810.conf file, and unload and reload the audio810
- * driver (or reboot).
- *
- * System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audio810_impl.h>
-#include <sys/audio/audio810.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audio810_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audio810_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audio810_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audio810_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audio810_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audio810_ad_start_play(audiohdl_t, int);
-static void audio810_ad_pause_play(audiohdl_t, int);
-static void audio810_ad_stop_play(audiohdl_t, int);
-static int audio810_ad_start_record(audiohdl_t, int);
-static void audio810_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audio810_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static void audio810_set_busy(audio810_state_t *);
-static void audio810_set_idle(audio810_state_t *);
-static int audio810_codec_sync(audio810_state_t *);
-static int audio810_write_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_read_ac97(audio810_state_t *, int, uint16_t *);
-static int audio810_and_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_or_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_reset_ac97(audio810_state_t *);
-static int audio810_init_state(audio810_state_t *, dev_info_t *);
-static int audio810_map_regs(dev_info_t *, audio810_state_t *);
-static void audio810_unmap_regs(audio810_state_t *);
-static int audio810_alloc_sample_buf(audio810_state_t *, int, int);
-static void audio810_free_sample_buf(audio810_state_t *, i810_sample_buf_t *);
-static void audio810_stop_dma(audio810_state_t *);
-static int audio810_chip_init(audio810_state_t *, int);
-static int audio810_fill_play_buf(audio810_state_t *);
-static int audio810_prepare_record_buf(audio810_state_t *);
-static void audio810_reclaim_play_buf(audio810_state_t *);
-static void audio810_reclaim_record_buf(audio810_state_t *);
-static int audio810_set_gain(audio810_state_t *, int, int, int);
-static int audio810_set_port(audio810_state_t *, int, int);
-static int audio810_set_monitor_gain(audio810_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audio810_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audio810_name = I810_NAME;
-
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audio810_modinfo = {
- I810_IDNUM, /* module ID number */
- I810_NAME, /* module name */
- I810_MINPACKET, /* minimum packet size */
- I810_MAXPACKET, /* maximum packet size */
- I810_HIWATER, /* high water mark */
- I810_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audio810_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audio810_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audio810_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audio810_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audio810_str_info = {
- &audio810_rqueue, /* read queue */
- &audio810_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audio810_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audio810_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audio810_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio810_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audio810_attach, /* devo_attach */
- audio810_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audio810_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audio810_modldrv = {
- &mod_driverops, /* drv_modops */
- I810_MOD_NAME, /* drv_linkinfo */
- &audio810_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audio810_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audio810_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audio810_mixer_srs[] = {
- I810_SAMPR5510, I810_SAMPR48000, 0
-};
-
-static uint_t audio810_min_compat_srs[] = {
- I810_SAMPR48000, 0
-};
-
-static uint_t audio810_compat_srs [] = {
- I810_SAMPR8000, I810_SAMPR9600, I810_SAMPR11025,
- I810_SAMPR16000, I810_SAMPR18900, I810_SAMPR22050,
- I810_SAMPR27420, I810_SAMPR32000, I810_SAMPR33075,
- I810_SAMPR37800, I810_SAMPR44100, I810_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audio810_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audio810_mixer_srs
-};
-
-static am_ad_sample_rates_t audio810_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio810_compat_srs
-};
-
-/* Some codec, such as the ALC 655, only support 48K sample rate */
-static am_ad_sample_rates_t audio810_min_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio810_min_compat_srs
-};
-
-/* now, only support stereo */
-static uint_t audio810_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-
-static am_ad_cap_comb_t audio810_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0000ffff, /* count_max */
- 8, /* align, BDL must be aligned on a 8-byte boundary */
- 0x3c, /* burstsize */
- 8, /* minxfer, set to the size of a BDlist entry */
- 0x0000ffff, /* maxxfer */
- 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
- 1, /* sgllen, there's no scatter-gather list */
- 8, /* granular, set to the value of minxfer */
- 0 /* flags, use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0001fffe, /* count_max */
- 2, /* align, data buffer is aligned on a 2-byte boundary */
- 0x3c, /* burstsize */
- 4, /* minxfer, set to the size of a sample data */
- 0x0001ffff, /* maxxfer */
- 0x0001ffff, /* seg */
- 1, /* sgllen, no scatter-gather */
- 4, /* granular, set to the value of minxfer */
- 0, /* flags, use virtual address */
-};
-
-static am_ad_entry_t audio810_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audio810_ad_set_config, /* ad_set_config() */
- audio810_ad_set_format, /* ad_set_format() */
- audio810_ad_start_play, /* ad_start_play() */
- audio810_ad_pause_play, /* ad_pause_play() */
- audio810_ad_stop_play, /* ad_stop_play() */
- audio810_ad_start_record, /* ad_start_record() */
- audio810_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audio810 _init()", NULL);
-
- if ((error = ddi_soft_state_init(&audio810_statep,
- sizeof (audio810_state_t), 1)) != 0) {
- ATRACE("i810 ddi_soft_state_init() failed", audio810_statep);
- return (error);
- }
-
- if ((error = mod_install(&audio810_modlinkage)) != 0) {
- ddi_soft_state_fini(&audio810_statep);
- }
-
- ATRACE("audio810 _init() audio810_statep", audio810_statep);
- ATRACE("audio810 _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audio810 _fini()", audio810_statep);
-
- if ((error = mod_remove(&audio810_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audio810_statep);
-
- ATRACE_32("audio810 _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audio810 _info()", NULL);
-
- error = mod_info(&audio810_modlinkage, modinfop);
-
- ATRACE_32("audio810 _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audio810_getinfo()
- */
-static int
-audio810_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audio810_state_t *state;
- int instance;
- int error;
-
- error = DDI_FAILURE;
- ATRACE("in audio810_getinfo()", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audio810_statep,
- instance)) != NULL) {
- *result = state->dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void*)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- return (error);
-
-} /* audio810_getinfo() */
-
-/*
- * audio810_attach()
- *
- * Description:
- * Attach an instance of the audio810 driver. This routine does the
- * device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audio810_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- int instance;
- uint16_t cmdreg;
- audio810_state_t *statep;
- audio_sup_reg_data_t data;
-
- ATRACE("in audio810_attach()", dip);
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audio810_attach() audio810_statep", audio810_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("I810_attach() DDI_RESUME", NULL);
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!attach() DDI_RESUME get soft state failed");
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == statep->dip);
-
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_SUSPENDED);
-
- statep->i810_suspended = I810_NOT_SUSPENDED;
-
- /* Restore the audio810 chip's state */
- if (audio810_chip_init(statep, I810_INIT_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() DDI_RESUME failed to init chip");
- mutex_exit(&statep->inst_lock);
- return (DDI_FAILURE);
- }
-
- mutex_exit(&statep->inst_lock);
-
- /* Resume playing and recording, if required */
- if (audio_sup_restore_state(statep->audio_handle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() DDI_RESUME audio restart failed");
- }
-
- mutex_enter(&statep->inst_lock);
- cv_broadcast(&statep->i810_cv); /* let entry points continue */
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_attach() DDI_RESUME done", NULL);
-
- return (DDI_SUCCESS);
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x",
- audio810_name, instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in the driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unsupported high level interrupt",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audio810_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state failed",
- audio810_name, instance);
- goto error_state;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->audio_handle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failed",
- audio810_name, instance);
- goto error_state;
- }
-
- /* save private state */
- audio_sup_set_private(statep->audio_handle, statep);
-
- if ((audio810_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audio810_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_destroy;
- }
-
- /* set PCI command register */
- cmdreg = pci_config_get16(statep->pci_conf_handle, PCI_CONF_COMM);
- pci_config_put16(statep->pci_conf_handle, PCI_CONF_COMM,
- cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
-
- if ((audio810_alloc_sample_buf(statep, I810_DMA_PCM_OUT,
- statep->play_buf_size) == AUDIO_FAILURE) ||
- (audio810_alloc_sample_buf(statep, I810_DMA_PCM_IN,
- statep->record_buf_size) == AUDIO_FAILURE)) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() couldn't allocate sample buffers");
- goto error_unmap;
- }
-
- /* initialize audio controller and AC97 codec */
- if (audio810_chip_init(statep, I810_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() failed to init chip");
- goto error_dealloc;
- }
-
- /* call the mixer attach() routine */
- if (am_attach(statep->audio_handle, cmd, &statep->ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() am_attach() failed");
- goto error_dealloc;
- }
-
- /* set up kernel statistics */
- if ((statep->i810_ksp = kstat_create(I810_NAME, instance,
- I810_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->i810_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, &statep->intr_iblock,
- (ddi_idevice_cookie_t *)NULL, audio810_intr, (caddr_t)statep) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() bad interrupt specification ");
- goto error_kstat;
- }
- ddi_report_dev(dip);
-
- return (DDI_SUCCESS);
-
-error_kstat:
- if (statep->i810_ksp) {
- kstat_delete(statep->i810_ksp);
- }
- (void) am_detach(statep->audio_handle, DDI_DETACH);
-
-error_dealloc:
- audio810_free_sample_buf(statep, &statep->play_buf);
- audio810_free_sample_buf(statep, &statep->record_buf);
-
-error_unmap:
- audio810_unmap_regs(statep);
-
-error_destroy:
- ATRACE("audio810_attach() error_destroy", statep);
- mutex_destroy(&statep->inst_lock);
- cv_destroy(&statep->i810_cv);
-
-error_audiosup:
- ATRACE("audio810_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->audio_handle);
-
-error_state:
- ATRACE("audio810_attach() error_state", statep);
- ddi_soft_state_free(audio810_statep, instance);
-
- ATRACE("audio810_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audio810_attach() */
-
-/*
- * audio810_detach()
- *
- * Description:
- * Detach an instance of the audio810 driver. After the Codec is detached
- * we call am_detach() and audio_sup_register() so they may do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audio810_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audio810_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE_32("audio810_detach() instance", instance);
- ATRACE("audio810_detach() audio810_statep", audio810_statep);
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("i810_detach() SUSPEND", statep);
-
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_NOT_SUSPENDED);
-
- statep->i810_suspended = I810_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (statep->i810_busy_cnt != 0)
- cv_wait(&statep->i810_cv, &statep->inst_lock);
-
- /* stop DMA engines */
- audio810_stop_dma(statep);
-
- if (audio_sup_save_state(statep->audio_handle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!detach() DDI_SUSPEND audio save failed");
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_detach() DDI_SUSPEND successful", statep);
-
- return (DDI_SUCCESS);
- default:
- ATRACE("i810_detach() unknown command", cmd);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!detach() unknown command: 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- /* stop DMA engines */
- mutex_enter(&statep->inst_lock);
- audio810_stop_dma(statep);
- mutex_exit(&statep->inst_lock);
-
- /* remove the interrupt handler */
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
- /* free DMA memory */
- audio810_free_sample_buf(statep, &statep->play_buf);
- audio810_free_sample_buf(statep, &statep->record_buf);
-
- /* free the kernel statistics structure */
- if (statep->i810_ksp) {
- kstat_delete(statep->i810_ksp);
- }
-
- /* detach audio mixer */
- (void) am_detach(statep->audio_handle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->audio_handle);
-
- mutex_destroy(&statep->inst_lock);
- cv_destroy(&statep->i810_cv);
-
- audio810_unmap_regs(statep);
-
- ddi_soft_state_free(audio810_statep, instance);
-
- return (DDI_SUCCESS);
-
-} /* audio810_detach */
-
-/*
- * audio810_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * Each of buffer descriptor has a field IOC(interrupt on completion)
- * When both this and the IOC bit of correspondent dma control register
- * is set, it means that the controller should issue an interrupt upon
- * completion of this buffer.
- * (AMD 8111 hypertransport I/O hub data sheet. 3.8.3 page 71)
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audio810_intr(caddr_t arg)
-{
- audio810_state_t *statep;
- uint16_t gsr;
-
- statep = (audio810_state_t *)arg;
- mutex_enter(&statep->inst_lock);
-
- if (statep->i810_suspended == I810_SUSPENDED) {
- ATRACE("audio810_intr() device suspended", NULL);
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- gsr = I810_BM_GET32(I810_REG_GSR);
-
- /* check if device is interrupting */
- if ((gsr & I810_GSR_USE_INTR) == 0) {
- ATRACE_32("audio810_intr() not our interrupt", gsr);
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* PCM in interrupt */
- if (gsr & I810_GSR_INTR_PIN) {
- I810_BM_PUT8(I810_PCM_IN_SR,
- I810_BM_SR_LVBCI |
- I810_BM_SR_BCIS |
- I810_BM_SR_FIFOE);
-
- if (statep->flags & I810_DMA_RECD_STARTED) {
- audio810_reclaim_record_buf(statep);
- (void) audio810_prepare_record_buf(statep);
- }
- }
-
- /* PCM out interrupt */
- if (gsr & I810_GSR_INTR_POUT) {
- I810_BM_PUT8(I810_PCM_OUT_SR,
- I810_BM_SR_LVBCI |
- I810_BM_SR_BCIS |
- I810_BM_SR_FIFOE);
-
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- audio810_reclaim_play_buf(statep);
- (void) audio810_fill_play_buf(statep);
- }
- }
-
- /* update the kernel interrupt statistics */
- if (statep->i810_ksp) {
- I810_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audio810_intr() */
-
-/*
- * audio810_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended. It will also block any routine
- * while a suspend is going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_set_busy(audio810_state_t *statep)
-{
- ATRACE("in audio810_set_busy()", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&statep->inst_lock);
-
- /* block if we are suspended */
- while (statep->i810_suspended == I810_SUSPENDED) {
- cv_wait(&statep->i810_cv, &statep->inst_lock);
- }
-
- /*
- * Okay, we aren't suspended, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(statep->i810_busy_cnt >= 0);
- statep->i810_busy_cnt++;
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_set_busy() done", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
-} /* audio810_set_busy() */
-
-/*
- * audio810_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_set_idle(audio810_state_t *statep)
-{
- ATRACE("in audio810_set_idle()", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_NOT_SUSPENDED);
-
- /* decrement the busy count */
- ASSERT(statep->i810_busy_cnt > 0);
- statep->i810_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (statep->i810_busy_cnt == 0) {
- cv_broadcast(&statep->i810_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_set_idle() done", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
-} /* audio810_set_idle() */
-
-/* *********************** Mixer Entry Point Routines ******************* */
-/*
- * audio810_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audio810_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audio810_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("i810_ad_set_config() stream", stream);
- ATRACE_32("i810_ad_set_config() command", command);
- ATRACE_32("i810_ad_set_config() dir", dir);
- ATRACE_32("i810_ad_set_config() arg1", arg1);
- ATRACE_32("i810_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audio810_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audio810_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audio810_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- (void) audio810_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- (void) audio810_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audio810_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- } else { /* not muted */
-
- /* by setting the port we unmute only active ports */
- (void) audio810_set_port(statep,
- AUDIO_PLAY, statep->i810_output_port);
- }
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audio810_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("i810_ad_set_config() unsupported command",
- command);
- break;
- }
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- ATRACE_32("i810_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audio810_ad_set_config() */
-
-/*
- * audio810_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 16 bit signed linear.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audio810_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audio810_state_t *statep;
- uint16_t val;
- int rc = AUDIO_FAILURE;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
-
- ATRACE_32("i810_ad_set_format() stream", stream);
- ATRACE_32("i810_ad_set_format() dir", dir);
- ATRACE_32("i810_ad_set_format() sample_rate", sample_rate);
- ATRACE_32("i810_ad_set_format() channels", channels);
- ATRACE_32("i810_ad_set_format() precision", precision);
- ATRACE_32("i810_ad_set_format() encoding", encoding);
-
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE("i810_ad_set_format() bad encoding", encoding);
- return (AUDIO_FAILURE);
- }
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->var_sr == B_FALSE) {
- /* codec doesn't support variable sample rate */
-
- if (sample_rate != I810_SAMPR48000) {
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!ad_set_format() bad sample rate %d\n",
- sample_rate);
- goto done;
- }
- } else {
- switch (sample_rate) {
- case I810_SAMPR8000: break;
- case I810_SAMPR9600: break;
- case I810_SAMPR11025: break;
- case I810_SAMPR16000: break;
- case I810_SAMPR18900: break;
- case I810_SAMPR22050: break;
- case I810_SAMPR27420: break;
- case I810_SAMPR32000: break;
- case I810_SAMPR33075: break;
- case I810_SAMPR37800: break;
- case I810_SAMPR44100: break;
- case I810_SAMPR48000: break;
- default:
- ATRACE_32("i810_ad_set_format() bad SR", sample_rate);
- goto done;
- }
- }
-
- if (dir == AUDIO_PLAY) {
-
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_SURROUND_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_LFE_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("ad_set_format() bad out SR",
- sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!set_format() bad output sample rate %d",
- sample_rate);
- goto done;
- }
- }
-
- statep->i810_psample_rate = sample_rate;
- statep->i810_pchannels = channels;
- statep->i810_pprecision = precision;
- } else {
-
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_MIC_ADC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("ad_set_format() bad input SR",
- sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!set_format() bad input sample rate %d",
- sample_rate);
- goto done;
- }
- }
-
- statep->i810_csample_rate = sample_rate;
- statep->i810_cchannels = channels;
- statep->i810_cprecision = precision;
- }
-
- rc = AUDIO_SUCCESS;
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- ATRACE_32("i810_ad_set_format() returning", rc);
-
- return (rc);
-
-} /* audio810_ad_set_format() */
-
-/*
- * audio810_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audio810_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- uint8_t cr;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("i810_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & I810_DMA_PLAY_PAUSED) {
- statep->flags |= I810_DMA_PLAY_STARTED;
- statep->flags &= ~I810_DMA_PLAY_PAUSED;
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
- cr |= I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
- goto done;
- }
-
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- goto done;
- }
-
- rc = audio810_fill_play_buf(statep);
- if (rc == AUDIO_FAILURE) {
- statep->flags &= ~I810_DMA_PLAY_STARTED;
- } else {
- statep->flags |= I810_DMA_PLAY_STARTED;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- return (rc);
-
-} /* audio810_ad_start_play() */
-
-/*
- * audio810_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- uint8_t cr;
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
- ATRACE("audio810_ad_pause_play() ", ahandle);
- ATRACE_32("i810_ad_pause_play() stream", stream);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- if ((statep->flags & I810_DMA_PLAY_STARTED) == 0)
- goto done;
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
- cr &= ~I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
- statep->flags |= I810_DMA_PLAY_PAUSED;
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_pause_play() */
-
-/*
- * audio810_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- i810_sample_buf_t *buf;
-
- ATRACE("audio810_ad_stop_play() ", ahandle);
- ATRACE_32("i810_ad_stop_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- /* pause bus master */
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_PAUSE);
-
- /* reset registers */
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
-
- buf = &statep->play_buf;
- buf->io_started = B_FALSE;
- statep->flags &= ~(I810_DMA_PLAY_STARTED
- |I810_DMA_PLAY_PAUSED | I810_DMA_PLAY_EMPTY);
-
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_stop_play() */
-
-/*
- * audio810_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audio810_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio810_ad_start_record() ", ahandle);
- ATRACE_32("i810_ad_start_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- if (statep->flags & I810_DMA_RECD_STARTED)
- goto done;
-
- rc = audio810_prepare_record_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= I810_DMA_RECD_STARTED;
- }
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- return (rc);
-
-} /* audio810_ad_start_record() */
-
-/*
- * audio810_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- i810_sample_buf_t *buf;
-
- ATRACE("audio810_ad_stop_record() ", ahandle);
- ATRACE_32("i810_ad_stop_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- statep->flags &= ~I810_DMA_RECD_STARTED;
-
- buf = &statep->record_buf;
- buf->io_started = B_FALSE;
-
- /* pause bus master */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_PAUSE);
-
- /* reset registers */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST);
-
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_stop_record() */
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audio810_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audio810_attach() would need to be fixed as well.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audio810_init_state(audio810_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int cdrom;
- int mode;
-
- ATRACE("audio810_init_state()", NULL);
-
- statep->dip = dip;
- statep->vol_bits_mask = 5;
-
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", I810_INTS);
- if (pints > I810_MAX_INTS) {
- ATRACE_32("i810_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, I810_INTS);
- pints = I810_INTS;
- } else if (pints < I810_MIN_INTS) {
- ATRACE_32("i810_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, I810_INTS);
- pints = I810_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", I810_INTS);
- if (rints > I810_MAX_INTS) {
- ATRACE_32("i810_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, I810_INTS);
- rints = I810_INTS;
- } else if (rints < I810_MIN_INTS) {
- ATRACE_32("i810_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- rints, I810_INTS);
- rints = I810_INTS;
- }
-
- /* fill in the device default state */
- statep->i810_defaults.play.sample_rate = I810_DEFAULT_SR;
- statep->i810_defaults.play.channels = I810_DEFAULT_CH;
- statep->i810_defaults.play.precision = I810_DEFAULT_PREC;
- statep->i810_defaults.play.encoding = I810_DEFAULT_ENC;
- statep->i810_defaults.play.gain = I810_DEFAULT_PGAIN;
- statep->i810_defaults.play.port = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.avail_ports = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.mod_ports = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.buffer_size = I810_BSIZE;
- statep->i810_defaults.play.balance = I810_DEFAULT_BAL;
-
- statep->i810_defaults.record.sample_rate = I810_DEFAULT_SR;
- statep->i810_defaults.record.channels = I810_DEFAULT_CH;
- statep->i810_defaults.record.precision = I810_DEFAULT_PREC;
- statep->i810_defaults.record.encoding = I810_DEFAULT_ENC;
- statep->i810_defaults.record.gain = I810_DEFAULT_PGAIN;
- statep->i810_defaults.record.port = AUDIO_MICROPHONE;
- statep->i810_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->i810_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->i810_defaults.record.buffer_size = I810_BSIZE;
- statep->i810_defaults.record.balance = I810_DEFAULT_BAL;
-
- statep->i810_defaults.monitor_gain = I810_DEFAULT_MONITOR_GAIN;
- statep->i810_defaults.output_muted = B_FALSE;
- statep->i810_defaults.ref_cnt = B_FALSE;
- statep->i810_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->i810_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (cdrom) {
- statep->i810_defaults.record.avail_ports |= AUDIO_CD;
- statep->i810_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->i810_psample_rate = statep->i810_defaults.play.sample_rate;
- statep->i810_pchannels = statep->i810_defaults.play.channels;
- statep->i810_pprecision = statep->i810_defaults.play.precision;
- statep->i810_csample_rate = statep->i810_defaults.record.sample_rate;
- statep->i810_cchannels = statep->i810_defaults.record.channels;
- statep->i810_cprecision = statep->i810_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->ad_info.ad_mode = mode;
- statep->ad_info.ad_int_vers = AM_VERSION;
- statep->ad_info.ad_add_mode = NULL;
- statep->ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->ad_info.ad_defaults = &statep->i810_defaults;
- statep->ad_info.ad_play_comb = audio810_combinations;
- statep->ad_info.ad_rec_comb = audio810_combinations;
- statep->ad_info.ad_entry = &audio810_entry;
- statep->ad_info.ad_dev_info = &statep->i810_dev_info;
- statep->ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->ad_info.ad_play.ad_mixer_srs = audio810_mixer_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs = audio810_compat_sample_rates;
- statep->ad_info.ad_play.ad_conv = &am_src2;
- statep->ad_info.ad_play.ad_sr_info = NULL;
- statep->ad_info.ad_play.ad_chs = audio810_channels;
- statep->ad_info.ad_play.ad_int_rate = pints;
- statep->ad_info.ad_play.ad_max_chs = I810_MAX_OUT_CHANNELS;
- statep->ad_info.ad_play.ad_bsize = I810_BSIZE;
-
- /* record capabilities */
- statep->ad_info.ad_record.ad_mixer_srs = audio810_mixer_sample_rates;
- statep->ad_info.ad_record.ad_compat_srs =
- audio810_compat_sample_rates;
- statep->ad_info.ad_record.ad_conv = &am_src2;
- statep->ad_info.ad_record.ad_sr_info = NULL;
- statep->ad_info.ad_record.ad_chs = audio810_channels;
- statep->ad_info.ad_record.ad_int_rate = rints;
- statep->ad_info.ad_record.ad_max_chs = I810_MAX_CHANNELS;
- statep->ad_info.ad_record.ad_bsize = I810_BSIZE;
-
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->intr_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
- mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->intr_iblock);
- cv_init(&statep->i810_cv, NULL, CV_DRIVER, NULL);
-
- /* fill in device info strings */
- (void) strcpy(statep->i810_dev_info.name, I810_DEV_NAME);
- (void) strcpy(statep->i810_dev_info.config, I810_DEV_CONFIG);
- (void) strcpy(statep->i810_dev_info.version, I810_DEV_VERSION);
-
- statep->play_buf_size = I810_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / pints;
- statep->play_buf_size += I810_MOD_SIZE -
- (statep->play_buf_size % I810_MOD_SIZE);
- statep->record_buf_size = I810_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / rints;
- statep->record_buf_size += I810_MOD_SIZE -
- (statep->record_buf_size % I810_MOD_SIZE);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_init_state */
-
-
-/*
- * audio810_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audio810_map_regs(dev_info_t *dip, audio810_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
- uint_t nregs = 0;
- int *regs_list;
- int i;
- int pciBar1 = 0;
- int pciBar2 = 0;
- int pciBar3 = 0;
- int pciBar4 = 0;
-
- ATRACE("audio810_map_regs()", statep);
-
- statep->i810_res_flags = 0;
-
- /* map PCI config space */
- if (pci_config_setup(statep->dip, &statep->pci_conf_handle) ==
- DDI_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() configuration memory mapping failed");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_PCI_REGS;
-
- /* check the "reg" property to get the length of memory-mapped I/O */
- if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "reg", (int **)&regs_list, &nregs) != DDI_PROP_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() inquire regs property failed");
- goto error;
- }
- /*
- * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10
- * and 0x14 BAR separately for native audio mixer BAR and native bus
- * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5,
- * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for
- * higher performance access to the controller register. All features
- * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14
- * BAR) capabilities obsolete. However, these controller maintain the
- * I/O BAR capability to allow for the reuse of legacy code maintaining
- * backward compatibility. The I/O BAR is disabled unless system BIOS
- * enables the simultaneous backward compatible capability on the 0x41
- * register.
- *
- * When I/O BAR is enabled, the value of "reg" property should be like
- * this,
- * phys_hi phys_mid phys_lo size_hi size_lo
- * --------------------------------------------------------
- * 0000fd00 00000000 00000000 00000000 00000000
- * 0100fd10 00000000 00000000 00000000 00000100
- * 0100fd14 00000000 00000000 00000000 00000040
- * 0200fd18 00000000 00000000 00000000 00000200
- * 0200fd1c 00000000 00000000 00000000 00000100
- *
- * When I/O BAR is disabled, the "reg" property of the device node does
- * not consist of the description for the I/O BAR. The following example
- * illustrates the vaule of "reg" property,
- *
- * phys_hi phys_mid phys_lo size_hi size_lo
- * --------------------------------------------------------
- * 0000fd00 00000000 00000000 00000000 00000000
- * 0200fd18 00000000 00000000 00000000 00000200
- * 0200fd1c 00000000 00000000 00000000 00000100
- *
- * If the hardware has memory-mapped I/O access, first try to use
- * this facility, otherwise we will try I/O access.
- */
- for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) {
- switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) {
- case 0x10:
- pciBar1 = i;
- break;
- case 0x14:
- pciBar2 = i;
- break;
- case 0x18:
- pciBar3 = i;
- break;
- case 0x1c:
- pciBar4 = i;
- break;
- default: /* we don't care others */
- break;
- }
- }
-
- if ((pciBar3 != 0) && (pciBar4 != 0)) {
- /* map audio mixer registers */
- if ((ddi_regs_map_setup(dip, pciBar3,
- (caddr_t *)&statep->am_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar3 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() memory am mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar3 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_AM_REGS;
-
- /* map bus master register */
- if ((ddi_regs_map_setup(dip, pciBar4,
- (caddr_t *)&statep->bm_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar4 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() memory bm mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar4 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_BM_REGS;
-
- } else if ((pciBar1 != 0) && (pciBar2 != 0)) {
- /* map audio mixer registers */
- if ((ddi_regs_map_setup(dip, pciBar1,
- (caddr_t *)&statep->am_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar1 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() I/O am mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar1 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_AM_REGS;
-
- /* map bus master register */
- if ((ddi_regs_map_setup(dip, pciBar2,
- (caddr_t *)&statep->bm_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar2 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() I/O bm mapping failed, len=: 0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar2 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_BM_REGS;
- } else {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_reg() pci BAR error");
- goto error;
- }
-
- /*
- * now, from here we allocate DMA memory for buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(bdlist) failed ");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_DMA_BDL_HANDLE;
-
- /*
- * we allocate all buffer descriptors lists in continuous dma memory.
- */
- if (ddi_dma_mem_alloc(statep->bdl_dma_handle,
- sizeof (i810_bd_entry_t) * I810_BD_NUMS * 2,
- &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- (caddr_t *)&statep->bdl_virtual, &statep->bdl_size,
- &statep->bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(bdlist) failed");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->bdl_dma_handle, NULL,
- (caddr_t)statep->bdl_virtual, statep->bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() addr_bind_handle failed");
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() addr_bind_handle failed, cookies > 1");
- goto error;
- }
-
- statep->bdl_virt_pin = (i810_bd_entry_t *)(statep->bdl_virtual);
- statep->bdl_virt_pout = statep->bdl_virt_pin + I810_BD_NUMS;
- statep->bdl_phys_pin = (uint32_t)(cookie.dmac_address);
- statep->bdl_phys_pout = statep->bdl_phys_pin +
- sizeof (i810_bd_entry_t) * I810_BD_NUMS;
-
- statep->i810_res_flags |= I810_RS_DMA_BDL_BIND;
-
- ddi_prop_free(regs_list);
-
- return (AUDIO_SUCCESS);
-
-error:
- if (nregs > 0) {
- ddi_prop_free(regs_list);
- }
- audio810_unmap_regs(statep);
-
- return (AUDIO_FAILURE);
-
-} /* audio810_map_regs() */
-
-/*
- * audio810_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and the unmaps control registers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_unmap_regs(audio810_state_t *statep)
-{
- if (statep->i810_res_flags & I810_RS_DMA_BDL_BIND) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_DMA_BDL_MEM) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->bdl_acc_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_DMA_BDL_HANDLE) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->bdl_dma_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_BM_REGS) {
- statep->i810_res_flags &= ~I810_RS_BM_REGS;
- ddi_regs_map_free(&statep->bm_regs_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_AM_REGS) {
- statep->i810_res_flags &= ~I810_RS_AM_REGS;
- ddi_regs_map_free(&statep->am_regs_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_PCI_REGS) {
- statep->i810_res_flags &= ~I810_RS_PCI_REGS;
- pci_config_teardown(&statep->pci_conf_handle);
- }
-
-} /* audio810_unmap_regs() */
-
-/*
- * audio810_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * I810_DMA_PCM_IN ---PCM in DMA engine
- * I810_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-
-static int
-audio810_alloc_sample_buf(audio810_state_t *statep, int which, int len)
-{
- i810_sample_buf_t *buf;
- i810_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
-
- if (which == I810_DMA_PCM_OUT) {
- buf = &statep->play_buf;
- } else {
- ASSERT(which == I810_DMA_PCM_IN);
- buf = &statep->record_buf;
- }
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
-
- if (ddi_dma_alloc_handle(statep->dip, &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len, &dev_attr,
- DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &chunk->data_buf,
- &chunk->real_len, &chunk->acc_handle) != DDI_SUCCESS) {
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len, DDI_DMA_WRITE,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
-
- return (AUDIO_SUCCESS);
-
-error:
- if (i != 0) {
- (void) ddi_dma_unbind_handle((buf->chunk[0].dma_handle));
- ddi_dma_mem_free(&(buf->chunk[0].acc_handle));
- ddi_dma_free_handle(&(buf->chunk[0].dma_handle));
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio810_alloc_sample_buf() */
-
-/*
- * audio810_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audio810_alloc_sample_buf().
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * i810_sample_buf_t *buf The sample buffer structure
- *
- * Returns:
- * void
- */
-static void
-audio810_free_sample_buf(audio810_state_t *statep, i810_sample_buf_t *buf)
-{
- i810_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audio810_free_sample_buf() audio810_statep", statep);
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- chunk->acc_handle = 0;
- ddi_dma_free_handle(&chunk->dma_handle);
- }
-
-} /* audio810_free_sample_buf() */
-
-/*
- * audio810_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_reclaim_play_buf(audio810_state_t *statep)
-{
- i810_sample_buf_t *buf;
- int16_t bmciv;
-
- ASSERT(mutex_owned(&statep->inst_lock));
-
- buf = &statep->play_buf;
- bmciv = I810_BM_GET8(I810_PCM_OUT_CIV);
- while (buf->head != bmciv) {
- buf->avail++;
- buf->head++;
- if (buf->head >= I810_BD_NUMS) {
- buf->head = 0;
- }
- }
-
-} /* audio810_reclaim_play_buf() */
-
-/*
- * audio810_chip_init()
- *
- * Description:
- * This routine initializes the AMD 8111 audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int restore If I810_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio810_chip_init(audio810_state_t *statep, int restore)
-{
- uint32_t gcr;
- uint32_t gsr;
- uint32_t codec_ready;
- uint16_t *shadow;
- int loop;
- int i;
- int j;
- uint16_t sr;
- uint16_t vid1;
- uint16_t vid2;
- uint16_t tmp;
- clock_t ticks;
-
- gcr = I810_BM_GET32(I810_REG_GCR);
- ticks = drv_usectohz(100);
-
- /*
- * SADA only supports stereo, so we set the channel bits
- * to "00" to select 2 channels.
- */
- gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK);
-
- /*
- * Datasheet(ICH5, document number of Intel: 252751-001):
- * 3.6.5.5(page 37)
- * if reset bit(bit1) is "0", driver must set it
- * to "1" to de-assert the AC_RESET# signal in AC
- * link, thus completing a cold reset. But if the
- * bit is "1", then a warm reset is required.
- */
- gcr |= (gcr & I810_GCR_COLD_RST) == 0 ?
- I810_GCR_COLD_RST:I810_GCR_WARM_RST;
- I810_BM_PUT32(I810_REG_GCR, gcr);
-
- /* according AC'97 spec, wait for codec reset */
- for (loop = 6000; --loop >= 0; ) {
- delay(ticks);
- gcr = I810_BM_GET32(I810_REG_GCR);
- if ((gcr & I810_GCR_WARM_RST) == 0) {
- break;
- }
- }
-
- /* codec reset failed */
- if (loop < 0) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!Failed to reset codec");
- return (AUDIO_FAILURE);
- }
-
- /*
- * Wait for codec ready. The hardware can provide the state of
- * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2]
- */
- codec_ready =
- I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY;
- for (loop = 7000; --loop >= 0; ) {
- delay(ticks);
- gsr = I810_BM_GET32(I810_REG_GSR);
- if ((gsr & codec_ready) != 0) {
- break;
- }
- }
- if (loop < 0) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No codec ready signal received");
- return (AUDIO_FAILURE);
- }
-
- /*
- * put the audio controller into quiet state, everything off
- */
- audio810_stop_dma(statep);
-
- /* AC97 register reset */
- if (audio810_reset_ac97(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- shadow = statep->codec_shadow;
-
- if (restore == I810_INIT_NO_RESTORE) {
- for (i = 0; i < I810_LAST_AC_REG; i += 2) {
- (void) audio810_read_ac97(statep, i,
- &(shadow[I810_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] = MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
-
- /* 08h - set master tone control to no modification */
- shadow[I810_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /* 0ah - open pc beep, 0dB */
- shadow[I810_CODEC_REG(AC97_PC_BEEP_REGISTER)] = PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[I810_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[I810_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[I810_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- shadow[I810_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[I810_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- shadow[I810_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * 26h - set EAPD to 1 for devices with ac97-invert-amp
- * property.
- *
- * According to AC'97 spec, EAPD (PR7) independently controls
- * an output pin that manages an optional external audio
- * amplifier. AC'97 compliance requires the implementation of
- * a dedicated output pin for external audio amplifier control.
- * The pin is controlled via the ¡°EAPD¡±(External Amplifier
- * Powerdown) bit in Powerdown Ctrl/Stat Register, bit 15
- * (formerly PR7). EAPD = 0 places a 0 on the output pin,
- * enabling an external audio amplifier, EAPD = 1 shuts it
- * down. Audio amplifier devices that operate with reverse
- * polarity may require an external inverter. By default,
- * EAPD = 0 is to enable external audio amplifier, but for
- * some Sony Vaio laptops, we need to revert polarity to
- * enable external amplifier.
- */
- switch (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ac97-invert-amp", -1)) {
- case -1:
- /* not attempt to flip EAPD */
- break;
-
- case 0:
- /* set EAPD to 0 */
- shadow[I810_CODEC_REG(
- AC97_POWERDOWN_CTRL_STAT_REGISTER)] &= ~PCSR_EAPD;
- break;
-
- case 1:
- /* set EAPD to 1 */
- shadow[I810_CODEC_REG(
- AC97_POWERDOWN_CTRL_STAT_REGISTER)] |= PCSR_EAPD;
- break;
-
- default:
- /* invalid */
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!Invalid value for ac97-invert-amp property");
- break;
- }
-
- /*
- * The rest we ignore, most are reserved.
- */
-
- }
-
- if (restore == I810_INIT_RESTORE) {
- /* Restore from saved values */
- shadow[I810_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- shadow[I810_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- shadow[I810_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- shadow[I810_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= I810_LAST_AC_REG; i += 2)
- (void) audio810_write_ac97(statep, i,
- shadow[I810_CODEC_REG(i)]);
-
- (void) audio810_read_ac97(statep, AC97_RESET_REGISTER, &tmp);
- if (tmp & RR_HEADPHONE_SUPPORT) {
- statep->i810_defaults.play.port |= AUDIO_HEADPHONE;
- statep->i810_defaults.play.avail_ports |= AUDIO_HEADPHONE;
- statep->i810_defaults.play.mod_ports |= AUDIO_HEADPHONE;
- }
-
- /*
- * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
- * line-out jack. So far we haven't found which vendors don't
- * do that. So we assume that all vendors swap the surr-out
- * and the line-out outputs. So we need swap the two outputs.
- * But we still internally process the "ad198x-swap-output"
- * property. If someday some vendors do not swap the outputs,
- * we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audio810.conf file, and unload and reload the
- * audio810 driver (or reboot).
- */
- (void) audio810_read_ac97(statep, AC97_VENDOR_ID1_REGISTER, &vid1);
- (void) audio810_read_ac97(statep, AC97_VENDOR_ID2_REGISTER, &vid2);
- if (vid1 == AD1980_VID1 &&
- (vid2 == AD1980_VID2 || vid2 == AD1985_VID2)) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
- statep->swap_out = B_TRUE;
- (void) audio810_read_ac97(statep, CODEC_AD_REG_MISC,
- &tmp);
- (void) audio810_write_ac97(statep, CODEC_AD_REG_MISC,
- tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
- }
- }
-
- /* check if the codec implements 6 bit volume register */
- (void) audio810_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE | MVR_RIGHT_OPTIONAL_MASK | MVR_LEFT_OPTIONAL_MASK);
- (void) audio810_read_ac97(statep, AC97_MASTER_VOLUME_REGISTER, &tmp);
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->vol_bits_mask = 6;
- }
- /* resume the master volume to the max */
- (void) audio810_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip does not support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audio810_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER, &tmp);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!%s%d: xid=0x%04x, vid1=0x%04x, vid2=0x%04x",
- audio810_name, ddi_get_instance(statep->dip), tmp, vid1, vid2);
- if (!(tmp & EAR_VRA)) {
- statep->var_sr = B_FALSE;
- statep->ad_info.ad_record.ad_compat_srs =
- audio810_min_compat_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audio810_min_compat_sample_rates;
- statep->i810_defaults.play.sample_rate =
- I810_SAMPR48000;
- statep->i810_defaults.record.sample_rate =
- I810_SAMPR48000;
- } else { /* variable sample rate supported */
- statep->var_sr = B_TRUE;
-
- /* set variable rate mode */
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
-
- /* check the sample rates supported */
- for (i = 0, j = 0; audio810_compat_srs[i] != 0; i++) {
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER,
- audio810_compat_srs[i]);
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &sr);
-
- if (sr == audio810_compat_srs[i]) {
- if (i != j) {
- audio810_compat_srs[j] =
- audio810_compat_srs[i];
- }
- j++;
- }
- }
-
- if (j < 1) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No standard sample rate is supported");
- return (AUDIO_FAILURE);
- }
- audio810_compat_srs[j] = 0;
-
- /*
- * if the configuration doesn't support 8K sample rate,
- * we modify the default value to the first.
- */
- if (audio810_compat_srs[0] != I810_SAMPR8000) {
- statep->i810_defaults.play.sample_rate =
- audio810_compat_srs[0];
- statep->i810_defaults.record.sample_rate =
- audio810_compat_srs[0];
- }
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_chip_init() */
-
-/*
- * audio810_stop_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_stop_dma(audio810_state_t *statep)
-{
- /* pause bus master (needed for the following reset register) */
- I810_BM_PUT8(I810_PCM_IN_CR, 0x0);
- I810_BM_PUT8(I810_PCM_OUT_CR, 0x0);
- I810_BM_PUT8(I810_MIC_CR, 0x0);
-
- /* and then reset the bus master registers for a three DMA engines */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
- I810_BM_PUT8(I810_MIC_CR, I810_BM_CR_RST);
-
- statep->flags = 0;
-
-/*
- * XXXX Not sure what these declarations are for, but I brought them from
- * the PM gate.
- */
- statep->play_buf.io_started = B_FALSE;
-
- statep->record_buf.io_started = B_FALSE;
-
-} /* audio810_stop_dma() */
-
-/*
- * audio810_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio810_set_gain(audio810_state_t *statep, int dir, int gain, int channel)
-{
- uint16_t tmp;
- uint16_t channel_gain;
- int regidx;
- uint16_t mask;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- if (statep->vol_bits_mask == 6)
- mask = 0x3f;
- else
- mask = 0x1f;
-
- channel_gain = AUDIO_MAX_GAIN - gain;
- channel_gain = ((channel_gain << statep->vol_bits_mask) -
- channel_gain) / AUDIO_MAX_GAIN;
-
- if (dir == AUDIO_PLAY) {
- if (statep->swap_out == B_TRUE) {
- regidx = AC97_EXTENDED_LRS_VOLUME_REGISTER;
- } else {
- regidx = AC97_PCM_OUT_VOLUME_REGISTER;
- }
- (void) audio810_read_ac97(statep, regidx, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= mask;
- tmp |= (channel_gain << 8);
- } else { /* right channel */
- tmp &= (mask << 8);
- tmp |= channel_gain;
- }
-
- (void) audio810_write_ac97(statep, regidx, tmp);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- (void) audio810_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= gain & RGR_LEFT_MASK;
- } else {
- /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= gain & RGR_RIGHT_MASK;
- }
- (void) audio810_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_set_gain() */
-
-/*
- * audio810_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set
- * AUDIO_SPEAKER output to built-in speaker
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audio810_set_port(audio810_state_t *statep, int dir, int port)
-{
- uint16_t tmp;
-
- if (dir == AUDIO_PLAY) { /* output port */
- tmp = 0;
- if (port == I810_PORT_UNMUTE) {
- port = statep->i810_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audio810_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audio810_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- if (statep->swap_out == B_FALSE) {
- (void) audio810_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- } else {
- (void) audio810_and_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- (uint16_t)~AD1980_SURR_MUTE);
- }
- tmp |= AUDIO_LINE_OUT;
- } else {
- if (statep->swap_out == B_FALSE) {
- (void) audio810_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audio810_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audio810_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audio810_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- ATRACE_32("810_set_port() out port", tmp);
- statep->i810_output_port = tmp;
- if (tmp != port) {
- ATRACE_32("810_set_port() bad out port", port);
- return (AUDIO_FAILURE);
- }
-
- } else { /* input port */
- ASSERT(dir == AUDIO_RECORD);
-
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
-
- /* mute the master record input */
- (void) audio810_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port == AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port == AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- default:
- ATRACE_32("810_set_port bad in port", port);
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audio810_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
- if ((port != AUDIO_NONE) &&
- (statep->codec_shadow[I810_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audio810_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->i810_input_port = port;
- }
-
- ATRACE_32("810_set_port() returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* audio810_set_port() */
-
-/*
- * audio810_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio810_set_monitor_gain(audio810_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audio810_set_monitor_gain()", statep);
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = AUDIO_MAX_GAIN - gain;
- tmp_short = ((tmp_short << statep->vol_bits_mask) - tmp_short) /
- AUDIO_MAX_GAIN;
- tmp_short |= (((tmp_short << statep->vol_bits_mask) -
- tmp_short) / AUDIO_MAX_GAIN) << 8;
- }
-
- switch (statep->i810_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |= statep->codec_shadow[I810_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audio810_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audio810_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audio810_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("i810_ad_set_config() monitor gain bad device", NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->i810_monitor_gain = 0;
- } else {
- statep->i810_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE_32("audio810_set_monitor_gain()", rc);
-
- return (rc);
-
-} /* audio810_set_monitor_gain() */
-
-/*
- * audio810_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audio810_codec_sync(audio810_state_t *statep)
-{
- int i;
- uint16_t casr;
-
- for (i = 0; i < 300; i++) {
- casr = I810_BM_GET8(I810_REG_CASR);
- if ((casr & 1) == 0) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio810_codec_sync() */
-
-/*
- * audio810_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_and_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- I810_AM_PUT16(reg, data & statep->codec_shadow[I810_CODEC_REG(reg)]);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_and_ac97() */
-
-/*
- * audio810_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_or_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- I810_AM_PUT16(reg, data | statep->codec_shadow[I810_CODEC_REG(reg)]);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_or_ac97() */
-
-/*
- * audio810_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_write_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
- I810_AM_PUT16(reg, data);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_write_ac97() */
-
-/*
- * audio810_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audio810_read_ac97(audio810_state_t *statep, int reg, uint16_t *data)
-{
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
- *data = I810_AM_GET16(reg);
- statep->codec_shadow[I810_CODEC_REG(reg)] = *data;
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_read_ac97() */
-
-/*
- * audio810_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audio810_reset_ac97(audio810_state_t *statep)
-{
- uint16_t tmp;
-
- if (audio810_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &tmp) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- if (audio810_write_ac97(statep, AC97_RESET_REGISTER, 1) !=
- AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- if (audio810_read_ac97(statep, AC97_RESET_REGISTER, &tmp) !=
- AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_reset_ac97() */
-
-/*
- * audio810_fill_play_buf()
- *
- * Description:
- * This routine is called by i810_ad_start_play() and the interrupt
- * handler. It fills playback samples into the DMA memory, sets the
- * BDL entries, and starts the playback DMA engine.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audio810_fill_play_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- i810_bd_entry_t *bdesc;
- int samples;
- int rs;
- uint8_t cr;
-
- buf = &statep->play_buf;
-
- if (!buf->io_started) {
- /*
- * ready to start PCM out engine
- */
- I810_BM_PUT8(I810_PCM_OUT_CR, 0);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST |I810_BM_CR_IOCE);
- I810_BM_PUT8(I810_PCM_OUT_LVI, 0);
- I810_BM_PUT32(I810_PCM_OUT_BD_BASE, statep->bdl_phys_pout);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = 2; /* have only two buffers for playback */
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->i810_psample_rate * statep->i810_pchannels /
- statep->ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->tail & 1]);
- mutex_exit(&statep->inst_lock);
- rs = am_get_audio(statep->audio_handle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
-
- if (((statep->flags & I810_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- return (AUDIO_FAILURE);
- }
-
- if (rs <= 0) {
- if (statep->flags & I810_DMA_PLAY_EMPTY) {
-
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->flags &= ~I810_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->inst_lock);
- am_play_shutdown(statep->audio_handle, NULL);
- mutex_enter(&statep->inst_lock);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- I810_BM_PUT8(I810_PCM_OUT_CR, 0);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->flags &= ~(I810_DMA_PLAY_PAUSED |
- I810_DMA_PLAY_EMPTY);
-
- /* return the value for i810_ad_start_play() */
- return (AUDIO_FAILURE);
- } else {
- /*
- * this time, we use one BD entry with empty
- * buffer next time we shut down, if no sound
- * again
- */
- statep->flags |= I810_DMA_PLAY_EMPTY;
- }
- } else {
- /* we got at least one sample */
- statep->flags &= ~I810_DMA_PLAY_EMPTY;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs << 1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->bdl_virt_pout[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)rs;
- bdesc->cmd_bup = 0;
- bdesc->reserved = 0;
- bdesc->cmd_ioc = 1;
- I810_BM_PUT8(I810_PCM_OUT_LVI, buf->tail);
- buf->tail++;
- buf->avail--;
-
- if (buf->tail >= I810_BD_NUMS) {
- buf->tail = 0;
- }
- }
-
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
-
- if (!buf->io_started) {
- cr &= ~(I810_BM_CR_FEIE|I810_BM_CR_LVBIE);
- cr |= I810_BM_CR_IOCE;
- buf->io_started = B_TRUE;
- }
-
- /* start PCM out engine */
- cr |= I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_fill_play_buf() */
-
-/*
- * audio810_prepare_record_buf()
- *
- * Description:
- * This routine is called by audio810_ad_start_record(). It prepares DMA
- * memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- *
- */
-static int
-audio810_prepare_record_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- i810_bd_entry_t *bdesc;
- int samples;
- uint8_t cr;
-
- buf = &statep->record_buf;
-
- if (!buf->io_started) {
- /* pause PCM in DMA engine */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_PAUSE);
-
- /* reset PCM in DMA engine */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST |I810_BM_CR_IOCE);
-
- /* set last valid index to 0 */
- I810_BM_PUT8(I810_PCM_IN_LVI, 0);
-
- /* buffer base */
- I810_BM_PUT32(I810_PCM_IN_BD_BASE, statep->bdl_phys_pin);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = 2;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->i810_csample_rate * statep->i810_cchannels /
- statep->ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->i810_csamples = samples;
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->tail & 1];
- bdesc = &(statep->bdl_virt_pin[buf->tail]);
- bdesc->buf_len = (uint16_t)samples;
- bdesc->cmd_bup = 0;
- bdesc->reserved = 0;
- bdesc->cmd_ioc = 1;
- bdesc->buf_base = chunk->addr_phy;
- I810_BM_PUT8(I810_PCM_IN_LVI, buf->tail);
- buf->tail++;
- buf->avail--;
- if (buf->tail >= I810_BD_NUMS) {
- buf->tail = 0;
- }
- }
- cr = I810_BM_GET8(I810_PCM_IN_CR);
-
- if (!buf->io_started) {
- cr &= ~(I810_BM_CR_FEIE|I810_BM_CR_LVBIE);
- cr |= I810_BM_CR_IOCE;
- buf->io_started = B_TRUE;
- }
-
- if (buf->avail < 2) {
- cr |= I810_BM_CR_RUN;
- }
-
- I810_BM_PUT8(I810_PCM_IN_CR, cr);
- cr = I810_BM_GET8(I810_PCM_IN_CR);
-
- if ((cr & (I810_BM_CR_RUN | I810_BM_CR_IOCE)) !=
- (I810_BM_CR_RUN | I810_BM_CR_IOCE)) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_prepare_record_buf() */
-
-/*
- * audio810_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_reclaim_record_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- int16_t bmciv;
- int samples;
-
- buf = &statep->record_buf;
- bmciv = I810_BM_GET8(I810_PCM_IN_CIV);
- samples = statep->i810_csamples;
-
- while ((buf->head != bmciv) && (buf->avail < 2)) {
- chunk = &buf->chunk[buf->head & 1];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- chunk->real_len, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->inst_lock);
- am_send_audio(statep->audio_handle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
- buf->avail++;
- buf->head++;
-
- if (buf->head >= I810_BD_NUMS) {
- buf->head = 0;
- }
- if ((statep->flags & I810_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-
-} /* audio810_reclaim_record_buf() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c b/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c
deleted file mode 100644
index 743a9dec05..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c
+++ /dev/null
@@ -1,3389 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * audioixp Audio Driver
- *
- * This driver supports audio hardware integrated in ATI IXP400 chipset.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The IXP400 audio core is an AC'97 controller, which has independent
- * channels for PCM in, PCM out. The AC'97 controller is a PCI bus master
- * with scatter/gather support. Each channel has a DMA engine. Currently,
- * we use only the PCM in and PCM out channels. Each DMA engine uses one
- * buffer descriptor list. And the buffer descriptor list is an array
- * of up to 32 entries, each of which describes a data buffer. You dont need
- * to use all these entries. Each entry contains a pointer to a data buffer,
- * status, length of the buffer being pointed to and the pointer to the next
- * entry. Length of the buffer is in number of bytes. Interrupt will be
- * triggered each time a entry is processed by hardware.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, audioixp_sample_buf,
- * to handle BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. Two DMA buffers are allocated for both playback
- * and record, and two BD entries are used. When processing interrupt,
- * the current hardware pointer will be check to tell which buffer is
- * being processed. It's possible for the hardware to interrupt twice
- * for one buffer, this logic is handled in the routine
- * audioixp_chunk_processed.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audioixp_chip_init().
- *
- * System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audioixp_impl.h>
-#include <sys/audio/audioixp.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audioixp_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audioixp_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audioixp_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audioixp_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audioixp_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audioixp_ad_start_play(audiohdl_t, int);
-static void audioixp_ad_pause_play(audiohdl_t, int);
-static void audioixp_ad_stop_play(audiohdl_t, int);
-static int audioixp_ad_start_record(audiohdl_t, int);
-static void audioixp_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audioixp_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static int audioixp_codec_sync(audioixp_state_t *);
-static int audioixp_write_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_read_ac97(audioixp_state_t *, int, uint16_t *);
-static int audioixp_and_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_or_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_reset_ac97(audioixp_state_t *);
-static int audioixp_init_state(audioixp_state_t *, dev_info_t *);
-static int audioixp_map_regs(dev_info_t *, audioixp_state_t *);
-static void audioixp_unmap_regs(audioixp_state_t *);
-static int audioixp_alloc_sample_buf(audioixp_state_t *, int, int);
-static void audioixp_free_sample_buf(audioixp_state_t *,
- audioixp_sample_buf_t *);
-static void audioixp_setup_bdl(audioixp_state_t *);
-static void audioixp_start_dma(audioixp_state_t *, int);
-static void audioixp_stop_dma(audioixp_state_t *, int);
-static int audioixp_chip_init(audioixp_state_t *, int);
-static void audioixp_chip_fini(audioixp_state_t *);
-static int audioixp_chunk_processed(audioixp_state_t *, int);
-static int audioixp_fill_play_buf(audioixp_state_t *);
-static int audioixp_prepare_record_buf(audioixp_state_t *);
-static void audioixp_reclaim_play_buf(audioixp_state_t *);
-static void audioixp_reclaim_record_buf(audioixp_state_t *);
-static int audioixp_set_gain(audioixp_state_t *, int, int, int);
-static int audioixp_set_port(audioixp_state_t *, int, int);
-static int audioixp_set_monitor_gain(audioixp_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audioixp_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audioixp_name = IXP_NAME;
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audioixp_modinfo = {
- IXP_IDNUM, /* module ID number */
- IXP_NAME, /* module name */
- IXP_MINPACKET, /* minimum packet size */
- IXP_MAXPACKET, /* maximum packet size */
- IXP_HIWATER, /* high water mark */
- IXP_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audioixp_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audioixp_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audioixp_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audioixp_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audioixp_str_info = {
- &audioixp_rqueue, /* read queue */
- &audioixp_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audioixp_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audioixp_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audioixp_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audioixp_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audioixp_attach, /* devo_attach */
- audioixp_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audioixp_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audioixp_modldrv = {
- &mod_driverops, /* drv_modops */
- IXP_MOD_NAME, /* drv_linkinfo */
- &audioixp_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audioixp_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audioixp_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audioixp_mixer_srs[] = {
- IXP_SAMPR8000, IXP_SAMPR48000, 0
-};
-
-static uint_t audioixp_min_compat_srs[] = {
- IXP_SAMPR48000, 0
-};
-
-static uint_t audioixp_compat_srs [] = {
- IXP_SAMPR8000, IXP_SAMPR11025, IXP_SAMPR16000,
- IXP_SAMPR22050, IXP_SAMPR24000, IXP_SAMPR32000,
- IXP_SAMPR44100, IXP_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t audioixp_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audioixp_mixer_srs
-};
-
-static am_ad_sample_rates_t audioixp_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audioixp_compat_srs
-};
-
-/* Some codec, only support 48K sample rate */
-static am_ad_sample_rates_t audioixp_min_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audioixp_min_compat_srs
-};
-
-static uint_t audioixp_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audioixp_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0000ffff, /* count_max */
- 8, /* align, BDL must be aligned on a 8-byte boundary */
- 0x3c, /* burstsize */
- 8, /* minxfer, set to the size of a BDlist entry */
- 0x0000ffff, /* maxxfer */
- 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
- 1, /* sgllen, there's no scatter-gather list */
- 8, /* granular, set to the value of minxfer */
- 0 /* flags, use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0001fffe, /* count_max */
- 2, /* align, data buffer is aligned on a 2-byte boundary */
- 0x3c, /* burstsize */
- 4, /* minxfer, set to the size of a sample data */
- 0x0001ffff, /* maxxfer */
- 0x0001ffff, /* seg */
- 1, /* sgllen, no scatter-gather */
- 4, /* granular, set to the value of minxfer */
- 0, /* flags, use virtual address */
-};
-
-static am_ad_entry_t audioixp_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audioixp_ad_set_config, /* ad_set_config() */
- audioixp_ad_set_format, /* ad_set_format() */
- audioixp_ad_start_play, /* ad_start_play() */
- audioixp_ad_pause_play, /* ad_pause_play() */
- audioixp_ad_stop_play, /* ad_stop_play() */
- audioixp_ad_start_record, /* ad_start_record() */
- audioixp_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audioixp _init()", NULL);
-
- if ((error = ddi_soft_state_init(&audioixp_statep,
- sizeof (audioixp_state_t), 1)) != 0) {
- ATRACE("audioixp ddi_soft_state_init() failed",
- audioixp_statep);
- return (error);
- }
-
- if ((error = mod_install(&audioixp_modlinkage)) != 0) {
- ddi_soft_state_fini(&audioixp_statep);
- }
-
- ATRACE("audioixp _init() audioixp_statep", audioixp_statep);
- ATRACE("audioixp _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audioixp _fini()", audioixp_statep);
-
- if ((error = mod_remove(&audioixp_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audioixp_statep);
-
- ATRACE_32("audioixp _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audioixp _info()", NULL);
-
- error = mod_info(&audioixp_modlinkage, modinfop);
-
- ATRACE_32("audioixp _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audioixp_getinfo()
- */
-static int
-audioixp_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd,
- void *arg, void **result)
-{
- audioixp_state_t *state;
- int instance;
- int error;
-
- error = DDI_FAILURE;
- ATRACE("in audioixp_getinfo()", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audioixp_statep,
- instance)) != NULL) {
- *result = state->dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void*)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- return (error);
-
-} /* audioixp_getinfo() */
-
-/*
- * audioixp_attach()
- *
- * Description:
- * Attach an instance of the audioixp driver. This routine does
- * the device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audioixp_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- int instance;
- uint16_t cmdeg;
- audioixp_state_t *statep;
- audio_sup_reg_data_t data;
-
- ATRACE("in audioixp_attach()", dip);
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audioixp_attach() audioixp_statep",
- audioixp_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
-
- /*
- * now, no suspend/resume supported. we'll do it in the future.
- */
- case DDI_RESUME:
- ATRACE("audioixp_attach() DDI_RESUME", NULL);
- audio_sup_log(NULL, CE_WARN,
- "%s%d: audioixp_attach() resume is not supported yet",
- audioixp_name, instance);
- return (DDI_FAILURE);
-
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() unknown command: 0x%x",
- audioixp_name, instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in the driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach()"
- " unsupported high level interrupt",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audioixp_statep, instance) !=
- DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() soft state allocate failed",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audioixp_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() soft state failed",
- audioixp_name, instance);
- goto error_state;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->audio_handle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() audio_sup_register() failed",
- audioixp_name, instance);
- goto error_state;
- }
-
- /* save private state */
- audio_sup_set_private(statep->audio_handle, statep);
-
- if ((audioixp_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audioixp_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't map registers");
- goto error_destroy;
- }
-
- /* set PCI command register */
- cmdeg = pci_config_get16(statep->pci_conf_handle, PCI_CONF_COMM);
- pci_config_put16(statep->pci_conf_handle, PCI_CONF_COMM,
- cmdeg | PCI_COMM_IO | PCI_COMM_MAE);
-
- if (audioixp_alloc_sample_buf(statep, IXP_DMA_PCM_OUT,
- statep->play_buf_size) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't allocate play sample "
- "buffers");
- goto error_unmap;
- }
-
- if (audioixp_alloc_sample_buf(statep, IXP_DMA_PCM_IN,
- statep->record_buf_size) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't allocate record sample "
- "buffers");
- goto error_dealloc_play;
- }
-
- audioixp_setup_bdl(statep);
-
- /* set up kernel statistics */
- if ((statep->ixp_ksp = kstat_create(IXP_NAME, instance,
- IXP_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->ixp_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, &statep->intr_iblock,
- (ddi_idevice_cookie_t *)NULL, audioixp_intr, (caddr_t)statep) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() bad interrupt specification ");
- goto error_kstat;
- }
-
- if (audioixp_chip_init(statep, IXP_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() failed to init chip");
- goto error_intr;
- }
-
- /* call the mixer attach() routine */
- if (am_attach(statep->audio_handle, cmd, &statep->ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() am_attach() failed");
- goto error_intr;
- }
-
- ddi_report_dev(dip);
-
- return (DDI_SUCCESS);
-
-error_intr:
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
-error_kstat:
- if (statep->ixp_ksp) {
- kstat_delete(statep->ixp_ksp);
- }
-
-error_dealloc:
- audioixp_free_sample_buf(statep, &statep->record_buf);
-
-error_dealloc_play:
- audioixp_free_sample_buf(statep, &statep->play_buf);
-
-error_unmap:
- audioixp_unmap_regs(statep);
-
-error_destroy:
- ATRACE("audioixp_attach() error_destroy", statep);
- mutex_destroy(&statep->inst_lock);
-
-error_audiosup:
- ATRACE("audioixp_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->audio_handle);
-
-error_state:
- ATRACE("audioixp_attach() error_state", statep);
- ddi_soft_state_free(audioixp_statep, instance);
-
- ATRACE("audioixp_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audioixp_attach() */
-
-/*
- * audioixp_detach()
- *
- * Description:
- * Detach an instance of the audioixp driver. After the Codec is
- * detached, we call am_detach() and audio_sup_register() so they may
- * do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audioixp_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audioixp_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE_32("audioixp_detach() instance", instance);
- ATRACE("audioixp_detach() audioixp_statep",
- audioixp_statep);
-
- if ((statep = ddi_get_soft_state(audioixp_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_detach() get soft state failed",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- switch (cmd) {
- case DDI_DETACH:
- break;
-
- /*
- * now, no suspend/resume supported. we'll do it in the future.
- */
- case DDI_SUSPEND:
- ATRACE("audioixp_detach() SUSPEND", statep);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "audioixp_detach() suspend is not supported yet");
- return (DDI_FAILURE);
-
- default:
- ATRACE("audioixp_detach() unknown command", cmd);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_detach() unknown command: 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- audioixp_chip_fini(statep);
-
- /* stop DMA engines */
- mutex_enter(&statep->inst_lock);
- audioixp_stop_dma(statep, AUDIO_PLAY);
- audioixp_stop_dma(statep, AUDIO_RECORD);
- mutex_exit(&statep->inst_lock);
-
- /* remove the interrupt handler */
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
- /* free DMA memory */
- audioixp_free_sample_buf(statep, &statep->play_buf);
- audioixp_free_sample_buf(statep, &statep->record_buf);
-
- /* free the kernel statistics structure */
- if (statep->ixp_ksp) {
- kstat_delete(statep->ixp_ksp);
- }
-
- /* detach audio mixer */
- (void) am_detach(statep->audio_handle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->audio_handle);
-
- mutex_destroy(&statep->inst_lock);
-
- audioixp_unmap_regs(statep);
-
- ddi_soft_state_free(audioixp_statep, instance);
-
- return (DDI_SUCCESS);
-
-} /* audioixp_detach */
-
-/*
- * audioixp_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * There's a hardware pointer which indicate memory location where
- * the hardware is processing. We check this pointer to decide whether
- * to handle the buffer and how many buffers should be handled.
- * Refer to ATI IXP400/450 Register Reference Manual, page 193,194.
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audioixp_intr(caddr_t arg)
-{
- audioixp_state_t *statep;
- uint32_t sr;
- int intr_claimed = DDI_INTR_UNCLAIMED;
-
- statep = (audioixp_state_t *)arg;
- mutex_enter(&statep->inst_lock);
-
- sr = IXP_AM_GET32(IXP_AUDIO_INT);
-
- /* PCM in interrupt */
- if (sr & IXP_AUDIO_INT_IN_DMA) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA);
-
- if (statep->flags & IXP_DMA_RECD_STARTED) {
- audioixp_reclaim_record_buf(statep);
- }
- }
-
- /* PCM out interrupt */
- if (sr & IXP_AUDIO_INT_OUT_DMA) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA);
-
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- audioixp_reclaim_play_buf(statep);
- (void) audioixp_fill_play_buf(statep);
- }
- }
-
- /* system is too busy to process the input stream, ignore it */
- if (sr & IXP_AUDIO_INT_IN_DMA_OVERFLOW) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA_OVERFLOW);
- }
-
- /* System is too busy, ignore it */
- if (sr & IXP_AUDIO_INT_OUT_DMA_UNDERFLOW) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA_UNDERFLOW);
- }
-
- if (sr & IXP_AUDIO_INT_CODEC0_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC0_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC0_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_CODEC1_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC1_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC1_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_CODEC2_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC2_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC2_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_NEW_FRAME) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_NEW_FRAME);
- statep -> ixp_codec_not_ready_bits |= IXP_AUDIO_INT_NEW_FRAME;
- }
-
- if (intr_claimed == DDI_INTR_UNCLAIMED) {
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* update the kernel interrupt statistics */
- if (statep->ixp_ksp) {
- IXP_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audioixp_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audioixp_intr() */
-
-/* *********************** Mixer Entry Point Routines ******************* */
-/*
- * audioixp_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audioixp_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audioixp_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("audioixp_ad_set_config() stream", stream);
- ATRACE_32("audioixp_ad_set_config() command", command);
- ATRACE_32("audioixp_ad_set_config() dir", dir);
- ATRACE_32("audioixp_ad_set_config() arg1", arg1);
- ATRACE_32("audioixp_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audioixp_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audioixp_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audioixp_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- (void) audioixp_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audioixp_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
-
- } else { /* not muted */
-
- /* by setting the port we unmute only active ports */
- (void) audioixp_set_port(statep,
- AUDIO_PLAY, statep->ixp_output_port);
- }
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audioixp_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("audioixp_ad_set_config() unsupported command",
- command);
- break;
- }
- mutex_exit(&statep->inst_lock);
-
- ATRACE_32("audioixp_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audioixp_ad_set_config() */
-
-/*
- * audioixp_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audioixp_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audioixp_state_t *statep;
- uint16_t val;
- uint32_t slot;
- uint32_t cmd;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- ATRACE_32("audioixp_ad_set_format() stream", stream);
- ATRACE_32("audioixp_ad_set_format() dir", dir);
- ATRACE_32("audioixp_ad_set_format() sample_rate", sample_rate);
- ATRACE_32("audioixp_ad_set_format() channels", channels);
- ATRACE_32("audioixp_ad_set_format() precision", precision);
- ATRACE_32("audioixp_ad_set_format() encoding", encoding);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->var_sr == B_FALSE) {
- /* codec doesn't support variable sample rate */
-
- if (sample_rate != IXP_SAMPR48000) {
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad sample"
- " rate %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- } else {
- switch (sample_rate) {
- case IXP_SAMPR8000: break;
- case IXP_SAMPR11025: break;
- case IXP_SAMPR16000: break;
- case IXP_SAMPR22050: break;
- case IXP_SAMPR24000: break;
- case IXP_SAMPR32000: break;
- case IXP_SAMPR44100: break;
- case IXP_SAMPR48000: break;
- default:
- ATRACE_32("audioixp_ad_set_format() bad SR",
- sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- if (dir == AUDIO_PLAY) {
-
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("audioixp_ad_set_format()"
- " bad out SR", sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad out"
- " SR %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- slot = IXP_AM_GET32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD);
- slot |= IXP_AUDIO_OUT_DMA_SLOT_3
- | IXP_AUDIO_OUT_DMA_SLOT_4;
- slot &= ~ (IXP_AUDIO_OUT_DMA_SLOT_5
- |IXP_AUDIO_OUT_DMA_SLOT_6
- |IXP_AUDIO_OUT_DMA_SLOT_7
- |IXP_AUDIO_OUT_DMA_SLOT_8
- |IXP_AUDIO_OUT_DMA_SLOT_9
- |IXP_AUDIO_OUT_DMA_SLOT_10
- |IXP_AUDIO_OUT_DMA_SLOT_11
- |IXP_AUDIO_OUT_DMA_SLOT_12);
-
- IXP_AM_PUT32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD, slot);
-
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- cmd |= IXP_AUDIO_CMD_INTER_OUT;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
-
- statep->ixp_psample_rate = sample_rate;
- statep->ixp_pchannels = channels;
- statep->ixp_pprecision = precision;
- } else {
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("audioixp_ad_set_format() bad"
- " in SR", sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad in"
- " SR %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- cmd |= IXP_AUDIO_CMD_INTER_IN;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
-
- statep->ixp_csample_rate = sample_rate;
- statep->ixp_cchannels = channels;
- statep->ixp_cprecision = precision;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
-
- ATRACE_32("audioixp_ad_set_format() returning success", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_ad_set_format() */
-
-/*
- * audioixp_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audioixp_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
-
- ATRACE_32("audioixp_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & IXP_DMA_PLAY_PAUSED) {
- statep->flags |= IXP_DMA_PLAY_STARTED;
- statep->flags &= ~IXP_DMA_PLAY_PAUSED;
- audioixp_start_dma(statep, AUDIO_PLAY);
- IXP_AM_UPDATE32(
- IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- IXP_AUDIO_CMD_EN_OUT);
- goto done;
- }
-
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- goto done;
- }
-
- audioixp_start_dma(statep, AUDIO_PLAY);
- rc = audioixp_fill_play_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= IXP_DMA_PLAY_STARTED;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
- return (rc);
-
-} /* audioixp_ad_start_play() */
-
-/*
- * audioixp_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
-
- statep = audio_sup_get_private(ahandle);
-
- ASSERT(statep);
- ATRACE("audioixp_ad_pause_play() ", ahandle);
- ATRACE_32("audioixp_ad_pause_play() stream", stream);
-
- mutex_enter(&statep->inst_lock);
-
- if ((statep->flags & IXP_DMA_PLAY_STARTED) == 0) {
- mutex_exit(&statep->inst_lock);
- return;
- }
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT, 0);
- statep->flags |= IXP_DMA_PLAY_PAUSED;
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_pause_play() */
-
-/*
- * audioixp_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- audioixp_sample_buf_t *buf;
-
- ATRACE("audioixp_ad_stop_play() ", ahandle);
- ATRACE_32("audioixp_ad_stop_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT, 0);
- audioixp_stop_dma(statep, AUDIO_PLAY);
-
- buf = &statep->play_buf;
- buf->io_started = B_FALSE;
- statep->flags &= ~(IXP_DMA_PLAY_STARTED
- | IXP_DMA_PLAY_PAUSED | IXP_DMA_PLAY_EMPTY);
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_stop_play() */
-
-/*
- * audioixp_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audioixp_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- int rc;
-
- ATRACE("audioixp_ad_start_record() ", ahandle);
- ATRACE_32("audioixp_ad_start_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & IXP_DMA_RECD_STARTED) {
- mutex_exit(&statep->inst_lock);
- return (AUDIO_SUCCESS);
- }
-
- audioixp_start_dma(statep, AUDIO_RECORD);
- rc = audioixp_prepare_record_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= IXP_DMA_RECD_STARTED;
- }
-
- mutex_exit(&statep->inst_lock);
-
- return (rc);
-
-} /* audioixp_ad_start_record() */
-
-/*
- * audioixp_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- audioixp_sample_buf_t *buf;
-
- ATRACE("audioixp_ad_stop_record() ", ahandle);
- ATRACE_32("audioixp_ad_stop_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
- statep->flags &= ~IXP_DMA_RECD_STARTED;
-
- buf = &statep->record_buf;
- buf->io_started = B_FALSE;
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN, 0);
- audioixp_stop_dma(statep, AUDIO_RECORD);
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_stop_record() */
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audioixp_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audioixp_attach() would need to be fixed as well.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audioixp_init_state(audioixp_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int cdrom;
- int mode;
-
- ATRACE("audioixp_init_state()", NULL);
-
- statep->dip = dip;
- statep->vol_bits_mask = 5;
-
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", IXP_INTS);
- if (pints > IXP_MAX_INTS) {
- ATRACE_32("audioixp_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, IXP_INTS);
- pints = IXP_INTS;
- } else if (pints < IXP_MIN_INTS) {
- ATRACE_32("audioixp_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, IXP_INTS);
- pints = IXP_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", IXP_INTS);
- if (rints > IXP_MAX_INTS) {
- ATRACE_32("audioixp_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "record interrupt rate set too high, %d, resetting to "
- "%d",
- rints, IXP_INTS);
- rints = IXP_INTS;
- } else if (rints < IXP_MIN_INTS) {
- ATRACE_32("audioixp_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "record interrupt rate set too low, %d, resetting to "
- "%d",
- rints, IXP_INTS);
- rints = IXP_INTS;
- }
-
- /* fill in the device default state */
- statep->ixp_defaults.play.sample_rate = IXP_DEFAULT_SR;
- statep->ixp_defaults.play.channels = IXP_DEFAULT_CH;
- statep->ixp_defaults.play.precision = IXP_DEFAULT_PREC;
- statep->ixp_defaults.play.encoding = IXP_DEFAULT_ENC;
- statep->ixp_defaults.play.gain = IXP_DEFAULT_PGAIN;
- statep->ixp_defaults.play.port =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.avail_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.mod_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.buffer_size = IXP_BSIZE;
- statep->ixp_defaults.play.balance = IXP_DEFAULT_BAL;
-
- statep->ixp_defaults.record.sample_rate = IXP_DEFAULT_SR;
- statep->ixp_defaults.record.channels = IXP_DEFAULT_CH;
- statep->ixp_defaults.record.precision = IXP_DEFAULT_PREC;
- statep->ixp_defaults.record.encoding = IXP_DEFAULT_ENC;
- statep->ixp_defaults.record.gain = IXP_DEFAULT_PGAIN;
- statep->ixp_defaults.record.port = AUDIO_MICROPHONE;
- statep->ixp_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->ixp_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->ixp_defaults.record.buffer_size = IXP_BSIZE;
- statep->ixp_defaults.record.balance = IXP_DEFAULT_BAL;
-
- statep->ixp_defaults.monitor_gain = IXP_DEFAULT_MONITOR_GAIN;
- statep->ixp_defaults.output_muted = B_FALSE;
- statep->ixp_defaults.ref_cnt = B_FALSE;
- statep->ixp_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->ixp_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (cdrom) {
- statep->ixp_defaults.record.avail_ports |= AUDIO_CD;
- statep->ixp_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->ixp_psample_rate =
- statep->ixp_defaults.play.sample_rate;
- statep->ixp_pchannels =
- statep->ixp_defaults.play.channels;
- statep->ixp_pprecision =
- statep->ixp_defaults.play.precision;
- statep->ixp_csample_rate =
- statep->ixp_defaults.record.sample_rate;
- statep->ixp_cchannels =
- statep->ixp_defaults.record.channels;
- statep->ixp_cprecision =
- statep->ixp_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->ad_info.ad_mode = mode;
- statep->ad_info.ad_int_vers = AM_VERSION;
- statep->ad_info.ad_add_mode = NULL;
- statep->ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->ad_info.ad_defaults = &statep->ixp_defaults;
- statep->ad_info.ad_play_comb = audioixp_combinations;
- statep->ad_info.ad_rec_comb = audioixp_combinations;
- statep->ad_info.ad_entry = &audioixp_entry;
- statep->ad_info.ad_dev_info = &statep->ixp_dev_info;
- statep->ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->ad_info.ad_play.ad_mixer_srs =
- audioixp_mixer_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audioixp_compat_sample_rates;
- statep->ad_info.ad_play.ad_conv = &am_src2;
- statep->ad_info.ad_play.ad_sr_info = NULL;
- statep->ad_info.ad_play.ad_chs = audioixp_channels;
- statep->ad_info.ad_play.ad_int_rate = pints;
- statep->ad_info.ad_play.ad_max_chs = IXP_MAX_OUT_CHANNELS;
- statep->ad_info.ad_play.ad_bsize = IXP_BSIZE;
-
- /* record capabilities */
- statep->ad_info.ad_record.ad_mixer_srs =
- audioixp_mixer_sample_rates;
- statep->ad_info.ad_record.ad_compat_srs =
- audioixp_compat_sample_rates;
- statep->ad_info.ad_record.ad_conv = &am_src2;
- statep->ad_info.ad_record.ad_sr_info = NULL;
- statep->ad_info.ad_record.ad_chs = audioixp_channels;
- statep->ad_info.ad_record.ad_int_rate = rints;
- statep->ad_info.ad_record.ad_max_chs = IXP_MAX_CHANNELS;
- statep->ad_info.ad_record.ad_bsize = IXP_BSIZE;
-
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->intr_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
- mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->intr_iblock);
-
- /* fill in device info strings */
- (void) strcpy(statep->ixp_dev_info.name, IXP_DEV_NAME);
- (void) strcpy(statep->ixp_dev_info.config, IXP_DEV_CONFIG);
- (void) strcpy(statep->ixp_dev_info.version, IXP_DEV_VERSION);
-
- statep->play_buf_size = IXP_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / pints;
- statep->play_buf_size += IXP_MOD_SIZE -
- (statep->play_buf_size % IXP_MOD_SIZE);
- statep->record_buf_size = IXP_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / rints;
- statep->record_buf_size += IXP_MOD_SIZE - 1;
- statep->record_buf_size -= statep->record_buf_size % IXP_MOD_SIZE;
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_init_state() */
-
-/*
- * audioixp_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audioixp_map_regs(dev_info_t *dip, audioixp_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
-
- ATRACE("audioixp_map_regs()", statep);
-
- statep->ixp_res_flags = 0;
-
- /* map PCI config space */
- if (pci_config_setup(statep->dip, &statep->pci_conf_handle) ==
- DDI_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() configuration "
- "memory mapping failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_PCI_REGS;
-
- /* map audio mixer register */
- if ((ddi_regs_map_setup(dip, IXP_IO_AM_REGS,
- (caddr_t *)&statep->am_regs_base, 0, 0,
- &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() audio mixer "
- "memory mapping failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_AM_REGS;
-
- /*
- * now, from here we allocate DMA memory for buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() ddi_dma_alloc_handle(bdlist)"
- " failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_HANDLE;
-
- if (ddi_dma_mem_alloc(statep->bdl_dma_handle,
- sizeof (audioixp_bd_list_t), &dev_attr, DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, NULL, (caddr_t *)&statep->bdl_virtual,
- &statep->bdl_size, &statep->bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() ddi_dma_mem_alloc(bdlist) "
- "failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->bdl_dma_handle, NULL,
- (caddr_t)statep->bdl_virtual, statep->bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() addr_bind_handle failed");
- goto error;
- }
-
- /*
- * there are some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() addr_bind_handle failed,"
- " cookies > 1");
- goto error;
- }
-
- statep->bdl_phys =
- (audioixp_bd_list_t *)(long)(cookie.dmac_address);
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_BIND;
-
- return (AUDIO_SUCCESS);
-
-error:
- audioixp_unmap_regs(statep);
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_map_regs() */
-
-/*
- * audioixp_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and then unmaps control registers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_unmap_regs(audioixp_state_t *statep)
-{
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_BIND) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_MEM) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->bdl_acc_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_HANDLE) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->bdl_dma_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_AM_REGS) {
- statep->ixp_res_flags &= ~IXP_RS_AM_REGS;
- ddi_regs_map_free(&statep->am_regs_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_PCI_REGS) {
- statep->ixp_res_flags &= ~IXP_RS_PCI_REGS;
- pci_config_teardown(&statep->pci_conf_handle);
- }
-
-} /* audioixp_unmap_regs() */
-
-/*
- * audioixp_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * IXP_DMA_PCM_IN ---PCM in DMA engine
- * IXP_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-
-static int
-audioixp_alloc_sample_buf(audioixp_state_t *statep, int which, int len)
-{
- audioixp_sample_buf_t *buf;
- audioixp_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
-
- if (which == IXP_DMA_PCM_OUT) {
- buf = &statep->play_buf;
- } else {
- ASSERT(which == IXP_DMA_PCM_IN);
- buf = &statep->record_buf;
- }
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
-
- if (ddi_dma_alloc_handle(statep->dip, &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len, &dev_attr,
- DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL,
- &chunk->data_buf, &chunk->real_len,
- &chunk->acc_handle) != DDI_SUCCESS) {
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len, DDI_DMA_WRITE,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
-
- return (AUDIO_SUCCESS);
-
-error:
- if (i != 0) {
- (void) ddi_dma_unbind_handle((buf->chunk[0].dma_handle));
- ddi_dma_mem_free(&(buf->chunk[0].acc_handle));
- ddi_dma_free_handle(&(buf->chunk[0].dma_handle));
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_alloc_sample_buf() */
-
-/*
- * audioixp_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audioixp_alloc_sample_buf().
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * audioixp_sample_buf_t *buf The sample buffer structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_free_sample_buf(audioixp_state_t *statep,
- audioixp_sample_buf_t *buf)
-{
- audioixp_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audioixp_free_sample_buf() audioixp_statep", statep);
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- chunk->acc_handle = 0;
- ddi_dma_free_handle(&chunk->dma_handle);
- }
-
-} /* audioixp_free_sample_buf() */
-
-
-/*
- * audioixp_setup_bdl()
- *
- * Description:
- * This routine setup the buf descriptor list.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-
-static void audioixp_setup_bdl(audioixp_state_t *statep)
-{
- int i;
- audioixp_bd_entry_t *bd_p;
-
- /* setup playback bdlist */
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- bd_p = &(((audioixp_bd_list_t *)(statep->bdl_virtual))
- ->pcm_out[i]);
- bd_p->buf_base = statep->play_buf.chunk[i&IXP_CHUNK_MASK]
- .addr_phy;
- bd_p->status = 0;
- bd_p->buf_len = 0;
- bd_p->next = (uintptr_t)&(((audioixp_bd_list_t *)
- (statep->bdl_phys))->pcm_out[(i+1)%IXP_BD_NUMS]);
- }
-
- /* setup record bdlist */
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- bd_p = &(((audioixp_bd_list_t *)(statep->bdl_virtual))
- ->pcm_in[i]);
- bd_p->buf_base = statep->record_buf.chunk[i&IXP_CHUNK_MASK]
- .addr_phy;
- bd_p->status = 0;
- bd_p->buf_len = 0;
- bd_p->next = (uintptr_t)&(((audioixp_bd_list_t *)
- (statep->bdl_phys))->pcm_in[(i+1)%IXP_BD_NUMS]);
- }
-} /* audioixp_setup_bdl() */
-
-/*
- * audioixp_start_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into working state.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_start_dma(audioixp_state_t *statep, int dir)
-{
-
- ASSERT(dir == AUDIO_PLAY || dir == AUDIO_RECORD);
-
- if (dir == AUDIO_PLAY) {
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_OUT);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT_DMA,
- IXP_AUDIO_CMD_EN_OUT_DMA);
- } else {
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN_DMA,
- IXP_AUDIO_CMD_EN_IN_DMA);
- }
-
-} /* audioixp_start_dma() */
-
-/*
- * audioixp_stop_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_stop_dma(audioixp_state_t *statep, int dir)
-{
-
- ASSERT(dir == AUDIO_PLAY || dir == AUDIO_RECORD);
-
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
-
- if (dir == AUDIO_PLAY) {
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT_DMA,
- 0);
- } else {
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN_DMA,
- 0);
- }
-
-} /* audioixp_stop_dma() */
-
-
-/*
- * audioixp_codec_ready ()
- *
- * Description:
- * This routine checks the state of codecs. This routine is called by
- * chip_init before interrupt is enabled. It enables interrupt first,
- * then waits a moment for interrupt handler to set the flag according
- * to the hardware configuration. Then it checks the flag to confirm
- * that primary codec is ready. The original value of interrupt enable
- * register is restored.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS codec is ready
- * AUDIO_FAILURE codec is not ready
- */
-static int
-audioixp_codec_ready(audioixp_state_t *statep)
-{
- uint32_t old_reg;
-
- old_reg = IXP_AM_GET32(IXP_AUDIO_INT_EN);
-
- IXP_AM_UPDATE32(IXP_AUDIO_INT_EN,
- IXP_AUDIO_INT_EN_CODEC0_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC1_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC2_NOT_READY,
- IXP_AUDIO_INT_EN_CODEC0_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC1_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC2_NOT_READY);
-
- drv_usecwait(1000);
- IXP_AM_PUT32(IXP_AUDIO_INT_EN, old_reg);
-
- if (statep->ixp_codec_not_ready_bits & IXP_AUDIO_INT_CODEC0_NOT_READY) {
- audio_sup_log(NULL, CE_WARN, "primary codec not ready");
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-}
-
-/*
- * audioixp_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audioixp_codec_sync(audioixp_state_t *statep)
-{
- int i;
- uint32_t cmd;
-
- for (i = 0; i < 300; i++) {
- cmd = IXP_AM_GET32(IXP_AUDIO_OUT_PHY_ADDR_DATA);
- if (!(cmd & IXP_AUDIO_OUT_PHY_EN)) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_codec_sync() */
-
-
-/*
- * audioixp_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audioixp_read_ac97(audioixp_state_t *statep, int reg, uint16_t *data)
-{
- uint32_t value;
- uint32_t result;
- int i;
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
-
- value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC
- | IXP_AUDIO_OUT_PHY_READ
- | IXP_AUDIO_OUT_PHY_EN
- | ((reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT)
- & IXP_AUDIO_OUT_PHY_ADDR_MASK);
- IXP_AM_PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
-
- for (i = 0; i < 300; i++) {
- result = IXP_AM_GET32(IXP_AUDIO_IN_PHY_ADDR_DATA);
- if (result & IXP_AUDIO_IN_PHY_READY) {
- *data = (result & IXP_AUDIO_IN_PHY_DATA_MASK)
- >> IXP_AUDIO_IN_PHY_DATA_SHIFT;
- statep->codec_shadow[IXP_CODEC_REG(reg)] = *data;
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- *data = 0xffff;
- return (AUDIO_FAILURE);
-
-} /* audioixp_read_ac97() */
-
-/*
- * audioixp_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_write_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
- uint32_t value;
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC
- | IXP_AUDIO_OUT_PHY_WRITE
- | IXP_AUDIO_OUT_PHY_EN
- | ((reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT)
- & IXP_AUDIO_OUT_PHY_ADDR_MASK)
- | ((data << IXP_AUDIO_OUT_PHY_DATA_SHIFT)
- & IXP_AUDIO_OUT_PHY_DATA_MASK);
- IXP_AM_PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
-
- (void) audioixp_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_write_ac97() */
-
-/*
- * audioixp_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_and_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- data &= statep->codec_shadow[IXP_CODEC_REG(reg)];
- if (audioixp_write_ac97(statep, reg, data) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_and_ac97() */
-
-/*
- * audioixp_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_or_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- data |= statep->codec_shadow[IXP_CODEC_REG(reg)];
- if (audioixp_write_ac97(statep, reg, data) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_or_ac97() */
-
-/*
- * audioixp_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audioixp_reset_ac97(audioixp_state_t *statep)
-{
- uint32_t cmd;
- int i;
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_POWER_DOWN, 0);
- drv_usecwait(10);
-
- /* register reset */
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_AC_SOFT_RESET,
- IXP_AUDIO_CMD_AC_SOFT_RESET);
-
- drv_usecwait(10);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_AC_SOFT_RESET,
- 0);
-
- /* cold reset */
- for (i = 0; i < 300; i++) {
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- if (cmd & IXP_AUDIO_CMD_AC_ACTIVE) {
- cmd |= IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- return (AUDIO_SUCCESS);
- }
- cmd &= ~IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- (void) IXP_AM_GET32(IXP_AUDIO_CMD);
- drv_usecwait(10);
- cmd |= IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_reset_ac97() */
-
-/*
- * audioixp_chunk_processed()
- *
- * Description:
- * This routine returns the count of chunk processed. It's called by
- * audioixp_reclaim_play_buf and audioixp_reclaim_record_buf
- * This routine compares the current hw_point value with its last value,
- * there're two cases:
- * case 1: new pointer is bigger than the last one and smaller than the
- * last one + len of the last chunk, which mean the current
- * chunk has not been finished, return 0.
- * case 2: the hw_pointer return to the old value, which means both chunks
- * have been processed,return 2
- * case 3: one chunk is processed, return 1.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- *
- * Returns:
- * count of chunk processed
- */
-static int
-audioixp_chunk_processed(audioixp_state_t *statep, int dir)
-{
- audioixp_sample_buf_t *buf;
- uint32_t hw_pointer;
- int result;
- audioixp_bd_entry_t *bd;
- int i;
- int retry_count;
-
- ASSERT(mutex_owned(&statep->inst_lock));
-
- retry_count = 0;
- while (++retry_count < 100) {
- if (dir == AUDIO_PLAY) {
- buf = &statep->play_buf;
- hw_pointer = IXP_AM_GET32(IXP_AUDIO_OUT_DMA_DT_CUR);
- } else {
- buf = &statep->record_buf;
- hw_pointer = IXP_AM_GET32(IXP_AUDIO_IN_DMA_DT_CUR);
- }
-
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- if (dir == AUDIO_PLAY)
- bd = &statep->bdl_virtual->pcm_out[i];
- else
- bd = &statep->bdl_virtual->pcm_in[i];
-
- if (hw_pointer >= bd->buf_base &&
- hw_pointer < bd->buf_base + bd->buf_len*4)
- break;
- }
-
- if (i < IXP_BD_NUMS)
- break;
- }
-
- /*
- * cannot get valid hw_pointer, return 0 without updating
- * last_hw_pointer
- */
- if (retry_count == 100) {
- cmn_err(CE_WARN, "!bad hw_pointer, hw_pointer=0x%08x",
- hw_pointer);
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- if (dir == AUDIO_PLAY)
- bd = &statep->bdl_virtual->pcm_out[i];
- else
- bd = &statep->bdl_virtual->pcm_in[i];
-
- cmn_err(CE_WARN, "!bd[%d], base=0x%08x, len=0x%x",
- i, bd->buf_base, bd->buf_len);
- }
- return (0);
- }
-
- if (buf->last_hw_pointer >= bd->buf_base && /* case 1 */
- hw_pointer > buf->last_hw_pointer &&
- hw_pointer < bd->buf_base + bd->buf_len * 4)
- result = 0;
- else if (buf->last_hw_pointer == hw_pointer) /* case 2 */
- result = 2;
- else /* case 3 */
- result = 1;
-
- buf->last_hw_pointer = hw_pointer;
-
- return (result);
-
-} /* audioixp_chunk_processed() */
-
-/*
- * audioixp_fill_play_buf()
- *
- * Description:
- * This routine is called by audioixp_ad_start_play() and the
- * interrupt handler. It fills playback samples into the DMA memory,
- * sets the BDL entries, and starts the playback DMA engine.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audioixp_fill_play_buf(audioixp_state_t *statep)
-{
- audioixp_bdlist_chunk_t *chunk;
- audioixp_sample_buf_t *buf;
- audioixp_bd_entry_t *bdesc;
- int samples;
- int rs;
-
- buf = &statep->play_buf;
-
- if (!buf->io_started) {
- /*
- * ready to start PCM out engine
- */
- IXP_AM_PUT32(
- IXP_AUDIO_OUT_DMA_LINK_P,
- (uint32_t)(uintptr_t)statep->bdl_phys->pcm_out |
- IXP_AUDIO_OUT_DMA_LINK_P_EN);
-
- buf->next = 0;
- buf->avail = 2; /* have only two buffers for playback */
- buf->last_hw_pointer = statep->bdl_virtual->pcm_out[0].buf_base;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->ixp_psample_rate * statep->ixp_pchannels /
- statep->ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->next & 1]);
- mutex_exit(&statep->inst_lock);
- rs = am_get_audio(statep->audio_handle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
-
- mutex_enter(&statep->inst_lock);
-
- if (((statep->flags & IXP_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- return (AUDIO_FAILURE);
- }
-
- if (rs <= 0) {
- if (statep->flags & IXP_DMA_PLAY_EMPTY) {
-
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->flags &= ~IXP_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->inst_lock);
- am_play_shutdown(statep->audio_handle, NULL);
- mutex_enter(&statep->inst_lock);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- 0);
-
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->flags &= ~(IXP_DMA_PLAY_PAUSED |
- IXP_DMA_PLAY_EMPTY);
-
- return (AUDIO_FAILURE);
- } else {
- /*
- * this time, we use one BD entry with empty
- * buffer next time we shut down, if no sound
- * again
- */
- statep->flags |= IXP_DMA_PLAY_EMPTY;
- }
- } else {
- /* we got at least one sample */
- statep->flags &= ~IXP_DMA_PLAY_EMPTY;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs<<1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->bdl_virtual->pcm_out[buf->next]);
- bdesc->buf_len = (uint16_t)rs>>1; /* in dword */
-
- buf->avail --;
- buf->next ++;
- buf->next %= IXP_BD_NUMS;
- }
-
- /* start PCM out engine */
- if (!buf->io_started) {
- IXP_AM_UPDATE32(
- IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- IXP_AUDIO_CMD_EN_OUT);
-
- buf->io_started = B_TRUE;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_fill_play_buf() */
-
-/*
- * audioixp_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_reclaim_play_buf(audioixp_state_t *statep)
-{
-
- audioixp_sample_buf_t *buf;
-
- buf = &statep->play_buf;
- buf->avail += audioixp_chunk_processed(statep, AUDIO_PLAY);
-
- return;
-
-} /* audioixp_reclaim_play_buf() */
-
-/*
- * audioixp_prepare_record_buf()
- *
- * Description:
- * This routine is called by audioixp_ad_start_record(). It prepares
- * DMA memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- *
- */
-static int
-audioixp_prepare_record_buf(audioixp_state_t *statep)
-{
- audioixp_sample_buf_t *buf;
- audioixp_bd_entry_t *bdesc;
- int samples;
- int i;
-
- buf = &statep->record_buf;
-
- if (!buf->io_started) {
-
- /* buffer base */
- IXP_AM_PUT32(IXP_AUDIO_IN_DMA_LINK_P,
- (uint32_t)(uintptr_t)statep->bdl_phys->pcm_in |
- IXP_AUDIO_IN_DMA_LINK_P_EN);
- buf->next = 0;
- buf->avail = 2;
- buf->last_hw_pointer = statep->bdl_virtual->pcm_in[0].buf_base;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->ixp_csample_rate * statep->ixp_cchannels /
- statep->ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->ixp_csamples = samples;
- for (i = 0; i < 2; i ++) {
- samples = statep->ixp_csamples;
- bdesc = &(statep->bdl_virtual->pcm_in[i]);
- bdesc->buf_len = (uint16_t)samples >> 1; /* in dword */
- buf->avail --;
- }
-
- if (!buf->io_started) {
- buf->io_started = B_TRUE;
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN,
- IXP_AUDIO_CMD_EN_IN);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_prepare_record_buf() */
-
-/*
- * audioixp_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_reclaim_record_buf(audioixp_state_t *statep)
-{
- audioixp_bdlist_chunk_t *chunk;
- audioixp_sample_buf_t *buf;
- int samples;
-
- buf = &statep->record_buf;
- samples = statep->ixp_csamples;
-
- buf->avail += audioixp_chunk_processed(statep, AUDIO_RECORD);
-
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->next & 1];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- samples<<1, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->inst_lock);
- am_send_audio(statep->audio_handle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
- buf->avail --;
- buf->next ++;
- buf->next %= IXP_BD_NUMS;
-
- if ((statep->flags & IXP_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-} /* audioixp_reclaim_record_buf() */
-
-/*
- * audioixp_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audioixp_set_gain(audioixp_state_t *statep, int dir, int gain,
- int channel)
-{
- uint16_t tmp;
- uint16_t channel_gain;
- int regidx;
- int max_channel_gain;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- max_channel_gain = (1<<PCMOVR_GAIN_BITS)-1;
- channel_gain = 31-gain*max_channel_gain/AUDIO_MAX_GAIN;
-
- if (dir == AUDIO_PLAY) {
- if (statep->swap_out == B_TRUE) {
- regidx = AC97_EXTENDED_LRS_VOLUME_REGISTER;
- } else {
- regidx = AC97_PCM_OUT_VOLUME_REGISTER;
- }
- (void) audioixp_read_ac97(statep, regidx, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= PCMOVR_RIGHT_GAIN_MASK;
- tmp |= (channel_gain << 8);
- } else { /* right channel */
- tmp &= PCMOVR_LEFT_GAIN_MASK;
- tmp |= channel_gain;
- }
-
- (void) audioixp_write_ac97(statep, regidx, tmp);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- (void) audioixp_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= gain & RGR_LEFT_MASK;
- } else {
- /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= gain & RGR_RIGHT_MASK;
- }
- (void) audioixp_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_set_gain() */
-
-/*
- * audioixp_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set
- * AUDIO_SPEAKER output to built-in speaker
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audioixp_set_port(audioixp_state_t *statep, int dir, int port)
-{
- uint16_t tmp;
-
- if (dir == AUDIO_PLAY) { /* output port */
- tmp = 0;
- if (port == IXP_PORT_UNMUTE) {
- port = statep->ixp_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audioixp_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- } else {
- (void) audioixp_and_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- (uint16_t)~AD1980_SURR_MUTE);
- }
- tmp |= AUDIO_LINE_OUT;
- } else {
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audioixp_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- ATRACE_32("audioixp_set_port() out port", tmp);
- statep->ixp_output_port = tmp;
- if (tmp != port) {
- ATRACE_32("audioixp_set_port() bad out port", port);
- return (AUDIO_FAILURE);
- }
-
- } else { /* input port */
- ASSERT(dir == AUDIO_RECORD);
-
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
-
- /* mute the master record input */
- (void) audioixp_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- default:
- ATRACE_32("audioixp_set_port bad in port", port);
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audioixp_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
- if ((port != AUDIO_NONE) &&
- (statep->codec_shadow[IXP_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audioixp_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->ixp_input_port = port;
- }
-
- ATRACE_32("audioixp_set_port() returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* audioixp_set_port() */
-
-/*
- * audioixp_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audioixp_set_monitor_gain(audioixp_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audioixp_set_monitor_gain()", statep);
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = AUDIO_MAX_GAIN - gain;
- tmp_short = ((tmp_short << statep->vol_bits_mask) - tmp_short)
- / AUDIO_MAX_GAIN;
- tmp_short |= (((tmp_short << statep->vol_bits_mask) -
- tmp_short) / AUDIO_MAX_GAIN) << 8;
- }
-
- switch (statep->ixp_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |=
- statep->codec_shadow[IXP_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audioixp_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audioixp_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audioixp_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("audioixp_ad_set_config() monitor gain bad device",
- NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->ixp_monitor_gain = 0;
- } else {
- statep->ixp_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE_32("audioixp_set_monitor_gain()", rc);
-
- return (rc);
-
-} /* audioixp_set_monitor_gain() */
-
-/*
- * audioixp_chip_init()
- *
- * Description:
- * This routine initializes ATI IXP audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int restore If IXP_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audioixp_chip_init(audioixp_state_t *statep, int restore)
-{
- uint16_t *shadow;
- int i;
- int j;
- uint16_t xid;
- uint16_t vid1;
- uint16_t vid2;
- uint16_t sr;
- uint16_t tmp;
-
- /*
- * put the audio controller into quiet state, everything off
- */
- audioixp_stop_dma(statep, AUDIO_PLAY);
- audioixp_stop_dma(statep, AUDIO_RECORD);
-
- /* AC97 reset */
- if (audioixp_reset_ac97(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_chip_init() AC97 codec reset failed");
- return (AUDIO_FAILURE);
- }
-
- if (audioixp_codec_ready(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_chip_init() AC97 codec not ready");
- return (AUDIO_FAILURE);
- }
-
- shadow = statep->codec_shadow;
-
- if (restore == IXP_INIT_NO_RESTORE) {
- for (i = 0; i <= IXP_LAST_AC_REG; i += 2) {
- (void) audioixp_read_ac97(statep, i,
- &(shadow[IXP_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
-
- /* 08h - set master tone control to no modification */
- shadow[IXP_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /*
- * 0ah - turn pc beep mute off, 0dB
- *
- * AC'97 Spec does define the optional PC Beep support, that is,
- * the BIOS (dependent on hardware design) can use the audio
- * hardware for the beep, especially on some laptops, in order
- * to save cost. So we have to turn the pc_beep mute off, that
- * is, enable the PC Beep support.
- */
- shadow[IXP_CODEC_REG(AC97_PC_BEEP_REGISTER)] =
- PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[IXP_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[IXP_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[IXP_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- shadow[IXP_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[IXP_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- shadow[IXP_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * The rest we ignore, most are reserved.
- */
-
- }
-
- if (restore == IXP_INIT_RESTORE) {
- /* Restore from saved values */
- shadow[IXP_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= IXP_LAST_AC_REG; i += 2)
- (void) audioixp_write_ac97(statep, i,
- shadow[IXP_CODEC_REG(i)]);
-
- (void) audioixp_read_ac97(statep, AC97_RESET_REGISTER, &tmp);
- if (tmp & RR_HEADPHONE_SUPPORT) {
- statep->ixp_defaults.play.port |= AUDIO_HEADPHONE;
- statep->ixp_defaults.play.avail_ports |= AUDIO_HEADPHONE;
- statep->ixp_defaults.play.mod_ports |= AUDIO_HEADPHONE;
- }
-
- /*
- * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
- * line-out jack. So far we haven't found which vendors don't
- * do that. So we assume that all vendors swap the surr-out
- * and the line-out outputs. So we need swap the two outputs.
- * But we still internally process the "ad198x-swap-output"
- * property. If someday some vendors do not swap the outputs,
- * we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audioixp.conf file, and unload and reload the
- * audioixp driver (or reboot).
- */
- (void) audioixp_read_ac97(statep, AC97_VENDOR_ID1_REGISTER, &vid1);
- (void) audioixp_read_ac97(statep, AC97_VENDOR_ID2_REGISTER, &vid2);
- if (vid1 == AD1980_VID1 &&
- (vid2 == AD1980_VID2 || vid2 == AD1985_VID2)) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
- statep->swap_out = B_TRUE;
- (void) audioixp_read_ac97(statep, CODEC_AD_REG_MISC,
- &tmp);
- (void) audioixp_write_ac97(statep,
- CODEC_AD_REG_MISC,
- tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
- }
- }
-
- /*
- * check if the codec implements 6 bit volume register,
- * but the ALC202 does not strictly obey the AC'97 Spec
- * and it only supports 5 bit volume register, so we
- * skip the check for it as a workaround.
- */
- if (!(vid1 == ALC202_VID1 && vid2 == ALC202_VID2)) {
- (void) audioixp_write_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE |
- MVR_RIGHT_OPTIONAL_MASK | MVR_LEFT_OPTIONAL_MASK);
-
- (void) audioixp_read_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, &tmp);
-
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->vol_bits_mask = 6;
- }
- }
-
- /* resume the master volume to the max */
- (void) audioixp_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip does not support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audioixp_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER,
- &xid);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!%s%d: xid=0x%04x, vid1=0x%04x, vid2=0x%04x",
- audioixp_name, ddi_get_instance(statep->dip), xid, vid1, vid2);
- if (!(xid & EAR_VRA)) {
- statep->var_sr = B_FALSE;
- statep->ad_info.ad_record.ad_compat_srs =
- audioixp_min_compat_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audioixp_min_compat_sample_rates;
- statep->ixp_defaults.play.sample_rate =
- IXP_SAMPR48000;
- statep->ixp_defaults.record.sample_rate =
- IXP_SAMPR48000;
- } else { /* variable sample rate supported */
- statep->var_sr = B_TRUE;
-
- /* set variable rate mode */
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
-
- /* check the sample rates supported */
- for (i = 0, j = 0; audioixp_compat_srs[i] != 0; i++) {
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER,
- audioixp_compat_srs[i]);
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &sr);
-
- if (sr == audioixp_compat_srs[i]) {
- if (i != j) {
- audioixp_compat_srs[j] =
- audioixp_compat_srs[i];
- }
- j++;
- }
- }
-
- if (j < 1) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No standard sample rate is supported");
- return (AUDIO_FAILURE);
- }
- audioixp_compat_srs[j] = 0;
-
- /*
- * if the configuration doesn't support 8K sample rate,
- * we modify the default value to the first.
- */
- for (i = 0; audioixp_compat_srs[i] != 0; i++) {
- if (audioixp_compat_srs[i] == IXP_SAMPR8000) {
- break;
- }
- }
- if (audioixp_compat_srs[i] != IXP_SAMPR8000) {
- statep->ixp_defaults.play.sample_rate =
- audioixp_compat_srs[0];
- statep->ixp_defaults.record.sample_rate =
- audioixp_compat_srs[0];
- }
- }
-
- /* enable interrupts */
- IXP_AM_PUT32(IXP_AUDIO_INT, 0xffffffff);
- IXP_AM_PUT32(
- IXP_AUDIO_INT_EN,
- IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW |
- IXP_AUDIO_INT_EN_STATUS |
- IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW);
- return (AUDIO_SUCCESS);
-
-} /* audioixp_chip_init() */
-
-/*
- * audioixp_chip_fini()
- *
- * Description:
- * This routine disables hardware interrupts.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void audioixp_chip_fini(audioixp_state_t *statep)
-{
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AM_GET32(IXP_AUDIO_INT));
- IXP_AM_PUT32(IXP_AUDIO_INT_EN, 0);
-} /* audioixp_chip_fini() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c b/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c
deleted file mode 100644
index d1a69da820..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c
+++ /dev/null
@@ -1,4264 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audiots Audio Driver
- *
- * This Audio Driver controls the T2 audio core in the ALI M1553
- * southbridge chip. This chip supports multiple play streams, but just
- * a single record stream. It also supports wave table synthesis and
- * hardware MIDI and joystick ports. Unfortunately the MIDI ports are
- * not available because their pins have been re-assigned to expose
- * interrupts. We also aren't going to do anything with the joystick
- * ports. The audio core controls an AC-97 V2.1 Codec.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Although the play side of the
- * audio core supports multiple streams we don't use that feature.
- * The mixer needs to be fixed up first. Thus we let the mixer do it's
- * thing for both directions.
- *
- * The DMA engine uses a single buffer which is large enough to hold
- * two interrupts worth of data. When it gets to the mid point an
- * interrupt is generated and data is either sent (for record) or
- * requested and put in that half of the buffer (for play). When the
- * second half is played we do the same, but the audio core loops the
- * pointer back to the beginning. For play we bzero() the half buffer
- * before we ask for more audio. That way if there isn't enough waiting
- * for us we just play silence. If more arrives later we'll keep going,
- * but after a slight pop.
- *
- * The audio core has a bug in silicon that doesn't let it read the AC-97
- * Codec's register. T2 has provided an algorithm that attempts to read the
- * the Codec several times. This is probably heuristic and thus isn't
- * absolutely guaranteed to work. However we do have to place a limit on
- * the looping, otherwise when we read a valid 0x00 we would never exit
- * the loop. Unfortunately there is also a problem with writing the AC-97
- * Codec's registers as well. Thus we read it back to verify the write.
- *
- * Every time we program the AC-97 Codec we save the value in ts_shadow[].
- * Thus every time we need to get a Codec register we don't have to do
- * a very long read. This also means that register state information is
- * saved for power management shutdown (CPR). When the Codec is started
- * back up we use this saved state to restore the Codec's state in
- * audiots_chip_init().
- *
- * We don't save any of the audio controller registers during normal
- * operation. When we need to save register state we only have to save
- * the aram and eram. The rest of the controller state is never modified
- * from the initial programming. Thus restoring the controller state
- * can be done from audiots_chip_init() as well.
- *
- *
- * WARNING: The SME birdsnest platform uses a PCI bridge chip between the
- * CPU and the southbridge containing the audio core. There is
- * a bug in silicon that causes a bogus parity error. With the mixer
- * reimplementation project, Bug 4374774, the audio driver is always
- * set to the best precision and number of channels. Thus when turning
- * the mixer on and off the only thing that changes is the sample rate.
- * This change in programming doesn't trigger the silicon error.
- * Thus the supported channels must always be 2 and the precision
- * must always be 16-bits. This will keep any future change in the
- * mixer from exposing this bug.
- *
- * Due to a hardware bug, system power management is not supported by this
- * driver.
- *
- * CAUTION: If audio controller state is changed outside of aram
- * and eram then that information must be saved and restored
- * during power management shutdown and bringup.
- *
- * NOTE: The AC-97 Codec's reset pin is set to PCI reset, so we
- * can't power down the Codec all the way.
- *
- * NOTE: This driver depends on the misc/audiosup and misc/mixer
- * modules being loaded first.
- *
- * NOTE: Don't OR the ap_stop register to stop a play or record. This
- * will just stop all active channels because a read of ap_stop
- * returns ap_start. Just set the ap_stop register with the
- * channels you want to stop. The same goes for ap_start.
- *
- * NOTE: There is a hardware problem with P2 rev motherboards. After
- * prolonged use, reading the AC97 register will always return
- * busy. The AC97 register is now useless. Consequently, we are no
- * longer able to program the Codec. This work around disables
- * audio when this state is detected. It's not great, but its
- * better than having audio blasting out at 100% all the time.
- *
- * NOTE: Power Management testing has also exposed this AC97 timeout
- * problem. Management has decided this is too risky for customers
- * and hence they want power management support removed from the
- * audio subsystem. All PM support is now removed.
- */
-
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/audiots.h>
-#include <sys/audio/impl/audiots_impl.h>
-#include <sys/audio/ac97.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audiots_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-static int audiots_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audiots_detach(dev_info_t *, ddi_detach_cmd_t);
-static int audiots_power(dev_info_t *, int, int);
-
-/*
- * Entry point routine prototypes
- */
-static int audiots_ad_setup(audiohdl_t, int, int);
-static void audiots_ad_pause_play(audiohdl_t, int);
-static int audiots_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audiots_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audiots_ad_start_play(audiohdl_t, int);
-static void audiots_ad_stop_play(audiohdl_t, int);
-static int audiots_ad_start_record(audiohdl_t, int);
-static void audiots_ad_stop_record(audiohdl_t, int);
-
-/*
- * Local Routine Prototypes
- */
-static void audiots_and_ac97(audiots_state_t *, int, uint16_t);
-static void audiots_chip_init(audiots_state_t *, int);
-static uint16_t audiots_get_ac97(audiots_state_t *, int);
-static int audiots_init_state(audiots_state_t *, dev_info_t *);
-static uint_t audiots_intr(caddr_t);
-static int audiots_map_regs(dev_info_t *, audiots_state_t *);
-static void audiots_or_ac97(audiots_state_t *, int, uint16_t);
-static void audiots_power_down(audiots_state_t *);
-static void audiots_power_up(audiots_state_t *);
-static uint16_t audiots_read_ac97(audiots_state_t *, int);
-static void audiots_save_controller(audiots_state_t *);
-static void audiots_set_ac97(audiots_state_t *, int, const uint16_t);
-static int audiots_set_busy(audiots_state_t *);
-static int audiots_set_gain(audiots_state_t *, int, int, int, int);
-static void audiots_set_idle(audiots_state_t *);
-static int audiots_set_monitor_gain(audiots_state_t *, int);
-static int audiots_set_port(audiots_state_t *, int, int);
-static int audiots_start_play(audiots_state_t *);
-static void audiots_stop_play(audiots_state_t *);
-static int audiots_start_record(audiots_state_t *);
-static void audiots_stop_record(audiots_state_t *);
-static void audiots_stop_everything(audiots_state_t *);
-static void audiots_unmap_regs(audiots_state_t *);
-
-/*
- * Global variables, but viewable only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audiots_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audiots_name = TS_NAME;
-
-static uint_t audiots_mixer_srs[] = {
- TS_SAMPR5510, TS_SAMPR48000, 0
-};
-
-static uint_t audiots_compat_srs[] = {
- TS_SAMPR5510, TS_SAMPR6620, TS_SAMPR8000,
- TS_SAMPR9600, TS_SAMPR11025, TS_SAMPR16000,
- TS_SAMPR18900, TS_SAMPR22050, TS_SAMPR27420,
- TS_SAMPR32000, TS_SAMPR33075, TS_SAMPR37800,
- TS_SAMPR44100, TS_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t audiots_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audiots_mixer_srs
-};
-
-static am_ad_sample_rates_t audiots_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audiots_compat_srs
-};
-
-static uint_t audiots_channels[] = {
- AUDIO_CHANNELS_STEREO, 0
-};
-
-static am_ad_cap_comb_t audiots_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-static am_ad_entry_t audiots_entry = {
- audiots_ad_setup, /* ad_setup() */
- NULL, /* ad_teardown() */
- audiots_ad_set_config, /* ad_set_config() */
- audiots_ad_set_format, /* ad_set_format() */
- audiots_ad_start_play, /* ad_start_play() */
- audiots_ad_pause_play, /* ad_pause_play() */
- audiots_ad_stop_play, /* ad_stop_play() */
- audiots_ad_start_record, /* ad_start_record() */
- audiots_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info audiots_modinfo = {
- TS_IDNUM, /* module ID number */
- TS_NAME, /* module name */
- TS_MINPACKET, /* minimum packet size */
- TS_MAXPACKET, /* maximum packet size */
- TS_HIWATER, /* high water mark */
- TS_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audiots_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audiots_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audiots_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audiots_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audiots_str_info = {
- &audiots_rqueue, /* read queue */
- &audiots_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audiots_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audiots_str_info, /* cb_str */
- D_NEW|D_MP|D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
-
-/* Device operations structure */
-static struct dev_ops audiots_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audiots_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audiots_attach, /* devo_attach */
- audiots_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audiots_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- audiots_power, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audiots_modldrv = {
- &mod_driverops, /* drv_modops */
- TS_MOD_NAME, /* drv_linkinfo */
- &audiots_dev_ops /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audiots_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audiots_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-
-/*
- * NOTE: Grover OBP v4.0.166 and rev G of the ALI Southbridge chip force the
- * audiots driver to use the upper 2 GB DMA address range. However to maintain
- * backwards compatibility with older systems/OBP, we're going to try the full
- * 4 GB DMA range.
- *
- * Eventually, this will be set back to using the proper high 2 GB DMA range.
- */
-
-/* Device attribute structure - full 4 gig address range */
-static ddi_dma_attr_t audiots_attr = {
- DMA_ATTR_VERSION, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000003fffLL, /* DMA counter register - 16 bits */
- 0x0000000000000008LL, /* DMA address alignment, 64-bit */
- 0x0000007f, /* 1 through 64 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x0000000000003fffLL, /* maximum transfer size, 16k */
- 0x000000000000ffffLL, /* segment boundary, 64k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t ts_acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-
-/* ******* Loadable Module Configuration Entry Points ********************* */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audiots _init()", NULL);
-
- /* initialize the soft state */
- if ((error = ddi_soft_state_init(&audiots_statep,
- sizeof (audiots_state_t), 1)) != 0) {
- ATRACE("audiots ddi_soft_state_init() failed", audiots_statep);
- return (error);
- }
-
- if ((error = mod_install(&audiots_modlinkage)) != 0) {
- ddi_soft_state_fini(&audiots_statep);
- }
-
- ATRACE("audiots _init() audiots_statep", audiots_statep);
-
- ATRACE_32("audiots _init() returning", error);
-
- return (error);
-}
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiots _fini()", audiots_statep);
-
- if ((error = mod_remove(&audiots_modlinkage)) != 0) {
- return (error);
- }
-
- /* free the soft state internal structures */
- ddi_soft_state_fini(&audiots_statep);
-
- ATRACE_32("audiots _fini() returning", error);
-
- return (0);
-}
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns infomation about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audiots _info()", NULL);
-
- error = mod_info(&audiots_modlinkage, modinfop);
-
- ATRACE_32("audiots _info() returning", error);
-
- return (error);
-}
-
-
-/* ******* Driver Entry Points ******************************************** */
-
-/*
- * audiots_getinfo()
- */
-/*ARGSUSED*/
-static int
-audiots_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- audiots_state_t *state;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audiots_statep,
- instance)) != NULL) {
- *result = state->ts_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result =
- (void *)(uintptr_t)audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
-
-/*
- * audiots_attach()
- *
- * Description:
- * Attach an instance of the audiots driver. This routine does the
- * device dependent attach tasks. When it is complete it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * NOTE: audiots_attach() assumes the Codec is powered down.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audiots_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audiots_state_t *state;
- audio_sup_reg_data_t data;
- char *pm_comp[] = {
- "NAME=audiots audio device",
- "0=off",
- "1=on"
- };
- int instance;
-
- ATRACE("in ts_attach()", dip);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_attach() instance", instance);
- ATRACE("ts_attach() audiots_statep", audiots_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("ts_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == state->ts_dip);
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* suspend/resume resets the chip, so we have no more faults */
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_RESTORED,
- DDI_DEVICE_FAULT,
- "check port, gain, balance, and mute settings");
- /* and clear the fault state flags */
- state->ts_flags &=
- ~(TS_AUDIO_READ_FAILED|TS_READ_FAILURE_PRINTED);
- }
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /*
- * power up the Codec, see comment
- * in audiots_set_busy()
- */
- ASSERT(state->ts_powered == TS_PWR_OFF);
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT,
- TS_PWR_ON) == DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->ts_dip,
- TS_COMPONENT);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() DDI_RESUME failed");
- return (DDI_FAILURE);
- }
- }
- mutex_enter(&state->ts_lock);
-
- state->ts_powered = TS_PWR_ON;
-
- ASSERT(state->ts_suspended == TS_SUSPENDED);
- state->ts_suspended = TS_NOT_SUSPENDED;
-
- /* Restore the audiots chip's state */
- audiots_chip_init(state, TS_INIT_RESTORE);
-
- /*
- * Put the address engine interrupt enable register in a known
- * state - everything off.
- */
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- mutex_exit(&state->ts_lock);
-
- /*
- * Start playing and recording, if not needed they'll stop
- * on their own. But, we don't start them if the hardware has
- * failed.
- */
- if (audio_sup_restore_state(state->ts_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() audio restart failed");
- }
-
- cv_broadcast(&state->ts_cv); /* let entry points continue */
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /* we're no longer busy */
- ASSERT(state->ts_powered == TS_PWR_ON);
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
-
- ATRACE("ts_attach() DDI_RESUME done", NULL);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x", audiots_name,
- instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* before we do anything make sure that we haven't had a h/w failure */
- if (ddi_get_devstate(dip) == DDI_DEVSTATE_DOWN) {
- audio_sup_log(NULL, CE_WARN, "%s%d: The audio hardware has "
- "been disabled.", audiots_name, instance);
- audio_sup_log(NULL, CE_CONT, "Please reboot to restore audio.");
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in this driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unsupported high level interrupt",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the state structure */
- if (ddi_soft_state_zalloc(audiots_statep, instance) == DDI_FAILURE) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- /*
- * WARNING: From here on all errors require that we free memory,
- * including the state structure.
- */
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() get soft state failed",
- audiots_name, instance);
- goto error_mem;
- }
-
- /* call audiosup module registration routine */
- ATRACE("ts_attach() calling audio_sup_register()", NULL);
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((state->ts_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failed",
- audiots_name, instance);
- goto error_mem;
- }
-
- /* initialize the audio state structures */
- if (audiots_init_state(state, dip) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audiots_map_regs(dip, state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_destroy;
- }
-
- if (state->ts_rev_id == AC_REV_ID2) {
- /* set up the pm-components */
- if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
- "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!init_state() couldn't create component");
- return (DDI_FAILURE);
- }
-
- /* Mark PM supported */
- state->ts_flags |= TS_PM_SUPPORTED;
-
- /* Mark as powering up at attach time */
- state->ts_flags |= TS_ATTACH_PWR;
-
- /* make sure the power framework knows the we are powered up */
- ASSERT(state->ts_powered == TS_PWR_OFF);
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT, TS_PWR_ON) ==
- DDI_FAILURE) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- ATRACE("ts_attach() pm_raise_power() failed", NULL);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() power up failed");
- goto error_destroy;
- }
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- /* Clear the attach time powering flag */
- state->ts_flags &= ~TS_ATTACH_PWR;
- } else {
- /* Mark on for CPR */
- state->ts_powered = TS_PWR_ON;
- }
-
- /* initialize the audio controller and the AC-97 Codec */
- audiots_chip_init(state, TS_INIT_NO_RESTORE);
-
- /*
- * Put the address engine interrupt enable register in a known
- * state - everything off.
- */
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- /* save private state */
- audio_sup_set_private(state->ts_ahandle, state);
-
- /* call the mixer attach() routine */
- ATRACE("ts_attach() calling am_attach()", &state->ts_ad_info);
- if (am_attach(state->ts_ahandle, cmd, &state->ts_ad_info) ==
- AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() am_attach() failed");
- goto error_unmap;
- }
-
- /* set up kernel statistics */
- if ((state->ts_ksp = kstat_create(TS_NAME, instance, TS_NAME,
- "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(state->ts_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)NULL,
- (ddi_idevice_cookie_t *)NULL, audiots_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- ATRACE("ts_attach() bad interrupt spec", state);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() bad interrupt specification");
- goto error_kstat;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- /*
- * CAUTION: Make sure there's an audio_sup_log() call before jumping
- * here
- */
-
-error_kstat:
- ATRACE("ts_attach() error_kstat", state);
- if (state->ts_ksp) {
- kstat_delete(state->ts_ksp);
- }
-
- (void) am_detach(state->ts_ahandle, DDI_DETACH);
-
-error_unmap:
- ATRACE("ts_attach() error_unmap", state);
- audiots_unmap_regs(state);
-
-error_destroy:
- ATRACE("ts_attach() error_destroy", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- kmem_free(state->ts_tcbuf, state->ts_cbuf_size);
-
- /* destroy the state mutexes and cvs */
- mutex_destroy(&state->ts_lock);
- cv_destroy(&state->ts_cv);
-
-error_audiosup:
- ATRACE("ts_attach() error_audiosup", state);
- (void) audio_sup_unregister(state->ts_ahandle);
-
-error_mem:
- ATRACE("ts_attach() error_mem", state);
- ddi_soft_state_free(audiots_statep, instance);
-
- ATRACE("ts_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audiots_attach() */
-
-/*
- * audiots_detach()
- *
- * Description:
- * Detach an instance of the audiots driver. After the Codec is detached
- * we call am_detach() and audio_sup_unregister() so they may do their
- * work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audiots_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audiots_state_t *state;
- int instance;
-
- ATRACE_32("in ts_detach()", cmd);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_detach() instance", instance);
- ATRACE("ts_detach() audiots_statep", audiots_statep);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("ts_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&state->ts_lock);
-
- ASSERT(state->ts_suspended == TS_NOT_SUSPENDED);
-
- state->ts_suspended = TS_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (state->ts_busy_cnt != 0) {
- cv_wait(&state->ts_cv, &state->ts_lock);
- }
-
- /* we may already be powered down, so only save state if up */
- if (state->ts_powered == TS_PWR_ON) {
-
- /* stop playing and recording */
- (void) audiots_stop_everything(state);
-
- /*
- * Save the controller state. The Codec's state is
- * already in ts_shadow[]. audiots_power_down()
- * saves the state and gets us ready to be powered
- * back up when we resume.
- */
- if (state->ts_flags & TS_PM_SUPPORTED) {
- audiots_power_down(state);
- } else {
- audiots_save_controller(state);
- }
- }
-
- if (audio_sup_save_state(state->ts_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!detach() audio save failed");
- }
-
- mutex_exit(&state->ts_lock);
-
- ATRACE("ts_detach() SUSPEND successful", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE_32("ts_detach() unknown command failure", cmd);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!detach() unknown command: 0x%x", cmd);
- ASSERT(!mutex_owned(&state->ts_lock));
- return (DDI_FAILURE);
- }
-
- /* Make sure play and record are stopped and disable all interrupts */
- ATRACE("ts_detach() stopping all DMA engines before detaching", 0);
- mutex_enter(&state->ts_lock);
- audiots_stop_everything(state);
- mutex_exit(&state->ts_lock);
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /*
- * power down the device, no reason to waste power
- * without a driver
- */
- (void) pm_lower_power(state->ts_dip, TS_COMPONENT, TS_PWR_OFF);
- }
-
- /* remove the interrupt handler */
- ATRACE("ts_detach() removing interrupt handler", state);
- ddi_remove_intr(dip, 0, NULL);
-
- /* free the kernel statistics structure */
- if (state->ts_ksp) {
- kstat_delete(state->ts_ksp);
- }
-
- /*
- * Call the mixer detach routine to tear down the mixer before
- * we lose the hardware.
- */
- ATRACE("ts_detach() calling am_detach()", dip);
- (void) am_detach(state->ts_ahandle, cmd);
-
- /*
- * Now call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- ATRACE("ts_detach() calling audio_sup_unregister()", dip);
- (void) audio_sup_unregister(state->ts_ahandle);
-
- /* unmap the registers */
- audiots_unmap_regs(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* free temporary capture buffer */
- kmem_free(state->ts_tcbuf, state->ts_cbuf_size);
-
- /* destroy the state mutexes and cvs */
- mutex_destroy(&state->ts_lock);
- cv_destroy(&state->ts_cv);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(audiots_statep, instance);
-
- ATRACE("ts_detach() returning success", audiots_statep);
-
- return (DDI_SUCCESS);
-
-} /* audiots_detach() */
-
-
-/*
- * audiots_power()
- *
- * Description:
- * This routine is used to turn the power to the Codec and audio core
- * on and off. The Codec's registers are always saved, however, when
- * we power down we have to save the audio core's state. When powering
- * on we restore both Codec and core state via audiots_chip_init().
- *
- * This routine doesn't worry about starting or stopping audio, other
- * routines have that responsibility.
- *
- * Arguments:
- * def_info_t *dip Ptr to the device's dev_info structure
- * int component Which component to power up/down
- * int level The power level for the component
- *
- * Returns:
- * DDI_SUCCESS Power level changed
- * DDI_FAILURE Power level didn't change
- */
-/*ARGSUSED*/
-static int
-audiots_power(dev_info_t *dip, int component, int level)
-{
- audiots_state_t *state;
- int instance;
- int rc = DDI_FAILURE;
-
- ATRACE("in ts_power()", dip);
- ATRACE("ts_power() audiots_statep", audiots_statep);
- ATRACE_32("ts_power() component", component);
- ATRACE_32("ts_power() level", level);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_power() instance", instance);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: power() get soft state failed", audiots_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->ts_lock));
- ASSERT(component == 0);
-
- mutex_enter(&state->ts_lock);
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* check the level change to see what we need to do */
- if (level == TS_PWR_OFF && state->ts_powered == TS_PWR_ON) {
- ATRACE("ts_power() powering down", NULL);
-
- /* don't power off if we're busy */
- if (ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_start) ||
- state->ts_busy_cnt) {
- /* device is busy, so don't power off */
- mutex_exit(&state->ts_lock);
-
- /* reset the timer */
- (void) pm_idle_component(dip, TS_COMPONENT);
-
- ATRACE("ts_power() power off failed, busy",
- state->ts_busy_cnt);
- ASSERT(rc == DDI_FAILURE);
-
- goto done;
- }
-
- /* power down and save the state */
- audiots_power_down(state);
-
- ATRACE("ts_power() power down complete", NULL);
- } else if (level == TS_PWR_ON && state->ts_powered == TS_PWR_OFF) {
- ATRACE("ts_power() powering up", NULL);
-
- audiots_power_up(state);
-
- ATRACE("ts_power() power up complete", NULL);
-#ifdef DEBUG
- } else {
- ATRACE_32("ts_power() no change to make", level);
-#endif
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = DDI_SUCCESS;
-
-done:
-
- ATRACE("ts_power() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_power() */
-
-/* ******* DDAudio Entry Point Routines ************************************ */
-
-/*
- * audiots_ad_setup()
- *
- * Description:
- * This routine checks whether the audio hardware has failed. If so, it
- * returns AUDIO_FAILURE and opens are blocked. Otherwise, it lets
- * everything proceed as normal.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int dir Direction of audio, we don't care here
- *
- * Returns:
- * AUDIO_SUCCESS The audio hardware is working
- * AUDIO_FAILURE The audio hardware has failed
- */
-/*ARGSUSED*/
-static int
-audiots_ad_setup(audiohdl_t ahandle, int stream, int dir)
-{
- audiots_state_t *state;
- int rc = AUDIO_SUCCESS;
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- ATRACE_32("in audiots_ad_setup(), instance", state->ts_instance);
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- ATRACE_32("ts_ad_setup() h/w has failed", state->ts_flags);
- rc = AUDIO_FAILURE;
- }
- mutex_exit(&state->ts_lock);
-
- ATRACE_32("ts_ad_setup() returning", rc);
-
- return (rc);
-
-} /* audiots_ad_setup() */
-
-/*
- * audiots_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("in ts_ad_pause_play()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!pause_play() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
-
- handle = state->ts_handle;
-
- /* we don't do anything if we aren't already running */
- if (!(ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_OUTPUT_CHANNEL)) {
- ATRACE("ts_pause_play() DMA engine already stopped", state);
- goto done;
- }
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
- state->ts_flags |= TS_DMA_ENGINE_PAUSED;
-
-done:
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE("ts_ad_pause_play() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_pause_play() */
-
-/*
- * audiots_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set, or the
- * parameter couldn't be set
- */
-/*ARGSUSED*/
-static int
-audiots_ad_set_config(audiohdl_t ahandle, int stream, int command, int dir,
- int arg1, int arg2)
-{
- audiots_state_t *state;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("ts_ad_set_config() stream", stream);
- ATRACE_32("ts_ad_set_config() command", command);
- ATRACE_32("ts_ad_set_config() dir", dir);
- ATRACE_32("ts_ad_set_config() arg1", arg1);
- ATRACE_32("ts_ad_set_config() arg2", arg2);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_config() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_config() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audiots_set_gain(state, stream, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audiots_set_port(state, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audiots_set_monitor_gain(state, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
-
- if (arg1) { /* mute */
- mutex_enter(&state->ts_lock);
- audiots_or_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
- audiots_or_ac97(state, AC97_HEADPHONE_VOLUME_REGISTER,
- HPVR_MUTE);
- audiots_or_ac97(state, AC97_MONO_MASTER_VOLUME_REGSITER,
- MMVR_MUTE);
- mutex_exit(&state->ts_lock);
- } else { /* not muted */
- /* by setting the port we unmute only active ports */
- (void) audiots_set_port(state, AUDIO_PLAY,
- TS_PORT_UNMUTE);
- }
-
- rc = AUDIO_SUCCESS;
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- mutex_enter(&state->ts_lock);
-
- if (arg1) { /* enable */
- audiots_or_ac97(state, AC97_MIC_VOLUME_REGISTER,
- MICVR_20dB_BOOST);
- state->ts_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- audiots_and_ac97(state, AC97_MIC_VOLUME_REGISTER,
- ~MICVR_20dB_BOOST);
- state->ts_ad_info.ad_add_mode &= ~AM_ADD_MODE_MIC_BOOST;
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = AUDIO_SUCCESS;
- break;
-
- case AM_SET_DIAG_MODE:
- /*
- * Set the loopback diagnostics mode.
- *
- * arg1 --> 1 == diagnostics on, 0 == diagnostics off
- * arg2 --> not used
- */
- mutex_enter(&state->ts_lock);
-
- if (arg1) {
- state->ts_ad_info.ad_add_mode |= AM_ADD_MODE_DIAG_MODE;
- } else {
- state->ts_ad_info.ad_add_mode &= ~AM_ADD_MODE_DIAG_MODE;
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- */
- ATRACE_32("ts_ad_set_config() unsupported command", command);
- break;
- }
-
-done:
- ATRACE_32("ts_ad_set_config() done", rc);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_set_config() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_set_config() */
-
-/*
- * audiots_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 8 and 16 bit signed linear.
- *
- * NOTE: We don't support mono or 8-bit. See the WARNING at the
- * top of the file.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 8 or 16
- * int encoding Encoding method, u-law, A-law and linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-/*ARGSUSED*/
-static int
-audiots_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audiots_state_t *state;
- ddi_acc_handle_t handle;
- int ch;
- int rc = AUDIO_FAILURE;
- uint16_t sign;
- uint16_t tmp_short;
-
- ATRACE_32("ts_ad_set_format() stream", stream);
- ATRACE_32("ts_ad_set_format() dir", dir);
- ATRACE_32("ts_ad_set_format() sample rate", sample_rate);
- ATRACE_32("ts_ad_set_format() channels", channels);
- ATRACE_32("ts_ad_set_format() precision", precision);
- ATRACE_32("ts_ad_set_format() encoding", encoding);
-
- /*
- * first, check the encoding method
- */
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE_32("ts_ad_set_format() bad encoding", encoding);
- return (AUDIO_FAILURE);
- }
-
- /*
- * get the state structure
- */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_format() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_format() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- switch (sample_rate) {
- case TS_SAMPR5510: break;
- case TS_SAMPR6620: break;
- case TS_SAMPR8000: break;
- case TS_SAMPR9600: break;
- case TS_SAMPR11025: break;
- case TS_SAMPR16000: break;
- case TS_SAMPR18900: break;
- case TS_SAMPR22050: break;
- case TS_SAMPR27420: break;
- case TS_SAMPR32000: break;
- case TS_SAMPR33075: break;
- case TS_SAMPR37800: break;
- case TS_SAMPR44100: break;
- case TS_SAMPR48000: break;
- default:
- ATRACE_32("ts_ad_set_format() bad SR", sample_rate);
- goto done;
- }
-
- /* can't fail, so update the saved format and implement */
- mutex_enter(&state->ts_lock);
- if (dir == AUDIO_PLAY) {
- /* save for later use */
- state->ts_psample_rate = sample_rate;
- state->ts_pchannels = channels;
- state->ts_pprecision = precision;
-
- /*
- * first find the h/w channel with the stream
- */
- ch = TS_OUTPUT_STREAM;
-
- /*
- * convert the sample rate into 4.12 format
- */
- sample_rate = (sample_rate << TS_SRC_SHIFT) / TS_SAMPR48000;
-
- /* for play we always use signed */
- sign = ERAM_SIGNED_PCM;
-
- ATRACE_32("ts_ad_set_format() play SR", sample_rate);
- } else {
- /* save for later use */
- state->ts_csample_rate = sample_rate;
- state->ts_cchannels = channels;
- state->ts_cprecision = precision;
-
- /*
- * we set the only record stream
- */
- ch = TS_INPUT_STREAM;
-
- /*
- * convert the sample rate into 4.12 format
- */
- sample_rate = (TS_SAMPR48000 << TS_SRC_SHIFT) / sample_rate;
-
- ATRACE_32("ts_ad_set_format() record SR", sample_rate);
-
- /* for 16-bit record we use signed */
- sign = ERAM_SIGNED_PCM;
- }
-
- /* check for stereo only */
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- channels = ERAM_STEREO;
-
- /* check for 16-bit only */
- ASSERT(precision == AUDIO_PRECISION_16);
- precision = ERAM_16_BITS;
-
- /* always linear encoding */
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- /* program the sample rate */
- handle = state->ts_handle;
- ddi_put16(handle, &state->ts_regs->aud_ram[ch].aram.aram_delta,
- (uint16_t)sample_rate);
-
- /* program the precision and number of channels */
- tmp_short = ddi_get16(handle,
- &state->ts_regs->aud_ram[ch].eram.eram_ctrl_ec) & ~(ERAM_CTRL_MASK);
- tmp_short |= precision|channels|ERAM_LOOP_MODE|sign;
- ddi_put16(handle, &state->ts_regs->aud_ram[ch].eram.eram_ctrl_ec,
- tmp_short);
-
- mutex_exit(&state->ts_lock);
-
- ATRACE("ts_ad_set_format() finished programming the device", 0);
-
- rc = AUDIO_SUCCESS;
-
-done:
- ATRACE_32("ts_ad_set_format() done", rc);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_set_format() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_set_format() */
-
-/*
- * audiots_ad_start_play()
- *
- * Description:
- * Wrapper to call audiots_start_play().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-/*ARGSUSED*/
-static int
-audiots_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- int rc;
-
- ATRACE("in ts_ad_start_play() handle", ahandle);
- ATRACE_32("ts_ad_start_play() stream", stream);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_start_play() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_play() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&state->ts_lock);
- rc = audiots_start_play(state);
-
- if (rc == AUDIO_SUCCESS && (state->ts_flags & TS_PLAY_ACTIVE) == 0) {
- state->ts_flags |= TS_PLAY_ACTIVE;
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- }
- }
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_start_play() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_start_play() */
-
-/*
- * audiots_ad_stop_play()
- *
- * Description:
- * Wrapper to call audiots_stop_play().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
-
- ATRACE("in ts_ad_stop_play()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!stop_play() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
- audiots_stop_play(state);
-
- if ((state->ts_flags & (TS_PM_SUPPORTED|TS_PLAY_ACTIVE)) ==
- (TS_PM_SUPPORTED|TS_PLAY_ACTIVE)) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
-
- state->ts_flags &= ~TS_PLAY_ACTIVE;
-
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE("ts_ad_stop_play() returning", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_stop_play() */
-
-/*
- * audiots_ad_start_record()
- *
- * Description:
- * Wrapper to call audiots_start_record().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-/*ARGSUSED*/
-static int
-audiots_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- int rc;
-
- ATRACE("in ts_ad_start_record()", ahandle);
- ATRACE_32("ts_ad_start_record() stream", stream);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_start_record() h/w has failed",
- state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_record() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&state->ts_lock);
- rc = audiots_start_record(state);
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_start_record() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_start_record() */
-
-/*
- * audiots_ad_stop_record()
- *
- * Description:
- * Wrapper to call audiots_stop_record().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
-
- ATRACE("in ts_ad_stop_record()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!stop_record() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
- audiots_stop_record(state);
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_stop_record() */
-
-
-/* ******* Local Routines *************************************************** */
-
-/*
- * audiots_and_ac97()
- *
- * Description:
- * Logically AND a value with the specified AC-97 Codec register.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * void
- */
-static void
-audiots_and_ac97(audiots_state_t *state, int reg, uint16_t data)
-{
- audiots_set_ac97(state, reg,
- (data & state->ts_shadow[TS_CODEC_REG(reg)]));
-
-} /* audiots_and_ac97() */
-
-/*
- * audiots_chip_init()
- *
- * Description:
- * Initialize the audio core and the AC-97 Codec. The AC-97 Codec is
- * always programmed from ts_shadow[]. If we aren't doing a restore
- * we initialize ts_shadow[], otherwise we use the current values of
- * ts_shadow[]. This allows this routine to be used for both attaching
- * and for power management power up.
- *
- * Speaker, line out and headphone out gain are not set to 0 gain.
- * Thus their respective registers are never set to 0. Since the failed
- * read and write over the AC-97 link results in a 0 we now know for
- * sure if the write succeeded or not.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int restore If TS_INIT_RESTORE then restore
- * from ts_shadow[]
- *
- * Returns:
- * void
- */
-static void
-audiots_chip_init(audiots_state_t *state, int restore)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- int i;
- int str;
-
- ATRACE("in ts_chip_init()", state);
- ATRACE_32("ts_chip_init() restore", restore);
-
- /* set global music and wave volume to 0dB */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_volume, 0x0);
-
- /*
- * Enable middle and end interrupts for all channels. Since
- * we always set these we don't have to save it as well.
- */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_cir_gc,
- (AP_CIR_GC_ENDLP_IE|AP_CIR_GC_MIDLP_IE));
-
- /* for each channel, set gain and enable interrupts for middle & end */
- for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
- /*
- * Set volume to 0dB attenuation, 1st left and then right.
- * These are never changed, so we don't have to save them.
- */
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_gvsel_pan_vol,
- (ERAM_WAVE_VOL|ERAM_PAN_LEFT|ERAM_PAN_0dB|
- ERAM_VOL_DEFAULT));
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_gvsel_pan_vol,
- (ERAM_WAVE_VOL|ERAM_PAN_RIGHT|ERAM_PAN_0dB|
- ERAM_VOL_DEFAULT));
-
- /*
- * The envelope engine *MUST* remain in still mode (off).
- * Otherwise bad things like gain randomly disappearing might
- * happen. See bug #4332773.
- */
-
- ddi_put32(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ebuf1,
- ERAM_EBUF_STILL);
- ddi_put32(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ebuf2,
- ERAM_EBUF_STILL);
-
- /* Set the eram and aram state */
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].aram.aram_delta,
- state->ts_save_regs[str].aram_delta);
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ctrl_ec,
- state->ts_save_regs[str].eram_ctrl_ec);
- }
-
- /* program channel 31 for record */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_global_control,
- (AP_CLOGAL_CTRL_E_PCMIN_CH31|AP_CLOGAL_CTRL_PCM_OUT_AC97|
- AP_CLOGAL_CTRL_MMC_FROM_MIXER|AP_CLOGAL_CTRL_PCM_OUT_TO_AC97));
-
- /* do a warm reset, which powers up the Codec */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
- AP_SCTRL_WRST_CODEC);
- drv_usecwait(2);
- AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
- ~AP_SCTRL_WRST_CODEC);
-
- /* do a warm reset via the Codec, yes, I'm being paranoid! */
- audiots_set_ac97(state, AC97_RESET_REGISTER, 0);
-
- /* Make sure the Codec is powered up. */
- i = TS_WAIT_CNT;
- while ((audiots_get_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER) &
- PCSR_POWERD_UP) != PCSR_POWERD_UP && i--) {
- drv_usecwait(1);
- }
-
- if ((restore == TS_INIT_RESTORE) && (state->ts_flags & TS_ATTACH_PWR)) {
- /*
- * Here we're raising power at attach time, we need to
- * initialize the shadow array and then mute the outputs.
- * If we don't, there's a loud double pop on the headphones.
- */
- for (str = 0; str < sizeof (ac97_v21_t); str += 2) {
- (void) audiots_get_ac97(state, str);
- }
-
- /* set outputs muted */
- state->ts_shadow[TS_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- state->ts_shadow[TS_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- state->ts_shadow
- [TS_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- state->ts_shadow[TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* preload shadow registers if not restoring */
- if (restore == TS_INIT_NO_RESTORE) {
- for (str = 0; str < sizeof (ac97_v21_t); str += 2) {
- /* read the Codec & save in the shadow register array */
- (void) audiots_get_ac97(state, str);
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE|TS_AC97_ATTEN_LINE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE|TS_AC97_ATTEN_HP;
-
- /* 06h - set master mono volume, muted, 0dB */
- state->ts_shadow[
- TS_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE|TS_AC97_ATTEN_SPKR;
-
- /* 08h - set master tone control to no modification */
- state->ts_shadow[
- TS_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /* 0ah - mute pc beep, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_PC_BEEP_REGISTER)] =
- PCBR_MUTE|PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- state->ts_shadow[TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- state->ts_shadow[
- TS_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- state->ts_shadow[TS_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- state->ts_shadow[TS_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * The rest we ignore, most are reserved.
- *
- * CAUTION: If we add to the list we need to fix the end
- * of the loop below.
- */
- }
-
- /* now program the AC-97 Codec from ts_shadow[] */
- for (i = 0; i < TS_LAST_AC_REG; i += TS_REG_SIZE) {
- audiots_set_ac97(state, i, state->ts_shadow[TS_CODEC_REG(i)]);
- }
-
- ATRACE("ts_chip_init() returning", state);
-
-} /* audiots_chip_init() */
-
-/*
- * audiots_get_ac97()
- *
- * Description:
- * Get the value in the specified AC-97 Codec register. There is a
- * bug in silicon which forces us to do multiple reads of the Codec's
- * register. This algorithm was provided by T2 and is heuristic in
- * nature. Unfortunately we have no guarantees that the real answer
- * isn't 0x0000, which is what we get when a read fails. So we loop
- * TS_LOOP_CNT times before we give up. We just have to hope this is
- * sufficient to give us the correct value.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- *
- * Returns:
- * unsigned short The value in the specified register
- */
-static uint16_t
-audiots_get_ac97(audiots_state_t *state, int reg)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *data;
- int count;
- int delay;
- uint16_t first;
- uint16_t next;
-
- ATRACE_32("in ts_get_ac97()", reg);
-
- if (state->ts_rev_id == AC_REV_ID1) {
- data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
- } else {
- data = &state->ts_regs->aud_regs.ap_acrdwr_data;
- }
-
- /* make sure the register is good */
- reg &= AP_ACRD_INDEX_MASK;
- for (count = TS_LOOP_CNT; count--; ) {
- if ((first = audiots_read_ac97(state, reg)) != 0) {
- next = first;
- break;
- }
-
- delay = TS_DELAY_CNT;
- while (delay--) {
- (void) ddi_get16(handle, data);
- }
-
- if ((next = audiots_read_ac97(state, reg)) != 0) {
- break;
- }
- }
- /* save the value in the shadow register array */
- state->ts_shadow[TS_CODEC_REG(reg)] = next;
-
- ATRACE_16("ts_get_ac97() returning",
- state->ts_shadow[TS_CODEC_REG(reg)]);
-
- /*
- * Arggg, if you let the next read happen too soon then it fails.
- * 12 usec fails, 13 usec succeeds. So set it to 20 for safety.
- */
- drv_usecwait(TS_20US);
-
- return (state->ts_shadow[TS_CODEC_REG(reg)]);
-
-} /* audiots_get_ac97() */
-
-/*
- * audiots_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure.
- * This includes reading the properties.
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audiots_attach() would need to be fixed as well.
- *
- * NOTE: birdsnest supports CD ROM input. We check for the cdrom
- * property. If there we turn it on.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audiots_init_state(audiots_state_t *state, dev_info_t *dip)
-{
- int ts_pints;
- int ts_rints;
- int cdrom = 0;
-
- ATRACE("in ts_init_state()", NULL);
-
- /* get the number of play and record interrupts per second */
- ts_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "play-interrupts", TS_INTS);
- ts_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "record-interrupts", TS_INTS);
-
- /* make sure the values are good */
- if (ts_pints < TS_MIN_INTS) {
- ATRACE_32("ts_init_state() "
- "play interrupt rate set too low, resetting", ts_pints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- ts_pints, TS_MIN_INTS);
- ts_pints = TS_INTS;
- } else if (ts_pints > TS_MAX_INTS) {
- ATRACE_32("ts_init_state() "
- "play interrupt rate set too high, resetting", ts_pints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- ts_pints, TS_MAX_INTS);
- ts_pints = TS_INTS;
- }
- if (ts_rints < TS_MIN_INTS) {
- ATRACE_32("ts_init_state() "
- "record interrupt rate set too low, resetting", ts_rints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- ts_rints, TS_MIN_INTS);
- ts_rints = TS_INTS;
- } else if (ts_rints > TS_MAX_INTS) {
- ATRACE_32("ts_init_state() "
- "record interrupt rate set too high, resetting", ts_rints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- ts_rints, TS_MAX_INTS);
- ts_rints = TS_INTS;
- }
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- state->ts_ad_info.ad_mode = AM_MIXER_MODE;
- } else {
- state->ts_ad_info.ad_mode = AM_COMPAT_MODE;
- }
-
- ATRACE_32("ts_init_state() setting mode", state->ts_ad_info.ad_mode);
-
- /* figure out the platform */
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* save the device info pointer */
- state->ts_dip = dip;
-
- /* get the iblock cookie needed for interrupt context */
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &state->ts_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
-
- /* initialize the state mutexes and condition variables */
- mutex_init(&state->ts_lock, NULL, MUTEX_DRIVER, state->ts_iblock);
- cv_init(&state->ts_cv, NULL, CV_DRIVER, NULL);
-
- /*
- * CAUTION: From here on we must destroy the mutexes if there's
- * an error and we return failure.
- */
- /* fill in the device default state */
- state->ts_defaults.play.sample_rate = TS_DEFAULT_SR;
- state->ts_defaults.play.channels = TS_DEFAULT_CH;
- state->ts_defaults.play.precision = TS_DEFAULT_PREC;
- state->ts_defaults.play.encoding = TS_DEFAULT_ENC;
- state->ts_defaults.play.gain = TS_DEFAULT_PGAIN;
- state->ts_defaults.play.port = AUDIO_SPEAKER|AUDIO_HEADPHONE;
- state->ts_defaults.play.avail_ports = AUDIO_SPEAKER|AUDIO_HEADPHONE|\
- AUDIO_LINE_OUT;
- state->ts_defaults.play.mod_ports = AUDIO_SPEAKER|AUDIO_LINE_OUT;
- state->ts_defaults.play.buffer_size = TS_BSIZE;
- state->ts_defaults.play.balance = TS_DEFAULT_BAL;
- state->ts_defaults.record.sample_rate = TS_DEFAULT_SR;
- state->ts_defaults.record.channels = TS_DEFAULT_CH;
- state->ts_defaults.record.precision = TS_DEFAULT_PREC;
- state->ts_defaults.record.encoding = TS_DEFAULT_ENC;
- state->ts_defaults.record.gain = TS_DEFAULT_PGAIN;
- state->ts_defaults.record.port = AUDIO_MICROPHONE;
- state->ts_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->ts_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->ts_defaults.record.buffer_size = TS_BSIZE;
- state->ts_defaults.record.balance = TS_DEFAULT_BAL;
- state->ts_defaults.monitor_gain = TS_DEFAULT_MONITOR_GAIN;
- state->ts_defaults.output_muted = B_FALSE;
- state->ts_defaults.ref_cnt = B_FALSE;
- state->ts_defaults.hw_features = AUDIO_HWFEATURE_DUPLEX|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_PLAY|AUDIO_HWFEATURE_RECORD;
- state->ts_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- /* add CD ROM for birdsnest */
- if (cdrom) {
- state->ts_defaults.record.avail_ports |= AUDIO_CD;
- state->ts_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- state->ts_psample_rate = state->ts_defaults.play.sample_rate;
- state->ts_pchannels = state->ts_defaults.play.channels;
- state->ts_pprecision = state->ts_defaults.play.precision;
- state->ts_csample_rate = state->ts_defaults.record.sample_rate;
- state->ts_cchannels = state->ts_defaults.record.channels;
- state->ts_cprecision = state->ts_defaults.record.precision;
-
- /* fill in the ad_info structure */
- state->ts_ad_info.ad_int_vers = AM_VERSION;
- state->ts_ad_info.ad_add_mode = NULL;
- state->ts_ad_info.ad_codec_type = AM_TRAD_CODEC;
- state->ts_ad_info.ad_defaults = &state->ts_defaults;
- state->ts_ad_info.ad_play_comb = audiots_combinations;
- state->ts_ad_info.ad_rec_comb = audiots_combinations;
- state->ts_ad_info.ad_entry = &audiots_entry;
- state->ts_ad_info.ad_dev_info = &state->ts_dev_info;
- state->ts_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- state->ts_ad_info.ad_diff_flags =
- AM_DIFF_SR|AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- state->ts_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- state->ts_ad_info.ad_misc_flags = AM_MISC_RP_EXCL|AM_MISC_MONO_DUP;
- state->ts_ad_info.ad_translate_flags = AM_MISC_8_R_TRANSLATE;
- state->ts_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- state->ts_ad_info.ad_play.ad_mixer_srs = audiots_mixer_sample_rates;
- state->ts_ad_info.ad_play.ad_compat_srs = audiots_compat_sample_rates;
- state->ts_ad_info.ad_play.ad_conv = &am_src2;
- state->ts_ad_info.ad_play.ad_sr_info = NULL;
- state->ts_ad_info.ad_play.ad_chs = audiots_channels;
- state->ts_ad_info.ad_play.ad_int_rate = ts_pints;
- state->ts_ad_info.ad_play.ad_max_chs = TS_MAX_OUT_CHANNELS;
- state->ts_ad_info.ad_play.ad_bsize = TS_BSIZE;
-
- /* record capabilities */
- state->ts_ad_info.ad_record.ad_mixer_srs = audiots_mixer_sample_rates;
- state->ts_ad_info.ad_record.ad_compat_srs = audiots_compat_sample_rates;
- state->ts_ad_info.ad_record.ad_conv = &am_src2;
- state->ts_ad_info.ad_record.ad_sr_info = NULL;
- state->ts_ad_info.ad_record.ad_chs = audiots_channels;
- state->ts_ad_info.ad_record.ad_int_rate = ts_rints;
- state->ts_ad_info.ad_record.ad_max_chs = TS_MAX_CHANNELS;
- state->ts_ad_info.ad_record.ad_bsize = TS_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(state->ts_dev_info.name, TS_DEV_NAME);
- (void) strcpy(state->ts_dev_info.config, TS_DEV_CONFIG);
- if (!cdrom) {
- (void) strcpy(state->ts_dev_info.version, TS_DEV_VERSION_A);
- } else {
- (void) strcpy(state->ts_dev_info.version, TS_DEV_VERSION_B);
- }
-
- /*
- * Figure out the largest transfer size for the DMA engine. We then
- * double the size because an interrupt happens in the middle and
- * the end of the buffer. This size must be modulo 16 to fit two 16-bit
- * stereo streams in on the interrupt boundaries, middle and end,
- * with an 8-byte boundary.
- */
- state->ts_pbuf_size = TS_BUF_HALVES * TS_SAMPR48000 *
- AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / ts_pints;
- state->ts_pbuf_size += TS_MOD_SIZE -
- (state->ts_pbuf_size % TS_MOD_SIZE);
- ASSERT(state->ts_pbuf_size > 0);
- ASSERT((state->ts_pbuf_size % TS_MOD_SIZE) == 0);
-
- state->ts_cbuf_size = TS_BUF_HALVES * TS_SAMPR48000 *
- AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / ts_rints;
- state->ts_cbuf_size += TS_MOD_SIZE -
- (state->ts_cbuf_size % TS_MOD_SIZE);
- ASSERT(state->ts_cbuf_size > 0);
- ASSERT((state->ts_cbuf_size % TS_MOD_SIZE) == 0);
- state->ts_tcbuf = kmem_alloc(state->ts_cbuf_size, KM_SLEEP);
-
- /* init power management state */
- state->ts_suspended = TS_NOT_SUSPENDED;
- state->ts_powered = TS_PWR_OFF;
- state->ts_busy_cnt = 0;
-
- ATRACE("ts_init_state() success", NULL);
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_init_state() */
-
-/*
- * audiots_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * NOTE: This device needs to make sure any PIO access required to clear
- * its interrupt has made it out on the PCI bus before returning from its
- * interrupt handler so that the interrupt has been deasserted. This is
- * done by rereading the address engine interrupt register.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audiots_intr(caddr_t T)
-{
- audiots_state_t *state = (audiots_state_t *)T;
- ddi_acc_handle_t handle;
- char *bptr;
- uint16_t *sptr;
- uint16_t *tcbuf;
- uint32_t interrupts;
- uint32_t location;
- int i;
- int count;
- int samples;
- int rc = DDI_INTR_UNCLAIMED;
-
- ATRACE("in ts_intr()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- mutex_enter(&state->ts_lock);
-
- handle = state->ts_handle;
-
- if (state->ts_flags & TS_INTR_PENDING) {
- state->ts_flags &= ~TS_INTR_PENDING;
- rc = DDI_INTR_CLAIMED;
- mutex_exit(&state->ts_lock);
- ATRACE("ts_intr() servicing with pending intr from stop()", 0);
- goto done;
- }
-
- interrupts = ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
- ATRACE_32("ts_intr() interrupts", interrupts);
- if (interrupts == 0) {
- mutex_exit(&state->ts_lock);
- /* no interrupts to process, so it's not us */
- ATRACE_32("ts_intr() device didn't send interrupt", interrupts);
- ASSERT(rc == DDI_INTR_UNCLAIMED);
- goto done;
- }
-
- if (interrupts & TS_OUTPUT_CHANNEL) { /* play interrupt */
- ATRACE_32("ts_intr() play interrupt", interrupts);
-
- /* is this in the 1st or 2nd half of the buffer? */
- location = ddi_get32(handle, &state->ts_regs->aud_regs.ap_cspf);
-
- /* clear the interrupt, should this be after getting loc? */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- TS_OUTPUT_CHANNEL);
-
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- /* set up for 1st or 2nd half */
- if (location & TS_OUTPUT_CHANNEL) { /* in the 2nd half */
- bptr = &state->ts_pb[TS_1ST_HALF];
- count = state->ts_pcnt[TS_1ST_HALF];
- samples = state->ts_psamples[TS_1ST_HALF];
- } else { /* in 1st half */
- /* pcnt[0] could be different from pcnt[TS_2ND_HALF] */
- bptr = &state->ts_pb[state->ts_pcnt[TS_1ST_HALF]];
- count = state->ts_pcnt[TS_2ND_HALF];
- samples = state->ts_psamples[TS_2ND_HALF];
- }
-
- /* always zero for silence */
- bzero(bptr, count);
-
- /* get the next chunk of audio */
- mutex_exit(&state->ts_lock);
- if (am_get_audio(state->ts_ahandle, bptr, AUDIO_NO_CHANNEL,
- samples) == 0) {
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_DMA_ENGINE_EMPTY) {
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- state->ts_flags &= ~TS_DMA_ENGINE_INITIALIZED;
-
- /* shutdown the mixer */
- mutex_exit(&state->ts_lock);
- am_play_shutdown(state->ts_ahandle, NULL);
- mutex_enter(&state->ts_lock);
-
- /*
- * Make sure playing wasn't restarted when
- * lock lost.
- */
- if (state->ts_flags &
- TS_DMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("ts_intr() restart after"
- "shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto rec_intr;
- }
-
- /* done playing, so stop playing */
- ddi_put32(handle,
- &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
-
- /* clr the flags getting ready for next start */
- state->ts_flags &= ~(TS_DMA_ENGINE_PAUSED|
- TS_DMA_ENGINE_EMPTY);
- } else {
- /* next time we shut down, if no sound again */
- state->ts_flags |= TS_DMA_ENGINE_EMPTY;
- }
- } else {
- mutex_enter(&state->ts_lock);
- /* we got at least one sample, so don't shutdown yet */
- state->ts_flags &= ~TS_DMA_ENGINE_EMPTY;
- (void) ddi_dma_sync(state->ts_ph, (off_t)bptr, count,
- DDI_DMA_SYNC_FORDEV);
- }
- rc = DDI_INTR_CLAIMED;
- }
-
-rec_intr:
-
- if (interrupts & TS_INPUT_CHANNEL) { /* record interrupt */
- ATRACE_32("ts_intr() record interrupt", interrupts);
-
- /* is this in the 1st or 2nd half of the buffer? */
- location = ddi_get32(handle, &state->ts_regs->aud_regs.ap_cspf);
- ATRACE_32("ts_intr(c) location", location);
-
- /* clear the interrupt, should this be after getting loc? */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- TS_INPUT_CHANNEL);
-
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- if (location & TS_INPUT_CHANNEL_MASK) {
- /* 1st half just filled */
- if (state->ts_flags & TS_DMA_RECORD_START) {
- /* skip the first interrupt, it is NULL */
- state->ts_flags &= ~TS_DMA_RECORD_START;
- } else {
- if (ddi_dma_sync(state->ts_ch,
- (off_t)((state->ts_ccnt<<1) - TS_FIFO_SIZE),
- TS_FIFO_SIZE, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle,
- CE_NOTE,
- "!dma_sync(1) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = TS_FIFO_SIZE /
- (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)
- &state->ts_cb[(state->ts_ccnt<<1) -
- TS_FIFO_SIZE];
- for (i = 0; i < (TS_FIFO_SIZE/2); i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c1) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
-
- if (ddi_dma_sync(state->ts_ch, (off_t)0,
- state->ts_ccnt - TS_FIFO_SIZE,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle,
- CE_NOTE,
- "!dma_sync(2) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = (state->ts_ccnt - TS_FIFO_SIZE) /
- (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)state->ts_cb;
- count = (state->ts_ccnt - TS_FIFO_SIZE) >> 1;
- for (i = 0; i < count; i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c2) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
- }
- } else {
- /* 2nd half just filled */
- if (ddi_dma_sync(state->ts_ch,
- (off_t)(state->ts_ccnt - TS_FIFO_SIZE),
- state->ts_ccnt, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_NOTE,
- "!dma_sync(2) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = state->ts_ccnt / (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)&state->ts_cb[state->ts_ccnt -
- TS_FIFO_SIZE];
- count = state->ts_ccnt >> 1;
- for (i = 0; i < count; i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c3) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
- }
-
- rc = DDI_INTR_CLAIMED;
- }
-
- interrupts &= ~(TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL);
- if (interrupts) {
- /*
- * handle, but don't service non play or record audiots
- * interrupts and shutdown the other DMA engines if they
- * somehow activated themselves - which is why we are here in
- * the first place.
- */
- ATRACE_32("ts_intr() unused audiots interrupt", interrupts);
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- interrupts);
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL);
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- ~(TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL));
-
- rc = DDI_INTR_CLAIMED;
- }
-
- /* update the kernel interrupt statistics */
- if (state->ts_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- TS_KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->ts_lock);
-
-done:
- ATRACE("audiots_intr() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_intr() */
-
-/*
- * audiots_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * Once the config space registers are mapped in we determine if the
- * audio core may be power managed. It should, but if it doesn't,
- * then trying to may cause the core to hang.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * NOTE: ddi_dma_alloc_handle() attempts to use the full 4 GB DMA address
- * range. This is to work around Southbridge rev E/G OBP issues.
- * (See Grover OBP note above)
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * audiots_state_t *state The device's state structure
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audiots_map_regs(dev_info_t *dip, audiots_state_t *state)
-{
- uint_t dma_cookie_count;
- uint32_t rev_id;
- int rc;
-
- ATRACE("in ts_map_regs()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* allocate one handle for play and one for record */
- if ((rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->ts_ph)) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(P) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->ts_ch)) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(C) failed: %d", rc);
- goto error_ph;
- }
-
- /* allocate the two DMA buffers, one for play and one for record */
- ASSERT(state->ts_pbuf_size > 0);
- ASSERT(state->ts_cbuf_size > 0);
- if (ddi_dma_mem_alloc(state->ts_ph, state->ts_pbuf_size, &ts_acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &state->ts_pb,
- &state->ts_pml, &state->ts_pmh) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(P) failed");
- goto error_ch;
- }
- if (ddi_dma_mem_alloc(state->ts_ch, state->ts_cbuf_size, &ts_acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &state->ts_cb,
- &state->ts_cml, &state->ts_cmh) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(C) failed");
- goto error_pmh;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->ts_ph, (struct as *)0,
- state->ts_pb, state->ts_pbuf_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, (caddr_t)0, &state->ts_pc, &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle(P) failed: %d", rc);
- goto error_cmh;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->ts_ch, (struct as *)0,
- state->ts_cb, state->ts_cbuf_size, DDI_DMA_READ|DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, (caddr_t)0, &state->ts_cc, &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle(C) failed: %d", rc);
- goto error_pc;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* map in the registers, the config and memory mapped registers */
- if (ddi_regs_map_setup(dip, TS_CONFIG_REGS,
- (caddr_t *)&state->ts_config, 0, 0, &ts_acc_attr,
- &state->ts_chandle) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_cc;
- }
-
- /* make sure we can power manage the audio core */
- if (ddi_get16(state->ts_chandle, &state->ts_config->tsc_cap_ptr) ==
- TS_CAP_PTR) {
- state->ts_pm_core = TS_PWR_MANAGE;
- ATRACE("Audio core is power manageable", 0);
- } else {
- state->ts_pm_core = TS_NO_PWR_MANAGE;
- ATRACE("Audio core is not power manageable", 0);
- }
-
- if (ddi_regs_map_setup(dip, TS_MEM_MAPPED_REGS,
- (caddr_t *)&state->ts_regs, 0, 0, &ts_acc_attr,
- &state->ts_handle) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_unmap;
- }
-
- /* Read the Audio Controller's revision ID */
- rev_id = ddi_get32(state->ts_chandle,
- &state->ts_config->tsc_class_code_rev_id);
- if (rev_id & AC_REV_ID1) {
- state->ts_rev_id = AC_REV_ID1;
- ATRACE("Old SB audio rev ID", rev_id);
- } else if (rev_id & AC_REV_ID2) {
- state->ts_rev_id = AC_REV_ID2;
- ATRACE("New SB audio rev ID", rev_id);
- } else {
- /* Unknown rev, who knows what else has changed... */
- ATRACE("Unknown SB rev - don't use", rev_id);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "map_regs() unsupported SouthBridge Chip revision: %x",
- rev_id);
- return (AUDIO_FAILURE);
- }
-
- /* let the state structure know about the attributes */
- state->ts_dma_attr = &audiots_attr;
-
- ATRACE("ts_map_regs() returning success", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-error_unmap:
- ddi_regs_map_free(&state->ts_chandle);
-error_cc:
- (void) ddi_dma_unbind_handle(state->ts_ch);
-error_pc:
- (void) ddi_dma_unbind_handle(state->ts_ph);
-error_cmh:
- ddi_dma_mem_free(&state->ts_cmh);
-error_pmh:
- ddi_dma_mem_free(&state->ts_pmh);
-error_ch:
- ddi_dma_free_handle(&state->ts_ch);
-error_ph:
- ddi_dma_free_handle(&state->ts_ph);
-error:
- ATRACE("ts_map_regs() returning failure", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_FAILURE);
-
-} /* audiots_map_regs() */
-
-/*
- * audiots_or_ac97()
- *
- * Description:
- * Logically OR a value with the specified AC-97 Codec register.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * void
- */
-static void
-audiots_or_ac97(audiots_state_t *state, int reg, uint16_t data)
-{
-
- audiots_set_ac97(state, reg,
- (data | state->ts_shadow[TS_CODEC_REG(reg)]));
-
-} /* audiots_or_ac97() */
-
-/*
- * audiots_power_down()
- *
- * Description:
- * Power down the AC-97 Codec and then, if allowed, power down
- * the audio core. The audio core implements PCI power management
- * version 1.0. We don't support state D3 (cold) since we don't
- * have an external device to drive reseting the core to get it
- * back up and running. We just toggle between D0 and D3 since
- * we need the device either all on or all off.
- *
- * Minimum transition times between the power states:
- * D0 <---> D1 no time delay
- * D0 <---> D2 200 microseconds
- * D0 <---> D3 10 milliseconds
- *
- * To be safe I'm doubling that time because if you don't wait
- * long enough you get a hard hang for the app opening audio.
- *
- * AC-97 Codec's walk from power states PR0 through PR5 plus the
- * optional PR6 and EAPD. We always set PR6 EAPD since they don't
- * hurt anything. Then we walk to PR2|PR3. We don't go any further
- * because this requires that we do a cold reset. Since this pin
- * isn't connected in the 1553 we can't do this.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_power_down(audiots_state_t *state)
-{
- ATRACE("in audiots_power_down() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* No interrupts should be pending before we power down */
- ASSERT(ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_aint) == 0);
- ASSERT(ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_eint) == 0);
-
- /* powering down, save the audio core's state */
- audiots_save_controller(state);
-
- /* power down the Codec, also shut down external amps */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER,
- (PCSR_PR6|PCSR_EAPD));
-
- /* shut down ADC and inputs */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_PR0);
-
- /* shut down DAC */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_PR1);
-
- /* shut down analog mixer and Vref */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER,
- (PCSR_PR2|PCSR_PR3));
-
- /* MUST clear the shadow register so we can power up! */
- state->ts_shadow[TS_CODEC_REG(AC97_POWERDOWN_CTRL_STAT_REGISTER)] = 0;
-
- /* power down the core, if allowed */
- if (state->ts_pm_core == TS_PWR_MANAGE) {
- /* okay, drop to D3 for the best power reduction */
- OR_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, TS_PWR_D3);
-
- /*
- * wait 20 milliseconds for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(TS_20MS));
-#endif
- }
-
- state->ts_powered = TS_PWR_OFF;
-
- ATRACE("audiots_power_down() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_power_down() */
-
-/*
- * audiots_power_up()
- *
- * Description:
- * Power up the audio core if allowed, and then the AC-97 Codec.
- * The state change timings documented in audiots_power_down()
- * apply to powering up as well.
- *
- * audiots_chip_init() does a soft reset, which powers up all of
- * the sections of the Codec that were powered down in
- * audiots_power_down().
- *
- * NOTE: We don't worry about locking since the only routines that
- * may call us are audiots_attach() and audiots_power().
- * Both of which should be the only threads in the driver.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_power_up(audiots_state_t *state)
-{
- ATRACE("in audiots_power_up()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* power up the core, if allowed */
- if (state->ts_pm_core == TS_PWR_MANAGE) {
- /* go from D3 to D0 */
- AND_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, ~TS_PWR_D3);
-
- /*
- * wait 20 milliseconds for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(TS_20MS));
-#endif
- /* clear the PME# flag */
- OR_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, TS_PWR_PME);
- }
-
- /* restore the state, does reset to power up the Codec */
- audiots_chip_init(state, TS_INIT_RESTORE);
-
- state->ts_powered = TS_PWR_ON;
-
- ATRACE("audiots_power_up() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_power_up() */
-
-/*
- * audiots_read_ac97()
- *
- * Description:
- * This routine actually reads the AC-97 Codec's register. It may
- * be called several times to succeed.
- *
- * NOTE:
- * Revision M1535D B1-C of the ALI SouthBridge includes a workaround for
- * the broken busy flag. Resetting the busy flag requires a software tweak
- * to go with the worked around hardware. When we detect failure, we make
- * 10 attempts to reset the chip before we fail. This should reset the new
- * SB systems. On all SB systems, this will increse the read delay
- * slightly, but shouldn't bother it otherwise.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- *
- * Returns:
- * unsigned short The value in the specified register
- */
-static uint16_t
-audiots_read_ac97(audiots_state_t *state, int reg)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *addr;
- uint16_t *data;
- uint32_t *stimer = &state->ts_regs->aud_regs.ap_stimer;
- uint32_t chk1;
- uint32_t chk2;
- int resets = 0;
- int i;
-
- if (state->ts_rev_id == AC_REV_ID1) {
- addr = &state->ts_regs->aud_regs.ap_acrd_35D_reg;
- data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
- ATRACE("Using OLD SB 35D addresses for reading", 0x44);
- } else {
- addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
- data = &state->ts_regs->aud_regs.ap_acrdwr_data;
- ATRACE("Using NEW SB 35D+ addresses for reading", 0x40);
- }
-
-first_read:
- /* wait for ready to send read request */
- for (i = 0; i < TS_READ_TRIES; i++) {
- if (!(ddi_get16(handle, addr) & AP_ACRD_R_READ_BUSY)) {
- break;
- }
- /* don't beat on the bus */
- drv_usecwait(1);
- }
- if (i >= TS_READ_TRIES) {
- if (resets < TS_RESET_TRIES) {
- /* Attempt to reset */
- ATRACE("Attempting to reset the AC97 #1", resets);
- drv_usecwait(TS_20US);
- ddi_put16(handle, addr, TS_SB_RESET);
- resets++;
- goto first_read;
- } else {
- ATRACE("Reading the AC97 register has failed #1", 0);
- state->ts_flags |= TS_AUDIO_READ_FAILED;
- if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
- "Unable to communicate with AC97 CODEC");
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "The audio AC97 register has timed out.");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Audio is now disabled.\n");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Please reboot to restore audio.\n");
-
- /* Don't flood the console */
- state->ts_flags |= TS_READ_FAILURE_PRINTED;
- }
- }
- return (0);
- }
-
- /* program the register to read */
- ddi_put16(handle, addr, (reg|AP_ACRD_W_PRIMARY_CODEC|
- AP_ACRD_W_READ_MIXER_REG|AP_ACRD_W_AUDIO_READ_REQ&
- (~AP_ACWR_W_SELECT_WRITE)));
-
- /* hardware bug work around */
- chk1 = ddi_get32(handle, stimer);
- chk2 = ddi_get32(handle, stimer);
- i = TS_WAIT_CNT;
- while (chk1 == chk2 && i) {
- chk2 = ddi_get32(handle, stimer);
- i--;
- }
- OR_SET_SHORT(handle, addr, AP_ACRD_W_READ_MIXER_REG);
- resets = 0;
-
-second_read:
- /* wait again for read to send read request */
- for (i = 0; i < TS_READ_TRIES; i++) {
- if (!(ddi_get16(handle, addr) & AP_ACRD_R_READ_BUSY)) {
- break;
- }
- /* don't beat on the bus */
- drv_usecwait(1);
- }
- if (i >= TS_READ_TRIES) {
- if (resets < TS_RESET_TRIES) {
- /* Attempt to reset */
- ATRACE("Attempting to reset the AC97 #2", resets);
- drv_usecwait(TS_20US);
- ddi_put16(handle, addr, TS_SB_RESET);
- resets++;
- goto second_read;
- } else {
- ATRACE("Reading the AC97 register has failed #2", 0);
- state->ts_flags |= TS_AUDIO_READ_FAILED;
- if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
- "Unable to communicate with AC97 CODEC");
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "The audio AC97 register has timed out.");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Audio is now disabled.\n");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Please reboot to restore audio.\n");
-
- /* Don't flood the console */
- state->ts_flags |= TS_READ_FAILURE_PRINTED;
- }
- }
- return (0);
- }
-
- return (ddi_get16(handle, data));
-
-} /* audiots_read_ac97() */
-
-/*
- * audiots_save_controller()
- *
- * Description:
- * Save the state of the audio controller.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_save_controller(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- int str;
-
- ATRACE("in ts_save_controller()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* save the controller state, Codec state is in ts_shadow[] */
- handle = state->ts_handle;
- for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
- state->ts_save_regs[str].aram_delta = ddi_get16(handle,
- &state->ts_regs->aud_ram[str].aram.aram_delta);
- state->ts_save_regs[str].eram_ctrl_ec = ddi_get16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ctrl_ec);
- }
-
- ATRACE("ts_save_controller() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_save_controller() */
-
-/*
- * audiots_set_ac97()
- *
- * Description:
- * Set the value in the specified AC-97 Codec register. Just like
- * reading the AC-97 Codec, it is possible there is a problem writing
- * it as well. So we loop.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t value The value to write
- *
- * Returns:
- * void
- */
-static void
-audiots_set_ac97(audiots_state_t *state, int reg, const uint16_t data)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *data_addr = &state->ts_regs->aud_regs.ap_acrdwr_data;
- uint16_t *reg_addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
- int count;
- int i;
- uint16_t tmp_short;
-
- reg &= AP_ACWR_INDEX_MASK;
-
- /* Don't touch the reserved bits on the pre 35D+ SouthBridge */
- if (state->ts_rev_id == AC_REV_ID1) {
- reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG;
- ATRACE("Writing to 35D SB", reg);
- } else {
- reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG|
- AP_ACWR_W_SELECT_WRITE;
- ATRACE("Writing to 35D+ SB", reg);
- }
-
- for (count = TS_LOOP_CNT; count--; ) {
- /* wait for ready to write */
- for (i = 0; i < TS_WAIT_CNT; i++) {
- if (!(ddi_get16(handle, reg_addr) &
- AP_ACWR_R_WRITE_BUSY)) {
- /* ready to write */
- ddi_put16(handle, reg_addr, reg);
-
- /* Write the data */
- ddi_put16(handle, data_addr, data);
- break;
- }
- }
- if (i >= TS_WAIT_CNT) {
- /* try again */
- continue;
- }
-
- /* wait for write to complete */
- for (i = 0; i < TS_WAIT_CNT; i++) {
- if (!(ddi_get16(handle, reg_addr) &
- AP_ACWR_R_WRITE_BUSY)) {
- /* done writing */
- break;
- }
- }
-
- /* verify the value written and also update ts_shadow[] */
- tmp_short = audiots_get_ac97(state, reg);
- if (data == tmp_short) {
- /* successfully loaded, so we can return */
- return;
- }
- }
-
-} /* audiots_set_ac97() */
-
-/*
- * audiots_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended or the power removed by the power
- * manager. It will also block any routine while a suspend is
- * going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Set busy and powered up
- * AUDIO_FAILURE Couldn't power up, so not busy
- */
-static int
-audiots_set_busy(audiots_state_t *state)
-{
- ATRACE("in audiots_set_busy()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->ts_lock);
-
- /* Don't proceed if PM is not enabled */
- if (!(state->ts_flags & TS_PM_SUPPORTED)) {
- mutex_exit(&state->ts_lock);
- return (AUDIO_SUCCESS);
- }
-
- /* block if we are going to be suspended */
- while (state->ts_suspended == TS_SUSPENDED) {
- cv_wait(&state->ts_cv, &state->ts_lock);
- }
-
- /*
- * Okay, we aren't going to be suspended yet, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(state->ts_busy_cnt >= 0);
- state->ts_busy_cnt++;
-
- /* now can release the lock before we raise the power */
- mutex_exit(&state->ts_lock);
-
- /*
- * Mark as busy before we ask for power to be raised. This removes
- * the race condtion between the call to audiots_power() and our call
- * to raise power. After we raise power we immediately mark as idle
- * so the count is still good.
- */
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT, TS_PWR_ON) ==
- DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- ATRACE("ts_set_busy() pm_raise_power() failed", NULL);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_busy() power up failed");
-
- mutex_enter(&state->ts_lock);
- state->ts_busy_cnt--; /* restore busy count */
- if (state->ts_busy_cnt == 0) {
- /* let DDI_SUSPEND continue */
- cv_broadcast(&state->ts_cv);
- }
- mutex_exit(&state->ts_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* power is up and we are marked as busy, so we are done */
-
- ATRACE("audiots_set_busy() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_set_busy() */
-
-/*
- * audiots_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-audiots_set_gain(audiots_state_t *state, int stream, int dir, int gain,
- int channel)
-{
- uint16_t tmp_short;
-
- ATRACE("in audiots_set_gain()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (dir == AUDIO_PLAY) { /* play gain */
- /*
- * For play we use PCM so all volumes change with just
- * one write. This way we get line out, headphone and
- * internal speaker in one shot.
- *
- * The AC-97 Codec goes from -34.5 dB (11111) to 0 dB
- * (01000) to +12.0 dB (00000). We turn gain into atten.
- */
- mutex_enter(&state->ts_lock);
- tmp_short = state->ts_shadow[
- TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)];
- if (channel == 0) { /* left channel */
- tmp_short &= ~PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= (((AUDIO_MAX_GAIN - gain) >>
- TS_GAIN_SHIFT3) << TS_BYTE_SHIFT) &
- PCMOVR_LEFT_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp_short &= ~PCMOVR_RIGHT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >>
- TS_GAIN_SHIFT3) & PCMOVR_RIGHT_GAIN_MASK;
- }
- audiots_set_ac97(state, AC97_PCM_OUT_VOLUME_REGISTER,
- tmp_short);
- mutex_exit(&state->ts_lock);
- } else {
- ASSERT(dir == AUDIO_RECORD);
- /*
- * For record we use the master record gain with all
- * of the inputs set to 0dB.
- *
- * The AC-97 Codec goes from 0 dB (0000) to +22.5 dB
- * (1111), so gain remains gain. We chop off the bottom
- * 4 bits and use the top for the gain.
- */
- mutex_enter(&state->ts_lock);
- tmp_short =
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)];
- if (channel == 0) { /* left channel */
- tmp_short &= ~RGR_LEFT_MASK;
- tmp_short |= (gain << TS_GAIN_SHIFT4) & RGR_LEFT_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp_short &= ~RGR_RIGHT_MASK;
- tmp_short |= (gain >> TS_GAIN_SHIFT4) & RGR_RIGHT_MASK;
- }
- audiots_set_ac97(state, AC97_RECORD_GAIN_REGISTER,
- tmp_short);
- mutex_exit(&state->ts_lock);
- }
-
- ATRACE("audiots_set_gain() done", NULL);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_set_gain() */
-
-/*
- * audiots_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * It ends by resetting the power management timer.
- *
- * We don't do anything with power because the routine that is no longer
- * busy either doesn't need the hardware, or we are playing or recording
- * so the power won't come down anyway.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_set_idle(audiots_state_t *state)
-{
- ATRACE("in audiots_set_idle()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->ts_lock);
-
- /* Don't proceed if PM is not enabled */
- if (!(state->ts_flags & TS_PM_SUPPORTED)) {
- mutex_exit(&state->ts_lock);
- return;
- }
-
- ASSERT(state->ts_suspended == TS_NOT_SUSPENDED);
-
- /* decrement the busy count */
- state->ts_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (state->ts_busy_cnt == 0) {
- cv_broadcast(&state->ts_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&state->ts_lock);
-
- /* reset the timer */
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- ATRACE("audiots_set_idle() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_set_idle() */
-
-/*
- * audiots_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-audiots_set_monitor_gain(audiots_state_t *state, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audiots_set_monitor_gain()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to meet the requirement of AC'97 */
- tmp_short = (((AUDIO_MAX_GAIN - gain) >> TS_GAIN_SHIFT3) <<
- TS_BYTE_SHIFT) & PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >> TS_GAIN_SHIFT3) &
- PCMOVR_RIGHT_GAIN_MASK;
- }
-
- mutex_enter(&state->ts_lock);
-
- switch (state->ts_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |= state->ts_shadow[TS_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- audiots_set_ac97(state,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_LINE_IN:
- audiots_set_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_CD:
- audiots_set_ac97(state,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- mutex_exit(&state->ts_lock);
- rc = AUDIO_SUCCESS;
- goto done;
- default:
- /* this should never happen! */
- mutex_exit(&state->ts_lock);
- ATRACE("ts_ad_set_config() monitor gain bad device",
- NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- state->ts_monitor_gain = 0;
- } else {
- state->ts_monitor_gain = tmp_short;
- }
- mutex_exit(&state->ts_lock);
-
-done:
- ATRACE_32("audiots_set_monitor_gain()", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_set_monitor_gain() */
-
-/*
- * audiots_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * We also use this routine to unmute the play ports. By passing
- * TS_PORT_UNMUTE as the port we know to use the stored play port.
- * This has to be done inside the lock, otherwise there is the
- * possibility that the port passed in when this routine is called
- * could be wrong by the time we execute the unmute.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * which is not how we program the device
- * for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int port The port to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audiots_set_port(audiots_state_t *state, int dir, int port)
-{
- uint32_t tmp_word;
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audiots_set_port()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (dir == AUDIO_PLAY) { /* output port(s) */
- /* figure out which output port(s) to turn on */
- tmp_word = 0;
-
- mutex_enter(&state->ts_lock);
-
- /*
- * CAUTION: We must get the saved output port after the
- * lock so we know it is good.
- */
- if (port == TS_PORT_UNMUTE) {
- port = state->ts_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- audiots_and_ac97(state,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MMVR_MUTE);
- tmp_word |= AUDIO_SPEAKER;
- } else {
- audiots_or_ac97(state,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- }
-
- if (port & AUDIO_HEADPHONE) {
- audiots_and_ac97(state,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~HPVR_MUTE);
- tmp_word |= AUDIO_HEADPHONE;
- } else {
- audiots_or_ac97(state,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- audiots_and_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp_word |= AUDIO_LINE_OUT;
- } else {
- audiots_or_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
- }
-
- state->ts_output_port = tmp_word;
-
- mutex_exit(&state->ts_lock);
-
- ATRACE_32("ts_ad_set_config() set out port", tmp_word);
-
- if (tmp_word != (port & TS_PORT_MASK)) {
- ATRACE_32("ts_ad_set_config() bad out port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- /* figure out which input port to set */
- mutex_enter(&state->ts_lock);
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp_short = RSCR_R_PHONE|RSCR_L_PHONE;
-
- /* mute the master record input */
- audiots_or_ac97(state, AC97_RECORD_GAIN_REGISTER,
- RGR_MUTE);
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp_short = RSCR_R_MIC|RSCR_L_MIC;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp_short = RSCR_R_LINE_IN|RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_CD:
- /* set to the line in input */
- tmp_short = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp_short = RSCR_R_STEREO_MIX|RSCR_L_STEREO_MIX;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
- default:
- /* unknown or inclusive input ports */
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_config() bad in port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
- /* select the input */
- audiots_set_ac97(state, AC97_RECORD_SELECT_CTRL_REGISTER,
- tmp_short);
-
- /* if an input port then make sure we aren't muted */
- if (port != AUDIO_NONE &&
- (state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] &
- RGR_MUTE)) {
- audiots_and_ac97(state, AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
-
- state->ts_input_port = port;
-
- mutex_exit(&state->ts_lock);
- }
-
-done:
- ATRACE_32("audiots_set_port()", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_set_port() */
-
-/*
- * audiots_start_play()
- *
- * Description:
- * The audio core uses a single DMA buffer which is divided into two
- * halves. An interrupt is generated when the middle of the buffer has
- * been reached and at the end. The audio core resets the pointer back
- * to the beginning automatically. After the interrupt the driver clears
- * the buffer and asks the mixer for more audio samples. If there aren't
- * enough then silence is played out.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audiots_start_play(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- size_t buf_size;
- char *bptr;
- int rc = AUDIO_SUCCESS;
- int rs;
- int samples;
- int str = TS_OUTPUT_STREAM;
-
- ATRACE("in ts_start_play()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- handle = state->ts_handle;
-
- /* see if we are already playing */
- if ((ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_OUTPUT_CHANNEL)) {
- ATRACE("ts_start_play() DMA engine already running", state);
- ASSERT(rc == AUDIO_SUCCESS);
- goto done;
- }
-
- /* see if we are just paused */
- if (state->ts_flags & TS_DMA_ENGINE_PAUSED) {
- ATRACE_32("ts_start_play() DMA paused", state->ts_flags);
- state->ts_flags &= ~TS_DMA_ENGINE_PAUSED;
-
- /* make sure it starts playing */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start,
- TS_OUTPUT_CHANNEL);
-
- ATRACE_32("ts_start_play() DMA engine restarted",
- state->ts_flags);
- ASSERT(rc == AUDIO_SUCCESS);
- goto done;
- }
-
- /*
- * Okay, we are starting from scratch, so get the first chunks of audio.
- * We ask for half of the buffer twice. That way we don't mess up the
- * mixer's paradigm of using two buffers. But before we get the audio
- * we zero the buffer, giving it silence, just in case there isn't
- * enough audio.
- */
- bzero(state->ts_pb, state->ts_pbuf_size);
-
- samples = state->ts_psample_rate * state->ts_pchannels /
- state->ts_ad_info.ad_play.ad_int_rate;
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE_32("ts_start_play() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
-
- buf_size = samples * (state->ts_pprecision >> AUDIO_PRECISION_SHIFT);
- ASSERT((buf_size << 1) <= state->ts_pbuf_size);
-
- ATRACE("ts_start_play() getting 1st audio", NULL);
- bptr = state->ts_pb;
-
- mutex_exit(&state->ts_lock);
- rs = am_get_audio(state->ts_ahandle, &bptr[0], AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->ts_lock);
-
- if (rs == 0) {
- /* there's nothing to play */
- ATRACE("ts_start_play() nothing to play", NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
- ATRACE_32("ts_start_play() 1st am_get_audio()", rs);
- state->ts_pcnt[TS_1ST_HALF] = buf_size;
- state->ts_psamples[TS_1ST_HALF] = samples;
-
- ATRACE("ts_start_play() getting 2nd audio", NULL);
-
- mutex_exit(&state->ts_lock);
- rs = am_get_audio(state->ts_ahandle, &bptr[buf_size], AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->ts_lock);
-
- ATRACE_32("ts_start_play() 2nd am_get_audio()", rs);
- if (rs > 0) {
- state->ts_pcnt[TS_2ND_HALF] = buf_size;
- } else {
- state->ts_pcnt[TS_2ND_HALF] = 0;
- }
- state->ts_psamples[TS_2ND_HALF] = samples;
-
- /* sync the DMA buffer */
- if (ddi_dma_sync(state->ts_ph, (off_t)0, (off_t)0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_play() ddi_dma_sync() failed, audio lost");
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- /* set ALPHA and FMS to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_alpha_fms,
- 0x0);
-
- /* set CSO to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_cso, 0x0);
-
- /* set LBA */
- ddi_put32(handle, &state->ts_regs->aud_ram[str].aram.aram_cptr_lba,
- state->ts_pc.dmac_address & ARAM_LBA_MASK);
-
- /* set ESO */
- if (state->ts_pchannels == AUDIO_CHANNELS_MONO) {
- samples = (samples << 1) - 1;
- } else {
- samples--;
- }
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_eso, samples);
-
- /* enable interrupts */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_OUTPUT_CHANNEL);
-
- /* make sure it starts playing */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start,
- TS_OUTPUT_CHANNEL);
-
- state->ts_flags &= ~(TS_DMA_ENGINE_PAUSED|TS_DMA_ENGINE_EMPTY);
- state->ts_flags |= TS_DMA_ENGINE_INITIALIZED;
-
- ATRACE("ts_start_play() successful", state);
- ASSERT(rc == AUDIO_SUCCESS);
-
-done:
- ASSERT(mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_start_play() */
-
-/*
- * audiots_stop_play()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_stop_play(audiots_state_t *state)
-{
- ATRACE("in ts_stop_play()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
-
- AND_SET_WORD(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- ~TS_OUTPUT_CHANNEL);
-
- state->ts_flags &= ~(TS_DMA_ENGINE_INITIALIZED|TS_DMA_ENGINE_PAUSED|
- TS_DMA_ENGINE_EMPTY);
-
- ATRACE("ts_stop_play() returning", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_play() */
-
-/*
- * audiots_start_record()
- *
- * Description:
- * The record DMA engine works the same way as the play DMA engine.
- * Record cannot be multi-stream and must be on T2 channel 31.
- *
- * There isn't a pause for record, only start and stop. So this code
- * is a touch simpler than starting up play.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-/*ARGSUSED*/
-static int
-audiots_start_record(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- size_t buf_size;
- int rc = AUDIO_SUCCESS;
- int samples;
- int str = TS_INPUT_STREAM;
-
- ATRACE("in ts_start_record()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- handle = state->ts_handle;
-
- /* see if we are already recording */
- if ((ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_INPUT_CHANNEL)) {
- ATRACE("ts_start_record() DMA engine already running",
- state);
- ASSERT(rc == AUDIO_SUCCESS);
- return (rc);
- }
-
- /* okay, we start from scratch; start by figuring out sample sizes */
- samples = state->ts_csample_rate * state->ts_cchannels /
- state->ts_ad_info.ad_record.ad_int_rate;
- /* if not an even number of samples we panic! */
- if ((samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE_32("ts_start_record() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
-
- buf_size = samples * (state->ts_cprecision >> AUDIO_PRECISION_SHIFT);
- ASSERT((buf_size << 1) <= state->ts_cbuf_size);
-
- state->ts_ccnt = buf_size;
-
- /* set ALPHA and FMS to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_alpha_fms,
- 0x0);
-
- /* set CSO to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_cso, 0x0);
-
- /* set LBA */
- ddi_put32(handle, &state->ts_regs->aud_ram[str].aram.aram_cptr_lba,
- state->ts_cc.dmac_address & ARAM_LBA_MASK);
-
- /* set ESO */
- if (state->ts_cchannels == AUDIO_CHANNELS_MONO) {
- samples = (samples << 1) - 1;
- } else {
- samples--;
- }
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_eso, samples);
-
- /* enable interrupts */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_INPUT_CHANNEL);
-
- /* make sure it starts recording */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start, TS_INPUT_CHANNEL);
-
- state->ts_flags |= TS_DMA_RECORD_START;
-
- ATRACE("ts_start_record() done", NULL);
- ASSERT(rc == AUDIO_SUCCESS);
-
-done:
- ASSERT(mutex_owned(&state->ts_lock));
-
- if (rc == AUDIO_SUCCESS && (state->ts_flags & TS_PM_SUPPORTED)) {
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- }
-
- return (rc);
-
-} /* audiots_start_record() */
-
-/*
- * audiots_stop_record()
- *
- * Description:
- * This routine stops the record DMA engine. Any data in the buffer
- * is just thrown away. After all, we're done recording so there aren't
- * any apps that need audio.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_stop_record(audiots_state_t *state)
-{
- ddi_acc_handle_t handle = state->ts_handle;
-
- ATRACE("in ts_stop_record()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* stop recording */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_stop, TS_INPUT_CHANNEL);
-
- AND_SET_WORD(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- ~TS_INPUT_CHANNEL);
-
- state->ts_flags &= ~TS_DMA_RECORD_START;
-
- ATRACE("ts_stop_record() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_record() */
-
-/*
- * audiots_stop_everything()
- *
- * Description:
- * This routine disables the address engine interrupt for all 32 DMA
- * engines. Just to be sure, it then explicitly issues a stop command to
- * the address engine and envelope engines for all 32 channels.
- *
- * NOTE:
- * There is a hardware bug that generates a spurious interrupt when the DMA
- * engines are stopped. It's not consistent - it happens every 1 out of 6
- * stops or so. It will show up as a record interrupt. The problem is that
- * once the driver is detached or if the system goes into low power mode,
- * nobody will service that interrupt. The system will eventually become
- * unusable.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_stop_everything(audiots_state_t *state)
-{
- uint_t intr;
-
- ATRACE("in ts_stop_everything()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_ALL_DMA_ENGINES);
-
- intr = ddi_get32(state->ts_handle, &state->ts_regs->aud_regs.ap_aint);
- if (intr != 0) {
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_aint,
- intr);
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
- ATRACE("ts_stop_everything() clearing the bogus interrupt",
- intr);
-
- /*
- * Flag this interrupt for the audiots_intr() routine to claim,
- * but this interrupt doesn't need to be processed.
- */
- state->ts_flags |= TS_INTR_PENDING;
- }
-
- ATRACE("ts_stop_everything() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_everything() */
-
-/*
- * audiots_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocates the DMA handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * None
- */
-static void
-audiots_unmap_regs(audiots_state_t *state)
-{
- ATRACE("in ts_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->ts_ph);
- (void) ddi_dma_unbind_handle(state->ts_ch);
-
- ddi_dma_mem_free(&state->ts_pmh);
- ddi_dma_mem_free(&state->ts_cmh);
-
- ddi_dma_free_handle(&state->ts_ph);
- ddi_dma_free_handle(&state->ts_ch);
-
- ddi_regs_map_free(&state->ts_handle);
- ddi_regs_map_free(&state->ts_chandle);
-
- ATRACE("ts_unmap_regs() returning", state);
-
-} /* audiots_unmap_regs() */
diff --git a/usr/src/uts/common/io/audio/sada/framework/audio_support.c b/usr/src/uts/common/io/audio/sada/framework/audio_support.c
deleted file mode 100644
index 3d20b6a313..0000000000
--- a/usr/src/uts/common/io/audio/sada/framework/audio_support.c
+++ /dev/null
@@ -1,4209 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Audio Support Module
- *
- * This module is use by Audio Drivers that use the new audio driver
- * architecture. It provides common services to get and set data
- * structures used by Audio Drivers and Audio Personality Modules.
- * It provides the home for the audio_state_t structures, one per
- * audio device.
- *
- * Audio Drivers set their qinit structures to the open, close, info, put
- * and service routines in this module. Then this module determines
- * which Audio Personality Module to call to implement the read, write,
- * and ioctl semantics.
- *
- * This module supports persistent data across driver/module unloads
- * and reloads. The space_*() routines are used to save an main anchor
- * which points to a linked list of instance data structures. Each instance
- * data structure points to APM data structures for its instance. These
- * instance and APM persistent data structures are available only via the
- * main anchor.
- */
-
-#include <sys/note.h>
-#include <sys/varargs.h>
-#include <sys/stream.h>
-#include <sys/modctl.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/strsun.h>
-#include <sys/taskq.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/impl/audio_support_impl.h>
-
-/*
- * Solaris external defines.
- */
-extern pri_t minclsyspri;
-
-/*
- * External functions not declared in header files.
- */
-extern uintptr_t space_fetch(char *key);
-extern void space_free(char *key);
-extern int space_store(char *key, uintptr_t ptr);
-
-/* streams stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyreq))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyresp))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", datab))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", queue))
-
-/* other unshared/stable or no lock needed stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_channel))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_i_state))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_qptr))
-
-#ifdef DEBUG
-/*
- * Global audio tracing variables
- */
-audio_trace_buf_t audio_trace_buffer[AUDIO_TRACE_BUFFER_SIZE];
-kmutex_t audio_tb_lock;
-size_t audio_tb_siz = AUDIO_TRACE_BUFFER_SIZE;
-int audio_tb_pos = 0;
-uint_t audio_tb_seq = 0;
-#endif
-
-/*
- * Global hidden variables.
- */
-/* for persistent memory */
-static audio_inst_persist_t **audio_main_anchor = NULL;
-static char *audio_key_class = AUDIO_KEY_CLASS;
-
-static audio_inst_info_t *audio_drv_list_head;
- /* list of all registered drivers */
-
-/* locks */
-static kmutex_t audio_drv_list_lock; /* mutex to protect driver list */
-static kmutex_t audio_persist_lock; /* mutex to protect persistent data */
-_NOTE(MUTEX_PROTECTS_DATA(audio_drv_list_lock, audio_inst_info))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_main_anchor))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_inst_persist))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_apm_persist))
-
-/* console message logging */
-static kmutex_t audio_sup_log_lock;
-static char audio_sup_log_buf[256];
-_NOTE(MUTEX_PROTECTS_DATA(audio_sup_log_lock, audio_sup_log_buf))
-
-static audio_device_t audio_device_info = {
- AUDIO_NAME,
- AUDIO_VERSION,
- AUDIO_CONFIGURATION
-};
-
-/*
- * Local Support Routine Prototypes For Audio Support Module
- */
-static audio_inst_info_t *audio_sup_create_drv_entry(dev_info_t *);
-static audio_inst_info_t *audio_sup_lookup_drv_entry(dev_info_t *);
-static void audio_sup_free_drv_entry(dev_info_t *);
-static void audio_sup_free_apm_persist(audio_state_t *, audio_apm_persist_t *);
-static void audio_sup_free_inst_persist(audio_state_t *,
- audio_inst_persist_t *);
-static int audio_sup_persist(audio_state_t *, char *);
-
-static int audio_sup_wiocdata(queue_t *, mblk_t *, audio_ch_t *);
-static int audio_sup_wioctl(queue_t *, mblk_t *, audio_ch_t *);
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc audio_modlmisc = {
- &mod_miscops, /* drv_modops */
- AUDIO_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage audio_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&audio_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Standard loadable Module Configuration Entry Points
- */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when module is first loaded.
- * Global module locks are initialized here.
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
-#ifdef DEBUG
- /* initialize the trace lock */
- mutex_init(&audio_tb_lock, NULL, MUTEX_DRIVER, NULL);
-#endif
-
- /* standard linkage call */
- if ((error = mod_install(&audio_modlinkage)) != 0) {
- ATRACE_32("audiosup _init() error 1", error);
-#ifdef DEBUG
- mutex_destroy(&audio_tb_lock);
-#endif
- return (error);
-
- }
-
- /* init mutexes after we can't have any failures */
-
- /* initialize the instance list lock */
- mutex_init(&audio_drv_list_lock, NULL, MUTEX_DRIVER, NULL);
- /* log buffer mutex */
- mutex_init(&audio_sup_log_lock, NULL, MUTEX_DRIVER, NULL);
-
- /* persistent data mutex */
- mutex_init(&audio_persist_lock, NULL, MUTEX_DRIVER, NULL);
-
- ATRACE("audiosup _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- * Free resources that were allocated in _init().
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiosup _fini()", 0);
-
- /* all drivers must have unregistered */
- ASSERT(audio_drv_list_head == NULL);
-
- if ((error = mod_remove(&audio_modlinkage)) != 0) {
- ATRACE_32("audiosup _fini() mod_remove failed", error);
-
- return (error);
-
- }
-
- /* free instance list lock */
- mutex_destroy(&audio_drv_list_lock);
- /* free log lock */
- mutex_destroy(&audio_sup_log_lock);
- /* free persistent memory lock */
- mutex_destroy(&audio_persist_lock);
-
- ATRACE_32("audiosup _fini() successful", error);
-
-#ifdef DEBUG
- mutex_destroy(&audio_tb_lock);
-#endif
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&audio_modlinkage, modinfop);
-
- ATRACE_32("audiosup _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * Public Audio Device Independent Driver Entry Points
- *
- * Standard Driver Entry Points
- */
-
-/*
- * audio_sup_attach() and audio_sup_detach() are being replaced in the
- * next minor release of Solaris. Audio drivers must be modified to use
- * the new interfaces.
- */
-/*ARGSUSED*/
-audiohdl_t
-audio_sup_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audio_sup_reg_data_t data;
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
-
- return (audio_sup_register(dip, &data));
-
-} /* audio_sup_attach() */
-
-/*ARGSUSED*/
-int
-audio_sup_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
-{
- return (audio_sup_unregister(handle));
-}
-
-/*
- * audio_sup_register()
- *
- * Description:
- * This routine initializes structures used for an instance of an
- * audio driver. Persistent state storage is allocated and used to
- * store state when drivers are unloaded. This routine always allocates
- * a very small chunk of memory for each instance which we never free.
- *
- * Arguments:
- * dev_info_t *dip Ptr to the device's dev_info structure
- * audio_sup_reg_data_t *data Registration data
- *
- * Returns:
- * audiohdl_t Handle to the audio device is successful
- * NULL Attach failed
- */
-audiohdl_t
-audio_sup_register(dev_info_t *dip, audio_sup_reg_data_t *data)
-{
- audio_inst_info_t *instp; /* inst info pointer */
- audio_state_t *statep; /* instance state pointer */
- audio_ch_t *chptr; /* channel pointer */
- int i;
- int sup_chs;
-
- ATRACE("in audio_sup_register() dip", dip);
- ATRACE("audio_sup_register() version", data->asrd_version);
-
- /* make sure we have a supported version */
- if (data->asrd_version != AUDIOSUP_VERSION) {
- ATRACE("audio_sup_register() bad version", data->asrd_version);
- audio_sup_log(NULL, CE_WARN, "unsupported version: %d",
- data->asrd_version);
- return (NULL);
- }
-
- /* minors per inst - reserved audio channels */
- sup_chs = AUDIO_MINOR_PER_INST - AUDIO_NUM_DEVS;
- ATRACE_32("audio_sup_register() supported channels per device",
- sup_chs);
-
- /* register and get device instance number */
- if ((instp = audio_sup_create_drv_entry(dip)) == NULL) {
- ATRACE("audio_sup_register() "
- "audio_sup_create_drv_entry() failed", 0);
-
- return (NULL);
- }
-
- statep = &instp->ail_state;
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*statep))
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chptr))
-
- /*
- * WARNING: From here on all error returns must worry about the
- * driver list.
- *
- * Initialize the instance mutex and condition variables. Used to
- * allocate channels.
- */
- mutex_init(&statep->as_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&statep->as_cv, NULL, CV_DRIVER, NULL);
-
- /* initialize other state information */
- statep->as_dip = dip;
- statep->as_dev_instance = ddi_get_instance(dip);
- statep->as_major = ddi_driver_major(dip);
- statep->as_max_chs = sup_chs;
- statep->as_minors_per_inst = AUDIO_MINOR_PER_INST;
- statep->as_audio_reserved = AUDIO_NUM_DEVS;
-
- /* sanity check that we can use the device */
- ASSERT((sup_chs >= AUDIO_MIN_CLONE_CHS) &&
- (sup_chs <= AUDIO_CLONE_CHANLIM));
-
- /* setup persistent memory */
- if (audio_sup_persist(statep, data->asrd_key) == AUDIO_FAILURE) {
- ATRACE("audio_sup_register() couldn't set up persist mem", 0);
-
- goto error;
- }
-
- /*
- * WARNING: From here on we cannot fail. Otherwise we would have
- * to loop through the channel structures and clear those CVs
- * and locks.
- *
- * Initialize the channel structures.
- */
- ATRACE("audio_sup_register() # sup channels", sup_chs);
- for (i = 0, chptr = &statep->as_channels[0];
- i < sup_chs; i++, chptr++) {
- /* most everything is zero, do it quickly */
- bzero(chptr, sizeof (*chptr));
-
- /* now do the non-zero members */
- chptr->ch_statep = statep;
- chptr->ch_dev = NODEV;
- chptr->ch_info.ch_number = i;
- chptr->ch_info.dev_type = UNDEFINED;
-
- mutex_init(&chptr->ch_lock, NULL, MUTEX_DRIVER, NULL);
- mutex_init(&chptr->ch_adata_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&chptr->ch_cv, NULL, CV_DRIVER, NULL);
- }
-
- ATRACE_32("audio_sup_register() returning", statep->as_dev_instance);
-
-done:
- ATRACE("audio_sup_register() handle", statep);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*statep))
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chptr))
-
- return (AUDIO_STATE2HDL(statep));
-
-error:
- ATRACE("audio_sup_register() error", statep);
-
- mutex_destroy(&statep->as_lock);
- cv_destroy(&statep->as_cv);
-
- audio_sup_free_drv_entry(statep->as_dip);
-
- return (NULL);
-
-} /* audio_sup_register() */
-
-/*
- * audio_sup_unregister()
- *
- * Description:
- * This routine de-initializes structures used for an instance of the
- * of an audio driver. It doesn't really do too much.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * AUDIO_SUCCESS Detach successful
- * AUDIO_FAILURE Detach failed
- */
-int
-audio_sup_unregister(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_inst_persist_t *persistp;
-
- ATRACE("in audio_sup_unregister()", handle);
-
- /*
- * WARNING: From here on all error returns must worry about the
- * instance state structures.
- */
-
- /* get the state pointer for this instance */
- if ((statep = audio_sup_devinfo_to_state(statep->as_dip)) == NULL) {
- ATRACE("audio_sup_unregister() "
- "audio_sup_devinfo_to_state() failed", 0);
-
- return (AUDIO_FAILURE);
-
- }
-
- /*
- * Free the instance persistent data struct if it doesn't point to
- * any saved data.
- */
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
- ASSERT(audio_main_anchor);
-
- persistp = (audio_inst_persist_t *)statep->as_persistp;
-
- if (persistp->amp_apmp == NULL) {
- (void) audio_sup_free_inst_persist(statep, persistp);
- statep->as_persistp = NULL;
- }
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- /* remove the dip from the instance list */
- ATRACE("audio_sup_unregister() freeing instance", statep->as_dip);
- audio_sup_free_drv_entry(statep->as_dip);
-
- ATRACE("audio_sup_unregister() returning", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_unregister() */
-
-/*
- * audio_sup_open()
- *
- * Description:
- * This routine is called when the kernel wants to open an Audio Driver
- * channel. It figures out what kind of device it is and calls the
- * appropriate Audio Personality Module.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int flag Open flags
- * int sflag STREAMS flags
- * cred_t *credp Pointer to the user's credential struct.
- *
- * Returns:
- * 0 Successfully opened the device
- * errno Error number for failed open
- */
-int
-audio_sup_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t *chptr;
- audio_device_type_e type;
- int rc;
-
- ATRACE("in audio_sup_open()", q);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "audio_sup_open() audio_sup_devt_to_state() failed", 0);
-
- return (ENXIO);
-
- }
- ATRACE("audio_sup_open() statep", statep);
-
- /* get the device type */
- type = audio_sup_devt_to_ch_type(statep, *devp);
- ATRACE_32("audio_sup_open() type", type);
-
- /* get the APM info structure */
- if ((apm_infop = audio_sup_get_apm_info(statep, type)) == NULL) {
- ATRACE_32("audio_sup_open() audio_sup_get_apm_info() failed",
- type);
-
- return (ENXIO);
-
- }
- ATRACE("audio_sup_open() apm_infop", apm_infop);
-
- ASSERT(apm_infop->apm_open);
-
- rc = (*apm_infop->apm_open)(q, devp, flag, sflag, credp);
-
- if (rc == AUDIO_SUCCESS) {
- /* open was successful, make sure we've got routines */
- chptr = (audio_ch_t *)audio_sup_get_qptr_data(q);
- if (chptr == NULL ||
- chptr->ch_wput == NULL || chptr->ch_wsvc == NULL ||
- chptr->ch_rput == NULL || chptr->ch_rsvc == NULL) {
- ATRACE("audio_sup_open() bad open", chptr);
- /* close the device */
- (*apm_infop->apm_close)(q, flag, credp);
- rc = EIO;
- }
- }
-
- return (rc);
-
-} /* audio_sup_open() */
-
-/*
- * audio_sup_close()
- *
- * Description:
- * This routine is called when the kernel wants to close an Audio Driver
- * channel. It figures out what kind of device it is and calls the
- * appropriate Audio Personality Module.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag Open flags
- * cred_t *credp Pointer to the user's credential struct.
- *
- * Returns:
- * 0 Successfully closed the device
- * errno Error number for failed close
- */
-int
-audio_sup_close(queue_t *q, int flag, cred_t *credp)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_close()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (EIO);
- }
-
- ASSERT(chptr->ch_apm_infop);
- ASSERT(chptr->ch_apm_infop->apm_close);
- ATRACE("audio_sup_close() chptr->ch_apm_infop", chptr->ch_apm_infop);
-
- return ((*chptr->ch_apm_infop->apm_close)(q, flag, credp));
-
-} /* audio_sup_open() */
-
-/*
- * audio_sup_restore_state()
- *
- * Description:
- * Restore the state of the hardware that the specified APM controls.
- * The specified APM is called to do the restore. It is up to that
- * APM's restore state function to restart the hardware or not. The
- * APM also deals with the direction. If anything keeps the state from
- * being restored then AUDIO_FAILURE is returned. If AUDIO_ALL_DEVICES
- * is sent then if any one APM fails the whole call fails. It is also
- * a failure to restore an APM that doesn't have an apm_restore_state()
- * function, which is optional.
- *
- * Arguments:
- * audiohdl_t handle Device handle
- * audio_device_type_e device The device to restore
- * int dir The direction to restore
- *
- * Returns:
- * AUDIO_SUCCESS State restored
- * AUDIO_FAILURE State not restored
- */
-int
-audio_sup_restore_state(audiohdl_t handle, audio_device_type_e device, int dir)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- int found;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- ATRACE("in audio_sup_restore_state()", handle);
- ATRACE_32("audio_sup_restore_state() device", device);
-
- if (statep == NULL) {
- ATRACE("audio_sup_restore_state() no statep", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- if ((dir & AUDIO_BOTH) == 0) {
- ATRACE_32("audio_sup_restore_state() no direction", dir);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&statep->as_lock);
- if ((apm_infop = statep->as_apm_info_list) == NULL) {
- /* nothing to restore, so this is an error */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_restore_state() no apm list", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- mutex_exit(&statep->as_lock);
-
- /* go through the list looking for APMs that match this device */
- for (found = 0; apm_infop != NULL; apm_infop = apm_infop->apm_next) {
- /* does this APM match? */
- if (device != AUDIO_ALL_DEVICES &&
- device != apm_infop->apm_type) {
- /* nope, it doesn't, so get the next one */
- ATRACE_32("audio_sup_restore_state() not this one",
- apm_infop->apm_type);
- continue;
- }
-
- /* does this APM have a restore function? */
- if (apm_infop->apm_restore_state == NULL) {
- /* if AUDIO_ALL_DEVICES then it's okay to be NULL */
- if (device == AUDIO_ALL_DEVICES) {
- ATRACE("audio_sup_restore_state() NULL", 0);
- continue;
- } else {
- ATRACE("audio_sup_restore_state() fail NULL",
- 0);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- }
-
- /* this is ours, so call it */
- ATRACE("audio_sup_restore_state() calling restore",
- apm_infop->apm_restore_state);
- if ((*apm_infop->apm_restore_state)(statep, apm_infop, dir) ==
- AUDIO_FAILURE) {
- ATRACE("audio_sup_restore_state() restore failed",
- apm_infop->apm_restore_state);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- ATRACE_32("audio_sup_restore_state() restore succeeded",
- apm_infop->apm_type);
-
- /* are we done? */
- if (device != AUDIO_ALL_DEVICES) {
- /* yes, just a single device to restore */
- ATRACE_32(
- "audio_sup_restore_state() single dev success",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_SUCCESS);
- }
- }
-
- /* if we specify the device then it's possible it wasn't there, so ck */
- if (device != AUDIO_ALL_DEVICES && !found) {
- ATRACE_32("audio_sup_restore_state() single device not found",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- /*
- * Either we found the single device or we looked at all the devices
- * and they succeeded. Even if there wasn't a single restore function
- * to call when AUDIO_ALL_DEVICES was specified we still succeeded.
- */
-
- ATRACE_32("audio_sup_restore_state() all devices found", device);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_restore_state() */
-
-/*
- * audio_sup_save_state()
- *
- * Description:
- * Save the state of the hardware that the specified APM controls.
- * The specified APM is called to do the save. It is up to that
- * APM's save state function to define any interaction with the
- * hardware. If anything keeps the state from being saved then
- * AUDIO_FAILURE is returned. If AUDIO_ALL_DEVICES is sent then if
- * any one APM fails the whole call fails. It is also a failure to
- * save an APM that doesn't have an apm_save_state() function, which
- * is optional.
- *
- * Arguments:
- * audiohdl_t handle Device handle
- * audio_device_type_e device The device to save
- * int dir The direction to save
- *
- * Returns:
- * AUDIO_SUCCESS State save
- * AUDIO_FAILURE State not save
- */
-int
-audio_sup_save_state(audiohdl_t handle, audio_device_type_e device, int dir)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- int found;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- ATRACE("in audio_sup_save_state()", handle);
- ATRACE_32("audio_sup_save_state() device", device);
-
- if (statep == NULL) {
- ATRACE("audio_sup_save_state() no statep", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- if ((dir & AUDIO_BOTH) == 0) {
- ATRACE_32("audio_sup_save_state() no direction", dir);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&statep->as_lock);
- if ((apm_infop = statep->as_apm_info_list) == NULL) {
- /* nothing to save, so this is an error */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_save_state() no apm list", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- mutex_exit(&statep->as_lock);
-
- /* go through the list looking for APMs that match this device */
- for (found = 0; apm_infop != NULL; apm_infop = apm_infop->apm_next) {
- /* does this APM match? */
- if (device != AUDIO_ALL_DEVICES &&
- device != apm_infop->apm_type) {
- /* nope, it doesn't, so get the next one */
- ATRACE_32("audio_sup_save_state() not this one",
- apm_infop->apm_type);
- continue;
- }
-
- /* does this APM have a save function? */
- if (apm_infop->apm_save_state == NULL) {
- /* if AUDIO_ALL_DEVICES then it's okay to be NULL */
- if (device == AUDIO_ALL_DEVICES) {
- ATRACE("audio_sup_save_state() NULL", 0);
- continue;
- } else {
- ATRACE("audio_sup_save_state() fail NULL",
- 0);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- }
-
- /* this is ours, so call it */
- ATRACE("audio_sup_save_state() calling save",
- apm_infop->apm_save_state);
- if ((*apm_infop->apm_save_state)(statep, apm_infop, dir) ==
- AUDIO_FAILURE) {
- ATRACE("audio_sup_save_state() save failed",
- apm_infop->apm_save_state);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- ATRACE_32("audio_sup_save_state() save succeeded",
- apm_infop->apm_type);
-
- /* are we done? */
- if (device != AUDIO_ALL_DEVICES) {
- /* yes, just a single device to save */
- ATRACE_32(
- "audio_sup_save_state() single dev success",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_SUCCESS);
- }
- }
-
- /* if we specify the device then it's possible it wasn't there, so ck */
- if (device != AUDIO_ALL_DEVICES && !found) {
- ATRACE_32("audio_sup_save_state() single device not found",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- /*
- * Either we found the single device or we looked at all the devices
- * and they succeeded. Even if there wasn't a single save function
- * to call when AUDIO_ALL_DEVICES was specified we still succeeded.
- */
-
- ATRACE_32("audio_sup_save_state() all devices found", device);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_save_state() */
-
-/*
- * audio_sup_getinfo()
- *
- * XXX this function is incorrect and should be obsoleted
- *
- * Description:
- * Get driver information.
- *
- * Arguments:
- * def_info_t *dip Pointer to the device's dev_info structure
- * WARNING: Don't use this dev_info structure
- * ddi_info_cmd_t infocmd Getinfo command
- * void *arg Command specific argument
- * void **result Pointer to the requested information
- *
- * Returns:
- * DDI_SUCCESS The information could be returned
- * DDI_FAILURE The information couldn't be returned
- */
-/*ARGSUSED*/
-int
-audio_sup_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
- void **result)
-{
- int error;
- int instance = 0;
- audio_state_t *statep;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- statep = audio_sup_devt_to_state((dev_t)arg);
- if ((statep == NULL) || (statep->as_dip == NULL)) {
- error = DDI_FAILURE;
- } else {
- *result = (void *)statep->as_dip;
- error = DDI_SUCCESS;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- instance = AUDIO_MINOR_TO_INST((dev_t)arg);
- *result = (void *)(uintptr_t)instance;
-
- if (*result != NULL) {
- error = DDI_SUCCESS;
- } else {
- error = DDI_FAILURE;
- }
- break;
-
- default:
- error = DDI_FAILURE;
- break;
- }
-
- return (error);
-
-} /* audio_sup_getinfo() */
-
-/*
- * audio_sup_rput()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_rput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_rput()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_rput() bad chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_rput);
-
- ATRACE("audio_sup_rput() calling ch_rput()", chptr);
-
- rc = chptr->ch_rput(q, mp);
-
- ATRACE_32("audio_sup_rput() ch_rput() returned", rc);
-
- return (rc);
-
-} /* audio_sup_rput() */
-
-/*
- * audio_sup_rsvc()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_rsvc(queue_t *q)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_rsvc()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_rsvc() null chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_rsvc);
-
- ATRACE("audio_sup_rsvc() calling ch_rsvc()", chptr);
-
- rc = chptr->ch_rsvc(q);
-
- ATRACE_32("audio_sup_rsvc() ch_rsvc() returned", rc);
-
- return (rc);
-
-} /* audio_sup_rsvc() */
-
-/*
- * audio_sup_wput()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_wput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr;
- audio_i_state_t *cmd;
- struct iocblk *iocbp;
- struct copyresp *csp;
- int rc = 0;
-
- ATRACE("in audio_sup_wput()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_wput);
-
- /* pick off the audio support ioctls, there aren't very many */
- ATRACE_32("audio_sup_wput() type", mp->b_datap->db_type);
- switch (mp->b_datap->db_type) {
-
- case M_IOCTL:
- ATRACE("audio_sup_wput() IOCTL ", chptr);
- iocbp = (struct iocblk *)mp->b_rptr; /* ptr to ioctl info */
-
- switch (iocbp->ioc_cmd) {
- case AUDIO_GET_CH_NUMBER:
- case AUDIO_GET_CH_TYPE:
- case AUDIO_GET_NUM_CHS:
- case AUDIO_GET_AD_DEV:
- case AUDIO_GET_APM_DEV:
- case AUDIO_GET_AS_DEV:
- ATRACE_32("audio_sup_wput() "
- "IOCTL calling audio_sup_wioctl()", iocbp->ioc_cmd);
- rc = audio_sup_wioctl(q, mp, chptr);
- break;
- default:
- ATRACE("audio_sup_wput() IOCTL calling ch_wput()",
- chptr);
- rc = chptr->ch_wput(q, mp);
- }
- break;
- case M_IOCDATA:
- ATRACE("audio_sup_wput() IOCDATA ", chptr);
- iocbp = (struct iocblk *)mp->b_rptr; /* ptr to ioctl info */
- csp = (struct copyresp *)mp->b_rptr; /* copy response ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
-
- if (cmd == NULL) {
- ATRACE("audio_sup_wput() M_IOCDATA NULL cmd calling "
- "ch_wput()", chptr);
- csp->cp_rval = 0;
- rc = chptr->ch_wput(q, mp);
- break;
- }
-
- switch (cmd->ais_command) {
- case AUDIO_COPY_OUT_CH_NUMBER:
- case AUDIO_COPY_OUT_CH_TYPE:
- case AUDIO_COPY_OUT_NUM_CHS:
- case AUDIO_COPY_OUT_AD_DEV:
- case AUDIO_COPY_OUT_APM_DEV:
- case AUDIO_COPY_OUT_AS_DEV:
- ATRACE_32("audio_sup_wput() "
- "IOCDATA calling audio_sup_wiocdata()",
- cmd->ais_command);
- rc = audio_sup_wiocdata(q, mp, chptr);
- break;
- default:
- ATRACE("audio_sup_wput() IOCDATA calling ch_wput()",
- chptr);
- rc = chptr->ch_wput(q, mp);
- }
- break;
- default:
- ATRACE("audio_sup_wput() calling ch_wput()", chptr);
- rc = chptr->ch_wput(q, mp);
- }
-
- ATRACE_32("audio_sup_wput() ch_wput() returned", rc);
-
- return (rc);
-
-} /* audio_sup_wput() */
-
-/*
- * audio_sup_wsvc()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_wsvc(queue_t *q)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_wsvc()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_wsvc() bad chptr", 0);
- return (EIO);
- }
- ASSERT(chptr->ch_wsvc);
-
- ATRACE("audio_sup_wsvc() calling ch_wsvc()", chptr);
-
- rc = chptr->ch_wsvc(q);
-
- ATRACE_32("audio_sup_wsvc() ch_wsvc() returned", rc);
-
- return (rc);
-
-} /* audio_sup_wsvc() */
-
-/*
- * Public Audio Personality Module Support Routines
- *
- * Channel Routines
- */
-
-/*
- * audio_sup_alloc_ch()
- *
- * Description:
- * Go through the list of channels. Find the first one that isn't
- * assigned and take it. If there aren't any channels then depending
- * on the flags either wait for a channel to become free or return
- * NULL
- *
- * CAUTION: Make sure *error is always set before returning.
- *
- * NOTE: This routine expects the Audio Personality Module to fill in
- * all the members of the audio_ch_t structure.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * int *error Error code
- * audio_device_type_e type The device type
- * int flags AUDIO_NO_SLEEP or AUDIO_SLEEP
- *
- * Returns:
- * valid pointer to ch Channel allocated
- * NULL Channel not allocated
- */
-audio_ch_t *
-audio_sup_alloc_ch(audio_state_t *statep, int *error, audio_device_type_e type,
- int flags)
-{
- audio_ch_t *chptr;
- audio_apm_info_t *apm_infop;
- int i;
- int max_chs = statep->as_max_chs;
- int rc;
-
- ATRACE("in audio_sup_alloc_ch()", statep);
-
- ASSERT((flags & (AUDIO_NO_SLEEP|AUDIO_SLEEP)) !=
- (AUDIO_NO_SLEEP|AUDIO_SLEEP));
-
- /* make sure there's an apm_infop for the type */
- if ((apm_infop = audio_sup_get_apm_info(statep, type)) == NULL) {
- ATRACE("audio_sup_alloc_ch() audio_sup_get_apm_info() failed",
- statep);
- *error = EIO;
-
- return (NULL);
-
- }
-
- /* find the first unused channel */
- mutex_enter(&statep->as_lock);
-
- /* cv_broadcast() means we may need to try many times */
- while (statep->as_ch_inuse >= max_chs) {
- /* no channels available right now, do we wait? */
- if (flags & AUDIO_NO_SLEEP) {
- /* don't wait for a channel to become free */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_alloc_ch() no ch return", 0);
- *error = EBUSY;
-
- return (NULL);
-
- }
-
- /* wait for a channel to become free */
- rc = cv_wait_sig(&statep->as_cv, &statep->as_lock);
- if (rc <= 0) {
- ATRACE("audio_sup_alloc_ch() max chs signal wakeup",
- statep);
- /*
- * This channel may have had a signal, but that doesn't
- * mean any of the other channels may proceed. So make
- * sure every channel gets another go.
- */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_alloc_ch() no ch sig return", 0);
- *error = EINTR;
-
- return (NULL);
-
- }
- }
-
- /* we've got a channel, so find it */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
- mutex_enter(&chptr->ch_lock);
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED)) {
- /* found it! */
- mutex_exit(&chptr->ch_lock);
- break;
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chptr))
- ASSERT(i <= max_chs);
- ASSERT(i == chptr->ch_info.ch_number);
- ASSERT(statep == chptr->ch_statep);
-
- ATRACE("audio_sup_alloc_ch() found channel", chptr);
-
- chptr->ch_info.dev_type = type;
- chptr->ch_apm_infop = apm_infop;
- chptr->ch_flags |= AUDIO_CHNL_ALLOCATED;
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chptr))
-
- /* just to be sure */
- mutex_enter(&chptr->ch_adata_lock);
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
- chptr->ch_adata_cnt = 0;
- mutex_exit(&chptr->ch_adata_lock);
-
- statep->as_ch_inuse++; /* inc. the number of allocated chs */
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_alloc_ch() returning", chptr);
-
- *error = 0; /* no errors */
-
- return (chptr);
-
-} /* audio_sup_alloc_ch() */
-
-/*
- * audio_sup_free_ch()
- *
- * Description:
- * This routine returns a channel structure to the device instance's
- * pool of channel structures. All the various pointers must be freed
- * and NULLed before this routine is called. It then does a cv_broadcast()
- * to wake up any cv_wait()/cv_wait_sig() calls which might be waiting
- * for a channel to be freed.
- *
- * Arguments:
- * audio_ch_t *chptr The channel structure to free
- *
- * Returns:
- * AUDIO_SUCCESS No error
- * AUDIO_FAILURE One of the pointers is not set to NULL or
- * chptr is not valid
- */
-int
-audio_sup_free_ch(audio_ch_t *chptr)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
-
- ATRACE("in audio_sup_free_ch()", chptr);
-
- if (chptr == NULL) {
- ATRACE("audio_sup_free_ch() chptr == NULL", chptr);
-
- return (AUDIO_FAILURE);
- }
-
- statep = chptr->ch_statep;
- apm_infop = chptr->ch_apm_infop;
-
- ASSERT(chptr->ch_statep == statep);
- ASSERT(apm_infop != NULL);
-
- /* finally, clear the channel structure and make available for reuse */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
-#ifdef DEBUG
- mutex_enter(&chptr->ch_adata_lock);
- ASSERT(chptr->ch_adata_cnt == 0);
- mutex_exit(&chptr->ch_adata_lock);
-#endif
-
- ATRACE("audio_sup_free_ch() chptr", chptr);
- ATRACE("audio_sup_free_ch() ch_private", chptr->ch_private);
- ATRACE("audio_sup_free_ch() ch_info.info", chptr->ch_info.info);
-
- if (chptr->ch_private) {
- ATRACE("audio_sup_free_ch() chptr->ch_private != NULL",
- chptr->ch_private);
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
-
- }
- if (chptr->ch_info.info) {
- ATRACE("audio_sup_free_ch() chptr->ch_info.info != NULL",
- chptr->ch_info.info);
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
-
- }
-
- /* free the message list */
- ATRACE("audio_sup_free_ch() freeing saved messages", chptr);
- audio_sup_flush_audio_data(chptr);
-
- chptr->ch_flags = 0;
- chptr->ch_info.pid = 0;
-
- statep->as_ch_inuse--;
-
- ATRACE("audio_sup_free_ch() resetting channel info", chptr);
-
- chptr->ch_qptr = NULL;
- mutex_enter(&chptr->ch_adata_lock);
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
- chptr->ch_adata_cnt = 0;
- mutex_exit(&chptr->ch_adata_lock);
- chptr->ch_apm_infop = NULL;
- chptr->ch_wput = NULL;
- chptr->ch_wsvc = NULL;
- chptr->ch_rput = NULL;
- chptr->ch_rsvc = NULL;
- chptr->ch_dir = 0;
- chptr->ch_dev = NODEV;
- chptr->ch_info.dev_type = UNDEFINED;
-
- mutex_exit(&chptr->ch_lock);
-
- /* the channel is freed, so send the broadcast */
-
- cv_broadcast(&statep->as_cv);
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_ch() returning success", statep);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_free_ch() */
-
-/*
- * Persistent Memory Routines
- */
-
-/*
- * audio_sup_get_persist_state()
- *
- * Description:
- * Search through the linked list of audio_apm_persist data structures
- * for this driver instance's persistent data for the specifed audio
- * personality module.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to set data for
- *
- * Returns:
- * valid pointer Pointer to the saved data
- * NULL Couldn't find the data
- */
-void *
-audio_sup_get_persist_state(audio_state_t *statep, audio_device_type_e dev_type)
-{
- audio_inst_persist_t *instp;
- audio_apm_persist_t *tmp;
- void *ret_ptr;
-
- ATRACE("in audio_sup_get_persist_state()", statep);
- ATRACE_32("audio_sup_get_persist_state() dev_type", dev_type);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
-
- ASSERT(statep->as_persistp);
- instp = statep->as_persistp;
-
- for (tmp = instp->amp_apmp; tmp; tmp = tmp->ap_next) {
- if (tmp->ap_apm_type == dev_type) {
- ret_ptr = tmp->ap_data; /* make warlock happy */
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_get_persist_state() found state",
- ret_ptr);
- return (ret_ptr);
- }
- }
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- return (NULL);
-
-} /* audio_sup_get_persist_state() */
-
-/*
- * audio_sup_free_persist_state()
- *
- * Description:
- * Search through the linked list of audio_apm_persist data structures
- * for this driver instance's persistent data for the specifed audio
- * personality module. When found remove it from the linked list and
- * free it.
- *
- * If the dev_type is set to AUDIO_ALL_DEVICES then we free all of
- * the entries.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to free data for
- *
- * Returns:
- * AUDIO_SUCCESS Memory freed
- * AUDIO_FAILURE Memory not found to free
- */
-int
-audio_sup_free_persist_state(audio_state_t *statep,
- audio_device_type_e dev_type)
-{
- audio_apm_persist_t **plist;
- audio_apm_persist_t *list;
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_free_persist_state()", statep);
- ATRACE_32("audio_sup_free_persist_state() dev_type", dev_type);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
- plist = &((audio_inst_persist_t *)statep->as_persistp)->amp_apmp;
-
- if (*plist == NULL) {
- /* no items on the list */
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_free_persist_state() empty list", plist);
- return (AUDIO_FAILURE);
- }
-
- list = *plist;
-
- /* see if we clear all, or just one that matches dev_type */
- if (dev_type == AUDIO_ALL_DEVICES) {
- /* clear all of them */
- ATRACE("audio_sup_free_persist_state() clear all", plist);
- while (list) {
- tmp = list;
- list = list->ap_next;
- kmem_free(tmp->ap_data, tmp->ap_size);
- kmem_free(tmp, sizeof (*tmp));
- }
- ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp = NULL;
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_persist_state() free all done", statep);
-
- return (AUDIO_SUCCESS);
-
- } else {
- /* clear just the match */
- ATRACE("audio_sup_free_persist_state() clear match", dev_type);
- while (list) {
- if (list->ap_apm_type == dev_type) {
- /* remove from the linked list */
- *plist = list->ap_next;
-
- ATRACE("audio_sup_free_persist_state() "
- "freeing state", list);
-
- kmem_free(list->ap_data, list->ap_size);
- kmem_free(list, sizeof (*list));
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_SUCCESS);
- }
- plist = &list->ap_next;
- list = list->ap_next;
- }
- }
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_persist_state() not found, failed", 0);
-
- return (AUDIO_FAILURE);
-
-} /* audio_sup_free_persist_state() */
-
-/*
- * audio_sup_set_persist_state()
- *
- * Description:
- * Search through the list to see if we already have data for this
- * APM type. If so then free it, then update with the new data. If
- * the APM type isn't found then allocate an audio_apm_persist_t
- * structure and add to the list.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to set data for
- * void *state_data The data to save
- * size_t state_size Size of the persistent data
- *
- * Returns:
- * AUDIO_SUCCESS Successfully set persistent state info
- * AUDIO_FAILURE Couldn't set persistent state info
- */
-int
-audio_sup_set_persist_state(audio_state_t *statep, audio_device_type_e dev_type,
- void *state_data, size_t state_size)
-{
- audio_apm_persist_t *anchor;
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_set_persist_state() statep", statep);
- ATRACE_32("audio_sup_set_persist_state() dev_type", dev_type);
- ATRACE("audio_sup_set_persist_state() data", state_data);
- ATRACE("audio_sup_set_persist_state() size", state_size);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
-
- ASSERT(statep->as_persistp);
-
- /* get the anchor */
- anchor = ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp;
-
- /* look for a matching device type */
- for (tmp = anchor; tmp; tmp = tmp->ap_next) {
- if (tmp->ap_apm_type == dev_type) {
- ATRACE("audio_sup_set_persist_state() found tmp", tmp);
- break;
- }
- }
-
- /*
- * If not found or first on list then allocate a new structure and
- * place on the list.
- */
- if (tmp == NULL) {
- /* allocate an audio_apm_persist struct */
- tmp = kmem_alloc(sizeof (*tmp), KM_SLEEP);
- tmp->ap_apm_type = dev_type;
-
- /* and place at the beginning of the list */
- tmp->ap_next = anchor;
- ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp = tmp;
- } else {
- /* we found on the list, so free old data */
- kmem_free(tmp->ap_data, tmp->ap_size);
- }
-
- /* update the rest of the new data structure */
- tmp->ap_data = state_data;
- tmp->ap_size = state_size;
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_set_persist_state() new return", tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_set_persist_state() */
-
-/*
- * Device Independent Driver Registration Routines
- */
-
-/*
- * audio_sup_register_apm()
- *
- * Description:
- * Register the Audio Personality Module with this instance of the
- * Audio Driver. This provides a place to store state information
- * for the APM.
- *
- * We only allow one instance of an APM present for each instance of
- * an Audio Driver.
- *
- * NOTE: Instance and type are mandatory.
- *
- * NOTE: It is okay for memory allocation to sleep.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e type APM type
- * audio_apm_reg_t *reg_info Ptr to APM registration information
- *
- * Returns:
- * valid pointer The audio_apm_info structure registered
- * NULL Couldn't register the APM
- */
-audio_apm_info_t *
-audio_sup_register_apm(audio_state_t *statep, audio_device_type_e type,
- audio_apm_reg_t *reg_info)
-{
- audio_apm_info_t *apm_infop;
- audio_apm_info_t *tmp_apm_infop;
-
- ATRACE_32("in audio_sup_register_apm()", type);
-
- /* make sure the registration information data structure is okay */
- if (reg_info->aar_version != AM_AAR_VERSION) {
- ATRACE("audio_sup_register_apm() bad version",
- reg_info->aar_version);
- return (NULL);
- }
-
- /* we must have an open() and close() routine */
- if (reg_info->aar_apm_open == NULL || reg_info->aar_apm_close == NULL) {
- ATRACE("audio_sup_register_apm() aar_apm_open()",
- reg_info->aar_apm_open);
- ATRACE("audio_sup_register_apm() apm_close()",
- reg_info->aar_apm_close);
-
- return (NULL);
-
- }
-
- /* allocate the structure now so we won't sleep with as_lock held */
- tmp_apm_infop = kmem_zalloc(sizeof (*tmp_apm_infop), KM_SLEEP);
-
- /* first make sure we haven't already registered this type before */
- mutex_enter(&statep->as_lock);
-
- for (apm_infop = statep->as_apm_info_list; apm_infop != NULL;
- apm_infop = apm_infop->apm_next) {
- if (apm_infop->apm_type == type) {
- mutex_exit(&statep->as_lock);
- kmem_free(tmp_apm_infop, sizeof (*tmp_apm_infop));
- ATRACE("audio_sup_register_apm() "
- "duplicate diaudio type", 0);
-
- return (NULL);
-
- }
- }
- apm_infop = tmp_apm_infop;
-
- ATRACE("audio_sup_register_apm() not a duplicate, ok to continue", 0);
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- mutex_init(&apm_infop->apm_lock, NULL, MUTEX_DRIVER, NULL);
-
- apm_infop->apm_open = reg_info->aar_apm_open;
- apm_infop->apm_close = reg_info->aar_apm_close;
- apm_infop->apm_restore_state = reg_info->aar_apm_restore_state;
- apm_infop->apm_save_state = reg_info->aar_apm_save_state;
- apm_infop->apm_info = reg_info->aar_dev_info;
- apm_infop->apm_type = type;
- apm_infop->apm_private = reg_info->aar_private;
- apm_infop->apm_ad_infop = reg_info->aar_info;
- apm_infop->apm_ad_state = reg_info->aar_state;
-
- /* put at the head of the list */
- apm_infop->apm_next = statep->as_apm_info_list;
- statep->as_apm_info_list = apm_infop;
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_register_apm() returning successful", apm_infop);
-
- return (apm_infop);
-
-} /* audio_sup_register_apm() */
-
-/*
- *
- * Description:
- * Unregister the Audio Personality Module from this instance of the
- * Audio Driver. If the APM wasn't registered we silently and
- * successfully fail and return. Otherwise we free the structure which
- * represents the APM. However, if the private data wasn't freed we
- * fail.
- *
- * Arguments:
- * audio_state_t *statep device state structure
- * audio_device_type_e type APM type
- *
- * Returns:
- * AUDIO_SUCCESS APM unregistered
- * AUDIO_FAILURE APM private data not freed
- */
-int
-audio_sup_unregister_apm(audio_state_t *statep, audio_device_type_e type)
-{
- audio_apm_info_t *apm_infop;
- audio_apm_info_t **papm_infop;
-
- ATRACE_32("in audio_sup_unregister_apm()", type);
-
- /* protect the personality module list */
- mutex_enter(&statep->as_lock);
-
- papm_infop = &statep->as_apm_info_list;
- apm_infop = *papm_infop;
-
- while (apm_infop) {
- if (apm_infop->apm_type == type) {
- break;
- }
- papm_infop = &apm_infop->apm_next;
- apm_infop = *papm_infop;
- }
- ATRACE("audio_sup_unregister_apm() while done", apm_infop);
-
- /* type not found on the list or the list is empty */
- if (apm_infop == NULL) {
- mutex_exit(&statep->as_lock);
- ATRACE_32("audio_sup_unregister_apm() not found on list", type);
-
- return (AUDIO_SUCCESS);
-
- }
-
- /* make sure the private data has been freed */
- if (apm_infop->apm_private) {
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_unregister_apm() private data not cleared",
- apm_infop->apm_private);
-
- return (AUDIO_FAILURE);
-
- }
- ATRACE("audio_sup_unregister_apm() ok to unreregister", apm_infop);
-
- /* remove the item by bypassing it */
- *papm_infop = apm_infop->apm_next;
-
- /* APM off the list, so okay to release the lock */
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_unregister_apm() freeing apm_infop", apm_infop);
- mutex_destroy(&apm_infop->apm_lock);
- kmem_free(apm_infop, sizeof (*apm_infop));
-
- ATRACE("audio_sup_unregister_apm() done", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_unregister_apm() */
-
-/*
- * Audio task queue routines
- */
-
-/*
- * audio_sup_taskq_create()
- *
- * Description:
- * Wrapper to abstract the creation of a kernel taskq. We pick some
- * defaults that make sense for audio, such as single threaded.
- *
- * Arguments:
- * const char *q_name Name of the task queue to create
- *
- * Returns:
- * handle Queue successfully created
- * NULL Couldn't allocate structs, failed
- */
-audio_taskq_t
-audio_sup_taskq_create(const char *q_name)
-{
- taskq_t *tq;
-
- ATRACE("in audio_sup_taskq_create()", q_name);
-
- tq = taskq_create(q_name, AUDIO_SUP_TASKQ_NTHREADS, minclsyspri,
- AUDIO_SUP_TASKQ_MINALLOC, AUDIO_SUP_TASKQ_MAXALLOC,
- TASKQ_PREPOPULATE);
-
- ATRACE("audio_sup_taskq_create() returning", tq);
-
- return (AUDIO_TQHDL2AUDIOTQHDL(tq));
-
-} /* audio_sup_taskq_create() */
-
-/*
- * audio_sup_taskq_destroy()
- *
- * Description:
- * Destroy the taskq.
- *
- * CAUTION: If the taskq is used after destroying then the system
- * will probably panic
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to destroy
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_destroy(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_destroy()", tq_handle);
-
- taskq_destroy(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_destroy() returning", tq_handle);
-
-} /* audio_sup_taskq_destroy() */
-
-/*
- * audio_sup_taskq_dispatch()
- *
- * Description:
- * Dispatch a task. The task_function pointer must not be NULL.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to destroy
- * void (*)() task_function Ptr to the function to execute
- * void *arg Ptr to argument for task_function
- * int sleep KM_SLEEP or KM_NOSLEEP
- *
- * Returns:
- * AUDIO_SUCCESS Task scheduled
- * AUDIO_FAILURE Task not scheduled or bad task_function
- * or bad sleep flags
- */
-int
-audio_sup_taskq_dispatch(audio_taskq_t tq_handle,
- void (*task_function)(void *arg), void *arg, int sleep)
-{
- taskq_t *tq;
- taskqid_t tid;
-
- ATRACE("in audio_sup_taskq_dispatch()", tq_handle);
-
- if (task_function == NULL) {
- ATRACE("audio_sup_taskq_dispatch() NULL function", tq_handle);
- return (AUDIO_FAILURE);
- }
-
- if (sleep != KM_SLEEP && sleep != KM_NOSLEEP) {
- ATRACE_32("audio_sup_taskq_dispatch() bad sleep", sleep);
- return (AUDIO_FAILURE);
- }
-
- tq = AUDIO_AUDIOTQHDL2TQHDL(tq_handle);
-
- if ((tid = taskq_dispatch(tq, task_function, arg, sleep))) {
- ATRACE("audio_sup_taskq_dispatch() successful", tid);
- return (AUDIO_SUCCESS);
- } else {
- ATRACE("audio_sup_taskq_dispatch() failed", tid);
- return (AUDIO_FAILURE);
- }
-
-} /* audio_sup_taskq_dispatch() */
-
-/*
- * audio_sup_taskq_resume()
- *
- * Description:
- * Resume task execution.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_resume(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_resume()", tq_handle);
-
- taskq_resume(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_resume() returning", tq_handle);
-
-} /* audio_sup_taskq_resume() */
-
-/*
- * audio_sup_taskq_suspended()
- *
- * Description:
- * Determine if the taskq is running or suspended.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * AUDIO_TASKQ_RUNNING The taskq is running
- * AUDIO_TASKQ_SUSPENDED The taskq is not running (suspended)
- */
-int
-audio_sup_taskq_suspended(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_suspend()", tq_handle);
-
- if (taskq_suspended(AUDIO_AUDIOTQHDL2TQHDL(tq_handle))) {
- ATRACE("audio_sup_taskq_suspend() returning suspended",
- tq_handle);
- return (AUDIO_TASKQ_SUSPENDED);
- } else {
- ATRACE("audio_sup_taskq_suspend() returning running",
- tq_handle);
- return (AUDIO_TASKQ_RUNNING);
- }
-
-} /* audio_sup_taskq_suspended() */
-
-/*
- * audio_sup_taskq_suspend()
- *
- * Description:
- * Tasks on the taskq are suspended when this routine returns.
- * Running tasks will continue to execute, but all new tasks will
- * be suspended.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_suspend(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_suspend()", tq_handle);
-
- taskq_suspend(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_suspend() returning", tq_handle);
-
-} /* audio_sup_taskq_suspend() */
-
-/*
- * audio_sup_taskq_wait()
- *
- * Description:
- * Wait for all pending tasks to complete
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_wait(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_wait()", tq_handle);
-
- taskq_wait(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_wait() returning", tq_handle);
-
-} /* audio_sup_taskq_wait() */
-
-
-/*
- * Audio Data Handling Routines
- */
-
-/*
- * audio_sup_flush_audio_data()
- *
- * Description:
- * Flush all the data queued up for a channel. We remain locked at
- * all times so no one else can sneak in and grab a data structure.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * void
- */
-void
-audio_sup_flush_audio_data(audio_ch_t *chptr)
-{
- audio_data_t *tmp;
-
- ATRACE("in audio_sup_flush_audio_data()", chptr);
-
- ASSERT(mutex_owned(&chptr->ch_lock));
-
- mutex_enter(&chptr->ch_adata_lock);
-
- while ((tmp = chptr->ch_adata) != 0) {
- /* set up for next loop */
- chptr->ch_adata = tmp->adata_next;
-
- ATRACE("audio_sup_flush_audio_data() freeing data", tmp);
- audio_sup_free_audio_data(tmp);
-
- chptr->ch_adata_cnt--;
- }
-
- ASSERT(chptr->ch_adata_cnt == 0);
-
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_flush_audio_data() finished", chptr);
-
-} /* audio_sup_flush_audio_data() */
-
-/*
- * audio_sup_free_audio_data()
- *
- * Description:
- * Free the audio data.
- *
- * NOTE: The audio data structure must already be off the list, so there
- * isn't a need to lock the data list.
- *
- * Arguments:
- * audio_data_t *adata The audio data structure to free
- *
- * Returns:
- * void
- */
-void
-audio_sup_free_audio_data(audio_data_t *adata)
-{
- ATRACE("in audio_sup_free_audio_data()", adata);
-
- if (adata == NULL) {
- ATRACE("audio_sup_free_audio_data() nothing to free", adata);
-
- return;
-
- }
-
- ATRACE("audio_sup_free_audio_data() adata differ, orig",
- adata->adata_orig);
- ATRACE("audio_sup_free_audio_data() adata differ, proc",
- adata->adata_proc);
- if (adata->adata_orig) {
- ATRACE("audio_sup_free_audio_data() freeing original data",
- adata->adata_orig);
- kmem_free(adata->adata_orig, adata->adata_osize);
- }
- if (adata->adata_proc) {
- ATRACE("audio_sup_free_audio_data() freeing processed data",
- adata->adata_proc);
- kmem_free(adata->adata_proc, adata->adata_psize);
- }
-
- ATRACE("audio_sup_free_audio_data() freeing adata structure", adata);
- kmem_free(adata, sizeof (*adata));
-
- ATRACE("audio_sup_free_audio_data() done", 0);
-
-} /* audio_sup_free_audio_data() */
-
-/*
- * audio_sup_get_audio_data()
- *
- * Description:
- * Get the oldest audio data structure off the channel's data list, which
- * would be the first message.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * Valid audio_data_t pointer The audio data structure
- * NULL No audio data available
- */
-audio_data_t *
-audio_sup_get_audio_data(audio_ch_t *chptr)
-{
- audio_data_t *tmp;
-
- ATRACE("in audio_sup_get_audio_data()", chptr);
-
- mutex_enter(&chptr->ch_adata_lock);
-
- tmp = chptr->ch_adata;
-
- if (tmp) {
- /* set up for next time */
- chptr->ch_adata = tmp->adata_next;
-
- chptr->ch_adata_cnt--;
-
- ASSERT(chptr->ch_adata_cnt >= 0);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data() found data to return", tmp);
-
- return (tmp);
-
- }
- ASSERT(chptr->ch_adata_cnt == 0);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data() NO data found", chptr);
-
- return (NULL);
-
-} /* audio_sup_get_audio_data() */
-
-/*
- * audio_sup_get_audio_data_cnt()
- *
- * Description:
- * Get the number of data structures currently queued on the data list.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * >= 0 The number of queued data structures
- */
-int
-audio_sup_get_audio_data_cnt(audio_ch_t *chptr)
-{
- int tmp;
-
- ATRACE("in audio_sup_get_audio_data_cnt()", chptr);
-
- mutex_enter(&chptr->ch_adata_lock);
- ASSERT(chptr->ch_adata_cnt >= 0);
- tmp = chptr->ch_adata_cnt;
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data_cnt() returning", tmp);
-
- return (tmp);
-
-} /* audio_sup_get_audio_data_cnt() */
-
-/*
- * audio_sup_get_audio_data_size()
- *
- * Description:
- * Get the number of bytes stored in data structures that are currently
- * queued on the data list. Look at the proc_size if it's there and
- * otherwise look at the orig_size.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * >= 0 The number of bytes queued
- */
-int
-audio_sup_get_audio_data_size(audio_ch_t *chptr)
-{
- audio_data_t *adata;
- int tmp = 0;
-
- ATRACE("in audio_sup_get_audio_data_size()", chptr);
-
- /* lock the structure */
- mutex_enter(&chptr->ch_adata_lock);
-
- ASSERT(chptr->ch_adata_cnt >= 0);
-
- adata = chptr->ch_adata;
- while (adata != 0) {
- if (adata->adata_proc) {
- tmp += adata->adata_psize;
- } else {
- tmp += adata->adata_osize;
- }
- adata = adata->adata_next;
- }
-
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data_size() returning", tmp);
-
- return (tmp);
-
-} /* audio_sup_get_audio_data_size() */
-
-/*
- * audio_sup_putback_audio_data()
- *
- * Description:
- * Put the audio data structure back onto the list. It will be the first
- * to be removed the next time audio_sup_get_audio_data() is called.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * audio_data_t *adata The message to put back on the list
- *
- * Returns:
- * void
- */
-void
-audio_sup_putback_audio_data(audio_ch_t *chptr, audio_data_t *adata)
-{
- ATRACE("in audio_sup_putback_audio_data()", chptr);
-
- if (adata == 0) {
- ATRACE("audio_sup_putback_audio_data() bad message pointer",
- adata);
-
- return;
-
- }
-
- ATRACE("audio_sup_putback_audio_data() putting data back", adata);
-
- /* lock the data list */
- mutex_enter(&chptr->ch_adata_lock);
-
- adata->adata_next = chptr->ch_adata;
-
- chptr->ch_adata = adata;
-
- chptr->ch_adata_cnt++;
-
- ASSERT(chptr->ch_adata_cnt >= 1);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_putback_audio_data() done", chptr);
-
-} /* audio_sup_putback_audio_data() */
-
-/*
- * audio_sup_save_audio_data()
- *
- * Description:
- * Save audio data on the channel's data list. New data is placed at
- * the end of the list.
- *
- * CAUTION: This routine may be called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * void *adata_orig Pointer to the original data to save
- * size_t adata_osize Size of the original data
- * void *adata_proc Pointer to the processed data to save
- * size_t adata_psize Size of the processed data
- *
- * Returns:
- * AUDIO_SUCCESS The message was successfully saved
- * AUDIO_FAILURE The message was not successfully saved
- */
-int
-audio_sup_save_audio_data(audio_ch_t *chptr, void *adata_orig,
- size_t adata_osize, void *adata_proc, size_t adata_psize)
-{
- audio_data_t *new;
-
- ATRACE("in audio_sup_save_audio_data()", chptr);
-
- /* first we allocate an audio_data_t structure (zeros out next field) */
- if ((new = kmem_zalloc(sizeof (*new), KM_NOSLEEP)) == NULL) {
- ATRACE("audio_sup_save_audio_data() kmem_zalloc() failed", 0);
-
- return (AUDIO_FAILURE);
-
- }
-
- if (adata_orig) {
- new->adata_orig = adata_orig; /* orig data from app */
- new->adata_optr = adata_orig;
- new->adata_oeptr = (char *)adata_orig + adata_osize;
- new->adata_osize = adata_osize;
- }
- if (adata_proc) {
- new->adata_proc = adata_proc; /* the processed data */
- new->adata_pptr = adata_proc;
- new->adata_peptr = (char *)adata_proc + adata_psize;
- new->adata_psize = adata_psize;
- }
-
- /* now we save the message */
- mutex_enter(&chptr->ch_adata_lock);
-
- /* see if this is the first message */
- if (chptr->ch_adata == NULL) { /* it is */
- ASSERT(chptr->ch_adata_cnt == 0);
- chptr->ch_adata = new; /* next is already set to 0 */
- chptr->ch_adata_cnt = 1;
- chptr->ch_adata_end = new;
- mutex_exit(&chptr->ch_adata_lock);
- ATRACE("audio_sup_save_audio_data() first message", new);
-
- return (AUDIO_SUCCESS);
-
- }
-
- ATRACE("audio_sup_save_audio_data() saving message", new);
-
- /* append new message to list */
- chptr->ch_adata_end->adata_next = new;
- chptr->ch_adata_end = new;
-
- chptr->ch_adata_cnt++;
-
- ASSERT(chptr->ch_adata_cnt >= 1);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_save_audio_data() */
-
-/*
- * Minor <--> Channel Routines:
- *
- * audio_sup_ch_to_minor()
- *
- * Description:
- * Return the minor number of the channel.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * int channel The device channel
- *
- * Returns:
- * >= 0 The minor number of the channel
- */
-int
-audio_sup_ch_to_minor(audio_state_t *statep, int channel)
-{
- ATRACE("in audio_sup_ch_to_minor(): statep", statep);
- ATRACE_32("audio_sup_ch_to_minor(): channel #", channel);
-
- ATRACE_32("audio_sup_ch_to_minor() returning",
- ((statep->as_dev_instance * statep->as_minors_per_inst) +
- channel + statep->as_audio_reserved));
-
- return ((statep->as_dev_instance * statep->as_minors_per_inst) +
- channel + statep->as_audio_reserved);
-
-} /* audio_sup_ch_to_minor() */
-
-/*
- * audio_sup_get_max_chs()
- *
- * Description:
- * Get the maximum number of supported channels per instance.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * > 0 The number of minor numbers per instance
- */
-int
-audio_sup_get_max_chs(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
-
- ATRACE_32("in audio_sup_get_max_chs() returning",
- statep->as_max_chs);
-
- return (statep->as_max_chs);
-
-} /* audio_sup_get_max_chs() */
-
-/*
- * audio_sup_get_minors_per_inst()
- *
- * Description:
- * Get the number of minor numbers allowed per instance.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * > 0 The number of minor numbers per instance
- */
-int
-audio_sup_get_minors_per_inst(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
-
- ATRACE_32("in audio_sup_get_minors_per_inst() returning",
- statep->as_minors_per_inst);
-
- return (statep->as_minors_per_inst);
-
-} /* audio_sup_get_minors_per_inst() */
-
-/*
- * audio_sup_construct_minor()
- *
- * Description:
- * construct a minor number for this dip and device type
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * device_type_e device_type type of audio device the channel is
- * associated with
- *
- * Returns:
- * >= 0 minor node number
- */
-int
-audio_sup_construct_minor(audiohdl_t handle, audio_device_type_e device_type)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- dev_info_t *dip = statep->as_dip;
- int minors_per_inst = statep->as_minors_per_inst;
- int minor;
-
- ATRACE_32("in audio_sup_construct_minor()", device_type);
-
- minor = (ddi_get_instance(dip) * minors_per_inst) +
- audio_sup_type_to_minor(device_type);
-
- ATRACE_32("audio_sup_construct_minor() returning", minor);
-
- return (minor);
-
-} /* audio_sup_construct_minor() */
-
-/*
- * audio_sup_minor_to_ch()
- *
- * Description:
- * Convert a minor number to a channel number.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * minor_t minor The minor number to convert
- *
- * Returns:
- * >= 0 The channel number
- */
-int
-audio_sup_minor_to_ch(audio_state_t *statep, minor_t minor)
-{
- int minors_per_inst = statep->as_minors_per_inst;
- int audio_reserved = statep->as_audio_reserved;
-
- ATRACE_32("in audio_sup_minor_to_ch()", minor);
- ATRACE_32("audio_sup_minor_to_ch() returning",
- ((minor % minors_per_inst) - audio_reserved));
-
- return ((minor % minors_per_inst) - audio_reserved);
-
-} /* audio_sup_minor_to_ch() */
-
-/*
- * audio_sup_type_to_minor()
- *
- * Description:
- * Normally a macro would be used to figure out the minor number. But
- * we don't want the Audio Driver using the Audio Support Module's
- * macros which might change. So we provide a call that will let us
- * change what we are doing later on if we wish.
- *
- * Arguments:
- * audio_device_type_e type The device type we want the minor # of
- *
- * Returns:
- * The device type
- * AUDIO_FAILURE Unrecognized audio device
- */
-int
-audio_sup_type_to_minor(audio_device_type_e type)
-{
- int minor;
-
- ATRACE_32("in audio_sup_type_to_minor()", type);
-
- switch (type) {
- case AUDIO:
- minor = AUDIO_MINOR_AUDIO;
- break;
- case AUDIOCTL:
- minor = AUDIO_MINOR_AUDIOCTL;
- break;
- case WTABLE:
- minor = AUDIO_MINOR_WAVE_TABLE;
- break;
- case MIDI:
- minor = AUDIO_MINOR_MIDI_PORT;
- break;
- case ATIME:
- minor = AUDIO_MINOR_TIME;
- break;
- case USER1:
- minor = AUDIO_MINOR_USER1;
- break;
- case USER2:
- minor = AUDIO_MINOR_USER2;
- break;
- case USER3:
- minor = AUDIO_MINOR_USER3;
- break;
- case UNDEFINED:
- /*FALLTHROUGH*/
- default:
- minor = AUDIO_FAILURE;
- break;
- }
-
- ATRACE_32("audio_sup_type_to_minor() returning minor", minor);
-
- return (minor);
-
-} /* audio_sup_type_to_minor() */
-
-/*
- * audio_sup_devt_to_instance()
- *
- * Description:
- * Convert a dev_t to instance
- *
- * Arguments:
- * dev_t dev The device we are getting the instance for
- *
- * Returns:
- * >= 0 The instance number
- */
-int
-audio_sup_devt_to_instance(dev_t devt)
-{
- return (AUDIO_MINOR_TO_INST(devt));
-
-} /* audio_sup_devt_to_instance() */
-
-/*
- * Miscellaneous Routines
- */
-
-/*
- * audio_sup_devt_to_ch_type()
- *
- * Description:
- * Given a channel's minor number figure out what kind of channel
- * it is. This works for both the reserved minor nodes as well as
- * the clone channels.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * dev_t dev The device we are getting the type of
- *
- * Returns:
- * The device type
- * AUDIO_FAILURE Couldn't get the state structure, so failed
- */
-audio_device_type_e
-audio_sup_devt_to_ch_type(audio_state_t *statep, dev_t dev)
-{
- audio_device_type_e type;
- minor_t minor;
- int minors_per_inst = statep->as_minors_per_inst;
- int audio_reserved = statep->as_audio_reserved;
-
- ATRACE("in audio_sup_devt_to_ch_type()", dev);
-
- /* figure out the minor number given an instance */
- minor = getminor(dev) % minors_per_inst;
-
- if (minor < audio_reserved) {
- ATRACE_32("audio_sup_devt_to_ch_type() reserved minor",
- minor);
-
- switch (minor) {
- case AUDIO_MINOR_AUDIO:
- type = AUDIO;
- break;
- case AUDIO_MINOR_AUDIOCTL:
- type = AUDIOCTL;
- break;
- case AUDIO_MINOR_WAVE_TABLE:
- type = WTABLE;
- break;
- case AUDIO_MINOR_MIDI_PORT:
- type = MIDI;
- break;
- case AUDIO_MINOR_TIME:
- type = TIME;
- break;
- case AUDIO_MINOR_USER1:
- type = USER1;
- break;
- case AUDIO_MINOR_USER2:
- type = USER2;
- break;
- case AUDIO_MINOR_USER3:
- type = USER3;
- break;
- default:
- type = UNDEFINED;
- break;
- }
-
- ATRACE_32("audio_sup_devt_to_ch_type() reserved, returning",
- type);
-
- return (type);
-
- } else {
- audio_state_t *statep;
- audio_ch_t *chptr;
-
- ATRACE_32("audio_sup_devt_to_ch_type() allocated channel",
- minor);
-
- if ((statep = audio_sup_devt_to_state(dev)) == NULL) {
- ATRACE("audio_sup_devt_to_ch_type() "
- "audio_sup_devt_to_ch_type() failed", 0);
-
- return ((audio_device_type_e)AUDIO_FAILURE);
-
- }
-
- ATRACE("audio_sup_devt_to_ch_type() statep", statep);
-
- chptr = &statep->as_channels[audio_sup_minor_to_ch(
- statep, minor)];
-
- ATRACE("audio_sup_devt_to_ch_type() chptr", chptr);
-
- ATRACE_32("audio_sup_devt_to_ch_type() returning type",
- chptr->ch_info.dev_type);
-
- return (chptr->ch_info.dev_type);
-
- }
-
-} /* audio_sup_devt_to_ch_type() */
-
-/*
- * audio_sup_get_channel_number()
- *
- * Description:
- * Get the channel number for the audio queue.
- *
- * Arguments:
- * queue_t *q Pointer to a queue structure
- *
- * Returns:
- * channel number The channel number for the audio queue.
- * AUDIO_FAILURE Bad q_ptr
- */
-int
-audio_sup_get_channel_number(queue_t *q)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_get_channel_number()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_get_channel_number() bad chptr", 0);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio_sup_get_channel_number() returning",
- chptr->ch_info.ch_number);
-
- return (chptr->ch_info.ch_number);
-
-} /* audio_sup_get_channel_number() */
-
-/*
- * audio_sup_get_apm_info()
- *
- * Description:
- * Get the audio_apm_info structure for the audio instance and
- * type passed in.
- *
- * NOTE: Since the apm_info list is created when the driver is
- * attached it should never change during normal operation
- * of the audio device. Therefore we don't need to lock
- * the list while we traverse it.
- *
- * Arguments:
- * audio_state_t *statep device state structure
- * audio_device_type_e type APM type
- *
- * Returns:
- * valid pointer Ptr to the returned audio_apm_info struct
- * NULL audio_apm_info struct not found
- */
-audio_apm_info_t *
-audio_sup_get_apm_info(audio_state_t *statep, audio_device_type_e type)
-{
- audio_apm_info_t *apm_infop;
-
- ATRACE("in audio_sup_get_apm_info()", statep);
-
- /* sanity check */
- if (type == UNDEFINED) {
- ATRACE("audio_sup_get_apm_info() returning NULL (fail)", 0);
-
- return (NULL);
-
- }
-
- mutex_enter(&statep->as_lock);
- apm_infop = statep->as_apm_info_list;
-
- while (apm_infop != NULL) {
- if (apm_infop->apm_type == type) {
- ATRACE_32("audio_sup_get_apm_info() found type", type);
- break;
- }
- apm_infop = apm_infop->apm_next;
- }
-
- mutex_exit(&statep->as_lock);
-
- /* make sure we got a structure */
- if (apm_infop == NULL) {
- ATRACE_32("audio_sup_get_apm_info() didn't find type", type);
-
- return (NULL);
-
- }
-
- ATRACE("audio_sup_get_apm_info() returning", apm_infop);
-
- return (apm_infop);
-
-} /* audio_sup_get_apm_info() */
-
-/*
- * audio_sup_get_dip()
- *
- * Description:
- * Get the dev_info_t pointer for the audio handle.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * dev_info_t * The dip for the handle, always returned
- */
-dev_info_t *
-audio_sup_get_dip(audiohdl_t handle)
-{
-
- return (AUDIO_HDL2STATE(handle)->as_dip);
-
-} /* audio_sup_get_dip() */
-
-/*
- * audio_sup_get_info()
- *
- * Description:
- * Get the info structure for the audio queue.
- *
- * Arguments:
- * queue_t *q Pointer to a queue structure
- *
- * Returns:
- * valid pointer Ptr to the returned audio_apm_info struct
- */
-void *
-audio_sup_get_info(queue_t *q)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_get_info()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (NULL);
- }
-
- ATRACE("audio_sup_get_info() returning", chptr->ch_info.info);
-
- return (chptr->ch_info.info);
-
-} /* audio_sup_get_info() */
-
-
-/*
- * audio_sup_mblk_alloc()
- *
- * Description:
- * Allocate a STREAMS message block if the current block isn't there or
- * is too small. This is placed into the continuation pointer for the
- * passed in message block.
- *
- * When we return the b_wptr is set to b_rptr + size;
- *
- * Arguments:
- * mblk_t *mp STREAMS message block to add to
- * size_t size Size of the message to allocate
- *
- * Returns:
- * AUDIO_SUCCESS Message block allocated
- * AUDIO_FAILURE Message block not allocated
- */
-int
-audio_sup_mblk_alloc(mblk_t *mp, size_t size)
-{
- /* first the easy case, the buffer is already big enough */
- if (msgdsize(mp->b_cont) >= size) {
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + size;
- return (AUDIO_SUCCESS);
- }
-
- /* the old message either isn't there or it's too small */
- if (mp->b_cont) {
- /* here, but too small */
- freemsg(mp->b_cont);
- }
-
- /* no memory leak, time to allocate the new message */
- mp->b_cont = allocb((size), BPRI_HI);
- if (mp->b_cont == NULL) {
- return (AUDIO_FAILURE);
- }
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + size;
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_mblk_alloc() */
-
-/*
- * audio_sup_get_private()
- *
- * Description:
- * Return the pointer to the audio driver's private state information.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * Pointer to private data, even if it's set to NULL
- */
-void *
-audio_sup_get_private(audiohdl_t handle)
-{
-
- return (AUDIO_HDL2STATE(handle)->as_private);
-
-} /* audio_sup_get_private() */
-
-/*
- * audio_sup_set_private()
- *
- * Description:
- * Set the audio driver's private state in the audio handle. It may
- * be reset at any time.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *private Audio driver's private data
- *
- * Returns:
- * void
- */
-void
-audio_sup_set_private(audiohdl_t handle, void *private)
-{
- AUDIO_HDL2STATE(handle)->as_private = private;
-
-} /* audio_sup_set_private() */
-
-/*
- * audio_sup_log()
- *
- * Description:
- * similar to cmn_err but prefixes the message with
- * <drivername><instance>:
- *
- * Arguments:
- * audiohdl_t handle May be NULL in which case it behaves as
- * cmn_err()
- * uint_t level A constant indicating the severity
- * char *format The message to be displayed
- *
- * NOTE: ? ! ^ should work as expected
- */
-void
-audio_sup_log(audiohdl_t handle, uint_t level, char *fmt, ...)
-{
- va_list ap;
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- int n = 0;
- int skip = 0;
-
- mutex_enter(&audio_sup_log_lock);
-
- if (statep) {
- dev_info_t *dip = statep->as_dip;
-
- switch (fmt[0]) {
- case '?':
- case '!':
- case '^':
- audio_sup_log_buf[0] = fmt[n++];
- skip++;
- break;
- default:
- break;
- }
-
- (void) sprintf(&audio_sup_log_buf[n], "%s%d: ",
- ddi_driver_name(dip), ddi_get_instance(dip));
-
- n = strlen(audio_sup_log_buf);
- }
-
- va_start(ap, fmt);
- (void) vsprintf(&audio_sup_log_buf[n], &fmt[skip], ap);
- va_end(ap);
- cmn_err(level, audio_sup_log_buf);
-
- ATRACE(audio_sup_log_buf, 0);
-
- mutex_exit(&audio_sup_log_lock);
-
-} /* audio_sup_log() */
-
-/*
- * audio_sup_update_persist_key()
- *
- * Description:
- * Update the persistent key to a new value. Memory is freed from the old
- * key and allocated for the new key.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- * char *key Pointer to the new key string
- * int sleep_okay Non-zero if okay to sleep on mem. alloc.
- *
- * Returns:
- * AUDIO_SUCCESS Key successfully updated to new key
- * AUDIO_FAILURE Memory allocation failed, dip not found
- */
-int
-audio_sup_update_persist_key(dev_info_t *dip, char *key, int sleep_okay)
-{
- audio_inst_persist_t *tptr;
- char *new_key;
- size_t key_length;
- major_t major = ddi_driver_major(dip);
- int instance = ddi_get_instance(dip);
-
- ATRACE("in audio_sup_update_persist_key()", key);
-
- /* see audio_sup_persist() for an explaination on keys */
- if (key == NULL) {
- ATRACE("audio_sup_update_persist_key() NULL key", key);
- return (AUDIO_FAILURE);
- }
-
- key_length = strlen(audio_key_class);
- key_length += strlen(key);
- key_length++; /* make room for NULL at end of string */
-
- if (sleep_okay) {
- new_key = kmem_alloc(key_length, KM_SLEEP);
- } else {
- new_key = kmem_alloc(key_length, KM_NOSLEEP);
- if (new_key == NULL) {
- ATRACE("audio_sup_update_persist_key() no memory", key);
- return (AUDIO_FAILURE);
- }
- }
-
- (void) sprintf(new_key, "%s%s", audio_key_class, key);
- ATRACE("audio_sup_update_persist_key() key string", new_key);
-
- /*
- * Find our dip, we do this after getting the key so we hold the
- * locks for as short a time as possible.
- */
- mutex_enter(&audio_persist_lock);
- ASSERT(audio_main_anchor);
- for (tptr = *audio_main_anchor; tptr; tptr = tptr->amp_next) {
- if (tptr->amp_major == major &&
- tptr->amp_instance == instance) {
- break;
- }
- }
- if (tptr == NULL) {
- kmem_free(new_key, key_length);
- mutex_exit(&audio_persist_lock);
- ATRACE("audio_sup_update_persist_key() dip not found", dip);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio_sup_update_persist_key() dip found", dip);
- kmem_free(tptr->amp_key, strlen(tptr->amp_key)+1);
- tptr->amp_key = new_key;
-
- mutex_exit(&audio_persist_lock);
-
- ATRACE("audio_sup_update_persist_key() done", new_key);
-
- return (AUDIO_SUCCESS);
-
-
-} /* audio_sup_update_persist_key() */
-
-/*
- * STREAMS Private Data Routines
- */
-
-/*
- * audio_sup_set_qptr()
- *
- * Description:
- * Allocate an audio_qptr structure to hold the private STREAM data
- * structure. Then set the values and point both the RD() and WR()
- * STREAMS queues to this data structure. That way it'll be available
- * regardless of which direction the queue may be pointed.
- *
- * NOTE: open() and close() use the read queue, which is why we put it on
- * both the read and write side.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * dev_t dev Device name
- * void *data Pointer to the private data
- *
- * Returns:
- * void
- */
-void
-audio_sup_set_qptr(queue_t *q, dev_t dev, void *data)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_set_qptr()", q);
-
- tmp = (audio_qptr_t *)kmem_alloc(sizeof (audio_qptr_t), KM_SLEEP);
-
- tmp->aq_dev = dev;
- tmp->aq_data = data;
-
- RD(q)->q_ptr = (caddr_t)tmp;
- WR(q)->q_ptr = (caddr_t)tmp;
-
- ATRACE("audio_sup_set_qptr() done", tmp);
-
-} /* audio_sup_set_qptr() */
-
-/*
- * audio_sup_free_qptr()
- *
- * Description:
- * Free the private STREAMS data structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * void
- */
-void
-audio_sup_free_qptr(queue_t *q)
-{
- ATRACE("in audio_sup_free_qptr()", q);
-
- kmem_free(q->q_ptr, sizeof (audio_qptr_t));
-
- RD(q)->q_ptr = NULL;
- WR(q)->q_ptr = NULL;
-
- ATRACE("audio_sup_free_qptr() done", q);
-
-} /* audio_sup_free_qptr() */
-
-/*
- * audio_sup_get_qptr_dev()
- *
- * Description:
- * Get the device info from the private data.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * The dev_t that was saved
- */
-dev_t
-audio_sup_get_qptr_dev(queue_t *q)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_get_qptr_dev()", q);
-
- /* make sure the q_ptr is valid */
- if (q->q_ptr == NULL) {
- ATRACE("audio_sup_get_qptr_dev() null q_ptr", NULL);
- return (NULL);
- }
-
- tmp = (audio_qptr_t *)q->q_ptr;
-
- ATRACE("audio_sup_get_qptr_dev() dev_t", tmp->aq_dev);
-
- return (tmp->aq_dev);
-
-} /* audio_sup_get_qptr_dev() */
-
-/*
- * audio_sup_get_qptr_data()
- *
- * Description:
- * Get the data info from the private data.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * Pointer to the private data.
- */
-void *
-audio_sup_get_qptr_data(queue_t *q)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_get_qptr_data()", q);
-
- /* make sure the q_ptr is valid */
- if (q->q_ptr == NULL) {
- ATRACE("audio_sup_get_qptr_data() null q_ptr", NULL);
- return (NULL);
- }
-
- tmp = (audio_qptr_t *)q->q_ptr;
-
- ATRACE("audio_sup_get_qptr_data() done, data", tmp->aq_data);
-
- return (tmp->aq_data);
-
-} /* audio_sup_get_qptr_data() */
-
-/*
- * audio_sup_get_qptr_instance()
- *
- * Description:
- * Get the instance number from the private data's dev_t.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * >= 0 The instance number
- */
-int
-audio_sup_get_qptr_instance(queue_t *q)
-{
- dev_t dev = audio_sup_get_qptr_dev(q);
- audio_state_t *statep = audio_sup_devt_to_state(dev);
- int minor = getminor(dev);
- int instance;
-
- instance = minor / audio_sup_get_minors_per_inst(
- AUDIO_STATE2HDL(statep));
-
- ATRACE("in audio_sup_get_qptr_instance()", q);
- ATRACE_32("in audio_sup_get_qptr_instance() returning", instance);
-
- return (instance);
-
-} /* audio_sup_get_qptr_instance() */
-
-/*
- * State structure handling:
- */
-
-/*
- * audio_sup_devt_to_state()
- *
- * Description:
- * This routine is used to associate the device number with the
- * dev_info_t pointer. It returns the device's state structure when
- * it is done.
- *
- * Arguments:
- * dev_t dev Device name
- *
- * Returns:
- * Valid pointer Pointer to the state
- * NULL State pointer not found
- */
-audio_state_t *
-audio_sup_devt_to_state(dev_t dev)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
- dev_info_t *my_dip;
- audio_state_t *statep;
- int instance;
- major_t major = getmajor(dev);
- major_t my_major;
-
- ATRACE("in audio_sup_devt_to_state()", dev);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
-
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- statep = &list->ail_state;
- mutex_enter(&statep->as_lock);
- my_dip = statep->as_dip;
- my_major = statep->as_major;
- instance = getminor(dev) /
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
-
- if ((my_major == major) &&
- (instance == ddi_get_instance(my_dip))) {
- mutex_exit(&statep->as_lock);
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_devt_to_state() returning", statep);
-
- return (statep);
-
- }
- plist = &list->ail_next;
- list = list->ail_next;
- mutex_exit(&statep->as_lock);
- }
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_devt_to_state() returning NULL", 0);
-
- return (NULL);
-
-} /* audio_sup_devt_to_state() */
-
-/*
- * audio_sup_devinfo_to_state()
- *
- * Description:
- * Get the state pointer for the audio device given a devinfo_t *.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- *
- * Returns:
- * Valid pointer Pointer to the state
- * NULL State pointer not found
- */
-audio_state_t *
-audio_sup_devinfo_to_state(dev_info_t *dip)
-{
- audio_inst_info_t *instp;
-
- ATRACE("in audio_sup_devinfo_to_state(), dip", dip);
-
- mutex_enter(&audio_drv_list_lock);
- instp = audio_sup_lookup_drv_entry(dip);
-
- if (instp && (instp->ail_state.as_dip == dip)) {
- mutex_exit(&audio_drv_list_lock);
-
- /* verify, if given */
- ATRACE("audio_sup_devinfo_to_state() "
- "found dip match, returning", &instp->ail_state);
-
- return (&instp->ail_state);
-
- } else {
- mutex_exit(&audio_drv_list_lock);
- ATRACE("audio_sup_devinfo_to_state() no dip match", dip);
-
- return (NULL);
-
- }
-
-} /* audio_sup_devinfo_to_state() */
-
-/*
- * audio_sup_create_drv_entry()
- *
- * Description:
- * Create & add an entry in the instance list (audio_drv_list_head).
- * The whole linked list is scanned
- * to make sure we don't ever get a duplicate entry.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device, what we use
- * to find the instance
- *
- * Returns:
- * Valid pointer Valid instance
- * NULL Instance already registered
- */
-static audio_inst_info_t *
-audio_sup_create_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist; /* for walking the list */
- audio_inst_info_t *entry; /* new entry */
-
- ATRACE("in audio_sup_create_drv_entry()", dip);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if (list->ail_state.as_dip == dip) {
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_create_drv_entry() "
- "instance already registered", dip);
- audio_sup_log(NULL, CE_NOTE,
- "%s%d already registered",
- ddi_driver_name(dip), ddi_get_instance(dip));
-
- return (NULL);
-
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
-
- /* "dip" is not registered, create new one and add to list */
- ATRACE("audio_sup_create_drv_entry() dip not registered", dip);
-
- entry = kmem_zalloc(sizeof (*entry), KM_SLEEP);
- *plist = entry;
- mutex_exit(&audio_drv_list_lock);
-
- return (entry);
-
-} /* audio_sup_create_drv_entry() */
-
-/*
- * audio_sup_free_drv_entry()
- *
- * Description:
- * This routine is used to clear entries in the driver list that
- * were added in by audio_sup_create_drv_entry().
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device.
- * if NULL, delete all entries
- *
- * Returns:
- * void
- */
-static void
-audio_sup_free_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
- audio_ch_t *chptr;
- audio_state_t *statep;
- int i;
- int num_chs;
-
- ATRACE("in audio_sup_free_drv_entry()", dip);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if ((dip == NULL) || (list->ail_state.as_dip == dip)) {
- /* found it */
- *plist = list->ail_next;
- list->ail_next = NULL;
-
- statep = &list->ail_state;
-
- /* de-initialize the channel structures */
- num_chs = statep->as_max_chs;
- for (i = 0, chptr = &statep->as_channels[0];
- i < num_chs; i++, chptr++) {
- /*
- * All we have to worry about is locks and
- * condition variables.
- */
- mutex_destroy(&chptr->ch_lock);
- mutex_destroy(&chptr->ch_adata_lock);
- cv_destroy(&chptr->ch_cv);
- }
-
- /* destroy mutex, cv */
- mutex_destroy(&statep->as_lock);
- cv_destroy(&statep->as_cv);
-
- /* free the structure */
- kmem_free(list, sizeof (audio_inst_info_t));
-
- /* see if we need to go again */
- if (dip) {
- /* nope, done */
- break;
- }
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_free_drv_entry() done", 0);
-
-} /* audio_sup_free_drv_entry() */
-
-/*
- * audio_sup_free_apm_persist()
- *
- * Description:
- * Free the audio_apm_persist list that is associated with the instance.
- *
- * Arguments:
- * audio_state_t *statep Pointer to device state info
- * audio_apm_persist_t *instp Pointer to instance data
- *
- * Returns:
- * void Silently fails if key useless
- */
-static void
-audio_sup_free_apm_persist(audio_state_t *statep, audio_apm_persist_t *instp)
-{
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_free_apm_persist() statep", statep);
- ATRACE("audio_sup_free_apm_persist() instp", instp);
-
- ASSERT(mutex_owned(&audio_persist_lock));
-
- tmp = instp;
- while (tmp) {
- tmp = tmp->ap_next;
- kmem_free(instp->ap_data, instp->ap_size);
- kmem_free(instp, sizeof (*instp));
- }
-
- ATRACE("audio_sup_free_apm_persist() done", statep);
-
-} /* audio_sup_free_apm_persist() */
-
-/*
- * audio_sup_free_inst_persist()
- *
- * Description:
- * Free the audio_inst_persist_t structure for this dip.
- *
- * Arguments:
- * audio_state_t *statep Pointer to device state info
- * audio_inst_persist_t *persistp Pointer to the struct to remove
- *
- * Returns:
- * void
- */
-static void
-audio_sup_free_inst_persist(audio_state_t *statep,
- audio_inst_persist_t *persistp)
-{
- audio_inst_persist_t **plist;
- audio_inst_persist_t *list;
-
- ATRACE("in audio_sup_free_inst_persist() statep", statep);
- ATRACE("audio_sup_free_inst_persist() persistp", persistp);
-
- ASSERT(mutex_owned(&audio_persist_lock));
- ASSERT(audio_main_anchor);
-
- plist = audio_main_anchor;
- list = *plist;
-
- while (list) {
- if (list == persistp) {
- /* found it, free the APM list and key */
- if (list->amp_key) {
- kmem_free(list->amp_key,
- strlen(list->amp_key)+1);
- }
- if (list->amp_apmp) {
- audio_sup_free_apm_persist(statep,
- list->amp_apmp);
- }
- /* remove from the list */
- *plist = list->amp_next;
- ATRACE("audio_sup_free_inst_persist() "
- "freeing dip & return", list);
- kmem_free(list, sizeof (*list));
- return;
- }
-
- plist = &list->amp_next;
- list = list->amp_next;
- }
-
- ATRACE("audio_sup_free_inst_persist() returning, not found", persistp);
-
-} /* audio_sup_free_inst_persist() */
-
-/*
- * audio_sup_lookup_drv_entry()
- *
- * Description:
- * Lookup audio_inst_info_t pointer corresponding to dip
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- *
- * Returns:
- * audio_inst_info_t pointer or NULL
- */
-static audio_inst_info_t *
-audio_sup_lookup_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
-
- ATRACE("in audio_sup_lookup_drv_entry()", dip);
- ASSERT(mutex_owned(&audio_drv_list_lock));
-
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if (list->ail_state.as_dip == dip) {
- break;
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
-
- ATRACE("audio_sup_lookup_drv_entry() done", list);
-
- return (list);
-
-} /* audio_sup_lookup_drv_entry() */
-
-/*
- * audio_sup_persist()
- *
- * Description:
- * Routine to initialize and find persistent state and its unique key.
- *
- * There are two types of persistent state, per instance and per APM
- * state. Per instance saves the key and dip. Thus the correct instance
- * may be found based on the key or the dip. It is also possible to
- * detect, given a driver provided unique key, when a device moves
- * from one port to another. Right now a linear search is used to find
- * the matching dip. If we get to the point of supporting 100s or 1000s
- * of instances then this will need to be changed to something more
- * sophisticated.
- *
- * The second type is used to save the state for each APM for the
- * instance. It is not a requirement for any APM to save persistent
- * state, thus we could be allocating the per instance state structure
- * for nothing. The APM is responsible for allocating the memory and
- * providing a pointer to that memory and the size.
- * audio_sup_free_persist_state() will free this memory for the APM.
- *
- * The per instance state structures are found by retreiving the
- * main anchor using the AUDIO_SUP_KEY unique key.
- *
- * If the reset-configuration property is set to non-zero then any
- * saved state is cleared and the APMs rebuild the persistent data
- * from scratch. This effectively resets them to their defaults.
- *
- * NOTE: All allocated memory is owned by the main anchor.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * char *key Unique key to for finding memory
- *
- * Returns:
- * AUDIO_SUCCESS Persistent state allocated/found
- * AUDIO_FAILURE Couldn't allocate/find persistent state
- */
-static int
-audio_sup_persist(audio_state_t *statep, char *key)
-{
- audio_inst_persist_t *key_persistp = NULL;
- audio_inst_persist_t *inst_persistp;
- audio_inst_persist_t *main_anchor;
- audio_inst_persist_t *tmp_persistp;
- dev_info_t *dip = statep->as_dip;
- size_t key_length;
- major_t major = ddi_driver_major(dip);
- char *anchor_key = AUDIO_SUP_KEY;
- char *new_key;
- char pathbuf[MAXPATHLEN];
- int do_reset = 0;
- int instance = statep->as_dev_instance;
-
- ATRACE("in audio_sup_persist()", statep);
-
- /*
- * The 1st step is to make sure we have the anchor. It could have
- * been allocated on a previous audio framework load, or it could be
- * unallocated.
- */
- mutex_enter(&audio_persist_lock);
- ATRACE("audio_sup_persist() audio_main_anchor", audio_main_anchor);
- if (audio_main_anchor == NULL) {
- /* anchor not loaded, so find it */
- main_anchor = (audio_inst_persist_t *)space_fetch(anchor_key);
- ATRACE("audio_sup_persist() space_fetch() main_anchor",
- main_anchor);
- if (main_anchor == NULL) {
- /* 1st load, need to allocate the anchor memory */
- main_anchor = kmem_zalloc(sizeof (main_anchor),
- KM_SLEEP);
- if (space_store(anchor_key,
- (uintptr_t)main_anchor) != 0) {
- mutex_exit(&audio_persist_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "!cannot create persistent anchor");
- kmem_free(main_anchor, sizeof (main_anchor));
- return (AUDIO_FAILURE);
- }
- ATRACE("audio_sup_persist() space_store() main_anchor",
- main_anchor);
- }
- /* set this after the check above! */
- audio_main_anchor = (audio_inst_persist_t **)main_anchor;
- ATRACE("audio_sup_persist() new audio_main_anchor",
- audio_main_anchor);
- }
- mutex_exit(&audio_persist_lock);
-
- /*
- * Set up the instance key. Following the comments in space.c this
- * key is in one of two formats:
- *
- * AUDIO:key_string_from_driver
- *
- * or
- *
- * AUDIO:pathname
- *
- * The former is when the driver passes a string for the key. This
- * string MUST be unique. The later is when the driver passes a
- * NULL key string.
- */
- if (key == NULL) {
- key = ddi_pathname(dip, pathbuf);
- ATRACE("audio_sup_persist() NULL key string", key);
- } else {
- ATRACE("audio_sup_persist() provided key string", key);
- }
-
- key_length = strlen(audio_key_class);
- key_length += strlen(key);
- key_length++; /* make room for NULL at end of string */
-
- new_key = kmem_alloc(key_length, KM_SLEEP);
- (void) sprintf(new_key, "%s%s", audio_key_class, key);
- ATRACE("audio_sup_register() key string", new_key);
-
- /*
- * In order to determine if this device has moved to a different port
- * or if the key has changed we need to search through all of the dev
- * structures. Once this loop ends we'll know if the current key and
- * dev are present. This is one of the simple search algorithms that
- * would need to be changed if we need to support a huge number of
- * instances.
- */
- mutex_enter(&audio_persist_lock);
- for (tmp_persistp = *audio_main_anchor; tmp_persistp;
- tmp_persistp = tmp_persistp->amp_next) {
- if (strcmp(new_key, tmp_persistp->amp_key) == 0) {
- ATRACE("audio_sup_persist() dev: found key",
- tmp_persistp);
- ASSERT(!key_persistp);
- key_persistp = tmp_persistp;
- break;
- }
- }
-
- if (key_persistp) {
- key_persistp->amp_major = major;
- key_persistp->amp_instance = instance;
-
- ATRACE("audio_sup_persist() match", key_persistp);
- inst_persistp = key_persistp;
-
- /* free new_key so we don't have a memory leak */
- kmem_free(new_key, key_length);
- } else {
- ATRACE("audio_sup_persist() no match", statep);
- mutex_exit(&audio_persist_lock);
- inst_persistp = kmem_zalloc(sizeof (*inst_persistp), KM_SLEEP);
- mutex_enter(&audio_persist_lock);
-
- /* don't free new_key because we need it */
- inst_persistp->amp_key = new_key;
- inst_persistp->amp_major = major;
- inst_persistp->amp_instance = instance;
-
- /* put on list */
- inst_persistp->amp_next = *audio_main_anchor;
- *audio_main_anchor = inst_persistp;
- }
-
- /*
- * CAUTION: From here new_key must have been freed or placed in an
- * audio_inst_persist_t structure. Otherwise we'll have a memory
- * leak.
- *
- * We are done!
- */
-
- ASSERT(inst_persistp);
- mutex_exit(&audio_persist_lock);
-
- /* have statep point to instance persist info */
- mutex_enter(&statep->as_lock);
- statep->as_persistp = (void *)inst_persistp;
- ATRACE("audio_sup_register() as_persistp", statep->as_persistp);
- mutex_exit(&statep->as_lock);
-
- /*
- * The final piece of information we need is whether we need to
- * do a reset or not.
- */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "reset-configuration", 0)) {
- ATRACE("audio_sup_persist() need reset", statep);
- do_reset++;
- }
-
- /*
- * Now that we have good persistence data see if we need to reset it.
- * We don't block the attach() in this case because the driver is still
- * useful.
- */
- if (do_reset && audio_sup_free_persist_state(statep,
- AUDIO_ALL_DEVICES) == AUDIO_FAILURE) {
- audio_sup_log(NULL, CE_NOTE, "!state reset failed");
- }
-
- ATRACE("audio_sup_persist() returning, tmp_persistp", tmp_persistp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_persist() */
-
-/*
- * audio_sup_wiocdata()
- *
- * Description:
- * This routine is called by audio_sup_wput() to process the IOCDATA
- * messages that belong to the Audio Support Module's routines.
- *
- * We only support transparent ioctls.
- *
- * WARNING: Don't forget to free the mblk_t struct used to hold private
- * data. The done: jump point takes care of this.
- *
- * WARNING: Don't free the private mblk_t structure if the command is
- * going to call qreply(). This frees the private date that will
- * be needed for the next M_IOCDATA message.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes on return for
- * audio_sup_wput()
- */
-static int
-audio_sup_wiocdata(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- struct copyreq *cqp;
- struct copyresp *csp;
- audio_i_state_t *cmd;
- int error = 0;
-
- ATRACE("in audio_sup_wiocdata()", chptr);
-
- ASSERT(statep);
- ASSERT(chptr);
-
- csp = (struct copyresp *)mp->b_rptr; /* set up copy response ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
- cqp = (struct copyreq *)mp->b_rptr; /* set up copy request ptr */
-
- /* make sure we've got a good return value */
- if (csp->cp_rval) {
- ATRACE("audio_sup_wiocdata() bad return value", csp->cp_rval);
- error = EINVAL;
- goto done;
- }
-
- /* find the command */
- ATRACE_32("audio_sup_wiocdata() command", cmd->ais_command);
- switch (cmd->ais_command) {
-
- case AUDIO_COPY_OUT_CH_NUMBER: /* AUDIO_GET_CH_NUMBER */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CH_NUMBER", chptr);
- if (csp->cp_cmd != AUDIO_GET_CH_NUMBER) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_CH_TYPE: /* AUDIO_GET_CH_TYPE */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CH_TYPE", chptr);
- if (csp->cp_cmd != AUDIO_GET_CH_TYPE) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_NUM_CHS: /* AUDIO_GET_NUM_CHS */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CHANNELS", chptr);
- if (csp->cp_cmd != AUDIO_GET_NUM_CHS) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_AD_DEV: /* AUDIO_GET_AD_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_AD_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_AD_DEV) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_APM_DEV: /* AUDIO_GET_APM_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_APM_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_APM_DEV) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_AS_DEV: /* AUDIO_GET_AS_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_AS_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_AS_DEV) {
- error = EINVAL;
- }
- break;
-
- default:
- ATRACE("audio_sup_wiocdata() default", chptr);
- error = EINVAL;
- break;
- }
-
- /* we always either ack or nack depending on if error is set or not */
- ATRACE_32("audio_sup_wiocdata() switch done", error);
-
-done:
- if (csp->cp_private) {
- ATRACE("audio_sup_wiocdata() freeing csp->cp_private",
- csp->cp_private);
- kmem_free(csp->cp_private, sizeof (audio_i_state_t));
- csp->cp_private = NULL;
- }
- if (cqp->cq_private) {
- ATRACE("audio_sup_wiocdata() freeing cqp->cq_private",
- cqp->cq_private);
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE_32("audio_sup_wiocdata() returning", error);
-
- return (0);
-
-} /* audio_sup_wiocdata() */
-
-/*
- * audio_sup_wioctl()
- *
- * Description:
- * This routine is called by audio_sup_wput() to process all M_IOCTL
- * messages that the Audio Support Module provides.
- *
- * We only support transparent ioctls. Since this is a driver we
- * nack unrecognized ioctls.
- *
- * The following ioctls are supported:
- * AUDIO_GET_CH_NUMBER
- * AUDIO_GET_CH_TYPE
- * AUDIO_GET_NUM_CHS
- * AUDIO_GET_AD_DEV
- * AUDIO_GET_APM_DEV
- * AUDIO_GET_AS_DEV
- * unknown nack back up the queue
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * WARNING: There cannot be any locks owned by calling routines.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * audio_sup_wput()
- */
-static int
-audio_sup_wioctl(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_device_t *devp;
- struct iocblk *iocbp;
- audio_i_state_t *state = NULL;
- audio_device_type_e type = chptr->ch_info.dev_type;
- int error;
-
- ATRACE("in audio_sup_wioctl()", chptr);
-
- ASSERT(statep);
- ASSERT(chptr);
-
- ASSERT(!mutex_owned(&statep->as_lock));
-
- iocbp = (struct iocblk *)mp->b_rptr; /* pointer to ioctl info */
-
- /* make sure this is a transparent ioctl */
- if (iocbp->ioc_count != TRANSPARENT) {
- ATRACE_32("audio_sup_wioctl() not TRANSPARENT",
- iocbp->ioc_count);
- error = EINVAL;
- goto nack;
- }
-
- /* get a buffer for private data */
- if ((state = kmem_alloc(sizeof (*state), KM_NOSLEEP)) == NULL) {
- ATRACE("audio_sup_wioctl() state kmem_alloc() failed", 0);
- error = ENOMEM;
- goto nack;
- }
-
- ATRACE_32("audio_sup_wioctl() command", iocbp->ioc_cmd);
- switch (iocbp->ioc_cmd) {
-
- case AUDIO_GET_CH_NUMBER:
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_NUMBER", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_CH_NUMBER;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = chptr->ch_info.ch_number;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (int);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_NUMBER returning",
- chptr);
-
- return (0);
-
- /* end AUDIO_GET_CH_NUMBER */
-
- case AUDIO_GET_CH_TYPE:
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_TYPE", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_CH_TYPE;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = type;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (AUDIO);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_TYPE returning", chptr);
-
- return (0);
-
- /* end AUDIO_GET_CH_TYPE */
-
- case AUDIO_GET_NUM_CHS:
- ATRACE("audio_sup_wioctl() AUDIO_GET_NUM_CHS", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_NUM_CHS;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = statep->as_max_chs;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (int);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_NUM_CHS returning",
- chptr);
-
- return (0);
-
- /* end AUDIO_GET_NUM_CHS */
-
- case AUDIO_GET_AD_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_AD_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_AD_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (audio_device_t)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(chptr->ch_dev_info, devp, sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_AD_DEV returning", chptr);
-
- return (0);
-
- case AUDIO_GET_APM_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_APM_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_APM_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (*chptr->ch_dev_info)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(chptr->ch_apm_infop->apm_info, devp,
- sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_APM_DEV returning", chptr);
-
- return (0);
-
- case AUDIO_GET_AS_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_AS_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_AS_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (*chptr->ch_dev_info)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(&audio_device_info, devp, sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_AS_DEV returning", chptr);
-
- return (0);
-
- default: /* this should never happen */
- ATRACE_32("audio_sup_wioctl() default", iocbp->ioc_cmd);
- error = EINVAL;
- break;
- }
-
- /* we always nack */
- ATRACE_32("audio_sup_wioctl() switch done", error);
-
-nack:
- /* we always nack if we break out of the switch() */
- ATRACE("audio_sup_wioctl() nack", chptr);
-
- if (state) { /* free allocated state memory */
- ATRACE("audio_sup_wioctl() nack freeing state", state);
- kmem_free(state, sizeof (audio_i_state_t));
- }
-
- miocnak(q, mp, 0, error);
-
- ATRACE("audio_sup_wioctl() returning failure", chptr);
-
- return (0);
-
-} /* audio_sup_wioctl() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c b/usr/src/uts/common/io/audio/sada/mixer/am_ad.c
deleted file mode 100644
index 7d39aee5a7..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c
+++ /dev/null
@@ -1,5155 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * This file contains the code that the Audio Driver calls into and the
- * private routines that support these calls.
- *
- * NOTE: When allocating conversion buffers for recording we have to be
- * careful that the recording device isn't mono. Otherwise we won't
- * have enough memory for converting.
- *
- * These entry points are defined in audio_mixer.h:
- * am_attach()
- * am_detach()
- * am_get_audio()
- * am_play_shutdown()
- * am_send_audio()
- * am_hw_state_change()
- * am_get_src_data()
- * am_set_src_data()
- *
- * These additional functions are also provided:
- * am_ad_pause_play()
- * am_ad_set_config()
- * am_ad_set_format()
- * am_ad_setup()
- * am_ad_start_play()
- * am_ad_start_record()
- * am_ad_stop_play()
- * am_ad_stop_record()
- * am_ad_teadown()
- * am_ck_channels()
- * am_ck_combinations()
- * am_ck_sample_rate()
- * am_safe_putnext()
- * am_test_canputnext()
- */
-
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/stat.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/g711.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Local routine prototypes used only by this file.
- */
-static int am_attach_check(audio_state_t *,
- am_ad_info_t *, am_apm_private_t *, int);
-static int am_ck_sample_rate_sanity(am_ad_ch_cap_t *, int);
-static void am_convert_to_format(int *, void *, int, int, int, int);
-static int am_get_audio_multi(audio_state_t *, void *, int, int);
-static int am_get_audio_trad_compat(audio_state_t *, audio_apm_info_t *,
- void *, int);
-static int am_get_audio_trad_mixer(audio_state_t *, audio_apm_info_t *,
- void *, int);
-static int am_get_samples(audio_ch_t *, int, void *, int);
-static void am_play_shutdown_multi(audiohdl_t, int);
-static void am_play_shutdown_trad(audiohdl_t, audio_apm_info_t *);
-static void am_release_ad_access(am_apm_private_t *);
-static void am_send_audio_common(audio_ch_t *, void *, int);
-static void am_send_audio_multi(audio_state_t *, am_ad_info_t *, void *,
- int, int);
-static void am_send_audio_trad_compat(audio_state_t *, audio_apm_info_t *,
- int *, int);
-static void am_send_audio_trad_mixer(audio_state_t *, audio_apm_info_t *,
- int *, const int);
-static void am_serialize_ad_access(am_apm_private_t *);
-
-/*
- * Taskq callbacks.
- */
-static void am_hw_task(void *);
-
-/*
- * Module global hidden variables
- */
-static audio_device_t mixer_device_info = {
- MIXER_NAME,
- MIXER_VERSION,
- MIXER_CONFIGURATION
-};
-
-static int mixer_bufsize = AM_DEFAULT_MIX_BUFSIZE;
-
-/* XXX this is a lie */
-_NOTE(SCHEME_PROTECTS_DATA("this is a lie", mixer_bufsize))
-
-/*
- * The main routines for this file. These are the Audio Driver entry points.
- */
-
-/*
- * am_attach()
- *
- * TODO: Check for PLINK
- *
- * Description:
- * Attach an instance of the mixer. We initialize all the data structures
- * and register the APM for both AUDIO and AUDIOCTL. Two audio_apm_info
- * data structures are created, however they share the same private data
- * structure.
- *
- * We check both MIXER and COMPAT modes because we can switch between
- * them and thus we need to make sure everything is okay for both modes.
- * Plus we need the initial condition for both modes to support switching.
- *
- * NOTE: mutex_init() and cv_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * NOTE: It is okay for memory allocation to sleep.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * ddi_attach_cmd_t cmd Attach command
- * am_ad_info_t *ad_infop Ptr to the device's capabilities struct
- *
- * Returns:
- * AUDIO_SUCCESS If the mixer was initialized properly
- * AUDIO_FAILURE If the mixer couldn't be initialized properly
- */
-int
-am_attach(audiohdl_t handle, ddi_attach_cmd_t cmd, am_ad_info_t *ad_infop)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_info_t *hw_info;
- audio_apm_info_t *apm_infop1;
- audio_apm_info_t *apm_infop2;
- am_apm_persist_t *persistp;
- am_apm_private_t *stpptr;
- audio_apm_reg_t reg_info;
- minor_t minor;
- int mpgain = 0;
- int mpbal = 0;
- int mrgain = 0;
- int mrbal = 0;
- uint_t mgain = 0;
- uint_t pbalance = AUDIO_MID_BALANCE;
- uint_t pgain = 0;
- uint_t rbalance = AUDIO_MID_BALANCE;
- uint_t rgain = 0;
- int doread; /* device supports record */
- int dowrite; /* device supports play */
- int mode;
- int psr;
- int rsr;
-
- ATRACE("in am_attach()", ad_infop);
- ASSERT(statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- default:
- ATRACE_32("am_attach() unknown command failure", cmd);
- return (AUDIO_FAILURE);
- }
-
- /* before we do anything else make sure the interface versions are ok */
- if (ad_infop->ad_int_vers != AM_VERSION) {
- ATRACE_32("am_attach() unsupported interface versions",
- ad_infop->ad_int_vers);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() interface version not supported: %d",
- ad_infop->ad_int_vers);
- return (AUDIO_FAILURE);
- }
-
- /* get the properties from the .conf file */
- if ((mixer_bufsize = ddi_prop_get_int(DDI_DEV_T_ANY, statep->as_dip,
- DDI_PROP_DONTPASS, "mixer_bufsize", AM_DEFAULT_MIX_BUFSIZE)) ==
- AM_DEFAULT_MIX_BUFSIZE) {
- ATRACE_32("am_attach() setting mix buffer size",
- AM_DEFAULT_MIX_BUFSIZE);
-#ifdef DEBUG
- } else {
- ATRACE_32("am_attach() setting mix buffer size from .conf",
- mixer_bufsize);
-#else
- /*EMPTY*/
-#endif
- }
- if (mixer_bufsize < AM_DEFAULT_MIX_BUFSIZE) {
- ATRACE_32("am_attach() mix buffer too small", mixer_bufsize);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "ddi_prop_get_int() mix buffer too small, setting to %d",
- AM_DEFAULT_MIX_BUFSIZE);
- mixer_bufsize = AM_DEFAULT_MIX_BUFSIZE;
- ATRACE_32("am_attach() setting new mix buffer size",
- mixer_bufsize);
- }
-
- /* figure out the direction and sanity check */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
- if (!doread && !dowrite) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio device doesn't play or record");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach() doread", doread);
- ATRACE_32("am_attach() dowrite", dowrite);
-
- /* check the sample rate converter */
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* make sure the version is okay */
- if (dowrite &&
- ad_infop->ad_play.ad_conv->ad_version != AM_SRC_VERSION) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() bad play src version: %d",
- ad_infop->ad_play.ad_conv->ad_version);
- return (AUDIO_FAILURE);
- }
- if (doread &&
- ad_infop->ad_record.ad_conv->ad_version != AM_SRC_VERSION) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() bad record src version: %d",
- ad_infop->ad_record.ad_conv->ad_version);
- return (AUDIO_FAILURE);
- }
- }
-
- /* get the state pointer for this instance */
- if ((statep = audio_sup_devinfo_to_state(statep->as_dip)) == NULL) {
- ATRACE("am_attach() couldn't get state structure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't get state structure");
- return (AUDIO_FAILURE);
- }
-
- /* allocate the audio mixer private data */
- stpptr = kmem_zalloc(sizeof (*stpptr), KM_SLEEP);
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr));
-
- hw_info = &stpptr->am_hw_info;
-
- /* make sure we won't free the device state structure */
- hw_info->ref_cnt = 1;
-
- /* we assume the device is on line when we attach */
- stpptr->am_flags |= AM_PRIV_ON_LINE;
-
- /* initialize mutexes and cvs */
- mutex_init(&stpptr->am_mode_lock, NULL, MUTEX_DRIVER, NULL);
- mutex_init(&stpptr->am_ad_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&stpptr->am_mode_cv, NULL, CV_DRIVER, NULL);
- cv_init(&stpptr->am_ad_cv, NULL, CV_DRIVER, NULL);
-
- /*
- * WARNING: From here on all error returns must be through one
- * of the error_? labels. Otherwise we'll have a memory leak.
- */
-
- /* start off with allocating the signal message buffer */
- if ((stpptr->am_sig_mp = allocb(sizeof (int8_t), BPRI_HI)) == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach() couldn't allocate message block to send signal");
- goto error_free_private;
- }
- ASSERT(stpptr->am_sig_mp->b_cont == 0);
- /* turn it into a signal */
- stpptr->am_sig_mp->b_datap->db_type = M_PCSIG;
- *stpptr->am_sig_mp->b_wptr++ = SIGPOLL;
-
- /* register the mixer with the Audio Support Module */
- reg_info.aar_version = AM_AAR_VERSION;
- reg_info.aar_apm_open = am_open_audio;
- reg_info.aar_apm_close = am_close_audio;
- reg_info.aar_apm_save_state = am_save_state;
- reg_info.aar_apm_restore_state = am_restore_state;
- reg_info.aar_private = stpptr;
- reg_info.aar_info = ad_infop;
- reg_info.aar_state = hw_info;
- reg_info.aar_dev_info = &mixer_device_info;
-
- if ((apm_infop1 = audio_sup_register_apm(statep, AUDIO,
- &reg_info)) == NULL) {
- ATRACE_32("am_attach() couldn't register AUDIO", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "couldn't register the AUDIO device with audiosup");
- goto error_free_msg;
- }
-
- reg_info.aar_apm_open = am_open_audioctl;
- reg_info.aar_apm_close = am_close_audioctl;
- reg_info.aar_apm_save_state = NULL;
- reg_info.aar_apm_restore_state = NULL;
-
- if ((apm_infop2 = audio_sup_register_apm(statep, AUDIOCTL,
- &reg_info)) == NULL) {
- ATRACE_32("am_attach() couldn't register AUDIOCTL", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "couldn't register the AUDIOCTL device with audiosup");
- goto error_unregister;
- }
-
- /* set the max input and output channels, making sure they are sane */
- if (ad_infop->ad_record.ad_max_chs > statep->as_max_chs) {
- stpptr->am_max_in_chs = statep->as_max_chs;
- } else {
- stpptr->am_max_in_chs = ad_infop->ad_record.ad_max_chs;
- }
- if (ad_infop->ad_play.ad_max_chs > statep->as_max_chs) {
- stpptr->am_max_out_chs = statep->as_max_chs;
- } else {
- stpptr->am_max_out_chs = ad_infop->ad_play.ad_max_chs;
- }
- ATRACE_32("am_attach() am_max_in_chs", stpptr->am_max_in_chs);
- ATRACE_32("am_attach() am_max_out_chs", stpptr->am_max_out_chs);
-
- /* get the persistent state, if not there then first time so allocate */
- persistp = audio_sup_get_persist_state(statep, AUDIO);
- if (persistp == NULL) {
- ATRACE("am_attach() 1st time persist or reset state", persistp);
-
- /* allocate the structure and save */
- persistp = kmem_alloc(sizeof (*persistp), KM_SLEEP);
- if (audio_sup_set_persist_state(statep, AUDIO,
- persistp, sizeof (*persistp)) == AUDIO_FAILURE) {
- ATRACE("am_attach() cannot set persist", 0)
- goto error_unregister;
- }
-
- /* get the mode from the driver */
- mode = ad_infop->ad_mode;
-
- /* and also get the monitor gain */
- mgain = ad_infop->ad_defaults->monitor_gain;
-
- /* get the gains from the drive, based on mode */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (dowrite) {
- pgain = AM_DEFAULT_MIXER_GAIN;
- pbalance = AUDIO_MID_BALANCE;
- mpgain = pgain;
- mpbal = pbalance;
- }
- if (doread) {
- rgain = AUDIO_MID_GAIN;
- rbalance = AUDIO_MID_BALANCE;
- mrgain = rgain;
- mrbal = rbalance;
- }
- } else {
- if (dowrite) {
- pgain = ad_infop->ad_defaults->play.gain;
- pbalance = ad_infop->ad_defaults->play.balance;
- }
- if (doread) {
- rgain = ad_infop->ad_defaults->record.gain;
- rbalance =
- ad_infop->ad_defaults->record.balance;
- }
- }
-
- persistp->apm_mpgain = pgain;
- persistp->apm_mpbal = pbalance;
- persistp->apm_mrgain = rgain;
- persistp->apm_mrbal = rbalance;
- persistp->apm_mode = mode;
- persistp->apm_pgain = pgain;
- persistp->apm_pbal = pbalance;
- persistp->apm_rgain = rgain;
- persistp->apm_rbal = rbalance;
- persistp->apm_mgain = mgain;
-
- if (dowrite) {
- ad_infop->ad_defaults->play.port |=
- ad_infop->ad_defaults->play.avail_ports ^
- ad_infop->ad_defaults->play.mod_ports;
- }
- if (doread) {
- ad_infop->ad_defaults->record.port |=
- ad_infop->ad_defaults->record.avail_ports ^
- ad_infop->ad_defaults->record.mod_ports;
- }
- } else {
- /* the mode comes from the peristent data */
- mode = persistp->apm_mode;
- mpgain = persistp->apm_mpgain;
- mpbal = persistp->apm_mpbal;
- mrgain = persistp->apm_mrgain;
- mrbal = persistp->apm_mrbal;
- pgain = persistp->apm_pgain;
- pbalance = persistp->apm_pbal;
- ad_infop->ad_defaults->play.port = persistp->apm_pport;
- ad_infop->ad_defaults->output_muted = persistp->apm_pmute;
- rgain = persistp->apm_rgain;
- rbalance = persistp->apm_rbal;
- mgain = persistp->apm_mgain;
- ad_infop->ad_defaults->record.port = persistp->apm_rport;
- }
-
- /* save persistent state in private data structure */
- stpptr->am_pstate = persistp;
-
- /*
- * CAUTION: Keep the calls in am_restore_state() the same as in
- * this routine. There may be order dependencies and once the
- * audio driver works we don't want to break it if we change
- * the order.
- *
- * Check the write capabilities, if the device supports it.
- */
- ASSERT(stpptr->am_pflags == NULL);
- ASSERT(stpptr->am_rflags == NULL);
- if (dowrite) {
- if (am_attach_check(statep, ad_infop, stpptr, AUDIO_PLAY) ==
- AUDIO_FAILURE) {
- ATRACE("am_attach() am_attach_check() failed", 0);
- goto error_unregister_both;
- }
-
- /* get initial conditions */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- psr = stpptr->am_save_psr;
- } else {
- psr = ad_infop->ad_defaults->play.sample_rate;
- }
-
- /* see if we need to translate to unsigned */
- if (ad_infop->ad_translate_flags & AM_MISC_16_P_TRANSLATE) {
- stpptr->am_pflags |= AM_PRIV_16_TRANS;
- }
- if (ad_infop->ad_translate_flags & AM_MISC_8_P_TRANSLATE) {
- stpptr->am_pflags |= AM_PRIV_8_TRANS;
- }
-
- /* now that we've got the h/w info we set the initial format */
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_PLAY, psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_NO_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_WARN, "am_attach() "
- "couldn't set play data format: %d %d %d %d",
- psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc);
- goto error_unregister_both;
- }
-
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (am_set_gain(statep, apm_infop1,
- hw_info->play.channels, mpgain, mpbal, AUDIO_PLAY,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set mixer play gain");
- goto error_unregister_both;
- }
- } else {
- if (am_set_gain(statep, apm_infop1,
- hw_info->play.channels, pgain, pbalance, AUDIO_PLAY,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set compat play gain");
- goto error_unregister_both;
- }
- }
- } else {
- ASSERT(hw_info->play.sample_rate == 0);
- pgain = AUDIO_MIN_GAIN;
- pbalance = AUDIO_MID_BALANCE;
- }
- hw_info->play.gain = pgain;
- hw_info->play.balance = pbalance;
-
- /* now check the read capabilities, if the device supports it */
- if (doread) {
- if (am_attach_check(statep, ad_infop, stpptr, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- ATRACE("am_attach() am_attach_check() failed", 0);
- goto error_unregister_both;
- }
-
- /* get initial conditions */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- rsr = stpptr->am_save_rsr;
- } else {
- rsr = ad_infop->ad_defaults->record.sample_rate;
- }
-
- /* see if we need to translate to unsigned */
- if (ad_infop->ad_translate_flags & AM_MISC_16_R_TRANSLATE) {
- stpptr->am_rflags |= AM_PRIV_16_TRANS;
- }
- if (ad_infop->ad_translate_flags & AM_MISC_8_R_TRANSLATE) {
- stpptr->am_rflags |= AM_PRIV_8_TRANS;
- }
-
- /* now that we've got the h/w info we set the initial format */
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_RECORD, rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_NO_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set record data format: %d %d %d %d",
- rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc);
- goto error_unregister_both;
- }
-
- /* set the gains */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (am_set_gain(statep, apm_infop1,
- hw_info->record.channels, mrgain, mrbal,
- AUDIO_RECORD, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set mixer record gain");
- goto error_unregister_both;
- }
- } else {
- if (am_set_gain(statep, apm_infop1,
- hw_info->record.channels, rgain, rbalance,
- AUDIO_RECORD, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set compat record gain");
- goto error_unregister_both;
- }
- }
- } else {
- ASSERT(hw_info->record.sample_rate == 0);
- rgain = AUDIO_MIN_GAIN;
- rbalance = AUDIO_MID_BALANCE;
- }
- hw_info->record.gain = rgain;
- hw_info->record.balance = rbalance;
-
- /* starting point for unmute */
- stpptr->am_save_hw_rgain = AUDIO_MID_GAIN;
-
- /*
- * Allocate mix and send buffers, but only if TRAD Codec and doing
- * this direction.
- */
- ASSERT(stpptr->am_mix_size == 0);
- ASSERT(stpptr->am_mix_buf == NULL);
- ASSERT(stpptr->am_send_size == 0);
- ASSERT(stpptr->am_send_buf == NULL);
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* allocate the mix buffer */
- if (dowrite) {
- stpptr->am_mix_buf = kmem_alloc(mixer_bufsize,
- KM_SLEEP);
- stpptr->am_mix_size = mixer_bufsize;
- }
-
- /* allocate the send buffer */
- if (doread) {
- stpptr->am_send_buf = kmem_alloc(mixer_bufsize,
- KM_SLEEP);
- stpptr->am_send_size = mixer_bufsize;
- }
- }
-
- /* create the devices for successive open()'s to clone off of */
- if ((minor = audio_sup_type_to_minor(AUDIO)) == AUDIO_FAILURE) {
- ATRACE("am_attach() sound,audio get minor failure", minor);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audio minor node failure");
- goto error_unregister_both;
- }
- minor += statep->as_dev_instance *
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
- if (ddi_create_minor_node(statep->as_dip, "sound,audio", S_IFCHR,
- minor, DDI_NT_AUDIO, 0) == DDI_FAILURE) {
- ATRACE("am_attach() sound,audio minor dev failure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audio minor node failure");
- goto error_unregister_both;
- }
-
- if ((minor = audio_sup_type_to_minor(AUDIOCTL)) == AUDIO_FAILURE) {
- ATRACE("am_attach() sound,audioctl get minor failure", minor);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audioctl minor node failure");
- goto error_rem_minor;
- }
- minor += statep->as_dev_instance *
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
- if (ddi_create_minor_node(statep->as_dip, "sound,audioctl", S_IFCHR,
- minor, DDI_NT_AUDIO, 0) == DDI_FAILURE) {
- ATRACE("am_attach() sound,audioctl minor dev failure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audioctl minor node failure");
- goto error_rem_minor;
- }
-
- ASSERT(hw_info->play.port == 0);
- ASSERT(hw_info->play.avail_ports == 0);
- ASSERT(hw_info->play.mod_ports == 0);
- /* turn on in the state structure those ports that will always be on */
- if (dowrite) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_PLAY,
- ad_infop->ad_defaults->play.port, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set play port: 0x%x",
- ad_infop->ad_defaults->play.port);
- goto error_rem_minor;
- } else {
- hw_info->play.port =
- ad_infop->ad_defaults->play.port;
- hw_info->play.avail_ports =
- ad_infop->ad_defaults->play.avail_ports;
- hw_info->play.mod_ports =
- ad_infop->ad_defaults->play.mod_ports;
- }
- }
- ASSERT(hw_info->record.port == 0);
- ASSERT(hw_info->record.avail_ports == 0);
- ASSERT(hw_info->record.mod_ports == 0);
- /* turn on in the state structure those ports that will always be on */
- if (doread) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_RECORD,
- ad_infop->ad_defaults->record.port, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set record port: 0x%x",
- ad_infop->ad_defaults->record.port);
- goto error_rem_minor;
- } else {
- hw_info->record.port =
- ad_infop->ad_defaults->record.port;
- hw_info->record.avail_ports =
- ad_infop->ad_defaults->record.avail_ports;
- hw_info->record.mod_ports =
- ad_infop->ad_defaults->record.mod_ports;
- }
- }
-
- if ((ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_IN2OUT) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, mgain, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set monitor gain: 0x%x", mgain);
- goto error_rem_minor;
- }
-
- if (dowrite && am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- ad_infop->ad_defaults->output_muted, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set output muted: 0x%x",
- ad_infop->ad_defaults->output_muted);
- goto error_rem_minor;
- }
-
- if (doread && (ad_infop->ad_assist_flags & AM_ASSIST_MIC) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_MIC_BOOST, AUDIO_RECORD,
- (ad_infop->ad_add_mode & AM_ADD_MODE_MIC_BOOST), NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set mic boost: 0x%x",
- ad_infop->ad_add_mode);
- goto error_rem_minor;
- }
-
- /* set misc hardware state */
- if (dowrite) {
- hw_info->play.buffer_size =
- ad_infop->ad_defaults->play.buffer_size;
- } else {
- hw_info->play.buffer_size = 0;
- }
- ASSERT(hw_info->play.samples == 0);
- ASSERT(hw_info->play.eof == 0);
- ASSERT(hw_info->play.pause == 0);
- ASSERT(hw_info->play.error == 0);
- ASSERT(hw_info->play.waiting == 0);
- ASSERT(hw_info->play.minordev == 0);
- ASSERT(hw_info->play.open == 0);
- ASSERT(hw_info->play.active == 0);
- if (doread) {
- hw_info->record.buffer_size =
- ad_infop->ad_defaults->record.buffer_size;
- } else {
- hw_info->record.buffer_size = 0;
- }
- ASSERT(hw_info->record.samples == 0);
- ASSERT(hw_info->record.eof == 0);
- ASSERT(hw_info->record.pause == 0);
- ASSERT(hw_info->record.error == 0);
- ASSERT(hw_info->record.waiting == 0);
- ASSERT(hw_info->record.minordev == 0);
- ASSERT(hw_info->record.open == 0);
- ASSERT(hw_info->record.active == 0);
-
- hw_info->monitor_gain = mgain;
- hw_info->output_muted = ad_infop->ad_defaults->output_muted;
- hw_info->hw_features = ad_infop->ad_defaults->hw_features;
- hw_info->sw_features = ad_infop->ad_defaults->sw_features;
-
- if (mode == AM_MIXER_MODE) {
- hw_info->sw_features_enabled = AUDIO_SWFEATURE_MIXER;
- } else {
- hw_info->sw_features_enabled = 0;
- }
-
- /* create a single threaded task queue, this always succeeds */
- stpptr->am_taskq = audio_sup_taskq_create(AM_PRIV_TASKQ_NAME);
- if (stpptr->am_taskq == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't create the taskq, out of memory");
- goto error_rem_minor;
- }
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
-
- ATRACE_32("am_attach() returning", statep->as_dev_instance);
-
- return (AUDIO_SUCCESS);
-
-error_rem_minor:
- ATRACE("am_attach() failure, removing minor nodes", 0);
- /*
- * We don't use NULL because other APMs may own other minor devices
- * and we don't want to remove them from under them.
- */
- ddi_remove_minor_node(statep->as_dip, "sound,audio");
- ddi_remove_minor_node(statep->as_dip, "sound,audioctl");
-
-error_unregister_both:
- mutex_enter(&apm_infop2->apm_lock);
- apm_infop2->apm_private = NULL;
- mutex_exit(&apm_infop2->apm_lock);
- if (audio_sup_unregister_apm(statep, AUDIOCTL) == AUDIO_FAILURE) {
- ATRACE_32("am_attach() audio_sup_unregister_apm() "
- "AUDIOCTL failed", statep->as_dev_instance);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio_sup_unregister_apm() "
- "AUDIOCTL failed");
- }
-
-error_unregister:
- mutex_enter(&apm_infop1->apm_lock);
- apm_infop1->apm_private = NULL;
- mutex_exit(&apm_infop1->apm_lock);
- if (audio_sup_unregister_apm(statep, AUDIO) == AUDIO_FAILURE) {
- ATRACE_32("am_attach() audio_sup_unregister_apm() "
- "AUDIO failed", statep->as_dev_instance);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio_sup_unregister_apm() "
- "AUDIO failed");
- }
-
-error_free_msg:
- freemsg(stpptr->am_sig_mp);
-
-error_free_private:
- /* destroy mutexes and cvs */
- mutex_destroy(&stpptr->am_mode_lock);
- mutex_destroy(&stpptr->am_ad_lock);
- cv_destroy(&stpptr->am_mode_cv);
- cv_destroy(&stpptr->am_ad_cv);
-
- ATRACE("am_attach() failure, freeing private structure", 0);
- if (stpptr->am_mix_buf) {
- kmem_free(stpptr->am_mix_buf, stpptr->am_mix_size);
- }
- if (stpptr->am_send_buf) {
- kmem_free(stpptr->am_send_buf, stpptr->am_send_size);
- }
- kmem_free(stpptr, sizeof (*stpptr));
-
-fail:
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
- ATRACE("am_attach() returning failure", 0);
-
- return (AUDIO_FAILURE);
-
-} /* am_attach() */
-
-/*
- * am_detach()
- *
- * Description:
- * Detach an instance of the mixer. Free up all data structures and
- * unregister the APM for both AUDIO and AUDIOCTL. We also remove
- * the device nodes. However it is possible another APM may still be
- * attached, so we are careful to only remove the audio and audioctl
- * devices.
- *
- * NOTE: This routine will never be called in the audio device
- * has any channels in use, so we don't need to check
- * for this.
- *
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * AUDIO_SUCCESS If the mixer was detached
- * AUDIO_FAILURE If the mixer couldn't be detached
- */
-int
-am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop1;
- audio_apm_info_t *apm_infop2;
- am_apm_private_t *stpptr;
- am_apm_persist_t *persistp;
- audio_info_t *hw_info;
-
- ATRACE_32("in am_detach()", cmd);
- ATRACE("am_detach() handle", handle);
- ASSERT(statep);
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- default:
- ATRACE_32("am_detach() unknown command failure", cmd);
- return (AUDIO_FAILURE);
- }
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr));
-
- /*
- * Remove only the AUDIO and AUDIOCTL minor nodes for this
- * dev_info. We don't want to free the nodes other APMs are
- * responsible for.
- */
- ddi_remove_minor_node(statep->as_dip, "sound,audio");
- ddi_remove_minor_node(statep->as_dip, "sound,audioctl");
-
- /* get rid of the private data structure */
- if ((apm_infop1 = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_detach() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_get_apm_info() AUDIO failed");
-
- goto fail;
- }
- if ((apm_infop2 =
- audio_sup_get_apm_info(statep, AUDIOCTL)) == NULL) {
- ATRACE("am_detach() audio_sup_get_apm_info() AUDIOCTL failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_get_apm_info() AUDIOCTL failed");
-
- goto fail;
- }
- /*
- * Both apm_info pointers use the same apm_private structure, so we
- * only need to clear it once.
- */
- stpptr = apm_infop1->apm_private;
- ASSERT(stpptr->am_channels == 0);
- ASSERT(stpptr->am_in_chs == 0);
- ASSERT(stpptr->am_out_chs == 0);
-
- /* save the current h/w state in persistent memory */
- hw_info = &stpptr->am_hw_info;
- persistp = stpptr->am_pstate;
- if (persistp->apm_mode == AM_MIXER_MODE) {
- persistp->apm_mpgain = hw_info->play.gain;
- persistp->apm_mpbal = hw_info->play.balance;
- persistp->apm_mrgain = hw_info->record.gain;
- persistp->apm_mrbal = hw_info->record.balance;
- }
- persistp->apm_pgain = hw_info->play.gain;
- persistp->apm_pbal = hw_info->play.balance;
- persistp->apm_pport = hw_info->play.port;
- persistp->apm_pmute = hw_info->output_muted;
- persistp->apm_rgain = hw_info->record.gain;
- persistp->apm_rbal = hw_info->record.balance;
- persistp->apm_rport = hw_info->record.port;
- persistp->apm_mgain = hw_info->monitor_gain;
-
- /* wait for the taskq to empty and then destroy it */
- audio_sup_taskq_wait(stpptr->am_taskq);
- audio_sup_taskq_destroy(stpptr->am_taskq);
-
- /* destroy mutexes and cvs */
- mutex_destroy(&stpptr->am_mode_lock);
- mutex_destroy(&stpptr->am_ad_lock);
- cv_destroy(&stpptr->am_mode_cv);
- cv_destroy(&stpptr->am_ad_cv);
-
- ASSERT(stpptr->am_sig_mp);
- freemsg(stpptr->am_sig_mp);
-
- if (stpptr->am_mix_buf) {
- ASSERT(stpptr->am_mix_size);
- kmem_free(stpptr->am_mix_buf, stpptr->am_mix_size);
- }
- if (stpptr->am_send_buf) {
- ASSERT(stpptr->am_send_size);
- kmem_free(stpptr->am_send_buf, stpptr->am_send_size);
- }
- kmem_free(stpptr, sizeof (*stpptr));
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
-
- mutex_enter(&apm_infop1->apm_lock);
- apm_infop1->apm_private = NULL;
- mutex_exit(&apm_infop1->apm_lock);
- mutex_enter(&apm_infop2->apm_lock);
- apm_infop2->apm_private = NULL;
- mutex_exit(&apm_infop2->apm_lock);
-
- if (audio_sup_unregister_apm(statep, AUDIO) == AUDIO_FAILURE) {
- ATRACE("am_detach() audio_sup_unregister_apm() "
- "AUDIO failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_unregister_apm() "
- "AUDIO failed");
- }
-
- if (audio_sup_unregister_apm(statep, AUDIOCTL) == AUDIO_FAILURE) {
- ATRACE("am_detach() audio_sup_unregister_apm() "
- "AUDIOCTL failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_unregister_apm() "
- "AUDIOCTL failed");
- }
-
- ATRACE("am_detach() done", statep);
-
- return (AUDIO_SUCCESS);
-
-fail:
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
- return (AUDIO_FAILURE);
-
-} /* am_detach() */
-
-/*
- * am_get_audio()
- *
- * Description:
- * This routine directs the call to get audio depending on whether or
- * not the Codec is a traditional or multi-channel Codec. It also does
- * some error checking to make sure the call is valid.
- *
- * It is an error for the number of samples to not be modulo the
- * hardware's number of channels. The old diaudio driver would hang
- * the channel until it was closed. We throw away enough of the damaged
- * sample and press on.
- *
- * We support devices that accept only unsigned linear PCM by translating
- * the final data, if required.
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *buf The buffer to place the audio into
- * int channel For multi-channel Codecs this is the channel
- * that will be playing the sound.
- * int samples The number of samples to get
- *
- * Returns
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-int
-am_get_audio(audiohdl_t handle, void *buf, int channel, int samples)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- uint_t hw_channels;
- int mode;
- int rc;
-
- ATRACE_32("in am_get_audio() samples requested", samples);
- ASSERT(statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_get_audio() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "get_audio() "
- "audio_sup_get_apm_info() AUDIO failed, audio lost");
- return (AUDIO_FAILURE);
- }
-
- ad_infop = apm_infop->apm_ad_infop;
- stpptr = apm_infop->apm_private;
-
- /*
- * Make sure we don't ask for more data than the mixer can provide.
- * The mixer uses mixer_bufsize to allocate buffers so we must insure
- * that we don't try to mix too much and thus get into trouble.
- */
- if ((samples << AM_INT32_SHIFT) > mixer_bufsize) {
- samples = mixer_bufsize >> AM_INT32_SHIFT;
- ATRACE("am_get_audio() asking for too many samples, resetting",
- samples);
- }
-
- /* deal with multi-channel Codecs or regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_get_audio() calling am_get_audio_multi()", statep);
- ASSERT(channel != AUDIO_NO_CHANNEL);
- rc = am_get_audio_multi(statep, buf, channel, samples);
- ATRACE_32("am_get_audio() am_get_audio_multi() returning", rc);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ASSERT(channel == AUDIO_NO_CHANNEL);
-
- /* make sure the # of samples is modulo the # of H/W channels */
- hw_channels = stpptr->am_hw_pchs;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_get_audio() bad sample size", samples);
- samples -= samples % hw_channels;
- }
-
- mode = stpptr->am_pstate->apm_mode;
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_get_audio() "
- "calling am_get_audio_trad_mixer()", statep);
- rc = am_get_audio_trad_mixer(statep, apm_infop, buf,
- samples);
- ATRACE_32("am_get_audio() "
- "am_get_audio_trad_mixer() returning", rc);
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- ATRACE("am_get_audio() "
- "calling am_get_audio_trad_compat()", statep);
- rc = am_get_audio_trad_compat(statep, apm_infop, buf,
- samples);
- ATRACE_32("am_get_audio() "
- "am_get_audio_trad_compat() returning", rc);
- }
- }
-
- return (rc);
-
-} /* am_get_audio() */
-
-/*
- * am_hw_state_change()
- *
- * Description:
- * This routine provides feedback from the audio driver to the mixer
- * when a user has caused a state change. Usually this is by a button
- * or knob that the user presses or turns on a speaker or mic. Currently
- * support for this feedback is somewhat limited as we only support
- * gain, balance, and mute.
- *
- * NOTE: We don't include a channel argument because user input is
- * fairly limited, it is oriented towards the master hardware
- * device.
- *
- * NOTE: Unlike the ioctl()s, we don't increment acp_tq_cnt. acp_tq_cnt
- * is on a per channel basis and we aren't doing this work for any
- * one channel, but for the whole device. This means that there
- * aren't any close()s that are going to wait for these tasks to
- * complete.
- *
- * NOTE: Mute is a toggle from the current setting.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int cmd Command for update
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int value The value to scale
- * int sleep AUDIO_NO_SLEEP or AUDIO_SLEEP
- *
- * Returns:
- * AUDIO_SUCCESS Command queued up on the taskq
- * AUDIO_FAILURE Bad argument, can't allocate memory, etc
- */
-int
-am_hw_state_change(audiohdl_t handle, int cmd, int dir, int value, int sleep)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- am_state_ch_args_t *arg;
-
- ATRACE("in am_hw_state_change()", handle);
-
- /* make sure the handle is good */
- if (handle == NULL) {
- ATRACE("am_hw_state_change() bad handle", handle);
- return (AUDIO_FAILURE);
- }
-
- /* don't allow both play and record */
- if ((dir & AUDIO_BOTH) == AUDIO_BOTH) {
- ATRACE_32("am_hw_state_change() bad direction", dir);
- return (AUDIO_FAILURE);
- }
-
- /* don't allow both sleep and no sleep */
- if (sleep == (AUDIO_NO_SLEEP|AUDIO_SLEEP)) {
- ATRACE_32("am_hw_state_change() bad sleep", sleep);
- return (AUDIO_FAILURE);
- }
- if (sleep == AUDIO_SLEEP) {
- sleep = KM_SLEEP;
- } else {
- ASSERT(sleep == AUDIO_NO_SLEEP);
- sleep = KM_NOSLEEP;
- }
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_hw_state_change() "
- "audio_sup_get_apm_info() AUDIO failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "am_hw_state_change() "
- "audio_sup_get_apm_info() AUDIO failed");
- return (AUDIO_FAILURE);
- }
- stpptr = apm_infop->apm_private;
-
- /* Check if we have a valid taskq */
- if (stpptr->am_taskq == NULL) {
- ATRACE("am_hw_state_change() taskq not setup", stpptr);
- return (AUDIO_FAILURE);
- }
-
- switch (cmd) {
- case AM_HWSC_SET_GAIN_ABS:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_BAL_ABS:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_GAIN_DELTA:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_BAL_DELTA:
- /*FALLTHROUGH*/
- case AM_HWSC_MUTE_TOGGLE:
- /* does the h/w support the direction? */
- ad_infop = apm_infop->apm_ad_infop;
- if ((dir == AUDIO_PLAY &&
- !(ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_PLAY)) ||
- (dir == AUDIO_RECORD &&
- !(ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_RECORD))) {
- ATRACE_32("am_hw_state_change() dir !supported", dir);
- return (AUDIO_FAILURE);
- }
-
- /* allocate argument memory for taskq */
- if ((arg = kmem_alloc(sizeof (*arg), sleep)) == NULL) {
- ATRACE("am_hw_state_change() alloc failed", statep);
- return (AUDIO_FAILURE);
- }
- arg->asca_statep = statep;
- arg->asca_apm_infop = apm_infop;
- arg->asca_cmd = cmd;
- arg->asca_dir = dir;
- arg->asca_value = value;
-
- break;
- case AM_HWSC_ONLINE:
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags |= AM_PRIV_ON_LINE;
- mutex_exit(&apm_infop->apm_lock);
-
- return (AUDIO_SUCCESS);
- case AM_HWSC_OFFLINE:
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_ON_LINE;
- mutex_exit(&apm_infop->apm_lock);
-
- return (AUDIO_SUCCESS);
- default:
- ATRACE_32("am_hw_state_change() bad command", cmd);
- return (AUDIO_FAILURE);
- }
-
- /* schedule the task */
- if (audio_sup_taskq_dispatch(stpptr->am_taskq, am_hw_task,
- arg, sleep) == AUDIO_FAILURE) {
- kmem_free(arg, sizeof (*arg));
- ATRACE("am_hw_state_change() taskq sched failed", statep);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("am_hw_state_change() done", handle);
-
- return (AUDIO_SUCCESS);
-
-} /* am_hw_state_change() */
-
-/*
- * am_play_shutdown()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int channel For multi-stream Codecs this is the
- * stream to shutdown.
- *
- * Returns:
- * void
- */
-void
-am_play_shutdown(audiohdl_t handle, int channel)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
-
- ATRACE("in am_play_shutdown()", handle);
- ASSERT(statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_play_shutdown() audio_sup_get_apm_info() failed", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "play_shutdown() audio_sup_get_apm_info() failed");
- return;
- }
- ad_infop = apm_infop->apm_ad_infop;
-
- /* deal with multi-channel Codecs vs. regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_play_shutdown() calling shutdown_multi()", ad_infop);
- am_play_shutdown_multi(handle, channel);
- ATRACE("am_play_shutdown() shutdown_multi() done", ad_infop);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ATRACE("am_play_shutdown() calling shutdown_trad()", ad_infop);
- am_play_shutdown_trad(handle, apm_infop);
- ATRACE("am_play_shutdown() shutdown_trad() done", ad_infop);
- }
-
- ATRACE("am_play_shutdown() returning", statep);
-
- return;
-
-} /* am_play_shutdown() */
-
-/*
- * am_send_audio()
- * This routine directs the call to send audio depending on whether or
- * not the Codec is a traditional or multi-channel Codec. It also does
- * some error checking to make sure the call is valid.
- *
- * It is an error for the number of samples to not be modulo the
- * hardware's number of channels. The old diaudio driver would hang
- * the channel until it was closed. We throw away enough of the damaged
- * sample and press on.
- *
- * We support devices that provide only unsigned linear PCM by translating
- * the data to signed before it is used.
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * sends. So it is samples at the hardware's sample rate.
- *
- * Description:
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *buf The buffer the audio is in
- * int channel For multi-channel Codecs this is the
- * channel that will be receiving the audio
- * int samples The number of samples to send
- *
- * Returns
- * void
- */
-void
-am_send_audio(audiohdl_t handle, void *buf, int channel, int samples)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- size_t size;
- uint_t hw_channels;
- int mode;
-
- ATRACE("in am_send_audio()", handle);
- ATRACE("am_send_audio() buf", buf);
- ATRACE("am_send_audio() channel", channel);
- ATRACE("am_send_audio() samples", samples);
- ASSERT(statep);
-
- /* reject processing 0 or less samples */
- if (samples <= 0 || samples > AM_MAX_SAMPLES) {
- ATRACE_32("am_send_audio() bad samples arg #1, returning",
- samples);
- return;
- }
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_send_audio() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "send_audio() audio_sup_get_apm_info() "
- "AUDIO failed, recorded audio lost");
- return;
- }
-
- ad_infop = apm_infop->apm_ad_infop;
-
- /* deal with multi-channel Codecs or regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_send_audio() calling am_send_audio_multi()", statep);
- ASSERT(channel != AUDIO_NO_CHANNEL);
- am_send_audio_multi(statep, apm_infop->apm_ad_infop, buf,
- channel, samples);
- ATRACE_32("am_send_audio() am_send_audio_multi() returning", 0);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ASSERT(channel == AUDIO_NO_CHANNEL);
-
- /* make sure the # of samples is modulo the # of H/W channels */
- stpptr = apm_infop->apm_private;
- hw_channels = stpptr->am_hw_rchs;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_send_audio() bad sample size", samples);
- samples -= samples % hw_channels;
- ATRACE("am_send_audio() adjusted samples", samples);
- if (samples <= 0) {
- ATRACE_32("am_send_audio() bad samples arg #2",
- samples);
- return;
- }
- }
-
- /* make sure the send buffer is large enough */
- size = ((size_t)samples) << AM_TIMES_4_SHIFT;
- ATRACE("am_send_audio() size", size);
-
- mutex_enter(&apm_infop->apm_lock);
-
- if (stpptr->am_send_size < size) {
- ATRACE("am_send_audio() old am_send_buf",
- stpptr->am_send_buf);
- ATRACE("am_send_audio() old am_send_size",
- stpptr->am_send_size);
- if (stpptr->am_send_size) {
- kmem_free(stpptr->am_send_buf,
- stpptr->am_send_size);
- }
- stpptr->am_send_buf = kmem_alloc(size, KM_NOSLEEP);
- if (stpptr->am_send_buf == NULL) {
- stpptr->am_send_size = 0;
- mutex_exit(&apm_infop->apm_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "!mixer: send_audio_trad() "
- "couldn't allocate send buffer, audio "
- "lost");
- return;
- }
- stpptr->am_send_size = size;
- ATRACE("am_send_audio() new am_send_buf",
- stpptr->am_send_buf);
- ATRACE("am_send_audio() new am_send_size",
- stpptr->am_send_size);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /* convert to canonical format */
- am_convert_to_int(buf, stpptr->am_send_buf, samples,
- stpptr->am_hw_rprec, stpptr->am_hw_renc, stpptr->am_rflags);
-
- mode = stpptr->am_pstate->apm_mode;
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_send_audio() "
- "calling am_send_audio_trad_mixer()", statep);
- am_send_audio_trad_mixer(statep, apm_infop,
- stpptr->am_send_buf, samples);
- ATRACE_32("am_send_audio() "
- "am_send_audio_trad_mixer() returning", 0);
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- ATRACE("am_send_audio() "
- "calling am_send_audio_trad_compat()", statep);
- am_send_audio_trad_compat(statep, apm_infop,
- stpptr->am_send_buf, samples);
- ATRACE_32("am_send_audio() "
- "am_send_audio_trad_compat() returning", 0);
- }
- }
-
-} /* am_send_audio() */
-
-/*
- * am_get_src_data()
- *
- * Description:
- * This routine returns the PLAY or RECORD sample rate conversion
- * data structure that is saved in the channel's private data structure.
- *
- * Arguments:
- * srchdl_t handle SRC handle
- * int dir AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * void * Pointer to the sample rate conversion
- * structure
- */
-void *
-am_get_src_data(srchdl_t handle, int dir)
-{
- audio_ch_t *chptr = AM_SRC_HDL2CHPTR(handle);
- am_ch_private_t *chpptr = chptr->ch_private;
- void *data;
-
- ATRACE("in am_get_src_data()", chptr);
- ATRACE("am_get_src_data() chpptr", chpptr);
- ATRACE_32("am_get_src_data() dir", dir);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_get_src_data() PLAY returning",
- chpptr->acp_play_src_data);
- data = chpptr->acp_play_src_data;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- ATRACE("am_get_src_data() CAPTURE returning",
- chpptr->acp_rec_src_data);
- data = chpptr->acp_rec_src_data;
- }
-
- return (data);
-
-} /* am_get_src_data() */
-
-/*
- * am_set_src_data()
- *
- * Description:
- * This routine sets the PLAY or RECORD sample rate conversion
- * data structure pointer with the pointer passed in.
- *
- * Arguments:
- * srchdl_t handle SRC handle
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * void *data The sample rate conversion data
- *
- * Returns:
- * void
- */
-void
-am_set_src_data(srchdl_t handle, int dir, void *data)
-{
- audio_ch_t *chptr = AM_SRC_HDL2CHPTR(handle);
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_set_src_data()", chptr);
- ATRACE_32("am_set_src_data() dir", dir);
- ATRACE("am_set_src_data() data", data);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_set_src_data() setting PLAY", data);
- chpptr->acp_play_src_data = data;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- ATRACE("am_set_src_data() setting CAPTURE", data);
- chpptr->acp_rec_src_data = data;
- }
-
-} /* am_set_src_data() */
-
-/*
- * Private utilities used by this and other audio mixer files.
- */
-
-/*
- * am_ad_pause_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to pause
- *
- * Returns:
- * void
- */
-void
-am_ad_pause_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_pause_play()", statep);
- ATRACE_32("am_ad_pause_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_pause_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_pause_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_pause_play() calling ad_pause_play()", ad_infop);
- ad_infop->ad_entry->ad_pause_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_pause_play() ad_pause_play() done", ad_infop);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_pause_play() returning", 0);
-
-} /* am_ad_pause_play() */
-
-/*
- * am_ad_set_config()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set config
- * int command The configuration command
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int arg1 Command argument #1
- * int arg2 Command argument #2
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Configuration set
- * AUDIO_FAILURE Configuration not set
- */
-int
-am_ad_set_config(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int command, int dir, int arg1,
- int arg2, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_set_config()", statep);
- ATRACE_32("am_ad_set_config() stream", stream);
- ASSERT(statep);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_config() calling ad_set_config()", ad_infop);
- rc = ad_infop->ad_entry->ad_set_config(AUDIO_STATE2HDL(statep), stream,
- command, dir, arg1, arg2);
- ATRACE_32("am_ad_set_config() ad_set_config() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE_32("am_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* am_ad_set_config() */
-
-/*
- * am_ad_set_format()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Furthermore, if the device was active we call the proper start
- * routine. This kicks things off if the driver had to stop things
- * to change the format, but has a hard time restarting afterwards.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Sample rate to set
- * int channels Number of channels to set
- * int precision Precision to set
- * int encoding Encoding to set
- * int serialize Serialize access to audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Format set
- * AUDIO_FAILURE Format not set
- */
-int
-am_ad_set_format(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir, int sample_rate,
- int channels, int precision, int encoding, int serialize)
-{
- audio_info_t *hw_info = &stpptr->am_hw_info;
- int rc;
-
- ATRACE("in am_ad_set_format()", statep);
- ATRACE_32("am_ad_set_format() stream", stream);
- ASSERT(statep);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_format() calling ad_set_format()", ad_infop);
- rc = ad_infop->ad_entry->ad_set_format(AUDIO_STATE2HDL(statep), stream,
- dir, sample_rate, channels, precision, encoding);
- ATRACE_32("am_ad_set_format() ad_set_format() done", rc);
-
- if (dir == AUDIO_PLAY) {
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs != 0 && hw_info->play.active) {
- mutex_exit(&statep->as_lock);
- ATRACE("am_ad_set_format() restart play", hw_info);
- (void) ad_infop->ad_entry->ad_start_play(
- AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_set_format() restart play done", 0);
- } else {
- mutex_exit(&statep->as_lock);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs != 0 && hw_info->record.active) {
- mutex_exit(&statep->as_lock);
- ATRACE("am_ad_set_format() restart record", hw_info);
- (void) ad_infop->ad_entry->ad_start_record(
- AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_set_format() restart record done", 0);
- } else {
- mutex_exit(&statep->as_lock);
- }
- }
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_format() returning", rc);
-
- return (rc);
-
-} /* am_ad_set_format() */
-
-/*
- * am_ad_setup()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int flags Setup flags
- *
- * Returns:
- * AUDIO_SUCCESS Setup successful
- * AUDIO_FAILURE Setup failed
- */
-int
-am_ad_setup(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int flags)
-{
- int rc;
-
- ATRACE("in am_ad_setup()", statep);
- ATRACE_32("am_ad_setup() stream", stream);
- ASSERT(statep);
-
- /* if there isn't an ad_setup() routine then we just return success */
- if (ad_infop->ad_entry->ad_setup == NULL) {
- ATRACE("am_ad_setup() not defined, returning", statep);
- return (AUDIO_SUCCESS);
- }
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_setup() calling ad_setup()", ad_infop);
- rc = ad_infop->ad_entry->ad_setup(AUDIO_STATE2HDL(statep), stream,
- flags);
- ATRACE_32("am_ad_setup() ad_setup() done", rc);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_setup() returning", rc);
-
- return (rc);
-
-} /* am_ad_setup() */
-
-/*
- * am_ad_start_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to start play
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Start play successful
- * AUDIO_FAILURE Start play not successful
- */
-int
-am_ad_start_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_start_play()", statep);
- ATRACE_32("am_ad_start_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_start_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_ad_start_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_play() calling ad_start_play()", ad_infop);
- rc = ad_infop->ad_entry->ad_start_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_start_play() ad_start_play() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* am_ad_start_play() */
-
-/*
- * am_ad_start_record()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * record channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before record is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to start record
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Start record successful
- * AUDIO_FAILURE Start record not successful
- */
-int
-am_ad_start_record(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_start_record()", statep);
- ATRACE_32("am_ad_start_record() stream", stream);
- ASSERT(statep);
-
- /* make sure we can record */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs == 0) {
- ATRACE_32("am_ad_start_record() no record channels",
- stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_ad_start_record() record channels", stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_record() calling ad_start_record()", ad_infop);
- rc = ad_infop->ad_entry->ad_start_record(AUDIO_STATE2HDL(statep),
- stream);
- ATRACE_32("am_ad_start_record() ad_start_record() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* am_ad_start_record() */
-
-/*
- * am_ad_stop_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to stop playing
- *
- * Returns:
- * void
- */
-void
-am_ad_stop_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_stop_play()", statep);
- ATRACE_32("am_ad_stop_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_stop_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_stop_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_stop_play() calling ad_stop_play()", ad_infop);
- ad_infop->ad_entry->ad_stop_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_stop_play() ad_stop_play() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_stop_play() returning", stream);
-
-} /* am_ad_stop_play() */
-
-/*
- * am_ad_stop_record()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * record channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before record is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to stop recording
- *
- * Returns:
- * void
- */
-void
-am_ad_stop_record(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_stop_record()", statep);
- ATRACE_32("am_ad_stop_record() stream", stream);
- ASSERT(statep);
-
- /* make sure we can record */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs == 0) {
- ATRACE_32("am_ad_stop_record() no record channels",
- stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_stop_record() record channels", stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_stop_record() calling ad_stop_record()", ad_infop);
- ad_infop->ad_entry->ad_stop_record(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_stop_record() ad_stop_record() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_stop_record() returning", stream);
-
-} /* am_ad_stop_record() */
-
-/*
- * am_ad_teardown()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int dir AUDIO_PLAY and/or AUDIO_RECORD
- *
- * Returns:
- * void
- */
-void
-am_ad_teardown(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir)
-{
- ATRACE("in am_ad_teardown()", statep);
- ATRACE_32("am_ad_teardown() stream", stream);
- ASSERT(statep);
-
- /* if there isn't an ad_teardown() routine then just return success */
- if (ad_infop->ad_entry->ad_teardown == NULL) {
- ATRACE("am_ad_teardown() not defined, returning", statep);
- return;
- }
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_teardown() calling ad_teardown()", ad_infop);
- ad_infop->ad_entry->ad_teardown(AUDIO_STATE2HDL(statep), stream, dir);
- ATRACE_32("am_ad_teardown() ad_teardown() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_teardown() returning", stream);
-
-} /* am_ad_teardown() */
-
-/*
- * am_ck_channels()
- *
- * Description:
- * This routine checks to see if the number of channels passed is one of
- * the supported number of channels. If hw is set to B_TRUE then we check
- * against what the hardware can do. If it is set to B_FALSE then we check
- * against what we know how to translate.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * uint_t ch Number of channels to check
- * boolean_t hw If B_TRUE report the true H/W capability
- *
- * Returns:
- * AUDIO_SCCESS Valid number of channels
- * AUDIO_FAILURE Invalid number of channels
- */
-int
-am_ck_channels(am_ad_ch_cap_t *cptr, uint_t ch, boolean_t hw)
-{
- uint_t *iptr = cptr->ad_chs;
- int i;
-
- ATRACE("in am_ck_channels()", cptr);
-
- if (hw) {
- /* check against the hardware */
- for (i = 0; *iptr != 0; i++, iptr++) {
- if (*iptr == ch) {
- ATRACE("am_ck_channels() hw true succeeded",
- iptr);
- return (AUDIO_SUCCESS);
- }
- }
- ATRACE("am_ck_channels() hw true failed", cptr->ad_chs);
- return (AUDIO_FAILURE);
- }
-
- ASSERT(hw == B_FALSE);
-
- /* check against all legal number of channels */
- if (ch == AUDIO_CHANNELS_MONO || ch == AUDIO_CHANNELS_STEREO) {
- ATRACE_32("am_ck_channels() hw false succeeded", ch);
- return (AUDIO_SUCCESS);
- }
-
- ATRACE_32("am_ck_channels() hw false failed", hw);
- return (AUDIO_FAILURE);
-
-} /* am_ck_channels */
-
-/*
- * am_ck_combinations()
- *
- * Description:
- * This routine makes sure that the combination of encoding and
- * precision are legal. If hw is set to B_TRUE then we check against
- * what the hardware can do. If it is set to B_FALSE then we check
- * against what we know how to translate. We can translate between all
- * supported encoding and precision combinations.
- *
- * Arguments:
- * am_ad_cap_comb_t *comb Ptr to the play/rec legal combinations
- * int enc The encoding to check
- * int prec The precision to check
- * boolean_t hw If B_TRUE report the true H/W capability
- *
- * Returns:
- * AUDIO_SUCCESS It is a legal combination or value
- * AUDIO_FAILURE It is not a legal combination or value
- */
-int
-am_ck_combinations(am_ad_cap_comb_t *comb, int enc, int prec, boolean_t hw)
-{
- am_ad_cap_comb_t *ptr;
-
- ATRACE("in am_ck_combinations()", comb);
- ATRACE("am_ck_combinations() enc", enc);
- ATRACE("am_ck_combinations() prec", prec);
-
- if (hw) {
- /* check against the hardware */
- for (ptr = comb; ptr->ad_prec != 0; ptr++) {
- ATRACE_32("am_ck_combinations() enc", ptr->ad_enc);
- ATRACE_32("am_ck_combinations() prec", ptr->ad_prec);
- if (ptr->ad_prec == prec && ptr->ad_enc == enc) {
- ATRACE("am_ck_combinations() "
- "found a legal combination", ptr);
- return (AUDIO_SUCCESS);
- }
- }
- ATRACE("am_ck_combinations() not in combination array", 0);
- return (AUDIO_FAILURE);
- }
-
- ASSERT(hw == B_FALSE);
-
- /* check against all legal combinations */
- switch (prec) {
- case AUDIO_PRECISION_16:
- /* the only thing it can be is PCM */
- switch (enc) {
- case AUDIO_ENCODING_LINEAR:
- return (AUDIO_SUCCESS);
- default:
- return (AUDIO_FAILURE);
- }
- case AUDIO_PRECISION_8:
- /* we have more choices for 8-bit */
- switch (enc) {
- case AUDIO_ENCODING_LINEAR8:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_LINEAR:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_ULAW:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_ALAW:
- return (AUDIO_SUCCESS);
- default:
- return (AUDIO_FAILURE);
- }
- default:
- ATRACE_32("am_ck_combinations() illegal precision", prec);
- return (AUDIO_FAILURE);
- }
-
-} /* am_ck_combinations() */
-
-/*
- * am_ck_sample_rate()
- *
- * Description:
- * The sample rate information list is searched for the sample rate.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * int mode AM_MIXER_MODE or AM_COMPAT_MODE
- * int sr Sample rate to check
- *
- * Returns:
- * AUDIO_SUCCESS Sample rate found
- * AUDIO_FAILURE Invalid sample rate
- */
-int
-am_ck_sample_rate(am_ad_ch_cap_t *cptr, int mode, int sr)
-{
- am_ad_sample_rates_t *srs;
- uint_t *ptr;
-
- ATRACE("in am_ck_sample_rate()", cptr);
- ATRACE_32("am_ck_sample_rate() mode", mode);
- ATRACE_32("am_ck_sample_rate() sample rate", sr);
-
- if (mode == AM_MIXER_MODE) {
- srs = &cptr->ad_mixer_srs;
- } else {
- srs = &cptr->ad_compat_srs;
- }
- ptr = srs->ad_srs;
-
- /* check the passed in sample rate against the list */
- if (srs->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) {
- /*
- * We only check the limits and because we've already done the
- * sanity check in am_attach(). Therefore position 0 must be
- * the bottom limit and position 1 must be the top limit.
- */
- ATRACE_32("am_ck_sample_rate() limits, min sr", ptr[0]);
- ATRACE_32("am_ck_sample_rate() limits, max sr", ptr[1]);
- if (sr < ptr[0] || sr > ptr[1]) {
- ATRACE("am_ck_sample_rate() limit failed", srs);
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("am_ck_sample_rate() found in limit", sr);
- return (AUDIO_SUCCESS);
- }
-
- for (; *ptr != NULL; ptr++) {
- ATRACE_32("am_ck_sample_rate() not limits, test sr", *ptr);
- if (*ptr == sr) {
- ATRACE_32("am_ck_sample_rate() found", sr);
- return (AUDIO_SUCCESS);
- }
- if (*ptr > sr) {
- ATRACE_32("am_ck_sample_rate() past", sr);
- return (AUDIO_FAILURE);
- }
- }
-
- ATRACE("am_ck_sample_rate() failed", cptr->ad_sr_info);
-
- return (AUDIO_FAILURE);
-
-} /* am_ck_sample_rate */
-
-/*
- * am_safe_putnext()
- *
- * Description:
- * The usual reason for holding a lock across putnext() is we don't
- * want a channel to call qprocsoff() while we are building a STREAMS
- * message. This can happen because we have many different threads,
- * including kernel threads, that are running at the same time.
- *
- * If the channel has called qprocsoff() then we just return.
- *
- * CAUTION: This is only for the read queue.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * mblk_t *mp Pointer to the STREAMS message to send
- *
- * Returns:
- * void
- */
-void
-am_safe_putnext(audio_ch_t *chptr, mblk_t *mp)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_safe_putnext()", chptr);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- ASSERT(!MUTEX_HELD(&chptr->ch_statep->as_lock));
-
- /* make sure qprocsoff() hasn't been called */
- if (chpptr->acp_flags & AM_CHNL_QPROCSOFF) {
- /* it has, so cleanup and return */
- freemsg(mp);
-
- ATRACE("am_safe_putnext() msg not sent, qprocsoff()", chptr);
-
- return;
- }
-
- /* increment the number of putnext() calls outstanding */
- chpptr->acp_busy_cnt++;
- ATRACE_32("am_safe_putnext() inc acp_busy_cnt", chpptr->acp_busy_cnt);
-
- /* it's okay to release the lock and do the putnext() */
- mutex_exit(&chptr->ch_lock);
-
- putnext(RD(chptr->ch_qptr), mp);
- ATRACE("am_safe_putnext() putnext() done", chptr);
-
- /* now we can reaquire the lock and check to see if need to signal */
- mutex_enter(&chptr->ch_lock);
-
- chpptr->acp_busy_cnt--;
- ATRACE_32("am_safe_putnext() dec acp_busy_cnt", chpptr->acp_busy_cnt);
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_safe_putnext() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- ASSERT(!MUTEX_HELD(&chptr->ch_statep->as_lock));
-
-} /* am_safe_putnext() */
-
-/*
- * am_test_canputnext()
- *
- * Description:
- * The usual reason for holding a lock across putnext() is we don't
- * want a channel to call qprocsoff() while we are building a STREAMS
- * message. This can happen because we have many different threads,
- * including kernel threads, that are running at the same time.
- *
- * If the channel has called qprocsoff() then we just return.
- *
- * CAUTION: This is only for the read queue.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- *
- * Returns:
- * AUDIO_SUCCESS There is room in the next module's queue
- * AUDIO_FAILURE There is no room in the next module's queue
- * AM_CHNL_CLOSED The channel has been closed
- */
-int
-am_test_canputnext(audio_ch_t *chptr)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- int room;
-
- ATRACE("in am_test_canputnext()", chptr);
-
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
- mutex_enter(&chptr->ch_lock);
-
- /* make sure qprocsoff() hasn't been called */
- if (chpptr->acp_flags & AM_CHNL_QPROCSOFF) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_test_canputnext() channel closed", chptr);
- return (AM_CHNL_CLOSED);
- }
-
- /*
- * Increment the number of putnext() calls outstanding,
- * treat canputnext() like putnext().
- */
- chpptr->acp_busy_cnt++;
- ATRACE_32("am_test_canputnext() inc acp_busy_cnt",
- chpptr->acp_busy_cnt);
-
- mutex_exit(&chptr->ch_lock);
-
- room = canputnext(RD(chptr->ch_qptr));
-
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_busy_cnt--;
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_test_canputnext() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
- mutex_exit(&chptr->ch_lock);
-
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
-
- if (!room) {
- ATRACE("am_test_canputnext() returning failure", chptr);
- return (AUDIO_FAILURE);
- } else {
- ATRACE("am_test_canputnext() returning success", chptr);
- return (AUDIO_SUCCESS);
- }
-
-} /* am_test_canputnext() */
-
-
-/*
- * Private utilities used only by this file.
- */
-
-/*
- * am_attach_check()
- *
- * Description:
- * Verify all of the read/write parameters for the mixer. This includes
- * making sure the format configuration is legal. We also figure out all
- * the channel, encoding, and precision specifications and set flags. This
- * makes things a lot faster later on.
- *
- * NOTE: We don't set the am_hw_* members here so they'll still be set
- * to 0 when we return. Thus the first time am_set_format() is
- * called the hardware will be forced to be programmed.
- *
- * Arguments:
- * am_ad_info_t *ad_infop Ptr to the device's capabilities struct
- * am_apm_private_t *stpptr Pointer to private APM data
- * int dir AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * AUDIO_SUCCESS The checks succeed
- * AUDIO_FAILURE The checks failed, device can't load
- */
-static int
-am_attach_check(audio_state_t *statep, am_ad_info_t *ad_infop,
- am_apm_private_t *stpptr, int dir)
-{
- am_ad_ch_cap_t *cptr = &ad_infop->ad_record;
- am_ad_cap_comb_t *comb;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_prinfo_t *prinfo;
- uint_t flags = 0;
- uint_t mch = 0; /* mixer channels */
- uint_t menc = 0; /* mixer encoding */
- uint_t mprec = 0; /* mixer precision */
- int csr; /* compat sample rate */
- int mode;
-
- ATRACE("in am_attach_check()", ad_infop);
- ASSERT(statep);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_attach_check() dir PLAY", 0);
- cptr = &ad_infop->ad_play;
- comb = ad_infop->ad_play_comb;
- prinfo = &ad_infop->ad_defaults->play;
- } else if (dir == AUDIO_RECORD) {
- ATRACE("am_attach_check() dir RECORD", 0);
- cptr = &ad_infop->ad_record;
- comb = ad_infop->ad_rec_comb;
- prinfo = &ad_infop->ad_defaults->record;
- } else {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() illegal direction: %d", dir);
- return (AUDIO_FAILURE);
- }
-
- mode = stpptr->am_pstate->apm_mode;
-
- /*
- * Check the Audio Driver capabilities for good sample rate info. For
- * MIXER mode we get the default H/W sample rate. For COMPAT mode we
- * verify that the default is okay.
- *
- * Sanity check the record COMPAT mode sample rates.
- */
- if ((csr = am_ck_sample_rate_sanity(cptr, AM_COMPAT_MODE)) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT mode sample rate list");
- return (AUDIO_FAILURE);
- }
-
- /* make sure the default record SR for COMPAT mode is good */
- if (am_ck_sample_rate(cptr, AM_COMPAT_MODE, prinfo->sample_rate) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT sample rate: %d",
- prinfo->sample_rate);
- return (AUDIO_FAILURE);
- }
-
- /* sanity check & find the best record MIXER mode sample rate */
- if (am_ck_sample_rate_sanity(cptr, AM_MIXER_MODE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad MIXER mode sample rate list");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT sample rate", prinfo->sample_rate);
- ATRACE_32("am_attach_check() COMPAT max sample rate", csr);
-
- /*
- * Figure out how many channel combinations we support. And also figure
- * out the best setting for MIXER mode. We try for stereo and then
- * settle for mono.
- */
- if (am_ck_channels(cptr, AUDIO_CHANNELS_STEREO, B_TRUE) ==
- AUDIO_SUCCESS) {
- flags |= AM_PRIV_CH_STEREO;
- mch = AUDIO_CHANNELS_STEREO;
- }
- if (am_ck_channels(cptr, AUDIO_CHANNELS_MONO, B_TRUE) ==
- AUDIO_SUCCESS) {
- flags |= AM_PRIV_CH_MONO;
- if (mch == 0) {
- mch = AUDIO_CHANNELS_MONO;
- }
- }
- ATRACE_32("am_attach_check() MIXER record channels", mch);
-
- /* make sure we have at least one of these set */
- if (!(flags & (AM_PRIV_CH_STEREO|AM_PRIV_CH_MONO))) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad channels list");
- return (AUDIO_FAILURE);
- }
-
- /* make sure the COMPAT mode default channel is legal */
- if (prinfo->channels != AUDIO_CHANNELS_MONO &&
- prinfo->channels != AUDIO_CHANNELS_STEREO) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT record channels list");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT channels", prinfo->channels);
-
- /*
- * Now check all possible encoding and precision combinations and
- * set flags to make translations easier later on. We also figure
- * out the best settings for the mixer. We prefer 16-bit linear PCM,
- * but we'll take whatever we can get.
- */
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR, AUDIO_PRECISION_16,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_16_PCM;
- mprec = AUDIO_PRECISION_16;
- menc = AUDIO_ENCODING_LINEAR;
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_PCM;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_LINEAR;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR8, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_PCM;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_LINEAR8;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_ULAW, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_ULAW;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_ULAW;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_ALAW, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_ALAW;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_ALAW;
- }
- }
- ATRACE_32("am_attach_check() MIXER precision", mprec);
- ATRACE_32("am_attach_check() MIXER encoding", menc);
-
- /* make sure we got the mixer settings, if we didn't then bad list */
- if (mprec == 0) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad combinations list");
- return (AUDIO_FAILURE);
- }
-
- /* now double check a default COMPAT mode configuration */
- if (am_ck_combinations(comb, prinfo->encoding, prinfo->precision,
- B_FALSE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT combinations defaults");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT precision", prinfo->precision);
- ATRACE_32("am_attach_check() COMPAT encoding", prinfo->encoding);
-
- /*
- * Initialize the Codec's state. The sample rate is always set to
- * 0 which forces am_set_format() to program the Codec the first
- * time it is called for play and record.
- */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.sample_rate = 0;
- hw_info->play.channels = mch;
- hw_info->play.precision = mprec;
- hw_info->play.encoding = menc;
- } else {
- hw_info->record.sample_rate = 0;
- hw_info->record.channels = mch;
- hw_info->record.precision = mprec;
- hw_info->record.encoding = menc;
- }
- } else {
- if (dir == AUDIO_PLAY) {
- hw_info->play.sample_rate = 0;
- hw_info->play.channels = prinfo->channels;
- hw_info->play.precision = prinfo->precision;
- hw_info->play.encoding = prinfo->encoding;
- } else {
- hw_info->record.sample_rate = 0;
- hw_info->record.channels = prinfo->channels;
- hw_info->record.precision = prinfo->precision;
- hw_info->record.encoding = prinfo->encoding;
- }
- }
-
- /* initialize the saved state for when we go from COMPAT->MIXER mode */
- if (dir == AUDIO_PLAY) {
- /* once these get set they are set the same for life */
- stpptr->am_pflags |= flags;
- stpptr->am_save_psr = csr;
- stpptr->am_hw_pchs = mch;
- stpptr->am_hw_pprec = mprec;
- stpptr->am_hw_penc = menc;
- } else {
- /* once these get set they are set the same for life */
- stpptr->am_rflags |= flags;
- stpptr->am_save_rsr = csr;
- stpptr->am_hw_rchs = mch;
- stpptr->am_hw_rprec = mprec;
- stpptr->am_hw_renc = menc;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_attach_check() */
-
-/*
- * am_ck_sample_rate_sanity()
- *
- * Description:
- * Sanity check the sample rate list to make sure it is good. That
- * means it is ordered from smallest to largest. The largest sample
- * rate is returned if the list is okay.
- * AUDIO_FAILURE is returned.
- *
- * NOTE: The sample rate conversion information is specific to the routines
- * that perform the conversions. Therefore the audio mixer doesn't
- * check them for sanity. It could be done by creating another
- * call in am_ad_src_entry_t, but thorough testing is all that
- * is really needed.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * int mode AM_MIXER_MODE or AM_COMPAT_MODE
- *
- * Returns:
- * AUDIO_SUCCESS Sample rate list okay
- * AUDIO_FAILURE Bad sample rate list
- */
-static int
-am_ck_sample_rate_sanity(am_ad_ch_cap_t *cptr, int mode)
-{
- am_ad_sample_rates_t *srs;
- uint_t *ptr;
- uint_t big = 0;
- int i;
-
- ATRACE("in am_ck_sample_rate_sanity()", cptr);
- ATRACE_32("am_ck_sample_rate_sanity() mode", mode);
-
- if (mode == AM_MIXER_MODE) {
- srs = &cptr->ad_mixer_srs;
- } else {
- srs = &cptr->ad_compat_srs;
- }
- ptr = srs->ad_srs;
-
-
- /* do a sanity check on the list, it must be in increasing order */
- for (i = 0; *ptr != NULL; ptr++, i++) {
- if (*ptr > big) {
- big = *ptr;
- } else {
- ATRACE_32("am_ck_sample_rate_sanity() bad order, big",
- big);
- ATRACE_32("am_ck_sample_rate_sanity() *ptr", *ptr);
- return (AUDIO_FAILURE);
- }
- }
-
- /* if limits then there should be only two samples */
- if ((srs->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) && i != 2) {
- ATRACE_32("am_ck_sample_rate_sanity() "
- "too many samples for limits", i);
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("am_ck_sample_rate_sanity() found highest sample rate", big);
-
- return (big);
-
-} /* am_ck_sample_rate_sanity() */
-
-/*
- * am_convert_to_format()
- *
- * Description:
- * This routine takes the source buffer, which is 32-bit integers,
- * and converts it to whatever format the destination buffer is.
- * While the source buffer is a 32-bit buffer, the data is really
- * 16-bits. We use 32-bits to make sure we can sum audio streams
- * without loosing bits. When this routine is called we clip and
- * then convert the data. This includes doing any required translations.
- *
- * Other routines deal with the channel <--> channel conversion.
- * In addition the audio is already sample rate converted, if it is
- * needed. If the result needs to be unsigned PCM then we do that
- * conversion.
- *
- * The supported conversions are:
- * 32-bit signed linear -> 16-bit clipped signed linear
- * 32-bit signed linear -> 8-bit u-law
- * 32-bit signed linear -> 8-bit A-law
- * 32-bit signed linear -> 8-bit signed linear
- *
- * We also support translating to unsigned PCM for 8-bit and 16-bit linear.
- *
- * Arguments:
- * int *src Ptr to the src buffer, data to convert
- * void *dest Ptr to the dest buffer, for converted
- * data
- * int samples The number of samples to convert
- * int precision The precision of the output buffer
- * int encoding The encoding of the output buffer
- * int flags Flags, including AM_PRIV_8/16_TRANS
- *
- * Returns:
- * none
- */
-static void
-am_convert_to_format(int *src, void *dest, int samples, int precision,
- int encoding, int flags)
-{
- int val;
-
- ATRACE_32("in am_convert_to_format()", samples);
- ATRACE_32("am_convert_to_format() precision", precision);
- ATRACE_32("am_convert_to_format() encoding", encoding);
-
- /* this should have been stopped earlier */
- ASSERT(precision != AUDIO_PRECISION_16 ||
- encoding == AUDIO_ENCODING_LINEAR);
-
- /* make sure we have work to do */
- if (samples == 0) {
- ATRACE("am_convert_to_format() "
- "no samples to convert, returning", 0);
- return;
- }
-
- ATRACE_32("am_convert_to_format() NON-Linearize Audio", samples);
-
- if (precision == AUDIO_PRECISION_16) {
- int16_t *dptr = (int16_t *)dest;
-
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- if (flags & AM_PRIV_16_TRANS) {
- /* convert for unsigned int hardware */
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- val += -INT16_MIN;
- *dptr++ = (int16_t)val;
- }
- } else {
- /* hardware is signed */
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- *dptr++ = INT16_MAX;
- } else if (val < INT16_MIN) {
- *dptr++ = INT16_MIN;
- } else {
- *dptr++ = (int16_t)val;
- }
- }
- }
- ATRACE("am_convert_to_format() 16-bit linear done", 0);
- } else { /* end 16-bit, begin 8-bit */
- uint8_t *dptr = (uint8_t *)dest;
-
- ASSERT(precision == AUDIO_PRECISION_8);
-
- if (encoding == AUDIO_ENCODING_LINEAR8 ||
- (flags & AM_PRIV_8_TRANS)) {
- ATRACE_32(
- "am_convert_to_format() 8-bit unsigned linear",
- samples);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)((val >> AM_256_SHIFT) -
- INT8_MAX);
- }
- } else if (encoding == AUDIO_ENCODING_LINEAR) {
- ATRACE_32("am_convert_to_format() 8-bit signed linear",
- samples);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)(val >> AM_256_SHIFT);
- }
- } else { /* 8-bit U/A-Law */
- uint8_t *cptr;
- int shift;
-
- if (encoding == AUDIO_ENCODING_ULAW) {
- ATRACE("am_convert_to_format() 8-bit U-Law", 0);
- cptr = &_14linear2ulaw8[G711_ULAW_MIDPOINT];
- shift = 2;
- } else {
- ATRACE("am_convert_to_format() 8-bit A-Law", 0);
- ASSERT(encoding == AUDIO_ENCODING_ALAW);
- cptr = &_13linear2alaw8[G711_ALAW_MIDPOINT];
- shift = 3;
- }
-
- ATRACE_32("am_convert_to_format() 8-bit U/A-Law",
- encoding);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)cptr[val >> shift];
- }
- }
- ATRACE("am_convert_to_format() 8-bit done", 0);
- }
-
- ATRACE_32("am_convert_to_format() done", encoding);
-
-} /* am_convert_to_format() */
-
-/*
- * am_get_audio_multi()
- *
- * Description:
- * This routine is used by multi-channel Codecs to get a single stream
- * of audio data for an individual channel.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * void *buf The buffer to place the audio into
- * int channel The device channel number.
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_multi(audio_state_t *statep, void *buf, int channel, int samples)
-{
- audio_ch_t *chptr = &statep->as_channels[channel];
- am_ch_private_t *chpptr;
- audio_info_t *info;
- int hw_channels;
- int ret_val;
-
- ATRACE("in am_get_audio_multi()", statep);
-
- ASSERT(statep);
- ASSERT(chptr->ch_info.ch_number == channel);
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /*
- * The channel may have been closed while we waited on the mutex.
- * So once we get it we make sure the channel is still valid. We also
- * make sure it's an AUDIO channel.
- */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
-
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.pid == 0 || chptr->ch_info.dev_type != AUDIO ||
- chpptr == NULL || ((chpptr->acp_flags & AM_CHNL_OPEN) == 0) ||
- (chpptr->acp_flags & AM_CHNL_QPROCSOFF) || info == NULL) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_multi() channel closed", chptr);
- return (AUDIO_FAILURE);
- }
-
- /* skip if the channel is paused */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_multi() channel paused", statep);
- return (0);
- }
-
- /* make sure the number of samples is module the # of channels */
- hw_channels = info->play.channels;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_get_audio_multi() bad sample size", samples);
- samples -= samples % hw_channels;
- }
-
- /* get "samples" worth of data */
- ATRACE("am_get_audio_multi() calling am_get_samples()", chptr);
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples, buf, AM_COMPAT_MODE);
- chpptr->acp_busy_cnt--;
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- ATRACE_32("am_get_audio_multi() am_get_samples() failed",
- ret_val);
- goto done;
- }
-
- ATRACE_32("am_get_audio_multi() am_get_samples() succeeded", ret_val);
-
- /* XXX we need to convert to the hardware format */
-
-done:
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_multi() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_multi() done", buf);
-
- return (ret_val);
-
-} /* am_get_audio_multi() */
-
-/*
- * am_get_audio_trad_compat()
- *
- * Description:
- * This routine is used by traditional Codecs in COMPAT mode. The
- * audio samples are placed directly into the buffer provided by the
- * Audio Driver. Once one playing channel is found the search ends,
- * no reason to waste more time.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instances' state
- * audio_apm_info_t *apm_infop Personality module data struct
- * void *buf The buf to place the audio into
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop,
- void *buf, int samples)
-{
- audio_ch_t *chptr;
- audio_info_t *info;
- am_ch_private_t *chpptr;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- int i;
- int max_chs;
- int ret_val;
- size_t size = samples << AM_INT32_SHIFT;
-
- ATRACE("in am_get_audio_trad_compat()", statep);
-
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- /* go through the chs looking for the only playing AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is writing */
- if (!chpptr->acp_writing) {
- ATRACE("am_get_audio_trad_compat() not playing",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- return (0);
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE_32("am_get_audio_trad_compat() found channel", i);
- break;
- }
- if (i >= max_chs) {
- ATRACE("am_get_audio_trad_compat() done, no play channel", buf);
- return (0);
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /*
- * We had to free the lock above to make warlock happy. Unfortunately
- * it's possible that the channel closed between releasing and
- * reacquiring the lock. So we have to check again.
- */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO || chptr->ch_info.pid == 0 ||
- chpptr == NULL || (chpptr->acp_flags & AM_CHNL_QPROCSOFF)) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() ch closed on us", chptr);
- return (0);
- }
-
- /* make sure the buffer is big enough */
- if (chpptr->acp_psb_size < size) {
- ATRACE_32("am_get_audio_trad_compat() freeing buffer",
- chpptr->acp_psb_size);
- if (chpptr->acp_play_samp_buf) {
- /* free the old buffer */
- kmem_free(chpptr->acp_play_samp_buf,
- chpptr->acp_psb_size);
- }
- chpptr->acp_play_samp_buf = kmem_alloc(size, KM_NOSLEEP);
- if (chpptr->acp_play_samp_buf == NULL) {
- ATRACE_32("am_get_audio_trad_compat() "
- "kmem_alloc() play_samp_buf failed", i);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_get_audio_trad_compat() "
- "sample buffer %d not allocated", i);
- chpptr->acp_psb_size = 0;
- mutex_exit(&chptr->ch_lock);
- return (0);
- }
- chpptr->acp_psb_size = size;
- }
-
- ATRACE_32("am_get_audio_trad_compat() calling am_get_samples()",
- samples);
-
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples, chpptr->acp_play_samp_buf,
- AM_COMPAT_MODE);
- chpptr->acp_busy_cnt--;
-
- ATRACE_32("am_get_audio_trad_compat() am_get_samples() succeeded",
- ret_val);
-
- /* now we can see how well the am_get_samples() call did */
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- ATRACE_32("am_get_audio_trad_compat() am_get_samples() failed",
- ret_val);
- goto done;
- }
-
- /* now convert to the format the audio device uses */
- am_convert_to_format(chpptr->acp_play_samp_buf, buf, ret_val,
- stpptr->am_hw_pprec, stpptr->am_hw_penc, stpptr->am_pflags);
-
-done:
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_trad_compat() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_trad_compat() done", buf);
-
- return (ret_val);
-
-} /* am_get_audio_trad_compat() */
-
-/*
- * am_get_audio_trad_mixer()
- *
- * Description:
- * This routine is used by traditional Codecs in MIXER mode to get
- * multiple streams of audio data and mixing them down into one stream
- * for the Codec. play_samp_buf is used to get audio samples. These
- * samples are then mixed into the mix buffer. When all playing audio
- * channels are mixed we convert to the proper output format, along with
- * applying gain and balance, if needed.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instances' state
- * audio_apm_info_t *apm_infop Personality module data struct
- * void *buf The buf to place the audio into
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_trad_mixer(audio_state_t *statep, audio_apm_info_t *apm_infop,
- void *buf, int samples)
-{
- audio_ch_t *chptr;
- audio_info_t *info;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info;
- am_ch_private_t *chpptr;
- int *mix_dest;
- int *mix_src;
- size_t size = samples << AM_INT32_SHIFT;
- uint_t hw_channels = stpptr->am_hw_pchs;
- int balance;
- int i;
- int l_gain;
- int r_gain;
- int max_chs;
- int max_ret_val = 0;
- int ret_val;
-
- ATRACE("in am_get_audio_trad_mixer()", statep);
- ATRACE_32("am_get_audio_trad_mixer() samples", samples);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- hw_info = apm_infop->apm_ad_state;
-
- /* make sure the mix buffer is large enough */
- if (stpptr->am_mix_size < size) {
- /* mix buffer too small, adjust sample request */
- ATRACE_32("am_get_audio_trad_mixer() mix buffer too small",
- stpptr->am_mix_size);
- ATRACE_32("am_get_audio_trad_mixer() adjust num samples from",
- samples);
- samples = stpptr->am_mix_size >> AM_INT32_SHIFT;
- ATRACE_32("am_get_audio_trad_mixer() num samples now set to",
- samples);
- }
-
- /* zero the mix buffer, no reason to zero the whole buffer */
- bzero(stpptr->am_mix_buf, size);
-
- /* go through the chs looking for each AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- (chptr->ch_info.dev_type != AUDIO) ||
- (chptr->ch_info.pid == 0)) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
-
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_QPROCSOFF) ||
- (!chpptr->acp_writing)) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_mixer() not valid", chpptr);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- ATRACE_32("am_get_audio_trad_mixer() found channel", i);
-
- info = chptr->ch_info.info;
-
- /* make sure the buffer is big enough */
- if (chpptr->acp_psb_size < size) {
-
- ATRACE_32("am_get_audio_trad_mixer() freeing buffer",
- chpptr->acp_psb_size);
- if (chpptr->acp_play_samp_buf) {
- /* free the old buffer */
- kmem_free(chpptr->acp_play_samp_buf,
- chpptr->acp_psb_size);
- }
- chpptr->acp_play_samp_buf =
- kmem_alloc(size, KM_NOSLEEP);
- if (chpptr->acp_play_samp_buf == NULL) {
- ATRACE_32("am_get_audio_trad_mixer() "
- "kmem_alloc() play_samp_buf failed", i);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_get_audio_trad_mixer() "
- "sample buffer %d not allocated", i);
- chpptr->acp_psb_size = 0;
- mutex_exit(&chptr->ch_lock);
- continue;
- }
- chpptr->acp_psb_size = size;
- }
-
- /* get "samples" worth of audio */
- ATRACE_32("am_get_audio_trad_mixer() calling am_get_samples()",
- samples);
-
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples,
- chpptr->acp_play_samp_buf, AM_MIXER_MODE);
- chpptr->acp_busy_cnt--;
-
- ATRACE_32("am_get_audio_trad_mixer() "
- "am_get_samples() succeeded", ret_val);
-
- /* now we can see how well the am_get_samples() call did */
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
- ATRACE_32("am_get_audio_trad_mixer() "
- "am_get_samples() failed", ret_val);
- continue;
- }
-
-
- /* we return the maximum # of samples found & processed */
- if (ret_val > max_ret_val) {
- /* update to a new value */
- max_ret_val = ret_val;
- ATRACE_32("am_get_audio_trad_mixer() "
- "updated max_ret_val", max_ret_val);
- }
-
- /* mix this channel into the mix buffer */
- mix_src = chpptr->acp_play_samp_buf;
- mix_dest = stpptr->am_mix_buf;
- ATRACE("am_get_audio_trad_mixer() mix_src before", mix_src);
- ATRACE("am_get_audio_trad_mixer() mix_dest before", mix_dest);
- /* apply gain and balance while summing */
- if (hw_channels == AUDIO_CHANNELS_MONO) {
- l_gain = info->play.gain;
-
- for (; ret_val; ret_val--) {
- *mix_dest++ +=
- (*mix_src++ * l_gain) >> AM_MAX_GAIN_SHIFT;
- }
- } else {
- ASSERT(hw_channels == AUDIO_CHANNELS_STEREO);
-
- l_gain = r_gain = info->play.gain;
- balance = info->play.balance;
-
- if (balance < AUDIO_MID_BALANCE) {
- /* leave l gain alone and scale down r gain */
- r_gain = (r_gain * balance) >> 5;
- } else if (balance > AUDIO_MID_BALANCE) {
- /* leave r gain alone and scale down l gain */
- l_gain = (l_gain * (64 - balance)) >> 5;
- }
-
- for (; ret_val; ret_val -= 2) {
- *mix_dest++ +=
- (*mix_src++ * l_gain) >> AM_MAX_GAIN_SHIFT;
- *mix_dest++ +=
- (*mix_src++ * r_gain) >> AM_MAX_GAIN_SHIFT;
- }
- }
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_trad_mixer() sending cv_signal()",
- chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_trad_mixer() mix_src after", mix_src);
- ATRACE("am_get_audio_trad_mixer() mix_dest after", mix_dest);
-
- ATRACE_32("am_get_audio_trad_mixer() ret_val", ret_val);
- ATRACE_32("am_get_audio_trad_mixer() max_ret_val", max_ret_val);
-
- ATRACE("am_get_audio_trad_mixer() going again", chptr);
- }
-
- /* now convert into the format the hardware needs */
- ATRACE("am_get_audio_trad_mixer() calling am_convert_to_format()",
- stpptr->am_mix_buf);
- am_convert_to_format(stpptr->am_mix_buf, buf, max_ret_val,
- stpptr->am_hw_pprec, stpptr->am_hw_penc, stpptr->am_pflags);
-
- /* update hardware sample count */
- hw_info->play.samples += max_ret_val / stpptr->am_hw_pchs;
-
- ATRACE("am_get_audio_trad_mixer() done", buf);
-
- return (max_ret_val);
-
-} /* am_get_audio_trad_mixer() */
-
-/*
- * am_get_samples()
- *
- * Description:
- * This routine takes the first message off the channel's queue. It
- * then takes audio data until the requested number of samples has
- * been reached or there are no more samples. If the message isn't
- * empty it is put back onto the message queue.
- *
- * If the channel is muted then the requested number of samples is
- * updated in the buffer, the pointer for the message is advanced and
- * the buffer is zeroed, filling it with silence.
- *
- * If the "mode" argument is set to AM_COMPAT_MODE then the data size
- * is set by the channel's info structure. Otherwise it is set to the
- * size of an integer. Because multi-stream devices get raw data,
- * am_get_audio_multi() calls this with AM_COMPAT_MODE set.
- *
- * Keeping track of samples is complicated. When a complete message has
- * been played info->play.samples is incremented by the number of sample
- * frames in the original message. That way we don't build up errors by
- * approximating the sample rate converted sample frames. As each chunk
- * of samples is retrieved to be played we add this amount to
- * acp_psamples_c, the running count. Then the next time that this routine
- * is called the amount in acp_psamples_c is added to acp_psamples_p,
- * the partial count. This causes the delay between when the samples
- * are placed into the buffer and when it is actually played.
- * acp_psamples_p is used by am_fix_info() to adjust info->play.samples
- * in between full messages, including for sample rate conversion.
- *
- * No conversions are done in this routine.
- *
- * CAUTION: The channel must be locked before this routine is called.
- *
- * NOTE: The variable "samples" is the number of samples returned
- * ultimately to the hardware.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel's state structure
- * int samples The number of samples to get
- * void *buf The buffer to put the samples into
- * int mode Mixer mode
- *
- * Returns:
- * 0 -> samples The number of samples retrieved
- * AUDIO_FAILURE There was an error getting samples
- */
-static int
-am_get_samples(audio_ch_t *chptr, int samples, void *buf, int mode)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_data_t *data;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_info_t *info = chptr->ch_info.info;
-#ifdef FLOW_CONTROL
- queue_t *q;
-#endif
- size_t orig_size;
- int *bptr = buf;
- int *eptr;
- int *pstart;
- int *sptr;
- boolean_t active_signal = B_FALSE;
- boolean_t empty = B_FALSE;
- boolean_t mute;
- boolean_t EOF_processed = B_FALSE;
- uint_t ret_samples = 0;
- int bytes_needed;
- int count;
- int EOF_count;
- int hw_channels = stpptr->am_hw_pchs;
-
- ATRACE("in am_get_samples()", chptr);
- ATRACE_32("am_get_samples() samples", samples);
- ATRACE("am_get_samples() buffer", buf);
-
- ASSERT(statep);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* do this now where it's easier */
- mute = info->output_muted;
- if (mute) {
- /* we return zeros */
- bytes_needed = samples << AM_INT32_SHIFT;
- ATRACE("am_get_samples() bzero", buf);
- bzero(buf, bytes_needed);
- }
-
- /* update played samples */
- if (chpptr->acp_psamples_f) {
- chpptr->acp_psamples_p = 0;
- }
-
- info->play.samples += chpptr->acp_psamples_f;
- chpptr->acp_psamples_p += chpptr->acp_psamples_c;
-
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_c = 0;
-
- /* go through as many buffers as we need to get the samples */
- for (; samples > 0; ) {
- if (!(chpptr->acp_flags & AM_CHNL_OPEN)) {
- ATRACE_32("am_get_samples() not open",
- chpptr->acp_flags);
- return (0);
- }
-
- /* get the data off the list */
- data = audio_sup_get_audio_data(chptr);
-
-#ifdef FLOW_CONTROL
- /*
- * See if we should re-enable the queue. We do this now
- * because we always need to do it and the code branches below.
- */
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- if ((chpptr->acp_flags & AM_CHNL_PFLOW) &&
- (audio_sup_get_audio_data_size(chptr) <
- (AM_MIN_QUEUED_MSGS_SIZE) &&
- audio_sup_get_audio_data_cnt(chptr) <
- AM_MIN_QUEUED_MSGS_CNT)) {
- /* yes, re-enable the q */
- chpptr->acp_flags &= ~AM_CHNL_PFLOW;
-
- q = WR(chptr->ch_qptr);
-
- ATRACE("am_get_samples() flow control disabled, q on",
- q);
-
- enableok(q);
- qenable(q);
- }
-#endif
-
- /* now we see if we got any data */
- if (data == NULL) {
- ATRACE("am_get_samples() no data", chptr);
- /* we underflowed, so up error count and send signal */
-
- mutex_enter(&chptr->ch_apm_infop->apm_lock);
-
- if (!(chpptr->acp_flags &
- (AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1)) &&
- !(stpptr->am_flags & AM_PRIV_SW_MODES)) {
- /* but only send it one time */
- info->play.error = 1;
- empty = B_TRUE;
- }
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- /* did we get any audio at all? */
- ATRACE_32("am_get_samples() ret_samples", ret_samples);
- if (ret_samples == 0) {
- ATRACE("am_get_samples() no data returning", chptr);
-
- /*
- * Marking the channel as empty is a two step
- * process because data is queued up and still
- * being played the first time we determine we
- * are empty. So the first time we set
- * ALMOST_EMPTY. The second time we set EMPTY.
- */
- if (!(chpptr->acp_flags & (AM_CHNL_ALMOST_EMPTY1|
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_EMPTY))) {
-
- chpptr->acp_flags |= AM_CHNL_ALMOST_EMPTY1;
- ATRACE("am_get_samples() no data empty1",
- chpptr->acp_flags);
- } else if
- ((chpptr->acp_flags & AM_CHNL_ALMOST_EMPTY1)) {
-
- chpptr->acp_flags &= ~AM_CHNL_ALMOST_EMPTY1;
- chpptr->acp_flags |= AM_CHNL_ALMOST_EMPTY2;
- ATRACE("am_get_samples() no data empty2",
- chpptr->acp_flags);
- } else {
- ASSERT(chpptr->acp_flags &
- (AM_CHNL_ALMOST_EMPTY2|AM_CHNL_EMPTY));
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|\
- AM_CHNL_DRAIN_NEXT_INT|AM_CHNL_DRAIN);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- ATRACE("am_get_samples() no data empty",
- chpptr->acp_flags);
- if (info->play.active) {
- active_signal = B_TRUE;
- info->play.active = 0;
- }
- }
- goto done_getting_samples;
- }
- ATRACE_32("am_get_samples() no data but samps",
- ret_samples);
- goto done_getting_samples;
- }
-
- mutex_enter(&chptr->ch_apm_infop->apm_lock);
- /*
- * See if we need to change modes. The following code makes
- * sure that this switch happens on a message boundary.
- *
- * It should be noted that it is possible to pause the
- * channel and then switch modes. Because pause may last
- * a long time we don't block the mode switch. When paused
- * it is very likely that we will not be on a message
- * boundary. If setting to mixer mode it is the responsibility
- * of the mode switch code to perform the sample rate
- * conversion of canonical audio and then set the pointers
- * to the approximate location for restarting, if setting
- * to mixer mode. It is also likely that there are additional
- * unprocessed messages. Code below will process each of
- * these as they come up.
- */
- if (stpptr->am_flags & AM_PRIV_SW_MODES &&
- ((mode == AM_MIXER_MODE && data->adata_proc &&
- data->adata_pptr == data->adata_proc) ||
- (mode == AM_COMPAT_MODE && data->adata_orig &&
- data->adata_optr == data->adata_orig))) {
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- audio_sup_putback_audio_data(chptr, data);
-
- ATRACE("am_get_samples() AM_PRIV_SW_MODES return", 0);
-
- goto done_getting_samples;
- }
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- /* check for EOF message, i.e., zero length buffer */
- if (data->adata_osize == 0) {
- ATRACE_32("am_get_samples() EOF",
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]);
-
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]++;
-
- EOF_processed = B_TRUE;
-
- ATRACE_32("am_get_samples() EOF, new count",
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]);
-
- audio_sup_free_audio_data(data);
- continue;
- }
-
- ATRACE("am_get_samples() got data", data);
-
- /*
- * We may have changed modes or a previous attempt to process
- * the audio data failed. This gives us a second chance before
- * we have to throw the audio away.
- */
- if (mode == AM_MIXER_MODE && data->adata_proc == NULL &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- ATRACE("am_get_samples(M) calling am_reprocess()",
- data);
-
- /* if set to 0 then we've got a problem */
- if (data->adata_osize == 0) {
- ATRACE_32("am_get_samples(M) bad osize",
- data->adata_osize);
- audio_sup_free_audio_data(data);
- continue;
- }
-
- /* process the original data into src data */
- if (am_reprocess(chptr, data) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "get_samples() "
- "couldn't process message, data lost");
- audio_sup_free_audio_data(data);
- continue;
- }
- ATRACE("am_get_samples() process successful", data);
- }
-
- /*
- * Get the size of the original data, in sample frames.
- * First convert from bytes to samples, then adjust for
- * the number of channels.
- */
- orig_size = (data->adata_osize >> AM_INT32_SHIFT) / hw_channels;
-
- /* get the right buffer */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- pstart = data->adata_pptr;
- eptr = data->adata_peptr;
- } else {
- ASSERT(mode == AM_COMPAT_MODE ||
- ad_infop->ad_codec_type == AM_MS_CODEC);
- pstart = data->adata_optr;
- eptr = data->adata_oeptr;
- }
-
- ATRACE("am_get_samples() beginning eptr", eptr);
- ATRACE_32("am_get_samples() samples needed", samples);
-
- /* get the data from the message and put into the buf */
-
- sptr = pstart;
- ASSERT(sptr >= pstart);
- ATRACE("am_get_samples() beginning sptr", sptr);
-
- if (mute == B_TRUE) {
- /* we already zeroed the buffer above */
- if ((eptr - sptr) < samples) {
- count = eptr - sptr;
- samples -= count;
- sptr = eptr;
- ASSERT(samples > 0);
- } else {
- count = samples;
- samples = 0;
- sptr += count;
- ASSERT(sptr <= eptr);
- }
- } else {
- /* copy into the buffer */
- for (count = 0; sptr < eptr && samples > 0;
- samples--, count++) {
- *bptr++ = *sptr++;
- }
- }
-
- ATRACE("am_get_samples() ending sptr", sptr);
- ATRACE_32("am_get_samples() ending samples needed", samples);
- ATRACE_32("am_get_samples() ending count", count);
-
- ASSERT(sptr <= eptr);
- ret_samples += count;
-
- ATRACE_32("am_get_samples() ret_samples #2", ret_samples);
-
- /* see if we need to go again */
- if (samples == 0) { /* nope */
- /* see if we're done with this message */
- if (sptr >= eptr) {
- ASSERT(sptr == eptr);
- /* update sample counts */
- chpptr->acp_psamples_f += orig_size;
- chpptr->acp_psamples_c = 0;
-
- /* end of data, so free */
- audio_sup_free_audio_data(data);
- data = NULL;
- } else { /* nope, use again next time */
- pstart = sptr;
- chpptr->acp_psamples_c += count / hw_channels;
- }
- break;
- } else {
- chpptr->acp_psamples_f += orig_size;
- chpptr->acp_psamples_c = 0;
- }
- /* we need to go again, but free data first */
- audio_sup_free_audio_data(data);
- buf = bptr; /* save for next go around */
-
- } /* get buffers for() loop */
-
- /* update pointers, if partial buffer used */
- if (data) {
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* update the processed data pointer */
- data->adata_pptr = pstart;
- } else {
- /* update the original data pointer */
- data->adata_optr = pstart;
- }
- audio_sup_putback_audio_data(chptr, data);
- }
-
-done_getting_samples:
-
- /* see if we need to send any EOF signals */
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- EOF_count = 0;
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
-
- /*
- * If all we have are EOFs then we need to flush the EOF count.
- * This is done in am_wsvc() as well. This way the EOF count is
- * incremented as soon as it can be detected.
- */
- if (audio_sup_get_audio_data_cnt(chptr) == 0 && !hw_info->play.active) {
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
-
- /* if all we had was EOFs then we really are empty */
- if (EOF_processed && ret_samples == 0) {
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
- }
- mutex_exit(&chptr->ch_lock);
-
- /* Underflowed */
- if (empty == B_TRUE) {
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- /* EOF markers */
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- ATRACE("am_get_samples() done_getting_samples", chptr);
-
- /* now we are done, so return how many samples we have */
-
- ATRACE_32("am_get_samples() normal return", ret_samples);
-
- /* make sure virtual channels are still active */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (ret_samples) {
- if (info->play.active == 0) {
- active_signal = B_TRUE;
- info->play.active = 1;
- }
- hw_info->play.active = 1;
- }
- if (empty == B_TRUE) {
- if (info->play.active == 1) {
- active_signal = B_TRUE;
- info->play.active = 0;
- }
- /* we don't turn off the h/w active flag here */
- }
- }
- /* send the signals for active change */
- if (active_signal == B_TRUE) {
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- mutex_enter(&chptr->ch_lock);
-
- return (ret_samples);
-
-} /* am_get_samples() */
-
-/*
- * am_play_shutdown_multi()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * NOTE: We use the EOF_count to also determine if we have an active
- * flag change and thus need a signal sent.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int channel For multi-stream Codecs this is the
- * stream to shutdown.
- *
- * Returns:
- * void
- */
-static void
-am_play_shutdown_multi(audiohdl_t handle, int channel)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_ch_t *chptr;
- am_apm_private_t *stpptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- int EOF_count = 0;
-
- ATRACE("in am_play_shutdown_multi()", handle);
- ASSERT(statep);
-
- chptr = &statep->as_channels[channel];
- stpptr = chptr->ch_apm_infop->apm_private;
-
- mutex_enter(&chptr->ch_lock);
- /*
- * The channel may have been closed while we waited on the mutex.
- * So once we get it we make sure the channel is still valid.
- */
- chpptr = chptr->ch_private;
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.pid == 0 ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- ATRACE("am_play_shutdown_multi() channel closed", chptr);
- mutex_exit(&chptr->ch_lock);
- return;
- } else if (chpptr->acp_flags &
- (AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|AM_CHNL_EMPTY|\
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2|AM_CHNL_CLOSING)) {
- /* clear a bunch of flags */
- chpptr->acp_flags &= ~(AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2);
-
- /* are we empty? */
- if (audio_sup_get_audio_data_cnt(chptr) == 0) {
- /* yes, so mark as empty */
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
-
- /* turn off the channel, but only if not paused */
- info = chptr->ch_info.info;
- if (!info->play.pause && info->play.active) {
- EOF_count++;
- info->play.active = 0;
- }
-
- am_audio_drained(chptr);
-
- /* make sure we send all pending signals */
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
-
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
- am_send_signal(statep, stpptr);
- }
- } else {
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
- }
-
- ATRACE("am_play_shutdown_multi() returning", statep);
-
- return;
-
-} /* am_play_shutdown_multi() */
-
-/*
- * am_play_shutdown_trad()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * audio_apm_info_t *apm_infop Pointer to APM info
- *
- * Returns:
- * void
- */
-static void
-am_play_shutdown_trad(audiohdl_t handle, audio_apm_info_t *apm_infop)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info;
- am_apm_private_t *stpptr;
- int EOF_count;
- int i;
- int max_chs;
-
- ATRACE("in am_play_shutdown_trad()", handle);
- ASSERT(statep);
-
- max_chs = statep->as_max_chs;
- stpptr = apm_infop->apm_private;
- hw_info = apm_infop->apm_ad_state;
-
- mutex_enter(&apm_infop->apm_lock);
- if (stpptr->am_flags & AM_PRIV_SW_MODES) {
- mutex_exit(&apm_infop->apm_lock);
-
- ATRACE("am_play_shutdown_trad() change mode shutdown", stpptr);
-
- /* don't worry about signal, the mode switch will send one */
- hw_info->play.active = 0;
-
- /* let the mode change proceed */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
-
- return;
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /* go through all the channels */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&chptr->ch_lock);
-
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- chpptr = chptr->ch_private;
-
- ATRACE_32("am_play_shutdown_trad() checking flags",
- chpptr->acp_flags);
-
- info = chptr->ch_info.info;
- if (chpptr->acp_flags &
- (AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|\
- AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_CLOSING)) {
- /* clear a bunch of flags */
- chpptr->acp_flags &=
- ~(AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|\
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2);
-
- /* are we empty? */
- if (audio_sup_get_audio_data_cnt(chptr) == 0) {
- /* yes, so mark as empty */
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
-
- /* turn off the ch, but only if not paused */
- if (!info->play.pause) {
- info->play.active = 0;
- }
-
- ATRACE("am_play_shutdown_trad() regular drain", chptr);
-
- am_audio_drained(chptr);
- } else {
- /* turn off the ch, but only if not paused */
- if (!info->play.pause) {
- info->play.active = 0;
- }
- }
-
- /* make sure we send all pending signals */
- chpptr = chptr->ch_private;
-
- EOF_count = chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
-
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
-
- am_send_signal(statep, stpptr);
- }
- }
-
- /* turn off the hardware active flag, always send a signal */
- hw_info->play.active = 0;
- am_send_signal(statep, stpptr);
-
- ATRACE("am_play_shutdown_trad() returning", statep);
-
- return;
-
-} /* am_play_shutdown_trad() */
-
-/*
- * am_release_ad_access()
- *
- * Description:
- * This routine is used to release the serial access to the audio driver
- * entry points.
- *
- * Arguments:
- * am_apm_private_t *stpptr Ptr to APM private data
- *
- * Returns:
- * Void
- */
-static void
-am_release_ad_access(am_apm_private_t *stpptr)
-{
- ATRACE("in am_release_ad_access()", stpptr);
- ATRACE("am_release_ad_access() curthread", curthread);
-
- /* wait for all other calls into the audio driver to return */
- mutex_enter(&stpptr->am_ad_lock);
-
- ASSERT(stpptr->am_ad_in & AM_APM_IN_DRIVER);
-
- /* we're done, so release any waiting threads */
- stpptr->am_ad_in &= ~AM_APM_IN_DRIVER;
-
- /* wake up one thread waiting on this CV */
- cv_signal(&stpptr->am_ad_cv);
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE("am_release_ad_access() done", curthread);
-
-} /* am_release_ad_access() */
-
-/*
- * am_set_record_streams()
- *
- * Description:
- * Set the STREAMS high and low water marks for the record channel. We try
- * this when the audio channel is initially opened. If that fails,
- * am_send_audio_common() will also make an attempt to set the water marks.
- * Otherwise, left alone the STREAMS default settings overflow almost
- * immediately at the higher sample rates.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * AUDIO_SUCCESS High and Low water marks increased
- * AUDIO_FAILURE High and Low water marks not increased
- */
-int
-am_set_record_streams(audio_ch_t *chptr)
-{
- mblk_t *mop;
- struct stroptions *sop;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*sop));
-
- if (mop = allocb(sizeof (struct stroptions), BPRI_HI)) {
- mop->b_datap->db_type = M_SETOPTS;
- mop->b_wptr += sizeof (struct stroptions);
- sop = (struct stroptions *)mop->b_rptr;
- sop->so_flags = SO_HIWAT | SO_LOWAT;
- sop->so_hiwat = AM_MAX_QUEUED_MSGS_SIZE;
- sop->so_lowat = AM_MIN_QUEUED_MSGS_SIZE;
-
- am_safe_putnext(chptr, mop);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*sop));
-
- ATRACE("am_set_record_streams() adjustment successful", 0);
-
- return (AUDIO_SUCCESS);
- }
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*sop));
-
- ATRACE("am_set_record_streams() adjustment failed", 0);
-
- return (AUDIO_FAILURE);
-
-} /* am_set_record_streams() */
-
-/*
- * am_send_audio_common()
- * Common code between am_send_audio_multi() and am_send_audio_trad().
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * void *buf The buffer to get audio from
- * int samples The number of samples the Codec sent
- *
- * Returns:
- * Void
- */
-static void
-am_send_audio_common(audio_ch_t *chptr, void *buf, int samples)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info = chptr->ch_info.info;
- am_ch_private_t *chpptr = chptr->ch_private;
- mblk_t *mp;
- queue_t *q = RD(chptr->ch_qptr);
- size_t size;
- int bytes_per_samplef;
- int channels = info->record.channels;
- int mp_size;
- int precision = info->record.precision;
- int remaining;
-
- ATRACE("in am_send_audio_common()", chptr);
-
- ASSERT(statep);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /*
- * Check if the STREAMS water marks for the record channel have been
- * properly set. If not, try and set them here.
- */
- if (!(chpptr->acp_flags & AM_CHNL_RSTREAMS_SET)) {
- ATRACE("am_send_audio_common() adjusting streams queue",
- chpptr);
- if (am_set_record_streams(chptr) == AUDIO_SUCCESS) {
- ATRACE("am_send_audio_common() streams queue adjustment"
- " successful", chpptr);
- chpptr->acp_flags |= AM_CHNL_RSTREAMS_SET;
- }
- }
-
- /* figure out how many bytes there are in a sample frame */
- bytes_per_samplef = channels * (precision >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("am_send_audio_common() bytes_per_samplef",
- bytes_per_samplef);
-
- /* figure out how many bytes we've got */
- size = samples * (precision >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("am_send_audio_common() size", size);
-
- /* first we see if we have a partial buffer waiting to be sent */
- if (chpptr->acp_rec_mp) { /* yup, we need to fill it first */
- ATRACE("am_send_audio_common() filling partial buffer",
- chpptr->acp_rec_mp);
-
- mp = chpptr->acp_rec_mp;
-
- /*
- * Figure out how much of the buffer is remaining. We don't
- * use the record buffer size because it may have changed
- * since the message was allocated.
- */
- remaining = chpptr->acp_rec_remaining;
- ATRACE_32("am_send_audio_common() remaining", remaining);
-
- /* make sure we've got enough to fill this buffer */
- if (remaining > size) {
- /* we don't, so use what we have and return */
- bcopy(buf, mp->b_wptr, size);
- mp->b_wptr += size;
- chpptr->acp_rec_remaining -= size;
- info->record.samples += size / bytes_per_samplef;
- ATRACE("am_send_audio_common() not enough", mp);
-
- /* make sure the channel is still active */
- info->record.active = 1;
-
- return;
- }
-
- /* we do, so fill and then go on to get a new buffer */
- bcopy(buf, mp->b_wptr, remaining);
- mp->b_wptr += remaining;
- info->record.samples += remaining / bytes_per_samplef;
- ASSERT(q == RD(q));
-
- am_safe_putnext(chptr, mp);
-
- chpptr->acp_rec_mp = NULL;
- chpptr->acp_rec_remaining = 0;
- buf = (char *)buf + remaining;
- size -= remaining;
- ATRACE_32("am_send_audio_common() partial buffer filled", size);
- ASSERT(chpptr->acp_rec_remaining == 0);
- }
- ASSERT(chpptr->acp_rec_mp == NULL);
-
- /* start with a full buffer */
- remaining = info->record.buffer_size;
-
- /* now place remaining data into new buffers */
- while (size) {
-
- /* buffer_size may change during loop */
- mp_size = info->record.buffer_size;
-
- if ((mp = allocb(mp_size, BPRI_HI)) == NULL) {
- /*
- * Often times when one allocb() fails we get many
- * more that fail. We don't want this error message
- * to spew uncontrolled. So we set this flag and the
- * next time if it's set we don't display the message.
- * Once we get a success we clear the flags, thus one
- * message per continuous set of failures.
- */
- if (!(chpptr->acp_flags & AM_CHNL_CLIMIT)) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "mixer: send_audio_c() "
- "allocb() failed, recorded audio lost");
- chpptr->acp_flags |= AM_CHNL_CLIMIT;
- }
-
- ATRACE("am_send_audio_common() allocb() failed",
- chptr);
- info->record.error = 1;
- return;
- }
- chpptr->acp_flags &= ~AM_CHNL_CLIMIT;
-
- mp->b_datap->db_type = M_DATA;
-
- if (mp_size > size) {
- /* partial buffer */
- bcopy(buf, mp->b_rptr, size);
- mp->b_wptr += size;
- chpptr->acp_rec_remaining = mp_size - size;
- info->record.samples += size / bytes_per_samplef;
- chpptr->acp_rec_mp = mp;
- ATRACE("am_send_audio_common() new not enough", mp);
- break;
- }
- /* full buffer */
- bcopy(buf, mp->b_rptr, mp_size);
- mp->b_wptr += mp_size;
- info->record.samples += mp_size / bytes_per_samplef;
- ASSERT(q == RD(q));
-
- am_safe_putnext(chptr, mp);
-
- ASSERT(chpptr->acp_rec_mp == NULL);
- chpptr->acp_rec_remaining = 0;
- buf = (char *)buf + mp_size;
- size -= mp_size;
-
- /* start with a full buffer for the next loop */
- remaining = info->record.buffer_size;
- }
-
- /* make sure the channel is still active */
- info->record.active = 1;
-
- ATRACE("am_send_audio_common() done", buf);
-
-} /* am_send_audio_common() */
-
-/*
- * am_send_audio_multi()
- *
- * Description:
- * This routine is used by multi-channel Codecs to send a single stream
- * of audio data to an individual channel.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * void *buf The buffer to get audio from
- * int channel The device channel number
- * int samples The number of samples the Codec sent
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * sent. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-am_send_audio_multi(audio_state_t *statep, am_ad_info_t *ad_infop, void *buf,
- int channel, int samples)
-{
- audio_ch_t *chptr = &statep->as_channels[channel];
- audio_info_t *info = chptr->ch_info.info;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- size_t size;
- size_t size_plus_rb;
- int channels = info->record.channels;
-
- ASSERT(statep);
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- return;
- }
-
- /* make sure we can put the audio before we waste time converting it */
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_multi() channel closed", chptr);
- return;
- case AUDIO_FAILURE:
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32("am_send_audio_multi() ch flow controlled",
- chptr->ch_info.ch_number);
- return;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
-
- /* make sure the # of samples is modulo the # of H/W channels */
- if (channels != AUDIO_CHANNELS_MONO && (samples % channels) != 0) {
- ATRACE_32("am_send_audio_multi() bad sample size", samples);
- samples -= samples % channels;
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /* make sure the conversion buffer is large enough */
- size = samples << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_multi() couldn't allocate "
- "conversion buffer, audio lost");
- return;
- }
-
- /* convert to canonical format */
- am_convert_to_int(buf, chpptr->acp_ch_rconv1, samples,
- info->record.precision, info->record.encoding, stpptr->am_rflags);
-
- /* send to the application */
- am_send_audio_common(chptr, chpptr->acp_ch_rconv1, samples);
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_send_audio_multi() done", buf);
-
-} /* am_send_audio_multi() */
-
-/*
- * am_send_audio_trad_compat()
- *
- * Description:
- * This routine is used by traditional Codecs to send a single recorded
- * audio stream up to applications in COMPAT mode. The data is converted
- * to the applications format, except the sample rate, which the hardware
- * must match.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Personality module data struct
- * int *buf The buffer to get audio from
- * int samples The # of samples the Codec sent
- *
- * Returns:
- * void
- */
-static void
-am_send_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop,
- int *buf, int samples)
-{
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- size_t size;
- size_t size_plus_rb;
- uint_t channels;
- uint_t hw_channels;
- int already_active;
- int i;
- int max_chs;
-
- ATRACE("in am_send_audio_trad_compat()", statep);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- /* go through the chs looking for the only recording AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0]; i < max_chs;
- i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is reading */
- if (!chpptr->acp_reading) {
- ATRACE("am_send_audio_trad_compat() not recording",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- mutex_exit(&chptr->ch_lock);
- return;
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE_32("am_send_audio_trad_compat() found channel", i);
- break;
- }
- if (i >= max_chs) {
- ATRACE("am_send_audio_trad_compat() done, no rec channel", buf);
- return;
- }
-
- /* make sure we can put the audio before we waste time converting it */
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_trad_compat() channel closed", chptr);
- return;
- case AUDIO_FAILURE:
- am_send_signal(statep, stpptr);
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32("am_send_audio_trad_compat() ch flow controlled",
- chptr->ch_info.ch_number);
- return;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /*
- * We had to free the lock above to make warlock happy. Unfortunately
- * it's possible that the channel closed between releasing and
- * reacquiring the lock. So we have to check again.
- */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO || chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_send_audio_trad_compat() ch closed on us", chptr);
- return;
- }
-
- hw_channels = stpptr->am_hw_rchs;
- channels = info->record.channels;
-
- size = (samples + AM_EXTRA_SAMPLES) << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
-
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't allocate "
- "conversion buffer, audio lost");
- return;
- }
-
- /* convert between mono <---> stereo */
- am_convert_int_mono_stereo(buf, chpptr->acp_ch_rconv1, &samples,
- hw_channels, channels);
-
- /* now convert to the application's format */
- am_convert_to_format(chpptr->acp_ch_rconv1, chpptr->acp_ch_rconv2,
- samples, info->record.precision, info->record.encoding, 0);
-
- /* update recorded sample count */
- hw_info->record.samples += samples / hw_channels;
-
- /* send to the application */
- already_active = info->record.active;
- am_send_audio_common(chptr, chpptr->acp_ch_rconv2, samples);
-
- mutex_exit(&chptr->ch_lock);
-
- if (already_active != info->record.active) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_send_audio_trad_compat() done", buf);
-
-} /* am_send_audio_trad_compat() */
-
-/*
- * am_send_audio_trad_mixer()
- *
- * Description:
- * This routine is used by traditional Codecs to send multiple recorded
- * audio stream up to applications in MIXER mode. The data is converted
- * to the applications format, including sample rate.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Personality module data struct
- * int *buf The buffer to get audio from
- * int samples The # of samples the Codec sent
- *
- * Returns:
- * void
- */
-static void
-am_send_audio_trad_mixer(audio_state_t *statep, audio_apm_info_t *apm_infop,
- int *buf, const int samples)
-{
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ad_src_entry_t *rsrs = ad_infop->ad_record.ad_conv;
- int *conv_data;
- size_t size;
- size_t size_plus_rb;
- uint_t channels;
- uint_t hw_channels;
- int already_active;
- int i;
- int max_chs;
- int tmp_samples;
-
- ATRACE("in am_send_audio_trad_mixer()", statep);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- hw_channels = stpptr->am_hw_rchs;
- ATRACE_32("am_send_audio_trad_mixer() am_in_chs", stpptr->am_in_chs);
-
- /* go through the chs looking for each AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_mixer() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is reading */
- if (!chpptr->acp_reading) {
- ATRACE("am_send_audio_trad_mixer() not recording",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure we can put the audio before we waste time */
- mutex_exit(&chptr->ch_lock);
-
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_trad_mixer() channel closed",
- chptr);
- return;
- case AUDIO_FAILURE:
- am_send_signal(statep, stpptr);
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32(
- "am_send_audio_trad_mixer() ch flow "
- "controlled", chptr->ch_info.ch_number);
- continue;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
- mutex_enter(&chptr->ch_lock);
-
- ATRACE_32("am_send_audio_trad_mixer() found channel", i);
-
- /* don't let samples get modified */
- tmp_samples = samples;
-
- channels = info->record.channels;
-
- /* use the mode lock to keep the mode from switching */
- mutex_enter(&stpptr->am_mode_lock);
-
- /*
- * Make sure there's enough memory to convert to int. We
- * ask for more so that after SRC we hopefully don't need
- * to free and allocate again. We also need to make sure
- * we've got enough to go from mono to stereo.
- */
- size = (tmp_samples + AM_EXTRA_SAMPLES) << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
-
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't "
- "allocate conversion buffer, audio lost");
- return;
- }
-
- /* convert between mono <---> stereo */
- am_convert_int_mono_stereo(buf,
- (int *)((char *)chpptr->acp_ch_rconv1 +
- chpptr->acp_ch_rbuf_size), &tmp_samples, hw_channels,
- channels);
-
- /*
- * Make sure we have the buffers to perform sample rate
- * conversion, then do the sample rate conversion.
- */
- if (am_update_src_buffer(chptr, samples, hw_channels,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(M) couldn't "
- "allocate src buffer, audio lost");
- continue;
- }
-
- conv_data = rsrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- info->record.channels, AUDIO_RECORD, chpptr->acp_ch_rconv1,
- chpptr->acp_ch_rsrc1, chpptr->acp_ch_rsrc2, &tmp_samples);
-
- ASSERT(tmp_samples <= (chpptr->acp_ch_rsrc_siz >>
- AM_TIMES_4_SHIFT));
-
- if (!conv_data) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(M) sample "
- "rate conversion failed, audio lost");
- continue;
- }
-
- /*
- * Make sure there's enough memory to convert to format.
- * We also need to make sure we've got enough to go from
- * mono to stereo
- */
- size = tmp_samples << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't "
- "allocate conversion buffer, audio lost");
- return;
- }
-
- /* apply gain to the sample rate converted audio */
- am_apply_gain_balance(conv_data, tmp_samples, channels,
- info->record.gain, info->record.balance);
-
- /* now convert to the application's format */
- am_convert_to_format(conv_data, chpptr->acp_ch_rconv2,
- tmp_samples, info->record.precision, info->record.encoding,
- 0);
-
- mutex_exit(&stpptr->am_mode_lock);
-
- /* send to the application */
- already_active = info->record.active;
- am_send_audio_common(chptr, chpptr->acp_ch_rconv2, tmp_samples);
-
- ATRACE("am_send_audio_trad_mixer() done with channel", chptr);
-
- mutex_exit(&chptr->ch_lock);
-
- if (already_active != info->record.active) {
- am_send_signal(statep, stpptr);
- }
-
- }
-
- /* update recorded sample count */
- hw_info->record.samples += samples / hw_channels;
-
- ATRACE("am_send_audio_trad_mixer() done", buf);
-
-} /* am_send_audio_trad_mixer() */
-
-/*
- * am_serialize_ad_access()
- *
- * Description:
- * This routine is used to guarantee that all of the calls into the
- * audio driver, except for ad_ioctl() and ad_iocdata(), are serialized.
- *
- * Arguments:
- * am_apm_private_t *stpptr Ptr to APM private data
- *
- * Returns:
- * Void
- */
-static void
-am_serialize_ad_access(am_apm_private_t *stpptr)
-{
- ATRACE("in am_serialize_ad_access()", stpptr);
- ATRACE("am_serialize_ad_access() curthread", curthread);
-
- /* wait for all other calls into the audio driver to return */
- mutex_enter(&stpptr->am_ad_lock);
-
- while (stpptr->am_ad_in & (AM_APM_IN_DRIVER|AM_APM_FREEZE)) {
- ATRACE("am_serialize_ad_access() in cv_wait()", curthread);
- cv_wait(&stpptr->am_ad_cv, &stpptr->am_ad_lock);
- ATRACE("am_serialize_ad_access() cv_wait() returned",
- curthread);
- }
-
- ASSERT(!(stpptr->am_ad_in & AM_APM_IN_DRIVER));
-
- /* we have permission to enter, so flag as busy */
- stpptr->am_ad_in |= AM_APM_IN_DRIVER;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE("am_serialize_ad_access() done", curthread);
-
-} /* am_serialize_ad_access() */
-
-/*
- * Task queue callbacks.
- */
-
-/*
- * am_hw_task()
- *
- * Description:
- * Called by the task queue to update the hardware state based on
- * input from the audio driver. This is usually driven by the user
- * pressing a button, like volume up/down, on the audio device.
- *
- * NOTE: There isn't an input mute like there is an output mute, so we
- * set the input gain to 0 and save the old gain for unmute. If
- * another app raised the input gain then the input gain isn't
- * 0 and thus we are no longer muted.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_hw_task(void *arg)
-{
- audio_state_t *statep =
- ((am_state_ch_args_t *)arg)->asca_statep;
- audio_apm_info_t *apm_infop =
- ((am_state_ch_args_t *)arg)->asca_apm_infop;
- audio_info_t *hw_info =
- (audio_info_t *)apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- int cmd = ((am_state_ch_args_t *)arg)->asca_cmd;
- int dir = ((am_state_ch_args_t *)arg)->asca_dir;
- int value = ((am_state_ch_args_t *)arg)->asca_value;
- int balance;
- int gain;
- int send_signal = 0;
- uint_t channels;
-
- ATRACE("in am_hw_task() statep", statep);
- ATRACE_32("am_hw_task() cmd", cmd);
- ATRACE_32("am_hw_task() dir", dir);
- ATRACE_32("am_hw_task() value", value);
- ASSERT(statep);
-
- switch (cmd) {
- case AM_HWSC_SET_GAIN_ABS:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (gain >= AUDIO_MAX_GAIN) {
- ATRACE_32("am_hw_task() ABS gain already at max", gain);
- break;
- } else if (gain <= AUDIO_MIN_GAIN) {
- ATRACE_32("am_hw_task() ABS gain already at min", gain);
- break;
- }
-
- /* apply the new absolute gain */
- gain = value;
-
- /* make sure the result isn't too big or small */
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
- ATRACE_32("am_hw_task() new absolute gain", gain);
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.gain = gain;
- } else {
- hw_info->record.gain = gain;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_BAL_ABS:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (balance >= AUDIO_RIGHT_BALANCE) {
- ATRACE_32("am_hw_task() ABS balance"
- " already right", balance);
- break;
- } else if (balance <= AUDIO_LEFT_BALANCE) {
- ATRACE_32("am_hw_task() ABS balance"
- " already left", balance);
- break;
- }
-
- /* apply the new absolute balance */
- balance = value;
-
- /* make sure the result isn't too big or small */
- if (balance > AUDIO_RIGHT_BALANCE) {
- balance = AUDIO_RIGHT_BALANCE;
- } else if (balance < AUDIO_LEFT_BALANCE) {
- balance = AUDIO_LEFT_BALANCE;
- }
- ATRACE_32("am_hw_task() new absolute balance", balance);
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.balance = (uchar_t)balance;
- } else {
- hw_info->record.balance = (uchar_t)balance;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_GAIN_DELTA:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (value > 0 && gain >= AUDIO_MAX_GAIN) {
- ATRACE_32("am_hw_task() gain already at max", gain);
- break;
- } else if (value < 0 && gain <= AUDIO_MIN_GAIN) {
- ATRACE_32("am_hw_task() gain already at min", gain);
- break;
- }
-
- /* apply delta */
- gain += value;
-
- /* make sure the result isn't too big or small */
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.gain = gain;
- } else {
- hw_info->record.gain = gain;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_BAL_DELTA:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (value > 0 && balance >= AUDIO_RIGHT_BALANCE) {
- ATRACE_32("am_hw_task() bal. already right", balance);
- break;
- } else if (value < 0 && balance <= AUDIO_LEFT_BALANCE) {
- ATRACE_32("am_hw_task() bal. already left", balance);
- break;
- }
-
- /* apply delta */
- balance += value;
-
- /* make sure the result isn't too big or small */
- if (balance > AUDIO_RIGHT_BALANCE) {
- balance = AUDIO_RIGHT_BALANCE;
- } else if (balance < AUDIO_LEFT_BALANCE) {
- balance = AUDIO_LEFT_BALANCE;
- }
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.balance = (uchar_t)balance;
- } else {
- hw_info->record.balance = (uchar_t)balance;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_MUTE_TOGGLE:
- if (dir == AUDIO_PLAY) {
- /* toggle mute */
- if (hw_info->output_muted) {
- value = AM_NOT_MUTED;
- } else {
- value = AM_MUTED;
- }
-
- /* set new mute */
- ad_infop = apm_infop->apm_ad_infop;
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- value, NULL, AM_SERIALIZE) == AUDIO_SUCCESS) {
- hw_info->output_muted = (uchar_t)value;
- }
- } else {
- if (hw_info->record.gain) {
- stpptr->am_save_hw_rgain = hw_info->record.gain;
- value = AUDIO_MIN_GAIN;
- } else {
- value = stpptr->am_save_hw_rgain;
- }
-
- if (am_set_gain(statep, apm_infop,
- stpptr->am_hw_rchs, (uint_t)value,
- hw_info->record.balance, AUDIO_RECORD,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE, AM_SERIALIZE) ==
- AUDIO_SUCCESS) {
- hw_info->record.gain = value;
- }
- }
-
- send_signal++;
-
- break;
- default:
- ATRACE_32("am_hw_task() unrecognized command", cmd);
- break;
- }
-
- /* free the argument memory */
-
- kmem_free(arg, sizeof (am_state_ch_args_t));
-
- if (send_signal) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_hw_task() done", statep);
-
-} /* am_hw_task() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c b/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c
deleted file mode 100644
index 86d849f9b1..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c
+++ /dev/null
@@ -1,5376 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * This file contains the code for implementing the ioctl()s that the audio.7I
- * and mixer.7I man pages define. This file also contains private routines to
- * support these calls.
- *
- * am_wput() in am_main.c just grabs the M_IOCTL and M_IOCDATA messages and
- * sends them to either am_wioctl() or am_wiocdata(), where all processing
- * takes place. am_svc() doesn't do any ioctl() processing at all.
- *
- * The following ioctl()s are supported:
- * AUDIO_DIAG_LOOPBACK
- * AUDIO_DRAIN
- * AUDIO_GETINFO
- * AUDIO_SETINFO
- * AUDIO_GETDEV
- * AUDIO_MIXER_MULTIPLE_OPEN
- * AUDIO_MIXER_SINGLE_OPEN
- * AUDIO_MIXER_GET_SAMPLE_RATES
- * AUDIO_MIXERCTL_GETINFO
- * AUDIO_MIXERCTL_SETINFO
- * AUDIO_MIXERCTL_GET_CHINFO
- * AUDIO_MIXERCTL_SET_CHINFO
- * AUDIO_MIXERCTL_GET_MODE
- * AUDIO_MIXERCTL_SET_MODE
- *
- * Most of the ioctl()s copy in a data structure for use by the ioctl().
- * am_wioctl() or am_wiocdata() will request the data. Based on the ioctl()
- * it then creates a data structure and enqueues a task request to execute
- * that ioctl() in a separate thread. This allows am_wput() and am_wsvc() to
- * continue working while the ioctl() is processed. When the ioctl() in it's
- * own thread is complete it creates the appropriate message and sends it
- * back up the queue. Further processing to copy out and ack/nack is done by
- * am_wiocdata().
- *
- * A task queue is used to serialize all access to the hardware state
- * structures and the hardware. This greatly simplifies the locking model.
- * When closing we wait for all of the tasks to complete. This may introduce
- * a delay in closing, but tests with 40 playing channels shows no noticable
- * delays.
- *
- * Two ioctl()s are not placed on the task queue. They are:
- *
- * AUDIO_GETINFO - Returns static data and thus the hardware state is
- * irrelevant.
- * AUDIO_DRAIN - This ioctl() doesn't change or get the device state.
- * It is also a very long lived ioctl() and is dependent on how
- * much audio is queued up. We don't want to block other channels
- * from being open()ed or their ioctl()s. Because this is a long
- * lived ioctl() it is handled in am_wsvc() instead of am_wput().
- * Otherwise it would block am_wput() and this is against the
- * rules.
- *
- * Signals are generated when the hardware is modified. The signal is sent
- * after the ioctl()'s ack or nack has been sent. That way we don't get an
- * interrupted system call.
- *
- * These routines are provided for use by the other mixer source code files:
- * am_wiocdata()
- * am_wioctl()
- * am_audio_drained()
- * am_audio_set_info()
- * am_set_format()
- * am_set_gain()
- */
-
-#include <sys/modctl.h>
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/strsun.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Local routine prototypes used only by this file.
- */
-static int am_ck_bits_set32(uint_t);
-static void am_exit_task(audio_ch_t *);
-static void am_fix_info(audio_ch_t *, audio_info_t *);
-static void am_fix_play_pause(audio_ch_t *);
-static void am_mixer_task_acknack(audio_i_state_t *, audio_ch_t *,
- queue_t *, mblk_t *, am_ioctl_args_t *, int);
-static void am_restart(audio_state_t *, audio_info_t *);
-static int am_sched_task(queue_t *, mblk_t *, audio_ch_t *,
- void (*func)(void *));
-static int am_set_compat_mode(audio_ch_t *, am_ad_info_t *, audio_ch_t *,
- audio_ch_t *);
-static int am_set_mixer_mode(audio_ch_t *, am_ad_info_t *, am_apm_private_t *,
- audio_ch_t *, audio_ch_t *);
-static int am_wiocdata_mixerctl_chinfo(queue_t *, mblk_t *, audio_i_state_t *);
-static int am_wiocdata_mixerctl_get_chinfo(queue_t *, mblk_t *,
- audio_i_state_t *);
-static int am_wiocdata_sr(queue_t *, mblk_t *, struct copyreq *,
- audio_i_state_t *);
-static int am_wioctl_copyin(queue_t *, mblk_t *, audio_ch_t *,
- audio_i_state_t *, int);
-static void am_wioctl_drain(queue_t *, mblk_t *, audio_ch_t *,
- struct copyreq *);
-static int am_wioctl_getdev(queue_t *, mblk_t *, audio_ch_t *,
- audio_i_state_t *);
-
-/*
- * Taskq callbacks.
- */
-static void am_diag_loopback_task(void *);
-static void am_get_chinfo_task(void *);
-static void am_get_mode_task(void *);
-static void am_getinfo_task(void *);
-static void am_mixerctl_getinfo_task(void *);
-static void am_mixerctl_setinfo_task(void *);
-static void am_multiple_open_task(void *);
-static void am_sample_rate_task(void *);
-static void am_set_chinfo_task(void *);
-static void am_set_mode_task(void *);
-static void am_setinfo_task(void *);
-static void am_single_open_task(void *);
-
-/* this simulates the rw lock handling by taskq framework */
-#ifdef __lock_lint
-extern krwlock_t q_lock;
-
-static void
-am_enter_rwlock()
-{
- _NOTE(READ_LOCK_ACQUIRED_AS_SIDE_EFFECT(&q_lock));
- rw_enter(&q_lock, RW_READER);
-}
-
-static void
-am_release_rwlock()
-{
- _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&q_lock));
- rw_exit(&q_lock);
-}
-#else
-#define am_enter_rwlock()
-#define am_release_rwlock()
-#endif
-
-/*
- * The main routines for this file.
- */
-
-/*
- * am_wiocdata()
- *
- * Description:
- * This routine is called by am_wput() to process all M_IOCDATA
- * messages.
- *
- * We only support transparent ioctls.
- *
- * This routine also is used to return a IOCNAK if the state pointer
- * or the channel pointer, setup in am_wsvc(), are invalid.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * WARNING: Don't forget to free the mblk_t struct used to hold private
- * data. The ack: and nack: jump points take care of this.
- *
- * WARNING: Don't free the private mblk_t structure if the command is
- * going to call qreply(). This frees the private data that will
- * be needed for the next M_IOCDATA message.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * am_wsvc()
- */
-int
-am_wiocdata(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- struct copyreq *cqp;
- struct copyresp *csp;
- audio_i_state_t *cmd;
- int error = 0;
- int send_sig = 0;
-
- ATRACE("in am_wiocdata()", chptr);
- ATRACE_32("am_wiocdata() channel type", chptr->ch_info.dev_type);
-
- ASSERT(statep);
- ASSERT(!MUTEX_HELD(&apm_infop->apm_lock));
-
- csp = (struct copyresp *)mp->b_rptr; /* setup copy response ptr */
- cqp = (struct copyreq *)mp->b_rptr; /* setup copy request ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
-
- /* make sure we've got a good return value */
- if (csp->cp_rval) {
- ATRACE("am_wiocdata() bad return value", csp->cp_rval);
- error = EINVAL;
- goto done;
- }
-
- /*
- * Work through the iocdata messages. These are arranged so that
- * the messages that need to do further work are ordered first and
- * then the ACKs.
- */
- if (cmd != NULL) {
- ATRACE_32("am_wiocdata() command", cmd->ais_command);
- switch (cmd->ais_command) {
-
- case AM_COPY_IN_AUDIOINFO:
- /* AUDIO_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_AUDIOINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_SETINFO);
-
- error = am_sched_task(q, mp, chptr, am_setinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_DIAG_LOOPB:
- /* AUDIO_DIAG_LOOPBACK */
- ATRACE("am_wiocdata() AM_COPY_IN_DIAG_LOOPB", chptr);
- ASSERT(csp->cp_cmd == AUDIO_DIAG_LOOPBACK);
-
- error = am_sched_task(q, mp, chptr,
- am_diag_loopback_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_SAMP_RATES:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_IN_SAMP_RATES", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- error = am_wiocdata_sr(q, mp, cqp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_SAMP_RATES2:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_IN_SAMP_RATES2", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- error = am_sched_task(q, mp, chptr,
- am_sample_rate_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTLINFO:
- /* AUDIO_MIXERCTL_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTLINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SETINFO);
-
- error = am_sched_task(q, mp, chptr,
- am_mixerctl_setinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_GET_CHINFO:
- /* AUDIO_MIXERCTL_GET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO);
-
- error = am_sched_task(q, mp, chptr, am_get_chinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_OUT_MIXCTL_GET_CHINFO:
- /* AUDIO_MIXERCTL_GET/SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_GET_CHINFO",
- chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_wiocdata_mixerctl_get_chinfo(q, mp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_SET_CHINFO:
- /* AUDIO_MIXERCTL_SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_wiocdata_mixerctl_chinfo(q, mp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_SET_CHINFO2:
- /* AUDIO_MIXERCTL_SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_sched_task(q, mp, chptr, am_set_chinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_MODE:
- /* AUDIO_MIXERCTL_SET_MODE */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_MODE", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_MODE);
-
- error = am_sched_task(q, mp, chptr, am_set_mode_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_OUT_AUDIOINFO:
- /* AUDIO_GETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_AUDIOINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_GETINFO);
-
- goto done;
-
- case AM_COPY_OUT_AUDIOINFO2:
- /* AUDIO_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_AUDIOINFO2", chptr);
- ASSERT(csp->cp_cmd == AUDIO_SETINFO);
-
- send_sig++;
-
- goto done;
-
- case AM_COPY_OUT_GETDEV:
- /* AUDIO_GETDEV */
- ATRACE("am_wiocdata() AM_COPY_OUT_GETDEV", chptr);
- ASSERT(csp->cp_cmd == AUDIO_GETDEV);
-
- goto done;
-
- case AM_COPY_OUT_SAMP_RATES:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_OUT_SAMP_RATES", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- goto done;
-
- case AM_COPY_OUT_MIXCTLINFO:
- /* AUDIO_MIXERCTL_GET/SETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTLINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GETINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SETINFO);
-
- /* generate a signal ONLY when we set the info */
- if (csp->cp_cmd == AUDIO_MIXERCTL_SETINFO) {
- send_sig++;
- }
-
- goto done;
-
- case AM_COPY_OUT_MIXCTL_GET_CHINFO2:
- /* AUDIO_MIXERCTL_GET/SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_GET_CHINFO2",
- chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- /* generate a signal ONLY when we set the info */
- if (csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO) {
- send_sig++;
- }
-
- goto done;
-
- case AM_COPY_OUT_MIXCTL_MODE:
- /* AUDIO_MIXERCTL_GET_MODE */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_MODE", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_MODE);
-
- goto done;
-
- default:
- ATRACE("am_wiocdata() No framework cmds found, "
- "check driver entry points next", chptr);
- break;
- }
- }
-
- /* see if we have an entry pt in the Audio Driver */
- if (ad_infop->ad_entry->ad_iocdata) {
- /* we do, so call it */
- ATRACE("am_wiocdata(): "
- "calling Audio Driver iocdata() routine",
- ad_infop->ad_entry);
-
- switch (ad_infop->ad_entry->ad_iocdata(
- AUDIO_STATE2HDL(statep), chptr->ch_info.ch_number,
- q, mp, &error)) {
- case AM_WIOCDATA:
- return (0);
- case AM_ACK:
- goto done;
- case AM_NACK:
- goto done;
- default:
- break;
- }
- }
-
- /* no driver entry, so we nack unrecognized iocdata cmds */
- ATRACE("am_wiocdata() no entry", chptr);
- error = EINVAL;
-
- /* Done checking */
- ATRACE("am_wiocdata() switch & driver check done", chptr);
-
-done:
- ATRACE("am_wiocdata() done", chptr);
-
- if (csp->cp_private) {
- kmem_free(csp->cp_private, sizeof (audio_i_state_t));
- csp->cp_private = NULL;
- }
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- if (send_sig) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_wiocdata() returning success", chptr);
-
- return (0);
-
-} /* am_wiocdata() */
-
-/*
- * am_wioctl()
- *
- * Description:
- * This routine is called by am_wput() to process all M_IOCTL
- * messages.
- *
- * We only support transparent ioctls. Since this is a driver we
- * nack unrecognized ioctls.
- *
- * This routine also is used to return a IOCNAK if the state pointer
- * or the channel pointer, setup in am_wsvc(), are invalid.
- *
- * The following ioctls are supported:
- * AUDIO_DIAG_LOOPBACK special diagnostics mode
- * AUDIO_DRAIN
- * AUDIO_GETDEV
- * AUDIO_GETINFO
- * AUDIO_SETINFO
- * AUDIO_MIXER_MULTIPLE_OPEN
- * AUDIO_MIXER_SINGLE_OPEN
- * AUDIO_MIXER_GET_SAMPLE_RATES
- * AUDIO_MIXERCTL_GETINFO
- * AUDIO_MIXERCTL_SETINFO
- * AUDIO_MIXERCTL_GET_CHINFO
- * AUDIO_MIXERCTL_SET_CHINFO
- * AUDIO_MIXERCTL_GET_MODE
- * AUDIO_MIXERCTL_SET_MODE
- * unknown call Audio Driver ioctl() routine
- *
- * WARNING: There cannot be any locks owned by calling routines.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * am_wsvc()
- */
-int
-am_wioctl(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- struct iocblk *iocbp;
- struct copyreq *cqp;
- audio_i_state_t *state = NULL;
- audio_device_type_e type = chptr->ch_info.dev_type;
- int command;
- int error = 0;
-
- ATRACE("in am_wioctl()", chptr);
- ATRACE_32("am_wioctl() channel type", chptr->ch_info.dev_type);
-
- ASSERT(statep);
- ASSERT(type == AUDIO || type == AUDIOCTL);
- ASSERT(!MUTEX_HELD(&apm_infop->apm_lock));
-
- iocbp = (struct iocblk *)mp->b_rptr; /* pointer to ioctl info */
- cqp = (struct copyreq *)mp->b_rptr; /* setup copyreq ptr */
-
- command = iocbp->ioc_cmd;
-
- /* make sure this is a transparent ioctl */
- if (iocbp->ioc_count != TRANSPARENT) {
- ATRACE_32("am_wioctl() not TRANSPARENT", iocbp->ioc_count);
- error = EINVAL;
- goto done;
- }
-
- /* get a buffer for priv. data, but only if this isn't an AUDIO_DRAIN */
- if (command != AUDIO_DRAIN) {
- if ((state = kmem_zalloc(sizeof (*state), KM_NOSLEEP)) ==
- NULL) {
- ATRACE("am_wioctl() state kmem_zalloc() failed", 0);
- error = ENOMEM;
- goto done;
- }
- }
-
- ATRACE_32("am_wioctl() command", iocbp->ioc_cmd);
- switch (command) {
-
- case AUDIO_DIAG_LOOPBACK:
- ATRACE("am_wioctl() AUDIO_DIAG_LOOPBACK", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_DIAG_LOOPBACK);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_DRAIN:
- ATRACE("am_wioctl() AUDIO_DRAIN", chptr);
-
- cqp->cq_private = NULL;
- am_wioctl_drain(q, mp, chptr, cqp);
- return (0);
-
- case AUDIO_GETDEV:
- ATRACE("am_wioctl() AUDIO_GETDEV", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_getdev(q, mp, chptr, state);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_GETINFO:
- ATRACE("am_wioctl() AUDIO_GETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_sched_task(q, mp, chptr, am_getinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_SETINFO:
- ATRACE("am_wioctl() AUDIO_SETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_SETINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_MULTIPLE_OPEN:
- ATRACE("am_wioctl() AUDIO_MIXER_MULTIPLE_OPEN", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- if (chptr->ch_info.dev_type != AUDIO) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_multiple_open_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_SINGLE_OPEN:
- ATRACE("am_wioctl() AUDIO_MIXER_SINGLE_OPEN", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- if (chptr->ch_info.dev_type != AUDIO) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_single_open_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_GET_SAMPLE_RATES:
- ATRACE("am_wioctl() AUDIO_MIXER_GET_SAMPLE_RATES", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXER_GET_SAMPLE_RATES);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GETINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_sched_task(q, mp, chptr, am_mixerctl_getinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SETINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SETINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GET_CHINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GET_CHINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_GET_CHINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SET_CHINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SET_CHINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SET_CHINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GET_MODE:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GET_MODE", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_get_mode_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SET_MODE:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SET_MODE", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SET_MODE);
- if (error) {
- goto done;
- }
- return (0);
-
- default: /* see if we have an entry pt in the Audio Driver */
- if (ad_infop->ad_entry->ad_ioctl) {
- /* we do, so call it */
- ATRACE("am_wioctl(): "
- "calling Audio Driver ioctl() routine",
- ad_infop->ad_entry);
- ASSERT(ad_infop->ad_entry->ad_iocdata);
-
- switch (ad_infop->ad_entry->ad_ioctl(
- AUDIO_STATE2HDL(statep), chptr->ch_info.ch_number,
- q, mp, &error)) {
- case AM_WIOCDATA:
- return (0);
- case AM_ACK:
- goto done;
- case AM_NACK:
- goto done;
- default:
- break;
- }
- }
-
- /* no - we're a driver, so we nack unrecognized ioctls */
- ATRACE_32("am_wioctl() default", iocbp->ioc_cmd);
-
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "wioctl() unrecognized ioc_cmd: 0x%x",
- iocbp->ioc_cmd);
- error = EINVAL;
- break;
- }
-
- /* we always either ack or nack depending on if error is set or not */
- ATRACE_32("am_wioctl() switch done", error);
-
-done:
- ATRACE("am_wioctl() done", chptr);
-
- /* free allocated state memory */
- if (state) {
- kmem_free(state, sizeof (*state));
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE_32("am_wioctl() returning", error);
-
- return (0);
-
-} /* am_wioctl() */
-
-/*
- * Private utilities used by this and other audio mixer files.
- */
-
-/*
- * am_audio_drained()
- *
- * Description:
- * There's an AUDIO_DRAIN ioctl() that is waiting. When the channel
- * goes empty this routine is called to send the ack back to the
- * STREAMS head, which lets the ioctl() return.
- *
- * We also generate a CV signal so that waiting close()s will wakeup.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- *
- * Returns:
- * void
- */
-void
-am_audio_drained(audio_ch_t *chptr)
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = (am_ch_private_t *)chptr->ch_private;
- mblk_t *mp;
-
- ATRACE("in am_audio_drained()", chptr);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* make sure the channel is empty, while locked */
- if (!(chpptr->acp_flags & AM_CHNL_EMPTY)) {
- ATRACE("am_audio_drained() returned, not empty", chptr);
- return;
- }
-
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2|\
- AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT);
- mp = chpptr->acp_drain_mp;
- chpptr->acp_drain_mp = NULL;
- cv_signal(&chptr->ch_cv);
- ATRACE("am_audio_drained() MP", mp);
-
- /*
- * By definition we don't have any audio to play thus if we need to
- * switch modes we can go ahead and do it now.
- */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
-
- /* ack only if we have an mblk_t */
- if (mp) {
- miocack(WR(chptr->ch_qptr), mp, 0, 0);
- ATRACE("am_audio_drained() AUDIO_DRAIN acked", mp);
- }
-
- ATRACE("am_audio_drained() returning", chptr);
-
-} /* am_audio_drained() */
-
-/*
- * am_audio_set_info()
- *
- * Description:
- * This routine double checks the passed in audio_info_t structure to
- * make sure the values are legal. If they are then they are used to
- * update the audio hardware. In COMPAT mode all the hardware is updated,
- * as it is for a multi-stream Codec. However traditional Codecs in MIXER
- * mode don't update the data format or gain. Everything else can be
- * updated.
- *
- * After the checks are completed and the hardware has been updated
- * the reti pointer is checked. If NULL we are done. Otherwise the
- * structure pointed to by reti is filled in with the new hardware
- * configuration.
- *
- * The mixer only supports a few formats, 16-bit linear and 8-bit
- * u-law, A-law and linear. Any other format will cause the check to
- * fail.
- *
- * We don't bother checking the read only members, silently ignoring any
- * modifications.
- *
- * XXX Need to set hardware to original state if error, especially
- * if src_update() fails. Also, maybe move src_update() up higher so it
- * can fail before we change hardware. Plus, it's easier to undo
- * src_update().
- *
- * NOTE: The Codec's lock must NOT be held when calling this routine.
- *
- * NOTE: reti will be NULL only when this routine is being called by
- * am_open().
- *
- * NOTE: The calling routine is responsible for sending the hardware
- * change signal.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * audio_info_t *newi Pointer to the struct with new values
- * audio_info_t *reti Pointer to the updated struct that is
- * returned
- *
- * Returns:
- * AUDIO_SUCCESS Successful
- * AUDIO_FAILURE Failed
- */
-int
-am_audio_set_info(audio_ch_t *chptr, audio_info_t *newi, audio_info_t *reti)
-{
- audio_info_t *curi; /* current state */
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t tempi; /* approved values in here */
- audio_device_type_e type = chptr->ch_info.dev_type;
- boolean_t ch_ctl = B_FALSE;
- boolean_t new_play_samples = B_FALSE;
- boolean_t new_record_samples = B_FALSE;
- boolean_t play = B_FALSE;
- boolean_t record = B_FALSE;
- boolean_t start_play = B_FALSE;
- boolean_t start_record = B_FALSE;
- boolean_t stop_play = B_FALSE;
- boolean_t stop_record = B_FALSE;
- int codec_type = ad_infop->ad_codec_type;
- int doread;
- int dowrite;
- int mode = stpptr->am_pstate->apm_mode;
- int stream;
-
- ATRACE("in am_audio_set_info()", chptr);
- ATRACE_32("am_audio_set_info() mode", mode);
-
- ASSERT(!mutex_owned(&statep->as_lock));
- ASSERT(apm_infop);
-
- /*
- * Are we playing and/or recording? For AUDIOCTL channels we
- * force play and record, thus checking to see if it is changing
- * the format. Since AUDIOCTL channels can't change the format
- * we fail if the format isn't the same.
- */
- curi = chptr->ch_info.info;
- if ((chptr->ch_dir & AUDIO_PLAY) || type == AUDIOCTL) {
- play = B_TRUE;
- }
- if ((chptr->ch_dir & AUDIO_RECORD) || type == AUDIOCTL) {
- record = B_TRUE;
- }
-
- /*
- * If hardware supports both play and record then we need to do the
- * play vs. record checks.
- */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
-
- /*
- * The AUDIO_MIXERCTL_SETINFO ioctl() creates a pseudo channel that
- * has it's ch_info.info set to hw_info. When in mixer mode this is
- * the only time this happens. For this ioctl() we set only a small
- * number of the h/w specific entries. So we fake out compat mode
- * so that the h/w does get set.
- */
- if (mode == AM_MIXER_MODE && chptr->ch_info.info == hw_info) {
- ATRACE("am_audio_set_info() AUDIO_MIXERCTL_SETINFO ioctl()",
- NULL);
- mode = AM_COMPAT_MODE;
- }
-
- /* we use curi to get info to check against */
- if (mode == AM_COMPAT_MODE) {
- curi = hw_info;
-#ifdef DEBUG
- } else {
- /* this was set above, just be a bit paranoid */
- ASSERT(mode == AM_MIXER_MODE);
- ASSERT(curi == chptr->ch_info.info);
-#endif
- }
-
- /* first make sure the new data format is legal */
- if (play && Modify(newi->play.sample_rate) &&
- newi->play.sample_rate != curi->play.sample_rate) {
- if (type != AUDIO || am_ck_sample_rate(&ad_infop->ad_play,
- mode, newi->play.sample_rate) == AUDIO_FAILURE) {
- goto error;
- }
- tempi.play.sample_rate = newi->play.sample_rate;
- } else {
- tempi.play.sample_rate = curi->play.sample_rate;
- }
- if (record && Modify(newi->record.sample_rate) &&
- newi->record.sample_rate != curi->record.sample_rate) {
- if (type != AUDIO || am_ck_sample_rate(&ad_infop->ad_record,
- mode, newi->record.sample_rate) == AUDIO_FAILURE) {
- goto error;
- }
- tempi.record.sample_rate = newi->record.sample_rate;
- } else {
- tempi.record.sample_rate = curi->record.sample_rate;
- }
- mutex_enter(&statep->as_lock);
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_SR) &&
- tempi.play.sample_rate != tempi.record.sample_rate) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.sample_rate =
- tempi.record.sample_rate;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.sample_rate =
- tempi.play.sample_rate;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /*
- * There's a bug in audiotool which after doing an
- * AUDIO_SETINFO it updates the state in AudioDevice.cc
- * SetState() it uses the record side to get the new
- * sample rate! So work around if write only. Who knows,
- * perhaps other apps are as stupid!
- */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same sample rate, gads! */
- tempi.record.sample_rate =
- tempi.play.sample_rate;
- }
- }
- }
-
- ATRACE_32("am_audio_set_info() PLAY sample rate set",
- tempi.play.sample_rate);
- ATRACE_32("am_audio_set_info() RECORD sample rate set",
- tempi.record.sample_rate);
-
- if (play && Modify(newi->play.channels) &&
- newi->play.channels != curi->play.channels) {
- if (type != AUDIO || am_ck_channels(&ad_infop->ad_play,
- newi->play.channels, B_FALSE) == AUDIO_FAILURE) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.channels = newi->play.channels;
- } else {
- tempi.play.channels = curi->play.channels;
- }
- if (record && Modify(newi->record.channels) &&
- newi->record.channels != curi->record.channels) {
- if (type != AUDIO || am_ck_channels(&ad_infop->ad_record,
- newi->record.channels, B_FALSE) == AUDIO_FAILURE) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.channels = newi->record.channels;
- } else {
- tempi.record.channels = curi->record.channels;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_CH) &&
- tempi.play.channels != tempi.record.channels) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.channels = tempi.record.channels;
- } else if (stpptr->am_in_chs != 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.channels = tempi.play.channels;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same channels, gads! */
- tempi.record.channels = tempi.play.channels;
- }
- }
- }
- ATRACE_32("am_audio_set_info() PLAY channels set",
- tempi.play.channels);
- ATRACE_32("am_audio_set_info() RECORD channels set",
- tempi.record.channels);
-
- if (play && Modify(newi->play.precision) &&
- newi->play.precision != curi->play.precision) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.precision = newi->play.precision;
- } else {
- tempi.play.precision = curi->play.precision;
- }
- if (record && Modify(newi->record.precision) &&
- newi->record.precision != curi->record.precision) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.precision = newi->record.precision;
- } else {
- tempi.record.precision = curi->record.precision;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_PREC) &&
- tempi.play.precision != tempi.record.precision) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.precision = tempi.record.precision;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.precision = tempi.play.precision;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same precision, gads! */
- tempi.record.precision = tempi.play.precision;
- }
- }
- }
- ATRACE_32("am_audio_set_info() PLAY precision set",
- tempi.play.precision);
- ATRACE_32("am_audio_set_info() RECORD precision set",
- tempi.record.precision);
-
- if (play && Modify(newi->play.encoding) &&
- newi->play.encoding != curi->play.encoding) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.encoding = newi->play.encoding;
- } else {
- tempi.play.encoding = curi->play.encoding;
- }
- if (record && Modify(newi->record.encoding) &&
- newi->record.encoding != curi->record.encoding) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.encoding = newi->record.encoding;
- } else {
- tempi.record.encoding = curi->record.encoding;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_ENC) &&
- tempi.play.encoding != tempi.record.encoding) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.encoding = tempi.record.encoding;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.encoding = tempi.play.encoding;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same encoding, gads! */
- tempi.record.encoding = tempi.play.encoding;
- }
- }
- }
- mutex_exit(&statep->as_lock);
-
- ATRACE_32("am_audio_set_info() PLAY encoding set",
- tempi.play.encoding);
- ATRACE_32("am_audio_set_info() RECORD encoding set",
- tempi.record.encoding);
-
- /*
- * In COMPAT mode or with multi-channel Codecs we check against
- * what the hardware allows. Otherwise, we check against what the
- * mixer can deal with. But only if an AUDIO channel.
- */
- if (type == AUDIO) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC) {
- if (dowrite && am_ck_combinations(
- ad_infop->ad_play_comb, tempi.play.encoding,
- tempi.play.precision, B_FALSE) == AUDIO_FAILURE) {
- goto error;
- }
- if (doread && am_ck_combinations(ad_infop->ad_rec_comb,
- tempi.record.encoding, tempi.record.precision,
- B_FALSE) == AUDIO_FAILURE) {
- goto error;
- }
-
- } else { /* AM_MIXER_MODE */
- /* make sure the mixer can deal with the combinations */
- ASSERT(mode == AM_MIXER_MODE);
-
- switch ((int)tempi.play.channels) {
- case -1: /* no change to channel */
- case AUDIO_CHANNELS_MONO:
- case AUDIO_CHANNELS_STEREO:
- break;
- default:
- goto error;
- }
- switch ((int)tempi.record.channels) {
- case -1: /* no change to channel */
- case AUDIO_CHANNELS_MONO:
- case AUDIO_CHANNELS_STEREO:
- break;
- default:
- goto error;
- }
-
- switch ((int)tempi.play.encoding) {
- case -1: /* no change to encoding */
- break;
- case AUDIO_ENCODING_LINEAR: /* signed */
- /* we support 8 & 16-bit linear */
- if (tempi.play.precision != AUDIO_PRECISION_16 &&
- tempi.play.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- case AUDIO_ENCODING_LINEAR8: /* unsigned */
- case AUDIO_ENCODING_ULAW:
- case AUDIO_ENCODING_ALAW:
- /* support 8-bit unsigned linear, u-law & A-law */
- if (tempi.play.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- default:
- goto error;
- }
- switch ((int)tempi.record.encoding) {
- case -1: /* no change to encoding */
- break;
- case AUDIO_ENCODING_LINEAR: /* signed */
- /* we support 8 & 16-bit linear */
- if (tempi.record.precision != AUDIO_PRECISION_16 &&
- tempi.record.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- case AUDIO_ENCODING_LINEAR8: /* unsigned */
- case AUDIO_ENCODING_ULAW:
- case AUDIO_ENCODING_ALAW:
- /* support 8-bit unsigned linear, u-law & A-law */
- if (tempi.record.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- default:
- goto error;
- }
- }
- }
- ATRACE("am_audio_set_info() precision/encoding checked OK", &tempi);
-
- if (Modify(newi->play.gain)) {
- if (newi->play.gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.play.gain = newi->play.gain;
- } else {
- tempi.play.gain = curi->play.gain;
- }
- if (Modify(newi->record.gain)) {
- if (newi->record.gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.record.gain = newi->record.gain;
- } else {
- tempi.record.gain = curi->record.gain;
- }
- ATRACE_32("am_audio_set_info() PLAY gain set", tempi.play.gain);
- ATRACE_32("am_audio_set_info() RECORD gain set", tempi.record.gain);
-
- if (Modify(newi->play.port)) {
- tempi.play.port = newi->play.port;
- } else {
- tempi.play.port = hw_info->play.port;
- }
- if (tempi.play.port & ~hw_info->play.avail_ports) { /* legal port? */
- goto error;
- }
- /* always turn on un-modifiable ports */
- tempi.play.port |= hw_info->play.avail_ports & ~hw_info->play.mod_ports;
- if (ad_infop->ad_misc_flags & AM_MISC_PP_EXCL) { /* check exclusivity */
- if (am_ck_bits_set32(tempi.play.port) > 1) {
- goto error;
- }
- }
- if (Modify(newi->record.port)) {
- tempi.record.port = newi->record.port;
- } else {
- tempi.record.port = hw_info->record.port;
- }
- if (tempi.record.port & ~hw_info->record.avail_ports) { /* legal ? */
- goto error;
- }
- /* always turn on un-modifiable ports */
- tempi.record.port |=
- hw_info->record.avail_ports & ~hw_info->record.mod_ports;
- /* check exclusivity */
- if (ad_infop->ad_misc_flags & AM_MISC_RP_EXCL) {
- if (am_ck_bits_set32(tempi.record.port) > 1) {
- goto error;
- }
- }
- ATRACE_32("am_audio_set_info() PLAY ports set", tempi.play.port);
- ATRACE_32("am_audio_set_info() RECORD ports set", tempi.record.port);
-
- if (Modifyc(newi->play.balance)) {
- if (newi->play.balance > AUDIO_RIGHT_BALANCE) {
- goto error;
- }
- tempi.play.balance = newi->play.balance;
- } else {
- tempi.play.balance = curi->play.balance;
- }
- if (Modifyc(newi->record.balance)) {
- if (newi->record.balance > AUDIO_RIGHT_BALANCE) {
- goto error;
- }
- tempi.record.balance = newi->record.balance;
- } else {
- tempi.record.balance = curi->record.balance;
- }
-
- ATRACE_32("am_audio_set_info() PLAY balance set", tempi.play.balance);
- ATRACE_32("am_audio_set_info() REC balance set", tempi.record.balance);
-
- if (Modify(newi->monitor_gain)) {
- if (ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_IN2OUT) {
- if (newi->monitor_gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.monitor_gain = newi->monitor_gain;
- } else {
- if (newi->monitor_gain != hw_info->monitor_gain) {
- ATRACE("am_audio_set_info() "
- "monitor gain cannot be set", 0);
- goto error;
- }
- tempi.monitor_gain = hw_info->monitor_gain;
- }
- } else {
- tempi.monitor_gain = hw_info->monitor_gain;
- }
- ATRACE_32("am_audio_set_info() monitor gain set", tempi.monitor_gain);
-
- if (dowrite && Modifyc(newi->output_muted)) {
- tempi.output_muted = newi->output_muted;
- } else {
- tempi.output_muted = curi->output_muted;
- }
- ATRACE_32("am_audio_set_info() output muted set", tempi.output_muted);
-
- /*
- * Now that we've got the new values verified we need to update the
- * hardware. The following is updated:
- * COMPAT Mode, All Devices
- * play.minordev (H/W) record.minordev (H/W)
- * COMPAT Mode, AUDIO Device
- * play.sample_rate (H/W) record.sample_rate (H/W)
- * play.channels (H/W) record.channels (H/W)
- * play.precision (H/W) record.precision (H/W)
- * play.encoding (H/W) record.encoding (H/W)
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * COMPAT Mode, AUDIOCTL Device
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * MIXER Mode, All Devices
- * play.minordev (CH) record.minordev (CH)
- * MIXER Mode, AUDIO Device, Traditional Codec
- * play.sample_rate (CH) record.sample_rate (CH)
- * play.channels (CH) record.channels (CH)
- * play.precision (CH) record.precision (CH)
- * play.encoding (CH) record.encoding (CH)
- * play.gain (CH) record.gain (CH)
- * play.balance (CH) record.balance (CH)
- * output_muted (CH)
- * MIXER Mode, AUDIOCTL Device, Traditional Codec, Same Process As
- * An AUDIO Channel, ch_ctl == TRUE
- * play.gain (CH) record.gain (CH)
- * play.balance (CH) record.balance (CH)
- * output_muted (CH)
- * MIXER Mode, AUDIOCTL Device, Traditional Codec, Different Proc.
- * From An AUDIO Channel, ch_ctl == FALSE
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * MIXER Mode, AUDIO Device, Multi-Channel Codec
- * play.sample_rate (CH H/W) record.sample_rate (CH H/W)
- * play.channels (CH H/W) record.channels (CH H/W)
- * play.precision (CH H/W) record.precision (CH H/W)
- * play.encoding (CH H/W) record.encoding (CH H/W)
- * play.gain (CH H/W) record.gain (CH H/W)
- * play.balance (CH H/W) record.balance (CH H/W)
- * output_muted (CH H/W)
- * MIXER Mode, AUDIOCTL Device, Multi-Channel Codec, Same Proc. As
- * An AUDIO Channel, ch_ctl == TRUE
- * play.gain (CH H/W) record.gain (CH H/W)
- * play.balance (CH H/W) record.balance (CH H/W)
- * output_muted (CH H/W)
- * MIXER Mode, AUDIOCTL Device, Multi-Channel Codec, Different
- * Process From An AUDIO, ch_ctl == FALSE
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * All May Modify These Fields
- * play.port (H/W) record.port (H/W)
- * monitor_gain (H/W)
- *
- * If we are in AM_COMPAT_MODE then output_muted controls the hardware,
- * otherwise it just affects the channel, if it is a ch_ctl.
- */
-
- /* only AUDIO channels can affect the data format */
- if (type == AUDIO) {
- /* figure out our "stream number" */
- if (codec_type == AM_MS_CODEC) {
- stream = chptr->ch_info.ch_number;
- } else {
- stream = AM_SET_CONFIG_BOARD;
- }
-
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC) {
- /*
- * We only set the format if there's been a change.
- * Otherwise we risk introducing noise, pops, etc.,
- * for little good reason.
- */
- if (dowrite && (hw_info->play.sample_rate !=
- tempi.play.sample_rate ||
- hw_info->play.channels !=
- tempi.play.channels ||
- hw_info->play.precision !=
- tempi.play.precision ||
- hw_info->play.encoding !=
- tempi.play.encoding)) {
- if (am_set_format(statep, stpptr, ad_infop,
- stream, AUDIO_PLAY,
- tempi.play.sample_rate,
- stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- if (doread && (hw_info->record.sample_rate !=
- tempi.record.sample_rate ||
- hw_info->record.channels !=
- tempi.record.channels ||
- hw_info->record.precision !=
- tempi.record.precision ||
- hw_info->record.encoding !=
- tempi.record.encoding)) {
- if (am_set_format(statep, stpptr, ad_infop,
- stream, AUDIO_RECORD,
- tempi.record.sample_rate,
- stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- }
- /* lock state while updating so ISR calls will be okay */
- mutex_enter(&chptr->ch_lock);
- if (mode == AM_MIXER_MODE) {
- curi->play.sample_rate = tempi.play.sample_rate;
- curi->play.channels = tempi.play.channels;
- curi->play.precision = tempi.play.precision;
- curi->play.encoding = tempi.play.encoding;
- curi->record.sample_rate = tempi.record.sample_rate;
- curi->record.channels = tempi.record.channels;
- curi->record.precision = tempi.record.precision;
- curi->record.encoding = tempi.record.encoding;
- } else {
- hw_info->play.sample_rate = tempi.play.sample_rate;
- hw_info->play.channels = tempi.play.channels;
- hw_info->play.precision = tempi.play.precision;
- hw_info->play.encoding = tempi.play.encoding;
- hw_info->record.sample_rate = tempi.record.sample_rate;
- hw_info->record.channels = tempi.record.channels;
- hw_info->record.precision = tempi.record.precision;
- hw_info->record.encoding = tempi.record.encoding;
- }
-
- /* see if we need to update the sample rate conv. routines */
- if (mode == AM_MIXER_MODE && codec_type == AM_TRAD_CODEC) {
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
-
- if (chpptr->acp_writing) {
- ATRACE("am_audio_set_info() PLAY, "
- "calling src update", chpptr);
- if (ad_infop->ad_play.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(chptr),
- &((audio_info_t *)chptr->ch_info.info)->
- play,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- play,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_play.ad_sr_info,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- ATRACE("am_audio_set_info() "
- "play src_update() failed", 0);
- mutex_exit(&chptr->ch_lock);
- goto error;
- }
- }
- if (chpptr->acp_reading) {
- ATRACE("am_audio_set_info() RECORD, "
- "calling src update", chpptr);
- if (ad_infop->ad_record.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(chptr),
- &((audio_info_t *)chptr->ch_info.info)->
- record,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- record,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_record.ad_sr_info,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- ATRACE("am_audio_set_info() "
- "record src_update() failed", 0);
- mutex_exit(&chptr->ch_lock);
- goto error;
- }
- }
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- /* is this an AUDIOCTL ch with the PID as another AUDIO ch? */
- mutex_enter(&chptr->ch_lock);
- ch_ctl = (chpptr->acp_flags & AM_CHNL_CONTROL) ? B_TRUE : B_FALSE;
- mutex_exit(&chptr->ch_lock);
-
- /* re-figure out our "stream number" */
- if (mode == AM_COMPAT_MODE || (mode == AM_MIXER_MODE && !ch_ctl)) {
- stream = AM_SET_CONFIG_BOARD;
- } else {
- stream = chptr->ch_info.ch_number;
- }
-
- /*
- * AUDIO and AUDIOCTL can affect gains, ports, etc. If in COMPAT
- * mode or a MS Codec we affect hardware. Otherwise this is a
- * virtual ch. and only that channel's parameters are affected,
- * i.e., no hardware update. Also, if a MS Codec and an AUDIOCTL
- * channel isn't associated with a particular stream then we don't
- * muck with hardware either.
- */
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- (type == AUDIOCTL && !ch_ctl)) {
- if (dowrite && am_set_gain(statep, apm_infop,
- stpptr->am_hw_pchs, (tempi.play.gain & 0x0ff),
- tempi.play.balance, AUDIO_PLAY, stream, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- if (doread && am_set_gain(statep, apm_infop,
- stpptr->am_hw_rchs, (tempi.record.gain & 0x0ff),
- tempi.record.balance, AUDIO_RECORD, stream, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- /* only if output_muted actually changed */
- if (hw_info->output_muted != tempi.output_muted) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_OUTPUT_MUTE, AUDIO_PLAY, tempi.output_muted,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- }
- if (mode == AM_MIXER_MODE) {
- curi->play.gain = tempi.play.gain;
- curi->play.balance = tempi.play.balance;
- curi->record.gain = tempi.record.gain;
- curi->record.balance = tempi.record.balance;
- curi->output_muted = tempi.output_muted;
- tempi.play.minordev = curi->play.minordev;
- tempi.record.minordev = curi->record.minordev;
- } else {
- hw_info->play.gain = tempi.play.gain;
- hw_info->play.balance = tempi.play.balance;
- hw_info->record.gain = tempi.record.gain;
- hw_info->record.balance = tempi.record.balance;
- hw_info->output_muted = tempi.output_muted;
- tempi.play.minordev = hw_info->play.minordev;
- tempi.record.minordev = hw_info->record.minordev;
- }
-
- /* now we can set the ports and monitor gain, since all can set them */
- if (tempi.play.port != hw_info->play.port) {
- /* only if the play port actually changed */
- if (hw_info->play.port != tempi.play.port) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_PORT, AUDIO_PLAY, tempi.play.port, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->play.port = tempi.play.port;
- }
- if (tempi.record.port != hw_info->record.port) {
- /* only if the record port actually changed */
- if (hw_info->record.port != tempi.record.port) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_PORT, AUDIO_RECORD, tempi.record.port,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->record.port = tempi.record.port;
- }
- if (tempi.monitor_gain != hw_info->monitor_gain) {
- /* only if the monitor gain actually changed */
- if (hw_info->monitor_gain != tempi.monitor_gain) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, tempi.monitor_gain,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->monitor_gain = tempi.monitor_gain;
- }
-
- /* we need to update the virtual channel, if we have one */
- if (mode == AM_MIXER_MODE) {
- curi->play.port = tempi.play.port;
- curi->record.port = tempi.record.port;
- curi->monitor_gain = tempi.monitor_gain;
- }
-
- /* now fix virtual channel parameters */
- if (Modify(newi->play.buffer_size)) {
- tempi.play.buffer_size = newi->play.buffer_size;
- } else {
- tempi.play.buffer_size = curi->play.buffer_size;
- }
- if (Modify(newi->record.buffer_size)) {
- tempi.record.buffer_size = newi->record.buffer_size;
- } else {
- tempi.record.buffer_size = curi->record.buffer_size;
- }
- ATRACE("am_audio_set_info() buffer size set", &tempi);
-
- if (Modify(newi->play.samples)) {
- tempi.play.samples = newi->play.samples;
- new_play_samples = B_TRUE;
- } else {
- tempi.play.samples = curi->play.samples;
- }
- if (Modify(newi->record.samples)) {
- tempi.record.samples = newi->record.samples;
- new_record_samples = B_TRUE;
- } else {
- tempi.record.samples = curi->record.samples;
- }
- ATRACE("am_audio_set_info() samples updated", &tempi);
-
- if (Modify(newi->play.eof)) {
- tempi.play.eof = newi->play.eof;
- } else {
- tempi.play.eof = curi->play.eof;
- }
- ATRACE("am_audio_set_info() eof updated", &tempi);
-
- if (Modifyc(newi->play.pause)) {
- tempi.play.pause = newi->play.pause;
- } else {
- tempi.play.pause = curi->play.pause;
- }
- if (Modifyc(newi->record.pause)) {
- tempi.record.pause = newi->record.pause;
- } else {
- tempi.record.pause = curi->record.pause;
- }
- /* if we unpaused we need to make sure we start up again */
- if (!tempi.play.pause && curi->play.pause) {
- start_play = B_TRUE;
- } else if (tempi.play.pause && !curi->play.pause &&
- (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC)) {
- stop_play = B_TRUE;
- }
- if (!tempi.record.pause && curi->record.pause) {
- start_record = B_TRUE;
- } else if (tempi.record.pause && !curi->record.pause &&
- (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC)) {
- stop_record = B_TRUE;
- }
- ATRACE("am_audio_set_info() pause set", &tempi);
-
- if (Modifyc(newi->play.error)) {
- tempi.play.error = newi->play.error;
- } else {
- tempi.play.error = curi->play.error;
- }
- if (Modifyc(newi->record.error)) {
- tempi.record.error = newi->record.error;
- } else {
- tempi.record.error = curi->record.error;
- }
- ATRACE("am_audio_set_info() error updated", &tempi);
-
- if (Modifyc(newi->play.waiting)) {
- tempi.play.waiting = newi->play.waiting;
- } else {
- tempi.play.waiting = curi->play.waiting;
- }
- if (Modifyc(newi->record.waiting)) {
- tempi.record.waiting = newi->record.waiting;
- } else {
- tempi.record.waiting = curi->record.waiting;
- }
- ATRACE("am_audio_set_info() waiting updated", &tempi);
-
- /*
- * For MIXER mode we must update virtual channel parameters, because
- * as soon as we restart the DMA engine(s) it's going to ask for audio.
- * If the pause is still in effect then no data is going to be
- * transferred.
- */
- if (mode == AM_MIXER_MODE) {
- mutex_enter(&chptr->ch_lock);
- curi->play.buffer_size = tempi.play.buffer_size;
- curi->play.pause = tempi.play.pause;
- curi->play.eof = tempi.play.eof;
- curi->play.error = tempi.play.error;
- curi->play.waiting = tempi.play.waiting;
- curi->record.buffer_size = tempi.record.buffer_size;
- curi->record.pause = tempi.record.pause;
- curi->record.error = tempi.record.error;
- curi->record.waiting = tempi.record.waiting;
- mutex_exit(&chptr->ch_lock);
- }
-
- /* before we leave, we need to restart the DMA engines, or ... */
- if (start_play == B_TRUE) {
- /* make sure the play DMA engine is running */
- ASSERT(stop_play == B_FALSE);
- ATRACE("am_audio_set_info() start play", chptr);
- curi->play.pause = 0; /* must be before the call */
- curi->play.active = 1; /* set before start for mode switch */
- hw_info->play.active = 1;
- if (am_ad_start_play(statep, stpptr, ad_infop, stream,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- /* we don't change pause flag if failed to start */
- curi->play.active = 0;
- hw_info->play.active = 0;
- /*
- * Since we are serialized we don't worry about the
- * mode switch CV like am_wsvc() has to.
- */
- } else {
- am_send_signal(statep, stpptr);
- }
- } else if (stop_play == B_TRUE) {
- /* make sure the play DMA engine is paused */
- ATRACE("am_audio_set_info() pause play", chptr);
- am_ad_pause_play(statep, stpptr, ad_infop, stream);
- curi->play.active = 0;
- hw_info->play.active = 0;
- curi->play.pause = 1;
- am_send_signal(statep, stpptr);
- }
- if (start_record == B_TRUE) {
- /* make sure the record DMA engine is running */
- ASSERT(stop_record == B_FALSE);
- ATRACE("am_audio_set_info() start record", chptr);
- curi->record.pause = 0; /* must be before the call */
- curi->record.active = 1; /* set before start for mode switch */
- hw_info->record.active = 1;
- if (am_ad_start_record(statep, stpptr, ad_infop, stream,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- curi->record.active = 0;
- hw_info->record.active = 0;
- /* we don't change pause flag if failed to start */
- } else {
- am_send_signal(statep, stpptr);
- }
- } else if (stop_record == B_TRUE) {
- /* make sure the record DMA engine is stopped */
- ATRACE("am_audio_set_info() stop record", chptr);
- am_ad_stop_record(statep, stpptr, ad_infop, stream);
- curi->record.pause = 1;
- curi->record.active = 0;
- hw_info->record.active = 0;
- am_send_signal(statep, stpptr);
- }
-
- /*
- * For COMPAT mode we are dealing with the hardware, not a virtual
- * channel. So the true state of the hardware can't be modified before
- * starting or stopping the DMA engine(s).
- */
- if (mode == AM_COMPAT_MODE) {
- mutex_enter(&chptr->ch_lock);
- hw_info->play.buffer_size = tempi.play.buffer_size;
- hw_info->play.pause = tempi.play.pause;
- hw_info->play.eof = tempi.play.eof;
- hw_info->play.error = tempi.play.error;
- hw_info->play.waiting = tempi.play.waiting;
- hw_info->record.buffer_size = tempi.record.buffer_size;
- hw_info->record.pause = tempi.record.pause;
- hw_info->record.error = tempi.record.error;
- hw_info->record.waiting = tempi.record.waiting;
- mutex_exit(&chptr->ch_lock);
- }
-
- /* everything passed so we can update the samples count */
- if (new_play_samples) {
- curi->play.samples = tempi.play.samples;
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_psamples_c = 0;
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_p = 0;
- mutex_exit(&chptr->ch_lock);
- }
- if (new_record_samples) {
- curi->record.samples = tempi.record.samples;
- }
-
- /*
- * If we don't have a reti pointer we ignore the R/O members. If we
- * need them we get them directly from the channel that is active.
- * So if reti == NULL we are done. Otherwise copy tempi into the
- * memory pointed to by reti and then copy over the R/O members.
- *
- * We pass the reserved members, just in case.
- * play._xxx[1] record._xxx[1]
- * _xxx[1]
- * _xxx[2]
- */
- if (reti != NULL) {
- ATRACE("am_audio_set_info() reti succeeded", chptr);
-
- /* do a quick copy, and then fill in the special fields */
- bcopy(curi, reti, sizeof (*curi));
-
- mutex_enter(&chptr->ch_lock);
- reti->play.avail_ports = hw_info->play.avail_ports;
- reti->record.avail_ports = hw_info->record.avail_ports;
- reti->play.mod_ports = hw_info->play.mod_ports;
- reti->record.mod_ports = hw_info->record.mod_ports;
- reti->record.eof = 0;
- reti->monitor_gain = hw_info->monitor_gain;
- reti->output_muted = hw_info->output_muted;
- reti->hw_features = hw_info->hw_features;
- reti->sw_features = hw_info->sw_features;
- reti->sw_features_enabled = hw_info->sw_features_enabled;
- mutex_exit(&chptr->ch_lock);
- }
-
- ATRACE("am_audio_set_info() succeeded", chptr);
-
- return (AUDIO_SUCCESS);
-
-error:
- ATRACE("am_audio_set_info() failed", chptr);
-
- return (AUDIO_FAILURE);
-
-} /* am_audio_set_info() */
-
-/*
- * am_set_format()
- *
- * Description:
- * Set the hardware to the desired format. If the format is not
- * supported we set it to the next best thing. Then the audio is
- * translated to the desired format during playback or record.
- *
- * NOTE: All setting of the hardware format MUST be done via this
- * routine. Thus this is the only place the am_hw_* members
- * are updated.
- *
- * NOTE: We don't worry about checking the sample rate. This routine
- * won't be called with a sample rate that isn't legal according
- * to the audio driver's configuration tables.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the AD's config info
- * int stream Audio stream
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Sample rate to set
- * int channels The number of channels to set
- * int precision The sample precision
- * int encoding The encoding method
- * int force Force the format to be set
- * int serialize Serialize calls into driver
- *
- * Returns:
- * AUDIO_SUCCESS The format was successfully set
- * AUDIO_FAILURE The format wasn't set
- */
-int
-am_set_format(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir, int sample_rate,
- int channels, int precision, int encoding, int force, int serialize)
-{
- uint_t hw_sr;
- uint_t hw_chs;
- uint_t hw_enc;
- uint_t hw_prec;
- uint_t new_chs;
- uint_t new_enc;
- uint_t new_prec;
- int flags;
-
- ATRACE("in am_set_format()", statep);
- ATRACE_32("am_set_format() passed sample rate", sample_rate);
-
- if (dir == AUDIO_PLAY) {
- flags = stpptr->am_pflags;
- hw_sr = stpptr->am_hw_info.play.sample_rate;
- hw_chs = stpptr->am_hw_pchs;
- hw_enc = stpptr->am_hw_penc;
- hw_prec = stpptr->am_hw_pprec;
- } else if (dir == AUDIO_RECORD) {
- flags = stpptr->am_rflags;
- hw_sr = stpptr->am_hw_info.record.sample_rate;
- hw_chs = stpptr->am_hw_rchs;
- hw_enc = stpptr->am_hw_renc;
- hw_prec = stpptr->am_hw_rprec;
- } else {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "set_format() bad direction: %d", dir);
- return (AUDIO_FAILURE);
- }
-
- /* start with channels */
- switch (channels) {
- case AUDIO_CHANNELS_MONO:
- /* try to set the same 1st */
- if (flags & AM_PRIV_CH_MONO) {
- new_chs = AUDIO_CHANNELS_MONO;
- } else {
- /* we have to use stereo, so will need to translate */
- ASSERT(flags & AM_PRIV_CH_STEREO);
- new_chs = AUDIO_CHANNELS_STEREO;
- }
- break;
- case AUDIO_CHANNELS_STEREO:
- /* try to set the same 1st */
- if (flags & AM_PRIV_CH_STEREO) {
- new_chs = AUDIO_CHANNELS_STEREO;
- } else {
- /* we have to use mono, so will need to translate */
- ASSERT(flags & AM_PRIV_CH_MONO);
- new_chs = AUDIO_CHANNELS_MONO;
- }
- break;
- default:
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "set_format() bad channels: %d",
- channels);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_set_format() passed channels", channels);
- ATRACE_32("am_set_format() derived channels", new_chs);
-
- /* check the precision */
- if (precision == AUDIO_PRECISION_16) {
- /* see if the hardware supports what we want */
- if (flags & AM_PRIV_16_PCM) {
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- /* the h/w doesn't, so pick an alternative */
- new_prec = AUDIO_PRECISION_8;
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- ASSERT(flags & AM_PRIV_8_PCM);
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else {
- ASSERT(precision == AUDIO_PRECISION_8);
- /* just like above go through the list to see what we can use */
- new_prec = AUDIO_PRECISION_8;
- if (encoding == AUDIO_ENCODING_LINEAR) {
- if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else if (encoding == AUDIO_ENCODING_ULAW) {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else {
- if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else {
- ASSERT(encoding == AUDIO_ENCODING_ALAW);
- if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- }
- }
- ATRACE_32("am_set_format() passed precision", precision);
- ATRACE_32("am_set_format() derived precision", new_prec);
- ATRACE_32("am_set_format() passed encoding", encoding);
- ATRACE_32("am_set_format() derived encoding", new_enc);
-
- /*
- * We now have the best possible h/w configuration. We see if
- * it matches what we already have. If so then there's nothing
- * to do. Otherwise the driver is called to set the hardware.
- * If we do call the h/w we use the derived format, not the
- * format passed to this routine.
- */
- if (hw_sr != sample_rate || hw_chs != new_chs ||
- hw_enc != new_enc || hw_prec != new_prec || force) {
- ATRACE("am_set_format() calling am_ad_set_format()", 0);
- if (am_ad_set_format(statep, stpptr, ad_infop, stream, dir,
- sample_rate, new_chs, new_prec, new_enc, serialize) ==
- AUDIO_FAILURE) {
- ATRACE("am_set_format() am_ad_set_format() failed", 0);
- return (AUDIO_FAILURE);
- }
- /* update the true hardware image */
- /* XXX this is probably not right! */
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr))
- if (dir == AUDIO_PLAY) {
- stpptr->am_hw_info.play.sample_rate = sample_rate;
- stpptr->am_hw_pchs = new_chs;
- stpptr->am_hw_pprec = new_prec;
- stpptr->am_hw_penc = new_enc;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- stpptr->am_hw_info.record.sample_rate = sample_rate;
- stpptr->am_hw_rchs = new_chs;
- stpptr->am_hw_rprec = new_prec;
- stpptr->am_hw_renc = new_enc;
- }
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr))
- }
-
- /* there's no hardware change so just return */
- ATRACE("am_set_format() just returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_set_format() */
-
-/*
- * am_set_gain()
- *
- * Description:
- * This routine is used to set the gain of all channels in the Codec.
- * The gain is modified by balance. We try two different methods, the
- * first with the gain and balance, and the second with gain and balance
- * mixed down into left and right gain. This lets the Audio Driver accept
- * whichever format it prefers. If the Audio Driver doesn't like the
- * first method it returns AUDIO_FAILURE and the second is tried.
- *
- * Some Codecs, like the Crystal 4231, will copy a mono input signal
- * over to the 2nd channel. If this is the case then we apply balance
- * to the left and right channels. Otherwise we adjust the only left
- * gain.
- *
- * NOTE: We change the gain only if it actually did change.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * audio_apm_info_t *apm_infop Ptr to driver's audio_apm_info structure
- * uint_t channels The number of h/w channels
- * uint_t gain The gain to set
- * uint_t balance The balance to set
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int stream The hardware stream to set gain on
- * int force Force the gain to be set
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS The gain was successfully set
- * AUDIO_FAILURE The gain was not successfully set
- */
-int
-am_set_gain(audio_state_t *statep, audio_apm_info_t *apm_infop, uint_t channels,
- uint_t gain, uint_t balance, int dir, int stream, int force,
- int serialize)
-{
- audio_prinfo_t *hw_pinfo;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- uint_t g;
-
- ATRACE("in am_set_gain()", apm_infop);
- ATRACE("am_set_gain() channels", channels);
- ATRACE("am_set_gain() gain", gain);
- ATRACE("am_set_gain() balance", balance);
-
- if (dir == AUDIO_PLAY) {
- hw_pinfo = &((audio_info_t *)apm_infop->apm_ad_state)->play;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- hw_pinfo = &((audio_info_t *)apm_infop->apm_ad_state)->record;
- }
-
- /* 1st try the gain and balance method since it's the easiest for us */
- if (am_ad_set_config(statep, stpptr, ad_infop, stream, AM_SET_GAIN_BAL,
- dir, gain, balance, serialize) == AUDIO_SUCCESS) {
- ATRACE("am_set_gain() AM_SET_GAIN_BAL successful", 0);
- return (AUDIO_SUCCESS);
- }
-
- if (channels == 1 && !(ad_infop->ad_misc_flags & AM_MISC_MONO_DUP)) {
- /* make sure there was a change */
- if (!force && (hw_pinfo->gain == gain)) {
- ATRACE_32("am_set_gain() mono, the same gain", gain);
- return (AUDIO_SUCCESS);
- }
-
- /* we always set left gain */
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) == AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- return (AUDIO_SUCCESS);
- } else {
- /* make sure there was a change */
- if (!force &&
- (hw_pinfo->gain == gain) &&
- (hw_pinfo->balance == balance)) {
- ATRACE_32("am_set_gain() stereo, the same gain", gain);
- ATRACE_32("am_set_gain() stereo, the same balance",
- balance);
- return (AUDIO_SUCCESS);
- }
-
- /*
- * Balance adjusts gain. If balance < 32 then left is
- * enhanced by attenuating right. If balance > 32 then
- * right is enhanced by attenuating left.
- */
- if (balance == AUDIO_MID_BALANCE) { /* no adj. */
- /* left channel */
- ATRACE_32("am_set_gain() L1 gain", gain);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R1 gain", gain);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, gain, 1, serialize));
- } else if (balance < AUDIO_MID_BALANCE) {
- /*
- * l = gain
- * r = (gain * balance) / 32
- */
- g = (gain * balance) >> AM_BALANCE_SHIFT;
- /* left channel */
- ATRACE_32("am_set_gain() L2 gain", gain);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R2 gain", g);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, g, 1, serialize));
- } else {
- /*
- * l = (gain * (64 - balance)) / 32
- * r = gain
- */
- g = (gain * (AUDIO_RIGHT_BALANCE - balance)) >>
- AM_BALANCE_SHIFT;
- /* left channel */
- ATRACE_32("am_set_gain() L3 gain", g);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, g, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R3 gain", gain);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, gain, 1, serialize));
- }
- }
-
-} /* am_set_gain() */
-
-/*
- * Private utilities used only by this file.
- */
-
-/*
- * am_ck_bits_set32()
- *
- * Description:
- * This routine figures out how many bits are set in the passed in val.
- *
- * Arguments:
- * uint val The argument to test
- *
- * Returns:
- * 0 - 32 The number of bits set
- */
-int
-am_ck_bits_set32(uint_t val)
-{
- uint_t mask = 0x00000001u;
- int count;
- int i;
-
- ATRACE_32("in am_ck_bits_set32()", val);
-
- for (i = 0, count = 0; i < 32; i++) {
- if (mask & val) {
- count++;
- }
- mask <<= 1;
- }
-
- ATRACE_32("am_ck_bits_set32() done", count);
-
- return (count);
-
-} /* am_ck_bits_set32() */
-
-/*
- * am_exit_task()
- *
- * Description:
- * Exit from a task. This means decrementing the task counter so a
- * blocked close() may continue.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel's struct
- *
- * Returns:
- * void
- */
-static void
-am_exit_task(audio_ch_t *chptr)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_exit_task()", chptr);
-
- mutex_enter(&chptr->ch_lock);
-
- /* clear the taskq flag */
- chpptr->acp_flags &= ~AM_CHNL_IOCTL_TASK;
-
- ATRACE_32("am_exit_task() flag cleared", chpptr->acp_flags);
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_exit_task() done", chpptr);
-
-} /* am_exit_task() */
-
-/*
- * am_fix_info()
- *
- * Description:
- * When in mixer mode we usually play at a different sample rate
- * than the data stream from the application. Therefore the sample
- * count from the Codec is meaningless. This routine adjusts for the
- * difference in sample rates.
- *
- * We only adjust the play sample count because when recording you send
- * x samples so you always know how many samples you sent so you don't
- * have to adjust.
- *
- * If this is an AUDIOCTL channel and it is associated with the H/W
- * we don't do anything.
- *
- * We also fix port and pause info, as well as other H/W related info,
- * depending on the mixer mode.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel's state structure
- * audio_info_t *info Ptr to the info structure to update
- *
- * Returns:
- * void
- */
-static void
-am_fix_info(audio_ch_t *chptr, audio_info_t *info)
-{
- audio_device_type_e type = chptr->ch_info.dev_type;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- int mode = stpptr->am_pstate->apm_mode;
-
- ATRACE("in am_fix_info()", chptr);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* first, update the features */
- info->hw_features = hw_info->hw_features;
- info->sw_features = hw_info->sw_features;
- info->sw_features_enabled = hw_info->sw_features_enabled;
-
- /* now fix various other things */
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_fix_info() fixing other things", 0);
- if (info->play.pause) {
- info->play.active = 0;
- }
- info->play.port = hw_info->play.port;
- if (info->record.pause) {
- info->record.active = 0;
-
- }
- info->record.port = hw_info->record.port;
- info->monitor_gain = hw_info->monitor_gain;
- }
-
- /*
- * CAUTION: Don't place anything related to record below this
- * point. Otherwise it may not execute.
- *
- * Finally, fix play samples, if we need to.
- */
- if (!chpptr->acp_writing || (type == AUDIOCTL &&
- hw_info == chptr->ch_info.info)) {
-
- ATRACE_32("am_fix_info() not writing, returning",
- chpptr->acp_writing);
-
- return;
- } else {
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- ATRACE("am_fix_info() sample conversion", 0);
-
- info->play.samples +=
- ad_infop->ad_play.ad_conv->ad_src_adjust(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY,
- chpptr->acp_psamples_p);
- } else {
- ATRACE("am_fix_info() NO sample conversion",
- info->play.samples);
-
- info->play.samples += chpptr->acp_psamples_p;
- }
- }
-
- ATRACE("am_fix_info() done", info);
-
-} /* am_fix_info() */
-
-/*
- * am_fix_play_pause()
- *
- * Description:
- * Convenience routine to clean up the code for switching to
- * mixer mode while paused.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel
- *
- * Returns:
- * void
- */
-static void
-am_fix_play_pause(audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info = chptr->ch_info.info;
- audio_data_t *data;
-
- ATRACE("in am_fix_play_pause()", chptr);
-
- /*
- * It is possible that the channel was paused and then the mode
- * was switched. Thus we are most likely changing modes not on
- * a message boundary. Thus we need to make a best guess as to
- * where to start playing.
- */
- if (info->play.pause &&
- (data = audio_sup_get_audio_data(chptr)) != NULL) {
- /* it's remotely possible that we happen to be at the end */
- if (data->adata_optr >= data->adata_oeptr) {
- ATRACE("am_fix_play_pause() end of message", statep);
-
- /* don't let it be played again! */
- audio_sup_free_audio_data(data);
- return;
- } else if (data->adata_orig == data->adata_optr) {
- /* or that we are just about to use a new msg */
- ATRACE("am_fix_play_pause() new message", statep);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(chptr, data);
- return;
- }
-
- /* see if we need to process the data */
- mutex_enter(&chptr->ch_lock);
- if (data->adata_proc == NULL && am_reprocess(chptr, data) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- /*
- * For some reason we can't convert the message and
- * there isn't much we can do, so just blow it away
- * and live with the gap in audio. We don't fail
- * changing modes because that went okay.
- */
- ATRACE("am_fix_play_pause() am_reprocess() failed",
- statep);
- return;
- }
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_fix_play_pause() process successful", data);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(chptr, data);
- }
-
- ATRACE("am_fix_play_pause() successful", statep);
-
-} /* am_fix_play_pause() */
-
-/*
- * am_mixer_task_acknack()
- *
- * Description:
- * Sometimes when a taskq thread is done the ioctl() is also done.
- * To finish off an ioctl() an M_IOCACK or M_IOCNAK message must be sent
- * up to the STREAMS head. This routine performs that task.
- *
- * Arguments:
- * audio_i_state_t *state Pointer to the ioctl() state structure
- * audio_ch_t *chptr Ptr 2 the channel's state structure
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the STREAMS message to use
- * am_ioctl_args_t *arg Argument structure
- * int error 0 if no error, errno otherwise
- *
- * Returns:
- * void
- */
-static void
-am_mixer_task_acknack(audio_i_state_t *state, audio_ch_t *chptr,
- queue_t *q, mblk_t *mp, am_ioctl_args_t *arg, int error)
-{
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
-
- ATRACE("in am_mixer_task_acknack()", state);
-
- /* no memory leaks allowed */
- if (state->ais_address2) {
- freemsg((mblk_t *)state->ais_address2);
- }
-
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- ATRACE_32("am_mixer_task_acknack() error", error);
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- /* let am_close() proceed */
- am_exit_task(chptr);
-
- kmem_free(arg, sizeof (*arg));
-
- ATRACE("am_mixer_task_acknack() done", mp);
-
-} /* am_mixer_task_acknack() */
-
-/*
- * am_restart()
- *
- * Description:
- * This routine is used to restart playing and recording audio when
- * they have been stopped to switch mixer modes.
- *
- * NOTE: This can only be for traditional Codecs, multi-stream Codecs
- * aren't stopped to changed modes.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * audio_info_t *hw_info Pointer to the hardware state
- *
- * Returns:
- * void
- */
-static void
-am_restart(audio_state_t *statep, audio_info_t *hw_info)
-{
- audio_ch_t *tchptr;
- am_ch_private_t *chpptr;
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- audio_info_t *tinfo;
- int i;
- int max_chs = statep->as_max_chs;
-
- ATRACE("in am_restart()", statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_restart() failed");
- return;
- }
- stpptr = apm_infop->apm_private;
- ad_infop = apm_infop->apm_ad_infop;
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
-
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
-
- chpptr = tchptr->ch_private;
- tinfo = tchptr->ch_info.info;
-
- if (chpptr->acp_writing) {
- /* turn the Q back on */
- enableok(WR(tchptr->ch_qptr));
- qenable(WR(tchptr->ch_qptr));
-
- /* make sure we'll be flow controlled in am_wsvc() */
- chpptr->acp_flags &= ~AM_CHNL_PFLOW;
-
- /*
- * It is possible we switched modes right when the last
- * message was played and there's no way we're going
- * to get the three calls to am_get_samples() we need
- * to call cv_signal() for AUDIO_DRAIN. Therefore we
- * set AM_CHNL_EMPTY, which means the next time
- * am_get_samples() is called, which will happen when
- * we start playing below, it does the cv_signal().
- * We can subvert the number of times am_get_samples()
- * needs to be called because we know the DMA buffers
- * have been drained.
- */
- if (audio_sup_get_audio_data_cnt(tchptr) == 0 &&
- chpptr->acp_flags & AM_CHNL_DRAIN) {
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_DRAIN|\
- AM_CHNL_DRAIN_NEXT_INT);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- /* signal any DRAIN situation */
- am_audio_drained(tchptr);
- }
- ATRACE("am_restart() starting playing again", tchptr);
-
- mutex_exit(&tchptr->ch_lock);
- if (!tinfo->play.pause) {
- /* set before start for mode switch */
- if (tinfo->play.active == 0) {
- am_send_signal(statep, stpptr);
- }
- tinfo->play.active = 1;
- hw_info->play.active = 1;
- if (am_ad_start_play(statep, stpptr, ad_infop,
- tchptr->ch_info.ch_number, AM_SERIALIZE) ==
- AUDIO_FAILURE) {
- /*
- * We don't change pause if failed to
- * start.
- */
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- /*
- * Since we are part of the mode switch
- * we don't have to worry about the
- * mode switch CV like am_wsvc() has to.
- */
- }
- }
- mutex_enter(&tchptr->ch_lock);
- }
-
- if (chpptr->acp_reading) {
- ATRACE("am_restart() starting recording again", tchptr);
- if (!tinfo->record.pause) {
- /* set before start for mode switch */
- mutex_exit(&tchptr->ch_lock);
- if (tinfo->record.active == 0) {
- am_send_signal(statep, stpptr);
- }
- tinfo->record.active = 1;
- hw_info->record.active = 1;
- if (am_ad_start_record(statep, stpptr, ad_infop,
- tchptr->ch_info.ch_number, AM_SERIALIZE) ==
- AUDIO_FAILURE) {
- /*
- * We don't change pause if failed to
- * start.
- */
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- }
- } else {
- mutex_exit(&tchptr->ch_lock);
- }
- } else {
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
-} /* am_restart() */
-
-/*
- * am_sched_task()
- *
- * Description:
- * Common routine called to place a task on the taskq.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * void (*func)(void *) Pointer to the task to schedule
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_sched_task(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- void (*func)(void *))
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ioctl_args_t *arg;
-
- ATRACE("in am_sched_task()", q);
-
- /* get the arg structure and fill it in */
- if ((arg = kmem_alloc(sizeof (*arg), KM_NOSLEEP)) == NULL) {
- return (ENOMEM);
- }
-
- arg->aia_q = q;
- arg->aia_mp = mp;
-
- /* schedule the task */
- if (audio_sup_taskq_dispatch(stpptr->am_taskq, func, arg, KM_NOSLEEP) ==
- AUDIO_FAILURE) {
- /* let am_close() proceed and free the arg structure */
- kmem_free(arg, sizeof (*arg));
- am_exit_task(chptr);
- return (EIO);
- }
-
- ATRACE("am_sched_task() returning", chptr);
-
- return (0);
-
-} /* am_sched_task() */
-
-/*
- * am_set_compat_mode()
- *
- * Description:
- * This routine is used to convert the mixer from MIXER mode to COMPAT
- * mode. Any playing and recording channels should have been stopped
- * before this routine is called.
- *
- * When this routine is called there may be one playing and one recording
- * channel.
- *
- * We don't have to worry about resetting psamples_f after calling
- * am_audio_set_info() because am_get_samples() has been called twice
- * while we wait to shutdown. Thus it has already been added into the
- * sample count.
- *
- * NOTE: Only traditional Codecs will use this code.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel changing the mode
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * audio_ch_t *pchptr Ptr to the play channel
- * audio_ch_t *pchptr Ptr to the record channel
- *
- * Returns:
- * AUDIO_SUCCESS Mode change completed successfully.
- * AUDIO_FAILURE Mode change failed.
- */
-static int
-am_set_compat_mode(audio_ch_t *chptr, am_ad_info_t *ad_infop,
- audio_ch_t *pchptr, audio_ch_t *rchptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop;
- audio_data_t *data;
- audio_info_t *hw_info;
- am_apm_persist_t *persistp;
- am_apm_private_t *stpptr;
- audio_ch_t nchptr;
- audio_info_t new_info;
- am_ch_private_t ch_private;
- long tmp;
- int tmp_pgain;
- int tmp_pbal;
- int tmp_rgain;
- int tmp_rbal;
- uchar_t popen = 0;
- uchar_t ropen = 0;
-
- ATRACE("in am_set_compat_mode()", chptr);
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_set_compat_mode() audio_sup_get_apm_info() failed",
- statep);
- return (AUDIO_FAILURE);
- }
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- tmp_pgain = hw_info->play.gain;
- tmp_pbal = hw_info->play.balance;
- tmp_rgain = hw_info->record.gain;
- tmp_rbal = hw_info->record.balance;
-
- /* copy the original channel structure to the temp, just in case */
- bcopy(chptr, &nchptr, sizeof (nchptr));
-
- /* we only reset the hardware if we are playing or recording */
- AUDIO_INIT(&new_info, sizeof (new_info));
- bzero(&ch_private, sizeof (ch_private));
-
- nchptr.ch_dir = 0;
-
- if (pchptr) {
- audio_info_t *p_info = pchptr->ch_info.info;
-
- new_info.play.sample_rate = p_info->play.sample_rate;
- new_info.play.channels = p_info->play.channels;
- new_info.play.precision = p_info->play.precision;
- new_info.play.encoding = p_info->play.encoding;
- new_info.play.gain = p_info->play.gain;
- new_info.play.balance = p_info->play.balance;
- new_info.play.samples = p_info->play.samples;
- new_info.play.eof = p_info->play.eof;
- popen = p_info->play.open;
- ch_private.acp_writing = 1;
- nchptr.ch_dir |= AUDIO_PLAY;
- }
- if (rchptr) {
- audio_info_t *r_info = rchptr->ch_info.info;
-
- new_info.record.sample_rate = r_info->record.sample_rate;
- new_info.record.channels = r_info->record.channels;
- new_info.record.precision = r_info->record.precision;
- new_info.record.encoding = r_info->record.encoding;
- new_info.record.gain = r_info->record.gain;
- new_info.record.balance = r_info->record.balance;
- new_info.record.samples = r_info->record.samples;
- ropen = r_info->record.open;
- ch_private.acp_reading = 1;
- nchptr.ch_dir |= AUDIO_RECORD;
- }
-
- /* we always save the hardware state, even if no play/rec channels */
- stpptr->am_pstate->apm_mode = AM_COMPAT_MODE;
- hw_info->sw_features_enabled &= ~AUDIO_SWFEATURE_MIXER;
-
- /* change the hardware, if we had active play/record channels */
- if (pchptr || rchptr) {
- nchptr.ch_qptr = chptr->ch_qptr;
- nchptr.ch_statep = chptr->ch_statep;
- nchptr.ch_info.dev_type = AUDIO;
- nchptr.ch_apm_infop = apm_infop;
- nchptr.ch_private = &ch_private;
- nchptr.ch_info.info = &new_info;
- /*
- * It's possible that when the bcopy above happens,
- * the ch_lock is held by someone else. It should be
- * cleared. Or, later when we try to hold it and find
- * it's held, deadlock may happen.
- */
- mutex_init(&nchptr.ch_lock, NULL, MUTEX_DRIVER, NULL);
-
- if (am_audio_set_info(&nchptr, &new_info, NULL) ==
- AUDIO_FAILURE) {
- ATRACE("am_set_compat_mode() am_audio_set_info()"
- "failed", &nchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "set_compat() couldn't reconfigure hardware");
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- hw_info->sw_features_enabled |= AUDIO_SWFEATURE_MIXER;
- mutex_destroy(&nchptr.ch_lock);
- return (AUDIO_FAILURE);
- }
- mutex_destroy(&nchptr.ch_lock);
- }
-
- /* update the hardware open flags */
- hw_info->play.open = popen;
- hw_info->record.open = ropen;
-
- /* update persistent memory */
- persistp = stpptr->am_pstate;
- persistp->apm_mpgain = tmp_pgain;
- persistp->apm_mpbal = tmp_pbal;
- persistp->apm_mrgain = tmp_rgain;
- persistp->apm_mrbal = tmp_rbal;
-
- /*
- * It is possible that the channel was paused and then the mode
- * was switched. Thus we are most likely changing modes not on
- * a message boundary. Thus we need to make a best guess as to
- * where to start playing.
- */
- if (pchptr &&
- ((audio_info_t *)pchptr->ch_info.info)->play.pause &&
- (data = audio_sup_get_audio_data(pchptr)) != NULL) {
- /* it's remotely possible that we happen to be at the end */
- if (data->adata_pptr >= data->adata_peptr) {
- ATRACE("am_set_compat_mode() end of data", statep);
-
- /* don't let it be played again! */
- audio_sup_free_audio_data(data);
- return (AUDIO_SUCCESS);
- } else if (data->adata_pptr == data->adata_proc) {
- /* or that we are just about to use new data */
- ATRACE("am_set_compat_mode() new message", statep);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(pchptr, data);
- return (AUDIO_SUCCESS);
- }
-
- /*
- * Make a guess as to where to point to. We make sure we are
- * on a 4 byte boundary. That way we don't have to worry
- * about being in the middle of sample.
- *
- * The equation:
- * (offset of proc data from start)*(length of orig data)
- * --------------------------------------------------------
- * (length of proc data)
- */
- ATRACE("am_set_compat_mode() orig", data->adata_orig);
- ATRACE("am_set_compat_mode() optr", data->adata_optr);
- ATRACE("am_set_compat_mode() oeptr", data->adata_oeptr);
- ATRACE_32("am_set_compat_mode(): osize", data->adata_osize);
- ATRACE("am_set_compat_mode() proc", data->adata_proc);
- ATRACE("am_set_compat_mode() pptr", data->adata_pptr);
- ATRACE("am_set_compat_mode() peptr", data->adata_peptr);
- ATRACE_32("am_set_compat_mode(): psize", data->adata_psize);
-
- tmp = (((char *)data->adata_pptr - (char *)data->adata_proc) *
- data->adata_osize) / data->adata_psize;
-
- /*
- * tmp is an offset, which must be added to adata_orig to
- * get adata_optr. We mask off adata_optr so that regardless
- * of the format of the data we always are on a sample frame
- * boundary.
- */
- data->adata_optr = (char *)data->adata_orig +
- (tmp & ~AM_MISC_MASK);
- ATRACE("am_set_compat_mode() new optr", data->adata_optr);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(pchptr, data);
- }
-
- ATRACE("am_set_compat_mode() done", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* am_set_compat_mode() */
-
-/*
- * am_set_mixer_mode()
- *
- * Description:
- * This routine is used to convert the mixer from COMPAT mode to MIXER
- * mode. Any playing and recording channels should have been stopped
- * before this routine is called.
- *
- * When this routine is called there may be one playing and one recording
- * channel.
- *
- * Just like am_set_compat_mode(), psamples_f has already been added into
- * the played sample count. So we don't need to do anything with it here.
- *
- * NOTE: Only traditional Codecs will use this code.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel changing the mode
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * am_apm_private_t **stpptr Ptr to the mixer's private state data
- * audio_apm_info_t *apm_infop Ptr to the mixer's APM info structure
- * audio_ch_t *pchptr Ptr to the play channel
- * audio_ch_t *rchptr Ptr to the record channel
- *
- * Returns:
- * AUDIO_SUCCESS Mode change completed successfully.
- * AUDIO_FAILURE Mode change failed.
- */
-static int
-am_set_mixer_mode(audio_ch_t *chptr, am_ad_info_t *ad_infop,
- am_apm_private_t *stpptr, audio_ch_t *pchptr, audio_ch_t *rchptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t nchptr;
- am_ch_private_t ch_private;
- audio_info_t *hw_info;
- audio_info_t new_info;
- am_apm_persist_t *persistp;
-
- ATRACE("in am_set_mixer_mode()", statep);
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_set_mixer_mode() audio_sup_get_apm_info() failed",
- statep);
- return (AUDIO_FAILURE);
- }
- persistp = stpptr->am_pstate;
- hw_info = apm_infop->apm_ad_state;
-
- /*
- * see if we need to update the sample rate conv. routines. This should
- * be done before setting the apm_mode to AM_MIXER_MODE. Or, other code
- * path,e.g. am_flush, may find apm_mode == AM_MIXER_MODE and then find
- * the src module has not been update correctly and panic the system.
- * We update the src module before update the hardware so that if it
- * fails, the hardware state is still correct.
- */
- if (pchptr) {
- ATRACE("am_set_mixer_mode(), "
- "calling play src update", pchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_set_mixer_mode calling play src update");
- if (ad_infop->ad_play.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(pchptr),
- &((audio_info_t *)pchptr->ch_info.info)->
- play,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- play,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_play.ad_sr_info,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() "
- "play src_update() failed", 0);
- return (AUDIO_FAILURE);
- }
- }
- if (rchptr) {
- ATRACE("am_set_mixer_mode(), "
- "calling record src update", rchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_set_mixer_mode calling record src update");
- if (ad_infop->ad_record.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(rchptr),
- &((audio_info_t *)rchptr->ch_info.info)->
- record,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- record,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_record.ad_sr_info,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() "
- "record src_update() failed", 0);
- return (AUDIO_FAILURE);
- }
- }
-
- /* copy the original channel structure to the temp, just in case */
- bcopy(chptr, &nchptr, sizeof (nchptr));
-
- /* we always reset the hardware, even if no play/rec channels */
- AUDIO_INIT(&new_info, sizeof (new_info));
- bzero(&ch_private, sizeof (ch_private));
-
- if (pchptr) {
- if (am_ck_sample_rate(&ad_infop->ad_play, AM_MIXER_MODE,
- hw_info->play.sample_rate) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() mixer can't play using "
- "unsupported sample rate",
- hw_info->play.sample_rate);
- return (AUDIO_FAILURE);
- }
- new_info.play.samples =
- ((audio_info_t *)pchptr->ch_info.info)->play.samples;
- ch_private.acp_writing = 1;
- }
- if (rchptr) {
- if (am_ck_sample_rate(&ad_infop->ad_record, AM_MIXER_MODE,
- hw_info->record.sample_rate) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() mixer can't record using "
- "unsupported sample rate",
- hw_info->record.sample_rate);
- return (AUDIO_FAILURE);
- }
- new_info.record.samples =
- ((audio_info_t *)rchptr->ch_info.info)->record.samples;
- ch_private.acp_reading = 1;
- }
-
- if (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY) {
- new_info.play.sample_rate = stpptr->am_save_psr;
- new_info.play.gain = persistp->apm_mpgain;
- new_info.play.balance = persistp->apm_mpbal;
- }
-
- if (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD) {
- new_info.record.sample_rate = stpptr->am_save_rsr;
- new_info.record.gain = persistp->apm_mrgain;
- new_info.record.balance = persistp->apm_mrbal;
- }
-
- nchptr.ch_qptr = chptr->ch_qptr;
- nchptr.ch_statep = chptr->ch_statep;
- nchptr.ch_dir = AUDIO_BOTH;
- nchptr.ch_info.dev_type = AUDIO;
- nchptr.ch_apm_infop = apm_infop;
- nchptr.ch_private = &ch_private;
- nchptr.ch_info.info = &new_info;
- /*
- * It's possible that when the bcopy above happens,
- * the ch_lock is held by someone else. It should be
- * cleared. Or, later when we try to hold it and find
- * it's held, deadlock may happen.
- */
- mutex_init(&nchptr.ch_lock, NULL, MUTEX_DRIVER, NULL);
-
- if (am_audio_set_info(&nchptr, &new_info, &new_info) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() am_audio_set_info() failed",
- &nchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "set_mixer() "
- "couldn't reconfigure hardware");
- mutex_destroy(&nchptr.ch_lock);
- return (AUDIO_FAILURE);
- }
- mutex_destroy(&nchptr.ch_lock);
-
-
- /*
- * We need to look like we've changed modes AFTER we try to set hw.
- * Otherwise am_audio_set_info() won't update the hardware. It'll
- * try to update the virtual channel.
- */
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- hw_info->sw_features_enabled |= AUDIO_SWFEATURE_MIXER;
-
- /* clear the open flags in the hardware */
- hw_info->play.open = 0;
- hw_info->record.open = 0;
-
- /* clear the hardware's waiting flags */
- hw_info->play.waiting = 0;
- hw_info->record.waiting = 0;
-
- /* clear misc flags */
- hw_info->play.eof = 0;
-
- /*
- * Also update the hardware info for the number of channels,
- * precision, and encoding.
- */
- hw_info->play.channels = stpptr->am_hw_pchs;
- hw_info->record.channels = stpptr->am_hw_rchs;
-
- hw_info->play.precision = stpptr->am_hw_pprec;
- hw_info->record.precision = stpptr->am_hw_rprec;
-
- hw_info->play.encoding = stpptr->am_hw_penc;
- hw_info->record.encoding = stpptr->am_hw_renc;
-
- ATRACE("am_set_mixer_mode() successful", statep);
-
- return (AUDIO_SUCCESS);
-
-} /* am_set_mixer_mode() */
-
-/*
- * am_wiocdata_mixerctl_chinfo()
- *
- * Description:
- * We have the audio_channel_t data structure so we know how big the info
- * structure is. We make sure the size of the info structure is correct,
- * that there is a buffer, and that the channel number is reasonable.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_mixerctl_chinfo(queue_t *q, mblk_t *mp, audio_i_state_t *state)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- audio_info_t *info;
- int ch_number;
-
- ATRACE("in am_wiocdata_mixerctl_chinfo()", q);
-
- /* get ready to do the model conversion */
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag,
- (audio_channel_t *)mp->b_cont->b_rptr);
-
- /*
- * Make sure the size is good, fortunately audio_info_t doesn't have
- * any pointers in it, so it's the same size, regardless of _ILP32
- * or _LP64.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_wiocdata_mixerctl_chinfo() bad size",
- STRUCT_FGET(audio_channel, info_size));
- return (EINVAL);
- }
-
- /* make sure the app has a buffer to place the data into */
- if ((info = STRUCT_FGETP(audio_channel, info)) == NULL) {
- ATRACE("am_wiocdata_mixerctl_chinfo() no buffer",
- STRUCT_FGETP(audio_channel, info));
- return (EINVAL);
- }
-
- /* get the channel number and make sure it's good */
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_wiocdata_mixerctl_chinfo() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- return (EINVAL);
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- mutex_exit(&tchptr->ch_lock);
- ATRACE("am_wiocdata_mixerctl_chinfo() bad ch", tchptr);
- return (EINVAL);
- }
- mutex_exit(&tchptr->ch_lock);
-
- /*
- * We have a good audio_channel_t structure so we can do the next
- * step in the process, which is to ask for the audio_info structure.
- * But first we save the audio_channel structure for later use.
- * The STREAMS head will give us a new mp->b_cont message block
- * when it gives us the audio_info structure.
- */
- state->ais_command = AM_COPY_IN_MIXCTL_SET_CHINFO2;
- state->ais_address = (caddr_t)info;
- state->ais_address2 = (caddr_t)mp->b_cont;
-
- /* Set mp->b_cont = NULL so mcopyin() does not free the saved message */
- mp->b_cont = NULL;
-
- /* Setup for copyin */
- ASSERT(state->ais_address != NULL);
- mcopyin(mp, state, sizeof (audio_info_t), (caddr_t)state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wiocdata_mixerctl_chinfo() returning", q);
-
- return (0);
-
-} /* am_wiocdata_mixerctl_chinfo() */
-
-/*
- * am_wiocdata_mixerctl_get_chinfo()
- *
- * Description:
- * The audio_info_t data structure has been copied out, so now we copy
- * out the updated audio_channel_t structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_mixerctl_get_chinfo(queue_t *q, mblk_t *mp, audio_i_state_t *state)
-{
- mblk_t *tmp;
-
- ATRACE("in am_wiocdata_mixerctl_get_chinfo()", q);
-
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO2;
-
- tmp = (mblk_t *)state->ais_address2;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, tmp->b_wptr - tmp->b_rptr, state->ais_address, tmp);
-
- state->ais_address2 = NULL;
-
- qreply(q, mp);
-
- ATRACE("am_wiocdata_mixerctl_get_chinfo() done", q);
-
- return (0);
-
-} /* am_wiocdata_mixerctl_get_chinfo() */
-
-/*
- * am_wiocdata_sr()
- *
- * Description:
- * The next step in getting the sample rates. We've got the
- * am_sample_rates_t structure so we can now get the number of sample
- * rates to ask for, which we do. Thus we copy in the structure a
- * second time, but this time it'll be larger.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * struct copyreq *cqp Pointer to copy request register
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_sr(queue_t *q, mblk_t *mp, struct copyreq *cqp,
- audio_i_state_t *state)
-{
- am_sample_rates_t *new;
- size_t size;
-
- ATRACE("in am_wiocdata_sr()", q);
-
- /*
- * We copy in just the am_sample_rates_t structure to get the
- * number of sample rates the samp_rates array can support.
- * Once we know this we make another call to get the whole
- * thing.
- */
-
- /* get a pointer to the user supplied structure */
- new = (am_sample_rates_t *)mp->b_cont->b_rptr;
-
- /* make sure the number of array elements is sane */
- if (new->num_samp_rates <= 0) {
- ATRACE_32("am_wiocdata_sr() AM_COPY_IN_SAMP_RATES "
- "bad num_samp_rates", new->num_samp_rates);
- return (EINVAL);
- }
-
- ATRACE("am_wiocdata_sr() new", new);
- ATRACE_32("am_wiocdata_sr() num_samp_rates", new->num_samp_rates);
- size = AUDIO_MIXER_SAMP_RATES_STRUCT_SIZE(new->num_samp_rates);
-
- /*
- * Now that we know the number of array elements, we can ask
- * for the right number of bytes.
- *
- * Reuse the cq_private buffer, saving data for M_IOCDATA processing.
- */
- state->ais_command = AM_COPY_IN_SAMP_RATES2;
- ASSERT(cqp->cq_private == (mblk_t *)state);
-
- /* Setup for copyin */
- ASSERT(state->ais_address != NULL);
- mcopyin(mp, state, size, (caddr_t)state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wiocdata_sr() returning success", 0);
-
- return (0);
-
-} /* am_wiocdata_sr() */
-
-/*
- * am_wioctl_copyin()
- *
- * Description:
- * Common routine used to start the copy in process for many ioctl()s.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * audio_i_state_t *state Pointer to ioctl() state structure
- * int cmd IOCTL command
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wioctl_copyin(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- audio_i_state_t *state, int cmd)
-{
- size_t size;
- int new_cmd;
-
- ATRACE("in am_wioctl_copyin()", q);
-
- /* set copyin based on the ioctl() command */
- switch (cmd) {
- case AUDIO_DIAG_LOOPBACK: {
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
-
- /* not all Audio Drivers and their hardware support loopbacks */
- if (!(ad_infop->ad_diag_flags & AM_DIAG_INTERNAL_LOOP)) {
- ATRACE_32("am_wioctl_diag_loopback() no loopbacks",
- ad_infop->ad_diag_flags);
- return (ENOTTY);
- }
-
- new_cmd = AM_COPY_IN_DIAG_LOOPB;
- size = sizeof (int);
-
- break;
- }
-
- case AUDIO_SETINFO:
- new_cmd = AM_COPY_IN_AUDIOINFO;
- size = sizeof (audio_info_t);
-
- break;
- case AUDIO_MIXER_GET_SAMPLE_RATES:
- new_cmd = AM_COPY_IN_SAMP_RATES;
- size = sizeof (am_sample_rates_t);
-
- break;
- case AUDIO_MIXERCTL_SETINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- new_cmd = AM_COPY_IN_MIXCTLINFO;
- /*
- * We only need the dev_info part of am_control_t. Fortunately
- * this is at the front of the structure. So set the size to
- * copy in only the dev_info part. Otherwise we'll blow an
- * assert in am_mixerctl_setinfo_task().
- */
- size = sizeof (audio_info_t);
-
- break;
- case AUDIO_MIXERCTL_GET_CHINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- /* size can be different, depending on _ILP32 and _LP64 */
- new_cmd = AM_COPY_IN_MIXCTL_GET_CHINFO;
- size = SIZEOF_STRUCT(audio_channel,
- ((struct iocblk *)mp->b_rptr)->ioc_flag);
-
- break;
- case AUDIO_MIXERCTL_SET_CHINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- /* size can be different, depending on _ILP32 and _LP64 */
- new_cmd = AM_COPY_IN_MIXCTL_SET_CHINFO;
- size = SIZEOF_STRUCT(audio_channel,
- ((struct iocblk *)mp->b_rptr)->ioc_flag);
-
- break;
- case AUDIO_MIXERCTL_SET_MODE:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- new_cmd = AM_COPY_IN_MIXCTL_MODE;
- size = sizeof (int);
-
- break;
- default:
- return (EIO);
- }
-
- /* set up the message */
- state->ais_command = new_cmd;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyin */
- if (state->ais_address == NULL) {
- return (EINVAL);
- }
- mcopyin(mp, state, size, state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wioctl_copyin() returning", chptr);
-
- return (0);
-
-} /* am_wioctl_copyin() */
-
-/*
- * am_wioctl_drain()
- *
- * Description:
- * First make sure this is an AUDIO channel. Then see if there is
- * any queued up audio. If there is then just return after setting
- * a flag. Otherwise we've got an AUDIO_DRAIN before there's any
- * played audio or after it has all played, thus we ACK.
- *
- * Once all audio has been played am_audio_drained() is called and
- * it generates the ACK.
- *
- * This ioctl() doesn't use the taskq. Thus other channels won't be
- * blocked by this ioctl().
- *
- * Like all ioctl()s, AUDIO_DRAIN may be interrupted by a signal.
- * The STREAMS head will let the ioctl() return to the app. We have
- * no way of knowing this has happened, unless we use cv_wait_sig().
- * This would block am_wput() so we aren't going to use it. However
- * the fact we don't know about the signal is okay. The STREAMS head
- * keeps a sequence number and as long as we save the original mp it
- * can tell if this is an old ioctl() or not. If it is it just ignores
- * the ACK. Further, am_close() will call am_audio_drained() which
- * will send the ACK, which the STREAMS head will ignore if it wishes.
- * Or we'll get another AUDIO_DRAIN and we still have the old mp, and
- * thus we'll know the old AUDIO_DRAIN was interrupted. So we just
- * free the mp and we're still okay.
- *
- * XXX - I don't understand what this means if there's a mux pushed
- * on top of the mixer. If this happens it is possible to have multiple
- * AUDIO_DRAINs at once, but then you can also have multiple audio
- * streams on one channel. So audio isn't going to work very well in
- * that case anyway.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * struct copyreq *cqp Pointer to copy request register
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-am_wioctl_drain(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- struct copyreq *cqp)
-{
- am_ch_private_t *chpptr = (am_ch_private_t *)chptr->ch_private;
- int error = 0;
-
- ATRACE("in am_wioctl_drain() chptr", chptr);
-
- /* must be on a play audio channel */
- mutex_enter(&chptr->ch_lock);
- if (!chpptr->acp_writing || chptr->ch_info.dev_type != AUDIO) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wioctl_drain() AUDIO_DRAIN bad type", chptr);
- error = EINVAL;
- goto done;
- }
-
- /*
- * See if we've got a new AUDIO_DRAIN, which means the last one
- * was interrupted.
- */
- if (chpptr->acp_drain_mp) {
- /* free it, it's lost and the STREAM head knows this */
- freemsg(chpptr->acp_drain_mp);
- }
-
- /* see if we are empty, the easy case */
- if (!(chpptr->acp_flags & AM_CHNL_MSG_ON_QUEUE) &&
- audio_sup_get_audio_data_cnt(chptr) == 0) {
- chpptr->acp_drain_mp = NULL;
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wioctl_drain() no messages", chptr);
- goto done;
- }
-
- /* we need to wait for empty */
- chpptr->acp_flags |= AM_CHNL_DRAIN;
- chpptr->acp_drain_mp = mp;
-
- ATRACE_32("am_wioctl_drain() messages, acp_flags", chpptr->acp_flags);
- ATRACE("am_wioctl_drain() MP", mp);
-
- mutex_exit(&chptr->ch_lock);
-
- return;
-
-done:
- ASSERT(cqp->cq_private == NULL);
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE("am_wioctl_drain() drained", chptr);
-
-} /* am_wioctl_drain() */
-
-/*
- * am_wioctl_getdev()
- *
- * Description:
- * The first half of the AUDIO_GETDEV ioctl(). Ask to copy out
- * the audio driver's device information structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wioctl_getdev(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- audio_i_state_t *state)
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- audio_device_t *devp;
-
- ATRACE("in am_wioctl_getdev()", q);
-
- /* set STREAMS for copy out of the audio_device structure */
- state->ais_command = AM_COPY_OUT_GETDEV;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- return (EINVAL);
- }
- mcopyout(mp, state, sizeof (*ad_infop->ad_dev_info), state->ais_address,
- NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (*ad_infop->ad_dev_info)) ==
- AUDIO_FAILURE) {
- return (ENOMEM);
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(ad_infop->ad_dev_info, devp,
- sizeof (*ad_infop->ad_dev_info));
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("am_wioctl_getdev() returning", chptr);
-
- return (0);
-
-} /* am_wioctl_getdev() */
-
-/*
- * Task queue callbacks.
- */
-
-/*
- * am_diag_loopback_task()
- *
- * Description:
- * Called by the task queue to set the loopback mode in the audio
- * driver.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_diag_loopback_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_diag_lookback() arg", arg);
-
- am_enter_rwlock();
-
- if (*(int *)mp->b_cont->b_rptr) {
- ATRACE_32("am_diag_loopback_task() enable",
- *(int *)mp->b_cont->b_rptr);
-
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_DIAG_MODE, NULL, 1, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- ATRACE("am_diag_loopback_task() "
- "AM_COPY_IN_DIAG_LOOPB enable failed", 0);
- error = EIO;
- }
- } else {
- ATRACE_32("am_diag_loopback_task() disable",
- *(int *)mp->b_cont->b_rptr);
-
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_DIAG_MODE, NULL, 0, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- ATRACE("am_diag_loopback_task() "
- "AM_COPY_IN_DIAG_LOOPB disable failed", 0);
- error = EIO;
- }
- }
-
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_diag_lookback() done", error);
-
-} /* am_diag_loopback_task() */
-
-/*
- * am_get_chinfo_task()
- *
- * Description:
- * Called by the task queue to get the channel's info. If the size of
- * the info structure doesn't match then we return an EINVAL. This is
- * better than trying to copy out to much data and cause a core dump
- * in the application.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_get_chinfo_task(void *arg)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- audio_info_t *info;
- mblk_t *tmp;
- int ch_number;
- int error = 0;
-
- ATRACE("in am_get_chinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_get_chinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get ready to do the model conversion */
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag,
- (audio_channel_t *)mp->b_cont->b_rptr);
-
- /*
- * Make sure the size is good, fortunately audio_info_t doesn't have
- * any pointers in it, so it's the same size, regardless of _ILP32
- * or _LP64.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_get_chinfo_task() bad size",
- STRUCT_FGET(audio_channel, info_size));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure the app has a buffer to place the data into */
- if ((info = STRUCT_FGETP(audio_channel, info)) == NULL) {
- ATRACE("am_get_chinfo_task() no buffer",
- STRUCT_FGETP(audio_channel, info));
- error = EINVAL;
- goto nack;
- }
-
- /* get the channel number and make sure it's good */
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_get_chinfo_task() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- ATRACE("am_get_chinfo_task() bad ch", tchptr);
- error = EINVAL;
- mutex_exit(&tchptr->ch_lock);
- goto nack;
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* okay to update the channel's info */
- STRUCT_FSET(audio_channel, pid, tchptr->ch_info.pid);
- STRUCT_FSET(audio_channel, dev_type, tchptr->ch_info.dev_type);
-
- /*
- * We have consistent data so now we can start the copy out,
- * beginning with the audio_info_t structure. That's because
- * we've got the _IPL32/_LP64 environment. Also, we can't use
- * the macros here because of the special address. So we save
- * the audio_channel_t data structure for later. And then get
- * a new mblk to put the audio_info structure into.
- */
- if ((tmp = allocb(sizeof (audio_info_t), BPRI_HI)) == 0) {
- error = ENOMEM;
- goto nack;
- }
- state->ais_address2 = (caddr_t)mp->b_cont;
-
- /*
- * Set mp->b_cont = NULL so the mcopyout() below does not free the
- * saved message in state->ais_address2 above when it sets
- * mp->b_cont = tmp
- */
- mp->b_cont = NULL;
-
- bcopy(tchptr->ch_info.info, tmp->b_wptr, sizeof (audio_info_t));
- tmp->b_wptr = tmp->b_rptr + sizeof (audio_info_t);
-
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (audio_info_t), (caddr_t)info, tmp);
-
- ASSERT(mp->b_cont == tmp);
-
- /* send the copy in request */
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_get_chinfo_task() return", chptr);
-
- return;
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_get_chinfo_task() returning nack", chptr);
-
-} /* am_get_chinfo_task() */
-
-/*
- * am_get_mode_task()
- *
- * Description:
- * This task gets the current mixer mode while the state is stable.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_get_mode_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_get_mode_task() arg", arg);
-
- am_enter_rwlock();
-
- /* set STREAMS for copy out of the mode */
- state->ais_command = AM_COPY_OUT_MIXCTL_MODE;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- error = EINVAL;
- goto done;
- }
- mcopyout(mp, state, sizeof (int), state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (int)) == AUDIO_FAILURE) {
- error = ENOMEM;
- goto done;
- } else {
- *((int *)mp->b_cont->b_rptr) = stpptr->am_pstate->apm_mode;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (stpptr->am_pstate->apm_mode);
- qreply(q, mp);
- }
-
-done:
- if (error) {
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
- miocnak(q, mp, 0, error);
- }
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_get_mode_task() returning", chptr);
-
-} /* am_get_mode_task() */
-
-/*
- * am_getinfo_task()
- *
- * Description:
- * This is the task that gets serial access to the info data structure
- * and copies out the audio_info data structure.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_getinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_info_t *info = chptr->ch_info.info;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *info_out;
- int error = 0;
-
- ATRACE("in am_getinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* set STREAMS for copy out of the audio_info structure */
- state->ais_command = AM_COPY_OUT_AUDIOINFO;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- error = EINVAL;
- ATRACE("am_getinfo_task() with invalid address", chptr);
- goto done;
- }
- mcopyout(mp, state, sizeof (*info_out), state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (*info_out)) == AUDIO_FAILURE) {
- error = ENOMEM;
- ATRACE("am_getinfo_task() failing to alloc mblk", chptr);
- goto done;
- }
-
- info_out = (audio_info_t *)mp->b_cont->b_rptr;
-
- bcopy(info, info_out, sizeof (*info_out));
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, info_out);
- mutex_exit(&chptr->ch_lock);
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
-done:
- if (error) {
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
- }
- am_release_rwlock();
-
- ATRACE("am_getinfo_task() returning", chptr);
-
-} /* am_getinfo_task() */
-
-/*
- * am_mixerctl_getinfo_task()
- *
- * Description:
- * This task gets serial access to the state to copy out the am_control
- * data structure.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_mixerctl_getinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *info_out;
- am_control_t *ptr;
- size_t size;
- int i;
- int error = 0;
- int max_chs = statep->as_max_chs;
-
- ATRACE("in am_mixerctl_getinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable, we also check the type */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE ||
- chptr->ch_info.dev_type != AUDIOCTL) {
- ATRACE_32("am_mixerctl_getinfo_task() bad mode/type",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- size = AUDIO_MIXER_CTL_STRUCT_SIZE(max_chs);
-
- /* set STREAMS for copy out of the audio_info structure */
- state->ais_command = AM_COPY_OUT_MIXCTLINFO;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- ATRACE("am_mixerctl_getinfo_task() bad address from user",
- NULL);
- error = EINVAL;
- goto nack;
- }
- mcopyout(mp, state, size, state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, size) == AUDIO_FAILURE) {
- ATRACE("am_mixerctl_getinfo_task() can't get memory", 0);
- error = ENOMEM;
- goto nack;
- }
-
- ptr = (am_control_t *)mp->b_cont->b_rptr;
- info_out = &ptr->dev_info;
-
- /*
- * We have to assemble this one by pieces. First we take
- * care of the hardware state, then extended hardware state.
- */
-
- bcopy(apm_infop->apm_ad_state, info_out, sizeof (audio_info_t));
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, info_out);
- mutex_exit(&chptr->ch_lock);
-
- /* now get the channel information */
- mutex_enter(&statep->as_lock); /* freeze ch state */
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
- mutex_enter(&tchptr->ch_lock);
- if (tchptr->ch_info.pid) {
- ptr->ch_open[i] = 1;
- } else {
- ptr->ch_open[i] = 0;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- mutex_exit(&statep->as_lock);
-
- /* send the copy out request */
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_getinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_getinfo_task() returning nack", chptr);
-
-} /* am_mixerctl_getinfo_task() */
-
-/*
- * am_mixerctl_setinfo_task()
- *
- * Description:
- * This task gets serial access to the state to set it based on the
- * am_control data structure. Can only set a few global things. The
- * ch_open argument of the am_control data structure since this is
- * read only.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_mixerctl_setinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t ninfo;
- audio_ch_t ch;
- audio_info_t *tinfo;
- am_control_t *new;
- int error = 0;
-
- ATRACE("in am_mixerctl_setinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_mixerctl_setinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get a pointer to the user supplied structure */
- new = (am_control_t *)mp->b_cont->b_rptr;
- tinfo = &new->dev_info;
-
- /* we can only modify a few things so make sure that's all we touch */
- AUDIO_INIT(&ninfo, sizeof (ninfo));
- ninfo.play.gain = tinfo->play.gain;
- ninfo.play.balance = tinfo->play.balance;
- ninfo.play.port = tinfo->play.port;
- ninfo.play.pause = tinfo->play.pause;
- ninfo.record.gain = tinfo->record.gain;
- ninfo.record.balance = tinfo->record.balance;
- ninfo.record.port = tinfo->record.port;
- ninfo.record.pause = tinfo->record.pause;
- ninfo.monitor_gain = tinfo->monitor_gain;
- ninfo.output_muted = tinfo->output_muted;
-
- /* we always create a pseudo channel that points to the h/w */
- bcopy(chptr, &ch, sizeof (*chptr));
- ch.ch_info.info = hw_info;
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_mixerctl_setinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(&ch, &ninfo, &ninfo) == AUDIO_FAILURE) {
- ATRACE("am_mixerctl_setinfo_task() am_audio_set_info() failed",
- chptr);
- error = EINVAL;
- goto nack;
- }
-
- /* since there wasn't an error we succeeded, so return struct */
- tinfo->play.gain = ninfo.play.gain;
- tinfo->play.balance = ninfo.play.balance;
- tinfo->play.port = ninfo.play.port;
- tinfo->play.pause = ninfo.play.pause;
- tinfo->record.gain = ninfo.record.gain;
- tinfo->record.balance = ninfo.record.balance;
- tinfo->record.port = ninfo.record.port;
- tinfo->record.pause = ninfo.record.pause;
- tinfo->monitor_gain = ninfo.monitor_gain;
- tinfo->output_muted = ninfo.output_muted;
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_MIXCTLINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_setinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_setinfo_task() returning error", chptr);
-
-} /* am_mixerctl_setinfo_task() */
-
-/*
- * am_multiple_open_task()
- *
- * Description:
- * The second part of the AUDIO_MIXER_MULTIPLE_OPEN ioctl(). We check
- * the state here so we can rely on the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_multiple_open_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_multiple_open_task() arg", arg);
-
- am_enter_rwlock();
-
- /*
- * Don't allow this ioctl() if not in MIXER mode. We have to do this
- * check in the task because that's the only way we can rely on the
- * state.
- */
- if (stpptr->am_pstate->apm_mode == AM_COMPAT_MODE) {
- ATRACE_32("am_multiple_open_task() bad mode",
- stpptr->am_pstate->apm_mode);
- error = EINVAL;
- goto done;
- }
-
- /* just set the mode without checking what it is */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_MULTI_OPEN;
- ATRACE_32("am_multiple_open_task() flags", chpptr->acp_flags);
- mutex_exit(&chptr->ch_lock);
-
- /* wake up any channels waiting on multiple open()s */
- mutex_enter(&chptr->ch_statep->as_lock);
- cv_broadcast(&chptr->ch_statep->as_cv);
- mutex_exit(&chptr->ch_statep->as_lock);
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_multiple_open_task() done", error);
-
-} /* am_multiple_open_task() */
-
-/*
- * am_sample_rate_task()
- *
- * Description:
- * Now that we will know how many sample rates to return we can get
- * them. We do this in a task because we need to know the mixer mode.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_sample_rate_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_sample_rates_t *new;
- am_ad_sample_rates_t *src;
- size_t size;
- int error = 0;
- int i;
- int mode = stpptr->am_pstate->apm_mode;
- int num;
-
- ATRACE("in am_sample_rate_task() arg", arg);
-
- am_enter_rwlock();
-
- /* get a pointer to the user supplied structure */
- new = (am_sample_rates_t *)mp->b_cont->b_rptr;
- /* new->flags is random data, so clear */
- new->flags = 0;
-
- /* make sure the number of array elements is sane */
- if (new->num_samp_rates <= 0) {
- ATRACE_32("am_sample_rate_task() AM_COPY_IN_SAMP_RATES2 "
- "bad num_samp_rates", new->num_samp_rates);
- error = EINVAL;
- goto nack;
- }
-
- size = AUDIO_MIXER_SAMP_RATES_STRUCT_SIZE(new->num_samp_rates);
-
- ATRACE_32("am_sample_rate_task() AM_COPY_IN_SAMP_RATES2 type",
- new->type);
- if (new->type == AUDIO_PLAY &&
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY)) {
- if (mode == AM_MIXER_MODE) {
- src = &ad_infop->ad_play.ad_mixer_srs;
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- src = &ad_infop->ad_play.ad_compat_srs;
- }
- } else if (new->type == AUDIO_RECORD &&
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD)) {
- if (mode == AM_MIXER_MODE) {
- src = &ad_infop->ad_record.ad_mixer_srs;
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- src = &ad_infop->ad_record.ad_compat_srs;
- }
- } else {
- error = EINVAL;
- goto nack;
- }
-
- /* figure out how many sample rates we have */
- for (num = 0; src->ad_srs[num] != 0; num++);
-
- /* we don't copy more sample rates than we have */
- if (num < new->num_samp_rates) {
- new->num_samp_rates = num;
- }
-
- /* we reuse the buffer we got from user space */
- for (i = 0; i < new->num_samp_rates; i++) {
- /* get sample rate for array elements */
- if (src->ad_srs[i] == 0) {
- /* at the end of sample rates */
- break;
- }
- new->samp_rates[i] = src->ad_srs[i];
- }
-
- /* let the app know there are more */
- if (num > new->num_samp_rates) {
- new->num_samp_rates = num;
- }
-
- /* type remains the same, but update others */
- if (src->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) {
- new->flags = MIXER_SR_LIMITS;
- }
-
- /* ready to send the filled in structure back */
- state->ais_command = AM_COPY_OUT_SAMP_RATES;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, size, state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + size));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE_32("am_sample_rate_task() done", error);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_sample_rate_task() returning error", error);
-
-} /* am_sample_rate_task() */
-
-/*
- * am_set_chinfo_task()
- *
- * Description:
- * Called by the task queue to set the channel's state. We've already
- * verified the size and channel are okay, as well as there is a buffer.
- * We have the audio_info structure, in mp->b_cont, so new we can set
- * the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_set_chinfo_task(void *arg)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *tinfo = (audio_info_t *)mp->b_cont->b_rptr;
- audio_channel_t *ch;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- int ch_number;
- int error = 0;
-
- ATRACE("in am_set_chinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_set_chinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get ready to do the model conversion */
- ch = (audio_channel_t *)((mblk_t *)state->ais_address2)->b_rptr;
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag, ch);
-
- /*
- * We check things again because since the last check it could have
- * changed on us.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_set_chinfo_task() bad size",
- STRUCT_FGET(audio_channel, info_size));
- error = EINVAL;
- goto nack;
- }
- if (STRUCT_FGETP(audio_channel, info) == NULL) {
- ATRACE("am_set_chinfo_task() no buffer",
- STRUCT_FGETP(audio_channel, info));
- error = EINVAL;
- goto nack;
- }
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_set_chinfo_task() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- mutex_exit(&tchptr->ch_lock);
- ATRACE("am_set_chinfo_task() bad ch", tchptr);
- error = EINVAL;
- goto nack;
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* because the channels are stable we update the audio_channel struct */
- STRUCT_FSET(audio_channel, pid, tchptr->ch_info.pid);
- STRUCT_FSET(audio_channel, dev_type, tchptr->ch_info.dev_type);
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_set_chinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(tchptr, tinfo, tinfo) == AUDIO_FAILURE) {
- error = EINVAL;
- goto nack;
- }
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, tinfo);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_set_chinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_set_chinfo_task() returning error", chptr);
-
-} /* am_set_chinfo_task() */
-
-/*
- * am_set_mode_task()
- *
- * Description:
- * Switch modes. We have to shut down play and record first, then change
- * modes, and finally restart. Since we are a low priority thread we
- * can sleep!
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_set_mode_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_ch_t *pchptr = NULL;
- audio_ch_t *rchptr = NULL;
- audio_ch_t *tchptr;
- am_ch_private_t *tchpptr;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t *new_pinfo = NULL;
- audio_info_t *new_rinfo = NULL;
- audio_info_t old_hw_info;
- audio_info_t *tinfo;
- int doread;
- int dowrite;
- int error = 0;
- int i;
- int max_chs = statep->as_max_chs;
- int mode = stpptr->am_pstate->apm_mode;
- int new_mode;
- int ppid = 0;
- int rpid = 0;
-#ifdef DEBUG
- int pcount = 0;
- int rcount = 0;
-#endif
-
- ATRACE("in am_set_mode_task() arg", arg);
-
- am_enter_rwlock();
-
- /* get the new_mode and make sure it's good */
- new_mode = *((int *)mp->b_cont->b_rptr);
- ATRACE_32("am_set_mode_task() new mode", new_mode);
- if (new_mode != AM_MIXER_MODE && new_mode != AM_COMPAT_MODE) {
- ATRACE_32("am_set_mode_task() bad mode", new_mode);
- error = EINVAL;
- goto done;
- }
-
- /* make sure we aren't going into the same mode */
- if (mode == new_mode) {
- ATRACE_32("am_set_mode_task() same mode", new_mode);
- goto done;
- }
-
- /* figure out the direction */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
-
- /* we allocate this memory while it's easy to back out */
- if (new_mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- new_pinfo = kmem_alloc(sizeof (*new_pinfo), KM_SLEEP);
- new_rinfo = kmem_alloc(sizeof (*new_rinfo), KM_SLEEP);
- }
-
- /* get the AUDIO apm_info pointer, we've got one for AUDIOCTL */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- if (new_pinfo) {
- kmem_free(new_pinfo, sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo, sizeof (*new_rinfo));
- }
- error = EIO;
- goto done;
- }
-
- /*
- * Make sure we can go to COMPAT mode while we're locked. By
- * definition if we are going to MIXER mode we can't have more
- * than one in and one out channel allocated.
- */
- mutex_enter(&statep->as_lock);
- if (new_mode == AM_COMPAT_MODE && (stpptr->am_in_chs > 1 ||
- stpptr->am_out_chs > 1)) {
- ATRACE("am_set_mode_task() AM_COPY_IN_MIXCTL_MODE busy", chptr);
- ASSERT(new_pinfo == NULL);
- ASSERT(new_rinfo == NULL);
-
- error = EBUSY;
- mutex_exit(&statep->as_lock);
- goto done;
- } else {
- ASSERT(stpptr->am_in_chs <= 1);
- ASSERT(stpptr->am_out_chs <= 1);
- }
- mutex_exit(&statep->as_lock);
-
- /* once playing/recording has stopped we can clear this flag */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags |= AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* how we do the switch is different based on the device */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- /* find the reading and writing channels */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- mutex_enter(&tchptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* is this channel playing?, recording? */
- tchpptr = tchptr->ch_private;
- ATRACE("am_set_mode_task() found ch flags",
- chpptr->acp_flags);
- if (tchpptr->acp_writing) {
- ATRACE_32("am_set_mode_task() MS found play ch",
- tchptr->ch_info.ch_number);
- ASSERT(pchptr == NULL);
- ASSERT(dowrite);
- pchptr = tchptr;
-#ifdef DEBUG
- pcount++;
-#endif
- }
- if (tchpptr->acp_reading) {
- ATRACE_32(
- "am_set_mode_task() MS found record ch",
- tchptr->ch_info.ch_number);
- ASSERT(rchptr == 0);
- ASSERT(doread);
- rchptr = tchptr;
-#ifdef DEBUG
- rcount++;
-#endif
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* are we done finding active channels? */
- if ((pchptr || !dowrite) && (rchptr || !doread)) {
- break;
- }
- }
- ASSERT(pcount <= 1);
- ASSERT(rcount <= 1);
-
- /* pause playing & recording, so the ISR isn't called */
- if (dowrite) {
- ATRACE("am_set_mode_task() pause play", chptr);
- tinfo = pchptr->ch_info.info;
- am_ad_pause_play(statep, stpptr, ad_infop,
- pchptr->ch_info.ch_number);
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- tinfo->play.pause = 1;
- }
- if (doread) {
- ATRACE("am_set_mode_task() stop record", chptr);
- tinfo = rchptr->ch_info.info;
- am_ad_stop_record(statep, stpptr, ad_infop,
- rchptr->ch_info.ch_number);
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- tinfo->record.pause = 0;
- }
-
- /*
- * Multi-stream Codecs already use the virtual channel
- * configuration to set the hardware, so this is a trivial
- * change to make. Everything is halted so we don't need
- * to lock this.
- */
- if (new_mode == AM_COMPAT_MODE) {
- stpptr->am_pstate->apm_mode = AM_COMPAT_MODE;
- } else {
- ASSERT(new_mode == AM_MIXER_MODE);
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- }
-
- ATRACE("am_set_mode_task() AM_MS_CODEC switch done", ad_infop);
-
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- /* wait for playing to end */
- mutex_enter(&stpptr->am_mode_lock);
-
- while (dowrite && hw_info->play.active) {
- ATRACE_32("am_set_mode_task() wait to stop playing",
- hw_info->play.active);
- if (cv_wait_sig(&stpptr->am_mode_cv,
- &stpptr->am_mode_lock) <= 0) {
-
- ATRACE("am_set_mode_task() signal interrupt",
- hw_info->play.active);
-
- mutex_exit(&stpptr->am_mode_lock);
-
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- if (new_mode == AM_MIXER_MODE) {
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
- }
-
- error = EINTR;
- goto done;
- }
- ATRACE(
- "am_set_mode_task() signal returned normally", 0);
- }
- mutex_exit(&stpptr->am_mode_lock);
-
- /*
- * Now we shutdown the record channel, if active.
- * We have to lock to make this call.
- */
- if (doread && hw_info->record.active) {
- am_ad_stop_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
- hw_info->record.active = 0;
- }
-
- /* wait as long as possible to save the old state for later */
- bcopy(hw_info, &old_hw_info, sizeof (*hw_info));
-
- /* find the play and record channels */
- ASSERT(pcount == 0);
- ASSERT(rcount == 0);
- ASSERT(pchptr == 0);
- ASSERT(rchptr == 0);
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* is this channel playing?, recording? */
- tchpptr = tchptr->ch_private;
- ATRACE("am_set_mode_task() found ch flags",
- tchpptr->acp_flags);
- if (dowrite && tchpptr->acp_writing) {
- ATRACE_32("am_set_mode_task() T found play ch",
- tchptr->ch_info.ch_number);
- /*
- * Disable the queue so that am_wsvc() won't
- * process any more data messages.
- */
- noenable(tchptr->ch_qptr);
-
- pchptr = tchptr;
-#ifdef DEBUG
- pcount++;
-#endif
- }
- if (doread && tchpptr->acp_reading) {
- ATRACE_32(
- "am_set_mode_task() T found record ch",
- tchptr->ch_info.ch_number);
- rchptr = tchptr;
-#ifdef DEBUG
- rcount++;
-#endif
- }
-
- mutex_exit(&tchptr->ch_lock);
-
- /* are we done finding active channels? */
- if ((pchptr || !dowrite) && (rchptr || !doread)) {
- break;
- }
- }
- ASSERT(pcount <= 1);
- ASSERT(rcount <= 1);
-
- /*
- * We stop playing because we have to force it to restart from
- * scratch, which means flushing the DMA engine. Otherwise
- * there's old data with the wrong format. This a problem only
- * when we are paused.
- */
- if (pchptr &&
- ((audio_info_t *)pchptr->ch_info.info)->play.pause) {
- am_ad_stop_play(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD);
- }
-
- if (new_mode == AM_MIXER_MODE) {
- if (am_set_mixer_mode(chptr, ad_infop, stpptr,
- pchptr, rchptr) == AUDIO_FAILURE) {
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
-
- error = EIO;
- goto done;
- }
- } else {
- if (am_set_compat_mode(chptr, ad_infop,
- pchptr, rchptr) == AUDIO_FAILURE) {
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- ASSERT(new_pinfo == NULL);
- ASSERT(new_rinfo == NULL);
-
- error = EIO;
- goto done;
- }
- }
- }
- /* save the mode in persistent memory */
- stpptr->am_pstate->apm_mode = new_mode;
-
- /*
- * CAUTION: From here on out we cannot fail. We've changed modes
- * and to fail would require setting it back. It is better
- * to have a gap in audio then to go back at this point.
- */
-
- /* we're in a new mode now, so fix the play/rec info pointers */
- hw_info = &stpptr->am_hw_info;
- if (new_mode == AM_MIXER_MODE) {
- int tpid;
- /* rebuild info structures and get pids */
- if (pchptr && pchptr == rchptr) {
- /* this is play/record channel */
- mutex_enter(&pchptr->ch_lock);
- ppid = pchptr->ch_info.pid;
- rpid = ppid;
-
- tinfo = new_pinfo;
- pchptr->ch_info.info = tinfo;
- mutex_exit(&pchptr->ch_lock);
-
- if (new_rinfo) {
- kmem_free(new_rinfo, sizeof (*new_rinfo));
- }
- new_rinfo = NULL;
-
- /* copy in the old play state */
- bcopy(&old_hw_info.play, &tinfo->play,
- (2 * sizeof (old_hw_info.play)));
-
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- } else {
- /* play or record channels */
- ASSERT(pchptr != rchptr ||
- (pchptr == 0 && rchptr == 0));
- if (pchptr) {
- mutex_enter(&pchptr->ch_lock);
- ppid = pchptr->ch_info.pid;
-
- tinfo = new_pinfo;
- AUDIO_INIT(tinfo, sizeof (*tinfo));
- pchptr->ch_info.info = tinfo;
-
- /* copy in the old play state */
- bcopy(&old_hw_info.play, &tinfo->play,
- sizeof (tinfo->play));
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- mutex_exit(&pchptr->ch_lock);
- } else {
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- new_pinfo = NULL;
- }
- if (rchptr) {
- mutex_enter(&rchptr->ch_lock);
- rpid = rchptr->ch_info.pid;
-
- tinfo = new_rinfo;
- AUDIO_INIT(tinfo, sizeof (*tinfo));
- rchptr->ch_info.info = tinfo;
-
- /* copy in the old record state */
- bcopy(&old_hw_info.record, &tinfo->record,
- sizeof (old_hw_info.record));
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- mutex_exit(&rchptr->ch_lock);
- } else {
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
- new_rinfo = NULL;
- }
- }
-
- /* start over with the reference count */
- hw_info->ref_cnt = 1;
-
- /* find AUDIOCTL channels to assoc. with AUDIO chs */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip if not AUDIOCTL or allocated chs */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ASSERT(hw_info == tchptr->ch_info.info);
-
- tpid = tchptr->ch_info.pid;
-
- if (ppid && tpid == ppid) {
- tchptr->ch_info.info = new_pinfo;
- new_pinfo->ref_cnt++;
- } else if (rpid && tpid == rpid) {
- tchptr->ch_info.info = new_rinfo;
- new_rinfo->ref_cnt++;
- } else {
- tchptr->ch_info.info = hw_info;
- hw_info->ref_cnt++;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- /* now we need to re-initialize the src structures */
- if (pchptr) {
- ATRACE("am_set_mode_task() calling am_fix_play_pause",
- pchptr->ch_private);
-
- am_fix_play_pause(pchptr);
- }
- } else {
- /* start over with the reference count */
- hw_info->ref_cnt = 1;
-
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /*
- * Skip if ! AUDIO, AUDIOCTL or allocated channels.
- *
- * It is possible that new audio will arrive in
- * am_wsvc(), thus we need to make sure we have this
- * lock and hold it if we have to manipulate the
- * channel's info structure.
- */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL) ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* see if we need to free the info structure */
- tinfo = tchptr->ch_info.info;
- if (tinfo != hw_info) {
- /* not set to hw */
- if (tinfo->ref_cnt == 1) {
- /* not set to hw, and only ref so clr */
- kmem_free(tinfo, sizeof (*tinfo));
- } else {
- /* someone else has a link to it */
- tinfo->ref_cnt--;
- }
- }
- /* now set to hardware */
- tchptr->ch_info.info = hw_info;
- hw_info->ref_cnt++;
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
- /* we don't need this flag anymore, re-enabling ioctls */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we're in the new mode, so restart I/O */
- am_restart(statep, hw_info);
-
- mutex_enter(&statep->as_lock);
- /* if we have blocked processes they should unblock */
- if (new_mode == AM_MIXER_MODE) {
- cv_broadcast(&statep->as_cv);
- }
- mutex_exit(&statep->as_lock);
-
- ATRACE_32("am_set_mode_task() done, new mode", new_mode);
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- am_send_signal(statep, stpptr);
-
- ATRACE_32("am_set_mode_task() returning ack", error);
-
-} /* am_set_mode_task() */
-
-/*
- * am_setinfo_task()
- *
- * Description:
- * The third part of the AUDIO_SETINFO ioctl(). This is the task that
- * gets serial access to the info data structure and hardware.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_setinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *tinfo = (audio_info_t *)mp->b_cont->b_rptr;
- int error = 0;
-
- ATRACE("in am_setinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- if (cqp->cq_cmd != AUDIO_SETINFO) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO bad command", cqp->cq_cmd);
- error = EINVAL;
- goto nack;
- }
-
- /*
- * Don't allow this ioctl() when on an audioctl channel when multiple
- * audio channel open()s are allowed. We have to do this in the task
- * because that's the only way we can rely on the state.
- */
- mutex_enter(&chptr->ch_lock);
- if (chptr->ch_info.dev_type == AUDIOCTL &&
- (chpptr->acp_flags & AM_CHNL_MULTI_OPEN)) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO bad type",
- chptr->ch_info.dev_type);
- mutex_exit(&chptr->ch_lock);
- error = EINVAL;
- goto nack;
- }
- mutex_exit(&chptr->ch_lock);
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_setinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(chptr, tinfo, tinfo) == AUDIO_FAILURE) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO setinfo failed command",
- cqp->cq_cmd);
- error = EINVAL;
- goto nack;
- }
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, tinfo);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_AUDIOINFO2;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_setinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_setinfo_task() returning nack", error);
-
-} /* am_setinfo_task() */
-
-/*
- * am_single_open_task()
- *
- * Description:
- * The second part of the AUDIO_MIXER_SINGLE_OPEN ioctl(). We check
- * the state here so we can rely on the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_single_open_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- am_ch_private_t *tchpptr;
- pid_t tpid;
- int error = 0;
- int i;
- int max_chs = statep->as_max_chs;
- int num_rd = 0;
- int num_wr = 0;
-
- ATRACE("in am_single_open_task() arg", arg);
-
- am_enter_rwlock();
-
- /*
- * Don't allow this ioctl() if not in MIXER mode. We have to do this
- * check in the task because that's the only way we can rely on the
- * state.
- */
- if (stpptr->am_pstate->apm_mode == AM_COMPAT_MODE) {
- ATRACE_32("am_single_open_task() bad mode",
- stpptr->am_pstate->apm_mode);
- error = EINVAL;
- goto done;
- }
-
- /* see if there are multiple open()s already */
- tpid = chptr->ch_info.pid;
-
- /* we need to freeze channel allocation */
- mutex_enter(&statep->as_lock);
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
- /* ignore different processes */
- mutex_enter(&tchptr->ch_lock);
- if (tchptr->ch_info.pid != tpid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- tchpptr = tchptr->ch_private;
- if (tchpptr->acp_reading) {
- num_rd++;
- }
- if (tchpptr->acp_writing) {
- num_wr++;
- }
- mutex_exit(&tchptr->ch_lock);
- }
- mutex_exit(&statep->as_lock);
-
- /* we change back only if at most 1 read or write ch. open */
- if (num_rd > 1 || num_wr > 1) {
- /* too many channels open, so we have to fail */
- error = EIO;
- } else {
- /* if we get here we know there is only 1 ch, ours */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags &= ~AM_CHNL_MULTI_OPEN;
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_single_open_task() flags", chpptr->acp_flags);
- }
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_single_open_task() done", error);
-
-} /* am_single_open_task() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_main.c b/usr/src/uts/common/io/audio/sada/mixer/am_main.c
deleted file mode 100644
index 856d21bef0..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_main.c
+++ /dev/null
@@ -1,4273 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Mixer Audio Personality Module (mixer)
- *
- * This module is used by Audio Drivers that wish to have the audio(7I)
- * and mixer(7I) semantics for /dev/audio and /dev/audioctl. In general,
- * the mixer(7I) semantics are a superset of the audio(7I) semantics. Either
- * semantics may be enforced, depending on the mode of the mixer, AM_MIXER_MODE
- * or AM_COMPAT_MODE, respectively. The initial mode is set by the Audio
- * Driver and may be changed on the fly, even while playing or recording
- * audio. When mixing is enabled multiple play and record streams are allowed,
- * and new ioctls are also available. Some legacy applications may not behave
- * well in this mode, thus the availability of the compatibility mode.
- *
- * In addition to providing two sets of semantics, this module also supports
- * two types of audio Codecs, those that have a single play and record stream
- * (traditional Codecs) and those that allow multiple play and record streams
- * (multi-stream Codecs). Because multi-streaming Codecs must do sample rate
- * conversion in hardware in order to mix, the audio stream is not sample rate
- * converted. However, for traditional Codecs the audio streams must be sample
- * rate converted.
- *
- * The mixer supports a number of data formats on all hardware devices. To do
- * this all incoming audio is converted to a canonical format, which is 16-bit
- * linear PCM. This audio is held in 32-bit integers, which allows it to be
- * mixed with other streams without losing data due to overflowing as would
- * happen if it was stored as a 16-bit short. It is also converted to mono or
- * stereo to match the hardware. When audio is played it is converted to the
- * format the hardware supports.
- *
- * Once the hardware format is set it is never changed again, except for the
- * sample rate.
- *
- * The following formats are supported:
- * 16-bit linear PCM, mono and stereo
- * 8-bit linear PCM, mono and stereo
- * 8-bit u-law, mono and stereo
- * 8-bit a-law, mono and stereo
- *
- * In order to present a uniform view of audio there are three different
- * views of the hardware.
- * 1. The true configuration of the audio device. This view is not
- * visible by applications. However it is used by the mixer to properly
- * format audio for the device.
- * 2. The COMPAT mode view. The is the view AUDIOCTL channels get when
- * there aren't any AUDIO channels open in the application. This is
- * called the master view. The reason this is not the true hardware view
- * is because some hardware cannot support all formats. For example,
- * many devices do not support u-law or a-law. The mixer can do this
- * translation. However it would be confusing to show apps that the
- * device was really set to linear PCM.
- * 2. The MIXER mode view. This is the view AUDIO channels and AUDIOCTL
- * channels in apps that have an AUDIO channel open see. It is mostly
- * virtual. It always reflects how the channel was programmed. This
- * becomes the COMPAT view when put into compatibility mode.
- *
- * Most ioctl()s are executed from a task queue. This gives them their own
- * thread and thus they can block without violating the STREAMS blocking rules.
- * The task queue is limited to just one thread. Thus these ioctl()s are
- * serialized and thus access to the hardware state structures and hardware
- * are protected.
- *
- * NOTE: statep->as_max_chs is set when the audiosup module loads, so we
- * don't need to protect it when we access it.
- *
- * NOTE: All linear PCM is assumed to be signed. Therefore if the device
- * only supports unsigned linear PCM we need to translate either
- * before we send it to the device or after we take it from the
- * device. This way we save each Audio Driver from having to do
- * this.
- *
- * NOTE: This module depends on the misc/audiosup module being loaded 1st.
- *
- * The audio mixer source code is broken up into three components:
- * am_main.c: module load and STREAMS entry points
- * am_ad.c: Audio Driver entry points
- * am_ioctl.c: ioctl() code
- *
- * These routines are called by the audio support module:
- * am_open_audio()
- * am_open_audioctl()
- * am_close_audio()
- * am_close_audioctl()
- * am_restore_state()
- * am_save_state()
- * am_rput() - private
- * am_rsvc() - private
- * am_wput() - private
- * am_wsvc() - private
- *
- * These routines are provided for use by the other mixer source code files:
- * am_apply_gain_balance()
- * am_convert_int_mono_stereo()
- * am_convert_to_int()
- * am_send_signal()
- * am_update_conv_buffer()
- * am_update_src_buffer()
- */
-
-#include <sys/modctl.h>
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Private primary routines provided by this file. These are provided to the
- * audio support module via am_open_audio() and am_open_audioctl().
- */
-static int am_rput(queue_t *, mblk_t *);
-static int am_rsvc(queue_t *);
-static int am_wput(queue_t *, mblk_t *);
-static int am_wsvc(queue_t *);
-
-/*
- * Local routine prototypes used only by this file.
- */
-static void am_flush(queue_t *, mblk_t *);
-static int am_p_process(audio_ch_t *, void *, size_t, int **, size_t *, int **,
- size_t *);
-static void am_set_waiting(audio_state_t *, pid_t, int, boolean_t, boolean_t);
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc mixer_modlmisc = {
- &mod_miscops, /* drv_modops */
- MIXER_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage mixer_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&mixer_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Loadable Module Configuration Entry Points
- *
- *
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in mixer _init()", 0);
-
- /* standard linkage call */
- if ((error = mod_install(&mixer_modlinkage)) != 0) {
- ATRACE_32("mixer _init() error 1", error);
- return (error);
- }
-
- ATRACE("mixer _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in mixer _fini()", 0);
-
- if ((error = mod_remove(&mixer_modlinkage)) != 0) {
- ATRACE_32("mixer _fini() mod_remove failed", error);
- return (error);
- }
-
- ATRACE_32("mixer _fini() successful", error);
-
- return (error);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&mixer_modlinkage, modinfop);
-
- ATRACE_32("mixer _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * The public main routines for this file.
- */
-
-/*
- * am_open_audio()
- *
- * Description:
- * AUDIO channel specific open() routine. There are lots of rules here,
- * depending on audio vs. audioctl and backward compatibility vs. mixer
- * mode. Thus mode switching must be frozen, which we do by freezing the
- * taskq.
- *
- * NOTE: In user context so it is okay for memory allocation to sleep.
- *
- * NOTE: audio(7I) redefines the O_NONBLOCK/O_NDELAY open() flags to also
- * mean don't block waiting for a play/record channel to exit.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int oflag Open flags
- * int sflag STREAMS flag
- * cred_t *credp Ptr to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully opened the device
- * errno Error number for failed open()
- */
-/*ARGSUSED*/
-int
-am_open_audio(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- am_ch_private_t *chpptr = NULL;
- audio_ch_t *chptr;
- audio_ch_t *tchptr;
- audio_info_t *default_info;
- audio_info_t *hw_info;
- audio_info_t *iptr;
- pid_t pid;
- boolean_t wantread = B_FALSE;
- boolean_t wantwrite = B_FALSE;
- ulong_t minor;
- int ch_flags = 0;
- int error;
- int i;
- int max_chs;
- int multi_open = 0;
- int mode;
- int rc;
-
- ATRACE("in am_open_audio()", devp);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "am_open_audio() audio_sup_devt_to_state() failed", 0);
- return (EIO);
- }
-
- /* this driver does only a conventional open(), i.e., no clone opens */
- if (sflag) {
- ATRACE("am_open_audio() clone open() failure", sflag);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "only conventional open()s are supported");
- return (EIO);
- }
-
- /*
- * Determine if opening to FREAD and/or FWRITE. We also make sure
- * that at least one of FREAD or FWRITE is set.
- */
- if (oflag & FREAD) {
- wantread = B_TRUE;
- ch_flags |= AUDIO_RECORD;
- ATRACE_32("am_open_audio() allocate channel with read limits",
- ch_flags);
- } else {
- wantread = B_FALSE;
- }
- if (oflag & FWRITE) {
- wantwrite = B_TRUE;
- ch_flags |= AUDIO_PLAY;
- ATRACE_32("am_open_audio() allocate channel with write limits",
- ch_flags);
- } else {
- wantwrite = B_FALSE;
- }
- if (wantread == B_FALSE && wantwrite == B_FALSE) {
- ATRACE_32("am_open_audio(): must be RD, WR or RDWR", oflag);
- return (EINVAL);
- }
-
- /* figure out if allocates should sleep or not */
- ch_flags |= (oflag & (O_NONBLOCK|O_NDELAY)) ?
- AUDIO_NO_SLEEP : AUDIO_SLEEP;
-
- /* get the PID for the process opening the channel */
- pid = ddi_get_pid();
-
- /* get pointers to various data structures */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_open_audio() audio_sup_get_apm_info() failed", 0);
- return (EIO);
- }
-
- mutex_enter(&apm_infop->apm_lock);
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- ad_infop = apm_infop->apm_ad_infop;
- default_info = ad_infop->ad_defaults;
- max_chs = statep->as_max_chs;
-
- /* see if we've been offlined */
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline #1", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- return (EIO);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * The hardware may support only play or record and not the other.
- * If this is the case and the application asked for the direction
- * that isn't supported there's no way it can ever succeed. So we
- * fail right away.
- */
- if ((wantwrite &&
- !(default_info->hw_features & AUDIO_HWFEATURE_PLAY)) ||
- (wantread &&
- !(default_info->hw_features & AUDIO_HWFEATURE_RECORD))) {
- ATRACE("am_open_audio() trying to do illegal direction",
- default_info);
- return (EINVAL);
- }
-
- /*
- * The hardware may be limited to simplex operation, i.e., it may
- * only play or record at any one time. We make sure we haven't
- * asked for something the hardware can't do before we continue.
- */
- if ((default_info->hw_features & AUDIO_HWFEATURE_DUPLEX) == 0) {
- ATRACE_32("am_open_audio() simplex", default_info->hw_features);
- /* make sure we didn't open read/write */
- if (wantread && wantwrite) {
- /* we can never, ever succeed, so fail now */
- ATRACE("am_open_audio() simplex failed, RD_WR", stpptr);
- return (EBUSY);
- }
-
- /* we have to freeze the channels while we look at them */
- mutex_enter(&statep->as_lock);
-
- /* make sure we are asking for something we can have */
- while ((stpptr->am_in_chs && wantwrite) ||
- (stpptr->am_out_chs && wantread)) {
-
- ATRACE("am_open_audio() simplex blocked", stpptr);
-
- /* is it okay to block and wait for the hw? */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- return (EBUSY);
- }
-
- /*
- * Mark all AUDIO ch waiting flags. We may be
- * re-marking some, but there may be new chs since
- * the last loop through the channels. We also
- * mark both directions so that one direction knows
- * that the other is waiting.
- */
- am_set_waiting(statep, AM_NO_PID, AM_SET_WAITING,
- AM_SET_PLAY, AM_SET_RECORD);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /* wait for a channel to be freed */
- ATRACE("am_open_audio() simplex blocked", stpptr);
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
-
- ATRACE("am_open_audio() simplex signal wakeup",
- statep);
- /*
- * This channel may have had a signal, but
- * that doesn't mean any of the other channels
- * may proceed. So make sure every channel
- * gets another go. We clear the waiting flags
- * and then any others loop back and reset if
- * needed. That's why we do the cv_broadcast().
- */
- am_set_waiting(statep, AM_NO_PID,
- AM_CLEAR_WAITING, AM_SET_PLAY,
- AM_SET_RECORD);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- return (EINTR);
- }
- /*
- * Normal wakeup, clear the waiting flags. If the
- * channels need to wait they'll set the flags. That's
- * why we wake all the channels up, so they'll go
- * through their loop.
- */
- am_set_waiting(statep, AM_NO_PID, AM_CLEAR_WAITING,
- AM_SET_PLAY, AM_SET_RECORD);
- cv_broadcast(&statep->as_cv);
-
- ATRACE("am_open_audio() simplex normal wakeup", statep);
- }
-
- mutex_exit(&statep->as_lock);
- }
-
- ASSERT(!mutex_owned(&statep->as_lock));
-
- /*
- * Before we go any further we allocate all the memory we'll need.
- * We do it now so that we can sleep while not holding any locks
- * or freezing the taskq, which would be bad if we have to wait
- * a long time.
- */
- if ((chptr = audio_sup_alloc_ch(statep, &error, AUDIO, ch_flags)) ==
- NULL) {
- ATRACE_32("am_open_audio() alloc returning", error);
- return (error);
- }
- ASSERT(chptr->ch_info.pid == 0);
-
- /*
- * Before we get the rest of the memory we need we make sure that we
- * can allocate a channel in the audio driver, if needed. This may
- * block for a while, which is why we do it now.
- */
- if (am_ad_setup(statep, stpptr, ad_infop, chptr->ch_info.ch_number,
- ch_flags) == AUDIO_FAILURE) {
- /*
- * This should always succeed because we have the
- * configuration information. So if we don't there's
- * something wrong and we fail.
- */
- ATRACE("am_open_audio() ad_setup() failed", 0);
- (void) audio_sup_free_ch(chptr);
- return (EIO);
- }
- ATRACE("am_open_audio() ad_setup() succeeded", 0);
-
- /*
- * CAUTION: From here on we have to call ad_teardown() to
- * free the stream resources in the Audio Driver if
- * there is an error.
- *
- * Now allocate the rest of memory.
- */
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chpptr));
- chpptr = kmem_zalloc(sizeof (*chpptr), KM_SLEEP);
- chpptr->acp_psb_size = ad_infop->ad_play.ad_bsize;
- chpptr->acp_play_samp_buf = kmem_zalloc(chpptr->acp_psb_size, KM_SLEEP);
-
- /* get an audio structure to use */
- iptr = kmem_alloc(sizeof (*iptr), KM_SLEEP);
-
- /*
- * CAUTION: From here on we must free the channel and memory if we
- * need to return on an error.
- *
- * Getting to here means there aren't any conflicts with the hardware,
- * so now the semantics of MIXER and COMPAT modes come to play. Because
- * these semantics depend on the mixer mode we have to block it from
- * changing. We do this by taking control of the taskq. Once we have
- * the taskq we know there's no way for the mode to change.
- */
- ATRACE("am_open_audio() entering again:", chptr);
-
-again: /* we loop back to here when cv_wait_sig returns due to a wakeup */
- ATRACE("am_open_audio() again: loop", chptr);
-
- ASSERT(!MUTEX_HELD(&statep->as_lock));
-
- /* check again to see if we've been offlined */
- mutex_enter(&apm_infop->apm_lock);
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline #2", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- rc = EIO;
- goto error;
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * CAUTION: We must keep the taskq blocked until we have everything
- * done. Otherwise a mode switch will make the state inconsistent.
- * Every time we jump to again: the taskq has been released so it
- * is possible for ioctl()s to make progress. This also means we
- * have to do a complete check every time since the hardware state
- * could have changed.
- */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* freeze the channels after freezing the taskq */
- mutex_enter(&statep->as_lock);
-
- mode = stpptr->am_pstate->apm_mode; /* reget, it may have changed */
-
- /*
- * If in MIXER mode then we look for multiple open()s with the same
- * PID. If no other AUDIO channels for the PID then we always succeed.
- * If in COMPAT mode we look for any open()s in the same direction.
- */
- ASSERT(pid != 0);
- if (mode == AM_MIXER_MODE) {
- for (i = 0, multi_open = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip non-audio channels and those not allocated */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr == tchptr ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * The same process can have separate read and write
- * open()s. But it can't have two reads or writes,
- * unless multiple open()s per process are allowed.
- */
- if (((am_ch_private_t *)tchptr->ch_private)->
- acp_flags & AM_CHNL_MULTI_OPEN) {
- mutex_exit(&tchptr->ch_lock);
- ch_flags |= AM_CHNL_MULTI_OPEN;
- /* don't need to look any further */
- break;
- } else if (
- (wantread && (tchptr->ch_dir & AUDIO_RECORD)) ||
- (wantwrite && (tchptr->ch_dir & AUDIO_PLAY))) {
- mutex_exit(&tchptr->ch_lock);
- /*
- * Multiple open()s not supported. So let the
- * taskq continue.
- */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING,
- wantwrite, wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /*
- * Wait for channels to be freed so we can
- * try again.
- */
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags
- * for the PID. We wakeup all waiting
- * channels, thus they go through their
- * loops and remark waiting.
- */
- am_set_waiting(statep, pid,
- AM_CLEAR_WAITING, wantwrite,
- wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If
- * the channels need to wait they'll set the
- * flags. That's why we wake all the channels
- * up, so they'll go through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
-
- }
- mutex_exit(&tchptr->ch_lock);
- }
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
-
- /* we can't have two reads or writes at one once */
- mutex_enter(&chptr->ch_lock);
- if ((wantread && stpptr->am_in_chs) ||
- (wantwrite && stpptr->am_out_chs)) {
- mutex_exit(&chptr->ch_lock);
- /*
- * Multiple open()s not supported. So let the
- * taskq continue.
- */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING, wantwrite,
- wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /* wait for channels to be freed so we can try again */
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags for the
- * PID. We wakeup all waiting channels, thus
- * they go through their loops and remark
- * waiting.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If the
- * channels need to wait they'll set the flags. That's
- * why we wake all the channels up, so they'll go
- * through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
-
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /*
- * If we get here there are no conflicting open()s. However, if in
- * MIXER mode then we may be limited by the max number of channels,
- * max number of read channels, and the max number of write channels.
- * It wasn't easy to check above, so we do it now.
- */
- if (mode == AM_MIXER_MODE &&
- (stpptr->am_channels >= max_chs ||
- (wantread && stpptr->am_in_chs >= stpptr->am_max_in_chs) ||
- (wantwrite && stpptr->am_out_chs >= stpptr->am_max_out_chs))) {
- /* let the taskq continue working */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING, wantwrite,
- wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- if (cv_wait_sig(&statep->as_cv, &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags for the PID.
- * We wakeup all waiting channels, thus they go
- * through their loops and remark waiting.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If the channels
- * need to wait they'll set the flags. That's why we wake all
- * the channels up, so they'll go through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING, wantwrite,
- wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /*
- * We have a good channel, all open() semantics pass, so init the ch.
- *
- * CAUTION: pid isn't filled in until the very end. Otherwise
- * other routines that look for AUDIO or AUDIOCTL channels may
- * think that the channel is fully allocated and available for
- * use.
- */
- mutex_enter(&chptr->ch_lock);
- ASSERT(chptr->ch_statep == statep);
-
- chptr->ch_qptr = q;
- chptr->ch_wput = am_wput;
- chptr->ch_wsvc = am_wsvc;
- chptr->ch_rput = am_rput;
- chptr->ch_rsvc = am_rsvc;
- chptr->ch_dir = ch_flags & AUDIO_BOTH;
- chptr->ch_dev = *devp;
- chptr->ch_private = chpptr;
- chptr->ch_info.info_size = sizeof (audio_info_t);
- chptr->ch_dev_info = ad_infop->ad_dev_info;
-
- chpptr->acp_flags = multi_open;
- chpptr->acp_reading = wantread;
- chpptr->acp_writing = wantwrite;
-
- /* get the minor device for the new channel */
- minor = audio_sup_ch_to_minor(statep, chptr->ch_info.ch_number);
- ATRACE_32("am_open_audio() channel number", chptr->ch_info.ch_number);
- ATRACE_32("am_open_audio() new minor number", minor);
-
- /*
- * Setup the channel. We use the audio_info structure allocated above.
- * If we are in MIXER mode then we keep this structure and it becomes
- * the virtual state. If in COMPAT mode we free it after we set the
- * state.
- *
- * We init both play and record, that way it is always filled in.
- * Not all members are filled in, that happens in the ioctl() code.
- * Thus we have to init the structure so am_audio_set_info() will
- * ignore them.
- */
- AUDIO_INIT(iptr, sizeof (*iptr));
-
- iptr->record.sample_rate = default_info->record.sample_rate;
- iptr->record.channels = AUDIO_CHANNELS_MONO;
- iptr->record.precision = AUDIO_PRECISION_8;
- iptr->record.encoding = AUDIO_ENCODING_ULAW;
- iptr->record.buffer_size = ad_infop->ad_record.ad_bsize;
- iptr->record.samples = 0;
- iptr->record.eof = 0;
- iptr->record.pause = 0;
- iptr->record.error = 0;
- iptr->record.waiting = 0;
- iptr->record.minordev = minor;
- iptr->record.open = 0;
- iptr->record.active = 0;
-
- iptr->play.sample_rate = default_info->play.sample_rate;
- iptr->play.channels = AUDIO_CHANNELS_MONO;
- iptr->play.precision = AUDIO_PRECISION_8;
- iptr->play.encoding = AUDIO_ENCODING_ULAW;
- iptr->play.buffer_size = 0;
- iptr->play.samples = 0;
- iptr->play.eof = 0;
- iptr->play.pause = 0;
- iptr->play.error = 0;
- iptr->play.waiting = 0;
- iptr->play.minordev = minor;
- iptr->play.open = 0;
- iptr->play.active = 0;
-
- if (mode == AM_MIXER_MODE) { /* virtual channel */
- iptr->record.gain = stpptr->am_pstate->apm_rgain;
- iptr->record.balance = stpptr->am_pstate->apm_rbal;
- iptr->play.gain = stpptr->am_pstate->apm_pgain;
- iptr->play.balance = stpptr->am_pstate->apm_pbal;
- chptr->ch_info.info = iptr;
- iptr->output_muted = 0;
- iptr->ref_cnt = 1;
- } else { /* AM_COMPAT_MODE, physical channel */
- iptr->record.gain = hw_info->record.gain;
- iptr->record.balance = hw_info->record.balance;
- iptr->play.gain = hw_info->play.gain;
- iptr->play.balance = hw_info->play.balance;
- chptr->ch_info.info = hw_info;
- iptr->output_muted = hw_info->output_muted;
- iptr->ref_cnt = 0; /* delete struct when done */
- }
- iptr->monitor_gain = hw_info->monitor_gain;
-
- mutex_exit(&chptr->ch_lock);
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
- /* before we setup the hardware we need to init src */
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (wantread) {
- ATRACE("am_open_audio() REC., calling src init", chptr);
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_ch_rbuf_size =
- ad_infop->ad_record.ad_conv->ad_src_init(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- mutex_exit(&chptr->ch_lock);
- }
- if (wantwrite) {
- ATRACE("am_open_audio() PLAY, calling src init", chptr);
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_ch_pbuf_size =
- ad_infop->ad_play.ad_conv->ad_src_init(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- mutex_exit(&chptr->ch_lock);
- }
- }
-
- /* set the open flags and increment the counts */
- if (wantread) {
- stpptr->am_in_chs++;
- }
- if (wantwrite) {
- stpptr->am_out_chs++;
- }
- stpptr->am_channels++;
-
- /* setting the hardware can take a long time, so let channels go */
- mutex_exit(&statep->as_lock);
-
- /* setup the hardware */
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
- if (am_audio_set_info(chptr, iptr, NULL) == AUDIO_FAILURE) {
- ATRACE("am_open_audio() hw set failed", chptr);
-
- mutex_enter(&statep->as_lock);
- if (wantread) {
- stpptr->am_in_chs--;
- }
- if (wantwrite) {
- stpptr->am_out_chs--;
- }
- stpptr->am_channels--;
- mutex_exit(&statep->as_lock);
-
- /* let the taskq continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- rc = EINVAL;
-
- /* free up any sample rate conv. memory we allocated earlier */
- if (wantread) {
- ad_infop->ad_record.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- }
- if (wantwrite) {
- ad_infop->ad_play.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- }
-
- goto error;
- }
-
- /*
- * From here on we can't fail. If in COMPAT mode we need to clean up
- * the hardware reference counts.
- */
- if (mode == AM_COMPAT_MODE) {
- kmem_free(iptr, sizeof (*iptr));
- iptr = hw_info;
- iptr->ref_cnt++;
- }
- if (wantread) {
- iptr->record.open = 1;
- }
- if (wantwrite) {
- iptr->play.open = 1;
- }
-
- /*
- * For mixer mode we see if there are any AUDIOCTL channels with
- * this process. If there are then we need to re-associate them
- * to this channel.
- *
- * NOTE: We must still have the taskq frozen.
- */
- mutex_enter(&statep->as_lock);
-
- if (mode == AM_MIXER_MODE) {
- /* we have to keep the channels stable */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip myself, unallocated, and closing channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr == tchptr ||
- (tchptr->ch_private &&
- ((am_ch_private_t *)tchptr->ch_private)->
- acp_flags & AM_CHNL_CLOSING)) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * Skip if different PIDs, including 0. pid is set
- * to 0 when am_close_audio*() is entered, so we aren't
- * associated with a closing channel.
- */
- if (tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* same PID, make sure it's AUDIOCTL */
- if (tchptr->ch_info.dev_type != AUDIOCTL) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * Yes! It's possible that the AUDIOCTL ch is
- * already attached to an AUDIO ch. If so we
- * don't muck with it. From this point it is
- * indeterminate as to what happens with
- * AUDIOCTL channels. If it isn't we associate
- * it with this AUDIO channel.
- */
- if (tchptr->ch_info.info == hw_info) {
- hw_info->ref_cnt--;
- ASSERT(hw_info->ref_cnt >= 1);
-
- ((am_ch_private_t *)
- tchptr->ch_private)->acp_flags |=
- AM_CHNL_CONTROL;
- tchptr->ch_info.info = iptr;
- iptr->ref_cnt++;
- }
-
- /*
- * we don't break because there can be more
- * than one AUDIOCTL for any one AUDIO channel.
- */
- mutex_exit(&tchptr->ch_lock);
- }
-
- /*
- * Above we set Codec info, but we need to set the
- * rest of the info in the iptr structure, except for
- * hardware related members, which we fill in when
- * needed.
- */
- iptr->play.avail_ports = hw_info->play.avail_ports;
- iptr->play.mod_ports = hw_info->play.mod_ports;
- iptr->record.avail_ports = hw_info->record.avail_ports;
- iptr->record.mod_ports = hw_info->record.mod_ports;
- }
-
- ASSERT(iptr != NULL);
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /* we start out open and empty */
- chpptr->acp_flags |= (AM_CHNL_OPEN | AM_CHNL_EMPTY);
-
- /* we've made it through all the checks, so it's safe to make the dev */
- *devp = makedevice(getmajor(*devp), minor);
- ATRACE("am_open_audio() made device", devp);
-
- mutex_enter(&chptr->ch_lock);
- chptr->ch_dev = *devp;
- mutex_exit(&chptr->ch_lock);
-
- ASSERT(chptr->ch_info.ch_number ==
- audio_sup_minor_to_ch(statep, minor));
-
- ATRACE("am_open_audio() qprocson()", chptr);
-
- /*
- * WARNING: Do this after we can no longer fail or we will have a
- * potential memory leak. Also, do it before qprocson().
- */
- audio_sup_set_qptr(q, *devp, chptr);
-
- /* schedule the queue */
- qprocson(q);
-
- /*
- * Now we can set the pid. We don't need to lock the structure because
- * the worst thing that will happen is the channel will be skipped and
- * then picked up on the next sweep through the channels. Once this is
- * set the other mixer routines will see the channel.
- *
- * CAUTION: This must be after qprocson(), otherwise other threads will
- * try to process STREAMS messages on a partially started stream.
- * This will cause a panic. This shows up in am_send_signal().
- */
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.pid = pid;
- mutex_exit(&chptr->ch_lock);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chpptr));
-
- /* thaw the taskq AFTER setting the pid */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- mutex_exit(&statep->as_lock);
-
- /* MUST be after inc. above - not locked any more, start recording */
- if (wantread) {
- mutex_enter(&chptr->ch_lock);
- if (am_set_record_streams(chptr) == AUDIO_SUCCESS) {
- chpptr->acp_flags |= AM_CHNL_RSTREAMS_SET;
- ATRACE("am_open() record STREAMS water marks adjusted",
- 0);
-#ifdef DEBUG
- } else {
- ATRACE("am_open() record STREAMS water marks not "
- "adjusted", 0);
-#endif
- }
- mutex_exit(&chptr->ch_lock);
-
- /* start recording, regardless of mode or Codec type */
- ATRACE("am_open_audio() starting record DMA engine", statep);
- /* set before start for mode switch */
- hw_info->record.active = 1;
- iptr->record.active = 1;
- iptr->record.pause = 0;
- if (am_ad_start_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number, AM_SERIALIZE) == AUDIO_FAILURE) {
- iptr->record.active = 0;
- hw_info->record.active = 0;
- /* we don't change pause flag if failed to start */
- }
- }
-
- ATRACE("am_open_audio() successful", statep);
-
- am_send_signal(statep, stpptr);
-
- return (AUDIO_SUCCESS);
-
-error:
- kmem_free(chpptr->acp_play_samp_buf, chpptr->acp_psb_size);
- kmem_free(chpptr, sizeof (*chpptr));
- if (iptr && iptr != hw_info) {
- kmem_free(iptr, sizeof (*iptr));
- }
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chpptr));
-
- mutex_enter(&chptr->ch_lock);
- chptr->ch_private = NULL;
- chptr->ch_info.info = NULL;
- mutex_exit(&chptr->ch_lock);
-
- (void) audio_sup_free_ch(chptr);
-
- /* tell the Audio Driver to free up ch resources */
- am_ad_teardown(statep, stpptr, ad_infop, chptr->ch_info.ch_number,
- (ch_flags & AUDIO_BOTH));
- ATRACE("am_open_audio() ad_teardown() returned", 0);
-
- ATRACE_32("am_open_audio() at \"error\"", rc);
-
- return (rc);
-
-} /* am_open_audio() */
-
-/*
- * am_open_audioctl()
- *
- * Description:
- * AUDIOCTL channel specific open() routine. There are lots of rules here,
- * but not as bad audio am_open_audio(). We don't worry about whether the
- * channel is opened for read or writing as we don't read() or write()
- * the device.
- *
- * How AUDIOCTL channels are allocated:
- * COMPAT MODE
- * always points to the hardware
- * MIXER MODE
- * if no AUDIO channels open() for the process then points to
- * the hardware
- * if one AUDIO channel open() for the process then point to that
- * channel, thus it is virtual
- * if more than one AUDIO channel open() for the process then
- * point to the first AUDIO channel, this includes multiple open()s
- * as well as one for read and one for write, which isn't the same
- * as a multiple open()
- *
- * NOTE: In user context so it is okay for memory allocation to sleep.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int oflag Open flags
- * int sflag STREAMS flag
- * cred_t *credp Ptr to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully opened the device
- * errno Error number for failed open()
- */
-/*ARGSUSED*/
-int
-am_open_audioctl(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t *chptr;
- audio_ch_t *tchptr;
- audio_info_t *hw_info;
- audio_info_t *iptr;
- am_ch_private_t *chpptr = 0;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- pid_t pid;
- ulong_t minor;
- int ch_flags;
- int error;
- int i;
- int max_chs;
- int mode;
-
- ATRACE("in am_open_audioctl()", devp);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "am_open_audioctl() audio_sup_devt_to_state() failed", 0);
- return (EIO);
- }
-
- /* this driver does only a conventional open(), i.e., no clone opens */
- if (sflag) {
- ATRACE("am_open_audioctl() clone open() failure", sflag);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE, "mixer:"
- "only conventional open()s are supported");
- return (EIO);
- }
-
- /* figure out if allocates should sleep or not */
- ch_flags = (oflag & (O_NONBLOCK|O_NDELAY)) ?
- AUDIO_NO_SLEEP : AUDIO_SLEEP;
-
- /* get the PID for the process opening the channel */
- pid = ddi_get_pid();
-
- /* get pointers to various data structures */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIOCTL)) == NULL) {
- ATRACE("am_open_audioctl() audio_sup_get_apm_info() failed", 0);
- return (EIO);
- }
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- ad_infop = apm_infop->apm_ad_infop;
- max_chs = statep->as_max_chs;
-
- /* see if we've been offlined */
- mutex_enter(&apm_infop->apm_lock);
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- return (EIO);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * Before we go any further we allocate the channel and all memory
- * that we'll need. That way we don't sleep holding any locks or
- * the taskq.
- */
- if ((chptr = audio_sup_alloc_ch(statep, &error, AUDIOCTL, ch_flags)) ==
- NULL) {
- ATRACE("am_open_audioctl() alloc returning", statep);
- return (error);
- }
-
- ASSERT(chptr->ch_info.pid == 0);
-
- chpptr = kmem_zalloc(sizeof (*chpptr), KM_SLEEP);
-
-
- /*
- * CAUTION: We must keep the taskq blocked until we have everything
- * done. Otherwise a mode switch will make the state inconsistent.
- */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* freeze channel allocation */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- /* mode may have changed, so re-get */
- mode = stpptr->am_pstate->apm_mode;
-
- /*
- * We have a good channel, all open() semantics pass, so init the ch.
- *
- * CAUTION: pid isn't filled in until the very end. Otherwise
- * other routines that look for AUDIO or AUDIOCTL channels may
- * think that the channel is fully allocated and available for
- * use.
- */
- chptr->ch_qptr = q;
- ASSERT(chptr->ch_statep == statep);
- chptr->ch_wput = am_wput;
- chptr->ch_wsvc = am_wsvc;
- chptr->ch_rput = am_rput;
- chptr->ch_rsvc = am_rsvc;
- chptr->ch_dir = 0;
- chptr->ch_dev = *devp;
- chptr->ch_private = chpptr;
- chptr->ch_info.info_size = sizeof (audio_info_t);
- chptr->ch_dev_info = ad_infop->ad_dev_info;
-
- chpptr->acp_flags = 0;
-
- /* get the minor device for the new channel */
- minor = audio_sup_ch_to_minor(statep, chptr->ch_info.ch_number);
- ATRACE_32("am_open_audioctl() channel number",
- chptr->ch_info.ch_number);
- ATRACE_32("am_open_audioctl() new minor number", minor);
-
- /*
- * Update the number of AUDIOCTL chs open for the mixer. We
- * don't bother updating the read or write counts because
- * they don't make sense for AUDIOCTL channels.
- */
- stpptr->am_channels++;
-
- mutex_exit(&chptr->ch_lock);
-
- /* figure out the audio_info structure, and initialize */
- if (mode == AM_MIXER_MODE) {
- /* is this AUDIOCTL channel related to an AUDIO ch? */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip myself, unallocated & diff. PID channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* yes, so link the info structs */
- ATRACE("am_open_audioctl() AUDIOCTL related", chptr);
-
- /* we lock the channel, not the state */
- iptr = tchptr->ch_info.info;
- chptr->ch_info.info = iptr;
- iptr->ref_cnt++;
- chpptr->acp_flags |= AM_CHNL_CONTROL;
- mutex_exit(&tchptr->ch_lock);
- break;
- }
-
- if (i == max_chs) { /* no, so link to HW */
- ATRACE("am_open_audioctl() AUDIOCTL not related",
- chptr);
-
- iptr = hw_info;
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.info = iptr;
- mutex_exit(&chptr->ch_lock);
- iptr->ref_cnt++;
- }
- } else {
- /* in COMPAT mode there is only one state structure */
- ATRACE("am_open_audioctl() AUDIOCTL: mode == AM_COMPAT_MODE",
- chptr);
-
- iptr = hw_info;
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.info = iptr;
- mutex_exit(&chptr->ch_lock);
- iptr->ref_cnt++;
- }
-
- /* we have all the state info, so we can let the state go */
- mutex_exit(&statep->as_lock);
-
- ATRACE("am_open_audioctl() AUDIOCTL iptr", iptr);
- ASSERT(iptr != NULL);
-
- mutex_enter(&chptr->ch_lock);
- /* we start out open and empty */
- chpptr->acp_flags |= (AM_CHNL_OPEN | AM_CHNL_EMPTY);
-
- ASSERT(iptr != NULL);
-
- /* we've made it through all the checks, so it's safe to make the dev */
- *devp = makedevice(getmajor(*devp), minor);
- ATRACE("am_open_audioctl() made device", devp);
-
- ASSERT(chptr->ch_info.ch_number ==
- audio_sup_minor_to_ch(statep, minor));
-
- ATRACE("am_open_audioctl() qprocson()", chptr);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * WARNING: Do this after we can no longer fail or we will have a
- * potential memory leak. Also, do it before qprocson().
- */
- audio_sup_set_qptr(q, *devp, chptr);
-
- /* schedule the queue */
- qprocson(q);
-
- /*
- * Now we can set the pid. We don't need to lock the structure because
- * the worst thing that will happen is the channel will be skipped and
- * then picked up on the next sweep through the channels. Once this is
- * set the other mixer routines will see the channel.
- *
- * CAUTION: This must be after qprocson(), otherwise other threads will
- * try to process STREAMS messages on a partially started stream.
- * This will cause a panic. This shows up in am_send_signal().
- */
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.pid = pid;
- mutex_exit(&chptr->ch_lock);
-
- /* thaw the taskq AFTER setting the pid */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- ATRACE("am_open_audioctl() successful", statep);
-
- am_send_signal(statep, stpptr);
-
- return (AUDIO_SUCCESS);
-
-} /* am_open_audioctl() */
-
-/*
- * am_close_audio()
- *
- * Description:
- * Close a minor device, returning the minor number to the pool so that
- * open(2) may use it again.
- *
- * chpptr->acp_flags is used to coordinate draining the write queue.
- * am_close_audio() sets flags to AM_CHNL_CLOSING. It then waits for the
- * flags to have AM_CHNL_EMPTY set by am_get_audio() when all available
- * data has been drained and played. If a signal interrupts the draining
- * the queue is flushed and the AM_CHNL_OPEN flag is cleared.
- * am_get_audio() then ignores this channel until it is open()ed again.
- *
- * There are a number of rules that have to be followed when closing
- * an audio channel. Some of them depend on the state of the mixer.
- * Thus we must stop any mode switching. This is done by freezing the
- * taskq.
- *
- * NOTE: When ch_info.info is set and ref_cnt is changed statep->as_lock
- * is used and the taskq MUST be frozen. Otherwise a mode switch
- * will mess things up.
- *
- * NOTE: We need to behave differently for a normal close() vs. the user
- * app calling exit(). Unfortunately there isn't a DDI compliant
- * method for doing this, so we take a look at the current thread
- * and see if it's exiting or not. This is how the old diaudio
- * module did it.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag File status flag
- * cred_t *credp Pointer to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully closed the device
- * errno Error number for failed close()
- */
-/*ARGSUSED*/
-int
-am_close_audio(queue_t *q, int flag, cred_t *credp)
-{
- audio_info_t *info;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t *alt_info = NULL;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- mblk_t *rec_mp;
- pid_t save_pid;
- int codec_type = ad_infop->ad_codec_type;
- int dir = 0;
- int i;
- int max_chs;
- int mode;
- int tmp_stream;
- int was_reading;
- int was_writing;
-
- ATRACE("in am_close_audio()", chptr);
- ATRACE_32("am_close_audio() channel number", chptr->ch_info.ch_number);
-
- ASSERT(q == chptr->ch_qptr);
-
- /* mark the channel as in the process of being closed */
- mutex_enter(&chptr->ch_lock);
- was_reading = chpptr->acp_reading;
- was_writing = chpptr->acp_writing;
- chpptr->acp_flags |= AM_CHNL_CLOSING;
- mutex_exit(&chptr->ch_lock);
-
- /* set the direction for ad_teardown() */
- if (was_reading) {
- dir |= AUDIO_RECORD;
- }
- if (was_writing) {
- dir |= AUDIO_PLAY;
- }
-
- /*
- * Wait for queue to drain, unless we were signaled in AUDIO_DRAIN
- * or the process is exiting (in which case we use the hack).
- */
- ATRACE("am_close_audio() checking to see if need to wait", chptr);
-
- if (was_writing) {
- /* we now need the info, so protect it by freezing the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mutex_enter(&chptr->ch_lock);
-
- info = chptr->ch_info.info;
-
- if (info->play.active && !info->play.pause) {
- /* release the taskq so it can continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
- ATRACE("am_close_audio() need to wait", chptr);
- while (!(chpptr->acp_flags & AM_CHNL_EMPTY) &&
- !(curthread->t_proc_flag & TP_LWPEXIT)) {
- ATRACE_32("am_close_audio() not empty",
- chpptr->acp_flags);
-
- /* wait for drain to complete */
- if (cv_wait_sig(&chptr->ch_cv,
- &chptr->ch_lock) <= 0) {
- ATRACE("am_close_audio() signal wakeup",
- chptr);
-
- break;
- }
- ATRACE_32("am_close_audio() normal wakeup",
- chpptr->acp_flags);
- }
- ATRACE_32("am_close_audio() empty", chpptr->acp_flags);
-
- /* clear the writing flag, for mode switching */
- chpptr->acp_writing = 0;
-
- mutex_exit(&chptr->ch_lock);
- } else {
- mutex_exit(&chptr->ch_lock);
- /* release the taskq so it can continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
- }
- }
-
- /*
- * It is possible an old AUDIO_DRAIN, which was interrupted, is
- * still outstanding. So just in case, we see of there's an mblk_t
- * hanging around. If so then we send it back. The STREAMS head will
- * ignore it if appropriate.
- *
- * The channel is marked as empty. Thus if the process is killed or
- * the cv_wait_sig() returns we force the AUDIO_DRAIN ioctl() to
- * return. This is okay since we will be flushing any queued up audio
- * and closing the STREAMS q.
- */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
-
- /* wait for queued tasks to clear */
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- /* the mode & info struct mean something ONLY when the mode is frozen */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mode = stpptr->am_pstate->apm_mode;
- info = chptr->ch_info.info;
-
- /*
- * Shutdown play and record. We shut down play first because it could
- * take a long time to shut down and we don't want to stop recording
- * too soon.
- */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- /* mark the channel closed so we can shut down the STREAMS queue */
- chpptr->acp_flags &= ~AM_CHNL_OPEN;
-
- /*
- * We shutdown the device if in COMPAT mode or for multi-stream
- * Codecs, or if this is the last playing/recording stream.
- */
- if (was_writing) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- stpptr->am_out_chs == 1) {
- ATRACE("am_close_audio() stopping play", statep);
- mutex_exit(&statep->as_lock);
- tmp_stream = chptr->ch_info.ch_number;
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_play(statep, stpptr, ad_infop, tmp_stream);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
- info->play.active = 0;
- hw_info->play.active = 0;
- info->play.pause = 0;
-
- /* make sure a mode switch wakes up */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
- }
-
- /* clear the writing flag, for mode switching */
- chpptr->acp_writing = 0;
- }
- if (was_reading) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- stpptr->am_in_chs == 1) {
- ATRACE("am_close_audio() stopping record", statep);
- mutex_exit(&statep->as_lock);
- tmp_stream = chptr->ch_info.ch_number;
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_record(statep, stpptr, ad_infop, tmp_stream);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
- info->record.active = 0;
- hw_info->record.active = 0;
- info->record.pause = 0;
- }
-
- /* send any recorded data that may still be hanging around */
- if (chpptr->acp_rec_mp) {
- info->record.samples += (chpptr->acp_rec_mp->b_wptr -
- chpptr->acp_rec_mp->b_rptr) /
- (info->record.channels *
- (info->record.precision >> AUDIO_PRECISION_SHIFT));
-
- rec_mp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
-
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- putnext(RD(q), rec_mp);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- chpptr->acp_rec_mp = NULL;
- }
-
- /* clear the reading flag, for mode switching */
- chpptr->acp_reading = 0;
- }
-
- /* save the gain and balance for the next open() */
- if (was_writing) {
- stpptr->am_pstate->apm_pgain = info->play.gain;
- stpptr->am_pstate->apm_pbal = info->play.balance;
- }
- if (was_reading) {
- stpptr->am_pstate->apm_rgain = info->record.gain;
- stpptr->am_pstate->apm_rbal = info->record.balance;
- }
-
- /*
- * Clear the pid field - keeps this channel from being used while the
- * contents are being freed. But save the pid because we need it later.
- *
- * CAUTION: The taskq must be blocked before the PID is set to 0.
- * Otherwise switching modes can happen in the middle of closing,
- * which results in a bad reference count.
- */
- save_pid = chptr->ch_info.pid;
- chptr->ch_info.pid = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- /* we are modifying mixer global data, so lock the mixer */
- mutex_enter(&apm_infop->apm_lock);
-
- ASSERT(stpptr->am_channels > 0);
- ASSERT(stpptr->am_in_chs >= 0);
- ASSERT(stpptr->am_out_chs >= 0);
-
- stpptr->am_channels--;
-
- if (was_reading) {
- ASSERT(stpptr->am_in_chs > 0);
- stpptr->am_in_chs--;
- if (stpptr->am_in_chs == 0) {
- /* turn off capture */
- info->record.active = 0;
- }
-
- info->record.open = 0;
- info->record.waiting = 0;
- info->record.active = 0;
- info->record.pause = 0;
- info->record.samples = 0;
- info->record.error = 0;
- }
-
- if (was_writing) {
- ASSERT(stpptr->am_out_chs > 0);
- stpptr->am_out_chs--;
-
- info->play.open = 0;
- info->play.waiting = 0;
- info->play.active = 0;
- info->play.pause = 0;
- info->play.samples = 0;
- info->play.eof = 0;
- info->play.error = 0;
- }
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&statep->as_lock);
-
- /*
- * If in MIXER mode the next step for closing the AUDIO channel is to
- * fix any AUDIOCTL channels that were pointing to this channel. Even
- * if multiple open()s aren't allowed we can still have one channel for
- * read and one for write. If there are multiple open()s then there
- * could be many channels. Thus we just look for the first AUDIO
- * channel with the same PID. If there isn't then we point to the
- * hardware.
- *
- * If in COMPAT mode then we are already pointing to hardware so
- * we skip this step.
- */
- max_chs = statep->as_max_chs;
- mutex_enter(&statep->as_lock); /* freeze the channels */
-
- if (mode == AM_MIXER_MODE) {
- /* first find the first AUDIO channel */
- ASSERT(alt_info == 0);
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip the same and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* skip if not AUDIOCTL or different PIDs */
- if (tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != save_pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- alt_info = tchptr->ch_info.info;
-
- mutex_exit(&tchptr->ch_lock);
-
- break;
- }
- if (alt_info == NULL) {
- /* no match found, so set to hardware */
- alt_info = &stpptr->am_hw_info;
- }
-
- /* next update the AUDIOCTL chs to point to the correct ch */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip the same and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* skip if not AUDIOCTL or different PIDs */
- if (tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid != save_pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE("am_close_audio() setting AUDIOCTL info",
- alt_info);
- ATRACE_32("am_close_audio() setting AUDIOCTL info, ch",
- i);
-
- /*
- * This is the same PID, so fix info pointers. We check
- * to see if the AUDIOCTL channel is already pointing
- * to alt_info. If so then we don't have to do a thing.
- * But if it doesn't then we have to decrement the
- * count for where it points and then reset and
- * increment the new reference count.
- */
- if (tchptr->ch_info.info == alt_info) {
- /* the same, so continue */
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* different, so update counters and pointer */
- ((audio_info_t *)tchptr->ch_info.info)->ref_cnt--;
- tchptr->ch_info.info = alt_info;
- alt_info->ref_cnt++;
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
- mutex_exit(&statep->as_lock);
-
- /* make sure we aren't closing while someone is busy */
- mutex_enter(&chptr->ch_lock);
- while (chpptr->acp_busy_cnt) {
- ATRACE_32("am_close_audio() in putnext(), calling cv_wait()",
- chpptr->acp_flags);
-
- chpptr->acp_flags |= AM_CHNL_SIGNAL_NEEDED;
-
- /* wait for the count to go to 0 */
- cv_wait(&chptr->ch_cv, &chptr->ch_lock);
- ATRACE("am_close_audio() putnext() cv wakeup", chptr);
- }
-
- /*
- * Mark that qprocsoff() has been called, even though technically it
- * hasn't. However, it will eliminate the race condition between
- * releasing the lock and the qprocsoff() below.
- */
- chpptr->acp_flags |= AM_CHNL_QPROCSOFF;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audio() flushing q", chptr);
- flushq(RD(q), FLUSHALL);
-
- /* unschedule the queue */
- ATRACE("am_close_audio() qprocsoff()", chptr);
- qprocsoff(q);
-
- /*
- * Remove the private data from the q, AFTER turning the q off.
- * If this is done before qprocsoff() then any STREAMS call
- * between these two would find bad qptr data and panic.
- */
- audio_sup_free_qptr(q);
-
- /* we have to reget this because it could have changed */
- info = chptr->ch_info.info;
-
- /* take care of references to the audio state structure */
- mutex_enter(&statep->as_lock);
- if (info->ref_cnt <= 1) {
- /*
- * Need to free the buffer. We don't need to lock because
- * only this thread can now be using this channel.
- */
- ASSERT(info != apm_infop->apm_ad_state);
- kmem_free(info, sizeof (audio_info_t));
- } else {
- info->ref_cnt--;
- }
- mutex_exit(&statep->as_lock);
-
- /* release the taskq AFTER we don't care about the mode */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* free the sample rate conversion routine buffers */
- if (codec_type == AM_TRAD_CODEC) {
- if (was_writing) {
- ad_infop->ad_play.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- }
- if (was_reading) {
- ad_infop->ad_record.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- }
- }
-
- /*
- * Tell the Audio Driver to free up any channel config info.
- * This may block, which is why we do it without any locks held
- * or the taskq frozen.
- */
- am_ad_teardown(statep, stpptr, ad_infop, chptr->ch_info.ch_number, dir);
- ATRACE("am_close_audio() ad_teardown() returned", 0);
-
- mutex_enter(&chptr->ch_lock);
-
- /* free all the buffers */
- if (chpptr->acp_play_samp_buf) {
- kmem_free(chpptr->acp_play_samp_buf, chpptr->acp_psb_size);
- chpptr->acp_play_samp_buf = NULL;
- chpptr->acp_psb_size = 0;
- }
- if (chpptr->acp_ch_psrc1) {
- kmem_free(chpptr->acp_ch_psrc1, chpptr->acp_ch_psrc_siz);
- chpptr->acp_ch_psrc1 = NULL;
- }
- if (chpptr->acp_ch_psrc2) {
- kmem_free(chpptr->acp_ch_psrc2, chpptr->acp_ch_psrc_siz);
- chpptr->acp_ch_psrc2 = NULL;
- }
- chpptr->acp_ch_psrc_siz = 0;
- if (chpptr->acp_ch_pconv1) {
- kmem_free(chpptr->acp_ch_pconv1, chpptr->acp_ch_pconv_siz);
- chpptr->acp_ch_pconv1 = NULL;
- }
- if (chpptr->acp_ch_pconv2) {
- kmem_free(chpptr->acp_ch_pconv2, chpptr->acp_ch_pconv_siz);
- chpptr->acp_ch_pconv2 = NULL;
- }
- chpptr->acp_ch_pconv_siz = 0;
- if (chpptr->acp_ch_rsrc1) {
- kmem_free(chpptr->acp_ch_rsrc1, chpptr->acp_ch_rsrc_siz);
- chpptr->acp_ch_rsrc1 = NULL;
- }
- if (chpptr->acp_ch_rsrc2) {
- kmem_free(chpptr->acp_ch_rsrc2, chpptr->acp_ch_rsrc_siz);
- chpptr->acp_ch_rsrc2 = NULL;
- }
- chpptr->acp_ch_rsrc_siz = 0;
- if (chpptr->acp_ch_rconv1) {
- kmem_free(chpptr->acp_ch_rconv1, chpptr->acp_ch_rconv_siz);
- chpptr->acp_ch_rconv1 = NULL;
- }
- if (chpptr->acp_ch_rconv2) {
- kmem_free(chpptr->acp_ch_rconv2, chpptr->acp_ch_rconv_siz);
- chpptr->acp_ch_rconv2 = NULL;
- }
- chpptr->acp_ch_rconv_siz = 0;
-
- ASSERT(chpptr->acp_rec_mp == NULL);
-
- /* send the close signal */
- mutex_exit(&chptr->ch_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&chptr->ch_lock);
-
- kmem_free(chpptr, sizeof (*chpptr));
- chptr->ch_private = NULL;
-
- /* wait until the very end to flush */
- ATRACE("am_close_audio() flushing messages", chptr);
- audio_sup_flush_audio_data(chptr);
-
- /* audio_sup_free_ch() requires the info ptr to be NULLed */
- chptr->ch_info.info = NULL;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audio() calling audio_free_ch()", chptr);
- if (audio_sup_free_ch(chptr) == AUDIO_FAILURE) {
- /* not much we can do if this fails */
- ATRACE("am_close_audio() audio_sup_free_ch() failed", chptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "close_audio() audio_sup_free_ch() error");
- }
-
- ATRACE("am_close_audio() successful", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_close_audio() */
-
-/*
- * am_close_audioctl()
- *
- * Description:
- * Close a minor device, returning the minor number to the pool so that
- * open(2) may use it again.
- *
- * NOTE: When ch_info.info is set and ref_cnt is changed statep->as_lock
- * is used and the taskq MUST be frozen. Otherwise a mode switch
- * will mess things up.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag File status flag
- * cred_t *credp Pointer to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully closed the device
- * errno Error number for failed close()
- */
-/*ARGSUSED*/
-int
-am_close_audioctl(queue_t *q, int flag, cred_t *credp)
-{
- audio_info_t *info;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_close_audioctl()", chptr);
- ATRACE_32("am_close_audioctl() channel number",
- chptr->ch_info.ch_number);
-
- ASSERT(q == chptr->ch_qptr);
-
- /* mark the channel as in the process of being closed */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_CLOSING;
- mutex_exit(&chptr->ch_lock);
-
- /* wait for queued tasks to clear */
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- /* we now need everything stable, so freeze the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* mark the channel as being closed */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags = 0;
-
- /*
- * Clear the pid field - keeps this channel from being used while the
- * contents are being freed.
- *
- * CAUTION: The taskq must be blocked before the PID is set to 0.
- * Otherwise switching modes can happen in the middle of closing,
- * which results in a bad reference count.
- */
- chptr->ch_info.pid = 0;
-
- /* make sure we aren't closing while someone is busy */
- while (chpptr->acp_busy_cnt) {
- ATRACE_32("am_close_audioctl() in putnext(), calling cv_wait()",
- chpptr->acp_flags);
-
- chpptr->acp_flags |= AM_CHNL_SIGNAL_NEEDED;
-
- /* wait for the count to go to 0 */
- cv_wait(&chptr->ch_cv, &chptr->ch_lock);
- ATRACE("am_close_audioctl() putnext() cv wakeup", chptr);
- }
-
- /*
- * Mark that qprocsoff() has been called, even though technically it
- * hasn't. However, it will eliminate the race condition between
- * releasing the lock and the qprocsoff() below.
- */
- chpptr->acp_flags |= AM_CHNL_QPROCSOFF;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audioctl() flushing q", chptr);
- flushq(RD(q), FLUSHALL);
-
- /* unschedule the queue */
- ATRACE("am_close_audioctl() qprocsoff()", chptr);
- qprocsoff(q);
-
- /*
- * Remove the private data from the q, AFTER turning the q off.
- * If this is done before qprocsoff() then any STREAMS call
- * between these two would find bad qptr data and panic.
- */
- audio_sup_free_qptr(q);
-
- /* we are modifying mixer global data, so lock the mixer */
- mutex_enter(&statep->as_lock);
- mutex_enter(&apm_infop->apm_lock);
-
- ASSERT(stpptr->am_channels > 0);
- ASSERT(stpptr->am_in_chs >= 0);
- ASSERT(stpptr->am_out_chs >= 0);
-
- stpptr->am_channels--;
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&statep->as_lock);
-
- info = chptr->ch_info.info;
-
- /*
- * Unlike AUDIO channels the reference count can never be 1. That's
- * because AUDIOCTL channels in COMPAT mode always increment the
- * count, as they do in MIXER mode when the process doesn't have an
- * AUDIO channel open as well. If in MIXER mode with an AUDIO channel
- * in the same process then the AUDIO channels reference count is
- * used, not the hardware.
- */
- mutex_enter(&statep->as_lock);
- info->ref_cnt--;
- ASSERT(info->ref_cnt);
- mutex_exit(&statep->as_lock);
-
- /* release the taskq AFTER we don't care about the mode */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
-#ifdef DEBUG
- mutex_enter(&chptr->ch_lock);
- ASSERT(chpptr->acp_play_samp_buf == NULL);
- ASSERT(chpptr->acp_ch_psrc1 == NULL);
- ASSERT(chpptr->acp_ch_psrc2 == NULL);
- ASSERT(chpptr->acp_ch_pconv1 == NULL);
- ASSERT(chpptr->acp_ch_pconv2 == NULL);
- ASSERT(chpptr->acp_ch_rsrc1 == NULL);
- ASSERT(chpptr->acp_ch_rsrc2 == NULL);
- ASSERT(chpptr->acp_ch_rconv1 == NULL);
- ASSERT(chpptr->acp_ch_rconv2 == NULL);
- ASSERT(chpptr->acp_rec_mp == NULL);
- mutex_exit(&chptr->ch_lock);
-#endif
-
- /* send the close signal */
- am_send_signal(statep, stpptr);
-
- mutex_enter(&chptr->ch_lock);
-
- kmem_free(chpptr, sizeof (*chpptr));
- chptr->ch_private = NULL;
-
- /* audio_sup_free_ch() requires the info ptr to be NULLed */
- chptr->ch_info.info = NULL;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audioctl() calling audio_free_ch()", chptr);
- if (audio_sup_free_ch(chptr) == AUDIO_FAILURE) {
- /* not much we can do if this fails */
- ATRACE("am_close_audioctl() audio_sup_free_ch() failed", chptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "close_audioctl() audio_sup_free_ch() error");
- }
-
- ATRACE("am_close_audioctl() successful", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_close_audioctl() */
-
-/*
- * am_restore_state()
- *
- * Description:
- * Restore the device's hardware state and restart playing and recording.
- * If am_save_state() was called then we have the taskq frozen. Otherwise
- * it isn't and we have to freeze it. That way hot unplug and hot plug
- * events won't mess with open(), close(), or ioctl().
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Ptr to the APM's state info
- * int dir Direction to restore
- *
- * Returns:
- * AUDIO_SUCCESS State restored and restarted
- * AUDIO_FAILURE State not restored or restart failed
- */
-int
-am_restore_state(audio_state_t *statep, audio_apm_info_t *apm_infop, int dir)
-{
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info;
- audiohdl_t handle = AUDIO_STATE2HDL(statep);
- uint_t pgain; /* play gain to set h/w */
- uint_t pbalance; /* play balance to set h/w */
- uint_t rgain; /* record gain to set h/w */
- uint_t rbalance; /* record balance to set h/w */
- int doread; /* device supports record */
- int dowrite; /* device supports play */
- int psr;
- int rsr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("in am_restore_state()", statep);
-
- ad_infop = apm_infop->apm_ad_infop;
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
-
- psr = hw_info->play.sample_rate;
- pgain = hw_info->play.gain;
- pbalance = hw_info->play.balance;
- rsr = hw_info->record.sample_rate;
- rgain = hw_info->record.gain;
- rbalance = hw_info->record.balance;
-
- /* figure out the direction, am_attach() already did the sanity ck */
- dowrite =
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY) &&
- (dir & AUDIO_PLAY);
- doread =
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD) &&
- (dir & AUDIO_RECORD);
- if (!doread && !dowrite) {
- ATRACE("am_restore_state() nothing to do", dir);
- mutex_enter(&stpptr->am_ad_lock);
- stpptr->am_ad_in &= ~AM_APM_FREEZE;
- mutex_exit(&stpptr->am_ad_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* freeze the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- /*
- * Set state saved in preparation for restore. We set this because it
- * is possible that am_save_state() was not called first, so this
- * simulates this call. Don't both with a check if it is set, this
- * wastes more time than just setting.
- */
- stpptr->am_ad_in |= AM_APM_FREEZE;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ASSERT(doread || dowrite);
-
- ATRACE("am_restore_state() dowrite", dowrite);
- ATRACE("am_restore_state() doread", doread);
-
- /*
- * CAUTION: Keep the calls the same as in am_attach(). There may be
- * order dependencies and once the audio driver works we don't
- * want to break it if we change the order.
- *
- * Set the play format and gain, if present.
- */
- if (dowrite) {
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_PLAY, psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN, "am_restore_state() "
- "couldn't set play data format: %d %d %d %d",
- hw_info->play.sample_rate, stpptr->am_hw_pchs,
- stpptr->am_hw_pprec, stpptr->am_hw_penc);
-
- goto error;
- }
-
- if (am_set_gain(statep, apm_infop, stpptr->am_hw_pchs,
- pgain, pbalance, AUDIO_PLAY, AM_SET_CONFIG_BOARD,
- AM_FORCE, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set play gain");
-
- goto error;
- }
- }
-
- /* set the record format and gain, if present */
- if (doread) {
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_RECORD, rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() "
- "couldn't set record data format: %d %d %d %d",
- hw_info->record.sample_rate, stpptr->am_hw_rchs,
- stpptr->am_hw_rprec, stpptr->am_hw_renc);
-
- goto error;
- }
-
- /* set the gains */
- if (am_set_gain(statep, apm_infop, stpptr->am_hw_rchs,
- rgain, rbalance, AUDIO_RECORD, AM_SET_CONFIG_BOARD,
- AM_FORCE, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set record gain");
-
- goto error;
- }
- }
-
- /* now set the ports, monitor gain, etc. */
- if (dowrite) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_PLAY,
- hw_info->play.port, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set play port: 0x%x",
- ad_infop->ad_defaults->play.port);
-
- goto error;
- }
- }
-
- if (doread) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_RECORD,
- hw_info->record.port, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set record port: 0x%x",
- ad_infop->ad_defaults->record.port);
-
- goto error;
- }
- }
-
- if ((ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_IN2OUT) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, hw_info->monitor_gain, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set monitor gain: 0x%x",
- ad_infop->ad_defaults->monitor_gain);
-
- goto error;
- }
-
- if (dowrite && am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- hw_info->output_muted, NULL, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set output muted: 0x%x",
- ad_infop->ad_defaults->output_muted);
-
- goto error;
- }
-
- if (doread && (ad_infop->ad_assist_flags & AM_ASSIST_MIC) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_MIC_BOOST, AUDIO_RECORD,
- (ad_infop->ad_add_mode & AM_ADD_MODE_MIC_BOOST), NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set mic boost: 0x%x",
- ad_infop->ad_add_mode);
-
- goto error;
- }
-
- /*
- * Restart play and record, if there are any apps that have the
- * device open for the direction. If not then we don't waste time
- * restarting.
- *
- * It is legal for a play restart calls to fail. This can happen
- * when there's no audio to play. If it does fail due to no audio
- * then we are already stopped and the active flags should be cleared.
- * If play is restarted then the active flags should be set. We don't
- * check because there is a race condition and with this routine
- * and am_wsvc(). The flags will get set correctly very quickly, so
- * there's no reason to try to work around this race, which would not
- * be easy.
- *
- * The same is not true for record. If we start record for no recording
- * apps then the mixer will turn off the record later after the 1st
- * interrupt.
- */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- int i;
- int max_chs = statep->as_max_chs;
- int restore_dir = 0;
-
- restore_dir = doread | dowrite;
- ATRACE_32("am_restore_state() restore_dir", restore_dir);
-
- ATRACE("am_restore_state() restarting MS", 0);
- for (i = 0, chptr = &statep->as_channels[0]; i < max_chs;
- i++, chptr++, restore_dir = 0) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is writing */
- chpptr = chptr->ch_private;
-
- /*
- * Figure which to restart for this channel. We do it
- * this way so we can free the mutex fore calling the
- * device's start routines.
- */
- if (dowrite && chpptr->acp_writing) {
- restore_dir |= AUDIO_PLAY;
- }
- if (doread && chpptr->acp_reading) {
- restore_dir |= AUDIO_RECORD;
- }
-
- mutex_exit(&chptr->ch_lock);
-
- if (restore_dir & AUDIO_PLAY) {
- ATRACE("am_restore_state() MS restart play",
- chptr);
- /*
- * Don't set active flags because they
- * should already be set.
- */
- (void) am_ad_start_play(statep, stpptr,
- ad_infop, i, AM_NO_SERIALIZE);
- }
-
- if (restore_dir & AUDIO_RECORD) {
- ATRACE("am_restore_state() MS restart record",
- chptr);
- /*
- * Don't set active flags because they
- * should already be set.
- */
- (void) am_ad_start_record(statep, stpptr,
- ad_infop, i, AM_NO_SERIALIZE);
- }
- }
- } else {
- mutex_enter(&statep->as_lock);
- if (dowrite) {
- /* do restart */
- mutex_exit(&statep->as_lock);
- ATRACE_32("am_restore_state() restarting play TRAD",
- stpptr->am_out_chs);
-
- /*
- * We don't bother with the individual channel or
- * hardware active flags because they should already
- * be set.
- */
- (void) am_ad_start_play(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_NO_SERIALIZE);
- mutex_enter(&statep->as_lock);
- }
-
- if (doread) {
- /* do restart */
- mutex_exit(&statep->as_lock);
- ATRACE_32("am_restore_state() restarting record TRAD",
- stpptr->am_in_chs);
-
- /*
- * We don't bother with the individual channel or
- * hardware active flags because they should already
- * be set.
- */
- (void) am_ad_start_record(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_NO_SERIALIZE);
- } else {
- mutex_exit(&statep->as_lock);
- }
- }
-
- ATRACE("am_restore_state() done - success", statep);
-
- rc = AUDIO_SUCCESS;
-
-error:
- /* restore error, thaw that taskq and free flags */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- stpptr->am_ad_in &= ~AM_APM_FREEZE;
-
- /* wake up a blocked driver access, just in case */
- cv_signal(&stpptr->am_ad_cv);
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE_32("am_restore_state() returning", rc);
-
- return (rc);
-
-} /* am_restore_state() */
-
-/*
- * am_save_state()
- *
- * Description:
- * Flag that we are frozen. This stops calls into the audio driver,
- * except for ioctl()s.
- *
- * We don't care about which direction. Both act the same.
- *
- * There is a very tiny window of opportunity between taskq_wait()
- * and the mutex_enter() where in theory we could get another task added
- * to the queue, would execute, and potentially cause problems.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Ptr to the APM's state info
- * int dir Direction to save
- *
- * Returns:
- * AUDIO_SUCCESS State restored and restarted
- * AUDIO_FAILURE State not restored or restart failed
- */
-/*ARGSUSED*/
-int
-am_save_state(audio_state_t *statep, audio_apm_info_t *apm_infop, int dir)
-{
- am_apm_private_t *stpptr = apm_infop->apm_private;
-
- ATRACE("in am_save_state()", statep);
-
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- /* flag that we're frozen */
- stpptr->am_ad_in |= AM_APM_FREEZE;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_save_state() */
-
-/*
- * The private main routines for this file.
- */
-
-/*
- * am_rput()
- *
- * Description:
- * We have this here just for symmetry. There aren't any modules/drivers
- * below this, so this should never be called. But just in case, we
- * return.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-/*ARGSUSED*/
-static int
-am_rput(queue_t *q, mblk_t *mp)
-{
- ATRACE("in am_rput()", q);
-
- ATRACE("am_rput() returning 0", q);
-
- freemsg(mp);
-
- return (0);
-
-} /* am_rput() */
-
-/*
- * am_rsvc()
- *
- * Description:
- * We have this here just for symmetry. There aren't any modules/drivers
- * below this, so this should never be called. But just in case, we
- * return
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-/*ARGSUSED*/
-static int
-am_rsvc(queue_t *q)
-{
- mblk_t *mp;
-
- ATRACE("in am_rsvc()", q);
-
- /* we always have to drain the queue */
- while ((mp = getq(q)) != NULL) {
- freemsg(mp);
- }
-
- ATRACE("am_rsvc() returning 0", q);
-
- return (0);
-
-} /* am_rsvc() */
-
-/*
- * am_wput()
- *
- * Description:
- * All messages to the mixer arrive here. We don't support very many
- * messages.
- * M_DATA Passed on to the write svc() routine
- * M_IOCTL Calls am_wioctl() for further processing
- * M_IOCDATA Calls am_wiocdata() for further processing
- * M_FLUSH Flushes the input and/or output queues
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-static int
-am_wput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- int error = EIO;
-
- ATRACE("in am_wput()", q);
-
- ASSERT(chptr);
-
- /* figure out what kind of message we've got */
- ATRACE_32("am_wput() type", mp->b_datap->db_type);
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- ATRACE("am_wput() FLUSH", chptr);
-
- ASSERT(WR(q) == q);
-
- am_flush(q, mp);
- return (0);
-
- case M_IOCTL:
- ATRACE("am_wput() IOCTL", chptr);
- return (am_wioctl(q, mp, chptr));
-
- case M_IOCDATA:
- ATRACE("am_wput() IOCDATA", chptr);
- return (am_wiocdata(q, mp, chptr));
-
- case M_DATA:
- ATRACE("am_wput() DATA", chptr);
- /* make sure the write is on an AUDIO channel */
- mutex_enter(&chptr->ch_lock);
- if (chptr->ch_info.dev_type != AUDIO ||
- !((am_ch_private_t *)chptr->ch_private)->acp_writing) {
-
- /* NOT an AUDIO channel, we don't allow write */
- ATRACE_32("am_wput() not AUDIO",
- chptr->ch_info.dev_type);
- mutex_exit(&chptr->ch_lock);
- goto done;
- }
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wput() putting msg on q", mp);
-
- /*
- * First, concatenate the message. If in mixer mode
- * with a traditional Codec we do sample rate conversion
- * on the concatenated buffer before we save the data
- * for later use.
- */
- if (pullupmsg(mp, -1)) {
- ATRACE("am_wput() pullupmsg() successful", mp);
- (void) putq(q, mp); /* does qenable() */
- } else {
- ATRACE("am_wput() pullupmsg() failed", mp);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "wput() pullupmsg() failed, sound lost");
- freemsg(mp);
- }
- ATRACE_32("am_wput() putting msg on q done", 0);
-
- /* don't break because then we free a msg we've already freed */
- ATRACE_32("am_wput() returning", 0);
- return (0);
-
- default:
- ATRACE("am_wput() default", chptr);
- break;
- }
-
- /* if we get here there was some kind of error, so send an M_ERROR */
-done:
- ATRACE("am_wput() done:", chptr);
-
- if (error) {
- ATRACE_32("am_wput() error", error);
- mp->b_datap->db_type = M_ERROR;
- mp->b_rptr = mp->b_datap->db_base;
- *(int *)mp->b_rptr = EIO;
- mp->b_wptr = mp->b_rptr + sizeof (int *);
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
- qreply(q, mp);
- } else {
- if (mp) {
- freemsg(mp);
- }
- }
-
- ATRACE("am_wput() returning", chptr);
-
- return (0);
-
-} /* am_wput() */
-
-/*
- * am_wsvc()
- *
- * Description:
- * Write service routine. By definition, this service routine grabs
- * all messages from the queue before it returns.
- *
- * The only message that we ever get is an M_DATA message, which is
- * audio data. The audio data is converted to the canonical data format.
- * If we need to sample rate convert then the data is converted.
- *
- * We also make sure the play DMA engine is running.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-static int
-am_wsvc(queue_t *q)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_state_t *statep = chptr->ch_statep;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_info_t *tinfo;
- mblk_t *mp;
- int EOF_count;
- int *orig_data;
- int *proc_data;
- size_t size;
- size_t orig_size;
- size_t proc_size;
-
- ATRACE("in am_wsvc()", q);
- ATRACE("am_wsvc() chptr", chptr);
- ASSERT(RD(q) == chptr->ch_qptr);
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
-
- /* we always have to drain the queue */
- while ((mp = getq(q)) != NULL) {
- /* this is an AUDIO channel */
- ATRACE("am_wsvc() processing data", mp);
-
- /*
- * If this is an EOF marker, 0 size write(), we place an
- * empty audio data structure on the data list.
- */
- size = mp->b_wptr - mp->b_rptr;
- if (size == 0) {
- ATRACE("am_wsvc() EOF message, putting on list", mp);
- if (audio_sup_save_audio_data(chptr, NULL, 0, NULL,
- 0) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_wsvc() EOF marker lost");
- }
- freemsg(mp);
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
-
- /* not an EOF message, so process it */
- ATRACE("am_wsvc() calling am_p_process()", size);
-
- /* don't let mode switch happen while we sample rate convert */
- mutex_enter(&chptr->ch_lock);
- mutex_enter(&stpptr->am_mode_lock);
-
- /* if we are switching modes then return */
- mutex_enter(&apm_infop->apm_lock);
- if (stpptr->am_flags & AM_PRIV_SW_MODES) {
- ATRACE_32("am_wsvc() switching modes",
- stpptr->am_flags);
-
- /* put the message back on the queue */
- (void) putbq(q, mp);
-
- /* make sure the queue is off */
- noenable(WR(q));
-
- /* for AUDIO_DRAIN */
- chpptr->acp_flags |= AM_CHNL_MSG_ON_QUEUE;
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- return (0);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- if (am_p_process(chptr, mp->b_rptr, size, &orig_data,
- &orig_size, &proc_data, &proc_size) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_wsvc() am_p_process() failed", chptr);
-
- freemsg(mp);
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- freemsg(mp);
-
- /* save the audio data */
- if (audio_sup_save_audio_data(chptr, orig_data, orig_size,
- proc_data, proc_size) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_wsvc() data save failed, audio lost");
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
-
- /*
- * Mark the channel as busy and not empty, but only if we
- * actually processed the message. If that failed then we
- * give up on this message and try again on the next one.
- */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags &= ~(AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2);
- mutex_exit(&chptr->ch_lock);
-
-#ifdef FLOW_CONTROL
-flow:
- /* do we need to do flow control? */
- mutex_enter(&chptr->ch_lock);
- if (!(chpptr->acp_flags & AM_CHNL_PFLOW) &&
- (audio_sup_get_audio_data_size(chptr) >
- AM_MAX_QUEUED_MSGS_SIZE ||
- audio_sup_get_audio_data_cnt(chptr) >
- AM_MAX_QUEUED_MSGS_CNT)) {
- /* yes, do flow control */
- chpptr->acp_flags |= AM_CHNL_PFLOW;
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_wsvc() flow control enabled, q off", q);
-
- noenable(q); /* keep putq() from enabling */
-
- break;
- }
- mutex_exit(&chptr->ch_lock);
-#endif
- }
-
- /*
- * If !paused make sure the play engine is on.
- *
- * It is possible during a mode switch that the channel info
- * structure can change on us. So we use the channel lock to
- * make sure it remains stable.
- */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
-
- /* for AUDIO_DRAIN */
- chpptr->acp_flags &= ~AM_CHNL_MSG_ON_QUEUE;
- ATRACE("am_wsvc() starting play eng", statep);
- if (!tinfo->play.pause) {
- /*
- * Set the active bits before starting play so a switch mode
- * will sleep on the CV.
- */
- tinfo = chptr->ch_info.info;
- tinfo->play.active = 1;
- hw_info->play.active = 1;
- tinfo->play.pause = 0;
- mutex_exit(&chptr->ch_lock);
- if (am_ad_start_play(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number, AM_SERIALIZE) == AUDIO_FAILURE) {
- /* we don't change pause if failed to start */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
- tinfo->play.active = 0;
- hw_info->play.active = 0;
-
- /*
- * If we turn off the hardware then make sure any
- * queued up EOF messages go out. This is done in
- * am_get_samples(). Hopefully most of the EOFs will
- * be caught there. However, especially when in mixer
- * mode, it can be difficult to catch them all when
- * only EOFs are being written. Doing it again here
- * costs very little and we know nothing is lost.
- */
- EOF_count = 0;
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count +=
- chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count +=
- chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- tinfo->play.eof++;
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- /*
- * It is possible that we tried to start playing
- * while in the middle of the audio driver calling
- * am_play_shutdown(). Thus the start would reload
- * the transfer engine but it would be shut down by
- * the ISR after am_play_shutdown() returns. The
- * appropriate flags in the audio driver will keep
- * the transfer engine from being shut back down.
- * However, if a mode switch happens after
- * am_play_shutdown() checks the mode switch flag
- * then when the ISR calls am_get_audio() the switch
- * mode flag will be set and no audio will ever be
- * transferred. Thus playing will be deadlocked with
- * the mode switch.
- *
- * The easiest way to expose this is to run showmetv
- * with 1894.mov and do insane mode switching. The
- * switch modes CV will never wake up, so we go ahead
- * and wake it up. The switch mode code will deal
- * with a bogus cv_signal().
- */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
- }
- } else {
- mutex_exit(&chptr->ch_lock);
- }
- ATRACE("am_wsvc() start play eng ret", statep);
-
- ATRACE("am_wsvc() returning", chptr);
-
- return (0);
-
-} /* am_wsvc() */
-
-/*
- * am_apply_gain_balance()
- *
- * Description:
- * Apply gain and balance to the canonical audio data buffer.
- *
- * Arguments:
- * int *buf Pointer to the canonical audio data
- * int samples Number of samples
- * int channels MONO or STEREO
- * int gain Gain, 0 - 255
- * int balance Balance, 0 - 64
- *
- * Returns:
- * void
- */
-void
-am_apply_gain_balance(int *buf, int samples, int channels, int gain,
- int balance)
-{
- int l_gain;
- int r_gain;
-
- ATRACE("in am_apply_gain_balance()", buf);
- ATRACE_32("am_apply_gain_balance() samples", samples);
- ATRACE_32("am_apply_gain_balance() channels", channels);
- ATRACE_32("am_apply_gain_balance() gain", gain);
- ATRACE_32("am_apply_gain_balance() balance", balance);
-
- if (channels == AUDIO_CHANNELS_MONO) {
- l_gain = gain;
- for (; samples; buf++, samples--) {
- *buf = (*buf * l_gain) >> AM_MAX_GAIN_SHIFT;
- }
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT((samples % 1) == 0);
-
- l_gain = r_gain = gain;
-
- if (balance < AUDIO_MID_BALANCE) {
- /* leave l gain alone and scale down r gain */
- r_gain = (r_gain * balance) >> AM_TIMES_32_SHIFT;
- } else if (balance > AUDIO_MID_BALANCE) {
- /* leave r gain alone and scale down l gain */
- l_gain = (l_gain * (64 - balance)) >> AM_TIMES_32_SHIFT;
- }
-
- for (; samples; buf += 2, samples -= 2) {
- buf[0] = (buf[0] * l_gain) >> AM_MAX_GAIN_SHIFT;
- buf[1] = (buf[1] * r_gain) >> AM_MAX_GAIN_SHIFT;
- }
- }
-
- ATRACE("am_apply_gain_balance() done", buf);
-
-} /* am_apply_gain_balance() */
-
-/*
- * am_convert_int_mono_stereo()
- *
- * Description:
- * Convert a buffer between mono and stereo. Both the source and
- * destination buffers are 32-bit integers. The number of samples
- * is updated to match the new number of samples.
- *
- * CAUTION: The calling routine must ensure that the dest is large
- * enough for the data, or we'll panic.
- *
- * Arguments:
- * int *src Input data buffer
- * int *dest Output data buffer
- * int *samples Ptr to he number of samples to convert
- * int src_chs Input channels
- * int dest_chs Output channels
- *
- * Returns:
- * void
- */
-void
-am_convert_int_mono_stereo(int *src, int *dest, int *samples, int src_chs,
- int dest_chs)
-{
- size_t size;
- int i;
- int val;
-
- ATRACE("in am_convert_int_mono_stereo()", src);
-
- if (src_chs == dest_chs) {
- /*
- * The same size so no translation needed, just copy.
- * size = samples * sizeof (int)
- */
- size = *samples << AM_TIMES_4_SHIFT;
- bcopy(src, dest, size);
-
- } else if (src_chs > dest_chs) {
- /* convert from stereo to mono */
- *samples >>= AM_TIMES_2_SHIFT;
- for (i = *samples; i--; ) {
- /* average the left and right channels */
- val = *src++;
- val += *src++;
- *dest++ = val >> AM_HALF_ENERGY_SHIFT;
- }
- } else {
- ASSERT(src_chs < dest_chs);
- /* convert from mono to stereo */
- for (i = *samples; i--; ) {
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
- *samples <<= AM_TIMES_2_SHIFT;
- }
-
- ATRACE("am_convert_int_mono_stereo() done", dest);
-
-} /* am_convert_int_mono_stereo() */
-
-/*
- * am_convert_to_int()
- *
- * Description:
- * Convert a buffer of various precisions and encodings into 16-bit
- * linear PCM stored in a 32-bit int. If the input is unsigned PCM
- * we convert it to signed PCM while converting it.
- *
- * CAUTION: The calling routine must ensure that the outbuf is large
- * enough for the data, or we'll panic.
- *
- * Arguments:
- * void *inbuf Input data buffer
- * int *outbuf Output data buffer
- * int samples The number of samples to convert
- * int precision The precision of the input buffer.
- * int encoding The encoding of the input buffer.
- * int flags Flags, including AM_PRIV_8/16_TRANS
- *
- * Returns:
- * void
- */
-void
-am_convert_to_int(void *inbuf, int *outbuf, int samples, int precision,
- int encoding, int flags)
-{
- int i;
-
- ATRACE("in am_convert_to_int()", inbuf);
-
- if (precision == AUDIO_PRECISION_16) { /* do the easy case first */
- int16_t *src = (int16_t *)inbuf;
-
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- ATRACE_32("am_convert_to_int() 16-Bit", samples);
-
- if (flags & AM_PRIV_16_TRANS) {
- for (i = samples; i--; ) {
- *outbuf++ = (int)*src++ + INT16_MIN;
- }
- } else {
- for (i = samples; i--; ) {
- *outbuf++ = (int)*src++;
- }
- }
- } else { /* now the hard case, 8-bit */
- int16_t *aptr;
- int8_t *src = (int8_t *)inbuf;
-
- ASSERT(precision == AUDIO_PRECISION_8);
-
- if (encoding == AUDIO_ENCODING_ULAW) {
- aptr = _8ulaw2linear16;
- ATRACE("am_convert_to_int() 8-bit u-law", aptr);
-
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- /* the conv. array does the scaling */
- *outbuf++ = (int)aptr[(unsigned char)*src++];
- }
- } else if (encoding == AUDIO_ENCODING_ALAW) {
- aptr = _8alaw2linear16;
- ATRACE("am_convert_to_int() 8-bit A-law", aptr);
-
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- /* the conv. array does the scaling */
- *outbuf++ = (int)aptr[(unsigned char)*src++];
- }
- } else if (encoding == AUDIO_ENCODING_LINEAR8 ||
- (flags & AM_PRIV_8_TRANS)) {
- /*
- * Copy the data into the buffer with a shift to
- * make signed.
- */
- for (i = samples; i--; ) {
- *outbuf++ = (((int)*src++ & AM_CHAR2INT_MASK) -
- INT8_MAX) << AM_256_SHIFT;
- }
- } else {
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- *outbuf++ = (int)(*src++) << AM_256_SHIFT;
- }
- }
- }
-
- ATRACE("am_convert_to_int() done", outbuf);
-
-} /* am_convert_to_int() */
-
-/*
- * am_reprocess()
- *
- * Description:
- * Process the original data, which am_p_process() created, into sample
- * rate converted audio.
- *
- * Unlike am_p_process() we don't have the opportunity to minimize the
- * sample rate conversion processing because we can't take advantage of
- * converting between mono and stereo.
- *
- * It is possible we need to convert original audio that has been
- * partially played. So see if we may need to fix the processed
- * data pointers.
- *
- * CAUTION: This routine can be called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * CAUTION: It is not possible to update the sample rate converter in
- * this routine because it may be called when switching modes
- * and thus the configuration information may be in transition
- * and not accurate. Thus the calling routines must ensure the
- * the converter is ready.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * audio_data_t *data Original and new processed data struct
- *
- * Returns:
- * AUDIO_SUCCESS Data converted and saved
- * AUDIO_FAILURE Data conversion and save failed, audio lost
- */
-int
-am_reprocess(audio_ch_t *chptr, audio_data_t *data)
-{
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *psrs = ad_infop->ad_play.ad_conv;
- int *tmp;
- int tmp_size;
- uint_t hw_channels = stpptr->am_hw_pchs;
- int mode = stpptr->am_pstate->apm_mode;
- int orig_samples;
- int src_samples;
- int *data_start;
- int *conv;
- size_t orig_size_plus_pb;
- size_t orig_size;
-
- ATRACE("in am_reprocess()", data);
-
- /* don't let mode switch happen while we sample rate convert */
- mutex_enter(&stpptr->am_mode_lock);
-
- /* make sure we need to process the data */
- if (mode != AM_MIXER_MODE || ad_infop->ad_codec_type != AM_TRAD_CODEC) {
- /* we don't SRC this data */
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() don't SRC", mode);
- return (AUDIO_FAILURE);
- }
-
- /* figure out the number of samples */
- orig_samples = data->adata_osize >> AM_TIMES_4_SHIFT;
- orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = orig_size + chpptr->acp_ch_pbuf_size;
- ATRACE_32("am_reprocess() BUF orig_samples", orig_samples);
-
- /*
- * Make sure we've got good sample rate converter buffers. If we fail
- * the calling routine will throw away the audio. There aren't more
- * chances to process the audio.
- */
- if (am_update_src_buffer(chptr, orig_samples, hw_channels,
- AUDIO_PLAY) == AUDIO_SUCCESS) {
- ATRACE("am_reprocess() update_src_buffer() okay", 0);
- src_samples = orig_samples;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() calling update_src_buffer() failed",
- mode);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_reprocess() src_samples", src_samples);
-
- /* Only do extra work if necessary */
- if (chpptr->acp_ch_pbuf_size > 0) {
-
- /* Make sure we have good conversion buffers */
- if (am_update_conv_buffer(chptr, orig_size_plus_pb,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(1) couldn't allocate memory, "
- "audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* Set conv pointing to pconv2 */
- conv = chpptr->acp_ch_pconv2;
-
- /* Set data_start pointing to where incoming data begins */
- data_start = conv + (chpptr->acp_ch_pbuf_size >>
- AM_TIMES_4_SHIFT);
-
- /* We have to copy orig data to data_start */
- bcopy(data->adata_orig, data_start, orig_size);
- } else {
- /* Set conv pointing to orig data */
- conv = data->adata_orig;
- }
-
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr), hw_channels,
- AUDIO_PLAY, conv, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >> AM_TIMES_4_SHIFT));
-
- /* if successful then copy to proc */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- data->adata_proc = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (data->adata_proc) {
- bcopy(tmp, data->adata_proc, tmp_size);
- data->adata_psize = tmp_size;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() couldn't allocate new buffer",
- 0);
- return (AUDIO_FAILURE);
- }
- data->adata_psize = tmp_size;
- data->adata_peptr = (char *)data->adata_proc + tmp_size;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() SRC failed", 0);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("am_reprocess() orig", data->adata_orig);
- ATRACE("am_reprocess() optr", data->adata_optr);
- ATRACE("am_reprocess() oeptr", data->adata_oeptr);
- ATRACE_32("am_reprocess() osize", data->adata_osize);
-
- /* see if we need to fix the processed data pointers */
- if (data->adata_optr != data->adata_orig) {
- long tmp;
-
- /*
- * Make a guess as to where to point to. We make sure we are
- * on a 4 byte boundary. That way we don't have to worry
- * about being in the middle of a sample.
- *
- * The equation:
- * (offset of orig data from start)*(length of proc data)
- * --------------------------------------------------------
- * (length of orig data)
- */
- tmp = ((char *)data->adata_optr - (char *)data->adata_orig) *
- data->adata_psize / data->adata_osize;
-
- /*
- * tmp is an offset, which must be added to adata_proc to
- * get adata_pptr. We mask off adata_pptr so that regardless
- * of the format of the data we always are on a sample frame
- * boundary.
- */
- data->adata_pptr = (char *)data->adata_proc +
- (tmp & ~AM_MISC_MASK);
- } else {
- /* on a boundary, so the pointers are easy */
- data->adata_pptr = data->adata_proc;
- }
-
- ATRACE("am_reprocess() proc", data->adata_proc);
- ATRACE("am_reprocess() pptr", data->adata_pptr);
- ATRACE("am_reprocess() peptr", data->adata_peptr);
- ATRACE_32("am_reprocess() psize", data->adata_psize);
-
- /* we don't need to block mode switching now */
- mutex_exit(&stpptr->am_mode_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_reprocess() */
-
-/*
- * am_send_signal()
- *
- * Description:
- * This routine is used to send signals back to user land processes.
- *
- * We always create a prototype signal message, but we use dupb() to
- * actually send up the queue.
- *
- * NOTE: We don't lock the tchptr because the state is frozen thus
- * channels can't be allocated or freed. However they can
- * have their state updated. The worst that can happen is
- * we miss a channel to send a signal on, which isn't that
- * bad. And this is only when open()ing or close()ing. Since
- * those operations send a signal we're covered.
- *
- * NOTE: This routine must be called with as_lock held.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * am_apm_private_t *stpptr Pointer to APM private data
- *
- * Returns:
- * void
- */
-void
-am_send_signal(audio_state_t *statep, am_apm_private_t *stpptr)
-{
- audio_ch_t *tchptr;
- mblk_t *mp = stpptr->am_sig_mp;
- mblk_t *dup_mp;
- int i;
- int max_chs;
-
- ATRACE("in am_send_signal()", statep);
-
- ASSERT(!MUTEX_HELD(&statep->as_lock));
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- ATRACE("am_send_signal() AM_SIGNAL_ALL_CTL", mp);
-
- /* look for AUDIOCTL channels */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip unallocated, non-AUDIOCTL and closing channels */
-
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid == 0 ||
- (((am_ch_private_t *)tchptr->ch_private)->acp_flags &
- AM_CHNL_CLOSING)) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE("am_send_signal() tchptr", tchptr);
- if ((dup_mp = dupb(mp)) == NULL) {
- ATRACE("am_send_signal() AUDIOCTL "
- "couldn't allocate duplicate message", tchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "signal() couldn't allocate duplicate "
- "message to send signal, signal lost");
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE_32("am_send_signal() AM_SIGNAL_ALL_CTL putnext()",
- tchptr->ch_info.ch_number);
- ASSERT((((am_ch_private_t *)tchptr->ch_private)->acp_flags &
- AM_CHNL_CLOSING) == 0);
-
- am_safe_putnext(tchptr, dup_mp);
-
- ATRACE("am_send_signal() "
- "AM_SIGNAL_ALL_CTL putnext() done", dup_mp);
-
- mutex_exit(&tchptr->ch_lock);
- }
-
- ATRACE("am_send_signal() done", statep);
-
-} /* am_send_signal() */
-
-/*
- * am_update_conv_buffer()
- *
- * Description:
- * Make sure the conversion to 32-bit linear PCM buffers are large
- * enough. If not then the ones are allocated. Both buffers are always
- * set to the same size.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * size_t size The size we need
- * int dir AUDIO_PLAY or AUDIO_RECORD, not both
- *
- * Returns:
- * AUDIO_SUCCESS Buffers okay
- * AUDIO_FAILURE Buffer allocation failed
- */
-int
-am_update_conv_buffer(audio_ch_t *chptr, size_t size, int dir)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- void *tmp1;
- void *tmp2;
-
- ATRACE("in am_update_conv_buffer()", chptr);
- ATRACE("am_update_conv_buffer() size", size);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- ASSERT(dir != AUDIO_BOTH);
-
- if (dir == AUDIO_PLAY) {
- if (chpptr->acp_ch_pconv_siz &&
- size <= chpptr->acp_ch_pconv_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_pconv1);
- ASSERT(chpptr->acp_ch_pconv2);
- return (AUDIO_SUCCESS);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (chpptr->acp_ch_rconv_siz &&
- size <= chpptr->acp_ch_rconv_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_rconv1);
- ASSERT(chpptr->acp_ch_rconv2);
- return (AUDIO_SUCCESS);
- }
- }
-
- if ((tmp1 = kmem_zalloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_conv_buffer() kmem_zalloc(1) failed", NULL);
- return (AUDIO_FAILURE);
- }
- if ((tmp2 = kmem_zalloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_conv_buffer() kmem_zalloc(2) failed", NULL);
- kmem_free(tmp1, size);
- return (AUDIO_FAILURE);
- }
- ATRACE("am_update_conv_buffer() new buffers", size);
-
- if (dir == AUDIO_PLAY) {
- ASSERT(size >= chpptr->acp_ch_pbuf_size);
- if (chpptr->acp_ch_pconv1) {
- bcopy(chpptr->acp_ch_pconv1, tmp1,
- chpptr->acp_ch_pbuf_size);
- kmem_free(chpptr->acp_ch_pconv1,
- chpptr->acp_ch_pconv_siz);
- }
- if (chpptr->acp_ch_pconv2) {
- bcopy(chpptr->acp_ch_pconv2, tmp2,
- chpptr->acp_ch_pbuf_size);
- kmem_free(chpptr->acp_ch_pconv2,
- chpptr->acp_ch_pconv_siz);
- }
- chpptr->acp_ch_pconv1 = tmp1;
- chpptr->acp_ch_pconv2 = tmp2;
- chpptr->acp_ch_pconv_siz = size;
- } else {
- ASSERT(size >= chpptr->acp_ch_rbuf_size);
- if (chpptr->acp_ch_rconv1) {
- bcopy(chpptr->acp_ch_rconv1, tmp1,
- chpptr->acp_ch_rbuf_size);
- kmem_free(chpptr->acp_ch_rconv1,
- chpptr->acp_ch_rconv_siz);
- }
- if (chpptr->acp_ch_rconv2) {
- bcopy(chpptr->acp_ch_rconv2, tmp2,
- chpptr->acp_ch_rbuf_size);
- kmem_free(chpptr->acp_ch_rconv2,
- chpptr->acp_ch_rconv_siz);
- }
- chpptr->acp_ch_rconv1 = tmp1;
- chpptr->acp_ch_rconv2 = tmp2;
- chpptr->acp_ch_rconv_siz = size;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_update_conv_buffer() */
-
-/*
- * am_update_src_buffer()
- *
- * Description:
- * Make sure the sample rate conversion buffers are large enough. If
- * not then the ones are allocated. Both buffers are always set to
- * the same size.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * int samples The number of samples to convert
- * uint_t hw_channels Number of hardware channels
- * int dir AUDIO_PLAY or AUDIO_RECORD, not both
- *
- * Returns:
- * AUDIO_SUCCESS Buffers okay
- * AUDIO_FAILURE Buffer allocation failed, buffers 0ed
- */
-int
-am_update_src_buffer(audio_ch_t *chptr, int samples, uint_t hw_channels,
- int dir)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *srs;
- audio_info_t *info = chptr->ch_info.info;
- size_t size;
- void *tmp1;
- void *tmp2;
-
- ATRACE("in am_update_src_buffer()", chptr);
- ATRACE_32("am_update_src_buffer() samples", samples);
-
- ASSERT(MUTEX_HELD(&stpptr->am_mode_lock));
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- ASSERT(dir != AUDIO_BOTH);
-
- if (dir == AUDIO_PLAY) {
- srs = ad_infop->ad_play.ad_conv;
- size = srs->ad_src_size(AM_SRC_CHPTR2HDL(chptr),
- &info->play, AUDIO_PLAY, samples, hw_channels);
- if (chpptr->acp_ch_psrc_siz &&
- size <= chpptr->acp_ch_psrc_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_psrc1);
- ASSERT(chpptr->acp_ch_psrc2);
- return (AUDIO_SUCCESS);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- srs = ad_infop->ad_record.ad_conv;
- size = srs->ad_src_size(AM_SRC_CHPTR2HDL(chptr),
- &info->record, AUDIO_RECORD, samples, hw_channels);
- if (chpptr->acp_ch_rsrc_siz &&
- size <= chpptr->acp_ch_rsrc_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_rsrc1);
- ASSERT(chpptr->acp_ch_rsrc2);
- return (AUDIO_SUCCESS);
- }
- }
-
- if ((tmp1 = kmem_alloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_src_buffer() kmem_alloc(1) failed", NULL);
- return (AUDIO_FAILURE);
- }
- if ((tmp2 = kmem_alloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_src_buffer() kmem_alloc(2) failed", NULL);
- kmem_free(tmp1, size);
- return (AUDIO_FAILURE);
- }
-
- if (dir == AUDIO_PLAY) {
- if (chpptr->acp_ch_psrc1) {
- kmem_free(chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc_siz);
- }
- if (chpptr->acp_ch_psrc2) {
- kmem_free(chpptr->acp_ch_psrc2,
- chpptr->acp_ch_psrc_siz);
- }
- chpptr->acp_ch_psrc1 = tmp1;
- chpptr->acp_ch_psrc2 = tmp2;
- chpptr->acp_ch_psrc_siz = size;
- } else {
- if (chpptr->acp_ch_rsrc1) {
- kmem_free(chpptr->acp_ch_rsrc1,
- chpptr->acp_ch_rsrc_siz);
- }
- if (chpptr->acp_ch_rsrc2) {
- kmem_free(chpptr->acp_ch_rsrc2,
- chpptr->acp_ch_rsrc_siz);
- }
- chpptr->acp_ch_rsrc1 = tmp1;
- chpptr->acp_ch_rsrc2 = tmp2;
- chpptr->acp_ch_rsrc_siz = size;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_update_src_buffer() */
-
-/*
- * Private routines used only by this file.
- */
-
-/*
- * am_flush()
- *
- * Description:
- * Flush the data stream. We handle both play and record. In order
- * to flush we have to clear out any play buffers so we have to stop
- * and then restart. This applies to both play and record.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * void
- */
-static void
-am_flush(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_info_t *tinfo;
- mblk_t *tmp;
-
- ATRACE("in am_flush()", q);
-
- ASSERT(chptr);
-
- /* are we flushing the play side? */
- if (*mp->b_rptr & FLUSHW) {
- ATRACE("am_flush() flushing play side", 0);
- flushq(q, FLUSHDATA);
- *mp->b_rptr &= ~FLUSHW;
-
- mutex_enter(&chptr->ch_lock);
-
- /* flush accumulated data */
- audio_sup_flush_audio_data(chptr);
-
- /*
- * Flush the DMA engine and Codec, but only if this
- * channel points to the hardware and is an AUDIO
- * channel.
- */
- tinfo = chptr->ch_info.info;
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- if (chptr->ch_info.dev_type == AUDIO &&
- (chptr->ch_info.info == apm_infop->apm_ad_state ||
- ad_infop->ad_codec_type == AM_MS_CODEC)) {
- /* before we can flush the DMA engine we must stop it */
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_play(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
- mutex_enter(&chptr->ch_lock);
-
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- /* we don't change pause flag, it can be set */
- }
-
- /* update the played sample count */
- if (stpptr->am_pstate->apm_mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- tinfo->play.samples +=
- ad_infop->ad_play.ad_conv->ad_src_adjust(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY,
- chpptr->acp_psamples_p);
- } else {
- tinfo->play.samples += chpptr->acp_psamples_p;
- }
- chpptr->acp_psamples_c = 0;
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_p = 0;
-
- /* by definition we are empty */
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_flush() flushing play done", q);
- }
-
- /* now for the record side */
- if (*mp->b_rptr & FLUSHR) {
- ATRACE("am_flush() flushing record side", 0);
-
- /*
- * Flush the DMA engine and Codec, but only if this channel
- * points to the hardware and is an AUDIO channel.
- */
- if (chptr->ch_info.dev_type == AUDIO) {
- /*
- * We only flush AUDIO channels, there's nothing on
- * AUDIOCTL channels to flush.
- */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
- if (tinfo->record.active &&
- (chptr->ch_info.info == apm_infop->apm_ad_state ||
- ad_infop->ad_codec_type == AM_MS_CODEC)) {
- /*
- * Before we can flush the DMA engine we
- * must stop it.
- */
- mutex_exit(&chptr->ch_lock);
-
- am_ad_stop_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
-
- /*
- * Flush any partially captured data. This
- * needs to be done before we restart recording.
- */
- mutex_enter(&chptr->ch_lock);
- if (chpptr->acp_rec_mp) {
- tmp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
- mutex_exit(&chptr->ch_lock);
-
- freemsg(tmp);
- } else {
- mutex_exit(&chptr->ch_lock);
- }
-
- /* restart the record */
- if (am_ad_start_record(statep,
- apm_infop->apm_private, ad_infop,
- chptr->ch_info.ch_number,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_WARN, "couldn't restart record "
- "after flush");
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- }
- } else {
- /*
- * Not currently recording but we still
- * need to flush any partial buffers.
- */
- if (chpptr->acp_rec_mp) {
- tmp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
- mutex_exit(&chptr->ch_lock);
-
- freemsg(tmp);
- } else {
- mutex_exit(&chptr->ch_lock);
- }
- }
- }
-
- /* send the flush back up to the STREAMS head */
- *mp->b_rptr &= ~FLUSHW; /* clear the write */
- qreply(q, mp);
- mp = NULL; /* stop freemsg() */
-
- ATRACE("am_flush() flushing read done", q);
- }
-
- if (mp) {
- freemsg(mp);
- }
-
- ATRACE("am_flush() returning", q);
-
-} /* am_flush() */
-
-/*
- * am_p_process()
- *
- * Description:
- * Process the message block into canonical form. If in MIXER mode
- * then we also sample rate convert it to match the hardware. When
- * done the original data and the converted data, if present, are
- * saved in an audio_data_t structure. If sample rate conversion
- * fails we don't worry about it. There is a second chance when
- * the samples are mixed.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * void *buf Ptr to the original msg block being
- * processed
- * size_t size The size of the data buffer in bytes
- * int **orig_data Ptr to the original canonical audio ptr
- * size_t *orig_size Ptr to the original audio size
- * int **proc_data Ptr to the processed canonical audio ptr
- * size_t *proc_size Ptr to the processed audio size
- *
- * Returns:
- * AUDIO_SUCCESS Data converted and saved
- * AUDIO_FAILURE Data conversion and save failed, audio lost
- */
-static int
-am_p_process(audio_ch_t *chptr, void *buf, size_t size, int **orig_data,
- size_t *orig_size, int **proc_data, size_t *proc_size)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *psrs = ad_infop->ad_play.ad_conv;
- int *dest;
- int *src;
- int *tmp;
- int tmp_size;
- uint_t channels;
- uint_t encoding;
- uint_t precision;
- uint_t hw_channels;
- int i;
- int mode;
- int orig_samples;
- int src_samples;
- int val;
- int *conv;
- int *data_start;
- size_t orig_size_plus_pb;
-
- ATRACE("in am_p_process()", buf);
- ATRACE("am_p_process() size", size);
-
- ASSERT(MUTEX_HELD(&stpptr->am_mode_lock));
-
- /* set after we are frozen */
- info = chptr->ch_info.info;
- channels = info->play.channels;
- encoding = info->play.encoding;
- precision = info->play.precision;
- hw_channels = stpptr->am_hw_pchs;
- mode = stpptr->am_pstate->apm_mode;
-
- /* figure out the number of samples */
- orig_samples = size / (precision >> AUDIO_PRECISION_SHIFT);
- *orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = *orig_size + chpptr->acp_ch_pbuf_size;
- ATRACE_32("am_p_process() BUF orig_size", *orig_size);
- ATRACE_32("am_p_process() BUF orig_samples", orig_samples);
-
- /*
- * It is possible that an odd sample write has happened. This can
- * happen when the system is very busy and partial STREAMS messages
- * are created. Or when an application just plain makes a mistake.
- * We chop off the partial sample and press on. This does mean it is
- * possible that the next buffer will be out of sync. If it was due to
- * the STREAMS message being chopped off then hopefully this just
- * finish off the messed up buffer and all will be back in sync. If it
- * was because the app is in error, then there's not much hope.
- *
- * This applies only for stereo, mono can be odd.
- */
- if (channels == AUDIO_CHANNELS_STEREO) {
- if ((orig_samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE("am_p_process() stereo samples chopped",
- orig_samples);
-
- /* fix */
- orig_samples = orig_samples -
- (orig_samples % AUDIO_CHANNELS_STEREO);
- *orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = *orig_size +
- chpptr->acp_ch_pbuf_size;
-
- ATRACE_32("am_p_process() new BUF orig_size",
- *orig_size);
- ATRACE_32("am_p_process() new BUF orig_samples",
- orig_samples);
- }
- ATRACE("am_p_process() stereo samples okay", orig_samples);
- }
-
- /*
- * If we are going to need to do sample rate conversion then make sure
- * we've got good buffers.
- */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /*
- * Make sure we've got good sample rate converter buffers.
- * However, even if we fail we still proceed. We get a second
- * chance later on to do the sample rate conversion.
- */
- if (am_update_src_buffer(chptr, orig_samples, hw_channels,
- AUDIO_PLAY) == AUDIO_SUCCESS) {
- ATRACE("am_p_process() update_src_buffer() okay", 0);
- src_samples = orig_samples;
- } else {
- /* mark the failure */
- ATRACE_32(
- "am_p_process() calling update_src_buffer() failed",
- mode);
- src_samples = 0;
- }
- } else {
- /* setting to 0 also means don't do src */
- src_samples = 0;
- }
- ATRACE_32("am_p_process() src_samples", src_samples);
-
- /*
- * We convert to 16-bit linear in a 32-bit integer only if buf != NULL.
- *
- * For converting to canonical format or sample rate conversion
- * we need several buffers. We use acp_ch_pconv* for conversion and
- * acp_ch_pptr* for sample rate conversion. There are two buffers
- * for each, which gives us the space to toggle. We need different
- * buffers because we could be converting to 32-bit linear PCM the
- * same time we are sample rate converting.
- */
- if (am_update_conv_buffer(chptr, orig_size_plus_pb,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(1) couldn't allocate memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* prepare for failure */
- *proc_data = NULL;
- *proc_size = 0;
-
- /*
- * Do the conversions. We try to minimize data copies as much as
- * possible. There are three possible situations, and how we deal
- * with the conversions. We make sure we do the sample rate conversion
- * on the minimum amount of audio data
- *
- * same (mono --> mono or stereo --> stereo)
- * am_convert_to_int(buf) --> orig data
- * SRC(orig data) --> proc data
- *
- * mono --> stereo
- * am_convert_to_int(buf) --> tmp data
- * inline mono2stereo(tmp data) --> orig data
- * SRC(tmp data) --> tmp data
- * inline mono2stereo(tmp data) --> proc data
- *
- * stereo --> mono
- * am_convert_to_int(buf) --> tmp data
- * inline stereo2mono(tmp data) --> orig data
- * SRC(orig data) --> proc data
- */
- if (channels == hw_channels) {
- /* either mono --> mono or stereo --> stereo */
- ATRACE("am_p_process() channels == hw_channels", 0);
-
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(2) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to int and place in orig data */
- am_convert_to_int(buf, *orig_data, orig_samples, precision,
- encoding, 0);
-
- /* SRC the data if we need to */
- if (src_samples) {
-
- /* only do extra work if necessary */
- if (chpptr->acp_ch_pbuf_size > 0) {
-
- /* set conv pointing to pconv1 */
- conv = chpptr->acp_ch_pconv1;
-
- /* set data_start pointing to incoming data */
- data_start = conv + (chpptr->acp_ch_pbuf_size
- >> AM_TIMES_4_SHIFT);
-
- /* we have to copy orig data to data_start */
- bcopy(*orig_data, data_start, *orig_size);
- } else {
- /* set conv pointing to orig data */
- conv = *orig_data;
- }
-
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- channels, AUDIO_PLAY, conv, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then update info */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- bcopy(tmp, *proc_data, tmp_size);
- *proc_size = tmp_size;
- }
- }
- }
- } else if (channels < hw_channels) {
- /* mono --> stereo */
- ATRACE_32("am_p_process() to stereo", channels);
- ASSERT(channels == AUDIO_CHANNELS_MONO);
- ASSERT(hw_channels == AUDIO_CHANNELS_STEREO);
-
- /* set data_start pointing to incoming data */
- data_start = (int *)chpptr->acp_ch_pconv1 +
- (chpptr->acp_ch_pbuf_size >> AM_TIMES_4_SHIFT);
-
- /*
- * Convert to int and save. We need this mono data twice,
- * as the source for SRC and to be converted to stereo. If
- * we converted directly to stereo then we would have to
- * do SRC on stereo instead of mono.
- */
- am_convert_to_int(buf, data_start, orig_samples, precision,
- encoding, 0);
-
- /* double in size and allocate orig data to save */
- *orig_size <<= AM_TIMES_2_SHIFT;
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(2) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to stereo */
- src = data_start;
- dest = *orig_data;
- for (i = orig_samples; i--; ) {
- /* dup to left and right channels */
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
-
- /* SRC the data and then convert to stereo */
- if (src_samples) {
- /* SRC the old mono data, not the new stereo data */
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- AUDIO_CHANNELS_MONO, AUDIO_PLAY,
- chpptr->acp_ch_pconv1, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then convert to stereo and save */
- if (tmp) {
- /* sizeof (int) * 2 = 8 */
- tmp_size = src_samples << AM_TIMES_8_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- src = tmp;
- dest = *proc_data;
- for (i = src_samples; i--; ) {
- /* dup to left & right chs */
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
- *proc_size = tmp_size;
- }
- }
- }
- } else {
- /* stereo --> mono */
- ATRACE_32("am_p_process() to mono", channels);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT(hw_channels == AUDIO_CHANNELS_MONO);
-
- /* set data_start pointing to incoming data */
- data_start = (int *)chpptr->acp_ch_pconv1 +
- (chpptr->acp_ch_pbuf_size >> AM_TIMES_4_SHIFT);
-
- /* convert to int and then from stereo --> mono */
- am_convert_to_int(buf, data_start, orig_samples, precision,
- encoding, 0);
-
- /* divide in half the size and allocate orig data to save */
- *orig_size >>= AM_TIMES_2_SHIFT;
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(3) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to mono */
- src = data_start;
- dest = *orig_data;
- for (i = (orig_samples >> AM_TIMES_2_SHIFT); i--; ) {
- /* average the left and right channels */
- val = *src++;
- val += *src++;
- *dest++ = val >> AM_HALF_ENERGY_SHIFT;
- }
-
- /* SRC the data, which is already mono */
- if (src_samples) {
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- AUDIO_CHANNELS_MONO, AUDIO_PLAY,
- chpptr->acp_ch_pconv1, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then update info */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- bcopy(tmp, *proc_data, tmp_size);
- *proc_size = tmp_size;
- }
- }
- }
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_p_process() */
-
-/*
- * am_set_waiting()
- *
- * Description:
- * Go through all of the channels. If PID is set then we set the read
- * and write waiting flags for that PID only. If PID is 0 then we set
- * all of the AUDIO channels. We set the flag to the argument value.
- * This lets this routine to be used to both set and clear the flag.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * pid_t pid The PID to match
- * int value Value to set the waiting flag
- * boolean_t wantwrite If not 0 then set play.waiting
- * boolean_t wantread If not 0 then set record.waiting
- *
- * Returns:
- * void
- */
-static void
-am_set_waiting(audio_state_t *statep, pid_t pid, int value, boolean_t wantwrite,
- boolean_t wantread)
-{
- audio_ch_t *tchptr;
- audio_info_t *info;
- int i;
- int max_chs = statep->as_max_chs;
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
-
- /* skip non-audio channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* if pid then look for that PID, otherwise all others */
- if (pid && tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* pid == 0 or pid's match, so set flags */
- info = tchptr->ch_info.info;
- if (wantwrite) {
- info->play.waiting = (uchar_t)value;
- }
- if (wantread) {
- info->record.waiting = (uchar_t)value;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
-} /* am_set_waiting() */
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c
new file mode 100644
index 0000000000..66abd593d9
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c
@@ -0,0 +1,1956 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/note.h>
+#include <sys/varargs.h>
+#include <sys/stream.h>
+#include <sys/modctl.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/strsun.h>
+#include <sys/strsubr.h>
+#include <sys/taskq.h>
+
+#include <sys/audio.h>
+#include <sys/audio/audio_support.h>
+#include <sys/mixer.h>
+#include <sys/audio/audio_mixer.h>
+
+#include <sys/usb/usba/usbai_version.h>
+#include <sys/usb/usba.h>
+#include <sys/usb/clients/audio/usb_audio.h>
+#include <sys/usb/clients/audio/usb_mixer.h>
+#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
+
+#include "audio_shim.h"
+
+extern void *usb_ac_statep;
+
+extern struct cb_ops audio_cb_ops;
+
+
+/*
+ * The code here is a "shim" connecting legacy SADA USB drivers with the
+ * Boomer audio framework, translating interfaces between the two.
+ * This is an interim measure until new Boomer-native USB drivers are in place.
+ */
+
+extern void audio_dump_bytes(const uint8_t *, int);
+extern void audio_dump_words(const uint16_t *, int);
+extern void audio_dump_dwords(const uint32_t *, int);
+
+
+#define ASHIM_ENG_PLAY 0
+#define ASHIM_ENG_REC 1
+
+#define ASHIM_GET_ENG(statep, which) (&(statep)->engines[(which)])
+#define ASHIM_ENG_DIR(engp) \
+ (((engp)->af_eflags & ENGINE_OUTPUT_CAP) ? AUDIO_PLAY : AUDIO_RECORD)
+
+static int ashim_eng_start(ashim_eng_t *);
+static void ashim_eng_stop(ashim_eng_t *);
+
+static int ashim_af_open(void *arg, int flag,
+ unsigned *fragszp, unsigned *nfragsp, caddr_t *bufp);
+static void ashim_af_close(void *arg);
+static uint64_t ashim_af_count(void *arg);
+static int ashim_af_start(void *arg);
+static void ashim_af_stop(void *arg);
+static int ashim_af_format(void *arg);
+static int ashim_af_channels(void *arg);
+static int ashim_af_rate(void *arg);
+static void ashim_af_sync(void *arg, unsigned nframes);
+static size_t ashim_af_qlen(void *arg);
+
+audio_engine_ops_t ashim_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ ashim_af_open,
+ ashim_af_close,
+ ashim_af_start,
+ ashim_af_stop,
+ ashim_af_count,
+ ashim_af_format,
+ ashim_af_channels,
+ ashim_af_rate,
+ ashim_af_sync,
+ ashim_af_qlen,
+};
+
+
+#define ASHIM_BUFSCALE_MIN 1
+#define ASHIM_BUFSCALE_MAX 2000
+#define ASHIM_BUFSCALE_DEF 10
+
+/* engine buffer size in terms of fragments */
+int ashim_bufscale = ASHIM_BUFSCALE_DEF;
+
+/* use driver specified buffer size instead */
+int ashim_use_drvbuf = 0;
+
+/* format override */
+uint_t ashim_fmt_sr = 0;
+uint_t ashim_fmt_ch = 0;
+uint_t ashim_fmt_prec = 0;
+uint_t ashim_fmt_enc = 0; /* use SADA values e.g. AUDIO_ENCODING_LINEAR = 3 */
+
+/* open without starting engine */
+int ashim_eng_disable = 0;
+
+/* dump audio data */
+uint64_t ashim_dump_audio_start = 0;
+uint64_t ashim_dump_audio_len = 0;
+int ashim_dump_audio_bufsel = 0; /* 0 = shim buf; 1 = drv/dma buf */
+
+/* dump i/o related counters */
+uint64_t ashim_dump_counters_start = 0;
+uint64_t ashim_dump_counters_len = 0;
+
+/* ignore errors when setting control values */
+int ashim_ctrl_ignore_errors = 0;
+
+/*
+ * *************************************************************************
+ * audio controls
+ *
+ * Note: we cannot determine if a SADA device truly supports play or record
+ * gain adjustment until we actually try the command. Messages showing
+ * failed control updates will be printed at the DINFO ashim_debug level.
+ */
+
+#define AUDIO_CTRL_STEREO_LEFT(v) ((uint8_t)((v) & 0xff))
+#define AUDIO_CTRL_STEREO_RIGHT(v) ((uint8_t)(((v) >> 8) & 0xff))
+#define AUDIO_CTRL_STEREO_VAL(l, r) (((l) & 0xff) | (((r) & 0xff) << 8))
+
+/*
+ * framework gain range
+ */
+#define AF_MAX_GAIN 100
+#define AF_MIN_GAIN 0
+
+#define AF_MAX_GAIN_ST AUDIO_CTRL_STEREO_VAL(AF_MAX_GAIN, AF_MAX_GAIN)
+#define AF_MIN_GAIN_ST AUDIO_CTRL_STEREO_VAL(AF_MIN_GAIN, AF_MIN_GAIN)
+
+/*
+ * convert between framework and driver gain values
+ * must multiply (n) before dividing else D2F_GAIN result will be 0
+ */
+#define F2D_GAIN(n) (((n) * AUDIO_MAX_GAIN) / AF_MAX_GAIN)
+#define D2F_GAIN(n) (((n) * AF_MAX_GAIN) / AUDIO_MAX_GAIN)
+
+typedef struct ashim_ctrl_map ashim_ctrl_map_t;
+
+static uint64_t ashim_ctrl_defval(ashim_state_t *statep,
+ ashim_ctrl_map_t *mapp);
+static int ashim_ctrl_set_defaults(ashim_state_t *statep);
+static int ashim_ctrl_restore(ashim_state_t *statep);
+
+static int ashim_ctrl_rd(void *, uint64_t *);
+static int ashim_ctrl_wr_st(void *, uint64_t);
+static int ashim_ctrl_wr_mn(void *, uint64_t);
+static int ashim_ctrl_wr_bool(void *, uint64_t);
+static int ashim_ctrl_wr_ports(void *, uint64_t);
+
+static void ashim_rem_controls(ashim_state_t *statep);
+static int ashim_add_controls(ashim_state_t *statep);
+
+
+/*
+ * map framework port definitions to SADA ports
+ */
+
+typedef struct {
+ int dport;
+ const char *pname;
+} ashim_port_map_t;
+
+
+static ashim_port_map_t ashim_play_pmap[] = {
+ {AUDIO_SPEAKER, AUDIO_PORT_SPEAKER},
+ {AUDIO_HEADPHONE, AUDIO_PORT_HEADPHONES},
+ {AUDIO_LINE_OUT, AUDIO_PORT_LINEOUT},
+ {AUDIO_SPDIF_OUT, AUDIO_PORT_SPDIFOUT},
+ {AUDIO_AUX1_OUT, AUDIO_PORT_AUX1OUT},
+ {AUDIO_AUX2_OUT, AUDIO_PORT_AUX2OUT}
+};
+static int ashim_play_pmap_len =
+ sizeof (ashim_play_pmap) / sizeof (ashim_port_map_t);
+
+
+static ashim_port_map_t ashim_rec_pmap[] = {
+ {AUDIO_MICROPHONE, AUDIO_PORT_MIC},
+ {AUDIO_LINE_IN, AUDIO_PORT_LINEIN},
+ {AUDIO_CD, AUDIO_PORT_CD},
+ {AUDIO_SPDIF_IN, AUDIO_PORT_SPDIFIN},
+ {AUDIO_AUX1_IN, AUDIO_PORT_AUX1IN},
+ {AUDIO_AUX2_IN, AUDIO_PORT_AUX2IN},
+ {AUDIO_CODEC_LOOPB_IN, AUDIO_PORT_STEREOMIX}
+};
+static int ashim_rec_pmap_len =
+ sizeof (ashim_rec_pmap) / sizeof (ashim_port_map_t);
+
+
+/*
+ * map frameowork controls to SADA controls
+ */
+struct ashim_ctrl_map {
+ int dcmd;
+ int dir;
+ audio_ctrl_desc_t acd;
+ audio_ctrl_wr_t af_wr;
+ audio_ctrl_rd_t af_rd;
+};
+
+#define DESC_ST(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_STEREO, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = AF_MAX_GAIN, \
+ .acd_minvalue = AF_MIN_GAIN, \
+}
+#define FUNC_ST \
+ &ashim_ctrl_wr_st, &ashim_ctrl_rd
+
+
+#define DESC_MN(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_MONO, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = AF_MAX_GAIN, \
+ .acd_minvalue = AF_MIN_GAIN, \
+}
+#define FUNC_MN \
+ &ashim_ctrl_wr_mn, &ashim_ctrl_rd
+
+
+#define DESC_BOOL(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_BOOLEAN, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = 1, \
+ .acd_minvalue = 0, \
+}
+#define FUNC_BOOL \
+ &ashim_ctrl_wr_bool, &ashim_ctrl_rd
+
+
+#define DESC_OUTS(n, f) { \
+ .acd_name = AUDIO_CTRL_ID_OUTPUTS, \
+ .acd_type = AUDIO_CTRL_TYPE_ENUM, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE | \
+ AUDIO_CTRL_FLAG_MULTI, \
+ .acd_maxvalue = (n), \
+ .acd_minvalue = (n), \
+}
+
+#define DESC_INS(n, f) { \
+ .acd_name = AUDIO_CTRL_ID_INPUTS, \
+ .acd_type = AUDIO_CTRL_TYPE_ENUM, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = (n), \
+ .acd_minvalue = (n), \
+}
+#define FUNC_PORTS \
+ &ashim_ctrl_wr_ports, &ashim_ctrl_rd
+
+
+/*
+ * sada <-> framework translation table
+ * a DESC_NULL() for audio_ctrl_desc_t is used to indicate a
+ * non-registered sada control that needs some initialization or be used
+ * internally by the shim
+ *
+ * Note: currently, usb_ac only notifies the framework of play volume changes
+ * from HID so the volume control the only one using AUDIO_CTRL_FLAG_POLL
+ */
+static ashim_ctrl_map_t ashim_ctrl_map[] = {
+ {AM_SET_GAIN, AUDIO_PLAY,
+ DESC_ST(AUDIO_CTRL_ID_VOLUME, AUDIO_CTRL_FLAG_MAINVOL |
+ AUDIO_CTRL_FLAG_PLAY | AUDIO_CTRL_FLAG_POLL),
+ FUNC_ST},
+
+ {AM_SET_GAIN, AUDIO_PLAY,
+ DESC_MN(AUDIO_CTRL_ID_VOLUME, AUDIO_CTRL_FLAG_MAINVOL |
+ AUDIO_CTRL_FLAG_PLAY | AUDIO_CTRL_FLAG_POLL),
+ FUNC_MN},
+
+ {AM_SET_GAIN, AUDIO_RECORD,
+ DESC_ST(AUDIO_CTRL_ID_RECGAIN, AUDIO_CTRL_FLAG_RECVOL |
+ AUDIO_CTRL_FLAG_REC),
+ FUNC_ST},
+
+ {AM_SET_GAIN, AUDIO_RECORD,
+ DESC_MN(AUDIO_CTRL_ID_RECGAIN, AUDIO_CTRL_FLAG_RECVOL |
+ AUDIO_CTRL_FLAG_REC),
+ FUNC_MN},
+
+ {AM_SET_MONITOR_GAIN, AUDIO_RECORD,
+ DESC_MN(AUDIO_CTRL_ID_MONGAIN, AUDIO_CTRL_FLAG_MONVOL |
+ AUDIO_CTRL_FLAG_MONITOR),
+ FUNC_MN},
+
+ {AM_MIC_BOOST, AUDIO_RECORD,
+ DESC_BOOL(AUDIO_CTRL_ID_MICBOOST, 0),
+ FUNC_BOOL},
+
+ {AM_SET_PORT, AUDIO_PLAY,
+ DESC_OUTS(0, 0),
+ FUNC_PORTS},
+
+ {AM_SET_PORT, AUDIO_RECORD,
+ DESC_INS(0, 0),
+ FUNC_PORTS},
+};
+static int ashim_ctrl_map_len =
+ sizeof (ashim_ctrl_map) / sizeof (ashim_ctrl_map_t);
+
+
+/*
+ * *************************************************************************
+ * shim support routines
+ */
+
+int ashim_debug = DBG_WARN;
+
+void
+vdprint(debug_level_t lvl, const char *fmt, va_list adx)
+{
+ if (ashim_debug < lvl)
+ return;
+
+ vcmn_err(CE_CONT, fmt, adx);
+}
+
+void
+dprint(debug_level_t lvl, const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(lvl, fmt, adx);
+ va_end(adx);
+}
+
+void
+dwarn(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_WARN, fmt, adx);
+ va_end(adx);
+}
+
+void
+dinfo(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_INFO, fmt, adx);
+ va_end(adx);
+}
+
+void
+ddtl(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_DETAIL, fmt, adx);
+ va_end(adx);
+}
+
+
+/*
+ * get the maximum format specification the device supports
+ */
+static void
+ashim_max_fmt(ashim_state_t *statep, int dir, ashim_fmt_t *fmtp)
+{
+ am_ad_ch_cap_t *capp = &statep->ad_infop->ad_play;
+ am_ad_cap_comb_t *combp = statep->ad_infop->ad_play_comb;
+
+ uint_t *srs, *chs;
+ uint_t sr, ch, prec, enc, val;
+ int i;
+
+ if (dir == AUDIO_RECORD) {
+ capp = &statep->ad_infop->ad_record;
+ combp = statep->ad_infop->ad_rec_comb;
+ }
+ srs = capp->ad_mixer_srs.ad_srs;
+ chs = capp->ad_chs;
+
+ for (i = 0, sr = 0; srs[i]; i++) {
+ val = srs[i];
+ if (val > sr)
+ sr = val;
+ }
+
+ for (i = 0, ch = 0; chs[i]; i++) {
+ val = chs[i];
+ if (val > ch)
+ ch = val;
+ }
+
+ for (i = 0, prec = 0, enc = 0; combp[i].ad_prec; i++) {
+ val = combp[i].ad_prec;
+ if (val > prec)
+ prec = val;
+
+ val = combp[i].ad_enc;
+ if (val > enc)
+ enc = val;
+ }
+
+ fmtp->sr = ashim_fmt_sr ? ashim_fmt_sr : sr;
+ fmtp->ch = ashim_fmt_ch ? ashim_fmt_ch : ch;
+ fmtp->prec = ashim_fmt_prec ? ashim_fmt_prec : prec;
+ fmtp->enc = ashim_fmt_enc ? ashim_fmt_enc : enc;
+}
+
+
+/*
+ * calls the driver's setup routine if present
+ * For USB audio, this opens a pipe to the endpoint usb_as
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static int
+ashim_ad_setup(ashim_state_t *statep, int dir)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ if (ad_entry->ad_setup == NULL)
+ return (AUDIO_SUCCESS);
+
+ return (ad_entry->ad_setup(AUDIO_SHIMST2HDL(statep), dir));
+}
+
+
+/*
+ * calls the driver's teardown routine if present.
+ * Note that the amount of teardowns must match the amount of setups used
+ * in each direction.
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static void
+ashim_ad_teardown(ashim_state_t *statep, int dir)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ if (ad_entry->ad_teardown != NULL)
+ ad_entry->ad_teardown(AUDIO_SHIMST2HDL(statep), dir);
+}
+
+
+/*
+ * sets the audio format (sample rate, channels, precision, encoding)
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static int
+ashim_set_fmt(ashim_state_t *statep, int dir, ashim_fmt_t *fmtp)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ return (ad_entry->ad_set_format(AUDIO_SHIMST2HDL(statep), dir,
+ fmtp->sr, fmtp->ch, fmtp->prec, fmtp->enc));
+}
+
+
+static int
+ashim_af_fmt(ashim_fmt_t *fmtp)
+{
+ switch (fmtp->enc) {
+ case AUDIO_ENCODING_ULAW:
+ return (AUDIO_FORMAT_ULAW);
+ case AUDIO_ENCODING_ALAW:
+ return (AUDIO_FORMAT_ALAW);
+ case AUDIO_ENCODING_DVI:
+ return (AUDIO_FORMAT_NONE);
+ case AUDIO_ENCODING_LINEAR8:
+ return (AUDIO_FORMAT_U8);
+ case AUDIO_ENCODING_LINEAR:
+ break;
+ default:
+ return (AUDIO_FORMAT_NONE);
+ }
+
+ switch (fmtp->prec) {
+ case 8:
+ return (AUDIO_FORMAT_S8);
+ case 16:
+ return (AUDIO_FORMAT_S16_NE);
+ case 24:
+ return (AUDIO_FORMAT_S24_NE);
+ case 32:
+ return (AUDIO_FORMAT_S32_NE);
+ default:
+ break;
+ }
+ return (AUDIO_FORMAT_NONE);
+}
+
+
+static void
+ashim_rem_eng(ashim_state_t *statep, ashim_eng_t *engp)
+{
+ if (statep->af_devp == NULL || engp->af_engp == NULL)
+ return;
+
+ audio_dev_remove_engine(statep->af_devp, engp->af_engp);
+ audio_engine_free(engp->af_engp);
+ engp->af_engp = NULL;
+
+ if (statep->engcnt > 0)
+ statep->engcnt--;
+}
+
+
+static int
+ashim_add_eng(ashim_state_t *statep, int dir)
+{
+ audio_dev_t *af_devp = statep->af_devp;
+ ashim_eng_t *engp;
+ audio_engine_t *af_engp;
+ int rv = AUDIO_FAILURE;
+ int which;
+
+ if (dir == AUDIO_PLAY) {
+ which = ASHIM_ENG_PLAY;
+ engp = ASHIM_GET_ENG(statep, which);
+ engp->af_eflags = ENGINE_OUTPUT_CAP;
+ engp->prinfop = &statep->ad_infop->ad_defaults->play;
+ engp->name = "PLAY";
+ } else {
+ which = ASHIM_ENG_REC;
+ engp = ASHIM_GET_ENG(statep, which);
+ engp->af_eflags = ENGINE_INPUT_CAP;
+ engp->prinfop = &statep->ad_infop->ad_defaults->record;
+ engp->name = "RECORD";
+ }
+
+ mutex_init(&engp->lock, NULL, MUTEX_DRIVER, NULL);
+
+ engp->statep = statep;
+
+ ashim_max_fmt(statep, dir, &engp->fmt);
+ engp->af_fmt = ashim_af_fmt(&engp->fmt);
+
+ af_engp = audio_engine_alloc(&ashim_engine_ops, engp->af_eflags);
+ if (af_engp == NULL) {
+ audio_dev_warn(af_devp, "audio_engine_alloc failed");
+ goto OUT;
+ }
+
+ engp->af_engp = af_engp;
+ audio_engine_set_private(af_engp, engp);
+ audio_dev_add_engine(af_devp, af_engp);
+
+ engp->flags = ENG_ENABLED;
+
+ statep->engcnt++;
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ ashim_rem_eng(statep, engp);
+
+ return (rv);
+}
+
+
+static int
+ashim_set_config(ashim_state_t *statep, ashim_ctrl_t *ctrlp, int cmd, int dir,
+ int arg1, int arg2)
+{
+ int (*fn)(audiohdl_t, int, int, int, int) =
+ statep->ad_infop->ad_entry->ad_set_config;
+
+ ddtl("%s - ashim_set_config: cmd 0x%x, dir %d, arg1 0x%x, arg2 0x%x\n",
+ statep->dstr, cmd, dir, arg1, arg2);
+
+ if (fn(AUDIO_SHIMST2HDL(statep), cmd, dir, arg1, arg2) !=
+ AUDIO_SUCCESS) {
+ dinfo("%s: failed update control %s "
+ "with cmd 0x%x, dir %d, arg1 0x%x, arg2 0x%x",
+ statep->dstr, ctrlp->acd.acd_name, cmd, dir, arg1, arg2);
+ return (EIO);
+ }
+
+ return (0);
+}
+
+
+static int
+ashim_ctrl_set_defaults(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp;
+ int rv = AUDIO_SUCCESS;
+
+ for (ctrlp = statep->controls; ctrlp; ctrlp = ctrlp->nextp) {
+ if (audio_control_write(ctrlp->af_ctrlp, ctrlp->defval)) {
+ dinfo("%s: setting control %s to default value "
+ "0x%llx failed\n",
+ statep->dstr, ctrlp->acd.acd_name,
+ (long long unsigned)ctrlp->defval);
+ rv = AUDIO_FAILURE;
+ }
+ }
+ return (rv);
+}
+
+
+static int
+ashim_ctrl_restore(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp;
+ int rv = AUDIO_SUCCESS;
+
+ for (ctrlp = statep->controls; ctrlp; ctrlp = ctrlp->nextp) {
+ if (ctrlp->af_wr((void *)ctrlp, ctrlp->cval) != 0) {
+ dinfo("%s: restoring "
+ "control %s to value 0x%llx failed",
+ statep->dstr, ctrlp->acd.acd_name,
+ (long long unsigned)ctrlp->cval);
+ rv = AUDIO_FAILURE;
+ }
+ }
+ return (rv);
+}
+
+
+static inline void
+ashim_dump_audio(ashim_eng_t *engp, void *buf, int sz)
+{
+ if (engp->io_count >= ashim_dump_audio_start &&
+ engp->io_count - ashim_dump_audio_start < ashim_dump_audio_len) {
+ int samples = sz >> engp->smszshift;
+ int frames = samples >> engp->frsmshift;
+
+ cmn_err(CE_NOTE, "\n\n======= %s - %s: REQUEST #%llu, "
+ "BUF I/O #%llu, SAMPLES %d (%d frames, %d bytes), "
+ "BUF ADDR 0x%p =======\n",
+ engp->statep->dstr, engp->name,
+ (unsigned long long)engp->io_count,
+ (unsigned long long)engp->bufio_count,
+ samples, frames, sz, buf);
+
+ if (sz <= 0)
+ return;
+
+ switch (engp->fmt.prec) {
+ case 8:
+ case 24:
+ audio_dump_bytes((uint8_t *)buf, sz);
+ break;
+ case 16:
+ audio_dump_words((uint16_t *)buf, sz >> 1);
+ break;
+ case 32:
+ audio_dump_dwords((uint32_t *)buf, sz >> 2);
+ break;
+ }
+ }
+}
+
+
+static inline void
+ashim_dump_counters(ashim_eng_t *engp, unsigned frames, int bufcnt)
+{
+ if (engp->io_count >= ashim_dump_counters_start &&
+ engp->io_count - ashim_dump_counters_start <
+ ashim_dump_counters_len) {
+ int samples = frames << engp->frsmshift;
+ int sz = samples << engp->smszshift;
+
+ if (bufcnt >= 0) {
+ cmn_err(CE_CONT, "======= %s - %s: buf i/o %d of "
+ "REQUEST #%llu, SAMPLES %d "
+ "(%d frames, %d bytes)\n",
+ engp->statep->dstr, engp->name, bufcnt,
+ (unsigned long long)engp->io_count, samples,
+ frames, sz);
+ } else {
+ cmn_err(CE_CONT, "======= %s - %s: REQUEST #%llu, "
+ "SAMPLES %d (%d frames, %d bytes)\n",
+ engp->statep->dstr, engp->name,
+ (unsigned long long)engp->io_count,
+ samples, frames, sz);
+ }
+ }
+}
+
+
+/*
+ * moves data between driver buffer and framework/shim buffer
+ */
+static void
+ashim_eng_bufio(ashim_eng_t *engp, void *buf, size_t sz)
+{
+ size_t cpsz = sz;
+ caddr_t *src, *dst, *dp;
+
+ if (engp->af_eflags & ENGINE_OUTPUT_CAP) {
+ src = &engp->bufpos;
+ dst = (caddr_t *)&buf;
+ } else {
+ src = (caddr_t *)&buf;
+ dst = &engp->bufpos;
+ }
+ dp = ashim_dump_audio_bufsel ? (caddr_t *)&buf : &engp->bufpos;
+
+ /*
+ * Wrap. If sz is exactly the remainder of the buffer
+ * (bufpos + sz == bufendp) then the second cpsz should be 0 and so
+ * the second memcpy() should have no effect, with bufpos updated
+ * to the head of the buffer.
+ */
+ if (engp->bufpos + sz >= engp->bufendp) {
+ cpsz = (size_t)engp->bufendp - (size_t)engp->bufpos;
+ (void) memcpy(*dst, *src, cpsz);
+
+ if (ashim_dump_audio_len)
+ ashim_dump_audio(engp, *dp, cpsz);
+
+ buf = (caddr_t)buf + cpsz;
+ engp->bufpos = engp->bufp;
+ cpsz = sz - cpsz;
+ }
+
+ if (cpsz) {
+ (void) memcpy(*dst, *src, cpsz);
+
+ if (ashim_dump_audio_len)
+ ashim_dump_audio(engp, *dp, cpsz);
+
+ engp->bufpos += cpsz;
+ }
+ engp->bufio_count++;
+}
+
+
+static void
+ashim_prtstats(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+
+ dinfo("%s - %s: driver i/o: %llu, framework i/o: %llu, "
+ "frames: %llu\n", statep->dstr, engp->name,
+ (long long unsigned)engp->io_count,
+ (long long unsigned)engp->bufio_count,
+ (long long unsigned)engp->frames);
+}
+
+
+/*
+ * *************************************************************************
+ * audio control routines
+ */
+
+static uint64_t
+ashim_ctrl_defval(ashim_state_t *statep, ashim_ctrl_map_t *mapp)
+{
+ audio_prinfo_t *play_prp = &statep->ad_infop->ad_defaults->play;
+ audio_prinfo_t *rec_prp = &statep->ad_infop->ad_defaults->record;
+ const char *cname = mapp->acd.acd_name;
+ uint64_t cval = 0;
+ uint64_t gain;
+ ashim_fmt_t fmt;
+
+ if (strcmp(cname, AUDIO_CTRL_ID_VOLUME) == 0) {
+ ashim_max_fmt(statep, AUDIO_PLAY, &fmt);
+ if (fmt.ch == 0)
+ return (0);
+
+ gain = D2F_GAIN(play_prp->gain);
+ if (fmt.ch == 1)
+ cval = gain;
+ else
+ cval = AUDIO_CTRL_STEREO_VAL(gain, gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_RECGAIN) == 0) {
+ ashim_max_fmt(statep, AUDIO_RECORD, &fmt);
+ if (fmt.ch == 0)
+ return (0);
+
+ gain = D2F_GAIN(rec_prp->gain);
+ if (fmt.ch == 1)
+ cval = gain;
+ else
+ cval = AUDIO_CTRL_STEREO_VAL(gain, gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_MONGAIN) == 0) {
+ cval = D2F_GAIN(statep->ad_infop->ad_defaults->monitor_gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_MICBOOST) == 0) {
+ cval = 0;
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_OUTPUTS) == 0) {
+ cval = play_prp->port;
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_INPUTS) == 0) {
+ cval = rec_prp->port;
+ }
+
+ return (cval);
+}
+
+
+static ashim_ctrl_t *
+ashim_find_ctrl_dcmd(ashim_state_t *statep, int dcmd, int dir)
+{
+ ashim_ctrl_t *ctrlp;
+
+ for (ctrlp = statep->controls; ctrlp != NULL; ctrlp = ctrlp->nextp) {
+ if (ctrlp->dcmd == dcmd && ctrlp->dir == dir)
+ break;
+ }
+ return (ctrlp);
+}
+
+
+/*
+ * control callback and related routines
+ */
+
+static int
+ashim_ctrl_gain_mutable(ashim_ctrl_t *ctrlp, int left, int right)
+{
+ ashim_state_t *statep = ctrlp->statep;
+ int gain;
+
+ if (left == 0 && right == 0)
+ gain = 0;
+ else if (left != 0)
+ gain = left;
+ else
+ gain = right;
+
+ if (ctrlp->dcmd == AM_SET_GAIN && ctrlp->dir == AUDIO_PLAY) {
+ /*
+ * mute when gain = 0, and on the transition when gain != 0
+ * but do not set unmute cmds during non-zero changes
+ */
+ if (gain == 0) {
+ ctrlp->flags |= CTRL_MUTED;
+
+ if (ashim_set_config(statep, ctrlp, AM_OUTPUT_MUTE,
+ AUDIO_PLAY, 1, 0) != AUDIO_SUCCESS)
+ return (EIO);
+
+ } else if (ctrlp->flags & CTRL_MUTED) {
+ ctrlp->flags &= ~CTRL_MUTED;
+
+ if (ashim_set_config(statep, ctrlp, AM_OUTPUT_MUTE,
+ AUDIO_PLAY, 0, 0) != AUDIO_SUCCESS)
+ return (EIO);
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+ * control read callback
+ */
+static int
+ashim_ctrl_rd(void *arg, uint64_t *cvalp)
+{
+ ashim_ctrl_t *ctrlp = arg;
+
+ mutex_enter(&ctrlp->lock);
+ *cvalp = ctrlp->cval;
+ mutex_exit(&ctrlp->lock);
+
+ return (0);
+}
+
+
+/*
+ * stereo level control callback
+ */
+static int
+ashim_ctrl_wr_st(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int left, right;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ left = AUDIO_CTRL_STEREO_LEFT(cval);
+ right = AUDIO_CTRL_STEREO_RIGHT(cval);
+
+ if (left < AF_MIN_GAIN || left > AF_MAX_GAIN ||
+ right < AF_MIN_GAIN || right > AF_MAX_GAIN) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ left = F2D_GAIN(left);
+ right = F2D_GAIN(right);
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, left,
+ 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, right,
+ 1) != AUDIO_SUCCESS) {
+ /* restore previous left gain value */
+ (void) ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ left, 0);
+ goto OUT;
+ }
+
+ rv = ashim_ctrl_gain_mutable(ctrlp, left, right);
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * mono level control callback
+ */
+static int
+ashim_ctrl_wr_mn(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int gain;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ if (cval < (uint64_t)AF_MIN_GAIN || cval > (uint64_t)AF_MAX_GAIN) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ gain = (int)F2D_GAIN(cval);
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ gain, 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = ashim_ctrl_gain_mutable(ctrlp, gain, 0);
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * boolean control callback
+ */
+/*ARGSUSED*/
+static int
+ashim_ctrl_wr_bool(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ (int)cval, 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * port selection control callback
+ */
+static int
+ashim_ctrl_wr_ports(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int dports = cval & 0xff;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ if ((cval & ~ctrlp->acd.acd_minvalue) !=
+ (ctrlp->acd.acd_maxvalue & ~ctrlp->acd.acd_minvalue)) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, dports,
+ 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * audio control registration related routines
+ */
+
+static ashim_ctrl_t *
+ashim_ctrl_alloc(void)
+{
+ return (kmem_zalloc(sizeof (ashim_ctrl_t), KM_SLEEP));
+}
+
+
+static void
+ashim_ctrl_free(ashim_ctrl_t *ctrlp)
+{
+ kmem_free(ctrlp, sizeof (ashim_ctrl_t));
+}
+
+
+static void
+ashim_ctrl_insert(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ ctrlp->nextp = statep->controls;
+ statep->controls = ctrlp;
+}
+
+
+/*
+ * returns the amount of modifiable ports
+ */
+static int
+ashim_ctrl_init_ports(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ audio_prinfo_t *prp;
+ ashim_port_map_t *pmap;
+ int pmaplen;
+ int i;
+ int count = 0;
+
+ if (ctrlp->dir == AUDIO_PLAY) {
+ prp = &statep->ad_infop->ad_defaults->play;
+ pmap = ashim_play_pmap;
+ pmaplen = ashim_play_pmap_len;
+ } else {
+ prp = &statep->ad_infop->ad_defaults->record;
+ pmap = ashim_rec_pmap;
+ pmaplen = ashim_rec_pmap_len;
+ }
+
+ /*
+ * look at all SADA supported ports then set the corresponding
+ * framework defined bits in the control description if the driver
+ * informs us that it is present (avail_ports) and if it can be
+ * toggled on/off (mod_ports)
+ */
+ for (i = 0; i < pmaplen; i++) {
+ ctrlp->acd.acd_enum[i] = pmap[i].pname;
+
+ if (pmap[i].dport & prp->avail_ports) {
+ ctrlp->acd.acd_maxvalue |= pmap[i].dport;
+
+ dinfo("%s: available port: "
+ "driver 0x%x, framework 0x%s\n",
+ statep->dstr, pmap[i].dport, pmap[i].pname);
+ }
+ if (pmap[i].dport & prp->mod_ports) {
+ ctrlp->acd.acd_minvalue |= pmap[i].dport;
+
+ dinfo("%s: modifiable port: "
+ "(driver 0x%x, framework %s)\n",
+ statep->dstr, pmap[i].dport, pmap[i].pname);
+
+ count++;
+ }
+ }
+
+ return (count);
+}
+
+
+static void
+ashim_ctrl_fini(ashim_ctrl_t *ctrlp)
+{
+ mutex_destroy(&ctrlp->lock);
+}
+
+
+/*
+ * returns 0 if initialization is successful; failure to initialize is
+ * not fatal so caller should deallocate and continue on to the next control
+ */
+static int
+ashim_ctrl_init(ashim_state_t *statep, ashim_ctrl_t *ctrlp,
+ ashim_ctrl_map_t *mapp)
+{
+ ctrlp->dcmd = mapp->dcmd;
+ ctrlp->dir = mapp->dir;
+ ctrlp->acd = mapp->acd;
+ ctrlp->af_ctrlp = NULL;
+ ctrlp->defval = ashim_ctrl_defval(statep, mapp);
+ ctrlp->cval = ctrlp->defval;
+ ctrlp->af_wr = mapp->af_wr;
+ ctrlp->statep = statep;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_ENUM &&
+ ashim_ctrl_init_ports(statep, ctrlp) <= 1) {
+ dinfo("%s: no more than one modifiable port detected for "
+ "control %s, enabling and skipping\n",
+ statep->dstr, ctrlp->acd.acd_name);
+
+ (void) ctrlp->af_wr((void *)ctrlp, ctrlp->defval);
+ return (1);
+ }
+
+ mutex_init(&ctrlp->lock, NULL, MUTEX_DRIVER, NULL);
+ return (0);
+}
+
+
+/*
+ * heuristic to determine if a control is actually present by writing the
+ * default value and checking if the operation succeeds
+ */
+/*ARGSUSED*/
+static int
+ashim_ctrl_test(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ return (ctrlp->af_wr((void *)ctrlp, ctrlp->defval));
+}
+
+
+static void
+ashim_rem_controls(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp = statep->controls;
+ ashim_ctrl_t *nextp;
+
+ while (ctrlp != NULL) {
+ if (ctrlp->af_ctrlp != NULL)
+ audio_dev_del_control(ctrlp->af_ctrlp);
+
+ nextp = ctrlp->nextp;
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ ctrlp = nextp;
+ }
+
+ /* required */
+ statep->controls = NULL;
+}
+
+
+static int
+ashim_add_controls(ashim_state_t *statep)
+{
+ int rv = AUDIO_FAILURE;
+ int i;
+ ashim_ctrl_map_t *mapp;
+ ashim_ctrl_t *ctrlp;
+ audio_ctrl_t *af_ctrlp;
+ ashim_fmt_t playfmt = {0};
+ ashim_fmt_t recfmt = {0};
+ ashim_fmt_t *fmtp;
+ int ad_feat = statep->ad_infop->ad_defaults->hw_features;
+
+ if (ad_feat & AUDIO_HWFEATURE_PLAY)
+ ashim_max_fmt(statep, AUDIO_PLAY, &playfmt);
+
+ if (ad_feat & AUDIO_HWFEATURE_RECORD)
+ ashim_max_fmt(statep, AUDIO_RECORD, &recfmt);
+
+ for (i = 0; i < ashim_ctrl_map_len; i++) {
+ mapp = &ashim_ctrl_map[i];
+ fmtp = NULL;
+
+ if (mapp->dir == AUDIO_PLAY) {
+ if (!(ad_feat & AUDIO_HWFEATURE_PLAY))
+ continue;
+
+ fmtp = &playfmt;
+ }
+ if (mapp->dir == AUDIO_RECORD) {
+ if (!(ad_feat & AUDIO_HWFEATURE_RECORD))
+ continue;
+
+ fmtp = &recfmt;
+ }
+
+ if (mapp->dcmd == AM_SET_GAIN) {
+ if (fmtp->ch == 0)
+ continue;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_MONO &&
+ fmtp->ch != 1)
+ continue;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_STEREO &&
+ fmtp->ch != 2)
+ continue;
+ }
+
+ ctrlp = ashim_ctrl_alloc();
+
+ if (ashim_ctrl_init(statep, ctrlp, mapp)) {
+ ashim_ctrl_free(ctrlp);
+ continue;
+ }
+
+ if (ashim_ctrl_test(statep, ctrlp)) {
+ dinfo("%s: control %s tested invalid, ignoring\n",
+ statep->dstr, ctrlp->acd.acd_name);
+
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ continue;
+ }
+
+ af_ctrlp = audio_dev_add_control(statep->af_devp, &ctrlp->acd,
+ mapp->af_rd, mapp->af_wr, (void *)ctrlp);
+
+ if (af_ctrlp == NULL) {
+ audio_dev_warn(statep->af_devp, "failed to add "
+ "control %s", ctrlp->acd.acd_name);
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ goto OUT;
+ }
+
+ dinfo("%s: added control %s, type: %d, "
+ "flags: 0x%x, min: 0x%llx, max: 0x%llx, default: 0x%llx\n",
+ statep->dstr, ctrlp->acd.acd_name, ctrlp->acd.acd_type,
+ ctrlp->acd.acd_flags,
+ ctrlp->acd.acd_minvalue, ctrlp->acd.acd_maxvalue,
+ ctrlp->defval);
+
+ ctrlp->af_ctrlp = af_ctrlp;
+ ashim_ctrl_insert(statep, ctrlp);
+ }
+
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ ashim_rem_controls(statep);
+ return (rv);
+}
+
+
+/*
+ * **************************************************************************
+ * replacements for SADA framework interfaces
+ */
+
+void *
+audio_sup_get_private(audiohdl_t handle)
+{
+ return (AUDIO_HDL2SHIMST(handle)->private);
+}
+
+
+void
+audio_sup_set_private(audiohdl_t handle, void *private)
+{
+ AUDIO_HDL2SHIMST(handle)->private = private;
+}
+
+
+int
+audio_sup_unregister(audiohdl_t handle)
+{
+ ashim_state_t *statep;
+
+ if (handle == NULL)
+ return (AUDIO_SUCCESS);
+
+ statep = AUDIO_HDL2SHIMST(handle);
+
+ kmem_free(statep, sizeof (*statep));
+ return (AUDIO_SUCCESS);
+}
+
+
+audiohdl_t
+audio_sup_register(dev_info_t *dip)
+{
+ ashim_state_t *statep = NULL;
+ int inst;
+ const char *nm;
+
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ statep->dip = dip;
+
+ inst = ddi_get_instance(dip);
+ nm = ddi_driver_name(dip);
+
+ (void) snprintf(statep->dstr, sizeof (statep->dstr),
+ "%s#%d", nm, inst);
+
+ return (AUDIO_SHIMST2HDL(statep));
+}
+
+
+int
+am_unregister(audiohdl_t handle)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+
+ if (statep->af_devp == NULL)
+ return (AUDIO_SUCCESS);
+
+ if (statep->flags & AF_REGISTERED) {
+ if (audio_dev_unregister(statep->af_devp) != DDI_SUCCESS) {
+ dwarn("%s: am_unregister: audio_dev_unregister() "
+ "failed\n", statep->dstr);
+
+ return (AUDIO_FAILURE);
+ }
+ statep->flags &= ~AF_REGISTERED;
+ }
+
+ return (AUDIO_SUCCESS);
+}
+
+
+/*ARGSUSED*/
+int
+am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ int i;
+
+ if (statep == NULL)
+ return (AUDIO_SUCCESS);
+
+ if (statep->af_devp == NULL)
+ return (AUDIO_SUCCESS);
+
+ if ((statep->flags & AF_REGISTERED) &&
+ audio_dev_unregister(statep->af_devp) != DDI_SUCCESS) {
+ dwarn("%s: am_detach: audio_dev_unregister() failed\n",
+ statep->dstr);
+ return (AUDIO_FAILURE);
+ }
+ statep->flags &= ~AF_REGISTERED;
+
+ for (i = 0; i < statep->engcnt; i++)
+ ashim_rem_eng(statep, &statep->engines[i]);
+
+ if (statep->controls != NULL)
+ ashim_rem_controls(statep);
+
+ audio_dev_free(statep->af_devp);
+ statep->af_devp = NULL;
+
+ return (AUDIO_SUCCESS);
+}
+
+
+int
+am_attach(audiohdl_t handle, ddi_attach_cmd_t cmd,
+ am_ad_info_t *ad_infop)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ audio_dev_t *af_devp;
+ int ad_feat = ad_infop->ad_defaults->hw_features;
+ int rv = AUDIO_FAILURE;
+
+ if (cmd != DDI_ATTACH)
+ return (AUDIO_FAILURE);
+
+ af_devp = audio_dev_alloc(statep->dip, 0);
+ audio_dev_set_description(af_devp, ad_infop->ad_dev_info->name);
+ audio_dev_set_version(af_devp, ad_infop->ad_dev_info->version);
+
+ statep->af_devp = af_devp;
+ statep->ad_infop = ad_infop;
+
+ /*
+ * setup the engines
+ */
+ statep->engcnt = 0;
+
+ /*
+ * If the device supports both play and record we require duplex
+ * functionality. However, there are no known simplex SADA devices.
+ * In this case we limit the device to play only.
+ */
+ if ((ad_feat & AUDIO_HWFEATURE_PLAY) &&
+ (ad_feat & AUDIO_HWFEATURE_RECORD) &&
+ !(ad_feat & AUDIO_HWFEATURE_DUPLEX)) {
+ audio_dev_warn(af_devp, "missing duplex feature "
+ "required for record");
+
+ ad_feat &= ~AUDIO_HWFEATURE_RECORD;
+ ad_infop->ad_defaults->hw_features = ad_feat;
+ }
+
+ if (ad_feat & AUDIO_HWFEATURE_PLAY) {
+ if (ashim_add_eng(statep, AUDIO_PLAY) != AUDIO_SUCCESS)
+ goto OUT;
+ }
+ if (ad_feat & AUDIO_HWFEATURE_RECORD) {
+ if (ashim_add_eng(statep, AUDIO_RECORD) != AUDIO_SUCCESS)
+ goto OUT;
+ }
+
+ if (ashim_add_controls(statep) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (ashim_ctrl_set_defaults(statep) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (audio_dev_register(af_devp) != DDI_SUCCESS) {
+ audio_dev_warn(af_devp, "audio_dev_register() failed");
+ goto OUT;
+ }
+ statep->flags |= AF_REGISTERED;
+
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ (void) am_detach(handle, DDI_DETACH);
+ return (rv);
+}
+
+
+int
+am_get_audio(audiohdl_t handle, void *buf, int samples)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp = ASHIM_GET_ENG(statep, ASHIM_ENG_PLAY);
+ unsigned reqframes = samples >> engp->frsmshift;
+ unsigned frames;
+ unsigned i;
+ size_t sz;
+ int bufcnt = 0;
+ caddr_t bp = buf;
+
+ mutex_enter(&engp->lock);
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, reqframes, -1);
+
+ if (!(engp->flags & ENG_STARTED)) {
+ ddtl("%s - am_get_audio: stop in progress, ignoring\n",
+ statep->dstr);
+ mutex_exit(&engp->lock);
+ return (0);
+ }
+ mutex_exit(&engp->lock);
+
+ /* break requests from the driver into fragment sized chunks */
+ for (i = 0; i < reqframes; i += frames) {
+ mutex_enter(&engp->lock);
+
+ frames = reqframes - i;
+ if (frames > engp->fragfr)
+ frames = engp->fragfr;
+
+ sz = (frames << engp->frsmshift) << engp->smszshift;
+
+ if (ashim_dump_counters_len) {
+ ashim_dump_counters(engp, frames, bufcnt);
+ }
+ bufcnt++;
+
+ /* must move data before updating framework */
+ ashim_eng_bufio(engp, bp, sz);
+ engp->frames += frames;
+ bp += sz;
+
+ mutex_exit(&engp->lock);
+ audio_engine_consume(engp->af_engp);
+ }
+
+ mutex_enter(&engp->lock);
+ engp->io_count++;
+ mutex_exit(&engp->lock);
+
+ return (samples);
+}
+
+
+void
+am_play_shutdown(audiohdl_t handle)
+{
+
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ ad_entry->ad_stop_play(handle);
+
+ /*
+ * XXX
+ * used to notify framework that device's engine has stopped
+ */
+}
+
+
+void
+am_send_audio(audiohdl_t handle, void *buf, int samples)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp = ASHIM_GET_ENG(statep, ASHIM_ENG_REC);
+ unsigned reqframes = samples >> engp->frsmshift;
+ unsigned frames;
+ unsigned i;
+ size_t sz;
+ int bufcnt = 0;
+ caddr_t bp = buf;
+
+ mutex_enter(&engp->lock);
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, reqframes, -1);
+
+ if (!(engp->flags & ENG_STARTED)) {
+ ddtl("%s - am_send_audio: stop in progress, ignoring\n",
+ statep->dstr);
+
+ mutex_exit(&engp->lock);
+ return;
+ }
+ mutex_exit(&engp->lock);
+
+ /* break requests from the driver into fragment sized chunks */
+ for (i = 0; i < reqframes; i += frames) {
+ mutex_enter(&engp->lock);
+
+ frames = reqframes - i;
+ if (frames > engp->fragfr)
+ frames = engp->fragfr;
+
+ sz = (frames << engp->frsmshift) << engp->smszshift;
+
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, frames, bufcnt);
+ bufcnt++;
+
+ /* must move data before updating framework */
+ ashim_eng_bufio(engp, bp, sz);
+ engp->frames += frames;
+ bp += sz;
+
+ mutex_exit(&engp->lock);
+ audio_engine_produce(engp->af_engp);
+ }
+
+ mutex_enter(&engp->lock);
+ engp->io_count++;
+ mutex_exit(&engp->lock);
+}
+
+void
+audio_sup_restore_state(audiohdl_t handle)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp;
+ int i;
+ int start = 0;
+
+ (void) ashim_ctrl_restore(statep);
+
+ for (i = 0; i < statep->engcnt; i++) {
+ engp = &statep->engines[i];
+
+ mutex_enter(&engp->lock);
+ start = (engp->flags & ENG_STARTED);
+ mutex_exit(&engp->lock);
+
+ if (start)
+ (void) ashim_eng_start(engp);
+ }
+}
+
+
+/*
+ * **************************************************************************
+ * audio framework engine callbacks
+ */
+
+/*ARGSUSED*/
+static int
+ashim_af_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ ashim_state_t *statep = engp->statep;
+ int rv = EIO;
+ int dir = ASHIM_ENG_DIR(engp);
+
+
+ if (usb_ac_open(statep->dip) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "usb_ac_open failed");
+ return (EIO);
+ }
+
+ mutex_enter(&engp->lock);
+
+ if (ashim_set_fmt(statep, dir, &engp->fmt) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "set format failed");
+ goto OUT;
+ }
+
+ engp->intrate = (engp->af_eflags & ENGINE_OUTPUT_CAP) ?
+ statep->ad_infop->ad_play.ad_int_rate :
+ statep->ad_infop->ad_record.ad_int_rate;
+
+ engp->sampsz = engp->fmt.prec / 8;
+ engp->framesz = engp->sampsz * engp->fmt.ch;
+
+ if (engp->fmt.ch > 2) {
+ audio_dev_warn(statep->af_devp, "unsupported ",
+ "channel count: %u", engp->fmt.ch);
+ goto OUT;
+ }
+ if (engp->fmt.prec > 16) {
+ audio_dev_warn(statep->af_devp, "unsupported ",
+ "precision: %u", engp->fmt.prec);
+ goto OUT;
+ }
+
+ engp->frsmshift = engp->fmt.ch / 2;
+ engp->smszshift = engp->sampsz / 2;
+
+ /*
+ * In order to match the requested number of samples per interrupt
+ * from SADA drivers when computing the fragment size,
+ * we need to first truncate the floating point result from
+ * sample rate * channels / intr rate
+ * then adjust up to an even number, before multiplying it
+ * with the sample size
+ */
+ engp->fragsz = engp->fmt.sr * engp->fmt.ch / engp->intrate;
+ if (engp->fragsz & 1)
+ engp->fragsz++;
+ engp->fragsz *= engp->sampsz;
+ engp->fragfr = engp->fragsz / engp->framesz;
+
+ if (ashim_use_drvbuf) {
+ engp->bufsz = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ statep->ad_infop->ad_play.ad_bsize :
+ statep->ad_infop->ad_record.ad_bsize;
+
+ engp->nfrags = engp->bufsz / engp->fragsz;
+
+ /* adjust buf size to frag boundary */
+ if (engp->nfrags * engp->fragsz < engp->bufsz)
+ engp->nfrags++;
+
+ engp->bufsz = engp->nfrags * engp->fragsz;
+ } else {
+ if (ashim_bufscale < ASHIM_BUFSCALE_MIN ||
+ ashim_bufscale > ASHIM_BUFSCALE_MAX)
+ engp->nfrags = ASHIM_BUFSCALE_DEF;
+ else
+ engp->nfrags = ashim_bufscale;
+ engp->bufsz = engp->fragsz * engp->nfrags;
+ }
+
+ engp->bufp = kmem_zalloc(engp->bufsz, KM_SLEEP);
+ engp->bufpos = engp->bufp;
+ engp->bufendp = engp->bufp + engp->bufsz;
+ engp->frames = 0;
+ engp->io_count = 0;
+ engp->bufio_count = 0;
+
+ *fragfrp = engp->fragfr;
+ *nfragsp = engp->nfrags;
+ *bufp = engp->bufp;
+
+ if (ashim_ad_setup(statep, dir) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "device setup failed");
+ goto OUT;
+ }
+ statep->flags |= AD_SETUP;
+
+ rv = 0;
+
+ dinfo("%s - %s: "
+ "frames per frag: %u, frags in buffer: %u, frag size: %u, "
+ "intr rate: %u, buffer size: %u, buffer: 0x%p - 0x%p\n",
+ statep->dstr, engp->name,
+ *fragfrp, *nfragsp, engp->fragsz,
+ engp->intrate, engp->bufsz, *bufp, engp->bufendp);
+
+OUT:
+ mutex_exit(&engp->lock);
+ if (rv != 0)
+ ashim_af_close(arg);
+
+ return (rv);
+}
+
+
+static void
+ashim_af_close(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ ashim_state_t *statep = engp->statep;
+
+ mutex_enter(&engp->lock);
+
+ if (statep->flags & AD_SETUP) {
+ ashim_ad_teardown(statep, ASHIM_ENG_DIR(engp));
+ statep->flags &= ~AD_SETUP;
+ }
+
+ if (engp->bufp != NULL) {
+ kmem_free(engp->bufp, engp->bufsz);
+ engp->bufp = NULL;
+ engp->bufpos = NULL;
+ engp->bufendp = NULL;
+ }
+
+ ashim_prtstats(engp);
+ mutex_exit(&engp->lock);
+
+ usb_ac_close(statep->dip);
+}
+
+
+static int
+ashim_eng_start(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+ int (*start)(audiohdl_t);
+ int rv = 0;
+
+ start = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ ad_entry->ad_start_play : ad_entry->ad_start_record;
+
+ dinfo("%s: starting device %s engine\n", statep->dstr, engp->name);
+
+ if ((*start)(AUDIO_SHIMST2HDL(statep)) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "failed to start %s engine",
+ engp->name);
+ rv = EIO;
+ }
+
+ return (rv);
+}
+
+
+static void
+ashim_eng_stop(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+ void (*stop)(audiohdl_t);
+
+ stop = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ ad_entry->ad_stop_play : ad_entry->ad_stop_record;
+
+ dinfo("%s: stopping device %s engine\n", statep->dstr, engp->name);
+
+ (*stop)(AUDIO_SHIMST2HDL(statep));
+}
+
+
+static int
+ashim_af_start(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ int rv = EIO;
+
+ if (ashim_eng_disable)
+ return (rv);
+
+ mutex_enter(&engp->lock);
+ engp->flags |= ENG_STARTED;
+ mutex_exit(&engp->lock);
+
+ rv = ashim_eng_start(engp);
+
+ return (rv);
+}
+
+
+static void
+ashim_af_stop(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+
+ mutex_enter(&engp->lock);
+ engp->flags &= ~ENG_STARTED;
+ mutex_exit(&engp->lock);
+
+ ashim_eng_stop(engp);
+}
+
+
+static uint64_t
+ashim_af_count(void *arg)
+{
+ ashim_eng_t *engp = arg;
+ uint64_t val;
+
+ mutex_enter(&engp->lock);
+ val = engp->frames;
+ mutex_exit(&engp->lock);
+
+ return (val);
+}
+
+
+static int
+ashim_af_format(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->af_fmt);
+}
+
+static int
+ashim_af_channels(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->fmt.ch);
+}
+
+
+static int
+ashim_af_rate(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->fmt.sr);
+}
+
+
+/*ARGSUSED*/
+static void
+ashim_af_sync(void *arg, unsigned nframes)
+{
+ /*
+ * drivers will call ddi_dma_sync() themselves after requesting data
+ * on playback and before sending data on record through the shim
+ */
+}
+
+
+static size_t
+ashim_af_qlen(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+
+ return (engp->fragfr);
+}
+
+
+/*
+ * **************************************************************************
+ * interfaces used by USB audio
+ */
+
+/*ARGSUSED*/
+int
+am_hw_state_change(audiohdl_t handle, int cmd, int dir, int value,
+ int sleep)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_ctrl_t *ctrlp;
+ uint64_t cval = 0;
+ int64_t left, right, delta = 0;
+ int dcmd = AM_SET_GAIN;
+
+ /* only known HWSC command used */
+ if (cmd != AM_HWSC_SET_GAIN_DELTA) {
+ audio_dev_warn(statep->af_devp, "invalid HW state change "
+ "command recieved");
+ return (AUDIO_FAILURE);
+ }
+
+ ctrlp = ashim_find_ctrl_dcmd(statep, dcmd, dir);
+ if (ctrlp == NULL) {
+ audio_dev_warn(statep->af_devp, "driver control command %d "
+ "not found for HW state change command %d", dcmd, cmd);
+ return (AUDIO_FAILURE);
+ }
+
+ mutex_enter(&ctrlp->lock);
+
+ delta = D2F_GAIN(value);
+ left = AUDIO_CTRL_STEREO_LEFT(ctrlp->cval) + delta;
+ right = AUDIO_CTRL_STEREO_RIGHT(ctrlp->cval) + delta;
+
+ if (left > AF_MAX_GAIN)
+ left = AF_MAX_GAIN;
+ if (right > AF_MAX_GAIN)
+ right = AF_MAX_GAIN;
+
+ if (left < AF_MIN_GAIN)
+ left = AF_MIN_GAIN;
+ if (right < AF_MIN_GAIN)
+ right = AF_MIN_GAIN;
+
+ cval = AUDIO_CTRL_STEREO_VAL(left, right);
+ mutex_exit(&ctrlp->lock);
+
+ if (audio_control_write(ctrlp->af_ctrlp, cval)) {
+ audio_dev_warn(statep->af_devp, "updating "
+ "control %s to value 0x%llx by driver failed",
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (AUDIO_FAILURE);
+ }
+ return (AUDIO_SUCCESS);
+}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h
new file mode 100644
index 0000000000..3ec22cda37
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h
@@ -0,0 +1,161 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+#ifndef _AUDIO_SHIM_H
+#define _AUDIO_SHIM_H
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio.h>
+#include <sys/audio/audio_support.h>
+#include <sys/mixer.h>
+#include <sys/audio/audio_mixer.h>
+
+#include <sys/audio/audio_driver.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {DBG_WARN = 1, DBG_INFO, DBG_DETAIL} debug_level_t;
+
+void vdprint(debug_level_t lvl, const char *fmt, va_list adx);
+void dprint(debug_level_t lvl, const char *fmt, ...);
+void dwarn(const char *fmt, ...);
+void dinfo(const char *fmt, ...);
+void ddtl(const char *fmt, ...);
+
+
+int am_unregister(audiohdl_t handle);
+
+#define CTRL_MUTED 0x1 /* muted output gain */
+
+#define TQ_NM_MAX 64
+#define DSTR_MAX 64
+
+typedef struct ashim_config_arg ashim_config_arg_t;
+typedef struct ashim_ctrl ashim_ctrl_t;
+typedef struct ashim_fmt ashim_fmt_t;
+typedef struct ashim_eng ashim_eng_t;
+typedef struct ashim_state ashim_state_t;
+
+struct ashim_config_arg {
+ int cmd;
+ int dir;
+ int arg1;
+ int arg2;
+};
+
+struct ashim_ctrl {
+ int dcmd; /* SADA command */
+ int dir; /* play or record */
+ audio_ctrl_desc_t acd; /* description */
+ audio_ctrl_t *af_ctrlp; /* framework handle */
+ uint64_t cval; /* current control value */
+ uint64_t defval; /* default control value */
+ audio_ctrl_wr_t af_wr; /* write callback */
+
+ int flags; /* CTRL_XXX flags */
+ kmutex_t lock;
+
+ ashim_state_t *statep;
+ ashim_ctrl_t *nextp;
+};
+
+struct ashim_fmt {
+ int sr; /* sample rate */
+ uint_t ch; /* channels */
+ uint_t prec; /* precision */
+ uint_t enc; /* encoding */
+};
+
+struct ashim_eng {
+ ashim_state_t *statep;
+ audio_engine_t *af_engp;
+ int af_eflags; /* ENGINE_* flags */
+ int af_fmt; /* AUDIO_FORMAT_* flags */
+ ashim_fmt_t fmt;
+
+ unsigned intrate; /* interrupt rate */
+ unsigned sampsz; /* sample size */
+ unsigned framesz; /* frame size */
+ unsigned fragsz; /* fragment size */
+ unsigned nfrags; /* number of fragments in buffer */
+ unsigned fragfr; /* number of frames per fragment */
+ unsigned frsmshift; /* right shift: frames in sample cnt */
+ unsigned smszshift; /* left shift: sample cnt * sampsz */
+
+ caddr_t bufp; /* I/O buf; framework to/from drv */
+ unsigned bufsz; /* buffer size */
+ caddr_t bufpos; /* buffer position */
+ caddr_t bufendp; /* end of buffer */
+
+ audio_prinfo_t *prinfop; /* SADA ad_defaults play/record */
+
+ uint64_t frames; /* total frames processed since open */
+ uint64_t io_count; /* i/o requests from the driver */
+ uint64_t bufio_count; /* i/o requests to the framework */
+ char *name;
+
+#define ENG_STARTED 0x1
+#define ENG_ENABLED 0x10
+ int flags;
+
+ kmutex_t lock;
+};
+
+struct ashim_state {
+ dev_info_t *dip;
+ void *private; /* private audio driver data */
+ audio_dev_t *af_devp;
+ am_ad_info_t *ad_infop;
+
+#define ASHIM_ENG_MAX 2
+ ashim_eng_t engines[ASHIM_ENG_MAX];
+ int engcnt;
+
+ ashim_ctrl_t *controls;
+
+ char *devnm;
+ char dstr[DSTR_MAX];
+
+#define AF_REGISTERED 0x1
+#define AD_SETUP 0x10
+ int flags;
+};
+
+/*
+ * Macros used to convert between audio handles and the shim state structure.
+ */
+#define AUDIO_HDL2SHIMST(hdl) ((ashim_state_t *)(hdl))
+#define AUDIO_SHIMST2HDL(statep) ((audiohdl_t)(statep))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _AUDIO_SHIM_H */
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
index a26ba4b87b..57e9c3c0bd 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
@@ -23,13 +23,19 @@
* Use is subject to license terms.
*/
-
/*
- * AUDIO CONTROL Driver: usb_ac is a streams multiplexor that sits
- * on top of usb_as and hid and is responsible for
- * (1) providing the entry points to audio mixer framework, (2) passing
- * streams messages to and from usb_as and hid and (3) processing
- * control messages that it can handle.
+ * AUDIO CONTROL Driver:
+ * This driver is derived from the legacy SADA streams-based usb_ac driver
+ * and serves as an intermediate measure before the full conversion to the
+ * to the Boomer framework in a follow-on phase of the Boomer project, which
+ * will utilize more comprehensive USB audio features as well. Multiplexor
+ * plumbing functionality that used to be in the usb_ac_dacf DACF module is
+ * now located here.
+ *
+ * usb_ac is a multiplexor that sits on top of usb_as and hid and is
+ * responsible for (1) providing the entry points to audio mixer framework,
+ * (2) passing control commands to and from usb_as and hid and (3) processing
+ * control messages from hid/usb_ah that it can handle.
*
* 1. Mixer entry points are: usb_ac_setup(), usb_ac_teardown(),
* usb_ac_set_config(), usb_ac_set_format(), usb_ac_start_play(),
@@ -43,10 +49,8 @@
* of sound control interface of the audio device in a synchronous
* manner.
*
- * Serialization: usb_ac being a streams driver and having the requirement
- * of making non-blockings calls (USBA or streams or mixer) needs to drop
- * mutexes over such calls. But at the same time, a competing thread
- * can't be allowed to interfere with (1) pipe, (2) streams state.
+ * Serialization: A competing thread can't be allowed to interfere with
+ * (1) pipe, (2) streams state.
* So we need some kind of serialization among the asynchronous
* threads that can run in the driver. The serialization is mostly
* needed to avoid races among open/close/events/power entry points
@@ -58,9 +62,6 @@
* PM model in usb_ac: Raise power during attach. If a device is not at full
* power, raise power in the entry points. After the command is over,
* pm_idle_component() is called. The power is lowered in detach().
- *
- * locking: Warlock is not aware of the automatic locking mechanisms for
- * streams drivers.
*/
#include <sys/usb/usba/usbai_version.h>
#include <sys/usb/usba.h>
@@ -69,11 +70,12 @@
#include <sys/ndi_impldefs.h>
#include <sys/strsubr.h>
#include <sys/strsun.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sunldi.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
@@ -81,18 +83,22 @@
#include <sys/usb/clients/audio/usb_mixer.h>
#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
+/* for getting the minor node info from hid */
+#include <sys/usb/clients/hid/hidminor.h>
+#include <sys/usb/clients/audio/usb_as/usb_as.h>
+
+#include "audio_shim.h"
+
/* debug support */
uint_t usb_ac_errlevel = USB_LOG_L4;
uint_t usb_ac_errmask = (uint_t)-1;
uint_t usb_ac_instance_debug = (uint_t)-1;
-#ifdef DEBUG
/*
- * tunable timeout for usb_as response, allow at least 10 secs for control
- * cmd to timeout
+ * wait period in seconds for the HID message processing thread
+ * used primarily to check when the stream has closed
*/
-int usb_ac_wait_timeout = 10000000;
-#endif
+uint_t usb_ac_wait_hid = 1;
/*
* table for converting term types of input and output terminals
@@ -143,28 +149,19 @@ static struct {
/*
* Module linkage routines for the kernel
*/
-static int usb_ac_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
static int usb_ac_attach(dev_info_t *, ddi_attach_cmd_t);
static int usb_ac_detach(dev_info_t *, ddi_detach_cmd_t);
static int usb_ac_power(dev_info_t *, int, int);
-/*
- * STREAMS module entry points
- */
-static int usb_ac_open(queue_t *, dev_t *, int, int, cred_t *);
-static int usb_ac_close(queue_t *, int, cred_t *);
-static int usb_ac_uwput(queue_t *, mblk_t *);
-static int usb_ac_lrput(queue_t *, mblk_t *);
-
/* plumbing */
static usb_ac_plumbed_t *usb_ac_get_plumb_info(usb_ac_state_t *, char *,
uchar_t);
-static usb_ac_plumbed_t *usb_ac_get_plumb_info_from_lrq(usb_ac_state_t *,
- queue_t *);
static uint_t usb_ac_get_featureID(usb_ac_state_t *, uchar_t, uint_t,
uint_t);
-static void usb_ac_plumb_ioctl(queue_t *, mblk_t *);
+/* module entry points */
+int usb_ac_open(dev_info_t *);
+void usb_ac_close(dev_info_t *);
/* registration */
static int usb_ac_get_curr_n_channels(usb_ac_state_t *, int);
@@ -246,36 +243,52 @@ static int usb_ac_set_mute(usb_ac_state_t *, uint_t, uint_t,
static int usb_ac_set_volume(usb_ac_state_t *, uint_t, short, int dir,
int);
static int usb_ac_get_maxmin_volume(usb_ac_state_t *, uint_t, int, int,
- int);
-static void usb_ac_free_mblk(mblk_t *);
-static mblk_t *usb_ac_allocate_req_mblk(usb_ac_state_t *, int,
- void *, uint_t);
+ int, short *);
static int usb_ac_send_as_cmd(usb_ac_state_t *, usb_ac_plumbed_t *,
int, void *);
-static int usb_ac_send_format_cmd(audiohdl_t, int, int, int,
- int, int, int);
-static int usb_ac_do_setup(audiohdl_t, int, int);
-static void usb_ac_do_teardown(audiohdl_t, int, int);
-static void usb_ac_do_pause_play(audiohdl_t, int);
-static void usb_ac_do_stop_record(audiohdl_t, int);
+static int usb_ac_send_format_cmd(audiohdl_t, int, int, int, int, int);
+static int usb_ac_do_setup(audiohdl_t, int);
+static void usb_ac_do_teardown(audiohdl_t, int);
+static void usb_ac_do_stop_play(audiohdl_t);
+static void usb_ac_do_stop_record(audiohdl_t);
/* Mixer entry points */
-static int usb_ac_setup(audiohdl_t, int, int);
-static void usb_ac_teardown(audiohdl_t, int, int);
-static int usb_ac_set_config(audiohdl_t, int, int, int, int, int);
-static int usb_ac_set_format(audiohdl_t, int, int, int, int, int, int);
-static int usb_ac_start_play(audiohdl_t, int);
-static void usb_ac_pause_play(audiohdl_t, int);
-static void usb_ac_stop_play(audiohdl_t, int);
-static int usb_ac_start_record(audiohdl_t, int);
-static void usb_ac_stop_record(audiohdl_t, int);
+static int usb_ac_setup(audiohdl_t, int);
+static void usb_ac_teardown(audiohdl_t, int);
+static int usb_ac_set_config(audiohdl_t, int, int, int, int);
+static int usb_ac_set_format(audiohdl_t, int, int, int, int, int);
+static int usb_ac_start_play(audiohdl_t);
+static void usb_ac_stop_play(audiohdl_t);
+static int usb_ac_start_record(audiohdl_t);
+static void usb_ac_stop_record(audiohdl_t);
static int usb_ac_restore_audio_state(usb_ac_state_t *, int);
/*
- * External functions
+ * Mux
*/
-extern int space_store(char *key, uintptr_t ptr);
-extern void space_free(char *);
+static int usb_ac_mux_walk_siblings(usb_ac_state_t *);
+static void usb_ac_print_reg_data(usb_ac_state_t *,
+ usb_as_registration_t *);
+static int usb_ac_get_reg_data(usb_ac_state_t *, ldi_handle_t, int);
+static int usb_ac_setup_plumbed(usb_ac_state_t *, int, int, int);
+static int usb_ac_mixer_registration(usb_ac_state_t *);
+static void usb_ac_hold_siblings(usb_ac_state_t *);
+static int usb_ac_online_siblings(usb_ac_state_t *);
+static void usb_ac_rele_siblings(usb_ac_state_t *);
+static int usb_ac_mux_plumbing(usb_ac_state_t *);
+static void usb_ac_mux_plumbing_tq(void *);
+static int usb_ac_mux_unplumbing(usb_ac_state_t *);
+static void usb_ac_mux_unplumbing_tq(void *);
+static int usb_ac_plumb(usb_ac_plumbed_t *);
+static void usb_ac_unplumb(usb_ac_plumbed_t *);
+static void usb_ac_reader(void *);
+static int usb_ac_read_msg(usb_ac_plumbed_t *, mblk_t *);
+static int usb_ac_do_plumbing(usb_ac_state_t *);
+static int usb_ac_do_unplumbing(usb_ac_state_t *);
+
+/* just generic, USB Audio, 1.0 spec-compliant */
+static audio_device_t usb_dev_info =
+ { {"USB Audio"}, {"1.0"}, {"external"} };
/*
@@ -287,120 +300,30 @@ static am_ad_entry_t usb_ac_entry = {
usb_ac_set_config, /* ad_set_config() */
usb_ac_set_format, /* ad_set_format() */
usb_ac_start_play, /* ad_start_play() */
- usb_ac_pause_play, /* ad_pause_play() */
usb_ac_stop_play, /* ad_stop_play() */
usb_ac_start_record, /* ad_start_record() */
usb_ac_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
};
/* anchor for soft state structures */
-static void *usb_ac_statep;
-
-/* for passing soft state etc. to usb_ac_dacf module */
-static usb_ac_state_space_t ssp;
-
-/* STREAMS driver id and limit value structure */
-static struct module_info usb_ac_modinfo = {
- 0xffff, /* module ID number */
- "usb_ac", /* module name */
- USB_AUDIO_MIN_PKTSZ, /* minimum packet size */
- USB_AUDIO_MAX_PKTSZ, /* maximum packet size */
- USB_AC_HIWATER, /* high water mark */
- USB_AC_LOWATER /* low water mark */
-};
+void *usb_ac_statep;
-/* STREAMS queue processing procedures structures */
-/* upper read queue */
-static struct qinit usb_ac_urqueue = {
- NULL, /* put procedure */
- NULL, /* service procedure */
- usb_ac_open, /* open procedure */
- usb_ac_close, /* close procedure */
- NULL, /* unused */
- &usb_ac_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* upper write queue */
-static struct qinit usb_ac_uwqueue = {
- usb_ac_uwput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &usb_ac_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* lower read queue */
-static struct qinit usb_ac_lrqueue = {
- usb_ac_lrput,
- NULL,
- NULL,
- NULL,
- NULL,
- &usb_ac_modinfo, /* module parameters */
- NULL
-};
-
-/* lower write queue */
-static struct qinit usb_ac_lwqueue = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- &usb_ac_modinfo, /* module parameters */
- NULL
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab usb_ac_str_info = {
- &usb_ac_urqueue, /* upper read queue */
- &usb_ac_uwqueue, /* upper write queue */
- &usb_ac_lrqueue, /* lower read queue */
- &usb_ac_lwqueue, /* lower write queue */
-};
/*
* DDI Structures
- *
- * Entry points structure
*/
-static struct cb_ops usb_ac_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &usb_ac_str_info, /* cb_str */
- D_MP | D_MTPERQ, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
/* Device operations structure */
static struct dev_ops usb_ac_dev_ops = {
DEVO_REV, /* devo_rev */
0, /* devo_refcnt */
- usb_ac_getinfo, /* devo_getinfo */
+ NULL, /* devo_getinfo */
nulldev, /* devo_identify - obsolete */
nulldev, /* devo_probe - not needed */
usb_ac_attach, /* devo_attach */
usb_ac_detach, /* devo_detach */
nodev, /* devo_reset */
- &usb_ac_cb_ops, /* devi_cb_ops */
+ NULL, /* devi_cb_ops */
NULL, /* devo_busb_ac_ops */
usb_ac_power, /* devo_power */
ddi_quiesce_not_needed, /* devo_quiesce */
@@ -420,12 +343,6 @@ static struct modlinkage usb_ac_modlinkage = {
NULL /* NULL terminates the list */
};
-/* warlock directives */
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", datab))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", queue))
-_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy_t))
/* standard entry points */
int
@@ -439,19 +356,11 @@ _init(void)
return (rval);
}
+ audio_init_ops(&usb_ac_dev_ops, "usb_ac");
+
if ((rval = mod_install(&usb_ac_modlinkage)) != 0) {
ddi_soft_state_fini(&usb_ac_statep);
- }
-
- if (!rval) {
- ssp.sp = usb_ac_statep;
- ssp.restore_func = usb_ac_restore_audio_state;
- ssp.get_featureID_func = usb_ac_get_featureID;
- ssp.ac_entryp = &usb_ac_entry;
- ssp.pm_busy_component = usb_ac_pm_busy_component;
- ssp.pm_idle_component = usb_ac_pm_idle_component;
-
- rval = space_store("usb_ac", (uintptr_t)&ssp);
+ audio_fini_ops(&usb_ac_dev_ops);
}
return (rval);
@@ -466,7 +375,7 @@ _fini(void)
if ((rval = mod_remove(&usb_ac_modlinkage)) == 0) {
/* Free the soft state internal structures */
ddi_soft_state_fini(&usb_ac_statep);
- space_free("usb_ac");
+ audio_fini_ops(&usb_ac_dev_ops);
}
return (rval);
@@ -479,39 +388,6 @@ _info(struct modinfo *modinfop)
return (mod_info(&usb_ac_modlinkage, modinfop));
}
-/*ARGSUSED*/
-static int
-usb_ac_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- usb_ac_state_t *uacp = NULL;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((uacp = ddi_get_soft_state(usb_ac_statep,
- instance)) != NULL) {
- *result = uacp->usb_ac_dip;
- if (*result != NULL) {
- error = DDI_SUCCESS;
- }
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
extern uint_t nproc;
#define INIT_PROCESS_CNT 3
@@ -520,11 +396,7 @@ static int
usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
usb_ac_state_t *uacp = NULL;
- audio_sup_reg_data_t reg_data;
int instance = ddi_get_instance(dip);
- int minor;
- char *key;
- size_t key_len, len;
switch (cmd) {
case DDI_ATTACH:
@@ -580,6 +452,9 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uacp->usb_ac_instance = instance;
uacp->usb_ac_dip = dip;
+ (void) snprintf(uacp->dstr, sizeof (uacp->dstr), "%s#%d",
+ ddi_driver_name(dip), instance);
+
if (usb_client_attach(dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
"usb_client_attach failed");
@@ -608,46 +483,7 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uacp->usb_ac_default_ph = uacp->usb_ac_dev_data->dev_default_ph;
- /* register with audiosup */
- reg_data.asrd_version = AUDIOSUP_VERSION;
-
- /*
- * we register with pathname, the mgf, product, and serial number
- * strings, vid.pid, and driver name which should be pretty unique
- */
- key_len = 2 * MAXNAMELEN;
- if (uacp->usb_ac_dev_data->dev_mfg) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_mfg);
- }
- if (uacp->usb_ac_dev_data->dev_product) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_product);
- }
- if (uacp->usb_ac_dev_data->dev_serial) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_serial);
- }
-
- key = kmem_alloc(key_len, KM_SLEEP);
- (void) ddi_pathname(dip, key);
-
- len = strlen(key);
- (void) snprintf(&key[len], key_len - len, ",%s,%s,%s,%x.%x,%s",
- (uacp->usb_ac_dev_data->dev_mfg ?
- uacp->usb_ac_dev_data->dev_mfg : "-"),
- (uacp->usb_ac_dev_data->dev_product ?
- uacp->usb_ac_dev_data->dev_product : "-"),
- (uacp->usb_ac_dev_data->dev_serial ?
- uacp->usb_ac_dev_data->dev_serial : "-"),
- uacp->usb_ac_dev_data->dev_descr->idVendor,
- uacp->usb_ac_dev_data->dev_descr->idProduct,
- ddi_driver_name(dip));
-
- reg_data.asrd_key = key;
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "registering with key: %s", key);
-
- uacp->usb_ac_audiohdl = audio_sup_register(dip, &reg_data);
- kmem_free(key, key_len);
+ uacp->usb_ac_audiohdl = audio_sup_register(dip);
if (uacp->usb_ac_audiohdl == NULL) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
@@ -668,28 +504,9 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
/* we no longer need the descr tree */
usb_free_descr_tree(dip, uacp->usb_ac_dev_data);
- /* read .conf file properties */
- uacp->usb_ac_mixer_mode_enable = ddi_prop_get_int(DDI_DEV_T_ANY,
- dip, DDI_PROP_DONTPASS, "mixer-enabled", 1);
-
uacp->usb_ac_ser_acc = usb_init_serialization(dip,
USB_INIT_SER_CHECK_SAME_THREAD);
- /* create minor node */
- minor = audio_sup_construct_minor(uacp->usb_ac_audiohdl, USER1);
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "minor=%d", minor);
-
- if ((ddi_create_minor_node(dip, "mux", S_IFCHR,
- minor, NULL, 0)) != DDI_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_attach: couldn't create minor node mux");
-
- goto fail;
- }
- uacp->usb_ac_mux_minor = minor;
-
mutex_enter(&uacp->usb_ac_mutex);
/* we are online */
@@ -715,17 +532,28 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
goto fail;
}
+ USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
+ "usb_ac_attach: End");
+
/* report device */
ddi_report_dev(dip);
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_attach: End");
+ if (usb_ac_do_plumbing(uacp) != USB_SUCCESS)
+ goto fail;
return (DDI_SUCCESS);
+
fail:
if (uacp) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
"attach failed");
+
+ /* wait for plumbing thread to finish */
+ if (uacp->tqp != NULL) {
+ ddi_taskq_wait(uacp->tqp);
+ ddi_taskq_destroy(uacp->tqp);
+ uacp->tqp = NULL;
+ }
(void) usb_ac_cleanup(dip, uacp);
}
@@ -738,19 +566,67 @@ usb_ac_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
int instance = ddi_get_instance(dip);
usb_ac_state_t *uacp;
- int rval;
+ int rval = USB_FAILURE;
+ char *nm = "usb_ac_detach";
uacp = ddi_get_soft_state(usb_ac_statep, instance);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_detach:");
-
switch (cmd) {
case DDI_DETACH:
- rval = usb_ac_cleanup(dip, uacp);
+ dinfo("%s: %s - detaching\n", uacp->dstr, nm);
+
+ /* wait for plumbing thread to finish */
+ if (uacp->tqp != NULL)
+ ddi_taskq_wait(uacp->tqp);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ /* do not allow detach if still busy */
+ if (uacp->usb_ac_busy_count) {
+ dinfo("%s: %s - still busy: %d\n", uacp->dstr, nm,
+ uacp->usb_ac_busy_count);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ return (USB_FAILURE);
+ }
+
+ /*
+ * call am_unregister() to stop calls into our driver from
+ * the framework; can fail if the framework is still busy
+ */
+ if (uacp->usb_ac_audiohdl != NULL) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if (am_unregister(uacp->usb_ac_audiohdl) !=
+ AUDIO_SUCCESS) {
+ dinfo("%s: %s - am_unregister failed, "
+ "framework still busy\n",
+ uacp->dstr, nm);
+
+ return (USB_FAILURE);
+ }
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /*
+ * unplumb to stop activity from other modules, then
+ * cleanup, which will also teardown audio framework state
+ */
+ if (usb_ac_do_unplumbing(uacp) == USB_SUCCESS)
+ rval = usb_ac_cleanup(dip, uacp);
+
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(PRINT_MASK_ATTA,
+ uacp->usb_ac_log_handle, "detach failed: %s%d",
+ ddi_driver_name(dip), instance);
+ }
return ((rval == USB_SUCCESS) ? DDI_SUCCESS : DDI_FAILURE);
case DDI_SUSPEND:
+ dinfo("%s: %s - suspending\n", uacp->dstr, nm);
+
rval = usb_ac_cpr_suspend(dip);
return ((rval == USB_SUCCESS) ? DDI_SUCCESS : DDI_FAILURE);
@@ -776,8 +652,7 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
mutex_enter(&uacp->usb_ac_mutex);
uacpm = uacp->usb_ac_pm;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_cleanup: uacpm=0x%p", (void *)uacpm);
+ dinfo("%s: usb_ac_cleanup: uacpm=0x%p\n", uacp->dstr, (void *)uacpm);
ASSERT(uacp->usb_ac_busy_count == 0);
@@ -858,8 +733,6 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
usb_fini_serialization(uacp->usb_ac_ser_acc);
- ddi_remove_minor_node(dip, NULL);
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_cleanup: Ending");
@@ -877,275 +750,79 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
}
-/*
- * usb_ac_open:
- * Open entry point. Called on the plumbing minor node or
- * audio or audioctl minor nodes which we pass to audio_sup_open()
- * We do not raise power here and wait for the setup callback
- */
-/*ARGSUSED*/
-static int
-usb_ac_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
-{
- int minor = getminor(*devp);
- int instance;
- int rval;
- usb_ac_state_t *uacp;
-
- instance = audio_sup_devt_to_instance(*devp);
-
- uacp = ddi_get_soft_state(usb_ac_statep, instance);
- if (uacp == NULL) {
-
- return (ENXIO);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_busy_count++; /* This will prevent unplumbing */
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: Begin q=0x%p, minor=0x%x instance=%d "
- "open cnt=%d", (void *)q, minor, instance, uacp->usb_ac_busy_count);
-
- if (sflag) {
- USB_DPRINTF_L2(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: clone open not supported");
-
- uacp->usb_ac_busy_count--;
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (ENXIO);
- }
-
- if (minor == uacp->usb_ac_mux_minor) {
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: opening mux");
- /*
- * This is the plumbing open, initiated during attach/
- * connect_event_callback/cpr_resume/first user open.
- */
- uacp->usb_ac_busy_count--;
-
- /* Save the dev_t value of pluming q to use for lower q's */
- uacp->usb_ac_dev = *devp;
- audio_sup_set_qptr(q, *devp, (void *)uacp);
-
- /* Initialize the queue pointers */
- uacp->usb_ac_rq = q;
- uacp->usb_ac_wq = WR(q);
-
- /* release mutex while making streams framework call */
- mutex_exit(&uacp->usb_ac_mutex);
- qprocson(q);
- mutex_enter(&uacp->usb_ac_mutex);
-
- } else if (uacp->usb_ac_plumbing_state != USB_AC_STATE_PLUMBED) {
- uacp->usb_ac_busy_count--;
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (EIO);
- } else {
- /* pass the open to audio_sup_open so SADA can do its work */
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: calling audio_sup_open, q=0x%p, open_cnt=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /*
- * go to full power
- */
- usb_ac_pm_busy_component(uacp);
- (void) pm_raise_power(uacp->usb_ac_dip, 0, USB_DEV_OS_FULL_PWR);
-
- rval = audio_sup_open(q, devp, flag, sflag, credp);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (rval != 0) {
- USB_DPRINTF_L4(PRINT_MASK_OPEN,
- uacp->usb_ac_log_handle,
- "audio_sup_open rval=%d", rval);
-
- uacp->usb_ac_busy_count--;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- usb_ac_pm_idle_component(uacp);
-
- return (rval);
- }
- }
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: End q=0x%p, open cnt=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (0);
-}
-
-
-/*
- * usb_ac_close :
- * Close entry point
- */
-/*ARGSUSED*/
-static int
-usb_ac_close(queue_t *q, int flag, cred_t *credp)
+int
+usb_ac_open(dev_info_t *dip)
{
- dev_t dev = audio_sup_get_qptr_dev(q);
- int minor = getminor(dev);
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- int rval;
+ int inst = ddi_get_instance(dip);
+ usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, inst);
mutex_enter(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: Begin q=0x%p, opencount=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- /* closing the mux? */
- if (minor == uacp->usb_ac_mux_minor) {
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: closing mux plumbing stream");
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* Wait till all activity in the default pipe has drained */
- usb_ac_serialize_access(uacp);
- usb_ac_release_access(uacp);
-
- audio_sup_free_qptr(q);
- qprocsoff(q);
-
- return (0);
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- rval = audio_sup_close(q, flag, credp);
-
- if (rval != 0) {
- USB_DPRINTF_L2(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "audio_sup_close fails %d", rval);
-
- return (rval);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- /* normal streams closing */
- ASSERT(uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED);
-
- uacp->usb_ac_busy_count --;
-
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: End rval=%d q=0x%p, opencount=%d",
- rval, (void *)q, uacp->usb_ac_busy_count);
+ uacp->usb_ac_busy_count++;
mutex_exit(&uacp->usb_ac_mutex);
- usb_ac_pm_idle_component(uacp);
+ usb_ac_pm_busy_component(uacp);
+ (void) pm_raise_power(uacp->usb_ac_dip, 0, USB_DEV_OS_FULL_PWR);
return (0);
}
-/*
- * usb_ac_uwput:
- * write put entry point for the upper mux. Only PLUMB/UNPLUMB ioctls
- * are processed here. All other ioctls are passed to audio_sup routines
- * for further processing.
- */
-static int
-usb_ac_uwput(queue_t *q, mblk_t *mp)
+void
+usb_ac_close(dev_info_t *dip)
{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- int error = DDI_SUCCESS;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_uwput: q=0x%p, mp=0x%p", (void *)q, (void *)mp);
-
- ASSERT(mp != NULL);
- ASSERT(mp->b_datap != NULL);
+ int inst = ddi_get_instance(dip);
+ usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, inst);
mutex_enter(&uacp->usb_ac_mutex);
- if (uacp->usb_ac_wq == q) {
- ASSERT(mp->b_datap->db_type == M_IOCTL);
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* ioctl from plumbing thread (namely P_LINK) */
- usb_ac_plumb_ioctl(q, mp);
+ if (uacp->usb_ac_busy_count > 0)
+ uacp->usb_ac_busy_count--;
- return (error);
- }
mutex_exit(&uacp->usb_ac_mutex);
- /* Pass to audio_sup routine */
- (void) audio_sup_wput(q, mp);
-
- return (error);
+ usb_ac_pm_idle_component(uacp);
}
/*
- * usb_ac_lrput:
- * read put entry point for the lower mux. Get the response from the
- * lower module, signal usb_ac_send_as_cmd(), the thread that is waiting
- * for a response to a message sent earlier anbd pass the response
- * message block.
+ * usb_ac_read_msg:
+ * Handle asynchronous response from opened streams
*/
static int
-usb_ac_lrput(queue_t *q, mblk_t *mp)
+usb_ac_read_msg(usb_ac_plumbed_t *plumb_infop, mblk_t *mp)
{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp;
+ usb_ac_state_t *uacp = plumb_infop->acp_uacp;
int error = DDI_SUCCESS;
- usb_ac_plumbed_t *plumb_infop;
- usb_ac_streams_info_t *streams_infop = NULL;
int val;
char val1;
struct iocblk *iocp;
- uacp = ddi_get_soft_state(usb_ac_statep, instance);
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_lrput: q=0x%p, mp=0x%p, instance=%d",
- (void *)q, (void *)mp, instance);
- ASSERT(mp != NULL);
+ "usb_ac_read_msg: mp=0x%p, instance=%d", (void *)mp,
+ ddi_get_instance(uacp->usb_ac_dip));
- mutex_enter(&uacp->usb_ac_mutex);
- plumb_infop = usb_ac_get_plumb_info_from_lrq(uacp, q);
- ASSERT(plumb_infop != NULL);
+ ASSERT(mp != NULL);
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+ /*
+ * typically an M_CTL is used between modules but in order to pass
+ * through the streamhead, an M_PROTO type must be used instead
+ */
switch (mp->b_datap->db_type) {
- case M_CTL:
+ case M_PROTO:
case M_ERROR:
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"M_CTL/M_ERROR");
switch (plumb_infop->acp_driver) {
- case USB_AS_PLUMBED:
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reply from usb_as, lrq=0x%p", (void *)q);
- streams_infop = (usb_ac_streams_info_t *)
- plumb_infop->acp_data;
- ASSERT(streams_infop != NULL);
- streams_infop->acs_ac_to_as_req.acr_reply_mp = mp;
- streams_infop->acs_ac_to_as_req.acr_wait_flag = 0;
- cv_signal(&streams_infop->acs_ac_to_as_req.acr_cv);
-
- break;
case USB_AH_PLUMBED:
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "M_CTL from hid, lrq=0x%p", (void *)q);
+ "message from hid, instance=%d",
+ ddi_get_instance(plumb_infop->acp_dip));
- iocp = (struct iocblk *)mp->b_rptr;
+ iocp = (struct iocblk *)(void *)mp->b_rptr;
ASSERT(mp->b_cont != NULL);
if (uacp->usb_ac_registered_with_mixer) {
@@ -1187,7 +864,7 @@ usb_ac_lrput(queue_t *q, mblk_t *mp)
break;
default:
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "M_CTL from unknown module(%s)",
+ "message from unknown module(%s)",
ddi_driver_name(plumb_infop->acp_dip));
freemsg(mp);
}
@@ -1196,15 +873,11 @@ usb_ac_lrput(queue_t *q, mblk_t *mp)
default:
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"Unknown type=%d", mp->b_datap->db_type);
- usb_ac_free_mblk(mp);
+ freemsg(mp);
}
- mutex_exit(&uacp->usb_ac_mutex);
- /*
- * Nobody is waiting; nothing to send up.
- */
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_lrput: done");
+ "usb_ac_read_msg: done");
return (error);
}
@@ -1408,121 +1081,6 @@ usb_ac_create_pm_components(dev_info_t *dip, usb_ac_state_t *uacp)
/*
- * usb_ac_plumb_ioctl:
- * IOCTL issued from plumbing thread (only P_LINK_LH/P_UNLINK for now
- * caused by ldi_ioctl). Maybe we will need to use this function
- * to issue other IOCTLS to children in future from plumbing thread
- */
-static void
-usb_ac_plumb_ioctl(queue_t *q, mblk_t *mp)
-{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- struct iocblk *iocp;
- struct linkblk *linkp;
- int n;
- usb_ac_streams_info_t *streams_infop;
-
- ASSERT(uacp != NULL);
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl, q=0x%p mp=0x%p instance=%d",
- (void *)q, (void *)mp, instance);
-
- iocp = (struct iocblk *)mp->b_rptr;
- mutex_enter(&uacp->usb_ac_mutex);
- n = uacp->usb_ac_current_plumbed_index;
-
- switch (iocp->ioc_cmd) {
- case I_PLINK:
- linkp = (struct linkblk *)mp->b_cont->b_rptr;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "LINK ioctl, index=%d linkblk ptr=0x%p", n, (void *)linkp);
-
- /*
- * We keep track of the module that is being
- * currently plumbed through usb_ac_current_plumbed_index
- * to the plumb structure array. We set the lwq field
- * of the plumb structure here.
- */
- ASSERT(uacp->usb_ac_plumbed[n].acp_lwq == NULL);
- uacp->usb_ac_plumbed[n].acp_lwq = linkp->l_qbot;
- uacp->usb_ac_plumbed[n].acp_lrq = RD(linkp->l_qbot);
-
- audio_sup_set_qptr(uacp->usb_ac_plumbed[n].acp_lrq,
- uacp->usb_ac_dev, (void *)uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "index=%d lwq=0x%p lrq=0x%p", n, (void *)linkp->l_qbot,
- (void *)RD(linkp->l_qbot));
- break;
- case I_UNLINK:
- case I_PUNLINK:
- linkp = (struct linkblk *)mp->b_cont->b_rptr;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "UNLINK ioctl, linkblk ptr=0x%p", (void *)linkp);
-
- audio_sup_free_qptr(RD(linkp->l_qbot));
- uacp->usb_ac_dev = 0;
-
- if (uacp->usb_ac_plumbed[n].acp_driver == USB_AS_PLUMBED) {
-
- /*
- * we bzero the streams info and plumbed structure
- * since there is no guarantee that the next plumbing
- * will be identical
- */
- streams_infop = (usb_ac_streams_info_t *)
- uacp->usb_ac_plumbed[n].acp_data;
- cv_destroy(&(streams_infop->acs_ac_to_as_req.acr_cv));
-
- /* bzero the relevant plumbing structure */
- bzero(streams_infop, sizeof (usb_ac_streams_info_t));
- }
- bzero(&uacp->usb_ac_plumbed[n], sizeof (usb_ac_plumbed_t));
-
- iocp->ioc_count = 0;
- break;
- default:
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "Unknown ioctl, cmd=%d", iocp->ioc_cmd);
- iocp->ioc_error = EINVAL;
- mutex_exit(&uacp->usb_ac_mutex);
-
- goto iocnak;
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /*
- * Common exit path for calls that return a positive
- * acknowledgment with a return value of 0.
- */
- iocp->ioc_rval = 0;
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
- qreply(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl: End (ACK)");
-
- return;
-
-iocnak:
-
- iocp->ioc_rval = 0;
- mp->b_datap->db_type = M_IOCNAK;
- qreply(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl: End: (NAK)");
-}
-
-
-/*
* usb_ac_get_plumb_info:
* Get plumb_info pointer that matches module "name"
* If name = "usb_as", match the direction also (record or play)
@@ -1565,26 +1123,6 @@ usb_ac_get_plumb_info(usb_ac_state_t *uacp, char *name, uchar_t reg_play_type)
/*
- * usb_ac_get_pinfo_from_lrq:
- * Get plumb_info pointer that matches the lrq passed
- */
-static usb_ac_plumbed_t *
-usb_ac_get_plumb_info_from_lrq(usb_ac_state_t *uacp, queue_t *lrq)
-{
- int n;
-
- for (n = 0; n < USB_AC_MAX_PLUMBED; n++) {
- if (uacp->usb_ac_plumbed[n].acp_lrq == lrq) {
-
- return (&uacp->usb_ac_plumbed[n]);
- }
- }
-
- return (NULL);
-}
-
-
-/*
* usb_ac_get_featureID:
* find out if there is at least one feature unit that supports
* the request controls.
@@ -2945,9 +2483,9 @@ usb_ac_disconnect_event_cb(dev_info_t *dip)
{
usb_ac_state_t *uacp = (usb_ac_state_t *)ddi_get_soft_state(
usb_ac_statep, ddi_get_instance(dip));
+ char *nm = "usb_ac_disconnect_event_cb";
- USB_DPRINTF_L4(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_disconnect_event_cb: dip=0x%p", (void *)dip);
+ dinfo("%s: %s - dip=%p\n", uacp->dstr, nm, (void *)dip);
usb_ac_serialize_access(uacp);
@@ -2962,10 +2500,8 @@ usb_ac_disconnect_event_cb(dev_info_t *dip)
}
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L3(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_disconnect_event_cb: done");
-
usb_ac_release_access(uacp);
+ dinfo("%s: %s done\n", uacp->dstr, nm);
return (USB_SUCCESS);
}
@@ -3008,9 +2544,9 @@ usb_ac_reconnect_event_cb(dev_info_t *dip)
{
usb_ac_state_t *uacp = (usb_ac_state_t *)ddi_get_soft_state(
usb_ac_statep, ddi_get_instance(dip));
+ char *nm = "usb_ac_reconnect_event_cb";
- USB_DPRINTF_L4(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_reconnect_event_cb: dip=0x%p", (void *)dip);
+ dinfo("%s: %s - dip=%p\n", uacp->dstr, nm, (void *)dip);
mutex_enter(&uacp->usb_ac_mutex);
mutex_exit(&uacp->usb_ac_mutex);
@@ -3032,9 +2568,11 @@ usb_ac_reconnect_event_cb(dev_info_t *dip)
USB_DPRINTF_L0(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
"busy device has been reconnected");
}
+
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
+ dinfo("%s: %s done\n", uacp->dstr, nm);
return (USB_SUCCESS);
}
@@ -3149,8 +2687,7 @@ usb_ac_am_restore_state(void *arg)
*/
delay(USB_AC_RESTORE_DELAY);
- (void) audio_sup_restore_state(uacp->usb_ac_audiohdl,
- AUDIO_ALL_DEVICES, AUDIO_BOTH);
+ audio_sup_restore_state(uacp->usb_ac_audiohdl);
mutex_enter(&uacp->usb_ac_mutex);
uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
@@ -3233,18 +2770,15 @@ usb_ac_restore_audio_state(usb_ac_state_t *uacp, int flag)
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
+usb_ac_setup(audiohdl_t ahdl, int flag)
{
int rval = AUDIO_SUCCESS;
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup: Begin ahdl=0x%p, stream=%d, flag=%d",
- (void *)ahdl, stream, flag);
-
mutex_enter(&uacp->usb_ac_mutex);
+
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3255,18 +2789,15 @@ usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
usb_ac_serialize_access(uacp);
if (flag & AUDIO_PLAY) {
- rval = usb_ac_do_setup(ahdl, stream, AUDIO_PLAY);
+ rval = usb_ac_do_setup(ahdl, AUDIO_PLAY);
}
if ((rval == USB_SUCCESS) && (flag & AUDIO_RECORD)) {
- rval = usb_ac_do_setup(ahdl, stream, AUDIO_RECORD);
+ rval = usb_ac_do_setup(ahdl, AUDIO_RECORD);
}
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup: rval=%d", rval);
-
return ((rval == USB_SUCCESS) ? AUDIO_SUCCESS : AUDIO_FAILURE);
}
@@ -3277,7 +2808,7 @@ usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
* either from audio framework for usb_ac_set_format
*/
static int
-usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
+usb_ac_do_setup(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -3286,10 +2817,6 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_setup: Begin ahdl=0x%p, stream=%d, flag=%d",
- (void *)ahdl, stream, flag);
-
mutex_enter(&uacp->usb_ac_mutex);
dir = (flag & AUDIO_PLAY) ? AUDIO_PLAY : AUDIO_RECORD;
@@ -3320,20 +2847,14 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
"usb_ac_do_setup: failure");
streams_infop->acs_setup_teardown_count--;
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_setup: End");
-
return (USB_SUCCESS);
}
@@ -3345,30 +2866,23 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
* NOTE: allow teardown when disconnected
*/
static void
-usb_ac_teardown(audiohdl_t ahdl, int stream, int flag)
+usb_ac_teardown(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_teardown: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
usb_ac_serialize_access(uacp);
if (flag & AUDIO_PLAY) {
- usb_ac_do_teardown(ahdl, stream, AUDIO_PLAY);
+ usb_ac_do_teardown(ahdl, AUDIO_PLAY);
}
if (flag & AUDIO_RECORD) {
- usb_ac_do_teardown(ahdl, stream, AUDIO_RECORD);
+ usb_ac_do_teardown(ahdl, AUDIO_RECORD);
}
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_teardown: End");
}
@@ -3377,7 +2891,7 @@ usb_ac_teardown(audiohdl_t ahdl, int stream, int flag)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
+usb_ac_do_teardown(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -3386,10 +2900,6 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_teardown: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
dir = (flag & AUDIO_PLAY) ? AUDIO_PLAY : AUDIO_RECORD;
@@ -3426,15 +2936,12 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
"usb_ac_do_teardown: failure");
streams_infop->acs_setup_teardown_count++;
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return;
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
@@ -3450,8 +2957,7 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
* Check power is done here since we will access the default pipe
*/
static int
-usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
- int arg1, int arg2)
+usb_ac_set_config(audiohdl_t ahdl, int command, int flag, int arg1, int arg2)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
char *what;
@@ -3463,12 +2969,8 @@ usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_config: Begin ahdl=0x%p\n\t"
- "stream=%d, cmd=%d, flag=%d, arg1=%d, arg2=%d",
- (void *)ahdl, stream, command, flag, arg1, arg2);
-
mutex_enter(&uacp->usb_ac_mutex);
+
if (uacp->usb_ac_plumbing_state < USB_AC_STATE_PLUMBED) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3606,10 +3108,6 @@ usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
what = "mic boost";
rval = AUDIO_SUCCESS;
break;
- case AM_SET_GAIN_BAL:
- what = "set gain bal";
- rval = AUDIO_FAILURE;
- break;
default:
what = "unknown";
rval = AUDIO_FAILURE;
@@ -3737,8 +3235,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
return (USB_FAILURE);
}
- if ((max = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_MAX, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_MAX, dir, featureID, &max) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting max gain failed");
@@ -3748,8 +3246,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: channel %d, max=%d", channel, max);
- if ((min = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_MIN, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_MIN, dir, featureID, &min) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting min gain failed");
@@ -3759,8 +3257,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: channel=%d, min=%d", channel, min);
- if ((current = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_CUR, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_CUR, dir, featureID, &current) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting cur gain failed");
@@ -3798,8 +3296,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
}
/* just curious, read it back, device may round up/down */
- if ((current = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_CUR, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_CUR, dir, featureID, &current) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting cur gain failed");
}
@@ -3827,7 +3325,7 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
* usb_ac_send_as_cmd().
*/
static int
-usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
+usb_ac_set_format(audiohdl_t ahdl, int flag,
int sample, int channels, int precision, int encoding)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
@@ -3841,11 +3339,6 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_format: Begin ahdl=0x%p, stream=%d, flag=%d, "
- "sr=%d, chnls=%d, prec=%d, enc=%d", (void *)ahdl, stream, flag,
- sample, channels, precision, encoding);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3879,7 +3372,7 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
mutex_exit(&uacp->usb_ac_mutex);
- rval = usb_ac_send_format_cmd(ahdl, stream, dir, sample,
+ rval = usb_ac_send_format_cmd(ahdl, dir, sample,
channels, precision, encoding);
usb_ac_release_access(uacp);
@@ -3903,15 +3396,15 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
mutex_exit(&uacp->usb_ac_mutex);
if (dir == AUDIO_PLAY) {
- usb_ac_do_pause_play(ahdl, stream);
+ usb_ac_do_stop_play(ahdl);
} else if (dir == AUDIO_RECORD) {
- usb_ac_do_stop_record(ahdl, stream);
+ usb_ac_do_stop_record(ahdl);
}
/* This blocks until the current isoc xfer is over */
- usb_ac_do_teardown(ahdl, stream, dir);
+ usb_ac_do_teardown(ahdl, dir);
- if (usb_ac_send_format_cmd(ahdl, stream, dir, sample,
+ if (usb_ac_send_format_cmd(ahdl, dir, sample,
channels, precision, encoding) != USB_SUCCESS) {
/*
* Setting new alternate has failed, try restoring
@@ -3920,13 +3413,13 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
* till bandwidth is available. Also we know that
* there is a matching alternate, so that can't fail.
*/
- if (usb_ac_send_format_cmd(ahdl, stream, dir,
+ if (usb_ac_send_format_cmd(ahdl, dir,
old_format.fmt_sr, old_format.fmt_chns,
old_format.fmt_precision, old_format.fmt_encoding) ==
USB_FAILURE) {
/* We closed the pipe; reopen it */
- (void) usb_ac_do_setup(ahdl, stream, dir);
+ (void) usb_ac_do_setup(ahdl, dir);
mutex_enter(&uacp->usb_ac_mutex);
streams_infop->acs_setup_teardown_count =
@@ -3940,7 +3433,7 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
}
/* This should block until successful */
- (void) usb_ac_do_setup(ahdl, stream, dir);
+ (void) usb_ac_do_setup(ahdl, dir);
mutex_enter(&uacp->usb_ac_mutex);
streams_infop->acs_setup_teardown_count = old_setup_teardown_count;
@@ -3948,9 +3441,6 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_format: End");
-
return (AUDIO_SUCCESS);
}
@@ -4002,7 +3492,7 @@ usb_ac_get_curr_format(usb_ac_state_t *uacp, int dir)
* Send the set sample freq command down to usb_as.
*/
static int
-usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
+usb_ac_send_format_cmd(audiohdl_t ahdl, int dir,
int sample, int channels, int precision, int encoding)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
@@ -4012,11 +3502,6 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_format_cmd: Begin ahdl=0x%p, stream=%d, dir=%d, "
- "sr=%d, chnls=%d, prec=%d, enc=%d", (void *)ahdl, stream, dir,
- sample, channels, precision, encoding);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4059,13 +3544,13 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
USB_DPRINTF_L2(PRINT_MASK_ALL,
uacp->usb_ac_log_handle,
"usb_ac_send_format_cmd: failed");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
} else {
- /* alternate number stored and reply mp freed */
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
+ /* store matching alternate number */
+ streams_infop->acs_ac_to_as_req.acr_curr_format.fmt_alt =
+ format->fmt_alt;
}
/* Set the sample rate */
@@ -4074,19 +3559,13 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_send_format_cmd: setting format failed");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_format_cmd: End");
-
return (USB_SUCCESS);
}
@@ -4097,7 +3576,7 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_start_play(audiohdl_t ahdl, int stream)
+usb_ac_start_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_audio_formats_t *cur_fmt;
@@ -4108,10 +3587,6 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4156,7 +3631,6 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_start_play: failure");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
@@ -4164,34 +3638,26 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
return (AUDIO_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_play: End");
-
return (AUDIO_SUCCESS);
}
/*
- * usb_ac_pause_play:
- * Wrapper function for usb_ac_do_pause_play and gets
+ * usb_ac_stop_play:
+ * Wrapper function for usb_ac_do_stop_play and gets
* called from mixer framework.
*/
static void
-usb_ac_pause_play(audiohdl_t ahdl, int stream)
+usb_ac_stop_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_pause_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4201,11 +3667,8 @@ usb_ac_pause_play(audiohdl_t ahdl, int stream)
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_serialize_access(uacp);
- usb_ac_do_pause_play(ahdl, stream);
+ usb_ac_do_stop_play(ahdl);
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_pause_play: End");
}
/*
@@ -4214,7 +3677,7 @@ usb_ac_pause_play(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
+usb_ac_do_stop_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4222,10 +3685,6 @@ usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_pause_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
plumb_infop = usb_ac_get_plumb_info(uacp, "usb_as", AUDIO_PLAY);
@@ -4240,37 +3699,9 @@ usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_do_pause_play: failure");
-
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
}
mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_pause_play: End");
-}
-
-
-/*
- * usb_ac_stop_play:
- * Wrapper function for usb_ac_pause_play and gets
- * called from mixer framework.
- */
-static void
-usb_ac_stop_play(audiohdl_t ahdl, int stream)
-{
- usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
-
- ASSERT(uacp != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
- usb_ac_pause_play(ahdl, stream);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_play: End");
}
@@ -4280,7 +3711,7 @@ usb_ac_stop_play(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_start_record(audiohdl_t ahdl, int stream)
+usb_ac_start_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4288,10 +3719,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4316,7 +3743,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_start_record: failure");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
@@ -4328,9 +3754,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_record: End");
-
return (AUDIO_SUCCESS);
}
@@ -4341,22 +3764,15 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
* called form mixer framework.
*/
static void
-usb_ac_stop_record(audiohdl_t ahdl, int stream)
+usb_ac_stop_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
usb_ac_serialize_access(uacp);
- usb_ac_do_stop_record(ahdl, stream);
+ usb_ac_do_stop_record(ahdl);
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_record: End");
}
@@ -4366,7 +3782,7 @@ usb_ac_stop_record(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
+usb_ac_do_stop_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4374,10 +3790,6 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_stop_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
plumb_infop = usb_ac_get_plumb_info(uacp, "usb_as", AUDIO_RECORD);
@@ -4392,14 +3804,9 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_do_stop_record: failure");
-
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
}
mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_stop_record: End");
}
@@ -4413,12 +3820,12 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
*/
static int
usb_ac_get_maxmin_volume(usb_ac_state_t *uacp, uint_t channel, int cmd,
- int dir, int feature_unitID)
+ int dir, int feature_unitID, short *max_or_minp)
{
mblk_t *data = NULL;
- short max_or_min;
usb_cr_t cr;
usb_cb_flags_t cb_flags;
+
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_get_maxmin_volume: channel=%d, cmd=%d dir=%d",
channel, cmd, dir);
@@ -4454,14 +3861,14 @@ usb_ac_get_maxmin_volume(usb_ac_state_t *uacp, uint_t channel, int cmd,
mutex_enter(&uacp->usb_ac_mutex);
ASSERT(MBLKL(data) == 2);
- max_or_min = (*(data->b_rptr+1) << 8) | *data->b_rptr;
+ *max_or_minp = (*(data->b_rptr+1) << 8) | *data->b_rptr;
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_get_maxmin_volume: max_or_min=0x%x", max_or_min);
+ "usb_ac_get_maxmin_volume: max_or_min=0x%x", *max_or_minp);
freemsg(data);
- return (max_or_min);
+ return (USB_SUCCESS);
}
@@ -4581,11 +3988,11 @@ static int
usb_ac_send_as_cmd(usb_ac_state_t *uacp, usb_ac_plumbed_t *plumb_infop,
int cmd, void *arg)
{
- mblk_t *mp = NULL;
- struct iocblk *iocp;
- queue_t *lwq = plumb_infop->acp_lwq;
usb_ac_streams_info_t *streams_infop;
- int error = USB_FAILURE;
+ int rv;
+ int rval;
+ ldi_handle_t lh;
+ char *nm = "usb_ac_send_as_cmd";
ASSERT(mutex_owned(&uacp->usb_ac_mutex));
ASSERT(plumb_infop != NULL);
@@ -4593,276 +4000,1209 @@ usb_ac_send_as_cmd(usb_ac_state_t *uacp, usb_ac_plumbed_t *plumb_infop,
streams_infop = (usb_ac_streams_info_t *)plumb_infop->acp_data;
ASSERT(streams_infop != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: Begin lwq=0x%p, cmd=0x%x, arg=0x%p",
- (void *)lwq, cmd, arg);
+ dinfo("%s: %s - cmd=0x%x, arg=0x%p\n", uacp->dstr, nm, cmd, arg);
- if (!canputnext(lwq)) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: canputnext failed");
+ lh = plumb_infop->acp_lh;
- return (error);
+ rv = ldi_ioctl(lh, cmd, (intptr_t)arg, FKIOCTL, kcred, &rval);
+ if (rv != 0) {
+ dinfo("%s: %s - ldi_ioctl failed, error=%d\n", uacp->dstr, nm,
+ rv);
+
+ return (USB_FAILURE);
}
- /*
- * Allocate mblk for a particular command
- */
- switch (cmd) {
- case USB_AUDIO_SET_FORMAT:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (usb_audio_formats_t));
- break;
- case USB_AUDIO_TEARDOWN:
- case USB_AUDIO_STOP_RECORD:
- case USB_AUDIO_PAUSE_PLAY:
- case USB_AUDIO_SETUP:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, NULL, 0);
- break;
- case USB_AUDIO_START_RECORD:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (audiohdl_t *));
- break;
- case USB_AUDIO_SET_SAMPLE_FREQ:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (int));
- break;
- case USB_AUDIO_START_PLAY:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (usb_audio_play_req_t));
- break;
- default:
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * usb_ac_serialize/release_access:
+ */
+static void
+usb_ac_serialize_access(usb_ac_state_t *uacp)
+{
+ (void) usb_serialize_access(uacp->usb_ac_ser_acc, USB_WAIT, 0);
+}
+
+static void
+usb_ac_release_access(usb_ac_state_t *uacp)
+{
+ usb_release_access(uacp->usb_ac_ser_acc);
+}
+
+
+static void
+usb_ac_pm_busy_component(usb_ac_state_t *usb_ac_statep)
+{
+ ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+
+ if (usb_ac_statep->usb_ac_pm != NULL) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy++;
+
+ USB_DPRINTF_L4(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_busy_component: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+
+ if (pm_busy_component(usb_ac_statep->usb_ac_dip, 0) !=
+ DDI_SUCCESS) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+
+ USB_DPRINTF_L2(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_busy_component failed: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ }
+ }
+}
+
+
+static void
+usb_ac_pm_idle_component(usb_ac_state_t *usb_ac_statep)
+{
+ ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+
+ if (usb_ac_statep->usb_ac_pm != NULL) {
+ if (pm_idle_component(usb_ac_statep->usb_ac_dip, 0) ==
+ DDI_SUCCESS) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ ASSERT(usb_ac_statep->usb_ac_pm->acpm_pm_busy > 0);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+
+ USB_DPRINTF_L4(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_idle_component: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ }
+ }
+}
+
+
+/*
+ * handle read from plumbed drivers
+ */
+static void
+usb_ac_reader(void *argp)
+{
+ usb_ac_plumbed_t *acp = (usb_ac_plumbed_t *)argp;
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ ldi_handle_t lh;
+ mblk_t *mp;
+ int rv;
+ timestruc_t tv = {0};
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ lh = acp->acp_lh;
+ tv.tv_sec = usb_ac_wait_hid;
+
+ while (acp->acp_flags & ACP_ENABLED) {
+ mp = NULL;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ rv = ldi_getmsg(lh, &mp, &tv);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if ((acp->acp_flags & ACP_ENABLED) && mp != NULL && rv == 0)
+ rv = usb_ac_read_msg(acp, mp);
+
+ USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "%s%d read from %s%d, rv=%d",
+ ddi_driver_name(uacp->usb_ac_dip),
+ ddi_get_instance(uacp->usb_ac_dip),
+ ddi_driver_name(acp->acp_dip),
+ ddi_get_instance(acp->acp_dip), rv);
+ }
+ mutex_exit(&uacp->usb_ac_mutex);
+}
+
+
+/*
+ * setup threads to read from the other usb modules that may send unsolicited
+ * or asynchronous messages, which is only hid currently
+ */
+static int
+usb_ac_plumb(usb_ac_plumbed_t *acp)
+{
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ dev_info_t *dip;
+ dev_info_t *acp_dip;
+ int acp_inst;
+ char *acp_name;
+ char tq_nm[128];
+ int rv = USB_FAILURE;
+ char *nm = "usb_ac_plumb";
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dip = uacp->usb_ac_dip;
+
+ acp_dip = acp->acp_dip;
+ acp_inst = ddi_get_instance(acp_dip);
+ acp_name = (char *)ddi_driver_name(acp_dip);
+
+ dinfo("%s: %s on %s%d\n", uacp->dstr, nm, acp_name, acp_inst);
+
+ if (strcmp(acp_name, "hid") != 0) {
+ rv = USB_SUCCESS;
+ goto OUT;
+ }
+
+ (void) snprintf(tq_nm, sizeof (tq_nm), "%s_%d_tq",
+ ddi_driver_name(acp_dip), acp_inst);
+
+ acp->acp_tqp = ddi_taskq_create(dip, tq_nm, 1, TASKQ_DEFAULTPRI, 0);
+ if (acp->acp_tqp == NULL)
+ goto OUT;
+
+ if (ddi_taskq_dispatch(acp->acp_tqp, usb_ac_reader, (void *)acp,
+ DDI_SLEEP) != DDI_SUCCESS)
+ goto OUT;
+
+ dinfo("%s: dispatched reader for %s%d\n", uacp->dstr,
+ acp_name, acp_inst);
+
+ rv = USB_SUCCESS;
+
+OUT:
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s on %s%d done, rv=%d\n", uacp->dstr, nm,
+ acp_name, acp_inst, rv);
+
+ return (rv);
+}
+
+
+static void
+usb_ac_mux_plumbing_tq(void *arg)
+{
+ usb_ac_state_t *uacp = (usb_ac_state_t *)arg;
+
+ if (usb_ac_mux_plumbing(uacp) != USB_SUCCESS)
+ dwarn("%s: usb_ac_mux_plumbing failed\n", uacp->dstr);
+}
+
+
+static int
+usb_ac_do_plumbing(usb_ac_state_t *uacp)
+{
+ dev_info_t *dip = uacp->usb_ac_dip;
+ int inst = ddi_get_instance(dip);
+ char tq_nm[128];
+ int rv = USB_FAILURE;
+
+ (void) snprintf(tq_nm, sizeof (tq_nm), "%s_%d_tq",
+ ddi_driver_name(dip), inst);
+
+ uacp->tqp = ddi_taskq_create(dip, tq_nm, 1, TASKQ_DEFAULTPRI, 0);
+ if (uacp->tqp == NULL) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: unknown cmd=%d", cmd);
+ "usb_ac_do_plumbing: ddi_taskq_create failed");
+ goto OUT;
+ }
- return (error);
+ if (ddi_taskq_dispatch(uacp->tqp, usb_ac_mux_plumbing_tq, (void *)uacp,
+ DDI_SLEEP) != DDI_SUCCESS) {
+ USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_do_plumbing: ddi_taskq_dispatch failed");
+ goto OUT;
}
- if (mp == NULL) {
+ rv = USB_SUCCESS;
+
+OUT:
+ return (rv);
+}
+
+
+
+static void
+usb_ac_mux_unplumbing_tq(void *arg)
+{
+ usb_ac_state_t *uacp = (usb_ac_state_t *)arg;
+
+ if (usb_ac_mux_unplumbing(uacp) != USB_SUCCESS)
+ dwarn("%s: usb_ac_mux_unplumbing failed\n", uacp->dstr);
+}
+
+
+static int
+usb_ac_do_unplumbing(usb_ac_state_t *uacp)
+{
+ int rv = USB_FAILURE;
+
+ if (uacp->tqp == NULL)
+ return (USB_SUCCESS);
+
+ if (ddi_taskq_dispatch(uacp->tqp, usb_ac_mux_unplumbing_tq,
+ (void *)uacp, DDI_SLEEP) != DDI_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: can't get mblk to send cmd down");
+ "usb_ac_do_unplumbing: ddi_taskq_dispatch failed");
+ goto OUT;
+ }
+
+ dinfo("%s: waiting for unplumb thread\n", uacp->dstr);
+
+ ddi_taskq_wait(uacp->tqp);
+ rv = USB_SUCCESS;
+
+ dinfo("%s: unplumb thread done\n", uacp->dstr);
- return (error);
+OUT:
+ if (uacp->tqp != NULL) {
+ ddi_taskq_destroy(uacp->tqp);
+ uacp->tqp = NULL;
}
+ return (rv);
+}
- /*
- * Set wait flag and send message down; we have made sure
- * before that canputnext succeeds. Note mp will be freed down
- */
- streams_infop->acs_ac_to_as_req.acr_wait_flag = 1;
+
+/*
+ * teardown threads to the other usb modules
+ * and clear structures as part of unplumbing
+ */
+static void
+usb_ac_unplumb(usb_ac_plumbed_t *acp)
+{
+ usb_ac_streams_info_t *streams_infop;
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ dev_info_t *acp_dip;
+ int acp_inst;
+ char *nm = "usb_ac_unplumb";
+ char *acp_name;
+
+ acp_dip = acp->acp_dip;
+ acp_inst = ddi_get_instance(acp_dip);
+ acp_name = (char *)ddi_driver_name(acp_dip);
+
+ dinfo("%s: %s on %s%d\n", uacp->dstr, nm, acp_name, acp_inst);
+
+ if (acp->acp_tqp != NULL) {
+ dinfo("%s: %s - destroying taskq for %s%d\n", uacp->dstr, nm,
+ acp_name, acp_inst);
+
+ ddi_taskq_destroy(acp->acp_tqp);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (acp->acp_driver == USB_AS_PLUMBED) {
+ /*
+ * we bzero the streams info and plumbed structure
+ * since there is no guarantee that the next plumbing
+ * will be identical
+ */
+ streams_infop = (usb_ac_streams_info_t *)acp->acp_data;
+
+ /* bzero the relevant plumbing structure */
+ bzero(streams_infop, sizeof (usb_ac_streams_info_t));
+ }
+ bzero(acp, sizeof (usb_ac_plumbed_t));
mutex_exit(&uacp->usb_ac_mutex);
- putnext(lwq, mp);
+
+ dinfo("%s: %s on %s done\n", uacp->dstr, nm, acp_name, acp_inst);
+}
+
+
+/*ARGSUSED*/
+static int
+usb_ac_mux_plumbing(usb_ac_state_t *uacp)
+{
+ dev_info_t *dip;
+ char *nm = "usb_ac_mux_plumbing";
+
+ /* get the usb_ac dip */
+ dip = uacp->usb_ac_dip;
+
+ /* Access to the global variables is synchronized */
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s state=%d\n", uacp->dstr, nm,
+ uacp->usb_ac_plumbing_state);
+
+ if (uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED) {
+ mutex_exit(&uacp->usb_ac_mutex);
+ dinfo("%s: audio streams driver already plumbed\n",
+ uacp->dstr);
+
+ return (USB_SUCCESS);
+ }
+
+ /* usb_as and hid should be attached but double check */
+ if (usb_ac_online_siblings(uacp) != USB_SUCCESS) {
+ mutex_exit(&uacp->usb_ac_mutex);
+ dinfo("%s: no audio streams driver plumbed\n", uacp->dstr);
+
+ return (USB_FAILURE);
+ }
+
+ dinfo("%s: (%s) raising power\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* bring the device to full power */
+ usb_ac_pm_busy_component(uacp);
+ (void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
+
+ /* avoid dips disappearing while we are plumbing */
+ usb_ac_hold_siblings(uacp);
+
mutex_enter(&uacp->usb_ac_mutex);
/*
- * Wait for the response; reply will arrive through rput()
- * M_CTL and the cv_wait will be signaled there and wait flag
- * will be reset
+ * walk all siblings and create the usb_ac<->usb_as and
+ * usb_ac<->hid streams. return of 0 indicates no or
+ * partial/failed plumbing
*/
- while (streams_infop->acs_ac_to_as_req.acr_wait_flag) {
-#ifndef DEBUG
- cv_wait(&streams_infop->acs_ac_to_as_req.acr_cv,
- &uacp->usb_ac_mutex);
-#else
- clock_t tm = ddi_get_lbolt() +
- drv_usectohz(usb_ac_wait_timeout);
- int rval;
-
- rval = cv_timedwait(&streams_infop->acs_ac_to_as_req.acr_cv,
- &uacp->usb_ac_mutex, tm);
-
- if (streams_infop->acs_ac_to_as_req.acr_wait_flag) {
- if (rval == -1) {
- USB_DPRINTF_L3(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd:"
- " timeout happen before cmd complete.");
- } else {
- USB_DPRINTF_L3(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd:"
- " not signaled by USB_AS_PLUMBED.");
+ if (usb_ac_mux_walk_siblings(uacp) == 0) {
+ /* pretend that we are plumbed so we can unplumb */
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ (void) usb_ac_mux_unplumbing(uacp);
+
+ dinfo("%s: no audio streams driver plumbed\n", uacp->dstr);
+
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ return (USB_FAILURE);
+ }
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
+
+ /* restore state if we have already registered with the mixer */
+ if (uacp->usb_ac_registered_with_mixer) {
+ dinfo("%s: already registered with mixer, restoring state\n",
+ uacp->dstr);
+
+ (void) usb_ac_restore_audio_state(uacp, USB_FLAGS_SLEEP);
+
+ } else if (usb_ac_mixer_registration(uacp) != USB_SUCCESS) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dwarn("%s: mixer registration failed\n", uacp->dstr);
+
+ (void) usb_ac_mux_unplumbing(uacp);
+
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ return (USB_FAILURE);
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ dinfo("%s: %s done\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
+}
+
+
+static int
+usb_ac_mux_unplumbing(usb_ac_state_t *uacp)
+{
+ usb_ac_plumbed_t *acp;
+ ldi_handle_t lh;
+ dev_info_t *acp_dip;
+ int inst;
+ int i;
+ dev_t devt;
+ minor_t minor;
+ int maxlinked = 0;
+ char *nm = "usb_ac_mux_unplumbing";
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s state=%d\n", uacp->dstr, nm, uacp->usb_ac_plumbing_state);
+
+ if (uacp->usb_ac_plumbing_state == USB_AC_STATE_UNPLUMBED) {
+ dinfo("%s: %s - already unplumbed!\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_SUCCESS);
+ }
+
+ /* usb_ac might not have anything plumbed yet */
+ if (uacp->usb_ac_current_plumbed_index == -1) {
+ dinfo("%s: %s - nothing plumbed!\n", uacp->dstr, nm);
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_SUCCESS);
+ }
+
+ /* do not allow detach if still busy */
+ if (uacp->usb_ac_busy_count) {
+ dinfo("%s: %s - mux still busy (%d)\n", uacp->dstr, nm,
+ uacp->usb_ac_busy_count);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ }
+
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
+
+ /* close ac-as and ac-hid streams */
+ maxlinked = uacp->usb_ac_current_plumbed_index + 1;
+ dinfo("%s: %s - maxlinked %d\n", uacp->dstr, nm, maxlinked);
+
+ for (i = 0; i < maxlinked; i++) {
+ /*
+ * we must save members of usb_ac_plumbed[] before calling
+ * usb_ac_unplumb() because it clears the structure
+ */
+ acp = &uacp->usb_ac_plumbed[i];
+ lh = acp->acp_lh;
+ acp_dip = acp->acp_dip;
+ devt = acp->acp_devt;
+
+ if (acp_dip == NULL) {
+ dinfo("%s: %s [%d] - skipping\n", uacp->dstr, nm, i);
+ continue;
+ }
+
+ minor = getminor(devt);
+ inst = ddi_get_instance(acp_dip);
+
+ uacp->usb_ac_current_plumbed_index = i;
+
+ dinfo("%s: %s [%d] - %s%d minor 0x%x\n", uacp->dstr, nm, i,
+ ddi_driver_name(acp_dip), inst, minor);
+
+ if (lh != NULL) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ acp->acp_flags &= ~ACP_ENABLED;
+
+ dinfo("%s: %s [%d] - closing\n", uacp->dstr, nm, i);
+
+ /* must close stream first before destroying thread */
+ (void) ldi_close(lh, FREAD|FWRITE, kcred);
+
+ usb_ac_unplumb(acp);
+
+ dinfo("%s: %s [%d] - unplumbed\n", uacp->dstr, nm, i);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* Wait till all activity in the default pipe has drained */
+ usb_ac_serialize_access(uacp);
+ usb_ac_release_access(uacp);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ uacp->usb_ac_current_plumbed_index = -1;
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s done\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * walk all siblings and create the ac<->as and ac<->hid streams
+ */
+static int
+usb_ac_mux_walk_siblings(usb_ac_state_t *uacp)
+{
+ dev_info_t *pdip;
+ dev_info_t *child_dip;
+ major_t drv_major;
+ minor_t drv_minor;
+ int drv_instance;
+ char *drv_name;
+ dev_t drv_devt;
+ ldi_handle_t drv_lh;
+ ldi_ident_t li;
+ int error;
+ int count = 0;
+ char *nm = "usb_ac_mux_walk_siblings";
+
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+ child_dip = ddi_get_child(pdip);
+
+ dinfo("%s: %s parent=%s%d\n", uacp->dstr, nm,
+ ddi_driver_name(pdip), ddi_get_instance(pdip));
+
+ while ((child_dip != NULL) && (count < USB_AC_MAX_PLUMBED)) {
+ drv_instance = ddi_get_instance(child_dip);
+ drv_name = (char *)ddi_driver_name(child_dip);
+
+ dinfo("%s: plumbing %s%d count=%d\n", uacp->dstr,
+ drv_name, drv_instance, count);
+
+ /* ignore own dip */
+ if (child_dip == uacp->usb_ac_dip) {
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
+ }
+ drv_instance = ddi_get_instance(child_dip);
+
+ /* ignore other dip other than usb_as and hid */
+ if (strcmp(ddi_driver_name(child_dip), "usb_as") == 0) {
+ uacp->usb_ac_plumbed[count].acp_driver = USB_AS_PLUMBED;
+ drv_minor = USB_AS_CONSTRUCT_MINOR(drv_instance);
+ } else if (strcmp(ddi_driver_name(child_dip), "hid") == 0) {
+ uacp->usb_ac_plumbed[count].acp_driver = USB_AH_PLUMBED;
+ drv_minor = HID_CONSTRUCT_EXTERNAL_MINOR(drv_instance);
+ } else {
+ drv_minor = drv_instance;
+ uacp->usb_ac_plumbed[count].acp_driver =
+ UNKNOWN_PLUMBED;
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ if (!i_ddi_devi_attached(child_dip)) {
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ if (DEVI_IS_DEVICE_REMOVED(child_dip)) {
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ drv_major = ddi_driver_major(child_dip);
+
+ uacp->usb_ac_current_plumbed_index = count;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ drv_devt = makedevice(drv_major, drv_minor);
+
+ dinfo("%s: opening %s%d devt=(%d, 0x%x)\n", uacp->dstr,
+ drv_name, drv_instance, drv_major, drv_minor);
+
+ error = ldi_ident_from_dip(uacp->usb_ac_dip, &li);
+ if (error == 0) {
+ uacp->usb_ac_plumbed[count].acp_flags |= ACP_ENABLED;
+
+ error = ldi_open_by_dev(&drv_devt, OTYP_CHR,
+ FREAD|FWRITE, kcred, &drv_lh, li);
+ ldi_ident_release(li);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ if (error) {
+ dinfo("%s: open of devt=(%d, 0x%x) failed error=%d\n",
+ uacp->dstr, drv_major, drv_minor, error);
+
+ return (0);
+ }
+
+ uacp->usb_ac_plumbed[count].acp_uacp = uacp;
+ uacp->usb_ac_plumbed[count].acp_devt = drv_devt;
+ uacp->usb_ac_plumbed[count].acp_lh = drv_lh;
+ uacp->usb_ac_plumbed[count].acp_dip = child_dip;
+ uacp->usb_ac_plumbed[count].acp_ifno =
+ usb_get_if_number(child_dip);
+
+ if (uacp->usb_ac_plumbed[count].acp_driver == USB_AS_PLUMBED) {
+ /* get registration data */
+ if (usb_ac_get_reg_data(uacp, drv_lh, count) !=
+ USB_SUCCESS) {
+
+ dinfo("%s: usb_ac_get_reg_data failed on "
+ "%s%d\n", uacp->dstr,
+ drv_name, drv_instance);
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ return (0);
+ }
+ } else if (uacp->usb_ac_plumbed[count].acp_driver ==
+ USB_AH_PLUMBED) {
+ int rval;
+
+ dinfo("%s: pushing usb_ah on %s%d\n", uacp->dstr,
+ drv_name, drv_instance);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* push usb_ah module on top of hid */
+ error = ldi_ioctl(drv_lh, I_PUSH, (intptr_t)"usb_ah",
+ FKIOCTL, kcred, &rval);
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (error) {
+ dinfo("%s: ldi_ioctl I_PUSH failed on "
+ "%s%d, error=%d\n", uacp->dstr,
+ drv_name, drv_instance, error);
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ /* skip plumbing the hid driver */
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
}
+ } else {
+ /* should not be here */
+ dinfo("%s: %s - unknown module %s%d\n",
+ uacp->dstr, nm, drv_name, drv_instance);
+ count--;
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ /* skip plumbing an unknown module */
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
}
-#endif
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ error = usb_ac_plumb(&uacp->usb_ac_plumbed[count]);
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (error != USB_SUCCESS) {
+ dinfo("%s: %s - usb_ac_plumb failed for %s%d\n",
+ uacp->dstr, nm, drv_name, drv_instance);
+
+ return (0);
+ }
+
+ dinfo("%s: plumbed %s%d, minor 0x%x\n", uacp->dstr,
+ drv_name, drv_instance, drv_minor);
+
+ child_dip = ddi_get_next_sibling(child_dip);
+ count++;
}
- /* Wait is over, get the reply data */
- mp = streams_infop->acs_ac_to_as_req.acr_reply_mp;
- ASSERT(mp != NULL);
+ dinfo("%s: %s - %d drivers plumbed under usb_ac mux", uacp->dstr, nm,
+ count);
- iocp = (struct iocblk *)mp->b_rptr;
+ return (count);
+}
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: db_type=0x%x cmd=0x%x",
- mp->b_datap->db_type, iocp->ioc_cmd);
- switch (mp->b_datap->db_type) {
- case M_CTL:
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- /*
- * This command sets mixer format data
- * and returns alternate setting that matches
- */
- ASSERT(mp->b_cont != NULL);
- ASSERT(MBLKL(mp->b_cont) == sizeof (int));
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "alternate returned %d",
- *((int *)(mp->b_cont->b_rptr)));
-
- streams_infop->acs_ac_to_as_req.acr_curr_format.
- fmt_alt = *((int *)(mp->b_cont->b_rptr));
-
- /*FALLTHROUGH*/
- case USB_AUDIO_SET_SAMPLE_FREQ:
- case USB_AUDIO_SETUP:
- case USB_AUDIO_START_PLAY:
- case USB_AUDIO_PAUSE_PLAY:
- case USB_AUDIO_START_RECORD:
- case USB_AUDIO_STOP_RECORD:
- case USB_AUDIO_TEARDOWN:
- error = USB_SUCCESS;
- break;
- default:
+/*
+ * usb_ac_find_default_port:
+ */
+static int
+usb_ac_find_default_port(uint_t port)
+{
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ if (port & (1 << i)) {
+
+ return (1 << i);
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+ * Register with mixer only after first plumbing.
+ * Also do not register if earlier reg data
+ * couldn't be received from at least one
+ * streaming interface
+ */
+_NOTE(SCHEME_PROTECTS_DATA("private", am_ad_info))
+
+static int
+usb_ac_mixer_registration(usb_ac_state_t *uacp)
+{
+ am_ad_info_t *info = &uacp->usb_ac_am_ad_info;
+ audio_info_t *dflts = &uacp->usb_ac_am_ad_defaults;
+ usb_as_registration_t *asreg;
+ int n, nplay, nrec;
+ char *nm = "usb_ac_mixer_registration";
+
+ ASSERT(uacp != NULL);
+
+ dinfo("%s: %s infp=0x%p, dflts=0x%p, already registered=%d\n",
+ uacp->dstr, nm, (void *)info, (void *)dflts,
+ uacp->usb_ac_registered_with_mixer);
+
+ ASSERT(dflts != NULL);
+ ASSERT(info != NULL);
+
+ if (uacp->usb_ac_registered_with_mixer) {
+ return (USB_SUCCESS);
+ }
+
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
+ if (uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
break;
}
- break;
- case M_ERROR:
- default:
- error = USB_FAILURE;
}
- if (mp) {
- usb_ac_free_mblk(mp);
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
+ /* Haven't found a streaming interface; fail mixer registration */
+ if (n > USB_AC_MAX_AS_PLUMBED) {
+ dinfo("%s: %s - no streaming interface found\n",
+ uacp->dstr, nm);
+
+ return (USB_FAILURE);
}
- return (error);
+ info->ad_defaults = dflts;
+
+ dflts->monitor_gain = 0;
+ dflts->output_muted = B_FALSE;
+ dflts->hw_features = 0;
+ dflts->sw_features = AUDIO_SWFEATURE_MIXER;
+
+ /*
+ * Fill out streaming interface specific stuff
+ * Note that we handle only one playing and one recording
+ * streaming interface at the most
+ */
+ nplay = nrec = 0;
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
+ int ch, chs, default_gain, id;
+
+ if (uacp->usb_ac_streams[n].acs_rcvd_reg_data == 0) {
+ continue;
+ }
+
+ asreg = uacp->usb_ac_streams[n].acs_streams_reg;
+ if (asreg->reg_valid == 0) {
+ continue;
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s [%d] - setting format on %s%d\n",
+ uacp->dstr, nm, n,
+ uacp->usb_ac_streams[n].acs_plumbed->acp_dip);
+
+ /* set first format so get_featureID can be succeed */
+ (void) usb_ac_set_format(uacp->usb_ac_audiohdl,
+ asreg->reg_mode,
+ asreg->reg_srs[0],
+ asreg->reg_formats[0].fmt_chns,
+ asreg->reg_formats[0].fmt_precision,
+ asreg->reg_formats[0].fmt_encoding);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ chs = asreg->reg_formats[0].fmt_chns;
+
+ /* check if any channel supports vol. control for this fmt */
+ for (ch = 0; ch <= chs; ch++) {
+ if ((id = usb_ac_get_featureID(uacp,
+ asreg->reg_mode, ch,
+ USB_AUDIO_VOLUME_CONTROL)) != -1) {
+ ddtl("%s: %s [%d] - dir=%d featureID=%d\n",
+ uacp->dstr, nm, n, asreg->reg_mode, id);
+
+ break;
+ }
+ }
+ default_gain = (id == USB_AC_ID_NONE) ?
+ AUDIO_MAX_GAIN : (AUDIO_MAX_GAIN/2);
+
+ ddtl("%s: %s [%d] - mode=%d chs=%d default_gain=%d id=%d\n",
+ uacp->dstr, nm, n, asreg->reg_mode, chs, default_gain, id);
+
+ if (asreg->reg_mode == AUDIO_PLAY) {
+ nplay++;
+ ASSERT(nplay == 1);
+
+ dflts->play.sample_rate =
+ asreg->reg_srs[0];
+ dflts->play.channels =
+ asreg->reg_formats[0].fmt_chns;
+ dflts->play.precision =
+ asreg->reg_formats[0].fmt_precision;
+ dflts->play.encoding =
+ asreg->reg_formats[0].fmt_encoding;
+ dflts->play.gain = default_gain;
+ dflts->play.port = usb_ac_find_default_port(
+ uacp->usb_ac_output_ports);
+ dflts->play.avail_ports = uacp->usb_ac_output_ports;
+ dflts->play.mod_ports = 0;
+ /* no support for mixer unit */
+ dflts->play.buffer_size = 8*1024;
+ dflts->hw_features |= AUDIO_HWFEATURE_PLAY;
+
+ info->ad_play.ad_mixer_srs.ad_srs = asreg->reg_srs;
+
+ info->ad_play.ad_chs = asreg->reg_channels;
+ info->ad_play.ad_int_rate = 1000; /* every 1 ms */
+ info->ad_play.ad_bsize = 8 * 1024;
+ info->ad_play_comb = asreg->reg_combinations;
+ } else {
+ nrec++;
+ ASSERT(nrec == 1);
+
+ dflts->record.sample_rate =
+ asreg->reg_srs[0];
+ dflts->record.channels =
+ asreg->reg_formats[0].fmt_chns;
+ dflts->record.precision =
+ asreg->reg_formats[0].fmt_precision;
+ dflts->record.encoding =
+ asreg->reg_formats[0].fmt_encoding;
+ dflts->record.gain = default_gain;
+ dflts->record.port = usb_ac_find_default_port(
+ uacp->usb_ac_input_ports);
+ dflts->record.avail_ports = uacp->usb_ac_input_ports;
+ dflts->record.mod_ports = uacp->usb_ac_input_ports;
+ dflts->record.buffer_size = 8*1024;
+ dflts->hw_features |= AUDIO_HWFEATURE_RECORD;
+
+ info->ad_record.ad_mixer_srs.ad_srs = asreg->reg_srs;
+
+ info->ad_record.ad_chs = asreg->reg_channels;
+ info->ad_record.ad_int_rate = 1000; /* every 1 ms */
+ info->ad_record.ad_bsize = 8 * 1024;
+ info->ad_num_mics = 1;
+ info->ad_rec_comb = asreg->reg_combinations;
+ }
+ }
+
+ if (nplay && nrec) {
+ dflts->hw_features |= AUDIO_HWFEATURE_DUPLEX;
+ }
+
+ /* the rest */
+ info->ad_entry = &usb_ac_entry;
+ info->ad_dev_info = &usb_dev_info;
+
+ dinfo("%s: %s - calling am_attach\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if (am_attach(uacp->usb_ac_audiohdl, DDI_ATTACH, info) ==
+ AUDIO_FAILURE) {
+ dinfo("%s: %s - am_attach failed\n", uacp->dstr, nm);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ uacp->usb_ac_registered_with_mixer = 1;
+
+ dinfo("%s: %s - am_attach succeeded\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
}
/*
- * usb_ac_allocate_req_mblk:
- * Allocate a message block with the specified M_CTL cmd,
- * The 2nd mblk contains the data for the command with a length len
+ * get registration data from usb_as driver unless we already
+ * have 2 registrations
*/
-static mblk_t *
-usb_ac_allocate_req_mblk(usb_ac_state_t *uacp, int cmd, void *buf, uint_t len)
+static int
+usb_ac_get_reg_data(usb_ac_state_t *uacp, ldi_handle_t drv_lh, int index)
{
- mblk_t *mp, *mp2;
- struct iocblk *mctlmsg;
+ int n, error, rval;
+ usb_as_registration_t *streams_reg;
+ char *nm = "usb_ac_get_reg_data";
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_allocate_req_mblk: cmd=0x%x, buf=0x%p, len=%d",
- cmd, buf, len);
+ dinfo("%s: %s index=%d, mixer registered=%d\n", uacp->dstr, nm, index,
+ uacp->usb_ac_registered_with_mixer);
- mp = allocb_wait(sizeof (struct iocblk), BPRI_HI, STR_NOSIG, NULL);
- mp->b_datap->db_type = M_CTL;
- mctlmsg = (struct iocblk *)mp->b_datap->db_base;
- mctlmsg->ioc_cmd = cmd;
- mctlmsg->ioc_count = len;
+ /* if already registered, just setup data structures again */
+ if (uacp->usb_ac_registered_with_mixer) {
- mp->b_wptr = mp->b_wptr + sizeof (struct iocblk);
+ return (usb_ac_setup_plumbed(uacp, index, -1, -1));
+ }
- if ((len == 0) || (buf == NULL)) {
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n ++) {
+ /*
+ * We haven't received registration data
+ * from n-th streaming interface in the array
+ */
+ if (!uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
+ break;
+ }
+ }
+
+ if (n >= USB_AC_MAX_AS_PLUMBED) {
+ dwarn("%s: More than 2 streaming interfaces (play "
+ "and/or record) currently not supported\n", uacp->dstr);
- return (mp);
+ return (USB_FAILURE);
}
- mp2 = allocb_wait(len, BPRI_HI, STR_NOSIG, NULL);
- mp->b_cont = mp2;
- bcopy(buf, mp->b_cont->b_datap->db_base, len);
- mp->b_cont->b_wptr = mp->b_cont->b_wptr + len;
+ /* take the stream reg struct with the same index */
+ streams_reg = &uacp->usb_ac_streams_reg[n];
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_allocate_req_mblk: mp=0x%p", (void *)mp);
+ dinfo("%s: regdata from usb_as: streams_reg=0x%p, n=%d\n", uacp->dstr,
+ (void *)streams_reg, n);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if ((error = ldi_ioctl(drv_lh, USB_AUDIO_MIXER_REGISTRATION,
+ (intptr_t)streams_reg, FKIOCTL, kcred, &rval)) != 0) {
+ dinfo("%s: %s - ldi_ioctl failed for mixer registration, "
+ "error=%d", uacp->dstr, nm, error);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ } else {
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ rval = usb_ac_setup_plumbed(uacp, index, n, n);
+
+ dinfo("%s: %s - usb_ac_streams[%d]: "
+ "received_reg_data=%d type=%s", uacp->dstr, nm, index,
+ uacp->usb_ac_streams[n].acs_rcvd_reg_data,
+ ((streams_reg->reg_mode == AUDIO_PLAY) ?
+ "play" : "record"));
- return (mp);
+ usb_ac_print_reg_data(uacp, streams_reg);
+
+ return (rval);
+ }
}
/*
- * usb_ac_free_mblk:
- * Free the message block
+ * setup plumbed and stream info structure, either initially or
+ * after replumbing
+ * On replumbing, str_idx and reg_idx are -1
*/
-static void
-usb_ac_free_mblk(mblk_t *mp)
+static int
+usb_ac_setup_plumbed(usb_ac_state_t *uacp, int plb_idx, int str_idx,
+ int reg_idx)
{
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
+ int i;
+ char *nm = "usb_ac_setup_plumbed";
+
+ dinfo("%s: %s plb_idx=%d str_idx=%d\n", uacp->dstr, nm,
+ plb_idx, str_idx);
+
+ if (str_idx == -1) {
+ /* find a free streams info structure */
+ for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
+ if (uacp->usb_ac_streams[i].acs_plumbed == NULL) {
+ break;
+ }
+ }
+ ASSERT(i < USB_AC_MAX_AS_PLUMBED);
+ str_idx = i;
}
- freemsg(mp);
+
+ uacp->usb_ac_plumbed[plb_idx].acp_data =
+ &uacp->usb_ac_streams[str_idx];
+ uacp->usb_ac_streams[str_idx].acs_plumbed =
+ &uacp->usb_ac_plumbed[plb_idx];
+ uacp->usb_ac_streams[str_idx].acs_rcvd_reg_data = 1;
+
+ if (reg_idx == -1) {
+ /*
+ * find the corresponding registration structure, match
+ * on interface number and not on dip since dip may have
+ * changed
+ */
+ for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
+ if (uacp->usb_ac_streams_reg[i].reg_ifno ==
+ uacp->usb_ac_plumbed[plb_idx].acp_ifno) {
+ break;
+ }
+ }
+ if (i == USB_AC_MAX_AS_PLUMBED) {
+ dinfo("%s: %s - no corresponding registration "
+ "structure\n", uacp->dstr, nm);
+
+ return (USB_FAILURE);
+ }
+ reg_idx = i;
+ }
+ uacp-> usb_ac_streams[str_idx].acs_streams_reg =
+ &uacp->usb_ac_streams_reg[reg_idx];
+
+ dinfo("%s: %s done - plb_idx=%d str_idx=%d reg_idx=%d", uacp->dstr, nm,
+ plb_idx, str_idx, reg_idx);
+
+ return (USB_SUCCESS);
}
/*
- * usb_ac_serialize/release_access:
+ * function to dump registration data
*/
static void
-usb_ac_serialize_access(usb_ac_state_t *uacp)
+usb_ac_print_reg_data(usb_ac_state_t *uacp,
+ usb_as_registration_t *reg)
{
- (void) usb_serialize_access(uacp->usb_ac_ser_acc, USB_WAIT, 0);
+ int n;
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_print_reg_data: Begin valid=%d, play=%d, "
+ "n_formats=%d, compat srs ptr=0x%p",
+ reg->reg_valid, reg->reg_mode, reg->reg_n_formats,
+ (void *)&reg->reg_srs);
+
+ for (n = 0; n < reg->reg_n_formats; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "format%d: alt=%d chns=%d prec=%d enc=%d", n,
+ reg->reg_formats[n].fmt_alt,
+ reg->reg_formats[n].fmt_chns,
+ reg->reg_formats[n].fmt_precision,
+ reg->reg_formats[n].fmt_encoding);
+ }
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "combinations: %d %d %d %d %d %d %d %d",
+ reg->reg_combinations[0].ad_prec, reg->reg_combinations[0].ad_enc,
+ reg->reg_combinations[1].ad_prec, reg->reg_combinations[1].ad_enc,
+ reg->reg_combinations[2].ad_prec, reg->reg_combinations[2].ad_enc,
+ reg->reg_combinations[3].ad_prec, reg->reg_combinations[3].ad_enc);
+
+
+ for (n = 0; n < USB_AS_N_FORMATS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_formats[%d] ptr=0x%p", n,
+ (void *)&reg->reg_formats[n]);
+ }
+
+ for (n = 0; n < USB_AS_N_CHANNELS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_channels[%d]=%d", n, reg->reg_channels[n]);
+ }
+
+ for (n = 0; n < USB_AS_N_COMBINATIONS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_combinations[%d] ptr=0x%p", n,
+ (void *)&reg->reg_combinations[n]);
+ }
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_print_reg_data: End");
}
-static void
-usb_ac_release_access(usb_ac_state_t *uacp)
+
+static int
+usb_ac_online_siblings(usb_ac_state_t *uacp)
{
- usb_release_access(uacp->usb_ac_ser_acc);
+ dev_info_t *pdip, *child_dip;
+ int rval = USB_SUCCESS;
+ char *nm = "usb_ac_online_siblings";
+
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+
+ dinfo("%s: %s\n", uacp->dstr, nm);
+
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+
+ dinfo("%s: onlining %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip),
+ ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
+
+ /* Online the child_dip of usb_as and hid, if not already */
+ if ((strcmp(ddi_driver_name(child_dip), "usb_as") == 0) ||
+ (strcmp(ddi_driver_name(child_dip), "hid") == 0)) {
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ if (ndi_devi_online(child_dip, NDI_ONLINE_ATTACH) !=
+ NDI_SUCCESS) {
+ dinfo("%s: failed to online device %s%d\n",
+ uacp->dstr,
+ ddi_driver_name(child_dip),
+ ddi_get_instance(child_dip));
+
+ /* only onlining usb_as is fatal */
+ if (strcmp(ddi_driver_name(child_dip),
+ "usb_as") == 0) {
+ mutex_enter(&uacp->usb_ac_mutex);
+ rval = USB_FAILURE;
+ break;
+ }
+ }
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+ child_dip = ddi_get_next_sibling(child_dip);
+ }
+
+ return (rval);
}
+/*
+ * hold all audio children before or after plumbing
+ * online usb_as and hid, if not already
+ */
static void
-usb_ac_pm_busy_component(usb_ac_state_t *usb_ac_statep)
+usb_ac_hold_siblings(usb_ac_state_t *uacp)
{
- ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+ int circ;
+ dev_info_t *pdip, *child_dip;
+ char *nm = "usb_ac_hold_siblings";
- if (usb_ac_statep->usb_ac_pm != NULL) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy++;
-
- USB_DPRINTF_L4(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_busy_component: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ dinfo("%s: %s\n", uacp->dstr, nm);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ /* hold all siblings and ourselves */
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
- if (pm_busy_component(usb_ac_statep->usb_ac_dip, 0) !=
- DDI_SUCCESS) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+ /* hold the children */
+ ndi_devi_enter(pdip, &circ);
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+ ndi_hold_devi(child_dip);
- USB_DPRINTF_L2(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_busy_component failed: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ dinfo("%s: held %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip), ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
- }
+ child_dip = ddi_get_next_sibling(child_dip);
}
+ ndi_devi_exit(pdip, circ);
}
+/*
+ * release all audio children before or after plumbing
+ */
static void
-usb_ac_pm_idle_component(usb_ac_state_t *usb_ac_statep)
+usb_ac_rele_siblings(usb_ac_state_t *uacp)
{
- ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+ int circ;
+ dev_info_t *pdip, *child_dip;
+ char *nm = "usb_ac_rele_siblings";
- if (usb_ac_statep->usb_ac_pm != NULL) {
- if (pm_idle_component(usb_ac_statep->usb_ac_dip, 0) ==
- DDI_SUCCESS) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- ASSERT(usb_ac_statep->usb_ac_pm->acpm_pm_busy > 0);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+ dinfo("%s: %s\n", uacp->dstr, nm);
- USB_DPRINTF_L4(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_idle_component: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ /* release all siblings and ourselves */
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+ ndi_devi_enter(pdip, &circ);
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+ ndi_rele_devi(child_dip);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
- }
+ dinfo("%s: released %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip), ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
+
+ child_dip = ddi_get_next_sibling(child_dip);
}
+ ndi_devi_exit(pdip, circ);
}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
index 6318d089bd..cf1da6fa0d 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
@@ -29,15 +29,6 @@
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-enabled = 0; <-- mixer disabled, old audio(7I) behavior
-# mixer-enabled = 1; <-- mixer enabled
-#
-
-mixer-enabled = 1;
#
# Uncomment reset-configuration to cause the usb_ac driver's state to
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c
deleted file mode 100644
index d23b379c7c..0000000000
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c
+++ /dev/null
@@ -1,1202 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * This is a dacf module for usb audio plumbing/unplumbing based
- * upon the Extensions to Device Autoconfiguration project. See
- * PSARC/1998/212 for more details.
- *
- * This module provides the dacf functions to be called after a
- * driver has attached and before it detaches.
- * Particularly, the usb_ac_mux_plumbing() is called after
- * usb_ac_attach() is called and usb_ac_mux_unplumbing() is called
- * before usb_ac_detach() is going to be called. This facilitates
- * the configuration of usb_as and hid under usb_ac and also
- * provides * usb_ac and usb_as hotplugging.
- *
- * This dacf module only supports usb_as and hid plumbing under
- * usb_ac.
- *
- * Note: This module shares some common data structures with usb_ac
- * module. So it would require dependency on usb_ac for the module
- * loading. But the side effect for usb_ac_dacf to depend on usb_ac
- * is a deadlock situation created when doing "modunload -i
- * <usb_ac_dacf_mod_id>" before "modunload -i <usb_ac_mod_id".
- * To avoid the dependency, space_store() and space_fetch() are
- * used to share the usb_ac data structure with usb_ac_dacf.
- */
-#include <sys/usb/usba/usbai_version.h>
-#include <sys/usb/usba.h>
-#include <sys/sunndi.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-
-#include <sys/usb/clients/audio/usb_audio.h>
-#include <sys/usb/clients/audio/usb_mixer.h>
-#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
-
-#include <sys/stropts.h>
-#include <sys/dacf.h>
-
-/* for getting the minor node info from hid */
-#include <sys/usb/clients/hid/hidminor.h>
-#include <sys/usb/clients/audio/usb_as/usb_as.h>
-
-/*
- * Dacf entry points
- */
-static int usb_ac_mux_plumbing(dacf_infohdl_t, dacf_arghdl_t, int);
-static int usb_ac_mux_unplumbing(dacf_infohdl_t, dacf_arghdl_t, int);
-
-/*
- * External functions
- */
-extern uint_t nproc;
-#define INIT_PROCESS_CNT 3
-
-extern uintptr_t space_fetch(char *);
-
-/*
- * Internal functions
- */
-static int usb_ac_mux_walk_siblings(usb_ac_state_t *, ldi_handle_t);
-static void usb_ac_print_reg_data(usb_ac_state_t *,
- usb_as_registration_t *);
-static int usb_ac_get_reg_data(usb_ac_state_t *, ldi_handle_t, int);
-static int usb_ac_setup_plumbed(usb_ac_state_t *, int, int, int);
-static int usb_ac_mixer_registration(usb_ac_state_t *,
- usb_ac_state_space_t *);
-static void usb_ac_hold_siblings(usb_ac_state_t *);
-static int usb_ac_online_siblings(usb_ac_state_t *);
-static void usb_ac_rele_siblings(usb_ac_state_t *);
-
-static am_ad_entry_t *usb_ac_entry;
-_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_ac_entry))
-
-
-/* just generic, USB Audio, 1.0 spec-compliant */
-static audio_device_t usb_dev_info =
- { {"USB Audio"}, {"1.0"}, {"external"} };
-
-static dacf_op_t usb_ac_plumb_op[] = {
- { DACF_OPID_POSTATTACH, usb_ac_mux_plumbing },
- { DACF_OPID_PREDETACH, usb_ac_mux_unplumbing },
- { DACF_OPID_END, NULL },
-};
-
-static dacf_opset_t opsets[] = {
- { "usb_audio_config", usb_ac_plumb_op },
- { NULL, NULL }
-};
-
-struct dacfsw usb_audio_dacfsw = {
- DACF_MODREV_1,
- opsets,
-};
-
-struct modldacf usb_audio_dacf = {
- &mod_dacfops, /* Type of module */
- "USB_AC_DACF",
- &usb_audio_dacfsw
-};
-
-struct modlinkage usb_audio_modlinkage = {
- MODREV_1, (void *)&usb_audio_dacf, NULL
-};
-
-
-int
-_init(void)
-{
- return (mod_install(&usb_audio_modlinkage));
-}
-
-
-int
-_fini()
-{
- return (mod_remove(&usb_audio_modlinkage));
-}
-
-
-int
-_info(struct modinfo *modinfop)
-{
- return (mod_info(&usb_audio_modlinkage, modinfop));
-}
-
-
-/*
- * This routine is called at post attach time for the usb_ac module
- * by the DACF framework.
- */
-/*ARGSUSED*/
-static int
-usb_ac_mux_plumbing(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
-{
- major_t major;
- minor_t minor;
- int instance;
- usb_ac_state_t *uacp;
- usb_ac_state_space_t *ssp;
- dev_info_t *dip;
- int error;
- ldi_handle_t mux_lh;
- dev_t mux_devt;
- ldi_ident_t li;
-
- /* get the usb_ac dip */
- dip = dacf_devinfo_node(info_hdl);
- instance = ddi_get_instance(dip);
-
- /* Retrieve the soft state information */
- if ((ssp = (usb_ac_state_space_t *)space_fetch("usb_ac")) ==
- NULL) {
-
- return (DACF_FAILURE);
- }
-
- if ((uacp = (usb_ac_state_t *)ddi_get_soft_state(ssp->sp,
- instance)) == NULL) {
-
- return (DACF_FAILURE);
- }
- ASSERT(dip == uacp->usb_ac_dip);
-
- usb_ac_entry = ssp->ac_entryp;
-
- /* Access to the global variables is synchronized */
- mutex_enter(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_plumbing callback, state=%d",
- uacp->usb_ac_plumbing_state);
-
- /*
- * by design, dacf will try to plumb again if an unplumb failed.
- * therefore, just return success
- */
- if (uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED) {
- mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "audio streams driver already plumbed");
-
- return (DACF_SUCCESS);
- }
-
- /* usb_as and hid should be attached but double check */
- if (usb_ac_online_siblings(uacp) != USB_SUCCESS) {
- mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "no audio streams driver plumbed");
-
- return (DACF_FAILURE);
- }
-
- major = ddi_driver_major(dip);
- ASSERT(major != (major_t)-1);
-
- minor = dacf_minor_number(info_hdl);
- ASSERT(minor == uacp->usb_ac_mux_minor);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "major 0x%x, minor %d usb_ac_mux_plumbing: driver name "
- "%s\n", major, minor, (char *)dacf_driver_name(info_hdl));
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* bring the device to full power */
- (ssp->pm_busy_component)(uacp);
- (void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
-
- /* avoid dips disappearing while we are plumbing */
- usb_ac_hold_siblings(uacp);
-
- /* opening usb_ac for plumbing underneath */
- mux_devt = makedevice(major, minor);
- error = ldi_ident_from_mod(&usb_audio_modlinkage, &li);
- if (error == 0) {
- error = ldi_open_by_dev(&mux_devt, OTYP_CHR,
- FREAD|FWRITE|FNOCTTY|FNONBLOCK, kcred, &mux_lh, li);
- ldi_ident_release(li);
- }
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "open failed, error=%d", error);
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_mux_lh = mux_lh;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "mux_lh=0x%p", (void *)mux_lh);
-
- /*
- * walk all siblings and create the usb_ac<->usb_as and
- * usb_ac<->hid streams. return of 0 indicates no or
- * partial/failed plumbing
- */
- if (usb_ac_mux_walk_siblings(uacp, mux_lh) == 0) {
- /* pretend that we are plumbed so we can unplumb */
- uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- (void) usb_ac_mux_unplumbing(info_hdl, arg_hdl, flags);
-
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "no audio streams driver plumbed");
-
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
- uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
-
- /* restore state if we have already registered with the mixer */
- if (uacp->usb_ac_registered_with_mixer) {
-
- (void) (ssp->restore_func)(uacp, USB_FLAGS_SLEEP);
-
- } else if (usb_ac_mixer_registration(uacp, ssp) != USB_SUCCESS) {
- mutex_exit(&uacp->usb_ac_mutex);
-
- (void) usb_ac_mux_unplumbing(info_hdl, arg_hdl, flags);
-
- USB_DPRINTF_L1(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "mixer registration failed");
-
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_SUCCESS);
-}
-
-
-/*
- * This is the pre-detach routine invoked for usb_ac module by DACF framework
- */
-/*ARGSUSED*/
-static int
-usb_ac_mux_unplumbing(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
-{
- usb_ac_state_t *uacp;
- usb_ac_state_space_t *ssp;
- dev_info_t *dip;
- ldi_handle_t mux_lh;
- dev_info_t *child_dip;
- int i, error;
- int maxlinked = 0;
-
- /* this is the usb_ac dip */
- dip = dacf_devinfo_node(info_hdl);
-
- /* Retrieve the soft state information */
- if ((ssp = (usb_ac_state_space_t *)space_fetch("usb_ac")) ==
- NULL) {
-
- return (DACF_FAILURE);
- }
-
- if ((uacp = (usb_ac_state_t *)ddi_get_soft_state(ssp->sp,
- ddi_get_instance(dip))) == NULL) {
-
- return (DACF_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing callback, state=%d",
- uacp->usb_ac_plumbing_state);
-
- ASSERT(uacp->usb_ac_plumbing_state != USB_AC_STATE_UNPLUMBED);
-
- if (uacp->usb_ac_plumbing_state == USB_AC_STATE_UNPLUMBED) {
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "already unplumbed!");
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (DACF_SUCCESS);
- }
-
- ASSERT(dip == uacp->usb_ac_dip);
-
- mux_lh = uacp->usb_ac_mux_lh;
-
- /* usb_ac might not have anything plumbed yet */
- if (uacp->usb_ac_current_plumbed_index == -1) {
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "nothing plumbed!");
- uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
-
- goto close_mux;
- }
-
- /* do not allow detach if still busy */
- if (uacp->usb_ac_busy_count) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "mux still open (%d %d)", uacp->usb_ac_busy_count,
- e_ddi_devi_holdcnt(dip));
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (DACF_FAILURE);
- }
-
- uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
-
- /* wait till tasks have drained using save state */
- mutex_exit(&uacp->usb_ac_mutex);
- (void) audio_sup_save_state(uacp->usb_ac_audiohdl,
- AUDIO_ALL_DEVICES, AUDIO_BOTH);
- mutex_enter(&uacp->usb_ac_mutex);
-
- mux_lh = uacp->usb_ac_mux_lh;
- ASSERT(mux_lh != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing mux_lh 0x%p", (void *)mux_lh);
-
- /* unlink and close ac-as and ac-hid streams */
- maxlinked = uacp->usb_ac_current_plumbed_index + 1;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing maxlinked %d", maxlinked);
-
- for (i = 0; i < maxlinked; i++) {
- int linkid = uacp->usb_ac_plumbed[i].acp_linkid;
-
- child_dip = uacp->usb_ac_plumbed[i].acp_dip;
- uacp->usb_ac_current_plumbed_index = i;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing linkid %d ", linkid);
-
- if (child_dip) {
- int rval;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- error = ldi_ioctl(mux_lh, I_PUNLINK, (intptr_t)linkid,
- FKIOCTL, kcred, &rval);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "%s%d: unplink, error=%d",
- ddi_driver_name(child_dip),
- ddi_get_instance(child_dip), error);
-
- mutex_enter(&uacp->usb_ac_mutex);
- }
-
- }
-
-close_mux:
- if (mux_lh) {
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(mux_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "closed mux");
- uacp->usb_ac_mux_lh = NULL;
- }
-
- uacp->usb_ac_current_plumbed_index = -1;
- mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing: done");
-
- return (DACF_SUCCESS);
-}
-
-
-/*
- * walk all siblings and create the ac<->as and ac<->hid streams
- */
-static int
-usb_ac_mux_walk_siblings(usb_ac_state_t *uacp, ldi_handle_t mux_lh)
-{
- dev_info_t *pdip;
- dev_info_t *child_dip;
- major_t drv_major;
- minor_t drv_minor;
- int drv_instance;
- dev_t drv_devt;
- ldi_handle_t drv_lh;
- ldi_ident_t li;
- int linkid;
- int error;
- int count = 0;
-
- ASSERT(mutex_owned(&uacp->usb_ac_mutex));
-
- mutex_exit(&uacp->usb_ac_mutex);
- pdip = ddi_get_parent(uacp->usb_ac_dip);
- mutex_enter(&uacp->usb_ac_mutex);
-
- child_dip = ddi_get_child(pdip);
-
- while ((child_dip != NULL) && (count < USB_AC_MAX_PLUMBED)) {
- drv_instance = ddi_get_instance(child_dip);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "plumbing %s%d", ddi_driver_name(child_dip), drv_instance);
-
- /* ignore own dip */
- if (child_dip == uacp->usb_ac_dip) {
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
- drv_instance = ddi_get_instance(child_dip);
-
- /* ignore other dip other than usb_as and hid */
- if (strcmp(ddi_driver_name(child_dip), "usb_as") == 0) {
- uacp->usb_ac_plumbed[count].acp_driver = USB_AS_PLUMBED;
- drv_minor = USB_AS_CONSTRUCT_MINOR(drv_instance);
- } else if (strcmp(ddi_driver_name(child_dip), "hid") == 0) {
- uacp->usb_ac_plumbed[count].acp_driver = USB_AH_PLUMBED;
- drv_minor = HID_CONSTRUCT_EXTERNAL_MINOR(drv_instance);
- } else {
- drv_minor = drv_instance;
- uacp->usb_ac_plumbed[count].acp_driver =
- UNKNOWN_PLUMBED;
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
- if (!i_ddi_devi_attached(child_dip)) {
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
- if (DEVI_IS_DEVICE_REMOVED(child_dip)) {
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "opening %s%d", ddi_driver_name(child_dip), drv_instance);
-
- drv_major = ddi_driver_major(child_dip);
-
- uacp->usb_ac_current_plumbed_index = count;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- drv_devt = makedevice(drv_major, drv_minor);
-
- error = ldi_ident_from_mod(&usb_audio_modlinkage, &li);
- if (error == 0) {
- error = ldi_open_by_dev(&drv_devt, OTYP_CHR,
- FREAD|FWRITE, kcred, &drv_lh, li);
- ldi_ident_release(li);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "ldi_open_by_dev failed on major = %d minor = %d, "
- "name = %s error=%d", drv_major, drv_instance,
- ddi_driver_name(child_dip), error);
- mutex_exit(&uacp->usb_ac_mutex);
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (0);
- }
-
- uacp->usb_ac_plumbed[count].acp_dip = child_dip;
- uacp->usb_ac_plumbed[count].acp_ifno =
- usb_get_if_number(child_dip);
-
- if (uacp->usb_ac_plumbed[count].acp_driver == USB_AS_PLUMBED) {
- /* get registration data */
- if (usb_ac_get_reg_data(uacp, drv_lh, count) !=
- USB_SUCCESS) {
-
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "get_reg_data failed on major = %d "
- "minor = %d, name = %s", drv_major,
- drv_instance,
- ddi_driver_name(child_dip));
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- return (0);
- }
- } else if (uacp->usb_ac_plumbed[count].acp_driver ==
- USB_AH_PLUMBED) {
- int rval;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* push usb_ah module on top of hid */
- error = ldi_ioctl(drv_lh, I_PUSH, (intptr_t)"usb_ah",
- FKIOCTL, kcred, &rval);
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "ldi_ioctl failed for usb_ah, "
- "major:%d minor:%d name:%s",
- drv_major, drv_instance,
- ddi_driver_name(child_dip));
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- /* skip plumbing the hid driver */
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
- } else {
- /* should not be here */
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_plumbing: unknown module");
- count --;
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- /* skip plumbing an unknown module */
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "linking %s%d", ddi_driver_name(child_dip), drv_instance);
-
- /* usb_ac_plumb_ioctl sets lwq, this entry should be free */
- ASSERT(uacp->usb_ac_plumbed[count].acp_lwq == NULL);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* plumbing one at a time */
- error = ldi_ioctl(mux_lh, I_PLINK, (intptr_t)drv_lh,
- FREAD|FWRITE|FNOCTTY|FKIOCTL, kcred, &linkid);
-
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "plink failed for major:%d minor:%d"
- "name:%s", drv_major, drv_instance,
- ddi_driver_name(child_dip));
-
- return (0);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "link id %s%d 0x%x", ddi_driver_name(child_dip),
- ddi_get_instance(child_dip), linkid);
-
- /* lwq should be set by usb_ac_plumb_ioctl by now */
- ASSERT(uacp->usb_ac_plumbed[count].acp_lwq != NULL);
-
- uacp->usb_ac_plumbed[count++].acp_linkid = linkid;
-
- child_dip = ddi_get_next_sibling(child_dip);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "%d drivers plumbed under usb_ac mux", count);
-
- return (count);
-}
-
-
-/*
- * usb_ac_find_default_port:
- */
-static int
-usb_ac_find_default_port(uint_t port)
-{
- int i;
-
- for (i = 0; i < 32; i++) {
- if (port & (1 << i)) {
-
- return (1 << i);
- }
- }
-
- return (0);
-}
-
-
-/*
- * Register with mixer only after first plumbing.
- * Also do not register if earlier reg data
- * couldn't be received from at least one
- * streaming interface
- */
-_NOTE(SCHEME_PROTECTS_DATA("private", am_ad_info))
-
-static int
-usb_ac_mixer_registration(usb_ac_state_t *uacp, usb_ac_state_space_t *ssp)
-{
- am_ad_info_t *info = &uacp->usb_ac_am_ad_info;
- audio_info_t *dflts = &uacp->usb_ac_am_ad_defaults;
- usb_as_registration_t *asreg;
- int n, nplay, nrec;
-
- ASSERT(uacp != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_mixer_registration: infp=0x%p, dflts=0x%p",
- (void *)info, (void *)dflts);
-
- ASSERT(dflts != NULL);
- ASSERT(info != NULL);
-
- if (uacp->usb_ac_registered_with_mixer) {
-
- return (USB_SUCCESS);
- }
-
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
- if (uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
- break;
- }
- }
-
- /* Haven't found a streaming interface; fail mixer registration */
- if (n > USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "no streaming interface");
-
- return (USB_FAILURE);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_mixer_registration: mixer enabled =%d",
- uacp->usb_ac_mixer_mode_enable);
-
- info->ad_int_vers = AM_VERSION;
- info->ad_mode = (uacp->usb_ac_mixer_mode_enable ?
- AM_MIXER_MODE : AM_COMPAT_MODE);
-
- info->ad_add_mode = 0;
- info->ad_codec_type = AM_TRAD_CODEC;
- info->ad_defaults = dflts;
-
- dflts->monitor_gain = 0;
- dflts->output_muted = B_FALSE;
- dflts->hw_features = 0;
- dflts->sw_features = AUDIO_SWFEATURE_MIXER;
-
- /*
- * Fill out streaming interface specific stuff
- * Note that we handle only one playing and one recording
- * streaming interface at the most
- */
- nplay = nrec = 0;
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
- int ch, chs, default_gain, id;
-
- if (uacp->usb_ac_streams[n].acs_rcvd_reg_data == 0) {
- continue;
- }
-
- asreg = uacp->usb_ac_streams[n].acs_streams_reg;
- if (asreg->reg_valid == 0) {
- continue;
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* set first format so get_featureID can be succeed */
- (void) ssp->ac_entryp->ad_set_format(uacp->usb_ac_audiohdl, 0,
- asreg->reg_mode,
- asreg->reg_compat_srs.ad_srs[0],
- asreg->reg_formats[0].fmt_chns,
- asreg->reg_formats[0].fmt_precision,
- asreg->reg_formats[0].fmt_encoding);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- chs = asreg->reg_formats[0].fmt_chns;
-
- /* check if any channel supports vol. control for this fmt */
- for (ch = 0; ch <= chs; ch++) {
- if ((id = ssp->get_featureID_func(uacp,
- asreg->reg_mode, ch,
- USB_AUDIO_VOLUME_CONTROL)) != -1) {
- USB_DPRINTF_L3(PRINT_MASK_ATTA,
- uacp->usb_ac_log_handle,
- "dir=%d featureID=%d",
- asreg->reg_mode, id);
-
- break;
- }
- }
- default_gain = (id == USB_AC_ID_NONE) ?
- AUDIO_MAX_GAIN : (AUDIO_MAX_GAIN/2);
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "mode=%d chs=%d default_gain=%d id=%d",
- asreg->reg_mode, chs, default_gain, id);
-
- if (asreg->reg_mode == AUDIO_PLAY) {
- nplay++;
- ASSERT(nplay == 1);
-
- dflts->play.sample_rate =
- asreg->reg_compat_srs.ad_srs[0];
- dflts->play.channels =
- asreg->reg_formats[0].fmt_chns;
- dflts->play.precision =
- asreg->reg_formats[0].fmt_precision;
- dflts->play.encoding =
- asreg->reg_formats[0].fmt_encoding;
- dflts->play.gain = default_gain;
- dflts->play.port = usb_ac_find_default_port(
- uacp->usb_ac_output_ports);
- dflts->play.avail_ports = uacp->usb_ac_output_ports;
- dflts->play.mod_ports = 0;
- /* no support for mixer unit */
- dflts->play.buffer_size = 8*1024;
- dflts->play.balance = AUDIO_MID_BALANCE;
- dflts->hw_features |= AUDIO_HWFEATURE_PLAY;
-
- info->ad_play.ad_mixer_srs = asreg->reg_mixer_srs;
- info->ad_play.ad_compat_srs = asreg->reg_compat_srs;
- info->ad_play.ad_conv = &am_src2;
- info->ad_play.ad_sr_info = NULL;
- info->ad_play.ad_chs = asreg->reg_channels;
- info->ad_play.ad_int_rate = 1000; /* every 1 ms */
- info->ad_play.ad_max_chs = 200;
- info->ad_play.ad_bsize = 8 * 1024;
- info->ad_play_comb = asreg->reg_combinations;
- } else {
- nrec++;
- ASSERT(nrec == 1);
-
- dflts->record.sample_rate =
- asreg->reg_compat_srs.ad_srs[0];
- dflts->record.channels =
- asreg->reg_formats[0].fmt_chns;
- dflts->record.precision =
- asreg->reg_formats[0].fmt_precision;
- dflts->record.encoding =
- asreg->reg_formats[0].fmt_encoding;
- dflts->record.gain = default_gain;
- dflts->record.port = usb_ac_find_default_port(
- uacp->usb_ac_input_ports);
- dflts->record.avail_ports = uacp->usb_ac_input_ports;
- dflts->record.mod_ports = uacp->usb_ac_input_ports;
- dflts->record.buffer_size = 8*1024;
- dflts->record.balance = AUDIO_MID_BALANCE;
- dflts->hw_features |= AUDIO_HWFEATURE_RECORD;
-
- info->ad_record.ad_mixer_srs = asreg->reg_mixer_srs;
- info->ad_record.ad_compat_srs = asreg->reg_compat_srs;
- info->ad_record.ad_conv = &am_src2;
- info->ad_record.ad_sr_info = NULL;
- info->ad_record.ad_chs = asreg->reg_channels;
- info->ad_record.ad_int_rate = 1000; /* every 1 ms */
- info->ad_record.ad_max_chs = 200;
- info->ad_record.ad_bsize = 8 * 1024;
- info->ad_num_mics = 1;
- info->ad_rec_comb = asreg->reg_combinations;
- }
- }
-
- if (nplay && nrec) {
- /*
- * we pretend to always support AUDIO_HWFEATURE_IN2OUT
- * since there is no simple way to find out at this
- * point
- */
- dflts->hw_features |= AUDIO_HWFEATURE_DUPLEX |
- AUDIO_HWFEATURE_IN2OUT;
- }
-
- /* the rest */
- info->ad_entry = usb_ac_entry;
- info->ad_dev_info = &usb_dev_info;
- info->ad_diag_flags = 0;
- info->ad_diff_flags = AM_DIFF_SR|AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- info->ad_assist_flags = 0;
- info->ad_misc_flags = AM_MISC_RP_EXCL;
- info->ad_translate_flags = 0;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- if (am_attach(uacp->usb_ac_audiohdl, DDI_ATTACH, info) ==
- AUDIO_FAILURE) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "am_attach: failed");
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (USB_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_registered_with_mixer = 1;
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "am_attach succeeded");
-
- return (USB_SUCCESS);
-}
-
-
-/*
- * get registration data from usb_as driver unless we already
- * have 2 registrations
- */
-static int
-usb_ac_get_reg_data(usb_ac_state_t *uacp, ldi_handle_t drv_lh, int index)
-{
- int n, error, rval;
- usb_as_registration_t *streams_reg;
-
- /* if already registered, just setup data structures again */
- if (uacp->usb_ac_registered_with_mixer) {
-
- return (usb_ac_setup_plumbed(uacp, index, -1, -1));
- }
-
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n ++) {
- /*
- * We haven't received registration data
- * from n-th streaming interface in the array
- */
- if (!uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
- break;
- }
- }
-
- if (n >= USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L1(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "More than 2 streaming interfaces (play "
- "and/or record) currently not supported");
-
- return (USB_FAILURE);
- }
-
- /* take the stream reg struct with the same index */
- streams_reg = &uacp->usb_ac_streams_reg[n];
-
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "regdata from usb_as: streams_reg=0x%p, n=%d",
- (void *)streams_reg, n);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- if ((error = ldi_ioctl(drv_lh, USB_AUDIO_MIXER_REGISTRATION,
- (intptr_t)streams_reg, FKIOCTL, kcred, &rval)) != USB_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "ldi_ioctl fails for mixer registration, error=%d", error);
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (USB_FAILURE);
- } else {
- mutex_enter(&uacp->usb_ac_mutex);
-
- rval = usb_ac_setup_plumbed(uacp, index, n, n);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_streams: index=%d, received_reg_data=%d type=%s",
- index, uacp->usb_ac_streams[n].acs_rcvd_reg_data,
- ((streams_reg->reg_mode == AUDIO_PLAY) ?
- "play" : "record"));
-
- usb_ac_print_reg_data(uacp, streams_reg);
-
- return (rval);
- }
-}
-
-
-/*
- * setup plumbed and stream info structure, either initially or
- * after replumbing
- * On replumbing, str_idx and reg_idx are -1
- */
-static int
-usb_ac_setup_plumbed(usb_ac_state_t *uacp, int plb_idx, int str_idx,
- int reg_idx)
-{
- int i;
-
- if (str_idx == -1) {
- /* find a free streams info structure */
- for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
- if (uacp->usb_ac_streams[i].acs_plumbed == NULL) {
- break;
- }
- }
- ASSERT(i < USB_AC_MAX_AS_PLUMBED);
- str_idx = i;
- }
-
- uacp->usb_ac_plumbed[plb_idx].acp_data =
- &uacp->usb_ac_streams[str_idx];
- uacp->usb_ac_streams[str_idx].acs_plumbed =
- &uacp->usb_ac_plumbed[plb_idx];
- uacp->usb_ac_streams[str_idx].acs_rcvd_reg_data = 1;
- cv_init(&(uacp->usb_ac_streams[str_idx].
- acs_ac_to_as_req.acr_cv), NULL, CV_DRIVER, NULL);
-
- if (reg_idx == -1) {
- /*
- * find the corresponding registration structure, match
- * on interface number and not on dip since dip may have
- * changed
- */
- for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
- if (uacp->usb_ac_streams_reg[i].reg_ifno ==
- uacp->usb_ac_plumbed[plb_idx].acp_ifno) {
- break;
- }
- }
- if (i == USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "no corresponding registration structure");
-
- return (USB_FAILURE);
- }
- reg_idx = i;
- }
- uacp-> usb_ac_streams[str_idx].acs_streams_reg =
- &uacp->usb_ac_streams_reg[reg_idx];
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup_plumbed: plb_idx=%d str_idx=%d reg_idx=%d",
- plb_idx, str_idx, reg_idx);
-
- return (USB_SUCCESS);
-}
-
-
-/*
- * function to dump registration data
- */
-static void
-usb_ac_print_reg_data(usb_ac_state_t *uacp,
- usb_as_registration_t *reg)
-{
- int n;
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_print_reg_data: Begin valid=%d, play=%d, "
- "n_formats=%d, mixer srs ptr=0x%p, compat srs ptr=0x%p",
- reg->reg_valid, reg->reg_mode, reg->reg_n_formats,
- (void *)&reg->reg_mixer_srs, (void *)&reg->reg_compat_srs);
-
- for (n = 0; n < reg->reg_n_formats; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "format%d: alt=%d chns=%d prec=%d enc=%d", n,
- reg->reg_formats[n].fmt_alt,
- reg->reg_formats[n].fmt_chns,
- reg->reg_formats[n].fmt_precision,
- reg->reg_formats[n].fmt_encoding);
- }
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "combinations: %d %d %d %d %d %d %d %d",
- reg->reg_combinations[0].ad_prec, reg->reg_combinations[0].ad_enc,
- reg->reg_combinations[1].ad_prec, reg->reg_combinations[1].ad_enc,
- reg->reg_combinations[2].ad_prec, reg->reg_combinations[2].ad_enc,
- reg->reg_combinations[3].ad_prec, reg->reg_combinations[3].ad_enc);
-
-
- for (n = 0; n < USB_AS_N_FORMATS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_formats[%d] ptr=0x%p", n,
- (void *)&reg->reg_formats[n]);
- }
-
- for (n = 0; n < USB_AS_N_CHANNELS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_channels[%d]=%d", n, reg->reg_channels[n]);
- }
-
- for (n = 0; n < USB_AS_N_COMBINATIONS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_combinations[%d] ptr=0x%p", n,
- (void *)&reg->reg_combinations[n]);
- }
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_print_reg_data: End");
-}
-
-
-static int
-usb_ac_online_siblings(usb_ac_state_t *uacp)
-{
- dev_info_t *pdip, *child_dip;
- int rval = USB_SUCCESS;
-
- ASSERT(mutex_owned(&uacp->usb_ac_mutex));
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_onlining siblings");
-
- pdip = ddi_get_parent(uacp->usb_ac_dip);
-
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "onlining %s%d ref=%d", ddi_driver_name(child_dip),
- ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
-
- /* Online the child_dip of usb_as and hid, if not already */
- if ((strcmp(ddi_driver_name(child_dip), "usb_as") == 0) ||
- (strcmp(ddi_driver_name(child_dip), "hid") == 0)) {
- mutex_exit(&uacp->usb_ac_mutex);
- if (ndi_devi_online(child_dip, NDI_ONLINE_ATTACH) !=
- NDI_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "failure to online driver %s%d",
- ddi_driver_name(child_dip),
- ddi_get_instance(child_dip));
-
- /* only onlining usb_as is fatal */
- if (strcmp(ddi_driver_name(child_dip),
- "usb_as") == 0) {
- mutex_enter(&uacp->usb_ac_mutex);
- rval = USB_FAILURE;
- break;
- }
- }
- mutex_enter(&uacp->usb_ac_mutex);
- }
- child_dip = ddi_get_next_sibling(child_dip);
- }
-
- return (rval);
-}
-
-
-/*
- * hold all audio children before or after plumbing
- * online usb_as and hid, if not already
- */
-static void
-usb_ac_hold_siblings(usb_ac_state_t *uacp)
-{
- int circ;
- dev_info_t *pdip, *child_dip;
-
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_hold_siblings:");
-
- /* hold all siblings and ourselves */
- pdip = ddi_get_parent(uacp->usb_ac_dip);
-
- /* hold the children */
- ndi_devi_enter(pdip, &circ);
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
-
- ndi_hold_devi(child_dip);
-
- USB_DPRINTF_L3(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_hold_siblings: %s%d ref=%d",
- ddi_driver_name(child_dip), ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
-
- child_dip = ddi_get_next_sibling(child_dip);
- }
- ndi_devi_exit(pdip, circ);
-}
-
-
-/*
- * release all audio children before or after plumbing
- */
-static void
-usb_ac_rele_siblings(usb_ac_state_t *uacp)
-{
- int circ;
- dev_info_t *pdip, *child_dip;
-
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_rele_siblings:");
-
- /* release all siblings and ourselves */
- pdip = ddi_get_parent(uacp->usb_ac_dip);
- ndi_devi_enter(pdip, &circ);
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
- ndi_rele_devi(child_dip);
- USB_DPRINTF_L3(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_rele_siblings: %s%d ref=%d",
- ddi_driver_name(child_dip), ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
- child_dip = ddi_get_next_sibling(child_dip);
- }
- ndi_devi_exit(pdip, circ);
-}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c b/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
index 796408aebc..e0358f5ecf 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
@@ -19,28 +19,28 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* USB audio hid streams module - processes hid data
- * from HID driver and converts to a format that SADA
+ * from HID driver and converts to a format that usb_ac
* understands. The stack looks like this :
* hid --> usb_ah --> usb_ac --> audio framework
* usb_ac just acts as a passthrough layer for the converted data.
*
- * During open, usb_ah gets the parser handle from hid and gets
- * the hardware information passed as report descriptor. Then
- * it finds out the relevant usages and stores the bitmap and other
- * information in internal data structure. When a button is pressed
- * to. say, increase/decrease the volume, a report is generated and
- * hid sends that data up through the streams. usb_ah, upon getting
- * this information and with the prior knowledge about the bitmap
- * for each button, calculates the value and sends up to SADA
- * through usb_ac. SADA in turn sends a command down to speaker to
- * increase the volume of the speaker that is managed by usb_ac.
+ * During open, usb_ah gets the parser handle from hid and gets the
+ * hardware information passed as report descriptor. Then it finds out
+ * the relevant usages and stores the bitmap and other information in
+ * internal data structure. When a button is pressed to. say,
+ * increase/decrease the volume, a report is generated and hid sends
+ * that data up through the streams. usb_ah, upon getting this
+ * information and with the prior knowledge about the bitmap for each
+ * button, calculates the value and sends up to usb_ac. usb_ac in
+ * turn sends a command down to speaker to increase the volume of the
+ * speaker that is managed by usb_ac.
*/
#include <sys/usb/usba.h>
#include <sys/usb/clients/hid/hid.h>
@@ -49,12 +49,9 @@
#include <sys/strsun.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
#include <sys/usb/clients/audio/usb_audio.h>
#include <sys/usb/clients/audio/usb_mixer.h>
@@ -76,12 +73,12 @@ static void usb_ah_repeat_send(usb_ah_state_t *, usb_ah_button_descr_t *,
static void usb_ah_cancel_timeout(usb_ah_state_t *);
static void usb_ah_check_usage_send_data(usb_ah_state_t *, mblk_t *);
static int usb_ah_get_cooked_rd(usb_ah_state_t *);
+static mblk_t *usb_ah_mk_mctl(struct iocblk, void *, size_t);
/* stream qinit functions defined here */
static int usb_ah_open(queue_t *, dev_t *, int, int, cred_t *);
static int usb_ah_close(queue_t *, int, cred_t *);
-static void usb_ah_wput(queue_t *, mblk_t *);
-static void usb_ah_rput(queue_t *, mblk_t *);
+static int usb_ah_rput(queue_t *, mblk_t *);
/*
* Global Variables
@@ -137,21 +134,21 @@ static struct module_info usb_ah_minfo = {
/* read side for key data and ioctl replies */
static struct qinit usb_ah_rinit = {
- (int (*)())usb_ah_rput,
- (int (*)())NULL, /* service not used */
+ usb_ah_rput,
+ NULL, /* service not used */
usb_ah_open,
usb_ah_close,
- (int (*)())NULL,
+ NULL,
&usb_ah_minfo
};
-/* write side for ioctls */
+/* write side -- just pass everything down */
static struct qinit usb_ah_winit = {
- (int (*)())usb_ah_wput,
- (int (*)())NULL,
+ (int (*)(queue_t *, mblk_t *))putnext,
+ NULL,
usb_ah_open,
usb_ah_close,
- (int (*)())NULL,
+ NULL,
&usb_ah_minfo
};
@@ -218,17 +215,8 @@ usb_ah_open(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *crp)
return (0); /* already opened */
}
- switch (sflag) {
- case MODOPEN:
-
- break;
- case CLONEOPEN:
- USB_DPRINTF_L3(PRINT_MASK_OPEN, usb_ah_log_handle,
- "usb_ah_open: Clone open not supported");
-
- /* FALLTHRU */
- default:
-
+ if (sflag != MODOPEN) {
+ /* Only module open supported */
return (EINVAL);
}
@@ -323,9 +311,6 @@ usb_ah_open(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *crp)
usb_ahd->usb_ah_flags |= USB_AH_OPEN;
- USB_DPRINTF_L3(PRINT_MASK_OPEN, usb_ah_log_handle,
- "usb_ah_open exiting");
-
return (0);
}
@@ -362,81 +347,33 @@ usb_ah_close(register queue_t *q, int flag, cred_t *crp)
mutex_destroy(&usb_ahd->usb_ah_mutex);
kmem_free(usb_ahd, sizeof (usb_ah_state_t));
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, usb_ah_log_handle,
- "usb_ah_close exiting");
-
return (0);
}
/*
- * usb_ah_wput :
- * usb_ah module output queue put procedure: handles M_IOCTL
- * messages.
- */
-static void
-usb_ah_wput(register queue_t *q, register mblk_t *mp)
-{
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_wput entering");
-
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- if (*mp->b_rptr & FLUSHW) {
- flushq(q, FLUSHDATA);
- }
- if (*mp->b_rptr & FLUSHR) {
- flushq(RD(q), FLUSHDATA);
- }
-
- break;
- default:
- break;
- }
-
- putnext(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_wput exiting:3");
-}
-
-
-/*
* usb_ah_rput :
* Put procedure for input from driver end of stream (read queue).
*/
-static void
+static int
usb_ah_rput(register queue_t *q, register mblk_t *mp)
{
usb_ah_state_t *usb_ahd;
usb_ahd = (usb_ah_state_t *)q->q_ptr;
- USB_DPRINTF_L3(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_rput: Begin, usb_ah state=0x%p, q=0x%p, mp=0x%p",
- (void *)usb_ahd, (void *)q, (void *)mp);
-
if (usb_ahd == 0) {
freemsg(mp); /* nobody's listening */
- return;
+ return (0);
}
switch (mp->b_datap->db_type) {
- case M_FLUSH:
- if (*mp->b_rptr & FLUSHW)
- flushq(WR(q), FLUSHDATA);
- if (*mp->b_rptr & FLUSHR)
- flushq(q, FLUSHDATA);
- freemsg(mp);
- return;
case M_DATA:
if (!(usb_ahd->usb_ah_flags & USB_AH_OPEN)) {
freemsg(mp); /* not ready to listen */
- return;
} else if (MBLKL(mp) == usb_ahd->usb_ah_packet_size) {
/*
@@ -463,20 +400,23 @@ usb_ah_rput(register queue_t *q, register mblk_t *mp)
}
break;
+
case M_CTL:
usb_ah_mctl_receive(q, mp);
+ break;
- return;
+ case M_FLUSH:
case M_IOCACK:
case M_IOCNAK:
putnext(q, mp);
+ break;
- return;
default:
putnext(q, mp);
-
- return;
+ break;
}
+
+ return (0);
}
@@ -546,7 +486,7 @@ usb_ah_repeat_send(usb_ah_state_t *usb_ahd, usb_ah_button_descr_t *bd,
{
mblk_t *dup_mp;
- bd->mblk = usba_mk_mctl(mctlmsg, buf, len);
+ bd->mblk = usb_ah_mk_mctl(mctlmsg, buf, len);
if (bd->mblk != NULL) {
dup_mp = usb_ah_cp_mblk(bd->mblk);
@@ -579,8 +519,6 @@ usb_ah_timeout(void *addr)
usb_ahd = (usb_ah_state_t *)bd->uahp;
mutex_enter(&usb_ahd->usb_ah_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_timeout: tid=0x%p", usb_ahd->usb_ah_tid);
/*
* If a release event still hasn't reached, tid will be non-zero
@@ -612,9 +550,6 @@ usb_ah_cancel_timeout(usb_ah_state_t *usb_ahd)
{
queue_t *rq = usb_ahd->usb_ah_readq;
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_cancel_timeout: tid=0x%p", usb_ahd->usb_ah_tid);
-
if (usb_ahd->usb_ah_tid) {
(void) quntimeout(rq, usb_ahd->usb_ah_tid);
usb_ahd->usb_ah_tid = 0;
@@ -816,7 +751,7 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
/* Relative volume */
mctlmsg.ioc_cmd = USB_AUDIO_VOL_CHANGE;
mctlmsg.ioc_count = sizeof (uint_t);
- mctl_ptr = usba_mk_mctl(mctlmsg,
+ mctl_ptr = usb_ah_mk_mctl(mctlmsg,
&val, mctlmsg.ioc_count);
if (mctl_ptr != NULL) {
mutex_exit(&usb_ahd->
@@ -865,7 +800,7 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
if (val) {
mctlmsg.ioc_cmd = USB_AUDIO_MUTE;
mctlmsg.ioc_count = sizeof (uint_t);
- mctl_ptr = usba_mk_mctl(mctlmsg,
+ mctl_ptr = usb_ah_mk_mctl(mctlmsg,
&val, mctlmsg.ioc_count);
if (mctl_ptr != NULL) {
mutex_exit(&usb_ahd->usb_ah_mutex);
@@ -887,3 +822,21 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
mutex_exit(&usb_ahd->usb_ah_mutex);
freemsg(mp);
}
+
+
+/*
+ * since usb_ac now uses LDI to access HID streams, we must change the msg
+ * type from M_CTL to M_PROTO since the streamhead will not pass M_CTLs up
+ */
+static mblk_t *
+usb_ah_mk_mctl(struct iocblk mctlmsg, void *buf, size_t len)
+{
+ mblk_t *mp;
+
+ mp = usba_mk_mctl(mctlmsg, buf, len);
+ if (mp == NULL)
+ return (NULL);
+
+ mp->b_datap->db_type = M_PROTO;
+ return (mp);
+}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c b/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
index 75ae231c8a..aad709cb37 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
@@ -23,27 +23,25 @@
* Use is subject to license terms.
*/
-
/*
- * Audio Streams Driver: This driver is responsible for
- * (1) Processing audio data messages during play and record and
- * management of isoc pipe, (2) Selecting correct alternate that matches
- * a set of parameters and management of control pipe. This streams driver
- * is pushed under usb_ac and interacts with usb_ac using streams messages.
- * When a streams message has been received from usb_ac, it is immediately
- * put on WQ. The write side service routine loops thru all the queued
- * messages, processes them and sends up a reply. If the processing involves
- * an async USBA command, the reqly is sent up after completion of the
- * command.
+ * Audio Streams Interface Driver:
+ * This driver is derived from the legacy SADA streams-based usb_as driver
+ * and serves as an intermediate measure before the full conversion to the
+ * to the Boomer framework in a follow-on phase of the Boomer project, which
+ * will utilize more comprehensive USB audio features as well.
+ *
+ * usb_as is responsible for (1) Processing audio data messages during
+ * play and record and management of isoc pipe, (2) Selecting correct
+ * alternate that matches a set of parameters and management of control pipe.
+ * This driver is opened by usb_ac and interacts with usb_ac synchronously
+ * using ioctls. If the processing involves an async USBA command, the ioctl
+ * returns after completion of the command.
*
- * Note: (1) All streams messages from usb_ac are M_CTL messages.
- * (2) When there is a play/record, usb_as calls mixer routines directly for
- * data (play) or sends data to mixer (record).
+ * Note: When there is a play/record, usb_as calls framework routines
+ * directly for data (play) or sends data to mixer (record).
*
- * Serialization: usb_as being a streams driver and having the requirement
- * making non-blockings calls (USBA or streams or mixer) needs to drop
- * mutexes over such calls. But at the same time, a competing thread
- * can't be allowed to interfere with (1) pipe, (2) streams state.
+ * Serialization: A competing thread can't be allowed to interfere with
+ * (1) pipe, (2) streams state.
* So we need some kind of serialization among the asynchronous
* threads that can run in the driver. The serialization is mostly
* needed to avoid races among open/close/events/power entry points
@@ -54,34 +52,23 @@
*
* PM Model in usb_as: Raise power during attach and lower power in detach.
* If device is not fully powered, synchronous raise power in wsrv entry points.
- *
- * locking: Warlock is not aware of the automatic locking mechanisms for
- * streams drivers. This driver is single threaded per queue instance.
- *
- * TODO:
- * - mdb dcmds
- * - dump
- * - kstat
*/
#include <sys/usb/usba/usbai_version.h>
#include <sys/usb/usba.h>
-#include <sys/stropts.h>
-#include <sys/strsun.h>
-#include <sys/strsubr.h>
-#include <sys/strsun.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
#include <sys/usb/clients/audio/usb_audio.h>
#include <sys/usb/clients/audio/usb_mixer.h>
#include <sys/usb/clients/audio/usb_as/usb_as.h>
+#include "../usb_ac/audio_shim.h"
+
/* debug support */
uint_t usb_as_errlevel = USB_LOG_L4;
uint_t usb_as_errmask = (uint_t)-1;
@@ -95,12 +82,9 @@ static int usb_as_detach(dev_info_t *, ddi_detach_cmd_t);
static int usb_as_power(dev_info_t *, int, int);
static int usb_as_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-/*
- * STREAMS module entry points
- */
-static int usb_as_open();
-static int usb_as_close();
-static int usb_as_wsrv();
+static int usb_as_open(dev_t *, int, int, cred_t *);
+static int usb_as_close(dev_t, int, int, cred_t *);
+
/* support functions */
static void usb_as_cleanup(dev_info_t *, usb_as_state_t *);
@@ -118,11 +102,7 @@ static int usb_as_reconnect_event_cb(dev_info_t *);
static int usb_as_cpr_suspend(dev_info_t *);
static void usb_as_cpr_resume(dev_info_t *);
-static int usb_as_ioctl(queue_t *, mblk_t *);
-static int usb_as_mctl_rcv(queue_t *, mblk_t *);
-
-static void usb_as_default_xfer_cb(usb_pipe_handle_t, usb_ctrl_req_t *);
-static void usb_as_default_xfer_exc_cb(usb_pipe_handle_t, usb_ctrl_req_t *);
+static int usb_as_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
static int usb_as_pwrlvl0(usb_as_state_t *);
static int usb_as_pwrlvl1(usb_as_state_t *);
@@ -132,80 +112,32 @@ static void usb_as_pm_busy_component(usb_as_state_t *);
static void usb_as_pm_idle_component(usb_as_state_t *);
static void usb_as_restore_device_state(dev_info_t *, usb_as_state_t *);
-static int usb_as_setup(usb_as_state_t *, mblk_t *);
-static void usb_as_teardown(usb_as_state_t *, mblk_t *);
-static int usb_as_start_play(usb_as_state_t *, mblk_t *);
+static int usb_as_setup(usb_as_state_t *);
+static void usb_as_teardown(usb_as_state_t *);
+static int usb_as_start_play(usb_as_state_t *, usb_audio_play_req_t *);
static void usb_as_continue_play(usb_as_state_t *);
-static void usb_as_pause_play(usb_as_state_t *, mblk_t *);
+static void usb_as_pause_play(usb_as_state_t *);
-static void usb_as_qreply_error(usb_as_state_t *, queue_t *, mblk_t *);
-static void usb_as_send_merr_up(usb_as_state_t *, mblk_t *);
-static void usb_as_send_mctl_up(usb_as_state_t *, mblk_t *);
-static int usb_as_set_format(usb_as_state_t *, mblk_t *);
-static int usb_as_set_sample_freq(usb_as_state_t *, mblk_t *);
+static int usb_as_set_format(usb_as_state_t *, usb_audio_formats_t *);
+static int usb_as_set_sample_freq(usb_as_state_t *, int);
static int usb_as_send_ctrl_cmd(usb_as_state_t *, uchar_t, uchar_t,
ushort_t, ushort_t, ushort_t, mblk_t *, boolean_t);
-static void usb_as_isoc_close_cb(usb_pipe_handle_t ph,
- usb_opaque_t arg, int, usb_cb_flags_t);
-static int usb_as_start_record(usb_as_state_t *, mblk_t *);
-static int usb_as_stop_record(usb_as_state_t *, mblk_t *);
+static int usb_as_start_record(usb_as_state_t *, audiohdl_t);
+static int usb_as_stop_record(usb_as_state_t *);
static void usb_as_play_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_record_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_play_exc_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_record_exc_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static int usb_as_get_pktsize(usb_as_state_t *, usb_audio_formats_t *,
- usb_frame_number_t);
-static void usb_as_handle_shutdown(usb_as_state_t *, mblk_t *);
-static int usb_as_play_isoc_data(usb_as_state_t *, mblk_t *);
+ usb_frame_number_t);
+static void usb_as_handle_shutdown(usb_as_state_t *);
+static int usb_as_play_isoc_data(usb_as_state_t *,
+ usb_audio_play_req_t *);
/* anchor for soft state structures */
static void *usb_as_statep;
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info usb_as_modinfo = {
- 0xffff, /* module ID number */
- "usb_as", /* module name */
- USB_AUDIO_MIN_PKTSZ, /* minimum packet size */
- USB_AUDIO_MAX_PKTSZ, /* maximum packet size */
- USB_AS_HIWATER, /* high water mark */
- USB_AS_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit usb_as_rqueue = {
- NULL, /* put procedure */
- NULL, /* service procedure */
- usb_as_open, /* open procedure */
- usb_as_close, /* close procedure */
- NULL, /* unused */
- &usb_as_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit usb_as_wqueue = {
- putq, /* put procedure */
- usb_as_wsrv, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &usb_as_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab usb_as_str_info = {
- &usb_as_rqueue, /* read queue */
- &usb_as_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
/*
* DDI Structures
@@ -213,21 +145,21 @@ static struct streamtab usb_as_str_info = {
/* Entry points structure */
static struct cb_ops usb_as_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
+ usb_as_open, /* cb_open */
+ usb_as_close, /* cb_close */
nodev, /* cb_strategy */
nodev, /* cb_print */
nodev, /* cb_dump */
nodev, /* cb_read */
nodev, /* cb_write */
- nodev, /* cb_ioctl */
+ usb_as_ioctl, /* cb_ioctl */
nodev, /* cb_devmap */
nodev, /* cb_mmap */
nodev, /* cb_segmap */
nochpoll, /* cb_chpoll */
ddi_prop_op, /* cb_prop_op */
- &usb_as_str_info, /* cb_str */
- D_MP | D_MTPERQ, /* cb_flag */
+ NULL, /* cb_str */
+ D_MP | D_64BIT, /* cb_flag */
CB_REV, /* cb_rev */
nodev, /* cb_aread */
nodev, /* cb_arwite */
@@ -263,14 +195,6 @@ static struct modlinkage usb_as_modlinkage = {
NULL /* NULL terminates the list */
};
-/* warlock directives */
-_NOTE(SCHEME_PROTECTS_DATA("unshared", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", datab))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", queue))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_pipe_policy_t))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_isoc_pkt_descr))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_isoc_req))
static usb_event_t usb_as_events = {
usb_as_disconnect_event_cb,
@@ -289,10 +213,6 @@ static uint_t usb_as_default_srs[] = {
32000, 33075, 37800, 44100, 48000, 0
};
-static uint_t usb_as_mixer_srs[] = {
- 8000, 48000, 0
-};
-
int
_init(void)
@@ -413,6 +333,9 @@ usb_as_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uasp->usb_as_instance = instance;
uasp->usb_as_dip = dip;
+ (void) snprintf(uasp->dstr, sizeof (uasp->dstr), "%s#%d",
+ ddi_driver_name(dip), instance);
+
if (usb_client_attach(dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uasp->usb_as_log_handle,
"usb_client_attach failed");
@@ -605,42 +528,40 @@ usb_as_cleanup(dev_info_t *dip, usb_as_state_t *uasp)
*/
/*ARGSUSED*/
static int
-usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
+usb_as_open(dev_t *devp, int flag, int otyp, cred_t *credp)
{
- usb_as_state_t *uasp =
- ddi_get_soft_state(usb_as_statep,
- USB_AS_MINOR_TO_INSTANCE(getminor(*devp)));
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(*devp));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
+ char *nm = "usb_as_open";
+
if (uasp == NULL) {
return (ENXIO);
}
/* Do mux plumbing stuff */
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: Begin q=0x%p", (void *)q);
+ dinfo("%s: %s\n", uasp->dstr, nm);
+
+ mutex_enter(&uasp->usb_as_mutex);
- if (sflag) {
- USB_DPRINTF_L2(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: clone open not supported");
+ if (uasp->usb_as_flag == USB_AS_OPEN || credp != kcred) {
+ dwarn("%s: multiple opens or opens from userspace not "
+ "supported\n", uasp->dstr);
+ mutex_exit(&uasp->usb_as_mutex);
return (ENXIO);
}
- mutex_enter(&uasp->usb_as_mutex);
-
/* fail open on a disconnected device */
if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
+ dinfo("%s: %s disconnected\n", uasp->dstr, nm);
mutex_exit(&uasp->usb_as_mutex);
return (ENODEV);
}
- /* Initialize the queue pointers */
- q->q_ptr = uasp;
- WR(q)->q_ptr = uasp;
- uasp->usb_as_rq = q;
- uasp->usb_as_wq = WR(q);
- uasp->usb_as_streams_flag = USB_AS_STREAMS_OPEN;
+ /* Initialize state */
+ uasp->usb_as_flag = USB_AS_OPEN;
mutex_exit(&uasp->usb_as_mutex);
/*
@@ -649,10 +570,7 @@ usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
usb_as_pm_busy_component(uasp);
(void) pm_raise_power(uasp->usb_as_dip, 0, USB_DEV_OS_FULL_PWR);
- qprocson(q);
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: End q=0x%p", (void *)q);
+ dinfo("%s: %s done\n", uasp->dstr, nm);
return (0);
}
@@ -664,15 +582,16 @@ usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
*/
/*ARGSUSED*/
static int
-usb_as_close(queue_t *q, int flag, cred_t *credp)
+usb_as_close(dev_t dev, int flag, int otyp, cred_t *credp)
{
- usb_as_state_t *uasp = (usb_as_state_t *)q->q_ptr;
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(dev));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
USB_DPRINTF_L4(PRINT_MASK_CLOSE, uasp->usb_as_log_handle,
- "usb_as_close: q=0x%p", (void *)q);
+ "usb_as_close: inst=%d", inst);
mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_streams_flag = USB_AS_STREAMS_DISMANTLING;
+ uasp->usb_as_flag = USB_AS_DISMANTLING;
mutex_exit(&uasp->usb_as_mutex);
/*
@@ -685,256 +604,88 @@ usb_as_close(queue_t *q, int flag, cred_t *credp)
usb_release_access(uasp->usb_as_ser_acc);
- qprocsoff(q);
-
/* we can now power down */
usb_as_pm_idle_component(uasp);
- return (0);
-}
-
-
-static void
-usb_as_qreply_error(usb_as_state_t *uasp, queue_t *q, mblk_t *mp)
-{
mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_def_mblk = NULL;
+ uasp->usb_as_flag = 0;
mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(RD(q))) {
- freemsg(mp);
- } else {
- /*
- * Pass an error message up.
- */
- mp->b_datap->db_type = M_ERROR;
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
- mp->b_rptr = mp->b_datap->db_base;
- mp->b_wptr = mp->b_rptr + sizeof (char);
- *mp->b_rptr = EINVAL;
- qreply(q, mp);
- }
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_qreply_error: sending M_ERROR up q=0x%p,mp=0x%p",
- (void *)q, (void *)mp);
-}
-
-
-/*
- * usb_as_wsrv
- * write service routine, processes all the queued mblks.
- * returns DDI_SUCCESS or DDI_FAILURE
- */
-static int
-usb_as_wsrv(queue_t *q)
-{
- int error;
- usb_as_state_t *uasp = q->q_ptr;
- mblk_t *mp = NULL;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_wsrv: Begin q=0x%p", (void *)q);
-
- /* process all message blocks on the queue */
- while ((mp = getq(q)) != NULL) {
- ASSERT(mp->b_datap != NULL);
-
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- /*
- * Canonical flush handling :
- * mp will be freed by usb_ac since it passes
- * the same mp
- */
- if (*mp->b_rptr & FLUSHW) {
- flushq(q, FLUSHDATA);
- }
- /* read queue not used so just send up */
- if (*mp->b_rptr & FLUSHR) {
- *mp->b_rptr &= ~FLUSHW;
- qreply(q, mp);
- } else {
- freemsg(mp);
- }
-
- break;
- case M_IOCTL:
- /* only ioctl is mixer registration data */
- error = usb_as_ioctl(q, mp);
-
- break;
- case M_CTL:
- /* process the message */
- mutex_enter(&uasp->usb_as_mutex);
- ASSERT(uasp->usb_as_def_mblk == NULL);
- uasp->usb_as_def_mblk = mp;
- mutex_exit(&uasp->usb_as_mutex);
-
- error = usb_as_mctl_rcv(q, mp);
- if (error != USB_SUCCESS) {
- usb_as_qreply_error(uasp, q, mp);
- }
-
- break;
- default:
- usb_as_qreply_error(uasp, q, mp);
-
- break;
- }
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_wsrv: End q=0x%p", (void *)q);
-
- return (DDI_SUCCESS);
+ return (0);
}
/*
- * usb_as_ioctl:
- * usb_as handles only USB_AUDIO_MIXER_REGISTRATION ioctl
- * NACK all other ioctl requests
- * Returns USB_SUCCESS or USB_FAILURE
+ *
*/
+/*ARGSUSED*/
static int
-usb_as_ioctl(queue_t *q, mblk_t *mp)
+usb_as_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
{
- int error = USB_FAILURE;
- usb_as_state_t *uasp = q->q_ptr;
- register struct iocblk *iocp;
-
- iocp = (struct iocblk *)mp->b_rptr;
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(dev));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
+ int rv = USB_SUCCESS;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: Begin q=0x%p, mp=0x%p", (void *)q, (void *)mp);
+ "usb_as_ioctl: Begin inst=%d, cmd=0x%x, arg=0x%p",
+ inst, cmd, (void *)arg);
- if (mp->b_cont == NULL) {
+ if (!(mode & FKIOCTL)) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: no data block, q=0x%p, mp=0x%p",
- (void *)q, (void *)mp);
- } else {
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_MIXER_REGISTRATION:
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uasp->usb_as_log_handle,
- "usb_as_ioctl(mixer reg): q=0x%p, "
- "mp=0x%p, b_cont_rptr=0x%p, b_cont_wptr=0x%p",
- (void *)q, (void *)mp, (void *)mp->b_cont->b_rptr,
- (void *)mp->b_cont->b_wptr);
-
- mutex_enter(&uasp->usb_as_mutex);
-
- /*
- * Copy the usb_as_reg structure to the structure
- * that usb_ac passed. Note that this is a structure
- * assignment and not a pointer assignment!
- */
- *((usb_as_registration_t *)(*((
- usb_as_registration_t **)mp->
- b_cont->b_rptr))) = uasp->usb_as_reg;
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (usb_as_registration_t *);
-
- mutex_exit(&uasp->usb_as_mutex);
- error = USB_SUCCESS;
- break;
- default:
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: unknown IOCTL, cmd=%d",
- iocp->ioc_cmd);
- break;
- }
- }
-
- iocp->ioc_rval = 0;
- if (error == USB_FAILURE) {
- iocp->ioc_error = ENOTTY;
- mp->b_datap->db_type = M_IOCNAK;
- } else {
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
+ "usb_as_ioctl: inst=%d, user space not supported", inst);
+ return (ENXIO);
}
- /*
- * Send the response up
- */
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: error=%d, q=0x%p, mp=0x%p", error,
- (void *)q, (void *)mp);
-
- qreply(q, mp);
-
- return (error);
-}
-
-
-/*
- * usb_as_mctl_rcv:
- * Handle M_CTL requests from usb_ac.
- * Returns USB_SUCCESS/FAILURE
- */
-static int
-usb_as_mctl_rcv(queue_t *q, mblk_t *mp)
-{
- int error = USB_FAILURE;
- usb_as_state_t *uasp = q->q_ptr;
- struct iocblk *iocp;
+ mutex_enter(&uasp->usb_as_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_mctl_rcv: Begin q=0x%p mp=0x%p",
- (void *)q, (void *)mp);
+ switch (cmd) {
+ case USB_AUDIO_MIXER_REGISTRATION:
+ USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
+ "usb_as_ioctl(mixer reg): inst=%d", inst);
- ASSERT(mp != NULL);
+ /*
+ * Copy the usb_as_reg structure to the structure
+ * that usb_ac passed. Note that this is a structure
+ * assignment and not a pointer assignment!
+ */
+ *(usb_as_registration_t *)arg = uasp->usb_as_reg;
- /*
- * Uopn success, each function sends up a reply either immediately,
- * or on callback. On failure, reply is send up in the wsrv.
- */
- iocp = (struct iocblk *)mp->b_rptr;
- mutex_enter(&uasp->usb_as_mutex);
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- error = usb_as_set_format(uasp, mp);
- break;
- case USB_AUDIO_SET_SAMPLE_FREQ:
- error = usb_as_set_sample_freq(uasp, mp);
- break;
- case USB_AUDIO_SETUP:
- error = usb_as_setup(uasp, mp);
- break;
- case USB_AUDIO_TEARDOWN:
- usb_as_teardown(uasp, mp);
- error = USB_SUCCESS;
- break;
- case USB_AUDIO_START_PLAY:
- error = usb_as_start_play(uasp, mp);
- break;
- case USB_AUDIO_STOP_PLAY:
- case USB_AUDIO_PAUSE_PLAY:
- usb_as_pause_play(uasp, mp);
- error = USB_SUCCESS;
- break;
- case USB_AUDIO_START_RECORD:
- error = usb_as_start_record(uasp, mp);
- break;
- case USB_AUDIO_STOP_RECORD:
- error = usb_as_stop_record(uasp, mp);
- break;
- default:
- break;
+ break;
+ case USB_AUDIO_SET_FORMAT:
+ rv = usb_as_set_format(uasp, (usb_audio_formats_t *)arg);
+ break;
+ case USB_AUDIO_SET_SAMPLE_FREQ:
+ rv = usb_as_set_sample_freq(uasp, *(int *)arg);
+ break;
+ case USB_AUDIO_SETUP:
+ rv = usb_as_setup(uasp);
+ break;
+ case USB_AUDIO_TEARDOWN:
+ usb_as_teardown(uasp);
+ break;
+ case USB_AUDIO_START_PLAY:
+ rv = usb_as_start_play(uasp, (usb_audio_play_req_t *)arg);
+ break;
+ case USB_AUDIO_STOP_PLAY:
+ case USB_AUDIO_PAUSE_PLAY:
+ usb_as_pause_play(uasp);
+ break;
+ case USB_AUDIO_START_RECORD:
+ rv = usb_as_start_record(uasp, *(audiohdl_t *)arg);
+ break;
+ case USB_AUDIO_STOP_RECORD:
+ rv = usb_as_stop_record(uasp);
+ break;
+ default:
+ USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
+ "usb_as_ioctl: unknown IOCTL, cmd=%d", cmd);
+ break;
}
mutex_exit(&uasp->usb_as_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_mctl_rcv: End q=0x%p mp=0x%p error=%d",
- (void *)q, (void *)mp, error);
-
- return (error);
+ return (rv == USB_SUCCESS ? 0 : ENXIO);
}
@@ -948,35 +699,25 @@ usb_as_mctl_rcv(queue_t *q, mblk_t *mp)
* Therefore, we ignore errors and carry on regardless
*/
static int
-usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_set_sample_freq(usb_as_state_t *uasp, int freq)
{
- int freq, alt, ep;
+ int alt, ep;
mblk_t *data;
int rval = USB_FAILURE;
boolean_t ignore_errors;
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
alt = uasp->usb_as_alternate;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_sample_freq: mp=0x%p cont_sr=%d", (void *)mp,
- uasp->usb_as_alts[alt].alt_continuous_sr);
+ "usb_as_set_sample_freq: inst=%d cont_sr=%d freq=%d",
+ ddi_get_instance(uasp->usb_as_dip),
+ uasp->usb_as_alts[alt].alt_continuous_sr, freq);
ignore_errors = B_TRUE;
ep = uasp->usb_as_alts[alt].alt_ep->bEndpointAddress;
- freq = *((int *)mp->b_cont->b_rptr);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_sample_freq: freq = %d", freq);
-
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
data = allocb(4, BPRI_HI);
if (data) {
@@ -998,11 +739,10 @@ usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
ignore_errors)) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_sample_freq: set sample freq failed");
-
- freemsg(data);
}
mutex_enter(&uasp->usb_as_mutex);
}
+ freemsg(data);
return (rval);
}
@@ -1011,25 +751,23 @@ usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
/*
* usb_as_set_format:
* Matches channel, encoding and precision and find out
- * the right alternate. Sets alternate interface.
+ * the right alternate. Sets alternate interface and returns it.
*/
static int
-usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_set_format(usb_as_state_t *uasp, usb_audio_formats_t *format)
{
int n;
usb_as_registration_t *reg;
- usb_audio_formats_t *format;
int alt, rval;
uint_t interface;
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
if (uasp->usb_as_request_count) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_format: failing mp=0x%p, rq_cnt=%d",
- (void *)mp, uasp->usb_as_request_count);
+ "usb_as_set_format: failing inst=%d, rq_cnt=%d",
+ ddi_get_instance(uasp->usb_as_dip),
+ uasp->usb_as_request_count);
return (USB_FAILURE);
}
@@ -1038,13 +776,12 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
reg = &uasp->usb_as_reg;
interface = uasp->usb_as_ifno;
- format = (usb_audio_formats_t *)mp->b_cont->b_rptr;
- bcopy(format, &uasp->usb_as_curr_format, sizeof (usb_audio_formats_t));
+ uasp->usb_as_curr_format = *format;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_format: mp=0x%p, reg=0x%p, format=0x%p",
- (void *)mp, (void *)reg, (void *)format);
+ "usb_as_set_format: inst=%d, reg=0x%p, format=0x%p",
+ ddi_get_instance(uasp->usb_as_dip), (void *)reg, (void *)format);
for (n = 0; n < reg->reg_n_formats; n++) {
if ((format->fmt_chns == reg->reg_formats[n].fmt_chns) &&
@@ -1060,7 +797,7 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
}
}
- if (n > reg->reg_n_formats) {
+ if (n >= reg->reg_n_formats) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_format: Didn't find a matching alt");
@@ -1075,19 +812,23 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
mutex_exit(&uasp->usb_as_mutex);
- if ((rval = usb_as_send_ctrl_cmd(uasp,
+ rval = usb_as_send_ctrl_cmd(uasp,
/* bmRequestType */
USB_DEV_REQ_HOST_TO_DEV | USB_DEV_REQ_RCPT_IF,
USB_REQ_SET_IF, /* bRequest */
alt, /* wValue */
interface, /* wIndex */
0, /* wLength */
- NULL, B_FALSE)) != USB_SUCCESS) {
+ NULL, B_FALSE);
+
+ mutex_enter(&uasp->usb_as_mutex);
+
+ if (rval != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_format: set_alternate failed");
-
+ } else {
+ format->fmt_alt = (uchar_t)alt;
}
- mutex_enter(&uasp->usb_as_mutex);
return (rval);
}
@@ -1099,17 +840,17 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
* is available.
*/
static int
-usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_setup(usb_as_state_t *uasp)
{
int alt = uasp->usb_as_alternate;
usb_ep_descr_t *ep = (usb_ep_descr_t *)uasp->usb_as_alts[alt].alt_ep;
int rval;
- ASSERT(mp != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_setup: Begin usb_as_setup, mp=0x%p", (void *)mp);
+ "usb_as_setup: Begin usb_as_setup, inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
ASSERT(uasp->usb_as_request_count == 0);
@@ -1124,7 +865,7 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
/* open isoc pipe, may fail if there is no bandwidth */
rval = usb_pipe_open(uasp->usb_as_dip, ep, &uasp->usb_as_isoc_pp,
- 0, &uasp->usb_as_isoc_ph);
+ USB_FLAGS_SLEEP, &uasp->usb_as_isoc_ph);
if (rval != USB_SUCCESS) {
switch (rval) {
@@ -1151,11 +892,9 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
(void) usb_pipe_set_private(uasp->usb_as_isoc_ph, (usb_opaque_t)uasp);
- /* return reply up */
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_audio_state = USB_AS_IDLE;
uasp->usb_as_setup_cnt++;
- usb_as_send_mctl_up(uasp, NULL);
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_setup: End");
@@ -1169,10 +908,12 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
*
*/
static void
-usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_teardown(usb_as_state_t *uasp)
{
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_teardown: Begin mp=0x%p", (void *)mp);
+ "usb_as_teardown: Begin inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
+
ASSERT(mutex_owned(&uasp->usb_as_mutex));
uasp->usb_as_audio_state = USB_AS_IDLE;
@@ -1185,10 +926,9 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
mutex_exit(&uasp->usb_as_mutex);
/* reply mp will be sent up in isoc close callback */
- usb_pipe_close(uasp->usb_as_dip, uasp->usb_as_isoc_ph, 0,
- usb_as_isoc_close_cb, (usb_opaque_t)uasp);
+ usb_pipe_close(uasp->usb_as_dip, uasp->usb_as_isoc_ph,
+ USB_FLAGS_SLEEP, NULL, (usb_opaque_t)NULL);
- /* wait for callback to send up a reply */
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_isoc_ph = NULL;
@@ -1198,8 +938,6 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_teardown: Pipe already closed");
-
- usb_as_send_mctl_up(uasp, NULL);
}
ASSERT(uasp->usb_as_setup_cnt == 0);
@@ -1210,32 +948,24 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
/*
- * usb_as_start_play:
- * this function is called from usb_as_mctl_rcv
+ * usb_as_start_play
*/
static int
-usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_start_play(usb_as_state_t *uasp, usb_audio_play_req_t *play_req)
{
- usb_audio_play_req_t *play_req;
- int samples;
int n_requests;
int rval = USB_FAILURE;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_start_play: Begin mp=0x%p, req_cnt=%d",
- (void *)mp, uasp->usb_as_request_count);
+ "usb_as_start_play: Begin inst=%d, req_cnt=%d",
+ ddi_get_instance(uasp->usb_as_dip), uasp->usb_as_request_count);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
- ASSERT(mp && mp->b_cont);
-
- play_req = (usb_audio_play_req_t *)mp->b_cont->b_rptr;
uasp->usb_as_request_samples = play_req->up_samples;
uasp->usb_as_ahdl = play_req->up_handle;
uasp->usb_as_audio_state = USB_AS_ACTIVE;
- samples = uasp->usb_as_request_samples;
-
if ((uasp->usb_as_request_count >= USB_AS_MAX_REQUEST_COUNT) ||
(uasp->usb_as_audio_state == USB_AS_IDLE) ||
(uasp->usb_as_audio_state == USB_AS_PLAY_PAUSED)) {
@@ -1246,27 +976,18 @@ usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_start_play: samples=%d requestcount=%d ",
- samples, uasp->usb_as_request_count);
+ uasp->usb_as_request_samples, uasp->usb_as_request_count);
/* queue up as many requests as allowed */
for (n_requests = uasp->usb_as_request_count;
n_requests < USB_AS_MAX_REQUEST_COUNT; n_requests++) {
- if ((rval = usb_as_play_isoc_data(uasp, mp)) !=
+ if ((rval = usb_as_play_isoc_data(uasp, play_req)) !=
USB_SUCCESS) {
break;
}
}
}
- /*
- * send mctl up for success. For failure, usb_as_wsrv
- * will send an merr up.
- */
- if (rval == USB_SUCCESS) {
- usb_as_send_mctl_up(uasp, NULL);
- }
-
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_start_play: End");
@@ -1281,7 +1002,6 @@ usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
static void
usb_as_continue_play(usb_as_state_t *uasp)
{
- int samples;
int n_requests;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
@@ -1291,13 +1011,11 @@ usb_as_continue_play(usb_as_state_t *uasp)
ASSERT(mutex_owned(&uasp->usb_as_mutex));
if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
return;
}
- samples = uasp->usb_as_request_samples;
-
if ((uasp->usb_as_request_count >= USB_AS_MAX_REQUEST_COUNT) ||
(uasp->usb_as_audio_state == USB_AS_IDLE) ||
(uasp->usb_as_audio_state == USB_AS_PLAY_PAUSED)) {
@@ -1307,7 +1025,7 @@ usb_as_continue_play(usb_as_state_t *uasp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_continue_play: samples=%d requestcount=%d ",
- samples, uasp->usb_as_request_count);
+ uasp->usb_as_request_samples, uasp->usb_as_request_count);
/* queue up as many requests as allowed */
for (n_requests = uasp->usb_as_request_count;
@@ -1326,16 +1044,13 @@ usb_as_continue_play(usb_as_state_t *uasp)
static void
-usb_as_handle_shutdown(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_handle_shutdown(usb_as_state_t *uasp)
{
audiohdl_t ahdl;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_handl_shutdown, mp=0x%p", (void *)mp);
-
- if (mp != NULL) {
- usb_as_send_mctl_up(uasp, NULL);
- }
+ "usb_as_handle_shutdown, inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_handle_shutdown: am_play_shutdown");
@@ -1345,13 +1060,13 @@ usb_as_handle_shutdown(usb_as_state_t *uasp, mblk_t *mp)
ahdl = uasp->usb_as_ahdl;
mutex_exit(&uasp->usb_as_mutex);
- am_play_shutdown(ahdl, AUDIO_NO_CHANNEL);
+ am_play_shutdown(ahdl);
mutex_enter(&uasp->usb_as_mutex);
}
static int
-usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_play_isoc_data(usb_as_state_t *uasp, usb_audio_play_req_t *play_req)
{
int rval = USB_FAILURE;
@@ -1389,8 +1104,8 @@ usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
}
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_play_isoc_data: Begin bufsize=0x%lx, mp=0x%p", bufsize,
- (void *)mp);
+ "usb_as_play_isoc_data: Begin bufsize=0x%lx, inst=%d", bufsize,
+ ddi_get_instance(uasp->usb_as_dip));
mutex_exit(&uasp->usb_as_mutex);
@@ -1402,14 +1117,22 @@ usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
goto done;
}
- if ((count = am_get_audio(ahdl, (void *)data->b_wptr,
- AUDIO_NO_CHANNEL, bufsize / precision)) == 0) {
+ /*
+ * restriction of Boomer: cannot call am_get_audio() in the context
+ * of start so we play a fragment of silence at first
+ */
+ if (play_req != NULL) {
+ bzero(data->b_wptr, bufsize);
+ count = bufsize / precision;
+
+ } else if ((count = am_get_audio(ahdl, (void *)data->b_wptr,
+ bufsize / precision)) == 0) {
mutex_enter(&uasp->usb_as_mutex);
if (uasp->usb_as_request_count == 0) {
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
/* Don't return failure for 0 bytes of data sent */
- if (mp) {
+ if (play_req) {
/*
* Since we set rval to SUCCESS
* we treat it as a special case
@@ -1536,13 +1259,13 @@ done:
}
-/*ARGSUSED*/
static void
-usb_as_pause_play(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_pause_play(usb_as_state_t *uasp)
{
ASSERT(mutex_owned(&uasp->usb_as_mutex));
+
+ /* this will stop the isoc request in the play callback */
uasp->usb_as_audio_state = USB_AS_PLAY_PAUSED;
- usb_as_send_mctl_up(uasp, NULL);
}
@@ -1628,7 +1351,7 @@ usb_as_play_exc_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_rcv_debug_count++;
uasp->usb_as_request_count--;
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_play_exc_cb: SEND CNT=%d, RCV COUNT=%d",
@@ -1646,7 +1369,7 @@ usb_as_play_exc_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
* usb_as_start_record
*/
static int
-usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_start_record(usb_as_state_t *uasp, audiohdl_t ahdl)
{
int rval = USB_FAILURE;
usb_isoc_req_t *isoc_req;
@@ -1654,10 +1377,9 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
ushort_t n_pkt = 1, pkt;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_start_record: mp=0x%p", (void *)mp);
+ "usb_as_start_record: inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
/*
@@ -1668,7 +1390,7 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
if (uasp->usb_as_audio_state == USB_AS_IDLE) {
- uasp->usb_as_ahdl = *((audiohdl_t *)mp->b_cont->b_rptr);
+ uasp->usb_as_ahdl = ahdl;
uasp->usb_as_audio_state = USB_AS_ACTIVE;
mutex_exit(&uasp->usb_as_mutex);
@@ -1712,8 +1434,6 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
usb_free_isoc_req(isoc_req);
isoc_req = NULL;
}
- } else {
- usb_as_send_mctl_up(uasp, NULL);
}
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
@@ -1723,20 +1443,16 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
}
-/*ARGSUSED*/
static int
-usb_as_stop_record(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_stop_record(usb_as_state_t *uasp)
{
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_stop_record: ");
ASSERT(mutex_owned(&uasp->usb_as_mutex));
/* if we are disconnected, the pipe will be closed anyways */
- if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
- usb_as_send_mctl_up(uasp, NULL);
-
+ if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED)
return (USB_SUCCESS);
- }
switch (uasp->usb_as_audio_state) {
case USB_AS_ACTIVE:
@@ -1750,17 +1466,14 @@ usb_as_stop_record(usb_as_state_t *uasp, mblk_t *mp)
USB_FLAGS_SLEEP);
mutex_enter(&uasp->usb_as_mutex);
- usb_as_send_mctl_up(uasp, NULL);
-
break;
case USB_AS_STOP_POLLING_STARTED:
/* A stop polling in progress, wait for completion and reply */
break;
default:
- usb_as_send_mctl_up(uasp, NULL);
+ break;
}
-
return (USB_SUCCESS);
}
@@ -1895,8 +1608,7 @@ usb_as_record_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
am_send_audio(ahdl,
isoc_req->isoc_data->b_rptr + offset,
- AUDIO_NO_CHANNEL, isoc_req->
- isoc_pkt_descr[i].isoc_pkt_actual_length /
+ isoc_req->isoc_pkt_descr[i].isoc_pkt_actual_length /
precision);
mutex_enter(&uasp->usb_as_mutex);
@@ -2000,250 +1712,36 @@ usb_as_send_ctrl_cmd(usb_as_state_t *uasp,
ushort_t wValue, ushort_t wIndex, ushort_t wLength,
mblk_t *data, boolean_t ignore_errors)
{
- usb_ctrl_req_t *reqp;
-
+ usb_ctrl_setup_t setup;
+ usb_cr_t cr;
+ usb_cb_flags_t cf;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_send_ctrl_cmd: Begin bmRequestType=%d,\n\t"
"bRequest=%d, wValue=%d, wIndex=%d, wLength=%d, data=0x%p",
bmRequestType, bRequest, wValue, wIndex, wLength, (void *)data);
- if ((reqp = usb_alloc_ctrl_req(uasp->usb_as_dip, 0, 0)) == NULL) {
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mutex_exit(&uasp->usb_as_mutex);
-
- return (USB_FAILURE);
- }
-
- reqp->ctrl_bmRequestType = bmRequestType;
- reqp->ctrl_bRequest = bRequest;
- reqp->ctrl_wValue = wValue;
- reqp->ctrl_wIndex = wIndex;
- reqp->ctrl_wLength = wLength;
- reqp->ctrl_data = data;
- reqp->ctrl_attributes = 0;
- reqp->ctrl_client_private = (usb_opaque_t)uasp;
- reqp->ctrl_cb = usb_as_default_xfer_cb;
- reqp->ctrl_exc_cb = ignore_errors ?
- usb_as_default_xfer_cb : usb_as_default_xfer_exc_cb;
-
- /* Send async command down */
- if (usb_pipe_ctrl_xfer(uasp->usb_as_default_ph, reqp, 0) !=
- USB_SUCCESS) {
+ setup.bmRequestType = bmRequestType & ~USB_DEV_REQ_DEV_TO_HOST;
+ setup.bRequest = bRequest;
+ setup.wValue = wValue;
+ setup.wIndex = wIndex;
+ setup.wLength = wLength;
+ setup.attrs = 0;
+ if (usb_pipe_ctrl_xfer_wait(uasp->usb_as_default_ph, &setup, &data,
+ &cr, &cf, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_ctrl_cmd: usba xfer failed (req=%d)",
- bRequest);
+ "usb_as_send_ctrl_cmd: usba xfer failed (req=%d), "
+ "completion reason: 0x%x, completion flags: 0x%x",
+ bRequest, cr, cf);
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mutex_exit(&uasp->usb_as_mutex);
- usb_free_ctrl_req(reqp);
-
- return (USB_FAILURE);
+ return (ignore_errors ? USB_SUCCESS: USB_FAILURE);
}
return (USB_SUCCESS);
}
-static void
-usb_as_send_merr_up(usb_as_state_t *uasp, mblk_t *mp)
-{
- queue_t *q;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_merr_up: data=0x%p", (void *)mp);
-
- ASSERT(mutex_owned(&uasp->usb_as_mutex));
- q = uasp->usb_as_rq;
-
- mp->b_datap->db_type = M_ERROR;
-
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
-
- mp->b_rptr = mp->b_datap->db_base;
- mp->b_wptr = mp->b_rptr + sizeof (char);
- *mp->b_rptr = EINVAL;
-
- mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(RD(q))) {
- freemsg(mp);
- mp = NULL;
- } else {
- putnext(RD(q), mp);
- }
- mutex_enter(&uasp->usb_as_mutex);
-}
-
-
-static void
-usb_as_send_mctl_up(usb_as_state_t *uasp, mblk_t *data)
-{
- mblk_t *tmp, *mp;
- queue_t *q;
- struct iocblk *iocp;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_mctl_up: data=0x%p", (void *)data);
- ASSERT(mutex_owned(&uasp->usb_as_mutex));
-
- q = uasp->usb_as_rq;
- mp = uasp->usb_as_def_mblk;
- ASSERT(mp != NULL);
-
- /* Free the b_cont of the original mblk_t, if any */
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
-
- /*
- * If we have response to send up, attach it at the b_cont
- * of the mctl message. Otherwise just send the mctl message
- * up and the module above will decode the command
- */
- iocp = (struct iocblk *)mp->b_rptr;
- iocp->ioc_error = 0;
-
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- freemsg(data);
-
- /*
- * we cannot easily recover if we can't get an mblk
- * so we have to sleep here
- */
- tmp = allocb_wait(sizeof (int), BPRI_HI,
- STR_NOSIG, NULL);
- iocp->ioc_count = sizeof (int);
- *(int *)tmp->b_wptr = uasp->usb_as_alternate;
- tmp->b_wptr += sizeof (int);
- mp->b_cont = tmp;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_mctl_up: set_format returning,alt=%d",
- uasp->usb_as_alternate);
-
- break;
- default:
- if (data != NULL) {
- /*
- * Use the original mp to send the message up
- * This should already have the right ioc_cmd in.
- */
- iocp->ioc_count = MBLKL(data);
- mp->b_cont = data;
- } else {
- iocp->ioc_count = 0;
- }
- break;
- }
- uasp->usb_as_def_mblk = NULL;
- mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(q)) {
- freemsg(mp);
- mp = NULL;
- } else {
- putnext(q, mp);
- }
- mutex_enter(&uasp->usb_as_mutex);
-}
-
-
-/*
- * usb_as_default_xfer_cb:
- * Callback routine for the async control xfer. Reply mctl here.
- */
-/*ARGSUSED*/
-static void
-usb_as_default_xfer_cb(usb_pipe_handle_t def, usb_ctrl_req_t *reqp)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)reqp->ctrl_client_private;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_cb: ph=0x%p, reqp=0x%p",
- (void *)def, (void *)reqp);
-
- ASSERT((reqp->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MCTL;
- usb_as_send_mctl_up(uasp, NULL);
- mutex_exit(&uasp->usb_as_mutex);
-
- usb_free_ctrl_req(reqp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_cb: End");
-}
-
-
-/*
- * usb_as_isoc_close_cb()
- * called from teardown usb_pipe_close
- */
-static void
-usb_as_isoc_close_cb(usb_pipe_handle_t ph, usb_opaque_t arg,
- int rval, usb_cb_flags_t cb_flags)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)arg;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_isoc_close_cb: ph=0x%p arg=0x%p cb_flags=0x%x",
- (void *)ph, (void *)arg, cb_flags);
-
- /* pipe close cannot fail */
- ASSERT(rval == USB_SUCCESS);
-
- mutex_enter(&uasp->usb_as_mutex);
- usb_as_send_mctl_up(uasp, NULL);
- mutex_exit(&uasp->usb_as_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_isoc_close_cb: End");
-}
-
-
-/*
- * usb_as_default_exc_cb:
- * Exception callback for the default pipe. Autoclearing took care
- * of the recovery
- */
-/*ARGSUSED*/
-static void
-usb_as_default_xfer_exc_cb(usb_pipe_handle_t def, usb_ctrl_req_t *reqp)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)reqp->ctrl_client_private;
- mblk_t *mp;
-
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_exc_cb: ph=0x%p, reqp=0x%p",
- (void *)def, (void *)reqp);
-
- ASSERT((reqp->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mp = uasp->usb_as_def_mblk;
- uasp->usb_as_def_mblk = NULL;
-
- usb_as_send_merr_up(uasp, mp);
-
- mutex_exit(&uasp->usb_as_mutex);
-
- usb_free_ctrl_req(reqp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_exc_cb: End");
-}
-
-
/*
* Power management
*/
@@ -2801,30 +2299,9 @@ usb_as_prepare_registration_data(usb_as_state_t *uasp)
}
}
- /*
- * we prefer that a valid format supports all our
- * default sample rates. If not we delete sample rates
- * to get a set that is supported by all formats.
- *
- * Continuous sample rate will be checked in set_format
- * command for a particular alternate. This is interface
- * specific registration data and not per alternate.
- */
- reg->reg_mixer_srs.ad_srs = reg->reg_mixer_srs_list;
- reg->reg_mixer_srs.ad_limits = MIXER_SRS_FLAG_SR_LIMITS;
-
- /* copy over sample rate table but zero it first */
- bzero(reg->reg_mixer_srs_list, sizeof (reg->reg_mixer_srs_list));
- bcopy(usb_as_mixer_srs, reg->reg_mixer_srs_list,
- sizeof (usb_as_mixer_srs));
-
- reg->reg_compat_srs.ad_srs = reg->reg_compat_srs_list;
- reg->reg_compat_srs.ad_limits = MIXER_SRS_FLAG_SR_NOT_LIMITS;
-
/* copy over sample rate table but zero it first */
- bzero(reg->reg_compat_srs_list, sizeof (reg->reg_compat_srs_list));
- bcopy(usb_as_default_srs, reg->reg_compat_srs_list,
- sizeof (usb_as_default_srs));
+ bzero(reg->reg_srs, sizeof (reg->reg_srs));
+ bcopy(usb_as_default_srs, reg->reg_srs, sizeof (usb_as_default_srs));
channels[1] = channels[2] = 0;
@@ -2841,8 +2318,8 @@ usb_as_prepare_registration_data(usb_as_state_t *uasp)
if (uasp->usb_as_alts[alt].alt_valid &&
(n < USB_AS_N_FORMATS) &&
(usb_as_valid_format(uasp, alt,
- reg->reg_compat_srs_list,
- (sizeof (reg->reg_compat_srs_list)/
+ reg->reg_srs,
+ (sizeof (reg->reg_srs)/
sizeof (uint_t)) - 1)) == USB_SUCCESS) {
reg->reg_formats[n].fmt_termlink =
uasp->usb_as_alts[alt].alt_general->
diff --git a/usr/src/uts/common/io/usb/inc.flg b/usr/src/uts/common/io/usb/inc.flg
deleted file mode 100644
index f130c48245..0000000000
--- a/usr/src/uts/common/io/usb/inc.flg
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-
-#
-# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-
-
-# This file brings down all that is needed to build just
-# USB drivers.
-#
-
-find_files "s.*.x" \
- usr/src/uts/common/rpc \
- usr/src/uts/common/rpcsvc \
- usr/src/uts/common/gssapi
-
-find_files "s.*.h" \
- usr/src/uts/common/vm \
- usr/src/uts/common/sys \
- usr/src/uts/common/rpc \
- usr/src/uts/common/gssapi \
- usr/src/uts/common/netinet \
- usr/src/uts/common/net \
- usr/src/uts/intel/sys \
- usr/src/uts/sparc/sys \
- usr/src/uts/sparc/v7/sys \
- usr/src/uts/sparc/v9/sys \
- usr/src/uts/sun/sys
-
-echo_file usr/src/uts/common/io/cmlb.c
-
-find_files "s.*" \
- usr/src/uts/common/io/warlock \
- usr/src/uts/common/io/scsi \
- usr/src/uts/common/io/audio \
- usr/src/uts/sparc/hid \
- usr/src/uts/sparc/hidparser \
- usr/src/uts/sparc/usba \
- usr/src/uts/sparc/usba10 \
- usr/src/uts/sparc/uhci \
- usr/src/uts/sparc/ohci \
- usr/src/uts/sparc/ehci \
- usr/src/uts/sparc/hubd \
- usr/src/uts/sparc/usb_mid \
- usr/src/uts/sparc/usb_ia \
- usr/src/uts/sparc/usbkbm \
- usr/src/uts/sparc/usbms \
- usr/src/uts/sparc/scsa2usb \
- usr/src/uts/sparc/scsi \
- usr/src/uts/sparc/sd \
- usr/src/uts/sparc/st \
- usr/src/uts/sparc/cmlb \
- usr/src/uts/sparc/usbprn \
- usr/src/uts/sparc/usb_ac \
- usr/src/uts/sparc/usb_ac_dacf \
- usr/src/uts/sparc/usb_as \
- usr/src/uts/sparc/usb_ah \
- usr/src/uts/sparc/audiosup \
- usr/src/uts/sparc/mixer \
- usr/src/uts/sparc/amsrc2 \
- usr/src/uts/sparc/ugen \
- usr/src/uts/sparc/usbftdi \
- usr/src/uts/sparc/usbser \
- usr/src/uts/sparc/usbsksp \
- usr/src/uts/sparc/usbsprl \
- usr/src/uts/sparc/usbsacm \
- usr/src/uts/sparc/usbvc \
- usr/src/uts/sparc/wusb_ca \
- usr/src/uts/sparc/hwa1480_fw \
- usr/src/uts/sparc/hwahc \
- usr/src/uts/sparc/hwarc \
- usr/src/uts/sparc/wusb_df \
- usr/src/uts/sparc/uwba \
- usr/src/uts/sparc/usbskel \
- usr/src/uts/sparc/warlock \
- usr/src/uts/sparc/asm \
- usr/src/uts/intel/hid \
- usr/src/uts/intel/hidparser \
- usr/src/uts/intel/usba \
- usr/src/uts/intel/usba10 \
- usr/src/uts/intel/uhci \
- usr/src/uts/intel/ohci \
- usr/src/uts/intel/ehci \
- usr/src/uts/intel/hubd \
- usr/src/uts/intel/usb_mid \
- usr/src/uts/intel/usb_ia \
- usr/src/uts/intel/usbkbm \
- usr/src/uts/intel/usbms \
- usr/src/uts/intel/scsa2usb \
- usr/src/uts/intel/scsi \
- usr/src/uts/intel/sd \
- usr/src/uts/intel/st \
- usr/src/uts/intel/cmlb \
- usr/src/uts/intel/usbprn \
- usr/src/uts/intel/usb_ac \
- usr/src/uts/intel/usb_ac_dacf \
- usr/src/uts/intel/usb_as \
- usr/src/uts/intel/usb_ah \
- usr/src/uts/intel/audiosup \
- usr/src/uts/intel/mixer \
- usr/src/uts/intel/amsrc2 \
- usr/src/uts/intel/ugen \
- usr/src/uts/intel/usbftdi \
- usr/src/uts/intel/usbser \
- usr/src/uts/intel/usbsksp \
- usr/src/uts/intel/usbsprl \
- usr/src/uts/intel/usbsacm \
- usr/src/uts/intel/usbvc \
- usr/src/uts/intel/wusb_ca \
- usr/src/uts/intel/hwa1480_fw \
- usr/src/uts/intel/hwahc \
- usr/src/uts/intel/hwarc \
- usr/src/uts/intel/wusb_df \
- usr/src/uts/intel/uwba \
- usr/src/uts/intel/usbskel \
- usr/src/uts/intel/warlock \
- usr/src/uts/intel/ia32 \
- usr/src/uts/intel/amd64 \
- usr/src/uts/intel/asm
-
-
-echo_file usr/src/uts/sparc/os/driver_classes
-echo_file usr/src/uts/sparc/os/driver_aliases
-echo_file usr/src/uts/sparc/os/name_to_major
-echo_file usr/src/uts/intel/os/driver_classes
-echo_file usr/src/uts/intel/os/driver_aliases
-echo_file usr/src/uts/intel/os/name_to_major
-
-echo_file usr/src/Makefile.master
-echo_file usr/src/Makefile.master.64
-echo_file usr/src/req.flg
-echo_file usr/src/Makefile.psm
-echo_file usr/src/Makefile.psm.targ
-echo_file usr/src/uts/Makefile
-echo_file usr/src/uts/Makefile.targ
-echo_file usr/src/uts/Makefile.uts
-echo_file usr/src/uts/sun/Makefile.files
-echo_file usr/src/uts/sun/Makefile.rules
-echo_file usr/src/uts/common/Makefile.files
-echo_file usr/src/uts/common/Makefile.rules
-echo_file usr/src/uts/common/sys/Makefile.syshdrs
-echo_file usr/src/uts/sparc/Makefile
-echo_file usr/src/uts/sparc/Makefile.files
-echo_file usr/src/uts/sparc/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile.sparc
-echo_file usr/src/uts/sparc/Makefile.sparc.shared
-echo_file usr/src/uts/sparc/Makefile.targ
-echo_file usr/src/uts/sparc/Makefile.targ.shared
-echo_file usr/src/uts/sparc/req.flg
-echo_file usr/src/uts/sparc/ml/sparc.il
-echo_file usr/src/uts/sparc/v9/Makefile.files
-echo_file usr/src/uts/sparc/v9/Makefile.rules
-echo_file usr/src/uts/sun4u/Makefile.rules
-echo_file usr/src/uts/sun4/Makefile.rules
-echo_file usr/src/uts/intel/Makefile
-echo_file usr/src/uts/intel/Makefile.files
-echo_file usr/src/uts/intel/Makefile.rules
-echo_file usr/src/uts/intel/Makefile.intel
-echo_file usr/src/uts/intel/Makefile.intel.shared
-echo_file usr/src/uts/intel/Makefile.targ
-echo_file usr/src/uts/intel/Makefile.targ.shared
-echo_file usr/src/uts/sparc/v9/Makefile.files
-echo_file usr/src/uts/sparc/v9/Makefile.rules
-echo_file usr/src/uts/sun4u/Makefile.rules
-echo_file usr/src/uts/sun4/Makefile.rules
-echo_file usr/src/uts/common/sys/Makefile
-echo_file usr/src/uts/common/os/privs.awk
-echo_file usr/src/uts/common/os/priv_defs
-echo_file usr/src/uts/common/rpc/Makefile
-echo_file usr/src/uts/common/rpcsvc/Makefile
-echo_file usr/src/uts/common/gssapi/Makefile
diff --git a/usr/src/uts/common/io/warlock/usb_ac.wlcmd b/usr/src/uts/common/io/warlock/usb_ac.wlcmd
index 37bf53167a..6a68d90059 100644
--- a/usr/src/uts/common/io/warlock/usb_ac.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac.wlcmd
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
one usb_ac_state
@@ -46,9 +45,6 @@ root usb_ac_stop_play
root usb_ac_stop_record
root usb_ac_teardown
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
-
add bus_ops::bus_add_eventcall targets warlock_dummy
add bus_ops::bus_get_eventcookie targets warlock_dummy
add bus_ops::bus_post_event targets warlock_dummy
diff --git a/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd b/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
index 67cc818a42..9442430d7f 100644
--- a/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
# warlock command file
@@ -86,8 +85,6 @@ root am_single_open_task
root am_hw_task
### specify the usb_ac root functions
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
root usb_ac_open
root usb_ac_close
root usb_ac_disconnect_event_cb
diff --git a/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd b/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
index e5441a38e2..aba4357455 100644
--- a/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
@@ -1,5 +1,5 @@
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# CDDL HEADER START
@@ -21,7 +21,6 @@
#
# CDDL HEADER END
#
-#ident "%Z%%M% %I% %E% SMI"
one ohci_state
one ehci_state
@@ -147,8 +146,6 @@ root ohci_intr
root ehci_intr
### specify the usb_ac root functions
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
root usb_ac_open
root usb_ac_close
root usb_ac_disconnect_event_cb
diff --git a/usr/src/uts/common/sys/Makefile b/usr/src/uts/common/sys/Makefile
index 75a8d27fc0..4f0cb2dd1c 100644
--- a/usr/src/uts/common/sys/Makefile
+++ b/usr/src/uts/common/sys/Makefile
@@ -43,9 +43,6 @@ i386_HDRS= \
agp/agptarget_io.h \
agpgart.h \
asy.h \
- audio/audio810.h \
- audio/audiohd.h \
- audio/audioixp.h \
fd_debug.h \
fdc.h \
fdmedia.h \
@@ -55,8 +52,6 @@ i386_HDRS= \
ucode.h
sparc_HDRS= \
- audio/audiots.h \
- audio/am_src2.h \
mouse.h \
scsi/targets/ssddef.h \
$(MDESCHDRS)
@@ -85,7 +80,6 @@ CHKHDRS= \
attr.h \
audio.h \
audioio.h \
- audiovar.h \
autoconf.h \
auxv.h \
auxv_386.h \
@@ -505,6 +499,7 @@ CHKHDRS= \
socketvar.h \
sockio.h \
sodirect.h \
+ soundcard.h \
squeue.h \
squeue_impl.h \
srn.h \
@@ -653,12 +648,9 @@ HDRS= \
AUDIOHDRS= \
ac97.h \
- am_src1.h \
- audio_apm.h \
- audio_mixer.h \
- audio_src.h \
- audio_support.h \
- audio_trace.h \
+ audio_common.h \
+ audio_driver.h \
+ audio_oss.h \
g711.h
AVHDRS= \
diff --git a/usr/src/uts/common/sys/audio/ac97.h b/usr/src/uts/common/sys/audio/ac97.h
index 2a2f7afb33..ebeae69d2e 100644
--- a/usr/src/uts/common/sys/audio/ac97.h
+++ b/usr/src/uts/common/sys/audio/ac97.h
@@ -20,20 +20,15 @@
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-/*
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
#ifndef _SYS_AC97_H
#define _SYS_AC97_H
-#pragma ident "%Z%%M% %I% %E% SMI"
+#include <sys/types.h>
+#include <sys/audio/audio_common.h>
#ifdef __cplusplus
extern "C" {
@@ -42,89 +37,12 @@ extern "C" {
#ifdef _KERNEL
/*
- * This header file describes the AC-97 V2.1 Codec register set. See the
+ * This header file describes the AC-97 Codec register set. See the
* spec for a detailed description of each register.
*/
-struct ac97_v21 {
- uint16_t ac97_reset; /* 00h */
- uint16_t ac97_master_volume; /* 02h */
- uint16_t ac97_headphone_volume; /* 04h, optional */
- uint16_t ac97_master_mono_volume; /* 06h, optional */
- uint16_t ac97_master_tone; /* 08h, optional */
- uint16_t ac97_pc_beep_volume; /* 0ah, optional */
- uint16_t ac97_phone_volume; /* 0ch, optional */
- uint16_t ac97_mic_volume; /* 0eh */
- uint16_t ac97_line_in_volume; /* 10h */
- uint16_t ac97_cd_volume; /* 12h */
- uint16_t ac97_video_volume; /* 14h, optional */
- uint16_t ac97_aux_volume; /* 16h, optional */
- uint16_t ac97_PCM_out_volume; /* 18h */
- uint16_t ac97_record_select; /* 1ah */
- uint16_t ac97_record_gain; /* 1ch */
- uint16_t ac97_record_gain_mic; /* 1eh, optional */
- uint16_t ac97_general_purpose; /* 20h, optional */
- uint16_t ac97_threeD_control; /* 22h, optional */
- uint16_t ac97_reserved_1; /* 24h */
- uint16_t ac97_pwrdwn_ctrl_stat; /* 26h */
-
- /* extended audio registers */
-
- uint16_t ac97_ext_audio_id; /* 28h, optional */
- uint16_t ac97_ext_audio_stat_ctrl; /* 2ah, optional */
- uint16_t ac97_ext_front_DAC_rate; /* 2ch, optional */
- uint16_t ac97_ext_surround_DAC_rate; /* 2eh, optional */
- uint16_t ac97_ext_LFE_DAC_rate; /* 30h, optional */
- uint16_t ac97_ext_LR_ADC_rate; /* 32h, optional */
- uint16_t ac97_ext_mic_ADC_rate; /* 34h, optional */
- uint16_t ac97_ext_C_LFE_volume; /* 36h, optional */
- uint16_t ac97_ext_LR_surround_volume; /* 38h, optional */
- uint16_t ac97_ext_reserved_1; /* 3ah, optional */
-
- /* extended modem registers */
-
- uint16_t ac97_ext_modem_id; /* 3ch, optional */
- uint16_t ac97_ext_modem_stat_ctrl; /* 3eh, optional */
- uint16_t ac97_ext_line1_DAC_ADC_rate; /* 40h, optional */
- uint16_t ac97_ext_line2_DAC_ADC_rate; /* 42h, optional */
- uint16_t ac97_ext_hndst_DAC_ADC_rate; /* 44h, optional */
- uint16_t ac97_ext_line1_DAC_ADC_level; /* 46h, optional */
- uint16_t ac97_ext_line2_DAC_ADC_level; /* 48h, optional */
- uint16_t ac97_ext_hndst_DAC_ADC_level; /* 4ah, optional */
- uint16_t ac97_ext_GPIO_pin_config; /* 4ch, optional */
- uint16_t ac97_ext_GPIO_pin_polarity; /* 4eh, optional */
- uint16_t ac97_ext_GPIO_pin_sticky; /* 50h, optional */
- uint16_t ac97_ext_GPIO_pin_wakeup; /* 52h, optional */
- uint16_t ac97_ext_GPIO_pin_status; /* 54h, optional */
- uint16_t ac97_ext_modem_AFE_stat_ctrl; /* 56h, optional */
- uint16_t ac97_ext_reserved_2; /* 58h, optional */
-
- /* reserved for vendor usage */
- uint16_t ac97_vendor_01; /* 5ah, optional */
- uint16_t ac97_vendor_02; /* 5ch, optional */
- uint16_t ac97_vendor_03; /* 5eh, optional */
- uint16_t ac97_vendor_04; /* 60h, optional */
- uint16_t ac97_vendor_05; /* 62h, optional */
- uint16_t ac97_vendor_06; /* 64h, optional */
- uint16_t ac97_vendor_07; /* 66h, optional */
- uint16_t ac97_vendor_08; /* 68h, optional */
- uint16_t ac97_vendor_09; /* 6ah, optional */
- uint16_t ac97_vendor_10; /* 6ch, optional */
- uint16_t ac97_vendor_11; /* 6eh, optional */
- uint16_t ac97_vendor_12; /* 70h, optional */
- uint16_t ac97_vendor_13; /* 72h, optional */
- uint16_t ac97_vendor_14; /* 74h, optional */
- uint16_t ac97_vendor_15; /* 76h, optional */
- uint16_t ac97_vendor_16; /* 78h, optional */
- uint16_t ac97_vendor_17; /* 7ah, optional */
-
- uint16_t ac97_vendor_id1; /* 7ch */
- uint16_t ac97_vendor_id2; /* 7eh */
-};
-typedef struct ac97_v21 ac97_v21_t;
-
/*
- * Defines for the V2.1 registers.
+ * Defines for the registers.
*/
/* Reset Register Index 00h */
@@ -162,7 +80,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define HPVR_MUTE 0x8000
/* Mono Master Volume Register Index 06h - Optional */
-#define AC97_MONO_MASTER_VOLUME_REGSITER 0x06
+#define AC97_MONO_MASTER_VOLUME_REGISTER 0x06
#define MMVR_MASK 0x001f
#define MMVR_0dB_ATTEN 0x0000
#define MMVR_OPTIONAL_MASK 0x003f
@@ -239,7 +157,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define AUXVR_LEFT_MAX_ATTEN 0x1f00
#define AUXVR_MUTE 0x8000
-/* PCM Out Input Volume Register Index 18h */
+/* PCM Out Volume Register Index 18h */
#define AC97_PCM_OUT_VOLUME_REGISTER 0x18
#define PCMOVR_RIGHT_GAIN_MASK 0x001f
#define PCMOVR_RIGHT_0dB_GAIN 0x0010
@@ -306,6 +224,14 @@ typedef struct ac97_v21 ac97_v21_t;
#define TDCR_CENTER_MASK 0x0f00
#define TDCR_NULL 0x0000
+/* Audio Interrupt and Paging Mechanism Index 24h - r2.3 */
+#define AC97_INTERRUPT_PAGING_REGISTER 0x24
+#define IPR_IS 0x8000
+#define IPR_CAUSE_MASK 0x6000
+#define IPR_SC 0x1000
+#define IPR_IE 0x0800
+#define IPR_PG_MASK 0x000f
+
/* Powerdown Control Status Register Index 26h */
#define AC97_POWERDOWN_CTRL_STAT_REGISTER 0x26
#define PCSR_ADC 0x0001
@@ -327,11 +253,17 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_AUDIO_REGISTER 0x28
#define EAR_VRA 0x0001
#define EAR_DRA 0x0002
+#define EAR_SPDIF 0x0004
#define EAR_VRM 0x0008
+#define EAR_DSA_MASK 0x0030
#define EAR_CDAC 0x0040
#define EAR_SDAC 0x0080
#define EAR_LDAC 0x0100
#define EAR_AMAP 0x0200
+#define EAR_REV_MASK 0x0c00
+#define EAR_REV_21 0x0000
+#define EAR_REV_22 0x0400
+#define EAR_REV_23 0x0800
#define EAR_PRIMARY_CODEC 0x0000
#define EAR_SECONDARY_01_CODEC 0x4000
#define EAR_SECONDARY_10_CODEC 0x8000
@@ -341,15 +273,23 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER 0x2a
#define EASCR_VRA 0x0001
#define EASCR_DRA 0x0002
+#define EASCR_SPDIF 0x0004
#define EASCR_VRM 0x0008
+#define EASCR_SPSA_MASK 0x0030
+#define EASCR_SPSA_3_4 0x0000
+#define EASCR_SPSA_7_8 0x0010
+#define EASCR_SPSA_6_9 0x0020
+#define EASCR_SPSA_10_11 0x0030
#define EASCR_CDAC 0x0040
#define EASCR_SDAC 0x0080
#define EASCR_LDAC 0x0100
#define EASCR_MADC 0x0200
+#define EASCR_SPCV 0x0400
#define EASCR_PRI 0x0800
#define EASCR_PRJ 0x1000
#define EASCR_PRK 0x2000
#define EASCR_PRL 0x4000
+#define EASCR_VCFG 0x8000
/* Extended Front DAC Rate Register 2ch - Optional */
#define AC97_EXTENDED_FRONT_DAC_RATE_REGISTER 0x2c
@@ -371,7 +311,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_C_LFE_VOLUME_REGISTER 0x36
#define EXLFEVR_CENTER_MASK 0x001f
#define EXLFEVR_CENTER_OPTIONAL_MASK 0x003f
-#define EXLFEVR_CENTER_MTUE 0x0080
+#define EXLFEVR_CENTER_MUTE 0x0080
#define EXLFEVR_LFE_MASK 0x1f00
#define EXLFEVR_LFE_OPTIONAL_MASK 0x3f00
#define EXLFEVR_LFE_MUTE 0x8000
@@ -385,6 +325,25 @@ typedef struct ac97_v21 ac97_v21_t;
#define EXLFEVR_LEFT_OPTIONAL_MASK 0x3f00
#define EXLFEVR_LEFT_MUTE 0x8000
+/* S/PDIF Control Register 3ah - Optional */
+#define AC97_SPDIF_CONTROL_REGISTER 0x3a
+#define SPCR_PRO 0x0001
+#define SPCR_AUDIO 0x0002
+#define SPCR_COPY 0x0004
+#define SPCR_PRE 0x0008
+#define SPCR_CC_MASK 0x07f0
+#define SPCR_L 0x0800
+#define SPCR_SPSR_MASK 0x3000
+#define SPCR_SPSR_44100 0x0000
+#define SPCR_SPSR_48000 0x2000
+#define SPCR_SPSR_32000 0x3000
+#define SPCR_DRS 0x4000
+#define SPCR_V 0x8000
+
+/*
+ * Modem only registers from 3ch - 58h.
+ */
+
/* Extended Modem ID Register 3ch - Optional */
#define AC97_EXTENDED_MODEM_ID_REGISTER 0x3c
#define EMIDR_LINE1 0x0001
@@ -478,7 +437,11 @@ typedef struct ac97_v21 ac97_v21_t;
#define EMAFESCR_CID1 0x4000
#define EMAFESCR_CID2 0x8000
-/* Vender Reserved Registers 5ah - 7ah - Optional */
+/* Vendor Reserved Registers 5ah - 7ah - Optional */
+/*
+ * Note that 60h - 6eh is also defined as the extended codec page area in
+ * AC'97 r2.3.
+ */
#define AC97_VENDOR_REGISTER_01 0x5a
#define AC97_VENDOR_REGISTER_02 0x5c
#define AC97_VENDOR_REGISTER_03 0x5e
@@ -497,6 +460,18 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_VENDOR_REGISTER_16 0x78
#define AC97_VENDOR_REGISTER_17 0x7a
+/*
+ * Page 01 Extended Codec Registers
+ */
+#define AC97_PAGE01_CODEC_CLASS_REV_REGISTER 0x60
+#define AC97_PAGE01_PCI_SVID_REGISTER 0x62
+#define AC97_PAGE01_PCI_SID_REGISTER 0x64
+#define AC97_PAGE01_FUNCTION_SELECT_REGISTER 0x66
+#define AC97_PAGE01_FUNCTION_INFORMATION_REGISTER 0x68
+#define AC97_PAGE01_SENSE_DETAILS_REGISTER 0x6a
+#define AC97_PAGE01_DAC_SLOT_MAPPING_REGISTER 0x6c
+#define AC97_PAGE01_ADC_SLOT_MAPPING_REGISTER 0x6e
+
/* Vendor ID1 Register 7ch */
#define AC97_VENDOR_ID1_REGISTER 0x7c
#define VID1R_CHAR2_MASK 0x00ff
@@ -507,6 +482,133 @@ typedef struct ac97_v21 ac97_v21_t;
#define VID2R_REVISION_MASK 0x00ff
#define VID2R_CHAR3_MASK 0xff00
+/*
+ * Property names used by AC97. We should probably have a better way
+ * of dealing with some of these. (LINEIN_FUNC and MIC_FUNC should really
+ * be saved/restored with other global settings.)
+ */
+#define AC97_PROP_AMPLIFIER "ac97-amplifier"
+#define AC97_PROP_SPEAKER "ac97-speaker"
+#define AC97_PROP_MICBOOST "ac97-micboost"
+#define AC97_PROP_NO_HEADPHONE "ac97-no-headphone"
+#define AC97_PROP_NO_AUXOUT "ac97-no-auxout"
+#define AC97_PROP_NO_CDROM "ac97-no-cdrom"
+#define AC97_PROP_NO_VIDEO "ac97-no-video"
+#define AC97_PROP_NO_AUXIN "ac97-no-auxin"
+#define AC97_PROP_NO_MIC "ac97-no-mic"
+#define AC97_PROP_NO_LINEIN "ac97-no-linein"
+#define AC97_PROP_LINEIN_FUNC "ac97-linein-function" /* 1=linein, 2=surr */
+#define AC97_PROP_MIC_FUNC "ac97-mic-function" /* 1=mic, 2=cen/lfe */
+#define AC97_PROP_DOWNMIX "ac97-downmix"
+#define AC97_PROP_SPREAD "ac97-spread"
+
+/*
+ * Known Codec vendors.
+ */
+#define AC97_VENDOR_ADS 0x41445300 /* Analog Devices */
+#define AC97_VENDOR_AKM 0x414b4d00 /* Asahi Kasei */
+#define AC97_VENDOR_ALC 0x414c4300 /* Realtek */
+#define AC97_VENDOR_ALG 0x414c4700 /* Realtek */
+#define AC97_VENDOR_CMI 0x43d44900 /* Cmedia */
+#define AC97_VENDOR_CRY 0x43525900 /* Cirrus Logic */
+#define AC97_VENDOR_CXT 0x43585400 /* Conexant */
+#define AC97_VENDOR_EMC 0x454d4300 /* eMicro */
+#define AC97_VENDOR_EV 0x000f8300 /* Ectiva */
+#define AC97_VENDOR_ESS 0x45838300 /* ESS */
+#define AC97_VENDOR_ICE 0x49434500 /* ICEnsemble */
+#define AC97_VENDOR_ST 0x83847600 /* SigmaTel */
+#define AC97_VENDOR_TRA 0x54524100 /* TriTech */
+#define AC97_VENDOR_VIA 0x56494100 /* VIA */
+#define AC97_VENDOR_WML 0x574d4c00 /* Wolfson */
+#define AC97_VENDOR_YMH 0x594d4800 /* Yamaha */
+
+/*
+ * Known Codec IDs.
+ */
+#define AC97_CODEC_AD1819B 0x41445303
+#define AC97_CODEC_AD1881 0x41445340
+#define AC97_CODEC_AD1881A 0x41445348
+#define AC97_CODEC_AD1885 0x41445360
+#define AC97_CODEC_AD1886 0x41445361
+#define AC97_CODEC_AD1887 0x41445362
+#define AC97_CODEC_AD1888 0x41445368
+#define AC97_CODEC_AD1980 0x41445370
+#define AC97_CODEC_AD1981A 0x41445371
+#define AC97_CODEC_AD1981 0x41445372
+#define AC97_CODEC_AD1981B 0x41445374
+#define AC97_CODEC_AD1985 0x41445375
+#define AC97_CODEC_AK4540 0x414b4d00
+#define AC97_CODEC_ALC100 0x414c4326
+#define AC97_CODEC_ALC200P 0x414c4710
+#define AC97_CODEC_ALC202 0x414c4740
+#define AC97_CODEC_ALC203 0x414c4770
+#define AC97_CODEC_ALC250 0x414c4750
+#define AC97_CODEC_ALC250_2 0x414c4752
+#define AC97_CODEC_ALC650 0x414c4720
+#define AC97_CODEC_ALC655 0x414c4760
+#define AC97_CODEC_ALC658 0x414c4780
+#define AC97_CODEC_ALC850 0x414c4790
+#define AC97_CODEC_CMI9738 0x434d4941
+#define AC97_CODEC_CMI9739 0x434d4961
+#define AC97_CODEC_CMI9780 0x434d4969
+#define AC97_CODEC_CMI9761 0x434d4978
+#define AC97_CODEC_CMI9761_2 0x434d4982
+#define AC97_CODEC_CMI9761_3 0x434d4983
+#define AC97_CODEC_CS4202 0x43525970
+#define AC97_CODEC_CS4205 0x43525950
+#define AC97_CODEC_CS4294 0x43525920
+#define AC97_CODEC_CS4297 0x43525900
+#define AC97_CODEC_CS4297A 0x43525910
+#define AC97_CODEC_CS4299 0x43525930
+#define AC97_CODEC_CX20468 0x43585428
+#define AC97_CODEC_CX20468_2 0x43585429
+#define AC97_CODEC_CX20468_21 0x43585430
+#define AC97_CODEC_EM28028 0x454d4328
+#define AC97_CODEC_ES1921 0x45838308
+#define AC97_CODEC_EV1938 0x000f8384
+#define AC97_CODEC_ICE1232 0x49434511
+#define AC97_CODEC_STAC9700 0x83847600
+#define AC97_CODEC_STAC9701 0x83847601
+#define AC97_CODEC_STAC9701_2 0xc250c250
+#define AC97_CODEC_STAC9704 0x83847604
+#define AC97_CODEC_STAC9705 0x83847605
+#define AC97_CODEC_STAC9708 0x83847608
+#define AC97_CODEC_STAC9721 0x83847609
+#define AC97_CODEC_STAC9744 0x83847644
+#define AC97_CODEC_STAC9750 0x83847650
+#define AC97_CODEC_STAC9752 0x83847652
+#define AC97_CODEC_STAC9756 0x83847656
+#define AC97_CODEC_STAC9758 0x83847658
+#define AC97_CODEC_STAC9766 0x83847666
+#define AC97_CODEC_TR28023 0x54524103
+#define AC97_CODEC_TR28023_2 0x54524123
+#define AC97_CODEC_TR28028 0x54524108
+#define AC97_CODEC_TR28028_2 0x54524128
+#define AC97_CODEC_VT1612A 0x56494161
+#define AC97_CODEC_VT1617A 0x56494170
+#define AC97_CODEC_VT1616 0x49434551
+#define AC97_CODEC_VT1616A 0x49434552
+#define AC97_CODEC_VT1618 0x56494182
+#define AC97_CODEC_WM9701A 0x574d4c00
+#define AC97_CODEC_WM9703 0x574d4c03
+#define AC97_CODEC_WM9704 0x574d4c04
+#define AC97_CODEC_YMF743 0x594d4800
+#define AC97_CODEC_YMF753 0x594d4803
+
+/*
+ * Functions for drivers to interact with the common ac97 module.
+ */
+typedef struct ac97 ac97_t;
+typedef void (*ac97_wr_t)(void *, uint8_t, uint16_t);
+typedef uint16_t (*ac97_rd_t)(void *, uint8_t);
+
+ac97_t *ac97_alloc(dev_info_t *, ac97_rd_t, ac97_wr_t, void *);
+void ac97_free(ac97_t *);
+int ac97_init(ac97_t *, audio_dev_t *);
+void ac97_suspend(ac97_t *);
+void ac97_resume(ac97_t *);
+void ac97_reset(ac97_t *);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/audio/am_src1.h b/usr/src/uts/common/sys/audio/am_src1.h
deleted file mode 100644
index 9e5fcd41f9..0000000000
--- a/usr/src/uts/common/sys/audio/am_src1.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * This header file defines the public interfaces for the default
- * audio mixer sample rate converter.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AM_SRC1_H
-#define _SYS_AM_SRC1_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define AM_SRC1_MOD_NAME "Audio Sample Rate Conv. #1"
-
-#ifdef _KERNEL
-
-/*
- * am_ad_src1_info_t - mixer mode Audio Driver sample rate conversion #1 info
- */
-struct am_ad_src1_info {
- uint_t ad_from_sr; /* going from this sample rate */
- uint_t ad_to_sr; /* to this sample rate */
- uint_t ad_nconv; /* number of conversions */
- uint_t ad_u0; /* up conversion parameter #1 */
- uint_t ad_u1; /* up conversion parameter #2 */
- uint_t ad_u2; /* up conversion parameter #3 */
- uint_t ad_u3; /* up conversion parameter #4 */
- uint_t ad_d0; /* conversion parameter #1 */
- uint_t ad_d1; /* conversion parameter #2 */
- uint_t ad_d2; /* conversion parameter #3 */
- uint_t ad_d3; /* conversion parameter #4 */
- uint_t ad_k; /* filter shift */
-};
-typedef struct am_ad_src1_info am_ad_src1_info_t;
-
-#define AM_SRC1_FILTER 0x40000000 /* filter if ORed with ad_p?? */
-
-extern am_ad_src_entry_t am_src1; /* sample rate conversion routine #1 */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC1_H */
diff --git a/usr/src/uts/common/sys/audio/am_src2.h b/usr/src/uts/common/sys/audio/am_src2.h
deleted file mode 100644
index 7c11d904c9..0000000000
--- a/usr/src/uts/common/sys/audio/am_src2.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the public interfaces for the alternative
- * audio mixer sample rate converter.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AM_SRC2_H
-#define _SYS_AM_SRC2_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AM_SRC2_MOD_NAME "Audio Sample Rate Conv. #2"
-
-#ifdef _KERNEL
-
-extern am_ad_src_entry_t am_src2; /* sample rate conversion routine #2 */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_H */
diff --git a/usr/src/uts/common/sys/audio/audio810.h b/usr/src/uts/common/sys/audio/audio810.h
deleted file mode 100644
index 9af6f9c382..0000000000
--- a/usr/src/uts/common/sys/audio/audio810.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO810_H_
-#define _SYS_AUDIO810_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audio810 device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define I810_DEV_NAME "SUNW,audio810"
-#define I810_DEV_CONFIG "onboard1"
-#define I810_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define I810_NAME "audio810"
-#define I810_MOD_NAME "mixer audio driver"
-
-#define I810_SAMPR5510 (5510)
-#define I810_SAMPR6620 (6620)
-#define I810_SAMPR8000 (8000)
-#define I810_SAMPR9600 (9600)
-#define I810_SAMPR11025 (11025)
-#define I810_SAMPR16000 (16000)
-#define I810_SAMPR18900 (18900)
-#define I810_SAMPR22050 (22050)
-#define I810_SAMPR27420 (27420)
-#define I810_SAMPR32000 (32000)
-#define I810_SAMPR33075 (33075)
-#define I810_SAMPR37800 (37800)
-#define I810_SAMPR44100 (44100)
-#define I810_SAMPR48000 (48000)
-
-#define I810_DEFAULT_SR I810_SAMPR8000
-#define I810_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define I810_DEFAULT_PREC AUDIO_PRECISION_8
-#define I810_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define I810_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define I810_DEFAULT_RGAIN (127)
-#define I810_DEFAULT_MONITOR_GAIN (0)
-#define I810_DEFAULT_BAL AUDIO_MID_BALANCE
-#define I810_INTS (175) /* default interrupt rate */
-#define I810_MIN_INTS (24) /* minimum interrupt rate */
-#define I810_MAX_INTS (5000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO810_H_ */
diff --git a/usr/src/uts/common/sys/audio/audio_apm.h b/usr/src/uts/common/sys/audio/audio_apm.h
deleted file mode 100644
index bf79a12b40..0000000000
--- a/usr/src/uts/common/sys/audio/audio_apm.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2003 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the audio support module's public interfaces
- * that may be used by audio personality modules. Audio drivers must NOT
- * include this header file.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_APM_H
-#define _SYS_AUDIO_APM_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-/*
- * Miscellaneous defines.
- */
-#define AUDIO_NUM_DEVS 10 /* /dev/audio, /dev/audioctl, etc. */
-#define AUDIO_MINOR_PER_INST 128 /* max # of channels to each instance */
-#define AUDIO_MIN_CLONE_CHS 1 /* minimum number of clone channels */
-#define AUDIO_CLONE_CHANLIM (AUDIO_MINOR_PER_INST - AUDIO_NUM_DEVS)
- /* max # of clones to each instance */
-
-#define AUDIO_MINOR_TO_INST(d) (getminor(d) >> 7)
-
-#define AUDIO_TASKQ_SUSPENDED 0
-#define AUDIO_TASKQ_RUNNING (~AUDIO_TASKQ_SUSPENDED)
-
-/*
- * audio_data_t - struct used to store original and processed audio data
- */
-struct audio_data {
- void *adata_orig; /* the original data */
- void *adata_optr; /* marker into the orig. data */
- void *adata_oeptr; /* end of the original data */
- size_t adata_osize; /* size of the original data */
- void *adata_proc; /* the processed data */
- void *adata_pptr; /* marker into the proc. data */
- void *adata_peptr; /* ptr to end of proc. data */
- size_t adata_psize; /* size of the processed data */
- struct audio_data *adata_next; /* pointer to the next struct */
-};
-typedef struct audio_data audio_data_t;
-
-/*
- * The members of the audio_data structure, except adata_next, are protected
- * by scheme because audio_sup_get_audio_data() removes one of these structures
- * from the list and only that thread has access to the data structure.
- */
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_orig))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_optr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_oeptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_osize))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_proc))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_pptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_peptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_psize))
-
-/*
- * audio_ch_t - per channel state and operation data
- */
-struct audio_ch {
- queue_t *ch_qptr; /* channel queue pointer */
- struct audio_state *ch_statep; /* channel instance state ptr */
- kmutex_t ch_lock; /* channel lock */
- kcondvar_t ch_cv; /* available for use by ch */
- struct audio_apm_info *ch_apm_infop; /* pointer to ch APM info */
- int (*ch_wput)(queue_t *, mblk_t *);
- /* APM's write put rtn */
- int (*ch_wsvc)(queue_t *);
- /* APM's write svc rtn */
- int (*ch_rput)(queue_t *, mblk_t *);
- /* APM's read put routine */
- int (*ch_rsvc)(queue_t *);
- /* APM's read svc routine */
- int ch_dir; /* I/O direction */
- uint_t ch_flags; /* channel state flags */
- dev_t ch_dev; /* channel device number */
- void *ch_private; /* channel private data */
- audio_channel_t ch_info; /* channel state info */
- audio_device_t *ch_dev_info; /* Audio Driver device info */
- kmutex_t ch_adata_lock; /* audio data list lock */
- audio_data_t *ch_adata; /* audio data structure list */
- audio_data_t *ch_adata_end; /* end of audio data list */
- int ch_adata_cnt; /* # of queued data structs */
-};
-typedef struct audio_ch audio_ch_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_lock, audio_ch))
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata_cnt))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata_end))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_data::adata_next))
-
-/*
- * Further analysis is needed for these structure members. We are
- * deferring this analysis until later.
- */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_qptr))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_statep))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_apm_infop))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_wput))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_wsvc))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_rput))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_rsvc))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dir))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_private))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_info))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dev_info))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dev))
-
-/* audio_ch.ch_flags defines */
-#define AUDIO_CHNL_ALLOCATED 0x0001u /* the channel is allocated */
-#define AUDIO_CHNL_ACTIVE 0x0002u /* the channel is active */
-
-/*
- * audio_state_t - per instance state and operation data
- */
-struct audio_state {
- kmutex_t as_lock; /* instance state lock */
- kcondvar_t as_cv; /* cv for blocked ch alloc */
- int as_max_chs; /* max # of open channels */
- int as_minors_per_inst; /* #minors per instance */
- int as_audio_reserved; /* #audio devices */
- dev_info_t *as_dip; /* known at attach time */
- int as_dev_instance; /* Audio Driver dev inst. # */
- major_t as_major; /* Audio Driver major number */
- uint_t as_ch_inuse; /* # of channels in use */
- struct audio_apm_info *as_apm_info_list; /* APM info list */
- void *as_private; /* private audio driver data */
- void *as_persistp; /* persistent data */
- audio_ch_t as_channels[AUDIO_CLONE_CHANLIM]; /* channels */
-};
-typedef struct audio_state audio_state_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, audio_state))
-
-/* these audio_state structure members are read only once set */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_max_chs))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_dip))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_dev_instance))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_max_chs))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_audio_reserved))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_minors_per_inst))
-
-/*
- * Further analysis is needed for this structure member. We are
- * deferring this analysis until later.
- */
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_state::as_private))
-
-/*
- * audio_apm_info_t - audio personality module state information
- */
-struct audio_apm_info {
- kmutex_t apm_lock; /* APM structure state lock */
- int (*apm_open)(queue_t *, dev_t *,
- int, int, cred_t *);
- /* APM open() routine */
- int (*apm_close)(queue_t *, int, cred_t *);
- /* APM close() routine */
- int (*apm_restore_state)(audio_state_t *,
- struct audio_apm_info *, int);
- /* APM state retsore routine */
- int (*apm_save_state)(audio_state_t *,
- struct audio_apm_info *, int);
- /* APM state save routine */
- audio_device_t *apm_info; /* audio_device_t structure */
- audio_device_type_e apm_type; /* the device type */
- void *apm_private; /* private APM data */
- void *apm_ad_infop; /* device capabilities */
- void *apm_ad_state; /* state of the device */
- struct audio_apm_info *apm_next; /* pointer to the next struct */
-};
-typedef struct audio_apm_info audio_apm_info_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock, audio_apm_info))
-/* these audio_apm_info structure members are read only once set */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(
- audio_apm_info::apm_private audio_apm_info::apm_type
- audio_apm_info::apm_close audio_apm_info::apm_open
- audio_apm_info::apm_restore_state audio_apm_info::apm_save_state
- audio_apm_info::apm_info audio_apm_info::apm_ad_infop
- audio_apm_info::apm_ad_state))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_apm_info::apm_next))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, audio_apm_info::apm_next))
-
-/*
- * audio_apm_reg - This structure holds all of the data needed to
- * register an Audio Personality Module for use.
- */
-struct audio_apm_reg {
- int aar_version; /* structure version */
- int (*aar_apm_open)
- (queue_t *q, dev_t *devp, int flag, int sflags,
- cred_t *credp);
- /* APM open() routine */
- int (*aar_apm_close)(queue_t *q, int flag, cred_t *credp);
- /* APM close() routine */
- int (*aar_apm_save_state)(audio_state_t *statep,
- audio_apm_info_t *, int);
- /* APM save routine */
- int (*aar_apm_restore_state)(audio_state_t *statep,
- audio_apm_info_t *, int dir);
- /* APM restore routine */
- void *aar_private; /* APM private data */
- void *aar_info; /* APM info structure */
- void *aar_state; /* APM state structure */
- audio_device_t *aar_dev_info; /* APM device info pointer */
-};
-typedef struct audio_apm_reg audio_apm_reg_t;
-#define AM_AAR_VERSION AM_AAR_VERS1
-#define AM_AAR_VERS1 1 /* supported register version */
-
-/*
- * Macros used to convert between audio handles and the state structure.
- */
-#define AUDIO_HDL2STATE(hdl) ((audio_state_t *)(hdl))
-#define AUDIO_STATE2HDL(statep) ((audiohdl_t)(statep))
-
-/*
- * Audio Support Module Channel Routines
- */
-audio_ch_t *audio_sup_alloc_ch(audio_state_t *statep, int *error,
- audio_device_type_e type, int oflag);
-int audio_sup_free_ch(audio_ch_t *chptr);
-
-/*
- * Audio Support Module State Routines
- */
-audio_state_t *audio_sup_devt_to_state(dev_t dev);
-audio_state_t *audio_sup_devinfo_to_state(dev_info_t *dip);
-
-/*
- * Audio Support Module Persistent Memory Routines
- */
-void *audio_sup_get_persist_state(audio_state_t *state,
- audio_device_type_e dev_type);
-int audio_sup_free_persist_state(audio_state_t *state,
- audio_device_type_e dev_type);
-int audio_sup_set_persist_state(audio_state_t *state,
- audio_device_type_e dev_type, void *state_data, size_t state_size);
-
-/*
- * Audio Support Module Minor Routines
- */
-int audio_sup_ch_to_minor(audio_state_t *statep, int channel);
-int audio_sup_minor_to_ch(audio_state_t *statep, minor_t minor);
-int audio_sup_type_to_minor(audio_device_type_e type);
-
-/*
- * Audio Support Module Audio Data Routines
- */
-void audio_sup_flush_audio_data(audio_ch_t *chptr);
-void audio_sup_free_audio_data(audio_data_t *adata);
-audio_data_t *audio_sup_get_audio_data(audio_ch_t *chptr);
-int audio_sup_get_audio_data_cnt(audio_ch_t *chptr);
-int audio_sup_get_audio_data_size(audio_ch_t *chptr);
-void audio_sup_putback_audio_data(audio_ch_t *chptr, audio_data_t *adata);
-int audio_sup_save_audio_data(audio_ch_t *chptr, void *adata_orig,
- size_t adata_osize, void *adata_proc, size_t adata_psize);
-
-/*
- * Audio Support Module Registration Routines
- */
-audio_apm_info_t *audio_sup_register_apm(audio_state_t *statep,
- audio_device_type_e type, audio_apm_reg_t *reg_info);
-int audio_sup_unregister_apm(audio_state_t *statep, audio_device_type_e type);
-
-/*
- * Audio Support Module Task Queue Routines
- */
-audio_taskq_t audio_sup_taskq_create(const char *q_name);
-void audio_sup_taskq_destroy(audio_taskq_t tq_handle);
-int audio_sup_taskq_dispatch(audio_taskq_t tq_handle,
- void (*task_function)(void *arg), void *arg, int sleep);
-void audio_sup_taskq_resume(audio_taskq_t tq_handle);
-void audio_sup_taskq_suspend(audio_taskq_t tq_handle);
-int audio_sup_taskq_suspended(audio_taskq_t tq_handle);
-void audio_sup_taskq_wait(audio_taskq_t tq_handle);
-
-/*
- * Audio Support Module Miscellaneous Routines
- */
-audio_device_type_e audio_sup_devt_to_ch_type(audio_state_t *statep,
- dev_t dev);
-int audio_sup_get_channel_number(queue_t *q);
-audio_apm_info_t *audio_sup_get_apm_info(audio_state_t *statep,
- audio_device_type_e);
-void *audio_sup_get_info(queue_t *q);
-int audio_sup_mblk_alloc(mblk_t *mp, size_t size);
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_APM_H */
diff --git a/usr/src/uts/common/sys/audio/audio_common.h b/usr/src/uts/common/sys/audio/audio_common.h
new file mode 100644
index 0000000000..296880b6f7
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_common.h
@@ -0,0 +1,304 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AUDIO_AUDIO_COMMON_H
+#define _SYS_AUDIO_AUDIO_COMMON_H
+
+#include <sys/mkdev.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+/* Shared data structures */
+typedef struct audio_parms audio_parms_t;
+typedef struct audio_buffer audio_buffer_t;
+typedef struct audio_stream audio_stream_t;
+typedef struct audio_engine audio_engine_t;
+typedef struct audio_client audio_client_t;
+typedef struct audio_dev audio_dev_t;
+typedef struct audio_mixer_ops audio_mixer_ops_t;
+typedef struct audio_engine_ops audio_engine_ops_t;
+typedef struct audio_ctrl audio_ctrl_t;
+typedef struct audio_ctrl_desc audio_ctrl_desc_t;
+
+struct audio_ctrl_desc {
+ const char *acd_name; /* Controls Mnemonic */
+ uint32_t acd_type; /* Entry type */
+ uint64_t acd_flags; /* Characteristics */
+ /*
+ * Minimum and Maximum values for this control. The value
+ * must be between these values inclusive. For
+ * AUDIO_CTRL_TYPE_ENUM, the maxvalue is a bitmask of
+ * supported controls.
+ */
+ uint64_t acd_maxvalue; /* max value control */
+ uint64_t acd_minvalue; /* min value control */
+ /*
+ * Array of pointers to names for each enum position. This
+ * should be null for all but AUDIO_CTRL_TYPE_ENUM.
+ */
+ const char *acd_enum[64];
+};
+
+/*
+ * Audio data formats. Note that these are represented int a bit
+ * field, to allow for multiple values to be represented in the same
+ * integer (in certain portions of the API.)
+ */
+#define AUDIO_FORMAT_NONE 0x00000000U
+#define AUDIO_FORMAT_ULAW 0x00000001U
+#define AUDIO_FORMAT_ALAW 0x00000002U
+#define AUDIO_FORMAT_S8 0x00000004U
+#define AUDIO_FORMAT_U8 0x00000008U
+#define AUDIO_FORMAT_S16_LE 0x00000010U
+#define AUDIO_FORMAT_S16_BE 0x00000020U
+#define AUDIO_FORMAT_U16_LE 0x00000040U
+#define AUDIO_FORMAT_U16_BE 0x00000080U
+#define AUDIO_FORMAT_S24_LE 0x00000100U
+#define AUDIO_FORMAT_S24_BE 0x00000200U
+#define AUDIO_FORMAT_S32_LE 0x00000400U
+#define AUDIO_FORMAT_S32_BE 0x00000800U
+#define AUDIO_FORMAT_S24_PACKED 0x00001000U
+#define AUDIO_FORMAT_AC3 0x00010000U
+#define AUDIO_FORMAT_OPAQUE_MASK 0xffff0000U
+#define AUDIO_FORMAT_CONVERTIBLE 0x0000ffffU
+/*
+ * We only support signed 16, 24, and 32 bit format conversions in the
+ * engines, for simplicity. (We haven't run into any engines that
+ * require other formats.)
+ */
+#define AUDIO_FORMAT_PCM 0x00000f30
+
+/*
+ * Some big endian/little endian handling macros (native endian and opposite
+ * endian formats). The usage of these macros is described in the OSS
+ * Programmer's Manual.
+ */
+
+#if defined(_BIG_ENDIAN)
+
+#define AUDIO_FORMAT_S16_NE AUDIO_FORMAT_S16_BE
+#define AUDIO_FORMAT_U16_NE AUDIO_FORMAT_U16_BE
+#define AUDIO_FORMAT_S32_NE AUDIO_FORMAT_S32_BE
+#define AUDIO_FORMAT_S24_NE AUDIO_FORMAT_S24_BE
+#define AUDIO_FORMAT_S16_OE AUDIO_FORMAT_S16_LE
+#define AUDIO_FORMAT_U16_OE AUDIO_FORMAT_U16_LE
+#define AUDIO_FORMAT_S32_OE AUDIO_FORMAT_S32_LE
+#define AUDIO_FORMAT_S24_OE AUDIO_FORMAT_S24_LE
+
+#elif defined(_LITTLE_ENDIAN)
+#define AUDIO_FORMAT_S16_NE AUDIO_FORMAT_S16_LE
+#define AUDIO_FORMAT_U16_NE AUDIO_FORMAT_U16_LE
+#define AUDIO_FORMAT_S32_NE AUDIO_FORMAT_S32_LE
+#define AUDIO_FORMAT_S24_NE AUDIO_FORMAT_S24_LE
+#define AUDIO_FORMAT_S16_OE AUDIO_FORMAT_S16_BE
+#define AUDIO_FORMAT_U16_OE AUDIO_FORMAT_U16_BE
+#define AUDIO_FORMAT_S32_OE AUDIO_FORMAT_S32_BE
+#define AUDIO_FORMAT_S24_OE AUDIO_FORMAT_S24_BE
+
+#else
+#error "Machine endianness undefined"
+#endif
+
+/*
+ * These are parameterized around the maximum minor number available
+ * for use in the filesystem. Unfortunately, we have to use 32-bit limits,
+ * because we could have 32-bit userland apps (we usually will, in fact).
+ */
+#define AUDIO_MN_CLONE_NBITS (NBITSMINOR32 - 1)
+#define AUDIO_MN_CLONE_MASK (1U << (AUDIO_MN_CLONE_NBITS - 1))
+#define AUDIO_MN_TYPE_NBITS (4)
+#define AUDIO_MN_TYPE_SHIFT (0)
+#define AUDIO_MN_TYPE_MASK ((1U << AUDIO_MN_TYPE_NBITS) - 1)
+#define AUDIO_MN_INST_NBITS ((NBITSMINOR32 - 1) - AUDIO_MN_TYPE_NBITS)
+#define AUDIO_MN_INST_MASK ((1U << AUDIO_MN_INST_NBITS) - 1)
+#define AUDIO_MN_INST_SHIFT (AUDIO_MN_TYPE_NBITS)
+#define AUDIO_MKMN(inst, typ) \
+ (((inst) << AUDIO_MN_INST_SHIFT) | ((typ) << AUDIO_MN_TYPE_SHIFT))
+
+#define AUDIO_MINOR_MIXER (0)
+#define AUDIO_MINOR_DSP (1)
+/* 2 is reserved for now */
+#define AUDIO_MINOR_DEVAUDIO (3)
+#define AUDIO_MINOR_DEVAUDIOCTL (4)
+#define AUDIO_MINOR_SNDSTAT (AUDIO_MN_TYPE_MASK)
+
+/* reserved minors for driver specific use */
+#define AUDIO_MINOR_DRV1 (AUDIO_MINOR_SNDSTAT - 1)
+#define AUDIO_MINOR_DRV2 (AUDIO_MINOR_SNDSTAT - 2)
+
+
+/* Various controls */
+#define AUDIO_CTRL_ID_VOLUME "volume"
+#define AUDIO_CTRL_ID_LINEOUT "line-out"
+#define AUDIO_CTRL_ID_FRONT "front"
+#define AUDIO_CTRL_ID_REAR "rear"
+#define AUDIO_CTRL_ID_HEADPHONE "headphones"
+#define AUDIO_CTRL_ID_CENTER "center"
+#define AUDIO_CTRL_ID_LFE "lfe"
+#define AUDIO_CTRL_ID_SURROUND "surround"
+#define AUDIO_CTRL_ID_SPEAKER "speaker"
+#define AUDIO_CTRL_ID_AUX1OUT "aux1-out"
+#define AUDIO_CTRL_ID_AUX2OUT "aux2-out"
+#define AUDIO_CTRL_ID_BASS "bass"
+#define AUDIO_CTRL_ID_TREBLE "treble"
+#define AUDIO_CTRL_ID_3DDEPTH "3d-depth"
+#define AUDIO_CTRL_ID_3DCENT "3d-center"
+#define AUDIO_CTRL_ID_3DENHANCE "3d-enhance"
+#define AUDIO_CTRL_ID_PHONE "phone"
+#define AUDIO_CTRL_ID_MIC "mic"
+#define AUDIO_CTRL_ID_LINEIN "line-in"
+#define AUDIO_CTRL_ID_CD "cd"
+#define AUDIO_CTRL_ID_VIDEO "video"
+#define AUDIO_CTRL_ID_AUX1IN "aux1-in"
+#define AUDIO_CTRL_ID_PCMIN "pcm"
+#define AUDIO_CTRL_ID_RECGAIN "record-gain"
+#define AUDIO_CTRL_ID_AUX2IN "aux2-in"
+#define AUDIO_CTRL_ID_MICBOOST "micboost"
+#define AUDIO_CTRL_ID_LOOPBACK "loopback"
+#define AUDIO_CTRL_ID_LOUDNESS "loudness"
+#define AUDIO_CTRL_ID_OUTPUTS "outputs"
+#define AUDIO_CTRL_ID_INPUTS "inputs"
+#define AUDIO_CTRL_ID_RECSRC "record-source"
+#define AUDIO_CTRL_ID_MONSRC "monitor-source"
+#define AUDIO_CTRL_ID_DIAG "diag"
+#define AUDIO_CTRL_ID_BEEP "beep"
+#define AUDIO_CTRL_ID_MONGAIN "monitor-gain"
+#define AUDIO_CTRL_ID_STEREOSIM "stereo-simulate" /* AC'97 feature */
+#define AUDIO_CTRL_ID_MICGAIN "mic-gain" /* mono mic gain */
+#define AUDIO_CTRL_ID_SPKSRC "speaker-source" /* AC'97 feature */
+#define AUDIO_CTRL_ID_MICSRC "mic-source" /* AC'97 feature */
+#define AUDIO_CTRL_ID_JACK1 "jack1" /* jack repurposing */
+#define AUDIO_CTRL_ID_JACK2 "jack2"
+#define AUDIO_CTRL_ID_JACK3 "jack3"
+#define AUDIO_CTRL_ID_JACK4 "jack4"
+#define AUDIO_CTRL_ID_JACK5 "jack5"
+#define AUDIO_CTRL_ID_JACK6 "jack6"
+#define AUDIO_CTRL_ID_JACK7 "jack7"
+#define AUDIO_CTRL_ID_DOWNMIX "downmix"
+#define AUDIO_CTRL_ID_SPREAD "spread"
+
+/*
+ * Names for ports.
+ */
+#define AUDIO_PORT_MIC "mic"
+#define AUDIO_PORT_CD "cd"
+#define AUDIO_PORT_VIDEO "video"
+#define AUDIO_PORT_AUX1OUT "aux1-out"
+#define AUDIO_PORT_AUX2OUT "aux2-out"
+#define AUDIO_PORT_LINEOUT "line-out"
+#define AUDIO_PORT_STEREOMIX "stereo-mix"
+#define AUDIO_PORT_MONOMIX "mono-mix"
+#define AUDIO_PORT_PHONE "phone"
+#define AUDIO_PORT_REAR "rear"
+#define AUDIO_PORT_CENTER "center"
+#define AUDIO_PORT_SURROUND "surround"
+#define AUDIO_PORT_LFE "lfe"
+#define AUDIO_PORT_SPEAKER "speaker"
+#define AUDIO_PORT_LINEIN "line-in"
+#define AUDIO_PORT_AUX1IN "aux1-in"
+#define AUDIO_PORT_AUX2IN "aux2-in"
+#define AUDIO_PORT_HEADPHONES "headphones"
+#define AUDIO_PORT_SPDIFIN "spdif-in"
+#define AUDIO_PORT_SPDIFOUT "spdif-out"
+#define AUDIO_PORT_CENLFE "center/lfe" /* combined jack use */
+#define AUDIO_PORT_MIC1 "mic1"
+#define AUDIO_PORT_MIC2 "mic2"
+#define AUDIO_PORT_DIGOUT "digital-out"
+#define AUDIO_PORT_DIGIN "digital-in"
+#define AUDIO_PORT_HDMI "hdmi"
+#define AUDIO_PORT_MODEM "modem"
+#define AUDIO_PORT_HANDSET "handset"
+#define AUDIO_PORT_OTHER "other"
+#define AUDIO_PORT_STEREO "stereo" /* e.g. mic array */
+#define AUDIO_PORT_NONE "none"
+
+/*
+ * A few common values that sometimes we see.
+ */
+#define AUDIO_VALUE_ON "on"
+#define AUDIO_VALUE_OFF "off"
+#define AUDIO_VALUE_VERYLOW "very-low"
+#define AUDIO_VALUE_LOW "low"
+#define AUDIO_VALUE_MEDIUM "medium"
+#define AUDIO_VALUE_HIGH "high"
+#define AUDIO_VALUE_VERYHIGH "very-high"
+
+/*
+ * Posible return values for walk callback function
+ */
+#define AUDIO_WALK_CONTINUE 1 /* continue walk */
+#define AUDIO_WALK_STOP 2 /* stop the walk */
+#define AUDIO_WALK_RESTART 3 /* restart the walk from beginning */
+
+/*
+ * Control types
+ */
+#define AUDIO_CTRL_TYPE_BOOLEAN 1 /* ON/OFF control */
+#define AUDIO_CTRL_TYPE_ENUM 2 /* Enumerated list */
+#define AUDIO_CTRL_TYPE_STEREO 3 /* stereo level control */
+#define AUDIO_CTRL_TYPE_MONO 4 /* mono level control */
+#define AUDIO_CTRL_TYPE_METER 5 /* VU meter */
+
+/*
+ * Control characteristics flags
+ */
+#define AUDIO_CTRL_FLAG_READABLE 0x00000001 /* Control readable */
+#define AUDIO_CTRL_FLAG_WRITEABLE 0x00000002 /* Control writable */
+#define AUDIO_CTRL_FLAG_RW 0x00000003 /* Read/writeable */
+#define AUDIO_CTRL_FLAG_VUPEAK 0x00000004 /* peak meter */
+#define AUDIO_CTRL_FLAG_CENTIBEL 0x00000008 /* Centibel (0.1 dB) */
+#define AUDIO_CTRL_FLAG_DECIBEL 0x00000010 /* Step size of 1 dB */
+#define AUDIO_CTRL_FLAG_POLL 0x00000020 /* May change itself */
+#define AUDIO_CTRL_FLAG_MAINVOL 0x00000100 /* Main volume ctrl */
+#define AUDIO_CTRL_FLAG_PCMVOL 0x00000200 /* PCM output volume */
+#define AUDIO_CTRL_FLAG_RECVOL 0x00000400 /* PCM record volume */
+#define AUDIO_CTRL_FLAG_MONVOL 0x00000800 /* Monitor volume */
+#define AUDIO_CTRL_FLAG_PLAY 0x00001000 /* Playback control */
+#define AUDIO_CTRL_FLAG_REC 0x00002000 /* Record control */
+#define AUDIO_CTRL_FLAG_3D 0x00004000 /* 3D effect control */
+#define AUDIO_CTRL_FLAG_TONE 0x00008000 /* Tone control */
+#define AUDIO_CTRL_FLAG_MONITOR 0x00010000 /* Monitor control */
+#define AUDIO_CTRL_FLAG_DIGITAL 0x00020000 /* Digital control */
+
+/*
+ * AUDIO_CTRL_TYPE_ENUM might allow more than a single value to be
+ * selected. (Value is a bitmask.)
+ */
+#define AUDIO_CTRL_FLAG_MULTI 0x00000040
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_AUDIO_COMMON_H */
diff --git a/usr/src/uts/common/sys/audio/audio_driver.h b/usr/src/uts/common/sys/audio/audio_driver.h
new file mode 100644
index 0000000000..256698c1fe
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_driver.h
@@ -0,0 +1,241 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AUDIO_AUDIO_DRIVER_H
+#define _SYS_AUDIO_AUDIO_DRIVER_H
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_common.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+struct audio_engine_ops {
+ int audio_engine_version;
+#define AUDIO_ENGINE_VERSION 0
+
+ /*
+ * Initialize engine, including buffer allocation. Arguments
+ * that are pointers are hints. On return, they are updated with
+ * the actual values configured by the driver.
+ */
+ int (*audio_engine_open)(void *, int flags,
+ unsigned *fragfr, unsigned *nfrags, caddr_t *buf);
+ void (*audio_engine_close)(void *);
+
+ /*
+ * Start and stop are used to actually get the hardware running
+ * or stop the hardware. Until this is kicked off, the engine
+ * will not actually transfer data. These are not destructive to
+ * ring positions, etc. (Think of it like pause/play).
+ */
+ int (*audio_engine_start)(void *);
+ void (*audio_engine_stop)(void *);
+
+ /*
+ * Obtain the engine offset. Offsets start at zero at engine_open,
+ * and keep counting upwards. Count is returned in frames.
+ */
+ uint64_t (*audio_engine_count)(void *);
+
+ /*
+ * The following entry points return the currently configured
+ * status of the engine. It is assumed that the engine's
+ * configuration is relatively fixed, and does not change
+ * while open, or in response to open.
+ *
+ * However, in the future we might like to allow for the
+ * device to change the settings while it is not open, which
+ * could allow for mixerctl to change the configured channels,
+ * for example. In order to synchronize this properly, we'll
+ * need the engine to perform a notification/request. That
+ * will be added later.
+ *
+ * AC3: We will have to figure out how to support dynamically
+ * selecting different sampling frequencies for AC3, since
+ * it needs to be able to support 32, 44.1, and 48 kHz.
+ * Perhaps special flags used during open() would do the trick.
+ */
+ int (*audio_engine_format)(void *);
+ int (*audio_engine_channels)(void *);
+ int (*audio_engine_rate)(void *);
+
+ /*
+ * DMA cache synchronization. The framework does this on
+ * behalf of the driver for both input and output. The driver
+ * is responsible for tracking the direction (based on the
+ * flags passed to ae_open()), and dealing with any partial
+ * synchronization if any is needed.
+ */
+ void (*audio_engine_sync)(void *, unsigned);
+
+ /*
+ * The framework may like to know how deep the device queues data.
+ * This can be used to provide a more accurate latency calculation.
+ */
+ size_t (*audio_engine_qlen)(void *);
+
+ /*
+ * If the driver doesn't use simple interleaving, then we need to
+ * know more about the offsets of channels within the buffer.
+ * We obtain both the starting offset within the buffer, and the
+ * increment for each new sample. As usual, these are given in
+ * samples. If this entry point is NULL, the framework assumes
+ * that simple interlevaing is used instead.
+ */
+ void (*audio_engine_chinfo)(void *, int chan, unsigned *offset,
+ unsigned *incr);
+};
+
+void audio_init_ops(struct dev_ops *, const char *);
+void audio_fini_ops(struct dev_ops *);
+
+audio_dev_t *audio_dev_alloc(dev_info_t *, int);
+void audio_dev_free(audio_dev_t *);
+
+void audio_dev_set_description(audio_dev_t *, const char *);
+void audio_dev_set_version(audio_dev_t *, const char *);
+void audio_dev_add_info(audio_dev_t *, const char *);
+
+audio_engine_t *audio_engine_alloc(audio_engine_ops_t *, unsigned);
+void audio_engine_set_private(audio_engine_t *, void *);
+void *audio_engine_get_private(audio_engine_t *);
+void audio_engine_free(audio_engine_t *);
+
+void audio_dev_add_engine(audio_dev_t *, audio_engine_t *);
+void audio_dev_remove_engine(audio_dev_t *, audio_engine_t *);
+int audio_dev_register(audio_dev_t *);
+int audio_dev_unregister(audio_dev_t *);
+void audio_dev_warn(audio_dev_t *, const char *, ...);
+/* DEBUG ONLY */
+void audio_dump_bytes(const uint8_t *w, int dcount);
+void audio_dump_words(const uint16_t *w, int dcount);
+void audio_dump_dwords(const uint32_t *w, int dcount);
+
+/*
+ * Drivers call these.
+ */
+void audio_engine_consume(audio_engine_t *);
+void audio_engine_produce(audio_engine_t *);
+void audio_engine_reset(audio_engine_t *);
+
+/* Engine flags */
+#define ENGINE_OUTPUT_CAP (1U << 2)
+#define ENGINE_INPUT_CAP (1U << 3)
+#define ENGINE_CAPS (ENGINE_OUTPUT_CAP | ENGINE_INPUT_CAP)
+#define ENGINE_DRIVER_FLAGS (0xffff) /* flags usable by driver */
+
+#define ENGINE_OUTPUT (1U << 16) /* fields not for driver use */
+#define ENGINE_INPUT (1U << 17)
+#define ENGINE_OPEN (1U << 18)
+#define ENGINE_RUNNING (1U << 19)
+#define ENGINE_EXCLUSIVE (1U << 20) /* exclusive use, e.g. AC3 */
+#define ENGINE_NDELAY (1U << 21) /* non-blocking open */
+#define ENGINE_WAKE (1U << 22) /* wakeup tq running */
+
+/*
+ * entry points used by legacy SADA drivers
+ */
+int audio_legacy_open(queue_t *, dev_t *, int, int, cred_t *);
+int audio_legacy_close(queue_t *, int, cred_t *);
+int audio_legacy_wput(queue_t *, mblk_t *);
+int audio_legacy_wsrv(queue_t *);
+
+
+
+/*
+ * Audio device controls
+ */
+
+/*
+ * Control read or write driver function type.
+ *
+ * Returns zero on success, errno on failure.
+ */
+typedef int (*audio_ctrl_wr_t)(void *, uint64_t);
+typedef int (*audio_ctrl_rd_t)(void *, uint64_t *);
+
+
+/*
+ * This will allocate and register a control for my audio device.
+ *
+ * On success this will return a control structure else NULL.
+ */
+audio_ctrl_t *audio_dev_add_control(audio_dev_t *,
+ audio_ctrl_desc_t *, audio_ctrl_rd_t, audio_ctrl_wr_t, void *);
+
+/*
+ * Add a synthetic PCM volume control. This should only be used by
+ * devices which have no physical PCM volume controls. The control
+ * implements a simple attenuator on the PCM data; unlike AC'97 there
+ * is no "gain", so using this instead of a hardware control may
+ * result in loss range. The control is implemented using
+ * AUDIO_CTRL_ID_VOLUME.
+ */
+int audio_dev_add_soft_volume(audio_dev_t *);
+
+/*
+ * This will remove a control from an audio device.
+ */
+void audio_dev_del_control(audio_ctrl_t *);
+
+/*
+ * This will tell the framework that controls have changed
+ * and it should update its values.
+ */
+void audio_dev_update_controls(audio_dev_t *);
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int audio_control_read(audio_ctrl_t *, uint64_t *);
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int audio_control_write(audio_ctrl_t *, uint64_t);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_AUDIO_DRIVER_H */
diff --git a/usr/src/uts/common/sys/audio/audio_mixer.h b/usr/src/uts/common/sys/audio/audio_mixer.h
index 4e6571dba8..4f84acb44f 100644
--- a/usr/src/uts/common/sys/audio/audio_mixer.h
+++ b/usr/src/uts/common/sys/audio/audio_mixer.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,8 +19,8 @@
* CDDL HEADER END
*/
/*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
*
* This header file defines the public interfaces for the audio mixer
* audio personality module.
@@ -34,8 +33,6 @@
#ifndef _SYS_AUDIO_MIXER_H
#define _SYS_AUDIO_MIXER_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -45,17 +42,16 @@ extern "C" {
/*
* Miscellaneous defines
*/
-#define AM_MAX_QUEUED_MSGS_SIZE (49000*2*4) /* ~1 secs of audio */
-#define AM_MIN_QUEUED_MSGS_SIZE (24500*2*4) /* ~0.5 secs of audio */
+struct am_ad_sample_rates {
+ uint_t *ad_srs; /* NULL term. list of sample rates */
+};
+typedef struct am_ad_sample_rates am_ad_sample_rates_t;
/*
* am_ad_ch_cap_t - Audio Driver play/record capabilities
*/
struct am_ad_ch_cap {
am_ad_sample_rates_t ad_mixer_srs; /* mixer mode sample rates */
- am_ad_sample_rates_t ad_compat_srs; /* compat mode sample rates */
- am_ad_src_entry_t *ad_conv; /* sample rate conv. routines */
- void *ad_sr_info; /* sample rate conv. info */
uint_t *ad_chs; /* list of channel types */
int ad_int_rate; /* interrupt rate */
int ad_max_chs; /* max channels */
@@ -76,50 +72,31 @@ typedef struct am_ad_cap_comb am_ad_cap_comb_t;
* am_ad_entry_t - Audio Driver ops vector definition
*/
struct am_ad_entry {
- int (*ad_setup)(audiohdl_t handle, int stream, int flags);
- void (*ad_teardown)(audiohdl_t handle, int stream, int dir);
- int (*ad_set_config)(audiohdl_t handle, int stream,
+ int (*ad_setup)(audiohdl_t handle, int flags);
+ void (*ad_teardown)(audiohdl_t handle, int dir);
+ int (*ad_set_config)(audiohdl_t handle,
int command, int dir, int arg1, int arg2);
- int (*ad_set_format)(audiohdl_t handle, int stream,
+ int (*ad_set_format)(audiohdl_t handle,
int dir, int sample_rate, int channels,
int precision, int encoding);
- int (*ad_start_play)(audiohdl_t handle, int stream);
- void (*ad_pause_play)(audiohdl_t handle, int stream);
- void (*ad_stop_play)(audiohdl_t handle, int stream);
- int (*ad_start_record)(audiohdl_t handle, int stream);
- void (*ad_stop_record)(audiohdl_t handle, int stream);
- int (*ad_ioctl)(audiohdl_t handle, int channel,
- queue_t *q, mblk_t *mp, int *error);
- int (*ad_iocdata)(audiohdl_t handle, int channel,
- queue_t *q, mblk_t *mp, int *error);
+ int (*ad_start_play)(audiohdl_t handle);
+ void (*ad_stop_play)(audiohdl_t handle);
+ int (*ad_start_record)(audiohdl_t handle);
+ void (*ad_stop_record)(audiohdl_t handle);
};
typedef struct am_ad_entry am_ad_entry_t;
-/* ad_set_config() and ad_set_format() stream # */
-#define AM_SET_CONFIG_BOARD (-1) /* for the whole board */
-
/* ad_set_config() commands */
#define AM_SET_GAIN 0x01 /* set input/ouput channel gain */
-#define AM_SET_GAIN_BAL 0x02 /* set input/ouput channel gain */
#define AM_SET_PORT 0x03 /* set input/output port */
#define AM_SET_MONITOR_GAIN 0x04 /* set monitor gain */
#define AM_OUTPUT_MUTE 0x05 /* mute output */
-#define AM_MONO_MIC 0x06 /* set which mono microphone */
#define AM_MIC_BOOST 0x07 /* enable/disable mic preamp */
-#define AM_BASS_BOOST 0x08 /* boost output bass */
-#define AM_MID_BOOST 0x09 /* boost output mid range */
-#define AM_TREBLE_BOOST 0x0a /* boost output treble */
-#define AM_LOUDNESS 0x0b /* enable/disable output loudness */
-#define AM_SET_DIAG_MODE 0x0c /* set diagnostics mode */
/*
* am_ad_info_t - Audio Driver configuration information structure
*/
struct am_ad_info {
- int ad_int_vers; /* Audio Driver interface version */
- int ad_mode; /* MIXER or COMPAT mode */
- uint_t ad_add_mode; /* additional mode information */
- int ad_codec_type; /* Codec type */
audio_info_t *ad_defaults; /* Audio Driver audio_info_t struct */
am_ad_ch_cap_t ad_play; /* play capabilities */
am_ad_ch_cap_t ad_record; /* record capabilities */
@@ -127,66 +104,13 @@ struct am_ad_info {
am_ad_cap_comb_t *ad_rec_comb; /* list of rec cap. combinations */
am_ad_entry_t *ad_entry; /* Audio Driver entry points */
audio_device_t *ad_dev_info; /* device information */
- uint_t ad_diag_flags; /* flags that specify diagnostics sup */
- uint_t ad_diff_flags; /* format difference flags */
- uint_t ad_assist_flags; /* audio stream assist flags */
- uint_t ad_misc_flags; /* misc. flags */
- uint_t ad_translate_flags; /* translate flags */
int ad_num_mics; /* # of mic inputs */
- uint_t _xxx[4]; /* reserved for future use */
};
typedef struct am_ad_info am_ad_info_t;
/* the taskq lock must be held in order for ad_mode to be valid */
_NOTE(SCHEME_PROTECTS_DATA("method", am_ad_info::ad_mode))
-/* am_ad_info.ad_int_vers defines */
-#define AM_VERSION AM_VERS2
-#define AM_VERS2 2 /* Supported interface version */
-
-/* am_ad_info.ad_add_mode defines */
-#define AM_ADD_MODE_DIAG_MODE 0x00000001u /* dev supports diagnostics */
-#define AM_ADD_MODE_MIC_BOOST 0x00000002u /* mic boost enabled */
-
-/* am_ad_info.ad_codec_type defines */
-#define AM_TRAD_CODEC 0x00000001u /* traditional Codec */
-#define AM_MS_CODEC 0x00000002u /* multi-stream Codec */
-
-/* am_ad_info.ad_diag_flags defines */
-#define AM_DIAG_INTERNAL_LOOP 0x00000001u /* dev has internal loopbacks */
-
-/* am_ad_info.ad_diff_flags defines */
-#define AM_DIFF_SR 0x00000001u /* p/r sample rate may differ */
-#define AM_DIFF_CH 0x00000002u /* p/r channels may differ */
-#define AM_DIFF_PREC 0x00000004u /* p/r precision may differ */
-#define AM_DIFF_ENC 0x00000008u /* p/r encoding may differ */
-
-/* am_ad_info.ad_assist_flags defines */
-#define AM_ASSIST_BASE 0x00000001u /* device has base boost */
-#define AM_ASSIST_MID 0x00000002u /* device has mid range boost */
-#define AM_ASSIST_TREBLE 0x00000004u /* device has treble boost */
-#define AM_ASSIST_LOUDNESS 0x00000008u /* device has loudness boost */
-#define AM_ASSIST_MIC 0x00000010u /* mic has preamp boost */
-
-/* am_ad_info.ad_misc_flags defines */
-#define AM_MISC_PP_EXCL 0x00000001u /* play ports are exclusive */
-#define AM_MISC_RP_EXCL 0x00000002u /* record ports are exclusive */
-#define AM_MISC_MONO_MIC 0x00000004u /* mono mic */
-#define AM_MISC_MONO_DUP 0x00000008u /* mono is duped to all chs */
-
-/* am_ad_info.ad_translate_flags */
-#define AM_MISC_8_P_TRANSLATE 0x00000001u /* trans. signed to unsigned */
-#define AM_MISC_16_P_TRANSLATE 0x00000002u /* trans. signed to unsigned */
-#define AM_MISC_8_R_TRANSLATE 0x00010000u /* trans. unsigned to signed */
-#define AM_MISC_16_R_TRANSLATE 0x00020000u /* trans. unsigned to signed */
-
-/*
- * Support for custom audio driver ioctl()s.
- */
-#define AM_WIOCDATA 0 /* returned by Audio Driver */
-#define AM_ACK 1 /* with private ioctl() & */
-#define AM_NACK 2 /* iocdata() routines */
-
/*
* Audio Mixer Driver Entry Point Routines
*/
@@ -196,13 +120,13 @@ int am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd);
/*
* Audio Mixer Driver Device Dependent Driver Play Routines
*/
-int am_get_audio(audiohdl_t handle, void *buf, int channel, int samples);
-void am_play_shutdown(audiohdl_t handle, int channel);
+int am_get_audio(audiohdl_t handle, void *buf, int samples);
+void am_play_shutdown(audiohdl_t handle);
/*
* Audio Mixer Driver Device Dependent Driver Record Routines
*/
-void am_send_audio(audiohdl_t handle, void *buf, int channel, int samples);
+void am_send_audio(audiohdl_t handle, void *buf, int samples);
/*
* Audio Mixer Driver Device Dependent Driver Miscellaneous Routines
diff --git a/usr/src/uts/common/sys/audio/audio_oss.h b/usr/src/uts/common/sys/audio/audio_oss.h
new file mode 100644
index 0000000000..3cb3b9548a
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_oss.h
@@ -0,0 +1,908 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+#ifndef _SYS_AUDIO_OSS_H
+#define _SYS_AUDIO_OSS_H
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+/*
+ * These are the ioctl calls for all Solaris /dev/dsp and /dev/mixer audio
+ * devices.
+ *
+ * Note that the contents of this file include definitions which exist
+ * primarily for compatibility. Many of the defines here are not
+ * actually implemented, but exist solely to facilitate compilation of
+ * programs from other operating systems. Other definitions here may
+ * not be fully supported or may otherwise be obsolete. There are many
+ * things in this file which should not be used on SunOS.
+ *
+ * Please read the documentation to determine which portions of the
+ * API are fully supported and recommended for use in new
+ * applications.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Buffer status queries.
+ * SNDCTL_DSP_GETOSPACE and SNDCTL_DSP_GETISPACE
+ */
+typedef struct audio_buf_info {
+ int fragments; /* # of available fragments */
+ int fragstotal; /* Total # of fragments allocated */
+ int fragsize; /* Size of a fragment in bytes */
+ int bytes; /* Available space in bytes */
+ /* Note! 'bytes' could be more than fragments*fragsize */
+} audio_buf_info;
+
+/*
+ * Sync groups for audio devices.
+ * SNDCTL_DSP_SYNCGROUP and SNDCTL_DSP_SYNCSTART
+ */
+typedef struct oss_syncgroup {
+ int id;
+ int mode;
+ int filler[16];
+} oss_syncgroup;
+
+/*
+ * SNDCTL_DSP_GETERROR
+ */
+typedef struct audio_errinfo {
+ int play_underruns;
+ int rec_overruns;
+ unsigned int play_ptradjust;
+ unsigned int rec_ptradjust;
+ int play_errorcount;
+ int rec_errorcount;
+ int play_lasterror;
+ int rec_lasterror;
+ int play_errorparm;
+ int rec_errorparm;
+ int filler[16];
+} audio_errinfo;
+
+/*
+ * SNDCTL_DSP_GETIPTR and SNDCTL_DSP_GETOPTR
+ */
+typedef struct count_info {
+ unsigned int bytes; /* Total # of bytes processed */
+ int blocks; /* # of fragment transitions since last time */
+ int ptr; /* Current DMA pointer value */
+} count_info;
+
+/*
+ * SNDCTL_DSP_CURENT_IPTR and SNDCTL_DSP_CURRENT_OPTR
+ */
+typedef struct {
+ long long samples; /* Total # of samples */
+ int fifo_samples; /* Samples in device FIFO */
+ int filler[32]; /* For future use */
+} oss_count_t;
+
+/*
+ * SNDCTL_DSP_GET_RECSRC_NAMES and SNDCTL_DSP_GET_PLAYTGT_NAMES
+ */
+#define OSS_ENUM_MAXVALUE 255
+typedef struct oss_mixer_enuminfo {
+ int dev;
+ int ctrl;
+ int nvalues;
+ int version;
+ short strindex[OSS_ENUM_MAXVALUE];
+ char strings[3000];
+} oss_mixer_enuminfo;
+
+/*
+ * Digital interface (S/PDIF) control interface
+ * SNDCTL_DSP_READCTL and SNDCTL_DSP_WRITECTL
+ */
+typedef struct oss_digital_control {
+ unsigned int caps;
+#define DIG_CBITIN_NONE 0x00000000
+#define DIG_CBITIN_LIMITED 0x00000001
+#define DIG_CBITIN_DATA 0x00000002
+#define DIG_CBITIN_BYTE0 0x00000004
+#define DIG_CBITIN_FULL 0x00000008
+#define DIG_CBITIN_MASK 0x0000000f
+#define DIG_CBITOUT_NONE 0x00000000
+#define DIG_CBITOUT_LIMITED 0x00000010
+#define DIG_CBITOUT_BYTE0 0x00000020
+#define DIG_CBITOUT_FULL 0x00000040
+#define DIG_CBITOUT_DATA 0x00000080
+#define DIG_CBITOUT_MASK 0x000000f0
+#define DIG_UBITIN 0x00000100
+#define DIG_UBITOUT 0x00000200
+#define DIG_VBITOUT 0x00000400
+#define DIG_OUTRATE 0x00000800
+#define DIG_INRATE 0x00001000
+#define DIG_INBITS 0x00002000
+#define DIG_OUTBITS 0x00004000
+#define DIG_EXACT 0x00010000
+#define DIG_PRO 0x00020000
+#define DIG_CONSUMER 0x00040000
+#define DIG_PASSTHROUGH 0x00080000
+#define DIG_OUTSEL 0x00100000
+
+ unsigned int valid;
+#define VAL_CBITIN 0x00000001
+#define VAL_UBITIN 0x00000002
+#define VAL_CBITOUT 0x00000004
+#define VAL_UBITOUT 0x00000008
+#define VAL_ISTATUS 0x00000010
+#define VAL_IRATE 0x00000020
+#define VAL_ORATE 0x00000040
+#define VAL_INBITS 0x00000080
+#define VAL_OUTBITS 0x00000100
+#define VAL_REQUEST 0x00000200
+#define VAL_OUTSEL 0x00000400
+
+#define VAL_OUTMASK (VAL_CBITOUT|VAL_UBITOUT|VAL_ORATE|VAL_OUTBITS|VAL_OUTSEL)
+
+ unsigned int request;
+ unsigned int param;
+#define SPD_RQ_PASSTHROUGH 1
+
+ unsigned char cbitin[24];
+ unsigned char ubitin[24];
+ unsigned char cbitout[24];
+ unsigned char ubitout[24];
+
+ unsigned int outsel;
+#define OUTSEL_DIGITAL 1
+#define OUTSEL_ANALOG 2
+#define OUTSEL_BOTH (OUTSEL_DIGITAL|OUTSEL_ANALOG)
+
+ int in_data; /* Audio/data if autodetectable by receiver */
+#define IND_UNKNOWN 0
+#define IND_AUDIO 1
+#define IND_DATA 2
+
+ int in_locked; /* Receiver locked */
+#define LOCK_NOT_INDICATED 0
+#define LOCK_UNLOCKED 1
+#define LOCK_LOCKED 2
+
+ int in_quality; /* Input signal quality */
+#define IN_QUAL_NOT_INDICATED 0
+#define IN_QUAL_POOR 1
+#define IN_QUAL_GOOD 2
+
+ int in_vbit;
+ int out_vbit; /* V bits */
+#define VBIT_NOT_INDICATED 0
+#define VBIT_OFF 1
+#define VBIT_ON 2
+
+ unsigned int in_errors; /* Various input error conditions */
+#define INERR_CRC 0x0001
+#define INERR_QCODE_CRC 0x0002
+#define INERR_PARITY 0x0004
+#define INERR_BIPHASE 0x0008
+
+ int srate_in;
+ int srate_out;
+ int bits_in;
+ int bits_out;
+
+ int filler[32];
+} oss_digital_control;
+
+/*
+ * The "new" mixer API.
+ *
+ * This improved mixer API makes it possible to access every possible feature
+ * of every possible device. However you should read the mixer programming
+ * section of the OSS API Developer's Manual. There is no chance that you
+ * could use this interface correctly just by examining this header.
+ */
+#define OSS_VERSION 0x040003
+#define SOUND_VERSION OSS_VERSION
+
+typedef struct oss_sysinfo {
+ char product[32]; /* E.g. SunOS Audio */
+ char version[32]; /* E.g. 4.0a */
+ int versionnum; /* See OSS_GETVERSION */
+ char options[128]; /* NOT SUPPORTED */
+
+ int numaudios; /* # of audio/dsp devices */
+ int openedaudio[8]; /* Mask of audio devices are busy */
+
+ int numsynths; /* NOT SUPPORTED, always 0 */
+ int nummidis; /* NOT SUPPORTED, always 0 */
+ int numtimers; /* NOT SUPPORTED, always 0 */
+ int nummixers; /* # of mixer devices */
+
+ int openedmidi[8]; /* Mask of midi devices are busy */
+ int numcards; /* Number of sound cards in the system */
+ int numaudioengines; /* Number of audio engines in the system */
+ char license[16]; /* E.g. "GPL" or "CDDL" */
+ char revision_info[256]; /* For internal use */
+ int filler[172]; /* For future expansion */
+} oss_sysinfo;
+
+typedef struct oss_mixext {
+ int dev; /* Mixer device number */
+ int ctrl; /* Extension number */
+ int type; /* Entry type */
+#define MIXT_DEVROOT 0 /* Device root entry */
+#define MIXT_GROUP 1 /* Controller group */
+#define MIXT_ONOFF 2 /* OFF (0) or ON (1) */
+#define MIXT_ENUM 3 /* Enumerated (0 to maxvalue) */
+#define MIXT_MONOSLIDER 4 /* Mono slider (0 to 255) */
+#define MIXT_STEREOSLIDER 5 /* Stereo slider (dual 0 to 255) */
+#define MIXT_MESSAGE 6 /* (Readable) textual message */
+#define MIXT_MONOVU 7 /* VU meter value (mono) */
+#define MIXT_STEREOVU 8 /* VU meter value (stereo) */
+#define MIXT_MONOPEAK 9 /* VU meter peak value (mono) */
+#define MIXT_STEREOPEAK 10 /* VU meter peak value (stereo) */
+#define MIXT_RADIOGROUP 11 /* Radio button group */
+#define MIXT_MARKER 12 /* Separator between entries */
+#define MIXT_VALUE 13 /* Decimal value entry */
+#define MIXT_HEXVALUE 14 /* Hexadecimal value entry */
+#define MIXT_MONODB 15 /* OBSOLETE */
+#define MIXT_STEREODB 16 /* OBSOLETE */
+#define MIXT_SLIDER 17 /* Slider (mono, 31 bit int range) */
+#define MIXT_3D 18
+#define MIXT_MONOSLIDER16 19 /* Mono slider (0-32767) */
+#define MIXT_STEREOSLIDER16 20 /* Stereo slider (dual 0-32767) */
+#define MIXT_MUTE 21 /* Mute=1, unmute=0 */
+
+ /* Possible value range (minvalue to maxvalue) */
+ /* Note that maxvalue may also be smaller than minvalue */
+ int maxvalue;
+ int minvalue;
+
+ int flags;
+#define MIXF_READABLE 0x00000001 /* Has readable value */
+#define MIXF_WRITEABLE 0x00000002 /* Has writeable value */
+#define MIXF_POLL 0x00000004 /* May change itself */
+#define MIXF_HZ 0x00000008 /* Hertz scale */
+#define MIXF_STRING 0x00000010 /* Use dynamic extensions for value */
+#define MIXF_DYNAMIC 0x00000010 /* Supports dynamic extensions */
+#define MIXF_OKFAIL 0x00000020 /* Interpret value as 1=OK, 0=FAIL */
+#define MIXF_FLAT 0x00000040 /* NOT SUPPORTED */
+#define MIXF_LEGACY 0x00000080 /* NOT SUPPORTED */
+#define MIXF_CENTIBEL 0x00000100 /* Centibel (0.1 dB) step size */
+#define MIXF_DECIBEL 0x00000200 /* Step size of 1 dB */
+#define MIXF_MAINVOL 0x00000400 /* Main volume control */
+#define MIXF_PCMVOL 0x00000800 /* PCM output volume control */
+#define MIXF_RECVOL 0x00001000 /* PCM recording volume control */
+#define MIXF_MONVOL 0x00002000 /* Input->output monitor volume */
+#define MIXF_WIDE 0x00004000 /* NOT SUPPORTED */
+#define MIXF_DESCR 0x00008000 /* NOT SUPPORTED */
+#define MIXF_DISABLE 0x00010000 /* Control has been disabled */
+
+ char id[16]; /* Mnemonic ID (internal use) */
+ int parent; /* Entry# of parent (-1 if root) */
+
+ int dummy; /* NOT SUPPORTED */
+
+ int timestamp;
+
+ char data[64]; /* Misc data (entry type dependent) */
+ unsigned char enum_present[32]; /* Mask of allowed enum values */
+ int control_no; /* NOT SUPPORTED, always -1 */
+
+ unsigned int desc; /* Scope flags, etc */
+#define MIXEXT_SCOPE_MASK 0x0000003f
+#define MIXEXT_SCOPE_OTHER 0x00000000
+#define MIXEXT_SCOPE_INPUT 0x00000001
+#define MIXEXT_SCOPE_OUTPUT 0x00000002
+#define MIXEXT_SCOPE_MONITOR 0x00000003
+#define MIXEXT_SCOPE_RECSWITCH 0x00000004
+
+ char extname[32];
+ int update_counter;
+#ifdef _KERNEL
+ int filler[6];
+ int enumbit;
+#else
+ int filler[7];
+#endif
+} oss_mixext;
+
+typedef struct oss_mixext_root {
+ char id[16];
+ char name[48];
+} oss_mixext_root;
+
+typedef struct oss_mixer_value {
+ int dev;
+ int ctrl;
+ int value;
+ int flags; /* Reserved for future use. Initialize to 0 */
+ int timestamp; /* Must be set to oss_mixext.timestamp */
+ int filler[8]; /* Reserved for future use. Initialize to 0 */
+} oss_mixer_value;
+
+#define OSS_LONGNAME_SIZE 64
+#define OSS_LABEL_SIZE 16
+#define OSS_DEVNODE_SIZE 32
+typedef char oss_longname_t[OSS_LONGNAME_SIZE];
+typedef char oss_label_t[OSS_LABEL_SIZE];
+typedef char oss_devnode_t[OSS_DEVNODE_SIZE];
+
+
+typedef struct oss_audioinfo {
+ int dev; /* Audio device number */
+ char name[64];
+ int busy; /* 0, OPEN_READ, OPEN_WRITE, OPEN_READWRITE */
+ int pid; /* Process ID, not used in SunOS */
+ int caps; /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */
+ int iformats; /* Supported input formats */
+ int oformats; /* Supported output formats */
+ int magic; /* Internal use only */
+ char cmd[64]; /* Command using the device (if known) */
+ int card_number;
+ int port_number;
+ int mixer_dev;
+ int legacy_device; /* Obsolete field. Replaced by devnode */
+ int enabled; /* 1=enabled, 0=device not ready */
+ int flags; /* internal use only - no practical meaning */
+ int min_rate; /* Minimum sample rate */
+ int max_rate; /* Maximum sample rate */
+ int min_channels; /* Minimum number of channels */
+ int max_channels; /* Maximum number of channels */
+ int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */
+ int rate_source;
+ char handle[32];
+#define OSS_MAX_SAMPLE_RATES 20 /* Cannot be changed */
+ unsigned int nrates; /* Array of supported sample rates */
+ unsigned int rates[OSS_MAX_SAMPLE_RATES];
+ oss_longname_t song_name; /* Song name (if given) */
+ oss_label_t label; /* Device label (if given) */
+ int latency; /* In usecs, -1=unknown */
+ oss_devnode_t devnode; /* Device special file name (absolute path) */
+ int next_play_engine;
+ int next_rec_engine;
+ int filler[184];
+} oss_audioinfo;
+
+typedef struct oss_mixerinfo {
+ int dev;
+ char id[16];
+ char name[32];
+ int modify_counter;
+ int card_number;
+ int port_number;
+ char handle[32];
+ int magic; /* Reserved */
+ int enabled; /* Reserved */
+ int caps;
+#define MIXER_CAP_VIRTUAL 0x00000001
+#define MIXER_CAP_LAYOUT_B 0x00000002 /* For internal use only */
+#define MIXER_CAP_NARROW 0x00000004 /* Conserve horiz space */
+ int flags; /* Reserved */
+ int nrext;
+ /*
+ * The priority field can be used to select the default
+ * (motherboard) mixer device. The mixer with the highest
+ * priority is the most preferred one. -2 or less means that
+ * this device cannot be used as the default mixer.
+ */
+ int priority;
+ oss_devnode_t devnode; /* Device special file name (absolute path) */
+ int legacy_device;
+ int filler[245]; /* Reserved */
+} oss_mixerinfo;
+
+typedef struct oss_card_info {
+ int card;
+ char shortname[16];
+ char longname[128];
+ int flags;
+ char hw_info[400];
+ int intr_count;
+ int ack_count;
+ int filler[154];
+} oss_card_info;
+
+typedef struct mixer_info { /* OBSOLETE */
+ char id[16];
+ char name[32];
+ int modify_counter;
+ int card_number;
+ int port_number;
+ char handle[32];
+} mixer_info;
+
+#define MAX_PEAK_CHANNELS 128
+typedef unsigned short oss_peaks_t[MAX_PEAK_CHANNELS];
+
+/* For use with SNDCTL_DSP_GET_CHNORDER */
+#define CHID_UNDEF 0
+#define CHID_L 1
+#define CHID_R 2
+#define CHID_C 3
+#define CHID_LFE 4
+#define CHID_LS 5
+#define CHID_RS 6
+#define CHID_LR 7
+#define CHID_RR 8
+#define CHNORDER_UNDEF 0x0000000000000000ULL
+#define CHNORDER_NORMAL 0x0000000087654321ULL
+
+
+#define OSSIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */
+#define OSSIOC_VOID 0x00000000 /* no parameters */
+#define OSSIOC_OUT 0x20000000 /* copy out parameters */
+#define OSSIOC_IN 0x40000000 /* copy in parameters */
+#define OSSIOC_INOUT (OSSIOC_IN|OSSIOC_OUT)
+#define OSSIOC_SZ(t) ((sizeof (t) & OSSIOCPARM_MASK) << 16)
+#define OSSIOC_GETSZ(x) (((x) >> 16) & OSSIOCPARM_MASK)
+
+#define __OSSIO(x, y) ((int)(OSSIOC_VOID|(x<<8)|y))
+#define __OSSIOR(x, y, t) ((int)(OSSIOC_OUT|OSSIOC_SZ(t)|(x<<8)|y))
+#define __OSSIOW(x, y, t) ((int)(OSSIOC_IN|OSSIOC_SZ(t)|(x<<8)|y))
+#define __OSSIOWR(x, y, t) ((int)(OSSIOC_INOUT|OSSIOC_SZ(t)|(x<<8)|y))
+
+#define SNDCTL_SYSINFO __OSSIOR('X', 1, oss_sysinfo)
+#define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */
+
+#define SNDCTL_MIX_NRMIX __OSSIOR('X', 2, int)
+#define SNDCTL_MIX_NREXT __OSSIOWR('X', 3, int)
+#define SNDCTL_MIX_EXTINFO __OSSIOWR('X', 4, oss_mixext)
+#define SNDCTL_MIX_READ __OSSIOWR('X', 5, oss_mixer_value)
+#define SNDCTL_MIX_WRITE __OSSIOWR('X', 6, oss_mixer_value)
+
+#define SNDCTL_AUDIOINFO __OSSIOWR('X', 7, oss_audioinfo)
+#define SNDCTL_MIX_ENUMINFO __OSSIOWR('X', 8, oss_mixer_enuminfo)
+#define SNDCTL_MIDIINFO __OSSIO('X', 9)
+#define SNDCTL_MIXERINFO __OSSIOWR('X', 10, oss_mixerinfo)
+#define SNDCTL_CARDINFO __OSSIOWR('X', 11, oss_card_info)
+#define SNDCTL_ENGINEINFO __OSSIOWR('X', 12, oss_audioinfo)
+#define SNDCTL_AUDIOINFO_EX __OSSIOWR('X', 13, oss_audioinfo)
+#define SNDCTL_MIX_DESCRIPTION __OSSIOWR('X', 14, oss_mixer_enuminfo)
+
+/* ioctl codes 'X', 200-255 are reserved for internal use */
+
+/*
+ * Few more "globally" available ioctl calls.
+ */
+#define SNDCTL_SETSONG __OSSIOW('Y', 2, oss_longname_t)
+#define SNDCTL_GETSONG __OSSIOR('Y', 2, oss_longname_t)
+#define SNDCTL_SETNAME __OSSIOW('Y', 3, oss_longname_t)
+#define SNDCTL_SETLABEL __OSSIOW('Y', 4, oss_label_t)
+#define SNDCTL_GETLABEL __OSSIOR('Y', 4, oss_label_t)
+
+/*
+ * IOCTL commands for /dev/dsp
+ */
+#define SNDCTL_DSP_HALT __OSSIO('P', 0)
+#define SNDCTL_DSP_RESET SNDCTL_DSP_HALT /* Old name */
+#define SNDCTL_DSP_SYNC __OSSIO('P', 1)
+#define SNDCTL_DSP_SPEED __OSSIOWR('P', 2, int)
+
+#define SNDCTL_DSP_STEREO __OSSIOWR('P', 3, int) /* OBSOLETE */
+
+#define SNDCTL_DSP_GETBLKSIZE __OSSIOWR('P', 4, int)
+#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT
+#define SNDCTL_DSP_CHANNELS __OSSIOWR('P', 6, int)
+#define SNDCTL_DSP_POST __OSSIO('P', 8)
+#define SNDCTL_DSP_SUBDIVIDE __OSSIOWR('P', 9, int)
+#define SNDCTL_DSP_SETFRAGMENT __OSSIOWR('P', 10, int)
+
+#define SNDCTL_DSP_GETFMTS __OSSIOR('P', 11, int) /* Returns a mask */
+#define SNDCTL_DSP_SETFMT __OSSIOWR('P', 5, int) /* Selects ONE fmt */
+
+#define SNDCTL_DSP_GETOSPACE __OSSIOR('P', 12, audio_buf_info)
+#define SNDCTL_DSP_GETISPACE __OSSIOR('P', 13, audio_buf_info)
+#define SNDCTL_DSP_GETCAPS __OSSIOR('P', 15, int)
+
+#define SNDCTL_DSP_GETTRIGGER __OSSIOR('P', 16, int)
+#define SNDCTL_DSP_SETTRIGGER __OSSIOW('P', 16, int)
+
+#define SNDCTL_DSP_GETIPTR __OSSIOR('P', 17, count_info)
+#define SNDCTL_DSP_GETOPTR __OSSIOR('P', 18, count_info)
+
+#define SNDCTL_DSP_SETSYNCRO __OSSIO('P', 21)
+#define SNDCTL_DSP_SETDUPLEX __OSSIO('P', 22)
+
+#define SNDCTL_DSP_PROFILE __OSSIOW('P', 23, int) /* OBSOLETE */
+#define APF_NORMAL 0 /* Normal applications */
+#define APF_NETWORK 1 /* Underruns caused by "external" delay */
+#define APF_CPUINTENS 2 /* Underruns caused by "overheating" the CPU */
+
+
+#define SNDCTL_DSP_GETODELAY __OSSIOR('P', 23, int)
+
+#define SNDCTL_DSP_GETPLAYVOL __OSSIOR('P', 24, int)
+#define SNDCTL_DSP_SETPLAYVOL __OSSIOWR('P', 24, int)
+#define SNDCTL_DSP_GETERROR __OSSIOR('P', 25, audio_errinfo)
+
+#define SNDCTL_DSP_READCTL __OSSIOWR('P', 26, oss_digital_control)
+#define SNDCTL_DSP_WRITECTL __OSSIOWR('P', 27, oss_digital_control)
+
+#define SNDCTL_DSP_SYNCGROUP __OSSIOWR('P', 28, oss_syncgroup)
+#define SNDCTL_DSP_SYNCSTART __OSSIOW('P', 29, int)
+
+#define SNDCTL_DSP_COOKEDMODE __OSSIOW('P', 30, int)
+
+#define SNDCTL_DSP_SILENCE __OSSIO('P', 31)
+#define SNDCTL_DSP_SKIP __OSSIO('P', 32)
+
+#define SNDCTL_DSP_HALT_INPUT __OSSIO('P', 33)
+#define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */
+#define SNDCTL_DSP_HALT_OUTPUT __OSSIO('P', 34)
+#define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */
+
+#define SNDCTL_DSP_LOW_WATER __OSSIOW('P', 34, int)
+
+#define SNDCTL_DSP_CURRENT_IPTR __OSSIOR('P', 35, oss_count_t)
+#define SNDCTL_DSP_CURRENT_OPTR __OSSIOR('P', 36, oss_count_t)
+
+#define SNDCTL_DSP_GET_RECSRC_NAMES __OSSIOR('P', 37, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_RECSRC __OSSIOR('P', 38, int)
+#define SNDCTL_DSP_SET_RECSRC __OSSIOWR('P', 38, int)
+
+#define SNDCTL_DSP_GET_PLAYTGT_NAMES __OSSIOR('P', 39, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_PLAYTGT __OSSIOR('P', 40, int)
+#define SNDCTL_DSP_SET_PLAYTGT __OSSIOWR('P', 40, int)
+#define SNDCTL_DSP_GETRECVOL __OSSIOR('P', 41, int)
+#define SNDCTL_DSP_SETRECVOL __OSSIOWR('P', 41, int)
+
+#define SNDCTL_DSP_GET_CHNORDER __OSSIOR('P', 42, unsigned long long)
+#define SNDCTL_DSP_SET_CHNORDER __OSSIOWR('P', 42, unsigned long long)
+
+#define SNDCTL_DSP_GETIPEAKS __OSSIOR('P', 43, oss_peaks_t)
+#define SNDCTL_DSP_GETOPEAKS __OSSIOR('P', 44, oss_peaks_t)
+
+#define SNDCTL_DSP_POLICY __OSSIOW('P', 45, int) /* See the manual */
+
+#define SNDCTL_DSP_GETCHANNELMASK __OSSIOWR('P', 64, int)
+#define SNDCTL_DSP_BIND_CHANNEL __OSSIOWR('P', 65, int)
+
+/*
+ * These definitions are here for the benefit of compiling application
+ * code. Most of these are NOT implemented in the Solaris code,
+ * however. This is the older 3.x OSS API, and only the master input and
+ * output levels are actually supported.
+ */
+#define SOUND_MIXER_NRDEVICES 28
+#define SOUND_MIXER_VOLUME 0
+#define SOUND_MIXER_BASS 1
+#define SOUND_MIXER_TREBLE 2
+#define SOUND_MIXER_SYNTH 3
+#define SOUND_MIXER_PCM 4
+#define SOUND_MIXER_SPEAKER 5
+#define SOUND_MIXER_LINE 6
+#define SOUND_MIXER_MIC 7
+#define SOUND_MIXER_CD 8
+#define SOUND_MIXER_IMIX 9 /* Recording monitor */
+#define SOUND_MIXER_ALTPCM 10
+#define SOUND_MIXER_RECLEV 11 /* Recording level */
+#define SOUND_MIXER_IGAIN 12 /* Input gain */
+#define SOUND_MIXER_OGAIN 13 /* Output gain */
+#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */
+#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */
+#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */
+#define SOUND_MIXER_DIGITAL1 17 /* Digital I/O 1 */
+#define SOUND_MIXER_DIGITAL2 18 /* Digital I/O 2 */
+#define SOUND_MIXER_DIGITAL3 19 /* Digital I/O 3 */
+#define SOUND_MIXER_PHONE 20 /* Phone */
+#define SOUND_MIXER_MONO 21 /* Mono Output */
+#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */
+#define SOUND_MIXER_RADIO 23 /* Radio in */
+#define SOUND_MIXER_DEPTH 24 /* Surround depth */
+#define SOUND_MIXER_REARVOL 25 /* Rear/Surround speaker vol */
+#define SOUND_MIXER_CENTERVOL 26 /* Center/LFE speaker vol */
+#define SOUND_MIXER_SIDEVOL 27 /* Side-Surround (8speaker) vol */
+#define SOUND_MIXER_SURRVOL SOUND_MIXER_SIDEVOL
+#define SOUND_ONOFF_MIN 28
+#define SOUND_ONOFF_MAX 30
+#define SOUND_MIXER_NONE 31
+
+#define SOUND_MIXER_RECSRC 0xff /* Recording sources */
+#define SOUND_MIXER_DEVMASK 0xfe /* Supported devices */
+#define SOUND_MIXER_RECMASK 0xfd /* Recording sources */
+#define SOUND_MIXER_CAPS 0xfc /* Mixer capabilities (do not use) */
+#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */
+#define SOUND_MIXER_OUTSRC 0xfa
+#define SOUND_MIXER_OUTMASK 0xf9
+
+#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE
+#define SOUND_MIXER_MUTE SOUND_MIXER_NONE
+#define SOUND_MIXER_LOUD SOUND_MIXER_NONE
+
+#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
+#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
+#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
+#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
+#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
+#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
+#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
+#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
+#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
+#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
+#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
+#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
+#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)
+#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)
+#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)
+#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)
+#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)
+#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1)
+#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2)
+#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3)
+#define SOUND_MASK_MONO (1 << SOUND_MIXER_MONO)
+#define SOUND_MASK_PHONE (1 << SOUND_MIXER_PHONE)
+#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO)
+#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO)
+#define SOUND_MASK_DEPTH (1 << SOUND_MIXER_DEPTH)
+#define SOUND_MASK_REARVOL (1 << SOUND_MIXER_REARVOL)
+#define SOUND_MASK_CENTERVOL (1 << SOUND_MIXER_CENTERVOL)
+#define SOUND_MASK_SIDEVOL (1 << SOUND_MIXER_SIDEVOL)
+#define SOUND_MASK_SURRVOL SOUND_MASK_SIDEVOL
+#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
+#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
+#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
+
+/*
+ * Again, DO NOT USE the following two macros. They are here for SOURCE
+ * COMPATIBILITY ONLY.
+ */
+#define SOUND_DEVICE_LABELS { \
+ "Vol ", "Bass ", "Treble", "Synth", "Pcm ", "Speaker ", "Line ", \
+ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \
+ "Aux1", "Aux2", "Aux3", "Digital1", "Digital2", "Digital3", \
+ "Phone", "Mono", "Video", "Radio", "Depth", \
+ "Rear", "Center", "Side" }
+
+#define SOUND_DEVICE_NAMES { \
+ "vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
+ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \
+ "aux1", "aux2", "aux3", "dig1", "dig2", "dig3", \
+ "phone", "mono", "video", "radio", "depth", \
+ "rear", "center", "side" }
+
+#define MIXER_READ(dev) __OSSIOR('M', dev, int)
+#define MIXER_WRITE(dev) __OSSIOWR('M', dev, int)
+#define SOUND_MIXER_INFO __OSSIOR('M', 101, mixer_info)
+#define OSS_GETVERSION __OSSIOR('M', 118, int)
+
+/*
+ * These macros are useful for some applications. They are implemented
+ * as soft values for the application, and do not affect real hardware.
+ */
+#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
+#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
+#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
+#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
+#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
+#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
+#define SOUND_MIXER_READ_RECGAIN __OSSIOR('M', 119, int)
+#define SOUND_MIXER_READ_MONGAIN __OSSIOR('M', 120, int)
+
+#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
+#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
+#define SOUND_MIXER_WRITE_RECGAIN __OSSIOWR('M', 119, int)
+#define SOUND_MIXER_WRITE_MONGAIN __OSSIOWR('M', 120, int)
+
+/*
+ * These macros are here for source compatibility. They intentionally don't
+ * map to any real hardware. NOT SUPPORTED!
+ */
+#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
+#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
+#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
+#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
+#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)
+
+#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
+#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
+#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
+#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
+#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)
+
+/*
+ * Audio encoding types (Note! U8=8 and S16_LE=16 for compatibility)
+ */
+#define AFMT_QUERY 0x00000000 /* Return current fmt */
+#define AFMT_MU_LAW 0x00000001
+#define AFMT_A_LAW 0x00000002
+#define AFMT_IMA_ADPCM 0x00000004
+#define AFMT_U8 0x00000008
+#define AFMT_S16_LE 0x00000010
+#define AFMT_S16_BE 0x00000020
+#define AFMT_S8 0x00000040
+#define AFMT_U16_LE 0x00000080
+#define AFMT_U16_BE 0x00000100
+#define AFMT_MPEG 0x00000200 /* NOT SUPPORTED: MPEG (2) audio */
+#define AFMT_AC3 0x00000400 /* NOT SUPPORTED: AC3 compressed */
+#define AFMT_VORBIS 0x00000800 /* NOT SUPPORTED: Ogg Vorbis */
+#define AFMT_S32_LE 0x00001000
+#define AFMT_S32_BE 0x00002000
+#define AFMT_FLOAT 0x00004000 /* NOT SUPPORTED: IEEE double float */
+#define AFMT_S24_LE 0x00008000 /* LSB aligned in 32 bit word */
+#define AFMT_S24_BE 0x00010000 /* LSB aligned in 32 bit word */
+#define AFMT_SPDIF_RAW 0x00020000 /* NOT SUPPORTED: Raw S/PDIF frames */
+#define AFMT_S24_PACKED 0x00040000 /* 24 bit packed little endian */
+/*
+ * Some big endian/little endian handling macros (native endian and
+ * opposite endian formats).
+ */
+#if defined(_BIG_ENDIAN)
+#define AFMT_S16_NE AFMT_S16_BE
+#define AFMT_U16_NE AFMT_U16_BE
+#define AFMT_S32_NE AFMT_S32_BE
+#define AFMT_S24_NE AFMT_S24_BE
+#define AFMT_S16_OE AFMT_S16_LE
+#define AFMT_S32_OE AFMT_S32_LE
+#define AFMT_S24_OE AFMT_S24_LE
+#else
+#define AFMT_S16_NE AFMT_S16_LE
+#define AFMT_U16_NE AFMT_U16_LE
+#define AFMT_S32_NE AFMT_S32_LE
+#define AFMT_S24_NE AFMT_S24_LE
+#define AFMT_S16_OE AFMT_S16_BE
+#define AFMT_S32_OE AFMT_S32_BE
+#define AFMT_S24_OE AFMT_S24_BE
+#endif
+
+/*
+ * SNDCTL_DSP_GETCAPS bits
+ */
+#define PCM_CAP_REVISION 0x000000ff /* Revision level (0 to 255) */
+#define PCM_CAP_DUPLEX 0x00000100 /* Full duplex rec/play */
+#define PCM_CAP_REALTIME 0x00000200 /* NOT SUPPORTED */
+#define PCM_CAP_BATCH 0x00000400 /* NOT SUPPORTED */
+#define PCM_CAP_COPROC 0x00000800 /* NOT SUPPORTED */
+#define PCM_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */
+#define PCM_CAP_MMAP 0x00002000 /* Supports mmap() */
+#define PCM_CAP_MULTI 0x00004000 /* Supports multiple open */
+#define PCM_CAP_BIND 0x00008000 /* Supports channel binding */
+#define PCM_CAP_INPUT 0x00010000 /* Supports recording */
+#define PCM_CAP_OUTPUT 0x00020000 /* Supports playback */
+#define PCM_CAP_VIRTUAL 0x00040000 /* Virtual device */
+#define PCM_CAP_ANALOGOUT 0x00100000 /* NOT SUPPORTED */
+#define PCM_CAP_ANALOGIN 0x00200000 /* NOT SUPPORTED */
+#define PCM_CAP_DIGITALOUT 0x00400000 /* NOT SUPPORTED */
+#define PCM_CAP_DIGITALIN 0x00800000 /* NOT SUPPORTED */
+#define PCM_CAP_ADMASK 0x00f00000 /* NOT SUPPORTED */
+#define PCM_CAP_SHADOW 0x01000000 /* "Shadow" device */
+#define PCM_CAP_CH_MASK 0x06000000 /* See DSP_CH_MASK below */
+#define PCM_CAP_HIDDEN 0x08000000 /* NOT SUPPORTED */
+#define PCM_CAP_FREERATE 0x10000000
+#define PCM_CAP_MODEM 0x20000000 /* NOT SUPPORTED */
+#define PCM_CAP_DEFAULT 0x40000000 /* "Default" device */
+
+/*
+ * Preferred channel usage. These bits can be used to give
+ * recommendations to the application. Used by few drivers. For
+ * example if ((caps & DSP_CH_MASK) == DSP_CH_MONO) means that the
+ * device works best in mono mode. However it doesn't necessarily mean
+ * that the device cannot be used in stereo. These bits should only be
+ * used by special applications such as multi track hard disk
+ * recorders to find out the initial setup. However the user should be
+ * able to override this selection.
+ *
+ * To find out which modes are actually supported the application
+ * should try to select them using SNDCTL_DSP_CHANNELS.
+ */
+#define DSP_CH_MASK 0x06000000 /* Mask */
+#define DSP_CH_ANY 0x00000000 /* No preferred mode */
+#define DSP_CH_MONO 0x02000000
+#define DSP_CH_STEREO 0x04000000
+#define DSP_CH_MULTI 0x06000000 /* More than two channels */
+
+
+/*
+ * The PCM_CAP_* capability names used to be known as DSP_CAP_*, so
+ * it's necessary to define the older names too.
+ */
+#define DSP_CAP_ADMASK PCM_CAP_ADMASK
+#define DSP_CAP_ANALOGIN PCM_CAP_ANALOGIN
+#define DSP_CAP_ANALOGOUT PCM_CAP_ANALOGOUT
+#define DSP_CAP_BATCH PCM_CAP_BATCH
+#define DSP_CAP_BIND PCM_CAP_BIND
+#define DSP_CAP_COPROC PCM_CAP_COPROC
+#define DSP_CAP_DEFAULT PCM_CAP_DEFAULT
+#define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN
+#define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT
+#define DSP_CAP_DUPLEX PCM_CAP_DUPLEX
+#define DSP_CAP_FREERATE PCM_CAP_FREERATE
+#define DSP_CAP_HIDDEN PCM_CAP_HIDDEN
+#define DSP_CAP_INPUT PCM_CAP_INPUT
+#define DSP_CAP_MMAP PCM_CAP_MMAP
+#define DSP_CAP_MODEM PCM_CAP_MODEM
+#define DSP_CAP_MULTI PCM_CAP_MULTI
+#define DSP_CAP_OUTPUT PCM_CAP_OUTPUT
+#define DSP_CAP_REALTIME PCM_CAP_REALTIME
+#define DSP_CAP_REVISION PCM_CAP_REVISION
+#define DSP_CAP_SHADOW PCM_CAP_SHADOW
+#define DSP_CAP_TRIGGER PCM_CAP_TRIGGER
+#define DSP_CAP_VIRTUAL PCM_CAP_VIRTUAL
+
+/*
+ * SNDCTL_DSP_GETTRIGGER and SNDCTL_DSP_SETTRIGGER
+ */
+#define PCM_ENABLE_INPUT 0x00000001
+#define PCM_ENABLE_OUTPUT 0x00000002
+
+/*
+ * SNDCTL_DSP_BIND_CHANNEL
+ */
+#define DSP_BIND_QUERY 0x00000000
+#define DSP_BIND_FRONT 0x00000001
+#define DSP_BIND_SURR 0x00000002
+#define DSP_BIND_CENTER_LFE 0x00000004
+#define DSP_BIND_HANDSET 0x00000008
+#define DSP_BIND_MIC 0x00000010
+#define DSP_BIND_MODEM1 0x00000020
+#define DSP_BIND_MODEM2 0x00000040
+#define DSP_BIND_I2S 0x00000080
+#define DSP_BIND_SPDIF 0x00000100
+#define DSP_BIND_REAR 0x00000200
+
+/*
+ * SOUND_MIXER_READ_CAPS
+ */
+#define SOUND_CAP_EXCL_INPUT 0x00000001
+#define SOUND_CAP_NOLEGACY 0x00000004
+#define SOUND_CAP_NORECSRC 0x00000008
+
+/*
+ * The following ioctl is for internal use only -- it is used to
+ * coordinate /dev/sndstat numbering with file names in /dev/sound.
+ * Applications must not use it. (This is duplicated in sys/audioio.h
+ * as well.)
+ */
+#define SNDCTL_SUN_SEND_NUMBER __OSSIOW('X', 200, int)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_OSS_H */
diff --git a/usr/src/uts/common/sys/audio/audio_src.h b/usr/src/uts/common/sys/audio/audio_src.h
deleted file mode 100644
index 55ee5071dc..0000000000
--- a/usr/src/uts/common/sys/audio/audio_src.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the public interfaces for the audio mixer
- * sample rate conversion routines. Only the audio mixer and sample rate
- * conversion routines may include this header file.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_SRC_H
-#define _SYS_AUDIO_SRC_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-#define AM_SRC_VERSION AM_SRC_VERSION2
-#define AM_SRC_VERSION2 2
-
-/*
- * The handle used by the mixer and the sample rate conversion routine.
- */
-typedef struct src_handle *srchdl_t;
-
-/*
- * am_ad_src_entry_t - Audio Driver sample rate conversion routines
- */
-struct am_ad_src_entry {
- int ad_version;
- size_t (*ad_src_init)(srchdl_t handle, int dir);
- void (*ad_src_exit)(srchdl_t handle, int dir);
- int (*ad_src_update)(srchdl_t handle,
- audio_prinfo_t *ch_prinfo,
- audio_prinfo_t *hw_prinfo,
- void *src_info, int dir);
- int (*ad_src_adjust)(srchdl_t handle, int dir,
- int samples);
- int *(*ad_src_convert)(srchdl_t handle, int channels,
- int dir, int *src, int *ptr1, int *ptr2,
- int *samples);
- size_t (*ad_src_size)(srchdl_t handle, audio_prinfo_t *prinfo,
- int dir, int samples, int hw_channels);
-};
-typedef struct am_ad_src_entry am_ad_src_entry_t;
-
-/*
- * am_ad_sample_rates_t - supported sample rates
- */
-struct am_ad_sample_rates {
- int ad_limits; /* 0 if sample rates not limits */
- uint_t *ad_srs; /* NULL term. list of sample rates */
-};
-typedef struct am_ad_sample_rates am_ad_sample_rates_t;
-
-/* am_ad_ample_rates.ad_limits */
-#define MIXER_SRS_FLAG_SR_NOT_LIMITS 0x00000000u
- /* samp rates not limits */
-#define MIXER_SRS_FLAG_SR_LIMITS MIXER_SR_LIMITS
- /* samp rates set limits */
-
-/*
- * Audio Mixer Audio Driver Miscellaneous Routines
- */
-void *am_get_src_data(srchdl_t handle, int dir);
-void am_set_src_data(srchdl_t handle, int dir, void *data);
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_SRC_H */
diff --git a/usr/src/uts/common/sys/audio/audio_support.h b/usr/src/uts/common/sys/audio/audio_support.h
index 46e7ecdf78..d6e5504156 100644
--- a/usr/src/uts/common/sys/audio/audio_support.h
+++ b/usr/src/uts/common/sys/audio/audio_support.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,11 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
- * This header file defines the public interfaces for the audio support
- * module. These definitions are available for use by all audio modules
- * and drivers.
+ * This header file defines a legacy interface for audio drivers.
+ * It should not be used in any code.
*
* CAUTION: This header file has not gone through a formal review process.
* Thus its commitment level is very low and may change or be removed
@@ -35,8 +33,6 @@
#ifndef _SYS_AUDIO_SUPPORT_H
#define _SYS_AUDIO_SUPPORT_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -50,121 +46,23 @@ extern "C" {
#define AUDIO_FAILURE (-1)
/*
- * Miscellaneous defines.
- */
-#define AUDIO_PRECISION_SHIFT 3
-#define AUDIO_NO_CHANNEL (-1)
-#define AUDIO_TOGGLE(X) (X) ^= 1
-
-/*
* Opaque handle used by all audio drivers to reference the audio
* support module and all audio personality modules.
*/
typedef struct audio_handle *audiohdl_t;
/*
- * Opaque handle used by all audio personality modules to reference the
- * audio task queue.
- */
-typedef struct audio_taskq *audio_taskq_t;
-
-/*
- * audio_i_state - This structure is used to hold state information
- * between M_IOCTL and M_IOCDATA messages from the
- * STREAMS head.
- */
-struct audio_i_state {
- long ais_command; /* the M_IOCDATA command to execute next */
- caddr_t ais_address; /* address to M_COPYOUT/M_COPYIN data from/to */
- caddr_t ais_address2; /* address to M_COPYOUT/M_COPYIN data from/to */
-};
-typedef struct audio_i_state audio_i_state_t;
-
-/*
- * audio_sup_reg_data - This structure is used to provide registration
- * data from the audio driver to the audiosup module.
- */
-struct audio_sup_reg_data {
- int asrd_version; /* version of this data structure */
- char *asrd_key; /* unique string used to ID drvr inst */
-};
-typedef struct audio_sup_reg_data audio_sup_reg_data_t;
-
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_sup_reg_data::asrd_key))
-
-#define AUDIOSUP_VERSION AUDIOSUP_VERSION1
-#define AUDIOSUP_VERSION1 1
-
-/*
* Audio Support Module Entry Point Routines
*/
-audiohdl_t audio_sup_register(dev_info_t *dip, audio_sup_reg_data_t *data);
+audiohdl_t audio_sup_register(dev_info_t *dip);
int audio_sup_unregister(audiohdl_t handle);
-int audio_sup_open(queue_t *q, dev_t *devp, int flag, int sflags,
- cred_t *credp);
-int audio_sup_close(queue_t *q, int flag, cred_t *credp);
-int audio_sup_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result);
-int audio_sup_restore_state(audiohdl_t handle, audio_device_type_e device,
- int dir);
-int audio_sup_save_state(audiohdl_t handle, audio_device_type_e device,
- int dir);
-
-#define AUDIO_ALL_DEVICES UNDEFINED
-
-int audio_sup_rput(queue_t *q, mblk_t *mp);
-int audio_sup_rsvc(queue_t *q);
-int audio_sup_wput(queue_t *q, mblk_t *mp);
-int audio_sup_wsvc(queue_t *q);
-
-/*
- * Audio Support Module Entry Point Routines
- * CAUTION: These routines will be removed from the next
- * release of Solaris. Migrate to audio_sup_register()
- * and audio_sup_unregister().
- */
-audiohdl_t audio_sup_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
-int audio_sup_detach(audiohdl_t handle, ddi_detach_cmd_t cmd);
-
-/*
- * Audio Support Module STREAMS Private Data Routines
- */
-void audio_sup_set_qptr(queue_t *q, dev_t dev, void *data);
-void audio_sup_free_qptr(queue_t *q);
-dev_t audio_sup_get_qptr_dev(queue_t *q);
-void *audio_sup_get_qptr_data(queue_t *q);
-int audio_sup_get_qptr_instance(queue_t *q);
-
-/*
- * Audio Support Module Minor Routines
- */
-int audio_sup_get_max_chs(audiohdl_t handle);
-int audio_sup_get_minors_per_inst(audiohdl_t handle);
-int audio_sup_construct_minor(audiohdl_t handle, audio_device_type_e type);
-int audio_sup_devt_to_instance(dev_t devt);
+void audio_sup_restore_state(audiohdl_t handle);
/*
* Audio Support Module Miscellaneous Routines
*/
-dev_info_t *audio_sup_get_dip(audiohdl_t handle);
void *audio_sup_get_private(audiohdl_t handle);
void audio_sup_set_private(audiohdl_t handle, void *private);
-/*PRINTFLIKE3*/
-extern void audio_sup_log(audiohdl_t handle, uint_t level, char *fmt, ...)
- __KPRINTFLIKE(3);
-int audio_sup_update_persist_key(dev_info_t *dip, char *new_key, int sleep);
-
-
-#ifdef _SYSCALL32
-/* ILP32 view of the audio_channel structure */
-struct audio_channel32 {
- pid32_t pid; /* process ID */
- uint32_t ch_number; /* channel number */
- int32_t dev_type; /* device type */
- size32_t info_size; /* size of info structure */
- caddr32_t info; /* pointer to info structure */
-};
-#endif
#endif /* _KERNEL */
diff --git a/usr/src/uts/common/sys/audio/audio_trace.h b/usr/src/uts/common/sys/audio/audio_trace.h
deleted file mode 100644
index 61eeb45ed0..0000000000
--- a/usr/src/uts/common/sys/audio/audio_trace.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * This header file defines the public interfaces for audio tracing.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_TRACE_H
-#define _SYS_AUDIO_TRACE_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-/*
- * Trace declarations and defines.
- */
-
-struct audio_trace_buf {
- uint_t atb_seq; /* trace sequence number */
- char *atb_comment; /* trace comment string */
- uintptr_t atb_data; /* data to go with string */
-};
-typedef struct audio_trace_buf audio_trace_buf_t;
-
-#define AUDIO_TRACE_BUFFER_SIZE 1024
-
-#ifdef DEBUG
-
-#ifndef __lock_lint
-extern audio_trace_buf_t audio_trace_buffer[AUDIO_TRACE_BUFFER_SIZE];
-extern kmutex_t audio_tb_lock; /* global trace buffer lock */
-extern size_t audio_tb_siz;
-extern int audio_tb_pos;
-extern uint_t audio_tb_seq;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_tb_pos))
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_tb_seq))
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_trace_buffer))
-
-#define ATRACE(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = (uintptr_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_64(M, D) ATRACE(M, D)
-
-#define ATRACE_32(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint32_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_16(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint16_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_8(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint8_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-#else
-
-#define ATRACE(M, D)
-#define ATRACE_32(M, D)
-#define ATRACE_16(M, D)
-#define ATRACE_8(M, D)
-
-#endif
-
-#else /* DEBUG */
-
-#define ATRACE(M, D)
-#define ATRACE_32(M, D)
-#define ATRACE_16(M, D)
-#define ATRACE_8(M, D)
-
-#endif /* DEBUG */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_TRACE_H */
diff --git a/usr/src/uts/common/sys/audio/audiohd.h b/usr/src/uts/common/sys/audio/audiohd.h
deleted file mode 100755
index 81f660c614..0000000000
--- a/usr/src/uts/common/sys/audio/audiohd.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOHD_H_
-#define _SYS_AUDIOHD_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/types.h>
-#include <sys/thread.h>
-#include <sys/synch.h>
-#include <sys/kstat.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-
-
-#define AUDIOHD_SAMPR5510 5510
-#define AUDIOHD_SAMPR6620 6620
-#define AUDIOHD_SAMPR8000 8000
-#define AUDIOHD_SAMPR9600 9600
-#define AUDIOHD_SAMPR11025 11025
-#define AUDIOHD_SAMPR16000 16000
-#define AUDIOHD_SAMPR18900 18900
-#define AUDIOHD_SAMPR22050 22050
-#define AUDIOHD_SAMPR27420 27420
-#define AUDIOHD_SAMPR32000 32000
-#define AUDIOHD_SAMPR33075 33075
-#define AUDIOHD_SAMPR37800 37800
-#define AUDIOHD_SAMPR44100 44100
-#define AUDIOHD_SAMPR48000 48000
-
-#define AUDIOHD_SAMPLER_MAX AUDIOHD_SAMPR48000
-#define AUDIOHD_MIN_INTS 32
-#define AUDIOHD_MAX_INTS 1500
-#define AUDIOHD_INTS 50
-#define AUDIOHD_MAX_PRECISION AUDIO_PRECISION_16
-#define AUDIOHD_MAX_CHANNELS AUDIO_CHANNELS_STEREO
-#define AUDIOHD_MAX_OUT_CHANNELS 32
-#define AUDIOHD_MAX_IN_CHANNELS AUDIOHD_MAX_OUT_CHANNELS
-
-#define AUDIOHD_BSIZE 8192
-#define AUDIOHD_DEFAULT_SR 8000
-#define AUDIOHD_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define AUDIOHD_DEFAULT_PREC AUDIO_PRECISION_8
-#define AUDIOHD_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define AUDIOHD_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define AUDIOHD_DEFAULT_RGAIN 127
-#define AUDIOHD_DEFAULT_BAL AUDIO_MID_BALANCE
-#define AUDIOHD_DEFAULT_MONITOR_GAIN 0
-
-#define AUDIOHD_DEV_NAME "SUNW,audiohd"
-#define AUDIOHD_DEV_CONFIG "onboard1"
-#define AUDIOHD_DEV_VERSION "a"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOHD_H_ */
diff --git a/usr/src/uts/common/sys/audio/audioixp.h b/usr/src/uts/common/sys/audio/audioixp.h
deleted file mode 100644
index 3d0d6ed17a..0000000000
--- a/usr/src/uts/common/sys/audio/audioixp.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOIXP_H_
-#define _SYS_AUDIOIXP_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audioixp device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define IXP_DEV_NAME "SUNW,audioixp"
-#define IXP_DEV_CONFIG "onboard1"
-#define IXP_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define IXP_NAME "audioixp"
-#define IXP_MOD_NAME "mixer audio driver"
-
-#define IXP_SAMPR8000 (8000)
-#define IXP_SAMPR11025 (11025)
-#define IXP_SAMPR16000 (16000)
-#define IXP_SAMPR22050 (22050)
-#define IXP_SAMPR24000 (24000)
-#define IXP_SAMPR32000 (32000)
-#define IXP_SAMPR44100 (44100)
-#define IXP_SAMPR48000 (48000)
-
-#define IXP_DEFAULT_SR IXP_SAMPR8000
-#define IXP_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define IXP_DEFAULT_PREC AUDIO_PRECISION_8
-#define IXP_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define IXP_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define IXP_DEFAULT_RGAIN (127)
-#define IXP_DEFAULT_MONITOR_GAIN (0)
-#define IXP_DEFAULT_BAL AUDIO_MID_BALANCE
-#define IXP_INTS (175) /* default interrupt rate */
-#define IXP_MIN_INTS (24) /* minimum interrupt rate */
-#define IXP_MAX_INTS (500) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOIXP_H_ */
diff --git a/usr/src/uts/common/sys/audio/audiots.h b/usr/src/uts/common/sys/audio/audiots.h
deleted file mode 100644
index 686ba89062..0000000000
--- a/usr/src/uts/common/sys/audio/audiots.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIOTS_H
-#define _SYS_AUDIOTS_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audiots device driver.
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define TS_DEV_NAME "SUNW,audiots"
-#define TS_DEV_CONFIG "onboard1"
-#define TS_DEV_VERSION_A "a" /* grover, sngl strming play */
-#define TS_DEV_VERSION_B "b" /* birdsnest, sngl strm play */
-
-/*
- * Driver supported configuration information
- */
-#define TS_NAME "audiots"
-#define TS_MOD_NAME "mixer audio driver"
-
-#define TS_SAMPR4000 (4000)
-#define TS_SAMPR5510 (5510)
-#define TS_SAMPR6620 (6620)
-#define TS_SAMPR8000 (8000)
-#define TS_SAMPR9600 (9600)
-#define TS_SAMPR11025 (11025)
-#define TS_SAMPR16000 (16000)
-#define TS_SAMPR18900 (18900)
-#define TS_SAMPR22050 (22050)
-#define TS_SAMPR27420 (27420)
-#define TS_SAMPR32000 (32000)
-#define TS_SAMPR33075 (33075)
-#define TS_SAMPR37800 (37800)
-#define TS_SAMPR44100 (44100)
-#define TS_SAMPR48000 (48000)
-
-#define TS_DEFAULT_SR TS_SAMPR8000
-#define TS_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define TS_DEFAULT_PREC AUDIO_PRECISION_8
-#define TS_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define TS_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define TS_DEFAULT_RGAIN (127)
-#define TS_DEFAULT_MONITOR_GAIN (0)
-#define TS_DEFAULT_BAL AUDIO_MID_BALANCE /* MUST be mid */
-#define TS_INTS (175) /* default interrupt rate */
-#define TS_MIN_INTS (24) /* minimum interrupt rate */
-#define TS_MAX_INTS (2000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOTS_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src1_impl.h b/usr/src/uts/common/sys/audio/impl/am_src1_impl.h
deleted file mode 100644
index ca5e04cbf1..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src1_impl.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * This header file defines the internal interfaces for the default audio
- * mixer sample rate converted. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AM_SRC1_IMPL_H
-#define _SYS_AM_SRC1_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/note.h>
-#include <sys/types.h>
-#include <sys/audio/am_src1.h>
-
-/*
- * am_src1_data_t - sample rate conversion algorithm #1 data
- */
-#define AM_SRC1_MUPSIZE1 4 /* max up/down conversions */
-struct am_src1_data {
- kmutex_t src1_lock; /* protects this structure */
- uint_t src1_inFs; /* input sample rate */
- uint_t src1_outFs; /* device sample rate */
- int src1_k; /* filter parameter */
- int src1_up[AM_SRC1_MUPSIZE1]; /* up sample steps */
- int src1_down[AM_SRC1_MUPSIZE1]; /* down sample steps */
- int src1_ustart1[AM_SRC1_MUPSIZE1];
- /* up smpl saved samps, L */
- int src1_ustart2[AM_SRC1_MUPSIZE1];
- /* up smpl saved samps, R */
- int src1_dstart[AM_SRC1_MUPSIZE1];
- /* dwn sample saved samples */
- int src1_out1[AM_SRC1_MUPSIZE1];
- /* down sample saved samples */
- int src1_out2[AM_SRC1_MUPSIZE1];
- /* down sample saved samples */
- int (*src1_up0)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up1)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up2)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up3)(struct am_src1_data *, int, int,
- int *, int *, int);
- int src1_up_factor; /* total up conversions */
- int src1_down_factor; /* total down conversions */
- int src1_count; /* number of up conversions */
-};
-typedef struct am_src1_data am_src1_data_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(am_src1_data::src1_lock, am_src1_data))
-
-/* fudge factor to make sure we've got enough memory */
-#define AM_SRC1_BUFFER (8 * sizeof (int))
-
-/* misc. defines */
-#define AM_SRC1_SHIFT1 1
-#define AM_SRC1_SHIFT2 2
-#define AM_SRC1_SHIFT3 3
-#define AM_SRC1_SHIFT8 8
-#define AM_INT32_SHIFT 2
-#define SRC_MAX(a, b) ((a) > (b) ? (a) : (b))
-#define SRC_MAX4(w, x, y, z) SRC_MAX(SRC_MAX(w, x), SRC_MAX(y, z))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC1_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src2_impl.h b/usr/src/uts/common/sys/audio/impl/am_src2_impl.h
deleted file mode 100644
index 5b2ce698ba..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src2_impl.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the alternative audio
- * mixer sample rate converter. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AM_SRC2_IMPL_H
-#define _SYS_AM_SRC2_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/note.h>
-#include <sys/types.h>
-#include <sys/audio/am_src2.h>
-
-/* misc. defines */
-#define AM_SRC2_NZCS (10) /* number of zero crossings */
-#define AM_SRC2_CPZC (256) /* coeffs per zero crossing */
-#define AM_SRC2_CPZC_SHIFT (8) /* 1 << CPZC_SHIFT = CPZC */
-#define AM_SRC2_CPZC_MASK (0xFF) /* for modulo arithmetic */
-#define AM_SRC2_STEREO_MASK (0x1) /* for modulo arithmetic */
-#define AM_SRC2_COFF_SHIFT (16) /* for scaling output */
-#define AM_SRC2_COFFS ((2 * AM_SRC2_NZCS) + 1) /* coefficients */
-#define AM_SRC2_SHIFT1 (1)
-#define AM_SRC2_SHIFT2 (2)
-
-/* We define the location of the first, middle and last coefficients */
-#define AM_SRC2_START (AM_SRC2_NZCS)
-#define AM_SRC2_MIDDLE ((AM_SRC2_NZCS * AM_SRC2_CPZC) + AM_SRC2_CPZC)
-#define AM_SRC2_END ((2 * AM_SRC2_NZCS * AM_SRC2_CPZC) + \
- AM_SRC2_CPZC)
-
-/*
- * We define the maximum amount of prebuffer room required.
- * If playing, it is assumed we are increasing the sample rate
- * in which case the amount of room required is given by
- * 2 * max_channels * nzcs.
- */
-#define AM_SRC2_PBUFFER (2 * 2 * AM_SRC2_NZCS)
-
-/*
- * When down sampling the amount of prebuffer room required
- * depends on the conversion factor. Here we assume that this
- * factor will never be greater than 12 (i.e. 48kHz -> 4kHz)
- * and we allocate enough memory to cope with that. A little
- * wasteful but worth it for the simplicity achieved. Here
- * the room required is 2 * max_channels * max_factor * nzcs.
- */
-#define AM_SRC2_RBUFFER (2 * 2 * 12 * AM_SRC2_NZCS)
-
-/*
- * am_src2_data_t - sample rate conversion algorithm #2 data
- */
-struct am_src2_data {
- kmutex_t src2_lock; /* protects this structure */
- int src2_inFs; /* input sample rate */
- int src2_outFs; /* device sample rate */
- int (*src2_resample)(struct am_src2_data *, int *, int *,
- int); /* resampling function */
- int src2_pbsize; /* room in front of samples */
- int src2_delta_c; /* distance to nearest input sample */
- int src2_delta_n; /* normalised delta_c */
- int src2_i_index; /* start point in input */
- int src2_csteps; /* step size through input */
- int src2_cmod; /* fraction of csteps left over */
- int src2_cover; /* fraction of csteps counter */
- int src2_tsteps; /* step size through filter */
- int *src2_table; /* filter coefficients */
- int **src2_tables; /* individual tables */
-};
-
-typedef struct am_src2_data am_src2_data_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(am_src2_data::src2_lock, am_src2_data))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src2_table.h b/usr/src/uts/common/sys/audio/impl/am_src2_table.h
deleted file mode 100644
index 294d756df3..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src2_table.h
+++ /dev/null
@@ -1,1493 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file contains sample rate conversion tables for amsrc2.
- */
-
-#ifndef _SYS_AM_SRC2_TABLE_H
-#define _SYS_AM_SRC2_TABLE_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The table used in down sampling */
-int32_t _amsrc2table[5377] = {
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, -1, -1, -2, -2, -3, -3, -4,
--4, -5, -6, -6, -7, -7, -8, -9,
--9, -10, -10, -11, -12, -12, -13, -14,
--14, -15, -16, -16, -17, -18, -19, -19,
--20, -21, -21, -22, -23, -24, -24, -25,
--26, -26, -27, -28, -29, -29, -30, -31,
--32, -33, -33, -34, -35, -36, -36, -37,
--38, -39, -40, -40, -41, -42, -43, -43,
--44, -45, -46, -47, -47, -48, -49, -50,
--51, -51, -52, -53, -54, -54, -55, -56,
--57, -58, -58, -59, -60, -61, -61, -62,
--63, -64, -64, -65, -66, -67, -67, -68,
--69, -69, -70, -71, -71, -72, -73, -73,
--74, -75, -75, -76, -77, -77, -78, -78,
--79, -80, -80, -81, -81, -82, -82, -83,
--83, -84, -84, -85, -85, -86, -86, -87,
--87, -88, -88, -88, -89, -89, -89, -90,
--90, -90, -91, -91, -91, -91, -92, -92,
--92, -92, -93, -93, -93, -93, -93, -93,
--93, -93, -93, -93, -94, -94, -94, -93,
--93, -93, -93, -93, -93, -93, -93, -93,
--92, -92, -92, -92, -92, -91, -91, -91,
--90, -90, -90, -89, -89, -88, -88, -87,
--87, -86, -86, -85, -85, -84, -84, -83,
--82, -82, -81, -80, -80, -79, -78, -77,
--76, -76, -75, -74, -73, -72, -71, -70,
--69, -68, -67, -66, -65, -64, -63, -62,
--61, -60, -58, -57, -56, -55, -54, -52,
--51, -50, -48, -47, -46, -44, -43, -41,
--40, -38, -37, -35, -34, -32, -31, -29,
--28, -26, -24, -23, -21, -19, -18, -16,
--14, -13, -11, -9, -7, -6, -4, -2,
-0, 2, 4, 6, 8, 9, 11, 13,
-15, 17, 19, 21, 23, 25, 27, 29,
-31, 33, 36, 38, 40, 42, 44, 46,
-48, 50, 52, 55, 57, 59, 61, 63,
-65, 68, 70, 72, 74, 76, 79, 81,
-83, 85, 87, 90, 92, 94, 96, 99,
-101, 103, 105, 107, 110, 112, 114, 116,
-119, 121, 123, 125, 127, 129, 132, 134,
-136, 138, 140, 142, 145, 147, 149, 151,
-153, 155, 157, 159, 161, 163, 165, 167,
-169, 171, 173, 175, 177, 179, 181, 183,
-185, 187, 188, 190, 192, 194, 195, 197,
-199, 201, 202, 204, 206, 207, 209, 210,
-212, 213, 215, 216, 218, 219, 220, 222,
-223, 224, 226, 227, 228, 229, 230, 231,
-233, 234, 235, 236, 237, 237, 238, 239,
-240, 241, 242, 242, 243, 244, 244, 245,
-245, 246, 246, 247, 247, 247, 248, 248,
-248, 248, 249, 249, 249, 249, 249, 249,
-249, 248, 248, 248, 248, 248, 247, 247,
-246, 246, 245, 245, 244, 244, 243, 242,
-241, 240, 240, 239, 238, 237, 236, 234,
-233, 232, 231, 230, 228, 227, 225, 224,
-222, 221, 219, 218, 216, 214, 212, 211,
-209, 207, 205, 203, 201, 199, 196, 194,
-192, 190, 187, 185, 182, 180, 177, 175,
-172, 170, 167, 164, 161, 159, 156, 153,
-150, 147, 144, 141, 138, 134, 131, 128,
-125, 121, 118, 115, 111, 108, 104, 100,
-97, 93, 90, 86, 82, 78, 74, 71,
-67, 63, 59, 55, 51, 47, 43, 38,
-34, 30, 26, 22, 17, 13, 9, 4,
-0, -4, -9, -13, -18, -22, -27, -31,
--36, -41, -45, -50, -54, -59, -64, -69,
--73, -78, -83, -88, -92, -97, -102, -107,
--112, -116, -121, -126, -131, -136, -141, -146,
--151, -155, -160, -165, -170, -175, -180, -185,
--190, -195, -199, -204, -209, -214, -219, -224,
--229, -234, -238, -243, -248, -253, -258, -262,
--267, -272, -277, -281, -286, -291, -295, -300,
--305, -309, -314, -318, -323, -327, -332, -336,
--340, -345, -349, -353, -358, -362, -366, -370,
--374, -378, -382, -386, -390, -394, -398, -402,
--406, -410, -413, -417, -421, -424, -428, -431,
--435, -438, -441, -445, -448, -451, -454, -457,
--460, -463, -466, -469, -471, -474, -477, -479,
--482, -484, -487, -489, -491, -493, -495, -497,
--499, -501, -503, -505, -507, -508, -510, -511,
--513, -514, -515, -516, -518, -519, -519, -520,
--521, -522, -522, -523, -523, -524, -524, -524,
--525, -525, -525, -524, -524, -524, -524, -523,
--523, -522, -521, -520, -520, -519, -518, -516,
--515, -514, -512, -511, -509, -508, -506, -504,
--502, -500, -498, -496, -493, -491, -488, -486,
--483, -480, -478, -475, -472, -468, -465, -462,
--458, -455, -451, -448, -444, -440, -436, -432,
--428, -424, -419, -415, -411, -406, -401, -397,
--392, -387, -382, -377, -372, -366, -361, -356,
--350, -344, -339, -333, -327, -321, -315, -309,
--303, -297, -290, -284, -278, -271, -264, -258,
--251, -244, -237, -230, -223, -216, -209, -201,
--194, -187, -179, -172, -164, -156, -149, -141,
--133, -125, -117, -109, -101, -93, -85, -76,
--68, -60, -51, -43, -34, -26, -17, -9,
-0, 9, 17, 26, 35, 44, 53, 62,
-71, 80, 89, 98, 107, 116, 125, 135,
-144, 153, 162, 172, 181, 190, 199, 209,
-218, 228, 237, 246, 256, 265, 274, 284,
-293, 303, 312, 321, 331, 340, 349, 359,
-368, 377, 387, 396, 405, 414, 424, 433,
-442, 451, 460, 469, 479, 488, 497, 506,
-514, 523, 532, 541, 550, 558, 567, 576,
-584, 593, 601, 610, 618, 626, 634, 643,
-651, 659, 667, 675, 682, 690, 698, 706,
-713, 721, 728, 735, 742, 750, 757, 764,
-770, 777, 784, 791, 797, 803, 810, 816,
-822, 828, 834, 840, 846, 851, 857, 862,
-867, 872, 877, 882, 887, 892, 896, 901,
-905, 909, 914, 917, 921, 925, 929, 932,
-935, 939, 942, 944, 947, 950, 952, 955,
-957, 959, 961, 963, 964, 966, 967, 969,
-970, 971, 971, 972, 972, 973, 973, 973,
-973, 973, 972, 972, 971, 970, 969, 968,
-966, 965, 963, 961, 959, 957, 955, 952,
-950, 947, 944, 941, 937, 934, 930, 927,
-923, 919, 914, 910, 905, 900, 896, 890,
-885, 880, 874, 869, 863, 857, 850, 844,
-838, 831, 824, 817, 810, 803, 795, 787,
-780, 772, 764, 755, 747, 738, 730, 721,
-712, 702, 693, 684, 674, 664, 654, 644,
-634, 624, 613, 603, 592, 581, 570, 559,
-547, 536, 524, 513, 501, 489, 477, 464,
-452, 440, 427, 414, 401, 388, 375, 362,
-349, 335, 322, 308, 294, 281, 267, 253,
-238, 224, 210, 195, 181, 166, 152, 137,
-122, 107, 92, 77, 62, 46, 31, 15,
-0, -16, -31, -47, -63, -78, -94, -110,
--126, -142, -158, -174, -190, -206, -223, -239,
--255, -271, -288, -304, -320, -337, -353, -370,
--386, -402, -419, -435, -452, -468, -485, -501,
--517, -534, -550, -567, -583, -599, -616, -632,
--648, -664, -680, -697, -713, -729, -745, -761,
--777, -792, -808, -824, -840, -855, -871, -886,
--901, -917, -932, -947, -962, -977, -992, -1007,
--1022, -1036, -1051, -1065, -1079, -1093, -1107, -1121,
--1135, -1149, -1162, -1176, -1189, -1202, -1215, -1228,
--1241, -1254, -1266, -1279, -1291, -1303, -1315, -1327,
--1338, -1350, -1361, -1372, -1383, -1394, -1404, -1415,
--1425, -1435, -1445, -1454, -1464, -1473, -1482, -1491,
--1500, -1508, -1517, -1525, -1533, -1540, -1548, -1555,
--1562, -1569, -1576, -1582, -1588, -1594, -1600, -1605,
--1611, -1616, -1621, -1625, -1630, -1634, -1638, -1641,
--1645, -1648, -1651, -1653, -1656, -1658, -1660, -1662,
--1663, -1664, -1665, -1666, -1666, -1666, -1666, -1666,
--1665, -1665, -1663, -1662, -1660, -1658, -1656, -1654,
--1651, -1648, -1645, -1641, -1637, -1633, -1629, -1624,
--1619, -1614, -1609, -1603, -1597, -1591, -1584, -1577,
--1570, -1563, -1555, -1547, -1539, -1531, -1522, -1513,
--1504, -1494, -1485, -1475, -1464, -1454, -1443, -1432,
--1420, -1409, -1397, -1384, -1372, -1359, -1346, -1333,
--1320, -1306, -1292, -1278, -1263, -1248, -1233, -1218,
--1203, -1187, -1171, -1154, -1138, -1121, -1104, -1087,
--1070, -1052, -1034, -1016, -997, -979, -960, -941,
--922, -902, -883, -863, -842, -822, -802, -781,
--760, -739, -717, -696, -674, -652, -630, -608,
--585, -563, -540, -517, -494, -470, -447, -423,
--400, -376, -351, -327, -303, -278, -254, -229,
--204, -179, -154, -128, -103, -77, -52, -26,
-0, 26, 52, 78, 104, 131, 157, 184,
-210, 237, 263, 290, 317, 344, 371, 398,
-425, 452, 479, 506, 533, 560, 587, 615,
-642, 669, 696, 723, 751, 778, 805, 832,
-859, 886, 913, 940, 967, 994, 1021, 1048,
-1075, 1101, 1128, 1154, 1181, 1207, 1234, 1260,
-1286, 1312, 1338, 1364, 1389, 1415, 1440, 1466,
-1491, 1516, 1541, 1565, 1590, 1615, 1639, 1663,
-1687, 1711, 1734, 1758, 1781, 1804, 1827, 1850,
-1872, 1895, 1917, 1938, 1960, 1982, 2003, 2024,
-2044, 2065, 2085, 2105, 2125, 2144, 2164, 2183,
-2201, 2220, 2238, 2256, 2273, 2291, 2308, 2325,
-2341, 2357, 2373, 2388, 2404, 2419, 2433, 2447,
-2461, 2475, 2488, 2501, 2514, 2526, 2538, 2550,
-2561, 2572, 2582, 2592, 2602, 2611, 2621, 2629,
-2637, 2645, 2653, 2660, 2667, 2673, 2679, 2685,
-2690, 2695, 2699, 2703, 2707, 2710, 2713, 2715,
-2717, 2719, 2720, 2721, 2721, 2721, 2720, 2719,
-2718, 2716, 2714, 2711, 2708, 2705, 2701, 2697,
-2692, 2686, 2681, 2675, 2668, 2661, 2654, 2646,
-2638, 2629, 2620, 2610, 2600, 2589, 2579, 2567,
-2555, 2543, 2530, 2517, 2504, 2490, 2475, 2460,
-2445, 2429, 2413, 2397, 2379, 2362, 2344, 2326,
-2307, 2288, 2268, 2248, 2228, 2207, 2186, 2164,
-2142, 2119, 2096, 2073, 2049, 2025, 2000, 1975,
-1950, 1924, 1898, 1872, 1845, 1817, 1790, 1761,
-1733, 1704, 1675, 1645, 1616, 1585, 1555, 1524,
-1492, 1461, 1429, 1396, 1363, 1330, 1297, 1263,
-1229, 1195, 1160, 1125, 1090, 1055, 1019, 983,
-946, 910, 873, 835, 798, 760, 722, 684,
-645, 607, 568, 528, 489, 449, 409, 369,
-329, 289, 248, 207, 166, 125, 83, 42,
-0, -42, -84, -126, -168, -211, -253, -296,
--339, -382, -425, -468, -511, -554, -598, -641,
--685, -728, -772, -815, -859, -903, -946, -990,
--1034, -1078, -1121, -1165, -1209, -1252, -1296, -1340,
--1383, -1427, -1470, -1514, -1557, -1600, -1643, -1686,
--1729, -1772, -1815, -1857, -1900, -1942, -1984, -2026,
--2068, -2110, -2152, -2193, -2234, -2275, -2316, -2357,
--2397, -2437, -2477, -2517, -2556, -2595, -2634, -2673,
--2712, -2750, -2788, -2825, -2862, -2899, -2936, -2972,
--3008, -3044, -3079, -3114, -3149, -3183, -3217, -3251,
--3284, -3317, -3349, -3381, -3413, -3444, -3475, -3505,
--3535, -3565, -3594, -3623, -3651, -3679, -3706, -3733,
--3759, -3785, -3810, -3835, -3859, -3883, -3906, -3929,
--3951, -3973, -3995, -4015, -4035, -4055, -4074, -4093,
--4110, -4128, -4145, -4161, -4177, -4192, -4206, -4220,
--4233, -4246, -4258, -4269, -4280, -4290, -4300, -4309,
--4317, -4325, -4332, -4339, -4344, -4349, -4354, -4358,
--4361, -4363, -4365, -4367, -4367, -4367, -4366, -4365,
--4362, -4360, -4356, -4352, -4347, -4341, -4335, -4328,
--4320, -4312, -4303, -4293, -4283, -4271, -4260, -4247,
--4234, -4220, -4205, -4190, -4174, -4157, -4139, -4121,
--4102, -4083, -4063, -4042, -4020, -3997, -3974, -3951,
--3926, -3901, -3875, -3848, -3821, -3793, -3765, -3735,
--3705, -3675, -3643, -3611, -3578, -3545, -3511, -3476,
--3441, -3405, -3368, -3330, -3292, -3254, -3214, -3174,
--3134, -3092, -3051, -3008, -2965, -2921, -2877, -2832,
--2786, -2740, -2693, -2646, -2598, -2549, -2500, -2450,
--2400, -2349, -2298, -2246, -2193, -2140, -2087, -2033,
--1978, -1923, -1867, -1811, -1755, -1698, -1640, -1582,
--1524, -1465, -1405, -1345, -1285, -1224, -1163, -1102,
--1040, -977, -915, -851, -788, -724, -660, -595,
--530, -465, -400, -334, -268, -201, -134, -67,
-0, 68, 135, 203, 272, 340, 409, 478,
-547, 616, 686, 755, 825, 895, 965, 1035,
-1106, 1176, 1247, 1317, 1388, 1459, 1530, 1600,
-1671, 1742, 1813, 1884, 1955, 2026, 2097, 2167,
-2238, 2309, 2379, 2450, 2520, 2591, 2661, 2731,
-2801, 2870, 2940, 3009, 3079, 3148, 3216, 3285,
-3353, 3421, 3489, 3557, 3624, 3691, 3758, 3824,
-3890, 3956, 4021, 4086, 4151, 4215, 4279, 4343,
-4406, 4468, 4531, 4592, 4654, 4714, 4775, 4835,
-4894, 4953, 5011, 5069, 5126, 5183, 5239, 5294,
-5349, 5404, 5457, 5511, 5563, 5615, 5666, 5717,
-5766, 5815, 5864, 5912, 5959, 6005, 6051, 6095,
-6139, 6183, 6225, 6267, 6308, 6348, 6387, 6426,
-6464, 6501, 6537, 6572, 6606, 6639, 6672, 6703,
-6734, 6764, 6793, 6821, 6848, 6874, 6899, 6923,
-6947, 6969, 6990, 7010, 7030, 7048, 7065, 7082,
-7097, 7111, 7124, 7136, 7148, 7158, 7167, 7175,
-7181, 7187, 7192, 7196, 7198, 7200, 7200, 7199,
-7197, 7194, 7190, 7185, 7179, 7171, 7162, 7153,
-7142, 7130, 7117, 7102, 7087, 7070, 7052, 7033,
-7013, 6992, 6969, 6946, 6921, 6895, 6868, 6840,
-6810, 6779, 6748, 6715, 6680, 6645, 6609, 6571,
-6532, 6492, 6451, 6408, 6365, 6320, 6274, 6227,
-6179, 6130, 6079, 6028, 5975, 5921, 5866, 5809,
-5752, 5693, 5634, 5573, 5511, 5448, 5384, 5318,
-5252, 5185, 5116, 5046, 4976, 4904, 4831, 4757,
-4682, 4606, 4529, 4451, 4371, 4291, 4210, 4128,
-4044, 3960, 3875, 3789, 3701, 3613, 3524, 3434,
-3343, 3251, 3158, 3064, 2970, 2874, 2778, 2681,
-2582, 2483, 2384, 2283, 2182, 2079, 1976, 1872,
-1768, 1662, 1556, 1449, 1342, 1234, 1125, 1015,
-905, 794, 682, 570, 457, 344, 230, 115,
-0, -116, -232, -349, -466, -584, -702, -821,
--940, -1059, -1179, -1299, -1420, -1541, -1663, -1784,
--1907, -2029, -2152, -2274, -2398, -2521, -2645, -2769,
--2893, -3017, -3141, -3265, -3390, -3515, -3639, -3764,
--3889, -4014, -4139, -4263, -4388, -4513, -4638, -4762,
--4887, -5011, -5135, -5259, -5383, -5507, -5630, -5753,
--5876, -5999, -6121, -6243, -6365, -6486, -6607, -6728,
--6848, -6968, -7087, -7206, -7324, -7442, -7559, -7676,
--7792, -7907, -8022, -8136, -8250, -8363, -8475, -8587,
--8697, -8808, -8917, -9025, -9133, -9240, -9346, -9451,
--9555, -9658, -9761, -9862, -9963, -10062, -10161, -10258,
--10354, -10450, -10544, -10637, -10729, -10820, -10909, -10998,
--11085, -11171, -11256, -11340, -11422, -11503, -11583, -11661,
--11738, -11813, -11888, -11960, -12032, -12102, -12170, -12237,
--12302, -12366, -12429, -12490, -12549, -12607, -12663, -12717,
--12770, -12821, -12870, -12918, -12964, -13009, -13051, -13092,
--13131, -13168, -13204, -13238, -13269, -13299, -13327, -13354,
--13378, -13400, -13421, -13439, -13456, -13471, -13483, -13494,
--13503, -13509, -13514, -13516, -13517, -13515, -13512, -13506,
--13498, -13488, -13476, -13462, -13445, -13427, -13406, -13383,
--13358, -13330, -13301, -13269, -13235, -13198, -13160, -13119,
--13076, -13031, -12983, -12933, -12881, -12826, -12769, -12710,
--12648, -12584, -12518, -12449, -12378, -12305, -12229, -12151,
--12071, -11988, -11902, -11815, -11725, -11632, -11537, -11440,
--11340, -11238, -11134, -11027, -10917, -10806, -10691, -10575,
--10455, -10334, -10210, -10084, -9955, -9824, -9690, -9554,
--9415, -9274, -9131, -8985, -8837, -8686, -8533, -8378,
--8220, -8060, -7897, -7732, -7564, -7394, -7222, -7048,
--6871, -6691, -6509, -6325, -6139, -5950, -5759, -5566,
--5370, -5172, -4971, -4769, -4564, -4357, -4147, -3935,
--3721, -3505, -3287, -3066, -2843, -2618, -2391, -2161,
--1929, -1696, -1460, -1222, -982, -739, -495, -248,
-0, 251, 503, 758, 1014, 1273, 1533, 1796,
-2061, 2327, 2595, 2866, 3138, 3412, 3688, 3965,
-4245, 4526, 4809, 5094, 5380, 5669, 5959, 6250,
-6544, 6839, 7135, 7434, 7733, 8035, 8338, 8642,
-8948, 9255, 9564, 9875, 10186, 10499, 10814, 11130,
-11447, 11765, 12085, 12406, 12728, 13052, 13376, 13702,
-14029, 14357, 14686, 15016, 15348, 15680, 16013, 16347,
-16682, 17018, 17355, 17693, 18031, 18371, 18711, 19052,
-19394, 19736, 20079, 20423, 20767, 21112, 21457, 21803,
-22150, 22497, 22844, 23192, 23540, 23889, 24238, 24587,
-24937, 25286, 25636, 25987, 26337, 26688, 27038, 27389,
-27740, 28090, 28441, 28792, 29143, 29493, 29844, 30194,
-30544, 30894, 31244, 31593, 31943, 32291, 32640, 32988,
-33336, 33683, 34029, 34376, 34721, 35067, 35411, 35755,
-36098, 36441, 36783, 37124, 37464, 37804, 38142, 38480,
-38817, 39153, 39488, 39822, 40155, 40487, 40818, 41148,
-41477, 41805, 42131, 42456, 42780, 43103, 43424, 43744,
-44063, 44381, 44697, 45011, 45324, 45636, 45946, 46254,
-46561, 46866, 47170, 47472, 47772, 48071, 48368, 48663,
-48956, 49248, 49537, 49825, 50111, 50395, 50677, 50957,
-51235, 51511, 51785, 52057, 52326, 52594, 52859, 53123,
-53384, 53643, 53899, 54154, 54406, 54656, 54903, 55148,
-55391, 55631, 55869, 56104, 56337, 56568, 56796, 57021,
-57244, 57464, 57682, 57897, 58109, 58319, 58526, 58730,
-58932, 59131, 59327, 59521, 59711, 59899, 60084, 60266,
-60446, 60622, 60796, 60966, 61134, 61299, 61461, 61620,
-61775, 61928, 62078, 62225, 62369, 62510, 62647, 62782,
-62914, 63042, 63167, 63290, 63409, 63525, 63638, 63747,
-63854, 63957, 64057, 64154, 64247, 64338, 64425, 64509,
-64589, 64667, 64741, 64812, 64880, 64944, 65005, 65063,
-65117, 65168, 65216, 65261, 65302, 65340, 65374, 65405,
-65433, 65458, 65479, 65497, 65511, 65523, 65530, 65535,
-65536, 65535, 65530, 65523, 65511, 65497, 65479, 65458,
-65433, 65405, 65374, 65340, 65302, 65261, 65216, 65168,
-65117, 65063, 65005, 64944, 64880, 64812, 64741, 64667,
-64589, 64509, 64425, 64338, 64247, 64154, 64057, 63957,
-63854, 63747, 63638, 63525, 63409, 63290, 63167, 63042,
-62914, 62782, 62647, 62510, 62369, 62225, 62078, 61928,
-61775, 61620, 61461, 61299, 61134, 60966, 60796, 60622,
-60446, 60266, 60084, 59899, 59711, 59521, 59327, 59131,
-58932, 58730, 58526, 58319, 58109, 57897, 57682, 57464,
-57244, 57021, 56796, 56568, 56337, 56104, 55869, 55631,
-55391, 55148, 54903, 54656, 54406, 54154, 53899, 53643,
-53384, 53123, 52859, 52594, 52326, 52057, 51785, 51511,
-51235, 50957, 50677, 50395, 50111, 49825, 49537, 49248,
-48956, 48663, 48368, 48071, 47772, 47472, 47170, 46866,
-46561, 46254, 45946, 45636, 45324, 45011, 44697, 44381,
-44063, 43744, 43424, 43103, 42780, 42456, 42131, 41805,
-41477, 41148, 40818, 40487, 40155, 39822, 39488, 39153,
-38817, 38480, 38142, 37804, 37464, 37124, 36783, 36441,
-36098, 35755, 35411, 35067, 34721, 34376, 34029, 33683,
-33336, 32988, 32640, 32291, 31943, 31593, 31244, 30894,
-30544, 30194, 29844, 29493, 29143, 28792, 28441, 28090,
-27740, 27389, 27038, 26688, 26337, 25987, 25636, 25286,
-24937, 24587, 24238, 23889, 23540, 23192, 22844, 22497,
-22150, 21803, 21457, 21112, 20767, 20423, 20079, 19736,
-19394, 19052, 18711, 18371, 18031, 17693, 17355, 17018,
-16682, 16347, 16013, 15680, 15348, 15016, 14686, 14357,
-14029, 13702, 13376, 13052, 12728, 12406, 12085, 11765,
-11447, 11130, 10814, 10499, 10186, 9875, 9564, 9255,
-8948, 8642, 8338, 8035, 7733, 7434, 7135, 6839,
-6544, 6250, 5959, 5669, 5380, 5094, 4809, 4526,
-4245, 3965, 3688, 3412, 3138, 2866, 2595, 2327,
-2061, 1796, 1533, 1273, 1014, 758, 503, 251,
-0, -248, -495, -739, -982, -1222, -1460, -1696,
--1929, -2161, -2391, -2618, -2843, -3066, -3287, -3505,
--3721, -3935, -4147, -4357, -4564, -4769, -4971, -5172,
--5370, -5566, -5759, -5950, -6139, -6325, -6509, -6691,
--6871, -7048, -7222, -7394, -7564, -7732, -7897, -8060,
--8220, -8378, -8533, -8686, -8837, -8985, -9131, -9274,
--9415, -9554, -9690, -9824, -9955, -10084, -10210, -10334,
--10455, -10575, -10691, -10806, -10917, -11027, -11134, -11238,
--11340, -11440, -11537, -11632, -11725, -11815, -11902, -11988,
--12071, -12151, -12229, -12305, -12378, -12449, -12518, -12584,
--12648, -12710, -12769, -12826, -12881, -12933, -12983, -13031,
--13076, -13119, -13160, -13198, -13235, -13269, -13301, -13330,
--13358, -13383, -13406, -13427, -13445, -13462, -13476, -13488,
--13498, -13506, -13512, -13515, -13517, -13516, -13514, -13509,
--13503, -13494, -13483, -13471, -13456, -13439, -13421, -13400,
--13378, -13354, -13327, -13299, -13269, -13238, -13204, -13168,
--13131, -13092, -13051, -13009, -12964, -12918, -12870, -12821,
--12770, -12717, -12663, -12607, -12549, -12490, -12429, -12366,
--12302, -12237, -12170, -12102, -12032, -11960, -11888, -11813,
--11738, -11661, -11583, -11503, -11422, -11340, -11256, -11171,
--11085, -10998, -10909, -10820, -10729, -10637, -10544, -10450,
--10354, -10258, -10161, -10062, -9963, -9862, -9761, -9658,
--9555, -9451, -9346, -9240, -9133, -9025, -8917, -8808,
--8697, -8587, -8475, -8363, -8250, -8136, -8022, -7907,
--7792, -7676, -7559, -7442, -7324, -7206, -7087, -6968,
--6848, -6728, -6607, -6486, -6365, -6243, -6121, -5999,
--5876, -5753, -5630, -5507, -5383, -5259, -5135, -5011,
--4887, -4762, -4638, -4513, -4388, -4263, -4139, -4014,
--3889, -3764, -3639, -3515, -3390, -3265, -3141, -3017,
--2893, -2769, -2645, -2521, -2398, -2274, -2152, -2029,
--1907, -1784, -1663, -1541, -1420, -1299, -1179, -1059,
--940, -821, -702, -584, -466, -349, -232, -116,
-0, 115, 230, 344, 457, 570, 682, 794,
-905, 1015, 1125, 1234, 1342, 1449, 1556, 1662,
-1768, 1872, 1976, 2079, 2182, 2283, 2384, 2483,
-2582, 2681, 2778, 2874, 2970, 3064, 3158, 3251,
-3343, 3434, 3524, 3613, 3701, 3789, 3875, 3960,
-4044, 4128, 4210, 4291, 4371, 4451, 4529, 4606,
-4682, 4757, 4831, 4904, 4976, 5046, 5116, 5185,
-5252, 5318, 5384, 5448, 5511, 5573, 5634, 5693,
-5752, 5809, 5866, 5921, 5975, 6028, 6079, 6130,
-6179, 6227, 6274, 6320, 6365, 6408, 6451, 6492,
-6532, 6571, 6609, 6645, 6680, 6715, 6748, 6779,
-6810, 6840, 6868, 6895, 6921, 6946, 6969, 6992,
-7013, 7033, 7052, 7070, 7087, 7102, 7117, 7130,
-7142, 7153, 7162, 7171, 7179, 7185, 7190, 7194,
-7197, 7199, 7200, 7200, 7198, 7196, 7192, 7187,
-7181, 7175, 7167, 7158, 7148, 7136, 7124, 7111,
-7097, 7082, 7065, 7048, 7030, 7010, 6990, 6969,
-6947, 6923, 6899, 6874, 6848, 6821, 6793, 6764,
-6734, 6703, 6672, 6639, 6606, 6572, 6537, 6501,
-6464, 6426, 6387, 6348, 6308, 6267, 6225, 6183,
-6139, 6095, 6051, 6005, 5959, 5912, 5864, 5815,
-5766, 5717, 5666, 5615, 5563, 5511, 5457, 5404,
-5349, 5294, 5239, 5183, 5126, 5069, 5011, 4953,
-4894, 4835, 4775, 4714, 4654, 4592, 4531, 4468,
-4406, 4343, 4279, 4215, 4151, 4086, 4021, 3956,
-3890, 3824, 3758, 3691, 3624, 3557, 3489, 3421,
-3353, 3285, 3216, 3148, 3079, 3009, 2940, 2870,
-2801, 2731, 2661, 2591, 2520, 2450, 2379, 2309,
-2238, 2167, 2097, 2026, 1955, 1884, 1813, 1742,
-1671, 1600, 1530, 1459, 1388, 1317, 1247, 1176,
-1106, 1035, 965, 895, 825, 755, 686, 616,
-547, 478, 409, 340, 272, 203, 135, 68,
-0, -67, -134, -201, -268, -334, -400, -465,
--530, -595, -660, -724, -788, -851, -915, -977,
--1040, -1102, -1163, -1224, -1285, -1345, -1405, -1465,
--1524, -1582, -1640, -1698, -1755, -1811, -1867, -1923,
--1978, -2033, -2087, -2140, -2193, -2246, -2298, -2349,
--2400, -2450, -2500, -2549, -2598, -2646, -2693, -2740,
--2786, -2832, -2877, -2921, -2965, -3008, -3051, -3092,
--3134, -3174, -3214, -3254, -3292, -3330, -3368, -3405,
--3441, -3476, -3511, -3545, -3578, -3611, -3643, -3675,
--3705, -3735, -3765, -3793, -3821, -3848, -3875, -3901,
--3926, -3951, -3974, -3997, -4020, -4042, -4063, -4083,
--4102, -4121, -4139, -4157, -4174, -4190, -4205, -4220,
--4234, -4247, -4260, -4271, -4283, -4293, -4303, -4312,
--4320, -4328, -4335, -4341, -4347, -4352, -4356, -4360,
--4362, -4365, -4366, -4367, -4367, -4367, -4365, -4363,
--4361, -4358, -4354, -4349, -4344, -4339, -4332, -4325,
--4317, -4309, -4300, -4290, -4280, -4269, -4258, -4246,
--4233, -4220, -4206, -4192, -4177, -4161, -4145, -4128,
--4110, -4093, -4074, -4055, -4035, -4015, -3995, -3973,
--3951, -3929, -3906, -3883, -3859, -3835, -3810, -3785,
--3759, -3733, -3706, -3679, -3651, -3623, -3594, -3565,
--3535, -3505, -3475, -3444, -3413, -3381, -3349, -3317,
--3284, -3251, -3217, -3183, -3149, -3114, -3079, -3044,
--3008, -2972, -2936, -2899, -2862, -2825, -2788, -2750,
--2712, -2673, -2634, -2595, -2556, -2517, -2477, -2437,
--2397, -2357, -2316, -2275, -2234, -2193, -2152, -2110,
--2068, -2026, -1984, -1942, -1900, -1857, -1815, -1772,
--1729, -1686, -1643, -1600, -1557, -1514, -1470, -1427,
--1383, -1340, -1296, -1252, -1209, -1165, -1121, -1078,
--1034, -990, -946, -903, -859, -815, -772, -728,
--685, -641, -598, -554, -511, -468, -425, -382,
--339, -296, -253, -211, -168, -126, -84, -42,
-0, 42, 83, 125, 166, 207, 248, 289,
-329, 369, 409, 449, 489, 528, 568, 607,
-645, 684, 722, 760, 798, 835, 873, 910,
-946, 983, 1019, 1055, 1090, 1125, 1160, 1195,
-1229, 1263, 1297, 1330, 1363, 1396, 1429, 1461,
-1492, 1524, 1555, 1585, 1616, 1645, 1675, 1704,
-1733, 1761, 1790, 1817, 1845, 1872, 1898, 1924,
-1950, 1975, 2000, 2025, 2049, 2073, 2096, 2119,
-2142, 2164, 2186, 2207, 2228, 2248, 2268, 2288,
-2307, 2326, 2344, 2362, 2379, 2397, 2413, 2429,
-2445, 2460, 2475, 2490, 2504, 2517, 2530, 2543,
-2555, 2567, 2579, 2589, 2600, 2610, 2620, 2629,
-2638, 2646, 2654, 2661, 2668, 2675, 2681, 2686,
-2692, 2697, 2701, 2705, 2708, 2711, 2714, 2716,
-2718, 2719, 2720, 2721, 2721, 2721, 2720, 2719,
-2717, 2715, 2713, 2710, 2707, 2703, 2699, 2695,
-2690, 2685, 2679, 2673, 2667, 2660, 2653, 2645,
-2637, 2629, 2621, 2611, 2602, 2592, 2582, 2572,
-2561, 2550, 2538, 2526, 2514, 2501, 2488, 2475,
-2461, 2447, 2433, 2419, 2404, 2388, 2373, 2357,
-2341, 2325, 2308, 2291, 2273, 2256, 2238, 2220,
-2201, 2183, 2164, 2144, 2125, 2105, 2085, 2065,
-2044, 2024, 2003, 1982, 1960, 1938, 1917, 1895,
-1872, 1850, 1827, 1804, 1781, 1758, 1734, 1711,
-1687, 1663, 1639, 1615, 1590, 1565, 1541, 1516,
-1491, 1466, 1440, 1415, 1389, 1364, 1338, 1312,
-1286, 1260, 1234, 1207, 1181, 1154, 1128, 1101,
-1075, 1048, 1021, 994, 967, 940, 913, 886,
-859, 832, 805, 778, 751, 723, 696, 669,
-642, 615, 587, 560, 533, 506, 479, 452,
-425, 398, 371, 344, 317, 290, 263, 237,
-210, 184, 157, 131, 104, 78, 52, 26,
-0, -26, -52, -77, -103, -128, -154, -179,
--204, -229, -254, -278, -303, -327, -351, -376,
--400, -423, -447, -470, -494, -517, -540, -563,
--585, -608, -630, -652, -674, -696, -717, -739,
--760, -781, -802, -822, -842, -863, -883, -902,
--922, -941, -960, -979, -997, -1016, -1034, -1052,
--1070, -1087, -1104, -1121, -1138, -1154, -1171, -1187,
--1203, -1218, -1233, -1248, -1263, -1278, -1292, -1306,
--1320, -1333, -1346, -1359, -1372, -1384, -1397, -1409,
--1420, -1432, -1443, -1454, -1464, -1475, -1485, -1494,
--1504, -1513, -1522, -1531, -1539, -1547, -1555, -1563,
--1570, -1577, -1584, -1591, -1597, -1603, -1609, -1614,
--1619, -1624, -1629, -1633, -1637, -1641, -1645, -1648,
--1651, -1654, -1656, -1658, -1660, -1662, -1663, -1665,
--1665, -1666, -1666, -1666, -1666, -1666, -1665, -1664,
--1663, -1662, -1660, -1658, -1656, -1653, -1651, -1648,
--1645, -1641, -1638, -1634, -1630, -1625, -1621, -1616,
--1611, -1605, -1600, -1594, -1588, -1582, -1576, -1569,
--1562, -1555, -1548, -1540, -1533, -1525, -1517, -1508,
--1500, -1491, -1482, -1473, -1464, -1454, -1445, -1435,
--1425, -1415, -1404, -1394, -1383, -1372, -1361, -1350,
--1338, -1327, -1315, -1303, -1291, -1279, -1266, -1254,
--1241, -1228, -1215, -1202, -1189, -1176, -1162, -1149,
--1135, -1121, -1107, -1093, -1079, -1065, -1051, -1036,
--1022, -1007, -992, -977, -962, -947, -932, -917,
--901, -886, -871, -855, -840, -824, -808, -792,
--777, -761, -745, -729, -713, -697, -680, -664,
--648, -632, -616, -599, -583, -567, -550, -534,
--517, -501, -485, -468, -452, -435, -419, -402,
--386, -370, -353, -337, -320, -304, -288, -271,
--255, -239, -223, -206, -190, -174, -158, -142,
--126, -110, -94, -78, -63, -47, -31, -16,
-0, 15, 31, 46, 62, 77, 92, 107,
-122, 137, 152, 166, 181, 195, 210, 224,
-238, 253, 267, 281, 294, 308, 322, 335,
-349, 362, 375, 388, 401, 414, 427, 440,
-452, 464, 477, 489, 501, 513, 524, 536,
-547, 559, 570, 581, 592, 603, 613, 624,
-634, 644, 654, 664, 674, 684, 693, 702,
-712, 721, 730, 738, 747, 755, 764, 772,
-780, 787, 795, 803, 810, 817, 824, 831,
-838, 844, 850, 857, 863, 869, 874, 880,
-885, 890, 896, 900, 905, 910, 914, 919,
-923, 927, 930, 934, 937, 941, 944, 947,
-950, 952, 955, 957, 959, 961, 963, 965,
-966, 968, 969, 970, 971, 972, 972, 973,
-973, 973, 973, 973, 972, 972, 971, 971,
-970, 969, 967, 966, 964, 963, 961, 959,
-957, 955, 952, 950, 947, 944, 942, 939,
-935, 932, 929, 925, 921, 917, 914, 909,
-905, 901, 896, 892, 887, 882, 877, 872,
-867, 862, 857, 851, 846, 840, 834, 828,
-822, 816, 810, 803, 797, 791, 784, 777,
-770, 764, 757, 750, 742, 735, 728, 721,
-713, 706, 698, 690, 682, 675, 667, 659,
-651, 643, 634, 626, 618, 610, 601, 593,
-584, 576, 567, 558, 550, 541, 532, 523,
-514, 506, 497, 488, 479, 469, 460, 451,
-442, 433, 424, 414, 405, 396, 387, 377,
-368, 359, 349, 340, 331, 321, 312, 303,
-293, 284, 274, 265, 256, 246, 237, 228,
-218, 209, 199, 190, 181, 172, 162, 153,
-144, 135, 125, 116, 107, 98, 89, 80,
-71, 62, 53, 44, 35, 26, 17, 9,
-0, -9, -17, -26, -34, -43, -51, -60,
--68, -76, -85, -93, -101, -109, -117, -125,
--133, -141, -149, -156, -164, -172, -179, -187,
--194, -201, -209, -216, -223, -230, -237, -244,
--251, -258, -264, -271, -278, -284, -290, -297,
--303, -309, -315, -321, -327, -333, -339, -344,
--350, -356, -361, -366, -372, -377, -382, -387,
--392, -397, -401, -406, -411, -415, -419, -424,
--428, -432, -436, -440, -444, -448, -451, -455,
--458, -462, -465, -468, -472, -475, -478, -480,
--483, -486, -488, -491, -493, -496, -498, -500,
--502, -504, -506, -508, -509, -511, -512, -514,
--515, -516, -518, -519, -520, -520, -521, -522,
--523, -523, -524, -524, -524, -524, -525, -525,
--525, -524, -524, -524, -523, -523, -522, -522,
--521, -520, -519, -519, -518, -516, -515, -514,
--513, -511, -510, -508, -507, -505, -503, -501,
--499, -497, -495, -493, -491, -489, -487, -484,
--482, -479, -477, -474, -471, -469, -466, -463,
--460, -457, -454, -451, -448, -445, -441, -438,
--435, -431, -428, -424, -421, -417, -413, -410,
--406, -402, -398, -394, -390, -386, -382, -378,
--374, -370, -366, -362, -358, -353, -349, -345,
--340, -336, -332, -327, -323, -318, -314, -309,
--305, -300, -295, -291, -286, -281, -277, -272,
--267, -262, -258, -253, -248, -243, -238, -234,
--229, -224, -219, -214, -209, -204, -199, -195,
--190, -185, -180, -175, -170, -165, -160, -155,
--151, -146, -141, -136, -131, -126, -121, -116,
--112, -107, -102, -97, -92, -88, -83, -78,
--73, -69, -64, -59, -54, -50, -45, -41,
--36, -31, -27, -22, -18, -13, -9, -4,
-0, 4, 9, 13, 17, 22, 26, 30,
-34, 38, 43, 47, 51, 55, 59, 63,
-67, 71, 74, 78, 82, 86, 90, 93,
-97, 100, 104, 108, 111, 115, 118, 121,
-125, 128, 131, 134, 138, 141, 144, 147,
-150, 153, 156, 159, 161, 164, 167, 170,
-172, 175, 177, 180, 182, 185, 187, 190,
-192, 194, 196, 199, 201, 203, 205, 207,
-209, 211, 212, 214, 216, 218, 219, 221,
-222, 224, 225, 227, 228, 230, 231, 232,
-233, 234, 236, 237, 238, 239, 240, 240,
-241, 242, 243, 244, 244, 245, 245, 246,
-246, 247, 247, 248, 248, 248, 248, 248,
-249, 249, 249, 249, 249, 249, 249, 248,
-248, 248, 248, 247, 247, 247, 246, 246,
-245, 245, 244, 244, 243, 242, 242, 241,
-240, 239, 238, 237, 237, 236, 235, 234,
-233, 231, 230, 229, 228, 227, 226, 224,
-223, 222, 220, 219, 218, 216, 215, 213,
-212, 210, 209, 207, 206, 204, 202, 201,
-199, 197, 195, 194, 192, 190, 188, 187,
-185, 183, 181, 179, 177, 175, 173, 171,
-169, 167, 165, 163, 161, 159, 157, 155,
-153, 151, 149, 147, 145, 142, 140, 138,
-136, 134, 132, 129, 127, 125, 123, 121,
-119, 116, 114, 112, 110, 107, 105, 103,
-101, 99, 96, 94, 92, 90, 87, 85,
-83, 81, 79, 76, 74, 72, 70, 68,
-65, 63, 61, 59, 57, 55, 52, 50,
-48, 46, 44, 42, 40, 38, 36, 33,
-31, 29, 27, 25, 23, 21, 19, 17,
-15, 13, 11, 9, 8, 6, 4, 2,
-0, -2, -4, -6, -7, -9, -11, -13,
--14, -16, -18, -19, -21, -23, -24, -26,
--28, -29, -31, -32, -34, -35, -37, -38,
--40, -41, -43, -44, -46, -47, -48, -50,
--51, -52, -54, -55, -56, -57, -58, -60,
--61, -62, -63, -64, -65, -66, -67, -68,
--69, -70, -71, -72, -73, -74, -75, -76,
--76, -77, -78, -79, -80, -80, -81, -82,
--82, -83, -84, -84, -85, -85, -86, -86,
--87, -87, -88, -88, -89, -89, -90, -90,
--90, -91, -91, -91, -92, -92, -92, -92,
--92, -93, -93, -93, -93, -93, -93, -93,
--93, -93, -94, -94, -94, -93, -93, -93,
--93, -93, -93, -93, -93, -93, -93, -92,
--92, -92, -92, -91, -91, -91, -91, -90,
--90, -90, -89, -89, -89, -88, -88, -88,
--87, -87, -86, -86, -85, -85, -84, -84,
--83, -83, -82, -82, -81, -81, -80, -80,
--79, -78, -78, -77, -77, -76, -75, -75,
--74, -73, -73, -72, -71, -71, -70, -69,
--69, -68, -67, -67, -66, -65, -64, -64,
--63, -62, -61, -61, -60, -59, -58, -58,
--57, -56, -55, -54, -54, -53, -52, -51,
--51, -50, -49, -48, -47, -47, -46, -45,
--44, -43, -43, -42, -41, -40, -40, -39,
--38, -37, -36, -36, -35, -34, -33, -33,
--32, -31, -30, -29, -29, -28, -27, -26,
--26, -25, -24, -24, -23, -22, -21, -21,
--20, -19, -19, -18, -17, -16, -16, -15,
--14, -14, -13, -12, -12, -11, -10, -10,
--9, -9, -8, -7, -7, -6, -6, -5,
--4, -4, -3, -3, -2, -2, -1, -1, 0,
-};
-
-/* The table used in up sampling */
-int32_t _amsrc2tables[5397] = {
-0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 65536, 0, 0,
-0, 0, 0, 0, 0, 0, 0,
-0, -1, 2, -4, 9, -16, 26,
--42, 68, -116, 251, 65535, -248, 115,
--67, 42, -26, 15, -9, 4, -2,
-0, -1, 4, -9, 17, -31, 52,
--84, 135, -232, 503, 65530, -495, 230,
--134, 83, -52, 31, -17, 9, -4,
-0, -2, 6, -13, 26, -47, 78,
--126, 203, -349, 758, 65523, -739, 344,
--201, 125, -77, 46, -26, 13, -6,
-0, -2, 8, -18, 35, -63, 104,
--168, 272, -466, 1014, 65511, -982, 457,
--268, 166, -103, 62, -34, 17, -7,
-0, -3, 9, -22, 44, -78, 131,
--211, 340, -584, 1273, 65497, -1222, 570,
--334, 207, -128, 77, -43, 22, -9,
-0, -3, 11, -27, 53, -94, 157,
--253, 409, -702, 1533, 65479, -1460, 682,
--400, 248, -154, 92, -51, 26, -11,
-0, -4, 13, -31, 62, -110, 184,
--296, 478, -821, 1796, 65458, -1696, 794,
--465, 289, -179, 107, -60, 30, -13,
-0, -4, 15, -36, 71, -126, 210,
--339, 547, -940, 2061, 65433, -1929, 905,
--530, 329, -204, 122, -68, 34, -14,
-0, -5, 17, -41, 80, -142, 237,
--382, 616, -1059, 2327, 65405, -2161, 1015,
--595, 369, -229, 137, -76, 38, -16,
-0, -6, 19, -45, 89, -158, 263,
--425, 686, -1179, 2595, 65374, -2391, 1125,
--660, 409, -254, 152, -85, 43, -18,
-0, -6, 21, -50, 98, -174, 290,
--468, 755, -1299, 2866, 65340, -2618, 1234,
--724, 449, -278, 166, -93, 47, -19,
-0, -7, 23, -54, 107, -190, 317,
--511, 825, -1420, 3138, 65302, -2843, 1342,
--788, 489, -303, 181, -101, 51, -21,
-0, -7, 25, -59, 116, -206, 344,
--554, 895, -1541, 3412, 65261, -3066, 1449,
--851, 528, -327, 195, -109, 55, -23,
-0, -8, 27, -64, 125, -223, 371,
--598, 965, -1663, 3688, 65216, -3287, 1556,
--915, 568, -351, 210, -117, 59, -24,
-0, -9, 29, -69, 135, -239, 398,
--641, 1035, -1784, 3965, 65168, -3505, 1662,
--977, 607, -376, 224, -125, 63, -26,
-0, -9, 31, -73, 144, -255, 425,
--685, 1106, -1907, 4245, 65117, -3721, 1768,
--1040, 645, -400, 238, -133, 67, -28,
-0, -10, 33, -78, 153, -271, 452,
--728, 1176, -2029, 4526, 65063, -3935, 1872,
--1102, 684, -423, 253, -141, 71, -29,
-0, -10, 36, -83, 162, -288, 479,
--772, 1247, -2152, 4809, 65005, -4147, 1976,
--1163, 722, -447, 267, -149, 74, -31,
-0, -11, 38, -88, 172, -304, 506,
--815, 1317, -2274, 5094, 64944, -4357, 2079,
--1224, 760, -470, 281, -156, 78, -32,
-0, -12, 40, -92, 181, -320, 533,
--859, 1388, -2398, 5380, 64880, -4564, 2182,
--1285, 798, -494, 294, -164, 82, -34,
-0, -12, 42, -97, 190, -337, 560,
--903, 1459, -2521, 5669, 64812, -4769, 2283,
--1345, 835, -517, 308, -172, 86, -35,
-0, -13, 44, -102, 199, -353, 587,
--946, 1530, -2645, 5959, 64741, -4971, 2384,
--1405, 873, -540, 322, -179, 90, -37,
-0, -14, 46, -107, 209, -370, 615,
--990, 1600, -2769, 6250, 64667, -5172, 2483,
--1465, 910, -563, 335, -187, 93, -38,
-0, -14, 48, -112, 218, -386, 642,
--1034, 1671, -2893, 6544, 64589, -5370, 2582,
--1524, 946, -585, 349, -194, 97, -40,
-0, -15, 50, -116, 228, -402, 669,
--1078, 1742, -3017, 6839, 64509, -5566, 2681,
--1582, 983, -608, 362, -201, 100, -41,
-0, -16, 52, -121, 237, -419, 696,
--1121, 1813, -3141, 7135, 64425, -5759, 2778,
--1640, 1019, -630, 375, -209, 104, -43,
-0, -16, 55, -126, 246, -435, 723,
--1165, 1884, -3265, 7434, 64338, -5950, 2874,
--1698, 1055, -652, 388, -216, 108, -44,
-0, -17, 57, -131, 256, -452, 751,
--1209, 1955, -3390, 7733, 64247, -6139, 2970,
--1755, 1090, -674, 401, -223, 111, -46,
-0, -18, 59, -136, 265, -468, 778,
--1252, 2026, -3515, 8035, 64154, -6325, 3064,
--1811, 1125, -696, 414, -230, 115, -47,
-0, -19, 61, -141, 274, -485, 805,
--1296, 2097, -3639, 8338, 64057, -6509, 3158,
--1867, 1160, -717, 427, -237, 118, -48,
-0, -19, 63, -146, 284, -501, 832,
--1340, 2167, -3764, 8642, 63957, -6691, 3251,
--1923, 1195, -739, 440, -244, 121, -50,
-0, -20, 65, -151, 293, -517, 859,
--1383, 2238, -3889, 8948, 63854, -6871, 3343,
--1978, 1229, -760, 452, -251, 125, -51,
-0, -21, 68, -155, 303, -534, 886,
--1427, 2309, -4014, 9255, 63747, -7048, 3434,
--2033, 1263, -781, 464, -258, 128, -52,
-0, -21, 70, -160, 312, -550, 913,
--1470, 2379, -4139, 9564, 63638, -7222, 3524,
--2087, 1297, -802, 477, -264, 131, -54,
-0, -22, 72, -165, 321, -567, 940,
--1514, 2450, -4263, 9875, 63525, -7394, 3613,
--2140, 1330, -822, 489, -271, 134, -55,
-0, -23, 74, -170, 331, -583, 967,
--1557, 2520, -4388, 10186, 63409, -7564, 3701,
--2193, 1363, -842, 501, -278, 138, -56,
-0, -24, 76, -175, 340, -599, 994,
--1600, 2591, -4513, 10499, 63290, -7732, 3789,
--2246, 1396, -863, 513, -284, 141, -57,
-0, -24, 79, -180, 349, -616, 1021,
--1643, 2661, -4638, 10814, 63167, -7897, 3875,
--2298, 1429, -883, 524, -290, 144, -58,
-0, -25, 81, -185, 359, -632, 1048,
--1686, 2731, -4762, 11130, 63042, -8060, 3960,
--2349, 1461, -902, 536, -297, 147, -60,
-0, -26, 83, -190, 368, -648, 1075,
--1729, 2801, -4887, 11447, 62914, -8220, 4044,
--2400, 1492, -922, 547, -303, 150, -61,
-0, -26, 85, -195, 377, -664, 1101,
--1772, 2870, -5011, 11765, 62782, -8378, 4128,
--2450, 1524, -941, 559, -309, 153, -62,
-0, -27, 87, -199, 387, -680, 1128,
--1815, 2940, -5135, 12085, 62647, -8533, 4210,
--2500, 1555, -960, 570, -315, 156, -63,
-0, -28, 90, -204, 396, -697, 1154,
--1857, 3009, -5259, 12406, 62510, -8686, 4291,
--2549, 1585, -979, 581, -321, 159, -64,
-0, -29, 92, -209, 405, -713, 1181,
--1900, 3079, -5383, 12728, 62369, -8837, 4371,
--2598, 1616, -997, 592, -327, 161, -65,
-0, -29, 94, -214, 414, -729, 1207,
--1942, 3148, -5507, 13052, 62225, -8985, 4451,
--2646, 1645, -1016, 603, -333, 164, -66,
-0, -30, 96, -219, 424, -745, 1234,
--1984, 3216, -5630, 13376, 62078, -9131, 4529,
--2693, 1675, -1034, 613, -339, 167, -67,
-0, -31, 99, -224, 433, -761, 1260,
--2026, 3285, -5753, 13702, 61928, -9274, 4606,
--2740, 1704, -1052, 624, -344, 170, -68,
-0, -32, 101, -229, 442, -777, 1286,
--2068, 3353, -5876, 14029, 61775, -9415, 4682,
--2786, 1733, -1070, 634, -350, 172, -69,
-0, -33, 103, -234, 451, -792, 1312,
--2110, 3421, -5999, 14357, 61620, -9554, 4757,
--2832, 1761, -1087, 644, -356, 175, -70,
-0, -33, 105, -238, 460, -808, 1338,
--2152, 3489, -6121, 14686, 61461, -9690, 4831,
--2877, 1790, -1104, 654, -361, 177, -71,
-0, -34, 107, -243, 469, -824, 1364,
--2193, 3557, -6243, 15016, 61299, -9824, 4904,
--2921, 1817, -1121, 664, -366, 180, -72,
-0, -35, 110, -248, 479, -840, 1389,
--2234, 3624, -6365, 15348, 61134, -9955, 4976,
--2965, 1845, -1138, 674, -372, 182, -73,
-0, -36, 112, -253, 488, -855, 1415,
--2275, 3691, -6486, 15680, 60966, -10084, 5046,
--3008, 1872, -1154, 684, -377, 185, -74,
-0, -36, 114, -258, 497, -871, 1440,
--2316, 3758, -6607, 16013, 60796, -10210, 5116,
--3051, 1898, -1171, 693, -382, 187, -75,
-0, -37, 116, -262, 506, -886, 1466,
--2357, 3824, -6728, 16347, 60622, -10334, 5185,
--3092, 1924, -1187, 702, -387, 190, -76,
-0, -38, 119, -267, 514, -901, 1491,
--2397, 3890, -6848, 16682, 60446, -10455, 5252,
--3134, 1950, -1203, 712, -392, 192, -76,
-0, -39, 121, -272, 523, -917, 1516,
--2437, 3956, -6968, 17018, 60266, -10575, 5318,
--3174, 1975, -1218, 721, -397, 194, -77,
-0, -40, 123, -277, 532, -932, 1541,
--2477, 4021, -7087, 17355, 60084, -10691, 5384,
--3214, 2000, -1233, 730, -401, 196, -78,
-0, -40, 125, -281, 541, -947, 1565,
--2517, 4086, -7206, 17693, 59899, -10806, 5448,
--3254, 2025, -1248, 738, -406, 199, -79,
-0, -41, 127, -286, 550, -962, 1590,
--2556, 4151, -7324, 18031, 59711, -10917, 5511,
--3292, 2049, -1263, 747, -411, 201, -80,
-0, -42, 129, -291, 558, -977, 1615,
--2595, 4215, -7442, 18371, 59521, -11027, 5573,
--3330, 2073, -1278, 755, -415, 203, -80,
-0, -43, 132, -295, 567, -992, 1639,
--2634, 4279, -7559, 18711, 59327, -11134, 5634,
--3368, 2096, -1292, 764, -419, 205, -81,
-0, -43, 134, -300, 576, -1007, 1663,
--2673, 4343, -7676, 19052, 59131, -11238, 5693,
--3405, 2119, -1306, 772, -424, 207, -82,
-0, -44, 136, -305, 584, -1022, 1687,
--2712, 4406, -7792, 19394, 58932, -11340, 5752,
--3441, 2142, -1320, 780, -428, 209, -82,
-0, -45, 138, -309, 593, -1036, 1711,
--2750, 4468, -7907, 19736, 58730, -11440, 5809,
--3476, 2164, -1333, 787, -432, 211, -83,
-0, -46, 140, -314, 601, -1051, 1734,
--2788, 4531, -8022, 20079, 58526, -11537, 5866,
--3511, 2186, -1346, 795, -436, 212, -84,
-0, -47, 142, -318, 610, -1065, 1758,
--2825, 4592, -8136, 20423, 58319, -11632, 5921,
--3545, 2207, -1359, 803, -440, 214, -84,
-0, -47, 145, -323, 618, -1079, 1781,
--2862, 4654, -8250, 20767, 58109, -11725, 5975,
--3578, 2228, -1372, 810, -444, 216, -85,
-0, -48, 147, -327, 626, -1093, 1804,
--2899, 4714, -8363, 21112, 57897, -11815, 6028,
--3611, 2248, -1384, 817, -448, 218, -85,
-0, -49, 149, -332, 634, -1107, 1827,
--2936, 4775, -8475, 21457, 57682, -11902, 6079,
--3643, 2268, -1397, 824, -451, 219, -86,
-0, -50, 151, -336, 643, -1121, 1850,
--2972, 4835, -8587, 21803, 57464, -11988, 6130,
--3675, 2288, -1409, 831, -455, 221, -86,
-0, -51, 153, -340, 651, -1135, 1872,
--3008, 4894, -8697, 22150, 57244, -12071, 6179,
--3705, 2307, -1420, 838, -458, 222, -87,
-0, -51, 155, -345, 659, -1149, 1895,
--3044, 4953, -8808, 22497, 57021, -12151, 6227,
--3735, 2326, -1432, 844, -462, 224, -87,
-0, -52, 157, -349, 667, -1162, 1917,
--3079, 5011, -8917, 22844, 56796, -12229, 6274,
--3765, 2344, -1443, 850, -465, 225, -88,
-0, -53, 159, -353, 675, -1176, 1938,
--3114, 5069, -9025, 23192, 56568, -12305, 6320,
--3793, 2362, -1454, 857, -468, 227, -88,
-0, -54, 161, -358, 682, -1189, 1960,
--3149, 5126, -9133, 23540, 56337, -12378, 6365,
--3821, 2379, -1464, 863, -472, 228, -89,
-0, -54, 163, -362, 690, -1202, 1982,
--3183, 5183, -9240, 23889, 56104, -12449, 6408,
--3848, 2397, -1475, 869, -475, 230, -89,
-0, -55, 165, -366, 698, -1215, 2003,
--3217, 5239, -9346, 24238, 55869, -12518, 6451,
--3875, 2413, -1485, 874, -478, 231, -90,
-0, -56, 167, -370, 706, -1228, 2024,
--3251, 5294, -9451, 24587, 55631, -12584, 6492,
--3901, 2429, -1494, 880, -480, 232, -90,
-0, -57, 169, -374, 713, -1241, 2044,
--3284, 5349, -9555, 24937, 55391, -12648, 6532,
--3926, 2445, -1504, 885, -483, 233, -90,
-0, -58, 171, -378, 721, -1254, 2065,
--3317, 5404, -9658, 25286, 55148, -12710, 6571,
--3951, 2460, -1513, 890, -486, 234, -91,
-0, -58, 173, -382, 728, -1266, 2085,
--3349, 5457, -9761, 25636, 54903, -12769, 6609,
--3974, 2475, -1522, 896, -488, 236, -91,
-0, -59, 175, -386, 735, -1279, 2105,
--3381, 5511, -9862, 25987, 54656, -12826, 6645,
--3997, 2490, -1531, 900, -491, 237, -91,
-0, -60, 177, -390, 742, -1291, 2125,
--3413, 5563, -9963, 26337, 54406, -12881, 6680,
--4020, 2504, -1539, 905, -493, 238, -92,
-0, -61, 179, -394, 750, -1303, 2144,
--3444, 5615, -10062, 26688, 54154, -12933, 6715,
--4042, 2517, -1547, 910, -496, 239, -92,
-0, -61, 181, -398, 757, -1315, 2164,
--3475, 5666, -10161, 27038, 53899, -12983, 6748,
--4063, 2530, -1555, 914, -498, 240, -92,
-0, -62, 183, -402, 764, -1327, 2183,
--3505, 5717, -10258, 27389, 53643, -13031, 6779,
--4083, 2543, -1563, 919, -500, 240, -92,
-0, -63, 185, -406, 770, -1338, 2201,
--3535, 5766, -10354, 27740, 53384, -13076, 6810,
--4102, 2555, -1570, 923, -502, 241, -92,
-0, -64, 187, -410, 777, -1350, 2220,
--3565, 5815, -10450, 28090, 53123, -13119, 6840,
--4121, 2567, -1577, 927, -504, 242, -93,
-0, -64, 188, -413, 784, -1361, 2238,
--3594, 5864, -10544, 28441, 52859, -13160, 6868,
--4139, 2579, -1584, 930, -506, 243, -93,
-0, -65, 190, -417, 791, -1372, 2256,
--3623, 5912, -10637, 28792, 52594, -13198, 6895,
--4157, 2589, -1591, 934, -508, 244, -93,
-0, -66, 192, -421, 797, -1383, 2273,
--3651, 5959, -10729, 29143, 52326, -13235, 6921,
--4174, 2600, -1597, 937, -509, 244, -93,
-0, -67, 194, -424, 803, -1394, 2291,
--3679, 6005, -10820, 29493, 52057, -13269, 6946,
--4190, 2610, -1603, 941, -511, 245, -93,
-0, -67, 195, -428, 810, -1404, 2308,
--3706, 6051, -10909, 29844, 51785, -13301, 6969,
--4205, 2620, -1609, 944, -512, 245, -93,
-0, -68, 197, -431, 816, -1415, 2325,
--3733, 6095, -10998, 30194, 51511, -13330, 6992,
--4220, 2629, -1614, 947, -514, 246, -93,
-0, -69, 199, -435, 822, -1425, 2341,
--3759, 6139, -11085, 30544, 51235, -13358, 7013,
--4234, 2638, -1619, 950, -515, 246, -93,
-0, -69, 201, -438, 828, -1435, 2357,
--3785, 6183, -11171, 30894, 50957, -13383, 7033,
--4247, 2646, -1624, 952, -516, 247, -93,
-0, -70, 202, -441, 834, -1445, 2373,
--3810, 6225, -11256, 31244, 50677, -13406, 7052,
--4260, 2654, -1629, 955, -518, 247, -94,
-0, -71, 204, -445, 840, -1454, 2388,
--3835, 6267, -11340, 31593, 50395, -13427, 7070,
--4271, 2661, -1633, 957, -519, 248, -94,
-0, -71, 206, -448, 846, -1464, 2404,
--3859, 6308, -11422, 31943, 50111, -13445, 7087,
--4283, 2668, -1637, 959, -520, 248, -94,
-0, -72, 207, -451, 851, -1473, 2419,
--3883, 6348, -11503, 32291, 49825, -13462, 7102,
--4293, 2675, -1641, 961, -520, 248, -93,
-0, -73, 209, -454, 857, -1482, 2433,
--3906, 6387, -11583, 32640, 49537, -13476, 7117,
--4303, 2681, -1645, 963, -521, 248, -93,
-0, -73, 210, -457, 862, -1491, 2447,
--3929, 6426, -11661, 32988, 49248, -13488, 7130,
--4312, 2686, -1648, 965, -522, 248, -93,
-0, -74, 212, -460, 867, -1500, 2461,
--3951, 6464, -11738, 33336, 48956, -13498, 7142,
--4320, 2692, -1651, 966, -523, 249, -93,
-0, -75, 213, -463, 872, -1508, 2475,
--3973, 6501, -11813, 33683, 48663, -13506, 7153,
--4328, 2697, -1654, 968, -523, 249, -93,
-0, -75, 215, -466, 877, -1517, 2488,
--3995, 6537, -11888, 34029, 48368, -13512, 7162,
--4335, 2701, -1656, 969, -524, 249, -93,
-0, -76, 216, -469, 882, -1525, 2501,
--4015, 6572, -11960, 34376, 48071, -13515, 7171,
--4341, 2705, -1658, 970, -524, 249, -93,
-0, -77, 218, -471, 887, -1533, 2514,
--4035, 6606, -12032, 34721, 47772, -13517, 7179,
--4347, 2708, -1660, 971, -524, 249, -93,
-0, -77, 219, -474, 892, -1540, 2526,
--4055, 6639, -12102, 35067, 47472, -13516, 7185,
--4352, 2711, -1662, 972, -524, 249, -93,
-0, -78, 220, -477, 896, -1548, 2538,
--4074, 6672, -12170, 35411, 47170, -13514, 7190,
--4356, 2714, -1663, 972, -525, 249, -93,
-0, -78, 222, -479, 901, -1555, 2550,
--4093, 6703, -12237, 35755, 46866, -13509, 7194,
--4360, 2716, -1665, 973, -525, 248, -92,
-0, -79, 223, -482, 905, -1562, 2561,
--4110, 6734, -12302, 36098, 46561, -13503, 7197,
--4362, 2718, -1665, 973, -525, 248, -92,
-0, -80, 224, -484, 909, -1569, 2572,
--4128, 6764, -12366, 36441, 46254, -13494, 7199,
--4365, 2719, -1666, 973, -524, 248, -92,
-0, -80, 226, -487, 914, -1576, 2582,
--4145, 6793, -12429, 36783, 45946, -13483, 7200,
--4366, 2720, -1666, 973, -524, 248, -92,
-0, -81, 227, -489, 917, -1582, 2592,
--4161, 6821, -12490, 37124, 45636, -13471, 7200,
--4367, 2721, -1666, 973, -524, 247, -91,
-0, -81, 228, -491, 921, -1588, 2602,
--4177, 6848, -12549, 37464, 45324, -13456, 7198,
--4367, 2721, -1666, 972, -523, 247, -91,
-0, -82, 229, -493, 925, -1594, 2611,
--4192, 6874, -12607, 37804, 45011, -13439, 7196,
--4367, 2721, -1666, 972, -523, 247, -91,
-0, -82, 230, -495, 929, -1600, 2621,
--4206, 6899, -12663, 38142, 44697, -13421, 7192,
--4365, 2720, -1665, 971, -522, 246, -91,
-0, -83, 231, -497, 932, -1605, 2629,
--4220, 6923, -12717, 38480, 44381, -13400, 7187,
--4363, 2719, -1664, 971, -522, 246, -90,
-0, -83, 233, -499, 935, -1611, 2637,
--4233, 6947, -12770, 38817, 44063, -13378, 7181,
--4361, 2717, -1663, 970, -521, 245, -90,
-0, -84, 234, -501, 939, -1616, 2645,
--4246, 6969, -12821, 39153, 43744, -13354, 7175,
--4358, 2715, -1662, 969, -520, 245, -90,
-0, -84, 235, -503, 942, -1621, 2653,
--4258, 6990, -12870, 39488, 43424, -13327, 7167,
--4354, 2713, -1660, 967, -519, 244, -89,
-0, -85, 236, -505, 944, -1625, 2660,
--4269, 7010, -12918, 39822, 43103, -13299, 7158,
--4349, 2710, -1658, 966, -519, 244, -89,
-0, -85, 237, -507, 947, -1630, 2667,
--4280, 7030, -12964, 40155, 42780, -13269, 7148,
--4344, 2707, -1656, 964, -518, 243, -89,
-0, -86, 237, -508, 950, -1634, 2673,
--4290, 7048, -13009, 40487, 42456, -13238, 7136,
--4339, 2703, -1653, 963, -516, 242, -88,
-0, -86, 238, -510, 952, -1638, 2679,
--4300, 7065, -13051, 40818, 42131, -13204, 7124,
--4332, 2699, -1651, 961, -515, 242, -88,
-0, -87, 239, -511, 955, -1641, 2685,
--4309, 7082, -13092, 41148, 41805, -13168, 7111,
--4325, 2695, -1648, 959, -514, 241, -88,
-0, -87, 240, -513, 957, -1645, 2690,
--4317, 7097, -13131, 41477, 41477, -13131, 7097,
--4317, 2690, -1645, 957, -513, 240, -87,
-0, -88, 241, -514, 959, -1648, 2695,
--4325, 7111, -13168, 41805, 41148, -13092, 7082,
--4309, 2685, -1641, 955, -511, 239, -87,
-0, -88, 242, -515, 961, -1651, 2699,
--4332, 7124, -13204, 42131, 40818, -13051, 7065,
--4300, 2679, -1638, 952, -510, 238, -86,
-0, -88, 242, -516, 963, -1653, 2703,
--4339, 7136, -13238, 42456, 40487, -13009, 7048,
--4290, 2673, -1634, 950, -508, 237, -86,
-0, -89, 243, -518, 964, -1656, 2707,
--4344, 7148, -13269, 42780, 40155, -12964, 7030,
--4280, 2667, -1630, 947, -507, 237, -85,
-0, -89, 244, -519, 966, -1658, 2710,
--4349, 7158, -13299, 43103, 39822, -12918, 7010,
--4269, 2660, -1625, 944, -505, 236, -85,
-0, -89, 244, -519, 967, -1660, 2713,
--4354, 7167, -13327, 43424, 39488, -12870, 6990,
--4258, 2653, -1621, 942, -503, 235, -84,
-0, -90, 245, -520, 969, -1662, 2715,
--4358, 7175, -13354, 43744, 39153, -12821, 6969,
--4246, 2645, -1616, 939, -501, 234, -84,
-0, -90, 245, -521, 970, -1663, 2717,
--4361, 7181, -13378, 44063, 38817, -12770, 6947,
--4233, 2637, -1611, 935, -499, 233, -83,
-0, -90, 246, -522, 971, -1664, 2719,
--4363, 7187, -13400, 44381, 38480, -12717, 6923,
--4220, 2629, -1605, 932, -497, 231, -83,
-0, -91, 246, -522, 971, -1665, 2720,
--4365, 7192, -13421, 44697, 38142, -12663, 6899,
--4206, 2621, -1600, 929, -495, 230, -82,
-0, -91, 247, -523, 972, -1666, 2721,
--4367, 7196, -13439, 45011, 37804, -12607, 6874,
--4192, 2611, -1594, 925, -493, 229, -82,
-0, -91, 247, -523, 972, -1666, 2721,
--4367, 7198, -13456, 45324, 37464, -12549, 6848,
--4177, 2602, -1588, 921, -491, 228, -81,
-0, -91, 247, -524, 973, -1666, 2721,
--4367, 7200, -13471, 45636, 37124, -12490, 6821,
--4161, 2592, -1582, 917, -489, 227, -81,
-0, -92, 248, -524, 973, -1666, 2720,
--4366, 7200, -13483, 45946, 36783, -12429, 6793,
--4145, 2582, -1576, 914, -487, 226, -80,
-0, -92, 248, -524, 973, -1666, 2719,
--4365, 7199, -13494, 46254, 36441, -12366, 6764,
--4128, 2572, -1569, 909, -484, 224, -80,
-0, -92, 248, -525, 973, -1665, 2718,
--4362, 7197, -13503, 46561, 36098, -12302, 6734,
--4110, 2561, -1562, 905, -482, 223, -79,
-0, -92, 248, -525, 973, -1665, 2716,
--4360, 7194, -13509, 46866, 35755, -12237, 6703,
--4093, 2550, -1555, 901, -479, 222, -78,
-0, -93, 249, -525, 972, -1663, 2714,
--4356, 7190, -13514, 47170, 35411, -12170, 6672,
--4074, 2538, -1548, 896, -477, 220, -78,
-0, -93, 249, -524, 972, -1662, 2711,
--4352, 7185, -13516, 47472, 35067, -12102, 6639,
--4055, 2526, -1540, 892, -474, 219, -77,
-0, -93, 249, -524, 971, -1660, 2708,
--4347, 7179, -13517, 47772, 34721, -12032, 6606,
--4035, 2514, -1533, 887, -471, 218, -77,
-0, -93, 249, -524, 970, -1658, 2705,
--4341, 7171, -13515, 48071, 34376, -11960, 6572,
--4015, 2501, -1525, 882, -469, 216, -76,
-0, -93, 249, -524, 969, -1656, 2701,
--4335, 7162, -13512, 48368, 34029, -11888, 6537,
--3995, 2488, -1517, 877, -466, 215, -75,
-0, -93, 249, -523, 968, -1654, 2697,
--4328, 7153, -13506, 48663, 33683, -11813, 6501,
--3973, 2475, -1508, 872, -463, 213, -75,
-0, -93, 249, -523, 966, -1651, 2692,
--4320, 7142, -13498, 48956, 33336, -11738, 6464,
--3951, 2461, -1500, 867, -460, 212, -74,
-0, -93, 248, -522, 965, -1648, 2686,
--4312, 7130, -13488, 49248, 32988, -11661, 6426,
--3929, 2447, -1491, 862, -457, 210, -73,
-0, -93, 248, -521, 963, -1645, 2681,
--4303, 7117, -13476, 49537, 32640, -11583, 6387,
--3906, 2433, -1482, 857, -454, 209, -73,
-0, -93, 248, -520, 961, -1641, 2675,
--4293, 7102, -13462, 49825, 32291, -11503, 6348,
--3883, 2419, -1473, 851, -451, 207, -72,
-0, -94, 248, -520, 959, -1637, 2668,
--4283, 7087, -13445, 50111, 31943, -11422, 6308,
--3859, 2404, -1464, 846, -448, 206, -71,
-0, -94, 248, -519, 957, -1633, 2661,
--4271, 7070, -13427, 50395, 31593, -11340, 6267,
--3835, 2388, -1454, 840, -445, 204, -71,
-0, -94, 247, -518, 955, -1629, 2654,
--4260, 7052, -13406, 50677, 31244, -11256, 6225,
--3810, 2373, -1445, 834, -441, 202, -70,
-0, -93, 247, -516, 952, -1624, 2646,
--4247, 7033, -13383, 50957, 30894, -11171, 6183,
--3785, 2357, -1435, 828, -438, 201, -69,
-0, -93, 246, -515, 950, -1619, 2638,
--4234, 7013, -13358, 51235, 30544, -11085, 6139,
--3759, 2341, -1425, 822, -435, 199, -69,
-0, -93, 246, -514, 947, -1614, 2629,
--4220, 6992, -13330, 51511, 30194, -10998, 6095,
--3733, 2325, -1415, 816, -431, 197, -68,
-0, -93, 245, -512, 944, -1609, 2620,
--4205, 6969, -13301, 51785, 29844, -10909, 6051,
--3706, 2308, -1404, 810, -428, 195, -67,
-0, -93, 245, -511, 941, -1603, 2610,
--4190, 6946, -13269, 52057, 29493, -10820, 6005,
--3679, 2291, -1394, 803, -424, 194, -67,
-0, -93, 244, -509, 937, -1597, 2600,
--4174, 6921, -13235, 52326, 29143, -10729, 5959,
--3651, 2273, -1383, 797, -421, 192, -66,
-0, -93, 244, -508, 934, -1591, 2589,
--4157, 6895, -13198, 52594, 28792, -10637, 5912,
--3623, 2256, -1372, 791, -417, 190, -65,
-0, -93, 243, -506, 930, -1584, 2579,
--4139, 6868, -13160, 52859, 28441, -10544, 5864,
--3594, 2238, -1361, 784, -413, 188, -64,
-0, -93, 242, -504, 927, -1577, 2567,
--4121, 6840, -13119, 53123, 28090, -10450, 5815,
--3565, 2220, -1350, 777, -410, 187, -64,
-0, -92, 241, -502, 923, -1570, 2555,
--4102, 6810, -13076, 53384, 27740, -10354, 5766,
--3535, 2201, -1338, 770, -406, 185, -63,
-0, -92, 240, -500, 919, -1563, 2543,
--4083, 6779, -13031, 53643, 27389, -10258, 5717,
--3505, 2183, -1327, 764, -402, 183, -62,
-0, -92, 240, -498, 914, -1555, 2530,
--4063, 6748, -12983, 53899, 27038, -10161, 5666,
--3475, 2164, -1315, 757, -398, 181, -61,
-0, -92, 239, -496, 910, -1547, 2517,
--4042, 6715, -12933, 54154, 26688, -10062, 5615,
--3444, 2144, -1303, 750, -394, 179, -61,
-0, -92, 238, -493, 905, -1539, 2504,
--4020, 6680, -12881, 54406, 26337, -9963, 5563,
--3413, 2125, -1291, 742, -390, 177, -60,
-0, -91, 237, -491, 900, -1531, 2490,
--3997, 6645, -12826, 54656, 25987, -9862, 5511,
--3381, 2105, -1279, 735, -386, 175, -59,
-0, -91, 236, -488, 896, -1522, 2475,
--3974, 6609, -12769, 54903, 25636, -9761, 5457,
--3349, 2085, -1266, 728, -382, 173, -58,
-0, -91, 234, -486, 890, -1513, 2460,
--3951, 6571, -12710, 55148, 25286, -9658, 5404,
--3317, 2065, -1254, 721, -378, 171, -58,
-0, -90, 233, -483, 885, -1504, 2445,
--3926, 6532, -12648, 55391, 24937, -9555, 5349,
--3284, 2044, -1241, 713, -374, 169, -57,
-0, -90, 232, -480, 880, -1494, 2429,
--3901, 6492, -12584, 55631, 24587, -9451, 5294,
--3251, 2024, -1228, 706, -370, 167, -56,
-0, -90, 231, -478, 874, -1485, 2413,
--3875, 6451, -12518, 55869, 24238, -9346, 5239,
--3217, 2003, -1215, 698, -366, 165, -55,
-0, -89, 230, -475, 869, -1475, 2397,
--3848, 6408, -12449, 56104, 23889, -9240, 5183,
--3183, 1982, -1202, 690, -362, 163, -54,
-0, -89, 228, -472, 863, -1464, 2379,
--3821, 6365, -12378, 56337, 23540, -9133, 5126,
--3149, 1960, -1189, 682, -358, 161, -54,
-0, -88, 227, -468, 857, -1454, 2362,
--3793, 6320, -12305, 56568, 23192, -9025, 5069,
--3114, 1938, -1176, 675, -353, 159, -53,
-0, -88, 225, -465, 850, -1443, 2344,
--3765, 6274, -12229, 56796, 22844, -8917, 5011,
--3079, 1917, -1162, 667, -349, 157, -52,
-0, -87, 224, -462, 844, -1432, 2326,
--3735, 6227, -12151, 57021, 22497, -8808, 4953,
--3044, 1895, -1149, 659, -345, 155, -51,
-0, -87, 222, -458, 838, -1420, 2307,
--3705, 6179, -12071, 57244, 22150, -8697, 4894,
--3008, 1872, -1135, 651, -340, 153, -51,
-0, -86, 221, -455, 831, -1409, 2288,
--3675, 6130, -11988, 57464, 21803, -8587, 4835,
--2972, 1850, -1121, 643, -336, 151, -50,
-0, -86, 219, -451, 824, -1397, 2268,
--3643, 6079, -11902, 57682, 21457, -8475, 4775,
--2936, 1827, -1107, 634, -332, 149, -49,
-0, -85, 218, -448, 817, -1384, 2248,
--3611, 6028, -11815, 57897, 21112, -8363, 4714,
--2899, 1804, -1093, 626, -327, 147, -48,
-0, -85, 216, -444, 810, -1372, 2228,
--3578, 5975, -11725, 58109, 20767, -8250, 4654,
--2862, 1781, -1079, 618, -323, 145, -47,
-0, -84, 214, -440, 803, -1359, 2207,
--3545, 5921, -11632, 58319, 20423, -8136, 4592,
--2825, 1758, -1065, 610, -318, 142, -47,
-0, -84, 212, -436, 795, -1346, 2186,
--3511, 5866, -11537, 58526, 20079, -8022, 4531,
--2788, 1734, -1051, 601, -314, 140, -46,
-0, -83, 211, -432, 787, -1333, 2164,
--3476, 5809, -11440, 58730, 19736, -7907, 4468,
--2750, 1711, -1036, 593, -309, 138, -45,
-0, -82, 209, -428, 780, -1320, 2142,
--3441, 5752, -11340, 58932, 19394, -7792, 4406,
--2712, 1687, -1022, 584, -305, 136, -44,
-0, -82, 207, -424, 772, -1306, 2119,
--3405, 5693, -11238, 59131, 19052, -7676, 4343,
--2673, 1663, -1007, 576, -300, 134, -43,
-0, -81, 205, -419, 764, -1292, 2096,
--3368, 5634, -11134, 59327, 18711, -7559, 4279,
--2634, 1639, -992, 567, -295, 132, -43,
-0, -80, 203, -415, 755, -1278, 2073,
--3330, 5573, -11027, 59521, 18371, -7442, 4215,
--2595, 1615, -977, 558, -291, 129, -42,
-0, -80, 201, -411, 747, -1263, 2049,
--3292, 5511, -10917, 59711, 18031, -7324, 4151,
--2556, 1590, -962, 550, -286, 127, -41,
-0, -79, 199, -406, 738, -1248, 2025,
--3254, 5448, -10806, 59899, 17693, -7206, 4086,
--2517, 1565, -947, 541, -281, 125, -40,
-0, -78, 196, -401, 730, -1233, 2000,
--3214, 5384, -10691, 60084, 17355, -7087, 4021,
--2477, 1541, -932, 532, -277, 123, -40,
-0, -77, 194, -397, 721, -1218, 1975,
--3174, 5318, -10575, 60266, 17018, -6968, 3956,
--2437, 1516, -917, 523, -272, 121, -39,
-0, -76, 192, -392, 712, -1203, 1950,
--3134, 5252, -10455, 60446, 16682, -6848, 3890,
--2397, 1491, -901, 514, -267, 119, -38,
-0, -76, 190, -387, 702, -1187, 1924,
--3092, 5185, -10334, 60622, 16347, -6728, 3824,
--2357, 1466, -886, 506, -262, 116, -37,
-0, -75, 187, -382, 693, -1171, 1898,
--3051, 5116, -10210, 60796, 16013, -6607, 3758,
--2316, 1440, -871, 497, -258, 114, -36,
-0, -74, 185, -377, 684, -1154, 1872,
--3008, 5046, -10084, 60966, 15680, -6486, 3691,
--2275, 1415, -855, 488, -253, 112, -36,
-0, -73, 182, -372, 674, -1138, 1845,
--2965, 4976, -9955, 61134, 15348, -6365, 3624,
--2234, 1389, -840, 479, -248, 110, -35,
-0, -72, 180, -366, 664, -1121, 1817,
--2921, 4904, -9824, 61299, 15016, -6243, 3557,
--2193, 1364, -824, 469, -243, 107, -34,
-0, -71, 177, -361, 654, -1104, 1790,
--2877, 4831, -9690, 61461, 14686, -6121, 3489,
--2152, 1338, -808, 460, -238, 105, -33,
-0, -70, 175, -356, 644, -1087, 1761,
--2832, 4757, -9554, 61620, 14357, -5999, 3421,
--2110, 1312, -792, 451, -234, 103, -33,
-0, -69, 172, -350, 634, -1070, 1733,
--2786, 4682, -9415, 61775, 14029, -5876, 3353,
--2068, 1286, -777, 442, -229, 101, -32,
-0, -68, 170, -344, 624, -1052, 1704,
--2740, 4606, -9274, 61928, 13702, -5753, 3285,
--2026, 1260, -761, 433, -224, 99, -31,
-0, -67, 167, -339, 613, -1034, 1675,
--2693, 4529, -9131, 62078, 13376, -5630, 3216,
--1984, 1234, -745, 424, -219, 96, -30,
-0, -66, 164, -333, 603, -1016, 1645,
--2646, 4451, -8985, 62225, 13052, -5507, 3148,
--1942, 1207, -729, 414, -214, 94, -29,
-0, -65, 161, -327, 592, -997, 1616,
--2598, 4371, -8837, 62369, 12728, -5383, 3079,
--1900, 1181, -713, 405, -209, 92, -29,
-0, -64, 159, -321, 581, -979, 1585,
--2549, 4291, -8686, 62510, 12406, -5259, 3009,
--1857, 1154, -697, 396, -204, 90, -28,
-0, -63, 156, -315, 570, -960, 1555,
--2500, 4210, -8533, 62647, 12085, -5135, 2940,
--1815, 1128, -680, 387, -199, 87, -27,
-0, -62, 153, -309, 559, -941, 1524,
--2450, 4128, -8378, 62782, 11765, -5011, 2870,
--1772, 1101, -664, 377, -195, 85, -26,
-0, -61, 150, -303, 547, -922, 1492,
--2400, 4044, -8220, 62914, 11447, -4887, 2801,
--1729, 1075, -648, 368, -190, 83, -26,
-0, -60, 147, -297, 536, -902, 1461,
--2349, 3960, -8060, 63042, 11130, -4762, 2731,
--1686, 1048, -632, 359, -185, 81, -25,
-0, -58, 144, -290, 524, -883, 1429,
--2298, 3875, -7897, 63167, 10814, -4638, 2661,
--1643, 1021, -616, 349, -180, 79, -24,
-0, -57, 141, -284, 513, -863, 1396,
--2246, 3789, -7732, 63290, 10499, -4513, 2591,
--1600, 994, -599, 340, -175, 76, -24,
-0, -56, 138, -278, 501, -842, 1363,
--2193, 3701, -7564, 63409, 10186, -4388, 2520,
--1557, 967, -583, 331, -170, 74, -23,
-0, -55, 134, -271, 489, -822, 1330,
--2140, 3613, -7394, 63525, 9875, -4263, 2450,
--1514, 940, -567, 321, -165, 72, -22,
-0, -54, 131, -264, 477, -802, 1297,
--2087, 3524, -7222, 63638, 9564, -4139, 2379,
--1470, 913, -550, 312, -160, 70, -21,
-0, -52, 128, -258, 464, -781, 1263,
--2033, 3434, -7048, 63747, 9255, -4014, 2309,
--1427, 886, -534, 303, -155, 68, -21,
-0, -51, 125, -251, 452, -760, 1229,
--1978, 3343, -6871, 63854, 8948, -3889, 2238,
--1383, 859, -517, 293, -151, 65, -20,
-0, -50, 121, -244, 440, -739, 1195,
--1923, 3251, -6691, 63957, 8642, -3764, 2167,
--1340, 832, -501, 284, -146, 63, -19,
-0, -48, 118, -237, 427, -717, 1160,
--1867, 3158, -6509, 64057, 8338, -3639, 2097,
--1296, 805, -485, 274, -141, 61, -19,
-0, -47, 115, -230, 414, -696, 1125,
--1811, 3064, -6325, 64154, 8035, -3515, 2026,
--1252, 778, -468, 265, -136, 59, -18,
-0, -46, 111, -223, 401, -674, 1090,
--1755, 2970, -6139, 64247, 7733, -3390, 1955,
--1209, 751, -452, 256, -131, 57, -17,
-0, -44, 108, -216, 388, -652, 1055,
--1698, 2874, -5950, 64338, 7434, -3265, 1884,
--1165, 723, -435, 246, -126, 55, -16,
-0, -43, 104, -209, 375, -630, 1019,
--1640, 2778, -5759, 64425, 7135, -3141, 1813,
--1121, 696, -419, 237, -121, 52, -16,
-0, -41, 100, -201, 362, -608, 983,
--1582, 2681, -5566, 64509, 6839, -3017, 1742,
--1078, 669, -402, 228, -116, 50, -15,
-0, -40, 97, -194, 349, -585, 946,
--1524, 2582, -5370, 64589, 6544, -2893, 1671,
--1034, 642, -386, 218, -112, 48, -14,
-0, -38, 93, -187, 335, -563, 910,
--1465, 2483, -5172, 64667, 6250, -2769, 1600,
--990, 615, -370, 209, -107, 46, -14,
-0, -37, 90, -179, 322, -540, 873,
--1405, 2384, -4971, 64741, 5959, -2645, 1530,
--946, 587, -353, 199, -102, 44, -13,
-0, -35, 86, -172, 308, -517, 835,
--1345, 2283, -4769, 64812, 5669, -2521, 1459,
--903, 560, -337, 190, -97, 42, -12,
-0, -34, 82, -164, 294, -494, 798,
--1285, 2182, -4564, 64880, 5380, -2398, 1388,
--859, 533, -320, 181, -92, 40, -12,
-0, -32, 78, -156, 281, -470, 760,
--1224, 2079, -4357, 64944, 5094, -2274, 1317,
--815, 506, -304, 172, -88, 38, -11,
-0, -31, 74, -149, 267, -447, 722,
--1163, 1976, -4147, 65005, 4809, -2152, 1247,
--772, 479, -288, 162, -83, 36, -10,
-0, -29, 71, -141, 253, -423, 684,
--1102, 1872, -3935, 65063, 4526, -2029, 1176,
--728, 452, -271, 153, -78, 33, -10,
-0, -28, 67, -133, 238, -400, 645,
--1040, 1768, -3721, 65117, 4245, -1907, 1106,
--685, 425, -255, 144, -73, 31, -9,
-0, -26, 63, -125, 224, -376, 607,
--977, 1662, -3505, 65168, 3965, -1784, 1035,
--641, 398, -239, 135, -69, 29, -9,
-0, -24, 59, -117, 210, -351, 568,
--915, 1556, -3287, 65216, 3688, -1663, 965,
--598, 371, -223, 125, -64, 27, -8,
-0, -23, 55, -109, 195, -327, 528,
--851, 1449, -3066, 65261, 3412, -1541, 895,
--554, 344, -206, 116, -59, 25, -7,
-0, -21, 51, -101, 181, -303, 489,
--788, 1342, -2843, 65302, 3138, -1420, 825,
--511, 317, -190, 107, -54, 23, -7,
-0, -19, 47, -93, 166, -278, 449,
--724, 1234, -2618, 65340, 2866, -1299, 755,
--468, 290, -174, 98, -50, 21, -6,
-0, -18, 43, -85, 152, -254, 409,
--660, 1125, -2391, 65374, 2595, -1179, 686,
--425, 263, -158, 89, -45, 19, -6,
-0, -16, 38, -76, 137, -229, 369,
--595, 1015, -2161, 65405, 2327, -1059, 616,
--382, 237, -142, 80, -41, 17, -5,
-0, -14, 34, -68, 122, -204, 329,
--530, 905, -1929, 65433, 2061, -940, 547,
--339, 210, -126, 71, -36, 15, -4,
-0, -13, 30, -60, 107, -179, 289,
--465, 794, -1696, 65458, 1796, -821, 478,
--296, 184, -110, 62, -31, 13, -4,
-0, -11, 26, -51, 92, -154, 248,
--400, 682, -1460, 65479, 1533, -702, 409,
--253, 157, -94, 53, -27, 11, -3,
-0, -9, 22, -43, 77, -128, 207,
--334, 570, -1222, 65497, 1273, -584, 340,
--211, 131, -78, 44, -22, 9, -3,
-0, -7, 17, -34, 62, -103, 166,
--268, 457, -982, 65511, 1014, -466, 272,
--168, 104, -63, 35, -18, 8, -2,
-0, -6, 13, -26, 46, -77, 125,
--201, 344, -739, 65523, 758, -349, 203,
--126, 78, -47, 26, -13, 6, -2,
-0, -4, 9, -17, 31, -52, 83,
--134, 230, -495, 65530, 503, -232, 135,
--84, 52, -31, 17, -9, 4, -1,
-0, -2, 4, -9, 15, -26, 42,
--67, 115, -248, 65535, 251, -116, 68,
--42, 26, -16, 9, -4, 2, -1,
-0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 65536, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0,
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_TABLE_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audio810_impl.h b/usr/src/uts/common/sys/audio/impl/audio810_impl.h
deleted file mode 100644
index 05baf89564..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio810_impl.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO810_IMPL_H_
-#define _SYS_AUDIO810_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-
-/*
- * Misc. defines
- */
-#define I810_IDNUM (0x6175)
-#define I810_MINPACKET (0)
-#define I810_MAXPACKET (1*1024)
-#define I810_HIWATER (64*1024)
-#define I810_LOWATER (32*1024)
-
-#define I810_DMA_PCM_IN (1)
-#define I810_DMA_PCM_OUT (2)
-
-#define I810_LAST_AC_REG (0x3A)
-
-#define I810_INIT_NO_RESTORE (1)
-#define I810_INIT_RESTORE (0)
-#define I810_CODEC_REG(r) ((r) >> 1)
-
-#define I845_AM_REGS_SIZE (0x200)
-#define I845_BM_REGS_SIZE (0x100)
-#define I810_AM_REGS_SIZE (0x100)
-#define I810_BM_REGS_SIZE (0x40)
-#define I810_BD_NUMS (32)
-#define I810_BD_SIZE \
- (I810_BD_NUMS * sizeof (i810_bd_entry_t))
-
-#define I810_BSIZE (8*1024)
-
-#define I810_NOT_SUSPENDED (0)
-#define I810_SUSPENDED (~I810_NOT_SUSPENDED)
-
-#define I810_MAX_CHANNELS (200) /* force max # chs */
-#define I810_MAX_HW_CHANNELS (32)
-#define I810_MAX_IN_CHANNELS (1)
-#define I810_MAX_OUT_CHANNELS \
- (I810_MAX_HW_CHANNELS - I810_MAX_IN_CHANNELS)
-#define I810_INPUT_STREAM (31)
-#define I810_PORT_UNMUTE (0xffffffff)
-
-#define I810_KIOP(X) ((kstat_intr_t *)(X->i810_ksp->ks_data))
-
-#define I810_MOD_SIZE (16)
-#define I810_PLAY_BUF_SZ (1024)
-#define I810_RECORD_BUF_SZ (1024)
-#define I810_BUF_MIN (512)
-#define I810_BUF_MAX (8192)
-
-/* The size of each entry of "reg" property is 5 integers */
-#define I810_INTS_PER_REG_PROP 5
-
-/* The index to the size of address space for each entry of "reg" property */
-#define I810_REG_PROP_ADDR_LEN_IDX 4
-
-/* offset from the base of specified DMA engine */
-#define I810_OFFSET_BD_BASE (0x00)
-#define I810_OFFSET_CIV (0x04)
-#define I810_OFFSET_LVI (0x05)
-#define I810_OFFSET_SR (0x06)
-#define I810_OFFSET_PICB (0x08)
-#define I810_OFFSET_PIV (0x0A)
-#define I810_OFFSET_CR (0x0B)
-
-/* DMA engine offset from base */
-#define I810_BASE_PCM_IN (0x00)
-#define I810_BASE_PCM_OUT (0x10)
-#define I810_BASE_MIC (0x20)
-
-/* PCM in bus master registers */
-#define I810_PCM_IN_BD_BASE (I810_OFFSET_BD_BASE)
-#define I810_PCM_IN_CIV (I810_OFFSET_CIV)
-#define I810_PCM_IN_LVI (I810_OFFSET_LVI)
-#define I810_PCM_IN_SR (I810_OFFSET_SR)
-#define I810_PCM_IN_PICB (I810_OFFSET_PICB)
-#define I810_PCM_IN_PIV (I810_OFFSET_PIV)
-#define I810_PCM_IN_CR (I810_OFFSET_CR)
-
-#define I810_PCM_OUT_BD_BASE (I810_OFFSET_BD_BASE + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_CIV (I810_OFFSET_CIV + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_LVI (I810_OFFSET_LVI + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_SR (I810_OFFSET_SR + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_PICB (I810_OFFSET_PICB + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_PIV (I810_OFFSET_PIV + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_CR (I810_OFFSET_CR + I810_BASE_PCM_OUT)
-
-
-#define I810_MIC_BD_BASE (I810_OFFSET_BD_BASE + I810_BASE_MIC)
-#define I810_MIC_CIV (I810_OFFSET_CIV + I810_BASE_MIC)
-#define I810_MIC_LVI (I810_OFFSET_LVI +I810_BASE_MIC)
-#define I810_MIC_SR (I810_OFFSET_SR + I810_BASE_MIC)
-#define I810_MIC_PICB (I810_OFFSET_PICB + I810_BASE_MIC)
-#define I810_MIC_PIV (I810_OFFSET_PIV + I810_BASE_MIC)
-#define I810_MIC_CR (I810_OFFSET_CR + I810_BASE_MIC)
-
-#define I810_REG_GCR 0x2C
-#define I810_REG_GSR 0x30
-#define I810_REG_CASR 0x34
-
-/* bits of bus master status register */
-#define I810_BM_SR_DCH 0x01
-#define I810_BM_SR_CELV 0x02
-#define I810_BM_SR_LVBCI 0x04
-#define I810_BM_SR_BCIS 0x08
-#define I810_BM_SR_FIFOE 0x10
-
-/* bits of bus master control register */
-#define I810_BM_CR_RUN 0x01
-#define I810_BM_CR_RST 0x02
-#define I810_BM_CR_LVBIE 0x04
-#define I810_BM_CR_FEIE 0x08
-#define I810_BM_CR_IOCE 0x10
-
-#define I810_BM_CR_PAUSE 0x00
-
-/*
- * Global Control Register
- */
-#define I810_GCR_GPIE 0x00000001
-#define I810_GCR_COLD_RST 0x00000002
-#define I810_GCR_WARM_RST 0x00000004
-#define I810_GCR_ACLINK_OFF 0x00000008
-#define I810_GCR_PRI_INTR_ENABLE 0x00000010
-#define I810_GCR_SEC_INTR_ENABLE 0x00000020
-
-/* For ICH2 or more, bit21:20 is the PCM 4/6-channel enable bits */
-#define I810_GCR_2_CHANNELS (0 << 20)
-#define I810_GCR_4_CHANNELS (1 << 20)
-#define I810_GCR_6_CHANNELS (2 << 20)
-#define I810_GCR_CHANNELS_MASK (3 << 20)
-
-/*
- * Global Status Register
- */
-#define I810_GSR_TRI_READY 0x10000000 /* for ICH4/5 */
-#define I810_GSR_READ_COMPL 0x00008000
-#define I810_GSR_INTR_SEC_RESUME 0x00000800
-#define I810_GSR_INTR_PRI_RESUME 0x00000400
-#define I810_GSR_SEC_READY 0x00000200
-#define I810_GSR_PRI_READY 0x00000100
-#define I810_GSR_INTR_MIC 0x00000080
-#define I810_GSR_INTR_POUT 0x00000040
-#define I810_GSR_INTR_PIN 0x00000020
-#define I810_GSR_INTR_MO 0x00000004
-#define I810_GSR_INTR_MI 0x00000002
-#define I810_GSR_INTR_GSI 0x00000001
-#define I810_GSR_USE_INTR 0x00000060 /* PCM-IN ,PCM-OUT */
-
-/*
- * Macro for AD1980 codec
- */
-#define AD1980_VID1 0x4144
-#define AD1980_VID2 0x5370
-#define AD1985_VID2 0x5375
-#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
-#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
-#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
-#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
-/*
- * chunk buffer
- */
-struct i810_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct i810_bdlist_chunk i810_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct i810_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- i810_bdlist_chunk_t chunk[2]; /* 2 chunks for each buffers */
-};
-typedef struct i810_sample_buf i810_sample_buf_t;
-
-
-/*
- * buffer descripter list entry, sees datasheet
- */
-struct i810_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t reserved:14;
- uint8_t cmd_bup:1;
- uint8_t cmd_ioc:1;
-};
-typedef struct i810_bd_entry i810_bd_entry_t;
-
-/*
- * audio810_state_t -per instance state and operation data
- */
-struct audio810_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audio810_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64]; /* shadow of AC97 registers */
-
- boolean_t var_sr; /* variable sample rate ? */
- boolean_t swap_out; /* swap line-out and sur-out */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- ddi_acc_handle_t bm_regs_handle; /* for bus master register */
- caddr_t am_regs_base; /* base of audio mixer regs */
- caddr_t bm_regs_base; /* base of bus master regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- void *bdl_virtual; /* virtual address of BDL */
- size_t bdl_size; /* real len of BDL */
- i810_bd_entry_t *bdl_virt_pin; /* vaddr of PCM in BDL */
- i810_bd_entry_t *bdl_virt_pout; /* vaddr of PCM out BDL */
- uint32_t bdl_phys_pin; /* phys addr of PCM in BDL */
- uint32_t bdl_phys_pout; /* phys addr of PCM in BDL */
-
- i810_sample_buf_t play_buf; /* buffer for playback */
- i810_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t i810_defaults; /* default state for dev */
- audio_device_t i810_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *i810_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t i810_psample_rate; /* play sample rate */
- uint_t i810_pchannels; /* play channels */
- uint_t i810_pprecision; /* play precision */
- uint_t i810_csample_rate; /* record sample rate */
- uint_t i810_cchannels; /* record channels */
- uint_t i810_cprecision; /* record precision */
- uint_t i810_output_port; /* current out port */
- uint_t i810_input_port; /* current input port */
- uint_t i810_monitor_gain; /* monitor gain */
- int i810_csamples; /* pcm-in samples/interrupt */
- int i810_psamples; /* pcm-out samples/intr */
-
- uint32_t i810_res_flags; /* resource flags */
- int i810_suspended; /* suspend/resume state */
- int i810_busy_cnt; /* device busy count */
- kcondvar_t i810_cv; /* suspend/resume cond. var */
-};
-typedef struct audio810_state audio810_state_t;
-
-/* audio810_state_t.flags defines */
-#define I810_DMA_PLAY_STARTED 0x00000001 /* play DMA eng. initialized */
-#define I810_DMA_PLAY_PAUSED 0x00000002 /* play DMA engine paused */
-#define I810_DMA_PLAY_EMPTY 0x00000004 /* play DMA engine empty */
-#define I810_DMA_RECD_STARTED 0x00000010 /* record DMA engine started */
-
-
-
-/* bits of audio810_state_t.i810_res_flags */
-#define I810_RS_PCI_REGS 0x0001
-#define I810_RS_AM_REGS 0x0002
-#define I810_RS_BM_REGS 0x0004
-#define I810_RS_DMA_BDL_HANDLE 0x0008
-#define I810_RS_DMA_BDL_MEM 0x0010
-#define I810_RS_DMA_BDL_BIND 0x0020
-
-
-/*
- * Useful bit twiddlers
- */
-#define I810_BM_GET8(reg) \
- ddi_get8(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_GET16(reg) \
- ddi_get16(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_GET32(reg) \
- ddi_get32(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_PUT8(reg, val) \
- ddi_put8(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_BM_PUT16(reg, val) \
- ddi_put16(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_BM_PUT32(reg, val) \
- ddi_put32(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_AM_GET16(reg) \
- ddi_get16(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)))
-
-#define I810_AM_PUT16(reg, val) \
- ddi_put16(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)), (val))
-
-#endif /* _KERNEL */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO810_IMPL_H_ */
diff --git a/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h b/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h
deleted file mode 100644
index 0dec342e63..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the audio mixer
- * audio personality module. It is NOT to be distributed with Solaris or
- * included in any audio drivers.
- */
-
-#ifndef _SYS_AUDIO_MIXER_IMPL_H
-#define _SYS_AUDIO_MIXER_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AM_MAX_GAIN_SHIFT 8 /* 1 more then 255, but close */
-#define AM_BALANCE_SHIFT 5
-
-#define AM_MIN_CHS 1
-
-/*
- * Flow control is used to keep too many buffers from being allocated.
- * However, sometimes we come across apps that have a problem with flow
- * control. Therefore we can comment out and turn off flow control temporarily
- * so we can debug the app and come up with a work around.
- */
-#define FLOW_CONTROL
-
-/*
- * Miscellaneous defines
- */
-#define AM_INT16_SHIFT 1
-#define AM_INT32_SHIFT 2
-#define AM_256_SHIFT 8
-#define AM_8_SHIFT 3
-#define AM_HALF_ENERGY_SHIFT 1
-#define AM_TIMES_2_SHIFT 1
-#define AM_TIMES_4_SHIFT 2
-#define AM_TIMES_8_SHIFT 3
-#define AM_TIMES_16_SHIFT 4
-#define AM_TIMES_32_SHIFT 5
-
-#define AM_MIN_MIX_BUFSIZE 48000
-#define AM_DEFAULT_MIX_BUFSIZE (AM_MIN_MIX_BUFSIZE * 4 * 2)
-#define AM_MAX_QUEUED_MSGS_CNT 500
-#define AM_MIN_QUEUED_MSGS_CNT 200
-
-#define AM_DEFAULT_MIXER_GAIN (AUDIO_MAX_GAIN*3/4)
-
-#define AM_MAX_QUEUED_MSGS 4
-
-#define AM_MAX_SAMPLES (1024*1024)
-
-#define AM_SINGLE_OPEN 0
-#define AM_MULTIPLE_OPEN 1
-
-#define AM_NOT_MUTED 0
-#define AM_MUTED (~AM_NOT_MUTED)
-
-#define AM_NO_FORCE 0
-#define AM_FORCE (~AM_NO_FORCE)
-
-#define AM_NO_SERIALIZE 0
-#define AM_SERIALIZE (~AM_NO_SERIALIZE)
-
-#define AM_MISC_MASK 0x00000003
-#define AM_CHAR2INT_MASK 0x000000ff
-
-#define AM_NO_PID 0
-#define AM_SET_WAITING 1
-#define AM_CLEAR_WAITING 0
-#define AM_SET_RECORD 1
-#define AM_NOT_RECORD 0
-#define AM_SET_PLAY 1
-#define AM_NOT_PLAY 0
-
-#define AM_EXTRA_SAMPLES 16
-
-/* Private mixer return codes */
-#define AM_CHNL_CLOSED (-2) /* Channel closed while processing */
-
-/*
- * The sample rate conversion handle is implemented as the channel pointer.
- * But the sample rate converter doesn't have to know about this at all.
- */
-#define AM_SRC_CHPTR2HDL(chptr) ((srchdl_t)(chptr))
-#define AM_SRC_HDL2CHPTR(hdl) ((audio_ch_t *)(hdl))
-
-/* audio mixer ioctl/iocdata commands */
-#define AM_COPY_OUT_AUDIOINFO (MIOC|1) /* AUDIO_GETINFO */
-#define AM_COPY_OUT_AUDIOINFO2 (MIOC|2) /* AUDIO_SETINFO */
-#define AM_COPY_IN_AUDIOINFO (MIOC|3) /* AUDIO_SETINFO */
-#define AM_COPY_IN_DIAG_LOOPB (MIOC|4) /* AUDIO_DIAG_LOOPBACK */
-#define AM_COPY_OUT_GETDEV (MIOC|5) /* AUDIO_GETDEV */
-#define AM_COPY_OUT_SAMP_RATES (MIOC|6) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_IN_SAMP_RATES (MIOC|7) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_IN_SAMP_RATES2 (MIOC|8) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_OUT_MIXCTLINFO (MIOC|9) /* AUDIO_MIXERCTL_GETINFO */
-#define AM_COPY_IN_MIXCTLINFO (MIOC|10) /* AUDIO_MIXERCTL_SETINFO */
-#define AM_COPY_OUT_MIXCTL_CHINFO (MIOC|11) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_CHINFO2 (MIOC|12) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_IN_MIXCTL_GET_CHINFO (MIOC|13) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_GET_CHINFO (MIOC|14) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_GET_CHINFO2 (MIOC|15) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_IN_MIXCTL_SET_CHINFO (MIOC|16) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_IN_MIXCTL_SET_CHINFO2 (MIOC|17) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_MODE (MIOC|18) /* AUDIO_MIXERCTL_GET_MODE */
-#define AM_COPY_IN_MIXCTL_MODE (MIOC|19) /* AUDIO_MIXERCTL_SET_MODE */
-
-/*
- * am_ch_private_t - audio mixer channel private data
- */
-struct am_ch_private {
- uint_t acp_flags; /* channel flags */
- boolean_t acp_reading; /* true for RD channel */
- boolean_t acp_writing; /* true for WR channel */
- int acp_EOF[2]; /* # of EOF signals to send */
- int acp_EOF_toggle; /* toggle for EOF signals */
- int acp_psamples_f; /* sample frame count mp_orig */
- int acp_psamples_c; /* samples in buf to play */
- int acp_psamples_p; /* samples in played buf */
- int acp_busy_cnt; /* # of calls outstanding */
- mblk_t *acp_drain_mp; /* saved mblk_t for DRAIN */
- mblk_t *acp_rec_mp; /* record message block */
- int acp_rec_remaining; /* # bytes left in mp buf */
- int *acp_play_samp_buf; /* play sample buf space */
- size_t acp_psb_size; /* size of play_samp_buf */
- void *acp_play_src_data; /* play src data */
- void *acp_rec_src_data; /* rec. src data */
- void *acp_ch_psrc1; /* play src buffer #1 */
- void *acp_ch_psrc2; /* play src buffer #2 */
- void *acp_ch_pconv1; /* play conversion buffer #1 */
- void *acp_ch_pconv2; /* play conversion buffer #1 */
- size_t acp_ch_psrc_siz; /* play src buffer size */
- size_t acp_ch_pconv_siz; /* play converter buf. size */
- size_t acp_ch_pbuf_size; /* play prebuffer size */
- void *acp_ch_rsrc1; /* record src buffer #1 */
- void *acp_ch_rsrc2; /* record src buffer #2 */
- void *acp_ch_rconv1; /* record conv. buffer #1 */
- void *acp_ch_rconv2; /* record conv. buffer #1 */
- size_t acp_ch_rsrc_siz; /* record src buffer size */
- size_t acp_ch_rconv_siz; /* record converter buf siz */
- size_t acp_ch_rbuf_size; /* record prebuffer size */
-};
-typedef struct am_ch_private am_ch_private_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_lock, am_ch_private))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_ch_private::acp_play_src_data))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_ch_private::acp_rec_src_data))
-
-/* am_ch_private.acp_flags defines */
-#define AM_CHNL_OPEN 0x00001u /* channel open if set */
-#define AM_CHNL_MULTI_OPEN 0x00002u /* PID may open multiple streams */
-#define AM_CHNL_DRAIN 0x00004u /* want drain semantics if set */
-#define AM_CHNL_DRAIN_NEXT_INT 0x00008u /* signal drain on next intr, step 1 */
-#define AM_CHNL_CLOSING 0x00010u /* the channel is being closed */
-#define AM_CHNL_ALMOST_EMPTY1 0x00020u /* 0 data for ch but data in DMA buf */
-#define AM_CHNL_ALMOST_EMPTY2 0x00040u /* 0 data for ch but data in DMA buf */
-#define AM_CHNL_EMPTY 0x00080u /* the channel doesn't have any data */
-#define AM_CHNL_CONTROL 0x00100u /* AUDIOCTL in same proc as AUDIO */
-#define AM_CHNL_CLIMIT 0x00200u /* used 2 limit allocb() failed msgs */
-#define AM_CHNL_PFLOW 0x00400u /* play side has been flow cntrlled */
-#define AM_CHNL_RSTREAMS_SET 0x00800u /* rec side's STREAMS H2O marks set */
-#define AM_CHNL_MSG_ON_QUEUE 0x01000u /* data message on STREAMS Q */
-#define AM_CHNL_IOCTL_TASK 0x08000u /* ioctl() task scheduled */
-#define AM_CHNL_QPROCSOFF 0x10000u /* qprocsoff() has been called */
-#define AM_CHNL_SIGNAL_NEEDED 0x20000u /* someone needs to send a signal */
-
-/*
- * am_apm_persist_t - audio mixer persistent private state data
- */
-struct am_apm_persist {
- int apm_mode; /* mixer mode */
- int apm_mpgain; /* saved master play gain, mixer mode */
- int apm_mpbal; /* saved master play bal, mixer mode */
- int apm_mrgain; /* saved master rec. gain, mixer mode */
- int apm_mrbal; /* saved master rec. bal, mixer mode */
- uint_t apm_pgain; /* saved play gain */
- uint_t apm_pbal; /* saved play balance */
- uint_t apm_pport; /* saved play port */
- uint_t apm_pmute; /* saved output muted */
- uint_t apm_rgain; /* saved record gain */
- uint_t apm_rbal; /* saved record balance */
- uint_t apm_rport; /* saved record port */
- uint_t apm_mgain; /* saved monitor gain */
-};
-typedef struct am_apm_persist am_apm_persist_t;
-
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mode))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mpgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mpbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mrgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mrbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pport))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pmute))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rport))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mgain))
-
-/*
- * am_apm_private_t - audio mixer state private data
- */
-struct am_apm_private {
- kmutex_t am_mode_lock; /* lock for mode switch cv */
- kcondvar_t am_mode_cv; /* used to switch modes only */
- kmutex_t am_ad_lock; /* lock for calling driver */
- kcondvar_t am_ad_cv; /* serializes calls into drvr */
- int am_ad_in; /* set when calling driver */
- audio_info_t am_hw_info; /* pseudo hardware state */
- mblk_t *am_sig_mp; /* signal STREAMS message */
- audio_taskq_t am_taskq; /* h/w task queue */
- void *am_args; /* qtimeout() args */
- int *am_mix_buf; /* buffer to mix audio in */
- size_t am_mix_size; /* the size of the buffer */
- int *am_send_buf; /* buffer to send audio from */
- size_t am_send_size; /* the size of the buffer */
- uint_t am_flags; /* flags for the audio mixer */
- uint_t am_pflags; /* play flags for the mixer */
- uint_t am_rflags; /* record flags for the mixer */
- int am_channels; /* current channels */
- int am_in_chs; /* current record channels */
- int am_out_chs; /* current play channels */
- int am_max_in_chs; /* R/O, max input channels */
- int am_max_out_chs; /* R/O, max output channels */
- uint_t am_hw_pchs; /* the real h/w play channels */
- uint_t am_hw_pprec; /* the real h/w play prec. */
- uint_t am_hw_penc; /* the real h/w play encoding */
- uint_t am_hw_rchs; /* the real h/w rec. channels */
- uint_t am_hw_rprec; /* the real h/w rec. prec. */
- uint_t am_hw_renc; /* the real h/w rec. encoding */
- uint_t am_save_psr; /* saved play sample rate */
- uint_t am_save_rsr; /* saved record sample rate */
- uint_t am_save_hw_rgain; /* saved h/w record gain */
- am_apm_persist_t *am_pstate; /* persistent state */
-};
-typedef struct am_apm_private am_apm_private_t;
-
-/* defines for am_apm_private.am_ad_in */
-#define AM_APM_IN_DRIVER 0x00000001 /* mixer is calling driver */
-#define AM_APM_FREEZE 0x00000002 /* mixer can't call driver */
-#define AM_APM_FORCE 0x00000004 /* force driver calls */
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock, am_apm_private::am_flags))
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock,
- am_apm_private::am_send_size))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_channels))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_in_chs))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_out_chs))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_send_buf))
-
-/*
- * These are modified only when the taskq lock is held, which ensures a
- * single thread.
- */
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_hw_info))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_save_hw_rgain))
-
-/*
- * Further analysis is needed on the structure members of am_apm_private.
- */
-_NOTE(MUTEX_PROTECTS_DATA(am_apm_private::am_ad_lock, am_apm_private::am_ad_in))
-
-_NOTE(READ_ONLY_DATA(am_apm_private::am_hw_pchs
- am_apm_private::am_hw_penc
- am_apm_private::am_hw_pprec
- am_apm_private::am_hw_rchs
- am_apm_private::am_hw_renc
- am_apm_private::am_hw_rprec))
-
-/* am_apm_private.am_flags defines */
-#define AM_PRIV_ON_LINE 0x00000001u /* device on line */
-#define AM_PRIV_SW_MODES 0x00000002u /* switch between M & C mode */
-
-/* am_apm_private.am_pflags and .am_rflags defines */
-#define AM_PRIV_CH_MONO 0x00000001u /* mono supported */
-#define AM_PRIV_CH_STEREO 0x00000002u /* stereo supported */
-#define AM_PRIV_16_PCM 0x00000004u /* 16-bit PCM supported */
-#define AM_PRIV_8_PCM 0x00000008u /* 8-bit PCM supported */
-#define AM_PRIV_8_ULAW 0x00000010u /* 8-bit u-Law supported */
-#define AM_PRIV_8_ALAW 0x00000020u /* 8-bit A-Law supported */
-#define AM_PRIV_16_TRANS 0x00000040u /* do 16-bit unsigned trans */
-#define AM_PRIV_8_TRANS 0x00000080u /* do 8-bit unsigned trans */
-
-#define AM_PRIV_TASKQ_NAME "audio_mixer_taskq" /* taskq name */
-
-/*
- * The following data structures are used by taskq_dispatch() to queue up
- * ioctl() requests.
- */
-struct am_ioctl_args {
- queue_t *aia_q; /* STREAMS queue */
- mblk_t *aia_mp; /* ioctl() message block */
-};
-typedef struct am_ioctl_args am_ioctl_args_t;
-
-struct am_state_ch_args {
- audio_state_t *asca_statep; /* device state structure */
- audio_apm_info_t *asca_apm_infop; /* mixer infop */
- int asca_cmd; /* hw state change command */
- int asca_dir; /* direction for the update */
- int asca_value; /* value for cmd to use */
-};
-typedef struct am_state_ch_args am_state_ch_args_t;
-
-/*
- * Used only to execute a task off the taskq, so it is not shared.
- * am_sample_rates_t is defined in mixer.h.
- */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_state_ch_args))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_sample_rates))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_ioctl_args))
-
-/* steams stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyreq))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyresp))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", datab))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", queue))
-
-/* other unshared/stable or no lock needed stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_channel))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_i_state))
-_NOTE(SCHEME_PROTECTS_DATA("method", audio_info))
-
-
-/*
- * The following routines are provided by the different source code
- * modules that make up the audio mixer.
- *
- * From am_main.c
- */
-int am_open_audio(queue_t *, dev_t *, int, int, cred_t *);
-int am_open_audioctl(queue_t *, dev_t *, int, int, cred_t *);
-int am_close_audio(queue_t *, int, cred_t *);
-int am_close_audioctl(queue_t *, int, cred_t *);
-int am_restore_state(audio_state_t *, audio_apm_info_t *, int);
-int am_save_state(audio_state_t *, audio_apm_info_t *, int);
-void am_apply_gain_balance(int *, int, int, int, int);
-void am_convert_int_mono_stereo(int *, int *, int *, int, int);
-void am_convert_to_int(void *, int *, int, int, int, int);
-int am_reprocess(audio_ch_t *, audio_data_t *data);
-void am_send_signal(audio_state_t *, am_apm_private_t *);
-int am_update_conv_buffer(audio_ch_t *, size_t, int);
-int am_update_src_buffer(audio_ch_t *, int, uint_t, int);
-
-/*
- * From am_ad.c
- */
-void am_ad_pause_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int);
-int am_ad_set_config(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int);
-int am_ad_set_format(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int, int);
-int am_ad_setup(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int, int);
-int am_ad_start_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int);
-int am_ad_start_record(audio_state_t *, am_apm_private_t *, am_ad_info_t *,
- int, int);
-void am_ad_stop_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int);
-void am_ad_stop_record(audio_state_t *, am_apm_private_t *, am_ad_info_t *,
- int);
-void am_ad_teardown(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int);
-int am_ck_channels(am_ad_ch_cap_t *, uint_t, boolean_t);
-int am_ck_combinations(am_ad_cap_comb_t *, int, int, boolean_t);
-int am_ck_sample_rate(am_ad_ch_cap_t *, int, int);
-void am_safe_putnext(audio_ch_t *, mblk_t *);
-int am_test_canputnext(audio_ch_t *);
-int am_set_record_streams(audio_ch_t *);
-
-/*
- * From am_ioctl.c
- */
-int am_wiocdata(queue_t *, mblk_t *, audio_ch_t *);
-int am_wioctl(queue_t *, mblk_t *, audio_ch_t *);
-void am_audio_drained(audio_ch_t *);
-int am_audio_set_info(audio_ch_t *, audio_info_t *, audio_info_t *);
-int am_set_format(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int, int, int);
-int am_set_gain(audio_state_t *, audio_apm_info_t *, uint_t, uint_t,
- uint_t, int, int, int, int);
-
-/*
- * From g711.h
- */
-extern int16_t _8alaw2linear16[256];
-extern int8_t _8alaw2linear8[256];
-extern int16_t _8ulaw2linear16[256];
-extern int8_t _8ulaw2linear8[256];
-extern uint8_t _13linear2alaw8[0x2000];
-extern uint8_t _14linear2ulaw8[0x4000];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_MIXER_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audio_support_impl.h b/usr/src/uts/common/sys/audio/impl/audio_support_impl.h
deleted file mode 100644
index 8b77323ef6..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio_support_impl.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the audio support
- * module. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AUDIO_SUPPORT_IMPL_H
-#define _SYS_AUDIO_SUPPORT_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AUDIO_MINOR_AUDIO 0 /* /dev/audio */
-#define AUDIO_MINOR_AUDIOCTL 1 /* /dev/audioctl */
-#define AUDIO_MINOR_WAVE_TABLE 2 /* reserved for future */
-#define AUDIO_MINOR_MIDI_PORT 3 /* reserved for future */
-#define AUDIO_MINOR_TIME 4 /* reserved for future */
-#define AUDIO_MINOR_USER1 7 /* reserved for future */
-#define AUDIO_MINOR_USER2 8 /* reserved for future */
-#define AUDIO_MINOR_USER3 9 /* reserved for future */
-
-#define AUDIO_MAX(a, b) ((a) > (b) ? (a) : (b))
-#define AUDIO_MAX4(w, x, y, z) AUDIO_MAX(AUDIO_MAX(w, x), \
- AUDIO_MAX(y, z))
-
-/* audio support ioctl/iocdata commands */
-#define AUDIO_COPY_OUT_CH_NUMBER (AIOC|1) /* AUDIO_GET_CH_NUM */
-#define AUDIO_COPY_OUT_CH_TYPE (AIOC|2) /* AUDIO_GET_CH_TYPE */
-#define AUDIO_COPY_OUT_NUM_CHS (AIOC|3) /* AUDIO_GET_NUM_CHS */
-#define AUDIO_COPY_OUT_AD_DEV (AIOC|4) /* AUDIO_GET_AD_DEV */
-#define AUDIO_COPY_OUT_APM_DEV (AIOC|5) /* AUDIO_GET_APM_DEV */
-#define AUDIO_COPY_OUT_AS_DEV (AIOC|6) /* AUDIO_GET_AS_DEV */
-
-/*
- * Macros used to convert between the opaque audio taskq handles and the
- * true taskq handles. Also standard taskq defines.
- */
-#define AUDIO_AUDIOTQHDL2TQHDL(atqhdl) ((taskq_t *)(atqhdl))
-#define AUDIO_TQHDL2AUDIOTQHDL(tqhdl) ((audio_taskq_t)(tqhdl))
-
-#define AUDIO_SUP_TASKQ_NTHREADS (1)
-#define AUDIO_SUP_TASKQ_MINALLOC 4 /* min taskq structs */
-#define AUDIO_SUP_TASKQ_MAXALLOC 100 /* max taskq structs */
-
-/*
- * audio_inst_list_t - structure that describes the audio device instance
- */
-struct audio_inst_info {
- struct audio_inst_info *ail_next; /* linking in driver list */
- audio_state_t ail_state; /* state struct for this inst */
-};
-typedef struct audio_inst_info audio_inst_info_t;
-
-/*
- * audio_qptr_t - structure used to store private data in the STREAM
- */
-struct audio_qptr {
- dev_t aq_dev; /* device name */
- void *aq_data; /* STREAM private data */
-};
-typedef struct audio_qptr audio_qptr_t;
-
-/* audiosup module key for persistent memory, one per system */
-#define AUDIO_SUP_KEY "AUDIO:audiosup master anchor key"
-
-/* audiosup module instance key for persistent memory, one per dev instance */
-#define AUDIO_KEY_CLASS "AUDIO:"
-
-/*
- * audio_apm_persist_t - structure for instance APM persistent memory storage
- */
-struct audio_apm_persist {
- audio_device_type_e ap_apm_type; /* APM type, one per instance */
- void *ap_data; /* per APM data */
- size_t ap_size; /* size of the data */
- struct audio_apm_persist *ap_next; /* next item */
-};
-typedef struct audio_apm_persist audio_apm_persist_t;
-
-/*
- * audio_inst_persist_t - instance persistent data
- */
-struct audio_inst_persist {
- char *amp_key; /* persistent data key */
- major_t amp_major; /* device major number */
- int amp_instance; /* instance number */
- audio_apm_persist_t *amp_apmp; /* ptr to APM persistent data */
- struct audio_inst_persist *amp_next; /* next structure */
-};
-typedef struct audio_inst_persist audio_inst_persist_t;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_SUPPORT_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audioixp_impl.h b/usr/src/uts/common/sys/audio/impl/audioixp_impl.h
deleted file mode 100644
index 4ce55d8e16..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audioixp_impl.h
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOIXP_IMPL_H_
-#define _SYS_AUDIOIXP_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-#define IXP_CONFIG_REGS (0) /* PCI configure register */
-#define IXP_IO_AM_REGS (1) /* PCI base register 0x10 */
-
-#define IXP_IDNUM (0x6175)
-#define IXP_MINPACKET (0)
-#define IXP_MAXPACKET (1*1024)
-#define IXP_HIWATER (64*1024)
-#define IXP_LOWATER (32*1024)
-
-#define IXP_DMA_PCM_IN (1)
-#define IXP_DMA_PCM_OUT (2)
-
-#define IXP_KIOP(X) ((kstat_intr_t *)(X->ixp_ksp->ks_data))
-
-/*
- * PCI configuration registers and bits
- */
-#define IXP_PCI_REG_VID (0x00)
-#define IXP_PCI_VID (0x1002)
-
-#define IXP_PCI_REG_DID (0x02)
-#define IXP_PCI_DID (0x4370)
-
-#define IXP_PCI_REG_CMD (0x04)
-#define IXP_PCI_CMD_MEM_ACC_EN (0x0002)
-#define IXP_PCI_CMD_MASTER_EN (0x0004)
-#define IXP_PCI_CMD_MEM_WR_INVAL_EN (0x0010)
-#define IXP_PCI_CMD_PARITY_ERR_RESP (0x0040)
-#define IXP_PCI_CMD_SERR_EN (0x0100)
-#define IXP_PCI_CMD_INTA_EN (0x0400)
-
-#define IXP_PCI_REG_STS (0x06)
-#define IXP_PCI_STS_INTA (0x0008)
-#define IXP_PCI_STS_CAP_LIST (0x0010)
-#define IXP_PCI_STS_66M_CAP (0x0020)
-#define IXP_PCI_STS_FAST_B2B_CAP (0x0080)
-#define IXP_PCI_STS_MASTER_PARITY_ERROR (0x0100)
-#define IXP_PCI_STS_RECEIVED_TARGET_ABORT (0x1000)
-#define IXP_PCI_STS_RECEIVED_MASTER_ABORT (0x2000)
-#define IXP_PCI_STS_SERR (0x4000)
-#define IXP_PCI_STS_PARITY_ERR (0x8000)
-
-#define IXP_PCI_REG_REV_ID_CLS_CODE (0x08)
-#define IXP_PCI_REV_ID_400 (0x00)
-#define IXP_PCI_REV_ID_450 (0x80)
-#define IXP_PCI_CLS_CODE (0x040100)
-
-#define IXP_PCI_REG_CACHE_LINE_SIZE (0x0c)
-#define IXP_PCI_REG_LATENCY_TIMER (0x0d)
-#define IXP_PCI_REG_HEADER_TYPE (0x0e)
-#define IXP_PCI_REG_BUILTIN_SELF_TEST (0x0f)
-#define IXP_PCI_REG_BA0 (0x10)
-#define IXP_PCI_REG_BA1 (0x14)
-#define IXP_PCI_REG_BA2 (0x18)
-#define IXP_PCI_REG_BA3 (0x1c)
-#define IXP_PCI_REG_BA4 (0x20)
-#define IXP_PCI_REG_BA5 (0x24)
-#define IXP_PCI_REG_CARDBUS_CIS_POINTER (0x28)
-#define IXP_PCI_REG_SUB_ID (0x2c)
-#define IXP_PCI_REG_EX_ROM_BA (0x30)
-#define IXP_PCI_REG_CAP_P (0x34)
-#define IXP_PCI_REG_INT_LINE (0x3c)
-#define IXP_PCI_REG_INT_PIN (0x3d)
-#define IXP_PCI_REG_MIN_GRANT (0x3e)
-#define IXP_PCI_REG_MAX_LATENCY (0x3f)
-#define IXP_PCI_REG_MSI_CAP_REG_SET_ID (0x40)
-#define IXP_PCI_REG_MSI_MSG_CTRL (0x42)
-#define IXP_PCI_REG_MSI_MSG_ADDR (0x44)
-#define IXP_PCI_REG_MSI_MSG_DATA (0x48)
-#define IXP_PCI_REG_MSI_PROGRAM_WEIGHT (0x4c)
-#define IXP_PCI_REG_UNMASK_LATENCY_TIMER_EXPIRATION (0x50)
-
-/*
- * Audio controller registers and bits
- */
-#define IXP_AUDIO_INT (0x00)
-#define IXP_AUDIO_INT_IN_DMA_OVERFLOW (1U<<0)
-#define IXP_AUDIO_INT_IN_DMA (1U<<1)
-#define IXP_AUDIO_INT_OUT_DMA_UNDERFLOW (1U<<2)
-#define IXP_AUDIO_INT_OUT_DMA (1U<<3)
-#define IXP_AUDIO_INT_CODEC0_NOT_READY (1U<<10)
-#define IXP_AUDIO_INT_CODEC1_NOT_READY (1U<<11)
-#define IXP_AUDIO_INT_CODEC2_NOT_READY (1U<<12)
-#define IXP_AUDIO_INT_NEW_FRAME (1U<<13)
-
-#define IXP_AUDIO_INT_EN (0x04)
-#define IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW (1U<<0)
-#define IXP_AUDIO_INT_EN_STATUS (1U<<1)
-#define IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW (1U<<2)
-#define IXP_AUDIO_INT_EN_CODEC0_NOT_READY (1U<<10)
-#define IXP_AUDIO_INT_EN_CODEC1_NOT_READY (1U<<11)
-#define IXP_AUDIO_INT_EN_CODEC2_NOT_READY (1U<<12)
-#define IXP_AUDIO_INT_EN_NEW_FRAME (1U<<13)
-
-#define IXP_AUDIO_CMD (0x08)
-#define IXP_AUDIO_CMD_POWER_DOWN (1U<<0)
-#define IXP_AUDIO_CMD_EN_IN (1U<<1)
-#define IXP_AUDIO_CMD_EN_OUT (1U<<2)
-#define IXP_AUDIO_CMD_EN_IN_DMA (1U<<8)
-#define IXP_AUDIO_CMD_EN_OUT_DMA (1U<<9)
-#define IXP_AUDIO_CMD_INTER_IN (1U<<21)
-#define IXP_AUDIO_CMD_INTER_OUT (1U<<22)
-#define IXP_AUDIO_CMD_BURST_EN (1U<<25)
-#define IXP_AUDIO_CMD_AC_ACTIVE (1U<<28)
-#define IXP_AUDIO_CMD_AC_SOFT_RESET (1U<<29)
-#define IXP_AUDIO_CMD_AC_SYNC (1U<<30)
-#define IXP_AUDIO_CMD_AC_RESET (1U<<31)
-
-#define IXP_AUDIO_OUT_PHY_ADDR_DATA (0x0c)
-#define IXP_AUDIO_OUT_PHY_PRIMARY_CODEC (0u)
-#define IXP_AUDIO_OUT_PHY_SECOND_CODEC (1u)
-#define IXP_AUDIO_OUT_PHY_THIRD_CODEC (2u)
-#define IXP_AUDIO_OUT_PHY_READ (1u<<2)
-#define IXP_AUDIO_OUT_PHY_WRITE (0u)
-#define IXP_AUDIO_OUT_PHY_EN (1u<<8)
-#define IXP_AUDIO_OUT_PHY_ADDR_SHIFT (9)
-#define IXP_AUDIO_OUT_PHY_ADDR_MASK (0x7fu<<9)
-#define IXP_AUDIO_OUT_PHY_DATA_SHIFT (16)
-#define IXP_AUDIO_OUT_PHY_DATA_MASK (0xffffu<<16)
-
-#define IXP_AUDIO_IN_PHY_ADDR_DATA (0x10)
-#define IXP_AUDIO_IN_PHY_READY (1u<<8)
-#define IXP_AUDIO_IN_PHY_ADDR_SHIFT (9)
-#define IXP_AUDIO_IN_PHY_ADDR_MASK (0x7fu<<9)
-#define IXP_AUDIO_IN_PHY_DATA_SHIFT (16)
-#define IXP_AUDIO_IN_PHY_DATA_MASK (0xffffu<<16)
-
-#define IXP_AUDIO_SLOTREQ (0x14)
-#define IXP_AUDIO_COUNTER (0x18)
-#define IXP_AUDIO_IN_FIFO_THREASHOLD (0x1c)
-#define IXP_AUDIO_IN_DMA_LINK_P (0x20)
-#define IXP_AUDIO_IN_DMA_LINK_P_EN (1u<<0)
-
-#define IXP_AUDIO_IN_DMA_DT_START (0x24)
-#define IXP_AUDIO_IN_DMA_DT_NEXT (0x28)
-#define IXP_AUDIO_IN_DMA_DT_CUR (0x2c)
-#define IXP_AUDIO_IN_DT_SIZE_FIFO_INFO (0x30)
-
-#define IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD (0x34)
-#define IXP_AUDIO_OUT_DMA_SLOT_3 (1U<<0)
-#define IXP_AUDIO_OUT_DMA_SLOT_4 (1U<<1)
-#define IXP_AUDIO_OUT_DMA_SLOT_5 (1U<<2)
-#define IXP_AUDIO_OUT_DMA_SLOT_6 (1U<<3)
-#define IXP_AUDIO_OUT_DMA_SLOT_7 (1U<<4)
-#define IXP_AUDIO_OUT_DMA_SLOT_8 (1U<<5)
-#define IXP_AUDIO_OUT_DMA_SLOT_9 (1U<<6)
-#define IXP_AUDIO_OUT_DMA_SLOT_10 (1U<<7)
-#define IXP_AUDIO_OUT_DMA_SLOT_11 (1U<<8)
-#define IXP_AUDIO_OUT_DMA_SLOT_12 (1U<<9)
-#define IXP_AUDIO_OUT_DMA_THRESHOLD_MASK (0x7fU<<11)
-#define IXP_AUDIO_OUT_DMA_THRESHOLD_SHIFT (11)
-
-#define IXP_AUDIO_OUT_DMA_LINK_P (0x38)
-#define IXP_AUDIO_OUT_DMA_LINK_P_EN (1U<<0)
-
-#define IXP_AUDIO_OUT_DMA_DT_START (0x3c)
-#define IXP_AUDIO_OUT_DMA_DT_NEXT (0x40)
-#define IXP_AUDIO_OUT_DMA_DT_CUR (0x44)
-#define IXP_AUDIO_OUT_DT_SIZE_USED_FREE (0x48)
-#define IXP_AUDIO_SPDIF_CMD (0x4c)
-#define IXP_AUDIO_SPDIF_LINK_P (0x50)
-#define IXP_AUDIO_SPDIF_DT_START (0x54)
-#define IXP_AUDIO_SPDIF_DT_NEXT (0x58)
-#define IXP_AUDIO_SPDIF_DT_CUR (0x5c)
-#define IXP_AUDIO_SPDIF_DT_SIZE_FIFO_INFO (0x60)
-#define IXP_AUDIO_MODEM_MIRROR (0x7c)
-#define IXP_AUDIO_AUDIO_MIRROR (0x80)
-#define IXP_AUDIO_6CH_RECORDER_EN (0x84)
-#define IXP_AUDIO_FIFO_FLUSH (0x88)
-#define IXP_AUDIO_FIFO_FLUSH_OUT (1u<<0)
-#define IXP_AUDIO_FIFO_FLUSH_IN (1u<<1)
-
-#define IXP_AUDIO_OUT_FIFO_INFO (0x8c)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG1 (0x90)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG2 (0x94)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG3 (0x98)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG4 (0x9c)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG5 (0xa0)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG6 (0xa4)
-#define IXP_AUDIO_PHY_SEMA (0xa8)
-
-#define IXP_INIT_NO_RESTORE (1)
-#define IXP_INIT_RESTORE (0)
-#define IXP_CODEC_REG(r) ((r) >> 1)
-
-/*
- * AC97 status and link control registers are located
- * in PCI configuration space.
- */
-#define IXP_REG_GSR 0x40
-#define IXP_REG_GCR 0x41
-
-/* AC link interface status register */
-#define IXP_GSR_PRI_READY 0x01
-#define IXP_GSR_SEC_READY 0x04
-#define IXP_GSR_TRI_READY 0x10
-#define IXP_GSR_FOUR_READY 0x20
-
-#define IXP_LAST_AC_REG (0x3a)
-
-/* AC link interface control register */
-#define IXP_GCR_ENAC97 0x80
-#define IXP_GCR_RST 0x40
-#define IXP_GCR_RSYNCHI 0x20
-#define IXP_GCR_SDO 0x10
-#define IXP_GCR_VSR 0x08
-#define IXP_GCR_3D_AUDIO_CHANNEL 0x04
-
-/*
- * Macro for AD1980 codec
- */
-#define AD1980_VID1 0x4144
-#define AD1980_VID2 0x5370
-#define AD1985_VID2 0x5375
-#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
-#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
-#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
-#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
-
-/*
- * Macro for ALC202 codec
- */
-#define ALC202_VID1 0x414c
-#define ALC202_VID2 0x4740
-
-/* audioixp_state_t.flags defines */
-#define IXP_DMA_PLAY_STARTED 0x00000001
-#define IXP_DMA_PLAY_PAUSED 0x00000002
-#define IXP_DMA_PLAY_EMPTY 0x00000004
-#define IXP_DMA_RECD_STARTED 0x00000010
-
-#define IXP_BD_NUMS (2)
-
-/* we always have 2 chunks */
-#define IXP_CHUNK_MASK (0x1l)
-
-#define IXP_BSIZE (8*1024)
-
-#define IXP_MAX_CHANNELS (200) /* force max # chs */
-#define IXP_MAX_HW_CHANNELS (32)
-#define IXP_MAX_IN_CHANNELS (1)
-#define IXP_MAX_OUT_CHANNELS \
- (IXP_MAX_HW_CHANNELS - IXP_MAX_IN_CHANNELS)
-#define IXP_IN_STREAM (31)
-#define IXP_PORT_UNMUTE (0xffffffff)
-
-#define IXP_MOD_SIZE (32)
-#define IXP_PLAY_BUF_SZ (1024)
-#define IXP_RECORD_BUF_SZ (1024)
-#define IXP_BUF_MIN (512)
-#define IXP_BUF_MAX (8192)
-
-/*
- * chunk buffer
- */
-struct audioixp_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct audioixp_bdlist_chunk audioixp_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct audioixp_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- uint8_t avail; /* the number of available chunk(s) */
- uint8_t next; /* next bd entry to process */
- audioixp_bdlist_chunk_t
- chunk[2]; /* 2 chunks for each buffers */
- uint32_t last_hw_pointer;
-};
-typedef struct audioixp_sample_buf audioixp_sample_buf_t;
-
-
-/*
- * buffer descriptor list entry, see datasheet
- */
-struct audioixp_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t status; /* status of the buffer */
- uint16_t buf_len; /* size of the buffer in DWORD */
- uint32_t next; /* physical addr of next bd_entry */
-};
-typedef struct audioixp_bd_entry audioixp_bd_entry_t;
-
-
-/*
- * we allocate all buffer descriptors lists in continuous dma memory,
- * so just define the struct
- */
-struct audioixp_bd_list {
- audioixp_bd_entry_t pcm_in[IXP_BD_NUMS];
- audioixp_bd_entry_t pcm_out[IXP_BD_NUMS];
-};
-typedef struct audioixp_bd_list audioixp_bd_list_t;
-
-
-/*
- * audioixp_state_t -per instance state and operation data
- */
-struct audioixp_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audioixp_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64];
- /* shadow of AC97 registers */
- boolean_t var_sr; /* variable sample rate ? */
- boolean_t swap_out; /* swap line-out and sur-out */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- caddr_t am_regs_base; /* base of audio mixer regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- audioixp_bd_list_t *bdl_virtual; /* virtual address of BDL */
- audioixp_bd_list_t *bdl_phys; /* Physical address of BDL */
- size_t bdl_size; /* real len of BDL */
-
- audioixp_sample_buf_t play_buf; /* buffer for playback */
- audioixp_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t ixp_defaults; /* default state for dev */
- audio_device_t ixp_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *ixp_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t ixp_psample_rate; /* play sample rate */
- uint_t ixp_pchannels; /* play channels */
- uint_t ixp_pprecision; /* play precision */
- uint_t ixp_csample_rate; /* record sample rate */
- uint_t ixp_cchannels; /* record channels */
- uint_t ixp_cprecision; /* record precision */
- uint_t ixp_output_port; /* current out port */
- uint_t ixp_input_port; /* current input port */
- uint_t ixp_monitor_gain; /* monitor gain */
- int ixp_csamples; /* pcm-in samples/intr */
- int ixp_psamples; /* pcm-out samples/intr */
-
- uint32_t ixp_res_flags; /* resource flags */
- uint32_t ixp_codec_not_ready_bits; /* for codec detect */
-};
-typedef struct audioixp_state audioixp_state_t;
-
-/* bits of audioixp_state_t.IXP_res_flags */
-#define IXP_RS_PCI_REGS (1u<<0)
-#define IXP_RS_AM_REGS (1u<<1)
-#define IXP_RS_DMA_BDL_HANDLE (1u<<2)
-#define IXP_RS_DMA_BDL_MEM (1u<<3)
-#define IXP_RS_DMA_BDL_BIND (1u<<4)
-
-/*
- * Useful bit twiddlers
- */
-#define IXP_BM_GET8(reg) \
- pci_config_get8(statep->pci_conf_handle, reg)
-
-#define IXP_BM_GET16(reg) \
- pci_config_get16(statep->pci_conf_handle, reg)
-
-#define IXP_BM_GET32(reg) \
- pci_config_get32(statep->pci_conf_handle, reg)
-
-#define IXP_BM_PUT8(reg, val) \
- pci_config_put8(statep->pci_conf_handle, reg, val)
-
-#define IXP_BM_PUT16(reg, val) \
- pci_config_put16(statep->pci_conf_handle, reg, val)
-
-#define IXP_BM_PUT32(reg, val) \
- pci_config_put32(statep->pci_conf_handle, reg, val)
-
-#define IXP_AM_GET32(reg) \
- ddi_get32(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)))
-
-#define IXP_AM_PUT32(reg, val) \
- ddi_put32(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)), (val))
-
-#define IXP_AM_UPDATE8(reg, mask, value) \
- { \
- int8_t tmp; \
- tmp = IXP_AM_GET8((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_PUT8((reg), (tmp)); \
- }
-
-#define IXP_AM_UPDATE16(reg, mask, value) \
- { \
- int16_t tmp; \
- tmp = IXP_AM_GET16((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_PUT16((reg), (tmp)); \
- }
-
-#define IXP_AM_UPDATE32(reg, mask, value) \
- { \
- int32_t tmp; \
- tmp = IXP_AM_GET32((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_AM_PUT32((reg), (tmp)); \
- }
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOIXP_IMPL_H_ */
diff --git a/usr/src/uts/common/sys/audioio.h b/usr/src/uts/common/sys/audioio.h
index 2814eb7040..d8b4e25e68 100644
--- a/usr/src/uts/common/sys/audioio.h
+++ b/usr/src/uts/common/sys/audioio.h
@@ -19,15 +19,13 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_AUDIOIO_H
#define _SYS_AUDIOIO_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/types32.h>
#include <sys/time.h>
@@ -266,22 +264,6 @@ typedef struct audio_device audio_device_t;
*/
#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int)
-
-/*
- * Structure sent up as a M_PROTO message on trace streams
- */
-struct audtrace_hdr {
- uint_t seq; /* Sequence number (per-aud_stream) */
- int type; /* device-dependent */
-#if defined(_LP64) || defined(_I32LPx)
- struct timeval32 timestamp;
-#else
- struct timeval timestamp;
-#endif
- char _f[8]; /* filler */
-};
-typedef struct audtrace_hdr audtrace_hdr_t;
-
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/sys/audiovar.h b/usr/src/uts/common/sys/audiovar.h
deleted file mode 100644
index 83aff40454..0000000000
--- a/usr/src/uts/common/sys/audiovar.h
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 1991-1992, 1997-2000 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIOVAR_H
-#define _SYS_AUDIOVAR_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * The audio driver is divided into generic (device-independent) and
- * device-specific modules. The generic routines handle most STREAMS
- * protocol issues, communicating with the device-specific code via
- * function callouts and a chained control block structure.
- *
- * Separate control block lists are maintained for reading (record) and
- * writing (play). These control blocks simulate a chained-DMA
- * structure, in that each block controls the transfer of data between
- * the device and a single contiguous memory segment.
- *
- * The command block contains buffer start and stop addresses, a link
- * address to the next block in the chain, a 'done' flag, a 'skip' flag
- * (indicating that this command block contains no data), and a pointer
- * to the STREAMS data block structure which is private to the generic
- * driver.
- *
- * The device-specific audio driver code is expected to honor the 'skip'
- * flag and set the 'done' flag when it has completed processing the
- * command block (i.e., the data transfer, if any, is complete). For
- * record command blocks, it is also expected to add to the 'data'
- * pointer the number of bytes successfully read from the device.
- *
- * The device-specific driver module must initialize the static STREAMS
- * control structures and must provide an identify routine (sbus-only),
- * an attach routine, and an open routine. The open routine verifies the
- * device unit number and calls the generic open routine with the address
- * of the audio_state structure for that unit.
- *
- * The generic audio driver makes calls to the device-specific code
- * through an ops-vector table. The following routines must be provided:
- *
- * The 'close' routine is called after either the play or record stream
- * is closed. It may perform device-specific cleanup and initialization.
- *
- * void dev_close(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'ioctl' routine is called from the STREAMS write put procedure
- * when a non-generic ioctl is encountered (AUDIO_SETINFO, AUDIO_GETINFO,
- * and AUDIO_DRAIN are the generic ioctls). Any required data mblk_t is
- * allocated; its address is given by mp->b_cont (if this is a read/write
- * ioctl, the user-supplied buffer at mp->b_cont is reused). If data is
- * successfully returned, the iocp->ioc_count field should be set with
- * the number of bytes returned. If an error occurs, the 'ioctl' routine
- * should set iocp->ioc_error to the appropriate error code. Otherwise,
- * the returned value should be AUDRETURN_CHANGE if a device state change
- * occurred (in which case a signal is sent to the control device, if
- * any) and AUDRETURN_NOCHANGE if no signal should be sent. If the ioctl
- * can not complete right away, it should return AUDRETURN_DELAYED
- * indicating that it will ack the ioctl at a later time.
- *
- * aud_return_t dev_ioctl(as, mp, iocp)
- * aud_stream_t *as; // Pointer to audio device state
- * mblk_t *mp; // ioctl STREAMS message block
- * struct iocblk *iocp; // M_IOCTL message data
- *
- *
- * The 'start' routine is called to start i/o. Ordinarily, it is called
- * from the device-specific 'queuecmd' routine, but it is also called
- * when paused output is resumed.
- *
- * void dev_start(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'stop' routine is called to stop i/o. It is called when i/o is
- * paused, flushed, or the device is closed. Note that currently queued
- * command blocks should not be flushed by this routine, since i/o may be
- * resumed from the current point.
- *
- * void dev_stop(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'setflag' routine is called to get a single device-specific flag.
- * The flag argument is either AUD_ACTIVE (return the active flag) or
- * AUD_ERRORRESET (zero the error flag, returning its previous value).
- * (The val argument is currently ignored.)
- *
- * void dev_setflag(as, flag, val)
- * aud_stream_t *as; // Pointer to audio device state
- * enum aud_opflag flag; // AUD_ACTIVE || AUD_ERRORESET
- *
- *
- * The 'setinfo' routine is called to get or set device-specific fields
- * in the audio state structure. If mp is NULL, the sample counters and
- * active flags should be set in v. If mp is not NULL, then
- * mp->b_cont->data points to the audio_info_t structure supplied in an
- * AUDIO_SETINFO ioctl (ip). All device-specific fields (gains, ports,
- * sample counts) in both v and the device itself should be updated, as
- * long as the corresponding field in ip is not set to AUD_INIT_VALUE.
- * When the sample counters are set, the value returned in v should be
- * the previous value. If the setinfo can not complete right away, it
- * should return AUDRETURN_DELAYED indicating that it will ack the ioctl
- * at a later time. If an error occurs on setinfo, the iocp->ioc_error
- * should be set as in dev_ioctl
- *
- * aud_return_t dev_setinfo(as, mp, iocp)
- * aud_stream_t *as; // Pointer to audio device state
- * mblk_t *mp; // user info structure or NULL
- * struct iocblk *iocp; // M_IOCTL message data
- *
- *
- * The 'queuecmd' routine is called whenever a new command block is
- * linked into the chained command list. The device-specific code must
- * ensure that the command is enqueued to the device and that i/o, if not
- * currently active, is started.
- *
- * void dev_queuecmd(as, cmdp)
- * aud_stream_t *as; // Pointer to audio device state
- * struct aud_cmd *cmdp; // new command block to queue
- *
- *
- * The 'flushcmd' routine is called whenever the chained command list is
- * flushed. It is only called after i/o has been stopped (via the 'stop'
- * routine) and after the command list in the audio state structure has
- * been cleared. The device-specific code should flush the device's
- * queued command list.
- *
- * void dev_flushcmd(as)
- * aud_stream_t *as; // Pointer to audio device state
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*
- * Various generic audio driver constants
- */
-#define AUD_INITVALUE (~0)
-#define Modify(X) ((uint_t)(X) != AUD_INITVALUE)
-#define Modifys(X) ((X) != (ushort_t)AUD_INITVALUE)
-#define Modifyc(X) ((X) != (uchar_t)AUD_INITVALUE)
-
-
-/*
- * Define the virtual chained-DMA control structure
- */
-typedef struct aud_cmd aud_cmd_t;
-struct aud_cmd {
- /*
- * Data pointers
- */
- uchar_t *data; /* address of next transfer */
- uchar_t *enddata; /* address+1 of last transfer */
-
- /*
- * Linked list management
- */
- aud_cmd_t *next; /* pointer to next or NULL */
- aud_cmd_t *lastfragment; /* last fragment in packet */
-
- /*
- * Flags
- */
- uint_t :0; /* Force word alignment */
- uchar_t skip; /* TRUE => no xfers on buffer */
- uchar_t done; /* TRUE => buffer processed */
-
- uchar_t iotype; /* copy of mblk's db_type */
- boolean_t processed; /* TRUE if processed cmd at head of list */
-
- audtrace_hdr_t tracehdr; /* trace info */
-
- /*
- * Device-independent private, opaque storage
- */
- void *dihandle;
-};
-
-
-/*
- * Define the list-head for queued control structures
- */
-typedef struct aud_cmdlist aud_cmdlist_t;
-struct aud_cmdlist {
- aud_cmd_t *head; /* First queued command block */
- aud_cmd_t *tail; /* Last queued command block */
- aud_cmd_t *free; /* Head of free list */
-};
-
-
-/*
- * Define possible return values from the setinfo and ioctl calls
- */
-typedef enum {
- AUDRETURN_CHANGE,
- AUDRETURN_NOCHANGE,
- AUDRETURN_DELAYED
-} aud_return_t;
-
-
-/*
- * Define legal values for the 'flag' argument to the 'setflag' callout
- */
-enum aud_opflag {
- AUD_ACTIVE, /* active flag */
- AUD_ERRORRESET /* error flag (reset after read) */
-};
-
-
-/*
- * The audio stream type determines the legal operations for a stream in the
- * generic portion of an audio driver.
- */
-typedef enum {
- AUDTYPE_NONE = 00, /* Not a legal device */
- AUDTYPE_DATA = 01, /* Data, IOCTL, etc., but not signals */
- AUDTYPE_CONTROL = 02, /* IOCTL, etc., but not M_DATA */
- AUDTYPE_BOTH = 03 /* Anything is ok, signals delivered */
-} aud_streamtype_t;
-
-#define ISPLAYSTREAM(as) (ISDATASTREAM(as) && (as->openflag & FWRITE))
-#define ISRECORDSTREAM(as) (ISDATASTREAM(as) && (as->openflag & FREAD))
-#define ISDATASTREAM(as) (((as->type) & (AUDTYPE_DATA)) != 0)
-#define ISCONTROLSTREAM(as) (((as->type) & (AUDTYPE_CONTROL)) != 0)
-
-
-typedef enum {
- AUDMODE_NONE = 00, /* Not a legal mode */
- AUDMODE_AUDIO = 01, /* Transparent audio mode */
- AUDMODE_HDLC = 02 /* HDLC datacomm mode */
-} aud_modetype_t;
-
-
-/*
- * This structure describes the state of the audio device and queues
- */
-typedef struct aud_state aud_state_t;
-struct aud_state {
- /*
- * Back-pointer to the device-dependent audio state
- */
- void *ddstate;
-
- /*
- * Device-independent audio state
- */
- uint_t monitor_gain; /* input to output mix: 0 - 255 */
- boolean_t output_muted; /* true if output is muted */
- uint_t hw_features; /* hardware features this driver supports */
- uint_t sw_features; /* software features this driver supports */
- uint_t sw_features_enabled; /* supported SW features enabled */
-
- /*
- * Audio ops vector
- */
- struct aud_ops *ops;
-};
-
-/*
- * STREAMS routines pass the address of a 'struct audstream' when calling
- * put and service procedures. This structure points to the STREAMS
- * queues and back to the containing 'struct aud_state'.
- */
-typedef struct aud_stream aud_stream_t;
-struct aud_stream {
- aud_state_t *distate; /* pointer to driver data */
- aud_streamtype_t type; /* defines legal operations */
- aud_modetype_t mode; /* Audio or HDLC data */
- boolean_t signals_okay; /* Can send sigs up this aud_stream */
-
- /*
- * Sideways pointers to related aud_stream_t structures
- */
- aud_stream_t *control_as; /* control stream */
- aud_stream_t *output_as; /* play stream */
- aud_stream_t *input_as; /* record stream */
-
- /*
- * Software state
- */
- aud_cmdlist_t cmdlist; /* command chains */
- audio_prinfo_t info; /* info for this stream side */
- int openflag; /* open flag & (FREAD|FWRITE) */
- boolean_t draining; /* TRUE if output draining */
- int maxfrag_size; /* max aud_cmd_t fragment size */
- struct {
- int action; /* IOCTL action */
- mblk_t *mp; /* Pending ioctl */
- ulong_t priv; /* private state */
- uint_t ioctl_id; /* from ioc_id */
- cred_t *credp; /* from ioc_cr */
- int reason; /* HW implementation dep. reason */
- boolean_t (*handler)(aud_stream_t *, mblk_t *, int,
- boolean_t);
- } dioctl; /* Delayed ioctls */
- uint_t sequence; /* packet sequence number */
-
- /*
- * STREAMS information
- */
- queue_t *readq; /* STREAMS read queue */
- queue_t *writeq; /* STREAMS write queue */
- queue_t *traceq; /* STREAMS trace queue */
-
- /*
- * OS-Dependent information
- *
- * NB - For now we lock on a per-unit basis, so this points to
- * the mutex of the unit it belongs to. Other arrangements can
- * be made later
- *
- * The condition variable in a output stream is used to wait for
- * output to drain.
- *
- * The condition variable in a control stream is used to wait on
- * open if the device is in use.
- */
- kmutex_t *lock; /* low-level lock */
- kcondvar_t cv; /* generic condition variable */
-};
-
-#define LOCK_AS(as) mutex_enter((as)->lock)
-#define UNLOCK_AS(as) mutex_exit((as)->lock)
-#define ASSERT_ASLOCKED(as) ASSERT(MUTEX_HELD((as)->lock))
-
-#define AUDIOCACTION_INIT (0) /* no ioctl in progress */
-#define AUDIOCACTION_WAIT (1) /* copyout response not received */
-#define AUDIOCACTION_WAITING (2) /* read to ack/nak */
-
-
-/*
- * Argument for audio_sensig
- */
-typedef enum {
- AUDIO_SENDSIG_NONE = 0, /* Default */
- AUDIO_SENDSIG_EXPLICIT, /* Send signal up this aud_stream only */
- AUDIO_SENDSIG_ALL /* Send signal up all related aud_streams */
-} audio_sendsig_t;
-
-
-/*
- * Define the ops-vector table for device-specific callouts
- *
- * close close routine
- * ioctl ioctl routine
- * start routine to start I/O on a stream
- * stop routine to stop I/O on a stream
- * setflag routine to get or set a flag value
- * setinfo routine to get or set the audio state structure
- * queuecmd routine to queue a command on the HW command list
- * flushcmd routine to flush the HW's command list
- */
-typedef struct aud_ops aud_ops_t;
-struct aud_ops {
-#ifdef __STDC__
- void (*close)(aud_stream_t *);
- aud_return_t (*ioctl)(aud_stream_t *, queue_t *, mblk_t *);
- aud_return_t (*mproto)(aud_stream_t *, mblk_t *);
- void (*start)(aud_stream_t *);
- void (*stop)(aud_stream_t *);
- uint_t (*setflag)(aud_stream_t *, enum aud_opflag, uint_t);
- aud_return_t (*setinfo)(aud_stream_t *, mblk_t *, int *);
- void (*queuecmd)(aud_stream_t *, aud_cmd_t *);
- void (*flushcmd)(aud_stream_t *);
-#else /* __STDC__ */
- void (*close)();
- aud_return_t (*ioctl)();
- aud_return_t (*mproto)();
- void (*start)();
- void (*stop)();
- uint_t (*setflag)();
- aud_return_t (*setinfo)();
- void (*queuecmd)();
- void (*flushcmd)();
-#endif /* __STDC__ */
-};
-
-
-/*
- * Define pseudo-routine names for the device-specific callouts
- */
-#define AUD_CLOSE(A) (*(A)->distate->ops->close)(A)
-#define AUD_IOCTL(A, Q, M) (*(A)->distate->ops->ioctl)(A, Q, M)
-#define AUD_MPROTO(A, M) (*(A)->distate->ops->mproto)(A, M)
-#define AUD_START(A) (*(A)->distate->ops->start)(A)
-#define AUD_STOP(A) (*(A)->distate->ops->stop)(A)
-#define AUD_SETFLAG(A, F, X) (*(A)->distate->ops->setflag)(A, F, X)
-#define AUD_GETFLAG(A, F) (*(A)->distate->ops->setflag)(A, F, \
- AUD_INITVALUE)
-#define AUD_SETINFO(A, M, E) (*(A)->distate->ops->setinfo)(A, M, E)
-#define AUD_GETINFO(A) (*(A)->distate->ops->setinfo)(A, NULL, NULL)
-#define AUD_QUEUECMD(A, C) (*(A)->distate->ops->queuecmd)(A, C)
-#define AUD_FLUSHCMD(A) (*(A)->distate->ops->flushcmd)(A)
-
-
-/*
- * Device Independent Audio driver function prototypes
- */
-#ifdef __STDC__
-extern int audio_open(aud_stream_t *, queue_t *, dev_t *, int, int);
-extern int audio_close(queue_t *, int, cred_t *);
-extern int audio_wput(queue_t *, mblk_t *);
-extern int audio_wsrv(queue_t *);
-extern int audio_rput(queue_t *, mblk_t *);
-extern int audio_rsrv(queue_t *);
-extern void audio_gc_output(aud_stream_t *);
-extern void audio_process_output(aud_stream_t *);
-extern void audio_process_input(aud_stream_t *);
-extern void audio_sendsig(aud_stream_t *, audio_sendsig_t);
-extern void audio_flush_cmdlist(aud_stream_t *);
-extern void audio_ack(queue_t *, mblk_t *, int);
-extern void audio_copyout(queue_t *, mblk_t *, caddr_t, uint_t);
-extern void audio_pause_play(aud_stream_t *);
-extern void audio_pause_record(aud_stream_t *);
-extern void audio_resume_play(aud_stream_t *);
-extern void audio_resume_record(aud_stream_t *);
-extern void audio_trace(aud_stream_t *, aud_cmd_t *);
-extern void audio_trace_hdr(aud_stream_t *, audtrace_hdr_t *);
-#else /* __STDC__ */
-extern int audio_open();
-extern int audio_close();
-extern int audio_wput();
-extern int audio_wsrv();
-extern int audio_rput();
-extern int audio_rsrv();
-extern void audio_gc_output();
-extern void audio_process_output();
-extern void audio_process_input();
-extern void audio_sendsig();
-extern void audio_flush_cmdlist();
-extern void audio_ack();
-extern void audio_copyout();
-extern void audio_pause_play();
-extern void audio_pause_record();
-extern void audio_resume_play();
-extern void audio_resume_record();
-extern void audio_trace()
-extern void audio_trace_hdr();
-#endif /* __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOVAR_H */
diff --git a/usr/src/uts/common/sys/mixer.h b/usr/src/uts/common/sys/mixer.h
index 8491fc73a6..9abcd6121d 100644
--- a/usr/src/uts/common/sys/mixer.h
+++ b/usr/src/uts/common/sys/mixer.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,26 +19,19 @@
* CDDL HEADER END
*/
/*
- * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
- * All rights reserved
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
*/
#ifndef _SYS_MIXER_H
#define _SYS_MIXER_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/audio.h>
-#define MIXER_NAME "audio mixer" /* STREAMS module name */
-#define MIXER_VERSION "Rev 1" /* 1st version of audio mixer */
-#define MIXER_CONFIGURATION "Config A" /* 1st configuration */
-#define MIXER_MOD_NAME "Audio Mixer" /* STREAMS modldrv name */
-
#define AM_MIXER_MODE 0
#define AM_COMPAT_MODE 1
diff --git a/usr/src/uts/common/sys/soundcard.h b/usr/src/uts/common/sys/soundcard.h
new file mode 100644
index 0000000000..5167b1720c
--- /dev/null
+++ b/usr/src/uts/common/sys/soundcard.h
@@ -0,0 +1,31 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SOUNDCARD_H
+#define _SYS_SOUNDCARD_H
+
+#include <sys/audio/audio_oss.h>
+
+#endif /* _SYS_SOUNDCARD_H */
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h b/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
index 5ed299cccb..55e3d72d06 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -35,9 +35,8 @@ extern "C" {
#include <sys/sunldi.h>
#include <sys/usb/usba/usbai_private.h>
-/* driver specific macros */
-#define USB_AC_HIWATER (AM_MAX_QUEUED_MSGS_SIZE)
-#define USB_AC_LOWATER (32*1024)
+int usb_ac_open(dev_info_t *);
+void usb_ac_close(dev_info_t *);
/* structure for each unit described by descriptors */
@@ -57,12 +56,17 @@ typedef struct usb_ac_unit_list {
* plumbing data; info per plumbed module
*/
typedef struct usb_ac_plumbed {
+ struct usb_ac_state *acp_uacp; /* usb_ac state pointer */
dev_info_t *acp_dip; /* devinfo pointer */
uint_t acp_ifno; /* interface number */
- int acp_linkid; /* link ID for plumbing */
int acp_driver; /* Plumbed driver, see value below */
- queue_t *acp_lrq; /* lower read queue */
- queue_t *acp_lwq; /* lower write queue */
+
+ ldi_handle_t acp_lh; /* ldi handle of plumbed driver */
+ dev_t acp_devt; /* devt of plumbed driver */
+ ddi_taskq_t *acp_tqp; /* taskq for I/O to plumbed driver */
+ int acp_flags;
+#define ACP_ENABLED 1
+
void *acp_data; /* ptr to streams or hid data */
} usb_ac_plumbed_t;
@@ -72,9 +76,6 @@ typedef struct usb_ac_plumbed {
* only one active at a time.
*/
typedef struct usb_ac_to_as_req {
- int acr_wait_flag; /* an mblk sent wait on this flag */
- kcondvar_t acr_cv; /* an mblk sent; wait on this cv */
- mblk_t *acr_reply_mp; /* response to current request */
usb_audio_formats_t acr_curr_format; /* format data from mixer */
int acr_curr_dir;
} usb_ac_to_as_req_t;
@@ -164,11 +165,6 @@ typedef struct usb_ac_state {
/* pipe handle */
usb_pipe_handle_t usb_ac_default_ph;
- /* streams management */
- queue_t *usb_ac_rq; /* read q ptr */
- queue_t *usb_ac_wq; /* write q ptr */
- dev_t usb_ac_dev; /* dev_t of plumbing open */
-
/* serial access */
usb_serialization_t usb_ac_ser_acc;
@@ -176,13 +172,10 @@ typedef struct usb_ac_state {
usb_ac_power_t *usb_ac_pm; /* power capabilities */
/* mixer registration data */
- uint_t usb_ac_mixer_mode_enable;
uint_t usb_ac_registered_with_mixer;
/* plumbing management */
- int usb_ac_mux_minor;
uint_t usb_ac_plumbing_state;
- ldi_handle_t usb_ac_mux_lh;
ushort_t usb_ac_busy_count;
usb_ac_plumbed_t usb_ac_plumbed[USB_AC_MAX_PLUMBED];
@@ -197,25 +190,11 @@ typedef struct usb_ac_state {
* copy registration data
*/
usb_as_registration_t usb_ac_streams_reg[USB_AC_MAX_AS_PLUMBED];
-} usb_ac_state_t;
-typedef struct usb_ac_state_space {
- void *sp; /* soft state for the instance */
- /* ptr to usb_ac_restore_audio_state */
- int (*restore_func)
- (usb_ac_state_t *, int);
- /* ptr to usb_ac_get_featureID */
- uint_t (* get_featureID_func)
- (usb_ac_state_t *, uchar_t,
- uint_t, uint_t);
- /* ptr to the usb_ac entry points */
- am_ad_entry_t *ac_entryp;
- /* ptr to pm_busy/idle calls */
- void (*pm_busy_component)
- (usb_ac_state_t *);
- void (*pm_idle_component)
- (usb_ac_state_t *);
-} usb_ac_state_space_t;
+ ddi_taskq_t *tqp;
+
+ char dstr[64];
+} usb_ac_state_t;
/* warlock directives, stable data */
_NOTE(MUTEX_PROTECTS_DATA(usb_ac_state_t::usb_ac_mutex, usb_ac_state_t))
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h b/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
index 7592a78663..e88168b391 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -86,9 +86,7 @@ typedef struct usb_as_state {
uint_t usb_as_dev_state;
uint_t usb_as_ifno;
kmutex_t usb_as_mutex;
- queue_t *usb_as_rq; /* read q ptr */
- queue_t *usb_as_wq; /* write q ptr */
- uint_t usb_as_streams_flag; /* streams status */
+ uint_t usb_as_flag; /* status */
/* mblk containing the current control command */
mblk_t *usb_as_def_mblk;
@@ -133,6 +131,7 @@ typedef struct usb_as_state {
/* debug support */
uint_t usb_as_send_debug_count;
uint_t usb_as_rcv_debug_count;
+ char dstr[64];
} usb_as_state_t;
/* warlock directives, stable data */
@@ -141,8 +140,6 @@ _NOTE(MUTEX_PROTECTS_DATA(usb_as_state_t::usb_as_mutex, usb_as_power_t))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_pm))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_instance))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_rq))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_wq))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_default_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_isoc_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_log_handle))
@@ -202,9 +199,9 @@ typedef struct usb_as_req {
} usb_as_req_t;
-/* Streams status */
-#define USB_AS_STREAMS_OPEN 1
-#define USB_AS_STREAMS_DISMANTLING 2
+/* status */
+#define USB_AS_OPEN 1
+#define USB_AS_DISMANTLING 2
#define USB_AS_BUFFER_SIZE 256 /* descriptor buffer size */
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h b/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
index c6e2220944..87a0d2953e 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -62,10 +62,7 @@ typedef struct usb_as_registration {
uchar_t reg_mode; /* play or record */
uchar_t reg_n_formats;
int reg_ifno;
- am_ad_sample_rates_t reg_mixer_srs;
- am_ad_sample_rates_t reg_compat_srs;
- uint_t reg_mixer_srs_list[USB_AS_N_SRS];
- uint_t reg_compat_srs_list[USB_AS_N_SRS];
+ uint_t reg_srs[USB_AS_N_SRS];
usb_audio_formats_t reg_formats[USB_AS_N_FORMATS];
uint_t reg_channels[USB_AS_N_CHANNELS];
am_ad_cap_comb_t reg_combinations[USB_AS_N_COMBINATIONS];
diff --git a/usr/src/uts/intel/Makefile.intel.shared b/usr/src/uts/intel/Makefile.intel.shared
index c45b46cefa..f597720339 100644
--- a/usr/src/uts/intel/Makefile.intel.shared
+++ b/usr/src/uts/intel/Makefile.intel.shared
@@ -195,9 +195,14 @@ DRV_KMODS += asy
DRV_KMODS += ata
DRV_KMODS += ath
DRV_KMODS += atu
+DRV_KMODS += audio
DRV_KMODS += audio810
+DRV_KMODS += audioens
DRV_KMODS += audiohd
DRV_KMODS += audioixp
+DRV_KMODS += audiopci
+DRV_KMODS += audiovia823x
+DRV_KMODS += austr
DRV_KMODS += bl
DRV_KMODS += bge
DRV_KMODS += bofi
@@ -351,8 +356,6 @@ DRV_KMODS += ii rdc rdcsrv rdcstub
#
$(CLOSED_BUILD)DRV_KMODS += dca
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audioens
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audiovia823x
$(CLOSED_BUILD)CLOSED_DRV_KMODS += bmc
$(CLOSED_BUILD)CLOSED_DRV_KMODS += elxl
$(CLOSED_BUILD)CLOSED_DRV_KMODS += glm
@@ -546,10 +549,9 @@ SYS_KMODS += acctctl
# MISC_KMODS_32 are built only 32-bit
# MISC_KMODS_64 are built only 64-bit
#
+MISC_KMODS += ac97
MISC_KMODS += acpica
MISC_KMODS += agpmaster
-MISC_KMODS += amsrc2
-MISC_KMODS += audiosup
MISC_KMODS += bignum
MISC_KMODS += blk2scsa
MISC_KMODS += bootdev
@@ -582,7 +584,6 @@ MISC_KMODS += kmech_dummy
MISC_KMODS += kmech_krb5
MISC_KMODS += ksocket
MISC_KMODS += mac
-MISC_KMODS += mixer
MISC_KMODS += net80211
MISC_KMODS += nfs_dlboot
MISC_KMODS += nfssrv
@@ -621,7 +622,6 @@ MISC_KMODS += qlc_fw_8100
MISC_KMODS += hwa1480_fw
MISC_KMODS += uwba
-$(CLOSED_BUILD)CLOSED_MISC_KMODS += amsrc1
$(CLOSED_BUILD)CLOSED_MISC_KMODS += klmmod klmops
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_lsi
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_emc
@@ -688,7 +688,6 @@ $(CLOSED_BUILD)CLOSED_XMODS = \
#
# 'Dacf' Modules (/kernel/dacf):
#
-DACF_KMODS += usb_ac_dacf
#
# Performance Counter BackEnd modules (/usr/kernel/pcbe)
diff --git a/usr/src/uts/intel/amsrc2/Makefile b/usr/src/uts/intel/ac97/Makefile
index 7de69fa670..1161de1ade 100644
--- a/usr/src/uts/intel/amsrc2/Makefile
+++ b/usr/src/uts/intel/ac97/Makefile
@@ -18,17 +18,14 @@
#
# CDDL HEADER END
#
-
-# uts/intel/amsrc2/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# uts/intel/ac97/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
-
#
-# This makefile drives the production of the audio mixer
-# sample rate conversion routine #1 (amsrc2).
+# This makefile drives the production of the ac97 support module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -38,12 +35,13 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = amsrc2
-OBJECTS = $(AMSRC2_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AMSRC2_OBJS:%.o=$(LINTS_DIR)/%.ln)
+MODULE = ac97
+OBJECTS = $(AC97_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AC97_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AMSRC2_OBJS:%.o=%.ll)
+WARLOCK_OUT = $(AC97_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
+WLCMD_DIR = $(UTSBASE)/common/io/warlock
#
# Include common rules.
@@ -57,10 +55,7 @@ ALL_TARGET = $(BINARY)
LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-#
-# Depends on misc/amsrc2, misc/audiosup, and misc/mixer
-#
-LDFLAGS += -dy -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -89,22 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-WARLOCK = warlock
-WLCC = wlcc
-TOUCH = touch
-TEST = test
-
-#
-# Warlock rules
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT)
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
diff --git a/usr/src/uts/intel/audio/Makefile b/usr/src/uts/intel/audio/Makefile
new file mode 100644
index 0000000000..e9c4ca1bc3
--- /dev/null
+++ b/usr/src/uts/intel/audio/Makefile
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audio/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio support module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audio
+OBJECTS = $(AUDIO_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIO_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/audio810/Makefile b/usr/src/uts/intel/audio810/Makefile
index d1714978f0..a3d3df4247 100644
--- a/usr/src/uts/intel/audio810/Makefile
+++ b/usr/src/uts/intel/audio810/Makefile
@@ -19,14 +19,12 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audio810/Makefile
#
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of Metropolis audio driver
# (audio810) kernel module.
#
@@ -42,34 +40,17 @@ MODULE = audio810
OBJECTS = $(AUDIO810_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIO810_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audio810
-WARLOCK_OUT = $(AUDIO810_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audio810
#
# Include common rules.
#
include $(UTSBASE)/intel/Makefile.intel
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-DEBUG_FLGS =
-$(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
#
-# Depends on misc/audiosup
+# Depends on drv/audio and misc/ac97
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -88,10 +69,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -105,47 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio810_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audio810.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audioens/Makefile b/usr/src/uts/intel/audioens/Makefile
new file mode 100644
index 0000000000..2a03ba5668
--- /dev/null
+++ b/usr/src/uts/intel/audioens/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audioens/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audioens driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audioens
+OBJECTS = $(AUDIOENS_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOENS_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioens
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/audiohd/Makefile b/usr/src/uts/intel/audiohd/Makefile
index 4659db6c74..a0487ca3f7 100644
--- a/usr/src/uts/intel/audiohd/Makefile
+++ b/usr/src/uts/intel/audiohd/Makefile
@@ -19,14 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audiohd/Makefile
#
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of high definition audio
# driver (audiohd) kernel module.
#
@@ -42,10 +39,7 @@ MODULE = audiohd
OBJECTS = $(AUDIOHD_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOHD_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiohd
-WARLOCK_OUT = $(AUDIOHD_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiohd
#
# Include common rules.
@@ -67,10 +61,7 @@ $(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio
#
# Define targets
@@ -92,7 +83,6 @@ clean: $(CLEAN_DEPS)
$(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -106,47 +96,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiohd_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiohd.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audioixp/Makefile b/usr/src/uts/intel/audioixp/Makefile
index 414ee60224..ead1d79da8 100644
--- a/usr/src/uts/intel/audioixp/Makefile
+++ b/usr/src/uts/intel/audioixp/Makefile
@@ -19,14 +19,12 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audioixp/Makefile
#
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of high definition audio
# driver (audioixp) kernel module.
#
@@ -42,10 +40,7 @@ MODULE = audioixp
OBJECTS = $(AUDIOIXP_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOIXP_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audioixp
-WARLOCK_OUT = $(AUDIOIXP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioixp
#
# Include common rules.
@@ -62,7 +57,7 @@ $(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
#
# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -72,13 +67,6 @@ LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -88,10 +76,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -105,50 +91,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audioixp_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audioixp.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audiopci/Makefile b/usr/src/uts/intel/audiopci/Makefile
new file mode 100644
index 0000000000..ca07ef76cd
--- /dev/null
+++ b/usr/src/uts/intel/audiopci/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audiopci/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audiopci driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audiopci
+OBJECTS = $(AUDIOPCI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOPCI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiopci
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/usb_ac_dacf/Makefile b/usr/src/uts/intel/audiovia823x/Makefile
index 0c119ec8a1..4f6dbb58be 100644
--- a/usr/src/uts/intel/usb_ac_dacf/Makefile
+++ b/usr/src/uts/intel/audiovia823x/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,29 +19,28 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# uts/intel/usb_ac_dacf/Makefile
+# uts/intel/audiovia823x/Makefile
#
-# This makefile drives the production of the usb_ac driver
-# kernel module. Intel architecture dependent
#
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
+# This makefile drives the production of the Via 823x audio driver
+# (audiovia823x) kernel module.
+#
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
#
-UTSBASE = ../..
+UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = usb_ac_dacf
-OBJECTS = $(USB_AC_DACF_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(USB_AC_DACF_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
+MODULE = audiovia823x
+OBJECTS = $(AUDIOVIA823X_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOVIA823X_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiovia823x
#
# Include common rules.
@@ -50,23 +48,18 @@ ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
include $(UTSBASE)/intel/Makefile.intel
#
-# Define targets
+# Depends on drv/audio and misc/ac97
#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
-# Override defaults to build a unique, local modstubs.o.
+# Define targets
#
-MODSTUBS_DIR = $(OBJS_DIR)
-CLEANFILES += $(MODSTUBS_O)
+ALL_TARGET = $(BINARY) $(SRC_CONFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
-# depends on misc/usba
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
-#
# Default build targets.
#
.KEEP_STATE:
@@ -91,4 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
diff --git a/usr/src/uts/intel/austr/Makefile b/usr/src/uts/intel/austr/Makefile
new file mode 100644
index 0000000000..e839641126
--- /dev/null
+++ b/usr/src/uts/intel/austr/Makefile
@@ -0,0 +1,85 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/austr/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio streams module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = austr
+OBJECTS = $(AUSTR_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUSTR_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Depends on drv/audio
+#
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/mixer/Makefile b/usr/src/uts/intel/mixer/Makefile
deleted file mode 100644
index cf6b5094a5..0000000000
--- a/usr/src/uts/intel/mixer/Makefile
+++ /dev/null
@@ -1,154 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/intel/mixer/Makefile
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio mixer (mixer)
-# Audio Personality Module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = mixer
-OBJECTS = $(MIXER_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(MIXER_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(MIXER_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/intel/Makefile.intel
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/audiosup
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC1_FILES = $(AMSRC1_OBJS:%.o=$(CLOSED)/uts/intel/amsrc1/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-WARLOCK_TARGETS = $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
- warlock_standalone $(WLCMD_DIR)/mixer_with_audiosup.wlcmd
-
-$(CLOSED_BUILD)WARLOCK_CLOSED = warlock_closed
-
-warlock: warlock_open $(WARLOCK_CLOSED)
- $(TOUCH) $(WARLOCK_OK)
-
-warlock_open: $(WARLOCK_TARGETS) warlock_amsrc2.files
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_closed: $(WARLOCK_TARGETS) warlock_amsrc1.files
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd \
- $(WARLOCK_OUT) $(AUDIO_SUP_FILES) $(AMSRC1_FILES) \
- -l ../warlock/ddi_dki_impl.ll
-
-%.ll: $(UTSBASE)/common/io/audio/sada/mixer/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files \
- $(WLCMD_DIR)/mixer.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc1.files:
- @cd $(CLOSED)/uts/intel/amsrc1; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/os/dacf.conf b/usr/src/uts/intel/os/dacf.conf
index 9ccb1b8282..0475a5c840 100644
--- a/usr/src/uts/intel/os/dacf.conf
+++ b/usr/src/uts/intel/os/dacf.conf
@@ -19,14 +19,13 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# NOTICE: This file contains important KERNEL STATE. Do not edit this file.
# Its format and contents are subject to change in future releases of Solaris.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
#
# keyboard and mouse configuration rules
@@ -61,13 +60,6 @@ driver-minorname="mouse8042:internal_mouse" consconfig_dacf:ms_config post-attac
driver-minorname="mouse8042:internal_mouse" consconfig_dacf:ms_config pre-detach - pushmod="vuid3ps2"
#
-# Configure and/or unconfigure usb audio devices.
-# usb_ac as a mux for hid and usb_as devices.
-#
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config post-attach -
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config pre-detach -
-
-#
# Configure and/or unconfigure DDI_NT_NET devices.
#
minor-nodetype="ddi_network" net_dacf:net_config post-attach -
diff --git a/usr/src/uts/intel/usb_ac/Makefile b/usr/src/uts/intel/usb_ac/Makefile
index cfeb9d8525..29ce6e73fb 100644
--- a/usr/src/uts/intel/usb_ac/Makefile
+++ b/usr/src/uts/intel/usb_ac/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/usb_ac/Makefile
@@ -42,7 +42,7 @@ OBJECTS = $(USB_AC_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(USB_AC_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/audio/usb_ac
-WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll) usb_ac_dacf.ll
+WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
@@ -67,14 +67,7 @@ CLEANFILES += $(MODSTUBS_O)
#
# depends on misc/usba
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Nmisc/usba -Ndrv/audio
#
# Default build targets.
@@ -119,9 +112,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=../mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=../audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
#
@@ -138,7 +128,6 @@ warlock_with_sada: $(WLCMD_DIR)/usb_ac_with_sada.wlcmd \
$(WARLOCK_OUT) \
warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_ac_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
diff --git a/usr/src/uts/intel/usb_ah/Makefile b/usr/src/uts/intel/usb_ah/Makefile
index 534aa9e7e9..eaa8cb675d 100644
--- a/usr/src/uts/intel/usb_ah/Makefile
+++ b/usr/src/uts/intel/usb_ah/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/usb_ah/Makefile
@@ -66,7 +66,7 @@ CLEANFILES += $(MODSTUBS_O)
#
# depends on misc/usba
#
-LDFLAGS += -dy -Nmisc/usba -Nhidparser -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Nhidparser -Ndrv/usb_ac
#
# For now, disable these lint checks; maintainers should endeavor
diff --git a/usr/src/uts/intel/usb_as/Makefile b/usr/src/uts/intel/usb_as/Makefile
index f4a62920ee..9d82ee38a0 100644
--- a/usr/src/uts/intel/usb_as/Makefile
+++ b/usr/src/uts/intel/usb_as/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_as/Makefile
@@ -63,11 +63,7 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
MODSTUBS_DIR = $(OBJS_DIR)
CLEANFILES += $(MODSTUBS_O)
-#
-# do not remove depends on amsrc2. If removed, amsrc2 gets unloaded when
-# usb_ac_dacf gets unloaded
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer -Nmisc/amsrc2
+LDFLAGS += -dy -Nmisc/usba -Ndrv/usb_ac
#
# For now, disable these lint checks; maintainers should endeavor
@@ -120,22 +116,18 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
# Warlock targets
#
warlock: $(WARLOCK_OK)
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
+$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
warlock_standalone warlock_with_usba warlock_with_sada
$(TOUCH) $(WARLOCK_OK)
warlock_with_sada: $(WLCMD_DIR)/usb_as_with_sada.wlcmd \
- $(WARLOCK_OUT) \
- warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
+ $(WARLOCK_OUT) warlock_audiosup.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_as_with_sada.wlcmd $(WARLOCK_OUT) \
$(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
@@ -171,9 +163,3 @@ warlock_ddi.files:
warlock_audiosup.files:
@cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/warlock/Makefile b/usr/src/uts/intel/warlock/Makefile
index fbefb9b95d..2b877db841 100644
--- a/usr/src/uts/intel/warlock/Makefile
+++ b/usr/src/uts/intel/warlock/Makefile
@@ -20,7 +20,7 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/warlock/Makefile
@@ -51,7 +51,7 @@ include $(UTSBASE)/intel/Makefile.intel
#
# lock_lint rules
#
-all: warlock warlock.1394 warlock.audio warlock.ecpp warlock.scsi \
+all: warlock warlock.1394 warlock.ecpp warlock.scsi \
warlock.usb warlock.ib warlock.sata warlock.sdcard warlock.wc
warlock: $(MODULE).ok
@@ -101,21 +101,6 @@ warlock.1394:
warlock.ecpp:
@cd ../ecpp; $(MAKE) clean; $(MAKE) warlock
-warlock.audio:
- @cd ../audiosup; $(MAKE) clean; $(MAKE) warlock
- @cd ../mixer; $(MAKE) clean; $(MAKE) warlock
- @cd ../amsrc2; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audio810; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audiohd; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audioixp; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ac; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_as; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ah; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/amsrc1; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/audiovia823x; \
- $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/audioens; $(MAKE) clean; $(MAKE) warlock
-
warlock.ib:
@cd ../ibmf; $(MAKE) clean; $(MAKE) warlock
@cd ../ib; $(MAKE) clean; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/Makefile.sparc.shared b/usr/src/uts/sparc/Makefile.sparc.shared
index a452f8ef67..4829b38c36 100644
--- a/usr/src/uts/sparc/Makefile.sparc.shared
+++ b/usr/src/uts/sparc/Makefile.sparc.shared
@@ -261,7 +261,7 @@ $(CLOSED_BUILD)CLOSED_DRV_KMODS += ixgb
#
# Machine Specific Driver Modules (/kernel/drv):
#
-DRV_KMODS += audio1575 audio810 audiohd audiocs audiots
+DRV_KMODS += audio audio1575 audioens audiocs audiots audiopci austr
DRV_KMODS += bge bpp dmfe eri esp fas hme qfe
DRV_KMODS += openeepr options sd ses st
DRV_KMODS += ssd
@@ -306,8 +306,6 @@ DRV_KMODS += ii rdc rdcsrv rdcstub
DRV_KMODS += iscsi
DRV_KMODS += emlxs
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audioens
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audiovia823x
$(CLOSED_BUILD)CLOSED_DRV_KMODS += ifp
$(CLOSED_BUILD)CLOSED_DRV_KMODS += uata
$(CLOSED_BUILD)CLOSED_DRV_KMODS += usbser_edge
@@ -378,7 +376,7 @@ SYS_KMODS += doorfs pset acctctl portfs
#
# 'User' Modules (/kernel/misc):
#
-MISC_KMODS += amsrc2 audiosup mixer
+MISC_KMODS += ac97
MISC_KMODS += bignum
MISC_KMODS += consconfig gld ipc nfs_dlboot nfssrv scsi
MISC_KMODS += strplumb swapgeneric tlimod
@@ -420,7 +418,6 @@ MISC_KMODS += sda
MISC_KMODS += spuni
MISC_KMODS += hwa1480_fw uwba
-$(CLOSED_BUILD)CLOSED_MISC_KMODS += amsrc1
$(CLOSED_BUILD)CLOSED_MISC_KMODS += klmmod klmops
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_lsi
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_emc
@@ -483,7 +480,7 @@ $(CLOSED_BUILD)CLOSED_XMODS = \
#
# 'Dacf' Modules (/kernel/dacf):
#
-DACF_KMODS += usb_ac_dacf net_dacf
+DACF_KMODS += net_dacf
#
# MAC-Type Plugin Modules (/kernel/mac)
diff --git a/usr/src/uts/intel/audiosup/Makefile b/usr/src/uts/sparc/ac97/Makefile
index 2285741889..84b7c69ea7 100644
--- a/usr/src/uts/intel/audiosup/Makefile
+++ b/usr/src/uts/sparc/ac97/Makefile
@@ -19,15 +19,13 @@
# CDDL HEADER END
#
#
-# uts/intel/audiosup/Makefile
+# uts/sparc/ac97/Makefile
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# This makefile drives the production of the audio support (audiosup)
-# module.
+# This makefile drives the production of the ac97 support module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -37,18 +35,18 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = audiosup
-OBJECTS = $(AUDIO_SUP_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO_SUP_OBJS:%.o=$(LINTS_DIR)/%.ln)
+MODULE = ac97
+OBJECTS = $(AC97_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AC97_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AUDIO_SUP_OBJS:%.o=%.ll)
+WARLOCK_OUT = $(AC97_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
#
# Include common rules.
#
-include $(UTSBASE)/intel/Makefile.intel
+include $(UTSBASE)/sparc/Makefile.sparc
#
# Define targets
@@ -57,12 +55,7 @@ ALL_TARGET = $(BINARY)
LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -90,28 +83,4 @@ install: $(INSTALL_DEPS)
#
# Include common targets.
#
-include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiosup.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/framework/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/amsrc2/main.c b/usr/src/uts/sparc/amsrc2/main.c
deleted file mode 100644
index 613e960581..0000000000
--- a/usr/src/uts/sparc/amsrc2/main.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * main.c - A pseudo-kernel to use when analyzing am_src2.c with warlock.
- *
- * The main idea here is to represent all of the ways that the kernel can
- * call into the amsrc2, so that warlock has the correct view of the call
- * graph.
- */
-
-#include <sys/modctl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/am_src2_impl.h>
-
-am_ad_src_entry_t *src = &am_src2;
-
-main() {
-
- _init();
- _fini();
- _info(NULL);
-
- /*
- * ad_src_init() is called by am_open() before audio may begin playing
- * or recording. So this can be viewed as single threaded.
- */
- src->ad_src_init(NULL, 0);
-
- _NOTE(COMPETING_THREADS_NOW)
-
- src->ad_src_adjust(NULL, 0, 0);
- src->ad_src_convert(NULL, 0, 0, NULL, NULL, NULL, NULL);
- src->ad_src_size(NULL, NULL, 0, 0, 0);
- src->ad_src_update(NULL, NULL, NULL, NULL, 0);
-
- _NOTE(NO_COMPETING_THREADS_NOW)
-
- /*
- * ad_src_exit() is called by am_close() only when play and record have
- * stopped, thus it also is single threaded.
- */
- src->ad_src_exit(NULL, 0);
-
- return (0);
-}
diff --git a/usr/src/uts/sparc/audio/Makefile b/usr/src/uts/sparc/audio/Makefile
new file mode 100644
index 0000000000..2bb577fac6
--- /dev/null
+++ b/usr/src/uts/sparc/audio/Makefile
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audio/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio support module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audio
+OBJECTS = $(AUDIO_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIO_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audio1575/Makefile b/usr/src/uts/sparc/audio1575/Makefile
index 0abcdcdd1c..76706de77e 100644
--- a/usr/src/uts/sparc/audio1575/Makefile
+++ b/usr/src/uts/sparc/audio1575/Makefile
@@ -19,13 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/audio1575/Makefile
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the M1575 audio driver
# (audio1575) kernel module.
#
@@ -41,10 +39,7 @@ MODULE = audio1575
OBJECTS = $(AUDIO1575_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIO1575_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/sun/io/audio/sada/drv/audio1575
-WARLOCK_OUT = $(AUDIO1575_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audio1575
#
# Include common rules.
@@ -57,9 +52,9 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# Depends on misc/audiosup
+# Depends on drv/audio and misc/ac97
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -76,13 +71,6 @@ DEF_BUILDS = $(DEF_BUILDSONLY64)
CLEANLINTFILES += $(LINT32_FILES)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -92,10 +80,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -109,51 +95,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio1575_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio1575_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files \
- $(WLCMD_DIR)/audio1575.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio1575.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audio810/Makefile b/usr/src/uts/sparc/audio810/Makefile
deleted file mode 100644
index a087988ac4..0000000000
--- a/usr/src/uts/sparc/audio810/Makefile
+++ /dev/null
@@ -1,155 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audio810/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of Metropolis audio driver
-# (audio810) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audio810
-OBJECTS = $(AUDIO810_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO810_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audio810
-WARLOCK_OUT = $(AUDIO810_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/audiosup, misc/mixer
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY) $(SRC_CONFILE)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE_64)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS) lint32
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio810_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audio810_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audio810.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiocs/Makefile b/usr/src/uts/sparc/audiocs/Makefile
index 7371d07fa8..f4fd53c27f 100644
--- a/usr/src/uts/sparc/audiocs/Makefile
+++ b/usr/src/uts/sparc/audiocs/Makefile
@@ -21,11 +21,9 @@
#
# uts/sparc/audiocs/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the Crystal 4231
# audio driver (audiocs) kernel module.
#
@@ -42,10 +40,7 @@ MODULE = audiocs
OBJECTS = $(AUDIOCS_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOCS_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/sun/io/audio/sada/drv/audiocs
-WARLOCK_OUT = $(AUDIOCS_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/sun/io/audio/drv/audiocs
#
# Include common rules.
@@ -65,16 +60,9 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
CFLAGS += $(CCVERBOSE)
#
-# Depends on misc/audiosup and misc/mixer
+# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -86,10 +74,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -103,47 +89,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- warlock_standalone $(WLCMD_DIR)/audiocs_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiocs_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiocs.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiocs.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audioens/Makefile b/usr/src/uts/sparc/audioens/Makefile
new file mode 100644
index 0000000000..da0b7b2125
--- /dev/null
+++ b/usr/src/uts/sparc/audioens/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audioens/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audioens driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audioens
+OBJECTS = $(AUDIOENS_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOENS_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioens
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audiohd/Makefile b/usr/src/uts/sparc/audiohd/Makefile
deleted file mode 100644
index 38c21c1f70..0000000000
--- a/usr/src/uts/sparc/audiohd/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audiohd/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of high definition audio
-# driver (audiohd) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audiohd
-OBJECTS = $(AUDIOHD_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIOHD_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiohd
-WARLOCK_OUT = $(AUDIOHD_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/audiosup, misc/mixer
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY) $(SRC_CONFILE)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE_64)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS) lint32
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiohd_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiohd.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audioixp/Makefile b/usr/src/uts/sparc/audioixp/Makefile
deleted file mode 100644
index bace3949f0..0000000000
--- a/usr/src/uts/sparc/audioixp/Makefile
+++ /dev/null
@@ -1,117 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audioixp/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of hight definition audio
-# driver (audioixp) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audioixp
-WARLOCK_OUT = $(AUDIOIXP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: warlock
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audioixp_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audioixp.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiopci/Makefile b/usr/src/uts/sparc/audiopci/Makefile
new file mode 100644
index 0000000000..fcf95b3443
--- /dev/null
+++ b/usr/src/uts/sparc/audiopci/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audiopci/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audiopci driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audiopci
+OBJECTS = $(AUDIOPCI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOPCI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiopci
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audiosup/Makefile b/usr/src/uts/sparc/audiosup/Makefile
deleted file mode 100644
index 47bbf5e7e1..0000000000
--- a/usr/src/uts/sparc/audiosup/Makefile
+++ /dev/null
@@ -1,128 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/audiosup/Makefile
-#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio support (audiosup)
-# module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audiosup
-OBJECTS = $(AUDIO_SUP_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO_SUP_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AUDIO_SUP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Turn off -xspace so we get all optimizations.
-#
-SPACEFLAG =
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiosup.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/framework/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiots/Makefile b/usr/src/uts/sparc/audiots/Makefile
index 94887e61d1..0bb9e744e7 100644
--- a/usr/src/uts/sparc/audiots/Makefile
+++ b/usr/src/uts/sparc/audiots/Makefile
@@ -19,13 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/audiots/Makefile
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the T2 audio driver
# (audiots) kernel module.
#
@@ -41,10 +39,7 @@ MODULE = audiots
OBJECTS = $(AUDIOTS_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOTS_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiots
-WARLOCK_OUT = $(AUDIOTS_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiots
#
# Include common rules.
@@ -59,7 +54,7 @@ CFLAGS += $(CCVERBOSE)
#
# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
+LDFLAGS += -dy -N misc/ac97 -N drv/audio
#
# Define targets
@@ -76,14 +71,6 @@ DEF_BUILDS = $(DEF_BUILDSONLY64)
CLEANLINTFILES += $(LINT32_FILES)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -93,10 +80,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -110,50 +95,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiots_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiots_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiots.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiots.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/amsrc2/Makefile b/usr/src/uts/sparc/austr/Makefile
index 0d2672896c..f02bc322bb 100644
--- a/usr/src/uts/sparc/amsrc2/Makefile
+++ b/usr/src/uts/sparc/austr/Makefile
@@ -18,15 +18,14 @@
#
# CDDL HEADER END
#
-# uts/sparc/amsrc2/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# uts/sparc/austr/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# This makefile drives the production of the audio mixer
-# sample rate conversion routine #1 (amsrc2).
+# This makefile drives the production of the audio streams module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -36,12 +35,11 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = amsrc2
-OBJECTS = $(AMSRC2_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AMSRC2_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AMSRC2_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
+MODULE = austr
+OBJECTS = $(AUSTR_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUSTR_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
#
# Include common rules.
@@ -49,33 +47,16 @@ WARLOCK_OK = $(MODULE).ok
include $(UTSBASE)/sparc/Makefile.sparc
#
-# Turn off -xspace so we get all optimizations.
+# Depends on drv/audio
#
-SPACEFLAG =
+LDFLAGS += -dy -Ndrv/audio
#
# Define targets
#
-ALL_TARGET = $(BINARY)
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/amsrc2, misc/audiosup, and misc/mixer
-#
-LDFLAGS += -dy -Nmisc/audiosup -Nmisc/mixer
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
# Default build targets.
@@ -87,14 +68,12 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK) main.ll
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK) main.ll
lint: $(LINT_DEPS)
-modlintlib: $(MODLINTLIB_DEPS) lint32
+modlintlib: $(MODLINTLIB_DEPS)
clean.lint: $(CLEAN_LINT_DEPS)
@@ -104,27 +83,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-WARLOCK = warlock
-WLCC = wlcc
-TOUCH = touch
-TEST = test
-
-#
-# Warlock rules
-#
-
-warlock: main.ll $(WARLOCK_OK)
-
-main.ll: main.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ main.c
-
-$(WARLOCK_OK): $(WARLOCK_OUT)
- $(WARLOCK) $(WARLOCK_OUT) -l main.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c main.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
diff --git a/usr/src/uts/sparc/mixer/Makefile b/usr/src/uts/sparc/mixer/Makefile
deleted file mode 100644
index 0f23f2e6b0..0000000000
--- a/usr/src/uts/sparc/mixer/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/mixer/Makefile
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio mixer (mixer)
-# Audio Personality Module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = mixer
-OBJECTS = $(MIXER_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(MIXER_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(MIXER_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Turn off -xspace so we get all optimizations.
-#
-SPACEFLAG =
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_SUPPRESSION_DIRECTIVE_UNUSED
-LINTTAGS += -erroff=E_STATIC_UNUSED
-LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/audiosup
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_amsrc2.files \
- warlock_standalone $(WLCMD_DIR)/mixer_with_audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/mixer/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/mixer.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/os/dacf.conf b/usr/src/uts/sparc/os/dacf.conf
index de9e672a68..199afd894f 100644
--- a/usr/src/uts/sparc/os/dacf.conf
+++ b/usr/src/uts/sparc/os/dacf.conf
@@ -19,14 +19,13 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# NOTICE: This file contains important KERNEL STATE. Do not edit this file.
# Its format and contents are subject to change in future releases of Solaris.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# keyboard and mouse configuration rules
@@ -60,13 +59,6 @@ driver-minorname="su_pnp:mouse" consconfig_dacf:ms_config post-attach - pushmod=
driver-minorname="ttymux:con" ttymux_dacf:ttymux_config post-attach -
#
-# Configure and/or unconfigure usb audio devices.
-# usb_ac as a mux for hid and usb_as devices.
-#
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config post-attach -
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config pre-detach -
-
-#
# Devices directly supporting the keyboard API need no device-specific module,
# but do need to be linked to the console stream.
#
diff --git a/usr/src/uts/sparc/usb_ac/Makefile b/usr/src/uts/sparc/usb_ac/Makefile
index 7e5ccf3df5..bf3840846c 100644
--- a/usr/src/uts/sparc/usb_ac/Makefile
+++ b/usr/src/uts/sparc/usb_ac/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_ac/Makefile
@@ -40,7 +40,7 @@ OBJECTS = $(USB_AC_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(USB_AC_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/audio/usb_ac
-WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll) usb_ac_dacf.ll
+WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
@@ -55,7 +55,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Ndrv/audio
#
# Define targets
@@ -111,9 +111,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
@@ -130,7 +127,6 @@ warlock_with_sada: $(WLCMD_DIR)/usb_ac_with_sada.wlcmd \
$(WARLOCK_OUT) \
warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_ac_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
warlock_with_usba: $(WLCMD_DIR)/usb_ac_with_usba.wlcmd $(WARLOCK_OUT) \
diff --git a/usr/src/uts/sparc/usb_ac_dacf/Makefile b/usr/src/uts/sparc/usb_ac_dacf/Makefile
deleted file mode 100644
index 16f567e113..0000000000
--- a/usr/src/uts/sparc/usb_ac_dacf/Makefile
+++ /dev/null
@@ -1,89 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/usb_ac_dacf/Makefile
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of the usb_ac_dacf module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = usb_ac_dacf
-OBJECTS = $(USB_AC_DACF_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(USB_AC_DACF_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Dependencies
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
-
-clobber: $(CLOBBER_DEPS)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/usb_ah/Makefile b/usr/src/uts/sparc/usb_ah/Makefile
index cfc1d5b7fe..bd65518c1f 100644
--- a/usr/src/uts/sparc/usb_ah/Makefile
+++ b/usr/src/uts/sparc/usb_ah/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_ah/Makefile
@@ -56,9 +56,9 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# depends on usba, hidparser and mixer related misc modules
+# depends on usba, hidparser and audio related misc modules
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/hidparser -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Nmisc/hidparser -Ndrv/usb_ac
#
# Define targets
diff --git a/usr/src/uts/sparc/usb_as/Makefile b/usr/src/uts/sparc/usb_as/Makefile
index e258576618..bc7db4c381 100644
--- a/usr/src/uts/sparc/usb_as/Makefile
+++ b/usr/src/uts/sparc/usb_as/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_as/Makefile
@@ -56,9 +56,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# do not remove depends on amsrc2. If removed, amsrc2 gets unloaded when
-# usb_ac_dacf gets unloaded
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer -Nmisc/amsrc2
+LDFLAGS += -dy -Nmisc/usba -Ndrv/usb_ac
#
# Define targets
@@ -114,9 +112,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
@@ -124,16 +119,13 @@ AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
warlock: $(WARLOCK_OK)
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
+$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
warlock_standalone warlock_with_usba warlock_with_sada
$(TOUCH) $(WARLOCK_OK)
warlock_with_sada: $(WLCMD_DIR)/usb_as_with_sada.wlcmd \
- $(WARLOCK_OUT) \
- warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
+ $(WARLOCK_OUT) warlock_audiosup.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_as_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
warlock_with_usba: $(WLCMD_DIR)/usb_as_with_usba.wlcmd $(WARLOCK_OUT) \
@@ -168,9 +160,3 @@ warlock_ddi.files:
warlock_audiosup.files:
@cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/warlock/Makefile b/usr/src/uts/sparc/warlock/Makefile
index 746c15d646..4cbe0e4e15 100644
--- a/usr/src/uts/sparc/warlock/Makefile
+++ b/usr/src/uts/sparc/warlock/Makefile
@@ -18,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# sparc architecture dependent
@@ -51,7 +51,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
#
# lock_lint rules
#
-all: warlock warlock.1394 warlock.audio warlock.ecpp warlock.scsi \
+all: warlock warlock.1394 warlock.ecpp warlock.scsi \
warlock.smartcard warlock.usb warlock.ib warlock.sata warlock.wc
warlock: $(MODULE).ok
@@ -109,24 +109,6 @@ warlock.1394:
warlock.ecpp:
@cd ../ecpp; $(MAKE) clean; $(MAKE) warlock
-warlock.audio:
- @cd ../audiosup; $(MAKE) clean; $(MAKE) warlock
- @cd ../mixer; $(MAKE) clean; $(MAKE) warlock
- @cd ../amsrc2; $(MAKE) clean; $(MAKE) warlock
- @cd ../audio1575; $(MAKE) clean; $(MAKE) warlock
- @cd ../audio810; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiohd; $(MAKE) clean; $(MAKE) warlock
- @cd ../audioixp; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiocs; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiots; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ac; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_as; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ah; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/amsrc1; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/audiovia823x; \
- $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/audioens; $(MAKE) clean; $(MAKE) warlock
-
warlock.smartcard:
$(CLOSED_BUILD) @cd $(CLOSED)/uts/sun4u/scmi2c; $(MAKE) clean; $(MAKE) warlock
diff --git a/usr/src/uts/sun/Makefile.files b/usr/src/uts/sun/Makefile.files
index b8da4818f3..9821c7e90b 100644
--- a/usr/src/uts/sun/Makefile.files
+++ b/usr/src/uts/sun/Makefile.files
@@ -20,11 +20,9 @@
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# uts/sun/Makefile.files
#
# This Makefile defines file modules and build rules for the directory
@@ -48,7 +46,6 @@ GENUNIX_OBJS += \
# Driver Modules
#
AUDIOCS_OBJS += audio_4231.o audio_4231_apcdma.o audio_4231_eb2dma.o
-AUDIO1575_OBJS += audio1575.o
BPP_OBJS += bpp.o
diff --git a/usr/src/uts/sun/Makefile.rules b/usr/src/uts/sun/Makefile.rules
index cd583af7ac..22d0d3ec10 100644
--- a/usr/src/uts/sun/Makefile.rules
+++ b/usr/src/uts/sun/Makefile.rules
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# uts/sun/Makefile.rules
#
# This Makefile defines all build rules for the directory uts/sun and
@@ -48,11 +46,7 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- $(COMPILE.c) -o $@ $<
- $(CTFCONVERT_O)
-
-$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/drv/audiocs/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
@@ -99,10 +93,7 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/scsi/adapters/%.c
$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- @($(LHEAD) $(LINT.c) $< $(LTAIL))
-
-$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/drv/audiocs/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/eri/%.c
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c
new file mode 100644
index 0000000000..5c1b6db44b
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c
@@ -0,0 +1,2406 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audiocs Audio Driver
+ *
+ * This Audio Driver controls the Crystal CS4231 Codec used on many SPARC
+ * platforms. It does not support the CS4231 on Power PCs or x86 PCs. It
+ * does support two different DMA engines, the APC and EB2. The code for
+ * those DMA engines is split out and a well defined, but private, interface
+ * is used to control those DMA engines.
+ *
+ * For some reason setting the CS4231's registers doesn't always
+ * succeed. Therefore every time we set a register we always read it
+ * back to make sure it was set. If not we wait a little while and
+ * then try again. This is all taken care of in the routines
+ * audiocs_put_index() and audiocs_sel_index() and the macros ORIDX()
+ * and ANDIDX(). We don't worry about the status register because it
+ * is cleared by writing anything to it. So it doesn't matter what
+ * the value written is.
+ *
+ * This driver supports suspending and resuming. A suspend just stops playing
+ * and recording. The play DMA buffers end up getting thrown away, but when
+ * you shut down the machine there is a break in the audio anyway, so they
+ * won't be missed and it isn't worth the effort to save them. When we resume
+ * we always start playing and recording. If they aren't needed they get
+ * shut off by the mixer.
+ *
+ * Power management is supported by this driver.
+ *
+ * NOTE: This module depends on drv/audio being loaded first.
+ */
+
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/stropts.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audiocs_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audiocs_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audiocs_ddi_power(dev_info_t *, int, int);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audiocs_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audiocs_close(void *);
+static int audiocs_start(void *);
+static void audiocs_stop(void *);
+static int audiocs_format(void *);
+static int audiocs_channels(void *);
+static int audiocs_rate(void *);
+static uint64_t audiocs_count(void *);
+static void audiocs_sync(void *, unsigned);
+static size_t audiocs_qlen(void *);
+
+/*
+ * Control callbacks.
+ */
+static int audiocs_get_value(void *, uint64_t *);
+static int audiocs_set_ogain(void *, uint64_t);
+static int audiocs_set_igain(void *, uint64_t);
+static int audiocs_set_mgain(void *, uint64_t);
+static int audiocs_set_inputs(void *, uint64_t);
+static int audiocs_set_outputs(void *, uint64_t);
+static int audiocs_set_micboost(void *, uint64_t);
+
+/* Local Routines */
+static int audiocs_resume(dev_info_t *);
+static int audiocs_attach(dev_info_t *);
+static int audiocs_detach(dev_info_t *);
+static int audiocs_suspend(dev_info_t *);
+
+static void audiocs_destroy(CS_state_t *);
+static int audiocs_init_state(CS_state_t *);
+static int audiocs_chip_init(CS_state_t *);
+static int audiocs_alloc_engine(CS_state_t *, int);
+static void audiocs_free_engine(CS_engine_t *);
+static void audiocs_reset_engine(CS_engine_t *);
+static int audiocs_start_engine(CS_engine_t *);
+static void audiocs_stop_engine(CS_engine_t *);
+static void audiocs_get_ports(CS_state_t *);
+static void audiocs_configure_input(CS_state_t *);
+static void audiocs_configure_output(CS_state_t *);
+static CS_ctrl_t *audiocs_alloc_ctrl(CS_state_t *, uint32_t, uint64_t);
+static void audiocs_free_ctrl(CS_ctrl_t *);
+static int audiocs_add_controls(CS_state_t *);
+static void audiocs_del_controls(CS_state_t *);
+static void audiocs_power_up(CS_state_t *);
+static void audiocs_power_down(CS_state_t *);
+static int audiocs_poll_ready(CS_state_t *);
+#ifdef DEBUG
+static void audiocs_put_index(CS_state_t *, uint8_t, uint8_t, int);
+static void audiocs_sel_index(CS_state_t *, uint8_t, int);
+#define SELIDX(s, idx) audiocs_sel_index(s, idx, __LINE__)
+#define PUTIDX(s, val, mask) audiocs_put_index(s, val, mask, __LINE__)
+#else
+static void audiocs_put_index(CS_state_t *, uint8_t, uint8_t);
+static void audiocs_sel_index(CS_state_t *, uint8_t);
+#define SELIDX(s, idx) audiocs_sel_index(s, idx)
+#define PUTIDX(s, val, mask) audiocs_put_index(s, val, mask)
+#endif
+
+#define ORIDX(s, val, mask) \
+ PUTIDX(s, \
+ (ddi_get8((handle), &CS4231_IDR) | (uint8_t)(val)), \
+ (uint8_t)(mask))
+
+#define ANDIDX(s, val, mask) \
+ PUTIDX(s, (ddi_get8((handle), &CS4231_IDR) & (uint8_t)(val)), \
+ (uint8_t)(mask))
+
+static audio_engine_ops_t audiocs_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audiocs_open,
+ audiocs_close,
+ audiocs_start,
+ audiocs_stop,
+ audiocs_count,
+ audiocs_format,
+ audiocs_channels,
+ audiocs_rate,
+ audiocs_sync,
+ audiocs_qlen
+};
+
+#define OUTPUT_SPEAKER 0
+#define OUTPUT_HEADPHONES 1
+#define OUTPUT_LINEOUT 2
+
+static const char *audiocs_outputs[] = {
+ AUDIO_PORT_SPEAKER,
+ AUDIO_PORT_HEADPHONES,
+ AUDIO_PORT_LINEOUT,
+ NULL
+};
+
+#define INPUT_MIC 0
+#define INPUT_LINEIN 1
+#define INPUT_STEREOMIX 2
+#define INPUT_CD 3
+
+static const char *audiocs_inputs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_STEREOMIX,
+ AUDIO_PORT_CD,
+ NULL
+};
+
+/*
+ * Global variables, but viewable only by this file.
+ */
+
+/* play gain array, converts linear gain to 64 steps of log10 gain */
+static uint8_t cs4231_atten[] = {
+ 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, /* [000] -> [004] */
+ 0x3a, 0x39, 0x38, 0x37, 0x36, /* [005] -> [009] */
+ 0x35, 0x34, 0x33, 0x32, 0x31, /* [010] -> [014] */
+ 0x30, 0x2f, 0x2e, 0x2d, 0x2c, /* [015] -> [019] */
+ 0x2b, 0x2a, 0x29, 0x29, 0x28, /* [020] -> [024] */
+ 0x28, 0x27, 0x27, 0x26, 0x26, /* [025] -> [029] */
+ 0x25, 0x25, 0x24, 0x24, 0x23, /* [030] -> [034] */
+ 0x23, 0x22, 0x22, 0x21, 0x21, /* [035] -> [039] */
+ 0x20, 0x20, 0x1f, 0x1f, 0x1f, /* [040] -> [044] */
+ 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, /* [045] -> [049] */
+ 0x1d, 0x1c, 0x1c, 0x1c, 0x1b, /* [050] -> [054] */
+ 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, /* [055] -> [059] */
+ 0x1a, 0x19, 0x19, 0x19, 0x19, /* [060] -> [064] */
+ 0x18, 0x18, 0x18, 0x18, 0x17, /* [065] -> [069] */
+ 0x17, 0x17, 0x17, 0x16, 0x16, /* [070] -> [074] */
+ 0x16, 0x16, 0x16, 0x15, 0x15, /* [075] -> [079] */
+ 0x15, 0x15, 0x15, 0x14, 0x14, /* [080] -> [084] */
+ 0x14, 0x14, 0x14, 0x13, 0x13, /* [085] -> [089] */
+ 0x13, 0x13, 0x13, 0x12, 0x12, /* [090] -> [094] */
+ 0x12, 0x12, 0x12, 0x12, 0x11, /* [095] -> [099] */
+ 0x11, 0x11, 0x11, 0x11, 0x11, /* [100] -> [104] */
+ 0x10, 0x10, 0x10, 0x10, 0x10, /* [105] -> [109] */
+ 0x10, 0x0f, 0x0f, 0x0f, 0x0f, /* [110] -> [114] */
+ 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, /* [114] -> [119] */
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, /* [120] -> [124] */
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, /* [125] -> [129] */
+ 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, /* [130] -> [134] */
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, /* [135] -> [139] */
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, /* [140] -> [144] */
+ 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, /* [145] -> [149] */
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x09, /* [150] -> [154] */
+ 0x09, 0x09, 0x09, 0x09, 0x09, /* [155] -> [159] */
+ 0x09, 0x09, 0x08, 0x08, 0x08, /* [160] -> [164] */
+ 0x08, 0x08, 0x08, 0x08, 0x08, /* [165] -> [169] */
+ 0x08, 0x07, 0x07, 0x07, 0x07, /* [170] -> [174] */
+ 0x07, 0x07, 0x07, 0x07, 0x07, /* [175] -> [179] */
+ 0x06, 0x06, 0x06, 0x06, 0x06, /* [180] -> [184] */
+ 0x06, 0x06, 0x06, 0x06, 0x05, /* [185] -> [189] */
+ 0x05, 0x05, 0x05, 0x05, 0x05, /* [190] -> [194] */
+ 0x05, 0x05, 0x05, 0x05, 0x04, /* [195] -> [199] */
+ 0x04, 0x04, 0x04, 0x04, 0x04, /* [200] -> [204] */
+ 0x04, 0x04, 0x04, 0x04, 0x03, /* [205] -> [209] */
+ 0x03, 0x03, 0x03, 0x03, 0x03, /* [210] -> [214] */
+ 0x03, 0x03, 0x03, 0x03, 0x03, /* [215] -> [219] */
+ 0x02, 0x02, 0x02, 0x02, 0x02, /* [220] -> [224] */
+ 0x02, 0x02, 0x02, 0x02, 0x02, /* [225] -> [229] */
+ 0x02, 0x01, 0x01, 0x01, 0x01, /* [230] -> [234] */
+ 0x01, 0x01, 0x01, 0x01, 0x01, /* [235] -> [239] */
+ 0x01, 0x01, 0x01, 0x00, 0x00, /* [240] -> [244] */
+ 0x00, 0x00, 0x00, 0x00, 0x00, /* [245] -> [249] */
+ 0x00, 0x00, 0x00, 0x00, 0x00, /* [250] -> [254] */
+ 0x00 /* [255] */
+};
+
+/*
+ * STREAMS Structures
+ */
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audiocs_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe - not needed */
+ audiocs_ddi_attach, /* devo_attach */
+ audiocs_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ audiocs_ddi_power, /* devo_power */
+ ddi_quiesce_not_supported, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audiocs_modldrv = {
+ &mod_driverops, /* drv_modops */
+ CS4231_MOD_NAME, /* drv_linkinfo */
+ &audiocs_dev_ops /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audiocs_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audiocs_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/* ******* Loadable Module Configuration Entry Points ********************* */
+
+/*
+ * _init()
+ *
+ * Description:
+ * Implements _init(9E).
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiocs_dev_ops, CS4231_NAME);
+
+ if ((rv = mod_install(&audiocs_modlinkage)) != 0) {
+ audio_fini_ops(&audiocs_dev_ops);
+ }
+
+ return (rv);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Implements _fini(9E).
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&audiocs_modlinkage)) == 0) {
+ audio_fini_ops(&audiocs_dev_ops);
+ }
+
+ return (rv);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Implements _info(9E).
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audiocs_modlinkage, modinfop));
+}
+
+
+/* ******* Driver Entry Points ******************************************** */
+
+/*
+ * audiocs_ddi_attach()
+ *
+ * Description:
+ * Implement attach(9e).
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audiocs_attach(dip));
+
+ case DDI_RESUME:
+ return (audiocs_resume(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audiocs_ddi_detach()
+ *
+ * Description:
+ * Implement detach(9e).
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS Success.
+ * DDI_FAILURE Failure.
+ */
+static int
+audiocs_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audiocs_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audiocs_suspend(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audiocs_ddi_power()
+ *
+ * Description:
+ * Implements power(9E).
+ *
+ * Arguments:
+ * def_info_t *dip Ptr to the device's dev_info structure
+ * int component Which component to power up/down
+ * int level The power level for the component
+ *
+ * Returns:
+ * DDI_SUCCESS Power level changed, we always succeed
+ */
+static int
+audiocs_ddi_power(dev_info_t *dip, int component, int level)
+{
+ CS_state_t *state;
+
+ if (component != CS4231_COMPONENT)
+ return (DDI_FAILURE);
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ /* make sure we have some work to do */
+ mutex_enter(&state->cs_lock);
+
+ /*
+ * We don't do anything if we're suspended. Suspend/resume diddles
+ * with power anyway.
+ */
+ if (!state->cs_suspended) {
+
+ /* check the level change to see what we need to do */
+ if (level == CS4231_PWR_OFF && state->cs_powered) {
+
+ /* power down and save the state */
+ audiocs_power_down(state);
+ state->cs_powered = B_FALSE;
+
+ } else if (level == CS4231_PWR_ON && !state->cs_powered) {
+
+ /* power up */
+ audiocs_power_up(state);
+ state->cs_powered = B_TRUE;
+ }
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ return (DDI_SUCCESS);
+}
+
+/* ******* Local Routines *************************************************** */
+
+static void
+audiocs_destroy(CS_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ /*
+ * Unregister any interrupts. That way we can't get called by and
+ * interrupt after the audio framework is removed.
+ */
+ CS4231_DMA_REM_INTR(state);
+
+ for (int i = CS4231_PLAY; i <= CS4231_REC; i++) {
+ audiocs_free_engine(state->cs_engines[i]);
+ }
+ audiocs_del_controls(state);
+
+ /* free the kernel statistics structure */
+ if (state->cs_ksp) {
+ kstat_delete(state->cs_ksp);
+ }
+
+ if (state->cs_adev) {
+ audio_dev_free(state->cs_adev);
+ }
+
+ /* unmap the registers */
+ CS4231_DMA_UNMAP_REGS(state);
+
+ /* destroy the state mutex */
+ mutex_destroy(&state->cs_lock);
+ kmem_free(state, sizeof (*state));
+}
+
+/*
+ * audiocs_attach()
+ *
+ * Description:
+ * Attach an instance of the CS4231 driver. This routine does the device
+ * dependent attach tasks. When it is complete it calls
+ * audio_dev_register() to register with the framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_attach(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+
+ /* allocate the state structure */
+ state = kmem_zalloc(sizeof (*state), KM_SLEEP);
+ state->cs_dip = dip;
+ ddi_set_driver_private(dip, state);
+
+ /* get the iblock cookie needed for interrupt context */
+ if (ddi_get_iblock_cookie(dip, 0, &state->cs_iblock) != DDI_SUCCESS) {
+ audio_dev_warn(NULL, "cannot get iblock cookie");
+ kmem_free(state, sizeof (*state));
+ return (DDI_FAILURE);
+ }
+
+ /* now fill it in, initialize the state mutexs first */
+ mutex_init(&state->cs_lock, NULL, MUTEX_DRIVER, state->cs_iblock);
+
+ /*
+ * audio state initialization... should always succeed,
+ * framework will message failure.
+ */
+ if ((state->cs_adev = audio_dev_alloc(dip, 0)) == NULL) {
+ goto error;
+ }
+ adev = state->cs_adev;
+ audio_dev_set_description(adev, CS_DEV_CONFIG_ONBRD1);
+ audio_dev_add_info(adev, "Legacy codec: Crystal Semiconductor CS4231");
+
+ /* initialize the audio state structures */
+ if ((audiocs_init_state(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "init_state() failed");
+ goto error;
+ }
+
+ /* initialize the audio chip */
+ if ((audiocs_chip_init(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "chip_init() failed");
+ goto error;
+ }
+ /* chip init will have powered us up */
+ state->cs_powered = B_TRUE;
+
+ /* set up kernel statistics */
+ if ((state->cs_ksp = kstat_create(ddi_driver_name(dip),
+ ddi_get_instance(dip), ddi_driver_name(dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(state->cs_ksp);
+ }
+
+ /* we're ready, set up the interrupt handler */
+ if (CS4231_DMA_ADD_INTR(state) != DDI_SUCCESS) {
+ goto error;
+ }
+
+ /* finally register with framework to kick everything off */
+ if (audio_dev_register(state->cs_adev) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "unable to register audio dev");
+ }
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audiocs_destroy(state);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audiocs_resume()
+ *
+ * Description:
+ * Resume a suspended device instance.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_resume(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+
+ /* we've already allocated the state structure so get ptr */
+ state = ddi_get_driver_private(dip);
+ adev = state->cs_adev;
+
+ ASSERT(dip == state->cs_dip);
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ /* mark the Codec busy -- this should keep power(9e) away */
+ (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
+
+ /* power it up */
+ audiocs_power_up(state);
+ state->cs_powered = B_TRUE;
+
+ /* initialize the audio chip */
+ if ((audiocs_chip_init(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "chip_init() failed");
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&state->cs_lock);
+ state->cs_suspended = B_FALSE;
+
+ /* restore mixer settings */
+ audiocs_configure_output(state);
+ audiocs_configure_input(state);
+
+ for (int i = CS4231_PLAY; i <= CS4231_REC; i++) {
+ CS_engine_t *eng = state->cs_engines[i];
+
+ audiocs_reset_engine(eng);
+ if (eng->ce_started) {
+ (void) audiocs_start_engine(eng);
+ } else {
+ audiocs_stop_engine(eng);
+ }
+ }
+ mutex_exit(&state->cs_lock);
+
+ /*
+ * We have already powered up the chip, but this alerts the
+ * framework to the fact.
+ */
+ (void) pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON);
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_detach()
+ *
+ * Description:
+ * Detach an instance of the CS4231 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached (busy)
+ */
+static int
+audiocs_detach(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+ ddi_acc_handle_t handle;
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+ handle = CODEC_HANDLE;
+ adev = state->cs_adev;
+
+ /* don't detach if still in use */
+ if (audio_dev_unregister(adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ if (state->cs_powered) {
+ /*
+ * Make sure the Codec and DMA engine are off.
+ */
+ SELIDX(state, INTC_REG);
+ ANDIDX(state, ~(INTC_PEN|INTC_CEN), INTC_VALID_MASK);
+
+ /* make sure the DMA engine isn't going to do anything */
+ CS4231_DMA_RESET(state);
+
+ /*
+ * power down the device, no reason to waste power without
+ * a driver
+ */
+ (void) pm_lower_power(dip, CS4231_COMPONENT, CS4231_PWR_OFF);
+ }
+
+ audiocs_destroy(state);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_suspend()
+ *
+ * Description:
+ * Suspend an instance of the CS4231 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audiocs_suspend(dev_info_t *dip)
+{
+ CS_state_t *state;
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ mutex_enter(&state->cs_lock);
+
+ ASSERT(!state->cs_suspended);
+
+ if (state->cs_powered) {
+ /* stop playing and recording */
+ CS4231_DMA_STOP(state, state->cs_engines[CS4231_PLAY]);
+ CS4231_DMA_STOP(state, state->cs_engines[CS4231_REC]);
+
+ /* now we can power down the Codec */
+ audiocs_power_down(state);
+ state->cs_powered = B_FALSE;
+ }
+ state->cs_suspended = B_TRUE; /* stop new ops */
+ mutex_exit(&state->cs_lock);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+ return (DDI_SUCCESS);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+
+/*
+ * audiocs_alloc_ctrl
+ *
+ * Description:
+ * Allocates a control structure for the audio mixer.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ * uint32_t num Control number to allocate.
+ * uint64_t val Initial value.
+ *
+ * Returns:
+ * Pointer to newly allocated CS_ctrl_t structure.
+ */
+static CS_ctrl_t *
+audiocs_alloc_ctrl(CS_state_t *state, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ CS_ctrl_t *cc;
+
+ cc = kmem_zalloc(sizeof (*cc), KM_SLEEP);
+ cc->cc_state = state;
+ cc->cc_num = num;
+
+ bzero(&desc, sizeof (desc));
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiocs_set_ogain;
+ break;
+
+ case CTL_IGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_RECGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiocs_set_igain;
+ break;
+
+ case CTL_MGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_MONGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MONVOL;
+ fn = audiocs_set_mgain;
+ break;
+
+ case CTL_INPUTS:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = state->cs_imask;
+ desc.acd_maxvalue = state->cs_imask;
+ desc.acd_flags = RECCTL;
+ for (int i = 0; audiocs_inputs[i]; i++) {
+ desc.acd_enum[i] = audiocs_inputs[i];
+ }
+ fn = audiocs_set_inputs;
+
+ break;
+
+ case CTL_OUTPUTS:
+ desc.acd_name = AUDIO_CTRL_ID_OUTPUTS;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = state->cs_omod;
+ desc.acd_maxvalue = state->cs_omask;
+ desc.acd_flags = PLAYCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiocs_outputs[i]; i++) {
+ desc.acd_enum[i] = audiocs_outputs[i];
+ }
+ fn = audiocs_set_outputs;
+ break;
+
+ case CTL_MICBOOST:
+ desc.acd_name = AUDIO_CTRL_ID_MICBOOST;
+ desc.acd_type = AUDIO_CTRL_TYPE_BOOLEAN;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 1;
+ desc.acd_flags = RECCTL;
+ fn = audiocs_set_micboost;
+ break;
+ }
+
+ cc->cc_val = val;
+ cc->cc_ctrl = audio_dev_add_control(state->cs_adev, &desc,
+ audiocs_get_value, fn, cc);
+
+ return (cc);
+}
+
+/*
+ * audiocs_free_ctrl
+ *
+ * Description:
+ * Frees a control and all resources associated with it.
+ *
+ * Arguments:
+ * CS_ctrl_t *cc Pointer to control structure.
+ */
+static void
+audiocs_free_ctrl(CS_ctrl_t *cc)
+{
+ if (cc == NULL)
+ return;
+ if (cc->cc_ctrl)
+ audio_dev_del_control(cc->cc_ctrl);
+ kmem_free(cc, sizeof (*cc));
+}
+
+/*
+ * audiocs_add_controls
+ *
+ * Description:
+ * Allocates and registers all controls for this device.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ *
+ * Returns:
+ * DDI_SUCCESS All controls added and registered
+ * DDI_FAILURE At least one control was not added or registered.
+ */
+static int
+audiocs_add_controls(CS_state_t *state)
+{
+#define ADD_CTRL(CTL, ID, VAL) \
+ state->cs_##CTL = audiocs_alloc_ctrl(state, ID, VAL); \
+ if (state->cs_##CTL == NULL) { \
+ audio_dev_warn(state->cs_adev, \
+ "unable to allocate %s control", #ID); \
+ return (DDI_FAILURE); \
+ }
+
+ ADD_CTRL(ogain, CTL_VOLUME, 0x4b4b);
+ ADD_CTRL(igain, CTL_IGAIN, 0x3232);
+ ADD_CTRL(mgain, CTL_MGAIN, 0);
+ ADD_CTRL(micboost, CTL_MICBOOST, 0);
+ ADD_CTRL(outputs, CTL_OUTPUTS, (state->cs_omask & ~state->cs_omod) |
+ (1U << OUTPUT_SPEAKER));
+ ADD_CTRL(inputs, CTL_INPUTS, (1U << INPUT_MIC));
+
+ mutex_enter(&state->cs_lock);
+ audiocs_configure_output(state);
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (DDI_SUCCESS);
+}
+/*
+ * audiocs_del_controls
+ *
+ * Description:
+ * Unregisters and frees all controls for this device.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ */
+void
+audiocs_del_controls(CS_state_t *state)
+{
+ audiocs_free_ctrl(state->cs_ogain);
+ audiocs_free_ctrl(state->cs_igain);
+ audiocs_free_ctrl(state->cs_mgain);
+ audiocs_free_ctrl(state->cs_micboost);
+ audiocs_free_ctrl(state->cs_inputs);
+ audiocs_free_ctrl(state->cs_outputs);
+}
+
+
+/*
+ * audiocs_chip_init()
+ *
+ * Description:
+ * Power up the audio core, initialize the audio Codec, prepare the chip
+ * for use.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Chip initialized and ready to use
+ * DDI_FAILURE Chip not initialized and not ready
+ */
+static int
+audiocs_chip_init(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ /* make sure we are powered up */
+ CS4231_DMA_POWER(state, CS4231_PWR_ON);
+
+ CS4231_DMA_RESET(state);
+
+ /* activate registers 16 -> 31 */
+ SELIDX(state, MID_REG);
+ ddi_put8(handle, &CS4231_IDR, MID_MODE2);
+
+ /* now figure out what version we have */
+ SELIDX(state, VID_REG);
+ if (ddi_get8(handle, &CS4231_IDR) & VID_A) {
+ state->cs_revA = B_TRUE;
+ } else {
+ state->cs_revA = B_FALSE;
+ }
+
+ /* get rid of annoying popping by muting the output channels */
+ SELIDX(state, LDACO_REG);
+ PUTIDX(state, LDACO_LDM | LDACO_MID_GAIN, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ PUTIDX(state, RDACO_RDM | RDACO_MID_GAIN, RDAC0_VALID_MASK);
+
+ /* initialize aux input channels to known gain values & muted */
+ SELIDX(state, LAUX1_REG);
+ PUTIDX(state, LAUX1_LX1M | LAUX1_UNITY_GAIN, LAUX1_VALID_MASK);
+ SELIDX(state, RAUX1_REG);
+ PUTIDX(state, RAUX1_RX1M | RAUX1_UNITY_GAIN, RAUX1_VALID_MASK);
+ SELIDX(state, LAUX2_REG);
+ PUTIDX(state, LAUX2_LX2M | LAUX2_UNITY_GAIN, LAUX2_VALID_MASK);
+ SELIDX(state, RAUX2_REG);
+ PUTIDX(state, RAUX2_RX2M | RAUX2_UNITY_GAIN, RAUX2_VALID_MASK);
+
+ /* initialize aux input channels to known gain values & muted */
+ SELIDX(state, LLIC_REG);
+ PUTIDX(state, LLIC_LLM | LLIC_UNITY_GAIN, LLIC_VALID_MASK);
+ SELIDX(state, RLIC_REG);
+ PUTIDX(state, RLIC_RLM | RLIC_UNITY_GAIN, RLIC_VALID_MASK);
+
+ /* program the sample rate, play and capture must be the same */
+ SELIDX(state, FSDF_REG | IAR_MCE);
+ PUTIDX(state, FS_48000 | PDF_LINEAR16NE | PDF_STEREO, FSDF_VALID_MASK);
+ SELIDX(state, FSDF_REG);
+ SELIDX(state, CDF_REG | IAR_MCE);
+ PUTIDX(state, CDF_LINEAR16NE | CDF_STEREO, CDF_VALID_MASK);
+ SELIDX(state, CDF_REG);
+
+ /*
+ * Set up the Codec for playback and capture disabled, dual DMA, and
+ * playback and capture DMA.
+ */
+ SELIDX(state, (INTC_REG | IAR_MCE));
+ PUTIDX(state, INTC_DDC | INTC_PDMA | INTC_CDMA, INTC_VALID_MASK);
+
+ /* turn off the MCE bit */
+ SELIDX(state, LADCI_REG);
+
+ /* wait for the Codec before we continue XXX - do we need this? */
+ if (audiocs_poll_ready(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Turn on the output level bit to be 2.8 Vpp. Also, don't go to 0 on
+ * underflow.
+ */
+ SELIDX(state, AFE1_REG);
+ PUTIDX(state, AFE1_OLB, AFE1_VALID_MASK);
+
+ /* turn on the high pass filter if Rev A */
+ SELIDX(state, AFE2_REG);
+ if (state->cs_revA) {
+ PUTIDX(state, AFE2_HPF, AFE2_VALID_MASK);
+ } else {
+ PUTIDX(state, 0, AFE2_VALID_MASK);
+ }
+
+ /* clear the play and capture interrupt flags */
+ SELIDX(state, AFS_REG);
+ ddi_put8(handle, &CS4231_STATUS, (AFS_RESET_STATUS));
+
+ /* the play and record gains will be set by the audio mixer */
+
+ /* unmute the output */
+ SELIDX(state, LDACO_REG);
+ ANDIDX(state, ~LDACO_LDM, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ ANDIDX(state, ~RDACO_RDM, RDAC0_VALID_MASK);
+
+ /* unmute the mono speaker and mute mono in */
+ SELIDX(state, MIOC_REG);
+ PUTIDX(state, MIOC_MIM, MIOC_VALID_MASK);
+
+ /* clear the mode change bit */
+ SELIDX(state, RDACO_REG);
+
+ /* wait for the Codec before we continue XXX - do we need this? */
+ if (audiocs_poll_ready(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_init_state()
+ *
+ * Description:
+ * This routine initializes the audio driver's state structure and
+ * maps in the registers. This also includes reading the properties.
+ *
+ * CAUTION: This routine maps the registers and initializes a mutex.
+ * Failure cleanup is handled by cs4231_attach(). It is not
+ * handled locally by this routine.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS State structure initialized
+ * DDI_FAILURE State structure not initialized
+ */
+static int
+audiocs_init_state(CS_state_t *state)
+{
+ audio_dev_t *adev = state->cs_adev;
+ dev_info_t *dip = state->cs_dip;
+ char *prop_str;
+ char *pm_comp[] = {
+ "NAME=audiocs audio device",
+ "0=off",
+ "1=on" };
+
+ /* set up the pm-components */
+ if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
+ "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
+ audio_dev_warn(adev, "couldn't create pm-components property");
+ return (DDI_FAILURE);
+ }
+
+ /* figure out which DMA engine hardware we have */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "dma-model", &prop_str) == DDI_PROP_SUCCESS) {
+ if (strcmp(prop_str, "eb2dma") == 0) {
+ state->cs_dma_engine = EB2_DMA;
+ state->cs_dma_ops = &cs4231_eb2dma_ops;
+ } else {
+ state->cs_dma_engine = APC_DMA;
+ state->cs_dma_ops = &cs4231_apcdma_ops;
+ }
+ ddi_prop_free(prop_str);
+ } else {
+ state->cs_dma_engine = APC_DMA;
+ state->cs_dma_ops = &cs4231_apcdma_ops;
+ }
+
+ /* cs_regs, cs_eb2_regs and cs_handles filled in later */
+
+ /* most of what's left is filled in when the registers are mapped */
+
+ audiocs_get_ports(state);
+
+ /* Allocate engines, must be done before register mapping called */
+ if ((audiocs_alloc_engine(state, CS4231_PLAY) != DDI_SUCCESS) ||
+ (audiocs_alloc_engine(state, CS4231_REC) != DDI_SUCCESS)) {
+ return (DDI_FAILURE);
+ }
+
+ /* Map in the registers */
+ if (CS4231_DMA_MAP_REGS(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+
+ /* Allocate and add controls, must be done *after* registers mapped */
+ if (audiocs_add_controls(state) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ state->cs_suspended = B_FALSE;
+ state->cs_powered = B_FALSE;
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_get_ports()
+ *
+ * Description:
+ * Get which audiocs h/w version we have and use this to
+ * determine the input and output ports as well whether or not
+ * the hardware has internal loopbacks or not. We also have three
+ * different ways for the properties to be specified, which we
+ * also need to worry about.
+ *
+ * Vers Platform(s) DMA eng. audio-module** loopback
+ * a SS-4+/SS-5+ apcdma no no
+ * b Ultra-1&2 apcdma no yes
+ * c positron apcdma no yes
+ * d PPC - retired
+ * e x86 - retired
+ * f tazmo eb2dma Perigee no
+ * g tazmo eb2dma Quark yes
+ * h darwin+ eb2dma no N/A
+ *
+ * Vers model~ aux1* aux2*
+ * a N/A N/A N/A
+ * b N/A N/A N/A
+ * c N/A N/A N/A
+ * d retired
+ * e retired
+ * f SUNW,CS4231f N/A N/A
+ * g SUNW,CS4231g N/A N/A
+ * h SUNW,CS4231h cdrom none
+ *
+ * * = Replaces internal-loopback for latest property type, can be
+ * set to "cdrom", "loopback", or "none".
+ *
+ * ** = For plugin audio modules only. Starting with darwin, this
+ * property is replaces by the model property.
+ *
+ * ~ = Replaces audio-module.
+ *
+ * + = Has the capability of having a cable run from the internal
+ * CD-ROM to the audio device.
+ *
+ * N/A = Not applicable, the property wasn't created for early
+ * platforms, or the property has been retired.
+ *
+ * NOTE: Older tazmo and quark machines don't have the model property.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_get_ports(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+ audio_dev_t *adev = state->cs_adev;
+ char *prop_str;
+
+ /* First we set the common ports, etc. */
+ state->cs_omask = state->cs_omod =
+ (1U << OUTPUT_SPEAKER) |
+ (1U << OUTPUT_HEADPHONES) |
+ (1U << OUTPUT_LINEOUT);
+ state->cs_imask =
+ (1U << INPUT_MIC) |
+ (1U << INPUT_LINEIN) |
+ (1U << INPUT_STEREOMIX);
+
+ /* now we try the new "model" property */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "model", &prop_str) == DDI_PROP_SUCCESS) {
+ if (strcmp(prop_str, "SUNW,CS4231h") == 0) {
+ /* darwin */
+ audio_dev_set_version(adev, CS_DEV_VERSION_H);
+ state->cs_imask |= (1U << INPUT_CD);
+ state->cs_omod = (1U << OUTPUT_SPEAKER);
+ } else if (strcmp(prop_str, "SUNW,CS4231g") == 0) {
+ /* quark audio module */
+ audio_dev_set_version(adev, CS_DEV_VERSION_G);
+ /*
+ * NB: This could do SUNVTS LOOPBACK, but we
+ * don't support it for now... owing to no
+ * support in framework.
+ */
+ } else if (strcmp(prop_str, "SUNW,CS4231f") == 0) {
+ /* tazmo */
+ audio_dev_set_version(adev, CS_DEV_VERSION_F);
+ } else {
+ audio_dev_set_version(adev, prop_str);
+ audio_dev_warn(adev,
+ "unknown audio model: %s, some parts of "
+ "audio may not work correctly", prop_str);
+ }
+ ddi_prop_free(prop_str); /* done with the property */
+ } else { /* now try the older "audio-module" property */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "audio-module", &prop_str) ==
+ DDI_PROP_SUCCESS) {
+ switch (*prop_str) {
+ case 'Q': /* quark audio module */
+ audio_dev_set_version(adev, CS_DEV_VERSION_G);
+ /* See quark comment above about SunVTS */
+ break;
+ case 'P': /* tazmo */
+ audio_dev_set_version(adev, CS_DEV_VERSION_F);
+ break;
+ default:
+ audio_dev_set_version(adev, prop_str);
+ audio_dev_warn(adev,
+ "unknown audio module: %s, some "
+ "parts of audio may not work correctly",
+ prop_str);
+ break;
+ }
+ ddi_prop_free(prop_str); /* done with the prop */
+ } else { /* now try heuristics, ;-( */
+ if (ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "internal-loopback", B_FALSE)) {
+ if (state->cs_dma_engine == EB2_DMA) {
+ audio_dev_set_version(adev,
+ CS_DEV_VERSION_C);
+ } else {
+ audio_dev_set_version(adev,
+ CS_DEV_VERSION_B);
+ }
+ /*
+ * Again, we don't support SunVTS for these
+ * boards, although we potentially could.
+ */
+ } else {
+ audio_dev_set_version(adev, CS_DEV_VERSION_A);
+ state->cs_imask |= (1U << INPUT_CD);
+ }
+ }
+ }
+}
+
+/*
+ * audiocs_power_up()
+ *
+ * Description:
+ * Power up the Codec and restore the codec's registers.
+ *
+ * NOTE: We don't worry about locking since the only routines
+ * that may call us are attach() and power() Both of
+ * which should be the only threads in the driver.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_power_up(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ int i;
+
+ /* turn on the Codec */
+ CS4231_DMA_POWER(state, CS4231_PWR_ON);
+
+ /* reset the DMA engine(s) */
+ CS4231_DMA_RESET(state);
+
+ /*
+ * Reload the Codec's registers, the DMA engines will be
+ * taken care of when play and record start up again. But
+ * first enable registers 16 -> 31.
+ */
+ SELIDX(state, MID_REG);
+ PUTIDX(state, state->cs_save[MID_REG], MID_VALID_MASK);
+
+ for (i = 0; i < CS4231_REGS; i++) {
+ /* restore Codec registers */
+ SELIDX(state, (i | IAR_MCE));
+ ddi_put8(handle, &CS4231_IDR, state->cs_save[i]);
+ drv_usecwait(500); /* chip bug */
+ }
+ /* clear MCE bit */
+ SELIDX(state, 0);
+}
+
+/*
+ * audiocs_power_down()
+ *
+ * Description:
+ * Power down the Codec and save the codec's registers.
+ *
+ * NOTE: See the note in cs4231_power_up() about locking.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_power_down(CS_state_t *state)
+{
+ ddi_acc_handle_t handle;
+ int i;
+
+ handle = state->cs_handles.cs_codec_hndl;
+
+ /*
+ * We are powering down, so we don't need to do a thing with
+ * the DMA engines. However, we do need to save the Codec
+ * registers.
+ */
+
+ for (i = 0; i < CS4231_REGS; i++) {
+ /* save Codec regs */
+ SELIDX(state, i);
+ state->cs_save[i] = ddi_get8(handle, &CS4231_IDR);
+ }
+
+ /* turn off the Codec */
+ CS4231_DMA_POWER(state, CS4231_PWR_OFF);
+
+} /* cs4231_power_down() */
+
+/*
+ * audiocs_configure_input()
+ *
+ * Description:
+ * Configure input properties of the mixer (e.g. igain, ports).
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_configure_input(CS_state_t *state)
+{
+ uint8_t l, r;
+ uint64_t inputs;
+ uint64_t micboost;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (state->cs_suspended)
+ return;
+
+ inputs = state->cs_inputs->cc_val;
+ micboost = state->cs_micboost->cc_val;
+ r = (state->cs_igain->cc_val & 0xff);
+ l = ((state->cs_igain->cc_val & 0xff00) >> 8);
+
+ /* rescale these for our atten array */
+ l = (((uint32_t)l * 255) / 100) & 0xff;
+ r = (((uint32_t)r * 255) / 100) & 0xff;
+
+ /* we downshift by 4 bits -- igain only has 16 possible values */
+ /* NB: that we do not scale here! The SADA driver didn't do so. */
+ l = l >> 4;
+ r = r >> 4;
+
+ if (inputs & (1U << INPUT_MIC)) {
+ l |= LADCI_LMIC;
+ r |= RADCI_RMIC;
+ }
+ if (inputs & (1U << INPUT_LINEIN)) {
+ l |= LADCI_LLINE;
+ r |= RADCI_RLINE;
+ }
+ if (inputs & (1U << INPUT_CD)) {
+ /* note that SunVTS also uses this */
+ l |= LADCI_LAUX1;
+ r |= RADCI_RAUX1;
+ }
+ if (inputs & (1U << INPUT_STEREOMIX)) {
+ l |= LADCI_LLOOP;
+ r |= RADCI_RLOOP;
+ }
+ if (micboost) {
+ l |= LADCI_LMGE;
+ r |= RADCI_RMGE;
+ }
+
+ SELIDX(state, LADCI_REG);
+ PUTIDX(state, l, LADCI_VALID_MASK);
+
+ SELIDX(state, RADCI_REG);
+ PUTIDX(state, r, RADCI_VALID_MASK);
+}
+
+/*
+ * audiocs_configure_output()
+ *
+ * Description:
+ * Configure output properties of the mixer (e.g. ogain, mgain).
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_configure_output(CS_state_t *state)
+{
+ uint64_t outputs;
+ uint8_t l, r;
+ uint8_t rmute, lmute;
+ uint8_t mgain;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ rmute = lmute = 0;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (state->cs_suspended)
+ return;
+
+ outputs = state->cs_outputs->cc_val;
+
+ /* port selection */
+ SELIDX(state, MIOC_REG);
+ if (outputs & (1U << OUTPUT_SPEAKER)) {
+ ANDIDX(state, ~MIOC_MONO_SPKR_MUTE, MIOC_VALID_MASK);
+ } else {
+ ORIDX(state, MIOC_MONO_SPKR_MUTE, MIOC_VALID_MASK);
+ }
+ SELIDX(state, PC_REG);
+ if (outputs & (1U << OUTPUT_HEADPHONES)) {
+ ANDIDX(state, ~PC_HEADPHONE_MUTE, PC_VALID_MASK);
+ } else {
+ ORIDX(state, PC_HEADPHONE_MUTE, PC_VALID_MASK);
+ }
+ SELIDX(state, PC_REG);
+ if (outputs & (1U << OUTPUT_LINEOUT)) {
+ ANDIDX(state, ~PC_LINE_OUT_MUTE, PC_VALID_MASK);
+ } else {
+ ORIDX(state, PC_LINE_OUT_MUTE, PC_VALID_MASK);
+ }
+
+ /* monitor gain */
+ mgain = cs4231_atten[((state->cs_mgain->cc_val * 255) / 100) & 0xff];
+ SELIDX(state, LC_REG);
+ if (mgain == 0) {
+ /* disable loopbacks when gain == 0 */
+ PUTIDX(state, LC_OFF, LC_VALID_MASK);
+ } else {
+ /* we use cs4231_atten[] to linearize attenuation */
+ PUTIDX(state, (mgain << 2) | LC_LBE, LC_VALID_MASK);
+ }
+
+ /* output gain */
+ l = ((state->cs_ogain->cc_val >> 8) & 0xff);
+ r = (state->cs_ogain->cc_val & 0xff);
+ if (l == 0) {
+ lmute = LDACO_LDM;
+ }
+ if (r == 0) {
+ rmute = RDACO_RDM;
+ }
+
+ /* rescale these for our atten array */
+ l = cs4231_atten[(((uint32_t)l * 255) / 100) & 0xff] | lmute;
+ r = cs4231_atten[(((uint32_t)r * 255) / 100) & 0xff] | rmute;
+
+ SELIDX(state, LDACO_REG);
+ PUTIDX(state, l, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ PUTIDX(state, r, RDAC0_VALID_MASK);
+}
+
+/*
+ * audiocs_get_value()
+ *
+ * Description:
+ * Get a control value
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t *valp Pointer to store value.
+ *
+ * Returns:
+ * 0 The Codec parameter has been retrieved.
+ */
+static int
+audiocs_get_value(void *arg, uint64_t *valp)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ mutex_enter(&state->cs_lock);
+ *valp = cc->cc_val;
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+
+/*
+ * audiocs_set_ogain()
+ *
+ * Description:
+ * Set the play gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (both left and right)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_ogain(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~0xffff) ||
+ ((val & 0xff) > 100) ||
+ (((val & 0xff00) >> 8) > 100))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_set_micboost()
+ *
+ * Description:
+ * Set the 20 dB microphone boost.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The 1 to enable, 0 to disable.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_micboost(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val ? B_TRUE : B_FALSE;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_set_igain()
+ *
+ * Description:
+ * Set the record gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (both left and right)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_igain(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~0xffff) ||
+ ((val & 0xff) > 100) ||
+ (((val & 0xff00) >> 8) > 100))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_inputs()
+ *
+ * Description:
+ * Set the input ports.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The mask of output ports.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_inputs(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if (val & ~(state->cs_imask))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_outputs()
+ *
+ * Description:
+ * Set the output ports.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The mask of input ports.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_outputs(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~(state->cs_omod)) !=
+ (state->cs_omask & ~state->cs_omod))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_mgain()
+ *
+ * Description:
+ * Set the monitor gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (monoaural).)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_mgain(void *arg, uint64_t gain)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if (gain > 100)
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = gain;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audiocs_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ dev_info_t *dip = state->cs_dip;
+
+ _NOTE(ARGUNUSED(flag));
+
+ (void) pm_busy_component(dip, CS4231_COMPONENT);
+ if (pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON) ==
+ DDI_FAILURE) {
+
+ /* match the busy call above */
+ (void) pm_idle_component(dip, CS4231_COMPONENT);
+
+ audio_dev_warn(state->cs_adev, "power up failed");
+ }
+
+ eng->ce_started = B_FALSE;
+ eng->ce_count = 0;
+
+ *fragfrp = eng->ce_fragfr;
+ *nfragsp = CS4231_NFRAGS;
+ *bufp = eng->ce_kaddr;
+
+ mutex_enter(&state->cs_lock);
+ audiocs_reset_engine(eng);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audiocs_close(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+
+ mutex_enter(&state->cs_lock);
+ audiocs_stop_engine(eng);
+ eng->ce_started = B_FALSE;
+ mutex_exit(&state->cs_lock);
+
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+}
+
+/*
+ * audiocs_stop()
+ *
+ * Description:
+ * This is called by the framework to stop an engine that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audiocs_stop(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+
+ mutex_enter(&state->cs_lock);
+ if (eng->ce_started) {
+ audiocs_stop_engine(eng);
+ eng->ce_started = B_FALSE;
+ }
+ mutex_exit(&state->cs_lock);
+}
+
+/*
+ * audiocs_start()
+ *
+ * Description:
+ * This is called by the framework to start an engine transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success, an errno otherwise
+ */
+static int
+audiocs_start(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ int rv = 0;
+
+ mutex_enter(&state->cs_lock);
+ if (!eng->ce_started) {
+ if (audiocs_start_engine(eng) == DDI_SUCCESS) {
+ eng->ce_started = B_TRUE;
+ } else {
+ rv = EIO;
+ }
+ }
+ mutex_exit(&state->cs_lock);
+ return (rv);
+}
+
+/*
+ * audiocs_format()
+ *
+ * Description:
+ * Called by the framework to query the format of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_NE
+ */
+static int
+audiocs_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_NE);
+}
+
+/*
+ * audiocs_channels()
+ *
+ * Description:
+ * Called by the framework to query the channels of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 2 (stereo)
+ */
+static int
+audiocs_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (2);
+}
+
+/*
+ * audiocs_rates()
+ *
+ * Description:
+ * Called by the framework to query the sample rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audiocs_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audiocs_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audiocs_count(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ uint64_t val;
+
+ mutex_enter(&state->cs_lock);
+ val = eng->ce_count;
+ mutex_exit(&state->cs_lock);
+
+ return (val);
+}
+
+/*
+ * audiocs_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audiocs_sync(void *arg, unsigned nframes)
+{
+ CS_engine_t *eng = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(eng->ce_dmah, 0, 0, eng->ce_syncdir);
+}
+
+/*
+ * audiocs_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audiocs_qlen(void *arg)
+{
+ CS_engine_t *eng = arg;
+
+ return (eng->ce_fragfr);
+}
+
+
+/*
+ * audiocs_reset_engine()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * CS_engine_t *engine DMA engine to stop.
+ */
+void
+audiocs_reset_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ uint8_t mask;
+ uint8_t value;
+ uint8_t reg;
+
+ if (eng->ce_num == CS4231_PLAY) {
+ /* sample rate only set on play side */
+ value = FS_48000 | PDF_STEREO | PDF_LINEAR16NE;
+ reg = FSDF_REG;
+ mask = FSDF_VALID_MASK;
+ } else {
+ value = CDF_STEREO | CDF_LINEAR16NE;
+ reg = CDF_REG;
+ mask = CDF_VALID_MASK;
+ }
+
+ SELIDX(state, reg | IAR_MCE);
+ PUTIDX(state, value, mask);
+
+ (void) audiocs_poll_ready(state);
+
+ /* clear the mode change bit */
+ SELIDX(state, reg);
+}
+
+/*
+ * audiocs_alloc_engine()
+ *
+ * Description:
+ * Allocates the DMA handles and the memory for the DMA engine.
+ *
+ * Arguments:
+ * CS_state_t *dip Pointer to the device's soft state
+ * int num Engine number, CS4231_PLAY or CS4231_REC.
+ *
+ * Returns:
+ * DDI_SUCCESS Engine initialized.
+ * DDI_FAILURE Engine not initialized.
+ */
+int
+audiocs_alloc_engine(CS_state_t *state, int num)
+{
+ char *prop;
+ unsigned caps;
+ int dir;
+ int rc;
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ CS_engine_t *eng;
+ uint_t ccnt;
+ ddi_dma_cookie_t dmac;
+
+ static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+ };
+
+ adev = state->cs_adev;
+ dip = state->cs_dip;
+
+ eng = kmem_zalloc(sizeof (*eng), KM_SLEEP);
+ eng->ce_state = state;
+ eng->ce_started = B_FALSE;
+ eng->ce_num = num;
+
+ switch (num) {
+ case CS4231_REC:
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ eng->ce_syncdir = DDI_DMA_SYNC_FORKERNEL;
+ eng->ce_codec_en = INTC_CEN;
+ break;
+ case CS4231_PLAY:
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ eng->ce_syncdir = DDI_DMA_SYNC_FORDEV;
+ eng->ce_codec_en = INTC_PEN;
+ break;
+ default:
+ kmem_free(eng, sizeof (*eng));
+ audio_dev_warn(adev, "bad engine number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+ state->cs_engines[num] = eng;
+
+ eng->ce_intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, CS4231_INTS);
+
+ /* make sure the values are good */
+ if (eng->ce_intrs < CS4231_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, eng->ce_intrs, CS4231_INTS);
+ eng->ce_intrs = CS4231_INTS;
+ } else if (eng->ce_intrs > CS4231_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, eng->ce_intrs, CS4231_INTS);
+ eng->ce_intrs = CS4231_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 8 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a more dynamic list.)
+ */
+ eng->ce_fragfr = 48000 / eng->ce_intrs;
+ eng->ce_fragfr &= ~(64 - 1); /* align @ 64B boundaries */
+ eng->ce_fragfr = max(eng->ce_fragfr, 64);
+ eng->ce_fragsz = eng->ce_fragfr * 4; /* each frame is 4 bytes */
+ eng->ce_size = eng->ce_fragsz * CS4231_NFRAGS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, CS4231_DMA_ATTR(state), DDI_DMA_SLEEP,
+ NULL, &eng->ce_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(eng->ce_dmah, eng->ce_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &eng->ce_kaddr,
+ &eng->ce_size, &eng->ce_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(eng->ce_dmah, NULL,
+ eng->ce_kaddr, eng->ce_size, dir | DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &dmac, &ccnt);
+ if ((rc != DDI_DMA_MAPPED) || (ccnt != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+
+ /* save off phys addresses for each frag */
+ for (int i = 0; i < CS4231_NFRAGS; i++) {
+ eng->ce_paddr[i] = dmac.dmac_address;
+ dmac.dmac_address += eng->ce_fragsz;
+ }
+
+ eng->ce_engine = audio_engine_alloc(&audiocs_engine_ops, caps);
+ if (eng->ce_engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(eng->ce_engine, eng);
+ audio_dev_add_engine(adev, eng->ce_engine);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_free_engine()
+ *
+ * Description:
+ * This routine fress the engine and all associated resources.
+ *
+ * Arguments:
+ * CS_engine_t *eng Engine to free.
+ */
+void
+audiocs_free_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ audio_dev_t *adev = state->cs_adev;
+
+ if (eng == NULL)
+ return;
+ if (eng->ce_engine) {
+ audio_dev_remove_engine(adev, eng->ce_engine);
+ audio_engine_free(eng->ce_engine);
+ }
+ if (eng->ce_paddr[0]) {
+ (void) ddi_dma_unbind_handle(eng->ce_dmah);
+ }
+ if (eng->ce_acch) {
+ ddi_dma_mem_free(&eng->ce_acch);
+ }
+ if (eng->ce_dmah) {
+ ddi_dma_free_handle(&eng->ce_dmah);
+ }
+ kmem_free(eng, sizeof (*eng));
+}
+
+/*
+ * audiocs_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * CS_engine_t *eng Port of DMA engine to start.
+ *
+ * Returns:
+ * DDI_SUCCESS DMA engine started.
+ * DDI_FAILURE DMA engine not started.
+ */
+int
+audiocs_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /*
+ * If we are suspended, we can't touch hardware.
+ */
+ if (state->cs_suspended)
+ return (DDI_SUCCESS);
+
+ /*
+ * Start the DMA engine.
+ */
+ if (CS4231_DMA_START(state, eng) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ /*
+ * Start the codec.
+ */
+ SELIDX(state, INTC_REG);
+ ORIDX(state, eng->ce_codec_en, INTC_VALID_MASK);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_stop_engine()
+ *
+ * Description:
+ * This routine stop the DMA engine.
+ *
+ * Arguments:
+ * CS_engine_t *eng DMA engine to stop.
+ */
+void
+audiocs_stop_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /*
+ * If we are suspended, we can't touch hardware.
+ */
+ if (state->cs_suspended)
+ return;
+
+ /*
+ * Stop the DMA engine.
+ */
+ CS4231_DMA_STOP(state, eng);
+
+ /*
+ * Stop the codec.
+ */
+ SELIDX(state, INTC_REG);
+ ANDIDX(state, ~(eng->ce_codec_en), INTC_VALID_MASK);
+}
+
+/*
+ * audiocs_poll_ready()
+ *
+ * Description:
+ * This routine waits for the Codec to complete its initialization
+ * sequence and is done with its autocalibration.
+ *
+ * Early versions of the Codec have a bug that can take as long as
+ * 15 seconds to complete its initialization. For these cases we
+ * use a timeout mechanism so we don't keep the machine locked up.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The Codec is ready to continue
+ * DDI_FAILURE The Codec isn't ready to continue
+ */
+int
+audiocs_poll_ready(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ int x = 0;
+ uint8_t iar;
+ uint8_t idr;
+
+ ASSERT(state->cs_regs != NULL);
+ ASSERT(handle != NULL);
+
+ /* wait for the chip to initialize itself */
+ iar = ddi_get8(handle, &CS4231_IAR);
+
+ while ((iar & IAR_INIT) && x++ < CS4231_TIMEOUT) {
+ drv_usecwait(50);
+ iar = ddi_get8(handle, &CS4231_IAR);
+ }
+
+ if (x >= CS4231_TIMEOUT) {
+ return (DDI_FAILURE);
+ }
+
+ x = 0;
+
+ /*
+ * Now wait for the chip to complete its autocalibration.
+ * Set the test register.
+ */
+ SELIDX(state, ESI_REG);
+
+ idr = ddi_get8(handle, &CS4231_IDR);
+
+ while ((idr & ESI_ACI) && x++ < CS4231_TIMEOUT) {
+ drv_usecwait(50);
+ idr = ddi_get8(handle, &CS4231_IDR);
+ }
+
+ if (x >= CS4231_TIMEOUT) {
+ return (DDI_FAILURE);
+ }
+
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiocs_sel_index()
+ *
+ * Description:
+ * Select a cs4231 register. The cs4231 has a hardware bug where a
+ * register is not always selected the first time. We try and try
+ * again until the proper register is selected or we time out and
+ * print an error message.
+ *
+ * Arguments:
+ * audiohdl_t ahandle Handle to this device
+ * ddi_acc_handle_t handle A handle to the device's registers
+ * uint8_t addr The register address to program
+ * int reg The register to select
+ *
+ * Returns:
+ * void
+ */
+void
+#ifdef DEBUG
+audiocs_sel_index(CS_state_t *state, uint8_t reg, int n)
+#else
+audiocs_sel_index(CS_state_t *state, uint8_t reg)
+#endif
+{
+ int x;
+ uint8_t T;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ uint8_t *addr = &CS4231_IAR;
+
+ for (x = 0; x < CS4231_RETRIES; x++) {
+ ddi_put8(handle, addr, reg);
+ T = ddi_get8(handle, addr);
+ if (T == reg) {
+ break;
+ }
+ drv_usecwait(1000);
+ }
+
+ if (x == CS4231_RETRIES) {
+ audio_dev_warn(state->cs_adev,
+#ifdef DEBUG
+ "line %d: Couldn't select index (0x%02x 0x%02x)", n,
+#else
+ "Couldn't select index (0x%02x 0x%02x)",
+#endif
+ T, reg);
+ audio_dev_warn(state->cs_adev,
+ "audio may not work correctly until it is stopped and "
+ "restarted");
+ }
+}
+
+/*
+ * audiocs_put_index()
+ *
+ * Description:
+ * Program a cs4231 register. The cs4231 has a hardware bug where a
+ * register is not programmed properly the first time. We program a value,
+ * then immediately read back the value and reprogram if nescessary.
+ * We do this until the register is properly programmed or we time out and
+ * print an error message.
+ *
+ * Arguments:
+ * CS_state_t state Handle to this device
+ * uint8_t mask Mask to not set reserved register bits
+ * int val The value to program
+ *
+ * Returns:
+ * void
+ */
+void
+#ifdef DEBUG
+audiocs_put_index(CS_state_t *state, uint8_t val, uint8_t mask, int n)
+#else
+audiocs_put_index(CS_state_t *state, uint8_t val, uint8_t mask)
+#endif
+{
+ int x;
+ uint8_t T;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ uint8_t *addr = &CS4231_IDR;
+
+ val &= mask;
+
+ for (x = 0; x < CS4231_RETRIES; x++) {
+ ddi_put8(handle, addr, val);
+ T = ddi_get8(handle, addr);
+ if (T == val) {
+ break;
+ }
+ drv_usecwait(1000);
+ }
+
+ if (x == CS4231_RETRIES) {
+#ifdef DEBUG
+ audio_dev_warn(state->cs_adev,
+ "line %d: Couldn't set value (0x%02x 0x%02x)", n, T, val);
+#else
+ audio_dev_warn(state->cs_adev,
+ "Couldn't set value (0x%02x 0x%02x)", T, val);
+#endif
+ audio_dev_warn(state->cs_adev,
+ "audio may not work correctly until it is stopped and "
+ "restarted");
+ }
+}
diff --git a/usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h
index db378f458d..3f5cbe1135 100644
--- a/usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,32 +19,65 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#ifndef _SYS_AUDIO4231_IMPL_H
-#define _SYS_AUDIO4231_IMPL_H
+#ifndef _AUDIO_4231_H
+#define _AUDIO_4231_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
+#ifdef __cplusplus
extern "C" {
#endif
/*
- * Implementation specific header file for the audiocs device driver.
+ * Header file for the audiocs device driver.
*/
-#ifdef _KERNEL
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define CS_DEV_NAME "SUNW,CS4231"
+#define CS_DEV_CONFIG_ONBRD1 "onboard1"
+#define CS_DEV_VERSION "a" /* SS5 */
+#define CS_DEV_VERSION_A CS_DEV_VERSION
+#define CS_DEV_VERSION_B "b" /* Electron - internal loopback */
+#define CS_DEV_VERSION_C "c" /* Positron */
+#define CS_DEV_VERSION_D "d" /* PowerPC - Retired */
+#define CS_DEV_VERSION_E "e" /* x86 - Retired */
+#define CS_DEV_VERSION_F "f" /* Tazmo */
+#define CS_DEV_VERSION_G "g" /* Quark Audio Module */
+#define CS_DEV_VERSION_H "h" /* Darwin */
/*
- * Global routines.
+ * Driver supported configuration information
*/
-void cs4231_reg_select(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *,
- uint8_t, int, char *);
-void cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *, uint8_t,
- uint8_t, int, char *);
+#define CS4231_NAME "audiocs"
+#define CS4231_MOD_NAME "CS4231 audio driver"
+
+#define CS4231_INTS (175) /* default interrupt rate */
+#define CS4231_MIN_INTS (10) /* minimum interrupt rate */
+#define CS4231_MAX_INTS (2000) /* maximum interrupt rate */
+
+/*
+ * Implementation specific header file for the audiocs device driver.
+ */
+
+#ifdef _KERNEL
+
+enum {
+ CTL_VOLUME = 0,
+ CTL_IGAIN,
+ CTL_MGAIN,
+ CTL_INPUTS,
+ CTL_OUTPUTS,
+ CTL_MICBOOST,
+ CTL_NUM
+};
+
+typedef struct CS_engine CS_engine_t;
+typedef struct CS_ctrl CS_ctrl_t;
+typedef struct CS_state CS_state_t;
/*
* These are the registers for the APC DMA channel interface to the
@@ -56,7 +88,7 @@ void cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *, uint8_t,
struct cs4231_apc {
uint32_t dmacsr; /* APC CSR */
uint32_t lpad[3]; /* PAD */
- uint32_t dmacva; /* Captue Virtual Address */
+ uint32_t dmacva; /* Capture Virtual Address */
uint32_t dmacc; /* Capture Count */
uint32_t dmacnva; /* Capture Next VAddress */
uint32_t dmacnc; /* Capture next count */
@@ -67,7 +99,6 @@ struct cs4231_apc {
};
typedef struct cs4231_apc cs4231_apc_t;
-#define APC_HANDLE state->cs_handles.cs_codec_hndl
#define APC_DMACSR state->cs_regs->apc.dmacsr
#define APC_DMACVA state->cs_regs->apc.dmacva
#define APC_DMACC state->cs_regs->apc.dmacc
@@ -140,10 +171,6 @@ struct cs4231_eb2regs {
};
typedef struct cs4231_eb2regs cs4231_eb2regs_t;
-#define EB2_CODEC_HNDL state->cs_handles.cs_codec_hndl
-#define EB2_PLAY_HNDL state->cs_handles.cs_eb2_play_hndl
-#define EB2_REC_HNDL state->cs_handles.cs_eb2_rec_hndl
-#define EB2_AUXIO_HNDL state->cs_handles.cs_eb2_auxio_hndl
#define EB2_PLAY_CSR state->cs_eb2_regs.play->eb2csr
#define EB2_PLAY_ACR state->cs_eb2_regs.play->eb2acr
#define EB2_PLAY_BCR state->cs_eb2_regs.play->eb2bcr
@@ -189,16 +216,13 @@ typedef struct cs4231_eb2regs cs4231_eb2regs_t;
#define EB2_DEV_ID 0xf0000000u /* Device ID -0x0C, R/O */
#define EB2_ID_VALUE 0xC0000000u /* ID read from CSR */
-#define EB2_PCLEAR_RESET_VALUE (EB2_READ|EB2_EN_NEXT)
-#define EB2_RCLEAR_RESET_VALUE (EB2_WRITE|EB2_EN_NEXT)
+#define EB2_PCLEAR_RESET_VALUE (EB2_READ|EB2_EN_NEXT|EB2_EN_CNT)
+#define EB2_RCLEAR_RESET_VALUE (EB2_WRITE|EB2_EN_NEXT|EB2_EN_CNT)
-#define EB2_PINTR_MASK (EB2_INT_EN)
-#define EB2_RINTR_MASK (EB2_INT_EN)
-
-#define EB2_PLAY_ENABLE (EB2_PINTR_MASK|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
+#define EB2_PLAY_ENABLE (EB2_INT_EN|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
EB2_PCLEAR_RESET_VALUE)
-#define EB2_REC_ENABLE (EB2_RINTR_MASK|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
+#define EB2_REC_ENABLE (EB2_INT_EN|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
EB2_RCLEAR_RESET_VALUE)
#define EB2_FIFO_DRAIN (EB2_DRAIN|EB2_CYC_PENDING)
@@ -206,22 +230,16 @@ typedef struct cs4231_eb2regs cs4231_eb2regs_t;
/*
* Misc. defines
*/
-#define CS4231_IDNUM (0x6175)
-#define CS4231_MINPACKET (0)
-#define CS4231_MAXPACKET (1*1024)
-#define CS4231_HIWATER (AM_MAX_QUEUED_MSGS_SIZE)
-#define CS4231_LOWATER (AM_MIN_QUEUED_MSGS_SIZE)
-#define CS4231_MAX_CHANNELS (200) /* force max # chs */
#define CS4231_REGS (32)
#define CS4231_NCOMPONENTS (1)
#define CS4231_COMPONENT (0)
#define CS4231_PWR_OFF (0)
#define CS4231_PWR_ON (1)
#define CS4231_TIMEOUT (100000)
-#define CS4231_NOT_SUSPENDED (0)
-#define CS4231_SUSPENDED (~CS4231_NOT_SUSPENDED)
-#define CS4231_BSIZE (8*1024)
#define CS4231_300MS (300*1000)
+#define CS4231_PLAY 0
+#define CS4231_REC 1
+#define CS4231_NFRAGS 8
/*
* Supported dma engines and the ops vector
@@ -244,6 +262,7 @@ struct cs4231_pioregs {
};
typedef struct cs4231_pioregs cs4231_pioregs_t;
+
struct cs4231_eb2 {
cs4231_eb2regs_t *play; /* play EB2 registers */
cs4231_eb2regs_t *record; /* record EB2 registers */
@@ -265,9 +284,6 @@ typedef struct cs4231_regs cs4231_regs_t;
/*
* Misc. state enumerations and structures
*/
-enum cs_cd {NO_INTERNAL_CD, INTERNAL_CD_ON_AUX1, INTERNAL_CD_ON_AUX2};
-typedef enum cs_cd cs_cd_e;
-
struct cs4231_handle {
ddi_acc_handle_t cs_codec_hndl; /* CODEC handle, APC & EB2 */
ddi_acc_handle_t cs_eb2_play_hndl; /* EB2 only, play handle */
@@ -275,6 +291,48 @@ struct cs4231_handle {
ddi_acc_handle_t cs_eb2_auxio_hndl; /* EB2 only, auxio handle */
};
typedef struct cs4231_handle cs4231_handle_t;
+#define CODEC_HANDLE state->cs_handles.cs_codec_hndl
+#define APC_HANDLE state->cs_handles.cs_codec_hndl
+#define EB2_PLAY_HNDL state->cs_handles.cs_eb2_play_hndl
+#define EB2_REC_HNDL state->cs_handles.cs_eb2_rec_hndl
+#define EB2_AUXIO_HNDL state->cs_handles.cs_eb2_auxio_hndl
+
+/*
+ * CS_port_t - per port (playback or record) state
+ */
+struct CS_engine {
+ CS_state_t *ce_state;
+ audio_engine_t *ce_engine;
+ int ce_num;
+ unsigned ce_syncdir;
+ unsigned ce_intrs;
+ unsigned ce_fragfr;
+ unsigned ce_fragsz;
+ unsigned ce_nframes;
+ unsigned ce_cfrag;
+ boolean_t ce_started;
+ uint64_t ce_count;
+
+ size_t ce_size;
+ caddr_t ce_kaddr;
+ ddi_dma_handle_t ce_dmah;
+ ddi_acc_handle_t ce_acch;
+ uint32_t ce_paddr[CS4231_NFRAGS];
+
+ /* registers (EB2 only) */
+ ddi_acc_handle_t ce_regsh;
+ cs4231_eb2regs_t *ce_eb2regs; /* EB2 registers */
+
+ /* codec enable */
+ uint8_t ce_codec_en;
+};
+
+struct CS_ctrl {
+ CS_state_t *cc_state;
+ audio_ctrl_t *cc_ctrl;
+ uint32_t cc_num;
+ uint64_t cc_val;
+};
/*
* CS_state_t - per instance state and operation data
@@ -283,84 +341,39 @@ struct CS_state {
kmutex_t cs_lock; /* state protection lock */
kcondvar_t cs_cv; /* suspend/resume cond. var. */
ddi_iblock_cookie_t cs_iblock; /* iblock cookie */
- uint_t cs_flags; /* flags */
kstat_t *cs_ksp; /* kernel statistics */
dev_info_t *cs_dip; /* used by cs4231_getinfo() */
- audiohdl_t cs_ahandle; /* audio handle */
- audio_info_t cs_defaults; /* default state for the dev */
- am_ad_info_t cs_ad_info; /* audio device info state */
+ audio_dev_t *cs_adev; /* audio device state */
+
cs_dmae_types_e cs_dma_engine; /* dma engine for this h/w */
struct cs4231_dma_ops *cs_dma_ops; /* dma engine ops vector */
cs4231_regs_t *cs_regs; /* hardware registers */
cs4231_eb2_t cs_eb2_regs; /* eb2 DMA registers */
cs4231_handle_t cs_handles; /* hardware handles */
- audio_device_t cs_dev_info; /* device info strings */
- int cs_instance; /* device instance */
- int cs_suspended; /* power management state */
- int cs_powered; /* device powered up? */
- int cs_busy_cnt; /* device busy count */
- ddi_dma_attr_t *cs_dma_attr; /* dma attributes */
- ddi_dma_handle_t cs_ph[2]; /* play DMA handles */
- ddi_dma_handle_t cs_ch[2]; /* capture DMA handles */
- ddi_dma_cookie_t cs_pc[2]; /* play DMA cookies */
- ddi_dma_cookie_t cs_cc[2]; /* capture DMA cookies */
- ddi_acc_handle_t cs_pmh[2]; /* play DMA memory handles */
- ddi_acc_handle_t cs_cmh[2]; /* capture DMA memory handles */
- size_t cs_pml[2]; /* play DMA memory length */
- size_t cs_cml[2]; /* capture DMA memory length */
- caddr_t cs_pb[2]; /* play DMA buffers */
- caddr_t cs_cb[2]; /* capture DMA buffers */
- int cs_pcnt[2]; /* play count, in samples */
- int cs_ccnt[2]; /* capture count, in bytes */
- int cs_pbuf_toggle; /* play DMA buffer toggle */
- int cs_cbuf_toggle; /* capture DMA buffer toggle */
- uint_t cs_play_sr; /* play sample rate */
- uint_t cs_play_ch; /* play channels */
- uint_t cs_play_prec; /* play precision */
- uint_t cs_play_enc; /* play encoding */
- uint_t cs_record_sr; /* record sample rate */
- uint_t cs_record_ch; /* record channels */
- uint_t cs_record_prec; /* record precision */
- uint_t cs_record_enc; /* record encoding */
- uint_t cs_output_muted; /* output muted */
- cs_cd_e cs_cd_input_line; /* AUX1, AUX2 or none */
+
+ boolean_t cs_suspended; /* power management state */
+ boolean_t cs_powered; /* device powered up? */
+
+ CS_engine_t *cs_engines[2];
+
boolean_t cs_revA; /* B_TRUE if Rev A CODEC */
- boolean_t cs_autocal; /* auto calibrate if B_TRUE */
uint8_t cs_save[CS4231_REGS]; /* PM reg. storage */
- uint8_t cs_save_ce; /* save capture encoding */
- uint8_t cs_save_pe; /* save play encoding */
+
+ /*
+ * Control related fields.
+ */
+ uint64_t cs_imask;
+ uint64_t cs_omask;
+ uint64_t cs_omod; /* modifiable ports */
+
+ CS_ctrl_t *cs_ogain;
+ CS_ctrl_t *cs_igain;
+ CS_ctrl_t *cs_micboost;
+ CS_ctrl_t *cs_mgain;
+ CS_ctrl_t *cs_outputs;
+ CS_ctrl_t *cs_inputs;
};
-typedef struct CS_state CS_state_t;
-_NOTE(MUTEX_PROTECTS_DATA(CS_state::cs_lock, CS_state))
-_NOTE(READ_ONLY_DATA(CS_state::cs_dip))
-_NOTE(READ_ONLY_DATA(CS_state::cs_ahandle))
-_NOTE(READ_ONLY_DATA(CS_state::cs_instance))
-_NOTE(READ_ONLY_DATA(CS_state::cs_handles))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_cb))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pb))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_cbuf_toggle))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pbuf_toggle))
-
-/* CS_state.flags defines */
-#define PDMA_ENGINE_INITIALIZED 0x0001u /* play DMA engine initialized */
-#define REC_INTR_PENDING 0x0002u /* record interrupt pending */
-#define APC_P_STOPPED 0x0004u /* APC playing has been shutdown */
-#define RDMA_ENGINE_INITIALIZED 0x0008u /* record DMA engine initialized */
-#define PLAY_ACTIVE 0x0010u /* play active, for PM */
-
-#define PLAY_DMA_HANDLE state->cs_ph[state->cs_pbuf_toggle]
-#define PLAY_DMA_COOKIE state->cs_pc[state->cs_pbuf_toggle]
-#define PLAY_DMA_BUF state->cs_pb[state->cs_pbuf_toggle]
-#define PLAY_DMA_MEM_HANDLE state->cs_pmh[state->cs_pbuf_toggle]
-#define PLAY_DMA_MEM_LENGTH state->cs_pml[state->cs_pbuf_toggle]
-#define PLAY_COUNT state->cs_pcnt[state->cs_pbuf_toggle]
-#define CAP_DMA_HANDLE state->cs_ch[state->cs_cbuf_toggle]
-#define CAP_DMA_COOKIE state->cs_cc[state->cs_cbuf_toggle]
-#define CAP_DMA_BUF state->cs_cb[state->cs_cbuf_toggle]
-#define CAP_DMA_MEM_HANDLE state->cs_cmh[state->cs_cbuf_toggle]
-#define CAP_DMA_MEM_LENGTH state->cs_cml[state->cs_cbuf_toggle]
-#define CAP_COUNT state->cs_ccnt[state->cs_cbuf_toggle]
#define KIOP(X) ((kstat_intr_t *)(X->cs_ksp->ks_data))
/*
@@ -368,17 +381,14 @@ _NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pbuf_toggle))
*/
struct cs4231_dma_ops {
char *dma_device;
- int (*cs_dma_map_regs)(dev_info_t *, CS_state_t *, size_t, size_t);
+ ddi_dma_attr_t *cs_dma_attr;
+ int (*cs_dma_map_regs)(CS_state_t *);
void (*cs_dma_unmap_regs)(CS_state_t *);
void (*cs_dma_reset)(CS_state_t *);
int (*cs_dma_add_intr)(CS_state_t *);
- void (*cs_dma_rem_intr)(dev_info_t *);
- int (*cs_dma_p_start)(CS_state_t *);
- void (*cs_dma_p_pause)(CS_state_t *);
- void (*cs_dma_p_restart)(CS_state_t *);
- void (*cs_dma_p_stop)(CS_state_t *);
- int (*cs_dma_r_start)(CS_state_t *);
- void (*cs_dma_r_stop)(CS_state_t *);
+ void (*cs_dma_rem_intr)(CS_state_t *);
+ int (*cs_dma_start)(CS_engine_t *);
+ void (*cs_dma_stop)(CS_engine_t *);
void (*cs_dma_power)(CS_state_t *, int);
};
typedef struct cs4231_dma_ops cs4231_dma_ops_t;
@@ -386,42 +396,28 @@ typedef struct cs4231_dma_ops cs4231_dma_ops_t;
extern cs4231_dma_ops_t cs4231_apcdma_ops;
extern cs4231_dma_ops_t cs4231_eb2dma_ops;
-#define CS4231_DMA_MAP_REGS(DIP, S, P, C) \
- ((S)->cs_dma_ops->cs_dma_map_regs)(DIP, S, P, C)
+#define CS4231_DMA_MAP_REGS(S) ((S)->cs_dma_ops->cs_dma_map_regs)(S)
#define CS4231_DMA_UNMAP_REGS(S) ((S)->cs_dma_ops->cs_dma_unmap_regs)(S)
#define CS4231_DMA_RESET(S) ((S)->cs_dma_ops->cs_dma_reset)(S)
#define CS4231_DMA_ADD_INTR(S) ((S)->cs_dma_ops->cs_dma_add_intr)(S)
-#define CS4231_DMA_REM_INTR(DIP, S) ((S)->cs_dma_ops->cs_dma_rem_intr)(DIP)
-#define CS4231_DMA_START_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_start)(S)
-#define CS4231_DMA_PAUSE_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_pause)(S)
-#define CS4231_DMA_RESTART_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_restart)(S)
-#define CS4231_DMA_STOP_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_stop)(S)
-#define CS4231_DMA_START_RECORD(S) ((S)->cs_dma_ops->cs_dma_r_start)(S)
-#define CS4231_DMA_STOP_RECORD(S) ((S)->cs_dma_ops->cs_dma_r_stop)(S)
+#define CS4231_DMA_REM_INTR(S) ((S)->cs_dma_ops->cs_dma_rem_intr)(S)
+#define CS4231_DMA_START(S, E) ((S)->cs_dma_ops->cs_dma_start)(E)
+#define CS4231_DMA_STOP(S, E) ((S)->cs_dma_ops->cs_dma_stop)(E)
#define CS4231_DMA_POWER(S, L) ((S)->cs_dma_ops->cs_dma_power)(S, L)
+#define CS4231_DMA_ATTR(S) ((S)->cs_dma_ops->cs_dma_attr)
/*
* Useful bit twiddlers
*/
#define CS4231_RETRIES 10
-#define OR_SET_BYTE(handle, addr, val, mask) \
- cs4231_put8((state->cs_ahandle), (handle), (uint8_t *)(addr), \
- (ddi_get8((handle), (uint8_t *)(addr)) | (uint8_t)(val)), \
- (uint8_t)(mask), (__LINE__), (thisfile));
-
#define OR_SET_WORD(handle, addr, val) \
ddi_put32((handle), (uint_t *)(addr), \
- (ddi_get32((handle), (uint_t *)(addr)) | (uint_t)(val)));
-
-#define AND_SET_BYTE(handle, addr, val, mask) \
- cs4231_put8((state->cs_ahandle), (handle), (uint8_t *)(addr), \
- (ddi_get8((handle), (uint8_t *)(addr)) & (uint8_t)(val)), \
- (uint8_t)(mask), (__LINE__), (thisfile));
+ (ddi_get32((handle), (uint_t *)(addr)) | (uint_t)(val)))
#define AND_SET_WORD(handle, addr, val) \
ddi_put32((handle), (uint_t *)(addr), \
- (ddi_get32((handle), (uint_t *)(addr)) & (uint_t)(val)));
+ (ddi_get32((handle), (uint_t *)(addr)) & (uint_t)(val)))
/*
* CS4231 Register Set Definitions
@@ -532,6 +528,11 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#define PDF_ADPCM4 0xa0 /* ADPCM, 4-bit, IMA compatible */
#define PDF_LINEAR16BE 0xc0 /* Linear, 16-bit signed, big endian */
#define FSDF_VALID_MASK 0xff /* Valid bits mask */
+#ifdef _BIG_ENDIAN
+#define PDF_LINEAR16NE PDF_LINEAR16BE
+#else
+#define PDF_LINEAR16NE PDF_LINEAR16LE
+#endif
/* Index 09 - Interface Configuration, Mode 1&2 */
#define INTC_REG 0x09 /* Interrupt Configuration Register */
@@ -624,7 +625,7 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
/* Index 22 and 23 are reserved */
/* Index 24 - Alternate Feature Status, Mode 2 only */
-#define AFS_REG 0x18 /* Alternate Feature Status Registure */
+#define AFS_REG 0x18 /* Alternate Feature Status Register */
#define AFS_PU 0x01 /* Playback Underrun */
#define AFS_PO 0x02 /* Playback Overrun */
#define AFS_CO 0x04 /* Capture Overrun */
@@ -664,6 +665,11 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#define CDF_ADPCM4 0xa0 /* ADPCM, 4-bit, IMA compatible */
#define CDF_LINEAR16BE 0xc0 /* Linear, 16-bit signed, big endian */
#define CDF_VALID_MASK 0xf0 /* Valid bits mask */
+#ifdef _BIG_ENDIAN
+#define CDF_LINEAR16NE CDF_LINEAR16BE
+#else
+#define CDF_LINEAR16NE CDF_LINEAR16LE
+#endif
/* Index 29 is reserved */
@@ -677,8 +683,8 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#endif /* _KERNEL */
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif
-#endif /* _SYS_AUDIO4231_IMPL_H */
+#endif /* _AUDIO_4231_H */
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c
new file mode 100644
index 0000000000..64b1cbe12a
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c
@@ -0,0 +1,567 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Platform specifc code for the APC DMA controller. The APC is an SBus
+ * IC that includes play and record DMA engines and an interface for
+ * the CS4231.
+ */
+
+#include <sys/systm.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Attribute structure for the APC, used to create DMA handles.
+ */
+static ddi_dma_attr_t apc_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000000fffLL, /* DMA counter register */
+ 0x0000000000000001LL, /* DMA address alignment */
+ 0x00000014, /* 4 and 16 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x0000000000000fffLL, /* maximum transfer size, 8k */
+ 0x000000000000ffffLL, /* segment boundary, 32k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_BE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * Local routines
+ */
+static uint_t apc_intr(caddr_t);
+static void apc_load_fragment(CS_engine_t *);
+
+/*
+ * DMA ops vector functions
+ */
+static int apc_map_regs(CS_state_t *);
+static void apc_unmap_regs(CS_state_t *);
+static void apc_reset(CS_state_t *);
+static int apc_add_intr(CS_state_t *);
+static void apc_rem_intr(CS_state_t *);
+static int apc_start_engine(CS_engine_t *);
+static void apc_stop_engine(CS_engine_t *);
+static void apc_power(CS_state_t *, int);
+
+cs4231_dma_ops_t cs4231_apcdma_ops = {
+ "APC DMA controller",
+ &apc_dma_attr,
+ apc_map_regs,
+ apc_unmap_regs,
+ apc_reset,
+ apc_add_intr,
+ apc_rem_intr,
+ apc_start_engine,
+ apc_stop_engine,
+ apc_power,
+};
+
+/*
+ * apc_map_regs()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie. Finally, the registers
+ * are mapped in.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls will almost always succeed.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * AUDIO_SUCCESS Registers successfully mapped
+ * AUDIO_FAILURE Registers not successfully mapped
+ */
+static int
+apc_map_regs(CS_state_t *state)
+{
+ ddi_acc_handle_t *handle = &APC_HANDLE;
+ dev_info_t *dip = state->cs_dip;
+
+ /* map in the registers, getting a handle */
+ if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
+ sizeof (cs4231_regs_t), &acc_attr, handle) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "ddi_regs_map_setup() failed");
+ return (DDI_FAILURE);
+ }
+
+ /* clear the CSR so we have all interrupts disabled */
+ ddi_put32(*handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
+
+ return (DDI_SUCCESS);
+} /* apc_map_regs() */
+
+/*
+ * apc_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps the Codec's and DMA engine's registers.
+ * It must be idempotent.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_unmap_regs(CS_state_t *state)
+{
+ if (APC_HANDLE)
+ ddi_regs_map_free(&APC_HANDLE);
+
+} /* apc_unmap_regs() */
+
+/*
+ * apc_reset()
+ *
+ * Description:
+ * Reset both the play and record DMA engines. The engines are left
+ * with interrupts and the DMA engine disabled.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo structure
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_reset(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = APC_HANDLE;
+
+ /*
+ * The APC has a bug where the reset is not done
+ * until you do the next pio to the APC. This
+ * next write to the CSR causes the posted reset to
+ * happen.
+ */
+
+ ddi_put32(handle, &APC_DMACSR, APC_RESET);
+ ddi_put32(handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
+
+} /* apc_reset() */
+
+/*
+ * apc_add_intr()
+ *
+ * Description:
+ * Register the APC interrupts with the kernel.
+ *
+ * NOTE: This does NOT turn on interrupts.
+ *
+ * CAUTION: While the interrupts are added, the Codec interrupts are
+ * not enabled.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+apc_add_intr(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* first we make sure this isn't a high level interrupt */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ audio_dev_warn(state->cs_adev,
+ "unsupported high level interrupt");
+ return (DDI_FAILURE);
+ }
+
+ /* okay to register the interrupt */
+ if (ddi_add_intr(dip, 0, NULL, NULL, apc_intr, (caddr_t)state) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "bad interrupt specification");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+
+} /* apc_add_intr() */
+
+/*
+ * apc_rem_intr()
+ *
+ * Description:
+ * Unregister the APC interrupts from the kernel.
+ *
+ * CAUTION: While the interrupts are removed, the Codec interrupts are
+ * not disabled, but then, they never should have been on in
+ * the first place.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_rem_intr(CS_state_t *state)
+{
+ ddi_remove_intr(state->cs_dip, 0, NULL);
+} /* apc_rem_intr() */
+
+/*
+ * apc_start_engine()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * For hard starts the DMA engine is started by programming the
+ * Next Virtual Address and then the Next Counter twice, and
+ * finally enabling the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * CAUTION: ?!? This routine doesn't start the Codec because the first
+ * interrupt causes a recursive mutex_enter.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to start
+ *
+ * Returns:
+ * DDI_SUCCESS The DMA engine was started
+ * DDI_FAILURE The DMA engine was not started
+ */
+static int
+apc_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t csr;
+ uint32_t enable;
+ uint32_t dirty;
+ int x;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (eng->ce_num == CS4231_PLAY) {
+ enable = APC_PLAY_ENABLE;
+ dirty = APC_PD;
+ } else {
+ enable = APC_CAP_ENABLE;
+ dirty = APC_CD;
+ }
+
+ /* make sure it's okay to program the Next Address/Count registers */
+ csr = ddi_get32(handle, &APC_DMACSR);
+ for (x = 0; !(csr & dirty) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* no reason to beat on the bus */
+ csr = ddi_get32(handle, &APC_DMACSR);
+ }
+ if (x >= CS4231_TIMEOUT) {
+ audio_dev_warn(state->cs_adev,
+ "timeout waiting for engine, not started!");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Program the first fragment.
+ */
+ apc_load_fragment(eng);
+
+ /*
+ * Start the DMA engine, including interrupts.
+ */
+ OR_SET_WORD(handle, &APC_DMACSR, enable);
+
+ /*
+ * Program the second fragment.
+ */
+ apc_load_fragment(eng);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * apc_stop_engine()
+ *
+ * Description:
+ * This routine stops the engine.
+ *
+ * The DMA engine is stopped by using the CAP_ABORT bit.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to sotp
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_stop_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t reg;
+ uint32_t intren;
+ uint32_t abort;
+ uint32_t drainbit;
+ uint32_t disable;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (eng->ce_num == CS4231_PLAY) {
+ intren = APC_PINTR_ENABLE;
+ abort = APC_P_ABORT;
+ drainbit = APC_PM;
+ disable = APC_PLAY_DISABLE;
+ } else {
+ intren = APC_CINTR_ENABLE;
+ abort = APC_C_ABORT;
+ drainbit = APC_CX;
+ disable = APC_CAP_DISABLE;
+ }
+
+ /* clear the interrupts so the ISR doesn't get involved */
+ AND_SET_WORD(handle, &APC_DMACSR, ~intren);
+
+ /* first, abort the DMA engine */
+ OR_SET_WORD(handle, &APC_DMACSR, abort);
+
+ /* wait for the pipeline to empty */
+ reg = ddi_get32(handle, &APC_DMACSR);
+ for (int x = 0; (!(reg & drainbit)) && (x < CS4231_TIMEOUT); x++) {
+ drv_usecwait(1); /* don't beat on bus */
+ reg = ddi_get32(handle, &APC_DMACSR);
+ }
+
+ /* now clear the enable and abort bits */
+ AND_SET_WORD(handle, &APC_DMACSR, ~(abort|disable));
+}
+
+
+/*
+ * apc_power()
+ *
+ * Description:
+ * This routine turns the Codec off by using the COD_PDWN bit in the
+ * apc chip. To turn power on we have to reset the APC, which clears
+ * the COD_PDWN bit. However, this is a settling bug in the APC which
+ * requires the driver to delay quite a while before we may continue.
+ * Since this is the first time this feature has actually been used
+ * it isn't too surprising that it has some problems.
+ *
+ * NOTE: The state structure must be locked when this routine is called.
+ *
+ * Arguments:
+ * CS_state_t *state Ptr to the device's state structure
+ * int level Power level to set
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_power(CS_state_t *state, int level)
+{
+ ddi_acc_handle_t handle = APC_HANDLE;
+
+ if (level == CS4231_PWR_ON) { /* turn power on */
+ AND_SET_WORD(handle, &APC_DMACSR, ~APC_COD_PDWN);
+ OR_SET_WORD(handle, &APC_DMACSR, APC_RESET);
+ AND_SET_WORD(handle, &APC_DMACSR, ~APC_RESET);
+
+ /*
+ * wait for state change,
+ */
+ delay(drv_usectohz(CS4231_300MS));
+ } else { /* turn power off */
+ ASSERT(level == CS4231_PWR_OFF);
+ OR_SET_WORD(handle, &APC_DMACSR, APC_COD_PDWN);
+ }
+
+} /* apc_power() */
+
+
+/* ******* Local Routines ************************************************** */
+
+/*
+ * apc_intr()
+ *
+ * Description:
+ * APC interrupt service routine, which services both play and capture
+ * interrupts. First we find out why there was an interrupt, then we
+ * take the appropriate action.
+ *
+ * Because this ISR deals with both play and record interrupts we have
+ * to be careful to not lose an interrupt. So we service the record
+ * interrupt first and save the incoming data until later. This is all
+ * done without releasing the lock, thus there can be no race conditions.
+ * Then we process the play interrupt. While processing the play interrupt
+ * we have to release the lock. When this happens we send recorded data
+ * to the mixer and then get the next chunk of data to play. If there
+ * wasn't a play interrupt then we finish by sending the recorded data,
+ * if any.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+apc_intr(caddr_t T)
+{
+ CS_state_t *state = (void *)T;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint_t csr;
+ int rc = DDI_INTR_UNCLAIMED;
+
+ /* the state must be protected */
+ mutex_enter(&state->cs_lock);
+
+ if (state->cs_suspended) {
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* get the APC CSR */
+ csr = ddi_get32(handle, &APC_DMACSR);
+
+ /* make sure this device sent the interrupt */
+ if (!(csr & APC_IP)) {
+ if (csr & APC_PMI_EN) {
+ /*
+ * Clear device generated interrupt while play is
+ * active (Only seen while playing and insane mode
+ * switching)
+ */
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_CLAIMED);
+ } else {
+ /* nope, this isn't our interrupt */
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+ }
+
+ /* clear all interrupts we captured this time */
+ ddi_put32(handle, &APC_DMACSR, csr);
+
+ if (csr & APC_CINTR_MASK) {
+ /* try to load the next record buffer */
+ apc_load_fragment(state->cs_engines[CS4231_REC]);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+ if (csr & APC_PINTR_MASK) {
+ /* try to load the next play buffer */
+ apc_load_fragment(state->cs_engines[CS4231_PLAY]);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+done:
+
+ /* APC error interrupt, not sure what to do here */
+ if (csr & APC_EI) {
+ audio_dev_warn(state->cs_adev, "error interrupt: 0x%x", csr);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+ /* update the kernel interrupt statistics */
+ if (state->cs_ksp) {
+ if (rc == DDI_INTR_CLAIMED) {
+ KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ if (csr & APC_CINTR_MASK) {
+ CS_engine_t *eng = state->cs_engines[CS4231_REC];
+ if (eng->ce_started)
+ audio_engine_produce(eng->ce_engine);
+ }
+ if (csr & APC_PINTR_MASK) {
+ CS_engine_t *eng = state->cs_engines[CS4231_PLAY];
+ if (eng->ce_started)
+ audio_engine_consume(eng->ce_engine);
+ }
+
+ return (rc);
+
+} /* apc_intr() */
+
+static void
+apc_load_fragment(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t dirty;
+ uint32_t *nva; /* next VA reg */
+ uint32_t *nc; /* next count reg */
+
+ if (eng->ce_num == CS4231_PLAY) {
+ dirty = APC_PD;
+ nva = &APC_DMAPNVA;
+ nc = &APC_DMAPNC;
+ } else {
+ dirty = APC_CD;
+ nva = &APC_DMACNVA;
+ nc = &APC_DMACNC;
+ }
+
+ /* if we can't load another address, then don't */
+ if ((ddi_get32(handle, &APC_DMACSR) & dirty) == 0) {
+ return;
+ }
+
+ /* read the NVA, as per APC document */
+ (void) ddi_get32(handle, nva);
+
+ /* write the address of the next fragment */
+ ddi_put32(handle, nva, eng->ce_paddr[eng->ce_cfrag]);
+
+ /* now program the NC reg., which enables the state machine */
+ ddi_put32(handle, nc, eng->ce_fragsz);
+
+ eng->ce_cfrag++;
+ eng->ce_cfrag %= CS4231_NFRAGS;
+ eng->ce_count += eng->ce_fragfr;
+}
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c
new file mode 100644
index 0000000000..4c81bdd51b
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c
@@ -0,0 +1,573 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Platform specifc code for the EB2 DMA controller. The EB2 is a PCI bus
+ * IC that includes play and record DMA engines and an interface for
+ * the CS4231.
+ */
+
+#include <sys/systm.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Attribute structure for the APC, used to create DMA handles.
+ */
+static ddi_dma_attr_t eb2_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000ffffffLL, /* DMA counter register */
+ 0x0000000000000001LL, /* DMA address alignment */
+ 0x00000074, /* 4 and 16 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x000000000000ffffLL, /* maximum transfer size, 8k */
+ 0x000000000000ffffLL, /* segment boundary, 32k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t codec_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_BE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t eb2_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * Local routines
+ */
+static uint_t eb2_intr(caddr_t);
+static void eb2_load_fragment(CS_engine_t *);
+
+/*
+ * DMA ops vector functions
+ */
+static int eb2_map_regs(CS_state_t *);
+static void eb2_unmap_regs(CS_state_t *);
+static void eb2_reset(CS_state_t *);
+static int eb2_add_intr(CS_state_t *);
+static void eb2_rem_intr(CS_state_t *);
+static int eb2_start_engine(CS_engine_t *);
+static void eb2_stop_engine(CS_engine_t *);
+static void eb2_power(CS_state_t *, int);
+
+cs4231_dma_ops_t cs4231_eb2dma_ops = {
+ "EB2 DMA controller",
+ &eb2_dma_attr,
+ eb2_map_regs,
+ eb2_unmap_regs,
+ eb2_reset,
+ eb2_add_intr,
+ eb2_rem_intr,
+ eb2_start_engine,
+ eb2_stop_engine,
+ eb2_power,
+};
+
+/*
+ * eb2_map_regs()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie. Finally, the registers
+ * are mapped in.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls will almost always succeed.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+eb2_map_regs(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* now, map the codec */
+ if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
+ sizeof (cs4231_pioregs_t), &codec_attr, &CODEC_HANDLE) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping codec regs");
+ goto error;
+ }
+
+ /* next the play registers */
+ if (ddi_regs_map_setup(dip, 1, (caddr_t *)&state->cs_eb2_regs.play, 0,
+ sizeof (cs4231_eb2regs_t), &eb2_attr, &EB2_PLAY_HNDL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping play regs");
+ goto error;
+ }
+ state->cs_engines[CS4231_PLAY]->ce_regsh = EB2_PLAY_HNDL;
+ state->cs_engines[CS4231_PLAY]->ce_eb2regs = state->cs_eb2_regs.play;
+
+ /* now the capture registers */
+ if (ddi_regs_map_setup(dip, 2, (caddr_t *)&state->cs_eb2_regs.record, 0,
+ sizeof (cs4231_eb2regs_t), &eb2_attr, &EB2_REC_HNDL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping rec regs");
+ goto error;
+ }
+ state->cs_engines[CS4231_REC]->ce_regsh = EB2_REC_HNDL;
+ state->cs_engines[CS4231_REC]->ce_eb2regs = state->cs_eb2_regs.record;
+
+ /* finally the auxio register */
+ if (ddi_regs_map_setup(dip, 3, (caddr_t *)&state->cs_eb2_regs.auxio, 0,
+ sizeof (uint_t), &eb2_attr, &EB2_AUXIO_HNDL) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping auxio reg");
+ goto error;
+ }
+
+ /* disable play and record interrupts */
+ ddi_put32(EB2_PLAY_HNDL, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
+ ddi_put32(EB2_REC_HNDL, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
+
+ return (DDI_SUCCESS);
+
+error:
+ eb2_unmap_regs(state);
+ return (DDI_FAILURE);
+
+} /* eb2_map_regs() */
+
+/*
+ * eb2_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps the Codec's and DMA engine's registers.
+ * It must be idempotent.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_unmap_regs(CS_state_t *state)
+{
+ if (CODEC_HANDLE)
+ ddi_regs_map_free(&CODEC_HANDLE);
+ if (EB2_PLAY_HNDL)
+ ddi_regs_map_free(&EB2_PLAY_HNDL);
+ if (EB2_REC_HNDL)
+ ddi_regs_map_free(&EB2_REC_HNDL);
+ if (EB2_AUXIO_HNDL)
+ ddi_regs_map_free(&EB2_AUXIO_HNDL);
+
+} /* eb2_unmap_regs() */
+
+/*
+ * eb2_reset()
+ *
+ * Description:
+ * Reset both the play and record DMA engines. The engines are left
+ * with interrupts and the DMA engine disabled.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo structure
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_reset(CS_state_t *state)
+{
+ ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
+ ddi_acc_handle_t rhandle = EB2_REC_HNDL;
+ uint_t reg;
+ int x;
+
+ /* start with the play side */
+ ddi_put32(phandle, &EB2_PLAY_CSR, EB2_RESET);
+ /* wait for play data to drain */
+ reg = ddi_get32(phandle, &EB2_PLAY_CSR);
+ for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ reg = ddi_get32(phandle, &EB2_PLAY_CSR);
+ }
+ /* clear the reset bit and program for chaining */
+ ddi_put32(phandle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
+
+ /* now do the record side and program for chaining */
+ ddi_put32(rhandle, &EB2_REC_CSR, EB2_RESET);
+ /* wait for record data to drain */
+ reg = ddi_get32(rhandle, &EB2_REC_CSR);
+ for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ reg = ddi_get32(rhandle, &EB2_REC_CSR);
+ }
+ /* clear the reset bit */
+ ddi_put32(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
+
+} /* eb2_reset() */
+
+/*
+ * eb2_add_intr()
+ *
+ * Description:
+ * Register the EB2 interrupts with the kernel.
+ *
+ * NOTE: This does NOT turn on interrupts.
+ *
+ * CAUTION: While the interrupts are added, the Codec interrupts are
+ * not enabled.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Interrupts added
+ * DDI_FAILURE Interrupts not added
+ */
+static int
+eb2_add_intr(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* first we make sure these aren't high level interrupts */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ audio_dev_warn(state->cs_adev, "unsupported hi level intr 0");
+ return (DDI_FAILURE);
+ }
+ if (ddi_intr_hilevel(dip, 1) != 0) {
+ audio_dev_warn(state->cs_adev, "unsupported hi level intr 1");
+ return (DDI_FAILURE);
+ }
+
+ /* okay to register the interrupts */
+ if (ddi_add_intr(dip, 0, NULL, NULL, eb2_intr,
+ (caddr_t)state->cs_engines[CS4231_REC]) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "bad record interrupt spec");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_add_intr(dip, 1, NULL, NULL, eb2_intr,
+ (caddr_t)state->cs_engines[CS4231_PLAY]) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "play interrupt spec");
+ ddi_remove_intr(dip, 0, NULL);
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+
+} /* eb2_add_intr() */
+
+/*
+ * eb2_rem_intr()
+ *
+ * Description:
+ * Unregister the EB2 interrupts from the kernel.
+ *
+ * CAUTION: While the interrupts are removed, the Codec interrupts are
+ * not disabled, but then, they never should have been on in
+ * the first place.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's soft state
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_rem_intr(CS_state_t *state)
+{
+ ddi_remove_intr(state->cs_dip, 0, NULL);
+ ddi_remove_intr(state->cs_dip, 1, NULL);
+} /* eb2_rem_intr() */
+
+/*
+ * eb2_start_engine()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The DMA engine's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The DMA engine was started
+ * DDI_FAILURE The DMA engine was not started
+ */
+static int
+eb2_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ uint_t csr;
+ int x;
+ uint32_t reset;
+ uint32_t enable;
+
+ if (eng->ce_num == CS4231_PLAY) {
+ reset = EB2_PCLEAR_RESET_VALUE;
+ enable = EB2_PLAY_ENABLE;
+ } else {
+ reset = EB2_RCLEAR_RESET_VALUE;
+ enable = EB2_REC_ENABLE;
+ }
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /* reset the DMA engine so we have a good starting place */
+ OR_SET_WORD(handle, &regs->eb2csr, EB2_RESET);
+
+ /* wait for the FIFO to drain, it should be empty */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* no reason to beat on the bus */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+ if (x >= CS4231_TIMEOUT) {
+ audio_dev_warn(state->cs_adev,
+ "timeout waiting for engine, not started!");
+ return (DDI_FAILURE);
+ }
+
+ /* now clear the RESET and EN_DMA bits */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_RESET|EB2_EN_DMA));
+
+ /* put into chaining mode, enable byte counts */
+ OR_SET_WORD(handle, &regs->eb2csr, reset);
+
+ /*
+ * Program the DMA engine.
+ */
+ eb2_load_fragment(eng);
+
+ /*
+ * Start playing before we load the next fragment.
+ */
+ OR_SET_WORD(handle, &regs->eb2csr, enable);
+
+ /*
+ * Program a 2nd fragment.
+ */
+ eb2_load_fragment(eng);
+
+ return (DDI_SUCCESS);
+
+} /* eb2_start_engine() */
+
+/*
+ * eb2_stop_engine()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_stop_engine(CS_engine_t *eng)
+{
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ uint_t csr;
+
+ /* shut off DMA and disable interrupts */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_EN_DMA | EB2_INT_EN));
+
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (int x = 0; (csr & EB2_CYC_PENDING) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1);
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+
+ /* set the RESET bit to stop audio, also clear any TC interrupt */
+ OR_SET_WORD(handle, &regs->eb2csr, EB2_RESET | EB2_TC);
+
+ /* wait for the FIFO to drain */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (int x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+
+ /* clear the RESET and EN_DMA bits */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_RESET|EB2_EN_DMA));
+
+} /* eb2_stop_engine() */
+
+/*
+ * eb2_power()
+ *
+ * Description:
+ * This routine turns the Codec on or off using the auxio register
+ * in the eb2 device (cheerio or rio). Fortunately we don't need
+ * to delay like we do with the APC.
+ *
+ * NOTE: The state structure must be locked when this routine is called.
+ *
+ * Arguments:
+ * CS_state_t *state Ptr to the device's state structure
+ * int level Power level to set
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_power(CS_state_t *state, int level)
+{
+ ddi_acc_handle_t xhandle = EB2_AUXIO_HNDL;
+
+ if (level == CS4231_PWR_ON) { /* turn power on */
+ AND_SET_WORD(xhandle, EB2_AUXIO_REG, ~EB2_AUXIO_COD_PDWN);
+ } else { /* turn power off */
+ OR_SET_WORD(xhandle, EB2_AUXIO_REG, EB2_AUXIO_COD_PDWN);
+ }
+
+} /* eb2_power() */
+
+
+/* ******* Local Routines ************************************************** */
+
+/*
+ * eb2_intr()
+ *
+ * Description:
+ * EB2 interrupt serivce routine. First we find out why there was an
+ * interrupt, then we take the appropriate action.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+eb2_intr(caddr_t T)
+{
+ CS_engine_t *eng = (void *)T;
+ CS_state_t *state = eng->ce_state;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ uint32_t csr;
+ boolean_t doit = B_FALSE;
+
+ /* the state must be protected */
+ mutex_enter(&state->cs_lock);
+ if (state->cs_suspended) {
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* get the EB2 CSR */
+ csr = ddi_get32(handle, &regs->eb2csr);
+
+ /* make sure this device sent the interrupt */
+ if (!(csr & EB2_INT_PEND)) {
+ mutex_exit(&state->cs_lock);
+ /* nope, this isn't our interrupt */
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* clear all interrupts we captured at this time */
+ ddi_put32(handle, &regs->eb2csr, (csr|EB2_TC));
+
+ if (csr & EB2_TC) {
+
+ /* try to load the next audio buffer */
+ eb2_load_fragment(eng);
+
+ /* if engine was started, then we want to consume later */
+ doit = eng->ce_started;
+
+ } else if (csr & EB2_ERR_PEND) {
+ audio_dev_warn(state->cs_adev, "error intr: 0x%x", csr);
+
+ } else {
+ audio_dev_warn(state->cs_adev, "unknown intr: 0x%x", csr);
+ }
+
+ /* update the kernel interrupt statisitcs */
+ if (state->cs_ksp) {
+ KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ if (doit) {
+ if (eng->ce_num == CS4231_PLAY) {
+ audio_engine_consume(eng->ce_engine);
+ } else {
+ audio_engine_produce(eng->ce_engine);
+ }
+ }
+
+ return (DDI_INTR_CLAIMED);
+
+} /* eb2_intr() */
+
+static void
+eb2_load_fragment(CS_engine_t *eng)
+{
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+
+ /* if next address already loaded, then we're done */
+ if ((ddi_get32(handle, &regs->eb2csr) & EB2_NA_LOADED)) {
+ return;
+ }
+
+ /*
+ * For eb2 we first program the Next Byte Count Register.
+ */
+ ddi_put32(handle, &regs->eb2bcr, eng->ce_fragsz);
+
+ /* now program the Next Address Register */
+ ddi_put32(handle, &regs->eb2acr, eng->ce_paddr[eng->ce_cfrag]);
+
+ eng->ce_cfrag++;
+ eng->ce_cfrag %= CS4231_NFRAGS;
+ eng->ce_count += eng->ce_fragfr;
+}
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf b/usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf
index 984e9e7abf..60424b03f0 100644
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audiocs audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -57,10 +45,3 @@ mixer-mode=1;
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audiocs driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c b/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c
deleted file mode 100644
index 8a9c92de1c..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c
+++ /dev/null
@@ -1,4119 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audio1575 Audio Driver
- *
- * The driver is primarily targeted at providing audio support for
- * those sparc systems which use the Uli M1575 audio core
- * and the Analog Devices AD1981 codec.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The M1575 audio core, in AC'97 controller mode, has independent
- * channels for PCM in, PCM out, mic in, modem in, and modem out.
- *
- * The AC'97 controller is a PCI bus master with scatter/gather
- * support. Each channel has a DMA engine. Currently, we use only
- * the PCM in and PCM out channels. Each DMA engine uses one buffer
- * descriptor list. And the buffer descriptor list is an array of up
- * to 32 entries, each of which describes a data buffer. Each entry
- * contains a pointer to a data buffer, control bits, and the length
- * of the buffer being pointed to, where the length is expressed as
- * the number of samples. This, combined with the 16-bit sample size,
- * gives the actual physical length of the buffer.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, m1575_sample_buf,
- * to handle the BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. There're also two hardware registers to index
- * the FIFO, the CIV (current index value) indicating the current BD the
- * hardware is transferring, and the LVI (last valid index) indicating
- * the last valid BD that contains proper data which the hardware should
- * not pass over. Each time a BD is processed, the hardware will issue an
- * interrupt. If the system is busy, there can be more than one BD to be
- * processed when the OS have chance to handle the interrupt. When an
- * interrupt generated, the interrupt handler will first reclaim the BD(s)
- * which had been transferred, which will be the limit [head, CIV-1], then
- * update the value of the head field to CIV, update the value of avail to
- * CIV - head. And then it will process avail BDs from tail, and set the
- * LVI to the last processed BD and update tail to LVI + 1, and update the
- * avail to 0.
- *
- * We allocate N blocks of DMA memory, say A and B, for every DMA
- * engine, and bind the first, Block A, to the even entries of BDL,
- * while bind the second to the odd entries. That's say, for each buffer
- * descriptor list of DMA engine, entry 0, 2,,, 30 would be bound to Block
- * A, and entry 1, 3,,, 31 would be bound to Block B. Take the playback as
- * an example. At the beginning of playback, we set the entry 0 and 1 to
- * point to block A and B separately, and tell the DMA engine that the last
- * valid entry is entry 1. So the DMA engine doesn't access the entries after
- * entry 1. When the first playback interrupt generated, we reclaim entry
- * 0, and fill the BD entry 2 with the address of Block A, then set the
- * entry 2 to be the last valid entry, and so on. So at any time there are
- * at most two entries available for per DMA engine.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audio1575_chip_init()
- *
- * TODO: System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audio1575_impl.h>
-#include <sys/audio/audio1575.h>
-#include <sys/cpuvar.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audio1575_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audio1575_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audio1575_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audio1575_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audio1575_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audio1575_ad_start_play(audiohdl_t, int);
-static void audio1575_ad_pause_play(audiohdl_t, int);
-static void audio1575_ad_stop_play(audiohdl_t, int);
-static int audio1575_ad_start_record(audiohdl_t, int);
-static void audio1575_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audio1575_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static int audio1575_init_ac97(audio1575_state_t *, int);
-static int audio1575_reset_ac97(audio1575_state_t *);
-static int audio1575_codec_sync(audio1575_state_t *);
-static int audio1575_write_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_read_ac97(audio1575_state_t *, int, uint16_t *);
-static int audio1575_and_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_or_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_chip_init(audio1575_state_t *, int);
-static int audio1575_init_state(audio1575_state_t *, dev_info_t *);
-static int audio1575_map_regs(dev_info_t *, audio1575_state_t *);
-static void audio1575_unmap_regs(audio1575_state_t *);
-static int audio1575_alloc_sample_buf(audio1575_state_t *, int, int);
-static void audio1575_free_sample_buf(audio1575_state_t *, int);
-static void audio1575_dma_stop(audio1575_state_t *);
-static int audio1575_fill_play_buf(audio1575_state_t *);
-static void audio1575_reclaim_play_buf(audio1575_state_t *);
-static int audio1575_prepare_record_buf(audio1575_state_t *);
-static void audio1575_reclaim_record_buf(audio1575_state_t *);
-static int audio1575_set_gain(audio1575_state_t *, int, int, int);
-static int audio1575_set_port(audio1575_state_t *, int, int);
-static int audio1575_set_monitor_gain(audio1575_state_t *, int);
-static void audio1575_pci_enable(audio1575_state_t *);
-static void audio1575_pci_disable(audio1575_state_t *);
-static int audio1575_dma_pause(audio1575_state_t *, int);
-static int audio1575_dma_resume(audio1575_state_t *, int);
-static int audio1575_dma_reset(audio1575_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audio1575_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audio1575_name = M1575_NAME;
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audio1575_modinfo = {
- M1575_IDNUM, /* module ID number */
- M1575_NAME, /* module name */
- M1575_MINPACKET, /* minimum packet size */
- M1575_MAXPACKET, /* maximum packet size */
- M1575_HIWATER, /* high water mark */
- M1575_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audio1575_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audio1575_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audio1575_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audio1575_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audio1575_str_info = {
- &audio1575_rqueue, /* read queue */
- &audio1575_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audio1575_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audio1575_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audio1575_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio1575_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audio1575_attach, /* devo_attach */
- audio1575_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audio1575_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audio1575_modldrv = {
- &mod_driverops, /* drv_modops */
- M1575_MOD_NAME, /* drv_linkinfo */
- &audio1575_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audio1575_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audio1575_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audio1575_mixer_srs[] = {
- M1575_SAMPR5510,
- M1575_SAMPR48000,
- 0
-};
-
-static uint_t audio1575_compat_srs [] = {
- M1575_SAMPR8000, M1575_SAMPR9600, M1575_SAMPR11025,
- M1575_SAMPR16000, M1575_SAMPR18900, M1575_SAMPR22050,
- M1575_SAMPR27420, M1575_SAMPR32000, M1575_SAMPR33075,
- M1575_SAMPR37800, M1575_SAMPR44100, M1575_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audio1575_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audio1575_mixer_srs
-};
-
-static am_ad_sample_rates_t audio1575_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio1575_compat_srs
-};
-
-static uint_t audio1575_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audio1575_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/* AD1981B Equalization Biquad IIR Filter coefficient address table */
-static m1575_biquad_t filters[] = {
- {0x1b, 0x0f}, {0x1a, 0x00}, {0x19, 0x00}, {0x1d, 0x00}, {0x1c, 0x00},
- {0x20, 0x0f}, {0x1f, 0x00}, {0x1e, 0x00}, {0x22, 0x00}, {0x21, 0x00},
- {0x25, 0x0f}, {0x24, 0x00}, {0x23, 0x00}, {0x27, 0x00}, {0x26, 0x00},
- {0x2a, 0x0f}, {0x29, 0x00}, {0x28, 0x00}, {0x2c, 0x00}, {0x2b, 0x00},
- {0x2f, 0x0f}, {0x2e, 0x00}, {0x2d, 0x00}, {0x31, 0x00}, {0x30, 0x00},
- {0x34, 0x0f}, {0x33, 0x00}, {0x32, 0x00}, {0x36, 0x00}, {0x35, 0x00},
- {0x39, 0x0f}, {0x38, 0x00}, {0x37, 0x00}, {0x3b, 0x00}, {0x3a, 0x00},
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x000000000000ffffLL, /* DMA counter register - 64 bits */
- 0x0000000000000008LL, /* DMA address align must be 8-bytes */
- 0x0000003c, /* 1 through 64 byte burst sizes */
- 0x00000008, /* min xfer DMA size BDList entry */
- 0x00000000000ffffLL, /* max xfer size, 64K */
- 0x000000000001fffLL, /* seg, set to PAGESIZE */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000008, /* granularity of device minxfer */
- 0 /* DMA flags use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x000000000001fffeLL, /* DMA counter register - 16 bits */
- 0x0000000000000002LL, /* DMA address align 2-byte boundary */
- 0x0000003c, /* 1 through 60 byte burst sizes */
- 0x00000004, /* min xfer DMA size BDList entry */
- 0x000000000001ffffLL, /* max xfer size, 64K */
- 0x000000000001ffffLL, /* seg, set to 64K */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000004, /* granularity of device minxfer */
- 0 /* DMA flags use virtual address */
-};
-
-static am_ad_entry_t audio1575_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audio1575_ad_set_config, /* ad_set_config() */
- audio1575_ad_set_format, /* ad_set_format() */
- audio1575_ad_start_play, /* ad_start_play() */
- audio1575_ad_pause_play, /* ad_pause_play() */
- audio1575_ad_stop_play, /* ad_stop_play() */
- audio1575_ad_start_record, /* ad_start_record() */
- audio1575_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("audio1575 _init() entering", NULL);
-
- if ((error = ddi_soft_state_init(&audio1575_statep,
- sizeof (audio1575_state_t), 1)) != 0) {
- ATRACE("audio1575 ddi_soft_state_init() failure",
- error);
-
- return (error);
- }
-
- if ((error = mod_install(&audio1575_modlinkage)) != 0) {
- ddi_soft_state_fini(&audio1575_statep);
- }
-
- ATRACE("audio1575 _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("audio1575 _fini() entering", audio1575_statep);
-
- if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
-
- return (error);
- }
-
- ddi_soft_state_fini(&audio1575_statep);
-
- ATRACE("audio1575 _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("audio1575 _info() entering", NULL);
-
- error = mod_info(&audio1575_modlinkage, modinfop);
-
- ATRACE("audio1575 _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audio1575_getinfo()
- */
-static int
-audio1575_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audio1575_state_t *statep;
- int instance;
- int error = DDI_FAILURE;
-
- ATRACE("audio1575_getinfo() entering", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((statep = ddi_get_soft_state(audio1575_statep,
- instance)) != NULL) {
- *result = statep->m1575_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- ATRACE("audio1575_getinfo() returning", error);
-
- return (error);
-
-} /* audio1575_getinfo() */
-
-/*
- * audio1575_attach()
- *
- * Description:
- * Attach an instance of the audio1575 driver. This routine does the
- * device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audio1575_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audio1575_state_t *statep;
- uint32_t intrsr;
- uint32_t intrcr;
- int instance;
- audio_sup_reg_data_t data;
-
- ATRACE("audio1575_attach() entering", dip);
-
- instance = ddi_get_instance(dip);
-
- switch (cmd) {
- case DDI_ATTACH:
- ATRACE("audio1575_attach() DDI_ATTACH", NULL);
- break;
- case DDI_RESUME:
- ATRACE("audio1575_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failure",
- audio1575_name, instance);
-
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT((statep->m1575_flags & M1575_DMA_SUSPENDED) ==
- M1575_DMA_SUSPENDED);
-
- statep->m1575_flags &= ~M1575_DMA_SUSPENDED;
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /*
- * Restore the audio1575 chip's state and
- * put the DMA Engines in a known state
- */
- if ((audio1575_chip_init(statep, M1575_INIT_RESTORE)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_attach()chip init failure",
- DDI_FAILURE);
-
- return (DDI_FAILURE);
- }
-
- /*
- * Start playing and recording, if not needed they'll stop
- * on their own. But, we don't start them if the hardware has
- * failed.
- */
- if (audio_sup_restore_state(statep->m1575_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() audio restart failure");
- }
-
- ATRACE("audio1575_attach() DDI_RESUME done", NULL);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE("audio1575_attach() unknown command", cmd);
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x",
- audio1575_name, instance, cmd);
-
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audio1575_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- /* get the state structure */
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() ddi_get_soft_state() failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- statep->m1575_inst = instance;
-
- /* call audiosup module registration routine */
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
-
- /* register the driver with the audio support module */
- if ((statep->m1575_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- /* map in the audio registers */
- if (audio1575_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_audiosup;
- }
-
- /* Enable PCI I/O and Memory Spaces */
- audio1575_pci_enable(statep);
-
- /*
- * clear the interrupt control and status register
- * READ/WRITE/READ workaround required
- * for buggy hardware
- */
-
- intrcr = 0L;
- M1575_AM_PUT32(M1575_INTRCR_REG, intrcr);
- intrcr = M1575_AM_GET32(M1575_INTRCR_REG);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* initialize the audio state structures */
- if ((audio1575_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() init state structure failure");
- goto error_pci_disable;
- }
-
- /* from here on, must destroy the mutex on error */
- mutex_init(&statep->m1575_intr_mutex, NULL, MUTEX_DRIVER,
- DDI_INTR_PRI(statep->m1575_intr_pri));
-
- /* allocate play and record sample buffers */
- if ((audio1575_alloc_sample_buf(statep, M1575_DMA_PCM_OUT,
- statep->m1575_play_buf_size) == AUDIO_FAILURE) ||
- (audio1575_alloc_sample_buf(statep, M1575_DMA_PCM_IN,
- statep->m1575_record_buf_size) == AUDIO_FAILURE)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() couldn't alloc sample buffers");
- goto error_destroy;
- }
-
- /* initialize audio controller and AC97 codec */
- if (audio1575_chip_init(statep, M1575_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() failure to init chip");
- goto error_dealloc;
- }
-
- /* save private state */
- audio_sup_set_private(statep->m1575_ahandle, statep);
-
- /* call the mixer attach() routine */
- if (am_attach(statep->m1575_ahandle, cmd, &statep->m1575_ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() am_attach() failure");
- goto error_dealloc;
- }
-
- /* set up kernel statistics */
- if ((statep->m1575_ksp = kstat_create(M1575_NAME, instance,
- M1575_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->m1575_ksp);
- }
-
- /* now add our interrupt handler */
- if (ddi_intr_add_handler(statep->m1575_h_table[0],
- (ddi_intr_handler_t *)audio1575_intr, (caddr_t)statep, NULL)) {
- audio_sup_log(statep->m1575_ahandle,
- CE_WARN, "!attach() ddi_intr_add_handler() failure");
- ATRACE("audio1575_attach() ddi_intr_add_handler() failure",
- NULL);
- goto error_kstat;
- }
-
- /* Enable PCI Interrupts */
- M1575_PCI_PUT8(M1575_PCIMISC_REG, M1575_PCIMISC_INTENB);
-
- /* enable audio interrupts */
- if (ddi_intr_enable(statep->m1575_h_table[0]) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() - ddi_intr_enable() failure");
- ATRACE("audio1575_attach() ddi_add_intr failure", NULL);
- goto error_intr_enable;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_attach() returning DDI_SUCCESS", NULL);
-
- return (DDI_SUCCESS);
-
-error_intr_enable:
- ATRACE("audio1575_attach() error_intr_enable", NULL)
- /* Disable PCI Interrupts */
- M1575_PCI_PUT8(M1575_PCIMISC_REG, 0);
- (void) ddi_intr_remove_handler(statep->m1575_h_table[0]);
-
-error_kstat:
- ATRACE("audio1575_attach() error_kstat", NULL);
- if (statep->m1575_ksp) {
- kstat_delete(statep->m1575_ksp);
- }
-
- (void) am_detach(statep->m1575_ahandle, DDI_DETACH);
-
-error_dealloc:
- ATRACE("audio1575_attach() error_dealloc", NULL);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_IN);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_OUT);
-
-error_destroy:
- ATRACE("audio1575_attach() error_destroy", statep);
- (void) ddi_intr_free(statep->m1575_h_table[0]);
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
- mutex_destroy(&statep->m1575_intr_mutex);
-
-error_pci_disable:
- ATRACE("audio1575_attach() error_pci_disable", NULL)
- audio1575_pci_disable(statep);
-
-error_unmap:
- ATRACE("audio1575_attach() error_unmap", NULL);
- audio1575_unmap_regs(statep);
-
-error_audiosup:
- ATRACE("audio1575_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->m1575_ahandle);
-
-error_state:
- ATRACE("audio1575_attach() error_state", statep);
- ddi_soft_state_free(audio1575_statep, instance);
-
- ATRACE("audio1575_attach() returning DDI_FAILURE", NULL);
-
- return (DDI_FAILURE);
-
-} /* audio1575_attach() */
-
-/*
- * audio1575_detach()
- *
- * Description:
- * Detach an instance of the audio1575 driver. After the Codec is detached
- * we call am_detach() and audio_sup_register() so they may do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audio1575_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audio1575_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audio1575_detach() entering", instance);
-
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failure",
- audio1575_name, instance);
- ATRACE("audio1575_detach() get soft state failure", instance);
-
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("audio1575_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT((statep->m1575_flags & M1575_DMA_SUSPENDED) !=
- M1575_DMA_SUSPENDED);
-
- /* stop all new operations */
- statep->m1575_flags |= M1575_DMA_SUSPENDED;
-
- /*
- * stop all DMA operations
- */
- (void) audio1575_dma_stop(statep);
-
- /*
- * Save the controller state. The Codec's state is
- * already in codec_shadow[].
- */
- if (audio_sup_save_state(statep->m1575_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!detach() audio save failure");
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_detach() SUSPEND successful", statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE("audio1575_detach() unknown command", cmd);
-
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!%s%d: detach() unknown command: 0x%x",
- audio1575_name, instance, cmd);
-
- return (DDI_FAILURE);
- }
-
- /* stop DMA engines */
- mutex_enter(&statep->m1575_intr_mutex);
- audio1575_dma_stop(statep);
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* disable interrupts */
- (void) ddi_intr_disable(statep->m1575_h_table[0]);
-
- /* Remove the interrupt handler */
- (void) ddi_intr_remove_handler(statep->m1575_h_table[0]);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the AD1981B codec */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-
- /* turn off the AC_LINK clock */
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 4);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* detach audio mixer */
- (void) am_detach(statep->m1575_ahandle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->m1575_ahandle);
-
- /* free the interrupt handle */
- (void) ddi_intr_free(statep->m1575_h_table[0]);
-
- /* free memory */
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
-
- /* free DMA memory */
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_IN);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_OUT);
-
- /* free the kernel statistics structure */
- if (statep->m1575_ksp) {
- kstat_delete(statep->m1575_ksp);
- }
-
- /* Disable PCI I/O and Memory Spaces */
- audio1575_pci_disable(statep);
-
- /* unmap the registers */
- audio1575_unmap_regs(statep);
-
- /* destroy the state mutex */
- mutex_destroy(&statep->m1575_intr_mutex);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(audio1575_statep, instance);
-
- ATRACE("audio1575_detach() returning success", NULL);
-
- return (DDI_SUCCESS);
-
-} /* audio1575_detach */
-
-/*
- * audio1575_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * Each of buffer descriptor has a field IOC(interrupt on completion)
- * When both this and the IOC bit of correspondent dma control register
- * is set, it means that the controller should issue an interrupt upon
- * completion of this buffer. Note that in the clearing of the interrupts
- * below that the PCM IN and PCM out interrupts ar cleared by their
- * respective control registers and not by writing a '1' to the INTRSR
- * the interrupt status register. Only CPRINTR,SPINTR,and GPIOINTR
- * require a '1' written to the INTRSR register to clear those
- * interrupts. See comments below.
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audio1575_intr(caddr_t arg)
-{
- audio1575_state_t *statep = (audio1575_state_t *)arg;
- uint32_t intrsr;
- uint16_t sr;
-
- ATRACE("in audio1575_intr()", statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* check if device is interrupting */
- if (intrsr == 0) {
- if (statep->m1575_ksp) {
- /* increment the spurious ino5 interrupt cnt */
- M1575_KIOP(statep)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_intr() not our interrupt", intrsr);
-
- return (DDI_INTR_UNCLAIMED);
- }
-
- /*
- * The Uli M1575 generates an interrupt for each interrupt
- * type. therefore we only process one interrupt type
- * per invocation of the audio1575_intr() routine.
- * WARNING: DO NOT attempt to optimize this by looping
- * until the INTRSR register is clear as this will
- * generate spurious ino5 interrupts.
- */
- if (intrsr & M1575_INTRSR_PCMIINTR) {
- /* Clear PCM IN interrupt */
- ATRACE("audio1575_intr() PCMIINTR", intrsr);
- sr = M1575_AM_GET16(M1575_PCMISR_REG);
- M1575_AM_PUT16(M1575_PCMISR_REG, sr & M1575_STATUS_CLR);
- /*
- * Note: This interrupt is not cleared by writing a '1'
- * to the M1575_INTRSR_REG according to the M1575 Super I/O
- * data sheet on page 189.
- */
-
- if (statep->m1575_flags & M1575_DMA_RECD_STARTED) {
- audio1575_reclaim_record_buf(statep);
- (void) audio1575_prepare_record_buf(statep);
- }
- } else if (intrsr & M1575_INTRSR_PCMOINTR) {
- /* Clear PCM OUT interrupt */
- ATRACE("audio1575_intr() PCMOINTR", intrsr);
- sr = M1575_AM_GET16(M1575_PCMOSR_REG);
- M1575_AM_PUT16(M1575_PCMOSR_REG, sr & M1575_STATUS_CLR);
- /*
- * Note: This interrupt is not cleared by writing a '1'
- * to the M1575_INTRSR_REG according to the M1575 Super I/O
- * data sheet on page 189.
- */
-
- if (statep->m1575_flags & M1575_DMA_PLAY_STARTED) {
- audio1575_reclaim_play_buf(statep);
- (void) audio1575_fill_play_buf(statep);
- }
- } else if (intrsr & M1575_INTRSR_SPRINTR) {
- /* Clear Status Register Available Interrupt */
- ATRACE("audio1575_intr() SPRINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_SPRINTR);
-
- } else if (intrsr & M1575_INTRSR_CPRINTR) {
- /* Clear Command Register Available Interrupt */
- ATRACE("audio1575_intr() CPRINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_CPRINTR);
- } else if (intrsr & M1575_INTRSR_GPIOINTR) {
- /* Clear General Purpose I/O Register Interrupt */
- ATRACE("audio1575_intr() GPIOINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_GPIOINTR);
- } else {
- /* Clear Unknown Interrupt */
- ATRACE("audio1575_intr() Unknown Interrupt", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- }
-
- /* update the kernel interrupt statistics */
- if (statep->m1575_ksp) {
- M1575_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audio1575_intr() */
-
-
-/* *********************** Mixer Entry Point Routines ******************* */
-
-/*
- * audio1575_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audio1575_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audio1575_state_t *statep;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_set_config() entering", stream);
- ATRACE("audio1575_ad_set_config() command", command);
- ATRACE("audio1575_ad_set_config() dir", dir);
- ATRACE("audio1575_ad_set_config() arg1", arg1);
- ATRACE("audio1575_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audio1575_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audio1575_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audio1575_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- (void) audio1575_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- (void) audio1575_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audio1575_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- rc = AUDIO_SUCCESS;
- } else { /* not muted */
- /* by setting the port we unmute only active ports */
- rc = audio1575_set_port(statep,
- AUDIO_PLAY, statep->m1575_output_port);
- }
-
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->m1575_ad_info.ad_add_mode |=
- AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audio1575_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->m1575_ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
-
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- ATRACE("audio1575_ad_set_config() unsupported cmd", command);
- break;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_set_config() */
-
-/*
- * audio1575_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 16 bit signed linear.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audio1575_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audio1575_state_t *statep;
- int rc = AUDIO_FAILURE;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
-
- ATRACE("audio1575_ad_set_format() entering", stream);
- ATRACE("audio1575_ad_set_format() dir", dir);
- ATRACE("audio1575_ad_set_format() sample_rate", sample_rate);
- ATRACE("audio1575_ad_set_format() channels", channels);
- ATRACE("audio1575_ad_set_format() precision", precision);
- ATRACE("audio1575_ad_set_format() encoding", encoding);
-
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE("audio1575_ad_set_format() bad encoding", encoding);
- return (rc);
- }
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- switch (sample_rate) {
- case M1575_SAMPR8000:
- case M1575_SAMPR9600:
- case M1575_SAMPR11025:
- case M1575_SAMPR16000:
- case M1575_SAMPR18900:
- case M1575_SAMPR22050:
- case M1575_SAMPR27420:
- case M1575_SAMPR32000:
- case M1575_SAMPR33075:
- case M1575_SAMPR37800:
- case M1575_SAMPR44100:
- case M1575_SAMPR48000:
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- ATRACE("audio1575_ad_set_format() bad sample rate",
- sample_rate);
- goto done;
- }
-
- switch (dir) {
- case AUDIO_PLAY:
- rc = audio1575_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
- statep->m1575_psample_rate = sample_rate;
- statep->m1575_pchannels = channels;
- statep->m1575_pprecision = precision;
- break;
-
- case AUDIO_RECORD:
- rc = audio1575_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
- statep->m1575_csample_rate = sample_rate;
- statep->m1575_cchannels = channels;
- statep->m1575_cprecision = precision;
- break;
-
- default:
- rc = AUDIO_FAILURE;
- ATRACE("audio1575_set_format() bad audio dir", dir);
- break;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_set_format() returning", rc);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (rc);
-
-} /* audio1575_ad_set_format() */
-
-/*
- * audio1575_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audio1575_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
- uint8_t pcmocr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_start_play() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* get ptr to play buffer */
- buf = &statep->m1575_play_buf;
-
- /* we are already PLAYING audio */
- if (statep->m1575_flags & M1575_DMA_PLAY_STARTED) {
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* If play was PAUSED then Start Playing */
- if (statep->m1575_flags & M1575_DMA_PLAY_PAUSED) {
- if ((audio1575_dma_resume(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
-
- statep->m1575_flags &= ~M1575_DMA_PLAY_PAUSED;
- statep->m1575_flags |= M1575_DMA_PLAY_STARTED;
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* we are here for the first time to play audio */
- if (!buf->io_started) {
- /* Prepare the DMA Engine */
- if ((audio1575_dma_pause(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
- /* set last valid index to zero */
- M1575_AM_PUT8(M1575_PCMOLVIV_REG, 0);
-
- /* set the buffer base */
- M1575_AM_PUT32(M1575_PCMOBDBAR_REG,
- statep->m1575_bdl_phys_pout);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = M1575_PLAY_BUFS;
-
- /* Set the IOCE bit */
- pcmocr = M1575_AM_GET8(M1575_PCMOCR_REG);
- pcmocr |= M1575_PCMOCR_IOCE;
- M1575_AM_PUT8(M1575_PCMOCR_REG, pcmocr);
- }
-
- if ((audio1575_fill_play_buf(statep)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- } else {
- buf->io_started = B_TRUE;
- statep->m1575_flags |= M1575_DMA_PLAY_STARTED;
- rc = AUDIO_SUCCESS;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_start_play() */
-
-/*
- * audio1575_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- uint32_t dmacr;
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ATRACE("audio1575_ad_pause_play() entering", ahandle);
- ATRACE("audio1575_ad_pause_play() stream", stream);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* do nothing if not running */
- if ((statep->m1575_flags & M1575_DMA_PLAY_STARTED) == 0) {
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if ((dmacr & M1575_DMACR_PCMOSTART) !=
- M1575_DMACR_PCMOSTART) {
- ATRACE("audio1575_pause_play() DMA engine "
- "already stopped", statep);
- goto done;
- }
- }
-
- /* Stop the DMA and set DMA pause flag */
- if ((audio1575_dma_pause(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_PAUSED;
- ATRACE("audio1575_ad_pause_play() failure", NULL);
- goto done;
- }
-
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- statep->m1575_flags |= M1575_DMA_PLAY_PAUSED;
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_pause_play() returning", NULL);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
-} /* audio1575_ad_pause_play() */
-
-/*
- * audio1575_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
-
- ATRACE("audio1575_ad_stop_play() entering", ahandle);
- ATRACE("audio1575_ad_stop_play() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the DMA Play engine */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_ad_stop_play() failure", NULL);
- goto done;
- }
-
- /* Clear the PCM Out Control Register */
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
-
- /* clear the play started and paused flags */
- buf = &statep->m1575_play_buf;
- buf->io_started = B_FALSE;
- statep->m1575_flags &= ~(M1575_DMA_PLAY_STARTED | \
- M1575_DMA_PLAY_PAUSED | M1575_DMA_PLAY_EMPTY);
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_stop_play() returning", NULL);
-
-} /* audio1575_ad_stop_play() */
-
-/*
- * audio1575_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audio1575_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
- uint8_t pcmicr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_start_record() entering", ahandle);
- ATRACE("audio1575_ad_start_record() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* get our record buffer ptr */
- buf = &statep->m1575_record_buf;
-
- if (statep->m1575_flags & M1575_DMA_RECD_STARTED) {
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* Prepare DMA engine */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_IN)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- goto done;
- }
-
- /* DMA Engine reset was successful */
- buf->head = 0;
- buf->tail = 0;
- buf->avail = M1575_REC_BUFS;
-
- /* Set the IOCE bit */
- pcmicr = M1575_AM_GET8(M1575_PCMICR_REG);
- pcmicr |= M1575_PCMICR_IOCE;
- M1575_AM_PUT8(M1575_PCMICR_REG, pcmicr);
-
- /* set last valid index to 0 */
- M1575_AM_PUT8(M1575_PCMILVIV_REG, 0);
-
- /* setup the Base Address Register */
- M1575_AM_PUT32(M1575_PCMIBDBAR_REG, statep->m1575_bdl_phys_pin);
-
- if ((audio1575_prepare_record_buf(statep)) ==
- AUDIO_SUCCESS) {
- statep->m1575_flags |= M1575_DMA_RECD_STARTED;
- rc = AUDIO_SUCCESS;
- } else {
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_start_record() */
-
-/*
- * audio1575_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
-
- ATRACE("audio1575_ad_stop_record() entering", ahandle);
- ATRACE("audio1575_ad_stop_record() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the DMA input registers */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_IN)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_ad_stop_record() failure", NULL);
- goto done;
- }
-
- /* clear the PCM In Control Register */
- M1575_AM_PUT8(M1575_PCMICR_REG, 0);
-
- /* clear the record started flag */
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- buf = &statep->m1575_record_buf;
- buf->io_started = B_FALSE;
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_stop_record() returning", NULL);
-
-} /* audio1575_ad_stop_record() */
-
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audio1575_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning from an error. Also, error_destroy:
- * in audio1575_attach() would need to be fixed as well.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audio1575_init_state(audio1575_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int count = 0;
- int actual = 0;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio1575_init_state() entering", NULL);
-
- statep->m1575_dip = dip;
-
- /* default to 5 bit volume */
- statep->m1575_vol_bits_mask = 5;
-
- /* see if we support internal CDROM */
- statep->m1575_cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- statep->m1575_mode = AM_MIXER_MODE;
- } else {
- statep->m1575_mode = AM_COMPAT_MODE;
- }
-
- /* get play interrupts */
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", M1575_INTS);
- if (pints > M1575_MAX_INTS) {
- ATRACE("audio1575_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, M1575_INTS);
- pints = M1575_INTS;
- } else if (pints < M1575_MIN_INTS) {
- ATRACE("audio1575_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, M1575_INTS);
- pints = M1575_INTS;
- }
-
- /* get record interrupts */
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", M1575_INTS);
- if (rints > M1575_MAX_INTS) {
- ATRACE("audio1575_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, M1575_INTS);
- rints = M1575_INTS;
- } else if (rints < M1575_MIN_INTS) {
- ATRACE("audio1575_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too low, %d "
- "resetting to %d", rints, M1575_INTS);
- rints = M1575_INTS;
- }
-
- /* get supported interrupt types */
- rc = ddi_intr_get_supported_types(dip, &statep->m1575_intr_type);
-
- if ((rc != DDI_SUCCESS) ||
- (!(statep->m1575_intr_type & DDI_INTR_TYPE_FIXED))) {
- audio_sup_log(statep->m1575_ahandle,
- CE_WARN, "!init_state() Fixed type interrupts not "
- "supported");
- ATRACE("audio1575_init_state() fixed type INTR not supported",
- NULL);
- goto error_intr;
- }
-
- /* make sure we only have one fixed type interrupt */
- rc = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
-
- if ((rc != DDI_SUCCESS) || (count != 1)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() no fixed interrupts");
- ATRACE("audio1575_init_state() no fixed interrupts",
- NULL);
- goto error_intr;
- }
-
- /* allocate interrupt table */
- statep->m1575_h_table = kmem_zalloc(sizeof (ddi_intr_handle_t),
- KM_SLEEP);
-
- rc = ddi_intr_alloc(dip, statep->m1575_h_table, DDI_INTR_TYPE_FIXED, 0,
- count, &actual, DDI_INTR_ALLOC_NORMAL);
- if ((rc != DDI_SUCCESS) || (actual != 1)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() ddi_intr_alloc() failure");
- ATRACE("audio1575_init_state() ddi_intr_alloc failure", actual);
- goto error_alloc;
- }
-
- ASSERT(count == actual);
- /* Get the interrupt priority for initializing the m1575_intr_mutex */
- if ((ddi_intr_get_pri(statep->m1575_h_table[0],
- &statep->m1575_intr_pri)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() ddi_intr_get_pri() failure");
- ATRACE("audio1575_init_state() ddi_intr_get_pri() failure",
- NULL);
- goto error_free;
- }
-
- /* test for a high level interrupt */
- if (statep->m1575_intr_pri >= ddi_intr_get_hilevel_pri()) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() unsupported high level interrupt");
- ATRACE("audio1575_init_state() high level interrupt not "
- "supported", NULL);
- goto error_free;
- }
-
- /* fill in the device default state */
- statep->m1575_defaults.play.sample_rate = M1575_DEFAULT_SR;
- statep->m1575_defaults.play.channels = M1575_DEFAULT_CH;
- statep->m1575_defaults.play.precision = M1575_DEFAULT_PREC;
- statep->m1575_defaults.play.encoding = M1575_DEFAULT_ENC;
- statep->m1575_defaults.play.gain = M1575_DEFAULT_PGAIN;
- statep->m1575_defaults.play.port = AUDIO_SPEAKER;
- statep->m1575_defaults.play.avail_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT | AUDIO_HEADPHONE;
- statep->m1575_defaults.play.mod_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT | AUDIO_HEADPHONE;
- statep->m1575_defaults.play.buffer_size = M1575_BSIZE;
- statep->m1575_defaults.play.balance = M1575_DEFAULT_BAL;
- statep->m1575_defaults.record.sample_rate = M1575_DEFAULT_SR;
- statep->m1575_defaults.record.channels = M1575_DEFAULT_CH;
- statep->m1575_defaults.record.precision = M1575_DEFAULT_PREC;
- statep->m1575_defaults.record.encoding = M1575_DEFAULT_ENC;
- statep->m1575_defaults.record.gain = M1575_DEFAULT_RGAIN;
- statep->m1575_defaults.record.port = AUDIO_MICROPHONE;
- statep->m1575_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->m1575_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->m1575_defaults.record.buffer_size = M1575_BSIZE;
- statep->m1575_defaults.record.balance = M1575_DEFAULT_BAL;
-
- statep->m1575_defaults.monitor_gain = M1575_DEFAULT_MONITOR_GAIN;
- statep->m1575_defaults.output_muted = B_FALSE;
- statep->m1575_defaults.ref_cnt = B_FALSE;
- statep->m1575_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX|AUDIO_HWFEATURE_PLAY|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_RECORD;
- statep->m1575_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (statep->m1575_cdrom) {
- statep->m1575_defaults.record.avail_ports |= AUDIO_CD;
- statep->m1575_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->m1575_psample_rate = statep->m1575_defaults.play.sample_rate;
- statep->m1575_pchannels = statep->m1575_defaults.play.channels;
- statep->m1575_pprecision = statep->m1575_defaults.play.precision;
- statep->m1575_csample_rate = statep->m1575_defaults.record.sample_rate;
- statep->m1575_cchannels = statep->m1575_defaults.record.channels;
- statep->m1575_cprecision = statep->m1575_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->m1575_ad_info.ad_mode = statep->m1575_mode;
- statep->m1575_ad_info.ad_int_vers = AM_VERSION;
- statep->m1575_ad_info.ad_add_mode = NULL;
- statep->m1575_ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->m1575_ad_info.ad_defaults = &statep->m1575_defaults;
- statep->m1575_ad_info.ad_play_comb = audio1575_combinations;
- statep->m1575_ad_info.ad_rec_comb = audio1575_combinations;
- statep->m1575_ad_info.ad_entry = &audio1575_entry;
- statep->m1575_ad_info.ad_dev_info = &statep->m1575_dev_info;
- statep->m1575_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->m1575_ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->m1575_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->m1575_ad_info.ad_misc_flags = AM_MISC_RP_EXCL;
- statep->m1575_ad_info.ad_misc_flags |= AM_MISC_MONO_DUP;
- statep->m1575_ad_info.ad_translate_flags = AM_MISC_8_R_TRANSLATE;
- statep->m1575_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->m1575_ad_info.ad_play.ad_mixer_srs =
- audio1575_mixer_sample_rates;
- statep->m1575_ad_info.ad_play.ad_compat_srs =
- audio1575_compat_sample_rates;
- statep->m1575_ad_info.ad_play.ad_conv = &am_src2;
- statep->m1575_ad_info.ad_play.ad_sr_info = NULL;
- statep->m1575_ad_info.ad_play.ad_chs = audio1575_channels;
- statep->m1575_ad_info.ad_play.ad_int_rate = pints;
- statep->m1575_ad_info.ad_play.ad_max_chs = M1575_MAX_OUT_CHANNELS;
- statep->m1575_ad_info.ad_play.ad_bsize = M1575_BSIZE;
-
- /* record capabilities */
- statep->m1575_ad_info.ad_record.ad_mixer_srs =
- audio1575_mixer_sample_rates;
- statep->m1575_ad_info.ad_record.ad_compat_srs =
- audio1575_compat_sample_rates;
- statep->m1575_ad_info.ad_record.ad_conv = &am_src2;
- statep->m1575_ad_info.ad_record.ad_sr_info = NULL;
- statep->m1575_ad_info.ad_record.ad_chs = audio1575_channels;
- statep->m1575_ad_info.ad_record.ad_int_rate = rints;
- statep->m1575_ad_info.ad_record.ad_max_chs = M1575_MAX_CHANNELS;
- statep->m1575_ad_info.ad_record.ad_bsize = M1575_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(statep->m1575_dev_info.name, M1575_DEV_NAME);
- (void) strcpy(statep->m1575_dev_info.config, M1575_DEV_CONFIG);
- (void) strcpy(statep->m1575_dev_info.version, M1575_DEV_VERSION);
-
- /* compute play and record buffer sizes */
- statep->m1575_play_buf_size = M1575_SAMPR48000 *
- AUDIO_CHANNELS_STEREO * (AUDIO_PRECISION_16 >>
- AUDIO_PRECISION_SHIFT) / pints;
- statep->m1575_play_buf_size += M1575_MOD_SIZE -
- (statep->m1575_play_buf_size % M1575_MOD_SIZE);
- statep->m1575_record_buf_size = M1575_SAMPR48000 *
- AUDIO_CHANNELS_STEREO * (AUDIO_PRECISION_16 >>
- AUDIO_PRECISION_SHIFT) / rints;
- statep->m1575_record_buf_size += M1575_MOD_SIZE -
- (statep->m1575_record_buf_size % M1575_MOD_SIZE);
-
- statep->m1575_flags = 0;
-
- ATRACE("audio1575_init_state() returning", NULL);
-
- return (AUDIO_SUCCESS);
-
-error_free:
- (void) ddi_intr_free(statep->m1575_h_table[0]);
-error_alloc:
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
-error_intr:
- ATRACE("audio1575_init_state() failure", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_init_state() */
-
-/*
- * audio1575_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audio1575_map_regs(dev_info_t *dip, audio1575_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
-
- ATRACE("in audio1575_map_regs() entering", statep);
-
- statep->m1575_res_flags = 0;
-
- /* Check for fault management capabilities */
- if (DDI_FM_ACC_ERR_CAP(ddi_fm_capable(dip))) {
- dev_attr.devacc_attr_access = DDI_FLAGERR_ACC;
- }
-
- /* map the M1575 Audio PCI Cfg Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_PCICFG_SPACE,
- (caddr_t *)&statep->m1575_pci_regs, 0, 0, &dev_attr,
- &statep->m1575_pci_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() PCI Config mapping failure");
- ATRACE("audio1575_map_regs() PCI Cfg Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_PCI_REGS;
-
- /* map the M1575 Audio registers in PCI IO Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE,
- (caddr_t *)&statep->m1575_am_regs, 0, 0, &dev_attr,
- &statep->m1575_am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() Audio IO mapping failure");
- ATRACE("audio1575_map_regs() PCI IO Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_AM_REGS;
-
- /* map the M1575 Audio registers in PCI MEM32 Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_MEM_SPACE,
- (caddr_t *)&statep->m1575_bm_regs, 0, 0, &dev_attr,
- &statep->m1575_bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() Audio MEM32 mapping failure");
- ATRACE("audio1575_map_regs() PCI MEM32 Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_BM_REGS;
-
- /*
- * Here we allocate DMA memory for the buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->m1575_bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() ddi_dma_alloc_handle "
- "(bdlist) failure");
- ATRACE("audio1575_map_regs() ddi_dma_alloc_handle() failure",
- NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_HANDLE;
-
- /*
- * we allocate all buffer descriptors lists in contiguous dma memory.
- */
- if (ddi_dma_mem_alloc(statep->m1575_bdl_dma_handle,
- sizeof (m1575_bd_entry_t) * M1575_BD_NUMS * 2,
- &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- (caddr_t *)&statep->m1575_bdl_virtual, &statep->m1575_bdl_size,
- &statep->m1575_bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() ddi_dma_mem_alloc(bdlist) failure");
- ATRACE("audio1575_map_regs() ddi_dma_mem_alloc(bdlist) failure",
- NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->m1575_bdl_dma_handle, NULL,
- (caddr_t)statep->m1575_bdl_virtual, statep->m1575_bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() addr_bind_handle failure");
- ATRACE("audio1575_map_regs() ddi_dma_addr_bind_handle failure",
- NULL);
- goto error;
- }
-
- statep->m1575_bdl_virt_pin =
- (m1575_bd_entry_t *)(statep->m1575_bdl_virtual);
- statep->m1575_bdl_virt_pout =
- statep->m1575_bdl_virt_pin + M1575_BD_NUMS;
- statep->m1575_bdl_phys_pin = (uint32_t)(cookie.dmac_address);
- statep->m1575_bdl_phys_pout = statep->m1575_bdl_phys_pin +
- sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_BIND;
-
- ATRACE("audio1575_map_regs() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-error:
- audio1575_unmap_regs(statep);
-
- ATRACE("audio1575_map_regs() returning AUDIO_FAILURE", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_map_regs() */
-
-/*
- * audio1575_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and the unmaps control registers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_unmap_regs(audio1575_state_t *statep)
-{
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_BIND) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->m1575_bdl_dma_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_MEM) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->m1575_bdl_acc_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_HANDLE) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->m1575_bdl_dma_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_BM_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_BM_REGS;
- ddi_regs_map_free(&statep->m1575_bm_regs_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_AM_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_AM_REGS;
- ddi_regs_map_free(&statep->m1575_am_regs_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_PCI_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_PCI_REGS;
- pci_config_teardown(&statep->m1575_pci_regs_handle);
- }
-
-} /* audio1575_unmap_regs() */
-
-/*
- * audio1575_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * M1575_DMA_PCM_IN ---PCM in DMA engine
- * M1575_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-static int
-audio1575_alloc_sample_buf(audio1575_state_t *statep, int which, int len)
-{
- m1575_sample_buf_t *buf;
- m1575_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
- int j;
- int handle_cnt = 0;
- int buf_cnt = 0;
- int bind_cnt = 0;
-
- ATRACE("audio1575_alloc_sample_buf() entering", which);
-
- switch (which) {
- case M1575_DMA_PCM_OUT:
- buf = &statep->m1575_play_buf;
- for (i = 0; i < M1575_PLAY_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- if (ddi_dma_alloc_handle(statep->m1575_dip,
- &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL,
- &chunk->dma_handle) != DDI_SUCCESS) {
- goto error;
- }
- handle_cnt++;
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len,
- &dev_attr, DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &chunk->data_buf,
- &chunk->real_len, &chunk->acc_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
- buf_cnt++;
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle,
- NULL, chunk->data_buf, chunk->real_len,
- DDI_DMA_WRITE|DDI_DMA_STREAMING,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- goto error;
- }
- bind_cnt++;
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
- break;
-
- case M1575_DMA_PCM_IN:
- buf = &statep->m1575_record_buf;
- for (i = 0; i < M1575_REC_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- if (ddi_dma_alloc_handle(statep->m1575_dip,
- &sample_buf_dma_attr, DDI_DMA_SLEEP,
- NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
- handle_cnt++;
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len,
- &dev_attr, DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &chunk->data_buf, &chunk->real_len,
- &chunk->acc_handle) != DDI_SUCCESS) {
- goto error;
- }
- buf_cnt++;
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len,
- DDI_DMA_READ|DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &cookie, &count) != DDI_DMA_MAPPED) {
- goto error;
- }
- bind_cnt++;
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
- break;
-
- default:
- ATRACE("audio1575_alloc_sample_buf() unknown buffer type",
- which);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio1575_alloc_sample_buf() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-error:
- for (j = 0; j < bind_cnt; j++) {
- (void) ddi_dma_unbind_handle((buf->chunk[j].dma_handle));
- }
- for (j = 0; j < buf_cnt; j++) {
- ddi_dma_mem_free(&(buf->chunk[j].acc_handle));
- }
- for (j = 0; j < handle_cnt; j++) {
- ddi_dma_free_handle(&(buf->chunk[j].dma_handle));
- }
-
- ATRACE("audio1575_alloc_sample_buf() returning", AUDIO_FAILURE);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_alloc_sample_buf() */
-
-/*
- * audio1575_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audio1575_alloc_sample_buf().
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- *
- * Returns:
- * void
- */
-static void
-audio1575_free_sample_buf(audio1575_state_t *statep, int which)
-{
- m1575_sample_buf_t *buf;
- m1575_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audio1575_free_sample_buf() entering", statep);
-
- switch (which) {
- case M1575_DMA_PCM_IN:
- buf = &statep->m1575_record_buf;
- for (i = 0; i < M1575_REC_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- }
- break;
-
- case M1575_DMA_PCM_OUT:
- buf = &statep->m1575_play_buf;
- for (i = 0; i < M1575_PLAY_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- }
- break;
-
- default:
- ATRACE("audio1575_free_sample() unknown buffer type",
- which);
- break;
- }
-
- ATRACE("audio1575_free_sample_buf() returning", NULL);
-
-} /* audio1575_free_sample_buf() */
-
-/*
- * audio1575_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_reclaim_play_buf(audio1575_state_t *statep)
-{
- m1575_sample_buf_t *buf;
- int16_t pcmociv;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* get the play buf ptr */
- buf = &statep->m1575_play_buf;
-
- /* get out current index value */
- pcmociv = M1575_AM_GET8(M1575_PCMOCIV_REG);
-
- while (buf->head != pcmociv) {
- buf->avail++;
- buf->head++;
- buf->head &= M1575_BD_MSK;
- }
-
-} /* audio1575_reclaim_play_buf() */
-
-/*
- * audio1575_init_ac97()
- *
- * Description:
- * This routine initializes the AC97 codec.
- * The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int restore If M1575_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio1575_init_ac97(audio1575_state_t *statep, int restore)
-{
- uint16_t sr;
- uint16_t *shadow;
- uint16_t tmp;
- uint16_t addr;
- int i;
- clock_t ticks;
-
- ATRACE("audio1575_init_ac97() entering", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ticks = drv_usectohz(AD1981_POWERON_DELAY_USEC);
-
- /* AC97 register reset */
- if (audio1575_reset_ac97(statep) != AUDIO_SUCCESS) {
- ATRACE("audio1575_ac97_init() codec not reset", NULL);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* turn on the AD1981B codec power and wait for analog i/o be ready */
- (void) audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &sr);
- (void) audio1575_write_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, sr & 0x00ff);
-
- /*
- * Wait 1 sec for the analog section to power up
- * checking every 10 ms.
- */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- (void) audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &sr);
- if ((sr & PCSR_POWERD_UP) == PCSR_POWERD_UP) {
- break;
- }
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* return failure if the codec did not power up */
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!failure to power up the AC97 Codec");
- ATRACE("audio1575_ac97_init() codec not powered up", sr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* point to our codec shadow registers */
- shadow = statep->m1575_codec_shadow;
-
- if (restore == M1575_INIT_NO_RESTORE) {
- for (i = 0; i < M1575_LAST_AC_REG; i += 2) {
- (void) audio1575_read_ac97(statep, i,
- &(shadow[M1575_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE | MMVR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /*
- * 0eh - set mic input, mute, +20dB attenuation
- * actually this is 30dB when MICVR_20dB_Boost
- * is set. (see misc. register 0x76 setting
- * of MIC_30dB_GAIN below.)
- */
- shadow[M1575_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE | MICVR_20dB_BOOST | MICVR_0dB_GAIN;
- statep->m1575_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[M1575_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[M1575_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[M1575_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[M1575_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 28h - set to use Primary Codec channels 1 & 2 */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_AUDIO_REGISTER)] =
- EAR_PRIMARY_CODEC;
-
- /* 2ah - set to use Primary Codec channels 1 & 2 */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER)]
- = 0;
-
- /* 2ch - PCM Front DAC Sample Rate */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_FRONT_DAC_RATE_REGISTER)] =
- AC97_SAMPLE_RATE_48000;
-
- /* 32h - PCM ADC Sample Rate */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_LR_DAC_RATE_REGISTER)] =
- AC97_SAMPLE_RATE_48000;
-
- /* 64h - Mixer ADC Gain Register */
- shadow[M1575_CODEC_REG(AC97_MIXER_ADC_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN|RGR_MUTE;
-
- /* 76h - Misc. Control Bit Register */
- shadow[M1575_CODEC_REG(AC97_MISC_CONTROL_BIT_REGISTER)] =
- MIC_30dB_GAIN | C1MIC;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= M1575_LAST_AC_REG; i += 2) {
- (void) audio1575_write_ac97(statep, i,
- shadow[M1575_CODEC_REG(i)]);
- }
-
- /*
- * Now we setup the EQ register to scale 16 bit linear pcm
- * values into 20 bit DAC values.
- */
-
- /* 60h - EQ Control Register */
-
- /*
- * Here we set up the 6 biquad IIR filters to use
- * coefficient a0 as our scaling factor. The equation for
- * this filter is:
- *
- * Y(n) = a0(a1(y(n-1))+a2(y(n-2))+b2(x(n-2))+b1(x(n-1)))
- * we use the following coefficient values:
- *
- * a0 = 0x000f;
- * a1 = 0x0001;
- * a2 = 0x0001;
- * b1 = 0x0001;
- * b2 = 0x0001;
- */
- for (i = 0; i < AD1981_MAX_FILTERS; i++) {
- addr = filters[i].addr | AD1981_EQCTRL_SYM | AD1981_EQCTRL_EQM;
- tmp = filters[i].coeff;
- (void) audio1575_write_ac97(statep, AD1981_EQCTRL_REG, addr);
- (void) audio1575_write_ac97(statep, AD1981_EQDATA_REG, tmp);
- }
-
- /* The AD1981B Codec only implements 5 bit volume register */
- (void) audio1575_read_ac97(statep, AC97_MASTER_VOLUME_REGISTER, &tmp);
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->m1575_vol_bits_mask = 6;
- }
-
- /* resume the master volume to mute */
- (void) audio1575_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip do support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audio1575_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER, &tmp);
- if (!(tmp & EAR_VRA)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!AD8191B codec does not support VRA");
- ATRACE("audio1575_ac97_init() AD1981 EAR_VRA not set", tmp);
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_FAILURE);
-
- } else {
- /* set variable sample rate mode */
- (void) audio1575_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
- }
-
- ATRACE("audio1575_ac97_init() sample rate",
- statep->m1575_defaults.play.sample_rate);
-
- ATRACE("audio1575_ac97_init() returning", AUDIO_SUCCESS);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_init_ac97() */
-
-/*
- * audio1575_chip_init()
- *
- * Description:
- * This routine initializes the M1575 AC97 audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow. This routine expects that the
- * PCI IO and Memory spaces have been mapped and enabled already.
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int restore If M1575_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio1575_chip_init(audio1575_state_t *statep, int restore)
-{
- uint32_t scr;
- uint32_t ssr;
- uint32_t rtsr;
- uint32_t intfcr;
- int i;
- int j;
- int rc;
- uint8_t clk_detect;
- clock_t ticks;
-
- ATRACE("audio1575_chip_init() entering", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ticks = drv_usectohz(M1575_LOOP_CTR);
-
- /*
- * SADA only supports stereo, so we set the channel bits
- * to "00" to select 2 channels.
- * will also set the following:
- *
- * Disable double rate enable
- * no SPDIF output selected
- * 16 bit audio record mode
- * 16 bit pcm out mode
- * PCM Out 6 chan mode FL FR CEN BL BR LFE
- * PCM Out 2 channel mode (00)
- */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Reset the AC97 Codec and default to 2 channel 16 bit mode */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-#ifndef __lock_lint
- delay(ticks<<1);
-#endif
- /* Read the System Status Reg */
- ssr = M1575_AM_GET32(M1575_SSR_REG);
-
- /* make sure and release the blocked reset bit */
- if (ssr & M1575_SSR_RSTBLK) {
- ATRACE("audio1575_chip_init()! RSTBLK detected", ssr);
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= M1575_INTFCR_RSTREL;
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
-#ifndef __lock_lint
- delay(ticks);
-#endif
- /* Read the System Status Reg */
- ssr = M1575_AM_GET32(M1575_SSR_REG);
-
- /* make sure and release the blocked reset bit */
- if (ssr & M1575_SSR_RSTBLK) {
- ATRACE("audio1575_chip_init()! RSTBLK failure",
- ssr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* Reset the controller */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* according AC'97 spec, wait for codec reset */
- for (j = 0; j < M1575_LOOP_CTR; j++) {
- scr = M1575_AM_GET32(M1575_SCR_REG);
- if ((scr & M1575_SCR_COLDRST) == 0) {
- break;
- }
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* codec reset failed */
- if (j >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!failure to reset codec");
- ATRACE("audio1575_chip_init() "
- "!AC97 COLDRST failure", scr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Wait for FACRDY First codec ready. The hardware can
- * provide the state of
- * codec ready bit on SDATA_IN[0] and as reflected in
- * the Recv Tag Slot Reg.
- */
- rtsr = M1575_AM_GET32(M1575_RTSR_REG);
- if (rtsr & M1575_RTSR_FACRDY) {
- break;
- } else { /* reset the status and wait for new status to set */
- rtsr |= M1575_RTSR_FACRDY;
- M1575_AM_PUT32(M1575_RTSR_REG, rtsr);
- drv_usecwait(10);
- }
- }
-
- /* if we could not reset the AC97 codec then report failure */
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!chip_init() no codec ready signal received");
- ATRACE("audio1575_chip_init() AC97 Codec init "
- "failure - BAD Board", rtsr);
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_FAILURE);
- }
-
- /* Magic code from ULi to Turn on the AC_LINK clock */
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 4);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- (void) M1575_PCI_GET8(M1575_PCIACD_REG);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 2);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- clk_detect = M1575_PCI_GET8(M1575_PCIACD_REG);
-
- if (clk_detect != 1) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!chip_init() No AC97 Clock Detected");
- ATRACE("audio1575_chip_init() no AC97 Clock detected",
- clk_detect);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* Magic code from Uli to Init FIFO1 and FIFO2 */
- M1575_AM_PUT32(M1575_FIFOCR1_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR2_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR3_REG, 0x81818181);
-
- /* Disable SPDIF Output */
- M1575_AM_PUT8(M1575_CSPOCR_REG, 0);
-
- /* Disable Everyone */
- M1575_AM_PUT32(M1575_INTFCR_REG, 0L);
-
- audio1575_dma_stop(statep);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* now initialize the AC97 codec */
- rc = audio1575_init_ac97(statep, restore);
-
- ATRACE("audio1575_chip_init() returning", rc);
-
- return (rc);
-
-} /* audio1575_chip_init() */
-
-/*
- * audio1575_dma_stop()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_dma_stop(audio1575_state_t *statep)
-{
- uint32_t dmacr;
- uint32_t intrsr;
- uint32_t intrcr;
- uint16_t sr;
- int i;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_dma_stop() entering", NULL);
-
- /* pause bus master (needed for the following reset register) */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- dmacr |= M1575_DMACR_PAUSE_ALL;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if (dmacr & M1575_DMACR_PAUSE_ALL) {
- break;
- }
- drv_usecwait(10);
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- }
-
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!dma_stop() failed to stop DMA engines");
- ATRACE("audio1575_dma_stop() failure "
- "to stop DMA engines", dmacr);
- return;
- }
-
- /* Pause bus master (needed for the following reset register) */
- M1575_AM_PUT8(M1575_PCMICR_REG, 0);
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
- M1575_AM_PUT8(M1575_MICICR_REG, 0);
- M1575_AM_PUT8(M1575_CSPOCR_REG, 0);
- M1575_AM_PUT8(M1575_PCMI2CR_RR, 0);
- M1575_AM_PUT8(M1575_MICI2CR_RR, 0);
-
- /* Reset the bus master registers for all DMA engines */
- M1575_AM_PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
- M1575_AM_PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
- M1575_AM_PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
- M1575_AM_PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
- M1575_AM_PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
- M1575_AM_PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
-
- /* Reset FIFOS */
- M1575_AM_PUT32(M1575_FIFOCR1_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR2_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR3_REG, 0x81818181);
-
- /* Clear Interrupts */
- sr = M1575_AM_GET16(M1575_PCMISR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMISR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_PCMOSR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMOSR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_MICISR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_MICISR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_CSPOSR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_CSPOSR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_PCMI2SR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMI2SR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_MICI2SR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_MICI2SR_REG, sr);
-
- /*
- * clear the interrupt control and status register
- * READ/WRITE/READ workaround required
- * for buggy hardware
- */
-
- intrcr = 0L;
- M1575_AM_PUT32(M1575_INTRCR_REG, intrcr);
- intrcr = M1575_AM_GET32(M1575_INTRCR_REG);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* clear all flags except DMA suspend flag */
- statep->m1575_flags &= M1575_DMA_SUSPENDED;
-
- ATRACE("audio1575_stop_dma() returning", NULL);
-
-} /* audio1575_dma_stop() */
-
-/*
- * audio1575_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio1575_set_gain(audio1575_state_t *statep, int dir, int gain, int channel)
-{
- uint16_t tmp;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- switch (dir) {
- case AUDIO_PLAY:
- /*
- * For play we use PCM so all volumes change with just
- * one write. This way we get line out, headphone and
- * internal speaker in one shot.
- *
- * The AC97 Codec goes from -34.5 dB (11111) to 0 dB
- * (01000) to +12.0 dB (00000). We turn gain into attenuation
- * The AD1981B codec uses attenuation instead of gain as well.
- * abs(-34.5dB)+12.dB = 46.5dB of dynamic range/1.5dB per bit
- * gives a range of 0x00-0x1f (0-31) values.
- */
-
- /* read the play gain register */
- (void) audio1575_read_ac97(statep, AC97_PCM_OUT_VOLUME_REGISTER,
- &tmp);
- tmp &= ~PCMOVR_MUTE;
-
- if (channel == 0) { /* left channel */
- tmp &= ~PCMOVR_LEFT_GAIN_MASK;
- tmp |= (((AUDIO_MAX_GAIN - gain) >>
- M1575_GAIN_SHIFT3) << M1575_BYTE_SHIFT) &
- PCMOVR_LEFT_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp &= ~PCMOVR_RIGHT_GAIN_MASK;
- tmp |= ((AUDIO_MAX_GAIN - gain) >>
- M1575_GAIN_SHIFT3) & PCMOVR_RIGHT_GAIN_MASK;
- }
-
- /* update the play gain register */
- (void) audio1575_write_ac97(statep,
- AC97_PCM_OUT_VOLUME_REGISTER, tmp);
- (void) audio1575_read_ac97(statep, AC97_PCM_OUT_VOLUME_REGISTER,
- &tmp);
- break;
-
- case AUDIO_RECORD:
- /*
- * For record we use the master record gain with all
- * of the inputs set to 0dB.
- * The AC97 Codec goes from 0 dB (0000) to +22.5 dB
- * (1111) 22.5 dB/1.5dB per bit = range of 0x0-0xf;
- * Note: this is gain not attenuation.
- */
-
- /* read the record gain register */
- (void) audio1575_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= (gain << M1575_GAIN_SHIFT4) & RGR_LEFT_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= (gain >> M1575_GAIN_SHIFT4) & RGR_RIGHT_MASK;
- }
-
- /* update the record gain register */
- (void) audio1575_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- (void) audio1575_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
- break;
-
- default:
- ATRACE("audio1575_set_gain() Unknown audio direction", dir);
-
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_set_gain() */
-
-/*
- * audio1575_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set:
- * AUDIO_SPEAKER output to built-in speaker
- * AUDIO_HEADPHONE output to headphone
- * AUDIO_LINE_OUT output to line out
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CD input from internal CD
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audio1575_set_port(audio1575_state_t *statep, int dir, int port)
-{
- uint16_t tmp = 0;
- uint16_t reg = 0;
- uint32_t intfcr = 0;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- switch (dir) {
- case AUDIO_PLAY: /* output port */
- if (port == M1575_PORT_UNMUTE) {
- port = statep->m1575_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audio1575_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- (void) audio1575_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_LINE_OUT;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audio1575_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= (M1575_INTFCR_PCMOENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
-
- ATRACE("audio1575_set_port() out port", tmp);
- statep->m1575_output_port = tmp;
- if (tmp != port) {
- ATRACE("audio1575_set_port() bad out port", port);
-
- return (AUDIO_FAILURE);
- }
- break;
-
- case AUDIO_RECORD: /* input port */
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
- ATRACE("audio1575_set_port() AUDIO_NONE", NULL);
-
- /* mute the master record input */
- (void) audio1575_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER, CDVR_MUTE);
- }
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_PCMIENB|M1575_INTFCR_MICENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port == AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
-
- /* Enable the MIC input on AC Link Channel 3 */
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= (M1575_INTFCR_PCMIENB);
- intfcr &= ~(M1575_INTFCR_MICISEL|M1575_INTFCR_MICENB |
- M1575_INTFCR_MICI2SEL| M1575_INTFCR_MICI2ENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
- ATRACE("audio1575_set_port() LINE_IN", tmp);
- /* see if we need to update monitor loopback */
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
- /* see if we need to update monitor loopback */
- if (statep->m1575_monitor_gain) {
- reg = AC97_LINE_IN_VOLUME_REGISTER;
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- reg, LIVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
- ATRACE("audio1575_set_port() LPBK", tmp);
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port == AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER, CDVR_MUTE);
- }
- }
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB | M1575_INTFCR_MICISEL);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- default:
- ATRACE("audio1575_set_port bad in port", port);
-
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audio1575_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
-
- if ((port != AUDIO_NONE) &&
- (statep->m1575_codec_shadow[M1575_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audio1575_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->m1575_input_port = port;
- break;
- }
-
- ATRACE("audio1575_set_port() returning", port);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_set_port() */
-
-/*
- * audio1575_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio1575_set_monitor_gain(audio1575_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio1575_set_monitor_gain() entering", statep);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = (((AUDIO_MAX_GAIN - gain) >> M1575_GAIN_SHIFT3) <<
- M1575_BYTE_SHIFT) & PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >> M1575_GAIN_SHIFT3) &
- PCMOVR_RIGHT_GAIN_MASK;
- }
-
- switch (statep->m1575_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- tmp_short |= statep->m1575_codec_shadow[M1575_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audio1575_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audio1575_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audio1575_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are setting the loopback, so done */
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("audio1575_ad_set_config() monitor gain bad device",
- statep->m1575_input_port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->m1575_monitor_gain = 0;
- } else {
- statep->m1575_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE("audio1575_set_monitor_gain() returning", rc);
-
- return (rc);
-
-} /* audio1575_set_monitor_gain() */
-
-/*
- * audio1575_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audio1575_codec_sync(audio1575_state_t *statep)
-{
- int i;
- int j;
- uint32_t casr;
- uint32_t cspsr;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* do the Uli Shuffle ... */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Read the semaphore */
- casr = M1575_AM_GET32(M1575_CASR_REG);
- /* loop till we own the semaphore */
- if ((casr & 1) == 0) {
- for (j = 0; j < M1575_LOOP_CTR; j++) {
- /* Wait for CWRSUCC 0x8 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_SUCC) ==
- M1575_CSPSR_SUCC) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(1);
- }
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_codec_sync() */
-
-/*
- * audio1575_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_and_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if ((audio1575_write_ac97(statep, reg, data &
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)])) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_and_ac97() */
-
-/*
- * audio1575_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_or_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if ((audio1575_write_ac97(statep, reg, data |
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)])) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_or_ac97() */
-
-/*
- * audio1575_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_write_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint32_t cspsr;
- uint16_t tmp;
- int i;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if (audio1575_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- /* write the data to WRITE to the lo word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG, data);
-
- /* write the address to WRITE to the hi word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG+2, reg);
-
- /* wait until command is completed sucessfully */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Wait for Write Ready 0x01 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_WRRDY) == M1575_CSPSR_WRRDY) {
- break;
- }
- drv_usecwait(1);
- }
-
- if (i >= M1575_LOOP_CTR) {
- ATRACE("audio1575_write_ac97() failure", i);
-
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_write_ac97() */
-
-/*
- * audio1575_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audio1575_read_ac97(audio1575_state_t *statep, int reg, uint16_t *data)
-{
- uint32_t cspsr;
- uint16_t addr = 0;
- int i;
-
- ATRACE("audio1575_read_ac97() entering", NULL);
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if ((audio1575_codec_sync(statep)) != AUDIO_SUCCESS) {
- *data = 0xffff;
- ATRACE("audio1575_read_ac97() sync failure", NULL);
-
- return (AUDIO_FAILURE);
- }
-
- /*
- * at this point we has the CASR semaphore
- * and the codec is r/w ready
- * OR in the READ opcode into the address field
- */
-
- addr = (reg | M1575_CPR_READ);
-
- /* write the address to READ to the hi word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG+2, addr);
-
- /* wait until command is completed sucessfully */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Wait for Read Ready 0x02 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_RDRDY) == M1575_CSPSR_RDRDY) {
- break;
- }
- drv_usecwait(1);
- }
-
- if (i >= M1575_LOOP_CTR) {
- *data = 0xffff;
- ATRACE("audio1575_read_ac97() CSPSR NOT READY", cspsr);
-
- return (AUDIO_FAILURE);
- }
-
- /* read back the data and address */
- *data = M1575_AM_GET16(M1575_SPR_REG);
- addr = M1575_AM_GET16(M1575_SPR_REG+2);
-
- if (addr != reg) {
- ATRACE("audio1575_read_ac97() bad read address", addr);
-
- return (AUDIO_FAILURE);
- }
-
- /* store new value in codec shadow register */
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)] = *data;
-
- ATRACE("audio1575_read_ac97() returning successfully", NULL);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_read_ac97() */
-
-/*
- * audio1575_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audio1575_reset_ac97(audio1575_state_t *statep)
-{
- uint16_t tmp;
-
- if (audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &tmp) != AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- if (audio1575_write_ac97(statep, AC97_RESET_REGISTER, 0xffff) !=
- AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- if (audio1575_read_ac97(statep, AC97_RESET_REGISTER, &tmp) !=
- AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_reset_ac97() */
-
-/*
- * audio1575_fill_play_buf()
- *
- * Description:
- * This routine is called by m1575_ad_start_play() and the interrupt
- * handler. It fills playback samples into the DMA memory, sets the
- * BDL entries, and starts the playback DMA engine.
- * the m1575_intr_mutex must be held on entry.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audio1575_fill_play_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- m1575_bd_entry_t *bdesc;
- int samples;
- uint32_t dmacr;
- int rs;
- int bufcount = 0;
- int rc = AUDIO_SUCCESS;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* get the play buffer pointer */
- buf = &statep->m1575_play_buf;
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- /* compute number of samples */
- samples = statep->m1575_psample_rate * statep->m1575_pchannels /
- statep->m1575_ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->tail & M1575_PLAY_BUF_MSK]);
- mutex_exit(&statep->m1575_intr_mutex);
- rs = am_get_audio(statep->m1575_ahandle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->m1575_intr_mutex);
-
- if (((statep->m1575_flags & M1575_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!fill_play_buf() Err:PLAY started and IO started");
- ATRACE("audio1575_fill_play_buf() Err:PLAY STARTED "
- "and IO STARTED", NULL);
-
- return (AUDIO_FAILURE);
- }
- /* no more samples to play */
- if (rs <= 0) {
- if (statep->m1575_flags & M1575_DMA_PLAY_EMPTY) {
- if (bufcount != 0) {
- break;
- }
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->m1575_intr_mutex);
- am_play_shutdown(statep->m1575_ahandle, NULL);
- mutex_enter(&statep->m1575_intr_mutex);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->m1575_flags &
- M1575_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- rc = audio1575_dma_reset(statep,
- M1575_DMA_PCM_OUT);
- if (rc == AUDIO_FAILURE) {
- ATRACE("audio1575_fill_play_buf() "
- "dma_reset failure", rc);
- return (rc);
- }
-
- /* clear the PCM Out ctrl reg */
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->m1575_flags &= ~(M1575_DMA_PLAY_PAUSED |
- M1575_DMA_PLAY_EMPTY);
-
- /* return the value for m1575_ad_start_play() */
- return (AUDIO_FAILURE);
-
- } else {
- /* M1575_DMA_PLAY_EMPTY */
- statep->m1575_flags |= M1575_DMA_PLAY_EMPTY;
- }
- } else {
- /* !M1575_DMA_PLAY_EMPTY */
- statep->m1575_flags &= ~M1575_DMA_PLAY_EMPTY;
- bufcount++;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs << 1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->m1575_bdl_virt_pout[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)rs;
- bdesc->buf_cmd |= IOC;
- M1575_AM_PUT8(M1575_PCMOLVIV_REG, buf->tail);
- buf->tail++;
- buf->tail &= M1575_BD_MSK;
- buf->avail--;
- }
-
- /* start PCM out engine */
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if (buf->avail < M1575_PLAY_BUFS &&
- !(dmacr & M1575_DMACR_PCMOSTART)) {
- dmacr |= M1575_DMACR_PCMOSTART;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- ATRACE("audio1575_fill_play_buf() PLAY DMA STARTED", dmacr);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_fill_play_buf() */
-
-/*
- * audio1575_prepare_record_buf()
- *
- * Description:
- * This routine is called by audio1575_ad_start_record(). It prepares DMA
- * memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- */
-static int
-audio1575_prepare_record_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- m1575_bd_entry_t *bdesc;
- uint32_t dmacr;
- int samples;
-
- /* get the record buf ptr */
- buf = &statep->m1575_record_buf;
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->m1575_csample_rate * statep->m1575_cchannels /
- statep->m1575_ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->m1575_csamples = samples;
-
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->tail & M1575_REC_BUF_MSK];
- bdesc = &(statep->m1575_bdl_virt_pin[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)samples;
- bdesc->buf_cmd |= IOC;
- M1575_AM_PUT8(M1575_PCMILVIV_REG, buf->tail);
- buf->tail++;
- buf->tail &= M1575_BD_MSK;
- buf->avail--;
- }
-
- if (!buf->io_started) {
- buf->io_started = B_TRUE;
- }
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if ((buf->avail < M1575_REC_BUFS) && !(dmacr & M1575_DMACR_PCMISTART)) {
- /* start PCM In engine */
- dmacr |= M1575_DMACR_PCMISTART;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- ATRACE("audio1575_prepare_record_buf() "
- "RECORD DMA STARTED", dmacr);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_prepare_record_buf() */
-
-/*
- * audio1575_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_reclaim_record_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- int16_t pcmiciv;
- int samples;
-
- /* get record buf ptr */
- buf = &statep->m1575_record_buf;
-
- /* get our current index value */
- pcmiciv = M1575_AM_GET8(M1575_PCMICIV_REG);
-
- /* get number of samples */
- samples = statep->m1575_csamples;
-
- /* While we have record buffers to process */
- while ((buf->head != pcmiciv && buf->avail < M1575_REC_BUFS)) {
- chunk = &buf->chunk[buf->head & M1575_REC_BUF_MSK];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- chunk->real_len, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->m1575_intr_mutex);
- am_send_audio(statep->m1575_ahandle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->m1575_intr_mutex);
- buf->avail++;
- buf->head++;
- buf->head &= M1575_BD_MSK;
- if ((statep->m1575_flags & M1575_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-
-} /* audio1575_reclaim_record_buf() */
-
-/*
- * audio1575_pci_enable()
- *
- * Description:
- * This routine Enables all PCI IO and MEMORY accesses
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_pci_enable(audio1575_state_t *statep)
-{
- uint16_t pcics_reg;
-
- ATRACE("audio1575_pci_enable() entering", statep);
-
- pcics_reg = pci_config_get16(statep->m1575_pci_regs_handle,
- PCI_CONF_COMM);
- ATRACE("audio1575_pci_enable() PCICS Reg ", pcics_reg);
- pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
- pci_config_put16(statep->m1575_pci_regs_handle, PCI_CONF_COMM,
- pcics_reg);
-
- ATRACE("audio1575_pci_enable() returning", pcics_reg);
-
-} /* audio1575_pci_enable() */
-
-/*
- * audio1575_pci_disable()
- *
- * Description:
- * This routine Disables all PCI IO and MEMORY accesses
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_pci_disable(audio1575_state_t *statep)
-{
- uint16_t pcics_reg;
-
- ATRACE("audio1575_pci_disable() entering", statep);
-
- pcics_reg = pci_config_get16(statep->m1575_pci_regs_handle,
- PCI_CONF_COMM);
- pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
- pci_config_put16(statep->m1575_pci_regs_handle, PCI_CONF_COMM,
- pcics_reg);
-
- ATRACE("audio1575_pci_disable() returning", pcics_reg);
-
-} /* audio1575_pci_disable() */
-
-/*
- * audio1575_dma_pause()
- *
- * Description:
- * This routine pauses DMA on a particular channel
- * It does not reset andy registers so play/record can be resumed.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA paused successfully
- * AUDIO_FAILURE DMA failed to pause
- */
-static int
-audio1575_dma_pause(audio1575_state_t *statep, int chan)
-{
- uint32_t dmacr;
-
- ATRACE("audio1575_dma_pause() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- dmacr |= M1575_DMACR_PCMIPAUSE;
- break;
-
- case M1575_DMA_PCM_OUT:
- dmacr |= M1575_DMACR_PCMOPAUSE;
- break;
-
- default:
- ATRACE("audio1575_dma_pause() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
-
- ATRACE("audio1575_dma_pause() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_pause() */
-
-/*
- * audio1575_dma_resume()
- *
- * Description:
- * This routine resumes DMA on a particular channel
- * It does not resume if the BDL list is empty.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel
- * PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA resumed successfully
- * AUDIO_FAILURE DMA failed to resume
- */
-static int
-audio1575_dma_resume(audio1575_state_t *statep, int chan)
-{
- uint32_t dmacr;
- uint32_t fifocr1;
-
- ATRACE("audio1575_dma_resume() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- /* ULi says do fifo resets here */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMIRST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr &= ~M1575_DMACR_PCMIPAUSE;
- dmacr |= M1575_DMACR_PCMISTART;
- break;
-
- case M1575_DMA_PCM_OUT:
- dmacr &= ~M1575_DMACR_PCMOPAUSE;
- dmacr |= M1575_DMACR_PCMOSTART;
- break;
- default:
- ATRACE("audio1575_dma_resume() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
-
- ATRACE("audio1575_dma_resume() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_resume() */
-
-/*
- * audio1575_dma reset()
- *
- * Description:
- * This routine resets the DMA on a particular channel
- * All DMA registers are RESET.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA reset successfully
- * AUDIO_FAILURE DMA failed to reset
- */
-static int
-audio1575_dma_reset(audio1575_state_t *statep, int chan)
-{
- uint8_t cr;
- uint32_t fifocr1;
- uint32_t dmacr;
-
- ATRACE("audio1575_dma_reset() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- /* Uli FIFO madness ... */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMIRST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr |= M1575_DMACR_PCMIPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- cr = M1575_AM_GET8(M1575_PCMICR_REG);
- cr |= M1575_PCMICR_RR;
- M1575_AM_PUT8(M1575_PCMICR_REG, cr);
- dmacr &= ~M1575_DMACR_PCMIPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- break;
-
- case M1575_DMA_PCM_OUT:
- /* Uli FIFO madness ... */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMORST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr |= M1575_DMACR_PCMOPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- cr = M1575_AM_GET8(M1575_PCMOCR_REG);
- cr |= M1575_PCMOCR_RR;
- M1575_AM_PUT8(M1575_PCMOCR_REG, cr);
- dmacr &= ~M1575_DMACR_PCMOPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- break;
-
- default:
- ATRACE("audio1575_dma_reset() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio1575_dma_reset() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_reset() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c
deleted file mode 100644
index af340d964d..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c
+++ /dev/null
@@ -1,3020 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audiocs Audio Driver
- *
- * This Audio Driver controls the Crystal CS4231 Codec used on many SPARC
- * platforms. It does not support the CS4231 on Power PCs or x86 PCs. It
- * does support two different DMA engines, the APC and EB2. The code for
- * those DMA engines is split out and a well defined, but private, interface
- * is used to control those DMA engines.
- *
- * For some reason setting the CS4231's registers doesn't always succeed.
- * Therefore every time we set a register we always read it back to make
- * sure it was set. If not we wait a little while and then try again. This
- * is all taken care of in the routines cs4231_put8() and cs4231_reg_select()
- * and the macros OR_SET_BYTE() and AND_SET_BYTE(). We don't worry about
- * the status register because it is cleared by writing anything to it.
- * So it doesn't matter what the value written is.
- *
- * This driver uses the mixer Audio Personality Module to implement audio(7I)
- * and mixer(7I) semantics. Unfortunately this is a single stream Codec,
- * forcing the mixer to do sample rate conversion.
- *
- * This driver supports suspending and resuming. A suspend just stops playing
- * and recording. The play DMA buffers end up getting thrown away, but when
- * you shut down the machine there is a break in the audio anyway, so they
- * won't be missed and it isn't worth the effort to save them. When we resume
- * we always start playing and recording. If they aren't needed they get
- * shut off by the mixer.
- *
- * System power management is supported by this driver. To facilitate
- * this feature the routines audiocs_set_busy() and audiocs_set_idle()
- * are provided.
- * audiocs_set_busy() is called at the beginning of all audiocs_ad_*()
- * entry point routines. It blocks if the driver is being suspended.
- * Once it unblocks it increments a busy count and raises power.
- * Once this busy count is incremented any calls to suspend the driver
- * will block until the count goes back to zero.
- *
- * audiocs_set_idle() is called at the end of all audiocs_ad_*() entry
- * points. It decrements the busy count. Once that count reaches zero
- * it wakes up a sleeping suspend.
- *
- * Component power management is also supported by this driver. As long as
- * the busy count raised by audiocs_set_busy() is non-zero or audio is
- * actively playing or recording power can not be lowered.
- *
- * The ad_start_play()/record() routines call pm_busy_component() so that
- * as long as playing/recording is going on the device won't be powered down.
- * The ad_stop_play()/record() routines call pm_idle_component() so that when
- * the busy count goes to 0 the device will be powered down.
- *
- * NOTE: This module depends on the misc/audiosup and misc/mixer modules
- * being loaded first.
- */
-
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Global routines.
- */
-int cs4231_poll_ready(CS_state_t *);
-
-/*
- * Module linkage routines for the kernel
- */
-static int cs4231_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-static int cs4231_attach(dev_info_t *, ddi_attach_cmd_t);
-static int cs4231_detach(dev_info_t *, ddi_detach_cmd_t);
-static int cs4231_power(dev_info_t *, int, int);
-
-/*
- * Entry point routine prototypes
- */
-static int cs4231_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int cs4231_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int cs4231_ad_start_play(audiohdl_t, int);
-static void cs4231_ad_pause_play(audiohdl_t, int);
-static void cs4231_ad_stop_play(audiohdl_t, int);
-static int cs4231_ad_start_record(audiohdl_t, int);
-static void cs4231_ad_stop_record(audiohdl_t, int);
-
-/* Local Routines */
-static int cs4231_init_state(CS_state_t *, dev_info_t *);
-static int cs4231_chip_init(CS_state_t *);
-static void cs4231_get_ports(CS_state_t *, dev_info_t *);
-static int cs4231_set_port(CS_state_t *, int, int);
-static int cs4231_set_gain(CS_state_t *, int, int, int, int);
-static int cs4231_set_monitor_gain(CS_state_t *, int);
-static int cs4231_set_busy(CS_state_t *);
-static void cs4231_set_idle(CS_state_t *);
-static void cs4231_power_up(CS_state_t *);
-static void cs4231_power_down(CS_state_t *);
-
-/*
- * Global variables, but viewable only by this file.
- */
-
-/* anchor for soft state structures */
-static void *cs_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audiocs_name = CS4231_NAME;
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-static uint_t cs_mixer_srs[] = {
- CS4231_SAMPR5510, CS4231_SAMPR48000, 0
-};
-
-static uint_t cs_compat_srs[] = {
- CS4231_SAMPR5510, CS4231_SAMPR6620, CS4231_SAMPR8000,
- CS4231_SAMPR9600, CS4231_SAMPR11025, CS4231_SAMPR16000,
- CS4231_SAMPR18900, CS4231_SAMPR22050, CS4231_SAMPR27420,
- CS4231_SAMPR32000, CS4231_SAMPR33075, CS4231_SAMPR37800,
- CS4231_SAMPR44100, CS4231_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t cs_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- cs_mixer_srs
-};
-
-static am_ad_sample_rates_t cs_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- cs_compat_srs
-};
-
-static uint_t cs_channels[] = {
- AUDIO_CHANNELS_MONO, AUDIO_CHANNELS_STEREO, 0
-};
-
-static am_ad_cap_comb_t cs_combinations[] = {
- { AUDIO_PRECISION_8, AUDIO_ENCODING_LINEAR },
- { AUDIO_PRECISION_8, AUDIO_ENCODING_ULAW },
- { AUDIO_PRECISION_8, AUDIO_ENCODING_ALAW },
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-static am_ad_entry_t cs_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- cs4231_ad_set_config, /* ad_set_config() */
- cs4231_ad_set_format, /* ad_set_format() */
- cs4231_ad_start_play, /* ad_start_play() */
- cs4231_ad_pause_play, /* ad_pause_play() */
- cs4231_ad_stop_play, /* ad_stop_play() */
- cs4231_ad_start_record, /* ad_start_record() */
- cs4231_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/* play gain array, converts linear gain to 64 steps of log10 gain */
-static uint8_t cs4231_atten[] = {
- 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, /* [000] -> [004] */
- 0x3a, 0x39, 0x38, 0x37, 0x36, /* [005] -> [009] */
- 0x35, 0x34, 0x33, 0x32, 0x31, /* [010] -> [014] */
- 0x30, 0x2f, 0x2e, 0x2d, 0x2c, /* [015] -> [019] */
- 0x2b, 0x2a, 0x29, 0x29, 0x28, /* [020] -> [024] */
- 0x28, 0x27, 0x27, 0x26, 0x26, /* [025] -> [029] */
- 0x25, 0x25, 0x24, 0x24, 0x23, /* [030] -> [034] */
- 0x23, 0x22, 0x22, 0x21, 0x21, /* [035] -> [039] */
- 0x20, 0x20, 0x1f, 0x1f, 0x1f, /* [040] -> [044] */
- 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, /* [045] -> [049] */
- 0x1d, 0x1c, 0x1c, 0x1c, 0x1b, /* [050] -> [054] */
- 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, /* [055] -> [059] */
- 0x1a, 0x19, 0x19, 0x19, 0x19, /* [060] -> [064] */
- 0x18, 0x18, 0x18, 0x18, 0x17, /* [065] -> [069] */
- 0x17, 0x17, 0x17, 0x16, 0x16, /* [070] -> [074] */
- 0x16, 0x16, 0x16, 0x15, 0x15, /* [075] -> [079] */
- 0x15, 0x15, 0x15, 0x14, 0x14, /* [080] -> [084] */
- 0x14, 0x14, 0x14, 0x13, 0x13, /* [085] -> [089] */
- 0x13, 0x13, 0x13, 0x12, 0x12, /* [090] -> [094] */
- 0x12, 0x12, 0x12, 0x12, 0x11, /* [095] -> [099] */
- 0x11, 0x11, 0x11, 0x11, 0x11, /* [100] -> [104] */
- 0x10, 0x10, 0x10, 0x10, 0x10, /* [105] -> [109] */
- 0x10, 0x0f, 0x0f, 0x0f, 0x0f, /* [110] -> [114] */
- 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, /* [114] -> [119] */
- 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, /* [120] -> [124] */
- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, /* [125] -> [129] */
- 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, /* [130] -> [134] */
- 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, /* [135] -> [139] */
- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, /* [140] -> [144] */
- 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, /* [145] -> [149] */
- 0x0a, 0x0a, 0x0a, 0x0a, 0x09, /* [150] -> [154] */
- 0x09, 0x09, 0x09, 0x09, 0x09, /* [155] -> [159] */
- 0x09, 0x09, 0x08, 0x08, 0x08, /* [160] -> [164] */
- 0x08, 0x08, 0x08, 0x08, 0x08, /* [165] -> [169] */
- 0x08, 0x07, 0x07, 0x07, 0x07, /* [170] -> [174] */
- 0x07, 0x07, 0x07, 0x07, 0x07, /* [175] -> [179] */
- 0x06, 0x06, 0x06, 0x06, 0x06, /* [180] -> [184] */
- 0x06, 0x06, 0x06, 0x06, 0x05, /* [185] -> [189] */
- 0x05, 0x05, 0x05, 0x05, 0x05, /* [190] -> [194] */
- 0x05, 0x05, 0x05, 0x05, 0x04, /* [195] -> [199] */
- 0x04, 0x04, 0x04, 0x04, 0x04, /* [200] -> [204] */
- 0x04, 0x04, 0x04, 0x04, 0x03, /* [205] -> [209] */
- 0x03, 0x03, 0x03, 0x03, 0x03, /* [210] -> [214] */
- 0x03, 0x03, 0x03, 0x03, 0x03, /* [215] -> [219] */
- 0x02, 0x02, 0x02, 0x02, 0x02, /* [220] -> [224] */
- 0x02, 0x02, 0x02, 0x02, 0x02, /* [225] -> [229] */
- 0x02, 0x01, 0x01, 0x01, 0x01, /* [230] -> [234] */
- 0x01, 0x01, 0x01, 0x01, 0x01, /* [235] -> [239] */
- 0x01, 0x01, 0x01, 0x00, 0x00, /* [240] -> [244] */
- 0x00, 0x00, 0x00, 0x00, 0x00, /* [245] -> [249] */
- 0x00, 0x00, 0x00, 0x00, 0x00, /* [250] -> [254] */
- 0x00 /* [255] */
-};
-
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info cs4231_modinfo = {
- CS4231_IDNUM, /* module ID number */
- CS4231_NAME, /* module name */
- CS4231_MINPACKET, /* minimum packet size */
- CS4231_MAXPACKET, /* maximum packet size */
- CS4231_HIWATER, /* high water mark */
- CS4231_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit cs4231_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &cs4231_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit cs4231_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &cs4231_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab cs4231_str_info = {
- &cs4231_rqueue, /* read queue */
- &cs4231_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops cs4231_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &cs4231_str_info, /* cb_str */
- D_NEW|D_MP|D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
-
-/* Device operations structure */
-static struct dev_ops cs4231_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- cs4231_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe - not needed */
- cs4231_attach, /* devo_attach */
- cs4231_detach, /* devo_detach */
- nodev, /* devo_reset */
- &cs4231_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- cs4231_power, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv cs4231_modldrv = {
- &mod_driverops, /* drv_modops */
- CS4231_MOD_NAME, /* drv_linkinfo */
- &cs4231_dev_ops /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage cs4231_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&cs4231_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-
-/* ******* Loadable Module Configuration Entry Points ********************* */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audiocs _init()", 0);
-
- /* initialize the soft state */
- if ((error = ddi_soft_state_init(&cs_statep, sizeof (CS_state_t), 0)) !=
- 0) {
- ATRACE("audiocs ddi_soft_state_init() failed", cs_statep);
- return (error);
- }
-
- if ((error = mod_install(&cs4231_modlinkage)) != 0) {
- ddi_soft_state_fini(&cs_statep);
- }
-
- ATRACE("audiocs _init() cs_statep", cs_statep);
- ATRACE_32("audiocs _init() returning", error);
-
- return (error);
-}
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiocs _fini()", cs_statep);
-
- if ((error = mod_remove(&cs4231_modlinkage)) != 0) {
- return (error);
- }
-
- /* free the soft state internal structures */
- ddi_soft_state_fini(&cs_statep);
-
- ATRACE_32("audiocs _fini() returning", error);
-
- return (0);
-}
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns infomation about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audiocs _info()", 0);
-
- error = mod_info(&cs4231_modlinkage, modinfop);
-
- ATRACE_32("audiocs _info() returning", error);
-
- return (error);
-}
-
-
-/* ******* Driver Entry Points ******************************************** */
-/*
- * cs4231_getinfo()
- */
-/*ARGSUSED*/
-static int
-cs4231_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- CS_state_t *state;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(cs_statep,
- instance)) != NULL) {
- *result = state->cs_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
-
-/*
- * cs4231_attach()
- *
- * Description:
- * Attach an instance of the CS4231 driver. This routine does the device
- * dependent attach tasks. When it is complete it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-cs4231_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- CS_state_t *state;
- audiohdl_t ahandle;
- audio_sup_reg_data_t data;
- int instance;
-
- ATRACE("in cs_attach()", dip);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_attach() instance", instance);
- ATRACE("cs_attach() cs_statep", cs_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("cs_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failed",
- audiocs_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == state->cs_dip);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- ahandle = state->cs_ahandle;
-
- /* power up the Codec */
- ASSERT(state->cs_powered == CS4231_PWR_OFF);
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
- if (pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON)
- == DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->cs_dip,
- CS4231_COMPONENT);
- audio_sup_log(ahandle, CE_WARN,
- "!attach() DDI_RESUME failed");
- return (DDI_FAILURE);
- }
- mutex_enter(&state->cs_lock);
-
- ASSERT(mutex_owned(&state->cs_lock));
- ASSERT(state->cs_suspended == CS4231_SUSPENDED);
-
- state->cs_suspended = CS4231_NOT_SUSPENDED;
-
- cv_broadcast(&state->cs_cv); /* let entry points continue */
-
- mutex_exit(&state->cs_lock);
-
- /* now restart playing and recording */
- if (audio_sup_restore_state(ahandle, AUDIO_ALL_DEVICES,
- AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!attach() audio restart failed");
- }
-
- /* we're no longer busy */
- ASSERT(state->cs_powered == CS4231_PWR_ON);
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- ATRACE("cs_attach() DDI_RESUME succeeded", NULL);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (DDI_SUCCESS);
- default:
- audio_sup_log(NULL, CE_NOTE,
- "!%s%d: attach() unknown command 0x%x", audiocs_name,
- instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* allocate the state structure */
- if (ddi_soft_state_zalloc(cs_statep, instance) == DDI_FAILURE) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- /*
- * WARNING: From here on all errors require that we free memory,
- * including the state structure.
- */
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() get soft state failed", audiocs_name,
- instance);
- goto error_mem;
- }
-
- /* call audiosup module registration routine */
- ATRACE("cs_attach() calling audio_sup_register()", NULL);
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((state->cs_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: cs4231_attach() audio_sup_register() failed",
- audiocs_name, instance);
- goto error_mem;
- }
-
- ahandle = state->cs_ahandle;
-
- /* initialize the audio state structures */
- if ((cs4231_init_state(state, dip)) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!attach() init_state() failed");
- goto error_audiosup;
- }
-
- /* initialize the audio chip */
- ATRACE("cs_attach() calling chip_init()", NULL);
- if ((cs4231_chip_init(state)) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN, "!attach() chip_init() failed");
- goto error_destroy;
- }
-
- /* save private state */
- audio_sup_set_private(ahandle, state);
-
- /* call the mixer attach() routine */
- ATRACE("cs_attach() calling am_attach()", &state->cs_ad_info);
- if (am_attach(ahandle, cmd, &state->cs_ad_info) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN, "!attach() am_attach() failed");
- goto error_destroy;
- }
-
- /* set up kernel statistics */
- if ((state->cs_ksp = kstat_create(audiocs_name, instance, audiocs_name,
- "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(state->cs_ksp);
- }
-
- /* we're ready, set up the interrupt handler */
- ATRACE("cs_attach() calling DMA_ADD_INTR()", state);
- if (CS4231_DMA_ADD_INTR(state) != AUDIO_SUCCESS) {
- ATRACE("cs_attach() DMA_ADD_INTR() failed", state);
- goto error_kstat;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ATRACE("cs_attach() returning success", state);
-
- return (DDI_SUCCESS);
-
-error_kstat:
- ATRACE("cs_attach() error_kstat", state);
- if (state->cs_ksp) {
- kstat_delete(state->cs_ksp);
- }
-
- (void) am_detach(ahandle, DDI_DETACH);
-
-error_destroy:
- ATRACE("cs_attach() error_destroy", state);
- CS4231_DMA_UNMAP_REGS(state);
- mutex_destroy(&state->cs_lock);
- cv_destroy(&state->cs_cv);
-
-error_audiosup:
- ATRACE("cs_attach() error_audiosup", state);
- (void) audio_sup_unregister(ahandle);
-
-error_mem:
- ATRACE("cs_attach() error_mem", state);
- ddi_soft_state_free(cs_statep, instance);
-
- ATRACE("cs_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* cs4231_attach() */
-
-/*
- * cs4231_detach()
- *
- * Description:
- * Detach an instance of the CS4231 driver. After the Codec is detached
- * we call am_detach() and audio_sup_unregister() so they may do their
- * work.
- *
- * Power management is pretty simple. If active we fail, otherwise
- * we save the Codec state.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-cs4231_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- CS_state_t *state;
- audiohdl_t ahandle;
- ddi_acc_handle_t handle;
- int instance;
-
- ATRACE_32("in cs_detach()", cmd);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_detach() instance", instance);
- ATRACE("cs_detach() cs_statep", cs_statep);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
- ahandle = state->cs_ahandle;
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("cs_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&state->cs_lock);
-
- ASSERT(state->cs_suspended == CS4231_NOT_SUSPENDED);
- state->cs_suspended = CS4231_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (state->cs_busy_cnt != 0) {
- cv_wait(&state->cs_cv, &state->cs_lock);
- }
-
- if (state->cs_powered == CS4231_PWR_ON) {
- /* stop playing and recording */
- CS4231_DMA_STOP_RECORD(state);
- CS4231_DMA_STOP_PLAY(state);
-
- /* now we can power down the Codec */
- cs4231_power_down(state);
-
- if (audio_sup_save_state(ahandle, AUDIO_ALL_DEVICES,
- AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!detach() audio save failed");
- }
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_detach() SUSPEND successful", state);
- ASSERT(!mutex_owned(&state->cs_lock));
- return (DDI_SUCCESS);
- default:
- ATRACE_32("cs_detach() unknown command failure", cmd);
- audio_sup_log(ahandle, CE_NOTE,
- "!detach() unknown command 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- if (state->cs_powered == CS4231_PWR_ON) {
- /*
- * Make sure the Codec and DMA engine are off.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~(INTC_PEN|INTC_CEN),
- INTC_VALID_MASK);
-
- /* make sure the DMA engine isn't going to do anything */
- CS4231_DMA_RESET(state);
-
- /*
- * power down the device, no reason to waste power without
- * a driver
- */
- (void) pm_lower_power(state->cs_dip, CS4231_COMPONENT,
- CS4231_PWR_OFF);
- }
-
- /*
- * unregister the interrupt. That way we can't get called by and
- * interrupt after the audio framework is removed.
- */
- ATRACE("cs_detach() calling DMA_REM_INTR", state);
- CS4231_DMA_REM_INTR(dip, state);
-
- /*
- * Call the mixer detach routine to tear down the mixer before
- * we lose the hardware.
- */
- ATRACE("cs_detach() calling am_detach()", dip);
- if (am_detach(ahandle, cmd) == AUDIO_FAILURE) {
- ATRACE_32("cs_detach() am_detach() failed", cmd);
- return (DDI_FAILURE);
- }
- ATRACE("cs_detach() calling audio_sup_unregister()", dip);
- if (audio_sup_unregister(ahandle) == AUDIO_FAILURE) {
- ATRACE_32("cs_detach() audio_sup_unregister() failed", cmd);
- return (DDI_FAILURE);
- }
-
- ASSERT(state->cs_busy_cnt == 0);
-
- /* unmap the registers */
- CS4231_DMA_UNMAP_REGS(state);
-
- /* free the kernel statistics structure */
- if (state->cs_ksp) {
- kstat_delete(state->cs_ksp);
- }
- state->cs_ksp = NULL;
-
- /* destroy the state mutex */
- mutex_destroy(&state->cs_lock);
- cv_destroy(&state->cs_cv);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(cs_statep, instance);
-
- ATRACE("cs_detach() returning success", cs_statep);
-
- return (DDI_SUCCESS);
-
-} /* cs4231_detach() */
-
-/*
- * cs4231_power()
- *
- * Description:
- * This routine is used to turn the power to the Codec on and off.
- * The different DMA engines have different ways to turn on/off the
- * power to the Codec. Therefore we call the DMA engine specific code
- * to do the work, if we need to make a change.
- *
- * If the level is CS4231_PWR_OFF then we call cs4231_power_down(). If the
- * level is CS4231_PWR_ON then we call cs4231_power_up().
- *
- * This routine doesn't stop or restart play and record. Other routines
- * are responsible for that.
- *
- * Arguments:
- * def_info_t *dip Ptr to the device's dev_info structure
- * int component Which component to power up/down
- * int level The power level for the component
- *
- * Returns:
- * DDI_SUCCESS Power level changed, we always succeed
- */
-static int
-cs4231_power(dev_info_t *dip, int component, int level)
-{
- CS_state_t *state;
- int instance;
- int rc = DDI_FAILURE;
-
- ATRACE("in cs_power()", dip);
- ATRACE("cs_power() cs_statep", cs_statep);
- ASSERT(component == 0);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_power() instance", instance);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: power() get soft state failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* make sure we have some work to do */
- mutex_enter(&state->cs_lock);
-
- /* check the level change to see what we need to do */
- if (level == CS4231_PWR_OFF && state->cs_powered == CS4231_PWR_ON) {
-
- /* don't power off if we're busy */
- if (state->cs_busy_cnt) {
- /* device is busy, so don't power off */
- mutex_exit(&state->cs_lock);
-
- /* reset the timer */
- (void) pm_idle_component(dip, CS4231_COMPONENT);
-
- ATRACE("cs_power() power off failed, busy",
- state->cs_busy_cnt);
- ASSERT(rc == DDI_FAILURE);
-
- goto done;
- }
- /* power down and save the state */
- cs4231_power_down(state);
-
- } else if (level == CS4231_PWR_ON &&
- state->cs_powered == CS4231_PWR_OFF) {
-
- /* power up */
- cs4231_power_up(state);
-
-#ifdef DEBUG
- } else {
- ATRACE_32("cs_power() no change to make", level);
-#endif
- }
-
- mutex_exit(&state->cs_lock);
-
- rc = DDI_SUCCESS;
-
-done:
- ASSERT(!mutex_owned(&state->cs_lock));
- ATRACE("cs4231_power() done", level);
-
- return (rc);
-
-} /* cs4231_power() */
-
-
-/* ******* Audio Driver Entry Point Routines ******************************* */
-
-/*
- * cs4231_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
-
- ATRACE("in cs_ad_pause_play()", ahandle);
- ATRACE("cs_ad_pause_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!pause_play() set_busy() failed");
- return;
- }
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- ATRACE("cs_ad_pause_play() calling DMA_PAUSE_PLAY()", state);
- CS4231_DMA_PAUSE_PLAY(state);
- ATRACE("cs_ad_pause_play() DMA_PAUSE_PLAY() returned", state);
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs_ad_pause_play() returning", state);
-
-} /* cs4231_ad_pause_play() */
-
-/*
- * cs4231_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set, or the
- * parameter couldn't be set
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_set_config(audiohdl_t ahandle, int stream, int command, int dir,
- int arg1, int arg2)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("in cs_ad_set_config()", command);
- ATRACE_32("cs_ad_set_config() stream", stream);
- ATRACE_32("cs_ad_set_config() command", command);
- ATRACE_32("cs_ad_set_config() dir", dir);
- ATRACE_32("cs_ad_set_config() arg1", arg1);
- ATRACE_32("cs_ad_set_config() arg2", arg2);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!set_config() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /* CAUTION: From here on we must goto done to exit. */
-
- handle = state->cs_handles.cs_codec_hndl;
-
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, on the channel's gain.
- *
- * 0 <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 = left, 1 = right
- */
-
- rc = cs4231_set_gain(state, stream, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of ports, as well as which ports
- * are modifyable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
-
- rc = cs4231_set_port(state, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * 0 <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
-
- rc = cs4231_set_monitor_gain(state, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 = mute, 0 = unmute
- * arg2 --> not used
- */
- mutex_enter(&state->cs_lock);
-
- if (arg1) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LDACO_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, LDACO_LDM,
- LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RDACO_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, RDACO_RDM,
- RDAC0_VALID_MASK);
- state->cs_output_muted = B_TRUE;
- } else { /* Unmute */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LDACO_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LDACO_LDM,
- LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RDACO_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RDACO_RDM,
- RDAC0_VALID_MASK);
- state->cs_output_muted = B_FALSE;
- }
- mutex_exit(&state->cs_lock);
-
- rc = AUDIO_SUCCESS;
- goto done;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- mutex_enter(&state->cs_lock);
- if (arg1) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, LADCI_LMGE,
- LADCI_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, RADCI_RMGE,
- RADCI_VALID_MASK);
- state->cs_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LADCI_LMGE,
- LADCI_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RADCI_RMGE,
- RADCI_VALID_MASK);
- state->cs_ad_info.ad_add_mode &= ~AM_ADD_MODE_MIC_BOOST;
- }
- mutex_exit(&state->cs_lock);
-
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- */
- ATRACE_32("cs_ad_set_config() unsupported command", command);
- goto done;
- }
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE_32("cs4231_ad_set_config() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_ad_set_config() */
-
-/*
- * cs4231_ad_set_format()
- *
- * Description:
- * This routine is used to set a new Codec data format.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 8 or 16
- * int encoding Encoding method, u-law, A-law and linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- uint8_t mask;
- uint8_t value;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("in cs_ad_set_format()", sample_rate);
- ATRACE("cs_ad_set_format() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!set_format() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- if (dir == AUDIO_PLAY) { /* sample rate set on play side only */
- switch (sample_rate) {
- case CS4231_SAMPR5510: value = FS_5510; break;
- case CS4231_SAMPR6620: value = FS_6620; break;
- case CS4231_SAMPR8000: value = FS_8000; break;
- case CS4231_SAMPR9600: value = FS_9600; break;
- case CS4231_SAMPR11025: value = FS_11025; break;
- case CS4231_SAMPR16000: value = FS_16000; break;
- case CS4231_SAMPR18900: value = FS_18900; break;
- case CS4231_SAMPR22050: value = FS_22050; break;
- case CS4231_SAMPR27420: value = FS_27420; break;
- case CS4231_SAMPR32000: value = FS_32000; break;
- case CS4231_SAMPR33075: value = FS_33075; break;
- case CS4231_SAMPR37800: value = FS_37800; break;
- case CS4231_SAMPR44100: value = FS_44100; break;
- case CS4231_SAMPR48000: value = FS_48000; break;
- default:
- ATRACE_32("cs_ad_set_format() bad sample rate",
- sample_rate);
- goto done;
- }
- } else {
- value = 0;
- }
-
- /* if not mono then must be stereo, i.e., the default */
- if (channels == AUDIO_CHANNELS_STEREO) {
- ATRACE_32("cs_ad_set_format() STEREO", channels);
- value |= PDF_STEREO;
- } else if (channels != AUDIO_CHANNELS_MONO) {
- ATRACE_32("cs_ad_set_format() bad # of channels", channels);
- goto done;
-#ifdef DEBUG
- } else {
- ATRACE_32("cs_ad_set_format() MONO", channels);
-#endif
- }
-
- if (precision == AUDIO_PRECISION_8) {
- ATRACE_32("cs_ad_set_format() 8-bit", precision);
- switch (encoding) {
- case AUDIO_ENCODING_ULAW:
- value |= PDF_ULAW8;
- break;
- case AUDIO_ENCODING_ALAW:
- value |= PDF_ALAW8;
- break;
- case AUDIO_ENCODING_LINEAR:
- value |= PDF_LINEAR8;
- break;
- default:
- goto done;
- }
- } else { /* 16 bit, default, and there is only one choice */
- ATRACE_32("cs_ad_set_format() 16-bit", precision);
- if (encoding != AUDIO_ENCODING_LINEAR) {
- goto done;
- }
-
- value |= PDF_LINEAR16BE;
- }
-
- mutex_enter(&state->cs_lock);
- if (dir == AUDIO_PLAY) { /* play side */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- ATRACE_8("cs_ad_set_format() programming FSDF_REG", value);
- state->cs_play_sr = sample_rate;
- state->cs_play_ch = channels;
- state->cs_play_prec = precision;
- state->cs_play_enc = encoding;
- state->cs_save_pe = value;
- mask = FSDF_VALID_MASK;
- } else { /* capture side */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (CDF_REG | IAR_MCE), __LINE__, thisfile);
- ATRACE_8("cs_ad_set_format() programming CDF_REG", value);
- state->cs_record_sr = sample_rate;
- state->cs_record_ch = channels;
- state->cs_record_prec = precision;
- state->cs_record_enc = encoding;
- state->cs_save_ce = value;
- mask = CDF_VALID_MASK;
- }
-
- cs4231_put8(ahandle, handle, &CS4231_IDR, value, mask,
- __LINE__, thisfile);
-
- (void) cs4231_poll_ready(state);
-
- /* clear the mode change bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, FSDF_REG, __LINE__,
- thisfile);
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("cs_ad_set_format() returning", sample_rate);
-
- rc = AUDIO_SUCCESS;
-
-done:
- /* we're no longer busy */
- cs4231_set_idle(state);
-
- ATRACE_32("cs_ad_set_format() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_ad_set_format() */
-
-/*
- * cs4231_ad_start_play()
- *
- * Description:
- * This routine starts the play DMA engine. It checks to make sure the
- * DMA engine is off before it does anything, otherwise it may mess
- * things up.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Audio not restarted, no audio to play
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_start_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc;
-
- ATRACE("in cs_ad_start_play()", ahandle);
- ATRACE("cs_ad_start_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!start_play() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- /* see if we are already playing */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG, __LINE__,
- thisfile);
- if (INTC_PEN & ddi_get8(handle, &CS4231_IDR)) {
- mutex_exit(&state->cs_lock);
- ATRACE("cs_ad_start_play() already playing", NULL);
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- ATRACE("cs_ad_start_play() calling DMA_RESTART_PLAY()", state);
- CS4231_DMA_RESTART_PLAY(state);
- ATRACE_32("cs_ad_start_play() DMA_RESTART_PLAY() returned", 0);
- rc = AUDIO_SUCCESS;
- } else {
- /*
- * The newer versions of the EB2 DMA engine reset on a non-even
- * sample boundary. Then when it restarts it'll be in mid sample
- * which results in loud static. When we start again we reload
- * the format register, which resets the Codec, starting on an
- * even boundary, and thus no static. We end up doing this for
- * the APC DMA engine as well, but it's harmless.
- *
- * CAUTION: Don't do this for record. It causes SunVTS to
- * fail. Also, do not reset the DMA engine if record is
- * active. This occasionally upsets everything.
- */
- if (!(state->cs_flags & RDMA_ENGINE_INITIALIZED)) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- state->cs_save_pe, FSDF_VALID_MASK,
- __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- FSDF_REG, __LINE__, thisfile);
- ATRACE("cs_ad_start_play() play DMA engine reset",
- state);
- }
-
- ATRACE("cs_ad_start_play() calling DMA_START_PLAY()", state);
- rc = CS4231_DMA_START_PLAY(state);
- ATRACE_32("cs_ad_start_play() DMA_START_PLAY() returned", rc);
-
- if (rc == AUDIO_SUCCESS) {
- ATRACE("cs_ad_start_play() programming Codec to play",
- state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- INTC_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_PEN,
- INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_start_play() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
- (void) pm_busy_component(state->cs_dip,
- CS4231_COMPONENT);
- state->cs_flags |= PLAY_ACTIVE;
-#ifdef DEBUG
- } else {
- ATRACE("cs_ad_start_play() Codec not started", rc);
-#endif
- }
-
- }
-
- mutex_exit(&state->cs_lock);
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* cs4231_ad_start_play() */
-
-/*
- * cs4231_ad_stop_play()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("cs_ad_stop_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!stop_play() set_busy() failed");
- return;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- ATRACE_8("cs_ad_stop_play() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- /* stop the play DMA engine */
- ATRACE("cs_ad_stop_play() calling DMA_STOP_PLAY()", state);
- CS4231_DMA_STOP_PLAY(state);
- ATRACE("cs_ad_stop_play() DMA_STOP_PLAY() returned", state);
- /* DMA_STOP() returns with the PEN cleared */
-
- if (state->cs_flags & PLAY_ACTIVE) {
- state->cs_flags &= ~PLAY_ACTIVE;
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
- }
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_stop_play() returning", state);
-
-} /* cs4231_ad_stop_play() */
-
-/*
- * cs4231_ad_start_record()
- *
- * Description:
- * This routine starts the record DMA engine. It checks to make sure the
- * DMA engine is off before it does anything, otherwise it may mess
- * things up.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Recording not successfully started
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_start_record(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc = AUDIO_FAILURE;
-
- ATRACE("cs_ad_start_record() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!start_record() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- /* see if we are already recording */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG, __LINE__,
- thisfile);
- if (INTC_CEN & ddi_get8(handle, &CS4231_IDR)) {
- mutex_exit(&state->cs_lock);
- ATRACE("cs_ad_start_record() already recording", NULL);
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /*
- * Enable record DMA on the Codec, do NOT reprogram the Codec as
- * done for play. This will cause SunVTS to fail.
- */
- ATRACE("cs_ad_start_record() calling DMA_START_RECORD()", state);
- rc = CS4231_DMA_START_RECORD(state);
- ATRACE("cs_ad_start_record() DMA_START_RECORD() returned", rc);
-
- if (rc == AUDIO_SUCCESS) {
- ATRACE("cs_ad_start_record() programming Codec to rec.", state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_CEN, INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_start_record() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
-
-#ifdef DEBUG
- } else {
- ATRACE("cs_ad_start_record() Codec not started", rc);
-#endif
- }
-
- mutex_exit(&state->cs_lock);
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* cs4231_ad_start_record() */
-
-/*
- * cs4231_ad_stop_record()
- *
- * Description:
- * This routine stops the record DMA engine.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("cs_ad_stop_record() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!stop_record() set_busy() failed");
- return;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- /* stop the record DMA engine and clear the active flag */
- ATRACE("cs_ad_stop_record() calling DMA_STOP_RECORD()", state);
- CS4231_DMA_STOP_RECORD(state);
- ATRACE("cs_ad_stop_record() DMA_STOP_RECORD() returned", state);
-
- ATRACE("cs_ad_stop_record() programming Codec to rec.", state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_stop_record() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_stop_record() returning", state);
-
-} /* cs4231_ad_stop_record() */
-
-
-/* ******* Local Routines *************************************************** */
-
-/*
- * cs4231_chip_init()
- *
- * Description:
- * Power up the audio core, initialize the audio Codec, prepare the chip
- * for use.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Chip initialized and ready to use
- * AUDIO_FAILURE Chip not initialized and not ready
- */
-static int
-cs4231_chip_init(CS_state_t *state)
-{
- ddi_acc_handle_t handle;
- audiohdl_t ahandle = state->cs_ahandle;
-
- /* make sure we are powered up */
- mutex_enter(&state->cs_lock);
- CS4231_DMA_POWER(state, CS4231_PWR_ON);
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_attach() calling DMA_RESET()", state);
- CS4231_DMA_RESET(state);
-
- /* no autocalibrate */
- state->cs_autocal = B_FALSE;
-
- /* initialize the Codec */
- handle = state->cs_handles.cs_codec_hndl;
-
- /* activate registers 16 -> 31 */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MID_REG,
- __LINE__, thisfile);
- ddi_put8(handle, &CS4231_IDR, MID_MODE2);
-
- /* now figure out what version we have */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, VID_REG,
- __LINE__, thisfile);
- if (ddi_get8(handle, &CS4231_IDR) & VID_A) {
- ATRACE("cs_attach() revA", state);
- state->cs_revA = B_TRUE;
- } else {
- ATRACE("cs_attach() !revA", state);
- state->cs_revA = B_FALSE;
- }
-
- /* get rid of annoying popping by muting the output channels */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LDACO_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LDACO_LDM | LDACO_MID_GAIN), LDAC0_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RDACO_RDM | RDACO_MID_GAIN), RDAC0_VALID_MASK, __LINE__,
- thisfile);
-
- /* initialize aux input channels to known gain values & muted */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LAUX1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LAUX1_LX1M | LAUX1_UNITY_GAIN), LAUX1_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RAUX1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RAUX1_RX1M | RAUX1_UNITY_GAIN), RAUX1_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LAUX2_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LAUX2_LX2M | LAUX2_UNITY_GAIN), LAUX2_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RAUX2_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RAUX2_RX2M | RAUX2_UNITY_GAIN), RAUX2_VALID_MASK, __LINE__,
- thisfile);
-
- /* initialize aux input channels to known gain values & muted */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LLIC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (LLIC_LLM | LLIC_UNITY_GAIN),
- LLIC_VALID_MASK, __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RLIC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (RLIC_RLM | RLIC_UNITY_GAIN),
- RLIC_VALID_MASK, __LINE__, thisfile);
-
- /* program the sample rate, play and capture must be the same */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (FS_8000 | PDF_ULAW8 | PDF_MONO), FSDF_VALID_MASK,
- __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (CDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (CDF_ULAW8 | CDF_MONO),
- CDF_VALID_MASK, __LINE__, thisfile);
-
- /*
- * Set up the Codec for playback and capture disabled, dual DMA, and
- * playback and capture DMA. Also, set autocal if we are supposed to.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (INTC_REG | IAR_MCE), __LINE__, thisfile);
- if (state->cs_autocal == B_TRUE) {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (INTC_ACAL|INTC_DDC|INTC_PDMA|INTC_CDMA), INTC_VALID_MASK,
- __LINE__, thisfile);
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (INTC_DDC | INTC_PDMA | INTC_CDMA), INTC_VALID_MASK,
- __LINE__, thisfile);
- }
-
- /* turn off the MCE bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LADCI_REG,
- __LINE__, thisfile);
-
- /* wait for the Codec before we continue XXX - do we need this? */
- if (cs4231_poll_ready(state) == AUDIO_FAILURE) {
- ATRACE("cs_attach() poll_ready() #1 failed", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Turn on the output level bit to be 2.8 Vpp. Also, don't go to 0 on
- * underflow.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFE1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, AFE1_OLB, AFE1_VALID_MASK,
- __LINE__, thisfile);
-
- /* turn on the high pass filter if Rev A */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFE2_REG,
- __LINE__, thisfile);
- if (state->cs_revA) {
- cs4231_put8(ahandle, handle, &CS4231_IDR, AFE2_HPF,
- AFE2_VALID_MASK, __LINE__, thisfile);
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR, 0,
- AFE2_VALID_MASK, __LINE__, thisfile);
- }
-
- /* clear the play and capture interrupt flags */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFS_REG,
- __LINE__, thisfile);
- ddi_put8(handle, &CS4231_STATUS, (AFS_RESET_STATUS));
-
- /* the play and record gains will be set by the audio mixer */
-
- /* unmute the output */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LDACO_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LDACO_LDM, LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RDACO_RDM, RDAC0_VALID_MASK);
-
- /* unmute the mono speaker and mute mono in */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MIOC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, MIOC_MIM, MIOC_VALID_MASK,
- __LINE__, thisfile);
-
- /* clear the mode change bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
-
- /* wait for the Codec before we continue XXX - do we need this? */
- if (cs4231_poll_ready(state) == AUDIO_FAILURE) {
- ATRACE("attach() poll_ready() #2 failed", state);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("cs_attach() chip initialized", state);
- return (AUDIO_SUCCESS);
-
-} /* cs4231_chip_init() */
-
-/*
- * audiocs_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure and
- * maps in the registers. This also includes reading the properties.
- *
- * CAUTION: This routine maps the registers and initializes a mutex.
- * Failure cleanup is handled by cs4231_attach(). It is not
- * handled locally by this routine.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-cs4231_init_state(CS_state_t *state, dev_info_t *dip)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- char *prop_str;
- char *pm_comp[] = {
- "NAME=audiocs audio device",
- "0=off",
- "1=on" };
- int cs4231_pints;
- int cs4231_rints;
- size_t cbuf_size;
- size_t pbuf_size;
- int instance;
-
- ATRACE("in cs_init_state()", dip);
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_attach() instance", instance);
-
- /*
- * get the play and record interrupts per second,
- * look for either cs4231_XXXX or XXXX-interrupts.
- */
- if ((cs4231_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_pints", -1)) == -1) {
- cs4231_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", CS4231_INTS);
- }
- ATRACE_32("cs_init_state() play interrupts per sec", cs4231_pints);
-
- if ((cs4231_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_rints", -1)) == -1) {
- cs4231_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", CS4231_INTS);
- }
- ATRACE_32("cs_init_state() record interrupts per sec", cs4231_rints);
-
- if (cs4231_pints < CS4231_MIN_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() play interrupt rate set too low: %d, resetting"
- " to %d", cs4231_pints, CS4231_INTS);
- cs4231_pints = CS4231_INTS;
- } else if (cs4231_pints > CS4231_MAX_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() play interrupt rate set too high: %d, resetting"
- " to %d", cs4231_pints, CS4231_INTS);
- cs4231_pints = CS4231_INTS;
- }
-
- if (cs4231_rints < CS4231_MIN_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() record interrupt rate set too low: %d, resetting"
- " to %d", cs4231_rints, CS4231_INTS);
- cs4231_rints = CS4231_INTS;
- } else if (cs4231_rints > CS4231_MAX_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() record interrupt rate set too high: %d, resetting"
- " to %d", cs4231_rints, CS4231_INTS);
- cs4231_rints = CS4231_INTS;
- }
-
- /*
- * Figure out the largest transfer size for the DMA engine. Then
- * map in the CS4231 and the DMA registers and reset the DMA engine.
- */
- pbuf_size = CS4231_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / cs4231_pints;
- cbuf_size = CS4231_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / cs4231_rints;
-
- /* get the mode from the .conf file */
-
- if ((state->cs_ad_info.ad_mode = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_mode", -1)) == -1) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- state->cs_ad_info.ad_mode = AM_MIXER_MODE;
- } else {
- state->cs_ad_info.ad_mode = AM_COMPAT_MODE;
- }
- }
- ATRACE_32("cs_init_state() setting mode", state->cs_ad_info.ad_mode);
-
- /* set up the pm-components */
- if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
- "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!init_state() couldn't create component");
- return (AUDIO_FAILURE);
- }
-
- /* save the device info pointer */
- state->cs_dip = dip;
-
- /* get the iblock cookie needed for interrupt context */
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &state->cs_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
-
- /* now fill it in, initialize the state mutexs first */
- mutex_init(&state->cs_lock, NULL, MUTEX_DRIVER, state->cs_iblock);
- cv_init(&state->cs_cv, NULL, CV_DRIVER, NULL);
-
- /* fill in the device default state */
- state->cs_defaults.play.sample_rate = CS4231_DEFAULT_SR;
- state->cs_defaults.play.channels = CS4231_DEFAULT_CH;
- state->cs_defaults.play.precision = CS4231_DEFAULT_PREC;
- state->cs_defaults.play.encoding = CS4231_DEFAULT_ENC;
- state->cs_defaults.play.gain = CS4231_DEFAULT_PGAIN;
- state->cs_defaults.play.port = AUDIO_SPEAKER;
- state->cs_defaults.play.buffer_size = CS4231_BSIZE;
- state->cs_defaults.play.balance = CS4231_DEFAULT_BAL;
- state->cs_defaults.record.sample_rate = CS4231_DEFAULT_SR;
- state->cs_defaults.record.channels = CS4231_DEFAULT_CH;
- state->cs_defaults.record.precision = CS4231_DEFAULT_PREC;
- state->cs_defaults.record.encoding = CS4231_DEFAULT_ENC;
- state->cs_defaults.record.gain = CS4231_DEFAULT_PGAIN;
- state->cs_defaults.record.port = AUDIO_MICROPHONE;
- state->cs_defaults.record.buffer_size = CS4231_BSIZE;
- state->cs_defaults.record.balance = CS4231_DEFAULT_BAL;
- state->cs_defaults.monitor_gain = CS4231_DEFAULT_MONITOR_GAIN;
- state->cs_defaults.output_muted = B_FALSE;
- state->cs_defaults.hw_features = AUDIO_HWFEATURE_DUPLEX|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_PLAY|AUDIO_HWFEATURE_RECORD;
- state->cs_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- /* fill in the ad_info structure */
- state->cs_ad_info.ad_int_vers = AM_VERSION;
-
- state->cs_ad_info.ad_add_mode = 0;
- state->cs_ad_info.ad_codec_type = AM_TRAD_CODEC;
- state->cs_ad_info.ad_defaults = &state->cs_defaults;
- state->cs_ad_info.ad_play_comb = cs_combinations;
- state->cs_ad_info.ad_rec_comb = cs_combinations;
- state->cs_ad_info.ad_entry = &cs_entry;
- state->cs_ad_info.ad_dev_info = &state->cs_dev_info;
- state->cs_ad_info.ad_diag_flags = 0;
- state->cs_ad_info.ad_diff_flags = AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- state->cs_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- state->cs_ad_info.ad_misc_flags = AM_MISC_RP_EXCL|AM_MISC_MONO_DUP;
- state->cs_ad_info.ad_translate_flags =
- AM_MISC_8_P_TRANSLATE|AM_MISC_8_R_TRANSLATE;
- state->cs_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- state->cs_ad_info.ad_play.ad_mixer_srs = cs_mixer_sample_rates;
- state->cs_ad_info.ad_play.ad_compat_srs = cs_compat_sample_rates;
- state->cs_ad_info.ad_play.ad_conv = &am_src2;
- state->cs_ad_info.ad_play.ad_sr_info = NULL;
- state->cs_ad_info.ad_play.ad_chs = cs_channels;
- state->cs_ad_info.ad_play.ad_int_rate = cs4231_pints;
- state->cs_ad_info.ad_play.ad_max_chs = CS4231_MAX_CHANNELS;
- state->cs_ad_info.ad_play.ad_bsize = CS4231_BSIZE;
-
- /* record capabilities */
- state->cs_ad_info.ad_record.ad_mixer_srs = cs_mixer_sample_rates;
- state->cs_ad_info.ad_record.ad_compat_srs = cs_compat_sample_rates;
- state->cs_ad_info.ad_record.ad_conv = &am_src2;
- state->cs_ad_info.ad_record.ad_sr_info = NULL;
- state->cs_ad_info.ad_record.ad_chs = cs_channels;
- state->cs_ad_info.ad_record.ad_int_rate = cs4231_rints;
- state->cs_ad_info.ad_record.ad_max_chs = CS4231_MAX_CHANNELS;
- state->cs_ad_info.ad_record.ad_bsize = CS4231_BSIZE;
-
- /* figure out which DMA engine hardware we have */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "dma-model", &prop_str) == DDI_PROP_SUCCESS) {
- if (strcmp(prop_str, "eb2dma") == 0) {
- ATRACE("cs_attach() eb2dma", state);
- state->cs_dma_engine = EB2_DMA;
- state->cs_dma_ops = &cs4231_eb2dma_ops;
- } else {
- ATRACE("cs_attach() apcdma", state);
- state->cs_dma_engine = APC_DMA;
- state->cs_dma_ops = &cs4231_apcdma_ops;
- }
- ddi_prop_free(prop_str);
- } else {
- ATRACE("cs_attach() no prop apcdma", state);
- state->cs_dma_engine = APC_DMA;
- state->cs_dma_ops = &cs4231_apcdma_ops;
- }
-
- /* cs_regs, cs_eb2_regs and cs_handles filled in later */
-
- (void) strcpy(&state->cs_dev_info.name[0], CS_DEV_NAME);
- /* always set to onboard1, not really correct, but very high runner */
- (void) strcpy(&state->cs_dev_info.config[0], CS_DEV_CONFIG_ONBRD1);
- /* version filled in below */
-
- /* most of what's left is filled in when the registers are mapped */
-
- ATRACE("cs_init_state() calling get_ports()", state);
- cs4231_get_ports(state, dip);
-
- /* Map in the registers */
- if (CS4231_DMA_MAP_REGS(dip, state, pbuf_size, cbuf_size) ==
- AUDIO_FAILURE) {
- goto error_regs;
- }
-
- state->cs_instance = ddi_get_instance(dip);
- state->cs_suspended = CS4231_NOT_SUSPENDED;
- state->cs_powered = CS4231_PWR_OFF;
- state->cs_busy_cnt = 0;
-
- return (AUDIO_SUCCESS);
-
-error_regs:
- ATRACE("cs_init_state() error_regs", state);
- mutex_destroy(&state->cs_lock);
-
- ATRACE("cs_init_state() returning failure", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* cs4231_init_state */
-
-/*
- * cs4231_get_ports()
- *
- * Description:
- * Get which audiocs h/w version we have and use this to
- * determine the input and output ports as well whether or not
- * the hardware has internal loopbacks or not. We also have three
- * different ways for the properties to be specified, which we
- * also need to worry about.
- *
- * Vers Platform(s) DMA eng. audio-module** loopback
- * a SS-4+/SS-5+ apcdma no no
- * b Ultra-1&2 apcdma no yes
- * c positron apcdma no yes
- * d PPC - retired
- * e x86 - retired
- * f tazmo eb2dma Perigee no
- * g tazmo eb2dma Quark yes
- * h darwin+ eb2dma no N/A
- *
- * Vers model~ aux1* aux2*
- * a N/A N/A N/A
- * b N/A N/A N/A
- * c N/A N/A N/A
- * d retired
- * e retired
- * f SUNW,CS4231f N/A N/A
- * g SUNW,CS4231g N/A N/A
- * h SUNW,CS4231h cdrom none
- *
- * * = Replaces internal-loopback for latest property type, can be
- * set to "cdrom", "loopback", or "none".
- *
- * ** = For plugin audio modules only. Starting with darwin, this
- * property is replaces by the model property.
- *
- * ~ = Replaces audio-module.
- *
- * + = Has the capability of having a cable run from the internal
- * CD-ROM to the audio device.
- *
- * N/A = Not applicable, the property wasn't created for early
- * platforms, or the property has been retired.
- *
- * NOTE: Older tazmo and quark machines don't have the model property.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * void
- */
-static void
-cs4231_get_ports(CS_state_t *state, dev_info_t *dip)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- char *prop_str;
-
- ATRACE("Beginning cs4231_get_ports()", NULL);
-
- /* First we set the common ports, etc. */
- state->cs_defaults.play.avail_ports =
- AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT;
- state->cs_defaults.play.mod_ports =
- AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT;
- state->cs_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->cs_defaults.record.mod_ports |=
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->cs_cd_input_line = NO_INTERNAL_CD;
-
- /* now we try the new "model" property */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "model", &prop_str) == DDI_PROP_SUCCESS) {
- if (strcmp(prop_str, "SUNW,CS4231h") == 0) {
- /* darwin */
- ATRACE("cs_attach() NEW - darwin", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_H);
- state->cs_defaults.record.avail_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_defaults.play.mod_ports =
- AUDIO_SPEAKER;
- state->cs_defaults.record.avail_ports |= AUDIO_CD;
- state->cs_defaults.record.mod_ports |= AUDIO_CD;
- state->cs_cd_input_line = INTERNAL_CD_ON_AUX1;
- } else if (strcmp(prop_str, "SUNW,CS4231g") == 0) {
- /* quark audio module */
- ATRACE("cs_attach() NEW - quark", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_G);
- state->cs_defaults.record.avail_ports |= AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |= AUDIO_SUNVTS;
- } else if (strcmp(prop_str, "SUNW,CS4231f") == 0) {
- /* tazmo */
- ATRACE("cs_attach() NEW - tazmo", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_F);
- } else {
- ATRACE("cs_attach() NEW - unknown", state);
- (void) strcpy(&state->cs_dev_info.version[0], "?");
- audio_sup_log(ahandle, CE_NOTE,
- "!attach() unknown audio model: %s, some parts of "
- "audio may not work correctly",
- (prop_str ? prop_str : "unknown"));
- }
- ddi_prop_free(prop_str); /* done with the property */
- } else { /* now try the older "audio-module" property */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "audio-module", &prop_str) ==
- DDI_PROP_SUCCESS) {
- switch (*prop_str) {
- case 'Q': /* quark audio module */
- ATRACE("cs_attach() OLD - quark", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_G);
- state->cs_defaults.record.avail_ports |=
- AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |=
- AUDIO_SUNVTS;
- break;
- case 'P': /* tazmo */
- ATRACE("cs_attach() OLD - tazmo", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_F);
- break;
- default:
- ATRACE("cs_attach() OLD - unknown", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- "?");
- audio_sup_log(ahandle, CE_NOTE,
- "!attach() unknown audio module: %s, some "
- "parts of audio may not work correctly",
- (prop_str ? prop_str : "unknown"));
- break;
- }
- ddi_prop_free(prop_str); /* done with the prop */
- } else { /* now try heuristics, ;-( */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "internal-loopback", B_FALSE)) {
- if (state->cs_dma_engine == EB2_DMA) {
- ATRACE("cs_attach() OLD - C", state);
- (void) strcpy(
- &state->cs_dev_info.version[0],
- CS_DEV_VERSION_C);
- } else {
- ATRACE("cs_attach() OLD - B", state);
- (void) strcpy(
- &state->cs_dev_info.version[0],
- CS_DEV_VERSION_B);
- }
- state->cs_defaults.record.avail_ports |=
- AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |=
- AUDIO_SUNVTS;
- } else {
- ATRACE("cs_attach() ANCIENT - A", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_A);
- state->cs_defaults.record.avail_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_defaults.record.mod_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_cd_input_line = INTERNAL_CD_ON_AUX1;
- }
- }
- }
-
- ATRACE("Finished in cs4231_get_ports()", NULL);
-
-} /* cs4231_get_ports() */
-
-/*
- * cs4231_power_up()
- *
- * Description:
- * Power up the Codec and restore the codec's registers.
- *
- * NOTE: Like the audiots driver, we don't worry about locking since
- * the only routines that may call us are attach() and power()
- * Both of which should be the only threads in the driver.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_power_up(CS_state_t *state)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- int i;
-
- ASSERT(mutex_owned(&state->cs_lock));
- ATRACE("in cs4231_power_up()", NULL);
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* turn on the Codec */
- CS4231_DMA_POWER(state, CS4231_PWR_ON);
-
- /* reset the DMA engine(s) */
- CS4231_DMA_RESET(state);
-
- /*
- * Reload the Codec's registers, the DMA engines will be
- * taken care of when play and record start up again. But
- * first enable registers 16 -> 31.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MID_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, state->cs_save[MID_REG],
- MID_VALID_MASK, __LINE__, thisfile);
-
- for (i = 0; i < CS4231_REGS; i++) {
- /* restore Codec registers */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (i | IAR_MCE), __LINE__, thisfile);
- ddi_put8(handle, &CS4231_IDR, state->cs_save[i]);
- drv_usecwait(500); /* chip bug */
- }
- /* clear MCE bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, 0, __LINE__,
- thisfile);
-
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- ATRACE("cs_power() power up successful", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
-} /* cs4231_power_up() */
-
-/*
- * cs4231_power_down()
- *
- * Description:
- * Power down the Codec and save the codec's registers.
- *
- * NOTE: See the note in cs4231_power_up() about locking.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_power_down(CS_state_t *state)
-{
- ddi_acc_handle_t handle;
- int i;
-
- ASSERT(mutex_owned(&state->cs_lock));
- ATRACE("in cs4231_power_down()", NULL);
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /*
- * We are powering down, so we don't need to do a thing with
- * the DMA engines. However, we do need to save the Codec
- * registers.
- */
-
- for (i = 0; i < CS4231_REGS; i++) {
- /* save Codec regs */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, i,
- __LINE__, thisfile);
- state->cs_save[i] = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* turn off the Codec */
- CS4231_DMA_POWER(state, CS4231_PWR_OFF);
-
- ASSERT(state->cs_powered == CS4231_PWR_OFF);
-
- ATRACE("cs_power() power down successful", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
-} /* cs4231_power_down() */
-
-/*
- * cs4231_set_gain()
- *
- * Description:
- * Set the play or record gain.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int gain The gain to set
- * int channels Number of channels, 1 or 2
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-cs4231_set_gain(CS_state_t *state, int stream, int dir, int gain,
- int channel)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- uint8_t tmp_value;
- int rc = AUDIO_FAILURE;
-
- ATRACE("in cs_set_gain()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (dir == AUDIO_PLAY) { /* play gain */
- mutex_enter(&state->cs_lock);
- if (channel == 0) { /* left channel */
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, LDACO_REG, __LINE__, thisfile);
- } else { /* right channel */
- ASSERT(channel == 1);
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, RDACO_REG, __LINE__, thisfile);
- }
- /* NOTE: LDAC0_VALID_MASK == RDAC0_VALID_MASK, so either ok */
-
- /* we use cs4231_atten[] to linearize attenuation */
- if (state->cs_output_muted || gain == 0) {
- /* mute the output */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (cs4231_atten[gain]|LDACO_LDM), LDAC0_VALID_MASK,
- __LINE__, thisfile);
- /* NOTE: LDACO_LDM == RDACO_LDM, so either ok */
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- cs4231_atten[gain], LDAC0_VALID_MASK,
- __LINE__, thisfile);
- ATRACE("cs_set_gain() play gain set",
- cs4231_atten[gain]);
-
- }
- rc = AUDIO_SUCCESS;
- mutex_exit(&state->cs_lock);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- mutex_enter(&state->cs_lock);
- if (channel == 0) { /* left channel */
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, LADCI_REG, __LINE__, thisfile);
- tmp_value = ddi_get8(handle, &CS4231_IDR) &
- ~LADCI_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, RADCI_REG, __LINE__, thisfile);
- tmp_value = ddi_get8(handle, &CS4231_IDR) &
- ~RADCI_GAIN_MASK;
- }
- /* NOTE: LADCI_VALID_MASK == RADCI_VALID_MASK, so either ok */
-
- /* we shift right by 4 to go from 8-bit to 4-bit gain */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (tmp_value|(gain >> 4)), LADCI_VALID_MASK,
- __LINE__, thisfile);
- ATRACE("cs_set_gain() record gain set",
- (tmp_value|(gain >> 4)));
- rc = AUDIO_SUCCESS;
- mutex_exit(&state->cs_lock);
- }
-
- ATRACE("cs_set_gain() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_gain() */
-
-/*
- * cs4231_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int port The port to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-cs4231_set_port(CS_state_t *state, int dir, int port)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- uint8_t tmp_value;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in cs_set_port()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
-
- if (dir == AUDIO_PLAY) { /* output port(s) */
- /* figure out which output port(s) to turn on */
- tmp_value = 0;
-
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- MIOC_REG, __LINE__, thisfile);
- if (port & AUDIO_SPEAKER) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~MIOC_MONO_SPKR_MUTE,
- MIOC_VALID_MASK);
- tmp_value |= AUDIO_SPEAKER;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, MIOC_MONO_SPKR_MUTE,
- MIOC_VALID_MASK);
- }
-
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- PC_REG, __LINE__, thisfile);
- if (port & AUDIO_HEADPHONE) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~PC_HEADPHONE_MUTE,
- PC_VALID_MASK);
- tmp_value |= AUDIO_HEADPHONE;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, PC_HEADPHONE_MUTE,
- PC_VALID_MASK);
- }
-
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- PC_REG, __LINE__, thisfile);
- if (port & AUDIO_LINE_OUT) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~PC_LINE_OUT_MUTE,
- PC_VALID_MASK);
- tmp_value |= AUDIO_LINE_OUT;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, PC_LINE_OUT_MUTE,
- PC_VALID_MASK);
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("cs_ad_set_config() set out port", tmp_value);
-
- if (tmp_value != (port & 0x0ff)) {
- ATRACE_32("cs_ad_set_config() bad out port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- /*
- * Figure out which input port to set. Fortunately
- * the left and right port bit patterns are the same.
- */
- switch (port) {
- case AUDIO_NONE:
- tmp_value = 0;
- break;
- case AUDIO_MICROPHONE:
- tmp_value = LADCI_LMIC;
- break;
- case AUDIO_LINE_IN:
- tmp_value = LADCI_LLINE;
- break;
- case AUDIO_CD:
- tmp_value = LADCI_LAUX1;
- break;
- case AUDIO_CODEC_LOOPB_IN:
- tmp_value = LADCI_LLOOP;
- break;
- case AUDIO_SUNVTS:
- tmp_value = LADCI_LAUX1;
- break;
- default:
- /* unknown or inclusive input ports */
- ATRACE_32("cs_ad_set_config() bad in port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (ddi_get8(handle, &CS4231_IDR) & ~LADCI_IN_MASK)|tmp_value,
- LADCI_VALID_MASK, __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (ddi_get8(handle, &CS4231_IDR) & ~RADCI_IN_MASK)|tmp_value,
- RADCI_VALID_MASK, __LINE__, thisfile);
- mutex_exit(&state->cs_lock);
- }
-
-done:
- ATRACE("cs_set_port() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_port() */
-
-/*
- * cs4231_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-cs4231_set_monitor_gain(CS_state_t *state, int gain)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in cs_set_monitor gain()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LC_REG,
- __LINE__, thisfile);
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- cs4231_put8(ahandle, handle, &CS4231_IDR, LC_OFF,
- LC_VALID_MASK, __LINE__, thisfile);
- } else {
- /* we use cs4231_atten[] to linearize attenuation */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- ((cs4231_atten[gain] << 2) | LC_LBE), LC_VALID_MASK,
- __LINE__, thisfile);
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_set_monitor_gain() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_monitor_gain() */
-
-/*
- * cs4231_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended or the power removed by the power
- * manager. It will also block any routine while a suspend is
- * going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Set busy and powered up
- * AUDIO_FAILURE Couldn't power up, so not busy
- */
-static int
-cs4231_set_busy(CS_state_t *state)
-{
- ATRACE("in cs4231_set_busy()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->cs_lock);
-
- /* block if we are going to be suspended */
- while (state->cs_suspended == CS4231_SUSPENDED) {
- cv_wait(&state->cs_cv, &state->cs_lock);
- }
-
- /*
- * Okay, we aren't going to be suspended yet, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(state->cs_busy_cnt >= 0);
- state->cs_busy_cnt++;
-
- /* now can release the lock before we raise the power */
- mutex_exit(&state->cs_lock);
-
- /*
- * Mark as busy before we ask for power to be raised. This removes
- * the race condtion between the call to cs4231_power() and our call
- * to raise power. After we raise power we immediately mark as idle
- * so the count is still good.
- */
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
- if (pm_raise_power(state->cs_dip, CS4231_COMPONENT, CS4231_PWR_ON) ==
- DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!%s%d:set_busy() power up failed",
- audiocs_name, state->cs_instance);
-
- mutex_enter(&state->cs_lock);
- state->cs_busy_cnt--; /* restore busy count */
- if (state->cs_busy_cnt == 0) {
- /* let DDI_SUSPEND continue */
- cv_broadcast(&state->cs_cv);
- }
- mutex_exit(&state->cs_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* power is up and we are marked as busy, so we are done */
-
- ATRACE("audiocs_set_busy() done", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* cs4231_set_busy() */
-
-/*
- * cs4231_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * It ends by resetting the power management timer.
- *
- * We don't do anything with power because the routine that is no longer
- * busy either doesn't need the hardware, or we are playing or recording
- * so the power won't come down anyway.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_set_idle(CS_state_t *state)
-{
- ATRACE("in cs4231_set_idle()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->cs_lock);
-
- ASSERT(state->cs_suspended == CS4231_NOT_SUSPENDED);
-
- /* decrement the busy count */
- state->cs_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (state->cs_busy_cnt == 0) {
- cv_broadcast(&state->cs_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&state->cs_lock);
-
- /* reset the timer */
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- ATRACE("cs4231_set_idle() done", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
-} /* cs4231_set_idle() */
-
-
-/* ******* Global Local Routines ******************************************* */
-
-/*
- * cs4231_poll_ready()
- *
- * Description:
- * This routine waits for the Codec to complete its initialization
- * sequence and is done with its autocalibration.
- *
- * Early versions of the Codec have a bug that can take as long as
- * 15 seconds to complete its initialization. For these cases we
- * use a timeout mechanism so we don't keep the machine locked up.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The Codec is ready to continue
- * AUDIO_FAILURE The Codec isn't ready to continue
- */
-int
-cs4231_poll_ready(CS_state_t *state)
-{
- ddi_acc_handle_t handle = state->cs_handles.cs_codec_hndl;
- int x = 0;
- uint8_t iar;
- uint8_t idr;
-
- ATRACE("in cs_poll_ready()", state);
-
- ASSERT(state->cs_regs != NULL);
- ASSERT(handle != NULL);
-
- /* wait for the chip to initialize itself */
- iar = ddi_get8(handle, &CS4231_IAR);
-
- while ((iar & IAR_INIT) && x++ < CS4231_TIMEOUT) {
- drv_usecwait(50);
- iar = ddi_get8(handle, &CS4231_IAR);
- }
-
- if (x >= CS4231_TIMEOUT) {
- ATRACE("cs_poll_ready() timeout #1", state);
- return (AUDIO_FAILURE);
- }
-
- x = 0;
-
- /*
- * Now wait for the chip to complete its autocalibration.
- * Set the test register.
- */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
-
- idr = ddi_get8(handle, &CS4231_IDR);
-
- while ((idr & ESI_ACI) && x++ < CS4231_TIMEOUT) {
- drv_usecwait(50);
- idr = ddi_get8(handle, &CS4231_IDR);
- }
-
- if (x >= CS4231_TIMEOUT) {
- ATRACE("cs_poll_ready() timeout #2", state);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("cs_poll_ready() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* cs4231_poll_ready() */
-
-/*
- * cs4231_reg_select()
- *
- * Description:
- * Select a cs4231 register. The cs4231 has a hardware bug where a
- * register is not always selected the first time. We try and try
- * again until the proper register is selected or we time out and
- * print an error message.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * ddi_acc_handle_t handle A handle to the device's registers
- * uint8_t addr The register address to program
- * int reg The register to select
- * int line The line number where this function was
- * called
- * char * *thefile The name of the c file that called this
- * function
- *
- * Returns:
- * void
- */
-void
-cs4231_reg_select(audiohdl_t ahandle, ddi_acc_handle_t handle, uint8_t *addr,
- uint8_t reg, int line, char *thefile)
-{
- int x;
- uint8_t T;
-
- for (x = 0; x < CS4231_RETRIES; x++) {
- ddi_put8(handle, addr, reg);
- T = ddi_get8(handle, addr);
- if (T == reg) {
- break;
- }
- drv_usecwait(1000);
- }
-
- if (x == CS4231_RETRIES) {
- audio_sup_log(ahandle, CE_NOTE,
- "!Couldn't select register (%s, Line #%d 0x%02x 0x%02x)",
- thefile, line, T, reg);
- audio_sup_log(ahandle, CE_CONT,
- "!audio may not work correctly until it is stopped and "
- "restarted\n");
- }
-
-} /* cs4231_reg_select() */
-
-/*
- * cs4231_put8()
- *
- * Description:
- * Program a cs4231 register. The cs4231 has a hardware bug where a
- * register is not programmed properly the first time. We program a value,
- * then immediately read back the value and reprogram if nescessary.
- * We do this until the register is properly programmed or we time out and
- * print an error message.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * ddi_acc_handle_t handle A handle to the device's registers
- * uint8_t addr The register address to program
- * uint8_t mask Mask to not set reserved register bits
- * int val The value to program
- * int line The line number where this function was
- * called
- * char * *thefile The name of the c file that called this
- * function
- *
- * Returns:
- * void
- */
-void
-cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t handle, uint8_t *addr,
- uint8_t val, uint8_t mask, int line, char *thefile)
-{
- int x;
- uint8_t T;
-
- val &= mask;
-
- for (x = 0; x < CS4231_RETRIES; x++) {
- ddi_put8(handle, addr, val);
- T = ddi_get8(handle, addr);
- if (T == val) {
- break;
- }
- drv_usecwait(1000);
- }
-
- if (x == CS4231_RETRIES) {
- audio_sup_log(ahandle, CE_NOTE,
- "!Couldn't set value (%s, Line #%d 0x%02x 0x%02x)",
- thefile, line, T, val);
- audio_sup_log(ahandle, CE_CONT,
- "!audio may not work correctly until it is stopped and "
- "restarted\n");
- }
-
-} /* cs4231_put8() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c
deleted file mode 100644
index 6f55c57d35..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c
+++ /dev/null
@@ -1,1332 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * Platform specifc code for the APC DMA controller. The APC is an SBus
- * IC that includes play and record DMA engines and an interface for
- * the CS4231.
- */
-
-#include <sys/systm.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Attribute structure for the APC, used to create DMA handles.
- */
-static ddi_dma_attr_t apc_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000000fffLL, /* DMA counter register */
- 0x0000000000000001LL, /* DMA address alignment */
- 0x00000014, /* 4 and 16 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x0000000000000fffLL, /* maximum transfer size, 8k */
- 0x000000000000ffffLL, /* segment boundary, 32k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_BE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * Local routines
- */
-static uint_t apc_intr(caddr_t);
-static int apc_program_play(CS_state_t *, int, caddr_t *, int);
-
-/*
- * DMA ops vector functions
- */
-static int apc_map_regs(dev_info_t *, CS_state_t *, size_t, size_t);
-static void apc_unmap_regs(CS_state_t *);
-static void apc_reset(CS_state_t *);
-static int apc_add_intr(CS_state_t *);
-static void apc_rem_intr(dev_info_t *);
-static int apc_p_start(CS_state_t *);
-static void apc_p_pause(CS_state_t *);
-static void apc_p_restart(CS_state_t *);
-static void apc_p_stop(CS_state_t *);
-static int apc_r_start(CS_state_t *);
-static void apc_r_stop(CS_state_t *);
-static void apc_power(CS_state_t *, int);
-
-cs4231_dma_ops_t cs4231_apcdma_ops = {
- "APC DMA controller",
- apc_map_regs,
- apc_unmap_regs,
- apc_reset,
- apc_add_intr,
- apc_rem_intr,
- apc_p_start,
- apc_p_pause,
- apc_p_restart,
- apc_p_stop,
- apc_r_start,
- apc_r_stop,
- apc_power
-};
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-/*
- * apc_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * CS_state_t *state The device's state structure
- * size_t pbuf_size The size of the play DMA buffers to
- * allocate, we need two
- * size_t cbuf_size The size of the capture DMA buffers to
- * allocate, we need two
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-apc_map_regs(dev_info_t *dip, CS_state_t *state, size_t pbuf_size,
- size_t cbuf_size)
-{
- ddi_acc_handle_t *handle = &APC_HANDLE;
- uint_t dma_cookie_count;
- int rc;
-
- ATRACE("in apc_map_regs()", state);
-
- /* allocate two handles for play and two for record */
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(0) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(1) failed: %d", rc);
- goto error_ph0;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(2) failed: %d", rc);
- goto error_ph1;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(3) failed: %d", rc);
- goto error_rh0;
- }
-
- /* allocate the four DMA buffers, two for play and two for record */
- if (ddi_dma_mem_alloc(state->cs_ph[0], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[0], &state->cs_pml[0],
- &state->cs_pmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(0) failed");
- goto error_rh1;
- }
- if (ddi_dma_mem_alloc(state->cs_ph[1], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[1], &state->cs_pml[1],
- &state->cs_pmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(1) failed");
- goto error_pb0;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[0], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[0], &state->cs_cml[0],
- &state->cs_cmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(2) failed");
- goto error_pb1;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[1], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[1], &state->cs_cml[1],
- &state->cs_cmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(3) failed");
- goto error_rb0;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[0], (struct as *)0,
- state->cs_pb[0], state->cs_pml[0], DDI_DMA_WRITE,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_pc[0],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(0) failed: %d",
- rc);
- goto error_rb1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[1], (struct as *)0,
- state->cs_pb[1], state->cs_pml[1], DDI_DMA_WRITE,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_pc[1],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(1) failed: %d",
- rc);
- goto error_pc0;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[0], (struct as *)0,
- state->cs_cb[0], state->cs_cml[0], DDI_DMA_READ,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_cc[0],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(2) failed: %d",
- rc);
- goto error_pc1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[1], (struct as *)0,
- state->cs_cb[1], state->cs_cml[1], DDI_DMA_READ,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_cc[1],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(3) failed: %d",
- rc);
- goto error_rc0;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* map in the registers, getting a handle */
- if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
- sizeof (cs4231_regs_t), &acc_attr, handle) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_rc1;
- }
-
- /* clear the CSR so we have all interrupts disabled */
- ddi_put32(*handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
-
- /* let the state structure know about the attributes */
- state->cs_dma_attr = &apc_attr;
-
- /* we start with play and record buffers 0 */
- state->cs_pbuf_toggle = 0;
- state->cs_cbuf_toggle = 0;
-
- ATRACE("apc_map_regs() returning success", state);
-
- return (AUDIO_SUCCESS);
-
-error_rc1:
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-error_rc0:
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
-error_pc1:
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
-error_pc0:
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
-error_rb1:
- ddi_dma_mem_free(&state->cs_cmh[1]);
-error_rb0:
- ddi_dma_mem_free(&state->cs_cmh[0]);
-error_pb1:
- ddi_dma_mem_free(&state->cs_pmh[1]);
-error_pb0:
- ddi_dma_mem_free(&state->cs_pmh[0]);
-error_rh1:
- ddi_dma_free_handle(&state->cs_ch[1]);
-error_rh0:
- ddi_dma_free_handle(&state->cs_ch[0]);
-error_ph1:
- ddi_dma_free_handle(&state->cs_ph[1]);
-error_ph0:
- ddi_dma_free_handle(&state->cs_ph[0]);
-error:
- ATRACE("apc_map_regs() returning failure", state);
-
- return (AUDIO_FAILURE);
-
-} /* apc_map_regs() */
-
-/*
- * apc_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocated the DMA handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_unmap_regs(CS_state_t *state)
-{
- ATRACE("in apc_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-
- ddi_dma_mem_free(&state->cs_pmh[0]);
- ddi_dma_mem_free(&state->cs_pmh[1]);
- ddi_dma_mem_free(&state->cs_cmh[0]);
- ddi_dma_mem_free(&state->cs_cmh[1]);
-
- ddi_dma_free_handle(&state->cs_ph[0]);
- ddi_dma_free_handle(&state->cs_ph[1]);
- ddi_dma_free_handle(&state->cs_ch[0]);
- ddi_dma_free_handle(&state->cs_ch[1]);
-
- ddi_regs_map_free(&APC_HANDLE);
-
- ATRACE("apc_unmap_regs() returning", state);
-
-} /* apc_unmap_regs() */
-
-/*
- * apc_reset()
- *
- * Description:
- * Reset both the play and record DMA engines. The engines are left
- * with interrupts and the DMA engine disabled.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo structure
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_reset(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_reset()", state);
-
- /*
- * The APC has a bug where the reset is not done
- * until you do the next pio to the APC. This
- * next write to the CSR causes the posted reset to
- * happen.
- */
-
- ddi_put32(handle, &APC_DMACSR, APC_RESET);
- ddi_put32(handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
-
- ATRACE("apc_reset() returning", state);
-
-} /* apc_reset() */
-
-/*
- * apc_add_intr()
- *
- * Description:
- * Register the APC interrupts with the kernel.
- *
- * NOTE: This does NOT turn on interrupts.
- *
- * CAUTION: While the interrupts are added, the Codec interrupts are
- * not enabled.
- *
- * Arguments:
- * CS_state_t *state Pointer to the device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-apc_add_intr(CS_state_t *state)
-{
- dev_info_t *dip = state->cs_dip;
-
- ATRACE("in apc_add_intr()", state);
-
- /* first we make sure this isn't a high level interrupt */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_add_intr() unsupported high level interrupt");
- return (AUDIO_FAILURE);
- }
-
- /* okay to register the interrupt */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)NULL,
- (ddi_idevice_cookie_t *)NULL, apc_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_add_intr() bad interrupt specification");
- return (AUDIO_FAILURE);
- }
-
- ATRACE("apc_add_intr() returning successful", state);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_add_intr() */
-
-/*
- * apc_rem_intr()
- *
- * Description:
- * Unregister the APC interrupts from the kernel.
- *
- * CAUTION: While the interrupts are removed, the Codec interrupts are
- * not disabled, but then, they never should have been on in
- * the first place.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * void
- */
-static void
-apc_rem_intr(dev_info_t *dip)
-{
- ATRACE("in apc_rem_intr()", dip);
-
- ddi_remove_intr(dip, 0, NULL);
-
- ATRACE("apc_rem_intr() returning", dip);
-
-} /* apc_rem_intr() */
-
-/*
- * apc_p_start()
- *
- * Description:
- * This routine starts the play DMA engine. This includes "hard" starts
- * where the DMA engine's registers need to be loaded as well as starting
- * after a pause.
- *
- * For hard starts the DMA engine is started by programming the Play Next
- * Virtual Address and then the Play Next Counter twice, and finally
- * enabling the play DMA engine.
- *
- * Starting after a pause is much eaiser, we just turn on the DMA GO bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully started
- * AUDIO_FAILURE Start failed
- */
-static int
-apc_p_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- int i;
- int samples;
-
- ATRACE("in apc_p_start()", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples we want */
- samples = state->cs_play_sr * state->cs_play_ch /
- state->cs_ad_info.ad_play.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_play_ch) == 1) {
- ATRACE("apc_p_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("apc_p_start() samples per interrupt", samples);
-
- /* try to load 2 buffers worth to get things started */
- for (i = 0; i < 2; i++) {
- ATRACE_32("apc_p_start() calling apc_program_play()", samples);
- PLAY_COUNT = samples *
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- if (apc_program_play(state, samples, NULL, 0) <= 0) {
- ATRACE("apc_p_start() "
- "apc_program_play() returns no samples", state);
- break;
- }
- }
-
- /*
- * If there wasn't anything to get then we aren't active. This can
- * happen if an AUDIO_DRAIN was issued with no audio in the stream.
- */
- if (i == 0) {
- ATRACE("apc_p_start() nothing to do", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Even with just one DMA buffer loaded we can still play some audio.
- * Read the Codec Status Register so that we clear the Error and
- * Initialization register, Index 11, so we'll know when we get
- * a play underrun in the ISR. Then enable the play DMA engine,
- * including interrupts.
- */
-#ifdef DEBUG
- ATRACE_8("apc_p_start() Read the Codec status reg, clearing Index 11",
- ddi_get8(handle, &CS4231_STATUS));
-#else
- (void) ddi_get8(handle, &CS4231_STATUS); /* we only need a read */
-#endif
-
- ATRACE("apc_p_start() turn on play DMA engine", state);
- OR_SET_WORD(handle, &APC_DMACSR, APC_PLAY_ENABLE);
-
- state->cs_flags |= PDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_p_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_p_start() */
-
-/*
- * apc_p_pause()
- *
- * Description:
- * This routine pauses the play DMA engine. Buffers, FIFO, etc. are NOT
- * lost.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_pause(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_p_pause()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the PDMA_GO bit, pausing the DMA engine */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_PDMA_GO);
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- ATRACE("apc_p_pause() returning", state);
-
-} /* apc_p_pause() */
-
-/*
- * apc_p_restart()
- *
- * Description:
- * This routine restarts the play DMA engine after pauseing. Buffers,
- * FIFO, etc. Must be programmed and valid.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_restart(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_p_restart()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* start the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_PEN, INTC_VALID_MASK);
-
- /* set the PDMA_GO bit, restarting the DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_PDMA_GO);
-
- ATRACE("apc_p_restart() returning", state);
-
-} /* apc_p_restart() */
-
-/*
- * apc_p_stop()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The DMA engine is stopped by using the PLAY_ABORT bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t reg;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_p_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* Set stopped flag */
- state->cs_flags |= APC_P_STOPPED;
-
- /* set the play abort bit to stop playing audio */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT)
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_PM) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- ATRACE("apc_p_stop() timeout", state);
- }
-#endif
-
- /* now clear the play enable and abort bits */
- AND_SET_WORD(handle, &APC_DMACSR, ~(APC_PDMA_GO|APC_P_ABORT));
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_p_stop() returning", state);
-
-} /* apc_p_stop() */
-
-/*
- * apc_r_start()
- *
- * Description:
- * This routine starts the record DMA engine. The DMA engine is never
- * paused for record, so a pause is equivalent to a stop. Thus all starts
- * are hard starts.
- *
- * For hard starts the DMA engine is started by programming the Record
- * Next Virtual Address and then the Record Next Counter twice, and
- * finally enabling the record DMA engine.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The capture DMA was started
- * AUDIO_FAILURE The capture DMA was not started
- */
-static int
-apc_r_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t csr;
- int bytes;
- int i;
- int samples;
- int x;
-
- ATRACE("in apc_r_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples to capture */
- samples = state->cs_record_sr * state->cs_record_ch /
- state->cs_ad_info.ad_record.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_record_ch) == 1) {
- ATRACE("apc_r_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("apc_r_start() samples per interrupt", samples);
-
- /* now convert the number of samples to the "size" in bytes */
- ASSERT(state->cs_record_prec == AUDIO_PRECISION_8 ||
- state->cs_record_prec == AUDIO_PRECISION_16);
- bytes = samples * (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE("apc_r_start() DMA count", bytes);
-
- /* make sure it's okay to program the Next Address/Count registers */
- csr = ddi_get32(handle, &APC_DMACSR);
- ATRACE_32("apc_r_start() CSR", csr);
- for (x = 0; !(csr & APC_CD) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* no reason to beat on the bus */
- csr = ddi_get32(handle, &APC_DMACSR);
- }
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE, "!apc_r_start() "
- "timeout waiting for Codec, record not started!");
- return (AUDIO_FAILURE);
- }
-
- /*
- * Program the DMA engine with both buffers. We MUST do both buffers
- * otherwise CAP_COUNT isn't going to set both byte counts.
- */
- for (i = 0; i < 2; i++) {
- /* read the CNVA, as per APC document */
- (void) ddi_get32(handle, &APC_DMACNVA);
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("apc_r_start() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_r_start() ddi_dma_sync() failed, recording "
- "stopped");
-
- /* send a cap. abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* wait for the pipeline to empty */
- csr = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(csr & APC_CX) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- csr = ddi_get32(handle, &APC_DMACSR);
- }
-
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_C_ABORT);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("apc_r_start() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &APC_DMACNVA,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* now program the CNC reg., which enables the state machine */
- ATRACE_32("apc_r_start() next count", (uint_t)(bytes));
- ddi_put32(handle, &APC_DMACNC, (uint_t)(bytes));
- CAP_COUNT = bytes;
-
- /* now get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("apc_r_start() new toggle", state->cs_cbuf_toggle);
- }
-
- state->cs_flags |= RDMA_ENGINE_INITIALIZED;
-
- /* start the DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_CAP_ENABLE);
- ATRACE("apc_r_start() returning success", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_r_start() */
-
-/*
- * apc_r_stop()
- *
- * Description:
- * This routine stops the record DMA engine. It then sends any collected
- * data to the audio mixer.
- *
- * The DMA engine is stopped by using the CAP_ABORT bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_r_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t reg;
- int samples;
- int x;
-
- ATRACE("in apc_r_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the record interrupts so the ISR doesn't get involved */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_CINTR_ENABLE);
-
- /* first, abort the record DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_CX) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "apc_r_stop() timeout, record buffer flushed");
- }
-#endif
-
- /* clear the CXI interrupt bit, but CXI interrupt didn't go out */
- OR_SET_WORD(handle, &APC_DMACSR, APC_CXI_EN);
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- /* figure how many samples were recorded */
- samples = (CAP_COUNT - ddi_get32(handle, &APC_DMACC)) /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* send the captured audio to the mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_r_stop() ddi_dma_sync() failed, recorded audio lost");
- } else {
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->cs_lock);
- }
-
- AND_SET_WORD(handle, &APC_DMACSR, ~(APC_C_ABORT|APC_CAP_DISABLE));
-
- /* check that the pipeline is empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_CD) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "apc_r_stop() buffer pipeline not empty");
- }
-#endif
-
- state->cs_flags &= ~RDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_r_stop() returning", state);
-
-} /* apc_r_stop() */
-
-/*
- * apc_power()
- *
- * Description:
- * This routine turns the Codec off by using the COD_PDWN bit in the
- * apc chip. To turn power on we have to reset the APC, which clears
- * the COD_PDWN bit. However, this is a settling bug in the APC which
- * requires the driver to delay quite a while before we may continue.
- * Since this is the first time this feature has actually been used
- * it isn't too surprising that it has some problems.
- *
- * NOTE: The state structure must be locked when this routine is called.
- *
- * Arguments:
- * CS_state_t *state Ptr to the device's state structure
- * int level Power level to set
- *
- * Returns:
- * void
- */
-static void
-apc_power(CS_state_t *state, int level)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_power()", state);
- ATRACE_32("apc_power() level", level);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- if (level == CS4231_PWR_ON) { /* turn power on */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_COD_PDWN);
- OR_SET_WORD(handle, &APC_DMACSR, APC_RESET);
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_RESET);
-
- /*
- * wait for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(CS4231_300MS));
-#endif
- state->cs_powered = CS4231_PWR_ON;
- } else { /* turn power off */
- ASSERT(level == CS4231_PWR_OFF);
- OR_SET_WORD(handle, &APC_DMACSR, APC_COD_PDWN);
- state->cs_powered = CS4231_PWR_OFF;
- }
-
- ATRACE_32("apc_power() done", ddi_get32(handle, &APC_DMACSR));
-
-} /* apc_power() */
-
-
-/* ******* Local Routines ************************************************** */
-
-/*
- * apc_intr()
- *
- * Description:
- * APC interrupt service routine, which services both play and capture
- * interrupts. First we find out why there was an interrupt, then we
- * take the appropriate action.
- *
- * Because this ISR deals with both play and record interrupts we have
- * to be careful to not lose an interrupt. So we service the record
- * interrupt first and save the incoming data until later. This is all
- * done without releasing the lock, thus there can be no race conditions.
- * Then we process the play interrupt. While processing the play interrupt
- * we have to release the lock. When this happens we send recorded data
- * to the mixer and then get the next chunk of data to play. If there
- * wasn't a play interrupt then we finish by sending the recorded data,
- * if any.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-apc_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t handle = APC_HANDLE;
- caddr_t rec_buf = NULL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int rec_samples;
- int samples;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the APC CSR */
- csr = ddi_get32(handle, &APC_DMACSR);
- ATRACE_32("apc_intr() interrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & APC_IP)) {
- /* Interrupt received when stopping play */
- if (state->cs_flags & APC_P_STOPPED) {
- /* Clear stopped flag */
- state->cs_flags &= ~APC_P_STOPPED;
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_CLAIMED);
- } else if (csr & APC_PMI_EN) {
- /*
- * Clear device generated interrupt while play is
- * active (Only seen while playing and insane mode
- * switching)
- */
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_CLAIMED);
- } else {
- /* nope, this isn't our interrupt */
- mutex_exit(&state->cs_lock);
- ATRACE_32("apc_intr() device didn't send interrupt",
- csr);
- return (DDI_INTR_UNCLAIMED);
- }
- }
-
- /* Clear stopped flag */
- state->cs_flags &= ~APC_P_STOPPED;
-
- /* clear all interrupts we captured this time */
- ddi_put32(handle, &APC_DMACSR, csr);
- ATRACE_32("apc_intr() csr after clear", ddi_get32(handle, &APC_DMACSR));
-
- if (csr & APC_CINTR_MASK) {
- ATRACE("apc_intr(R) record interrupt", state);
-
- /* sync DMA memory before sending it to the audio mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr(R) ddi_dma_sync(#1) failed, recorded "
- "audio lost");
- } else {
- /* figure how many samples were recorded */
- ASSERT(ddi_get32(handle, &APC_DMACSR) & APC_CD);
- samples = CAP_COUNT /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* save the data for when we free the lock */
- rec_buf = CAP_DMA_BUF;
- rec_samples = samples;
- }
-
- /* sync the DMA buffer before it is going to be reused */
- ATRACE("apc_intr(R) dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr(R) ddi_dma_sync(#2) failed, recording "
- "disabled");
-
- /* send a play abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_C_ABORT);
- } else {
- ATRACE_32("apc_intr(R) next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* read the CNVA, as per APC document */
- (void) ddi_get32(handle, &APC_DMACNVA);
-
- /* now program the DMA buffer into the Next Address */
- ddi_put32(handle, &APC_DMACNVA,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* program the CNC reg., which enables the state mach */
- ATRACE_32("apc_intr(R) next count", (uint_t)CAP_COUNT);
- ddi_put32(handle, &APC_DMACNC, (uint_t)CAP_COUNT);
-
- /* now get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("apc_intr(R) new toggle",
- state->cs_cbuf_toggle);
-
- }
- /* we always claim the interrupt, even if DMA sync failed */
- rc = DDI_INTR_CLAIMED;
- }
-
- if (csr & APC_PINTR_MASK) {
- /* figure out the number of samples we want */
- samples = PLAY_COUNT /
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("apc_intr(P) samples to get", samples);
-
- /* try to load the next audio buffer, even if pipe is empty */
- samples = apc_program_play(state, samples, &rec_buf,
- rec_samples);
- ATRACE_32("apc_intr(P) samples apc_program_play() returned",
- samples);
-
- if (samples <= 0 && (csr & APC_PM)) {
- /*
- * There isn't any more data to play, so wait for
- * the pipe and the Codec FIFO to empty. Then turn
- * off the play DMA engine by aborting. Also, we should
- * note that simple play interrupts with no samples
- * are ignored, but acknowledged. We wait for the pipe
- * to empty before we declare the DMA engine is empty.
- */
- ATRACE_32("apc_intr(P) no more data, wait for FIFO",
- samples);
-
- /*
- * We wait for the Codec FIFO to underrun, this
- * implies that the APC pipe is also empty.
- */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, ESI_REG, __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /*
- * Clear the flag so if audio is restarted while in
- * am_play_shutdown() we can detect it and not mess
- * things up.
- */
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- /* now shutdown the play stream */
- ATRACE("apc_intr(P) shutdown play stream", state);
- mutex_exit(&state->cs_lock);
-
- /* send the captured audio to the mixer ASAP */
- if (rec_buf) {
- am_send_audio(state->cs_ahandle, rec_buf,
- AUDIO_NO_CHANNEL, rec_samples);
- rec_buf = NULL;
- }
-
- am_play_shutdown(state->cs_ahandle, NULL);
-
- mutex_enter(&state->cs_lock);
-
- /* make sure playing wasn't restarted when lock lost */
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("apc_intr() restart after shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /* reset the DMA engine, putting it in a known state */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT);
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_PD) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
- /* clear the abort bit */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_P_ABORT);
-
- /* disable the Codec */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, INTC_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN,
- INTC_VALID_MASK);
-
- /* and reset the status */
- ddi_put8(handle, &CS4231_STATUS, STATUS_RESET);
-
- ATRACE("apc_intr(P) Play DMA engine off", state);
- }
- rc = DDI_INTR_CLAIMED;
- ATRACE_32("apc_intr(P) done", rc);
- }
-
-done:
-
- /* APC error interrupt, not sure what to do here */
- if (csr & APC_EI) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
- /* update the kernel interrupt statistics */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- /* one last chance to send the captured audio to the mixer */
- if (rec_buf) {
- am_send_audio(state->cs_ahandle, rec_buf, AUDIO_NO_CHANNEL,
- rec_samples);
- }
-
- ATRACE_32("apc_intr() returning", rc);
-
- return (rc);
-
-} /* apc_intr() */
-
-/*
- * apc_program_play()
- *
- * Description:
- * This routine is used by apc_p_start() and apc_intr() to program
- * the play DMA engine with the next buffer full of audio.
- *
- * Arguments:
- * CS_state_t *state The device's state pointer
- * int samples The number of samples to be retrieved
- * from the mixer
- * caddr_t *rec_buf Ptr to data buffer for record
- * int rec_samples Num samples in record data buffer
- *
- * Returns:
- * 0 The buffer wasn't programmed, no audio
- * > 0 The buffer was programmed
- * AUDIO_FAILURE The buffer wasn't programmed
- */
-static int
-apc_program_play(CS_state_t *state, int samples, caddr_t *rec_buf,
- int rec_samples)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t precision;
- int rc;
-
- ATRACE_32("in apc_program_play()", samples);
-
- /* we need the precision to calculate the next count correctly */
- precision = state->cs_play_prec >> AUDIO_PRECISION_SHIFT;
- ATRACE_32("apc_program_play() precision", precision);
-
- /* send record audio, then get the first buffer's worth of audio */
- mutex_exit(&state->cs_lock);
-
- /* send the captured audio to the mixer */
- if (rec_buf && *rec_buf) {
- am_send_audio(state->cs_ahandle, *rec_buf, AUDIO_NO_CHANNEL,
- rec_samples);
- *rec_buf = NULL;
- }
-
- rc = am_get_audio(state->cs_ahandle, PLAY_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
-
- mutex_enter(&state->cs_lock);
- ATRACE_32("apc_program_play() am_get_audio() returned", rc);
-
- if (rc == AUDIO_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_program_play() am_get_audio() failed");
- return (AUDIO_FAILURE);
- } else if (rc == 0) {
- ATRACE("apc_program_play() am_get_audio() returned 0 samples",
- state);
- return (0);
- }
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("apc_program_play() dma buffer sync", state);
- if (ddi_dma_sync(PLAY_DMA_HANDLE, (off_t)0, (size_t)(rc * precision),
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_program_play() ddi_dma_sync(#2) failed, audio lost");
-
- /* send a play abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT);
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_P_ABORT);
-
- return (AUDIO_FAILURE);
- }
-
- /* program the PNVA */
- ATRACE_32("apc_program_play() next address",
- (uint_t)PLAY_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &APC_DMAPNVA, (uint_t)PLAY_DMA_COOKIE.dmac_address);
-
- /* now program the PNC register, which enables the state machine */
- ATRACE_32("apc_program_play() next count", (uint_t)(rc * precision));
- ddi_put32(handle, &APC_DMAPNC, (uint_t)(rc * precision));
-
- /* now get ready for the next time we need a DMA buffer */
- AUDIO_TOGGLE(state->cs_pbuf_toggle);
- ATRACE_32("apc_program_play() new toggle", state->cs_pbuf_toggle);
-
- ATRACE_32("apc_program_play() returning", rc);
-
- return (rc);
-
-} /* apc_program_play() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c
deleted file mode 100644
index 9349d1f45a..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c
+++ /dev/null
@@ -1,1459 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * Platform specifc code for the EB2 DMA controller. The EB2 is a PCI bus
- * IC that includes play and record DMA engines and an interface for
- * the CS4231.
- */
-
-#include <sys/systm.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Attribute structure for the APC, used to create DMA handles.
- */
-static ddi_dma_attr_t eb2_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000ffffffLL, /* DMA counter register */
- 0x0000000000000001LL, /* DMA address alignment */
- 0x00000074, /* 4 and 16 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x000000000000ffffLL, /* maximum transfer size, 8k */
- 0x000000000000ffffLL, /* segment boundary, 32k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_BE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * Local routines
- */
-static uint_t eb2_rec_intr(caddr_t);
-static uint_t eb2_play_intr(caddr_t);
-static int eb2_program_play(CS_state_t *, int);
-
-/*
- * DMA ops vector functions
- */
-static int eb2_map_regs(dev_info_t *, CS_state_t *, size_t, size_t);
-static void eb2_unmap_regs(CS_state_t *);
-static void eb2_reset(CS_state_t *);
-static int eb2_add_intr(CS_state_t *);
-static void eb2_rem_intr(dev_info_t *);
-static int eb2_p_start(CS_state_t *);
-static void eb2_p_pause(CS_state_t *);
-static void eb2_p_restart(CS_state_t *);
-static void eb2_p_stop(CS_state_t *);
-static int eb2_r_start(CS_state_t *);
-static void eb2_r_stop(CS_state_t *);
-static void eb2_power(CS_state_t *, int);
-
-cs4231_dma_ops_t cs4231_eb2dma_ops = {
- "EB2 DMA controller",
- eb2_map_regs,
- eb2_unmap_regs,
- eb2_reset,
- eb2_add_intr,
- eb2_rem_intr,
- eb2_p_start,
- eb2_p_pause,
- eb2_p_restart,
- eb2_p_stop,
- eb2_r_start,
- eb2_r_stop,
- eb2_power
-};
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-/*
- * eb2_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * CS_state_t *state The device's state
- * int pbuf_size The size of the play DMA buffers to
- * allocate, we need two
- * int cbuf_size The size of the capture DMA buffers to
- * allocate, we need two
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-eb2_map_regs(dev_info_t *dip, CS_state_t *state, size_t pbuf_size,
- size_t cbuf_size)
-{
- uint_t dma_cookie_count;
- int rc;
-
- ATRACE("in eb2_map_regs()", state);
-
- /* allocate two handles for play and two for record */
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(0) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(1) failed: %d", rc);
- goto error_ph0;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(2) failed: %d", rc);
- goto error_ph1;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(3) failed: %d", rc);
- goto error_rh0;
- }
-
- /* allocate the four DMA buffers, two for play and two for record */
- if (ddi_dma_mem_alloc(state->cs_ph[0], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[0], &state->cs_pml[0],
- &state->cs_pmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(0) failed");
- goto error_rh1;
- }
- if (ddi_dma_mem_alloc(state->cs_ph[1], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[1], &state->cs_pml[1],
- &state->cs_pmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(1) failed");
- goto error_pb0;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[0], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[0], &state->cs_cml[0],
- &state->cs_cmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(2) failed");
- goto error_pb1;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[1], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[1], &state->cs_cml[1],
- &state->cs_cmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(3) failed");
- goto error_rb0;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[0], (struct as *)0,
- state->cs_pb[0], pbuf_size, DDI_DMA_WRITE, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_pc[0], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(0) failed: %d",
- rc);
- goto error_rb1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[1], (struct as *)0,
- state->cs_pb[1], pbuf_size, DDI_DMA_WRITE, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_pc[1], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(1) failed: %d",
- rc);
- goto error_pc0;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[0], (struct as *)0,
- state->cs_cb[0], cbuf_size, DDI_DMA_READ, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_cc[0], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(2) failed: %d",
- rc);
- goto error_pc1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[1], (struct as *)0,
- state->cs_cb[1], cbuf_size, DDI_DMA_READ, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_cc[1], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(3) failed: %d",
- rc);
- goto error_rc0;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* now, map the codec */
- if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
- sizeof (cs4231_pioregs_t), &acc_attr,
- &EB2_CODEC_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() codec failed: %d",
- rc);
- goto error_rc1;
- }
-
- /* next the play registers */
- acc_attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
- if (ddi_regs_map_setup(dip, 1,
- (caddr_t *)&state->cs_eb2_regs.play, 0,
- sizeof (cs4231_eb2regs_t), &acc_attr,
- &EB2_PLAY_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() play registers "
- "failed: %d", rc);
- goto error_dev1;
- }
-
- ASSERT(acc_attr.devacc_attr_endian_flags == DDI_STRUCTURE_LE_ACC);
-
- /* now the capture registers */
- if (ddi_regs_map_setup(dip, 2,
- (caddr_t *)&state->cs_eb2_regs.record, 0,
- sizeof (cs4231_eb2regs_t), &acc_attr,
- &EB2_REC_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() record registers "
- "failed: %d", rc);
- goto error_dev2;
- }
-
- /* finally the auxio register */
- if (ddi_regs_map_setup(dip, 3,
- (caddr_t *)&state->cs_eb2_regs.auxio, 0,
- sizeof (uint_t), &acc_attr,
- &EB2_AUXIO_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() audio register "
- "failed: %d", rc);
- goto error_dev2;
- }
-
- /* disable play and record interrupts */
- ddi_put32(EB2_PLAY_HNDL, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
- ddi_put32(EB2_REC_HNDL, &EB2_PLAY_CSR, EB2_RCLEAR_RESET_VALUE);
-
- /* let the state structure know about the attributes */
- state->cs_dma_attr = &eb2_attr;
-
- /* we start with play and record buffers 0 */
- state->cs_pbuf_toggle = 0;
- state->cs_cbuf_toggle = 0;
-
- ATRACE("eb2_map_regs() returning success", state);
-
- return (AUDIO_SUCCESS);
-
-error_dev2:
- ddi_regs_map_free(&EB2_REC_HNDL);
-error_dev1:
- ddi_regs_map_free(&EB2_PLAY_HNDL);
-error_dev0:
- ddi_regs_map_free(&EB2_CODEC_HNDL);
-error_rc1:
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-error_rc0:
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
-error_pc1:
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
-error_pc0:
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
-error_rb1:
- ddi_dma_mem_free(&state->cs_cmh[1]);
-error_rb0:
- ddi_dma_mem_free(&state->cs_cmh[0]);
-error_pb1:
- ddi_dma_mem_free(&state->cs_pmh[1]);
-error_pb0:
- ddi_dma_mem_free(&state->cs_pmh[0]);
-error_rh1:
- ddi_dma_free_handle(&state->cs_ch[1]);
-error_rh0:
- ddi_dma_free_handle(&state->cs_ch[0]);
-error_ph1:
- ddi_dma_free_handle(&state->cs_ph[1]);
-error_ph0:
- ddi_dma_free_handle(&state->cs_ph[0]);
-error:
- ATRACE("eb2_map_regs() returning failure", state);
-
- return (AUDIO_FAILURE);
-
-} /* eb2_map_regs() */
-
-/*
- * eb2_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocated the DAM handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * CS_state_t *state The device's state
- *
- * Returns:
- * void
- */
-static void
-eb2_unmap_regs(CS_state_t *state)
-{
- ATRACE("in eb2_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-
- ddi_dma_mem_free(&state->cs_pmh[0]);
- ddi_dma_mem_free(&state->cs_pmh[1]);
- ddi_dma_mem_free(&state->cs_cmh[0]);
- ddi_dma_mem_free(&state->cs_cmh[1]);
-
- ddi_dma_free_handle(&state->cs_ph[0]);
- ddi_dma_free_handle(&state->cs_ph[1]);
- ddi_dma_free_handle(&state->cs_ch[0]);
- ddi_dma_free_handle(&state->cs_ch[1]);
-
- ddi_regs_map_free(&EB2_CODEC_HNDL);
- ddi_regs_map_free(&EB2_PLAY_HNDL);
- ddi_regs_map_free(&EB2_REC_HNDL);
- ddi_regs_map_free(&EB2_AUXIO_HNDL);
-
- ATRACE("eb2_unmap_regs() returning", state);
-
-} /* eb2_unmap_regs() */
-
-/*
- * eb2_reset()
- *
- * Description:
- * Reset both the play and record DMA engines. The engines are left
- * with interrupts and the DMA engine disabled.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo structure
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_reset(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t reg;
- int x;
-
- ATRACE("in eb2_reset()", state);
-
- /* start with the play side */
- ddi_put32(phandle, &EB2_PLAY_CSR, EB2_RESET);
- /* wait for play data to drain */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0; !(reg & EB2_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
- /* clear the reset bit and program for chaining */
- ddi_put32(phandle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
-
- /* now do the record side and program for chaining */
- ddi_put32(rhandle, &EB2_REC_CSR, EB2_RESET);
- /* wait for record data to drain */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; !(reg & EB2_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
- /* clear the reset bit */
- ddi_put32(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
-
- ATRACE("eb2_reset() returning", state);
-
-} /* eb2_reset() */
-
-/*
- * eb2_add_intr()
- *
- * Description:
- * Register the EB2 interrupts with the kernel.
- *
- * NOTE: This does NOT turn on interrupts.
- *
- * CAUTION: While the interrupts are added, the Codec interrupts are
- * not enabled.
- *
- * Arguments:
- * CS_state_t *state Pointer to the device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-eb2_add_intr(CS_state_t *state)
-{
- dev_info_t *dip = state->cs_dip;
-
- ATRACE("in eb2_add_intr()", state);
-
- /* first we make sure these aren't high level interrupts */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() unsupported high level interrupt 0");
- return (AUDIO_FAILURE);
- }
- if (ddi_intr_hilevel(dip, 1) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() unsupported high level interrupt 1");
- return (AUDIO_FAILURE);
- }
-
- /* okay to register the interrupts */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)0,
- (ddi_idevice_cookie_t *)0, eb2_rec_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() bad record interrupt specification");
- return (AUDIO_FAILURE);
- }
-
- if (ddi_add_intr(dip, 1, (ddi_iblock_cookie_t *)0,
- (ddi_idevice_cookie_t *)0, eb2_play_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() bad play interrupt specification");
- ddi_remove_intr(dip, 0, NULL);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("eb2_add_intr() returning successful", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_add_intr() */
-
-/*
- * eb2_rem_intr()
- *
- * Description:
- * Unregister the EB2 interrupts from the kernel.
- *
- * CAUTION: While the interrupts are removed, the Codec interrupts are
- * not disabled, but then, they never should have been on in
- * the first place.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * void
- */
-static void
-eb2_rem_intr(dev_info_t *dip)
-{
- ATRACE("in eb2_rem_intr()", dip);
-
- ddi_remove_intr(dip, 0, NULL);
- ddi_remove_intr(dip, 1, NULL);
-
- ATRACE("eb2_rem_intr() returning", dip);
-
-} /* eb2_rem_intr() */
-
-/*
- * eb2_p_start()
- *
- * Description:
- * This routine starts the play DMA engine. This includes "hard" starts
- * where the DMA engine's registers need to be loaded as well as starting
- * after a pause;
- *
- * For hard starts the DMA engine is started by programming the Play Next
- * Byte Register and the Play Next Address Register twice, and finally
- * enabling the DMA play engine.
- *
- * Starting after a pause is much eaiser, we just turn on the EN_DMA bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully started
- * AUDIO_FAILURE Start failed
- */
-static int
-eb2_p_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- int i;
- int samples;
-
- ATRACE("in eb2_p_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples we want */
- samples = state->cs_play_sr * state->cs_play_ch /
- state->cs_ad_info.ad_play.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_play_ch) == 1) {
- ATRACE("eb2_p_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("eb2_p_start() samples per interrupt", samples);
-
- /* try to load 2 buffers worth to get things started */
- for (i = 0; i < 2; i++) {
- ATRACE_32("eb2_p_start() calling eb2_program_play()", samples);
- PLAY_COUNT = samples *
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- if (eb2_program_play(state, samples) <= 0) {
- ATRACE("eb2_p_start() "
- "eb2_program_play() returns no samples", state);
- break;
- }
-
- if (i == 0) {
- /* start playing before we load the next address */
- ATRACE("eb2_p_start() turn on play DMA engine", state);
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_PLAY_ENABLE);
- }
- }
-
- /*
- * If there wasn't anything to get then we aren't active. This can
- * happen if an AUDIO_DRAIN was issued with no audio in the stream.
- */
- if (i == 0) {
- ATRACE("eb2_p_start() nothing to do", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Even with just one DMA buffer loaded we can still play some audio.
- * Read the Codec Status Register so that we clear the Error and
- * Initialization register, Index 11, so we'll know when we get
- * a play underrun in the ISR. Then enable the play DMA engine,
- * including interrupts.
- */
-#ifdef DEBUG
- ATRACE_8("eb2_p_start() Read the Codec status reg, clearing Index 11",
- ddi_get8(handle, &CS4231_STATUS));
-#else
- (void) ddi_get8(handle, &CS4231_STATUS); /* we only need a read */
-#endif
-
- state->cs_flags |= PDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_p_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_p_start() */
-
-/*
- * eb2_pause()
- *
- * Description:
- * This routine pauses the play DMA engine. Buffers, FIFO, etc. are NOT
- * lost.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_pause(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_p_pause()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the EN_DMA bit, pausing the engine */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_EN_DMA);
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(phandle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(phandle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(phandle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- ATRACE("eb2_p_pause() returning", state);
-
-} /* eb2_p_pause() */
-
-/*
- * eb2_p_restart()
- *
- * Description:
- * This routine restarts the play DMA engine after pausing. Buffers,
- * FIFO, etc. MUST be programmed and valid.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_restart(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
-
- ATRACE("in eb2_p_restart()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* start the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(phandle, &CS4231_IDR, INTC_PEN, INTC_VALID_MASK);
-
- /* set the EN_DMA bit, restarting the engine */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_EN_DMA);
-
- ATRACE("eb2_p_restart() returning", state);
-
-} /* eb2_p_restart() */
-
-/*
- * eb2_p_stop()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The DMA engine is stopped by using the play RESET bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_stop(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- uint_t reg;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_p_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the play interrupts so the ISR doesn't get involved */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_PINTR_MASK);
-
- /* set the play RESET bit to stop playing audio */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- ATRACE("eb2_p_stop() timeout", state);
- }
-#endif
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(phandle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(phandle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(phandle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_p_stop() returning", state);
-
-} /* eb2_p_stop() */
-
-/*
- * eb2_r_start()
- *
- * Description:
- * This routine starts the record DMA engine. The DMA engine is never
- * paused for record, so a puse is equivalent to a stop. Thus all starts
- * are hard starts.
- *
- * For hard starts the DMA engine is started by programming the Record
- * NExt Byte Register and then the Record Next Address Register twice,
- * and finally enabling the record DMA engine.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The capture DMA was started
- * AUDIO_FAILURE The capture DMA was not started
- */
-static int
-eb2_r_start(CS_state_t *state)
-{
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t csr;
- int bytes;
- int i;
- int samples;
- int x;
-
- ATRACE("in eb2_r_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples to capture */
- samples = state->cs_record_sr * state->cs_record_ch /
- state->cs_ad_info.ad_record.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_record_ch) == 1) {
- ATRACE("eb2_r_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("eb2_r_start() samples per interrupt", samples);
-
- /* now convert the number of samples to the "size" in bytes */
- ASSERT(state->cs_record_prec == AUDIO_PRECISION_8 ||
- state->cs_record_prec == AUDIO_PRECISION_16);
- bytes = samples * (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE("eb2_r_start() DMA count", bytes);
-
- /* reset the DMA engine so we have a good starting place */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* no reason to beat on the bus */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_start() timeout waiting for Codec, record not "
- "started!");
- return (AUDIO_FAILURE);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* put into chaining mode */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
-
- /*
- * Program the DMA engine with both buffers. We MUST do both buffers
- * otherwise CAP_COUNT isn't going to set both byte counts.
- */
- for (i = 0; i < 2; i++) {
- /* sync the DMA buffer before it is going to be used */
- ATRACE("eb2_r_start() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_start() ddi_dma_sync() failed, recording "
- "stopped");
-
- /* reset the DMA engine */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0;
- (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR,
- ~(EB2_RESET|EB2_EN_DMA));
-
- return (AUDIO_FAILURE);
- }
-
- /* for eb2 we first program the Next Byte Count Register */
- ATRACE_32("eb2_r_start() next count", (uint_t)bytes);
- ddi_put32(rhandle, &EB2_REC_BCR, (uint_t)bytes);
- CAP_COUNT = bytes;
- ATRACE_32("eb2_r_start() samples to send", samples);
-
- /* now program the Next Address Register - starts state mach */
- ATRACE_32("eb2_r_start() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(rhandle, &EB2_REC_ACR,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- if (i == 0) {
- /* start the DMA engine before loading the next addr */
- ATRACE("eb2_r_start() turn on rec DMA engine", state);
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_REC_ENABLE);
- }
-
- /* get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("eb2_r_start() new toggle", state->cs_cbuf_toggle);
- }
-
- state->cs_flags |= RDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_r_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_r_start() */
-
-/*
- * eb2_r_stop()
- *
- * Description:
- * This routine stops the record DMA engine. It then sends any collected
- * data to the audio mixer.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_r_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t reg;
- uint_t csr;
- int samples;
- int x;
-
- ATRACE("in eb2_r_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (csr & EB2_CYC_PENDING) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1);
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- if (csr & EB2_INT_PEND) {
- state->cs_flags |= REC_INTR_PENDING;
- }
-
- /* set the record RESET bit to stop recording audio */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "audiocs: eb2_r_stop() timeout, record buffer flushed");
- }
-#endif
-
- /* clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* figure how many samples were recorded */
- samples = (CAP_COUNT - ddi_get32(rhandle, &EB2_REC_BCR)) /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- samples -= samples % state->cs_record_ch;
-
- /* send the captured audio to the mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_stop() ddi_dma_sync() failed, recorded audio lost");
- } else {
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->cs_lock);
- }
-
- state->cs_flags &= ~RDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_r_stop() returning", state);
-
-} /* eb2_r_stop() */
-
-/*
- * eb2_power()
- *
- * Description:
- * This routine turns the Codec on or off using the auxio register
- * in the eb2 device (cheerio or rio). Fortunately we don't need
- * to delay like we do with the APC.
- *
- * NOTE: The state structure must be locked when this routine is called.
- *
- * Arguments:
- * CS_state_t *state Ptr to the device's state structure
- * int level Power level to set
- *
- * Returns:
- * void
- */
-static void
-eb2_power(CS_state_t *state, int level)
-{
- ddi_acc_handle_t xhandle = EB2_AUXIO_HNDL;
-
- ATRACE("in eb2_power()", state);
- ATRACE_32("eb2_power() level", level);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- if (level == CS4231_PWR_ON) { /* turn power on */
- AND_SET_WORD(xhandle, EB2_AUXIO_REG, ~EB2_AUXIO_COD_PDWN);
- state->cs_powered = CS4231_PWR_ON;
- } else { /* turn power off */
- OR_SET_WORD(xhandle, EB2_AUXIO_REG, EB2_AUXIO_COD_PDWN);
- state->cs_powered = CS4231_PWR_OFF;
- }
-
- ATRACE_32("eb2_power() done", ddi_get32(xhandle, EB2_AUXIO_REG));
-
-} /* eb2_power() */
-
-
-/* ******* Local Routines ************************************************** */
-
-/*
- * eb2_rec_intr()
- *
- * Description:
- * EB2 record interrupt serivce routine. First we find out why there was
- * an interrupt, then we take the appropriate action
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-eb2_rec_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int samples;
- int x;
-
- ATRACE("in eb2_rec_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the EB2 record CSR */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- ATRACE_32("eb2_rec_intr() intrrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & EB2_INT_PEND)) {
- /* Interrupt that's still being serviced */
- if (state->cs_flags & REC_INTR_PENDING) {
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /* nope, this isn't our interrupt */
- ATRACE_32("eb2_rec_intr() device didn't send interrupt", csr);
- if (state->cs_ksp) {
- KIOP(state)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* clear all interrupts we captured at this time */
- ddi_put32(rhandle, &EB2_REC_CSR, (csr|EB2_TC));
- ATRACE_32("eb2_rec_intr() csr after clear",
- ddi_get32(rhandle, &EB2_REC_CSR));
-
- if (csr & EB2_TC) {
- ATRACE("eb2_rec_intr() record interrupt", state);
-
- /* sync DMA memory before sending it to the audio mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() ddi_dma_sync(#1) failed, recorded "
- "audio lost");
- } else {
- /* figure how many samples were recorded */
- samples = CAP_COUNT /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* send the captured audio to the mixer */
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->cs_lock);
- }
-
- /* sync the DMA buffer before it is going to be reused */
- ATRACE("eb2_rec_intr() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() ddi_dma_sync(#2) failed, recording"
- " disabled");
-
- /* reset the DMA engine */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0;
- (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR,
- ~(EB2_RESET|EB2_EN_DMA));
- } else {
- ATRACE_32("eb2_rec_intr() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* first program the Next Byte Count Register */
- ATRACE_32("eb2_rec_intr() next count",
- (uint_t)CAP_COUNT);
- ddi_put32(rhandle, &EB2_REC_BCR, (uint_t)CAP_COUNT);
-
- /* now program the Next Add. Reg. - starts state mach */
- ATRACE_32("eb2_rec_intr() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(rhandle, &EB2_REC_ACR,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("eb2_rec_intr() new toggle",
- state->cs_cbuf_toggle);
- }
-
- /* we always claim the interrupt, even if DMA sync failed */
- rc = DDI_INTR_CLAIMED;
- } else if (csr & EB2_ERR_PEND) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- } else {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() unknown interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
-done:
- state->cs_flags &= ~REC_INTR_PENDING;
-
- /* update the kernel interrupt statistics */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- } else {
- KIOP(state)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("eb2_rec_intr() returning", rc);
-
- return (rc);
-
-} /* eb2_rec_intr() */
-
-/*
- * eb2_play_intr()
- *
- * Description:
- * EB2 play interrupt serivce routine. First we find out why there was an
- * interrupt, then we take the appropriate action.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-eb2_play_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int samples;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_play_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the EB2 play CSR */
- csr = ddi_get32(phandle, &EB2_PLAY_CSR);
- ATRACE_32("eb2_play_intr() interrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & EB2_INT_PEND)) {
- mutex_exit(&state->cs_lock);
- /* nope, this isn't our interrupt */
- ATRACE_32("eb2_play_intr() device didn't send interrupt", csr);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* clear all interrupts we captured at this time */
- ddi_put32(phandle, &EB2_PLAY_CSR, (csr|EB2_TC));
- ATRACE_32("eb2_play_intr() csr after clear",
- ddi_get32(phandle, &EB2_PLAY_CSR));
-
- if (csr & EB2_TC) {
- samples = PLAY_COUNT /
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("eb2_play_intr() samples to get", samples);
-
- /* try to load the next audio buffer */
- samples = eb2_program_play(state, samples);
- ATRACE_32("eb2_play_intr() samples eb2_program_play() returned",
- samples);
-
- if (samples <= 0 && !(csr & EB2_A_LOADED)) {
- /*
- * There isn't any more data to play, so wait for
- * the the Codec FIFO to empty. Then turn off the
- * play DMA engine by reseting it. Also, we should
- * note that a play interrupt with an ADDRESS loaded
- * but no samples is ignored, but acknowledged. We
- * wait for the ADDRESS to not be loaded before we
- * declare the DMA engine empty.
- */
- ATRACE_32("eb2_play_intr() no more data, wait for "
- "FIFO", samples);
-
- /*
- * We wait for the Codec FIFO to underrun. Unlike the
- * APC, we wouldn't be here if the pipe wasn't already
- * empty.
- */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, ESI_REG, __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /*
- * Clear the flag so if audio is restarted while in
- * am_play_shutdown() we can detect it and not mess
- * things up.
- */
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- /* now shutdown the play stream */
- ATRACE("eb2_intr() shutdown play stream", state);
- mutex_exit(&state->cs_lock);
- am_play_shutdown(state->cs_ahandle, NULL);
- mutex_enter(&state->cs_lock);
-
- /* make sure playing wasn't restarted when lock lost */
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("eb2_intr() restart after shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /*
- * Nope, play was not restarted so reset the
- * DMA eng, putting it into a known state
- */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, which it should be */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0;
- (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
-
- /* clear the reset bit */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_RESET);
-
- /* disable the Codec */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, INTC_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN,
- INTC_VALID_MASK);
-
- /* and reset the status */
- ddi_put8(handle, &CS4231_STATUS, STATUS_RESET);
-
- ATRACE("eb2_play_intr() Play DMA engine off", state);
- }
- rc = DDI_INTR_CLAIMED;
- ATRACE_32("eb2_play_intr() done", rc);
- } else if (csr & EB2_ERR_PEND) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_play_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- } else {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_play_intr() unknown interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
-done:
-
- /* update the kernel interrupt statisitcs */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("eb2_play_intr() returning", rc);
-
- return (rc);
-
-} /* eb2_play_intr() */
-
-/*
- * eb2_program_play()
- *
- * Description:
- * This routine is used by eb2_p_start() and eb2_play_intr() to program
- * the play DMA engine with the next buffer full of audio.
- *
- * Arguments:
- * CS_state_t *state The device's state pointer
- * int samples The number of samples to be retrieved from the
- * mixer
- *
- * Returns:
- * 0 The buffer wasn't programmed, no audio
- * > 0 The buffer was programmed
- * AUDIO_FAILURE The buffer wasn't programmed
- */
-static int
-eb2_program_play(CS_state_t *state, int samples)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- uint_t reg;
- uint_t precision;
- int x;
- int rc;
-
- ATRACE_32("in eb2_program_play()", samples);
-
- /* we need the precision to calculate the next count correctly */
- precision = state->cs_play_prec >> AUDIO_PRECISION_SHIFT;
- ATRACE_32("eb2_program_play() precision", precision);
-
- /* get the first buffer's worth of audio */
- mutex_exit(&state->cs_lock);
- rc = am_get_audio(state->cs_ahandle, PLAY_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->cs_lock);
- ATRACE_32("eb2_program_play() am_get_audio() returned", rc);
-
- if (rc == AUDIO_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_program_play() am_get_audio() failed");
- return (AUDIO_FAILURE);
- } else if (rc == 0) {
- ATRACE("eb2_program_play() am_get_audio() returned 0 samples",
- state);
- return (0);
- }
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("eb2_program_play() dma buffer sync", state);
- if (ddi_dma_sync(PLAY_DMA_HANDLE, (off_t)0, (size_t)(rc * precision),
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_program_play() ddi_dma_sync(#2) failed");
-
- /* reset the DMA engine, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &EB2_PLAY_CSR, EB2_RESET);
- /* wait for play data to drain */
- reg = ddi_get32(handle, &EB2_PLAY_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(handle, &EB2_PLAY_CSR);
- }
- /* clear the reset bit */
- ddi_put32(handle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
-
- return (AUDIO_FAILURE);
- }
-
- /* make sure we are in NEXT mode */
- OR_SET_WORD(handle, &EB2_PLAY_CSR, EB2_EN_NEXT|EB2_EN_CNT);
-
- /* program the Next Byte Count Register */
- ATRACE_32("eb2_program_play() next count", (uint_t)(rc * precision));
- ddi_put32(handle, &EB2_PLAY_BCR, (uint_t)(rc * precision));
-
- /* now program the Next Address Register */
- ATRACE_32("eb2_program_play() next address",
- (uint_t)PLAY_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &EB2_PLAY_ACR, (uint_t)PLAY_DMA_COOKIE.dmac_address);
-
- /* now get ready for the next time we need a DMA buffer */
- AUDIO_TOGGLE(state->cs_pbuf_toggle);
- ATRACE_32("eb2_program_play() new toggle", state->cs_pbuf_toggle);
-
- ATRACE_32("eb2_program_play() returning", rc);
-
- return (rc);
-
-} /* eb2_program_play() */
diff --git a/usr/src/uts/sun/sys/Makefile b/usr/src/uts/sun/sys/Makefile
index 38a2f0bfba..f4672bce99 100644
--- a/usr/src/uts/sun/sys/Makefile
+++ b/usr/src/uts/sun/sys/Makefile
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# include global definitions
include ../../../Makefile.master
@@ -49,10 +47,6 @@ stp4020_reg.h stp4020_var.h \
ttymux.h ttymuxuser.h \
zsdev.h
-AUDIOHDRS= \
-audio_4231.h \
-audio1575.h
-
SCSIADHDRS= \
espcmd.h espreg.h espvar.h fascmd.h fasdma.h \
fasreg.h fasvar.h ifpio.h sfvar.h
@@ -73,7 +67,6 @@ ROOTDIRS= $(ROOTDIR) \
ROOTHDRS= $(HDRS:%=$(ROOTDIR)/%)
$(CLOSED_BUILD)ROOTHDRS += $(CLOSED_HDRS:%=$(ROOTDIR)/%)
-ROOTAUDHDRS= $(AUDIOHDRS:%=$(ROOTDIR)/audio/%)
ROOTFCHDRS= $(FCHDRS:%=$(ROOTDIR)/fc4/%)
ROOTSCSIADHDRS= $(SCSIADHDRS:%=$(ROOTDIR)/scsi/adapters/%)
$(CLOSED_BUILD)ROOTSCSIADHDRS += \
@@ -113,7 +106,6 @@ scsi/targets/%.check: scsi/targets/%.h
CHECKHDRS= \
$(HDRS:%.h=%.check) \
- $(AUDIOHDRS:%.h=audio/%.check) \
$(FCHDRS:%.h=fc4/%.check) \
$(SCSIADHDRS:%.h=scsi/adapters/%.check) \
$(SCSITARGHDRS:%.h=scsi/targets/%.check)
diff --git a/usr/src/uts/sun/sys/audio/audio1575.h b/usr/src/uts/sun/sys/audio/audio1575.h
deleted file mode 100644
index 0daab8ee76..0000000000
--- a/usr/src/uts/sun/sys/audio/audio1575.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO1575_H_
-#define _SYS_AUDIO1575_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audio1575 device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define M1575_DEV_NAME "SUNW,audio1575"
-#define M1575_DEV_CONFIG "onboard1"
-#define M1575_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define M1575_NAME "audio1575"
-#define M1575_MOD_NAME "mixer audio driver"
-#define M1575_SAMPR5510 (5510)
-#define M1575_SAMPR6620 (6620)
-#define M1575_SAMPR8000 (8000)
-#define M1575_SAMPR9600 (9600)
-#define M1575_SAMPR11025 (11025)
-#define M1575_SAMPR16000 (16000)
-#define M1575_SAMPR18900 (18900)
-#define M1575_SAMPR22050 (22050)
-#define M1575_SAMPR27420 (27420)
-#define M1575_SAMPR32000 (32000)
-#define M1575_SAMPR33075 (33075)
-#define M1575_SAMPR37800 (37800)
-#define M1575_SAMPR44100 (44100)
-#define M1575_SAMPR48000 (48000)
-
-#define M1575_DEFAULT_SR M1575_SAMPR8000
-#define M1575_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define M1575_DEFAULT_PREC AUDIO_PRECISION_8
-#define M1575_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define M1575_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3/4)
-#define M1575_DEFAULT_RGAIN (127)
-#define M1575_DEFAULT_MONITOR_GAIN (0)
-#define M1575_DEFAULT_BAL AUDIO_MID_BALANCE
-#define M1575_INTS (175) /* default interrupt rate */
-#define M1575_MIN_INTS (25) /* minimum interrupt rate */
-#define M1575_MAX_INTS (5000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO1575_H_ */
diff --git a/usr/src/uts/sun/sys/audio/audio_4231.h b/usr/src/uts/sun/sys/audio/audio_4231.h
deleted file mode 100644
index 1f66c8cd1e..0000000000
--- a/usr/src/uts/sun/sys/audio/audio_4231.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIO_4231_H
-#define _SYS_AUDIO_4231_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audiocs device driver.
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define CS_DEV_NAME "SUNW,CS4231"
-#define CS_DEV_CONFIG_ONBRD1 "onboard1"
-#define CS_DEV_VERSION "a" /* SS5 */
-#define CS_DEV_VERSION_A CS_DEV_VERSION
-#define CS_DEV_VERSION_B "b" /* Electron - internal loopback */
-#define CS_DEV_VERSION_C "c" /* Positron */
-#define CS_DEV_VERSION_D "d" /* PowerPC - Retired */
-#define CS_DEV_VERSION_E "e" /* x86 - Retired */
-#define CS_DEV_VERSION_F "f" /* Tazmo */
-#define CS_DEV_VERSION_G "g" /* Quark Audio Module */
-#define CS_DEV_VERSION_H "h" /* Darwin */
-
-/*
- * Driver supported configuration information
- */
-#define CS4231_NAME "audiocs"
-#define CS4231_MOD_NAME "CS4231 mixer audio driver"
-
-#define CS4231_SAMPR5510 (5510)
-#define CS4231_SAMPR6620 (6620)
-#define CS4231_SAMPR8000 (8000)
-#define CS4231_SAMPR9600 (9600)
-#define CS4231_SAMPR11025 (11025)
-#define CS4231_SAMPR16000 (16000)
-#define CS4231_SAMPR18900 (18900)
-#define CS4231_SAMPR22050 (22050)
-#define CS4231_SAMPR27420 (27420)
-#define CS4231_SAMPR32000 (32000)
-#define CS4231_SAMPR33075 (33075)
-#define CS4231_SAMPR37800 (37800)
-#define CS4231_SAMPR44100 (44100)
-#define CS4231_SAMPR48000 (48000)
-
-#define CS4231_DEFAULT_SR CS4231_SAMPR8000
-#define CS4231_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define CS4231_DEFAULT_PREC AUDIO_PRECISION_8
-#define CS4231_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define CS4231_DEFAULT_PGAIN AUDIO_MID_GAIN
-#define CS4231_DEFAULT_RGAIN AUDIO_MID_GAIN
-#define CS4231_DEFAULT_MONITOR_GAIN (0)
-#define CS4231_DEFAULT_BAL AUDIO_MID_BALANCE /* MUST be mid */
-#define CS4231_INTS (175) /* default interrupt rate */
-#define CS4231_MIN_INTS (10) /* minimum interrupt rate */
-#define CS4231_MAX_INTS (2000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_4231_H */
diff --git a/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h b/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h
deleted file mode 100644
index 0e7397aa6d..0000000000
--- a/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h
+++ /dev/null
@@ -1,766 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO1575_IMPL_H_
-#define _SYS_AUDIO1575_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Implementation specific header file for the audio1575 device driver.
- */
-
-#ifdef _KERNEL
-
-/* Misc. defines */
-#define M1575_IDNUM (0x5455)
-#define M1575_CONFIG_DEVICE_ID M1575_IDNUM
-#define M1575_CONFIG_VENDOR_ID (0x10b9)
-#define M1575_CONFIG_SUBSYSTEM_ID M1575_IDNUM
-#define M1575_CONFIG_SUBSYSTEM_VENDOR_ID M1575_CONFIG_VENDOR_ID
-#define M1575_AUDIO_PCICFG_SPACE (0)
-#define M1575_AUDIO_IO_SPACE (1)
-#define M1575_AUDIO_MEM_SPACE (2)
-
-#define M1575_MINPACKET (0)
-#define M1575_MAXPACKET (1*1024)
-#define M1575_HIWATER (64*1024)
-#define M1575_LOWATER (32*1024)
-#define M1575_LOOP_CTR (100)
-
-/* Gain and attenuation shift values */
-#define M1575_GAIN_SHIFT3 (3)
-#define M1575_GAIN_SHIFT4 (4)
-#define M1575_BYTE_SHIFT (8)
-
-/* audio direction */
-#define M1575_DMA_PCM_IN (1)
-#define M1575_DMA_PCM_OUT (2)
-
-/* last AC97 saved register */
-#define M1575_LAST_AC_REG (0x3a)
-
-/* Restore audio flags */
-#define M1575_INIT_RESTORE (0)
-#define M1575_INIT_NO_RESTORE ~M1575_INIT_RESTORE
-
-/* AC97 codec shadow reg to index macro */
-#define M1575_CODEC_REG(r) ((r) >> 1)
-
-/* play and record sample buffer counts */
-#define M1575_PLAY_BUFS (2)
-#define M1575_PLAY_BUF_MSK (M1575_PLAY_BUFS - 1)
-#define M1575_REC_BUFS (4)
-#define M1575_REC_BUF_MSK (M1575_REC_BUFS - 1)
-
-/* Buffer Descriptor List defines */
-#define M1575_BD_NUMS (32)
-#define M1575_BD_MSK (M1575_BD_NUMS - 1)
-#define M1575_BD_SIZE \
- (M1575_BD_NUMS * sizeof (m1575_bd_entry_t))
-
-/* default buffer size */
-#define M1575_BSIZE (8*1024)
-#define M1575_MOD_SIZE (16)
-#define M1575_PLAY_BUF_SZ (1024)
-#define M1575_RECORD_BUF_SZ (1024)
-#define M1575_BUF_MIN (512)
-#define M1575_BUF_MAX (8192)
-
-/* Audio channel defines */
-#define M1575_MAX_CHANNELS (32)
-#define M1575_MAX_HW_CHANNELS (6)
-#define M1575_MAX_IN_CHANNELS (1)
-#define M1575_MAX_OUT_CHANNELS \
- (M1575_MAX_HW_CHANNELS - M1575_MAX_IN_CHANNELS)
-#define M1575_INPUT_STREAM 1
-#define M1575_PORT_UNMUTE 0xffffffff
-
-/* kstat interrupt counter define */
-#define M1575_KIOP(X) ((kstat_intr_t *)(X->m1575_ksp->ks_data))
-
-/* AD1981B Specific Definitions */
-#define AC97_MISC_CONTROL_BIT_REGISTER 0x76
-#define MIC_20dB_GAIN 0x0000
-#define MIC_10dB_GAIN 0x0001
-#define MIC_30dB_GAIN 0x0010
-#define C2MIC 0x0040
-#define C1MIC 0x0000
-#define AC97_MIXER_ADC_GAIN_REGISTER 0x64
-#define MIXER_GAIN_MUTE 0x8000
-#define MIXER_0db_GAIN_ 0x0000
-/* Check for poweron status every 10 ms */
-#define AD1981_POWERON_DELAY_USEC 10000
-
-/* PCI CFG SPACE REGISTERS for Audio (Device 29, Function 0) */
-#define M1575_PCIID_REG 0x00 /* Vendor ID 32 */
-#define M1575_PCICS_REG 0x04 /* Cmd & Status 32 */
-#define M1575_PCIREV_REG 0x08 /* Class Code & RevId 32 */
-#define M1575_PCILT_REG 0x0C /* PCI latency 32 */
-#define M1575_PCIIO_REG 0x10 /* PCI IOBASE 32 */
-#define M1575_PCIMEM_REG 0x14 /* PCI MEMBASE 32 */
-#define M1575_PCIINT_REG 0x3C /* PCI INT Pin & Line 32 */
-#define M1575_PCIPMR_REG 0x42 /* Power Capabilities 16 */
-#define M1575_PCIPMCSR_REG 0x44 /* Power Cmd & Status 16 */
-#define M1575_PCISCCR_REG 0x48 /* System Cfg Cntrl 16 */
-#define M1575_PCIAPMUCR1_REG 0x54 /* Add. PMU Cntrl Reg 8 */
-#define M1575_PCISCRR_REG 0x57 /* Scratch Reg 8 */
-#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
-#define M1575_PCIGCC_REG 0x59 /* Global Clk Control 16 */
-#define M1575_PCIACD_REG 0x5C /* AC97 Codec Detect 8 */
-#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
-#define M1575_PCIGCLK_REG 0x59 /* Misc Reg 8 */
-#define M1575_PCIMSICTRL_REG 0x62 /* MSI Control Reg 16 */
-#define M1575_PCIMSIADDR_REG 0x64 /* MSI Address Reg 32 */
-#define M1575_PCIMSIDATA_REG 0x68 /* MSI Data Reg 16 */
-#define M1575_PCIMSIMASK_REG 0x6C /* MSI Data Reg 32 */
-#define M1575_PCIMSIPEND_REG 0x70 /* MSI Pend Reg 32 */
-
-/* Bit definitions for PCI AC97 Clk detect Reg */
-#define M1575_PCIACD_CLKDET 0x01
-#define M1575_PCIMISC_INTENB 0x40
-#define M1575_PCIINT_LINE 0x05
-
-/* Base Line Audio I/O Memory Registers */
-#define M1575_SCR_REG 0x00 /* System Control Reg 32 */
-#define M1575_SSR_REG 0x04 /* System System Reg 32 */
-#define M1575_DMACR_REG 0x08 /* DMA Control Reg 32 */
-#define M1575_FIFOCR1_REG 0x0C /* FIFO 1 Control Reg 32 */
-#define M1575_INTFCR_REG 0x10 /* Interface Ctrl Reg 32 */
-#define M1575_INTRCR_REG 0x14 /* Interrupt Ctrl Reg 32 */
-#define M1575_INTRSR_REG 0x18 /* Interrupt Status Reg 32 */
-#define M1575_FIFOCR2_REG 0x1C /* FIFO 2 Control Reg 32 */
-#define M1575_CPR_REG 0x20 /* Cmd Port Reg 32 */
-#define M1575_SPR_REG 0x24 /* Status Port Reg 32 */
-#define M1575_FIFOCR3_REG 0x2C /* FIFO 3 Control Reg 32 */
-#define M1575_TTSR_REG 0x30 /* Tx Tag Slot Reg 32 */
-#define M1575_RTSR_REG 0x34 /* Rx Tag Slot Reg 32 */
-#define M1575_CSPSR_REG 0x38 /* CSP Status Reg 32 */
-#define M1575_CASR_REG 0x3C /* Codec Access Sem Reg 32 */
-
-/* PCM IN Registers */
-#define M1575_PCMIBDBAR_REG 0x40 /* 32 */
-#define M1575_PCMICIV_REG 0x44 /* 8 */
-#define M1575_PCMILVIV_REG 0x45 /* 8 */
-#define M1575_PCMISR_REG 0x46 /* 16 */
-#define M1575_PCMIPICB_REG 0x48 /* 16 */
-#define M1575_PCMICR_REG 0x4B /* 8 */
-
-/* PCM OUT Registers */
-#define M1575_PCMOBDBAR_REG 0x50 /* 32 */
-#define M1575_PCMOCIV_REG 0x54 /* 8 */
-#define M1575_PCMOLVIV_REG 0x55 /* 8 */
-#define M1575_PCMOSR_REG 0x56 /* 16 */
-#define M1575_PCMOPICB_REG 0x58 /* 16 */
-#define M1575_PCMOCR_REG 0x5B /* 8 */
-
-/* MIC In Registers */
-#define M1575_MICIBDBAR_REG 0x60 /* 32 */
-#define M1575_MICICIV_REG 0x64 /* 8 */
-#define M1575_MICILVIV_REG 0x65 /* 8 */
-#define M1575_MICISR_REG 0x66 /* 16 */
-#define M1575_MICIPICB_REG 0x68 /* 16 */
-#define M1575_MICICR_REG 0x6B /* 8 */
-
-/* SPIDOF Registers */
-#define M1575_CSPOBDBAR_REG 0x70 /* 32 */
-#define M1575_CSPOCIV_REG 0x74 /* 8 */
-#define M1575_CSPOLVIV_REG 0x75 /* 8 */
-#define M1575_CSPOSR_REG 0x76 /* 16 */
-#define M1575_CSPOPICB_REG 0x78 /* 16 */
-#define M1575_CSPOCR_REG 0x7B /* 8 */
-
-/* PCM IN2 Registers */
-#define M1575_PCMI2BDBAR_REG 0xd0 /* 32 */
-#define M1575_PCMI2CIV_REG 0xd4 /* 8 */
-#define M1575_PCMI2LVIV_REG 0xd5 /* 8 */
-#define M1575_PCMI2SR_REG 0xd6 /* 16 */
-#define M1575_PCMI2PICB_REG 0xd8 /* 16 */
-#define M1575_PCMI2CR_REG 0xdB /* 8 */
-
-/* MIC2 IN2 Registers */
-#define M1575_MICI2BDBAR_REG 0xe0 /* 32 */
-#define M1575_MICI2CIV_REG 0xe4 /* 8 */
-#define M1575_MICI2LVIV_REG 0xe5 /* 8 */
-#define M1575_MICI2SR_REG 0xe6 /* 16 */
-#define M1575_MICI2PICB_REG 0xe8 /* 16 */
-#define M1575_MICI2CR_REG 0xeB /* 8 */
-
-/* Bits of FIFO Control Register1 */
-#define M1575_FIFOCR1_CSPORST 0x80000000 /* SPDIF Out Reset */
-#define M1575_FIFOCR1_MICIRST 0x00800000 /* MIC In Reset */
-#define M1575_FIFOCR1_PCMORST 0x00008000 /* PCM Out Reset */
-#define M1575_FIFOCR1_PCMIRST 0x00000080 /* PCM In Reset */
-
-/* Bits of FIFO Control Register2 */
-#define M1575_FIFOCR2_SPORST 0x80000000 /* SPDIF Out FIFO Reset */
-#define M1575_FIFOCR2_SPIRST 0x00800000 /* SPDIF In FIFO Reset */
-#define M1575_FIFOCR2_LFEORST 0x00008000 /* LFE Out FIFO Reset */
-#define M1575_FIFOCR2_CENORST 0x00000080 /* CENTER Out Reset */
-
-/* Bits of FIFO Control Register3 */
-#define M1575_FIFOCR3_PCMI2RST 0x00800000 /* PCM In2 FIFO Reset */
-#define M1575_FIFOCR3_MICI2RST 0x00008000 /* MIC In2 FIFO Reset */
-#define M1575_FIFOCR3_I2SIRST 0x00000080 /* I2S In FIFO Reset */
-
-/* Bits of DMA Control Register */
-#define M1575_DMACR_PCMISTART 0x00000001
-#define M1575_DMACR_PCMOSTART 0x00000002
-#define M1575_DMACR_MICISTART 0x00000004
-#define M1575_DMACR_CSPOSTART 0x00000008
-#define M1575_DMACR_CENOSTART 0x00000010
-#define M1575_DMACR_LFEOSTART 0x00000020
-#define M1575_DMACR_SPISTART 0x00000040
-#define M1575_DMACR_SPOSTART 0x00000080
-#define M1575_DMACR_I2SISTART 0x00000100
-#define M1575_DMACR_PCMI2START 0x00000200
-#define M1575_DMACR_MICI2START 0x00000400
-#define M1575_DMACR_PCMIPAUSE 0x00010000
-#define M1575_DMACR_PCMOPAUSE 0x00020000
-#define M1575_DMACR_MICIPAUSE 0x00040000
-#define M1575_DMACR_CSPOPAUSE 0x00080000
-#define M1575_DMACR_CENOPAUSE 0x00100000
-#define M1575_DMACR_LFEOPAUSE 0x00200000
-#define M1575_DMACR_SPIPAUSE 0x00400000
-#define M1575_DMACR_SPOPAUSE 0x00800000
-#define M1575_DMACR_I2SIPAUSE 0x01000000
-#define M1575_DMACR_PCMI2PAUSE 0x02000000
-#define M1575_DMACR_MICI2PAUSE 0x04000000
-
-#define M1575_DMACR_PAUSE_ALL 0x07ff0000
-
-/* Bits of INTRSR Interrupt Status Register */
-#define M1575_INTRSR_GPIOINTR 0x0000002
-#define M1575_INTRSR_SPRINTR 0x0000020
-#define M1575_INTRSR_CPRINTR 0x0000080
-#define M1575_INTRSR_PCMIINTR 0x0010000
-#define M1575_INTRSR_PCMOINTR 0x0020000
-#define M1575_INTRSR_MICIINTR 0x0040000
-#define M1575_INTRSR_CSPOINTR 0x0080000
-#define M1575_INTRSR_CENOINTR 0x0100000
-#define M1575_INTRSR_LFEOINTR 0x0200000
-#define M1575_INTRSR_SPIINTR 0x0400000
-#define M1575_INTRSR_SPOINTR 0x0800000
-#define M1575_INTRSR_I2SIINTR 0x1000000
-#define M1575_INTRSR_PCMI2INTR 0x2000000
-#define M1575_INTRSR_MICI2INTR 0x4000000
-
-#define M1575_INTR_MASK (M1575_INTRSR_GPIOINTR |\
- M1575_INTRSR_SPRINTR |\
- M1575_INTRSR_CPRINTR |\
- M1575_INTRSR_PCMIINTR |\
- M1575_INTRSR_PCMOINTR |\
- M1575_INTRSR_MICIINTR |\
- M1575_INTRSR_CSPOINTR |\
- M1575_INTRSR_CENOINTR |\
- M1575_INTRSR_LFEOINTR |\
- M1575_INTRSR_SPIINTR |\
- M1575_INTRSR_SPOINTR |\
- M1575_INTRSR_I2SIINTR |\
- M1575_INTRSR_PCMI2INTR|\
- M1575_INTRSR_MICI2INTR)
-
-#define M1575_UNUSED_INTR_MASK (M1575_INTRSR_GPIOINTR |\
- M1575_INTRSR_SPRINTR |\
- M1575_INTRSR_CPRINTR |\
- M1575_INTRSR_MICIINTR |\
- M1575_INTRSR_CSPOINTR |\
- M1575_INTRSR_CENOINTR |\
- M1575_INTRSR_LFEOINTR |\
- M1575_INTRSR_SPIINTR |\
- M1575_INTRSR_SPOINTR |\
- M1575_INTRSR_I2SIINTR |\
- M1575_INTRSR_PCMI2INTR|\
- M1575_INTRSR_MICI2INTR)
-
-/* Defines a generic clear for all MIC and PCM Status Registers */
-#define M1575_STATUS_CLR 0x001e
-
-/* Defines a generic RESET for all MIC and PCM Control Registers */
-#define M1575_CR_RR 0x02
-#define M1575_SR_DMACS 0x01
-
-/* Bits of PCM In Status Register */
-#define M1575_PCMISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_PCMISR_CELV 0x02
-#define M1575_PCMISR_LVBCI 0x04
-#define M1575_PCMISR_BCIS 0x08
-#define M1575_PCMISR_FIFOE 0x10
-
-/* Bits in PCM In Control Register */
-#define M1575_PCMICR_RR 0x02 /* Reset */
-#define M1575_PCMICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_PCMICR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits of PCM Out Status Register */
-#define M1575_PCMOSR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_PCMOSR_CELV 0x02
-#define M1575_PCMOSR_LVBCI 0x04
-#define M1575_PCMOSR_BCIS 0x08
-#define M1575_PCMOSR_FIFOE 0x10
-
-/* Bits in PCM Out Control Register */
-#define M1575_PCMOCR_RR 0x02 /* Reset */
-#define M1575_PCMOCR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_PCMOCR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits of MIC In Status Register */
-#define M1575_MICISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_MICISR_CELV 0x02
-#define M1575_MICISR_LVBCI 0x04
-#define M1575_MICISR_BCIS 0x08
-#define M1575_MICISR_FIFOE 0x10
-
-/* Bits in PCM In Control Register */
-#define M1575_MICICR_RR 0x02 /* Reset */
-#define M1575_MICICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_MICICR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits in System Control Register */
-#define M1575_SCR_WARMRST 0x00000001
-#define M1575_SCR_COLDRST 0x00000002
-#define M1575_SCR_DRENT 0x40000000
-#define M1575_SCR_MSTRST 0x80000000
-
-/* Bits in System Status Register */
-#define M1575_SSR_RSTBLK 0x00000002
-#define M1575_SSR_FACCS_MSK 0x00000018
-#define M1575_SSR_SCID 0x00000040
-
-/* Bits in Command Port Register */
-#define M1575_CPR_ACSCS 0x0100 /* Audio Codec for cmd 1=codec 2 */
-#define M1575_CPR_READ 0x0080
-
-/* Bits in Cmd Status Port Register */
-#define M1575_CSPSR_SUCC 0x08 /* cmd successful */
-#define M1575_CSPSR_RDRDY 0x02 /* ready for read cmd */
-#define M1575_CSPSR_WRRDY 0x01 /* ready for write cmd */
-#define M1575_PCMI2CR_RR 0x02 /* Reset */
-#define M1575_MICI2CR_RR 0x02 /* Reset */
-#define M1575_CSPOCR_RR 0x02 /* Reset */
-
-/* Bits in Interface Control Register */
-#define M1575_INTFCR_RSTREL 0x02000000
-#define M1575_INTFCR_RSTBLK 0x00200000
-#define M1575_INTFCR_MICENB 0x00100000
-#define M1575_INTFCR_PCMIENB 0x00080000
-#define M1575_INTFCR_MICI2ENB 0x00040000
-#define M1575_INTFCR_PCMI2ENB 0x00020000
-#define M1575_INTFCR_MICI2SEL 0x00008000
-#define M1575_INTFCR_MICISEL 0x00004000
-#define M1575_INTFCR_PCMOENB 0x00000002
-
-#define M1575_INTRCR_CPRINTR 0x00000080
-#define M1575_INTRCR_SPRINTR 0x00000020
-#define M1575_INTRCR_GPIOINTR 0x00000002
-
-/* Bits of Recv Tag Slot Register */
-#define M1575_RTSR_SACRDY 0x20u /* 2nd Audio Codec Rdy */
-#define M1575_RTSR_FACRDY 0x80u /* 1st Audio Codec Rdy */
-
-/* Semaphore busy */
-#define M1575_CASR_SEMBSY 0x80000000
-
-/* AD1981 codec vendor ID */
-#define AD1981_VID1 0x4144
-#define AD1981_VID2 0x5374
-
-/* AD1981B Codec Registers */
-#define AD1981_RESET_REG 0x00
-#define AD1981_MSTVOL_REG 0x02
-#define AD1981_HPHVOL_REG 0x04
-#define AD1981_MONOVOL_REG 0x06
-#define AD1981_MICVOL_REG 0x0E
-#define AD1981_CDVOL_REG 0x12
-#define AD1981_PCMOVOL_REG 0x18
-#define AD1981_RECSEL_REG 0x1A
-#define AD1981_RECGAIN_REG 0x1C
-#define AD1981_GENPUR_REG 0x20
-#define AD1981_PWRCSR_REG 0x26
-#define AD1981_EXTID_REG 0x28
-#define AD1981_EXTCSR_REG 0x2A
-#define AD1981_PCMDAC_REG 0x2C
-#define AD1981_PCMADC_REG 0x32
-#define AD1981_EQCTRL_REG 0x60
-#define AD1981_EQDATA_REG 0x62
-#define AD1981_MIXVOL_REG 0x64
-#define AD1981_MISCTRL_REG 0x76
-#define AD1981_VNDID1_REG 0x7C
-#define AD1981_VNDID2_REG 0x7E
-
-/* AD1981B Biquad filter definitions */
-#define AD1981_MAX_FILTERS 35
-#define AD1981_EQCTRL_EQM 0x8000
-#define AD1981_EQCTRL_SYM 0x0080
-
-/*
- * Equalizer Biquad Filter Coefficient Address offsets
- */
-struct m1575_biquad {
- uint16_t addr;
- uint16_t coeff;
-};
-typedef struct m1575_biquad m1575_biquad_t;
-
-/*
- * chunk buffer
- */
-struct m1575_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct m1575_bdlist_chunk m1575_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct m1575_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- m1575_bdlist_chunk_t chunk[M1575_BD_NUMS];
-};
-typedef struct m1575_sample_buf m1575_sample_buf_t;
-
-/*
- * buffer descripter list entry, see M1575 datasheet
- */
-#define IOC 0x8000
-#define BUP 0x4000
-
-struct m1575_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t buf_cmd;
-};
-typedef struct m1575_bd_entry m1575_bd_entry_t;
-
-/*
- * PCI config space register layout
- */
-struct audio1575_pci_regs {
- uint32_t vendor_dev_id; /* 00h - 03h */
- uint32_t cmd_status_reg; /* 04h - 07h */
- uint32_t class_code_rev_id; /* 08h - 0bh */
- uint32_t bist_cache; /* 0ch - 0fh */
- uint32_t io_base; /* 10h - 13h */
- uint32_t mem_base; /* 14h - 17h */
- uint32_t rsvd1[4]; /* 18h - 28h */
- uint32_t sub_ids; /* 2ch - 2fh */
- uint32_t rsvd2; /* 30h - 33h */
- uint32_t cap_ptr; /* 34h - 37h */
- uint32_t rsvd3; /* 38h - 3bh */
- uint32_t intr_line; /* 3ch - 3fh */
- uint16_t cap_id_next; /* 40h - 41h */
- uint16_t pm_cap; /* 42h - 43h */
- uint16_t pm_csr; /* 44h - 45h */
- uint8_t pm_csrbse; /* 46h - 46h */
- uint8_t data_reg; /* 47h - 47h */
- uint16_t sccr_reg; /* 48h - 49h */
- uint16_t subvendor_id; /* 50h - 51h */
- uint16_t subdevice_id; /* 52h - 53h */
- uint8_t apmucr1_reg; /* 54h */
- uint8_t apmucr2_reg; /* 55h */
- uint8_t itec; /* 56h */
- uint8_t scrr_reg; /* 57h */
- uint8_t misc_reg; /* 58h */
- uint8_t gcc_reg; /* 59h */
- uint16_t rsvd5; /* 5ah - 5bh */
- uint8_t ac97acd_reg; /* 5ch */
- uint8_t rsvd6[3]; /* 5dh - 5fh */
- uint8_t msi_capid; /* 60h */
- uint8_t msi_next; /* 61h */
- uint16_t msi_ctrl; /* 62h - 63h */
- uint32_t msi_addr; /* 64h - 67h */
- uint16_t msi_data; /* 68h - 69h */
- uint16_t rsvd7; /* 6ah - 6bh */
- uint32_t msi_mask; /* 6ch - 6fh */
- uint32_t msi_pend; /* 70h - 73h */
- uint16_t rsrvd8[39]; /* 74h - c1h */
- uint16_t smodem_devid; /* c2h - c3h */
-};
-typedef struct audio1575_pci_regs audio1575_pci_regs_t;
-
-/*
- * M1575 audio register layout
- */
-struct audio1575_audio_regs {
- uint32_t scr_reg; /* 00h - 03h */
- uint32_t ssr_reg; /* 04h - 07h */
- uint32_t dmacr_reg; /* 08h - 0bh */
- uint32_t fifocr1_reg; /* 0ch - 0fh */
- uint32_t intfcr_reg; /* 10h - 13h */
- uint32_t intrcr_reg; /* 14h - 17h */
- uint32_t intrsr_reg; /* 18h - 1bh */
- uint32_t fifocr2_reg; /* 1ch - 1fh */
- uint32_t cpr_reg; /* 20h - 23h */
- uint32_t spr_reg; /* 24h - 27h */
- uint32_t rsvd1; /* 28h - 2bh */
- uint32_t fifocr3_reg; /* 2ch - 2fh */
- uint32_t ttsr_reg; /* 30h - 33h */
- uint32_t rtsr_reg; /* 34h - 37h */
- uint32_t cspsr_reg; /* 38h - 3bh */
- uint32_t casr_reg; /* 3ch - 3fh */
- uint32_t pcmibdbar_reg; /* 40h - 43h */
- uint8_t pcmciv_reg; /* 44h - 44h */
- uint8_t pcmilviv_reg; /* 45h - 45h */
- uint16_t pcmisr_reg; /* 46h - 47h */
- uint16_t pcmipicb_reg; /* 48h - 49h */
- uint8_t rsvd2; /* 4ah - 4ah */
- uint8_t pcmicr_reg; /* 4bh - 4bh */
- uint32_t rsvd3; /* 4ch - 4fh */
- uint32_t pcmobdbar_reg; /* 50h - 53h */
- uint8_t pcmociv_reg; /* 54h - 54h */
- uint8_t pcmolviv_reg; /* 55h - 55h */
- uint16_t pcmosr_reg; /* 56h - 57h */
- uint16_t pcmopicb_reg; /* 58h - 59h */
- uint8_t rsvd4; /* 5ah - 5ah */
- uint8_t pcmocr_reg; /* 5bh - 5bh */
- uint32_t rsvd5; /* 5ch - 5fh */
- uint32_t micibdbar_reg; /* 60h - 63h */
- uint8_t miciciv_reg; /* 64h - 64h */
- uint8_t micilviv_reg; /* 65h - 65h */
- uint16_t micisr_reg; /* 66h - 67h */
- uint16_t micipicb_reg; /* 68h - 69h */
- uint8_t rsvd6; /* 6ah - 6ah */
- uint8_t micicr_reg; /* 6bh - 6bh */
- uint32_t rsvd7; /* 6ch - 6fh */
- uint32_t cspobdbar_reg; /* 70h - 53h */
- uint8_t cspociv_reg; /* 74h - 74h */
- uint8_t cspolviv_reg; /* 75h - 75h */
- uint16_t csposr_reg; /* 76h - 77h */
- uint16_t cspopicb_reg; /* 78h - 79h */
- uint8_t rsvd8; /* 7ah - 7ah */
- uint8_t cspocr_reg; /* 7bh - 7bh */
- uint32_t rsvd9[21]; /* 7ch - cfh */
- uint32_t pcmi2bdbar_reg; /* d0h - d3h */
- uint8_t pcmi2civ_reg; /* d4h - d4h */
- uint8_t pcmi2lviv_reg; /* d5h - d5h */
- uint16_t pcmi2sr_reg; /* d6h - d7h */
- uint16_t pcmi2picb_reg; /* d8h - d9h */
- uint8_t rsvd10; /* dah - dah */
- uint8_t pcmi2cr_reg; /* dbh - dbh */
- uint32_t rsvd11; /* dch - dfh */
- uint32_t mici2bdbar_reg; /* e0h - e3h */
- uint8_t mici2civ_reg; /* e4h - e4h */
- uint8_t mici2lviv_reg; /* e5h - e5h */
- uint16_t mici2sr_reg; /* e6h - e7h */
- uint16_t mici2picb_reg; /* e8h - e9h */
- uint8_t rsvd12; /* eah - eah */
- uint8_t mici2cr_reg; /* ebh - ebh */
- uint32_t rsvd13; /* ech - efh */
- uint32_t hvcsr_reg; /* f0h - f3h */
- uint32_t rsvd14[3]; /* f4h - ffh */
-};
-typedef struct audio1575_audio_regs audio1575_audio_regs_t;
-
-/*
- * audio1575_state_t per instance state and operation data
- */
-struct audio1575_state {
- kmutex_t m1575_intr_mutex; /* intr mutex */
- dev_info_t *m1575_dip; /* dev instance ptr */
- int m1575_inst; /* dev instance */
- int m1575_intr_type; /* intr type */
- uint_t m1575_intr_pri; /* intr priority */
- ddi_intr_handle_t *m1575_h_table; /* intr table ptr */
- audiohdl_t m1575_ahandle; /* audio handle */
- am_ad_info_t m1575_ad_info; /* audio device info */
- uint16_t m1575_codec_shadow[64]; /* shadow AC97 regs */
- ddi_acc_handle_t m1575_pci_regs_handle; /* pci config space */
- ddi_acc_handle_t m1575_am_regs_handle; /* audio i/o regs */
- ddi_acc_handle_t m1575_bm_regs_handle; /* audio mem regs */
- audio1575_pci_regs_t *m1575_pci_regs; /* base of pci regs */
- audio1575_audio_regs_t *m1575_am_regs; /* base of i/o regs */
- audio1575_audio_regs_t *m1575_bm_regs; /* base of mem regs */
- ddi_dma_handle_t m1575_bdl_dma_handle; /* for BDL */
- ddi_acc_handle_t m1575_bdl_acc_handle; /* acc handle of BDL */
- void *m1575_bdl_virtual; /* virt addr of BDL */
- size_t m1575_bdl_size; /* real len of BDL */
- m1575_bd_entry_t *m1575_bdl_virt_pin; /* vaddr PCMIN BDL */
- m1575_bd_entry_t *m1575_bdl_virt_pout; /* vaddr PCMOUT BDL */
- uint32_t m1575_bdl_phys_pin; /* physadr PCMIN BDL */
- uint32_t m1575_bdl_phys_pout; /* physadr PCMOUT BDL */
- audio_info_t m1575_defaults; /* default states */
- audio_device_t m1575_dev_info; /* audio device info */
- uint16_t m1575_vol_bits_mask; /* volume ctrl bits */
- kstat_t *m1575_ksp; /* kernel statistics */
- uint32_t m1575_flags; /* state flags */
- uint_t m1575_cdrom; /* 1= present, 0 not */
- uint_t m1575_mode; /* MIXER/COMPAT_MODE */
- uint_t m1575_psample_rate; /* play sample rate */
- uint_t m1575_pchannels; /* play channels */
- uint_t m1575_pprecision; /* play precision */
- uint_t m1575_csample_rate; /* record sample rate */
- uint_t m1575_cchannels; /* record channels */
- uint_t m1575_cprecision; /* record precision */
- uint_t m1575_output_port; /* current out port */
- uint_t m1575_input_port; /* current input port */
- uint_t m1575_monitor_gain; /* monitor gain */
- int m1575_csamples; /* pcmin samples/int */
- int m1575_psamples; /* pcmout samples/int */
- uint32_t m1575_res_flags; /* resource flags */
- m1575_sample_buf_t m1575_play_buf; /* buf for playback */
- int m1575_play_buf_size; /* size of in buf */
- m1575_sample_buf_t m1575_record_buf; /* buffer for record */
- int m1575_record_buf_size; /* size of in buffer */
-};
-typedef struct audio1575_state audio1575_state_t;
-
-/* audio1575_state_t.flags defines */
-#define M1575_DMA_PLAY_STARTED 0x0001u /* play DMA eng. initialized */
-#define M1575_DMA_PLAY_PAUSED 0x0002u /* play DMA engine paused */
-#define M1575_DMA_PLAY_EMPTY 0x0004u /* play DMA engine empty */
-#define M1575_DMA_RECD_STARTED 0x0010u /* record DMA engine started */
-#define M1575_DMA_SUSPENDED 0x0020u /* DMA suspended flag */
-
-/* bits of audio1575_state_t.m1575_res_flags */
-#define M1575_RS_PCI_REGS 0x0001
-#define M1575_RS_AM_REGS 0x0002
-#define M1575_RS_BM_REGS 0x0004
-#define M1575_RS_DMA_BDL_HANDLE 0x0008
-#define M1575_RS_DMA_BDL_MEM 0x0010
-#define M1575_RS_DMA_BDL_BIND 0x0020
-
-/* PCI Config register macros */
-#define M1575_PCI_GET8(reg) \
- ddi_get8(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_GET16(reg) \
- ddi_get16(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_GET32(reg) \
- ddi_get32(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_PUT8(reg, val) \
- ddi_put8(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-#define M1575_PCI_PUT16(reg, val) \
- ddi_put16(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-#define M1575_PCI_PUT32(reg, val) \
- ddi_put32(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-/* audio i/o register macros */
-#define M1575_AM_GET8(reg) \
- ddi_get8(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_GET16(reg) \
- ddi_get16(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_GET32(reg) \
- ddi_get32(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_PUT8(reg, val) \
- ddi_put8(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-#define M1575_AM_PUT16(reg, val) \
- ddi_put16(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-#define M1575_AM_PUT32(reg, val) \
- ddi_put32(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-/* audio memory bus master registers */
-#define M1575_BM_GET8(reg) \
- ddi_get8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_GET16(reg) \
- ddi_get16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_GET32(reg) \
- ddi_get32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_PUT8(reg, val) { \
- uint8_t __T; \
- ddi_put8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#define M1575_BM_PUT16(reg, val) { \
- uint16_t __T; \
- ddi_put16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#define M1575_BM_PUT32(reg, val) { \
- uint32_t __T; \
- ddi_put32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO1575_IMPL_H_ */