diff --git a/09-PlaySound/Makefile b/09-PlaySound/Makefile new file mode 100644 index 0000000..58cedf1 --- /dev/null +++ b/09-PlaySound/Makefile @@ -0,0 +1,223 @@ +PROJECT = PlaySound +PRJ_C_SRC = main.c \ + sound.c \ + serial_output.c \ + ../ChibiOS/os/various/chprintf.c + +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +# Compiler options here. +ifeq ($(USE_OPT),) + USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16 +endif + +# C specific options here (added to USE_OPT). +ifeq ($(USE_COPT),) + USE_COPT = +endif + +# C++ specific options here (added to USE_OPT). +ifeq ($(USE_CPPOPT),) + USE_CPPOPT = -fno-rtti +endif + +# Enable this if you want the linker to remove unused code and data +ifeq ($(USE_LINK_GC),) + USE_LINK_GC = yes +endif + +# If enabled, this option allows to compile the application in THUMB mode. +ifeq ($(USE_THUMB),) + USE_THUMB = yes +endif + +# Enable this if you want to see the full log while compiling. +ifeq ($(USE_VERBOSE_COMPILE),) + USE_VERBOSE_COMPILE = no +endif + +# +# Build global options +############################################################################## + +############################################################################## +# Architecture or project specific options +# + +# Enables the use of FPU on Cortex-M4. +# Enable this if you really want to use the STM FWLib. +ifeq ($(USE_FPU),) + USE_FPU = no +endif + +# Enable this if you really want to use the STM FWLib. +ifeq ($(USE_FWLIB),) + USE_FWLIB = no +endif + +# +# Architecture or project specific options +############################################################################## + +############################################################################## +# Project, sources and paths +# + +# Imported source files and paths +CHIBIOS = ../ChibiOS +include $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mk +include $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mk +include $(CHIBIOS)/os/hal/hal.mk +include $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mk +include $(CHIBIOS)/os/kernel/kernel.mk + +# Define linker script file here +LDSCRIPT= $(PORTLD)/STM32F407xG.ld +#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CSRC = $(PORTSRC) \ + $(KERNSRC) \ + $(HALSRC) \ + $(PLATFORMSRC) \ + $(BOARDSRC) \ + $(PRJ_C_SRC) + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CPPSRC = + +# C sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACSRC = + +# C++ sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +ACPPSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCSRC = + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +TCPPSRC = + +# List ASM source files here +ASMSRC = $(PORTASM) + +INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ + $(HALINC) $(PLATFORMINC) $(BOARDINC) \ + $(CHIBIOS)/os/various/devices_lib/accel \ + $(CHIBIOS)/os/various + +# +# Project, sources and paths +############################################################################## + +############################################################################## +# Compiler settings +# + +MCU = cortex-m4 + +#TRGT = arm-elf- +TRGT = arm-none-eabi- +CC = $(TRGT)gcc +CPPC = $(TRGT)g++ +# Enable loading with g++ only if you need C++ runtime support. +# NOTE: You can use C++ even without C++ support if you are careful. C++ +# runtime support makes code size explode. +LD = $(TRGT)gcc +#LD = $(TRGT)g++ +CP = $(TRGT)objcopy +AS = $(TRGT)gcc -x assembler-with-cpp +OD = $(TRGT)objdump +HEX = $(CP) -O ihex +BIN = $(CP) -O binary + +# ARM-specific options here +AOPT = + +# THUMB-specific options here +TOPT = -mthumb -DTHUMB + +# Define C warning options here +CWARN = -Wall -Wextra -Wstrict-prototypes + +# Define C++ warning options here +CPPWARN = -Wall -Wextra + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default C defines here, like -D_DEBUG=1 +DDEFS = + +# List all default ASM defines here, like -D_DEBUG=1 +DADEFS = + +# List all default directories to look for include files here +DINCDIR = + +# List the default directory to look for the libraries here +DLIBDIR = + +# List all default libraries here +DLIBS = + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +UDEFS = + +# Define ASM defines here +UADEFS = + +# List all user directories here +UINCDIR = + +# List the user directory to look for the libraries here +ULIBDIR = + +# List all user libraries here +ULIBS = + +# +# End of user defines +############################################################################## + +ifeq ($(USE_FPU),yes) + USE_OPT += -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fsingle-precision-constant + DDEFS += -DCORTEX_USE_FPU=TRUE +else + DDEFS += -DCORTEX_USE_FPU=FALSE +endif + +ifeq ($(USE_FWLIB),yes) + include $(CHIBIOS)/ext/stm32lib/stm32lib.mk + CSRC += $(STM32SRC) + INCDIR += $(STM32INC) + USE_OPT += -DUSE_STDPERIPH_DRIVER +endif + +include $(CHIBIOS)/os/ports/GCC/ARMCMx/rules.mk diff --git a/09-PlaySound/chconf.h b/09-PlaySound/chconf.h new file mode 100644 index 0000000..0c2fc8c --- /dev/null +++ b/09-PlaySound/chconf.h @@ -0,0 +1,535 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; 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. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef _CHCONF_H_ +#define _CHCONF_H_ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) +#define CH_FREQUENCY 1000 +#endif + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + */ +#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) +#define CH_TIME_QUANTUM 20 +#endif + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_USE_MEMCORE. + */ +#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) +#define CH_MEMCORE_SIZE 0 +#endif + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread automatically. The application has + * then the responsibility to do one of the following: + * - Spawn a custom idle thread at priority @p IDLEPRIO. + * - Change the main() thread priority to @p IDLEPRIO then enter + * an endless loop. In this scenario the @p main() thread acts as + * the idle thread. + * . + * @note Unless an idle thread is spawned the @p main() thread must not + * enter a sleep state. + */ +#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) +#define CH_NO_IDLE_THREAD FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) +#define CH_OPTIMIZE_SPEED TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) +#define CH_USE_REGISTRY TRUE +#endif + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) +#define CH_USE_WAITEXIT TRUE +#endif + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) +#define CH_USE_SEMAPHORES TRUE +#endif + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special requirements. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) +#define CH_USE_SEMAPHORES_PRIORITY FALSE +#endif + +/** + * @brief Atomic semaphore API. + * @details If enabled then the semaphores the @p chSemSignalWait() API + * is included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) +#define CH_USE_SEMSW TRUE +#endif + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) +#define CH_USE_MUTEXES TRUE +#endif + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_MUTEXES. + */ +#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) +#define CH_USE_CONDVARS TRUE +#endif + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_CONDVARS. + */ +#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) +#define CH_USE_CONDVARS_TIMEOUT TRUE +#endif + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) +#define CH_USE_EVENTS TRUE +#endif + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_EVENTS. + */ +#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) +#define CH_USE_EVENTS_TIMEOUT TRUE +#endif + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) +#define CH_USE_MESSAGES TRUE +#endif + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special requirements. + * @note Requires @p CH_USE_MESSAGES. + */ +#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) +#define CH_USE_MESSAGES_PRIORITY FALSE +#endif + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_SEMAPHORES. + */ +#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) +#define CH_USE_MAILBOXES TRUE +#endif + +/** + * @brief I/O Queues APIs. + * @details If enabled then the I/O queues APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) +#define CH_USE_QUEUES TRUE +#endif + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) +#define CH_USE_MEMCORE TRUE +#endif + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or + * @p CH_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) +#define CH_USE_HEAP TRUE +#endif + +/** + * @brief C-runtime allocator. + * @details If enabled the the heap allocator APIs just wrap the C-runtime + * @p malloc() and @p free() functions. + * + * @note The default is @p FALSE. + * @note Requires @p CH_USE_HEAP. + * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the + * appropriate documentation. + */ +#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) +#define CH_USE_MALLOC_HEAP FALSE +#endif + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) +#define CH_USE_MEMPOOLS TRUE +#endif + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_USE_WAITEXIT. + * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. + */ +#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) +#define CH_USE_DYNAMIC TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) +#define CH_DBG_SYSTEM_STATE_CHECK FALSE +#endif + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_CHECKS FALSE +#endif + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_ASSERTS FALSE +#endif + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the context switch circular trace buffer is + * activated. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_TRACE FALSE +#endif + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) +#define CH_DBG_ENABLE_STACK_CHECK FALSE +#endif + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) +#define CH_DBG_FILL_THREADS FALSE +#endif + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p Thread structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p TRUE. + * @note This debug option is defaulted to TRUE because it is required by + * some test cases into the test suite. + */ +#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) +#define CH_DBG_THREADS_PROFILING FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p Thread structure. + */ +#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) +#define THREAD_EXT_FIELDS \ + /* Add threads custom fields here.*/ +#endif + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) +#define THREAD_EXT_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} +#endif + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + * + * @note It is inserted into lock zone. + * @note It is also invoked when the threads simply return in order to + * terminate. + */ +#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) +#define THREAD_EXT_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} +#endif + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) +#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* System halt code here.*/ \ +} +#endif + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) +#define IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} +#endif + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) +#define SYSTEM_TICK_EVENT_HOOK() { \ + /* System tick event code here.*/ \ +} +#endif + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) +#define SYSTEM_HALT_HOOK() { \ + /* System halt code here.*/ \ +} +#endif + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* _CHCONF_H_ */ + +/** @} */ diff --git a/09-PlaySound/cs43l22_commands.h b/09-PlaySound/cs43l22_commands.h new file mode 100644 index 0000000..fd7c964 --- /dev/null +++ b/09-PlaySound/cs43l22_commands.h @@ -0,0 +1,490 @@ +#ifndef __H_CS43L22 +#define __H_CS43L22 + +/* Chip I.D. and revision register */ +#define CS43L22_REG_GET_ID 0x01 +/* Chip I.D. and revision register - Chip identifier */ +#define CS43L22_CHIP_ID_MASK ((uint8_t)0xf8) +/* Chip I.D. and revision register - CS43L22 identifier */ +#define CS43L22_CHIP_ID ((uint8_t)0xe0) +/* Chip I.D. and revision register - Revision level - Mask */ +#define CS43L22_CHIP_REV_MASK ((uint8_t)0x07) +/* Chip I.D. and revision register - Revision level - A1 */ +#define CS43L22_CHIP_REV_A1 ((uint8_t)0x01) +/* Chip I.D. and revision register - Revision level - B1 */ +#define CS43L22_CHIP_REV_B1 ((uint8_t)0x03) +/* Chip I.D. and revision register - Revision level - A0 */ +#define CS43L22_CHIP_REV_A0 ((uint8_t)0x00) +/* Chip I.D. and revision register - Revision level - B0 */ +#define CS43L22_CHIP_REV_B0 ((uint8_t)0x02) + +/* Power control 1 */ +#define CS43L22_REG_PWR_CTL1 0x02 +/* Power control 1 - Power up */ +#define CS43L22_PWR1_UP ((uint8_t)0x9e) +/* Power control 1 - Power down */ +#define CS43L22_PWR1_DOWN ((uint8_t)0x01) + +/* Power control 2 */ +#define CS43L22_REG_PWR_CTL2 0x04 +/* Power control 2 - Speaker A - Mask */ +#define CS43L22_PWR2_SPKA_MASK ((uint8_t)0x03) +/* Power control 2 - Speaker A - Enabled if switch high */ +#define CS43L22_PWR2_SPKA_SWHI ((uint8_t)0x01) +/* Power control 2 - Speaker A - Disabled */ +#define CS43L22_PWR2_SPKA_OFF ((uint8_t)0x03) +/* Power control 2 - Speaker A - Enabled if switch low */ +#define CS43L22_PWR2_SPKA_SWLO ((uint8_t)0x00) +/* Power control 2 - Speaker A - Enabled */ +#define CS43L22_PWR2_SPKA_ON ((uint8_t)0x02) +/* Power control 2 - Speaker B - Mask */ +#define CS43L22_PWR2_SPKB_MASK ((uint8_t)0x0c) +/* Power control 2 - Speaker B - Enabled */ +#define CS43L22_PWR2_SPKB_ON ((uint8_t)0x08) +/* Power control 2 - Speaker B - Enabled if switch high */ +#define CS43L22_PWR2_SPKB_SWHI ((uint8_t)0x04) +/* Power control 2 - Speaker B - Enabled if switch low */ +#define CS43L22_PWR2_SPKB_SWLO ((uint8_t)0x00) +/* Power control 2 - Speaker B - Disabled */ +#define CS43L22_PWR2_SPKB_OFF ((uint8_t)0x0c) +/* Power control 2 - Headphone A - Mask */ +#define CS43L22_PWR2_HDA_MASK ((uint8_t)0x30) +/* Power control 2 - Headphone A - Enabled */ +#define CS43L22_PWR2_HDA_ON ((uint8_t)0x20) +/* Power control 2 - Headphone A - Enabled if switch low */ +#define CS43L22_PWR2_HDA_SWLO ((uint8_t)0x00) +/* Power control 2 - Headphone A - Enabled if switch high */ +#define CS43L22_PWR2_HDA_SWHI ((uint8_t)0x10) +/* Power control 2 - Headphone A - Disabled */ +#define CS43L22_PWR2_HDA_OFF ((uint8_t)0x30) +/* Power control 2 - Headphone B - Mask */ +#define CS43L22_PWR2_HDB_MASK ((uint8_t)0xc0) +/* Power control 2 - Headphone B - Enabled */ +#define CS43L22_PWR2_HDB_ON ((uint8_t)0x80) +/* Power control 2 - Headphone B - Enabled if switch high */ +#define CS43L22_PWR2_HDB_SWHI ((uint8_t)0x40) +/* Power control 2 - Headphone B - Enabled if switch low */ +#define CS43L22_PWR2_HDB_SWLO ((uint8_t)0x00) +/* Power control 2 - Headphone B - Disabled */ +#define CS43L22_PWR2_HDB_OFF ((uint8_t)0xc0) + +/* Clocking control */ +#define CS43L22_REG_CLOCK_CTL 0x05 +/* Clocking control - Autodetection - Enabled */ +#define CS43L22_CLK_AUTO_ON ((uint8_t)0x80) +/* Clocking control - Autodetection - Disabled */ +#define CS43L22_CLK_AUTO_OFF ((uint8_t)0x00) +/* Clocking control - Speed mode - Mask */ +#define CS43L22_CLK_SPD_MASK ((uint8_t)0x60) +/* Clocking control - Speed mode - Single speed */ +#define CS43L22_CLK_SPD_SSM ((uint8_t)0x20) +/* Clocking control - Speed mode - Half speed */ +#define CS43L22_CLK_SPD_HSM ((uint8_t)0x40) +/* Clocking control - Speed mode - Double speed */ +#define CS43L22_CLK_SPD_DSM ((uint8_t)0x00) +/* Clocking control - Speed mode - Quarter speed */ +#define CS43L22_CLK_SPD_QSM ((uint8_t)0x60) +/* Clocking control - 32KHz group - Disabled */ +#define CS43L22_CLK_32K_OFF ((uint8_t)0x00) +/* Clocking control - 32KHz group - Enabled */ +#define CS43L22_CLK_32K_ON ((uint8_t)0x10) +/* Clocking control - 27MHz video clock - Enabled */ +#define CS43L22_CLK_VC_ON ((uint8_t)0x08) +/* Clocking control - 27MHz video clock - Disabled */ +#define CS43L22_CLK_VC_OFF ((uint8_t)0x00) +/* Clocking control - Internal MCLK/LRCK ratio - Mask */ +#define CS43L22_CLK_MLR_MASK ((uint8_t)0x06) +/* Clocking control - Internal MCLK/LRCK ratio - 68 */ +#define CS43L22_CLK_MLR_68 ((uint8_t)0x06) +/* Clocking control - Internal MCLK/LRCK ratio - 66 */ +#define CS43L22_CLK_MLR_66 ((uint8_t)0x04) +/* Clocking control - Internal MCLK/LRCK ratio - 64 */ +#define CS43L22_CLK_MLR_64 ((uint8_t)0x00) +/* Clocking control - Internal MCLK/LRCK ratio - 62 */ +#define CS43L22_CLK_MLR_62 ((uint8_t)0x02) +/* Clocking control - Master clock /= 2 - Enabled */ +#define CS43L22_CLK_MCDIV_ON ((uint8_t)0x01) +/* Clocking control - Master clock /= 2 - Disabled */ +#define CS43L22_CLK_MCDIV_OFF ((uint8_t)0x00) + +/* Interface control 1 */ +#define CS43L22_REG_INT_CTL1 0x06 +/* Interface control 1 - Slave mode */ +#define CS43L22_IC1_SLAVE ((uint8_t)0x00) +/* Interface control 1 - Master mode */ +#define CS43L22_IC1_MASTER ((uint8_t)0x80) +/* Interface control 1 - SCLK inverted polarity - Enabled */ +#define CS43L22_IC1_SCPOL_ON ((uint8_t)0x40) +/* Interface control 1 - SCLK inverted polarity - Disabled */ +#define CS43L22_IC1_SCPOL_OFF ((uint8_t)0x00) +/* Interface control 1 - DSP - Disabled */ +#define CS43L22_IC1_DSP_OFF ((uint8_t)0x00) +/* Interface control 1 - DSP - Enabled */ +#define CS43L22_IC1_DSP_ON ((uint8_t)0x10) +/* Interface control 1 - DAC interface format - Right-justified */ +#define CS43L22_IC1_DIF_RJ ((uint8_t)0x08) +/* Interface control 1 - DAC interface format - I2S, up to 24 bits */ +#define CS43L22_IC1_DIF_I2S ((uint8_t)0x04) +/* Interface control 1 - DAC interface format - Left-justified, up to 24 bits */ +#define CS43L22_IC1_DIF_LJ ((uint8_t)0x00) +/* Interface control 1 - Audio word length - 24-bit (DSP), 20-bit (RJ) */ +#define CS43L22_IC1_AWL_24 ((uint8_t)0x01) +/* Interface control 1 - Audio word length - 16-bit (DSP), 16-bit (RJ) */ +#define CS43L22_IC1_AWL_16 ((uint8_t)0x03) +/* Interface control 1 - Audio word length - 32-bit (DSP), 24-bit (RJ) */ +#define CS43L22_IC1_AWL_32 ((uint8_t)0x00) +/* Interface control 1 - Audio word length - 20-bit (DSP), 18-bit (RJ) */ +#define CS43L22_IC1_AWL_20 ((uint8_t)0x02) + +/* Interface control 2 */ +#define CS43L22_REG_INT_CTL2 0x07 +/* Interface control 2 - SCLK = MCLK? - Equal */ +#define CS43L22_IC2_SEM_ON ((uint8_t)0x40) +/* Interface control 2 - SCLK = MCLK? - Derived */ +#define CS43L22_IC2_SEM_OFF ((uint8_t)0x00) +/* Interface control 2 - Speaker/Headphone switch invert - Enabled */ +#define CS43L22_IC2_SHSI_ON ((uint8_t)0x08) +/* Interface control 2 - Speaker/Headphone switch invert - Disabled */ +#define CS43L22_IC2_SHSI_OFF ((uint8_t)0x00) + +/* Passthrough A select */ +#define CS43L22_REG_PSELA 0x08 +/* Passthrough A select - Mask */ +#define CS43L22_PSELA_MASK ((uint8_t)0x0f) +/* Passthrough A select - AIN4 */ +#define CS43L22_PSELA_AIN4 ((uint8_t)0x08) +/* Passthrough A select - AIN3 */ +#define CS43L22_PSELA_AIN3 ((uint8_t)0x04) +/* Passthrough A select - AIN1 */ +#define CS43L22_PSELA_AIN1 ((uint8_t)0x01) +/* Passthrough A select - NONE */ +#define CS43L22_PSELA_NONE ((uint8_t)0x00) +/* Passthrough A select - AIN2 */ +#define CS43L22_PSELA_AIN2 ((uint8_t)0x02) + +/* Passthrough B select */ +#define CS43L22_REG_PSELB 0x09 +/* Passthrough B select - Mask */ +#define CS43L22_PSELB_MASK ((uint8_t)0x0f) +/* Passthrough B select - AIN4 */ +#define CS43L22_PSELB_AIN4 ((uint8_t)0x08) +/* Passthrough B select - AIN3 */ +#define CS43L22_PSELB_AIN3 ((uint8_t)0x04) +/* Passthrough B select - AIN1 */ +#define CS43L22_PSELB_AIN1 ((uint8_t)0x01) +/* Passthrough B select - NONE */ +#define CS43L22_PSELB_NONE ((uint8_t)0x00) +/* Passthrough B select - AIN2 */ +#define CS43L22_PSELB_AIN2 ((uint8_t)0x02) + +/* Analog zero cross / soft ramp */ +#define CS43L22_REG_AZCSR 0x0a +/* Analog zero cross / soft ramp - Channel B soft ramp - Enabled */ +#define CS43L22_AZCSR_SRB_ON ((uint8_t)0x08) +/* Analog zero cross / soft ramp - Channel B soft ramp - Disabled */ +#define CS43L22_AZCSR_SRB_OFF ((uint8_t)0x00) +/* Analog zero cross / soft ramp - Channel A soft ramp - Enabled */ +#define CS43L22_AZCSR_SRA_ON ((uint8_t)0x04) +/* Analog zero cross / soft ramp - Channel A soft ramp - Disabled */ +#define CS43L22_AZCSR_SRA_OFF ((uint8_t)0x00) +/* Analog zero cross / soft ramp - Channel B zero cross - Disabled */ +#define CS43L22_AZCSR_ZCB_OFF ((uint8_t)0x00) +/* Analog zero cross / soft ramp - Channel B zero cross - Enabled */ +#define CS43L22_AZCSR_ZCB_ON ((uint8_t)0x02) +/* Analog zero cross / soft ramp - Channel A zero cross - Enabled */ +#define CS43L22_AZCSR_ZCA_ON ((uint8_t)0x01) +/* Analog zero cross / soft ramp - Channel A zero cross - Disabled */ +#define CS43L22_AZCSR_ZCA_OFF ((uint8_t)0x00) + +/* Passthrough gang control */ +#define CS43L22_REG_PGC 0x0c +/* Passthrough gang control - Enabled */ +#define CS43L22_PGC_ON ((uint8_t)0x80) +/* Passthrough gang control - Disabled */ +#define CS43L22_PGC_OFF ((uint8_t)0x00) + +/* Playback control 1 */ +#define CS43L22_REG_PB_CTL1 0x0d +/* Playback control 1 - Headphone analog gain - Mask */ +#define CS43L22_PB1_HGAIN_MASK ((uint8_t)0xe0) +/* Playback control 1 - Ganged volume control - Disabled */ +#define CS43L22_PB1_SAMEVOLUME_OFF ((uint8_t)0x00) +/* Playback control 1 - Ganged volume control - Enabled */ +#define CS43L22_PB1_SAMEVOLUME_ON ((uint8_t)0x10) +/* Playback control 1 - Invert channel B polarity - Enabled */ +#define CS43L22_PB1_INVB_ON ((uint8_t)0x08) +/* Playback control 1 - Invert channel B polarity - Disabled */ +#define CS43L22_PB1_INVB_OFF ((uint8_t)0x00) +/* Playback control 1 - Invert channel A polarity - Enabled */ +#define CS43L22_PB1_INVA_ON ((uint8_t)0x04) +/* Playback control 1 - Invert channel A polarity - Disabled */ +#define CS43L22_PB1_INVA_OFF ((uint8_t)0x00) +/* Playback control 1 - Channel B muted - Disabled */ +#define CS43L22_PB1_MUTEB_OFF ((uint8_t)0x00) +/* Playback control 1 - Channel B muted - Enabled */ +#define CS43L22_PB1_MUTEB_ON ((uint8_t)0x02) +/* Playback control 1 - Channel A muted - Enabled */ +#define CS43L22_PB1_MUTEA_ON ((uint8_t)0x01) +/* Playback control 1 - Channel A muted - Disabled */ +#define CS43L22_PB1_MUTEA_OFF ((uint8_t)0x00) + +/* Miscellaneous controls */ +#define CS43L22_REG_MISC_CTL 0x0e +/* Miscellaneous controls - Passthrough analog B - Enabled */ +#define CS43L22_MISC_PTHRUB_ON ((uint8_t)0x80) +/* Miscellaneous controls - Passthrough analog B - Disabled */ +#define CS43L22_MISC_PTHRUB_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Passthrough analog A - Enabled */ +#define CS43L22_MISC_PTHRUA_ON ((uint8_t)0x40) +/* Miscellaneous controls - Passthrough analog A - Disabled */ +#define CS43L22_MISC_PTHRUA_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Passthrough mute B - Enabled */ +#define CS43L22_MISC_PTMUTEB_ON ((uint8_t)0x20) +/* Miscellaneous controls - Passthrough mute B - Disabled */ +#define CS43L22_MISC_PTMUTEB_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Passthrough mute A - Disabled */ +#define CS43L22_MISC_PTMUTEA_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Passthrough mute A - Enabled */ +#define CS43L22_MISC_PTMUTEA_ON ((uint8_t)0x10) +/* Miscellaneous controls - Freeze registers - Enabled */ +#define CS43L22_MISC_FREEZE_ON ((uint8_t)0x08) +/* Miscellaneous controls - Freeze registers - Disabled */ +#define CS43L22_MISC_FREEZE_OFF ((uint8_t)0x00) +/* Miscellaneous controls - De-emphasis filter - Enabled */ +#define CS43L22_MISC_DEEMPHASIS_ON ((uint8_t)0x04) +/* Miscellaneous controls - De-emphasis filter - Disabled */ +#define CS43L22_MISC_DEEMPHASIS_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Digital soft ramp - Disabled */ +#define CS43L22_MISC_DSR_OFF ((uint8_t)0x00) +/* Miscellaneous controls - Digital soft ramp - Enabled */ +#define CS43L22_MISC_DSR_ON ((uint8_t)0x02) +/* Miscellaneous controls - Digital zero cross - Enabled */ +#define CS43L22_MISC_DZC_ON ((uint8_t)0x01) +/* Miscellaneous controls - Digital zero cross - Disabled */ +#define CS43L22_MISC_DZC_OFF ((uint8_t)0x00) + +/* Playback control 2 */ +#define CS43L22_REG_PB_CTL2 0x0f +/* Playback control 2 - Headphone B mute - Enabled */ +#define CS43L22_PB2_HPB_MUTE_ON ((uint8_t)0x80) +/* Playback control 2 - Headphone B mute - Disabled */ +#define CS43L22_PB2_HPB_MUTE_OFF ((uint8_t)0x00) +/* Playback control 2 - Headphone A mute - Enabled */ +#define CS43L22_PB2_HPA_MUTE_ON ((uint8_t)0x40) +/* Playback control 2 - Headphone A mute - Disabled */ +#define CS43L22_PB2_HPA_MUTE_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker B mute - Enabled */ +#define CS43L22_PB2_SPKB_MUTE_ON ((uint8_t)0x20) +/* Playback control 2 - Speaker B mute - Disabled */ +#define CS43L22_PB2_SPKB_MUTE_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker A mute - Disabled */ +#define CS43L22_PB2_SPKA_MUTE_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker A mute - Enabled */ +#define CS43L22_PB2_SPKA_MUTE_ON ((uint8_t)0x10) +/* Playback control 2 - Ganged speaker volume settings - Enabled */ +#define CS43L22_PB2_SPK_GANG_ON ((uint8_t)0x08) +/* Playback control 2 - Ganged speaker volume settings - Disabled */ +#define CS43L22_PB2_SPK_GANG_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker channel swap - Enabled */ +#define CS43L22_PB2_SPK_SWAP_ON ((uint8_t)0x04) +/* Playback control 2 - Speaker channel swap - Disabled */ +#define CS43L22_PB2_SPK_SWAP_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker mono mode - Disabled */ +#define CS43L22_PB2_SPK_MONO_OFF ((uint8_t)0x00) +/* Playback control 2 - Speaker mono mode - Enabled */ +#define CS43L22_PB2_SPK_MONO_ON ((uint8_t)0x02) +/* Playback control 2 - Speaker mute 50/50 control - Enabled */ +#define CS43L22_PB2_SPK_M50_ON ((uint8_t)0x01) +/* Playback control 2 - Speaker mute 50/50 control - Disabled */ +#define CS43L22_PB2_SPK_M50_OFF ((uint8_t)0x00) + +/* Passthrough volume (channel A) */ +#define CS43L22_REG_PASS_A_VOL 0x14 + +/* Passthrough volume (channel B) */ +#define CS43L22_REG_PASS_B_VOL 0x15 + +/* PCM channel A control */ +#define CS43L22_REG_PCM_A 0x1a +/* PCM channel A control - Mute channel - Enabled */ +#define CS43L22_PCM_A_MUTE_ON ((uint8_t)0x80) +/* PCM channel A control - Mute channel - Disabled */ +#define CS43L22_PCM_A_MUTE_OFF ((uint8_t)0x00) +/* PCM channel A control - Channel volume - Mask */ +#define CS43L22_PCM_A_VOLUME_MASK ((uint8_t)0x7f) + +/* PCM channel B control */ +#define CS43L22_REG_PCM_B 0x1b +/* PCM channel B control - Mute channel - Enabled */ +#define CS43L22_PCM_B_MUTE_ON ((uint8_t)0x80) +/* PCM channel B control - Mute channel - Disabled */ +#define CS43L22_PCM_B_MUTE_OFF ((uint8_t)0x00) +/* PCM channel B control - Channel volume - Mask */ +#define CS43L22_PCM_B_VOLUME_MASK ((uint8_t)0x7f) + +/* Beep control 1 */ +#define CS43L22_REG_BEEP_CTL1 0x1c +/* Beep control 1 - Frequency - Mask */ +#define CS43L22_BEEP_FREQ_MASK ((uint8_t)0xf0) +/* Beep control 1 - Duration - Mask */ +#define CS43L22_BEEP_ONTIME_MASK ((uint8_t)0x0f) + +/* Beep control 2 */ +#define CS43L22_REG_BEEP_CTL2 0x1d +/* Beep control 2 - Off time - Mask */ +#define CS43L22_BEEP_OFFTIME_MASK ((uint8_t)0xf0) +/* Beep control 2 - Volume - Mask */ +#define CS43L22_BEEP_VOL_MASK ((uint8_t)0x0f) + +/* Beep & tone configuration */ +#define CS43L22_REG_BEEP_TONE_CFG 0x1e +/* Beep & tone configuration - Beep configuration - Multiple */ +#define CS43L22_B3_BEEP_CFG_MULTI ((uint8_t)0x80) +/* Beep & tone configuration - Beep configuration - Single */ +#define CS43L22_B3_BEEP_CFG_SINGLE ((uint8_t)0x40) +/* Beep & tone configuration - Beep configuration - Off */ +#define CS43L22_B3_BEEP_CFG_OFF ((uint8_t)0x00) +/* Beep & tone configuration - Beep configuration - Continuous */ +#define CS43L22_B3_BEEP_CFG_CONT ((uint8_t)0xc0) +/* Beep & tone configuration - Beep mix disable - OFF */ +#define CS43L22_B3_BEEP_NOMIX_OFF ((uint8_t)0x20) +/* Beep & tone configuration - Beep mix disable - ON */ +#define CS43L22_B3_BEEP_NOMIX_ON ((uint8_t)0x00) +/* Beep & tone configuration - Treble corner frequency - 7KHZ */ +#define CS43L22_B3_TREBLE_CF_7KHZ ((uint8_t)0x08) +/* Beep & tone configuration - Treble corner frequency - 5KHZ */ +#define CS43L22_B3_TREBLE_CF_5KHZ ((uint8_t)0x00) +/* Beep & tone configuration - Treble corner frequency - 15KHZ */ +#define CS43L22_B3_TREBLE_CF_15KHZ ((uint8_t)0x18) +/* Beep & tone configuration - Treble corner frequency - 10KHZ */ +#define CS43L22_B3_TREBLE_CF_10KHZ ((uint8_t)0x10) +/* Beep & tone configuration - Bass corner frequency - 250HZ */ +#define CS43L22_B3_BASS_CF_250HZ ((uint8_t)0x06) +/* Beep & tone configuration - Bass corner frequency - 200HZ */ +#define CS43L22_B3_BASS_CF_200HZ ((uint8_t)0x04) +/* Beep & tone configuration - Bass corner frequency - 50HZ */ +#define CS43L22_B3_BASS_CF_50HZ ((uint8_t)0x00) +/* Beep & tone configuration - Bass corner frequency - 100HZ */ +#define CS43L22_B3_BASS_CF_100HZ ((uint8_t)0x02) +/* Beep & tone configuration - Tone control - Enabled */ +#define CS43L22_B3_TONECTL_ON ((uint8_t)0x01) +/* Beep & tone configuration - Tone control - Disabled */ +#define CS43L22_B3_TONECTL_OFF ((uint8_t)0x00) + +/* Tone control */ +#define CS43L22_REG_TONE_CTL 0x1f +/* Tone control - Treble gain - Mask */ +#define CS43L22_TCTL_TREBLE_MASK ((uint8_t)0xf0) +/* Tone control - Bass gain - Mask */ +#define CS43L22_TCTL_BASS_MASK ((uint8_t)0x0f) + +/* Master volume control (channel A) */ +#define CS43L22_REG_MASTER_VOLUME_A 0x20 + +/* Master volume control (channel B) */ +#define CS43L22_REG_MASTER_VOLUME_B 0x21 + +/* Headphone volume control (channel A) */ +#define CS43L22_REG_HP_VOLUME_A 0x22 + +/* Headphone volume control (channel B) */ +#define CS43L22_REG_HP_VOLUME_B 0x23 + +/* Speaker volume control (channel A) */ +#define CS43L22_REG_SPK_VOLUME_A 0x24 + +/* Speaker volume control (channel B) */ +#define CS43L22_REG_SPK_VOLUME_B 0x25 + +/* PCM channel swap */ +#define CS43L22_REG_PCM_SWAP 0x26 +/* PCM channel swap - Channel A - (Left + Right) / 2 */ +#define CS43L22_PCS_A_MIX ((uint8_t)0x40) +/* PCM channel swap - Channel A - Left */ +#define CS43L22_PCS_A_LEFT ((uint8_t)0x00) +/* PCM channel swap - Channel A - Right */ +#define CS43L22_PCS_A_RIGHT ((uint8_t)0xc0) +/* PCM channel swap - Channel B - Right */ +#define CS43L22_PCS_B_RIGHT ((uint8_t)0x00) +/* PCM channel swap - Channel B - (Left + Right) / 2 */ +#define CS43L22_PCS_B_MIX ((uint8_t)0x10) +/* PCM channel swap - Channel B - Left */ +#define CS43L22_PCS_B_LEFT ((uint8_t)0x30) + +/* Limiter control 1 */ +#define CS43L22_REG_LIM_CTL1 0x27 +/* Limiter control 1 - Maximum threshold - Mask */ +#define CS43L22_LIM1_MAX_MASK ((uint8_t)0xe0) +/* Limiter control 1 - Cushion threshold - Mask */ +#define CS43L22_LIM1_CUSHION_MASK ((uint8_t)0x1c) +/* Limiter control 1 - Soft ramp - Use digital soft ramp */ +#define CS43L22_LIM1_SRD_OFF ((uint8_t)0x00) +/* Limiter control 1 - Soft ramp - Ignore digital soft ramp */ +#define CS43L22_LIM1_SRD_ON ((uint8_t)0x02) +/* Limiter control 1 - Zero cross - Ignore digital zero cross */ +#define CS43L22_LIM1_ZCD_ON ((uint8_t)0x01) +/* Limiter control 1 - Zero cross - Use digital zero cross */ +#define CS43L22_LIM1_ZCD_OFF ((uint8_t)0x00) + +/* Limiter control 2 */ +#define CS43L22_REG_LIM_CTL2 0x28 +/* Limiter control 2 - Peak detect and limiter - Enabled */ +#define CS43L22_LIM2_ON ((uint8_t)0x80) +/* Limiter control 2 - Peak detect and limiter - Disabled */ +#define CS43L22_LIM2_OFF ((uint8_t)0x00) +/* Limiter control 2 - Limit both channels - Enabled */ +#define CS43L22_LIM2_LAC_ON ((uint8_t)0x40) +/* Limiter control 2 - Limit both channels - Disabled */ +#define CS43L22_LIM2_LAC_OFF ((uint8_t)0x00) +/* Limiter control 2 - Release rate - Mask */ +#define CS43L22_LIM2_RRATE_MASK ((uint8_t)0x3f) + +/* Limiter control 3 */ +#define CS43L22_REG_LIM_CTL3 0x29 +/* Limiter control 3 - Attack rate - Mask */ +#define CS43L22_LIM3_ARATE_MASK ((uint8_t)0x3f) + +/* Status (RO) */ +#define CS43L22_REG_STATUS 0x2e +/* Status (RO) - Serial port clock error */ +#define CS43L22_STATUS_SERIAL_ERROR ((uint8_t)0x40) +/* Status (RO) - DSP A overflow */ +#define CS43L22_STATUS_DSP_A_OVERFLOW ((uint8_t)0x20) +/* Status (RO) - DSP B overflow */ +#define CS43L22_STATUS_DSP_B_OVERFLOW ((uint8_t)0x10) +/* Status (RO) - PCM A overflow */ +#define CS43L22_STATUS_PCM_A_OVERFLOW ((uint8_t)0x08) +/* Status (RO) - PCM B overflow */ +#define CS43L22_STATUS_PCM_B_OVERFLOW ((uint8_t)0x04) + +/* Battery compensation */ +#define CS43L22_REG_BATTERY_COMPENSATION 0x2f +/* Battery compensation - Enabled */ +#define CS43L22_BC_ON ((uint8_t)0x80) +/* Battery compensation - Disabled */ +#define CS43L22_BC_OFF ((uint8_t)0x00) +/* Battery compensation - VP voltage level monitor - Enabled */ +#define CS43L22_BC_VPM_ON ((uint8_t)0x40) +/* Battery compensation - VP voltage level monitor - Disabled */ +#define CS43L22_BC_VPM_OFF ((uint8_t)0x00) +/* Battery compensation - VP reference - Mask */ +#define CS43L22_BC_VPREF_MASK ((uint8_t)0x0f) + +/* Battery level (RO) */ +#define CS43L22_REG_BATTERY_LEVEL 0x30 + +/* Speaker status (RO) */ +#define CS43L22_REG_SPKR_STATUS 0x31 +/* Speaker status (RO) - Channel A overload detected */ +#define CS43L22_SPKS_OVERLOAD_A ((uint8_t)0x20) +/* Speaker status (RO) - Channel B overload detected */ +#define CS43L22_SPKS_OVERLOAD_B ((uint8_t)0x10) +/* Speaker status (RO) - Speaker/headphones pin status */ +#define CS43L22_SPKS_SPKHP_SWITCH ((uint8_t)0x08) + +/* Charge pump frequency */ +#define CS43L22_REG_CPFREQ 0x34 +/* Charge pump frequency - Mask */ +#define CS43L22_CPFREQ_MASK ((uint8_t)0xf0) + +#endif //__H_CS43L22 diff --git a/09-PlaySound/cs43l22_pins.h b/09-PlaySound/cs43l22_pins.h new file mode 100644 index 0000000..ecf8456 --- /dev/null +++ b/09-PlaySound/cs43l22_pins.h @@ -0,0 +1,47 @@ +#ifndef __H_PINS_CS43L22 +#define __H_PINS_CS43L22 + +// Alternate function used for I2S to the CS43L22 +#define I2S_OUT_FUNCTION 6 + +// CS43L22 reset pin and delay +#define I2S_ORESET_PORT GPIOD +#define I2S_ORESET_PAD 4 +#define I2S_ORESET_DELAY 10 + +// CS43L22 SCL pin +#define I2C_OSCL_PORT GPIOB +#define I2C_OSCL_PAD 6 + +// CS43L22 SDA pin +#define I2C_OSDA_PORT GPIOB +#define I2C_OSDA_PAD 9 + +// CS43L22 WS pin +#define I2S_OWS_PORT GPIOA +#define I2S_OWS_PAD 4 + +// CS43L22 MCK pin +#define I2S_OMCK_PORT GPIOC +#define I2S_OMCK_PAD 7 + +// CS43L22 SCK pin +#define I2S_OSCK_PORT GPIOC +#define I2S_OSCK_PAD 10 + +// CS43L22 SD pin +#define I2S_OSD_PORT GPIOC +#define I2S_OSD_PAD 12 + +// Output control I2C parameters +#define I2S_OI2C_DRIVER I2CD1 +#define I2S_OI2C_SPEED 400000 +#define I2S_OI2C_ADDRESS 0x4a +#define I2S_OI2C_TIMEOUT 1000 + +// Base address of the SPI port +#define I2S_SPI_BASE SPI3_BASE + + + +#endif //__H_PINS_CS43L22 diff --git a/09-PlaySound/halconf.h b/09-PlaySound/halconf.h new file mode 100644 index 0000000..be8519c --- /dev/null +++ b/09-PlaySound/halconf.h @@ -0,0 +1,353 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; 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. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + --- + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes ChibiOS/RT, without being obliged to provide + the source code for any proprietary components. See the file exception.txt + for full details of how and when the exception can be applied. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the TM subsystem. + */ +#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) +#define HAL_USE_TM FALSE +#endif + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C TRUE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL TRUE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI TRUE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Block size for MMC transfers. + */ +#if !defined(MMC_SECTOR_SIZE) || defined(__DOXYGEN__) +#define MMC_SECTOR_SIZE 512 +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/** + * @brief Number of positive insertion queries before generating the + * insertion event. + */ +#if !defined(MMC_POLLING_INTERVAL) || defined(__DOXYGEN__) +#define MMC_POLLING_INTERVAL 10 +#endif + +/** + * @brief Interval, in milliseconds, between insertion queries. + */ +#if !defined(MMC_POLLING_DELAY) || defined(__DOXYGEN__) +#define MMC_POLLING_DELAY 10 +#endif + +/** + * @brief Uses the SPI polled API for small data transfers. + * @details Polled transfers usually improve performance because it + * saves two context switches and interrupt servicing. Note + * that this option has no effect on large transfers which + * are always performed using DMAs/IRQs. + */ +#if !defined(MMC_USE_SPI_POLLING) || defined(__DOXYGEN__) +#define MMC_USE_SPI_POLLING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + + + + + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/09-PlaySound/i2s_bits.h b/09-PlaySound/i2s_bits.h new file mode 100644 index 0000000..66f5202 --- /dev/null +++ b/09-PlaySound/i2s_bits.h @@ -0,0 +1,62 @@ +#ifndef __H_STM32F4_I2S +#define __H_STM32F4_I2S + +/* I2S configuration */ +#define STM32F4_I2S_OFFS_CFG 0x0000001c +/* I2S configuration - SPI mode */ +#define STM32F4_I2S_CFG_MODE_SPI ((uint16_t)0x0000) +/* I2S configuration - I2S mode */ +#define STM32F4_I2S_CFG_MODE_I2S ((uint16_t)0x0800) +/* I2S configuration - Peripheral enabled */ +#define STM32F4_I2S_CFG_ENABLED ((uint16_t)0x0400) +/* I2S configuration - Peripheral disabled */ +#define STM32F4_I2S_CFG_DISABLED ((uint16_t)0x0000) +/* I2S configuration - I2S configuration mode - Master/transmit */ +#define STM32F4_I2S_CFG_CFG_MS_TX ((uint16_t)0x0200) +/* I2S configuration - I2S configuration mode - Slave/transmit */ +#define STM32F4_I2S_CFG_CFG_SL_TX ((uint16_t)0x0000) +/* I2S configuration - I2S configuration mode - Slave/receive */ +#define STM32F4_I2S_CFG_CFG_SL_RX ((uint16_t)0x0100) +/* I2S configuration - I2S configuration mode - Master/receive */ +#define STM32F4_I2S_CFG_CFG_MS_RX ((uint16_t)0x0300) +/* I2S configuration - PCM frame sync - Long frame */ +#define STM32F4_I2S_CFG_PCMSYNC_LONG ((uint16_t)0x0080) +/* I2S configuration - PCM frame sync - Short frame */ +#define STM32F4_I2S_CFG_PCMSYNC_SHORT ((uint16_t)0x0000) +/* I2S configuration - I2S standard - Right justified */ +#define STM32F4_I2S_CFG_STD_LSB ((uint16_t)0x0020) +/* I2S configuration - I2S standard - I2S Philips standard */ +#define STM32F4_I2S_CFG_STD_I2S ((uint16_t)0x0000) +/* I2S configuration - I2S standard - Left justified */ +#define STM32F4_I2S_CFG_STD_MSB ((uint16_t)0x0010) +/* I2S configuration - I2S standard - PCM standard */ +#define STM32F4_I2S_CFG_STD_PCM ((uint16_t)0x0030) +/* I2S configuration - Reverse clock polarity - ON */ +#define STM32F4_I2S_CFG_RCPOL_ON ((uint16_t)0x0008) +/* I2S configuration - Reverse clock polarity - OFF */ +#define STM32F4_I2S_CFG_RCPOL_OFF ((uint16_t)0x0000) +/* I2S configuration - Data length - 32-bit */ +#define STM32F4_I2S_CFG_DLEN_32 ((uint16_t)0x0004) +/* I2S configuration - Data length - 16-bit */ +#define STM32F4_I2S_CFG_DLEN_16 ((uint16_t)0x0000) +/* I2S configuration - Data length - 24-bit */ +#define STM32F4_I2S_CFG_DLEN_24 ((uint16_t)0x0002) +/* I2S configuration - Channel length - 32-bit */ +#define STM32F4_I2S_CFG_CLEN_32 ((uint16_t)0x0001) +/* I2S configuration - Channel length - 16-bit */ +#define STM32F4_I2S_CFG_CLEN_16 ((uint16_t)0x0000) + +/* I2S prescaler */ +#define STM32F4_I2S_OFFS_PR 0x00000020 +/* I2S prescaler - Master clock output - ON */ +#define STM32F4_I2S_PR_MCLK_ON ((uint16_t)0x0200) +/* I2S prescaler - Master clock output - OFF */ +#define STM32F4_I2S_PR_MCLK_OFF ((uint16_t)0x0000) +/* I2S prescaler - Odd factor - Divider is I2SDIV * 2 */ +#define STM32F4_I2S_PR_EVEN ((uint16_t)0x0000) +/* I2S prescaler - Odd factor - Divider is 1 + I2SDIV * 2 */ +#define STM32F4_I2S_PR_ODD ((uint16_t)0x0100) +/* I2S prescaler - Divider - Mask */ +#define STM32F4_I2S_PR_DIV_MASK ((uint16_t)0x00ff) + +#endif //__H_STM32F4_I2S diff --git a/09-PlaySound/main.c b/09-PlaySound/main.c new file mode 100644 index 0000000..b11151c --- /dev/null +++ b/09-PlaySound/main.c @@ -0,0 +1,118 @@ +#include "ch.h" +#include "hal.h" + +#include "chprintf.h" + +#include "serial_output.h" +#include "sound.h" + + +// This is called when the board boots up with the user button pressed. The +// idea is to enter this mode if the wrong SPI device has been used and flashing +// is no longer possible. +__attribute__ ((noreturn)) +static void lockdown( void ) +{ + palSetPad( GPIOD , GPIOD_LED3 ); + while (TRUE) { + // EMPTY + } +} + + +static int increment; +static int curPos; +static const s16 sinTable[16384] = { +#include "sin_table.h" +}; + + +void debug(void) +{ + chprintf( (void*)&SD2 , "I2S:\r\n" ); + chprintf( (void*)&SD2 , " CR2 %x\r\n" , SPI3->CR2 ); + chprintf( (void*)&SD2 , " SR %x\r\n" , SPI3->SR ); + chprintf( (void*)&SD2 , " CFG %x\r\n" , SPI3->I2SCFGR ); + chprintf( (void*)&SD2 , " PR %x\r\n" , SPI3->I2SPR ); + + chprintf( (void*)&SD2 , "DMA:\r\n" ); + chprintf( (void*)&SD2 , " CR %x\r\n" , + SPID3.dmatx->stream->CR ); + chprintf( (void*)&SD2 , " NDT %x\r\n" , + SPID3.dmatx->stream->NDTR ); + chprintf( (void*)&SD2 , " PAR %x\r\n" , + SPID3.dmatx->stream->PAR ); + chprintf( (void*)&SD2 , " M0A %x\r\n" , + SPID3.dmatx->stream->M0AR ); + chprintf( (void*)&SD2 , " M1A %x\r\n" , + SPID3.dmatx->stream->M1AR ); + chprintf( (void*)&SD2 , " FCR %x\r\n" , + SPID3.dmatx->stream->FCR ); + chprintf( (void*)&SD2 , "curPos: %d\r\n" , curPos ); +} + + +__attribute__ ((noreturn)) +int main( void ) +{ + halInit(); + chSysInit(); + if ( palReadPad( GPIOA , GPIOA_BUTTON ) ) { + lockdown( ); + } + + soInit( ); + chprintf( (void*)&SD2 , "Sound card initialisation\r\n" ); + sndInit( 11025 ); + chprintf( (void*)&SD2 , + "Sound card initialisation complete\r\n" ); + increment = 654; // 16384 * 440 / 11025 + curPos = 0; + + debug( ); + +#ifdef USE_DMA_FOR_SEXY_BEEPS + int i = 0; + while ( 1 ) { + s16 * buffer = sndGetBuffer( ); + if ( buffer == NULL ) { + i ++; + if ( i == 2000000 ) { + i = 0; + palTogglePad( GPIOD , GPIOD_LED4 ); + debug( ); + } + continue; + } + palTogglePad( GPIOD , GPIOD_LED3 ); + + int z; + for ( z = 0 ; z < SND_BUFSIZE / 2 ; z ++ ) { + buffer[ z * 2 ] = buffer[ z * 2 + 1 ] + = sinTable[ curPos ]; + curPos = ( curPos + increment / 2 ) % 16384; + } + } + +#else // USE_DMA_FOR_SEXY_BEEPS + + int i = 0; + while ( 1 ) { + u16 sr = SPI3->SR; + if ( ( sr & 0x2 ) == 0 ) { + continue; + } + SPI3->DR = sinTable[ curPos ]; + + if ( ( sr & 0x4 ) == 0 ) { + curPos = ( curPos + increment ) % 16384; + } + i ++; + if ( i == 22100 ) { + i = 0; + palTogglePad( GPIOD , GPIOD_LED4 ); + debug( ); + } + } +#endif // USE_DMA_FOR_SEXY_BEEPS +} diff --git a/09-PlaySound/mcuconf.h b/09-PlaySound/mcuconf.h new file mode 100644 index 0000000..208af41 --- /dev/null +++ b/09-PlaySound/mcuconf.h @@ -0,0 +1,258 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; 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. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* + * STM32F4xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 15...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F4xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_CLOCK48_REQUIRED TRUE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PLLM_VALUE 8 +#define STM32_PLLN_VALUE 336 +#define STM32_PLLP_VALUE 2 +#define STM32_PLLQ_VALUE 7 +#define HSE_VALUE 8000000 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV4 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_RTCPRE_VALUE 8 +#define STM32_MCO1SEL STM32_MCO1SEL_HSI +#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 +#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK +#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 +#define STM32_I2SSRC STM32_I2SSRC_PLLI2S +#define STM32_PLLI2SN_VALUE 192 +#define STM32_PLLI2SR_VALUE 5 +#define STM32_VOS STM32_VOS_HIGH +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 + +/* + * ADC driver system settings. + */ +#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4 +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_USE_ADC2 FALSE +#define STM32_ADC_USE_ADC3 FALSE +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4) +#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC2_DMA_PRIORITY 2 +#define STM32_ADC_ADC3_DMA_PRIORITY 2 +#define STM32_ADC_IRQ_PRIORITY 6 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6 +#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 6 +#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 6 + +/* + * CAN driver system settings. + */ +#define STM32_CAN_USE_CAN1 FALSE +#define STM32_CAN_USE_CAN2 FALSE +#define STM32_CAN_CAN1_IRQ_PRIORITY 11 +#define STM32_CAN_CAN2_IRQ_PRIORITY 11 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 15 +#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI21_IRQ_PRIORITY 15 +#define STM32_EXT_EXTI22_IRQ_PRIORITY 15 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM5 FALSE +#define STM32_GPT_USE_TIM8 FALSE +#define STM32_GPT_TIM1_IRQ_PRIORITY 7 +#define STM32_GPT_TIM2_IRQ_PRIORITY 7 +#define STM32_GPT_TIM3_IRQ_PRIORITY 7 +#define STM32_GPT_TIM4_IRQ_PRIORITY 7 +#define STM32_GPT_TIM5_IRQ_PRIORITY 7 +#define STM32_GPT_TIM8_IRQ_PRIORITY 7 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 TRUE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_USE_I2C3 FALSE +#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) +#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) +#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) +#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) +#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2) +#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) +#define STM32_I2C_I2C1_IRQ_PRIORITY 5 +#define STM32_I2C_I2C2_IRQ_PRIORITY 5 +#define STM32_I2C_I2C3_IRQ_PRIORITY 5 +#define STM32_I2C_I2C1_DMA_PRIORITY 3 +#define STM32_I2C_I2C2_DMA_PRIORITY 3 +#define STM32_I2C_I2C3_DMA_PRIORITY 3 +#define STM32_I2C_I2C1_DMA_ERROR_HOOK() chSysHalt() +#define STM32_I2C_I2C2_DMA_ERROR_HOOK() chSysHalt() +#define STM32_I2C_I2C3_DMA_ERROR_HOOK() chSysHalt() + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM5 FALSE +#define STM32_ICU_USE_TIM8 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 7 +#define STM32_ICU_TIM2_IRQ_PRIORITY 7 +#define STM32_ICU_TIM3_IRQ_PRIORITY 7 +#define STM32_ICU_TIM4_IRQ_PRIORITY 7 +#define STM32_ICU_TIM5_IRQ_PRIORITY 7 +#define STM32_ICU_TIM8_IRQ_PRIORITY 7 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM5 FALSE +#define STM32_PWM_USE_TIM8 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 7 +#define STM32_PWM_TIM2_IRQ_PRIORITY 7 +#define STM32_PWM_TIM3_IRQ_PRIORITY 7 +#define STM32_PWM_TIM4_IRQ_PRIORITY 7 +#define STM32_PWM_TIM5_IRQ_PRIORITY 7 +#define STM32_PWM_TIM8_IRQ_PRIORITY 7 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 TRUE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USE_USART6 FALSE +#define STM32_SERIAL_USART1_PRIORITY 12 +#define STM32_SERIAL_USART2_PRIORITY 12 +#define STM32_SERIAL_USART3_PRIORITY 12 +#define STM32_SERIAL_UART4_PRIORITY 12 +#define STM32_SERIAL_UART5_PRIORITY 12 +#define STM32_SERIAL_USART6_PRIORITY 12 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 TRUE +#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) +#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) +#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) +#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) +#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) +#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 10 +#define STM32_SPI_SPI2_IRQ_PRIORITY 10 +#define STM32_SPI_SPI3_IRQ_PRIORITY 10 +#define STM32_SPI_DMA_ERROR_HOOK(spip) chSysHalt() + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 TRUE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USE_USART6 FALSE +#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) +#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) +#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) +#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) +#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) +#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3) +#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7) +#define STM32_UART_USART1_IRQ_PRIORITY 12 +#define STM32_UART_USART2_IRQ_PRIORITY 12 +#define STM32_UART_USART3_IRQ_PRIORITY 12 +#define STM32_UART_USART6_IRQ_PRIORITY 12 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_USART6_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) chSysHalt() + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_OTG1 FALSE +#define STM32_USB_USE_OTG2 FALSE +#define STM32_USB_OTG1_IRQ_PRIORITY 14 +#define STM32_USB_OTG2_IRQ_PRIORITY 14 +#define STM32_USB_OTG1_RX_FIFO_SIZE 512 +#define STM32_USB_OTG2_RX_FIFO_SIZE 1024 +#define STM32_USB_OTG_THREAD_PRIO LOWPRIO +#define STM32_USB_OTG_THREAD_STACK_SIZE 128 +#define STM32_USB_OTGFIFO_FILL_BASEPRI 0 + + diff --git a/09-PlaySound/serial_output.c b/09-PlaySound/serial_output.c new file mode 100644 index 0000000..b32bce8 --- /dev/null +++ b/09-PlaySound/serial_output.c @@ -0,0 +1,14 @@ +#include "ch.h" +#include "hal.h" + +#include "serial_output.h" + + +void soInit( void ) +{ + sdStart( &SERIALOUT_DRIVER , NULL ); + palSetPadMode( SERIALOUT_TX_PORT , SERIALOUT_TX_PAD , + PAL_MODE_ALTERNATE( SERIALOUT_AF ) ); + palSetPadMode( SERIALOUT_RX_PORT , SERIALOUT_RX_PAD , + PAL_MODE_ALTERNATE( SERIALOUT_AF ) ); +} diff --git a/09-PlaySound/serial_output.h b/09-PlaySound/serial_output.h new file mode 100644 index 0000000..ae83fbd --- /dev/null +++ b/09-PlaySound/serial_output.h @@ -0,0 +1,15 @@ +#ifndef __H_SERIALOUT +#define __H_SERIALOUT + +#define SERIALOUT_DRIVER SD2 +#define SERIALOUT_TX_PORT GPIOA +#define SERIALOUT_TX_PAD 2 +#define SERIALOUT_RX_PORT GPIOA +#define SERIALOUT_RX_PAD 3 +#define SERIALOUT_AF 7 + + +void soInit( void ); + + +#endif // __H_SERIALOUT diff --git a/09-PlaySound/sin_table.h b/09-PlaySound/sin_table.h new file mode 100644 index 0000000..8b44f55 --- /dev/null +++ b/09-PlaySound/sin_table.h @@ -0,0 +1,16384 @@ +0, +12, +25, +37, +50, +62, +75, +87, +100, +113, +125, +138, +150, +163, +175, +188, +201, +213, +226, +238, +251, +263, +276, +289, +301, +314, +326, +339, +351, +364, +376, +389, +402, +414, +427, +439, +452, +464, +477, +490, +502, +515, +527, +540, +552, +565, +578, +590, +603, +615, +628, +640, +653, +665, +678, +691, +703, +716, +728, +741, +753, +766, +779, +791, +804, +816, +829, +841, +854, +866, +879, +892, +904, +917, +929, +942, +954, +967, +980, +992, +1005, +1017, +1030, +1042, +1055, +1067, +1080, +1093, +1105, +1118, +1130, +1143, +1155, +1168, +1180, +1193, +1206, +1218, +1231, +1243, +1256, +1268, +1281, +1293, +1306, +1319, +1331, +1344, +1356, +1369, +1381, +1394, +1406, +1419, +1432, +1444, +1457, +1469, +1482, +1494, +1507, +1519, +1532, +1545, +1557, +1570, +1582, +1595, +1607, +1620, +1632, +1645, +1658, +1670, +1683, +1695, +1708, +1720, +1733, +1745, +1758, +1770, +1783, +1796, +1808, +1821, +1833, +1846, +1858, +1871, +1883, +1896, +1908, +1921, +1934, +1946, +1959, +1971, +1984, +1996, +2009, +2021, +2034, +2046, +2059, +2072, +2084, +2097, +2109, +2122, +2134, +2147, +2159, +2172, +2184, +2197, +2209, +2222, +2235, +2247, +2260, +2272, +2285, +2297, +2310, +2322, +2335, +2347, +2360, +2372, +2385, +2397, +2410, +2423, +2435, +2448, +2460, +2473, +2485, +2498, +2510, +2523, +2535, +2548, +2560, +2573, +2585, +2598, +2610, +2623, +2636, +2648, +2661, +2673, +2686, +2698, +2711, +2723, +2736, +2748, +2761, +2773, +2786, +2798, +2811, +2823, +2836, +2848, +2861, +2873, +2886, +2898, +2911, +2923, +2936, +2949, +2961, +2974, +2986, +2999, +3011, +3024, +3036, +3049, +3061, +3074, +3086, +3099, +3111, +3124, +3136, +3149, +3161, +3174, +3186, +3199, +3211, +3224, +3236, +3249, +3261, +3274, +3286, +3299, +3311, +3324, +3336, +3349, +3361, +3374, +3386, +3399, +3411, +3424, +3436, +3449, +3461, +3474, +3486, +3499, +3511, +3524, +3536, +3549, +3561, +3574, +3586, +3599, +3611, +3624, +3636, +3649, +3661, +3674, +3686, +3699, +3711, +3724, +3736, +3749, +3761, +3773, +3786, +3798, +3811, +3823, +3836, +3848, +3861, +3873, +3886, +3898, +3911, +3923, +3936, +3948, +3961, +3973, +3986, +3998, +4011, +4023, +4035, +4048, +4060, +4073, +4085, +4098, +4110, +4123, +4135, +4148, +4160, +4173, +4185, +4198, +4210, +4222, +4235, +4247, +4260, +4272, +4285, +4297, +4310, +4322, +4335, +4347, +4359, +4372, +4384, +4397, +4409, +4422, +4434, +4447, +4459, +4472, +4484, +4496, +4509, +4521, +4534, +4546, +4559, +4571, +4584, +4596, +4608, +4621, +4633, +4646, +4658, +4671, +4683, +4696, +4708, +4720, +4733, +4745, +4758, +4770, +4783, +4795, +4807, +4820, +4832, +4845, +4857, +4870, +4882, +4894, +4907, +4919, +4932, +4944, +4957, +4969, +4981, +4994, +5006, +5019, +5031, +5043, +5056, +5068, +5081, +5093, +5106, +5118, +5130, +5143, +5155, +5168, +5180, +5192, +5205, +5217, +5230, +5242, +5254, +5267, +5279, +5292, +5304, +5316, +5329, +5341, +5354, +5366, +5378, +5391, +5403, +5416, +5428, +5440, +5453, +5465, +5478, +5490, +5502, +5515, +5527, +5539, +5552, +5564, +5577, +5589, +5601, +5614, +5626, +5639, +5651, +5663, +5676, +5688, +5700, +5713, +5725, +5738, +5750, +5762, +5775, +5787, +5799, +5812, +5824, +5836, +5849, +5861, +5874, +5886, +5898, +5911, +5923, +5935, +5948, +5960, +5972, +5985, +5997, +6010, +6022, +6034, +6047, +6059, +6071, +6084, +6096, +6108, +6121, +6133, +6145, +6158, +6170, +6182, +6195, +6207, +6219, +6232, +6244, +6256, +6269, +6281, +6293, +6306, +6318, +6330, +6343, +6355, +6367, +6380, +6392, +6404, +6417, +6429, +6441, +6454, +6466, +6478, +6491, +6503, +6515, +6528, +6540, +6552, +6564, +6577, +6589, +6601, +6614, +6626, +6638, +6651, +6663, +6675, +6688, +6700, +6712, +6724, +6737, +6749, +6761, +6774, +6786, +6798, +6811, +6823, +6835, +6847, +6860, +6872, +6884, +6897, +6909, +6921, +6933, +6946, +6958, +6970, +6982, +6995, +7007, +7019, +7032, +7044, +7056, +7068, +7081, +7093, +7105, +7117, +7130, +7142, +7154, +7167, +7179, +7191, +7203, +7216, +7228, +7240, +7252, +7265, +7277, +7289, +7301, +7314, +7326, +7338, +7350, +7363, +7375, +7387, +7399, +7412, +7424, +7436, +7448, +7461, +7473, +7485, +7497, +7509, +7522, +7534, +7546, +7558, +7571, +7583, +7595, +7607, +7619, +7632, +7644, +7656, +7668, +7681, +7693, +7705, +7717, +7729, +7742, +7754, +7766, +7778, +7790, +7803, +7815, +7827, +7839, +7851, +7864, +7876, +7888, +7900, +7912, +7925, +7937, +7949, +7961, +7973, +7986, +7998, +8010, +8022, +8034, +8047, +8059, +8071, +8083, +8095, +8107, +8120, +8132, +8144, +8156, +8168, +8180, +8193, +8205, +8217, +8229, +8241, +8253, +8266, +8278, +8290, +8302, +8314, +8326, +8339, +8351, +8363, +8375, +8387, +8399, +8411, +8424, +8436, +8448, +8460, +8472, +8484, +8496, +8509, +8521, +8533, +8545, +8557, +8569, +8581, +8593, +8606, +8618, +8630, +8642, +8654, +8666, +8678, +8690, +8703, +8715, +8727, +8739, +8751, +8763, +8775, +8787, +8799, +8812, +8824, +8836, +8848, +8860, +8872, +8884, +8896, +8908, +8920, +8932, +8945, +8957, +8969, +8981, +8993, +9005, +9017, +9029, +9041, +9053, +9065, +9077, +9090, +9102, +9114, +9126, +9138, +9150, +9162, +9174, +9186, +9198, +9210, +9222, +9234, +9246, +9258, +9270, +9283, +9295, +9307, +9319, +9331, +9343, +9355, +9367, +9379, +9391, +9403, +9415, +9427, +9439, +9451, +9463, +9475, +9487, +9499, +9511, +9523, +9535, +9547, +9559, +9571, +9583, +9595, +9607, +9619, +9631, +9643, +9655, +9667, +9679, +9691, +9703, +9715, +9727, +9739, +9751, +9763, +9775, +9787, +9799, +9811, +9823, +9835, +9847, +9859, +9871, +9883, +9895, +9907, +9919, +9931, +9943, +9955, +9967, +9979, +9991, +10003, +10015, +10027, +10039, +10051, +10063, +10075, +10087, +10099, +10111, +10123, +10135, +10147, +10159, +10170, +10182, +10194, +10206, +10218, +10230, +10242, +10254, +10266, +10278, +10290, +10302, +10314, +10326, +10338, +10349, +10361, +10373, +10385, +10397, +10409, +10421, +10433, +10445, +10457, +10469, +10481, +10492, +10504, +10516, +10528, +10540, +10552, +10564, +10576, +10588, +10600, +10611, +10623, +10635, +10647, +10659, +10671, +10683, +10695, +10706, +10718, +10730, +10742, +10754, +10766, +10778, +10790, +10801, +10813, +10825, +10837, +10849, +10861, +10873, +10884, +10896, +10908, +10920, +10932, +10944, +10956, +10967, +10979, +10991, +11003, +11015, +11027, +11038, +11050, +11062, +11074, +11086, +11098, +11109, +11121, +11133, +11145, +11157, +11168, +11180, +11192, +11204, +11216, +11227, +11239, +11251, +11263, +11275, +11286, +11298, +11310, +11322, +11334, +11345, +11357, +11369, +11381, +11393, +11404, +11416, +11428, +11440, +11451, +11463, +11475, +11487, +11499, +11510, +11522, +11534, +11546, +11557, +11569, +11581, +11593, +11604, +11616, +11628, +11640, +11651, +11663, +11675, +11687, +11698, +11710, +11722, +11734, +11745, +11757, +11769, +11780, +11792, +11804, +11816, +11827, +11839, +11851, +11862, +11874, +11886, +11898, +11909, +11921, +11933, +11944, +11956, +11968, +11980, +11991, +12003, +12015, +12026, +12038, +12050, +12061, +12073, +12085, +12096, +12108, +12120, +12131, +12143, +12155, +12166, +12178, +12190, +12201, +12213, +12225, +12236, +12248, +12260, +12271, +12283, +12295, +12306, +12318, +12330, +12341, +12353, +12365, +12376, +12388, +12399, +12411, +12423, +12434, +12446, +12458, +12469, +12481, +12492, +12504, +12516, +12527, +12539, +12550, +12562, +12574, +12585, +12597, +12609, +12620, +12632, +12643, +12655, +12666, +12678, +12690, +12701, +12713, +12724, +12736, +12748, +12759, +12771, +12782, +12794, +12805, +12817, +12829, +12840, +12852, +12863, +12875, +12886, +12898, +12909, +12921, +12933, +12944, +12956, +12967, +12979, +12990, +13002, +13013, +13025, +13036, +13048, +13059, +13071, +13082, +13094, +13106, +13117, +13129, +13140, +13152, +13163, +13175, +13186, +13198, +13209, +13221, +13232, +13244, +13255, +13267, +13278, +13290, +13301, +13312, +13324, +13335, +13347, +13358, +13370, +13381, +13393, +13404, +13416, +13427, +13439, +13450, +13462, +13473, +13485, +13496, +13507, +13519, +13530, +13542, +13553, +13565, +13576, +13587, +13599, +13610, +13622, +13633, +13645, +13656, +13667, +13679, +13690, +13702, +13713, +13725, +13736, +13747, +13759, +13770, +13782, +13793, +13804, +13816, +13827, +13839, +13850, +13861, +13873, +13884, +13895, +13907, +13918, +13930, +13941, +13952, +13964, +13975, +13986, +13998, +14009, +14021, +14032, +14043, +14055, +14066, +14077, +14089, +14100, +14111, +14123, +14134, +14145, +14157, +14168, +14179, +14191, +14202, +14213, +14225, +14236, +14247, +14259, +14270, +14281, +14293, +14304, +14315, +14326, +14338, +14349, +14360, +14372, +14383, +14394, +14406, +14417, +14428, +14439, +14451, +14462, +14473, +14484, +14496, +14507, +14518, +14530, +14541, +14552, +14563, +14575, +14586, +14597, +14608, +14620, +14631, +14642, +14653, +14665, +14676, +14687, +14698, +14709, +14721, +14732, +14743, +14754, +14766, +14777, +14788, +14799, +14810, +14822, +14833, +14844, +14855, +14866, +14878, +14889, +14900, +14911, +14922, +14934, +14945, +14956, +14967, +14978, +14989, +15001, +15012, +15023, +15034, +15045, +15056, +15068, +15079, +15090, +15101, +15112, +15123, +15135, +15146, +15157, +15168, +15179, +15190, +15201, +15213, +15224, +15235, +15246, +15257, +15268, +15279, +15290, +15301, +15313, +15324, +15335, +15346, +15357, +15368, +15379, +15390, +15401, +15413, +15424, +15435, +15446, +15457, +15468, +15479, +15490, +15501, +15512, +15523, +15534, +15545, +15556, +15568, +15579, +15590, +15601, +15612, +15623, +15634, +15645, +15656, +15667, +15678, +15689, +15700, +15711, +15722, +15733, +15744, +15755, +15766, +15777, +15788, +15799, +15810, +15821, +15832, +15843, +15854, +15865, +15876, +15887, +15898, +15909, +15920, +15931, +15942, +15953, +15964, +15975, +15986, +15997, +16008, +16019, +16030, +16041, +16052, +16063, +16074, +16085, +16096, +16107, +16117, +16128, +16139, +16150, +16161, +16172, +16183, +16194, +16205, +16216, +16227, +16238, +16249, +16260, +16270, +16281, +16292, +16303, +16314, +16325, +16336, +16347, +16358, +16368, +16379, +16390, +16401, +16412, +16423, +16434, +16445, +16455, +16466, +16477, +16488, +16499, +16510, +16521, +16532, +16542, +16553, +16564, +16575, +16586, +16597, +16607, +16618, +16629, +16640, +16651, +16662, +16672, +16683, +16694, +16705, +16716, +16726, +16737, +16748, +16759, +16770, +16780, +16791, +16802, +16813, +16824, +16834, +16845, +16856, +16867, +16877, +16888, +16899, +16910, +16920, +16931, +16942, +16953, +16964, +16974, +16985, +16996, +17006, +17017, +17028, +17039, +17049, +17060, +17071, +17082, +17092, +17103, +17114, +17124, +17135, +17146, +17157, +17167, +17178, +17189, +17199, +17210, +17221, +17232, +17242, +17253, +17264, +17274, +17285, +17296, +17306, +17317, +17328, +17338, +17349, +17360, +17370, +17381, +17392, +17402, +17413, +17423, +17434, +17445, +17455, +17466, +17477, +17487, +17498, +17509, +17519, +17530, +17540, +17551, +17562, +17572, +17583, +17593, +17604, +17615, +17625, +17636, +17646, +17657, +17668, +17678, +17689, +17699, +17710, +17720, +17731, +17742, +17752, +17763, +17773, +17784, +17794, +17805, +17815, +17826, +17837, +17847, +17858, +17868, +17879, +17889, +17900, +17910, +17921, +17931, +17942, +17952, +17963, +17973, +17984, +17994, +18005, +18015, +18026, +18036, +18047, +18057, +18068, +18078, +18089, +18099, +18110, +18120, +18131, +18141, +18152, +18162, +18173, +18183, +18193, +18204, +18214, +18225, +18235, +18246, +18256, +18267, +18277, +18287, +18298, +18308, +18319, +18329, +18339, +18350, +18360, +18371, +18381, +18392, +18402, +18412, +18423, +18433, +18443, +18454, +18464, +18475, +18485, +18495, +18506, +18516, +18526, +18537, +18547, +18558, +18568, +18578, +18589, +18599, +18609, +18620, +18630, +18640, +18651, +18661, +18671, +18682, +18692, +18702, +18713, +18723, +18733, +18744, +18754, +18764, +18774, +18785, +18795, +18805, +18816, +18826, +18836, +18846, +18857, +18867, +18877, +18888, +18898, +18908, +18918, +18929, +18939, +18949, +18959, +18970, +18980, +18990, +19000, +19011, +19021, +19031, +19041, +19051, +19062, +19072, +19082, +19092, +19103, +19113, +19123, +19133, +19143, +19154, +19164, +19174, +19184, +19194, +19205, +19215, +19225, +19235, +19245, +19255, +19266, +19276, +19286, +19296, +19306, +19316, +19326, +19337, +19347, +19357, +19367, +19377, +19387, +19397, +19408, +19418, +19428, +19438, +19448, +19458, +19468, +19478, +19488, +19499, +19509, +19519, +19529, +19539, +19549, +19559, +19569, +19579, +19589, +19599, +19610, +19620, +19630, +19640, +19650, +19660, +19670, +19680, +19690, +19700, +19710, +19720, +19730, +19740, +19750, +19760, +19770, +19780, +19790, +19800, +19810, +19820, +19830, +19840, +19850, +19860, +19870, +19880, +19890, +19900, +19910, +19920, +19930, +19940, +19950, +19960, +19970, +19980, +19990, +20000, +20010, +20020, +20030, +20040, +20050, +20060, +20070, +20079, +20089, +20099, +20109, +20119, +20129, +20139, +20149, +20159, +20169, +20179, +20188, +20198, +20208, +20218, +20228, +20238, +20248, +20258, +20268, +20277, +20287, +20297, +20307, +20317, +20327, +20337, +20346, +20356, +20366, +20376, +20386, +20396, +20406, +20415, +20425, +20435, +20445, +20455, +20464, +20474, +20484, +20494, +20504, +20513, +20523, +20533, +20543, +20553, +20562, +20572, +20582, +20592, +20602, +20611, +20621, +20631, +20641, +20650, +20660, +20670, +20680, +20689, +20699, +20709, +20719, +20728, +20738, +20748, +20758, +20767, +20777, +20787, +20796, +20806, +20816, +20825, +20835, +20845, +20855, +20864, +20874, +20884, +20893, +20903, +20913, +20922, +20932, +20942, +20951, +20961, +20971, +20980, +20990, +21000, +21009, +21019, +21029, +21038, +21048, +21057, +21067, +21077, +21086, +21096, +21106, +21115, +21125, +21134, +21144, +21154, +21163, +21173, +21182, +21192, +21202, +21211, +21221, +21230, +21240, +21249, +21259, +21268, +21278, +21288, +21297, +21307, +21316, +21326, +21335, +21345, +21354, +21364, +21373, +21383, +21392, +21402, +21412, +21421, +21431, +21440, +21450, +21459, +21469, +21478, +21488, +21497, +21506, +21516, +21525, +21535, +21544, +21554, +21563, +21573, +21582, +21592, +21601, +21611, +21620, +21629, +21639, +21648, +21658, +21667, +21677, +21686, +21695, +21705, +21714, +21724, +21733, +21743, +21752, +21761, +21771, +21780, +21789, +21799, +21808, +21818, +21827, +21836, +21846, +21855, +21864, +21874, +21883, +21893, +21902, +21911, +21921, +21930, +21939, +21949, +21958, +21967, +21977, +21986, +21995, +22004, +22014, +22023, +22032, +22042, +22051, +22060, +22070, +22079, +22088, +22097, +22107, +22116, +22125, +22135, +22144, +22153, +22162, +22172, +22181, +22190, +22199, +22209, +22218, +22227, +22236, +22245, +22255, +22264, +22273, +22282, +22292, +22301, +22310, +22319, +22328, +22338, +22347, +22356, +22365, +22374, +22383, +22393, +22402, +22411, +22420, +22429, +22438, +22448, +22457, +22466, +22475, +22484, +22493, +22503, +22512, +22521, +22530, +22539, +22548, +22557, +22566, +22575, +22585, +22594, +22603, +22612, +22621, +22630, +22639, +22648, +22657, +22666, +22675, +22685, +22694, +22703, +22712, +22721, +22730, +22739, +22748, +22757, +22766, +22775, +22784, +22793, +22802, +22811, +22820, +22829, +22838, +22847, +22856, +22865, +22874, +22883, +22892, +22901, +22910, +22919, +22928, +22937, +22946, +22955, +22964, +22973, +22982, +22991, +23000, +23009, +23018, +23027, +23036, +23045, +23053, +23062, +23071, +23080, +23089, +23098, +23107, +23116, +23125, +23134, +23143, +23151, +23160, +23169, +23178, +23187, +23196, +23205, +23214, +23223, +23231, +23240, +23249, +23258, +23267, +23276, +23284, +23293, +23302, +23311, +23320, +23329, +23337, +23346, +23355, +23364, +23373, +23382, +23390, +23399, +23408, +23417, +23426, +23434, +23443, +23452, +23461, +23469, +23478, +23487, +23496, +23504, +23513, +23522, +23531, +23539, +23548, +23557, +23566, +23574, +23583, +23592, +23601, +23609, +23618, +23627, +23635, +23644, +23653, +23661, +23670, +23679, +23688, +23696, +23705, +23714, +23722, +23731, +23740, +23748, +23757, +23766, +23774, +23783, +23791, +23800, +23809, +23817, +23826, +23835, +23843, +23852, +23860, +23869, +23878, +23886, +23895, +23903, +23912, +23921, +23929, +23938, +23946, +23955, +23964, +23972, +23981, +23989, +23998, +24006, +24015, +24023, +24032, +24041, +24049, +24058, +24066, +24075, +24083, +24092, +24100, +24109, +24117, +24126, +24134, +24143, +24151, +24160, +24168, +24177, +24185, +24194, +24202, +24211, +24219, +24228, +24236, +24244, +24253, +24261, +24270, +24278, +24287, +24295, +24304, +24312, +24320, +24329, +24337, +24346, +24354, +24362, +24371, +24379, +24388, +24396, +24404, +24413, +24421, +24430, +24438, +24446, +24455, +24463, +24471, +24480, +24488, +24496, +24505, +24513, +24521, +24530, +24538, +24546, +24555, +24563, +24571, +24580, +24588, +24596, +24605, +24613, +24621, +24630, +24638, +24646, +24654, +24663, +24671, +24679, +24687, +24696, +24704, +24712, +24720, +24729, +24737, +24745, +24753, +24762, +24770, +24778, +24786, +24795, +24803, +24811, +24819, +24827, +24836, +24844, +24852, +24860, +24868, +24877, +24885, +24893, +24901, +24909, +24917, +24926, +24934, +24942, +24950, +24958, +24966, +24974, +24983, +24991, +24999, +25007, +25015, +25023, +25031, +25039, +25047, +25056, +25064, +25072, +25080, +25088, +25096, +25104, +25112, +25120, +25128, +25136, +25144, +25152, +25161, +25169, +25177, +25185, +25193, +25201, +25209, +25217, +25225, +25233, +25241, +25249, +25257, +25265, +25273, +25281, +25289, +25297, +25305, +25313, +25321, +25329, +25337, +25345, +25353, +25361, +25369, +25376, +25384, +25392, +25400, +25408, +25416, +25424, +25432, +25440, +25448, +25456, +25464, +25472, +25480, +25487, +25495, +25503, +25511, +25519, +25527, +25535, +25543, +25550, +25558, +25566, +25574, +25582, +25590, +25598, +25605, +25613, +25621, +25629, +25637, +25645, +25652, +25660, +25668, +25676, +25684, +25691, +25699, +25707, +25715, +25723, +25730, +25738, +25746, +25754, +25762, +25769, +25777, +25785, +25793, +25800, +25808, +25816, +25824, +25831, +25839, +25847, +25854, +25862, +25870, +25878, +25885, +25893, +25901, +25908, +25916, +25924, +25931, +25939, +25947, +25954, +25962, +25970, +25977, +25985, +25993, +26000, +26008, +26016, +26023, +26031, +26039, +26046, +26054, +26061, +26069, +26077, +26084, +26092, +26099, +26107, +26115, +26122, +26130, +26137, +26145, +26153, +26160, +26168, +26175, +26183, +26190, +26198, +26205, +26213, +26221, +26228, +26236, +26243, +26251, +26258, +26266, +26273, +26281, +26288, +26296, +26303, +26311, +26318, +26326, +26333, +26341, +26348, +26356, +26363, +26371, +26378, +26385, +26393, +26400, +26408, +26415, +26423, +26430, +26437, +26445, +26452, +26460, +26467, +26475, +26482, +26489, +26497, +26504, +26512, +26519, +26526, +26534, +26541, +26548, +26556, +26563, +26570, +26578, +26585, +26593, +26600, +26607, +26615, +26622, +26629, +26636, +26644, +26651, +26658, +26666, +26673, +26680, +26688, +26695, +26702, +26709, +26717, +26724, +26731, +26739, +26746, +26753, +26760, +26768, +26775, +26782, +26789, +26797, +26804, +26811, +26818, +26825, +26833, +26840, +26847, +26854, +26861, +26869, +26876, +26883, +26890, +26897, +26905, +26912, +26919, +26926, +26933, +26940, +26948, +26955, +26962, +26969, +26976, +26983, +26990, +26997, +27005, +27012, +27019, +27026, +27033, +27040, +27047, +27054, +27061, +27068, +27076, +27083, +27090, +27097, +27104, +27111, +27118, +27125, +27132, +27139, +27146, +27153, +27160, +27167, +27174, +27181, +27188, +27195, +27202, +27209, +27216, +27223, +27230, +27237, +27244, +27251, +27258, +27265, +27272, +27279, +27286, +27293, +27300, +27307, +27314, +27321, +27328, +27335, +27342, +27349, +27355, +27362, +27369, +27376, +27383, +27390, +27397, +27404, +27411, +27418, +27424, +27431, +27438, +27445, +27452, +27459, +27466, +27472, +27479, +27486, +27493, +27500, +27507, +27513, +27520, +27527, +27534, +27541, +27548, +27554, +27561, +27568, +27575, +27582, +27588, +27595, +27602, +27609, +27615, +27622, +27629, +27636, +27642, +27649, +27656, +27663, +27669, +27676, +27683, +27690, +27696, +27703, +27710, +27716, +27723, +27730, +27736, +27743, +27750, +27757, +27763, +27770, +27777, +27783, +27790, +27797, +27803, +27810, +27816, +27823, +27830, +27836, +27843, +27850, +27856, +27863, +27869, +27876, +27883, +27889, +27896, +27902, +27909, +27916, +27922, +27929, +27935, +27942, +27948, +27955, +27962, +27968, +27975, +27981, +27988, +27994, +28001, +28007, +28014, +28020, +28027, +28033, +28040, +28046, +28053, +28059, +28066, +28072, +28079, +28085, +28092, +28098, +28105, +28111, +28118, +28124, +28131, +28137, +28143, +28150, +28156, +28163, +28169, +28176, +28182, +28188, +28195, +28201, +28208, +28214, +28220, +28227, +28233, +28239, +28246, +28252, +28259, +28265, +28271, +28278, +28284, +28290, +28297, +28303, +28309, +28316, +28322, +28328, +28335, +28341, +28347, +28353, +28360, +28366, +28372, +28379, +28385, +28391, +28397, +28404, +28410, +28416, +28423, +28429, +28435, +28441, +28447, +28454, +28460, +28466, +28472, +28479, +28485, +28491, +28497, +28503, +28510, +28516, +28522, +28528, +28534, +28541, +28547, +28553, +28559, +28565, +28571, +28578, +28584, +28590, +28596, +28602, +28608, +28614, +28620, +28627, +28633, +28639, +28645, +28651, +28657, +28663, +28669, +28675, +28681, +28687, +28694, +28700, +28706, +28712, +28718, +28724, +28730, +28736, +28742, +28748, +28754, +28760, +28766, +28772, +28778, +28784, +28790, +28796, +28802, +28808, +28814, +28820, +28826, +28832, +28838, +28844, +28850, +28856, +28862, +28868, +28874, +28880, +28886, +28891, +28897, +28903, +28909, +28915, +28921, +28927, +28933, +28939, +28945, +28951, +28956, +28962, +28968, +28974, +28980, +28986, +28992, +28997, +29003, +29009, +29015, +29021, +29027, +29033, +29038, +29044, +29050, +29056, +29062, +29067, +29073, +29079, +29085, +29091, +29096, +29102, +29108, +29114, +29119, +29125, +29131, +29137, +29142, +29148, +29154, +29160, +29165, +29171, +29177, +29183, +29188, +29194, +29200, +29205, +29211, +29217, +29222, +29228, +29234, +29239, +29245, +29251, +29256, +29262, +29268, +29273, +29279, +29285, +29290, +29296, +29302, +29307, +29313, +29318, +29324, +29330, +29335, +29341, +29346, +29352, +29358, +29363, +29369, +29374, +29380, +29385, +29391, +29397, +29402, +29408, +29413, +29419, +29424, +29430, +29435, +29441, +29446, +29452, +29457, +29463, +29468, +29474, +29479, +29485, +29490, +29496, +29501, +29507, +29512, +29518, +29523, +29529, +29534, +29539, +29545, +29550, +29556, +29561, +29567, +29572, +29577, +29583, +29588, +29594, +29599, +29604, +29610, +29615, +29621, +29626, +29631, +29637, +29642, +29647, +29653, +29658, +29663, +29669, +29674, +29679, +29685, +29690, +29695, +29701, +29706, +29711, +29717, +29722, +29727, +29732, +29738, +29743, +29748, +29753, +29759, +29764, +29769, +29774, +29780, +29785, +29790, +29795, +29801, +29806, +29811, +29816, +29822, +29827, +29832, +29837, +29842, +29848, +29853, +29858, +29863, +29868, +29873, +29879, +29884, +29889, +29894, +29899, +29904, +29909, +29915, +29920, +29925, +29930, +29935, +29940, +29945, +29950, +29955, +29961, +29966, +29971, +29976, +29981, +29986, +29991, +29996, +30001, +30006, +30011, +30016, +30021, +30026, +30031, +30036, +30041, +30046, +30051, +30056, +30061, +30066, +30071, +30076, +30081, +30086, +30091, +30096, +30101, +30106, +30111, +30116, +30121, +30126, +30131, +30136, +30141, +30146, +30151, +30156, +30160, +30165, +30170, +30175, +30180, +30185, +30190, +30195, +30200, +30205, +30209, +30214, +30219, +30224, +30229, +30234, +30238, +30243, +30248, +30253, +30258, +30263, +30267, +30272, +30277, +30282, +30287, +30291, +30296, +30301, +30306, +30311, +30315, +30320, +30325, +30330, +30334, +30339, +30344, +30349, +30353, +30358, +30363, +30368, +30372, +30377, +30382, +30386, +30391, +30396, +30400, +30405, +30410, +30415, +30419, +30424, +30429, +30433, +30438, +30442, +30447, +30452, +30456, +30461, +30466, +30470, +30475, +30480, +30484, +30489, +30493, +30498, +30503, +30507, +30512, +30516, +30521, +30525, +30530, +30535, +30539, +30544, +30548, +30553, +30557, +30562, +30566, +30571, +30575, +30580, +30584, +30589, +30593, +30598, +30602, +30607, +30611, +30616, +30620, +30625, +30629, +30634, +30638, +30643, +30647, +30652, +30656, +30660, +30665, +30669, +30674, +30678, +30683, +30687, +30691, +30696, +30700, +30705, +30709, +30713, +30718, +30722, +30726, +30731, +30735, +30739, +30744, +30748, +30753, +30757, +30761, +30766, +30770, +30774, +30778, +30783, +30787, +30791, +30796, +30800, +30804, +30809, +30813, +30817, +30821, +30826, +30830, +30834, +30838, +30843, +30847, +30851, +30855, +30860, +30864, +30868, +30872, +30876, +30881, +30885, +30889, +30893, +30897, +30902, +30906, +30910, +30914, +30918, +30922, +30927, +30931, +30935, +30939, +30943, +30947, +30951, +30955, +30960, +30964, +30968, +30972, +30976, +30980, +30984, +30988, +30992, +30996, +31001, +31005, +31009, +31013, +31017, +31021, +31025, +31029, +31033, +31037, +31041, +31045, +31049, +31053, +31057, +31061, +31065, +31069, +31073, +31077, +31081, +31085, +31089, +31093, +31097, +31101, +31105, +31109, +31113, +31117, +31121, +31124, +31128, +31132, +31136, +31140, +31144, +31148, +31152, +31156, +31160, +31164, +31167, +31171, +31175, +31179, +31183, +31187, +31191, +31194, +31198, +31202, +31206, +31210, +31214, +31217, +31221, +31225, +31229, +31233, +31236, +31240, +31244, +31248, +31252, +31255, +31259, +31263, +31267, +31270, +31274, +31278, +31282, +31285, +31289, +31293, +31297, +31300, +31304, +31308, +31311, +31315, +31319, +31323, +31326, +31330, +31334, +31337, +31341, +31345, +31348, +31352, +31356, +31359, +31363, +31366, +31370, +31374, +31377, +31381, +31385, +31388, +31392, +31395, +31399, +31403, +31406, +31410, +31413, +31417, +31420, +31424, +31428, +31431, +31435, +31438, +31442, +31445, +31449, +31452, +31456, +31459, +31463, +31466, +31470, +31473, +31477, +31480, +31484, +31487, +31491, +31494, +31498, +31501, +31505, +31508, +31512, +31515, +31518, +31522, +31525, +31529, +31532, +31536, +31539, +31542, +31546, +31549, +31553, +31556, +31559, +31563, +31566, +31569, +31573, +31576, +31580, +31583, +31586, +31590, +31593, +31596, +31600, +31603, +31606, +31610, +31613, +31616, +31619, +31623, +31626, +31629, +31633, +31636, +31639, +31642, +31646, +31649, +31652, +31655, +31659, +31662, +31665, +31668, +31672, +31675, +31678, +31681, +31684, +31688, +31691, +31694, +31697, +31700, +31704, +31707, +31710, +31713, +31716, +31719, +31723, +31726, +31729, +31732, +31735, +31738, +31741, +31744, +31748, +31751, +31754, +31757, +31760, +31763, +31766, +31769, +31772, +31775, +31778, +31781, +31785, +31788, +31791, +31794, +31797, +31800, +31803, +31806, +31809, +31812, +31815, +31818, +31821, +31824, +31827, +31830, +31833, +31836, +31839, +31842, +31845, +31848, +31851, +31854, +31856, +31859, +31862, +31865, +31868, +31871, +31874, +31877, +31880, +31883, +31886, +31889, +31891, +31894, +31897, +31900, +31903, +31906, +31909, +31911, +31914, +31917, +31920, +31923, +31926, +31929, +31931, +31934, +31937, +31940, +31943, +31945, +31948, +31951, +31954, +31957, +31959, +31962, +31965, +31968, +31970, +31973, +31976, +31979, +31981, +31984, +31987, +31989, +31992, +31995, +31998, +32000, +32003, +32006, +32008, +32011, +32014, +32016, +32019, +32022, +32024, +32027, +32030, +32032, +32035, +32038, +32040, +32043, +32046, +32048, +32051, +32053, +32056, +32059, +32061, +32064, +32066, +32069, +32072, +32074, +32077, +32079, +32082, +32084, +32087, +32089, +32092, +32095, +32097, +32100, +32102, +32105, +32107, +32110, +32112, +32115, +32117, +32120, +32122, +32125, +32127, +32130, +32132, +32134, +32137, +32139, +32142, +32144, +32147, +32149, +32152, +32154, +32156, +32159, +32161, +32164, +32166, +32168, +32171, +32173, +32176, +32178, +32180, +32183, +32185, +32187, +32190, +32192, +32194, +32197, +32199, +32201, +32204, +32206, +32208, +32211, +32213, +32215, +32218, +32220, +32222, +32224, +32227, +32229, +32231, +32233, +32236, +32238, +32240, +32242, +32245, +32247, +32249, +32251, +32254, +32256, +32258, +32260, +32262, +32265, +32267, +32269, +32271, +32273, +32275, +32278, +32280, +32282, +32284, +32286, +32288, +32291, +32293, +32295, +32297, +32299, +32301, +32303, +32305, +32307, +32310, +32312, +32314, +32316, +32318, +32320, +32322, +32324, +32326, +32328, +32330, +32332, +32334, +32336, +32338, +32340, +32342, +32344, +32346, +32348, +32350, +32352, +32354, +32356, +32358, +32360, +32362, +32364, +32366, +32368, +32370, +32372, +32374, +32376, +32378, +32380, +32382, +32384, +32386, +32387, +32389, +32391, +32393, +32395, +32397, +32399, +32401, +32403, +32404, +32406, +32408, +32410, +32412, +32414, +32416, +32417, +32419, +32421, +32423, +32425, +32426, +32428, +32430, +32432, +32434, +32435, +32437, +32439, +32441, +32443, +32444, +32446, +32448, +32450, +32451, +32453, +32455, +32456, +32458, +32460, +32462, +32463, +32465, +32467, +32468, +32470, +32472, +32473, +32475, +32477, +32478, +32480, +32482, +32483, +32485, +32487, +32488, +32490, +32492, +32493, +32495, +32496, +32498, +32500, +32501, +32503, +32504, +32506, +32508, +32509, +32511, +32512, +32514, +32515, +32517, +32519, +32520, +32522, +32523, +32525, +32526, +32528, +32529, +32531, +32532, +32534, +32535, +32537, +32538, +32540, +32541, +32543, +32544, +32546, +32547, +32548, +32550, +32551, +32553, +32554, +32556, +32557, +32558, +32560, +32561, +32563, +32564, +32565, +32567, +32568, +32570, +32571, +32572, +32574, +32575, +32576, +32578, +32579, +32580, +32582, +32583, +32584, +32586, +32587, +32588, +32590, +32591, +32592, +32594, +32595, +32596, +32597, +32599, +32600, +32601, +32602, +32604, +32605, +32606, +32607, +32609, +32610, +32611, +32612, +32614, +32615, +32616, +32617, +32618, +32620, +32621, +32622, +32623, +32624, +32625, +32627, +32628, +32629, +32630, +32631, +32632, +32634, +32635, +32636, +32637, +32638, +32639, +32640, +32641, +32642, +32644, +32645, +32646, +32647, +32648, +32649, +32650, +32651, +32652, +32653, +32654, +32655, +32656, +32657, +32658, +32659, +32660, +32661, +32662, +32663, +32664, +32665, +32666, +32667, +32668, +32669, +32670, +32671, +32672, +32673, +32674, +32675, +32676, +32677, +32678, +32679, +32680, +32680, +32681, +32682, +32683, +32684, +32685, +32686, +32687, +32688, +32688, +32689, +32690, +32691, +32692, +32693, +32694, +32694, +32695, +32696, +32697, +32698, +32699, +32699, +32700, +32701, +32702, +32703, +32703, +32704, +32705, +32706, +32706, +32707, +32708, +32709, +32709, +32710, +32711, +32712, +32712, +32713, +32714, +32714, +32715, +32716, +32717, +32717, +32718, +32719, +32719, +32720, +32721, +32721, +32722, +32723, +32723, +32724, +32725, +32725, +32726, +32726, +32727, +32728, +32728, +32729, +32729, +32730, +32731, +32731, +32732, +32732, +32733, +32734, +32734, +32735, +32735, +32736, +32736, +32737, +32737, +32738, +32738, +32739, +32739, +32740, +32740, +32741, +32741, +32742, +32742, +32743, +32743, +32744, +32744, +32745, +32745, +32746, +32746, +32747, +32747, +32747, +32748, +32748, +32749, +32749, +32750, +32750, +32750, +32751, +32751, +32751, +32752, +32752, +32753, +32753, +32753, +32754, +32754, +32754, +32755, +32755, +32755, +32756, +32756, +32756, +32757, +32757, +32757, +32758, +32758, +32758, +32758, +32759, +32759, +32759, +32759, +32760, +32760, +32760, +32760, +32761, +32761, +32761, +32761, +32762, +32762, +32762, +32762, +32762, +32763, +32763, +32763, +32763, +32763, +32764, +32764, +32764, +32764, +32764, +32764, +32764, +32765, +32765, +32765, +32765, +32765, +32765, +32765, +32765, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32767, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32766, +32765, +32765, +32765, +32765, +32765, +32765, +32765, +32765, +32764, +32764, +32764, +32764, +32764, +32764, +32764, +32763, +32763, +32763, +32763, +32763, +32762, +32762, +32762, +32762, +32762, +32761, +32761, +32761, +32761, +32760, +32760, +32760, +32760, +32759, +32759, +32759, +32759, +32758, +32758, +32758, +32758, +32757, +32757, +32757, +32756, +32756, +32756, +32755, +32755, +32755, +32754, +32754, +32754, +32753, +32753, +32753, +32752, +32752, +32751, +32751, +32751, +32750, +32750, +32750, +32749, +32749, +32748, +32748, +32747, +32747, +32747, +32746, +32746, +32745, +32745, +32744, +32744, +32743, +32743, +32742, +32742, +32741, +32741, +32740, +32740, +32739, +32739, +32738, +32738, +32737, +32737, +32736, +32736, +32735, +32735, +32734, +32734, +32733, +32732, +32732, +32731, +32731, +32730, +32729, +32729, +32728, +32728, +32727, +32726, +32726, +32725, +32725, +32724, +32723, +32723, +32722, +32721, +32721, +32720, +32719, +32719, +32718, +32717, +32717, +32716, +32715, +32714, +32714, +32713, +32712, +32712, +32711, +32710, +32709, +32709, +32708, +32707, +32706, +32706, +32705, +32704, +32703, +32703, +32702, +32701, +32700, +32699, +32699, +32698, +32697, +32696, +32695, +32694, +32694, +32693, +32692, +32691, +32690, +32689, +32688, +32688, +32687, +32686, +32685, +32684, +32683, +32682, +32681, +32680, +32680, +32679, +32678, +32677, +32676, +32675, +32674, +32673, +32672, +32671, +32670, +32669, +32668, +32667, +32666, +32665, +32664, +32663, +32662, +32661, +32660, +32659, +32658, +32657, +32656, +32655, +32654, +32653, +32652, +32651, +32650, +32649, +32648, +32647, +32646, +32645, +32644, +32642, +32641, +32640, +32639, +32638, +32637, +32636, +32635, +32634, +32632, +32631, +32630, +32629, +32628, +32627, +32625, +32624, +32623, +32622, +32621, +32620, +32618, +32617, +32616, +32615, +32614, +32612, +32611, +32610, +32609, +32607, +32606, +32605, +32604, +32602, +32601, +32600, +32599, +32597, +32596, +32595, +32594, +32592, +32591, +32590, +32588, +32587, +32586, +32584, +32583, +32582, +32580, +32579, +32578, +32576, +32575, +32574, +32572, +32571, +32570, +32568, +32567, +32565, +32564, +32563, +32561, +32560, +32558, +32557, +32556, +32554, +32553, +32551, +32550, +32548, +32547, +32546, +32544, +32543, +32541, +32540, +32538, +32537, +32535, +32534, +32532, +32531, +32529, +32528, +32526, +32525, +32523, +32522, +32520, +32519, +32517, +32515, +32514, +32512, +32511, +32509, +32508, +32506, +32504, +32503, +32501, +32500, +32498, +32496, +32495, +32493, +32492, +32490, +32488, +32487, +32485, +32483, +32482, +32480, +32478, +32477, +32475, +32473, +32472, +32470, +32468, +32467, +32465, +32463, +32462, +32460, +32458, +32456, +32455, +32453, +32451, +32450, +32448, +32446, +32444, +32443, +32441, +32439, +32437, +32435, +32434, +32432, +32430, +32428, +32426, +32425, +32423, +32421, +32419, +32417, +32416, +32414, +32412, +32410, +32408, +32406, +32404, +32403, +32401, +32399, +32397, +32395, +32393, +32391, +32389, +32387, +32386, +32384, +32382, +32380, +32378, +32376, +32374, +32372, +32370, +32368, +32366, +32364, +32362, +32360, +32358, +32356, +32354, +32352, +32350, +32348, +32346, +32344, +32342, +32340, +32338, +32336, +32334, +32332, +32330, +32328, +32326, +32324, +32322, +32320, +32318, +32316, +32314, +32312, +32310, +32307, +32305, +32303, +32301, +32299, +32297, +32295, +32293, +32291, +32288, +32286, +32284, +32282, +32280, +32278, +32275, +32273, +32271, +32269, +32267, +32265, +32262, +32260, +32258, +32256, +32254, +32251, +32249, +32247, +32245, +32242, +32240, +32238, +32236, +32233, +32231, +32229, +32227, +32224, +32222, +32220, +32218, +32215, +32213, +32211, +32208, +32206, +32204, +32201, +32199, +32197, +32194, +32192, +32190, +32187, +32185, +32183, +32180, +32178, +32176, +32173, +32171, +32168, +32166, +32164, +32161, +32159, +32156, +32154, +32152, +32149, +32147, +32144, +32142, +32139, +32137, +32134, +32132, +32130, +32127, +32125, +32122, +32120, +32117, +32115, +32112, +32110, +32107, +32105, +32102, +32100, +32097, +32095, +32092, +32089, +32087, +32084, +32082, +32079, +32077, +32074, +32072, +32069, +32066, +32064, +32061, +32059, +32056, +32053, +32051, +32048, +32046, +32043, +32040, +32038, +32035, +32032, +32030, +32027, +32024, +32022, +32019, +32016, +32014, +32011, +32008, +32006, +32003, +32000, +31998, +31995, +31992, +31989, +31987, +31984, +31981, +31979, +31976, +31973, +31970, +31968, +31965, +31962, +31959, +31957, +31954, +31951, +31948, +31945, +31943, +31940, +31937, +31934, +31931, +31929, +31926, +31923, +31920, +31917, +31914, +31911, +31909, +31906, +31903, +31900, +31897, +31894, +31891, +31889, +31886, +31883, +31880, +31877, +31874, +31871, +31868, +31865, +31862, +31859, +31856, +31854, +31851, +31848, +31845, +31842, +31839, +31836, +31833, +31830, +31827, +31824, +31821, +31818, +31815, +31812, +31809, +31806, +31803, +31800, +31797, +31794, +31791, +31788, +31785, +31781, +31778, +31775, +31772, +31769, +31766, +31763, +31760, +31757, +31754, +31751, +31748, +31744, +31741, +31738, +31735, +31732, +31729, +31726, +31723, +31719, +31716, +31713, +31710, +31707, +31704, +31700, +31697, +31694, +31691, +31688, +31684, +31681, +31678, +31675, +31672, +31668, +31665, +31662, +31659, +31655, +31652, +31649, +31646, +31642, +31639, +31636, +31633, +31629, +31626, +31623, +31619, +31616, +31613, +31610, +31606, +31603, +31600, +31596, +31593, +31590, +31586, +31583, +31580, +31576, +31573, +31569, +31566, +31563, +31559, +31556, +31553, +31549, +31546, +31542, +31539, +31536, +31532, +31529, +31525, +31522, +31518, +31515, +31512, +31508, +31505, +31501, +31498, +31494, +31491, +31487, +31484, +31480, +31477, +31473, +31470, +31466, +31463, +31459, +31456, +31452, +31449, +31445, +31442, +31438, +31435, +31431, +31428, +31424, +31420, +31417, +31413, +31410, +31406, +31403, +31399, +31395, +31392, +31388, +31385, +31381, +31377, +31374, +31370, +31366, +31363, +31359, +31356, +31352, +31348, +31345, +31341, +31337, +31334, +31330, +31326, +31323, +31319, +31315, +31311, +31308, +31304, +31300, +31297, +31293, +31289, +31285, +31282, +31278, +31274, +31270, +31267, +31263, +31259, +31255, +31252, +31248, +31244, +31240, +31236, +31233, +31229, +31225, +31221, +31217, +31214, +31210, +31206, +31202, +31198, +31194, +31191, +31187, +31183, +31179, +31175, +31171, +31167, +31164, +31160, +31156, +31152, +31148, +31144, +31140, +31136, +31132, +31128, +31124, +31121, +31117, +31113, +31109, +31105, +31101, +31097, +31093, +31089, +31085, +31081, +31077, +31073, +31069, +31065, +31061, +31057, +31053, +31049, +31045, +31041, +31037, +31033, +31029, +31025, +31021, +31017, +31013, +31009, +31005, +31001, +30996, +30992, +30988, +30984, +30980, +30976, +30972, +30968, +30964, +30960, +30955, +30951, +30947, +30943, +30939, +30935, +30931, +30927, +30922, +30918, +30914, +30910, +30906, +30902, +30897, +30893, +30889, +30885, +30881, +30876, +30872, +30868, +30864, +30860, +30855, +30851, +30847, +30843, +30838, +30834, +30830, +30826, +30821, +30817, +30813, +30809, +30804, +30800, +30796, +30791, +30787, +30783, +30778, +30774, +30770, +30766, +30761, +30757, +30753, +30748, +30744, +30739, +30735, +30731, +30726, +30722, +30718, +30713, +30709, +30705, +30700, +30696, +30691, +30687, +30683, +30678, +30674, +30669, +30665, +30660, +30656, +30652, +30647, +30643, +30638, +30634, +30629, +30625, +30620, +30616, +30611, +30607, +30602, +30598, +30593, +30589, +30584, +30580, +30575, +30571, +30566, +30562, +30557, +30553, +30548, +30544, +30539, +30535, +30530, +30525, +30521, +30516, +30512, +30507, +30503, +30498, +30493, +30489, +30484, +30480, +30475, +30470, +30466, +30461, +30456, +30452, +30447, +30442, +30438, +30433, +30429, +30424, +30419, +30415, +30410, +30405, +30400, +30396, +30391, +30386, +30382, +30377, +30372, +30368, +30363, +30358, +30353, +30349, +30344, +30339, +30334, +30330, +30325, +30320, +30315, +30311, +30306, +30301, +30296, +30291, +30287, +30282, +30277, +30272, +30267, +30263, +30258, +30253, +30248, +30243, +30238, +30234, +30229, +30224, +30219, +30214, +30209, +30205, +30200, +30195, +30190, +30185, +30180, +30175, +30170, +30165, +30160, +30156, +30151, +30146, +30141, +30136, +30131, +30126, +30121, +30116, +30111, +30106, +30101, +30096, +30091, +30086, +30081, +30076, +30071, +30066, +30061, +30056, +30051, +30046, +30041, +30036, +30031, +30026, +30021, +30016, +30011, +30006, +30001, +29996, +29991, +29986, +29981, +29976, +29971, +29966, +29961, +29955, +29950, +29945, +29940, +29935, +29930, +29925, +29920, +29915, +29909, +29904, +29899, +29894, +29889, +29884, +29879, +29873, +29868, +29863, +29858, +29853, +29848, +29842, +29837, +29832, +29827, +29822, +29816, +29811, +29806, +29801, +29795, +29790, +29785, +29780, +29774, +29769, +29764, +29759, +29753, +29748, +29743, +29738, +29732, +29727, +29722, +29717, +29711, +29706, +29701, +29695, +29690, +29685, +29679, +29674, +29669, +29663, +29658, +29653, +29647, +29642, +29637, +29631, +29626, +29621, +29615, +29610, +29604, +29599, +29594, +29588, +29583, +29577, +29572, +29567, +29561, +29556, +29550, +29545, +29539, +29534, +29529, +29523, +29518, +29512, +29507, +29501, +29496, +29490, +29485, +29479, +29474, +29468, +29463, +29457, +29452, +29446, +29441, +29435, +29430, +29424, +29419, +29413, +29408, +29402, +29397, +29391, +29385, +29380, +29374, +29369, +29363, +29358, +29352, +29346, +29341, +29335, +29330, +29324, +29318, +29313, +29307, +29302, +29296, +29290, +29285, +29279, +29273, +29268, +29262, +29256, +29251, +29245, +29239, +29234, +29228, +29222, +29217, +29211, +29205, +29200, +29194, +29188, +29183, +29177, +29171, +29165, +29160, +29154, +29148, +29142, +29137, +29131, +29125, +29119, +29114, +29108, +29102, +29096, +29091, +29085, +29079, +29073, +29067, +29062, +29056, +29050, +29044, +29038, +29033, +29027, +29021, +29015, +29009, +29003, +28997, +28992, +28986, +28980, +28974, +28968, +28962, +28956, +28951, +28945, +28939, +28933, +28927, +28921, +28915, +28909, +28903, +28897, +28891, +28886, +28880, +28874, +28868, +28862, +28856, +28850, +28844, +28838, +28832, +28826, +28820, +28814, +28808, +28802, +28796, +28790, +28784, +28778, +28772, +28766, +28760, +28754, +28748, +28742, +28736, +28730, +28724, +28718, +28712, +28706, +28700, +28694, +28687, +28681, +28675, +28669, +28663, +28657, +28651, +28645, +28639, +28633, +28627, +28620, +28614, +28608, +28602, +28596, +28590, +28584, +28578, +28571, +28565, +28559, +28553, +28547, +28541, +28534, +28528, +28522, +28516, +28510, +28503, +28497, +28491, +28485, +28479, +28472, +28466, +28460, +28454, +28447, +28441, +28435, +28429, +28423, +28416, +28410, +28404, +28397, +28391, +28385, +28379, +28372, +28366, +28360, +28353, +28347, +28341, +28335, +28328, +28322, +28316, +28309, +28303, +28297, +28290, +28284, +28278, +28271, +28265, +28259, +28252, +28246, +28239, +28233, +28227, +28220, +28214, +28208, +28201, +28195, +28188, +28182, +28176, +28169, +28163, +28156, +28150, +28143, +28137, +28131, +28124, +28118, +28111, +28105, +28098, +28092, +28085, +28079, +28072, +28066, +28059, +28053, +28046, +28040, +28033, +28027, +28020, +28014, +28007, +28001, +27994, +27988, +27981, +27975, +27968, +27962, +27955, +27948, +27942, +27935, +27929, +27922, +27916, +27909, +27902, +27896, +27889, +27883, +27876, +27869, +27863, +27856, +27850, +27843, +27836, +27830, +27823, +27816, +27810, +27803, +27797, +27790, +27783, +27777, +27770, +27763, +27757, +27750, +27743, +27736, +27730, +27723, +27716, +27710, +27703, +27696, +27690, +27683, +27676, +27669, +27663, +27656, +27649, +27642, +27636, +27629, +27622, +27615, +27609, +27602, +27595, +27588, +27582, +27575, +27568, +27561, +27554, +27548, +27541, +27534, +27527, +27520, +27513, +27507, +27500, +27493, +27486, +27479, +27472, +27466, +27459, +27452, +27445, +27438, +27431, +27424, +27418, +27411, +27404, +27397, +27390, +27383, +27376, +27369, +27362, +27355, +27349, +27342, +27335, +27328, +27321, +27314, +27307, +27300, +27293, +27286, +27279, +27272, +27265, +27258, +27251, +27244, +27237, +27230, +27223, +27216, +27209, +27202, +27195, +27188, +27181, +27174, +27167, +27160, +27153, +27146, +27139, +27132, +27125, +27118, +27111, +27104, +27097, +27090, +27083, +27076, +27068, +27061, +27054, +27047, +27040, +27033, +27026, +27019, +27012, +27005, +26997, +26990, +26983, +26976, +26969, +26962, +26955, +26948, +26940, +26933, +26926, +26919, +26912, +26905, +26897, +26890, +26883, +26876, +26869, +26861, +26854, +26847, +26840, +26833, +26825, +26818, +26811, +26804, +26797, +26789, +26782, +26775, +26768, +26760, +26753, +26746, +26739, +26731, +26724, +26717, +26709, +26702, +26695, +26688, +26680, +26673, +26666, +26658, +26651, +26644, +26636, +26629, +26622, +26615, +26607, +26600, +26593, +26585, +26578, +26570, +26563, +26556, +26548, +26541, +26534, +26526, +26519, +26512, +26504, +26497, +26489, +26482, +26475, +26467, +26460, +26452, +26445, +26437, +26430, +26423, +26415, +26408, +26400, +26393, +26385, +26378, +26371, +26363, +26356, +26348, +26341, +26333, +26326, +26318, +26311, +26303, +26296, +26288, +26281, +26273, +26266, +26258, +26251, +26243, +26236, +26228, +26221, +26213, +26205, +26198, +26190, +26183, +26175, +26168, +26160, +26153, +26145, +26137, +26130, +26122, +26115, +26107, +26099, +26092, +26084, +26077, +26069, +26061, +26054, +26046, +26039, +26031, +26023, +26016, +26008, +26000, +25993, +25985, +25977, +25970, +25962, +25954, +25947, +25939, +25931, +25924, +25916, +25908, +25901, +25893, +25885, +25878, +25870, +25862, +25854, +25847, +25839, +25831, +25824, +25816, +25808, +25800, +25793, +25785, +25777, +25769, +25762, +25754, +25746, +25738, +25730, +25723, +25715, +25707, +25699, +25691, +25684, +25676, +25668, +25660, +25652, +25645, +25637, +25629, +25621, +25613, +25605, +25598, +25590, +25582, +25574, +25566, +25558, +25550, +25543, +25535, +25527, +25519, +25511, +25503, +25495, +25487, +25480, +25472, +25464, +25456, +25448, +25440, +25432, +25424, +25416, +25408, +25400, +25392, +25384, +25376, +25369, +25361, +25353, +25345, +25337, +25329, +25321, +25313, +25305, +25297, +25289, +25281, +25273, +25265, +25257, +25249, +25241, +25233, +25225, +25217, +25209, +25201, +25193, +25185, +25177, +25169, +25161, +25152, +25144, +25136, +25128, +25120, +25112, +25104, +25096, +25088, +25080, +25072, +25064, +25056, +25047, +25039, +25031, +25023, +25015, +25007, +24999, +24991, +24983, +24974, +24966, +24958, +24950, +24942, +24934, +24926, +24917, +24909, +24901, +24893, +24885, +24877, +24868, +24860, +24852, +24844, +24836, +24827, +24819, +24811, +24803, +24795, +24786, +24778, +24770, +24762, +24753, +24745, +24737, +24729, +24720, +24712, +24704, +24696, +24687, +24679, +24671, +24663, +24654, +24646, +24638, +24630, +24621, +24613, +24605, +24596, +24588, +24580, +24571, +24563, +24555, +24546, +24538, +24530, +24521, +24513, +24505, +24496, +24488, +24480, +24471, +24463, +24455, +24446, +24438, +24430, +24421, +24413, +24404, +24396, +24388, +24379, +24371, +24362, +24354, +24346, +24337, +24329, +24320, +24312, +24304, +24295, +24287, +24278, +24270, +24261, +24253, +24244, +24236, +24228, +24219, +24211, +24202, +24194, +24185, +24177, +24168, +24160, +24151, +24143, +24134, +24126, +24117, +24109, +24100, +24092, +24083, +24075, +24066, +24058, +24049, +24041, +24032, +24023, +24015, +24006, +23998, +23989, +23981, +23972, +23964, +23955, +23946, +23938, +23929, +23921, +23912, +23903, +23895, +23886, +23878, +23869, +23860, +23852, +23843, +23835, +23826, +23817, +23809, +23800, +23791, +23783, +23774, +23766, +23757, +23748, +23740, +23731, +23722, +23714, +23705, +23696, +23688, +23679, +23670, +23661, +23653, +23644, +23635, +23627, +23618, +23609, +23601, +23592, +23583, +23574, +23566, +23557, +23548, +23539, +23531, +23522, +23513, +23504, +23496, +23487, +23478, +23469, +23461, +23452, +23443, +23434, +23426, +23417, +23408, +23399, +23390, +23382, +23373, +23364, +23355, +23346, +23337, +23329, +23320, +23311, +23302, +23293, +23284, +23276, +23267, +23258, +23249, +23240, +23231, +23223, +23214, +23205, +23196, +23187, +23178, +23169, +23160, +23151, +23143, +23134, +23125, +23116, +23107, +23098, +23089, +23080, +23071, +23062, +23053, +23045, +23036, +23027, +23018, +23009, +23000, +22991, +22982, +22973, +22964, +22955, +22946, +22937, +22928, +22919, +22910, +22901, +22892, +22883, +22874, +22865, +22856, +22847, +22838, +22829, +22820, +22811, +22802, +22793, +22784, +22775, +22766, +22757, +22748, +22739, +22730, +22721, +22712, +22703, +22694, +22685, +22675, +22666, +22657, +22648, +22639, +22630, +22621, +22612, +22603, +22594, +22585, +22575, +22566, +22557, +22548, +22539, +22530, +22521, +22512, +22503, +22493, +22484, +22475, +22466, +22457, +22448, +22438, +22429, +22420, +22411, +22402, +22393, +22383, +22374, +22365, +22356, +22347, +22338, +22328, +22319, +22310, +22301, +22292, +22282, +22273, +22264, +22255, +22245, +22236, +22227, +22218, +22209, +22199, +22190, +22181, +22172, +22162, +22153, +22144, +22135, +22125, +22116, +22107, +22097, +22088, +22079, +22070, +22060, +22051, +22042, +22032, +22023, +22014, +22004, +21995, +21986, +21977, +21967, +21958, +21949, +21939, +21930, +21921, +21911, +21902, +21893, +21883, +21874, +21864, +21855, +21846, +21836, +21827, +21818, +21808, +21799, +21789, +21780, +21771, +21761, +21752, +21743, +21733, +21724, +21714, +21705, +21695, +21686, +21677, +21667, +21658, +21648, +21639, +21629, +21620, +21611, +21601, +21592, +21582, +21573, +21563, +21554, +21544, +21535, +21525, +21516, +21506, +21497, +21488, +21478, +21469, +21459, +21450, +21440, +21431, +21421, +21412, +21402, +21392, +21383, +21373, +21364, +21354, +21345, +21335, +21326, +21316, +21307, +21297, +21288, +21278, +21268, +21259, +21249, +21240, +21230, +21221, +21211, +21202, +21192, +21182, +21173, +21163, +21154, +21144, +21134, +21125, +21115, +21106, +21096, +21086, +21077, +21067, +21057, +21048, +21038, +21029, +21019, +21009, +21000, +20990, +20980, +20971, +20961, +20951, +20942, +20932, +20922, +20913, +20903, +20893, +20884, +20874, +20864, +20855, +20845, +20835, +20825, +20816, +20806, +20796, +20787, +20777, +20767, +20758, +20748, +20738, +20728, +20719, +20709, +20699, +20689, +20680, +20670, +20660, +20650, +20641, +20631, +20621, +20611, +20602, +20592, +20582, +20572, +20562, +20553, +20543, +20533, +20523, +20513, +20504, +20494, +20484, +20474, +20464, +20455, +20445, +20435, +20425, +20415, +20406, +20396, +20386, +20376, +20366, +20356, +20346, +20337, +20327, +20317, +20307, +20297, +20287, +20277, +20268, +20258, +20248, +20238, +20228, +20218, +20208, +20198, +20188, +20179, +20169, +20159, +20149, +20139, +20129, +20119, +20109, +20099, +20089, +20079, +20070, +20060, +20050, +20040, +20030, +20020, +20010, +20000, +19990, +19980, +19970, +19960, +19950, +19940, +19930, +19920, +19910, +19900, +19890, +19880, +19870, +19860, +19850, +19840, +19830, +19820, +19810, +19800, +19790, +19780, +19770, +19760, +19750, +19740, +19730, +19720, +19710, +19700, +19690, +19680, +19670, +19660, +19650, +19640, +19630, +19620, +19610, +19599, +19589, +19579, +19569, +19559, +19549, +19539, +19529, +19519, +19509, +19499, +19488, +19478, +19468, +19458, +19448, +19438, +19428, +19418, +19408, +19397, +19387, +19377, +19367, +19357, +19347, +19337, +19326, +19316, +19306, +19296, +19286, +19276, +19266, +19255, +19245, +19235, +19225, +19215, +19205, +19194, +19184, +19174, +19164, +19154, +19143, +19133, +19123, +19113, +19103, +19092, +19082, +19072, +19062, +19051, +19041, +19031, +19021, +19011, +19000, +18990, +18980, +18970, +18959, +18949, +18939, +18929, +18918, +18908, +18898, +18888, +18877, +18867, +18857, +18846, +18836, +18826, +18816, +18805, +18795, +18785, +18774, +18764, +18754, +18744, +18733, +18723, +18713, +18702, +18692, +18682, +18671, +18661, +18651, +18640, +18630, +18620, +18609, +18599, +18589, +18578, +18568, +18558, +18547, +18537, +18526, +18516, +18506, +18495, +18485, +18475, +18464, +18454, +18443, +18433, +18423, +18412, +18402, +18392, +18381, +18371, +18360, +18350, +18339, +18329, +18319, +18308, +18298, +18287, +18277, +18267, +18256, +18246, +18235, +18225, +18214, +18204, +18193, +18183, +18173, +18162, +18152, +18141, +18131, +18120, +18110, +18099, +18089, +18078, +18068, +18057, +18047, +18036, +18026, +18015, +18005, +17994, +17984, +17973, +17963, +17952, +17942, +17931, +17921, +17910, +17900, +17889, +17879, +17868, +17858, +17847, +17837, +17826, +17815, +17805, +17794, +17784, +17773, +17763, +17752, +17742, +17731, +17720, +17710, +17699, +17689, +17678, +17668, +17657, +17646, +17636, +17625, +17615, +17604, +17593, +17583, +17572, +17562, +17551, +17540, +17530, +17519, +17509, +17498, +17487, +17477, +17466, +17455, +17445, +17434, +17423, +17413, +17402, +17392, +17381, +17370, +17360, +17349, +17338, +17328, +17317, +17306, +17296, +17285, +17274, +17264, +17253, +17242, +17232, +17221, +17210, +17199, +17189, +17178, +17167, +17157, +17146, +17135, +17124, +17114, +17103, +17092, +17082, +17071, +17060, +17049, +17039, +17028, +17017, +17006, +16996, +16985, +16974, +16964, +16953, +16942, +16931, +16920, +16910, +16899, +16888, +16877, +16867, +16856, +16845, +16834, +16824, +16813, +16802, +16791, +16780, +16770, +16759, +16748, +16737, +16726, +16716, +16705, +16694, +16683, +16672, +16662, +16651, +16640, +16629, +16618, +16607, +16597, +16586, +16575, +16564, +16553, +16542, +16532, +16521, +16510, +16499, +16488, +16477, +16466, +16455, +16445, +16434, +16423, +16412, +16401, +16390, +16379, +16368, +16358, +16347, +16336, +16325, +16314, +16303, +16292, +16281, +16270, +16260, +16249, +16238, +16227, +16216, +16205, +16194, +16183, +16172, +16161, +16150, +16139, +16128, +16117, +16107, +16096, +16085, +16074, +16063, +16052, +16041, +16030, +16019, +16008, +15997, +15986, +15975, +15964, +15953, +15942, +15931, +15920, +15909, +15898, +15887, +15876, +15865, +15854, +15843, +15832, +15821, +15810, +15799, +15788, +15777, +15766, +15755, +15744, +15733, +15722, +15711, +15700, +15689, +15678, +15667, +15656, +15645, +15634, +15623, +15612, +15601, +15590, +15579, +15568, +15556, +15545, +15534, +15523, +15512, +15501, +15490, +15479, +15468, +15457, +15446, +15435, +15424, +15413, +15401, +15390, +15379, +15368, +15357, +15346, +15335, +15324, +15313, +15301, +15290, +15279, +15268, +15257, +15246, +15235, +15224, +15213, +15201, +15190, +15179, +15168, +15157, +15146, +15135, +15123, +15112, +15101, +15090, +15079, +15068, +15056, +15045, +15034, +15023, +15012, +15001, +14989, +14978, +14967, +14956, +14945, +14934, +14922, +14911, +14900, +14889, +14878, +14866, +14855, +14844, +14833, +14822, +14810, +14799, +14788, +14777, +14766, +14754, +14743, +14732, +14721, +14709, +14698, +14687, +14676, +14665, +14653, +14642, +14631, +14620, +14608, +14597, +14586, +14575, +14563, +14552, +14541, +14530, +14518, +14507, +14496, +14484, +14473, +14462, +14451, +14439, +14428, +14417, +14406, +14394, +14383, +14372, +14360, +14349, +14338, +14326, +14315, +14304, +14293, +14281, +14270, +14259, +14247, +14236, +14225, +14213, +14202, +14191, +14179, +14168, +14157, +14145, +14134, +14123, +14111, +14100, +14089, +14077, +14066, +14055, +14043, +14032, +14021, +14009, +13998, +13986, +13975, +13964, +13952, +13941, +13930, +13918, +13907, +13895, +13884, +13873, +13861, +13850, +13839, +13827, +13816, +13804, +13793, +13782, +13770, +13759, +13747, +13736, +13725, +13713, +13702, +13690, +13679, +13667, +13656, +13645, +13633, +13622, +13610, +13599, +13587, +13576, +13565, +13553, +13542, +13530, +13519, +13507, +13496, +13485, +13473, +13462, +13450, +13439, +13427, +13416, +13404, +13393, +13381, +13370, +13358, +13347, +13335, +13324, +13312, +13301, +13290, +13278, +13267, +13255, +13244, +13232, +13221, +13209, +13198, +13186, +13175, +13163, +13152, +13140, +13129, +13117, +13106, +13094, +13082, +13071, +13059, +13048, +13036, +13025, +13013, +13002, +12990, +12979, +12967, +12956, +12944, +12933, +12921, +12909, +12898, +12886, +12875, +12863, +12852, +12840, +12829, +12817, +12805, +12794, +12782, +12771, +12759, +12748, +12736, +12724, +12713, +12701, +12690, +12678, +12666, +12655, +12643, +12632, +12620, +12609, +12597, +12585, +12574, +12562, +12550, +12539, +12527, +12516, +12504, +12492, +12481, +12469, +12458, +12446, +12434, +12423, +12411, +12399, +12388, +12376, +12365, +12353, +12341, +12330, +12318, +12306, +12295, +12283, +12271, +12260, +12248, +12236, +12225, +12213, +12201, +12190, +12178, +12166, +12155, +12143, +12131, +12120, +12108, +12096, +12085, +12073, +12061, +12050, +12038, +12026, +12015, +12003, +11991, +11980, +11968, +11956, +11944, +11933, +11921, +11909, +11898, +11886, +11874, +11862, +11851, +11839, +11827, +11816, +11804, +11792, +11780, +11769, +11757, +11745, +11734, +11722, +11710, +11698, +11687, +11675, +11663, +11651, +11640, +11628, +11616, +11604, +11593, +11581, +11569, +11557, +11546, +11534, +11522, +11510, +11499, +11487, +11475, +11463, +11451, +11440, +11428, +11416, +11404, +11393, +11381, +11369, +11357, +11345, +11334, +11322, +11310, +11298, +11286, +11275, +11263, +11251, +11239, +11227, +11216, +11204, +11192, +11180, +11168, +11157, +11145, +11133, +11121, +11109, +11098, +11086, +11074, +11062, +11050, +11038, +11027, +11015, +11003, +10991, +10979, +10967, +10956, +10944, +10932, +10920, +10908, +10896, +10884, +10873, +10861, +10849, +10837, +10825, +10813, +10801, +10790, +10778, +10766, +10754, +10742, +10730, +10718, +10706, +10695, +10683, +10671, +10659, +10647, +10635, +10623, +10611, +10600, +10588, +10576, +10564, +10552, +10540, +10528, +10516, +10504, +10492, +10481, +10469, +10457, +10445, +10433, +10421, +10409, +10397, +10385, +10373, +10361, +10349, +10338, +10326, +10314, +10302, +10290, +10278, +10266, +10254, +10242, +10230, +10218, +10206, +10194, +10182, +10170, +10159, +10147, +10135, +10123, +10111, +10099, +10087, +10075, +10063, +10051, +10039, +10027, +10015, +10003, +9991, +9979, +9967, +9955, +9943, +9931, +9919, +9907, +9895, +9883, +9871, +9859, +9847, +9835, +9823, +9811, +9799, +9787, +9775, +9763, +9751, +9739, +9727, +9715, +9703, +9691, +9679, +9667, +9655, +9643, +9631, +9619, +9607, +9595, +9583, +9571, +9559, +9547, +9535, +9523, +9511, +9499, +9487, +9475, +9463, +9451, +9439, +9427, +9415, +9403, +9391, +9379, +9367, +9355, +9343, +9331, +9319, +9307, +9295, +9283, +9270, +9258, +9246, +9234, +9222, +9210, +9198, +9186, +9174, +9162, +9150, +9138, +9126, +9114, +9102, +9090, +9077, +9065, +9053, +9041, +9029, +9017, +9005, +8993, +8981, +8969, +8957, +8945, +8932, +8920, +8908, +8896, +8884, +8872, +8860, +8848, +8836, +8824, +8812, +8799, +8787, +8775, +8763, +8751, +8739, +8727, +8715, +8703, +8690, +8678, +8666, +8654, +8642, +8630, +8618, +8606, +8593, +8581, +8569, +8557, +8545, +8533, +8521, +8509, +8496, +8484, +8472, +8460, +8448, +8436, +8424, +8411, +8399, +8387, +8375, +8363, +8351, +8339, +8326, +8314, +8302, +8290, +8278, +8266, +8253, +8241, +8229, +8217, +8205, +8193, +8180, +8168, +8156, +8144, +8132, +8120, +8107, +8095, +8083, +8071, +8059, +8047, +8034, +8022, +8010, +7998, +7986, +7973, +7961, +7949, +7937, +7925, +7912, +7900, +7888, +7876, +7864, +7851, +7839, +7827, +7815, +7803, +7790, +7778, +7766, +7754, +7742, +7729, +7717, +7705, +7693, +7681, +7668, +7656, +7644, +7632, +7619, +7607, +7595, +7583, +7571, +7558, +7546, +7534, +7522, +7509, +7497, +7485, +7473, +7461, +7448, +7436, +7424, +7412, +7399, +7387, +7375, +7363, +7350, +7338, +7326, +7314, +7301, +7289, +7277, +7265, +7252, +7240, +7228, +7216, +7203, +7191, +7179, +7167, +7154, +7142, +7130, +7117, +7105, +7093, +7081, +7068, +7056, +7044, +7032, +7019, +7007, +6995, +6982, +6970, +6958, +6946, +6933, +6921, +6909, +6897, +6884, +6872, +6860, +6847, +6835, +6823, +6811, +6798, +6786, +6774, +6761, +6749, +6737, +6724, +6712, +6700, +6688, +6675, +6663, +6651, +6638, +6626, +6614, +6601, +6589, +6577, +6564, +6552, +6540, +6528, +6515, +6503, +6491, +6478, +6466, +6454, +6441, +6429, +6417, +6404, +6392, +6380, +6367, +6355, +6343, +6330, +6318, +6306, +6293, +6281, +6269, +6256, +6244, +6232, +6219, +6207, +6195, +6182, +6170, +6158, +6145, +6133, +6121, +6108, +6096, +6084, +6071, +6059, +6047, +6034, +6022, +6010, +5997, +5985, +5972, +5960, +5948, +5935, +5923, +5911, +5898, +5886, +5874, +5861, +5849, +5836, +5824, +5812, +5799, +5787, +5775, +5762, +5750, +5738, +5725, +5713, +5700, +5688, +5676, +5663, +5651, +5639, +5626, +5614, +5601, +5589, +5577, +5564, +5552, +5539, +5527, +5515, +5502, +5490, +5478, +5465, +5453, +5440, +5428, +5416, +5403, +5391, +5378, +5366, +5354, +5341, +5329, +5316, +5304, +5292, +5279, +5267, +5254, +5242, +5230, +5217, +5205, +5192, +5180, +5168, +5155, +5143, +5130, +5118, +5106, +5093, +5081, +5068, +5056, +5043, +5031, +5019, +5006, +4994, +4981, +4969, +4957, +4944, +4932, +4919, +4907, +4894, +4882, +4870, +4857, +4845, +4832, +4820, +4807, +4795, +4783, +4770, +4758, +4745, +4733, +4720, +4708, +4696, +4683, +4671, +4658, +4646, +4633, +4621, +4608, +4596, +4584, +4571, +4559, +4546, +4534, +4521, +4509, +4496, +4484, +4472, +4459, +4447, +4434, +4422, +4409, +4397, +4384, +4372, +4359, +4347, +4335, +4322, +4310, +4297, +4285, +4272, +4260, +4247, +4235, +4222, +4210, +4198, +4185, +4173, +4160, +4148, +4135, +4123, +4110, +4098, +4085, +4073, +4060, +4048, +4035, +4023, +4011, +3998, +3986, +3973, +3961, +3948, +3936, +3923, +3911, +3898, +3886, +3873, +3861, +3848, +3836, +3823, +3811, +3798, +3786, +3773, +3761, +3749, +3736, +3724, +3711, +3699, +3686, +3674, +3661, +3649, +3636, +3624, +3611, +3599, +3586, +3574, +3561, +3549, +3536, +3524, +3511, +3499, +3486, +3474, +3461, +3449, +3436, +3424, +3411, +3399, +3386, +3374, +3361, +3349, +3336, +3324, +3311, +3299, +3286, +3274, +3261, +3249, +3236, +3224, +3211, +3199, +3186, +3174, +3161, +3149, +3136, +3124, +3111, +3099, +3086, +3074, +3061, +3049, +3036, +3024, +3011, +2999, +2986, +2974, +2961, +2949, +2936, +2923, +2911, +2898, +2886, +2873, +2861, +2848, +2836, +2823, +2811, +2798, +2786, +2773, +2761, +2748, +2736, +2723, +2711, +2698, +2686, +2673, +2661, +2648, +2636, +2623, +2610, +2598, +2585, +2573, +2560, +2548, +2535, +2523, +2510, +2498, +2485, +2473, +2460, +2448, +2435, +2423, +2410, +2397, +2385, +2372, +2360, +2347, +2335, +2322, +2310, +2297, +2285, +2272, +2260, +2247, +2235, +2222, +2209, +2197, +2184, +2172, +2159, +2147, +2134, +2122, +2109, +2097, +2084, +2072, +2059, +2046, +2034, +2021, +2009, +1996, +1984, +1971, +1959, +1946, +1934, +1921, +1908, +1896, +1883, +1871, +1858, +1846, +1833, +1821, +1808, +1796, +1783, +1770, +1758, +1745, +1733, +1720, +1708, +1695, +1683, +1670, +1658, +1645, +1632, +1620, +1607, +1595, +1582, +1570, +1557, +1545, +1532, +1519, +1507, +1494, +1482, +1469, +1457, +1444, +1432, +1419, +1406, +1394, +1381, +1369, +1356, +1344, +1331, +1319, +1306, +1293, +1281, +1268, +1256, +1243, +1231, +1218, +1206, +1193, +1180, +1168, +1155, +1143, +1130, +1118, +1105, +1093, +1080, +1067, +1055, +1042, +1030, +1017, +1005, +992, +980, +967, +954, +942, +929, +917, +904, +892, +879, +866, +854, +841, +829, +816, +804, +791, +779, +766, +753, +741, +728, +716, +703, +691, +678, +665, +653, +640, +628, +615, +603, +590, +578, +565, +552, +540, +527, +515, +502, +490, +477, +464, +452, +439, +427, +414, +402, +389, +376, +364, +351, +339, +326, +314, +301, +289, +276, +263, +251, +238, +226, +213, +201, +188, +175, +163, +150, +138, +125, +113, +100, +87, +75, +62, +50, +37, +25, +12, +0, +-12, +-25, +-37, +-50, +-62, +-75, +-87, +-100, +-113, +-125, +-138, +-150, +-163, +-175, +-188, +-201, +-213, +-226, +-238, +-251, +-263, +-276, +-289, +-301, +-314, +-326, +-339, +-351, +-364, +-376, +-389, +-402, +-414, +-427, +-439, +-452, +-464, +-477, +-490, +-502, +-515, +-527, +-540, +-552, +-565, +-578, +-590, +-603, +-615, +-628, +-640, +-653, +-665, +-678, +-691, +-703, +-716, +-728, +-741, +-753, +-766, +-779, +-791, +-804, +-816, +-829, +-841, +-854, +-866, +-879, +-892, +-904, +-917, +-929, +-942, +-954, +-967, +-980, +-992, +-1005, +-1017, +-1030, +-1042, +-1055, +-1067, +-1080, +-1093, +-1105, +-1118, +-1130, +-1143, +-1155, +-1168, +-1180, +-1193, +-1206, +-1218, +-1231, +-1243, +-1256, +-1268, +-1281, +-1293, +-1306, +-1319, +-1331, +-1344, +-1356, +-1369, +-1381, +-1394, +-1406, +-1419, +-1432, +-1444, +-1457, +-1469, +-1482, +-1494, +-1507, +-1519, +-1532, +-1545, +-1557, +-1570, +-1582, +-1595, +-1607, +-1620, +-1632, +-1645, +-1658, +-1670, +-1683, +-1695, +-1708, +-1720, +-1733, +-1745, +-1758, +-1770, +-1783, +-1796, +-1808, +-1821, +-1833, +-1846, +-1858, +-1871, +-1883, +-1896, +-1908, +-1921, +-1934, +-1946, +-1959, +-1971, +-1984, +-1996, +-2009, +-2021, +-2034, +-2046, +-2059, +-2072, +-2084, +-2097, +-2109, +-2122, +-2134, +-2147, +-2159, +-2172, +-2184, +-2197, +-2209, +-2222, +-2235, +-2247, +-2260, +-2272, +-2285, +-2297, +-2310, +-2322, +-2335, +-2347, +-2360, +-2372, +-2385, +-2397, +-2410, +-2423, +-2435, +-2448, +-2460, +-2473, +-2485, +-2498, +-2510, +-2523, +-2535, +-2548, +-2560, +-2573, +-2585, +-2598, +-2610, +-2623, +-2636, +-2648, +-2661, +-2673, +-2686, +-2698, +-2711, +-2723, +-2736, +-2748, +-2761, +-2773, +-2786, +-2798, +-2811, +-2823, +-2836, +-2848, +-2861, +-2873, +-2886, +-2898, +-2911, +-2923, +-2936, +-2949, +-2961, +-2974, +-2986, +-2999, +-3011, +-3024, +-3036, +-3049, +-3061, +-3074, +-3086, +-3099, +-3111, +-3124, +-3136, +-3149, +-3161, +-3174, +-3186, +-3199, +-3211, +-3224, +-3236, +-3249, +-3261, +-3274, +-3286, +-3299, +-3311, +-3324, +-3336, +-3349, +-3361, +-3374, +-3386, +-3399, +-3411, +-3424, +-3436, +-3449, +-3461, +-3474, +-3486, +-3499, +-3511, +-3524, +-3536, +-3549, +-3561, +-3574, +-3586, +-3599, +-3611, +-3624, +-3636, +-3649, +-3661, +-3674, +-3686, +-3699, +-3711, +-3724, +-3736, +-3749, +-3761, +-3773, +-3786, +-3798, +-3811, +-3823, +-3836, +-3848, +-3861, +-3873, +-3886, +-3898, +-3911, +-3923, +-3936, +-3948, +-3961, +-3973, +-3986, +-3998, +-4011, +-4023, +-4035, +-4048, +-4060, +-4073, +-4085, +-4098, +-4110, +-4123, +-4135, +-4148, +-4160, +-4173, +-4185, +-4198, +-4210, +-4222, +-4235, +-4247, +-4260, +-4272, +-4285, +-4297, +-4310, +-4322, +-4335, +-4347, +-4359, +-4372, +-4384, +-4397, +-4409, +-4422, +-4434, +-4447, +-4459, +-4472, +-4484, +-4496, +-4509, +-4521, +-4534, +-4546, +-4559, +-4571, +-4584, +-4596, +-4608, +-4621, +-4633, +-4646, +-4658, +-4671, +-4683, +-4696, +-4708, +-4720, +-4733, +-4745, +-4758, +-4770, +-4783, +-4795, +-4807, +-4820, +-4832, +-4845, +-4857, +-4870, +-4882, +-4894, +-4907, +-4919, +-4932, +-4944, +-4957, +-4969, +-4981, +-4994, +-5006, +-5019, +-5031, +-5043, +-5056, +-5068, +-5081, +-5093, +-5106, +-5118, +-5130, +-5143, +-5155, +-5168, +-5180, +-5192, +-5205, +-5217, +-5230, +-5242, +-5254, +-5267, +-5279, +-5292, +-5304, +-5316, +-5329, +-5341, +-5354, +-5366, +-5378, +-5391, +-5403, +-5416, +-5428, +-5440, +-5453, +-5465, +-5478, +-5490, +-5502, +-5515, +-5527, +-5539, +-5552, +-5564, +-5577, +-5589, +-5601, +-5614, +-5626, +-5639, +-5651, +-5663, +-5676, +-5688, +-5700, +-5713, +-5725, +-5738, +-5750, +-5762, +-5775, +-5787, +-5799, +-5812, +-5824, +-5836, +-5849, +-5861, +-5874, +-5886, +-5898, +-5911, +-5923, +-5935, +-5948, +-5960, +-5972, +-5985, +-5997, +-6010, +-6022, +-6034, +-6047, +-6059, +-6071, +-6084, +-6096, +-6108, +-6121, +-6133, +-6145, +-6158, +-6170, +-6182, +-6195, +-6207, +-6219, +-6232, +-6244, +-6256, +-6269, +-6281, +-6293, +-6306, +-6318, +-6330, +-6343, +-6355, +-6367, +-6380, +-6392, +-6404, +-6417, +-6429, +-6441, +-6454, +-6466, +-6478, +-6491, +-6503, +-6515, +-6528, +-6540, +-6552, +-6564, +-6577, +-6589, +-6601, +-6614, +-6626, +-6638, +-6651, +-6663, +-6675, +-6688, +-6700, +-6712, +-6724, +-6737, +-6749, +-6761, +-6774, +-6786, +-6798, +-6811, +-6823, +-6835, +-6847, +-6860, +-6872, +-6884, +-6897, +-6909, +-6921, +-6933, +-6946, +-6958, +-6970, +-6982, +-6995, +-7007, +-7019, +-7032, +-7044, +-7056, +-7068, +-7081, +-7093, +-7105, +-7117, +-7130, +-7142, +-7154, +-7167, +-7179, +-7191, +-7203, +-7216, +-7228, +-7240, +-7252, +-7265, +-7277, +-7289, +-7301, +-7314, +-7326, +-7338, +-7350, +-7363, +-7375, +-7387, +-7399, +-7412, +-7424, +-7436, +-7448, +-7461, +-7473, +-7485, +-7497, +-7509, +-7522, +-7534, +-7546, +-7558, +-7571, +-7583, +-7595, +-7607, +-7619, +-7632, +-7644, +-7656, +-7668, +-7681, +-7693, +-7705, +-7717, +-7729, +-7742, +-7754, +-7766, +-7778, +-7790, +-7803, +-7815, +-7827, +-7839, +-7851, +-7864, +-7876, +-7888, +-7900, +-7912, +-7925, +-7937, +-7949, +-7961, +-7973, +-7986, +-7998, +-8010, +-8022, +-8034, +-8047, +-8059, +-8071, +-8083, +-8095, +-8107, +-8120, +-8132, +-8144, +-8156, +-8168, +-8180, +-8193, +-8205, +-8217, +-8229, +-8241, +-8253, +-8266, +-8278, +-8290, +-8302, +-8314, +-8326, +-8339, +-8351, +-8363, +-8375, +-8387, +-8399, +-8411, +-8424, +-8436, +-8448, +-8460, +-8472, +-8484, +-8496, +-8509, +-8521, +-8533, +-8545, +-8557, +-8569, +-8581, +-8593, +-8606, +-8618, +-8630, +-8642, +-8654, +-8666, +-8678, +-8690, +-8703, +-8715, +-8727, +-8739, +-8751, +-8763, +-8775, +-8787, +-8799, +-8812, +-8824, +-8836, +-8848, +-8860, +-8872, +-8884, +-8896, +-8908, +-8920, +-8932, +-8945, +-8957, +-8969, +-8981, +-8993, +-9005, +-9017, +-9029, +-9041, +-9053, +-9065, +-9077, +-9090, +-9102, +-9114, +-9126, +-9138, +-9150, +-9162, +-9174, +-9186, +-9198, +-9210, +-9222, +-9234, +-9246, +-9258, +-9270, +-9283, +-9295, +-9307, +-9319, +-9331, +-9343, +-9355, +-9367, +-9379, +-9391, +-9403, +-9415, +-9427, +-9439, +-9451, +-9463, +-9475, +-9487, +-9499, +-9511, +-9523, +-9535, +-9547, +-9559, +-9571, +-9583, +-9595, +-9607, +-9619, +-9631, +-9643, +-9655, +-9667, +-9679, +-9691, +-9703, +-9715, +-9727, +-9739, +-9751, +-9763, +-9775, +-9787, +-9799, +-9811, +-9823, +-9835, +-9847, +-9859, +-9871, +-9883, +-9895, +-9907, +-9919, +-9931, +-9943, +-9955, +-9967, +-9979, +-9991, +-10003, +-10015, +-10027, +-10039, +-10051, +-10063, +-10075, +-10087, +-10099, +-10111, +-10123, +-10135, +-10147, +-10159, +-10170, +-10182, +-10194, +-10206, +-10218, +-10230, +-10242, +-10254, +-10266, +-10278, +-10290, +-10302, +-10314, +-10326, +-10338, +-10349, +-10361, +-10373, +-10385, +-10397, +-10409, +-10421, +-10433, +-10445, +-10457, +-10469, +-10481, +-10492, +-10504, +-10516, +-10528, +-10540, +-10552, +-10564, +-10576, +-10588, +-10600, +-10611, +-10623, +-10635, +-10647, +-10659, +-10671, +-10683, +-10695, +-10706, +-10718, +-10730, +-10742, +-10754, +-10766, +-10778, +-10790, +-10801, +-10813, +-10825, +-10837, +-10849, +-10861, +-10873, +-10884, +-10896, +-10908, +-10920, +-10932, +-10944, +-10956, +-10967, +-10979, +-10991, +-11003, +-11015, +-11027, +-11038, +-11050, +-11062, +-11074, +-11086, +-11098, +-11109, +-11121, +-11133, +-11145, +-11157, +-11168, +-11180, +-11192, +-11204, +-11216, +-11227, +-11239, +-11251, +-11263, +-11275, +-11286, +-11298, +-11310, +-11322, +-11334, +-11345, +-11357, +-11369, +-11381, +-11393, +-11404, +-11416, +-11428, +-11440, +-11451, +-11463, +-11475, +-11487, +-11499, +-11510, +-11522, +-11534, +-11546, +-11557, +-11569, +-11581, +-11593, +-11604, +-11616, +-11628, +-11640, +-11651, +-11663, +-11675, +-11687, +-11698, +-11710, +-11722, +-11734, +-11745, +-11757, +-11769, +-11780, +-11792, +-11804, +-11816, +-11827, +-11839, +-11851, +-11862, +-11874, +-11886, +-11898, +-11909, +-11921, +-11933, +-11944, +-11956, +-11968, +-11980, +-11991, +-12003, +-12015, +-12026, +-12038, +-12050, +-12061, +-12073, +-12085, +-12096, +-12108, +-12120, +-12131, +-12143, +-12155, +-12166, +-12178, +-12190, +-12201, +-12213, +-12225, +-12236, +-12248, +-12260, +-12271, +-12283, +-12295, +-12306, +-12318, +-12330, +-12341, +-12353, +-12365, +-12376, +-12388, +-12399, +-12411, +-12423, +-12434, +-12446, +-12458, +-12469, +-12481, +-12492, +-12504, +-12516, +-12527, +-12539, +-12550, +-12562, +-12574, +-12585, +-12597, +-12609, +-12620, +-12632, +-12643, +-12655, +-12666, +-12678, +-12690, +-12701, +-12713, +-12724, +-12736, +-12748, +-12759, +-12771, +-12782, +-12794, +-12805, +-12817, +-12829, +-12840, +-12852, +-12863, +-12875, +-12886, +-12898, +-12909, +-12921, +-12933, +-12944, +-12956, +-12967, +-12979, +-12990, +-13002, +-13013, +-13025, +-13036, +-13048, +-13059, +-13071, +-13082, +-13094, +-13106, +-13117, +-13129, +-13140, +-13152, +-13163, +-13175, +-13186, +-13198, +-13209, +-13221, +-13232, +-13244, +-13255, +-13267, +-13278, +-13290, +-13301, +-13312, +-13324, +-13335, +-13347, +-13358, +-13370, +-13381, +-13393, +-13404, +-13416, +-13427, +-13439, +-13450, +-13462, +-13473, +-13485, +-13496, +-13507, +-13519, +-13530, +-13542, +-13553, +-13565, +-13576, +-13587, +-13599, +-13610, +-13622, +-13633, +-13645, +-13656, +-13667, +-13679, +-13690, +-13702, +-13713, +-13725, +-13736, +-13747, +-13759, +-13770, +-13782, +-13793, +-13804, +-13816, +-13827, +-13839, +-13850, +-13861, +-13873, +-13884, +-13895, +-13907, +-13918, +-13930, +-13941, +-13952, +-13964, +-13975, +-13986, +-13998, +-14009, +-14021, +-14032, +-14043, +-14055, +-14066, +-14077, +-14089, +-14100, +-14111, +-14123, +-14134, +-14145, +-14157, +-14168, +-14179, +-14191, +-14202, +-14213, +-14225, +-14236, +-14247, +-14259, +-14270, +-14281, +-14293, +-14304, +-14315, +-14326, +-14338, +-14349, +-14360, +-14372, +-14383, +-14394, +-14406, +-14417, +-14428, +-14439, +-14451, +-14462, +-14473, +-14484, +-14496, +-14507, +-14518, +-14530, +-14541, +-14552, +-14563, +-14575, +-14586, +-14597, +-14608, +-14620, +-14631, +-14642, +-14653, +-14665, +-14676, +-14687, +-14698, +-14709, +-14721, +-14732, +-14743, +-14754, +-14766, +-14777, +-14788, +-14799, +-14810, +-14822, +-14833, +-14844, +-14855, +-14866, +-14878, +-14889, +-14900, +-14911, +-14922, +-14934, +-14945, +-14956, +-14967, +-14978, +-14989, +-15001, +-15012, +-15023, +-15034, +-15045, +-15056, +-15068, +-15079, +-15090, +-15101, +-15112, +-15123, +-15135, +-15146, +-15157, +-15168, +-15179, +-15190, +-15201, +-15213, +-15224, +-15235, +-15246, +-15257, +-15268, +-15279, +-15290, +-15301, +-15313, +-15324, +-15335, +-15346, +-15357, +-15368, +-15379, +-15390, +-15401, +-15413, +-15424, +-15435, +-15446, +-15457, +-15468, +-15479, +-15490, +-15501, +-15512, +-15523, +-15534, +-15545, +-15556, +-15568, +-15579, +-15590, +-15601, +-15612, +-15623, +-15634, +-15645, +-15656, +-15667, +-15678, +-15689, +-15700, +-15711, +-15722, +-15733, +-15744, +-15755, +-15766, +-15777, +-15788, +-15799, +-15810, +-15821, +-15832, +-15843, +-15854, +-15865, +-15876, +-15887, +-15898, +-15909, +-15920, +-15931, +-15942, +-15953, +-15964, +-15975, +-15986, +-15997, +-16008, +-16019, +-16030, +-16041, +-16052, +-16063, +-16074, +-16085, +-16096, +-16107, +-16117, +-16128, +-16139, +-16150, +-16161, +-16172, +-16183, +-16194, +-16205, +-16216, +-16227, +-16238, +-16249, +-16260, +-16270, +-16281, +-16292, +-16303, +-16314, +-16325, +-16336, +-16347, +-16358, +-16368, +-16379, +-16390, +-16401, +-16412, +-16423, +-16434, +-16445, +-16455, +-16466, +-16477, +-16488, +-16499, +-16510, +-16521, +-16532, +-16542, +-16553, +-16564, +-16575, +-16586, +-16597, +-16607, +-16618, +-16629, +-16640, +-16651, +-16662, +-16672, +-16683, +-16694, +-16705, +-16716, +-16726, +-16737, +-16748, +-16759, +-16770, +-16780, +-16791, +-16802, +-16813, +-16824, +-16834, +-16845, +-16856, +-16867, +-16877, +-16888, +-16899, +-16910, +-16920, +-16931, +-16942, +-16953, +-16964, +-16974, +-16985, +-16996, +-17006, +-17017, +-17028, +-17039, +-17049, +-17060, +-17071, +-17082, +-17092, +-17103, +-17114, +-17124, +-17135, +-17146, +-17157, +-17167, +-17178, +-17189, +-17199, +-17210, +-17221, +-17232, +-17242, +-17253, +-17264, +-17274, +-17285, +-17296, +-17306, +-17317, +-17328, +-17338, +-17349, +-17360, +-17370, +-17381, +-17392, +-17402, +-17413, +-17423, +-17434, +-17445, +-17455, +-17466, +-17477, +-17487, +-17498, +-17509, +-17519, +-17530, +-17540, +-17551, +-17562, +-17572, +-17583, +-17593, +-17604, +-17615, +-17625, +-17636, +-17646, +-17657, +-17668, +-17678, +-17689, +-17699, +-17710, +-17720, +-17731, +-17742, +-17752, +-17763, +-17773, +-17784, +-17794, +-17805, +-17815, +-17826, +-17837, +-17847, +-17858, +-17868, +-17879, +-17889, +-17900, +-17910, +-17921, +-17931, +-17942, +-17952, +-17963, +-17973, +-17984, +-17994, +-18005, +-18015, +-18026, +-18036, +-18047, +-18057, +-18068, +-18078, +-18089, +-18099, +-18110, +-18120, +-18131, +-18141, +-18152, +-18162, +-18173, +-18183, +-18193, +-18204, +-18214, +-18225, +-18235, +-18246, +-18256, +-18267, +-18277, +-18287, +-18298, +-18308, +-18319, +-18329, +-18339, +-18350, +-18360, +-18371, +-18381, +-18392, +-18402, +-18412, +-18423, +-18433, +-18443, +-18454, +-18464, +-18475, +-18485, +-18495, +-18506, +-18516, +-18526, +-18537, +-18547, +-18558, +-18568, +-18578, +-18589, +-18599, +-18609, +-18620, +-18630, +-18640, +-18651, +-18661, +-18671, +-18682, +-18692, +-18702, +-18713, +-18723, +-18733, +-18744, +-18754, +-18764, +-18774, +-18785, +-18795, +-18805, +-18816, +-18826, +-18836, +-18846, +-18857, +-18867, +-18877, +-18888, +-18898, +-18908, +-18918, +-18929, +-18939, +-18949, +-18959, +-18970, +-18980, +-18990, +-19000, +-19011, +-19021, +-19031, +-19041, +-19051, +-19062, +-19072, +-19082, +-19092, +-19103, +-19113, +-19123, +-19133, +-19143, +-19154, +-19164, +-19174, +-19184, +-19194, +-19205, +-19215, +-19225, +-19235, +-19245, +-19255, +-19266, +-19276, +-19286, +-19296, +-19306, +-19316, +-19326, +-19337, +-19347, +-19357, +-19367, +-19377, +-19387, +-19397, +-19408, +-19418, +-19428, +-19438, +-19448, +-19458, +-19468, +-19478, +-19488, +-19499, +-19509, +-19519, +-19529, +-19539, +-19549, +-19559, +-19569, +-19579, +-19589, +-19599, +-19610, +-19620, +-19630, +-19640, +-19650, +-19660, +-19670, +-19680, +-19690, +-19700, +-19710, +-19720, +-19730, +-19740, +-19750, +-19760, +-19770, +-19780, +-19790, +-19800, +-19810, +-19820, +-19830, +-19840, +-19850, +-19860, +-19870, +-19880, +-19890, +-19900, +-19910, +-19920, +-19930, +-19940, +-19950, +-19960, +-19970, +-19980, +-19990, +-20000, +-20010, +-20020, +-20030, +-20040, +-20050, +-20060, +-20070, +-20079, +-20089, +-20099, +-20109, +-20119, +-20129, +-20139, +-20149, +-20159, +-20169, +-20179, +-20188, +-20198, +-20208, +-20218, +-20228, +-20238, +-20248, +-20258, +-20268, +-20277, +-20287, +-20297, +-20307, +-20317, +-20327, +-20337, +-20346, +-20356, +-20366, +-20376, +-20386, +-20396, +-20406, +-20415, +-20425, +-20435, +-20445, +-20455, +-20464, +-20474, +-20484, +-20494, +-20504, +-20513, +-20523, +-20533, +-20543, +-20553, +-20562, +-20572, +-20582, +-20592, +-20602, +-20611, +-20621, +-20631, +-20641, +-20650, +-20660, +-20670, +-20680, +-20689, +-20699, +-20709, +-20719, +-20728, +-20738, +-20748, +-20758, +-20767, +-20777, +-20787, +-20796, +-20806, +-20816, +-20825, +-20835, +-20845, +-20855, +-20864, +-20874, +-20884, +-20893, +-20903, +-20913, +-20922, +-20932, +-20942, +-20951, +-20961, +-20971, +-20980, +-20990, +-21000, +-21009, +-21019, +-21029, +-21038, +-21048, +-21057, +-21067, +-21077, +-21086, +-21096, +-21106, +-21115, +-21125, +-21134, +-21144, +-21154, +-21163, +-21173, +-21182, +-21192, +-21202, +-21211, +-21221, +-21230, +-21240, +-21249, +-21259, +-21268, +-21278, +-21288, +-21297, +-21307, +-21316, +-21326, +-21335, +-21345, +-21354, +-21364, +-21373, +-21383, +-21392, +-21402, +-21412, +-21421, +-21431, +-21440, +-21450, +-21459, +-21469, +-21478, +-21488, +-21497, +-21506, +-21516, +-21525, +-21535, +-21544, +-21554, +-21563, +-21573, +-21582, +-21592, +-21601, +-21611, +-21620, +-21629, +-21639, +-21648, +-21658, +-21667, +-21677, +-21686, +-21695, +-21705, +-21714, +-21724, +-21733, +-21743, +-21752, +-21761, +-21771, +-21780, +-21789, +-21799, +-21808, +-21818, +-21827, +-21836, +-21846, +-21855, +-21864, +-21874, +-21883, +-21893, +-21902, +-21911, +-21921, +-21930, +-21939, +-21949, +-21958, +-21967, +-21977, +-21986, +-21995, +-22004, +-22014, +-22023, +-22032, +-22042, +-22051, +-22060, +-22070, +-22079, +-22088, +-22097, +-22107, +-22116, +-22125, +-22135, +-22144, +-22153, +-22162, +-22172, +-22181, +-22190, +-22199, +-22209, +-22218, +-22227, +-22236, +-22245, +-22255, +-22264, +-22273, +-22282, +-22292, +-22301, +-22310, +-22319, +-22328, +-22338, +-22347, +-22356, +-22365, +-22374, +-22383, +-22393, +-22402, +-22411, +-22420, +-22429, +-22438, +-22448, +-22457, +-22466, +-22475, +-22484, +-22493, +-22503, +-22512, +-22521, +-22530, +-22539, +-22548, +-22557, +-22566, +-22575, +-22585, +-22594, +-22603, +-22612, +-22621, +-22630, +-22639, +-22648, +-22657, +-22666, +-22675, +-22685, +-22694, +-22703, +-22712, +-22721, +-22730, +-22739, +-22748, +-22757, +-22766, +-22775, +-22784, +-22793, +-22802, +-22811, +-22820, +-22829, +-22838, +-22847, +-22856, +-22865, +-22874, +-22883, +-22892, +-22901, +-22910, +-22919, +-22928, +-22937, +-22946, +-22955, +-22964, +-22973, +-22982, +-22991, +-23000, +-23009, +-23018, +-23027, +-23036, +-23045, +-23053, +-23062, +-23071, +-23080, +-23089, +-23098, +-23107, +-23116, +-23125, +-23134, +-23143, +-23151, +-23160, +-23169, +-23178, +-23187, +-23196, +-23205, +-23214, +-23223, +-23231, +-23240, +-23249, +-23258, +-23267, +-23276, +-23284, +-23293, +-23302, +-23311, +-23320, +-23329, +-23337, +-23346, +-23355, +-23364, +-23373, +-23382, +-23390, +-23399, +-23408, +-23417, +-23426, +-23434, +-23443, +-23452, +-23461, +-23469, +-23478, +-23487, +-23496, +-23504, +-23513, +-23522, +-23531, +-23539, +-23548, +-23557, +-23566, +-23574, +-23583, +-23592, +-23601, +-23609, +-23618, +-23627, +-23635, +-23644, +-23653, +-23661, +-23670, +-23679, +-23688, +-23696, +-23705, +-23714, +-23722, +-23731, +-23740, +-23748, +-23757, +-23766, +-23774, +-23783, +-23791, +-23800, +-23809, +-23817, +-23826, +-23835, +-23843, +-23852, +-23860, +-23869, +-23878, +-23886, +-23895, +-23903, +-23912, +-23921, +-23929, +-23938, +-23946, +-23955, +-23964, +-23972, +-23981, +-23989, +-23998, +-24006, +-24015, +-24023, +-24032, +-24041, +-24049, +-24058, +-24066, +-24075, +-24083, +-24092, +-24100, +-24109, +-24117, +-24126, +-24134, +-24143, +-24151, +-24160, +-24168, +-24177, +-24185, +-24194, +-24202, +-24211, +-24219, +-24228, +-24236, +-24244, +-24253, +-24261, +-24270, +-24278, +-24287, +-24295, +-24304, +-24312, +-24320, +-24329, +-24337, +-24346, +-24354, +-24362, +-24371, +-24379, +-24388, +-24396, +-24404, +-24413, +-24421, +-24430, +-24438, +-24446, +-24455, +-24463, +-24471, +-24480, +-24488, +-24496, +-24505, +-24513, +-24521, +-24530, +-24538, +-24546, +-24555, +-24563, +-24571, +-24580, +-24588, +-24596, +-24605, +-24613, +-24621, +-24630, +-24638, +-24646, +-24654, +-24663, +-24671, +-24679, +-24687, +-24696, +-24704, +-24712, +-24720, +-24729, +-24737, +-24745, +-24753, +-24762, +-24770, +-24778, +-24786, +-24795, +-24803, +-24811, +-24819, +-24827, +-24836, +-24844, +-24852, +-24860, +-24868, +-24877, +-24885, +-24893, +-24901, +-24909, +-24917, +-24926, +-24934, +-24942, +-24950, +-24958, +-24966, +-24974, +-24983, +-24991, +-24999, +-25007, +-25015, +-25023, +-25031, +-25039, +-25047, +-25056, +-25064, +-25072, +-25080, +-25088, +-25096, +-25104, +-25112, +-25120, +-25128, +-25136, +-25144, +-25152, +-25161, +-25169, +-25177, +-25185, +-25193, +-25201, +-25209, +-25217, +-25225, +-25233, +-25241, +-25249, +-25257, +-25265, +-25273, +-25281, +-25289, +-25297, +-25305, +-25313, +-25321, +-25329, +-25337, +-25345, +-25353, +-25361, +-25369, +-25376, +-25384, +-25392, +-25400, +-25408, +-25416, +-25424, +-25432, +-25440, +-25448, +-25456, +-25464, +-25472, +-25480, +-25487, +-25495, +-25503, +-25511, +-25519, +-25527, +-25535, +-25543, +-25550, +-25558, +-25566, +-25574, +-25582, +-25590, +-25598, +-25605, +-25613, +-25621, +-25629, +-25637, +-25645, +-25652, +-25660, +-25668, +-25676, +-25684, +-25691, +-25699, +-25707, +-25715, +-25723, +-25730, +-25738, +-25746, +-25754, +-25762, +-25769, +-25777, +-25785, +-25793, +-25800, +-25808, +-25816, +-25824, +-25831, +-25839, +-25847, +-25854, +-25862, +-25870, +-25878, +-25885, +-25893, +-25901, +-25908, +-25916, +-25924, +-25931, +-25939, +-25947, +-25954, +-25962, +-25970, +-25977, +-25985, +-25993, +-26000, +-26008, +-26016, +-26023, +-26031, +-26039, +-26046, +-26054, +-26061, +-26069, +-26077, +-26084, +-26092, +-26099, +-26107, +-26115, +-26122, +-26130, +-26137, +-26145, +-26153, +-26160, +-26168, +-26175, +-26183, +-26190, +-26198, +-26205, +-26213, +-26221, +-26228, +-26236, +-26243, +-26251, +-26258, +-26266, +-26273, +-26281, +-26288, +-26296, +-26303, +-26311, +-26318, +-26326, +-26333, +-26341, +-26348, +-26356, +-26363, +-26371, +-26378, +-26385, +-26393, +-26400, +-26408, +-26415, +-26423, +-26430, +-26437, +-26445, +-26452, +-26460, +-26467, +-26475, +-26482, +-26489, +-26497, +-26504, +-26512, +-26519, +-26526, +-26534, +-26541, +-26548, +-26556, +-26563, +-26570, +-26578, +-26585, +-26593, +-26600, +-26607, +-26615, +-26622, +-26629, +-26636, +-26644, +-26651, +-26658, +-26666, +-26673, +-26680, +-26688, +-26695, +-26702, +-26709, +-26717, +-26724, +-26731, +-26739, +-26746, +-26753, +-26760, +-26768, +-26775, +-26782, +-26789, +-26797, +-26804, +-26811, +-26818, +-26825, +-26833, +-26840, +-26847, +-26854, +-26861, +-26869, +-26876, +-26883, +-26890, +-26897, +-26905, +-26912, +-26919, +-26926, +-26933, +-26940, +-26948, +-26955, +-26962, +-26969, +-26976, +-26983, +-26990, +-26997, +-27005, +-27012, +-27019, +-27026, +-27033, +-27040, +-27047, +-27054, +-27061, +-27068, +-27076, +-27083, +-27090, +-27097, +-27104, +-27111, +-27118, +-27125, +-27132, +-27139, +-27146, +-27153, +-27160, +-27167, +-27174, +-27181, +-27188, +-27195, +-27202, +-27209, +-27216, +-27223, +-27230, +-27237, +-27244, +-27251, +-27258, +-27265, +-27272, +-27279, +-27286, +-27293, +-27300, +-27307, +-27314, +-27321, +-27328, +-27335, +-27342, +-27349, +-27355, +-27362, +-27369, +-27376, +-27383, +-27390, +-27397, +-27404, +-27411, +-27418, +-27424, +-27431, +-27438, +-27445, +-27452, +-27459, +-27466, +-27472, +-27479, +-27486, +-27493, +-27500, +-27507, +-27513, +-27520, +-27527, +-27534, +-27541, +-27548, +-27554, +-27561, +-27568, +-27575, +-27582, +-27588, +-27595, +-27602, +-27609, +-27615, +-27622, +-27629, +-27636, +-27642, +-27649, +-27656, +-27663, +-27669, +-27676, +-27683, +-27690, +-27696, +-27703, +-27710, +-27716, +-27723, +-27730, +-27736, +-27743, +-27750, +-27757, +-27763, +-27770, +-27777, +-27783, +-27790, +-27797, +-27803, +-27810, +-27816, +-27823, +-27830, +-27836, +-27843, +-27850, +-27856, +-27863, +-27869, +-27876, +-27883, +-27889, +-27896, +-27902, +-27909, +-27916, +-27922, +-27929, +-27935, +-27942, +-27948, +-27955, +-27962, +-27968, +-27975, +-27981, +-27988, +-27994, +-28001, +-28007, +-28014, +-28020, +-28027, +-28033, +-28040, +-28046, +-28053, +-28059, +-28066, +-28072, +-28079, +-28085, +-28092, +-28098, +-28105, +-28111, +-28118, +-28124, +-28131, +-28137, +-28143, +-28150, +-28156, +-28163, +-28169, +-28176, +-28182, +-28188, +-28195, +-28201, +-28208, +-28214, +-28220, +-28227, +-28233, +-28239, +-28246, +-28252, +-28259, +-28265, +-28271, +-28278, +-28284, +-28290, +-28297, +-28303, +-28309, +-28316, +-28322, +-28328, +-28335, +-28341, +-28347, +-28353, +-28360, +-28366, +-28372, +-28379, +-28385, +-28391, +-28397, +-28404, +-28410, +-28416, +-28423, +-28429, +-28435, +-28441, +-28447, +-28454, +-28460, +-28466, +-28472, +-28479, +-28485, +-28491, +-28497, +-28503, +-28510, +-28516, +-28522, +-28528, +-28534, +-28541, +-28547, +-28553, +-28559, +-28565, +-28571, +-28578, +-28584, +-28590, +-28596, +-28602, +-28608, +-28614, +-28620, +-28627, +-28633, +-28639, +-28645, +-28651, +-28657, +-28663, +-28669, +-28675, +-28681, +-28687, +-28694, +-28700, +-28706, +-28712, +-28718, +-28724, +-28730, +-28736, +-28742, +-28748, +-28754, +-28760, +-28766, +-28772, +-28778, +-28784, +-28790, +-28796, +-28802, +-28808, +-28814, +-28820, +-28826, +-28832, +-28838, +-28844, +-28850, +-28856, +-28862, +-28868, +-28874, +-28880, +-28886, +-28891, +-28897, +-28903, +-28909, +-28915, +-28921, +-28927, +-28933, +-28939, +-28945, +-28951, +-28956, +-28962, +-28968, +-28974, +-28980, +-28986, +-28992, +-28997, +-29003, +-29009, +-29015, +-29021, +-29027, +-29033, +-29038, +-29044, +-29050, +-29056, +-29062, +-29067, +-29073, +-29079, +-29085, +-29091, +-29096, +-29102, +-29108, +-29114, +-29119, +-29125, +-29131, +-29137, +-29142, +-29148, +-29154, +-29160, +-29165, +-29171, +-29177, +-29183, +-29188, +-29194, +-29200, +-29205, +-29211, +-29217, +-29222, +-29228, +-29234, +-29239, +-29245, +-29251, +-29256, +-29262, +-29268, +-29273, +-29279, +-29285, +-29290, +-29296, +-29302, +-29307, +-29313, +-29318, +-29324, +-29330, +-29335, +-29341, +-29346, +-29352, +-29358, +-29363, +-29369, +-29374, +-29380, +-29385, +-29391, +-29397, +-29402, +-29408, +-29413, +-29419, +-29424, +-29430, +-29435, +-29441, +-29446, +-29452, +-29457, +-29463, +-29468, +-29474, +-29479, +-29485, +-29490, +-29496, +-29501, +-29507, +-29512, +-29518, +-29523, +-29529, +-29534, +-29539, +-29545, +-29550, +-29556, +-29561, +-29567, +-29572, +-29577, +-29583, +-29588, +-29594, +-29599, +-29604, +-29610, +-29615, +-29621, +-29626, +-29631, +-29637, +-29642, +-29647, +-29653, +-29658, +-29663, +-29669, +-29674, +-29679, +-29685, +-29690, +-29695, +-29701, +-29706, +-29711, +-29717, +-29722, +-29727, +-29732, +-29738, +-29743, +-29748, +-29753, +-29759, +-29764, +-29769, +-29774, +-29780, +-29785, +-29790, +-29795, +-29801, +-29806, +-29811, +-29816, +-29822, +-29827, +-29832, +-29837, +-29842, +-29848, +-29853, +-29858, +-29863, +-29868, +-29873, +-29879, +-29884, +-29889, +-29894, +-29899, +-29904, +-29909, +-29915, +-29920, +-29925, +-29930, +-29935, +-29940, +-29945, +-29950, +-29955, +-29961, +-29966, +-29971, +-29976, +-29981, +-29986, +-29991, +-29996, +-30001, +-30006, +-30011, +-30016, +-30021, +-30026, +-30031, +-30036, +-30041, +-30046, +-30051, +-30056, +-30061, +-30066, +-30071, +-30076, +-30081, +-30086, +-30091, +-30096, +-30101, +-30106, +-30111, +-30116, +-30121, +-30126, +-30131, +-30136, +-30141, +-30146, +-30151, +-30156, +-30160, +-30165, +-30170, +-30175, +-30180, +-30185, +-30190, +-30195, +-30200, +-30205, +-30209, +-30214, +-30219, +-30224, +-30229, +-30234, +-30238, +-30243, +-30248, +-30253, +-30258, +-30263, +-30267, +-30272, +-30277, +-30282, +-30287, +-30291, +-30296, +-30301, +-30306, +-30311, +-30315, +-30320, +-30325, +-30330, +-30334, +-30339, +-30344, +-30349, +-30353, +-30358, +-30363, +-30368, +-30372, +-30377, +-30382, +-30386, +-30391, +-30396, +-30400, +-30405, +-30410, +-30415, +-30419, +-30424, +-30429, +-30433, +-30438, +-30442, +-30447, +-30452, +-30456, +-30461, +-30466, +-30470, +-30475, +-30480, +-30484, +-30489, +-30493, +-30498, +-30503, +-30507, +-30512, +-30516, +-30521, +-30525, +-30530, +-30535, +-30539, +-30544, +-30548, +-30553, +-30557, +-30562, +-30566, +-30571, +-30575, +-30580, +-30584, +-30589, +-30593, +-30598, +-30602, +-30607, +-30611, +-30616, +-30620, +-30625, +-30629, +-30634, +-30638, +-30643, +-30647, +-30652, +-30656, +-30660, +-30665, +-30669, +-30674, +-30678, +-30683, +-30687, +-30691, +-30696, +-30700, +-30705, +-30709, +-30713, +-30718, +-30722, +-30726, +-30731, +-30735, +-30739, +-30744, +-30748, +-30753, +-30757, +-30761, +-30766, +-30770, +-30774, +-30778, +-30783, +-30787, +-30791, +-30796, +-30800, +-30804, +-30809, +-30813, +-30817, +-30821, +-30826, +-30830, +-30834, +-30838, +-30843, +-30847, +-30851, +-30855, +-30860, +-30864, +-30868, +-30872, +-30876, +-30881, +-30885, +-30889, +-30893, +-30897, +-30902, +-30906, +-30910, +-30914, +-30918, +-30922, +-30927, +-30931, +-30935, +-30939, +-30943, +-30947, +-30951, +-30955, +-30960, +-30964, +-30968, +-30972, +-30976, +-30980, +-30984, +-30988, +-30992, +-30996, +-31001, +-31005, +-31009, +-31013, +-31017, +-31021, +-31025, +-31029, +-31033, +-31037, +-31041, +-31045, +-31049, +-31053, +-31057, +-31061, +-31065, +-31069, +-31073, +-31077, +-31081, +-31085, +-31089, +-31093, +-31097, +-31101, +-31105, +-31109, +-31113, +-31117, +-31121, +-31124, +-31128, +-31132, +-31136, +-31140, +-31144, +-31148, +-31152, +-31156, +-31160, +-31164, +-31167, +-31171, +-31175, +-31179, +-31183, +-31187, +-31191, +-31194, +-31198, +-31202, +-31206, +-31210, +-31214, +-31217, +-31221, +-31225, +-31229, +-31233, +-31236, +-31240, +-31244, +-31248, +-31252, +-31255, +-31259, +-31263, +-31267, +-31270, +-31274, +-31278, +-31282, +-31285, +-31289, +-31293, +-31297, +-31300, +-31304, +-31308, +-31311, +-31315, +-31319, +-31323, +-31326, +-31330, +-31334, +-31337, +-31341, +-31345, +-31348, +-31352, +-31356, +-31359, +-31363, +-31366, +-31370, +-31374, +-31377, +-31381, +-31385, +-31388, +-31392, +-31395, +-31399, +-31403, +-31406, +-31410, +-31413, +-31417, +-31420, +-31424, +-31428, +-31431, +-31435, +-31438, +-31442, +-31445, +-31449, +-31452, +-31456, +-31459, +-31463, +-31466, +-31470, +-31473, +-31477, +-31480, +-31484, +-31487, +-31491, +-31494, +-31498, +-31501, +-31505, +-31508, +-31512, +-31515, +-31518, +-31522, +-31525, +-31529, +-31532, +-31536, +-31539, +-31542, +-31546, +-31549, +-31553, +-31556, +-31559, +-31563, +-31566, +-31569, +-31573, +-31576, +-31580, +-31583, +-31586, +-31590, +-31593, +-31596, +-31600, +-31603, +-31606, +-31610, +-31613, +-31616, +-31619, +-31623, +-31626, +-31629, +-31633, +-31636, +-31639, +-31642, +-31646, +-31649, +-31652, +-31655, +-31659, +-31662, +-31665, +-31668, +-31672, +-31675, +-31678, +-31681, +-31684, +-31688, +-31691, +-31694, +-31697, +-31700, +-31704, +-31707, +-31710, +-31713, +-31716, +-31719, +-31723, +-31726, +-31729, +-31732, +-31735, +-31738, +-31741, +-31744, +-31748, +-31751, +-31754, +-31757, +-31760, +-31763, +-31766, +-31769, +-31772, +-31775, +-31778, +-31781, +-31785, +-31788, +-31791, +-31794, +-31797, +-31800, +-31803, +-31806, +-31809, +-31812, +-31815, +-31818, +-31821, +-31824, +-31827, +-31830, +-31833, +-31836, +-31839, +-31842, +-31845, +-31848, +-31851, +-31854, +-31856, +-31859, +-31862, +-31865, +-31868, +-31871, +-31874, +-31877, +-31880, +-31883, +-31886, +-31889, +-31891, +-31894, +-31897, +-31900, +-31903, +-31906, +-31909, +-31911, +-31914, +-31917, +-31920, +-31923, +-31926, +-31929, +-31931, +-31934, +-31937, +-31940, +-31943, +-31945, +-31948, +-31951, +-31954, +-31957, +-31959, +-31962, +-31965, +-31968, +-31970, +-31973, +-31976, +-31979, +-31981, +-31984, +-31987, +-31989, +-31992, +-31995, +-31998, +-32000, +-32003, +-32006, +-32008, +-32011, +-32014, +-32016, +-32019, +-32022, +-32024, +-32027, +-32030, +-32032, +-32035, +-32038, +-32040, +-32043, +-32046, +-32048, +-32051, +-32053, +-32056, +-32059, +-32061, +-32064, +-32066, +-32069, +-32072, +-32074, +-32077, +-32079, +-32082, +-32084, +-32087, +-32089, +-32092, +-32095, +-32097, +-32100, +-32102, +-32105, +-32107, +-32110, +-32112, +-32115, +-32117, +-32120, +-32122, +-32125, +-32127, +-32130, +-32132, +-32134, +-32137, +-32139, +-32142, +-32144, +-32147, +-32149, +-32152, +-32154, +-32156, +-32159, +-32161, +-32164, +-32166, +-32168, +-32171, +-32173, +-32176, +-32178, +-32180, +-32183, +-32185, +-32187, +-32190, +-32192, +-32194, +-32197, +-32199, +-32201, +-32204, +-32206, +-32208, +-32211, +-32213, +-32215, +-32218, +-32220, +-32222, +-32224, +-32227, +-32229, +-32231, +-32233, +-32236, +-32238, +-32240, +-32242, +-32245, +-32247, +-32249, +-32251, +-32254, +-32256, +-32258, +-32260, +-32262, +-32265, +-32267, +-32269, +-32271, +-32273, +-32275, +-32278, +-32280, +-32282, +-32284, +-32286, +-32288, +-32291, +-32293, +-32295, +-32297, +-32299, +-32301, +-32303, +-32305, +-32307, +-32310, +-32312, +-32314, +-32316, +-32318, +-32320, +-32322, +-32324, +-32326, +-32328, +-32330, +-32332, +-32334, +-32336, +-32338, +-32340, +-32342, +-32344, +-32346, +-32348, +-32350, +-32352, +-32354, +-32356, +-32358, +-32360, +-32362, +-32364, +-32366, +-32368, +-32370, +-32372, +-32374, +-32376, +-32378, +-32380, +-32382, +-32384, +-32386, +-32387, +-32389, +-32391, +-32393, +-32395, +-32397, +-32399, +-32401, +-32403, +-32404, +-32406, +-32408, +-32410, +-32412, +-32414, +-32416, +-32417, +-32419, +-32421, +-32423, +-32425, +-32426, +-32428, +-32430, +-32432, +-32434, +-32435, +-32437, +-32439, +-32441, +-32443, +-32444, +-32446, +-32448, +-32450, +-32451, +-32453, +-32455, +-32456, +-32458, +-32460, +-32462, +-32463, +-32465, +-32467, +-32468, +-32470, +-32472, +-32473, +-32475, +-32477, +-32478, +-32480, +-32482, +-32483, +-32485, +-32487, +-32488, +-32490, +-32492, +-32493, +-32495, +-32496, +-32498, +-32500, +-32501, +-32503, +-32504, +-32506, +-32508, +-32509, +-32511, +-32512, +-32514, +-32515, +-32517, +-32519, +-32520, +-32522, +-32523, +-32525, +-32526, +-32528, +-32529, +-32531, +-32532, +-32534, +-32535, +-32537, +-32538, +-32540, +-32541, +-32543, +-32544, +-32546, +-32547, +-32548, +-32550, +-32551, +-32553, +-32554, +-32556, +-32557, +-32558, +-32560, +-32561, +-32563, +-32564, +-32565, +-32567, +-32568, +-32570, +-32571, +-32572, +-32574, +-32575, +-32576, +-32578, +-32579, +-32580, +-32582, +-32583, +-32584, +-32586, +-32587, +-32588, +-32590, +-32591, +-32592, +-32594, +-32595, +-32596, +-32597, +-32599, +-32600, +-32601, +-32602, +-32604, +-32605, +-32606, +-32607, +-32609, +-32610, +-32611, +-32612, +-32614, +-32615, +-32616, +-32617, +-32618, +-32620, +-32621, +-32622, +-32623, +-32624, +-32625, +-32627, +-32628, +-32629, +-32630, +-32631, +-32632, +-32634, +-32635, +-32636, +-32637, +-32638, +-32639, +-32640, +-32641, +-32642, +-32644, +-32645, +-32646, +-32647, +-32648, +-32649, +-32650, +-32651, +-32652, +-32653, +-32654, +-32655, +-32656, +-32657, +-32658, +-32659, +-32660, +-32661, +-32662, +-32663, +-32664, +-32665, +-32666, +-32667, +-32668, +-32669, +-32670, +-32671, +-32672, +-32673, +-32674, +-32675, +-32676, +-32677, +-32678, +-32679, +-32680, +-32680, +-32681, +-32682, +-32683, +-32684, +-32685, +-32686, +-32687, +-32688, +-32688, +-32689, +-32690, +-32691, +-32692, +-32693, +-32694, +-32694, +-32695, +-32696, +-32697, +-32698, +-32699, +-32699, +-32700, +-32701, +-32702, +-32703, +-32703, +-32704, +-32705, +-32706, +-32706, +-32707, +-32708, +-32709, +-32709, +-32710, +-32711, +-32712, +-32712, +-32713, +-32714, +-32714, +-32715, +-32716, +-32717, +-32717, +-32718, +-32719, +-32719, +-32720, +-32721, +-32721, +-32722, +-32723, +-32723, +-32724, +-32725, +-32725, +-32726, +-32726, +-32727, +-32728, +-32728, +-32729, +-32729, +-32730, +-32731, +-32731, +-32732, +-32732, +-32733, +-32734, +-32734, +-32735, +-32735, +-32736, +-32736, +-32737, +-32737, +-32738, +-32738, +-32739, +-32739, +-32740, +-32740, +-32741, +-32741, +-32742, +-32742, +-32743, +-32743, +-32744, +-32744, +-32745, +-32745, +-32746, +-32746, +-32747, +-32747, +-32747, +-32748, +-32748, +-32749, +-32749, +-32750, +-32750, +-32750, +-32751, +-32751, +-32751, +-32752, +-32752, +-32753, +-32753, +-32753, +-32754, +-32754, +-32754, +-32755, +-32755, +-32755, +-32756, +-32756, +-32756, +-32757, +-32757, +-32757, +-32758, +-32758, +-32758, +-32758, +-32759, +-32759, +-32759, +-32759, +-32760, +-32760, +-32760, +-32760, +-32761, +-32761, +-32761, +-32761, +-32762, +-32762, +-32762, +-32762, +-32762, +-32763, +-32763, +-32763, +-32763, +-32763, +-32764, +-32764, +-32764, +-32764, +-32764, +-32764, +-32764, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32767, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32766, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32765, +-32764, +-32764, +-32764, +-32764, +-32764, +-32764, +-32764, +-32763, +-32763, +-32763, +-32763, +-32763, +-32762, +-32762, +-32762, +-32762, +-32762, +-32761, +-32761, +-32761, +-32761, +-32760, +-32760, +-32760, +-32760, +-32759, +-32759, +-32759, +-32759, +-32758, +-32758, +-32758, +-32758, +-32757, +-32757, +-32757, +-32756, +-32756, +-32756, +-32755, +-32755, +-32755, +-32754, +-32754, +-32754, +-32753, +-32753, +-32753, +-32752, +-32752, +-32751, +-32751, +-32751, +-32750, +-32750, +-32750, +-32749, +-32749, +-32748, +-32748, +-32747, +-32747, +-32747, +-32746, +-32746, +-32745, +-32745, +-32744, +-32744, +-32743, +-32743, +-32742, +-32742, +-32741, +-32741, +-32740, +-32740, +-32739, +-32739, +-32738, +-32738, +-32737, +-32737, +-32736, +-32736, +-32735, +-32735, +-32734, +-32734, +-32733, +-32732, +-32732, +-32731, +-32731, +-32730, +-32729, +-32729, +-32728, +-32728, +-32727, +-32726, +-32726, +-32725, +-32725, +-32724, +-32723, +-32723, +-32722, +-32721, +-32721, +-32720, +-32719, +-32719, +-32718, +-32717, +-32717, +-32716, +-32715, +-32714, +-32714, +-32713, +-32712, +-32712, +-32711, +-32710, +-32709, +-32709, +-32708, +-32707, +-32706, +-32706, +-32705, +-32704, +-32703, +-32703, +-32702, +-32701, +-32700, +-32699, +-32699, +-32698, +-32697, +-32696, +-32695, +-32694, +-32694, +-32693, +-32692, +-32691, +-32690, +-32689, +-32688, +-32688, +-32687, +-32686, +-32685, +-32684, +-32683, +-32682, +-32681, +-32680, +-32680, +-32679, +-32678, +-32677, +-32676, +-32675, +-32674, +-32673, +-32672, +-32671, +-32670, +-32669, +-32668, +-32667, +-32666, +-32665, +-32664, +-32663, +-32662, +-32661, +-32660, +-32659, +-32658, +-32657, +-32656, +-32655, +-32654, +-32653, +-32652, +-32651, +-32650, +-32649, +-32648, +-32647, +-32646, +-32645, +-32644, +-32642, +-32641, +-32640, +-32639, +-32638, +-32637, +-32636, +-32635, +-32634, +-32632, +-32631, +-32630, +-32629, +-32628, +-32627, +-32625, +-32624, +-32623, +-32622, +-32621, +-32620, +-32618, +-32617, +-32616, +-32615, +-32614, +-32612, +-32611, +-32610, +-32609, +-32607, +-32606, +-32605, +-32604, +-32602, +-32601, +-32600, +-32599, +-32597, +-32596, +-32595, +-32594, +-32592, +-32591, +-32590, +-32588, +-32587, +-32586, +-32584, +-32583, +-32582, +-32580, +-32579, +-32578, +-32576, +-32575, +-32574, +-32572, +-32571, +-32570, +-32568, +-32567, +-32565, +-32564, +-32563, +-32561, +-32560, +-32558, +-32557, +-32556, +-32554, +-32553, +-32551, +-32550, +-32548, +-32547, +-32546, +-32544, +-32543, +-32541, +-32540, +-32538, +-32537, +-32535, +-32534, +-32532, +-32531, +-32529, +-32528, +-32526, +-32525, +-32523, +-32522, +-32520, +-32519, +-32517, +-32515, +-32514, +-32512, +-32511, +-32509, +-32508, +-32506, +-32504, +-32503, +-32501, +-32500, +-32498, +-32496, +-32495, +-32493, +-32492, +-32490, +-32488, +-32487, +-32485, +-32483, +-32482, +-32480, +-32478, +-32477, +-32475, +-32473, +-32472, +-32470, +-32468, +-32467, +-32465, +-32463, +-32462, +-32460, +-32458, +-32456, +-32455, +-32453, +-32451, +-32450, +-32448, +-32446, +-32444, +-32443, +-32441, +-32439, +-32437, +-32435, +-32434, +-32432, +-32430, +-32428, +-32426, +-32425, +-32423, +-32421, +-32419, +-32417, +-32416, +-32414, +-32412, +-32410, +-32408, +-32406, +-32404, +-32403, +-32401, +-32399, +-32397, +-32395, +-32393, +-32391, +-32389, +-32387, +-32386, +-32384, +-32382, +-32380, +-32378, +-32376, +-32374, +-32372, +-32370, +-32368, +-32366, +-32364, +-32362, +-32360, +-32358, +-32356, +-32354, +-32352, +-32350, +-32348, +-32346, +-32344, +-32342, +-32340, +-32338, +-32336, +-32334, +-32332, +-32330, +-32328, +-32326, +-32324, +-32322, +-32320, +-32318, +-32316, +-32314, +-32312, +-32310, +-32307, +-32305, +-32303, +-32301, +-32299, +-32297, +-32295, +-32293, +-32291, +-32288, +-32286, +-32284, +-32282, +-32280, +-32278, +-32275, +-32273, +-32271, +-32269, +-32267, +-32265, +-32262, +-32260, +-32258, +-32256, +-32254, +-32251, +-32249, +-32247, +-32245, +-32242, +-32240, +-32238, +-32236, +-32233, +-32231, +-32229, +-32227, +-32224, +-32222, +-32220, +-32218, +-32215, +-32213, +-32211, +-32208, +-32206, +-32204, +-32201, +-32199, +-32197, +-32194, +-32192, +-32190, +-32187, +-32185, +-32183, +-32180, +-32178, +-32176, +-32173, +-32171, +-32168, +-32166, +-32164, +-32161, +-32159, +-32156, +-32154, +-32152, +-32149, +-32147, +-32144, +-32142, +-32139, +-32137, +-32134, +-32132, +-32130, +-32127, +-32125, +-32122, +-32120, +-32117, +-32115, +-32112, +-32110, +-32107, +-32105, +-32102, +-32100, +-32097, +-32095, +-32092, +-32089, +-32087, +-32084, +-32082, +-32079, +-32077, +-32074, +-32072, +-32069, +-32066, +-32064, +-32061, +-32059, +-32056, +-32053, +-32051, +-32048, +-32046, +-32043, +-32040, +-32038, +-32035, +-32032, +-32030, +-32027, +-32024, +-32022, +-32019, +-32016, +-32014, +-32011, +-32008, +-32006, +-32003, +-32000, +-31998, +-31995, +-31992, +-31989, +-31987, +-31984, +-31981, +-31979, +-31976, +-31973, +-31970, +-31968, +-31965, +-31962, +-31959, +-31957, +-31954, +-31951, +-31948, +-31945, +-31943, +-31940, +-31937, +-31934, +-31931, +-31929, +-31926, +-31923, +-31920, +-31917, +-31914, +-31911, +-31909, +-31906, +-31903, +-31900, +-31897, +-31894, +-31891, +-31889, +-31886, +-31883, +-31880, +-31877, +-31874, +-31871, +-31868, +-31865, +-31862, +-31859, +-31856, +-31854, +-31851, +-31848, +-31845, +-31842, +-31839, +-31836, +-31833, +-31830, +-31827, +-31824, +-31821, +-31818, +-31815, +-31812, +-31809, +-31806, +-31803, +-31800, +-31797, +-31794, +-31791, +-31788, +-31785, +-31781, +-31778, +-31775, +-31772, +-31769, +-31766, +-31763, +-31760, +-31757, +-31754, +-31751, +-31748, +-31744, +-31741, +-31738, +-31735, +-31732, +-31729, +-31726, +-31723, +-31719, +-31716, +-31713, +-31710, +-31707, +-31704, +-31700, +-31697, +-31694, +-31691, +-31688, +-31684, +-31681, +-31678, +-31675, +-31672, +-31668, +-31665, +-31662, +-31659, +-31655, +-31652, +-31649, +-31646, +-31642, +-31639, +-31636, +-31633, +-31629, +-31626, +-31623, +-31619, +-31616, +-31613, +-31610, +-31606, +-31603, +-31600, +-31596, +-31593, +-31590, +-31586, +-31583, +-31580, +-31576, +-31573, +-31569, +-31566, +-31563, +-31559, +-31556, +-31553, +-31549, +-31546, +-31542, +-31539, +-31536, +-31532, +-31529, +-31525, +-31522, +-31518, +-31515, +-31512, +-31508, +-31505, +-31501, +-31498, +-31494, +-31491, +-31487, +-31484, +-31480, +-31477, +-31473, +-31470, +-31466, +-31463, +-31459, +-31456, +-31452, +-31449, +-31445, +-31442, +-31438, +-31435, +-31431, +-31428, +-31424, +-31420, +-31417, +-31413, +-31410, +-31406, +-31403, +-31399, +-31395, +-31392, +-31388, +-31385, +-31381, +-31377, +-31374, +-31370, +-31366, +-31363, +-31359, +-31356, +-31352, +-31348, +-31345, +-31341, +-31337, +-31334, +-31330, +-31326, +-31323, +-31319, +-31315, +-31311, +-31308, +-31304, +-31300, +-31297, +-31293, +-31289, +-31285, +-31282, +-31278, +-31274, +-31270, +-31267, +-31263, +-31259, +-31255, +-31252, +-31248, +-31244, +-31240, +-31236, +-31233, +-31229, +-31225, +-31221, +-31217, +-31214, +-31210, +-31206, +-31202, +-31198, +-31194, +-31191, +-31187, +-31183, +-31179, +-31175, +-31171, +-31167, +-31164, +-31160, +-31156, +-31152, +-31148, +-31144, +-31140, +-31136, +-31132, +-31128, +-31124, +-31121, +-31117, +-31113, +-31109, +-31105, +-31101, +-31097, +-31093, +-31089, +-31085, +-31081, +-31077, +-31073, +-31069, +-31065, +-31061, +-31057, +-31053, +-31049, +-31045, +-31041, +-31037, +-31033, +-31029, +-31025, +-31021, +-31017, +-31013, +-31009, +-31005, +-31001, +-30996, +-30992, +-30988, +-30984, +-30980, +-30976, +-30972, +-30968, +-30964, +-30960, +-30955, +-30951, +-30947, +-30943, +-30939, +-30935, +-30931, +-30927, +-30922, +-30918, +-30914, +-30910, +-30906, +-30902, +-30897, +-30893, +-30889, +-30885, +-30881, +-30876, +-30872, +-30868, +-30864, +-30860, +-30855, +-30851, +-30847, +-30843, +-30838, +-30834, +-30830, +-30826, +-30821, +-30817, +-30813, +-30809, +-30804, +-30800, +-30796, +-30791, +-30787, +-30783, +-30778, +-30774, +-30770, +-30766, +-30761, +-30757, +-30753, +-30748, +-30744, +-30739, +-30735, +-30731, +-30726, +-30722, +-30718, +-30713, +-30709, +-30705, +-30700, +-30696, +-30691, +-30687, +-30683, +-30678, +-30674, +-30669, +-30665, +-30660, +-30656, +-30652, +-30647, +-30643, +-30638, +-30634, +-30629, +-30625, +-30620, +-30616, +-30611, +-30607, +-30602, +-30598, +-30593, +-30589, +-30584, +-30580, +-30575, +-30571, +-30566, +-30562, +-30557, +-30553, +-30548, +-30544, +-30539, +-30535, +-30530, +-30525, +-30521, +-30516, +-30512, +-30507, +-30503, +-30498, +-30493, +-30489, +-30484, +-30480, +-30475, +-30470, +-30466, +-30461, +-30456, +-30452, +-30447, +-30442, +-30438, +-30433, +-30429, +-30424, +-30419, +-30415, +-30410, +-30405, +-30400, +-30396, +-30391, +-30386, +-30382, +-30377, +-30372, +-30368, +-30363, +-30358, +-30353, +-30349, +-30344, +-30339, +-30334, +-30330, +-30325, +-30320, +-30315, +-30311, +-30306, +-30301, +-30296, +-30291, +-30287, +-30282, +-30277, +-30272, +-30267, +-30263, +-30258, +-30253, +-30248, +-30243, +-30238, +-30234, +-30229, +-30224, +-30219, +-30214, +-30209, +-30205, +-30200, +-30195, +-30190, +-30185, +-30180, +-30175, +-30170, +-30165, +-30160, +-30156, +-30151, +-30146, +-30141, +-30136, +-30131, +-30126, +-30121, +-30116, +-30111, +-30106, +-30101, +-30096, +-30091, +-30086, +-30081, +-30076, +-30071, +-30066, +-30061, +-30056, +-30051, +-30046, +-30041, +-30036, +-30031, +-30026, +-30021, +-30016, +-30011, +-30006, +-30001, +-29996, +-29991, +-29986, +-29981, +-29976, +-29971, +-29966, +-29961, +-29955, +-29950, +-29945, +-29940, +-29935, +-29930, +-29925, +-29920, +-29915, +-29909, +-29904, +-29899, +-29894, +-29889, +-29884, +-29879, +-29873, +-29868, +-29863, +-29858, +-29853, +-29848, +-29842, +-29837, +-29832, +-29827, +-29822, +-29816, +-29811, +-29806, +-29801, +-29795, +-29790, +-29785, +-29780, +-29774, +-29769, +-29764, +-29759, +-29753, +-29748, +-29743, +-29738, +-29732, +-29727, +-29722, +-29717, +-29711, +-29706, +-29701, +-29695, +-29690, +-29685, +-29679, +-29674, +-29669, +-29663, +-29658, +-29653, +-29647, +-29642, +-29637, +-29631, +-29626, +-29621, +-29615, +-29610, +-29604, +-29599, +-29594, +-29588, +-29583, +-29577, +-29572, +-29567, +-29561, +-29556, +-29550, +-29545, +-29539, +-29534, +-29529, +-29523, +-29518, +-29512, +-29507, +-29501, +-29496, +-29490, +-29485, +-29479, +-29474, +-29468, +-29463, +-29457, +-29452, +-29446, +-29441, +-29435, +-29430, +-29424, +-29419, +-29413, +-29408, +-29402, +-29397, +-29391, +-29385, +-29380, +-29374, +-29369, +-29363, +-29358, +-29352, +-29346, +-29341, +-29335, +-29330, +-29324, +-29318, +-29313, +-29307, +-29302, +-29296, +-29290, +-29285, +-29279, +-29273, +-29268, +-29262, +-29256, +-29251, +-29245, +-29239, +-29234, +-29228, +-29222, +-29217, +-29211, +-29205, +-29200, +-29194, +-29188, +-29183, +-29177, +-29171, +-29165, +-29160, +-29154, +-29148, +-29142, +-29137, +-29131, +-29125, +-29119, +-29114, +-29108, +-29102, +-29096, +-29091, +-29085, +-29079, +-29073, +-29067, +-29062, +-29056, +-29050, +-29044, +-29038, +-29033, +-29027, +-29021, +-29015, +-29009, +-29003, +-28997, +-28992, +-28986, +-28980, +-28974, +-28968, +-28962, +-28956, +-28951, +-28945, +-28939, +-28933, +-28927, +-28921, +-28915, +-28909, +-28903, +-28897, +-28891, +-28886, +-28880, +-28874, +-28868, +-28862, +-28856, +-28850, +-28844, +-28838, +-28832, +-28826, +-28820, +-28814, +-28808, +-28802, +-28796, +-28790, +-28784, +-28778, +-28772, +-28766, +-28760, +-28754, +-28748, +-28742, +-28736, +-28730, +-28724, +-28718, +-28712, +-28706, +-28700, +-28694, +-28687, +-28681, +-28675, +-28669, +-28663, +-28657, +-28651, +-28645, +-28639, +-28633, +-28627, +-28620, +-28614, +-28608, +-28602, +-28596, +-28590, +-28584, +-28578, +-28571, +-28565, +-28559, +-28553, +-28547, +-28541, +-28534, +-28528, +-28522, +-28516, +-28510, +-28503, +-28497, +-28491, +-28485, +-28479, +-28472, +-28466, +-28460, +-28454, +-28447, +-28441, +-28435, +-28429, +-28423, +-28416, +-28410, +-28404, +-28397, +-28391, +-28385, +-28379, +-28372, +-28366, +-28360, +-28353, +-28347, +-28341, +-28335, +-28328, +-28322, +-28316, +-28309, +-28303, +-28297, +-28290, +-28284, +-28278, +-28271, +-28265, +-28259, +-28252, +-28246, +-28239, +-28233, +-28227, +-28220, +-28214, +-28208, +-28201, +-28195, +-28188, +-28182, +-28176, +-28169, +-28163, +-28156, +-28150, +-28143, +-28137, +-28131, +-28124, +-28118, +-28111, +-28105, +-28098, +-28092, +-28085, +-28079, +-28072, +-28066, +-28059, +-28053, +-28046, +-28040, +-28033, +-28027, +-28020, +-28014, +-28007, +-28001, +-27994, +-27988, +-27981, +-27975, +-27968, +-27962, +-27955, +-27948, +-27942, +-27935, +-27929, +-27922, +-27916, +-27909, +-27902, +-27896, +-27889, +-27883, +-27876, +-27869, +-27863, +-27856, +-27850, +-27843, +-27836, +-27830, +-27823, +-27816, +-27810, +-27803, +-27797, +-27790, +-27783, +-27777, +-27770, +-27763, +-27757, +-27750, +-27743, +-27736, +-27730, +-27723, +-27716, +-27710, +-27703, +-27696, +-27690, +-27683, +-27676, +-27669, +-27663, +-27656, +-27649, +-27642, +-27636, +-27629, +-27622, +-27615, +-27609, +-27602, +-27595, +-27588, +-27582, +-27575, +-27568, +-27561, +-27554, +-27548, +-27541, +-27534, +-27527, +-27520, +-27513, +-27507, +-27500, +-27493, +-27486, +-27479, +-27472, +-27466, +-27459, +-27452, +-27445, +-27438, +-27431, +-27424, +-27418, +-27411, +-27404, +-27397, +-27390, +-27383, +-27376, +-27369, +-27362, +-27355, +-27349, +-27342, +-27335, +-27328, +-27321, +-27314, +-27307, +-27300, +-27293, +-27286, +-27279, +-27272, +-27265, +-27258, +-27251, +-27244, +-27237, +-27230, +-27223, +-27216, +-27209, +-27202, +-27195, +-27188, +-27181, +-27174, +-27167, +-27160, +-27153, +-27146, +-27139, +-27132, +-27125, +-27118, +-27111, +-27104, +-27097, +-27090, +-27083, +-27076, +-27068, +-27061, +-27054, +-27047, +-27040, +-27033, +-27026, +-27019, +-27012, +-27005, +-26997, +-26990, +-26983, +-26976, +-26969, +-26962, +-26955, +-26948, +-26940, +-26933, +-26926, +-26919, +-26912, +-26905, +-26897, +-26890, +-26883, +-26876, +-26869, +-26861, +-26854, +-26847, +-26840, +-26833, +-26825, +-26818, +-26811, +-26804, +-26797, +-26789, +-26782, +-26775, +-26768, +-26760, +-26753, +-26746, +-26739, +-26731, +-26724, +-26717, +-26709, +-26702, +-26695, +-26688, +-26680, +-26673, +-26666, +-26658, +-26651, +-26644, +-26636, +-26629, +-26622, +-26615, +-26607, +-26600, +-26593, +-26585, +-26578, +-26570, +-26563, +-26556, +-26548, +-26541, +-26534, +-26526, +-26519, +-26512, +-26504, +-26497, +-26489, +-26482, +-26475, +-26467, +-26460, +-26452, +-26445, +-26437, +-26430, +-26423, +-26415, +-26408, +-26400, +-26393, +-26385, +-26378, +-26371, +-26363, +-26356, +-26348, +-26341, +-26333, +-26326, +-26318, +-26311, +-26303, +-26296, +-26288, +-26281, +-26273, +-26266, +-26258, +-26251, +-26243, +-26236, +-26228, +-26221, +-26213, +-26205, +-26198, +-26190, +-26183, +-26175, +-26168, +-26160, +-26153, +-26145, +-26137, +-26130, +-26122, +-26115, +-26107, +-26099, +-26092, +-26084, +-26077, +-26069, +-26061, +-26054, +-26046, +-26039, +-26031, +-26023, +-26016, +-26008, +-26000, +-25993, +-25985, +-25977, +-25970, +-25962, +-25954, +-25947, +-25939, +-25931, +-25924, +-25916, +-25908, +-25901, +-25893, +-25885, +-25878, +-25870, +-25862, +-25854, +-25847, +-25839, +-25831, +-25824, +-25816, +-25808, +-25800, +-25793, +-25785, +-25777, +-25769, +-25762, +-25754, +-25746, +-25738, +-25730, +-25723, +-25715, +-25707, +-25699, +-25691, +-25684, +-25676, +-25668, +-25660, +-25652, +-25645, +-25637, +-25629, +-25621, +-25613, +-25605, +-25598, +-25590, +-25582, +-25574, +-25566, +-25558, +-25550, +-25543, +-25535, +-25527, +-25519, +-25511, +-25503, +-25495, +-25487, +-25480, +-25472, +-25464, +-25456, +-25448, +-25440, +-25432, +-25424, +-25416, +-25408, +-25400, +-25392, +-25384, +-25376, +-25369, +-25361, +-25353, +-25345, +-25337, +-25329, +-25321, +-25313, +-25305, +-25297, +-25289, +-25281, +-25273, +-25265, +-25257, +-25249, +-25241, +-25233, +-25225, +-25217, +-25209, +-25201, +-25193, +-25185, +-25177, +-25169, +-25161, +-25152, +-25144, +-25136, +-25128, +-25120, +-25112, +-25104, +-25096, +-25088, +-25080, +-25072, +-25064, +-25056, +-25047, +-25039, +-25031, +-25023, +-25015, +-25007, +-24999, +-24991, +-24983, +-24974, +-24966, +-24958, +-24950, +-24942, +-24934, +-24926, +-24917, +-24909, +-24901, +-24893, +-24885, +-24877, +-24868, +-24860, +-24852, +-24844, +-24836, +-24827, +-24819, +-24811, +-24803, +-24795, +-24786, +-24778, +-24770, +-24762, +-24753, +-24745, +-24737, +-24729, +-24720, +-24712, +-24704, +-24696, +-24687, +-24679, +-24671, +-24663, +-24654, +-24646, +-24638, +-24630, +-24621, +-24613, +-24605, +-24596, +-24588, +-24580, +-24571, +-24563, +-24555, +-24546, +-24538, +-24530, +-24521, +-24513, +-24505, +-24496, +-24488, +-24480, +-24471, +-24463, +-24455, +-24446, +-24438, +-24430, +-24421, +-24413, +-24404, +-24396, +-24388, +-24379, +-24371, +-24362, +-24354, +-24346, +-24337, +-24329, +-24320, +-24312, +-24304, +-24295, +-24287, +-24278, +-24270, +-24261, +-24253, +-24244, +-24236, +-24228, +-24219, +-24211, +-24202, +-24194, +-24185, +-24177, +-24168, +-24160, +-24151, +-24143, +-24134, +-24126, +-24117, +-24109, +-24100, +-24092, +-24083, +-24075, +-24066, +-24058, +-24049, +-24041, +-24032, +-24023, +-24015, +-24006, +-23998, +-23989, +-23981, +-23972, +-23964, +-23955, +-23946, +-23938, +-23929, +-23921, +-23912, +-23903, +-23895, +-23886, +-23878, +-23869, +-23860, +-23852, +-23843, +-23835, +-23826, +-23817, +-23809, +-23800, +-23791, +-23783, +-23774, +-23766, +-23757, +-23748, +-23740, +-23731, +-23722, +-23714, +-23705, +-23696, +-23688, +-23679, +-23670, +-23661, +-23653, +-23644, +-23635, +-23627, +-23618, +-23609, +-23601, +-23592, +-23583, +-23574, +-23566, +-23557, +-23548, +-23539, +-23531, +-23522, +-23513, +-23504, +-23496, +-23487, +-23478, +-23469, +-23461, +-23452, +-23443, +-23434, +-23426, +-23417, +-23408, +-23399, +-23390, +-23382, +-23373, +-23364, +-23355, +-23346, +-23337, +-23329, +-23320, +-23311, +-23302, +-23293, +-23284, +-23276, +-23267, +-23258, +-23249, +-23240, +-23231, +-23223, +-23214, +-23205, +-23196, +-23187, +-23178, +-23169, +-23160, +-23151, +-23143, +-23134, +-23125, +-23116, +-23107, +-23098, +-23089, +-23080, +-23071, +-23062, +-23053, +-23045, +-23036, +-23027, +-23018, +-23009, +-23000, +-22991, +-22982, +-22973, +-22964, +-22955, +-22946, +-22937, +-22928, +-22919, +-22910, +-22901, +-22892, +-22883, +-22874, +-22865, +-22856, +-22847, +-22838, +-22829, +-22820, +-22811, +-22802, +-22793, +-22784, +-22775, +-22766, +-22757, +-22748, +-22739, +-22730, +-22721, +-22712, +-22703, +-22694, +-22685, +-22675, +-22666, +-22657, +-22648, +-22639, +-22630, +-22621, +-22612, +-22603, +-22594, +-22585, +-22575, +-22566, +-22557, +-22548, +-22539, +-22530, +-22521, +-22512, +-22503, +-22493, +-22484, +-22475, +-22466, +-22457, +-22448, +-22438, +-22429, +-22420, +-22411, +-22402, +-22393, +-22383, +-22374, +-22365, +-22356, +-22347, +-22338, +-22328, +-22319, +-22310, +-22301, +-22292, +-22282, +-22273, +-22264, +-22255, +-22245, +-22236, +-22227, +-22218, +-22209, +-22199, +-22190, +-22181, +-22172, +-22162, +-22153, +-22144, +-22135, +-22125, +-22116, +-22107, +-22097, +-22088, +-22079, +-22070, +-22060, +-22051, +-22042, +-22032, +-22023, +-22014, +-22004, +-21995, +-21986, +-21977, +-21967, +-21958, +-21949, +-21939, +-21930, +-21921, +-21911, +-21902, +-21893, +-21883, +-21874, +-21864, +-21855, +-21846, +-21836, +-21827, +-21818, +-21808, +-21799, +-21789, +-21780, +-21771, +-21761, +-21752, +-21743, +-21733, +-21724, +-21714, +-21705, +-21695, +-21686, +-21677, +-21667, +-21658, +-21648, +-21639, +-21629, +-21620, +-21611, +-21601, +-21592, +-21582, +-21573, +-21563, +-21554, +-21544, +-21535, +-21525, +-21516, +-21506, +-21497, +-21488, +-21478, +-21469, +-21459, +-21450, +-21440, +-21431, +-21421, +-21412, +-21402, +-21392, +-21383, +-21373, +-21364, +-21354, +-21345, +-21335, +-21326, +-21316, +-21307, +-21297, +-21288, +-21278, +-21268, +-21259, +-21249, +-21240, +-21230, +-21221, +-21211, +-21202, +-21192, +-21182, +-21173, +-21163, +-21154, +-21144, +-21134, +-21125, +-21115, +-21106, +-21096, +-21086, +-21077, +-21067, +-21057, +-21048, +-21038, +-21029, +-21019, +-21009, +-21000, +-20990, +-20980, +-20971, +-20961, +-20951, +-20942, +-20932, +-20922, +-20913, +-20903, +-20893, +-20884, +-20874, +-20864, +-20855, +-20845, +-20835, +-20825, +-20816, +-20806, +-20796, +-20787, +-20777, +-20767, +-20758, +-20748, +-20738, +-20728, +-20719, +-20709, +-20699, +-20689, +-20680, +-20670, +-20660, +-20650, +-20641, +-20631, +-20621, +-20611, +-20602, +-20592, +-20582, +-20572, +-20562, +-20553, +-20543, +-20533, +-20523, +-20513, +-20504, +-20494, +-20484, +-20474, +-20464, +-20455, +-20445, +-20435, +-20425, +-20415, +-20406, +-20396, +-20386, +-20376, +-20366, +-20356, +-20346, +-20337, +-20327, +-20317, +-20307, +-20297, +-20287, +-20277, +-20268, +-20258, +-20248, +-20238, +-20228, +-20218, +-20208, +-20198, +-20188, +-20179, +-20169, +-20159, +-20149, +-20139, +-20129, +-20119, +-20109, +-20099, +-20089, +-20079, +-20070, +-20060, +-20050, +-20040, +-20030, +-20020, +-20010, +-20000, +-19990, +-19980, +-19970, +-19960, +-19950, +-19940, +-19930, +-19920, +-19910, +-19900, +-19890, +-19880, +-19870, +-19860, +-19850, +-19840, +-19830, +-19820, +-19810, +-19800, +-19790, +-19780, +-19770, +-19760, +-19750, +-19740, +-19730, +-19720, +-19710, +-19700, +-19690, +-19680, +-19670, +-19660, +-19650, +-19640, +-19630, +-19620, +-19610, +-19599, +-19589, +-19579, +-19569, +-19559, +-19549, +-19539, +-19529, +-19519, +-19509, +-19499, +-19488, +-19478, +-19468, +-19458, +-19448, +-19438, +-19428, +-19418, +-19408, +-19397, +-19387, +-19377, +-19367, +-19357, +-19347, +-19337, +-19326, +-19316, +-19306, +-19296, +-19286, +-19276, +-19266, +-19255, +-19245, +-19235, +-19225, +-19215, +-19205, +-19194, +-19184, +-19174, +-19164, +-19154, +-19143, +-19133, +-19123, +-19113, +-19103, +-19092, +-19082, +-19072, +-19062, +-19051, +-19041, +-19031, +-19021, +-19011, +-19000, +-18990, +-18980, +-18970, +-18959, +-18949, +-18939, +-18929, +-18918, +-18908, +-18898, +-18888, +-18877, +-18867, +-18857, +-18846, +-18836, +-18826, +-18816, +-18805, +-18795, +-18785, +-18774, +-18764, +-18754, +-18744, +-18733, +-18723, +-18713, +-18702, +-18692, +-18682, +-18671, +-18661, +-18651, +-18640, +-18630, +-18620, +-18609, +-18599, +-18589, +-18578, +-18568, +-18558, +-18547, +-18537, +-18526, +-18516, +-18506, +-18495, +-18485, +-18475, +-18464, +-18454, +-18443, +-18433, +-18423, +-18412, +-18402, +-18392, +-18381, +-18371, +-18360, +-18350, +-18339, +-18329, +-18319, +-18308, +-18298, +-18287, +-18277, +-18267, +-18256, +-18246, +-18235, +-18225, +-18214, +-18204, +-18193, +-18183, +-18173, +-18162, +-18152, +-18141, +-18131, +-18120, +-18110, +-18099, +-18089, +-18078, +-18068, +-18057, +-18047, +-18036, +-18026, +-18015, +-18005, +-17994, +-17984, +-17973, +-17963, +-17952, +-17942, +-17931, +-17921, +-17910, +-17900, +-17889, +-17879, +-17868, +-17858, +-17847, +-17837, +-17826, +-17815, +-17805, +-17794, +-17784, +-17773, +-17763, +-17752, +-17742, +-17731, +-17720, +-17710, +-17699, +-17689, +-17678, +-17668, +-17657, +-17646, +-17636, +-17625, +-17615, +-17604, +-17593, +-17583, +-17572, +-17562, +-17551, +-17540, +-17530, +-17519, +-17509, +-17498, +-17487, +-17477, +-17466, +-17455, +-17445, +-17434, +-17423, +-17413, +-17402, +-17392, +-17381, +-17370, +-17360, +-17349, +-17338, +-17328, +-17317, +-17306, +-17296, +-17285, +-17274, +-17264, +-17253, +-17242, +-17232, +-17221, +-17210, +-17199, +-17189, +-17178, +-17167, +-17157, +-17146, +-17135, +-17124, +-17114, +-17103, +-17092, +-17082, +-17071, +-17060, +-17049, +-17039, +-17028, +-17017, +-17006, +-16996, +-16985, +-16974, +-16964, +-16953, +-16942, +-16931, +-16920, +-16910, +-16899, +-16888, +-16877, +-16867, +-16856, +-16845, +-16834, +-16824, +-16813, +-16802, +-16791, +-16780, +-16770, +-16759, +-16748, +-16737, +-16726, +-16716, +-16705, +-16694, +-16683, +-16672, +-16662, +-16651, +-16640, +-16629, +-16618, +-16607, +-16597, +-16586, +-16575, +-16564, +-16553, +-16542, +-16532, +-16521, +-16510, +-16499, +-16488, +-16477, +-16466, +-16455, +-16445, +-16434, +-16423, +-16412, +-16401, +-16390, +-16379, +-16368, +-16358, +-16347, +-16336, +-16325, +-16314, +-16303, +-16292, +-16281, +-16270, +-16260, +-16249, +-16238, +-16227, +-16216, +-16205, +-16194, +-16183, +-16172, +-16161, +-16150, +-16139, +-16128, +-16117, +-16107, +-16096, +-16085, +-16074, +-16063, +-16052, +-16041, +-16030, +-16019, +-16008, +-15997, +-15986, +-15975, +-15964, +-15953, +-15942, +-15931, +-15920, +-15909, +-15898, +-15887, +-15876, +-15865, +-15854, +-15843, +-15832, +-15821, +-15810, +-15799, +-15788, +-15777, +-15766, +-15755, +-15744, +-15733, +-15722, +-15711, +-15700, +-15689, +-15678, +-15667, +-15656, +-15645, +-15634, +-15623, +-15612, +-15601, +-15590, +-15579, +-15568, +-15556, +-15545, +-15534, +-15523, +-15512, +-15501, +-15490, +-15479, +-15468, +-15457, +-15446, +-15435, +-15424, +-15413, +-15401, +-15390, +-15379, +-15368, +-15357, +-15346, +-15335, +-15324, +-15313, +-15301, +-15290, +-15279, +-15268, +-15257, +-15246, +-15235, +-15224, +-15213, +-15201, +-15190, +-15179, +-15168, +-15157, +-15146, +-15135, +-15123, +-15112, +-15101, +-15090, +-15079, +-15068, +-15056, +-15045, +-15034, +-15023, +-15012, +-15001, +-14989, +-14978, +-14967, +-14956, +-14945, +-14934, +-14922, +-14911, +-14900, +-14889, +-14878, +-14866, +-14855, +-14844, +-14833, +-14822, +-14810, +-14799, +-14788, +-14777, +-14766, +-14754, +-14743, +-14732, +-14721, +-14709, +-14698, +-14687, +-14676, +-14665, +-14653, +-14642, +-14631, +-14620, +-14608, +-14597, +-14586, +-14575, +-14563, +-14552, +-14541, +-14530, +-14518, +-14507, +-14496, +-14484, +-14473, +-14462, +-14451, +-14439, +-14428, +-14417, +-14406, +-14394, +-14383, +-14372, +-14360, +-14349, +-14338, +-14326, +-14315, +-14304, +-14293, +-14281, +-14270, +-14259, +-14247, +-14236, +-14225, +-14213, +-14202, +-14191, +-14179, +-14168, +-14157, +-14145, +-14134, +-14123, +-14111, +-14100, +-14089, +-14077, +-14066, +-14055, +-14043, +-14032, +-14021, +-14009, +-13998, +-13986, +-13975, +-13964, +-13952, +-13941, +-13930, +-13918, +-13907, +-13895, +-13884, +-13873, +-13861, +-13850, +-13839, +-13827, +-13816, +-13804, +-13793, +-13782, +-13770, +-13759, +-13747, +-13736, +-13725, +-13713, +-13702, +-13690, +-13679, +-13667, +-13656, +-13645, +-13633, +-13622, +-13610, +-13599, +-13587, +-13576, +-13565, +-13553, +-13542, +-13530, +-13519, +-13507, +-13496, +-13485, +-13473, +-13462, +-13450, +-13439, +-13427, +-13416, +-13404, +-13393, +-13381, +-13370, +-13358, +-13347, +-13335, +-13324, +-13312, +-13301, +-13290, +-13278, +-13267, +-13255, +-13244, +-13232, +-13221, +-13209, +-13198, +-13186, +-13175, +-13163, +-13152, +-13140, +-13129, +-13117, +-13106, +-13094, +-13082, +-13071, +-13059, +-13048, +-13036, +-13025, +-13013, +-13002, +-12990, +-12979, +-12967, +-12956, +-12944, +-12933, +-12921, +-12909, +-12898, +-12886, +-12875, +-12863, +-12852, +-12840, +-12829, +-12817, +-12805, +-12794, +-12782, +-12771, +-12759, +-12748, +-12736, +-12724, +-12713, +-12701, +-12690, +-12678, +-12666, +-12655, +-12643, +-12632, +-12620, +-12609, +-12597, +-12585, +-12574, +-12562, +-12550, +-12539, +-12527, +-12516, +-12504, +-12492, +-12481, +-12469, +-12458, +-12446, +-12434, +-12423, +-12411, +-12399, +-12388, +-12376, +-12365, +-12353, +-12341, +-12330, +-12318, +-12306, +-12295, +-12283, +-12271, +-12260, +-12248, +-12236, +-12225, +-12213, +-12201, +-12190, +-12178, +-12166, +-12155, +-12143, +-12131, +-12120, +-12108, +-12096, +-12085, +-12073, +-12061, +-12050, +-12038, +-12026, +-12015, +-12003, +-11991, +-11980, +-11968, +-11956, +-11944, +-11933, +-11921, +-11909, +-11898, +-11886, +-11874, +-11862, +-11851, +-11839, +-11827, +-11816, +-11804, +-11792, +-11780, +-11769, +-11757, +-11745, +-11734, +-11722, +-11710, +-11698, +-11687, +-11675, +-11663, +-11651, +-11640, +-11628, +-11616, +-11604, +-11593, +-11581, +-11569, +-11557, +-11546, +-11534, +-11522, +-11510, +-11499, +-11487, +-11475, +-11463, +-11451, +-11440, +-11428, +-11416, +-11404, +-11393, +-11381, +-11369, +-11357, +-11345, +-11334, +-11322, +-11310, +-11298, +-11286, +-11275, +-11263, +-11251, +-11239, +-11227, +-11216, +-11204, +-11192, +-11180, +-11168, +-11157, +-11145, +-11133, +-11121, +-11109, +-11098, +-11086, +-11074, +-11062, +-11050, +-11038, +-11027, +-11015, +-11003, +-10991, +-10979, +-10967, +-10956, +-10944, +-10932, +-10920, +-10908, +-10896, +-10884, +-10873, +-10861, +-10849, +-10837, +-10825, +-10813, +-10801, +-10790, +-10778, +-10766, +-10754, +-10742, +-10730, +-10718, +-10706, +-10695, +-10683, +-10671, +-10659, +-10647, +-10635, +-10623, +-10611, +-10600, +-10588, +-10576, +-10564, +-10552, +-10540, +-10528, +-10516, +-10504, +-10492, +-10481, +-10469, +-10457, +-10445, +-10433, +-10421, +-10409, +-10397, +-10385, +-10373, +-10361, +-10349, +-10338, +-10326, +-10314, +-10302, +-10290, +-10278, +-10266, +-10254, +-10242, +-10230, +-10218, +-10206, +-10194, +-10182, +-10170, +-10159, +-10147, +-10135, +-10123, +-10111, +-10099, +-10087, +-10075, +-10063, +-10051, +-10039, +-10027, +-10015, +-10003, +-9991, +-9979, +-9967, +-9955, +-9943, +-9931, +-9919, +-9907, +-9895, +-9883, +-9871, +-9859, +-9847, +-9835, +-9823, +-9811, +-9799, +-9787, +-9775, +-9763, +-9751, +-9739, +-9727, +-9715, +-9703, +-9691, +-9679, +-9667, +-9655, +-9643, +-9631, +-9619, +-9607, +-9595, +-9583, +-9571, +-9559, +-9547, +-9535, +-9523, +-9511, +-9499, +-9487, +-9475, +-9463, +-9451, +-9439, +-9427, +-9415, +-9403, +-9391, +-9379, +-9367, +-9355, +-9343, +-9331, +-9319, +-9307, +-9295, +-9283, +-9270, +-9258, +-9246, +-9234, +-9222, +-9210, +-9198, +-9186, +-9174, +-9162, +-9150, +-9138, +-9126, +-9114, +-9102, +-9090, +-9077, +-9065, +-9053, +-9041, +-9029, +-9017, +-9005, +-8993, +-8981, +-8969, +-8957, +-8945, +-8932, +-8920, +-8908, +-8896, +-8884, +-8872, +-8860, +-8848, +-8836, +-8824, +-8812, +-8799, +-8787, +-8775, +-8763, +-8751, +-8739, +-8727, +-8715, +-8703, +-8690, +-8678, +-8666, +-8654, +-8642, +-8630, +-8618, +-8606, +-8593, +-8581, +-8569, +-8557, +-8545, +-8533, +-8521, +-8509, +-8496, +-8484, +-8472, +-8460, +-8448, +-8436, +-8424, +-8411, +-8399, +-8387, +-8375, +-8363, +-8351, +-8339, +-8326, +-8314, +-8302, +-8290, +-8278, +-8266, +-8253, +-8241, +-8229, +-8217, +-8205, +-8193, +-8180, +-8168, +-8156, +-8144, +-8132, +-8120, +-8107, +-8095, +-8083, +-8071, +-8059, +-8047, +-8034, +-8022, +-8010, +-7998, +-7986, +-7973, +-7961, +-7949, +-7937, +-7925, +-7912, +-7900, +-7888, +-7876, +-7864, +-7851, +-7839, +-7827, +-7815, +-7803, +-7790, +-7778, +-7766, +-7754, +-7742, +-7729, +-7717, +-7705, +-7693, +-7681, +-7668, +-7656, +-7644, +-7632, +-7619, +-7607, +-7595, +-7583, +-7571, +-7558, +-7546, +-7534, +-7522, +-7509, +-7497, +-7485, +-7473, +-7461, +-7448, +-7436, +-7424, +-7412, +-7399, +-7387, +-7375, +-7363, +-7350, +-7338, +-7326, +-7314, +-7301, +-7289, +-7277, +-7265, +-7252, +-7240, +-7228, +-7216, +-7203, +-7191, +-7179, +-7167, +-7154, +-7142, +-7130, +-7117, +-7105, +-7093, +-7081, +-7068, +-7056, +-7044, +-7032, +-7019, +-7007, +-6995, +-6982, +-6970, +-6958, +-6946, +-6933, +-6921, +-6909, +-6897, +-6884, +-6872, +-6860, +-6847, +-6835, +-6823, +-6811, +-6798, +-6786, +-6774, +-6761, +-6749, +-6737, +-6724, +-6712, +-6700, +-6688, +-6675, +-6663, +-6651, +-6638, +-6626, +-6614, +-6601, +-6589, +-6577, +-6564, +-6552, +-6540, +-6528, +-6515, +-6503, +-6491, +-6478, +-6466, +-6454, +-6441, +-6429, +-6417, +-6404, +-6392, +-6380, +-6367, +-6355, +-6343, +-6330, +-6318, +-6306, +-6293, +-6281, +-6269, +-6256, +-6244, +-6232, +-6219, +-6207, +-6195, +-6182, +-6170, +-6158, +-6145, +-6133, +-6121, +-6108, +-6096, +-6084, +-6071, +-6059, +-6047, +-6034, +-6022, +-6010, +-5997, +-5985, +-5972, +-5960, +-5948, +-5935, +-5923, +-5911, +-5898, +-5886, +-5874, +-5861, +-5849, +-5836, +-5824, +-5812, +-5799, +-5787, +-5775, +-5762, +-5750, +-5738, +-5725, +-5713, +-5700, +-5688, +-5676, +-5663, +-5651, +-5639, +-5626, +-5614, +-5601, +-5589, +-5577, +-5564, +-5552, +-5539, +-5527, +-5515, +-5502, +-5490, +-5478, +-5465, +-5453, +-5440, +-5428, +-5416, +-5403, +-5391, +-5378, +-5366, +-5354, +-5341, +-5329, +-5316, +-5304, +-5292, +-5279, +-5267, +-5254, +-5242, +-5230, +-5217, +-5205, +-5192, +-5180, +-5168, +-5155, +-5143, +-5130, +-5118, +-5106, +-5093, +-5081, +-5068, +-5056, +-5043, +-5031, +-5019, +-5006, +-4994, +-4981, +-4969, +-4957, +-4944, +-4932, +-4919, +-4907, +-4894, +-4882, +-4870, +-4857, +-4845, +-4832, +-4820, +-4807, +-4795, +-4783, +-4770, +-4758, +-4745, +-4733, +-4720, +-4708, +-4696, +-4683, +-4671, +-4658, +-4646, +-4633, +-4621, +-4608, +-4596, +-4584, +-4571, +-4559, +-4546, +-4534, +-4521, +-4509, +-4496, +-4484, +-4472, +-4459, +-4447, +-4434, +-4422, +-4409, +-4397, +-4384, +-4372, +-4359, +-4347, +-4335, +-4322, +-4310, +-4297, +-4285, +-4272, +-4260, +-4247, +-4235, +-4222, +-4210, +-4198, +-4185, +-4173, +-4160, +-4148, +-4135, +-4123, +-4110, +-4098, +-4085, +-4073, +-4060, +-4048, +-4035, +-4023, +-4011, +-3998, +-3986, +-3973, +-3961, +-3948, +-3936, +-3923, +-3911, +-3898, +-3886, +-3873, +-3861, +-3848, +-3836, +-3823, +-3811, +-3798, +-3786, +-3773, +-3761, +-3749, +-3736, +-3724, +-3711, +-3699, +-3686, +-3674, +-3661, +-3649, +-3636, +-3624, +-3611, +-3599, +-3586, +-3574, +-3561, +-3549, +-3536, +-3524, +-3511, +-3499, +-3486, +-3474, +-3461, +-3449, +-3436, +-3424, +-3411, +-3399, +-3386, +-3374, +-3361, +-3349, +-3336, +-3324, +-3311, +-3299, +-3286, +-3274, +-3261, +-3249, +-3236, +-3224, +-3211, +-3199, +-3186, +-3174, +-3161, +-3149, +-3136, +-3124, +-3111, +-3099, +-3086, +-3074, +-3061, +-3049, +-3036, +-3024, +-3011, +-2999, +-2986, +-2974, +-2961, +-2949, +-2936, +-2923, +-2911, +-2898, +-2886, +-2873, +-2861, +-2848, +-2836, +-2823, +-2811, +-2798, +-2786, +-2773, +-2761, +-2748, +-2736, +-2723, +-2711, +-2698, +-2686, +-2673, +-2661, +-2648, +-2636, +-2623, +-2610, +-2598, +-2585, +-2573, +-2560, +-2548, +-2535, +-2523, +-2510, +-2498, +-2485, +-2473, +-2460, +-2448, +-2435, +-2423, +-2410, +-2397, +-2385, +-2372, +-2360, +-2347, +-2335, +-2322, +-2310, +-2297, +-2285, +-2272, +-2260, +-2247, +-2235, +-2222, +-2209, +-2197, +-2184, +-2172, +-2159, +-2147, +-2134, +-2122, +-2109, +-2097, +-2084, +-2072, +-2059, +-2046, +-2034, +-2021, +-2009, +-1996, +-1984, +-1971, +-1959, +-1946, +-1934, +-1921, +-1908, +-1896, +-1883, +-1871, +-1858, +-1846, +-1833, +-1821, +-1808, +-1796, +-1783, +-1770, +-1758, +-1745, +-1733, +-1720, +-1708, +-1695, +-1683, +-1670, +-1658, +-1645, +-1632, +-1620, +-1607, +-1595, +-1582, +-1570, +-1557, +-1545, +-1532, +-1519, +-1507, +-1494, +-1482, +-1469, +-1457, +-1444, +-1432, +-1419, +-1406, +-1394, +-1381, +-1369, +-1356, +-1344, +-1331, +-1319, +-1306, +-1293, +-1281, +-1268, +-1256, +-1243, +-1231, +-1218, +-1206, +-1193, +-1180, +-1168, +-1155, +-1143, +-1130, +-1118, +-1105, +-1093, +-1080, +-1067, +-1055, +-1042, +-1030, +-1017, +-1005, +-992, +-980, +-967, +-954, +-942, +-929, +-917, +-904, +-892, +-879, +-866, +-854, +-841, +-829, +-816, +-804, +-791, +-779, +-766, +-753, +-741, +-728, +-716, +-703, +-691, +-678, +-665, +-653, +-640, +-628, +-615, +-603, +-590, +-578, +-565, +-552, +-540, +-527, +-515, +-502, +-490, +-477, +-464, +-452, +-439, +-427, +-414, +-402, +-389, +-376, +-364, +-351, +-339, +-326, +-314, +-301, +-289, +-276, +-263, +-251, +-238, +-226, +-213, +-201, +-188, +-175, +-163, +-150, +-138, +-125, +-113, +-100, +-87, +-75, +-62, +-50, +-37, +-25, +-12, diff --git a/09-PlaySound/sound.c b/09-PlaySound/sound.c new file mode 100644 index 0000000..3525e82 --- /dev/null +++ b/09-PlaySound/sound.c @@ -0,0 +1,283 @@ +#include "ch.h" +#include "hal.h" +#include "chprintf.h" +#include "stm32f4xx.h" + +#include "sound.h" +#include "i2s_bits.h" +#include "cs43l22_pins.h" +#include "cs43l22_commands.h" + + +/* I2C driver configuration */ +static const I2CConfig _i2s_i2c_config = { + OPMODE_I2C , // Operation mode + I2S_OI2C_SPEED , // Clock frequency + FAST_DUTY_CYCLE_2 // Duty cycle +}; + + +/* Initialise one of the I2C pads */ +#define _i2s_init_i2c_pad(port,pad) \ + palSetPadMode( port , pad , \ + PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_OSPEED_MID2 \ + | PAL_MODE_ALTERNATE(4) ) + +/* Initialise an I2S pad */ +#define _i2s_init_i2s_pad(port,pad) \ + palSetPadMode( port , pad , \ + PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_MID2 \ + | PAL_STM32_ALTERNATE( I2S_OUT_FUNCTION ) ) + + +/* Currently playing? */ +static int _snd_playing; +/* May write next buffer? */ +static int _snd_next_ok; +/* Last initialised buffer */ +static int _snd_init_buffer; +/* Buffers */ +static s16 _snd_buffers[ 2 * SND_BUFSIZE ]; + +/* Compute a buffer's address */ +#define _snd_buffer_address(idx) \ + (& _snd_buffers[ (idx) * SND_BUFSIZE ] ) + + +#ifdef USE_DMA_FOR_SEXY_BEEPS +/* SPI transfer callback, used when buffers need to be rotated */ +static void _cs43l22_spi_callback( SPIDriver * driver , u32 flags ) +{ + if ( driver != &SPID3 || !( flags & STM32_DMA_ISR_TCIF ) ) { + return; + } + extern u32 isrFlags; + isrFlags = flags; + _snd_next_ok = TRUE; +} +#endif // USE_DMA_FOR_SEXY_BEEPS + + + +/* + * Initialise GPIO ports to handle: + * - the CS43L22's I2C channel, + * - the CS43L22's I2S channel. + */ +static void _i2s_init_gpio( void ) +{ + // Reset pin + palSetPadMode( I2S_ORESET_PORT , I2S_ORESET_PAD , + PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_MID2 ); + + // SDL/SDA pins + _i2s_init_i2c_pad( I2C_OSCL_PORT , I2C_OSCL_PAD ); + _i2s_init_i2c_pad( I2C_OSDA_PORT , I2C_OSDA_PAD ); + + // I2S WS/MCK/SCK/SD pins + _i2s_init_i2s_pad( I2S_OWS_PORT , I2S_OWS_PAD ); + _i2s_init_i2s_pad( I2S_OMCK_PORT , I2S_OMCK_PAD ); + _i2s_init_i2s_pad( I2S_OSCK_PORT , I2S_OSCK_PAD ); + _i2s_init_i2s_pad( I2S_OSD_PORT , I2S_OSD_PAD ); +} + + +/* Reset the CS43L22 */ +static void _i2s_reset_output( void ) +{ + palClearPad( I2S_ORESET_PORT , I2S_ORESET_PAD ); + chThdSleep( I2S_ORESET_DELAY ); + palSetPad( I2S_ORESET_PORT , I2S_ORESET_PAD ); + chThdSleep( I2S_ORESET_DELAY ); +} + + +/* Send a command to the CS43L22 through I2C */ +static msg_t _cs43l22_set( u8 reg , u8 value ) +{ + u8 txBuffer[ 2 ]; + txBuffer[0] = reg; + txBuffer[1] = value; + msg_t rv = i2cMasterTransmitTimeout( + & I2S_OI2C_DRIVER , I2S_OI2C_ADDRESS , + txBuffer , 2 , + NULL , 0 , + I2S_OI2C_TIMEOUT ); + if ( rv ) { + chprintf( (void*)&SD2 , + "I2C 0x%0.2x <- 0x%0.2x ERROR %d\r\n" , + reg , value , rv ); + chprintf( (void*)&SD2 , + " status = 0x%x\r\n" , + i2cGetErrors( & I2S_OI2C_DRIVER ) ); + } else { + chprintf( (void*)&SD2 , + "I2C 0x%0.2x <- 0x%0.2x OK\r\n" , + reg , value ); + } + return rv; +} + + +/* Get a register from the CS43L22 through I2C */ +static u8 _cs43l22_get( u8 reg ) +{ + u8 data; + msg_t rv = i2cMasterTransmitTimeout( + & I2S_OI2C_DRIVER , I2S_OI2C_ADDRESS , + ® , 1 , + &data , 1 , + I2S_OI2C_TIMEOUT ); + if ( rv ) { + chprintf( (void*)&SD2 , + "I2C 0x%0.2x >- ??? ERROR %d\r\n" , + reg , rv ); + chprintf( (void*)&SD2 , + " status = 0x%x\r\n" , + i2cGetErrors( & I2S_OI2C_DRIVER ) ); + } + return data; +} + + +/* Initialise the CS43L22 through its I2C interface */ +static void _cs43l22_init( void ) +{ + i2cStart( &( I2S_OI2C_DRIVER ) , &_i2s_i2c_config ); + + // Make sure the device is powered down + _cs43l22_set( CS43L22_REG_PWR_CTL1 , CS43L22_PWR1_DOWN ); + // Activate headphone channels + _cs43l22_set( CS43L22_REG_PWR_CTL2 , + CS43L22_PWR2_SPKA_OFF | CS43L22_PWR2_SPKB_OFF + | CS43L22_PWR2_HDA_ON | CS43L22_PWR2_HDB_ON ); + // Set serial clock + _cs43l22_set( CS43L22_REG_CLOCK_CTL , CS43L22_CLK_AUTO_ON + | CS43L22_CLK_MCDIV_ON ); + // Set input data format + _cs43l22_set( CS43L22_REG_INT_CTL1 , CS43L22_IC1_SLAVE + | CS43L22_IC1_SCPOL_OFF | CS43L22_IC1_DSP_OFF + | CS43L22_IC1_DIF_I2S | CS43L22_IC1_AWL_32 ); + // Fire it up + _cs43l22_set( CS43L22_REG_PWR_CTL1 , CS43L22_PWR1_UP ); + // Analog soft ramp/zero cross disabled + _cs43l22_set( CS43L22_REG_AZCSR , + CS43L22_AZCSR_SRB_OFF | CS43L22_AZCSR_SRA_OFF + | CS43L22_AZCSR_ZCB_OFF | CS43L22_AZCSR_ZCA_OFF ); + // Digital soft ramp disabled + _cs43l22_set( CS43L22_REG_MISC_CTL , CS43L22_MISC_DEEMPHASIS_ON ); + // Limiter: no soft ramp/zero cross, no attack level + _cs43l22_set( CS43L22_REG_LIM_CTL1 , CS43L22_LIM1_SRD_OFF + | CS43L22_LIM1_ZCD_OFF ); + // Initial volume and tone controls + _cs43l22_set( CS43L22_REG_TONE_CTL , 0xf ); + _cs43l22_set( CS43L22_REG_PCM_A , 0x00 ); + _cs43l22_set( CS43L22_REG_PCM_B , 0x00 ); + sndOutputVolume( 200 ); +} + + +/* Initialise the I2S interface to the CS43L22 */ +static void _cs43l22_init_i2s( u32 frequency ) +{ + rccEnableSPI3(FALSE); + + u32 plln = ( RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN ) >> 6; + u32 pllr = ( RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR ) >> 28; + u32 pllm = (u32)( RCC->PLLCFGR & RCC_PLLCFGR_PLLM ); + u32 clock = (u32)( ( ( HSE_VALUE / pllm ) * plln ) / pllr ); + chprintf( (void*)&SD2 , "PLL REG=0x%.x N=%d R=%d M=%d CLK = %d\r\n" , + RCC->PLLI2SCFGR , plln , pllr , pllm , clock ); + + u16 frq = (u16)(( ( ( clock / 256 ) * 10 ) / frequency ) + 5 ) / 10; + chprintf( (void*)&SD2 , "frq base = 0x%x\r\n" , frq ); + if ( ( frq & 1 ) == 0 ) { + frq = frq >> 1; + } else { + frq = STM32F4_I2S_PR_ODD | ( frq >> 1 ); + } + chprintf( (void*)&SD2 , "frq = 0x%x\r\n" , frq ); + + *((u32*)(SPI3_BASE + STM32F4_I2S_OFFS_CFG)) = + STM32F4_I2S_CFG_MODE_I2S + | STM32F4_I2S_CFG_STD_I2S + | STM32F4_I2S_CFG_CFG_MS_TX + | STM32F4_I2S_CFG_RCPOL_OFF + | STM32F4_I2S_CFG_DLEN_16 + | STM32F4_I2S_CFG_CLEN_16; + *((u32*)(SPI3_BASE + STM32F4_I2S_OFFS_PR)) = frq + | STM32F4_I2S_PR_MCLK_ON; + *((u32*)(SPI3_BASE + STM32F4_I2S_OFFS_CFG)) |= STM32F4_I2S_CFG_ENABLED; +} + +#ifdef USE_DMA_FOR_SEXY_BEEPS +static void _cs43l22_init_dma( void ) +{ + dmaStreamAllocate( SPID3.dmatx , 1 , + (stm32_dmaisr_t) _cs43l22_spi_callback , + &SPID3 ); + SPID3.txdmamode |= ( STM32_DMA_CR_PSIZE_HWORD | 0x30000 + | STM32_DMA_CR_MINC | STM32_DMA_CR_MSIZE_HWORD + | STM32_DMA_CR_DBM | STM32_DMA_CR_TCIE ); + dmaStreamSetMode( SPID3.dmatx , SPID3.txdmamode ); + dmaStreamSetFIFO( SPID3.dmatx , STM32_DMA_FCR_DMDIS + | STM32_DMA_FCR_FTH_HALF ); + dmaStreamSetPeripheral( SPID3.dmatx , &( SPID3.spi->DR ) ); + SPID3.spi->CR2 |= SPI_CR2_TXDMAEN; +} +#endif // USE_DMA_FOR_SEXY_BEEPS + + +void sndInit( u32 frequency ) +{ + _i2s_init_gpio( ); + _i2s_reset_output( ); + _cs43l22_init( ); + _cs43l22_init_i2s( frequency ); +#ifdef USE_DMA_FOR_SEXY_BEEPS + _cs43l22_init_dma( ); +#endif // USE_DMA_FOR_SEXY_BEEPS + _snd_next_ok = TRUE; +} + + +void sndOutputVolume( u8 volume ) +{ + if ( volume > 0xe6 ) { + volume -= 0xe7; + } else { + volume += 0x19; + } + _cs43l22_set( CS43L22_REG_MASTER_VOLUME_A , volume ); + _cs43l22_set( CS43L22_REG_MASTER_VOLUME_B , volume ); +} + +s16 * sndGetBuffer( void ) +{ + if ( ! _snd_next_ok ) { + return NULL; + } + + int next_write; + if ( _snd_playing ) { + next_write = ( SPID3.dmatx->stream->CR & 0x80000 ) + ? 0 : 1; + _snd_next_ok = FALSE; + } else if ( _snd_init_buffer == 0 ) { + next_write = _snd_init_buffer++; + } else { + next_write = _snd_init_buffer++; + _snd_playing = TRUE; + _snd_next_ok = FALSE; + dmaStreamSetMemory0( SPID3.dmatx , _snd_buffer_address(0) ); + dmaStreamSetMemory1( SPID3.dmatx , _snd_buffer_address(1) ); + dmaStreamSetTransactionSize( SPID3.dmatx , SND_BUFSIZE ); + dmaStreamEnable( SPID3.dmatx ); + } + return _snd_buffer_address( next_write ); +} + +u8 sndGetStatus( void ) +{ + return _cs43l22_get( CS43L22_REG_STATUS ); +} diff --git a/09-PlaySound/sound.h b/09-PlaySound/sound.h new file mode 100644 index 0000000..19cdbe2 --- /dev/null +++ b/09-PlaySound/sound.h @@ -0,0 +1,19 @@ +#ifndef __H_SOUND +#define __H_SOUND + +#define SND_BUFSIZE 2304 +//#define USE_DMA_FOR_SEXY_BEEPS + +/* Initialise the driver at a specific audio sampling rate */ +void sndInit( u32 frequency ); + +/* Set the driver's output volume */ +void sndOutputVolume( u8 volume ); + +/* Get the next writeable buffer; returns NULL if all buffers are full */ +s16 * sndGetBuffer( void ); + +/* Get the sound chip's status register */ +u8 sndGetStatus( void ); + +#endif //__H_SOUND