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

Subversion Repositories s6soc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /s6soc/trunk
    from Rev 44 to Rev 45
    Reverse comparison

Rev 44 → Rev 45

/sw/dev/Makefile
46,7 → 46,7
##
##
all:
PROGRAMS := helloworld doorbell doorbell2 kptest
PROGRAMS := helloworld doorbell doorbell2 kptest blinky
all: $(OBJDIR)/ $(PROGRAMS)
 
 
60,47 → 60,66
 
# Not for build, for for building tags and dependency files, we need to know
# what the sources and headers are
DEVDRVR:= keypad.c display.c rtcsim.c
DEVDRVR:= keypad.c display.c rtcsim.c txfns.c
SOURCES:= helloworld.c doorbell.c doorbell2.c kptest.c $(DEVDRVR)
HEADERS:= board.h
# OBJECTS:= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(SOURCES)))
OBJDRVR := $(addprefix $(OBJDIR)/,$(subst .c,.o,$(DEVDRVR)))
 
 
CPPFLAGS := -I../zipos -I.
CFLAGS := -O3 -Wall -Wextra -nostdlib -fno-builtin
DUMPFLAGS := # -fdump-rtl-all
CFLAGS := $(CPPFLAGS) $(DUMPFLAGS) -O3 -Wall -Wextra -nostdlib -fno-builtin -Wa,-nocis
LDFLAGS = -T cmod.ld -Wl,-Map,$(OBJDIR)/$@.map -Wl,--unresolved-symbols=report-all -nostdlib
 
$(OBJDIR)/:
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"
$(mk-objdir)
 
%.o: $(OBJDIR)/%.o
 
$(OBJDIR)/%.o: %.c
$(mk-objdir)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o: ../zipos/%.c
$(mk-objdir)
$(CC) $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.s: %.c
$(mk-objdir)
$(CC) -S $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.txt: $(OBJDIR)/%.o
$(mk-objdir)
$(OBJDUMP) -dr $^ > $@
%.txt: %
$(OBJDUMP) -Dr $< > $@
 
 
helloworld: $(OBJDIR)/ $(OBJDIR)/helloworld.o cmod.ld
helloworld: $(OBJDIR)/helloworld.o cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/helloworld.o -o $@
$(OBJDIR)/helloworld.txt: helloworld
$(OBJDUMP) -dr $^ > $@
 
doorbell2: $(OBJDIR)/ $(OBJDIR)/doorbell2.o $(OBJDRVR) cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/doorbell2.o $(OBJDRVR) -o $@
doorbell: $(OBJDIR)/doorbell.o cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/doorbell.o -o $@
 
doorbell2: $(OBJDIR)/doorbell2.o $(OBJDRVR) $(OBJDIR)/string.o cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/doorbell2.o $(OBJDRVR) $(OBJDIR)/string.o -o $@
$(OBJDIR)/doorbell2.txt: doorbell2
$(OBJDUMP) -dr $^ > $@
 
kptest: $(OBJDIR)/ $(OBJDIR)/kptest.o $(OBJDRVR) cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/kptest.o $(OBJDRVR) -o $@
KPSRCS := kptest.c keypad.c txfns.c
KPOBJS := $(addprefix $(OBJDIR)/,$(subst .c,.o,$(KPSRCS)))
kptest: $(KPOBJS) cmod.ld
$(CC) $(LDFLAGS) $(KPOBJS) -o $@
$(OBJDIR)/kptest.txt: kptest
$(OBJDUMP) -dr $^ > $@
 
blinky: $(OBJDIR)/blinky.o cmod.ld
$(CC) $(LDFLAGS) $(OBJDIR)/blinky.o -o $@
 
define mk-objdir
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"
endef
 
define build-depends
@echo "Building dependency file(s)"
$(CC) $(CPPFLAGS) -MM $(SOURCES) > $(OBJDIR)/xdep.txt
/sw/dev/asmstartup.h
52,8 → 52,16
"\t.global\t_start\n"
"\t.type\t_start,@function\n"
"_start:\n"
"LDI\t_top_of_stack,SP\n"
"\tBRA\tentry\n"
"\tNDUMP\n"
"\tMOV\tkernel_exit(PC),uPC\n"
"\tLDI\t255,R0\n"
"\tSW\tR0,0x414\n"
"\tLDI\t_top_of_stack,SP\n"
"\tJSR\tentry\n"
"NEXIT\tR0\n"
"kernel_exit:\n"
"\tHALT\n"
"\tBRA\tkernel_exit\n"
"\t.section\t.text");
 
#endif
/sw/dev/board.h
59,9 → 59,8
#define INT_BUTTON 0x001
#define INT_BUSERR 0x002 // Kind of useless, a buserr will kill us anyway
#define INT_SCOPE 0x004
#define INT_RTC 0x008 // May not be available, due to lack of space
#define INT_TIMA 0x010
#define INT_TIMB 0x020
#define INT_TIMER 0x010
//#define INT_WATCHDOG 0x020 // Catching a watchdog/reset interrupt makes no sense
#define INT_UARTRX 0x040
#define INT_UARTTX 0x080
#define INT_KEYPAD 0x100
69,8 → 68,10
#define INT_GPIO 0x400
// #define INT_FLASH 0x800 // Not available due to lack of space
#define INT_ENABLEV(IN) (INT_ENABLE|((IN)<<16))
#define INT_DISABLEV(IN) (INT_ENABLE|((IN)<<16))
#define INT_DISABLEV(IN) ((IN)<<16)
#define INT_CLEAR(IN) (IN)
#define INT_CLEARPIC 0x7fff7fff
#define INT_DALLPIC 0x7fff0000
 
// Clocks per second, for use with the timer
#define TM_ONE_SECOND 80000000
77,42 → 78,44
#define TM_REPEAT 0x80000000
 
typedef struct {
volatile int io_pic;
volatile unsigned *io_buserr;
volatile int io_tima, io_timb;
volatile unsigned io_pwm_audio;
volatile unsigned io_spio; // aka keypad, buttons, and keyboard
volatile unsigned io_gpio;
volatile unsigned io_uart;
volatile unsigned io_version;
int io_pic;
unsigned *io_buserr;
int io_timer, io_watchdog;
unsigned io_pwm_audio;
unsigned io_spio; // aka keypad, buttons, and keyboard
unsigned io_gpio;
unsigned io_uart;
unsigned io_version;
} IOSPACE;
 
typedef struct {
volatile unsigned s_control, s_data;
} SCOPE;
 
typedef struct {
volatile unsigned f_crc, f_far_maj, f_far_min, f_fdri,
f_fdro, f_cmd, f_ctl, f_mask,
f_stat, f_lout, f_cor1, f_cor2,
f_pwrdn, f_flr, f_idcode, f_cwdt,
f_hcopt, f_csbo, f_gen1, f_gen2,
f_gen3, f_gen4, f_gen5, f_mode,
f_gwe, f_mfwr, f_cclk, f_seu, f_exp, f_rdbk,
f_bootsts, f_eye, f_cbc;
} FPGACONFIG;
#define WBSCOPE_NO_RESET 0x80000000
#define WBSCOPE_MANUAL WBSCOPE_TRIGGER
//
#define WBSCOPE_STOPPED 0x40000000
#define WBSCOPE_TRIGGERED 0x20000000
#define WBSCOPE_PRIMED 0x10000000
#define WBSCOPE_TRIGGER (0x08000000|WBSCOPE_NO_RESET)
#define WBSCOPE_DISABLED 0x04000000
#define WBSCOPE_DISABLE 0x04000000 // Disable the scope trigger
#define WBSCOPE_RZERO 0x02000000 // Unused,true if ptd at begning
#define WBSCOPE_LGLEN(A) ((A>>20)&0x01f)
#define WBSCOPE_LENGTH(A) (1<<(WBSCOPE_LGLEN(A)))
 
typedef struct {
volatile unsigned c_clock, c_timer, c_stopwatch, c_alarm;
} RTCCLOCK;
typedef struct WBSCOPE_S {
unsigned s_ctrl, s_data;
} WBSCOPE;
 
#define IOADDR 0x000100
#define SCOPEADDR 0x000200
// #define FCTLADDR 0x000300 // Flash control, depends upon write capability
#define CONFIGADDR 0x000400
// #define RTCADDR 0x000800 // Disabled for lack of space on device
#define RAMADDR 0x002000
#define FLASHADDR 0x400000
#define RESET_ADDR 0x480000
#define IOADDR 0x000400
#define SCOPEADDR 0x000800
// #define FCTLADDR 0x000c00 // Flash control, depends upon write capability
#define RAMADDR 0x004000
#define RAMSZ (RAMADDR)
#define FLASHADDR 0x1000000
#define RESET_ADDR 0x1200000
#define FLASHSZ (FLASHADDR)
 
static volatile IOSPACE *const _sys = (IOSPACE *)IOADDR;
static volatile WBSCOPE *const _scope = (WBSCOPE *)SCOPEADDR;
 
#endif
/sw/dev/cmod.ld
34,18 → 34,18
 
MEMORY
{
blkram (wx) : ORIGIN = 0x002000, LENGTH = 0x001000
flash (rx) : ORIGIN = 0x400000, LENGTH = 0x400000
blkram (wx) : ORIGIN = 0x0004000, LENGTH = 0x0004000
flash (rx) : ORIGIN = 0x1000000, LENGTH = 0x1000000
}
 
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 1;
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 4;
 
SECTIONS
{
. = 0x0480000;
.rocode 0x0480000 : { *(.start) *(.text)
*(.rodata)
*(.strings) } > flash
.data : { *(.fixdata) *(.data) *(COMMON) *(.bss) } > blkram
. = 0x1200000;
.rocode 0x1200000 : { *(.start) *(.text*)
*(.rodata*)
*(.strings*) } > flash
.data : { *(.fixdata*) *(.data*) *(COMMON*) *(.bss*) } > blkram
_top_of_heap = .;
}
/sw/dev/display.c
13,7 → 13,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
55,43 → 55,29
} while(i-->0);
}
 
void dispchar(int ch) {
void dispchar(char ch) {
if (!ch) // Don't display null characters
return;
if (ch&(~0x0ff)) { // Multiple characters to display
int v = (ch>>24)&0x0ff;
if (v) {
dispchar(v);
v = (ch>>16)&0x0ff;
if (v) {
dispchar(v);
v = (ch>> 8)&0x0ff;
if (v) {
dispchar(v);
dispchar(ch&0x0ff);
}
}
}
} else {
IOSPACE *sys = (IOSPACE *)IOADDR;
// Send the character
for(int i=0; i<8; i++) {
int gpiov = GPOCLRV(GPO_MOSI|GPO_SCK|GPO_SS);
if (ch&0x80)
gpiov |= GPOSETV(GPO_MOSI);
sys->io_gpio = gpiov;
dispwait();
sys->io_gpio = GPOSETV(GPO_SCK);
dispwait();
ch<<=1;
}
// Turn off the clock
sys->io_gpio = GPOCLRV(GPO_SCK);
int ich = ch;
 
// Send the character
for(int i=0; i<8; i++) {
int gpiov = GPOCLRV(GPO_MOSI|GPO_SCK|GPO_SS);
if (ich&0x80)
gpiov |= GPOSETV(GPO_MOSI);
_sys->io_gpio = gpiov;
dispwait();
// Then the port
sys->io_gpio = GPOSETV(GPO_SS);
_sys->io_gpio = GPOSETV(GPO_SCK);
dispwait();
ich<<=1;
}
 
// Turn off the clock
_sys->io_gpio = GPOCLRV(GPO_SCK);
dispwait();
// Then the port
_sys->io_gpio = GPOSETV(GPO_SS);
dispwait();
}
 
#ifdef ZIPOS
99,7 → 85,7
#include "../zipos/kfildes.h"
void display_task(void) {
while(1) {
int ch;
char ch;
read(FILENO_STDIN, &ch, 1);
dispchar(ch);
}
/sw/dev/display.h
13,7 → 13,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
40,8 → 40,7
#ifndef DISPLAY_H
#define DISPLAY_H
 
#define PACK(A,B,C,D) (((A)<<24)|((B)<<16)|((C)<<8)|(D))
extern void dispchar(int ch);
extern void dispchar(char ch);
 
#ifdef ZIPOS
extern void displaytask(void);
/sw/dev/doorbell.c
12,7 → 12,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
44,9 → 44,9
const char msg[] = "Doorbell!\r\n\r\n";
 
void entry(void) {
register IOSPACE *sys = (IOSPACE *)0x0100;
register volatile IOSPACE *const sys = _sys;
 
sys->io_timb = 0;
sys->io_watchdog = 0;
sys->io_pic = 0x07fffffff; // Acknowledge and turn off all interrupts
 
sys->io_spio = 0x0f4;
53,43 → 53,31
sys->io_pwm_audio = 0x0110000;
while(1) {
int seconds = 0, pic;
const int *ptr;
const unsigned short *ptr;
const char *mptr = msg;
sys->io_tima = TM_ONE_SECOND | TM_REPEAT; // Ticks per second, 80M
sys->io_timer = TM_ONE_SECOND | TM_REPEAT; // Ticks per second, 80M
 
sys->io_spio = 0x0f0;
ptr = sound_data;
ptr = (const unsigned short *)sound_data;
sys->io_pwm_audio = 0x0310000;
if (ptr == sound_data)
sys->io_spio = 0x0f1;
while(ptr < &sound_data[NSAMPLE_WORDS]) {
sys->io_spio = 0x0f1;
while(ptr <(const unsigned short *)&sound_data[NSAMPLE_WORDS]) {
unsigned this_sample;
sys->io_spio = 0x022;
do {
pic = sys->io_pic;
if (pic & INT_TIMA)
if (pic & INT_TIMER)
seconds++;
if ((pic & INT_UARTTX)&&(*mptr))
sys->io_uart = *mptr++;
sys->io_pic = (pic & 0x07fff);
} while((pic & INT_AUDIO)==0);
sys->io_pwm_audio = (*ptr >> 16)&0x0ffff;
this_sample = (*ptr++); // & 0x0ffff;
sys->io_pwm_audio = this_sample;
// Now, turn off the audio interrupt since it doesn't
// reset itself ...
sys->io_pic = INT_AUDIO;
 
do {
pic = sys->io_pic;
if (pic & INT_TIMA)
seconds++;
if ((pic & INT_UARTTX)&&(*mptr))
sys->io_uart = *mptr++;
sys->io_pic = (pic & 0x07fff);
} while((pic & INT_AUDIO)==0);
sys->io_pwm_audio = (*ptr++) & 0x0ffff;
 
// and turn off the audio interrupt again ...
sys->io_pic = INT_AUDIO;
} if (ptr >= &sound_data[NSAMPLE_WORDS])
} if (ptr >= (const unsigned short *)&sound_data[NSAMPLE_WORDS])
sys->io_spio = 0x044;
 
sys->io_spio = 0x088;
96,7 → 84,7
sys->io_pwm_audio = 0;
while(seconds < 10) {
pic = sys->io_pic;
if (pic & INT_TIMA)
if (pic & INT_TIMER)
seconds++;
sys->io_pic = (pic & 0x07fff);
}
/sw/dev/doorbell2.c
4,8 → 4,9
//
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
//
// Purpose: A modification to the original doorbell.c program.
// seconds. Listening to that test is ... getting old.
// Purpose: A modification to the original doorbell.c program that played
// a doorbell sound every ten seconds. Listening to that test is
// ... getting old.
//
// Let's let this one do the following:
// 1. Display the time on the display (it will be impossible to
25,7 → 26,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
53,6 → 54,8
#include "board.h"
#include "rtcsim.h"
#include "display.h"
#include "string.h"
#include "txfns.h"
 
#include "samples.c"
 
61,14 → 64,31
void build_dpymsg(char *msg, unsigned clkval);
void build_uartmsg(char *msg, unsigned clkval);
void showval(int val);
void txval(int val);
 
#define CLEAR_WATCHDOG _sys->io_watchdog = 0
#define TOUCH_WATCHDOG _sys->io_watchdog = 500000
 
void entry(void) {
register IOSPACE *sys = (IOSPACE *)0x0100;
char dpymsg[16], *dpyptr;
char uartmsg[40], *uartptr;
register volatile IOSPACE *const sys = _sys;
char dpymsg[64], *dpyptr;
char uartmsg[160], *uartptr;
int newmsgtime = 0, leastmsgtime = -1, lstmsgtime = 0;
 
CLEAR_WATCHDOG;
 
txstr("\r\nREBOOT!\r\n");
txstr("Scope Control = "); txval(_scope->s_ctrl);
if (_scope->s_ctrl & WBSCOPE_STOPPED) {
int ln = WBSCOPE_LENGTH(_scope->s_ctrl);
for(int i=0; i<ln; i++)
txval(_scope->s_data);
txval((int)_sys->io_buserr);
txstr("\r\n\r\nEndScope\r\n");
} else {
txstr("\r\n");
_scope->s_ctrl = 20;
}
 
dpymsg[0] = 0;
dpyptr = dpymsg;
 
76,16 → 96,16
build_uartmsg(uartmsg, 0);
uartptr = uartmsg;
 
sys->io_timb = 0;
sys->io_pic = 0x07fffffff; // Acknowledge and turn off all interrupts
sys->io_watchdog = 0;
sys->io_pic = INT_CLEARPIC; // Acknowledge and turn off all interrupts
 
sys->io_spio = 0x0f4;
newmsgtime = sys->io_tima;
newmsgtime = sys->io_timer;
leastmsgtime = -1;
lstmsgtime = newmsgtime;
while(1) {
int seconds, pic;
const int *sptr;
const short *sptr;
 
// LED's off ... nothing to report
sys->io_spio = 0x0f0;
94,16 → 114,14
sys->io_pwm_audio = 0x0018000;
 
// Set for one ticks per second, 80M clocks per tick
sys->io_tima = TM_ONE_SECOND | TM_REPEAT;
sys->io_timer = TM_ONE_SECOND | TM_REPEAT;
 
// We start by waiting for a doorbell
while(((pic=sys->io_pic) & INT_BUTTON)==0) {
if (uartmsg[10] == 0) {
sys->io_spio = 0x0fe;
zip_halt();
}
if (pic & INT_TIMA) {// top of second
sys->io_pic = INT_TIMA;
TOUCH_WATCHDOG;
 
if (pic & INT_TIMER) {// top of second
sys->io_pic = INT_TIMER;
rtcclock = rtcnext(rtcclock);
 
// Turn all LED off (again)
118,53 → 136,27
 
// Turn one LED on--top of minute
sys->io_spio = 0x0f1;
newmsgtime = sys->io_tima;
newmsgtime = sys->io_timer;
lstmsgtime = -1;
leastmsgtime = -1;
}
}
/*
if (uartmsg[10] == 0) {
sys->io_spio = 0x0fc;
zip_halt();
}
*/
 
if (*uartptr) {
if (pic & INT_UARTTX) {
sys->io_uart = *uartptr++;
sys->io_spio = 0x22;
sys->io_pic = INT_UARTTX;
if (uartptr > &uartmsg[13]) {
sys->io_spio = 0x0fd;
zip_halt();
}
 
if (lstmsgtime != -1) {
int tmp;
tmp = (lstmsgtime-sys->io_tima);
tmp = (lstmsgtime-sys->io_timer);
if ((leastmsgtime<0)||(tmp<leastmsgtime))
leastmsgtime = tmp;
} lstmsgtime = sys->io_tima;
} lstmsgtime = sys->io_timer;
}
} else {
sys->io_spio = 0x20;
/*
if (newmsgtime != 0) {
int thistime = sys->io_tima;
thistime = newmsgtime - thistime;
showval(thistime);
txval(thistime);
txval(leastmsgtime);
txval(lstmsgtime);
zip_halt();
newmsgtime = 0;
}
for(int i=0; i<12; i++)
if (uartmsg[i] == 0) {
sys->io_spio = i+0xf0;
zip_halt();
}
*/
}
if (*dpyptr) {
// This will take a long time. It should be an
174,31 → 166,18
sys->io_spio = 0x44;
} else {
sys->io_spio = 0x40;
} // sys->io_pic = (pic & (INT_TIMA|INT_UARTTX));
} // sys->io_pic = (pic & (INT_TIMER|INT_UARTTX));
}
 
TOUCH_WATCHDOG;
// DOORBELL!!!!!!
// Set the Display message
dpymsg[0] = (0x1b<<24)|('['<<16)|('j'<<8)|'D';
dpymsg[1] = ('o'<<24)|('o'<<16)|('r'<<8)|'b';
dpymsg[2] = ('e'<<24)|('l'<<16)|('l'<<8)|'!';
dpymsg[3] = 0;
strcpy(dpymsg, "a[jDoorbell!");
dpymsg[0] = 0x1b;
dpyptr = dpymsg;
// And the UART message / 18 characters
uartptr = uartmsg;
*uartptr++ = '\r'; *uartptr++ = '\n';
*uartptr++ = 'D';
*uartptr++ = 'o';
*uartptr++ = 'o';
*uartptr++ = 'r';
*uartptr++ = 'b';
*uartptr++ = 'e';
*uartptr++ = 'l';
*uartptr++ = 'l';
*uartptr++ = '!';
*uartptr++ = '\r'; *uartptr++ = '\n';
*uartptr++ = '\r'; *uartptr++ = '\n';
*uartptr++ = '\0';
strcat(uartptr, "\r\nDoorbell!\r\n\r\n");
uartptr = uartmsg;
 
 
208,9 → 187,10
sys->io_pwm_audio = 0x0310000; // Turn on the audio
while(sptr < &sound_data[NSAMPLE_WORDS]) {
do {
TOUCH_WATCHDOG;
pic = sys->io_pic;
if (pic & INT_TIMA) {
sys->io_pic = INT_TIMA;
if (pic & INT_TIMER) {
sys->io_pic = INT_TIMER;
seconds++;
rtcclock = rtcnext(rtcclock);
} if ((pic & INT_UARTTX)&&(*uartptr)) {
224,50 → 204,26
// interruptable task ... but, sigh, we're not
// there yet.
dispchar(*dpyptr++);
sys->io_spio = 0x44;
sys->io_spio = 0x45;
} else
sys->io_spio = 0x40;
} while((pic & INT_AUDIO)==0);
sys->io_pwm_audio = (*sptr >> 16)&0x0ffff;
sys->io_pwm_audio = (*sptr++) & 0x0ffff;
// Now, turn off the audio interrupt since it doesn't
// reset itself ...
sys->io_pic = INT_AUDIO;
 
do {
pic = sys->io_pic;
 
if (pic & INT_TIMA) {
sys->io_pic = INT_TIMA;
seconds++;
rtcclock = rtcnext(rtcclock);
} if ((pic & INT_UARTTX)&&(*uartptr)) {
sys->io_uart = *uartptr++;
sys->io_pic = INT_UARTTX;
sys->io_spio = 0x22;
} else if (!*uartptr)
sys->io_spio = 0x20;
if (*dpyptr) {
// This will take a long time. It should be an
// interruptable task ... but, sigh, we're not
// there yet.
dispchar(*dpyptr++);
sys->io_spio = 0x44;
} else
sys->io_spio = 0x40;
} while((pic & INT_AUDIO)==0);
sys->io_pwm_audio = (*sptr++) & 0x0ffff;
 
// and turn off the audio interrupt again ...
sys->io_pic = INT_AUDIO;
} sys->io_pic = INT_BUTTON;
sys->io_spio = 0x10;
 
TOUCH_WATCHDOG;
// Now we wait for the end of our 30 second window
sys->io_spio = 0x0f8;
sys->io_pwm_audio = 0x018000; // Turn off the Audio device
while(seconds < 30) {
TOUCH_WATCHDOG;
pic = sys->io_pic;
if (pic & INT_TIMA) {
sys->io_pic = INT_TIMA;
if (pic & INT_TIMER) {
sys->io_pic = INT_TIMER;
seconds++;
rtcclock = rtcnext(rtcclock);
} if (pic & INT_BUTTON) {
275,37 → 231,32
seconds = 0;
}
} sys->io_pic = INT_BUTTON;
TOUCH_WATCHDOG;
}
}
 
void build_dpymsg(char *msg, unsigned clk) {
*msg++ = (0x1b<<24)|('['<<16)|('j'<<8)|'C'; // Clear, and start 'C'
*msg++ = ('l'<<24)|('o'<<16)|('c'<<8)|'k';
*msg = (' '<<24)|(':'<<16)|(' '<<8);
msg[0] = 0x1b;
strcpy(++msg, "[jClock : ");
msg += strlen(msg);
 
if ((clk>>20)&0x0f)
*msg++ |= (((clk>>20)&0x0f)+'0');
else
*msg++ |= ' ';
*msg++ = ((((clk>>16)&0x0f)+'0')<<24)
|(':'<<16)
|((((clk>>12)&0x0f)+'0')<< 8) // Minutes
|((((clk>> 8)&0x0f)+'0') );
*msg++ = (':'<<24)
|((((clk>> 4)&0x0f)+'0')<<16) // Seconds
|((((clk )&0x0f)+'0')<< 8);
*msg++ = (((clk>>16)&0x0f)+'0');
*msg++ = ':';
*msg++ = (((clk>>12)&0x0f)+'0');
*msg++ = (((clk>> 8)&0x0f)+'0');
*msg++ = ':';
*msg++ = (((clk>> 4)&0x0f)+'0');
*msg++ = (((clk )&0x0f)+'0');
*msg++ = 0;
*msg++ = 0;
*msg++ = 0;
*msg++ = 0;
}
 
void build_uartmsg(char *msg, unsigned clk) {
*msg++ = 'T'; // 0
*msg++ = 'i'; // 1
*msg++ = 'm'; // 2
*msg++ = 'e'; // 3
*msg++ = ':'; // 4
*msg++ = ' ';
strcpy(msg, "Time: ");
msg += strlen(msg);
*msg++ = ((clk>>20)&0x03)+'0'; // Hrs
*msg++ = ((clk>>16)&0x0f)+'0';
*msg++ = ':';
329,40 → 280,3
dispchar(ch);
}
}
 
void txch(int val) {
register IOSPACE *sys = (IOSPACE *)0x0100;
 
// To read whether or not the transmitter is ready, you must first
// clear the interrupt bit.
sys->io_pic = INT_UARTTX;
for(int i=0; i<5000; i++)
asm("noop");
sys->io_pic = INT_UARTTX;
// If the interrupt bit sets itself again immediately, the transmitter
// is ready. Otherwise, wait until the transmitter becomes ready.
while((sys->io_pic&INT_UARTTX)==0)
;
sys->io_uart = (val&0x0ff);
// Give the transmitter a chance to finish, and then to create an
// interrupt when done
sys->io_pic = INT_UARTTX;
}
 
void txval(int val) {
txch('\r');
txch('\n');
txch('0');
txch('x');
for(int i=28; i>=0; i-=4) {
int ch = ((val>>i)&0x0f)+'0';
if (ch > '9')
ch = ch - '0'+'A'-10;
txch(ch);
}
}
 
// PPONP16P
// 00120O91
// 00120NM3
// 00120E91 = 1183377 ~= 91029 / char, at 0x208d 8333/baud, 83,330 per char
/sw/dev/helloworld.c
22,7 → 22,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
52,30 → 52,32
const char msg[] = "Hello, world!\r\n";
 
void entry(void) {
register IOSPACE *sys = (IOSPACE *)IOADDR;
volatile IOSPACE *const sys = (IOSPACE *)IOADDR;
int ledset = 0;
 
sys->io_spio = 0x0f0;
 
/// Turn off timer B
sys->io_timb = 0;
sys->io_watchdog = 0;
 
while(1) {
const char *ptr;
sys->io_tima = TM_ONE_SECOND; // Ticks per second, 80M
sys->io_timer = TM_ONE_SECOND; // Ticks per second, 80M
sys->io_pic = 0x07fffffff; // Acknowledge and turn off all ints
 
ptr = msg;
while(*ptr) {
unsigned iv = *(unsigned char *)ptr++;
 
// Wait while our transmitter is busy
while((sys->io_pic & INT_UARTTX)==0)
;
sys->io_uart = *ptr++; // Transmit our character
sys->io_uart = iv; // Transmit our character
sys->io_pic = INT_UARTTX; // Clear the int flag
}
 
// Now, wait for the top of the second
while((sys->io_pic & INT_TIMA)==0)
while((sys->io_pic & INT_TIMER)==0)
;
 
ledset <<= 1;
/sw/dev/keypad.c
11,7 → 11,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
41,7 → 41,7
#include "../zipos/kfildes.h"
#endif
 
static const int keymap[] = {
static const char keymap[] = {
0x01,0x02,0x03,0x0a,
0x04,0x05,0x06,0x0b,
0x07,0x08,0x09,0x0c,
50,7 → 50,7
 
int keypadread(void) {
int row, col, key;
IOSPACE *sys = (IOSPACE *)IOADDR;
volatile IOSPACE *const sys = _sys;
 
row = sys->io_spio & 0x0f00;
if (row != 0x0f00) {
113,7 → 113,7
}
 
void keypad_wait_for_release(void) {
IOSPACE *sys = (IOSPACE *)IOADDR;
volatile IOSPACE * const sys = _sys;
sys->io_spio = 0x0f00;
while((sys->io_spio & 0x0f00)!=0x0f00)
#ifdef ZIPOS
125,14 → 125,17
 
#ifdef ZIPOS
void keypad_task(void) {
clear(INT_KEYPAD);
clear(INT_KEYPAD, 0);
while(1) {
int key;
int key; char ch;
wait(INT_KEYPAD,-1); // Automatically clears
key = keypadread();
write(FILENO_STDOUT, &key, 1);
if (key >= 0) {
ch = key;
write(FILENO_STDOUT, &ch, 1);
}
// Prepare for the next key
clear(INT_KEYPAD);
clear(INT_KEYPAD, 0);
}
}
#endif
/sw/dev/keypad.h
11,7 → 11,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
/sw/dev/kptest.c
11,7 → 11,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
38,31 → 38,14
#include "asmstartup.h"
#include "board.h"
#include "keypad.h"
#include "txfns.h"
 
void txchr(char v) {
volatile IOSPACE *sys = (IOSPACE *)IOADDR;
if (v < 10)
return;
v &= 0x07f;
sys->io_pic = INT_UARTTX;
while((sys->io_pic&INT_UARTTX)==0)
;
sys->io_uart = v;
}
 
void txstr(const char *str) {
const char *ptr = str;
while(*ptr) {
txchr(*ptr++);
}
}
 
void entry(void) {
register IOSPACE *sys = (IOSPACE *)0x0100;
register volatile IOSPACE *const sys = _sys;
 
sys->io_pic = 0x07fffffff; // Acknowledge and turn off all interrupts
sys->io_spio = 0x0f0;
sys->io_tima = 100000 | TM_REPEAT;
sys->io_timer = 100000 | TM_REPEAT;
 
txstr("Press any keypad button for test.\r\n");
 
70,15 → 53,15
int ch;
while(0 == (sys->io_pic & INT_KEYPAD))
;
sys->io_pic = INT_KEYPAD | INT_TIMA;
sys->io_pic = INT_KEYPAD | INT_TIMER;
// Wait 5 ms
for(int i=0; i<5; i++) {
while(0 == (sys->io_pic & INT_TIMA))
while(0 == (sys->io_pic & INT_TIMER))
;
}
sys->io_spio = 0x011;
ch = keypadread();
if (ch < 0)
if ((ch < 0)||(ch == -1))
; // txstr("Unknown key pressed or error\n");
else if (ch < 10)
txchr(ch+'0');
86,7 → 69,9
txstr("F\r\n");
else if (ch < 15)
txchr(ch+'A'-10);
else txstr("Unknown key pressed\n");
else {
txstr("Unknown key pressed\r\n");
}
keypad_wait_for_release();
sys->io_spio = 0x010;
}
/sw/dev/rtcsim.c
62,11 → 62,10
}
}
}
 
return now;
}
 
static const int days_per_month[] = {
static const char days_per_month[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
 
74,7 → 73,7
int dy, mo;
 
dy = (today&0x0f)+((today>>4)&0x03)*10;
mo = ((today>>8)&0x0f)+(today&0x0100)?10:0;
mo = ((today>>8)&0x0f)+((today&0x0100)?10:0);
dy = dy+1;
if ((mo>12)||(dy > days_per_month[mo-1])) {
if (mo == 2) {
122,7 → 121,6
if ((today & 0x0f)>=0x0a)
today += 0x06;
}
 
return today;
}
 
133,7 → 131,7
 
void rtctask(void) {
// IOSPACE *sys = (IOSPACE *)IOADDR;
rtcdate = 0x20160504;
rtcdate = 0x20170408;
rtcclock = 0;
while(1) {
unsigned event = wait(SWINT_CLOCK,-1);
/sw/dev/samples.c
1,1614 → 1,1650
// This file should be copyrighted but I can't find
// the copyright statement.
////////////////////////////////////////////////////////////////////////////////
//
// Filename: samples.cpp
//
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
//
// Purpose: This file defines an array of 16-bit samples that define a
// doorbell sound. Sending these values into a 16-bit sound card
// should therefore produce a pleasant doorbell ding-dong.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
// This file is computer generated--DO NOT EDIT IT! The generator file can
// be found in trunk/sw/host/host/buildsamples.cpp
// be found in trunk/sw/host/buildsamples.cpp
//
//
#ifndef SOUND_DATA_H
#define SOUND_DATA_H
 
const int sound_data[] = {
0x00000000, 0x0000ffff, 0x00000000, 0x0000ffff,
0x0000ffff, 0x00000000, 0x00000000, 0x00000000,
0x00000001, 0x00000000, 0xffff0000, 0x00000000,
0x00000000, 0x00010001, 0x00000000, 0x00000000,
0x00000001, 0x00000000, 0x00000000, 0x00000000,
0x00010000, 0x0000ffff, 0x0000ffff, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0xffffffff,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0xffff0001, 0x00000000,
0x0001ffff, 0x00010000, 0x0000ffff, 0x0000ffff,
0x00000000, 0x00000001, 0x00000000, 0x00000000,
0xffff0000, 0x0000ffff, 0xffff0000, 0x00000000,
0xffff0000, 0x00000000, 0x00000000, 0x00000000,
0xffff0000, 0x00000000, 0x0000ffff, 0x0000ffff,
0x00000001, 0x00000000, 0x00000000, 0x00000000,
0x00010000, 0x00000001, 0x00000000, 0x00000001,
0x00010000, 0x0000ffff, 0xffff0001, 0x00000000,
0x00000001, 0x00000000, 0x00000000, 0x00000000,
0xffff0001, 0x00000000, 0x00000000, 0x00000000,
0xffff0000, 0x00000000, 0x00000000, 0x00000001,
0x00010000, 0x00000000, 0x00000000, 0x00000001,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00010000, 0xffffffff, 0x0001ffff, 0x0000ffff,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0xffff0001, 0x00000000,
0xffff0000, 0x00010000, 0x00000000, 0x00000000,
0x00000000, 0x00000001, 0x00000000, 0x0000ffff,
0x00000000, 0xffff0000, 0x00000000, 0xffffffff,
0x00010000, 0x00000000, 0xffff0001, 0xffffffff,
0x00000001, 0x00000000, 0x00000000, 0xffff0000,
0x0000ffff, 0xffff0000, 0x00000001, 0x00000000,
0x00010000, 0x00000000, 0x00000001, 0x00000001,
0x00000000, 0x00000000, 0x00010000, 0x00010000,
0x0000ffff, 0xffff0000, 0x00000000, 0x00000001,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00010000, 0x00000000, 0x00000000, 0x00010000,
0x00000001, 0x00000000, 0xffff0000, 0x00000000,
0x00000000, 0x00000000, 0xffff0000, 0x00000000,
0x00000000, 0xffff0000, 0x00010001, 0x00000000,
0xffff0000, 0xffff0000, 0xffff0000, 0x00000000,
0x00000001, 0x00010000, 0xffff0000, 0x00000000,
0x00010000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0xffff0001, 0x00000000, 0x00000000,
0x00000001, 0x00000000, 0x00000000, 0x00000000,
0xffff0000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0xffff0000, 0x00000000, 0x00000000,
0xffffffff, 0xffff0000, 0x00010000, 0x00010001,
0x00000000, 0x00000000, 0x00010000, 0x00000001,
0xfffffffe, 0xfffc0001, 0x00010000, 0x00030003,
0xfff7fffc, 0xfffd0005, 0xfffdffff, 0x00030002,
0x00000000, 0xffff0006, 0xfffdfffb, 0x000ffffc,
0xffeeffdb, 0x00070015, 0x0005000e, 0x001effda,
0xffdbffe7, 0x0022fffb, 0xffda0010, 0x0010fffc,
0xfffffffe, 0x002a0017, 0xffdd0030, 0xfff6ffa8,
0xff18ffc7, 0x00c30038, 0x003800b0, 0xff45fec6,
0xff3a0091, 0x00a2ff65, 0x006a0090, 0xffac0016,
0xfff600dd, 0xffe1fda5, 0x005f0140, 0xfe6afecb,
0x00b2009f, 0x000300f5, 0x0215ffd2, 0xfdcfff3c,
0xff89fd94, 0xff090188, 0x01d200d7, 0xff74fedb,
0x0052014a, 0x033f01e4, 0xfe77ffa2, 0x0013fca7,
0xfd7400f9, 0x0156fee4, 0xfe78029f, 0x0145fd72,
0x02b30427, 0xfcdbfe0b, 0xffe1feeb, 0x005eff99,
0x0011ff57, 0xfa27fdb5, 0x03bc03e6, 0x00fbfd1c,
0xfe6bfe62, 0xfc0dfe56, 0xfcbbf907, 0xfb92f59b,
0xf60bfbda, 0x01510866, 0x0238f9cd, 0xfbf702fc,
0x037afeb0, 0xfec10462, 0xfefdfb06, 0xfdcff461,
0xb8d0d21d, 0x4f195ff8, 0x251e018b, 0xe058c045,
0xc924ed7f, 0x0da91088, 0x141432d2, 0x2199ee71,
0xd406d240, 0xd9b1d716, 0xf8841695, 0x251a2240,
0x1eeb0522, 0xd02bc9b8, 0xca02dffe, 0xfbc61929,
0x381b396e, 0x1e44098d, 0xf6e0e0c5, 0xc389c8c2,
0xf91613c4, 0x32383c90, 0x3c7819cc, 0xdaedce05,
0xcfa0d99a, 0xe37f036d, 0x2b012bc6, 0x21811463,
0x0383d658, 0xc419cfbf, 0xe21ff3e7, 0x14282976,
0x2dda1c1d, 0xfb98e786, 0xc4d3c791, 0xd573fd7f,
0x1c6e2b67, 0x329a1c12, 0x0a4eea33, 0xd1add23b,
0xd376eb17, 0x0bb124d3, 0x3c053323, 0x1498f14c,
0xce4fd159, 0xda08ea13, 0x07f12819, 0x3fde2a87,
0x13adf0b0, 0xdca7c5cc, 0xc148e5fd, 0xfb3213ea,
0x2e9d351f, 0x2021f568, 0xd957d5de, 0xc9b1cb69,
0xf3591948, 0x2fd12d1b, 0x21ff130b, 0xf178d511,
0xcfdcd906, 0xec0d0b40, 0x24a53812, 0x29891230,
0xf638d9b7, 0xc2d0c566, 0xe0790128, 0x1fcf311c,
0x342f1be7, 0xf51bdbb1, 0xcc40c213, 0xd54df95e,
0x23023314, 0x33ce237e, 0x04a6e178, 0xcde9cd84,
0xd727f0e6, 0x12b93332, 0x37872dc0, 0x0f99ec26,
0xd448c91b, 0xd615ecb1, 0x0ad02706, 0x333328b6,
0x15c8f768, 0xd9dcc218, 0xc0eddb49, 0xfbce1f0d,
0x2e543156, 0x1e0afea7, 0xe01fcc96, 0xc61fd804,
0xfa3b1b4e, 0x33e5362a, 0x2cbf0ae0, 0xe2cbc719,
0xc203d012, 0xe8840e80, 0x2d4936c4, 0x2a5611f2,
0xf274d5f2, 0xc7c8d3f7, 0xef580779, 0x24023574,
0x35101c0c, 0xf907dbee, 0xc8e6c734, 0xda1bff02,
0x1d0d2f8f, 0x2f171d3c, 0xfc8ddc29, 0xca39c701,
0xd79cf541, 0x19723207, 0x34de2433, 0x0a49e81e,
0xc998c067, 0xcdaaec2d, 0x0dc728ed, 0x33cb2ce4,
0x1434f5dd, 0xdbb6ca97, 0xcdcce58f, 0x082023f4,
0x33f332e0, 0x1d97fbd5, 0xd86ec87d, 0xcd3adfd3,
0x00a71fc9, 0x328431f0, 0x1edd05df, 0xe63dcd0b,
0xca7dda99, 0xf7931600, 0x2d8833da, 0x250f082a,
0xe633cdc2, 0xc354cc8a, 0xec470cff, 0x23ff306a,
0x29ea1245, 0xf120d581, 0xc906cd1d, 0xe32a0710,
0x26863536, 0x314f1bc4, 0xfa5bd893, 0xc75bca8e,
0xdf23013d, 0x236035fa, 0x34a521b7, 0x047de1fa,
0xcabec946, 0xdb23fa22, 0x191830c1, 0x3884272e,
0x064de44d, 0xcd1fc61d, 0xd1ebefd2, 0x107c2970,
0x31d4298e, 0x0f76eb88, 0xce2ac482, 0xce56e6a0,
0x07db25f6, 0x3646326b, 0x1c3ff8bd, 0xd986c66b,
0xca3ce3f3, 0x028a22f4, 0x38c539db, 0x2021fd92,
0xe1d7cb65, 0xc31cd560, 0xf9411931, 0x2cb63293,
0x264f0576, 0xe13dca97, 0xc538cef2, 0xeca711c4,
0x2ec53799, 0x2d6013d3, 0xf0e0d2c0, 0xc5cdcf07,
0xe93607a1, 0x2717399f, 0x340d1af9, 0xf882dd5a,
0xcabecb7b, 0xdedc00e3, 0x1f5e3182, 0x312b1f32,
0xfe07dc7c, 0xc9d7c865, 0xd6c0f3f9, 0x19232f7d,
0x35b925a7, 0x0885e650, 0xcb57c568, 0xd321ef86,
0x11182b7c, 0x34fb2a94, 0x0f6aed8d, 0xd162c493,
0xccc0e674, 0x080525a7, 0x33812ebe, 0x1888f702,
0xd754c4fd, 0xc7acddab, 0xfdec1f39, 0x3395331d,
0x207f0224, 0xe289cd8a, 0xc97edaec, 0xf95b17f7,
0x2fb63575, 0x26c10877, 0xe66ece7e, 0xc6f7d3ac,
0xef48125d, 0x2e803757, 0x2c771252, 0xf0bbd1c6,
0xc584ce0e, 0xe6350616, 0x236d3445, 0x2e361577,
0xf533d806, 0xc6d4c78a, 0xdda50011, 0x1df52fea,
0x31291ddc, 0xfc1cdb67, 0xc7bdc681, 0xd7aaf717,
0x18b730db, 0x36b327be, 0x09fae6c6, 0xcdbec75a,
0xd4a2efbf, 0x11b92cb4, 0x36732ccc, 0x1187f033,
0xd2f7c3f7, 0xcb23e4df, 0x06b324fb, 0x36f3343a,
0x1baffab2, 0xdbe3c9fe, 0xcc85dff8, 0xff5f1f72,
0x3351326a, 0x209d0158, 0xdf6ccb54, 0xc8cbda42,
0xf6e61753, 0x3011357e, 0x24b105ba, 0xe4f8ccae,
0xc4dccffc, 0xedb90e9d, 0x27e03209, 0x275a0d5d,
0xede1d29d, 0xc741cf95, 0xe84308a6, 0x24f0338e,
0x2e691888, 0xf753da6a, 0xca56cbda, 0xe044007a,
0x209b3288, 0x33be21fc, 0x01abe19c, 0xcc8bca2b,
0xd9dbf678, 0x17dc2ef0, 0x3515264a, 0x08d3e73a,
0xce8bc78a, 0xd3c6f02f, 0x11312bd2, 0x355629ec,
0x0f0beda2, 0xd249c6d0, 0xcd21e528, 0x05c0244b,
0x32fa2ef7, 0x1852f6ec, 0xda85c8ab, 0xcaaae09c,
0xffd51f4a, 0x32ad3248, 0x1f77000f, 0xe0d2cbbd,
0xc9a7dabd, 0xf9851a82, 0x2ffc3423, 0x251b082a,
0xe71bced2, 0xc7e0d4e6, 0xf0821135, 0x2af0349e,
0x2b250fd2, 0xef25d379, 0xc7cfcfb3, 0xe99409c1,
0x258e32e5, 0x2ca91561, 0xf425d6c7, 0xc6c2cad6,
0xdf140040, 0x1ee93193, 0x30f91e95, 0xfe94dec4,
0xcc14cac0, 0xdd4efb00, 0x1b24303e, 0x32982264,
0x04efe4b3, 0xcdaec7fe, 0xd6e3f29f, 0x14392d2b,
0x35452978, 0x0f98eebe, 0xd2d9c86a, 0xd0e1e96e,
0x09d225b5, 0x328b2c63, 0x154bf568, 0xd7afc888,
0xcc34e460, 0x02ff1ffd, 0x31bc3052, 0x1cfbfd64,
0xdebacb1c, 0xca41dc83, 0xfaa61958, 0x2e4e3261,
0x22530490, 0xe399cc89, 0xc896d6d9, 0xf28b1242,
0x2b923386, 0x287d0da9, 0xecddd345, 0xc8d2d22c,
0xeb7e0a32, 0x267434b6, 0x2e711636, 0xf5cbd8df,
0xc938cc8d, 0xe1fa024d, 0x211433c1, 0x321b1d4d,
0xfd9edf0f, 0xcb53cbdc, 0xddc4fbed, 0x1b202e8f,
0x3214216e, 0x03dee431, 0xccd1c6ad, 0xd451f0cc,
0x11f82bd9, 0x347f2946, 0x0dc8ec37, 0xd13ec640,
0xcffeea0f, 0x0a64268c, 0x343b2e84, 0x17c9f672,
0xd9d2caed, 0xcf3de4e1, 0x03f521ee, 0x32a230da,
0x1bfdfcf0, 0xddfdcaf8, 0xca8ddd0d, 0xfaa71948,
0x2f2a3320, 0x22fa0546, 0xe549ce12, 0xc988d7b6,
0xf2e2132d, 0x2c4e3437, 0x28430c62, 0xec03d292,
0xc7cad111, 0xeb530c04, 0x27db34b7, 0x2d85155f,
0xf569d916, 0xcb0acf56, 0xe519048e, 0x1fa32f75,
0x2dd31a35, 0xfb9ddd42, 0xcbb1cb85, 0xdea7fca0,
0x1b7e2fd8, 0x323621b5, 0x0270e25b, 0xcc73c894,
0xd7e1f418, 0x138f2c2f, 0x33b3274a, 0x0bd0eb09,
0xd231c90c, 0xd2ceecb0, 0x0d3528d0, 0x33e12bb5,
0x1354f2d3, 0xd67ec8f9, 0xce7de504, 0x04e72261,
0x32ac309b, 0x1c19fc53, 0xde26cae4, 0xcc39dfa1,
0xfe0f1cfc, 0x30f032ef, 0x20d90299, 0xe381ce15,
0xc9ebd968, 0xf559143e, 0x2b8e3245, 0x24e70842,
0xe855cf3e, 0xc621d1df, 0xed120d9b, 0x291b34a8,
0x2b871251, 0xf29ad5ab, 0xc83dcef4, 0xe57f05e8,
0x213830e4, 0x2e2f190f, 0xfabedcde, 0xcb02cce3,
0xe0d8fe6b, 0x1d843172, 0x335b21e2, 0x0353e366,
0xcc6dc756, 0xd68ff372, 0x13582bc7, 0x31d92527,
0x0a3ce9ab, 0xd111c94a, 0xd55bef62, 0x0f6e2930,
0x34652b2d, 0x10eff070, 0xd3d3c74e, 0xce7ce5f3,
0x06a8256b, 0x34aa312d, 0x1b04fa45, 0xdc1ccad4,
0xcc55e003, 0xfdd21a16, 0x2df62ed0, 0x1dc0ffb8,
0xe0a0cc63, 0xc840d923, 0xf65017da, 0x2ec0348c,
0x26bb0a1c, 0xe9afcfc7, 0xc8ccd2c8, 0xed420e1c,
0x27953267, 0x28b80fd1, 0xf044d4bf, 0xc8d2cf5e,
0xe7450862, 0x253933cb, 0x2eab18cf, 0xf8d7da83,
0xcb14cc8d, 0xe002fea9, 0x1def3081, 0x31261ff1,
0x015fe2ec, 0xcc85ca21, 0xdab5f727, 0x16352d01,
0x327e2529, 0x09b1e913, 0xcfe1c79d, 0xd379ee3d,
0x0e1927cf, 0x32fd291b, 0x0f92eef6, 0xd390c6b1,
0xcd90e658, 0x0736240d, 0x33362fb8, 0x19fbfa97,
0xdc63cb04, 0xcd2de0bd, 0xfe0f1bd3, 0x2f093008,
0x1daf0041, 0xe0b8cc2d, 0xc951d899, 0xf5b21675,
0x2d9d345f, 0x27110ad5, 0xeb01d1d4, 0xc9cdd44f,
0xeeef0d30, 0x269731a0, 0x293c0f98, 0xeff0d583,
0xc9a0cfd3, 0xe7c8083d, 0x24803369, 0x2dc3185b,
0xf874db58, 0xca82cc38, 0xe0c4fe69, 0x1c4e2ffd,
0x30be1f03, 0x011be288, 0xcd13c9be, 0xd933f672,
0x14bc29f5, 0x30642299, 0x072ce7bb, 0xd01bc7a4,
0xd335ee16, 0x0e7b27af, 0x31cb2909, 0x100ef040,
0xd4e8c92a, 0xd0cee801, 0x06da2340, 0x31742cca,
0x16d1f866, 0xdb57cafc, 0xcdb2e14c, 0xfffd1ed0,
0x30c531b3, 0x1ec60008, 0xe131cc6e, 0xc9ffd9ca,
0xf65d1449, 0x2c36323e, 0x252909ab, 0xe9b6d16a,
0xc94fd4a7, 0xee560cf7, 0x267a3193, 0x285f1010,
0xf0dfd5ce, 0xca55d08c, 0xe78107c1, 0x23b93261,
0x2cf016cf, 0xf76eda29, 0xc91dcb22, 0xdff3fec1,
0x1cdf2f7b, 0x2f9e1de1, 0x0027e1f8, 0xceefcc0d,
0xdbcdf850, 0x17442c9b, 0x32782434, 0x079ce823,
0xd032ca85, 0xd506f012, 0x0fb72929, 0x344d2a18,
0x1248f2a4, 0xd771cb71, 0xd16de86a, 0x06a62156,
0x2fc52bcc, 0x16a2f769, 0xda4aca09, 0xce07e26b,
0x0233206c, 0x32783312, 0x1f4e0118, 0xe19ccd70,
0xcaedda78, 0xf72715d2, 0x2c803263, 0x24be08e0,
0xe8dcd202, 0xc9cad556, 0xf0340f0b, 0x27dc318d,
0x27b20de1, 0xee8cd44f, 0xc918cfda, 0xe7e0069c,
0x22c330a2, 0x2cca177d, 0xf776dabc, 0xc9b3ccad,
0xe195ffb2, 0x1d203051, 0x30261db6, 0xff4de14e,
0xcd8ccbfb, 0xdc1ef8a9, 0x18392d7a, 0x325423bb,
0x07abe814, 0xcf83c861, 0xd48eef95, 0x0f1d27ce,
0x324f27da, 0x0eeaefea, 0xd580c9e1, 0xd250ea78,
0x0916241e, 0x31922d05, 0x170ff6e5, 0xda3fcafd,
0xce9de347, 0x01d320cf, 0x315830a3, 0x1ce2fdc7,
0xdef5cac4, 0xc8d4d948, 0xf75a169c, 0x2c593186,
0x246b0894, 0xe92cd112, 0xca5ed6a1, 0xf0861084,
0x27a8310c, 0x279f0de1, 0xee26d3d9, 0xc99bd1c5,
0xe9e60993, 0x24a8324f, 0x2db8173d, 0xf901dc07,
0xcbf8cdc0, 0xe2850170, 0x1e1b2f80, 0x2ecd1b2f,
0xfcfbdf42, 0xcbf4cb31, 0xdd32facd, 0x19b22f00,
0x32e224c2, 0x095de932, 0xd0c5cb26, 0xd5d5f0ac,
0x0ecd273b, 0x30fc27b4, 0x0e10ef2f, 0xd55bca0f,
0xd220e93d, 0x088d2273, 0x2fbb2a71, 0x157ff6ef,
0xdbd1ca82, 0xcda5e2a6, 0x01921dfc, 0x2fbd2f59,
0x1c45ffb8, 0xe1c9cec8, 0xcd43de8d, 0xfa761893,
0x2d543299, 0x22bb0719, 0xe81fd0c5, 0xcb50d669,
0xf1171093, 0x284f31fc, 0x27f90f86, 0xefecd54f,
0xca59d1e5, 0xea910941, 0x243531fa, 0x2d2116bd,
0xf924dc5b, 0xcc44cef7, 0xe3e80268, 0x1e342fdb,
0x2f031cf8, 0xff71e1a5, 0xce2cccea, 0xdd3df9c8,
0x19762e69, 0x329822c1, 0x0651e775, 0xd039c9c7,
0xd5fdf031, 0x0ee12772, 0x30a3277e, 0x0eeaeffb,
0xd651cba7, 0xd39aebc1, 0x0a2d2413, 0x31192d20,
0x172bf860, 0xdbaacbb3, 0xcddae239, 0x00a51d69,
0x2feb2ea7, 0x1d2aff98, 0xe1decf65, 0xceeadf6f,
0xfc271a22, 0x2df530fe, 0x204e057e, 0xe6dad048,
0xcabcd706, 0xf2b01116, 0x29ed32d4, 0x28cb0fbf,
0xef67d639, 0xcb65d4d7, 0xec890a05, 0x240e30bf,
0x2a9f1409, 0xf53cd8a9, 0xca78ce4c, 0xe28e01b8,
0x1e5c2f46, 0x2e641b81, 0xff08e14b, 0xcda0cbe7,
0xdce3f9a5, 0x177e2c52, 0x2f7e2031, 0x046ae4e5,
0xce24c9af, 0xd717f1e1, 0x118628c6, 0x317e2685,
0x0d0feecb, 0xd4afcae5, 0xd383eb67, 0x0a882574,
0x32d82cd0, 0x15dff6cc, 0xd9ffcae9, 0xce2ee3f4,
0x02381ec5, 0x30222e3b, 0x1c5cfeed, 0xe156cd98,
0xcd09dd8b, 0xf9d51811, 0x2b7c300c, 0x20e0052b,
0xe754d111, 0xcbbbd821, 0xf24f1173, 0x28bd3173,
0x26ee0dab, 0xedf6d3ee, 0xca18d2a7, 0xea570957,
0x242f3028, 0x29bc135a, 0xf51bd8c9, 0xc9d3cdb9,
0xe27a009a, 0x1d3b2ec5, 0x2e611c99, 0xff0de041,
0xccd2cb8e, 0xdccaf8cf, 0x17932d06, 0x31b522ab,
0x07e3eaac, 0xd309cd74, 0xd943f351, 0x118228b0,
0x3154260c, 0x0c6feda5, 0xd41dc907, 0xd053e846,
0x08632321, 0x2fbf2be5, 0x160ef7a0, 0xdbe5cc1c,
0xd08ae4b7, 0x01791ded, 0x2f262e5e, 0x1b91fe82,
0xe0e1cd64, 0xcca6dc1b, 0xf72a1512, 0x29782dc4,
0x1fe205e9, 0xe7fad1e1, 0xcb87d710, 0xf0ba0e8c,
0x25432ca7, 0x234e0c0f, 0xed56d3b3, 0xc906d111,
0xe8fe07ce, 0x22762fea, 0x2a021431, 0xf6bbdad7,
0xcc26ced9, 0xe3d10177, 0x1d0c2da4, 0x2d171a82,
0xfd95e0a2, 0xcd84cc18, 0xdc23f83f, 0x15fe2af7,
0x2f73217e, 0x06bee8eb, 0xd248cc1c, 0xd721f156,
0x0efd2609, 0x2fd82617, 0x0f9df094, 0xd62bcb1b,
0xd244e986, 0x07ba22f2, 0x2f382ada, 0x149ef612,
0xd9d9c98d, 0xcda6e194, 0x00b11ca6, 0x2ce32c27,
0x1ad8feaa, 0xe034cd5f, 0xcb04db5b, 0xf7e71574,
0x2a6c3021, 0x225407f9, 0xe9f7d2af, 0xcbe3d7cc,
0xf17f0f42, 0x27122fd4, 0x26870d89, 0xeff0d6de,
0xcbf1d423, 0xebe70a24, 0x237830e7, 0x2c3e15a2,
0xf74edbee, 0xcc4fcf26, 0xe3c701ee, 0x1d492d88,
0x2dd21c3c, 0x0007e18a, 0xce4ecdf0, 0xde7bfa60,
0x17352bdf, 0x306f2233, 0x064be894, 0xd219cb39,
0xd785f119, 0x0ede26fa, 0x2fda26ca, 0x0ebbf1ea,
0xd94ecda7, 0xd4beeb3c, 0x09b622a6, 0x2f692aca,
0x14c7f69f, 0xdae0cc20, 0xcf70e2ef, 0x00a21d0a,
0x2e0e2e19, 0x1c2aff7e, 0xe29acfcc, 0xce0ede10,
0xf977168d, 0x2b623051, 0x220e06bb, 0xe84bd1cb,
0xcbbdd67b, 0xf07b0ff0, 0x2781300a, 0x26a40f9d,
0xf159d72a, 0xcbd9d2fc, 0xe9e60714, 0x21e12f94,
0x2a5e1562, 0xf80adcc4, 0xccf1ce77, 0xe28e004f,
0x1ca82d65, 0x2d201b9b, 0xfea8e219, 0xce98ccbe,
0xdce1f80c, 0x165c2bb9, 0x2fbc225d, 0x0780e9ba,
0xd223cb39, 0xd658efec, 0x0e55258b, 0x2fb6276f,
0x0fd8f0b6, 0xd7f4cc34, 0xd33de97a, 0x0731217f,
0x2ea92ab2, 0x15b9f7e6, 0xdc72cd80, 0xcf39e30f,
0x01311ddb, 0x2df72ea4, 0x1d350120, 0xe3d8cf66,
0xccf2dd4a, 0xf92315a5, 0x29cd2f7e, 0x2243071a,
0xe99bd2df, 0xcda9d8a2, 0xf1650f2d, 0x2792308a,
0x26f50edb, 0xf114d715, 0xcb99d214, 0xe71b051e,
0x1f032da5, 0x2a1a14bb, 0xf846dd6e, 0xcd6dcf83,
0xe2c00097, 0x1acf2be9, 0x2c5b1b1b, 0xfe54dfe4,
0xcd66cba9, 0xdbdff6b9, 0x13ed29dd, 0x2ee62186,
0x07d9e9ee, 0xd3b6ccc7, 0xd6f9efb6, 0x0d9325fd,
0x2ede2602, 0x0eb9f0f3, 0xd82fcc5f, 0xd1fde8d8,
0x074520f0, 0x2e332a69, 0x15daf8f7, 0xdd9ecdb1,
0xcf9de235, 0xfe861a40, 0x2c342cbf, 0x1be700d1,
0xe4acd111, 0xcf30ddf4, 0xf843153a, 0x2a102ee4,
0x2193079e, 0xea2ad2ff, 0xcba8d6ce, 0xeec30d70,
0x25312e2b, 0x25e90e96, 0xf155d7dd, 0xcb8bd12b,
0xe7f40584, 0x1fc62e3d, 0x2bf81882, 0xfb16dfab,
0xce57cfea, 0xe246ff58, 0x1aab2c2f, 0x2de31d2d,
0x01afe487, 0xd08bcd3a, 0xdc09f6aa, 0x142a299d,
0x2ea721d9, 0x08a1eb58, 0xd3f9ccef, 0xd799f02e,
0x0eda25b4, 0x2fc326ff, 0x0f95f1c5, 0xd848ccce,
0xd302e9bc, 0x079f2266, 0x2f342cb5, 0x1744f969,
0xddf2cd51, 0xcedbe064, 0xfc0c16f6, 0x29842b38,
0x1c12007b, 0xe482d11d, 0xce42dde4, 0xf87115a8,
0x29552e9b, 0x21750751, 0xea71d38a, 0xcbdbd6e9,
0xeeeb0cb5, 0x24b62d6f, 0x25a40f3c, 0xf22dd8c0,
0xcd93d2eb, 0xe8750629, 0x20352e36, 0x2b7d17da,
0xfae1dfe8, 0xcef4d028, 0xe0acfcae, 0x19c62b2f,
0x2d5a1d7b, 0x0227e636, 0xd1f1cf00, 0xdcecf62c,
0x129e276a, 0x2e182266, 0x09a3eccc, 0xd4e1cc2a,
0xd726ef0d, 0x0cb42469, 0x2d86266b, 0x0f06f117,
0xd7decc59, 0xd27ee70c, 0x058b2185, 0x2efb2bbf,
0x1816fc5e, 0xdf7dcd7b, 0xcf02e024, 0xfc2f1886,
0x2aec2da5, 0x1e170214, 0xe5d2d1ba, 0xce5adca8,
0xf63f148d, 0x2ac030ae, 0x24f10b12, 0xecb4d543,
0xccfbd73a, 0xef0d0c6b, 0x247b2e69, 0x281a12cb,
0xf50ddb7d, 0xcecad315, 0xe94106bc, 0x208e2e46,
0x2bab1852, 0xfaf8df89, 0xd020d129, 0xe174fd44,
0x19f62c61, 0x2eb31f06, 0x04c1e848, 0xd376cf3c,
0xda90f398, 0x0fbb255a, 0x2cbb21da, 0x0a6aed53,
0xd610cde2, 0xd707ee14, 0x0b572375, 0x2ee328a1,
0x12d3f524, 0xda2dcd17, 0xd21fe638, 0x02a21cda,
0x2ac62a0a, 0x17e1fc99, 0xe23bd0b1, 0xd0cae153,
0xfc441870, 0x2b222d5e, 0x1e2c0367, 0xe777d2d1,
0xce9adaf6, 0xf4331116, 0x262d2dee, 0x23490b54,
0xee59d70b, 0xce5bd73c, 0xeccb08fb, 0x217c2d37,
0x26a81183, 0xf582dc41, 0xcfa0d263, 0xe6f102ad,
0x1c962b68, 0x2a2117b0, 0xfc33e097, 0xce77ce87,
0xdea8fa2d, 0x160d2903, 0x2c591fac, 0x05a0e8ef,
0xd3afce6f, 0xd99df131, 0x0e23238e, 0x2c6c230f,
0x0b0bee5d, 0xd6dbcd64, 0xd519eb8e, 0x084c2146,
0x2cfb27c1, 0x1376f6df, 0xdcabceae, 0xd202e4d6,
0x01021bef, 0x2b1f29c6, 0x186dfcd3, 0xe220d0d0,
0xcfb9e04b, 0xfb3417e1, 0x2b1f2e64, 0x1fed05ba,
0xe94ad320, 0xcdced991, 0xf2100e42, 0x25132d5a,
0x24a40dd3, 0xf0f6d959, 0xcf1bd635, 0xebce06dd,
0x1e532b2c, 0x25de122e, 0xf59adc48, 0xce57d1cf,
0xe5cf01bd, 0x1bcb2bc0, 0x2afb193d, 0xfe46e241,
0xd083cf61, 0xde5af8fd, 0x15cc28a3, 0x2beb1e0a,
0x0507e8be, 0xd3ecceff, 0xda03f2cc, 0x0fe525e4,
0x2d52240c, 0x0d7bf00c, 0xd875cef4, 0xd4f9ea9d,
0x07161e7e, 0x2bbf2757, 0x1465f8ff, 0xdf21d14d,
0xd336e636, 0x00351a2d, 0x2a2f2b01, 0x1a76ffa0,
0xe4b1d23e, 0xd071deb8, 0xf8e3140a, 0x268a2b52,
0x1e100477, 0xe867d2fc, 0xcda5d85f, 0xf0750d80,
0x24312c89, 0x25300e24, 0xf298db2e, 0xcf52d545,
0xeab10668, 0x1e192b4e, 0x26b01457, 0xf8ccdea0,
0xd016d270, 0xe41effb4, 0x1a842a92, 0x2a951b94,
0x0138e55c, 0xd3ebd0d5, 0xde87f817, 0x13a326e0,
0x2c191f3e, 0x05faeaca, 0xd556cfba, 0xdab0f2ec,
0x0ef024f2, 0x2e5b260a, 0x1018f2da, 0xdb19cf7e,
0xd54dea23, 0x055b1dd5, 0x2b7127d1, 0x1574fab5,
0xe078d144, 0xd1a5e300, 0xfd9917b5, 0x27d5291a,
0x18acffc5, 0xe5d4d2fa, 0xd00fdd85, 0xf81d1313,
0x27292c63, 0x206108b2, 0xec54d66c, 0xcfafda5b,
0xf08c0cea, 0x23942c6e, 0x24bb0ec3, 0xf367db61,
0xd07fd62c, 0xe9f20576, 0x1ea52cc5, 0x29b31776,
0xfc47e22e, 0xd1b6d250, 0xe322fcbb, 0x17cb27f7,
0x2a2a1b4a, 0x0311e7ce, 0xd502d179, 0xddaef65d,
0x113925aa, 0x2b82214a, 0x098eef1f, 0xd920d0ec,
0xd967efe8, 0x0b3e2294, 0x2cec2537, 0x101bf351,
0xdb43cf78, 0xd3cbe7b5, 0x02a71c71, 0x29df2880,
0x1726fc5d, 0xe31ed1e6, 0xd2a4e32b, 0xfc3b1622,
0x2761292f, 0x1b3601dc, 0xe6d1d3ae, 0xcfe7db5c,
0xf3a20f4d, 0x24862b51, 0x222c0cad, 0xf0eddaff,
0xd20cd9c8, 0xef090956, 0x20f62abc, 0x2424111c,
0xf52fdc9f, 0xd03cd4d6, 0xe7f9041b, 0x1e1a2be4,
0x2a5d1909, 0xfd99e362, 0xd2fbd309, 0xe1fefbfa,
0x15c1278c, 0x2a631cb6, 0x04d2e8d5, 0xd631d16c,
0xdcaff411, 0x0ecc2242, 0x290b2026, 0x0a19eec8,
0xd7edceb2, 0xd6c3ecc5, 0x09661fc8, 0x2995247a,
0x11dcf723, 0xddb7d20c, 0xd571e82a, 0x034b1b9d,
0x29dd28b1, 0x17c6fd58, 0xe31ed291, 0xd14ae17d,
0xfaa61538, 0x27f72a7c, 0x1d220518, 0xeaded66d,
0xd0d1db1a, 0xf2a00dcd, 0x219028d6, 0x20900c13,
0xf122da1c, 0xd18ed8a7, 0xecc10792, 0x1ef52a7b,
0x25e512cb, 0xf8e7dfd7, 0xd296d542, 0xe6b500f8,
0x19ce27ef, 0x26af17c8, 0xfe28e334, 0xd187d05d,
0xdda2f7a7, 0x12b424d5, 0x28a11cc2, 0x05b4eb97,
0xd79cd0f0, 0xdb96f1ed, 0x0d0b2109, 0x290c219b,
0x0c26f135, 0xdb2bd144, 0xd6feeb64, 0x065a1dd4,
0x2a562622, 0x13a6f9f8, 0xe1fbd501, 0xd61ae775,
0x007a19bf, 0x277425e1, 0x1750fdee, 0xe441d28b,
0xd1bbdfb3, 0xf9ab1385, 0x265c2b69, 0x1f4507fa,
0xeb4bd82a, 0xd24bdc4d, 0xf2bc0ca1, 0x20dc28ee,
0x218a0be4, 0xf0fadb10, 0xd20ad80b, 0xeb0804c8,
0x1bd52795, 0x23ba11af, 0xf836dfe8, 0xd216d440,
0xe54cff16, 0x17ac2684, 0x27ab17fa, 0xffade6c7,
0xd5b9d489, 0xe18af9e1, 0x134d25b6, 0x2a1b1df8,
0x0695ec6b, 0xd870d255, 0xdb97f123, 0x0c75216b,
0x29a122c4, 0x0e52f37a, 0xdc41d209, 0xd780eaf3,
0x05581c18, 0x277e247f, 0x13f2faa4, 0xe313d497,
0xd690e6ca, 0xffc01820, 0x267f2790, 0x190501a6,
0xe84fd64b, 0xd3e6e0d4, 0xf7fd11a8, 0x239c2853,
0x1d4e06b3, 0xebfad6c0, 0xd0f8daa8, 0xeffd099f,
0x1ea827dc, 0x20fc0e0e, 0xf3dddd32, 0xd2ded7bc,
0xebe50539, 0x1be027dd, 0x263a1508, 0xfb99e32b,
0xd443d59b, 0xe4c3fda8, 0x165a25c6, 0x26d21936,
0x0180e940, 0xd740d57a, 0xe111f77c, 0x12742468,
0x28f41de8, 0x081eedcc, 0xd8e5d149, 0xda01f047,
0x0ac2205a, 0x2b0a244e, 0x1082f6f7, 0xdfacd441,
0xd86aeb43, 0x03d61b0b, 0x276a2524, 0x154afb73,
0xe3c3d53c, 0xd618e493, 0xfbfe14d0, 0x246b2671,
0x18cb0181, 0xe870d736, 0xd339df01, 0xf67f1013,
0x2332277d, 0x1da308fa, 0xeeddda7d, 0xd3a1dba5,
0xf1370b38, 0x209c2913, 0x22670f6f, 0xf624df06,
0xd3b5d7ef, 0xe92e02e5, 0x19f02702, 0x249b14d7,
0xfc87e512, 0xd5e4d5ab, 0xe458fb67, 0x13f6238f,
0x25b71977, 0x0398eb15, 0xd901d542, 0xe0daf6e5,
0x0f5a2227, 0x28521f6f, 0x0a73f08a, 0xdbe8d32e,
0xdb4aef47, 0x08001d6d, 0x276921dd, 0x0e44f565,
0xdef8d314, 0xd610e797, 0x017918c4, 0x258f2428,
0x1528fdb1, 0xe5f4d527, 0xd456e39d, 0xface13ab,
0x24982803, 0x1c7506a4, 0xeca3da50, 0xd501deb6,
0xf48c0cae, 0x1fb626a8, 0x1ec20a11, 0xf12cdcf3,
0xd569dbcc, 0xef4107b1, 0x1d3827c7, 0x21f0104c,
0xf805e094, 0xd46fd789, 0xe8a60168, 0x187b265a,
0x252c16b3, 0xfe42e622, 0xd665d500, 0xe338fa09,
0x13092324, 0x25d01b03, 0x04a6ebb7, 0xd8f7d37f,
0xdd2af346, 0x0c911fd7, 0x280520fa, 0x0cddf407,
0xdf46d53d, 0xda4bed72, 0x06761beb, 0x26e3220d,
0x10b7f80a, 0xe0c2d4db, 0xd812e851, 0x001517ae,
0x263725fa, 0x18630067, 0xe774d762, 0xd455e09f,
0xf79a1086, 0x21de2622, 0x1a9a0515, 0xece8da1d,
0xd467dde8, 0xf2f20b9f, 0x1eb3273c, 0x1faf0c68,
0xf447deef, 0xd593da67, 0xec6304a5, 0x1a6f2655,
0x24a41362, 0xf9cde289, 0xd5bad739, 0xe6ccfdb2,
0x14de2323, 0x23c11747, 0xfff7e7a3, 0xd8e5d7a1,
0xe4d7fa49, 0x11fb21ff, 0x25d21b3a, 0x05afef67,
0xdbdcd68f, 0xdfeef432, 0x0c1d1ea6, 0x25e81f96,
0x0c26f39f, 0xde7fd58d, 0xdb5eed78, 0x04ee1a6e,
0x2541217a, 0x114ff87c, 0xe189d3ee, 0xd727e74e,
0xfe7d1509, 0x234324c7, 0x19310198, 0xe998d86b,
0xd57ee160, 0xf6ce0eb5, 0x1ec9234d, 0x1aef0998,
0xf172de6f, 0xd7a0ddd8, 0xf0bf096a, 0x1caf2438,
0x1d200bb6, 0xf4c3dfb7, 0xd56dd978, 0xea0c0371,
0x18fd2510, 0x23241307, 0xfccee604, 0xda6cd8c9,
0xe5f1fb34, 0x10e52218, 0x244818d0, 0x01e7e96c,
0xd979d5ad, 0xe214f637, 0x0e541eaf, 0x235b1b1f,
0x0760f2ac, 0xde2bd8b3, 0xde90ef13, 0x07031a27,
0x254d201f, 0x0da7f655, 0xe00fd6a6, 0xdadcec07,
0x033b188d, 0x24f4237b, 0x137dfc04, 0xe5b2d715,
0xd8f0e60d, 0xfd3613b8, 0x21f9248e, 0x180101a1,
0xead0db73, 0xd8fde3a7, 0xf7440d06, 0x1fc124f8,
0x1b4d0720, 0xefcfddd5, 0xd6a1de27, 0xef8d0715,
0x1b2c25f8, 0x20690e94, 0xf63fe173, 0xd742da48,
0xeb290312, 0x18b52301, 0x21521361, 0xfd8fe7e7,
0xda32db14, 0xe841fcc7, 0x12402259, 0x2532185a,
0x026ee8e3, 0xdaa9d7e5, 0xe2dbf7f3, 0x0e26203c,
0x25a71dc7, 0x0a16f1d2, 0xded8d764, 0xdd2fef52,
0x07ba1da5, 0x26dd20cb, 0x0ebaf88d, 0xe38cd93a,
0xdb20ea4c, 0x03a11858, 0x25f824cc, 0x14befd2a,
0xe5b1d8f6, 0xd7dfe52b, 0xfb3b136d, 0x23632395,
0x17990150, 0xea69d9bc, 0xd942e41d, 0xfa2710cf,
0x20bf263c, 0x1b7b08a8, 0xefffdc7c, 0xd462dbb5,
0xedee07e3, 0x1cd22625, 0x25a414eb, 0xfcc3e208,
0xd3cfd6b9, 0xe668023e, 0x185f280a, 0x25a41710,
0xfee6e57c, 0xd880d724, 0xe4a6f8c4, 0x106d2052,
0x246d19e9, 0x05c9eecd, 0xde7fd9ca, 0xe128f36a,
0x08321a81, 0x211e1bcd, 0x0d28ea23, 0xd915e815,
0xfe980cf9, 0xfe24f909, 0xfb84f7d4, 0x01d9fa04,
0xf946ee46, 0xe8351980, 0x2e9f2102, 0x0aeafb83,
0xe615d195, 0xcee4cecb, 0xe7940359, 0x29a14654,
0x408c3591, 0x0d34e46e, 0xc7f8aeeb, 0xb792cc07,
0xf0f6212f, 0x3eae4a27, 0x3ea12754, 0xfedbd252,
0xc061bb79, 0xd39af6ea, 0x1659241a, 0x20de1cee,
0x087ff7e7, 0xea20eaad, 0xf2f3f6f2, 0x05910999,
0x070b021e, 0xef93deb5, 0xd9a9e629, 0xffd015e5,
0x26d72d88, 0x288612c6, 0xeafbcd9c, 0xb969c09d,
0xda27f912, 0x1ec7383f, 0x4a7d3dd1, 0x1cf5f377,
0xc863b518, 0xb4cbcd0a, 0xf37d15b1, 0x328839b3,
0x313d2425, 0x0718e8e1, 0xd454d136, 0xdecfecae,
0x03560fa1, 0x1218108b, 0x03f7fd20, 0xfeef0393,
0x0db415a8, 0x0f7c0522, 0xf46ee339, 0xd152cb6f,
0xd555eda3, 0x187336a9, 0x4ae845ba, 0x27100249,
0xd7c4b4ea, 0x9f52afdb, 0xda680e73, 0x361d43dd,
0x4e573db8, 0x11a7e23f, 0xbe49b5a7, 0xc2d8dcd1,
0xf9d7141b, 0x2ad1309a, 0x26220ca5, 0xf2fbe62e,
0xe06ce585, 0xe8f6f6f4, 0x021c07e8, 0x0dd7ff04,
0xf680f711, 0x03370fd6, 0x15ff1b0f, 0x10bf0035,
0xe417d1de, 0xcbb9cd60, 0xe37303ef, 0x29f73e16,
0x3d532c31, 0x0aeae88b, 0xcb7fb9d1, 0xbb30d24e,
0xf9e21980, 0x2eb437a2, 0x2dc61a4a, 0xfb20df87,
0xd0a1d1b0, 0xe116f301, 0x072813c6, 0x19251425,
0x08affffa, 0xf85cf5de, 0xf6f5fc17, 0x014d05ed,
0x01f1f934, 0xf1daed01, 0xeccdf56e, 0x09e21ff5,
0x2ba52401, 0x12d7f7bf, 0xda00cbc6, 0xc737d168,
0xee7b1210, 0x301e3d74, 0x37ee2262, 0x01e0df09,
0xc3c6b73d, 0xc148df60, 0x0458204c, 0x354e3aaa,
0x28900c72, 0xef58db43, 0xd498d9d5, 0xe7aafa92,
0x0c17175e, 0x14bc09d1, 0xfedaf430, 0xf0abf81d,
0x02410583, 0x06830280, 0xf3cee6ae, 0xe0e3e629,
0xf21d0461, 0x197828bb, 0x2ebb221c, 0x05d7e5ac,
0xce10c293, 0xc6e9dd12, 0xff5522da, 0x39833e78,
0x318f133c, 0xef3dce63, 0xbb6cbd2d, 0xd09fef0b,
0x10082a17, 0x33c82b89, 0x171afffe, 0xea90db09,
0xdac5e3e3, 0xf14f00c2, 0x06f60745, 0x04720051,
0xfc05fbab, 0x02190afa, 0x11c30e44, 0x0369f5ab,
0xe300d666, 0xd4f1e1ea, 0xfb401731, 0x2f98382f,
0x305f1a12, 0xf8b3d865, 0xc1e0bdf5, 0xcd4debe3,
0x12cb3170, 0x42a73f2b, 0x27280532, 0xe06cc7f0,
0xc162ca52, 0xe198fdab, 0x175327ef, 0x2a001f89,
0x0abbf715, 0xeaf2e5f8, 0xe914f1de, 0xfc4900b1,
0xffe9fc42, 0xf585f42c, 0xfa9706e6, 0x125d17f6,
0x18eb0e4d, 0xfa50e479, 0xd30acbf2, 0xd3dfeac3,
0x091f28a6, 0x3c383a92, 0x295c0931, 0xe374c593,
0xb65ebdc6, 0xd6e3fc6c, 0x20ad39c6, 0x425f34b2,
0x18b6f5ec, 0xd883c961, 0xc8b9d866, 0xf1bc0adc,
0x1c311f60, 0x1afe0fb4, 0x00a6f49a, 0xef90f31b,
0xf98b0003, 0x00fafd92, 0xf6bff14f, 0xefa4f299,
0xff1710e5, 0x1e42231a, 0x1d530b14, 0xf1dad921,
0xc8f2c779, 0xd8e7f68e, 0x18d73414, 0x40cb38e7,
0x1dbaf971, 0xd549bed6, 0xbbbccbfa, 0xea3e0ba9,
0x281e3910, 0x37b62557, 0x07eaea67, 0xd62dd05f,
0xd79fe91e, 0xff23113b, 0x19bd179b, 0x0d9303b3,
0xfc1ef8b8, 0xfbb00129, 0x054a0278, 0xfb82f1ca,
0xe8dbe4c1, 0xe847f5e4, 0x0a5d1eee, 0x2c532a85,
0x1a1fff1f, 0xe1cbcb72, 0xc160ca9e, 0xe40f0699,
0x288a3d05, 0x3fe62e20, 0x0e5aeac5, 0xcc40be90,
0xc418db14, 0xf9ea1955, 0x2e26338d, 0x29fc13af,
0xf954e38d, 0xda94dcca, 0xe640f6bb, 0x05c80d5d,
0x0d730772, 0x008efc2d, 0xfe6a0376, 0x09d10d61,
0x08dfff59, 0xf112e2c2, 0xdb89de04, 0xec1a0274,
0x1b662f75, 0x353f2844, 0x0e17ece4, 0xd008bf5f,
0xbeefd290, 0xf3d71906, 0x34c23fe5, 0x38aa1feb,
0xfd39dc5f, 0xc60dc0ea, 0xce65e88e, 0x06911fd5,
0x2bfc2a3f, 0x1b99070e, 0xf2dfe5e3, 0xe380e818,
0xf22efc18, 0x0379042f, 0x011dfbc1, 0xf905fc86,
0x05280f22, 0x14ff135e, 0x0820f78e, 0xe4ecd50c,
0xd099da57, 0xf2230f98, 0x29163909, 0x365522e2,
0x0271deab, 0xc548bc8b, 0xc5cbdf39, 0x03b42719,
0x3ca84017, 0x2ed711dd, 0xf0c5d625, 0xc7bdc9ca,
0xdba8f521, 0x0e7e1d13, 0x21de1b15, 0x0d4cfdb9,
0xf26ced7e, 0xef7bf5db, 0xfbaefdb5, 0xfb4bf62c,
0xf295f2e3, 0xf8b30599, 0x15721ffe, 0x20cb1638,
0x01cfea5e, 0xd4d0c97b, 0xcd21e02a, 0xfe60200f,
0x375c3e72, 0x325d1669, 0xf310d04f, 0xbc33bc08,
0xcf23ef48, 0x12582de6, 0x3a2d3450, 0x1fe70299,
0xe6fbd49e, 0xd00bd99a, 0xeafd0116, 0x110818b7,
0x150d0c5c, 0x03e2fbdb, 0xf8f8fa8c, 0xff72014c,
0x00e6fa31, 0xf0ebe842, 0xe531ec8d, 0xfb8e0ff5,
0x22612a4e, 0x24b812fe, 0xf87bdc90, 0xc866c418,
0xd004ebd8, 0x0da32c45, 0x3ea83c9c, 0x27c206cd,
0xe387c919, 0xbe44c547, 0xde2efe57, 0x1d3d3066,
0x327d2618, 0x1033f698, 0xe217d883, 0xda68e6f9,
0xf7750509, 0x0b6a0b1d, 0x0627ffb5, 0xfc53fe20,
0x01c30848, 0x0a0b0550, 0xfc35ef0b, 0xe32ddc87,
0xe0a1eeac, 0x05e31d9f, 0x2e763044, 0x229a087e,
0xe7e9cd61, 0xbefbc2c4, 0xd7c1f835, 0x1aa73504,
0x3e9d34ef, 0x1a7ef79d, 0xd847c462, 0xc2aed2aa,
0xec9a0945, 0x202a2a8a, 0x273817d5, 0x03f6f1bc,
0xe6f2e512, 0xeb3bf56c, 0xfebe03aa, 0x01e9fd38,
0xf980f969, 0xfe1b0691, 0x0f8415ff, 0x12b306c4,
0xf463e0b4, 0xd44dd219, 0xddfbf5b9, 0x11222a11,
0x370e3185, 0x1ab5fa68, 0xda81c463, 0xbdf8ca7a,
0xe7a909c4, 0x297f3b09, 0x3b0e29e3, 0x0c09eb46,
0xd223c8c2, 0xcf66e31f, 0xfb7c11fb, 0x2016214c,
0x18b10b1f, 0xfcfff2db, 0xef0df100, 0xf6bffc48,
0xfd39fa2a, 0xf4d0f185, 0xf279f9d9, 0x05cb1430,
0x1dca1da3, 0x13ffff70, 0xe884d5b0, 0xccd3d1eb,
0xe5c6034a, 0x20ca35a3, 0x3a732bd0, 0x0ebced2e,
0xceb7bdf2, 0xc017d4af, 0xf45d150f, 0x2e17373a,
0x30eb1a1b, 0xfcace2d4, 0xd219d010, 0xdb4eef58,
0x035c1310, 0x18f515a1, 0x0c420167, 0xfa49f6e2,
0xf93afd17, 0xff3bfe92, 0xf8a0f0b9, 0xea00e9d8,
0xf23b0058, 0x126e21ec, 0x26161ef8, 0x0c63f244,
0xd921c86f, 0xc7fdd68c, 0xf20f1276, 0x2e193c38,
0x371c2198, 0x0079dedf, 0xc739bf7d, 0xcadce360,
0x02a51e99, 0x2f6f3012, 0x22340cac, 0xf474e1da,
0xd9edddb2, 0xeabbfaf1, 0x08400ead, 0x0dfa0a0e,
0x0213fde4, 0xfe55016e, 0x05bd05c7, 0x02e5fa8e,
0xee8ae3f8, 0xe0bae6ab, 0xf57f0aca, 0x1fb22c8b,
0x2bc01d0a, 0x02cee4ad, 0xcd83c3a6, 0xca4ae124,
0x00f72122, 0x370f3c70, 0x2fdd1408, 0xf224d587,
0xc4b8c64a, 0xd827f353, 0x0fdf237e, 0x2be324e8,
0x1350fed2, 0xecc3e25a, 0xe21fe97a, 0xf63f0187,
0x066c05e8, 0x0180fd90, 0xfbf1fef7, 0x05000ce9,
0x10d90d09, 0x00e5f1d3, 0xe2efd848, 0xd975e545,
0xfc0b1643, 0x2a2d3245, 0x2ac81475, 0xf6bdd88a,
0xc4bac2cb, 0xd1beedad, 0x0d5c287d, 0x3695333c,
0x20ba03ae, 0xe5e4d133, 0xca22d453, 0xe8710096,
0x16192229, 0x21921731, 0x0892f8a3, 0xeef3ebff,
0xf077f789, 0xfe7001fa, 0xffa0faee, 0xf5d8f486,
0xfa8a0464, 0x0f4617ea, 0x174f0e40, 0xfd2be992,
0xd8a9d277, 0xd9f4ed2f, 0x0899228f, 0x33aa34ef,
0x251607f6, 0xe7d9cd2f, 0xc144c7bb, 0xde3bfd7f,
0x1c1631dd, 0x37342be1, 0x1459f809, 0xdf0ad16f,
0xd179de3d, 0xf2d307c0, 0x155d1949, 0x15330a13,
0xfe46f6c0, 0xf3a2f6dd, 0xfc31ffaa, 0xffe9faff,
0xf496ee4f, 0xed71f487, 0x016b1102, 0x1c601fe5,
0x185905fa, 0xef08da48, 0xcdfad00d, 0xe104fbd2,
0x190c302e, 0x38d62fc0, 0x176af75c, 0xd954c51a,
0xc352d218, 0xeb820a20, 0x233b30a4, 0x2da51ce3,
0x05aded42, 0xde16d964, 0xdf63ee49, 0xfee20bd2,
0x11a40fcb, 0x08e400fa, 0xfb87fade, 0xfed8041c,
0x05a3023b, 0xfb06f118, 0xe78ce432, 0xe861f6da,
0x0aa31c84, 0x262b2334, 0x136dfbfb, 0xe290cea6,
0xc806d199, 0xe9b60809, 0x244235e1, 0x365a266f,
0x0aa9ead3, 0xd285c778, 0xccf6defe, 0xfa7214bb,
0x262b2abd, 0x21c90f33, 0xf952e8ac, 0xe00be200,
0xea01f60b, 0x020106f0, 0x05e501e6, 0xfd2cfc9b,
0xff4304bd, 0x0a430c35, 0x08fafe88, 0xf034e2f3,
0xdc64df4c, 0xecf601ce, 0x18972a2b, 0x2e372367,
0x0bdbef2e, 0xd53dc6af, 0xc8d4dae2, 0xf71f1638,
0x2e013716, 0x2f3e1833, 0xfa9cdd9d, 0xcc6eca13,
0xd693ede7, 0x07081a74, 0x236220fd, 0x15140489,
0xf55aeb7d, 0xea1aef4d, 0xf620fd6b, 0x00cc007b,
0xfc4bf803, 0xf843fe38, 0x06c4102d, 0x14f7120e,
0x07e3f5cd, 0xe4c6d823, 0xd563e039, 0xf4e80eeb,
0x252e30ce, 0x2d051a2f, 0xfe14dfb5, 0xca55c39d,
0xce0be6c9, 0x04ab1fb1, 0x30c231fe, 0x242f0bc6,
0xeef6d909, 0xcf80d34a, 0xe40cf9f4, 0x0d99195a,
0x1af114ae, 0x0831fc63, 0xf4d2f1bb, 0xf37ef82f,
0xfc8ffcd4, 0xf99ef45e, 0xf091f1a8, 0xf91c04d1,
0x126d1c73, 0x1ce113cc, 0x011bea92, 0xd7ffcf18,
0xd4dfe769, 0x01e51de7, 0x31323695, 0x2ab9116c,
0xf229d613, 0xc66fc7ea, 0xd921f3e0, 0x108d2630,
0x2fa229a0, 0x1747fe9c, 0xe72cd9ae, 0xd7b2e0c6,
0xf1ef0323, 0x0f76144c, 0x10b0086e, 0x0068fa90,
0xf9fcfc77, 0xffad01a9, 0x0013f9a7, 0xf168ead2,
0xe8e4f0b8, 0xfeea1023, 0x1fa025ab, 0x1f8a0e51,
0xf538dd5d, 0xcd76ca78, 0xd738f01f, 0x0e97285d,
0x365d3471, 0x218304ae, 0xe528cee5, 0xc7d5d050,
0xe6a40132, 0x19a82897, 0x29c71e09, 0x0a5af4f4,
0xe4f6def6, 0xe211ed47, 0xfb7f0645, 0x0b3d0957,
0x03fafecd, 0xfcaffe51, 0x02100721, 0x08280448,
0xfaffef12, 0xe4a9e03b, 0xe4e2f3bf, 0x08941c91,
0x2abd2a49, 0x1c1403ce, 0xe8c0d1c4, 0xc845cddd,
0xe160feed, 0x1bb63019, 0x35142a6a, 0x12ebf545,
0xda66cc5c, 0xce35dd1f, 0xf4600bb4, 0x1ce22450,
0x1ec61134, 0x0063f161, 0xe951e8f7, 0xef1ef83d,
0xffc802c2, 0x01f5fdc3, 0xf9e6fb4e, 0x00720859,
0x103c12c7, 0x0ea103b6, 0xf392e433, 0xdaabda7c,
0xe683fb21, 0x131c26ee, 0x2f94278a, 0x12e3f723,
0xdb98c959, 0xc755d469, 0xed390c3f, 0x256c336a,
0x31ef215e, 0x0741ebb5, 0xd7aed0b1, 0xd691e867,
0xfdad1014, 0x1a241b0a, 0x13c20748, 0xfaf7f3a7,
0xf1e1f415, 0xfa6efe72, 0xff6efca7, 0xf78bf2db,
0xf37afa87, 0x069312dc, 0x1a32197f, 0x0edefcda,
0xe94fd969, 0xd2e2dab9, 0xee2607ea, 0x20b3312f,
0x31a42329, 0x097aeac3, 0xd1b1c55d, 0xcb5cdf2b,
0xfa5c1765, 0x2b40307b, 0x27d11449, 0xfaafe499,
0xd8cbd8c5, 0xe36ff44f, 0x0536107f, 0x13790fd0,
0x082dffaf, 0xfa8ff925, 0xfbd6ffe6, 0x0164fea5,
0xf98ef178, 0xebbfebc0, 0xf2c1011e, 0x10511c91,
0x20901a92, 0x08b7f160, 0xdcd5d042, 0xd05bdeb5,
0xf77412e1, 0x29e53443, 0x2e171978, 0xfc43e047,
0xcd34c8a7, 0xd4a5eb30, 0x06341d4f, 0x2a2e28f0,
0x1b7606ff, 0xf1d6e37f, 0xdedbe3b6, 0xef14fd33,
0x07b90bc3, 0x0a4905b2, 0x0102fe3b, 0xffec02e6,
0x068f0792, 0x0223f97b, 0xef0fe5b3, 0xe21ee861,
0xf6e90a6b, 0x1bc02628, 0x2533172f, 0xfffae5c3,
0xd322cbd9, 0xd32be7bd, 0x03971e68, 0x2fc232a0,
0x25370c6c, 0xf040d90d, 0xccead070, 0xe0aaf83c,
0x0fcf1fc1, 0x248e1d7d, 0x0e99fcf6, 0xee77e6ad,
0xe7eaef0c, 0xf816000e, 0x03c902fe, 0xff51fcea,
0xfd3801c6, 0x08200e28, 0x105e0ba9, 0x00b7f132,
0xe3abdba0, 0xdd83ea17, 0xfedc1579, 0x273e2d0c,
0x23e70f80, 0xf464dbee, 0xcce7cc3a, 0xda47f418,
0x10052688, 0x30392b24, 0x1960fee9, 0xe66cd645,
0xd263db14, 0xed960262, 0x132d1abd, 0x19581002,
0x02dff75b, 0xf0eef055, 0xf41dfa17, 0xfee6ffed,
0xfc99f6d7, 0xf3b2f5f9, 0xfc380638, 0x0faf16a0,
0x144d098e, 0xf89ee6c8, 0xda4ad716, 0xdfd8f33d,
0x0ba021af, 0x2e642bf4, 0x1d200352, 0xe7ded205,
0xca28d15f, 0xe60200ff, 0x19a529c2, 0x2bbd21d1,
0x0cf7f53b, 0xe2f9da1e, 0xdca1e86a, 0xf93708ea,
0x1248141f, 0x0ea705d9, 0xfcdbf780, 0xf72dfa9b,
0xfe2ffffe, 0xfdb1f846, 0xf2f3ee5c, 0xef7af7e4,
0x04931240, 0x1c441e20, 0x152d0377, 0xedb9dacd,
0xd0d8d3ed, 0xe523fd4c, 0x17b82b1a, 0x31942903,
0x12e1f75d, 0xdcfacd8a, 0xcc11d8dd, 0xf0840a0c,
0x1f0f2885, 0x24d81699, 0x0218ee7c, 0xe2c0dfef,
0xe51cf13b, 0xfe8a084e, 0x0c9e0ae5, 0x05a7001d,
0xfdbcfe50, 0x004f03af, 0x03edffb2, 0xf763ee6e,
0xe6f4e666, 0xede9fbfb, 0x0db41bd1, 0x23b31f85,
0x103ef9d8, 0xe23ed1d1, 0xcdedd789, 0xecc1082d,
0x20af2f60, 0x2fa320f6, 0x0906ed68, 0xd844cdbb,
0xd1eee287, 0xf8f10fe4, 0x1f27244b, 0x1b920d7b,
0xfc66ee23, 0xe695e747, 0xee19f796, 0x006103da,
0x037a005b, 0xfe79fd26, 0x00350572, 0x0abc0bcb,
0x070afd61, 0xefd7e4ee, 0xdfafe266, 0xefd40408,
0x176a250c, 0x27871cc4, 0x0804ee25, 0xd7bfcc26,
0xcf21e01d, 0xf93d147c, 0x28832f70, 0x27c8136c,
0xf9aee26f, 0xd3c3d2e7, 0xdda0f0f4, 0x05d315de,
0x1d3e1a13, 0x0f9301c6, 0xf6a4ef84, 0xef1df307,
0xf8f2fe1e, 0xff07fc46, 0xf8e4f70c, 0xf860fe9b,
0x07c81129, 0x147c115d, 0x0656f5c6, 0xe648db7d,
0xda49e413, 0xf7e30efe, 0x22492c40, 0x280d1634,
0xfcb8e259, 0xd04dcb87, 0xd5bceb6d, 0x064d1f1c,
0x2c522c4b, 0x1e99090d, 0xf174df35, 0xd809dc58,
0xe987fb4f, 0x0b3713d9, 0x15d40fad, 0x05e2fc40,
0xf6c1f54f, 0xf821fc3d, 0xfd30fd25, 0xf88ef352,
0xefb3f0ef, 0xf88503b0, 0x10ab189d, 0x1943106a,
0xff04eaf4, 0xdb6ed4a4, 0xda7ceb68, 0x02501a76,
0x29a02d47, 0x22a40bd3, 0xf0c6d933, 0xcce5cf20,
0xdf89f736, 0x0fdb22ab, 0x29bc22ff, 0x129efdb1,
0xeb20e07e, 0xde8fe618, 0xf385016d, 0x0ace0d45,
0x0b77058e, 0xffaafc98, 0xfcc4fffa, 0x02360319,
0xfe45f794, 0xefc3e9e3, 0xe97ef13e, 0xff200dc7,
0x1c1221ac, 0x1ca90cf4, 0xf747e207, 0xd478d2b2,
0xdea2f388, 0x0cc22293, 0x2cc72924, 0x18ed00c8,
0xe6efd510, 0xcf8fd8ac, 0xeb63038c, 0x164420f4,
0x222b1813, 0x0893f762, 0xea1ee4fd, 0xe906f12f,
0xfb880307, 0x05b60578, 0x02d1fefb, 0xfdb200b3,
0x04be081d, 0x091a04f9, 0xfb23ef06, 0xe55ee1fb,
0xe760f4b6, 0x07b819ba, 0x247224b9, 0x18c303a5,
0xec46d88a, 0xd01dd581, 0xe6c1ff9d, 0x177b280f,
0x2c12227b, 0x0ebcf69e, 0xe0c1d510, 0xd713e44f,
0xf72f0b6a, 0x184c1cce, 0x17b40bdb, 0xfe28f252,
0xed17ed62, 0xf356fb57, 0x00420116, 0xfedefa73,
0xf9affac6, 0x000e06f9, 0x0e2b11a1, 0x0cf502d8,
0xf362e4a8, 0xdd30deab, 0xea24fcc7, 0x11c122c7,
0x29362429, 0x1163f941, 0xe160d199, 0xd00edb60,
0xf12d09c9, 0x1ee929e9, 0x274418f2, 0x0405ed9a,
0xde09d9ce, 0xe057efba, 0x00ea0ecd, 0x15de1494,
0x0dd3035e, 0xf9e5f44a, 0xf422f7cd, 0xfbf3ff43,
0xfe08fa3f, 0xf4e0f25f, 0xf411faf4, 0x05760f72,
0x166a154d, 0x0b51fac9, 0xe914daff, 0xd706de3d,
0xeee105d0, 0x1b2b288d, 0x2a2b1d64, 0x06aaec8f,
0xd865cf0b, 0xd4a2e638, 0xfcd71302, 0x226326ea,
0x1eaf0ef6, 0xfa32e980, 0xe107e198, 0xeaf3f8ad,
0x052d0d0d, 0x0e690aa7, 0x04a5fd6e, 0xfa07f9b6,
0xfc28005e, 0x00c1fce0, 0xf734f03b, 0xebb0ed15,
0xf4970043, 0x0e241930, 0x1ce015d5, 0x05bef1b5,
0xdeebd4d7, 0xd693e3f4, 0xfa2612cc, 0x25792c79,
0x25cf14a4, 0xfbfae49a, 0xd607d2a3, 0xdcf9f118,
0x06391800, 0x20f81ea1, 0x146c038b, 0xf347e81f,
0xe559ea67, 0xf460feaf, 0x0521077f, 0x05d90299,
0xffb1fe3f, 0x000f04bf, 0x07c407e0, 0x0298f9fe,
0xefade763, 0xe581eb69, 0xf9430ac2, 0x1a6621d9,
0x20231320, 0xfddae7cc, 0xd7a4d1d9, 0xd95febdd,
0x04131a78, 0x289a29b7, 0x1db00967, 0xf0a1dd50,
0xd3e7d8af, 0xe6befa1a, 0x0dcf18d7, 0x1c9e1617,
0x0941fb01, 0xefc5eb8b, 0xecdaf28b, 0xf9ffff7c,
0x0104fe1d, 0xfa2ff8f0, 0xf97aff0d, 0x05ff0b66,
0x0d9a09ae, 0x001bf284, 0xe5c1dfd3, 0xe21ced56,
0x006a129d, 0x20bb24d1, 0x1c710a3d, 0xf36ade40,
0xd261d337, 0xe0b3f6be, 0x0ebd21ce, 0x28d72471,
0x1407fe29, 0xe8fcdbb2, 0xd998e1db, 0xf07b016b,
0x0ec614e6, 0x141b0c45, 0x0275f926, 0xf439f413,
0xf814fbb6, 0xfedfff05, 0xfbaff7da, 0xf462f78b,
0xfdc70685, 0x103514df, 0x1335087b, 0xf9deea6b,
0xdee0dc83, 0xe362f4ea, 0x09ec1cc0, 0x26bb2444,
0x16bb0094, 0xea1cd875, 0xd20bd941, 0xea410119,
0x1634230d, 0x25331c53, 0x0a2af54c, 0xe61edfb0,
0xe1daeba6, 0xfab00722, 0x0ea01005, 0x0b1a045d,
0xfd4bf98d, 0xf929fca5, 0xffd90095, 0xfe23f900,
0xf333ef9e, 0xf098f7dc, 0x03a01059, 0x197f19f9,
0x12ab0321, 0xf071e0bb, 0xd8c1db02, 0xe8e6fd9b,
0x13b62476, 0x287a208e, 0x0f60f799, 0xe228d5bf,
0xd5f0e1c9, 0xf4880950, 0x197a20bb, 0x1d9010e7,
0xfefbf016, 0xe68ae4ee, 0xeab1f4be, 0xffe20731,
0x0a0007ce, 0x0312ff0b, 0xfd5cfe64, 0x01e7050d,
0x0402005e, 0xf8bdf03d, 0xea27e95e, 0xefe7fd4e,
0x0d2d19ea, 0x20661c07, 0x0efbfb1c, 0xe673d93a,
0xd53cddd7, 0xefb9065e, 0x1b412654, 0x25a718a3,
0x0571eeba, 0xde41d822, 0xdd78eb98, 0xfedd1075,
0x1a2e1c16, 0x1420074f, 0xf946ef21, 0xeaf4ecfb,
0xf2e8fb0e, 0x012d0385, 0x029dff5e, 0xfd59fdb2,
0x01510749, 0x0b990b9a, 0x066ffd9c, 0xf18ce834,
0xe300e5ce, 0xf1c201d4, 0x131b1f28, 0x20b617b1,
0x05aaeffb, 0xde91d44d, 0xd82ee55c, 0xfa721175,
0x2115265b, 0x1ff20f34, 0xf979e6ac, 0xdc3edb45,
0xe514f503, 0x056c11af, 0x16f014ae, 0x0a930061,
0xf64cf244, 0xf263f678, 0xfb50fea4, 0xffbdfce5,
0xf939f6fa, 0xf905fe05, 0x06310d46, 0x11fa0f51,
0x0580f804, 0xea42e153, 0xe02ae904, 0xf9f60d9c,
0x1dcc2511, 0x208d11a6, 0xfc25e644, 0xd6b1d2c3,
0xdb6aedaf, 0x03881703, 0x22fa22b5, 0x17bb06a4,
0xf2e2e51f, 0xe039e349, 0xef30fc68, 0x08d70f50,
0x0f890b30, 0x0304fc5b, 0xf91bf90a, 0xfabcfe4c,
0xffe9fe31, 0xf9a3f519, 0xf1fef3df, 0xfae2046b,
0x0df61528, 0x14d80ccc, 0xfddaed09, 0xe0e5db52,
0xe0eceefb, 0x036316ec, 0x250227a5, 0x1da70b5e,
0xf406e006, 0xd6c1d8a7, 0xe4eef891, 0x0c291b2b,
0x1f601a89, 0x0e09fd46, 0xee76e5a6, 0xe4e3eaa5,
0xf64700da, 0x076b0847, 0x058c0150, 0xfce0fb22,
0xfc8dfff8, 0x029303db, 0xff83f8ed, 0xf152ec63,
0xecfff35e, 0xfeaf0c61, 0x171f1ae1, 0x1687086b,
0xf651e467, 0xda65d973, 0xe32bf5cb, 0x0b9b1d72,
0x25bd22b0, 0x13e6ff34, 0xead1dbce, 0xd773df3a,
0xef96024b, 0x12551b59, 0x1bcb138f, 0x055ef7b7,
0xeea2eb78, 0xec5ef2db, 0xfb3600f5, 0x020a014f,
0xfeeafd2c, 0xfd6b006d, 0x05c108b9, 0x0939053d,
0xfcadf1b9, 0xe956e5dc, 0xe934f4d5, 0x05381432,
0x1d7d1db1, 0x133500e4, 0xed5addc9, 0xd6fcdc38,
0xead3ff74, 0x14b322ae, 0x258d1c9e, 0x0b80f61d,
0xe450db50, 0xdbd6e713, 0xf77a080b, 0x135a1834,
0x146c0b20, 0xffe0f635, 0xf250f247, 0xf511fa1f,
0xfe06fded, 0xfcf8f9a2, 0xf88cfa5d, 0xff93073d,
0x0d961024, 0x0bdc028d, 0xf58ee960, 0xe25ae259,
0xebc3fc8c, 0x0ded1c77, 0x213e1bf4, 0x0d4df93e,
0xe614d9d7, 0xd86de1d8, 0xf3f9080c, 0x18d720e6,
0x1ff31352, 0x00ffef8c, 0xe331dfaa, 0xe3feefd1,
0xfe2e0a3a, 0x0f220f32, 0x0a2401a3, 0xfaeef6f3,
0xf775fa7c, 0xfd21fdff, 0xfd9cf9dc, 0xf593f370,
0xf606fd07, 0x058c0e9c, 0x13da1261, 0x094cfb12,
0xebfae175, 0xddcae3b5, 0xf2c30600, 0x175b22a6,
0x221c1723, 0x054df080, 0xdfa2d764, 0xdbfeea60,
0xfd5f0fb8, 0x1c5d1f16, 0x18770a5c, 0xfa05ec6f,
0xe5a7e5ce, 0xecaef85c, 0x02d4095a, 0x0ae607df,
0x0312ff2a, 0xfb5ffb93, 0xff1f014f, 0x00b0fd08,
0xf7c1f150, 0xed4cee7c, 0xf5d4017f, 0x0d671744,
0x19471291, 0x04ebf2f7, 0xe398db17, 0xdbf1e6fd,
0xf9520e02, 0x1e6324dc, 0x1fbe10ac, 0xfceee9e8,
0xdcc1da62, 0xe30af388, 0x05791475, 0x1ac41984,
0x10fc0234, 0xf549ebb2, 0xe9aaecf8, 0xf494fdaf,
0x03ea05e4, 0x044d01eb, 0xff5bfe15, 0x000b03e3,
0x05a805d6, 0x01a1f993, 0xf1c3eb3d, 0xe8f3edea,
0xf939084a, 0x15df1cca, 0x1b781012, 0xfe22ea82,
0xdcc3d8bb, 0xddf8ee90, 0x026315fe, 0x21722276,
0x19880710, 0xf392e30d, 0xdbebde3c, 0xea21fac1,
0x0a7114a8, 0x17a71246, 0x0838fd29, 0xf3f8effc,
0xf0f5f600, 0xfb860079, 0x0130ffb0, 0xfc8afa95,
0xfb9a0034, 0x05990abf, 0x0c0207a3, 0xff0ff3bc,
0xe9abe406, 0xe5d3eff2, 0x000c0fd5, 0x1c941fb3,
0x19f609d8, 0xf5d7e3a2, 0xd93fdad2, 0xe5d4f8be,
0x0c921bfb, 0x225a1e96, 0x10dcfe7d, 0xed77e2b0,
0xe005e663, 0xf31b007e, 0x0ba1105e, 0x0ee30924,
0x007efa0c, 0xf65bf671, 0xf963fc4b, 0xfe81fdf7,
0xfaecf7b1, 0xf666f8a4, 0xfead063c, 0x0dd111f2,
0x0f5506fc, 0xfa3ceca5, 0xe32fe1a6, 0xe8b8f7e8,
0x09b11951, 0x211e1f45, 0x133400b0, 0xed77ddb3,
0xd910ddf7, 0xed8d0081, 0x12201d42, 0x1e8f1732,
0x079ff6fa, 0xea0fe489, 0xe62feee0, 0xfaab04d6,
0x0b000b71, 0x083a02a2, 0xfda8fabf, 0xfb11fd95,
0x006100a5, 0xfdd6f972, 0xf3c8f04d, 0xf16ef834,
0x024a0e0b, 0x152f15ae, 0x0ee301a2, 0xf10de3bb,
0xdd73e076, 0xecb7ff52, 0x120c1ece, 0x23751be6,
0x0be3f760, 0xe5f4db89, 0xdb81e58b, 0xf6c3080f,
0x15861bf4, 0x18630e37, 0xffbef320, 0xeb1ae9f9,
0xee2af6a4, 0xff630491, 0x0625046c, 0x0141fdbb,
0xfd78ff12, 0x021304a5, 0x041b0068, 0xf946f138,
0xeba3eb77, 0xf0fffc33, 0x0a0f161c, 0x1a8f1748,
0x0ba6fa39, 0xe9c5dd80, 0xdaf2e22f, 0xf24605bf,
0x16e320dd, 0x1faa14bb, 0x01c5efaf, 0xe101db8d,
0xe074ed4d, 0xfe540ca4, 0x16c717cd, 0x114905c6,
0xfa88f255, 0xef07f0b7, 0xf5d3fbd1, 0x00bc018c,
0x007efe76, 0xfccdfe11, 0x019906d1, 0x0b030b3b,
0x0613fe04, 0xf28be9cf, 0xe5b3e8b3, 0xf2e401c6,
0x10de1bbf, 0x1d9614d8, 0x05b6f314, 0xe2dfdb44,
0xde59ea01, 0xfc800f6d, 0x1d86212a, 0x1b9b0cfc,
0xfa7ceacf, 0xe189e15d, 0xe934f6ec, 0x04c30f96,
0x132610a4, 0x09a00074, 0xf934f571, 0xf52df841,
0xfb38fd34, 0xfd0dfae0, 0xf86ff6a5, 0xf946feea,
0x061a0cdb, 0x0fcc0d18, 0x0498f7dc, 0xeb37e379,
0xe305eb75, 0xfa600bd2, 0x19ed1f39, 0x1b2a0ea8,
0xfc68e9fc, 0xdde4db0a, 0xe22cf1ae, 0x0501144b,
0x1dd61da1, 0x13740443, 0xf374e7db, 0xe3d3e70d,
0xf05dfc5b, 0x06fd0c97, 0x0cc008c7, 0x0243fd70,
0xfa2afaa7, 0xfd07ffcd, 0xffd5fd40, 0xf962f479,
0xf2aaf4a2, 0xfb260475, 0x0e2613ea, 0x133c0b92,
0xfe88eeea, 0xe2eade25, 0xe2b3ef52, 0x012a1376,
0x1ead201b, 0x17a90765, 0xf474e425, 0xdb63dd7c,
0xe88efa3e, 0x0be91818, 0x1b7516bb, 0x0be4fcfb,
0xf0e7ea0a, 0xea92ef94, 0xf87c01f6, 0x06b4088b,
0x06190211, 0xfe8afd56, 0xfe100095, 0x02050201,
0xfeadf827, 0xf250eda7, 0xeda4f407, 0xff550bd0,
0x160c197a, 0x14070713, 0xf740e730, 0xde43de00,
0xe6b5f6e1, 0x09b219e8, 0x20f21e09, 0x113d0070,
0xeddde0f9, 0xde0ae3af, 0xf17f0128, 0x0e8f1626,
0x15340e2d, 0x034cf780, 0xeff6ecab, 0xefa7f634,
0xfcc60179, 0x01e7011a, 0xff4ffd54, 0xfd800096,
0x042b0750, 0x077a0381, 0xfb19f131, 0xeabae8bb,
0xece7f7dd, 0x062b135a, 0x1b0b1a58, 0x10bf009b,
0xefb8e11c, 0xdb9ce033, 0xed29ff78, 0x11371cd2,
0x1ec4183c, 0x08cdf676, 0xe85ce0f9, 0xe1e9ea3f,
0xf889057e, 0x0e9c12d8, 0x0f6b07b7, 0xfe87f73f,
0xf412f4c0, 0xf7f8fc09, 0xfdc2fdfb, 0xfc1bf96b,
0xf91cfb6b, 0xffac064a, 0x0b4d0cdb, 0x09b30092,
0xf661eb70, 0xe528e6c7, 0xef74fdb5, 0x0d1d19c8,
0x1d9e184f, 0x0aa5f815, 0xe7cbdd28, 0xdc37e537,
0xf50807c3, 0x16ed1e31, 0x1cbd11d8, 0x0203f1d2,
0xe75be417, 0xe81bf21b, 0xfe8d07fd, 0x0c1a0c3d,
0x07f101f8, 0xfbd0f9b9, 0xf9f8fbd8, 0xfd30fe90,
0xfd3ff9c5, 0xf5ddf3ad, 0xf652fb9f, 0x05050c7c,
0x10d50fde, 0x081bfc13, 0xee5de465, 0xe1f1e710,
0xf46a0584, 0x14d71dba, 0x1d7a134b, 0x01baf00a,
0xe1eedba7, 0xdf06eb62, 0xfcdf0db2, 0x18c81adb,
0x149708cd, 0xfa9bef8a, 0xea3aeacf, 0xf062fa0c,
0x021707ba, 0x08b10668, 0x02a4fe99, 0xfd68fded,
0x00c30122, 0x0139fd9c, 0xf7c5f27d, 0xeee9f045,
0xf62000d6, 0x0ba012d8, 0x15930fdf, 0x02eef474,
0xe703df42, 0xe098eb09, 0xfae90c2b, 0x1a351e81,
0x1a120d28, 0xfae6eab2, 0xe048de94, 0xe5dbf45e,
0x04fd1176, 0x171d1535, 0x0cf6016e, 0xf575eeca,
0xec7deecf, 0xf5e4fcf6, 0x01b203e2, 0x0259ffb8,
0xfdf3fdf2, 0x006703f6, 0x05db05ab, 0x01e4fa2e,
0xf1e0ec2f, 0xeb83efd6, 0xfb5707d5, 0x14431a47,
0x185c0e03, 0xfe7bee48, 0xe236dfb7, 0xe418f2b5,
0x04501474, 0x1de81da5, 0x14dc04eb, 0xf393e658,
0xe0d0e372, 0xee26fcf3, 0x0a2e1220, 0x13f71057,
0x0795fd31, 0xf5bbf2c4, 0xf35df743, 0xfb87fe69,
0xfe82fd40, 0xfb00fa1d, 0xfd020137, 0x05b70a61,
0x0b800681, 0xfe79f3f5, 0xeb29e653, 0xe867f231,
0x00760e87, 0x18611b60, 0x14840720, 0xf5cde667,
0xdefbdecc, 0xe988f9d6, 0x0b471928, 0x1dcb1a35,
0x0dd4fde5, 0xeeece619, 0xe48eea5f, 0xf68901e5,
0x0aa20eba, 0x0d780896, 0x00f5fadf, 0xf782f7c1,
0xf9eafca3, 0xfda4fcb3, 0xfa11f6b7, 0xf5dff845,
0xfeee06d2, 0x0ddc105c, 0x0e1905b7, 0xf9f1ed27,
0xe50fe3f2, 0xe9f5f892, 0x084916ec, 0x1d931b62,
0x0ffcff45, 0xedd6e0bd, 0xdce4e280, 0xef48ffe8,
0x0f95186c, 0x19fe11ca, 0x052bf6eb, 0xec4ae84e,
0xea49f1e1, 0xfc0804ae, 0x09ba0a0a, 0x060b01f4,
0xfdd2fb1b, 0xfb7efe9b, 0xffceff7f, 0xfd0df839,
0xf469f1a7, 0xf3acf9ea, 0x03e50d9f, 0x134b1426,
0x0d2600dc, 0xf1dce551, 0xdfeee2a7, 0xede3fe61,
0x0f251bda, 0x1ecf17e3, 0x0a0ff8bf, 0xe8fee092,
0xe01ce831, 0xf77506db, 0x123d16ae, 0x13780ae4,
0xfed5f353, 0xed2eec2b, 0xf0ddf841, 0xff320379,
0x05720303, 0x0096fdad, 0xfca4ff40, 0x013803f9,
0x0348ff83, 0xf951f299, 0xed4dedaa, 0xf323fd5b,
0x09fa1372, 0x17c21486, 0x09abfae7, 0xeba5e1a7,
0xdff0e71e, 0xf56c06a5, 0x154d1da8, 0x1cd011e1,
0x01adf051, 0xe4abe040, 0xe478efc2, 0xfe510aef,
0x11f9135e, 0x0d5403e3, 0xfab5f361, 0xf199f353,
0xf7ecfd36, 0x005f0125, 0xff4cfc19, 0xfad9fc64,
0x0093054f, 0x084808b8, 0x04cafd56, 0xf3c1ecd0,
0xe924ec90, 0xf6d60346, 0x10541892, 0x18af10aa,
0x0215f272, 0xe423ddcc, 0xe12beb86, 0xfcf20dd3,
0x198b1d5e, 0x179f0b1b, 0xfb88ecaa, 0xe4f6e44a,
0xeb52f7ef, 0x03360c33, 0x0ff60ddb, 0x07cefff2,
0xfa00f68a, 0xf750fa59, 0xfcdafe42, 0xfdcbfb6d,
0xf7eff751, 0xf986fe8a, 0x05050b23, 0x0d340b00,
0x02aef7cb, 0xee09e68e, 0xe6e7ee04, 0xfb1b0a2b,
0x16741b10, 0x17850abf, 0xfae8eaad, 0xe058dec8,
0xe591f432, 0x03b01303, 0x1a331923, 0x10140287,
0xf471eb48, 0xe7e7e9ef, 0xf298fcf9, 0x05310918,
0x094c056a, 0x00f9fc3f, 0xfa2ffb4d, 0xfd42ff62,
0xff65fcb4, 0xf92df502, 0xf2edf4f8, 0xfaf503e1,
0x0b791197, 0x10700982, 0xfe8ff08b, 0xe75ee3d0,
0xe6bcf229, 0x01fa1120, 0x1a051b61, 0x140304be,
0xf458e6e6, 0xe03be225, 0xec2ffaa0, 0x0a0a1378,
0x17401331, 0x0879fbe0, 0xf165ec59, 0xec73f13e,
0xf83f00a4, 0x04af0570, 0x040f00b3, 0xfdc5fd7d,
0xff980134, 0x024301a2, 0xfdbaf824, 0xf178eefa,
0xef69f4f9, 0xffb409db, 0x1210140a, 0x100b05d6,
0xf7a4eac8, 0xe320e2e2, 0xeb26f960, 0x09d41630,
0x1bef18a3, 0x0d34fd9e, 0xef04e53a, 0xe2aee8e3,
0xf4c00211, 0x0d2e1335, 0x11ef0bc4, 0x01faf824,
0xf1cfefb8, 0xf201f70c, 0xfca0ffe0, 0x00cbff75,
0xfd67fcfd, 0xfdbc00be, 0x047f075f, 0x06da02fc,
0xfb10f279, 0xecd1eb14, 0xeeebf8bd, 0x0572103a,
0x169b155e, 0x0d960009, 0xf176e56b, 0xe0e7e51b,
0xf0ad006b, 0x0ee11914, 0x192812e5, 0x059df6ac,
0xeb3ce509, 0xe71eee76, 0xfb020583, 0x0d0a0f23,
0x0c1a05dd, 0xfdbef7ad, 0xf560f6a6, 0xf972fd32,
0xff06ff31, 0xfcc0fa6b, 0xf9c0fb72, 0xffb60503,
0x0a340b48, 0x082d00af, 0xf640ed9e, 0xe8c7e985,
0xf202feca, 0x0be815d3, 0x196a1451, 0x07a0f8d9,
0xeb1ee25f, 0xe172e962, 0xf6cd062e, 0x126b17d5,
0x152d0ba4, 0xfed5f1fe, 0xea7ce8a1, 0xec93f4ed,
0xffa407a7, 0x0b0f092b, 0x0469fff9, 0xfb57f9d6,
0xfac7fd4c, 0xff5c000f, 0xfde8fb10, 0xf749f629,
0xf926fe5f, 0x06350c3c, 0x0fb90d78, 0x05e0fb02,
0xf003e774, 0xe53beac3, 0xf70905e5, 0x13031a29,
0x1929106e, 0x01adf2c0, 0xe6d3e205, 0xe4d3f086,
0xfe580aa8, 0x13f01530, 0x0fa80573, 0xfa5df1e6,
0xedecef8c, 0xf514fd0f, 0x037605f8, 0x05c50396,
0xfff7fd0c, 0xfc9cfd61, 0x004f0145, 0x0171fe8b,
0xf95ff501, 0xf26df33b, 0xf90401fd, 0x0a041122,
0x11870c72, 0x022ef426, 0xe989e3e4, 0xe5e2ee6c,
0xfb970a7c, 0x15a41a13, 0x158809e2, 0xfb86eecd,
0xe6a1e5d4, 0xebd6f793, 0x04480ddb, 0x1255110f,
0x098c0042, 0xf7cdf311, 0xf27df522, 0xf9dffea8,
0x01e10190, 0x0063fdc9, 0xfc84fd14, 0xffc102f8,
0x04c90454, 0x00ecfa0a, 0xf3e4eec4, 0xee55f2b0,
0xfb6f0690, 0x0fd8144c, 0x11c6091f, 0xfbdeef30,
0xe634e479, 0xe8f9f4f4, 0x0353107e, 0x181d17d9,
0x0f3e01e3, 0xf491e9ff, 0xe57ee853, 0xf184fd13,
0x06950d12, 0x0eb10a74, 0x0408fc5e, 0xf7cbf5fd,
0xf820fa6b, 0xfd27ffbc, 0xfebffced, 0xfab6f9fd,
0xfb920006, 0x053a0902, 0x096c05d5, 0xfee8f619,
0xee8fec21, 0xed50f554, 0x00f50bfd, 0x145a15eb,
0x0fb90408, 0xf73dea67, 0xe468e569, 0xeecdfbde,
0x0938131c, 0x1757138c, 0x08c4fc7b, 0xf07eeade,
0xe925ee28, 0xf70700e2, 0x077e0a61, 0x092e0439,
0xff53fa47, 0xf93ff9a6, 0xfc4ffde2, 0xfe75fd26,
0xfa3bf7aa, 0xf5ecf810, 0xfca803cf, 0x09200bc4,
0x0aa103bd, 0xfa11f103, 0xea53e89f, 0xee8cf984,
0x06021149, 0x16de1579, 0x0c02fe62, 0xf15ae778,
0xe3fee969, 0xf42e013a, 0x0dc91343, 0x13770c4a,
0x0221f811, 0xef2aec13, 0xee72f452, 0xfc2402ed,
0x054704f6, 0x0285ffa0, 0xfcbdfbb3, 0xfd91ffcf,
0x00bc007b, 0xfe23f8ea, 0xf410f2c7, 0xf4c5fabe,
0x022d0a05, 0x0f870f74, 0x0a30ff23, 0xf3aaea2c,
0xe615e91a, 0xf214ff10, 0x0bec1494, 0x16f11188,
0x0613f88d, 0xed27e61c, 0xe727eeac, 0xfa680656,
0x0e8e121c, 0x0e360729, 0xfd39f586, 0xf0c4f0ff,
0xf55bfa9f, 0xff8f02c8, 0x037c00e5, 0xff31fd8a,
0xfea1008a, 0x021b0407, 0x0377ffe5, 0xf9acf3f4,
0xefcdf068, 0xf582fe0b, 0x08010fb0, 0x133e1093,
0x07a5fabc, 0xef76e71e, 0xe577ec36, 0xf75d04ca,
0x0f9315a6, 0x14120aa9, 0xff09f218, 0xea12e7b8,
0xebe1f4f5, 0x009409f1, 0x0eb10e5a, 0x08d20206,
0xfa92f5d7, 0xf3b1f6ba, 0xfa6efdfb, 0x005d00ee,
0xff04fd9a, 0xfd4bfe14, 0x01d50589, 0x0833077e,
0x038cfd44, 0xf64cee7b, 0xec48ef45, 0xf7130323,
0x0d26135a, 0x13c50db9, 0x0298f5b0, 0xea9ae508,
0xe80ef1a1, 0xfe4f0b2d, 0x141a15ae, 0x0f810555,
0xf9f2eff1, 0xea4eeac0, 0xf0e5fa86, 0x031f0843,
0x0a4a085d, 0x0411fdc3, 0xf9caf953, 0xf96cfbbc,
0xfdfbffcb, 0xfe9bfb77, 0xf98bf90f, 0xfa53ff8a,
0x04d2090f, 0x0b3407e7, 0x01f7f7cd, 0xef2aea17,
0xea85f182, 0xfcfc091b, 0x12cb15fc, 0x11e8089b,
0xfc00f030, 0xe79ce5ec, 0xec06f7fd, 0x04b20f22,
0x13dd12d6, 0x0ba0018d, 0xf75bf076, 0xeebef093,
0xf73bff86, 0x04b6065c, 0x061802d2, 0xfed0fc0a,
0xfa9ffc3a, 0xfe860057, 0xffd7fd68, 0xfa5ff706,
0xf5def75c, 0xfc5b02fc, 0x09060d35, 0x0bb50579,
0xfd49f25d, 0xeafce7f5, 0xec4ef633, 0x02c60e0a,
0x14dc163c, 0x0ee00382, 0xf610ebca, 0xe64de87a,
0xf0f4fcee, 0x07d60e81, 0x10ad0d6e, 0x0582fbfe,
0xf50af17d, 0xf2aaf68c, 0xfc480195, 0x045803fd,
0x01eeff57, 0xfd5bfd53, 0xff550160, 0x020801da,
0xfefbf956, 0xf475f23a, 0xf298f797, 0xffa10845,
0x0e541081, 0x0cb70304, 0xf822ed8c, 0xe82ee87e,
0xefc2fbc2, 0x080411cb, 0x15fc11f2, 0x0897fd03,
0xf0eeea24, 0xe88eee9c, 0xf80e02ee, 0x0ad20e5d,
0x0d7a077d, 0x006bf95b, 0xf49af409, 0xf6bdfa2c,
0xfdd7000d, 0x0029fe1d, 0xfc73fba3, 0xfdb800f2,
0x042e062b, 0x05620260, 0xfc37f5d0, 0xf10bef8b,
0xf2fefb25, 0x04c70d8b, 0x133910f0, 0x09f3ff69,
0xf34feafa, 0xe7f7ec30, 0xf57f01ee, 0x0d0f133f,
0x13b60dfb, 0x0376f834, 0xef48ea75, 0xec4ff26f,
0xfbc60430, 0x094a0b37, 0x07b30359, 0xfe21fa44,
0xf92afa74, 0xfc1bfe60, 0xff35fd98, 0xfbd3f9a5,
0xf96bfaf1, 0xff980455, 0x082c0985, 0x0733002f,
0xf816f0eb, 0xecafee50, 0xf49dff4f, 0x092710bf,
0x128b0da8, 0x051ef932, 0xeea0e8c5, 0xe8a6ef81,
0xfa76060c, 0x0ede134a, 0x10d008de, 0xfe06f562,
0xefcdee07, 0xf23bf8ac, 0x00b504db, 0x06ff063e,
0x0319ff93, 0xfb59fb05, 0xfc7bfe1f, 0xffeaff77,
0xfcf9f9e2, 0xf6f9f61c, 0xf81efd65, 0x038008cc,
0x0c3b0ab3, 0x0482fc33, 0xf2b3ec36, 0xeb2bef02,
0xf8ea0382, 0x0d6212eb, 0x12110ae8, 0xff73f44c,
0xeb8ee8e6, 0xec50f4ec, 0xff9f09cb, 0x0f250f61,
0x0a460287, 0xfa0af313, 0xf0ecf265, 0xf6d3fcf1,
0x01ad048f, 0x042f0247, 0xffb0fe1f, 0xfe04fe8b,
0x00ae0119, 0x0069fcc7, 0xf8f6f4e2, 0xf312f4bb,
0xfa1701ea, 0x095f0e68, 0x0eb00a1f, 0x01e2f76c,
0xee08ea95, 0xebc0f271, 0xfd420891, 0x10b712fe,
0x0f0f05fb, 0xfa4bf024, 0xeb38ebbb, 0xf0c6fa65,
0x041f0ad3, 0x0d060ba3, 0x059bfe5e, 0xf881f465,
0xf4eaf716, 0xfc0f0005, 0x01720168, 0x000dfe58,
0xfd7cff24, 0x01170370, 0x049e036c, 0x0082fa91,
0xf4d6f0b3, 0xf00bf400, 0xfc050542, 0x0c711008,
0x0dad0687, 0xfc3df241, 0xeabde8fb, 0xedf3f773,
0x02180c83, 0x127611a8, 0x0b570152, 0xf714eeca,
0xec1ceef8, 0xf5ecfed5, 0x05ef09a9, 0x09b205e0,
0x0123fb87, 0xf7a4f702, 0xf882fb90, 0xfddcfe40,
0xfdf7fc9b, 0xfa8cfae7, 0xfc6b003f, 0x04a6073e,
0x073d0432, 0xfe4ff726, 0xf122ef25, 0xf0daf7ee,
0x01190928, 0x104410cf, 0x0bf501e3, 0xf6b4edbf,
0xe8d2ea1d, 0xf1e7fc5e, 0x06c80eed, 0x11720dc4,
0x06b4fcdd, 0xf406ef65, 0xef55f43b, 0xfb4501f3,
0x05ef0827, 0x062902ec, 0xfef0fb5b, 0xf9fdfb7b,
0xfd63ff8f, 0x001bfe2e, 0xfb3cf909, 0xf8effa8b,
0xfeda02ed, 0x078308b5, 0x06d801b7, 0xf9fef237,
0xed76ee3d, 0xf32bfc4d, 0x06490e97, 0x12ff1020,
0x0883fdac, 0xf2deec11, 0xea7aeea3, 0xf75101a7,
0x09fa0f39, 0x0ebd08e8, 0x0166f9c9, 0xf382f21e,
0xf3fff88c, 0xfe780289, 0x0488036b, 0x0179fe7f,
0xfcfdfd09, 0xfe060074, 0x011600b7, 0xfdd8f98e,
0xf686f5c2, 0xf74dfc06, 0x01d507d7, 0x0bf00b88,
0x06e9feb5, 0xf5beee9b, 0xeb74ee3d, 0xf5d600c3,
0x0a6f1117, 0x12750c64, 0x0340f83c, 0xeffeeb45,
0xebccf1f1, 0xfbcc049b, 0x0a8b0c51, 0x0a070466,
0xfd52f79f, 0xf41df421, 0xf758fc04, 0xff330111,
0x00bb000f, 0xfe1efd56, 0xfe020064, 0x02f50427,
0x0349ffea, 0xfb7ff567, 0xf31ef2f3, 0xf6d1fde3,
0x05cb0c50, 0x0de60b76, 0x0486fa17, 0xf118ec50,
0xebf7f182, 0xfa39058c, 0x0d3611a5, 0x0f0607ad,
0xfea6f498, 0xedffec79, 0xf098f78c, 0x00d907a6,
0x0a9a099d, 0x060a0069, 0xfb80f7f9, 0xf725f8da,
0xfc14fddf, 0xff7efe69, 0xfc84fb21, 0xfb59fdc8,
0x000a0444, 0x06210620, 0x032bfdbc, 0xf6cbf252,
0xf091f307, 0xf9d50245, 0x0a3b0edf, 0x0e5308a4,
0xff57f62b, 0xee8eeb62, 0xee60f5f7, 0xff8b08b7,
0x0f690f50, 0x0ab702cc, 0xf9a8f2bf, 0xef55f01d,
0xf584fbd9, 0x030906d5, 0x07ee059a, 0x01d3fe11,
0xfb2bfae9, 0xfb5bfd70, 0xfebbff42, 0xfdbefb45,
0xf968f9a2, 0xfb630032, 0x04d80878, 0x09700753,
0x01a8f97e, 0xf2e4eed4, 0xef0cf49a, 0xfd2c05e6,
0x0d6a0f5f, 0x0c0b040f, 0xfa4af0ce, 0xeb83ec07,
0xf164faaa, 0x03ff0afc, 0x0e7d0cd9, 0x0669fead,
0xf750f2e2, 0xf233f4f3, 0xfb0f00f7, 0x042e0513,
0x0462026e, 0xfebefcc7, 0xfcabfd89, 0xffc90011,
0xff58fcba, 0xf9f3f785, 0xf654f8cc, 0xfde1030a,
0x07e00b1b, 0x09970524, 0xfca8f3e6, 0xeeafed5a,
0xf095f873, 0x01bc0ae6, 0x10520fe5, 0x0a0800c3,
0xf74aefee, 0xed2aef47, 0xf6e7fe6b, 0x06500be9,
0x0bdc085c, 0x016bfb3f, 0xf633f415, 0xf542f888,
0xfdad010b, 0x024b01ef, 0x00b2fe61, 0xfdaafe03,
0xffcb01a2, 0x01e90103, 0xfd9cf9d4, 0xf608f3a7,
0xf51cf9f3, 0x006106e6, 0x0b950c61, 0x08d20160,
0xf84cf0a6, 0xebdbed33, 0xf3bcfd3a, 0x06820d79,
0x103f0cfb, 0x05cafcfc, 0xf47eefdf, 0xef58f3a8,
0xfa580216, 0x080c0958, 0x086203c9, 0xfe61fa1d,
0xf73cf730, 0xf968fc24, 0xff41002b, 0xffd9fd90,
0xfcb7fcea, 0xfd8d0030, 0x0289040e, 0x03eb00b0,
0xfb75f688, 0xf2d7f287, 0xf5cffcf2, 0x047e0ac4,
0x0d8d0c0b, 0x05cbfd8c, 0xf4afee24, 0xec14f039,
0xf88f0132, 0x0a300ea9, 0x0ec80962, 0x0139f931,
0xf293f07a, 0xf221f70f, 0xfdb803b3, 0x05d305d3,
0x03f5fff3, 0xfc24fa4b, 0xfa5dfb28, 0xfd4dff01,
0xffcdfe05, 0xfbd4fa96, 0xfa6dfcb5, 0x00a7045e,
0x06cc06f7, 0x041eff48, 0xf8b0f338, 0xf1caf35a,
0xf8e400eb, 0x08470dc6, 0x0e600a37, 0x0298f8c2,
0xf02dec6d, 0xecccf350, 0xfc3b0528, 0x0b780d47,
0x0b480503, 0xfd97f678, 0xf38ef324, 0xf632fb45,
0xfff5039e, 0x04b503a5, 0x0139feb1, 0xfd2cfda2,
0xfe93006d, 0x014f004d, 0xfe20fac2, 0xf8bdf8b3,
0xf9d9fe33, 0x029d071d, 0x093606b3, 0x0289fad8,
0xf3dcefe6, 0xef58f37c, 0xfbaa042b, 0x0b570f03,
0x0ceb076b, 0xfe1bf52d, 0xef9ced2a, 0xf0c7f7d0,
0xffae0763, 0x0bcc0b5a, 0x074c011f, 0xfb01f61a,
0xf459f5b6, 0xf940fdf3, 0x00b001c4, 0x0132ff7f,
0xfd55fcf2, 0xfd51ff68, 0x013d015c, 0x00befde3,
0xfa96f6df, 0xf59cf6ed, 0xfaf8010e, 0x06a70a7b,
0x0ab306ce, 0x0036f88c, 0xf1e3eef0, 0xf084f6d2,
0xff140791, 0x0c960d64, 0x09b90260, 0xf9c7f32c,
0xef65ef8e, 0xf557fd5f, 0x041908b7, 0x0afd0776,
0x039ffe6e, 0xf96df747, 0xf7a3fa2e, 0xfceeffc4,
0x00d90052, 0xff5afe20, 0xfdd2ff60, 0x013f03b1,
0x04c30333, 0xff8dfb35, 0xf6f9f39d, 0xf324f76d,
0xfd52045c, 0x0a570c59, 0x0a68042b, 0xfc61f494,
0xefe1ef80, 0xf2d4fb37, 0x037809e0, 0x0d500bab,
0x066dfe6d, 0xf767f202, 0xf120f3a7, 0xf9620067,
0x054107d1, 0x07a6047a, 0x00c0fca0, 0xf9d2fa00,
0xfaf7fd16, 0xfdeafe18, 0xfdc0fc38, 0xfae4fb4a,
0xfdaa0118, 0x038d059d, 0x057202b1, 0xfdfcf7f1,
0xf3bef209, 0xf3ecf9f8, 0x017d0875, 0x0ca40c63,
0x087e00b1, 0xf7b3f0fc, 0xeeeef0a4, 0xf689ff13,
0x06260b13, 0x0bea0903, 0x026afadb, 0xf5a7f29d,
0xf306f77a, 0xfcb50228, 0x04bc0540, 0x03d200cb,
0xfe44fbe6, 0xfcd4fcf9, 0xff620071, 0x002afddb,
0xfad2fa17, 0xf9f1fb58, 0xffa40426, 0x06b0080c,
0x05560161, 0xf9b0f42a, 0xf0bef17e, 0xf5c6fce9,
0x05e10b7b, 0x0d390a75, 0x04cbfcce, 0xf5a2f073,
0xf096f3de, 0xfabd02a7, 0x07e30b17, 0x0a4b04c4,
0xfea8f971, 0xf62af645, 0xf75afbd0, 0x0072020d,
0x024701c5, 0x0000fd78, 0xfcadfce8, 0xfd8fff94,
0x0041ff14, 0xfd29fa6b, 0xf7c1f6fc, 0xf94dfd3a,
0x024d073a, 0x09ae0890, 0x04b2fdba, 0xf65bf13e,
0xf010f2a3, 0xf867016f, 0x08a90cb8, 0x0c91085b,
0x018af9c0, 0xf369f085, 0xf298f719, 0xfe8f0456,
0x07bc0901, 0x0598013c, 0xfc45f8be, 0xf6b2f80b,
0xfaaffe0b, 0x00ed0130, 0x00e3febc, 0xfd6bfce1,
0xfe04fffc, 0x01ca0214, 0x015afe9f, 0xfa5ef777,
0xf4a3f63d, 0xf950ff48, 0x054608ff, 0x0aac072a,
0x01cdfa4a, 0xf3fef058, 0xf0fff4fc, 0xfc4c0454,
0x0a380c97, 0x09df04ef, 0xfd0af605, 0xf240f241,
0xf4bbfa93, 0x00a0051c, 0x07130618, 0x03e2ff34,
0xfb94f9f6, 0xfa50fbf2, 0xfe65ffb9, 0x0078fece,
0xfd43fc4b, 0xfc19fdca, 0x000b02ff, 0x04d004a6,
0x020bfd3e, 0xf8bbf515, 0xf40bf7b3, 0xfc83030c,
0x08c40c09, 0x0abb05d6, 0xfe4df6cc, 0xf154ef7a,
0xf298f937, 0x01200733, 0x0bbf0b8b, 0x07ca0134,
0xfa23f4cb, 0xf2c3f34c, 0xf780fd7e, 0x01910439,
0x04ab0312, 0x0011fdde, 0xfc57fc9e, 0xfd93ff27,
0x0022ff8f, 0xfddbfb96, 0xfa32fa21, 0xfbcaff92,
0x0352058d, 0x060803d8, 0xffc4f9aa, 0xf507f273,
0xf3e3f877, 0xfefd0644, 0x0ad70c7a, 0x08d602d8,
0xfa53f362, 0xf026f097, 0xf4f1fc07, 0x03940868,
0x0b440917, 0x03f2fe5b, 0xf91cf67b, 0xf636f7a9,
0xfb90ffc1, 0x02610272, 0x0197ffd4, 0xfda5fd48,
0xfd65feba, 0x0036003e, 0xffa0fd3e, 0xfabbf85d,
0xf79bf9e6, 0xfd9801cd, 0x057f07cd, 0x06ca0270,
0xfca9f64a, 0xf277f220, 0xf481fb3a, 0x01f207f0,
0x0b8d0a97, 0x0546fee8, 0xf7dbf2b8, 0xf1d6f397,
0xf9920000, 0x058908d3, 0x087c0578, 0x0099fc27,
0xf87ff6f0, 0xf83afa6e, 0xfd94004a, 0x00be006d,
0xfee0fdd6, 0xfe4ffebc, 0x00b9019a, 0x0277010b,
0xfe4cfb34, 0xf775f5f4, 0xf6ebfb29, 0x009804ed,
0x08110945, 0x05c10098, 0xfa0ef468, 0xf219f30f,
0xf78bff25, 0x05640a1d, 0x0b4f078c, 0x0223fb15,
0xf55af221, 0xf318f71f, 0xfc8d0296, 0x0670075d,
0x056f01fd, 0xfe54fa67, 0xfa64f9d9, 0xfb80fd9a,
0xfed70054, 0xfeabfdd4, 0xfd35fd31, 0xfe9300bc,
0x025e0422, 0x02bbffdb, 0xfc08f815, 0xf4a2f4c6,
0xf88bfc9d, 0x032b07aa, 0x0930086b, 0x03b3fd31,
0xf69ff258, 0xf232f524, 0xfb68020f, 0x06e70a87,
0x09830500, 0xff5ff8e6, 0xf4a9f399, 0xf631fa48,
0xff69039e, 0x051a04e3, 0x026cfeee, 0xfc3afa6f,
0xfa4afc2f, 0xfdfafe2d, 0xfe49fdc4, 0xfb74fb2c,
0xfb35fce4, 0xfffa02ce, 0x048904d7, 0x0332fde1,
0xf956f53a, 0xf3e6f60d, 0xfab8005a, 0x06de0a90,
0x0a4a0679, 0x00bafa27, 0xf3bef216, 0xf2d3f795,
0xfe4f03db, 0x079b093e, 0x062b0172, 0xfbf3f7d8,
0xf599f6a3, 0xf9cafdbd, 0x00f40274, 0x038a0142,
0xff73fd19, 0xfd01fcde, 0xfe9affd3, 0x003cffa4,
0xfdd0fb72, 0xfa15f9df, 0xfbc2ffa1, 0x022605c9,
0x060704ee, 0x008ffb6f, 0xf5b1f2f7, 0xf32ff6db,
0xfd7c03a5, 0x09380b21, 0x0906041e, 0xfdbbf798,
0xf3a3f275, 0xf5ddfacb, 0x0094059f, 0x082306c3,
0x0424ff95, 0xfad7f908, 0xf8c1f995, 0xfc79ffb0,
0x013f01d4, 0x0116ff61, 0xfda3fd61, 0xfdafff3d,
0x00c50131, 0x003afdc4, 0xfb01f88c, 0xf8aaf91d,
0xfc8e017b, 0x054e080d, 0x07050382, 0xfe44f865,
0xf37bf2a8, 0xf466f953, 0xffc2057a, 0x08dd0999,
0x067500d5, 0xfabaf586, 0xf328f3ad, 0xf84efd54,
0x027e0546, 0x063204a0, 0x0156fd46, 0xf9d6f9b9,
0xf9e8fc0b, 0xfe530005, 0x0052ff76, 0xfe12fd18,
0xfd73fec4, 0x00f601fa, 0x020f01da, 0x001bfc5e,
0xf887f618, 0xf700fa16, 0xfe650357, 0x06c9084a,
0x066d0105, 0xfb85f57e, 0xf2bcf326, 0xf692fd51,
0x03180785, 0x0a4d087e, 0x03affdfd, 0xf80ff4c7,
0xf3dbf712, 0xfad3ffe7, 0x03cb0548, 0x048601da,
0xff0dfcb2, 0xfb2ffbc2, 0xfd97fe79, 0x006aff91,
0xfe0ffc4d, 0xfabdfb7f, 0xfd3bff7b, 0x027603f4,
0x03d1011d, 0xfce6f921, 0xf66bf62e, 0xf717fc22,
0x018c05f7, 0x08c507fb, 0x0466ff34, 0xf89ff3d7,
0xf329f4fc, 0xfa58ffb2, 0x05100869, 0x086c0596,
0x0158fbf7, 0xf789f5f0, 0xf746f9bf, 0xfd2300c2,
0x01f901de, 0x0133ff85, 0xfd71fcdd, 0xfd16fdbd,
0xfe4d0004, 0xfe4afcb5, 0xfb08f9a4, 0xfa64fc20,
0xff500289, 0x04dc04eb, 0x039affce, 0xfa96f66b,
0xf3fbf4be, 0xf8e6fdfa, 0x04190806, 0x08ed0641,
0x0224fc19, 0xf6c7f34d, 0xf39af795, 0xfbf901df,
0x05560763, 0x063d02b8, 0xfe8efac6, 0xf890f87c,
0xf9f3fd3a, 0xffd00135, 0x01e000ac, 0x0001fe9f,
0xfd8afe8d, 0xffcc009c, 0x009ffeda, 0xfcb6fa28,
0xf8eaf8ff, 0xf9f8fc99, 0x014804e6, 0x06110571,
0x029cfdda, 0xf985f572, 0xf3aff6b5, 0xfbca01bf,
0x062a08ec, 0x083004a6, 0xffe1fa28, 0xf5c4f469,
0xf621fa5e, 0xff310386, 0x05a0055d, 0x02d4ff4a,
0xfb9cf9b2, 0xf950f9a6, 0xfba8fdc5, 0xffb8ffc7,
0xffe9feca, 0xfdfffe51, 0xff6400df, 0x01c10208,
0x0143feb2, 0xfbe1f8e9, 0xf744f8f0, 0xfaabffc3,
0x03b8067f, 0x076f0403, 0x00a5fb12, 0xf619f3d8,
0xf4d6f8a7, 0xfdf1031a, 0x069d07f5, 0x05e201fa,
0xfcbdf85e, 0xf5d6f60e, 0xf8cefcd0, 0x009403b9,
0x04bb0316, 0x00e4fe10, 0xfb77fa52, 0xfab6fbf0,
0xfde0fdfa, 0xfdbffd8e, 0xfcd6fd2f, 0xfcadfe56,
0x00470209, 0x03fb0277, 0x007dfca1, 0xf8a7f64c,
0xf64af8e0, 0xfd4d0257, 0x05ce086b, 0x06b30301,
0xfe57f837, 0xf45cf356, 0xf67cfaff, 0x009c04fb,
0x082d0769, 0x03a50013, 0xfabef829, 0xf6aff84f,
0xfa81ff02, 0x01930360, 0x033400dd, 0xff4afd1d,
0xfd1efce2, 0xfdb8fdcc, 0xff99fe3b, 0xfd70fc55,
0xfae2fb8d, 0xfd37ffb8, 0x024d0436, 0x03f60252,
0xfe6efa7a, 0xf6fbf607, 0xf753fb0b, 0xfffd054a,
0x0786080e, 0x05c9011b, 0xfbadf6d5, 0xf492f475,
0xf8d9fd61, 0x02c505fc, 0x0609053d, 0x01b1fdc5,
0xf9fbf8b0, 0xf922fa57, 0xfdb20044, 0x01ac013e,
0x00ffffcb, 0xfdfdfe3b, 0xfdc4ff0e, 0x0009fffa,
0xffe9fdf9, 0xfbe5fa2a, 0xfa08fb84, 0xfe2f0138,
0x03e80501, 0x03a200d7, 0xfc54f7e6, 0xf4c2f4dc,
0xf78dfc90, 0x016d0572, 0x07df0699, 0x0320fe34,
0xf9b8f641, 0xf5b4f760, 0xfb32ffbd, 0x038c0529,
0x05150271, 0xffbbfc27, 0xfa17fa6b, 0xfa83fd2d,
0xfeef00b2, 0x00f800b1, 0xff1dfe07, 0xfe06fe67,
0x007300e5, 0x01260056, 0xfe42fbab, 0xf993f953,
0xf9a5fcc5, 0x00e303e1, 0x056605e9, 0x03e3ff07,
0xfb0cf786, 0xf601f702, 0xfaa0ffa6, 0x0428073c,
0x07bf04d8, 0x0114fc3d, 0xf7f3f649, 0xf69df9c2,
0xfdb90168, 0x035a044b, 0x031b005b, 0xfdd4fbba,
0xfadafbe2, 0xfd78fe02, 0xffecffbb, 0xfe32fd81,
0xfd00fd79, 0xfe660024, 0x01b201fa, 0x0181ffcf,
0xfc9cfa1e, 0xf777f7b9, 0xfa6afd36, 0x027c0500,
0x060704cf, 0x0101fcc0, 0xf7cdf61e, 0xf603f87a,
0xfd1d01ff, 0x0528078f, 0x05f1032b, 0xfed3fa3b,
0xf7b6f6cb, 0xf902fb99, 0xffc0019d, 0x040302d0,
0x0165ff9c, 0xfd30fcf1, 0xfcb3fde9, 0xfdf7fe5a,
0xfe27fd79, 0xfb32fb17, 0xfb34fd04, 0x002400d4,
0x03930276, 0x0117fdd6, 0xf9dff7a7, 0xf6bbf8e0,
0xfc08009a, 0x046a060f, 0x05c30393, 0xff0bfa23,
0xf6c0f5ff, 0xf6c7fa5b, 0xfe740357, 0x057805ac,
0x0390ffae, 0xfbe2f95c, 0xf8fff91c, 0xfae3fdb9,
0x008e0135, 0x014000ff, 0xff46fdc8, 0xfe50fdb1,
0xff1dfff3, 0xfff5fe4b, 0xfd46fbec, 0xfab3fb15,
0xfbf3ff78, 0x012703f1, 0x04c90307, 0xffc2fbb7,
0xf811f5d1, 0xf6cbf9a6, 0xfd810277, 0x05cb0605,
0x051101f2, 0xfcc0f90a, 0xf620f6ac, 0xf8dcfc6a,
0x018a03ba, 0x056903f9, 0x015bfde4, 0xfa7ef9ca,
0xf9a7faf7, 0xfd09ff01, 0x010e0129, 0x00bfff49,
0xfdfbfdc0, 0xfea7000c, 0x009200fb, 0xff4ffd0f,
0xfb41f9df, 0xf974fa93, 0xfd9c0158, 0x03b5055f,
0x04ca02e2, 0xff06fa86, 0xf7ccf657, 0xf7bafb35,
0x008c0421, 0x062405e7, 0x03ec000c, 0xfb44f804,
0xf713f8b0, 0xfba9ff5e, 0x025303ef, 0x042502ae,
0x001afd39, 0xfae4fadb, 0xfad9fcb6, 0xfe2dfff9,
0x0016fe57, 0xfe27fdd1, 0xfdf0feef, 0x0080013f,
0x020300fb, 0xff49fc32, 0xf97bf8ef, 0xf951fbb5,
0xff960316, 0x057a05da, 0x03df0009, 0xfbeaf837,
0xf591f6bd, 0xf95ffd76, 0x022b0520, 0x0601042d,
0x00e1fcb9, 0xf9d2f883, 0xf84dfa39, 0xfcd6006e,
0x02220237, 0x01e80062, 0xfe68fccb, 0xfcfefcca,
0xfd8cfe60, 0x0055ffc9, 0xfde6fd5e, 0xfcd5fced,
0xfde4005c, 0x0154027d, 0x01c60061, 0xfcdff9c0,
0xf7d3f712, 0xf9f4fd75, 0x01b804b7, 0x06380521,
0x01dffe17, 0xf9f1f6a7, 0xf594f7c0, 0xfb10fff3,
0x03d60564, 0x055802df, 0x008cfc93, 0xfa33f9e7,
0xf9c1fc46, 0xff3b013e, 0x01af0120, 0x0052fef2,
0xfd49fceb, 0xfd91fe0f, 0xff27002a, 0xff2ffd8a,
0xfc99fab3, 0xfb91fd79, 0x001a01ab, 0x037203c1,
0x017fff27, 0xfb50f85d, 0xf694f873, 0xfb6dff6e,
0x034a05c4, 0x062a0440, 0x003ffc4b, 0xf86af68e,
0xf772f91b, 0xfce000ea, 0x03a1047a, 0x031300d2,
0xfe17fb2f, 0xfa12f9e0, 0xfb63fda3, 0xff2a004a,
0x0063fff4, 0xff20fdf1, 0xfe31fdfe, 0xff760007,
0xfff6ffcb, 0xfd97fb93, 0xfa3efa22, 0xfb21fe6b,
0x0122032e, 0x049a0335, 0x00c4fd8e, 0xf999f76d,
0xf72df991, 0xfd190158, 0x04ab0623, 0x053f026a,
0xfe03fa88, 0xf84ff737, 0xf8bdfc32, 0xffac01f2,
0x04380372, 0x019effb0, 0xfcd6fb22, 0xfadbfb42,
0xfcfcfe14, 0xffe4ff46, 0xfdd4fdbd, 0xfcd1fd4e,
0xfe7f003c, 0x00e600f1, 0x00cefebd, 0xfc61fa7f,
0xfa14fa64, 0xfc67000d, 0x023304da, 0x04800270,
0xff76fb4f, 0xf85af6c7, 0xf825fb47, 0xff1d02cf,
0x04f10543, 0x03e1007c, 0xfc26f97f, 0xf7c8f876,
0xfa8bfd34, 0x0098020b, 0x023d01c1, 0x00f1feca,
0xfd2ffc7d, 0xfd1efdd4, 0xff6a0035, 0xfed4fe23,
0xfd73fcef, 0xfd11fec9, 0x00530159, 0x02390196,
0xfffefd24, 0xfa89f915, 0xf931faf9, 0xfe0701e3,
0x03b4054c, 0x03910154, 0xfd7ff995, 0xf795f710,
0xf9c7fd22, 0x0102031c, 0x051d03af, 0x01e3fe64,
0xfaf1f965, 0xf906fa02, 0xfc25fecd, 0x00b901af,
0x016e00a1, 0xfe78fd7c, 0xfd03fda3, 0xfe35ffd5,
0x000cfe8b, 0xfdadfcb3, 0xfb15fc6b, 0xfe0d0009,
0x01a30237, 0x02620109, 0xfeb9facb, 0xf986f8ea,
0xf9e9fc4d, 0xfff6035e, 0x04cf04c0, 0x0343ff63,
0xfba1f921, 0xf781f878, 0xfb29ff2c, 0x01760384,
0x03e601ff, 0x0000fc74, 0xfa25f9ad, 0xfa45fc53,
0xfebb003e, 0x016f00fd, 0x0062feaf, 0xfdc4fdc0,
0xfdadffa1, 0xffe10056, 0xfebffda2, 0xfc46fae9,
0xfb72fcd0, 0xff6a0116, 0x03590442, 0x02b00062,
0xfc85f9af, 0xf8f0f922, 0xfa74fe08, 0x01490383,
0x055103d7, 0x01e0fd7d, 0xfaaff922, 0xf8f2f9d3,
0xfcbe007e, 0x0252043d, 0x02b9010b, 0xfeebfc73,
0xfb25fae0, 0xfc2ffdff, 0xff90003f, 0xffedffbb,
0xfdf1fe2f, 0xfddbfe27, 0xffd60054, 0x00bbff9c,
0xfdb7fb53, 0xfa12f99f, 0xfb4cfd7c, 0x00430250,
0x044a036b, 0x0171fef9, 0xfa99f915, 0xf8e8f960,
0xfbd50009, 0x038c050b, 0x04980338, 0xffd4fcb2,
0xfa0cf953, 0xf9c4fb57, 0xfe3000b1, 0x022e0230,
0x0141ff47, 0xfdebfc47, 0xfcaffd08, 0xfda0ff29,
0x0028ff86, 0xfdedfd4c, 0xfd11fdfe, 0xfe9a0084,
0x010a011d, 0x00f2ff80, 0xfd0afa2c, 0xf9f1fa16,
0xfc54ff50, 0x01e003c2, 0x041c02d3, 0xfff3fc8d,
0xf94ff7eb, 0xf833fa22, 0xfd9b00e1, 0x03460451,
0x036400f7, 0xfe1cfb42, 0xf9bcf9d0, 0xfac5fdb2,
0x00660130, 0x010700d4, 0xff7dfdcc, 0xfd4afd1e,
0xfde9fe3a, 0xff780053, 0xfea6fd7a, 0xfcdbfcfb,
0xfd08fde2, 0xffab014f, 0x021201de, 0x002efdd6,
0xfb89f9d5, 0xf9d0fadc, 0xfe1a011a, 0x03b705a6,
0x0405025b, 0xff09fb10, 0xf972f8bd, 0xf964fbf4,
0xffbb01b5, 0x0415040a, 0x01fbffe6, 0xfd25fb1f,
0xfa4afb39, 0xfd10feb9, 0x002c0098, 0x0073ff78,
0xfe53fd91, 0xfd28fdae, 0xfebd0016, 0x001cff19,
0xfd9bfceb, 0xfb4efb65, 0xfd5cffb1, 0x011e01d7,
0x0214013c, 0xff1efc06, 0xfa13f8c7, 0xf9c0fb26,
0xfe8601e7, 0x03c00491, 0x03080090, 0xfcf2fa4f,
0xf953f97f, 0xfaeefdec, 0x00b201d0, 0x01f301ca,
0x0052fe75, 0xfc37fabd, 0xfb5afd46, 0xfe7bffd2,
0x003c0025, 0xffb9fdf8, 0xfe29fd7d, 0xfee30018,
0x00f700c4, 0xffc9feb3, 0xfc09fb23, 0xfacafb9e,
0xfd98002d, 0x019f023a, 0x01df008c, 0xfdd4faa5,
0xf977f908, 0xfa6cfd45, 0x004102c3, 0x04280346,
0x013cfed9, 0xfb56f9da, 0xf934fa80, 0xfce1ffab,
0x01a40210, 0x01d200a2, 0xff8bfd1a, 0xfcdffccb,
0xfd26fe12, 0xff1f0049, 0xfec9fdd8, 0xfe14fdc4,
0xfe48ff83, 0x008a00d4, 0x00d20116, 0xff16fd2c,
0xfb49fa4c, 0xfb11fc8a, 0xff9f015c, 0x03120404,
0x01daffc2, 0xfc7ff9e0, 0xf907f9af, 0xfba7fee3,
0x01870338, 0x04130176, 0x004dfcb9, 0xfa95fa0a,
0xfa4dfbc2, 0xfdd100d4, 0x00e50112, 0x00f7ffc5,
0xfde3fd7e, 0xfcaffddf, 0xfdadfeb3, 0xffadfe1d,
0xfdebfd24, 0xfd33fd35, 0xfe790042, 0x00e200e5,
0x012fff80, 0xfd71fb56, 0xfa14fa07, 0xfb3dfde5,
0x00410275, 0x04150321, 0x010dfeb8, 0xfb4df9f4,
0xfa14faf3, 0xfd60008b, 0x019b0386, 0x02df00b6,
0xff24fc9a, 0xfb53fa80, 0xfc2afdb4, 0xff5600db,
0x012b00d5, 0xffbcfe39, 0xfdbbfd60, 0xfe10fdc3,
0xfeee0017, 0xfdf4fdfc, 0xfcdffd07, 0xfceefd88,
0xffde0131, 0x01e301e9, 0x00dcfe63, 0xfc3ffa44,
0xf9e2fa87, 0xfcddffa6, 0x0187039c, 0x043f0252,
0x0014fd3c, 0xfa8bf9f6, 0xfa73fc27, 0xfef400f2,
0x01e201e5, 0x0151ff6d, 0xfd55fc57, 0xfac7fbba,
0xfd8cfe53, 0xffef0025, 0xffd5001b, 0xfe3dfdfe,
0xfddffebf, 0x003bffe3, 0x006bfed5, 0xfd9dfc33,
0xfadffb80, 0xfd3dfebb, 0x00ed0201, 0x01f201b3,
0x0033fdcd, 0xfab9f9d9, 0xfa0bfaea, 0xfd7b00af,
0x022d03d6, 0x026f00db, 0xfec5fbb3, 0xfa73f9d2,
0xfbeafda4, 0x00040108, 0x015a010f, 0xfffefe6b,
0xfd21fcf7, 0xfcccfd73, 0xfdd7ff24, 0x0049ff8d,
0xfe13fdc6, 0xfe18fdcc, 0xfeb7003b, 0x006600af,
0xffbdfe61, 0xfc97fafd, 0xfaeafc1a, 0xfd91ffa4,
0x01f301e4, 0x021f0114, 0xff28fc6d, 0xfa3cf9b9,
0xfa0dfc78, 0xff1f0104, 0x02e302dd, 0x0180fff8,
0xfcf8fafa, 0xf9d4fa9b, 0xfcc2fece, 0x006300e7,
0x00fa0066, 0xff51fddd, 0xfcfefd2f, 0xfd92fea2,
0x00140067, 0xfec5fdfa, 0xfdf2fd4f, 0xfddafe8d,
0x001100bc, 0x012900cc, 0xff44fda9, 0xfb84fa99,
0xfae2fc65, 0xfeb40162, 0x020c020a, 0x01ec001d,
0xfd74face, 0xf9d7f9ea, 0xfaf0fdc4, 0x006601c8,
0x0222019e, 0x00b3feb2, 0xfcadfae3, 0xfb36fcb9,
0xfdffff7a, 0x007a0046, 0xffe4ff81, 0xfe00fe0a,
0xfe3ffe03, 0xfed9ffed, 0x0000ff05, 0xfe0ffd63,
0xfd0bfd48, 0xfe4bffd1, 0x00b700dd, 0x00ff0060,
0xfe2cfbe5, 0xfab1fa3c, 0xfb85fd62, 0xfffb01c9,
0x01ce01d7, 0x0114ff7b, 0xfc6efa53, 0xf9cefaf5,
0xfd17ff41, 0x0124020f, 0x01e600f8, 0xff20fd47,
0xfd2afbab, 0xfc7ffdb7, 0xfe7e0059, 0xffde0015,
0xff5cfdfc, 0xfe20fe13, 0xfdffff95, 0xfff40022,
0xff84fdb3, 0xfd31fcff, 0xfd18fcff, 0xfec20069,
0x01430183, 0x012fff2f, 0xfcf4fb16, 0xfa09faa6,
0xfc3cfe6d, 0x0077022f, 0x021e015d, 0xffabfda8,
0xfb97fa64, 0xfaa7fc11, 0xfdfb0047, 0x011101db,
0x011f004e, 0xfee9fcd9, 0xfd4cfcd5, 0xfddffe45,
0xffeb004d, 0xffd3fe5f, 0xfdb8fe34, 0xfe88002b,
0xfff40138, 0x008bfff8, 0xfe97fdad, 0xfbf1fb19,
0xfcbffdf2, 0xffee0109, 0x01d401cb, 0x0104fed3,
0xfc95fb3c, 0xfafafb17, 0xfdeb0033, 0x014e01ea,
0x01e200cc, 0xfea4fd02, 0xfbaefad3, 0xfbb5fdb1,
0xff0200e0, 0x00c600fe, 0x0098ff09, 0xfe1efd91,
0xfcd8fde1, 0xfe65fe14, 0xfe22fe1d, 0xfe40fdf8,
0xfe5cfdd0, 0xfe9effac, 0x005c00e7, 0x007cfead,
0xfd97fc7b, 0xfb0dfbc0, 0xfdb4ff87, 0x00ab01c6,
0x01f90153, 0x0016fd91, 0xfb48fb2b, 0xfb31fc59,
0xff2d00e4, 0x01a40208, 0x0169008c, 0xfe62fcf3,
0xfb1cfb2b, 0xfcfbfe26, 0xfffe00b1, 0x00b8fffe,
0xff42fe0f, 0xfe0ffdfd, 0xfe34fe7d, 0xffdeffd2,
0xfe45fe43, 0xfd45fd6c, 0xfdecfe9c, 0xffd100a9,
0x00df00d5, 0xff94fdcc, 0xfc26faf2, 0xfaf6fbcc,
0xfe14ffe4, 0x0188021d, 0x01c800a6, 0xff1ffd00,
0xfaf9fad4, 0xfb54fd71, 0xff6a0104, 0x01a7014f,
0x0082fec2, 0xfd5bfd02, 0xfcc7fce1, 0xfddaff8f,
0x002affea, 0xffd1ff64, 0xfe24fdbe, 0xfe02fdf6,
0xffbcffc1, 0xfff5ff15, 0xfddefd68, 0xfccafd10,
0xfdf0ffdd, 0x009900c9, 0x00db00be, 0xff7efd72,
0xfb54fad6, 0xfb76fd36, 0xfed500cb, 0x01a8018d,
0x012dff66, 0xfdb9fc02, 0xfae0fb36, 0xfd17fe72,
0x0068010c, 0x012500c5, 0xffbcfe0a, 0xfd3dfcd3,
0xfce2fd9d, 0xfebd002c, 0xffd10020, 0xfe8cfde4,
0xfe17fdba, 0xfe93001d, 0xffee0009, 0x0011fe2e,
0xfd1afcbc, 0xfceffd16, 0xfeac0047, 0x00ea010b,
0x010afffe, 0xfdeefc7e, 0xfaf8faf0, 0xfc39fde8,
0xffad0111, 0x01c000fb, 0x0050fe3a, 0xfce8fb8b,
0xfb19fcd9, 0xfda6ff41, 0x00a10128, 0x00a90028,
0xfe8bfdd3, 0xfdeefdaa, 0xfe4dfe38, 0xff8b0046,
0xfec1fdea, 0xfde9fde3, 0xfe0efe20, 0xffef002a,
0x000b0025, 0xfe49fdb5, 0xfcc5fcec, 0xfca4fdd9,
0xfff100d1, 0x00d80103, 0x00dbfeef, 0xfd2afbba,
0xfacdfb97, 0xfcdffe8e, 0x007a00fd, 0x012a00ff,
0xffeffdf0, 0xfd06fbed, 0xfc84fd46, 0xfe68ffde,
0xffceffe3, 0x0013fee3, 0xfde9fe12, 0xfe0ffddf,
0xff910000, 0x0019ff2f, 0xfda7fe05, 0xfdccfe28,
0xfe4aff81, 0x004400be, 0x006bff9c, 0xfd89fd29,
0xfc08fbeb, 0xfd43fe89, 0x005c00d1, 0x01010112,
0x0049fdb3, 0xfbe9fb06, 0xfaf4fc0a, 0xfdd3ff61,
0x00f20106, 0x01230045, 0xfea0fd34, 0xfd39fcea,
0xfd12fdcc, 0xff170027, 0xffbe0067, 0xff46fe08,
0xfdfefe11, 0xfde1ffbd, 0xffd5ffef, 0xfea2fdcd,
0xfdd5fcc1, 0xfdd8fddc, 0xff820048, 0x013b00b1,
0x003dfe8e, 0xfd4dfc15, 0xfaa4fcdd, 0xfd88ff63,
0x00ee010f, 0x00b500ec, 0xfec2fd9a, 0xfc12fafe,
0xfcd9fd83, 0xff6100de, 0x010900e0, 0x009dff6e,
0xfe03fd4f, 0xfd05fd0d, 0xfd96fe44, 0x0003ffe0,
0x0013ff4c, 0xfd95fe62, 0xfde4fef8, 0x0046ffdc,
0x003ffef7, 0xfde2fd7c, 0xfcd9fcf8, 0xfd9aff58,
0x0035013c, 0x010c0104, 0xffaefd7a, 0xfd13fb33,
0xfbf5fd40, 0xfe1c0081, 0x013b00e6, 0x009effe0,
0xfe00fce5, 0xfce3fce6, 0xfd11fe59, 0x005200d9,
0x010d00d9, 0xfffbfe7f, 0xfe14fe23, 0xfde5fe0d,
0xfe03ffd9, 0x0015fe47, 0xfdfffdee, 0xfe17fdd0,
0xfed40099, 0x00050016, 0xffc1fe5c, 0xfd53fd1e,
0xfd2dfd1a, 0xfe25ffa4, 0x00e000f1, 0x00c90044,
0xfe33fd74, 0xfc4dfc06, 0xfcf3fdab, 0xfff900bf,
0x00ff00b8, 0x0047fec5, 0xfd62fd4a, 0xfce8fcfd,
0xfd8fff7a, 0x002f000d, 0x0038ffe0, 0xfea0fddb,
0xfe05fde5, 0xfe76fe05, 0xff9affed, 0xfdedfe06,
0xfe02fe02, 0xfdfbff16, 0x00180027, 0xffd9ffe6,
0xff46fd77, 0xfce9fcd7, 0xfce1fd38, 0xfea50098,
0x01210112, 0x00b6ff7d, 0xfd8cfd31, 0xfb8dfc24,
0xfd82fe1e, 0xffdd007d, 0x013f00a5, 0xffb6fe29,
0xfd83fcf7, 0xfcfdfdae, 0xfea4fffc, 0x0006ffbf,
0x001bfede, 0xfdf5fe09, 0xfe12fdbd, 0xfeadffec,
0xfff8ff0a, 0xfdc4fe37, 0xfe10fdcf, 0xff0d0034,
0x004a00e6, 0x0077ffed, 0xfe3dfd04, 0xfd20fd17,
0xfd1bfdb4, 0xffaf0120, 0x014d0122, 0x0046fe67,
0xfd42fd0d, 0xfcf5fcff, 0xfddaff68, 0x00340122,
0x0098002f, 0xff16fdb9, 0xfd7cfcff, 0xfe59fddb,
0xff780011, 0xffffffcb, 0xfe30fe06, 0xfe30fe45,
0xfe44ffeb, 0xffaf0007, 0xfe87fe09, 0xfe0ffd0d,
0xfdc5fe6c, 0x00360046, 0x010b010f, 0x004eff37,
0xfd79fcfd, 0xfd54fd04, 0xfda0ff60, 0x0090012d,
0x012100c9, 0xff54fdd7, 0xfd06fd10, 0xfd32fd99,
0xfe59ffa0, 0x003fffe5, 0xffefffc7, 0xfe4afe0b,
0xfdfffe24, 0xfe15ff0c, 0x001cffee, 0xffb4fded,
0xfe2ffe24, 0xfdd5fec8, 0xffe7ffd6, 0x0020ff9f,
0xfe18fe12, 0xfd17fcfe, 0xfdc7fe96, 0xffbd004b,
0x00fc00ab, 0xff40fe0c, 0xfd4bfcfd, 0xfcfbfd3b,
0xfe6affea, 0x00bc014d, 0x00d80038, 0xfe92fda8,
0xfcf7fcde, 0xfd7cfdfa, 0xffb50019, 0xfff5000e,
0x0023feff, 0xfe07fe2f, 0xfe52fe1c, 0xff520017,
0xffecfe93, 0xfdf2fe5d, 0xfe1bfdf5, 0xfe07ffdb,
0x003c0005, 0x0046fedf, 0xfde1fd58, 0xfce7fd4b,
0xfde8ffbc, 0x001a00b6, 0x00bf0001, 0xfedffd9a,
0xfd05fcfe, 0xfcecfd55, 0xff800061, 0x010d010a,
0x00a2ffa8, 0xfe0bfd24, 0xfd1ffce6, 0xfdb5fe62,
0xffed0028, 0xfff0000d, 0xfe13fdcb, 0xfe0bfdf0,
0xfdf0ff2e, 0x005fffd0, 0xfe26fe19, 0xfde8fe11,
0xfdfffe77, 0xffddffef, 0xffec002d, 0xffccfe0b,
0xfdd6fd18, 0xfd06fd8c, 0xfee20020, 0x003b0112,
0x002effeb, 0xfe80fd04, 0xfd04fcf3, 0xfdaefe5d,
0xffb4006c, 0x01120097, 0xfff2feb3, 0xfde7fd7d,
0xfd38fe3c, 0xfd79ff34, 0x002e001c, 0x000bfe68,
0xfdbffe02, 0xfdeffdf9, 0xff98007c, 0xff9efdfe,
0xfdfcfdf3, 0xfdebfdf3, 0xfddaff3f, 0x00380044,
0x000d0028, 0xfedffdba, 0xfd3efcfc, 0xfd4ffded,
0xff85fff2, 0x011d00e4, 0x0024ff7f, 0xfdc3fd43,
0xfce8fdad, 0xfe00ff4c, 0x0066fffc, 0x00070015,
0xff12fde3, 0xfe4afdc8, 0xfe26fe11, 0xfebd004a,
0x00040039, 0xfe77fdce, 0xfe04fe55, 0xffc50010,
0x001e004f, 0xff5dfe02, 0xfe0efde0, 0xfe08fdc9,
0xfe6dffe3, 0x007b0132, 0x0024ff9c, 0xfe27fdad,
0xfd18fcd7, 0xfda6fe89, 0x00220011, 0x00fa002a,
0xfff9fe56, 0xfdb3fd46, 0xfceefde1, 0xfe880009,
0x0024fffa, 0x0017ffe0, 0xfe20fde0, 0xfe12fe13,
0xfdc0ff27, 0x0053001b, 0xff83fdfb, 0xfe05fdcd,
0xfdeeffb3, 0xfff5fff4, 0x001c0001, 0xfe8cfdf1,
0xfd5ffd01, 0xfe4efdaf, 0xff6e0004, 0xffdd001e,
0xffedff22, 0xfd9ffd5e, 0xfccbfd57, 0xfdf5ff9b,
0xffeb001a, 0x00310019, 0xff31fdaf, 0xfe31fd7b,
0xfde4fe16, 0xff220048, 0xffce0007, 0xffe1fe57,
0xfdb9fde4, 0xfe42fde9, 0xfedd0019, 0x0011ff07,
0xfdf6fe0a, 0xfe02fdd2, 0xfee20016, 0xffe7000c,
0x0011ff3b, 0xfdcafe14, 0xfcd5fdc7, 0xfdd7ff06,
0x00310009, 0x00c0ffb8, 0xffd6fe11, 0xfdc2fcfa,
0xfce9fda2, 0xfe16ff91, 0x0006fff0, 0x00030001,
0xfe7cfe0d, 0xfe43fdcd, 0xfddefed5, 0x0050ffc1,
0x0012ffee, 0xfe1bfdc3, 0xfdf7fe2f, 0xfdecfefc,
0x0029ffe3, 0xfe30fde3, 0xfe01fde4, 0xfe0dfe2f,
0xffc0ffe4, 0xffe6000c, 0xffa6fdfd, 0xfdb1fd39,
0xfcbcfde0, 0xfe4d0008, 0xffdb000d, 0xffe10009,
0xfefbfda7, 0xfde4fcc1, 0xfe01fdd2, 0xff780013,
0x001a000d, 0xffefff7a, 0xfdb8fe4b, 0xfdacfe29,
0xfdc8ff24, 0xfffa0006, 0xff7afe0a, 0xfe29fdc7,
0xfddafee1, 0x0018ffd7, 0x003afee9, 0xfdc5fe3a,
0xfdc9fe25, 0xfd91fead, 0xfff4fffd, 0xffedffd0,
0xff52fde6, 0xfdbafd16, 0xfe41fe11, 0xff04000d,
0xffb4ffd3, 0xffcaffc5, 0xfdf5fe06, 0xfd2bfdc2,
0xfe21fdda, 0xffa40027, 0xffe60048, 0xffb3fe37,
0xfe0ffdd2, 0xfddefe09, 0xfe76000d, 0xff6dfe1f,
0xfdf5fe2c, 0xfdfbfe1e, 0xffcfffe4, 0x0017fff0,
0x0019fee9, 0xfe02fe33, 0xfdf2fe0a, 0xfe64002a,
0x0014fffc, 0xffce0025, 0xfea9fdd7, 0xfe2ffe16,
0xfe05fdea, 0xfff6ffe3, 0xffd7fff1, 0x002cff00,
0xfdecfe68, 0xfe2dfe03, 0xfdd6feb3, 0xffc7fff3,
0x003a0014, 0xfe7efdc2, 0xfdcdfdf7, 0xfdc9fede,
0x0005ff44, 0xfd9bfdf5, 0xfe0dfddc, 0xfdeafe50,
0xffc9fffa, 0x0003000d, 0xff54fddd, 0xfe20fde4,
0xfe08fdcc, 0xff620021, 0xffeb0024, 0xfff7ff80,
0xfe1dfe08, 0xfdb4fe5b, 0xfd9afef7, 0xffc3ffef,
0x0008ffe8, 0xff6afd97, 0xfe53fdc6, 0xfe17fdac,
0xfe66ffef, 0xffea002b, 0xfff0fe79, 0xfda8fe6d,
0xfd54fe36, 0xfe520069, 0xff1cfe76, 0xfd94ff63,
0x0376ff8a, 0x000dffd4, 0x0020001e, 0xffebfff9,
0xffdf0037, 0xffecfff4, 0x000bfff7, 0xffbdffe6,
0x00010031, 0xffcf000b, 0xffb9ffe2, 0xfff8ffd3,
0x00270001, 0xfff00014, 0x0011ffea, 0xffd7ffd9,
0xfff70072, 0x00350009, 0x001a005d, 0x000dffda,
0xffebfff1, 0x00390015, 0xffe5ffd6, 0xfff8fff0,
0xfff2fff4, 0xffd7ffd2, 0x00170017, 0xffdb0010,
0xfffefffa, 0xffeb0012, 0x0005ffcb, 0x0008fff2,
0xfff5fff9, 0x001c0013, 0xfff9ffd6, 0x00180037,
0x00220000, 0x00000026, 0xfff40009, 0x0019ffed,
0x000d000f, 0xffffffd0, 0xffd80012, 0x0005fffd,
0xffedfff9, 0xfff5fff9, 0xfff20021, 0xfffefff7,
0xfffb0005, 0x0004fff1, 0x0009fffe, 0xfff8fffd,
0x0003fffe, 0x0001fff5, 0x00000001, 0x00080005,
0xfffffffb, 0xffff0004, 0x00070000, 0xffffffff,
0x00000003, 0xfffe0000, 0x00010001, 0xffff0001,
0xffff0001, 0xfffd0000, 0xffff0001, 0x00010000,
0xfffeffff, 0x00000001, 0x0001ffff, 0x0001ffff,
0x00000000, 0x00000000, 0x00000000, 0x0001ffff,
0x00000000, 0x0000ffff, 0x00000000, 0x00000000,
0x00000000, 0x0001ffff,
const short sound_data[] = {
0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff,
0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0001, 0x0000, 0x0000,
0x0001, 0xffff, 0x0001, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0xffff,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001,
0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0x0001, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0xffff, 0xffff, 0x0001, 0xffff, 0x0000, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0001, 0x0000, 0x0000,
0xffff, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0xffff,
0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff,
0x0001, 0x0000, 0x0000, 0x0000, 0xffff, 0x0001, 0xffff, 0xffff,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000,
0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0000,
0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xffff, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000,
0xffff, 0x0000, 0xffff, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xffff, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xffff, 0xffff, 0xffff, 0x0000, 0x0001, 0x0000, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0001,
0xffff, 0xfffe, 0xfffc, 0x0001, 0x0001, 0x0000, 0x0003, 0x0003,
0xfff7, 0xfffc, 0xfffd, 0x0005, 0xfffd, 0xffff, 0x0003, 0x0002,
0x0000, 0x0000, 0xffff, 0x0006, 0xfffd, 0xfffb, 0x000f, 0xfffc,
0xffee, 0xffdb, 0x0007, 0x0015, 0x0005, 0x000e, 0x001e, 0xffda,
0xffdb, 0xffe7, 0x0022, 0xfffb, 0xffda, 0x0010, 0x0010, 0xfffc,
0xffff, 0xfffe, 0x002a, 0x0017, 0xffdd, 0x0030, 0xfff6, 0xffa8,
0xff18, 0xffc7, 0x00c3, 0x0038, 0x0038, 0x00b0, 0xff45, 0xfec6,
0xff3a, 0x0091, 0x00a2, 0xff65, 0x006a, 0x0090, 0xffac, 0x0016,
0xfff6, 0x00dd, 0xffe1, 0xfda5, 0x005f, 0x0140, 0xfe6a, 0xfecb,
0x00b2, 0x009f, 0x0003, 0x00f5, 0x0215, 0xffd2, 0xfdcf, 0xff3c,
0xff89, 0xfd94, 0xff09, 0x0188, 0x01d2, 0x00d7, 0xff74, 0xfedb,
0x0052, 0x014a, 0x033f, 0x01e4, 0xfe77, 0xffa2, 0x0013, 0xfca7,
0xfd74, 0x00f9, 0x0156, 0xfee4, 0xfe78, 0x029f, 0x0145, 0xfd72,
0x02b3, 0x0427, 0xfcdb, 0xfe0b, 0xffe1, 0xfeeb, 0x005e, 0xff99,
0x0011, 0xff57, 0xfa27, 0xfdb5, 0x03bc, 0x03e6, 0x00fb, 0xfd1c,
0xfe6b, 0xfe62, 0xfc0d, 0xfe56, 0xfcbb, 0xf907, 0xfb92, 0xf59b,
0xf60b, 0xfbda, 0x0151, 0x0866, 0x0238, 0xf9cd, 0xfbf7, 0x02fc,
0x037a, 0xfeb0, 0xfec1, 0x0462, 0xfefd, 0xfb06, 0xfdcf, 0xf461,
0xb8d0, 0xd21d, 0x4f19, 0x5ff8, 0x251e, 0x018b, 0xe058, 0xc045,
0xc924, 0xed7f, 0x0da9, 0x1088, 0x1414, 0x32d2, 0x2199, 0xee71,
0xd406, 0xd240, 0xd9b1, 0xd716, 0xf884, 0x1695, 0x251a, 0x2240,
0x1eeb, 0x0522, 0xd02b, 0xc9b8, 0xca02, 0xdffe, 0xfbc6, 0x1929,
0x381b, 0x396e, 0x1e44, 0x098d, 0xf6e0, 0xe0c5, 0xc389, 0xc8c2,
0xf916, 0x13c4, 0x3238, 0x3c90, 0x3c78, 0x19cc, 0xdaed, 0xce05,
0xcfa0, 0xd99a, 0xe37f, 0x036d, 0x2b01, 0x2bc6, 0x2181, 0x1463,
0x0383, 0xd658, 0xc419, 0xcfbf, 0xe21f, 0xf3e7, 0x1428, 0x2976,
0x2dda, 0x1c1d, 0xfb98, 0xe786, 0xc4d3, 0xc791, 0xd573, 0xfd7f,
0x1c6e, 0x2b67, 0x329a, 0x1c12, 0x0a4e, 0xea33, 0xd1ad, 0xd23b,
0xd376, 0xeb17, 0x0bb1, 0x24d3, 0x3c05, 0x3323, 0x1498, 0xf14c,
0xce4f, 0xd159, 0xda08, 0xea13, 0x07f1, 0x2819, 0x3fde, 0x2a87,
0x13ad, 0xf0b0, 0xdca7, 0xc5cc, 0xc148, 0xe5fd, 0xfb32, 0x13ea,
0x2e9d, 0x351f, 0x2021, 0xf568, 0xd957, 0xd5de, 0xc9b1, 0xcb69,
0xf359, 0x1948, 0x2fd1, 0x2d1b, 0x21ff, 0x130b, 0xf178, 0xd511,
0xcfdc, 0xd906, 0xec0d, 0x0b40, 0x24a5, 0x3812, 0x2989, 0x1230,
0xf638, 0xd9b7, 0xc2d0, 0xc566, 0xe079, 0x0128, 0x1fcf, 0x311c,
0x342f, 0x1be7, 0xf51b, 0xdbb1, 0xcc40, 0xc213, 0xd54d, 0xf95e,
0x2302, 0x3314, 0x33ce, 0x237e, 0x04a6, 0xe178, 0xcde9, 0xcd84,
0xd727, 0xf0e6, 0x12b9, 0x3332, 0x3787, 0x2dc0, 0x0f99, 0xec26,
0xd448, 0xc91b, 0xd615, 0xecb1, 0x0ad0, 0x2706, 0x3333, 0x28b6,
0x15c8, 0xf768, 0xd9dc, 0xc218, 0xc0ed, 0xdb49, 0xfbce, 0x1f0d,
0x2e54, 0x3156, 0x1e0a, 0xfea7, 0xe01f, 0xcc96, 0xc61f, 0xd804,
0xfa3b, 0x1b4e, 0x33e5, 0x362a, 0x2cbf, 0x0ae0, 0xe2cb, 0xc719,
0xc203, 0xd012, 0xe884, 0x0e80, 0x2d49, 0x36c4, 0x2a56, 0x11f2,
0xf274, 0xd5f2, 0xc7c8, 0xd3f7, 0xef58, 0x0779, 0x2402, 0x3574,
0x3510, 0x1c0c, 0xf907, 0xdbee, 0xc8e6, 0xc734, 0xda1b, 0xff02,
0x1d0d, 0x2f8f, 0x2f17, 0x1d3c, 0xfc8d, 0xdc29, 0xca39, 0xc701,
0xd79c, 0xf541, 0x1972, 0x3207, 0x34de, 0x2433, 0x0a49, 0xe81e,
0xc998, 0xc067, 0xcdaa, 0xec2d, 0x0dc7, 0x28ed, 0x33cb, 0x2ce4,
0x1434, 0xf5dd, 0xdbb6, 0xca97, 0xcdcc, 0xe58f, 0x0820, 0x23f4,
0x33f3, 0x32e0, 0x1d97, 0xfbd5, 0xd86e, 0xc87d, 0xcd3a, 0xdfd3,
0x00a7, 0x1fc9, 0x3284, 0x31f0, 0x1edd, 0x05df, 0xe63d, 0xcd0b,
0xca7d, 0xda99, 0xf793, 0x1600, 0x2d88, 0x33da, 0x250f, 0x082a,
0xe633, 0xcdc2, 0xc354, 0xcc8a, 0xec47, 0x0cff, 0x23ff, 0x306a,
0x29ea, 0x1245, 0xf120, 0xd581, 0xc906, 0xcd1d, 0xe32a, 0x0710,
0x2686, 0x3536, 0x314f, 0x1bc4, 0xfa5b, 0xd893, 0xc75b, 0xca8e,
0xdf23, 0x013d, 0x2360, 0x35fa, 0x34a5, 0x21b7, 0x047d, 0xe1fa,
0xcabe, 0xc946, 0xdb23, 0xfa22, 0x1918, 0x30c1, 0x3884, 0x272e,
0x064d, 0xe44d, 0xcd1f, 0xc61d, 0xd1eb, 0xefd2, 0x107c, 0x2970,
0x31d4, 0x298e, 0x0f76, 0xeb88, 0xce2a, 0xc482, 0xce56, 0xe6a0,
0x07db, 0x25f6, 0x3646, 0x326b, 0x1c3f, 0xf8bd, 0xd986, 0xc66b,
0xca3c, 0xe3f3, 0x028a, 0x22f4, 0x38c5, 0x39db, 0x2021, 0xfd92,
0xe1d7, 0xcb65, 0xc31c, 0xd560, 0xf941, 0x1931, 0x2cb6, 0x3293,
0x264f, 0x0576, 0xe13d, 0xca97, 0xc538, 0xcef2, 0xeca7, 0x11c4,
0x2ec5, 0x3799, 0x2d60, 0x13d3, 0xf0e0, 0xd2c0, 0xc5cd, 0xcf07,
0xe936, 0x07a1, 0x2717, 0x399f, 0x340d, 0x1af9, 0xf882, 0xdd5a,
0xcabe, 0xcb7b, 0xdedc, 0x00e3, 0x1f5e, 0x3182, 0x312b, 0x1f32,
0xfe07, 0xdc7c, 0xc9d7, 0xc865, 0xd6c0, 0xf3f9, 0x1923, 0x2f7d,
0x35b9, 0x25a7, 0x0885, 0xe650, 0xcb57, 0xc568, 0xd321, 0xef86,
0x1118, 0x2b7c, 0x34fb, 0x2a94, 0x0f6a, 0xed8d, 0xd162, 0xc493,
0xccc0, 0xe674, 0x0805, 0x25a7, 0x3381, 0x2ebe, 0x1888, 0xf702,
0xd754, 0xc4fd, 0xc7ac, 0xddab, 0xfdec, 0x1f39, 0x3395, 0x331d,
0x207f, 0x0224, 0xe289, 0xcd8a, 0xc97e, 0xdaec, 0xf95b, 0x17f7,
0x2fb6, 0x3575, 0x26c1, 0x0877, 0xe66e, 0xce7e, 0xc6f7, 0xd3ac,
0xef48, 0x125d, 0x2e80, 0x3757, 0x2c77, 0x1252, 0xf0bb, 0xd1c6,
0xc584, 0xce0e, 0xe635, 0x0616, 0x236d, 0x3445, 0x2e36, 0x1577,
0xf533, 0xd806, 0xc6d4, 0xc78a, 0xdda5, 0x0011, 0x1df5, 0x2fea,
0x3129, 0x1ddc, 0xfc1c, 0xdb67, 0xc7bd, 0xc681, 0xd7aa, 0xf717,
0x18b7, 0x30db, 0x36b3, 0x27be, 0x09fa, 0xe6c6, 0xcdbe, 0xc75a,
0xd4a2, 0xefbf, 0x11b9, 0x2cb4, 0x3673, 0x2ccc, 0x1187, 0xf033,
0xd2f7, 0xc3f7, 0xcb23, 0xe4df, 0x06b3, 0x24fb, 0x36f3, 0x343a,
0x1baf, 0xfab2, 0xdbe3, 0xc9fe, 0xcc85, 0xdff8, 0xff5f, 0x1f72,
0x3351, 0x326a, 0x209d, 0x0158, 0xdf6c, 0xcb54, 0xc8cb, 0xda42,
0xf6e6, 0x1753, 0x3011, 0x357e, 0x24b1, 0x05ba, 0xe4f8, 0xccae,
0xc4dc, 0xcffc, 0xedb9, 0x0e9d, 0x27e0, 0x3209, 0x275a, 0x0d5d,
0xede1, 0xd29d, 0xc741, 0xcf95, 0xe843, 0x08a6, 0x24f0, 0x338e,
0x2e69, 0x1888, 0xf753, 0xda6a, 0xca56, 0xcbda, 0xe044, 0x007a,
0x209b, 0x3288, 0x33be, 0x21fc, 0x01ab, 0xe19c, 0xcc8b, 0xca2b,
0xd9db, 0xf678, 0x17dc, 0x2ef0, 0x3515, 0x264a, 0x08d3, 0xe73a,
0xce8b, 0xc78a, 0xd3c6, 0xf02f, 0x1131, 0x2bd2, 0x3556, 0x29ec,
0x0f0b, 0xeda2, 0xd249, 0xc6d0, 0xcd21, 0xe528, 0x05c0, 0x244b,
0x32fa, 0x2ef7, 0x1852, 0xf6ec, 0xda85, 0xc8ab, 0xcaaa, 0xe09c,
0xffd5, 0x1f4a, 0x32ad, 0x3248, 0x1f77, 0x000f, 0xe0d2, 0xcbbd,
0xc9a7, 0xdabd, 0xf985, 0x1a82, 0x2ffc, 0x3423, 0x251b, 0x082a,
0xe71b, 0xced2, 0xc7e0, 0xd4e6, 0xf082, 0x1135, 0x2af0, 0x349e,
0x2b25, 0x0fd2, 0xef25, 0xd379, 0xc7cf, 0xcfb3, 0xe994, 0x09c1,
0x258e, 0x32e5, 0x2ca9, 0x1561, 0xf425, 0xd6c7, 0xc6c2, 0xcad6,
0xdf14, 0x0040, 0x1ee9, 0x3193, 0x30f9, 0x1e95, 0xfe94, 0xdec4,
0xcc14, 0xcac0, 0xdd4e, 0xfb00, 0x1b24, 0x303e, 0x3298, 0x2264,
0x04ef, 0xe4b3, 0xcdae, 0xc7fe, 0xd6e3, 0xf29f, 0x1439, 0x2d2b,
0x3545, 0x2978, 0x0f98, 0xeebe, 0xd2d9, 0xc86a, 0xd0e1, 0xe96e,
0x09d2, 0x25b5, 0x328b, 0x2c63, 0x154b, 0xf568, 0xd7af, 0xc888,
0xcc34, 0xe460, 0x02ff, 0x1ffd, 0x31bc, 0x3052, 0x1cfb, 0xfd64,
0xdeba, 0xcb1c, 0xca41, 0xdc83, 0xfaa6, 0x1958, 0x2e4e, 0x3261,
0x2253, 0x0490, 0xe399, 0xcc89, 0xc896, 0xd6d9, 0xf28b, 0x1242,
0x2b92, 0x3386, 0x287d, 0x0da9, 0xecdd, 0xd345, 0xc8d2, 0xd22c,
0xeb7e, 0x0a32, 0x2674, 0x34b6, 0x2e71, 0x1636, 0xf5cb, 0xd8df,
0xc938, 0xcc8d, 0xe1fa, 0x024d, 0x2114, 0x33c1, 0x321b, 0x1d4d,
0xfd9e, 0xdf0f, 0xcb53, 0xcbdc, 0xddc4, 0xfbed, 0x1b20, 0x2e8f,
0x3214, 0x216e, 0x03de, 0xe431, 0xccd1, 0xc6ad, 0xd451, 0xf0cc,
0x11f8, 0x2bd9, 0x347f, 0x2946, 0x0dc8, 0xec37, 0xd13e, 0xc640,
0xcffe, 0xea0f, 0x0a64, 0x268c, 0x343b, 0x2e84, 0x17c9, 0xf672,
0xd9d2, 0xcaed, 0xcf3d, 0xe4e1, 0x03f5, 0x21ee, 0x32a2, 0x30da,
0x1bfd, 0xfcf0, 0xddfd, 0xcaf8, 0xca8d, 0xdd0d, 0xfaa7, 0x1948,
0x2f2a, 0x3320, 0x22fa, 0x0546, 0xe549, 0xce12, 0xc988, 0xd7b6,
0xf2e2, 0x132d, 0x2c4e, 0x3437, 0x2843, 0x0c62, 0xec03, 0xd292,
0xc7ca, 0xd111, 0xeb53, 0x0c04, 0x27db, 0x34b7, 0x2d85, 0x155f,
0xf569, 0xd916, 0xcb0a, 0xcf56, 0xe519, 0x048e, 0x1fa3, 0x2f75,
0x2dd3, 0x1a35, 0xfb9d, 0xdd42, 0xcbb1, 0xcb85, 0xdea7, 0xfca0,
0x1b7e, 0x2fd8, 0x3236, 0x21b5, 0x0270, 0xe25b, 0xcc73, 0xc894,
0xd7e1, 0xf418, 0x138f, 0x2c2f, 0x33b3, 0x274a, 0x0bd0, 0xeb09,
0xd231, 0xc90c, 0xd2ce, 0xecb0, 0x0d35, 0x28d0, 0x33e1, 0x2bb5,
0x1354, 0xf2d3, 0xd67e, 0xc8f9, 0xce7d, 0xe504, 0x04e7, 0x2261,
0x32ac, 0x309b, 0x1c19, 0xfc53, 0xde26, 0xcae4, 0xcc39, 0xdfa1,
0xfe0f, 0x1cfc, 0x30f0, 0x32ef, 0x20d9, 0x0299, 0xe381, 0xce15,
0xc9eb, 0xd968, 0xf559, 0x143e, 0x2b8e, 0x3245, 0x24e7, 0x0842,
0xe855, 0xcf3e, 0xc621, 0xd1df, 0xed12, 0x0d9b, 0x291b, 0x34a8,
0x2b87, 0x1251, 0xf29a, 0xd5ab, 0xc83d, 0xcef4, 0xe57f, 0x05e8,
0x2138, 0x30e4, 0x2e2f, 0x190f, 0xfabe, 0xdcde, 0xcb02, 0xcce3,
0xe0d8, 0xfe6b, 0x1d84, 0x3172, 0x335b, 0x21e2, 0x0353, 0xe366,
0xcc6d, 0xc756, 0xd68f, 0xf372, 0x1358, 0x2bc7, 0x31d9, 0x2527,
0x0a3c, 0xe9ab, 0xd111, 0xc94a, 0xd55b, 0xef62, 0x0f6e, 0x2930,
0x3465, 0x2b2d, 0x10ef, 0xf070, 0xd3d3, 0xc74e, 0xce7c, 0xe5f3,
0x06a8, 0x256b, 0x34aa, 0x312d, 0x1b04, 0xfa45, 0xdc1c, 0xcad4,
0xcc55, 0xe003, 0xfdd2, 0x1a16, 0x2df6, 0x2ed0, 0x1dc0, 0xffb8,
0xe0a0, 0xcc63, 0xc840, 0xd923, 0xf650, 0x17da, 0x2ec0, 0x348c,
0x26bb, 0x0a1c, 0xe9af, 0xcfc7, 0xc8cc, 0xd2c8, 0xed42, 0x0e1c,
0x2795, 0x3267, 0x28b8, 0x0fd1, 0xf044, 0xd4bf, 0xc8d2, 0xcf5e,
0xe745, 0x0862, 0x2539, 0x33cb, 0x2eab, 0x18cf, 0xf8d7, 0xda83,
0xcb14, 0xcc8d, 0xe002, 0xfea9, 0x1def, 0x3081, 0x3126, 0x1ff1,
0x015f, 0xe2ec, 0xcc85, 0xca21, 0xdab5, 0xf727, 0x1635, 0x2d01,
0x327e, 0x2529, 0x09b1, 0xe913, 0xcfe1, 0xc79d, 0xd379, 0xee3d,
0x0e19, 0x27cf, 0x32fd, 0x291b, 0x0f92, 0xeef6, 0xd390, 0xc6b1,
0xcd90, 0xe658, 0x0736, 0x240d, 0x3336, 0x2fb8, 0x19fb, 0xfa97,
0xdc63, 0xcb04, 0xcd2d, 0xe0bd, 0xfe0f, 0x1bd3, 0x2f09, 0x3008,
0x1daf, 0x0041, 0xe0b8, 0xcc2d, 0xc951, 0xd899, 0xf5b2, 0x1675,
0x2d9d, 0x345f, 0x2711, 0x0ad5, 0xeb01, 0xd1d4, 0xc9cd, 0xd44f,
0xeeef, 0x0d30, 0x2697, 0x31a0, 0x293c, 0x0f98, 0xeff0, 0xd583,
0xc9a0, 0xcfd3, 0xe7c8, 0x083d, 0x2480, 0x3369, 0x2dc3, 0x185b,
0xf874, 0xdb58, 0xca82, 0xcc38, 0xe0c4, 0xfe69, 0x1c4e, 0x2ffd,
0x30be, 0x1f03, 0x011b, 0xe288, 0xcd13, 0xc9be, 0xd933, 0xf672,
0x14bc, 0x29f5, 0x3064, 0x2299, 0x072c, 0xe7bb, 0xd01b, 0xc7a4,
0xd335, 0xee16, 0x0e7b, 0x27af, 0x31cb, 0x2909, 0x100e, 0xf040,
0xd4e8, 0xc92a, 0xd0ce, 0xe801, 0x06da, 0x2340, 0x3174, 0x2cca,
0x16d1, 0xf866, 0xdb57, 0xcafc, 0xcdb2, 0xe14c, 0xfffd, 0x1ed0,
0x30c5, 0x31b3, 0x1ec6, 0x0008, 0xe131, 0xcc6e, 0xc9ff, 0xd9ca,
0xf65d, 0x1449, 0x2c36, 0x323e, 0x2529, 0x09ab, 0xe9b6, 0xd16a,
0xc94f, 0xd4a7, 0xee56, 0x0cf7, 0x267a, 0x3193, 0x285f, 0x1010,
0xf0df, 0xd5ce, 0xca55, 0xd08c, 0xe781, 0x07c1, 0x23b9, 0x3261,
0x2cf0, 0x16cf, 0xf76e, 0xda29, 0xc91d, 0xcb22, 0xdff3, 0xfec1,
0x1cdf, 0x2f7b, 0x2f9e, 0x1de1, 0x0027, 0xe1f8, 0xceef, 0xcc0d,
0xdbcd, 0xf850, 0x1744, 0x2c9b, 0x3278, 0x2434, 0x079c, 0xe823,
0xd032, 0xca85, 0xd506, 0xf012, 0x0fb7, 0x2929, 0x344d, 0x2a18,
0x1248, 0xf2a4, 0xd771, 0xcb71, 0xd16d, 0xe86a, 0x06a6, 0x2156,
0x2fc5, 0x2bcc, 0x16a2, 0xf769, 0xda4a, 0xca09, 0xce07, 0xe26b,
0x0233, 0x206c, 0x3278, 0x3312, 0x1f4e, 0x0118, 0xe19c, 0xcd70,
0xcaed, 0xda78, 0xf727, 0x15d2, 0x2c80, 0x3263, 0x24be, 0x08e0,
0xe8dc, 0xd202, 0xc9ca, 0xd556, 0xf034, 0x0f0b, 0x27dc, 0x318d,
0x27b2, 0x0de1, 0xee8c, 0xd44f, 0xc918, 0xcfda, 0xe7e0, 0x069c,
0x22c3, 0x30a2, 0x2cca, 0x177d, 0xf776, 0xdabc, 0xc9b3, 0xccad,
0xe195, 0xffb2, 0x1d20, 0x3051, 0x3026, 0x1db6, 0xff4d, 0xe14e,
0xcd8c, 0xcbfb, 0xdc1e, 0xf8a9, 0x1839, 0x2d7a, 0x3254, 0x23bb,
0x07ab, 0xe814, 0xcf83, 0xc861, 0xd48e, 0xef95, 0x0f1d, 0x27ce,
0x324f, 0x27da, 0x0eea, 0xefea, 0xd580, 0xc9e1, 0xd250, 0xea78,
0x0916, 0x241e, 0x3192, 0x2d05, 0x170f, 0xf6e5, 0xda3f, 0xcafd,
0xce9d, 0xe347, 0x01d3, 0x20cf, 0x3158, 0x30a3, 0x1ce2, 0xfdc7,
0xdef5, 0xcac4, 0xc8d4, 0xd948, 0xf75a, 0x169c, 0x2c59, 0x3186,
0x246b, 0x0894, 0xe92c, 0xd112, 0xca5e, 0xd6a1, 0xf086, 0x1084,
0x27a8, 0x310c, 0x279f, 0x0de1, 0xee26, 0xd3d9, 0xc99b, 0xd1c5,
0xe9e6, 0x0993, 0x24a8, 0x324f, 0x2db8, 0x173d, 0xf901, 0xdc07,
0xcbf8, 0xcdc0, 0xe285, 0x0170, 0x1e1b, 0x2f80, 0x2ecd, 0x1b2f,
0xfcfb, 0xdf42, 0xcbf4, 0xcb31, 0xdd32, 0xfacd, 0x19b2, 0x2f00,
0x32e2, 0x24c2, 0x095d, 0xe932, 0xd0c5, 0xcb26, 0xd5d5, 0xf0ac,
0x0ecd, 0x273b, 0x30fc, 0x27b4, 0x0e10, 0xef2f, 0xd55b, 0xca0f,
0xd220, 0xe93d, 0x088d, 0x2273, 0x2fbb, 0x2a71, 0x157f, 0xf6ef,
0xdbd1, 0xca82, 0xcda5, 0xe2a6, 0x0192, 0x1dfc, 0x2fbd, 0x2f59,
0x1c45, 0xffb8, 0xe1c9, 0xcec8, 0xcd43, 0xde8d, 0xfa76, 0x1893,
0x2d54, 0x3299, 0x22bb, 0x0719, 0xe81f, 0xd0c5, 0xcb50, 0xd669,
0xf117, 0x1093, 0x284f, 0x31fc, 0x27f9, 0x0f86, 0xefec, 0xd54f,
0xca59, 0xd1e5, 0xea91, 0x0941, 0x2435, 0x31fa, 0x2d21, 0x16bd,
0xf924, 0xdc5b, 0xcc44, 0xcef7, 0xe3e8, 0x0268, 0x1e34, 0x2fdb,
0x2f03, 0x1cf8, 0xff71, 0xe1a5, 0xce2c, 0xccea, 0xdd3d, 0xf9c8,
0x1976, 0x2e69, 0x3298, 0x22c1, 0x0651, 0xe775, 0xd039, 0xc9c7,
0xd5fd, 0xf031, 0x0ee1, 0x2772, 0x30a3, 0x277e, 0x0eea, 0xeffb,
0xd651, 0xcba7, 0xd39a, 0xebc1, 0x0a2d, 0x2413, 0x3119, 0x2d20,
0x172b, 0xf860, 0xdbaa, 0xcbb3, 0xcdda, 0xe239, 0x00a5, 0x1d69,
0x2feb, 0x2ea7, 0x1d2a, 0xff98, 0xe1de, 0xcf65, 0xceea, 0xdf6f,
0xfc27, 0x1a22, 0x2df5, 0x30fe, 0x204e, 0x057e, 0xe6da, 0xd048,
0xcabc, 0xd706, 0xf2b0, 0x1116, 0x29ed, 0x32d4, 0x28cb, 0x0fbf,
0xef67, 0xd639, 0xcb65, 0xd4d7, 0xec89, 0x0a05, 0x240e, 0x30bf,
0x2a9f, 0x1409, 0xf53c, 0xd8a9, 0xca78, 0xce4c, 0xe28e, 0x01b8,
0x1e5c, 0x2f46, 0x2e64, 0x1b81, 0xff08, 0xe14b, 0xcda0, 0xcbe7,
0xdce3, 0xf9a5, 0x177e, 0x2c52, 0x2f7e, 0x2031, 0x046a, 0xe4e5,
0xce24, 0xc9af, 0xd717, 0xf1e1, 0x1186, 0x28c6, 0x317e, 0x2685,
0x0d0f, 0xeecb, 0xd4af, 0xcae5, 0xd383, 0xeb67, 0x0a88, 0x2574,
0x32d8, 0x2cd0, 0x15df, 0xf6cc, 0xd9ff, 0xcae9, 0xce2e, 0xe3f4,
0x0238, 0x1ec5, 0x3022, 0x2e3b, 0x1c5c, 0xfeed, 0xe156, 0xcd98,
0xcd09, 0xdd8b, 0xf9d5, 0x1811, 0x2b7c, 0x300c, 0x20e0, 0x052b,
0xe754, 0xd111, 0xcbbb, 0xd821, 0xf24f, 0x1173, 0x28bd, 0x3173,
0x26ee, 0x0dab, 0xedf6, 0xd3ee, 0xca18, 0xd2a7, 0xea57, 0x0957,
0x242f, 0x3028, 0x29bc, 0x135a, 0xf51b, 0xd8c9, 0xc9d3, 0xcdb9,
0xe27a, 0x009a, 0x1d3b, 0x2ec5, 0x2e61, 0x1c99, 0xff0d, 0xe041,
0xccd2, 0xcb8e, 0xdcca, 0xf8cf, 0x1793, 0x2d06, 0x31b5, 0x22ab,
0x07e3, 0xeaac, 0xd309, 0xcd74, 0xd943, 0xf351, 0x1182, 0x28b0,
0x3154, 0x260c, 0x0c6f, 0xeda5, 0xd41d, 0xc907, 0xd053, 0xe846,
0x0863, 0x2321, 0x2fbf, 0x2be5, 0x160e, 0xf7a0, 0xdbe5, 0xcc1c,
0xd08a, 0xe4b7, 0x0179, 0x1ded, 0x2f26, 0x2e5e, 0x1b91, 0xfe82,
0xe0e1, 0xcd64, 0xcca6, 0xdc1b, 0xf72a, 0x1512, 0x2978, 0x2dc4,
0x1fe2, 0x05e9, 0xe7fa, 0xd1e1, 0xcb87, 0xd710, 0xf0ba, 0x0e8c,
0x2543, 0x2ca7, 0x234e, 0x0c0f, 0xed56, 0xd3b3, 0xc906, 0xd111,
0xe8fe, 0x07ce, 0x2276, 0x2fea, 0x2a02, 0x1431, 0xf6bb, 0xdad7,
0xcc26, 0xced9, 0xe3d1, 0x0177, 0x1d0c, 0x2da4, 0x2d17, 0x1a82,
0xfd95, 0xe0a2, 0xcd84, 0xcc18, 0xdc23, 0xf83f, 0x15fe, 0x2af7,
0x2f73, 0x217e, 0x06be, 0xe8eb, 0xd248, 0xcc1c, 0xd721, 0xf156,
0x0efd, 0x2609, 0x2fd8, 0x2617, 0x0f9d, 0xf094, 0xd62b, 0xcb1b,
0xd244, 0xe986, 0x07ba, 0x22f2, 0x2f38, 0x2ada, 0x149e, 0xf612,
0xd9d9, 0xc98d, 0xcda6, 0xe194, 0x00b1, 0x1ca6, 0x2ce3, 0x2c27,
0x1ad8, 0xfeaa, 0xe034, 0xcd5f, 0xcb04, 0xdb5b, 0xf7e7, 0x1574,
0x2a6c, 0x3021, 0x2254, 0x07f9, 0xe9f7, 0xd2af, 0xcbe3, 0xd7cc,
0xf17f, 0x0f42, 0x2712, 0x2fd4, 0x2687, 0x0d89, 0xeff0, 0xd6de,
0xcbf1, 0xd423, 0xebe7, 0x0a24, 0x2378, 0x30e7, 0x2c3e, 0x15a2,
0xf74e, 0xdbee, 0xcc4f, 0xcf26, 0xe3c7, 0x01ee, 0x1d49, 0x2d88,
0x2dd2, 0x1c3c, 0x0007, 0xe18a, 0xce4e, 0xcdf0, 0xde7b, 0xfa60,
0x1735, 0x2bdf, 0x306f, 0x2233, 0x064b, 0xe894, 0xd219, 0xcb39,
0xd785, 0xf119, 0x0ede, 0x26fa, 0x2fda, 0x26ca, 0x0ebb, 0xf1ea,
0xd94e, 0xcda7, 0xd4be, 0xeb3c, 0x09b6, 0x22a6, 0x2f69, 0x2aca,
0x14c7, 0xf69f, 0xdae0, 0xcc20, 0xcf70, 0xe2ef, 0x00a2, 0x1d0a,
0x2e0e, 0x2e19, 0x1c2a, 0xff7e, 0xe29a, 0xcfcc, 0xce0e, 0xde10,
0xf977, 0x168d, 0x2b62, 0x3051, 0x220e, 0x06bb, 0xe84b, 0xd1cb,
0xcbbd, 0xd67b, 0xf07b, 0x0ff0, 0x2781, 0x300a, 0x26a4, 0x0f9d,
0xf159, 0xd72a, 0xcbd9, 0xd2fc, 0xe9e6, 0x0714, 0x21e1, 0x2f94,
0x2a5e, 0x1562, 0xf80a, 0xdcc4, 0xccf1, 0xce77, 0xe28e, 0x004f,
0x1ca8, 0x2d65, 0x2d20, 0x1b9b, 0xfea8, 0xe219, 0xce98, 0xccbe,
0xdce1, 0xf80c, 0x165c, 0x2bb9, 0x2fbc, 0x225d, 0x0780, 0xe9ba,
0xd223, 0xcb39, 0xd658, 0xefec, 0x0e55, 0x258b, 0x2fb6, 0x276f,
0x0fd8, 0xf0b6, 0xd7f4, 0xcc34, 0xd33d, 0xe97a, 0x0731, 0x217f,
0x2ea9, 0x2ab2, 0x15b9, 0xf7e6, 0xdc72, 0xcd80, 0xcf39, 0xe30f,
0x0131, 0x1ddb, 0x2df7, 0x2ea4, 0x1d35, 0x0120, 0xe3d8, 0xcf66,
0xccf2, 0xdd4a, 0xf923, 0x15a5, 0x29cd, 0x2f7e, 0x2243, 0x071a,
0xe99b, 0xd2df, 0xcda9, 0xd8a2, 0xf165, 0x0f2d, 0x2792, 0x308a,
0x26f5, 0x0edb, 0xf114, 0xd715, 0xcb99, 0xd214, 0xe71b, 0x051e,
0x1f03, 0x2da5, 0x2a1a, 0x14bb, 0xf846, 0xdd6e, 0xcd6d, 0xcf83,
0xe2c0, 0x0097, 0x1acf, 0x2be9, 0x2c5b, 0x1b1b, 0xfe54, 0xdfe4,
0xcd66, 0xcba9, 0xdbdf, 0xf6b9, 0x13ed, 0x29dd, 0x2ee6, 0x2186,
0x07d9, 0xe9ee, 0xd3b6, 0xccc7, 0xd6f9, 0xefb6, 0x0d93, 0x25fd,
0x2ede, 0x2602, 0x0eb9, 0xf0f3, 0xd82f, 0xcc5f, 0xd1fd, 0xe8d8,
0x0745, 0x20f0, 0x2e33, 0x2a69, 0x15da, 0xf8f7, 0xdd9e, 0xcdb1,
0xcf9d, 0xe235, 0xfe86, 0x1a40, 0x2c34, 0x2cbf, 0x1be7, 0x00d1,
0xe4ac, 0xd111, 0xcf30, 0xddf4, 0xf843, 0x153a, 0x2a10, 0x2ee4,
0x2193, 0x079e, 0xea2a, 0xd2ff, 0xcba8, 0xd6ce, 0xeec3, 0x0d70,
0x2531, 0x2e2b, 0x25e9, 0x0e96, 0xf155, 0xd7dd, 0xcb8b, 0xd12b,
0xe7f4, 0x0584, 0x1fc6, 0x2e3d, 0x2bf8, 0x1882, 0xfb16, 0xdfab,
0xce57, 0xcfea, 0xe246, 0xff58, 0x1aab, 0x2c2f, 0x2de3, 0x1d2d,
0x01af, 0xe487, 0xd08b, 0xcd3a, 0xdc09, 0xf6aa, 0x142a, 0x299d,
0x2ea7, 0x21d9, 0x08a1, 0xeb58, 0xd3f9, 0xccef, 0xd799, 0xf02e,
0x0eda, 0x25b4, 0x2fc3, 0x26ff, 0x0f95, 0xf1c5, 0xd848, 0xccce,
0xd302, 0xe9bc, 0x079f, 0x2266, 0x2f34, 0x2cb5, 0x1744, 0xf969,
0xddf2, 0xcd51, 0xcedb, 0xe064, 0xfc0c, 0x16f6, 0x2984, 0x2b38,
0x1c12, 0x007b, 0xe482, 0xd11d, 0xce42, 0xdde4, 0xf871, 0x15a8,
0x2955, 0x2e9b, 0x2175, 0x0751, 0xea71, 0xd38a, 0xcbdb, 0xd6e9,
0xeeeb, 0x0cb5, 0x24b6, 0x2d6f, 0x25a4, 0x0f3c, 0xf22d, 0xd8c0,
0xcd93, 0xd2eb, 0xe875, 0x0629, 0x2035, 0x2e36, 0x2b7d, 0x17da,
0xfae1, 0xdfe8, 0xcef4, 0xd028, 0xe0ac, 0xfcae, 0x19c6, 0x2b2f,
0x2d5a, 0x1d7b, 0x0227, 0xe636, 0xd1f1, 0xcf00, 0xdcec, 0xf62c,
0x129e, 0x276a, 0x2e18, 0x2266, 0x09a3, 0xeccc, 0xd4e1, 0xcc2a,
0xd726, 0xef0d, 0x0cb4, 0x2469, 0x2d86, 0x266b, 0x0f06, 0xf117,
0xd7de, 0xcc59, 0xd27e, 0xe70c, 0x058b, 0x2185, 0x2efb, 0x2bbf,
0x1816, 0xfc5e, 0xdf7d, 0xcd7b, 0xcf02, 0xe024, 0xfc2f, 0x1886,
0x2aec, 0x2da5, 0x1e17, 0x0214, 0xe5d2, 0xd1ba, 0xce5a, 0xdca8,
0xf63f, 0x148d, 0x2ac0, 0x30ae, 0x24f1, 0x0b12, 0xecb4, 0xd543,
0xccfb, 0xd73a, 0xef0d, 0x0c6b, 0x247b, 0x2e69, 0x281a, 0x12cb,
0xf50d, 0xdb7d, 0xceca, 0xd315, 0xe941, 0x06bc, 0x208e, 0x2e46,
0x2bab, 0x1852, 0xfaf8, 0xdf89, 0xd020, 0xd129, 0xe174, 0xfd44,
0x19f6, 0x2c61, 0x2eb3, 0x1f06, 0x04c1, 0xe848, 0xd376, 0xcf3c,
0xda90, 0xf398, 0x0fbb, 0x255a, 0x2cbb, 0x21da, 0x0a6a, 0xed53,
0xd610, 0xcde2, 0xd707, 0xee14, 0x0b57, 0x2375, 0x2ee3, 0x28a1,
0x12d3, 0xf524, 0xda2d, 0xcd17, 0xd21f, 0xe638, 0x02a2, 0x1cda,
0x2ac6, 0x2a0a, 0x17e1, 0xfc99, 0xe23b, 0xd0b1, 0xd0ca, 0xe153,
0xfc44, 0x1870, 0x2b22, 0x2d5e, 0x1e2c, 0x0367, 0xe777, 0xd2d1,
0xce9a, 0xdaf6, 0xf433, 0x1116, 0x262d, 0x2dee, 0x2349, 0x0b54,
0xee59, 0xd70b, 0xce5b, 0xd73c, 0xeccb, 0x08fb, 0x217c, 0x2d37,
0x26a8, 0x1183, 0xf582, 0xdc41, 0xcfa0, 0xd263, 0xe6f1, 0x02ad,
0x1c96, 0x2b68, 0x2a21, 0x17b0, 0xfc33, 0xe097, 0xce77, 0xce87,
0xdea8, 0xfa2d, 0x160d, 0x2903, 0x2c59, 0x1fac, 0x05a0, 0xe8ef,
0xd3af, 0xce6f, 0xd99d, 0xf131, 0x0e23, 0x238e, 0x2c6c, 0x230f,
0x0b0b, 0xee5d, 0xd6db, 0xcd64, 0xd519, 0xeb8e, 0x084c, 0x2146,
0x2cfb, 0x27c1, 0x1376, 0xf6df, 0xdcab, 0xceae, 0xd202, 0xe4d6,
0x0102, 0x1bef, 0x2b1f, 0x29c6, 0x186d, 0xfcd3, 0xe220, 0xd0d0,
0xcfb9, 0xe04b, 0xfb34, 0x17e1, 0x2b1f, 0x2e64, 0x1fed, 0x05ba,
0xe94a, 0xd320, 0xcdce, 0xd991, 0xf210, 0x0e42, 0x2513, 0x2d5a,
0x24a4, 0x0dd3, 0xf0f6, 0xd959, 0xcf1b, 0xd635, 0xebce, 0x06dd,
0x1e53, 0x2b2c, 0x25de, 0x122e, 0xf59a, 0xdc48, 0xce57, 0xd1cf,
0xe5cf, 0x01bd, 0x1bcb, 0x2bc0, 0x2afb, 0x193d, 0xfe46, 0xe241,
0xd083, 0xcf61, 0xde5a, 0xf8fd, 0x15cc, 0x28a3, 0x2beb, 0x1e0a,
0x0507, 0xe8be, 0xd3ec, 0xceff, 0xda03, 0xf2cc, 0x0fe5, 0x25e4,
0x2d52, 0x240c, 0x0d7b, 0xf00c, 0xd875, 0xcef4, 0xd4f9, 0xea9d,
0x0716, 0x1e7e, 0x2bbf, 0x2757, 0x1465, 0xf8ff, 0xdf21, 0xd14d,
0xd336, 0xe636, 0x0035, 0x1a2d, 0x2a2f, 0x2b01, 0x1a76, 0xffa0,
0xe4b1, 0xd23e, 0xd071, 0xdeb8, 0xf8e3, 0x140a, 0x268a, 0x2b52,
0x1e10, 0x0477, 0xe867, 0xd2fc, 0xcda5, 0xd85f, 0xf075, 0x0d80,
0x2431, 0x2c89, 0x2530, 0x0e24, 0xf298, 0xdb2e, 0xcf52, 0xd545,
0xeab1, 0x0668, 0x1e19, 0x2b4e, 0x26b0, 0x1457, 0xf8cc, 0xdea0,
0xd016, 0xd270, 0xe41e, 0xffb4, 0x1a84, 0x2a92, 0x2a95, 0x1b94,
0x0138, 0xe55c, 0xd3eb, 0xd0d5, 0xde87, 0xf817, 0x13a3, 0x26e0,
0x2c19, 0x1f3e, 0x05fa, 0xeaca, 0xd556, 0xcfba, 0xdab0, 0xf2ec,
0x0ef0, 0x24f2, 0x2e5b, 0x260a, 0x1018, 0xf2da, 0xdb19, 0xcf7e,
0xd54d, 0xea23, 0x055b, 0x1dd5, 0x2b71, 0x27d1, 0x1574, 0xfab5,
0xe078, 0xd144, 0xd1a5, 0xe300, 0xfd99, 0x17b5, 0x27d5, 0x291a,
0x18ac, 0xffc5, 0xe5d4, 0xd2fa, 0xd00f, 0xdd85, 0xf81d, 0x1313,
0x2729, 0x2c63, 0x2061, 0x08b2, 0xec54, 0xd66c, 0xcfaf, 0xda5b,
0xf08c, 0x0cea, 0x2394, 0x2c6e, 0x24bb, 0x0ec3, 0xf367, 0xdb61,
0xd07f, 0xd62c, 0xe9f2, 0x0576, 0x1ea5, 0x2cc5, 0x29b3, 0x1776,
0xfc47, 0xe22e, 0xd1b6, 0xd250, 0xe322, 0xfcbb, 0x17cb, 0x27f7,
0x2a2a, 0x1b4a, 0x0311, 0xe7ce, 0xd502, 0xd179, 0xddae, 0xf65d,
0x1139, 0x25aa, 0x2b82, 0x214a, 0x098e, 0xef1f, 0xd920, 0xd0ec,
0xd967, 0xefe8, 0x0b3e, 0x2294, 0x2cec, 0x2537, 0x101b, 0xf351,
0xdb43, 0xcf78, 0xd3cb, 0xe7b5, 0x02a7, 0x1c71, 0x29df, 0x2880,
0x1726, 0xfc5d, 0xe31e, 0xd1e6, 0xd2a4, 0xe32b, 0xfc3b, 0x1622,
0x2761, 0x292f, 0x1b36, 0x01dc, 0xe6d1, 0xd3ae, 0xcfe7, 0xdb5c,
0xf3a2, 0x0f4d, 0x2486, 0x2b51, 0x222c, 0x0cad, 0xf0ed, 0xdaff,
0xd20c, 0xd9c8, 0xef09, 0x0956, 0x20f6, 0x2abc, 0x2424, 0x111c,
0xf52f, 0xdc9f, 0xd03c, 0xd4d6, 0xe7f9, 0x041b, 0x1e1a, 0x2be4,
0x2a5d, 0x1909, 0xfd99, 0xe362, 0xd2fb, 0xd309, 0xe1fe, 0xfbfa,
0x15c1, 0x278c, 0x2a63, 0x1cb6, 0x04d2, 0xe8d5, 0xd631, 0xd16c,
0xdcaf, 0xf411, 0x0ecc, 0x2242, 0x290b, 0x2026, 0x0a19, 0xeec8,
0xd7ed, 0xceb2, 0xd6c3, 0xecc5, 0x0966, 0x1fc8, 0x2995, 0x247a,
0x11dc, 0xf723, 0xddb7, 0xd20c, 0xd571, 0xe82a, 0x034b, 0x1b9d,
0x29dd, 0x28b1, 0x17c6, 0xfd58, 0xe31e, 0xd291, 0xd14a, 0xe17d,
0xfaa6, 0x1538, 0x27f7, 0x2a7c, 0x1d22, 0x0518, 0xeade, 0xd66d,
0xd0d1, 0xdb1a, 0xf2a0, 0x0dcd, 0x2190, 0x28d6, 0x2090, 0x0c13,
0xf122, 0xda1c, 0xd18e, 0xd8a7, 0xecc1, 0x0792, 0x1ef5, 0x2a7b,
0x25e5, 0x12cb, 0xf8e7, 0xdfd7, 0xd296, 0xd542, 0xe6b5, 0x00f8,
0x19ce, 0x27ef, 0x26af, 0x17c8, 0xfe28, 0xe334, 0xd187, 0xd05d,
0xdda2, 0xf7a7, 0x12b4, 0x24d5, 0x28a1, 0x1cc2, 0x05b4, 0xeb97,
0xd79c, 0xd0f0, 0xdb96, 0xf1ed, 0x0d0b, 0x2109, 0x290c, 0x219b,
0x0c26, 0xf135, 0xdb2b, 0xd144, 0xd6fe, 0xeb64, 0x065a, 0x1dd4,
0x2a56, 0x2622, 0x13a6, 0xf9f8, 0xe1fb, 0xd501, 0xd61a, 0xe775,
0x007a, 0x19bf, 0x2774, 0x25e1, 0x1750, 0xfdee, 0xe441, 0xd28b,
0xd1bb, 0xdfb3, 0xf9ab, 0x1385, 0x265c, 0x2b69, 0x1f45, 0x07fa,
0xeb4b, 0xd82a, 0xd24b, 0xdc4d, 0xf2bc, 0x0ca1, 0x20dc, 0x28ee,
0x218a, 0x0be4, 0xf0fa, 0xdb10, 0xd20a, 0xd80b, 0xeb08, 0x04c8,
0x1bd5, 0x2795, 0x23ba, 0x11af, 0xf836, 0xdfe8, 0xd216, 0xd440,
0xe54c, 0xff16, 0x17ac, 0x2684, 0x27ab, 0x17fa, 0xffad, 0xe6c7,
0xd5b9, 0xd489, 0xe18a, 0xf9e1, 0x134d, 0x25b6, 0x2a1b, 0x1df8,
0x0695, 0xec6b, 0xd870, 0xd255, 0xdb97, 0xf123, 0x0c75, 0x216b,
0x29a1, 0x22c4, 0x0e52, 0xf37a, 0xdc41, 0xd209, 0xd780, 0xeaf3,
0x0558, 0x1c18, 0x277e, 0x247f, 0x13f2, 0xfaa4, 0xe313, 0xd497,
0xd690, 0xe6ca, 0xffc0, 0x1820, 0x267f, 0x2790, 0x1905, 0x01a6,
0xe84f, 0xd64b, 0xd3e6, 0xe0d4, 0xf7fd, 0x11a8, 0x239c, 0x2853,
0x1d4e, 0x06b3, 0xebfa, 0xd6c0, 0xd0f8, 0xdaa8, 0xeffd, 0x099f,
0x1ea8, 0x27dc, 0x20fc, 0x0e0e, 0xf3dd, 0xdd32, 0xd2de, 0xd7bc,
0xebe5, 0x0539, 0x1be0, 0x27dd, 0x263a, 0x1508, 0xfb99, 0xe32b,
0xd443, 0xd59b, 0xe4c3, 0xfda8, 0x165a, 0x25c6, 0x26d2, 0x1936,
0x0180, 0xe940, 0xd740, 0xd57a, 0xe111, 0xf77c, 0x1274, 0x2468,
0x28f4, 0x1de8, 0x081e, 0xedcc, 0xd8e5, 0xd149, 0xda01, 0xf047,
0x0ac2, 0x205a, 0x2b0a, 0x244e, 0x1082, 0xf6f7, 0xdfac, 0xd441,
0xd86a, 0xeb43, 0x03d6, 0x1b0b, 0x276a, 0x2524, 0x154a, 0xfb73,
0xe3c3, 0xd53c, 0xd618, 0xe493, 0xfbfe, 0x14d0, 0x246b, 0x2671,
0x18cb, 0x0181, 0xe870, 0xd736, 0xd339, 0xdf01, 0xf67f, 0x1013,
0x2332, 0x277d, 0x1da3, 0x08fa, 0xeedd, 0xda7d, 0xd3a1, 0xdba5,
0xf137, 0x0b38, 0x209c, 0x2913, 0x2267, 0x0f6f, 0xf624, 0xdf06,
0xd3b5, 0xd7ef, 0xe92e, 0x02e5, 0x19f0, 0x2702, 0x249b, 0x14d7,
0xfc87, 0xe512, 0xd5e4, 0xd5ab, 0xe458, 0xfb67, 0x13f6, 0x238f,
0x25b7, 0x1977, 0x0398, 0xeb15, 0xd901, 0xd542, 0xe0da, 0xf6e5,
0x0f5a, 0x2227, 0x2852, 0x1f6f, 0x0a73, 0xf08a, 0xdbe8, 0xd32e,
0xdb4a, 0xef47, 0x0800, 0x1d6d, 0x2769, 0x21dd, 0x0e44, 0xf565,
0xdef8, 0xd314, 0xd610, 0xe797, 0x0179, 0x18c4, 0x258f, 0x2428,
0x1528, 0xfdb1, 0xe5f4, 0xd527, 0xd456, 0xe39d, 0xface, 0x13ab,
0x2498, 0x2803, 0x1c75, 0x06a4, 0xeca3, 0xda50, 0xd501, 0xdeb6,
0xf48c, 0x0cae, 0x1fb6, 0x26a8, 0x1ec2, 0x0a11, 0xf12c, 0xdcf3,
0xd569, 0xdbcc, 0xef41, 0x07b1, 0x1d38, 0x27c7, 0x21f0, 0x104c,
0xf805, 0xe094, 0xd46f, 0xd789, 0xe8a6, 0x0168, 0x187b, 0x265a,
0x252c, 0x16b3, 0xfe42, 0xe622, 0xd665, 0xd500, 0xe338, 0xfa09,
0x1309, 0x2324, 0x25d0, 0x1b03, 0x04a6, 0xebb7, 0xd8f7, 0xd37f,
0xdd2a, 0xf346, 0x0c91, 0x1fd7, 0x2805, 0x20fa, 0x0cdd, 0xf407,
0xdf46, 0xd53d, 0xda4b, 0xed72, 0x0676, 0x1beb, 0x26e3, 0x220d,
0x10b7, 0xf80a, 0xe0c2, 0xd4db, 0xd812, 0xe851, 0x0015, 0x17ae,
0x2637, 0x25fa, 0x1863, 0x0067, 0xe774, 0xd762, 0xd455, 0xe09f,
0xf79a, 0x1086, 0x21de, 0x2622, 0x1a9a, 0x0515, 0xece8, 0xda1d,
0xd467, 0xdde8, 0xf2f2, 0x0b9f, 0x1eb3, 0x273c, 0x1faf, 0x0c68,
0xf447, 0xdeef, 0xd593, 0xda67, 0xec63, 0x04a5, 0x1a6f, 0x2655,
0x24a4, 0x1362, 0xf9cd, 0xe289, 0xd5ba, 0xd739, 0xe6cc, 0xfdb2,
0x14de, 0x2323, 0x23c1, 0x1747, 0xfff7, 0xe7a3, 0xd8e5, 0xd7a1,
0xe4d7, 0xfa49, 0x11fb, 0x21ff, 0x25d2, 0x1b3a, 0x05af, 0xef67,
0xdbdc, 0xd68f, 0xdfee, 0xf432, 0x0c1d, 0x1ea6, 0x25e8, 0x1f96,
0x0c26, 0xf39f, 0xde7f, 0xd58d, 0xdb5e, 0xed78, 0x04ee, 0x1a6e,
0x2541, 0x217a, 0x114f, 0xf87c, 0xe189, 0xd3ee, 0xd727, 0xe74e,
0xfe7d, 0x1509, 0x2343, 0x24c7, 0x1931, 0x0198, 0xe998, 0xd86b,
0xd57e, 0xe160, 0xf6ce, 0x0eb5, 0x1ec9, 0x234d, 0x1aef, 0x0998,
0xf172, 0xde6f, 0xd7a0, 0xddd8, 0xf0bf, 0x096a, 0x1caf, 0x2438,
0x1d20, 0x0bb6, 0xf4c3, 0xdfb7, 0xd56d, 0xd978, 0xea0c, 0x0371,
0x18fd, 0x2510, 0x2324, 0x1307, 0xfcce, 0xe604, 0xda6c, 0xd8c9,
0xe5f1, 0xfb34, 0x10e5, 0x2218, 0x2448, 0x18d0, 0x01e7, 0xe96c,
0xd979, 0xd5ad, 0xe214, 0xf637, 0x0e54, 0x1eaf, 0x235b, 0x1b1f,
0x0760, 0xf2ac, 0xde2b, 0xd8b3, 0xde90, 0xef13, 0x0703, 0x1a27,
0x254d, 0x201f, 0x0da7, 0xf655, 0xe00f, 0xd6a6, 0xdadc, 0xec07,
0x033b, 0x188d, 0x24f4, 0x237b, 0x137d, 0xfc04, 0xe5b2, 0xd715,
0xd8f0, 0xe60d, 0xfd36, 0x13b8, 0x21f9, 0x248e, 0x1801, 0x01a1,
0xead0, 0xdb73, 0xd8fd, 0xe3a7, 0xf744, 0x0d06, 0x1fc1, 0x24f8,
0x1b4d, 0x0720, 0xefcf, 0xddd5, 0xd6a1, 0xde27, 0xef8d, 0x0715,
0x1b2c, 0x25f8, 0x2069, 0x0e94, 0xf63f, 0xe173, 0xd742, 0xda48,
0xeb29, 0x0312, 0x18b5, 0x2301, 0x2152, 0x1361, 0xfd8f, 0xe7e7,
0xda32, 0xdb14, 0xe841, 0xfcc7, 0x1240, 0x2259, 0x2532, 0x185a,
0x026e, 0xe8e3, 0xdaa9, 0xd7e5, 0xe2db, 0xf7f3, 0x0e26, 0x203c,
0x25a7, 0x1dc7, 0x0a16, 0xf1d2, 0xded8, 0xd764, 0xdd2f, 0xef52,
0x07ba, 0x1da5, 0x26dd, 0x20cb, 0x0eba, 0xf88d, 0xe38c, 0xd93a,
0xdb20, 0xea4c, 0x03a1, 0x1858, 0x25f8, 0x24cc, 0x14be, 0xfd2a,
0xe5b1, 0xd8f6, 0xd7df, 0xe52b, 0xfb3b, 0x136d, 0x2363, 0x2395,
0x1799, 0x0150, 0xea69, 0xd9bc, 0xd942, 0xe41d, 0xfa27, 0x10cf,
0x20bf, 0x263c, 0x1b7b, 0x08a8, 0xefff, 0xdc7c, 0xd462, 0xdbb5,
0xedee, 0x07e3, 0x1cd2, 0x2625, 0x25a4, 0x14eb, 0xfcc3, 0xe208,
0xd3cf, 0xd6b9, 0xe668, 0x023e, 0x185f, 0x280a, 0x25a4, 0x1710,
0xfee6, 0xe57c, 0xd880, 0xd724, 0xe4a6, 0xf8c4, 0x106d, 0x2052,
0x246d, 0x19e9, 0x05c9, 0xeecd, 0xde7f, 0xd9ca, 0xe128, 0xf36a,
0x0832, 0x1a81, 0x211e, 0x1bcd, 0x0d28, 0xea23, 0xd915, 0xe815,
0xfe98, 0x0cf9, 0xfe24, 0xf909, 0xfb84, 0xf7d4, 0x01d9, 0xfa04,
0xf946, 0xee46, 0xe835, 0x1980, 0x2e9f, 0x2102, 0x0aea, 0xfb83,
0xe615, 0xd195, 0xcee4, 0xcecb, 0xe794, 0x0359, 0x29a1, 0x4654,
0x408c, 0x3591, 0x0d34, 0xe46e, 0xc7f8, 0xaeeb, 0xb792, 0xcc07,
0xf0f6, 0x212f, 0x3eae, 0x4a27, 0x3ea1, 0x2754, 0xfedb, 0xd252,
0xc061, 0xbb79, 0xd39a, 0xf6ea, 0x1659, 0x241a, 0x20de, 0x1cee,
0x087f, 0xf7e7, 0xea20, 0xeaad, 0xf2f3, 0xf6f2, 0x0591, 0x0999,
0x070b, 0x021e, 0xef93, 0xdeb5, 0xd9a9, 0xe629, 0xffd0, 0x15e5,
0x26d7, 0x2d88, 0x2886, 0x12c6, 0xeafb, 0xcd9c, 0xb969, 0xc09d,
0xda27, 0xf912, 0x1ec7, 0x383f, 0x4a7d, 0x3dd1, 0x1cf5, 0xf377,
0xc863, 0xb518, 0xb4cb, 0xcd0a, 0xf37d, 0x15b1, 0x3288, 0x39b3,
0x313d, 0x2425, 0x0718, 0xe8e1, 0xd454, 0xd136, 0xdecf, 0xecae,
0x0356, 0x0fa1, 0x1218, 0x108b, 0x03f7, 0xfd20, 0xfeef, 0x0393,
0x0db4, 0x15a8, 0x0f7c, 0x0522, 0xf46e, 0xe339, 0xd152, 0xcb6f,
0xd555, 0xeda3, 0x1873, 0x36a9, 0x4ae8, 0x45ba, 0x2710, 0x0249,
0xd7c4, 0xb4ea, 0x9f52, 0xafdb, 0xda68, 0x0e73, 0x361d, 0x43dd,
0x4e57, 0x3db8, 0x11a7, 0xe23f, 0xbe49, 0xb5a7, 0xc2d8, 0xdcd1,
0xf9d7, 0x141b, 0x2ad1, 0x309a, 0x2622, 0x0ca5, 0xf2fb, 0xe62e,
0xe06c, 0xe585, 0xe8f6, 0xf6f4, 0x021c, 0x07e8, 0x0dd7, 0xff04,
0xf680, 0xf711, 0x0337, 0x0fd6, 0x15ff, 0x1b0f, 0x10bf, 0x0035,
0xe417, 0xd1de, 0xcbb9, 0xcd60, 0xe373, 0x03ef, 0x29f7, 0x3e16,
0x3d53, 0x2c31, 0x0aea, 0xe88b, 0xcb7f, 0xb9d1, 0xbb30, 0xd24e,
0xf9e2, 0x1980, 0x2eb4, 0x37a2, 0x2dc6, 0x1a4a, 0xfb20, 0xdf87,
0xd0a1, 0xd1b0, 0xe116, 0xf301, 0x0728, 0x13c6, 0x1925, 0x1425,
0x08af, 0xfffa, 0xf85c, 0xf5de, 0xf6f5, 0xfc17, 0x014d, 0x05ed,
0x01f1, 0xf934, 0xf1da, 0xed01, 0xeccd, 0xf56e, 0x09e2, 0x1ff5,
0x2ba5, 0x2401, 0x12d7, 0xf7bf, 0xda00, 0xcbc6, 0xc737, 0xd168,
0xee7b, 0x1210, 0x301e, 0x3d74, 0x37ee, 0x2262, 0x01e0, 0xdf09,
0xc3c6, 0xb73d, 0xc148, 0xdf60, 0x0458, 0x204c, 0x354e, 0x3aaa,
0x2890, 0x0c72, 0xef58, 0xdb43, 0xd498, 0xd9d5, 0xe7aa, 0xfa92,
0x0c17, 0x175e, 0x14bc, 0x09d1, 0xfeda, 0xf430, 0xf0ab, 0xf81d,
0x0241, 0x0583, 0x0683, 0x0280, 0xf3ce, 0xe6ae, 0xe0e3, 0xe629,
0xf21d, 0x0461, 0x1978, 0x28bb, 0x2ebb, 0x221c, 0x05d7, 0xe5ac,
0xce10, 0xc293, 0xc6e9, 0xdd12, 0xff55, 0x22da, 0x3983, 0x3e78,
0x318f, 0x133c, 0xef3d, 0xce63, 0xbb6c, 0xbd2d, 0xd09f, 0xef0b,
0x1008, 0x2a17, 0x33c8, 0x2b89, 0x171a, 0xfffe, 0xea90, 0xdb09,
0xdac5, 0xe3e3, 0xf14f, 0x00c2, 0x06f6, 0x0745, 0x0472, 0x0051,
0xfc05, 0xfbab, 0x0219, 0x0afa, 0x11c3, 0x0e44, 0x0369, 0xf5ab,
0xe300, 0xd666, 0xd4f1, 0xe1ea, 0xfb40, 0x1731, 0x2f98, 0x382f,
0x305f, 0x1a12, 0xf8b3, 0xd865, 0xc1e0, 0xbdf5, 0xcd4d, 0xebe3,
0x12cb, 0x3170, 0x42a7, 0x3f2b, 0x2728, 0x0532, 0xe06c, 0xc7f0,
0xc162, 0xca52, 0xe198, 0xfdab, 0x1753, 0x27ef, 0x2a00, 0x1f89,
0x0abb, 0xf715, 0xeaf2, 0xe5f8, 0xe914, 0xf1de, 0xfc49, 0x00b1,
0xffe9, 0xfc42, 0xf585, 0xf42c, 0xfa97, 0x06e6, 0x125d, 0x17f6,
0x18eb, 0x0e4d, 0xfa50, 0xe479, 0xd30a, 0xcbf2, 0xd3df, 0xeac3,
0x091f, 0x28a6, 0x3c38, 0x3a92, 0x295c, 0x0931, 0xe374, 0xc593,
0xb65e, 0xbdc6, 0xd6e3, 0xfc6c, 0x20ad, 0x39c6, 0x425f, 0x34b2,
0x18b6, 0xf5ec, 0xd883, 0xc961, 0xc8b9, 0xd866, 0xf1bc, 0x0adc,
0x1c31, 0x1f60, 0x1afe, 0x0fb4, 0x00a6, 0xf49a, 0xef90, 0xf31b,
0xf98b, 0x0003, 0x00fa, 0xfd92, 0xf6bf, 0xf14f, 0xefa4, 0xf299,
0xff17, 0x10e5, 0x1e42, 0x231a, 0x1d53, 0x0b14, 0xf1da, 0xd921,
0xc8f2, 0xc779, 0xd8e7, 0xf68e, 0x18d7, 0x3414, 0x40cb, 0x38e7,
0x1dba, 0xf971, 0xd549, 0xbed6, 0xbbbc, 0xcbfa, 0xea3e, 0x0ba9,
0x281e, 0x3910, 0x37b6, 0x2557, 0x07ea, 0xea67, 0xd62d, 0xd05f,
0xd79f, 0xe91e, 0xff23, 0x113b, 0x19bd, 0x179b, 0x0d93, 0x03b3,
0xfc1e, 0xf8b8, 0xfbb0, 0x0129, 0x054a, 0x0278, 0xfb82, 0xf1ca,
0xe8db, 0xe4c1, 0xe847, 0xf5e4, 0x0a5d, 0x1eee, 0x2c53, 0x2a85,
0x1a1f, 0xff1f, 0xe1cb, 0xcb72, 0xc160, 0xca9e, 0xe40f, 0x0699,
0x288a, 0x3d05, 0x3fe6, 0x2e20, 0x0e5a, 0xeac5, 0xcc40, 0xbe90,
0xc418, 0xdb14, 0xf9ea, 0x1955, 0x2e26, 0x338d, 0x29fc, 0x13af,
0xf954, 0xe38d, 0xda94, 0xdcca, 0xe640, 0xf6bb, 0x05c8, 0x0d5d,
0x0d73, 0x0772, 0x008e, 0xfc2d, 0xfe6a, 0x0376, 0x09d1, 0x0d61,
0x08df, 0xff59, 0xf112, 0xe2c2, 0xdb89, 0xde04, 0xec1a, 0x0274,
0x1b66, 0x2f75, 0x353f, 0x2844, 0x0e17, 0xece4, 0xd008, 0xbf5f,
0xbeef, 0xd290, 0xf3d7, 0x1906, 0x34c2, 0x3fe5, 0x38aa, 0x1feb,
0xfd39, 0xdc5f, 0xc60d, 0xc0ea, 0xce65, 0xe88e, 0x0691, 0x1fd5,
0x2bfc, 0x2a3f, 0x1b99, 0x070e, 0xf2df, 0xe5e3, 0xe380, 0xe818,
0xf22e, 0xfc18, 0x0379, 0x042f, 0x011d, 0xfbc1, 0xf905, 0xfc86,
0x0528, 0x0f22, 0x14ff, 0x135e, 0x0820, 0xf78e, 0xe4ec, 0xd50c,
0xd099, 0xda57, 0xf223, 0x0f98, 0x2916, 0x3909, 0x3655, 0x22e2,
0x0271, 0xdeab, 0xc548, 0xbc8b, 0xc5cb, 0xdf39, 0x03b4, 0x2719,
0x3ca8, 0x4017, 0x2ed7, 0x11dd, 0xf0c5, 0xd625, 0xc7bd, 0xc9ca,
0xdba8, 0xf521, 0x0e7e, 0x1d13, 0x21de, 0x1b15, 0x0d4c, 0xfdb9,
0xf26c, 0xed7e, 0xef7b, 0xf5db, 0xfbae, 0xfdb5, 0xfb4b, 0xf62c,
0xf295, 0xf2e3, 0xf8b3, 0x0599, 0x1572, 0x1ffe, 0x20cb, 0x1638,
0x01cf, 0xea5e, 0xd4d0, 0xc97b, 0xcd21, 0xe02a, 0xfe60, 0x200f,
0x375c, 0x3e72, 0x325d, 0x1669, 0xf310, 0xd04f, 0xbc33, 0xbc08,
0xcf23, 0xef48, 0x1258, 0x2de6, 0x3a2d, 0x3450, 0x1fe7, 0x0299,
0xe6fb, 0xd49e, 0xd00b, 0xd99a, 0xeafd, 0x0116, 0x1108, 0x18b7,
0x150d, 0x0c5c, 0x03e2, 0xfbdb, 0xf8f8, 0xfa8c, 0xff72, 0x014c,
0x00e6, 0xfa31, 0xf0eb, 0xe842, 0xe531, 0xec8d, 0xfb8e, 0x0ff5,
0x2261, 0x2a4e, 0x24b8, 0x12fe, 0xf87b, 0xdc90, 0xc866, 0xc418,
0xd004, 0xebd8, 0x0da3, 0x2c45, 0x3ea8, 0x3c9c, 0x27c2, 0x06cd,
0xe387, 0xc919, 0xbe44, 0xc547, 0xde2e, 0xfe57, 0x1d3d, 0x3066,
0x327d, 0x2618, 0x1033, 0xf698, 0xe217, 0xd883, 0xda68, 0xe6f9,
0xf775, 0x0509, 0x0b6a, 0x0b1d, 0x0627, 0xffb5, 0xfc53, 0xfe20,
0x01c3, 0x0848, 0x0a0b, 0x0550, 0xfc35, 0xef0b, 0xe32d, 0xdc87,
0xe0a1, 0xeeac, 0x05e3, 0x1d9f, 0x2e76, 0x3044, 0x229a, 0x087e,
0xe7e9, 0xcd61, 0xbefb, 0xc2c4, 0xd7c1, 0xf835, 0x1aa7, 0x3504,
0x3e9d, 0x34ef, 0x1a7e, 0xf79d, 0xd847, 0xc462, 0xc2ae, 0xd2aa,
0xec9a, 0x0945, 0x202a, 0x2a8a, 0x2738, 0x17d5, 0x03f6, 0xf1bc,
0xe6f2, 0xe512, 0xeb3b, 0xf56c, 0xfebe, 0x03aa, 0x01e9, 0xfd38,
0xf980, 0xf969, 0xfe1b, 0x0691, 0x0f84, 0x15ff, 0x12b3, 0x06c4,
0xf463, 0xe0b4, 0xd44d, 0xd219, 0xddfb, 0xf5b9, 0x1122, 0x2a11,
0x370e, 0x3185, 0x1ab5, 0xfa68, 0xda81, 0xc463, 0xbdf8, 0xca7a,
0xe7a9, 0x09c4, 0x297f, 0x3b09, 0x3b0e, 0x29e3, 0x0c09, 0xeb46,
0xd223, 0xc8c2, 0xcf66, 0xe31f, 0xfb7c, 0x11fb, 0x2016, 0x214c,
0x18b1, 0x0b1f, 0xfcff, 0xf2db, 0xef0d, 0xf100, 0xf6bf, 0xfc48,
0xfd39, 0xfa2a, 0xf4d0, 0xf185, 0xf279, 0xf9d9, 0x05cb, 0x1430,
0x1dca, 0x1da3, 0x13ff, 0xff70, 0xe884, 0xd5b0, 0xccd3, 0xd1eb,
0xe5c6, 0x034a, 0x20ca, 0x35a3, 0x3a73, 0x2bd0, 0x0ebc, 0xed2e,
0xceb7, 0xbdf2, 0xc017, 0xd4af, 0xf45d, 0x150f, 0x2e17, 0x373a,
0x30eb, 0x1a1b, 0xfcac, 0xe2d4, 0xd219, 0xd010, 0xdb4e, 0xef58,
0x035c, 0x1310, 0x18f5, 0x15a1, 0x0c42, 0x0167, 0xfa49, 0xf6e2,
0xf93a, 0xfd17, 0xff3b, 0xfe92, 0xf8a0, 0xf0b9, 0xea00, 0xe9d8,
0xf23b, 0x0058, 0x126e, 0x21ec, 0x2616, 0x1ef8, 0x0c63, 0xf244,
0xd921, 0xc86f, 0xc7fd, 0xd68c, 0xf20f, 0x1276, 0x2e19, 0x3c38,
0x371c, 0x2198, 0x0079, 0xdedf, 0xc739, 0xbf7d, 0xcadc, 0xe360,
0x02a5, 0x1e99, 0x2f6f, 0x3012, 0x2234, 0x0cac, 0xf474, 0xe1da,
0xd9ed, 0xddb2, 0xeabb, 0xfaf1, 0x0840, 0x0ead, 0x0dfa, 0x0a0e,
0x0213, 0xfde4, 0xfe55, 0x016e, 0x05bd, 0x05c7, 0x02e5, 0xfa8e,
0xee8a, 0xe3f8, 0xe0ba, 0xe6ab, 0xf57f, 0x0aca, 0x1fb2, 0x2c8b,
0x2bc0, 0x1d0a, 0x02ce, 0xe4ad, 0xcd83, 0xc3a6, 0xca4a, 0xe124,
0x00f7, 0x2122, 0x370f, 0x3c70, 0x2fdd, 0x1408, 0xf224, 0xd587,
0xc4b8, 0xc64a, 0xd827, 0xf353, 0x0fdf, 0x237e, 0x2be3, 0x24e8,
0x1350, 0xfed2, 0xecc3, 0xe25a, 0xe21f, 0xe97a, 0xf63f, 0x0187,
0x066c, 0x05e8, 0x0180, 0xfd90, 0xfbf1, 0xfef7, 0x0500, 0x0ce9,
0x10d9, 0x0d09, 0x00e5, 0xf1d3, 0xe2ef, 0xd848, 0xd975, 0xe545,
0xfc0b, 0x1643, 0x2a2d, 0x3245, 0x2ac8, 0x1475, 0xf6bd, 0xd88a,
0xc4ba, 0xc2cb, 0xd1be, 0xedad, 0x0d5c, 0x287d, 0x3695, 0x333c,
0x20ba, 0x03ae, 0xe5e4, 0xd133, 0xca22, 0xd453, 0xe871, 0x0096,
0x1619, 0x2229, 0x2192, 0x1731, 0x0892, 0xf8a3, 0xeef3, 0xebff,
0xf077, 0xf789, 0xfe70, 0x01fa, 0xffa0, 0xfaee, 0xf5d8, 0xf486,
0xfa8a, 0x0464, 0x0f46, 0x17ea, 0x174f, 0x0e40, 0xfd2b, 0xe992,
0xd8a9, 0xd277, 0xd9f4, 0xed2f, 0x0899, 0x228f, 0x33aa, 0x34ef,
0x2516, 0x07f6, 0xe7d9, 0xcd2f, 0xc144, 0xc7bb, 0xde3b, 0xfd7f,
0x1c16, 0x31dd, 0x3734, 0x2be1, 0x1459, 0xf809, 0xdf0a, 0xd16f,
0xd179, 0xde3d, 0xf2d3, 0x07c0, 0x155d, 0x1949, 0x1533, 0x0a13,
0xfe46, 0xf6c0, 0xf3a2, 0xf6dd, 0xfc31, 0xffaa, 0xffe9, 0xfaff,
0xf496, 0xee4f, 0xed71, 0xf487, 0x016b, 0x1102, 0x1c60, 0x1fe5,
0x1859, 0x05fa, 0xef08, 0xda48, 0xcdfa, 0xd00d, 0xe104, 0xfbd2,
0x190c, 0x302e, 0x38d6, 0x2fc0, 0x176a, 0xf75c, 0xd954, 0xc51a,
0xc352, 0xd218, 0xeb82, 0x0a20, 0x233b, 0x30a4, 0x2da5, 0x1ce3,
0x05ad, 0xed42, 0xde16, 0xd964, 0xdf63, 0xee49, 0xfee2, 0x0bd2,
0x11a4, 0x0fcb, 0x08e4, 0x00fa, 0xfb87, 0xfade, 0xfed8, 0x041c,
0x05a3, 0x023b, 0xfb06, 0xf118, 0xe78c, 0xe432, 0xe861, 0xf6da,
0x0aa3, 0x1c84, 0x262b, 0x2334, 0x136d, 0xfbfb, 0xe290, 0xcea6,
0xc806, 0xd199, 0xe9b6, 0x0809, 0x2442, 0x35e1, 0x365a, 0x266f,
0x0aa9, 0xead3, 0xd285, 0xc778, 0xccf6, 0xdefe, 0xfa72, 0x14bb,
0x262b, 0x2abd, 0x21c9, 0x0f33, 0xf952, 0xe8ac, 0xe00b, 0xe200,
0xea01, 0xf60b, 0x0201, 0x06f0, 0x05e5, 0x01e6, 0xfd2c, 0xfc9b,
0xff43, 0x04bd, 0x0a43, 0x0c35, 0x08fa, 0xfe88, 0xf034, 0xe2f3,
0xdc64, 0xdf4c, 0xecf6, 0x01ce, 0x1897, 0x2a2b, 0x2e37, 0x2367,
0x0bdb, 0xef2e, 0xd53d, 0xc6af, 0xc8d4, 0xdae2, 0xf71f, 0x1638,
0x2e01, 0x3716, 0x2f3e, 0x1833, 0xfa9c, 0xdd9d, 0xcc6e, 0xca13,
0xd693, 0xede7, 0x0708, 0x1a74, 0x2362, 0x20fd, 0x1514, 0x0489,
0xf55a, 0xeb7d, 0xea1a, 0xef4d, 0xf620, 0xfd6b, 0x00cc, 0x007b,
0xfc4b, 0xf803, 0xf843, 0xfe38, 0x06c4, 0x102d, 0x14f7, 0x120e,
0x07e3, 0xf5cd, 0xe4c6, 0xd823, 0xd563, 0xe039, 0xf4e8, 0x0eeb,
0x252e, 0x30ce, 0x2d05, 0x1a2f, 0xfe14, 0xdfb5, 0xca55, 0xc39d,
0xce0b, 0xe6c9, 0x04ab, 0x1fb1, 0x30c2, 0x31fe, 0x242f, 0x0bc6,
0xeef6, 0xd909, 0xcf80, 0xd34a, 0xe40c, 0xf9f4, 0x0d99, 0x195a,
0x1af1, 0x14ae, 0x0831, 0xfc63, 0xf4d2, 0xf1bb, 0xf37e, 0xf82f,
0xfc8f, 0xfcd4, 0xf99e, 0xf45e, 0xf091, 0xf1a8, 0xf91c, 0x04d1,
0x126d, 0x1c73, 0x1ce1, 0x13cc, 0x011b, 0xea92, 0xd7ff, 0xcf18,
0xd4df, 0xe769, 0x01e5, 0x1de7, 0x3132, 0x3695, 0x2ab9, 0x116c,
0xf229, 0xd613, 0xc66f, 0xc7ea, 0xd921, 0xf3e0, 0x108d, 0x2630,
0x2fa2, 0x29a0, 0x1747, 0xfe9c, 0xe72c, 0xd9ae, 0xd7b2, 0xe0c6,
0xf1ef, 0x0323, 0x0f76, 0x144c, 0x10b0, 0x086e, 0x0068, 0xfa90,
0xf9fc, 0xfc77, 0xffad, 0x01a9, 0x0013, 0xf9a7, 0xf168, 0xead2,
0xe8e4, 0xf0b8, 0xfeea, 0x1023, 0x1fa0, 0x25ab, 0x1f8a, 0x0e51,
0xf538, 0xdd5d, 0xcd76, 0xca78, 0xd738, 0xf01f, 0x0e97, 0x285d,
0x365d, 0x3471, 0x2183, 0x04ae, 0xe528, 0xcee5, 0xc7d5, 0xd050,
0xe6a4, 0x0132, 0x19a8, 0x2897, 0x29c7, 0x1e09, 0x0a5a, 0xf4f4,
0xe4f6, 0xdef6, 0xe211, 0xed47, 0xfb7f, 0x0645, 0x0b3d, 0x0957,
0x03fa, 0xfecd, 0xfcaf, 0xfe51, 0x0210, 0x0721, 0x0828, 0x0448,
0xfaff, 0xef12, 0xe4a9, 0xe03b, 0xe4e2, 0xf3bf, 0x0894, 0x1c91,
0x2abd, 0x2a49, 0x1c14, 0x03ce, 0xe8c0, 0xd1c4, 0xc845, 0xcddd,
0xe160, 0xfeed, 0x1bb6, 0x3019, 0x3514, 0x2a6a, 0x12eb, 0xf545,
0xda66, 0xcc5c, 0xce35, 0xdd1f, 0xf460, 0x0bb4, 0x1ce2, 0x2450,
0x1ec6, 0x1134, 0x0063, 0xf161, 0xe951, 0xe8f7, 0xef1e, 0xf83d,
0xffc8, 0x02c2, 0x01f5, 0xfdc3, 0xf9e6, 0xfb4e, 0x0072, 0x0859,
0x103c, 0x12c7, 0x0ea1, 0x03b6, 0xf392, 0xe433, 0xdaab, 0xda7c,
0xe683, 0xfb21, 0x131c, 0x26ee, 0x2f94, 0x278a, 0x12e3, 0xf723,
0xdb98, 0xc959, 0xc755, 0xd469, 0xed39, 0x0c3f, 0x256c, 0x336a,
0x31ef, 0x215e, 0x0741, 0xebb5, 0xd7ae, 0xd0b1, 0xd691, 0xe867,
0xfdad, 0x1014, 0x1a24, 0x1b0a, 0x13c2, 0x0748, 0xfaf7, 0xf3a7,
0xf1e1, 0xf415, 0xfa6e, 0xfe72, 0xff6e, 0xfca7, 0xf78b, 0xf2db,
0xf37a, 0xfa87, 0x0693, 0x12dc, 0x1a32, 0x197f, 0x0ede, 0xfcda,
0xe94f, 0xd969, 0xd2e2, 0xdab9, 0xee26, 0x07ea, 0x20b3, 0x312f,
0x31a4, 0x2329, 0x097a, 0xeac3, 0xd1b1, 0xc55d, 0xcb5c, 0xdf2b,
0xfa5c, 0x1765, 0x2b40, 0x307b, 0x27d1, 0x1449, 0xfaaf, 0xe499,
0xd8cb, 0xd8c5, 0xe36f, 0xf44f, 0x0536, 0x107f, 0x1379, 0x0fd0,
0x082d, 0xffaf, 0xfa8f, 0xf925, 0xfbd6, 0xffe6, 0x0164, 0xfea5,
0xf98e, 0xf178, 0xebbf, 0xebc0, 0xf2c1, 0x011e, 0x1051, 0x1c91,
0x2090, 0x1a92, 0x08b7, 0xf160, 0xdcd5, 0xd042, 0xd05b, 0xdeb5,
0xf774, 0x12e1, 0x29e5, 0x3443, 0x2e17, 0x1978, 0xfc43, 0xe047,
0xcd34, 0xc8a7, 0xd4a5, 0xeb30, 0x0634, 0x1d4f, 0x2a2e, 0x28f0,
0x1b76, 0x06ff, 0xf1d6, 0xe37f, 0xdedb, 0xe3b6, 0xef14, 0xfd33,
0x07b9, 0x0bc3, 0x0a49, 0x05b2, 0x0102, 0xfe3b, 0xffec, 0x02e6,
0x068f, 0x0792, 0x0223, 0xf97b, 0xef0f, 0xe5b3, 0xe21e, 0xe861,
0xf6e9, 0x0a6b, 0x1bc0, 0x2628, 0x2533, 0x172f, 0xfffa, 0xe5c3,
0xd322, 0xcbd9, 0xd32b, 0xe7bd, 0x0397, 0x1e68, 0x2fc2, 0x32a0,
0x2537, 0x0c6c, 0xf040, 0xd90d, 0xccea, 0xd070, 0xe0aa, 0xf83c,
0x0fcf, 0x1fc1, 0x248e, 0x1d7d, 0x0e99, 0xfcf6, 0xee77, 0xe6ad,
0xe7ea, 0xef0c, 0xf816, 0x000e, 0x03c9, 0x02fe, 0xff51, 0xfcea,
0xfd38, 0x01c6, 0x0820, 0x0e28, 0x105e, 0x0ba9, 0x00b7, 0xf132,
0xe3ab, 0xdba0, 0xdd83, 0xea17, 0xfedc, 0x1579, 0x273e, 0x2d0c,
0x23e7, 0x0f80, 0xf464, 0xdbee, 0xcce7, 0xcc3a, 0xda47, 0xf418,
0x1005, 0x2688, 0x3039, 0x2b24, 0x1960, 0xfee9, 0xe66c, 0xd645,
0xd263, 0xdb14, 0xed96, 0x0262, 0x132d, 0x1abd, 0x1958, 0x1002,
0x02df, 0xf75b, 0xf0ee, 0xf055, 0xf41d, 0xfa17, 0xfee6, 0xffed,
0xfc99, 0xf6d7, 0xf3b2, 0xf5f9, 0xfc38, 0x0638, 0x0faf, 0x16a0,
0x144d, 0x098e, 0xf89e, 0xe6c8, 0xda4a, 0xd716, 0xdfd8, 0xf33d,
0x0ba0, 0x21af, 0x2e64, 0x2bf4, 0x1d20, 0x0352, 0xe7de, 0xd205,
0xca28, 0xd15f, 0xe602, 0x00ff, 0x19a5, 0x29c2, 0x2bbd, 0x21d1,
0x0cf7, 0xf53b, 0xe2f9, 0xda1e, 0xdca1, 0xe86a, 0xf937, 0x08ea,
0x1248, 0x141f, 0x0ea7, 0x05d9, 0xfcdb, 0xf780, 0xf72d, 0xfa9b,
0xfe2f, 0xfffe, 0xfdb1, 0xf846, 0xf2f3, 0xee5c, 0xef7a, 0xf7e4,
0x0493, 0x1240, 0x1c44, 0x1e20, 0x152d, 0x0377, 0xedb9, 0xdacd,
0xd0d8, 0xd3ed, 0xe523, 0xfd4c, 0x17b8, 0x2b1a, 0x3194, 0x2903,
0x12e1, 0xf75d, 0xdcfa, 0xcd8a, 0xcc11, 0xd8dd, 0xf084, 0x0a0c,
0x1f0f, 0x2885, 0x24d8, 0x1699, 0x0218, 0xee7c, 0xe2c0, 0xdfef,
0xe51c, 0xf13b, 0xfe8a, 0x084e, 0x0c9e, 0x0ae5, 0x05a7, 0x001d,
0xfdbc, 0xfe50, 0x004f, 0x03af, 0x03ed, 0xffb2, 0xf763, 0xee6e,
0xe6f4, 0xe666, 0xede9, 0xfbfb, 0x0db4, 0x1bd1, 0x23b3, 0x1f85,
0x103e, 0xf9d8, 0xe23e, 0xd1d1, 0xcded, 0xd789, 0xecc1, 0x082d,
0x20af, 0x2f60, 0x2fa3, 0x20f6, 0x0906, 0xed68, 0xd844, 0xcdbb,
0xd1ee, 0xe287, 0xf8f1, 0x0fe4, 0x1f27, 0x244b, 0x1b92, 0x0d7b,
0xfc66, 0xee23, 0xe695, 0xe747, 0xee19, 0xf796, 0x0061, 0x03da,
0x037a, 0x005b, 0xfe79, 0xfd26, 0x0035, 0x0572, 0x0abc, 0x0bcb,
0x070a, 0xfd61, 0xefd7, 0xe4ee, 0xdfaf, 0xe266, 0xefd4, 0x0408,
0x176a, 0x250c, 0x2787, 0x1cc4, 0x0804, 0xee25, 0xd7bf, 0xcc26,
0xcf21, 0xe01d, 0xf93d, 0x147c, 0x2883, 0x2f70, 0x27c8, 0x136c,
0xf9ae, 0xe26f, 0xd3c3, 0xd2e7, 0xdda0, 0xf0f4, 0x05d3, 0x15de,
0x1d3e, 0x1a13, 0x0f93, 0x01c6, 0xf6a4, 0xef84, 0xef1d, 0xf307,
0xf8f2, 0xfe1e, 0xff07, 0xfc46, 0xf8e4, 0xf70c, 0xf860, 0xfe9b,
0x07c8, 0x1129, 0x147c, 0x115d, 0x0656, 0xf5c6, 0xe648, 0xdb7d,
0xda49, 0xe413, 0xf7e3, 0x0efe, 0x2249, 0x2c40, 0x280d, 0x1634,
0xfcb8, 0xe259, 0xd04d, 0xcb87, 0xd5bc, 0xeb6d, 0x064d, 0x1f1c,
0x2c52, 0x2c4b, 0x1e99, 0x090d, 0xf174, 0xdf35, 0xd809, 0xdc58,
0xe987, 0xfb4f, 0x0b37, 0x13d9, 0x15d4, 0x0fad, 0x05e2, 0xfc40,
0xf6c1, 0xf54f, 0xf821, 0xfc3d, 0xfd30, 0xfd25, 0xf88e, 0xf352,
0xefb3, 0xf0ef, 0xf885, 0x03b0, 0x10ab, 0x189d, 0x1943, 0x106a,
0xff04, 0xeaf4, 0xdb6e, 0xd4a4, 0xda7c, 0xeb68, 0x0250, 0x1a76,
0x29a0, 0x2d47, 0x22a4, 0x0bd3, 0xf0c6, 0xd933, 0xcce5, 0xcf20,
0xdf89, 0xf736, 0x0fdb, 0x22ab, 0x29bc, 0x22ff, 0x129e, 0xfdb1,
0xeb20, 0xe07e, 0xde8f, 0xe618, 0xf385, 0x016d, 0x0ace, 0x0d45,
0x0b77, 0x058e, 0xffaa, 0xfc98, 0xfcc4, 0xfffa, 0x0236, 0x0319,
0xfe45, 0xf794, 0xefc3, 0xe9e3, 0xe97e, 0xf13e, 0xff20, 0x0dc7,
0x1c12, 0x21ac, 0x1ca9, 0x0cf4, 0xf747, 0xe207, 0xd478, 0xd2b2,
0xdea2, 0xf388, 0x0cc2, 0x2293, 0x2cc7, 0x2924, 0x18ed, 0x00c8,
0xe6ef, 0xd510, 0xcf8f, 0xd8ac, 0xeb63, 0x038c, 0x1644, 0x20f4,
0x222b, 0x1813, 0x0893, 0xf762, 0xea1e, 0xe4fd, 0xe906, 0xf12f,
0xfb88, 0x0307, 0x05b6, 0x0578, 0x02d1, 0xfefb, 0xfdb2, 0x00b3,
0x04be, 0x081d, 0x091a, 0x04f9, 0xfb23, 0xef06, 0xe55e, 0xe1fb,
0xe760, 0xf4b6, 0x07b8, 0x19ba, 0x2472, 0x24b9, 0x18c3, 0x03a5,
0xec46, 0xd88a, 0xd01d, 0xd581, 0xe6c1, 0xff9d, 0x177b, 0x280f,
0x2c12, 0x227b, 0x0ebc, 0xf69e, 0xe0c1, 0xd510, 0xd713, 0xe44f,
0xf72f, 0x0b6a, 0x184c, 0x1cce, 0x17b4, 0x0bdb, 0xfe28, 0xf252,
0xed17, 0xed62, 0xf356, 0xfb57, 0x0042, 0x0116, 0xfede, 0xfa73,
0xf9af, 0xfac6, 0x000e, 0x06f9, 0x0e2b, 0x11a1, 0x0cf5, 0x02d8,
0xf362, 0xe4a8, 0xdd30, 0xdeab, 0xea24, 0xfcc7, 0x11c1, 0x22c7,
0x2936, 0x2429, 0x1163, 0xf941, 0xe160, 0xd199, 0xd00e, 0xdb60,
0xf12d, 0x09c9, 0x1ee9, 0x29e9, 0x2744, 0x18f2, 0x0405, 0xed9a,
0xde09, 0xd9ce, 0xe057, 0xefba, 0x00ea, 0x0ecd, 0x15de, 0x1494,
0x0dd3, 0x035e, 0xf9e5, 0xf44a, 0xf422, 0xf7cd, 0xfbf3, 0xff43,
0xfe08, 0xfa3f, 0xf4e0, 0xf25f, 0xf411, 0xfaf4, 0x0576, 0x0f72,
0x166a, 0x154d, 0x0b51, 0xfac9, 0xe914, 0xdaff, 0xd706, 0xde3d,
0xeee1, 0x05d0, 0x1b2b, 0x288d, 0x2a2b, 0x1d64, 0x06aa, 0xec8f,
0xd865, 0xcf0b, 0xd4a2, 0xe638, 0xfcd7, 0x1302, 0x2263, 0x26ea,
0x1eaf, 0x0ef6, 0xfa32, 0xe980, 0xe107, 0xe198, 0xeaf3, 0xf8ad,
0x052d, 0x0d0d, 0x0e69, 0x0aa7, 0x04a5, 0xfd6e, 0xfa07, 0xf9b6,
0xfc28, 0x005e, 0x00c1, 0xfce0, 0xf734, 0xf03b, 0xebb0, 0xed15,
0xf497, 0x0043, 0x0e24, 0x1930, 0x1ce0, 0x15d5, 0x05be, 0xf1b5,
0xdeeb, 0xd4d7, 0xd693, 0xe3f4, 0xfa26, 0x12cc, 0x2579, 0x2c79,
0x25cf, 0x14a4, 0xfbfa, 0xe49a, 0xd607, 0xd2a3, 0xdcf9, 0xf118,
0x0639, 0x1800, 0x20f8, 0x1ea1, 0x146c, 0x038b, 0xf347, 0xe81f,
0xe559, 0xea67, 0xf460, 0xfeaf, 0x0521, 0x077f, 0x05d9, 0x0299,
0xffb1, 0xfe3f, 0x000f, 0x04bf, 0x07c4, 0x07e0, 0x0298, 0xf9fe,
0xefad, 0xe763, 0xe581, 0xeb69, 0xf943, 0x0ac2, 0x1a66, 0x21d9,
0x2023, 0x1320, 0xfdda, 0xe7cc, 0xd7a4, 0xd1d9, 0xd95f, 0xebdd,
0x0413, 0x1a78, 0x289a, 0x29b7, 0x1db0, 0x0967, 0xf0a1, 0xdd50,
0xd3e7, 0xd8af, 0xe6be, 0xfa1a, 0x0dcf, 0x18d7, 0x1c9e, 0x1617,
0x0941, 0xfb01, 0xefc5, 0xeb8b, 0xecda, 0xf28b, 0xf9ff, 0xff7c,
0x0104, 0xfe1d, 0xfa2f, 0xf8f0, 0xf97a, 0xff0d, 0x05ff, 0x0b66,
0x0d9a, 0x09ae, 0x001b, 0xf284, 0xe5c1, 0xdfd3, 0xe21c, 0xed56,
0x006a, 0x129d, 0x20bb, 0x24d1, 0x1c71, 0x0a3d, 0xf36a, 0xde40,
0xd261, 0xd337, 0xe0b3, 0xf6be, 0x0ebd, 0x21ce, 0x28d7, 0x2471,
0x1407, 0xfe29, 0xe8fc, 0xdbb2, 0xd998, 0xe1db, 0xf07b, 0x016b,
0x0ec6, 0x14e6, 0x141b, 0x0c45, 0x0275, 0xf926, 0xf439, 0xf413,
0xf814, 0xfbb6, 0xfedf, 0xff05, 0xfbaf, 0xf7da, 0xf462, 0xf78b,
0xfdc7, 0x0685, 0x1035, 0x14df, 0x1335, 0x087b, 0xf9de, 0xea6b,
0xdee0, 0xdc83, 0xe362, 0xf4ea, 0x09ec, 0x1cc0, 0x26bb, 0x2444,
0x16bb, 0x0094, 0xea1c, 0xd875, 0xd20b, 0xd941, 0xea41, 0x0119,
0x1634, 0x230d, 0x2533, 0x1c53, 0x0a2a, 0xf54c, 0xe61e, 0xdfb0,
0xe1da, 0xeba6, 0xfab0, 0x0722, 0x0ea0, 0x1005, 0x0b1a, 0x045d,
0xfd4b, 0xf98d, 0xf929, 0xfca5, 0xffd9, 0x0095, 0xfe23, 0xf900,
0xf333, 0xef9e, 0xf098, 0xf7dc, 0x03a0, 0x1059, 0x197f, 0x19f9,
0x12ab, 0x0321, 0xf071, 0xe0bb, 0xd8c1, 0xdb02, 0xe8e6, 0xfd9b,
0x13b6, 0x2476, 0x287a, 0x208e, 0x0f60, 0xf799, 0xe228, 0xd5bf,
0xd5f0, 0xe1c9, 0xf488, 0x0950, 0x197a, 0x20bb, 0x1d90, 0x10e7,
0xfefb, 0xf016, 0xe68a, 0xe4ee, 0xeab1, 0xf4be, 0xffe2, 0x0731,
0x0a00, 0x07ce, 0x0312, 0xff0b, 0xfd5c, 0xfe64, 0x01e7, 0x050d,
0x0402, 0x005e, 0xf8bd, 0xf03d, 0xea27, 0xe95e, 0xefe7, 0xfd4e,
0x0d2d, 0x19ea, 0x2066, 0x1c07, 0x0efb, 0xfb1c, 0xe673, 0xd93a,
0xd53c, 0xddd7, 0xefb9, 0x065e, 0x1b41, 0x2654, 0x25a7, 0x18a3,
0x0571, 0xeeba, 0xde41, 0xd822, 0xdd78, 0xeb98, 0xfedd, 0x1075,
0x1a2e, 0x1c16, 0x1420, 0x074f, 0xf946, 0xef21, 0xeaf4, 0xecfb,
0xf2e8, 0xfb0e, 0x012d, 0x0385, 0x029d, 0xff5e, 0xfd59, 0xfdb2,
0x0151, 0x0749, 0x0b99, 0x0b9a, 0x066f, 0xfd9c, 0xf18c, 0xe834,
0xe300, 0xe5ce, 0xf1c2, 0x01d4, 0x131b, 0x1f28, 0x20b6, 0x17b1,
0x05aa, 0xeffb, 0xde91, 0xd44d, 0xd82e, 0xe55c, 0xfa72, 0x1175,
0x2115, 0x265b, 0x1ff2, 0x0f34, 0xf979, 0xe6ac, 0xdc3e, 0xdb45,
0xe514, 0xf503, 0x056c, 0x11af, 0x16f0, 0x14ae, 0x0a93, 0x0061,
0xf64c, 0xf244, 0xf263, 0xf678, 0xfb50, 0xfea4, 0xffbd, 0xfce5,
0xf939, 0xf6fa, 0xf905, 0xfe05, 0x0631, 0x0d46, 0x11fa, 0x0f51,
0x0580, 0xf804, 0xea42, 0xe153, 0xe02a, 0xe904, 0xf9f6, 0x0d9c,
0x1dcc, 0x2511, 0x208d, 0x11a6, 0xfc25, 0xe644, 0xd6b1, 0xd2c3,
0xdb6a, 0xedaf, 0x0388, 0x1703, 0x22fa, 0x22b5, 0x17bb, 0x06a4,
0xf2e2, 0xe51f, 0xe039, 0xe349, 0xef30, 0xfc68, 0x08d7, 0x0f50,
0x0f89, 0x0b30, 0x0304, 0xfc5b, 0xf91b, 0xf90a, 0xfabc, 0xfe4c,
0xffe9, 0xfe31, 0xf9a3, 0xf519, 0xf1fe, 0xf3df, 0xfae2, 0x046b,
0x0df6, 0x1528, 0x14d8, 0x0ccc, 0xfdda, 0xed09, 0xe0e5, 0xdb52,
0xe0ec, 0xeefb, 0x0363, 0x16ec, 0x2502, 0x27a5, 0x1da7, 0x0b5e,
0xf406, 0xe006, 0xd6c1, 0xd8a7, 0xe4ee, 0xf891, 0x0c29, 0x1b2b,
0x1f60, 0x1a89, 0x0e09, 0xfd46, 0xee76, 0xe5a6, 0xe4e3, 0xeaa5,
0xf647, 0x00da, 0x076b, 0x0847, 0x058c, 0x0150, 0xfce0, 0xfb22,
0xfc8d, 0xfff8, 0x0293, 0x03db, 0xff83, 0xf8ed, 0xf152, 0xec63,
0xecff, 0xf35e, 0xfeaf, 0x0c61, 0x171f, 0x1ae1, 0x1687, 0x086b,
0xf651, 0xe467, 0xda65, 0xd973, 0xe32b, 0xf5cb, 0x0b9b, 0x1d72,
0x25bd, 0x22b0, 0x13e6, 0xff34, 0xead1, 0xdbce, 0xd773, 0xdf3a,
0xef96, 0x024b, 0x1255, 0x1b59, 0x1bcb, 0x138f, 0x055e, 0xf7b7,
0xeea2, 0xeb78, 0xec5e, 0xf2db, 0xfb36, 0x00f5, 0x020a, 0x014f,
0xfeea, 0xfd2c, 0xfd6b, 0x006d, 0x05c1, 0x08b9, 0x0939, 0x053d,
0xfcad, 0xf1b9, 0xe956, 0xe5dc, 0xe934, 0xf4d5, 0x0538, 0x1432,
0x1d7d, 0x1db1, 0x1335, 0x00e4, 0xed5a, 0xddc9, 0xd6fc, 0xdc38,
0xead3, 0xff74, 0x14b3, 0x22ae, 0x258d, 0x1c9e, 0x0b80, 0xf61d,
0xe450, 0xdb50, 0xdbd6, 0xe713, 0xf77a, 0x080b, 0x135a, 0x1834,
0x146c, 0x0b20, 0xffe0, 0xf635, 0xf250, 0xf247, 0xf511, 0xfa1f,
0xfe06, 0xfded, 0xfcf8, 0xf9a2, 0xf88c, 0xfa5d, 0xff93, 0x073d,
0x0d96, 0x1024, 0x0bdc, 0x028d, 0xf58e, 0xe960, 0xe25a, 0xe259,
0xebc3, 0xfc8c, 0x0ded, 0x1c77, 0x213e, 0x1bf4, 0x0d4d, 0xf93e,
0xe614, 0xd9d7, 0xd86d, 0xe1d8, 0xf3f9, 0x080c, 0x18d7, 0x20e6,
0x1ff3, 0x1352, 0x00ff, 0xef8c, 0xe331, 0xdfaa, 0xe3fe, 0xefd1,
0xfe2e, 0x0a3a, 0x0f22, 0x0f32, 0x0a24, 0x01a3, 0xfaee, 0xf6f3,
0xf775, 0xfa7c, 0xfd21, 0xfdff, 0xfd9c, 0xf9dc, 0xf593, 0xf370,
0xf606, 0xfd07, 0x058c, 0x0e9c, 0x13da, 0x1261, 0x094c, 0xfb12,
0xebfa, 0xe175, 0xddca, 0xe3b5, 0xf2c3, 0x0600, 0x175b, 0x22a6,
0x221c, 0x1723, 0x054d, 0xf080, 0xdfa2, 0xd764, 0xdbfe, 0xea60,
0xfd5f, 0x0fb8, 0x1c5d, 0x1f16, 0x1877, 0x0a5c, 0xfa05, 0xec6f,
0xe5a7, 0xe5ce, 0xecae, 0xf85c, 0x02d4, 0x095a, 0x0ae6, 0x07df,
0x0312, 0xff2a, 0xfb5f, 0xfb93, 0xff1f, 0x014f, 0x00b0, 0xfd08,
0xf7c1, 0xf150, 0xed4c, 0xee7c, 0xf5d4, 0x017f, 0x0d67, 0x1744,
0x1947, 0x1291, 0x04eb, 0xf2f7, 0xe398, 0xdb17, 0xdbf1, 0xe6fd,
0xf952, 0x0e02, 0x1e63, 0x24dc, 0x1fbe, 0x10ac, 0xfcee, 0xe9e8,
0xdcc1, 0xda62, 0xe30a, 0xf388, 0x0579, 0x1475, 0x1ac4, 0x1984,
0x10fc, 0x0234, 0xf549, 0xebb2, 0xe9aa, 0xecf8, 0xf494, 0xfdaf,
0x03ea, 0x05e4, 0x044d, 0x01eb, 0xff5b, 0xfe15, 0x000b, 0x03e3,
0x05a8, 0x05d6, 0x01a1, 0xf993, 0xf1c3, 0xeb3d, 0xe8f3, 0xedea,
0xf939, 0x084a, 0x15df, 0x1cca, 0x1b78, 0x1012, 0xfe22, 0xea82,
0xdcc3, 0xd8bb, 0xddf8, 0xee90, 0x0263, 0x15fe, 0x2172, 0x2276,
0x1988, 0x0710, 0xf392, 0xe30d, 0xdbeb, 0xde3c, 0xea21, 0xfac1,
0x0a71, 0x14a8, 0x17a7, 0x1246, 0x0838, 0xfd29, 0xf3f8, 0xeffc,
0xf0f5, 0xf600, 0xfb86, 0x0079, 0x0130, 0xffb0, 0xfc8a, 0xfa95,
0xfb9a, 0x0034, 0x0599, 0x0abf, 0x0c02, 0x07a3, 0xff0f, 0xf3bc,
0xe9ab, 0xe406, 0xe5d3, 0xeff2, 0x000c, 0x0fd5, 0x1c94, 0x1fb3,
0x19f6, 0x09d8, 0xf5d7, 0xe3a2, 0xd93f, 0xdad2, 0xe5d4, 0xf8be,
0x0c92, 0x1bfb, 0x225a, 0x1e96, 0x10dc, 0xfe7d, 0xed77, 0xe2b0,
0xe005, 0xe663, 0xf31b, 0x007e, 0x0ba1, 0x105e, 0x0ee3, 0x0924,
0x007e, 0xfa0c, 0xf65b, 0xf671, 0xf963, 0xfc4b, 0xfe81, 0xfdf7,
0xfaec, 0xf7b1, 0xf666, 0xf8a4, 0xfead, 0x063c, 0x0dd1, 0x11f2,
0x0f55, 0x06fc, 0xfa3c, 0xeca5, 0xe32f, 0xe1a6, 0xe8b8, 0xf7e8,
0x09b1, 0x1951, 0x211e, 0x1f45, 0x1334, 0x00b0, 0xed77, 0xddb3,
0xd910, 0xddf7, 0xed8d, 0x0081, 0x1220, 0x1d42, 0x1e8f, 0x1732,
0x079f, 0xf6fa, 0xea0f, 0xe489, 0xe62f, 0xeee0, 0xfaab, 0x04d6,
0x0b00, 0x0b71, 0x083a, 0x02a2, 0xfda8, 0xfabf, 0xfb11, 0xfd95,
0x0061, 0x00a5, 0xfdd6, 0xf972, 0xf3c8, 0xf04d, 0xf16e, 0xf834,
0x024a, 0x0e0b, 0x152f, 0x15ae, 0x0ee3, 0x01a2, 0xf10d, 0xe3bb,
0xdd73, 0xe076, 0xecb7, 0xff52, 0x120c, 0x1ece, 0x2375, 0x1be6,
0x0be3, 0xf760, 0xe5f4, 0xdb89, 0xdb81, 0xe58b, 0xf6c3, 0x080f,
0x1586, 0x1bf4, 0x1863, 0x0e37, 0xffbe, 0xf320, 0xeb1a, 0xe9f9,
0xee2a, 0xf6a4, 0xff63, 0x0491, 0x0625, 0x046c, 0x0141, 0xfdbb,
0xfd78, 0xff12, 0x0213, 0x04a5, 0x041b, 0x0068, 0xf946, 0xf138,
0xeba3, 0xeb77, 0xf0ff, 0xfc33, 0x0a0f, 0x161c, 0x1a8f, 0x1748,
0x0ba6, 0xfa39, 0xe9c5, 0xdd80, 0xdaf2, 0xe22f, 0xf246, 0x05bf,
0x16e3, 0x20dd, 0x1faa, 0x14bb, 0x01c5, 0xefaf, 0xe101, 0xdb8d,
0xe074, 0xed4d, 0xfe54, 0x0ca4, 0x16c7, 0x17cd, 0x1149, 0x05c6,
0xfa88, 0xf255, 0xef07, 0xf0b7, 0xf5d3, 0xfbd1, 0x00bc, 0x018c,
0x007e, 0xfe76, 0xfccd, 0xfe11, 0x0199, 0x06d1, 0x0b03, 0x0b3b,
0x0613, 0xfe04, 0xf28b, 0xe9cf, 0xe5b3, 0xe8b3, 0xf2e4, 0x01c6,
0x10de, 0x1bbf, 0x1d96, 0x14d8, 0x05b6, 0xf314, 0xe2df, 0xdb44,
0xde59, 0xea01, 0xfc80, 0x0f6d, 0x1d86, 0x212a, 0x1b9b, 0x0cfc,
0xfa7c, 0xeacf, 0xe189, 0xe15d, 0xe934, 0xf6ec, 0x04c3, 0x0f96,
0x1326, 0x10a4, 0x09a0, 0x0074, 0xf934, 0xf571, 0xf52d, 0xf841,
0xfb38, 0xfd34, 0xfd0d, 0xfae0, 0xf86f, 0xf6a5, 0xf946, 0xfeea,
0x061a, 0x0cdb, 0x0fcc, 0x0d18, 0x0498, 0xf7dc, 0xeb37, 0xe379,
0xe305, 0xeb75, 0xfa60, 0x0bd2, 0x19ed, 0x1f39, 0x1b2a, 0x0ea8,
0xfc68, 0xe9fc, 0xdde4, 0xdb0a, 0xe22c, 0xf1ae, 0x0501, 0x144b,
0x1dd6, 0x1da1, 0x1374, 0x0443, 0xf374, 0xe7db, 0xe3d3, 0xe70d,
0xf05d, 0xfc5b, 0x06fd, 0x0c97, 0x0cc0, 0x08c7, 0x0243, 0xfd70,
0xfa2a, 0xfaa7, 0xfd07, 0xffcd, 0xffd5, 0xfd40, 0xf962, 0xf479,
0xf2aa, 0xf4a2, 0xfb26, 0x0475, 0x0e26, 0x13ea, 0x133c, 0x0b92,
0xfe88, 0xeeea, 0xe2ea, 0xde25, 0xe2b3, 0xef52, 0x012a, 0x1376,
0x1ead, 0x201b, 0x17a9, 0x0765, 0xf474, 0xe425, 0xdb63, 0xdd7c,
0xe88e, 0xfa3e, 0x0be9, 0x1818, 0x1b75, 0x16bb, 0x0be4, 0xfcfb,
0xf0e7, 0xea0a, 0xea92, 0xef94, 0xf87c, 0x01f6, 0x06b4, 0x088b,
0x0619, 0x0211, 0xfe8a, 0xfd56, 0xfe10, 0x0095, 0x0205, 0x0201,
0xfead, 0xf827, 0xf250, 0xeda7, 0xeda4, 0xf407, 0xff55, 0x0bd0,
0x160c, 0x197a, 0x1407, 0x0713, 0xf740, 0xe730, 0xde43, 0xde00,
0xe6b5, 0xf6e1, 0x09b2, 0x19e8, 0x20f2, 0x1e09, 0x113d, 0x0070,
0xeddd, 0xe0f9, 0xde0a, 0xe3af, 0xf17f, 0x0128, 0x0e8f, 0x1626,
0x1534, 0x0e2d, 0x034c, 0xf780, 0xeff6, 0xecab, 0xefa7, 0xf634,
0xfcc6, 0x0179, 0x01e7, 0x011a, 0xff4f, 0xfd54, 0xfd80, 0x0096,
0x042b, 0x0750, 0x077a, 0x0381, 0xfb19, 0xf131, 0xeaba, 0xe8bb,
0xece7, 0xf7dd, 0x062b, 0x135a, 0x1b0b, 0x1a58, 0x10bf, 0x009b,
0xefb8, 0xe11c, 0xdb9c, 0xe033, 0xed29, 0xff78, 0x1137, 0x1cd2,
0x1ec4, 0x183c, 0x08cd, 0xf676, 0xe85c, 0xe0f9, 0xe1e9, 0xea3f,
0xf889, 0x057e, 0x0e9c, 0x12d8, 0x0f6b, 0x07b7, 0xfe87, 0xf73f,
0xf412, 0xf4c0, 0xf7f8, 0xfc09, 0xfdc2, 0xfdfb, 0xfc1b, 0xf96b,
0xf91c, 0xfb6b, 0xffac, 0x064a, 0x0b4d, 0x0cdb, 0x09b3, 0x0092,
0xf661, 0xeb70, 0xe528, 0xe6c7, 0xef74, 0xfdb5, 0x0d1d, 0x19c8,
0x1d9e, 0x184f, 0x0aa5, 0xf815, 0xe7cb, 0xdd28, 0xdc37, 0xe537,
0xf508, 0x07c3, 0x16ed, 0x1e31, 0x1cbd, 0x11d8, 0x0203, 0xf1d2,
0xe75b, 0xe417, 0xe81b, 0xf21b, 0xfe8d, 0x07fd, 0x0c1a, 0x0c3d,
0x07f1, 0x01f8, 0xfbd0, 0xf9b9, 0xf9f8, 0xfbd8, 0xfd30, 0xfe90,
0xfd3f, 0xf9c5, 0xf5dd, 0xf3ad, 0xf652, 0xfb9f, 0x0505, 0x0c7c,
0x10d5, 0x0fde, 0x081b, 0xfc13, 0xee5d, 0xe465, 0xe1f1, 0xe710,
0xf46a, 0x0584, 0x14d7, 0x1dba, 0x1d7a, 0x134b, 0x01ba, 0xf00a,
0xe1ee, 0xdba7, 0xdf06, 0xeb62, 0xfcdf, 0x0db2, 0x18c8, 0x1adb,
0x1497, 0x08cd, 0xfa9b, 0xef8a, 0xea3a, 0xeacf, 0xf062, 0xfa0c,
0x0217, 0x07ba, 0x08b1, 0x0668, 0x02a4, 0xfe99, 0xfd68, 0xfded,
0x00c3, 0x0122, 0x0139, 0xfd9c, 0xf7c5, 0xf27d, 0xeee9, 0xf045,
0xf620, 0x00d6, 0x0ba0, 0x12d8, 0x1593, 0x0fdf, 0x02ee, 0xf474,
0xe703, 0xdf42, 0xe098, 0xeb09, 0xfae9, 0x0c2b, 0x1a35, 0x1e81,
0x1a12, 0x0d28, 0xfae6, 0xeab2, 0xe048, 0xde94, 0xe5db, 0xf45e,
0x04fd, 0x1176, 0x171d, 0x1535, 0x0cf6, 0x016e, 0xf575, 0xeeca,
0xec7d, 0xeecf, 0xf5e4, 0xfcf6, 0x01b2, 0x03e2, 0x0259, 0xffb8,
0xfdf3, 0xfdf2, 0x0067, 0x03f6, 0x05db, 0x05ab, 0x01e4, 0xfa2e,
0xf1e0, 0xec2f, 0xeb83, 0xefd6, 0xfb57, 0x07d5, 0x1443, 0x1a47,
0x185c, 0x0e03, 0xfe7b, 0xee48, 0xe236, 0xdfb7, 0xe418, 0xf2b5,
0x0450, 0x1474, 0x1de8, 0x1da5, 0x14dc, 0x04eb, 0xf393, 0xe658,
0xe0d0, 0xe372, 0xee26, 0xfcf3, 0x0a2e, 0x1220, 0x13f7, 0x1057,
0x0795, 0xfd31, 0xf5bb, 0xf2c4, 0xf35d, 0xf743, 0xfb87, 0xfe69,
0xfe82, 0xfd40, 0xfb00, 0xfa1d, 0xfd02, 0x0137, 0x05b7, 0x0a61,
0x0b80, 0x0681, 0xfe79, 0xf3f5, 0xeb29, 0xe653, 0xe867, 0xf231,
0x0076, 0x0e87, 0x1861, 0x1b60, 0x1484, 0x0720, 0xf5cd, 0xe667,
0xdefb, 0xdecc, 0xe988, 0xf9d6, 0x0b47, 0x1928, 0x1dcb, 0x1a35,
0x0dd4, 0xfde5, 0xeeec, 0xe619, 0xe48e, 0xea5f, 0xf689, 0x01e5,
0x0aa2, 0x0eba, 0x0d78, 0x0896, 0x00f5, 0xfadf, 0xf782, 0xf7c1,
0xf9ea, 0xfca3, 0xfda4, 0xfcb3, 0xfa11, 0xf6b7, 0xf5df, 0xf845,
0xfeee, 0x06d2, 0x0ddc, 0x105c, 0x0e19, 0x05b7, 0xf9f1, 0xed27,
0xe50f, 0xe3f2, 0xe9f5, 0xf892, 0x0849, 0x16ec, 0x1d93, 0x1b62,
0x0ffc, 0xff45, 0xedd6, 0xe0bd, 0xdce4, 0xe280, 0xef48, 0xffe8,
0x0f95, 0x186c, 0x19fe, 0x11ca, 0x052b, 0xf6eb, 0xec4a, 0xe84e,
0xea49, 0xf1e1, 0xfc08, 0x04ae, 0x09ba, 0x0a0a, 0x060b, 0x01f4,
0xfdd2, 0xfb1b, 0xfb7e, 0xfe9b, 0xffce, 0xff7f, 0xfd0d, 0xf839,
0xf469, 0xf1a7, 0xf3ac, 0xf9ea, 0x03e5, 0x0d9f, 0x134b, 0x1426,
0x0d26, 0x00dc, 0xf1dc, 0xe551, 0xdfee, 0xe2a7, 0xede3, 0xfe61,
0x0f25, 0x1bda, 0x1ecf, 0x17e3, 0x0a0f, 0xf8bf, 0xe8fe, 0xe092,
0xe01c, 0xe831, 0xf775, 0x06db, 0x123d, 0x16ae, 0x1378, 0x0ae4,
0xfed5, 0xf353, 0xed2e, 0xec2b, 0xf0dd, 0xf841, 0xff32, 0x0379,
0x0572, 0x0303, 0x0096, 0xfdad, 0xfca4, 0xff40, 0x0138, 0x03f9,
0x0348, 0xff83, 0xf951, 0xf299, 0xed4d, 0xedaa, 0xf323, 0xfd5b,
0x09fa, 0x1372, 0x17c2, 0x1486, 0x09ab, 0xfae7, 0xeba5, 0xe1a7,
0xdff0, 0xe71e, 0xf56c, 0x06a5, 0x154d, 0x1da8, 0x1cd0, 0x11e1,
0x01ad, 0xf051, 0xe4ab, 0xe040, 0xe478, 0xefc2, 0xfe51, 0x0aef,
0x11f9, 0x135e, 0x0d54, 0x03e3, 0xfab5, 0xf361, 0xf199, 0xf353,
0xf7ec, 0xfd36, 0x005f, 0x0125, 0xff4c, 0xfc19, 0xfad9, 0xfc64,
0x0093, 0x054f, 0x0848, 0x08b8, 0x04ca, 0xfd56, 0xf3c1, 0xecd0,
0xe924, 0xec90, 0xf6d6, 0x0346, 0x1054, 0x1892, 0x18af, 0x10aa,
0x0215, 0xf272, 0xe423, 0xddcc, 0xe12b, 0xeb86, 0xfcf2, 0x0dd3,
0x198b, 0x1d5e, 0x179f, 0x0b1b, 0xfb88, 0xecaa, 0xe4f6, 0xe44a,
0xeb52, 0xf7ef, 0x0336, 0x0c33, 0x0ff6, 0x0ddb, 0x07ce, 0xfff2,
0xfa00, 0xf68a, 0xf750, 0xfa59, 0xfcda, 0xfe42, 0xfdcb, 0xfb6d,
0xf7ef, 0xf751, 0xf986, 0xfe8a, 0x0505, 0x0b23, 0x0d34, 0x0b00,
0x02ae, 0xf7cb, 0xee09, 0xe68e, 0xe6e7, 0xee04, 0xfb1b, 0x0a2b,
0x1674, 0x1b10, 0x1785, 0x0abf, 0xfae8, 0xeaad, 0xe058, 0xdec8,
0xe591, 0xf432, 0x03b0, 0x1303, 0x1a33, 0x1923, 0x1014, 0x0287,
0xf471, 0xeb48, 0xe7e7, 0xe9ef, 0xf298, 0xfcf9, 0x0531, 0x0918,
0x094c, 0x056a, 0x00f9, 0xfc3f, 0xfa2f, 0xfb4d, 0xfd42, 0xff62,
0xff65, 0xfcb4, 0xf92d, 0xf502, 0xf2ed, 0xf4f8, 0xfaf5, 0x03e1,
0x0b79, 0x1197, 0x1070, 0x0982, 0xfe8f, 0xf08b, 0xe75e, 0xe3d0,
0xe6bc, 0xf229, 0x01fa, 0x1120, 0x1a05, 0x1b61, 0x1403, 0x04be,
0xf458, 0xe6e6, 0xe03b, 0xe225, 0xec2f, 0xfaa0, 0x0a0a, 0x1378,
0x1740, 0x1331, 0x0879, 0xfbe0, 0xf165, 0xec59, 0xec73, 0xf13e,
0xf83f, 0x00a4, 0x04af, 0x0570, 0x040f, 0x00b3, 0xfdc5, 0xfd7d,
0xff98, 0x0134, 0x0243, 0x01a2, 0xfdba, 0xf824, 0xf178, 0xeefa,
0xef69, 0xf4f9, 0xffb4, 0x09db, 0x1210, 0x140a, 0x100b, 0x05d6,
0xf7a4, 0xeac8, 0xe320, 0xe2e2, 0xeb26, 0xf960, 0x09d4, 0x1630,
0x1bef, 0x18a3, 0x0d34, 0xfd9e, 0xef04, 0xe53a, 0xe2ae, 0xe8e3,
0xf4c0, 0x0211, 0x0d2e, 0x1335, 0x11ef, 0x0bc4, 0x01fa, 0xf824,
0xf1cf, 0xefb8, 0xf201, 0xf70c, 0xfca0, 0xffe0, 0x00cb, 0xff75,
0xfd67, 0xfcfd, 0xfdbc, 0x00be, 0x047f, 0x075f, 0x06da, 0x02fc,
0xfb10, 0xf279, 0xecd1, 0xeb14, 0xeeeb, 0xf8bd, 0x0572, 0x103a,
0x169b, 0x155e, 0x0d96, 0x0009, 0xf176, 0xe56b, 0xe0e7, 0xe51b,
0xf0ad, 0x006b, 0x0ee1, 0x1914, 0x1928, 0x12e5, 0x059d, 0xf6ac,
0xeb3c, 0xe509, 0xe71e, 0xee76, 0xfb02, 0x0583, 0x0d0a, 0x0f23,
0x0c1a, 0x05dd, 0xfdbe, 0xf7ad, 0xf560, 0xf6a6, 0xf972, 0xfd32,
0xff06, 0xff31, 0xfcc0, 0xfa6b, 0xf9c0, 0xfb72, 0xffb6, 0x0503,
0x0a34, 0x0b48, 0x082d, 0x00af, 0xf640, 0xed9e, 0xe8c7, 0xe985,
0xf202, 0xfeca, 0x0be8, 0x15d3, 0x196a, 0x1451, 0x07a0, 0xf8d9,
0xeb1e, 0xe25f, 0xe172, 0xe962, 0xf6cd, 0x062e, 0x126b, 0x17d5,
0x152d, 0x0ba4, 0xfed5, 0xf1fe, 0xea7c, 0xe8a1, 0xec93, 0xf4ed,
0xffa4, 0x07a7, 0x0b0f, 0x092b, 0x0469, 0xfff9, 0xfb57, 0xf9d6,
0xfac7, 0xfd4c, 0xff5c, 0x000f, 0xfde8, 0xfb10, 0xf749, 0xf629,
0xf926, 0xfe5f, 0x0635, 0x0c3c, 0x0fb9, 0x0d78, 0x05e0, 0xfb02,
0xf003, 0xe774, 0xe53b, 0xeac3, 0xf709, 0x05e5, 0x1303, 0x1a29,
0x1929, 0x106e, 0x01ad, 0xf2c0, 0xe6d3, 0xe205, 0xe4d3, 0xf086,
0xfe58, 0x0aa8, 0x13f0, 0x1530, 0x0fa8, 0x0573, 0xfa5d, 0xf1e6,
0xedec, 0xef8c, 0xf514, 0xfd0f, 0x0376, 0x05f8, 0x05c5, 0x0396,
0xfff7, 0xfd0c, 0xfc9c, 0xfd61, 0x004f, 0x0145, 0x0171, 0xfe8b,
0xf95f, 0xf501, 0xf26d, 0xf33b, 0xf904, 0x01fd, 0x0a04, 0x1122,
0x1187, 0x0c72, 0x022e, 0xf426, 0xe989, 0xe3e4, 0xe5e2, 0xee6c,
0xfb97, 0x0a7c, 0x15a4, 0x1a13, 0x1588, 0x09e2, 0xfb86, 0xeecd,
0xe6a1, 0xe5d4, 0xebd6, 0xf793, 0x0448, 0x0ddb, 0x1255, 0x110f,
0x098c, 0x0042, 0xf7cd, 0xf311, 0xf27d, 0xf522, 0xf9df, 0xfea8,
0x01e1, 0x0190, 0x0063, 0xfdc9, 0xfc84, 0xfd14, 0xffc1, 0x02f8,
0x04c9, 0x0454, 0x00ec, 0xfa0a, 0xf3e4, 0xeec4, 0xee55, 0xf2b0,
0xfb6f, 0x0690, 0x0fd8, 0x144c, 0x11c6, 0x091f, 0xfbde, 0xef30,
0xe634, 0xe479, 0xe8f9, 0xf4f4, 0x0353, 0x107e, 0x181d, 0x17d9,
0x0f3e, 0x01e3, 0xf491, 0xe9ff, 0xe57e, 0xe853, 0xf184, 0xfd13,
0x0695, 0x0d12, 0x0eb1, 0x0a74, 0x0408, 0xfc5e, 0xf7cb, 0xf5fd,
0xf820, 0xfa6b, 0xfd27, 0xffbc, 0xfebf, 0xfced, 0xfab6, 0xf9fd,
0xfb92, 0x0006, 0x053a, 0x0902, 0x096c, 0x05d5, 0xfee8, 0xf619,
0xee8f, 0xec21, 0xed50, 0xf554, 0x00f5, 0x0bfd, 0x145a, 0x15eb,
0x0fb9, 0x0408, 0xf73d, 0xea67, 0xe468, 0xe569, 0xeecd, 0xfbde,
0x0938, 0x131c, 0x1757, 0x138c, 0x08c4, 0xfc7b, 0xf07e, 0xeade,
0xe925, 0xee28, 0xf707, 0x00e2, 0x077e, 0x0a61, 0x092e, 0x0439,
0xff53, 0xfa47, 0xf93f, 0xf9a6, 0xfc4f, 0xfde2, 0xfe75, 0xfd26,
0xfa3b, 0xf7aa, 0xf5ec, 0xf810, 0xfca8, 0x03cf, 0x0920, 0x0bc4,
0x0aa1, 0x03bd, 0xfa11, 0xf103, 0xea53, 0xe89f, 0xee8c, 0xf984,
0x0602, 0x1149, 0x16de, 0x1579, 0x0c02, 0xfe62, 0xf15a, 0xe778,
0xe3fe, 0xe969, 0xf42e, 0x013a, 0x0dc9, 0x1343, 0x1377, 0x0c4a,
0x0221, 0xf811, 0xef2a, 0xec13, 0xee72, 0xf452, 0xfc24, 0x02ed,
0x0547, 0x04f6, 0x0285, 0xffa0, 0xfcbd, 0xfbb3, 0xfd91, 0xffcf,
0x00bc, 0x007b, 0xfe23, 0xf8ea, 0xf410, 0xf2c7, 0xf4c5, 0xfabe,
0x022d, 0x0a05, 0x0f87, 0x0f74, 0x0a30, 0xff23, 0xf3aa, 0xea2c,
0xe615, 0xe91a, 0xf214, 0xff10, 0x0bec, 0x1494, 0x16f1, 0x1188,
0x0613, 0xf88d, 0xed27, 0xe61c, 0xe727, 0xeeac, 0xfa68, 0x0656,
0x0e8e, 0x121c, 0x0e36, 0x0729, 0xfd39, 0xf586, 0xf0c4, 0xf0ff,
0xf55b, 0xfa9f, 0xff8f, 0x02c8, 0x037c, 0x00e5, 0xff31, 0xfd8a,
0xfea1, 0x008a, 0x021b, 0x0407, 0x0377, 0xffe5, 0xf9ac, 0xf3f4,
0xefcd, 0xf068, 0xf582, 0xfe0b, 0x0801, 0x0fb0, 0x133e, 0x1093,
0x07a5, 0xfabc, 0xef76, 0xe71e, 0xe577, 0xec36, 0xf75d, 0x04ca,
0x0f93, 0x15a6, 0x1412, 0x0aa9, 0xff09, 0xf218, 0xea12, 0xe7b8,
0xebe1, 0xf4f5, 0x0094, 0x09f1, 0x0eb1, 0x0e5a, 0x08d2, 0x0206,
0xfa92, 0xf5d7, 0xf3b1, 0xf6ba, 0xfa6e, 0xfdfb, 0x005d, 0x00ee,
0xff04, 0xfd9a, 0xfd4b, 0xfe14, 0x01d5, 0x0589, 0x0833, 0x077e,
0x038c, 0xfd44, 0xf64c, 0xee7b, 0xec48, 0xef45, 0xf713, 0x0323,
0x0d26, 0x135a, 0x13c5, 0x0db9, 0x0298, 0xf5b0, 0xea9a, 0xe508,
0xe80e, 0xf1a1, 0xfe4f, 0x0b2d, 0x141a, 0x15ae, 0x0f81, 0x0555,
0xf9f2, 0xeff1, 0xea4e, 0xeac0, 0xf0e5, 0xfa86, 0x031f, 0x0843,
0x0a4a, 0x085d, 0x0411, 0xfdc3, 0xf9ca, 0xf953, 0xf96c, 0xfbbc,
0xfdfb, 0xffcb, 0xfe9b, 0xfb77, 0xf98b, 0xf90f, 0xfa53, 0xff8a,
0x04d2, 0x090f, 0x0b34, 0x07e7, 0x01f7, 0xf7cd, 0xef2a, 0xea17,
0xea85, 0xf182, 0xfcfc, 0x091b, 0x12cb, 0x15fc, 0x11e8, 0x089b,
0xfc00, 0xf030, 0xe79c, 0xe5ec, 0xec06, 0xf7fd, 0x04b2, 0x0f22,
0x13dd, 0x12d6, 0x0ba0, 0x018d, 0xf75b, 0xf076, 0xeebe, 0xf093,
0xf73b, 0xff86, 0x04b6, 0x065c, 0x0618, 0x02d2, 0xfed0, 0xfc0a,
0xfa9f, 0xfc3a, 0xfe86, 0x0057, 0xffd7, 0xfd68, 0xfa5f, 0xf706,
0xf5de, 0xf75c, 0xfc5b, 0x02fc, 0x0906, 0x0d35, 0x0bb5, 0x0579,
0xfd49, 0xf25d, 0xeafc, 0xe7f5, 0xec4e, 0xf633, 0x02c6, 0x0e0a,
0x14dc, 0x163c, 0x0ee0, 0x0382, 0xf610, 0xebca, 0xe64d, 0xe87a,
0xf0f4, 0xfcee, 0x07d6, 0x0e81, 0x10ad, 0x0d6e, 0x0582, 0xfbfe,
0xf50a, 0xf17d, 0xf2aa, 0xf68c, 0xfc48, 0x0195, 0x0458, 0x03fd,
0x01ee, 0xff57, 0xfd5b, 0xfd53, 0xff55, 0x0160, 0x0208, 0x01da,
0xfefb, 0xf956, 0xf475, 0xf23a, 0xf298, 0xf797, 0xffa1, 0x0845,
0x0e54, 0x1081, 0x0cb7, 0x0304, 0xf822, 0xed8c, 0xe82e, 0xe87e,
0xefc2, 0xfbc2, 0x0804, 0x11cb, 0x15fc, 0x11f2, 0x0897, 0xfd03,
0xf0ee, 0xea24, 0xe88e, 0xee9c, 0xf80e, 0x02ee, 0x0ad2, 0x0e5d,
0x0d7a, 0x077d, 0x006b, 0xf95b, 0xf49a, 0xf409, 0xf6bd, 0xfa2c,
0xfdd7, 0x000d, 0x0029, 0xfe1d, 0xfc73, 0xfba3, 0xfdb8, 0x00f2,
0x042e, 0x062b, 0x0562, 0x0260, 0xfc37, 0xf5d0, 0xf10b, 0xef8b,
0xf2fe, 0xfb25, 0x04c7, 0x0d8b, 0x1339, 0x10f0, 0x09f3, 0xff69,
0xf34f, 0xeafa, 0xe7f7, 0xec30, 0xf57f, 0x01ee, 0x0d0f, 0x133f,
0x13b6, 0x0dfb, 0x0376, 0xf834, 0xef48, 0xea75, 0xec4f, 0xf26f,
0xfbc6, 0x0430, 0x094a, 0x0b37, 0x07b3, 0x0359, 0xfe21, 0xfa44,
0xf92a, 0xfa74, 0xfc1b, 0xfe60, 0xff35, 0xfd98, 0xfbd3, 0xf9a5,
0xf96b, 0xfaf1, 0xff98, 0x0455, 0x082c, 0x0985, 0x0733, 0x002f,
0xf816, 0xf0eb, 0xecaf, 0xee50, 0xf49d, 0xff4f, 0x0927, 0x10bf,
0x128b, 0x0da8, 0x051e, 0xf932, 0xeea0, 0xe8c5, 0xe8a6, 0xef81,
0xfa76, 0x060c, 0x0ede, 0x134a, 0x10d0, 0x08de, 0xfe06, 0xf562,
0xefcd, 0xee07, 0xf23b, 0xf8ac, 0x00b5, 0x04db, 0x06ff, 0x063e,
0x0319, 0xff93, 0xfb59, 0xfb05, 0xfc7b, 0xfe1f, 0xffea, 0xff77,
0xfcf9, 0xf9e2, 0xf6f9, 0xf61c, 0xf81e, 0xfd65, 0x0380, 0x08cc,
0x0c3b, 0x0ab3, 0x0482, 0xfc33, 0xf2b3, 0xec36, 0xeb2b, 0xef02,
0xf8ea, 0x0382, 0x0d62, 0x12eb, 0x1211, 0x0ae8, 0xff73, 0xf44c,
0xeb8e, 0xe8e6, 0xec50, 0xf4ec, 0xff9f, 0x09cb, 0x0f25, 0x0f61,
0x0a46, 0x0287, 0xfa0a, 0xf313, 0xf0ec, 0xf265, 0xf6d3, 0xfcf1,
0x01ad, 0x048f, 0x042f, 0x0247, 0xffb0, 0xfe1f, 0xfe04, 0xfe8b,
0x00ae, 0x0119, 0x0069, 0xfcc7, 0xf8f6, 0xf4e2, 0xf312, 0xf4bb,
0xfa17, 0x01ea, 0x095f, 0x0e68, 0x0eb0, 0x0a1f, 0x01e2, 0xf76c,
0xee08, 0xea95, 0xebc0, 0xf271, 0xfd42, 0x0891, 0x10b7, 0x12fe,
0x0f0f, 0x05fb, 0xfa4b, 0xf024, 0xeb38, 0xebbb, 0xf0c6, 0xfa65,
0x041f, 0x0ad3, 0x0d06, 0x0ba3, 0x059b, 0xfe5e, 0xf881, 0xf465,
0xf4ea, 0xf716, 0xfc0f, 0x0005, 0x0172, 0x0168, 0x000d, 0xfe58,
0xfd7c, 0xff24, 0x0117, 0x0370, 0x049e, 0x036c, 0x0082, 0xfa91,
0xf4d6, 0xf0b3, 0xf00b, 0xf400, 0xfc05, 0x0542, 0x0c71, 0x1008,
0x0dad, 0x0687, 0xfc3d, 0xf241, 0xeabd, 0xe8fb, 0xedf3, 0xf773,
0x0218, 0x0c83, 0x1276, 0x11a8, 0x0b57, 0x0152, 0xf714, 0xeeca,
0xec1c, 0xeef8, 0xf5ec, 0xfed5, 0x05ef, 0x09a9, 0x09b2, 0x05e0,
0x0123, 0xfb87, 0xf7a4, 0xf702, 0xf882, 0xfb90, 0xfddc, 0xfe40,
0xfdf7, 0xfc9b, 0xfa8c, 0xfae7, 0xfc6b, 0x003f, 0x04a6, 0x073e,
0x073d, 0x0432, 0xfe4f, 0xf726, 0xf122, 0xef25, 0xf0da, 0xf7ee,
0x0119, 0x0928, 0x1044, 0x10cf, 0x0bf5, 0x01e3, 0xf6b4, 0xedbf,
0xe8d2, 0xea1d, 0xf1e7, 0xfc5e, 0x06c8, 0x0eed, 0x1172, 0x0dc4,
0x06b4, 0xfcdd, 0xf406, 0xef65, 0xef55, 0xf43b, 0xfb45, 0x01f3,
0x05ef, 0x0827, 0x0629, 0x02ec, 0xfef0, 0xfb5b, 0xf9fd, 0xfb7b,
0xfd63, 0xff8f, 0x001b, 0xfe2e, 0xfb3c, 0xf909, 0xf8ef, 0xfa8b,
0xfeda, 0x02ed, 0x0783, 0x08b5, 0x06d8, 0x01b7, 0xf9fe, 0xf237,
0xed76, 0xee3d, 0xf32b, 0xfc4d, 0x0649, 0x0e97, 0x12ff, 0x1020,
0x0883, 0xfdac, 0xf2de, 0xec11, 0xea7a, 0xeea3, 0xf751, 0x01a7,
0x09fa, 0x0f39, 0x0ebd, 0x08e8, 0x0166, 0xf9c9, 0xf382, 0xf21e,
0xf3ff, 0xf88c, 0xfe78, 0x0289, 0x0488, 0x036b, 0x0179, 0xfe7f,
0xfcfd, 0xfd09, 0xfe06, 0x0074, 0x0116, 0x00b7, 0xfdd8, 0xf98e,
0xf686, 0xf5c2, 0xf74d, 0xfc06, 0x01d5, 0x07d7, 0x0bf0, 0x0b88,
0x06e9, 0xfeb5, 0xf5be, 0xee9b, 0xeb74, 0xee3d, 0xf5d6, 0x00c3,
0x0a6f, 0x1117, 0x1275, 0x0c64, 0x0340, 0xf83c, 0xeffe, 0xeb45,
0xebcc, 0xf1f1, 0xfbcc, 0x049b, 0x0a8b, 0x0c51, 0x0a07, 0x0466,
0xfd52, 0xf79f, 0xf41d, 0xf421, 0xf758, 0xfc04, 0xff33, 0x0111,
0x00bb, 0x000f, 0xfe1e, 0xfd56, 0xfe02, 0x0064, 0x02f5, 0x0427,
0x0349, 0xffea, 0xfb7f, 0xf567, 0xf31e, 0xf2f3, 0xf6d1, 0xfde3,
0x05cb, 0x0c50, 0x0de6, 0x0b76, 0x0486, 0xfa17, 0xf118, 0xec50,
0xebf7, 0xf182, 0xfa39, 0x058c, 0x0d36, 0x11a5, 0x0f06, 0x07ad,
0xfea6, 0xf498, 0xedff, 0xec79, 0xf098, 0xf78c, 0x00d9, 0x07a6,
0x0a9a, 0x099d, 0x060a, 0x0069, 0xfb80, 0xf7f9, 0xf725, 0xf8da,
0xfc14, 0xfddf, 0xff7e, 0xfe69, 0xfc84, 0xfb21, 0xfb59, 0xfdc8,
0x000a, 0x0444, 0x0621, 0x0620, 0x032b, 0xfdbc, 0xf6cb, 0xf252,
0xf091, 0xf307, 0xf9d5, 0x0245, 0x0a3b, 0x0edf, 0x0e53, 0x08a4,
0xff57, 0xf62b, 0xee8e, 0xeb62, 0xee60, 0xf5f7, 0xff8b, 0x08b7,
0x0f69, 0x0f50, 0x0ab7, 0x02cc, 0xf9a8, 0xf2bf, 0xef55, 0xf01d,
0xf584, 0xfbd9, 0x0309, 0x06d5, 0x07ee, 0x059a, 0x01d3, 0xfe11,
0xfb2b, 0xfae9, 0xfb5b, 0xfd70, 0xfebb, 0xff42, 0xfdbe, 0xfb45,
0xf968, 0xf9a2, 0xfb63, 0x0032, 0x04d8, 0x0878, 0x0970, 0x0753,
0x01a8, 0xf97e, 0xf2e4, 0xeed4, 0xef0c, 0xf49a, 0xfd2c, 0x05e6,
0x0d6a, 0x0f5f, 0x0c0b, 0x040f, 0xfa4a, 0xf0ce, 0xeb83, 0xec07,
0xf164, 0xfaaa, 0x03ff, 0x0afc, 0x0e7d, 0x0cd9, 0x0669, 0xfead,
0xf750, 0xf2e2, 0xf233, 0xf4f3, 0xfb0f, 0x00f7, 0x042e, 0x0513,
0x0462, 0x026e, 0xfebe, 0xfcc7, 0xfcab, 0xfd89, 0xffc9, 0x0011,
0xff58, 0xfcba, 0xf9f3, 0xf785, 0xf654, 0xf8cc, 0xfde1, 0x030a,
0x07e0, 0x0b1b, 0x0997, 0x0524, 0xfca8, 0xf3e6, 0xeeaf, 0xed5a,
0xf095, 0xf873, 0x01bc, 0x0ae6, 0x1052, 0x0fe5, 0x0a08, 0x00c3,
0xf74a, 0xefee, 0xed2a, 0xef47, 0xf6e7, 0xfe6b, 0x0650, 0x0be9,
0x0bdc, 0x085c, 0x016b, 0xfb3f, 0xf633, 0xf415, 0xf542, 0xf888,
0xfdad, 0x010b, 0x024b, 0x01ef, 0x00b2, 0xfe61, 0xfdaa, 0xfe03,
0xffcb, 0x01a2, 0x01e9, 0x0103, 0xfd9c, 0xf9d4, 0xf608, 0xf3a7,
0xf51c, 0xf9f3, 0x0061, 0x06e6, 0x0b95, 0x0c61, 0x08d2, 0x0160,
0xf84c, 0xf0a6, 0xebdb, 0xed33, 0xf3bc, 0xfd3a, 0x0682, 0x0d79,
0x103f, 0x0cfb, 0x05ca, 0xfcfc, 0xf47e, 0xefdf, 0xef58, 0xf3a8,
0xfa58, 0x0216, 0x080c, 0x0958, 0x0862, 0x03c9, 0xfe61, 0xfa1d,
0xf73c, 0xf730, 0xf968, 0xfc24, 0xff41, 0x002b, 0xffd9, 0xfd90,
0xfcb7, 0xfcea, 0xfd8d, 0x0030, 0x0289, 0x040e, 0x03eb, 0x00b0,
0xfb75, 0xf688, 0xf2d7, 0xf287, 0xf5cf, 0xfcf2, 0x047e, 0x0ac4,
0x0d8d, 0x0c0b, 0x05cb, 0xfd8c, 0xf4af, 0xee24, 0xec14, 0xf039,
0xf88f, 0x0132, 0x0a30, 0x0ea9, 0x0ec8, 0x0962, 0x0139, 0xf931,
0xf293, 0xf07a, 0xf221, 0xf70f, 0xfdb8, 0x03b3, 0x05d3, 0x05d3,
0x03f5, 0xfff3, 0xfc24, 0xfa4b, 0xfa5d, 0xfb28, 0xfd4d, 0xff01,
0xffcd, 0xfe05, 0xfbd4, 0xfa96, 0xfa6d, 0xfcb5, 0x00a7, 0x045e,
0x06cc, 0x06f7, 0x041e, 0xff48, 0xf8b0, 0xf338, 0xf1ca, 0xf35a,
0xf8e4, 0x00eb, 0x0847, 0x0dc6, 0x0e60, 0x0a37, 0x0298, 0xf8c2,
0xf02d, 0xec6d, 0xeccc, 0xf350, 0xfc3b, 0x0528, 0x0b78, 0x0d47,
0x0b48, 0x0503, 0xfd97, 0xf678, 0xf38e, 0xf324, 0xf632, 0xfb45,
0xfff5, 0x039e, 0x04b5, 0x03a5, 0x0139, 0xfeb1, 0xfd2c, 0xfda2,
0xfe93, 0x006d, 0x014f, 0x004d, 0xfe20, 0xfac2, 0xf8bd, 0xf8b3,
0xf9d9, 0xfe33, 0x029d, 0x071d, 0x0936, 0x06b3, 0x0289, 0xfad8,
0xf3dc, 0xefe6, 0xef58, 0xf37c, 0xfbaa, 0x042b, 0x0b57, 0x0f03,
0x0ceb, 0x076b, 0xfe1b, 0xf52d, 0xef9c, 0xed2a, 0xf0c7, 0xf7d0,
0xffae, 0x0763, 0x0bcc, 0x0b5a, 0x074c, 0x011f, 0xfb01, 0xf61a,
0xf459, 0xf5b6, 0xf940, 0xfdf3, 0x00b0, 0x01c4, 0x0132, 0xff7f,
0xfd55, 0xfcf2, 0xfd51, 0xff68, 0x013d, 0x015c, 0x00be, 0xfde3,
0xfa96, 0xf6df, 0xf59c, 0xf6ed, 0xfaf8, 0x010e, 0x06a7, 0x0a7b,
0x0ab3, 0x06ce, 0x0036, 0xf88c, 0xf1e3, 0xeef0, 0xf084, 0xf6d2,
0xff14, 0x0791, 0x0c96, 0x0d64, 0x09b9, 0x0260, 0xf9c7, 0xf32c,
0xef65, 0xef8e, 0xf557, 0xfd5f, 0x0419, 0x08b7, 0x0afd, 0x0776,
0x039f, 0xfe6e, 0xf96d, 0xf747, 0xf7a3, 0xfa2e, 0xfcee, 0xffc4,
0x00d9, 0x0052, 0xff5a, 0xfe20, 0xfdd2, 0xff60, 0x013f, 0x03b1,
0x04c3, 0x0333, 0xff8d, 0xfb35, 0xf6f9, 0xf39d, 0xf324, 0xf76d,
0xfd52, 0x045c, 0x0a57, 0x0c59, 0x0a68, 0x042b, 0xfc61, 0xf494,
0xefe1, 0xef80, 0xf2d4, 0xfb37, 0x0378, 0x09e0, 0x0d50, 0x0bab,
0x066d, 0xfe6d, 0xf767, 0xf202, 0xf120, 0xf3a7, 0xf962, 0x0067,
0x0541, 0x07d1, 0x07a6, 0x047a, 0x00c0, 0xfca0, 0xf9d2, 0xfa00,
0xfaf7, 0xfd16, 0xfdea, 0xfe18, 0xfdc0, 0xfc38, 0xfae4, 0xfb4a,
0xfdaa, 0x0118, 0x038d, 0x059d, 0x0572, 0x02b1, 0xfdfc, 0xf7f1,
0xf3be, 0xf209, 0xf3ec, 0xf9f8, 0x017d, 0x0875, 0x0ca4, 0x0c63,
0x087e, 0x00b1, 0xf7b3, 0xf0fc, 0xeeee, 0xf0a4, 0xf689, 0xff13,
0x0626, 0x0b13, 0x0bea, 0x0903, 0x026a, 0xfadb, 0xf5a7, 0xf29d,
0xf306, 0xf77a, 0xfcb5, 0x0228, 0x04bc, 0x0540, 0x03d2, 0x00cb,
0xfe44, 0xfbe6, 0xfcd4, 0xfcf9, 0xff62, 0x0071, 0x002a, 0xfddb,
0xfad2, 0xfa17, 0xf9f1, 0xfb58, 0xffa4, 0x0426, 0x06b0, 0x080c,
0x0556, 0x0161, 0xf9b0, 0xf42a, 0xf0be, 0xf17e, 0xf5c6, 0xfce9,
0x05e1, 0x0b7b, 0x0d39, 0x0a75, 0x04cb, 0xfcce, 0xf5a2, 0xf073,
0xf096, 0xf3de, 0xfabd, 0x02a7, 0x07e3, 0x0b17, 0x0a4b, 0x04c4,
0xfea8, 0xf971, 0xf62a, 0xf645, 0xf75a, 0xfbd0, 0x0072, 0x020d,
0x0247, 0x01c5, 0x0000, 0xfd78, 0xfcad, 0xfce8, 0xfd8f, 0xff94,
0x0041, 0xff14, 0xfd29, 0xfa6b, 0xf7c1, 0xf6fc, 0xf94d, 0xfd3a,
0x024d, 0x073a, 0x09ae, 0x0890, 0x04b2, 0xfdba, 0xf65b, 0xf13e,
0xf010, 0xf2a3, 0xf867, 0x016f, 0x08a9, 0x0cb8, 0x0c91, 0x085b,
0x018a, 0xf9c0, 0xf369, 0xf085, 0xf298, 0xf719, 0xfe8f, 0x0456,
0x07bc, 0x0901, 0x0598, 0x013c, 0xfc45, 0xf8be, 0xf6b2, 0xf80b,
0xfaaf, 0xfe0b, 0x00ed, 0x0130, 0x00e3, 0xfebc, 0xfd6b, 0xfce1,
0xfe04, 0xfffc, 0x01ca, 0x0214, 0x015a, 0xfe9f, 0xfa5e, 0xf777,
0xf4a3, 0xf63d, 0xf950, 0xff48, 0x0546, 0x08ff, 0x0aac, 0x072a,
0x01cd, 0xfa4a, 0xf3fe, 0xf058, 0xf0ff, 0xf4fc, 0xfc4c, 0x0454,
0x0a38, 0x0c97, 0x09df, 0x04ef, 0xfd0a, 0xf605, 0xf240, 0xf241,
0xf4bb, 0xfa93, 0x00a0, 0x051c, 0x0713, 0x0618, 0x03e2, 0xff34,
0xfb94, 0xf9f6, 0xfa50, 0xfbf2, 0xfe65, 0xffb9, 0x0078, 0xfece,
0xfd43, 0xfc4b, 0xfc19, 0xfdca, 0x000b, 0x02ff, 0x04d0, 0x04a6,
0x020b, 0xfd3e, 0xf8bb, 0xf515, 0xf40b, 0xf7b3, 0xfc83, 0x030c,
0x08c4, 0x0c09, 0x0abb, 0x05d6, 0xfe4d, 0xf6cc, 0xf154, 0xef7a,
0xf298, 0xf937, 0x0120, 0x0733, 0x0bbf, 0x0b8b, 0x07ca, 0x0134,
0xfa23, 0xf4cb, 0xf2c3, 0xf34c, 0xf780, 0xfd7e, 0x0191, 0x0439,
0x04ab, 0x0312, 0x0011, 0xfdde, 0xfc57, 0xfc9e, 0xfd93, 0xff27,
0x0022, 0xff8f, 0xfddb, 0xfb96, 0xfa32, 0xfa21, 0xfbca, 0xff92,
0x0352, 0x058d, 0x0608, 0x03d8, 0xffc4, 0xf9aa, 0xf507, 0xf273,
0xf3e3, 0xf877, 0xfefd, 0x0644, 0x0ad7, 0x0c7a, 0x08d6, 0x02d8,
0xfa53, 0xf362, 0xf026, 0xf097, 0xf4f1, 0xfc07, 0x0394, 0x0868,
0x0b44, 0x0917, 0x03f2, 0xfe5b, 0xf91c, 0xf67b, 0xf636, 0xf7a9,
0xfb90, 0xffc1, 0x0261, 0x0272, 0x0197, 0xffd4, 0xfda5, 0xfd48,
0xfd65, 0xfeba, 0x0036, 0x003e, 0xffa0, 0xfd3e, 0xfabb, 0xf85d,
0xf79b, 0xf9e6, 0xfd98, 0x01cd, 0x057f, 0x07cd, 0x06ca, 0x0270,
0xfca9, 0xf64a, 0xf277, 0xf220, 0xf481, 0xfb3a, 0x01f2, 0x07f0,
0x0b8d, 0x0a97, 0x0546, 0xfee8, 0xf7db, 0xf2b8, 0xf1d6, 0xf397,
0xf992, 0x0000, 0x0589, 0x08d3, 0x087c, 0x0578, 0x0099, 0xfc27,
0xf87f, 0xf6f0, 0xf83a, 0xfa6e, 0xfd94, 0x004a, 0x00be, 0x006d,
0xfee0, 0xfdd6, 0xfe4f, 0xfebc, 0x00b9, 0x019a, 0x0277, 0x010b,
0xfe4c, 0xfb34, 0xf775, 0xf5f4, 0xf6eb, 0xfb29, 0x0098, 0x04ed,
0x0811, 0x0945, 0x05c1, 0x0098, 0xfa0e, 0xf468, 0xf219, 0xf30f,
0xf78b, 0xff25, 0x0564, 0x0a1d, 0x0b4f, 0x078c, 0x0223, 0xfb15,
0xf55a, 0xf221, 0xf318, 0xf71f, 0xfc8d, 0x0296, 0x0670, 0x075d,
0x056f, 0x01fd, 0xfe54, 0xfa67, 0xfa64, 0xf9d9, 0xfb80, 0xfd9a,
0xfed7, 0x0054, 0xfeab, 0xfdd4, 0xfd35, 0xfd31, 0xfe93, 0x00bc,
0x025e, 0x0422, 0x02bb, 0xffdb, 0xfc08, 0xf815, 0xf4a2, 0xf4c6,
0xf88b, 0xfc9d, 0x032b, 0x07aa, 0x0930, 0x086b, 0x03b3, 0xfd31,
0xf69f, 0xf258, 0xf232, 0xf524, 0xfb68, 0x020f, 0x06e7, 0x0a87,
0x0983, 0x0500, 0xff5f, 0xf8e6, 0xf4a9, 0xf399, 0xf631, 0xfa48,
0xff69, 0x039e, 0x051a, 0x04e3, 0x026c, 0xfeee, 0xfc3a, 0xfa6f,
0xfa4a, 0xfc2f, 0xfdfa, 0xfe2d, 0xfe49, 0xfdc4, 0xfb74, 0xfb2c,
0xfb35, 0xfce4, 0xfffa, 0x02ce, 0x0489, 0x04d7, 0x0332, 0xfde1,
0xf956, 0xf53a, 0xf3e6, 0xf60d, 0xfab8, 0x005a, 0x06de, 0x0a90,
0x0a4a, 0x0679, 0x00ba, 0xfa27, 0xf3be, 0xf216, 0xf2d3, 0xf795,
0xfe4f, 0x03db, 0x079b, 0x093e, 0x062b, 0x0172, 0xfbf3, 0xf7d8,
0xf599, 0xf6a3, 0xf9ca, 0xfdbd, 0x00f4, 0x0274, 0x038a, 0x0142,
0xff73, 0xfd19, 0xfd01, 0xfcde, 0xfe9a, 0xffd3, 0x003c, 0xffa4,
0xfdd0, 0xfb72, 0xfa15, 0xf9df, 0xfbc2, 0xffa1, 0x0226, 0x05c9,
0x0607, 0x04ee, 0x008f, 0xfb6f, 0xf5b1, 0xf2f7, 0xf32f, 0xf6db,
0xfd7c, 0x03a5, 0x0938, 0x0b21, 0x0906, 0x041e, 0xfdbb, 0xf798,
0xf3a3, 0xf275, 0xf5dd, 0xfacb, 0x0094, 0x059f, 0x0823, 0x06c3,
0x0424, 0xff95, 0xfad7, 0xf908, 0xf8c1, 0xf995, 0xfc79, 0xffb0,
0x013f, 0x01d4, 0x0116, 0xff61, 0xfda3, 0xfd61, 0xfdaf, 0xff3d,
0x00c5, 0x0131, 0x003a, 0xfdc4, 0xfb01, 0xf88c, 0xf8aa, 0xf91d,
0xfc8e, 0x017b, 0x054e, 0x080d, 0x0705, 0x0382, 0xfe44, 0xf865,
0xf37b, 0xf2a8, 0xf466, 0xf953, 0xffc2, 0x057a, 0x08dd, 0x0999,
0x0675, 0x00d5, 0xfaba, 0xf586, 0xf328, 0xf3ad, 0xf84e, 0xfd54,
0x027e, 0x0546, 0x0632, 0x04a0, 0x0156, 0xfd46, 0xf9d6, 0xf9b9,
0xf9e8, 0xfc0b, 0xfe53, 0x0005, 0x0052, 0xff76, 0xfe12, 0xfd18,
0xfd73, 0xfec4, 0x00f6, 0x01fa, 0x020f, 0x01da, 0x001b, 0xfc5e,
0xf887, 0xf618, 0xf700, 0xfa16, 0xfe65, 0x0357, 0x06c9, 0x084a,
0x066d, 0x0105, 0xfb85, 0xf57e, 0xf2bc, 0xf326, 0xf692, 0xfd51,
0x0318, 0x0785, 0x0a4d, 0x087e, 0x03af, 0xfdfd, 0xf80f, 0xf4c7,
0xf3db, 0xf712, 0xfad3, 0xffe7, 0x03cb, 0x0548, 0x0486, 0x01da,
0xff0d, 0xfcb2, 0xfb2f, 0xfbc2, 0xfd97, 0xfe79, 0x006a, 0xff91,
0xfe0f, 0xfc4d, 0xfabd, 0xfb7f, 0xfd3b, 0xff7b, 0x0276, 0x03f4,
0x03d1, 0x011d, 0xfce6, 0xf921, 0xf66b, 0xf62e, 0xf717, 0xfc22,
0x018c, 0x05f7, 0x08c5, 0x07fb, 0x0466, 0xff34, 0xf89f, 0xf3d7,
0xf329, 0xf4fc, 0xfa58, 0xffb2, 0x0510, 0x0869, 0x086c, 0x0596,
0x0158, 0xfbf7, 0xf789, 0xf5f0, 0xf746, 0xf9bf, 0xfd23, 0x00c2,
0x01f9, 0x01de, 0x0133, 0xff85, 0xfd71, 0xfcdd, 0xfd16, 0xfdbd,
0xfe4d, 0x0004, 0xfe4a, 0xfcb5, 0xfb08, 0xf9a4, 0xfa64, 0xfc20,
0xff50, 0x0289, 0x04dc, 0x04eb, 0x039a, 0xffce, 0xfa96, 0xf66b,
0xf3fb, 0xf4be, 0xf8e6, 0xfdfa, 0x0419, 0x0806, 0x08ed, 0x0641,
0x0224, 0xfc19, 0xf6c7, 0xf34d, 0xf39a, 0xf795, 0xfbf9, 0x01df,
0x0556, 0x0763, 0x063d, 0x02b8, 0xfe8e, 0xfac6, 0xf890, 0xf87c,
0xf9f3, 0xfd3a, 0xffd0, 0x0135, 0x01e0, 0x00ac, 0x0001, 0xfe9f,
0xfd8a, 0xfe8d, 0xffcc, 0x009c, 0x009f, 0xfeda, 0xfcb6, 0xfa28,
0xf8ea, 0xf8ff, 0xf9f8, 0xfc99, 0x0148, 0x04e6, 0x0611, 0x0571,
0x029c, 0xfdda, 0xf985, 0xf572, 0xf3af, 0xf6b5, 0xfbca, 0x01bf,
0x062a, 0x08ec, 0x0830, 0x04a6, 0xffe1, 0xfa28, 0xf5c4, 0xf469,
0xf621, 0xfa5e, 0xff31, 0x0386, 0x05a0, 0x055d, 0x02d4, 0xff4a,
0xfb9c, 0xf9b2, 0xf950, 0xf9a6, 0xfba8, 0xfdc5, 0xffb8, 0xffc7,
0xffe9, 0xfeca, 0xfdff, 0xfe51, 0xff64, 0x00df, 0x01c1, 0x0208,
0x0143, 0xfeb2, 0xfbe1, 0xf8e9, 0xf744, 0xf8f0, 0xfaab, 0xffc3,
0x03b8, 0x067f, 0x076f, 0x0403, 0x00a5, 0xfb12, 0xf619, 0xf3d8,
0xf4d6, 0xf8a7, 0xfdf1, 0x031a, 0x069d, 0x07f5, 0x05e2, 0x01fa,
0xfcbd, 0xf85e, 0xf5d6, 0xf60e, 0xf8ce, 0xfcd0, 0x0094, 0x03b9,
0x04bb, 0x0316, 0x00e4, 0xfe10, 0xfb77, 0xfa52, 0xfab6, 0xfbf0,
0xfde0, 0xfdfa, 0xfdbf, 0xfd8e, 0xfcd6, 0xfd2f, 0xfcad, 0xfe56,
0x0047, 0x0209, 0x03fb, 0x0277, 0x007d, 0xfca1, 0xf8a7, 0xf64c,
0xf64a, 0xf8e0, 0xfd4d, 0x0257, 0x05ce, 0x086b, 0x06b3, 0x0301,
0xfe57, 0xf837, 0xf45c, 0xf356, 0xf67c, 0xfaff, 0x009c, 0x04fb,
0x082d, 0x0769, 0x03a5, 0x0013, 0xfabe, 0xf829, 0xf6af, 0xf84f,
0xfa81, 0xff02, 0x0193, 0x0360, 0x0334, 0x00dd, 0xff4a, 0xfd1d,
0xfd1e, 0xfce2, 0xfdb8, 0xfdcc, 0xff99, 0xfe3b, 0xfd70, 0xfc55,
0xfae2, 0xfb8d, 0xfd37, 0xffb8, 0x024d, 0x0436, 0x03f6, 0x0252,
0xfe6e, 0xfa7a, 0xf6fb, 0xf607, 0xf753, 0xfb0b, 0xfffd, 0x054a,
0x0786, 0x080e, 0x05c9, 0x011b, 0xfbad, 0xf6d5, 0xf492, 0xf475,
0xf8d9, 0xfd61, 0x02c5, 0x05fc, 0x0609, 0x053d, 0x01b1, 0xfdc5,
0xf9fb, 0xf8b0, 0xf922, 0xfa57, 0xfdb2, 0x0044, 0x01ac, 0x013e,
0x00ff, 0xffcb, 0xfdfd, 0xfe3b, 0xfdc4, 0xff0e, 0x0009, 0xfffa,
0xffe9, 0xfdf9, 0xfbe5, 0xfa2a, 0xfa08, 0xfb84, 0xfe2f, 0x0138,
0x03e8, 0x0501, 0x03a2, 0x00d7, 0xfc54, 0xf7e6, 0xf4c2, 0xf4dc,
0xf78d, 0xfc90, 0x016d, 0x0572, 0x07df, 0x0699, 0x0320, 0xfe34,
0xf9b8, 0xf641, 0xf5b4, 0xf760, 0xfb32, 0xffbd, 0x038c, 0x0529,
0x0515, 0x0271, 0xffbb, 0xfc27, 0xfa17, 0xfa6b, 0xfa83, 0xfd2d,
0xfeef, 0x00b2, 0x00f8, 0x00b1, 0xff1d, 0xfe07, 0xfe06, 0xfe67,
0x0073, 0x00e5, 0x0126, 0x0056, 0xfe42, 0xfbab, 0xf993, 0xf953,
0xf9a5, 0xfcc5, 0x00e3, 0x03e1, 0x0566, 0x05e9, 0x03e3, 0xff07,
0xfb0c, 0xf786, 0xf601, 0xf702, 0xfaa0, 0xffa6, 0x0428, 0x073c,
0x07bf, 0x04d8, 0x0114, 0xfc3d, 0xf7f3, 0xf649, 0xf69d, 0xf9c2,
0xfdb9, 0x0168, 0x035a, 0x044b, 0x031b, 0x005b, 0xfdd4, 0xfbba,
0xfada, 0xfbe2, 0xfd78, 0xfe02, 0xffec, 0xffbb, 0xfe32, 0xfd81,
0xfd00, 0xfd79, 0xfe66, 0x0024, 0x01b2, 0x01fa, 0x0181, 0xffcf,
0xfc9c, 0xfa1e, 0xf777, 0xf7b9, 0xfa6a, 0xfd36, 0x027c, 0x0500,
0x0607, 0x04cf, 0x0101, 0xfcc0, 0xf7cd, 0xf61e, 0xf603, 0xf87a,
0xfd1d, 0x01ff, 0x0528, 0x078f, 0x05f1, 0x032b, 0xfed3, 0xfa3b,
0xf7b6, 0xf6cb, 0xf902, 0xfb99, 0xffc0, 0x019d, 0x0403, 0x02d0,
0x0165, 0xff9c, 0xfd30, 0xfcf1, 0xfcb3, 0xfde9, 0xfdf7, 0xfe5a,
0xfe27, 0xfd79, 0xfb32, 0xfb17, 0xfb34, 0xfd04, 0x0024, 0x00d4,
0x0393, 0x0276, 0x0117, 0xfdd6, 0xf9df, 0xf7a7, 0xf6bb, 0xf8e0,
0xfc08, 0x009a, 0x046a, 0x060f, 0x05c3, 0x0393, 0xff0b, 0xfa23,
0xf6c0, 0xf5ff, 0xf6c7, 0xfa5b, 0xfe74, 0x0357, 0x0578, 0x05ac,
0x0390, 0xffae, 0xfbe2, 0xf95c, 0xf8ff, 0xf91c, 0xfae3, 0xfdb9,
0x008e, 0x0135, 0x0140, 0x00ff, 0xff46, 0xfdc8, 0xfe50, 0xfdb1,
0xff1d, 0xfff3, 0xfff5, 0xfe4b, 0xfd46, 0xfbec, 0xfab3, 0xfb15,
0xfbf3, 0xff78, 0x0127, 0x03f1, 0x04c9, 0x0307, 0xffc2, 0xfbb7,
0xf811, 0xf5d1, 0xf6cb, 0xf9a6, 0xfd81, 0x0277, 0x05cb, 0x0605,
0x0511, 0x01f2, 0xfcc0, 0xf90a, 0xf620, 0xf6ac, 0xf8dc, 0xfc6a,
0x018a, 0x03ba, 0x0569, 0x03f9, 0x015b, 0xfde4, 0xfa7e, 0xf9ca,
0xf9a7, 0xfaf7, 0xfd09, 0xff01, 0x010e, 0x0129, 0x00bf, 0xff49,
0xfdfb, 0xfdc0, 0xfea7, 0x000c, 0x0092, 0x00fb, 0xff4f, 0xfd0f,
0xfb41, 0xf9df, 0xf974, 0xfa93, 0xfd9c, 0x0158, 0x03b5, 0x055f,
0x04ca, 0x02e2, 0xff06, 0xfa86, 0xf7cc, 0xf657, 0xf7ba, 0xfb35,
0x008c, 0x0421, 0x0624, 0x05e7, 0x03ec, 0x000c, 0xfb44, 0xf804,
0xf713, 0xf8b0, 0xfba9, 0xff5e, 0x0253, 0x03ef, 0x0425, 0x02ae,
0x001a, 0xfd39, 0xfae4, 0xfadb, 0xfad9, 0xfcb6, 0xfe2d, 0xfff9,
0x0016, 0xfe57, 0xfe27, 0xfdd1, 0xfdf0, 0xfeef, 0x0080, 0x013f,
0x0203, 0x00fb, 0xff49, 0xfc32, 0xf97b, 0xf8ef, 0xf951, 0xfbb5,
0xff96, 0x0316, 0x057a, 0x05da, 0x03df, 0x0009, 0xfbea, 0xf837,
0xf591, 0xf6bd, 0xf95f, 0xfd76, 0x022b, 0x0520, 0x0601, 0x042d,
0x00e1, 0xfcb9, 0xf9d2, 0xf883, 0xf84d, 0xfa39, 0xfcd6, 0x006e,
0x0222, 0x0237, 0x01e8, 0x0062, 0xfe68, 0xfccb, 0xfcfe, 0xfcca,
0xfd8c, 0xfe60, 0x0055, 0xffc9, 0xfde6, 0xfd5e, 0xfcd5, 0xfced,
0xfde4, 0x005c, 0x0154, 0x027d, 0x01c6, 0x0061, 0xfcdf, 0xf9c0,
0xf7d3, 0xf712, 0xf9f4, 0xfd75, 0x01b8, 0x04b7, 0x0638, 0x0521,
0x01df, 0xfe17, 0xf9f1, 0xf6a7, 0xf594, 0xf7c0, 0xfb10, 0xfff3,
0x03d6, 0x0564, 0x0558, 0x02df, 0x008c, 0xfc93, 0xfa33, 0xf9e7,
0xf9c1, 0xfc46, 0xff3b, 0x013e, 0x01af, 0x0120, 0x0052, 0xfef2,
0xfd49, 0xfceb, 0xfd91, 0xfe0f, 0xff27, 0x002a, 0xff2f, 0xfd8a,
0xfc99, 0xfab3, 0xfb91, 0xfd79, 0x001a, 0x01ab, 0x0372, 0x03c1,
0x017f, 0xff27, 0xfb50, 0xf85d, 0xf694, 0xf873, 0xfb6d, 0xff6e,
0x034a, 0x05c4, 0x062a, 0x0440, 0x003f, 0xfc4b, 0xf86a, 0xf68e,
0xf772, 0xf91b, 0xfce0, 0x00ea, 0x03a1, 0x047a, 0x0313, 0x00d2,
0xfe17, 0xfb2f, 0xfa12, 0xf9e0, 0xfb63, 0xfda3, 0xff2a, 0x004a,
0x0063, 0xfff4, 0xff20, 0xfdf1, 0xfe31, 0xfdfe, 0xff76, 0x0007,
0xfff6, 0xffcb, 0xfd97, 0xfb93, 0xfa3e, 0xfa22, 0xfb21, 0xfe6b,
0x0122, 0x032e, 0x049a, 0x0335, 0x00c4, 0xfd8e, 0xf999, 0xf76d,
0xf72d, 0xf991, 0xfd19, 0x0158, 0x04ab, 0x0623, 0x053f, 0x026a,
0xfe03, 0xfa88, 0xf84f, 0xf737, 0xf8bd, 0xfc32, 0xffac, 0x01f2,
0x0438, 0x0372, 0x019e, 0xffb0, 0xfcd6, 0xfb22, 0xfadb, 0xfb42,
0xfcfc, 0xfe14, 0xffe4, 0xff46, 0xfdd4, 0xfdbd, 0xfcd1, 0xfd4e,
0xfe7f, 0x003c, 0x00e6, 0x00f1, 0x00ce, 0xfebd, 0xfc61, 0xfa7f,
0xfa14, 0xfa64, 0xfc67, 0x000d, 0x0233, 0x04da, 0x0480, 0x0270,
0xff76, 0xfb4f, 0xf85a, 0xf6c7, 0xf825, 0xfb47, 0xff1d, 0x02cf,
0x04f1, 0x0543, 0x03e1, 0x007c, 0xfc26, 0xf97f, 0xf7c8, 0xf876,
0xfa8b, 0xfd34, 0x0098, 0x020b, 0x023d, 0x01c1, 0x00f1, 0xfeca,
0xfd2f, 0xfc7d, 0xfd1e, 0xfdd4, 0xff6a, 0x0035, 0xfed4, 0xfe23,
0xfd73, 0xfcef, 0xfd11, 0xfec9, 0x0053, 0x0159, 0x0239, 0x0196,
0xfffe, 0xfd24, 0xfa89, 0xf915, 0xf931, 0xfaf9, 0xfe07, 0x01e3,
0x03b4, 0x054c, 0x0391, 0x0154, 0xfd7f, 0xf995, 0xf795, 0xf710,
0xf9c7, 0xfd22, 0x0102, 0x031c, 0x051d, 0x03af, 0x01e3, 0xfe64,
0xfaf1, 0xf965, 0xf906, 0xfa02, 0xfc25, 0xfecd, 0x00b9, 0x01af,
0x016e, 0x00a1, 0xfe78, 0xfd7c, 0xfd03, 0xfda3, 0xfe35, 0xffd5,
0x000c, 0xfe8b, 0xfdad, 0xfcb3, 0xfb15, 0xfc6b, 0xfe0d, 0x0009,
0x01a3, 0x0237, 0x0262, 0x0109, 0xfeb9, 0xfacb, 0xf986, 0xf8ea,
0xf9e9, 0xfc4d, 0xfff6, 0x035e, 0x04cf, 0x04c0, 0x0343, 0xff63,
0xfba1, 0xf921, 0xf781, 0xf878, 0xfb29, 0xff2c, 0x0176, 0x0384,
0x03e6, 0x01ff, 0x0000, 0xfc74, 0xfa25, 0xf9ad, 0xfa45, 0xfc53,
0xfebb, 0x003e, 0x016f, 0x00fd, 0x0062, 0xfeaf, 0xfdc4, 0xfdc0,
0xfdad, 0xffa1, 0xffe1, 0x0056, 0xfebf, 0xfda2, 0xfc46, 0xfae9,
0xfb72, 0xfcd0, 0xff6a, 0x0116, 0x0359, 0x0442, 0x02b0, 0x0062,
0xfc85, 0xf9af, 0xf8f0, 0xf922, 0xfa74, 0xfe08, 0x0149, 0x0383,
0x0551, 0x03d7, 0x01e0, 0xfd7d, 0xfaaf, 0xf922, 0xf8f2, 0xf9d3,
0xfcbe, 0x007e, 0x0252, 0x043d, 0x02b9, 0x010b, 0xfeeb, 0xfc73,
0xfb25, 0xfae0, 0xfc2f, 0xfdff, 0xff90, 0x003f, 0xffed, 0xffbb,
0xfdf1, 0xfe2f, 0xfddb, 0xfe27, 0xffd6, 0x0054, 0x00bb, 0xff9c,
0xfdb7, 0xfb53, 0xfa12, 0xf99f, 0xfb4c, 0xfd7c, 0x0043, 0x0250,
0x044a, 0x036b, 0x0171, 0xfef9, 0xfa99, 0xf915, 0xf8e8, 0xf960,
0xfbd5, 0x0009, 0x038c, 0x050b, 0x0498, 0x0338, 0xffd4, 0xfcb2,
0xfa0c, 0xf953, 0xf9c4, 0xfb57, 0xfe30, 0x00b1, 0x022e, 0x0230,
0x0141, 0xff47, 0xfdeb, 0xfc47, 0xfcaf, 0xfd08, 0xfda0, 0xff29,
0x0028, 0xff86, 0xfded, 0xfd4c, 0xfd11, 0xfdfe, 0xfe9a, 0x0084,
0x010a, 0x011d, 0x00f2, 0xff80, 0xfd0a, 0xfa2c, 0xf9f1, 0xfa16,
0xfc54, 0xff50, 0x01e0, 0x03c2, 0x041c, 0x02d3, 0xfff3, 0xfc8d,
0xf94f, 0xf7eb, 0xf833, 0xfa22, 0xfd9b, 0x00e1, 0x0346, 0x0451,
0x0364, 0x00f7, 0xfe1c, 0xfb42, 0xf9bc, 0xf9d0, 0xfac5, 0xfdb2,
0x0066, 0x0130, 0x0107, 0x00d4, 0xff7d, 0xfdcc, 0xfd4a, 0xfd1e,
0xfde9, 0xfe3a, 0xff78, 0x0053, 0xfea6, 0xfd7a, 0xfcdb, 0xfcfb,
0xfd08, 0xfde2, 0xffab, 0x014f, 0x0212, 0x01de, 0x002e, 0xfdd6,
0xfb89, 0xf9d5, 0xf9d0, 0xfadc, 0xfe1a, 0x011a, 0x03b7, 0x05a6,
0x0405, 0x025b, 0xff09, 0xfb10, 0xf972, 0xf8bd, 0xf964, 0xfbf4,
0xffbb, 0x01b5, 0x0415, 0x040a, 0x01fb, 0xffe6, 0xfd25, 0xfb1f,
0xfa4a, 0xfb39, 0xfd10, 0xfeb9, 0x002c, 0x0098, 0x0073, 0xff78,
0xfe53, 0xfd91, 0xfd28, 0xfdae, 0xfebd, 0x0016, 0x001c, 0xff19,
0xfd9b, 0xfceb, 0xfb4e, 0xfb65, 0xfd5c, 0xffb1, 0x011e, 0x01d7,
0x0214, 0x013c, 0xff1e, 0xfc06, 0xfa13, 0xf8c7, 0xf9c0, 0xfb26,
0xfe86, 0x01e7, 0x03c0, 0x0491, 0x0308, 0x0090, 0xfcf2, 0xfa4f,
0xf953, 0xf97f, 0xfaee, 0xfdec, 0x00b2, 0x01d0, 0x01f3, 0x01ca,
0x0052, 0xfe75, 0xfc37, 0xfabd, 0xfb5a, 0xfd46, 0xfe7b, 0xffd2,
0x003c, 0x0025, 0xffb9, 0xfdf8, 0xfe29, 0xfd7d, 0xfee3, 0x0018,
0x00f7, 0x00c4, 0xffc9, 0xfeb3, 0xfc09, 0xfb23, 0xfaca, 0xfb9e,
0xfd98, 0x002d, 0x019f, 0x023a, 0x01df, 0x008c, 0xfdd4, 0xfaa5,
0xf977, 0xf908, 0xfa6c, 0xfd45, 0x0041, 0x02c3, 0x0428, 0x0346,
0x013c, 0xfed9, 0xfb56, 0xf9da, 0xf934, 0xfa80, 0xfce1, 0xffab,
0x01a4, 0x0210, 0x01d2, 0x00a2, 0xff8b, 0xfd1a, 0xfcdf, 0xfccb,
0xfd26, 0xfe12, 0xff1f, 0x0049, 0xfec9, 0xfdd8, 0xfe14, 0xfdc4,
0xfe48, 0xff83, 0x008a, 0x00d4, 0x00d2, 0x0116, 0xff16, 0xfd2c,
0xfb49, 0xfa4c, 0xfb11, 0xfc8a, 0xff9f, 0x015c, 0x0312, 0x0404,
0x01da, 0xffc2, 0xfc7f, 0xf9e0, 0xf907, 0xf9af, 0xfba7, 0xfee3,
0x0187, 0x0338, 0x0413, 0x0176, 0x004d, 0xfcb9, 0xfa95, 0xfa0a,
0xfa4d, 0xfbc2, 0xfdd1, 0x00d4, 0x00e5, 0x0112, 0x00f7, 0xffc5,
0xfde3, 0xfd7e, 0xfcaf, 0xfddf, 0xfdad, 0xfeb3, 0xffad, 0xfe1d,
0xfdeb, 0xfd24, 0xfd33, 0xfd35, 0xfe79, 0x0042, 0x00e2, 0x00e5,
0x012f, 0xff80, 0xfd71, 0xfb56, 0xfa14, 0xfa07, 0xfb3d, 0xfde5,
0x0041, 0x0275, 0x0415, 0x0321, 0x010d, 0xfeb8, 0xfb4d, 0xf9f4,
0xfa14, 0xfaf3, 0xfd60, 0x008b, 0x019b, 0x0386, 0x02df, 0x00b6,
0xff24, 0xfc9a, 0xfb53, 0xfa80, 0xfc2a, 0xfdb4, 0xff56, 0x00db,
0x012b, 0x00d5, 0xffbc, 0xfe39, 0xfdbb, 0xfd60, 0xfe10, 0xfdc3,
0xfeee, 0x0017, 0xfdf4, 0xfdfc, 0xfcdf, 0xfd07, 0xfcee, 0xfd88,
0xffde, 0x0131, 0x01e3, 0x01e9, 0x00dc, 0xfe63, 0xfc3f, 0xfa44,
0xf9e2, 0xfa87, 0xfcdd, 0xffa6, 0x0187, 0x039c, 0x043f, 0x0252,
0x0014, 0xfd3c, 0xfa8b, 0xf9f6, 0xfa73, 0xfc27, 0xfef4, 0x00f2,
0x01e2, 0x01e5, 0x0151, 0xff6d, 0xfd55, 0xfc57, 0xfac7, 0xfbba,
0xfd8c, 0xfe53, 0xffef, 0x0025, 0xffd5, 0x001b, 0xfe3d, 0xfdfe,
0xfddf, 0xfebf, 0x003b, 0xffe3, 0x006b, 0xfed5, 0xfd9d, 0xfc33,
0xfadf, 0xfb80, 0xfd3d, 0xfebb, 0x00ed, 0x0201, 0x01f2, 0x01b3,
0x0033, 0xfdcd, 0xfab9, 0xf9d9, 0xfa0b, 0xfaea, 0xfd7b, 0x00af,
0x022d, 0x03d6, 0x026f, 0x00db, 0xfec5, 0xfbb3, 0xfa73, 0xf9d2,
0xfbea, 0xfda4, 0x0004, 0x0108, 0x015a, 0x010f, 0xfffe, 0xfe6b,
0xfd21, 0xfcf7, 0xfccc, 0xfd73, 0xfdd7, 0xff24, 0x0049, 0xff8d,
0xfe13, 0xfdc6, 0xfe18, 0xfdcc, 0xfeb7, 0x003b, 0x0066, 0x00af,
0xffbd, 0xfe61, 0xfc97, 0xfafd, 0xfaea, 0xfc1a, 0xfd91, 0xffa4,
0x01f3, 0x01e4, 0x021f, 0x0114, 0xff28, 0xfc6d, 0xfa3c, 0xf9b9,
0xfa0d, 0xfc78, 0xff1f, 0x0104, 0x02e3, 0x02dd, 0x0180, 0xfff8,
0xfcf8, 0xfafa, 0xf9d4, 0xfa9b, 0xfcc2, 0xfece, 0x0063, 0x00e7,
0x00fa, 0x0066, 0xff51, 0xfddd, 0xfcfe, 0xfd2f, 0xfd92, 0xfea2,
0x0014, 0x0067, 0xfec5, 0xfdfa, 0xfdf2, 0xfd4f, 0xfdda, 0xfe8d,
0x0011, 0x00bc, 0x0129, 0x00cc, 0xff44, 0xfda9, 0xfb84, 0xfa99,
0xfae2, 0xfc65, 0xfeb4, 0x0162, 0x020c, 0x020a, 0x01ec, 0x001d,
0xfd74, 0xface, 0xf9d7, 0xf9ea, 0xfaf0, 0xfdc4, 0x0066, 0x01c8,
0x0222, 0x019e, 0x00b3, 0xfeb2, 0xfcad, 0xfae3, 0xfb36, 0xfcb9,
0xfdff, 0xff7a, 0x007a, 0x0046, 0xffe4, 0xff81, 0xfe00, 0xfe0a,
0xfe3f, 0xfe03, 0xfed9, 0xffed, 0x0000, 0xff05, 0xfe0f, 0xfd63,
0xfd0b, 0xfd48, 0xfe4b, 0xffd1, 0x00b7, 0x00dd, 0x00ff, 0x0060,
0xfe2c, 0xfbe5, 0xfab1, 0xfa3c, 0xfb85, 0xfd62, 0xfffb, 0x01c9,
0x01ce, 0x01d7, 0x0114, 0xff7b, 0xfc6e, 0xfa53, 0xf9ce, 0xfaf5,
0xfd17, 0xff41, 0x0124, 0x020f, 0x01e6, 0x00f8, 0xff20, 0xfd47,
0xfd2a, 0xfbab, 0xfc7f, 0xfdb7, 0xfe7e, 0x0059, 0xffde, 0x0015,
0xff5c, 0xfdfc, 0xfe20, 0xfe13, 0xfdff, 0xff95, 0xfff4, 0x0022,
0xff84, 0xfdb3, 0xfd31, 0xfcff, 0xfd18, 0xfcff, 0xfec2, 0x0069,
0x0143, 0x0183, 0x012f, 0xff2f, 0xfcf4, 0xfb16, 0xfa09, 0xfaa6,
0xfc3c, 0xfe6d, 0x0077, 0x022f, 0x021e, 0x015d, 0xffab, 0xfda8,
0xfb97, 0xfa64, 0xfaa7, 0xfc11, 0xfdfb, 0x0047, 0x0111, 0x01db,
0x011f, 0x004e, 0xfee9, 0xfcd9, 0xfd4c, 0xfcd5, 0xfddf, 0xfe45,
0xffeb, 0x004d, 0xffd3, 0xfe5f, 0xfdb8, 0xfe34, 0xfe88, 0x002b,
0xfff4, 0x0138, 0x008b, 0xfff8, 0xfe97, 0xfdad, 0xfbf1, 0xfb19,
0xfcbf, 0xfdf2, 0xffee, 0x0109, 0x01d4, 0x01cb, 0x0104, 0xfed3,
0xfc95, 0xfb3c, 0xfafa, 0xfb17, 0xfdeb, 0x0033, 0x014e, 0x01ea,
0x01e2, 0x00cc, 0xfea4, 0xfd02, 0xfbae, 0xfad3, 0xfbb5, 0xfdb1,
0xff02, 0x00e0, 0x00c6, 0x00fe, 0x0098, 0xff09, 0xfe1e, 0xfd91,
0xfcd8, 0xfde1, 0xfe65, 0xfe14, 0xfe22, 0xfe1d, 0xfe40, 0xfdf8,
0xfe5c, 0xfdd0, 0xfe9e, 0xffac, 0x005c, 0x00e7, 0x007c, 0xfead,
0xfd97, 0xfc7b, 0xfb0d, 0xfbc0, 0xfdb4, 0xff87, 0x00ab, 0x01c6,
0x01f9, 0x0153, 0x0016, 0xfd91, 0xfb48, 0xfb2b, 0xfb31, 0xfc59,
0xff2d, 0x00e4, 0x01a4, 0x0208, 0x0169, 0x008c, 0xfe62, 0xfcf3,
0xfb1c, 0xfb2b, 0xfcfb, 0xfe26, 0xfffe, 0x00b1, 0x00b8, 0xfffe,
0xff42, 0xfe0f, 0xfe0f, 0xfdfd, 0xfe34, 0xfe7d, 0xffde, 0xffd2,
0xfe45, 0xfe43, 0xfd45, 0xfd6c, 0xfdec, 0xfe9c, 0xffd1, 0x00a9,
0x00df, 0x00d5, 0xff94, 0xfdcc, 0xfc26, 0xfaf2, 0xfaf6, 0xfbcc,
0xfe14, 0xffe4, 0x0188, 0x021d, 0x01c8, 0x00a6, 0xff1f, 0xfd00,
0xfaf9, 0xfad4, 0xfb54, 0xfd71, 0xff6a, 0x0104, 0x01a7, 0x014f,
0x0082, 0xfec2, 0xfd5b, 0xfd02, 0xfcc7, 0xfce1, 0xfdda, 0xff8f,
0x002a, 0xffea, 0xffd1, 0xff64, 0xfe24, 0xfdbe, 0xfe02, 0xfdf6,
0xffbc, 0xffc1, 0xfff5, 0xff15, 0xfdde, 0xfd68, 0xfcca, 0xfd10,
0xfdf0, 0xffdd, 0x0099, 0x00c9, 0x00db, 0x00be, 0xff7e, 0xfd72,
0xfb54, 0xfad6, 0xfb76, 0xfd36, 0xfed5, 0x00cb, 0x01a8, 0x018d,
0x012d, 0xff66, 0xfdb9, 0xfc02, 0xfae0, 0xfb36, 0xfd17, 0xfe72,
0x0068, 0x010c, 0x0125, 0x00c5, 0xffbc, 0xfe0a, 0xfd3d, 0xfcd3,
0xfce2, 0xfd9d, 0xfebd, 0x002c, 0xffd1, 0x0020, 0xfe8c, 0xfde4,
0xfe17, 0xfdba, 0xfe93, 0x001d, 0xffee, 0x0009, 0x0011, 0xfe2e,
0xfd1a, 0xfcbc, 0xfcef, 0xfd16, 0xfeac, 0x0047, 0x00ea, 0x010b,
0x010a, 0xfffe, 0xfdee, 0xfc7e, 0xfaf8, 0xfaf0, 0xfc39, 0xfde8,
0xffad, 0x0111, 0x01c0, 0x00fb, 0x0050, 0xfe3a, 0xfce8, 0xfb8b,
0xfb19, 0xfcd9, 0xfda6, 0xff41, 0x00a1, 0x0128, 0x00a9, 0x0028,
0xfe8b, 0xfdd3, 0xfdee, 0xfdaa, 0xfe4d, 0xfe38, 0xff8b, 0x0046,
0xfec1, 0xfdea, 0xfde9, 0xfde3, 0xfe0e, 0xfe20, 0xffef, 0x002a,
0x000b, 0x0025, 0xfe49, 0xfdb5, 0xfcc5, 0xfcec, 0xfca4, 0xfdd9,
0xfff1, 0x00d1, 0x00d8, 0x0103, 0x00db, 0xfeef, 0xfd2a, 0xfbba,
0xfacd, 0xfb97, 0xfcdf, 0xfe8e, 0x007a, 0x00fd, 0x012a, 0x00ff,
0xffef, 0xfdf0, 0xfd06, 0xfbed, 0xfc84, 0xfd46, 0xfe68, 0xffde,
0xffce, 0xffe3, 0x0013, 0xfee3, 0xfde9, 0xfe12, 0xfe0f, 0xfddf,
0xff91, 0x0000, 0x0019, 0xff2f, 0xfda7, 0xfe05, 0xfdcc, 0xfe28,
0xfe4a, 0xff81, 0x0044, 0x00be, 0x006b, 0xff9c, 0xfd89, 0xfd29,
0xfc08, 0xfbeb, 0xfd43, 0xfe89, 0x005c, 0x00d1, 0x0101, 0x0112,
0x0049, 0xfdb3, 0xfbe9, 0xfb06, 0xfaf4, 0xfc0a, 0xfdd3, 0xff61,
0x00f2, 0x0106, 0x0123, 0x0045, 0xfea0, 0xfd34, 0xfd39, 0xfcea,
0xfd12, 0xfdcc, 0xff17, 0x0027, 0xffbe, 0x0067, 0xff46, 0xfe08,
0xfdfe, 0xfe11, 0xfde1, 0xffbd, 0xffd5, 0xffef, 0xfea2, 0xfdcd,
0xfdd5, 0xfcc1, 0xfdd8, 0xfddc, 0xff82, 0x0048, 0x013b, 0x00b1,
0x003d, 0xfe8e, 0xfd4d, 0xfc15, 0xfaa4, 0xfcdd, 0xfd88, 0xff63,
0x00ee, 0x010f, 0x00b5, 0x00ec, 0xfec2, 0xfd9a, 0xfc12, 0xfafe,
0xfcd9, 0xfd83, 0xff61, 0x00de, 0x0109, 0x00e0, 0x009d, 0xff6e,
0xfe03, 0xfd4f, 0xfd05, 0xfd0d, 0xfd96, 0xfe44, 0x0003, 0xffe0,
0x0013, 0xff4c, 0xfd95, 0xfe62, 0xfde4, 0xfef8, 0x0046, 0xffdc,
0x003f, 0xfef7, 0xfde2, 0xfd7c, 0xfcd9, 0xfcf8, 0xfd9a, 0xff58,
0x0035, 0x013c, 0x010c, 0x0104, 0xffae, 0xfd7a, 0xfd13, 0xfb33,
0xfbf5, 0xfd40, 0xfe1c, 0x0081, 0x013b, 0x00e6, 0x009e, 0xffe0,
0xfe00, 0xfce5, 0xfce3, 0xfce6, 0xfd11, 0xfe59, 0x0052, 0x00d9,
0x010d, 0x00d9, 0xfffb, 0xfe7f, 0xfe14, 0xfe23, 0xfde5, 0xfe0d,
0xfe03, 0xffd9, 0x0015, 0xfe47, 0xfdff, 0xfdee, 0xfe17, 0xfdd0,
0xfed4, 0x0099, 0x0005, 0x0016, 0xffc1, 0xfe5c, 0xfd53, 0xfd1e,
0xfd2d, 0xfd1a, 0xfe25, 0xffa4, 0x00e0, 0x00f1, 0x00c9, 0x0044,
0xfe33, 0xfd74, 0xfc4d, 0xfc06, 0xfcf3, 0xfdab, 0xfff9, 0x00bf,
0x00ff, 0x00b8, 0x0047, 0xfec5, 0xfd62, 0xfd4a, 0xfce8, 0xfcfd,
0xfd8f, 0xff7a, 0x002f, 0x000d, 0x0038, 0xffe0, 0xfea0, 0xfddb,
0xfe05, 0xfde5, 0xfe76, 0xfe05, 0xff9a, 0xffed, 0xfded, 0xfe06,
0xfe02, 0xfe02, 0xfdfb, 0xff16, 0x0018, 0x0027, 0xffd9, 0xffe6,
0xff46, 0xfd77, 0xfce9, 0xfcd7, 0xfce1, 0xfd38, 0xfea5, 0x0098,
0x0121, 0x0112, 0x00b6, 0xff7d, 0xfd8c, 0xfd31, 0xfb8d, 0xfc24,
0xfd82, 0xfe1e, 0xffdd, 0x007d, 0x013f, 0x00a5, 0xffb6, 0xfe29,
0xfd83, 0xfcf7, 0xfcfd, 0xfdae, 0xfea4, 0xfffc, 0x0006, 0xffbf,
0x001b, 0xfede, 0xfdf5, 0xfe09, 0xfe12, 0xfdbd, 0xfead, 0xffec,
0xfff8, 0xff0a, 0xfdc4, 0xfe37, 0xfe10, 0xfdcf, 0xff0d, 0x0034,
0x004a, 0x00e6, 0x0077, 0xffed, 0xfe3d, 0xfd04, 0xfd20, 0xfd17,
0xfd1b, 0xfdb4, 0xffaf, 0x0120, 0x014d, 0x0122, 0x0046, 0xfe67,
0xfd42, 0xfd0d, 0xfcf5, 0xfcff, 0xfdda, 0xff68, 0x0034, 0x0122,
0x0098, 0x002f, 0xff16, 0xfdb9, 0xfd7c, 0xfcff, 0xfe59, 0xfddb,
0xff78, 0x0011, 0xffff, 0xffcb, 0xfe30, 0xfe06, 0xfe30, 0xfe45,
0xfe44, 0xffeb, 0xffaf, 0x0007, 0xfe87, 0xfe09, 0xfe0f, 0xfd0d,
0xfdc5, 0xfe6c, 0x0036, 0x0046, 0x010b, 0x010f, 0x004e, 0xff37,
0xfd79, 0xfcfd, 0xfd54, 0xfd04, 0xfda0, 0xff60, 0x0090, 0x012d,
0x0121, 0x00c9, 0xff54, 0xfdd7, 0xfd06, 0xfd10, 0xfd32, 0xfd99,
0xfe59, 0xffa0, 0x003f, 0xffe5, 0xffef, 0xffc7, 0xfe4a, 0xfe0b,
0xfdff, 0xfe24, 0xfe15, 0xff0c, 0x001c, 0xffee, 0xffb4, 0xfded,
0xfe2f, 0xfe24, 0xfdd5, 0xfec8, 0xffe7, 0xffd6, 0x0020, 0xff9f,
0xfe18, 0xfe12, 0xfd17, 0xfcfe, 0xfdc7, 0xfe96, 0xffbd, 0x004b,
0x00fc, 0x00ab, 0xff40, 0xfe0c, 0xfd4b, 0xfcfd, 0xfcfb, 0xfd3b,
0xfe6a, 0xffea, 0x00bc, 0x014d, 0x00d8, 0x0038, 0xfe92, 0xfda8,
0xfcf7, 0xfcde, 0xfd7c, 0xfdfa, 0xffb5, 0x0019, 0xfff5, 0x000e,
0x0023, 0xfeff, 0xfe07, 0xfe2f, 0xfe52, 0xfe1c, 0xff52, 0x0017,
0xffec, 0xfe93, 0xfdf2, 0xfe5d, 0xfe1b, 0xfdf5, 0xfe07, 0xffdb,
0x003c, 0x0005, 0x0046, 0xfedf, 0xfde1, 0xfd58, 0xfce7, 0xfd4b,
0xfde8, 0xffbc, 0x001a, 0x00b6, 0x00bf, 0x0001, 0xfedf, 0xfd9a,
0xfd05, 0xfcfe, 0xfcec, 0xfd55, 0xff80, 0x0061, 0x010d, 0x010a,
0x00a2, 0xffa8, 0xfe0b, 0xfd24, 0xfd1f, 0xfce6, 0xfdb5, 0xfe62,
0xffed, 0x0028, 0xfff0, 0x000d, 0xfe13, 0xfdcb, 0xfe0b, 0xfdf0,
0xfdf0, 0xff2e, 0x005f, 0xffd0, 0xfe26, 0xfe19, 0xfde8, 0xfe11,
0xfdff, 0xfe77, 0xffdd, 0xffef, 0xffec, 0x002d, 0xffcc, 0xfe0b,
0xfdd6, 0xfd18, 0xfd06, 0xfd8c, 0xfee2, 0x0020, 0x003b, 0x0112,
0x002e, 0xffeb, 0xfe80, 0xfd04, 0xfd04, 0xfcf3, 0xfdae, 0xfe5d,
0xffb4, 0x006c, 0x0112, 0x0097, 0xfff2, 0xfeb3, 0xfde7, 0xfd7d,
0xfd38, 0xfe3c, 0xfd79, 0xff34, 0x002e, 0x001c, 0x000b, 0xfe68,
0xfdbf, 0xfe02, 0xfdef, 0xfdf9, 0xff98, 0x007c, 0xff9e, 0xfdfe,
0xfdfc, 0xfdf3, 0xfdeb, 0xfdf3, 0xfdda, 0xff3f, 0x0038, 0x0044,
0x000d, 0x0028, 0xfedf, 0xfdba, 0xfd3e, 0xfcfc, 0xfd4f, 0xfded,
0xff85, 0xfff2, 0x011d, 0x00e4, 0x0024, 0xff7f, 0xfdc3, 0xfd43,
0xfce8, 0xfdad, 0xfe00, 0xff4c, 0x0066, 0xfffc, 0x0007, 0x0015,
0xff12, 0xfde3, 0xfe4a, 0xfdc8, 0xfe26, 0xfe11, 0xfebd, 0x004a,
0x0004, 0x0039, 0xfe77, 0xfdce, 0xfe04, 0xfe55, 0xffc5, 0x0010,
0x001e, 0x004f, 0xff5d, 0xfe02, 0xfe0e, 0xfde0, 0xfe08, 0xfdc9,
0xfe6d, 0xffe3, 0x007b, 0x0132, 0x0024, 0xff9c, 0xfe27, 0xfdad,
0xfd18, 0xfcd7, 0xfda6, 0xfe89, 0x0022, 0x0011, 0x00fa, 0x002a,
0xfff9, 0xfe56, 0xfdb3, 0xfd46, 0xfcee, 0xfde1, 0xfe88, 0x0009,
0x0024, 0xfffa, 0x0017, 0xffe0, 0xfe20, 0xfde0, 0xfe12, 0xfe13,
0xfdc0, 0xff27, 0x0053, 0x001b, 0xff83, 0xfdfb, 0xfe05, 0xfdcd,
0xfdee, 0xffb3, 0xfff5, 0xfff4, 0x001c, 0x0001, 0xfe8c, 0xfdf1,
0xfd5f, 0xfd01, 0xfe4e, 0xfdaf, 0xff6e, 0x0004, 0xffdd, 0x001e,
0xffed, 0xff22, 0xfd9f, 0xfd5e, 0xfccb, 0xfd57, 0xfdf5, 0xff9b,
0xffeb, 0x001a, 0x0031, 0x0019, 0xff31, 0xfdaf, 0xfe31, 0xfd7b,
0xfde4, 0xfe16, 0xff22, 0x0048, 0xffce, 0x0007, 0xffe1, 0xfe57,
0xfdb9, 0xfde4, 0xfe42, 0xfde9, 0xfedd, 0x0019, 0x0011, 0xff07,
0xfdf6, 0xfe0a, 0xfe02, 0xfdd2, 0xfee2, 0x0016, 0xffe7, 0x000c,
0x0011, 0xff3b, 0xfdca, 0xfe14, 0xfcd5, 0xfdc7, 0xfdd7, 0xff06,
0x0031, 0x0009, 0x00c0, 0xffb8, 0xffd6, 0xfe11, 0xfdc2, 0xfcfa,
0xfce9, 0xfda2, 0xfe16, 0xff91, 0x0006, 0xfff0, 0x0003, 0x0001,
0xfe7c, 0xfe0d, 0xfe43, 0xfdcd, 0xfdde, 0xfed5, 0x0050, 0xffc1,
0x0012, 0xffee, 0xfe1b, 0xfdc3, 0xfdf7, 0xfe2f, 0xfdec, 0xfefc,
0x0029, 0xffe3, 0xfe30, 0xfde3, 0xfe01, 0xfde4, 0xfe0d, 0xfe2f,
0xffc0, 0xffe4, 0xffe6, 0x000c, 0xffa6, 0xfdfd, 0xfdb1, 0xfd39,
0xfcbc, 0xfde0, 0xfe4d, 0x0008, 0xffdb, 0x000d, 0xffe1, 0x0009,
0xfefb, 0xfda7, 0xfde4, 0xfcc1, 0xfe01, 0xfdd2, 0xff78, 0x0013,
0x001a, 0x000d, 0xffef, 0xff7a, 0xfdb8, 0xfe4b, 0xfdac, 0xfe29,
0xfdc8, 0xff24, 0xfffa, 0x0006, 0xff7a, 0xfe0a, 0xfe29, 0xfdc7,
0xfdda, 0xfee1, 0x0018, 0xffd7, 0x003a, 0xfee9, 0xfdc5, 0xfe3a,
0xfdc9, 0xfe25, 0xfd91, 0xfead, 0xfff4, 0xfffd, 0xffed, 0xffd0,
0xff52, 0xfde6, 0xfdba, 0xfd16, 0xfe41, 0xfe11, 0xff04, 0x000d,
0xffb4, 0xffd3, 0xffca, 0xffc5, 0xfdf5, 0xfe06, 0xfd2b, 0xfdc2,
0xfe21, 0xfdda, 0xffa4, 0x0027, 0xffe6, 0x0048, 0xffb3, 0xfe37,
0xfe0f, 0xfdd2, 0xfdde, 0xfe09, 0xfe76, 0x000d, 0xff6d, 0xfe1f,
0xfdf5, 0xfe2c, 0xfdfb, 0xfe1e, 0xffcf, 0xffe4, 0x0017, 0xfff0,
0x0019, 0xfee9, 0xfe02, 0xfe33, 0xfdf2, 0xfe0a, 0xfe64, 0x002a,
0x0014, 0xfffc, 0xffce, 0x0025, 0xfea9, 0xfdd7, 0xfe2f, 0xfe16,
0xfe05, 0xfdea, 0xfff6, 0xffe3, 0xffd7, 0xfff1, 0x002c, 0xff00,
0xfdec, 0xfe68, 0xfe2d, 0xfe03, 0xfdd6, 0xfeb3, 0xffc7, 0xfff3,
0x003a, 0x0014, 0xfe7e, 0xfdc2, 0xfdcd, 0xfdf7, 0xfdc9, 0xfede,
0x0005, 0xff44, 0xfd9b, 0xfdf5, 0xfe0d, 0xfddc, 0xfdea, 0xfe50,
0xffc9, 0xfffa, 0x0003, 0x000d, 0xff54, 0xfddd, 0xfe20, 0xfde4,
0xfe08, 0xfdcc, 0xff62, 0x0021, 0xffeb, 0x0024, 0xfff7, 0xff80,
0xfe1d, 0xfe08, 0xfdb4, 0xfe5b, 0xfd9a, 0xfef7, 0xffc3, 0xffef,
0x0008, 0xffe8, 0xff6a, 0xfd97, 0xfe53, 0xfdc6, 0xfe17, 0xfdac,
0xfe66, 0xffef, 0xffea, 0x002b, 0xfff0, 0xfe79, 0xfda8, 0xfe6d,
0xfd54, 0xfe36, 0xfe52, 0x0069, 0xff1c, 0xfe76, 0xfd94, 0xff63,
0x0376, 0xff8a, 0x000d, 0xffd4, 0x0020, 0x001e, 0xffeb, 0xfff9,
0xffdf, 0x0037, 0xffec, 0xfff4, 0x000b, 0xfff7, 0xffbd, 0xffe6,
0x0001, 0x0031, 0xffcf, 0x000b, 0xffb9, 0xffe2, 0xfff8, 0xffd3,
0x0027, 0x0001, 0xfff0, 0x0014, 0x0011, 0xffea, 0xffd7, 0xffd9,
0xfff7, 0x0072, 0x0035, 0x0009, 0x001a, 0x005d, 0x000d, 0xffda,
0xffeb, 0xfff1, 0x0039, 0x0015, 0xffe5, 0xffd6, 0xfff8, 0xfff0,
0xfff2, 0xfff4, 0xffd7, 0xffd2, 0x0017, 0x0017, 0xffdb, 0x0010,
0xfffe, 0xfffa, 0xffeb, 0x0012, 0x0005, 0xffcb, 0x0008, 0xfff2,
0xfff5, 0xfff9, 0x001c, 0x0013, 0xfff9, 0xffd6, 0x0018, 0x0037,
0x0022, 0x0000, 0x0000, 0x0026, 0xfff4, 0x0009, 0x0019, 0xffed,
0x000d, 0x000f, 0xffff, 0xffd0, 0xffd8, 0x0012, 0x0005, 0xfffd,
0xffed, 0xfff9, 0xfff5, 0xfff9, 0xfff2, 0x0021, 0xfffe, 0xfff7,
0xfffb, 0x0005, 0x0004, 0xfff1, 0x0009, 0xfffe, 0xfff8, 0xfffd,
0x0003, 0xfffe, 0x0001, 0xfff5, 0x0000, 0x0001, 0x0008, 0x0005,
0xffff, 0xfffb, 0xffff, 0x0004, 0x0007, 0x0000, 0xffff, 0xffff,
0x0000, 0x0003, 0xfffe, 0x0000, 0x0001, 0x0001, 0xffff, 0x0001,
0xffff, 0x0001, 0xfffd, 0x0000, 0xffff, 0x0001, 0x0001, 0x0000,
0xfffe, 0xffff, 0x0000, 0x0001, 0x0001, 0xffff, 0x0001, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0xffff,
0x0000, 0x0000, 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0xffff,
0
};
 
 
#define NSAMPLES 12748
#define NSAMPLE_WORDS 6375
#define NSAMPLE_WORDS 12748
 
 
#endif
/sw/host/Makefile
39,20 → 39,22
##
##
all:
PROGRAMS := wbregs readflash zipload buildsamples dumpuart
PROGRAMS := wbregs readflash zipload dumpuart
all: $(PROGRAMS)
 
CXX := g++
OBJDIR := obj-pc
# BUSSRCS:= deppbus.cpp regdefs.cpp
BUSSRCS:= deppi.cpp regdefs.cpp llcomms.cpp ttybus.cpp
SOURCES:= wbregs.cpp readflash.cpp zipload.cpp flashdrvr.cpp # flashload.cpp/ziprun.cpp
BUSSRCS:= deppi.cpp regdefs.cpp llcomms.cpp ttybus.cpp byteswap.cpp
CPUSRCS:= zipelf.cpp
SOURCES:= wbregs.cpp readflash.cpp zipload.cpp flashdrvr.cpp
ALLSRCS:= $(SOURCES) $(CPUSRCS) $(BUSSRCS)
ADEPT := ../../../refs/digilent.adept.sdk_2.3.1
HEADERS:= deppbus.h devbus.h flashdrvr.h regdefs.h twoc.h
OBJECTS:= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(SOURCES)))
OBJECTS:= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(ALLSRCS)))
BUSOBJS:= $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(BUSSRCS)))
CFLAGS := -g -Wall -I$(ADEPT)/inc -I.
LIBS := -L /usr/lib64/digilent/adept -ldmgr -ldepp
LIBS := -L /usr/local/lib64/digilent/adept -ldmgr -ldepp -ldpcomm -ldftd2xx -ldabs
 
%.o: $(OBJDIR)/ $(OBJDIR)/%.o
$(OBJDIR)/%.o: %.cpp
65,21 → 67,21
wbregs: $(OBJDIR)/wbregs.o $(BUSOBJS)
$(CXX) $(CFLAGS) $^ $(LIBS) -o $@
 
scope: $(OBJDIR)/scope.o $(BUSOBJS)
$(CXX) $(CFLAGS) $^ $(LIBS) -o $@
 
readflash: $(OBJDIR)/readflash.o $(BUSOBJS)
$(CXX) $(CFLAGS) $^ $(LIBS) -o $@
 
zipload: $(OBJDIR)/zipload.o $(OBJDIR)/flashdrvr.o $(BUSOBJS)
zipload: $(OBJDIR)/zipload.o $(OBJDIR)/flashdrvr.o $(BUSOBJS) $(OBJDIR)/zipelf.o
$(CXX) $(CFLAGS) $^ $(LIBS) -lelf -o $@
 
buildsamples: buildsamples.cpp
$(CXX) $(CFLAGS) $^ -o $@
 
dumpuart: dumpuart.cpp
$(CXX) $(CFLAGS) $^ -o $@
 
define build-depends
@echo "Building dependency file(s)"
@$(CXX) $(CFLAGS) -MM $(SOURCES) $(BUSSRCS) > $(OBJDIR)/xdepends.txt
@$(CXX) $(CFLAGS) -MM $(ALLSRCS) > $(OBJDIR)/xdepends.txt
@sed -e 's/^.*.o: /$(OBJDIR)\/&/' < $(OBJDIR)/xdepends.txt > $(OBJDIR)/depends.txt
@rm $(OBJDIR)/xdepends.txt
endef
/sw/host/deppi.cpp
52,14 → 52,67
#include "llcomms.h"
#include "deppi.h"
 
DEPPI::DEPPI(char *szSel) {
if (!DmgrOpen(&m_dev, szSel)) {
fprintf(stderr, "Open failed!\n");
FILE *dbgfp = stderr;
 
DEPPI::DEPPI(const char *szSel) {
if ((!szSel)||(szSel[0] == '\0')) {
// Number of digilent devcies on a system
int pcdvc;
 
// Go fish and try to find the device
DmgrEnumDevices(&pcdvc);
 
if (pcdvc < 0) {
depperr();
exit(EXIT_FAILURE);
}
 
//
int found = 0; // Number of devices found mtg our criteria
DVC dvcinfo; // A structure to receive device info
int foundid=-1; // The id number of the device we found
 
//
for(int devid=0; devid < pcdvc; devid++) {
DmgrGetDvc(devid, &dvcinfo);
// fprintf(dbgfp, "DEVICE NAME: %s\n", dvcinfo.szName);
if (strcmp(dvcinfo.szName, "CmodS6")==0) {
found++;
// fprintf(dbgfp, "Found a CMOD!\n");
foundid = devid;
}
}
 
if (found == 0) {
fprintf(stderr, "No CModS6 devices found\n");
exit(EXIT_FAILURE);
} else if (found > 1) {
fprintf(stderr, "More than one CModS6 device found. Please consider opening your\n");
fprintf(stderr, "device with a valid serial number instead.\n");
exit(EXIT_FAILURE);
}
 
DmgrGetDvc(foundid, &dvcinfo);
if (!DmgrOpen(&m_dev, dvcinfo.szConn)) {
fprintf(stderr, "Could not open device!\n");
depperr();
exit(EXIT_FAILURE);
}
 
//
DmgrFreeDvcEnum();
} else if (!DmgrOpen(&m_dev, (char *)szSel)) {
// We know the device serial number, so go open that particular
// device
fprintf(stderr, "Named device open (DmgrOpen) failed!\n");
depperr();
exit(EXIT_FAILURE);
}
 
if (!DeppEnable(m_dev)) {
fprintf(stderr, "Could not enable DEPP interface\n");
fprintf(stderr, "Could not enable DEPP interface to (opened) device\n");
 
depperr();
exit(EXIT_FAILURE);
}
 
83,10 → 136,15
void DEPPI::depperr(void) {
ERC erc = DmgrGetLastError();
if(erc != ercNoErc) {
char scode[cchErcMax], msg[cchErcMsgMax];
DmgrSzFromErc(erc, scode, msg);
fprintf(stderr, "ErrCode : %s\n", scode);
fprintf(stderr, "ErrMessage: %s\n", msg);
char scode[cchErcMax], smsg[cchErcMsgMax];
DmgrSzFromErc(erc, scode, smsg);
fprintf(stderr, "ErrCode(%d): %s\n", erc, scode);
fprintf(stderr, "ErrMessage: %s\n", smsg);
 
if (erc == ercCapabilityConflict) {
fprintf(stderr, "Do you have the hardware manager in Vivado open?\n");
fprintf(stderr, "That could cause this conflict.\n");
}
close();
exit(EXIT_FAILURE);
}
94,8 → 152,9
 
void DEPPI::write(char *buf, int len) {
bool good = true;
const bool dbg = false;
 
if (false) {
if (dbg) {
// Debug code--write one at a time
fputs("WR: ", stdout);
for(int i=0; i<len; i++) {
115,10 → 174,11
int DEPPI::read(char *buf, int len, int timeout_ms) {
int left = len, nr=0;
struct timespec now, later;
const bool dbg = false;
 
clock_gettime(CLOCK_MONOTONIC, &now);
 
// printf("USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
if (dbg) fprintf(dbgfp, "USBI::read(%d) (FIFO is %d-%d)\n", len, m_rend, m_rbeg);
nr = pop_fifo(buf, left);
left -= nr;
127,7 → 187,7
nr = pop_fifo(&buf[len-left], left);
left -= nr;
 
// printf("\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
if (dbg) fprintf(dbgfp, "\tWHILE (nr = %d, LEFT = %d, len=%d)\n", nr, left, len);
if (nr == 0)
break;
#define TIMEOUT
151,7 → 211,7
#endif
}
 
// printf("READ %d characters (%d req, %d left)\n", len-left, len, left);
if(dbg) fprintf(dbgfp, "READ %d characters (%d req, %d left)\n", len-left, len, left);
return len-left;
}
 
159,7 → 219,10
int empty = RCV_BUFMASK - ((m_rbeg - m_rend)&(RCV_BUFMASK));
int len = clen;
bool good = true;
const bool dbg = false;
 
 
if (dbg) fprintf(dbgfp, "DEPPI::raw_read(len=%d)\n", clen);
if (len > empty)
len = empty;
if (len > 0) {
177,7 → 240,7
}
} else
good = good && DeppGetRegRepeat(m_dev, 0, (unsigned char *)m_rxbuf, ln, false);
// fprintf(stdout, "Pushing to FIFO\n");
if(dbg) fprintf(dbgfp, "DEPP: Pushing to FIFO\n");
push_fifo(m_rxbuf, ln);
len -= ln;
}
187,31 → 250,39
}
 
void DEPPI::flush_read(void) {
while(poll(4)) {
const bool dbg = false;
 
if (dbg) fprintf(dbgfp, "DEPPI::FLUSH-READ()\n");
 
do {
m_rbeg = m_rend = 0;
}
} while(poll(4));
 
if (dbg) fprintf(dbgfp, "DEPPI::FLUSH-READ() -- COMPLETE\n");
}
 
void DEPPI::push_fifo(char *buf, int len) {
char last = 0;
char *sptr = buf;
const bool dbg = false;
 
// fprintf(stdout, "PUSH(%d)\n", len);
if (dbg) fprintf(dbgfp, "DEPP::PUSH(%d)\n", len);
 
if (m_rbeg != m_rend)
last = m_rbuf[(m_rbeg-1)&RCV_BUFMASK];
if (dbg) fprintf(dbgfp, "DEPPI::PUSH() last=%d, rbeg=%d, rend=%d\n", last, m_rbeg, m_rend);
for(int i=0; i<len; i++) {
char v = *sptr++;
if (((v & 0x80)||((unsigned char)v < 0x10))&&(v == last)) {
// Skipp any stuff bytes
// fprintf(stderr, "SKIPPING-1: %02x\n", v & 0x0ff);
if (dbg) fprintf(dbgfp, "SKIPPING-1: %02x\n", v & 0x0ff);
} else if ((unsigned char)v == 0x0ff) {
// Skipp any not-yet-ready bytes
// fprintf(stdout, "SKIPPING-2: %02x\n", 0x0ff);
if (dbg) fprintf(dbgfp, "SKIPPING-2: %02x\n", 0x0ff);
} else {
m_rbuf[m_rbeg] = v;
// fprintf(stdout, "PUSHING: %02x %c\n", v&0x0ff,
// isprint(v)?v:'.');
if (dbg) fprintf(dbgfp, "PUSHING: 0x%02x \'%c\'\n",
v&0x0ff, isprint(v)?v:'.');
m_rbeg = (m_rbeg+1)&(RCV_BUFMASK);
} last = v;
}
221,9 → 292,10
int avail = (m_rbeg - m_rend)&(RCV_BUFMASK);
int left = len;
int nr = 0;
const bool dbg = false;
 
// printf("Attempting to pop %d items from FIFO (%d - %d)\n",
// len, m_rend, m_rbeg);
if (dbg) fprintf(dbgfp, "Attempting to pop %d items from FIFO (%d - %d)\n",
len, m_rend, m_rbeg);
while((avail > 0)&&(left > 0)) {
int ln = RCV_BUFLEN-m_rend;
if (ln > left)
244,10 → 316,11
bool DEPPI::poll(unsigned ms) {
int avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
bool r = true;
const bool dbg = false;
 
// printf("POLL\n");
if (dbg) fprintf(dbgfp, "POLL\n");
if ((avail < 2)&&((avail<1)||(m_rbuf[m_rend]&0x80)||(m_rbuf[m_rend]<0x10))) {
// printf("POLL -- CALLS RAW READ\n");
if (dbg) fprintf(dbgfp, "POLL -- CALLS RAW READ\n");
raw_read(4,ms);
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
 
259,7 → 332,7
if (avail == ((m_rbeg-m_rend)&(RCV_BUFMASK)))
break; // We didn't read anything more
avail = (m_rbeg-m_rend)&(RCV_BUFMASK);
// printf("POLL/LOOP -- %d available\n", avail);
if (dbg) fprintf(dbgfp, "POLL/LOOP -- %d available\n", avail);
}
if (avail < 1)
r = false;
267,7 → 340,7
r = false;
} else r = false;
}
// printf("POLL -- is %s\n", (r)?"true":"false");
if (dbg) fprintf(dbgfp, "POLL -- is %s\n", (r)?"true":"false");
 
return r;
}
/sw/host/deppi.h
52,6 → 52,9
#define RCV_BUFLEN 512
#define RCV_BUFMASK (RCV_BUFLEN-1)
 
// #define S6SN "SN:210282768825"
#define S6SN ""
 
#include "llcomms.h"
 
class DEPPI : public LLCOMMSI { // DEPP Interface
69,7 → 72,7
void depperr(void);
 
public:
DEPPI(char *szSel);
DEPPI(const char *szSel);
~DEPPI(void);
 
virtual void close(void);
/sw/host/dumpuart.cpp
54,7 → 54,21
const char *fname = (argc>=3)?argv[2]:NULL;
int ttyfd = -1, dumpfd = -1;
 
if (argc < 2) {
fprintf(stderr, "USAGE: dumpuart /dev/tty... \n");
exit(EXIT_FAILURE);
}
 
ttyfd = open(dev, O_RDONLY);
if (ttyfd < 0) {
fprintf(stderr, "Could not open device, %s\n", dev);
exit(EXIT_FAILURE);
}
if (!isatty(ttyfd)) {
fprintf(stderr, "Err: %s is not a terminal!\n", dev);
exit(EXIT_FAILURE);
}
 
if (fname)
dumpfd = open(fname, O_CREAT|O_TRUNC|O_WRONLY, 0644);
 
/sw/host/flashdrvr.cpp
11,7 → 11,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016, Gisselquist Technology, LLC
// Copyright (C) 2016-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
23,6 → 23,11
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory. Run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
30,9 → 35,9
////////////////////////////////////////////////////////////////////////////////
//
//
//
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <strings.h>
#include <ctype.h>
43,6 → 48,7
#include "devbus.h"
#include "regdefs.h"
#include "flashdrvr.h"
#include "byteswap.h"
 
const bool HIGH_SPEED = false;
 
74,11 → 80,11
}
 
bool FLASHDRVR::erase_sector(const unsigned sector, const bool verify_erase) {
DEVBUS::BUSW page[SZPAGE];
DEVBUS::BUSW page[SZPAGEW];
 
printf("Erasing sector: %08x\n", sector);
if (m_debug) printf("Erasing sector: %08x\n", sector);
m_fpga->writeio(R_QSPI_EREG, DISABLEWP);
m_fpga->writeio(R_QSPI_EREG, ERASEFLAG + sector);
m_fpga->writeio(R_QSPI_EREG, ERASEFLAG + (sector>>2));
 
// If we're in high speed mode and we want to verify the erase, then
// we can skip waiting for the erase to complete by issueing a read
88,19 → 94,21
if ((!HIGH_SPEED)||(!verify_erase)) {
flwait();
 
printf("@%08x -> %08x\n", R_QSPI_EREG,
if (m_debug) {
printf("@%08x -> %08x\n", R_QSPI_EREG,
m_fpga->readio(R_QSPI_EREG));
printf("@%08x -> %08x\n", R_QSPI_SREG,
m_fpga->readio(R_QSPI_SREG));
printf("@%08x -> %08x\n", sector,
printf("@%08x -> %08x\n", R_QSPI_SREG,
m_fpga->readio(R_QSPI_SREG));
printf("@%08x -> %08x\n", sector,
m_fpga->readio(sector));
}
}
 
// Now, let's verify that we erased the sector properly
if (verify_erase) {
for(int i=0; i<NPAGES; i++) {
m_fpga->readi(sector+i*SZPAGE, SZPAGE, page);
for(int i=0; i<SZPAGE; i++)
m_fpga->readi(sector+i*SZPAGEW, SZPAGEW, page);
for(int i=0; i<SZPAGEW; i++)
if (page[i] != 0xffffffff)
return false;
}
109,41 → 117,54
return true;
}
 
bool FLASHDRVR::write_page(const unsigned addr, const unsigned len,
const unsigned *data, const bool verify_write) {
DEVBUS::BUSW buf[SZPAGE];
bool FLASHDRVR::page_program(const unsigned addr, const unsigned len,
const char *data, const bool verify_write) {
DEVBUS::BUSW buf[SZPAGEW], bswapd[SZPAGEW];
 
assert(len > 0);
assert(len <= PGLEN);
assert(len <= PGLENB);
assert(PAGEOF(addr)==PAGEOF(addr+len-1));
 
if (len <= 0)
return true;
 
// Write the page
m_fpga->writeio(R_ICONTROL, ISPIF_DIS);
m_fpga->clear();
m_fpga->writeio(R_ICONTROL, ISPIF_EN);
printf("Writing page: 0x%08x - 0x%08x\n", addr, addr+len-1);
m_fpga->writeio(R_QSPI_EREG, DISABLEWP);
m_fpga->writei(addr, len, data);
bool empty_page = true;
for(unsigned i=0; i<len; i+=4) {
DEVBUS::BUSW v;
v = buildword((const unsigned char *)&data[i]);
bswapd[(i>>2)] = v;
if (v != 0xffffffff)
empty_page = false;
}
 
// If we're in high speed mode and we want to verify the write, then
// we can skip waiting for the write to complete by issueing a read
// command immediately. As soon as the write completes the read will
// begin sending commands back. This allows us to recover the lost
// time between the interrupt and the next command being received.
flwait();
if (!empty_page) {
// Write the page
m_fpga->writeio(R_ICONTROL, ISPIF_DIS);
m_fpga->clear();
m_fpga->writeio(R_ICONTROL, ISPIF_EN);
printf("Writing page: 0x%08x - 0x%08x\r", addr, addr+len-1);
m_fpga->writeio(R_QSPI_EREG, DISABLEWP);
m_fpga->writei(addr, (len>>2), bswapd);
fflush(stdout);
 
// If we're in high speed mode and we want to verify the write,
// then we can skip waiting for the write to complete by
// issueing a read command immediately. As soon as the write
// completes the read will begin sending commands back. This
// allows us to recover the lost time between the interrupt and
// the next command being received.
flwait();
}
// if ((!HIGH_SPEED)||(!verify_write)) { }
if (verify_write) {
// printf("Attempting to verify page\n");
// NOW VERIFY THE PAGE
m_fpga->readi(addr, len, buf);
for(unsigned i=0; i<len; i++) {
if (buf[i] != data[i]) {
printf("\nVERIFY FAILS[%d]: %08x\n", i, i+addr);
m_fpga->readi(addr, len>>2, buf);
for(unsigned i=0; i<(len>>2); i++) {
if (buf[i] != bswapd[i]) {
printf("\nVERIFY FAILS[%d]: %08x\n", i, (i<<2)+addr);
printf("\t(Flash[%d]) %08x != %08x (Goal[%08x])\n",
i, buf[i], data[i], i+addr);
(i<<2), buf[i], bswapd[i], (i<<2)+addr);
return false;
}
} // printf("\nVerify success\n");
151,47 → 172,38
}
 
bool FLASHDRVR::write(const unsigned addr, const unsigned len,
const unsigned *data, const bool verify) {
const char *data, const bool verify) {
// Work through this one sector at a time.
// If this buffer is equal to the sector value(s), go on
// If not, erase the sector
 
/*
fprintf(stderr, "FLASH->write(%08x, %d, ..., %s)\n", addr, len,
(verify)?"Verify":"");
*/
// m_fpga->writeio(R_QSPI_CREG, 2);
// m_fpga->readio(R_VERSION); // Read something innocuous
// m_fpga->writeio(R_QSPI_SREG, 0);
// m_fpga->readio(R_VERSION); // Read something innocuous
 
for(unsigned s=SECTOROF(addr); s<SECTOROF(addr+len+SECTORSZ-1); s+=SECTORSZ) {
// printf("IN LOOP, s=%08x\n", s);
for(unsigned s=SECTOROF(addr); s<SECTOROF(addr+len+SECTORSZB-1);
s+=SECTORSZB) {
// Do we need to erase?
bool need_erase = false;
bool need_erase = false, need_program = false;
unsigned newv = 0; // (s<addr)?addr:s;
{
DEVBUS::BUSW *sbuf = new DEVBUS::BUSW[SECTORSZ];
const DEVBUS::BUSW *dp;
char *sbuf = new char[SECTORSZB];
const char *dp; // pointer to our "desired" buffer
unsigned base,ln;
 
base = (addr>s)?addr:s;
ln=((addr+len>s+SECTORSZ)?(s+SECTORSZ):(addr+len))-base;
m_fpga->readi(base, ln, sbuf);
ln=((addr+len>s+SECTORSZB)?(s+SECTORSZB):(addr+len))-base;
m_fpga->readi(base, ln>>2, (uint32_t *)sbuf);
byteswapbuf(ln>>2, (uint32_t *)sbuf);
 
dp = &data[base-addr];
for(unsigned i=0; i<ln; i++) {
if ((sbuf[i]&dp[i]) != dp[i]) {
printf("\nNEED-ERASE @0x%08x ... %08x != %08x (Goal)\n",
i+base-addr, sbuf[i], dp[i]);
if (m_debug) {
printf("\nNEED-ERASE @0x%08x ... %08x != %08x (Goal)\n",
i+base-addr, sbuf[i], dp[i]);
}
need_erase = true;
newv = i+base;
newv = (i&-4)+base;
break;
} else if ((sbuf[i] != dp[i])&&(newv == 0)) {
// if (newv == 0)
// printf("MEM[%08x] = %08x (!= %08x (Goal))\n",
// i+base, sbuf[i], dp[i]);
newv = i+base;
}
} else if ((sbuf[i] != dp[i])&&(newv == 0))
newv = (i&-4)+base;
}
}
 
198,10 → 210,10
if (newv == 0)
continue; // This sector already matches
 
// Just erase anyway
if (!need_erase)
printf("NO ERASE NEEDED\n");
else {
// Erase the sector if necessary
if (!need_erase) {
if (m_debug) printf("NO ERASE NEEDED\n");
} else {
printf("ERASING SECTOR: %08x\n", s);
if (!erase_sector(s, verify)) {
printf("SECTOR ERASE FAILED!\n");
208,21 → 220,25
return false;
} newv = (s<addr) ? addr : s;
}
for(unsigned p=newv; (p<s+SECTORSZ)&&(p<addr+len); p=PAGEOF(p+PGLEN)) {
 
// Now walk through all of our pages in this sector and write
// to them.
for(unsigned p=newv; (p<s+SECTORSZB)&&(p<addr+len); p=PAGEOF(p+PGLENB)) {
unsigned start = p, len = addr+len-start;
 
// BUT! if we cross page boundaries, we need to clip
// our results to the page boundary
if (PAGEOF(start+len-1)!=PAGEOF(start))
len = PAGEOF(start+PGLEN)-start;
if (!write_page(start, len, &data[p-addr], verify)) {
len = PAGEOF(start+PGLENB)-start;
if (!page_program(start, len, &data[p-addr], verify)) {
printf("WRITE-PAGE FAILED!\n");
return false;
}
}
} if ((need_erase)||(need_program))
printf("Sector 0x%08x: DONE%15s\n", s, "");
}
 
m_fpga->writeio(R_QSPI_EREG, 0); // Re-enable write protection
m_fpga->writeio(R_QSPI_EREG, ENABLEWP); // Re-enable write protection
 
return true;
}
/sw/host/flashdrvr.h
4,7 → 4,8
//
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
//
// Purpose: Flash driver. Encapsulate writing to the flash device.
// Purpose: Flash driver. Encapsulates writing, both erasing sectors and
// the programming pages, to the flash device.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
11,7 → 12,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
24,7 → 25,7
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory, run make with no
// with this program. (It's in the $(ROOT)/doc directory. Run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
44,15 → 45,16
class FLASHDRVR {
private:
DEVBUS *m_fpga;
bool m_debug;
 
void flwait(void);
public:
FLASHDRVR(DEVBUS *fpga) : m_fpga(fpga) {}
FLASHDRVR(DEVBUS *fpga) : m_fpga(fpga), m_debug(false) {}
bool erase_sector(const unsigned sector, const bool verify_erase=true);
bool write_page(const unsigned addr, const unsigned len,
const unsigned *data, const bool verify_write=true);
bool page_program(const unsigned addr, const unsigned len,
const char *data, const bool verify_write=true);
bool write(const unsigned addr, const unsigned len,
const unsigned *data, const bool verify=false);
const char *data, const bool verify=false);
};
 
#endif
/sw/host/llcomms.cpp
80,8 → 80,10
}
 
void LLCOMMSI::close(void) {
if(m_fdw>=0) ::close(m_fdw);
if((m_fdr>=0)&&(m_fdr != m_fdw)) ::close(m_fdr);
if(m_fdw>=0)
::close(m_fdw);
if((m_fdr>=0)&&(m_fdr != m_fdw))
::close(m_fdr);
m_fdw = m_fdr = -1;
}
 
97,6 → 99,10
} else return false;
}
 
int LLCOMMSI::available(void) {
return poll(0)?1:0;
}
 
TTYCOMMS::TTYCOMMS(const char *dev) {
m_fdr = ::open(dev, O_RDWR | O_NONBLOCK);
if (m_fdr < 0) {
/sw/host/llcomms.h
55,6 → 55,10
virtual void write(char *buf, int len);
virtual int read(char *buf, int len);
virtual bool poll(unsigned ms);
 
// Tests whether or not bytes are available to be read, returns a
// count of the bytes that may be immediately read
virtual int available(void); // { return 0; };
};
 
class TTYCOMMS : public LLCOMMSI {
/sw/host/readflash.cpp
72,7 → 72,7
FPGA::BUSW *buf = new FPGA::BUSW[BUFLN];
 
char szSel[64];
strcpy(szSel, "SN:210282768825");
strcpy(szSel, S6SN);
m_fpga = FPGAOPEN(szSel);
 
fprintf(stderr, "Before starting, nread = %ld\n",
/sw/host/regdefs.cpp
78,16 → 78,14
{ R_QSPI_IDREG, "QSPIID" },
{ R_QSPI_IDREG, "QSPII" },
//
{ R_CLOCK, "CLOCK" },
{ R_CLOCK, "TIME" },
{ R_TIMER, "TIMER" },
{ R_STOPWATCH, "STOPWACH" },
{ R_STOPWATCH, "STOPWATCH" },
{ R_CKALARM, "CKALARM" },
{ R_CKALARM, "ALARM" },
// { R_DATE, "DATE" },
// Scopes are defined and come and go. Be aware, therefore, not all
// of these scopes may be defined at the same time.
// The real-time-clock registers have been removed
// (they never fit in the core)
//
// The real-time-date register has been removed
// (it never fit either)
//
// The wishbone scope
//
{ R_SCOPE, "SCOPE" },
{ R_SCOPE, "SCOP" },
{ R_SCOPED, "SCOPDATA" },
95,44 → 93,8
{ R_SCOPED, "SCOPED" },
{ R_SCOPED, "SCOPD" },
//
// For working with the ICAPE interface ... if I can ever get a
// testing environment suitable to prove that it works.
// The ICAPE interface registers have been removed.
//
{ R_CFG_CRC, "FPGACRC" },
{ R_CFG_FAR_MAJ, "FPGAFARH" },
{ R_CFG_FAR_MIN, "FPGAFARL" },
{ R_CFG_FDRI, "FPGAFDRI" },
{ R_CFG_FDRO, "FPGAFDRO" },
{ R_CFG_CMD, "FPGACMD" },
{ R_CFG_CTL, "FPGACTL" },
{ R_CFG_MASK, "FPGAMASK" },
{ R_CFG_STAT, "FPGASTAT" },
{ R_CFG_LOUT, "FPGALOUT" },
{ R_CFG_COR1, "FPGACOR1" },
{ R_CFG_COR2, "FPGACOR2" },
{ R_CFG_PWRDN, "FPGAPWRDN" },
{ R_CFG_FLR, "FPGAFLR" },
{ R_CFG_IDCODE, "FPGAIDCODE" },
{ R_CFG_CWDT, "FPGACWDT" },
{ R_CFG_HCOPT, "FPGAHCOPT" },
{ R_CFG_CSBO, "FPGACSBO" },
{ R_CFG_GEN1, "FPGAGEN1" },
{ R_CFG_GEN2, "FPGAGEN2" },
{ R_CFG_GEN3, "FPGAGEN3" },
{ R_CFG_GEN4, "FPGAGEN4" },
{ R_CFG_GEN5, "FPGAGEN5" },
{ R_CFG_MODE, "FPGAMODE" },
{ R_CFG_GWE, "FPGAGWE" },
{ R_CFG_GTS, "FPGAGTS" },
{ R_CFG_MFWR, "FPGAMFWR" },
{ R_CFG_CCLK, "FPGACCLK" },
{ R_CFG_SEU, "FPGASEU" },
{ R_CFG_EXP, "FPGAEXP" },
{ R_CFG_RDBK, "FPGARDBK" },
{ R_CFG_BOOTSTS, "BOOTSTS" },
{ R_CFG_EYE, "FPGAEYE" },
{ R_CFG_CBC, "FPGACBC" },
//
{ RAMBASE, "MEM" },
{ SPIFLASH, "FLASH" }
};
/sw/host/regdefs.h
4,7 → 4,8
//
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
//
// Purpose:
// Purpose: This file defines C constants which can be used when
// communicating with the FPGA device from the PC host.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
11,7 → 12,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
38,78 → 39,41
#ifndef REGDEFS_H
#define REGDEFS_H
 
#define R_VERSION 0x00000108
#define R_ICONTROL 0x00000100
#define R_BUSERR 0x00000101
#define R_ITIMERA 0x00000102
#define R_ITIMERB 0x00000103
#define R_PWM 0x00000104
#define R_SPIO 0x00000105
#define R_GPIO 0x00000106
#define R_UART 0x00000107
#define R_ICONTROL 0x00000400
#define R_BUSERR 0x00000404
#define R_ITIMERA 0x00000408
#define R_ITIMERB 0x0000040c
#define R_PWM 0x00000410
#define R_SPIO 0x00000414
#define R_GPIO 0x00000418
#define R_UART 0x0000041c
#define R_VERSION 0x00000420
 
// WB Scope registers
#define R_SCOPE 0x00000200
#define R_SCOPED 0x00000201
#define R_SCOPE 0x00000800
#define R_SCOPED 0x00000804
//
// And because the flash driver needs these constants defined ...
#define R_QSPI_EREG 0x0000030c
#define R_QSPI_CREG 0x0000030d
#define R_QSPI_SREG 0x0000030e
#define R_QSPI_IDREG 0x0000030f
#define R_QSPI_EREG 0x00000c00
#define R_QSPI_CREG 0x00000c04
#define R_QSPI_SREG 0x00000c08
#define R_QSPI_IDREG 0x00000c0c
//
// FPGA CONFIG/ICAP REGISTERS
#define R_CFG_CRC 0x00000400
#define R_CFG_FAR_MAJ 0x00000401
#define R_CFG_FAR_MIN 0x00000402
#define R_CFG_FDRI 0x00000403
#define R_CFG_FDRO 0x00000404
#define R_CFG_CMD 0x00000405
#define R_CFG_CTL 0x00000406
#define R_CFG_MASK 0x00000407
#define R_CFG_STAT 0x00000408
#define R_CFG_LOUT 0x00000409
#define R_CFG_COR1 0x0000040a
#define R_CFG_COR2 0x0000040b
#define R_CFG_PWRDN 0x0000040c
#define R_CFG_FLR 0x0000040d
#define R_CFG_IDCODE 0x0000040e
#define R_CFG_CWDT 0x0000040f
#define R_CFG_HCOPT 0x00000410
#define R_CFG_CSBO 0x00000412
#define R_CFG_GEN1 0x00000413
#define R_CFG_GEN2 0x00000414
#define R_CFG_GEN3 0x00000415
#define R_CFG_GEN4 0x00000416
#define R_CFG_GEN5 0x00000417
#define R_CFG_MODE 0x00000418
#define R_CFG_GWE 0x00000419
#define R_CFG_GTS 0x0000041a
#define R_CFG_MFWR 0x0000041b
#define R_CFG_CCLK 0x0000041c
#define R_CFG_SEU 0x0000041d
#define R_CFG_EXP 0x0000041e
#define R_CFG_RDBK 0x0000041f
#define R_CFG_BOOTSTS 0x00000420
#define R_CFG_EYE 0x00000421
#define R_CFG_CBC 0x00000422
// RTC clock control
#define R_CLOCK 0x00000800
#define R_TIMER 0x00000801
#define R_STOPWATCH 0x00000802
#define R_CKALARM 0x00000803
 
// RAM memory space
#define RAMBASE 0x00002000
#define MEMWORDS (1<<12)
#define RAMLEN MEMWORDS
#define LGMEMSZ 14
#define RAMBASE (1<<LGMEMSZ)
#define MEMWORDS (1<<(LGMEMSZ-1))
#define RAMLEN (1<<LGMEMSZ)
 
// Flash memory space
#define SPIFLASH 0x00400000
#define FLASHWORDS (1<<22)
#define CONFIG_ADDRESS 0x00400000 // Main Xilinx configuration (ZipCPU)
#define ALTCONFIG_ADDRESS 0x440000 // Alternate Xilinx configuration (Debug)
#define RESET_ADDRESS 0x00480000 // ZipCPU Reset address
#define LGFLASHSZ 24 // Log_2 of the number of bytes in flash
#define SPIFLASH (1<<LGFLASHSZ)
#define FLASHWORDS (1<<(LGFLASHSZ-2))
#define FLASHLEN (1<<LGFLASHSZ)
#define CONFIG_ADDRESS SPIFLASH // Main Xilinx configuration (ZipCPU)
#define ALTCONFIG_ADDRESS (SPIFLASH+0x100000) // Alt Xilinx config (Dbg)
#define RESET_ADDRESS (SPIFLASH+0x200000) // ZipCPU Reset address
 
// Interrupt control constants
#define GIE 0x80000000 // Enable all interrupts
121,19 → 85,24
// Flash control constants
#define ERASEFLAG 0x80000000
#define DISABLEWP 0x10000000
#define ENABLEWP 0x00000000
 
// Sectors are defined as 64 kB (16 kW)
#define SZPAGE 64 // 256 bytes
#define PGLEN 64 // 256 bytes
#define SZPAGEB 256
#define PGLENB 256
#define SZPAGEW 64
#define PGLENW 64
#define NPAGES 256 // 64 kB sectors / 256 bytes is ...
#define SECTORSZ (NPAGES * SZPAGE)
#define NSECTORS (FLASHWORDS/SECTORSZ) // 256 sectors
#define SECTOROF(A) ((A) & (-1<<14)) // 64 kB ea
#define PAGEOF(A) ((A) & (-1<<6))
#define SECTORSZB (NPAGES * SZPAGEB) // In bytes, not words!!
#define SECTORSZW (NPAGES * SZPAGEW) // In words
#define NSECTORS (FLASHLEN/SECTORSZB) // 256 sectors
#define SECTOROF(A) ((A) & (-1<<16))
#define PAGEOF(A) ((A) & (-1<<8))
 
// Scop definition/sequences
#define SCOPE_NO_RESET 0x80000000
#define SCOPE_TRIGGER (0x08000000|SCOPE_NO_RESET)
#define SCOPE_MANUAL SCOPE_TRIGGER
#define SCOPE_DISABLE (0x04000000)
 
typedef struct {
/sw/host/ttybus.cpp
1,6 → 1,6
////////////////////////////////////////////////////////////////////////////////
//
// Filename: ttybus.cpp
// Filename: ttybus.cpp
//
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
//
8,9 → 8,9
// with a serial port (through DEPP) on an FPGA, to command the
// WISHBONE on that same FPGA to ... whatever we wish to command it to do.
//
// This code does not run on an FPGA, is not a test bench, neither is it
// a simulator. It is a portion of a command program for commanding an
// FPGA from an attached host computer.
// This code does not run on an FPGA, is not a test bench, neither
// is it a simulator. It is a portion of a command program
// for commanding an FPGA from an attached host computer.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
17,7 → 17,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
30,7 → 30,7
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory, run make with no
// with this program. (It's in the $(ROOT)/doc directory. Run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
41,7 → 41,6
////////////////////////////////////////////////////////////////////////////////
//
//
//
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
69,17 → 68,20
#define TTYC_INT '4'
#define TTYC_ERR '5'
 
const unsigned TTYBUS::MAXRDLEN = 1024;
const unsigned TTYBUS::MAXRDLEN = 64;
const unsigned TTYBUS::MAXWRLEN = 32;
 
#define DBGPRINTF null
// #define DBGPRINTF printf
// #define DBGPRINTF filedump
#ifndef DBGPRINTF
#define DBGPRINTF null
#else
#warning "TTYBUS DEBUG IS TURNED ON"
#endif
 
void null(...) {}
#include <stdarg.h>
// #include <varargs.h>
/*
 
#include <stdarg.h> // replaces the (defunct) varargs.h include file
void filedump(const char *fmt, ...) {
static FILE *dbgfp = NULL;
va_list args;
90,8 → 92,13
vfprintf(dbgfp, fmt, args);
va_end(args);
fflush(dbgfp);
 
// If you want the debug output to go to stderr as well, you can
// uncomment the next couple of lines
// va_start(args, fmt);
// vfprintf(stderr, fmt, args);
// va_end(args);
}
*/
 
char TTYBUS::charenc(const int sixbitval) const {
if (sixbitval < 10)
192,7 → 199,16
 
void TTYBUS::writev(const BUSW a, const int p, const int len, const BUSW *buf) {
char *ptr;
int nw = 0;
 
// We'll never be called with more than MAXWRLEN words to write at once.
// This is a configurable option length, set at the top of this file.
// (currently set at 32, but subject to change ...) This is important,
// as the return channel *must* be capable of holding at least this many
// acknowledgments in its buffer.
//
// assert(len <= MAXWRLEN);
 
// Allocate a buffer of six bytes per word, one for addr, plus
// six more
bufalloc((len+2)*6);
202,83 → 218,90
ptr = encode_address(a);
m_lastaddr = a; m_addr_set = true;
 
for(int i=0; i<len; i++) {
BUSW val = buf[i];
while(nw < len) {
int ln = len-nw;
if ((unsigned)ln > MAXWRLEN)
ln = MAXWRLEN;
 
int caddr = 0;
// Let's try compression
for(int i=1; i<256; i++) {
unsigned tstaddr;
tstaddr = (m_wraddr - i) & 0x0ff;
if ((!m_wrloaded)&&(tstaddr > (unsigned)m_wraddr))
break;
if (m_writetbl[tstaddr] == val) {
caddr = ( m_wraddr- tstaddr ) & 0x0ff;
break;
DBGPRINTF("WRITEV-SUB(%08x%s,#%d,&buf[%d])\n", a+nw, (p)?"++":"", ln, nw);
for(int i=0; i<ln; i++) {
BUSW val = buf[nw+i];
 
int caddr = 0;
// Let's try compression
for(int i=1; i<256; i++) {
unsigned tstaddr;
tstaddr = (m_wraddr - i) & 0x0ff;
if ((!m_wrloaded)&&(tstaddr > (unsigned)m_wraddr))
break;
if (m_writetbl[tstaddr] == val) {
caddr = ( m_wraddr- tstaddr ) & 0x0ff;
break;
}
}
}
 
/*
if (caddr != 0)
DBGPRINTF("WR[%08x] = %08x (= TBL[%4x] <= %4x)\n", m_lastaddr, val, caddr, m_wraddr);
else
DBGPRINTF("WR[%08x] = %08x\n", m_lastaddr, val);
*/
 
if (caddr != 0) {
*ptr++ = charenc( (((caddr>>6)&0x03)<<1) + (p?1:0) + 0x010);
*ptr++ = charenc( caddr &0x3f );
if (caddr != 0) {
*ptr++ = charenc( (((caddr>>6)&0x03)<<1) + (p?1:0) + 0x010);
*ptr++ = charenc( caddr &0x3f );
} else {
// For testing, let's start just doing this the hard way
*ptr++ = charenc( (((val>>30)&0x03)<<1) + (p?1:0) + 0x018);
*ptr++ = charenc( (val>>24)&0x3f);
*ptr++ = charenc( (val>>18)&0x3f);
*ptr++ = charenc( (val>>12)&0x3f);
*ptr++ = charenc( (val>> 6)&0x3f);
*ptr++ = charenc( (val )&0x3f);
} else {
// For testing, let's start just doing this the hard way
*ptr++ = charenc( (((val>>30)&0x03)<<1) + (p?1:0) + 0x018);
*ptr++ = charenc( (val>>24)&0x3f);
*ptr++ = charenc( (val>>18)&0x3f);
*ptr++ = charenc( (val>>12)&0x3f);
*ptr++ = charenc( (val>> 6)&0x3f);
*ptr++ = charenc( (val )&0x3f);
 
m_writetbl[m_wraddr++] = val;
m_wraddr &= 0x0ff;
if (m_wraddr == 0) {
m_wrloaded = true;
m_writetbl[m_wraddr++] = val;
m_wraddr &= 0x0ff;
if (m_wraddr == 0) {
m_wrloaded = true;
}
}
 
if (p == 1) m_lastaddr+=4;
}
// *ptr++ = charenc(0x2e);
if (ln == len-nw)
*ptr++ = '\n';
*ptr = '\0';
m_dev->write(m_buf, ptr-m_buf);
DBGPRINTF(">> %s\n", m_buf);
 
if (p == 1) m_lastaddr++;
readidle();
 
nw += ln;
ptr = m_buf;
}
// *ptr++ = charenc(0x2e);
*ptr++ = '\n'; *ptr = '\0';
m_dev->write(m_buf, ptr-m_buf);
DBGPRINTF("WR: LAST ADDRESS LEFT AT %08x\n", m_lastaddr);
 
DBGPRINTF(">> %s\n", m_buf);
DBGPRINTF("WR: LAST ADDRESS LEFT AT %08x\n", m_lastaddr);
// Need to clear the incoming queue ... if there's anything there.
// We could do a ...
// readacks(len);
// to clear a known number of acks (up to half the length of our buffer
// which we can let just sit for speed ...), or we could do a ...
// readtilidle(void);
// Then, upon startup we could also start with a readtilidle(); command.
// This would help to clear out the problems between programs, where
// one program doesn't finish reading, and the next gets a confusing
// message.
readidle();
}
 
void TTYBUS::writez(const BUSW a, const int len, const BUSW *buf) {
int ln = len;
const TTYBUS::BUSW *bptr = buf;
TTYBUS::BUSW addr = a;
 
while((unsigned)ln > MAXWRLEN) {
writev(addr, 0, MAXWRLEN, bptr);
bptr += MAXWRLEN;
ln -= MAXWRLEN;
// addr += MAXWRLEN;
} if ((unsigned)ln > 0)
writev(addr, 0, ln, bptr);
writev(a, 0, len, buf);
}
 
void TTYBUS::writei(const BUSW a, const int len, const BUSW *buf) {
int ln = len;
const TTYBUS::BUSW *bptr = buf;
TTYBUS::BUSW addr = a;
 
while((unsigned)ln > MAXWRLEN) {
writev(addr, 1, MAXWRLEN, bptr);
bptr += MAXWRLEN;
ln -= MAXWRLEN;
addr += MAXWRLEN;
} if ((unsigned)ln > 0)
writev(addr, 1, ln, bptr);
writev(a, 1, len, buf);
}
 
TTYBUS::BUSW TTYBUS::readio(const TTYBUS::BUSW a) {
290,6 → 313,7
try {
readv(a, 0, 1, &v);
} catch(BUSERR b) {
DBGPRINTF("BUSERR trying to read %08x\n", a);
throw BUSERR(a);
}
 
304,12 → 328,13
}
 
char *TTYBUS::encode_address(const TTYBUS::BUSW a) {
TTYBUS::BUSW addr = a;
TTYBUS::BUSW addr = a>>2;
char *ptr = m_buf;
 
// #warning DEBUG_APPROACH
// encode(0, addr, ptr);
// return ptr+6;
// Double check that we are aligned
if ((a&3)!=0) {
throw BUSERR(a);
}
 
if ((m_addr_set)&&(a == m_lastaddr))
return ptr;
316,7 → 341,7
if (m_addr_set) {
// Encode a difference address
int diffaddr = addr - m_lastaddr;
int diffaddr = (a - m_lastaddr)>>2;
ptr = m_buf;
if ((diffaddr >= -32)&&(diffaddr < 32)) {
*ptr++ = charenc(0x09);
338,7 → 363,10
*ptr++ = charenc( diffaddr & 0x03f);
}
*ptr = '\0';
DBGPRINTF("DIF-ADDR: (%ld) \'%s\'\n", ptr-m_buf, m_buf);
DBGPRINTF("DIF-ADDR: (%ld) \'%s\' encodes last_addr(0x%08x) %c %d(0x%08x)\n",
ptr-m_buf, m_buf,
m_lastaddr, (diffaddr<0)?'-':'+',
diffaddr, diffaddr&0x0ffffffff);
}
 
{
388,15 → 416,17
char *TTYBUS::readcmd(const int inc, const int len, char *buf) {
char *ptr = buf;
 
DBGPRINTF("READCMD: LEN = %d\n", len);
DBGPRINTF("READCMD: LEN = %d: ", len);
assert(len < 520);
assert(len > 0);
 
if ((len < 8)||((len == 8)&&(inc))) {
if (len <= 8) {
*ptr++ = charenc(0x20 + (((len-1)&0x07)<<1) + (inc?1:0));
DBGPRINTF("%c\n", ptr[-1]);
} else {
*ptr++ = charenc(0x30 + (((len-8)>>5)&0x0e) + (inc?1:0));
*ptr++ = charenc( (len-8) & 0x03f);
*ptr++ = charenc(0x30 + (((len-9)>>5)&0x0e) + (inc?1:0));
*ptr++ = charenc( (len-9) & 0x03f);
DBGPRINTF("%c%c\n", ptr[-2], ptr[-1]);
}
 
return ptr;
403,7 → 433,7
}
 
void TTYBUS::readv(const TTYBUS::BUSW a, const int inc, const int len, TTYBUS::BUSW *buf) {
const int READAHEAD = MAXRDLEN/2, READBLOCK=MAXRDLEN/2;
const int READAHEAD = 0, READBLOCK=(MAXRDLEN/2>512)?512:MAXRDLEN/2;
int cmdrd = 0, nread = 0;
// TTYBUS::BUSW addr = a;
char *ptr = m_buf;
429,23 → 459,28
*ptr++ = '\n'; *ptr = '\0';
m_dev->write(m_buf, (ptr-m_buf));
 
// DBGPRINTF("Reading %d words\n", (cmdrd-nread));
while(nread<(cmdrd-READAHEAD)) {
buf[nread++] = readword();
} ptr = m_buf;
} while(nread<len) {
} // DBGPRINTF("Reading %d words, to end the read\n", len-nread);
while(nread<len) {
buf[nread++] = readword();
}
} catch(BUSERR b) {
throw BUSERR(a+((inc)?nread:0));
DBGPRINTF("READV::BUSERR trying to read %08x\n", a+((inc)?nread:0));
throw BUSERR(a+((inc)?(nread<<2):0));
}
if ((unsigned)m_lastaddr != (a+((inc)?(len):0))) {
DBGPRINTF("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len, m_lastaddr, a, (inc)?(len):0);
printf("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len, m_lastaddr, a, (inc)?(len):0);
 
if ((unsigned)m_lastaddr != (a+((inc)?(len<<2):0))) {
DBGPRINTF("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len<<2, m_lastaddr, a, (inc)?(len<<2):0);
printf("TTYBUS::READV(a=%08x,inc=%d,len=%4x,x) ERR: (Last) %08x != %08x + %08x (Expected)\n", a, inc, len<<2, m_lastaddr, a, (inc)?(len<<2):0);
sleep(1);
assert((int)m_lastaddr == (a+(inc)?(len):0));
assert((int)m_lastaddr == (a+(inc)?(len<<2):0));
exit(-3);
}
 
DBGPRINTF("READV::COMPLETE\n");
}
 
void TTYBUS::readi(const TTYBUS::BUSW a, const int len, TTYBUS::BUSW *buf) {
469,6 → 504,7
do {
nr = lclreadcode(&m_buf[0], 1);
} while (nr < 1);
DBGPRINTF("READWORD: -- lclreadcode, nr = %d, m_buf[0] = %c\n", nr, m_buf[0]);
 
sixbits = chardec(m_buf[0]);
 
483,6 → 519,7
case 2: break; // Write acknowledgement, ignore it here
case 3:
m_bus_err = true;
DBGPRINTF("READWORD::BUSRESET (unknown addr)\n");
throw BUSERR(0);
break;
case 4:
489,6 → 526,7
m_interrupt_flag = true;
break;
case 5:
DBGPRINTF("READWORD::BUSERR (unknown addr)\n");
m_bus_err = true;
throw BUSERR(0);
break;
506,9 → 544,9
val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
 
m_addr_set = true;
m_lastaddr = val;
m_lastaddr = val<<2;
 
DBGPRINTF("RCVD ADDR: 0x%08x\n", val);
DBGPRINTF("RCVD ADDR: 0x%08x\n", val<<2);
} else if (0x0c == (sixbits & 0x03c)) { // Set 32-bit address,compressed
int nw = (sixbits & 0x03) + 2;
do {
532,8 → 570,8
}
 
m_addr_set = true;
m_lastaddr = val;
DBGPRINTF("RCVD ADDR: 0x%08x (%d bytes)\n", val, nw+1);
m_lastaddr = val<<2;
DBGPRINTF("RCVD ADDR: 0x%08x (%d bytes)\n", val<<2, nw+1);
} else
found_start = true;
} while(!found_start);
544,8 → 582,8
if (0x06 == (sixbits & 0x03e)) { // Tbl read, last value
rdaddr = (m_rdaddr-1)&0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1);
DBGPRINTF("READ-WORD() -- repeat last value, %08x\n", val);
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-WORD() -- repeat last value, %08x, A= %08x\n", val, m_lastaddr);
} else if (0x10 == (sixbits & 0x030)) { // Tbl read, up to 521 into past
int idx;
do {
556,15 → 594,17
idx = ((idx<<6) | (chardec(m_buf[1]) & 0x03f)) + 2 + 8;
rdaddr = (m_rdaddr-idx)&0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1);
DBGPRINTF("READ-WORD() -- long table value[%3d], %08x\n", idx, val);
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-WORD() -- long table value[%3d], %08x, A=%08x\n", idx, val, m_lastaddr);
} else if (0x20 == (sixbits & 0x030)) { // Tbl read, 2-9 into past
rdaddr = (m_rdaddr - (((sixbits>>1)&0x07)+2)) & 0x03ff;
int idx;
idx = (((sixbits>>1)&0x07)+2);
rdaddr = (m_rdaddr - idx) & 0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1);
DBGPRINTF("READ-WORD() -- short table value[%3d], %08x\n", rdaddr, val);
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-WORD() -- short table value[%3d], %08x, A=%08x\n", idx, val, m_lastaddr);
} else if (0x38 == (sixbits & 0x038)) { // Raw read
DBGPRINTF("READ-WORD() -- RAW-READ, nr = %d\n", nr);
// DBGPRINTF("READ-WORD() -- RAW-READ, nr = %d\n", nr);
do {
nr += lclreadcode(&m_buf[nr], 6-nr);
} while (nr < 6);
577,10 → 617,10
val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
 
m_readtbl[m_rdaddr++] = val; m_rdaddr &= 0x03ff;
m_lastaddr += (sixbits&1);
DBGPRINTF("READ-WORD() -- RAW-READ %02x:%02x:%02x:%02x:%02x:%02x -- %08x\n",
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-WORD() -- RAW-READ %02x:%02x:%02x:%02x:%02x:%02x -- %08x, A=%08x\n",
m_buf[0], m_buf[1], m_buf[2], m_buf[3],
m_buf[4], m_buf[5], val);
m_buf[4], m_buf[5], val, m_lastaddr);
} else
DBGPRINTF("READ-WORD() -- Unknown character, %02x\n", sixbits);
 
587,6 → 627,146
return val;
}
 
void TTYBUS::readidle(void) {
TTYBUS::BUSW val = 0;
int nr;
unsigned sixbits;
bool found_start = false;
 
DBGPRINTF("READ-IDLE()\n");
 
while((!found_start)&&(m_dev->available())
&&((nr=lclreadcode(&m_buf[0], 1))>0)) {
nr = lclreadcode(&m_buf[0], 1);
sixbits = chardec(m_buf[0]);
 
if (sixbits&(~0x03f)) {
// Ignore new lines, unprintables, and characters
// not a part of our code
;
} else if (sixbits < 6) {
switch(sixbits) {
case 0: break; // Idle -- ignore
case 1: break; // Idle, but the bus is busy
case 2:
// Write acknowledgement, ignore it here
// This is one of the big reasons why we are
// doing this.
break;
case 3:
m_bus_err = true;
DBGPRINTF("READ-IDLE() - BUSERR\n");
throw BUSERR(0);
break;
case 4:
m_interrupt_flag = true;
break;
case 5:
m_bus_err = true;
DBGPRINTF("READ-IDLE() - BUS RESET\n");
throw BUSERR(0);
break;
}
} else if (0x08 == (sixbits & 0x3c)) { // Set 32-bit address
do {
nr += lclreadcode(&m_buf[nr], 6-nr);
} while (nr < 6);
 
val = chardec(m_buf[0]) & 0x03;
val = (val<<6) | (chardec(m_buf[1]) & 0x03f);
val = (val<<6) | (chardec(m_buf[2]) & 0x03f);
val = (val<<6) | (chardec(m_buf[3]) & 0x03f);
val = (val<<6) | (chardec(m_buf[4]) & 0x03f);
val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
 
/* Ignore the address, as we are in readidle();
m_addr_set = true;
m_lastaddr = val;
*/
 
DBGPRINTF("RCVD IDLE-ADDR: 0x%08x\n", val);
} else if (0x0c == (sixbits & 0x03c)) { // Set 32-bit address,compressed
int nw = (sixbits & 0x03) + 2;
do {
nr += lclreadcode(&m_buf[nr], nw-nr);
} while (nr < nw);
 
if (nw == 2) {
val = chardec(m_buf[1]);
} else if (nw == 3) {
val = chardec(m_buf[1]);
val = (val<<6) | (chardec(m_buf[2]) & 0x03f);
} else if (nw == 4) {
val = chardec(m_buf[1]);
val = (val<<6) | (chardec(m_buf[2]) & 0x03f);
val = (val<<6) | (chardec(m_buf[3]) & 0x03f);
} else { // if (nw == 5)
val = chardec(m_buf[1]);
val = (val<<6) | (chardec(m_buf[2]) & 0x03f);
val = (val<<6) | (chardec(m_buf[3]) & 0x03f);
val = (val<<6) | (chardec(m_buf[4]) & 0x03f);
}
 
/* Ignore address, we are in readidle();
m_addr_set = true;
m_lastaddr = val;
*/
DBGPRINTF("RCVD IDLE-ADDR: 0x%08x (%d bytes)\n", val, nw+1);
} else
found_start = true;
}
 
if (found_start) {
// We're in readidle(). We don't expect to find any data.
// But ... we did. So, just read it off and ignore it.
int rdaddr;
 
DBGPRINTF("READ-IDLE() PANIC! -- sixbits = %02x\n", sixbits);
if (0x06 == (sixbits & 0x03e)) { // Tbl read, last value
rdaddr = (m_rdaddr-1)&0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-IDLE() -- repeat last value, %08x\n", val);
} else if (0x10 == (sixbits & 0x030)) { // Tbl read, up to 521 into past
int idx;
do {
nr += lclreadcode(&m_buf[nr], 2-nr);
} while (nr < 2);
 
idx = (chardec(m_buf[0])>>1) & 0x07;
idx = ((idx<<6) | (chardec(m_buf[1]) & 0x03f)) + 2 + 8;
rdaddr = (m_rdaddr-idx)&0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-IDLE() -- long table value[%3d], %08x\n", idx, val);
} else if (0x20 == (sixbits & 0x030)) { // Tbl read, 2-9 into past
rdaddr = (m_rdaddr - (((sixbits>>1)&0x07)+2)) & 0x03ff;
val = m_readtbl[rdaddr];
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-IDLE() -- short table value[%3d], %08x\n", rdaddr, val);
} else if (0x38 == (sixbits & 0x038)) { // Raw read
do {
nr += lclreadcode(&m_buf[nr], 6-nr);
} while (nr < 6);
val = (chardec(m_buf[0])>>1) & 0x03;
val = (val<<6) | (chardec(m_buf[1]) & 0x03f);
val = (val<<6) | (chardec(m_buf[2]) & 0x03f);
val = (val<<6) | (chardec(m_buf[3]) & 0x03f);
val = (val<<6) | (chardec(m_buf[4]) & 0x03f);
val = (val<<6) | (chardec(m_buf[5]) & 0x03f);
 
m_readtbl[m_rdaddr++] = val; m_rdaddr &= 0x03ff;
m_lastaddr += (sixbits&1)?4:0;
DBGPRINTF("READ-IDLE() -- RAW-READ %02x:%02x:%02x:%02x:%02x:%02x -- %08x\n",
m_buf[0], m_buf[1], m_buf[2], m_buf[3],
m_buf[4], m_buf[5], val);
} else
DBGPRINTF("READ-IDLE() -- Unknown character, %02x\n", sixbits);
 
}
}
 
void TTYBUS::usleep(unsigned ms) {
if (m_dev->poll(ms)) {
int nr;
/sw/host/ttybus.h
17,7 → 17,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
30,7 → 30,7
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory, run make with no
// with this program. (It's in the $(ROOT)/doc directory. Run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
91,6 → 91,7
BUSW readword(void); // Reads a word value from the bus
void readv(const BUSW a, const int inc, const int len, BUSW *buf);
void writev(const BUSW a, const int p, const int len, const BUSW *buf);
void readidle(void);
 
int lclread(char *buf, int len);
int lclreadcode(char *buf, int len);
109,8 → 110,8
void close(void) { m_dev->close(); }
void writeio(const BUSW a, const BUSW v);
BUSW readio(const BUSW a);
void readi(const BUSW a, const int len, BUSW *buf);
void readz(const BUSW a, const int len, BUSW *buf);
void readi( const BUSW a, const int len, BUSW *buf);
void readz( const BUSW a, const int len, BUSW *buf);
void writei(const BUSW a, const int len, const BUSW *buf);
void writez(const BUSW a, const int len, const BUSW *buf);
bool poll(void) { return m_interrupt_flag; };
/sw/host/wbregs.cpp
105,7 → 105,7
nm = "no name";
 
char szSel[64];
strcpy(szSel, "SN:210282768825");
strcpy(szSel, S6SN);
m_fpga = FPGAOPEN(szSel);
 
if (argc < 2) {
/sw/host/zipload.cpp
18,7 → 18,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
30,6 → 30,11
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. (It's in the $(ROOT)/doc directory. Run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
37,7 → 42,6
////////////////////////////////////////////////////////////////////////////////
//
//
//
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
55,304 → 59,57
#include "deppi.h"
#include "regdefs.h"
#include "flashdrvr.h"
#include "zipelf.h"
 
bool iself(const char *fname) {
FILE *fp;
bool ret = true;
 
if ((!fname)||(!fname[0]))
return false;
 
fp = fopen(fname, "rb");
 
if (!fp) return false;
if (0x7f != fgetc(fp)) ret = false;
if ('E' != fgetc(fp)) ret = false;
if ('L' != fgetc(fp)) ret = false;
if ('F' != fgetc(fp)) ret = false;
fclose(fp);
return ret;
}
 
long fgetwords(FILE *fp) {
// Return the number of words in the current file, and return the
// file as though it had never been adjusted
long fpos, flen;
fpos = ftell(fp);
if (0 != fseek(fp, 0l, SEEK_END)) {
fprintf(stderr, "ERR: Could not determine file size\n");
perror("O/S Err:");
exit(-2);
} flen = ftell(fp);
if (0 != fseek(fp, fpos, SEEK_SET)) {
fprintf(stderr, "ERR: Could not seek on file\n");
perror("O/S Err:");
exit(-2);
} flen /= sizeof(FPGA::BUSW);
return flen;
}
 
FPGA *m_fpga;
class SECTION {
public:
unsigned m_start, m_len;
FPGA::BUSW m_data[1];
};
 
SECTION **singlesection(int nwords) {
fprintf(stderr, "NWORDS = %d\n", nwords);
size_t sz = (2*(sizeof(SECTION)+sizeof(SECTION *))
+(nwords-1)*(sizeof(FPGA::BUSW)));
char *d = (char *)malloc(sz);
SECTION **r = (SECTION **)d;
memset(r, 0, sz);
r[0] = (SECTION *)(&d[2*sizeof(SECTION *)]);
r[0]->m_len = nwords;
r[1] = (SECTION *)(&r[0]->m_data[r[0]->m_len]);
r[0]->m_start = 0;
r[1]->m_start = 0;
r[1]->m_len = 0;
 
return r;
void usage(void) {
printf("USAGE: zipload [-h] [<bit-file> [<alt-bit-file>]] <zip-program-file>\n");
printf("\n"
"\t-h\tDisplay this usage statement\n"
);
}
 
SECTION **rawsection(const char *fname) {
SECTION **secpp, *secp;
unsigned num_words;
FILE *fp;
int nr;
void skip_bitfile_header(FILE *fp) {
const unsigned SEARCHLN = 204, MATCHLN = 16;
const unsigned char matchstr[MATCHLN] = {
0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff,
//
0xaa, 0x99, 0x55, 0x66 };
unsigned char buf[SEARCHLN];
 
fp = fopen(fname, "r");
if (fp == NULL) {
fprintf(stderr, "Could not open: %s\n", fname);
exit(-1);
}
rewind(fp);
fread(buf, sizeof(char), SEARCHLN, fp);
for(int start=0; start+MATCHLN<SEARCHLN; start++) {
int mloc;
 
if ((num_words=fgetwords(fp)) > FLASHWORDS-(RESET_ADDRESS-SPIFLASH)) {
fprintf(stderr, "File overruns flash memory\n");
exit(-1);
}
secpp = singlesection(num_words);
secp = secpp[0];
secp->m_start = RAMBASE;
secp->m_len = num_words;
nr= fread(secp->m_data, sizeof(FPGA::BUSW), num_words, fp);
if (nr != (int)num_words) {
fprintf(stderr, "Could not read entire file\n");
perror("O/S Err:");
exit(-2);
} assert(secpp[1]->m_len == 0);
 
return secpp;
}
 
unsigned byteswap(unsigned n) {
unsigned r;
 
r = (n&0x0ff); n>>= 8;
r = (r<<8) | (n&0x0ff); n>>= 8;
r = (r<<8) | (n&0x0ff); n>>= 8;
r = (r<<8) | (n&0x0ff); n>>= 8;
 
return r;
}
 
// #define CHEAP_AND_EASY
#ifdef CHEAP_AND_EASY
#else
#include <libelf.h>
#include <gelf.h>
 
void elfread(const char *fname, unsigned &entry, SECTION **&sections) {
Elf *e;
int fd, i;
size_t n;
char *id;
Elf_Kind ek;
GElf_Ehdr ehdr;
GElf_Phdr phdr;
const bool dbg = false;
 
if (elf_version(EV_CURRENT) == EV_NONE) {
fprintf(stderr, "ELF library initialization err, %s\n", elf_errmsg(-1));
perror("O/S Err:");
exit(EXIT_FAILURE);
} if ((fd = open(fname, O_RDONLY, 0)) < 0) {
fprintf(stderr, "Could not open %s\n", fname);
perror("O/S Err:");
exit(EXIT_FAILURE);
} if ((e = elf_begin(fd, ELF_C_READ, NULL))==NULL) {
fprintf(stderr, "Could not run elf_begin, %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
}
 
ek = elf_kind(e);
if (ek == ELF_K_ELF) {
; // This is the kind of file we should expect
} else if (ek == ELF_K_AR) {
fprintf(stderr, "Cannot run an archive!\n");
exit(EXIT_FAILURE);
} else if (ek == ELF_K_NONE) {
;
} else {
fprintf(stderr, "Unexpected ELF file kind!\n");
exit(EXIT_FAILURE);
}
 
if (gelf_getehdr(e, &ehdr) == NULL) {
fprintf(stderr, "getehdr() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
} if ((i=gelf_getclass(e)) == ELFCLASSNONE) {
fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
} if ((id = elf_getident(e, NULL)) == NULL) {
fprintf(stderr, "getident() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
} if (i != ELFCLASS32) {
fprintf(stderr, "This is a 64-bit ELF file, ZipCPU ELF files are all 32-bit\n");
exit(EXIT_FAILURE);
}
 
if (dbg) {
printf(" %-20s 0x%jx\n", "e_type", (uintmax_t)ehdr.e_type);
printf(" %-20s 0x%jx\n", "e_machine", (uintmax_t)ehdr.e_machine);
printf(" %-20s 0x%jx\n", "e_version", (uintmax_t)ehdr.e_version);
printf(" %-20s 0x%jx\n", "e_entry", (uintmax_t)ehdr.e_entry);
printf(" %-20s 0x%jx\n", "e_phoff", (uintmax_t)ehdr.e_phoff);
printf(" %-20s 0x%jx\n", "e_shoff", (uintmax_t)ehdr.e_shoff);
printf(" %-20s 0x%jx\n", "e_flags", (uintmax_t)ehdr.e_flags);
printf(" %-20s 0x%jx\n", "e_ehsize", (uintmax_t)ehdr.e_ehsize);
printf(" %-20s 0x%jx\n", "e_phentsize", (uintmax_t)ehdr.e_phentsize);
printf(" %-20s 0x%jx\n", "e_shentsize", (uintmax_t)ehdr.e_shentsize);
printf("\n");
}
 
 
// Check whether or not this is an ELF file for the ZipCPU ...
if (ehdr.e_machine != 0x0dadd) {
fprintf(stderr, "This is not a ZipCPU ELF file\n");
exit(EXIT_FAILURE);
}
 
// Get our entry address
entry = ehdr.e_entry;
 
 
// Now, let's go look at the program header
if (elf_getphdrnum(e, &n) != 0) {
fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
}
 
unsigned total_octets = 0, current_offset=0, current_section=0;
for(i=0; i<(int)n; i++) {
total_octets += sizeof(SECTION *)+sizeof(SECTION);
 
if (gelf_getphdr(e, i, &phdr) != &phdr) {
fprintf(stderr, "getphdr() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
// Search backwards, since the starting bytes just aren't that
// interesting.
for(mloc = MATCHLN-1; mloc >= 0; mloc--)
if (buf[start+mloc] != matchstr[mloc])
break;
if (mloc < 0) {
fseek(fp, start, SEEK_SET);
return;
}
 
if (dbg) {
printf(" %-20s 0x%x\n", "p_type", phdr.p_type);
printf(" %-20s 0x%jx\n", "p_offset", phdr.p_offset);
printf(" %-20s 0x%jx\n", "p_vaddr", phdr.p_vaddr);
printf(" %-20s 0x%jx\n", "p_paddr", phdr.p_paddr);
printf(" %-20s 0x%jx\n", "p_filesz", phdr.p_filesz);
printf(" %-20s 0x%jx\n", "p_memsz", phdr.p_memsz);
printf(" %-20s 0x%x [", "p_flags", phdr.p_flags);
 
if (phdr.p_flags & PF_X) printf(" Execute");
if (phdr.p_flags & PF_R) printf(" Read");
if (phdr.p_flags & PF_W) printf(" Write");
printf("]\n");
printf(" %-20s 0x%jx\n", "p_align", phdr.p_align);
}
 
total_octets += phdr.p_memsz;
}
 
char *d = (char *)malloc(total_octets + sizeof(SECTION)+sizeof(SECTION *));
memset(d, 0, total_octets);
 
SECTION **r = sections = (SECTION **)d;
current_offset = (n+1)*sizeof(SECTION *);
current_section = 0;
 
for(i=0; i<(int)n; i++) {
r[i] = (SECTION *)(&d[current_offset]);
 
if (gelf_getphdr(e, i, &phdr) != &phdr) {
fprintf(stderr, "getphdr() failed: %s\n", elf_errmsg(-1));
exit(EXIT_FAILURE);
}
 
if (dbg) {
printf(" %-20s 0x%jx\n", "p_offset", phdr.p_offset);
printf(" %-20s 0x%jx\n", "p_vaddr", phdr.p_vaddr);
printf(" %-20s 0x%jx\n", "p_paddr", phdr.p_paddr);
printf(" %-20s 0x%jx\n", "p_filesz", phdr.p_filesz);
printf(" %-20s 0x%jx\n", "p_memsz", phdr.p_memsz);
printf(" %-20s 0x%x [", "p_flags", phdr.p_flags);
 
if (phdr.p_flags & PF_X) printf(" Execute");
if (phdr.p_flags & PF_R) printf(" Read");
if (phdr.p_flags & PF_W) printf(" Write");
printf("]\n");
 
printf(" %-20s 0x%jx\n", "p_align", phdr.p_align);
}
 
current_section++;
 
r[i]->m_start = phdr.p_paddr;
r[i]->m_len = phdr.p_filesz/ sizeof(FPGA::BUSW);
 
current_offset += phdr.p_memsz + sizeof(SECTION);
 
// Now, let's read in our section ...
if (lseek(fd, phdr.p_offset, SEEK_SET) < 0) {
fprintf(stderr, "Could not seek to file position %08lx\n", phdr.p_offset);
perror("O/S Err:");
exit(EXIT_FAILURE);
} if (phdr.p_filesz > phdr.p_memsz)
phdr.p_filesz = 0;
if (read(fd, r[i]->m_data, phdr.p_filesz) != (int)phdr.p_filesz) {
fprintf(stderr, "Didnt read entire section\n");
perror("O/S Err:");
exit(EXIT_FAILURE);
}
 
// Next, we need to byte swap it from big to little endian
for(unsigned j=0; j<r[i]->m_len; j++)
r[i]->m_data[j] = byteswap(r[i]->m_data[j]);
 
if (dbg) for(unsigned j=0; j<r[i]->m_len; j++)
fprintf(stderr, "ADR[%04x] = %08x\n", r[i]->m_start+j,
r[i]->m_data[j]);
}
 
r[i] = (SECTION *)(&d[current_offset]);
r[current_section]->m_start = 0;
r[current_section]->m_len = 0;
 
elf_end(e);
close(fd);
fprintf(stderr, "Could not find bin-file header within bit file\n");
fclose(fp);
exit(EXIT_FAILURE);
}
#endif
 
void usage(void) {
printf("USAGE: ziprun [-h] [<bit-file> [<alt-bit-file>]] <zip-program-file>\n");
printf("\n"
"\t-h\tDisplay this usage statement\n");
}
 
int main(int argc, char **argv) {
int skp=0;
bool permit_raw_files = false, debug_only = false;
unsigned entry = RAMBASE;
int skp=0, argn;
bool debug_only = false, verbose = false;
bool ignore_missing_memory = false;
unsigned entry = 0;
FLASHDRVR *flash = NULL;
const char *bitfile = NULL, *altbitfile = NULL;
const char *bitfile = NULL, *altbitfile = NULL, *execfile = NULL;
size_t bitsz;
FILE *fp;
 
if (argc < 2) {
usage();
360,7 → 117,7
}
 
skp=1;
for(int argn=0; argn<argc-skp; argn++) {
for(argn=0; argn<argc-skp; argn++) {
if (argv[argn+skp][0] == '-') {
switch(argv[argn+skp][1]) {
case 'd':
370,8 → 127,8
usage();
exit(EXIT_SUCCESS);
break;
case 'r':
permit_raw_files = true;
case 'v':
verbose = true;
break;
default:
fprintf(stderr, "Unknown option, -%c\n\n",
380,112 → 137,158
exit(EXIT_FAILURE);
break;
} skp++; argn--;
} else { // Check for bit files
int sl = strlen(argv[argn+skp]);
if ((sl>4)&&(strcmp(&argv[argn+skp][sl-4],".bit")==0)) {
if (bitfile == NULL)
bitfile = argv[argn+skp];
else if (altbitfile == NULL)
altbitfile = argv[argn+skp];
else {
fprintf(stderr, "Err: Too many bit files listed\n");
exit(EXIT_FAILURE);
} skp++; argn--;
} else
argv[argn] = argv[argn+skp];
} else {
// Anything here must be either the program to load,
// or a bit file to load
argv[argn] = argv[argn+skp];
}
} argc -= skp;
 
 
for(argn=0; argn<argc; argn++) {
if (iself(argv[argn])) {
if (execfile) {
printf("Too many executable files given, %s and %s\n", execfile, argv[argn]);
usage();
exit(EXIT_FAILURE);
} execfile = argv[argn];
} else { // if (isbitfile(argv[argn]))
if (!bitfile)
bitfile = argv[argn];
else if (!altbitfile)
altbitfile = argv[argn];
else {
printf("Unknown file name or too many files, %s\n", argv[argn]);
usage();
exit(EXIT_FAILURE);
}
}
}
 
if (verbose) {
if (bitfile) printf(" BITFILE: %s\n", bitfile);
if (altbitfile) printf("ABITFILE: %s\n", altbitfile);
if (execfile) printf("EXECTFILE: %s\n", execfile);
}
 
if ((execfile == NULL)&&(bitfile == NULL)) {
printf("No executable or bit file(s) given!\n\n");
usage();
exit(EXIT_FAILURE);
}
 
if ((bitfile == NULL)&&(altbitfile != NULL)) {
printf("Cannot program an alternate bitfile without a main bitfile\n\n");
usage();
exit(EXIT_FAILURE);
}
 
if ((bitfile)&&(access(bitfile,R_OK)!=0)) {
// If there's no code file, or the code file cannot be opened
fprintf(stderr, "Cannot open bitfile, %s\n", bitfile);
exit(EXIT_FAILURE);
} if ((altbitfile)&&(access(altbitfile,R_OK)!=0)) {
fprintf(stderr, "Cannot open alternate bitfile, %s\n",
altbitfile);
}
 
if ((altbitfile)&&(access(altbitfile,R_OK)!=0)) {
// If there's no code file, or the code file cannot be opened
fprintf(stderr, "Cannot open alternate bitfile, %s\n", altbitfile);
exit(EXIT_FAILURE);
} if(((!bitfile)&&(argc<=0)) || ((argc>0)&&(access(argv[0],R_OK)!=0))) {
} if ((execfile)&&(access(execfile,R_OK)!=0)) {
// If there's no code file, or the code file cannot be opened
if (argc>0)
fprintf(stderr, "Cannot open executable, %s\n", argv[0]);
else
usage();
fprintf(stderr, "Cannot open executable, %s\n\n", execfile);
usage();
exit(EXIT_FAILURE);
} else if (!iself(execfile)) {
printf("%s is not an executable file\n\n", execfile);
usage();
exit(EXIT_FAILURE);
}
 
const char *codef = (argc>0)?argv[0]:NULL;
DEVBUS::BUSW *fbuf = new DEVBUS::BUSW[FLASHWORDS];
char *fbuf = new char[FLASHLEN];
 
// Set the flash buffer to all ones
memset(fbuf, -1, FLASHWORDS*sizeof(fbuf[0]));
memset(fbuf, -1, FLASHLEN);
 
if (debug_only) {
m_fpga = NULL;
} else {
char szSel[64];
strcpy(szSel, "SN:210282768825");
strcpy(szSel, S6SN);
m_fpga = new FPGA(new DEPPI(szSel));
}
 
// Make certain we can talk to the FPGA
try {
unsigned v = m_fpga->readio(R_VERSION);
if (v < 0x20170000) {
fprintf(stderr, "Could not communicate with board (invalid version)\n");
exit(EXIT_FAILURE);
}
} catch(BUSERR b) {
fprintf(stderr, "Could not communicate with board (BUSERR when reading VERSION)\n");
exit(EXIT_FAILURE);
}
 
flash = (debug_only)?NULL : new FLASHDRVR(m_fpga);
 
// First, see if we need to load a bit file
if (bitfile) {
int len;
FILE *fp = fopen(bitfile, "rb");
 
fseek(fp, 0x5dl, SEEK_SET);
len = fread(&fbuf[CONFIG_ADDRESS-SPIFLASH],
fp = fopen(bitfile, "r");
if (strcmp(&argv[argn][strlen(argv[argn])-4],".bit")==0)
skip_bitfile_header(fp);
bitsz = fread(&fbuf[CONFIG_ADDRESS-SPIFLASH],
sizeof(fbuf[0]),
FLASHWORDS-(CONFIG_ADDRESS-SPIFLASH), fp);
assert(len + CONFIG_ADDRESS < ALTCONFIG_ADDRESS);
FLASHLEN - (CONFIG_ADDRESS-SPIFLASH), fp);
fclose(fp);
 
for(int i=0; i<4; i++) {
// printf("0x%08x\n", fbuf[i]);
assert(fbuf[i] == 0x0ffffffff);
} // printf("0x%08x\n", fbuf[4]);
assert(fbuf[4] == 0x0665599aa);
 
printf("Loading: %s\n", bitfile);
if ((flash)&&(!flash->write(CONFIG_ADDRESS, len, &fbuf[CONFIG_ADDRESS-SPIFLASH], true))) {
fprintf(stderr, "Could not write primary bitfile\n");
exit(EXIT_FAILURE);
try {
printf("Loading: %s\n", bitfile);
flash->write(CONFIG_ADDRESS, bitsz, fbuf, true);
} catch(BUSERR b) {
fprintf(stderr, "BUS-ERR @0x%08x\n", b.addr);
exit(-1);
}
} if (altbitfile) {
int len;
FILE *fp = fopen(altbitfile, "rb");
}
 
// The alternate configuration follows the first configuration
len = fread(&fbuf[ALTCONFIG_ADDRESS-SPIFLASH],
// Then see if we were given an alternate bit file
if (altbitfile) {
size_t altsz;
assert(CONFIG_ADDRESS + bitsz < ALTCONFIG_ADDRESS);
 
fp = fopen(altbitfile, "r");
if (strcmp(&argv[argn][strlen(argv[argn])-4],".bit")==0)
skip_bitfile_header(fp);
altsz = fread(&fbuf[ALTCONFIG_ADDRESS-SPIFLASH],
sizeof(fbuf[0]),
FLASHWORDS-(ALTCONFIG_ADDRESS-SPIFLASH), fp);
assert(len + ALTCONFIG_ADDRESS < RESET_ADDRESS);
FLASHLEN-(ALTCONFIG_ADDRESS-SPIFLASH), fp);
assert(ALTCONFIG_ADDRESS+altsz < RESET_ADDRESS);
fclose(fp);
printf("Loading: %s\n", altbitfile);
 
if ((flash)&&(!flash->write(ALTCONFIG_ADDRESS, len, &fbuf[ALTCONFIG_ADDRESS-SPIFLASH], true))) {
fprintf(stderr, "Could not write alternate bitfile\n");
exit(EXIT_FAILURE);
try {
printf("Loading: %s\n", altbitfile);
flash->write(ALTCONFIG_ADDRESS, altsz, fbuf, true);
} catch(BUSERR b) {
fprintf(stderr, "BUS-ERR @0x%08x\n", b.addr);
exit(-1);
}
} else {
assert(CONFIG_ADDRESS+bitsz < RESET_ADDRESS);
}
 
if (codef) try {
SECTION **secpp = NULL, *secp;
if (execfile) try {
ELFSECTION **secpp = NULL, *secp;
 
if(iself(codef)) {
if(iself(execfile)) {
// zip-readelf will help with both of these ...
elfread(codef, entry, secpp);
elfread(execfile, entry, secpp);
assert(entry == RESET_ADDRESS);
} else if (permit_raw_files) {
secpp = rawsection(codef);
entry = RESET_ADDRESS;
} else {
fprintf(stderr, "ERR: %s is not in ELF format\n", codef);
fprintf(stderr, "ERR: %s is not in ELF format\n", execfile);
exit(EXIT_FAILURE);
}
 
printf("Loading: %s\n", codef);
printf("Loading: %s\n", execfile);
// assert(secpp[1]->m_len = 0);
for(int i=0; secpp[i]->m_len; i++) {
bool valid = false;
492,16 → 295,13
secp= secpp[i];
if ((secp->m_start >= RESET_ADDRESS)
&&(secp->m_start+secp->m_len
<= SPIFLASH+FLASHWORDS))
<= SPIFLASH+FLASHLEN))
valid = true;
if ((secp->m_start >= RAMBASE)
&&(secp->m_start+secp->m_len
<= RAMBASE+MEMWORDS))
valid = true;
if (!valid) {
fprintf(stderr, "No such memory on board: 0x%08x - %08x\n",
secp->m_start, secp->m_start+secp->m_len);
exit(EXIT_FAILURE);
if (!ignore_missing_memory)
exit(EXIT_FAILURE);
}
}
 
508,28 → 308,34
unsigned startaddr = RESET_ADDRESS, codelen = 0;
for(int i=0; secpp[i]->m_len; i++) {
secp = secpp[i];
if ((secp->m_start >= RAMBASE)
&&(secp->m_start+secp->m_len
<= RAMBASE+MEMWORDS)) {
for(int i=0; (unsigned)i<secp->m_len; i++) {
if (secp->m_data[i] != 0) {
fprintf(stderr, "ERR: Cannot set RAM upon bootup!\n");
fprintf(stderr, "(The bootloaders just not that smart ... yet)\n");
fprintf(stderr, "Attempting to set %08x - %08x\n", secp->m_start, secp->m_start+secp->m_len-1);
fprintf(stderr, "%08x cannot be set to %08x\n", secp->m_start+i, secp->m_data[i]);
exit(EXIT_FAILURE);
}
}
} else {
if (secp->m_start < startaddr) {
codelen += (startaddr-secp->m_start);
startaddr = secp->m_start;
} if (secp->m_start+secp->m_len > startaddr+codelen) {
codelen = secp->m_start+secp->m_len-startaddr;
} memcpy(&fbuf[secp->m_start-SPIFLASH],
secp->m_data,
secp->m_len*sizeof(FPGA::BUSW));
 
unsigned start, idx, ln;
 
start = secp->m_start;
idx = 0;
ln = secp->m_len;
if (secp->m_start < SPIFLASH) {
start = SPIFLASH;
idx = SPIFLASH-secp->m_start;
if (idx > secp->m_len)
continue;
ln = secp->m_len-idx;
} if (start + ln > SPIFLASH+FLASHLEN) {
if (start > SPIFLASH+FLASHLEN)
continue;
ln = SPIFLASH+FLASHLEN-start;
}
 
// We only ever write to the flash
if (start < startaddr) {
// Keep track of the first address in
// flash, as well as the last address
// that we will write
codelen += (startaddr-secp->m_start);
startaddr = secp->m_start;
} if (start+ln > startaddr+codelen) {
codelen = secp->m_start+secp->m_len-startaddr;
} memcpy(&fbuf[start-SPIFLASH], &secp->m_data[idx], ln);
}
if ((flash)&&(!flash->write(startaddr, codelen, &fbuf[startaddr-SPIFLASH], true))) {
fprintf(stderr, "ERR: Could not write program to flash\n");
540,13 → 346,8
if (m_fpga) m_fpga->readio(R_VERSION); // Check for bus errors
 
// Now ... how shall we start this CPU?
printf("The CPU should be fully loaded, you may now start\n");
printf("it. To start the CPU, either toggle power or type\n");
printf("%% wbregs fpgagen1 0 \n");
printf("%% wbregs fpgagen2 0x0300 \n");
printf("%% wbregs fpgacmd 14 \n");
} catch(BUSERR a) {
fprintf(stderr, "XULA-BUS error: %08x\n", a.addr);
fprintf(stderr, "S6-BUS error: %08x\n", a.addr);
exit(-2);
}
 
/sw/zipos/Makefile
42,49 → 42,56
AS := $(CROSS)as
OBJDUMP := $(CROSS)objdump
OBJDIR := obj-zip
DEVSRCSR:= display.c keypad.c rtcsim.c
DEVSRCSR:= display.c keypad.c rtcsim.c txfns.c
DEVSRCS := $(addprefix ../dev/,$(DEVSRCSR))
DEVOBJS := $(addprefix $(OBJDIR)/,$(subst .c,.o,$(DEVSRCSR)))
SOURCES := bootloader.c kernel.c ksetup.c syspipe.c pipesetup.c taskp.c doorbell.c zipsys.c # ziplib.c
SOURCES := bootloader.c kernel.c ksetup.c syspipe.c pipesetup.c taskp.c doorbell.c zipsys.c string.c # ziplib.c
OBJECTS := $(addprefix $(OBJDIR)/,$(subst .c,.o,$(SOURCES))) $(DEVOBJS) $(OBJDIR)/resetdump.o
HEADERS := $(wildcard *.h) $(subst .c,.h,$(DEVSRCS))
# CFLAGS := -O3 -fdump-tree-all -Wall -Wextra -nostdlib -fno-builtin
# CFLAGS := -O3 -fdump-rtl-all -DZIPOS -Wall -Wextra -nostdlib -fno-builtin
CFLAGS := -O3 -DZIPOS -Wall -Wextra -nostdlib -fno-builtin
# CFLAGS := -Wall -Wextra -nostdlib -fno-builtin
LDFLAGS := -T cmodram.ld -Wl,-Map,$(OBJDIR)/doorbell.map
CFLAGS := -I. -I../dev -Os -DZIPOS -Wall -Wextra -nostdlib -fno-builtin -Wa,-nocis
LDFLAGS := -T cmodram.ld -Wl,-Map,$(OBJDIR)/doorbell.map -nostdlib
 
all: $(OBJDIR)/ doorbell
all: doorbell
$(OBJDIR)/:
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"
$(mk-objdir)
 
%.o: $(OBJDIR)/%.o
$(CC) $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.o: %.c
$(mk-objdir)
$(CC) $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.o: ../dev/%.c
$(mk-objdir)
$(CC) $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.txt: $(OBJDIR)/%.o
$(OBJDUMP) -d $^ -o $@
$(OBJDUMP) -Dr $^ > $@
 
$(OBJDIR)/%.s: %.c
$(mk-objdir)
$(CC) -S $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/%.s: ../dev/%.c
$(mk-objdir)
$(CC) -S $(CFLAGS) -c $< -o $@
 
$(OBJDIR)/resetdump.o: resetdump.s
$(AS) $^ -o $@
$(mk-objdir)
$(AS) -nocis $^ -o $@
 
doorbell: $(OBJECTS) cmodram.ld
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
 
$(OBJDIR)/doorbell.txt: doorbell
doorbell.txt: doorbell
$(OBJDUMP) -d $^ > $@
 
define mk-objdir
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"
endef
 
define build-depends
@echo "Building dependency file(s)"
@$(CC) $(CPPFLAGS) -MM $(SOURCES) $(DEVSRCS) > $(OBJDIR)/xdepends.txt
93,7 → 100,8
endef
 
.PHONY: depends
depends: $(OBJDIR)/ tags
depends: tags
$(mk-objdir)
$(build-depends)
 
tags: $(SOURCES) $(HEADERS)
/sw/zipos/board.h
59,9 → 59,8
#define INT_BUTTON 0x001
#define INT_BUSERR 0x002 // Kind of useless, a buserr will kill us anyway
#define INT_SCOPE 0x004
#define INT_RTC 0x008 // May not be available, due to lack of space
#define INT_TIMA 0x010
#define INT_TIMB 0x020
#define INT_TIMER 0x010
//#define INT_WATCHDOG 0x020 // Catching a watchdog/reset interrupt makes no sense
#define INT_UARTRX 0x040
#define INT_UARTTX 0x080
#define INT_KEYPAD 0x100
71,6 → 70,8
#define INT_ENABLEV(IN) (INT_ENABLE|((IN)<<16))
#define INT_DISABLEV(IN) ((IN)<<16)
#define INT_CLEAR(IN) (IN)
#define INT_CLEARPIC 0x7fff7fff
#define INT_DALLPIC 0x7fff0000
 
// Clocks per second, for use with the timer
#define TM_ONE_SECOND 80000000
77,50 → 78,46
#define TM_REPEAT 0x80000000
 
typedef struct {
volatile int io_pic;
volatile unsigned *io_buserr;
volatile int io_tima, io_timb;
volatile unsigned io_pwm_audio;
volatile unsigned io_spio; // aka keypad, buttons, and keyboard
volatile unsigned io_gpio;
volatile unsigned io_uart;
volatile unsigned io_version;
int io_pic;
unsigned *io_buserr;
int io_timer, io_watchdog;
unsigned io_pwm_audio;
unsigned io_spio; // aka keypad, buttons, and keyboard
unsigned io_gpio;
unsigned io_uart;
unsigned io_version;
} IOSPACE;
 
// Wishbone scope control
#define TRIGGER_SCOPE_NOW 0x88000000
#define SCOPE_IS_STOPPED 0x40000000
#define DISABLE_TRIGGER 0x84000000
typedef struct {
volatile unsigned s_control, s_data;
} SCOPE;
 
typedef struct {
volatile unsigned f_crc, f_far_maj, f_far_min, f_fdri,
f_fdro, f_cmd, f_ctl, f_mask,
f_stat, f_lout, f_cor1, f_cor2,
f_pwrdn, f_flr, f_idcode, f_cwdt,
f_hcopt, f_csbo, f_gen1, f_gen2,
f_gen3, f_gen4, f_gen5, f_mode,
f_gwe, f_mfwr, f_cclk, f_seu, f_exp, f_rdbk,
f_bootsts, f_eye, f_cbc;
} FPGACONFIG;
#define WBSCOPE_NO_RESET 0x80000000
#define WBSCOPE_MANUAL WBSCOPE_TRIGGER
//
#define WBSCOPE_STOPPED 0x40000000
#define WBSCOPE_TRIGGERED 0x20000000
#define WBSCOPE_PRIMED 0x10000000
#define WBSCOPE_TRIGGER (0x08000000|WBSCOPE_NO_RESET)
#define WBSCOPE_DISABLED 0x04000000
#define WBSCOPE_DISABLE 0x04000000 // Disable the scope trigger
#define WBSCOPE_RZERO 0x02000000 // Unused,true if ptd at begning
#define WBSCOPE_LGLEN(A) ((A>>20)&0x01f)
#define WBSCOPE_LENGTH(A) (1<<(WBSCOPE_LGLEN(A)))
 
typedef struct {
volatile unsigned c_clock, c_timer, c_stopwatch, c_alarm;
} RTCCLOCK;
typedef struct WBSCOPE_S {
unsigned s_ctrl, s_data;
} WBSCOPE;
 
#define IOADDR 0x000100
#define SCOPEADDR 0x000200
// #define FCTLADDR 0x000300 // Flash control, depends upon write capability
#define CONFIGADDR 0x000400
// #define RTCADDR 0x000800 // Disabled for lack of space on device
#define RAMADDR 0x002000
#define RAMSZ 0x001000
#define FLASHADDR 0x400000
#define RESET_ADDR 0x480000
#define FLASHSZ 0x400000
#define IOADDR 0x000400
#define SCOPEADDR 0x000800
// #define FCTLADDR 0x000c00 // Flash control, depends upon write capability
#define RAMADDR 0x004000
#define RAMSZ (RAMADDR)
#define FLASHADDR 0x1000000
#define RESET_ADDR 0x1200000
#define FLASHSZ (FLASHADDR)
 
static volatile IOSPACE *const _sys = (IOSPACE *)IOADDR;
static volatile WBSCOPE *const _scope = (WBSCOPE *)SCOPEADDR;
 
#define valid_ram_region(PTR,LN) (((int)(PTR)>=RAMADDR)&&((int)(PTR+LN)<RAMADDR+RAMSZ))
#define valid_flash_region(PTR,LN) (((int)(PTR)>=FLASHADDR)&&((int)(PTR+LN)<FLASHADDR+FLASHSZ))
#define valid_mem_region(PTR,LN) ((valid_ram_region(PTR,LN))||(valid_flash_region(PTR,LN)))
/sw/zipos/bootloader.c
38,22 → 38,24
//
//
#include "board.h"
#include "bootloader.h"
 
// These values will be filled in by the linker. They are unknown at compile
// time.
extern int load_image_start, load_image_end, bss_image_end;
 
void bootloader(void) {
int len = ((int)&load_image_end) - RAMADDR;
int *flash = &load_image_start;
int *mem = (int *)RAMADDR;
void _bootloader(void) __attribute__ ((section(".boot")));
 
for(int i=0; i<len; i++)
mem[i] = flash[i];
void _bootloader(void) {
int *flash = _kernel_image_start;
int *mem = _blkram;
 
while(mem < _kernel_image_end)
*mem++ = *flash++;
 
// While I'd love to continue and clear to the end of memory, doing
// so will corrupt my stack and perhaps even my return address. Hence
// we only do this much.
for(int i=len; i< ((int)&bss_image_end)-RAMADDR; i++)
mem[i] = 0;
while(mem < _bss_image_end)
*mem++ = 0;
}
 
/sw/zipos/cmod.ld
34,18 → 34,38
 
MEMORY
{
blkram (wx) : ORIGIN = 0x002000, LENGTH = 0x001000
flash (rx) : ORIGIN = 0x400000, LENGTH = 0x400000
blkram (wx) : ORIGIN = 0x0004000, LENGTH = 0x0004000
flash (rx) : ORIGIN = 0x1000000, LENGTH = 0x1000000
}
 
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 1;
_flash = ORIGIN(flash);
_blkram = ORIGIN(blkram);
_sdram = 0;
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 4;
_sdram_image_start = 0;
_sdram_image_end = 0;
 
SECTIONS
{
. = 0x0480000;
.rocode 0x0480000 : { *(.start) *(.text)
*(.rodata)
*(.strings) } > flash
.data : { *(.fixdata) *(.data) *(COMMON) *(.bss) } > blkram
_top_of_heap = .;
.rocode 0x1200000 : {
_boot_address = .;
*(.start) *(.boot)
*(.text*)
*(.rodata*)
*(.strings*)
} > flash
_kernel_image_start = . ;
.data : {
*(.kernel*)
*(.fixdata*)
*(.data*)
*(COMMON*)
_kernel_image_end = . ;
}> blkram AT> flash
_blkram_image_end = . ;
.bss : {
*(.bss*)
_bss_image_end = . ;
} > blkram
_top_of_heap = .;
}
/sw/zipos/cmodram.ld
40,34 → 40,51
 
MEMORY
{
blkram (wx) : ORIGIN = 0x002000, LENGTH = 0x001000
flash (rx) : ORIGIN = 0x400000, LENGTH = 0x400000
blkram (wx) : ORIGIN = 0x0004000, LENGTH = 0x0004000
flash (rx) : ORIGIN = 0x1000000, LENGTH = 0x1000000
}
 
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 1;
_flash = ORIGIN(flash);
_blkram = ORIGIN(blkram);
_sdram = 0;
_top_of_stack = ORIGIN(blkram) + LENGTH(blkram) - 4;
_sdram_image_start = 0;
_sdram_image_end = 0;
 
SECTIONS
{
. = 0x0480000;
.rocode 0x0480000 : { *(.start)
.rocode 0x1200000 : ALIGN(4) {
_boot_address = .;
*(.start) *(.boot)
obj-zip/bootloader.o(.text)
obj-zip/ksetup.o(.text)
obj-zip/pipesetup.o(.text)
obj-zip/taskp.o(.text)
obj-zip/doorbell.o(.text)
obj-zip/keypad.o(.text)
obj-zip/display.o(.text)
obj-zip/rtcsim.o(.text)
*(.rodata*) *(.strings)
load_image_start = . ;
} > flash
.ramcode : {
obj-zip/kernel.o(.text)
obj-zip/syspipe.o(.text)
obj-zip/keypad.o(.text*)
obj-zip/display.o(.text*)
obj-zip/rtcsim.o(.text*)
obj-zip/doorbell.o(.text*)
*(.rodata*)
*(.strings*)
__rocode_alignment = (. + 3) & ~ 3;
. = __rocode_alignment;
} > flash
_kernel_image_start = . ;
.ramcode : ALIGN_WITH_INPUT {
obj-zip/kernel.o(.text*)
obj-zip/syspipe.o(.text*)
} > blkram AT> flash
.data : { *(.fixdata) *(.data) *(COMMON)
load_image_end = . ;
} > blkram AT> flash
.bss : { *(.bss) bss_image_end = . ; } > blkram
_top_of_heap = .;
.data : ALIGN_WITH_INPUT {
*(.kernel*)
*(.fixdata*)
*(.data*)
*(COMMON*)
_kernel_image_end = . ;
}> blkram AT> flash
_blkram_image_end = . ;
.bss : ALIGN_WITH_INPUT {
*(.bss*)
_bss_image_end = . ;
} > blkram
_top_of_heap = .;
}
/sw/zipos/doorbell.c
53,11 → 53,18
#include "ktraps.h"
#include "errno.h"
#include "swint.h"
#include "txfns.h"
 
#include "../dev/display.h"
#include "../dev/rtcsim.h"
#include "../dev/keypad.h"
 
typedef unsigned size_t;
 
size_t strlen(const char *);
char *strcat(char *, const char *);
char *strcpy(char *, const char *);
 
/* Our system will need some pipes to handle ... life. How about these:
*
* rxpipe - read()s from this pipe read from the UART
140,6 → 147,14
*/
#define DOORBELL_TASK doorbell_task_id
 
 
/*
* Just print Hello World every 15 seconds or so. This is really a test of the
* write() and txpipe infrastructure, but not really a valid part of the task.
*
*/
// #define HELLO_TASK hello_task_id
 
#define LAST_TASK last_task_id
 
typedef enum {
157,8 → 172,8
#ifdef MENU_TASK
MENU_TASK,
#endif
#ifdef COMMAND_TASK
COMMAND_TASK,
#ifdef HELLO_TASK
HELLO_TASK,
#endif
LAST_TASK
} TASKNAME;
168,7 → 183,8
doorbell_task(void),
display_task(void),
keypad_task(void),
menu_task(void);
menu_task(void),
hello_task(void);
// idle_task ... is accomplished within the kernel
extern void restore_context(int *), save_context(int *);
extern SYSPIPE *rxpipe, *txpipe, *pwmpipe, *lcdpipe;
179,20 → 195,20
return LAST_TASK;
} void kinit(TASKP *tasklist) {
#ifdef RTCCLOCK_TASK
//
tasklist[RTCCLOCK_TASK] = new_task(16, rtctask);
// Stack = 36 (rtctask) + 4(rtcdatenext)
tasklist[RTCCLOCK_TASK] = new_task(64, rtctask);
#endif
 
#ifdef DOORBELL_TASK
#ifdef DISPLAY_TASK
// 13 + 10 +9(uwrite)+4(uarthex)+2(uartstr)+2(uartchr)
tasklist[DOORBELL_TASK] = new_task(96, doorbell_task);
// Stack = 36 + 36 (uread/write) + 24(memcpy) + 32(uarthex)+8(uartchr)
tasklist[DOORBELL_TASK] = new_task(256, doorbell_task);
// tasklist[DOORBELL_TASK]->fd[FILENO_STDOUT]= kopen((int)lcdpipe,pipedev);
tasklist[DOORBELL_TASK]->fd[FILENO_STDERR]= kopen((int)txpipe, pipedev);
tasklist[DOORBELL_TASK]->fd[FILENO_AUX] = kopen((int)pwmpipe, pipedev);
 
//
tasklist[DISPLAY_TASK] = new_task(32, display_task);
// Stack = 16 + 36(uread/write) + 24(memcpy)
tasklist[DISPLAY_TASK] = new_task(128, display_task);
tasklist[DISPLAY_TASK]->fd[FILENO_STDIN] = kopen((int)lcdpipe,pipedev);
#endif
#endif
199,18 → 215,27
 
 
#ifdef KEYPAD_TASK
// Stack = 7 + 9(uwrite) + 2*4
tasklist[KEYPAD_TASK] = new_task(32, keypad_task);
// Stack = 28 + 36(uwrite) + 24(memcpy) = 88 bytes
tasklist[KEYPAD_TASK] = new_task(128, keypad_task);
tasklist[KEYPAD_TASK]->fd[FILENO_STDOUT] = kopen((int)keypipe,pipedev);
#endif
#ifdef MENU_TASK
// Stack = 18 + 10(showbell/shownow) + 9(uwrite) + 2(menu_readkey)
// + 18 (time_menu/dawn_menu/dusk_menu)
tasklist[MENU_TASK] = new_task(72, menu_task);
// Stack = 76 + 48(showbell/shownow)
// + 36(uwrite)
// + 8(menu_readkey)
// + 24(memcpy)
// +100(time_menu/dawn_menu/dusk_menu)
//
tasklist[MENU_TASK] = new_task(512, menu_task);
// tasklist[MENU_TASK]->fd[FILENO_STDIN] = kopen((int)keypipe,pipedev);
tasklist[MENU_TASK]->fd[FILENO_STDOUT]= kopen((int)lcdpipe,pipedev);
tasklist[MENU_TASK]->fd[FILENO_STDERR]= kopen((int)txpipe, pipedev);
#endif
 
#ifdef HELLO_TASK
tasklist[HELLO_TASK] = new_task(512, hello_task);
tasklist[HELLO_TASK]->fd[FILENO_STDOUT]= kopen((int)txpipe,pipedev);
#endif
}
 
// #define HALF_HOUR_S 1800 // Seconds per half hour
223,60 → 248,58
const unsigned dawn = 0x060000, dusk = 0x180000;
#endif
 
void shownow(unsigned now) { // Uses 10 stack slots + 8 for write()
char dmsg[9];
dmsg[0] = PACK(0x1b,'[','j','T');
dmsg[1] = PACK('i','m','e',':');
dmsg[2] = PACK(' ',((now>>20)&0x3)+'0',
((now>>16)&0xf)+'0',':');
dmsg[3] = PACK( ((now>>12)&0xf)+'0',
((now>> 8)&0xf)+'0',
':',
((now>> 4)&0xf)+'0');
dmsg[4] = PACK( ((now )&0xf)+'0',
0x1b, '[', '1');
dmsg[5] = PACK(';','0','H',' ');
const char basemsg[] = "\e[jTime: xx:xx:xx\e[1;0H ";
const char nighttime[] = "Night time";
const char daylight[] = "Daylight!";
const char dbellstr[] = "Doorbell!";
void shownow(unsigned now) {
char dmsg[40];
strcpy(dmsg, basemsg);
 
dmsg[ 9] = ((now>>20)&0x0f)+'0';
dmsg[10] = ((now>>16)&0x0f)+'0';
//
dmsg[12] = ((now>>12)&0x0f)+'0';
dmsg[13] = ((now>> 8)&0x0f)+'0';
//
dmsg[15] = ((now>> 4)&0x0f)+'0';
dmsg[16] = ((now )&0x0f)+'0';
 
if ((now < dawn)||(now > dusk)) {
dmsg[6] = PACK('N','i','g','h');
dmsg[7] = PACK('t',' ','t','i');
dmsg[8] = PACK('m','e',0,0);
strcat(dmsg, nighttime);
} else {
dmsg[6] = PACK('D','a','y','l');
dmsg[7] = PACK('i','g','h','t');
dmsg[8] = PACK('!',' ',0,0);
} write(FILENO_STDOUT, dmsg, 9);
strcat(dmsg, daylight);
} write(FILENO_STDOUT, dmsg, strlen(dmsg));
}
 
void showbell(unsigned now) { // Uses 10 stack slots + 8 for write()
char dmsg[9];
dmsg[0] = PACK(0x1b,'[','j','T');
dmsg[1] = PACK('i','m','e',':');
dmsg[2] = PACK(' ',((now>>20)&0x3)+'0',
((now>>16)&0xf)+'0',':');
dmsg[3] = PACK( ((now>>12)&0xf)+'0',
((now>> 8)&0xf)+'0',
':',
((now>> 4)&0xf)+'0');
dmsg[4] = PACK( ((now )&0xf)+'0',
0x1b, '[', '1');
dmsg[5] = PACK(';','0','H',' ');
dmsg[6] = PACK('D','o','o','r');
dmsg[7] = PACK('b','e','l','l');
dmsg[8] = PACK('!',' ',0,0);
write(FILENO_STDOUT, dmsg, 9);
char dmsg[40];
 
strcpy(dmsg, basemsg);
 
dmsg[ 9] = ((now>>20)&0x0f)+'0';
dmsg[10] = ((now>>16)&0x0f)+'0';
//
dmsg[12] = ((now>>12)&0x0f)+'0';
dmsg[13] = ((now>> 8)&0x0f)+'0';
//
dmsg[15] = ((now>> 4)&0x0f)+'0';
dmsg[16] = ((now )&0x0f)+'0';
 
strcat(dmsg, dbellstr);
write(FILENO_STDOUT, dmsg, strlen(dmsg));
}
 
void uartchr(char v) {
if (write(FILENO_STDERR, &v, 1) != 1)
write(FILENO_STDERR, "APPLE-PANIC", 11);
write(FILENO_STDERR, "APPLE-PANIC\r\n", 13);
}
 
void uartstr(const char *str) {
int cnt=0;
while(str[cnt])
cnt++;
int cnt;
cnt = strlen(str);
if (cnt != write(FILENO_STDERR, str, cnt))
write(FILENO_STDERR, "PIPE-PANIC", 10);
write(FILENO_STDERR, "PIPE-PANIC\r\n", 12);
}
 
void uarthex(int num) {
295,11 → 318,10
#include "../dev/samples.c"
 
void belllight(unsigned now) {
IOSPACE *sys = (IOSPACE *)IOADDR;
if ((now < dawn)||(now > dusk))
sys->io_spio = 0x088; // Turn our light on
_sys->io_spio = 0x088; // Turn our light on
else
sys->io_spio = 0x80; // Turn light off
_sys->io_spio = 0x80; // Turn light off
}
 
void doorbell_task(void) {
310,13 → 332,12
// write(KFD_STDOUT, disp_build_gtlogo, sizeof(disp_build_gtlogo));
// write(KFD_STDOUT, disp_reset_data, sizeof(disp_reset_data));
// write(KFD_STDOUT, disp_gtech_data, sizeof(disp_gtech_data));
IOSPACE *sys = (IOSPACE *)IOADDR;
 
while(1) {
int event;
// Initial state: doorbell is not ringing. In this state, we
// can wait forever for an event
sys->io_spio = 0x080; // Turn our light off
_sys->io_spio = 0x080; // Turn our light off
event = wait(INT_BUTTON|SWINT_PPS,-1);
 
#ifndef MENU_TASK
340,15 → 361,15
 
// Check time: should we turn our light on or not?
belllight((volatile unsigned)rtcclock);
const int *sptr = sound_data;
// uartchr('N');
const short *sptr = sound_data;
while(sptr < &sound_data[NSAMPLE_WORDS]) {
int len = &sound_data[NSAMPLE_WORDS]-sptr;
if (len > 256)
len = 256;
if (len > 512)
len = 512;
 
// We will stall here, if the audio FIFO is full
write(FILENO_AUX, sptr, len);
write(FILENO_AUX, sptr,
sizeof(sound_data[0])*len);
sptr += len;
 
// If the user presses the button more than
398,83 → 419,65
#endif
 
#ifdef MENU_TASK
const char menustr[] = "\e[1;0H : ";
 
void entered_menu_str(char *str, unsigned now,int pos) {
//
// Set current time
// xx:xx:xx
//
str[0] = PACK(0x1b, '[', '1',';');
str[1] = PACK('0','H',' ',' ');
str[2] = PACK(' ','x','x',':');
str[3] = PACK('x','x',' ',' ');
//str[3]=PACK('x','x',':','x');
str[4] = PACK(' ','\0','\0','\0');
 
strcpy(str, menustr);
if (pos>0) {
int ch = ((now >> 20)&0x0f)+'0';
str[2] &= ~0x0ff0000;
str[2] |= (ch<<16);
str[9] = ch;
 
if (pos > 1) {
int ch = ((now >> 16)&0x0f)+'0';
str[2] &= ~0x0ff00;
str[2] |= (ch<<8);
ch = ((now >> 16)&0x0f)+'0';
str[10] = ch;
 
if (pos > 2) {
int ch = ((now >> 12)&0x0f)+'0';
str[3] &= ~0xff000000;
str[3] |= (ch<<24);
ch = ((now >> 12)&0x0f)+'0';
str[12] = ch;
 
if (pos > 3) {
int ch = ((now >> 8)&0x0f)+'0';
str[3] &= ~0x0ff0000;
str[3] |= (ch<<16);
str[13] = ch;
 
if (pos > 4) {
int ch = ((now >> 4)&0x0f)+'0';
str[3] &= ~0x0ff00;
str[3] |= ':'<<8;
str[3] &= ~0x0ff;
str[3] |= (ch);
ch = ((now >> 4)&0x0f)+'0';
str[15] = ch;
str[14] = ':';
 
if (pos > 5)
ch = (now&0x0f)+'0';
else
ch = 'x';
str[4] &= ~0x0ff000000;
str[4] |= (ch<<24);
}}}}}
str[16] = ch;
}}}}} str[17] = '\0';
}
 
const char timmenu[] = "\e[jSet current time:";
 
void show_time_menu(unsigned when, int posn) {
char dmsg[10];
dmsg[0] = PACK(0x1b,'[','j','S');
dmsg[1] = PACK('e','t',' ','c');
dmsg[2] = PACK('u','r','r','e');
dmsg[3] = PACK('n','t',' ','t');
dmsg[4] = PACK('i','m','e',':');
entered_menu_str(&dmsg[5], when, posn);
write(FILENO_STDOUT, dmsg, 9);
char dmsg[64];
strcpy(dmsg, timmenu);
entered_menu_str(&dmsg[20], when, posn);
write(FILENO_STDOUT, dmsg, strlen(dmsg));
}
 
const char dawnmenu[] = "\e[jSet sunrise: ";
void show_dawn_menu(unsigned when, int posn) {
char dmsg[10];
dmsg[0] = PACK(0x1b,'[','j','S');
dmsg[1] = PACK('e','t',' ','s');
dmsg[2] = PACK('u','n','r','i');
dmsg[3] = PACK('s','e',':','\0');
entered_menu_str(&dmsg[4], when, posn);
write(FILENO_STDOUT, dmsg, 8);
char dmsg[64];
strcpy(dmsg, dawnmenu);
entered_menu_str(&dmsg[16], when, posn);
write(FILENO_STDOUT, dmsg, strlen(dmsg));
}
 
const char duskmenu[] = "\e[;Set sunset: ";
void show_dusk_menu(unsigned when, int posn) {
char dmsg[10];
dmsg[0] = PACK(0x1b,'[','j','S');
dmsg[1] = PACK('e','t',' ','s');
dmsg[2] = PACK('u','n','s','e');
dmsg[3] = PACK('t',':','\0','\0');
entered_menu_str(&dmsg[4], when, posn);
write(FILENO_STDOUT, dmsg, 8);
char dmsg[64];
entered_menu_str(&dmsg[15], when, posn);
write(FILENO_STDOUT, dmsg, strlen(dmsg));
}
 
int menu_readkey(void) {
605,23 → 608,12
} dusk = newdusk;
}
 
const char unknownstr[] = "\e[jUnknown Cmd Key\e[1;0HA/Tm B/Dwn C/Dsk";
void unknown_menu(void) {
// 0123456789ABCDEF
// Unknown Cmd Key
// A/Tm B/Dwn C/Dsk
char dmsg[11];
dmsg[0] = PACK(0x1b,'[','j','U');
dmsg[1] = PACK('n','k','n','o');
dmsg[2] = PACK('w','n',' ','C');
dmsg[3] = PACK('m','d',' ','K');
dmsg[4] = PACK('e','y','\0','\0');
dmsg[5] = PACK(0x1b,'[','1',';');
dmsg[6] = PACK('0','H','A','/');
dmsg[7] = PACK('T','m',' ','B');
dmsg[8] = PACK('/','D','w','n');
dmsg[9] = PACK(' ','C','/','D');
dmsg[10] = PACK('s','k',0,0);
write(FILENO_STDOUT, dmsg, 11);
write(FILENO_STDOUT, unknownstr, strlen(unknownstr));
}
void menu_task(void) {
// Controls LED 0x08
631,10 → 623,8
// write(KFD_STDOUT, disp_build_gtlogo, sizeof(disp_build_gtlogo));
// write(KFD_STDOUT, disp_reset_data, sizeof(disp_reset_data));
// write(KFD_STDOUT, disp_gtech_data, sizeof(disp_gtech_data));
// IOSPACE *sys = (IOSPACE *)IOADDR;
unsigned belltime = 0, when;
 
 
when = (volatile unsigned)rtcclock;
while(1) {
int event;
672,3 → 662,14
}
#endif
 
 
#ifdef HELLO_TASK
static const char *hello_string = "Hello, World!\r\n";
void hello_task(void) {
while(1) {
for(int i=0; i<15; i++)
wait(SWINT_CLOCK, -1);
write(FILENO_STDOUT, hello_string, strlen(hello_string));
}
}
#endif
/sw/zipos/kernel.c
72,12 → 72,13
 
int LAST_TASK;
 
extern void txstr(const char *);
 
void kernel_entry(void) {
int nheartbeats= 0, tickcount = 0, milliseconds=0, ticks = 0;
int audiostate = 0, buttonstate = 0;
TASKP *tasklist, current;
int *last_context;
IOSPACE *sys = (IOSPACE *)IOADDR;
 
tasklist = ksetup();
 
87,16 → 88,17
 
unsigned enableset =
INT_ENABLEV(INT_BUTTON)
|INT_ENABLEV(INT_TIMA)
|INT_ENABLEV(INT_TIMER)
// |INT_ENABLEV(INT_UARTRX)
// |INT_ENABLEV(INT_UARTTX) // Needs to be turned on by driver
// |INT_ENABLEV(INT_AUDIO // Needs to be turned on by driver)
// |INT_ENABLEV(INT_GPIO)
// |INT_ENABLEV(INT_TIMB);
;
// Then selectively turn some of them back on
sys->io_pic = INT_ENABLE | enableset | 0x07fff;
_sys->io_pic = INT_ENABLE | enableset | 0x07fff;
 
txstr("HEAP: "); txhex(heap);
 
do {
int need_resched = 0, context_has_been_saved, pic;
nheartbeats++;
105,11 → 107,11
 
last_context = current->context;
context_has_been_saved = 0;
pic = sys->io_pic;
pic = _sys->io_pic;
 
if (pic & 0x8000) { // If there's an active interrupt
// Interrupt processing
sys->io_spio = 0x44;
_sys->io_spio = 0x44;
 
// First, turn off pending interrupts
// Although we migt just write 0x7fff7fff to the
119,18 → 121,18
// know about.
pic &= 0x7fff;
// Acknowledge current ints, and turn off pending ints
sys->io_pic = INT_DISABLEV(pic)|(INT_CLEAR(pic));
if(pic&INT_TIMA) {
_sys->io_pic = INT_DISABLEV(pic)|(INT_CLEAR(pic));
if(pic&INT_TIMER) {
if (++ticks >= TICKS_PER_SECOND) {//(pic & SYSINT_PPS)
// Toggle the low order LED
tickcount++;
ticks = 0;
sys->io_spio = ((sys->io_spio&1)^1)|0x010;
_sys->io_spio = ((_sys->io_spio&1)^1)|0x010;
pic |= SWINT_CLOCK;
}
if (buttonstate)
buttonstate--;
else
else if ((_sys->io_spio & 0x0f0)==0)
enableset |= INT_ENABLEV(INT_BUTTON);
}
//
137,12 → 139,14
if (pic&INT_BUTTON) {
// Need to turn the button interrupt off
enableset &= ~(INT_ENABLEV(INT_BUTTON));
if ((sys->io_spio&0x0f0)==0x030)
if ((_sys->io_spio&0x0f0)==0x030)
kpanic();
buttonstate = 3;
if (buttonstate)
pic &= ~INT_BUTTON;
buttonstate = 50;
}
if (pic & INT_UARTRX) {
int v = sys->io_uart;
int v = _sys->io_uart;
if ((v & (~0x7f))==0) {
kpush_syspipe(rxpipe, v);
149,44 → 153,42
 
// Local Echo
if (pic & INT_UARTTX) {
sys->io_uart = v;
sys->io_pic = INT_UARTTX;
_sys->io_uart = v;
_sys->io_pic = INT_UARTTX;
pic &= ~INT_UARTTX;
}
}
} if (pic & INT_UARTTX) {
int v;
if (kpop_syspipe(txpipe, &v)==0) {
char ch;
if (kpop_syspipe(txpipe, &ch)==0) {
unsigned v = ch;
enableset |= (INT_ENABLEV(INT_UARTTX));
sys->io_uart= v;
sys->io_pic = INT_UARTTX;
_sys->io_uart= v;
_sys->io_pic = INT_UARTTX;
// if (v == 'W')
// sys->io_timb = 5;
// sys->io_watchdog = 5;
// 75k was writing the 'e'
} else
enableset &= ~(INT_ENABLEV(INT_UARTTX));
enableset&= ~(INT_DISABLEV(INT_UARTTX));
} if (audiostate) {
if (pic & INT_AUDIO) {
int v;
unsigned short sample;
 
// States:
// 0 -- not in use
// 1 -- First sample, buffer empty
// time to read a new sample
// 2 -- second sample, to read new
// 3 -- Need to turn off
if ((audiostate & 3)==2) {
sys->io_pwm_audio = (audiostate>>2)&0x0ffff;
audiostate = 1;
} else if (kpop_syspipe(pwmpipe, &v)==0) {
audiostate = (2|(v<<2))&0x03ffff;
sys->io_pwm_audio = (v>>16)&0x0ffff;
// 1 -- in use
 
if (kpop_short_syspipe(pwmpipe, &sample)==0) {
_sys->io_pwm_audio = sample;
_sys->io_spio = 0x022;
// audiostate = 1;
} else {
audiostate = 0;
// Turn the device off
sys->io_pwm_audio = 0x10000;
_sys->io_pwm_audio = 0x10000;
// Turn the interrupts off
enableset &= ~(INT_ENABLEV(INT_AUDIO));
sys->io_spio = 0x020;
_sys->io_spio = 0x020;
}
 
// This particular interrupt cannot be cleared
195,46 → 197,50
// it now. If it needs retriggering, the port
// will retrigger itself -- despite being
// cleared here.
sys->io_pic = INT_AUDIO;
}} else { // if (audiostate == 0)
int sample;
if (kpop_syspipe(pwmpipe, &sample)==0) {
audiostate = (2|(sample<<2))&0x03ffff;
sys->io_pwm_audio = 0x310000 | ((sample>>16)&0x0ffff);
_sys->io_pic = INT_AUDIO;
}}
/*
else { // if (audiostate == 0)
unsigned short sample;
 
if (kpop_short_syspipe(pwmpipe, &sample)==0) {
audiostate = 1;
_sys->io_pwm_audio = 0x310000 | sample;
enableset |= (INT_ENABLEV(INT_AUDIO));
sys->io_spio = 0x022;
sys->io_pic = INT_AUDIO;
_sys->io_spio = 0x022;
_sys->io_pic = INT_AUDIO;
} // else sys->io_spio = 0x020;
}
*/
milliseconds = kpost(tasklist, pic, milliseconds);
 
// Restart interrupts
enableset &= (~0x0ffff); // Keep the bottom bits off
sys->io_pic = INT_ENABLE|enableset;
_sys->io_pic = INT_ENABLE|enableset;
} else {
sys->io_pic = INT_ENABLE; // Make sure interrupts are on
int sample;
_sys->io_pic = INT_ENABLE; // Make sure interrupts are on
unsigned short sample;
 
// Check for the beginning of an audio pipe. If the
// interrupt is not enabled, we still might need to
// enable it.
if ((audiostate==0)&&(kpop_syspipe(pwmpipe, &sample)==0)) {
audiostate = (2|(sample<<2))&0x03ffff;
sys->io_pwm_audio = 0x310000 | ((sample>>16)&0x0ffff);
sys->io_pic = INT_AUDIO;
 
if ((audiostate==0)&&(kpop_short_syspipe(pwmpipe, &sample)==0)) {
audiostate = 1;
_sys->io_pwm_audio = 0x310000 | (sample);
_sys->io_pic = INT_AUDIO;
enableset |= (INT_ENABLEV(INT_AUDIO));
sys->io_spio = 0x022;
_sys->io_spio = 0x022;
} // else sys->io_spio = 0x020;
 
// Or the beginning of a transmit pipe.
if (pic & INT_UARTTX) {
int v;
if (kpop_syspipe(txpipe, &v)==0) {
char ch;
if (kpop_syspipe(txpipe, &ch)==0) {
unsigned v = ch;
enableset |= (INT_ENABLEV(INT_UARTTX));
sys->io_uart = v;
sys->io_pic = INT_UARTTX;
// if (v == 'W')
// sys->io_timb = 5;
_sys->io_uart = v;
_sys->io_pic = INT_UARTTX;
} else
enableset &= ~(INT_ENABLEV(INT_UARTTX));
}
244,9 → 250,9
// as syspipe() accomplishes within uwrite_syspipe()
// (We also might've just turned them off ... ooops)
enableset &= (~0x0ffff); // Keep the bottom bits off
sys->io_pic = INT_ENABLE | enableset;
_sys->io_pic = INT_ENABLE | enableset;
}
sys->io_spio = 0x40;
_sys->io_spio = 0x40;
 
int zcc = zip_ucc();
if (zcc & CC_TRAPBIT) {
354,8 → 360,7
restore_context(last_context);
} else if (zcc & (CC_BUSERR|CC_DIVERR|CC_FPUERR|CC_ILL)) {
current->state = SCHED_ERR;
// current->errno = -EBUS;
current->errno = (int)sys->io_buserr;
current->errno = (int)_sys->io_buserr;
save_context(last_context);
context_has_been_saved = 1;
kpanic();
409,7 → 414,7
 
int kpost(TASKP *tasklist, unsigned events, int milliseconds) {
int i;
if (events & INT_TIMA)
if (events & INT_TIMER)
milliseconds++;
if (milliseconds<0) {
milliseconds -= 0x80000000;
/sw/zipos/ksetup.c
46,15 → 46,18
#include "ktraps.h"
#include "errno.h"
#include "swint.h"
#include "txfns.h"
 
typedef unsigned size_t;
 
extern int kntasks(void);
extern void kinit(TASKP *tasklist);
extern void restore_context(int *), save_context(int *);
SYSPIPE *rxpipe, *txpipe, *keypipe, *lcdpipe, *pwmpipe, *cmdpipe;
KDEVICE *pipedev, *txdev, *pwmdev;
void *heap; // = _top_of_heap; // Need to wait on startup to set this
char *heap; // = _top_of_heap; // Need to wait on startup to set this
 
#define CONTEXT_LENGTH 80000 // 1ms
#define CONTEXT_LENGTH (80000-1) // 1ms
 
int LAST_TASK;
 
61,12 → 64,12
__attribute__((cold))
TASKP *ksetup(void) {
TASKP *tasklist;
IOSPACE *sys = (IOSPACE *)IOADDR;
volatile IOSPACE *const sys = _sys;
 
sys->io_spio = 0x0f0;
sys->io_timb = 0; // Turn off the watchdog timer
sys->io_watchdog = 0; // Turn off the watchdog timer
LAST_TASK = kntasks();
heap = _top_of_heap;
heap = (char *)_top_of_heap;
 
pipedev = sys_malloc(sizeof(KDEVICE));
pipedev->write = (RWFDFUN)kwrite_syspipe;
75,26 → 78,25
 
txdev = pwmdev = pipedev;
 
rxpipe = new_syspipe(16); //rxpipe->m_wrtask=INTERRUPT_WRITE_TASK;
txpipe = new_syspipe(8); txpipe->m_rdtask = INTERRUPT_READ_TASK;
keypipe = new_syspipe(16);
lcdpipe = new_syspipe(16);
pwmpipe = new_syspipe(128); pwmpipe->m_rdtask= INTERRUPT_READ_TASK;
cmdpipe = new_syspipe(16);
rxpipe = new_syspipe(64); //rxpipe->m_wrtask=INTERRUPT_WRITE_TASK;
txpipe = new_syspipe(64); txpipe->m_rdtask = INTERRUPT_READ_TASK;
keypipe = new_syspipe(64);
lcdpipe = new_syspipe(64);
pwmpipe = new_syspipe(512); pwmpipe->m_rdtask= INTERRUPT_READ_TASK;
cmdpipe = new_syspipe(64);
 
tasklist = sys_malloc(sizeof(TASKP)*(1+LAST_TASK));
kinit(tasklist);
tasklist[LAST_TASK] = new_task(2, idle_task);
tasklist[LAST_TASK] = new_task(8, idle_task);
 
// Turn all interrupts off, acknowledge all at the same time
sys->io_pic = 0x7fff7fff;
sys->io_pic = INT_CLEARPIC;
 
sys->io_tima = CONTEXT_LENGTH | TM_REPEAT;
sys->io_timer = CONTEXT_LENGTH | TM_REPEAT;
 
{
// Reset our wishbone scope for debug later
SCOPE *scope = (SCOPE *)SCOPEADDR;
scope->s_control = 2;
_scope->s_ctrl = 2;
}
sys->io_spio = 0x0f1;
 
102,15 → 104,13
}
 
void kwait_on_buttonpress(void) {
IOSPACE *sys = (IOSPACE *)IOADDR;
 
// Wait on a button press before starting
while((sys->io_spio & 0x0f0)==0)
while((_sys->io_spio & 0x0f0)==0)
;
sys->io_spio = 0x0f3;
_sys->io_spio = 0x0f3;
for(int i=0; i<40000; i++)
sys->io_spio = ((i>>14)&2)|0x020;
sys->io_spio = 0x0f7;
_sys->io_spio = ((i>>14)&2)|0x020;
_sys->io_spio = 0x0f7;
}
 
// __attribute__((noreturn))
119,19 → 119,9
}
 
__attribute__((malloc))
void *sys_malloc(int sz) {
if (0) {
SCOPE *s = (SCOPE *)SCOPEADDR;
s->s_control = TRIGGER_SCOPE_NOW | (s->s_control & 0x0ffff);
}
 
void *sys_malloc(size_t sz) {
void *res = heap;
heap += sz;
if ((int)heap > ((int)&res)-32) {
IOSPACE *sys = (IOSPACE *)IOADDR;
sys->io_spio = 0xf3;
asm("break 0");
}
heap = heap + ((sz+3)&-4);
return res;
}
 
/sw/zipos/ktraps.h
56,7 → 56,8
// If the timeout < 0, clears any pending timeout wakeup
// If the timeout > 0, sets a pending timeout wakeup and
// returns.
// If the timeout == 0, does nothing.
// If the timeout == 0, clears the respective interrupt
// slash event, and does nothing more.
TRAPID_WAIT, TRAPID_CLEAR, TRAPID_POST,
// Yield: Yields the processor until the next scheduled time slice.
TRAPID_YIELD,
63,10 → 64,10
TRAPID_READ, TRAPID_WRITE,
TRAPID_TIME,
// Return from a kernel system call. This is necessary if ever an
// exception triggers a syste call. In such cases, it will be
// exception triggers a system call. In such cases, it will be
// impossible to return the caller back to his context in a pristine
// manner ... without help.
// TRAPID_KRETURN
// TRAPID_KRETURN,
// Semaphore ID's. These allow us to run the rest of the trap
// stuffs in kernel space
TRAPID_SEMGET, TRAPID_SEMPUT, TRAPID_SEMNEW,
/sw/zipos/pipesetup.c
44,6 → 44,7
#include "syspipe.h"
#include "zipsys.h"
#include "ktraps.h"
#include "txfns.h"
 
#ifndef NULL
#define NULL (void *)0
77,43 → 78,10
p->m_nwritten = 0;
}
 
// These routines really belong elsewhere in a uartdump.c file or some such.
// However, until placed there, they'll stay put here for a bit longer.
void txchr(char v) {
volatile IOSPACE *sys = (IOSPACE *)IOADDR;
if (v < 10)
return;
v &= 0x0ff;
sys->io_pic = INT_UARTTX;
while((sys->io_pic&INT_UARTTX)==0)
;
sys->io_uart = v;
}
 
void txstr(const char *str) {
const char *ptr = str;
while(*ptr) {
txchr(*ptr++);
}
}
 
void txhex(int num) {
for(int ds=28; ds>=0; ds-=4) {
int ch;
ch = (num>>ds)&0x0f;
if (ch >= 10)
ch = 'A'+ch-10;
else
ch += '0';
txchr(ch);
} txstr("\r\n");
}
 
void pipe_panic(SYSPIPE *pipe) {
extern void kpanic(void);
volatile IOSPACE *sys = (IOSPACE *)IOADDR;
 
sys->io_spio = 0x0fa;
_sys->io_spio = 0x0fa;
txstr("SYSPIPE PANIC!\r\n");
txstr("ADDR: "); txhex((int)pipe);
126,7 → 94,7
SYSPIPE *new_syspipe(const unsigned int len) {
unsigned msk;
 
for(msk=2; msk<len; msk<<=1)
for(msk=16; msk<len; msk<<=1)
;
SYSPIPE *pipe = sys_malloc(sizeof(SYSPIPE)-1+msk);
pipe->m_mask = msk-1;
/sw/zipos/resetdump.s
32,7 → 32,7
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;//
;;
;; Copyright (C) 2015-2016, Gisselquist Technology, LLC
;; Copyright (C) 2015-2017, Gisselquist Technology, LLC
;;
;; This program is free software (firmware): you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as published
62,56 → 62,29
_start:
; Upon reset, we must output our registers to the UART, lest we reset because
; of a crash
STO R0,(DBG)
MOV PC+1,R0
BRA internal_kpanic
SW R0,(DBG)
JSR internal_kpanic
LDI _top_of_stack,SP
LDI kernel_entry,R0
BRA bootloader
BRA _bootloader
 
.global kpanic
.type kpanic,@function
kpanic:
STO R0,(DBG)
STO R1,1(DBG)
STO R2,2(DBG)
LDI 'P',R1
MOV PC+1,R0
JMP raw_put_uart
LDI 'a',R1
MOV PC+1,R0
JMP raw_put_uart
LDI 'n',R1
MOV PC+1,R0
JMP raw_put_uart
LDI 'i',R1
MOV PC+1,R0
JMP raw_put_uart
LDI 'c',R1
MOV PC+1,R0
JMP raw_put_uart
LDI ':',R1
MOV PC+1,R0
JMP raw_put_uart
LDI ' ',R1
MOV PC+1,R0
JMP raw_put_uart
LDI '\r',R1
MOV PC+1,R0
JMP raw_put_uart
LDI '\n',R1
MOV PC+1,R0
JMP raw_put_uart
LOD 1(DBG),R1
LOD 2(DBG),R2
MOV PC+1,R0
JMP internal_kpanic
SW R0,(DBG)
SW R1,4(DBG)
SW R2,8(DBG)
LDI panicstr, R1
JSR raw_put_string
LW 4(DBG),R1
LW 8(DBG),R2
JSR internal_kpanic
kpanic_wait_for_button_release:
LOD (SPIO),R0
LW (SPIO),R0
TEST 0x010,R0
BNZ kpanic_wait_for_button_release
kpanic_wait_for_button:
LOD (SPIO),R0
LW (SPIO),R0
TEST 0x010,R0
BZ kpanic_wait_for_button
BRA _start
118,191 → 91,159
HALT
internal_kpanic:
STO R1,1(DBG)
STO R2,2(DBG)
STO R0,3(DBG) ; Our return address
; The original R0 is stored in (DBG)
SW R1,4(DBG)
SW R2,8(DBG)
SW R0,12(DBG) ; Our return address
 
; R0
LDI 0,R1
LOD (DBG),R2
MOV .Lcall0(PC),R0
JMP uart_put_reg_value
.Lcall0:
LW (DBG),R2
JSR uart_put_reg_value
 
; R1
LDI 1,R1
LOD 1(DBG),R2
MOV .Lcall1(PC),R0
JMP uart_put_reg_value
.Lcall1:
LW 4(DBG),R2
JSR uart_put_reg_value
; R2
LDI 2,R1
LOD 2(DBG),R2
MOV PC+1,R0
JMP uart_put_reg_value
LW 8(DBG),R2
JSR uart_put_reg_value
; R3
LDI 3,R1
MOV R3,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R4
LDI 4,R1
MOV R4,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R5
LDI 5,R1
MOV R5,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R6
LDI 6,R1
MOV R6,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R7
LDI 7,R1
MOV R7,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R8
LDI 8,R1
MOV R8,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R9
LDI 9,R1
MOV R9,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R10
LDI 10,R1
MOV R10,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R11
LDI 11,R1
MOV R11,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; R12
LDI 12,R1
MOV R12,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; SP
LDI 13,R1
MOV R13,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; uR0
LDI 16,R1
MOV uR0,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; uR1
LDI 17,R1
MOV uR1,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 18,R1
MOV uR2,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 19,R1
MOV uR3,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 20,R1
MOV uR4,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 21,R1
MOV uR5,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 22,R1
MOV uR6,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 23,R1
MOV uR7,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 24,R1
MOV uR8,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 25,R1
MOV uR9,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 26,R1
MOV uR10,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 27,R1
MOV uR11,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
LDI 28,R1
MOV uR12,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; uSP
LDI 29,R1
MOV uSP,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; uCC
LDI 30,R1
MOV uCC,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
; uPC
LDI 31,R1
MOV uPC,R2
MOV PC+1,R0
JMP uart_put_reg_value
JSR uart_put_reg_value
 
;stack_mem_dump:
;LDI 0,R4
;LDI _top_of_stack,R5
; LDI 0,R4
; LDI _top_of_stack,R5
;stack_mem_dump_loop:
;MOV R4,R1
;LOD (R5),R2
;MOV PC+1,R0
;JMP uart_put_stack_value
;ADD 1,R4
;SUB 1,R5
;CMP 64,R4
;BLT stack_mem_dump_loop
; MOV R4,R1
; LW (R5),R2
; JSR uart_put_stack_value
; ADD 4,R4
; SUB 4,R5
; CMP 256,R4
; BLT stack_mem_dump_loop
 
; Get prepared for a proper start by setting our stack register
LDI _top_of_stack,SP
313,23 → 254,22
; Now, do a full dump of all memory--all registers are available to us
dump_memory:
LDI RAM,R5
LDI 0x1000,R6
LDI 0x0fff,R6
LDI 0x0f8,R7
STO R7,(SPIO)
SW R7,(SPIO)
full_mem_dump_loop:
MOV R5,R1
LOD (R5),R2
MOV PC+1,R0
JMP uart_dump_mem_value
LW (R5),R2
JSR uart_dump_mem_value
LDI 0x0f2,R7
STO R7,(SPIO)
SW R7,(SPIO)
 
ADD 1,R5
ADD 4,R5
SUB 1,R6
BGT full_mem_dump_loop
BGE full_mem_dump_loop
 
LDI 0x0f5,R7
STO R7,(SPIO)
SW R7,(SPIO)
 
dump_scope:
; Finally, do a full dump of the scope--if it had triggered
336,10 → 276,9
; First, dump the scope control word
LDI SCOPE,R7 ; R7 = Debugging scope address
MOV R7,R1
LOD (R7),R2
LW (R7),R2
MOV R2,R5 ; R5 will not be changed by a subroutine
MOV PC+1,R0
BRA uart_dump_mem_value
JSR uart_dump_mem_value
; Then test whether or not the scope has stopped
LDI 0x40000000,R1
TEST R1,R5
349,116 → 288,72
LSR 20,R5
AND 0x1f,R5
LDI 1,R6
LSL R5,R6
LSL R5,R6 ; R6 is now the size (number of words) of the scope
SUB 1,R6 ; Now it is one less than the size,2 support the BGE l8r
; And start dumping
ADD 1,R7 ; Get the scope data address
ADD 4,R7 ; Get the scope data address
dump_scope_loop:
MOV R7,R1
LOD (R7),R2
MOV PC+1,R0
BRA uart_dump_mem_value
LW (R7),R2
JSR uart_dump_mem_value
SUB 1,R6
BGT dump_scope_loop
BGE dump_scope_loop
 
dump_buserr:
; Dump a bus error address, if used
LDI 'B',R1
MOV PC+1,R0
BRA raw_put_uart
LDI 'u',R1
MOV PC+1,R0
BRA raw_put_uart
LDI 's',R1
MOV PC+1,R0
BRA raw_put_uart
LDI 'E',R1
MOV PC+1,R0
BRA raw_put_uart
LDI 'r',R1
MOV PC+1,R0
BRA raw_put_uart
LDI 'r',R1
MOV PC+1,R0
BRA raw_put_uart
LDI ':',R1
MOV PC+1,R0
BRA raw_put_uart
LDI ' ',R1
MOV PC+1,R0
BRA raw_put_uart
LDI buserr_header, R1
JSR raw_put_string
LDI BUSERR,R1
LOD (R1),R2
MOV PC+1,R0
BRA uart_dump_mem_value
LW (R1),R2
JSR uart_dump_mem_value
 
end_internal_panic:
LDI '\r',R1
MOV PC+1,R0
BRA raw_put_uart
LDI '\n',R1
MOV PC+1,R0
BRA raw_put_uart
LDI '\r',R1
MOV PC+1,R0
BRA raw_put_uart
LDI '\n',R1
MOV PC+1,R0
BRA raw_put_uart
LDI doublenewline,R1
JSR raw_put_string
LDI 0x0ff,R7
STO R7,(SPIO)
LOD 3(DBG),PC
SW R7,(SPIO)
LW 12(DBG),PC
JMP R0
 
; R0 is return address
; R1 is register ID
; R2 is register to output
; R2 is register value to output
uart_put_reg_value:
STO R0,4(DBG)
STO R2,5(DBG)
STO R3,6(DBG)
SW R0,16(DBG)
SW R2,20(DBG)
SW R3,24(DBG)
MOV R1,R2
LDI 'u',R1
CMP 16,R2
LDILO.LT 's',R1
SUB.GE 16,R2
MOV PC+1,R0
JMP raw_put_uart
JSR raw_put_uart
LDI '0',R1
CMP 10,R2
LDILO.GE '1',R1
SUB.GE 10,R2
MOV PC+1,R0
JMP raw_put_uart
JSR raw_put_uart
MOV R2,R1
AND 15,R1
MOV PC+1,R0
JMP get_hex
MOV PC+1,R0
JMP raw_put_uart
LDI 58,R1 ; A ':'
MOV PC+1,R0
JMP raw_put_uart
LOD 5(DBG),R2
JSR get_hex
JSR raw_put_uart
LDI ':',R1
JSR raw_put_uart
LW 20(DBG),R2
LDI 8,R3
uart_put_loop:
ROL 4,R2
MOV R2,R1
AND 15,R1
MOV PC+1,R0
JMP get_hex
MOV PC+1,R0
JMP raw_put_uart
LSR 28,R1
LSL 4,R2
JSR get_hex
JSR raw_put_uart
SUB 1,R3
BNZ uart_put_loop
LDI '\r',R1
MOV PC+1,R0
JMP raw_put_uart
LDI '\n',R1
MOV PC+1,R0
JMP raw_put_uart
LOD 4(DBG),R0
LOD 5(DBG),R2
LOD 6(DBG),R3
LDI newline, R1
JSR raw_put_string
LW 16(DBG),R0
LW 20(DBG),R2
LW 24(DBG),R3
JMP R0
 
uart_dump_mem_value:
466,107 → 361,109
; R1 = Memory address
; R2 = Memory Value
; Local: R3 = working value
STO R0,7(DBG)
SW R0,28(DBG)
MOV R1,R3 ; R3 = Memory address
MOV R2,R4 ; R4 = Memory Value
LDI 77,R1 ; 77 = 'M'
MOV PC+1,R0
JMP raw_put_uart
LDI 91,R1 ; 91 = '['
MOV PC+1,R0
JMP raw_put_uart
LDI 48,R1 ; A '0'
MOV PC+1,R0
JMP raw_put_uart
LDI 120,R1 ; An 'x'
MOV PC+1,R0
JMP raw_put_uart
LDI memopenstr,R1
JSR raw_put_string
; Set up a loop to dump things
ROL 16,R3 ; Ignore the first 16 bits
LSL 16,R3 ; Ignore the first 16 bits
LDI 4,R2 ; We're going to do four hex digits here
;
uart_put_mem_address_loop:
ROL 4,R3
MOV R3,R1
AND 15,R1
MOV PC+1,R0
JMP get_hex
MOV PC+1,R0
JMP raw_put_uart
LSR 28,R1
LSL 4,R3
JSR get_hex
JSR raw_put_uart
SUB 1,R2
BNZ uart_put_mem_address_loop
; Put some transition characters
LDI 93,R1 ; 93 = ']'
MOV PC+1,R0
JMP raw_put_uart
LDI 58, R1 ; A semicolon
MOV PC+1,R0
JMP raw_put_uart
LDI 32, R1 ; A space
MOV PC+1,R0
JMP raw_put_uart
LDI memmidstr,R1
JSR raw_put_string
 
; Set up a loop to dump the memory value now
LDI 8,R2
uart_put_mem_value_loop:
ROL 4,R4
MOV R4,R1
AND 15,R1
MOV PC+1,R0
JMP get_hex
MOV PC+1,R0
JMP raw_put_uart
LSR 28,R1
LSL 4,R4
JSR get_hex
JSR raw_put_uart
SUB 1,R2
BNZ uart_put_mem_value_loop
; Clear the line
LDI '\r', R1
MOV PC+1,R0
JMP raw_put_uart
LDI '\n', R1
MOV PC+1,R0
JMP raw_put_uart
LDI newline,R1
JSR raw_put_string
; And return from our subroutine
LOD 7(DBG),R0
LW 28(DBG),R0
JMP R0
 
get_hex:
ADD 0x30,R1
CMP 0x39,R1
ADD.GT 7,R1 ; Add 'A'-'0'-10
CMP 0x3a,R1
ADD.GE 7,R1 ; Add 'A'-'0'-10
JMP R0
 
raw_put_uart: ; R0 is return address, R1 is value to transmit
STO R2,8(DBG)
; R0 is the return address
; R1 is the string address
raw_put_string:
SW R0,36(DBG)
SW R2,40(DBG)
MOV R1,R2
raw_put_string_next:
LB (R2),R1
CMP 0,R1
LW.Z 36(DBG),R0
LW.Z 40(DBG),R2
RTN.Z
ADD 1,R2
MOV raw_put_string_next(PC),R0
BRA raw_put_uart
; R0 is return address,
; R1 is value to transmit
raw_put_uart:
SW R2,32(DBG)
LDI INT_UARTTX,R2
STO R2,(PIC) ; Clear the PIC, turn off interrupts, etc.
SW R2,(PIC) ; Clear the PIC, turn off interrupts, etc.
raw_put_uart_retest:
LOD (PIC),R2
LW (PIC),R2
TEST INT_UARTTX,R2
BZ raw_put_uart_retest
STO R1,(UART)
LOD 8(DBG),R2
SW R1,(UART)
LW 32(DBG),R2
JMP R0
 
.section .fixdata
DBG:
.byte 0,0,0,0,0,0,0,0,0
.int 0,0,0,0,0,0,0,0,0,0
 
.set INT_UARTRX, 0x040
.set INT_UARTTX, 0x080
.set PIC, 0x0100
.set BUSERR, 0x0101
.set TMRA, 0x0102
.set TMRB, 0x0103
.set PWM, 0x0104
.set SPIO, 0x0105
.set GPIO, 0x0106
.set UART, 0x0107
.set VERSION, 0x0108
.set SCOPE, 0x0200
.set SCOPED, 0x0201
.set CLOCK, 0x0800
.set CONFIG, 0x0400
.set TIMER, 0x0801
.set STOPWATCH,0x802
.set ALARM, 0x0803
.set RAM, 0x2000
.set PIC, 0x0400
.set BUSERR, 0x0404
.set TMRA, 0x0408
.set TMRB, 0x040c
.set PWM, 0x0410
.set SPIO, 0x0414
.set GPIO, 0x0418
.set UART, 0x041c
.set VERSION, 0x0420
.set SCOPE, 0x0800
.set SCOPED, 0x0804
.set RAM, 0x8000
.section .rodata
doublenewline:
.ascii "\r\n"
newline:
.asciz "\r\n"
buserr_header:
.string "BusErr: "
panicstr:
.string "Panic: \r\n"
memopenstr:
.string "M[0x"
memmidstr:
.string "]; "
 
/sw/zipos/syspipe.c
46,12 → 46,13
#include "syspipe.h"
#include "zipsys.h"
#include "ktraps.h"
#include "string.h"
 
#ifndef NULL
#define NULL (void *)0
#endif
 
void kpush_syspipe(SYSPIPE *pipe, int val) {
void kpush_syspipe(SYSPIPE *pipe, char val) {
int tst = (pipe->m_head+1)&pipe->m_mask;
if (tst != pipe->m_tail) {
pipe->m_buf[pipe->m_head] = val;
62,8 → 63,15
}
 
extern void pipe_panic(SYSPIPE *p);
int kpop_syspipe(SYSPIPE *pipe, int *vl) {
/*
* kpop_syspipe
*
* Called from an interrupt context to pop one byte off of the syspipe.
*/
int kpop_syspipe(SYSPIPE *pipe, char *vl) {
if (pipe->m_head != pipe->m_tail) {
// The head will *only* equal the tail if the pipe is empty.
// We come in here, therefore, if the pipe is non-empty
*vl = pipe->m_buf[pipe->m_tail];
pipe->m_tail = (pipe->m_tail+1)&pipe->m_mask;
if (pipe->m_wrtask)
73,12 → 81,30
return 1; // Error condition
}
 
/* Returns how many values are in the pipe
/*
* kpop_short_syspipe
*
* This is identical to kpop_syspipe, save that we are pulling a short value
* off of the syspipe (i.e. a pair of chars), not just a single char.
*/
/* Of course ... if it's not used, why include it?
int kpop_short_syspipe(SYSPIPE *pipe, unsigned short *vl) {
if (pipe->m_head == pipe->m_tail)
return 1; // Error condition
 
unsigned short *sptr = (unsigned short *)&pipe->m_buf[pipe->m_tail];
// sv = pipe->m_buf[pipe->m_tail];
*vl = *sptr;;
pipe->m_tail = (pipe->m_tail+2)&pipe->m_mask;
if (pipe->m_wrtask)
pipe->m_wrtask->state = SCHED_READY;
return 0;
}
 
/*
int len_syspipe(SYSPIPE *p) {
return (p->m_head-p->m_tail) & p->m_mask;
} */
 
/* Returns how many empty spaces are in the pipe
*/
int num_avail_syspipe(SYSPIPE *p) {
96,7 → 122,8
// Another task may write to the pipe during this call. If the pipe becomes
// full, that task will block.
//
static int uread_syspipe(TASKP tsk __attribute__((__unused__)), SYSPIPE *p, int *dst, int len) {
static int uread_syspipe(TASKP tsk __attribute__((__unused__)),
SYSPIPE *p, char *dst, int len) {
int nleft= len, h;
if (len == 0) {
// We'll only get here if we were released from within a
116,9 → 143,8
int ln1 = p->m_mask+1 - p->m_tail; // Navail to be read
ln1 = (ln1 > nleft) ? nleft : ln1;
if (ln1 > 0) {
register int *src = &p->m_buf[p->m_tail];
for(int i=0; i<ln1; i++)
*dst++ = *src++;
memcpy(dst, &p->m_buf[p->m_tail], ln1);
dst += ln1;
 
p->m_nread += ln1;
nleft -= ln1;
144,9 → 170,8
int ln1 = h - p->m_tail;
ln1 = (ln1 < nleft) ? ln1 : nleft;
 
int *src = &p->m_buf[p->m_tail];
for(int i=0; i<ln1; i++)
*dst++ = *src++;
memcpy(dst, &p->m_buf[p->m_tail], ln1);
dst += ln1;
 
p->m_nread += ln1;
nleft -= ln1;
172,7 → 197,8
// pointer. It can change from one time through our loop
// to the next.
if (((volatile SYSPIPE *)p)->m_wrtask) {
int *src, ln;
int ln;
char *src;
 
// If the head changed before the write task blocked,
// then go around again and copy some more before
189,11 → 215,11
ln = nleft;
if (p->m_wrtask->context[4] < nleft)
ln = p->m_wrtask->context[4];
src = (int *)p->m_wrtask->context[3];
src = (char *)p->m_wrtask->context[3];
memcpy(dst, src, ln);
dst += ln;
src += ln;
 
for(int i=0; i<ln; i++)
*dst++ = *src++;
 
p->m_nwritten += ln;
p->m_nread += ln;
 
244,7 → 270,7
}
 
static int uwrite_syspipe(TASKP tsk __attribute__((__unused__)),
SYSPIPE *p, int *src, int len) {
SYSPIPE *p, char *src, int len) {
int nleft = len;
 
// The kernel guarantees, before we come into here, that we have a
263,9 → 289,8
int ln = nleft;
if (ln > p->m_rdtask->context[4])
ln = p->m_rdtask->context[4];
int *dst = (int *)p->m_rdtask->context[3];
for(int i=0; i<ln; i++)
*dst++ = *src++;
memcpy((char *)p->m_rdtask->context[3], src, ln);
src += ln;
p->m_nread += ln;
p->m_rdtask->context[3]+= ln;
p->m_rdtask->context[4]-= ln;
318,34 → 343,17
// so that it remains consistent under interrupt
// conditions.
int ln = p->m_mask+1-p->m_head;
int *dst = &p->m_buf[p->m_head];
if (ln > nleft) ln = nleft;
if (ln > navail) ln = navail;
 
for(int i=0; i<ln; i++)
*dst++ = *src++;
memcpy((void *)&p->m_buf[p->m_head], src, ln);
src += ln;
 
p->m_head = (p->m_head+ln)&p->m_mask;
nleft -= ln;
p->m_nwritten += ln;
navail -= ln;
nleft -= ln;
p->m_nwritten += ln;
navail -= ln;
}
 
/*
// Write into the rest of the pipe
if ((0 == p->m_head)&&(nleft>0)&&(navail>0)) {
int ln = navail;
if (nleft < ln)
ln = nleft;
int *dst = &p->m_buf[p->m_head];
 
for(int i=0; i<ln; i++)
*dst++ = *src++;
 
p->m_head += ln;
p->m_nwritten += ln;
nleft -= ln;
}*/
}
 
if ((nleft > 0)&&(navail == 0)) {
371,7 → 379,7
}
 
// This will be called from a kernel (interrupt) context
void kread_syspipe(TASKP tsk, int dev, int *dst, int len) {
void kread_syspipe(TASKP tsk, int dev, char *dst, int len) {
SYSPIPE *p = (SYSPIPE *)dev;
if (p->m_rdtask != NULL) {
// If the pipe already has a read task, then we fail
415,7 → 423,7
}
}
 
void kwrite_syspipe(TASKP tsk, int dev, int *src, int len) {
void kwrite_syspipe(TASKP tsk, int dev, char *src, int len) {
SYSPIPE *p = (SYSPIPE *)dev;
if (p->m_wrtask != NULL) {
// If the pipe already has a write task, then we fail
/sw/zipos/syspipe.h
46,7 → 46,7
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
73,8 → 73,10
#ifndef SYSPIPE_H
#define SYSPIPE_H
 
extern void *sys_malloc(int sz);
typedef unsigned size_t;
 
extern void *sys_malloc(size_t sz);
 
typedef struct {
unsigned int m_mask;
int m_head, m_tail;
83,14 → 85,15
int dummy;
int m_error;
 
int m_buf[1];
char m_buf[1];
} SYSPIPE;
 
SYSPIPE *new_syspipe(const unsigned int len);
extern void kread_syspipe( TASKP tsk, int dev, int *dst, int len);
extern void kwrite_syspipe(TASKP tsk, int dev, int *src, int len);
void kpush_syspipe(SYSPIPE *p, int val);
int kpop_syspipe(SYSPIPE *p, int *val);
extern void kread_syspipe( TASKP tsk, int dev, char *dst, int len);
extern void kwrite_syspipe(TASKP tsk, int dev, char *src, int len);
void kpush_syspipe(SYSPIPE *p, char val);
int kpop_syspipe(SYSPIPE *p, char *val);
int kpop_short_syspipe(SYSPIPE *p, unsigned short *val);
extern int num_avail_syspipe(SYSPIPE *p);
extern int len_syspipe(SYSPIPE *p);
 
/sw/zipos/taskp.c
39,6 → 39,7
#include "ksched.h"
#include "kfildes.h"
#include "taskp.h"
#include "txfns.h"
 
extern void *sys_malloc(int sz);
TASKP new_task(unsigned ln, VENTRYP entry) {
47,11 → 48,11
 
for(i=0; (unsigned)i<sizeof(struct TASK_S)+ln; i++)
((unsigned int *)tsk)[i] = 0;
tsk->context[ 0] = (int)((long)(int *)idle_task);
tsk->context[ 0] = (int)(idle_task);
tsk->context[12] = (int)&tsk->user_data[ln]; // Set the stack pointer
tsk->context[13] = (int)&tsk->user_data[ln]; // Set the stack pointer
tsk->context[14] = 0x20; // GIE bit only
tsk->context[15] = (int)((long)(int *)entry);
tsk->context[15] = (int)((int *)entry);
tsk->user_heap = &tsk->user_data[0];
tsk->state = SCHED_READY;
 
/sw/zipos/ziplib.c
5,5 → 5,7
do {
*p++ = c;
} while(n-- > 0);
 
return s;
}
 
/sw/zipos/zipsys.h
79,13 → 79,11
#endif
 
static inline void DISABLE_INTS(void) {
IOSPACE *sys = (IOSPACE *)IOADDR;
sys->io_pic = 0;
_sys->io_pic = 0;
}
 
static inline void ENABLE_INTS(void) {
IOSPACE *sys = (IOSPACE *)IOADDR;
sys->io_pic = INT_ENABLE;
_sys->io_pic = INT_ENABLE;
}
 
#endif

powered by: WebSVN 2.1.0

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