summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@adafruit.com>2020-05-04 16:08:45 -0400
committerGitHub <noreply@github.com>2020-05-04 16:08:45 -0400
commitc377d4bea79710bdf3880dfdbd2970f1ee7fc373 (patch)
tree8be39354a8e1706138357abb2cc6daf7d7d4e290
parentcc290c50c677e16ccdddae74ab0861c9101727fc (diff)
parent4d7e341e44ac40d18e947643ab925cbd7812cd36 (diff)
Merge branch 'master' into non-standard-nvm
-rw-r--r--.github/workflows/build.yml11
-rw-r--r--.gitmodules18
-rw-r--r--docs/supported_ports.rst11
m---------extmod/ulab0
m---------frozen/Adafruit_CircuitPython_BLE0
m---------frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center0
m---------frozen/Adafruit_CircuitPython_DRV26050
m---------frozen/Adafruit_CircuitPython_DS32310
m---------frozen/Adafruit_CircuitPython_FocalTouch0
m---------frozen/Adafruit_CircuitPython_LSM6DS0
m---------lib/tinyusb0
-rw-r--r--locale/ID.po18
-rw-r--r--locale/circuitpython.pot18
-rw-r--r--locale/de_DE.po18
-rw-r--r--locale/en_US.po18
-rw-r--r--locale/en_x_pirate.po18
-rw-r--r--locale/es.po18
-rw-r--r--locale/fil.po18
-rw-r--r--locale/fr.po18
-rw-r--r--locale/it_IT.po18
-rw-r--r--locale/ko.po18
-rw-r--r--locale/pl.po18
-rw-r--r--locale/pt_BR.po18
-rw-r--r--locale/zh_Latn_pinyin.po18
-rwxr-xr-xmain.c2
-rw-r--r--ports/atmel-samd/Makefile3
-rw-r--r--ports/atmel-samd/README.rst236
-rw-r--r--ports/atmel-samd/background.c6
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk3
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/hallowing_m4_express/board.c1
-rw-r--r--ports/atmel-samd/boards/monster_m4sk/board.c1
-rw-r--r--ports/atmel-samd/boards/openbook_m4/board.c1
-rw-r--r--ports/atmel-samd/boards/pewpew_m4/board.c1
-rw-r--r--ports/atmel-samd/boards/pybadge/board.c1
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/board.c1
-rw-r--r--ports/atmel-samd/boards/pygamer/board.c1
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/board.c1
-rw-r--r--ports/atmel-samd/boards/pyportal/board.c2
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/board.c2
-rw-r--r--ports/atmel-samd/boards/ugame10/board.c2
-rw-r--r--ports/atmel-samd/common-hal/audiobusio/PDMIn.c1
-rw-r--r--ports/atmel-samd/common-hal/displayio/ParallelBus.c2
-rw-r--r--ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c22
-rw-r--r--ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h3
-rw-r--r--ports/atmel-samd/common-hal/neopixel_write/__init__.c22
-rw-r--r--ports/atmel-samd/common-hal/ps2io/Ps2.c14
-rw-r--r--ports/atmel-samd/common-hal/ps2io/Ps2.h3
-rw-r--r--ports/atmel-samd/common-hal/pulseio/PulseIn.c128
-rw-r--r--ports/atmel-samd/common-hal/pulseio/PulseIn.h5
-rw-r--r--ports/atmel-samd/common-hal/rtc/RTC.c65
-rw-r--r--ports/atmel-samd/common-hal/rtc/RTC.h2
-rw-r--r--ports/atmel-samd/common-hal/touchio/TouchIn.c1
-rw-r--r--ports/atmel-samd/mphalport.c15
-rw-r--r--ports/atmel-samd/mphalport.h5
m---------ports/atmel-samd/peripherals0
-rw-r--r--ports/atmel-samd/supervisor/internal_flash.c3
-rw-r--r--ports/atmel-samd/supervisor/port.c157
-rw-r--r--ports/atmel-samd/tick.c107
-rw-r--r--ports/atmel-samd/timer_handler.c6
-rw-r--r--ports/atmel-samd/timer_handler.h1
-rw-r--r--ports/cxd56/Makefile5
-rw-r--r--ports/cxd56/common-hal/microcontroller/Processor.c4
-rw-r--r--ports/cxd56/common-hal/microcontroller/__init__.c16
-rw-r--r--ports/cxd56/common-hal/pulseio/PulseIn.c5
-rw-r--r--ports/cxd56/common-hal/pulseio/PulseIn.h2
-rw-r--r--ports/cxd56/common-hal/time/__init__.c45
-rw-r--r--ports/cxd56/mphalport.c63
-rw-r--r--ports/cxd56/mphalport.h3
-rw-r--r--ports/cxd56/supervisor/internal_flash.c2
-rw-r--r--ports/cxd56/supervisor/port.c41
-rw-r--r--ports/litex/.gitignore1
-rw-r--r--ports/litex/Makefile1
-rw-r--r--ports/litex/README.rst25
-rw-r--r--ports/litex/boards/fomu/fomu-spi.ld11
-rw-r--r--ports/litex/mphalport.c20
-rw-r--r--ports/litex/supervisor/internal_flash.c3
-rw-r--r--ports/litex/supervisor/port.c53
-rw-r--r--ports/litex/supervisor/usb.c2
-rw-r--r--ports/litex/tick.c82
-rw-r--r--ports/litex/tick.h46
-rw-r--r--ports/mimxrt10xx/Makefile4
-rw-r--r--ports/mimxrt10xx/background.c1
-rw-r--r--ports/mimxrt10xx/common-hal/displayio/ParallelBus.c2
-rw-r--r--ports/mimxrt10xx/common-hal/neopixel_write/__init__.c27
-rw-r--r--ports/mimxrt10xx/common-hal/pulseio/PulseIn.c2
-rw-r--r--ports/mimxrt10xx/common-hal/rtc/RTC.c1
-rw-r--r--ports/mimxrt10xx/linking/common.ld12
-rw-r--r--ports/mimxrt10xx/mphalport.c15
m---------ports/mimxrt10xx/sdk0
-rw-r--r--ports/mimxrt10xx/supervisor/internal_flash.c2
-rw-r--r--ports/mimxrt10xx/supervisor/port.c75
-rw-r--r--ports/mimxrt10xx/tick.c92
-rw-r--r--ports/mimxrt10xx/tick.h43
-rwxr-xr-xports/nrf/Makefile4
-rw-r--r--ports/nrf/bluetooth/s140_nrf52_7.0.1/s140_nrf52_7.0.1_softdevice.hex9742
-rw-r--r--ports/nrf/boards/TG-Watch02A/mpconfigboard.mk10
-rw-r--r--ports/nrf/boards/clue_nrf52840_express/board.c1
-rw-r--r--ports/nrf/boards/ohs2020_badge/board.c1
-rw-r--r--ports/nrf/boards/pca10100/board.c (renamed from ports/cxd56/tick.h)16
-rw-r--r--ports/nrf/boards/pca10100/mpconfigboard.h (renamed from ports/atmel-samd/common-hal/time/__init__.c)36
-rw-r--r--ports/nrf/boards/pca10100/mpconfigboard.mk25
-rw-r--r--ports/nrf/boards/pca10100/pins.c54
-rw-r--r--ports/nrf/boards/simmel/board.c (renamed from ports/cxd56/tick.c)18
-rw-r--r--ports/nrf/boards/simmel/mpconfigboard.h (renamed from ports/mimxrt10xx/common-hal/time/__init__.c)41
-rw-r--r--ports/nrf/boards/simmel/mpconfigboard.mk32
-rw-r--r--ports/nrf/boards/simmel/pins.c27
-rw-r--r--ports/nrf/boards/teknikio_bluebird/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/teknikio_bluebird/mpconfigboard.mk6
-rw-r--r--ports/nrf/boards/teknikio_bluebird/pins.c6
-rw-r--r--ports/nrf/common-hal/_bleio/Adapter.c1
-rw-r--r--ports/nrf/common-hal/_bleio/CharacteristicBuffer.c2
-rw-r--r--ports/nrf/common-hal/_bleio/PacketBuffer.c2
-rw-r--r--ports/nrf/common-hal/audiobusio/I2SOut.c8
-rw-r--r--ports/nrf/common-hal/audiopwmio/PWMAudioOut.c28
-rw-r--r--ports/nrf/common-hal/audiopwmio/PWMAudioOut.h2
-rw-r--r--ports/nrf/common-hal/busio/UART.c1
-rw-r--r--ports/nrf/common-hal/displayio/ParallelBus.c2
-rw-r--r--ports/nrf/common-hal/neopixel_write/__init__.c19
-rw-r--r--ports/nrf/common-hal/pulseio/PWMOut.c28
-rw-r--r--ports/nrf/common-hal/pulseio/PWMOut.h3
-rw-r--r--ports/nrf/common-hal/pulseio/PulseIn.c83
-rw-r--r--ports/nrf/common-hal/pulseio/PulseIn.h4
-rw-r--r--ports/nrf/common-hal/rtc/RTC.c47
-rw-r--r--ports/nrf/mphalport.c52
-rw-r--r--ports/nrf/supervisor/internal_flash.c2
-rw-r--r--ports/nrf/supervisor/port.c94
-rw-r--r--ports/nrf/supervisor/usb.c1
-rw-r--r--ports/nrf/tick.c67
-rw-r--r--ports/nrf/tick.h44
-rwxr-xr-xports/stm/Makefile6
-rw-r--r--ports/stm/README.md72
-rw-r--r--ports/stm/boards/STM32F401xd_fs.ld10
-rw-r--r--ports/stm/boards/STM32F401xe_boot.ld8
-rw-r--r--ports/stm/boards/STM32F401xe_fs.ld10
-rw-r--r--ports/stm/boards/STM32F405_boot.ld10
-rw-r--r--ports/stm/boards/STM32F405_default.ld10
-rw-r--r--ports/stm/boards/STM32F405_fs.ld12
-rw-r--r--ports/stm/boards/STM32F407_fs.ld12
-rw-r--r--ports/stm/boards/STM32F411_fs.ld10
-rw-r--r--ports/stm/boards/STM32F411_nvm.ld12
-rw-r--r--ports/stm/boards/STM32F412_fs.ld10
-rw-r--r--ports/stm/boards/STM32F746xG_fs.ld12
-rw-r--r--ports/stm/boards/STM32F767_fs.ld10
-rw-r--r--ports/stm/boards/STM32H743_fs.ld18
-rw-r--r--ports/stm/boards/common_default.ld22
-rw-r--r--ports/stm/boards/common_nvm.ld24
-rw-r--r--ports/stm/boards/common_tcm.ld34
-rw-r--r--ports/stm/boards/espruino_pico/mpconfigboard.h1
-rw-r--r--ports/stm/boards/espruino_pico/mpconfigboard.mk5
-rw-r--r--ports/stm/boards/espruino_pico/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/espruino_wifi/mpconfigboard.h1
-rw-r--r--ports/stm/boards/espruino_wifi/stm32f4xx_hal_conf.h439
-rw-r--r--ports/stm/boards/feather_stm32f405_express/mpconfigboard.h2
-rw-r--r--ports/stm/boards/feather_stm32f405_express/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/meowbit_v121/board.c2
-rw-r--r--ports/stm/boards/meowbit_v121/mpconfigboard.h4
-rw-r--r--ports/stm/boards/meowbit_v121/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/nucleo_f767zi/mpconfigboard.h1
-rw-r--r--ports/stm/boards/nucleo_f767zi/stm32f7xx_hal_conf.h445
-rw-r--r--ports/stm/boards/nucleo_h743zi_2/mpconfigboard.h1
-rw-r--r--ports/stm/boards/openmv_h7/board.c (renamed from ports/atmel-samd/tick.h)20
-rw-r--r--ports/stm/boards/openmv_h7/mpconfigboard.h37
-rw-r--r--ports/stm/boards/openmv_h7/mpconfigboard.mk15
-rw-r--r--ports/stm/boards/openmv_h7/openmv.csv26
-rw-r--r--ports/stm/boards/openmv_h7/pins.c35
-rw-r--r--ports/stm/boards/pyb_nano_v2/mpconfigboard.h1
-rw-r--r--ports/stm/boards/pyb_nano_v2/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/pyboard_v11/mpconfigboard.h3
-rw-r--r--ports/stm/boards/pyboard_v11/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/stm32f411ce_blackpill/mpconfigboard.h3
-rw-r--r--ports/stm/boards/stm32f411ce_blackpill/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/boards/stm32f411ve_discovery/mpconfigboard.h6
-rw-r--r--ports/stm/boards/stm32f411ve_discovery/stm32f4xx_hal_conf.h439
-rw-r--r--ports/stm/boards/stm32f412zg_discovery/mpconfigboard.h2
-rw-r--r--ports/stm/boards/stm32f4_discovery/mpconfigboard.h2
-rw-r--r--ports/stm/boards/stm32f4_discovery/stm32f4xx_hal_conf.h439
-rw-r--r--ports/stm/boards/stm32f746g_disco/stm32f7xx_hal_conf.h445
-rw-r--r--ports/stm/boards/stm32f746g_discovery/board.c (renamed from ports/stm/boards/stm32f746g_disco/board.c)0
-rw-r--r--ports/stm/boards/stm32f746g_discovery/mpconfigboard.h (renamed from ports/stm/boards/stm32f746g_disco/mpconfigboard.h)1
-rw-r--r--ports/stm/boards/stm32f746g_discovery/mpconfigboard.mk (renamed from ports/stm/boards/stm32f746g_disco/mpconfigboard.mk)0
-rw-r--r--ports/stm/boards/stm32f746g_discovery/pins.c (renamed from ports/stm/boards/stm32f746g_disco/pins.c)0
-rw-r--r--ports/stm/boards/thunderpack/mpconfigboard.h3
-rw-r--r--ports/stm/boards/thunderpack/stm32f4xx_hal_conf.h440
-rw-r--r--ports/stm/common-hal/busio/SPI.c4
-rw-r--r--ports/stm/common-hal/busio/UART.c2
-rw-r--r--ports/stm/common-hal/displayio/ParallelBus.c2
-rw-r--r--ports/stm/common-hal/microcontroller/Processor.c13
-rw-r--r--ports/stm/common-hal/microcontroller/__init__.c32
-rw-r--r--ports/stm/common-hal/neopixel_write/__init__.c25
-rw-r--r--ports/stm/common-hal/pulseio/PulseIn.c102
-rw-r--r--ports/stm/common-hal/pulseio/PulseIn.h4
-rw-r--r--ports/stm/common-hal/pulseio/PulseOut.c5
-rw-r--r--ports/stm/hal_conf/sort_defines.py21
-rw-r--r--ports/stm/hal_conf/stm32_hal_conf.h76
-rw-r--r--ports/stm/hal_conf/stm32f4xx_hal_conf.h (renamed from ports/stm/boards/stm32f412zg_discovery/stm32f4xx_hal_conf.h)125
-rw-r--r--ports/stm/hal_conf/stm32f7xx_hal_conf.h (renamed from ports/stm/boards/nucleo_f746zg/stm32f7xx_hal_conf.h)113
-rw-r--r--ports/stm/hal_conf/stm32h7xx_hal_conf.h (renamed from ports/stm/boards/nucleo_h743zi_2/stm32h7xx_hal_conf.h)114
-rw-r--r--ports/stm/mpconfigport.h21
-rw-r--r--ports/stm/mphalport.c15
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f401xe/clocks.c2
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f405xx/clocks.c4
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f407xx/clocks.c2
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f411xe/clocks.c2
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f411xe/gpio.c8
-rw-r--r--ports/stm/peripherals/stm32f4/stm32f412zx/clocks.c4
-rw-r--r--ports/stm/peripherals/stm32f7/stm32f746xx/clocks.c2
-rw-r--r--ports/stm/peripherals/stm32f7/stm32f767xx/clocks.c2
-rw-r--r--ports/stm/peripherals/stm32h7/stm32h743xx/clocks.c2
-rw-r--r--ports/stm/supervisor/internal_flash.c13
-rw-r--r--ports/stm/supervisor/port.c162
-rw-r--r--ports/stm/supervisor/usb.c2
-rw-r--r--ports/stm/tick.c79
-rw-r--r--ports/stm/tick.h44
-rw-r--r--py/circuitpy_defns.mk8
-rw-r--r--py/py.mk1
-rw-r--r--shared-bindings/board/__init__.c2
-rw-r--r--shared-bindings/neopixel_write/__init__.h6
-rw-r--r--shared-module/displayio/Display.c2
-rw-r--r--shared-module/displayio/EPaperDisplay.c2
-rw-r--r--shared-module/displayio/FourWire.c2
-rw-r--r--shared-module/displayio/I2CDisplay.c2
-rw-r--r--shared-module/displayio/display_core.c2
-rw-r--r--shared-module/framebufferio/FramebufferDisplay.c2
-rw-r--r--shared-module/time/__init__.c (renamed from ports/nrf/common-hal/time/__init__.c)14
-rw-r--r--shared-module/usb_hid/Device.c2
-rw-r--r--supervisor/flash.h2
-rw-r--r--supervisor/port.h18
-rw-r--r--supervisor/shared/autoreload.c8
-rw-r--r--supervisor/shared/external_flash/external_flash.c6
-rw-r--r--supervisor/shared/external_flash/external_flash.h2
-rw-r--r--supervisor/shared/flash.c21
-rw-r--r--supervisor/shared/internal_flash.h (renamed from ports/stm/common-hal/time/__init__.c)24
-rw-r--r--supervisor/shared/tick.c71
-rw-r--r--supervisor/shared/tick.h3
-rw-r--r--supervisor/shared/usb/tusb_config.h4
-rw-r--r--supervisor/shared/usb/usb.c1
-rw-r--r--supervisor/supervisor.mk32
-rw-r--r--tools/build_memory_info.py18
239 files changed, 11944 insertions, 7392 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index dd11dda1d..c37244b3a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,7 +10,7 @@ on:
jobs:
test:
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-18.04
steps:
- name: Dump GitHub context
env:
@@ -127,7 +127,7 @@ jobs:
path: mpy-cross/mpy-cross
build-arm:
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-18.04
needs: test
strategy:
fail-fast: false
@@ -206,11 +206,13 @@ jobs:
- "nucleo_h743zi_2"
- "ohs2020_badge"
- "openbook_m4"
+ - "openmv_h7"
- "particle_argon"
- "particle_boron"
- "particle_xenon"
- "pca10056"
- "pca10059"
+ - "pca10100"
- "pewpew10"
- "pewpew_m4"
- "pirkey_m0"
@@ -230,6 +232,7 @@ jobs:
- "seeeduino_xiao"
- "serpente"
- "shirtty"
+ - "simmel"
- "snekboard"
- "sparkfun_lumidrive"
- "sparkfun_nrf52840_mini"
@@ -244,7 +247,7 @@ jobs:
- "stm32f411ve_discovery"
- "stm32f412zg_discovery"
- "stm32f4_discovery"
- - "stm32f746g_disco"
+ - "stm32f746g_discovery"
- "stringcar_m0_express"
- "teensy40"
- "teknikio_bluebird"
@@ -303,7 +306,7 @@ jobs:
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
build-riscv:
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-18.04
needs: test
strategy:
fail-fast: false
diff --git a/.gitmodules b/.gitmodules
index ebff8ecb2..2884f79a5 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -122,3 +122,21 @@
[submodule "lib/protomatter"]
path = lib/protomatter
url = https://github.com/adafruit/Adafruit_Protomatter
+[submodule "frozen/Adafruit_CircuitPython_LSM6DS"]
+ path = frozen/Adafruit_CircuitPython_LSM6DS
+ url = https://github.com/adafruit/Adafruit_CircuitPython_LSM6DS
+[submodule "frozen/Adafruit_CircuitPython_FocalTouch"]
+ path = frozen/Adafruit_CircuitPython_FocalTouch
+ url = https://github.com/adafruit/Adafruit_CircuitPython_FocalTouch
+[submodule "frozen/Adafruit_CircuitPython_DS3231"]
+ path = frozen/Adafruit_CircuitPython_DS3231
+ url = https://github.com/adafruit/Adafruit_CircuitPython_DS3231
+[submodule "frozen/Adafruit_CircuitPython_DRV2605"]
+ path = frozen/Adafruit_CircuitPython_DRV2605
+ url = https://github.com/adafruit/Adafruit_CircuitPython_DRV2605
+[submodule "frozen/Adafruit_CircuitPython_BLE"]
+ path = frozen/Adafruit_CircuitPython_BLE
+ url = https://github.com/adafruit/Adafruit_CircuitPython_BLE
+[submodule "frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center"]
+ path = frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center
+ url = https://github.com/adafruit/Adafruit_CircuitPython_BLE_Apple_Notification_Center
diff --git a/docs/supported_ports.rst b/docs/supported_ports.rst
index bd237fb5d..09571afb6 100644
--- a/docs/supported_ports.rst
+++ b/docs/supported_ports.rst
@@ -1,14 +1,19 @@
Supported Ports
==============================
-Adafruit's CircuitPython currently has limited support with a focus on supporting the Atmel SAMD
-and ESP8266.
+CircuitPython supports a number of microcontroller families. Support quality for each varies
+depending on the active contributors for each port.
+
+Adafruit sponsored developers are actively contributing to atmel-samd, mimxrt10xx, nrf and stm
+ports. They also maintain the other ports in order to ensure the boards build. Additional testing
+is limited.
.. toctree::
:maxdepth: 2
../ports/atmel-samd/README
+ ../ports/cxd56/README
+ ../ports/litex/README
../ports/mimxrt10xx/README
../ports/nrf/README
../ports/stm/README
- ../ports/cxd56/README
diff --git a/extmod/ulab b/extmod/ulab
-Subproject a746bd8e0953853056ee405e2fa02c8ebca4fb7
+Subproject cf61d728e70b9ec57e5711b40540793a89296f5
diff --git a/frozen/Adafruit_CircuitPython_BLE b/frozen/Adafruit_CircuitPython_BLE
new file mode 160000
+Subproject 96774b15da61da54662bcfbbf15b5bdc27315a9
diff --git a/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center b/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center
new file mode 160000
+Subproject 3ffb3f02d2046910e09d1f5a74721bd1a4cdf8c
diff --git a/frozen/Adafruit_CircuitPython_DRV2605 b/frozen/Adafruit_CircuitPython_DRV2605
new file mode 160000
+Subproject 7914a6390318687bb8e2e9c4119aa932fea0153
diff --git a/frozen/Adafruit_CircuitPython_DS3231 b/frozen/Adafruit_CircuitPython_DS3231
new file mode 160000
+Subproject 0d49a1fcd96c13a94e8bdf26f92abe79b851790
diff --git a/frozen/Adafruit_CircuitPython_FocalTouch b/frozen/Adafruit_CircuitPython_FocalTouch
new file mode 160000
+Subproject 72968d3546f9d6c5af138d4c179343007cb9662
diff --git a/frozen/Adafruit_CircuitPython_LSM6DS b/frozen/Adafruit_CircuitPython_LSM6DS
new file mode 160000
+Subproject 24224cc905fad4646506caeb2451b4a495804ff
diff --git a/lib/tinyusb b/lib/tinyusb
-Subproject c59fa774274b13790a3ae0fc19d9651eeba560a
+Subproject a74a823b0a140667a4e4e80fa2678870faba2bd
diff --git a/locale/ID.po b/locale/ID.po
index fe503d20a..ac10df5bf 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -285,11 +285,12 @@ msgstr "Semua timer untuk pin ini sedang digunakan"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Semua timer sedang digunakan"
@@ -1242,6 +1243,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2215,6 +2220,10 @@ msgstr "fungsi diharapkan setidaknya %d argumen, hanya mendapatkan %d"
msgid "function got multiple values for argument '%q'"
msgstr "fungsi mendapatkan nilai ganda untuk argumen '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2704,7 +2713,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 7a7eb5d44..4b18bfd47 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -283,11 +283,12 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr ""
@@ -1228,6 +1229,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2191,6 +2196,10 @@ msgstr ""
msgid "function got multiple values for argument '%q'"
msgstr ""
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2679,7 +2688,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index ac7ff8cad..6cf4b7d47 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: Pascal Deneaux\n"
"Language-Team: Sebastian Plamauer, Pascal Deneaux\n"
@@ -285,11 +285,12 @@ msgstr "Alle timer für diesen Pin werden bereits benutzt"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Alle timer werden benutzt"
@@ -1245,6 +1246,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr "Pull wird nicht verwendet, wenn die Richtung output ist."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2220,6 +2225,10 @@ msgstr "Funktion erwartet maximal %d Argumente, aber hat %d erhalten"
msgid "function got multiple values for argument '%q'"
msgstr "Funktion hat mehrere Werte für Argument '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2715,7 +2724,8 @@ msgstr "nur eine sample_rate=16000 wird unterstützt"
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/en_US.po b/locale/en_US.po
index ab482425e..428a9c475 100644
--- a/locale/en_US.po
+++ b/locale/en_US.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -283,11 +283,12 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr ""
@@ -1228,6 +1229,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2191,6 +2196,10 @@ msgstr ""
msgid "function got multiple values for argument '%q'"
msgstr ""
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2679,7 +2688,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po
index 7deda3718..aacc176f5 100644
--- a/locale/en_x_pirate.po
+++ b/locale/en_x_pirate.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: @sommersoft, @MrCertainly\n"
@@ -285,11 +285,12 @@ msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr ""
@@ -1232,6 +1233,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2195,6 +2200,10 @@ msgstr ""
msgid "function got multiple values for argument '%q'"
msgstr ""
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2683,7 +2692,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/es.po b/locale/es.po
index 388a8b3be..db60c9d37 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -287,11 +287,12 @@ msgstr "Todos los timers para este pin están siendo utilizados"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Todos los timers en uso"
@@ -1244,6 +1245,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr "Pull no se usa cuando la dirección es output."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2222,6 +2227,10 @@ msgstr "la función esperaba minimo %d argumentos, tiene %d"
msgid "function got multiple values for argument '%q'"
msgstr "la función tiene múltiples valores para el argumento '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2717,7 +2726,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr "solo se admiten segmentos con step=1 (alias None)"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/fil.po b/locale/fil.po
index 90e650374..6d577823f 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@@ -287,11 +287,12 @@ msgstr "Lahat ng timers para sa pin na ito ay ginagamit"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Lahat ng timer ginagamit"
@@ -1250,6 +1251,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr "Pull hindi ginagamit kapag ang direksyon ay output."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2236,6 +2241,10 @@ msgstr "function na inaasahang %d ang argumento, ngunit %d ang nakuha"
msgid "function got multiple values for argument '%q'"
msgstr "ang function ay nakakuha ng maraming values para sa argument '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2730,7 +2739,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/fr.po b/locale/fr.po
index ee0a05439..4d07eda19 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2019-04-14 20:05+0100\n"
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
"Language-Team: fr\n"
@@ -290,11 +290,12 @@ msgstr "Tous les timers pour cette broche sont utilisés"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Tous les timers sont utilisés"
@@ -1263,6 +1264,10 @@ msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger."
msgid "Pull not used when direction is output."
msgstr "Le tirage 'pull' n'est pas utilisé quand la direction est 'output'."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2261,6 +2266,10 @@ msgstr "la fonction attendait au plus %d arguments, reçu %d"
msgid "function got multiple values for argument '%q'"
msgstr "la fonction a reçu plusieurs valeurs pour l'argument '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2757,7 +2766,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr "seules les tranches avec 'step=1' (cad None) sont supportées"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 7085f9a4b..0c0825e5e 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@@ -286,11 +286,12 @@ msgstr "Tutti i timer per questo pin sono in uso"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Tutti i timer utilizzati"
@@ -1259,6 +1260,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2237,6 +2242,10 @@ msgstr "la funzione prevede al massimo %d argmoneti, ma ne ha ricevuti %d"
msgid "function got multiple values for argument '%q'"
msgstr "la funzione ha ricevuto valori multipli per l'argomento '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2735,7 +2744,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr "solo slice con step=1 (aka None) sono supportate"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/ko.po b/locale/ko.po
index 760010c70..3e3ac1cf6 100644
--- a/locale/ko.po
+++ b/locale/ko.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2019-05-06 14:22-0700\n"
"Last-Translator: \n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -285,11 +285,12 @@ msgstr "핀의 모든 타이머가 사용 중입니다"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "모든 타이머가 사용 중입니다"
@@ -1232,6 +1233,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2196,6 +2201,10 @@ msgstr ""
msgid "function got multiple values for argument '%q'"
msgstr ""
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2684,7 +2693,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/pl.po b/locale/pl.po
index 12881677b..8cc3c30b7 100644
--- a/locale/pl.po
+++ b/locale/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
"Language-Team: pl\n"
@@ -284,11 +284,12 @@ msgstr "Wszystkie timery tej nóżki w użyciu"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Wszystkie timery w użyciu"
@@ -1233,6 +1234,10 @@ msgstr "Dowolny klawisz aby uruchomić konsolę. CTRL-D aby przeładować."
msgid "Pull not used when direction is output."
msgstr "Podciągnięcie nieużywane w trybie wyjścia."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2200,6 +2205,10 @@ msgstr "funkcja bierze najwyżej %d argumentów, jest %d"
msgid "function got multiple values for argument '%q'"
msgstr "funkcja dostała wiele wartości dla argumentu '%q'"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2688,7 +2697,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr "tylko fragmenty ze step=1 (lub None) są wspierane"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index da8276d75..d833169c0 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -286,11 +286,12 @@ msgstr "Todos os temporizadores para este pino estão em uso"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Todos os temporizadores em uso"
@@ -1244,6 +1245,10 @@ msgstr ""
msgid "Pull not used when direction is output."
msgstr ""
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2213,6 +2218,10 @@ msgstr "função esperada na maioria dos %d argumentos, obteve %d"
msgid "function got multiple values for argument '%q'"
msgstr ""
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2701,7 +2710,8 @@ msgstr ""
msgid "only slices with step=1 (aka None) are supported"
msgstr ""
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index 0ca59446f..e7d6df02f 100644
--- a/locale/zh_Latn_pinyin.po
+++ b/locale/zh_Latn_pinyin.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: circuitpython-cn\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-17 18:44-0500\n"
+"POT-Creation-Date: 2020-04-27 18:34-0700\n"
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
"Last-Translator: hexthat\n"
"Language-Team: Chinese Hanyu Pinyin\n"
@@ -290,11 +290,12 @@ msgstr "Cǐ yǐn jiǎo de suǒyǒu jìshí qì zhèngzài shǐyòng"
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
-#: ports/nrf/peripherals/nrf/timers.c shared-bindings/pulseio/PWMOut.c
-#: shared-module/_pew/PewPew.c
+#: ports/nrf/common-hal/pulseio/PulseIn.c ports/nrf/peripherals/nrf/timers.c
+#: shared-bindings/pulseio/PWMOut.c shared-module/_pew/PewPew.c
msgid "All timers in use"
msgstr "Suǒyǒu jìshí qì shǐyòng"
@@ -1247,6 +1248,10 @@ msgstr "Àn xià rènhé jiàn jìnrù REPL. Shǐyòng CTRL-D chóngxīn jiāzà
msgid "Pull not used when direction is output."
msgstr "Fāngxiàng shūchū shí Pull méiyǒu shǐyòng."
+#: ports/stm/common-hal/pulseio/PulseIn.c
+msgid "PulseIn not supported on this chip"
+msgstr ""
+
#: ports/stm/common-hal/pulseio/PulseOut.c
msgid "PulseOut not supported on this chip"
msgstr ""
@@ -2228,6 +2233,10 @@ msgstr "hánshù yùjì zuìduō %d cānshù, huòdé %d"
msgid "function got multiple values for argument '%q'"
msgstr "hánshù huòdé cānshù '%q' de duōchóng zhí"
+#: extmod/ulab/code/compare.c
+msgid "function is implemented for scalars and ndarrays only"
+msgstr ""
+
#: py/argcheck.c
#, c-format
msgid "function missing %d required positional arguments"
@@ -2718,7 +2727,8 @@ msgstr "Jǐn zhīchí cǎiyàng lǜ = 16000"
msgid "only slices with step=1 (aka None) are supported"
msgstr "jǐn zhīchí bù zhǎng = 1(jí wú) de qiēpiàn"
-#: extmod/ulab/code/ndarray.c extmod/ulab/code/vectorise.c
+#: extmod/ulab/code/compare.c extmod/ulab/code/ndarray.c
+#: extmod/ulab/code/vectorise.c
msgid "operands could not be broadcast together"
msgstr ""
diff --git a/main.c b/main.c
index 52870cc8e..c60cded16 100755
--- a/main.c
+++ b/main.c
@@ -428,7 +428,7 @@ int __attribute__((used)) main(void) {
filesystem_init(safe_mode == NO_SAFE_MODE, false);
// displays init after filesystem, since they could share the flash SPI
- board_init();
+ board_init();
// Reset everything and prep MicroPython to run boot.py.
reset_port();
diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile
index 7a626dff7..8a5c3309f 100644
--- a/ports/atmel-samd/Makefile
+++ b/ports/atmel-samd/Makefile
@@ -194,7 +194,6 @@ SRC_ASF := \
hpl/gclk/hpl_gclk.c \
hpl/nvmctrl/hpl_nvmctrl.c \
hpl/pm/hpl_pm.c \
- hpl/rtc/hpl_rtc.c \
hpl/sercom/hpl_sercom.c \
hpl/systick/hpl_systick.c \
hal/utils/src/utils_list.c \
@@ -258,7 +257,6 @@ SRC_C = \
peripherals/samd/timers.c \
reset.c \
supervisor/shared/memory.c \
- tick.c \
timer_handler.c \
@@ -306,7 +304,6 @@ SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE))
# Doing a $(sort ...) removes duplicates as part of sorting.
SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED))
-
SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s
OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
diff --git a/ports/atmel-samd/README.rst b/ports/atmel-samd/README.rst
index b4d208577..721177275 100644
--- a/ports/atmel-samd/README.rst
+++ b/ports/atmel-samd/README.rst
@@ -1,243 +1,21 @@
-SAMD21x18
-=========
+SAMD21 and SAMD51
+==================
-This port brings MicroPython to SAMD21x18 based development boards under the name
-CircuitPython. Supported boards include:
+This port supports many development boards that utilize SAMD21 and SAMD51 chips. See
+https://circuitpython.org/downloads for all supported boards.
-- Adafruit CircuitPlayground Express
-- Adafruit Feather M0 Basic
-- Adafruit Feather M0 Express
-- Adafruit Metro M0 Express
-- Adafruit M0 Bluefruit LE
-- Arduino Zero
-- Arduino MKR Zero
-- Arduino Nano 33 IoT
-
-
-Pinout
-------
-
-All of the boards share the same core pin functionality but call pins by
-different names. The table below matches the pin order in
-`the datasheet <http://ww1.microchip.com/downloads/en/DeviceDoc/40001882A.pdf>`_
-and omits the pins only available on the largest package because all supported
-boards use smaller version.
-
-===================== =================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================
-`microcontroller.pin` `board`
---------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-Datasheet arduino_mkrzero arduino_nano_33_iot arduino_zero circuitplayground_express feather_m0_adalogger feather_m0_basic feather_m0_express gemma_m0 metro_m0_express sparkfun_samd21_mini sparkfun_samd21_dev trinket_m0
-===================== =================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================
-PA00 ``ACCELEROMETER_SDA`` ``APA102_MOSI`` ``APA102_MOSI``
-PA01 ``ACCELEROMETER_SCL`` ``APA102_SCK`` ``APA102_SCK``
-PA02 ``A0`` ``A0`` ``A0`` ``A0`` / ``SPEAKER`` ``A0`` ``A0`` ``A0`` ``A0`` / ``D1`` ``A0`` ``A0`` ``A0`` ``D1`` / ``A0``
-PA03
-PB08 ``L`` ``A4`` / ``SDA`` ``A1`` ``A7`` / ``TX`` ``A1`` ``A1`` ``A1`` ``A1`` ``A1`` ``A1``
-PB09 ``BATTERY`` ``A5`` / ``SCL`` ``A2`` ``A6`` / ``RX`` ``A2`` ``A2`` ``A2`` ``A2`` ``A2`` ``A2``
-PA04 ``A3`` ``D6`` ``A3`` ``IR_PROXIMITY`` ``A3`` ``A3`` ``A3`` ``D0`` / ``TX`` / ``SDA`` ``A3`` ``A3`` ``A3``
-PA05 ``A4`` ``D5`` ``A4`` ``A1`` ``A4`` ``A4`` ``A4`` ``D2`` / ``RX`` / ``SCL`` ``A4`` ``A4``
-PA06 ``A5`` ``D7`` ``D8`` ``A2`` ``D8`` / ``GREEN_LED`` ``NEOPIXEL`` ``D8`` ``D8`` ``D8`` ``D4`` / ``TX``
-PA07 ``A6`` ``D4`` ``D9`` ``A3`` ``D9`` ``D9`` ``D9`` ``D9`` ``D9`` ``D9`` ``D3`` / ``RX``
-PA08 ``D11`` / ``SDA`` ``ESP_RESET`` ``D4`` ``MICROPHONE_DO`` ``D4`` / ``SD_CS`` ``D4`` ``D4`` ``D4`` ``D0`` / ``SDA``
-PA09 ``D12`` / ``SCL`` ``A6`` ``D3`` ``TEMPERATURE`` / ``A9`` ``D3`` ``D3`` ``D3`` ``D2`` / ``SCL``
-PA10 ``D2`` ``A3`` ``D1`` / ``TX`` ``MICROPHONE_SCK`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D13``
-PA11 ``D3`` ``A2`` ``D0`` / ``RX`` ``LIGHT`` / ``A8`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX``
-PB10 ``D4`` ``D2`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI``
-PB11 ``D5`` ``D3`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK``
-PA12 ``SD_MOSI`` ``ESP_MOSI`` ``MISO`` ``REMOTEIN`` / ``IR_RX`` ``MISO`` ``MISO`` ``MISO`` ``MISO`` ``MISO``
-PA13 ``SD_SCK`` ``ESP_MISO`` ``ACCELEROMETER_INTERRUPT`` ``FLASH_CS`` ``D38``
-PA14 ``SD_CS`` ``ESP_CS`` ``D2`` ``BUTTON_B`` / ``D5`` ``D2`` ``D2`` ``D2``
-PA15 ``SD_MISO`` ``ESP_SCK`` ``D5`` ``SLIDE_SWITCH`` / ``D7`` ``D5`` ``D5`` ``D5`` ``D5`` ``D5`` ``D5``
-PA16 ``D8`` / ``MOSI`` ``D11`` / ``MOSI`` ``D11`` ``MISO`` ``D11`` ``D11`` ``D11`` ``D11`` ``D11`` / ``MOSI`` ``D11``
-PA17 ``D9`` / ``SCK`` ``D13`` / ``SCK`` ``D13`` ``D13`` ``D13`` / ``RED_LED`` ``D13`` ``D13`` ``D13`` ``D13`` / ``SCK`` / ``BLUE_LED`` ``D13`` / ``BLUE_LED``
-PA18 ``D8`` ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` ``D10``
-PA19 ``D10`` / ``MISO`` ``D12`` / ``MISO`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12`` / ``MISO`` ``D12``
-PA20 ``D6`` ``D9`` ``D6`` ``MOSI`` ``D6`` ``D6`` ``D6`` ``D6`` ``D6`` ``D6``
-PA21 ``D7`` ``D10`` ``D7`` ``SCK`` ``D7`` / ``SD_CD`` ``D7`` ``D7`` ``D7``
-PA22 ``D0`` ``ESP_TX`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA``
-PA23 ``D1`` ``ESP_RX`` ``SCL`` ``REMOTEOUT`` / ``IR_TX`` ``SCL`` ``SCL`` ``SCL`` ``L`` / ``D13`` ``SCL`` ``SCL`` ``SCL``
-PA24
-PA25
-PB22 ``D14`` / ``TX`` ``D1`` / ``TX`` ``FLASH_CS`` ``D30`` / ``TX1``
-PB23 ``D13`` / ``RX`` ``D0`` / ``RX`` ``NEOPIXEL`` / ``D8`` ``D31`` / ``RX1``
-PA27 ``SD_CD`` ``ESP_GPIO0`` ``GREEN_LED`` ``GREEN_LED``
-PA28 ``ESP_BUSY`` ``BUTTON_A`` / ``D4``
-PA29
-PA30 ``SPEAKER_ENABLE`` ``NEOPIXEL``
-PA31
-PB02 ``A1`` ``A1`` ``A5`` ``A5`` / ``SDA`` ``A5`` ``A5`` ``A5`` ``A5`` ``A5``
-PB03 ``A2`` ``A7`` ``A4`` / ``SCL`` ``YELLOW_LED`` ``YELLOW_LED``
-===================== =================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================
-
-Here is a table about which pins can do what in CircuitPython terms. However,
-just because something is listed, doesn't mean it will always work. Existing use
-of other pins and functionality will impact your ability to use a pin for your
-desired purpose. For example, only certain combinations of SPI pins will work
-because they use shared hardware internally.
-
-===================== ======== ========= ========= ======= ======= ======= ========= ========= ======= ========== ========== ========= ========= ========= ============ ======= ======= =========
-`microcontroller.pin` `analogio` `audioio` `bitbangio` `busio` `digitalio` `pulseio` `touchio`
---------------------- ------------------- --------- ------------------------- -------------------------------------------------------------------------------------- ------------ ---------------- ---------
-Datasheet AnalogIn AnalogOut AudioOut I2C OneWire SPI I2C - SDA I2C - SCL OneWire SPI - MISO SPI - MOSI SPI - SCK UART - RX UART - TX DigitalInOut PulseIn PWMOut TouchIn
-===================== ======== ========= ========= ======= ======= ======= ========= ========= ======= ========== ========== ========= ========= ========= ============ ======= ======= =========
-PA00 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA01 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA02 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA03 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB08 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB09 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA04 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA05 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA06 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA07 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA08 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA09 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA10 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA11 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB10 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB11 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA12 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA13 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA14 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA15 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA16 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA17 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA18 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA19 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA20 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA21 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA22 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA23 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA24
-PA25
-PB22 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB23 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA27 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA28 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA29 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA30 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PA31 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB02 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-PB03 **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes**
-===================== ======== ========= ========= ======= ======= ======= ========= ========= ======= ========== ========== ========= ========= ========= ============ ======= ======= =========
-
-Setup
------
-
-An ARM compiler is required for the build, along with the associated binary
-utilities. They can be installed as follows:
-
-- Ubuntu
-
- .. code-block:: shell
-
- sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
- sudo apt-get install gcc-arm-embedded
-
-- Arch Linux
-
- .. code-block:: shell
-
- sudo pacman -S arm-none-eabi-gcc arm-none-eabi-newlib
-
-For other systems, the `GNU Arm Embedded Toolchain <https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads>`_
-may be available in binary form.
-
-The latest available package from team-gcc-arm-embedded is used to produce the
-binaries shipped by AdaFruit. Other compiler versions, particularly older
-ones, may not work properly. In particular, the ``gcc-arm-none-eabi`` package
-in Debian Stretch is too old.
-
-The compiler can be changed using the ``CROSS_COMPILE`` variable when invoking
-``make``.
Building
--------
-Before building the firmware for a given board, there are two additional steps.
-These commands should be executed from the root directory of the repository
-(``circuitpython/``).
-
-1. There are various submodules that reside in different repositories. In order
- to have these submodules locally, you must pull them into your clone, using:
-
-.. code-block:: shell
-
- git submodule update --init --recursive
-
-2. The MicroPython cross-compiler must be built; it will be used to pre-compile
- some of the built-in scripts to bytecode. The cross-compiler is built and
- run on the host machine, using:
+For build instructions see this guide: https://learn.adafruit.com/building-circuitpython/
-.. code-block:: shell
- make -C mpy-cross
-
-
-Build commands are run from the ``circuitpython/ports/atmel-samd`` directory.
-
-To build for a given board you must specify it by setting ``BOARD``. For example:
-
-.. code-block:: shell
-
- make BOARD=feather_m0_basic
-
-Board names are the directory names in the `boards <https://github.com/adafruit/circuitpython/tree/master/ports/atmel-samd/boards>`_ folder.
-
-Deploying
+Debugging
---------
-Arduino Bootloader
-^^^^^^^^^^^^^^^^^^
-
-If your board has an existing Arduino bootloader on it then you can use bossac
-to flash MicroPython. First, activate the bootloader. On Adafruit Feathers you
-can double click the reset button and the #13 will fade in and out. Finally,
-run bossac:
-
- tools/bossac_osx -e -w -v -b -R build-feather_m0_basic/firmware.bin
-
-No Bootloader via GDB
-^^^^^^^^^^^^^^^^^^^^^
-
-This method works for loading MicroPython onto the Arduino Zero via the
-programming port rather than the native USB port.
-
-Note: These instructions are tested on Mac OSX and will vary for different
-platforms.
-
- openocd -f ~/Library/Arduino15/packages/arduino/hardware/samd/1.6.6/variants/arduino_zero/openocd_scripts/arduino_zero.cfg
-
-In another terminal from ``micropython/atmel-samd``:
-
- arm-none-eabi-gdb build-arduino_zero/firmware.elf
- (gdb) tar ext :3333
- ...
- (gdb) load
- ...
- (gdb) monitor reset init
- ...
- (gdb) continue
-
-Connecting
-----------
-
-Serial
-^^^^^^
-
-All boards are currently configured to work over USB rather than UART. To
-connect to it from OSX do something like this:
-
- screen /dev/tty.usbmodem142422 115200
-
-You may not see a prompt immediately because it doesn't know you connected. To
-get one either hit enter to get `>>>` or do CTRL-B to get the full header.
-
-Mass storage
-^^^^^^^^^^^^
+For debugging instructions see this guide: https://learn.adafruit.com/debugging-the-samd21-with-gdb
-All boards will also show up as a mass storage device. Make sure to eject it
-before resetting or disconnecting the board.
Port Specific modules
---------------------
diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c
index ca91a31de..767c7f3b6 100644
--- a/ports/atmel-samd/background.c
+++ b/ports/atmel-samd/background.c
@@ -26,7 +26,6 @@
#include "background.h"
#include "audio_dma.h"
-#include "tick.h"
#include "supervisor/filesystem.h"
#include "supervisor/shared/tick.h"
#include "supervisor/usb.h"
@@ -34,6 +33,7 @@
#include "py/runtime.h"
#include "shared-module/network/__init__.h"
#include "supervisor/shared/stack.h"
+#include "supervisor/port.h"
#ifdef CIRCUITPY_DISPLAYIO
#include "shared-module/displayio/__init__.h"
@@ -92,10 +92,10 @@ void run_background_tasks(void) {
running_background_tasks = false;
assert_heap_ok();
- last_finished_tick = supervisor_ticks_ms64();
+ last_finished_tick = port_get_raw_ticks(NULL);
finish_background_task();
}
bool background_tasks_ok(void) {
- return supervisor_ticks_ms64() - last_finished_tick < 1000;
+ return port_get_raw_ticks(NULL) - last_finished_tick < 1024;
}
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index 1516c149b..c5ef958c9 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -12,10 +12,11 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
# Turn off features and optimizations for Crickit build to make room for additional frozen libs.
LONGINT_IMPL = NONE
+CIRCUITPY_BITBANGIO = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_I2CSLAVE = 0
-CIRCUITPY_PIXELBUF = 0
+CIRCUITPY_PIXELBUF = 1
CIRCUITPY_RTC = 0
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c
index 9a1db9ca9..4717e6ceb 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/board.c
+++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c
@@ -32,8 +32,6 @@
#include "shared-module/displayio/mipi_constants.h"
#include "shared-bindings/busio/SPI.h"
-#include "tick.h"
-
displayio_fourwire_obj_t board_display_obj;
#define DELAY 0x80
diff --git a/ports/atmel-samd/boards/hallowing_m4_express/board.c b/ports/atmel-samd/boards/hallowing_m4_express/board.c
index 3e4a04ae2..7da1d8128 100644
--- a/ports/atmel-samd/boards/hallowing_m4_express/board.c
+++ b/ports/atmel-samd/boards/hallowing_m4_express/board.c
@@ -31,7 +31,6 @@
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/monster_m4sk/board.c b/ports/atmel-samd/boards/monster_m4sk/board.c
index 55d6f80c9..4dd65f8c9 100644
--- a/ports/atmel-samd/boards/monster_m4sk/board.c
+++ b/ports/atmel-samd/boards/monster_m4sk/board.c
@@ -31,7 +31,6 @@
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/openbook_m4/board.c b/ports/atmel-samd/boards/openbook_m4/board.c
index 02270e7e5..9c71ee564 100644
--- a/ports/atmel-samd/boards/openbook_m4/board.c
+++ b/ports/atmel-samd/boards/openbook_m4/board.c
@@ -32,7 +32,6 @@
#include "shared-bindings/time/__init__.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pewpew_m4/board.c b/ports/atmel-samd/boards/pewpew_m4/board.c
index bfec489e7..52a52b4b7 100644
--- a/ports/atmel-samd/boards/pewpew_m4/board.c
+++ b/ports/atmel-samd/boards/pewpew_m4/board.c
@@ -32,7 +32,6 @@
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c
index ffddf0397..45298acc2 100644
--- a/ports/atmel-samd/boards/pybadge/board.c
+++ b/ports/atmel-samd/boards/pybadge/board.c
@@ -32,7 +32,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
#include "supervisor/shared/board.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pybadge_airlift/board.c b/ports/atmel-samd/boards/pybadge_airlift/board.c
index 8274d0ebe..7495c7d48 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/board.c
+++ b/ports/atmel-samd/boards/pybadge_airlift/board.c
@@ -32,7 +32,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
#include "supervisor/shared/board.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pygamer/board.c b/ports/atmel-samd/boards/pygamer/board.c
index c7f2f6e1d..2e83440ea 100644
--- a/ports/atmel-samd/boards/pygamer/board.c
+++ b/ports/atmel-samd/boards/pygamer/board.c
@@ -32,7 +32,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
#include "supervisor/shared/board.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pygamer_advance/board.c b/ports/atmel-samd/boards/pygamer_advance/board.c
index 6053fedb0..330446b6f 100644
--- a/ports/atmel-samd/boards/pygamer_advance/board.c
+++ b/ports/atmel-samd/boards/pygamer_advance/board.c
@@ -32,7 +32,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
#include "supervisor/shared/board.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c
index ed3006e3c..d14b6b6a5 100644
--- a/ports/atmel-samd/boards/pyportal/board.c
+++ b/ports/atmel-samd/boards/pyportal/board.c
@@ -31,8 +31,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
-
#define DELAY 0x80
uint8_t display_init_sequence[] = {
diff --git a/ports/atmel-samd/boards/pyportal_titano/board.c b/ports/atmel-samd/boards/pyportal_titano/board.c
index e7763b6e5..0ee2e68aa 100644
--- a/ports/atmel-samd/boards/pyportal_titano/board.c
+++ b/ports/atmel-samd/boards/pyportal_titano/board.c
@@ -34,8 +34,6 @@
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
-
#define DELAY 0x80
uint8_t display_init_sequence[] = {
diff --git a/ports/atmel-samd/boards/ugame10/board.c b/ports/atmel-samd/boards/ugame10/board.c
index d3a452119..3bb9eab7d 100644
--- a/ports/atmel-samd/boards/ugame10/board.c
+++ b/ports/atmel-samd/boards/ugame10/board.c
@@ -33,8 +33,6 @@
#include "shared-module/displayio/mipi_constants.h"
#include "shared-bindings/busio/SPI.h"
-#include "tick.h"
-
displayio_fourwire_obj_t board_display_obj;
#define DELAY 0x80
diff --git a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
index 76e66ab45..a1e35a1dc 100644
--- a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+++ b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
@@ -49,7 +49,6 @@
#include "samd/dma.h"
#include "audio_dma.h"
-#include "tick.h"
#define OVERSAMPLING 64
#define SAMPLES_PER_BUFFER 32
diff --git a/ports/atmel-samd/common-hal/displayio/ParallelBus.c b/ports/atmel-samd/common-hal/displayio/ParallelBus.c
index 2479e3b40..405c08c64 100644
--- a/ports/atmel-samd/common-hal/displayio/ParallelBus.c
+++ b/ports/atmel-samd/common-hal/displayio/ParallelBus.c
@@ -33,8 +33,6 @@
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "tick.h"
-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
diff --git a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
index cbb067104..fcb3c0ce7 100644
--- a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+++ b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
@@ -24,11 +24,12 @@
* THE SOFTWARE.
*/
+#include "shared-bindings/frequencyio/FrequencyIn.h"
+
#include <stdint.h>
#include "hal/include/hal_gpio.h"
#include "atmel_start_pins.h"
-#include "supervisor/shared/translate.h"
#include "mpconfigport.h"
#include "py/runtime.h"
@@ -41,11 +42,11 @@
#include "samd/pins.h"
#include "samd/external_interrupts.h"
-#include "shared-bindings/frequencyio/FrequencyIn.h"
#include "peripheral_clk_config.h"
#include "hpl_gclk_config.h"
-#include "tick.h"
+#include "shared-bindings/time/__init__.h"
+#include "supervisor/shared/translate.h"
#ifdef SAMD21
#include "hpl/gclk/hpl_gclk_base.h"
@@ -88,9 +89,7 @@ void frequencyin_interrupt_handler(uint8_t index) {
if (!ref_tc->COUNT16.INTFLAG.bit.OVF) return; // false trigger
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
+ uint64_t current_ns = common_hal_time_monotonic_ns();
for (uint8_t i = 0; i <= (TC_INST_NUM - 1); i++) {
if (active_frequencyins[i] != NULL) {
@@ -101,14 +100,12 @@ void frequencyin_interrupt_handler(uint8_t index) {
if ((EIC->INTFLAG.reg & mask) == mask) {
// Make sure capture_period has elapsed before we
// record a new event count.
- if (current_ms - self->last_ms >= self->capture_period) {
- float new_factor = self->last_us + (1000 - current_us);
+ if ((current_ns - self->last_ns) / 1000000 >= self->capture_period) {
// ms difference will not need 64 bits. If we use 64 bits,
// double-precision float routines are required, and we don't
// want to include them because they're very large.
- self->factor = (uint32_t) (current_ms - self->last_ms) + (new_factor / 1000);
- self->last_ms = current_ms;
- self->last_us = current_us;
+ self->factor = (uint32_t) (current_ns - self->last_ns) / 1000000.0;
+ self->last_ns = current_ns;
#ifdef SAMD51
tc->COUNT16.CTRLBSET.bit.CMD = TC_CTRLBSET_CMD_READSYNC_Val;
@@ -278,8 +275,7 @@ void common_hal_frequencyio_frequencyin_construct(frequencyio_frequencyin_obj_t*
self->pin = pin->number;
self->channel = pin->extint_channel;
self->errored_too_fast = false;
- self->last_ms = 0;
- self->last_us = 1000;
+ self->last_ns = 0;
self->capture_period = capture_period;
#ifdef SAMD21
self->TC_IRQ = TC3_IRQn + timer_index;
diff --git a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h
index abd63cc86..461fb661f 100644
--- a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h
+++ b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h
@@ -38,8 +38,7 @@ typedef struct {
uint8_t channel;
uint8_t event_channel;
uint32_t frequency;
- volatile uint64_t last_ms;
- volatile uint32_t last_us;
+ volatile uint64_t last_ns;
float factor;
uint32_t capture_period;
uint8_t TC_IRQ;
diff --git a/ports/atmel-samd/common-hal/neopixel_write/__init__.c b/ports/atmel-samd/common-hal/neopixel_write/__init__.c
index ba69174af..175527025 100644
--- a/ports/atmel-samd/common-hal/neopixel_write/__init__.c
+++ b/ports/atmel-samd/common-hal/neopixel_write/__init__.c
@@ -29,7 +29,7 @@
#include "shared-bindings/neopixel_write/__init__.h"
-#include "tick.h"
+#include "supervisor/port.h"
#ifdef SAMD51
#include "hri/hri_cmcc_d51.h"
@@ -91,8 +91,7 @@ static void neopixel_send_buffer_core(volatile uint32_t *clraddr, uint32_t pinMa
"");
}
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t numBytes) {
// This is adapted directly from the Adafruit NeoPixel library SAMD21G18A code:
@@ -101,9 +100,9 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
uint32_t pinMask;
PortGroup* port;
- // This must be called while interrupts are on in case we're waiting for a
- // future ms tick.
- wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
// Turn off interrupts of any kind during timing-sensitive code.
mp_hal_disable_all_interrupts();
@@ -144,15 +143,8 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* digitalinout,
#endif
- // ticks_ms may be out of date at this point because we stopped the
- // interrupt. We'll risk it anyway.
- current_tick(&next_start_tick_ms, &next_start_tick_us);
- if (next_start_tick_us < 100) {
- next_start_tick_ms += 1;
- next_start_tick_us = 100 - next_start_tick_us;
- } else {
- next_start_tick_us -= 100;
- }
+ // Update the next start.
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
// Turn on interrupts after timing-sensitive code.
mp_hal_enable_all_interrupts();
diff --git a/ports/atmel-samd/common-hal/ps2io/Ps2.c b/ports/atmel-samd/common-hal/ps2io/Ps2.c
index 6a06864f2..2579142ad 100644
--- a/ports/atmel-samd/common-hal/ps2io/Ps2.c
+++ b/ports/atmel-samd/common-hal/ps2io/Ps2.c
@@ -41,10 +41,9 @@
#include "samd/pins.h"
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/ps2io/Ps2.h"
+#include "supervisor/port.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
-
#define STATE_IDLE 0
#define STATE_RECV 1
#define STATE_RECV_PARITY 2
@@ -168,24 +167,21 @@ static void delay_us(uint32_t t) {
void ps2_interrupt_handler(uint8_t channel) {
// Grab the current time first.
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
+ uint64_t current_tick = port_get_raw_ticks(NULL);
ps2io_ps2_obj_t* self = get_eic_channel_data(channel);
int data_bit = gpio_get_pin_level(self->data_pin) ? 1 : 0;
// test for timeout
if (self->state != STATE_IDLE) {
- int64_t diff_ms = current_ms - self->last_int_ms;
- if (diff_ms >= 2) { // a.k.a. > 1.001ms
+ int64_t diff_ms = current_tick - self->last_raw_ticks;
+ if (diff_ms > 1) { // a.k.a. > 1.001ms
self->last_errors |= ERROR_TIMEOUT;
self->state = STATE_IDLE;
}
}
- self->last_int_us = current_us;
- self->last_int_ms = current_ms;
+ self->last_raw_ticks = current_tick;
if (self->state == STATE_IDLE) {
self->bits = 0;
diff --git a/ports/atmel-samd/common-hal/ps2io/Ps2.h b/ports/atmel-samd/common-hal/ps2io/Ps2.h
index cce6ae474..588dfdd8b 100644
--- a/ports/atmel-samd/common-hal/ps2io/Ps2.h
+++ b/ports/atmel-samd/common-hal/ps2io/Ps2.h
@@ -39,8 +39,7 @@ typedef struct {
uint8_t data_pin;
uint8_t state;
- uint64_t last_int_ms;
- uint32_t last_int_us;
+ uint64_t last_raw_ticks;
uint16_t bits;
bool parity;
diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.c b/ports/atmel-samd/common-hal/pulseio/PulseIn.c
index a2494f102..508ee8d38 100644
--- a/ports/atmel-samd/common-hal/pulseio/PulseIn.c
+++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.c
@@ -34,15 +34,31 @@
#include "background.h"
#include "eic_handler.h"
#include "mpconfigport.h"
+#include "timer_handler.h"
#include "py/gc.h"
#include "py/runtime.h"
#include "samd/external_interrupts.h"
#include "samd/pins.h"
+#include "samd/timers.h"
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/pulseio/PulseIn.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
+// This timer is shared amongst all PulseIn objects as a higher resolution clock.
+static uint8_t refcount = 0;
+static uint8_t pulsein_tc_index = 0xff;
+
+volatile static uint32_t overflow_count = 0;
+
+void pulsein_timer_interrupt_handler(uint8_t index) {
+ if (index != pulsein_tc_index) return;
+ overflow_count++;
+ Tc* tc = tc_insts[index];
+ if (!tc->COUNT16.INTFLAG.bit.OVF) return;
+
+ // Clear the interrupt bit.
+ tc->COUNT16.INTFLAG.reg = TC_INTFLAG_OVF;
+}
static void pulsein_set_config(pulseio_pulsein_obj_t* self, bool first_edge) {
uint32_t sense_setting;
@@ -61,13 +77,15 @@ static void pulsein_set_config(pulseio_pulsein_obj_t* self, bool first_edge) {
void pulsein_interrupt_handler(uint8_t channel) {
// Grab the current time first.
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
+ uint32_t current_overflow = overflow_count;
+ Tc* tc = tc_insts[pulsein_tc_index];
+ #ifdef SAMD51
+ tc->COUNT16.CTRLBSET.reg = TC_CTRLBSET_CMD_READSYNC;
+ while (tc->COUNT16.SYNCBUSY.bit.COUNT == 1 ||
+ tc->COUNT16.CTRLBSET.bit.CMD == TC_CTRLBSET_CMD_READSYNC_Val) {}
+ #endif
+ uint32_t current_count = tc->COUNT16.COUNT.reg;
- // current_tick gives us the remaining us until the next tick but we want the number since the
- // last ms.
- current_us = 1000 - current_us;
pulseio_pulsein_obj_t* self = get_eic_channel_data(channel);
if (!background_tasks_ok() || self->errored_too_fast) {
self->errored_too_fast = true;
@@ -78,17 +96,17 @@ void pulsein_interrupt_handler(uint8_t channel) {
self->first_edge = false;
pulsein_set_config(self, false);
} else {
- uint32_t ms_diff = current_ms - self->last_ms;
- uint16_t us_diff = current_us - self->last_us;
- uint32_t total_diff = us_diff;
- if (self->last_us > current_us) {
- total_diff = 1000 + current_us - self->last_us;
- if (ms_diff > 1) {
- total_diff += (ms_diff - 1) * 1000;
- }
- } else {
- total_diff += ms_diff * 1000;
+ // Sometimes we beat the overflow interrupt so just fudge overflow in
+ // that case.
+ if (current_count < self->last_count && current_overflow == self->last_overflow) {
+ current_overflow += 1;
}
+ uint32_t total_diff = current_count + 0xffff * (current_overflow - self->last_overflow) - self->last_count;
+ // The SAMD21 clock is 48MHz. We prescale it to 3MHz so // 3 here.
+ #ifdef SAMD21
+ total_diff /= 3;
+ #endif
+ // Cap duration at 16 bits.
uint16_t duration = 0xffff;
if (total_diff < duration) {
duration = total_diff;
@@ -102,8 +120,14 @@ void pulsein_interrupt_handler(uint8_t channel) {
self->start++;
}
}
- self->last_ms = current_ms;
- self->last_us = current_us;
+ self->last_overflow = current_overflow;
+ self->last_count = current_count;
+}
+
+void pulsein_reset() {
+ refcount = 0;
+ pulsein_tc_index = 0xff;
+ overflow_count = 0;
}
void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
@@ -126,10 +150,62 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
self->start = 0;
self->len = 0;
self->first_edge = true;
- self->last_us = 0;
- self->last_ms = 0;
self->errored_too_fast = false;
+ if (refcount == 0) {
+ // Find a spare timer.
+ Tc *tc = NULL;
+ int8_t index = TC_INST_NUM - 1;
+ for (; index >= 0; index--) {
+ if (tc_insts[index]->COUNT16.CTRLA.bit.ENABLE == 0) {
+ tc = tc_insts[index];
+ break;
+ }
+ }
+ if (tc == NULL) {
+ mp_raise_RuntimeError(translate("All timers in use"));
+ }
+
+ pulsein_tc_index = index;
+
+ set_timer_handler(true, index, TC_HANDLER_PULSEIN);
+ #ifdef SAMD21
+ // We use GCLK0 for SAMD21 which is 48MHz. We prescale it to 3MHz.
+ turn_on_clocks(true, index, 0);
+ #endif
+ #ifdef SAMD51
+ // We use GCLK5 for SAMD51 because it runs at 2MHz and we can use it for a 1MHz clock,
+ // 1us per tick.
+ turn_on_clocks(true, index, 5);
+ #endif
+
+
+ #ifdef SAMD21
+ tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 |
+ TC_CTRLA_PRESCALER_DIV16 |
+ TC_CTRLA_WAVEGEN_NFRQ;
+ #endif
+ #ifdef SAMD51
+ tc_reset(tc);
+ tc_set_enable(tc, false);
+ tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | TC_CTRLA_PRESCALER_DIV2;
+ tc->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_NFRQ;
+ #endif
+
+ tc_set_enable(tc, true);
+
+ // Clear our interrupt in case it was set earlier
+ tc->COUNT16.INTFLAG.reg = TC_INTFLAG_OVF;
+ tc->COUNT16.INTENSET.reg = TC_INTENSET_OVF;
+ tc_enable_interrupts(pulsein_tc_index);
+ tc->COUNT16.CTRLBSET.reg = TC_CTRLBSET_CMD_RETRIGGER;
+
+ overflow_count = 0;
+ }
+ refcount++;
+ self->last_overflow = overflow_count;
+ self->last_count = 0;
+
set_eic_channel_data(pin->extint_channel, (void*) self);
// Check to see if the EIC is enabled and start it up if its not.'
@@ -158,6 +234,12 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
set_eic_handler(self->channel, EIC_HANDLER_NO_INTERRUPT);
turn_off_eic_channel(self->channel);
reset_pin_number(self->pin);
+
+ refcount--;
+ if (refcount == 0) {
+ tc_reset(tc_insts[pulsein_tc_index]);
+ pulsein_tc_index = 0xff;
+ }
self->pin = NO_PIN;
}
@@ -185,8 +267,8 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self,
// Reconfigure the pin and make sure its set to detect the first edge.
self->first_edge = true;
- self->last_ms = 0;
- self->last_us = 0;
+ self->last_overflow = 0;
+ self->last_count = 0;
gpio_set_pin_function(self->pin, GPIO_PIN_FUNCTION_A);
uint32_t mask = 1 << self->channel;
// Clear previous interrupt state and re-enable it.
diff --git a/ports/atmel-samd/common-hal/pulseio/PulseIn.h b/ports/atmel-samd/common-hal/pulseio/PulseIn.h
index f5326d9e5..89b61a83a 100644
--- a/ports/atmel-samd/common-hal/pulseio/PulseIn.h
+++ b/ports/atmel-samd/common-hal/pulseio/PulseIn.h
@@ -41,13 +41,14 @@ typedef struct {
volatile uint16_t start;
volatile uint16_t len;
volatile bool first_edge;
- volatile uint64_t last_ms;
- volatile uint16_t last_us;
+ volatile uint32_t last_overflow;
+ volatile uint16_t last_count;
volatile bool errored_too_fast;
} pulseio_pulsein_obj_t;
void pulsein_reset(void);
void pulsein_interrupt_handler(uint8_t channel);
+void pulsein_timer_interrupt_handler(uint8_t index);
#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEIN_H
diff --git a/ports/atmel-samd/common-hal/rtc/RTC.c b/ports/atmel-samd/common-hal/rtc/RTC.c
index 4c888418b..203187b4f 100644
--- a/ports/atmel-samd/common-hal/rtc/RTC.c
+++ b/ports/atmel-samd/common-hal/rtc/RTC.c
@@ -30,76 +30,47 @@
#include <hal_init.h>
#include <hpl_gclk_base.h>
#include <hpl_pm_base.h>
-#include <hal_calendar.h>
#include "py/obj.h"
#include "py/runtime.h"
#include "lib/timeutils/timeutils.h"
#include "shared-bindings/rtc/__init__.h"
+#include "supervisor/port.h"
#include "supervisor/shared/translate.h"
-static struct calendar_descriptor calendar;
-
-void rtc_init(void) {
-#ifdef SAMD21
- _gclk_enable_channel(RTC_GCLK_ID, CONF_GCLK_RTC_SRC);
-#endif
-#ifdef SAMD51
- hri_mclk_set_APBAMASK_RTC_bit(MCLK);
-#endif
- calendar_init(&calendar, RTC);
- calendar_set_baseyear(&calendar, 2000);
- calendar_enable(&calendar);
-}
+// This is the time in seconds since 2000 that the RTC was started.
+// TODO: Change the offset to ticks so that it can be a subsecond adjustment.
+static uint32_t rtc_offset = 0;
void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
- struct calendar_date_time datetime;
- calendar_get_date_time(&calendar, &datetime);
-
- tm->tm_year = datetime.date.year;
- tm->tm_mon = datetime.date.month;
- tm->tm_mday = datetime.date.day;
- tm->tm_hour = datetime.time.hour;
- tm->tm_min = datetime.time.min;
- tm->tm_sec = datetime.time.sec;
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
+ timeutils_seconds_since_2000_to_struct_time(rtc_offset + ticks_s, tm);
}
void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
- // Reset prescaler to increase initial precision. Otherwise we can be up to 1 second off already.
- uint32_t freqcorr = hri_rtcmode0_read_FREQCORR_reg(calendar.device.hw);
- calendar_deinit(&calendar);
- rtc_init();
- hri_rtcmode0_write_FREQCORR_reg(calendar.device.hw, freqcorr);
-
- struct calendar_date date = {
- .year = tm->tm_year,
- .month = tm->tm_mon,
- .day = tm->tm_mday,
- };
- calendar_set_date(&calendar, &date);
-
- struct calendar_time time = {
- .hour = tm->tm_hour,
- .min = tm->tm_min,
- .sec = tm->tm_sec,
- };
- calendar_set_time(&calendar, &time);
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
+ uint32_t epoch_s = timeutils_seconds_since_2000(
+ tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec
+ );
+ rtc_offset = epoch_s - ticks_s;
}
// A positive value speeds up the clock by removing clock cycles.
int common_hal_rtc_get_calibration(void) {
- int calibration = hri_rtcmode0_read_FREQCORR_VALUE_bf(calendar.device.hw);
+ int calibration = hri_rtcmode0_read_FREQCORR_VALUE_bf(RTC);
- if (!hri_rtcmode0_get_FREQCORR_SIGN_bit(calendar.device.hw))
+ if (!hri_rtcmode0_get_FREQCORR_SIGN_bit(RTC)) {
calibration = -calibration;
+ }
return calibration;
}
void common_hal_rtc_set_calibration(int calibration) {
- if (calibration > 127 || calibration < -127)
+ if (calibration > 127 || calibration < -127) {
mp_raise_ValueError(translate("calibration value out of range +/-127"));
+ }
- hri_rtcmode0_write_FREQCORR_SIGN_bit(calendar.device.hw, calibration < 0 ? 0 : 1);
- hri_rtcmode0_write_FREQCORR_VALUE_bf(calendar.device.hw, abs(calibration));
+ hri_rtcmode0_write_FREQCORR_SIGN_bit(RTC, calibration < 0 ? 0 : 1);
+ hri_rtcmode0_write_FREQCORR_VALUE_bf(RTC, abs(calibration));
}
diff --git a/ports/atmel-samd/common-hal/rtc/RTC.h b/ports/atmel-samd/common-hal/rtc/RTC.h
index 1d63b2dea..19cbc0b5c 100644
--- a/ports/atmel-samd/common-hal/rtc/RTC.h
+++ b/ports/atmel-samd/common-hal/rtc/RTC.h
@@ -27,6 +27,4 @@
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RTC_RTC_H
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RTC_RTC_H
-extern void rtc_init(void);
-
#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RTC_RTC_H
diff --git a/ports/atmel-samd/common-hal/touchio/TouchIn.c b/ports/atmel-samd/common-hal/touchio/TouchIn.c
index 908d8d722..b2fcc6cde 100644
--- a/ports/atmel-samd/common-hal/touchio/TouchIn.c
+++ b/ports/atmel-samd/common-hal/touchio/TouchIn.c
@@ -42,7 +42,6 @@
#include "samd/clocks.h"
#include "samd/pins.h"
-#include "tick.h"
#include "adafruit_ptc.h"
bool touch_enabled = false;
diff --git a/ports/atmel-samd/mphalport.c b/ports/atmel-samd/mphalport.c
index 96433d729..23a9b4330 100644
--- a/ports/atmel-samd/mphalport.c
+++ b/ports/atmel-samd/mphalport.c
@@ -49,21 +49,6 @@
extern uint32_t common_hal_mcu_processor_get_frequency(void);
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- RUN_BACKGROUND_TASKS;
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
-
// Use mp_hal_delay_us() for timing of less than 1ms.
// Do a simple timing loop to wait for a certain number of microseconds.
// Can be used when interrupts are disabled, which makes tick_delay() unreliable.
diff --git a/ports/atmel-samd/mphalport.h b/ports/atmel-samd/mphalport.h
index 8a762e258..f11971749 100644
--- a/ports/atmel-samd/mphalport.h
+++ b/ports/atmel-samd/mphalport.h
@@ -34,9 +34,8 @@
#include "supervisor/shared/tick.h"
// Global millisecond tick count (driven by SysTick interrupt).
-static inline mp_uint_t mp_hal_ticks_ms(void) {
- return supervisor_ticks_ms32();
-}
+#define mp_hal_ticks_ms() ((mp_uint_t) supervisor_ticks_ms32())
+
// Number of bytes in receive buffer
volatile uint8_t usb_rx_count;
volatile bool mp_cdc_enabled;
diff --git a/ports/atmel-samd/peripherals b/ports/atmel-samd/peripherals
-Subproject f528240c2a4c2d7a39de786f1aa56895c12227b
+Subproject 6b531fc923d9f02b14bd731a5f584ddf716e877
diff --git a/ports/atmel-samd/supervisor/internal_flash.c b/ports/atmel-samd/supervisor/internal_flash.c
index a8ff5adfa..9c8ff990e 100644
--- a/ports/atmel-samd/supervisor/internal_flash.c
+++ b/ports/atmel-samd/supervisor/internal_flash.c
@@ -41,6 +41,7 @@
#endif
#include "hal/include/hal_flash.h"
+#include "supervisor/flash.h"
#include "supervisor/shared/rgb_led_status.h"
static struct flash_descriptor supervisor_flash_desc;
@@ -73,7 +74,7 @@ uint32_t supervisor_flash_get_block_count(void) {
return INTERNAL_FLASH_PART1_NUM_BLOCKS;
}
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
}
void supervisor_flash_release_cache(void) {
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index 01ca797ca..b3903bb86 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -32,6 +32,7 @@
// ASF 4
#include "atmel_start_pins.h"
+#include "peripheral_clk_config.h"
#include "hal/include/hal_delay.h"
#include "hal/include/hal_flash.h"
#include "hal/include/hal_gpio.h"
@@ -70,10 +71,10 @@
#include "samd/dma.h"
#include "shared-bindings/rtc/__init__.h"
#include "reset.h"
-#include "tick.h"
#include "supervisor/shared/safe_mode.h"
#include "supervisor/shared/stack.h"
+#include "supervisor/shared/tick.h"
#include "tusb.h"
@@ -132,6 +133,49 @@ static void save_usb_clock_calibration(void) {
}
#endif
+static void rtc_init(void) {
+#ifdef SAMD21
+ _gclk_enable_channel(RTC_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK2_Val);
+ RTC->MODE0.CTRL.bit.SWRST = true;
+ while (RTC->MODE0.CTRL.bit.SWRST != 0) {}
+
+ RTC->MODE0.CTRL.reg = RTC_MODE0_CTRL_ENABLE |
+ RTC_MODE0_CTRL_MODE_COUNT32 |
+ RTC_MODE0_CTRL_PRESCALER_DIV2;
+#endif
+#ifdef SAMD51
+ hri_mclk_set_APBAMASK_RTC_bit(MCLK);
+ RTC->MODE0.CTRLA.bit.SWRST = true;
+ while (RTC->MODE0.SYNCBUSY.bit.SWRST != 0) {}
+
+ RTC->MODE0.CTRLA.reg = RTC_MODE0_CTRLA_ENABLE |
+ RTC_MODE0_CTRLA_MODE_COUNT32 |
+ RTC_MODE0_CTRLA_PRESCALER_DIV2 |
+ RTC_MODE0_CTRLA_COUNTSYNC;
+#endif
+
+ RTC->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_OVF;
+
+ // Set all peripheral interrupt priorities to the lowest priority by default.
+ for (uint16_t i = 0; i < PERIPH_COUNT_IRQn; i++) {
+ NVIC_SetPriority(i, (1UL << __NVIC_PRIO_BITS) - 1UL);
+ }
+ // Bump up the rtc interrupt so nothing else interferes with timekeeping.
+ NVIC_SetPriority(RTC_IRQn, 0);
+ #ifdef SAMD21
+ NVIC_SetPriority(USB_IRQn, 1);
+ #endif
+
+ #ifdef SAMD51
+ NVIC_SetPriority(USB_0_IRQn, 1);
+ NVIC_SetPriority(USB_1_IRQn, 1);
+ NVIC_SetPriority(USB_2_IRQn, 1);
+ NVIC_SetPriority(USB_3_IRQn, 1);
+ #endif
+ NVIC_ClearPendingIRQ(RTC_IRQn);
+ NVIC_EnableIRQ(RTC_IRQn);
+}
+
safe_mode_t port_init(void) {
#if defined(SAMD21)
@@ -220,12 +264,7 @@ safe_mode_t port_init(void) {
clock_init(BOARD_HAS_CRYSTAL, DEFAULT_DFLL48M_FINE_CALIBRATION);
#endif
- // Configure millisecond timer initialization.
- tick_init();
-
-#if CIRCUITPY_RTC
rtc_init();
-#endif
init_shared_dma();
@@ -267,6 +306,7 @@ void reset_port(void) {
#endif
eic_reset();
#if CIRCUITPY_PULSEIO
+ pulsein_reset();
pulseout_reset();
pwmout_reset();
#endif
@@ -275,9 +315,6 @@ void reset_port(void) {
analogin_reset();
analogout_reset();
#endif
-#if CIRCUITPY_RTC
- rtc_reset();
-#endif
reset_gclks();
@@ -352,6 +389,108 @@ uint32_t port_get_saved_word(void) {
return *safe_word;
}
+// TODO: Move this to an RTC backup register so we can preserve it when only the BACKUP power domain
+// is enabled.
+static volatile uint64_t overflowed_ticks = 0;
+static volatile bool _ticks_enabled = false;
+
+void RTC_Handler(void) {
+ uint32_t intflag = RTC->MODE0.INTFLAG.reg;
+ if (intflag & RTC_MODE0_INTFLAG_OVF) {
+ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_OVF;
+ // Our RTC is 32 bits and we're clocking it at 16.384khz which is 16 (2 ** 4) subticks per
+ // tick.
+ overflowed_ticks += (1L<< (32 - 4));
+ #ifdef SAMD51
+ } else if (intflag & RTC_MODE0_INTFLAG_PER2) {
+ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_PER2;
+ // Do things common to all ports when the tick occurs
+ supervisor_tick();
+ #endif
+ } else if (intflag & RTC_MODE0_INTFLAG_CMP0) {
+ // Clear the interrupt because we may have hit a sleep and _ticks_enabled
+ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;
+ #ifdef SAMD21
+ if (_ticks_enabled) {
+ // Do things common to all ports when the tick occurs.
+ supervisor_tick();
+ // Check _ticks_enabled again because a tick handler may have turned it off.
+ if (_ticks_enabled) {
+ port_interrupt_after_ticks(1);
+ }
+ }
+ #endif
+ #ifdef SAMD51
+ RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0;
+ #endif
+ }
+}
+
+static uint32_t _get_count(void) {
+ #ifdef SAMD51
+ while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) {}
+ #endif
+ #ifdef SAMD21
+ while (RTC->MODE0.STATUS.bit.SYNCBUSY != 0) {}
+ #endif
+
+ return RTC->MODE0.COUNT.reg;
+}
+
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ uint32_t current_ticks = _get_count();
+ if (subticks != NULL) {
+ *subticks = (current_ticks % 16) * 2;
+ }
+
+ return overflowed_ticks + current_ticks / 16;
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+ #ifdef SAMD51
+ // PER2 will generate an interrupt every 32 ticks of the source 32.768 clock.
+ RTC->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_PER2;
+ #endif
+ #ifdef SAMD21
+ _ticks_enabled = true;
+ port_interrupt_after_ticks(1);
+ #endif
+}
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+ #ifdef SAMD51
+ RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_PER2;
+ #endif
+ #ifdef SAMD21
+ _ticks_enabled = false;
+ RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0;
+ #endif
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+ uint32_t current_ticks = _get_count();
+ if (ticks > 1 << 28) {
+ // We'll interrupt sooner with an overflow.
+ return;
+ }
+ RTC->MODE0.COMP[0].reg = current_ticks + (ticks << 4);
+ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;
+ RTC->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_CMP0;
+}
+
+void port_sleep_until_interrupt(void) {
+ #ifdef SAMD51
+ // Clear the FPU interrupt because it can prevent us from sleeping.
+ if (__get_FPSCR() & ~(0x9f)) {
+ __set_FPSCR(__get_FPSCR() & ~(0x9f));
+ (void) __get_FPSCR();
+ }
+ #endif
+ __WFI();
+}
+
/**
* \brief Default interrupt handler for unused IRQs.
*/
diff --git a/ports/atmel-samd/tick.c b/ports/atmel-samd/tick.c
deleted file mode 100644
index f996440ae..000000000
--- a/ports/atmel-samd/tick.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "tick.h"
-
-#include "peripheral_clk_config.h"
-
-#include "supervisor/shared/tick.h"
-#include "shared-bindings/microcontroller/__init__.h"
-#include "shared-bindings/microcontroller/Processor.h"
-
-void SysTick_Handler(void) {
- // SysTick interrupt handler called when the SysTick timer reaches zero
- // (every millisecond).
- common_hal_mcu_disable_interrupts();
-
- // Read the control register to reset the COUNTFLAG.
- (void) SysTick->CTRL;
- common_hal_mcu_enable_interrupts();
-
- // Do things common to all ports when the tick occurs
- supervisor_tick();
-}
-
-void tick_init() {
- uint32_t ticks_per_ms = common_hal_mcu_processor_get_frequency() / 1000;
- SysTick_Config(ticks_per_ms-1);
- NVIC_EnableIRQ(SysTick_IRQn);
- // Set all peripheral interrupt priorities to the lowest priority by default.
- for (uint16_t i = 0; i < PERIPH_COUNT_IRQn; i++) {
- NVIC_SetPriority(i, (1UL << __NVIC_PRIO_BITS) - 1UL);
- }
- // Bump up the systick interrupt so nothing else interferes with timekeeping.
- NVIC_SetPriority(SysTick_IRQn, 0);
- #ifdef SAMD21
- NVIC_SetPriority(USB_IRQn, 1);
- #endif
-
- #ifdef SAMD51
- NVIC_SetPriority(USB_0_IRQn, 1);
- NVIC_SetPriority(USB_1_IRQn, 1);
- NVIC_SetPriority(USB_2_IRQn, 1);
- NVIC_SetPriority(USB_3_IRQn, 1);
- #endif
-}
-
-void tick_delay(uint32_t us) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us;
- uint32_t start_tick;
- while (us >= us_until_next_tick) {
- start_tick = SysTick->VAL; // wait for SysTick->VAL to RESET
- while (SysTick->VAL < start_tick) {}
- us -= us_until_next_tick;
- us_until_next_tick = 1000;
- }
- while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {}
-}
-
-// us counts down!
-void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
-
- // We disable interrupts to prevent ticks_ms from changing while we grab it.
- common_hal_mcu_disable_interrupts();
- uint32_t tick_status = SysTick->CTRL;
- uint32_t current_us = SysTick->VAL;
- uint32_t tick_status2 = SysTick->CTRL;
- uint64_t current_ms = supervisor_ticks_ms64();
- // The second clause ensures our value actually rolled over. Its possible it hit zero between
- // the VAL read and CTRL read.
- if ((tick_status & SysTick_CTRL_COUNTFLAG_Msk) != 0 ||
- ((tick_status2 & SysTick_CTRL_COUNTFLAG_Msk) != 0 && current_us > ticks_per_us)) {
- current_ms++;
- }
- common_hal_mcu_enable_interrupts();
- *ms = current_ms;
- *us_until_ms = current_us / ticks_per_us;
-}
-
-void wait_until(uint64_t ms, uint32_t us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- while (supervisor_ticks_ms64() <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
-}
diff --git a/ports/atmel-samd/timer_handler.c b/ports/atmel-samd/timer_handler.c
index 51c6f0a39..34d819e16 100644
--- a/ports/atmel-samd/timer_handler.c
+++ b/ports/atmel-samd/timer_handler.c
@@ -29,6 +29,7 @@
#include "timer_handler.h"
+#include "common-hal/pulseio/PulseIn.h"
#include "common-hal/pulseio/PulseOut.h"
#include "shared-module/_pew/PewPew.h"
#include "common-hal/frequencyio/FrequencyIn.h"
@@ -49,6 +50,11 @@ void shared_timer_handler(bool is_tc, uint8_t index) {
if (is_tc) {
uint8_t handler = tc_handler[index];
switch(handler) {
+ case TC_HANDLER_PULSEIN:
+ #if CIRCUITPY_PULSEIO
+ pulsein_timer_interrupt_handler(index);
+ #endif
+ break;
case TC_HANDLER_PULSEOUT:
#if CIRCUITPY_PULSEIO
pulseout_interrupt_handler(index);
diff --git a/ports/atmel-samd/timer_handler.h b/ports/atmel-samd/timer_handler.h
index 8115cd73b..34efda4d9 100644
--- a/ports/atmel-samd/timer_handler.h
+++ b/ports/atmel-samd/timer_handler.h
@@ -31,6 +31,7 @@
#define TC_HANDLER_PEW 0x2
#define TC_HANDLER_FREQUENCYIN 0x3
#define TC_HANDLER_RGBMATRIX 0x4
+#define TC_HANDLER_PULSEIN 0x5
void set_timer_handler(bool is_tc, uint8_t index, uint8_t timer_handler);
void shared_timer_handler(bool is_tc, uint8_t index);
diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile
index e2fce976d..507d76331 100644
--- a/ports/cxd56/Makefile
+++ b/ports/cxd56/Makefile
@@ -152,7 +152,6 @@ SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE))
SRC_S = supervisor/cpu.s
SRC_C = \
- tick.c \
background.c \
fatfs_port.c \
mphalport.c \
@@ -184,7 +183,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o))
# List of sources for qstr extraction
SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)
# Sources that only hold QSTRs after pre-processing.
-SRC_QSTR_PREPROCESSOR +=
+SRC_QSTR_PREPROCESSOR +=
all: $(BUILD)/firmware.spk
@@ -197,7 +196,7 @@ $(FIRMWARE):
$(ECHO) "run make flash-bootloader again to flash bootloader."
exit 1
-$(BUILD)/libmpy.a: $(SPRESENSE_SDK) $(OBJ)
+$(BUILD)/libmpy.a: $(SPRESENSE_SDK) $(OBJ)
$(ECHO) "AR $@"
$(Q)$(AR) rcs $(BUILD)/libmpy.a $(OBJ)
diff --git a/ports/cxd56/common-hal/microcontroller/Processor.c b/ports/cxd56/common-hal/microcontroller/Processor.c
index 3e6fc3b8a..1eddbb01d 100644
--- a/ports/cxd56/common-hal/microcontroller/Processor.c
+++ b/ports/cxd56/common-hal/microcontroller/Processor.c
@@ -24,6 +24,8 @@
* THE SOFTWARE.
*/
+#include <stdbool.h> // for cxd56_clock.h
+#include <cxd56_clock.h>
#include <sys/boardctl.h>
// For NAN: remove when not needed.
@@ -31,7 +33,7 @@
#include "py/mphal.h"
uint32_t common_hal_mcu_processor_get_frequency(void) {
- return mp_hal_ticks_cpu();
+ return cxd56_get_cpu_baseclk();
}
float common_hal_mcu_processor_get_temperature(void) {
diff --git a/ports/cxd56/common-hal/microcontroller/__init__.c b/ports/cxd56/common-hal/microcontroller/__init__.c
index 2be74b006..7aa3b839d 100644
--- a/ports/cxd56/common-hal/microcontroller/__init__.c
+++ b/ports/cxd56/common-hal/microcontroller/__init__.c
@@ -24,6 +24,8 @@
* THE SOFTWARE.
*/
+#include <stdbool.h> // for cxd56_clock.h
+#include <cxd56_clock.h>
#include <sys/boardctl.h>
#include "py/mphal.h"
@@ -42,8 +44,20 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = {
},
};
+#define DELAY_CORRECTION (700)
+
void common_hal_mcu_delay_us(uint32_t delay) {
- mp_hal_delay_us(delay);
+ if (delay) {
+ unsigned long long ticks = cxd56_get_cpu_baseclk() / 1000000L * delay;
+ if (ticks < DELAY_CORRECTION) return; // delay time already used in calculation
+
+ ticks -= DELAY_CORRECTION;
+ ticks /= 6;
+ // following loop takes 6 cycles
+ do {
+ __asm__ __volatile__("nop");
+ } while(--ticks);
+ }
}
void common_hal_mcu_disable_interrupts(void) {
diff --git a/ports/cxd56/common-hal/pulseio/PulseIn.c b/ports/cxd56/common-hal/pulseio/PulseIn.c
index 65ca1d97e..221fa5b6e 100644
--- a/ports/cxd56/common-hal/pulseio/PulseIn.c
+++ b/ports/cxd56/common-hal/pulseio/PulseIn.c
@@ -25,6 +25,7 @@
*/
#include <arch/board/board.h>
+#include <sys/time.h>
#include "py/runtime.h"
#include "py/mphal.h"
@@ -51,7 +52,9 @@ static int pulsein_set_config(pulseio_pulsein_obj_t *self, bool first_edge) {
static int pulsein_interrupt_handler(int irq, FAR void *context, FAR void *arg) {
// Grab the current time first.
- uint32_t current_us = mp_hal_ticks_us();
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ uint64_t current_us = ((uint64_t) tv.tv_sec) * 1000000 + tv.tv_usec;
pulseio_pulsein_obj_t *self = pulsein_objects[irq - CXD56_IRQ_EXDEVICE_0];
diff --git a/ports/cxd56/common-hal/pulseio/PulseIn.h b/ports/cxd56/common-hal/pulseio/PulseIn.h
index ff31712ab..70d1413b6 100644
--- a/ports/cxd56/common-hal/pulseio/PulseIn.h
+++ b/ports/cxd56/common-hal/pulseio/PulseIn.h
@@ -38,7 +38,7 @@ typedef struct {
uint16_t maxlen;
uint16_t start;
uint16_t len;
- uint32_t last_us;
+ uint64_t last_us;
bool idle_state;
bool first_edge;
bool paused;
diff --git a/ports/cxd56/common-hal/time/__init__.c b/ports/cxd56/common-hal/time/__init__.c
deleted file mode 100644
index 31c63cbb2..000000000
--- a/ports/cxd56/common-hal/time/__init__.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright 2019 Sony Semiconductor Solutions Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include <sys/time.h>
-
-#include "py/mphal.h"
-
-#include "supervisor/shared/tick.h"
-
-uint64_t common_hal_time_monotonic(void) {
- return supervisor_ticks_ms64();
-}
-
-uint64_t common_hal_time_monotonic_ns(void) {
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return 1000 * ((uint64_t) tv.tv_sec * 1000000 + (uint64_t) tv.tv_usec);
-}
-
-void common_hal_time_delay_ms(uint32_t delay) {
- mp_hal_delay_ms(delay);
-}
diff --git a/ports/cxd56/mphalport.c b/ports/cxd56/mphalport.c
index 1305706ca..5a76b83bd 100644
--- a/ports/cxd56/mphalport.c
+++ b/ports/cxd56/mphalport.c
@@ -23,66 +23,3 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-
-#include <stdbool.h>
-#include <sys/time.h>
-#include <cxd56_clock.h>
-#include <sys/boardctl.h>
-
-#include "py/mpstate.h"
-
-#include "supervisor/shared/tick.h"
-
-#define DELAY_CORRECTION (700)
-#define DELAY_INTERVAL (50)
-
-void mp_hal_init(void) {
- boardctl(BOARDIOC_INIT, 0);
-}
-
-mp_uint_t mp_hal_ticks_ms(void) {
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return tv.tv_sec * 1000 + tv.tv_usec / 1000;
-}
-
-mp_uint_t mp_hal_ticks_us(void) {
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return tv.tv_sec * 1000000 + tv.tv_usec;
-}
-
-mp_uint_t mp_hal_ticks_cpu(void) {
- return cxd56_get_cpu_baseclk();
-}
-
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- #ifdef MICROPY_VM_HOOK_LOOP
- MICROPY_VM_HOOK_LOOP
- #endif
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
-
-void mp_hal_delay_us(uint32_t us) {
- if (us) {
- unsigned long long ticks = mp_hal_ticks_cpu() / 1000000L * us;
- if (ticks < DELAY_CORRECTION) return; // delay time already used in calculation
-
- ticks -= DELAY_CORRECTION;
- ticks /= 6;
- // following loop takes 6 cycles
- do {
- __asm__ __volatile__("nop");
- } while(--ticks);
- }
-}
diff --git a/ports/cxd56/mphalport.h b/ports/cxd56/mphalport.h
index a2be10b8d..50e805cf5 100644
--- a/ports/cxd56/mphalport.h
+++ b/ports/cxd56/mphalport.h
@@ -30,5 +30,8 @@
#include <sys/types.h>
#include "lib/utils/interrupt_char.h"
+#include "supervisor/shared/tick.h"
+
+#define mp_hal_ticks_ms() ((mp_uint_t) supervisor_ticks_ms32())
#endif // MICROPY_INCLUDED_CXD56_MPHALPORT_H
diff --git a/ports/cxd56/supervisor/internal_flash.c b/ports/cxd56/supervisor/internal_flash.c
index 0c9a61e06..2726fa4a2 100644
--- a/ports/cxd56/supervisor/internal_flash.c
+++ b/ports/cxd56/supervisor/internal_flash.c
@@ -59,7 +59,7 @@ uint32_t supervisor_flash_get_block_count(void) {
return CXD56_SPIFLASHSIZE >> PAGE_SHIFT;
}
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
if (flash_sector == NO_SECTOR) {
return;
}
diff --git a/ports/cxd56/supervisor/port.c b/ports/cxd56/supervisor/port.c
index 5d2957f35..73d6fb930 100644
--- a/ports/cxd56/supervisor/port.c
+++ b/ports/cxd56/supervisor/port.c
@@ -25,13 +25,16 @@
*/
#include <stdint.h>
+
#include <sys/boardctl.h>
+#include <sys/time.h>
#include "sched/sched.h"
#include "boards/board.h"
#include "supervisor/port.h"
+#include "supervisor/shared/tick.h"
#include "common-hal/microcontroller/Pin.h"
#include "common-hal/analogio/AnalogIn.h"
@@ -103,3 +106,41 @@ void port_set_saved_word(uint32_t value) {
uint32_t port_get_saved_word(void) {
return _ebss;
}
+
+volatile bool _tick_enabled;
+void board_timerhook(void)
+{
+ // Do things common to all ports when the tick occurs
+ if (_tick_enabled) {
+ supervisor_tick();
+ }
+}
+
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ long computed_subticks = tv.tv_usec * 1024 * 32 / 1000000;
+ if (subticks != NULL) {
+ *subticks = computed_subticks % 32;
+ }
+
+ return tv.tv_sec * 1024 + computed_subticks / 32;
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+ _tick_enabled = true;
+}
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+ _tick_enabled = false;
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+}
+
+void port_sleep_until_interrupt(void) {
+ // TODO: Implement sleep.
+}
+
diff --git a/ports/litex/.gitignore b/ports/litex/.gitignore
new file mode 100644
index 000000000..414487d53
--- /dev/null
+++ b/ports/litex/.gitignore
@@ -0,0 +1 @@
+build-*/
diff --git a/ports/litex/Makefile b/ports/litex/Makefile
index 51cb18635..596eaf2bb 100644
--- a/ports/litex/Makefile
+++ b/ports/litex/Makefile
@@ -116,7 +116,6 @@ SRC_C += \
background.c \
fatfs_port.c \
mphalport.c \
- tick.c \
boards/$(BOARD)/board.c \
boards/$(BOARD)/pins.c \
lib/libc/string0.c \
diff --git a/ports/litex/README.rst b/ports/litex/README.rst
new file mode 100644
index 000000000..bc1d20e61
--- /dev/null
+++ b/ports/litex/README.rst
@@ -0,0 +1,25 @@
+LiteX (FPGA)
+============
+
+`LiteX <https://github.com/enjoy-digital/litex>`_ is a Python-based System on a Chip (SoC) designer
+for open source supported Field Programmable Gate Array (FPGA) chips. This means that the CPU
+core(s) and peripherals are not defined by the physical chip. Instead, they are loaded as separate
+"gateware". Once this gateware is loaded, CircuitPython can be loaded on top of it to work as
+expected.
+
+Installation
+-------------
+
+You'll need ``dfu-util`` to install CircuitPython on the Fomu.
+
+Make sure the foboot bootloader is updated. Instructions are here: https://github.com/im-tomu/fomu-workshop/blob/master/docs/bootloader.rst
+
+Once you've updated the bootloader, you should know how to use ``dfu-util``. It's pretty easy!
+
+To install CircuitPython do:
+
+.. code-block:: shell
+
+ dfu-util -D adafruit-circuitpython-fomu-en_US-<version>.dfu
+
+It will install and then restart. CIRCUITPY should appear as it usually does and work the same.
diff --git a/ports/litex/boards/fomu/fomu-spi.ld b/ports/litex/boards/fomu/fomu-spi.ld
index 486c3cad1..9b6443c67 100644
--- a/ports/litex/boards/fomu/fomu-spi.ld
+++ b/ports/litex/boards/fomu/fomu-spi.ld
@@ -7,8 +7,9 @@ ENTRY(_start)
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x20040000, LENGTH = 0x100000 /* entire flash, 1 MiB */
- RAM (xrw) : ORIGIN = 0x10000000, LENGTH = 0x00020000 /* 128 KiB */
+ FLASH (rx) : ORIGIN = 0x20040000, LENGTH = 0x100000 /* entire flash, 1 MiB */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x20040000, LENGTH = 0x100000 /* entire flash, 1 MiB */
+ RAM (xrw) : ORIGIN = 0x10000000, LENGTH = 0x00020000 /* 128 KiB */
}
/* top end of the stack */
@@ -19,7 +20,7 @@ SECTIONS
{
/* This is the initialized data section
The program executes knowing that the data is in the RAM
- but the loader puts the initial values in the FLASH (inidata).
+ but the loader puts the initial values in the FLASH_FIRMWARE (inidata).
It is one task of the startup to copy the initial values from FLASH to RAM. */
.data : AT ( _sidata )
{
@@ -73,7 +74,7 @@ SECTIONS
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
} >RAM
- /* The program code and other data goes into FLASH */
+ /* The program code and other data goes into FLASH_FIRMWARE */
.text :
{
. = ALIGN(4);
@@ -88,7 +89,7 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
_sidata = _etext; /* This is used by the startup in order to initialize the .data secion */
- } >FLASH
+ } >FLASH_FIRMWARE
/* Uninitialized data section */
.bss :
diff --git a/ports/litex/mphalport.c b/ports/litex/mphalport.c
index 689487791..84a546795 100644
--- a/ports/litex/mphalport.c
+++ b/ports/litex/mphalport.c
@@ -37,26 +37,6 @@
#include "irq.h"
-/*------------------------------------------------------------------*/
-/* delay
- *------------------------------------------------------------------*/
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- #ifdef MICROPY_VM_HOOK_LOOP
- MICROPY_VM_HOOK_LOOP
- #endif
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
-
void mp_hal_delay_us(mp_uint_t delay) {
mp_hal_delay_ms(delay / 1000);
}
diff --git a/ports/litex/supervisor/internal_flash.c b/ports/litex/supervisor/internal_flash.c
index 93aeda8cb..2dbf46b3a 100644
--- a/ports/litex/supervisor/internal_flash.c
+++ b/ports/litex/supervisor/internal_flash.c
@@ -37,6 +37,7 @@
#include "py/runtime.h"
#include "lib/oofatfs/ff.h"
+#include "supervisor/flash.h"
#include "supervisor/usb.h"
#include "csr.h"
@@ -270,7 +271,7 @@ uint32_t supervisor_flash_get_block_count(void) {
}
__attribute__((section(".ramtext")))
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
// Skip if data is the same, or if there is no data in the cache
if (_flash_page_addr == NO_CACHE)
return;
diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c
index 9688c7bae..2297b15b1 100644
--- a/ports/litex/supervisor/port.c
+++ b/ports/litex/supervisor/port.c
@@ -27,11 +27,43 @@
#include <stdint.h>
#include "supervisor/port.h"
+#include "supervisor/shared/tick.h"
#include "boards/board.h"
-#include "tick.h"
#include "irq.h"
#include "csr.h"
+// Global millisecond tick count. 1024 per second because most RTCs are clocked with 32.768khz
+// crystals.
+volatile uint64_t raw_ticks = 0;
+volatile int subsecond = 0;
+__attribute__((section(".ramtext")))
+void SysTick_Handler(void) {
+ timer0_ev_pending_write(1);
+ raw_ticks += 1;
+ subsecond += 1;
+ // We track subsecond ticks so that we can increment raw_ticks one extra every 40 ms. We do this
+ // every 40 except 0 to make it 24 increments and not 25.
+ if (subsecond == 1000) {
+ subsecond = 0;
+ } else if (subsecond % 40 == 0) {
+ raw_ticks += 1;
+ }
+ supervisor_tick();
+}
+
+static void tick_init(void) {
+ int t;
+
+ timer0_en_write(0);
+ t = CONFIG_CLOCK_FREQUENCY / 1000; // 1000 kHz tick
+ timer0_reload_write(t);
+ timer0_load_write(t);
+ timer0_en_write(1);
+ timer0_ev_enable_write(1);
+ timer0_ev_pending_write(1);
+ irq_setmask(irq_getmask() | (1 << TIMER0_INTERRUPT));
+}
+
safe_mode_t port_init(void) {
irq_setmask(0);
irq_setie(1);
@@ -83,3 +115,22 @@ void port_set_saved_word(uint32_t value) {
uint32_t port_get_saved_word(void) {
return _ebss;
}
+
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ return raw_ticks;
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+}
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+}
+
+// TODO: Add sleep support if the SoC supports sleep.
+void port_sleep_until_interrupt(void) {
+}
diff --git a/ports/litex/supervisor/usb.c b/ports/litex/supervisor/usb.c
index 182360b71..b626aaf49 100644
--- a/ports/litex/supervisor/usb.c
+++ b/ports/litex/supervisor/usb.c
@@ -25,8 +25,6 @@
* THE SOFTWARE.
*/
-
-#include "tick.h"
#include "supervisor/usb.h"
#include "lib/utils/interrupt_char.h"
#include "lib/mp-readline/readline.h"
diff --git a/ports/litex/tick.c b/ports/litex/tick.c
deleted file mode 100644
index 8ba06044a..000000000
--- a/ports/litex/tick.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "csr.h"
-#include "tick.h"
-#include "irq.h"
-
-#include "supervisor/shared/autoreload.h"
-#include "supervisor/filesystem.h"
-#include "supervisor/shared/tick.h"
-#include "shared-module/gamepad/__init__.h"
-#include "shared-bindings/microcontroller/Processor.h"
-
-// Global millisecond tick count
-// volatile uint64_t ticks_ms = 0;
-
-__attribute__((section(".ramtext")))
-void SysTick_Handler(void) {
- timer0_ev_pending_write(1);
- supervisor_tick();
-}
-
-void tick_init() {
- int t;
-
- timer0_en_write(0);
- t = CONFIG_CLOCK_FREQUENCY / 1000; // 1000 kHz tick
- timer0_reload_write(t);
- timer0_load_write(t);
- timer0_en_write(1);
- timer0_ev_enable_write(1);
- timer0_ev_pending_write(1);
- irq_setmask(irq_getmask() | (1 << TIMER0_INTERRUPT));
-}
-
-void tick_delay(uint32_t us) {
- // uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- // uint32_t us_between_ticks = SysTick->VAL / ticks_per_us;
- // uint64_t start_ms = ticks_ms;
- // while (us > 1000) {
- // while (ticks_ms == start_ms) {}
- // us -= us_between_ticks;
- // start_ms = ticks_ms;
- // us_between_ticks = 1000;
- // }
- // while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {}
-}
-
-// us counts down!
-void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
- // uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- // *ms = ticks_ms;
- // *us_until_ms = SysTick->VAL / ticks_per_us;
-}
-
-void wait_until(uint64_t ms, uint32_t us_until_ms) {
- // uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- // while(ticks_ms <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
-}
diff --git a/ports/litex/tick.h b/ports/litex/tick.h
deleted file mode 100644
index b4d27b841..000000000
--- a/ports/litex/tick.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-#ifndef MICROPY_INCLUDED_LITEX_TICK_H
-#define MICROPY_INCLUDED_LITEX_TICK_H
-
-#include "py/mpconfig.h"
-
-#include <stdint.h>
-
-extern volatile uint64_t ticks_ms;
-
-extern struct timer_descriptor ms_timer;
-
-void tick_init(void);
-
-void tick_delay(uint32_t us);
-
-void current_tick(uint64_t* ms, uint32_t* us_until_ms);
-// Do not call this with interrupts disabled because it may be waiting for
-// ticks_ms to increment.
-void wait_until(uint64_t ms, uint32_t us_until_ms);
-
-#endif // MICROPY_INCLUDED_LITEX_TICK_H
diff --git a/ports/mimxrt10xx/Makefile b/ports/mimxrt10xx/Makefile
index 80d1da1aa..858e92c32 100644
--- a/ports/mimxrt10xx/Makefile
+++ b/ports/mimxrt10xx/Makefile
@@ -162,8 +162,8 @@ SRC_C = \
peripherals/mimxrt10xx/$(CHIP_FAMILY)/pins.c \
reset.c \
supervisor/flexspi_nor_flash_ops.c \
- supervisor/shared/memory.c \
- tick.c
+ supervisor/shared/memory.c
+
ifeq ($(CIRCUITPY_NETWORK),1)
CFLAGS += -DMICROPY_PY_NETWORK=1
diff --git a/ports/mimxrt10xx/background.c b/ports/mimxrt10xx/background.c
index 71dd79521..ff53ea44f 100644
--- a/ports/mimxrt10xx/background.c
+++ b/ports/mimxrt10xx/background.c
@@ -27,7 +27,6 @@
#include "background.h"
//#include "audio_dma.h"
-#include "tick.h"
#include "supervisor/filesystem.h"
#include "supervisor/shared/tick.h"
#include "supervisor/usb.h"
diff --git a/ports/mimxrt10xx/common-hal/displayio/ParallelBus.c b/ports/mimxrt10xx/common-hal/displayio/ParallelBus.c
index 87fc511af..87a72d0f3 100644
--- a/ports/mimxrt10xx/common-hal/displayio/ParallelBus.c
+++ b/ports/mimxrt10xx/common-hal/displayio/ParallelBus.c
@@ -33,8 +33,6 @@
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "tick.h"
-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
diff --git a/ports/mimxrt10xx/common-hal/neopixel_write/__init__.c b/ports/mimxrt10xx/common-hal/neopixel_write/__init__.c
index 3e1d343ec..b86077015 100644
--- a/ports/mimxrt10xx/common-hal/neopixel_write/__init__.c
+++ b/ports/mimxrt10xx/common-hal/neopixel_write/__init__.c
@@ -25,16 +25,13 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
#include "shared-bindings/neopixel_write/__init__.h"
-#include "tick.h"
-#include "py/mperrno.h"
-#include "py/runtime.h"
#include "common-hal/microcontroller/Pin.h"
+#include "supervisor/linker.h"
+#include "supervisor/port.h"
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
//sysclock divisors
#define MAGIC_800_INT 900000 // ~1.11 us -> 1.2 field
@@ -58,9 +55,9 @@ void PLACE_IN_ITCM(common_hal_neopixel_write)(const digitalio_digitalinout_obj_t
const uint32_t t0 = (sys_freq / MAGIC_800_T0H);
const uint32_t t1 = (sys_freq / MAGIC_800_T1H);
- // This must be called while interrupts are on in case we're waiting for a
- // future ms tick.
- wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
GPIO_Type *gpio = digitalinout->pin->gpio;
const uint32_t pin = digitalinout->pin->number;
@@ -85,17 +82,11 @@ void PLACE_IN_ITCM(common_hal_neopixel_write)(const digitalio_digitalinout_obj_t
}
}
+ // Update the next start.
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
+
// Enable interrupts again
__enable_irq();
-
- // Update the next start.
- current_tick(&next_start_tick_ms, &next_start_tick_us);
- if (next_start_tick_us < 100) {
- next_start_tick_ms += 1;
- next_start_tick_us = 100 - next_start_tick_us;
- } else {
- next_start_tick_us -= 100;
- }
}
#pragma GCC pop_options
diff --git a/ports/mimxrt10xx/common-hal/pulseio/PulseIn.c b/ports/mimxrt10xx/common-hal/pulseio/PulseIn.c
index 24e9ad85d..d8bf2017e 100644
--- a/ports/mimxrt10xx/common-hal/pulseio/PulseIn.c
+++ b/ports/mimxrt10xx/common-hal/pulseio/PulseIn.c
@@ -38,8 +38,6 @@
#include "shared-bindings/pulseio/PulseIn.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
-
// TODO
//static void pulsein_set_config(pulseio_pulsein_obj_t* self, bool first_edge) {
// uint32_t sense_setting;
diff --git a/ports/mimxrt10xx/common-hal/rtc/RTC.c b/ports/mimxrt10xx/common-hal/rtc/RTC.c
index 5d6cae520..6940a1817 100644
--- a/ports/mimxrt10xx/common-hal/rtc/RTC.c
+++ b/ports/mimxrt10xx/common-hal/rtc/RTC.c
@@ -72,5 +72,6 @@ int common_hal_rtc_get_calibration(void) {
}
void common_hal_rtc_set_calibration(int calibration) {
+ // SNVS has HPCALB_VAL bits for calibration.
mp_raise_NotImplementedError(translate("RTC calibration is not supported on this board"));
}
diff --git a/ports/mimxrt10xx/linking/common.ld b/ports/mimxrt10xx/linking/common.ld
index 10568bfb8..90fc78093 100644
--- a/ports/mimxrt10xx/linking/common.ld
+++ b/ports/mimxrt10xx/linking/common.ld
@@ -21,7 +21,7 @@ MEMORY
/* This can't move because the bootrom looks at this address. */
FLASH_IVT (rx) : ORIGIN = 0x60001000, LENGTH = 4K
/* Place the ISRs 48k in to leave room for the bootloader when it is available. */
- FLASH_TEXT (rx) : ORIGIN = 0x6000C000, LENGTH = code_size - 48K
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x6000C000, LENGTH = code_size - 48K
FLASH_FATFS (r) : ORIGIN = 0x60100000, LENGTH = _ld_flash_size - code_size - _ld_reserved_flash_size
/* Teensy uses the last bit of flash for recovery. */
RESERVED_FLASH : ORIGIN = 0x60100000 + _ld_flash_size - _ld_reserved_flash_size, LENGTH = _ld_reserved_flash_size
@@ -67,7 +67,7 @@ SECTIONS
) .text*) /* .text* sections (code) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
- } > FLASH_TEXT
+ } > FLASH_FIRMWARE
.ARM.exidx :
{
@@ -75,7 +75,7 @@ SECTIONS
*(.gnu.linkonce.armexidx.*)
_etext = .; /* define a global symbol at end of code */
__etext = .; /* define a global symbol at end of code */
- } > FLASH_TEXT
+ } > FLASH_FIRMWARE
_ld_filesystem_start = ORIGIN(FLASH_FATFS);
_ld_filesystem_end = _ld_filesystem_start + LENGTH(FLASH_FATFS);
@@ -87,7 +87,7 @@ SECTIONS
*flexspi_nor_flash_ops.o(.text*)
*fsl_flexspi.o(.text*)
. = ALIGN(4);
- } > OCRAM AT> FLASH_TEXT
+ } > OCRAM AT> FLASH_FIRMWARE
_ld_ocram_data_destination = ADDR(.data);
_ld_ocram_data_flash_copy = LOADADDR(.data);
_ld_ocram_data_size = SIZEOF(.data);
@@ -114,7 +114,7 @@ SECTIONS
*(.itcm.*)
. = ALIGN(4);
- } > ITCM AT> FLASH_TEXT
+ } > ITCM AT> FLASH_FIRMWARE
_ld_itcm_destination = ADDR(.itcm);
_ld_itcm_flash_copy = LOADADDR(.itcm);
_ld_itcm_size = SIZEOF(.itcm);
@@ -126,7 +126,7 @@ SECTIONS
*(.dtcm_data.*)
. = ALIGN(4);
- } > DTCM AT> FLASH_TEXT
+ } > DTCM AT> FLASH_FIRMWARE
_ld_dtcm_data_destination = ADDR(.dtcm_data);
_ld_dtcm_data_flash_copy = LOADADDR(.dtcm_data);
_ld_dtcm_data_size = SIZEOF(.dtcm_data);
diff --git a/ports/mimxrt10xx/mphalport.c b/ports/mimxrt10xx/mphalport.c
index 06275cd83..111e97011 100644
--- a/ports/mimxrt10xx/mphalport.c
+++ b/ports/mimxrt10xx/mphalport.c
@@ -33,21 +33,6 @@
#include "fsl_common.h"
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- RUN_BACKGROUND_TASKS;
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
-
void mp_hal_delay_us(mp_uint_t delay) {
#if defined(MIMXRT1011_SERIES) || defined(MIMXRT1021_SERIES)
SDK_DelayAtLeastUs(delay, SystemCoreClock);
diff --git a/ports/mimxrt10xx/sdk b/ports/mimxrt10xx/sdk
-Subproject 4e7438e654f4a6b4f386b4bb9e817d74a0fbffc
+Subproject 8363ff7bed7533b9e7e6a6239aace3d6da14f34
diff --git a/ports/mimxrt10xx/supervisor/internal_flash.c b/ports/mimxrt10xx/supervisor/internal_flash.c
index 7e9d8fa37..4f52748ed 100644
--- a/ports/mimxrt10xx/supervisor/internal_flash.c
+++ b/ports/mimxrt10xx/supervisor/internal_flash.c
@@ -183,7 +183,7 @@ uint32_t supervisor_flash_get_block_count(void) {
return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE;
}
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
if (_flash_page_addr == NO_CACHE) return;
status_t status;
diff --git a/ports/mimxrt10xx/supervisor/port.c b/ports/mimxrt10xx/supervisor/port.c
index 7ba7a7701..72326363d 100644
--- a/ports/mimxrt10xx/supervisor/port.c
+++ b/ports/mimxrt10xx/supervisor/port.c
@@ -43,7 +43,6 @@
#include "common-hal/rtc/RTC.h"
#include "reset.h"
-#include "tick.h"
#include "tusb.h"
@@ -54,6 +53,7 @@
#include "shared-module/gamepadshift/__init__.h"
#endif
#include "shared-module/_pew/PewPew.h"
+#include "supervisor/shared/tick.h"
#include "clocks.h"
@@ -244,15 +244,18 @@ __attribute__((used, naked)) void Reset_Handler(void) {
}
safe_mode_t port_init(void) {
- clocks_init();
+ CLOCK_SetMode(kCLOCK_ModeRun);
- // Configure millisecond timer initialization.
- tick_init();
+ clocks_init();
#if CIRCUITPY_RTC
rtc_init();
#endif
+ // Always enable the SNVS interrupt. The GPC won't wake us up unless at least one interrupt is
+ // enabled. It won't occur very often so it'll be low overhead.
+ NVIC_EnableIRQ(SNVS_HP_WRAPPER_IRQn);
+
// Reset everything into a known state before board_init.
reset_port();
@@ -332,7 +335,7 @@ uint32_t *port_heap_get_top(void) {
return &_ld_heap_end;
}
-// Place the word to save just after our BSS section that gets blanked.
+// Place the word into the low power section of the SNVS.
void port_set_saved_word(uint32_t value) {
SNVS->LPGPR[1] = value;
}
@@ -341,6 +344,67 @@ uint32_t port_get_saved_word(void) {
return SNVS->LPGPR[1];
}
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ uint64_t ticks = 0;
+ uint64_t next_ticks = 1;
+ while (ticks != next_ticks) {
+ ticks = next_ticks;
+ next_ticks = ((uint64_t) SNVS->HPRTCMR) << 32 | SNVS->HPRTCLR;
+ }
+ if (subticks != NULL) {
+ *subticks = ticks % 32;
+ }
+ return ticks / 32;
+}
+
+void SNVS_HP_WRAPPER_IRQHandler(void) {
+ if ((SNVS->HPSR & SNVS_HPSR_PI_MASK) != 0) {
+ supervisor_tick();
+ SNVS->HPSR = SNVS_HPSR_PI_MASK;
+ }
+ if ((SNVS->HPSR & SNVS_HPSR_HPTA_MASK) != 0) {
+ SNVS->HPSR = SNVS_HPSR_HPTA_MASK;
+ }
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+ uint32_t hpcr = SNVS->HPCR;
+ hpcr &= ~SNVS_HPCR_PI_FREQ_MASK;
+ SNVS->HPCR = hpcr | SNVS_HPCR_PI_FREQ(5) | SNVS_HPCR_PI_EN_MASK;
+}
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+ SNVS->HPCR &= ~SNVS_HPCR_PI_EN_MASK;
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+ uint8_t subticks;
+ uint64_t current_ticks = port_get_raw_ticks(&subticks);
+ current_ticks += ticks;
+ SNVS->HPCR &= ~SNVS_HPCR_HPTA_EN_MASK;
+ // Wait for the alarm to be disabled.
+ while ((SNVS->HPCR & SNVS_HPCR_HPTA_EN_MASK) != 0) {}
+ SNVS->HPTAMR = current_ticks >> (32 - 5);
+ SNVS->HPTALR = current_ticks << 5 | subticks;
+ SNVS->HPCR |= SNVS_HPCR_HPTA_EN_MASK;
+}
+
+void port_sleep_until_interrupt(void) {
+ // App note here: https://www.nxp.com/docs/en/application-note/AN12085.pdf
+
+ // Clear the FPU interrupt because it can prevent us from sleeping.
+ if (__get_FPSCR() & ~(0x9f)) {
+ __set_FPSCR(__get_FPSCR() & ~(0x9f));
+ (void) __get_FPSCR();
+ }
+ NVIC_ClearPendingIRQ(SNVS_HP_WRAPPER_IRQn);
+ CLOCK_SetMode(kCLOCK_ModeWait);
+ __WFI();
+ CLOCK_SetMode(kCLOCK_ModeRun);
+}
+
/**
* \brief Default interrupt handler for unused IRQs.
*/
@@ -384,4 +448,3 @@ __attribute__((used)) void HardFault_Handler(void)
asm("nop;");
}
}
-
diff --git a/ports/mimxrt10xx/tick.c b/ports/mimxrt10xx/tick.c
deleted file mode 100644
index c19ce796e..000000000
--- a/ports/mimxrt10xx/tick.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- * Copyright (c) 2019 Artur Pacholec
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "tick.h"
-
-#include "fsl_common.h"
-
-#include "supervisor/shared/tick.h"
-#include "shared-bindings/microcontroller/__init__.h"
-#include "shared-bindings/microcontroller/Processor.h"
-
-void SysTick_Handler(void) {
- // SysTick interrupt handler called when the SysTick timer reaches zero
- // (every millisecond).
- common_hal_mcu_disable_interrupts();
-
- // Read the control register to reset the COUNTFLAG.
- (void) SysTick->CTRL;
-
- common_hal_mcu_enable_interrupts();
-
- // Do things common to all ports when the tick occurs
- supervisor_tick();
-}
-
-void tick_init() {
- uint32_t ticks_per_ms = common_hal_mcu_processor_get_frequency() / 1000;
- SysTick_Config(ticks_per_ms-1);
-}
-
-void tick_delay(uint32_t us) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- uint32_t us_until_next_tick = SysTick->VAL / ticks_per_us;
- uint32_t start_tick;
- while (us >= us_until_next_tick) {
- start_tick = SysTick->VAL; // wait for SysTick->VAL to RESET
- while (SysTick->VAL < start_tick) {}
- us -= us_until_next_tick;
- us_until_next_tick = 1000;
- }
- while (SysTick->VAL > ((us_until_next_tick - us) * ticks_per_us)) {}
-}
-
-// us counts down!
-void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
-
- // We disable interrupts to prevent ticks_ms from changing while we grab it.
- common_hal_mcu_disable_interrupts();
- uint32_t tick_status = SysTick->CTRL;
- uint32_t current_us = SysTick->VAL;
- uint32_t tick_status2 = SysTick->CTRL;
- uint64_t current_ms = supervisor_ticks_ms64();
- // The second clause ensures our value actually rolled over. Its possible it hit zero between
- // the VAL read and CTRL read.
- if ((tick_status & SysTick_CTRL_COUNTFLAG_Msk) != 0 ||
- ((tick_status2 & SysTick_CTRL_COUNTFLAG_Msk) != 0 && current_us > ticks_per_us)) {
- current_ms++;
- }
- common_hal_mcu_enable_interrupts();
- *ms = current_ms;
- *us_until_ms = current_us / ticks_per_us;
-}
-
-void wait_until(uint64_t ms, uint32_t us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- while (supervisor_ticks_ms64() <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
-}
diff --git a/ports/mimxrt10xx/tick.h b/ports/mimxrt10xx/tick.h
deleted file mode 100644
index 6660d5b4a..000000000
--- a/ports/mimxrt10xx/tick.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- * Copyright (c) 2019 Artur Pacholec
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-#ifndef MICROPY_INCLUDED_MIMXRT10XX_TICK_H
-#define MICROPY_INCLUDED_MIMXRT10XX_TICK_H
-
-#include "py/mpconfig.h"
-
-extern struct timer_descriptor ms_timer;
-
-void tick_init(void);
-
-void tick_delay(uint32_t us);
-
-void current_tick(uint64_t* ms, uint32_t* us_until_ms);
-// Do not call this with interrupts disabled because it may be waiting for
-// ticks_ms to increment.
-void wait_until(uint64_t ms, uint32_t us_until_ms);
-
-#endif // MICROPY_INCLUDED_MIMXRT10XX_TICK_H
diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile
index 876628342..8a7b1104b 100755
--- a/ports/nrf/Makefile
+++ b/ports/nrf/Makefile
@@ -88,7 +88,7 @@ INC += -I../../supervisor/shared/usb
ifeq ($(DEBUG), 1)
CFLAGS += -ggdb3 -Og
else
- CFLAGS += -Os -DNDEBUG
+ CFLAGS += -Os -DNDEBUG -ggdb3
CFLAGS += -flto -flto-partition=none
endif
@@ -148,8 +148,6 @@ endif
SRC_C += \
background.c \
fatfs_port.c \
- mphalport.c \
- tick.c \
boards/$(BOARD)/board.c \
boards/$(BOARD)/pins.c \
device/$(MCU_VARIANT)/startup_$(MCU_SUB_VARIANT).c \
diff --git a/ports/nrf/bluetooth/s140_nrf52_7.0.1/s140_nrf52_7.0.1_softdevice.hex b/ports/nrf/bluetooth/s140_nrf52_7.0.1/s140_nrf52_7.0.1_softdevice.hex
new file mode 100644
index 000000000..3c5fc95be
--- /dev/null
+++ b/ports/nrf/bluetooth/s140_nrf52_7.0.1/s140_nrf52_7.0.1_softdevice.hex
@@ -0,0 +1,9742 @@
+:020000040000FA
+:1000000000040020810A000015070000610A0000BA
+:100010001F07000029070000330700000000000050
+:10002000000000000000000000000000A50A000021
+:100030003D070000000000004707000051070000D6
+:100040005B070000650700006F07000079070000EC
+:10005000830700008D07000097070000A10700003C
+:10006000AB070000B5070000BF070000C90700008C
+:10007000D3070000DD070000E7070000F1070000DC
+:10008000FB070000050800000F0800001908000029
+:10009000230800002D080000370800004108000078
+:1000A0004B080000550800005F08000069080000C8
+:1000B000730800007D080000870800009108000018
+:1000C0009B080000A5080000AF080000B908000068
+:1000D000C3080000CD080000D7080000E1080000B8
+:1000E000EB080000F5080000FF0800000909000007
+:1000F000130900001D090000270900003109000054
+:100100003B0900001FB500F003F88DE80F001FBD8C
+:1001100000F0ACBC40F6FC7108684FF01022401CA7
+:1001200008D00868401C09D00868401C04D0086842
+:1001300000F037BA9069F5E79069F9E7704770B554
+:100140000B46010B184400F6FF70040B4FF0805073
+:100150000022090303692403406943431D1B104621
+:1001600000F048FA29462046BDE8704000F042BA47
+:10017000F0B54FF6FF734FF4B4751A466E1E11E0DA
+:10018000A94201D3344600E00C46091B30F8027B3B
+:10019000641E3B441A44F9D19CB204EB134394B25D
+:1001A00004EB12420029EBD198B200EB134002EBB2
+:1001B000124140EA0140F0BDF34992B00446D1E952
+:1001C0000001CDE91001FF224021684600F0F4FB58
+:1001D00094E80F008DE80F00684610A902E004C8FB
+:1001E00041F8042D8842FAD110216846FFF7C0FF7C
+:1001F0001090AA208DF8440000F099F9FFF78AFFCB
+:1002000040F6FC7420684FF01025401C0FD0206889
+:1002100010226946803000F078F92068401C08D030
+:100220002068082210A900F070F900F061F9A869AF
+:10023000EEE7A869F5E74FF080500369406940F6A2
+:10024000FC71434308684FF01022401C06D0086838
+:1002500000F58050834203D2092070479069F7E788
+:100260000868401C04D00868401C03D00020704778
+:100270009069F9E70420704770B504460068C34DE3
+:10028000072876D2DFE800F033041929631E250021
+:10029000D4E9026564682946304600F062F92A46CE
+:1002A0002146304600F031F9AA002146304600F0E0
+:1002B00057FB002800D0032070BD00F009FC4FF46C
+:1002C000805007E0201D00F040F90028F4D100F034
+:1002D000FFFB60682860002070BD241D94E80700C3
+:1002E000920000F03DFB0028F6D00E2070BDFFF715
+:1002F000A2FF0028FAD1D4E901034FF0805100EBAE
+:10030000830208694D69684382420ED840F6F8704E
+:1003100005684FF010226D1C09D0056805EB8305B8
+:100320000B6949694B439D4203D9092070BD55694A
+:10033000F4E70168491C03D00068401C02D003E0C8
+:100340005069FAE70F2070BD2046FFF735FFFFF731
+:1003500072FF0028F7D1201D00F0F7F80028F2D135
+:1003600060680028F0D100F0E2F8FFF7D3FE00F05B
+:10037000BFF8072070BD10B50C46182802D0012028
+:10038000086010BD2068FFF777FF206010BD41684E
+:10039000054609B1012700E0002740F6F8742068FF
+:1003A0004FF01026401C2BD02068AA68920000F065
+:1003B000D7FA38B3A86881002068401C27D020688D
+:1003C000FFF7BDFED7B12068401C22D026684FF051
+:1003D0008050AC686D68016942695143A9420DD9EA
+:1003E000016940694143A14208D92146304600F0E5
+:1003F000B8F822462946304600F087F800F078F831
+:100400007069D2E700F093F8FFF784FEF6E77069B1
+:10041000D6E77669DBE740F6FC7420684FF01026DB
+:10042000401C23D02068401C0CD02068401C1FD0EA
+:100430002568206805F18005401C1BD027683879A5
+:10044000AA2819D040F6F8700168491C42D001680A
+:10045000491C45D00168491C3ED001680968491C07
+:100460003ED00168491C39D000683EE0B069DAE747
+:10047000B569DEE7B769E2E710212846FFF778FEA5
+:100480003968814222D12068401C05D0D4F8001080
+:1004900001F18002C03107E0B169F9E730B108CA63
+:1004A00051F8040D984201D1012000E000208A4259
+:1004B000F4D158B1286810B1042803D0FEE72846CB
+:1004C000FFF765FF3149686808600EE0FFF722FE1C
+:1004D00000F00EF87169BBE77169BFE7706904E06D
+:1004E0004FF480500168491C01D000F0CBFAFEE7C0
+:1004F000BFF34F8F26480168264A01F4E06111439B
+:100500000160BFF34F8F00BFFDE72DE9F0411746B3
+:100510000D460646002406E03046296800F054F8EF
+:10052000641C2D1D361DBC42F6D3BDE8F08140F69B
+:10053000FC700168491C04D0D0F800004FF48051D1
+:10054000FDE54FF010208069F8E74FF080510A690F
+:10055000496900684A43824201D810207047002050
+:10056000704770B50C4605464FF4806608E0284693
+:1005700000F017F8B44205D3A4F5806405F5805562
+:10058000002CF4D170BD0000F40A0000000000202F
+:100590000CED00E00400FA05144801680029FCD0C5
+:1005A0007047134A0221116010490B68002BFCD0E0
+:1005B0000F4B1B1D186008680028FCD0002010603D
+:1005C00008680028FCD07047094B10B501221A605A
+:1005D000064A1468002CFCD0016010680028FCD08A
+:1005E0000020186010680028FCD010BD00E4014015
+:1005F00004E5014070B50C46054600F073F810B9EB
+:1006000000F07EF828B121462846BDE8704000F091
+:1006100007B821462846BDE8704000F037B8000012
+:100620007FB5002200920192029203920A0B000B06
+:100630006946012302440AE0440900F01F0651F80C
+:10064000245003FA06F6354341F82450401C8242F8
+:10065000F2D80D490868009A10430860081D016827
+:10066000019A1143016000F03DF800280AD00649C4
+:1006700010310868029A10430860091D0868039A3F
+:10068000104308607FBD00000006004030B50F4CED
+:10069000002200BF04EB0213D3F800582DB9D3F8A1
+:1006A000045815B9D3F808581DB1521C082AF1D3C3
+:1006B00030BD082AFCD204EB0212C2F80008C3F8CD
+:1006C00004180220C3F8080830BD000000E0014013
+:1006D0004FF08050D0F83001082801D0002070473A
+:1006E000012070474FF08050D0F83011062905D016
+:1006F000D0F83001401C01D0002070470120704725
+:100700004FF08050D0F830010A2801D00020704707
+:100710000120704708208F490968095808471020B0
+:100720008C4909680958084714208A4909680958FA
+:100730000847182087490968095808473020854923
+:100740000968095808473820824909680958084744
+:100750003C20804909680958084740207D490968BC
+:100760000958084744207B49096809580847482028
+:1007700078490968095808474C207649096809589A
+:10078000084750207349096809580847542071499F
+:1007900009680958084758206E49096809580847E8
+:1007A0005C206C4909680958084760206949096854
+:1007B00009580847642067490968095808476820AC
+:1007C00064490968095808476C2062490968095852
+:1007D000084770205F4909680958084774205D4937
+:1007E00009680958084778205A490968095808478C
+:1007F0007C205849096809580847802055490968EC
+:10080000095808478420534909680958084788202F
+:1008100050490968095808478C204E490968095809
+:10082000084790204B4909680958084794204949CE
+:10083000096809580847982046490968095808472F
+:100840009C204449096809580847A0204149096883
+:1008500009580847A4203F49096809580847A820B3
+:100860003C49096809580847AC203A4909680958C1
+:100870000847B0203749096809580847B420354966
+:10088000096809580847B8203249096809580847D3
+:10089000BC203049096809580847C0202D4909681B
+:1008A00009580847C4202B49096809580847C82037
+:1008B0002849096809580847CC2026490968095879
+:1008C0000847D0202349096809580847D4202149FE
+:1008D000096809580847D8201E4909680958084777
+:1008E000DC201C49096809580847E02019490968B3
+:1008F00009580847E4201749096809580847E820BB
+:100900001449096809580847EC2012490968095830
+:100910000847F0200F49096809580847F4200D4995
+:10092000096809580847F8200A490968095808471A
+:10093000FC2008490968095808475FF48070054998
+:10094000096809580847000003480449024A034B54
+:100950007047000000000020000B0000000B0000AA
+:1009600040EA010310B59B070FD1042A0DD310C82C
+:1009700008C9121F9C42F8D020BA19BA884201D97E
+:10098000012010BD4FF0FF3010BD1AB1D30703D0C6
+:10099000521C07E0002010BD10F8013B11F8014B7C
+:1009A0001B1B07D110F8013B11F8014B1B1B01D198
+:1009B000921EF1D1184610BD02F0FF0343EA032254
+:1009C00042EA024200F005B87047704770474FF0A6
+:1009D00000020429C0F0128010F0030C00F01B800C
+:1009E000CCF1040CBCF1020F18BF00F8012BA8BF1A
+:1009F00020F8022BA1EB0C0100F00DB85FEAC17CDE
+:100A000024BF00F8012B00F8012B48BF00F8012B90
+:100A100070474FF0000200B51346944696462039C1
+:100A200022BFA0E80C50A0E80C50B1F12001BFF4A7
+:100A3000F7AF090728BFA0E80C5048BF0CC05DF80D
+:100A400004EB890028BF40F8042B08BF704748BF5B
+:100A500020F8022B11F0804F18BF00F8012B7047CF
+:100A6000014B1B68DB6818470000002009480A4951
+:100A70007047FFF7FBFFFFF745FB00BD20BFFDE719
+:100A8000064B1847064A1060016881F308884068E1
+:100A900000470000000B0000000B000017040000DE
+:100AA000000000201EF0040F0CBFEFF30881EFF3ED
+:100AB0000981886902380078182803D100E0000015
+:100AC000074A1047074A12682C3212681047000084
+:100AD00000B5054B1B68054A9B58984700BD0000B0
+:100AE0007703000000000020F00A0000040000006E
+:100AF000001000000000000000FFFFFF0090D00386
+:10100000C8130020415F020075C10000A75E020006
+:1010100075C1000075C1000075C10000000000002E
+:10102000000000000000000000000000CD5F020092
+:1010300075C100000000000075C1000075C100000E
+:10104000356002003B60020075C1000075C1000000
+:1010500075C1000075C1000075C1000075C10000B8
+:101060004160020075C1000075C1000047600200C8
+:1010700075C100004D60020053600200596002001B
+:1010800075C1000075C1000075C1000075C1000088
+:1010900075C1000075C1000075C1000075C1000078
+:1010A00075C100005F60020075C1000075C10000DD
+:1010B00075C1000075C1000075C1000075C1000058
+:1010C0006560020075C1000075C1000075C10000B7
+:1010D00075C1000075C1000075C1000075C1000038
+:1010E00075C1000075C1000075C1000075C1000028
+:1010F00075C1000075C1000075C1000075C1000018
+:1011000075C1000075C1000000F002F824F007FF6F
+:101110000AA090E8000C82448344AAF10107DA4552
+:1011200001D124F0FCFEAFF2090EBAE80F0013F073
+:10113000010F18BFFB1A43F00103184708540200BF
+:10114000285402000A444FF0000C10F8013B13F041
+:10115000070408BF10F8014B1D1108BF10F8015B10
+:10116000641E05D010F8016B641E01F8016BF9D103
+:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A
+:101180006D1E58BF01F801CBFAD505E014F8016BCC
+:1011900001F8016B6D1EF9D59142D6D3704700005E
+:1011A0000023002400250026103A28BF78C1FBD870
+:1011B000520728BF30C148BF0B6070471FB500F011
+:1011C00003F88DE80F001FBD24F0A6BE70B51A4CC1
+:1011D00005460A202070A01C00F0D5F85920A080F8
+:1011E00029462046BDE8704008F09AB908F0A3B936
+:1011F00070B50C461149097829B1A0F160015E294A
+:1012000008D3012013E0602804D0692802D043F2FB
+:1012100001000CE020CC0A4E94E80E0006EB8000A2
+:10122000A0F58050241FD0F8806E2846B04720607B
+:1012300070BD012070470000080000201800002049
+:10124000B06002003249884201D20120704700207C
+:10125000704770B50446A0F500002E4EB0F1786FCF
+:1012600002D23444A4F500042948844201D2012565
+:1012700000E0002500F043F848B125B9B44204D39A
+:101280002548006808E0012070BD002070BD002DD9
+:10129000F9D1B442F9D321488442F6D2F3E710B52C
+:1012A0000446A0F50000B0F1786F03D21948044459
+:1012B000A4F5000400F023F84FF0804130B1164847
+:1012C000006804E08C4204D2012003E01348844209
+:1012D000F8D2002080F0010010BD10B520B1FFF75A
+:1012E000DEFF08B1012010BD002010BD10B520B1F7
+:1012F000FFF7AFFF08B1012010BD002010BD084866
+:1013000008490068884201D10120704700207047D9
+:1013100000700200000000201C00002008000020D7
+:1013200058000020BEBAFECA10B5044600210120B4
+:1013300000F041F800210B2000F03DF800210820CA
+:1013400000F039F80421192000F035F804210D20AF
+:1013500000F031F804210E2000F02DF804210F20B8
+:1013600000F029F80421C84300F025F806211620D2
+:1013700000F021F80621152000F01DF82046FFF7A7
+:1013800025FF002010BDCA2101807047FFF72EBF46
+:101390001148704710487047104A10B514680F4B39
+:1013A0000F4A08331A60FFF723FF0C48001D046042
+:1013B00010BD704770474907090E002804DB00F193
+:1013C000E02080F80014704700F00F0000F1E020EA
+:1013D00080F8141D7047000003F900421005024018
+:1013E00001000001FD48002101604160018170475A
+:1013F0002DE9FF4F93B09B46209F160004460DD069
+:101400001046FFF726FF18B1102017B0BDE8F08F87
+:101410003146012001F0D3FE0028F6D101258DF8D8
+:1014200042504FF4C050ADF84000002210A92846A9
+:1014300006F0D8FC0028E8D18DF84250A8464FF4B9
+:1014400028500025ADF840001C2229466846079523
+:101450000DF015F89DF81C000DF11C0A20F00F008E
+:10146000401C20F0F00010308DF81C0020788DF822
+:101470001D0061789DF81E000DF1400961F34200E6
+:1014800040F001008DF81E009DF8000008AA40F011
+:1014900002008DF800002089ADF83000ADF8325020
+:1014A0006089ADF83400CDF82CA060680E900AA9D0
+:1014B000CDF82890684606F08AFA0028A5D1606821
+:1014C000FFF70BFF40B16068FFF710FF20B96078AD
+:1014D00000F00300022801D0012000E00020BF4CF2
+:1014E00008AA0AA92072BDF8200020808DF8428049
+:1014F00042F60120ADF840009DF81E0020F00600E5
+:10150000801C20F001008DF81E000220ADF8300094
+:10151000ADF8340014A80E90684606F058FA00287A
+:1015200089D1BDF82000608036B1211D304600F021
+:101530005FF90028C2D109E0BBF1000F05D00CF023
+:1015400019FDE8BB0CF016FDD0BBA58017B1012F2B
+:1015500043D04AE08DF8428042F6A620ADF8400024
+:1015600046461C220021684607950CF088FF9DF82E
+:101570001C00ADF8346020F00F00401C20F0F0009B
+:1015800010308DF81C009DF81D0020F0FF008DF834
+:101590001D009DF81E0020F0060040F00100801C98
+:1015A0008DF81E009DF800008DF8446040F00200A8
+:1015B0008DF80000CDE90A9AADF8306011A800E07E
+:1015C00011E00E9008AA0AA9684606F000FA002861
+:1015D000A6D1BDF82000E08008E00CF0CBFC10B9EB
+:1015E0000CF0C8FC08B103200FE7E58000200CE7F1
+:1015F0003EB50446794D0820ADF80000A88828B112
+:101600002046FFF726FE18B110203EBD06203EBD45
+:101610002146012001F0D3FD0028F8D12088ADF843
+:1016200004006088ADF80600A088ADF80800E088E6
+:10163000ADF80A00A88801AB6A46002106F0CEFD8D
+:10164000BDF800100829E2D003203EBD7FB5634DF0
+:101650000446A88868B1002002900820ADF8080070
+:10166000CDF80CD02046FFF7F4FD20B1102004B0D7
+:1016700070BD0620FBE7A98802AA4FF6FF7006F0AE
+:10168000EFFF0028F3D1BDF80810082901D003208E
+:10169000EDE7BDF800102180BDF802106180BDF8B3
+:1016A0000410A180BDF80610E180E0E701B582B02A
+:1016B0000220ADF80000494802AB6A46408800218C
+:1016C00006F08CFDBDF80010022900D003200EBDED
+:1016D0001CB5002100910221ADF800100190FFF728
+:1016E000DEFD08B110201CBD3C486A4641884FF61B
+:1016F000FF7006F0B5FFBDF800100229F3D00320FB
+:101700001CBDFEB5354C06461546207A0F46C0076F
+:1017100005D00846FFF79DFD18B11020FEBD0F2033
+:10172000FEBDF82D01D90C20FEBD3046FFF791FD1E
+:1017300018BB208801A905F04CFE0028F4D13078B0
+:101740008DF80500208801A906F026FD0028EBD1C0
+:1017500000909DF800009DF8051040F002008DF803
+:101760000000090703D040F008008DF80000208831
+:10177000694606F0AEFC0028D6D1ADF808502088A6
+:101780003B4602AA002106F029FDBDF80810A94237
+:10179000CAD00320FEBD7CB5054600200090019014
+:1017A0000888ADF800000C4628460195FFF795FD26
+:1017B00018B92046FFF773FD08B110207CBD15B1A4
+:1017C000BDF8000060B105486A4601884FF6FF7019
+:1017D00006F046FFBDF8001021807CBD28020020E5
+:1017E0000C20FAE72F48C088002800D0012070475D
+:1017F00030B5044693B000200D46014600901422F7
+:1018000001A80CF03CFE1C22002108A80CF037FEB9
+:101810009DF80000CDF808D020F00F00401C20F00B
+:10182000F00010308DF800009DF8010006AA20F0AD
+:10183000FF008DF801009DF8200001A940F0020092
+:101840008DF8200001208DF8460042F60420ADF806
+:10185000440011A801902088ADF83C006088ADF8E4
+:101860003E00A088ADF84000E088ADF842009DF849
+:10187000020020F00600801C20F001008DF802001C
+:101880000820ADF80C00ADF810000FA8059008A8CE
+:1018900006F09DF8002803D1BDF81800288000202C
+:1018A00013B030BD28020020F0B5007B059F1E4616
+:1018B00014460D46012800D0FFDF0C2030803A206E
+:1018C0003880002C08D0287A032806D0287B0128ED
+:1018D00000D0FFDF17206081F0BDA889FBE72DE96C
+:1018E000F04786B0144691F80C900E9A0D46B9F167
+:1018F000010F0BD01021007B2E8A8846052807D0C7
+:10190000062833D0FFDF06B0BDE8F0870221F2E7FA
+:10191000E8890C2100EB400001EB400018803320E7
+:101920001080002CEFD0E889608100271AE0009633
+:10193000688808F1020301AA696900F086FF06EBD6
+:101940000800801C07EB470186B204EB4102BDF89A
+:10195000040090810DF1060140460E3213F096F816
+:101960007F1CBFB26089B842E1D8CCE73420108038
+:10197000E889B9F1010F11D0122148430E301880C7
+:10198000002CC0D0E88960814846B9F1010F00D031
+:101990000220207300270DF1040A1FE00621ECE766
+:1019A0000096688808F1020301AA696900F04DFFFA
+:1019B00006EB0800801C86B2B9F1010F12D007EBCC
+:1019C000C70004EB4000BDF80410C18110220AF1E9
+:1019D000020110300CF029FD7F1CBFB26089B842B3
+:1019E000DED890E707EB470104EB4102BDF80400A5
+:1019F000D0810AF102014046103213F047F8EBE7BC
+:101A00002DE9F0470E4688B090F80CC096F80C808F
+:101A1000378AF5890C20109902F10C044FF0000A66
+:101A2000BCF1030F08D0BCF1040F3FD0BCF1070F8D
+:101A30007ED0FFDF08B067E705EB850C00EB4C00BC
+:101A4000188031200880002AF4D0A8F1060000F0A8
+:101A5000FF09558126E01622002101A80CF00FFD98
+:101A600000977088434601AA716900F0EEFEBDF848
+:101A700004002080BDF80600E080BDF80800208149
+:101A8000A21C0DF10A01484613F000F8B9F1000F4D
+:101A900000D018B184F804A0A4F802A007EB080055
+:101AA00087B20A346D1EADB2D5D2C3E705EB850C03
+:101AB00000EB4C00188032200880002ABAD0A8F130
+:101AC000050000F0FF09558137E000977088434614
+:101AD00001AA716900F0B9FE9DF80600BDF8041076
+:101AE000E1802179420860F3000162F3410182083C
+:101AF00062F38201C20862F3C301020962F30411B6
+:101B0000420962F34511820962F386112171C0090D
+:101B10006071BDF80700208122460DF10901484699
+:101B200012F0B4FF18B184F802A0A4F800A000E0FD
+:101B300007E007EB080087B20A346D1EADB2C4D2CD
+:101B400078E7A8F1020084B205FB08F000F10E0C62
+:101B5000A3F800C035230B80002AA6D055819481BC
+:101B6000009783B270880E32716900F06EFE61E7F3
+:101B70002DE9F84F1E460A9D0C4681462AB1607A2F
+:101B800000F58070D080E089108199F80C000C2756
+:101B90004FF000084FF00E0A0D2872D2DFE800F077
+:101BA0009D070E1B272F374554697272720021461C
+:101BB00048460095FFF778FEBDE8F88F207B9146F8
+:101BC000082802D0032800D0FFDF3780302009E04A
+:101BD000A9F80A80F0E7207B9146042800D0FFDFB7
+:101BE000378031202880B9F1000FF1D1E4E7207B64
+:101BF0009146042800D0FFDF37803220F2E7207BB7
+:101C00009146022800D0FFDF37803320EAE7207BAF
+:101C10001746022800D0FFDF3420A6F800A0288055
+:101C2000002FC9D0A7F80A80C6E7207B17460428F2
+:101C300000D0FFDF3520A6F800A02880002FBBD001
+:101C40004046A7F80A8012E0207B1746052802D0FC
+:101C5000062800D0FFDF1020308036202880002F9B
+:101C6000AAD0E0897881A7F80E80B9F80E00B88173
+:101C7000A2E7207B9146072800D0FFDF378037207E
+:101C8000B0E72AE04FF0120018804FF0380017003C
+:101C9000288091D0E0897881A7F80E80A7F810807D
+:101CA00099F80C000A2805D00B2809D00C280DD073
+:101CB000FFDF81E7207B0A2800D0FFDF01200AE058
+:101CC000207B0B2800D0FFDF042004E0207B0C28C1
+:101CD00000D0FFDF052038736EE7FFDF6CE770B5DB
+:101CE0000C46054601F0AFFB20B10078222804D253
+:101CF000082070BD43F2020070BD0521284611F096
+:101D00002DF9206008B1002070BD032070BD30B4F3
+:101D10004880087820F00F00C01C20F0F0009030C0
+:101D200001F8080B1DCA81E81D0030BC07F079BC22
+:101D30002DE9FF4784B00027824602970798904616
+:101D4000894612300AF067FA401D20F00306079812
+:101D500028B907A95046FFF7C2FF002854D1B9F1AE
+:101D6000000F05D00798017B19BB052504681BE00F
+:101D700098F80000092803D00D2812D0FFDF46E0B4
+:101D8000079903254868B0B3497B42887143914263
+:101D900039D98AB2B3B2011D10F053FF044607804F
+:101DA00002E0079C042508340CB1208810B1032DF3
+:101DB00029D02CE00798012112300AF05EFAADF824
+:101DC0000C00024602AB2946504608F0B6FA07005E
+:101DD00001D1A01C029007983A461230C8F80400BE
+:101DE000A8F802A003A94046029B0AF053FAD8B112
+:101DF0000A2817D200E006E0DFE800F00709141413
+:101E0000100B0D141412132014E6002012E61120FA
+:101E100010E608200EE643F203000BE6072009E671
+:101E20000D2007E6032005E6BDF80C002346CDE9AA
+:101E300000702A465046079900F017FD57B9032D48
+:101E400008D10798B3B2417B406871438AB2011D43
+:101E500010F00BFFB9F1000FD7D0079981F80C9063
+:101E6000D3E72DE9FE4F91461A881C468A468046E4
+:101E7000FAB102AB494608F060FA050019D04046B5
+:101E8000A61C278811F0AFF93246072629463B46A3
+:101E9000009610F0BCFD20882346CDE900504A464C
+:101EA0005146404600F0E1FC002020800120BDE8C2
+:101EB000FE8F0020FBE710B586B01C46AAB10423B4
+:101EC0008DF800301388ADF808305288ADF80A203C
+:101ED0008A788DF80E200988ADF80C1000236A4628
+:101EE0002146FFF725FF06B010BD1020FBE770B5B7
+:101EF0000D46052111F032F8040000D1FFDF29461C
+:101F000004F11200BDE870400AF0A0B92DE9F843D1
+:101F10000D468046002607F081FB044628781028ED
+:101F200078D2DFE800F0773B345331311231313170
+:101F30000831313131312879001FC0B2022801D077
+:101F4000102810D114BBFFDF35E004B9FFDF0521F5
+:101F5000404611F003F8007B032806D004280BD07C
+:101F6000072828D0FFDF072655E02879801FC0B258
+:101F7000022820D050B1F6E72879401FC0B20228CD
+:101F800019D0102817D0EEE704B9FFDF13E004B929
+:101F9000FFDF287901280ED1172137E005214046BF
+:101FA00010F0DCFF070000D1FFDF07F1120140460F
+:101FB0000AF029F92CB12A4621464046FFF7A7FE30
+:101FC00029E01321404602F025FD24E004B9FFDF9B
+:101FD0000521404610F0C2FF060000D1FFDF694630
+:101FE00006F112000AF019F9060000D0FFDFA988F7
+:101FF000172901D2172200E00A46BDF800008242EC
+:1020000002D9014602E005E01729C5D3404600F099
+:102010003CFCD0E7FFDF3046BDE8F883401D20F0F0
+:10202000030219B102FB01F0001D00E00020104482
+:10203000704713B5009848B10024684610F0ABFD16
+:10204000002C02D1F74A009911601CBD0124002028
+:10205000F4E72DE9F0470C461546242200212046DE
+:102060000CF00DFA05B9FFDFA87860732888DFF857
+:10207000B4A3401D20F00301AF788946DAF80000D0
+:1020800010F0A7FD060000D1FFDF4FF0000826602A
+:10209000A6F8008077B109FB07F1091D0AD0DAF82C
+:1020A000000010F096FD060000D1FFDF6660C6F864
+:1020B000008001E0C4F80480298804F11200BDE822
+:1020C000F0470AF091B82DE9F047804601F112007F
+:1020D0000D4681460AF09FF8401DD24F20F00302C2
+:1020E0006E7B14462968386810F09EFD3EB104FBF3
+:1020F00006F2121D03D06968386810F095FD0520BE
+:1021000010F0D4FE0446052010F0D8FE201A012855
+:1021100002D1386810F052FD49464046BDE8F0470C
+:102120000AF078B870B50546052110F017FF0400D5
+:1021300000D1FFDF04F112012846BDE870400AF02B
+:1021400062B82DE9F04F91B04FF0000BADF834B00C
+:10215000ADF804B047880C4605469246052138463E
+:1021600010F0FCFE060000D1FFDF24B1A780A4F828
+:1021700006B0A4F808B0297809220B20B2EB111F91
+:102180007ED12A7A04F1100138274FF00C084FF065
+:1021900001090391102A74D2DFE802F073F3F2F11F
+:1021A0008008D3898EA03DDCF4EFB7B7307B0228DE
+:1021B00000D0FFDFA88908EBC001ADF80410302182
+:1021C000ADF83410002C25D06081B5F80E900027B2
+:1021D0001DE004EBC708317C88F80E10F189A8F8DF
+:1021E0000C10CDF800906888042304AA296900F037
+:1021F0002CFBBDF81010A8F8101009F10400BDF870
+:1022000012107F1C1FFA80F9A8F81210BFB2608963
+:10221000B842DED80EE1307B022800D0FFDFE9892A
+:1022200008EBC100ADF804003020ADF83400287B85
+:102230000A90001FC0B20F90002CEBD06181B5F85E
+:102240001090002726E000BFCDF8009068886969EB
+:1022500003AA0A9B00F0F9FA0A9804EBC70848445D
+:102260001FFA80F908F10C0204A90F9812F00EFC75
+:1022700018B188F80EB0A8F80CB0BDF80C1001E049
+:10228000D4E0D1E0A8F81010BDF80E107F1CA8F81B
+:102290001210BFB26089B842D6D8CBE00DA800902A
+:1022A00001AB224629463046FFF719FBC2E0307BDE
+:1022B000082805D0FFDF03E0307B082800D0FFDFCF
+:1022C000E8891030ADF804003620ADF83400002C59
+:1022D0003FD0A9896181F189A18127E0307B09285C
+:1022E00000D0FFDFA88900F10C01ADF80410372100
+:1022F000ADF83410002C2CD06081E8890090AB89B7
+:10230000688804F10C02296956E0E8893921103007
+:1023100080B2ADF80400ADF83410002C74D0A98957
+:102320006181287A0E280AD002212173E989E1818E
+:10233000288A0090EB8968886969039A3CE001214A
+:10234000F3E70DA8009001AB224629463046FFF77F
+:1023500057FB6FE0307B0A2800D0FFDF1220ADF87A
+:102360000400ADF834704CB3A9896181A4F810B0B1
+:10237000A4F80EB084F80C905CE020E002E031E0BC
+:1023800039E042E0307B0B2800D0FFDF288AADF82F
+:1023900034701230ADF8040084B104212173A9898E
+:1023A0006181E989E181298A2182688A00902B8AEA
+:1023B000688804F11202696900F047FA3AE0307B5C
+:1023C0000C2800D0FFDF1220ADF80400ADF8347007
+:1023D0003CB305212173A4F80AB0A4F80EB0A4F808
+:1023E00010B027E00DA8009001AB224629463046E8
+:1023F000FFF75AFA1EE00DA8009001AB22462946CD
+:102400003046FFF7B5FB15E034E03B21ADF80400A2
+:10241000ADF8341074B3A4F80690A4F808B084F8AA
+:102420000AB007E010000020FFDF03E0297A01294D
+:1024300017D0FFDFBDF80400AAF800006CB1BDF8AA
+:1024400034002080BDF804006080BDF834003928D5
+:1024500003D03C2801D086F80CB011B00020BDE8B4
+:10246000F08F3C21ADF80400ADF8341014B1697A56
+:10247000A172DFE7AAF80000EFE72DE9F8435688DC
+:102480000F46804615460521304610F067FD0400D2
+:1024900000D1FFDF123400943B46414630466A6863
+:1024A0000AF02CF8B8E570B50D46052110F056FD80
+:1024B000040000D1FFDF294604F11200BDE870409E
+:1024C00009F0B6BE70B50D46052110F047FD0400B9
+:1024D00000D1FFDF294604F11200BDE8704009F089
+:1024E000D4BE70B50546052110F038FD040000D1BA
+:1024F000FFDF04F1080321462846BDE870400422AE
+:10250000AFE470B50546052110F028FD040000D1A8
+:10251000FFDF214628462368BDE870400522A0E47D
+:1025200070B50646052110F019FD040000D1FFDF4B
+:1025300004F1120009F06FFE401D20F0030511E0C8
+:10254000011D00880322431821463046FFF789FC0D
+:1025500000280BD0607BABB2684382B26068011D7B
+:1025600010F0B9FB606841880029E9D170BD70B5F1
+:102570000E46054607F052F8040000D1FFDF0120A7
+:10258000207266726580207820F00F00C01C20F059
+:10259000F00030302070BDE8704007F042B82DE9FF
+:1025A000F0438BB00D461446814606A9FFF797FB12
+:1025B000002814D14FF6FF7601274FF420588CB134
+:1025C00003208DF800001020ADF8100007A805903A
+:1025D00007AA204604A912F078FA78B107200BB0B8
+:1025E000BDE8F0830820ADF808508DF80E708DF826
+:1025F0000000ADF80A60ADF80C800CE00698A178F8
+:1026000001742188C1818DF80E70ADF80850ADF8C5
+:102610000C80ADF80A606A4602214846069BFFF727
+:1026200087FBDCE708B501228DF8022042F60202A2
+:10263000ADF800200A4603236946FFF73CFC08BDBD
+:1026400008B501228DF8022042F60302ADF8002001
+:102650000A4604236946FFF72EFC08BD00B587B083
+:1026600079B102228DF800200A88ADF80820498847
+:10267000ADF80A1000236A460521FFF759FB07B0A1
+:1026800000BD1020FBE709B1072314E407207047C1
+:1026900070B588B00D461446064606A9FFF71FFB25
+:1026A00000280ED17CB10620ADF808508DF800004E
+:1026B000ADF80A40069B6A460821DC813046FFF7E8
+:1026C00037FB08B070BD05208DF80000ADF808504C
+:1026D000F0E700B587B059B107238DF80030ADF8A9
+:1026E0000820039100236A460921FFF721FBC6E772
+:1026F0001020C4E770B588B00C460646002506A930
+:10270000FFF7EDFA0028DCD106980121123009F01C
+:10271000B4FD9CB12178062921D2DFE801F0200523
+:1027200005160318801E80B2C01EE28880B20AB16E
+:10273000A3681BB1824203D90C20C2E71020C0E776
+:10274000042904D0A08850B901E00620B9E7012986
+:1027500013D0022905D004291CD005292AD007202E
+:10276000AFE709208DF800006088ADF80800E08828
+:10277000ADF80A00A068039023E00A208DF800005D
+:102780006088ADF80800E088ADF80A00A0680A2566
+:10279000039016E00B208DF800006088ADF808006B
+:1027A000A088ADF80A00E088ADF80C00A0680B2501
+:1027B000049006E00C208DF8000060788DF8080089
+:1027C0000C256A4629463046069BFFF7B1FA78E7A2
+:1027D00000B587B00D228DF80020ADF80810002359
+:1027E0006A461946FFF7A4FA49E700B587B071B108
+:1027F00002228DF800200A88ADF808204988ADF83B
+:102800000A1000236A460621FFF792FA37E71020E4
+:1028100035E770B586B0064601200D46ADF80810C4
+:102820008DF80000014600236A463046FFF780FA23
+:10283000040008D12946304605F0EAFC0021304664
+:1028400005F004FD204606B070BDF8B51C461546DF
+:102850000E46069F10F0B5FC2346FF1DBCB2314664
+:102860002A46009410F09FF8F8BD30B41146DDE917
+:1028700002423CB1032903D0002330BC08F03BBE28
+:102880000123FAE71A8030BC704770B50C46054644
+:10289000FFF72DFB2146284605F0C9FC2846BDE878
+:1028A0007040012105F0D2BC4FF0E0224FF400400F
+:1028B0000021C2F88001BFF34F8FBFF36F8F17481D
+:1028C000016001601649900208607047134900B525
+:1028D00000220A600A60124B4FF060721A600028F2
+:1028E00008BF00BD0F4A104BDFF840C001280CD0D4
+:1028F00002281CBFFFDF00BD032008601A604FF4F0
+:10290000000000BFCCF8000000BD022008601A6083
+:102910004FF04070F6E700B5FFDF00BD00F5004066
+:1029200008F50140A802002014F5004004F501401C
+:1029300070B50B2000F0BDF9082000F0BAF90021B5
+:102940000B2000F0D4F90021082000F0D0F9F44C5D
+:1029500001256560A5600020C4F84001C4F8440169
+:10296000C4F848010B2000F0B5F9082000F0B2F9D6
+:102970000B2000F091F9256070BD10B50B2000F020
+:1029800098F9082000F095F9E5480121416081603F
+:10299000E4490A68002AFCD10021C0F84011C0F8BF
+:1029A0004411C0F848110B2000F094F9BDE8104024
+:1029B000082000F08FB910B50B2000F08BF9BDE8AE
+:1029C0001040082000F086B900B530B1012806D0CB
+:1029D000022806D0FFDF002000BDD34800BDD34849
+:1029E00000BDD248001D00BD70B5D1494FF0004078
+:1029F0000860D04DC00BC5F80803CF480024046020
+:102A0000C5F840410820C43500F053F9C5F83C41F1
+:102A1000CA48047070BD08B5C14A002128B1012818
+:102A200011D002281CD0FFDF08BD4FF48030C2F85F
+:102A30000803C2F84803BB483C300160C2F84011AB
+:102A4000BDE80840D0E74FF40030C2F80803C2F8F0
+:102A50004803B44840300160C2F84411B3480CE068
+:102A60004FF48020C2F80803C2F84803AD48443050
+:102A70000160C2F84811AD48001D0068009008BD13
+:102A800070B516460D460446022800D9FFDF002225
+:102A9000A348012304F110018B4000EB8401C1F82D
+:102AA000405526B1C1F84021C0F8043303E0C0F816
+:102AB0000833C1F84021C0F8443370BD2DE9F0411E
+:102AC0001D46144630B1012833D0022838D0FFDF2C
+:102AD000BDE8F081891E002221F07F411046FFF7FA
+:102AE000CFFF012D23D00020944D924F0126687016
+:102AF0003E61914900203C3908600220091D0860B0
+:102B00008D490420303908608B483D34046008202A
+:102B10006C6000F0DFF83004C7F80403082000F010
+:102B2000BBF88349F007091F08602E70D0E7012029
+:102B3000DAE7012B02D00022012005E00122FBE7A9
+:102B4000012B04D000220220BDE8F04198E70122C9
+:102B5000F9E774480068704770B500F0D8F8704C19
+:102B60000546D4F840010026012809D1D4F808030D
+:102B7000C00305D54FF48030C4F80803C4F84061A1
+:102B8000D4F8440101280CD1D4F80803800308D5F7
+:102B90004FF40030C4F80803C4F84461012012F077
+:102BA0005BFFD4F8480101280CD1D4F80803400396
+:102BB00008D54FF48020C4F80803C4F84861022007
+:102BC00012F04AFF5E48056070BD70B500F09FF8D6
+:102BD0005A4D0446287850B1FFF706FF687818B1BF
+:102BE0000020687012F038FF5548046070BD032063
+:102BF000F8E74FF0E0214FF40010C1F800027047F1
+:102C0000152000F067B84B4901200861082000F04A
+:102C100061B848494FF47C10C1F80803002002460F
+:102C200001EB8003C3F84025C3F84021401CC0B22B
+:102C30000628F5D37047410A43F609525143C0F3C1
+:102C4000080010FB02F000F5807001EB5020704787
+:102C500010B5430B48F2376463431B0C5C020C60F5
+:102C6000384C03FB0400384B4CF2F72443435B0D14
+:102C700013FB04F404EB402000F580704012107048
+:102C800008681844086010BD2C48406870472949FE
+:102C90000120C1F800027047002809DB00F01F0284
+:102CA000012191404009800000F1E020C0F80011AE
+:102CB000704700280DDB00F01F0201219140400900
+:102CC000800000F1E020C0F88011BFF34F8FBFF308
+:102CD0006F8F7047002809DB00F01F02012191402F
+:102CE0004009800000F1E020C0F8801270474907D9
+:102CF000090E002804DB00F1E02080F80014704782
+:102D000000F00F0000F1E02080F8141D70470C481F
+:102D1000001F00680A4A0D49121D1160704700002B
+:102D200000B0004004B500404081004044B1004084
+:102D300008F5014000800040408500403800002038
+:102D400014050240F7C2FFFF6F0C010001000001F3
+:102D50000A4810B50468094909480831086012F0AA
+:102D60000FFF0648001D046010BD064900200860E2
+:102D70004FF0E0210220C1F88002704710050240A8
+:102D800001000001FC1F0040374901200860704726
+:102D900070B50D2000F049F8344C0020C4F8000153
+:102DA0000125C4F804530D2000F050F825604FF0C1
+:102DB000E0216014C1F8000170BD10B50D2000F0D5
+:102DC00034F82A48012141600021C0F80011BDE813
+:102DD00010400D2000F03AB8254810B50468244989
+:102DE0002448083108602149D1F80001012804D0A5
+:102DF000FFDF1F48001D046010BD1B48001D006858
+:102E00000022C0B2C1F8002113F0E1FBF1E710B5D8
+:102E1000164800BFD0F800110029FBD0FFF7DCFFF7
+:102E2000BDE810400D2000F011B800280DDB00F0C7
+:102E30001F02012191404009800000F1E020C0F80C
+:102E40008011BFF34F8FBFF36F8F7047002809DBEE
+:102E500000F01F02012191404009800000F1E020B4
+:102E6000C0F880127047000004D5004000D0004038
+:102E700010050240010000014FF0E0214FF000700A
+:102E8000C1F8800101F5C071BFF34F8FBFF36F8FA1
+:102E9000C1F80001394B802283F8002441F8800CEE
+:102EA000704700B502460420354903E001EBC0033A
+:102EB0001B792BB1401EC0B2F8D2FFDFFF2000BD4E
+:102EC00041F8302001EBC00100224A718A710122D1
+:102ED0000A7100BD2A4A002102EBC000017170474F
+:102EE00010B50446042800D3FFDF254800EBC404D6
+:102EF0002079012800D0FFDF6079A179401CC0B2A1
+:102F0000814200D060714FF0E0214FF00070C1F8B5
+:102F1000000210BD70B50425194E1A4C16E0217838
+:102F200006EBC1000279012A08D1427983799A42DD
+:102F300004D04279827156F8310080472078401CD5
+:102F4000C0B22070042801D3002020706D1EEDB2A5
+:102F5000E5D270BD0C4810B504680B490B48083128
+:102F60000860064890F800044009042800D0FFDFFC
+:102F7000FFF7D0FF0448001D046010BD19E000E019
+:102F8000E00500205400002010050240010000016F
+:102F90000548064A0168914201D1002101600449B7
+:102FA000012008607047000058000020BEBAFECA29
+:102FB00040E5014070B50C46054609F03BFC214652
+:102FC0002846BDE870400AF01CBD70477047704746
+:102FD0001EF0040F0CBFEFF30880EFF30980014AE5
+:102FE000104700009B6C01000FF20C0000F1000084
+:102FF000694641F8080C20BF704700000004050630
+:103000002CFFFFFFDBE5B15100700200CA00FFFF9B
+:103010008C000000C1CF6A00FEA0D9111C1006C3AD
+:1030200089CCFC7A7B3B49141906A8C030B5F84D11
+:103030000446062CA9780ED2DFE804F0030E0E0E2B
+:103040000509FFDF08E0022906D0FFDF04E00329BD
+:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA
+:103060001038EB4D07280CD2DFE800F0040C060CFA
+:103070000C0C0C00FFDF05E0287E112802D0FFDFDA
+:1030800000E0FFDF2C7630BD2DE9F04111F088FE25
+:10309000044613F0BBF8201AC5B206200FF006FF55
+:1030A000044606200FF00AFF211AD94C207E122870
+:1030B00018D000200F1807200FF0F8FE0646072052
+:1030C0000FF0FCFE301A3918207E13280CD0002097
+:1030D0000144A078042809D000200844281AC0B26E
+:1030E000BDE8F0810120E5E70120F1E70120F4E7E8
+:1030F000C74810B590F825004108C54800F12600E2
+:1031000005D00DF05BFFBDE8104006F0A9B80DF04A
+:1031100036FFF8E730B50446A1F120000D460A2835
+:103120004AD2DFE800F005070C1C2328353A3F445B
+:10313000FFDF42E0207820283FD1FFDF3DE0B448A8
+:103140008178052939D0007E122836D020782428AD
+:1031500033D0252831D023282FD0FFDF2DE0207851
+:1031600022282AD0232828D8FFDF26E0207822280A
+:1031700023D0FFDF21E0207822281ED024281CD075
+:1031800026281AD0272818D0292816D0FFDF14E0C7
+:103190002078252811D0FFDF0FE0207825280CD0DB
+:1031A000FFDF0AE02078252807D0FFDF05E0207840
+:1031B000282802D0FFDF00E0FFDF257030BD1FB5FB
+:1031C00004466A46002001F0A5FEB4B1BDF8022015
+:1031D0004FF6FF700621824201D1ADF80210BDF812
+:1031E0000420824201D1ADF80410BDF808108142DC
+:1031F00003D14FF44860ADF8080068460EF048FB74
+:1032000006F02EF804B010BD70B514460D46064603
+:10321000FEF71FF858B90DB1A54201D90C2070BDB9
+:10322000002408E056F82400FEF713F808B1102037
+:1032300070BD641CE4B2AC42F4D3002070BD2DE933
+:10324000F04105461F4690460E4600240068FEF7F2
+:103250004DF830B9A98828680844401EFEF746F8A2
+:1032600008B110203CE728680028A88802D0B8429E
+:1032700002D850E00028F5D0092031E72968085D20
+:10328000B8B1671CCA5D152A2ED03CDC152A3AD28B
+:10329000DFE802F03912222228282A2A313139396E
+:1032A00039393939393939392200085D30BB641C64
+:1032B000A4B2A242F9D833E00228DDD1A01C085CF8
+:1032C00088F80000072801D2400701D40A2007E748
+:1032D000307840F0010015E0C143C90707E001283C
+:1032E00007D010E00620FBE60107A1F1805100297C
+:1032F000F5D01846F4E63078810701D50B20EFE6CB
+:1033000040F0020030702868005D384484B2A8881C
+:10331000A04202D2B0E74FF4485382B2A242ADD8E5
+:103320000020DDE610B5027843F2022354080122A2
+:10333000022C12D003DC3CB1012C16D106E0032C88
+:1033400010D07F2C11D112E0002011E080790324ED
+:10335000B4EB901F09D10A700BE08079B2EB901F9B
+:1033600003D1F8E780798009F5D0184610BDFF2019
+:103370000870002010BD08B500208DF8000024481A
+:1033800090F82E1049B190F82F0002280ED0032893
+:103390000ED0FFDF9DF8000008BD1D4869462530AE
+:1033A00001F007FE0028F5D0FFDFF3E7032000E07F
+:1033B00001208DF80000EDE738B50C46054669465A
+:1033C00001F0F7FD00280DD19DF80010207861F381
+:1033D0004700207055F8010FC4F80100A888A4F830
+:1033E0000500002038BD38B51378A8B1022813D0E5
+:1033F000FF281AD007A46D46246800944C7905EB89
+:103400009414247864F347031370032809D00FE061
+:10341000F40100200302FF0123F0FE0313700228D1
+:10342000F3D1D8B240F0010005E043F0FE00107087
+:10343000107820F0010010700868C2F80100888838
+:10344000A2F8050038BD02210FF088BD38B50C4642
+:103450000978222901D2082038BDADF800008DF886
+:10346000022068460DF0ECFD05F0FAFE050003D1E0
+:1034700021212046FFF74EFE284638BD1CB500200E
+:103480008DF80000CDF80100ADF80500FB4890F87C
+:103490002E00022801D0012000E000208DF8070056
+:1034A00068460DF055FE002800D0FFDF1CBD00224D
+:1034B0000A80437892B263F3451222F040020A80F8
+:1034C00000780C282BD2DFE800F02A06090E11162E
+:1034D000191C1F220C2742F0110009E042F01D00C8
+:1034E00008800020704742F0110012E042F0100006
+:1034F00040F00200F4E742F01000F1E742F0010072
+:10350000EEE742F0010004E042F00200E8E742F09A
+:10351000020040F00400E3E742F00400E0E7072087
+:1035200070472DE9FF478AB00025BDF82C60824620
+:103530001C4691468DF81C50700703D56068FDF756
+:1035400088FE68B9CD4F4FF0010897F82E0058B1AA
+:1035500097F82F00022807D16068FDF7C7FE18B161
+:1035600010200EB0BDE8F087300702D5A089802872
+:103570003ED8700705D4B9F1000F02D097F82400A7
+:10358000A0B3E07DC0F300108DF81B00627D072022
+:10359000032162B3012A2DD0022AE2D0042AE0D10D
+:1035A0008DF81710F00628D4A27D07202AB3012A2F
+:1035B00023D0022A24D0042AD3D18DF8191000BFB9
+:1035C0008DF81590606810B307A9FFF7ABFE0028CF
+:1035D000C7D19DF81C00FF2816D0606850F8011F65
+:1035E000CDF80F108088ADF8130014E000E001E082
+:1035F0000720B6E78DF81780D4E78DF81980DFE74C
+:1036000002208DF81900DBE743F20220A9E7CDF88C
+:103610000F50ADF81350E07B40B9207C30B9607C8E
+:1036200020B9A07C10B9E07CC00601D0062098E744
+:103630008DF800A0BDF82C00ADF80200A068019044
+:10364000A068029004F10F0001F0A7FC8DF80C00B7
+:10365000FFF791FE8DF80D009DF81C008DF80E000F
+:103660008DF816508DF81850E07D08A900F00F0075
+:103670008DF81A0068460EF047FA05F0F1FD70E784
+:10368000F0B58FB000258DF830508DF814508DF8BE
+:10369000345006468DF828500195029503950495FF
+:1036A00019B10FC901AC84E80F00744CA07805284B
+:1036B00001D004280CD101986168884200D120B95A
+:1036C0000398E168884203D110B108200FB0F0BD23
+:1036D000207DC00601D51F2700E0FF273B460DAA2D
+:1036E00005A903A8FFF7ABFD0028EFD1A08AC10709
+:1036F00002D0C00600D4EE273B460AAA0CA901A8B6
+:10370000FFF79DFD0028E1D19DF81400C00701D00E
+:103710000A20DBE7A08A410708D4A17D31B19DF8DA
+:103720002810890702D043F20120CFE79DF8281026
+:10373000C90709D0400707D4208818B144F2506166
+:10374000884201D90720C1E78DF818508DF819601B
+:10375000BDF80800ADF81A000198079006A80EF011
+:10376000DFF905F07DFD0028B0D18DF820508DF8EF
+:103770002160BDF81000ADF822000398099008A858
+:103780000EF0F0F905F06CFD00289FD101AD241D6D
+:1037900095E80F0084E80F00002097E770B586B029
+:1037A0000D46040005D0FDF7A1FD20B1102006B0A4
+:1037B00070BD0820FBE72078C107A98802D0FF2947
+:1037C00002D303E01F2901D20920F0E7800763D468
+:1037D000FFF75AFC38B12178C1F3C100012804D0A9
+:1037E000032802D005E01320E1E7244890F82400E4
+:1037F000C8B1C8074FF001064FF0000502D08DF8A0
+:103800000F6001E08DF80F50FFF7B5FD8DF8000057
+:1038100020786946C0F3C1008DF8010060788DF80A
+:103820000250C20801D00720C1E730B3C20701D05F
+:103830008DF80260820705D59DF8022042F0020251
+:103840008DF80220400705D59DF8020040F00400E5
+:103850008DF80200002022780B18C2F38002DA7083
+:1038600001EB40026388D380401CA388C0B253811F
+:103870000228F0D3207A78B905E001E0F4010020B5
+:103880008DF80260E6E7607A30B9A07A20B9E07A74
+:1038900010B9207BC00601D0062088E704F108009B
+:1038A00001F07BFB8DF80E0068460DF05AFD05F027
+:1038B000D7FC002889D18DF810608DF81150E08870
+:1038C000ADF81200ADF8145004A80DF09DFD05F000
+:1038D000C7FC002888D12078C00701D0152000E05F
+:1038E0001320FFF7BBFB002061E72DE9FF47022013
+:1038F000FD4E8DF804000027708EADF80600B84626
+:1039000043F202094CE001A80FF08FFA050006D03F
+:10391000708EA8B3A6F83280ADF806803EE0039C16
+:10392000A07F01072DD504F124000090A28EBDF8E0
+:103930000800214604F1360301F0CAFC050005D059
+:103940004D452AD0112D3CD0FFDF3AE0A07F20F07A
+:103950000801E07F420862F3C711A177810861F393
+:103960000000E07794F8210000F01F0084F82000A8
+:103970002078282826D129212046FFF7CBFB21E0FB
+:1039800014E040070AD5BDF8080004F10E0101F06B
+:103990001AFB05000DD04D4510D100257F1CFFB24C
+:1039A00002200FF083FA401CB842ACD8052D11D08C
+:1039B00008E0A07F20F00400A07703E0112D00D0E4
+:1039C000FFDF0025BDF806007086052D04D02846CF
+:1039D00004B0C7E5A6F832800020F9E770B50646C6
+:1039E000FFF731FD054605F019FE040000D1FFDFA9
+:1039F0006680207820F00F00801C20F0F00020303E
+:103A000020700320207295F83E006072BDE870407F
+:103A100005F007BE2DE9F04786B0040000D1FFDFB6
+:103A20002078B14D20F00F00801C20F0F0007030A5
+:103A3000207060680178491F1B2933D2DFE801F04C
+:103A4000FE32323255FD320EFDFD42FC323232780A
+:103A5000FCFCFBFA32FCFCF9F8FCFC00C6883046A2
+:103A6000FFF7F1FC0546304607F03BFCE0B160682B
+:103A7000007A85F83E0021212846FFF74BFB3046AF
+:103A8000FEF750FB304603F0E7FE3146012013F00D
+:103A900063F8A87F20F01000A877FFF726FF002822
+:103AA00000D0FFDF06B05DE5207820F0F000203088
+:103AB00020700320207266806068007A607205F0D2
+:103AC000B0FDD8E7C5882846FFF7BDFC00B9FFDF89
+:103AD00060680079012800D0FFDF6068017A06B0D5
+:103AE0002846BDE8F04707F0E1BDC6883046FFF73D
+:103AF000AAFC050000D1FFDF05F093FD60683146A8
+:103B00000089288160684089688160688089A8810F
+:103B1000012013F021F80020A875A87F00F0030011
+:103B20000228BFD1FFF7E1FE0028BBD0FFDFB9E7D5
+:103B3000007928B10228B5D03C28B3D0FFDFB1E727
+:103B400005F06FFD6668B6F806A0307A361D0128CC
+:103B500006D0687E814605F0EFFA070003D101E048
+:103B6000E878F7E7FFDF0022022150460FF0EDF979
+:103B7000040000D1FFDF22212046FFF7CBFA307985
+:103B8000012800D00220A17F804668F30101A177BF
+:103B9000308B2081708B6081B08BA08184F8229063
+:103BA0008DF80880B8680090F86801906A46032193
+:103BB00050460FF0CAF900B9FFDFB888ADF8100021
+:103BC000B8788DF8120004AA052150460FF0BDF90F
+:103BD00000B9FFDFB888ADF80C00F8788DF80E005A
+:103BE00003AA042150460FF0B0F900B9FFDF062107
+:103BF00006F1120001F005FA40B37079800700D594
+:103C0000FFDF7179E07D61F34700E075D6F80600CB
+:103C1000A0617089A083062106F10C0001F0F1F982
+:103C2000F0B195F825004108607861F3470006E09F
+:103C300041E039E071E059E04EE02FE043E0607090
+:103C4000D5F82600C4F80200688D12E0E07D20F06F
+:103C5000FE00801CE075D6F81200A061F08AD9E75A
+:103C6000607820F0FE00801C6070F068C4F80200EC
+:103C7000308AE080B8F1010F04D0B8F1020F05D00E
+:103C8000FFDF0FE70320FFF7D1F90BE7287E1228AB
+:103C900000D0FFDF1120FFF7E1F903E706B020466F
+:103CA000BDE8F04701F0A0BD05F0BBFC15F8300FF2
+:103CB00040F0020005E005F0B4FC15F8300F40F0CC
+:103CC00004002870EEE6287E13280AD01528D8D1E3
+:103CD0005FF01600FFF7C2F906B0BDE8F04705F047
+:103CE000A0BC1420F6E70000F4010020A978052903
+:103CF00009D00429C5D105F094FC022006B0BDE826
+:103D0000F047FFF793B900790028BAD0E87801F0BE
+:103D10002BF905F086FC0320F0E7287E122802D15B
+:103D2000687E01F021F91120D4E72DE9F05F054606
+:103D300000784FF000080009DFF8B4A891460C465F
+:103D4000464601286ED002286DD007280BD00A28DD
+:103D50006AD0FFDFA9F8006014B1A4F80080668083
+:103D60000020BDE8F09F6968012704F108000B7886
+:103D70004FF0020B5B1F4FF6FF721B2B7ED2DFE86A
+:103D800003F0647D7D7D0E7D7D7D7D7D7D217D7D4E
+:103D90007D2BFDFCFBFA7D14D2F9E7F8F700C8880B
+:103DA0004FF01208102621469AE14FF01C080A260F
+:103DB000BCB38888A0806868807920726868C07900
+:103DC0006072C7E74FF01B08142654B3032020721B
+:103DD00068688088A080BDE70A793C2ABAD00D1DAA
+:103DE0004FF010082C26E4B16988A180298B6182EC
+:103DF000298B2182698BA182A98BE1826B79024692
+:103E0000A91D1846FFF7EFFA2979002001290CD0E7
+:103E100084F80FB0FF212176E06120626062A06229
+:103E200098E70FE03BE15EE199E1E77320760AF164
+:103E3000040090E80E00DAF81000C4E90930C4E983
+:103E4000071287E7A9F800608AE72C264FF01D08C3
+:103E5000002CF7D0A28005460F1D897B008861F3F6
+:103E600000002880B97A490861F341002880B97AB6
+:103E7000890861F382002880B97A00E00CE1C90862
+:103E800061F3C3002880B97AAA1C0911491C61F3A7
+:103E9000041000F07F0028807878B91CFFF7A3FA9F
+:103EA000387D05F1090207F11501FFF79CFA387B0F
+:103EB00001F0B6F82874787B01F0B2F86874F87EE7
+:103EC000A874787AE874387F2875B87B6875388A62
+:103ED000E882DAF81C10A961B97A504697F808A070
+:103EE000C1F34111012904D0008C504503D2824610
+:103EF00009E0FFDF10E0022903D0288820F06000ED
+:103F000009E0504504D1288820F06000403002E0EC
+:103F1000288840F060002880A4F824A0524607F1C9
+:103F20001D01A8699BE011264FF02008002C89D0C4
+:103F3000A280686804F10A02007920726868007B38
+:103F4000607269688B1D48791946FFF74CFA01E7E2
+:103F50000A264FF02108002CE9D08888A0806868E4
+:103F6000807920726868C07960729AF8301006E033
+:103F700078E06BE052E07FE019E003E03AE021F006
+:103F80000401A6E00B264FF02208002CCFD0C888F1
+:103F9000A0806868007920726868007A01F040F8B3
+:103FA00060726868407A01F03BF8A072D2E61C2685
+:103FB0004FF02608002CBAD0A28068684079607261
+:103FC0006868007AA0720AF1040090E80E00DAF83E
+:103FD0001000C4E90530C4E90312686800793C2880
+:103FE00003D0432803D0FFDFB4E62772B2E684F89B
+:103FF00008B0AFE610264FF02408002C97D0888830
+:10400000A0806868807920816868807A60816868AB
+:104010000089A08168688089E0819BE610264FF0C6
+:104020002308002C98D08888A0806868C0882081E8
+:1040300068680089608168684089A08168688089B3
+:10404000E0819AF8301021F0020142E030264FF072
+:104050002508002C9AD0A2806968282249680AF0B5
+:10406000E4F977E62A264FF02F08002C8ED0A280A4
+:1040700069682222091DF2E714264FF01B08002C64
+:1040800084D0A280686800790128B0D02772DAE96C
+:104090000710C4E903105DE64A46214660E0287A2D
+:1040A000012803D0022817D0FFDF53E610264FF077
+:1040B0001F08002CA2D06888A080A8892081E889E8
+:1040C0006081288AA081688AE0819AF8301021F006
+:1040D00001018AF830103DE64FF01208102668887A
+:1040E00000F07CFF36E6287AC8B3012838D00228D1
+:1040F00036D0032801D0FFDF2CE609264FF0110847
+:10410000002C8FD06F883846FFF79DF990F822A0D9
+:10411000A780687A2072042138460EF031FF05210D
+:1041200038460EF02DFF002138460EF029FF012100
+:1041300038460EF025FF032138460EF021FF0221FC
+:1041400038460EF01DFF062138460EF019FF0721F4
+:1041500038460EF015FF504600F006FFFAE5FFE77F
+:104160002846BDE8F05F01F0C9BC70B5012803D056
+:10417000052800D0FFDF70BD8DB22846FFF763F938
+:10418000040000D1FFDF20782128F4D005F046FAA2
+:1041900080B1017821F00F01891C21F0F00110316C
+:1041A00001700221017245800020A075BDE87040B9
+:1041B00005F037BA21462846BDE870401322FFF7C4
+:1041C00045B92DE9F04116460C00804600D1FFDFCD
+:1041D000307820F00F00801C20F0F000103030709C
+:1041E0002078012804D0022818D0FFDFBDE8F08134
+:1041F0004046FFF728F9050000D1FFDF0320A8752E
+:1042000005F00FFA94E80F00083686E80F00F8482A
+:1042100010F8301F41F001010170E7E74046FFF759
+:1042200012F9050000D1FFDFA1884FF6FF700027CB
+:10423000814202D1E288824203D0814201D1E088EA
+:1042400040B105F0EEF994E80F00083686E80F005B
+:10425000AF75CBE7A87D0128C8D17823002241465D
+:1042600012F0D0FB0220A875C0E738B505460C4611
+:104270000846FCF7EEFF70BB232D4AD006DC202D4C
+:104280000DD0212D23D0222D06D13DE0242D46D066
+:10429000252D32D03F2D47D00725284638BD002197
+:1042A000052012F02FFC08B1112038BDA01C0DF024
+:1042B00042FB04F0D5FF0500EFD100220823114690
+:1042C000052012F09FFB0528E7D0FFDFE5E76068D7
+:1042D000FDF703F808B1102038BD618820886A46D0
+:1042E0000DF0D2FD04F0BCFF0500D6D160680028B7
+:1042F000D3D0BDF800100180CFE7A07800F0010115
+:1043000020880DF0F2FD17E0206801F0A3FE0546BD
+:10431000C3E7207800F001000CF024FE0CE0618877
+:1043200020880DF02CFD07E0207800F001008DF8CA
+:10433000000068460DF04AF904F092FFE7E770B517
+:1043400005460C460846FCF7AAFF08B1102070BDD0
+:10435000202D07D0212D0DD0222D0BD0252D09D0B9
+:10436000072070BD2088A11C0CF0D0FEBDE8704075
+:1043700004F076BF062070BD9D482530704708B513
+:10438000342200219A480AF07AF80120FEF74EFE06
+:104390001120FEF763FE96496846263105F0D4F8F1
+:1043A00093489DF8002010F8251F62F3470121F083
+:1043B00001010170002141724FF46171A0F80710F2
+:1043C00002218172FEF794FE00B1FFDFFDF70AF8CB
+:1043D00001F0D3F908BD10B50C464022002120465B
+:1043E0000AF04DF8A07F20F00300A0772020207075
+:1043F0000020A07584F8230010BD70472DE9FC4112
+:104400000746FCF726FF10B11020BDE8FC81784E6E
+:1044100006F12501D6F825000090B6F82950ADF830
+:10442000045096F82B408DF806403846FEF7C4FF3E
+:104430000028EAD1FEF75CFE0028E6D0009946F895
+:10444000251FB580B471E0E710B50446FCF727FFDF
+:1044500008B1102010BD66486549224690F8250035
+:1044600026314008FEF7BFFF002010BD3EB50446D0
+:104470000D460846FCF713FF08B110203EBD14B1ED
+:1044800043F204003EBD5A488078052803D0042832
+:1044900001D008203EBD694602A80AF019FC2A4650
+:1044A00069469DF80800FEF79EFF00203EBDFEB560
+:1044B0000D4604004FF0000711D00822FEF7A4FEBD
+:1044C000002811D1002608E054F826006946FEF7BE
+:1044D00029FF002808D1761CF6B2AE42F4D30CF0C6
+:1044E00088FC10B143F20320FEBD414E86F82470D3
+:1044F0000CB300271BE000BF54F8270002A9FEF709
+:1045000011FF00B1FFDF9DF808008DF8000054F89E
+:10451000270050F8011FCDF801108088ADF8050084
+:1045200068460CF08BFC00B1FFDF7F1CFFB2AF428E
+:10453000E2D386F824500020FEBD2DE9F0478AB072
+:104540001546894604001FD00F4608222946FEF76B
+:104550005BFE002811D1002614E000BF54F82600AD
+:104560006946103000F025FD002806D147B157F804
+:104570002600FCF76EFE18B110200AB0BDE8F087E7
+:10458000761CF6B2AE42E9D30026A5F101081BE085
+:1045900006F1010A0AF0FF0712E000BF54F82600F6
+:1045A000017C4A0854F827100B7CB2EB530F05D15D
+:1045B00006221130113109F00BFF58B17F1CFFB2F8
+:1045C000AF42EBD30AF0FF064645E1DB4E4624B18D
+:1045D000012003E043F20520CFE700200CF053FC5C
+:1045E00010B90CF05CFC28B143F20420C5E70000D0
+:1045F000F401002064B300270DF1170826E000BF86
+:1046000054F827006946103000F0D3FC00B1FFDFFA
+:1046100054F82700102250F8111FCDF8011080889F
+:10462000ADF8050054F827100DF1070009F0FDFE64
+:1046300096B156F827101022404609F0F6FE68465B
+:104640000CF0E1FB00B1FFDF7F1CFFB2AF42D7D31C
+:10465000FEF714FF002090E7404601F0EFFCEEE784
+:1046600030B585B00446FDF7BDF830B906200EF030
+:104670001DFC10B1062005B030BD2046FCF7E9FD59
+:1046800018B96068FCF732FE08B11020F3E76088C3
+:104690004AF2B811884206D82078F94D28B101288D
+:1046A00006D0022804D00720E5E7FEF721FD18E038
+:1046B0006078022804D0032802D043F20220DAE70F
+:1046C00085F82F00C1B200200090ADF80400022947
+:1046D0002CD0032927D0FFDF68460CF06FFC04F0D4
+:1046E000BFFD0028C7D1606801F09BFC207858B15D
+:1046F00001208DF800000DF1010001F09FFC6846DB
+:104700000DF059FC00B1FFDF207885F82E00FEF790
+:10471000B5FE608860B1A88580B20CF0ACFB00B13A
+:10472000FFDF0020A7E78DF80500D5E74020FAE776
+:104730004FF46170EFE710B50446FCF7B0FD20B907
+:10474000606838B1FCF7C9FD08B1102010BD606881
+:1047500001F074FCCA4830F82C1F6180C178617088
+:1047600080782070002010BD2DE9F843144689465A
+:104770000646FCF794FDA0B94846FCF7B7FD80B9A2
+:104780002046FCF7B3FD60B9BD4DA878012800D1E3
+:104790003CB13178FF2906D049B143F20400BDE8AD
+:1047A000F8831020FBE7012801D00420F7E7CCB301
+:1047B000052811D004280FD069462046FEF777FE61
+:1047C0000028ECD1217D49B1012909D0022909D065
+:1047D000032909D00720E2E70820E0E7024604E0C9
+:1047E000012202E0022200E003228046234617460F
+:1047F00000200099FEF795FE0028D0D1A0892880DE
+:10480000A07BE875BDF80000A882AF75BDF8001068
+:10481000090701D5A18931B1A1892980C00704D038
+:10482000032003E006E08021F7E70220FEF7FEFB0D
+:1048300086F800804946BDE8F8430020FEF720BF17
+:104840007CB58F4C05460E46A078022803D003287D
+:1048500001D008207CBD15B143F204007CBD0720C7
+:104860000EF02CFB10B9A078032806D0FEF70CFC44
+:1048700028B1A078032804D009E012207CBD1320C1
+:104880007CBD304600F053FB0028F9D1E670FEF7FE
+:1048900072FD0AF05AF901208DF800008DF8010030
+:1048A0008DF802502088ADF80400E07D8DF80600F8
+:1048B00068460DF027FA04F0D3FC0028E0D1A07878
+:1048C000032805D05FF00400FEF7B0FB00207CBD9C
+:1048D000E07800F03CFB0520F6E71CB510B143F290
+:1048E00004001CBD664CA078042803D0052801D024
+:1048F00008201CBD00208DF8000001218DF801105A
+:104900008DF8020068460DF0FDF904F0A9FC0028BE
+:10491000EFD1A078052805D05FF00200FEF786FBF6
+:1049200000201CBDE07800F01FFB0320F6E72DE916
+:10493000FC4180460E4603250846FCF7D7FC0028BC
+:1049400066D14046FEF77FFD040004D0207822287F
+:1049500004D2082059E543F2020056E5A07F00F09A
+:1049600003073EB1012F0CD000203146FEF727FC93
+:104970000500EFD1012F06D0022F1AD0FFDF284605
+:1049800043E50120F1E7A07D3146022801D011B1B5
+:1049900007E0112039E56846FCF758FE0028D9D118
+:1049A0006946404606F045FE0500E8D10120A075A5
+:1049B000E5E7A07D032804D1314890F83000C00716
+:1049C00001D02EB30EE026B1A07F40071ED40021F7
+:1049D00000E00121404606F04CFE0500CFD1A07555
+:1049E000002ECCD03146404600F0EDFA05461128A5
+:1049F000C5D1A07F4107C2D4316844F80E1F716849
+:104A0000616040F0040020740025B8E71125B6E786
+:104A10001020FAE470B50C460546FEF714FD0100BF
+:104A200005D022462846BDE87040FEF70FBD43F290
+:104A3000020070BD10B5012807D1114B9B78012BE6
+:104A400000D011B143F2040010BD0CF046FABDE8ED
+:104A5000104004F005BC012300F090BA00231A4670
+:104A6000194600F08BBA70B506460C460846FCF7AE
+:104A7000F0FB18B92068FCF712FC18B1102070BDCB
+:104A8000F4010020F84D2A7E112A04D0132A00D305
+:104A90003EB10820F3E721463046FEF77FFE60B1C5
+:104AA000EDE70920132A0DD0142A0BD0A188FF2985
+:104AB000E5D31520FEF7D2FA0020D4E90012C5E9AB
+:104AC0000712DCE7A1881F29D9D31320F2E71CB510
+:104AD000E548007E132801D208201CBD00208DF877
+:104AE000000068460CF090FC04F0BAFB0028F4D1FA
+:104AF0001120FEF7B3FA00201CBD2DE9F04FDFF8BE
+:104B000068A3814691B09AF818009B4615460C465A
+:104B1000132803D3FFF7DBFF00281FD12046FCF743
+:104B200098FBE8BB2846FCF794FBC8BB20784FF005
+:104B30000107C0074FF0000102D08DF83A7001E084
+:104B40008DF83A1020788846C0F3C1008DF8000037
+:104B500060788DF80910C10803D0072011B0BDE8B6
+:104B6000F08FB0B3C10701D08DF80970810705D56A
+:104B70009DF8091041F002018DF80910400705D594
+:104B80009DF8090040F004008DF809009DF8090027
+:104B9000810703D540F001008DF80900002000E0F6
+:104BA00015E06E4606EB400162884A81401CA288EF
+:104BB000C0B20A820328F5D32078C0F3C1000128CF
+:104BC00025D0032823D04846FCF743FB28B110200A
+:104BD000C4E7FFE78DF80970D8E799F800004008AE
+:104BE00008D0012809D0022807D0032805D043F2B5
+:104BF0000220B3E78DF8028001E08DF8027048468C
+:104C000050F8011FCDF803108088ADF80700FEF7BB
+:104C1000B2FB8DF801000021424606EB41002B88D3
+:104C2000C3826B888383AB884384EB880385491CEC
+:104C3000C285C9B282860329EFD3E088ADF83C0073
+:104C400068460CF0B9FC002887D19AF81800554640
+:104C5000112801D0082081E706200EF02FF938B185
+:104C60002078C0F3C100012804D0032802D006E058
+:104C7000122073E795F8240000283FF46EAFFEF78A
+:104C800003FA022801D2132068E7584600F04FF9D2
+:104C900000289DD185F819B068460CF0D3FD04F0CA
+:104CA000DFFA040094D1687E00F051F91220FEF77B
+:104CB000D5F9204652E770B56B4D287E122801D0F9
+:104CC0000820DCE60CF0C1FD04F0CAFA040005D1AE
+:104CD000687E00F049F91120FEF7C0F92046CEE6C3
+:104CE00070B5064615460C460846FCF7D8FA18B9C2
+:104CF0002846FCF7D4FA08B11020C0E62A4621461F
+:104D000030460DF0A1F804F0ABFA0028F5D1217877
+:104D10007F29F2D10520B2E67CB505460C4608464F
+:104D2000FCF797FA08B110207CBD2846FEF78BFBF4
+:104D300020B10078222804D208207CBD43F2020072
+:104D40007CBD494890F83000400701D511207CBD5A
+:104D50002078C00802D16078C00801D007207CBD4F
+:104D6000ADF8005020788DF8020060788DF80300CF
+:104D70000220ADF8040068460BF0A1FE04F070FAC2
+:104D80007CBD70B586B014460D460646FEF75BFB4B
+:104D900028B10078222805D2082006B06FE643F239
+:104DA0000200FAE72846FCF7A1FA20B944B12046F0
+:104DB000FCF793FA08B11020EFE700202060A080F4
+:104DC000294890F83000800701D51120E5E703A9B4
+:104DD00030460BF0C4FE10B104F042FADDE7ADF846
+:104DE0000060BDF81400ADF80200BDF81600ADF883
+:104DF0000400BDF81000BDF81210ADF80600ADF8C3
+:104E000008107DB1298809B1ADF80610698809B18B
+:104E1000ADF80210A98809B1ADF80810E98809B108
+:104E2000ADF80410DCB1BDF80610814201D9081AB2
+:104E30002080BDF80210BDF81400814201D9081A83
+:104E40006080BDF80800BDF80410BDF816200144CC
+:104E5000BDF812001044814201D9081AA0806846AA
+:104E60000BF03BFFB8E70000F40100201CB57449CB
+:104E70000968CDE9001068460CF0A0FB04F0F0F9D9
+:104E80001CBD1CB500200090019068460CF096FBFC
+:104E900004F0E6F91CBD70B505460C460846FCF763
+:104EA000FEF908B11020EAE5214628460CF078F911
+:104EB000BDE8704004F0D4B93EB505460C4608463E
+:104EC000FCF7EDF908B110203EBD002000900190E4
+:104ED0000290ADF800502089ADF8080020788DF8D8
+:104EE0000200606801902089ADF808006089ADF883
+:104EF0000A0068460CF066F904F0B2F93EBD0EB542
+:104F0000ADF800000020019068460CF05BF904F059
+:104F1000A7F90EBD10800888508048889080C88806
+:104F200010818888D080002050819081704710B512
+:104F3000044604F001F930B1407830B1204604F065
+:104F400014FC002010BD052010BD122010BD10B5AE
+:104F500004F0F2F8040000D1FFDF607800B9FFDF51
+:104F60006078401E607010BD10B504F0E5F80400D4
+:104F700000D1FFDF6078401C607010BD1CB5ADF83B
+:104F800000008DF802308DF803108DF8042068467B
+:104F90000CF01DFF04F064F91CBD0CB529A2D2E988
+:104FA0000012CDE900120079694601EB501000783B
+:104FB0000CBD0278520804D0012A02D043F202202C
+:104FC0007047FEF7AFB91FB56A46FFF7A3FF684603
+:104FD0000CF06EFC04F044F904B010BD70B50C0088
+:104FE00006460DD0FEF72FFA050000D1FFDFA680A0
+:104FF00028892081288960816889A081A889E08129
+:105000003DE510B500231A4603E0845C2343521C9F
+:10501000D2B28A42F9D30BB1002010BD012010BDDD
+:1050200000B540B1012805D0022803D0032804D0E0
+:10503000FFDF002000BDFF2000BD042000BD0000F8
+:1050400024620200070605040302010010B50446AD
+:10505000FCF7FFF808B1102010BD2078C0F3021053
+:10506000042807D86078072804D3A178102901D82C
+:10507000814201D2072010BDE078410706D4217992
+:105080004A0703D4000701D4080701D5062010BD44
+:10509000002010BD10B513785C08837F64F3C7133C
+:1050A000837713789C08C37F64F30003C377107879
+:1050B000C309487863F34100487013781C090B78E2
+:1050C00064F347130B701378DB0863F30000487038
+:1050D0005078487110BD10B5C4780B7864F30003A4
+:1050E0000B70C478640864F341030B70C478A4089F
+:1050F00064F382030B70C478E40864F3C3030B7099
+:105100000379117863F30001117003795B0863F38D
+:105110004101117003799B0863F3820111700079DA
+:10512000C00860F3C301117010BD70B514460D4680
+:10513000064604F073FA80B10178182221F00F01BD
+:10514000891C21F0F001A03100F8081B214609F06C
+:105150006CF9BDE8704004F064BA29463046BDE8F9
+:1051600070401322FEF772B92DE9F047064608A8F1
+:10517000904690E8300489461F46142200212846B4
+:1051800009F07DF90021CAF80010B8F1000F03D032
+:10519000B9F1000F03D114E03878C00711D02068AE
+:1051A000FCF77DF8C0BBB8F1000F07D120681230C2
+:1051B00028602068143068602068A8602168CAF8F8
+:1051C00000103878800724D56068FCF786F818BB93
+:1051D000B9F1000F21D0FFF7CFF80168C6F86811C8
+:1051E0008188A6F86C11807986F86E0101F015FDB2
+:1051F000F94FEF60626862B196F8680106F26911D2
+:1052000040081032FEF7EFF810223946606809F0C6
+:105210000CF90020BDE8F08706E0606820B1E86086
+:105220006068C6F86401F4E71020F3E730B505467E
+:1052300008780C4620F00F00401C20F0F0011031DF
+:1052400021700020607095F8230030B104280FD041
+:10525000052811D0062814D0FFDF20780121B1EBFA
+:10526000101F04D295F8200000F01F00607030BDC0
+:1052700021F0F000203002E021F0F000303020700A
+:10528000EBE721F0F0004030F9E7F0B591B00227EC
+:1052900015460C4606463A46ADF80870092103ABA0
+:1052A00005F04BF80490002810D004208DF804007D
+:1052B0008DF80170E034099605948DF818500AA90C
+:1052C00068460FF046FB00B1FFDF012011B0F0BDD2
+:1052D00010B588B00C460A99ADF80000CBB118683B
+:1052E000CDF80200D3F80400CDF80600ADF80A208E
+:1052F000102203A809F099F868460CF049FB03F066
+:10530000AFFF002803D1A17F41F01001A17708B0C1
+:1053100010BD0020CDF80200E6E72DE9F84F064663
+:10532000808A0D4680B28246FEF78DF804463078BA
+:10533000DFF8A48200274FF00209A8F120080F2807
+:1053400070D2DFE800F06FF23708387D8CC8F1F0DA
+:10535000EFF35FF3F300A07F00F00300022809D011
+:105360005FF0000080F0010150460DF0F7FD0500F0
+:1053700003D101E00120F5E7FFDF98F85C10C907D1
+:1053800002D0D8F860000BE0032105F11D0011F0F8
+:10539000FCF8D5F81D009149B0FBF1F201FB1200B9
+:1053A000C5F81D0070686867B068A8672078252870
+:1053B00000D0FFDFCAE0A07F00F00300022809D080
+:1053C0005FF0000080F0010150460DF0C7FD0600BF
+:1053D00003D101E00120F5E7FFDF3078810702D536
+:1053E0002178252904D040F001003070BDE8F88F05
+:1053F00085F80090307F287106F11D002D36C5E933
+:105400000206F3E7A07F00F00300022808D0002086
+:1054100080F0010150460DF0A1FD040004D102E02E
+:105420000120F5E7A7E1FFDF2078C10604D50720BA
+:1054300028703D346C60D9E740F008002070D5E753
+:10544000E07F000700D5FFDF307CB28800F0010369
+:1054500001B05046BDE8F04F092106F04CB804B940
+:10546000FFDF716821B1102204F1240008F0DDFF94
+:1054700028212046FDF74EFEA07F00F00300022801
+:105480000ED104F12400002300901A462146504614
+:10549000FFF71EFF112807D029212046FDF73AFE0D
+:1054A000307A84F82000A1E7A07F000700D5FFDF55
+:1054B00014F81E0F40F008002070E782A761E76132
+:1054C000C109607861F34100014660F382016170B7
+:1054D000307AE0708AE7A07F00F00300022809D04C
+:1054E0005FF0000080F0010150460DF037FD040030
+:1054F00003D101E00120F5E7FFDF022104F185007F
+:1055000011F043F80420287004F5B4706860B4F812
+:1055100085002882304810387C346C61C5E90280EF
+:1055200064E703E024E15BE02DE015E0A07F00F0FC
+:105530000300022807D0002080F0010150460DF042
+:105540000DFD18B901E00120F6E7FFDF32462146E4
+:105550005046BDE8F84FE8E504B9FFDF2078212880
+:10556000A1D93079012803D1E07F40F00800E0772D
+:10557000324621465046FFF7D8FD2046BDE8F84F99
+:105580002321FDF7C7BD3279AA8005F1080309215F
+:10559000504604F0D2FEE86010B10520287025E7DF
+:1055A000A07F00F00300022808D0002080F0010155
+:1055B00050460DF0D3FC040003D101E00120F5E7D3
+:1055C000FFDF04F1620102231022081F0DF04DFBE2
+:1055D00007703179417009E75402002040420F0002
+:1055E000A07F00F00300022808D0002080F0010115
+:1055F00050460DF0B3FC050003D101E00120F5E7B2
+:10560000FFDF95F8840000F0030001287AD1A07F25
+:1056100000F00307E07F10F0010602D0022F04D152
+:1056200033E095F8A000C0072BD0D5F8601121B366
+:1056300095F88320087C62F387000874A17FCA096B
+:10564000D5F8601162F341000874D5F8601166F373
+:1056500000000874AEB1D5F86001102204F12401F5
+:10566000883508F0E2FE287E40F001002876287890
+:1056700020F0010005F8880900E016B1022F04D0DF
+:105680002DE095F88800C00727D0D5F85C1121B32C
+:1056900095F88320087C62F387000874A17FCA090B
+:1056A000D5F85C1162F341000874D5F85C1166F31B
+:1056B000000008748EB1D5F85C01102204F12401B9
+:1056C000883508F0B2FE287840F0010005F8180B84
+:1056D000287820F0010005F8A009022F44D000200E
+:1056E00000EB400005EBC00090F88800800709D56A
+:1056F00095F87C00D5F86421400805F17D01103251
+:10570000FDF771FE8DF8009095F884006A4600F070
+:1057100003008DF8010095F888108DF8021095F8B7
+:10572000A0008DF803002146504601F05FFA207872
+:10573000252805D0212807D0FFDF2078222803D98B
+:1057400022212046FDF7E6FCA07F00F0030002289E
+:105750000CD0002080F0010150460DF011FC002813
+:105760003FF44FAEFFDF41E60120B9E70120F1E74A
+:10577000706847703AE6FFDF38E670B5FE4C0025EA
+:1057800084F85C5025660FF0B0F804F11001204653
+:1057900003F000FF84F8305070BD70B50D46FDF782
+:1057A00052FE040000D1FFDF4FF4B87200212846FA
+:1057B00008F065FE04F124002861A07F00F00300DA
+:1057C000022809D05FF0010105F1E0000FF08EF82A
+:1057D000002800D0FFDF70BD0221F5E70A46014630
+:1057E00002F1E0000FF0A3B870B50546406886B03E
+:1057F00001780A2906D00D2933D00E292FD0FFDFDA
+:1058000006B070BD86883046FDF71DFE040000D14D
+:10581000FFDF20782128F3D028281BD168680221D7
+:105820000E3001F0D8F9A8B168680821801D01F098
+:10583000D2F978B104F1240130460CF065FA03F096
+:105840000FFD00B1FFDF06B02046BDE87040292102
+:10585000FDF760BC06B0BDE8704003F0E2BE012178
+:1058600001726868C6883046FDF7EDFD040000D17E
+:10587000FFDFA07F00F00301022902D120F0100019
+:10588000A077207821280AD06868017A09B10079C8
+:1058900080B1A07F00F00300022862D0FFDFA07F6C
+:1058A00000F003000228ABD1FEF71FF80028A7D0B4
+:1058B000FFDFA5E703F0B5FEA17F08062BD5E07F4B
+:1058C000C00705D094F8200000F01F00102820D059
+:1058D0005FF0050084F82300207829281DD02428B3
+:1058E000DDD13146042011F037F922212046FDF7A1
+:1058F00011FCA07F00F00300022830D05FF0000010
+:1059000080F0010130460DF03BFB0028C7D0FFDFDF
+:10591000C5E70620DEE70420DCE701F003000228EB
+:1059200008D0002080F0010130460DF017FB050083
+:1059300003D101E00120F5E7FFDF25212046FDF737
+:10594000E9FB03208DF80000694605F1E0000EF048
+:10595000E5FF0228A3D00028A1D0FFDF9FE70120A8
+:10596000CEE703F05EFE9AE72DE9F04387B0994653
+:10597000164688460746FDF766FD04004BD02078A2
+:10598000222848D3232846D0E07F000743D4A07FB5
+:1059900000F00300022809D05FF0000080F0010150
+:1059A00038460DF0DBFA050002D00CE00120F5E7E7
+:1059B000A07F00F00300022805D001210022384614
+:1059C0000DF0C3FA05466946284601F036F90098FD
+:1059D00000B9FFDF45B10098E03505612078222845
+:1059E00006D0242804D007E000990020086103E0D5
+:1059F00025212046FDF78EFB00980121417047626A
+:105A0000868001A9C0E902890EF0A3FF022802D016
+:105A1000002800D0FFDF07B0BDE8F08370B586B086
+:105A20000546FDF710FD017822291ED9807F00F080
+:105A30000300022808D0002080F0010128460DF064
+:105A40008DFA04002FD101E00120F5E7FFDF2AE005
+:105A5000B4F85E0004F1620630440178427829B15E
+:105A600021462846FFF711FCB0B9C9E6ADF804207D
+:105A70000921284602AB04F060FC03900028F4D012
+:105A800005208DF80000694604F1E0000EF046FFA5
+:105A9000022801D000B1FFDF02231022314604F1B9
+:105AA0005E000DF018F9B4F860000028D0D1A7E628
+:105AB00010B586B00446FDF7C6FC017822291BD933
+:105AC000807F00F00300022808D0002080F0010150
+:105AD00020460DF043FA040003D101E00120F5E770
+:105AE000FFDF06208DF80000694604F1E0000EF0AB
+:105AF00015FF002800D0FFDF06B010BD2DE9F05FD4
+:105B000005460C4600270078904601093E4604F100
+:105B1000080BBA4602297DD0072902D00A2909D1EB
+:105B200046E0686801780A2905D00D2930D00E2991
+:105B30002ED0FFDFBBE114271C26002C6BD0808801
+:105B4000A080FDF780FC5FEA000900D1FFDF99F833
+:105B500017005A46400809F11801FDF744FC68682F
+:105B6000C0892082696851F8060FC4F8120048689D
+:105B7000C4F81600A07E01E03402002020F00600E8
+:105B800040F00100A07699F81E0040F020014DE0A1
+:105B90001A270A26002CD1D0C088A080FDF753FC1C
+:105BA000050000D1FFDF59462846FFF73FFB7EE1A5
+:105BB0000CB1A88BA080287A0B287DD006DC0128A8
+:105BC0007BD0022808D0032804D135E00D2875D0F9
+:105BD0000E2874D0FFDF6AE11E270926002CADD005
+:105BE000A088FDF730FC5FEA000900D1FFDF287BC9
+:105BF00000F003000128207A1BD020F00100207261
+:105C0000297B890861F341002072297BC90861F36F
+:105C1000820001E041E1F2E02072297B090961F391
+:105C2000C300207299F81E0040F0400189F81E1050
+:105C30003DE140F00100E2E713270D26002CAAD039
+:105C4000A088FDF700FC8146807F00F00300022859
+:105C500008D0002080F00101A0880DF07FF9050038
+:105C600003D101E00120F5E7FFDF99F81E0000F005
+:105C70000302022A50D0686F817801F003010129E4
+:105C8000217A4BD021F00101217283789B0863F3C4
+:105C9000410121728378DB0863F3820121728378EA
+:105CA0001B0963F3C3012172037863F306112172A8
+:105CB000437863F3C71103E061E0A9E090E0A1E05D
+:105CC000217284F809A0C178A172022A29D0027930
+:105CD000E17A62F30001E1720279520862F3410154
+:105CE000E1720279920862F38201E1720279D208CC
+:105CF00062F3C301E1724279217B62F300012173F7
+:105D00004279520862F3410121734279920862F3A9
+:105D100082012173407928E0A86FADE741F00101CD
+:105D2000B2E74279E17A62F30001E1724279520806
+:105D300062F34101E1724279920862F38201E172F9
+:105D40004279D20862F3C301E1720279217B62F3E6
+:105D5000000121730279520862F341012173027933
+:105D6000920862F3820121730079C00860F3C301D5
+:105D7000217399F80000232831D9262140E0182703
+:105D80001026E4B3A088FDF75EFB8346807F00F019
+:105D90000300022809D0002080F00101A0880DF046
+:105DA000DDF85FEA000903D101E00120F4E7FFDF3D
+:105DB000E868A06099F8000040F0040189F800103C
+:105DC00099F80100800708D5012020739BF8000096
+:105DD00023286CD92721584651E084F80CA066E0AE
+:105DE00015270F265CB1A088FDF72DFB8146062202
+:105DF0005946E86808F0AFFB0120A073A0E041E03D
+:105E000048463CE016270926E4B3287B20724EE082
+:105E1000287B19270E26ACB3C4F808A0A4F80CA060
+:105E2000012807D0022805D0032805D0042803D074
+:105E3000FFDF0DE0207207E0697B042801F00F010D
+:105E400041F0800121721ED0607A20F00300607260
+:105E5000A088FDF7F8FA05460078212827D02328E6
+:105E600000D0FFDFA87F00F00300022813D000203D
+:105E700080F00101A0880DF083F822212846FDF76B
+:105E800049F914E004E0607A20F00300401CDEE7EA
+:105E9000A8F8006010E00120EAE70CB16888A08053
+:105EA000287A68B301280AD002284FD0FFDFA8F86B
+:105EB00000600CB1278066800020BDE8F09F1527A8
+:105EC0000F26002CE4D0A088FDF7BDFA807F00F0FB
+:105ED0000300022808D0002080F00101A0880DF006
+:105EE0003DF8050003D101E00120F5E7FFDFD5F81B
+:105EF0001D000622594608F02EFB84F80EA0D6E7B6
+:105F000017270926002CC3D0A088FDF79CFA8146EC
+:105F1000807F00F00300022808D0002080F00101FB
+:105F2000A0880DF01BF8050003D101E00120F5E782
+:105F3000FFDF6878800701D5022000E00120207291
+:105F400099F800002328B2D9272159E719270E26EE
+:105F5000002C9DD0A088FDF776FA5FEA000900D1F9
+:105F6000FFDFC4F808A0A4F80CA084F808A0A07A69
+:105F700040F00300A07299F81E10C90961F3820075
+:105F8000A07299F81F2099F81E1012EAD11F05D0AF
+:105F900099F8201001F01F0110292BD020F00800E3
+:105FA000A07299F81F10607A61F3C3006072697A79
+:105FB00001F003010129A2D140F00400607299F8B8
+:105FC0001E0000F003000228E87A16D0217B60F35F
+:105FD00000012173AA7A607B62F300006073EA7AA1
+:105FE000520862F341012173A97A490861F3410023
+:105FF00060735CE740F00800D2E7617B60F300016A
+:106000006173AA7A207B62F300002073EA7A520857
+:1060100062F341016173A97A490861F34100207379
+:1060200045E710B5F74C30B10146102204F12000CD
+:1060300008F0FBF9012084F8300010BD10B50446CB
+:1060400000F0EBFDEF4920461022BDE81040203162
+:1060500008F0EBB970B5EB4D06004FF0000413D01B
+:10606000FBF7F7F808B110240CE00621304608F0E1
+:1060700059FA411C05D028665FF0010085F85C00E4
+:1060800000E00724204670BD0020F7E7007810F0FC
+:106090000F0204D0012A05D0022A0CD110E0000919
+:1060A00009D10AE00009012807D0022805D00328F9
+:1060B00003D0042801D007207047087000207047E3
+:1060C0000620704705282AD2DFE800F003070F17E3
+:1060D0001F00087820F0FF001EE0087820F00F0075
+:1060E000401C20F0F000103016E0087820F00F007F
+:1060F000401C20F0F00020300EE0087820F00F0067
+:10610000401C20F0F000303006E0087820F00F004E
+:10611000401C20F0F000403008700020704707203D
+:1061200070472DE9F041804688B00D4600270846AB
+:10613000FBF7DCF8A8B94046FDF785F9040003D069
+:106140002078222815D104E043F2020008B0BDE80F
+:10615000F08145B9A07F410603D500F00300022875
+:1061600001D01020F2E7A07FC10601D4010702D5BB
+:106170000DB10820EAE7E17F090701D50D20E5E729
+:1061800000F0030002280DD165B12846FEF75EFF3E
+:106190000700DBD1FBF726FB20B9E878800701D5A3
+:1061A0000620D3E7A07F00F00300022808D00020DB
+:1061B00080F0010140460CF0D1FE060002D00FE055
+:1061C0000120F5E7A07F00F0030002280ED0002098
+:1061D00080F00101002240460CF0B7FE060007D017
+:1061E000A07F00F00300022804D009E00120EFE7BF
+:1061F0000420ABE725B12A4631462046FEF74AFF88
+:106200006946304600F019FD009800B9FFDF00999B
+:10621000022006F1E0024870C1F824804A610022A1
+:106220000A81A27F02F00302022A1CD00120087119
+:10623000287800F00102087E62F3010008762A78CF
+:10624000520862F3820008762A78920862F3C3004B
+:1062500008762A78D20862F30410087624212046B2
+:10626000FCF758FF33E035B30871301D8861307892
+:10627000400908777078C0F340004877287800F02C
+:106280000102887F62F301008877A27FD20962F35E
+:1062900082008877E27F62F3C3008877727862F3C6
+:1062A00004108877A878C87701F1210228462031A8
+:1062B000FEF711FF03E00320087105200876252171
+:1062C0002046FCF727FFA07F20F04000A07701A91F
+:1062D00000980EF03EFB022801D000B1FFDF3846E7
+:1062E00034E72DE9FF4F9346474A0D4699B09A4649
+:1062F00007CA0AAB002783E807001998FDF7A3F83F
+:10630000060006D03078262806D008201DB0BDE84B
+:10631000F08F43F20200F9E7B07F00F00309B9F112
+:10632000020F11D04DB95846FEF790FE0028EDD16E
+:10633000B07F00F00300022806D0BBF1000F11D09F
+:10634000FBF750FA20B10DE0BBF1000F4FD109E08F
+:1063500006200CF0ABFD28B19BF80300800701D5A7
+:106360000620D3E7B07F00F00300022808D0002009
+:1063700080F0010119980CF0F1FD040003D101E057
+:106380000120F5E7FFDF852D27D007DCEDB1812D5A
+:106390001DD0822D1DD0832D08D11CE0862D1ED04E
+:1063A000882D1ED0892D1ED08A2D1ED00F20207141
+:1063B0000F281CD003F032F9D8B101208DF83C0031
+:1063C000201D10902079B0B156E10020EFE70120A8
+:1063D000EDE70220EBE70320E9E70520E7E70620E9
+:1063E000E5E70820E3E70920E1E70A20DFE70720E7
+:1063F0008CE711208AE7B9F1020F07D0A56F07D10A
+:10640000A06F06E0340200202C620200656FF6E700
+:10641000606F80462DD04FF0010001904FF00200D8
+:1064200000905A4621463046FEF734FE9BF80000A5
+:1064300000F00101A87861F30100A870B17FC909DB
+:1064400061F38200A870F17F61F3C300A8706178E6
+:1064500061F30410A8702078400928706078C0F3B8
+:10646000400068709BF80200E87000206871287195
+:1064700003E00220019001200090A87898F8021013
+:10648000C0F3C000C1F3C001084003902CD05046B7
+:10649000FAF7DFFEC0BBDAF80C00FAF7DAFE98BBB9
+:1064A000DAF81C00FAF7D5FE70BBDAF80C00A06031
+:1064B000DAF81C00E060607898F8012042EA5001A8
+:1064C00061F34100607098F80210C0B200EA111147
+:1064D00061F30000607000202077009906F117003A
+:1064E000022907D0012106E0607898F8012002EA2D
+:1064F0005001E5E7002104EB810148610199701C1E
+:10650000022902D0012101E028E0002104EB8101F1
+:106510004861A87800F00300012857D198F80200DC
+:1065200000F00300012851D1B9F1020F04D02A1D57
+:10653000691D5846FEF7CFFD287998F804100840E9
+:106540008DF83400697998F8052011408DF83810DD
+:1065500008433BD05046FAF77CFE08B11020D5E640
+:106560000AF110018B46B9F1020F17D0084600213D
+:1065700004F18C03CDE9000304F5AE7202920DAB79
+:106580002046039AFEF7F0FD0028E8D1B9F1020F8A
+:1065900008D0504608D14FF0010107E050464FF0B7
+:1065A0000101E5E75846F5E74FF0000104F1A403C7
+:1065B000CDE9000304F5B072029281F001010EAB47
+:1065C0002046039AFEF7D0FD0028C8D160788007E6
+:1065D00033D4A87898F80210C0F38000C1F380018A
+:1065E00008432AD0297898F800000AAAB9F1020FC6
+:1065F00006D032F811204300DA4002F003070AE027
+:1066000032F810204B00DA4012F0030705D0012FBA
+:106610000AD0022F0AD0032F06D0039A6AB10129AB
+:1066200006D0042904D008E00227F6E70127F4E7A2
+:10663000012801D0042800D10427B07F40F0800059
+:10664000B077F17F039860F30001F17760788007FD
+:1066500005D50320A071039870B9002029E002201D
+:10666000022F18D0012F18D0042F2AD00020A0719B
+:10667000B07F20F08000B07725213046FCF74AFD3E
+:106680000FA904F1E0000EF049F910B1022800D082
+:10669000FFDF00203AE6A071DFE7A0710D220021A4
+:1066A00004F1200007F0EBFE207840F0020020709B
+:1066B00001208DF85C0017AA3146199800F096FA6F
+:1066C000DAE70120A071D7E72DE9F04387B09046C3
+:1066D000894604460025FCF7B6FE060006D0307851
+:1066E000272806D0082007B0BDE8F08343F2020057
+:1066F000F9E7B07F00F00300022809D05FF0000046
+:1067000080F0010120460CF029FC040003D101E0D7
+:106710000120F5E7FFDFA7795FEA090005D001282E
+:1067200021D0B9F1020F26D110E0B8F1000F22D12B
+:10673000012F05D0022F05D0032F05D0FFDF2EE05B
+:106740000C252CE001252AE0022528E04046FAF736
+:1067500080FDB0B9032F0ED11022414604F11D0077
+:1067600007F063FE1BE0012F02D0022F03D104E0EB
+:10677000B8F1000F13D00720B5E74046FAF769FDDE
+:1067800008B11020AFE71022002104F11D0007F02E
+:1067900076FE0621404607F0C5FEC4F81D002078AD
+:1067A000252140F0020020703046FCF7B3FC207831
+:1067B000C10713D020F00100207002208DF80000E6
+:1067C00004F11D0002908DF804506946C3300EF0AC
+:1067D000A5F8022803D010B1FFDF00E025770020E4
+:1067E00081E730B587B00D460446FCF72CFE98B122
+:1067F000807F00F00300022811D0002080F001010A
+:1068000020460CF0ABFB04000ED02846FAF721FD21
+:1068100038B1102007B030BD43F20200FAE7012082
+:10682000ECE72078400701D40820F3E7294604F17B
+:106830003D002022054607F0F8FD207840F01000CA
+:10684000207001070FD520F00800207007208DF878
+:106850000000694604F1E00001950EF05FF802289F
+:1068600001D000B1FFDF0020D4E770B50D46064629
+:10687000FCF7E9FD18B10178272921D102E043F2A4
+:10688000020070BD807F00F00300022808D00020C5
+:1068900080F0010130460CF061FB040003D101E0FF
+:1068A0000120F5E7FFDFA079022809D16078C00751
+:1068B00006D02A4621463046FEF7E7FC10B10FE02D
+:1068C000082070BDB4F860000E280BD204F16201FC
+:1068D00002231022081F0CF0C8F901210170457035
+:1068E000002070BD112070BD70B5064614460D46DF
+:1068F0000846FAF7AEFC18B92046FAF7D0FC08B102
+:10690000102070BDA6F57F40FF380ED03046FCF752
+:106910009AFD38B1417822464B08811C1846FCF795
+:1069200062FD07E043F2020070BD2046FDF78CFDDA
+:106930000028F9D11021E01D0FF027FEE21D2946A5
+:1069400004F1170000F089F9002070BD2DE9F04135
+:1069500004468AB01546884600270846FAF7C6FC62
+:1069600018B92846FAF7C2FC18B110200AB0BDE8E1
+:10697000F0812046FCF767FD060003D03078272819
+:106980001BD102E043F20200F0E7B07F00F0030009
+:10699000022809D05FF0000080F0010120460CF0D1
+:1069A000DDFA040003D101E00120F5E7FFDF2078E4
+:1069B000400702D56078800701D40820D6E7B07F71
+:1069C00000F00300022803D0A06F03D1A16F02E002
+:1069D000606FFAE7616F407800B19DB1487810B1FF
+:1069E000B8F1000F0ED0ADB1EA1D06A8E16800F0C5
+:1069F00034F9102206A905F1170007F0E9FC18B1D7
+:106A0000042707E00720B1E71022E91D04F12D005B
+:106A100007F00BFDB8F1000F06D0102208F10701B6
+:106A200004F11D0007F001FD2078252140F002004F
+:106A300020703046FCF76EFB2078C10715D020F09F
+:106A40000100207002208DF8000004F11D0002906A
+:106A5000103003908DF804706946B3300DF05EFF7E
+:106A6000022803D010B1FFDF00E0277700207DE788
+:106A7000F8B515460E460746FCF7E5FC040004D0C1
+:106A80002078222804D00820F8BD43F20200F8BD87
+:106A9000A07F00F00300022802D043F20500F8BDF9
+:106AA0003046FAF7D6FB18B92846FAF7D2FB08B1F8
+:106AB0001020F8BD00953288B31C21463846FEF7F9
+:106AC00007FC112815D00028F3D1297C4A08A17FA2
+:106AD00062F3C711A177297CE27F61F30002E277BC
+:106AE000297C890884F82010A17F21F04001A1773A
+:106AF000F8BDA17F0907FBD4D6F80200C4F8360020
+:106B0000D6F80600C4F83A003088A086102229463C
+:106B100004F1240007F089FC287C4108E07F61F340
+:106B20004100E077297C61F38200E077287C8008CF
+:106B300084F82100A07F40F00800A0770020D3E770
+:106B400070B50D4606460BB1072070BDFCF77BFC07
+:106B5000040007D02078222802D3A07F800604D426
+:106B6000082070BD43F2020070BDADB12946304629
+:106B70000BF0CAF802F074FB297C4A08A17F62F38B
+:106B8000C711A177297CE27F61F30002E277297CBB
+:106B9000890884F8201004E030460BF0D8F802F0A1
+:106BA0005FFBA17F21F02001A17770BD70B50D467C
+:106BB000FCF749FC040005D02846FAF770FB20B129
+:106BC000102070BD43F2020070BD29462046FEF73A
+:106BD0002DFB002070BD04E010F8012B0AB100204D
+:106BE0007047491E89B2F7D20120704770B515462B
+:106BF000064602F013FD040000D1FFDF207820F0EC
+:106C00000F00801C20F0F000203020706680286883
+:106C1000A060BDE8704002F004BD10B5134C94F8BC
+:106C20003000002808D104F12001A1F110000DF07E
+:106C3000B7FE012084F8300010BD10B190F8B920E3
+:106C40002AB10A4890F8350018B1002003E0B830A6
+:106C500001E0064834300860704708B5002300930F
+:106C600013460A460CF079FB08BD000034020020F0
+:106C700018B18178012938D101E0102070470188CE
+:106C800042F60112881A914231D018DC42F6010214
+:106C9000A1EB020091422AD00CDC41B3B1F5C05FF8
+:106CA00025D06FF4C050081821D0A0F57060FF38CF
+:106CB0001BD11CE001281AD002280AD117E0B0F538
+:106CC000807F14D008DC012811D002280FD00328BF
+:106CD0000DD0FF2809D10AE0B0F5817F07D0A0F5DB
+:106CE0008070033803D0012801D0002070470F20A6
+:106CF00070470A281FD008DC0A2818D2DFE800F005
+:106D0000191B1F1F171F231D1F21102815D008DC5A
+:106D10000B2812D00C2810D00D2816D00F2806D121
+:106D20000DE011280BD084280BD087280FD003202A
+:106D300070470020704705207047072070470F20DC
+:106D4000704704207047062070470C20704743F2BC
+:106D50000200704738B50C46050041D06946FFF780
+:106D600095F9002819D19DF80010607861F30200B0
+:106D700060706946681CFFF789F900280DD19DF8FD
+:106D80000010607861F3C5006070A978C1F341011B
+:106D9000012903D0022905D0072038BD217821F030
+:106DA000200102E0217841F020012170410704D048
+:106DB000A978C90861F386106070607810F0380F08
+:106DC00007D0A978090961F3C710607010F0380F77
+:106DD00002D16078400603D5207840F04000207052
+:106DE000002038BD70B50446002008801546606854
+:106DF000FFF7B0FF002816D12089A189884211D859
+:106E000060688078C0070AD0B1F5007F0AD840F2E8
+:106E10000120B1FBF0F200FB1210288007E0B1F571
+:106E2000FF7F01D90C2070BD01F2012129800020D3
+:106E300070BD10B50478137864F300031370047800
+:106E4000640864F3410313700478A40864F38203B4
+:106E500013700478E40864F3C303137004782409FE
+:106E600064F3041313700478640964F34513137016
+:106E70000078800960F38613137031B10878C10778
+:106E800001D1800701D5012000E0002060F3C71385
+:106E9000137010BD4278530702D002F0070306E0DA
+:106EA00012F0380F02D0C2F3C20300E001234A7887
+:106EB00063F302024A70407810F0380F02D0C0F33A
+:106EC000C20005E0430702D000F0070000E0012007
+:106ED00060F3C5024A7070472DE9F04F95B00D0080
+:106EE000824613D012220021284607F0C8FA4FF636
+:106EF000FF7B05AA0121584607F089F800242646A1
+:106F000037464FF420586FF4205972E0102015B026
+:106F1000BDE8F08F9DF81E0001280AD1BDF81C10B5
+:106F200041450BD011EB09000AD001280CD00228F2
+:106F30000CD0042C0ED0052C0FD10DE0012400E064
+:106F40000224BDF81A6008E0032406E00424BDF81A
+:106F50001A7002E0052400E00624BDF81A1051451D
+:106F600047D12C74BEB34FF0000810AA4FF0070AA7
+:106F7000CDE90282CDE900A80DF13C091023CDF83E
+:106F8000109042463146584607F011F908BBBDF84B
+:106F90003C002A46C0B210A90DF078FDC8B9AE81F8
+:106FA000CFB1CDE900A80DF1080C0AAE40468CE83F
+:106FB0004102132300223946584607F0F8F840B939
+:106FC000BDF83C00F11CC01EC0B22A1D0DF05EFDD4
+:106FD00010B103209BE70AE0BDF82900E881062CE8
+:106FE00005D19DF81E00A872BDF81C002881002064
+:106FF0008DE705A807F017F800288BD0FFF779FE7A
+:1070000085E72DE9F0471C46DDE90978DDF8209099
+:1070100015460E00824600D1FFDF0CB1208818B162
+:10702000D5B11120BDE8F087022D01D0012100E08B
+:10703000002106F1140005F0B3FEA8F80000024696
+:107040003B462946504603F078F9C9F8000008B9D4
+:10705000A41C3C600020E5E71320E3E7F0B41446ED
+:10706000DDE904528DB1002314B1022C09D101E0F5
+:10707000012306E00D7CEE0703D025F00105012376
+:107080000D742146F0BC04F036BA1A80F0BC70478B
+:107090002DE9FE4F91461A881C468A468046FAB171
+:1070A00002AB494603F049F9050019D04046A61C39
+:1070B00027880CF098F83246072629463B4600966A
+:1070C0000BF0A5FC20882346CDE900504A465146E6
+:1070D0004046FFF7C3FF002020800120BDE8FE8F5F
+:1070E0000020FBE72DE9F04786B082460EA89046C7
+:1070F00090E8B000894604AA05A903A88DE8070016
+:107100001E462A4621465046FFF77BFF039901B1F0
+:1071100001213970002818D1FA4904F1140204AB96
+:107120000860039805998DE8070042464946504695
+:1071300006F0E9F9A8B1092811D2DFE800F0050846
+:107140000510100A0C0C0E00002006B06AE7112092
+:10715000FBE70720F9E70820F7E70D20F5E7032014
+:10716000F3E7BDF810100398CDE9000133462A4635
+:1071700021465046FFF772FFE6E72DE9F04389B05C
+:107180001646DDE910870D4681461C461422002173
+:1071900003A807F074F9012002218DF810108DF872
+:1071A0000C008DF81170ADF8146064B1A278D207AC
+:1071B00009D08DF81600E088ADF81A00A088ADF867
+:1071C0001800A068079008A80095CDE90110424674
+:1071D00003A948466B68FFF785FF09B0BDE8F08357
+:1071E000F0B58BB000240646069407940727089450
+:1071F00005A80994019400970294CDE903400D4637
+:1072000010232246304606F0D2FF78B90AA806A914
+:10721000019400970294CDE90310BDF814300022C8
+:107220002946304606F061FD002801D0FFF761FDD8
+:107230000BB0F0BD06F0F2BB2DE9FC410C468046D8
+:10724000002602F0EBF9054620780D287ED2DFE813
+:1072500000F0BC0713B325BD49496383AF959B007C
+:10726000A848006820B1417841F010014170ADE0BC
+:10727000404602F003FAA9E0042140460BF06EFEFE
+:10728000070000D1FFDF07F11401404605F01DFDA6
+:10729000A5BB13214046FDF7BDFB97E00421404606
+:1072A0000BF05CFE070000D1FFDFE088ADF80000C6
+:1072B0000020B8819DF80000010704D5C00602D562
+:1072C000A088B88105E09DF8010040067ED5A08821
+:1072D000F88105B9FFDF22462946404601F0C0FC8F
+:1072E000022673E0E188ADF800109DF80110090650
+:1072F0000FD5072803D006280AD00AE024E004218D
+:1073000040460BF02BFE060000D1FFDFA088F08185
+:107310000226CDB9FFDF17E0042140460BF01EFE28
+:10732000070000D1FFDF07F1140006F0AEFB90F07C
+:10733000010F02D1E079000648D5387C022640F0E2
+:107340000200387405B9FFDF224600E03DE029461F
+:10735000404601F085FC39E0042140460BF0FEFD7B
+:10736000017C002D01F00206C1F340016171017C36
+:1073700021F002010174E7D1FFDFE5E702260121D8
+:10738000404602F0ADF921E0042140460BF0E6FD55
+:107390000546606800902089ADF804000122694626
+:1073A000404602F0BEF9287C20F0020028740DE06F
+:1073B000002DC9D1FFDFC7E7022600214046FBF7B9
+:1073C00081F8002DC0D1FFDFBEE7FFDF3046BDE80A
+:1073D000FC813EB50C0009D001466B4601AA002095
+:1073E00006F06AFF20B1FFF784FC3EBD10203EBDD1
+:1073F00000202080A0709DF8050002A900F0070081
+:10740000FEF760FE50B99DF8080020709DF8050059
+:1074100002A9C0F3C200FEF755FE08B103203EBD2D
+:107420009DF8080060709DF80500C109A07861F31F
+:107430000410A0709DF80510890961F3C300A070C5
+:107440009DF80410890601D5022100E0012161F3B5
+:1074500042009DF8001061F30000A07000203EBDC6
+:1074600070B5144606460D4651EA040005D075B1C4
+:107470000846F9F732FF78B901E0072070BD2946C8
+:10748000304606F080FF10B1BDE8704031E454B1E1
+:107490002046F9F722FF08B1102070BD2146304682
+:1074A000BDE8704095E7002070BD2DE9FC5F0C46FB
+:1074B00090460546002701780822007A3E46B2EB46
+:1074C000111F7DD104F10A0100910A31821E4FF093
+:1074D000020A04F1080B0191092A72D2DFE802F0D6
+:1074E000EDE005F528287BAACE00688804210BF082
+:1074F00035FD060000D1FFDFB08928B152270726ED
+:10750000C3E000009802002051271026002C7DD0F7
+:107510006888A0800120A071A88900220099FFF747
+:107520009FFF002873D1A8892081288AE081D1E0BB
+:10753000B5F81290072824D1E87B000621D5512701
+:1075400009F1140086B2002CE1D0A889002200992C
+:10755000FFF786FF00285AD16888A08084F806A02B
+:10756000A88920810120A073288A2082A4F8129083
+:10757000A88A009068884B46A969019A01F04CFBE3
+:10758000A8E0502709F1120086B2002C3ED0A8894D
+:1075900000225946FFF764FF002838D16888A08090
+:1075A000A889E080287A072813D002202073288A2F
+:1075B000E081E87BC0096073A4F81090A88A01E01C
+:1075C00085E082E0009068884B4604F11202A969C8
+:1075D000D4E70120EAE7B5F81290512709F1140029
+:1075E00086B2002C66D0688804210BF0B7FC834675
+:1075F0006888A080A88900220099FFF731FF002841
+:107600006ED184F806A0A889208101E052E067E0ED
+:107610000420A073288A2082A4F81290A88A0090DF
+:1076200068884B46A969019A01F0F6FAA989ABF876
+:107630000E104FE06888FBF706FF074668880421B4
+:107640000BF08CFC064607B9FFDF06B9FFDF687B4D
+:10765000C00702D05127142601E0502712264CB350
+:107660006888A080502F06D084F806A0287B594651
+:1076700001F0E2FA2EE0287BA11DF9E7FE49A88976
+:107680004989814205D1542706269CB16888A0808B
+:1076900020E053270BE06888A080A889E08019E0EB
+:1076A000688804210BF05AFC00B9FFDF5527082633
+:1076B000002CF0D1A8F8006011E056270726002C16
+:1076C000F8D06888A080002013E0FFDF02E00128E6
+:1076D00008D0FFDFA8F800600CB12780668000208A
+:1076E000BDE8FC9F57270726002CE3D06888A080C0
+:1076F000687AA071EEE7401D20F0030009B1414314
+:10770000091D01EB4000704713B5DB4A00201071E2
+:10771000009848B1002468460BF03DFA002C02D1D5
+:10772000D64A009911601CBD01240020F4E770B511
+:107730000D461446064686B05C220021284606F017
+:107740009EFE04B9FFDFA0786874A27821882846DD
+:1077500001F09DFA0020A881E881228805F114013A
+:10776000304605F096FA6A460121304606F04FFC95
+:107770001AE000BF9DF80300000715D5BDF80610FC
+:107780003046FFF72DFD9DF80300BDF8061040F0D0
+:1077900010008DF80300BDF80300ADF81400FF23BE
+:1077A0003046059A06F0B7FD684606F03CFC002816
+:1077B000E0D006B070BD10B50C4601F1140005F024
+:1077C000A0FA0146627C2046BDE8104001F094BA60
+:1077D00030B50446A84891B04FF6FF75C18905AA97
+:1077E000284606F014FC30E09DF81E00A0422AD086
+:1077F00001282AD1BDF81C00B0F5205F03D042F665
+:107800000101884221D1002002AB0AAA0CA90190F3
+:1078100083E8070007200090BDF81A10102300220B
+:10782000284606F0C4FC38B9BDF828000BAAC0B23F
+:107830000CA90DF02BF910B1032011B030BD9DF84B
+:107840002E00A04201D10020F7E705A806F0EBFBCF
+:107850000028C9D00520F0E770B5054604210BF0DB
+:107860007DFB040000D1FFDF04F114010C46284623
+:1078700005F02BFA21462846BDE8704005F02CBAE9
+:1078800070B58AB00C460646FBF7DDFD050014D046
+:107890002878222827D30CB1A08890B101208DF838
+:1078A0000C0003208DF8100000208DF8110054B159
+:1078B000A088ADF81800206807E043F202000AB083
+:1078C00070BD0920FBE7ADF8180005900421304693
+:1078D0000BF044FB040000D1FFDF04F1140005F0BD
+:1078E00026FA000701D40820E9E701F097FE60B10D
+:1078F00008A802210094CDE9011095F8232003A9DE
+:1079000030466368FFF7EEFBD9E71120D7E72DE992
+:10791000F04FB2F802A0834689B01546894650461A
+:10792000FBF791FD0746042150460BF017FB00269C
+:10793000044605964FF002080696ADF81C6007B99C
+:10794000FFDF04B9FFDF4146504603F03BFF50B96B
+:1079500007AA06A905A88DE8070042462146504619
+:107960006368FFF74EFB444807AB0660DDE905128C
+:1079700004F11400CDF80090CDE90320CDE90131E8
+:1079800097F82320594650466B6805F019FA06000F
+:107990000AD0022E04D0032E14D0042E00D0FFDF14
+:1079A00009B03046BDE8F08FBDF81C000028F7D0C4
+:1079B0000599CDE900104246214650466368FFF71D
+:1079C0004DFBEDE7687840F008006870E8E72DE9C6
+:1079D000F04F99B004464FF000082748ADF81C80DE
+:1079E000ADF82080ADF82480A0F80880ADF81480B0
+:1079F000ADF81880ADF82C80ADF8288000791646D7
+:107A00000D464746012808D0022806D0032804D096
+:107A1000042802D0082019B0C4E72046F9F719FC61
+:107A200070BB2846F9F715FC50BB6068F9F75EFC9F
+:107A300030BB606848B160892189884202D8B1F5BD
+:107A4000007F01D90C20E6E780460EAA06A9284649
+:107A5000FFF7C8F90028DED168688078C0F34100DC
+:107A6000022808D19DF8190010F0380F03D02869BA
+:107A7000F9F733FC20B904E098020020140000203C
+:107A800022E005A92069FFF765F90028C3D1206924
+:107A900048B1607880079DF8150000F0380001D5E6
+:107AA000F0B300E0E0BB9DF8140080060ED59DF811
+:107AB000150010F0380F03D06068F9F70EFC18B904
+:107AC0006068F9F713FC08B11020A4E70AA96069FF
+:107AD000FFF740F900289ED1606940B19DF8290068
+:107AE00000F0070101293CD110F0380F39D00BA963
+:107AF000A069FFF72FF900288DD19DF82800800696
+:107B00002FD49DF82C0080062BD4A06950B19DF88D
+:107B10002D0000F00701012923D110F0380F00E0FB
+:107B20001FE01ED0E06818B10078D0B11C2818D230
+:107B30000FAA611C2046FFF77CF90121384661F34A
+:107B40000F2082468DF85210B94642F603000F46C8
+:107B5000ADF850000DF13F0218A928680CF0B5FFF0
+:107B600008B1072057E79DF8600015A9CDF80090EF
+:107B7000C01CCDE9019100F0FF0B00230BF20122A4
+:107B8000514614A806F06EF9F0BBBDF854000C90F5
+:107B9000FE482A8929690092CDE901106B89BDF858
+:107BA00038202868069906F05DF901007ED120781A
+:107BB0004FF0020AC10601D480062BD5CDF80C90F7
+:107BC000606950B90AA906A8FFF764F99DF8290071
+:107BD00020F00700401C8DF829009DF8280008A916
+:107BE00040F0C8008DF828008DF8527042F602105F
+:107BF000ADF8500003AACDF800A0CDE90121002383
+:107C000040F2032214A800E01EE00A9906F02AF9C7
+:107C100001004BD1DD484D4608385B460089ADF880
+:107C20003D000FA8CDE90290CDF80490CDF810905A
+:107C30004FF007090022CDF80090BDF854104FF620
+:107C4000FF7006F052F810B1FFF753F8E3E69DF825
+:107C50003C00000624D52946012060F30F218DF851
+:107C600052704FF424500395ADF8500062789DF89F
+:107C70000C00002362F300008DF80C006278CDF850
+:107C800000A0520862F341008DF80C0003AACDE970
+:107C9000012540F2032214A806F0E4F8010005D102
+:107CA000606888B32069A8B905A900E084E006A847
+:107CB000FFF7F0F86078800706D49DF8150020F0F3
+:107CC00038008DF8150005E09DF8140040F04000E4
+:107CD0008DF814008DF8527042F60110ADF8500086
+:107CE000208940F20121B0FBF1F201FB1202606831
+:107CF00009ABCDF80080CDE90103002314A8059954
+:107D000006F0B0F8010057D12078C00728D00395BD
+:107D1000A06950B90BA906A8FFF7BCF89DF82D0083
+:107D200020F00700401C8DF82D009DF82C008DF8E8
+:107D3000527040F040008DF82C0042F60310ADF870
+:107D4000500007A903AACDF800A0CDE90121002326
+:107D500040F2032214A80B9906F084F801002BD1FD
+:107D6000E06868B32946012060F30F218DF8527056
+:107D700042F60410ADF85000E068002302788DF858
+:107D8000582040788DF85900E06816AA4088ADF870
+:107D90005A00E06800798DF85C00E068C088ADF8B2
+:107DA0005D00CDF80090CDE901254FF4027214A8D2
+:107DB00006F058F8010003D00C9800F0C9FF2AE63D
+:107DC000724803210838017156B100893080BDF82E
+:107DD00024007080BDF82000B080BDF81C00F08049
+:107DE000002018E670B501258AB016460B4601281A
+:107DF00002D0022816D104E08DF80E504FF4205026
+:107E000003E08DF80E5042F60100ADF80C005BB1B6
+:107E10000024601C60F30F2404AA08A918460CF083
+:107E200054FE18B107204AE5102048E504A99DF842
+:107E300020205648CDE90021801E029000232146D3
+:107E400003A802F2012206F00DF810B1FEF751FF6F
+:107E500035E54E4808380EB1C188318005710020E3
+:107E60002DE5F0B593B0074601268DF83E6041F64A
+:107E70000100ADF83C0012AA0FA93046FFF7B2FF8F
+:107E8000002849D1414C0025083CEFB31C220021B9
+:107E900002A806F0F4FA9DF808008DF83E6040F064
+:107EA00020008DF8080042F60520ADF83C000E9544
+:107EB0009DF83A00119520F00600801C8DF83A00DC
+:107EC0009DF838006A4620F0FF008DF838009DF8D4
+:107ED000390009A920F0FF008DF839000420ADF821
+:107EE0002C00ADF830000EA80A9011A80D900FA834
+:107EF0000990ADF82E5002A8FFF769FD00280BD1BC
+:107F0000BDF80000608100E008E0BDF80400A08139
+:107F1000401CE0812571002013B0F0BD6581A58172
+:107F2000BDF84800F4E72DE9F74F1849A0B0002448
+:107F3000083917940A79A146012A04D0022A02D0EE
+:107F4000082023B02EE5CA88824201D00620F8E737
+:107F500021988A46824201D10720F2E7012021467A
+:107F600060F30F21ADF848004FF6FF780691ADF8A9
+:107F70004A808DF86E0042F6020B8DF872401CA903
+:107F8000ADF86CB0ADF87040139101E0A002002094
+:107F9000ADF8508012A806F075F800252E462F4641
+:107FA0000DAB072212A9404606F06FF878B10A28F7
+:107FB0005DD195B38EB3ADF86450ADF866609DF8B1
+:107FC0005E008DF8144019AC012864D06BE09DF878
+:107FD0003A001FB3012859D1BDF8381059451FD1B7
+:107FE00018A809A901940294CDE903100720009074
+:107FF000BDF8361010230022404606F0D8F8B0BB7A
+:10800000BDF86000042801D006284AD1BDF824102C
+:10801000219881423AD10F2093E73AE0012835D1E7
+:10802000BDF83800B0F5205F03D042F60101884268
+:108030002CD1BAF80600BDF83610884201D10127CC
+:1080400000E0002705B19EB1219881421ED118A8F9
+:1080500009AA01940294CDE90320072000900D465F
+:1080600010230022404606F0A2F800B902E02DE0FD
+:108070004E460BE0BDF86000022801D0102810D158
+:10808000C0B217AA09A90CF001FD50B9BDF836908D
+:1080900086E7052055E705A917A8221D0CF015FD58
+:1080A00008B103204DE79DF814000023001DC2B263
+:1080B0008DF8142022980092CDE901401BA8069962
+:1080C00005F0D0FE10B902228AF80420FEF711FE56
+:1080D00037E710B50B46401E88B084B205AA0021D0
+:1080E0001846FEF7A6FE00200DF1080C06AA05A909
+:1080F00001908CE807000720009001230022214610
+:108100004FF6FF7005F0F1FD0446BDF81800012898
+:1081100000D0FFDF2046FEF7ECFD08B010BDF0B543
+:10812000F74F044687B038790E46032804D0042858
+:1081300002D0082007B0F0BD04AA03A92046FEF72C
+:1081400051FE0500F6D160688078C0F34100022836
+:108150000AD19DF80D0010F0380F05D02069F9F70D
+:10816000BCF808B11020E5E7208905AA21698DE84F
+:1081700007006389BDF810202068039905F072FE9E
+:1081800010B1FEF7B6FDD5E716B1BDF8140030808A
+:10819000042038712846CDE7F8B50C0006460CD00F
+:1081A00001464FF6FF7500236A46284606F084F81C
+:1081B00028B100BFFEF79DFDF8BD1020F8BD69464F
+:1081C0002046FEF7C7FD0028F8D1A078314600F020
+:1081D00001032846009A06F09EF8EBE730B587B019
+:1081E000144600220DF1080C05AD01928CE82C001C
+:1081F000072200920A46014623884FF6FF7005F0D9
+:1082000074FDBDF814102180FEF773FD07B030BD7A
+:1082100070B50D4604210AF0A1FE040000D1FFDF75
+:10822000294604F11400BDE8704004F079BD70B532
+:108230000D4604210AF092FE040000D1FFDF29461A
+:1082400004F11400BDE8704004F08DBD70B50D461A
+:1082500004210AF083FE040000D1FFDF294604F167
+:108260001400BDE8704004F0A5BD70B505460421BA
+:108270000AF074FE040000D1FFDF2146284623687F
+:10828000BDE870400122FEF703BF70B50646042129
+:108290000AF064FE040000D1FFDF04F1140004F0D2
+:1082A00030FD401D20F0030511E0011D0088002273
+:1082B000431821463046FEF7EBFE00280BD0607CC9
+:1082C000ABB2684382B2A068011D0AF004FDA06849
+:1082D00041880029E9D170BD70B5054604210AF036
+:1082E0003DFE040000D1FFDF214628466368BDE85B
+:1082F00070400222FEF7CCBE70B50E46054601F076
+:108300008DF9040000D1FFDF0120207266726580C4
+:10831000207820F00F00001D20F0F0004030207089
+:10832000BDE8704001F07DB910B50446012900D0C8
+:10833000FFDF2046BDE810400121FAF7C3B82DE960
+:10834000F04F97B04FF0000A0C008346ADF814A030
+:10835000D04619D0E06830B1A068A8B10188ADF866
+:108360001410A0F800A05846FBF76DF8070043F280
+:10837000020961D0387822285CD3042158460AF0DB
+:10838000EDFD050005D103E0102017B0BDE8F08F2A
+:10839000FFDF05F1140004F0B4FC401D20F00306DB
+:1083A000A078012803D0022801D00720EDE721881A
+:1083B00007AA584605F02BFE30BB07A805F033FE90
+:1083C00010BB07A805F02FFE48B99DF8260001282C
+:1083D00005D1BDF82400A0F52451023902D04FF494
+:1083E0005050D2E7E068B0B1CDE902A0072000907C
+:1083F00005AACDF804A00492A2882188BDF8143003
+:10840000584605F072FC10B1FEF773FCBDE7A16899
+:10841000BDF8140008809DF81F00C00602D543F285
+:108420000140B2E70B9838B1A1780078012905D056
+:1084300080071AD40820A8E74846A6E7C007F9D065
+:1084400002208DF83C00A8684FF00009A0B1697CBB
+:108450004288714391420FD98AB2B3B2011D0AF02A
+:10846000F0FB8046A0F800A006E003208DF83C0059
+:10847000D5F800804FF001099DF8200010F0380F6A
+:1084800000D1FFDF9DF820001E49C0F3C200084460
+:1084900097F8231010F8010C884201D90F2074E7D7
+:1084A0002088ADF8400014A90095CDE9019143461C
+:1084B00007220FA95846FEF715FE002891D19DF816
+:1084C000500050B9A078012807D1687CB3B270433E
+:1084D00082B2A868011D0AF0C8FB002055E770B5FC
+:1084E000064615460C460846FEF7C2FB002805D195
+:1084F0002A4621463046BDE8704073E470BD12E55F
+:1085000098020020FC2F000070B51E4614460D0096
+:1085100009D044B1616831B138B1FC49C9888142A0
+:1085200003D0072070BD102070BD2068FEF7A0FBAF
+:108530000028F9D1324621462846BDE87040FFF7B1
+:1085400046BA70B515460C0006D038B1EF49098916
+:10855000814203D0072070BD102070BD2068FEF757
+:1085600087FB0028F9D129462046BDE87040D6E5B2
+:1085700070B5064686B00D4614461046F8F78FFED5
+:10858000D0BB6068F8F7B2FEB0BBA6F57F40FF38FD
+:1085900003D03046FAF757FF80B128466946FEF708
+:1085A0009BFC00280CD19DF810100F2008293DD20B
+:1085B000DFE801F008060606060A0A0843F2020090
+:1085C00006B070BD0320FBE79DF80210012908D119
+:1085D000BDF80010B1F5C05FF2D06FF4C052D142C7
+:1085E000EED09DF8061001290DD1BDF80410A1F5BB
+:1085F0002851062907D200E029E0DFE801F0030353
+:1086000004030303DCE79DF80A1001290FD1BDF82C
+:108610000810B1F5245FD3D0A1F60211B1F50051D5
+:10862000CED00129CCD0022901D1C9E7FFDF606893
+:1086300078B9002305AA2946304605F03DFE10B161
+:10864000FEF757FBBCE79DF81400800601D410200C
+:10865000B6E76188224628466368FFF7BFFDAFE7AB
+:108660002DE9F043814687B0884614461046F8F756
+:1086700016FE18B1102007B0BDE8F083002306AA4B
+:108680004146484605F018FE18B100BFFEF731FB21
+:10869000F1E79DF81800C00602D543F20140EAE771
+:1086A0000025072705A8019500970295CDE90350FD
+:1086B00062884FF6FF734146484605F078FD060094
+:1086C00013D16068F8F7EBFD60B960680195CDE9FA
+:1086D000025000970495238862884146484605F079
+:1086E00066FD0646BDF8140020803046CEE739B15D
+:1086F000864B0A889B899A4202D843F2030070474E
+:108700001DE610B586B0814C0423ADF814306389A2
+:1087100043B1A4898C4201D2914205D943F20300AE
+:1087200006B010BD0620FBE7ADF810100021009147
+:108730000191ADF8003002218DF8021005A90291D7
+:1087400004A90391ADF812206946FFF7F8FDE7E7A9
+:108750002DE9FC4781460D460846F8F77AFD88BBAF
+:108760004846FAF770FE5FEA00080AD098F8000061
+:10877000222829D3042148460AF0F0FB070005D13E
+:1087800003E043F20200BDE8FC87FFDF07F11400BD
+:1087900004F0CDFA06462878012803D0022804D038
+:1087A0000720F0E7B0070FD502E016F01C0F0BD042
+:1087B000A8792C1DC00709D0E08838B1A068F8F767
+:1087C00048FD18B11020DEE70820DCE721882A7870
+:1087D0000720B1F5847F35D01EDC40F20315A1F2ED
+:1087E0000313A94226D00EDCB1F5807FCBD003DC89
+:1087F000F9B1012926D1C6E7A1F58073013BC2D0AA
+:10880000012B1FD113E0012BBDD0022B1AD0032B5B
+:10881000B9D0042B16D112E0A1F20912082A11D204
+:10882000DFE802F00B04041010101004ABE7022A7A
+:10883000A9D007E0012AA6D004E0320700E0F20642
+:10884000002AA0DACDB200F0E9FE50B198F823007A
+:10885000CDE90005FA89234639464846FEF78DFCE6
+:1088600091E711208FE72DE9F04F8BB01F46154699
+:108870000C4683460026FAF7E6FD28B10078222848
+:1088800005D208200BB081E543F20200FAE7B808F0
+:1088900001D00720F6E7032F00D100274FF6FF791C
+:1088A000CCB1022D73D32046F8F720FD30B904EB8C
+:1088B0000508A8F10100F8F719FD08B11020E1E75B
+:1088C000AD1E38F8028CAAB22146484605F055FE86
+:1088D00040455CD1ADB20D49B80702D58889401C2E
+:1088E00000E001201FFA80F8F80701D08F8900E02E
+:1088F0004F4605AA4146584605F089FB4FF0070A46
+:108900004FF00009DCB320460BE000009802002085
+:10891000408810283BD8361D304486B2AE4236D24D
+:10892000A01902884245F3D351E000BF9DF817001B
+:1089300002074CD594B304EB0608361DB8F8023094
+:10894000B6B2102B23D89A19AA4220D8B8F8002022
+:1089500091421CD1C0061CD5CDE900A90DF1080C2F
+:108960000AAAA11948468CE80700B8F800100022AE
+:10897000584605F0BAF920B1FEF7BBF982E726E0C8
+:1089800005E0B8F80200BDF82810884201D00B209D
+:1089900078E7B8F80200304486B207E0FFE7C00687
+:1089A00004D55846FEF71CFC002888D19DF8170016
+:1089B000BDF81A1020F010008DF81700BDF8170050
+:1089C000ADF80000FF235846009A05F0A4FC05A866
+:1089D00005F029FB18B9BDF81A10B942A6D904212F
+:1089E00058460AF0BBFA040000D1FFDFA2895AB151
+:1089F000CDE900A94D46002321465846FEF7BDFBB0
+:108A00000028BBD1A5813DE700203BE72DE9FF4FC2
+:108A10008BB01E4617000D464FF0000412D0B00870
+:108A200002D007200FB0B1E4032E00D100265DB1C3
+:108A30000846F8F752FC28B93888691E0844F8F748
+:108A40004CFC08B11020EDE7C74AB00701D5D18929
+:108A500000E00121F0074FF6FF7802D0D089401ED8
+:108A600000E0404686B206AA0B9805F0D0FA4FF017
+:108A700000094FF0070B0DF1140A38E09DF81B00B8
+:108A8000000734D5CDF80490CDF800B0CDF80890AB
+:108A9000CDE9039A434600220B9805F088FB60BBA2
+:108AA00005B3BDF814103A8821442819091D8A42DB
+:108AB00030D3BDF81E2020F8022BBDF8142020F87A
+:108AC000022BCDE900B9CDE90290CDF810A0BDF898
+:108AD0001E10BDF8143000220B9805F068FB08B199
+:108AE00003209FE7BDF814002044001D84B206A8AF
+:108AF00005F099FA20B10A2806D0FEF7FAF891E7B6
+:108B0000BDF81E10B142B9D934B17DB13888A11C6D
+:108B1000884203D20C2085E7052083E722462946B8
+:108B2000404605F02AFD014628190180A41C3C801E
+:108B3000002077E710B50446F8F7B1FB08B1102024
+:108B400010BD8948C0892080002010BDF0B58BB0D1
+:108B50000D4606461422002103A805F090FC0120D2
+:108B60008DF80C008DF8100000208DF81100ADF884
+:108B700014503046FAF767FC48B10078222812D327
+:108B8000042130460AF0EAF9040005D103E043F27B
+:108B900002000BB0F0BDFFDF04F11400074604F043
+:108BA000C6F8800601D40820F3E7207C022140F0BB
+:108BB0000100207409A80094CDE90110072203A93F
+:108BC00030466368FEF78EFA20B1217C21F0010166
+:108BD0002174DEE729463046F9F765FC08A93846D6
+:108BE00004F094F800B1FFDFBDF82040172C01D24B
+:108BF000172000E02046A84201D92C4602E0172C9D
+:108C000000D2172421463046FFF711FB214630469B
+:108C1000F9F76DF90020BCE7F8B51C4615460E467D
+:108C2000069F0AF0CEFA2346FF1DBCB231462A4603
+:108C3000009409F0B8FEF8BD70B50C4605460E224A
+:108C40000021204605F01BFC002020802DB1012DC5
+:108C500001D0FFDF70BD062000E00520A07170BDCF
+:108C600010B548800878134620F00F00001D20F052
+:108C7000F00080300C4608701422194604F10800F8
+:108C800005F0D3FB00F0CDFC3748046010BD2DE9A2
+:108C9000F047DFF8D890491D064621F0030117463A
+:108CA0000C46D9F8000009F094FF050000D1FFDF61
+:108CB0004FF000083560A5F800802146D9F8000083
+:108CC00009F087FF050000D1FFDF7560A5F800807F
+:108CD0007FB104FB07F1091D0BD0D9F8000009F0A2
+:108CE00078FF040000D1FFDFB460C4F80080BDE865
+:108CF000F087C6F80880FAE72DE9F0411746491DCC
+:108D000021F00302194D064601681446286809F04F
+:108D10008BFF22467168286809F086FF3FB104FB8B
+:108D200007F2121D03D0B168286809F07DFF042006
+:108D30000AF0BCF8044604200AF0C0F8201A012802
+:108D400004D12868BDE8F04109F038BFBDE8F081E2
+:108D500010B50C4605F02AF900B1FFDF2046BDE84A
+:108D60001040FDF7C6BF000098020020140000204C
+:108D700038B50C468288817B19B14189914200D96E
+:108D80000A462280C188121D90B26A4609F0E8F8AE
+:108D9000BDF80000032800D30320C1B2208801F0F1
+:108DA00027F838BD38B50C468288817B19B1018916
+:108DB000914200D90A462280C188121D90B26A46AB
+:108DC00009F0CEF8BDF80000022800D30220C1B29D
+:108DD000208801F00DF8401CC0B238BD2DE9FF5FBE
+:108DE00082468B46FB4814460BF10302D0E9011082
+:108DF000CDE9021022F0030201A84FF49071019214
+:108E000009F0C9FEF44E002C02D1F449019A8A609F
+:108E1000019901440191B57F05F1010504D1E8B242
+:108E20000BF0CCFD00B1FFDF019800EB0510C01C7A
+:108E300020F0030101915CB9707AB27A1044C2B299
+:108E400000200870308C80B204F00FFF00B1FFDF0B
+:108E50000198316A08440190214601A800F08BFF77
+:108E600080460198C01C20F003000190B37AF27A8A
+:108E7000717A04B1002009F084FF0199084401903F
+:108E8000214601A800F0BFFFD34800273D4690F8D7
+:108E900001900CE0284600F051FF0646817880885A
+:108EA000F9F7BCF871786D1C00FB0177EDB24D4508
+:108EB000F0D10198C01C20F00300019004B1002003
+:108EC0003946F9F7B6F80199002708440190C248DD
+:108ED0003D4690F801900CE0284600F02FFF064632
+:108EE000C1788088FEF707FC71786D1C00FB017764
+:108EF000EDB24D45F0D10198C01C20F00300019067
+:108F000004B100203946FEF7FFFB01994FF000093C
+:108F100008440190B0484D4647780EE0284600F0DE
+:108F20000DFF0646807B30B106F1080002F06EF9B5
+:108F3000727800FB02996D1CEDB2BD42EED1019832
+:108F4000C01C20F00300019004B10020A3494A781E
+:108F5000494602F05FF9019908440190214601A8B1
+:108F600000F0BCFE0198C01D20F007000190DAF867
+:108F70000010814204D3A0EB0B01B1F5803F04DB6C
+:108F80004FF00408CAF8000004E0CAF80000B8F185
+:108F9000000F03D0404604B0BDE8F09F74BB904979
+:108FA0000020019A0DF06CFEFBF7E9F98A4C207F56
+:108FB0000090607F012823D0002318B30022864848
+:108FC00000211030F8F714FA00B1FFDFE07FFEF760
+:108FD00048FF00B1FFDF80484FF4F67200214030B7
+:108FE00005F04DFA7C480421403080F8E91180F802
+:108FF000EA11062180F8EB11032101710020CAE774
+:109000000123DAE702AADAE770B5734C064640346A
+:10901000207804EB4015E078083598B9A01990F84D
+:10902000E80100280FD0A0780F2800D3FFDF20220E
+:109030000021284605F023FA687866F3020068707C
+:109040000120E070284670BD2DE9F04105460C4630
+:1090500000270078052190463E46B1EB101F00D056
+:10906000FFDF287A50B101280ED0FFDFA8F800609A
+:109070000CB1278066800020BDE8F0810127092619
+:1090800074B16888A08008E00227142644B168887B
+:10909000A0802869E060A88A2082287B2072E5E70A
+:1090A000A8F80060E7E730B54B4C012000212070A4
+:1090B0006170207260720322A272E0726177217780
+:1090C00021732174052121831F216183607445A1CF
+:1090D00061610A21A177E077404D4FF4B0602062D2
+:1090E0006868C11C21F00301814200D0FFDF68687D
+:1090F000606030BD30B5394C1568636810339D42EF
+:1091000002D20420136030BD334B5D785A6802EB05
+:109110000512107051700320D0801720908001201C
+:10912000D0709070002090735878401C5870606820
+:1091300010306060002030BD70B50646264800241F
+:10914000457807E0204600F0F9FD0178B14204D0EF
+:10915000641CE4B2AC42F5D1002070BDF7B50746FF
+:1091600008780C4610B3FFF7E7FF0546A7F1200685
+:10917000202F06D0052E19D2DFE806F00F3838155B
+:109180001A0000F0E6FD0DB1697800E00021401AF8
+:10919000A17880B20844FF2808D8A07830B1A08810
+:1091A000022831D202E0608817282DD20720FEBDA8
+:1091B000207A48B361881729F8D3A1881729F5D3F5
+:1091C000A1790029F2D0E1790029EFD0402811D906
+:1091D000ECE7000038620200B40300201800002011
+:1091E000000000206E52463578000000242F0BD17D
+:1091F000207A48B161884FF6FB70814202D8A1887D
+:10920000814201D90420FEBD65B9207802AA01215E
+:10921000FFF770FF0028F6D12078FFF78DFF0500DB
+:1092200000D1FFDF052E18D2DFE806F0030B0E0891
+:109230001100A0786870A088E8800FE06088A8809E
+:109240000CE0A078A87009E0A078E87006E054F877
+:10925000020FA8606068E86000E0FFDF0020FEBD4C
+:109260001A2835D00DDC132832D2DFE800F01B318C
+:10927000203131272723252D313129313131312F2B
+:109280000F00302802D003DC1E2821D107207047B0
+:109290003A3809281CD2DFE800F0151B0F1B1B1BF6
+:1092A0001B1B07000020704743F20400704743F285
+:1092B00002007047042070470D2070470F20704750
+:1092C0000820704711207047132070470620704710
+:1092D0000320704710B5007800F0010008F032FE5E
+:1092E000BDE81040BCE710B5007800F0010008F0C0
+:1092F00032FEBDE81040B3E70EB5017801F0010180
+:109300008DF80010417801F001018DF8011001780D
+:10931000C1F340018DF802104178C1F340018DF88E
+:109320000310017889088DF80410417889088DF8B8
+:10933000051081788DF80610C1788DF80710007936
+:109340008DF80800684607F046FEFFF789FF0EBD5E
+:109350002DE9F84FDFF8F883FE4C00264FF49077A4
+:109360001FE0012000F092FD0120FFF74DFE0546B1
+:109370003946D8F8080009F02CFC686000B9FFDF16
+:10938000686807F0F3FCB0B12846FAF743FB2846BB
+:1093900000F082FD28B93A466968D8F8080009F05B
+:1093A00043FC94F9E9010428DBDA022009F07EFD90
+:1093B00007460025A5E03A466968D8F8080009F094
+:1093C00033FCF2E7B8F802104046491C89B2A8F80D
+:1093D0000210B94201D3002141800221B8F80200F5
+:1093E00009F0BCFD002864D0B8F80200694608F016
+:1093F00018FDFFF735FF00B1FFDF9DF8000078B1E1
+:10940000B8F8020009F0EFFE5FEA000900D1FFDFC3
+:10941000484609F05CF918B1B8F8020002F0C0F94A
+:10942000B8F8020009F0CDFE5FEA000900D1FFDFC5
+:10943000484609F044F9E0BB0321B8F8020009F0FE
+:109440008DFD5FEA000B47D1FFDF45E0DBF8100040
+:1094500010B10078FF2849D0022000F017FD02204B
+:10946000FFF7D2FD8246484609F035FACAF80400F3
+:1094700000B9FFDFDAF8040009F0FDFA00210090DE
+:109480000170B8F802105046AAF8021002F08EF8E7
+:10949000484609F0F2FA00B9FFDF504600F0FCFC44
+:1094A00018B99AF80100000704D50098CBF810000D
+:1094B00012E024E0DBF8100038B10178491C11F00B
+:1094C000FF01017008D1FFDF06E000221146484687
+:1094D00000F002FC00B9FFDF94F9EA01022805DB85
+:1094E000B8F8020002F029F80028AFD194F9E90198
+:1094F000042804DB484609F024FB00B101266D1C5A
+:10950000EDB2BD4204D294F9EA010228BFF65AAF87
+:10951000002E7FF422AFBDE8F84F032000F0B6BC68
+:1095200010B58B4CE06008682061AFF2DB10F9F7F2
+:10953000B8FC607010BD8748002140380170844835
+:10954000017085494160704770B505464FF0805005
+:109550000C46D0F8A410491C05D1D0F8A810C94376
+:109560000904090C0BD050F8A01F01F0010129706B
+:10957000416821608068A080287830B970BD0621DC
+:1095800020460DF002F801202870607940F0C000FC
+:10959000607170BD70B54FF080540D46D4F88010E6
+:1095A000491C0BD1D4F88410491C07D1D4F8881079
+:1095B000491C03D1D4F88C10491C0CD0D4F880106D
+:1095C0000160D4F884104160D4F888108160D4F828
+:1095D0008C10C16002E010210CF0D7FFD4F890008D
+:1095E000401C0BD1D4F89400401C07D1D4F898004B
+:1095F000401C03D1D4F89C00401C09D054F8900FB3
+:10960000286060686860A068A860E068E86070BD75
+:109610002846BDE8704010210CF0B7BF4D480079D6
+:10962000F2E470B54B4CE07830B3207804EB401096
+:10963000407A00F00700204490F9E801002800DC9F
+:10964000FFDF2078002504EB4010407A00F007008F
+:10965000011991F8E801401E81F8E8012078401CCA
+:10966000C0B220700F2800D12570A078401CA070D7
+:109670000CF014FEE57070BDFFDF70BD3EB5054611
+:10968000032109F06BFC0446284609F09AFD0546C3
+:1096900004B9FFDF206918B10078FF2800D1FFDF8F
+:1096A00001AA6946284600F017FB60B9FFDF0AE00F
+:1096B000002202A9284600F00FFB00B9FFDF9DF849
+:1096C000080000B1FFDF9DF80000411E8DF800107A
+:1096D000EED220690199884201D1002020613EBD6F
+:1096E00070B50546A0F57F400C46FF3800D1FFDF7E
+:1096F000012C01D0FFDF70BDFFF790FF040000D107
+:10970000FFDF207820F00F00401D20F0F0005030E7
+:10971000207065800020207201202073BDE8704019
+:109720007FE72DE9F04116460D460746FFF776FF25
+:10973000040000D1FFDF207820F00F00401D20F052
+:10974000F00050302070678001202072286805E00A
+:1097500018000020F4030020481400202061A8888D
+:10976000A0822673BDE8F0415BE77FB5FFF7E4FC1C
+:10977000040000D1FFDF02A92046FFF7F9FA0546F1
+:1097800003A92046FFF70EFB8DF800508DF801006D
+:10979000BDF80800001DADF80200BDF80C00001D6A
+:1097A000ADF80400E088ADF80600684608F0B4FBA8
+:1097B000002800D0FFDF7FBD2DE9F05FF84E814625
+:1097C000307810B10820BDE8F09F4846F7F767FDF4
+:1097D00008B11020F7E7F34C207808B9FFF763FCD5
+:1097E000A17A607A4D460844C4B200F0B2FAA042B1
+:1097F00007D2201AC1B22A460020FFF77BFC0028BE
+:10980000E1D17168E748C91C002721F003017160AC
+:10981000B3463E463D46BA463C4690F801800AE0D3
+:10982000204600F08BFA4178807B0E4410FB0155F6
+:10983000641CE4B27F1C4445F2D10AEB870000EBC4
+:10984000C600D84E00EB85005C46F17A012200EBA1
+:109850008100DBF80410451829464846FFF7BEFA98
+:10986000070012D00020FFF767FC05000BD005F1C0
+:109870001300616820F00300884200D0FFDF707899
+:10988000401E7070656038469DE7002229464846B4
+:10989000FFF7A4FA00B1FFDFD9F8000060604FF6CF
+:1098A000FF7060800120207000208CE72DE9F041DE
+:1098B0000446BB4817460E46007810B10820BDE8A4
+:1098C000F0810846F7F7C5FC08B11020F7E7B54D61
+:1098D000287808B9FFF7E7FB601E1E2807D8012C7F
+:1098E00022D13078FE281FD8A8770020E7E7A4F11E
+:1098F00020001F2805D8E0B23A463146BDE8F041C5
+:109900002CE4A4F140001F2805D831462046BDE8CC
+:10991000F04100F0E9BAA4F1A0001F2804D800200B
+:10992000A02C03D0A12C06D00720C8E7317801F085
+:109930000101E977C3E731680922F82901D38B07D0
+:1099400001D01046BBE76B7C03F00303012B04D16D
+:109950006B8BD7339CB28C42F3D82962AFE72DE9E9
+:10996000F04781460E460846F7F799FC48B9484645
+:10997000F7F7B3FC28B909F1030020F003014945CA
+:1099800002D01020BDE8F08786484FF0000A403032
+:10999000817869B14178804600EB411408343788FA
+:1099A00032460021204600F085FA050004D027E069
+:1099B000A6F800A00520E5E7B9F1000F24D0308813
+:1099C000B84201D90C251FE0607800F00705284651
+:1099D00000F05CFA08EB0507324697F8E8014946C3
+:1099E000401C87F8E801204607F5F47700F062FA9A
+:1099F00005463878401E3870032000F047FA2DB134
+:109A00000C2D01D0A6F800A02846BBE76078644E74
+:109A100000F00701012923D002290CD0032934D0FA
+:109A2000FFDF98F801104046491CC9B288F80110C0
+:109A30000F2935D036E0616821B1000702D4608873
+:109A4000FFF71CFE98F8EA014746012802D170781A
+:109A5000F9F746FA97F9EA010428E2DBFFDFE0E7CD
+:109A6000616821B14FF49072B06809F0DDF898F8A0
+:109A7000E9014746032802D17078F9F731FA97F9DE
+:109A8000E9010428CDDBFFDFCBE7C00602D5608803
+:109A9000FFF7F4FD98F9EB010628C2DBFFDFC0E712
+:109AA00080F801A08178491E8170617801F007017A
+:109AB00001EB080090F8E811491C80F8E811A3E7D1
+:109AC00070B50D460446F7F7C4FB18B92846F7F7FA
+:109AD000E6FB08B1102070BD29462046BDE8704065
+:109AE0000AF0A4BF70B505460AF0C3FFC4B2284609
+:109AF000F7F7F3FB08B1102070BD35B128782C7052
+:109B000018B1A04201D0072070BD2046FDF760FECD
+:109B1000052805D10AF0B1FF012801D0002070BD51
+:109B20000F2070BD70B5044615460E460846F7F77F
+:109B300090FB18B92846F7F7B2FB08B1102070BDAA
+:109B4000022C03D0102C01D0092070BD2A463146CA
+:109B500020460AF09BFF0028F7D0052070BD70B5A5
+:109B600014460D460646F7F774FB38B92846F7F752
+:109B700096FB18B92046F7F7B0FB08B1102070BD6E
+:109B80002246294630460AF0A0FF0028F7D00720D9
+:109B900070BD3EB50446F7F782FB28B110203EBDEC
+:109BA00018000020B4030020684607F085F9FFF78D
+:109BB00057FB0028F3D19DF806002070BDF808007F
+:109BC0006080BDF80A00A0800020E8E770B5054677
+:109BD0000C460846F7F781FB20B93CB12068F7F73F
+:109BE0005EFB08B1102070BDA08828B12146284630
+:109BF000BDE87040FDF744BE092070BD70B5054654
+:109C00000C460846F7F725FB30B9681E1E2814D805
+:109C10002046F7F71EFB08B1102070BD032D01D9B7
+:109C2000072070BD05B9FFDFF94800EB850050F84B
+:109C3000041C2046BDE870400847A5F120001F28FD
+:109C400005D821462846BDE87040FAF70EBBF02D36
+:109C50000CD0F12D13D0BF2DE2D1A078218800F0D7
+:109C6000010001F059FB88B1002070BDA068F7F732
+:109C7000F0FA0028D0D1204608F0B3F902E02078AD
+:109C800008F0D2F9BDE87040FFF7EABA082070BDCD
+:109C900070B504460D460846F7F701FB30B9601E63
+:109CA0001E280FD82846F7F7D4FA08B1102070BD47
+:109CB000012C03D0022C01D0032C01D1062070BD51
+:109CC000072070BDA4F120001F28F9D8294620469E
+:109CD000BDE87040FAF733BB08F0C0BC7CB5044661
+:109CE000CC48007B00F0010511BB04F0EBFB0DB18B
+:109CF000226800E00022C8484178C06806F0A9FD4B
+:109D0000C5481030C0788DF8000010B1012802D08D
+:109D100004E0012000E000208DF80000684607F014
+:109D20003BF9BB4824380068019001A807F0EEFE1B
+:109D3000002D02D02068283020607CBD30B5B54DA4
+:109D400004466878A04200D8FFDF686800EB041082
+:109D500030BD70B5AF4800252C46467807E0204658
+:109D6000FFF7ECFF4078641C2844C5B2E4B2B4426B
+:109D7000F5D1284670BD2DE9F0410C4607464FF05D
+:109D8000000800F0EDF80646FF2801D94FF013084F
+:109D90003868C01C20F003023A6054EA080421D15C
+:109DA0009C48F3B2072124300CF0FCFD09E0072C9D
+:109DB00010D2DFE804F0060408080A0406009748F9
+:109DC00004E0974802E0974800E097480CF00AFE4C
+:109DD000054600E0FFDFA54200D0FFDF641CE4B2CF
+:109DE000072CE4D3386800EB06103860404666E57F
+:109DF000021D5143452900D245210844C01CB0FB37
+:109E0000F2F0C0B270472DE9FC5F064681484FF082
+:109E100000088B464746444690F8019022E02046D1
+:109E2000FFF78CFF050000D1FFDF687869463844F2
+:109E3000C7B22846FEF79CFF824601A92846FEF7D6
+:109E4000B1FF0346BDF804005246001D81B2BDF8C3
+:109E50000000001D80B209F0FFF86A78641C00FB66
+:109E60000288E4B24C45DAD13068C01C20F003000F
+:109E70003060BBF1000F00D000204246394609F0A7
+:109E8000F9F8316808443060BDE8FC9F6149403111
+:109E900008710020C87070475E494031CA782AB105
+:109EA0000A7801EB42110831814201D0012070474C
+:109EB000002070472DE9F04106460078154600F075
+:109EC0000F0400201080601E0F46052800D3FFDF1E
+:109ED0004F482A46183800EB8400394650F8043CB5
+:109EE0003046BDE8F04118472DE9F041494E0C4697
+:109EF000402806D0412823D042282BD0432806D121
+:109F000023E0A07861780D18E178814201D907201B
+:109F1000D5E42078012801D91320D0E4FF2D08D8FA
+:109F20000AF03EFF07460CF071F9381A801EA8426D
+:109F300001DA1220C3E42068B060207930730DE0AC
+:109F4000BDE8F041084600F036B808780228DED8AF
+:109F5000307703E008780228D9D870770020AEE483
+:109F60002DE9F047DFF8AC900026344699F8090057
+:109F700099F80A2099F801700244D5B299F80B209B
+:109F8000104400F0FF0808E02046FFF7D7FE817B71
+:109F9000407811FB0066641CE4B2BC42F4D199F82D
+:109FA000091099F80A0029442944414400B10120CC
+:109FB00008443044E6E438B50446407800F0030035
+:109FC000012803D002280BD0072038BD606858B1A3
+:109FD000F7F78CF9D0B96068F7F77FF920B915E089
+:109FE0006068F7F736F988B969462046FCF74EF8FD
+:109FF0000028EAD1607800F00300022816D19DF80D
+:10A00000000098B16068F7F768F978B1102038BDA2
+:10A010005C620200B4030020180000206B410000C5
+:10A0200035B30000B52F0000AF4701006189F82962
+:10A030000DD8208988420AD8607800F003020A48C7
+:10A04000012A06D1D731026A89B28A4201D2092097
+:10A05000DDE794E80E0000F1100585E80E000AB96E
+:10A06000002101830020D2E7B40300202DE9F04154
+:10A07000074614468846084601F08AFD064608EB66
+:10A0800088001C22796802EBC0000D18688C58B15A
+:10A090004146384601F08BFD014678680078C200E1
+:10A0A000082305F120000CE0E88CA8B141463846B1
+:10A0B00001F084FD0146786808234078C20005F16C
+:10A0C000240008F008FE38B1062121726681D0E92B
+:10A0D0000010C4E9031009E0287809280BD00520F6
+:10A0E000207266816868E060002028702046BDE824
+:10A0F000F04101F02EBD072020726681F4E72DE9C2
+:10A10000F04116460D460746406801EB85011C22CA
+:10A1100002EBC1014418204601F072FD40B100215C
+:10A12000708865F30F2160F31F4106200CF014FDC9
+:10A1300009202070324629463846BDE8F04195E7AF
+:10A140002DE9F0410E46074600241C21F07816E068
+:10A1500004EB8403726801EBC303D25C6AB1FFF7BE
+:10A160005DFA050000D1FFDF6F802A4621463046A8
+:10A17000FFF7C5FF0120BDE8F081641CE4B2A042F6
+:10A18000E6D80020F7E770B5064600241C21C07809
+:10A190000AE000BF04EB8403726801EBC303D51827
+:10A1A0002A782AB1641CE4B2A042F3D8402070BDE2
+:10A1B00028220021284604F062F9706880892881ED
+:10A1C000204670BD70B5034600201C25DC780CE0ED
+:10A1D00000EB80065A6805EBC6063244167816B1C5
+:10A1E000128A8A4204D0401CC0B28442F0D8402077
+:10A1F00070BDF0B5044600201C26E5780EE000BFD7
+:10A2000000EB8007636806EBC7073B441F788F426B
+:10A2100002D15B78934204D0401CC0B28542EFD893
+:10A220004020F0BD0078032801D0002070470120B5
+:10A2300070470078022801D0002070470120704745
+:10A240000078072801D000207047012070472DE9D1
+:10A25000F041064688461078F1781546884200D3CA
+:10A26000FFDF2C781C27641CF078E4B2A04201D8F0
+:10A27000201AC4B204EB8401706807EBC1010844E2
+:10A28000017821B14146884708B12C7073E72878DE
+:10A29000A042E8D1402028706DE770B514460B88C5
+:10A2A0000122A240134207D113430B8001230A224B
+:10A2B000011D08F0DAFC047070BD2DE9FF4F81B07C
+:10A2C0000878DDE90E7B9A4691460E4640072CD46D
+:10A2D000019808F088FF040000D1FFDF07F10408AF
+:10A2E00020461FFA88F108F0C5F8050000D1FFDF0D
+:10A2F000204629466A4608F010FB0098A0F8037033
+:10A30000A0F805A0284608F0B6FB017869F306011D
+:10A310006BF3C711017020461FFA88F108F0EDF8C1
+:10A3200000B9FFDF019806F002FA06EB0900017F91
+:10A33000491C017705B0BDE8F08F2DE9F84F0E46B6
+:10A340009A4691460746032108F008FE0446008D10
+:10A35000DFF8B885002518B198F80000B0421ED18A
+:10A36000384608F040FF070000D1FFDF09F1040183
+:10A37000384689B208F07EF8050010D038462946E4
+:10A380006A4608F0CAFA009800210A4601808170E6
+:10A3900006F08AFA0098C01DCAF8000021E098F87B
+:10A3A0000000B04216D104F1260734F8341F012012
+:10A3B00000FA06F911EA090F00D0FFDF2088012317
+:10A3C00040EA090020800A22391D384608F068FC5E
+:10A3D000067006E0324604F1340104F12600FFF76E
+:10A3E0005CFF0A2188F800102846BDE8F88FFEB50A
+:10A3F00015460C46064602AB0C220621FFF79DFFD0
+:10A40000002827D00299607812220A70801C4870B8
+:10A4100008224A80A07002982988052381806988D3
+:10A42000C180A9880181E988418100250C20CDE9FE
+:10A430000005062221463046FFF73FFF294600224D
+:10A4400066F31F41F02310460CF0DCFA6078801CA4
+:10A4500060700120FEBDFEB514460D46062206467C
+:10A4600002AB1146FFF769FF002812D0029B1320B0
+:10A4700000211870A8785870022058809C8006200F
+:10A48000CDE900010246052329463046FFF715FFB6
+:10A490000120FEBD2DE9FE430C46804644E002ABA0
+:10A4A0000E2207214046FFF748FF002841D0606890
+:10A4B0001C2267788678BF1C06EB860102EBC1017F
+:10A4C000451802981421017047700A214180698A59
+:10A4D0000181E98A4181A9888180A98981813046E9
+:10A4E00001F056FB029905230722C8806F700420F3
+:10A4F000287000250E20CDE9000521464046FFF7D3
+:10A50000DCFE294666F30F2168F31F41F023002289
+:10A5100006200CF077FA6078FD49801C6070626854
+:10A520002046921CFFF793FE606880784028B6D1E1
+:10A530000120BDE8FE83FEB50D46064638E002ABBD
+:10A540000E2207213046FFF7F8FE002835D0686854
+:10A550001C23C17801EB810203EBC202841802982C
+:10A5600015220270627842700A224280A2894281DA
+:10A57000A2888281084601F00BFB01460298818087
+:10A58000618AC180E18A0181A088B8B10020207071
+:10A5900000210E20CDE9000105230722294630467F
+:10A5A000FFF78BFE6A68DB492846D21CFFF74FFE97
+:10A5B0006868C0784028C2D10120FEBD0620E6E7C9
+:10A5C0002DE9FE430C46814644E0204601F002FBA3
+:10A5D000D0B302AB082207214846FFF7AEFE0028A1
+:10A5E000A7D060681C2265780679AD1C06EB860151
+:10A5F00002EBC10147180298B7F8108006210170DC
+:10A60000457004214180304601F0C2FA01460298AB
+:10A6100005230722C180A0F804807D7008203870CF
+:10A620000025CDE9000521464846FFF746FE2946AC
+:10A6300066F30F2169F31F41F023002206200CF07E
+:10A64000E1F96078801C60706268B3492046121D91
+:10A65000FFF7FDFD606801794029B6D1012068E768
+:10A660002DE9F34F83B00D4691E0284601F0B2FA90
+:10A6700000287DD068681C2290F806A00AEB8A01A9
+:10A6800002EBC10144185146284601F097FAA1781F
+:10A69000CB0069684978CA00014604F1240008F03B
+:10A6A00036FB07468188E08B4FF00009091A8EB20D
+:10A6B00008B1C84607E04FF00108504601F053FAD0
+:10A6C00008B9B61CB6B2208BB04200D80646B346D5
+:10A6D00002AB324607210398FFF72FFE060007D092
+:10A6E000B8F1000F0BD0504601F03DFA10B106E072
+:10A6F00000201FE60299B8884FF0020908800196F1
+:10A70000E28B3968ABEB09001FFA80F80A44039822
+:10A710004E46009208F067FDDDE90021F61D434634
+:10A72000009608F074F9E08B404480B2E083B98869
+:10A73000884201D1012600E00026CDE900B6238A37
+:10A74000072229460398FFF7B8FD504601F00BFA9F
+:10A7500010B9E089401EE08156B1A078401CA0707D
+:10A760006868E978427811FB02F1CAB2012300E07F
+:10A7700007E081690E3008F078FA80F800A0002028
+:10A78000E0836A6865492846921DFFF760FD6868A6
+:10A79000817940297FF469AF0120CBE570B5064689
+:10A7A00048680D4614468179402910D104EB840194
+:10A7B0001C2202EBC101084401F043FA002806D034
+:10A7C0006868294684713046BDE8704048E770BD2E
+:10A7D000FEB50C460746002645E0204601F0FAF992
+:10A7E000D8B360681C22417901EB810102EBC10101
+:10A7F0004518688900B9FFDF02AB082207213846F7
+:10A80000FFF79BFD002833D00299607816220A706A
+:10A81000801C4870042048806068407901F0B8F9D5
+:10A82000014602980523072281806989C18008209A
+:10A83000CDE9000621463846FFF73FFD6078801CD1
+:10A840006070A88969890844B0F5803F00D3FFDFB4
+:10A85000A88969890844A8816E81626830492046C8
+:10A86000521DFFF7F4FC606841794029B5D1012001
+:10A87000FEBD30B5438C458BC3F3C704002345B1FF
+:10A88000838B641EED1AC38A6D1E1D4495FBF3F382
+:10A89000E4B22CB1008918B1A04200D8204603448C
+:10A8A0004FF6FF70834200D3034613800C7030BD17
+:10A8B0002DE9FC41074616460D46486802EB860125
+:10A8C0001C2202EBC10144186A4601A92046FFF789
+:10A8D000D0FFA089618901448AB2BDF8001091427D
+:10A8E00012D0081A00D5002060816868407940289D
+:10A8F0000AD1204601F09BF9002805D06868294656
+:10A9000046713846FFF764FFBDE8FC812C0000204B
+:10A9100025A2000033A2000041A2000043BC0000B9
+:10A920002FBC00002DE9FE4F0F468146154650888A
+:10A93000032108F013FB0190B9F8020001F01BF9A4
+:10A9400082460146019801F045F9002824D001987B
+:10A950001C2241680AEB8A0002EBC0000C1820465A
+:10A9600001F04EF9002817D1B9F80000E18A8842B9
+:10A970000ED8A18961B1B8420ED100265146019886
+:10A9800001F015F9218C01EB0008608B30B114E067
+:10A99000504601F0E8F8A0B3BDE8FE8F504601F044
+:10A9A000E2F808B1678308E0022FF5D3B9F8040094
+:10A9B0006083618A884224D80226B81B87B2B8F81F
+:10A9C0000400A28B801A002814DD874200DA384682
+:10A9D0001FFA80FB688869680291D8F800100A4461
+:10A9E000009208F0EEFBF61D009A5B460299009675
+:10A9F00007F0D9FFA08B384480B2A083618B8842D6
+:10AA000007D96888019903B05246BDE8F04F01F0BC
+:10AA100035B91FD14FF009002872B9F802006881DA
+:10AA2000D8E90010C5E90410608BA881284601F020
+:10AA300090F85146019801F0BAF8014601980823B0
+:10AA400040680078C20004F1200008F044F90020BA
+:10AA5000A0836083504601F086F810B9A089401E9B
+:10AA6000A0816888019903B00AF0FF02BDE8F04FA9
+:10AA70001EE72DE9F041064615460F461C461846CE
+:10AA8000F6F7E7FB18B92068F6F709FC10B11020BB
+:10AA9000BDE8F0817168688C0978B0EBC10F01D313
+:10AAA0001320F5E73946304601F081F80146706819
+:10AAB00008230078C20005F1200008F0D6F8D4E998
+:10AAC0000012C0E900120020E2E710B5044603219D
+:10AAD00008F044FA0146007800F00300022805D08F
+:10AAE0002046BDE8104001F1140280E48A8A204625
+:10AAF000BDE81040AFE470B50446032108F02EFA1B
+:10AB0000054601462046FFF75BFD002816D0294682
+:10AB10002046FFF75DFE002810D029462046FFF7AB
+:10AB20000AFD00280AD029462046FFF7B3FC00287A
+:10AB300004D029462046BDE8704091E570BD2DE95E
+:10AB4000F0410C4680461EE0E178427811FB02F1AC
+:10AB5000CAB2816901230E3008F0BDF80778606839
+:10AB60001C22C179491EC17107EB8701606802EBA5
+:10AB7000C10146183946204601F02CF818B130467C
+:10AB800001F037F820B16068C1790029DCD17FE796
+:10AB9000FEF744FD050000D1FFDF0A202872384689
+:10ABA00000F0F6FF68813946204601F007F80146BB
+:10ABB000606808234078C20006F1240008F08BF892
+:10ABC000D0E90010C5E90310A5F80280284600F07E
+:10ABD000C0FFB07800B9FFDFB078401EB07057E713
+:10ABE00070B50C460546032108F0B8F901464068E7
+:10ABF000C2792244C2712846BDE870409FE72DE922
+:10AC0000FE4F8246507814460F464FF00008002849
+:10AC10004FD0012807D0022822D0FFDF2068B8607B
+:10AC20006068F860B8E602AB0E2208215046FFF7D4
+:10AC300084FB0028F2D002981521052301702178A9
+:10AC400041700A214180C0F80480C0F80880A0F853
+:10AC50000C80628882810E20CDE90008082221E064
+:10AC6000A678304600F094FF054606EB86012C22BC
+:10AC7000786802EBC1010822465A02AB11465046E1
+:10AC8000FFF75BFB0028C9D00298072101702178EB
+:10AC900041700421418008218580C680CDE90018DB
+:10ACA00005230A4639465046FFF707FB87F8088018
+:10ACB00072E6A678022516B1022E13D0FFDF2A1DF8
+:10ACC000914602AB08215046FFF737FB0028A5D07C
+:10ACD00002980121022E0170217841704580868002
+:10ACE00002D005E00625EAE7A188C180E18801815C
+:10ACF000CDE900980523082239465046D4E710B51F
+:10AD00000446032108F02AF9014600F10802204612
+:10AD1000BDE8104073E72DE9F04F0F4605468DB0B2
+:10AD200014465088032108F019F94FF000088DF8F7
+:10AD300014800646ADF81680042F7BD36A78002A6B
+:10AD400078D028784FF6FF794FF01C0A132834D0BA
+:10AD500008DC012871D006284AD007286ED01228B6
+:10AD60000ED106E014286AD0152869D0162807D11C
+:10AD7000AAE10C2F04D1307800F00301022907D09A
+:10AD8000CDF80880CDF80C8068788DF808004CE08C
+:10AD900040F0080030706878B07001208DF8140021
+:10ADA000A888ADF81800E888ADF81A002889ADF831
+:10ADB0001C006889ADF81E0011E1B078904239D1CD
+:10ADC0003078010736D5062F34D120F008003070D6
+:10ADD0006088414660F31F4100200BF0BDFE022059
+:10ADE0008DF81400ADF81890A888ADF81A00F6E0B8
+:10ADF000082F1FD1A888EF88814600F0BCFE80464E
+:10AE00000146304600F0E6FE18B1404600F0ABFEC9
+:10AE1000B8B1FC48D0E90010CDE902106878ADF86F
+:10AE20000C908DF80800ADF80E70608802AA3146CB
+:10AE3000FFF7E5FE0DB0BDE8F08FB6E01EE041E0A3
+:10AE4000ECE0716808EB88002C2202EBC000085A85
+:10AE5000B842EFD1EB4802AAD0E90210CDE90210C6
+:10AE600068788DF8080008F0FF058DF80A506088B2
+:10AE70003146FFF7C4FE224629461FE0082FD9D1EC
+:10AE8000B5F80480E88800F076FE074601463046B3
+:10AE900000F0A0FE0028CDD007EB870271680AEB16
+:10AEA000C2000844028A4245C4D101780829C1D1B0
+:10AEB000407869788842BDD1F9B222463046FFF722
+:10AEC0001EF9B7E70E2F7FF45BAFE9886F898B46D9
+:10AED000B5F808903046FFF775F9ABF1400140290D
+:10AEE00001D309204AE0B9F1170F01D3172F01D27E
+:10AEF0000B2043E040280ED000EB800271680AEB83
+:10AF0000C20008440178012903D140786978884259
+:10AF100090D00A2032E03046FFF735F9014640284C
+:10AF20002BD001EB810372680AEBC30002EB00082F
+:10AF3000012288F800206A7888F801207068AA88C1
+:10AF40004089B84200D93846AD8903232372A282D2
+:10AF5000E7812082A4F80C906582084600F018FE74
+:10AF60006081A8F81490A8F81870A8F80E50A8F8F6
+:10AF700010B0204600F0EDFD5CE7042005212172B1
+:10AF8000A4F80A80E081012121739E49D1E90421BE
+:10AF9000CDE9022169788DF80810ADF80A006088C3
+:10AFA00002AA3146FFF72BFEE3E7062F89D3B078DC
+:10AFB00090421AD13078010717D520F00800307080
+:10AFC0006088414660F31F4100200BF0C5FD022060
+:10AFD0008DF81400A888ADF81800ADF81A906088B4
+:10AFE000224605A9F9F7EDF824E704213046FFF7DA
+:10AFF00000F905464028BFD0022083030090224676
+:10B000002946304600F003FE4146608865F30F2173
+:10B0100060F31F4106200BF09FFD0BE70E2FABD115
+:10B0200004213046FFF7E5F881464028A4D0414688
+:10B03000608869F30F2160F31F4106200BF08CFD3F
+:10B04000A8890B906889099070682F894089B84257
+:10B0500000D938468346B5F80680A8880A90484645
+:10B0600000F096FD60810B9818B1022000900B9BB8
+:10B0700024E0B8F1170F1ED3172F1CD30420207221
+:10B0800009986082E781A4F810B0A4F80C8009EB5D
+:10B09000890271680AEBC2000D18DDE90913A5F8F1
+:10B0A0001480A5F818B0E9812B82204600F051FDEC
+:10B0B00006202870BEE601200B2300902246494658
+:10B0C000304600F0A4FDB5E6082F8DD1A9883046A2
+:10B0D000FFF778F80746402886D000F044FD0028A6
+:10B0E0009BD107EB870271680AEBC20008448046D7
+:10B0F00000F086FD002890D1ED88B8F80E002844B5
+:10B10000B0F5803F05D360883A46314600F0B6FD81
+:10B1100090E6002DCED0A8F80E0060883A46314661
+:10B12000FFF73CFB08202072384600F031FD6081BB
+:10B13000A5811EE72DE9F05F0C4601281FD0957907
+:10B1400092F8048092F8056005EB85011F2202EB5E
+:10B15000C10121F0030B08EB060111FB05F14FF6CD
+:10B16000FF7202EAC10909F1030115FB0611264F1E
+:10B1700021F0031ABB6840B101283ED125E0616887
+:10B18000E57891F800804E78DEE75946184607F0DA
+:10B1900020FD606000B9FFDF5A460021606803F0BF
+:10B1A0006EF9E5705146B86807F013FD61684861B3
+:10B1B00000B9FFDF6068426902EB090181616068E4
+:10B1C00080F800806068467017E060685246416908
+:10B1D000184607F029FD5A466168B86807F024FD53
+:10B1E000032007F063FE0446032007F067FE201AE1
+:10B1F000012802D1B86807F0E1FC0BEB0A00BDE8BA
+:10B20000F09F0000686202002C000020024600212E
+:10B2100002208FE7F7B5FF4C0A20164620700098F1
+:10B2200060B100254FEA0D0007F0B5FC0021A170C8
+:10B230006670002D01D10099A160FEBD012500209E
+:10B24000F2E770B50C46154638220021204603F07F
+:10B2500016F9012666700A22002104F11C0003F091
+:10B260000EF905B9FFDF297A207861F3010020701B
+:10B27000A87900282DD02A4621460020FFF75AFF42
+:10B2800061684020E34A88706168C870616808712D
+:10B29000616848716168887161682888088161689F
+:10B2A00068884881606886819078002811D061683C
+:10B2B0000620087761682888C885616828884886DC
+:10B2C00060680685606869889288018681864685FF
+:10B2D000828570BDC878002802D00022012029E7AD
+:10B2E000704770B50546002165F31F4100200BF043
+:10B2F00033FC0321284607F031FE040000D1FFDFB4
+:10B3000021462846FEF71CFF002804D0207840F094
+:10B3100010002070012070BD70B505460C4603205A
+:10B3200007F0B6FD08B1002070BDBA488570848072
+:10B33000012070BD2DE9FF4180460E460F0CFEF73F
+:10B340006DF9050007D06F800321384607F006FE2F
+:10B35000040008D106E004B03846BDE8F0411321EE
+:10B36000F9F758BBFFDF5FEA080005D0B8F1060F18
+:10B3700018D0FFDFBDE8FF8120782A4620F00800C2
+:10B3800020700020ADF8020002208DF800004FF67A
+:10B39000FF70ADF80400ADF8060069463846F8F7CE
+:10B3A00010FFE7E7C6F3072101EB81021C23606869
+:10B3B00003EBC202805C042803D008280AD0FFDF18
+:10B3C000D8E7012000904FF440432A46204600F081
+:10B3D0001EFCCFE704B02A462046BDE8F041FEF748
+:10B3E0008EBE2DE9F05F05464089002790460C4649
+:10B3F0003E46824600F0BFFB8146287AC01E0828E0
+:10B400006BD2DFE800F00D04192058363C47722754
+:10B410001026002C6CD0D5E90301C4E902015CE0E0
+:10B4200070271226002C63D00A2205F10C0104F1CA
+:10B43000080002F0FAFF50E071270C26002C57D0CC
+:10B44000E868A06049E0742710269CB3D5E90301A1
+:10B45000C4E902016888032107F080FD8346FEF7F6
+:10B46000DDF802466888508049465846FEF7FEFDE2
+:10B4700033E075270A26ECB1A88920812DE07627D4
+:10B480001426BCB105F10C0004F1080307C883E8D9
+:10B49000070022E07727102664B1D5E90301C4E94B
+:10B4A00002016888032107F059FD01466888FFF70B
+:10B4B00046FB12E01CE073270826CCB16888032104
+:10B4C00007F04CFD01460078C00606D56888FEF7F7
+:10B4D00037FE10B96888F8F781FAA8F800602CB137
+:10B4E0002780A4F806A066806888A080002086E6F1
+:10B4F000A8F80060FAE72DE9FC410C461E46174605
+:10B500008046032107F02AFD05460A2C0AD2DFE80F
+:10B5100004F005050505050509090907042303E0ED
+:10B52000062301E0FFDF0023CDE90076224629460D
+:10B530004046FEF7C2FEBDE8FC81F8B50546A0F521
+:10B540007F40FF382BD0284607F03BFE040000D197
+:10B55000FFDF204607F0BFF9002821D001466A46E8
+:10B56000204607F0DAF900980321B0F80560284674
+:10B5700007F0F4FC0446052E13D0304600F0FBFA29
+:10B5800005460146204600F025FB40B1606805EB0A
+:10B5900085013E2202EBC101405A002800D0012063
+:10B5A000F8BD007A0028FAD00020F8BDF8B50446AE
+:10B5B000408807F006FE050000D1FFDF6A462846F6
+:10B5C000616800F0C4FA01460098091F8BB230F898
+:10B5D000032F0280428842800188994205D1042AC3
+:10B5E00008D0052A20D0062A16D022461946FFF791
+:10B5F00099F9F8BD001D0E46054601462246304623
+:10B60000F6F73BFF0828F4D1224629463046FCF7DE
+:10B610007EF9F8BD2C000020636864880A46011D8D
+:10B620002046FAF7A1F9F4E72246001DFFF773FB65
+:10B63000EFE770B50D460646032107F08FFC0400C6
+:10B6400004D02078000704D5112070BD43F2020019
+:10B6500070BD2A4621463046FEF7C9FE18B9286853
+:10B6600060616868A061207840F0080020700020C8
+:10B6700070BD70B50D460646032107F06FFC04004F
+:10B6800004D02078000704D4082070BD43F20200E3
+:10B6900070BD2A4621463046FEF7DDFE00B9A58280
+:10B6A000207820F008002070002070BD2DE9F04FB8
+:10B6B0000E4691B08046032107F050FC04464046F8
+:10B6C00007F091FD07460020079008900990ADF81B
+:10B6D00030000A9002900390049004B9FFDF0DF14E
+:10B6E0000809FFB9FFDF1DE038460BA9002206F06C
+:10B6F000B5FF9DF82C0000F07F050A2D00D3FFDF79
+:10B700006019017F491E01779DF82C00000609D5BC
+:10B710002A460CA907A8FEF7C0FD19F80510491C18
+:10B7200009F80510761EF6B2DED204F13400F84DA9
+:10B7300004F1260BDFF8DCA304F12A07069010E0E1
+:10B740005846069900F08CFA064628700A2800D35D
+:10B75000FFDF5AF8261040468847E08CC05DB042B3
+:10B7600002D0208D0028EBD10A202870E94D4E46EA
+:10B7700028350EE00CA907A800F072FA0446375DE0
+:10B7800055F8240000B9FFDF55F82420394640461B
+:10B790009047BDF81E000028ECD111B0BDE8F08F35
+:10B7A00010B5032107F0DAFB040000D1FFDF0A2205
+:10B7B000002104F11C0002F062FE207840F0040039
+:10B7C000207010BD10B50C46032107F0C7FB2044C4
+:10B7D000007F002800D0012010BD2DE9F84F8946D8
+:10B7E00015468246032107F0B9FB070004D028461E
+:10B7F000F5F72FFD40B903E043F20200BDE8F88FF2
+:10B800004846F5F74CFD08B11020F7E7786828B1F5
+:10B8100069880089814201D90920EFE7B9F8000061
+:10B820001C2488B100F0A7F980460146384600F094
+:10B83000D1F988B108EB8800796804EBC000085C96
+:10B8400001280BD00820D9E73846FEF79CFC80463B
+:10B85000402807D11320D1E70520CFE7FDF7DEFE12
+:10B8600006000BD008EB8800796804EBC0000C18C8
+:10B87000B9F8000020B1E88910B113E01120BDE74C
+:10B880002888172802D36888172801D20720B5E72F
+:10B89000686838B12B1D224641463846FFF7E9F863
+:10B8A0000028ABD104F10C0269462046FEF7E1FF07
+:10B8B000288860826888E082B9F8000030B10220F0
+:10B8C0002070E889A080E889A0B12BE003202070D7
+:10B8D000A889A08078688178402905D180F8028005
+:10B8E00039465046FEF7D6FD404600F051F9A9F81A
+:10B8F000000021E07868218B4089884200D9084601
+:10B900002083A6F802A004203072B9F800007081EC
+:10B91000E0897082F181208B3082A08AB08130462C
+:10B9200000F017F97868C178402905D180F80380C4
+:10B9300039465046FEF7FFFD00205FE770B50D4623
+:10B940000646032107F00AFB04000ED0284600F04B
+:10B9500012F905460146204600F03CF918B1284688
+:10B9600000F001F920B1052070BD43F2020070BD66
+:10B9700005EB85011C22606802EBC101084400F060
+:10B980003FF908B1082070BD2A462146304600F034
+:10B9900075F9002070BD2DE9F0410C461746804630
+:10B9A000032107F0DBFA0546204600F0E4F80446E0
+:10B9B00095B10146284600F00DF980B104EB8401F1
+:10B9C0001C22686802EBC1014618304600F018F9E5
+:10B9D00038B10820BDE8F08143F20200FAE7052003
+:10B9E000F8E73B46324621462846FFF742F8002852
+:10B9F000F0D1E2B229464046FEF75AFF708C083873
+:10BA0000082803D242484078F7F76AFA0020E1E7B5
+:10BA10002DE9F0410D4617468046032107F09EFAB6
+:10BA20000446284600F0A7F8064624B13846F5F744
+:10BA300010FC38B902E043F20200CBE73868F5F7B2
+:10BA400008FC08B11020C5E73146204600F0C2F8D6
+:10BA500060B106EB86011C22606802EBC10145184B
+:10BA6000284600F0CDF818B10820B3E70520B1E76B
+:10BA7000B888A98A884201D90C20ABE76168E88CB4
+:10BA80004978B0EBC10F01D31320A3E7314620461C
+:10BA900000F094F80146606808234078C20005F180
+:10BAA000240007F0E2F8D7E90012C0E90012F2B270
+:10BAB00021464046FEF772FE00208BE72DE9F04755
+:10BAC0000D461F4690468146032107F047FA04467B
+:10BAD000284600F050F806463CB14DB13846F5F71F
+:10BAE000FCFB50B11020BDE8F08743F20200FAE7FA
+:10BAF000606858B1A0F80C8027E03146204600F07D
+:10BB000069F818B1304600F02EF828B10520EAE7B0
+:10BB10002C0000208062020006EB86011C22606877
+:10BB200002EBC1014518284600F06AF808B1082068
+:10BB3000D9E7A5F80880F2B221464846FEF7B8FEDC
+:10BB40001FB1A8896989084438800020CBE706F036
+:10BB5000E4BE017821F00F01491C21F0F001103101
+:10BB60000170FDF75EBD20B94E48807808B1012014
+:10BB70007047002070474B498988884201D10020D6
+:10BB80007047402801D2402000E0403880B2704722
+:10BB900010B50446402800D9FFDF2046FFF7E3FF39
+:10BBA00010B14048808810BD4034A0B210BD40683C
+:10BBB00042690078484302EBC0007047C278406891
+:10BBC000037812FB03F24378406901FB032100EB89
+:10BBD000C1007047C2788A4209D9406801EB8101EF
+:10BBE0001C2202EBC101405C08B10120704700201B
+:10BBF00070470078062801D901207047002070475F
+:10BC00000078062801D00120704700207047F0B46A
+:10BC100001EB81061C27446807EBC6063444049DEB
+:10BC200005262670E3802571F0BCFEF71FBA10B51B
+:10BC3000418911B1FFF7DDFF08B1002010BD0120DF
+:10BC400010BD10B5C18C8278B1EBC20F04D9C18987
+:10BC500011B1FFF7CEFF08B1002010BD012010BDCB
+:10BC600010B50C4601230A22011D07F034F80078B4
+:10BC70002188012282409143218010BDF0B402EB63
+:10BC800082051C264C6806EBC505072363554B68E7
+:10BC90001C79402C03D11A71F0BCFEF791BCF0BCAA
+:10BCA000704700002C00002010B5EFF3108000F06A
+:10BCB000010472B6FC484178491C41704078012863
+:10BCC00001D10AF013FB002C00D162B610BD70B593
+:10BCD000F54CA07848B90125A570FFF7E5FF0AF0FB
+:10BCE00016FB20B100200AF0E0FA002070BD4FF0F2
+:10BCF0008040E570C0F80453F7E770B5EFF31080AB
+:10BD000000F0010572B6E84C607800B9FFDF60789A
+:10BD1000401E6070607808B90AF0ECFA002D00D17E
+:10BD200062B670BDE04810B5817821B10021C170C4
+:10BD30008170FFF7E2FF002010BD10B504460AF045
+:10BD4000E6FAD9498978084000D001202060002017
+:10BD500010BD10B5FFF7A8FF0AF0D9FA022201239F
+:10BD6000D149540728B1D1480260236103200872E9
+:10BD700002E00A72C4F804330020887110BD2DE976
+:10BD8000F84FDFF824934278817889F80420002660
+:10BD900089F80510074689F806600078DFF810B3C7
+:10BDA000354620B1012811D0022811D0FFDF0AF05A
+:10BDB000C0FA4FF0804498B10AF0C2FAB0420FD1F5
+:10BDC00030460AF0C1FA0028FAD042E00126EEE738
+:10BDD000FFF76AFF58460168C907FCD00226E6E76C
+:10BDE0000120E060C4F80451B2490E600107D1F8A7
+:10BDF0004412B04AC1F3423124321160AD493431AA
+:10BE000008604FF0020AC4F804A3A060AA480168C1
+:10BE1000C94341F3001101F10108016841F010012B
+:10BE2000016001E0F7F7E0F8D4F804010028F9D048
+:10BE300030460AF089FA0028FAD0B8F1000F04D190
+:10BE40009D48016821F010010160C4F808A3C4F8FE
+:10BE5000045199F805004E4680B1387870B90AF05F
+:10BE600056FA80460AF05CFC6FF00042B8F1000F11
+:10BE700002D0C6E9032001E0C6E90302DBF80000B6
+:10BE8000C00701D00AF03FFA387810B13572BDE82A
+:10BE9000F88F4FF01808C4F808830127A7614FF402
+:10BEA0002070ADF8000000BFBDF80000411EADF8E5
+:10BEB0000010F9D2C4F80C51C4F810517A48C01DD2
+:10BEC0000AF0C2FA3570FFF744FF676179493079AB
+:10BED00020310860C4F80483D9E770B5050000D1AB
+:10BEE000FFDF4FF080424FF0FF30C2F8080300211F
+:10BEF000C2F80011C2F80411C2F80C11C2F81011F6
+:10BF0000694C61700AF00FFA10B10120A0706070E6
+:10BF100067480068C00701D00AF0F5F92846BDE877
+:10BF200070402CE76048007A002800D0012070475C
+:10BF30002DE9F04F61484FF0000A85B0D0F800B00D
+:10BF4000D14657465D4A5E49083211608406D4F8EE
+:10BF5000080110B14FF0010801E04FF000080AF0AD
+:10BF600046FA78B1D4F8240100B101208246D4F811
+:10BF70001C0100B101208146D4F8200108B101273D
+:10BF800000E00027D4F8000100B101200490D4F8AB
+:10BF9000040100B101200390D4F80C0100B101208C
+:10BFA0000290D4F8100100B101203F4D0190287893
+:10BFB00000260090B8F1000F04D0C4F808610120F9
+:10BFC0000AF073F9BAF1000F04D0C4F82461092013
+:10BFD0000AF06BF9B9F1000F04D0C4F81C610A2013
+:10BFE0000AF063F927B1C4F820610B200AF05DF96B
+:10BFF0002D48C01D0AF030FA00B1FFDFDFF8AC8039
+:10C000000498012780B1C4F80873E87818B1EE707D
+:10C0100000200AF04AF9287A022805D10320287264
+:10C020000221C8F800102761039808B1C4F8046120
+:10C03000029850B1C4F80C61287A032800D0FFDFC1
+:10C04000C8F800602F72FFF758FE019838B1C4F8A5
+:10C050001061287A012801D100F05CF8676100982E
+:10C0600038B12E70287A012801D1FFF772FEFFF750
+:10C0700044FE0D48C01D0AF005FA1049091DC1F81B
+:10C0800000B005B0BDE8F08F074810B5C01D0AF03C
+:10C09000E3F90549B0B1012008704FF0E021C1F883
+:10C0A0000002BDE81040FFE540000020340C0040D5
+:10C0B0000C0400401805004010ED00E0100502409F
+:10C0C00001000001087A012801D1FFF742FEBDE816
+:10C0D000104024480AF0D6B970B5224CE41FA0786D
+:10C0E00008B90AF007F901208507A861207A00261F
+:10C0F000032809D1D5F80C0120B900200AF024F951
+:10C100000028F7D1C5F80C6126724FF0FF30C5F852
+:10C11000080370BD70B5134CE41F6079F0B10128BD
+:10C1200003D0A179401E814218DA0AF0F0F80546E2
+:10C130000AF0F6FA6179012902D9A179491CA171A5
+:10C140000DB1216900E0E168411A022902DA11F11A
+:10C15000020F06DC0DB1206100E0E060BDE8704038
+:10C16000F7E570BD470000200F4A12680D498A426A
+:10C170000CD118470C4A12680A4B9A4206D101B5F5
+:10C180000AF0A0FA0AF073FDBDE80140074909680A
+:10C190000958084706480749054A064B70470000FA
+:10C1A00000000000BEBAFECA5800002004000020B3
+:10C1B000C8130020C8130020F8B51D46DDE9064766
+:10C1C0000E000AD007F00FF82346FF1DBCB231461F
+:10C1D0002A46009406F01BFCF8BDD01922461946E9
+:10C1E00002F023F92046F8BD70B50D460446102232
+:10C1F000002102F044F9258117206081A07B40F0E6
+:10C200000A00A07370BD4FF6FF720A80014602203B
+:10C210000AF0A2BC704700897047827BD30701D126
+:10C22000920703D48089088000207047052070475A
+:10C23000827B920700D581817047014600200988E2
+:10C2400041F6FE52114200D00120704700B503466E
+:10C25000807BC00701D0052000BD59811846FFF73B
+:10C26000ECFFC00703D0987B40F004009873987BE4
+:10C2700040F001009873002000BD827B520700D57A
+:10C2800009B14089704717207047827B61F3C30270
+:10C29000827370472DE9FC5F0E460446017896468E
+:10C2A000012000FA01F14DF6FF5201EA020962682D
+:10C2B0004FF6FF7B1188594502D10920BDE8FC9F4C
+:10C2C000B9F1000F05D041F6FE55294201D00120F9
+:10C2D000F4E741EA090111801D0014D000232B70FE
+:10C2E00094F800C0052103221F464FF0020ABCF15A
+:10C2F0000E0F76D2DFE80CF0F909252F47646B7733
+:10C30000479193B4D1D80420D8E7616820898B7B0A
+:10C310009B0767D517284AD30B89834247D389895E
+:10C32000172901D3814242D185F800A0A5F8010068
+:10C330003280616888816068817B21F002018173AD
+:10C34000C6E0042028702089A5F801006089A5F8BE
+:10C3500003003180BCE0208A3188C01D1FFA80F8BC
+:10C36000414524D3062028702089A5F80100608962
+:10C37000A5F80300A089A5F805000721208ACDE9CA
+:10C380000001636941E00CF0FF00082810D008208C
+:10C3900028702089A5F801006089A5F80300318084
+:10C3A0006A1D694604F10C0008F08FFB10B15EE0D5
+:10C3B0001020EDE730889DF800100844308087E0B9
+:10C3C0000A2028702089A5F80100328044E00C2062
+:10C3D00028702089A5F801006089A5F80300318044
+:10C3E0003AE082E064E02189338800EB41021FFAE1
+:10C3F00082F843453BD3B8F1050F38D30E222A709B
+:10C400000BEA4101CDE90010E36860882A467146D5
+:10C41000FFF7D2FEA6F800805AE04020287060891D
+:10C420003188C01C1FFA80F8414520D32878714616
+:10C4300020F03F00123028702089A5F801006089A3
+:10C44000CDE9000260882A46E368FFF7B5FEA6F84A
+:10C450000080287840063BD461682089888037E0D6
+:10C46000A0893288401D1FFA80F8424501D2042776
+:10C470003DE0162028702089A5F801006089A5F804
+:10C480000300A089CDE9000160882A46714623692E
+:10C49000FFF792FEA6F80080DEE718202870207AC9
+:10C4A0006870A6F800A013E061680A88920401D4BD
+:10C4B00005271CE0C9882289914201D0062716E091
+:10C4C0001E21297030806068018821F400510180AC
+:10C4D000B9F1000F0BD061887823002202200AF006
+:10C4E00091FA61682078887006E0338003276068DD
+:10C4F000018821EA090101803846DFE62DE9FF4F76
+:10C5000085B01746129C0D001E461CD03078C1071E
+:10C5100003D000F03F00192801D9012100E00021DB
+:10C520002046FFF7AAFEA8420DD32088A0F57F4140
+:10C53000FF3908D03078410601D4000605D508201F
+:10C5400009B0BDE8F08F0720FAE700208DF8000061
+:10C550008DF8010030786B1E00F03F0C0121A81E01
+:10C560004FF0050A4FF002094FF0030B9AB2BCF1ED
+:10C57000200F75D2DFE80CF08B10745E7468748C39
+:10C58000749C74B574BA74C874D474E1747474F11E
+:10C5900074EF74EE74ED748B052D78D18DF80090E6
+:10C5A000A0788DF804007088ADF8060030798DF819
+:10C5B0000100707800F03F000C2829D00ADCA0F1BF
+:10C5C0000200092863D2DFE800F0126215621A62E5
+:10C5D0001D622000122824D004DC0E281BD0102855
+:10C5E000DBD11BE016281FD01828D6D11FE02078F9
+:10C5F000800701E020784007002848DAEEE0207844
+:10C600000007F9E72078C006F6E720788006F3E710
+:10C6100020784006F0E720780006EDE72088C00586
+:10C62000EAE720884005E7E720880005E4E720885E
+:10C63000C004E1E72078800729D5032D27D18DF8A4
+:10C6400000B0B6F8010081E0217849071FD5062D1A
+:10C650001DD381B27078012803D0022817D102E0DF
+:10C66000C9E0022000E0102004228DF8002072783A
+:10C670008DF80420801CB1FBF0F2ADF8062092B2D8
+:10C6800042438A4203D10397ADF80890A6E079E0CF
+:10C690002078000776D598B282088DF800A0ADF812
+:10C6A0000420B0EB820F6DD10297ADF8061095E033
+:10C6B0002178C90666D5022D64D381B206208DF893
+:10C6C0000000707802285DD3B1FBF0F28DF8040011
+:10C6D000ADF8062092B242438A4253D1ADF8089099
+:10C6E0007BE0207880064DD5072003E020784006C7
+:10C6F0007FD508208DF80000A088ADF80400ADF8C3
+:10C700000620ADF8081068E02078000671D50920F1
+:10C71000ADF804208DF80000ADF8061002975DE03A
+:10C720002188C90565D5022D63D381B20A208DF811
+:10C730000000707804285CD3C6E72088400558D5EF
+:10C74000012D56D10B208DF80000A088ADF8040013
+:10C7500044E021E026E016E0FFE72088000548D508
+:10C76000052D46D30C208DF80000A088ADF80400FC
+:10C77000B6F803006D1FADF80850ADF80600ADF82F
+:10C780000AA02AE035E02088C00432D5012D30D13E
+:10C790000D208DF8000021E02088800429D4B6F80F
+:10C7A0000100E080A07B000723D5032D21D3307842
+:10C7B00000F03F001B2818D00F208DF800002088C3
+:10C7C00040F40050A4F80000B6F80100ADF80400F1
+:10C7D000ED1EADF80650ADF808B003976946059810
+:10C7E000F5F794FB050008D016E00E208DF8000048
+:10C7F000EAE7072510E008250EE0307800F03F005A
+:10C800001B2809D01D2807D0022005990AF0A4F999
+:10C81000208800F400502080A07B400708D52046E7
+:10C82000FFF70BFDC00703D1A07B20F00400A0732D
+:10C83000284685E61FB5022806D101208DF80000A4
+:10C8400088B26946F5F762FB1FBD0000F8B51D46CA
+:10C85000DDE906470E000AD006F0C5FC2346FF1DA1
+:10C86000BCB231462A46009406F0D1F8F8BDD01982
+:10C870002246194601F0D9FD2046F8BD2DE9FF4FAB
+:10C880008DB09B46DDE91B57DDF87CA00C46082BDC
+:10C8900005D0E06901F0FEF850B11020D2E0288800
+:10C8A000092140F0100028808AF80010022617E0C5
+:10C8B000E16901208871E2694FF420519180E169BA
+:10C8C0008872E06942F601010181E069002181730B
+:10C8D0002888112140F0200028808AF800100426C2
+:10C8E00038780A900A2038704FF0020904F11800D5
+:10C8F0004D460C9001F0C6FBB04681E0BBF1100F35
+:10C900000ED1022D0CD0A9EB0800801C80B20221B0
+:10C91000CDE9001005AB52461E990D98FFF796FF22
+:10C92000BDF816101A98814203D9F74800790F9084
+:10C9300004E003D10A9808B138702FE04FF00201EB
+:10C94000CDE900190DF1160352461E990D98FFF717
+:10C950007DFF1D980088401B801B83B2C6F1FF003D
+:10C96000984200D203461E990BA8D9B15FF000028D
+:10C97000DDF878C0CDE9032009EB060189B2CDE9E5
+:10C9800001C10F980090BDF8161000220D9801F01B
+:10C990000EFC387070B1C0B2832807D0BDF8160005
+:10C9A00020833AE00AEB09018A19E1E7022011B07D
+:10C9B000BDE8F08FBDF82C00811901F0FF08022DB1
+:10C9C0000DD09AF80120424506D1BDF820108142D1
+:10C9D00007D0B8F1FF0F04D09AF801801FE08AF861
+:10C9E0000180C94800680178052902D1BDF81610F8
+:10C9F000818009EB08001FFA80F905EB080085B279
+:10CA0000DDE90C1005AB0F9A01F03FFB28B91D982A
+:10CA10000088411B4145BFF671AF022D13D0BBF119
+:10CA2000100F0CD1A9EB0800801C81B20220CDE9C7
+:10CA3000000105AB52461E990D98FFF707FF1D98A0
+:10CA40000580002038700020B1E72DE9F8439C46AE
+:10CA5000089E13460027B26B9AB3491F8CB2F18F20
+:10CA6000A1F57F45FF3D05D05518AD882944891DA6
+:10CA70008DB200E000252919B6F83C800831414507
+:10CA800020D82A44BCF8011022F8021BBCF803107D
+:10CA900022F8021B984622F8024B914606F091FBC1
+:10CAA0004FF00C0C41464A462346CDF800C005F035
+:10CAB0007AFFF587B16B00202944A41D214408802A
+:10CAC00003E001E0092700E083273846BDE8F8834A
+:10CAD00010B50B88848F9C420CD9846BE0180488B5
+:10CAE00044B1848824F40044A41D23440B801060C6
+:10CAF000002010BD0A2010BD2DE9F0478AB00025A6
+:10CB0000904689468246ADF8185007274BE00598B5
+:10CB100006888088000446D4A8F8006007A801951C
+:10CB200000970295CDE903504FF40073002231467F
+:10CB3000504601F03CFB04003CD1BDF81800ADF8B4
+:10CB40002000059804888188B44216D10A0414D4C0
+:10CB500001950295039521F400410097049541F455
+:10CB6000804342882146504601F0BFF804000BD1B3
+:10CB70000598818841F40041818005AA08A94846AA
+:10CB8000FFF7A6FF0400DCD00097059802950195F9
+:10CB9000039504950188BDF81C300022504601F031
+:10CBA000A4F80A2C06D105AA06A94846FFF790FF6B
+:10CBB0000400ACD0ADF8185004E00598818821F449
+:10CBC0000041818005AA06A94846FFF781FF002899
+:10CBD000F3D00A2C03D020460AB0BDE8F08700202D
+:10CBE000FAE710B50C46896B86B051B10C218DF86F
+:10CBF0000010A18FADF80810A16B01916946FAF7FA
+:10CC00001BFB00204FF6FF71A063E187A08706B0F1
+:10CC100010BD2DE9F0410D460746896B0020069EA8
+:10CC20001446002911D0012B0FD13246294638462F
+:10CC3000FFF762FF002808D1002C06D032462946B3
+:10CC40003846BDE8F04100F034BFBDE8F0812DE981
+:10CC5000FC411446DDE9087C0E46DDE90A15521D4B
+:10CC6000BCF800E092B2964502D20720BDE8FC81F4
+:10CC7000ACF8002017222A70A5F80160A5F803304F
+:10CC80000522CDE900423B462A46FFF7DFFD0020A2
+:10CC9000ECE770B50C46154648220021204601F00D
+:10CCA000EEFB04F1080044F81C0F00204FF6FF7162
+:10CCB000E06161842084A5841720E08494F82A0030
+:10CCC00040F00A0084F82A0070BD4FF6FF720A8017
+:10CCD0000146032009F040BF30B585B00C4605463B
+:10CCE000FFF77FFFA18E284629B101218DF80010A2
+:10CCF0006946FAF7A1FA0020E0622063606305B09C
+:10CD000030BDB0F8400070475C00002090F846202D
+:10CD1000920703D4408808800020F4E70620F2E759
+:10CD200090F846209207EED5A0F84410EBE70146B4
+:10CD3000002009880A0700D5012011F0F00F01D06A
+:10CD400040F00200CA0501D540F004008A0501D573
+:10CD500040F008004A0501D540F010000905D2D581
+:10CD600040F02000CFE700B5034690F84600C0072A
+:10CD700001D0062000BDA3F842101846FFF7D7FFE8
+:10CD800010F03E0F05D093F8460040F0040083F801
+:10CD9000460013F8460F40F001001870002000BD57
+:10CDA00090F84620520700D511B1B0F84200AAE72A
+:10CDB0001720A8E710F8462F61F3C3020270A2E71C
+:10CDC0002DE9FF4F9BB00E00DDE92B34DDE929781A
+:10CDD000289D24D02878C10703D000F03F001928EF
+:10CDE00001D9012100E000212046FFF7D9FFB04220
+:10CDF00015D32878410600F03F010CD41E290CD031
+:10CE0000218811F47F6F0AD13A8842B1A1F57F429F
+:10CE1000FF3A04D001E0122901D1000602D5042016
+:10CE20001FB0C5E5FA491D984FF0000A08718DF84A
+:10CE300018A08DF83CA00FAA0A60ADF81CA0ADF8B0
+:10CE400050A02978994601F03F02701F5B1C04F145
+:10CE5000180C4FF0060E4FF0040BCDF858C01F2AE7
+:10CE60007ED2DFE802F07D7D107D267DAC7DF47DF5
+:10CE7000F37DF27DF17DF47DF07D7D7DEF7DEE7DB6
+:10CE80007D7D7D7DED0094F84610B5F801008907A1
+:10CE900001D5032E02D08DF818B01EE34FF40061C7
+:10CEA000ADF85010608003218DF83C10ADF84000C3
+:10CEB000D4E2052EEFD1B5F801002083ADF81C00B7
+:10CEC000B5F80310618308B1884201D9012079E1E6
+:10CED0000020A07220814FF6FF702084169801F088
+:10CEE000D1F8052089F800000220029083460AABA1
+:10CEF0001D9A16991B9801F0C8F890BB9DF82E005A
+:10CF0000012804D0022089F80100102003E001204C
+:10CF100089F8010002200590002203A90BA807F060
+:10CF2000D4FDE8BB9DF80C00059981423DD13988BC
+:10CF3000801CA1EB0B01814237DB02990220CDE975
+:10CF400000010DF12A034A4641461B98FFF77EFC7B
+:10CF500002980BF1020B801C81B217AA029101E02A
+:10CF60009CE228E003A90BA807F0AFFD02999DF809
+:10CF70000C00CDE9000117AB4A4641461B98FFF76C
+:10CF800065FC9DF80C000AAB0BEB00011FFA81FB5E
+:10CF900002991D9A084480B2029016991B9800E0ED
+:10CFA00003E001F072F80028B6D0BBF1020F02D006
+:10CFB000A7F800B04FE20A208DF818004BE20021DC
+:10CFC0000391072EFFF467AFB5F801002083ADF899
+:10CFD0001C00B5F80320628300283FF477AF90422D
+:10CFE0003FF674AF0120A072B5F805002081002043
+:10CFF000A073E06900F04EFD78B9E1690120887105
+:10D00000E2694FF420519180E1698872E16942F64A
+:10D0100001000881E06900218173F01F20841E98BF
+:10D02000606207206084169801F02CF8072089F8C8
+:10D0300000000120049002900020ADF82A0028E0B2
+:10D0400019E29FE135E1E5E012E2A8E080E043E08B
+:10D050000298012814D0E0698079012803D1BDF835
+:10D060002800ADF80E00049803ABCDE900B04A46A5
+:10D0700041461B98FFF7EAFB0498001D80B204901C
+:10D08000BDF82A00ADF80C00ADF80E00059880B28E
+:10D0900002900AAB1D9A16991B9800F0F6FF28B96A
+:10D0A00002983988001D05908142D1D2029801284A
+:10D0B00081D0E0698079012803D1BDF82800ADF85E
+:10D0C0000E00049803ABCDE900B04A4641461B98D8
+:10D0D000FFF7BCFB0298BDE1072E02D0152E7FF4AE
+:10D0E000DAAEB5F801102183ADF81C10B5F80320B5
+:10D0F000628300293FF4EAAE91423FF6E7AE012198
+:10D10000A1724FF0000BA4F808B084F80EB0052E01
+:10D1100007D0C0B2691DE26907F0B8FC00287FF4AF
+:10D120004AAF4FF6FF70208401A906AA14A8CDF8D3
+:10D1300000B081E885032878214600F03F031D9A5E
+:10D140001B98FFF79BFB8246208BADF81C0082E109
+:10D150000120032EC3D14021ADF85010B5F80110C5
+:10D160002183ADF81C100AAAB8F1000F00D00023EB
+:10D17000CDE9020304921D98CDF804800090388810
+:10D180000022401E83B21B9801F011F88DF81800A0
+:10D1900090BB0B2089F80000BDF8280035E04FF067
+:10D1A000010C052E9BD18020ADF85000B5F8011080
+:10D1B0002183B5F803002084ADF81C10B0F5007F82
+:10D1C00003D907208DF8180087E140F47C422284BF
+:10D1D0000CA8B8F1000F00D00023CDE90330CDE951
+:10D1E000018C1D9800903888401E83B21B9800F077
+:10D1F000DEFF8DF8180018B18328A8D10220BFE007
+:10D200000D2189F80010BDF83000401C22E100001B
+:10D210005C000020032E04D248067FF53CAE0020BF
+:10D2200018E1B5F80110ADF81C102878400602D5B9
+:10D230008DF83CE002E007208DF83C004FF000083C
+:10D240000320CDE902081E9BCDF810801D980193A4
+:10D25000A6F1030B00901FFA8BF342461B9800F0D7
+:10D2600044FD8DF818008DF83C80297849060DD5CD
+:10D270002088C00506D5208BBDF81C10884201D13E
+:10D28000C4F8248040468DF81880E3E0832801D15B
+:10D290004FF0020A4FF48070ADF85000BDF81C004A
+:10D2A0002083A4F820B01E986062032060841321BC
+:10D2B000CDE0052EFFF4EFADB5F80110ADF81C1070
+:10D2C000A28F6AB3A2F57F43FE3B29D008228DF8D6
+:10D2D0003C2000BF4FF0000B0523CDE9023BDDF8F9
+:10D2E00078C0CDF810B01D9A80B2CDF804C040F4DB
+:10D2F00000430092B5F803201B9800F0F6FC8DF86F
+:10D300003CB04FF400718DF81800ADF85010832830
+:10D3100010D0F8B1A18FA1F57F40FE3807D0DCE036
+:10D320000B228DF83C204FF6FE72A287D2E7A4F8BC
+:10D330003CB0D2E000942B4631461E9A1B98FFF772
+:10D3400084FB8DF8180008B183284BD1BDF81C0070
+:10D35000208353E700942B4631461E9A1B98FFF713
+:10D3600074FB8DF81800E8BBE18FA06B0844831DA7
+:10D370008DE888034388828801881B98FFF767FC43
+:10D38000824668E095F80180022E70D15FEA0800BD
+:10D3900002D0B8F1010F6AD109208DF83C0007A82E
+:10D3A00000908DF840804346002221461B98FFF7ED
+:10D3B00030FC8DF842004FF0000B8DF843B050B9AF
+:10D3C000B8F1010F12D0B8F1000F04D1A18FA1F56F
+:10D3D0007F40FF380AD0A08F40B18DF83CB04FF4A9
+:10D3E000806000E037E0ADF850000DE00FA91B9819
+:10D3F000F9F722FF82468DF83CB04FF48060ADF81B
+:10D400005000BAF1020F06D0FC480068C07928B17C
+:10D410008DF8180027E0A4F8188044E0BAF1000F56
+:10D4200003D081208DF818003DE007A80090434606
+:10D43000012221461B98FFF7ECFB8DF818002146CE
+:10D440001B98FFF7CEFB9DF8180020B9192189F829
+:10D450000010012038809DF83C0020B10FA91B98D6
+:10D46000F9F7EAFE8246BAF1000F33D01BE018E06C
+:10D470008DF818E031E02078000712D5012E10D188
+:10D480000A208DF83C00E088ADF8400003201B998D
+:10D4900009F062FB0820ADF85000C0E648067FF5B1
+:10D4A000FAAC4FF0040A2088BDF8501008432080E1
+:10D4B000BDF8500080050BD5A18FA1F57F40FE3847
+:10D4C00006D11E98E06228982063A6864FF0030AD2
+:10D4D0005046A5E49DF8180078B1012089F80000B5
+:10D4E000297889F80110BDF81C10A9F802109DF8E0
+:10D4F000181089F80410052038802088BDF85010D5
+:10D5000088432080E4E72DE9FF4F8846087895B0EE
+:10D51000012181404FF20900249C0140ADF8201008
+:10D520002088DDF88890A0F57F424FF0000AFF3A8E
+:10D5300006D039B1000705D5012019B0BDE8F08F3C
+:10D540000820FAE7239E4FF0000B0EA886F800B0E3
+:10D5500018995D460988ADF83410A8498DF81CB0BB
+:10D56000179A0A718DF838B0086098F80000012801
+:10D570003BD0022809D003286FD1307820F03F003B
+:10D580001D303070B8F80400E08098F800100320D7
+:10D59000022904D1317821F03F011B31317094F818
+:10D5A0004610090759D505ABB9F1000F13D000217A
+:10D5B00002AA82E80B000720CDE90009BDF834007B
+:10D5C000B8F80410C01E83B20022159800F0EFFDD9
+:10D5D0000028D1D101E0F11CEAE7B8F80400A6F870
+:10D5E0000100BDF81400C01C04E198F805108DF886
+:10D5F0001C1098F80400012806D04FF4007A022885
+:10D600002CD00328B8D16CE12188B8F8080011F4B7
+:10D610000061ADF8201020D017281CD3B4F84010BA
+:10D62000814218D3B4F84410172901D3814212D192
+:10D63000317821F03F01C91C3170A6F801000321A7
+:10D64000ADF83410A4F8440094F8460020F002002D
+:10D6500084F8460065E105257EE177E1208808F140
+:10D66000080700F4FE60ADF8200010F0F00F1BD0AA
+:10D6700010F0C00F03D03888228B9042EBD199B9BB
+:10D68000B878C00710D0B9680720CDE902B1CDF84D
+:10D6900004B00090CDF810B0FB88BA88398815988E
+:10D6A00000F023FB0028D6D12398BDF82010401CA1
+:10D6B00080294ED006DC10290DD020290BD040291E
+:10D6C00087D124E0B1F5807F6ED051457ED0B1F591
+:10D6D000806F97D1DEE0C80601D5082000E0102059
+:10D6E00082460DA907AA0520CDE902218DF8380050
+:10D6F000ADF83CB0CDE9049608A93888CDE9000121
+:10D700005346072221461598FFF7B8F8A8E09DF880
+:10D710001C2001214FF00A0A002A9BD105ABB9F168
+:10D72000000F00D00020CDE902100720CDE900094C
+:10D73000BDF834000493401E83B2218B002215985B
+:10D7400000F035FD8DF81C000B203070BDF8140082
+:10D7500020E09DF81C2001214FF00C0A002A22D164
+:10D7600013ABB9F1000F00D00020CDE90210072063
+:10D77000CDE900090493BDF83400228C401E83B229
+:10D78000218B159800F013FD8DF81C000D203070D2
+:10D79000BDF84C00401CADF8340005208DF8380071
+:10D7A000208BADF83C00BCE03888218B88427FF4A8
+:10D7B00052AF9DF81C004FF0120A00281CD1606A7D
+:10D7C000A8B1B878C0073FF446AF00E018E0BA68E7
+:10D7D0000720CDE902B2CDF804B00090CDF810B02A
+:10D7E000FB88BA88159800F080FA8DF81C00132089
+:10D7F00030700120ADF8340093E000005C000020A0
+:10D800003988208B8142D2D19DF81C004FF0160A36
+:10D810000028A06B08D0E0B34FF6FF7000215F46F0
+:10D82000ADF808B0019027E068B1B978C907BED15A
+:10D83000E18F0DAB0844821D03968DE80C024388EE
+:10D840008288018809E0B878C007BCD0BA680DABFF
+:10D8500003968DE80C02BB88FA881598FFF7F7F954
+:10D8600005005ED0072D72D076E0019005AA02A9CE
+:10D870002046FFF72DF90146E28FBDF808008242ED
+:10D8800001D00029F1D0E08FA16B084407800198F6
+:10D89000E08746E09DF81C004FF0180A40B1208B4D
+:10D8A000C8B13888208321461598FFF79AF938E0E7
+:10D8B00004F118000090237E012221461598FFF7FD
+:10D8C000A8F98DF81C000028EDD119203070012036
+:10D8D000ADF83400E7E7052521461598FFF781F9F3
+:10D8E0003AE0208800F40070ADF8200050452DD1BA
+:10D8F000A08FA0F57F41FE3901D006252CE0D8F895
+:10D9000008004FF0160A48B1A063B8F80C10A187C0
+:10D910004FF6FF71E187A0F800B002E04FF6FF700C
+:10D92000A087BDF8200030F47F611AD07823002250
+:10D930000320159909F066F898F8000020712088F6
+:10D94000BDF82010084320800EE000E00725208865
+:10D95000BDF8201088432080208810F47F6F1CD0F1
+:10D960003AE02188814321809DF8380020B10EA93A
+:10D970001598F9F761FC05469DF81C000028EBD0CE
+:10D9800086F801A001203070208B70809DF81C006B
+:10D9900030710520ADF83400DEE7A18EE1B11898B2
+:10D9A0000DAB0088ADF834002398CDE90304CDE930
+:10D9B0000139206B0090E36A179A1598FFF700FA77
+:10D9C000054601208DF838000EA91598F9F734FCAA
+:10D9D00000B10546A4F834B094F8460040070AD5D3
+:10D9E0002046FFF7A4F910F03E0F04D114F8460FBB
+:10D9F00020F0040020701898BDF8341001802846EB
+:10DA00009BE500B585B0032806D102208DF8000003
+:10DA100088B26946F9F710FC05B000BD10B5384C66
+:10DA20000B782268012B02D0022B2AD111E0137847
+:10DA30000BB1052B01D10423137023688A889A80C7
+:10DA40002268CB88D38022680B8913814989518150
+:10DA50000DE08B8893802268CB88D38022680B8965
+:10DA600013814B8953818B899381096911612168E5
+:10DA7000F9F7E2FB226800210228117003D0002888
+:10DA800000D0812010BD832010BD806B002800D005
+:10DA9000012070478178012909D10088B0F5205F05
+:10DAA00003D042F60101884201D1002070470720CF
+:10DAB0007047F0B587B0002415460E460746ADF80E
+:10DAC000184011E005980088288005980194811D70
+:10DAD000CDE902410721049400918388428801889E
+:10DAE000384600F002F930B905AA06A93046FEF71B
+:10DAF000EFFF0028E6D00A2800D1002007B0F0BDD3
+:10DB00005C00002010B58B7883B102789A4205D171
+:10DB10000B885BB102E08B79091D4BB18B789A427F
+:10DB2000F9D1B0F801300C88A342F4D1002010BD27
+:10DB3000812010BD072826D012B1012A27D103E089
+:10DB4000497801F0070102E04978C1F3C2010529D3
+:10DB50001DD2DFE801F00318080C12000AB10320FF
+:10DB600070470220704704280DD250B10DE00528FF
+:10DB700009D2801E022808D303E0062803D0032818
+:10DB800003D005207047002070470F207047812088
+:10DB90007047C0B282060BD4000607D5FA48807AD7
+:10DBA0004143C01D01EBD00080B27047084670476A
+:10DBB0000020704770B513880B800B781C0625D5A4
+:10DBC000F14CA47A844204D843F01000087000207D
+:10DBD00070BD956800F0070605EBD0052D78F5407F
+:10DBE00065F304130B701378D17803F0030341EA53
+:10DBF000032140F20123B1FBF3F503FB15119268F9
+:10DC0000E41D00FB012000EBD40070BD906870BDE6
+:10DC100037B51446BDF804101180117841F00401A5
+:10DC200011709DF804100A061ED5D74AA368C1F3E7
+:10DC30000011927A824208D8FE2811D1D21DD20852
+:10DC40004942184600F01BFC0AE003EBD00200F04A
+:10DC50000703012510789D40A843994008431070A0
+:10DC6000207820F0100020703EBD2DE9F0410746DD
+:10DC7000C81C0E4620F00300B04202D08620BDE84A
+:10DC8000F081C14D002034462E60AF802881AA72F9
+:10DC9000E8801AE0E988491CE980810614D4E1781B
+:10DCA00000F0030041EA002040F20121B0FBF1F254
+:10DCB00001FB12012068FFF76CFF2989084480B23C
+:10DCC0002881381A3044A0600C3420784107E1D410
+:10DCD0000020D4E7AC4801220189C08800EB400055
+:10DCE00002EB8000084480B270472DE9FF4F89B0F5
+:10DCF0001646DDE9168A0F46994623F44045084644
+:10DD000000F054FB040002D02078400703D4012027
+:10DD10000DB0BDE8F08F099805F0E6F80290207884
+:10DD2000000606D59848817A0298814201D887205A
+:10DD3000EEE7224601A90298FFF73CFF8346002048
+:10DD40008DF80C004046B8F1070F1AD00122214689
+:10DD5000FFF7F0FE0028DBD12078400611D5022025
+:10DD60008DF80C00ADF81070BDF80400ADF812008D
+:10DD7000ADF814601898ADF81650CDF81CA0ADF8A9
+:10DD800018005FEA094004D500252E46A846012761
+:10DD90000CE02178E07801F0030140EA012040F234
+:10DDA0000121B0FBF1F2804601FB12875FEA494096
+:10DDB00009D5B84507D1A178207901F0030140EADF
+:10DDC0000120B04201D3BE4201D90720A0E7A81923
+:10DDD0001FFA80F9B94501D90D2099E79DF80C008B
+:10DDE00028B103A90998F9F725FA002890D1B84578
+:10DDF00007D1A0784FEA192161F30100A07084F8DF
+:10DE000004901A9800B10580199850EA0A0027D0AA
+:10DE1000199830B10BEB06002A46199900F005FB62
+:10DE20000EE00BEB06085746189E099805F0C9F955
+:10DE30002B46F61DB5B239464246009504F0B3FDB7
+:10DE4000224601A90298FFF7B5FE9DF8040022467C
+:10DE500020F010008DF80400DDE90110FFF7D8FE76
+:10DE6000002055E72DE9FF4FDFF81C91824685B071
+:10DE7000B9F80610D9F8000001EB410100EB81046C
+:10DE800040F20120B2FBF0F1174600FB1175DDE90D
+:10DE9000138B4E4629460698FFF77BFE0346FFF795
+:10DEA00019FF1844B1880C30884202D9842009B087
+:10DEB0002FE70698C6B2300603D5B00601D5062076
+:10DEC000F5E7B9F80620521C92B2A9F80620BBF17A
+:10DED000000F01D0ABF80020B00602D5C4F80880CE
+:10DEE0000AE0B9F808201A4492B2A9F80820D9F833
+:10DEF0000000891A0844A0602246FE200699FFF718
+:10DF000087FEE77025712078390A61F301002A0A3B
+:10DF1000A17840F0040062F30101A17020709AF82A
+:10DF200002006071BAF80000E08000252573300619
+:10DF300002D599F80A7000E00127B00601D54FF02C
+:10DF400000084E4600244FF007090FE0CDE90258C3
+:10DF50000195CDF800900495F1882046129B089A0F
+:10DF6000FFF7C3FE0028A2D1641CE4B2BC42EDD38B
+:10DF700000209CE700B5FFF7ADFE03490C308A880E
+:10DF8000904203D9842000BD00060020CA8808689A
+:10DF900002EB420300EB8300521C037823F00403DE
+:10DFA0000370CA80002101730846ECE72DE9F047B1
+:10DFB000804600F0FBF9070005D000264446F74DE7
+:10DFC00040F2012916E00120BDE8F087204600F06C
+:10DFD000EDF90278C17802F0030241EA0222B2FBB5
+:10DFE000F9F309FB13210068FFF7D3FD3044641CEB
+:10DFF00086B2A4B2E988601E8142E7DCA8F1010084
+:10E00000E8802889801B288100203870DCE710B563
+:10E01000144631B1491E218004F066FFA070002033
+:10E0200010BD012010BD70B50446DC48C1880368EE
+:10E0300001E0401C20802088884207D200EB40028B
+:10E0400013EB820202D015786D07F2D580B28842B8
+:10E0500016D2AAB15079A072D08820819178107917
+:10E0600001F0030140EA0120A081A078E11CFFF744
+:10E07000A1FD20612088401C2080E080002070BD30
+:10E080000A2070BD0121018270472DE9FF4F85B044
+:10E090004FF6FF798246A3F8009048681E460D4669
+:10E0A00080788DF8060048680088ADF804000020EC
+:10E0B0008DF80A00088A0C88A04200D304462C82FE
+:10E0C00051E03878400708D4641C288AA4B2401C68
+:10E0D000288208F10100C0B246E0288A401C28824C
+:10E0E000781D6968FFF70EFDD8BB3188494501D11D
+:10E0F000601E30803188A1EB080030806888A04223
+:10E1000038D3B878397900F0030041EA002801A932
+:10E11000781DFFF7F7FC20BB298949452ED0002246
+:10E1200039460798FFF706FDD8B92989414518D126
+:10E13000E9680391B5F80AC0D7F808B05046CDF8A1
+:10E1400000C005F03EF8DDF800C05A460CF1070C9F
+:10E150001FFA8CFC43460399CDF800C004F0EDFB98
+:10E1600060B1641CA4B200208046204600F01EF975
+:10E170000700A6D1641E2C820A2098E67480787964
+:10E18000B071F888B0803978F87801F0030140EA7E
+:10E1900001207081A6F80C80504604F0A5FE3A4696
+:10E1A00006F10801FFF706FD306100207FE62DE94A
+:10E1B000FF4F87B081461C469246DDF860B0DDF81F
+:10E1C0005480089800F0F2F8050002D02878400743
+:10E1D00002D401200BB09CE5484604F085FE297866
+:10E1E000090605D56D49897A814201D88720F1E772
+:10E1F000CAF309062A4601A9FFF7DCFC0746149872
+:10E2000007281CD000222946FFF794FC0028E1D102
+:10E210002878400613D501208DF808000898ADF83D
+:10E220000C00BDF80400ADF80E00ADF81060ADF8BC
+:10E23000124002A94846F8F7FDFF0028CAD1297804
+:10E24000E87801F0030140EA0121AA78287902F078
+:10E25000030240EA0220564507D0B1F5007F04D9F9
+:10E26000611E814201DD0B20B4E7864201D90720FF
+:10E27000B0E7801B85B2A54200D92546BBF1000F4F
+:10E2800001D0ABF80050179818B1B9192A4600F020
+:10E29000CCF8B8F1000F0DD03E4448464446169FD6
+:10E2A00004F0A1FF2146FF1DBCB232462B4600946C
+:10E2B00004F0ADFB00208DE72DE9F04107461D4637
+:10E2C0001646084600F072F8040002D02078400795
+:10E2D00001D40120D3E4384604F006FE2178090673
+:10E2E00005D52E49897A814201D88720C7E4224684
+:10E2F0003146FFF75FFC65B12178E07801F003015A
+:10E3000040EA0120B0F5007F01D8012000E00020A4
+:10E3100028700020B3E42DE9F04107461D4616465B
+:10E32000084600F043F8040002D02078400701D4EA
+:10E330000120A4E4384604F0D7FD2178090605D56C
+:10E340001649897A814201D8872098E422463146CD
+:10E35000FFF75EFCFF2D14D02178E07801F0030276
+:10E3600040EA022040F20122B0FBF2F302FB13006C
+:10E3700015B900F2012080B2E070000A60F30101DB
+:10E38000217000207BE410B50C4600F00FF810B1AE
+:10E390000178490704D4012010BD000000060020C8
+:10E3A000C18821804079A0700020F5E70749CA881C
+:10E3B000824209D340B1096800EB40006FF00B02C4
+:10E3C00002EB8000084470470020704700060020E0
+:10E3D00070B504460D4621462B460AB9002070BD93
+:10E3E00001E0491C5B1C501E021E03D008781E78F9
+:10E3F000B042F6D008781E78801BF0E730B50C46A6
+:10E4000001462346051B954206D202E0521E9D5C42
+:10E410008D54002AFAD107E004E01D780D70491CE4
+:10E420005B1C521E002AF8D130BDF0B50E460146E5
+:10E43000334680EA030404F00304B4B906E002B9E9
+:10E44000F0BD13F8017B01F8017B521E01F00307B8
+:10E45000002FF4D10C461D4602E080CD80C4121F6F
+:10E46000042AFAD221462B4600BF04E013F8014BE0
+:10E4700001F8014B521E002AF8D100BFE0E7F0B5C9
+:10E480000C460146E6B204E002B9F0BD01F8016BAA
+:10E49000521E01F00307002FF6D10B46E5B245EA04
+:10E4A000052545EA054501E020C3121F042AFBD2D9
+:10E4B000194602E001F8016B521E002AFAD100BF92
+:10E4C000E3E7000010B508F0F6FDF4F7EDF908F009
+:10E4D0003DFCBDE8104008F005BD302834BF0120E8
+:10E4E00000207047202834BF4FF0A0420C4A01237F
+:10E4F00000F01F0003FA00F0002914BFC2F80C0559
+:10E50000C2F808057047202834BF4FF0A0410449E5
+:10E5100000F01F00012202FA00F0C1F81805704750
+:10E520000003005070B50346002002466FF02F052F
+:10E530000EE09C5CA4F130060A2E02D34FF0FF30AF
+:10E5400070BD00EB800005EB4000521C2044D2B2AD
+:10E550008A42EED370BD30B50A230BE0B0FBF3F472
+:10E5600003FB1404B0FBF3F08D183034521E05F891
+:10E57000014CD2B2002AF1D130BD30B500234FF6A4
+:10E58000FF7510E0040A44EA002084B2C85C6040D1
+:10E59000C0F30314604005EA00344440E0B25B1C61
+:10E5A00084EA40109BB29342ECD330BD2DE9F04198
+:10E5B000FE4B0026012793F864501C7893F868C03E
+:10E5C000B8B183F89140A3F8921083F8902083F8B3
+:10E5D0008E70BCF1000F0CBF83F8946083F89450E8
+:10E5E000F3488068008804F0ECFDBDE8F04104F0D9
+:10E5F00081BA4FF6FF7083F89140A3F8920083F838
+:10E60000902083F88E70BCF1000F14BF83F89450F3
+:10E6100083F89460BDE8F0812DE9F041E44D29686C
+:10E6200091F89C200024012A23D091F89620012AF9
+:10E6300030D091F86C301422DC4E0127012B32D0FF
+:10E6400091F88E30012B4FD091F8A620012A1CBFE3
+:10E650000020BDE8F08144701F2200F8042B222224
+:10E66000A731FFF7E2FE286880F8A6400120BDE848
+:10E67000F08144701B220270D1F89D204260D1F8D5
+:10E68000A120826091F8A520027381F89C400120AE
+:10E69000BDE8F081447007220270D1F898204260F2
+:10E6A00081F89640E2E78046447000F8042B20226F
+:10E6B0006E31FFF7BAFE88F80870286880F86C4061
+:10E6C00090F86E000028D1D1B6F87000A6F8980036
+:10E6D000A868417B86F89A1086F89670008804F046
+:10E6E00070FD04F016FAC1E791F86C30012B0BD0E5
+:10E6F000447017220270D1F890204260B1F8942043
+:10E70000028181F88E40B1E78046447000F8042B06
+:10E7100020226E31FFF789FE88F80870286880F89B
+:10E720006C4090F86E000028A0D1CDE7A0480068AA
+:10E7300090F86C10002914BFB0F870004FF6FF700D
+:10E74000704770B59A4C06462068002808BFFFDF66
+:10E750000025206845706660002808BFFFDF20683C
+:10E76000417800291CBFFFDF70BDCC220021FFF7DC
+:10E7700086FE2068FF2101707F2180F83810132168
+:10E780004184282180F86910012180F85C1080F80C
+:10E79000615009F0F7F9BDE8704008F004BB844906
+:10E7A0000968097881420CBF012000207047804829
+:10E7B000006890F82200C0F3400070477C48006871
+:10E7C00090F8220000F0010070477948006890F846
+:10E7D0002200C0F3001070472DE9F043744803682D
+:10E7E00093F82400B3F822C0C0F38001C0F34002C4
+:10E7F000114400F001000A18CCF30010002460B3AB
+:10E80000BCF1130F21D00BDCBCF1100F02BF694823
+:10E8100030F81200BDE8F083BCF1120F15D008E00B
+:10E82000BCF1150F09D0BCF11D0F04BF6248BDE853
+:10E83000F083FFDF2046BDE8F0836049002031F817
+:10E84000121012FB0010BDE8F0835D49002031F882
+:10E85000121012FB0010BDE8F08393F85E1093F8DD
+:10E860005F002E264FF47A774FF014084FF04009DE
+:10E87000022904BF4AF2D745B5FBF7F510D00129AC
+:10E8800004BF4AF22F75B5FBF7F510D04AF62315F1
+:10E89000B5FBF7F5082908BF4E4613D0042918D058
+:10E8A000264608290ED0042913D0022949D004F1A4
+:10E8B000280604290FD008291CBF4FF01908082189
+:10E8C00004D00AE04FF0140806F5A8764FF0400196
+:10E8D00003E006F5A8764FF0100118FB016111FB6B
+:10E8E0000251C2EB0212374D02EB820205EB8202AB
+:10E8F00011441CF0010F4FF4C8724FF4BF7504BFF0
+:10E90000CCF34006002E7DD0CCF3400601F5A57176
+:10E91000EEB1082804BF164640270CD0042804BFD7
+:10E920002E46102707D0022807BF04F11806042737
+:10E9300004F12806082707EB870808EB87173E44F1
+:10E940001BE004F118064FF019080421C5E7082858
+:10E9500004BF174640260CD0042804BF2F461026BB
+:10E9600007D0022807BF04F11807042604F128077E
+:10E97000082606EB861607EB8606314401F19C0655
+:10E9800093F8691000F00C07002F08BF00213144F4
+:10E9900018BF01F5416127D1082804BF164640275A
+:10E9A0001BD0042804BF2E4610270DE00C060020C3
+:10E9B00064000020E46202008F891300EC62020010
+:10E9C000DC620200D4FEFFFF07D0022807BF04F17B
+:10E9D0001806042704F128060827C7EBC70707EB2A
+:10E9E000470706EB4706314498311CF0010F19D058
+:10E9F000082808BF40200ED0042804BF2A46102053
+:10EA000009D000E04EE0022807BF04F118020420FC
+:10EA100004F12802082000EB400303EB001010442F
+:10EA200001443BE0082804BF944640260CD004284B
+:10EA300004BFAC46102607D0022807BF04F1180C0B
+:10EA4000042604F1280C082606EB8616B3F840309D
+:10EA50000CEB860C6144EB2B20D944F2552C0B3384
+:10EA600003FB0CF39B0D082807D0042802D00228D2
+:10EA700005D008E02A46102008E0402006E004F116
+:10EA80001802042002E004F12802082000EB8010A4
+:10EA900002EB800000F5A57003FB001101F5B370D7
+:10EAA000BDE8F08301F5A571082804BF944640260F
+:10EAB0000CD0042804BFAC46102607D0022807BF9C
+:10EAC00004F1180C042604F1280C082606EB86161F
+:10EAD000B3F848300CEB860C6144EB2BDED944F2E2
+:10EAE000552C0B3303FB0CF39B0D0828C5D00428D1
+:10EAF000C0D00228C7D1C2E7FE4840F271210068A9
+:10EB0000806A48437047FB48006890F83700002847
+:10EB100018BF0120704710B5F74C207B022818BFA2
+:10EB2000032808D1207D04F115010DF0A2FF08286B
+:10EB30001CBF012010BD207B002816BF022800202A
+:10EB40000120BDE8104009F037BDEB49087370475C
+:10EB5000E849096881F8300070472DE9F047E54C35
+:10EB60002168087B002816BF022800200120487376
+:10EB700001F10E0109F00AFD2168087B022816BF89
+:10EB800003280122002281F82F204FF0080081F88D
+:10EB90002D00487B01F10E034FF001064FF00007F6
+:10EBA000012804BF5B7913F0C00F0AD001F10E03F6
+:10EBB000012804D1587900F0C000402801D000207D
+:10EBC00000E0012081F82E00002A04BF91F8220005
+:10EBD00010F0040F07D0087D01F115010DF049FF79
+:10EBE000216881F82D002068476006F01FFB21682E
+:10EBF000C14D4FF00009886095F82D000DF055FFCC
+:10EC0000804695F82F00002818BFB8F1000F04D0F7
+:10EC100095F82D000DF00EFD68B195F83000002834
+:10EC20001CBF95F82E0000281DD0697B05F10E0051
+:10EC300001290ED012E06E734A4605F10E014046DE
+:10EC400009F0FAFC95F82D1005F10E000EF024F8ED
+:10EC500009E0407900F0C000402831D0394605F184
+:10EC60000E0009F021FD2068C77690F8220010F010
+:10EC7000040F08BFBDE8F087002795F82D000DF0C0
+:10EC80008FFD050008BFBDE8F08710210EF03BFDA9
+:10EC9000002818BFBDE8F08720683A4600F11C0143
+:10ECA000C676284609F0C8FC206800F11C0160689F
+:10ECB0000FF0E2F86068BDE8F04701210FF0F7B807
+:10ECC0000EF027F84A4605F10E0109F0B5FCCAE737
+:10ECD000884A1268137B0370D2F80E000860508ACD
+:10ECE0008880704778B584490446824E407B08731B
+:10ECF0003268207810706088ADF8000080B200F0B3
+:10ED00000101C0F3400341EA4301C0F3800341EA3B
+:10ED10008301C0F3C00341EAC301C0F3001341EA19
+:10ED20000311C0F3401341EA4311C0F3801041EADC
+:10ED300080105084E07D012808BF012507D00228FB
+:10ED400008BF022503D0032814BFFFDF0825306861
+:10ED500080F85E50607E012808BF012507D0022898
+:10ED600008BF022503D0032814BFFFDF0825316840
+:10ED700081F85F5091F83500012829D0207B81F877
+:10ED80002400488C1D280CBF002060688862607DCC
+:10ED900081F83700A07B002816BF02280020012040
+:10EDA0000875D4F80F00C1F81500B4F81300A1F8E5
+:10EDB0001900A07E91F86B2060F3071281F86B2098
+:10EDC000E07E012818BF002081F83400002078BDC3
+:10EDD00091F85E200420082A08BF81F85E00082D03
+:10EDE00008BF81F85F00C9E742480068408CC0F363
+:10EDF000001131B1C0F38000002804BF1F2070470C
+:10EE000002E0C0F3400109B10020704710F0010F8B
+:10EE100014BFEE20FF20704736480068408CC0F3D6
+:10EE2000001119B1C0F3800028B102E0C0F3400026
+:10EE300008B100207047012070472E490022096860
+:10EE40004A664B8C1D2B0CBF81F8682081F8680046
+:10EE500070470023274A126882F85D30D164A2F817
+:10EE60005000012082F85D007047224A002312689A
+:10EE700082F85C30A2F858000120516582F85C00ED
+:10EE800070471C49096881F83600704719490968BC
+:10EE900081F8610070471748006890F96100704779
+:10EEA0001448006890F82200C0F3401070471148E1
+:10EEB000006890F82200C0F3C0007047012070473E
+:10EEC0000C48006890F85F00704770B508F044FE89
+:10EED00008F023FE08F0EAFC08F098FD054C2068D5
+:10EEE000416E491C416690F83300002558B108F086
+:10EEF00049FE03E0640000200C06002007F053FFE9
+:10EF0000206880F833502068457090F8391021B19E
+:10EF1000BDE87040042009F0EEBF90F86810D9B148
+:10EF2000406E814218D8042009F0E5FF206890F86F
+:10EF3000220010F0010F07D0A06843220188BDE82D
+:10EF400070400120FFF732BBBDE8704043224FF60E
+:10EF5000FF710020FFF72ABBBDE87040002009F0D8
+:10EF6000CABF2DE9F04782B00F468146FE4E4FF0F2
+:10EF700000083068458C15F0030F10D015F0010F14
+:10EF800005F0020005D0002808BF4FF0010806D0A8
+:10EF900004E0002818BF4FF0020800D1FFDF4FF057
+:10EFA000000A544615F0010F05F002000DD080B99B
+:10EFB00015F0040F0DD04AF00800002F1CBF40F0E0
+:10EFC000010040F002044DD09EE010B115F0040F96
+:10EFD0000DD015F0070F10D015F0010F05F002004D
+:10EFE00043D0002808BF15F0040F34D04AE0002FAA
+:10EFF00018BF4AF0090444D141E037B14AF0080093
+:10F00000044615F0200F1BD07EE0316805F0200289
+:10F01000B1F84800104308BF4AF0010474D04AF028
+:10F020001800044615F0200F6ED191F85E1011F013
+:10F030000C0118BF0121C94361F30000044663E0DD
+:10F04000316891F85E1011F00C0118BF012161F3D5
+:10F050000000044658E04AF00800002F18BF40F0B6
+:10F06000010451D140F010044EE0002818BF15F003
+:10F07000040F07D0002F18BF4AF00B0444D14AF008
+:10F08000180441E015F0030F3DD115F0040F3AD0FC
+:10F0900077B130684AF0080490F85E0010F00C0177
+:10F0A00018BF012161F3410415F0200F24D02BE09B
+:10F0B000306805F02002B0F84810114308BF4AF04C
+:10F0C000030421D04AF0180415F0200F0AD000BF25
+:10F0D00090F85E0010F00C0018BF0120C04360F3F0
+:10F0E000410411E090F85E1011F00C0118BF0121ED
+:10F0F000C94361F30004EBE710F00C0018BF0120D6
+:10F1000060F3000400E0FFDF15F0400F1CD0CFB922
+:10F110003168B1F84800002804BF488C10F0010F96
+:10F120000BD110F0020F08BF10F0200F05D115F021
+:10F13000010F08BF15F0020F04D091F85E0010F027
+:10F140000C0F01D144F040047068A0F800A00178D1
+:10F1500021F0200101704FF007010EF059FE4146E9
+:10F1600070680FF04CF8214670680FF054F814F0F6
+:10F17000010F0CD04FF006034FF000027B4970687E
+:10F180000FF023F83068417B70680EF083FE14F0B6
+:10F19000020F18D0D6E90010B9F1000F4FF00603A6
+:10F1A0004FF0010207D01C310FF00FF801217068F9
+:10F1B0000EF07DFE07E015310FF007F83068017D95
+:10F1C00070680EF074FE14F0040F18BFFFDF14F027
+:10F1D000080F19D0CDF800A03068BDF80020022338
+:10F1E000B0F86A1061F30B02ADF8002090F86B00E4
+:10F1F000032201099DF8010061F307108DF8010059
+:10F20000694670680EF0E1FF012F62D13068B0F8F6
+:10F210004810E1B390F82200C0F34000B8BB70681A
+:10F220000EF0E9FF401CC7B23068C7F1FF05B0F827
+:10F230004820B0F85A10511AA942B8BF0D46AA4248
+:10F240003BD990F8220010F0010F36D144F01004A1
+:10F25000214670680EF0DFFFF81CC0B2ED1E284496
+:10F2600082B23068B0F86A10436EC1F30B0151FAF4
+:10F2700083F190F860303E4F1944BC460023E1FB17
+:10F2800007C31B096FF0240C03FB0C1100E020E006
+:10F2900080F8601090F85F00012101F01EF90090E5
+:10F2A000BDF800009DF80210032340EA01400190E0
+:10F2B000042201A970680EF088FF3068AAB2416C80
+:10F2C00070680EF0D6FF3068B0F85A102944A0F8E4
+:10F2D0005A1014F0400F06D0D6E900100123062280
+:10F2E00061310EF072FF14F0200F18BFFFDF002015
+:10F2F000002818BFFFDF02B0BDE8F0872DE9F0431A
+:10F30000194C89B02068002808BFFFDF20684178C9
+:10F31000002944D10178FF2941D0002680F83160CE
+:10F32000A0F85A60867080F83960304608F08EFB8D
+:10F33000104802AD00F1240191E80E1085E80E108E
+:10F34000D0E90D10CDE9061002A808F06DFB08F019
+:10F3500005F8206890F9610008F0D0F8064808F038
+:10F36000D3F806480CE00000640000201A060020D4
+:10F3700053E4B36ED0620200D8620200D56202008C
+:10F3800008F03EFB606808F064FB206890F82400F9
+:10F3900010F0010F07D0252008F0BEF80AE009B0F0
+:10F3A0000C20BDE8F08310F0020F18BF262069D0B2
+:10F3B00008F0B2F8206890F85E10252007F08CFF66
+:10F3C000206880F82C6008F03BFB206890F85E1005
+:10F3D000002008F068F90F21052008F03AF82068AD
+:10F3E00090F82E10002901BF90F82F10002990F8F6
+:10F3F000220010F0040F74D005F018FF05462068B5
+:10F400002946806806F001FCDFF82884074690FB57
+:10F41000F8F008FB10704142284605F0EEFB216829
+:10F42000886097FBF8F04A68104448600DF01EFBB6
+:10F4300001462068426891426ED8C0E90165FE4DE0
+:10F440004FF0010895F82D000DF02FFB814695F83F
+:10F450002F000127002818BFB9F1000F04D095F83C
+:10F460002D000DF0E7F8A0B195F8300000281CBF82
+:10F4700095F82E00002824D0687B05F10E010128A4
+:10F4800015D019E010F0040F14BF2720FFDF8FD133
+:10F4900090E73A466F7305F10E01484609F0CCF843
+:10F4A00095F82D1005F10E000DF0F6FB09E04879F6
+:10F4B00000F0C000402815D0414605F10E0009F0CB
+:10F4C000F3F8206890F8220010F0040F24D095F88B
+:10F4D0002D000DF065F905001ED010210EF013F976
+:10F4E00040B119E00DF015FC3A4605F10E0109F0A6
+:10F4F000A3F8E6E720683A4600F11C01C7762846E3
+:10F5000009F09AF8206800F11C0160680EF0B4FC64
+:10F51000012160680EF0CBFC2068417B0E3007F0C3
+:10F520007AFF206890F85C1061B3B0F85810A0F82A
+:10F530004810416D416490F82210C1F30011F1B9F7
+:10F54000B0F86A000221C0F30B05ADF80050684620
+:10F5500006F0FCFF28B1BDF80000C0F30B00A84284
+:10F5600004D1BDF80000401CADF800002168BDF8D2
+:10F570000000B1F86A2060F30B02A1F86A2020684D
+:10F5800080F85C60206890F85D1039B1B0F85010D8
+:10F59000A0F84010C16CC16380F85D60B0F86A10DB
+:10F5A000426EC1F30B0151FA82F190F86020DFF84E
+:10F5B0008CC2114463460022E1FB0C3212096FF049
+:10F5C000240302FB031180F860100DF0D2FA03212E
+:10F5D00060680DF051FB216881F8330009B000200C
+:10F5E000BDE8F0839649886070472DE9F043944C5C
+:10F5F00083B0226892F831303BB1508C1D2808BF8F
+:10F60000FFDF03B0BDE8F0435FE401260027F1B15E
+:10F61000054692F8600007F07FFF206890F85F10C1
+:10F62000FF2007F059FE20684FF4A57190F85F2085
+:10F63000002008F0FEF8206890F8221011F0030F67
+:10F6400000F02C81002D00F0238100F027B992F802
+:10F6500022108046D07EC1F30011002956D0054605
+:10F6600060680780017821F020010170518C132916
+:10F6700037D01FDC102908BF022144D0122908BF4F
+:10F68000062140D0FFDF6C4D606805F10E010EF0E1
+:10F69000E5FB697B60680EF0FDFB2068418C1D294D
+:10F6A00018BF152963D0B0F84820416C60680EF08F
+:10F6B0000AFC5CE0152918BF1D29E3D14FF00101B8
+:10F6C0000EF0A6FB6068017841F02001017021680E
+:10F6D00085B11C310EF0D0FB012160680EF0E7FB14
+:10F6E000D1E700210EF094FB6068017841F0200121
+:10F6F0000170C8E715310EF0BFFB2068017D60681E
+:10F700000EF0D5FBBFE70EF083FBBCE70021FFF74F
+:10F7100028FC6068C17811F03F0F28D0017911F002
+:10F72000100F24D00EF072FB2368024693F82410C9
+:10F73000C1F38000C1F3400C604401F001010844B2
+:10F7400093F82C10C1F3800CC1F34005AC4401F0D8
+:10F7500001016144401AC1B293F85E0000F0BDFEA1
+:10F76000009003230422694660680EF02EFD206895
+:10F77000002590F8241090F82C0021EA000212F0E5
+:10F78000010F18BF01250ED111F0020F04D010F0A7
+:10F79000020F08BF022506D011F0040F03D010F0AD
+:10F7A000040F08BF0425B8F1000F2BD0012D1BD08A
+:10F7B000022D08BF26201BD0042D14BFFFDF2720F9
+:10F7C00016D0206890F85E10252007F085FD20688F
+:10F7D00090F82210C1F3001169B101224FF4967123
+:10F7E000002008F026F80DE0252007F095FEE8E758
+:10F7F00007F092FEE5E790F85E204FF49671002046
+:10F8000008F017F8206890F82C10294380F82C1085
+:10F8100090F8242032EA01011CD04670418C132953
+:10F820002BD026DC102904BF03B0BDE8F0831229D9
+:10F8300023D007E040420F000C06002053E4B36ED3
+:10F8400064000020C1F30010002818BFFFDF03B0E0
+:10F85000BDE8F083418C1D2908BF80F82C70DCD0F6
+:10F86000C1F30011002914BF80F8316080F83170B5
+:10F87000D3E7152918BF1D29DBD190F85E2003B00E
+:10F880004FF00101BDE8F043084608F0C0B900BFE1
+:10F8900090F85F200121084608F0B9F92168002D91
+:10F8A000C87E7CD04A8C3D46C2F34000002808BF89
+:10F8B00047F0080512F0400F18BF45F0400500283A
+:10F8C00019BFD1F83C90B1F84080D1F84490B1F81C
+:10F8D00048806068072107800EF09AFA002160686E
+:10F8E0000EF08DFC294660680EF095FC15F0080FAF
+:10F8F00017D02068BDF800100223B0F86A2062F328
+:10F900000B01ADF8001090F86B00032201099DF87F
+:10F91000010061F307108DF80100694660680EF080
+:10F9200054FC60680EF030FB2168C0F1FE00B1F8B5
+:10F930005A20A8EB02018142A8BF0146CFB2D019DC
+:10F94000404544D245F0100160680EF064FC6068E8
+:10F950000EF01AFB2168C0F1FE00B1F85A10A8EBB6
+:10F9600001018142A8BF0146CFB260680EF043FC9E
+:10F970003844421C2068B0F86A10436EC1F30B0192
+:10F9800051FA83F190F86030FE4D1944AC460023E3
+:10F99000E1FB05C34FEA131C6FF0240300E03CE0D9
+:10F9A0000CFB031180F8601090F85F00012100F05B
+:10F9B00094FD0090BDF800009DF80210032340EA7A
+:10F9C00001400190042201A960680EF0FEFB21684D
+:10F9D00091F8220010F0400F05D00123062261317A
+:10F9E00060680EF0F2FB20683A46B0F85A0000EB6F
+:10F9F000090160680EF03DFC2068B0F85A103944E7
+:10FA0000A0F85A1008F0D5FC002818BFFFDF2068C6
+:10FA10004670867003B0BDE8F0830121FFF7A1FABC
+:10FA2000F0E7D94810B50068417841B90078FF285F
+:10FA300005D000210846FFF7D8FD002010BD08F0D2
+:10FA40008BF808F06AF807F031FF07F0DFFF0C20B1
+:10FA500010BD2DE9F041CC4D0446174628680E46EE
+:10FA600090F86C00002818BFFFDF2868002F80F88E
+:10FA70006E7018BFBDE8F0812188A0F87010618811
+:10FA8000A0F88610A188A0F88810E188A0F88A1054
+:10FA900094F88C1180F88C1090F82F10002749B141
+:10FAA000427B00F10E01012A04D1497901F0C00125
+:10FAB000402935D090F8301041B1427B00F10E0161
+:10FAC000012A04BF497911F0C00F29D000F17A0052
+:10FAD00016F0E0FA6868FF2E0178C1F380116176B4
+:10FAE000D0F80310C4F81A10B0F80700E0832868B3
+:10FAF0001ED0C0F88010E18BA0F8841000F17402D1
+:10FB0000511E30460CF0DAFF002808BFFFDF2868DE
+:10FB100090F8731041F0020180F87310BDE8F08195
+:10FB2000D0F80E10C0F87A10418AA0F87E10D1E704
+:10FB3000C0F88070A0F88470617E80F87310D4F8EB
+:10FB40001A104167E18BA0F87810BDE8F08170B51C
+:10FB50008D4C0125206890F82200C0F3C00038B118
+:10FB60003C22FF21A068FFF774FF206880F86C50EA
+:10FB7000206890F8220010F0010F1CBFA0680188D7
+:10FB80004FF03C0212BF01204FF6FF710020FEF73C
+:10FB90000DFD206880F8395070BD7B49096881F8F7
+:10FBA000320070472DE9F041002509F070F9002876
+:10FBB00000F00A81744C2068417801270026012951
+:10FBC00006D0022901D003297ED0FFDFBDE8F081F5
+:10FBD000817802260029418C46D0C1F34002002AD8
+:10FBE00008BF11F0010F70D090F85F204FF00101B5
+:10FBF0004FF0000008F00BF8216891F82200C0F3E4
+:10FC00004000002814BF0C20222091F85F1007F05C
+:10FC100063FB2068467090F8330058B107F0AFF8E6
+:10FC2000206890F85F0010F00C0F0CBF40204520BA
+:10FC300007F09EFF206890F83400002818BF07F0F6
+:10FC4000B6FF216891F85F0091F8691010F00C0F71
+:10FC500008BF0021962007F01DFF08F0A1FB002837
+:10FC600018BFFFDFBDE8F081C1F3001282B1102997
+:10FC70003FD090F8330020B107F081F8402007F022
+:10FC800077FF206890F8221011F0040F36D043E07F
+:10FC900090F8242090F82C309A422AD1B0F84800ED
+:10FCA000002808BF11F0010F05D111F0020F08BFA5
+:10FCB00011F0200F65D04FF001014FF00000FFF769
+:10FCC00094FC2068418C01E040E034E011F0010F29
+:10FCD00004BFC1F34001002907D1B0F85A10B0F8B1
+:10FCE0004820914218BFBDE8F08180F83170BDE82E
+:10FCF000F081BDE8F0410021012076E490F8371052
+:10FD0000012914BF0329102545F00E0190F85E204B
+:10FD10004FF0000007F07BFF206890F834000028C7
+:10FD200018BF07F044FF0021962007F0B3FE2068BB
+:10FD30004670BDE8F081B0F85A10B0F84800814232
+:10FD400042D0BDE8F041012108464EE4817809B374
+:10FD5000418C11F0010F22D080F86C7090F86E2069
+:10FD6000B0F870100120FEF721FC2068467007F003
+:10FD7000F3FE07F0D2FE07F099FD07F047FE0320DF
+:10FD800004E021E053E4B36E64000020BDE8F041DC
+:10FD900009F0B1B88178BDE8F041012025E411F007
+:10FDA000020F04BFFFDFBDE8F081B0F85A10B0F8D1
+:10FDB0004000814208D001210846FFF716FC216867
+:10FDC00003204870BDE8F081BDE8F041FFF77DB841
+:10FDD000FFF77BB810B5FE4C206890F8341049B19D
+:10FDE000383007F0F3FE18B921687F2081F8380019
+:10FDF00007F0D3FE206890F8330018B107F0C2FE78
+:10FE000006F0D1FF09F043F8A8B1206890F822105D
+:10FE1000C1F3001179B14078022818BFFFDF00213B
+:10FE20000120FFF7E2FB2068417800291EBF4078DF
+:10FE30000128FFDF10BDBDE81040FFF746B82DE9EF
+:10FE4000F047E34C0F4680462168B8F1030F488C19
+:10FE500008BFC0F3400508D000F0010591F832005A
+:10FE6000002818BF4FF0010901D14FF0000907F039
+:10FE700047FB0646B8F1030F0CBF4FF002084FF0E6
+:10FE8000010835EA090008BFBDE8F087206890F84E
+:10FE9000330068B10CF050FE38700146FF2807D0DF
+:10FEA0006068C01C0CF021FE38780CF052FE06434E
+:10FEB00060680178C1F3801221680B7D9A4208D1F5
+:10FEC0000622C01C1531FEF783FA002808BF012066
+:10FED00000D000203978FF2906D0C8B9206890F8F2
+:10FEE0002D00884216D113E0A0B1616811F8030B10
+:10FEF000C0F380100CF0BDFD05460CF01DFF38B1BD
+:10FF000028460CF04DFC18B110210DF0FCFB08B197
+:10FF1000012000E00020216891F8221011F0040F68
+:10FF200001D0F0B11AE0CEB9AA4890F83700002805
+:10FF300018BF404515D1616811F8030BC0F380105C
+:10FF40000CF097FD04460CF0F7FE38B120460CF09B
+:10FF500027FC18B110210DF0D6FB10B10120BDE82F
+:10FF6000F0870020BDE8F0872DE9F04F984D04465A
+:10FF700083B0286800264078022818BFFFDF286871
+:10FF80004FF07F0B90F8341049B1383007F01EFE67
+:10FF9000002804BF286880F838B007F0FEFD6868C4
+:10FFA0000DF058FF8046002C00F0458207F04DFA16
+:10FFB000002800F04082012400274FF0FF09B8F12B
+:10FFC000050F1ED1686890F8240000F01F0010286B
+:10FFD00017D9286890F8360098B18DF800906946D6
+:10FFE0000520FFF72CFF002800F02582286880F804
+:10FFF000A64069682222A730C91CFEF716FA00F055
+:020000040001F9
+:100000001ABA68680EF0B1F8002800F01482404671
+:10001000DFF8C0814FF0030A062880F01E82DFE877
+:1000200000F0FCFCFC03FCFB8DF80090694603200B
+:10003000FFF705FF002800F0F180296891F83400EF
+:1000400010B191F89C00D8B12868817801294DD071
+:100050006868042107800DF0DBFE08F10E01686876
+:100060000DF0FCFE98F80D1068680DF013FF28687D
+:10007000B0F84020C16B68680DF049FF00F063B92B
+:100080009DF8000081F89C400A7881F89D20FF28A7
+:100090000FD001F19F029E310CF010FD002808BF27
+:1000A000FFDF286890F89E1041F0020180F89E1052
+:1000B0000DE068680278C2F3801281F89E20D0F8C3
+:1000C0000320C1F89F20B0F80700A1F8A30028681A
+:1000D00000F1A50490F838007F2808BFFFDF2868EA
+:1000E00090F83810217080F838B0ADE790F8220011
+:1000F0000721C0F3801938480479686869F38614C9
+:1001000007800DF085FE002168680EF078F8214622
+:1001100068680EF080F80623002208F10E01686876
+:100120000EF053F82868417B68680DF0B3FE6868EC
+:100130000DF02AFF2968B1F84020C0F1FE018A4283
+:10014000B8BF1146CFB2BA423CD9F81EC7B244F08C
+:10015000100B594668680EF05EF868680EF04BF8B0
+:10016000384400F101082868B0F86A10426EC1F303
+:100170000B0151FA82F190F86020184C0A44A44611
+:100180000023E2FB04C319096FF0240301FB0321E0
+:1001900080F8601090F85F004246012100F09DF960
+:1001A0000190BDF804009DF80610032340EA0140C9
+:1001B0000290042202A968680EF007F859466868A0
+:1001C0000EF029F8B9F1000F0FD0D5E9001007E0C3
+:1001D000640000200C060020D062020053E4B36EDD
+:1001E0000123062261310DF0F0FF28683A46C16B09
+:1001F00068680EF03EF82868A0F85A70B0F8401011
+:100200008F420CBF0121002180F8311008F0D1F895
+:10021000002818BFFFDF96E007E01EE1286880781D
+:10022000002840F00A8100F006B98DF80090686857
+:100230000178C1F38019D0F803100191B0F80700DC
+:10024000ADF8080069460520FFF7F9FD0028286889
+:100250007DD0817800297CD090F85FB0D5E9010489
+:10026000D0F80F10C4F80E10B0F813106182417D61
+:100270002175817D6175B0F81710E182B0F8191011
+:100280006180B0F81B10A180B0F81D10E18000F172
+:100290001F0104F1080015F006FF686890F82410AB
+:1002A00001F01F01217690F82400400984F88C01A8
+:1002B00084F864B084F865B01BF00C0F0CBF00210B
+:1002C000012104F130000EF004FA2868002290F8B1
+:1002D000691084F8661090F8610084F867009DF852
+:1002E0000010A868FFF7B5FB022008F004FEB04834
+:1002F0000DF1040B08210468686807800DF088FD83
+:10030000002168680DF07BFF214668680DF083FFCF
+:100310000623002208F10E0168680DF056FF2868D8
+:10032000417B68680DF0B6FD494668680DF0BFFD79
+:1003300006230122594668680DF047FF08F039F896
+:10034000002818BFFFDF286880F801A077E06DE083
+:10035000FFE76868D5F808804FF00109027898F83F
+:100360000D10C2F34012114088F80D10D0F80F1094
+:10037000C8F80E10B0F81310A8F81210417D88F8D4
+:100380001410817D88F81510B0F81710A8F8161011
+:10039000B0F81910A8F80210B0F81B10A8F8041053
+:1003A000B0F81D10A8F8061000F11F0108F10800B0
+:1003B00015F079FE686890F8241001F01F0188F8A4
+:1003C000181090F824000021400988F88C0188F862
+:1003D000649088F8659008F130000EF07AF928688A
+:1003E000002290F8691088F8661090F8610088F88B
+:1003F00067009DF80010A868FFF72BFB286880F8BD
+:100400006C4090F86E20B0F870100120FEF7CEF826
+:100410002868477007F0A0FB07F07FFB07F046FA5B
+:1004200007F0F4FA012008F066FD08E090F82200D9
+:10043000C0F3001008B1012601E0FEF746FD286870
+:1004400090F8330018B107F09DFB06F0ACFC66B1E4
+:1004500000210120FFF7C9F810E0286890F8220079
+:10046000C0F300100028E8D0E5E72868817801296A
+:1004700004D190F85F10FF2006F02EFF2868417825
+:10048000002919BF4178012903B0BDE8F08F4078F9
+:10049000032818BFFFDF03B0BDE8F08F70B5454CEF
+:1004A00006460D462068807858B106F03CFE21686B
+:1004B0000346304691F85F202946BDE8704009F0B8
+:1004C000D1BA06F030FE21680346304691F85E202E
+:1004D0002946BDE8704009F0C5BA78B50C46002140
+:1004E0000091082804BF4FF4C87040210DD00428A3
+:1004F00004BF4FF4BF70102107D0022807BF01F1DD
+:100500001800042101F128000821521D02FB0106F8
+:1005100028489DF80010006890F8602062F30501FB
+:1005200041F040058DF8005090F85F0001282AD076
+:1005300002282FD004281CBF0828FFDF30D000BFBE
+:1005400025F080008DF80000C4EB041000EB800063
+:100550004FF01E0101EB800006FB040416488442A4
+:1005600028BFFFDF1548A0FB0410BDF801100009EB
+:1005700060F30C01ADF80110BDF800009DF8021009
+:1005800040EA014078BD9DF8020020F0E0008DF8BF
+:100590000200D5E79DF8020020F0E000203004E0E2
+:1005A0009DF8020020F0E00040308DF80200C7E71F
+:1005B000D062020064000020C4BF030089888888DC
+:1005C0000178406829B190F82C1190F88C0038B966
+:1005D00001E001F0ADBD19B1042901D0012070473F
+:1005E0000020704770B50C460546062102F0B6FCA7
+:1005F000606008B1002006E00721284602F0AEFC4A
+:10060000606018B101202070002070BD022070BD14
+:100610002DE9FC470C4606466946FFF7E3FF002834
+:100620007DD19DF8000050B1FEF780F8B0427CD03B
+:10063000214630460AF0C8FB002873D12DE00EF0A9
+:1006400091F9B04271D02146304613F0B0FA00283B
+:1006500068D1019D95F8F00022E0012000E0002023
+:10066000804695F839004FF0010A4FF00009F0B1CB
+:1006700095F83A0080071AD584F8019084F800A014
+:1006800084F80490E68095F83B102172A98F61816F
+:10069000E98FA18185F8399044E0019D95F82C01FE
+:1006A00070350028DBD1287F0028D8D0D5E7304628
+:1006B00002F099FD070000D1FFDF384601F0A7FFE7
+:1006C00040B184F801900F212170E680208184F8E8
+:1006D00004A027E0304602F074FD070000D1FFDFE0
+:1006E000B8F1000F21D0384601F0E9FFB8B19DF80C
+:1006F000000038B90198D0F818014188B14201D101
+:1007000080F80090304607F0BFFE84F801900C217D
+:10071000217084F80490E680697F217200E004E093
+:1007200085F81C900120BDE8FC870020FBE71CB584
+:100730006946FFF757FF00B1FFDF684601F004FD8F
+:10074000FE4900208968A1F8F2001CBD2DE9FC419A
+:1007500004460E46062002F0A9FB0546072002F0DB
+:10076000A5FB2844C7B20025A8463E4417E02088D0
+:10077000401C80B22080B04202D34046A4F80080E2
+:1007800080B2B84204D3B04202D20020BDE8FC815E
+:100790006946FFF727FF0028F8D06D1CEDB2AE4286
+:1007A000E5D84FF6FF7020801220EFE738B54FF6FE
+:1007B000FF70ADF800000DE00621BDF8000002F06A
+:1007C000DFFB04460721BDF8000002F0D9FB0CB1A5
+:1007D00000B1FFDF00216846FFF7B8FF0028EBD02B
+:1007E00038BD70B507F0BEFE0BF02DFFD44C4FF6B0
+:1007F000FF76002526836683D2A0257001680079E4
+:10080000A4F14002657042F8421FA11C1071601CE7
+:1008100013F0E9FA1B2020814FF4A4716181A081BB
+:10082000E181072121776177032121740422627419
+:100830006082A082A4F13E00E18205704680BF483C
+:100840000C300570A4F110000570468084F820502B
+:1008500070BD70B5B94C16460D466060217007F04A
+:10086000F9FDFFF7A3FFFFF7BCFF207810F0B5FFFD
+:10087000B6480EF0CAF92178606813F059FA20786A
+:100880000BF00AF9284608F0B9FEB048FDF759FF09
+:10089000217860680AF072FB3146207813F01EFD63
+:1008A000BDE870400BF0CFBE10B501240AB10020A6
+:1008B00010BD21B1012903D00024204610BD022122
+:1008C0000DF014FDF9E710B503780446002B4068DD
+:1008D00013460A46014609D05FF001000DF0B3F857
+:1008E0006168496A884203D9012010BD0020F5E7FC
+:1008F000002010BD2DE9F04117468A781E4680463B
+:1009000042B11546C87838B10446690706D52AB100
+:10091000012104E00725F5E70724F6E70021620737
+:1009200002D508B1012000E00020014206D00122DA
+:1009300011464046FFF7C7FF98B93DE051B100228C
+:1009400001214046FFF7BFFF58B9600734D50122A7
+:10095000114620E060B1012200214046FFF7B3FFBD
+:1009600010B10920BDE8F081680725D5012206E015
+:1009700068074FEA44700AD5002814DB00220121E1
+:100980004046FFF7A0FFB8B125F0040514E00028A9
+:1009900012DA012200214046FFF795FF60B100BF47
+:1009A00024F0040408E0012211464046FFF78BFFC3
+:1009B00010B125F00405F3E73D7034700020D1E755
+:1009C00070B58AB0044600886946FFF70BFE002820
+:1009D00006D1A08830B1012804D0022802D012200C
+:1009E0000AB070BD04AB03AA21466846FFF782FF38
+:1009F0000500F5D19DF8001001200026002901997D
+:100A000006D081F8C501019991F81012B1BB2DE013
+:100A100081F82F01019991F8561139B9019991F88E
+:100A20002E1119B9019991F8971009B13A2519E0D9
+:100A30000199059681F82E01019A9DF80C0082F823
+:100A40003001019B9DF8102083F83121A388019C7F
+:100A5000A4F832318DF814008DF8152005AA002075
+:100A60000DF033F8019880F82F6126E0019991F894
+:100A7000C41119B9019991F8971009B13A2519E0F3
+:100A80000199059681F8C40101989DF80C2080F821
+:100A9000C621019B9DF8100083F8C701A388019C23
+:100AA000A4F8C8318DF814208DF8150005AA01208E
+:100AB0000DF00BF8019880F8C561284690E710B555
+:100AC00004460020A17801B90120E2780AB940F07B
+:100AD000020001F048FB002803D12046BDE8104089
+:100AE0006EE710BD70B5044691F8650091F8663068
+:100AF0000D4610F00C0F00D100232189A0880CF0C6
+:100B000099FF696A814229D2401A401CA188400895
+:100B1000091A8AB2A2802189081A2081668895F86C
+:100B2000641010460CF064FF864200D230466080AC
+:100B3000E68895F8651020890AE000007000002022
+:100B400018080020FFFFFFFF1F000000D80600204C
+:100B50000CF04EFF864200D23046E08070BDF0B50A
+:100B600085B00D46064603A9FFF73CFD00282DD1B0
+:100B70009DF80C0060B300220499FB20B1F84E30C0
+:100B8000FB2B00D30346B1F85040FB20FB2C00D3D5
+:100B90000446DFF85CC59CE8811000900197CDF811
+:100BA00008C0ADF80230ADF806406846FFF79AFF7E
+:100BB0006E80BDF80400E880BDF808006881BDF8CB
+:100BC0000200A880BDF806002881002005B0F0BD15
+:100BD0000122D1E72DE9F04186B00446008869463C
+:100BE000FFF700FD002876D12189E08801F0D4FAD2
+:100BF000002870D1A188608801F0CEFA00286AD15F
+:100C00002189E08801F0BFFA002864D1A1886088BA
+:100C100001F0B9FA07005ED1208802A9FFF79FFF13
+:100C200000B1FFDFBDF8101062880920914252D355
+:100C3000BDF80C10E28891424DD3BDF81210BDF8FA
+:100C40000E2023891144A2881A44914243D39DF86F
+:100C50000010019D4FF00008012640F6480041B108
+:100C600085F8BB61019991F8FC1105F5DD7541B975
+:100C70001AE085F82561019991F84A1105F59275F8
+:100C800009B13A2724E0E18869806188E9802189F7
+:100C9000814200D30146A980A188814200D2084642
+:100CA0002881012201990FE0E18869806188E9804B
+:100CB0002189814200D30146A980A188814200D2C6
+:100CC00008462881019900222846FFF70BFF2E7065
+:100CD00085F80180384606B044E67BE770B50446E7
+:100CE0000DF0F6FDB0B12078182811D12079012837
+:100CF0000ED1E088062102F031F9040008D02088E6
+:100D000007F0C2FB2088062102F03AF900B1FFDFAC
+:100D1000012070BDF74D28780028FAD000266670B3
+:100D20001420207020223146201DFDF7A8FB022050
+:100D300020712E70ECE710B50446FDF76DFC00281D
+:100D400013D0207817280FD1207968B1E0880721C7
+:100D500002F004F940B1008807F096FBE088072113
+:100D600002F00EF900B1FFDF012010BD2DE9F047C0
+:100D70005FEA000800D1FFDFDE4802211A30814619
+:100D8000FFF7E4FC00B1FFDFDA4C0620678B02F0CE
+:100D90008DF80546072002F089F82844C5B2681C82
+:100DA000C6B2608BB04203D14046FFF7C4FF58B9CA
+:100DB000608BA84203D14046FFF790FF20B9608BBB
+:100DC0004146FFF725FC38B1404601F0F3F9002811
+:100DD000E7D10120BDE8F08702214846FFF7B6FCC5
+:100DE00010B9608BB842DCD14046BDE8F04713F043
+:100DF000BABA10B501F043F908B10C2010BD0BF0E0
+:100E000076FC002010BD10B50446007818B101280A
+:100E100001D0122010BD01F043F920B10BF018FEF3
+:100E200008B10C2010BD207801F003F9E21D04F197
+:100E30001703611CBDE810400BF0FFBC10B5044661
+:100E400001F01DF908B10C2010BD207828B101284F
+:100E500003D0FF280BD0122010BD01F0EAF8611C6E
+:100E60000BF005FC08B1002010BD072010BD0120CB
+:100E70000BF037FCF7E710B50BF0EDFD08B10020E3
+:100E800010BD302010BD10B5044601F009F908B1BD
+:100E90000C2010BD20460BF0D8FD002010BD10B571
+:100EA00001F0FEF820B10BF0D3FD08B10C2010BD0D
+:100EB0000BF028FD002010BDFF2181704FF6FF715F
+:100EC00081808D4949680A7882718A8802814988BF
+:100ED000418101214170002070477CB50025022A24
+:100EE00019D015DC12F10C0F15D009DC12F1280F06
+:100EF00011D012F1140F0ED012F1100F11D10AE01F
+:100F000012F1080F07D012F1040F04D04AB902E021
+:100F1000D31E052B05D8012806D0022808D00328A7
+:100F20000AD0122528467CBD1046FDF7AFFFF9E731
+:100F300010460DF065FEF5E7084614466946FFF7D2
+:100F400051FB08B10225EDE79DF80000019800254E
+:100F500080F86740E6E710B5134601220CF010FC5C
+:100F6000002010BD10B5044611F029FA052804D060
+:100F7000204610F021FC002010BD0C2010BD10B543
+:100F8000044601F08DF808B10C2010BD2146002068
+:100F900007F0E9FA002010BD10B5044610F09BFCE4
+:100FA00050B108F08DFD38B1207808F033FB20787F
+:100FB0000EF047F9002010BD0C2010BD10B50446FE
+:100FC00001F06EF808B10C2010BD2146012007F099
+:100FD000CAFA002010BD38B504464FF6FF70ADF8D0
+:100FE0000000A079E179884216D02079FDF775FAE2
+:100FF00090B16079FDF771FA70B10022A0791146C5
+:1010000013F098FD40B90022E079114613F092FDEB
+:1010100010B9207A072801D9122038BD08F05DFDEB
+:1010200060B911F0CCF948B900216846FFF78EFB92
+:1010300020B1204606F029F9002038BD0C2038BD2B
+:101040002DE9FC41817805461A2925D00EDC1629A8
+:101050002ED2DFE801F02D2D2D2D2D212D2D2D2D22
+:101060002D2D2D2D2D2D2D2D2D2121212A291FD046
+:101070000BDCA1F11E010C291AD2DFE801F01919CD
+:101080001919191919191919190D3A3904290FD2F1
+:10109000DFE801F00E020E022888B0F5706F07D26B
+:1010A00001276946FFF79EFA20B10220BDE8FC81C6
+:1010B0001220FBE79DF8000000F0C2FF019C10B178
+:1010C00004F58A7401E004F5C8749DF8000000F08E
+:1010D000B7FF019E10B106F2151601E006F2911657
+:1010E0006846FFF76DFA08B1207838B10C20DDE7CB
+:1010F0000C63020018080020700000202770A878F8
+:101100003070684601F020F80020CFE77CB50D462E
+:101110006946FFF767FA002618B12E602E7102208B
+:101120007CBD9DF8000000F08BFF019C9DF8000045
+:10113000703400F085FF019884F84260816829606E
+:10114000017B297194F842100029F5D100207CBD63
+:1011500010B5044600F0A4FF20B10BF079FC08B1F3
+:101160000C2010BD207800F064FFE279611C0BF0C8
+:10117000F0FD08B1002010BD022010BD10B5886E32
+:1011800060B1002241F8682F0120CA718979884036
+:1011900013F0C4FC002800D01F2010BD0C2010BD8F
+:1011A0001CB50C466946FFF71DFA002809D19DF8C9
+:1011B000000000280198B0F8700000D0401C20808A
+:1011C00000201CBD1CB5044600886946FFF70AFADA
+:1011D00008B102201CBD606828B1DDE9000122468B
+:1011E00001F03CF81CBDDDE90001FFF7C7FF1CBDA5
+:1011F00070B51C460D4618B1012801D0122070BDF3
+:101200001946104601F068F830B12146284601F031
+:101210006DF808B1002070BD302070BD70B5044677
+:1012200000780E46012804D018B1022801D0032806
+:1012300040D1607828B1012803D0022801D00328CA
+:1012400038D1E07B10B9A078012833D1A07830F0F4
+:1012500005012FD110F0050F2CD06289E188E078CC
+:101260003346FFF7C5FF002825D1A07805281DD1FA
+:101270006589A289218920793346FFF7B9FF0028C3
+:1012800019D1012004EB40014A8915442218D37872
+:10129000927893420ED1CA8889888A420AD1401C2A
+:1012A000C0B20228EED3E088A84203D3A07B08B1E5
+:1012B000072801D9122070BD002070BD10B586B07E
+:1012C000044600F0D1FE10B10C2006B010BD022182
+:1012D00004F10A0001F020F8A0788DF80800A07849
+:1012E0008DF8000060788DF8040020788DF80300F8
+:1012F000A07B8DF80500E07B00B101208DF8060091
+:10130000A078C10717D0E07800F0FAFF8DF801004F
+:10131000E088ADF80A006089ADF80C00A0784007BD
+:1013200016D5207900F0ECFF8DF802002089ADF889
+:101330000E00A0890AE040070AD5E07800F0E0FF3F
+:101340008DF80200E088ADF80E006089ADF810005D
+:1013500002A810F0CCFA0028B7D168460DF076FF4D
+:10136000B3E710B504460121FFF758FF002803D169
+:101370002046BDE81040A1E710BD0278012A01D047
+:10138000BAB118E042783AB1012A05D0022A12D146
+:1013900089B1818879B100E059B1418849B180882B
+:1013A00038B101EB8101490000EB8000B1EB002F67
+:1013B00001D2002070471220704770B504460078B3
+:1013C0000D46012809D010F0FAFF052803D010F0CF
+:1013D0009EF9002800D00C2070BD0DF004FE88B1ED
+:1013E0000DF016FE0DF012FF0028F5D125B1607842
+:1013F0000DF0A6FE0028EFD1A1886088BDE87040FE
+:1014000010F09BBA122070BD10B504460121FFF701
+:10141000B4FF002804D12046BDE810400121CCE7EC
+:1014200010BDF0B5871FDDE9056540F67B44A74296
+:1014300013D28F1FA74210D288420ED8B2F5FA7F7E
+:101440000BD2A3F10A00241FA04206D2521C4A4329
+:10145000B2EB830F01DAAE4201D90020F0BD0120CA
+:10146000F0BD2DE9FC47477A8946044617F0050F81
+:101470007ED0F8087CD194F83A0008B9012F77D1D2
+:101480000025A8462E46F90789F0010A19D0208ABE
+:10149000514600F021FFE8B36089514600F026FF75
+:1014A000C0B3208A6189884262D8A18EE08DCDE9DF
+:1014B0000001238D628CA18BE08AFFF7B2FF48B355
+:1014C0000125B8070ED504EB4500828EC18DCDE90C
+:1014D0000012038D428C818BC08AFFF7A2FFC8B136
+:1014E000A8466D1C78071ED504EB45065146308A88
+:1014F00000F0F2FE70B17089514600F0F7FE48B17D
+:10150000308A7189884253D8B18EF08DCDE90001BF
+:10151000338D00E00BE0728CB18BF08AFFF781FF16
+:1015200028B12E466D1CB9F1000F03D030E03020F9
+:10153000BDE8FC87F80707D0780705D504EB46011E
+:1015400060894989884233D1228A01211BE04145C3
+:1015500003D004EB4100008A024404EB4100C38A3B
+:10156000868AB34224D1838B468BB34220D100E0DC
+:101570001EE0438C068CB3421AD1038DC08C83428B
+:1015800016D1491CC9B2A942E1D3608990420FD358
+:10159000207810B101280BD102E0A0780028F9D101
+:1015A000607838B1012805D0022803D0032801D083
+:1015B0001220BDE70020BBE7002152E70178C907F0
+:1015C00002D0406812F0A3BE12F070BE10B50078D1
+:1015D000012800D00020FDF754FC002010BD2DE9AB
+:1015E000F0478EB00D46AFF6A422D2E90092014634
+:1015F00090462846FFF735FF06000CD100F034FD79
+:1016000040B9FE4F387828B90DF0ACF9A0F57F410C
+:10161000FF3903D00C200EB0BDE8F087032105F19F
+:10162000100000F079FEF54809AA3E380990F44808
+:101630000A90F248062110380B900CA801F05CFCCF
+:10164000040037D000210BF005FE04F130017B8A45
+:10165000BA8ACB830A84797C0091BA463B7CBA8AE9
+:10166000798A208801F036FD00B1FFDF208806F07E
+:101670000AFF218804F10E0000F01CFDE1A004F136
+:10168000120700680590032105A804F055FF00200B
+:1016900005A90A5C3A54401CC0B20328F9D3A88BB0
+:1016A0006080688CA080288DE080687A410703D52F
+:1016B00008270AE00920AEE7C10701D0012704E0AE
+:1016C000800701D5022700E000273A46BAF8160045
+:1016D000114610F0C7F90146A062204610F0D0F97B
+:1016E0003A46214600200CF0D3F900B90926C34A36
+:1016F00021461C3200200CF0E8F9002784F87670AF
+:1017000084F87770A87800F094FC6076D5F8030030
+:10171000C4F81A00B5F80700E083C4F8089084F80C
+:101720000C80012084F8200101468DF80070684685
+:1017300004F002FF9DF8000000F00701C0F3C102B1
+:101740001144C0F3401008448DF80000401D20767D
+:10175000092801D208302076012120460BF07AFDBD
+:1017600068780DF04BFCEEBBA9782878EA1C0DF0E8
+:1017700018FC48B10DF04CFCA9782878EA1C0DF053
+:10178000B9FC060002D052E0122650E0687A00F060
+:1017900005010020CA0700D001208A0701D540F0CA
+:1017A0000200490701D540F008000DF0E3FB0600F8
+:1017B0003DD1214603200DF0C7FC060037D10DF0C6
+:1017C000CCFC060033D1697A01F005018DF80810D0
+:1017D000697AC90708D06889ADF80A00288AADF887
+:1017E0000C0000E023E00120697A8A0700D5401C44
+:1017F000490707D505EB40004189ADF80E10008A76
+:10180000ADF8100002A810F072F8064695F83A00FC
+:1018100000B101200DF0C0FB4EB90DF0F7FC060041
+:1018200005D1A98F204610F003F8060008D02088C3
+:1018300006F02AFE2088062101F0A2FB00B1FFDF9E
+:101840003046E8E601460020C9E638B56B48007826
+:1018500078B910F0B4FD052805D00DF083F8A0F597
+:101860007F41FF3905D0684610F0ABF8040002D084
+:101870000CE00C2038BD0098008806F005FE0098AA
+:101880000621008801F07CFB00B1FFDF204638BD57
+:101890001CB582894189CDE900120389C2888188FB
+:1018A0004088FFF7BEFD08B100201CBD30201CBDE4
+:1018B00070B50546FFF7ECFF00280ED128880621F9
+:1018C00001F04CFB040007D000F032FC20B1D4F84A
+:1018D0001801017831B901E0022070BDD4F864111B
+:1018E000097809B13A2070BD05218171D4F8181129
+:1018F00000200881D4F81811A8884881D4F818115C
+:10190000E8888881D4F818112889C881D4F818018A
+:10191000028941898A4204D88279082A01D88A42F8
+:1019200001D3122070BD29884180D4F818110220FB
+:101930000870002070BD3EB504460BF0B3FEB0B198
+:101940002E480125A0F140024570236842F8423F2D
+:1019500023790021137141706946062001F087FA4E
+:1019600000B1FFDF684601F060FA10B10EE012200E
+:101970003EBDBDF80440029880F82051684601F051
+:1019800054FA18B9BDF80400A042F4D100203EBDBD
+:1019900070B505460088062101F0E0FA040007D082
+:1019A00000F0C6FB20B1D4F81811087830B901E076
+:1019B000022070BDD4F86401007808B13A2070BDEF
+:1019C000B020005D10F0010F22D0D5F80200486071
+:1019D000D5F806008860D4F8180169891022818141
+:1019E000D4F8180105F10C010E3004F58C74FCF7E5
+:1019F0001CFD216803200870288805E018080020D5
+:101A00007C0000201122330021684880002070BD36
+:101A10000C2070BD38B504460078EF284DD860889A
+:101A2000ADF80000009800F089FC88B361880807D1
+:101A300008D4D4E9012082423FD8202A3DD3B0F512
+:101A4000804F3AD8207B18B3072836D8607B28B15E
+:101A5000012803D0022801D003282ED14A0703D43D
+:101A6000022801D0032805D1A07B08B1012824D188
+:101A7000480707D4607D28B1012803D0022801D08F
+:101A800003281AD1C806E07D03D5012815D110E03E
+:101A900013E0012801D003280FD1C80609D4607EC5
+:101AA000012803D0022801D0032806D1A07E0F28E8
+:101AB00003D8E07E18B1012801D0122038BD0020E3
+:101AC00038BDF8B514460D46064608F006F808B1CC
+:101AD0000C20F8BD3046FFF79DFF0028F9D1FDF737
+:101AE000DAF92870B07554B9FF208DF80000694606
+:101AF0000020FDF7BAF969460020FDF7AAF9304643
+:101B0000BDE8F840FDF7EEB80022DAE70078C1083A
+:101B100001D012207047FD4981F820000020704755
+:101B200010B504460078C00704D1608810B1FDF7F5
+:101B300073F980B12078618800F00102607800F0CC
+:101B400021FC002806D1FDF74FF901466088884244
+:101B500003D9072010BD122010BD6168FDF785F97B
+:101B6000002010BD10B504460078C00704D160887D
+:101B700010B1FCF71CFE70B12078618800F0010202
+:101B8000607800F0FFFB002804D160886168FDF7F1
+:101B900060F9002010BD122010BD7CB504464078CD
+:101BA0004225012808D8A078FCF7F9FD20B120785B
+:101BB0001225012802D090B128467CBDFDF777F9A7
+:101BC00020B1A0880028F7D08028F5D8FDF776F955
+:101BD00060B160780028EFD02078012808D006F0A6
+:101BE00075FD044607F067FC00287FD00C207CBD03
+:101BF000FCF791FF10B9FDF753F990B307F06DFFB3
+:101C00000028F3D1FCF792FDA0F57F41FF39EDD11B
+:101C1000FCF7A3FFA68842F210704643A079FDF7B7
+:101C20000CF9FCF7CBFDF8B10022072101A801F067
+:101C300063F9040058D0B6480021846020460BF0B8
+:101C400016FA2046FDF7CEFCB04D04F130006A8A4A
+:101C5000A98AC2830184FCF7B8FD60B1E88A01213A
+:101C60000DE0FFE712207CBD3146002007F0D5FCD7
+:101C700088B3FFDF44E0FDF723F90146E88A07F067
+:101C800077FD0146A0620022204606F022FDFCF707
+:101C90009CFD38B9FDF714F90246214601200BF0EE
+:101CA000F7FED0B1994A21461C3201200BF00DFFFE
+:101CB000687C00902B7CAA8A698A208801F00AFA45
+:101CC00000B1FFDF208806F0DEFB3146204607F03A
+:101CD000A4FC00B1FFDF13E008E00721BDF8040019
+:101CE00001F04EF900B1FFDF09207CBD44B120882E
+:101CF00006F0CAFB2088072101F042F900B1FFDF9E
+:101D000000207CBD002148E770B50D46072101F099
+:101D100025F9040003D094F8930110B10AE00220E1
+:101D200070BD94F87D00142801D0152802D194F8D4
+:101D3000E00108B10C2070BD1022294604F5CA70DC
+:101D4000FCF773FB012084F89301002070BD10B5EF
+:101D5000072101F003F918B190F8931111B107E0D0
+:101D6000022010BD90F87D10142903D0152901D050
+:101D70000C2010BD022180F89311002010BD2DE928
+:101D8000FC410C464BF68032122194421DD8E4B13E
+:101D90006946FEF727FC002815D19DF8000000F0E9
+:101DA0004FF9019E9DF80000703600F049F9019D41
+:101DB000AD1C2F882246394630460BF04EF9288854
+:101DC000B842F6D10020BDE8FC810846FBE77CB5AF
+:101DD000044600886946FEF705FC002810D19DF8EE
+:101DE000000000F02DF9019D9DF80000703500F015
+:101DF00027F90198A27890F82C10914201D10C207B
+:101E00007CBD7F212972A9720021E972E17880F8F6
+:101E10002D10217980F82E10A17880F82C10002048
+:101E20007CBD1CB50C466946FEF7DCFB00280AD1D8
+:101E30009DF8000000F004F9019890F88C0000B1C2
+:101E40000120207000201CBD7CB50D46144669465B
+:101E5000FEF7C8FB002809D19DF8000000F0F0F85B
+:101E6000019890F82C00012801D00C207CBD9DF831
+:101E7000000000F0E5F8019890F87810297090F8CB
+:101E80007900207000207CBD70B50D4616460721F4
+:101E900001F064F818B381880124C388428804EBF8
+:101EA0004104AC4217D842F210746343A410624359
+:101EB000B3FBF2F2521E94B24FF4FA72944200D97C
+:101EC0001446A54200D22C46491C641CB4FBF1F216
+:101ED0004A43521E91B290F8CC211AB901E0022077
+:101EE00070BD01843180002070BD10B50C46072103
+:101EF00001F034F870B180F8FF4024B190F8FD1083
+:101F000009B107F04BFC002010BD000018080020AC
+:101F1000700000200220F7E7017889B1417879B19B
+:101F200041881B290CD381881B2909D3C188022928
+:101F300006D3F74902680A65406848650020704783
+:101F40001220704710B504460FF088FD204607F0B8
+:101F5000DEFB0020D8E710B507F0DCFB0020D3E75C
+:101F60002DE9F04115460F46064601221146384636
+:101F70000FF078FD04460121384607F0F9FB844252
+:101F800000D204460121304600F05FF806460121E8
+:101F9000002000F05AF83118012096318C4206D901
+:101FA00001F19600611AB1FBF0F0401C80B228806C
+:101FB0000020BDE8F08110B5044600F071F808B1CA
+:101FC0000C20A1E7601C0AF09FFE207800F00100C1
+:101FD000FCF7BEFD207800F001000DF014F80020A1
+:101FE00092E710B50446072000F052FF08B10C201C
+:101FF0008AE72078C00711D000226078114612F0DD
+:1020000099FD08B112207FE7A06809F028FB6078ED
+:10201000D4F8041009F02CFB002075E7002009F02B
+:102020001EFB00210846F5E710B505F008FE00206C
+:102030006AE718B1022801D00120704700207047DC
+:1020400008B1002070470120704710B5012904D065
+:10205000022905D0FFDF204656E7C000503001E0DE
+:1020600080002C3084B2F6E710B510F0A8F90428EF
+:1020700003D0052801D0002046E7012044E710B531
+:10208000FFF7F2FF10B10DF085F828B907F025FD34
+:1020900020B1FCF738FD08B1012035E7002033E717
+:1020A00010B5FFF7E1FF18B907F017FD002800D0C1
+:1020B000012029E72DE9FE4300250F4680460A2628
+:1020C0000421404604F061FA40460BF08CFA0620E9
+:1020D00000F0ECFE044616E06946062000F0C7FE5C
+:1020E0000BE000BFBDF80400B84206D002980422FD
+:1020F00041460E30FCF76CF950B1684600F095FE91
+:102100000500EFD0641E002C06DD002DE4D005E0B4
+:1021100040460BF071FAF5E705B9FFDFD8F800008B
+:102120000BF085FA761E01D00028C9D0BDE8FE83E9
+:1021300090F8F01090F88C0020B919B1042901D062
+:102140000120704700207047017800290AD04168BB
+:1021500091F8FD20002A05D0002281F8FD2040687A
+:1021600007F01CBB704770B514460546012200F00D
+:102170001DF9002806D121462846BDE870400022FE
+:1021800000F014B970BDFB2802D8B1F5296F01D950
+:1021900011207047002070471B38E12806D2B1F5A6
+:1021A000A47F03D344F29020814201D912207047CA
+:1021B000002070471FB55649403191F82010CA07DA
+:1021C00002D102781D2A0AD08A0702D402781C2A7A
+:1021D00028D049073DD40178152937D039E08088C7
+:1021E000ADF8000002A9FEF7FDF900B1FFDF9DF890
+:1021F0000800FFF725FF039810F8601F8DF8021004
+:1022000040788DF803000020ADF8040001B9FFDF2D
+:102210009DF8030000B9FFDF6846FEF750FCD8B117
+:10222000FFDF19E08088ADF800004FF42961FB2042
+:10223000ADF80410ADF80200ADF80600ADF80810D6
+:102240006846FEF74AFD38B1FFDF05E0807BC00736
+:1022500002D0002004B057E60120FBE7F8B507469E
+:10226000508915460C4640B1B0F5004F05D200220A
+:10227000A878114612F05EFC08B11220F8BDA06EDD
+:1022800004F1700630B1A97894F86E00814201D053
+:102290000C20F8BD012184F86F10A97884F86E1025
+:1022A0006968A1666989A4F86C102889B084002146
+:1022B00084F86F1028886946FEF772FFB08CBDF86D
+:1022C0000010081A00B2002804DD21463846FEF747
+:1022D00055FFDDE70020F8BD042803D321B9B0F590
+:1022E000804F01D90020704701207047042803D394
+:1022F00021B9B0F5804F01D9002070470120704707
+:10230000012802D030B10020704702207047000041
+:10231000D80700200120F9E710B500224FF4C84487
+:1023200009E000BF30F81230A34200D9234620F85C
+:102330001230521CD2B28A42F4D3E5E580B2C10613
+:102340000BD401071CD481064FEAC07101D5B9B97D
+:1023500000E099B1800713D410E0410610D4810643
+:102360000ED4C1074FEA807104D0002902DB400778
+:1023700004D405E0010703D4400701D40120C5E7D8
+:102380000020C3E770B50C460546FF2904D8FCF7CA
+:102390001CFA18B11F2C01D9122070BD2846FCF779
+:1023A000FEF908B1002070BD422070BD0AB10122C3
+:1023B00000E00222024202D1C80802D109B1002085
+:1023C000A4E71120A2E7000030B5058825F40044F9
+:1023D00021448CB24FF4004194420AD2121B92B2B3
+:1023E0001B339A4201D2A94307E005F4004121437F
+:1023F00003E0A21A92B2A9431143018030BD084400
+:10240000083050434A31084480B2704770B51D46C9
+:1024100016460B46044629463046049AFFF7EFFF5E
+:102420000646B34200D2FFDF282200212046FCF7F7
+:1024300026F84FF6FF70A082283EB0B26577608024
+:10244000B0F5004F00D9FFDF618805F13C00814203
+:1024500000D2FFDF60880835401B343880B220800E
+:102460001B2800D21B2020800020A07770BD816136
+:10247000886170472DE9F05F0D46C188044600F180
+:102480002809008921F4004620F4004800F063FB8D
+:1024900010B10020BDE8F09F4FF0000A4FF0010B93
+:1024A000B0450CD9617FA8EB0600401A0838854278
+:1024B00019DC09EB06000021058041801AE06088E4
+:1024C000617F801B471A083F0DD41B2F00DAFFDF06
+:1024D000BD4201DC294600E0B9B2681A0204120CC0
+:1024E00004D0424502DD84F817A0D2E709EB0600CC
+:1024F0000180428084F817B0CCE770B5044600F143
+:102500002802C088E37D20F400402BB110440288EB
+:10251000438813448B4201D2002070BD00258A42BB
+:1025200002D30180458008E0891A0904090C418022
+:1025300003D0A01D00F01FFB08E0637F0088083374
+:10254000184481B26288A01DFFF73EFFE5750120A7
+:1025500070BD70B5034600F12804C588808820F45A
+:1025600000462644A84202D10020188270BD9889F6
+:102570003588A84206D3401B75882D1A2044ADB279
+:10258000C01E05E02C1AA5B25C7F20443044401DDB
+:102590000C88AC4200D90D809C8924B100241470B1
+:1025A0000988198270BD0124F9E770B5044600F16D
+:1025B0002801808820F400404518208A002825D072
+:1025C000A189084480B2A08129886A881144814287
+:1025D00000D2FFDF2888698800260844A189884244
+:1025E00012D1A069807F2871698819B1201D00F07F
+:1025F000C2FA08E0637F28880833184481B26288F1
+:10260000201DFFF7E1FEA6812682012070BD2DE985
+:10261000F041418987880026044600F12805B94227
+:1026200019D004F10A0800BF21F400402844418871
+:1026300019B1404600F09FFA08E0637F0088083334
+:10264000184481B262884046FFF7BEFE761C61895D
+:10265000B6B2B942E8D13046BDE8F0812DE9F0418B
+:1026600004460B4627892830A68827F40041B4F891
+:102670000A8001440D46B74201D10020ECE70AB1BF
+:10268000481D106023B1627F691D1846FBF7CDFE1F
+:102690002E88698804F1080021B18A1996B200F0E9
+:1026A0006AFA06E0637F62880833991989B2FFF7F6
+:1026B0008BFE474501D1208960813046CCE7818877
+:1026C000C088814201D101207047002070470189F4
+:1026D0008088814201D1012070470020704770B589
+:1026E0008588C38800F1280425F4004223F40041C2
+:1026F00014449D421AD08389058A5E19258863880F
+:10270000EC18A64214D313B18B4211D30EE0437FD1
+:1027100008325C192244408892B2801A80B2233376
+:10272000984201D211B103E08A4201D1002070BD6C
+:10273000012070BD2DE9F0478846C1880446008914
+:1027400021F4004604F1280720F4004507EB0609B0
+:1027500000F001FA002178BBB54204D9627FA81BC2
+:10276000801A002503E06088627F801B801A083889
+:1027700023D4E28962B1B9F80020B9F802303BB144
+:10278000E81A2177404518DBE0893844801A09E0CF
+:10279000801A217740450ADB607FE18908303044A8
+:1027A00039440844C01EA4F81280BDE8F0874545AE
+:1027B00003DB01202077E7E7FFE761820020F4E7F1
+:1027C0002DE9F74F044600F12805C088884620F41B
+:1027D000004A608A05EB0A0608B1404502D2002093
+:1027E000BDE8FE8FE08978B13788B6F8029007EB34
+:1027F0000901884200D0FFDF207F4FF0000B50EA34
+:10280000090106D088B33BE00027A07FB9463071AC
+:10281000F2E7E18959B1607F294408305044084407
+:10282000B4F81F1020F8031D94F821108170E2897C
+:1028300007EB080002EB0801E1813080A6F802B046
+:1028400002985F4650B1637F30880833184481B2E4
+:102850006288A01DFFF7B8FDE78121E0607FE18974
+:1028600008305044294408442DE0FFE7E089B4F8DB
+:102870001F102844C01B20F8031D94F821108170FC
+:1028800009EB0800E28981B202EB0800E0813780A1
+:1028900071800298A0B1A01D00F06DF9A4F80EB0EF
+:1028A000A07F401CA077A07D08B1E088A08284F8BA
+:1028B00016B000BFA4F812B084F817B001208FE75B
+:1028C000E0892844C01B30F8031DA4F81F1080784D
+:1028D00084F82100EEE710B5818800F1280321F487
+:1028E00000442344848AC288A14212D0914210D06D
+:1028F000818971B9826972B11046FFF7E8FE50B95B
+:102900001089283220F40040104419790079884257
+:1029100001D1002010BD184610BD00F12803407FF2
+:1029200008300844C01E1060088808B9DB1E136018
+:1029300008884988084480B270472DE9F04100F1C9
+:102940002806407F1C4608309046431808884D886A
+:10295000069ADB1EA0B1C01C80B2904214D9801A26
+:10296000A04200DB204687B298183A464146FBF762
+:102970002FFD002816D1E01B84B2B844002005E0EA
+:10298000ED1CADB2F61EE8E7101A80B20119A9429B
+:1029900006D8304422464146BDE8F041FBF718BD59
+:1029A0004FF0FF3058E62DE9F04100F12804407F58
+:1029B0001E46083090464318002508884F88069A1E
+:1029C000DB1E90B1C01C80B2904212D9801AB04276
+:1029D00000DB304685B299182A464046FBF725FDB4
+:1029E000701B86B2A844002005E0FF1CBFB2E41EA5
+:1029F000EAE7101A80B28119B94206D82118324686
+:102A00004046FBF712FDA81985B2284624E62DE9B9
+:102A1000F04100F12804407F1E46083090464318DC
+:102A2000002508884F88069ADB1E90B1C01C80B232
+:102A3000904212D9801AB04200DB304685B2981815
+:102A40002A464146FBF7F1FC701B86B2A8440020E1
+:102A500005E0FF1CBFB2E41EEAE7101A80B281193C
+:102A6000B94206D8204432464146FBF7DEFCA8199D
+:102A700085B22846F0E5401D704710B5044600F1C8
+:102A80002801C288808820F400431944904206D06F
+:102A9000A28922B9228A12B9A28A904201D10020C9
+:102AA00010BD0888498831B1201D00F064F800206D
+:102AB0002082012010BD637F62880833184481B2F0
+:102AC000201DFFF781FCF2E70021C18101774182DF
+:102AD000C1758175704703881380C28942B1C2886D
+:102AE00022F4004300F128021A440A60C0897047AA
+:102AF0000020704710B50446808AA0F57F41FF3959
+:102B000000D0FFDFE088A082E08900B10120A0753D
+:102B100010BD4FF6FF71818200218175704710B59D
+:102B20000446808AA0F57F41FF3900D1FFDFA07DF8
+:102B300028B9A088A18A884201D1002010BD0120B7
+:102B400010BD8188828A914201D1807D08B1002028
+:102B500070470120704720F4004221F400439A425C
+:102B600007D100F4004001F40041884201D0012067
+:102B700070470020704730B5044600880D4620F4A9
+:102B80000040A84200D2FFDF21884FF40040884374
+:102B90002843208030BD70B50C00054609D0082CB4
+:102BA00000D2FFDF1DB1A1B2286800F044F8201D5B
+:102BB00070BD0DB100202860002070BD00210268AA
+:102BC00003E093881268194489B2002AF9D100F011
+:102BD00032B870B500260D460446082900D2FFDF42
+:102BE000206808B91EE0044620688188A94202D006
+:102BF00001680029F7D181880646A94201D1006801
+:102C00000DE005F1080293B20022994209D328444D
+:102C1000491B026081802168096821600160206091
+:102C200000E00026304670BD00230B608A800268F9
+:102C30000A600160704700234360021D0181026049
+:102C40007047F0B50F460188408815460C181E469F
+:102C5000AC4200D3641B3044A84200D9FFDFA01966
+:102C6000A84200D9FFDF3819F0BD2DE9F0418846B0
+:102C700006460188408815460C181F46AC4200D312
+:102C8000641B3844A84200D9FFDFE019A84200D9EC
+:102C9000FFDF70883844708008EB0400BDE8F081E5
+:102CA0002DE9F041054600881E461746841B8846DC
+:102CB000BC4200D33C442C8068883044B84200D9E0
+:102CC000FFDFA019B84200D9FFDF68883044688070
+:102CD00008EB0400E2E72DE9F04106881D460446B2
+:102CE000701980B2174688462080B84201D3C01BB5
+:102CF00020806088A84200D2FFDF7019B84200D956
+:102D0000FFDF6088401B608008EB0600C6E730B537
+:102D10000D460188CC18944200D3A41A40889842EA
+:102D200000D8FFDF281930BD2DE9F041C84D044619
+:102D30009046A8780E46A04200D8FFDF05EB860734
+:102D4000B86A50F8240000B1FFDFB868002816D038
+:102D5000304600F044F90146B868FFF73AFF050035
+:102D60000CD0B86A082E40F8245000D3FFDFB948D1
+:102D70004246294650F82630204698472846BDE866
+:102D8000F0812DE9F8431E468C1991460F46054601
+:102D9000FF2C00D9FFDFB14500D9FFDFE4B2009579
+:102DA0004DB300208046E81C20F00300A84200D06C
+:102DB000FFDF4946DFF89892684689F8001089F8E5
+:102DC000017089F8024089F8034089F8044089F8C5
+:102DD000054089F8066089F80770414600F008F957
+:102DE000002142460F464B460098C01C20F00300CD
+:102DF000009012B10EE00120D4E703EB8106B0622F
+:102E0000002005E0D6F828C04CF82070401CC0B265
+:102E1000A042F7D30098491C00EB8400C9B200908F
+:102E20000829E1D3401BBDE8F88310B50446EEF74E
+:102E300036FA08B1102010BD2078854A618802EB6F
+:102E4000800092780EE0836A53F8213043B14A1C27
+:102E50006280A180806A50F82100A060002010BD2F
+:102E6000491C89B28A42EED86180052010BD70B538
+:102E700005460C460846EEF712FA08B1102070BD60
+:102E8000082D01D3072070BD25700020608070BD23
+:102E90000EB56946FFF7EBFF00B1FFDF6846FFF7AD
+:102EA000C4FF08B100200EBD01200EBD10B50446C0
+:102EB000082800D3FFDF6648005D10BD3EB505461B
+:102EC00000246946FFF7D3FF18B1FFDF01E0641C5F
+:102ED000E4B26846FFF7A9FF0028F8D02846FFF7BC
+:102EE000E5FF001BC0B23EBD59498978814201D936
+:102EF000C0B27047FF2070472DE9F041544B0629BE
+:102F000003D007291CD19D7900E0002500244FF64D
+:102F1000FF7603EB810713F801C00AE06319D7F8C5
+:102F200028E09BB25EF823E0BEF1000F04D0641CE1
+:102F3000A4B2A445F2D8334603801846B34201D167
+:102F400000201CE7BDE8F041EEE6A0F57F43FF3B23
+:102F500001D0082901D300207047E5E6A0F57F42A3
+:102F6000FF3A0BD0082909D2394A9378834205D910
+:102F700002EB8101896A51F82000704700207047F8
+:102F80002DE9F04104460D46A4F57F4143F20200CD
+:102F9000FF3902D0082D01D30720F0E62C494FF06D
+:102FA00000088A78A242F8D901EB8506B26A52F885
+:102FB0002470002FF1D027483946203050F82520C2
+:102FC00020469047B16A284641F8248000F007F86F
+:102FD00002463946B068FFF727FE0020CFE61D49BC
+:102FE000403131F810004FF6FC71C01C08407047AA
+:102FF0002DE9F843164E8846054600242868C01C73
+:1030000020F0030028602046FFF7E9FF315D4843C8
+:10301000B8F1000F01D0002200E02A6801460092BA
+:1030200032B100274FEA0D00FFF7B5FD1FB106E0F2
+:1030300001270020F8E706EB8401009A8A602968DE
+:10304000641C0844E4B22860082CD7D3EBE60000E7
+:103050003C0800201863020070B50E461D4611465C
+:1030600000F0D5F804462946304600F0D9F820444F
+:10307000001D70BD2DE9F04190460D4604004FF053
+:10308000000610D00027E01C20F00300A04200D072
+:10309000FFDFE5B141460020FFF77DFD0C3000EB7E
+:1030A000850617B113E00127EDE7624F04F10C002C
+:1030B000AA003C602572606000EB85002060002162
+:1030C0006068FBF7DCF941463868FFF764FD30467D
+:1030D000BDE8F0812DE9FF4F564C804681B0206855
+:1030E0009A46934600B9FFDF2068027A424503D929
+:1030F000416851F8280020B143F2020005B0BDE854
+:10310000F08F5146029800F082F886B258460E9928
+:1031100000F086F885B27019001D87B22068A146BC
+:1031200039460068FFF755FD04001FD067802580F1
+:103130002946201D0E9D07465A4601230095FFF79C
+:1031400065F92088314638440123029ACDF800A061
+:10315000FFF75CF92088C1193846FFF788F9D9F8DC
+:1031600000004168002041F82840C7E70420C5E777
+:1031700070B5304C0546206800B9FFDF2068017A41
+:10318000A9420ED9426852F8251051B1002342F8E5
+:1031900025304A880068FFF747FD216800200A7A39
+:1031A00008E043F2020070BD4B6853F8203033B999
+:1031B000401CC0B28242F7D80868FFF7FFFC00202D
+:1031C00070BD70B51B4E05460024306800B9FFDFA6
+:1031D0003068017AA94204D9406850F8250000B14E
+:1031E000041D204670BD70B5124E0546002430689F
+:1031F00000B9FFDF3068017AA94206D9406850F86B
+:10320000251011B131F8040B4418204670BD10B5DB
+:103210000A460121FFF7F3F8C01C20F0030010BD9F
+:1032200010B50A460121FFF7EAF8C01C20F00300A0
+:1032300010BD00008400002070B50446C2F11005E6
+:103240002819FBF7F2F815F0FF0109D0491ECAB2A0
+:103250008020A0542046BDE870400021FBF70FB944
+:1032600070BD30B505E05B1EDBB2CC5CD55C6C405C
+:10327000C454002BF7D130BD10B5002409E00B7801
+:10328000521E44EA430300F8013B11F8013BD2B25D
+:10329000DC09002AF3D110BD2DE9F04389B01E46A8
+:1032A000DDE9107990460D00044622D0024608461A
+:1032B000F949FDF750FE102221463846FFF7DCFFA2
+:1032C000E07B000606D5F44A394610231032084642
+:1032D000FFF7C7FF102239464846FFF7CDFFF87BBE
+:1032E000000606D5EC4A4946102310320846FFF77F
+:1032F000B8FF102200212046FBF7C1F80DE0103E78
+:10330000B6B208EB0601102322466846FFF7A9FF74
+:10331000224628466946FDF71EFE102EEFD818D02B
+:10332000F2B241466846FFF787FF10234A466946D6
+:1033300004A8FFF796FF1023224604A96846FFF76A
+:1033400090FF224628466946FDF705FE09B0BDE814
+:10335000F08310233A464146EAE770B59CB01E461A
+:103360000546134620980C468DF808002022194681
+:103370000DF10900FBF759F8202221460DF1290033
+:10338000FBF753F817A913A8CDE90001412302AABE
+:1033900031462846FFF780FF1CB070BD2DE9FF4F76
+:1033A0009FB014AEDDE92D5410AFBB49CDE90076D6
+:1033B000202320311AA8FFF76FFF4FF000088DF887
+:1033C00008804FF001098DF8099054F8010FCDF8ED
+:1033D0000A00A088ADF80E0014F8010C1022C0F30A
+:1033E00040008DF8100055F8010FCDF81100A888A5
+:1033F000ADF8150015F8010C2C99C0F340008DF8BC
+:10340000170006A88246FBF710F80AA88346102288
+:103410002299FBF70AF8A0483523083802AA406829
+:103420008DF83C80CDE900760E901AA91F98FFF721
+:1034300033FF8DF808808DF809902068CDF80A00D8
+:10344000A088ADF80E0014F8010C1022C0F3400063
+:103450008DF810002868CDF81100A888ADF8150087
+:1034600015F8010C2C99C0F340008DF81700504658
+:10347000FAF7DBFF584610222299FAF7D6FF864862
+:103480003523083802AA40688DF83C90CDE90076D3
+:103490000E901AA92098FFF7FFFE23B0BDE8F08F29
+:1034A000F0B59BB00C460546DDE922101E461746D6
+:1034B000DDE92032D0F801C0CDF808C0B0F805C071
+:1034C000ADF80CC00078C0F340008DF80E00D1F8C4
+:1034D0000100CDF80F00B1F80500ADF81300087831
+:1034E0001946C0F340008DF815001088ADF816009D
+:1034F00090788DF818000DF119001022FAF795FF59
+:103500000DF1290010223146FAF78FFF0DF1390035
+:1035100010223946FAF789FF17A913A8CDE900014F
+:10352000412302AA21462846FFF7B6FE1BB0F0BD94
+:10353000F0B5A3B017460D4604461E46102202A859
+:103540002899FAF772FF06A820223946FAF76DFF8C
+:103550000EA820222946FAF768FF1EA91AA8CDE96D
+:103560000001502302AA314616A8FFF795FE1698CF
+:10357000206023B0F0BDF0B589B00446DDE90E0748
+:103580000D463978109EC1F340018DF80010317856
+:103590009446C1F340018DF801101968CDF802106E
+:1035A0009988ADF8061099798DF808100168CDF862
+:1035B00009108188ADF80D1080798DF80F00102367
+:1035C0006A46614604A8FFF74CFE2246284604A935
+:1035D000FDF7C1FCD6F801000090B6F80500ADF883
+:1035E0000400D7F80100CDF80600B7F80500ADF8E3
+:1035F0000A000020039010236A46214604A8FFF722
+:1036000030FE2246284604A9FDF7A5FC09B0F0BD0E
+:103610001FB51C6800945B6801931368029352689D
+:103620000392024608466946FDF795FC1FBD10B59A
+:1036300088B00446106804905068059000200690F9
+:10364000079008466A4604A9FDF785FCBDF800000E
+:10365000208008B010BD1FB51288ADF800201A8870
+:10366000ADF802200022019202920392024608461F
+:103670006946FDF770FC1FBD7FB5074B1446054634
+:10368000083B9A1C6846FFF7E6FF22466946284633
+:10369000FFF7CDFF7FBD00007063020070B50446E8
+:1036A00000780E46012813D0052802D0092813D12E
+:1036B0000EE0A06861690578042003F04DFA052D3D
+:1036C0000AD0782300220420616903F09BF903E00B
+:1036D0000420616903F040FA31462046BDE870409D
+:1036E00001F08AB810B500F12D03C2799C78411D14
+:1036F000144064F30102C271D2070DD04A795C799B
+:1037000022404A710A791B791A400A718278C97875
+:103710008A4200D9817010BD00224A71F5E74178D4
+:10372000012900D00C21017070472DE9F04F93B0B2
+:103730004FF0000B0C690D468DF820B0097801267A
+:103740000C2017464FF00D084FF0110A4FF00809F2
+:103750001B2975D2DFE811F01B00C40207031F0309
+:103760005E037103A303B803F9031A04620495040A
+:10377000A204EF042D05370555056005F30536064F
+:10378000390668068406FE062207EB06F00614B129
+:1037900020781D282AD0D5F808805FEA08004FD08D
+:1037A00001208DF82000686A02220D908DF82420F7
+:1037B0000A208DF82500A8690A90A8880028EED074
+:1037C00098F8001091B10F2910D27DD2DFE801F0F6
+:1037D0007C1349DEFCFBFAF9F8F738089CF6F50093
+:1037E00002282DD124B120780C2801D00026F0E346
+:1037F0008DF82020CBE10420696A03F0ADF9A88898
+:103800000728EED1204600F0F2FF022809D020461A
+:1038100000F0EDFF032807D9204600F0E8FF072855
+:1038200002D20120207004E0002CB8D020780128BA
+:10383000D7D198F80400C11F0A2902D30A2061E0F9
+:10384000C4E1A070D8F80010E162B8F80410218635
+:1038500098F8060084F832000120287003202070B8
+:1038600044E00728BDD1002C99D020780D28B8D18C
+:1038700098F8031094F82F20C1F3C000C2F3C002DF
+:10388000104201D0062000E00720890707D198F8F0
+:1038900005100142D2D198F806100142CED194F819
+:1038A000312098F8051020EA02021142C6D194F89E
+:1038B000322098F8061090430142BFD198F80400D6
+:1038C000C11F0A29BAD200E008E2617D81427CD89A
+:1038D000D8F800106160B8F80410218198F806004B
+:1038E000A072012028700E20207003208DF8200087
+:1038F000686A0D9004F12D000990601D0A900F3048
+:103900000B9022E12875FCE3412891D1204600F07C
+:103910006EFF042802D1E078C00704D1204600F0F1
+:1039200066FF0F2884D1A88CD5F80C8080B24FF0A8
+:10393000400BE669FFF745FC324641465B464E4682
+:10394000CDF80090FFF72FF80B208DF82000686A63
+:103950000D90E0690990002108A8FFF79FFE2078EC
+:10396000042806D0A07D58B1012809D003280AD028
+:103970004AE305202070032028708DF82060CEE1F6
+:1039800084F800A032E712202070EAE11128BCD1AF
+:10399000204600F02CFF042802D1E078C00719D09F
+:1039A000204600F024FF062805D1E078C00711D199
+:1039B000A07D02280ED0204608E0CCE084E072E131
+:1039C00051E124E103E1E9E019E0B0E100F00FFF8B
+:1039D00011289AD1102208F1010104F13C00FAF7F4
+:1039E00024FD607801286ED012202070E078C00796
+:1039F00060D0A07D0028C8D00128C6D05AE0112888
+:103A000090D1204600F0F3FE082804D0204600F0B4
+:103A1000EEFE132886D104F16C00102208F101019A
+:103A20000646FAF702FD207808280DD014202070F1
+:103A3000E178C8070DD0A07D02280AD06278022A5A
+:103A400004D00328A1D035E00920F0E708B101280F
+:103A500037D1C80713D0A07D02281DD000200090C8
+:103A6000D4E9062133460EA8FFF777FC10220EA9F1
+:103A700004F13C00FAF7ACFCC8B1042042E7D4E9F9
+:103A80000912201D8DE8070004F12C0332460EA810
+:103A9000616BFFF770FDE9E7606BC1F34401491EFC
+:103AA0000068C84000F0010040F08000D7E72078AF
+:103AB000092806D185F800908DF8209036E328700B
+:103AC000EFE30920FBE79EE1112899D1204600F0A1
+:103AD0008EFE0A2802D1E078C00704D1204600F00B
+:103AE00086FE15288CD104F13C00102208F101015A
+:103AF0000646FAF79AFC20780A2816D0162020707D
+:103B0000D4E90932606B611D8DE80F0004F15C039C
+:103B100004F16C0247310EA8FFF7C2FC10220EA977
+:103B20003046FAF755FC18B1F9E20B20207073E229
+:103B30002046FFF7D7FDA078216AC0F110020B18CC
+:103B400000211846FAF79BFC26E3394608A8FFF740
+:103B5000A5FD06463CE20228B7D1204600F047FE0C
+:103B6000042804D3204600F042FE082809D320464A
+:103B700000F03DFE0E2829D3204600F038FE122822
+:103B800024D2A07D0228A0D10E208DF82000686AE2
+:103B90000D9098F801008DF82400F5E3022894D1E7
+:103BA000204600F024FE002810D0204600F01FFE22
+:103BB0000128F9D0204600F01AFE0C28F4D0042089
+:103BC0008DF8240098F801008DF8250060E2112896
+:103BD000FCD1002CFAD020781728F7D16178606AE0
+:103BE000022912D05FF0000101EB4101182606EB1B
+:103BF000C1011022405808F10101FAF716FC042017
+:103C0000696A00F0E7FD2670F0E50121ECE70B287A
+:103C1000DCD1002CDAD020781828D7D16078616AFE
+:103C200002281CD05FF0000000EB4002102000EBE7
+:103C3000C2000958B8F8010008806078616A02285B
+:103C40000FD0002000EB4002142000EBC200095806
+:103C5000404650F8032F0A604068486039E0012070
+:103C6000E2E70120EEE71128B0D1002CAED0207899
+:103C70001928ABD16178606A022912D05FF0000187
+:103C800001EB41011C2202EBC1011022405808F156
+:103C90000101FAF7CAFB0420696A00F09BFD1A20B3
+:103CA000B6E00121ECE7082890D1002C8ED02078D6
+:103CB0001A288BD1606A98F80120017862F34701D5
+:103CC0000170616AD8F8022041F8012FB8F80600A7
+:103CD00088800420696A00F07DFD90E2072011E6EB
+:103CE0003878012894D1182204F114007968FAF781
+:103CF0009CFBE079C10894F82F0001EAD001E0783C
+:103D000061F30000E070217D002974D1217803293E
+:103D100009D0C00725D0032028708DF82090686A4C
+:103D20000D90412008E3607DA178884201D90620EA
+:103D3000E8E502262671E179204621F0E001E171F3
+:103D4000617A21F0F0016172A17A21F0F001A17293
+:103D5000FFF7C8FC2E708DF82090686A0D90072040
+:103D6000EAE20420ABE6387805289DD18DF82000E2
+:103D7000686A0D90B8680A900720ADF824000A9888
+:103D80008DF830B06168016021898180A17A8171EC
+:103D900004202070F8E23978052985D18DF82010AB
+:103DA000696A0D91391D09AE0EC986E80E004121E0
+:103DB000ADF824108DF830B01070A88CD7F80C80B6
+:103DC00080B24026A769FFF70EFA41463A463346CD
+:103DD000C846CDF80090FEF71AFE002108A8FFF7AC
+:103DE0005DFCE07820F03E00801CE0702078052823
+:103DF00002D00F200CE04AE1A07D20B1012802D0C2
+:103E0000032802D002E10720BEE584F80080EDE43B
+:103E10002070EBE4102104F15C0002F0B6FB606B53
+:103E2000B0BBA07D18B1012801D00520FDE006201F
+:103E30002870F8486063A063C2E23878022894D101
+:103E4000387908B12875B7E3A07D022802D003288D
+:103E500005D022E0B8680028F5D060631CE06078E7
+:103E6000012806D0A07994F82E10012805D0E94841
+:103E700006E0A17994F82E00F7E7B8680028E2D0B0
+:103E80006063E078C00701D0012902D0E14803E077
+:103E900003E0F8680028D6D0A06306200FE68DF86E
+:103EA0002090696A0D91E1784846C90709D0617888
+:103EB000022903D1A17D29B1012903D0A17D0329C4
+:103EC00000D00720287033E138780528BBD120784E
+:103ED00007281ED084F800A005208DF82000686A0D
+:103EE0000D90B8680A90ADF824A08DF830B0032189
+:103EF0000170E178CA070FD0A27D022A1AD00021F2
+:103F00000091D4E9061204F15C03401CFFF725FA86
+:103F10006BE384F80090DFE7D4E90923211D8DE8E5
+:103F20000E0004F12C0304F15C02401C616BFFF7EE
+:103F300022FB5AE3626BC1F34401491E1268CA4076
+:103F400002F0010141F08001DAE738780528BDD19F
+:103F50008DF82000686A0D90B8680A90ADF824A02A
+:103F60008DF830B0042100F8011B102204F15C012F
+:103F7000FAF75BFA002108A8FFF790FB20780928E0
+:103F800001D0132044E70A2020709AE5E078C107A9
+:103F900042D0A17D012902D0022927D038E06178E2
+:103FA00008A8012916D004F16C010091D4E9061289
+:103FB00004F15C03001DFFF7BBFA0A2028700326FA
+:103FC0008DF82080686A0D90002108A8FFF766FB35
+:103FD000E1E2C7E204F15C010091D4E9062104F1B9
+:103FE0006C03001DFFF7A4FA0026E9E7C0F34401C3
+:103FF00014290DD24FF0006101EBB0104FEAB06010
+:10400000E0706078012801D01020BDE40620FFE6B2
+:10401000607801283FF4B6AC0A2050E5E178C90782
+:1040200008D0A17D012903D10B202870042030E0A5
+:1040300028702EE00E2028706078616B012818D05F
+:1040400004F15C0304F16C020EA8FFF7E1FA2046CC
+:10405000FFF748FBA0780EAEC0F1100230440021FB
+:10406000FAF70DFA06208DF82000686A09960D907F
+:104070009BE004F16C0304F15C020EA8FFF7C8FAA0
+:10408000E8E73978022903D139790029D0D0297598
+:1040900092E28DF82000686A0D9056E5387807287E
+:1040A000F6D1D4E909216078012808D004F16C0028
+:1040B000CDE90002029105D104F16C0304E004F1A2
+:1040C0005C00F5E704F15C0304F14C007A680646F5
+:1040D000216AFFF763F96078012822D1A078216A6C
+:1040E000C0F110020B1800211846FAF7C8F9D4E9FC
+:1040F0000923606B04F12D018DE80F0004F15C03CE
+:1041000000E05BE204F16C0231460EA8FFF7C8F94B
+:1041100010220EA904F13C00FAF75AF908B10B205D
+:10412000ACE485F8008000BF8DF82090686A0D909F
+:104130008DF824A009E538780528A9D18DF820004C
+:10414000686A0D90B8680A90ADF824A08DF830B078
+:1041500080F80080617801291AD0D4E9092104F19E
+:104160002D03A66B03910096CDE9013204F16C0397
+:1041700004F15C0204F14C01401CFFF791F90021AD
+:1041800008A8FFF78BFA6078012805D015203FE6D4
+:10419000D4E90912631DE4E70E20287006208DF88B
+:1041A0002000686ACDF824B00D90A0788DF8280022
+:1041B000CBE438780328C0D1E079C00770D00F2055
+:1041C0002870072065E7387804286BD11422391D40
+:1041D00004F11400FAF729F9616A208CA1F80900AA
+:1041E000616AA078C871E179626A01F00301117215
+:1041F000616A627A0A73616AA07A81F824001620E3
+:104200005DE485F800A08DF82090696A50460D9114
+:1042100092E00000706302003878052842D1B86847
+:10422000A8616178606A022901D0012100E00021C3
+:1042300001EB4101142606EBC1014058082102F0B0
+:10424000A4F96178606A022901D0012100E000210F
+:1042500001EB410106EBC101425802A8E169FFF7F9
+:104260000BFA6078626A022801D0012000E0002089
+:1042700000EB4001102000EBC1000223105802A9FE
+:104280000932FEF7EEFF626AFD4B0EA80932A16902
+:10429000FFF7E1F96178606A022904D0012103E0A7
+:1042A00044E18DE0BFE0002101EB4101182606EB5F
+:1042B000C101A27840580EA9FAF7B7F86178606A90
+:1042C000022901D0012100E0002101EB410106EBB0
+:1042D000C1014158A0780B18C0F110020021184606
+:1042E000FAF7CDF805208DF82000686A0D90A869CE
+:1042F0000A90ADF824A08DF830B0062101706278E4
+:10430000616A022A01D0012200E0002202EB42028F
+:1043100006EBC202401C89581022FAF786F80021E9
+:1043200008A8FFF7BBF91220C5F818B028708DF85F
+:104330002090686A0D900B208DF8240005E43878F1
+:10434000052870D18DF82000686A0D90B8680A9031
+:104350000B20ADF824000A98072101706178626A89
+:10436000022901D0012100E0002101EB41031021CD
+:1043700001EBC30151580988A0F801106178626A05
+:10438000022902D0012101E02FE1002101EB4103CC
+:10439000142101EBC30151580A6840F8032F496802
+:1043A000416059E01920287001208DF8300074E632
+:1043B000162028708DF830B0002108A8FFF76EF99C
+:1043C000032617E114202870AEE6387805282AD194
+:1043D0008DF82000686A0D90B8680A90ADF824A0A6
+:1043E0008DF830B080F800906278616A4E46022AFB
+:1043F00001D0012200E0002202EB42021C2303EB69
+:10440000C202401C89581022FAF70FF8002108A8B0
+:10441000FFF744F9152028708DF82060686A0D9028
+:104420008DF8246039E680E0387805287DD18DF854
+:104430002000686A0D90B8680A90ADF824900921B0
+:1044400001706169097849084170616951F8012F6B
+:10445000C0F802208988C18020781C28A8D1A1E753
+:10446000E078C00702D04FF0060C01E04FF0070CD7
+:10447000607802280AD000BF4FF0000000EB040172
+:1044800001F1090105D04FF0010004E04FF00100F7
+:10449000F4E74FF000000B78204413EA0C030B7094
+:1044A00010F8092F02EA0C02027004D14FF01B0C25
+:1044B00084F800C0D2B394F801C0BCF1010F00D061
+:1044C0009BB990F800C0E0465FEACC7C04D028F0AD
+:1044D00001060670102606E05FEA887C05D528F004
+:1044E0000206067013262E70032694F801C0BCF154
+:1044F000020F00D092B991F800C05FEACC7804D0E6
+:104500002CF001060E70172106E05FEA8C7805D5C5
+:104510002CF002060E701921217000260078D0BB05
+:10452000CAB3C3BB1C20207035E012E002E038782B
+:10453000062841D11A2015E4207801283CD00C2807
+:104540003AD02046FFF7EBF809208DF82000686A82
+:104550000D9031E03878052805D006203870032604
+:104560001820287046E005208DF82000696A0D911A
+:10457000B9680A910221ADF8241001218DF830109C
+:104580000A990870287D4870394608A8FFF786F810
+:10459000064618202870012E0ED02BE001208DF841
+:1045A0002000686A0D9003208DF82400287D8DF886
+:1045B000250085F814B012E0287D80B11D20207000
+:1045C000172028708DF82090686A0D9002208DF8D1
+:1045D0002400394608A8FFF761F806460AE00CB146
+:1045E000FE2020709DF8200020B1002108A8FFF7D0
+:1045F00055F80CE413B03046BDE8F08F2DE9F043D8
+:1046000087B00C464E6900218DF8041001202578F2
+:10461000034602274FF007094FF0050C85B1012D25
+:1046200053D0022D39D1FE2030708DF80030606AF1
+:10463000059003208DF80400207E8DF8050063E0CE
+:104640002179012925D002292DD0032928D0042938
+:1046500023D1B17D022920D131780D1F042D04D33F
+:104660000A3D032D01D31D2917D12189022914D315
+:104670008DF80470237020899DF80410884201E0B1
+:104680006863020018D208208DF80000606A059067
+:1046900057E070780128EBD0052007B0BDE8F08323
+:1046A0001D203070E4E771780229F5D131780C29AA
+:1046B000F3D18DF80490DDE7083402F804CB94E8D8
+:1046C0000B0082E80B000320E7E71578052DE4D105
+:1046D0008DF800C0656A0595956802958DF81010F3
+:1046E00094F80480B8F1010F13D0B8F1020F2DD067
+:1046F000B8F1030F1CD0B8F1040FCED1ADF804709F
+:104700000E202870207E687000216846FEF7C6FFE4
+:104710000CE0ADF804700B202870207E002100F022
+:104720001F0068706846FEF7B9FF37700020B4E7D5
+:10473000ADF804708DF8103085F800C0207E6870E8
+:10474000277011466846FEF7A9FFA6E7ADF804906A
+:104750002B70207F6870607F00F00100A870A07F40
+:1047600000F01F00E870E27F2A71C0071CD094F8A7
+:10477000200000F00700687194F8210000F00700A5
+:10478000A87100216846FEF789FF2868F062A888B2
+:104790003086A87986F83200A0694078707528794B
+:1047A000B0700D203070C1E7A9716971E9E700B5FB
+:1047B00087B004280CD101208DF800008DF804008A
+:1047C000002005918DF8050001466846FEF766FF5A
+:1047D00007B000BD70B50C46054602F0BDF9214694
+:1047E0002846BDE870407823002202F00BB908B1DA
+:1047F000007870470C20704770B50C0005784FF0BA
+:1048000000010CD021702146F0F787FD694821781E
+:10481000405D884201D1032070BD022070BDF0F7D9
+:104820007CFD002070BD0279012A05D000220A70AB
+:104830004B78012B02D003E0042070470A758A618F
+:1048400002799300521C0271C15003207047F0B5E9
+:1048500087B00F4605460124287905EB800050F803
+:10486000046C7078411E02290AD252493A4608392E
+:1048700001EB8000314650F8043C28469847044636
+:104880000CB1012C11D12879401E10F0FF002871C5
+:1048900001D00324E0E70A208DF80000706A05903B
+:1048A000002101966846FFF7A7FF032CD4D007B07C
+:1048B0002046F0BD70B515460A4604462946104606
+:1048C000FFF7C5FF064674B12078FE280BD1207C87
+:1048D00030B100202870294604F10C00FFF7B7FF23
+:1048E0002046FEF71CFF304670BD704770B50E467F
+:1048F00004467C220021F9F7C2FD0225012E03D0D7
+:10490000022E04D0052070BD0120607000E06570AB
+:104910002046FEF704FFA575002070BD28B1027C7B
+:104920001AB10A4600F10C01C4E70120704710B526
+:10493000044686B0042002F00FF92078FE2806D045
+:1049400000208DF8000069462046FFF7E7FF06B01B
+:1049500010BD7CB50E4600218DF804104178012968
+:1049600003D0022903D0002405E0046900E0446973
+:104970000CB1217C89B16D4601462846FFF753FFF3
+:10498000032809D1324629462046FFF793FF9DF8B8
+:104990000410002900D004207CBD04F10C05EBE7D5
+:1049A00030B40C460146034A204630BC024B0C3A58
+:1049B000FEF751BEAC6302006863020070B50D469D
+:1049C000040012D08DB1220100212846F9F757FDCD
+:1049D000102255492846F9F728FD53480121083887
+:1049E000018044804560002070BD012070BD70B51D
+:1049F0004D4E00240546083E10E07068AA7B00EB8F
+:104A00000410817B914208D1C17BEA7B914204D1A1
+:104A10000C222946F9F7DCFC30B1641C3088844252
+:104A2000EBDB4FF0FF3070BD204670BD70B50D461A
+:104A3000060006D02DB1FFF7DAFF002803DB401C8B
+:104A400014E0102070BD384C083C20886288411C5E
+:104A5000914201D9042070BD6168102201EB001061
+:104A60003146F9F7E2FC2088401C208028700020A5
+:104A700070BD2D480838008870472B4908390888D0
+:104A8000012802D0401E08800020704770B51446EF
+:104A90000D0018D0BCB10021A170022802D010284E
+:104AA00011D105E0288870B10121A170108008E0C3
+:104AB0002846FFF79CFF002805DB401CA070A88952
+:104AC0002080002070BD012070BD70B505461446E1
+:104AD0000E000BD000203070A878012808D005D92E
+:104AE0001149A1F108010A8890420AD9012070BD3C
+:104AF00024B1287820702888000A5070022008709D
+:104B00000FE064B14968102201EB00112046103912
+:104B1000F9F78BFC287820732888000A607310202E
+:104B20003070002070BD0000900000202DE9F041A1
+:104B300090460C4607460025FE48072F00EB8816D6
+:104B400007D2DFE807F00707070704040400012580
+:104B500000E0FFDF06F81470002D13D0F548803018
+:104B600000EB880191F82700202803D006EB4000D5
+:104B7000447001E081F8264006EB4402202050708A
+:104B800081F82740BDE8F081F0B51F4614460E4677
+:104B90000546202A00D1FFDFE649E648803100EBD8
+:104BA000871C0CEB440001EB8702202E07D00CEB96
+:104BB000460140784B784870184620210AE092F868
+:104BC0002530407882F82500F6E701460CEB4100DD
+:104BD00005704078A142F8D192F82740202C03D0EC
+:104BE0000CEB4404637001E082F826300CEB4104C6
+:104BF0002023637082F82710F0BD30B50D46CE4BF0
+:104C000044190022181A72EB020100D2FFDFCB48D0
+:104C1000854200DDFFDFC9484042854200DAFFDF00
+:104C2000C548401C844207DA002C01DB204630BD19
+:104C3000C148401C201830BDBF48C043FAE710B53A
+:104C400004460168407ABE4A52F82020114450B10F
+:104C50000220084420F07F40EDF7EDFF94F90810A2
+:104C6000BDE81040C9E70420F3E72DE9F047B14E55
+:104C7000803696F82D50DFF8BC9206EB850090F850
+:104C8000264034E009EB85174FF0070817F81400A9
+:104C9000012806D004282ED005282ED0062800D0C2
+:104CA000FFDF01F01BF9014607EB4400427806EBF9
+:104CB000850080F8262090F82720A24202D12022E9
+:104CC00080F82720084601F014F92A4621460120E1
+:104CD000FFF72CFF9B48414600EB0410026820467A
+:104CE000904796F82D5006EB850090F82640202C32
+:104CF000C8D1BDE8F087022000E003208046D0E75D
+:104D000010B58C4C2021803484F8251084F82610AE
+:104D100084F82710002084F8280084F82D0084F8F7
+:104D20002E10411EA16044F8100B20746074207393
+:104D30006073A0738449E077207508704870002183
+:104D40007C4A103C02F81100491CC9B22029F9D351
+:104D50000120EDF760FE0020EDF75DFE012084F8F4
+:104D60002200EEF789F87948EEF79BF8764CA41EFE
+:104D700020707748EEF795F86070BDE81040EDF7C9
+:104D8000D7BD10B5EDF7F9FD6F4CA41E2078EEF7F6
+:104D9000A1F86078EEF79EF8BDE8104001F0D6B8B3
+:104DA000202070470020EDF70FBE70B505460124A6
+:104DB0000E46AC405AB1FFF7F5FF0146654800EBDF
+:104DC000C500C0F81015C0F81465634801E06248DA
+:104DD000001D046070BD2DE9F34F564C0025803452
+:104DE00004EB810A89B09AF82500202821D0691E99
+:104DF00002915449009501EB0017391D03AB07C917
+:104E000083E80700A18BADF81C10A07F8DF81E0071
+:104E10009DF81500A046C8B10226494951F8204026
+:104E20000399A219114421F07F41019184B102211B
+:104E30000FE00120EDF7EFFD0020EDF7ECFDEDF7C1
+:104E4000BAFD01F083F884F82F50A9E00426E4E7C6
+:104E500000218DF81810022801D0012820D10398D4
+:104E600001190998081A801C9DF81C1020F07F4039
+:104E700001B10221353181420BD203208DF815009A
+:104E80000398C4F13201401A20F07F40322403908D
+:104E90000CE098F8240018B901F039FA002863D022
+:104EA000322C03D214B101F045F801E001F04EF8C4
+:104EB000254A107818B393465278039B121B0021A1
+:104EC0009DF81840994601281AD0032818D00020D0
+:104ED0008DF81E00002A04DD981A039001208DF839
+:104EE00018009DF81C0000B1022103981B4A20F015
+:104EF0007F40039003AB099801F034F810B110E043
+:104F00000120E5E79DF81D0018B99BF80000032873
+:104F100029D08DF81C50CDF80C908DF818408DF8E4
+:104F20001E509DF8180010B3039801238119002228
+:104F3000184615E0840A0020FF7F841E0020A10788
+:104F4000BC63020084080020A2000020B3680100B6
+:104F50006B4C010000F0014004F50140FFFF3F00F1
+:104F6000EDF7ACFD06E000200BB0BDE8F08F0120AE
+:104F7000EDF751FD97F90C20012300200199EDF781
+:104F80009DFDF87BC00701D0EDF781FE012188F877
+:104F90002F108AF8285020226946FE48F9F745FA72
+:104FA0000120E1E72DE9F05FDFF8E883064608EB32
+:104FB000860090F82550202D1FD0A8F180002C46A7
+:104FC00000EB8617A0F50079DFF8CCB305E0A24628
+:104FD00007EB4A004478202C0AD0EDF7BAFD09EB24
+:104FE00004135A4601211B1D00F0BCFF0028EED01F
+:104FF000AC4202D0334652461EE0E84808B1AFF357
+:105000000080EDF7A6FD98F82F206AB1D8F80C20A3
+:10501000411C891A0902CA1701EB12610912002901
+:1050200002DD0020BDE8F09F3146FFF7D4FE08B155
+:105030000120F7E733462A4620210420FFF7A4FD8C
+:10504000EFE72DE9F041D34C2569EDF782FD401BD8
+:105050000002C11700EB1160001200D4FFDF94F8CA
+:10506000220000B1FFDF012784F8227094F82E009F
+:10507000202800D1FFDF94F82E60202084F82E0035
+:10508000002584F82F5084F8205084F82150C4481B
+:1050900025600078022833D0032831D00020207703
+:1050A000A068401C05D04FF0FF30A0600120EDF754
+:1050B000B2FC0020EDF7AFFCEDF7ABFDEDF7A3FD83
+:1050C000EDF779FC0FF0D2FDB648056005604FF0B2
+:1050D000E0214FF40040B846C1F88002EDF745FEEC
+:1050E00094F82D703846FFF75DFF0028FAD0A948E4
+:1050F000803800EB871010F81600022802D006E076
+:105100000120CCE73A4631460620FFF70FFD84F830
+:10511000238004EB870090F82600202804D0A048C4
+:10512000801E4078EDF7DCFE207F002803D0EDF7ED
+:1051300060FD2577657725E5964910B591F82D2016
+:105140000024803901EB821111F814302BB1641C5A
+:10515000E4B2202CF8D3202010BD934901EB0411B8
+:1051600008600020C87321460120FFF7DFFC2046BD
+:1051700010BD10B5012801D0032800D171B3854AB4
+:1051800092F82D30834C0022803C04EB831300BF47
+:1051900013F812400CB1082010BD521CD2B2202AC4
+:1051A000F6D37F4A48B1022807D0072916D2DFE894
+:1051B00001F01506080A0C0E100000210AE01B2160
+:1051C00008E03A2106E0582104E0772102E0962128
+:1051D00000E0B52151701070002010BD072010BDF7
+:1051E0006F4810B54078EDF726FD80B210BD10B5C0
+:1051F000202811D2674991F82D30A1F1800202EBED
+:10520000831414F810303BB191F82D3002EB831267
+:1052100012F81020012A01D0002010BD91F82D2095
+:1052200001460020FFF782FC012010BD10B5EDF70C
+:1052300090FCBDE81040EDF7FEBC2DE9F0410E46B4
+:10524000544F01782025803F0C4607EB831303E081
+:10525000254603EB45046478944202D0202CF7D114
+:1052600008E0202C06D0A14206D103EB4101497889
+:10527000017007E0002085E403EB440003EB4501E7
+:1052800040784870494F7EB127B1002140F22D404F
+:10529000AFF300803078A04206D127B100214FF44F
+:1052A0008660AFF30080357027B1002140F23540B1
+:1052B000AFF30080012065E410B542680B689A1ACC
+:1052C0001202D41702EB1462121216D4497A91B169
+:1052D000427A82B9364A006852F82110126819449D
+:1052E0001044001D891C081A0002C11700EB116050
+:1052F0000012322801DB012010BD002010BD2DE975
+:10530000F047294E814606F500709846144600EB9A
+:10531000811712E006EB0415291D4846FFF7CCFF64
+:1053200068B988F80040A97B99F80A00814201D841
+:105330000020DEE407EB44004478202CEAD1012071
+:10534000D7E42DE9F047824612480E4600EB86006E
+:10535000DFF8548090F825402020107008F5007088
+:105360009946154600EB86170BE000BF08EB0410CA
+:105370005146001DFFF7A0FF28B107EB44002C7039
+:105380004478202CF2D1297889F800104B46224627
+:1053900031460FE0040B0020FFFF3F00000000003B
+:1053A000A200002000F5004084080020000000005A
+:1053B000BC6302005046BDE8F047A0E72DE9FC4180
+:1053C0000E4607460024FE4D09E000BF9DF8000090
+:1053D00005EB00108168384600F0D8FD01246B46CB
+:1053E00001AA31463846FFF7ACFF0028EED0204630
+:1053F000BDE8FC8170B50446F2480125A54300EBE9
+:10540000841100EB85104022F9F70FF8EE4E26B11B
+:1054100000214FF49360AFF30080EA48803000EB46
+:10542000850100EB8400D0F82500C1F8250026B1E5
+:10543000002140F29C40AFF30080284670BD8A42B4
+:1054400003D003460520FFF79FBB202906D0DD4A85
+:1054500002EB801000EB410040787047D949803161
+:1054600001EB800090F825007047D54901EB001052
+:10547000001DFFF7E4BB7CB51D46134604460E46EF
+:1054800000F1080221461846EDF7E2FB94F9080006
+:105490000F2804DD1F3820722068401C206096B160
+:1054A0000220CA4951F82610461820686946801B18
+:1054B00020F07F40206094F908002844C01C1F2879
+:1054C00003DA012009E00420EBE701AAEDF7C0FBB5
+:1054D0009DF8040010B10098401C009000992068CD
+:1054E00031440844C01C20F07F4060607CBDFEB5A4
+:1054F0000C46064609786079907220791F46154659
+:10550000507279B1217900222846A368FFF7B3FFD2
+:10551000AC492846803191F82E20202A0AD009690A
+:10552000491D0DE0D4E90223217903B02846BDE8E6
+:10553000F040A0E7A6494978052900D20521314469
+:1055400021F07F4100F022FD39462846FFF736FF63
+:10555000D4E9023221796846FFF78DFF2B460021FE
+:105560003046019A00F0FEFC002806D103B0314617
+:105570002846BDE8F04000F009BDFEBD2DE9FE4F14
+:10558000814600F0BFFC38B15FF0000799F80000D9
+:1055900020B10020BDE8FE8F0127F7E7894D8A4C36
+:1055A0004FF0000A803524B1002140F2FF40AFF3F4
+:1055B000008095F82D8085F823A0002624B10021D5
+:1055C00040F20450AFF300801FB94046FFF712FFCE
+:1055D000804624B1002140F20C50AFF30080EDF77B
+:1055E000B8FA43466A464946FFF781FF24B10021D5
+:1055F00040F21250AFF3008095F82E0020280CD016
+:1056000029690098401A0002C21700EB12600012CC
+:1056100003D5684600F0BAFC012624B1002140F20F
+:105620001C50AFF3008095F823000028BBD124B1B3
+:10563000002140F22250AFF30080EDF78AFA6B466A
+:10564000644A002100F08EFC0028A3D027B941460F
+:105650006846FFF7B3FE064326B16846FFF7EFFA48
+:10566000C9F8080024B1002140F23550AFF30080A2
+:1056700001208FE72DE9F04F89B08B46824600F07C
+:1056800041FC504C803428B39BF80000002710B137
+:10569000012800D0FFDF4C4D25B1002140F2F7502A
+:1056A000AFF300804649012001EB0A18A946079094
+:1056B0005FEA090604D0002140F2FF50AFF30080FA
+:1056C000079800F016FC94F82D50002084F8230071
+:1056D00067B119E094F82E000127202800D1FFDFE0
+:1056E0009BF800000028D6D0FFDFD4E72846FFF75C
+:1056F00081FE054626B1002140F20960AFF300802B
+:1057000094F823000028D3D126B1002140F2136081
+:10571000AFF30080EDF71DFA2B4602AA5946079019
+:10572000FFF7E5FE98F80F005FEA060900F00100B8
+:105730008DF8130004D0002140F21D60AFF300800B
+:105740003B462A4602A9CDF800A0079800F029FCA4
+:10575000064604EB850090F828000090B9F1000F90
+:1057600004D0002140F22460AFF3008000F0B6FBCB
+:105770000790B9F1000F04D0002140F22A60AFF386
+:10578000008094F82300002892D1B9F1000F04D0D2
+:10579000002140F23260AFF300800DF1080C9CE86C
+:1057A0000E00C8E90112C8F80C30B6B35FEA09066A
+:1057B00004D0002140F23F60AFF3008000980BE07E
+:1057C00084080020840A002000000000BC6302005E
+:1057D000A2000020FFFF3F00B84312D094F82E0033
+:1057E00020280ED126B1002140F24460AFF30080A2
+:1057F0002846FFF7D7FB20B99BF80000D8B3012853
+:1058000049D0B9F1000F04D0002140F26160AFF33C
+:105810000080284600F05BFB01265FEA090504D002
+:10582000002140F26A60AFF30080079800F061FB4E
+:1058300025B1002140F26E60AFF300808EB194F884
+:105840002D0004EB800090F82600202809D025B117
+:10585000002140F27560AFF30080F8484078EDF722
+:105860003FFB25B1002140F27A60AFF3008009B020
+:105870003046BDE8F08FFFE7B9F1000F04D00021FA
+:1058800040F24C60AFF3008094F82D205146042084
+:10589000FFF74CF9C0E7002E3FF40AAF002140F2B9
+:1058A0005760AFF3008003E72DE9F84FE44D8146E0
+:1058B00095F82D004FF00008E24C4FF0010B4746E1
+:1058C00024B100214FF4D160AFF30080584600F0BE
+:1058D00010FB85F8237024B1002140F28D60AFF3F6
+:1058E000008095F82D00FFF785FD064695F823000A
+:1058F00028B1002CE4D0002140F293604BE024B1A9
+:10590000002140F29760AFF30080CD48803800EB73
+:10591000861111F81900032856D1334605EB830A86
+:105920004A469AF82500904201D1012000E000206B
+:1059300000900AF125000021FFF77FFC0146009846
+:10594000014203D001228AF82820AF77E1B324B1C5
+:10595000002140F29C60AFF30080324649460120AE
+:10596000FFF7E4F89AF828A024B1002140F2A760DC
+:10597000AFF3008000F0B2FA834624B1002140F278
+:10598000AC60AFF3008095F8230038B1002C97D0BD
+:1059900000214FF4D660AFF3008091E7BAF1000F19
+:1059A00007D095F82E00202803D13046FFF7FAFAE9
+:1059B000E0B124B1002140F2C460AFF30080304672
+:1059C00000F085FA4FF0010824B1002140F2CD60CB
+:1059D000AFF30080584600F08CFA24B1002140F269
+:1059E000D160AFF300804046BDE8F88F002CF1D0C5
+:1059F000002140F2BF60AFF30080E6E70120ECF742
+:105A0000E3BF8E48007870472DE9F0418C4C94F844
+:105A10002E0020281FD194F82D6004EB860797F8FC
+:105A20002550202D00D1FFDF8549803901EB8610FC
+:105A300000EB4500407807F8250F0120F87084F846
+:105A40002300294684F82E50324602202234FFF7E4
+:105A50006DF8002020700EE42DE9F0417A4E784C6C
+:105A6000012538B1012821D0022879D003287DD022
+:105A7000FFDF20E400F05EFAFFF7C6FF207E00B1F2
+:105A8000FFDF84F821500020ECF7C5FFA168481C17
+:105A900004D0012300221846EDF710F814F82E0F59
+:105AA000217806EB01110A68012154E0FFF7ACFFF1
+:105AB0000120ECF7B0FF94F8210050B1A068401C21
+:105AC00007D014F82E0F217806EB01110A68062181
+:105AD00041E0207EDFF86481002708F102080128F8
+:105AE00003D002281ED0FFDFB5E7A777EDF781F8D6
+:105AF00098F80000032801D165772577607D534928
+:105B000051F8200094F8201051B948B16168012380
+:105B1000091A00221846ECF7D1FF022020769AE7F6
+:105B2000277698E784F8205000F004FAA07F50B15F
+:105B300098F8010061680123091A00221846ECF761
+:105B4000BDFF257600E0277614F82E0F217806EBAE
+:105B500001110A680021BDE8F041104700E005E0AE
+:105B600036480078BDE8F041EDF7BAB9FFF74CFFD1
+:105B700014F82E0F217806EB01110A680521EAE7D7
+:105B800010B52F4C94F82E00202800D1FFDF14F818
+:105B90002E0F21782C4A02EB01110A68BDE8104053
+:105BA000042110477CB5264C054694F82E00202889
+:105BB00000D1FFDFA068401C00D0FFDF94F82E006A
+:105BC000214901AA01EB0010694690F90C00284414
+:105BD000EDF73EF89DF904000F2801DD012000E0FB
+:105BE0000020009908446168084420F07F41A160CA
+:105BF00094F82100002807D002B00123BDE87040CE
+:105C000000221846ECF75ABF7CBD30B5104A0B1A7B
+:105C1000541CB3EB940F1FD3451AB5EB940F1BD351
+:105C2000934203D9101A43185B1C15E0954211D911
+:105C3000511A0844401C43420EE00000A00000201E
+:105C4000040B00200000000084080020BC63020058
+:105C5000FF7F841EFFDF0023184630BD0123002292
+:105C600001460220ECF72ABF0220ECF7D4BEECF785
+:105C700070BF2DE9FE4FED4C05468A4694F82E0084
+:105C8000202800D1FFDFE94E94F82E10A0462046D0
+:105C9000A6F5207202EB011420218DF8001090F877
+:105CA0002D10376900EB8101D8F8000091F825909C
+:105CB000284402AA01A90C36ECF7CAFF9DF9080096
+:105CC000002802DD0198401C0190A0680199642D14
+:105CD000084451D3D64B00225B1B72EB02014BD31D
+:105CE0006168411A21F07F41B1F5800F44D220F064
+:105CF0007F40706086F80AA098F82D1044466B46E5
+:105D00004A463046FFF7FBFAA8B3A068401C10D003
+:105D1000ECF71FFFA168081A0002C11700EB116021
+:105D2000001202282ADD0120ECF775FE4FF0FF304B
+:105D3000A06094F82D009DF8002020210F34FFF77B
+:105D40007EFBA17FB94A803A02EB8111E27F01EB31
+:105D50004201487054F80F0C284444F80F0C0120FD
+:105D600020759DF80000202803D0B2484078EDF758
+:105D7000B7F801200EE401E000200BE47760FBE7B8
+:105D80002DE9F047A94C074694F82D00A4F18006B0
+:105D900006EB801010F8170000B9FFDF94F82D50C3
+:105DA000A046A54C24B1002140F6E800AFF30080E6
+:105DB00040F6F40940F6FD0A06EB851616F81700C2
+:105DC000012819D0042811D005280FD006280DD09D
+:105DD0001CB100214846AFF30080EDF705F9002C17
+:105DE000ECD000215046AFF30080E7E72A46394661
+:105DF0000120FEF79BFEF2E74FF0010A4FF0000989
+:105E0000454624B1002140F60410AFF3008050460F
+:105E100000F06FF885F8239024B1002140F60910B6
+:105E2000AFF3008095F82D00FFF7E4FA064695F8E9
+:105E3000230028B1002CE4D0002140F60F101FE011
+:105E400024B1002140F61310AFF3008005EB86006B
+:105E500000F1270133463A462630FFF7EEF924B128
+:105E6000002140F61710AFF3008000F037F88246AB
+:105E700095F8230038B1002CC3D0002140F61D1046
+:105E8000AFF30080BDE785F82D60012085F8230081
+:105E9000504600F02EF8002C04D0002140F62A10C5
+:105EA000AFF30080BDE8F08730B504465F480D468B
+:105EB00090F82D005D49803901EB801010F8140036
+:105EC00000B9FFDF5D4800EB0410C57330BD5749D2
+:105ED00081F82D00012081F82300704710B5584843
+:105EE00008B1AFF30080EFF3108000F0010072B64C
+:105EF00010BD10B5002804D1524808B1AFF300809E
+:105F000062B610BD50480068C005C00D10D01038F2
+:105F100040B2002804DB00F1E02090F8000405E026
+:105F200000F00F0000F1E02090F8140D40097047D8
+:105F30000820704710B53D4C94F82400002804D187
+:105F4000F5F7B2FE012084F8240010BD10B5374CDF
+:105F500094F82400002804D0F5F7CFFE002084F840
+:105F6000240010BD10B51C685B68241A181A24F0B0
+:105F70007F4420F07F40A14206D8B4F5800F03D2C1
+:105F8000904201D8012010BD002010BDD0E90032A0
+:105F9000D21A21F07F43114421F07F41C0E9003142
+:105FA00070472DE9FC418446204815468038089CFE
+:105FB00000EB85160F4616F81400012804D00228BD
+:105FC00002D00020BDE8FC810B46204A012160463A
+:105FD000FFF7C8FFF0B101AB6A4629463846FFF724
+:105FE000B0F9B8B19DF804209DF800102846FFF7DD
+:105FF00026FA06EB440148709DF8000020280DD0D9
+:1060000006EB400044702A4621460320FEF78EFD31
+:106010000120D7E72A4621460420F7E7034801215B
+:1060200000EB850000F8254FC170ECE7040B002061
+:10603000FF1FA107A000002000000000840800202E
+:10604000000000000000000004ED00E0FFFF3F0042
+:106050002DE9F041044680074FF000054FF001069E
+:106060000CD56B480560066000F0DEF920B1694888
+:10607000016841F48061016024F00204E0044FF003
+:10608000FF3705D564484660C0F8087324F480548F
+:10609000600003D56148056024F08044E0050FD519
+:1060A0005F48C0F80052C0F808735E490D60091DD2
+:1060B0000D605C4A04210C321160066124F4807486
+:1060C000A00409D558484660C0F80052C0F80873CB
+:1060D0005648056024F40054C4F38030C4F3C03142
+:1060E000884200D0FFDF14F4404F14D0504846607F
+:1060F000C0F808734F488660C0F80052C0F80873B3
+:106100004D490D600A1D16608660C0F808730D6069
+:10611000166024F4404420050AD54848466086604D
+:10612000C0F80873C0F848734548056024F400645B
+:106130000EF076FD4348044200D0FFDFBDE8F08159
+:10614000F0B50022202501234FEA020420FA02F1D3
+:10615000C9072DD051B2002910DB00BF4FEA5117FB
+:106160004FEA870701F01F0607F1E02703FA06F65A
+:10617000C7F88061BFF34F8FBFF36F8F0CDB00BF99
+:106180004FEA51174FEA870701F01F0607F1E02792
+:1061900003FA06F6C7F8806204DB01F1E02181F81A
+:1061A000004405E001F00F0101F1E02181F8144DF8
+:1061B00002F10102AA42C9D3F0BD10B5224C206001
+:1061C0000846F5F78AFE2068FFF742FF2068FFF7D0
+:1061D000B7FF0EF04BF900F088F90EF021FD0EF03C
+:1061E0005EFCECF749FEBDE810400EF0F3B910B5C7
+:1061F000154C2068FFF72CFF2068FFF7A1FF0EF079
+:106200000FFDF5F769FF0020206010BD0A207047E0
+:10621000FC1F00403C17004000C0004004E5014066
+:10622000008000400485004000D0004004D50040BC
+:1062300000E0004000F0004000F5004000B00040E9
+:1062400008B50040FEFF0FFDA400002070B52649F0
+:106250000A680AB30022154601244B685B1C4B6098
+:106260000C2B00D34D600E7904FA06F30E681E4223
+:106270000FD0EFF3108212F0010272B600D00122AB
+:106280000C689C430C6002B962B64968016000204A
+:1062900070BD521C0C2AE0D3052070BD4FF0E021E8
+:1062A0004FF48000C1F800027047EFF3108111F045
+:1062B000010F72B64FF0010202FA00F20A480368B9
+:1062C00042EA0302026000D162B6E7E70648002115
+:1062D0000160416070470121814003480068084027
+:1062E00000D0012070470000A80000200120810795
+:1062F000086070470121880741600021C0F8001143
+:1063000018480170704717490120087070474FF016
+:106310008040D0F80001012803D0124800780028FE
+:1063200000D00120704710480068C00700D001204D
+:1063300070470D480C300068C00700D0012070473E
+:106340000948143000687047074910310A68D203C1
+:1063500006D5096801F00301814201D1012070478F
+:1063600000207047B0000020080400404FF080502B
+:10637000D0F830010A2801D0002070470120704772
+:1063800000B5FFF7F3FF20B14FF08050D0F8340193
+:1063900008B1002000BD012000BD4FF08050D0F8B2
+:1063A0003001062803D0401C01D000207047012096
+:1063B00070474FF08050D0F830010D2801D00020F8
+:1063C0007047012070474FF08050D0F83001082806
+:1063D00001D000207047012070474FF08050D0F866
+:1063E0003001102801D0002070470120704700B50F
+:1063F000FFF7F3FF30B9FFF7DCFF18B9FFF7E3FF52
+:10640000002800D0012000BD00B5FFF7C6FF38B15D
+:106410004FF08050D0F83401062803D3401C01D03F
+:10642000002000BD012000BD00B5FFF7B6FF48B158
+:106430004FF08050D0F83401062803D3401C01D01F
+:10644000012000BD002000BD0021017008467047FA
+:106450000146002008707047EFF3108101F0010140
+:1064600072B60278012A01D0012200E00022012345
+:10647000037001B962B60AB1002070474FF40050B2
+:106480007047E9E7EFF3108111F0010F72B64FF09A
+:106490000002027000D162B600207047F2E70000EF
+:1064A0002DE9F04115460E460446002700F0EBF8B2
+:1064B000A84215D3002341200FE000BF94F84220EA
+:1064C000A25CF25494F84210491CB1FBF0F200FBBC
+:1064D00012115B1C84F84210DBB2AB42EED30127F1
+:1064E00000F0DDF83846BDE8F081724910B5802033
+:1064F00081F800047049002081F8420081F84100D1
+:10650000433181F8420081F84100433181F8420073
+:1065100081F841006948FFF797FF6848401CFFF782
+:1065200093FFECF731FCBDE8104000F0B8B8402014
+:106530007047614800F0A7B80A4601465E48AFE7D9
+:10654000402070475C48433000F09DB80A46014641
+:1065500059484330A4E7402101700020704710B52E
+:1065600004465548863000F08EF82070002010BD9B
+:106570000A460146504810B58630FFF791FF08B132
+:10658000002010BD42F2070010BD70B50C46064653
+:10659000412900D9FFDF4A480068103840B200F0B6
+:1065A00054F8C5B20D2000F050F8C0B2854201D3B6
+:1065B000012504E0002502E00DB1ECF728FC22469D
+:1065C00031463D48FFF76CFF0028F5D070BD2DE93E
+:1065D000F0413A4F0025064617F1040757F82540C9
+:1065E000204600F041F810B36D1CEDB2032DF5D339
+:1065F0003148433000F038F8002825D02E4800F00C
+:1066000033F8002820D02C48863000F02DF80028E0
+:106610001AD0ECF7D2FB2948FFF71EFFB0F5005F58
+:1066200000D0FFDFBDE8F0412448FFF72BBF94F80E
+:1066300041004121265414F8410F401CB0FBF1F2F7
+:1066400001FB12002070D3E74DE7002804DB00F1C6
+:10665000E02090F8000405E000F00F0000F1E020D9
+:1066600090F8140D4009704710F8411F4122491C51
+:10667000B1FBF2F302FB13114078814201D10120FA
+:1066800070470020704710F8411F4078814201D3C5
+:10669000081A02E0C0F141000844C0B2704710B5CA
+:1066A0000648FFF7D9FE002803D1BDE81040ECF7FB
+:1066B0006FBB10BD0DE000E0340B0020B4000020E3
+:1066C00004ED00E070B5154D2878401CC4B2687820
+:1066D000844202D000F0DBFA2C7070BD2DE9F0414D
+:1066E0000E4C4FF0E02600BF00F0C6FAECF77CFC41
+:1066F00040BF20BF677820786070D6F80052EAF774
+:1067000049FE854305D1D6F8040210B92078B84275
+:10671000EAD000F0ACFA0020BDE8F081C40000200F
+:106720002DE9F04101264FF0E02231034FF000083F
+:106730004046C2F88011BFF34F8FBFF36F8F204CDC
+:10674000C4F800010C2000F02EF81E4D2868C0434C
+:1067500040F30017286840F010002860C4F8046374
+:1067600026607F1C02E000BFECF73EFCD4F800017D
+:106770000028F9D01FB9286820F0100028601248BE
+:1067800005686660C4F80863C4F800810C2000F056
+:106790000AF82846BDE8F08110B50446FFF7C0FFAF
+:1067A0002060002010BD002809DB00F01F0201213D
+:1067B00091404009800000F1E020C0F8801270474D
+:1067C00000C0004010ED00E008C500402DE9F04792
+:1067D000FF4C0646FF21A06800EB061211702178DD
+:1067E000FF2910D04FF0080909EB011109EB06173A
+:1067F0004158C05900F0F4F9002807DDA16820785D
+:1068000001EB061108702670BDE8F08794F800804F
+:1068100045460DE0A06809EB05114158C05900F04C
+:10682000DFF9002806DCA068A84600EB0810057810
+:10683000FF2DEFD1A06800EB061100EB08100D70E2
+:106840000670E1E7F0B5E24B0446002001259A68A6
+:106850000C269B780CE000BF05EB0017D75DA74224
+:1068600004D106EB0017D7598F4204D0401CC0B2A8
+:106870008342F1D8FF20F0BD70B5FFF7F8F9D44C92
+:1068800008252278A16805EB0212895800F0A8F9C2
+:10689000012808DD2178A06805EB01114058BDE80A
+:1068A0007040FFF7DBB9FFF7ACF8BDE87040ECF7DC
+:1068B00017BB2DE9F041C64C2578FFF7D8F9FF2D1D
+:1068C0006ED04FF00808A26808EB0516915900F049
+:1068D00087F90228A06801DD80595DE000EB051111
+:1068E00009782170022101EB0511425C5AB1521E58
+:1068F0004254815901F5800121F07F4181512846A0
+:10690000FFF764FF34E00423012203EB051302EBDD
+:10691000051250F803C0875CBCF1000F10D0BCF525
+:10692000007F10D9CCF3080250F806C00CEB423CB3
+:106930002CF07F4C40F806C0C3589A1A520A09E05E
+:10694000FF2181540AE0825902EB4C3222F07F424F
+:106950008251002242542846FFF738FF0C21A068DC
+:1069600001EB05114158E06850F827203846904760
+:106970002078FF2814D0FFF77AF92278A16808EB75
+:1069800002124546895800F02BF9012893DD217841
+:10699000A06805EB01114058BDE8F041FFF75EB972
+:1069A000BDE8F081F0B51D4614460E460746FF2BA4
+:1069B00000D3FFDFA00700D0FFDF8548FF210022C2
+:1069C000C0E90247C57006710170427082701046BE
+:1069D000012204E002EB0013401CE154C0B2A842C3
+:1069E000F8D3F0BD70B57A4C0646657820798542BB
+:1069F00000D3FFDFE06840F825606078401C6070DD
+:106A0000284670BD2DE9FF5F1D468B460746FF24D3
+:106A1000FFF72DF9DFF8B891064699F80100B84262
+:106A200000D8FFDF00214FF001084FF00C0A99F861
+:106A30000220D9F808000EE008EB0113C35CFF2B1D
+:106A40000ED0BB4205D10AEB011350F803C0DC4560
+:106A50000CD0491CC9B28A42EED8FF2C02D00DE0FE
+:106A60000C46F6E799F803108A4203D1FF2004B0E0
+:106A7000BDE8F09F1446521C89F8022008EB04116F
+:106A80000AEB0412475440F802B00421029B002292
+:106A9000012B01EB04110CD040F801204FF40078D9
+:106AA00008234FF0020C454513D9E905C90D02D062
+:106AB00002E04550F2E7414606EB413203EB041396
+:106AC00022F07F42C250691A0CEB0412490A815429
+:106AD0000BE005B9012506EB453103EB041321F06A
+:106AE0007F41C1500CEB0411425499F800502046EC
+:106AF000FFF76CFE99F80000A84201D0FFF7BCFE3A
+:106B00003846B4E770B50C460546FFF7B0F80646C0
+:106B100021462846FFF796FE0446FF281AD02C4D42
+:106B2000082101EB0411A8684158304600F058F8DC
+:106B300000F58050C11700EBD14040130221AA6834
+:106B400001EB0411515C09B100EB4120002800DC8D
+:106B5000012070BD002070BD2DE9F04788468146B8
+:106B6000FFF770FE0746FF281BD0194D2E78A86846
+:106B70003146344605E0BC4206D0264600EB0612FC
+:106B80001478FF2CF7D10CE0FF2C0AD0A6420CD1D0
+:106B900000EB011000782870FF2804D0FFF76CFE8E
+:106BA00003E0002030E6FFF75FF841464846FFF774
+:106BB000A9FF0123A968024603EB0413FF20C85470
+:106BC000A878401EB84200D1A87001EB041001E083
+:106BD000000C002001EB061100780870104613E647
+:106BE000081A0002C11700EB116000127047000084
+:106BF00010B5202000F07FF8202000F08DF84D49DE
+:106C0000202081F80004EAF7C3FB4B4908604B4899
+:106C1000D0F8041341F00101C0F80413D0F80413B4
+:106C200041F08071C0F80413424901201C39C1F8B9
+:106C3000000110BD10B5202000F05DF83E48002195
+:106C4000C8380160001D01603D4A481E10603B4A83
+:106C5000C2F80803384B1960C2F80001C2F860019D
+:106C600038490860BDE81040202000F055B834498C
+:106C70003548091F0860704731493348086070473C
+:106C80002D48C8380160001D521E026070472C4913
+:106C900001200860BFF34F8F70472DE9F04128496C
+:106CA000D0F8188028480860244CD4F8000100254A
+:106CB000244E6F1E28B14046EAF7C4FA40B90021BD
+:106CC00011E0D4F8600198B14046EAF7BBFA48B148
+:106CD000C4F80051C4F860513760BDE8F04120208D
+:106CE00000F01AB831684046BDE8F0410FF0DAB85C
+:106CF000FFDFBDE8F08100280DDB00F01F0201215D
+:106D000091404009800000F1E020C0F88011BFF3FD
+:106D10004F8FBFF36F8F7047002809DB00F01F0211
+:106D2000012191404009800000F1E020C0F880126C
+:106D30007047000020E000E0C8060240000002406A
+:106D40001805024000040240010000015E480021D5
+:106D50000170417010218170704770B5054616466C
+:106D60000C460220EBF7B2FD574901200870574945
+:106D7000F01E086056480560001F046070BD10B525
+:106D80000220EBF7A3FD5049012008705148002173
+:106D9000C0F80011C0F80411C0F808114E494FF4B2
+:106DA0000000086010BD48480178D9B14B4A4FF443
+:106DB000000111604749D1F800310022002B1CBFAF
+:106DC000D1F80431002B02D0D1F8081119B142706A
+:106DD0004FF0100104E04FF0010141704049096893
+:106DE000817002704FF00000EBF770BD10B502200B
+:106DF000EBF76CFD34480122002102703548C0F8E1
+:106E00000011C0F80411C0F80811026010BD2E482E
+:106E10000178002904BF407870472E48D0F800114F
+:106E2000002904BF02207047D0F8001100291CBFC0
+:106E3000D0F80411002905D0D0F80801002804BFBB
+:106E400001207047002070471F4800B50278214B91
+:106E50004078C821491EC9B282B1D3F800C1BCF143
+:106E6000000F10D0D3F8000100281CBFD3F8040194
+:106E700000280BD0D3F8080150B107E0022802D057
+:106E8000012805D002E00029E4D1FFDF002000BD89
+:106E9000012000BD0C480178002904BF80787047AC
+:106EA0000C48D0F8001100291CBFD0F804110029AB
+:106EB00002D0D0F8080110B14FF010007047084818
+:106EC0000068C0B270470000C600002010F5004006
+:106ED00008F5004000F0004004F5014008F50140CD
+:106EE00000F400405748002101704170704770B5B0
+:106EF000064614460D460120EBF7E8FC52480660B2
+:106F0000001D0460001D056050490020C1F85001BB
+:106F10004F490320086050494E480860091D4F48FA
+:106F2000086070BD2DE9F041054646480C46012633
+:106F300006704B4945EA024040F080700860FFF758
+:106F40002CFA002804BF474804600027464CC4F8C8
+:106F50000471474945480860002D02BFC4F800622B
+:106F60002660BDE8F081012D18BFFFDFC4F8007274
+:106F7000266041493F480860BDE8F081314801780A
+:106F800071B13B4A394911603749D1F804210021D8
+:106F9000002A08BF417002D0384A1268427001705E
+:106FA0000020EBF793BC27480178002904BF407804
+:106FB00070472D48D0F80401002808BF70472F48BB
+:106FC0000068C0B27047002808BF70472DE9F0473D
+:106FD0001C480078002808BFFFDF234CD4F80401C8
+:106FE000002818BFBDE8F0874FF00209C4F80493E9
+:106FF000234F3868C0F30018386840F0100038603C
+:10700000D4F80401002804BF4FF400454FF0E026F7
+:1070100008D100BFC6F88052EBF7E6FFD4F80401B0
+:107020000028F7D0B8F1000F03D1386820F0100025
+:107030003860C4F80893BDE8F0870B4901208860E8
+:1070400070470000C900002008F500400010004013
+:107050001CF500405011004098F501400CF0004034
+:1070600004F5004018F5004000F000400000020365
+:1070700008F501400000020204F5014000F4004060
+:1070800010ED00E0012804BF41F6A470704702280B
+:1070900004BF41F288307047042804BF46F218004C
+:1070A0007047082804BF47F2A030704700B5FFDFE3
+:1070B00041F6A47000BD10B5FC48002401214470C5
+:1070C000047044728472C17280F82540C462846383
+:1070D00080F83C4080F83D40FF2180F83E105F2161
+:1070E00080F83F1018300EF0D9FFF149601E08609B
+:1070F000091D0860091D0C60091D0860091D0C6050
+:10710000091D0860091D0860091D0860091D086047
+:10711000091D0860091D0860091D0860091D086037
+:10712000091D086010BDE348016801F00F01032943
+:1071300004BF01207047016801F00F01042904BF5A
+:1071400002207047016801F00F01052904D0006892
+:1071500000F00F00062807D1D748006810F0060F8E
+:107160000CBF08200420704700B5FFDF012000BDE0
+:10717000012812BF022800207047042812BF0828E7
+:107180004FF4C870704700B5FFDF002000BD012834
+:1071900004BF28207047022804BF18207047042825
+:1071A00012BF08284FF4A870704700B5FFDF2820F1
+:1071B00000BD70B5BF48016801F00F01032908BF89
+:1071C000012414D0016801F00F01042904BF022436
+:1071D00018210DD0016801F00F0105294BD000687E
+:1071E00000F00F0006281CBFFFDF012443D0282138
+:1071F000AE48C26A806A101A0E18082C04BF4EF6F8
+:10720000981547F2A0302DD02046042C08BF4EF62A
+:1072100028350BD0012808BF41F6A47506D0022CF2
+:107220001ABFFFDF41F6A47541F28835012C08BF73
+:1072300041F6A47016D0022C08BF002005D0042C03
+:107240001ABFFFDF00204FF4C8702D1A022C08BFB0
+:1072500041F2883006D0042C1ABFFFDF41F6A4703B
+:1072600046F21800281A4FF47A7100F2E730B0FBAA
+:10727000F1F0304470BD9048006810F0060F0CBF6C
+:10728000082404244FF4A871B2E710B58B490268B2
+:1072900001F118040A6342684A63007A81F83800F1
+:1072A000207E48B1207FF7F72EF9A07E011C18BF81
+:1072B0000121207FF7F716F9607E002808BF10BD76
+:1072C000607FF7F720F9E07E011C18BF0121607F85
+:1072D000BDE81040F7F706B930B50024054601298E
+:1072E0000AD0022908BF4FF0807405D0042916BFC8
+:1072F00008294FF0C744FFDF44F4847040F4801045
+:107300006F49086045F4403001F1040140F000701D
+:10731000086030BD30B50024054601290AD0022995
+:1073200008BF4FF0807405D0042916BF08294FF01C
+:10733000C744FFDF44F4847040F480106049086063
+:1073400045F4403001F1040140F0007008605D48F0
+:10735000D0F80001002818BFFFDF30BD2DE9F04153
+:1073600002274FF0E02801250024C8F88071BFF300
+:107370004F8FBFF36F8F544804600560FFF754F8D8
+:10738000524E18B1306840F480603060FFF705F865
+:1073900038B1306820F0770040F0880040F00040BD
+:1073A00030604C494A4808604FF01020806CB0F1C2
+:1073B000FF3F04D048490A6860F317420A60474912
+:1073C00040F25B600860091F40F203100860081F6C
+:1073D000056038490320086041480560424A414938
+:1073E0001160434A41491160121F4249116001680E
+:1073F00021F440710160016841F480710160C8F8B6
+:10740000807230491020C1F80403284880F83140C8
+:10741000C462BDE8F081294A0368C2F81A30808846
+:10742000D08302F1180001727047204B10B51A7A10
+:107430008A4208D101460622981CF6F7C9FF0028A7
+:1074400004BF012010BD002010BD184890F8250091
+:107450007047164A517010707047F0B505468000AD
+:1074600000F1804000F580508B88C0F820360B7802
+:10747000D1F8011043EA0121C0F8001605F1080017
+:10748000012707FA00F61C4C002A04BF2068B0430D
+:1074900004D0012A18BFFFDF206830432060206835
+:1074A00007FA05F108432060F0BD0000280C002019
+:1074B000000E00401015004014140040100C002075
+:1074C0001415004000100040FC1F00403C17004015
+:1074D0002C000089781700408C15004038150040BA
+:1074E0005016004000000E0408F5014040800040A6
+:1074F000A4F5014010110040401600400DF0E0BC22
+:10750000F94890F832007047F84AC1781160006875
+:10751000F749000208607047252808BF02210ED0F5
+:10752000262808BF1A210AD0272808BF502106D0D4
+:107530000A2894BF0422062202EB4001C9B2ED4A98
+:107540001160ED49086070472DE9F047E64CA17ADB
+:10755000012956D0022918BFBDE8F087627E002AB3
+:1075600008BFBDE8F087012950D0E17E667F0D1C81
+:1075700018BF01255FF02401DFF880934FF0010868
+:10758000C9F84C80DFF878A34718DAF80000B84251
+:1075900028BFFFDF0020C9F84C01CAF80070300294
+:1075A00085F0010140EA015040F0031194F82000F9
+:1075B000820002F1804202F5C042C2F81015D149A2
+:1075C00001EB8001A07FC20002F1804202F5F83297
+:1075D000C2F81415CC4BC2F81035E27FD30003F18A
+:1075E000804303F5F833C3F81415C849C3F81015E0
+:1075F00008FA00F008FA02F10843C5490860BDE83E
+:10760000F087227E002AAED1BDE8F087A17E267FDA
+:10761000002914BF012500251121ADE72DE9F04116
+:10762000BC4E804603200D46C6F80002B849BA4851
+:10763000086028460DF083FCAB4F0124B8F1000F21
+:1076400004BFBC72346026D0B8F1010F23D1B34817
+:10765000006860B915F00C0F09D0C6F8044301208A
+:1076600000F0B0FEF463346487F83C4002E0002090
+:1076700000F0A8FE28460DF04AFD0220B872FEF781
+:10768000C3FE38B9FEF7D0FE20B9A548016841F421
+:10769000C021016074609948C46499480068294613
+:1076A000BDE8F04150E72DE9F0479A4E81460320AE
+:1076B0000D46C6F80002DFF858829748C8F8000067
+:1076C00008460DF03CFC28460DF021FD0124864FB4
+:1076D000B9F1000F03D0B9F1010F0AD026E0BC7256
+:1076E000B86B40F48010B8634FF48010C8F8000005
+:1076F0001CE00220B872B86B40F40010B8634FF47D
+:107700000010C8F800008548006860B915F00C0F3B
+:1077100009D0C6F80443012000F054FEF463346439
+:1077200087F83C4002E0002000F04CFEEBF7ACFA9A
+:107730002946BDE8F04707E72DE9F84F754C82462A
+:10774000032088461746C4F80002DFF8C491724847
+:10775000C9F8000010460DF0F2FBDFF8C8B1624E28
+:107760000125BAF1000F04BFCBF80040B57204D078
+:10777000BAF1010F18BFFFDF2FD06B48C0F80080AF
+:107780006B496A480860B06B40F40020B063D4F8DD
+:1077900000321021C4F808130020C4F80002DFF8FA
+:1077A00094C18A03CCF80020C4F80001C4F80C018D
+:1077B000C4F81001C4F80401C4F81401C4F8180195
+:1077C0005D4800680090C4F80032C9F80020C4F891
+:1077D0000413BAF1010F09D01BE038460DF097FCF5
+:1077E0005648CBF800000220B072C6E74B4800684C
+:1077F00060B917F00C0F09D0C4F80453012000F051
+:10780000E1FDE563256486F83C5002E0002000F0CD
+:10781000D9FD4FF40020C9F800003848C564384845
+:107820000068404528BFFFDF39464046BDE8F84FB5
+:107830008AE62DE9F0412C4C0646002594F83100EB
+:1078400017468846002808BFFFDF16B1012E16D064
+:1078500021E094F83100012808D094F8302039460E
+:1078600040460DF081FBE16A451814E094F83010B1
+:107870003A4640460DF0B6FBE16A45180BE094F835
+:10788000310094F8301001283A46404609D00DF0F6
+:10789000D1FBE16A45183A4629463046BDE8F04139
+:1078A0004AE70DF081FBE16A4518F4E72DE9F84F4E
+:1078B000184CD4F8000220F00309D4F804034FF068
+:1078C000100AC0F30018C4F808A30026C4F8006228
+:1078D00018481B490160044D0127A97A012931D0BC
+:1078E000022932D044E00000280C0020241500407A
+:1078F0001C15004008150040541500400080004051
+:107900004C850040006000404C8100401011004058
+:1079100004F50140001000400000040488170040F6
+:1079200068150040ACF501404885004048810040A2
+:10793000A8F5014008F5014018110040041000406E
+:1079400000000E04297E11B912E0697E81B1A97F81
+:10795000EA7F07FA01F107FA02F21143016095F894
+:107960002000800000F1804000F5C040C0F81065A4
+:10797000FF208DF80000C4F81061276105E000BF0A
+:107980009DF80000401E8DF800009DF8000018B121
+:10799000D4F810010028F3D09DF80000002808BF9B
+:1079A000FFDFC4F81061002000F00CFD6E72AE72B3
+:1079B000EF72C4F80092B8F1000F18BFC4F804A326
+:1079C000BDE8F88FFF2008B58DF80000FE480021C3
+:1079D000C0F810110121016105E000BF9DF8001001
+:1079E000491E8DF800109DF8001019B1D0F8101143
+:1079F0000029F3D09DF80000002808BFFFDF08BD74
+:107A00000068F24920F07F40086070474FF0E020A6
+:107A10000221C0F8801100F5C070BFF34F8FBFF393
+:107A20006F8FC0F80011704710B490E81C10E8493F
+:107A300081E81C10D0E90420C1E9042010BC704783
+:107A40004FF0E0210220C1F800017047E1490870C1
+:107A50007047E1490860704770B50546EBF714F9C7
+:107A6000DE4C2844E16A884298BFFFDF0120207481
+:107A7000EBF70AF9DA4A284400216061C2F84411A0
+:107A8000D8490860A06BD84940F48000A063D001B9
+:107A9000086070BD70B5D14C0546D44A02202074F0
+:107AA00010680E4600F00F00032808BF012213D013
+:107AB000106800F00F00042808BF02220CD01068E4
+:107AC00000F00F0005281BD0106800F00F000628FA
+:107AD0001CBFFFDF012213D094F8310094F830105E
+:107AE000012815D028460DF0ECFABD496061002050
+:107AF000C1F844016169E06A0844BA49086070BD90
+:107B0000BB48006810F0060F0CBF08220422E3E710
+:107B1000334628460DF0A3FAE7E7B6494FF4800054
+:107B20000860AE48816B21F48001816300210174FB
+:107B30007047C20002F1804202F5F832AE4BC2F843
+:107B40001035C2F8141501218140A7480160A348EF
+:107B5000826B114381637047A14801214160C1607C
+:107B60000021C0F844119F4801609C48C1627047E1
+:107B7000A24908609448D0F8001241F04001C0F8D2
+:107B8000001270479048D0F8001221F04001C0F870
+:107B900000129A490020086070478B48D0F8001204
+:107BA00021F01001C0F800120121816170478B495A
+:107BB000FF2081F83E0084480021C0F81C11D0F855
+:107BC000001241F01001C0F8001270477E4981B0E8
+:107BD000D1F81C21012A0DD0804991F83E10FF29CF
+:107BE0000DBF00204942017001B008BF704701205D
+:107BF00001B07047824A126802F07F02524202705E
+:107C00000020C1F81C017F4800680090EFE7F0B544
+:107C100017460C00064608BFFFDF704D14F0010F39
+:107C20002F731CBF012CFFDF002E0CBF0120022090
+:107C30006872EC7201281CBF0228FFDFF0BD6749A3
+:107C400081F83F0070472DE9F84F6248007804281A
+:107C500028BFFFDF614CDFF89C815B4D94F83C004E
+:107C600000260127E0B1D5F8040110F1000918BF82
+:107C70004FF00109D5F81001002818BF012050EA83
+:107C800009014FF4002B17D08021C5F80813C8F85C
+:107C900000B084F83C6090F0010F18BFBDE8F88F89
+:107CA000DFF83C91D9F84C0100287DD0A07A01285A
+:107CB0007BD002287AD0D8E0D5F80001DFF840A1C7
+:107CC00030B3C5F800616F61FF20009002E0401EF4
+:107CD000009005D0D5F81C0100280098F7D000B915
+:107CE000FFDFDAF8000000F07F0A94F83F0050450B
+:107CF0003CBF002000F066FB84F83EA0C5F81C6184
+:107D0000C5F808733F48006800902F64AF6302E035
+:107D1000B9F1000F03D0B9F1000F2BD087E0DAF8EA
+:107D2000000000F07F0184F83E10C5F81C6194F853
+:107D30003D0048B194F83F00884218D2002000F07E
+:107D400041FB2F64AF6312E02F48006894F83F3086
+:107D500082B2000C994203D30F2A06D9022804D21A
+:107D6000012000F02FFB2F6401E02F64AF63254852
+:107D7000006800908022C5F80423194887642349CD
+:107D80000B68A1F1040CDCF800C043F698273B44D3
+:107D9000634543D20A6842F210731A440A60C0F87D
+:107DA00048611B481B4902E05FE047E049E008608A
+:107DB000091F194808600C48C0F800B0A06B40F4D7
+:107DC0000020A063BDE8F88F001000403C15004083
+:107DD000100C0020CB00002004150040280C0020CF
+:107DE000008000404485004004F50140101500402B
+:107DF0001414004008F501400411004060150040D3
+:107E0000481500401C110040741500404885004092
+:107E100014100040ACF50140488100400E60C0F8ED
+:107E20004861C5F80823C8F800B0C0F84861802050
+:107E3000C5F80803C8F800B0BDE8F88F207E10B977
+:107E400013E0607E88B1A07FE17F07FA00F007FAB7
+:107E500001F10843C8F8000094F82000800000F108
+:107E6000804000F5C040C0F81065F748A16B016084
+:107E7000A663217C002019B1D9F84411012900D052
+:107E80000021A27A012A6DD0022A73D0D5F81011F0
+:107E900001290CBF1021002141EA0008EB480168CC
+:107EA00011F0FF0F03D0D5F81411012900D00021E3
+:107EB00084F83210006810F0FF0F03D0D5F81801D5
+:107EC000012800D0002084F83300E148006884F8DD
+:107ED0003400FEF79CFF012818BF002084F835000D
+:107EE000C5F80061C5F80C61C5F81061C5F80461FA
+:107EF000C5F81461C5F81861D64800680090D648E6
+:107F0000C0F84461D5480068DFF854930090D9F870
+:107F10000000A062A9F104000068E062D148016895
+:107F200001F00F01032908BF012013D0016801F0FF
+:107F30000F01042908BF02200CD0016801F00F01D5
+:107F4000052926D0006800F00F0006281CBFFFDFBF
+:107F500001201ED084F83000A07A84F83100022875
+:107F60002CD11EE0D5F80C01012814BF00200820F8
+:107F70008CE7FFE7D5F80C01012814BF0020022090
+:107F8000B94A1268012A14BF042200221043084390
+:107F90007CE7B648006810F0060F0CBF08200420EC
+:107FA000D8E7607850B1B24909680978084021786B
+:107FB00031EA000008BF84F8247001D084F82460FE
+:107FC000DFF8B0A218F0020F06D0EAF75DFEA16A52
+:107FD000081ADAF81010884718F0010F18BF4FF090
+:107FE000000B0DD0EAF750FEE16ADAF81420081A07
+:107FF00059469047A048007810F0010F2FD10CE0AF
+:1080000018F0020F18BF4FF0010BEBD118F0080F5A
+:1080100018BF4FF0020BE5D1ECE7DFF854B2DBF804
+:108020000000007800F00F00072828BF84F82560C2
+:1080300015D2DBF80000062200F10901A01CF6F7BA
+:10804000C7F940B9207ADBF800100978B0EBD11FEE
+:1080500008BF012001D04FF0000084F82500E17A2C
+:108060004FF0000011F0020F1CBF18F0020F18F0C3
+:10807000040F19D111F0100F1CBF94F83320002AFF
+:1080800002D094F835207AB111F0080F1CBF94F893
+:108090002420002A08D111F0040F02D094F82510F2
+:1080A00011B118F0010F01D04FF00100617A19B140
+:1080B00068B1FFF7FBFB10E0634870490160D5F839
+:1080C000000220F00300C5F80002E77205E0012974
+:1080D0000AD0022918BFFFDF0DD018F0010F14D00D
+:1080E000DAF80000804745E06672E772A7729621D1
+:1080F000227B002006E06672E7720220A072227BDB
+:1081000096210120FFF795FBE7E718F0020F2AD030
+:1081100018F0040F21D1FEF777F9F0B9FEF784F9D2
+:10812000D8B957480168001F0068C0F3006CC0F35D
+:10813000425500F00F03C0F30312C0F30320BCF15B
+:10814000000F0AD0002B1CBF002A002805D10029EF
+:1081500018BF032D38BF48F0040827EA9800DAF862
+:108160000410884706E018F0080F18BFDAF8080076
+:1081700024D08047A07A022818BFBDE8F88F207C61
+:10818000002808BFBDE8F88F3349C1F844610228D0
+:108190001CD0012818BFFFDFE16A6069884298BFE0
+:1081A000FFDF6069C9F80000A06B4FF4800140F464
+:1081B0008000A06333480160BDE8F88F18F0100F0D
+:1081C00014BFDAF80C00FFDFD3D1D3E76169E06AAE
+:1081D0000844E7E738B52C4904460220887201219B
+:1081E0002046FFF7B1F91E4A04F13D0010601A4B1A
+:1081F0000020C3F844012549C1F80001C1F80C0171
+:10820000C1F81001C1F80401C1F81401C1F8180146
+:1082100010480068009001209864101D00681168E3
+:10822000884228BFFFDF38BD2DE9F843164A88464B
+:108230000024917A0125044F012902D0022927D078
+:1082400039E0117E31BB36E008F5014040160040B0
+:10825000101400401811004000800040448100408C
+:1082600044850040101500400014004014140040E4
+:1082700004150040100C0020CB0000200000040476
+:108280005414004004F50140280C00200010004068
+:10829000517E81B1917FD37F05FA01F105FA03F395
+:1082A0001943396092F82010890001F1804101F5ED
+:1082B000C041C1F8104506460220907201213046A7
+:1082C000FFF742F9504906F13D0008604F4AC2F8F5
+:1082D00044414F48C0F80041C0F80C41C0F810417B
+:1082E000C0F80441C0F81441C0F81841494800687A
+:1082F00000909564081D00680968884228BFFFDF68
+:10830000B8F1000F1CBF4FF400303860BDE8F883AF
+:10831000022810B50DD0012804BF42F6CE3010BDA2
+:10832000042817BF082843F6A440FFDF41F66A007F
+:1083300010BDFEF725F830B9FEF72FF8002808BF6A
+:1083400041F6583001D041F2643041F29A010844BC
+:1083500010BD2F4910B50020C1F800022F492E484A
+:10836000086030492E480860091D2F480860091D23
+:108370002E480860091D2E480860091D2D48086018
+:10838000091D2D48086001200CF0D9FD2B494FF440
+:108390003810086010BD21494FF43810086070474C
+:1083A0002748016803291BBF00680228012000201C
+:1083B0007047234801680B291BBF00680A28012069
+:1083C000002070471F490968C9B91F4A1F4913682F
+:1083D00070B123F0820343F07D0343F00043136048
+:1083E0000A6822F0100242F0600242F0004205E00A
+:1083F00023F0004313600A6822F000420A60144927
+:1084000081F83D0070470000448500400080004036
+:1084100000100040181100400000040408F501405D
+:108420001011004098F501400410004044810040C4
+:10843000141000401C1100401010004004F50140D1
+:1084400050150040881700403C1700407C17004042
+:10845000280C002010B5404822220021F6F70FF822
+:108460003D480024017821F010010170012105F040
+:108470003DFF3A494FF6FF7081F822408884384921
+:108480000880488010BD704734498A8C824218BFEA
+:108490007047002081F822004FF6FF7088847047F3
+:1084A0002D49016070472E49088070472B498A8CFE
+:1084B000A2F57F43FF3B03D00021016008467047CF
+:1084C00091F822202549012A1ABF016001200020CD
+:1084D0007047224901F1220091F82220012A04BFAD
+:1084E00000207047012202701D48008888841046D1
+:1084F00070471B49488070471849194B8A8C5B8824
+:108500009A4206D191F82220002A1EBF0160012064
+:108510007047002070471148114A818C528891425F
+:1085200009D14FF6FF71818410F8221F19B1002183
+:10853000017001207047002070470848084A818C6C
+:108540005288914205D190F8220000281CBF0020DB
+:1085500070470120704700008E0C0020680C00203E
+:10856000CC0000207047584A012340B1012818BFB1
+:1085700070471370086890608888908170475370C6
+:108580000868C2F802008888D08070474E4A10B14F
+:10859000012807D00EE0507860B1D2F802000860E0
+:1085A000D08804E0107828B19068086090898880AD
+:1085B0000120704700207047434910B1012803D0C3
+:1085C00006E0487810B903E0087808B10120704748
+:1085D0000020704730B58DB00C4605460D220021B5
+:1085E00004A8F5F74CFFE0788DF81F0020798DF88E
+:1085F0001E0060798DF81D00286800906868019061
+:10860000A8680290E868039068460BF0CDFF2078D8
+:108610009DF82F1088420CD160789DF82E1088426A
+:1086200007D1A0789DF82D10884202BF01200DB01F
+:1086300030BD00200DB030BD30B50C4605468DB0C4
+:108640004FF0030104F1030012B1FDF77FFF01E0D9
+:10865000FDF79BFF60790D2220F0C00040F0400044
+:108660006071002104A8F5F70AFFE0788DF81F007B
+:1086700020798DF81E0060798DF81D002868009023
+:1086800068680190A8680290E868039068460BF05B
+:108690008BFF9DF82F0020709DF82E0060709DF8D4
+:1086A0002D00A0700DB030BD10B5002904464FF06C
+:1086B000060102D0FDF74AFF01E0FDF766FF607991
+:1086C00020F0C000607110BDD0000020FE4840685E
+:1086D00070472DE9F0410F46064601461446012039
+:1086E00006F0B7F8054696F86500FEF7CBFC4AF2AF
+:1086F000B12108444FF47A71B0FBF1F0718840F277
+:1087000071225143C0EB4100001BA0F2663402F01D
+:10871000A9FF002818BF1E3CAF4234BF2846384688
+:10872000A04203D2AF422CBF3C462C467462BDE847
+:10873000F0812DE9FF4F93B0044690F8650088461C
+:108740000F90DDE9151008431190E04800270578E7
+:108750000C2D28BFFFDFDE4E36F8159094F88C51B3
+:108760000C2D28BFFFDFDA4830F81500484480B2EE
+:10877000009094F87D000D280CBF012000200A9085
+:108780001598002804BF94F82C0103282BD10A98CF
+:1087900048B3B4F8AE01404525D1D4F83401C4F84B
+:1087A0002001608840F2E2414843C4F82401B4F853
+:1087B0007A01B4F806110844C4F82801204602F0F2
+:1087C0005BFFB4F8B201E08294F8B0016075B4F8D0
+:1087D000B4016080B4F8B601A080B4F8B801E080BC
+:1087E000022084F82C01D4F884010E90D4F8800182
+:1087F0000D90B4F80661B4F87801D4F874110591BD
+:10880000159921B194F8401151B100F0D6B804F592
+:108810008071069174310B9104F5B075091D07E064
+:1088200004F5AA710691091D0B9104F5A275091DA5
+:108830000C91B4F87010A8EB0000A8EB01010FFA3E
+:1088400080F90FFA81FBB9F1000F05DAD4F8700155
+:1088500005900120D94611909C484FF0000A0079FC
+:10886000A8B3F3F75FFB90B3B4F8180102282ED336
+:1088700094F82C0102282AD094F8430138BB94F8CC
+:108880008C0100900C2828BFFFDF9148009930F838
+:10889000110000F5C86080B2009094F82C01012806
+:1088A0007ED0608840F2E2414843009901F01BF914
+:1088B000D4F8342180B206EB0B01A1EB0901821A36
+:1088C00001FB02AAC4F83401012084F8430194F8A2
+:1088D0002C01002865D0012800F00B82022800F04E
+:1088E0006A81032818BFFFDF00F03D82A7EB0A0171
+:1088F0000598FCF782F90B99012640F27122086075
+:108900000C98A0F80080002028702E710B98006849
+:10891000A8606188D4F834015143C0EB41006B4931
+:10892000A0F23630C8618969814287BF0699086024
+:10893000069801600698616A0068084400F5D370E3
+:10894000E86002F08FFE10B1E8681E30E8606E71DA
+:10895000B4F8F000A0EB080000B20028C4BF032068
+:1089600068710A980028169800F05F82E0B100BF95
+:10897000B4F8181100290CBF0020B4F81A01A4F8AB
+:108980001A0194F81C21401C504388420CD268798B
+:10899000401E002808DD6E71B4F81A01401C01E089
+:1089A0000FE05AE0A4F81A011598002800F0608240
+:1089B00094F84001002800F0578217B00220BDE86B
+:1089C000F08F94F8800003283DD03F4894F865105C
+:1089D00090F8300005F001FAE28A40F2712151432B
+:1089E00000EB4100CDF81000D4F82401009901F00B
+:1089F0007AF8D4F82021D4F82811821A01FB02AAAF
+:108A0000C4F820010099049801F06DF8D4F83011F1
+:108A1000C4F83001411A8A44608840F2E241484378
+:108A2000009901F060F806EB0B01D4F82821A1EBC6
+:108A30000901891AD4F83421C4F83401821A491E74
+:108A400001FB02AA40E7E18A40F27122D4F8240136
+:108A5000514300EB41000490C6E70D98002808BF81
+:108A6000FFDF94F86510184890F8300005F0B5F96C
+:108A70000890E08A40F271214143089800EB4100E0
+:108A8000009901F030F8C4F83001608840F2E2410A
+:108A90004843009901F027F8C4F8340186B2214612
+:108AA0000120D4F8289005F0D4FE074694F865001C
+:108AB000FEF7E8FA4AF2B12108444FF47A7BB0FBA2
+:108AC000FBF0618806E00000B00C0020E000002010
+:108AD000D463020040F271225143C0EB4100801B7D
+:108AE000A0F2663602F0BEFD002818BF1E3EB94552
+:108AF00034BF38464846B04203D2B9452CBF4E4633
+:108B00003E46666294F86500FEF732FB00F2E140F3
+:108B1000B0FBFBF10D980F1894F86500FEF728FBE9
+:108B2000064694F86500FEF7ADFA30444AF2AB31E0
+:108B30000844B0FBFBF1E08A40F2712242430898FE
+:108B4000D4F8306100EB4200401A801B3844A0F199
+:108B50002007607D40F2E24110FB01F994F86500C6
+:108B6000009010F00C0F0ABF00984EF62830FEF768
+:108B700089FA4AF2B1210844B0FBFBF000EB460051
+:108B800000EB09060098FEF702FB304400F1620199
+:108B9000FB48816194F86500FEF7EAFA00F2E140D3
+:108BA000B0FBFBF10D980844381A40F2F6218842D8
+:108BB00038BFFFDF9AE6E18A40F27122D4F824013F
+:108BC000514300EB4100009900F08DFFC4F83001E3
+:108BD000618840F2E2404843009900F084FFC4F805
+:108BE000340187B221460120D4F828B005F031FEC7
+:108BF000814694F86500FEF745FA4AF2B121014436
+:108C00004FF47A70B1FBF0F0618840F27122514369
+:108C1000C0EB4100C01BA0F2663702F023FD002824
+:108C200018BF1E3FCB4534BF48465846B84203D212
+:108C3000CB452CBF5F464F46676216BB169800B304
+:108C400094F865603046FEF71DFA4AF2B1210144FE
+:108C50004FF47A70B1FBF0F0D4F8301140F2712388
+:108C60000844E18AD4F82421594302EB41010F1A48
+:108C70003046FEF78CFA0E99081A3844A0F1200706
+:108C80000AE0E18A40F27122D4F82401514300EB5A
+:108C90004100D4F83011471AD4F82821D4F8201113
+:108CA000D4F8300101FB020B607D40F2E24110FB81
+:108CB00001F994F8656016F00C0F0ABF30464EF6C5
+:108CC0002830FEF7DFF94AF2B12101444FF47A70FF
+:108CD000B1FBF0F000EB4B0081443046FEF757FA51
+:108CE000484400F16001A6488161012084F82C010C
+:108CF000FCE5608840F271225043D4F83411D4F876
+:108D00002821C1EB400000FB09F706EB0B00801A9D
+:108D1000D4F820C1D4F83031401E0CFB023200FBE5
+:108D2000012B607D40F2E24110FB01F994F865608F
+:108D300016F00C0F0ABF30464EF62830FEF7A2F9A7
+:108D40004AF2B12101444FF47A70B1FBF0F000EB2C
+:108D50004B0081443046FEF71AFA484400F16001A6
+:108D600087488161C2E5618840F27122D4F83401FC
+:108D70005143C0EB410000FB09F794F87C00242824
+:108D80001CBF94F87D0024280BD1B4F8AE01A8EBE9
+:108D9000000000B2002804DB94F8B101002818BFDD
+:108DA0000F90119800B3FEB90E9800281ABF0D98C5
+:108DB0000028FFDF94F8650010F00C0F14BF4EF68A
+:108DC0002830FEF75FF94AF2B12101444FF47A707E
+:108DD000B1FBF0F03F1A94F86500FEF7D8F90E9950
+:108DE000081A3844A0F12007D4F8341106EB0B0020
+:108DF00000FB01F60F9810F00C0F0ABF0F984EF60B
+:108E00002830FEF73FF94AF2B12101444FF47A705D
+:108E1000B1FBF0F000EB46060F98FEF7B8F93044CE
+:108E200000F160015648816160E500287FF4A0AD43
+:108E300094F82C0100283FF4B7AD618840F271220C
+:108E4000D4F834015143C0EB4101284604F088FDB9
+:108E50000004000C3FF4A8AD2099002918BF088039
+:108E6000012017B0BDE8F08F94F87C01FCF71CFDE1
+:108E700094F87C012946FCF7FDFB20B1159880F0A1
+:108E8000010084F8410117B00020BDE8F08F70B5F3
+:108E90003C4C607A00281CBF002070BD94F8340060
+:108EA00038B1A16B606A884203D9F6F750FE002002
+:108EB00070BDA06AE8B1F5F71FFE0546F5F78CFC1A
+:108EC000284442F210714618FCF7B0F905462946CD
+:108ED000E06AFCF79AFEE562A16A8219914224BF1A
+:108EE000081AA06205D20120A062F6F730FE002029
+:108EF00070BD012070BDF8B5224C0246204F002500
+:108F00006168606A052A4FD2DFE802F00331363E1D
+:108F10004500A07A002660B101216846FDF716FBE6
+:108F20009DF8000042F210710002B0FBF1F201FB6B
+:108F30001206F5F7E1FD8119A069FBF75EFEA0615D
+:108F400025740320607501202075607A38B9207B74
+:108F500004F11001FCF78EFB002808BFFFDF258419
+:108F6000FCF76FF87879BDE8F840E9F7B9BFBDE8DC
+:108F7000F840002100F0D4BDC1F88001F8BD000028
+:108F8000E0000020B00C0020D1F88001BDE8F840DE
+:108F9000012100F0C5BD84F83450FCF752F878790F
+:108FA000BDE8F840E9F79CBFFFDFE7E72DE9F04FA8
+:108FB000DFF80494044683B099F800008B4601273B
+:108FC0000025FE4E4FF00208032804BF99F80C005C
+:108FD000A0427DD1D9F80400706199F800000328FF
+:108FE00018BFFFDF0324BBF1080F72D2DFE80BF0DC
+:108FF000040F32322DD2D2C9C9F82450F6F77EF9C7
+:10900000002818BFFFDFB47003B0BDE8F08FF5F79C
+:10901000E3FB0446D9F81C00A04228BFC9F81C4055
+:1090200006D2201A0421FCF724FEC9F81C4038B1EE
+:10903000F6F7F7FC002818BFFFDF03B0BDE8F08F9C
+:1090400003B00020BDE8F04F55E703B0BDE8F04F96
+:10905000FEF7F9BD89F8147089F8105099F83400BA
+:109060004FF0010A42F2107B68B14FF47A71D9F8DF
+:109070001800FBF7C2FDC9F81800002109F1100023
+:1090800004F06EFC1BE001216846FDF755FA9DF8DF
+:1090900000000002B0FBFBF10BFB110AF5F72CFD01
+:1090A00082445146D9F81800FBF7A7FDC9F818000B
+:1090B000514609F1100004F053FC00F1010AB9F81F
+:1090C0002000411C0A293CBF5044A9F8200001E0BF
+:1090D00064E05FE0D9F8040038B1B9F82000401C22
+:1090E0000A2828BF89F8158001D289F8154099F817
+:1090F000090070BB99F8340040B1D9F83810D9F89C
+:109100002400884202D9F6F722FD22E0D9F828008F
+:1091100058B3F5F7F1FC0446F5F75EFB204400EB8D
+:109120000B08FCF783F804462146D9F82C00FCF71D
+:109130006CFDC9F82C40D9F8281000EB08029142C8
+:1091400024BF081AC9F828000FD2C9F82870F6F70A
+:10915000FEFC99F80C00FCF74AF889F80050707989
+:1091600003B0BDE8F04FE9F7BBBE99F80C0009F178
+:109170001001FCF77FFA002808BFFFDF03B0BDE84D
+:10918000F08F99F80C00FCF732F889F8005003B022
+:10919000BDE8F08FFFDF03B0BDE8F08F202C28BFC3
+:1091A000FFDFDFF81C92072139F81400F9F7D6FE2B
+:1091B0005FEA000A08BFFFDF202C28BFFFDF39F875
+:1091C0001400BAF80010884218BFFFDF5446C6F8F2
+:1091D00014A04FF0200ABBF1080F80F06881DFE88F
+:1091E0000BF00498A2A29BF3F2F1C4F88051F58031
+:1091F000C4F8845194F8410138B9FCF717F8D4F851
+:109200004C11FCF702FD00281DDCB4F83E01B4F857
+:109210007010884208D1B4F8F400401AA4F8F6009F
+:109220002046B4F8F41005E0401AA4F8F600B4F8AB
+:109230003E112046A4F87010D4F86811C4F84C11FF
+:10924000C0F870111DE0B4F83C11B4F87000081AB1
+:10925000A4F8F600B4F83C112046A4F87010D4F835
+:109260004C11C4F86811C4F87011D4F85411C4F842
+:109270000011D4F85811C4F87411B4F85C11A4F8B2
+:10928000781102F0D4F8FBF7ABFF814694F8650043
+:10929000FDF7F8FE4AF2B12108444FF47A71B0FBB1
+:1092A000F1F0D4F8341140F271220844618851433E
+:1092B000C0EB4100A0F1300AB9F1B70F98BF4FF0F1
+:1092C000B7092146012005F0C4FA4844AAEB000082
+:1092D000A0F21B39A2462146012005F0BAFADAF8BD
+:1092E00024109C30814288BF0D1AC6F80C904D4561
+:1092F00028BF4D46B560D4F86C01A0F5D37030613D
+:10930000FCF750FC84F8407186F8028003B0BDE899
+:10931000F08F02F0A2F901E0FEF795FC84F84071AD
+:1093200003B0BDE8F08FFBF781FFD4F87021014650
+:109330001046FCF76AFC48B1628840F27123D4F809
+:1093400034115A43C1EB4201B0FBF1F094F87D10A7
+:109350000D290FD0B4F87010B4F83E210B189A42C2
+:10936000AEBF501C401C0844A4F83E0194F84201D2
+:1093700078B905E0B4F83E01401CA4F83E0108E0CD
+:10938000B4F83E01B4F8F410884204BF401CA4F8BD
+:109390003E01B4F87A010DF1040B401CA4F87A01E7
+:1093A000B4F89A00B4F89810401AB4F87010401E3F
+:1093B00008441FFA80F814E0B00C0020E000002000
+:1093C000EC0C002065E059E071E000231A462046CD
+:1093D000CDF800B0FFF7ADF948B3012818BFFFDFA3
+:1093E00044D0B4F83E11A8EB010000B20028ECDA3A
+:1093F000082084F88D0084F88C70204601F0C8FDA8
+:1094000084F82C5194F87C514FF6FF77202D00D32F
+:10941000FFDF29F8157094F87C01FBF7E8FE84F86B
+:109420007CA1707903B0BDE8F04FE9F759BDA06E9B
+:10943000002804BF03B0BDE8F08FB4F83E01B4F8D3
+:109440009420801A01B20029DCBF03B0BDE8F08F80
+:10945000B4F86C000144491E91FBF0F189B201FBA4
+:109460000020A4F8940003B0BDE8F08FB4F83E01EA
+:10947000BDF804100844A4F83E01B2E7FEF7A2FAD2
+:10948000FEF7E1FB4FF0E020C0F8808203B0BDE8BA
+:10949000F08F94F82C01042818BFFFDF84F82C51BA
+:1094A00094F87C514FF6FF77202DB2D3B0E7FFDF61
+:1094B00003B0BDE8F08F10B5FC4C207850B101200E
+:1094C0006072F6F76AFB2078032805D0207A00281E
+:1094D00008BF10BD0C2010BD207BFCF7E5F9207BF8
+:1094E000FCF74EFC207BFBF782FE002808BFFFDF65
+:1094F0000020207010BD2DE9F04FEC4F83B038787C
+:1095000001244FF0000840B17C720120F6F745FBC2
+:109510003878032818BF387A0DD0DFF8949389F88B
+:10952000034069460720F9F7A2FC002818BFFFDFB7
+:109530004FF6FF7440E0387BFCF7B6F9387BFCF758
+:109540001FFC387BFBF753FE002808BFFFDF87F8BE
+:109550000080E2E7029800281CBF90F82C11002937
+:109560002AD00088A0421CBFDFF848A34FF0200B90
+:109570003AD00721F9F7F2FC040008BFFFDF94F8A6
+:109580007C01FCF7FDFB84F82C8194F87C514FF6AC
+:10959000FF76202D28BFFFDF2AF8156094F87C01A4
+:1095A000FBF725FE84F87CB169460720F9F75FFCDC
+:1095B000002818BFFFDF12E06846F9F736FC0028E4
+:1095C000C8D011E0029800281CBF90F82C11002987
+:1095D00005D00088A0F57F41FF39CAD104E0684674
+:1095E000F9F723FC0028EDD089F8038087F8348050
+:1095F00087F80B8003B00020BDE8F08FAC494871BC
+:109600000020887001220A7048700A71C870A7494A
+:10961000087070E7A649087070472DE9F84FA34C11
+:10962000064688462078002860D1A348FBF784FDD1
+:10963000207320285AD003276660277000256572A2
+:109640002572AEB1012106F58E70FCF79EFF062053
+:10965000F9F72CFC81460720F9F728FC96F81C1135
+:109660004844B1FBF0F200FB1210401C86F81C01CC
+:10967000FBF7B6FD40F2F651884238BF40F2F65093
+:1096800000F23F101FFA80F9F5F7A6F8E061F5F750
+:1096900033FA012668B3A672FBF7C8FD82460121A2
+:1096A0006846FCF749FF9DF8000042F21071000285
+:1096B000B0FBF1F201FB120000EB09015046FBF791
+:1096C0009CFAA061C4E90A8A267567752574207B17
+:1096D00004F11001FBF7CEFF002808BFFFDF25844F
+:1096E0000020F6F75AFA0020BDE8F88F0C20BDE8FC
+:1096F000F88FFBF79BFD4946FBF77FFAA061A57247
+:1097000084F83460A8F28B50A562A063DCE7684956
+:10971000487070476649087170472DE9F041644C04
+:109720000646E088401CE080D4E902516078D6F813
+:10973000807120B13A46284604F03DF90546A068FC
+:10974000854205D02169281A08442061FCF72AFACD
+:10975000A560AF4209D896F82C01012805D0E07821
+:10976000002804BF0120BDE8F0810020BDE8F081A1
+:1097700010B504460846FDF785FC4AF2B1210844BD
+:109780004FF47A71B0FBF1F040F2E241614300F234
+:10979000363081428CBF081A002010BD70B50446D7
+:1097A00082B0002084F8400194F8FE00002807BF32
+:1097B00094F82C01032802B070BDFBF737FDD4F8F4
+:1097C000702101461046FCF720FA0028DCBF02B0E9
+:1097D00070BD628840F27123D4F834115A43C1EB52
+:1097E0004201B0FBF1F0B4F87010401C0844A4F83A
+:1097F0003C01B4F8F400B4F83C21801A00B200280F
+:10980000DCBF02B070BD012084F84201B4F89A00B8
+:10981000B4F8982001AE801A401E084485B212E0C8
+:109820000096B4F83C11002301222046FEF781FF88
+:10983000002804BF02B070BD01280DD0022812BF5D
+:10984000FFDF02B070BDB4F83C01281A00B2002856
+:10985000BCBF02B070BDE3E7B4F83C01BDF8041032
+:109860000844A4F83C01EEE7F8B5042200250629D7
+:1098700064D2DFE801F0072F03191933044680F89A
+:109880002C2107E004460A48C078002818BF84F855
+:109890002C2113D0FBF7D5FBA4F87A51B4F8700053
+:1098A000A4F83E0184F84251F8BD0000B00C00203D
+:1098B000E0000020EC0C0020AD8F01000095B4F812
+:1098C000F410012300222046FEF733FF002818BFC2
+:1098D000FFDFDFE7032180F82C11E5E70646876A02
+:1098E000B0F83401314685B2012004F0B2FF0446DD
+:1098F00096F86500FDF7C6FB4AF2B12108444FF423
+:109900007A71B0FBF1F0718840F271225143C0EBE3
+:109910004100401BA0F2663501F0A4FE002818BFEC
+:109920001E3DA74234BF20463846A84228BF2C46D9
+:1099300002D2A74228BF3C467462B5E7FFDFB3E717
+:109940002DE9F05F9E4EB178022906BFF18800290B
+:10995000BDE8F09F7469C4F8840194F86500FDF7D0
+:1099600016FCD4F88411081AB1680144B160F1689A
+:109970000844F060746994F84301002808BFBDE80A
+:10998000F09F94F82C01032818BFBDE8F09F94F8CD
+:10999000655037780C2F28BFFFDF8A4E36F81780C6
+:1099A00094F88C710C2F28BFFFDF36F81700404465
+:1099B00094F88C8187B2B8F10C0F28BFFFDF36F81E
+:1099C000180000F5C8601FFA80F82846FDF7DFFB95
+:1099D000D4F884114FF0000A0E1A15F00C0F0ABFCC
+:1099E00028464EF62830FDF74DFB4FF47A7900F209
+:1099F000E730B0FBF9F0361A2846FDF7C8FBD4F87B
+:109A0000001115F00C0FA1EB000B0ABF28464EF613
+:109A10002830FDF737FB4AF2B1210844B0FBF9F0DA
+:109A2000ABEB0000A0F160017943B1FBF8F1292212
+:109A300002EB50006031A0EB510200EB5100B2424A
+:109A400001D8B04201D8F2F71FFB608840F2E24132
+:109A50004843394600F047F8C4F8340184F843A17C
+:109A6000BDE8F09F70B50546554890F802C0BCF1BE
+:109A7000020F07BF406900F5C074534800F1240489
+:109A8000002904BF256070BD4FF47A7601290DD0FE
+:109A900002291CBFFFDF70BD1046FEF739FC00F243
+:109AA000E140B0FBF6F0281A206070BD1846FDF7C3
+:109AB0005FFB00F2E140B0FBF6F0281A206070BDB9
+:109AC0004148007800281CBF0020704710B50720CF
+:109AD000F9F7DEF980F0010010BD3B48007800285E
+:109AE00018BF0120704730B502460020002908BF8A
+:109AF00030BDA2FB0110490A41EAC051400A4C1C8A
+:109B000040F100000022D4F1FF3140F2A17572EB68
+:109B1000000038BFFFDF04F5F460B0FBF5F030BDA6
+:109B20002DE9F843284C0025814684F83450D4F8B8
+:109B3000188084F83010E5722570012727723946A5
+:109B4000606803F094FA6168C1F87081267B81F83F
+:109B50007C61C1F88091C1F87481B1F80080202E39
+:109B600028BFFFDF194820F81680646884F82C515C
+:109B70000023A4F878511A46194620460095FEF7AE
+:109B8000D8FD002818BFFFDFC4F82851C4F82051C1
+:109B900084F82C71A4F83E51A4F83C5184F8425149
+:109BA000B4F87000401EA4F87000A4F87A51FBF7D6
+:109BB00048FA03484079BDE8F843E9F791B9000055
+:109BC000E0000020D4630200B00C0020EC0C002068
+:109BD000012804D0022805D0032808D105E0012976
+:109BE00007D004E0022904D001E0042901D00020BC
+:109BF0007047012070472DE9F0410E46044604F0FD
+:109C000092FC0546204604F092FC044603F0ADFFAA
+:109C1000FB4F010015D0386990F864208A4210D0BB
+:109C200090F8C4311BB190F8C63123421FD02EB931
+:109C300090F85D30234201D18A4218D890F8C401CF
+:109C4000A8B1284603F091FF70B1396991F86520F9
+:109C5000824209D091F8C40118B191F8C701284295
+:109C600005D091F8C40110B10120BDE8F0810020B9
+:109C7000FBE730B5E24C85B0E06900285FD01422E4
+:109C800000216846F4F7FBFB206990F86500FDF7BA
+:109C9000F9F94FF47A7100F5FA70B0FBF1F520692B
+:109CA00090F86500FDF773FA2844ADF806002069C6
+:109CB0000188ADF80010B0F87010ADF804104188BC
+:109CC000ADF8021090F8A60130B1A069C11C039153
+:109CD00004F00AFB8DF81000206990F8A5018DF8BA
+:109CE0000800E169684688472069002180F8A611CC
+:109CF00080F8A5110399002921D090F8A41100291A
+:109D00001DD190F87C10272919D09DF81010039AC6
+:109D1000002914D013780124FF2B12D0072B0ED169
+:109D200002290CD15178FF2909D100BF80F8A44144
+:109D30000399C0F8A8119DF8101080F8A71105B07C
+:109D400030BD1B29F2D9FAE770B5AD4C206990F807
+:109D50007D001B2800D0FFDF2069002580F8A75078
+:109D600090F8D80100B1FFDF206990F8A81041B148
+:109D700080F8A8500188A0F8DC1180F8DA510E2193
+:109D800008E00188A0F8DC1180F8DA51012180F8A0
+:109D9000DE110D2180F8D8110088F9F712FAF8F7D2
+:109DA000A9FE2079E9F79CF8206980F87D5070BD04
+:109DB00070B5934CA07980072CD5A078002829D1C4
+:109DC00062692046D37801690D2B01F170005FD0E4
+:109DD0000DDCA3F102034FF001050B2B19D2DFE8D4
+:109DE00003F01A1844506127182C183A6400152BF8
+:109DF0006FD008DC112B4BD0122B5AD0132B62D012
+:109E0000142B06D166E0162B71D0172B70D0FF2BC8
+:109E10006FD0FFDF70BD91F87F200123194603F05A
+:109E200035FD0028F6D12169082081F87F0070BD3A
+:109E30001079BDE8704001F0B2BC91F87E00C00717
+:109E400000D1FFDF01F06AFC206910F87E1F21F0CD
+:109E50000101017070BD91F87D00102800D0FFDF76
+:109E60002069112180F8A75008E091F87D0014289E
+:109E700000D0FFDF2069152180F8A75080F87D1001
+:109E800070BD91F87D00152800D0FFDF172005E098
+:109E900091F87D00152800D0FFDF1920216981F895
+:109EA0007D0070BDBDE870404EE7BDE8704001F038
+:109EB0004ABC91F87C200123002103F0E7FC00B9A3
+:109EC000FFDF0E200FE011F87E0F20F00400087075
+:109ED0001DE00FE091F87C200123002103F0D6FC67
+:109EE00000B9FFDF1C20216981F87C0070BD12E001
+:109EF0001BE022E091F87E00C0F30110012800D0A1
+:109F0000FFDF206910F87E1F21F010010170BDE80D
+:109F1000704001F003BC91F87C200123002103F084
+:109F2000B5FC00B9FFDF1F20DDE791F87D00212897
+:109F300001D000B1FFDF2220B0E7BDE8704001F0A2
+:109F4000F9BB2F48016991F87E20130702D5012142
+:109F50008170704742F0080281F87E208069C078E5
+:109F600081F8E10001F0D1BB10B5254C21690A88C8
+:109F7000A1F81A2281F8180291F8640001F0B3FBED
+:109F8000216981F81C0291F8650001F0ACFB2169A0
+:109F900081F81D02012081F81602002081F8C40119
+:109FA0002079BDE81040E8F79BBF10B5144C05219F
+:109FB0002069FFF759FC206990F85A10012908D050
+:109FC00000F5F77104F013FC2079BDE81040E8F7C4
+:109FD00087BF022180F85A1010BD10B5084C01232C
+:109FE0000921206990F87C20703003F04FFC48B1C3
+:109FF0002169002001F8960F087301F81A0C10BDB2
+:10A00000000100200120A070F9E770B5FE4D01238A
+:10A0100029462869896990F87C2009790E2A01D19E
+:10A02000122903D000241C2A03D004E0BDE87040AC
+:10A03000D3E7142902D0202A07D008E080F87C401A
+:10A0400080F8A240BDE87040AFE7162906D0262A66
+:10A0500001D1162902D0172909D00CE000F87C4F55
+:10A0600080F82640407821280CD01A2017E090F87C
+:10A070007D20222A07D0EA69002A03D0FF2901D1D6
+:10A0800080F8A63132E780F87D4001F047FB28696F
+:10A0900080F8974090F8C4010028F3D00020BDE874
+:10A0A000704061E72DE9F843D74C206990F87C10A7
+:10A0B000202909D05FF0000790F87D10222905D0F3
+:10A0C0007FB300F17C0503E00127F5E700F17D0592
+:10A0D00010F8B01F41F004010170A06904F02FFADC
+:10A0E0004FF00108002608B33946A069FFF783FD49
+:10A0F000E0B16A46A169206903F046FD90B3A0690A
+:10A1000004F01BFA2169A1F8AE01B1F8701001F05A
+:10A11000DEFA40B32069282180F88D1080F88C8009
+:10A1200058E0FFE70220A070BDE8F883206990F8AE
+:10A13000C40110B11E20FFF717FFAFB1A06921695C
+:10A14000C07881F8E20008FA00F1C1F3006000B9BC
+:10A15000FFDF20690A2180F87C1090F8A20040B946
+:10A16000FFDF06E009E02AE02E7001F0D7FAFFF7E2
+:10A17000E8FE206980F89760D6E7226992F8C4016A
+:10A1800070B1B2F8703092F86410B2F8C80102F5FC
+:10A19000D77203F0EBFD68B12169252081F87C00BE
+:10A1A000206900F17D0180F897608D4212D180F81E
+:10A1B0007D600FE00020FFF7D7FE2E70F0E72069EA
+:10A1C0009DF8001080F8B0119DF8011080F8B111D1
+:10A1D00024202870206900F17D018D4203D1BDE863
+:10A1E000F84301F09BBA80F8A2609DE770B5864CF9
+:10A1F00001230B21206990F87D20703003F046FB8D
+:10A20000202650BB20690123002190F87D2070306A
+:10A2100003F03CFB0125F0B1206990F87C00242874
+:10A220001BD0A06904F069F9C8B1206990F8B0109A
+:10A2300041F0040180F8B010A1694A7902F00702E8
+:10A2400080F85D20097901F0070180F85C1090F832
+:10A25000C5311BBB06E0A57048E6A67046E6BDE822
+:10A2600070406EE690F8C431C3B900F164035E78C3
+:10A270008E4205D11978914202D180F897500DE0B5
+:10A2800000F504710D7002884A8090F85C200A7114
+:10A2900090F85D0048712079E8F722FE21692120BD
+:10A2A00081F87D00BDE8704001F02FBAF8B5564C3A
+:10A2B000206990F87E0010F0300F04D0A07840F0B4
+:10A2C0000100A070F8BDA06904F0FCF850B3A069CB
+:10A2D00004F0F2F80746A06904F0F2F80646A06917
+:10A2E00004F0E8F80546A06904F0E8F80146009794
+:10A2F000206933462A46303004F0E3F9A07980071C
+:10A3000003D56069C07814280FD0216991F87C00CA
+:10A310001C280AD091F85A0001280ED091F8BB01F0
+:10A3200058B907E0BDE8F8400BE62169012081F843
+:10A330005A0002E091F8BA0130B1206910F87E1F8E
+:10A3400041F0100101700EE091F87E0001F5FE72FF
+:10A3500040F0200081F87E0031F8300B04F03BFA29
+:10A360002079E8F7BDFDBDE8F84001F0CEB970B541
+:10A37000254C206990F87E10890707D590F87C203D
+:10A3800001230821703003F081FAE8B1206990F8C8
+:10A39000AA00800712D4A06904F070F8216981F83E
+:10A3A000AB00A06930F8052FA1F8AC204088A1F8D7
+:10A3B000AE0011F8AA0F40F002000870206990F872
+:10A3C000AA10C90703D00FE00120A0708EE590F815
+:10A3D0007E00800700D5FFDF206910F87E1F41F066
+:10A3E0000201017001F091F92069002590F87C10BC
+:10A3F000062906D180F87C5080F8A2502079E8F731
+:10A400006FFD206902E000000001002090F8AC110F
+:10A410000429DBD180F8AC512079E8F761FD20698F
+:10A4200090F87C100029D1D180F8A2505EE570B57B
+:10A43000FE4C01230021206990F87D20703003F04C
+:10A4400025FA012578B9206990F87D20122A0AD0D2
+:10A4500001230521703003F019FA10B10820A07013
+:10A4600044E5A57042E5206990F8A80008B901F01C
+:10A470004CF92169A06901F5847103F0E0FF2169BD
+:10A48000A069D83103F0E6FF206990F8E00100B13F
+:10A49000FFDF21690888A1F8E20101F5F271A069E6
+:10A4A00003F0BBFF2169A06901F5F67103F0BDFF60
+:10A4B000206980F8E051142180F87D102079BDE8F2
+:10A4C0007040E8F70DBD70B5D84C0123002120691C
+:10A4D00090F87D20703003F0D9F90125A8B1A0696A
+:10A4E00003F067FF98B1A0692169B0F80D00A1F8E9
+:10A4F000AE01B1F8701001F0EAF858B120692821D6
+:10A5000080F88D1080F88C50F0E4A570EEE4BDE882
+:10A51000704016E5A0692169027981F8B021B0F890
+:10A520000520A1F8B22103F037FF2169A1F8B40199
+:10A53000A06903F034FF2169A1F8B601A06903F016
+:10A5400035FF2169A1F8B8010D2081F87D00CDE427
+:10A550007CB5B64CA079C00738D0A069012305218D
+:10A56000C578206990F87D20703003F08FF968B1CC
+:10A57000AD1E0A2D06D2DFE805F009090505090917
+:10A5800005050909A07840F00800A070A07800280F
+:10A590001CD1A06903F0D6FE00286ED0A069022667
+:10A5A000C5781DB1012D01D0162D18D1206990F864
+:10A5B0007C0003F053F990B1206990F87C101F29BA
+:10A5C0000DD0202903D0162D16D0A6707CBD2621D3
+:10A5D00080F87C10162D02D02A20FFF7C5FC0C2D28
+:10A5E00058D00CDC0C2D48D2DFE805F033301D4488
+:10A5F000A8A8489F57A836392020A0707CBD01200C
+:10A60000152D6ED008DC112D6CD0122D6CD0132DB1
+:10A6100064D0142D31D179E0162D7DD0182D7ED047
+:10A62000FF2D2AD184E020690123194690F87F206C
+:10A63000703003F02BF9F8B9A06903F0E7FE216947
+:10A6400081F89201072081F87F0079E001F043F959
+:10A6500076E0FFF738FF73E001F01DF970E0206944
+:10A6600090F87D10112901D0A67069E0122180F8C0
+:10A670007D1065E0FFF7DBFE62E05FE0206990F8A7
+:10A680007D001728F0D101F049F821691B2081F8DD
+:10A690007D0055E0FFF76BFE52E0206990F87E00E8
+:10A6A000C00703D0A07840F0010022E06946A0690D
+:10A6B00003F0EBFE9DF8000000F02501206900F892
+:10A6C000B01F9DF8011001F04901417001F01DF823
+:10A6D000206910F87E1F41F0010113E0FFF77DFCB7
+:10A6E0002EE016E01EE0FFE7216991F87E10490791
+:10A6F00001D5A07024E001F008F8206910F87E1F51
+:10A7000041F0040101701BE006E008E0FFF7CEFD18
+:10A7100016E001F088F813E0FFF768FD10E0FFF79E
+:10A72000C1FC0DE001F05EF80AE0FFF76EFC07E007
+:10A73000E16919B1216981F8A60101E0FFF701FC87
+:10A740002069F0E93012491C42F10002C0E9001210
+:10A750007CBD70B5354CA07900074AD5A07800289B
+:10A7600047D1206990F8E400FE2800D1FFDF20697E
+:10A77000FE21002580F8E41090F87D10192906D1FB
+:10A7800080F8A75000F0CAFF206980F87D5020694A
+:10A7900090F87C101F2902D0272921D119E090F8C8
+:10A7A0007D0003F05BF878B120692621012380F851
+:10A7B0007C1090F87D200B21703003F067F878B999
+:10A7C0002A20FFF7D1FB0BE02169202081F87C00D3
+:10A7D00006E0012180F8A51180F87C5080F8A25095
+:10A7E000206990F87F10082903D10221217080F898
+:10A7F000E41047E410B50D4C216991F8B0210AB975
+:10A8000091F8642081F8642091F8B1210AB991F897
+:10A81000652081F8652010B10020FFF7A5FB2069B5
+:10A8200003F07BFF002809D0206901E0000100202F
+:10A83000BDE8104000F5F77103F0D9BF10BD70B549
+:10A84000F84C06460D46206990F8E400FE2800D03A
+:10A85000FFDF2269002082F8E46015B1A2F8A400AD
+:10A8600010E422F89E0F012010710BE470B5ED4C3E
+:10A8700001230021206990F87C20703003F006F855
+:10A8800000287AD0206990F8BA1111B190F8BB1164
+:10A8900039B190F8C41100296ED090F8C51111B3E8
+:10A8A0006AE090F87D1024291BD090F87C102429B0
+:10A8B00017D0002300F5D87200F5DD7103F0CEFE4D
+:10A8C0002169002081F8BA0101461420FFF7B7FF83
+:10A8D000216901F13000C28A21F8E62F408B4880BF
+:10A8E00050E00123E6E790F87D2001230B21703032
+:10A8F00002F0CCFF68BB206990F8640000F0F3FE22
+:10A900000646206990F8650000F0EDFE05462069D6
+:10A9100090F8C6113046FFF75BF9D8B1206990F87E
+:10A92000C7112846FFF754F9A0B12269B2F8703078
+:10A9300092F86410B2F8C80102F5D77203F016FA63
+:10A9400020B12169252081F87C001BE00020FFF761
+:10A950000BFB11E020690123032190F87D2070306A
+:10A9600002F094FF40B920690123022190F87D2074
+:10A97000703002F08BFF08B100206DE4002116203A
+:10A98000FFF75DFF012067E410B5E8BBA54C206927
+:10A9900090F87E10CA0702D00121092052E08A07F0
+:10A9A0000AD501210C20FFF74AFF206910F8AA1FE1
+:10A9B00041F00101017047E04A0702D5012113204F
+:10A9C00040E00A0705D510F8E11F41710121072079
+:10A9D00038E011F0300F3BD090F8BB11A1B990F8DE
+:10A9E000BA11E1B190F87D1024292FD090F87C1095
+:10A9F00024292BD05FF0000300F5D87200F5DD713B
+:10AA000003F02CFE216900E022E011F87E0F20F017
+:10AA1000200040F010000870002081F83C012069FF
+:10AA200090F87E10C90613D503F077FEFFF7BDFA44
+:10AA3000216901F13000C28A21F8E62F408B48805D
+:10AA400001211520FFF7FBFE012010BD0123D3E7F4
+:10AA5000002010BD70B5734C206990F8E410FE29F9
+:10AA600078D1A178002975D190F87F20012319466B
+:10AA7000703002F00BFF00286CD1206990F8901123
+:10AA800049B10021A0F89C1090F8911180F8E610CF
+:10AA9000002102205BE090F87D200123042170302A
+:10AAA00002F0F4FE0546FFF76FFF002852D128465A
+:10AAB00000F075FF00284DD120690123002190F896
+:10AAC0007C20703002F0E2FE78B12069012304217D
+:10AAD00090F87D20703002F0D9FE30B9206990F8EE
+:10AAE000960010B10021122031E0206990F87C20FE
+:10AAF0000A2A0DD0002D2DD101230021703002F043
+:10AB0000C5FE78B1206990F8AC1104290AD105E09E
+:10AB100010F8E21F01710021072018E090F8AA0048
+:10AB2000800718D0FFF7A2FE002813D12069012367
+:10AB3000002190F87C20703002F0A8FE002809D097
+:10AB4000206990F8A401002804D00021FF20BDE86E
+:10AB5000704074E609E000210C20FFF770FE2069C8
+:10AB600010F8AA1F41F0010101702FE43EB505461F
+:10AB70006846FDF79BFC00B9FFDF22220021009808
+:10AB8000F3F77DFC0321009803F0C4FB00980178E3
+:10AB900021F010010170294603F0E1FB214C0D2D3D
+:10ABA00042D00BDCA5F102050B2D19D2DFE805F030
+:10ABB0001F184919191F185518192400152D5DD093
+:10ABC00008DC112D25D0122D0BD0132D09D0142DFA
+:10ABD00006D153E0162D2BD0172D68D0FF2D72D043
+:10ABE000FFDFFDF776FC002800D1FFDF3EBD2169C5
+:10ABF000009891F8E61019E0E26800981178017168
+:10AC000091884171090A81715188C171090A0172E3
+:10AC1000E7E70321009803F0ACFC0621009803F05D
+:10AC2000ACFCDEE700010020009806210171D8E7A6
+:10AC30000098216991F8C621027191F8C7114171FC
+:10AC4000CFE72169009801F5887103F007FC2169BD
+:10AC50000098DC3103F00CFCC3E7FA49D1E90001AC
+:10AC6000CDE90101206901A990F8B00000F02500AC
+:10AC70008DF80400009803F036FCB2E72069B0F8C4
+:10AC80004810009803F006FC2069B0F8E81000981E
+:10AC900003F004FC2069B0F84410009803F002FCB3
+:10ACA0002069B0F8E610009803F000FC99E72169EC
+:10ACB00091F8C40100280098BCD111F8642F0271EA
+:10ACC0004978BCE7FFE7206990F8A721D0F8A811E0
+:10ACD000009803F052FB84E7DB4810B5006990F858
+:10ACE000821041B990F87D2001230621703002F0D6
+:10ACF000CDFD002800D0012010BD70B5D24D2869CF
+:10AD000090F8801039B1012905D0022906D0032915
+:10AD100004D0FFDF1BE4B0F8F41037E090F87F10A8
+:10AD2000082936D0B0F89810B0F89A2000248B1C6F
+:10AD30009A4206D3511A891E0C04240C01D0641EB9
+:10AD4000A4B290F8961039B190F87C200123092123
+:10AD5000703002F09BFD40B3FFF7BEFF78B1296968
+:10AD60000020B1F89020B1F88E108B1C9A4203D3CA
+:10AD7000501A801E00D0401EA04200D284B20CB1F6
+:10AD8000641EA4B22869B0F8F4102144A0F8F010B1
+:10AD90002FE5B0F898100329BDD330F8701F428D0D
+:10ADA0001144491CA0F8801023E50024EAE770B59F
+:10ADB0000C4605464FF4087200212046F3F75FFB6E
+:10ADC000258016E5F8F7D4B92DE9F0410D46074680
+:10ADD0000721F8F7C3F8041E3CD094F8CC010026F4
+:10ADE000A8B16E70092028700BE0268484F8CC612D
+:10ADF000D4F8CE016860D4F8D201A860B4F8D601C6
+:10AE0000A88194F8CC010028EFD12E71AEE094F81F
+:10AE1000D80190B394F8D8010D2813D00E2801D092
+:10AE2000FFDFA3E02088F8F7CCF90746F7F777FEB5
+:10AE300078B96E700E20287094F8DA012871208895
+:10AE4000E88014E02088F8F7BCF90746F7F767FEBA
+:10AE500010B10020BDE8F0816E700D20287094F8CC
+:10AE6000DA0128712088E88094F8DE01287284F8DD
+:10AE7000D8613846F7F74DFE78E0FFE794F80E0208
+:10AE800030B16E701020287084F80E62AF806DE0D3
+:10AE900094F8E00190B16E700A2028702088A88094
+:10AEA000D4F8E411C5F80610D4F8E811C5F80A1072
+:10AEB000B4F8EC01E88184F8E06157E094F8080206
+:10AEC00070B16E701A20287005E000BF84F8086227
+:10AED000D4F80A02686094F808020028F6D145E028
+:10AEE00094F8EE0188B16E701520287008E000BF5C
+:10AEF00084F8EE6104F5F8702B1D07C883E807009D
+:10AF000094F8EE010028F3D130E094F8FC0170B120
+:10AF10006E701C20287084F8FC61D4F8FE01686013
+:10AF2000D4F80202A860B4F80602A8811EE094F8E2
+:10AF3000100238B11D20287084F81062D4F8120273
+:10AF4000686013E094F81602002883D06E70162013
+:10AF5000287007E084F81662D4F818026860B4F824
+:10AF60001C02288194F816020028F3D1012071E711
+:10AF700035480021C16101620846704730B5324D45
+:10AF80000C46E860FFF7F4FF00B1FFDF2C7130BD25
+:10AF9000002180F87C1080F87D1080F8801090F8F7
+:10AFA000FE1009B1022100E00321FEF75DBC2DE98E
+:10AFB000F041254C0546206909B1002104E0B0F8B4
+:10AFC0000611B0F8F6201144A0F8061190F890117F
+:10AFD00039B990F87F2001231946703002F056FCF1
+:10AFE00030B1206930F89C1FB0F85A20114401801C
+:10AFF000206990F8A23033B1B0F89E10B0F8F62076
+:10B000001144A0F89E1090F9A670002F06DDB0F84C
+:10B01000A410B0F8F6201144A0F8A41001213D2698
+:10B0200015B180F88D6017E02278022A0ED0012A2F
+:10B0300015D0A2784AB380F88C1012F0140F11D0FA
+:10B040001E2117E0EC6302000001002090F8E620CA
+:10B05000062A3CD016223AE080F88C1044E090F8A2
+:10B06000922134E0110702D580F88D603CE0910612
+:10B0700003D5232180F88D1036E0900700D1FFDF43
+:10B0800021692A2081F88D002AE02BB1B0F89E209A
+:10B09000B0F8A0309A4210D2002F05DDB0F8A420FD
+:10B0A000B0F8A0309A4208D2B0F89C30B0F89A209C
+:10B0B000934204D390F890310BB1222207E090F82C
+:10B0C00080303BB1B0F89830934209D3082280F821
+:10B0D0008D20C1E7B0F89820062A01D33E22F6E77A
+:10B0E000206990F88C1019B12069BDE8F0414FE754
+:10B0F000BDE8F0410021FEF7B7BB2DE9F047FF4C5A
+:10B1000081460D4620690088F8F76DF8060000D1E9
+:10B11000FFDFA0782843A070A0794FF000058006DB
+:10B12000206904D5A0F8985080F8045103E030F865
+:10B13000981F491C0180FFF7CFFD012740B3E0882D
+:10B14000000506D5206990F8821011B1A0F88E5044
+:10B150001EE02069B0F88E10491C89B2A0F88E104C
+:10B16000B0F890208A4201D3531A00E00023B4F8CB
+:10B1700008C00CF1050C634501D880F89670914227
+:10B1800006D3A0F88E5080F80E722079E7F7A8FE5B
+:10B19000A0794FF0020810F0600F0ED0206990F8EF
+:10B1A000801011B1032908D102E080F8807001E01D
+:10B1B00080F880800121FEF757FB206990F880100D
+:10B1C000012904D1E188C90501D580F88080B9F151
+:10B1D000000F71D1E188890502D5A0F8185104E06B
+:10B1E000B0F81811491CA0F8181100F09FFBFEF7E9
+:10B1F00040FDFFF72FFC00F073FF0028206902D00C
+:10B20000A0F8F85003E030F8F81F491C018000F066
+:10B210006AFF38B1206990F80411022907D8491C47
+:10B2200080F80411206990F80401022804D92069EB
+:10B2300020F8F85F4580057320690123002190F80C
+:10B240007D20703002F022FB20B9206990F87D004B
+:10B250000C286AD120690123002190F87C207030ED
+:10B2600002F014FB48B320690123002190F87F20ED
+:10B27000703002F00BFB00B3206990F880100229B7
+:10B2800053D190F80401C0B93046F7F718FAA0B1CD
+:10B29000216991F8E400FE2847D1B1F8F2000128B5
+:10B2A00043D981F8FD70B1F89A20B1F89800931E47
+:10B2B000984203DB012004E043E036E0101A401E10
+:10B2C00080B2B1F8F82023899A4201D3012202E02A
+:10B2D0009A1A521C92B2904200D91046012801D10C
+:10B2E00081F8FD5091F86F206AB98A6E5AB1B1F8B1
+:10B2F0009420B1F87030D21A12B2002A03DD9042C5
+:10B3000000DB104680B291F8882192B1B1F8FA20A2
+:10B31000B1F88A118A4201D3012102E0891A491C3D
+:10B3200089B2884205D9084603E02169012081F8E5
+:10B33000FD502169B1F870201044A1F8F400FFF726
+:10B34000DCFCE088C0F340214846FFF730FE20696E
+:10B3500080F8FE50BDE8F047FDF7DDB867490246CA
+:10B360008878CB78184312D10846006942B18979B0
+:10B37000090703D590F87F00082808D001207047FE
+:10B38000B0F84C10028E914201D8FEF7C6B90020E9
+:10B39000704770B5594C05460E46E0882843E0805A
+:10B3A000A80703D5E80700D0FFDF6661EA074FF082
+:10B3B00000014FF001001AD0A661F278062A02D0EF
+:10B3C0000B2A14D10AE0226992F87D30172B0ED196
+:10B3D0000023E2E92E3302F8370C08E0226992F8E4
+:10B3E0007D30112B03D182F8811082F8A800AA07C2
+:10B3F00018D56269D278052A02D00B2A12D10AE048
+:10B40000216991F87D20152A0CD10022E1E9302232
+:10B4100001F83E0C06E0206990F87D20102A01D149
+:10B4200080F88210280601D50820E07072E42DE92A
+:10B43000F84F324C00254FF00108E580A570E5700B
+:10B440004146257061F3070220619246814680F8EB
+:10B45000FE800088F7F7C7FE070000D1FFDF2069F4
+:10B460000088FDF720F820690088FDF742F8206980
+:10B47000B0F8F21071B190F8E410FE290FD190F8F5
+:10B48000901189B190F87F2001231946703002F0A5
+:10B49000FDF978B1206990F8E400FE2804D0206915
+:10B4A00090F8E400FFF762FB206990F8FF1089B183
+:10B4B000258118E02069A0F89C5090F8911180F83F
+:10B4C000E61000210220FFF7BAF9206980F8FD504C
+:10B4D0000220E7E790F8CC1119B9018C82889142DB
+:10B4E00000D881882181B0F8F610491E8EB2B0F8DC
+:10B4F000F8103144A0F8F81002E00000000100202C
+:10B5000090F8FC1021B1A0F8FA5080F8FC5004E04B
+:10B51000B0F8FA103144A0F8FA1030F8981F31440E
+:10B520000180FFF7D9FB20B1206930F88E1F31442C
+:10B5300001802069B0F8F210012902D8491CA0F856
+:10B54000F2100EB180F8045190F8FD10A1B1B0F8DE
+:10B55000F800218988420FD23846F7F7B0F858B181
+:10B56000206990F8881139B1B0F8FA10B0F88A0162
+:10B57000814201D300F0BAFD206980F8FD5090F8B7
+:10B580007D100B2901D00C2916D1B0F87020B0F82D
+:10B59000AE31D21A12B2002A0EDBD0F8B01181609F
+:10B5A00090F8B4110173032101F061FD206980F866
+:10B5B0007D5080F8B28026E0242910D1B0F87010B8
+:10B5C000B0F8AE21891A09B2002908DB90F8C4014D
+:10B5D000FFF710F9206900F87D5F857613E090F899
+:10B5E0007C10242901D025290DD1B0F87010B0F8B5
+:10B5F000AE01081A00B2002805DB0120FFF7FAF8B7
+:10B60000206980F87C5020690146B0F8F62070303F
+:10B6100001F0F5FE206990F8881109B1A0F8FA5000
+:10B62000F7480090F74BF84A4946504600F096FC20
+:10B63000216A11B16078FCF77CFA206901230521A9
+:10B6400090F87D20703002F021F9002803D0BDE889
+:10B65000F84F00F02ABABDE8F88F00F027BDEB499B
+:10B66000C8617047E948C069002800D001207047D0
+:10B67000E64A50701162704710B50446B0F8B42124
+:10B680004388B0F8B611B0F8B8019A4205D1A38842
+:10B69000994202D1E38898420FD02388A4F8D03190
+:10B6A000A4F8D221A4F8D411A4F8D601012084F87A
+:10B6B000CC01D6480079E7F713FC0221204601F0BF
+:10B6C000D6FC002004F87D0F0320E07010BD401A66
+:10B6D00000B247F6FE71884201DC002801DC01203F
+:10B6E00070470020704710B5012808D0022808D004
+:10B6F000042808D0082806D0FFDF204610BD01240A
+:10B70000FBE70224F9E70324F7E7C04800210069BA
+:10B7100020F8A41F8178491C81707047BB4800B590
+:10B72000016911F8A60F401E40B20870002800DA27
+:10B73000FFDF00BDB5482721006980F87C1000219B
+:10B7400080F8A411704710B5B04C206990F8AC1186
+:10B75000042916D190F87C2001230021703002F0DA
+:10B7600095F800B9FFDF206990F8AA10890703D483
+:10B77000062180F87C1004E0002180F8A21080F8F7
+:10B78000AC11206990F87E00800707D5FFF7C6FF4F
+:10B79000206910F87E1F21F00201017010BD9B4945
+:10B7A00010B5096991F87C200A2A09D191F8E220A4
+:10B7B000824205D1002081F87C0081F8A20010BDF2
+:10B7C00091F87E20130706D522F0080081F87E004C
+:10B7D000BDE81040A2E7FF2801D0FFDF10BDBDE8A3
+:10B7E0001040A7E710B5894C206910F8B01F41F050
+:10B7F00004010170A06902F0BEFE162806D120697E
+:10B8000090F87C00202802D0262805D010BDA06921
+:10B8100002F0B5FEFEF7A8FB2169002081F87C004C
+:10B8200081F8A20010BDF8B5784C01230A212069E7
+:10B8300090F87C20703002F029F838B3A06902F04B
+:10B8400041FEC8B1A06902F037FE0746A06902F0C8
+:10B8500037FE0646A06902F02DFE0546A06902F0FB
+:10B860002DFE01460097206933462A46303002F00B
+:10B8700028FF206902F051FF2169002081F8A20011
+:10B8800081F87C00BDE8F840FEF78FBBA07840F05F
+:10B890000100A070F8BD10B55C4C012300212069A7
+:10B8A00090F87D20703001F0F1FF30B1FFF72DFFEF
+:10B8B0002169102081F87D0010BD20690123052138
+:10B8C00090F87D20703001F0E1FF08B1082000E021
+:10B8D0000120A07010BD70B54C4C012300212069DF
+:10B8E00090F87D20703001F0D1FF012588B1A0696A
+:10B8F00002F089FD2169A1F8AE01B1F87010FFF7DF
+:10B90000E6FE40B12069282180F88D1080F88C5027
+:10B910008CE5A5708AE52169A06901F5D87102F06E
+:10B920006DFD21690B2081F87D007FE510B5FEF7E4
+:10B9300010FFFEF70DFE354CA079400708D5A07822
+:10B9400030B9206990F87F00072801D101202070CC
+:10B95000FEF72EFAA079C00609D5A07838B920697B
+:10B9600090F87D100B2902D10C2180F87D10E07831
+:10B9700000070ED520690123052190F87D20703045
+:10B9800001F084FF30B10820A0702169002081F807
+:10B99000D80110BDBDE81040002000F0ABBB10B5D1
+:10B9A0001A4C216991F87D2048B3102A06D0142A38
+:10B9B00007D0152A1AD01B2A35D11AE001210B20F5
+:10B9C00019E0FAF7BFFD0C2817D32069082100F50C
+:10B9D0008870FAF7BBFD28B120690421DC30FAF742
+:10B9E000B5FD00B9FFDF0121042004E000F020F8DC
+:10B9F00003E001210620FEF722FF012010BD07E031
+:10BA0000FBB001005DB3010093B301000001002011
+:10BA1000212A08D191F8970038B991F8C40110B1E2
+:10BA200091F8C50108B10020E8E701211720E2E7FD
+:10BA300070B5184C0025206990F8931101290AD09F
+:10BA4000022925D190F8A810A9B1062180F8E610A6
+:10BA50000121022017E090F8D811002918D100F137
+:10BA6000C80300F58471002200F5CA7001F088FE59
+:10BA70000121052007E090F8B000400701D5112012
+:10BA800000E00D200121FEF7DAFE206980F89351D5
+:10BA9000CCE400000001002030B5F94C05462078C8
+:10BAA000002818BFFFDF257230BDF5490120C8719D
+:10BAB00070472DE9F14FF34E3046446804F17009A8
+:10BAC00094F86510608F258F082967D001F090FFEA
+:10BAD000854238BF284600F0FF08DFF8A4A3EA48F3
+:10BAE000CAF82400776897F8651097F882B03D8F00
+:10BAF000788F082956D001F07BFF854238BF284651
+:10BB0000BBF1000F1CBF001D80B2C0B297F86510DA
+:10BB1000FBF700FC99F81200002847D009F1580102
+:10BB2000D94891E80E1000F5027585E80E10D9F895
+:10BB30006810C0F82112D9F86C10C0F8251200F571
+:10BB40008170FBF786FF307800280CBF01200020B1
+:10BB500080F00101CD480176D9E91412C0E9041240
+:10BB6000A0F58372DAF82410FBF7C1F994F86500A8
+:10BB7000012808BF00220CD0022808BF012208D0EB
+:10BB8000042808BF032204D008281ABFFFDF0022C0
+:10BB9000022241460120FBF7C5F90DE0042101F026
+:10BBA00027FF95E7042101F023FFA6E7DAF8240038
+:10BBB000FBF74FFFFBF7E2F9009850B994F86500E6
+:10BBC00094F8661010F00C0F08BF00219620FBF7C8
+:10BBD00061FF94F8642001210020FCF718F894F824
+:10BBE0002C00012808BFFBF7E2FF02208AF80000C2
+:10BBF000FCF7D6FB002818BFFFDFBDE8F88F2DE962
+:10BC0000F04FDFF880A28BB050469AF800204068D1
+:10BC1000AAF11401059190F8751000F17005044621
+:10BC20004FF008080127AAF13406A1B3012900F05A
+:10BC30000581022900F00681032918BFFFDF00F00B
+:10BC40000F81306A0423017821F008010170AA797C
+:10BC500008EAC202114321F004010170EA7903EA03
+:10BC60008202114321F01001017095F80590F06AED
+:10BC7000F6F735FD8046FCF760FCB9F1020F00F0E5
+:10BC8000F780B9F1010F00F0F780B9F1030F00F070
+:10BC9000FF8000F002B9FFE795F80CC04FF00209F1
+:10BCA0004FF0000BBCF1240F1CBF6B7B242B08D082
+:10BCB000BCF11F0F18BFBCF1200F29D0222B4CD094
+:10BCC00076E094F8641092B190F8B001002873D037
+:10BCD000082918BF042968D0082818BF042864D090
+:10BCE000012918BF012852D04FF0020164E090F8FA
+:10BCF0001201002860D0082918BF042955D008284F
+:10BD000018BF042851D0012918BF01283FD0EBE704
+:10BD1000222B22D0002A4BD090F8C60194F8641050
+:10BD200010F0040F18BF40460CD0082918BF042992
+:10BD30003BD0082818BF042837D0012918BF012894
+:10BD400025D0D1E710F0010F18BF3846EDD110F023
+:10BD5000020F18BF4846E8D12EE04AB390F8C6213A
+:10BD600090F85D0094F8641002EA000010F0040FEF
+:10BD700018BF40460ED0082918BF042915D008283E
+:10BD800018BF042811D0012918BF0128ACD14FF0E9
+:10BD9000010111E010F0010F18BF3846EBD110F08F
+:10BDA000020F18BF4846E6D106E04FF0080103E055
+:10BDB00094F864100429F8D0A08E11F00C0F18BF6D
+:10BDC0004FF4296001F014FE218E814238BF0846ED
+:10BDD000ADF80400A4F84C000598FCF78DFB60B1A9
+:10BDE000B289316A42F48062B28172694FF4806034
+:10BDF000904703206871EF7023E709AA01A9F06A50
+:10BE0000F6F7A7FB306210B195F8371021B105980D
+:10BE1000FCF746FB6F7114E79DF8241031B9A0F8C8
+:10BE200000B080F802B0012102F074FABDF80410ED
+:10BE3000306A02F0A6FB85F8059002E70598FCF74A
+:10BE40002FFBFEE6B4F84C00ADF8040009AA01A9E6
+:10BE5000F06AF6F77EFB3062002808BFFFDFF0E6ED
+:10BE60000598FCF749FB002808BFFFDFE9E600BFA3
+:10BE700030EA080011D10EE030EA08000DD10AE0E6
+:10BE80002401002058010020300D0020380F002030
+:10BE9000B8F1000F01D0012100E00021306A0278E2
+:10BEA00042EA01110170697C00291CBF69790129EE
+:10BEB0003BD005F15801FD4891E80E1000F50278DD
+:10BEC00088E80E10A96EC0F82112E96EC0F825129C
+:10BED00000F58170FBF7BDFD9AF8000000280CBF4B
+:10BEE00001210021F2480176D5E91212C0E90412BD
+:10BEF000A0F58371326AFAF7FAFF94F8640001281A
+:10BF000008BF00220CD0022808BF012208D0042854
+:10BF100008BF032204D008281ABFFFDF0022022234
+:10BF2000FB210020FAF7FEFF03E0FBF792FDFBF791
+:10BF300025F8012194F865200846FBF768FE377163
+:10BF4000306A018831828078B0743770FCF731FA3A
+:10BF5000002818BFFFDF0BB0BDE8F08F2DE9F043DC
+:10BF6000D44D87B081462878DDF838801E461746C4
+:10BF70000C4628B9002F1CBF002EB8F1000F00D1CD
+:10BF8000FFDFC5F81C80C5E90D94C5E905764FF0C3
+:10BF90000000E871A871E870A87028716871C64E39
+:10BFA000A881E881307804F170072088F7F71BF941
+:10BFB000E8622088F7F705F92863FBF7CFF994F9D1
+:10BFC0006700FBF79BFA04F11200FBF719FD04F17F
+:10BFD0000E00FBF799FA307800280CBF03200120EF
+:10BFE000FBF734FDB54890E80E108DE80E10D0E94F
+:10BFF0000410CDE90410307800280CBFB048B148D7
+:10C0000004906846FBF710FDF87EFBF785FAFBF716
+:10C0100017FD94F86F0078B9A06E68B1B88C3988B4
+:10C02000884209D1B4F86C1001220844B88494F80D
+:10C030006E00A16EF8F7B9FE3078002804BFFF202B
+:10C0400094F8644012D094F86510BF7C258F608FFF
+:10C0500008291FD001F0CCFC854238BF2846002FAC
+:10C060001CBF001D80B2C0B294F865402146FBF7AA
+:10C0700051F93078214688B10120FBF714FB706834
+:10C08000D0F80001FBF7E8FC0120FFF712FD07B034
+:10C09000BDE8F083042101F0ABFCDDE70020FBF7F5
+:10C0A00002FBFFF7ACFD07B0BDE8F083824800B5A6
+:10C0B00001783438007819B1022818BFFFDF00BDBD
+:10C0C000012818BFFFDF00BD7A4810B500780228AC
+:10C0D00018BFFFDFBDE8104000F03ABA00F038BAF0
+:10C0E0007448007970477348C078704771490120DF
+:10C0F000487170472DE9F04706006F486D4D406864
+:10C1000000F17004686A90F8019018BF012E03D105
+:10C11000296B09F013F86870687800274FF0010860
+:10C12000A0B101283CD0022860D003281CBFFFDF4B
+:10C13000BDE8F087012E08BFBDE8F087286BF6F751
+:10C14000C3FC287ABDE8F047E6F7CABE012E14D03A
+:10C15000A86A002808BFFFDF6889C21CD5E909105A
+:10C16000F2F763F9A86A686201224946286BF6F77C
+:10C1700027FB022E08BFBDE8F087D4E91401401C5C
+:10C1800041F10001C4E91401E079012801D1E7710E
+:10C1900001E084F80780287ABDE8F047E6F7A0BE02
+:10C1A000012E14D0A86A002808BFFFDF6889C21CCE
+:10C1B000D5E90910F2F739F9A86A68620022494600
+:10C1C000286BF6F7FDFA022E08BFBDE8F087D4E928
+:10C1D0001410491C40F10000C4E91410E079012852
+:10C1E0000CBFE77184F80780BDE8F087012E06D008
+:10C1F000286BF6F769FC022E08BFBDE8F087D4E98A
+:10C200001410491C40F10000C4E91410E079012821
+:10C21000BFD1BCE770B5284E3046A6F13404406863
+:10C2200000F170052078012818BFFFDFA87868B1F9
+:10C230000021A970A289042042F00402A28162694F
+:10C240009047307800281CBF01202871216A032202
+:10C25000087832EA000009D1A28912F4806F05D073
+:10C2600042F00202A281626902209047012100206F
+:10C2700000F098F918B1BDE8704000F069B9BDE868
+:10C280007040002015E42DE9F14F0B4E0027304699
+:10C29000A6F134054068317800F1700A2878B84674
+:10C2A000022818BFFFDFE8890EE00000300D0020F3
+:10C2B000380F00202401002058010020F463020000
+:10C2C0007B2302004199010040F40070E88171680D
+:10C2D0003078FF2091F86410FBF71CF800980028D4
+:10C2E0009AF8120000F0FC80FAF76DFEFAF75BFE98
+:10C2F0004FF0010990B99AF8120078B1686A417854
+:10C3000061B100789AF80710C0F3C000884205D1E7
+:10C3100085F80290BDE8F84F00F01AB9686A4178D4
+:10C320006981002908BFAF6203D0286BF6F702FAD3
+:10C33000A862E88940F02000E881EF7030787068EA
+:10C3400000F17004834690F82C0001281AD1FBF705
+:10C3500024FC2146584601F054FA98B13078002860
+:10C3600070680CBF00F59A7000F50270BBF8001001
+:10C370004180217A0171617A417180F80090287AB8
+:10C38000E6F7AEFD686A9AF806100078C0F3800000
+:10C3900088423BD03078706800F1700490F87500E6
+:10C3A00000282FD002284BD06771307800281CBF9E
+:10C3B0002079002809D02771AA89394642F0100255
+:10C3C000AA816A694FF010009047E078A0B1E77049
+:10C3D000FCF7A1F8002808BFFFDF0820AA89002188
+:10C3E00042F00802AA816A699047D4E91202411C0E
+:10C3F00042F10000C4E91210A07901280CBFA77116
+:10C4000084F80690E88940F48070E881696A9AF8B7
+:10C4100007300878C0F3C0029A424ED13278726871
+:10C4200000F0030002F17004012818BF02282DD08B
+:10C4300003281CBFA87940F0040012D0A8713CE08A
+:10C44000E86AF6F7B2F8002808BFFFDFD4E9120265
+:10C45000411C42F10000C4E91210287AE6F740FDC1
+:10C46000A2E784F80290EA89484642F40062EA8131
+:10C47000AA8942F00102AA816A699047E0790128FD
+:10C4800001D1E77119E084F8079016E0487818B3F5
+:10C49000E98941F40061E981A96A71B1FB2884BF8F
+:10C4A000A87940F01000C9D8E879002808BFC8462C
+:10C4B00003D080206A69002190470120009900F094
+:10C4C00071F8B0B1B8F1000F1CBF0020FFF712FEE9
+:10C4D000BDE8F84F00F03CB8E0790128D3D1D0E7AF
+:10C4E000002818BFFAF7A9FDE88940F04000E8816C
+:10C4F000E3E7B8F1000F1CBF0120FFF7FBFDFFF7DA
+:10C500007EFBB8F1000F08BFBDE8F88F0220BDE840
+:10C51000F84FEFE570B50D460646424841490078B0
+:10C520004C6850B1FAF7FFFD034694F864202946A1
+:10C530003046BDE87040FDF795BAFAF7F4FD0346C2
+:10C5400094F8642029463046BDE8704005F019BFD4
+:10C55000344910B54C68FBF7FFFAFBF7DEFAFBF73E
+:10C56000A5F9FBF753FAFAF709FD94F82C00012816
+:10C5700008BFFBF712FB94F86F0038B9A06E28B122
+:10C58000002294F86E001146F8F70FFC264C0021AB
+:10C590006269E0899047E269A179A078904700201C
+:10C5A000207010BD70B5204C0546002908BF012D34
+:10C5B00006D1E07800F10100C0B2E07001282ED869
+:10C5C000A16928468847002829D06179174839B1E0
+:10C5D000012D01BF41780029017811F0100F1ED004
+:10C5E000A179E1B90F490978002908BF012D01D0CF
+:10C5F00091B18DB90E49097811F0100F04BF007880
+:10C6000010F0100F0BD0A08948B9A06A20B960893A
+:10C6100010B111F0100F02D04FF0000070BD4FF0BC
+:10C62000010070BD5801002024010020300D0020C1
+:10C6300034010020FE498A78824286BF084490F87F
+:10C6400043010020704710B540F2D3120021F84892
+:10C65000F1F715FF0822FF21F648F1F710FFF64821
+:10C660000021417081704FF46171818010BD2DE90E
+:10C67000F0410E46054600F0AEFBED4C102816D0FA
+:10C6800004EBC00191F85A0110F0010F1CBF01200A
+:10C69000BDE8F081607808283CBF012081F85A018C
+:10C6A0001CD26078401C60700120BDE8F081607889
+:10C6B000082813D222780127501C207004EBC208EE
+:10C6C0003068C8F85401B088A8F85801102A28BF6B
+:10C6D000FFDF88F8535188F85A71E2E70020BDE87F
+:10C6E000F081D54988707047D3488078704770B41E
+:10C6F000CF4800250178491E4BB2002B47DB00BF15
+:10C7000000EBC30191F85A1111F0010F3BD04278B0
+:10C71000D9B2521E427000EBC10282F85A5190F811
+:10C7200002C00022BCF1000F0BD9841894F80361F9
+:10C730008E4202D1102A26D103E0521CD2B2944577
+:10C74000F3D80278521ED2B202708A421BD000EB9C
+:10C75000C20200EBC10CD2F85341CCF85341D2F8DD
+:10C760005721CCF85721847890F800C00022002C83
+:10C7700009D9861896F8036166450CD1102A1CBFAA
+:10C78000024482F80311591E4BB2002BB8DAAA48B2
+:10C79000857070BC7047521CD2B29442E9D8F2E75F
+:10C7A000A3498A78824286BF01EB0010C01C00209A
+:10C7B00070472DE9F04101261F469046344600257A
+:10C7C00000F009FB10282AD099494FF0000C01EB2A
+:10C7D000C00292F85A2102F001058A78002A1ED977
+:10C7E00001EB0C0393F8033183421FD1BCF1100F0E
+:10C7F00015D0002F18BF87F800C0887860450ED983
+:10C8000001EB0C1010F1030F09D001EB0C0090F8B4
+:10C810004B4190F83B0101280CBF0126002648EA55
+:10C82000050046EA04010840BDE8F0810CF101036F
+:10C8300003F0FF0C6245D3D8F1E72DE9F05F1F4606
+:10C8400090460E46814600F0C6FA794D04461028FF
+:10C850003CD00146AB780020002B0ED92A1892F864
+:10C8600003218A4205D110281CBF1220BDE8F09F89
+:10C8700003E0401CC0B28342F0D8082B3FD2102CFA
+:10C8800027D0AE781022701CA87005EB061909F1AC
+:10C890000300414600F05AFF09F183001022394697
+:10C8A00000F054FF1021384600F02DFF35441021D0
+:10C8B00085F84301404600F026FF85F84B0185F8D6
+:10C8C0000341002085F83B01BDE8F09FAB78082BC1
+:10C8D00015D22C78CA46601C287005EBC409306854
+:10C8E000C9F85401B0884FF0000BA9F85801102C7A
+:10C8F00028BFFFDF89F853A189F85AB1C1E70720A3
+:10C90000BDE8F09F70B44A488178491E4BB2002BB5
+:10C91000BCBF70BC704700BF817803F0FF0C491E9C
+:10C92000CAB2827050FA83F191F8031194453ED057
+:10C9300000EB021500EB0C14D5F80360C4F803609B
+:10C94000D5F80760C4F80760D5F80B60C4F80B6031
+:10C95000D5F80F60C4F80F60D5F88360C4F8836021
+:10C96000D5F88760C4F88760D5F88B60C4F88B6011
+:10C97000D5F88F50C4F88F50851800EB0C0402EBEB
+:10C98000420295F803610CEB4C0C00EB420284F878
+:10C99000036100EB4C0CD2F80B61CCF80B61B2F8E0
+:10C9A0000F21ACF80F2195F83B2184F83B2100EBD7
+:10C9B000C10292F85A2112F0010F33D190F802C04F
+:10C9C0000022BCF1000F0BD9841894F803518D425A
+:10C9D00002D1102A26D103E0521CD2B29445F3D8DA
+:10C9E0000278521ED2B202708A421BD000EBC20201
+:10C9F00000EBC10CD2F85341CCF85341D2F8572187
+:10CA0000CCF85721847890F800C00022002C09D976
+:10CA1000851895F80351654512D1102A1CBF0244B0
+:10CA200082F80311591E4BB2002BBFF675AF05E01B
+:10CA3000600F00206C0100206001002070BC704776
+:10CA4000521CD2B29442E3D8ECE7FE4948707047DA
+:10CA5000FC484078704738B14AF2B811884203D890
+:10CA6000F84988800120704700207047F548808889
+:10CA7000704710B500F0AFF9102814D0F24A014603
+:10CA8000002092F802C0BCF1000F0CD9131893F8E3
+:10CA900003318B4203D1102818BF10BD03E0401CA6
+:10CAA000C0B28445F2D8082010BDE7498A78824296
+:10CAB00086BF01EB0010833000207047E24B93F8F3
+:10CAC00002C084459CBF00207047184490F80301C1
+:10CAD00003EBC00090F853310B70D0F85411116083
+:10CAE000B0F85801908001207047D74A114491F85E
+:10CAF0000321D4490A700268C1F806208088488161
+:10CB0000704770B516460C460546FBF73BF8FAF73A
+:10CB10004AF9CC48407868B1CB48817851B12A199C
+:10CB2000002E0CBF8330C01CFAF717F9FAF75EF934
+:10CB3000012070BD002070BD10B5FAF785F90028FE
+:10CB400004BFFF2010BDBDE81040FAF7A3B9FAF703
+:10CB50007BB9BD498A7882429CBF00207047084457
+:10CB600090F8030101EBC00090F85A0100F00100B9
+:10CB700070472DE9F047B44E00273D463078002835
+:10CB80008CBFDFF8C882BDE8F0870024B0780028A9
+:10CB900008D9311991F80321AA4204D0611CCCB202
+:10CBA000A042F6D81024A04286BF06EB0410C01C99
+:10CBB000002006EBC50999F85A1111F0010F16D0A3
+:10CBC00050B1102C04D0311991F83B11012903D038
+:10CBD000102100F098FD50B108F8074038467B1C42
+:10CBE00099F8532109F5AA71DFB2FAF736FC681CEF
+:10CBF000C5B23078A842C8D8BDE8F0872DE9F04129
+:10CC0000914C00263546A07800288CBF8F4FBDE898
+:10CC1000F0816119C0B291F80381A84286BF04EB8C
+:10CC20000510C01C002091F83B11012903D01021F0
+:10CC300000F069FD58B104EBC800BD5590F85321D0
+:10CC400000F5AA713046731CDEB2FAF706FC681CC8
+:10CC5000C5B2A078A842DCD8BDE8F08101447A488A
+:10CC600010B500EB02100A4601218330FAF775F87F
+:10CC7000BDE81040FAF7BAB80A46724910B54978CB
+:10CC800041B1714B997829B10244D81CFAF765F883
+:10CC9000012010BD002010BD6B4A01EB410102EBE9
+:10CCA00041010268C1F80B218088A1F80F0170478B
+:10CCB0002DE9F041644D07460024A878002898BF6C
+:10CCC000BDE8F081C0B2A04217D905EB041010F105
+:10CCD000830612D01021304600F015FD68B904EB30
+:10CCE000440005EB400808F20B113A463046FBF7CA
+:10CCF000A3FCB8F80F01A8F80F01601CC4B2A87813
+:10CD0000A042DFD8BDE8F08101461022504800F073
+:10CD10001DBD4F4870474C498A78824203D90A1892
+:10CD200092F843210AB10020704700EB400001EB6C
+:10CD3000400000F20B10704743498A78824206D9BE
+:10CD4000084490F83B01002804BF012070470020F0
+:10CD500070472DE9F0410E4607461546062130463C
+:10CD600000F0D1FC384C98B1A17871B104F59D70F8
+:10CD700011F0010F18BF00F8015FA178490804D035
+:10CD8000457000F8025F491EFAD10120BDE8F0812C
+:10CD90003846314600F01FF8102819D0A37800213A
+:10CDA000002B15D9621892F8032182420BD1102969
+:10CDB00018BF08290CD004EB010080F83B514FF05C
+:10CDC0000100BDE8F08101F10101C9B28B42E9D84F
+:10CDD0000020BDE8F0812DE9F0411B4D06460024FE
+:10CDE00028780F46002811D905EBC40090F853119C
+:10CDF000B14206D10622394600F5AA70F1F7E8FAE9
+:10CE000038B1601CC4B22878A042EDD81020BDE82B
+:10CE1000F0812046BDE8F0810B4910B44A7801EB5F
+:10CE2000C003521E4A70002283F85A2191F802C0B2
+:10CE3000BCF1000F16D98B1893F8034184420DD131
+:10CE4000102A07E060010020600F00206C01002024
+:10CE5000331100201CBF10BC704703E0521CD2B23B
+:10CE60009445E8D80A78521ED2B20A7082421BD08A
+:10CE700001EBC20201EBC003D2F853C1C3F853C1A6
+:10CE8000D2F85721C3F857218C7891F800C00022BE
+:10CE9000002C09D98B1893F80331634506D1102A69
+:10CEA0001CBF114481F8030110BC7047521CD2B260
+:10CEB0009442EFD810BC704770B449490D188A7875
+:10CEC000521ED3B28B7095F8032198423DD001EBEE
+:10CED000001401EB031C00EB4000DCF80360C4F815
+:10CEE0000360DCF80760C4F80760DCF80B60C4F886
+:10CEF0000B60DCF80F60C4F80F60DCF88360C4F8E6
+:10CF00008360DCF88760C4F88760DCF88B60C4F865
+:10CF10008B60DCF88FC0C4F88FC001EB030C03EB0F
+:10CF200043039CF8034101EB430385F8034101EB04
+:10CF30004000D3F80B41C0F80B41B3F80F31A0F813
+:10CF40000F319CF83B0185F83B0101EBC20090F8E2
+:10CF50005A0110F0010F1CBF70BC704700208C7884
+:10CF6000002C0DD90B1893F803C1944504D1102857
+:10CF70001CBF70BC704703E0401CC0B28442F1D8B3
+:10CF80000878401EC0B20870904204BF70BC704761
+:10CF900001EBC20301EBC000D0F853C1C3F853C189
+:10CFA000D0F85701C3F857018C780B780020002C7B
+:10CFB0009CBF70BC704700BF01EB000C9CF803C124
+:10CFC0009C4506D110281CBF084480F8032170BC82
+:10CFD0007047401CC0B28442EED870BC704700005D
+:10CFE000600F002010B50A7B02F01F020A730022B6
+:10CFF00042768B1893F808C00CF001034FEA5C0CE2
+:10D000000CF0010423444FEA5C0C0CF001042344AF
+:10D010004FEA5C0C0CF001041C444FEA5C0303F083
+:10D02000010CA4445B0803F00104A4445B0803F072
+:10D030000104A4440CEB530300EB020C521C8CF8CB
+:10D04000143090F819C0D2B263444376052AD0D385
+:10D05000D8B2252888BFFFDF10BD0023C3834284D8
+:10D0600001EBC202521EB2FBF1F10184704770B5B0
+:10D070000446002569B14FF4FA42012978D002290B
+:10D0800075D0032918BF70BD0146BDE870407030EF
+:10D09000A8E704F17006802200213046F1F7EFF98D
+:10D0A000B571F57135737573F57335747571B57642
+:10D0B000F576212086F84000492086F84100FE20C0
+:10D0C00086F874002688702200212046F1F7D7F9EF
+:10D0D0002680012684F8646084F86560282084F83E
+:10D0E0006600002104F1300001F0F3FA1B22A4F8DD
+:10D0F0004E20A4F85020A4F85220A4F854204FF455
+:10D10000A470A4F85600A4F8580066734FF4486061
+:10D110006080A4F8F050A4F8F250A4F8F450A4F8F9
+:10D12000F650A4F8F850A4F8FA5084F8FD5084F8AA
+:10D13000FF50A4F8065184F80451A4F81851A4F83B
+:10D140001A5184F8BA5184F8BB5184F8C45184F858
+:10D15000C55184F8885184F8905184F8935184F82B
+:10D16000AC51C4F8A451C4F8A85170BD00E041E02E
+:10D17000A4F8065184F8FE506088FE490144B1FBD2
+:10D18000F0F1A4F890104BF68031A4F89210E388E7
+:10D19000A4F89850B4F89CC0DB000CFB00FCB3FB77
+:10D1A000F0F39CFBF0FC5B1CA4F89CC09BB203FB5F
+:10D1B00000FC04F17001A4F89A30BCF5C84FC4BF5C
+:10D1C0005B1E4B85B2FBF0F2521C0A8600F58022F2
+:10D1D00002F5EE32531EB3FBF0F20A84CB8B03FB55
+:10D1E00000F2B2FBF0F0C883214604F17000BDE804
+:10D1F0007040F7E6B4F8B411B4F8B831B4F802C02E
+:10D2000004F17000A4F89850B4F89C40DB0004FBD3
+:10D210000CF4B3FBF1F394FBF1F45B1C84859BB23B
+:10D2200003FB01F44385B4F5C84FC4BF5B1E4385BF
+:10D23000B2FBF1F2521C0286428C01EBC202521E7A
+:10D24000B2FBF1F20284C28B02FB0CF2B2FBF1F1F1
+:10D25000C18370BD70B50446002569B14FF4FA4230
+:10D2600001295CD002297CD0032918BF70BD01467A
+:10D27000BDE870407030B5E604F1700680220021F0
+:10D280003046F1F7FCF8B571F57135737573F573C8
+:10D2900035747571B576F576212086F84000492001
+:10D2A00086F84100FE2086F874002688702200214E
+:10D2B0002046F1F7E4F82680012684F8646084F8BB
+:10D2C0006560282084F86600002104F1300001F038
+:10D2D00000FA1B22A4F84E20A4F85020A4F85220F3
+:10D2E000A4F854204FF4A470A4F85600A4F85800F1
+:10D2F0006673A4F8F850202084F8FA0084F8F050FF
+:10D30000C4F8F45084F8245184F8255184F82E513F
+:10D3100084F82F5184F8145184F8205170BD60882E
+:10D3200094490144B1FBF0F1A4F890104BF6803120
+:10D33000A4F89210E388A4F89850B4F89CC0DB00DD
+:10D340000CFB00FCB3FBF0F39CFBF0FC5B1CA4F8B3
+:10D350009CC09BB204F17001A4F89A3003FB00FC5E
+:10D3600000E01CE0BCF5C84FC4BF5B1E4B85B2FBA0
+:10D37000F0F2521C0A8600F5802202F5EE32531EAE
+:10D38000B3FBF0F20A84CB8B03FB00F2B2FBF0F0AC
+:10D39000C883214604F17000BDE8704022E6D4F84D
+:10D3A0001831B4F802C004F170005989DB89A4F87F
+:10D3B0009850B4F89C40DB0004FB0CF4B3FBF1F391
+:10D3C00094FBF1F45B1C84859BB203FB01F4438561
+:10D3D000B4F5C84FC4BF5B1E4385B2FBF1F2521CCB
+:10D3E0000286428C01EBC202521EB2FBF1F20284B1
+:10D3F000C28B02FB0CF2B2FBF1F1C18370BD2DE9CF
+:10D40000F003447E0CB1252C03D9BDE8F0031220B3
+:10D410007047002A02BF0020BDE8F003704791F872
+:10D420000DC01F260123544D4FF00008BCF1000F22
+:10D4300074D0BCF1010F1EBF1F20BDE8F003704780
+:10D44000B0F800C00A7C8F7B91F80F907A404F7C37
+:10D4500087EA090742EA072282EA0C0C5FF000071C
+:10D460000CF0FF094FEA1C2C99FAA9F99CFAACFCC4
+:10D470004FEA19694FEA1C6C49EA0C2C0CEB0C1CA6
+:10D480007F1C9444FFB21FFA8CFC032FE8D38CEA74
+:10D49000020C394F0022ECFB057212096FF02405D3
+:10D4A00002FB05C2D2B201EBD207827602F0070579
+:10D4B0003F7A03FA05F52F4218BFC2767ED104FBEE
+:10D4C0000CF2120C521CD2B25FF0000400EB040C00
+:10D4D0009CF814C094453CBFA2EB0C02D2B212D30C
+:10D4E0000D194FF0000C2D7A03FA0CF73D421CBFCA
+:10D4F000521ED2B2002A6FD00CF1010C0CF0FF0CBE
+:10D50000BCF1080FF0D304F1010C0CF0FF04052C62
+:10D51000DCD33046BDE8F0037047FFE790F81AC04F
+:10D520000C7E474604FB02C2134C4FF0000CE2FB9A
+:10D53000054C4FEA1C1C6FF024040CFB0422D2B2F1
+:10D5400001EBD204827602F0070C247A03FA0CFC79
+:10D5500014EA0C0F1FBFC2764046BDE8F0037047C7
+:10D5600090F819C0B2FBFCF40CFB1422521CD2B28E
+:10D57000002403E0FFDB050053E4B36E00EB040C72
+:10D580009CF814C094453CBFA2EB0C02D2B212D35B
+:10D590000D194FF0000C2D7A03FA0CF815EA080F5C
+:10D5A0001CBF521ED2B27AB10CF1010C0CF0FF0C70
+:10D5B000BCF1080FF0D304F1010C00E00FE00CF017
+:10D5C000FF04052CD5D3A4E70CEBC401C176384683
+:10D5D000BDE8F0037047FFE70CEBC401C17640469D
+:10D5E000BDE8F0037047FE4A016812681140FD4A29
+:10D5F000126811430160704730B4FB49F84B0024B6
+:10D600004FF0010C0A78521CD2B20A70202A08BFCF
+:10D610000C700D781A680CFA05F52A42F2D00978D8
+:10D6200002680CFA01F15140016030BC704770B4DF
+:10D630006FF01F02010C02EA90251F23A1F5AA40FA
+:10D6400054381CBFA1F5AA40B0F1550009D0A1F58E
+:10D650002850AA381EBFA1F52A40B0F1AA00012027
+:10D6600000D100204FF0000C624664468CEA0106AF
+:10D67000F6431643B6F1FF3F11D005F001064FEA1D
+:10D680005C0C4CEAC63C03F0010652086D085B08CE
+:10D69000641C42EAC632162CE8D370BC704770BCDA
+:10D6A00000207047017931F01F0113BF00200022D4
+:10D6B0001146704710B4435C491C03F0010C5B0831
+:10D6C00003F00104A4445B0803F00104A4445B08D4
+:10D6D00003F00104A4445B0803F00104A4445B08C4
+:10D6E00003F001045B08A44403F00104A4440CEB20
+:10D6F00053031A44D2B20529DDDB012A8CBF012075
+:10D70000002010BC704730B40022A1F1010CBCF124
+:10D71000000F11DD431E11F0010F08BF13F8012F98
+:10D720005C785FEA6C0C07D013F8025F22435C78E8
+:10D730002A43BCF1010CF7D1491E5CBF405C024397
+:10D74000002A0CBF0120002030BC7047002A08BF0F
+:10D7500070471144401E12F0010F03D011F8013D33
+:10D7600000F8013F520808BF704700BF11F8013CA4
+:10D77000437011F8023D00F8023F521EF6D1704787
+:10D7800070B58CB000F110041D4616460DF1FF3C3B
+:10D790005FF0080014F8012C8CF8012014F8022D19
+:10D7A0000CF8022F401EF5D101F1100C6C460DF162
+:10D7B0000F0108201CF8012C4A701CF8022D01F8FA
+:10D7C000022F401EF6D1204606F0EEFE7EB16A1E04
+:10D7D00004F130005FF0080110F8013C537010F8BC
+:10D7E000023D02F8023F491EF6D10CB070BD089808
+:10D7F0002860099868600A98A8600B98E8600CB0E7
+:10D8000070BD38B505460C466846FAF7DFF90028C2
+:10D8100008BF38BD9DF900202272E07E607294F945
+:10D820000A100020511A48BF494295F82D308B420A
+:10D83000C8BF38BDFF2B08BF38BDE17A491CC9B24B
+:10D84000E17295F82E30994203D8A17A7F2918BF4A
+:10D8500038BDA2720020E072012038BD0C2818BF2C
+:10D860000B2810D00D2818BF1F280CD0202818BF57
+:10D87000212808D0222818BF232804D024281EBF1E
+:10D880002628002070474FF0010070470C2963D212
+:10D89000DFE801F006090E13161B323C415C484ECE
+:10D8A000002A5BD058E0072A18BF082A56D053E058
+:10D8B0000C2A18BF0B2A51D04EE00D2A4ED04BE057
+:10D8C000A2F10F000C2849D946E023B1A2F11000C3
+:10D8D0000B2843D940E0122A18BF112A3ED090F8F5
+:10D8E000380020B1122A37D31A2A37D934E0162A41
+:10D8F00032D31A2A32D92FE0A2F10F0103292DD9F0
+:10D9000090F8380008B31B2A28D925E0002B08BF5F
+:10D91000042A21D122E013B1062A1FD01CE0012ADB
+:10D920001AD11BE01C2A1CBF1D2A1E2A16D013E088
+:10D930001F2A18BF202A11D0212A18BF222A0DD051
+:10D94000232A1CBF242A262A08D005E013B10E2A58
+:10D9500004D001E0052A01D0002070470120704763
+:10D960002DE9F0410D4604468668F7F707FE58B9E1
+:10D97000F7F75CFC40F23571F7F73FF9A0602046FD
+:10D98000F7F7FCFD0028F3D095B13046A168F8F711
+:10D990003CF900280CDD2844401EB0FBF5F707FBDE
+:10D9A00005F13046F7F729F9A0603846BDE8F08167
+:10D9B0000020BDE8F08170B50446904228BF70BDDC
+:10D9C000101B642812D325188D4206D80421F8F7BD
+:10D9D00050F900281CBF284670BD204670BD0000CD
+:10D9E0000C64020010640200740100206420EAE765
+:10D9F00011F00C0F13D001F0040100290DBF4022DB
+:10DA0000102296214FF4167101F5BC71A0EB0103B1
+:10DA100088428CBF93FBF2F0002080B2704702294D
+:10DA200019BF6FF00D0101EBD0006FF00E0101EB9B
+:10DA30009000F2E7084418449830002A14BF0421EB
+:10DA400000210844704710B4002A14BF4FF4296223
+:10DA50004FF4A472002B19BF4FF429634FF0080C48
+:10DA60004FF4A4734FF0010C00280CBF01240024D4
+:10DA700091F866001CF00C0F08BF0020D118084474
+:10DA80009830002C14BF04210021084410BC7047BA
+:10DA900000280CBF0123002391F86600002BA0F69C
+:10DAA000482000F5005018BF04231844496A8142F9
+:10DAB0002CBF0120002012F00C0118BF012131EA17
+:10DAC000000014BF00200120704710B413680B66DB
+:10DAD000137813F00C0318BF0123527812F00C02D4
+:10DAE00018BF012253EA020C04BF10BC7047002B80
+:10DAF0000CBF4FF4A4734FF42963002A19BF4FF4ED
+:10DB000029624FF0080C4FF4A4724FF0010C00286A
+:10DB10000CBF0124002491F866001CF00C0F08BF14
+:10DB200000201A4410449830002C14BF0422002214
+:10DB300010444A6A824224BF10BC704791F86000CA
+:10DB40004FF0030230F00C0381F8603091F861006F
+:10DB500020F00C0081F8610008BF81F860200028E7
+:10DB600008BF81F8612010BC704710F0010F1CBF86
+:10DB70000120704710F0020F1CBF0220704710F008
+:10DB8000040018BF082070472DE9F04704461746E7
+:10DB900089464FF00108084600F0C5FC0546484696
+:10DBA00000F0C5FC10F0010F18BF012625D000BF02
+:10DBB00015F0010F18BF01232AD000BF56EA030158
+:10DBC00008BF4FF0000810F0070F08BF002615F03F
+:10DBD000070F08BF002394F86400B0420CBF002078
+:10DBE0003046387094F86510994208BF00237B7066
+:10DBF000002808BF002B25D115E010F0020F18BF38
+:10DC00000226D5D110F0040F14BF08260026CFE756
+:10DC100015F0020F18BF0223D0D115F0040F14BF66
+:10DC200008230023CAE7484600F087FCB4F87010C8
+:10DC3000401A00B247F6FE71884201DC002801DC80
+:10DC40004FF0000816B1082E0CD018E094F86400CC
+:10DC5000012818BF022812D004281EBF0828FFDFA1
+:10DC6000032D0CD194F8C40148B1B4F8C8010128BF
+:10DC700094F8640006D0082801D008203870404687
+:10DC8000BDE8F087042818BF0420F7D1F5E7012884
+:10DC900014BF0228704710F00C0018BF0420704712
+:10DCA00038B4CBB2C1F3072CC1B2C0F30724012BA7
+:10DCB00007D0022B09D0042B08BFBCF1040F2DD0D4
+:10DCC00006E0BCF1010F03D128E0BCF1020F25D022
+:10DCD000012906D0022907D0042908BF042C1DD031
+:10DCE00004E0012C02D119E0022C17D001EA0C014A
+:10DCF00061F3070204EA030161F30F22D1B211F0CC
+:10DD0000020F18BF022310D0C2F307218DF8003094
+:10DD100011F0020F18BF02211BD111E0214003EACC
+:10DD20000C03194061F30702E6E711F0010F18BF79
+:10DD30000123E9D111F0040F14BF08230023E3E706
+:10DD400011F0010F18BF012103D111F0040118BF18
+:10DD500008218DF80110082B01BF000C01280420B8
+:10DD60008DF80000BDF8000038BC70474FF0000C83
+:10DD7000082902D0042909D011E001280FD104207C
+:10DD8000907082F803C0138001207047012806D0EC
+:10DD90000820907082F803C0138001207047002093
+:10DDA0007047162A10D12A220C2818BF0D280FD030
+:10DDB0004FF0230C1F280DD031B10878012818BF6F
+:10DDC000002805D0162805D0002070470120704794
+:10DDD0001A70FBE783F800C0F8E7012908D0022990
+:10DDE0000BD0042912BF082940F6A660704707E04F
+:10DDF000002804BF40F2E240704740F6C41070476C
+:10DE000000B5FFDF40F2E24000BD000040787047FF
+:10DE100030B50546007801F00F0220F00F001043E6
+:10DE20002870092912D2DFE801F005070507050966
+:10DE3000050B0F0006240BE00C2409E0222407E068
+:10DE400001240020E87003E00E2401E00024FFDF3D
+:10DE50006C7030BD007800F00F0070470A68C0F8A1
+:10DE600003208988A0F807107047D0F803200A60C3
+:10DE7000B0F80700888070470A68C0F809208988D0
+:10DE8000A0F80D107047D0F809200A60B0F80D0016
+:10DE9000888070470278402322F0400203EA811113
+:10DEA0001143017070470078C0F38010704702780A
+:10DEB000802322F0800203EAC111114301707047F0
+:10DEC0000078C009704770B514460E4605461F2AF3
+:10DED00088BFFFDF2246314605F10900F0F7A5FAB9
+:10DEE000A01D687070BD70B544780E460546062CBE
+:10DEF00038BFFFDFA01F84B21F2C88BF1F2422461B
+:10DF000005F109013046F0F790FA204670BD70B572
+:10DF100014460E4605461F2A88BFFFDF22463146BB
+:10DF200005F10900F0F781FAA01D687070BD09685D
+:10DF3000C0F80F1070470A88A0F81320897841753F
+:10DF4000704790F8242001F01F0122F01F021143B6
+:10DF500080F824107047072988BF072190F82420F3
+:10DF6000E02322F0E00203EA4111114380F824107B
+:10DF700070471F3008F097B810B5044600F009FB51
+:10DF8000002818BF204410BDC17811F03F0F1BBFFF
+:10DF9000027912F0010F0022012211F03F0F1BBF86
+:10DFA000037913F0020F002301231A4402EB42020B
+:10DFB000530011F03F0F1BBF027912F0080F00222F
+:10DFC000012203EB420311F03F0F1BBF027912F055
+:10DFD000040F00220122134411F03F0F1BBF0279EE
+:10DFE00012F0200F0022012202EBC20203EB4203D7
+:10DFF00011F03F0F1BBF027912F0100F0022012217
+:10E0000002EB42021A4411F03F0F1BBF007910F0DF
+:10E01000400F00200120104410F0FF0014BF012128
+:10E0200000210844C0B2704770B50278417802F010
+:10E030000F02082A4DD2DFE802F004080B4C4C4CCA
+:10E040000F14881F1F280AD943E00C2907D040E08D
+:10E05000881F1F2803D93CE0881F1F2839D80120BA
+:10E0600070BD4A1EFE2A34D88446C0780025820935
+:10E07000032A09D000F03F04601C884204D860469F
+:10E08000FFF782FFA04201D9284670BD9CF803002B
+:10E090004FF0010610F03F0F1EBF1CF10400007886
+:10E0A00010F0100F13D064460421604600F071FA9E
+:10E0B000002818BF14EB0000E6D0017801F03F0102
+:10E0C0002529E1D280780221B1EB501FDCD3304604
+:10E0D00070BD002070BD70B50178012501F00F0101
+:10E0E000002404290AD007290DD008291CBF0020CC
+:10E0F00070BD40780E2836D0204670BD4078801F15
+:10E100001F2830D9F8E7844640789CF803108A0924
+:10E11000032AF1D001F03F06711C8142ECD8604621
+:10E12000FFF732FFB042E7D89CF8030010F03F0F32
+:10E130001EBF1CF10400007810F0100F13D06646CB
+:10E140000421604600F025FA002818BF16EB0000F5
+:10E15000D2D0017801F03F012529CDD2807802216B
+:10E16000B1EB501FC8D3284670BD10B4017801F040
+:10E170000F01032920D0052921D14478B0F81910C6
+:10E18000B0F81BC0B0F81730827D222C17D10629B9
+:10E1900015D3B1F5486F98BFBCF5FA7F0FD272B1B5
+:10E1A000082A98BF8A420AD28B429CBFB0F81D0051
+:10E1B000B0F5486F03D805E040780C2802D010BCB9
+:10E1C0000020704710BC012070472DE9F0411F4628
+:10E1D00014460D00064608BFFFDF2146304600F01A
+:10E1E000D8F9040008BFFFDF30193A462946BDE8D8
+:10E1F000F041F0F71AB9C07800F03F007047C02234
+:10E2000002EA8111C27802F03F021143C1707047E7
+:10E21000C07880097047C9B201F00102C1F3400320
+:10E220001A4402EB4202C1F3800303EB4202C1F342
+:10E23000C00302EB4302C1F3001303EB43031A4490
+:10E24000C1F3401303EBC30302EB4302C1F380139A
+:10E250001A4412F0FF0202D0521CD2B20171C378EC
+:10E2600002F03F0103F0C0031943C170511C41701B
+:10E2700070472DE9F0410546C078164600F03F048E
+:10E280001019401C0F46FF2888BFFFDF28193246AF
+:10E290003946001DF0F7C9F8A019401C6870BDE8A8
+:10E2A000F081C178407801F03F01401A401E80B2F1
+:10E2B000704710B590F803C00B460CF03F0144784E
+:10E2C0000CF03F0CA4EB0C0CACF1010C1FFA8CF41D
+:10E2D000944288BF14462BB10844011D22461846BB
+:10E2E000F0F7A3F8204610BD4078704700B50278DB
+:10E2F00001F0030322F003021A430270012914BF44
+:10E300000229002104D0032916BFFFDF012100BD2F
+:10E31000417000BD00B5027801F0030322F0030252
+:10E320001A430270012914BF0229002104D00329D5
+:10E3300016BFFFDF012100BD417000BD007800F075
+:10E3400003007047417841B1C078192803D2C04A10
+:10E35000105C884201D1012070470020704730B521
+:10E3600001240546C17019293CBFB948445C02D359
+:10E37000FF2918BFFFDF6C7030BD70B515460E4623
+:10E3800004461B2A88BFFFDF65702A463146E01C21
+:10E39000BDE87040F0F749B8B0F807007047B0F832
+:10E3A00009007047C172090A01737047B0F80B0089
+:10E3B000704730B4B0F80720B0F809C0B0F80530A5
+:10E3C0000179941F40F67A45AC4298BFBCF5FA7FBC
+:10E3D0000ED269B1082998BF914209D293429FBFDA
+:10E3E000B0F80B00B0F5486F012030BC98BF704703
+:10E3F000002030BC7047001D07F055BE021D0846C6
+:10E40000114607F050BEB0F8090070470079704718
+:10E410000A68426049688160704742680A608068A3
+:10E4200048607047098881817047808908807047FB
+:10E430000A68C0F80E204968C0F812107047D0F87A
+:10E440000E200A60D0F81200486070470968C0F8D2
+:10E4500016107047D0F81600086070470A684260CE
+:10E4600049688160704742680A6080684860704708
+:10E470000968C1607047C0680860704700797047DC
+:10E480000A68426049688160704742680A60806833
+:10E49000486070470171090A417170478171090A2A
+:10E4A000C17170470172090A417270478172090A8D
+:10E4B000C172704780887047C08870470089704774
+:10E4C0004089704701891B2924BF4189B1F5A47F88
+:10E4D00007D381881B2921BFC088B0F5A47F012004
+:10E4E0007047002070470A68426049688160704741
+:10E4F00042680A60806848607047017911F0070F30
+:10E500001BBF407910F0070F0020012070470179F0
+:10E5100011F0070F1BBF407910F0070F00200120FA
+:10E5200070470171704700797047417170474079B9
+:10E5300070478171090AC1717047C088704745A250
+:10E5400082B0D2E90012CDE900120179407901F0E0
+:10E55000070269461DF80220012A07D800F00700CB
+:10E56000085C01289EBF012002B07047002002B065
+:10E570007047017170470079704741717047407969
+:10E58000704730B50C460546FB2988BFFFDF6C702D
+:10E5900030BDC378024613F03F0008BF7047052026
+:10E5A000127903F03F0312F0010F36D0002914BF97
+:10E5B0000B20704712F0020F32D0012914BF801DCA
+:10E5C000704700BF12F0040F2DD0022914BF401C69
+:10E5D000704700BF12F0080F28D0032914BF801C19
+:10E5E000704700BF12F0100F23D0042914BFC01CC5
+:10E5F000704700BF12F0200F1ED005291ABF12303D
+:10E60000C0B2704712F0400F19D006291ABF401C43
+:10E61000C0B27047072918D114E00029CAD114E00C
+:10E620000129CFD111E00229D4D10EE00329D9D19B
+:10E630000BE00429DED108E00529E3D105E0062935
+:10E64000E8D102E0834288BF704700207047000095
+:10E6500014640200000101020102020330B490F8C8
+:10E6600064508C88B1F808C015F00C0F1BD000BFA7
+:10E67000B4F5296F98BF4FF4296490F8655015F0F0
+:10E680000C0F17D0BCF5296F98BF4FF4296C4A883E
+:10E69000C988A0F84420A0F84810A0F84640A0F887
+:10E6A0004AC030BC7047002B1CBF157815F00C0F0A
+:10E6B000DED1E2E7002B1CBF527812F00C0FE1D143
+:10E6C000E5E7DDF800C08181C2810382A0F812C0B5
+:10E6D00070471B2202838282C28182814280028132
+:10E6E000028042848284828359B14FF4296141833C
+:10E6F000C18241820182C18041818180C1840185C2
+:10E7000070474FF4A4714183C18241820182C1806C
+:10E7100041818180C18401857047F0B4B0F8482000
+:10E72000818F468EC58E8A4228BF0A4690F86510B2
+:10E730004FF0000311F00C0F18BF4FF4296106D100
+:10E74000B0F84AC0B0F840108C4538BF61464286E8
+:10E75000C186048FB0F83AC0944238BF14468C4545
+:10E7600038BF8C460487A0F83AC0B2420ABFA9421B
+:10E770004FF0010C4FF0000C058EB0F84410C28F22
+:10E78000848E914228BF114690F8642012F00C0F3D
+:10E7900018BF4FF4296206D1B0F84660B0F84220A5
+:10E7A000964238BF324690F85A60022E0AD001864F
+:10E7B0008286A9420ABFA2420120002040EA0C0042
+:10E7C000F0BC70478D4238BF2946944238BF22467C
+:10E7D00080F85A30EBE7508088899080C889D080D3
+:10E7E000088A1081488A508101201070704730B427
+:10E7F00002884A80B0F830C0A1F804C0838ECB8074
+:10E80000428E0A81C48E4C81B0F85650A54204BF96
+:10E81000B0F85240944208D1B0F858409C4202BF30
+:10E82000B0F854306345002301D04FF001030B735F
+:10E8300000F13003A0F852201A464B89D3848B880C
+:10E840009384CA88A0F858204FF00100087030BCAB
+:10E85000704730B404460A46088E91F864104FF4AD
+:10E86000747311F00C0F1CBF03EB801080B21ED02C
+:10E87000918E814238BF0846118F92F865C01CF016
+:10E880000C0F1CBF03EB811189B218D0538F8B4240
+:10E8900038BF194692F866301CF00C0F08BF0023F1
+:10E8A000002C0CBF0122002230BCFFF7C3B80229A4
+:10E8B00007BF80003C30C000703080B2D8E7BCF1A8
+:10E8C000020F07BF89003C31C900703189B2DDE712
+:10E8D0002DE9F041044606F0D3FCC8B9FE4F786834
+:10E8E00090F8221001260025012914D00178012971
+:10E8F0001BD090F8281001291CBF0020BDE8F08132
+:10E90000657018212170D0F82A10616080F82850B5
+:10E910000120BDE8F081657007212170416A6160C6
+:10E9200080F822500120BDE8F0816570142121702B
+:10E93000811C2022201DEFF778FD257279680D706B
+:10E9400081F82850E54882888284C26B527B80F827
+:10E95000262080F82260C86B0088F4F732FCF4F7B8
+:10E96000D8F8D5E7DC4840680178002914BF8088D2
+:10E970004FF6FF70704730B5D74C83B00D46207806
+:10E980007F2808BFFFDF94F900307F202070D4F883
+:10E9900004C09CF85000062808BF002205D09CF84F
+:10E9A000500008280CBF022201229CF85400CDE937
+:10E9B000000302929CF873309CF880200CF1320125
+:10E9C000284606F0C9FC03B0BDE8304006F059BE49
+:10E9D0002DE9F04106F099FC002818BF06F01EFC56
+:10E9E000BD4C606800F1840290F87610895C80F874
+:10E9F0008010002003F07CF828B3F9F721F8606854
+:10EA0000B74990F855000D5C2846F8F785FD606819
+:10EA10004FF0000680F8735090F8801011F00C0F42
+:10EA20000CBF25200F20F8F757FC606890F8801085
+:10EA30000120F8F7F3FD606890F84010032918BF33
+:10EA400002290FD103E0BDE8F04101F02FB990F8A1
+:10EA500076108430085C012804D101221146002080
+:10EA6000F9F7D5F8F9F7A3F8606890F88050012D10
+:10EA700007BF0127032100270521A068FEF7FCF846
+:10EA8000616881F8520040B1002F18BF402521D0A5
+:10EA9000F8F775F92846F9F76BF86068806DF8F7B4
+:10EAA000DBFF606890F85410FF291CBF6D30FEF743
+:10EAB0001CF8FF21606880F8531080F8541080F82B
+:10EAC000626080F8616080F87D60062180F85010F7
+:10EAD000BDE8F08115F00C0F14BF55255025D7E780
+:10EAE00070B57D4C0646606800F150052046806890
+:10EAF00041B1D0F80510C5F81D10B0F80900A5F80F
+:10EB0000210003E005F11D01FFF7AFF9A068FFF751
+:10EB1000CAF985F82400A0680021032E018002D0E4
+:10EB2000052E04D03DE00321FFF772F939E00521FD
+:10EB3000FFF76EF96068C06B00F10E01A068FFF787
+:10EB4000F6F96068C06B00F11201A068FFF7F3F9F5
+:10EB5000D4E90110CA6B527D8275CA6BD28AC27524
+:10EB6000120A0276CA6B52884276120A8276CA6B01
+:10EB70009288C276120A0277CA6BD2884277120A4A
+:10EB80008277C96B0831FFF7F4F96068C06B017ECA
+:10EB9000A068FFF7D6F9606890F88610A068FFF7C4
+:10EBA000DAF905F11D01A068FFF766F995F8241060
+:10EBB000A068FFF77CF9606800F1320590F83160D9
+:10EBC00090F8511091B190F84010032906D190F8B7
+:10EBD0003910002918BF90F8560001D190F8530061
+:10EBE000FEF799F800281CBF012605462946A068B3
+:10EBF000FFF734F93146A068BDE87040FFF74AB925
+:10EC00003549496881F84B00704770B5324D002492
+:10EC10000126A8606968A1F8814081F8834081F8E5
+:10EC2000506091F85020022A1FBF91F8501001291E
+:10EC3000FFDF70BD06F007FB6868047080F82240B3
+:10EC400080F8284090F8520030B1F8F79BFFF8F7B1
+:10EC5000AAF8686880F852406868072180F84A403E
+:10EC600080F8396080F8404080F8554080F84B408B
+:10EC700080F87D4080F8381070BD2DE9F041164CC9
+:10EC8000054686B0606890F85000012818BF022839
+:10EC900005D003281EBF0C2006B0BDE8F081687ABD
+:10ECA000022839D0F8F75AFB0220F8F7CFFE0D49B9
+:10ECB00001F10C0090E80D108DE80D10D1E907016D
+:10ECC000CDE904016846F8F7AFFE606890F94B00A3
+:10ECD000F8F714FCA06807E0780100204411002038
+:10ECE0003364020030640200F8F7B3FEFC48F8F722
+:10ECF00087FEFC48F8F708FC606890F83110323065
+:10ED0000F8F789FB0F210720F8F7A3FB606890F85C
+:10ED10003900E0B1FDF772FF6168287A01F18402E1
+:10ED200081F87600287A805C81F8800068688865C0
+:10ED30002A68CA65687A68B1012824D005250228A6
+:10ED400008BF81F850506FD0032878D080E0FDF7DD
+:10ED500010FFE1E7E44B91F83850002291F855009C
+:10ED6000401CA3FB006C4FEA5C0CACEB8C0C6044C9
+:10ED700081F8550025FA00F010F0010F03D1501C66
+:10ED8000C2B2032AEAD3002681F87D6091F84900D7
+:10ED9000002804BF91F85100002841D0F6F746FA48
+:10EDA000074660683946406CF6F72FFFDFF83C8372
+:10EDB000054690FBF8F008FB105041423846F5F745
+:10EDC0001CFF6168486495FBF8F08A6F10448867FF
+:10EDD000FDF74CFE01466068826F914220D847647F
+:10EDE000866790F8510000281CBF0120FDF760FFE6
+:10EDF0000121606890F84A20002A1CBF90F8492041
+:10EE0000002A0DD090F8313000F13202012B04D1EC
+:10EE1000527902F0C002402A08D03230F9F744FC9F
+:10EE20006168042081F8500012E008E00125FDF738
+:10EE300070FF61682A463231F9F7FEFBF0E7002ADD
+:10EE400018BFFFDF012000F089FF606880F8505094
+:10EE500006B00020BDE8F08170B5A54D686890F857
+:10EE6000501004292ED005291CBF0C2070BD90F82D
+:10EE70007D100026002990F883104FEA511124D00C
+:10EE8000002908BF012407D0012908BF022403D0AC
+:10EE9000022914BF00240824C06D00281CBF0020D4
+:10EEA00000F05CFF6868806DF8F7D6FD686890F840
+:10EEB0004010022943D0032904BF90F86C100129A7
+:10EEC00041D04DE0FFF784FD52E0002908BF012446
+:10EED00007D0012908BF022403D0022914BF00244F
+:10EEE0000824C06D00281CBF002000F037FF6868B0
+:10EEF000806DF8F7B1FD686890F84010022906D0DF
+:10EF0000032904BF90F86C10012904D010E090F898
+:10EF10006C1002290CD1224614F00C0F04D090F88A
+:10EF20004C00012808BF042201210020F8F76FFEE1
+:10EF30006868072180F8804080F8616016E090F8EA
+:10EF40006C1002290CD1224614F00C0F04D090F85A
+:10EF50004C00012808BF042201210020F8F757FEC9
+:10EF60006868082180F8804080F8616080F850105F
+:10EF7000002070BD5E49002210F0010F496802D0E8
+:10EF8000012281F8842010F0080F03D011440820DA
+:10EF900081F88400002070475549496881F848008D
+:10EFA000704710B5524C636893F83030022B14BF91
+:10EFB000032B00280BD100291ABF022901200020B1
+:10EFC0001146FDF756FD08281CBF012010BD6068E2
+:10EFD00090F83000002816BF022800200120BDE86C
+:10EFE0001040F9F7E9BA4248406890F8300000282C
+:10EFF00016BF022800200120F9F7DEBA3C49496813
+:10F0000081F8300070473A49496881F84A007047F2
+:10F0100070B5374C616891F83000002816BF02289F
+:10F020000020012081F8310001F13201F9F7AEFA38
+:10F03000606890F83010022916BF032901210021D1
+:10F0400080F8511090F8312000F132034FF00005A4
+:10F05000012A04BF5B7913F0C00F0AD000F132031C
+:10F06000012A04D15A7902F0C002402A01D00022BC
+:10F0700000E0012280F84920002A04BF002970BD69
+:10F080008567F6F7D3F86168486491F85100002865
+:10F090001CBF0020FDF70CFE0026606890F84A10A7
+:10F0A00000291ABF90F84910002970BD90F831204E
+:10F0B00000F13201012A04D1497901F0C00140294F
+:10F0C00005D02946BDE870403230F9F7EDBAFDF7BA
+:10F0D00020FE61683246BDE870403231F9F7ACBAC3
+:10F0E0003064020036640200ABAAAAAA40420F00B4
+:10F0F0007801002070B5FF4D0C4600280CBF01239D
+:10F100000023696881F8393081F842004FF0080027
+:10F1100081F856000CD1002C1ABF022C01200020CF
+:10F120001146FDF7A6FC6968082881F8560001D051
+:10F13000002070BD022C14BF032C1220F8D170BD2A
+:10F14000002818BF112070470328EA4A526808BFF8
+:10F15000D16382F840000020704710B5E54C60682C
+:10F1600090F8401003291CBF002180F8601001D0E6
+:10F17000002010BD0123C16B1A460020FEF763FC7E
+:10F180006168CA6B526A904294BF0120002081F8E6
+:10F190006000EDE7D748416891F84000032804D0AB
+:10F1A000012818BF022807D004E091F84200012886
+:10F1B00008BF70470020704791F84100012814BF34
+:10F1C00003280120F6D1704770B5F8F7C5FCF8F7B1
+:10F1D000A4FCF8F76BFBF8F719FCC64C0025606837
+:10F1E00090F8520030B1F8F7CDFCF7F7DCFD60681D
+:10F1F00080F8525060680121A0F8815080F8835057
+:10F2000080F8501080F82850002070BDB94810B523
+:10F210004068643006F0EBFB002010BDB5480121CA
+:10F22000406890F84020032A03BF80F82A10C26B80
+:10F230001288002218BF80F82A20828580F82810C2
+:10F240007047AC49496881F886007047017800230F
+:10F2500011F0010FA749496809D04278032A08BF75
+:10F26000CB6381F84020012281F884201346027884
+:10F2700012F0040F0CD082784FF0000C032A08BF64
+:10F28000C1F83CC081F840200B44082283F8842058
+:10F29000C27881F830200279002A16BF022A0123A1
+:10F2A000002381F8393081F84120427981F83820F3
+:10F2B000807981F848004FF0000070478D48406821
+:10F2C0008030704770B58B4C06460D46606890F8EC
+:10F2D0005000032818BFFFDF022E1EBF032EFFDFE2
+:10F2E00070BD002D18BF06F0DBF900216068A0F8A2
+:10F2F000811080F88310012180F8501070BD00F05B
+:10F30000D5BC2DE9F0477B4C0646894660684FF036
+:10F310000108072E90F8397038BF032540D3082E16
+:10F3200084BF0020BDE8F08790F85010062908BF80
+:10F33000002105D090F8501008290CBF02210121AE
+:10F3400090F8800005F0E8FF002873D1A068C1782C
+:10F3500011F03F0F12D0027912F0010F0ED0616848
+:10F360004FF0050591F85220002A18BFB9F1000F9F
+:10F3700016D091F88010012909D011E011F03F0F4B
+:10F380001ABF007910F0100F002F53D14CE04FF04E
+:10F3900001024FF00501FDF7B4FB616881F85200EE
+:10F3A000A16808782944C0F3801030B1487900F092
+:10F3B000C000402808BF012000D00020616891F8FB
+:10F3C0005210002918BF002807D0FDF7B5FB0146F1
+:10F3D000606880F8531080F86180606890F853107E
+:10F3E000FF292AD080F854100846FDF7B2FB40EA06
+:10F3F0000705606890F85320FF2A18BF002D10D031
+:10F40000072E0ED3A068C17811F03F0F09D0017903
+:10F4100011F0020F05D00B21FDF720FC606880F889
+:10F4200062802846BDE8F087FDF75EF9002808BF36
+:10F43000BDE8F0870120BDE8F087A36890F8392087
+:10F4400059191B78C3F3801C00F153036046FDF784
+:10F45000B0F90546CDE72DE9F043264C87B0A0680A
+:10F46000FEF7D6FE7F264FF00108002558B102278F
+:10F4700001287DD0022800F0EF80F8F717FA07B0D6
+:10F480000620BDE8F083F8F711FA616891F84000B2
+:10F49000032800F01581A068C27812F03F0F05D054
+:10F4A000037913F0100F18BF012700D10027002F98
+:10F4B00014BF0823012312F03F0F00F001810079EF
+:10F4C00033EA000240F0FC8010F0020F08D091F8FF
+:10F4D0008000002105F09EFE002808BF012000D01A
+:10F4E00000208DF80C508DF810508DF814504FF00E
+:10F4F000FF0801E078010020D0B105AA03A904A803
+:10F5000000F07AFC606890F831809DF80C000028CB
+:10F5100018BF48F002080BD1A068FEF7D1FC814665
+:10F520000121A068FEF728FD4946F7F77EFF28B3C2
+:10F53000FFB1012000F0DDFB002852D020787F28A9
+:10F5400008BFFFDF94F900102670606890F854201F
+:10F55000CDE90021029590F8733090F8802000F1F9
+:10F560003201404605F0F8FE606880F86C50A3E078
+:10F5700038E041460020FFF7FEF9A1E0606890F80E
+:10F580004100032818BF02282BD19DF81000002845
+:10F5900027D09DF80C00002823D1F7B1012000F0FE
+:10F5A000A8FB00281DD020787F2808BFFFDF94F932
+:10F5B00000102670606890F85420CDE90021029573
+:10F5C00090F8733090F8802000F13201FE2005F0B1
+:10F5D000C3FE606880F86C506EE0FE210020FFF7EB
+:10F5E000CAF96DE0F8F762F9A0681821C27812F044
+:10F5F0003F0F65D00279914362D10421FEF7BCFC34
+:10F60000616891F84020032A01BF8078B7EB501F52
+:10F6100091F86000002853D04FF0010000F069FB22
+:10F62000E8B320787F2808BFFFDF94F90010267028
+:10F63000606890F85420CDE90021029590F873306D
+:10F6400090F8802000F13201FF2005F085FE60680F
+:10F6500080F86C8030E000BFF8F728F9606890F817
+:10F66000400003282CD0A0681821C27812F03F0F68
+:10F6700026D0007931EA000022D1012000F039FBC8
+:10F6800068B120787F2808BFFFDF94F9001026704A
+:10F69000606890F85420CDE90021029500E00FE069
+:10F6A00090F8733090F8802000F13201FF2005F0CF
+:10F6B00053FE606880F86C7007B00320BDE8F083EB
+:10F6C00007B00620BDE8F083F0B5FE4C074683B0D6
+:10F6D00060686D460078002818BFFFDF002661686B
+:10F6E0008E70C86B02888A8042884A8382888A83A7
+:10F6F000C088C88381F8206047B10121A068FEF767
+:10F700003BFC0546A0680078C10907E06946A0688F
+:10F71000FEF7ABFBA0680078C0F38011606801279A
+:10F7200090F85120002A18BF002904D06A7902F00D
+:10F73000C002402A26D090F84A20002A18BF00298B
+:10F7400003D0697911F0C00F1CD000F10E0006F053
+:10F75000A1FC616891F85400FF2819D001F108025A
+:10F76000C91DFDF7ABF9002808BFFFDF6068C1794C
+:10F7700041F00201C171D0F86D104161B0F8711013
+:10F7800001830FE02968C0F80E10A9884182E0E7E4
+:10F79000C86B427ECA71D0F81A208A60C08B8881FB
+:10F7A0004E610E8360680770C26B90F84B1082F850
+:10F7B0006710C06B0088F3F704FDF3F79BF903B003
+:10F7C000F0BD2DE9F041BF4C0546002760684FF0C1
+:10F7D00001083E4690F84000012818BF022802D0D8
+:10F7E000032818BFFFDF5DB1A068FEF71DFC18B944
+:10F7F000A068FEF770FC18B100F08FFB074645E0EB
+:10F80000606890F850007F25801F06283ED2DFE810
+:10F8100000F003191924352FAA48F8F7D7F9002862
+:10F8200008BF2570F8F7B9F9606890F8520030B158
+:10F83000F8F7A8F9F7F7B7FA606880F85260F8F7B8
+:10F8400035F830E09F48F8F7C1F9002808BF257067
+:10F85000F8F7A3F905F024FFC3E09A48F8F7B6F9E2
+:10F86000002808BF2570F8F798F9F8F71FF81AE094
+:10F870009448F8F7ABF930B9257004E09148F8F7EF
+:10F88000A5F90028F8D0F8F788F9AAE0102F80F041
+:10F890003881DFE807F01E9DA6AAF1F108B3F2F166
+:10F8A000F1F10C832051BDE8F041FFF791B803203E
+:10F8B00002F01EF9002870D000210320FFF710F994
+:10F8C000012211461046F8F7A2F961680C2081F870
+:10F8D0005000BDE8F081606800F15005042002F09E
+:10F8E00007F900287DD00E202870012002F0FDFCD1
+:10F8F000A06861680078C0F3401081F875000021AD
+:10F900000520FFF7EDF87048A1684FF0200CC26B9E
+:10F910000B78527B23F020030CEA42121A430A7040
+:10F92000C16B95F825304A7B1A404A73C06B282179
+:10F9300080F86610BDE8F081062002F0D9F80028B2
+:10F940004FD0614D0F2085F85000022002F0CDFC11
+:10F950006068012190F880200846F8F758F9A068FF
+:10F9600061680078C0F3401081F87500012105201E
+:10F97000FFF7B6F8E86B80F80D80A068017821F0F9
+:10F9800020010170F8F715FD002818BFFFDF2820BF
+:10F99000E96B81F86600BDE8F08122E0052002F005
+:10F9A000A7F8F0B101210320FFF79AF8F8F701FD5D
+:10F9B000002818BFFFDF6068012190F8802008460A
+:10F9C000F8F725F961680D2081F85000BDE8F08155
+:10F9D0006068A0F8816080F8836080F85080BDE89E
+:10F9E000F081BDE8F04100F061B96168032081F861
+:10F9F0005000BDE8F041082002F077BC606890F844
+:10FA00008310490908BF012507D0012908BF022535
+:10FA100003D0022914BF00250825C06D00281CBF93
+:10FA2000002000F09BF96068806DF8F715F86068B9
+:10FA300090F84010022906D0032904BF90F86C10FA
+:10FA4000012904D010E090F86C1002290CD12A464C
+:10FA500015F00C0F04D090F84C00012808BF0422C8
+:10FA600001210020F8F7D3F86068072180F8805062
+:10FA700080F8616041E000E043E0606890F8831046
+:10FA8000490908BF012507D0012908BF022503D075
+:10FA9000022914BF00250825C06D00281CBF0020C6
+:10FAA00000F05CF96068806DF7F7D6FF606890F849
+:10FAB000401002290AD0032904BF90F86C100129D4
+:10FAC00008D014E0780100204411002090F86C1058
+:10FAD00002290CD12A4615F00C0F04D090F84C00E6
+:10FAE000012808BF042201210020F8F790F860687F
+:10FAF000082180F8805080F8616080F85010BDE8DF
+:10FB0000F081FFDFBDE8F08170B5FE4C606890F8D1
+:10FB1000503000210C2B38D001220D2B40D00E2B61
+:10FB200055D00F2B1CBFFFDF70BD042002F0DDFBA2
+:10FB3000606890F880100E20F7F7CEFB606890F8B0
+:10FB4000800010F00C0F14BF282100219620F7F739
+:10FB5000A1FFF8F72CF86068052190F88050A068A4
+:10FB6000FDF78AF8616881F8520048B115F00C0F72
+:10FB70000CBF50255525F7F702F92846F7F7F8FF8F
+:10FB800061680B2081F8500070BDF8F710F8002173
+:10FB90009620F7F77FFF6168092081F8500070BD5B
+:10FBA00090F88010FF20F7F797FB606890F88000CE
+:10FBB00010F00C0F14BF282100219620F7F76AFFE0
+:10FBC000F7F7F5FF61680A2081F8500070BDA0F8D2
+:10FBD000811080F8831080F850200020FFF774FD1A
+:10FBE000BDE87040032002F080BB70B5C54C606872
+:10FBF00090F850007F25801F062828BF70BDDFE8E1
+:10FC000000F0171F1D032A11BE48F7F7DFFF002879
+:10FC100008BF2570F7F7C1FFF7F748FEBDE8704051
+:10FC2000FEF7D6BEB748F7F7D1FFC8B9257017E081
+:10FC3000B448F7F7CBFF40B9257006E005F030FD7A
+:10FC4000B048F7F7C3FF0028F6D0F7F7A6FFBDE8E6
+:10FC5000704000F02BB8AB48F7F7B8FF0028E5D0AC
+:10FC6000F7F79BFF60680021643005F071FEBDE886
+:10FC7000704000F01BB870B5A24C06460D46012935
+:10FC800008D0606890F880203046BDE87040134688
+:10FC900002F077BBF7F747FA61680346304691F800
+:10FCA00080202946BDE8704002F06BBB70B5F7F7C5
+:10FCB00053FFF7F732FFF7F7F9FDF7F7A7FE914C7F
+:10FCC0000025606890F8520030B1F7F75BFFF7F756
+:10FCD0006AF8606880F852506068022180F850101D
+:10FCE000A0F8815080F88350BDE87040002002F0F9
+:10FCF000FCBA70B5834D06460421A868FEF73CF9AE
+:10FD0000044605F002FB002808BF70BD207800F013
+:10FD10003F00252814D2F7F74CFA217811F0800F14
+:10FD20000CBF1E214FF49671B4F80120C2F30C02EF
+:10FD300012FB01F10A1AB2F5877F28BF814201D276
+:10FD4000002070BD68682188A0F88110A17880F833
+:10FD500083103046BDE8704001F0CABE2DE9F04185
+:10FD6000684C0746606800F1810690F883004009FE
+:10FD700008BF012507D0012808BF022503D00228AB
+:10FD800014BF00250825F7F75BFE307800F03F062A
+:10FD90003046F7F7C1FB606880F8736090F86C003C
+:10FDA00002280CBF4020FF202946F7F795FA27B11B
+:10FDB00029460120F7F777FC05E060682A46C16D07
+:10FDC0000120F7F7B9FCF7F7F2FE0521A068FCF770
+:10FDD00053FF6168002881F8520008BFBDE8F08138
+:10FDE00015F00C0F0CBF50245524F6F7C8FF204621
+:10FDF000BDE8F041F7F7BCBE2DE9F74F414C0025B7
+:10FE0000914660688A4690F8510000280CBF4FF078
+:10FE100001084FF00008A0680178CE090121FEF723
+:10FE2000ABF836B1407900F0C000402808BF012689
+:10FE300000D00026606890F85210002961D090F838
+:10FE400040104FF0000B032906D190F8391000291B
+:10FE500018BF90F856700ED1A068C17811F03F0F0E
+:10FE60001CBF007910F0010F02D105F09BF940B3DF
+:10FE7000606890F85370FF2F18BF082F21D03846C4
+:10FE8000FCF7D8FB002818BF4FF00108002E38D02F
+:10FE9000606890F8620030B1FCF759FE0546606872
+:10FEA00080F862B02DE03846FCF7FFFD05460121E1
+:10FEB000A068FEF761F801462846F8F78BFB054677
+:10FEC0001FE0F6B1606890F86100D0B9A068C17811
+:10FED00011F03F0F05D0017911F0010F18BF0B2170
+:10FEE00000D105210022FCF70CFE616881F8520068
+:10FEF00038B1FCF721FEFF2803D06168012581F8A5
+:10FF0000530001E0780100208AF800500098067044
+:10FF100089F8008003B0BDE8F08F2DE9F04FFF4C69
+:10FF200087B00025606890F850002E46801F4FF083
+:10FF30007F08062880F0D581DFE800F00308088BF1
+:10FF4000FDDB00F0F8FB054600F0CCB9F348F7F70D
+:10FF50003DFE002808BF84F80080F7F71EFEA06869
+:10FF6000FDF778FF0546072861D1A068FEF750F934
+:10FF70000146606890F86C208A4258D190F8501081
+:10FF8000062908BF002005D090F8500008280CBFB3
+:10FF90000220012005F0C4F970B90321A068FDF723
+:10FFA000EBFF002843D001884078C1F30B01000922
+:10FFB00005F0B5FC00283AD000212846FFF7A1F94A
+:10FFC000A0B38DF80C608DF808608DF8046062684D
+:10FFD000FF2592F8500008280CBF02210121A068DB
+:10FFE000C37813F03F0F1CBF007910F0020F12D03E
+:10FFF00092F8800005F00EF968B901AA03A902A8D9
+:020000040002F8
+:10000000FFF7FAFE606890F831509DF80C00002868
+:1000100018BF45F002052B469DF804209DF80810F6
+:100020009DF80C0000F0D5F9054603E0FFE705F068
+:1000300037FB0225606890F85200002800F05281DA
+:10004000F7F7A0FDF6F7AFFE606880F8526000F0A9
+:1000500049B9A068FDF7FEFE0646A1686068CA7847
+:1000600090F86D309A4221D10A7990F86E309A4218
+:100070001CD14A7990F86F309A4217D18A7990F85A
+:1000800070309A4212D1CA7990F871309A420DD1EB
+:100090000A7A90F872309A4208D1097890F8740080
+:1000A000C1F38011814208BF012500D00025F7F778
+:1000B000FDFB9A48F7F78AFD002808BF84F8008006
+:1000C000F7F76BFD042E11D185B120787F2808BF8A
+:1000D000FFDF94F9003084F80080606890F87320A6
+:1000E00090F87D1090F8540005F0A8FB062500F06C
+:1000F000F9B802278948F7F769FD002808BF84F896
+:100100000080F7F74AFDA068FDF7A4FE0546A06849
+:10011000FEF77EF8082D08BF00287CD1A0684FF0BC
+:100120000301C27812F03F0F75D0007931EA000068
+:1001300071D1606800E095E000F1500890F8390056
+:10014000002814BF98F8066098F803604FF0000983
+:1001500098F8020078B1FCF7EFFC0546FF280AD0BA
+:100160000146A068401DFCF7C0FCB5420CBF4FF033
+:1001700001094FF000090021A068FDF7FDFE0622ED
+:1001800008F11D01EEF724F940B9A068FDF78BFED8
+:1001900098F82410884208BF012000D0002059EAB6
+:1001A00000095DD0606800F1320590F831A098F840
+:1001B000010038B13046FCF7AEFD00281CBF0546F3
+:1001C0004FF0010A4FF00008A06801784FEAD11BF8
+:1001D0000121FDF7D1FEBBF1000F07D0407900F0FF
+:1001E000C000402808BF4FF0010B01D04FF0000BBA
+:1001F0000121A068FDF7C0FE06222946EEF7E8F8C7
+:1002000030B9A068FDF75CFE504508BF012501D05C
+:100210004FF0000500E023E03BEA050018BFFF2E89
+:100220000DD03046FCF741FC060008D00121A06843
+:10023000FDF7A2FE01463046F8F7CCF9804645EAC4
+:10024000080019EA000F0BD060680121643005F046
+:100250007FFB01273846FFF737FA052002F045F803
+:100260003D463FE002252D48F7F7B0FC002808BFC7
+:1002700084F80080F7F791FCA068FDF7EBFD0646D7
+:10028000A068FDF7C5FF072E08BF00282AD1A06887
+:100290004FF00101C27812F03F0F23D00279914351
+:1002A00020D1616801F150060021FDF765FE0622AC
+:1002B00006F11D01EEF78CF8A0B9A068FDF7F3FD7B
+:1002C00096F8241088420DD160680121643005F051
+:1002D0003FFBFF21022000F009F8002818BF03258A
+:1002E00000E0FFDF07B02846BDE8F08F2DE9F043BE
+:1002F0000A4C0F4601466068002683B090F87D20C6
+:10030000002A35D090F8500008280CBF022501259E
+:10031000A168C87810F03F0F02E0000078010020CB
+:10032000FD484FF000084FF07F0990F900001CBF16
+:10033000097911F0100F22D07F2808BFFFDF94F950
+:10034000001084F80090606890F85420CDE90021F6
+:10035000029590F8733090F8802000F13201384611
+:1003600004F0FAFF05F0E4FA10B305F08AF92CE086
+:10037000002914BF0221012180F87D10C2E77F28E7
+:1003800008BFFFDF94F9001084F80090606890F8CF
+:100390005420CDE90021029590F8733090F8802028
+:1003A00000F13201384604F0D7FF05F06AF90CE09D
+:1003B0000220FFF79EFC30B16068012680F86C8057
+:1003C000F7F774FA01E005F06BF903B03046BDE8C9
+:1003D000F0832DE9F047D04C054684B09A46174685
+:1003E0000E46A068FDF714FF4FF00109002800F049
+:1003F000CF804FF00208012808D0022800F00E81BB
+:1004000005F04EF904B04046BDE8F087A068092128
+:10041000C27812F03F0F00F059810279914340F009
+:100420005581616891F84010032906D012F0020F3F
+:1004300008BFFF2118D05DB115E00021FDF79CFD3C
+:1004400061680622C96B1A31EDF7C2FF48BB1EE096
+:10045000FDF736FD05460121A068FDF78DFD294613
+:10046000F6F7E3FF18B15146012000F051B960687A
+:1004700090F84100032818BF022840F02781002E81
+:100480001CBFFE21012040F0438100F01FB9A0688D
+:10049000FDF709FD6168C96B497E884208BF0126E6
+:1004A00000D00026A068C17811F03F0F05D0017977
+:1004B00011F0020F01D06DB338E0616891F842206D
+:1004C000012A01D096B11BE0D6B90021FDF754FDF9
+:1004D00061680268C96BC1F81A208088C883A06867
+:1004E000FDF7E1FC6168C96B487609E091F85300BB
+:1004F00091F85610884203D004B04046BDE8F0871A
+:100500006068643005F068FA002840D004B00F201D
+:10051000BDE8F08767B1FDF7D3FC05460121A0686F
+:10052000FDF72AFD2946F6F780FF08B1012200E019
+:100530000022616891F84200012807D040B92EB925
+:1005400091F8533091F856108B4201D1012100E00F
+:1005500000210A421BD0012808BF002E11D14FF004
+:100560000001A068FDF708FD61680268C96BC1F869
+:100570001A208088C883A068FDF795FC6168C96B64
+:1005800048766068643005F027FA0028BED19DE007
+:1005900060682F46554690F840104FF00208032936
+:1005A000AAD0A168CA7812F03F0F1BBF097911F0D9
+:1005B000020F002201224FF0FF0A90F85010082984
+:1005C0000CBF0221012192B190F8800004F022FEBC
+:1005D00068B95FB9A068FDF773FC07460121A06800
+:1005E000FDF7CAFC3946F6F720FF48B1AA46514646
+:1005F0000020FFF77BFE002818BF4FF003087BE7C1
+:10060000606890F84100032818BF02287FF474AF97
+:10061000002E18BF4FF0FE0AE9D16DE7616891F82E
+:100620004030032B52D0A0684FF0090CC27812F072
+:100630003F0F4BD002793CEA020C47D1022B06D087
+:1006400012F0020F08BFFF2161D0E5B35EE012F0A7
+:10065000020F4FF07F0801D04DB114E001F16400AA
+:1006600005F0BAF980B320787F2842D013E067B351
+:10067000FDF726FC05460121A068FDF77DFC294613
+:10068000F6F7D3FE08B36068643005F0A5F9D8B179
+:1006900020787F282DD094F9001084F800806068BD
+:1006A00090F85420CDE90021CDF8089090F87330EF
+:1006B00090F8802000F13201504604F04DFE0D20EC
+:1006C00004B0BDE8F08716E000E001E00220F7E7A3
+:1006D000606890F84100032818BF0228F6D1002E68
+:1006E000F4D04FF0FE014FF00200FEF744F9022073
+:1006F000E6E7FFDFCFE7FDF7E3FB05460121A06852
+:10070000FDF73AFC2946F6F790FE38B15146022033
+:10071000FEF731F9DAE7000078010020606890F810
+:100720004100032818BF0228D0D1002E1CBFFE2193
+:100730000220EDD1CAE72DE9F84F4FF00008F74845
+:10074000F7F744FA7F27F54C002808BF2770F7F722
+:1007500024FAA068FDF77EFB81460121FEF7D1FD5A
+:10076000616891F88020012A14D0042A1CBF082A4D
+:10077000FFDF00F0D781606890F8520038B1F7F7DA
+:1007800001FAF6F710FB6168002081F8520040463C
+:10079000BDE8F88F0125E24EB9F1080F3AD2DFE843
+:1007A00009F03EC00439393914FC0546F7F77EF8E4
+:1007B000002D72D0606890F84000012818BF022810
+:1007C0006BD120787F2869D122E018B391F84000DE
+:1007D000022802D0012818D01CE020787F2808BF0A
+:1007E000FFDF94F90000277000906068FF2190F807
+:1007F000733090F85420323004F069FF61680020B3
+:100800004FF00C0881F87D00B5E720787F2860D193
+:10081000FFDF5EE0F7F74AF84FF00608ABE74FF06E
+:100820000008002800F0508191F84000022836D0DE
+:1008300001284BD003289ED1A068CA6BC37892F8D8
+:100840001AC0634521D1037992F81BC063451CD1BE
+:10085000437992F81CC0634517D1837992F81DC083
+:10086000634512D1C37992F81EC063450DD1037A56
+:1008700092F81FC0634508D1037892F819C0C3F3FA
+:100880008013634508BF012300D0002391F8421074
+:1008900001292CD0C3B300F013B93FE019E0207850
+:1008A0007F2808BFFFDF94F9000027700090606880
+:1008B000FF2190F8733090F85420323004F007FF95
+:1008C00060684FF00C0880F87D5054E720787F284E
+:1008D0009ED094F90000277000906068FF2190F886
+:1008E000733090F85420323004F0F1FE16E0002B03
+:1008F0007ED102F11A01FDF7B8FAA068FDF7D3FA2C
+:100900006168C96B4876DBE0FFE796F85600082877
+:1009100070D096F8531081426AD0D5E04FF00608A7
+:1009200029E7054691F8510000280CBF4FF0010B54
+:100930004FF0000B4FF00008A06810F8092BD20907
+:1009400007D0407900F0C000402808BF4FF0010AEE
+:1009500001D04FF0000A91F84000032806D191F829
+:100960003900002818BF91F8569001D191F85390A2
+:100970004846FCF79AF80090D8B34846FBF75AFE71
+:10098000002818BF4FF0010BBAF1000F37D0A06854
+:10099000A14600F10901009800E0B6E0F7F71AFE61
+:1009A0005FEA0008D9F8040090F8319018BF49F0C8
+:1009B0000209606890F84010032924D0F6F776FF0A
+:1009C000002DABD0F6F741FD002808BFB8F1000FAD
+:1009D0007DD020787F2808BFFFDF94F900002770C2
+:1009E00000906068494690F8733090F8542002E017
+:1009F00066E004E068E0323004F069FE8EE760688B
+:100A000090F83190D5E7A168C06BCA78837E9A428E
+:100A10001BD10A79C37E9A4217D14A79037F9A4241
+:100A200013D18A79437F9A420FD1CA79837F9A4240
+:100A30000BD10A7AC37F9A4207D10978407EC1F36D
+:100A40008011814208BF012700D0002796F853008B
+:100A5000082806D096F85610884208BF4FF00109C2
+:100A600001D04FF00009B8F1000F05D1BBF1000F24
+:100A700004D0F6F7EAFC08B1012000E000204DB1F7
+:100A800096F84210012903D021B957EA090101D093
+:100A9000012100E00021084216D0606890F8421061
+:100AA000012908BF002F0BD1C06B00F11A01A0680B
+:100AB000FDF7DBF9A068FDF7F6F96168C96B4876C8
+:100AC0004FF00E0857E602E0F6F7F0FE26E7606802
+:100AD00090F84100032818BF02287FF41FAFBAF135
+:100AE000000F3FF41BAF20787F2808BFFFDF94F989
+:100AF0000000277000906068FE2190F8733090F835
+:100B00005420323004F0E3FD08E791F84810002942
+:100B100018BF00283FF47EAE0BE0000078010020F3
+:100B200044110020B9F1070F7FF474AE00283FF4A0
+:100B300071AEFEF790FC80461DE60000D0F8001173
+:100B400049B1D0E941231A448B691A448A61D0E93A
+:100B50003F12D16003E0FE4AD0F8FC101162D0E9E8
+:100B60003F1009B1086170470028FCD00021816165
+:100B700070472DE9FF4F06460C46488883B040F287
+:100B8000E24148430190E08A002500FB01FA94F815
+:100B90007C0090460D2822D00C2820D024281ED07E
+:100BA00094F87D0024281AD000208346069818B1B6
+:100BB0000121204603F0C0F894F8641094F8650011
+:100BC000009094F8F0200F464FF47A794AB1012A48
+:100BD00061D0022A44D0032A5DD0FFDFB5E00120B6
+:100BE000E3E7B8F1000F00D1FFDFD94814F8641F24
+:100BF000243090F83400FDF7F0F801902078F7F7F2
+:100C000087FB4D4600F2E730B0FBF5F1DFF840938B
+:100C1000D9F80C0001EB00082078F7F779FB0146C2
+:100C200014F86409022816D0012816D040F63400C2
+:100C300008444AF2EF010844B0FBF5F10198D9F8F5
+:100C40001C20411A514402EB08000D18012084F8C1
+:100C5000F0002D1D78E02846EAE74FF4C860E7E78A
+:100C6000DFF8EC92A8F10100D9F80810014300D197
+:100C7000FFDFB848B8F1000F016801EB0A0506D0A4
+:100C8000D9F8080000F54970A84200D9FFDF032019
+:100C900084F8F00058E094F87C20019D242A05D0C7
+:100CA00094F87D30242B01D0252A3AD1B4F8702055
+:100CB000B4F81031D21A521C12B2002A31DB94F867
+:100CC000122172B3174694F8132102B11046009016
+:100CD000022916D0012916D040F6340049F60852F0
+:100CE0008118022F12D0012F12D040F63400104488
+:100CF000814210D9081A00F5FA70B0FBF9F00544EA
+:100D00000FE04846EAE74FF4C860E7E74846EEE7F9
+:100D10004FF4C860EBE7401A00F5FA70B0FBF9F049
+:100D20002D1AB8F1000F0FD0DFF82482D8F8080090
+:100D300018B9B8F8020000B1FFDFD8F8080000F5D4
+:100D40004970A84200D9FFDF05B9FFDF2946D4F872
+:100D5000F400F3F752FFC4F8F400B06000203070E4
+:100D60004FF0010886F80480204603F040F8ABF10C
+:100D70000101084202D186F8058005E094F8F000F0
+:100D8000012844D003207071606A3946009A01F04E
+:100D900042FBF060069830EA0B0035D02946304619
+:100DA000FCF7DEFD87B2204603F021F8B8420FD8E9
+:100DB000074686F8058005FB07F1D4F8F400F3F741
+:100DC0001CFFB06029463046FCF7CAFD384487B2A4
+:100DD0003946204602F0B0FFB068C4F8F400A06EB7
+:100DE000002811D0B4F87000B4F89420801A01B231
+:100DF000002909DD34F86C0F0144491E91FBF0F124
+:100E000089B201FB0020208507B0BDE8F08F0220E9
+:100E1000B9E72DE9F04106460C46012001F0DBFA66
+:100E2000C5B20B2001F0D7FAC0B2854200D0FFDF77
+:100E30000025082C7ED2DFE804F00461696965C6EC
+:100E40008293304601F0DDFA0621F2F787F80400BC
+:100E500000D1FFDF304601F0D4FA2188884200D06B
+:100E6000FFDF94F8F00000B9FFDF204602F00FFE2C
+:100E7000374E21460020B5607580F561FDF7E9FC2D
+:100E800000F19807606AB84217D994F86500F6F740
+:100E9000F9F8014694F864004FF47A72022828D0D9
+:100EA000012828D040F6340008444AF2473108446B
+:100EB000B0FBF2F1606A0844C51B21460020356191
+:100EC000FDF7C7FC618840F2E24251439830081AAE
+:100ED000A0F54970706194F8652094F86410606A18
+:100EE00001F099FAA0F5CA70B061BDE8F041F4F7DD
+:100EF00059BE1046D8E74FF4C860D5E7BDE8F041C9
+:100F000002F02FBEBDE8F041F6F79DBE304601F07D
+:100F100078FA0621F2F722F8040000D1FFDF30460C
+:100F200001F06FFA2188884200D0FFDF0122002102
+:100F3000204600E047E0BDE8F04101F089BAF6F74D
+:100F400041FDF6F780FE02204FF0E02104E00000B2
+:100F5000CC11002088010020C1F88002BDE8F0819A
+:100F6000304601F04EFA0621F1F7F8FF040000D1F7
+:100F7000FFDF304601F045FA2188884200D0FFDFCC
+:100F800094F8F000042800D0FFDF84F8F05094F8C3
+:100F9000FA504FF6FF76202D00D3FFDFF94820F8F6
+:100FA000156094F8FA00F4F722F900B9FFDF202069
+:100FB00084F8FA002046FFF7C1FDF3480078BDE849
+:100FC000F041E1F78DBFFFDFC8E770B5ED4C0025BC
+:100FD000443C84F82850E07868B1E570FEF71EF9CB
+:100FE0002078042803D0606AFFF7A8FD6562E64810
+:100FF0000078E1F775FFBDE8704001F03ABA70B5CE
+:10100000E04C0146443CE069F4F7FFFD6568A278D6
+:1010100090FBF5F172B140F27122B5FBF2F292B29F
+:10102000A36B01FB02F6B34202D901FB123200E0CE
+:101030000022A2634D43002800DAFFDF2946E06961
+:10104000F3F7DBFDE06170BD2DE9F05FFEF736F9E7
+:101050008246CC48683800F1240881684646D8F8B2
+:101060001800F3F7CAFD0146F069F4F7CEFD4FF022
+:101070000009074686F835903C4640F28D254E46DD
+:101080001DE000BF0AEB06000079F5F7FBFF4AF20E
+:10109000B12101444FF47A70B1FBF0F108EB860204
+:1010A0004046926811448C4207D3641A90F8351078
+:1010B000A4F28D24491C88F83510761CF6B298F8F5
+:1010C0003600B042DED8002C0FDD98F835104046CF
+:1010D00008EB81018968A14207D24168C91BA94276
+:1010E00000D90D466C4288F8359098F83560C346B3
+:1010F0000AEB060898F80400F5F7C4FF01464AF227
+:10110000B12001444FF47A7AB1FBFAF298F8041056
+:10111000082909D0042909D00020131804290AD06D
+:10112000082908D0252207E0082000E0022000EB73
+:1011300040002830F1E70F22521D4FF4A870082913
+:1011400013D0042914D0022915D04FF0080C282000
+:1011500012FB0C00184462190BEB860302449868DA
+:10116000D84682420BD8791925E04FF0400CEFE7C2
+:101170004FF0100CECE74FF0040C1820E8E798F85B
+:10118000352098F836604046B24210D2521C88F89A
+:1011900035203C1B9868621984180846F5F772FFE1
+:1011A0004AF2B1210144B1FBFAF0011903E080F8E1
+:1011B0003590D8F80410D8F81C00BDE8F05FF3F7BC
+:1011C0001CBD2DE9FE4F14460546FEF777F8DFF803
+:1011D000B4A10290AAF1440A50469AF835604FF043
+:1011E000000B0AEB86018968CAF83C10F4B3044688
+:1011F00000780027042825D005283ED0FFDFA04630
+:1012000039466069F3F7F9FC0746F4F70FF88146B1
+:101210003946D8F80440F4F7F8FC401E90FBF4F08F
+:10122000C14361433846F3F7E8FC0146C8F81C00A7
+:101230004846F4F7EAFC002800DDFFDF012188F8CA
+:1012400013108DE0D4F81490D4F8048001F07CF9E8
+:10125000070010D0387800B9FFDF796978684A460E
+:101260000844414601F05CF9074600E00BE04045C8
+:10127000C5D9FFDFC3E75F46C1E7606A01F006F941
+:1012800040F6B837BBE7C1690AEB46000191408DD3
+:1012900010B35446DAF81400FFF7B1FE6168E06954
+:1012A000F3F7ABFC074684F835B0019CD0462046E6
+:1012B000DAF81410F4F7A9FC814639462046F4F711
+:1012C000A4FCD8F804200146B9FBF2F0B1FBF2F11E
+:1012D000884242D0012041E0F3F7A8FFFFF78FFEDC
+:1012E000FFF7B2FE9AF83510DAF804900AEB8101A4
+:1012F0000746896800913946DAF81C00F4F785FC46
+:1013000000248046484504DB98FBF9F404FB09F40B
+:101310001AE0002052469AF8351007E002EB8003ED
+:1013200004F28D249B68401C1C44C0B28142F5D855
+:1013300051B10120F5F7A6FE4AF2B12101444FF464
+:101340007A70B1FBF0F004440099A8EB04000C1A89
+:1013500000D5FFDFCAF83C40A7E7002088F813005B
+:101360009AF802005446B8B13946E069F4F74DFCEA
+:101370000146A26B40F2712042438A4206D2C4F871
+:101380003CB009E03412002084010020E06B511AC7
+:10139000884200D30846E063AF6085F800B00120C2
+:1013A0002871029F94F835003F1DC05DF5F76AFE75
+:1013B0004AF23B5101444FF47A70B1FBF0F0E16B1B
+:1013C000FC300844E8602078042808D194F83500FF
+:1013D00004EB4000408D0A2801D2032000E00220E7
+:1013E000687104EB4600408DC0B128466168FCF787
+:1013F000B7FA82B20020761C0CE000BF04EB40017B
+:10140000B0424B8D13449BB24B8501D35B1C4B8583
+:10141000401CC0B294F836108142EFD2A8686061D7
+:10142000A06194F8350004EB4001488D401C4885CC
+:1014300094F83500C05D082803D0042803D00021AB
+:101440000BE0082100E0022101EB410128314FF4BB
+:10145000A872082804D0042802D0022807D0282225
+:101460000A44042805D0082803D0252102E01822C8
+:10147000F6E70F21491D08280CD004280CD00228BB
+:101480000CD0082011FB0020E16B884208D201201B
+:10149000BDE8FE8F4020F5E71020F3E70420F1E7D8
+:1014A0000020F5E770B5FE4C061D14F8352F905D51
+:1014B000F5F7E8FD4FF47A7100F2E730B0FBF1F098
+:1014C000D4F8071045182078805DF5F760FE217884
+:1014D000895D082903D0042903D000220BE00822EB
+:1014E00000E0022202EB420228324FF4A8730829DE
+:1014F00004D0042902D0022907D028231344042948
+:1015000005D0082903D0252202E01823F6E70F2290
+:10151000521D08290AD004290AD002290AD008211C
+:1015200012FB0131081A281A293070BD4021F7E753
+:101530001021F5E70421F3E72DE9FF4107460C46AA
+:10154000012000F048FFC5B20B2000F044FFC0B2FC
+:10155000854200D0FFDF204601260025D04C082818
+:1015600069D2DFE800F00430464642686865667478
+:1015700026746078002819D1FDF7A0FE009594F834
+:1015800035108DF808104188C90411D0206C0190E5
+:1015900003208DF80900C24824388560C561257490
+:1015A0006846FDF76AFB002800D0FFDFBDE8FF8139
+:1015B000FFF778FF0190E07C10B18DF80950EAE761
+:1015C0008DF80960E7E7607840B1207C08B9FDF745
+:1015D000FBFD6574BDE8FF41F3F733BDA674FDF76D
+:1015E0003BFC0028E2D0FFDFE0E7BDE8FF41F6F773
+:1015F0002ABBFDF763FE4088C00407D00121032009
+:10160000FDF760FEA7480078E1F76AFC0022394642
+:101610006846FFF7D6FD38B16946384600F0EFFE60
+:101620000028C3D1FFDFC1E7E670FFF7CEFCBDE7BE
+:10163000BDE8FF41C9E4FFDFB8E7994950B1012295
+:101640008A704A6840F27123B2FBF3F202EB001099
+:10165000886370470020887070472DE9F05F8946E5
+:1016600040F271218E4E484300250446706090463A
+:101670002F46D0074AF2B12A4FF47A7B0FD0B9F83F
+:1016800000004843B0600120F5F7FCFC00EB0A01C4
+:10169000B1FBFBF0241AB7680125A4F28D245FEAA0
+:1016A000087016D539F8151040F27120414306EB49
+:1016B00085080820C8F80810F5F7E4FC00EB0A01DB
+:1016C000B1FBFBF0241AD8F80800A4F28D240744DB
+:1016D0006D1CA74219D9002D17D0391BB1FBF5F0AD
+:1016E000B268101AB1FBF5F205FB1212801AB06055
+:1016F000012008E0B1FBF5F306EB80029468E31AE1
+:10170000401CC0B29360A842F4D3BDE8F09F2DE91D
+:10171000F041634C00262078042804D02078052866
+:1017200001D00C201AE401206070607C002538B1E3
+:10173000EFF3108010F0010F72B610D001270FE008
+:10174000FDF7BCFD074694F82000F4F7ADF8788863
+:10175000C00411D000210320FDF7B4FD0CE00027E8
+:10176000607C38B1A07C28B1FDF72EFD6574A574AE
+:10177000F3F767FC07B962B694F82000F4F700FBB2
+:1017800094F8280030B184F828502078052800D03B
+:10179000FFDF0C26657000F06CFE304614E4404814
+:1017A00010B5007808B1FFF7B2FF00F0D6FE3C4953
+:1017B00000202439086210BD10B53A4C58B10128F8
+:1017C00007D0FFDFA06841F66A01884200D3FFDF3F
+:1017D00010BD40F6C410A060F4E7324908B50870A7
+:1017E0002F4900200870487081F82800C8700874DC
+:1017F000487488742022486281F820202439487077
+:101800004FF6FF7211F1680121F81020401CC0B2A0
+:101810002028F9D30020FFF7CFFFFFF7C0FF1020EB
+:10182000ADF80000012269460420FFF716FF08BD4D
+:101830007FB51B4C05460E46207810B10C2004B035
+:1018400070BD95F8652095F86410686A00F0C7FED1
+:10185000C5F80401656295F8F00000B1FFDF10499A
+:1018600000202439C86105212170607084F82800A7
+:10187000014604E004EB4102491C5085C9B294F8CA
+:1018800036208A42F6D284F835003046FFF7D5FE7E
+:101890000548F3F751FC84F82000202807D105E023
+:1018A000F01100208401002039150200FFDFF3F75A
+:1018B000BDFC606194F8201001226846FFF781FCAE
+:1018C00000B9FFDF94F82000694600F098FD00B9E8
+:1018D000FFDF0020B3E7F94810B5007808B1002019
+:1018E00010BD0620F1F7D4FA80F0010010BDF8B564
+:1018F000F24D0446287800B1FFDF002000902378E5
+:101900000246DE0701466B4605D06088A188ADF827
+:101910000010012211462678760706D5E088248932
+:1019200023F8114042F00802491C491E85F8361080
+:101930001946FFF792FE0020F8BD1FB511B1112026
+:1019400004B010BDDD4C217809B10C20F8E700226D
+:10195000627004212170114605E000BF04EB4103D1
+:10196000491C5A85C9B294F836308B42F6D284F8B5
+:101970003520FFF762FED248F3F7DEFB84F8200043
+:10198000202800D1FFDF00F0DFFD10B1F3F74EFC9F
+:1019900005E0F3F74BFC40F6B831F3F72EF9606140
+:1019A00094F8201001226846FFF70BFC00B9FFDF16
+:1019B00094F82000694600F022FD00B9FFDF002006
+:1019C000BEE770B5BD4C616A0160FFF7A0FE05007F
+:1019D00002D1606AFFF7B2F800206062284670BD4D
+:1019E0007FB5B64C2178052901D00C2027E7B349F3
+:1019F0002439C860606A00B9FFDF606A90F8F000BF
+:101A000000B1FFDF606A90F8FA00202800D0FFDF05
+:101A1000AC48F3F791FB616A0546202881F8FA008B
+:101A20000E8800D3FFDFA548443020F81560606AB7
+:101A300090F8FA00202800D1FFDF00230122684639
+:101A4000616AFFF796F8606A694690F8FA0000F05C
+:101A5000D6FC00B9FFDF00206062F0E69749243928
+:101A60004870704710B540F2E24300FB03F40020D9
+:101A700000F0B5FD844201D9201A10BD002010BD30
+:101A800070B50D46064601460020FCF7E2FE04460E
+:101A900096F86500F5F7F6FA014696F864004FF4FB
+:101AA0007A72022815D0012815D040F63400084477
+:101AB0004AF247310844B0FBF2F1708840F27122DB
+:101AC0005043C1EB4000A0F54970A54206D2214623
+:101AD00005E01046EBE74FF4C860E8E7294681428D
+:101AE00004D2A54201D2204600E02846706270BDB3
+:101AF00070B50546FDF7E2FB7049007824398C6823
+:101B00009834072D30D2DFE805F0043434252C3426
+:101B1000340014214FF4A873042810D00822082898
+:101B200009D02A2102280FD011FB024000222823CD
+:101B3000D118441819E0402211FB0240F8E71022A6
+:101B400011FB02402E22F3E7042211FB0240002287
+:101B50001823EDE7282100F04DFC044404F531740E
+:101B600003E004F5B07400E0FFDF5448C06BA0420E
+:101B700001D9012070BD002070BD70B54F4C243CD0
+:101B8000607870B1D4E904512846A268FBF713FFCE
+:101B90002061A84205D0A169401B0844A061F4F768
+:101BA00001F82169A068884201D8207808B1002096
+:101BB00070BD012070BD2DE9F04F054685B0164679
+:101BC0000F461C461846F5F7E2FA05EB47014718A1
+:101BD000204600F0F7FB4AF2C5714FF47A790844C9
+:101BE0004D46B0FBF5F0384400F160083348761CF0
+:101BF00024388068304404902046F5F7C8FAA8EBF2
+:101C00000007204600F0DEFB06462046F5F73AFACC
+:101C1000301AB0FBF5F03A1A182528204FF4C87690
+:101C20004FF4BF774FF0020B082C30D0042C2BD090
+:101C30000021022C2ED0082311F1280103EB830C84
+:101C40000CEB831319440A444FF0000A082C29D0E6
+:101C5000042C22D00021022C29D00546082001F5B1
+:101C6000B07100BF00EB00102844814232D2082C32
+:101C70002AD0042C1ED00020022C28D00821283085
+:101C800001EB0111084434E039461023D6E7314610
+:101C90004023D3E704231831D0E73D4640F2EE312C
+:101CA0001020DFE735464FF435614020DAE70420A5
+:101CB000B431D7E738461021E2E70000F0110020E8
+:101CC00039150200130E020030464021D8E70421E6
+:101CD0001830D5E7082C4FD0042C4AD00021022C14
+:101CE0004DD0082311F12801C3EBC30000EB4310D2
+:101CF000084415182821204600F07CFB05EB400124
+:101D0000082C42D0042C3DD00026022C3FD00820C5
+:101D100016F1280600EB801006EB80000E1801205B
+:101D2000FB4D8DF804008DF800A08DF805B0A86972
+:101D300006F50A760499F2F760FFCDE9020620461F
+:101D4000F5F7A0F94AF23B510144B1FBF9F0301A22
+:101D5000FC38E8630298C5F84080A86195F8200037
+:101D6000694600F04CFB002800D1FFDF05B0BDE85C
+:101D7000F08F39461023B7E731464023B4E70423F8
+:101D80001831B1E73E461020C4E74020C2E70420E6
+:101D90001836BFE72DE9FE4F06461C461746884613
+:101DA0004FF0010A1846F5F7F2F9D94D243DA9681C
+:101DB0008A1907EB480111444718204600F002FB3E
+:101DC0004FF47A7BD84600F6FB00B0FBF8F03844BD
+:101DD00000F120092046F5F7DAF9A9680246A9EBD7
+:101DE0000100801B871A204600F0ECFA05462046C9
+:101DF000F5F748F9281AB0FBF8F03A1A1825282008
+:101E00004FF4C8774FF4BF78082C2DD0042C28D07D
+:101E10000021022C2BD0082311F1280103EB830CA5
+:101E20000CEB831319440A44082C28D0042C21D02D
+:101E30000021022C28D00546082001F5B07100BF12
+:101E400000EB0010284481422AD2082C22D0042C16
+:101E50001DD00020022C20D00821283001EB0111D8
+:101E60002CE041461023D9E739464023D6E7042326
+:101E70001831D3E7454640F2EE311020E0E73D4609
+:101E80004FF435614020DBE70420B431D8E7404609
+:101E90001021E3E738464021E0E704211830DDE770
+:101EA000082C48D0042C43D00020022C46D0082116
+:101EB00010F12800C1EBC10303EB411108441518D0
+:101EC0002821204600F096FA05EB4001082C3BD073
+:101ED000042C36D00027022C38D0082017F1280710
+:101EE00000EB801007EB80000C1804F596740C983A
+:101EF000F5F7C8F84AF23B510144B1FBFBF0844DC1
+:101F0000FC30A5F12407E96B06F1FC020844B9682E
+:101F10000B191A44824224D9321911440C1AFC3488
+:101F20002044B0F1807F37D2642C12D2642011E0BB
+:101F300040461021BEE738464021BBE70421183057
+:101F4000B8E747461020CBE74020C9E70420183700
+:101F5000C6E720460421F3F78CFEE8B1E86B204485
+:101F6000E863E0F791FEB968293831440844CDE9C7
+:101F7000000995F835008DF8080002208DF8090059
+:101F80006846FCF77AFE00B1FFDFFCF765FF00B1A1
+:101F9000FFDF5046BDE8FE8F4FF0000AF9E71FB59E
+:101FA00000F023FB5A4C607880B994F8201000228E
+:101FB0006846FFF706F938B194F82000694600F04A
+:101FC0001EFA18B9FFDF01E00120E070F3F739F8DD
+:101FD00000206074A0741FBD2DE9F84FFDF76EF965
+:101FE0000646441CC07840090CD001280CD00228B9
+:101FF0000CD000202178824608064FF4967507D44D
+:102000001E2006E00120F5E70220F3E70820F1E7B3
+:102010002846B4F80120C2F30C0212FB00F7C809ED
+:1020200001D010B103E01E2501E0FFDF0025F5F728
+:10203000C0F8A7EB00092078B77909EB0508C0F3D1
+:10204000801010B120B1322404E04FF4FA7401E0A2
+:10205000FFDF00240C2F00D3FFDF2E482E4A30F87C
+:102060001700211801FB0821501CB1FBF0F4F5F713
+:102070005AF8F5F707F84FF47A7100F27160B0FB87
+:10208000F1F1A9EB0100071BA7F1590040F28D21E6
+:10209000103F884211D91E4E717829B90246534625
+:1020A00021462846FFF787FD00F09FFAF2F7C9FFA7
+:1020B00000207074B074BDE8F88F307800905346FB
+:1020C0002A4621463846FFF765FE0028F3D1012154
+:1020D0000220FDF7F7F8BDE8F84F60E710B50446B9
+:1020E000012903D10A482438007830B1042084F84B
+:1020F000F000BDE81040F2F7A4BF00220121204605
+:1021000000F0A6F934F8700F401C2080F1E70000C1
+:10211000F0110020546402003F420F002DE9F0410D
+:102120000746FDF7CBF8050000D1FFDF287810F057
+:102130000C0F01D0012100E00021F74C606A303023
+:10214000FCF7C7FA29783846FBF747FEA4F12406C6
+:102150000146A069B26802446FB32878082803D00A
+:10216000042803D000230BE0082300E0022303EB44
+:10217000430328334FF4A877082804D0042802D05A
+:10218000022810D028273B4408280ED004280ED05F
+:1021900002280ED05FF00800C0EBC00707EB40102C
+:1021A0001844983009E01827EDE74020F4E71020A4
+:1021B000F2E70420F0E74FF4FC7010444718287849
+:1021C0003F1DF4F75FFF014628784FF47A7202282A
+:1021D0001DD001281DD040F6340008444AF2EF011A
+:1021E0000844B0FBF2F03A1A606A40F2E241B046AD
+:1021F0004788F0304F43316A81420DD03946206B19
+:1022000000F08EF90646B84207D9FFDF05E0104618
+:10221000E3E74FF4C860E0E70026C04880688642E4
+:1022200007D2616A40F271224888424306EB4206B7
+:1022300004E040F2E240B6FBF0F0616AC882606AF6
+:10224000297880F86410297880F865100521417597
+:10225000C08A6FF41C71484306EB400040F63541DC
+:10226000C8F81C00B0EB410F00D3FFDFBDE8F081E0
+:1022700010B5052937D2DFE801F00509030D31005B
+:10228000002100E00121BDE8104027E7032180F88C
+:10229000F01010BD0446408840F2E24148439F4997
+:1022A000091D0860D4F818010089E082D4F81801EB
+:1022B00080796075D4F8180140896080D4F81801DD
+:1022C0008089A080D4F81801C089E0802046A16AE6
+:1022D000FFF7D6FB022084F8F00010BD816ABDE84C
+:1022E0001040FFF7CDBBFFDF10BD70B58A4C243C1A
+:1022F0000928A1683FD2DFE800F0050B0B15131584
+:1023000038380800BDE8704049E6BDE8704063E633
+:10231000022803D00020BDE87040FFE60120FAE764
+:10232000E16070BD032802D005281CD000E0E16008
+:102330005FF0000600F059F9774D012085F828007C
+:1023400085F83460686AA9690026C0F8F41080F83E
+:10235000F060E068FFF744FB00B1FFDFF2F771FEC9
+:102360006E74AE7470BD0126E4E76C480078BDE879
+:102370007040E0F7B5BDFFDF70BD674924394860A4
+:10238000704770B5644D0446243DB1B14FF47A7680
+:10239000012903D0022905D0FFDF70BD1846F4F7EC
+:1023A000E7FE05E06888401C68801046F5F7B0FF3E
+:1023B00000F2E730B0FBF6F0201AA86070BD564876
+:1023C00000787047082803D0042801D0F4F75ABEDB
+:1023D0004EF628307047002804DB00F1E02090F82A
+:1023E000000405E000F00F0000F1E02090F8140D6B
+:1023F0004009704710F00C0000D008467047F3F712
+:1024000039B910B50446202800D3FFDF42484430D4
+:1024100030F8140010BD70B505460C461046F4F7B0
+:1024200031FE4FF47A71022C0DD0012C0DD040F604
+:10243000340210444AF247321044B0FBF1F0284411
+:1024400000F5CA7070BD0A46F3E74FF4C862F0E7C2
+:102450001FB513460A46044601466846FEF789FB47
+:1024600094F8FA006946FFF7CAFF002800D1FFDFA1
+:102470001FBD70B5284C0025257094F82000F2F798
+:10248000B6FE00B9FFDF84F8205070BD2DE9F041A1
+:10249000050000D1FFDF204A0024243AD5F804616A
+:1024A0002046631E116A08E08869B04203D398424F
+:1024B00001D203460C460846C9680029F4D104B984
+:1024C00004460021C5F80041F035C4B1E068E5607C
+:1024D000E86000B105612E698846A96156B1B0690E
+:1024E00030B16F69B84200D2FFDFB069C01BA8618C
+:1024F000C6F81880084D5CB1207820B902E0E96088
+:102500001562E8E7FFDF6169606808442863ADE6AB
+:10251000C5F83080AAE60000F011002084010020F8
+:1025200010B50C4601461046F3F76FFB002806DA9B
+:10253000211A491EB1FBF4F101FB040010BD90FB10
+:10254000F4F101FB140010BD2E48016A002001E0E7
+:102550000846C9680029FBD170472DE9FE43294D83
+:102560000120287000264FF6FF7420E00621F0F7C6
+:10257000F5FC070000D1FFDF97F8FA00F037F3F71A
+:10258000FFFB07F80A6BA14617F8FA89B8F1200F8C
+:1025900000D3FFDF1B4A683222F8189097F8FA0040
+:1025A000F2F725FE00B9FFDF202087F8FA00694620
+:1025B0000620F0F75CFC50B1FFDF08E0029830B174
+:1025C00090F8F01019B10088A042CFD104E068461D
+:1025D000F0F72BFC0028F1D02E70BDE8FE8310B57B
+:1025E000FFF719FF00F5C87010BD06480021243020
+:1025F00090F8352000EB4200418503480078E0F771
+:102600006FBC0000CC11002084010020012804D000
+:10261000022805D0032808D105E0012907D004E0ED
+:10262000022904D001E0042901D0002070470120D4
+:102630007047F748806890F8A21029B1B0F89E1052
+:10264000B0F8A020914215D290F8A61029B1B0F8A8
+:10265000A410B0F8A02091420CD2B0F89C20B0F8A1
+:102660009A108A4206D290F88020B0F898001AB1E9
+:10267000884203D3012070470628FBD20020704710
+:102680002DE9F041E24D0746A86800F1700490F88A
+:10269000140130B9E27B002301212046FBF7F6F854
+:1026A00010B1A08D401CA08501263D21AFB928782E
+:1026B000022808D001280AD06878C8B110F0140F99
+:1026C00009D01E2039E0162037E026773EE0A868C2
+:1026D00090F8160131E0020701D56177F5E781072F
+:1026E00001D02A2029E0800600D4FFDF232024E047
+:1026F00094F8320028B1E08D411CE185218E88429A
+:1027000013D294F8360028B1A08E411CA186218EE8
+:1027100088420AD2A18D608D814203D3AA6892F8C3
+:10272000142112B9228E914201D3222005E0217C8E
+:1027300029B1218D814207D308206077C5E7208D1C
+:10274000062801D33E20F8E7207FB0B10020207397
+:10275000607320740221A868FFF78AFDA86890F8CA
+:10276000E410012904D1D0F81C110878401E08702B
+:10277000E878BDE8F041E0F7B3BBA868BDE8F041F8
+:102780000021FFF775BDA2490C28896881F8E40093
+:1027900014D0132812D0182810D0002211280ED0DF
+:1027A00007280BD015280AD0012807D0002805D00B
+:1027B000022803D021F89E2F012008717047A1F84C
+:1027C000A420704710B5924CA1680A88A1F8602136
+:1027D00081F85E0191F8640001F046FBA16881F880
+:1027E000620191F8650001F03FFBA16881F8630187
+:1027F000012081F85C01002081F82E01E078BDE81D
+:102800001040E0F76DBB70B5814C00231946A068FD
+:1028100090F87C207030FBF739F800283DD0A06894
+:1028200090F820110025C9B3A1690978B1BB90F8CF
+:102830007D00FBF713F888BBA168B1F870000A2887
+:102840002DD905220831E069EBF7C2FD10B3A0686D
+:10285000D0F81C11087858B10522491CE069EBF743
+:10286000B7FD002819D1A068D0F81C01007840B944
+:10287000A068E169D0F81C010A68C0F80120097954
+:102880004171A068D0F81C110878401C0870012024
+:10289000FFF779FFA06880F8205170BDFFE7A068BE
+:1028A00090F8241111B190F82511C1B390F82E11B0
+:1028B0000029F2D090F82F110029EED190F87D0078
+:1028C000FAF7CCFF0028E8D1A06890F8640001F086
+:1028D000CBFA0646A06890F8650001F0C5FA0546F7
+:1028E000A06890F830113046FFF790FEA0B3A068C2
+:1028F00090F831112846FFF789FE68B3A268B2F854
+:10290000703092F86410B2F8320102F58872FBF769
+:102910002DFA20B3A168252081F87C00BDE7FFE7F0
+:1029200090F87D10242918D090F87C10242914D018
+:102930005FF0000300F5897200F59271FBF78EFEDF
+:10294000A16881F8245101F13000C28A21F8E62FF4
+:10295000408B4880142007E005E00123EAE7BDE84A
+:10296000704000202EE71620BDE870400BE710B540
+:10297000F3F7E8FD0C2813D3254C0821A068D0F804
+:1029800018011E30F3F7E2FD28B1A0680421D83009
+:10299000F3F7DCFD00B9FFDFBDE810400320F2E6ED
+:1029A00010BD10B51A4CA068D0F818110A78002A8A
+:1029B0001FD04988028891421BD190F87C200023C7
+:1029C00019467030FAF762FF002812D0A068D0F8DC
+:1029D00018110978022907D003290BD0042919D02E
+:1029E000052906D108200DE090F87D00FAF736FFA2
+:1029F00040B110BD90F8811039B190F8820000B953
+:102A0000FFDF0A20BDE81040BDE6BDE81040AEE79C
+:102A10009001002090F8AA008007EAD10C20FFF76F
+:102A2000B2FEA068002120F89E1F01210171017BE8
+:102A300041F00101017310BD70B5F74CA268556EED
+:102A4000FBF72EF9EBB2C1B200228B4203D0A36890
+:102A500083F8121102E0A16881F81221C5F3072161
+:102A6000C0F30720814203D0A16881F8130114E765
+:102A7000A06880F8132110E710B5E74C0421A06886
+:102A8000FFF7F6FBA06890F85A10012908D000F56E
+:102A90009E71FBF7ACFEE078BDE81040E0F720BA8D
+:102AA000022180F85A1010BD70B5DB4CA06890F878
+:102AB000E410FE2955D16178002952D190F87F2089
+:102AC000002301217030FAF7E1FE002849D1A06807
+:102AD00090F8141109B1022037E090F87C2000230F
+:102AE00019467030FAF7D2FE28B1A06890F8960027
+:102AF00008B1122029E0A068002590F87C20122A55
+:102B00001DD004DC032A23D0112A04D119E0182A8D
+:102B10001AD0232A26D0002304217030FAF7B6FEFB
+:102B200000281ED1A06890F87D10192971D020DCF2
+:102B300001292AD0022935D0032932D120E00B20E7
+:102B400003E0BDE8704012E70620BDE870401AE6D9
+:102B500010F8E21F01710720FFF715FEA06880F84A
+:102B60007C509AE61820FFF70EFEA068A0F89E5051
+:102B700093E61D2918D01E2916D0212966D149E0D7
+:102B800010F8E11F4171072070E00C20FFF7FBFDFA
+:102B9000A06820F8A45F817941F00101817100F8FB
+:102BA000275C53E013202CE090F8252182BB90F89D
+:102BB0002421B2B1242912D090F87C1024290ED0FF
+:102BC0005FF0000300F5897200F59271FBF746FD96
+:102BD000A0681E2180F87D1080F8245103E00123B5
+:102BE000F0E71E2932D1A068FBF797FDFFF744FFFD
+:102BF000A16801F13000C28A21F8E62F408B48809D
+:102C00001520FFF7C0FDA068A0F8A45080F87D5003
+:102C10001CE02AE090F8971051B180F8125180F82A
+:102C200013511820FFF7AFFDA068A0F8A4500DE0E5
+:102C300090F82F1151B990F82E1139B1C16DD0F81B
+:102C40003001FFF7F9FE1820FFF79DFDA06890F80E
+:102C5000E400FE2885D1FFF7A4FEA06890F8E40008
+:102C6000FE2885D1BDE87040CDE51120FFF78BFD32
+:102C7000A068CBE7684A0129926819D0002302298D
+:102C80000FD003291ED010B301282BD0032807D161
+:102C900092F87C00132803D0162801D0182804D1FC
+:102CA000704792F8E4000028FAD0D2F8180117E033
+:102CB00092F8E4000128F3D0D2F81C110878401EE5
+:102CC0000870704792F8E4000328EED17047D2F8FC
+:102CD0001801B2F870108288891A09B20029F5DB50
+:102CE00003707047B2F87000B2F82211401A00B2B7
+:102CF0000028F6DBD2F81C010178491E01707047EC
+:102D000070B5044690F87C0000250C2810D00D28E2
+:102D10002ED1D4F81811B4F870008988401C88426C
+:102D200026D1D4F864013C4E017811B3FFDF42E0B4
+:102D3000B4F87000B4F82211401C884218D1D4F8BD
+:102D40001C01D0F80110A1604079207303212046B6
+:102D5000FAF780FAD4F81C01007800B9FFDF0121EE
+:102D6000FE20FFF787FF84F87C50012084F8B20032
+:102D700093E52188C180D4F81801D4F86411408902
+:102D80000881D4F81801D4F8641180894881D4F8F6
+:102D90001801D4F86411C0898881D4F864010571E0
+:102DA000D4F8641109200870D4F864112088488090
+:102DB000F078E0F795F802212046FAF74BFA032164
+:102DC0002046FFF755FAB068D0F8180100780228BD
+:102DD00000D0FFDF0221FE20FFF74CFF84F87C507B
+:102DE0005BE52DE9F0410C4C00260327D4F808C020
+:102DF000012598B12069C0788CF8E20005FA00F04E
+:102E0000C0F3C05000B9FFDFA06800F87C7F4684A3
+:102E100080F82650BDE8F0819001002000239CF846
+:102E20007D2019460CF17000FAF730FD70B1607822
+:102E30000028EFD12069C178A06880F8E11080F8FF
+:102E40007D70A0F8A46080F8A650E3E76570E1E724
+:102E5000F0B5F74C002385B0A068194690F87D20A6
+:102E60007030FAF713FD012580B1A06890F87C005E
+:102E700023280ED024280CD06846F5F73DFB68B116
+:102E8000009801A9C0788DF8040008E0657005B0CD
+:102E9000F0BD607840F020006070F8E70021A06885
+:102EA00003AB162290F87C00FAF77BFF002648B1AE
+:102EB000A0689DF80C20162180F80C2180F80D11D7
+:102EC000192136E02069FBF718FB78B121690879F0
+:102ED00000F00702A06880F85C20497901F0070142
+:102EE00080F85D1090F82F310BBB03E00020FFF756
+:102EF00078FFCCE790F82E31CBB900F164035F780E
+:102F0000974205D11A788A4202D180F897500EE094
+:102F100000F5AC71028821F8022990F85C200A7152
+:102F200090F85D0048710D70E078DFF7D9FFA06878
+:102F3000212180F87D1080F8A650A0F8A460A6E7B3
+:102F4000F8B5BB4C00231946A06890F87D2070307E
+:102F5000FAF79CFC40B32069FBF7B4FA48B3206948
+:102F6000FBF7AAFA07462069FBF7AAFA064620698A
+:102F7000FBF7A0FA05462069FBF7A0FA0146009787
+:102F8000A06833462A463030FBF79BFBA168012539
+:102F900091F87C001C2810D091F85A00012812D01A
+:102FA00091F8250178B90BE0607840F0010060707D
+:102FB000F8BDBDE8F840002013E781F85A5002E060
+:102FC00091F8240118B11E2081F87D000BE01D202E
+:102FD00081F87D0001F5A57231F8300BFBF7FBFBA2
+:102FE000E078DFF77DFFA068002120F8A41F85703E
+:102FF000F8BD10B58E4C00230921A06890F87C2004
+:103000007030FAF743FC48B16078002805D1A16818
+:1030100001F8960F087301F81A0C10BD01206070BA
+:1030200010BD7CB5824C00230721A06890F87C205D
+:103030007030FAF72BFC38B36078002826D1694647
+:103040002069FBF755FA9DF80000002500F02501E6
+:10305000A06880F8B0109DF8011001F0490180F8D7
+:10306000B11080F8A250D0F8181100884988814228
+:1030700000D0FFDFA068D0F818110D70D0F86411EF
+:103080000A7822B1FFDF16E0012060707CBD30F8C5
+:10309000E82BCA80C16F0D71C16F009A8A60019AD6
+:1030A000CA60C26F0821117030F8E81CC06F4180FF
+:1030B000E078DFF715FFA06880F87C507CBD70B524
+:1030C0005B4C00231946A06890F87D207030FAF719
+:1030D000DDFB012540B9A0680023082190F87C2081
+:1030E0007030FAF7D3FB10B36078002820D1A068C5
+:1030F00090F8AA00800712D42069FBF7BFF9A168F5
+:1031000081F8AB00206930F8052FA1F8AC20408889
+:10311000A1F8AE0011F8AA0F40F002000870A068F4
+:103120004FF0000690F8AA10C90702D011E06570B0
+:103130009DE490F87D20002319467030FAF7A6FB35
+:1031400000B9FFDFA06880F87D5080F8A650A0F895
+:10315000A460A06890F87C10012906D180F87C60FA
+:1031600080F8A260E078DFF7BBFEA168D1F8180113
+:10317000098842888A42DBD101780429D8D10670B7
+:10318000E078DFF7ADFEA06890F87C100029CFD181
+:1031900080F8A2606BE470B5254DA86890F87C10AB
+:1031A0001A2902D00220687061E469780029FBD1F5
+:1031B000002480F8A74080F8A240D0F818110088B9
+:1031C0004988814200D0FFDFA868D0F818110C7040
+:1031D000D0F864110A780AB1FFDF25E090F8A82042
+:1031E00072B180F8A8400288CA80D0F864110C71CE
+:1031F000D0F864210E2111700188D0F864010DE02F
+:1032000030F8E82BCA80C16F0C71C26F01211172B6
+:10321000C26F0D21117030F8E81CC06F418000F0C2
+:10322000A1FEE878DFF75CFEA86880F87C401EE429
+:103230009001002070B5FA4CA16891F87C20162A04
+:1032400001D0132A02D191F8A82012B10220607097
+:103250000DE46278002AFBD181F8E000002581F8B6
+:10326000A75081F8A250D1F81801098840888842F7
+:1032700000D0FFDFA068D0F818010078032800D044
+:10328000FFDF0321FE20FFF7F5FCA068D0F86411F2
+:103290000A780AB1FFDF14E030F8E02BCA8010F89A
+:1032A000081BC26F1171C16F0D72C26F0D211170B9
+:1032B00030F8E81CC06F418000F054FEE078DFF782
+:1032C0000FFEA06880F87C504BE470B5D44C092107
+:1032D0000023A06890F87C207030FAF7D7FA002518
+:1032E00018B12069007912281ED0A0680A21002395
+:1032F00090F87C207030FAF7C9FA18B1206900798B
+:10330000142814D02069007916281AD1A06890F8E2
+:103310007C101F2915D180F87C5080F8A250BDE8A0
+:1033200070401A20FFF74EBABDE8704061E6A06811
+:1033300000F87C5F458480F82650BDE87040FFF7B8
+:103340009BBB0EE470B5B64C2079C00773D02069E2
+:1033500000230521C578A06890F87C207030FAF72A
+:1033600095FA98B1062D11D006DC022D0ED0042D51
+:103370000CD0052D06D109E00B2D07D00D2D05D061
+:10338000112D03D0607840F008006070607800284C
+:1033900051D12069FAF7D6FF00287ED02069002598
+:1033A0000226C178891E162977D2DFE801F00B7654
+:1033B00034374722764D76254A457676763A53500D
+:1033C0006A6D7073A0680023012190F87F2070302F
+:1033D000FAF75CFA08BB2069FBF718F8A16881F8D6
+:1033E0001601072081F87F0081F8A65081F8A250CD
+:1033F00056E0FFF76AFF53E0A06890F87C100F29B1
+:1034000001D066704CE0617839B980F881501221A2
+:1034100080F87C1044E000F0D0FD41E000F0ACFD0D
+:103420003EE0FBF7A8F803283AD12069FBF7A7F89C
+:10343000FFF700FF34E03BE00079F9E7FFF7ABFE70
+:103440002EE0FFF73CFE2BE0FFF7EBFD28E0FFF757
+:10345000D0FD25E0A0680023194690F87D2070304B
+:10346000FAF714FA012110B16078C8B901E061706F
+:1034700016E0A06820F8A45F817000F8276C0FE0C8
+:103480000BE0FFF75DFD0BE000F034FD08E0FFF717
+:10349000DFFC05E000F0FAFC02E00020FFF7A1FCF1
+:1034A000A268F2E93001401C41F10001C2E90001CB
+:1034B0005EE42DE9F0415A4C2079800741D56078CF
+:1034C00000283ED1E06801270026C178204619294E
+:1034D000856805F170006FD2DFE801F04B3E0D6F9B
+:1034E000C1C1801C34C1556287C1C1C1C1BE8B95A9
+:1034F00098A4B0C1BA0095F87F2000230121FAF703
+:10350000C5F900281DD1A068082180F87F1080F837
+:10351000A26090E0002395F87D201946FAF7B6F9ED
+:1035200010B1A06880F8A660A0680023194690F842
+:103530007C207030FAF7AAF9002802D0A06880F841
+:10354000A26067E4002395F87C201946FAF79EF9FB
+:1035500000B9FFDF042008E0002395F87C2019461D
+:10356000FAF794F900B9FFDF0C20A16881F87C001C
+:1035700050E4002395F87C201946FAF787F900B942
+:10358000FFDF0D20F1E7002395F87C201946FAF7BC
+:103590007DF900B9FFDFA0680F2180F8A77008E06F
+:1035A00095F87C00122800D0FFDFA068112180F878
+:1035B000A87080F87C102DE451E0002395F87C2061
+:1035C0001946FAF763F920B9A06890F8A80000B985
+:1035D000FFDFA068132180F8A770EAE795F87C0068
+:1035E000182800D0FFDF1A20BFE7BDE8F04100F047
+:1035F00063BD002395F87C201946FAF747F900B916
+:10360000FFDF0520B1E785F8A66003E4002395F805
+:103610007C201946FAF73AF900B9FFDF1C20A4E72D
+:1036200090010020002395F87D201946FAF72EF925
+:1036300000B9FFDFA06880F8A66006E4002395F8D3
+:103640007C201946FAF722F900B9FFDF1F208CE72A
+:10365000BDE8F04100F0F8BC85F87D60D3E7FFDFFE
+:103660006FE710B5F74C6078002837D12079400714
+:103670000FD5A06890F87C00032800D1FFDFA06878
+:1036800090F87F10072904D101212170002180F8D2
+:103690007F10FFF70EFF00F0B5FCFFF753FEA07898
+:1036A000000716D5A0680023052190F87C20703013
+:1036B000FAF7ECF850B108206070A068D0F86411F7
+:1036C00008780D2800D10020087002E00020F8F7EB
+:1036D00011FDA068BDE81040FFF712BB10BD2DE939
+:1036E000F041D84C07464FF0000560780843607001
+:1036F000207981062046806802D5A0F8985004E021
+:10370000B0F89810491CA0F8981000F018FD012698
+:10371000F8B1A088000506D5A06890F8821011B114
+:10372000A0F88E5015E0A068B0F88E10491CA0F8E3
+:103730008E1000F0F3FCA068B0F88E10B0F8902066
+:10374000914206D3A0F88E5080F83A61E078DFF716
+:10375000C7FB207910F0600F08D0A06890F88010A7
+:1037600021B980F880600121FEF782FD1FB9FFF7C3
+:1037700078FFFFF799F93846FEF782FFBDE8F04180
+:10378000F4F7C9BEAF4A51789378194313D1114663
+:103790000128896808D01079400703D591F87F0087
+:1037A000072808D001207047B1F84C00098E8842E4
+:1037B00001D8FEF7E2B900207047A249C2788968B3
+:1037C000012A06D05AB1182A08D1B1F81011FAF717
+:1037D000B0BEB1F822114172090A81727047D1F866
+:1037E000181189884173090A8173704770B5954C27
+:1037F00005460E46A0882843A080A80703D5E80701
+:1038000000D0FFDFE660E80700D02661A80719D5E1
+:10381000F078062802D00B2814D10BE0A06890F8AD
+:103820007C1018290ED10021E0E93011012100F8A7
+:103830003E1C07E0A06890F87C10122902D10021FC
+:1038400080F88210280601D50820A07068050AD5E6
+:10385000A0688288B0F87010304600F07FFC3046D7
+:10386000BDE87040A9E763E43EB505466846F4F755
+:103870001DFE00B9FFDF222200210098EAF7FFFDBC
+:1038800003210098FAF746FD0098017821F0100115
+:1038900001702946FAF763FD6A4C192D71D2DFE8F1
+:1038A00005F020180D3EC8C8C91266C8C9C959C854
+:1038B000C8C8C8BBC9C971718AC89300A1680098FB
+:1038C00091F8151103E0A168009891F8E6100171D4
+:1038D000B0E0A068D0F81C110098491CFAF78BFDE5
+:1038E000A8E0A1680098D1F8182192790271D1F866
+:1038F000182112894271120A8271D1F81821528955
+:10390000C271120A0272D1F8182192894272120A07
+:103910008272D1F81811C989FAF744FD8AE0A068CB
+:10392000D0F818110098091DFAF772FDA068D0F8B8
+:10393000181100980C31FAF775FDA068D0F818112D
+:1039400000981E31FAF774FDA1680098D831FAF793
+:103950007DFD6FE062690098117801719188417175
+:10396000090A81715188C171090A017262E0364900
+:10397000D1E90001CDE9010101A90098FAF780FD24
+:1039800058E056E0A068B0F844100098FAF78AFDB5
+:10399000A068B0F8E6100098FAF788FDA068B0F8C3
+:1039A00048100098FAF776FDA068B0F8E810009883
+:1039B000FAF774FD3EE0A168009891F83021027199
+:1039C00091F83111417135E0A06890F81301FAF7D0
+:1039D0005EF901460098FAF7A8FDA06890F8120178
+:1039E00000F03DFA70B1A06890F8640000F037FA7A
+:1039F00040B1A06890F8121190F86400814201D0A3
+:103A0000002002E0A06890F81201FAF740F90146A0
+:103A10000098FAF786FD0DE0A06890F80D11009867
+:103A2000FAF7A7FDA06890F80C110098FAF7A5FD29
+:103A300000E0FFDFF4F74DFD00B9FFDF0098FFF76E
+:103A4000BCFE3EBD900100206C64020010B5F94C34
+:103A5000A06890F8121109B990F8641080F8641009
+:103A600090F8131109B990F8651080F865100020DE
+:103A7000FEF7A8FEA068FAF750FE002806D0A0685E
+:103A8000BDE8104000F59E71FAF7B1BE10BDF8B563
+:103A9000E84E00250446B060B5807570B57035708D
+:103AA0000088F4F700FDB0680088F4F722FDB4F850
+:103AB000F800B168401C82B201F17000F9F79FFC78
+:103AC00000B1FFDF94F87D00242809D1B4F870100C
+:103AD000B4F81001081A00B2002801DB707830B188
+:103AE00094F87C0024280AD0252808D015E0FFF798
+:103AF000ADFF84F87D50B16881F897500DE0B4F8BF
+:103B00007010B4F81001081A00B2002805DB7078B4
+:103B100018B9FFF79BFF84F87C50A4F8F850FEF723
+:103B200088FD00281CD1B06890F8E400FE2801D080
+:103B3000FFF79AFEC0480090C04BC14A2146284674
+:103B4000F8F70CFAB0680023052190F87C2070305B
+:103B5000F9F79CFE002803D0BDE8F840F7F7A5BFB1
+:103B6000F8BD10B5FEF765FD20B10020BDE810409E
+:103B70000146B4E5BDE81040F8F798BA70B50C46B8
+:103B8000154606464FF4B47200212046EAF777FC4A
+:103B9000268005B9FFDF2868C4F818016868C4F8F2
+:103BA0001C01A868C4F8640182E4EFF7E1BA2DE9CA
+:103BB000F0410D4607460621EFF7D0F9041E3DD02F
+:103BC000D4F864110026087858B14A8821888A42BE
+:103BD00007D109280FD00E2819D00D2826D0082883
+:103BE0003ED094F83A01D0B36E701020287084F85B
+:103BF0003A61AF809AE06E7009202870D4F86401B1
+:103C0000416869608168A9608089A88133E00846BD
+:103C1000EFF7D7FA0746EEF782FF70B96E700E2005
+:103C20002870D4F864014068686011E00846EFF736
+:103C3000C8FA0746EEF773FF08B1002081E46E7002
+:103C40000D202870D4F864014168696000892881DA
+:103C5000D4F8640106703846EEF75BFF66E00EE0CC
+:103C60006E7008202870D4F864014168696081682A
+:103C7000A960C068E860D4F86401067056E094F862
+:103C80003C0198B16E70152028700AE084F83C6100
+:103C9000D4F83E016860D4F84201A860D4F8460127
+:103CA000E86094F83C010028F0D13FE094F84A0124
+:103CB00058B16E701C20287084F84A610A2204F5FD
+:103CC000A671281DEAF7B1FB30E094F8560140B127
+:103CD0006E701D20287084F85661D4F85801686011
+:103CE00024E094F8340168B16E701A20287004E062
+:103CF00084F83461D4F83601686094F834010028FF
+:103D0000F6D113E094F85C01002897D06E7016206D
+:103D1000287007E084F85C61D4F85E016860B4F84C
+:103D20006201288194F85C010028F3D1012008E4A5
+:103D3000404A5061D170704770B50D4604464EE060
+:103D4000B4F8F800401CA4F8F800B4F89800401C3F
+:103D5000A4F89800204600F0F2F9B8B1B4F88E004B
+:103D6000401CA4F88E00204600F0D8F9B4F88E006C
+:103D7000B4F89010884209D30020A4F88E000120E6
+:103D800084F83A012B48C078DFF7AAF894F8A2002B
+:103D900020B1B4F89E00401CA4F89E0094F8A60040
+:103DA00020B1B4F8A400401CA4F8A40094F81401B5
+:103DB00040B994F87F200023012104F17000F9F745
+:103DC00065FD20B1B4F89C00401CA4F89C0020467E
+:103DD000FEF796FFB4F87000401CA4F870006D1E4A
+:103DE000ADB2ADD23FE5134AC2E90601704770B5E6
+:103DF0000446B0F8980094F88010D1B1B4F89A1045
+:103E00000D1A2D1F94F8960040B194F87C200023E1
+:103E1000092104F17000F9F739FDB8B1B4F88E60EA
+:103E2000204600F08CF980B1B4F89000801B001F90
+:103E30000CE007E090010020DF3602008537020029
+:103E4000ED370200C0F10205DCE72846A84200DA9F
+:103E50000546002D01DC002005E5A8B203E510F0C1
+:103E60000C0000D00120704710B5012808D00228AE
+:103E700008D0042808D0082806D0FFDF204610BD4F
+:103E80000124FBE70224F9E70324F7E770B5CC4CE3
+:103E9000A06890F87C001F2804D0607840F00100F2
+:103EA0006070E0E42069FAF732FBD8B120690122A2
+:103EB0000179407901F0070161F30705294600F017
+:103EC000070060F30F21A06880F8A2200022A0F86C
+:103ED0009E20232200F87C2FD0F8B400BDE870406B
+:103EE000FEF7AABD0120FEF77CFFBDE870401E2052
+:103EF000FEF768BCF8B5B24C00230A21A06890F820
+:103F00007C207030F9F7C2FC38B32069FAF7DAFA8E
+:103F1000C8B12069FAF7D0FA07462069FAF7D0FA53
+:103F200006462069FAF7C6FA05462069FAF7C6FA86
+:103F300001460097A06833462A463030FAF7C1FBA5
+:103F4000A068FAF7EAFBA168002081F8A20081F8D6
+:103F50007C00BDE8F840FEF78FBD607840F00100BE
+:103F60006070F8BD964810B580680088EFF729F9B1
+:103F7000BDE81040EEF7BEBD10B5914CA36893F8B4
+:103F80007C00162802D00220607010BD60780028E6
+:103F9000FBD1D3F81801002200F11E010E30C83306
+:103FA000F9F7EEFBA0680021C0E92E11012180F88D
+:103FB0008110182180F87C1010BD10B5804CA068CD
+:103FC00090F87C10132902D00220607010BD617837
+:103FD0000029FBD1D0F8181100884988814200D00F
+:103FE000FFDFA068D0F8181120692631FAF73BFAF4
+:103FF000A1682069DC31FAF73EFAA168162081F841
+:104000007C0010BD10B56E4C207900071BD5607880
+:10401000002818D1A068002190F8E400FEF72AFEDD
+:10402000A06890F8E400FE2800D1FFDFA068FE2120
+:1040300080F8E41090F87F10082904D10221217043
+:10404000002180F87F1010BD70B55D4D2421002443
+:10405000A86890F87D20212A05D090F87C20232A9A
+:1040600018D0FFDFA0E590F8122112B990F81321C3
+:104070002AB180F87D10A86880F8A64094E500F881
+:104080007D4F847690F8B1000028F4D00020FEF730
+:1040900099FBF0E790F8122112B990F813212AB198
+:1040A00080F87C10A86880F8A2407DE580F87C400C
+:1040B0000020FEF787FBF5E770B5414C0025A068AE
+:1040C000D0F8181103884A889A4219D1097804292E
+:1040D00016D190F87C20002319467030F9F7D6FBF2
+:1040E00000B9FFDFA06890F8AA10890703D4012166
+:1040F00080F87C1004E080F8A250D0F81801057018
+:10410000A0680023194690F87D207030F9F7BEFBB7
+:10411000002802D0A06880F8A65045E5B0F89020AD
+:10412000B0F88E108A4201D3511A00E00021828833
+:10413000521D8A4202D3012180F89610704710B5B3
+:1041400090F8821041B990F87C200023062170304D
+:10415000F9F79CFB002800D0012010BD70B5114478
+:10416000174D891D8CB2C078A968012806D040B1CE
+:10417000182805D191F8120138B109E0A1F82241BF
+:1041800012E5D1F8180184800EE591F8131191B170
+:10419000FFF765FE80B1A86890F86400FFF75FFE46
+:1041A00050B1A86890F8121190F86420914203D0A1
+:1041B00090F8130100B90024A868A0F81041F3E4B6
+:1041C0009001002070B58E4C0829207A6CD2DFE86F
+:1041D00001F004176464276B6B6458B1F3F7BEF801
+:1041E000F4F7B7F80020A072F3F796F9BDE8704035
+:1041F000F3F726BCF4F7CFF8BDE87040F0F721BF25
+:10420000DEF742FDF3F7E6FFD4E90001F0F7F5FC35
+:104210002060A07A401CC0B2A072282824D370BDB0
+:10422000A07A0025401EC6B2E0683044F3F7CEFC09
+:1042300010B9E1687F208855A07A272828BF01257A
+:10424000DEF722FDA17A01EB4102C2EB81110844A5
+:104250002946F3F7E9FFA07A282809D2401CC0B20A
+:10426000A072282828BF70BDBDE87040F3F754B98C
+:10427000207A002818BF00F085F8F3F717FBF3F752
+:10428000C5FBF4F788F80120E0725E480078DEF79D
+:1042900027FEBDE87040F0F7D4BE002808BF70BD0F
+:1042A000BDE8704000F06EB8FFDF70BD10B5544C33
+:1042B000207A002804BF0C2010BD00202072E0727C
+:1042C000607AF1F7F1FA607AF1F75AFD607AF0F767
+:1042D0008EFF00280CBF1F20002010BD002270B5EB
+:1042E000474C06460D46207A68B12272E272607A27
+:1042F000F1F7DAFA607AF1F743FD607AF0F777FFC9
+:10430000002808BFFFDF3F48E560067070BD70B54C
+:10431000050007D0A5F5E8503B494C3881429CBFC9
+:10432000122070BD364CE068002804BF092070BD23
+:10433000207A00281CBF0C2070BD3448F0F7FCFE2A
+:104340006072202804BF1F2070BDF0F76FFF20604F
+:10435000002D1CBF2844206001206560207200F001
+:1043600011F8002070BD2649CA7A002A04BF002037
+:1043700070471E22027000224270CB684360CA72EE
+:1043800001207047F0B585B0F0F750FF1C4D07468F
+:10439000394668682C6800EB800046002046F1F73B
+:1043A00034FCB04206DB6868811B3846F0F725FC18
+:1043B0000446286040F2357621463846F1F725FC60
+:1043C000B04204DA31463846F0F717FC04460020C4
+:1043D0008DF8000040F6E110039004208DF80500F0
+:1043E00001208DF8040068460294F1F7C7F8687A56
+:1043F0006946F1F73FF9002808BFFFDF05B0F0BDBF
+:1044000074120020B0010020B5EB3C00C541020051
+:104410002DE9F0410C4612490D68114A1149083244
+:104420001160A0F12001312901D301200CE04128C5
+:1044300010D040CC0C4F94E80E0007EB8000241FF6
+:1044400050F8807C3046B84720600548001D056064
+:10445000BDE8F081204601F01BFDF5E7062070471E
+:1044600010050240010000017464020010B55548B7
+:10447000F1F7EAFF00B1FFDF5248401CF1F7E4FF1B
+:10448000002800D0FFDF10BD2DE9F14F4E4E82B065
+:10449000D6F800B001274B48F1F7DEFFDFF82481A2
+:1044A00020B9002708F10100F1F7ECFF474C002587
+:1044B0004FF0030901206060C4F80051C4F80451B2
+:1044C000029931602060DFF808A11BE0DAF80000F3
+:1044D000C00617D50E2000F068F8EFF3108010F03A
+:1044E000010072B600D001200090C4F80493D4F803
+:1044F000000120B9D4F8040108B9DEF775FD009871
+:1045000000B962B6D4F8000118B9D4F80401002843
+:10451000DCD0D4F804010028CCD137B1C6F800B003
+:1045200008F10100F1F798FF11E008F10100F1F73F
+:1045300093FF0028B6D1C4F80893C4F80451C4F816
+:1045400000510E2000F031F81E48F1F79BFF0020CB
+:10455000BDE8FE8F2DE9F0438DB00D4606460024E0
+:104560000DF110090DF1200818E000BF04EB44071D
+:10457000102255F827106846E9F757FF05EB870723
+:10458000102248467968E9F750FF6846FFF77CFF3C
+:1045900010224146B868E9F748FF641CB442E5DBE5
+:1045A0000DB00020BDE8F0836EE7002809DB00F0C5
+:1045B0001F02012191404009800000F1E020C0F875
+:1045C00080127047B101002004E5004000E0004087
+:1045D00010ED00E0B54900200870704770B5B44D8B
+:1045E00001232B60B34B1C68002CFCD0002407E097
+:1045F0000E6806601E68002EFCD0001D091D641C9C
+:104600009442F5D30020286018680028FCD070BDC3
+:1046100070B5A64E0446A84D3078022800D0FFDFC2
+:10462000AC4200D3FFDF7169A448012903D847F2E7
+:104630003052944201DD03224271491C7161291BF1
+:10464000C1609E49707800F02EF9002800D1FFDF8C
+:1046500070BD70B5954C0D466178884200D0FFDF83
+:10466000954E082D4BD2DFE805F04A041E2D4A4A2C
+:104670004A382078022800D0FFDF03202070A0787D
+:10468000012801D020B108E0A06801F0C1F904E0E0
+:1046900004F1080007C8FFF7A1FF05202070BDE85E
+:1046A0007040F0F7CEBCF0F7C1FD01466068F1F74D
+:1046B000ACFAB04202D2616902290BD30320F1F7B0
+:1046C000F4FD12E0F0F7B2FD01466068F1F79DFAE3
+:1046D000B042F3D2BDE870409AE7207802280AD0B1
+:1046E000052806D0FFDF04202070BDE8704000F0F0
+:1046F000D0B8022000E00320F1F7D7FDF3E7FFDF99
+:1047000070BD70B50546F0F791FD684C606020788B
+:10471000012800D0FFDF69490120087000200871DE
+:1047200004208D6048716448C86002202070607861
+:1047300000F0B9F8002800D1FFDF70BD10B55B4C68
+:10474000207838B90220F1F7C6FD18B90320F1F737
+:10475000C2FD08B1112010BD5948F0F7EDFC6070A2
+:10476000202804D0012020700020606110BD0320AB
+:1047700010BD2DE9F0471446054600EB84000E46B7
+:10478000A0F1040801F057F907464FF08050016985
+:104790004F4306EB8401091FB14201D2012100E021
+:1047A000002189461CB10069B4EB900F02D90920A1
+:1047B000BDE8F0872846DCF745FD90B9A84510D341
+:1047C000BD4205D2B84503D245EA0600800701D0B4
+:1047D0001020EDE73046DCF735FD10B9B9F1000FD8
+:1047E00001D00F20E4E7374837490068884205D0F8
+:1047F000224631462846FFF7F1FE1AE0FFF79EFFFA
+:104800000028D5D1294800218560C0E90364817062
+:10481000F1F7C3FD08B12D4801E04AF2F87060439A
+:104820004FF47A7100F2E730B0FBF1F01830FFF787
+:1048300068FF0020BCE770B505464FF08050046962
+:104840006C432046DCF7FEFC08B10F2070BD01F080
+:10485000F2F8A84201D8102070BD1A481A49006821
+:10486000884203D0204601F0D3F810E0FFF766FF3E
+:104870000028F1D10D48012184608170F1F78DFD90
+:1048800008B1134800E013481830FFF73AFF002042
+:1048900070BD10B5054C6078F0F7A9FC00B9FFDFDA
+:1048A0000020207010BDF0F7E5BE0000B40100202C
+:1048B00004E5014000E40140105C0C00841200207B
+:1048C0005346020058000020BEBAFECA5028050018
+:1048D000645E0100A85B01007E4909680160002058
+:1048E00070477C4908600020704701218A0720B189
+:1048F000012804D042F204007047916700E0D167BC
+:104900000020704774490120086042F20600704799
+:1049100008B50423704A1907103230B1C1F80433C6
+:10492000106840F0010010600BE0106820F00100FA
+:104930001060C1F808330020C1F80801674800681A
+:104940000090002008BD011F0B2909D862491031D1
+:104950000A6822F01E0242EA400008600020704708
+:1049600042F2050070470F2809D85B4910310A68E8
+:1049700022F4706242EA002008600020704742F290
+:1049800005007047000100F18040C0F804190020C4
+:104990007047000100F18040C0F8081900207047FE
+:1049A000000100F18040D0F8000908600020704745
+:1049B000012801D907207047494A52F820000268AF
+:1049C0000A43026000207047012801D90720704780
+:1049D000434A52F8200002688A4302600020704770
+:1049E000012801D9072070473D4A52F8200000688D
+:1049F00008600020704702003A494FF0000003D0E1
+:104A0000012A01D0072070470A607047020036492A
+:104A10004FF0000003D0012A01D0072070470A6040
+:104A2000704708B54FF40072510510B1C1F8042366
+:104A300008E0C1F808230020C1F8240127481C30F1
+:104A400000680090002008BD08B58022D10510B193
+:104A5000C1F8042308E0C1F808230020C1F81C01B4
+:104A60001E48143000680090002008BD08B54FF4BF
+:104A70008072910510B1C1F8042308E0C1F8082341
+:104A80000020C1F82001154818300068009000206F
+:104A900008BD10493831096801600020704770B5C1
+:104AA0004FF080450024C5F80841F1F782FC10B9A9
+:104AB000F1F789FC28B1C5F82441C5F81C41C5F8B7
+:104AC00020414FF0E020802180F800140121C0F83F
+:104AD000001170BD000400400005004008010040C6
+:104AE0003865020078050040800500406249634B4C
+:104AF0000A6863499A42096801D1C1F31001016053
+:104B0000002070475C495D4B0A685D49091D9A4267
+:104B100001D1C0F310000860002070475649574B80
+:104B20000A68574908319A4201D1C0F31000086061
+:104B30000020704730B5504B504D1C6842F20803BE
+:104B4000AC4202D0142802D203E0112801D3184647
+:104B500030BDC3004B481844C0F81015C0F81425E8
+:104B6000002030BD4449454B0A6842F209019A428F
+:104B700002D0062802D203E0042801D30846704779
+:104B8000404A012142F83010002070473A493B4B1F
+:104B90000A6842F209019A4202D0062802D203E0D2
+:104BA000042801D308467047364A012102EBC000B1
+:104BB00041600020704770B52F4A304E314C156867
+:104BC00042F2090304EB8002B54204D0062804D265
+:104BD000C2F8001807E0042801D3184670BDC1F3DD
+:104BE0001000C2F80008002070BD70B5224A234EA4
+:104BF000244C156842F2090304EB8002B54204D04C
+:104C0000062804D2D2F8000807E0042801D3184689
+:104C100070BDD2F80008C0F310000860002070BD1D
+:104C2000174910B50831184808601120154A0021AD
+:104C300002EBC003C3F81015C3F81415401C142868
+:104C4000F6D3002006E0042804D302EB8003C3F867
+:104C5000001807E002EB8003D3F80048C4F3100407
+:104C6000C3F80048401C0628EDD310BD044906488F
+:104C7000083108607047000058000020BEBAFECA24
+:104C800000F5014000F001400000FEFF814B1B6871
+:104C900003B19847BFF34F8F7F4801687F4A01F403
+:104CA000E06111430160BFF34F8F00BFFDE710B516
+:104CB000EFF3108010F0010F72B601D0012400E074
+:104CC000002400F0DDF850B1DCF760FBF0F759F894
+:104CD000F1F78DFAF1F7AEFF71490020086004B9D1
+:104CE00062B6002010BD2DE9F0410C460546EFF3F9
+:104CF000108010F0010F72B601D0012600E00026EE
+:104D000000F0BEF820B106B962B60820BDE8F08117
+:104D100001F044F9DCF73EFB02460020012347097D
+:104D2000BF0007F1E02700F01F01D7F80071CF4066
+:104D3000F9071BD0202803D222FA00F1C90727D196
+:104D400041B2002904DB01F1E02191F8001405E0F3
+:104D500001F00F0101F1E02191F8141D4909082922
+:104D600016D203FA01F717F0EC0F11D0401C64289B
+:104D7000D5D3F1F73DFF4B4A4B490020F1F780FFB7
+:104D800047494A4808602046DCF763FA60B904E006
+:104D900006B962B641F20100B8E73E4804602DB1A1
+:104DA0002846DCF7A3FA18B1102428E0404D19E09A
+:104DB0002878022802D94FF4805420E007240028E4
+:104DC000687801D0D8B908E0C8B1202817D8A878E9
+:104DD000212814D8012812D001E0A87878B9E87801
+:104DE0000B280CD8DCF7D6FA2946F1F7E6F9EFF7ED
+:104DF00087FF00F053FE2846DCF796FA044606B912
+:104E000062B61CB1FFF753FF20467FE700207DE725
+:104E100010B5044600F034F800B1012020700020E5
+:104E200010BD244908600020704770B50C46224927
+:104E30000D682149214E08310E60102807D0112835
+:104E40000CD012280FD0132811D0012013E0D4E980
+:104E50000001FFF748FF354620600DE0FFF727FF10
+:104E60000025206008E02068FFF7D2FF03E0114929
+:104E700020680860002020600F48001D056070BD9C
+:104E800007480A490068884201D101207047002084
+:104E900070470000CC0100200CED00E00400FA0592
+:104EA000580000204814002000000020BEBAFECAAE
+:104EB00040650200040000201005024001000001CE
+:104EC00000B59B4902282ED021DC10F10C0F08BF41
+:104ED000F42028D00FDC10F1280F08BFD82022D0F2
+:104EE00010F1140F08BFEC201DD010F1100F08BFF7
+:104EF000F02018D021E010F1080F08BFF82012D0E0
+:104F000010F1040F0CBFFC2000280CD015E0A0F11C
+:104F10000300062811D2DFE800F00E0C0A08050392
+:104F2000082000E00720086000BD0620FBE7052000
+:104F3000F9E70420F7E70320F5E7FFDF00BD00B540
+:104F40007C49012808BF03200CD0022808BF042098
+:104F500008D0042808BF062004D0082816BFFFDFA9
+:104F6000052000BD086000BD70B505460C4616461C
+:104F70001046F2F787F8022C08BF4FF47A7105D07B
+:104F8000012C0CBF4FF4C86140F634014418304680
+:104F9000F2F7EEF8204449F6797108444FF47A713B
+:104FA000B0FBF1F0281A70BD70B505460C460846F6
+:104FB000F3F7AEF9022C08BF40F24C4105D0012CAA
+:104FC0000CBF40F634014FF4AF5149F6CA62511A92
+:104FD00008444FF47A7100F2E140B0FBF1F0281A76
+:104FE000801E70BD70B5064615460C460846F3F7A0
+:104FF0008FF9022D08BF4FF47A7105D0012D0CBF37
+:105000004FF4C86140F63401022C08BF40F24C4214
+:1050100005D0012C0CBF40F634024FF4AF52891A70
+:10502000084449F6FC6108444FF47A71B0FBF1F092
+:10503000301A70BD70B504460E460846F2F722F8E5
+:1050400005463046F2F794F828444AF2AB3108445A
+:105050004FF47A71B0FBF1F0201A801E70BD2DE97B
+:10506000F04107461E460D4614461046082A16BF54
+:1050700004284EF62830F2F705F807EB4701C1EB9C
+:10508000C71100EBC100022D08BF40F24C4105D012
+:10509000012D0CBF40F634014FF4AF51471828469C
+:1050A000F3F736F9381A4FF47A7100F6B730B0FBDF
+:1050B000F1F52046F2F76BF828443044401DBDE876
+:1050C000F08170B5054614460E460846F1F7DAFF42
+:1050D00005EB4502C2EBC512C0EBC2053046F2F744
+:1050E00047F82D1A2046082C16BF04284EF6283003
+:1050F000F1F7C8FF28444FF47A7100F6B730B0FBDF
+:10510000F1F52046F2F743F82844401D70BD0A49E6
+:10511000082818BF0428086803BF20F46C5040F426
+:10512000444040F0004020F000400860704700001C
+:105130000C1500401015004040170040F0B585B038
+:105140000C460546F9F7FAF807466E78204603A99B
+:105150006A46EDF7C0FC81198EB258B1012F02D01A
+:10516000032005B0F0BD204604AA0399EDF7D5FB56
+:10517000049D01E0022F0FD1ED1C042E0FD32888CF
+:10518000BDF80010001D80B2884201D8864202D1CD
+:105190004FF00000E5E702D34FF00200E1E74FF0E7
+:1051A0000100DEE7FA48C078FF2814BF0120002084
+:1051B00070472DE9F041F74C0746160060680D4630
+:1051C00003D0F9F725F8A0B121E0F9F721F8D8B913
+:1051D0006068F9F71DF8D0B915F00C0F17D06068AA
+:1051E000C17811F03F0F1CBF007910F0100F0ED0E6
+:1051F0000AE0022E08D0E6481FB1807DFF2806D0C5
+:1052000002E0C078FF2802D00120BDE8F081002034
+:10521000BDE8F0810A4601460120CAE710B5DC4C22
+:105220001D220021A01CE9F72AF97F206077FF20CA
+:105230002074E070A075A08920F060002030A0816B
+:105240000020207010BD70B5D24948600120087060
+:10525000D248D149002541600570CD4C1D22294618
+:10526000A01CE9F70CF97F206077FF202074E07024
+:10527000A075A08920F060002030A081257070BD4D
+:105280002DE9F047C24C06462078C24F4FF0010985
+:1052900007F10808002520B13878D0B998F8000047
+:1052A000B8B198F8000068B387F80090D8F80410F7
+:1052B0003C2239B37570301DE9F7B7F8052030701E
+:1052C00086F804903878002818BF88F8005005D078
+:1052D00015E03D70A11C4FF48E72EAE71D220021FB
+:1052E000A01CE9F7CCF87F206077FF202074E070E5
+:1052F000A075A08920F060002030A08125700120D9
+:10530000BDE8F0870020BDE8F087A14800780028BC
+:105310000CBF0120002070470A460146002048E7E4
+:1053200010B510B1022810D014E09A4C6068F8F75C
+:105330006FFF78B96068C17811F03F0F1CBF00792A
+:1053400010F0100F06D1012010BD9148007B10F025
+:10535000080FF8D1002010BD2DE9FF4F81B08C4D12
+:105360008346DDE90F042978DDF838A09846164613
+:1053700000291CBF05B0BDE8F08F884909780029D5
+:105380001CBF05B0BDE8F08FE872B4B1012E08BFB4
+:10539000012708D0022E08BF022704D0042E16BF12
+:1053A000082E0327FFDFEF7385F81E804FF00008FB
+:1053B000784F8CB1022C1DD020E0012E08BF0127B0
+:1053C00008D0022E08BF022704D0042E16BF082ED4
+:1053D0000327FFDFAF73E7E77868F8F719FF68B9CD
+:1053E0007868C17811F03F0F1CBF007910F0100FE2
+:1053F00004D110E0287B10F0080F0CD14FF003010E
+:105400007868F8F7B9FD30B1417809092974008846
+:10541000C0F30B006882CDF800807868F8F7F8FEDA
+:1054200001460128BDF8000005F102090CBF40F05B
+:10543000010020F00100ADF8000099F80A2012F0F8
+:10544000020F4ED1022918BF20F0020049D000BF40
+:10545000ADF8000010F0020F04D0002908BF40F0A2
+:10546000080801D020F00808ADF800807868C178FD
+:1054700011F03F0F1CBF007910F0020F0CD0314625
+:1054800022464FF00100FFF794FE002804BF48F0C9
+:105490000400ADF8000006D099F80A00800860F317
+:1054A0008208ADF8008099F80A004109BDF80000B3
+:1054B00061F34610ADF8000080B20090BDF8000026
+:1054C000A88104217868F8F757FD002804BFA8894F
+:1054D00020F060000CD0B0F80100C004C00C03D074
+:1054E00007E040F00200B3E7A88920F060004030F8
+:1054F000A8815CB916F00C0F08D07868C17811F05B
+:105500003F0F1CBF007910F0100F0DD17868C178E3
+:1055100011F03F0F08D0017911F0400F04D006219F
+:10552000F8F72AFD00786877314622460020FFF719
+:1055300040FE60BB7968C87810F03F0F3FD0087913
+:1055400010F0010F3BD0504605F1040905F10308A6
+:10555000BAF1FF0F0DD04A464146F7F7AFFA0028DF
+:1055600008BFFFDF98F8000040F0020088F8000054
+:1055700025E00846F8F797FC88F800007868F8F707
+:1055800069FC07280CD249467868F8F76EFC16E0EB
+:1055900094120020D0010020D2120020D801002057
+:1055A0007868F8F757FC072809D100217868F8F7E0
+:1055B000E3FC0168C9F800108088A9F804003146AE
+:1055C00022460120FFF7F5FD80BB7868C17811F015
+:1055D0003F0F2BD0017911F0020F27D005F11706EC
+:1055E00005F11608BBF1020F18BFBBF1030F08D07D
+:1055F000F8F730FC07280AD231467868F8F743FC00
+:1056000012E00298016831608088B0800CE0786810
+:10561000F8F720FC072807D101217868F8F7ACFCDF
+:10562000016831608088B08088F800B0002C04BF29
+:1056300005B0BDE8F08F7868F8F7EAFD022804BFEE
+:1056400005B0BDE8F08F05F11F047868F8F729FE72
+:10565000AB7AC3F1FF01884228BF084605D9A98962
+:1056600021F0600101F14001A981C2B203EB040104
+:105670007868F8F71EFEA97A0844A87205B0BDE85C
+:10568000F08FB0480178002918BF704701220270DE
+:10569000007B10F0080F14BF07200620FCF725BE82
+:1056A000A848C17B002908BF70470122818921F0E9
+:1056B0006001403181810378002B18BF7047027070
+:1056C00011F0080F14BF07200620FCF70EBE2DE9CD
+:1056D000FF5F9C4FDDF838B0914638780E460028C1
+:1056E0001CBF04B0BDE8F09FBC1C1D220021204659
+:1056F000E8F7C5FE944D4FF0010A84F800A06868F1
+:10570000F8F7A8FB18B3012826D0022829D00628CC
+:1057100018BFFFDF2AD000BF04F11D016868F8F749
+:10572000E2FB2072484604F1020904F10108FF2857
+:1057300021D04A464146F7F7C1F9002808BFFFDFEC
+:1057400098F8000040F0020088F8000031E060891D
+:1057500040F013006081DFE7608940F01500608150
+:10576000E0E7608940F010006081D5E7608940F093
+:1057700012006081D0E76868F8F795FB88F80000B0
+:105780006868F8F767FB072804D249466868F8F7A5
+:105790006CFB0EE06868F8F75DFB072809D1002173
+:1057A0006868F8F7E9FB0168C9F800108088A9F873
+:1057B000040084F809B084F80CA000206073FF2076
+:1057C000A073A17A11F0040F08BF20752AD004F14C
+:1057D000150804F11409022E18BF032E09D06868B9
+:1057E000F8F738FB07280CD241466868F8F74BFBFE
+:1057F00016E000980168C8F800108088A8F8040036
+:105800000EE06868F8F726FB072809D101216868CF
+:10581000F8F7B2FB0168C8F800108088A8F8040007
+:1058200089F800607F20E0760398207787F800A051
+:1058300004B00620BDE8F05FFCF757BD2DE9FF5F1F
+:10584000424F81469A4638788B4600281CBF04B0E8
+:10585000BDE8F09F3B48017831B1007B10F0100F9C
+:1058600004BF04B0BDE8F09F1D227C6800212046E3
+:10587000E8F705FE48464FF00108661C324D84F8F3
+:10588000008004F10209FF280BD04A463146F7F7A1
+:1058900015F9002808BFFFDF307840F002003070B3
+:1058A0001CE06868F8F7FFFA30706868F8F7D2FA19
+:1058B000072804D249466868F8F7D7FA0EE0686806
+:1058C000F8F7C8FA072809D100216868F8F754FBEF
+:1058D0000168C9F800108088A9F8040004F11D01CE
+:1058E0006868F8F700FB207284F809A060896BF300
+:1058F000000040F01A00608184F80C800020607382
+:10590000FF20A07320757F20E0760298207787F82B
+:10591000008004B00720BDE8F05FFCF7E6BC094A50
+:10592000137C834205BF508A8842002001207047C3
+:105930000448007BC0F3411002280CBF0120002066
+:105940007047000094120020D0010020D8010020F0
+:10595000C2790D2341B342BB8188012904D949088A
+:10596000818004BF012282800168012918BF0029BB
+:1059700030D001686FEA0101C1EBC10202EB0112F4
+:1059800081796FEA010101EB8103C3EB81111144BD
+:105990004FEA914201608188B2FBF1F301FB1321D0
+:1059A00081714FF0010102E01AB14FF00001C171A5
+:1059B00070478188FF2908D24FF6FF7202EA410141
+:1059C0008180FF2984BFFF2282800168012918BFDE
+:1059D0000029CED10360CCE7817931B1491E11F0A5
+:1059E000FF0181711CBF002070470120704710B576
+:1059F0000121C1718171818004460421F0F7A6FD67
+:105A0000002818BF10BD2068401C206010BD000099
+:105A10000B4A022111600B490B68002BFCD0084B8C
+:105A20001B1D186008680028FCD000201060086862
+:105A30000028FCD070474FF080504069704700004C
+:105A400004E5014000E4014002000B464FF0000075
+:105A5000014620D0012A04D0022A04D0032A0DD105
+:105A600003E0012002E0022015E00320072B05D20D
+:105A7000DFE803F00406080A0C0E10000720704748
+:105A8000012108E0022106E0032104E0042102E0F4
+:105A9000052100E00621EFF76CBB0000E24805217C
+:105AA00081700021017041707047E0490A78012A35
+:105AB00005D0CA681044C8604038F0F773B88A68E7
+:105AC00010448860F8E7002819D00378D849D94AEB
+:105AD00013B1012B0ED011E00379012B00D06BB96B
+:105AE00043790BB1012B09D18368643B8B4205D20A
+:105AF000C0680EE00379012B02D00BB10020704783
+:105B000043790BB1012BF9D1C368643B8B42F5D2C9
+:105B100080689042F2D801207047C44901220A707F
+:105B2000027972B100220A71427962B104224A718B
+:105B3000826852328A60C068C860BB49022088709F
+:105B400070470322EFE70322F1E770B5B74D044633
+:105B500000202870207988B100202871607978B100
+:105B60000420B14E6871A168F068EFF746F8A860AC
+:105B7000E0685230E8600320B07070BD0120ECE7AF
+:105B80000320EEE72DE9F04105460226EFF736FF48
+:105B9000006800B1FFDFA44C01273DB12878B8B1FF
+:105BA000012805D0022811D0032814D027710DE058
+:105BB0006868C82808D30421F0F75BF820B168684A
+:105BC000FFF773FF012603E0002601E000F014F95F
+:105BD0003046BDE8F08120780028F7D16868FFF7EB
+:105BE00072FF0028E2D06868017879B1A0780428B3
+:105BF00000D0FFDF01216868FFF7A7FF8B49E0783D
+:105C000000F003F90028E1D1FFDFDFE7FFF785FFB0
+:105C10006770DBE72DE9F041834C0F46E17888425D
+:105C200000D0FFDF00250126082F7DD2DFE807F036
+:105C3000040B28283D434F57A0780328C9D00228D9
+:105C4000C7D0FFDFC5E7A078032802D0022800D024
+:105C5000FFDF0420A07025712078B8BB0020FFF77B
+:105C600024FF72480178012906D08068E06000F0C6
+:105C7000EDF82061002023E0E078EFF7F6FBF5E790
+:105C8000A078032802D0022800D0FFDF207880BB54
+:105C9000022F08D05FF00500F0F707FBA07803287B
+:105CA00040D0A57095E70420F6E7A078042800D03E
+:105CB000FFDF022004E0A078042800D0FFDF0120ED
+:105CC000A1688847FFF75EFF054633E003E0A07850
+:105CD000042800D0FFDFBDE8F04100F08DB8A078C7
+:105CE000042804D0617809B1022800D0FFDF2078B1
+:105CF00018B1BDE8F04100F08AB8207920B1062043
+:105D0000F0F7D3FA25710DE0607840B14749E078AB
+:105D100000F07BF800B9FFDF65705AE704E0072068
+:105D2000F0F7C3FAA67054E7FFDF52E73DB1012D4B
+:105D300003D0FFDF022DF9D14BE70420C0E7032099
+:105D4000BEE770B5050004D0374CA078052806D111
+:105D500001E0102070BD0820F0F7BDFA08B1112055
+:105D600070BD3548EFF7E8F9E070202806D0012132
+:105D7000F0F79AF80020A560A07070BD032070BDF8
+:105D8000294810B5017809B1112010BD8178052985
+:105D900006D0012906D029B101210170002010BDD3
+:105DA0000F2010BD00F033F8F8E770B51E4C054623
+:105DB000A07808B1012809D155B12846FFF783FE24
+:105DC00040B1287840B1A078012809D00F2070BDDB
+:105DD000102070BD072070BD2846FFF79EFE03E02F
+:105DE00000212846FFF7B1FE1049E07800F00DF8D9
+:105DF00000B9FFDF002070BD0B4810B5006900F04E
+:105E00001DF8BDE81040EFF71CB9EFF733BC0648AA
+:105E100010B5C078EFF7EBF900B9FFDF0820F0F715
+:105E200044FABDE8104039E6E0010020B413002038
+:105E30003D860100FF1FA107155C02000C490A689E
+:105E400048F202139A4302430A607047084A1168F5
+:105E500048F2021301EA03009943116070470246B9
+:105E6000044B10201344FC2B01D811600020704714
+:105E7000C80602400018FEBF01B41EB400B5F0F71A
+:105E80002DFC01B40198864601BC01B01EBD000086
+:105E90008269034981614FF001001044704700009E
+:105EA000795E0200FEDF18490978F9B904207146CD
+:105EB00008421BD10699154A914217DC069902291E
+:105EC00014DB02394878DF2810D10878FE2807D083
+:105ED000FF280BD14FF001004FF000020C4B184788
+:105EE00041F201000099019A094B1847094B002B18
+:105EF00002D01B68DB6818474FF0FF3071464FF047
+:105F00000002034B1847000028ED00E0007002007B
+:105F10008D4C020004000020174818497047FFF715
+:105F2000FBFFDBF74BF900BD1548164909688842AD
+:105F300003D1154A13605B68184700BD20BFFDE719
+:105F40000F4810490968884210D1104B18684FF06B
+:105F5000FF318842F2D080F308884FF02021884238
+:105F600004DD0B48026803210A43026009488047A8
+:105F700009488047FFDF0000C8130020C813002035
+:105F8000001000000000002004000020007002004B
+:105F900014090040912F0000295F0200F0B4404630
+:105FA000494652465B460FB402A0013001B506488F
+:105FB000004700BF01BC86460FBC8046894692461A
+:105FC0009B46F0BC70470000091100000420714698
+:105FD000084202D0EFF3098101E0EFF308818869FC
+:105FE00002380078102813DB20280FDB2C280BDB6D
+:105FF0000A4A12680A4B9A4203D1602804DB094A14
+:106000001047022008607047074A1047074A1047A8
+:10601000074A12682C32126810470000580000200E
+:10602000BEBAFECA99130000114402002B4E0200B2
+:10603000040000200D4B0E4908470E4B0C49084741
+:106040000D4B0B4908470D4B094908470C4B0849B4
+:1060500008470C4B064908470B4B054908470B4BB3
+:10606000034908470A4B02490847000031BF0000B6
+:1060700069C10000512D0000CB2B0000592B0000FE
+:10608000D92D0000B513000017290000552F00007E
+:10609000D12F000000210160818070470021016044
+:1060A0004160017270470A6802600B7903717047A2
+:1060B000B99700005F990000C19A0000259B00007D
+:1060C0005F9B0000939B0000CD9B0000FD9B0000A8
+:1060D000919C0000AD980000E59A0000331200008A
+:1060E000FD43000049440000AF4400003B45000070
+:1060F0006146000037470000694700004148000042
+:10610000DB4800002F490000154A0000354A000016
+:10611000AD160000D1160000F11500004D1600006C
+:10612000031700009717000023610000E3620000DE
+:10613000C9660000E36700006B680000E9680000C2
+:106140004D690000716A0000416B0000AD6B0000FA
+:10615000574A00005D4A0000674A0000CF4A00002D
+:10616000FB4A0000B74C0000E14C0000194D000054
+:10617000834D00006D4E0000834E00006D44000012
+:10618000974E0000B94E0000FF4E00003312000091
+:106190003312000033120000331200009F2500006C
+:1061A00025260000412600005D260000EB270000A8
+:1061B0008726000091260000D3260000F526000067
+:1061C000D127000013280000331200003312000012
+:1061D000DF840000FF840000098500004385000083
+:1061E0007185000061860000EF86000003870000D3
+:1061F00051870000678800000D8A0000358B000081
+:10620000617400004D8B0000331200003312000057
+:10621000DBB700003DB9000097B9000011BA0000DB
+:10622000BDBA0000010000000000000010011001D4
+:106230003A0200001A02000007000000FFFFFFFF03
+:106240000000FFFFE3B300002B3D000043210000EE
+:10625000AB7400004990000000000000F9920000BB
+:10626000D5920000E792000000000200000000004C
+:10627000000200000000000000010000000000001B
+:106280008B8200006B820000D98200002125000073
+:10629000E324000003250000CBAA0000F7AA0000B9
+:1062A000FFAC00001D5A0000F98200000000000051
+:1062B000298300006F25000000000000000000009E
+:1062C00000000000E1AB000000000000B15A000037
+:1062D0000300000001555555D6BE898E00006406A6
+:1062E000640C641200000803AC055008000054045C
+:1062F0004408340CD5FD000069FF0000A5FB000038
+:10630000D1FD0000419901009D0401000000000042
+:10631000900A0000900A00009B5700009B57000065
+:10632000D743000043B200002F7700005320000045
+:106330007D3B0200AFAD0100DD570000DD570000DE
+:10634000FB430000D5B20000B7770000C720000073
+:10635000AB3B0200C5AD0100700170014000380088
+:106360005C0024006801200200000300656C746278
+:10637000000000000000000000000000000000001D
+:106380008700000000000000000000000000000086
+:10639000BE83605ADB0B376038A5F5AA9183886C01
+:1063A000010000002B370100FD4501000000000145
+:1063B00002060304050000000700000000000000C2
+:1063C000060000000A000000320000007300000018
+:1063D000B4000000F401FA00960064004B003200A3
+:1063E0001E0014000A000500020001000049000020
+:1063F00000000000C9C0010087C2010015C20100F1
+:10640000DDC001000000000015C50100AAAED7AB39
+:10641000154120100C0802170D01010209090101A4
+:106420000602091818030101090903030500000009
+:10643000555555252627D6BE898E0000EBFB010059
+:10644000C3F7010009FB0100FFF201007B230200FA
+:1064500077FC0100F401FA00960064004B00320062
+:106460001E0014000A00050002000100254900007A
+:1064700000000000ED4A0200054B02001D4B020027
+:10648000354B0200654B02008D4B0200B74B0200FA
+:10649000EB4B020037480200734702005D440200E4
+:1064A0005F5E0200496401005964010085640100D7
+:1064B000576501005F65010071650100EB4802004E
+:1064C00005490200D9480200E348020011490200D0
+:1064D00047490200674902008549020093490200CA
+:1064E000A1490200B1490200C9490200E149020084
+:1064F000F74902000D4A020000000000CFBC000076
+:1065000025BD00003BBD0000495A0200894402003D
+:1065100055450200435D0200815D0200AB5D020053
+:106520004D62010099670100234A0200494A0200B6
+:106530006D4A0200934A02001C05004020050040FD
+:10654000001002006465020008000020EC01000059
+:106550004411000098650200F4010020D4110000ED
+:10656000A011000001141348140244200B200C0653
+:10657000481A010222902720FB349B5F8012800280
+:106580001E1013770B1B2034041ABA04019C091641
+:08659000C7327F0B744411BCFB
+:00000001FF
diff --git a/ports/nrf/boards/TG-Watch02A/mpconfigboard.mk b/ports/nrf/boards/TG-Watch02A/mpconfigboard.mk
index c75c6dd39..08915a19b 100644
--- a/ports/nrf/boards/TG-Watch02A/mpconfigboard.mk
+++ b/ports/nrf/boards/TG-Watch02A/mpconfigboard.mk
@@ -1,6 +1,5 @@
USB_VID = 0x239A
USB_PID = 0x802A
-
USB_PRODUCT = "TG-Watch02A"
USB_MANUFACTURER = "TG-Tech"
@@ -9,3 +8,12 @@ MCU_CHIP = nrf52840
QSPI_FLASH_FILESYSTEM = 1
EXTERNAL_FLASH_DEVICE_COUNT = 2
EXTERNAL_FLASH_DEVICES = "GD25Q16C, W25Q128JV_SQ"
+
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LSM6DS
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_FocalTouch
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DS3231
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DRV2605
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BLE
+FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BLE_Apple_Notification_Center
diff --git a/ports/nrf/boards/clue_nrf52840_express/board.c b/ports/nrf/boards/clue_nrf52840_express/board.c
index 2370a0aa1..45452a35e 100644
--- a/ports/nrf/boards/clue_nrf52840_express/board.c
+++ b/ports/nrf/boards/clue_nrf52840_express/board.c
@@ -31,7 +31,6 @@
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/nrf/boards/ohs2020_badge/board.c b/ports/nrf/boards/ohs2020_badge/board.c
index bbb20cc6e..9fcf9d2bf 100644
--- a/ports/nrf/boards/ohs2020_badge/board.c
+++ b/ports/nrf/boards/ohs2020_badge/board.c
@@ -31,7 +31,6 @@
#include "shared-bindings/displayio/FourWire.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/displayio/mipi_constants.h"
-#include "tick.h"
displayio_fourwire_obj_t board_display_obj;
diff --git a/ports/cxd56/tick.h b/ports/nrf/boards/pca10100/board.c
index d641d9cd4..f891f54a1 100644
--- a/ports/cxd56/tick.h
+++ b/ports/nrf/boards/pca10100/board.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright 2019 Sony Semiconductor Solutions Corporation
+ * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,9 +24,15 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_CXD56_TICK_H
-#define MICROPY_INCLUDED_CXD56_TICK_H
+#include "boards/board.h"
-#include "py/mpconfig.h"
+void board_init(void) {
+}
-#endif // MICROPY_INCLUDED_CXD56_TICK_H
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
+
+}
diff --git a/ports/atmel-samd/common-hal/time/__init__.c b/ports/nrf/boards/pca10100/mpconfigboard.h
index 652e455fc..c645b778b 100644
--- a/ports/atmel-samd/common-hal/time/__init__.c
+++ b/ports/nrf/boards/pca10100/mpconfigboard.h
@@ -3,7 +3,8 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2016 Glenn Ruben Bakke
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,25 +25,24 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
+#include "nrfx/hal/nrf_gpio.h"
-#include "shared-bindings/time/__init__.h"
+#define MICROPY_HW_BOARD_NAME "PCA10100 nRF52833 Dongle"
+#define MICROPY_HW_MCU_NAME "nRF52833"
-#include "supervisor/shared/tick.h"
-#include "tick.h"
+#define MICROPY_HW_LED_STATUS (&pin_P0_13)
+#define MICROPY_HW_LED_TX (&pin_P0_14)
+#define MICROPY_HW_LED_RX (&pin_P0_15)
-inline uint64_t common_hal_time_monotonic(void) {
- return supervisor_ticks_ms64();
-}
+#define CIRCUITPY_INTERNAL_NVM_SIZE 0
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (60*1024)
-uint64_t common_hal_time_monotonic_ns(void) {
- uint64_t ms;
- uint32_t us_until_ms;
- current_tick(&ms, &us_until_ms);
- // us counts down.
- return 1000 * (ms * 1000 + (1000 - us_until_ms));
-}
+#define CIRCUITPY_BLE_CONFIG_SIZE (12*1024)
-void common_hal_time_delay_ms(uint32_t delay) {
- mp_hal_delay_ms(delay);
-}
+// Reduce nRF SoftRadio memory usage
+#define BLEIO_VS_UUID_COUNT 10
+#define BLEIO_HVN_TX_QUEUE_SIZE 2
+#define BLEIO_CENTRAL_ROLE_COUNT 2
+#define BLEIO_PERIPH_ROLE_COUNT 2
+#define BLEIO_TOTAL_CONNECTION_COUNT 2
+#define BLEIO_ATTR_TAB_SIZE (BLE_GATTS_ATTR_TAB_SIZE_DEFAULT * 2)
diff --git a/ports/nrf/boards/pca10100/mpconfigboard.mk b/ports/nrf/boards/pca10100/mpconfigboard.mk
new file mode 100644
index 000000000..1206c8fe5
--- /dev/null
+++ b/ports/nrf/boards/pca10100/mpconfigboard.mk
@@ -0,0 +1,25 @@
+USB_VID = 0x239A
+USB_PID = 0x802A
+USB_PRODUCT = "PCA10100"
+USB_MANUFACTURER = "Nordic Semiconductor"
+
+MCU_CHIP = nrf52833
+
+INTERNAL_FLASH_FILESYSTEM = 1
+
+CIRCUITPY_AUDIOMP3 = 0
+CIRCUITPY_BUSIO = 1
+CIRCUITPY_DISPLAYIO = 0
+CIRCUITPY_FRAMEBUFFERIO = 0
+CIRCUITPY_NEOPIXEL_WRITE = 0
+CIRCUITPY_NVM = 0
+CIRCUITPY_PIXELBUF = 0
+CIRCUITPY_RGBMATRIX = 0
+CIRCUITPY_ROTARYIO = 0
+CIRCUITPY_RTC = 1
+CIRCUITPY_TOUCHIO = 0
+CIRCUITPY_ULAB = 0
+
+# These defines must be overridden before mpconfigboard.h is included, which is
+# why they are passed on the command line.
+CFLAGS += -DSPIM3_BUFFER_SIZE=0 -DSOFTDEVICE_RAM_SIZE='(32*1024)'
diff --git a/ports/nrf/boards/pca10100/pins.c b/ports/nrf/boards/pca10100/pins.c
new file mode 100644
index 000000000..dd030bae9
--- /dev/null
+++ b/ports/nrf/boards/pca10100/pins.c
@@ -0,0 +1,54 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_P1_01) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_P1_02) },
+ { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P1_03) },
+ { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P1_04) },
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_P1_05) },
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_06) },
+ { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P1_07) },
+ { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_P1_08) },
+ { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_P0_17) },
+ { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_19) },
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_20) },
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_21) },
+ { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_22) },
+ { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P0_23) },
+ { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_P0_00) },
+ { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_P0_01) },
+ { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_P0_05) },
+ { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_P0_07) },
+ { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_P0_08) },
+ { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_P0_10) },
+ { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_P0_11) },
+ { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_P0_12) },
+ { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_P0_13) },
+ { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_P0_15) },
+ { MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_P0_16) },
+ { MP_ROM_QSTR(MP_QSTR_D28), MP_ROM_PTR(&pin_P0_18) },
+ { MP_ROM_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_P0_24) },
+ { MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_P0_25) },
+ { MP_ROM_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_P1_00) },
+ { MP_ROM_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_P1_09) },
+
+ { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_13) },
+ { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P0_14) },
+ { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_P0_15) },
+ { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_P0_16) },
+
+ { MP_ROM_QSTR(MP_QSTR_BUTTON1_DEFAULT), MP_ROM_PTR(&pin_P0_11) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON1_OPTIONAL), MP_ROM_PTR(&pin_P1_07) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON2_DEFAULT), MP_ROM_PTR(&pin_P0_12) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON2_OPTIONAL), MP_ROM_PTR(&pin_P1_08) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON3), MP_ROM_PTR(&pin_P0_24) },
+ { MP_ROM_QSTR(MP_QSTR_BUTTON4), MP_ROM_PTR(&pin_P0_25) },
+};
+
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/cxd56/tick.c b/ports/nrf/boards/simmel/board.c
index 671b82b74..f891f54a1 100644
--- a/ports/cxd56/tick.c
+++ b/ports/nrf/boards/simmel/board.c
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright 2019 Sony Semiconductor Solutions Corporation
+ * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,13 +24,15 @@
* THE SOFTWARE.
*/
-#include "tick.h"
+#include "boards/board.h"
-#include "supervisor/shared/autoreload.h"
-#include "supervisor/shared/tick.h"
+void board_init(void) {
+}
+
+bool board_requests_safe_mode(void) {
+ return false;
+}
+
+void reset_board(void) {
-void board_timerhook(void)
-{
- // Do things common to all ports when the tick occurs
- supervisor_tick();
}
diff --git a/ports/mimxrt10xx/common-hal/time/__init__.c b/ports/nrf/boards/simmel/mpconfigboard.h
index 524e31d1a..4c73e86eb 100644
--- a/ports/mimxrt10xx/common-hal/time/__init__.c
+++ b/ports/nrf/boards/simmel/mpconfigboard.h
@@ -3,7 +3,8 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2016 Glenn Ruben Bakke
+ * Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,26 +25,30 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
+#include "nrfx/hal/nrf_gpio.h"
-#include "shared-bindings/time/__init__.h"
+#define MICROPY_HW_BOARD_NAME "Simmel"
+#define MICROPY_HW_MCU_NAME "nRF52833"
-#include "supervisor/shared/tick.h"
+#define MICROPY_HW_LED_STATUS (&pin_P0_06)
-#include "tick.h"
+#if SPI_FLASH_FILESYSTEM
+#define SPI_FLASH_MOSI_PIN &pin_P0_09
+#define SPI_FLASH_MISO_PIN &pin_P1_04
+#define SPI_FLASH_SCK_PIN &pin_P0_10
+#define SPI_FLASH_CS_PIN &pin_P1_06
+#endif
-inline uint64_t common_hal_time_monotonic(void) {
- return supervisor_ticks_ms64();
-}
+#define CIRCUITPY_INTERNAL_NVM_SIZE 0
+#define CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE (84*1024)
-uint64_t common_hal_time_monotonic_ns(void) {
- uint64_t ms;
- uint32_t us_until_ms;
- current_tick(&ms, &us_until_ms);
- // us counts down.
- return 1000 * (ms * 1000 + (1000 - us_until_ms));
-}
+#define BOOTLOADER_SIZE (0x4000) // 12 kiB
+#define CIRCUITPY_BLE_CONFIG_SIZE (12*1024)
-void common_hal_time_delay_ms(uint32_t delay) {
- mp_hal_delay_ms(delay);
-}
+// Reduce nRF SoftRadio memory usage
+#define BLEIO_VS_UUID_COUNT 10
+#define BLEIO_HVN_TX_QUEUE_SIZE 2
+#define BLEIO_CENTRAL_ROLE_COUNT 2
+#define BLEIO_PERIPH_ROLE_COUNT 2
+#define BLEIO_TOTAL_CONNECTION_COUNT 2
+#define BLEIO_ATTR_TAB_SIZE (BLE_GATTS_ATTR_TAB_SIZE_DEFAULT * 2)
diff --git a/ports/nrf/boards/simmel/mpconfigboard.mk b/ports/nrf/boards/simmel/mpconfigboard.mk
new file mode 100644
index 000000000..e71ada1de
--- /dev/null
+++ b/ports/nrf/boards/simmel/mpconfigboard.mk
@@ -0,0 +1,32 @@
+USB_VID = 0x1209
+USB_PID = 0xc051
+USB_PRODUCT = "Simmel"
+USB_MANUFACTURER = "Betrusted"
+
+MCU_CHIP = nrf52833
+
+# SPI_FLASH_FILESYSTEM = 1
+# EXTERNAL_FLASH_DEVICE_COUNT = 1
+# EXTERNAL_FLASH_DEVICES = "MX25R1635F"
+
+INTERNAL_FLASH_FILESYSTEM = 1
+
+CIRCUITPY_AUDIOMP3 = 0
+CIRCUITPY_BUSIO = 1
+CIRCUITPY_DISPLAYIO = 0
+CIRCUITPY_FRAMEBUFFERIO = 0
+CIRCUITPY_NEOPIXEL_WRITE = 0
+CIRCUITPY_NVM = 0
+CIRCUITPY_PIXELBUF = 0
+CIRCUITPY_RGBMATRIX = 0
+CIRCUITPY_ROTARYIO = 0
+CIRCUITPY_RTC = 1
+CIRCUITPY_TOUCHIO = 0
+CIRCUITPY_ULAB = 0
+
+# Enable micropython.native
+#CIRCUITPY_ENABLE_MPY_NATIVE = 1
+
+# These defines must be overridden before mpconfigboard.h is included, which is
+# why they are passed on the command line.
+CFLAGS += -DSPIM3_BUFFER_SIZE=0 -DSOFTDEVICE_RAM_SIZE='(32*1024)'
diff --git a/ports/nrf/boards/simmel/pins.c b/ports/nrf/boards/simmel/pins.c
new file mode 100644
index 000000000..c946493d4
--- /dev/null
+++ b/ports/nrf/boards/simmel/pins.c
@@ -0,0 +1,27 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_SPI_CSN), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_SPI_MISO), MP_ROM_PTR(&pin_P1_04) },
+ { MP_ROM_QSTR(MP_QSTR_SPI_MOSI), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_SPI_SCK), MP_ROM_PTR(&pin_P0_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) },
+ { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) },
+
+ { MP_ROM_QSTR(MP_QSTR_I2S_LRCK), MP_ROM_PTR(&pin_P0_08) },
+ { MP_ROM_QSTR(MP_QSTR_I2S_SDIN), MP_ROM_PTR(&pin_P1_09) },
+ { MP_ROM_QSTR(MP_QSTR_I2S_SCK), MP_ROM_PTR(&pin_P0_12) },
+
+ { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_P0_06) },
+ { MP_ROM_QSTR(MP_QSTR_CHG), MP_ROM_PTR(&pin_P0_04) },
+
+ { MP_ROM_QSTR(MP_QSTR_PWM), MP_ROM_PTR(&pin_P0_02) },
+ { MP_ROM_QSTR(MP_QSTR_PWM_N), MP_ROM_PTR(&pin_P0_19) },
+
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
+ { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+};
+
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/nrf/boards/teknikio_bluebird/mpconfigboard.h b/ports/nrf/boards/teknikio_bluebird/mpconfigboard.h
index 76e772ca9..c130cd8c0 100644
--- a/ports/nrf/boards/teknikio_bluebird/mpconfigboard.h
+++ b/ports/nrf/boards/teknikio_bluebird/mpconfigboard.h
@@ -33,7 +33,7 @@
#define MICROPY_HW_BOARD_NAME "Teknikio Bluebird"
#define MICROPY_HW_MCU_NAME "nRF52840"
-#define MICROPY_HW_NEOPIXEL (&pin_P0_26)
+#define MICROPY_HW_NEOPIXEL (&pin_P1_15)
#define DEFAULT_I2C_BUS_SCL (&pin_P0_27)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_26)
diff --git a/ports/nrf/boards/teknikio_bluebird/mpconfigboard.mk b/ports/nrf/boards/teknikio_bluebird/mpconfigboard.mk
index e178a8205..2339a950f 100644
--- a/ports/nrf/boards/teknikio_bluebird/mpconfigboard.mk
+++ b/ports/nrf/boards/teknikio_bluebird/mpconfigboard.mk
@@ -6,3 +6,9 @@ USB_MANUFACTURER = "Teknikio"
MCU_CHIP = nrf52840
INTERNAL_FLASH_FILESYSTEM = 1
+CIRCUITPY_ANALOGIO = 1
+CIRCUITPY_AUDIOCORE = 1
+CIRCUITPY_AUDIOPWMIO = 1
+CIRCUITPY_DIGITALIO = 1
+CIRCUITPY_NEOPIXEL_WRITE = 1
+CIRCUITPY_TIME = 1
diff --git a/ports/nrf/boards/teknikio_bluebird/pins.c b/ports/nrf/boards/teknikio_bluebird/pins.c
index a90dc7daa..1ff1198a1 100644
--- a/ports/nrf/boards/teknikio_bluebird/pins.c
+++ b/ports/nrf/boards/teknikio_bluebird/pins.c
@@ -47,16 +47,16 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_03) },
{ MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_P0_03) },
- { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P0_26) },
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P1_15) },
{ MP_ROM_QSTR(MP_QSTR_LIGHT), MP_ROM_PTR(&pin_P0_28) },
{ MP_ROM_QSTR(MP_QSTR_LIGHT_ENABLE), MP_ROM_PTR(&pin_P0_30) },
- { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_P1_15) },
+ { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_P1_14) },
{ MP_ROM_QSTR(MP_QSTR_ACCELEROMETER_INTERRUPT), MP_ROM_PTR(&pin_P1_10) },
{ MP_ROM_QSTR(MP_QSTR_ACCELEROMETER_SDA), MP_ROM_PTR(&pin_P1_12) },
{ MP_ROM_QSTR(MP_QSTR_ACCELEROMETER_SCL), MP_ROM_PTR(&pin_P1_11) },
};
-MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); \ No newline at end of file
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/nrf/common-hal/_bleio/Adapter.c b/ports/nrf/common-hal/_bleio/Adapter.c
index cb526a6a8..36c79e88e 100644
--- a/ports/nrf/common-hal/_bleio/Adapter.c
+++ b/ports/nrf/common-hal/_bleio/Adapter.c
@@ -36,7 +36,6 @@
#include "nrfx_power.h"
#include "nrf_nvic.h"
#include "nrf_sdm.h"
-#include "tick.h"
#include "py/gc.h"
#include "py/objstr.h"
#include "py/runtime.h"
diff --git a/ports/nrf/common-hal/_bleio/CharacteristicBuffer.c b/ports/nrf/common-hal/_bleio/CharacteristicBuffer.c
index 9f9b453de..c562d29e0 100644
--- a/ports/nrf/common-hal/_bleio/CharacteristicBuffer.c
+++ b/ports/nrf/common-hal/_bleio/CharacteristicBuffer.c
@@ -35,8 +35,6 @@
#include "py/runtime.h"
#include "py/stream.h"
-#include "tick.h"
-
#include "shared-bindings/_bleio/__init__.h"
#include "shared-bindings/_bleio/Connection.h"
#include "supervisor/shared/tick.h"
diff --git a/ports/nrf/common-hal/_bleio/PacketBuffer.c b/ports/nrf/common-hal/_bleio/PacketBuffer.c
index 6ed6d1451..6c360617f 100644
--- a/ports/nrf/common-hal/_bleio/PacketBuffer.c
+++ b/ports/nrf/common-hal/_bleio/PacketBuffer.c
@@ -35,8 +35,6 @@
#include "py/runtime.h"
#include "py/stream.h"
-#include "tick.h"
-
#include "shared-bindings/_bleio/__init__.h"
#include "shared-bindings/_bleio/Connection.h"
#include "shared-bindings/_bleio/PacketBuffer.h"
diff --git a/ports/nrf/common-hal/audiobusio/I2SOut.c b/ports/nrf/common-hal/audiobusio/I2SOut.c
index ead92b000..2fa28afac 100644
--- a/ports/nrf/common-hal/audiobusio/I2SOut.c
+++ b/ports/nrf/common-hal/audiobusio/I2SOut.c
@@ -283,6 +283,9 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t* self,
i2s_buffer_fill(self);
NRF_I2S->RXTXD.MAXCNT = self->buffer_length / 4;
+ // Turn on the interrupt to the NVIC but not within the NVIC itself. This will wake the CPU and
+ // keep it awake until it is serviced without triggering an interrupt handler.
+ NRF_I2S->INTENSET = I2S_INTENSET_TXPTRUPD_Msk;
NRF_I2S->ENABLE = I2S_ENABLE_ENABLE_Enabled;
NRF_I2S->TASKS_START = 1;
@@ -305,6 +308,7 @@ bool common_hal_audiobusio_i2sout_get_paused(audiobusio_i2sout_obj_t* self) {
void common_hal_audiobusio_i2sout_stop(audiobusio_i2sout_obj_t* self) {
NRF_I2S->TASKS_STOP = 1;
self->stopping = true;
+ NRF_I2S->INTENCLR = I2S_INTENSET_TXPTRUPD_Msk;
}
bool common_hal_audiobusio_i2sout_get_playing(audiobusio_i2sout_obj_t* self) {
@@ -316,8 +320,9 @@ bool common_hal_audiobusio_i2sout_get_playing(audiobusio_i2sout_obj_t* self) {
}
void i2s_background(void) {
- if (NRF_I2S->EVENTS_TXPTRUPD) {
+ if (NVIC_GetPendingIRQ(I2S_IRQn) && NRF_I2S->EVENTS_TXPTRUPD) {
NRF_I2S->EVENTS_TXPTRUPD = 0;
+ NVIC_ClearPendingIRQ(I2S_IRQn);
if (instance) {
i2s_buffer_fill(instance);
} else {
@@ -328,6 +333,7 @@ void i2s_background(void) {
void i2s_reset(void) {
NRF_I2S->TASKS_STOP = 1;
+ NRF_I2S->INTENCLR = I2S_INTENSET_TXPTRUPD_Msk;
NRF_I2S->ENABLE = I2S_ENABLE_ENABLE_Disabled;
NRF_I2S->PSEL.MCK = 0xFFFFFFFF;
NRF_I2S->PSEL.SCK = 0xFFFFFFFF;
diff --git a/ports/nrf/common-hal/audiopwmio/PWMAudioOut.c b/ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
index 7b99901d5..89966b7da 100644
--- a/ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
+++ b/ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
@@ -72,6 +72,8 @@ STATIC void activate_audiopwmout_obj(audiopwmio_pwmaudioout_obj_t *self) {
}
}
STATIC void deactivate_audiopwmout_obj(audiopwmio_pwmaudioout_obj_t *self) {
+ // Turn off the interrupts to the CPU.
+ self->pwm->INTENCLR = PWM_INTENSET_SEQSTARTED0_Msk | PWM_INTENSET_SEQSTARTED1_Msk;
for (size_t i=0; i < MP_ARRAY_SIZE(active_audio); i++) {
if (active_audio[i] == self) {
active_audio[i] = NULL;
@@ -86,7 +88,6 @@ void audiopwmout_reset() {
}
STATIC void fill_buffers(audiopwmio_pwmaudioout_obj_t *self, int buf) {
- self->pwm->EVENTS_SEQSTARTED[1-buf] = 0;
uint16_t *dev_buffer = self->buffers[buf];
uint8_t *buffer;
uint32_t buffer_length;
@@ -143,12 +144,27 @@ STATIC void audiopwmout_background_obj(audiopwmio_pwmaudioout_obj_t *self) {
if (stopped)
self->pwm->TASKS_STOP = 1;
} else if (!self->paused && !self->single_buffer) {
- if (self->pwm->EVENTS_SEQSTARTED[0]) fill_buffers(self, 1);
- if (self->pwm->EVENTS_SEQSTARTED[1]) fill_buffers(self, 0);
+ if (self->pwm->EVENTS_SEQSTARTED[0]) {
+ fill_buffers(self, 1);
+ self->pwm->EVENTS_SEQSTARTED[0] = 0;
+ }
+ if (self->pwm->EVENTS_SEQSTARTED[1]) {
+ fill_buffers(self, 0);
+ self->pwm->EVENTS_SEQSTARTED[1] = 0;
+ }
+ NVIC_ClearPendingIRQ(self->pwm_irq);
}
}
void audiopwmout_background() {
+ // Check the NVIC first because it is part of the CPU and fast to read.
+ if (!NVIC_GetPendingIRQ(PWM0_IRQn) &&
+ !NVIC_GetPendingIRQ(PWM1_IRQn) &&
+ !NVIC_GetPendingIRQ(PWM2_IRQn) &&
+ !NVIC_GetPendingIRQ(PWM3_IRQn)) {
+ return;
+ }
+ // Check our objects because the PWM could be active for some other reason.
for (size_t i=0; i < MP_ARRAY_SIZE(active_audio); i++) {
if (!active_audio[i]) continue;
audiopwmout_background_obj(active_audio[i]);
@@ -158,7 +174,8 @@ void audiopwmout_background() {
// Caller validates that pins are free.
void common_hal_audiopwmio_pwmaudioout_construct(audiopwmio_pwmaudioout_obj_t* self,
const mcu_pin_obj_t* left_channel, const mcu_pin_obj_t* right_channel, uint16_t quiescent_value) {
- self->pwm = pwmout_allocate(256, PWM_PRESCALER_PRESCALER_DIV_1, true, NULL, NULL);
+ self->pwm = pwmout_allocate(256, PWM_PRESCALER_PRESCALER_DIV_1, true, NULL, NULL,
+ &self->pwm_irq);
if (!self->pwm) {
mp_raise_RuntimeError(translate("All timers in use"));
}
@@ -260,6 +277,9 @@ void common_hal_audiopwmio_pwmaudioout_play(audiopwmio_pwmaudioout_obj_t* self,
self->pwm->EVENTS_SEQEND[0] = 0;
self->pwm->EVENTS_SEQEND[1] = 0;
self->pwm->EVENTS_STOPPED = 0;
+ // Enable the SEQSTARTED interrupts so that they wake the CPU and keep it awake until serviced.
+ // We don't enable them in the NVIC because we don't actually want an interrupt routine to run.
+ self->pwm->INTENSET = PWM_INTENSET_SEQSTARTED0_Msk | PWM_INTENSET_SEQSTARTED1_Msk;
self->pwm->TASKS_SEQSTART[0] = 1;
self->playing = true;
self->paused = false;
diff --git a/ports/nrf/common-hal/audiopwmio/PWMAudioOut.h b/ports/nrf/common-hal/audiopwmio/PWMAudioOut.h
index ed00324c4..fdd6289a4 100644
--- a/ports/nrf/common-hal/audiopwmio/PWMAudioOut.h
+++ b/ports/nrf/common-hal/audiopwmio/PWMAudioOut.h
@@ -44,6 +44,8 @@ typedef struct {
uint8_t sample_channel_count;
uint8_t bytes_per_sample;
+ IRQn_Type pwm_irq;
+
bool playing;
bool stopping;
bool paused;
diff --git a/ports/nrf/common-hal/busio/UART.c b/ports/nrf/common-hal/busio/UART.c
index 4a3e74c49..85626548f 100644
--- a/ports/nrf/common-hal/busio/UART.c
+++ b/ports/nrf/common-hal/busio/UART.c
@@ -35,7 +35,6 @@
#include "py/stream.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
#include "nrfx_uarte.h"
#include <string.h>
diff --git a/ports/nrf/common-hal/displayio/ParallelBus.c b/ports/nrf/common-hal/displayio/ParallelBus.c
index be4b28a6e..f13e03163 100644
--- a/ports/nrf/common-hal/displayio/ParallelBus.c
+++ b/ports/nrf/common-hal/displayio/ParallelBus.c
@@ -33,8 +33,6 @@
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "tick.h"
-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c
index 0a4036aae..8062937f4 100644
--- a/ports/nrf/common-hal/neopixel_write/__init__.c
+++ b/ports/nrf/common-hal/neopixel_write/__init__.c
@@ -27,10 +27,9 @@
#include "py/mphal.h"
#include "py/mpstate.h"
#include "shared-bindings/neopixel_write/__init__.h"
+#include "supervisor/port.h"
#include "nrf_pwm.h"
-#include "tick.h"
-
// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.cpp
// [[[Begin of the Neopixel NRF52 EasyDMA implementation
// by the Hackerspace San Salvador]]]
@@ -105,8 +104,7 @@ void neopixel_write_reset(void) {
pixels_pattern_heap_size = 0;
}
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t numBytes) {
// To support both the SoftDevice + Neopixels we use the EasyDMA
@@ -175,8 +173,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
}
- // Wait to make sure we don't append onto the last transmission.
- wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
// Use the identified device to choose the implementation
// If a PWM device is available and we have a buffer, use DMA.
@@ -323,11 +322,5 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
// Update the next start.
- current_tick(&next_start_tick_ms, &next_start_tick_us);
- if (next_start_tick_us < 100) {
- next_start_tick_ms += 1;
- next_start_tick_us = 100 - next_start_tick_us;
- } else {
- next_start_tick_us -= 100;
- }
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
}
diff --git a/ports/nrf/common-hal/pulseio/PWMOut.c b/ports/nrf/common-hal/pulseio/PWMOut.c
index 6921091f8..9d42ccca0 100644
--- a/ports/nrf/common-hal/pulseio/PWMOut.c
+++ b/ports/nrf/common-hal/pulseio/PWMOut.c
@@ -139,11 +139,15 @@ bool convert_frequency(uint32_t frequency, uint16_t *countertop, nrf_pwm_clk_t *
return false;
}
+// We store these in an array because we cannot compute them.
+static IRQn_Type pwm_irqs[4] = {PWM0_IRQn, PWM1_IRQn, PWM2_IRQn, PWM3_IRQn};
+
NRF_PWM_Type *pwmout_allocate(uint16_t countertop, nrf_pwm_clk_t base_clock,
- bool variable_frequency, int8_t *channel_out, bool *pwm_already_in_use_out) {
+ bool variable_frequency, int8_t *channel_out, bool *pwm_already_in_use_out,
+ IRQn_Type* irq) {
for (size_t pwm_index = 0; pwm_index < MP_ARRAY_SIZE(pwms); pwm_index++) {
NRF_PWM_Type *pwm = pwms[pwm_index];
- bool pwm_already_in_use = pwm->ENABLE & SPIM_ENABLE_ENABLE_Msk;
+ bool pwm_already_in_use = pwm->ENABLE & PWM_ENABLE_ENABLE_Msk;
if (pwm_already_in_use) {
if (variable_frequency) {
// Variable frequency requires exclusive use of a PWM, so try the next one.
@@ -156,20 +160,30 @@ NRF_PWM_Type *pwmout_allocate(uint16_t countertop, nrf_pwm_clk_t base_clock,
for (size_t chan = 0; chan < CHANNELS_PER_PWM; chan++) {
if (pwm->PSEL.OUT[chan] == 0xFFFFFFFF) {
// Channel is free.
- if(channel_out)
+ if (channel_out) {
*channel_out = chan;
- if(pwm_already_in_use_out)
+ }
+ if (pwm_already_in_use_out) {
*pwm_already_in_use_out = pwm_already_in_use;
+ }
+ if (irq) {
+ *irq = pwm_irqs[pwm_index];
+ }
return pwm;
}
}
}
} else {
// PWM not yet in use, so we can start to use it. Use channel 0.
- if(channel_out)
+ if (channel_out) {
*channel_out = 0;
- if(pwm_already_in_use_out)
+ }
+ if (pwm_already_in_use_out) {
*pwm_already_in_use_out = pwm_already_in_use;
+ }
+ if (irq) {
+ *irq = pwm_irqs[pwm_index];
+ }
return pwm;
}
}
@@ -208,7 +222,7 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
int8_t channel;
bool pwm_already_in_use;
self->pwm = pwmout_allocate(countertop, base_clock, variable_frequency,
- &channel, &pwm_already_in_use);
+ &channel, &pwm_already_in_use, NULL);
if (self->pwm == NULL) {
return PWMOUT_ALL_TIMERS_IN_USE;
diff --git a/ports/nrf/common-hal/pulseio/PWMOut.h b/ports/nrf/common-hal/pulseio/PWMOut.h
index b6798cb68..a0c2d8747 100644
--- a/ports/nrf/common-hal/pulseio/PWMOut.h
+++ b/ports/nrf/common-hal/pulseio/PWMOut.h
@@ -42,7 +42,8 @@ typedef struct {
void pwmout_reset(void);
NRF_PWM_Type *pwmout_allocate(uint16_t countertop, nrf_pwm_clk_t base_clock,
- bool variable_frequency, int8_t *channel_out, bool *pwm_already_in_use_out);
+ bool variable_frequency, int8_t *channel_out, bool *pwm_already_in_use_out,
+ IRQn_Type *irq);
void pwmout_free_channel(NRF_PWM_Type *pwm, int8_t channel);
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_PULSEIO_PWMOUT_H
diff --git a/ports/nrf/common-hal/pulseio/PulseIn.c b/ports/nrf/common-hal/pulseio/PulseIn.c
index b47cc6273..be2903e44 100644
--- a/ports/nrf/common-hal/pulseio/PulseIn.c
+++ b/ports/nrf/common-hal/pulseio/PulseIn.c
@@ -29,6 +29,7 @@
#include <stdint.h>
#include <string.h>
+#include "nrf/timers.h"
#include "py/mpconfig.h"
#include "py/gc.h"
#include "py/runtime.h"
@@ -36,12 +37,25 @@
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/pulseio/PulseIn.h"
-#include "tick.h"
#include "nrfx_gpiote.h"
// obj array to map pin -> self since nrfx hide the mapping
static pulseio_pulsein_obj_t* _objs[GPIOTE_CH_NUM];
+// A single timer is shared amongst all PulseIn objects as a common high speed clock reference.
+static uint8_t refcount = 0;
+static nrfx_timer_t *timer = NULL;
+
+static uint32_t overflow_count = 0;
+
+static void timer_overflow_event_handler(nrf_timer_event_t event_type, void *p_context) {
+ if (event_type != NRF_TIMER_EVENT_COMPARE0) {
+ // Other event.
+ return;
+ }
+ overflow_count++;
+}
+
// return index of the object in array
static int _find_pulsein_obj(pulseio_pulsein_obj_t* obj) {
for(size_t i = 0; i < NRFX_ARRAY_SIZE(_objs); i++ ) {
@@ -55,12 +69,8 @@ static int _find_pulsein_obj(pulseio_pulsein_obj_t* obj) {
static void _pulsein_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
// Grab the current time first.
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
-
- // current_tick gives us the remaining us until the next tick but we want the number since the last ms.
- current_us = 1000 - current_us;
+ uint32_t current_overflow = overflow_count;
+ uint32_t current_count = nrfx_timer_capture(timer, 1);
pulseio_pulsein_obj_t* self = NULL;
for(size_t i = 0; i < NRFX_ARRAY_SIZE(_objs); i++ ) {
@@ -78,18 +88,9 @@ static void _pulsein_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action
self->first_edge = false;
}
}else {
- uint32_t ms_diff = current_ms - self->last_ms;
- uint16_t us_diff = current_us - self->last_us;
- uint32_t total_diff = us_diff;
-
- if (self->last_us > current_us) {
- total_diff = 1000 + current_us - self->last_us;
- if (ms_diff > 1) {
- total_diff += (ms_diff - 1) * 1000;
- }
- } else {
- total_diff += ms_diff * 1000;
- }
+ uint32_t total_diff = current_count + 0xffff * (current_overflow - self->last_overflow) - self->last_count;
+
+ // Cap duration at 16 bits.
uint16_t duration = 0xffff;
if (total_diff < duration) {
duration = total_diff;
@@ -104,8 +105,8 @@ static void _pulsein_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action
}
}
- self->last_ms = current_ms;
- self->last_us = current_us;
+ self->last_overflow = current_overflow;
+ self->last_count = current_count;
}
void pulsein_reset(void) {
@@ -114,6 +115,11 @@ void pulsein_reset(void) {
}
nrfx_gpiote_init(NRFX_GPIOTE_CONFIG_IRQ_PRIORITY);
+ if (timer != NULL) {
+ nrf_peripherals_free_timer(timer);
+ }
+ refcount = 0;
+
memset(_objs, 0, sizeof(_objs));
}
@@ -129,6 +135,28 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"), maxlen * sizeof(uint16_t));
}
+ if (refcount == 0) {
+ timer = nrf_peripherals_allocate_timer();
+ if (timer == NULL) {
+ mp_raise_RuntimeError(translate("All timers in use"));
+ }
+ overflow_count = 0;
+
+ nrfx_timer_config_t timer_config = {
+ // PulseIn durations are in microseconds, so this is convenient.
+ .frequency = NRF_TIMER_FREQ_1MHz,
+ .mode = NRF_TIMER_MODE_TIMER,
+ .bit_width = NRF_TIMER_BIT_WIDTH_32,
+ .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,
+ };
+
+ nrfx_timer_init(timer, &timer_config, &timer_overflow_event_handler);
+ // Interrupt on overflow so we can track when it rolls over.
+ nrfx_timer_compare(timer, NRF_TIMER_CC_CHANNEL0, 0, true);
+ nrfx_timer_resume(timer);
+ }
+ refcount++;
+
self->pin = pin->number;
self->maxlen = maxlen;
self->idle_state = idle_state;
@@ -136,8 +164,8 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
self->len = 0;
self->first_edge = true;
self->paused = false;
- self->last_us = 0;
- self->last_ms = 0;
+ self->last_overflow = 0;
+ self->last_count = 0;
claim_pin(pin);
@@ -173,6 +201,11 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
reset_pin_number(self->pin);
self->pin = NO_PIN;
+
+ refcount--;
+ if (refcount == 0) {
+ nrf_peripherals_free_timer(timer);
+ }
}
void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) {
@@ -207,8 +240,8 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, uint16_t tri
self->first_edge = true;
self->paused = false;
- self->last_ms = 0;
- self->last_us = 0;
+ self->last_overflow = 0;
+ self->last_count = 0;
nrfx_gpiote_in_event_enable(self->pin, true);
}
diff --git a/ports/nrf/common-hal/pulseio/PulseIn.h b/ports/nrf/common-hal/pulseio/PulseIn.h
index 4b2c6eee3..da5263ac9 100644
--- a/ports/nrf/common-hal/pulseio/PulseIn.h
+++ b/ports/nrf/common-hal/pulseio/PulseIn.h
@@ -44,8 +44,8 @@ typedef struct {
volatile uint16_t start;
volatile uint16_t len;
- volatile uint16_t last_us;
- volatile uint64_t last_ms;
+ volatile size_t last_overflow;
+ volatile size_t last_count;
} pulseio_pulsein_obj_t;
void pulsein_reset(void);
diff --git a/ports/nrf/common-hal/rtc/RTC.c b/ports/nrf/common-hal/rtc/RTC.c
index a8ea36688..9f56f2f0d 100644
--- a/ports/nrf/common-hal/rtc/RTC.c
+++ b/ports/nrf/common-hal/rtc/RTC.c
@@ -30,54 +30,23 @@
#include "py/runtime.h"
#include "lib/timeutils/timeutils.h"
#include "shared-bindings/rtc/__init__.h"
+#include "supervisor/port.h"
#include "supervisor/shared/translate.h"
-#include "nrfx_rtc.h"
-#include "nrf_clock.h"
-
-// We clock the RTC very slowly (8Hz) so that it won't overflow often.
-// But the counter is only 24 bits, so overflow is about every 24 days ...
-// For testing, set this to 32768 and it'll overflow every few minutes
-
-#define RTC_CLOCK_HZ (8)
-
-volatile static uint32_t rtc_offset = 0;
-
-const nrfx_rtc_t rtc_instance = NRFX_RTC_INSTANCE(2);
-
-const nrfx_rtc_config_t rtc_config = {
- .prescaler = RTC_FREQ_TO_PRESCALER(RTC_CLOCK_HZ),
- .reliable = 0,
- .tick_latency = 0,
- .interrupt_priority = 6
-};
-
-void rtc_handler(nrfx_rtc_int_type_t int_type) {
- if (int_type == NRFX_RTC_INT_OVERFLOW) {
- rtc_offset += (1L<<24) / RTC_CLOCK_HZ;
- }
-}
-
-void rtc_init(void) {
- if (!nrf_clock_lf_is_running(NRF_CLOCK)) {
- nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_LFCLKSTART);
- }
- nrfx_rtc_counter_clear(&rtc_instance);
- nrfx_rtc_init(&rtc_instance, &rtc_config, rtc_handler);
- nrfx_rtc_enable(&rtc_instance);
- nrfx_rtc_overflow_enable(&rtc_instance, 1);
-}
+// This is the time in seconds since 2000 that the RTC was started.
+static uint32_t rtc_offset = 0;
void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
- uint32_t t = rtc_offset + (nrfx_rtc_counter_get(&rtc_instance) / RTC_CLOCK_HZ );
- timeutils_seconds_since_2000_to_struct_time(t, tm);
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
+ timeutils_seconds_since_2000_to_struct_time(rtc_offset + ticks_s, tm);
}
void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
- rtc_offset = timeutils_seconds_since_2000(
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
+ uint32_t epoch_s = timeutils_seconds_since_2000(
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec
);
- nrfx_rtc_counter_clear(&rtc_instance);
+ rtc_offset = epoch_s - ticks_s;
}
int common_hal_rtc_get_calibration(void) {
diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c
deleted file mode 100644
index 3885d5a82..000000000
--- a/ports/nrf/mphalport.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2019 Dan Halbert for Adafruit Industries
- * Copyright (c) 2018 Artur Pacholec
- * Copyright (c) 2015 Glenn Ruben Bakke
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include <string.h>
-
-#include "py/mphal.h"
-#include "py/mpstate.h"
-#include "py/gc.h"
-#include "supervisor/shared/tick.h"
-
-/*------------------------------------------------------------------*/
-/* delay
- *------------------------------------------------------------------*/
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- RUN_BACKGROUND_TASKS;
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
diff --git a/ports/nrf/supervisor/internal_flash.c b/ports/nrf/supervisor/internal_flash.c
index a44f047ff..737bab203 100644
--- a/ports/nrf/supervisor/internal_flash.c
+++ b/ports/nrf/supervisor/internal_flash.c
@@ -67,7 +67,7 @@ uint32_t supervisor_flash_get_block_count(void) {
return CIRCUITPY_INTERNAL_FLASH_FILESYSTEM_SIZE / FILESYSTEM_BLOCK_SIZE ;
}
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
if (_flash_page_addr == NO_CACHE) return;
// Skip if data is the same
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index 3f16e090f..539a9cf90 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -28,8 +28,10 @@
#include "supervisor/port.h"
#include "boards/board.h"
+#include "nrfx/hal/nrf_clock.h"
#include "nrfx/hal/nrf_power.h"
#include "nrfx/drivers/include/nrfx_power.h"
+#include "nrfx/drivers/include/nrfx_rtc.h"
#include "nrf/cache.h"
#include "nrf/clocks.h"
@@ -48,7 +50,6 @@
#include "common-hal/pulseio/PulseIn.h"
#include "common-hal/rtc/RTC.h"
#include "common-hal/neopixel_write/__init__.h"
-#include "tick.h"
#include "shared-bindings/rtc/__init__.h"
@@ -64,6 +65,40 @@ static void power_warning_handler(void) {
reset_into_safe_mode(BROWNOUT);
}
+const nrfx_rtc_t rtc_instance = NRFX_RTC_INSTANCE(2);
+
+const nrfx_rtc_config_t rtc_config = {
+ .prescaler = RTC_FREQ_TO_PRESCALER(0x8000),
+ .reliable = 0,
+ .tick_latency = 0,
+ .interrupt_priority = 6
+};
+
+static volatile uint64_t overflowed_ticks = 0;
+
+void rtc_handler(nrfx_rtc_int_type_t int_type) {
+ if (int_type == NRFX_RTC_INT_OVERFLOW) {
+ // Our RTC is 24 bits and we're clocking it at 32.768khz which is 32 (2 ** 5) subticks per
+ // tick.
+ overflowed_ticks += (1L<< (24 - 5));
+ } else if (int_type == NRFX_RTC_INT_TICK && nrfx_rtc_counter_get(&rtc_instance) % 32 == 0) {
+ // Do things common to all ports when the tick occurs
+ supervisor_tick();
+ } else if (int_type == NRFX_RTC_INT_COMPARE0) {
+ nrfx_rtc_cc_set(&rtc_instance, 0, 0, false);
+ }
+}
+
+void tick_init(void) {
+ if (!nrf_clock_lf_is_running(NRF_CLOCK)) {
+ nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_LFCLKSTART);
+ }
+ nrfx_rtc_counter_clear(&rtc_instance);
+ nrfx_rtc_init(&rtc_instance, &rtc_config, rtc_handler);
+ nrfx_rtc_enable(&rtc_instance);
+ nrfx_rtc_overflow_enable(&rtc_instance, true);
+}
+
safe_mode_t port_init(void) {
nrf_peripherals_clocks_init();
@@ -89,10 +124,6 @@ safe_mode_t port_init(void) {
analogin_init();
#endif
- #if CIRCUITPY_RTC
- rtc_init();
- #endif
-
return NO_SAFE_MODE;
}
@@ -128,10 +159,6 @@ void reset_port(void) {
timers_reset();
-#if CIRCUITPY_RTC
- rtc_reset();
-#endif
-
#if CIRCUITPY_BLEIO
bleio_reset();
#endif
@@ -176,6 +203,55 @@ uint32_t port_get_saved_word(void) {
return _ebss;
}
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ uint32_t rtc = nrfx_rtc_counter_get(&rtc_instance);
+ if (subticks != NULL) {
+ *subticks = (rtc % 32);
+ }
+ return overflowed_ticks + rtc / 32;
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+ nrfx_rtc_tick_enable(&rtc_instance, true);
+}
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+ nrfx_rtc_tick_disable(&rtc_instance);
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+ uint32_t current_ticks = nrfx_rtc_counter_get(&rtc_instance);
+ uint32_t diff = 3;
+ if (ticks > diff) {
+ diff = ticks * 32;
+ }
+ if (diff > 0xffffff) {
+ diff = 0xffffff;
+ }
+ nrfx_rtc_cc_set(&rtc_instance, 0, current_ticks + diff, true);
+}
+
+void port_sleep_until_interrupt(void) {
+ // Clear the FPU interrupt because it can prevent us from sleeping.
+ if (NVIC_GetPendingIRQ(FPU_IRQn)) {
+ __set_FPSCR(__get_FPSCR() & ~(0x9f));
+ (void) __get_FPSCR();
+ NVIC_ClearPendingIRQ(FPU_IRQn);
+ }
+ uint8_t sd_enabled;
+
+ sd_softdevice_is_enabled(&sd_enabled);
+ if (sd_enabled) {
+ sd_app_evt_wait();
+ } else {
+ // Call wait for interrupt ourselves if the SD isn't enabled.
+ __WFI();
+ }
+}
+
+
void HardFault_Handler(void) {
reset_into_safe_mode(HARD_CRASH);
while (true) {
diff --git a/ports/nrf/supervisor/usb.c b/ports/nrf/supervisor/usb.c
index 11a5a1561..3d2527faa 100644
--- a/ports/nrf/supervisor/usb.c
+++ b/ports/nrf/supervisor/usb.c
@@ -26,7 +26,6 @@
#include "nrfx.h"
#include "nrfx_power.h"
-#include "tick.h"
#include "supervisor/usb.h"
#include "lib/utils/interrupt_char.h"
#include "lib/mp-readline/readline.h"
diff --git a/ports/nrf/tick.c b/ports/nrf/tick.c
deleted file mode 100644
index ac825a7f1..000000000
--- a/ports/nrf/tick.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "tick.h"
-
-#include "supervisor/shared/tick.h"
-#include "shared-module/gamepad/__init__.h"
-#include "shared-bindings/microcontroller/Processor.h"
-#include "nrf.h"
-
-void SysTick_Handler(void) {
- // Do things common to all ports when the tick occurs
- supervisor_tick();
-}
-
-void tick_init() {
- uint32_t ticks_per_ms = common_hal_mcu_processor_get_frequency() / 1000;
- SysTick_Config(ticks_per_ms); // interrupt is enabled
-}
-
-void tick_delay(uint32_t us) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- uint32_t us_between_ticks = SysTick->VAL / ticks_per_us;
- uint64_t start_ms = supervisor_ticks_ms64();
- while (us > 1000) {
- while (supervisor_ticks_ms64() == start_ms) {}
- us -= us_between_ticks;
- start_ms = supervisor_ticks_ms64();
- us_between_ticks = 1000;
- }
- while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {}
-}
-
-// us counts down!
-void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- *ms = supervisor_ticks_ms64();
- *us_until_ms = SysTick->VAL / ticks_per_us;
-}
-
-void wait_until(uint64_t ms, uint32_t us_until_ms) {
- uint32_t ticks_per_us = common_hal_mcu_processor_get_frequency() / 1000 / 1000;
- while(supervisor_ticks_ms64() <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
-}
diff --git a/ports/nrf/tick.h b/ports/nrf/tick.h
deleted file mode 100644
index d638ad025..000000000
--- a/ports/nrf/tick.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-#ifndef MICROPY_INCLUDED_NRF_TICK_H
-#define MICROPY_INCLUDED_NRF_TICK_H
-
-#include "py/mpconfig.h"
-
-#include <stdint.h>
-
-extern struct timer_descriptor ms_timer;
-
-void tick_init(void);
-
-void tick_delay(uint32_t us);
-
-void current_tick(uint64_t* ms, uint32_t* us_until_ms);
-// Do not call this with interrupts disabled because it may be waiting for
-// ticks_ms to increment.
-void wait_until(uint64_t ms, uint32_t us_until_ms);
-
-#endif // MICROPY_INCLUDED_NRF_TICK_H
diff --git a/ports/stm/Makefile b/ports/stm/Makefile
index 6bb690fc6..b667990bd 100755
--- a/ports/stm/Makefile
+++ b/ports/stm/Makefile
@@ -72,6 +72,7 @@ INC += -I./st_driver/CMSIS/Device/ST/STM32$(MCU_SERIES)xx/Include
INC += -I./st_driver/CMSIS/Include
INC += -I./boards
INC += -I./boards/$(BOARD)
+INC += -I./hal_conf
INC += -I./peripherals
INC += -I./packages
INC += -I../../lib/mp-readline
@@ -204,7 +205,6 @@ SRC_C += \
background.c \
fatfs_port.c \
mphalport.c \
- tick.c \
boards/$(BOARD)/board.c \
boards/$(BOARD)/pins.c \
peripherals/stm32$(MCU_SERIES_LOWER)/$(MCU_VARIANT_LOWER)/pins.c \
@@ -291,6 +291,10 @@ $(BUILD)/firmware.uf2: $(BUILD)/firmware.hex
$(ECHO) "Create $@"
$(PYTHON3) $(TOP)/tools/uf2/utils/uf2conv.py -f 0x57755a57 -b $(BOOTLOADER_OFFSET) -c -o "$(BUILD)/firmware.uf2" $^
+flash: $(BUILD)/firmware.bin
+ $(ECHO) "Writing $< to the board"
+ dfu-util -a 0 --dfuse-address 0x08000000 -D $(BUILD)/firmware.bin
+
include $(TOP)/py/mkrules.mk
# Print out the value of a make variable.
diff --git a/ports/stm/README.md b/ports/stm/README.md
index f2e3e9b67..95e9bd13f 100644
--- a/ports/stm/README.md
+++ b/ports/stm/README.md
@@ -1,3 +1,71 @@
-# CircuitPython Port To The ST Microelectronics STM32 Series
+# Circuitpython on STM32 #
-This is a port of CircuitPython to the STM32 series of chips.
+This port brings the ST Microelectronics STM32 series of MCUs to Circuitpython. STM32 chips have a wide range of capability, from <$1 low power STM32F0s to dual-core STM32H7s running at 400+ MHz. Currently, only the F4, F7, and H7 families are supported, powered by the ARM Cortex M4 and M7 processors.
+
+Refer to the ST Microelectronics website for more information on features sorted by family and individual chip lines: [st.com/en/microcontrollers-microprocessors/stm32-high-performance-mcus.html](https://www.st.com/en/microcontrollers-microprocessors/stm32-high-performance-mcus.html)
+
+STM32 SoCs vary product-by-product in clock speed, peripheral capability, pin assignments, and their support within this port. Refer to **mpconfigport.mk** for a full list of enabled modules sorted by family.
+
+## How this port is organized: ##
+
+- **boards/** contains the configuration files for each development board and breakout available on the port, as well as system files and both shared and SoC-specific linker files. Board configuration includes a pin mapping of the board, oscillator information, board-specific build flags, and setup for OLED or TFT screens where applicable.
+- **common-hal/** contains the port-specific module implementations, used by shared-module and shared-bindings.
+- **packages/** contains package-specific pin bindings (LQFP100, BGA216, etc)
+- **peripherals/** contains peripheral setup files and peripheral mapping information, sorted by family and sub-variant. Most files in this directory can be generated with the python scripts in **tools/**.
+- **st-driver/** submodule for ST HAL and LL files generated via CubeMX. Shared with TinyUSB.
+- **supervisor/** contains port-specific implementations of internal flash, serial and USB, as well as the **port.c** file, which initializes the port at startup.
+- **tools/** python scripts for generating peripheral and pin mapping files in **peripherals/** and **board/**.
+
+At the root level, refer to **mpconfigboard.h** and **mpconfigport.mk** for port specific settings and a list of enabled modules.
+
+## Build instructions ##
+
+Ensure your clone of Circuitpython is ready to build by following the [guide on the Adafruit Website](https://learn.adafruit.com/building-circuitpython/introduction). This includes installing the toolchain, synchronizing submodules, and running `mpy-cross`.
+
+Once the one-time build tasks are complete, you can build at any time by navigating to the port directory:
+
+ $ cd ports/stm
+
+To build for a specific circuitpython board, run:
+
+ $ make BOARD=feather_stm32f405_express
+
+You may also build with certain flags available in the makefile, depending on your board and development goals. The following flags would enable debug information and correct flash locations for a pre-flashed UF2 bootloader:
+
+ $ make BOARD=feather_stm32f405_express DEBUG=1 UF2_BOOTLOADER=1
+
+## USB connection ##
+
+Connect your development board of choice to the host PC via the USB cable. Note that for most ST development boards such as the Nucleo and Discovery series, you must use a secondary OTG USB connector to access circuitpython, as the primary USB connector will be connected to a built-in ST-Link debugger rather than the chip itself.
+
+In many cases, this ST-Link USB connector will **still need to be connected to power** for the chip to turn on - refer to your specific product manual for details.
+
+## Flash the bootloader ##
+
+Most ST development boards come with a built-in STLink programming and debugging probe accessible via USB. This programmer may show up as an `MBED` drive on the host PC, enabling simple drag and drop programming with a .bin file, or they may require a tool like [OpenOCD](http://openocd.org/) or [StLink-org/stlink](https://github.com/stlink-org/stlink) to run flashing and debugging commands.
+
+Many hobbyist and 3rd party development boards also expose SWD pins. These can be used with a cheap [stlink](https://www.adafruit.com/product/2548) debugger or other common programmers.
+
+For non-ST products or users without a debugger, all STM32 boards in the high performance families (F4, F7 and H7) include a built-in DFU bootloader stored in ROM. This bootloader is accessed by ensuring the BOOT0 pin is held to a logic 1 and the BOOT1 pin is held to a logic 0 when the chip is reset ([ST Appnote AN2606](https://www.st.com/resource/en/application_note/cd00167594-stm32-microcontroller-system-memory-boot-mode-stmicroelectronics.pdf)). Most chips hold BOOT low by default, so this can usually be achieved by running a jumper wire from 3.3V power to the BOOT0 pin, if it is exposed, or by flipping the appropriate switch or button as the chip is reset. Once the chip is started in DFU mode, BOOT0 no longer needs to be held high and can be released. An example is available in the [Feather STM32F405 guide](https://learn.adafruit.com/adafruit-stm32f405-feather-express/dfu-bootloader-details).
+
+Windows users will need to install [stm32cubeprog](https://www.st.com/en/development-tools/stm32cubeprog.html), while Mac and Linux users will need to install `dfu-util` with `brew install dfu-util` or `sudo apt-get install dfu-util`. More details are available in the [Feather F405 guide](https://learn.adafruit.com/adafruit-stm32f405-feather-express/dfu-bootloader-details).
+
+## Flashing the circuitpython image with DFU-Util ##
+
+Ensure the board is in dfu mode by following the steps in the previous section. Then run:
+
+ $ make BOARD=feather_stm32F405_express flash
+
+Alternatively, you can navigate to the build directory and run the raw `dfu-util` command:
+
+`dfu-util -a 0 --dfuse-address 0x08000000 -D firmware.bin`
+
+## Accessing the board ##
+
+Connecting the board to the PC via the USB cable will allow code to be uploaded to the `CIRCUITPY` volume.
+
+Circuitpython exposes a CDC virtual serial connection for REPL access and debugging. Connecting to it from OSX will look something like this:
+
+ screen /dev/tty.usbmodem14111201 115200
+
+You may also use a program like [mu](https://codewith.mu/) to assist with REPL access.
diff --git a/ports/stm/boards/STM32F401xd_fs.ld b/ports/stm/boards/STM32F401xd_fs.ld
index 826e1d404..3086c2c6b 100644
--- a/ports/stm/boards/STM32F401xd_fs.ld
+++ b/ports/stm/boards/STM32F401xd_fs.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 384K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 320K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 384K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 320K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F401xe_boot.ld b/ports/stm/boards/STM32F401xe_boot.ld
index 17dac2f1a..040947694 100644
--- a/ports/stm/boards/STM32F401xe_boot.ld
+++ b/ports/stm/boards/STM32F401xe_boot.ld
@@ -5,10 +5,10 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 512K - 64K /* entire flash, sans bootloader region */
- FLASH_ISR (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* sector 4 */
- FLASH_TEXT (rx) : ORIGIN = 0x08020000, LENGTH = 384K /* sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000194, LENGTH = 96K - 0x194
+ FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 512K - 64K /* entire flash, sans bootloader region */
+ FLASH_ISR (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* sector 4 */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08020000, LENGTH = 384K /* sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000194, LENGTH = 96K - 0x194
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F401xe_fs.ld b/ports/stm/boards/STM32F401xe_fs.ld
index f0136943a..b55bc4bb4 100644
--- a/ports/stm/boards/STM32F401xe_fs.ld
+++ b/ports/stm/boards/STM32F401xe_fs.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F405_boot.ld b/ports/stm/boards/STM32F405_boot.ld
index 7e611be9d..906f56e0d 100644
--- a/ports/stm/boards/STM32F405_boot.ld
+++ b/ports/stm/boards/STM32F405_boot.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 1024K - 64K /* entire flash, sans bootloader region */
- FLASH_ISR (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* sector 0 */
- FLASH_TEXT (rx) : ORIGIN = 0x08020000, LENGTH = 1024K - 64K - 64K /* sectors 5+ */
- CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 1024K - 64K /* entire flash, sans bootloader region */
+ FLASH_ISR (rx) : ORIGIN = 0x08010000, LENGTH = 64K /* sector 0 */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08020000, LENGTH = 1024K - 64K - 64K /* sectors 5+ */
+ CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F405_default.ld b/ports/stm/boards/STM32F405_default.ld
index 6b497356d..0aafdbcac 100644
--- a/ports/stm/boards/STM32F405_default.ld
+++ b/ports/stm/boards/STM32F405_default.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_TEXT (rx) : ORIGIN = 0x08004000, LENGTH = 1008K /* sectors 0-7*/
- CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08004000, LENGTH = 1008K /* sectors 0-7*/
+ CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F405_fs.ld b/ports/stm/boards/STM32F405_fs.ld
index 72ee49633..bff312660 100644
--- a/ports/stm/boards/STM32F405_fs.ld
+++ b/ports/stm/boards/STM32F405_fs.ld
@@ -5,12 +5,12 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F407_fs.ld b/ports/stm/boards/STM32F407_fs.ld
index d08cb8972..5330b4116 100644
--- a/ports/stm/boards/STM32F407_fs.ld
+++ b/ports/stm/boards/STM32F407_fs.ld
@@ -5,12 +5,12 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F411_fs.ld b/ports/stm/boards/STM32F411_fs.ld
index 28667214e..82c7aea06 100644
--- a/ports/stm/boards/STM32F411_fs.ld
+++ b/ports/stm/boards/STM32F411_fs.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F411_nvm.ld b/ports/stm/boards/STM32F411_nvm.ld
index bb37c081b..897b99631 100644
--- a/ports/stm/boards/STM32F411_nvm.ld
+++ b/ports/stm/boards/STM32F411_nvm.ld
@@ -5,12 +5,12 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 32K /* sectors 1,2 are 16K */
- FLASH_NVM (rwx) : ORIGIN = 0x0800C000, LENGTH = 16K /* sector 3 is 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 32K /* sectors 1,2 are 16K */
+ FLASH_NVM (rwx) : ORIGIN = 0x0800C000, LENGTH = 16K /* sector 3 is 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 448K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F412_fs.ld b/ports/stm/boards/STM32F412_fs.ld
index 5985b209e..afd51c6b1 100644
--- a/ports/stm/boards/STM32F412_fs.ld
+++ b/ports/stm/boards/STM32F412_fs.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
- FLASH_TEXT (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08004000, LENGTH = 48K /* sectors 1,2,3 are 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F746xG_fs.ld b/ports/stm/boards/STM32F746xG_fs.ld
index 8d821d2b5..f1bd3d5dc 100644
--- a/ports/stm/boards/STM32F746xG_fs.ld
+++ b/ports/stm/boards/STM32F746xG_fs.ld
@@ -29,12 +29,12 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 32K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08008000, LENGTH = 96K /* sectors 1,2,3 are 32K */
- FLASH_TEXT (rx) : ORIGIN = 0x08020000, LENGTH = 896K /* sector 4 is 128K, sectors 5,6,7 are 256K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
- ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 16K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 32K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08008000, LENGTH = 96K /* sectors 1,2,3 are 32K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08020000, LENGTH = 896K /* sector 4 is 128K, sectors 5,6,7 are 256K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
+ ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 16K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32F767_fs.ld b/ports/stm/boards/STM32F767_fs.ld
index 4acca4d66..40e67829b 100644
--- a/ports/stm/boards/STM32F767_fs.ld
+++ b/ports/stm/boards/STM32F767_fs.ld
@@ -5,11 +5,11 @@
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K /* entire flash */
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 32K /* sector 0 */
- FLASH_FS (rx) : ORIGIN = 0x08008000, LENGTH = 96K /* sectors 1,2,3 are 32K */
- FLASH_TEXT (rx) : ORIGIN = 0x08020000, LENGTH = 1920K /* sector 4 is 128K, sectors 5,6,7 are 256K */
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 32K /* sector 0 */
+ FLASH_FS (rx) : ORIGIN = 0x08008000, LENGTH = 96K /* sectors 1,2,3 are 32K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08020000, LENGTH = 1920K /* sector 4 is 128K, sectors 5,6,7 are 256K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/STM32H743_fs.ld b/ports/stm/boards/STM32H743_fs.ld
index 28cc12b4a..251c6cc27 100644
--- a/ports/stm/boards/STM32H743_fs.ld
+++ b/ports/stm/boards/STM32H743_fs.ld
@@ -10,15 +10,15 @@ _ld_default_stack_size = 24K;
/* Specify the memory areas */
MEMORY
{
- FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
- FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 128K /* sector 0, 128K */
- FLASH_FS (r) : ORIGIN = 0x08020000, LENGTH = 128K /* sector 1, 128K */
- FLASH_TEXT (rx) : ORIGIN = 0x08040000, LENGTH = 1792K /* sectors 6*128 + 8*128 */
- DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
- RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K /* AXI SRAM */
- SRAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K /* AHB1 SRAM */
- SRAM_D3 (xrw) : ORIGIN = 0x30040000, LENGTH = 64K /* AHB2 SRAM */
- ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 128K /* sector 0, 128K */
+ FLASH_FS (r) : ORIGIN = 0x08020000, LENGTH = 128K /* sector 1, 128K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08040000, LENGTH = 1792K /* sectors 6*128 + 8*128 */
+ DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+ RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K /* AXI SRAM */
+ SRAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K /* AHB1 SRAM */
+ SRAM_D3 (xrw) : ORIGIN = 0x30040000, LENGTH = 64K /* AHB2 SRAM */
+ ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
}
/* produce a link error if there is not this amount of RAM for these sections */
diff --git a/ports/stm/boards/common_default.ld b/ports/stm/boards/common_default.ld
index 41fe4dfb6..ade3571a5 100644
--- a/ports/stm/boards/common_default.ld
+++ b/ports/stm/boards/common_default.ld
@@ -1,14 +1,14 @@
/* Memory layout for default case.
- FLASH_ISR .isr_vector
- FLASH_TEXT .text
- FLASH_TEXT .data
- FLASH_FS // ignored for fs use
-
- RAM .data
- RAM .bss
- RAM .heap
- RAM .stack
+ FLASH_ISR .isr_vector
+ FLASH_FIRMWARE .text
+ FLASH_FIRMWARE .data
+ FLASH_FS // ignored for fs use
+
+ RAM .data
+ RAM .bss
+ RAM .heap
+ RAM .stack
*/
ENTRY(Reset_Handler)
@@ -42,7 +42,7 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
- } >FLASH_TEXT
+ } >FLASH_FIRMWARE
/* used by the startup to initialize data */
_sidata = LOADADDR(.data);
@@ -59,7 +59,7 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM AT> FLASH_TEXT
+ } >RAM AT> FLASH_FIRMWARE
/* Uninitialized data section */
.bss :
diff --git a/ports/stm/boards/common_nvm.ld b/ports/stm/boards/common_nvm.ld
index cee71d194..f948b94e1 100644
--- a/ports/stm/boards/common_nvm.ld
+++ b/ports/stm/boards/common_nvm.ld
@@ -1,16 +1,16 @@
/* Memory layout for case with dedicated nvm sector (inefficient)
TODO: rewrite nvm module, remove this file entirely
- FLASH_ISR .isr_vector
- FLASH_TEXT .text
- FLASH_TEXT .data
- FLASH_NVM .nvm_data
- FLASH_FS // ignored for fs use
-
- RAM .data
- RAM .bss
- RAM .heap
- RAM .stack
+ FLASH_ISR .isr_vector
+ FLASH_FIRMWARE .text
+ FLASH_FIRMWARE .data
+ FLASH_NVM .nvm_data
+ FLASH_FS // ignored for fs use
+
+ RAM .data
+ RAM .bss
+ RAM .heap
+ RAM .stack
*/
ENTRY(Reset_Handler)
@@ -52,7 +52,7 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
- } >FLASH_TEXT
+ } >FLASH_FIRMWARE
/* used by the startup to initialize data */
_sidata = LOADADDR(.data);
@@ -69,7 +69,7 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM AT> FLASH_TEXT
+ } >RAM AT> FLASH_FIRMWARE
/* Uninitialized data section */
.bss :
diff --git a/ports/stm/boards/common_tcm.ld b/ports/stm/boards/common_tcm.ld
index 0aab4c7f9..1a41853fe 100644
--- a/ports/stm/boards/common_tcm.ld
+++ b/ports/stm/boards/common_tcm.ld
@@ -1,18 +1,18 @@
/* Memory layout for cases with itcm and dtcm
- FLASH_ISR .isr_vector
- FLASH_TEXT .text
- FLASH_TEXT .data
- FLASH_FS // ignored for fs use
-
- RAM .data
- RAM .bss
- RAM .heap
-
- ITCM .itcm
- DTCM .dtcm_data
- DTCM .dtcm_bss
- DTCM .stack
+ FLASH_ISR .isr_vector
+ FLASH_FIRMWARE .text
+ FLASH_FIRMWARE .data
+ FLASH_FS // ignored for fs use
+
+ RAM .data
+ RAM .bss
+ RAM .heap
+
+ ITCM .itcm
+ DTCM .dtcm_data
+ DTCM .dtcm_bss
+ DTCM .stack
*/
ENTRY(Reset_Handler)
@@ -44,7 +44,7 @@ SECTIONS
. = ALIGN(4);
_etext = .; /* define a global symbol at end of code */
- } >FLASH_TEXT
+ } >FLASH_FIRMWARE
/* used by the startup to initialize data */
_sidata = LOADADDR(.data);
@@ -61,7 +61,7 @@ SECTIONS
. = ALIGN(4);
_edata = .; /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
- } >RAM AT> FLASH_TEXT
+ } >RAM AT> FLASH_FIRMWARE
_ld_d1_ram_data_destination = ADDR(.data);
_ld_d1_ram_data_flash_copy = LOADADDR(.data);
_ld_d1_ram_data_size = SIZEOF(.data);
@@ -98,7 +98,7 @@ SECTIONS
*(.itcm.*)
. = ALIGN(4);
- } > ITCM AT> FLASH_TEXT
+ } > ITCM AT> FLASH_FIRMWARE
_ld_itcm_destination = ADDR(.itcm);
_ld_itcm_flash_copy = LOADADDR(.itcm);
_ld_itcm_size = SIZEOF(.itcm);
@@ -110,7 +110,7 @@ SECTIONS
*(.dtcm_data.*)
. = ALIGN(4);
- } > DTCM AT> FLASH_TEXT
+ } > DTCM AT> FLASH_FIRMWARE
_ld_dtcm_data_destination = ADDR(.dtcm_data);
_ld_dtcm_data_flash_copy = LOADADDR(.dtcm_data);
_ld_dtcm_data_size = SIZEOF(.dtcm_data);
diff --git a/ports/stm/boards/espruino_pico/mpconfigboard.h b/ports/stm/boards/espruino_pico/mpconfigboard.h
index d4430380c..890b1b88e 100644
--- a/ports/stm/boards/espruino_pico/mpconfigboard.h
+++ b/ports/stm/boards/espruino_pico/mpconfigboard.h
@@ -36,4 +36,5 @@
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
diff --git a/ports/stm/boards/espruino_pico/mpconfigboard.mk b/ports/stm/boards/espruino_pico/mpconfigboard.mk
index b7937dd04..054937c33 100644
--- a/ports/stm/boards/espruino_pico/mpconfigboard.mk
+++ b/ports/stm/boards/espruino_pico/mpconfigboard.mk
@@ -13,3 +13,8 @@ MCU_PACKAGE = UFQFPN48
LD_COMMON = boards/common_default.ld
LD_FILE = boards/STM32F401xd_fs.ld # use for internal flash
+# Disable ulab as we're nearly out of space on this board due to
+# INTERNAL_FLASH_FILESYSTEM. It can probably be reenabled if we enable
+# lto for this port, and if other stuff hasn't been added in the
+# meantime
+CIRCUITPY_ULAB = 0
diff --git a/ports/stm/boards/espruino_pico/stm32f4xx_hal_conf.h b/ports/stm/boards/espruino_pico/stm32f4xx_hal_conf.h
deleted file mode 100644
index ab04df318..000000000
--- a/ports/stm/boards/espruino_pico/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/espruino_wifi/mpconfigboard.h b/ports/stm/boards/espruino_wifi/mpconfigboard.h
index abdc9e8fa..80aae3ad4 100644
--- a/ports/stm/boards/espruino_wifi/mpconfigboard.h
+++ b/ports/stm/boards/espruino_wifi/mpconfigboard.h
@@ -33,4 +33,5 @@
#define FLASH_PAGE_SIZE (0x4000) //16K
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
#define BOARD_OVERWRITE_SWD (1)
diff --git a/ports/stm/boards/espruino_wifi/stm32f4xx_hal_conf.h b/ports/stm/boards/espruino_wifi/stm32f4xx_hal_conf.h
deleted file mode 100644
index 18d9d60eb..000000000
--- a/ports/stm/boards/espruino_wifi/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_DAC_MODULE_ENABLED */
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature.*/
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/feather_stm32f405_express/mpconfigboard.h b/ports/stm/boards/feather_stm32f405_express/mpconfigboard.h
index 6600fcf67..8f8e24566 100644
--- a/ports/stm/boards/feather_stm32f405_express/mpconfigboard.h
+++ b/ports/stm/boards/feather_stm32f405_express/mpconfigboard.h
@@ -35,6 +35,8 @@
#define MICROPY_HW_NEOPIXEL (&pin_PC00)
#define BOARD_OSC_DIV (12)
+#define HSE_VALUE ((uint32_t)12000000U)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
// On-board flash
#define SPI_FLASH_MOSI_PIN (&pin_PB05)
diff --git a/ports/stm/boards/feather_stm32f405_express/stm32f4xx_hal_conf.h b/ports/stm/boards/feather_stm32f405_express/stm32f4xx_hal_conf.h
deleted file mode 100644
index 8031403a9..000000000
--- a/ports/stm/boards/feather_stm32f405_express/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-#define HAL_RNG_MODULE_ENABLED
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/meowbit_v121/board.c b/ports/stm/boards/meowbit_v121/board.c
index 68eed2926..812a8c208 100644
--- a/ports/stm/boards/meowbit_v121/board.c
+++ b/ports/stm/boards/meowbit_v121/board.c
@@ -35,8 +35,6 @@
#include "supervisor/spi_flash_api.h"
-#include "tick.h"
-
displayio_fourwire_obj_t board_display_obj;
#define DELAY 0x80
diff --git a/ports/stm/boards/meowbit_v121/mpconfigboard.h b/ports/stm/boards/meowbit_v121/mpconfigboard.h
index babf54a3a..268a66015 100644
--- a/ports/stm/boards/meowbit_v121/mpconfigboard.h
+++ b/ports/stm/boards/meowbit_v121/mpconfigboard.h
@@ -36,6 +36,10 @@
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000)
#define BOARD_OSC_DIV (12)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
+#define HSE_VALUE ((uint32_t)12000000U)
+#define LSE_VALUE ((uint32_t)32000U)
+
#define BOARD_NO_VBUS_SENSE (1)
#define BOARD_VTOR_DEFER (1) //Leave VTOR relocation to bootloader
#define BOARD_USE_INTERNAL_SPI
diff --git a/ports/stm/boards/meowbit_v121/stm32f4xx_hal_conf.h b/ports/stm/boards/meowbit_v121/stm32f4xx_hal_conf.h
deleted file mode 100644
index 68a49b4ba..000000000
--- a/ports/stm/boards/meowbit_v121/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/nucleo_f767zi/mpconfigboard.h b/ports/stm/boards/nucleo_f767zi/mpconfigboard.h
index b481a2835..314c96cb5 100644
--- a/ports/stm/boards/nucleo_f767zi/mpconfigboard.h
+++ b/ports/stm/boards/nucleo_f767zi/mpconfigboard.h
@@ -33,3 +33,4 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
diff --git a/ports/stm/boards/nucleo_f767zi/stm32f7xx_hal_conf.h b/ports/stm/boards/nucleo_f767zi/stm32f7xx_hal_conf.h
deleted file mode 100644
index 84699bd78..000000000
--- a/ports/stm/boards/nucleo_f767zi/stm32f7xx_hal_conf.h
+++ /dev/null
@@ -1,445 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f7xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f7xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F7xx_HAL_CONF_H
-#define __STM32F7xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
- #define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-#define HAL_ETH_MODULE_ENABLED
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-/* #define HAL_I2S_MODULE_ENABLED */
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_JPEG_MODULE_ENABLED */
-/* #define HAL_MDIOS_MODULE_ENABLED */
-/* #define HAL_SMBUS_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 0U
-#define ART_ACCLERATOR_ENABLE 0U /* To enable instruction cache and prefetch */
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* LAN8742A_PHY_ADDRESS Address*/
-#define LAN8742A_PHY_ADDRESS 0
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x1FU) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0004U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0010U) /*!< PHY Duplex mask */
-
-#define PHY_ISFR ((uint16_t)0x001DU) /*!< PHY Interrupt Source Flag register Offset */
-#define PHY_ISFR_INT4 ((uint16_t)0x000BU) /*!< PHY Link down inturrupt */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f7xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f7xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f7xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f7xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f7xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f7xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f7xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f7xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f7xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f7xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f7xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f7xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f7xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f7xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f7xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f7xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f7xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f7xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f7xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f7xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f7xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f7xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f7xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f7xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f7xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f7xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f7xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f7xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f7xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f7xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f7xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f7xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f7xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f7xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f7xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f7xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f7xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f7xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f7xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f7xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f7xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f7xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f7xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f7xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_JPEG_MODULE_ENABLED
- #include "stm32f7xx_hal_jpeg.h"
-#endif /* HAL_JPEG_MODULE_ENABLED */
-
-#ifdef HAL_MDIOS_MODULE_ENABLED
- #include "stm32f7xx_hal_mdios.h"
-#endif /* HAL_MDIOS_MODULE_ENABLED */
-
-#ifdef HAL_SMBUS_MODULE_ENABLED
- #include "stm32f7xx_hal_smbus.h"
-#endif /* HAL_SMBUS_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F7xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/nucleo_h743zi_2/mpconfigboard.h b/ports/stm/boards/nucleo_h743zi_2/mpconfigboard.h
index 3678d8a39..8909cc5be 100644
--- a/ports/stm/boards/nucleo_h743zi_2/mpconfigboard.h
+++ b/ports/stm/boards/nucleo_h743zi_2/mpconfigboard.h
@@ -32,3 +32,4 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
diff --git a/ports/atmel-samd/tick.h b/ports/stm/boards/openmv_h7/board.c
index 334352df2..4421970ee 100644
--- a/ports/atmel-samd/tick.h
+++ b/ports/stm/boards/openmv_h7/board.c
@@ -23,20 +23,16 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_ATMEL_SAMD_TICK_H
-#define MICROPY_INCLUDED_ATMEL_SAMD_TICK_H
-#include "py/mpconfig.h"
+#include "boards/board.h"
-extern struct timer_descriptor ms_timer;
+void board_init(void) {
+}
-void tick_init(void);
+bool board_requests_safe_mode(void) {
+ return false;
+}
-void tick_delay(uint32_t us);
+void reset_board(void) {
-void current_tick(uint64_t* ms, uint32_t* us_until_ms);
-// Do not call this with interrupts disabled because it may be waiting for
-// ticks_ms to increment.
-void wait_until(uint64_t ms, uint32_t us_until_ms);
-
-#endif // MICROPY_INCLUDED_ATMEL_SAMD_TICK_H
+}
diff --git a/ports/stm/boards/openmv_h7/mpconfigboard.h b/ports/stm/boards/openmv_h7/mpconfigboard.h
new file mode 100644
index 000000000..9a049ed2c
--- /dev/null
+++ b/ports/stm/boards/openmv_h7/mpconfigboard.h
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Lucian Copeland for Adafruit Industries
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+//Micropython setup
+
+#define MICROPY_HW_BOARD_NAME "OPENMV-H7 R1"
+#define MICROPY_HW_MCU_NAME "STM32H743"
+
+#define FLASH_PAGE_SIZE (0x4000)
+
+#define BOARD_OSC_DIV (12)
+#define HSE_VALUE ((uint32_t)12000000)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
+
diff --git a/ports/stm/boards/openmv_h7/mpconfigboard.mk b/ports/stm/boards/openmv_h7/mpconfigboard.mk
new file mode 100644
index 000000000..242dac52c
--- /dev/null
+++ b/ports/stm/boards/openmv_h7/mpconfigboard.mk
@@ -0,0 +1,15 @@
+USB_VID = 0x239A
+USB_PID = 0x80A4
+USB_PRODUCT = "OpenMV-H7 R1"
+USB_MANUFACTURER = "OpenMV, LLC"
+USB_DEVICES = "CDC,MSC"
+
+INTERNAL_FLASH_FILESYSTEM = 1
+
+MCU_SERIES = H7
+MCU_VARIANT = STM32H743xx
+MCU_PACKAGE = LQFP100_x7
+
+LD_COMMON = boards/common_tcm.ld
+LD_FILE = boards/STM32H743_fs.ld
+
diff --git a/ports/stm/boards/openmv_h7/openmv.csv b/ports/stm/boards/openmv_h7/openmv.csv
new file mode 100644
index 000000000..9045e1ea2
--- /dev/null
+++ b/ports/stm/boards/openmv_h7/openmv.csv
@@ -0,0 +1,26 @@
+P0,PB15
+P1,PB14
+P2,PB13
+P3,PB12
+P4,PB10
+P5,PB11
+P6,PA05
+P7,PD12
+P8,PD13
+P9,PD14
+LED1,PC00
+LED2,PC01
+LED3,PC02
+LED4,PE02
+UART1_TX,PB14
+UART1_RX,PB15
+UART3_TX,PB10
+UART3_RX,PB11
+I2C2_SCL,PB10
+I2C2_SDA,PB11
+I2C4_SCL,PD12
+I2C4_SDA,PD13
+SPI2_NSS,PB12
+SPI2_SCK,PB13
+SPI2_MISO,PB14
+SPI2_MOSI,PB15 \ No newline at end of file
diff --git a/ports/stm/boards/openmv_h7/pins.c b/ports/stm/boards/openmv_h7/pins.c
new file mode 100644
index 000000000..2f7fa93c1
--- /dev/null
+++ b/ports/stm/boards/openmv_h7/pins.c
@@ -0,0 +1,35 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_P0), MP_ROM_PTR(&pin_PB15) },
+ { MP_ROM_QSTR(MP_QSTR_P1), MP_ROM_PTR(&pin_PB14) },
+ { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_PB13) },
+ { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_PB12) },
+ { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_PB10) },
+ { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_PB11) },
+ { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_PD12) },
+ { MP_ROM_QSTR(MP_QSTR_P8), MP_ROM_PTR(&pin_PD13) },
+ { MP_ROM_QSTR(MP_QSTR_P9), MP_ROM_PTR(&pin_PD14) },
+ { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_PC00) },
+ { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_PC01) },
+ { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_PC02) },
+ { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_PE02) },
+ { MP_ROM_QSTR(MP_QSTR_LED_RED), MP_ROM_PTR(&pin_PC00) },
+ { MP_ROM_QSTR(MP_QSTR_LED_GREEN), MP_ROM_PTR(&pin_PC01) },
+ { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_PC02) },
+ { MP_ROM_QSTR(MP_QSTR_LED_IR), MP_ROM_PTR(&pin_PE02) },
+ { MP_ROM_QSTR(MP_QSTR_UART1_TX), MP_ROM_PTR(&pin_PB14) },
+ { MP_ROM_QSTR(MP_QSTR_UART1_RX), MP_ROM_PTR(&pin_PB15) },
+ { MP_ROM_QSTR(MP_QSTR_UART3_TX), MP_ROM_PTR(&pin_PB10) },
+ { MP_ROM_QSTR(MP_QSTR_UART3_RX), MP_ROM_PTR(&pin_PB11) },
+ { MP_ROM_QSTR(MP_QSTR_I2C2_SCL), MP_ROM_PTR(&pin_PB10) },
+ { MP_ROM_QSTR(MP_QSTR_I2C2_SDA), MP_ROM_PTR(&pin_PB11) },
+ { MP_ROM_QSTR(MP_QSTR_I2C4_SCL), MP_ROM_PTR(&pin_PD12) },
+ { MP_ROM_QSTR(MP_QSTR_I2C4_SDA), MP_ROM_PTR(&pin_PD13) },
+ { MP_ROM_QSTR(MP_QSTR_SPI2_NSS), MP_ROM_PTR(&pin_PB12) },
+ { MP_ROM_QSTR(MP_QSTR_SPI2_SCK), MP_ROM_PTR(&pin_PB13) },
+ { MP_ROM_QSTR(MP_QSTR_SPI2_MISO), MP_ROM_PTR(&pin_PB14) },
+ { MP_ROM_QSTR(MP_QSTR_SPI2_MOSI), MP_ROM_PTR(&pin_PB15) },
+};
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/stm/boards/pyb_nano_v2/mpconfigboard.h b/ports/stm/boards/pyb_nano_v2/mpconfigboard.h
index 965e7d5ff..721a91def 100644
--- a/ports/stm/boards/pyb_nano_v2/mpconfigboard.h
+++ b/ports/stm/boards/pyb_nano_v2/mpconfigboard.h
@@ -33,6 +33,7 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
// On-board flash
#define SPI_FLASH_MOSI_PIN (&pin_PB15)
diff --git a/ports/stm/boards/pyb_nano_v2/stm32f4xx_hal_conf.h b/ports/stm/boards/pyb_nano_v2/stm32f4xx_hal_conf.h
deleted file mode 100644
index ab04df318..000000000
--- a/ports/stm/boards/pyb_nano_v2/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/pyboard_v11/mpconfigboard.h b/ports/stm/boards/pyboard_v11/mpconfigboard.h
index 398731d30..77fab2c69 100644
--- a/ports/stm/boards/pyboard_v11/mpconfigboard.h
+++ b/ports/stm/boards/pyboard_v11/mpconfigboard.h
@@ -33,6 +33,9 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (12)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
+#define HSE_VALUE ((uint32_t)12000000U)
+#define LSE_VALUE ((uint32_t)32000U)
#define DEFAULT_I2C_BUS_SCL (&pin_PB06)
#define DEFAULT_I2C_BUS_SDA (&pin_PB07)
diff --git a/ports/stm/boards/pyboard_v11/stm32f4xx_hal_conf.h b/ports/stm/boards/pyboard_v11/stm32f4xx_hal_conf.h
deleted file mode 100644
index 4dc18cb7f..000000000
--- a/ports/stm/boards/pyboard_v11/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-#define HAL_RNG_MODULE_ENABLED
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/stm32f411ce_blackpill/mpconfigboard.h b/ports/stm/boards/stm32f411ce_blackpill/mpconfigboard.h
index 2ae1a2926..a21060a84 100644
--- a/ports/stm/boards/stm32f411ce_blackpill/mpconfigboard.h
+++ b/ports/stm/boards/stm32f411ce_blackpill/mpconfigboard.h
@@ -35,6 +35,9 @@
#define BOARD_OSC_DIV (25)
#define BOARD_NO_VBUS_SENSE (1)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
+#define HSE_VALUE ((uint32_t)25000000U)
+
// On-board flash
// #define SPI_FLASH_MOSI_PIN (&pin_PA07)
// #define SPI_FLASH_MISO_PIN (&pin_PA06)
diff --git a/ports/stm/boards/stm32f411ce_blackpill/stm32f4xx_hal_conf.h b/ports/stm/boards/stm32f411ce_blackpill/stm32f4xx_hal_conf.h
deleted file mode 100644
index 81d29f242..000000000
--- a/ports/stm/boards/stm32f411ce_blackpill/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-/* #define HAL_PCD_MODULE_ENABLED */
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.h b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.h
index 49ef80cdd..3956a365c 100644
--- a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.h
+++ b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.h
@@ -33,3 +33,9 @@
#define FLASH_PAGE_SIZE (0x4000) //16K
#define BOARD_OSC_DIV (8)
+
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
+
+// The schematic has a 32k crystal that isn't fitted. Uncommented the line below if you add it.
+// #define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
+// #define LSE_VALUE ((uint32_t)32000U)
diff --git a/ports/stm/boards/stm32f411ve_discovery/stm32f4xx_hal_conf.h b/ports/stm/boards/stm32f411ve_discovery/stm32f4xx_hal_conf.h
deleted file mode 100644
index 18d9d60eb..000000000
--- a/ports/stm/boards/stm32f411ve_discovery/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_DAC_MODULE_ENABLED */
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature.*/
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/stm32f412zg_discovery/mpconfigboard.h b/ports/stm/boards/stm32f412zg_discovery/mpconfigboard.h
index f34b830fb..112d2a83c 100644
--- a/ports/stm/boards/stm32f412zg_discovery/mpconfigboard.h
+++ b/ports/stm/boards/stm32f412zg_discovery/mpconfigboard.h
@@ -34,5 +34,7 @@
#define BOARD_OSC_DIV (8)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
+
#define DEFAULT_I2C_BUS_SCL (&pin_PB10)
#define DEFAULT_I2C_BUS_SDA (&pin_PB09)
diff --git a/ports/stm/boards/stm32f4_discovery/mpconfigboard.h b/ports/stm/boards/stm32f4_discovery/mpconfigboard.h
index fcd7aa09c..28a370afd 100644
--- a/ports/stm/boards/stm32f4_discovery/mpconfigboard.h
+++ b/ports/stm/boards/stm32f4_discovery/mpconfigboard.h
@@ -33,3 +33,5 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (8)
+
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (1)
diff --git a/ports/stm/boards/stm32f4_discovery/stm32f4xx_hal_conf.h b/ports/stm/boards/stm32f4_discovery/stm32f4xx_hal_conf.h
deleted file mode 100644
index ee5832d49..000000000
--- a/ports/stm/boards/stm32f4_discovery/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-#define HAL_RNG_MODULE_ENABLED
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature.*/
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/stm32f746g_disco/stm32f7xx_hal_conf.h b/ports/stm/boards/stm32f746g_disco/stm32f7xx_hal_conf.h
deleted file mode 100644
index de72c6e02..000000000
--- a/ports/stm/boards/stm32f746g_disco/stm32f7xx_hal_conf.h
+++ /dev/null
@@ -1,445 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f7xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f7xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F7xx_HAL_CONF_H
-#define __STM32F7xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
- #define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-#define HAL_ETH_MODULE_ENABLED
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-/* #define HAL_I2S_MODULE_ENABLED */
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_JPEG_MODULE_ENABLED */
-/* #define HAL_MDIOS_MODULE_ENABLED */
-/* #define HAL_SMBUS_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 0U
-#define ART_ACCLERATOR_ENABLE 0U /* To enable instruction cache and prefetch */
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* LAN8742A_PHY_ADDRESS Address*/
-#define LAN8742A_PHY_ADDRESS 0
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x1FU) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0004U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0010U) /*!< PHY Duplex mask */
-
-#define PHY_ISFR ((uint16_t)0x001DU) /*!< PHY Interrupt Source Flag register Offset */
-#define PHY_ISFR_INT4 ((uint16_t)0x000BU) /*!< PHY Link down inturrupt */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f7xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f7xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f7xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f7xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f7xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f7xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f7xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f7xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f7xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f7xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f7xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f7xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f7xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f7xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f7xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f7xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f7xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f7xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f7xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f7xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f7xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f7xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f7xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f7xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f7xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f7xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f7xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f7xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f7xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f7xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f7xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f7xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f7xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f7xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f7xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f7xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f7xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f7xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f7xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f7xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f7xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f7xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f7xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f7xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_JPEG_MODULE_ENABLED
- #include "stm32f7xx_hal_jpeg.h"
-#endif /* HAL_JPEG_MODULE_ENABLED */
-
-#ifdef HAL_MDIOS_MODULE_ENABLED
- #include "stm32f7xx_hal_mdios.h"
-#endif /* HAL_MDIOS_MODULE_ENABLED */
-
-#ifdef HAL_SMBUS_MODULE_ENABLED
- #include "stm32f7xx_hal_smbus.h"
-#endif /* HAL_SMBUS_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F7xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/stm32f746g_disco/board.c b/ports/stm/boards/stm32f746g_discovery/board.c
index aafc69cf0..aafc69cf0 100644
--- a/ports/stm/boards/stm32f746g_disco/board.c
+++ b/ports/stm/boards/stm32f746g_discovery/board.c
diff --git a/ports/stm/boards/stm32f746g_disco/mpconfigboard.h b/ports/stm/boards/stm32f746g_discovery/mpconfigboard.h
index 05184940b..28784f6ab 100644
--- a/ports/stm/boards/stm32f746g_disco/mpconfigboard.h
+++ b/ports/stm/boards/stm32f746g_discovery/mpconfigboard.h
@@ -35,6 +35,7 @@
#define FLASH_PAGE_SIZE (0x4000)
#define BOARD_OSC_DIV (25)
+#define HSE_VALUE ((uint32_t)25000000)
#define BOARD_OSC_PLLN (400)
#define BOARD_OSC_PLLQ (9)
diff --git a/ports/stm/boards/stm32f746g_disco/mpconfigboard.mk b/ports/stm/boards/stm32f746g_discovery/mpconfigboard.mk
index 0b4ccc760..0b4ccc760 100644
--- a/ports/stm/boards/stm32f746g_disco/mpconfigboard.mk
+++ b/ports/stm/boards/stm32f746g_discovery/mpconfigboard.mk
diff --git a/ports/stm/boards/stm32f746g_disco/pins.c b/ports/stm/boards/stm32f746g_discovery/pins.c
index a859c8d19..a859c8d19 100644
--- a/ports/stm/boards/stm32f746g_disco/pins.c
+++ b/ports/stm/boards/stm32f746g_discovery/pins.c
diff --git a/ports/stm/boards/thunderpack/mpconfigboard.h b/ports/stm/boards/thunderpack/mpconfigboard.h
index 0b3c55819..7102b1242 100644
--- a/ports/stm/boards/thunderpack/mpconfigboard.h
+++ b/ports/stm/boards/thunderpack/mpconfigboard.h
@@ -44,6 +44,9 @@
#define BOARD_OVERWRITE_SWD (1)
#define BOARD_NO_VBUS_SENSE (1)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
+#define HSE_VALUE ((uint32_t)24000000U)
+
// Status LEDs
#define MICROPY_HW_LED_STATUS (&pin_PA02)
diff --git a/ports/stm/boards/thunderpack/stm32f4xx_hal_conf.h b/ports/stm/boards/thunderpack/stm32f4xx_hal_conf.h
deleted file mode 100644
index 5cb563422..000000000
--- a/ports/stm/boards/thunderpack/stm32f4xx_hal_conf.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- ******************************************************************************
- * @file stm32f4xx_hal_conf_template.h
- * @author MCD Application Team
- * @brief HAL configuration template file.
- * This file should be copied to the application folder and renamed
- * to stm32f4xx_hal_conf.h.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __STM32F4xx_HAL_CONF_H
-#define __STM32F4xx_HAL_CONF_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-#define HAL_USART_MODULE_ENABLED
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-/* #define HAL_PCD_MODULE_ENABLED */
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
-/* ########################## HSE/HSI Values adaptation ##################### */
-/**
- * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSE_VALUE)
- #define HSE_VALUE ((uint32_t)24000000) /*!< Value of the External oscillator in Hz */
-#endif /* HSE_VALUE */
-
-#if !defined (HSE_STARTUP_TIMEOUT)
- #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
-#endif /* HSE_STARTUP_TIMEOUT */
-
-/**
- * @brief Internal High Speed oscillator (HSI) value.
- * This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
- */
-#if !defined (HSI_VALUE)
- #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
-#endif /* HSI_VALUE */
-
-/**
- * @brief Internal Low Speed oscillator (LSI) value.
- */
-#if !defined (LSI_VALUE)
- #define LSI_VALUE ((uint32_t)40000)
-#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
- The real value may vary depending on the variations
- in voltage and temperature. */
-/**
- * @brief External Low Speed oscillator (LSE) value.
- */
-#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */
-#endif /* LSE_VALUE */
-
-#if !defined (LSE_STARTUP_TIMEOUT)
- #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
-#endif /* LSE_STARTUP_TIMEOUT */
-
-
-/**
- * @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
- */
-#if !defined (EXTERNAL_CLOCK_VALUE)
- #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
-#endif /* EXTERNAL_CLOCK_VALUE */
-
-/* Tip: To avoid modifying this file each time you need to use different HSE,
- === you can define the HSE value in your toolchain compiler preprocessor. */
-
-/* ########################### System Configuration ######################### */
-/**
- * @brief This is the HAL system configuration section
- */
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
-#define PREFETCH_ENABLE 1U
-#define INSTRUCTION_CACHE_ENABLE 1U
-#define DATA_CACHE_ENABLE 1U
-
-/* ########################## Assert Selection ############################## */
-/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
- * HAL drivers code
- */
-/* #define USE_FULL_ASSERT 1U */
-
-/* ################## Ethernet peripheral configuration ##################### */
-
-/* Section 1 : Ethernet peripheral configuration */
-
-/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
-#define MAC_ADDR0 2U
-#define MAC_ADDR1 0U
-#define MAC_ADDR2 0U
-#define MAC_ADDR3 0U
-#define MAC_ADDR4 0U
-#define MAC_ADDR5 0U
-
-/* Definition of the Ethernet driver buffers size and count */
-#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
-#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
-#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
-#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
-
-/* Section 2: PHY configuration section */
-
-/* DP83848_PHY_ADDRESS Address*/
-#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
-#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
-/* PHY Configuration delay */
-#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
-
-#define PHY_READ_TO ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU)
-
-/* Section 3: Common PHY Registers */
-
-#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
-#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
-#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
-#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
-#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
-#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
-#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
-#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
-#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
-#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
-#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
-#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
-
-#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
-#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
-#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
-/* Section 4: Extended PHY Registers */
-#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
-
-#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
-#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
-
-/* ################## SPI peripheral configuration ########################## */
-
-/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
-* Activated: CRC code is present inside driver
-* Deactivated: CRC code cleaned from driver
-*/
-
-#define USE_SPI_CRC 0U
-
-/* Includes ------------------------------------------------------------------*/
-/**
- * @brief Include module's header file
- */
-
-#ifdef HAL_RCC_MODULE_ENABLED
- #include "stm32f4xx_hal_rcc.h"
-#endif /* HAL_RCC_MODULE_ENABLED */
-
-#ifdef HAL_EXTI_MODULE_ENABLED
- #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
-#ifdef HAL_GPIO_MODULE_ENABLED
- #include "stm32f4xx_hal_gpio.h"
-#endif /* HAL_GPIO_MODULE_ENABLED */
-
-#ifdef HAL_DMA_MODULE_ENABLED
- #include "stm32f4xx_hal_dma.h"
-#endif /* HAL_DMA_MODULE_ENABLED */
-
-#ifdef HAL_CORTEX_MODULE_ENABLED
- #include "stm32f4xx_hal_cortex.h"
-#endif /* HAL_CORTEX_MODULE_ENABLED */
-
-#ifdef HAL_ADC_MODULE_ENABLED
- #include "stm32f4xx_hal_adc.h"
-#endif /* HAL_ADC_MODULE_ENABLED */
-
-#ifdef HAL_CAN_MODULE_ENABLED
- #include "stm32f4xx_hal_can.h"
-#endif /* HAL_CAN_MODULE_ENABLED */
-
-#ifdef HAL_CRC_MODULE_ENABLED
- #include "stm32f4xx_hal_crc.h"
-#endif /* HAL_CRC_MODULE_ENABLED */
-
-#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
-#endif /* HAL_CRYP_MODULE_ENABLED */
-
-#ifdef HAL_DMA2D_MODULE_ENABLED
- #include "stm32f4xx_hal_dma2d.h"
-#endif /* HAL_DMA2D_MODULE_ENABLED */
-
-#ifdef HAL_DAC_MODULE_ENABLED
- #include "stm32f4xx_hal_dac.h"
-#endif /* HAL_DAC_MODULE_ENABLED */
-
-#ifdef HAL_DCMI_MODULE_ENABLED
- #include "stm32f4xx_hal_dcmi.h"
-#endif /* HAL_DCMI_MODULE_ENABLED */
-
-#ifdef HAL_ETH_MODULE_ENABLED
- #include "stm32f4xx_hal_eth.h"
-#endif /* HAL_ETH_MODULE_ENABLED */
-
-#ifdef HAL_FLASH_MODULE_ENABLED
- #include "stm32f4xx_hal_flash.h"
-#endif /* HAL_FLASH_MODULE_ENABLED */
-
-#ifdef HAL_SRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sram.h"
-#endif /* HAL_SRAM_MODULE_ENABLED */
-
-#ifdef HAL_NOR_MODULE_ENABLED
- #include "stm32f4xx_hal_nor.h"
-#endif /* HAL_NOR_MODULE_ENABLED */
-
-#ifdef HAL_NAND_MODULE_ENABLED
- #include "stm32f4xx_hal_nand.h"
-#endif /* HAL_NAND_MODULE_ENABLED */
-
-#ifdef HAL_PCCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
-#ifdef HAL_SDRAM_MODULE_ENABLED
- #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
-
-#ifdef HAL_HASH_MODULE_ENABLED
- #include "stm32f4xx_hal_hash.h"
-#endif /* HAL_HASH_MODULE_ENABLED */
-
-#ifdef HAL_I2C_MODULE_ENABLED
- #include "stm32f4xx_hal_i2c.h"
-#endif /* HAL_I2C_MODULE_ENABLED */
-
-#ifdef HAL_I2S_MODULE_ENABLED
- #include "stm32f4xx_hal_i2s.h"
-#endif /* HAL_I2S_MODULE_ENABLED */
-
-#ifdef HAL_IWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_iwdg.h"
-#endif /* HAL_IWDG_MODULE_ENABLED */
-
-#ifdef HAL_LTDC_MODULE_ENABLED
- #include "stm32f4xx_hal_ltdc.h"
-#endif /* HAL_LTDC_MODULE_ENABLED */
-
-#ifdef HAL_PWR_MODULE_ENABLED
- #include "stm32f4xx_hal_pwr.h"
-#endif /* HAL_PWR_MODULE_ENABLED */
-
-#ifdef HAL_RNG_MODULE_ENABLED
- #include "stm32f4xx_hal_rng.h"
-#endif /* HAL_RNG_MODULE_ENABLED */
-
-#ifdef HAL_RTC_MODULE_ENABLED
- #include "stm32f4xx_hal_rtc.h"
-#endif /* HAL_RTC_MODULE_ENABLED */
-
-#ifdef HAL_SAI_MODULE_ENABLED
- #include "stm32f4xx_hal_sai.h"
-#endif /* HAL_SAI_MODULE_ENABLED */
-
-#ifdef HAL_SD_MODULE_ENABLED
- #include "stm32f4xx_hal_sd.h"
-#endif /* HAL_SD_MODULE_ENABLED */
-
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
-#ifdef HAL_SPI_MODULE_ENABLED
- #include "stm32f4xx_hal_spi.h"
-#endif /* HAL_SPI_MODULE_ENABLED */
-
-#ifdef HAL_TIM_MODULE_ENABLED
- #include "stm32f4xx_hal_tim.h"
-#endif /* HAL_TIM_MODULE_ENABLED */
-
-#ifdef HAL_UART_MODULE_ENABLED
- #include "stm32f4xx_hal_uart.h"
-#endif /* HAL_UART_MODULE_ENABLED */
-
-#ifdef HAL_USART_MODULE_ENABLED
- #include "stm32f4xx_hal_usart.h"
-#endif /* HAL_USART_MODULE_ENABLED */
-
-#ifdef HAL_IRDA_MODULE_ENABLED
- #include "stm32f4xx_hal_irda.h"
-#endif /* HAL_IRDA_MODULE_ENABLED */
-
-#ifdef HAL_SMARTCARD_MODULE_ENABLED
- #include "stm32f4xx_hal_smartcard.h"
-#endif /* HAL_SMARTCARD_MODULE_ENABLED */
-
-#ifdef HAL_WWDG_MODULE_ENABLED
- #include "stm32f4xx_hal_wwdg.h"
-#endif /* HAL_WWDG_MODULE_ENABLED */
-
-#ifdef HAL_PCD_MODULE_ENABLED
- #include "stm32f4xx_hal_pcd.h"
-#endif /* HAL_PCD_MODULE_ENABLED */
-
-#ifdef HAL_HCD_MODULE_ENABLED
- #include "stm32f4xx_hal_hcd.h"
-#endif /* HAL_HCD_MODULE_ENABLED */
-
-#ifdef HAL_DSI_MODULE_ENABLED
- #include "stm32f4xx_hal_dsi.h"
-#endif /* HAL_DSI_MODULE_ENABLED */
-
-#ifdef HAL_QSPI_MODULE_ENABLED
- #include "stm32f4xx_hal_qspi.h"
-#endif /* HAL_QSPI_MODULE_ENABLED */
-
-#ifdef HAL_CEC_MODULE_ENABLED
- #include "stm32f4xx_hal_cec.h"
-#endif /* HAL_CEC_MODULE_ENABLED */
-
-#ifdef HAL_FMPI2C_MODULE_ENABLED
- #include "stm32f4xx_hal_fmpi2c.h"
-#endif /* HAL_FMPI2C_MODULE_ENABLED */
-
-#ifdef HAL_SPDIFRX_MODULE_ENABLED
- #include "stm32f4xx_hal_spdifrx.h"
-#endif /* HAL_SPDIFRX_MODULE_ENABLED */
-
-#ifdef HAL_DFSDM_MODULE_ENABLED
- #include "stm32f4xx_hal_dfsdm.h"
-#endif /* HAL_DFSDM_MODULE_ENABLED */
-
-#ifdef HAL_LPTIM_MODULE_ENABLED
- #include "stm32f4xx_hal_lptim.h"
-#endif /* HAL_LPTIM_MODULE_ENABLED */
-
-/* Exported macro ------------------------------------------------------------*/
-#ifdef USE_FULL_ASSERT
-/**
- * @brief The assert_param macro is used for function's parameters check.
- * @param expr: If expr is false, it calls assert_failed function
- * which reports the name of the source file and the source
- * line number of the call that failed.
- * If expr is true, it returns no value.
- * @retval None
- */
- #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
-/* Exported functions ------------------------------------------------------- */
- void assert_failed(uint8_t* file, uint32_t line);
-#else
- #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __STM32F4xx_HAL_CONF_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/common-hal/busio/SPI.c b/ports/stm/common-hal/busio/SPI.c
index 2572c7f26..d3310efe0 100644
--- a/ports/stm/common-hal/busio/SPI.c
+++ b/ports/stm/common-hal/busio/SPI.c
@@ -196,9 +196,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
}
//handle typedef selection, errors
- if ( (self->sck != NULL && self->mosi != NULL && self->miso != NULL) ||
- (self->sck != NULL && self->mosi != NULL && miso == NULL) ||
- (self->sck != NULL && self->miso != NULL && mosi == NULL)) {
+ if (self->sck != NULL && (self->mosi != NULL || self->miso != NULL)) {
SPIx = mcu_spi_banks[self->sck->periph_index - 1];
} else {
if (spi_taken) {
diff --git a/ports/stm/common-hal/busio/UART.c b/ports/stm/common-hal/busio/UART.c
index cb5460c68..76afa5848 100644
--- a/ports/stm/common-hal/busio/UART.c
+++ b/ports/stm/common-hal/busio/UART.c
@@ -35,8 +35,6 @@
#include "py/stream.h"
#include "supervisor/shared/translate.h"
-#include "tick.h"
-
#define ALL_UARTS 0xFFFF
//arrays use 0 based numbering: UART1 is stored at index 0
diff --git a/ports/stm/common-hal/displayio/ParallelBus.c b/ports/stm/common-hal/displayio/ParallelBus.c
index 1b808ec02..314b72ff7 100644
--- a/ports/stm/common-hal/displayio/ParallelBus.c
+++ b/ports/stm/common-hal/displayio/ParallelBus.c
@@ -33,8 +33,6 @@
#include "shared-bindings/digitalio/DigitalInOut.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "tick.h"
-
void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self,
const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select,
const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) {
diff --git a/ports/stm/common-hal/microcontroller/Processor.c b/ports/stm/common-hal/microcontroller/Processor.c
index c8b07db3f..8dc968b36 100644
--- a/ports/stm/common-hal/microcontroller/Processor.c
+++ b/ports/stm/common-hal/microcontroller/Processor.c
@@ -28,8 +28,9 @@
#include "common-hal/microcontroller/Processor.h"
#include "py/runtime.h"
#include "supervisor/shared/translate.h"
+#include STM32_HAL_H
-#if defined(STM32F4)
+#if CPY_STM32F4
#define STM32_UUID ((uint32_t *)0x1FFF7A10)
@@ -61,7 +62,7 @@ STATIC void set_adc_params(ADC_HandleTypeDef *AdcHandle) {
#endif
float common_hal_mcu_processor_get_temperature(void) {
- #if defined(STM32F4)
+ #if CPY_STM32F4
__HAL_RCC_ADC1_CLK_ENABLE();
//HAL Implementation
@@ -71,7 +72,7 @@ float common_hal_mcu_processor_get_temperature(void) {
HAL_ADC_Init(&AdcHandle);
ADC->CCR |= ADC_CCR_TSVREFE;
- ADC->CCR &= ~ADC_CCR_VBATE; // If this somehow got turned on, it'll return bad values.
+ ADC->CCR &= ~ADC_CCR_VBATE; // If this somehow got turned on, it'll return bad values.
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; //either 16 or 18, depending on chip
sConfig.Rank = 1;
@@ -94,7 +95,7 @@ float common_hal_mcu_processor_get_temperature(void) {
}
float common_hal_mcu_processor_get_voltage(void) {
- #if defined(STM32F4)
+ #if CPY_STM32F4
__HAL_RCC_ADC1_CLK_ENABLE();
//HAL Implementation
@@ -117,7 +118,7 @@ float common_hal_mcu_processor_get_voltage(void) {
uint32_t value = (uint32_t)HAL_ADC_GetValue(&AdcHandle);
HAL_ADC_Stop(&AdcHandle);
- //This value could be used to actively correct ADC values.
+ //This value could be used to actively correct ADC values.
adc_refcor = ((float)(*VREFIN_CAL)) / ((float)value);
return adc_refcor * 3.3f;
@@ -131,7 +132,7 @@ uint32_t common_hal_mcu_processor_get_frequency(void) {
}
void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
- #if defined(STM32F4)
+ #if CPY_STM32F4
for (int i=0; i<3; i++) {
((uint32_t*) raw_id)[i] = STM32_UUID[i];
}
diff --git a/ports/stm/common-hal/microcontroller/__init__.c b/ports/stm/common-hal/microcontroller/__init__.c
index 020c3ee79..a827399cc 100644
--- a/ports/stm/common-hal/microcontroller/__init__.c
+++ b/ports/stm/common-hal/microcontroller/__init__.c
@@ -40,32 +40,13 @@
#include "supervisor/filesystem.h"
#include "supervisor/shared/safe_mode.h"
-//tested divisor value for busy loop in us delay
-#define LOOP_TICKS 12
-
-STATIC uint32_t get_us(void) {
- uint32_t ticks_per_us = HAL_RCC_GetSysClockFreq()/1000000;
- uint32_t micros, sys_cycles;
- do {
- micros = supervisor_ticks_ms32();
- sys_cycles = SysTick->VAL; //counts backwards
- } while (micros != supervisor_ticks_ms32()); //try again if ticks_ms rolled over
- return (micros * 1000) + (ticks_per_us * 1000 - sys_cycles) / ticks_per_us;
-}
-
void common_hal_mcu_delay_us(uint32_t delay) {
- if (__get_PRIMASK() == 0x00000000) {
- //by default use ticks_ms
- uint32_t start = get_us();
- while (get_us()-start < delay) {
- __asm__ __volatile__("nop");
- }
- } else {
- //when SysTick is disabled, approximate with busy loop
- const uint32_t ucount = HAL_RCC_GetSysClockFreq() / 1000000 * delay / LOOP_TICKS;
- for (uint32_t count = 0; ++count <= ucount;) {
- }
- }
+ uint32_t ticks_per_us = HAL_RCC_GetSysClockFreq()/1000000;
+ delay *= ticks_per_us;
+ SysTick->LOAD = delay;
+ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
+ while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0) {}
+ SysTick->CTRL = 0;
}
volatile uint32_t nesting_count = 0;
@@ -118,4 +99,3 @@ const nvm_bytearray_obj_t common_hal_mcu_nvm_obj = {
.start_address = (uint8_t*) (CIRCUITPY_INTERNAL_NVM_START_ADDR)
};
#endif
-
diff --git a/ports/stm/common-hal/neopixel_write/__init__.c b/ports/stm/common-hal/neopixel_write/__init__.c
index 6740a0d34..c8852403b 100644
--- a/ports/stm/common-hal/neopixel_write/__init__.c
+++ b/ports/stm/common-hal/neopixel_write/__init__.c
@@ -24,18 +24,17 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
#include "shared-bindings/neopixel_write/__init__.h"
-#include "tick.h"
#include "py/mperrno.h"
+#include "py/mphal.h"
#include "py/runtime.h"
#include "common-hal/microcontroller/Pin.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_ll_gpio.h"
+#include "supervisor/port.h"
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
//sysclock divisors
#define MAGIC_800_INT 900000 // ~1.11 us -> 1.2 field
@@ -45,7 +44,7 @@ uint32_t next_start_tick_us = 1000;
#pragma GCC push_options
#pragma GCC optimize ("Os")
-void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels,
+void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels,
uint32_t numBytes) {
uint8_t *p = pixels, *end = p + numBytes, pix = *p++, mask = 0x80;
uint32_t start = 0;
@@ -59,9 +58,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
uint32_t t0 = (sys_freq/MAGIC_800_T0H);
uint32_t t1 = (sys_freq/MAGIC_800_T1H);
- // This must be called while interrupts are on in case we're waiting for a
- // future ms tick.
- wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
GPIO_TypeDef * p_port = pin_port(digitalinout->pin->port);
uint32_t p_mask = pin_mask(digitalinout->pin->number);
@@ -90,13 +89,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
__enable_irq();
// Update the next start.
- current_tick(&next_start_tick_ms, &next_start_tick_us);
- if (next_start_tick_us < 100) {
- next_start_tick_ms += 1;
- next_start_tick_us = 100 - next_start_tick_us;
- } else {
- next_start_tick_us -= 100;
- }
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
}
-#pragma GCC pop_options \ No newline at end of file
+#pragma GCC pop_options
diff --git a/ports/stm/common-hal/pulseio/PulseIn.c b/ports/stm/common-hal/pulseio/PulseIn.c
index 721bb0232..9d82a18a0 100644
--- a/ports/stm/common-hal/pulseio/PulseIn.c
+++ b/ports/stm/common-hal/pulseio/PulseIn.c
@@ -32,7 +32,6 @@
#include "py/runtime.h"
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/pulseio/PulseIn.h"
-#include "tick.h"
#include STM32_HAL_H
@@ -40,19 +39,35 @@
static pulseio_pulsein_obj_t* _objs[STM32_GPIO_PORT_SIZE];
+STATIC TIM_HandleTypeDef t6_handle;
+static uint32_t overflow_count = 0;
+STATIC uint8_t refcount = 0;
+
static void assign_EXTI_Interrupt(pulseio_pulsein_obj_t* self, uint8_t num);
-static void pulsein_handler(uint8_t num) {
- // Interrupt register must be cleared manually
- EXTI->PR = 1 << num;
+void TIM6_IRQHandler(void)
+{
+ // Detect TIM Update event
+ if (__HAL_TIM_GET_FLAG(&t6_handle, TIM_FLAG_UPDATE) != RESET)
+ {
+ if (__HAL_TIM_GET_IT_SOURCE(&t6_handle, TIM_IT_UPDATE) != RESET)
+ {
+ __HAL_TIM_CLEAR_IT(&t6_handle, TIM_IT_UPDATE);
+ overflow_count++;
+ }
+ }
+}
+static void pulsein_handler(uint8_t num) {
// Grab the current time first.
- uint32_t current_us;
- uint64_t current_ms;
- current_tick(&current_ms, &current_us);
+ uint32_t current_overflow = overflow_count;
+ uint32_t current_count = 0;
+ #if HAS_BASIC_TIM
+ current_count = TIM6->CNT;
+ #endif
- // current_tick gives us the remaining us until the next tick but we want the number since the last ms.
- current_us = 1000 - current_us;
+ // Interrupt register must be cleared manually
+ EXTI->PR = 1 << num;
pulseio_pulsein_obj_t* self = _objs[num];
if ( !self ) return;
@@ -64,22 +79,9 @@ static void pulsein_handler(uint8_t num) {
self->first_edge = false;
}
} else {
- uint32_t ms_diff = current_ms - self->last_ms;
- uint16_t us_diff = current_us - self->last_us;
- uint32_t total_diff = us_diff;
-
- if (self->last_us > current_us) {
- total_diff = 1000 + current_us - self->last_us;
- if (ms_diff > 1) {
- total_diff += (ms_diff - 1) * 1000;
- }
- } else {
- total_diff += ms_diff * 1000;
- }
- uint16_t duration = 0xffff;
- if (total_diff < duration) {
- duration = total_diff;
- }
+ uint32_t total_diff = current_count + 0x10000 * (current_overflow - self->last_overflow) - self->last_count;
+ // Cap duration at 16 bits.
+ uint16_t duration = MIN(0xffff, total_diff);
uint16_t i = (self->start + self->len) % self->maxlen;
self->buffer[i] = duration;
@@ -90,8 +92,8 @@ static void pulsein_handler(uint8_t num) {
}
}
- self->last_ms = current_ms;
- self->last_us = current_us;
+ self->last_count = current_count;
+ self->last_overflow = current_overflow;
}
void pulsein_reset(void) {
@@ -102,10 +104,18 @@ void pulsein_reset(void) {
}
}
memset(_objs, 0, sizeof(_objs));
+
+ #if HAS_BASIC_TIM
+ __HAL_RCC_TIM6_CLK_DISABLE();
+ refcount = 0;
+ #endif
}
void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu_pin_obj_t* pin,
uint16_t maxlen, bool idle_state) {
+#if !(HAS_BASIC_TIM)
+ mp_raise_NotImplementedError(translate("PulseIn not supported on this chip"));
+#else
// STM32 has one shared EXTI for each pin number, 0-15
uint8_t p_num = pin->number;
if(_objs[p_num]) {
@@ -116,10 +126,10 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
// Allocate pulse buffer
self->buffer = (uint16_t *) m_malloc(maxlen * sizeof(uint16_t), false);
if (self->buffer == NULL) {
- mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"),
+ mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"),
maxlen * sizeof(uint16_t));
}
-
+
// Set internal variables
self->pin = pin;
self->maxlen = maxlen;
@@ -128,8 +138,27 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
self->len = 0;
self->first_edge = true;
self->paused = false;
- self->last_us = 0;
- self->last_ms = 0;
+ self->last_count = 0;
+ self->last_overflow = 0;
+
+ if (HAL_TIM_Base_GetState(&t6_handle) == HAL_TIM_STATE_RESET) {
+ // Set the new period
+ t6_handle.Instance = TIM6;
+ t6_handle.Init.Prescaler = 168; // HCLK is 168 mhz so divide down to 1mhz
+ t6_handle.Init.Period = 0xffff;
+ HAL_TIM_Base_Init(&t6_handle);
+
+ // TIM6 has limited HAL support, set registers manually
+ t6_handle.Instance->SR = 0; // Prevent the SR from triggering an interrupt
+ t6_handle.Instance->CR1 |= TIM_CR1_CEN; // Resume timer
+ t6_handle.Instance->CR1 |= TIM_CR1_URS; // Disable non-overflow interrupts
+ __HAL_TIM_ENABLE_IT(&t6_handle, TIM_IT_UPDATE);
+
+ overflow_count = 0;
+ }
+ // Add to active PulseIns
+ refcount++;
+#endif
// EXTI pins can also be read as an input
GPIO_InitTypeDef GPIO_InitStruct = {0};
@@ -157,6 +186,13 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
_objs[self->pin->number] = NULL;
reset_pin_number(self->pin->port, self->pin->number);
self->pin = NULL;
+
+ refcount--;
+ if (refcount == 0) {
+ #if HAS_BASIC_TIM
+ __HAL_RCC_TIM6_CLK_DISABLE();
+ #endif
+ }
}
void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) {
@@ -191,8 +227,8 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, uint16_t tri
self->first_edge = true;
self->paused = false;
- self->last_ms = 0;
- self->last_us = 0;
+ self->last_count = 0;
+ self->last_overflow = 0;
HAL_NVIC_EnableIRQ(self->irq);
}
diff --git a/ports/stm/common-hal/pulseio/PulseIn.h b/ports/stm/common-hal/pulseio/PulseIn.h
index 5456613c6..34d0cc731 100644
--- a/ports/stm/common-hal/pulseio/PulseIn.h
+++ b/ports/stm/common-hal/pulseio/PulseIn.h
@@ -45,8 +45,8 @@ typedef struct {
volatile uint16_t start;
volatile uint16_t len;
- volatile uint16_t last_us;
- volatile uint64_t last_ms;
+ volatile uint32_t last_overflow;
+ volatile uint16_t last_count;
} pulseio_pulsein_obj_t;
void pulsein_reset(void);
diff --git a/ports/stm/common-hal/pulseio/PulseOut.c b/ports/stm/common-hal/pulseio/PulseOut.c
index 232516f19..c7c879c88 100644
--- a/ports/stm/common-hal/pulseio/PulseOut.c
+++ b/ports/stm/common-hal/pulseio/PulseOut.c
@@ -37,7 +37,6 @@
#include STM32_HAL_H
#include "common-hal/microcontroller/Pin.h"
-#include "tick.h"
// A single timer is shared amongst all PulseOut objects under the assumption that
// the code is single threaded.
@@ -60,7 +59,7 @@ STATIC void turn_off(pulseio_pulseout_obj_t *pulseout) {
// Turn off PWM
HAL_TIM_PWM_Stop(&(pulseout->pwmout->handle), pulseout->pwmout->channel);
// Make sure pin is low.
- HAL_GPIO_WritePin(pin_port(pulseout->pwmout->tim->pin->port),
+ HAL_GPIO_WritePin(pin_port(pulseout->pwmout->tim->pin->port),
pin_mask(pulseout->pwmout->tim->pin->number), 0);
}
@@ -196,7 +195,7 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pu
// mp_raise_RuntimeError(translate("Error: Send Timeout"));
// }
}
- //turn off timer counter.
+ //turn off timer counter.
t7_handle.Instance->CR1 &= ~TIM_CR1_CEN;
}
diff --git a/ports/stm/hal_conf/sort_defines.py b/ports/stm/hal_conf/sort_defines.py
new file mode 100644
index 000000000..09e79dade
--- /dev/null
+++ b/ports/stm/hal_conf/sort_defines.py
@@ -0,0 +1,21 @@
+f = open("stm32_hal_conf.h")
+
+defines = {}
+
+for line in f:
+ if "define HAL_" in line:
+ parts = line.split()
+ index = len(parts)
+ for i, part in enumerate(parts):
+ if part.startswith("HAL_"):
+ index = i
+ define = parts[index]
+ if define not in defines:
+ defines[define] = index == 1
+
+keys = sorted(defines.keys())
+for k in keys:
+ if not defines[k]:
+ print("// ", end="")
+
+ print("#define", k)
diff --git a/ports/stm/hal_conf/stm32_hal_conf.h b/ports/stm/hal_conf/stm32_hal_conf.h
new file mode 100644
index 000000000..b78afc64b
--- /dev/null
+++ b/ports/stm/hal_conf/stm32_hal_conf.h
@@ -0,0 +1,76 @@
+
+#include "mpconfigboard.h"
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_HAL_CONF_H
+#define __STM32_HAL_CONF_H
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+#define HAL_ADC_MODULE_ENABLED
+// #define HAL_CAN_MODULE_ENABLED
+// #define HAL_CEC_MODULE_ENABLED
+// #define HAL_COMP_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+// #define HAL_CRC_MODULE_ENABLED
+// #define HAL_CRYP_MODULE_ENABLED
+#define HAL_DAC_MODULE_ENABLED
+// #define HAL_DCMI_MODULE_ENABLED
+// #define HAL_DFSDM_MODULE_ENABLED
+// #define HAL_DMA2D_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+// #define HAL_DSI_MODULE_ENABLED
+// #define HAL_DTS_MODULE_ENABLED
+// #define HAL_ETH_MODULE_ENABLED
+// #define HAL_EXTI_MODULE_ENABLED
+// #define HAL_FDCAN_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+// #define HAL_FMPI2C_MODULE_ENABLED
+// #define HAL_GFXMMU_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+// #define HAL_HASH_MODULE_ENABLED
+// #define HAL_HCD_MODULE_ENABLED
+// #define HAL_HRTIM_MODULE_ENABLED
+// #define HAL_HSEM_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_I2S_MODULE_ENABLED
+// #define HAL_IRDA_MODULE_ENABLED
+// #define HAL_IWDG_MODULE_ENABLED
+// #define HAL_JPEG_MODULE_ENABLED
+// #define HAL_LPTIM_MODULE_ENABLED
+// #define HAL_LTDC_MODULE_ENABLED
+// #define HAL_MDIOS_MODULE_ENABLED
+#define HAL_MDMA_MODULE_ENABLED
+// #define HAL_MMC_MODULE_ENABLED
+#define HAL_MODULE_ENABLED
+// #define HAL_NAND_MODULE_ENABLED
+// #define HAL_NOR_MODULE_ENABLED
+// #define HAL_OPAMP_MODULE_ENABLED
+// #define HAL_OSPI_MODULE_ENABLED
+// #define HAL_OTFDEC_MODULE_ENABLED
+// #define HAL_PCCARD_MODULE_ENABLED
+#define HAL_PCD_MODULE_ENABLED
+// #define HAL_PSSI_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_QSPI_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_RNG_MODULE_ENABLED
+#define HAL_RTC_MODULE_ENABLED
+// #define HAL_SAI_MODULE_ENABLED
+// #define HAL_SDRAM_MODULE_ENABLED
+// #define HAL_SD_MODULE_ENABLED
+// #define HAL_SMARTCARD_MODULE_ENABLED
+// #define HAL_SMBUS_MODULE_ENABLED
+// #define HAL_SPDIFRX_MODULE_ENABLED
+#define HAL_SPI_MODULE_ENABLED
+// #define HAL_SRAM_MODULE_ENABLED
+// #define HAL_SWPMI_MODULE_ENABLED
+#define HAL_TIM_MODULE_ENABLED
+#define HAL_UART_MODULE_ENABLED
+#define HAL_USART_MODULE_ENABLED
+// #define HAL_WWDG_MODULE_ENABLED
+
+#endif // __STM32_HAL_CONF_H
diff --git a/ports/stm/boards/stm32f412zg_discovery/stm32f4xx_hal_conf.h b/ports/stm/hal_conf/stm32f4xx_hal_conf.h
index f1b401348..ad8939052 100644
--- a/ports/stm/boards/stm32f412zg_discovery/stm32f4xx_hal_conf.h
+++ b/ports/stm/hal_conf/stm32f4xx_hal_conf.h
@@ -2,7 +2,7 @@
******************************************************************************
* @file stm32f4xx_hal_conf_template.h
* @author MCD Application Team
- * @brief HAL configuration template file.
+ * @brief HAL configuration template file.
* This file should be copied to the application folder and renamed
* to stm32f4xx_hal_conf.h.
******************************************************************************
@@ -17,7 +17,9 @@
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
- */
+ */
+
+#include "stm32_hal_conf.h"
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F4xx_HAL_CONF_H
@@ -30,68 +32,13 @@
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
-#define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_DAC_MODULE_ENABLED */
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-/* #define HAL_ETH_MODULE_ENABLED */
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_PCCARD_MODULE_ENABLED */
-#define HAL_SRAM_MODULE_ENABLED
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_I2S_MODULE_ENABLED
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-#define HAL_RNG_MODULE_ENABLED
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-#define HAL_SD_MODULE_ENABLED
-/* #define HAL_MMC_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-#define HAL_QSPI_MODULE_ENABLED
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_FMPI2C_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
/* ########################## HSE/HSI Values adaptation ##################### */
/**
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
+ * (when HSE is used as system clock source, directly or through the PLL).
*/
-#if !defined (HSE_VALUE)
+#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
@@ -102,7 +49,7 @@
/**
* @brief Internal High Speed oscillator (HSI) value.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
+ * (when HSI is used as system clock source, directly or through the PLL).
*/
#if !defined (HSI_VALUE)
#define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
@@ -111,7 +58,7 @@
/**
* @brief Internal Low Speed oscillator (LSI) value.
*/
-#if !defined (LSI_VALUE)
+#if !defined (LSI_VALUE)
#define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
The real value may vary depending on the variations
@@ -120,17 +67,18 @@
* @brief External Low Speed oscillator (LSE) value.
*/
#if !defined (LSE_VALUE)
- #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */
+ #define LSE_VALUE 32768 /*!< Value of the External Low Speed oscillator in Hz */
#endif /* LSE_VALUE */
#if !defined (LSE_STARTUP_TIMEOUT)
#define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
#endif /* LSE_STARTUP_TIMEOUT */
+
/**
* @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
*/
#if !defined (EXTERNAL_CLOCK_VALUE)
#define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
@@ -143,16 +91,16 @@
/**
* @brief This is the HAL system configuration section
*/
-#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
-#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
-#define USE_RTOS 0U
+#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
+#define USE_RTOS 0U
#define PREFETCH_ENABLE 1U
#define INSTRUCTION_CACHE_ENABLE 1U
#define DATA_CACHE_ENABLE 1U
/* ########################## Assert Selection ############################## */
/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
* HAL drivers code
*/
/* #define USE_FULL_ASSERT 1U */
@@ -169,7 +117,7 @@
#define MAC_ADDR4 0U
#define MAC_ADDR5 0U
-/* Definition of the Ethernet driver buffers size and count */
+/* Definition of the Ethernet driver buffers size and count */
#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
@@ -177,9 +125,9 @@
/* Section 2: PHY configuration section */
-/* DP83848_PHY_ADDRESS Address*/
+/* DP83848_PHY_ADDRESS Address*/
#define DP83848_PHY_ADDRESS 0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
+/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
/* PHY Configuration delay */
#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
@@ -191,7 +139,7 @@
#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
-
+
#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
@@ -206,7 +154,7 @@
#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
+
/* Section 4: Extended PHY Registers */
#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
@@ -224,7 +172,7 @@
/* Includes ------------------------------------------------------------------*/
/**
- * @brief Include module's header file
+ * @brief Include module's header file
*/
#ifdef HAL_RCC_MODULE_ENABLED
@@ -242,7 +190,7 @@
#ifdef HAL_DMA_MODULE_ENABLED
#include "stm32f4xx_hal_dma.h"
#endif /* HAL_DMA_MODULE_ENABLED */
-
+
#ifdef HAL_CORTEX_MODULE_ENABLED
#include "stm32f4xx_hal_cortex.h"
#endif /* HAL_CORTEX_MODULE_ENABLED */
@@ -260,7 +208,7 @@
#endif /* HAL_CRC_MODULE_ENABLED */
#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f4xx_hal_cryp.h"
+ #include "stm32f4xx_hal_cryp.h"
#endif /* HAL_CRYP_MODULE_ENABLED */
#ifdef HAL_DMA2D_MODULE_ENABLED
@@ -282,7 +230,7 @@
#ifdef HAL_FLASH_MODULE_ENABLED
#include "stm32f4xx_hal_flash.h"
#endif /* HAL_FLASH_MODULE_ENABLED */
-
+
#ifdef HAL_SRAM_MODULE_ENABLED
#include "stm32f4xx_hal_sram.h"
#endif /* HAL_SRAM_MODULE_ENABLED */
@@ -297,11 +245,11 @@
#ifdef HAL_PCCARD_MODULE_ENABLED
#include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */
-
+#endif /* HAL_PCCARD_MODULE_ENABLED */
+
#ifdef HAL_SDRAM_MODULE_ENABLED
#include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
+#endif /* HAL_SDRAM_MODULE_ENABLED */
#ifdef HAL_HASH_MODULE_ENABLED
#include "stm32f4xx_hal_hash.h"
@@ -382,7 +330,7 @@
#ifdef HAL_HCD_MODULE_ENABLED
#include "stm32f4xx_hal_hcd.h"
#endif /* HAL_HCD_MODULE_ENABLED */
-
+
#ifdef HAL_DSI_MODULE_ENABLED
#include "stm32f4xx_hal_dsi.h"
#endif /* HAL_DSI_MODULE_ENABLED */
@@ -410,14 +358,14 @@
#ifdef HAL_LPTIM_MODULE_ENABLED
#include "stm32f4xx_hal_lptim.h"
#endif /* HAL_LPTIM_MODULE_ENABLED */
-
+
/* Exported macro ------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
- * line number of the call that failed.
+ * line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
@@ -426,13 +374,20 @@
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */
+#endif /* USE_FULL_ASSERT */
#ifdef __cplusplus
}
#endif
+// CircuitPython specific conditionals. Using a value is better than checking
+// defined because undefined variable happen when a file isn't included when it
+// should have been.
+#define CPY_STM32F4 1
+#define CPY_STM32F7 0
+#define CPY_STM32H7 0
+
#endif /* __STM32F4xx_HAL_CONF_H */
-
+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/nucleo_f746zg/stm32f7xx_hal_conf.h b/ports/stm/hal_conf/stm32f7xx_hal_conf.h
index 84699bd78..3dd368e85 100644
--- a/ports/stm/boards/nucleo_f746zg/stm32f7xx_hal_conf.h
+++ b/ports/stm/hal_conf/stm32f7xx_hal_conf.h
@@ -2,7 +2,7 @@
******************************************************************************
* @file stm32f7xx_hal_conf_template.h
* @author MCD Application Team
- * @brief HAL configuration template file.
+ * @brief HAL configuration template file.
* This file should be copied to the application folder and renamed
* to stm32f7xx_hal_conf.h.
******************************************************************************
@@ -17,7 +17,9 @@
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
- */
+ */
+
+#include "stm32_hal_conf.h"
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F7xx_HAL_CONF_H
@@ -30,69 +32,13 @@
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
- #define HAL_ADC_MODULE_ENABLED
-/* #define HAL_CRYP_MODULE_ENABLED */
-/* #define HAL_CAN_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-#define HAL_ETH_MODULE_ENABLED
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-/* #define HAL_I2S_MODULE_ENABLED */
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-/* #define HAL_RNG_MODULE_ENABLED */
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_JPEG_MODULE_ENABLED */
-/* #define HAL_MDIOS_MODULE_ENABLED */
-/* #define HAL_SMBUS_MODULE_ENABLED */
-/* #define HAL_EXTI_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-
/* ########################## HSE/HSI Values adaptation ##################### */
/**
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
+ * (when HSE is used as system clock source, directly or through the PLL).
*/
-#if !defined (HSE_VALUE)
+#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
@@ -103,7 +49,7 @@
/**
* @brief Internal High Speed oscillator (HSI) value.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
+ * (when HSI is used as system clock source, directly or through the PLL).
*/
#if !defined (HSI_VALUE)
#define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
@@ -112,7 +58,7 @@
/**
* @brief Internal Low Speed oscillator (LSI) value.
*/
-#if !defined (LSI_VALUE)
+#if !defined (LSI_VALUE)
#define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
The real value may vary depending on the variations
@@ -130,8 +76,8 @@
/**
* @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
*/
#if !defined (EXTERNAL_CLOCK_VALUE)
#define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/
@@ -143,7 +89,7 @@
/* ########################### System Configuration ######################### */
/**
* @brief This is the HAL system configuration section
- */
+ */
#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
#define USE_RTOS 0U
@@ -152,7 +98,7 @@
/* ########################## Assert Selection ############################## */
/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
* HAL drivers code
*/
/* #define USE_FULL_ASSERT 1U */
@@ -169,7 +115,7 @@
#define MAC_ADDR4 0U
#define MAC_ADDR5 0U
-/* Definition of the Ethernet driver buffers size and count */
+/* Definition of the Ethernet driver buffers size and count */
#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
@@ -177,9 +123,9 @@
/* Section 2: PHY configuration section */
-/* LAN8742A_PHY_ADDRESS Address*/
+/* LAN8742A_PHY_ADDRESS Address*/
#define LAN8742A_PHY_ADDRESS 0
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
+/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
#define PHY_RESET_DELAY ((uint32_t)0x000000FFU)
/* PHY Configuration delay */
#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU)
@@ -191,7 +137,7 @@
#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */
#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */
-
+
#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
@@ -206,7 +152,7 @@
#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
-
+
/* Section 4: Extended PHY Registers */
#define PHY_SR ((uint16_t)0x1FU) /*!< PHY status register Offset */
@@ -214,7 +160,7 @@
#define PHY_DUPLEX_STATUS ((uint16_t)0x0010U) /*!< PHY Duplex mask */
#define PHY_ISFR ((uint16_t)0x001DU) /*!< PHY Interrupt Source Flag register Offset */
-#define PHY_ISFR_INT4 ((uint16_t)0x000BU) /*!< PHY Link down inturrupt */
+#define PHY_ISFR_INT4 ((uint16_t)0x000BU) /*!< PHY Link down inturrupt */
/* ################## SPI peripheral configuration ########################## */
@@ -227,7 +173,7 @@
/* Includes ------------------------------------------------------------------*/
/**
- * @brief Include module's header file
+ * @brief Include module's header file
*/
#ifdef HAL_RCC_MODULE_ENABLED
@@ -245,7 +191,7 @@
#ifdef HAL_DMA_MODULE_ENABLED
#include "stm32f7xx_hal_dma.h"
#endif /* HAL_DMA_MODULE_ENABLED */
-
+
#ifdef HAL_CORTEX_MODULE_ENABLED
#include "stm32f7xx_hal_cortex.h"
#endif /* HAL_CORTEX_MODULE_ENABLED */
@@ -267,7 +213,7 @@
#endif /* HAL_CRC_MODULE_ENABLED */
#ifdef HAL_CRYP_MODULE_ENABLED
- #include "stm32f7xx_hal_cryp.h"
+ #include "stm32f7xx_hal_cryp.h"
#endif /* HAL_CRYP_MODULE_ENABLED */
#ifdef HAL_DMA2D_MODULE_ENABLED
@@ -289,7 +235,7 @@
#ifdef HAL_FLASH_MODULE_ENABLED
#include "stm32f7xx_hal_flash.h"
#endif /* HAL_FLASH_MODULE_ENABLED */
-
+
#ifdef HAL_SRAM_MODULE_ENABLED
#include "stm32f7xx_hal_sram.h"
#endif /* HAL_SRAM_MODULE_ENABLED */
@@ -304,7 +250,7 @@
#ifdef HAL_SDRAM_MODULE_ENABLED
#include "stm32f7xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */
+#endif /* HAL_SDRAM_MODULE_ENABLED */
#ifdef HAL_HASH_MODULE_ENABLED
#include "stm32f7xx_hal_hash.h"
@@ -412,7 +358,7 @@
#ifdef HAL_MDIOS_MODULE_ENABLED
#include "stm32f7xx_hal_mdios.h"
-#endif /* HAL_MDIOS_MODULE_ENABLED */
+#endif /* HAL_MDIOS_MODULE_ENABLED */
#ifdef HAL_SMBUS_MODULE_ENABLED
#include "stm32f7xx_hal_smbus.h"
@@ -424,7 +370,7 @@
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
- * line number of the call that failed.
+ * line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
@@ -439,7 +385,14 @@
}
#endif
+// CircuitPython specific conditionals. Using a value is better than checking
+// defined because undefined variable happen when a file isn't included when it
+// should have been.
+#define CPY_STM32F4 0
+#define CPY_STM32F7 1
+#define CPY_STM32H7 0
+
#endif /* __STM32F7xx_HAL_CONF_H */
-
+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/boards/nucleo_h743zi_2/stm32h7xx_hal_conf.h b/ports/stm/hal_conf/stm32h7xx_hal_conf.h
index e6a2dd5f8..a0328610c 100644
--- a/ports/stm/boards/nucleo_h743zi_2/stm32h7xx_hal_conf.h
+++ b/ports/stm/hal_conf/stm32h7xx_hal_conf.h
@@ -15,7 +15,9 @@
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
- */
+ */
+
+#include "stm32_hal_conf.h"
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32H7xx_HAL_CONF_H
@@ -28,81 +30,13 @@
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
-/* ########################## Module Selection ############################## */
-/**
- * @brief This is the list of modules to be used in the HAL driver
- */
-#define HAL_MODULE_ENABLED
-
- #define HAL_ADC_MODULE_ENABLED
-/* #define HAL_FDCAN_MODULE_ENABLED */
-/* #define HAL_CEC_MODULE_ENABLED */
-/* #define HAL_COMP_MODULE_ENABLED */
-/* #define HAL_CRC_MODULE_ENABLED */
-/* #define HAL_CRYP_MODULE_ENABLED */
-#define HAL_DAC_MODULE_ENABLED
-/* #define HAL_DCMI_MODULE_ENABLED */
-/* #define HAL_DMA2D_MODULE_ENABLED */
-#define HAL_ETH_MODULE_ENABLED
-/* #define HAL_NAND_MODULE_ENABLED */
-/* #define HAL_NOR_MODULE_ENABLED */
-/* #define HAL_OTFDEC_MODULE_ENABLED */
-/* #define HAL_SRAM_MODULE_ENABLED */
-/* #define HAL_SDRAM_MODULE_ENABLED */
-/* #define HAL_HASH_MODULE_ENABLED */
-/* #define HAL_HRTIM_MODULE_ENABLED */
-/* #define HAL_HSEM_MODULE_ENABLED */
-/* #define HAL_GFXMMU_MODULE_ENABLED */
-/* #define HAL_JPEG_MODULE_ENABLED */
-/* #define HAL_OPAMP_MODULE_ENABLED */
-/* #define HAL_OSPI_MODULE_ENABLED */
-/* #define HAL_OSPI_MODULE_ENABLED */
-/* #define HAL_I2S_MODULE_ENABLED */
-/* #define HAL_SMBUS_MODULE_ENABLED */
-/* #define HAL_IWDG_MODULE_ENABLED */
-/* #define HAL_LPTIM_MODULE_ENABLED */
-/* #define HAL_LTDC_MODULE_ENABLED */
-/* #define HAL_QSPI_MODULE_ENABLED */
-#define HAL_RNG_MODULE_ENABLED
-/* #define HAL_RTC_MODULE_ENABLED */
-/* #define HAL_SAI_MODULE_ENABLED */
-/* #define HAL_SD_MODULE_ENABLED */
-/* #define HAL_MMC_MODULE_ENABLED */
-/* #define HAL_SPDIFRX_MODULE_ENABLED */
-#define HAL_SPI_MODULE_ENABLED
-/* #define HAL_SWPMI_MODULE_ENABLED */
-#define HAL_TIM_MODULE_ENABLED
-#define HAL_UART_MODULE_ENABLED
-/* #define HAL_USART_MODULE_ENABLED */
-/* #define HAL_IRDA_MODULE_ENABLED */
-/* #define HAL_SMARTCARD_MODULE_ENABLED */
-/* #define HAL_WWDG_MODULE_ENABLED */
-#define HAL_PCD_MODULE_ENABLED
-/* #define HAL_HCD_MODULE_ENABLED */
-/* #define HAL_DFSDM_MODULE_ENABLED */
-/* #define HAL_DSI_MODULE_ENABLED */
-/* #define HAL_JPEG_MODULE_ENABLED */
-/* #define HAL_MDIOS_MODULE_ENABLED */
-/* #define HAL_PSSI_MODULE_ENABLED */
-/* #define HAL_DTS_MODULE_ENABLED */
-#define HAL_GPIO_MODULE_ENABLED
-#define HAL_DMA_MODULE_ENABLED
-#define HAL_MDMA_MODULE_ENABLED
-#define HAL_RCC_MODULE_ENABLED
-#define HAL_FLASH_MODULE_ENABLED
-#define HAL_EXTI_MODULE_ENABLED
-#define HAL_PWR_MODULE_ENABLED
-#define HAL_I2C_MODULE_ENABLED
-#define HAL_CORTEX_MODULE_ENABLED
-#define HAL_HSEM_MODULE_ENABLED
-
/* ########################## Oscillator Values adaptation ####################*/
/**
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSE is used as system clock source, directly or through the PLL).
+ * (when HSE is used as system clock source, directly or through the PLL).
*/
-#if !defined (HSE_VALUE)
+#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */
#endif /* HSE_VALUE */
@@ -117,17 +51,26 @@
#if !defined (CSI_VALUE)
#define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
#endif /* CSI_VALUE */
-
+
/**
* @brief Internal High Speed oscillator (HSI) value.
* This value is used by the RCC HAL module to compute the system frequency
- * (when HSI is used as system clock source, directly or through the PLL).
+ * (when HSI is used as system clock source, directly or through the PLL).
*/
#if !defined (HSI_VALUE)
#define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */
/**
+ * @brief Internal Low Speed oscillator (LSI) value.
+ */
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/
+#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
* @brief External Low Speed oscillator (LSE) value.
* This value is used by the UART, RTC HAL module to compute the system frequency
*/
@@ -141,8 +84,8 @@
/**
* @brief External clock source for I2S peripheral
- * This value is used by the I2S HAL module to compute the I2S clock source
- * frequency, this source is inserted directly through I2S_CKIN pad.
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
*/
#if !defined (EXTERNAL_CLOCK_VALUE)
#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/
@@ -154,7 +97,7 @@
/* ########################### System Configuration ######################### */
/**
* @brief This is the HAL system configuration section
- */
+ */
#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
#define USE_RTOS 0U
@@ -220,14 +163,14 @@
/* ########################## Assert Selection ############################## */
/**
- * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
* HAL drivers code
*/
-/* #define USE_FULL_ASSERT 1U */
+/* #define USE_FULL_ASSERT 1U */
/* Includes ------------------------------------------------------------------*/
/**
- * @brief Include module's header file
+ * @brief Include module's header file
*/
#ifdef HAL_RCC_MODULE_ENABLED
@@ -373,7 +316,7 @@
#ifdef HAL_OSPI_MODULE_ENABLED
#include "stm32h7xx_hal_ospi.h"
#endif /* HAL_OSPI_MODULE_ENABLED */
-
+
#ifdef HAL_OTFDEC_MODULE_ENABLED
#include "stm32h7xx_hal_otfdec.h"
#endif /* HAL_OTFDEC_MODULE_ENABLED */
@@ -472,7 +415,7 @@
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
- * line number of the call that failed.
+ * line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
@@ -487,7 +430,14 @@
}
#endif
+// CircuitPython specific conditionals. Using a value is better than checking
+// defined because undefined variable happen when a file isn't included when it
+// should have been.
+#define CPY_STM32F4 0
+#define CPY_STM32F7 0
+#define CPY_STM32H7 1
+
#endif /* __STM32H7xx_HAL_CONF_H */
-
+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/ports/stm/mpconfigport.h b/ports/stm/mpconfigport.h
index f570d32e5..e054ffbb5 100644
--- a/ports/stm/mpconfigport.h
+++ b/ports/stm/mpconfigport.h
@@ -44,27 +44,6 @@ extern uint8_t _ld_default_stack_size;
#include "py/circuitpy_mpconfig.h"
-// The STM32 HAL file is included virtually everywhere:
-#include STM32_HAL_H
-
-// These prevent you from accidentally omitting a python file that links mpconfigport
-// and having a file accept a lack of chip family as an option.
-#if defined(STM32F4)
-#define CPY_STM32F4 1
-#define CPY_STM32F7 0
-#define CPY_STM32H7 0
-#elif defined(STM32F7)
-#define CPY_STM32F4 0
-#define CPY_STM32F7 1
-#define CPY_STM32H7 0
-#elif defined(STM32H7)
-#define CPY_STM32F4 0
-#define CPY_STM32F7 0
-#define CPY_STM32H7 1
-#else
-#error undefined processor
-#endif
-
// Board flags:
#ifndef BOARD_OVERWRITE_SWD
#define BOARD_OVERWRITE_SWD (0)
diff --git a/ports/stm/mphalport.c b/ports/stm/mphalport.c
index 3ee56e22a..bb62b0798 100644
--- a/ports/stm/mphalport.c
+++ b/ports/stm/mphalport.c
@@ -34,21 +34,6 @@
#include "shared-bindings/microcontroller/__init__.h"
#include "supervisor/shared/tick.h"
-void mp_hal_delay_ms(mp_uint_t delay) {
- uint64_t start_tick = supervisor_ticks_ms64();
- uint64_t duration = 0;
- while (duration < delay) {
- RUN_BACKGROUND_TASKS;
- // Check to see if we've been CTRL-Ced by autoreload or the user.
- if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
- MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
- break;
- }
- duration = (supervisor_ticks_ms64() - start_tick);
- // TODO(tannewt): Go to sleep for a little while while we wait.
- }
-}
-
void mp_hal_delay_us(mp_uint_t delay) {
common_hal_mcu_delay_us(delay);
}
diff --git a/ports/stm/peripherals/stm32f4/stm32f401xe/clocks.c b/ports/stm/peripherals/stm32f4/stm32f401xe/clocks.c
index d048d60e8..194992e81 100644
--- a/ports/stm/peripherals/stm32f4/stm32f401xe/clocks.c
+++ b/ports/stm/peripherals/stm32f4/stm32f401xe/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
void stm32_peripherals_clocks_init(void) {
//System clock init
diff --git a/ports/stm/peripherals/stm32f4/stm32f405xx/clocks.c b/ports/stm/peripherals/stm32f4/stm32f405xx/clocks.c
index 5f4fd2783..f4c583068 100644
--- a/ports/stm/peripherals/stm32f4/stm32f405xx/clocks.c
+++ b/ports/stm/peripherals/stm32f4/stm32f405xx/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
void stm32_peripherals_clocks_init(void) {
//System clock init
@@ -56,7 +56,9 @@ void stm32_peripherals_clocks_init(void) {
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ // APB1 must always be on so that we can talk to the RTC for timing.
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
+ // TODO: Only turn on APB2 when it is needed to save power.
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
diff --git a/ports/stm/peripherals/stm32f4/stm32f407xx/clocks.c b/ports/stm/peripherals/stm32f4/stm32f407xx/clocks.c
index 5f4fd2783..a545aaec5 100644
--- a/ports/stm/peripherals/stm32f4/stm32f407xx/clocks.c
+++ b/ports/stm/peripherals/stm32f4/stm32f407xx/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
void stm32_peripherals_clocks_init(void) {
//System clock init
diff --git a/ports/stm/peripherals/stm32f4/stm32f411xe/clocks.c b/ports/stm/peripherals/stm32f4/stm32f411xe/clocks.c
index d048d60e8..194992e81 100644
--- a/ports/stm/peripherals/stm32f4/stm32f411xe/clocks.c
+++ b/ports/stm/peripherals/stm32f4/stm32f411xe/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
void stm32_peripherals_clocks_init(void) {
//System clock init
diff --git a/ports/stm/peripherals/stm32f4/stm32f411xe/gpio.c b/ports/stm/peripherals/stm32f4/stm32f411xe/gpio.c
index 201a90e34..9aabffa9f 100644
--- a/ports/stm/peripherals/stm32f4/stm32f411xe/gpio.c
+++ b/ports/stm/peripherals/stm32f4/stm32f411xe/gpio.c
@@ -25,7 +25,7 @@
*/
#include "peripherals/gpio.h"
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
#include "common-hal/microcontroller/Pin.h"
void stm32_peripherals_gpio_init(void) {
@@ -38,16 +38,18 @@ void stm32_peripherals_gpio_init(void) {
__HAL_RCC_GPIOD_CLK_ENABLE();
//Never reset pins
+ // TODO: Move this out of peripherals. These helpers shouldn't reference anything CircuitPython
+ // specific.
never_reset_pin_number(2,14); //PC14 OSC32_IN
never_reset_pin_number(2,15); //PC15 OSC32_OUT
- #if !(BOARD_OVERWRITE_SWD)
+ #if !(BOARD_OVERWRITE_SWD)
never_reset_pin_number(0,13); //PA13 SWDIO
never_reset_pin_number(0,14); //PA14 SWCLK
#endif
// Port H is not included in GPIO port array
- // never_reset_pin_number(5,0); //PH0 JTDO
+ // never_reset_pin_number(5,0); //PH0 JTDO
// never_reset_pin_number(5,1); //PH1 JTRST
}
diff --git a/ports/stm/peripherals/stm32f4/stm32f412zx/clocks.c b/ports/stm/peripherals/stm32f4/stm32f412zx/clocks.c
index ad45abed2..6c4cb5b32 100644
--- a/ports/stm/peripherals/stm32f4/stm32f412zx/clocks.c
+++ b/ports/stm/peripherals/stm32f4/stm32f412zx/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f4xx_hal.h"
void stm32_peripherals_clocks_init(void) {
//System clock init
@@ -65,7 +65,7 @@ void stm32_peripherals_clocks_init(void) {
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
* clocks dividers */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |
- RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
diff --git a/ports/stm/peripherals/stm32f7/stm32f746xx/clocks.c b/ports/stm/peripherals/stm32f7/stm32f746xx/clocks.c
index b73a1a20d..2afa2e377 100644
--- a/ports/stm/peripherals/stm32f7/stm32f746xx/clocks.c
+++ b/ports/stm/peripherals/stm32f7/stm32f746xx/clocks.c
@@ -26,7 +26,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include STM32_HAL_H
#ifndef BOARD_OSC_DIV
#define BOARD_OSC_DIV (8)
diff --git a/ports/stm/peripherals/stm32f7/stm32f767xx/clocks.c b/ports/stm/peripherals/stm32f7/stm32f767xx/clocks.c
index a0d58f4fc..18b202df5 100644
--- a/ports/stm/peripherals/stm32f7/stm32f767xx/clocks.c
+++ b/ports/stm/peripherals/stm32f7/stm32f767xx/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32f7xx_hal.h"
void stm32_peripherals_clocks_init(void) {
RCC_ClkInitTypeDef RCC_ClkInitStruct;
diff --git a/ports/stm/peripherals/stm32h7/stm32h743xx/clocks.c b/ports/stm/peripherals/stm32h7/stm32h743xx/clocks.c
index d231f25d0..8ede6080e 100644
--- a/ports/stm/peripherals/stm32h7/stm32h743xx/clocks.c
+++ b/ports/stm/peripherals/stm32h7/stm32h743xx/clocks.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "py/mpconfig.h"
+#include "stm32h7xx_hal.h"
void stm32_peripherals_clocks_init(void) {
RCC_ClkInitTypeDef RCC_ClkInitStruct;
diff --git a/ports/stm/supervisor/internal_flash.c b/ports/stm/supervisor/internal_flash.c
index 8c04112c0..060eadecb 100644
--- a/ports/stm/supervisor/internal_flash.c
+++ b/ports/stm/supervisor/internal_flash.c
@@ -35,8 +35,11 @@
#include "py/obj.h"
#include "py/runtime.h"
#include "lib/oofatfs/ff.h"
+#include "supervisor/flash.h"
#include "supervisor/shared/safe_mode.h"
+#include STM32_HAL_H
+
typedef struct {
uint32_t base_address;
uint32_t sector_size;
@@ -122,7 +125,7 @@ STATIC uint32_t get_bank(uint32_t addr) {
}
#endif
-//Return the sector of a given flash address.
+//Return the sector of a given flash address.
uint32_t flash_get_sector_info(uint32_t addr, uint32_t *start_addr, uint32_t *size) {
if (addr >= flash_layout[0].base_address) {
uint32_t sector_index = 0;
@@ -158,7 +161,7 @@ uint32_t supervisor_flash_get_block_count(void) {
return INTERNAL_FLASH_FILESYSTEM_NUM_BLOCKS;
}
-void supervisor_flash_flush(void) {
+void port_internal_flash_flush(void) {
if (_cache_flash_addr == NO_CACHE) return;
#if defined(STM32H7)
@@ -202,7 +205,7 @@ void supervisor_flash_flush(void) {
#if defined(STM32H7)
for (uint32_t i = 0; i < (sector_size / 32); i++) {
// Note that the STM32H7 HAL interface differs by taking an address, not 64 bit data
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, sector_start_addr,
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, sector_start_addr,
(uint32_t)cache_addr) != HAL_OK) {
// error occurred during flash write
HAL_FLASH_Lock(); // lock the flash
@@ -216,7 +219,7 @@ void supervisor_flash_flush(void) {
#else // STM32F4
// program the flash word by word
for (uint32_t i = 0; i < sector_size / 4; i++) {
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, sector_start_addr,
+ if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, sector_start_addr,
(uint64_t)*cache_addr) != HAL_OK) {
// error occurred during flash write
HAL_FLASH_Lock(); // lock the flash
@@ -260,7 +263,7 @@ mp_uint_t supervisor_flash_read_blocks(uint8_t *dest, uint32_t block, uint32_t n
if (count < num_blocks && _cache_flash_addr == sector_start_addr) {
// Read is contained in the cache, so just read cache
memcpy(dest, (_flash_cache + (src-sector_start_addr)), FILESYSTEM_BLOCK_SIZE*num_blocks);
- } else {
+ } else {
// The read spans multiple sectors or is in another sector
// Must write out anything in cache before trying to read.
supervisor_flash_flush();
diff --git a/ports/stm/supervisor/port.c b/ports/stm/supervisor/port.c
index 21ff0b575..779348c02 100644
--- a/ports/stm/supervisor/port.c
+++ b/ports/stm/supervisor/port.c
@@ -28,7 +28,7 @@
#include <stdint.h>
#include "supervisor/port.h"
#include "boards/board.h"
-#include "tick.h"
+#include "lib/timeutils/timeutils.h"
#include "common-hal/microcontroller/Pin.h"
@@ -46,6 +46,8 @@
#include "clocks.h"
#include "gpio.h"
+#include STM32_HAL_H
+
//only enable the Reset Handler overwrite for the H7 for now
#if defined(STM32H7)
@@ -101,7 +103,7 @@ __attribute__((used, naked)) void Reset_Handler(void) {
// The first number in RBAR is the region number. When searching for a policy, the region with
// the highest number wins. If none match, then the default policy set at enable applies.
- // Mark all the flash the same until instructed otherwise.
+ // Mark all the flash the same until instructed otherwise.
MPU->RBAR = ARM_MPU_RBAR(11, 0x08000000U);
MPU->RASR = ARM_MPU_RASR(EXECUTION, ARM_MPU_AP_FULL, NORMAL, NOT_SHAREABLE, CACHEABLE, BUFFERABLE, NO_SUBREGIONS, ARM_MPU_REGION_SIZE_2MB);
@@ -148,10 +150,18 @@ __attribute__((used, naked)) void Reset_Handler(void) {
#endif //end H7 specific code
+static RTC_HandleTypeDef _hrtc;
+
+#if BOARD_HAS_LOW_SPEED_CRYSTAL
+#define RTC_CLOCK_FREQUENCY LSE_VALUE
+#else
+#define RTC_CLOCK_FREQUENCY LSI_VALUE
+#endif
+
safe_mode_t port_init(void) {
HAL_Init();
__HAL_RCC_SYSCFG_CLK_ENABLE();
-
+
#if defined(STM32F4)
__HAL_RCC_PWR_CLK_ENABLE();
#endif
@@ -159,11 +169,40 @@ safe_mode_t port_init(void) {
stm32_peripherals_clocks_init();
stm32_peripherals_gpio_init();
- tick_init();
+ HAL_PWR_EnableBkUpAccess();
+ #if BOARD_HAS_LOW_SPEED_CRYSTAL
+ __HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
+ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) {}
+ #else
+ __HAL_RCC_LSI_ENABLE();
+ #endif
+ #if BOARD_HAS_LOW_SPEED_CRYSTAL
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
+ #else
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSI);
+ #endif
+ __HAL_RCC_RTC_ENABLE();
+ _hrtc.Instance = RTC;
+ _hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ // Divide async as little as possible so that we have RTC_CLOCK_FREQUENCY count in subseconds.
+ // This ensures our timing > 1 second is correct.
+ _hrtc.Init.AsynchPrediv = 0x0;
+ _hrtc.Init.SynchPrediv = RTC_CLOCK_FREQUENCY - 1;
+ _hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+
+ HAL_RTC_Init(&_hrtc);
+
+ HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
return NO_SAFE_MODE;
}
+void SysTick_Handler(void) {
+ // Read the CTRL register to clear the SysTick interrupt.
+ SysTick->CTRL;
+ HAL_IncTick();
+}
+
void reset_port(void) {
reset_all_pins();
#if CIRCUITPY_BUSIO
@@ -174,7 +213,7 @@ void reset_port(void) {
#if CIRCUITPY_PULSEIO
pwmout_reset();
pulseout_reset();
- pulsein_reset();
+ pulsein_reset();
#endif
}
@@ -197,7 +236,7 @@ uint32_t *port_heap_get_top(void) {
}
uint32_t *port_stack_get_limit(void) {
- return &_ld_stack_bottom;
+ return &_ld_stack_bottom;
}
uint32_t *port_stack_get_top(void) {
@@ -247,6 +286,117 @@ __attribute__((used)) void HardFault_Handler(void)
}
}
+// This function is called often for timing so we cache the seconds elapsed computation based on the
+// register value. The STM HAL always does shifts and conversion if we use it directly.
+volatile uint32_t seconds_to_date = 0;
+volatile uint32_t cached_date = 0;
+volatile uint32_t seconds_to_minute = 0;
+volatile uint32_t cached_hours_minutes = 0;
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ uint32_t subseconds = RTC_CLOCK_FREQUENCY - (uint32_t)(RTC->SSR);
+ uint32_t time = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK);
+ uint32_t date = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK);
+ if (date != cached_date) {
+ uint32_t year = (uint8_t)((date & (RTC_DR_YT | RTC_DR_YU)) >> 16U);
+ uint8_t month = (uint8_t)((date & (RTC_DR_MT | RTC_DR_MU)) >> 8U);
+ uint8_t day = (uint8_t)(date & (RTC_DR_DT | RTC_DR_DU));
+ // Add 2000 since the year is only the last two digits.
+ year = 2000 + (uint32_t)RTC_Bcd2ToByte(year);
+ month = (uint8_t)RTC_Bcd2ToByte(month);
+ day = (uint8_t)RTC_Bcd2ToByte(day);
+ seconds_to_date = timeutils_seconds_since_2000(year, month, day, 0, 0, 0);
+ cached_date = date;
+ }
+ uint32_t hours_minutes = time & (RTC_TR_HT | RTC_TR_HU | RTC_TR_MNT | RTC_TR_MNU);
+ if (hours_minutes != cached_hours_minutes) {
+ uint8_t hours = (uint8_t)((time & (RTC_TR_HT | RTC_TR_HU)) >> 16U);
+ uint8_t minutes = (uint8_t)((time & (RTC_TR_MNT | RTC_TR_MNU)) >> 8U);
+ hours = (uint8_t)RTC_Bcd2ToByte(hours);
+ minutes = (uint8_t)RTC_Bcd2ToByte(minutes);
+ seconds_to_minute = 60 * (60 * hours + minutes);
+ }
+ uint8_t seconds = (uint8_t)(time & (RTC_TR_ST | RTC_TR_SU));
+ seconds = (uint8_t)RTC_Bcd2ToByte(seconds);
+ if (subticks != NULL) {
+ *subticks = subseconds % 32;
+ }
+
+ uint64_t raw_ticks = ((uint64_t) 1024) * (seconds_to_date + seconds_to_minute + seconds) + subseconds / 32;
+ return raw_ticks;
+}
+
+void RTC_WKUP_IRQHandler(void) {
+ supervisor_tick();
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&_hrtc, RTC_FLAG_WUTF);
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
+}
+
+volatile bool alarmed_already = false;
+void RTC_Alarm_IRQHandler(void) {
+ HAL_RTC_DeactivateAlarm(&_hrtc, RTC_ALARM_A);
+ __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();
+ __HAL_RTC_ALARM_CLEAR_FLAG(&_hrtc, RTC_FLAG_ALRAF);
+ alarmed_already = true;
+}
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void) {
+ HAL_RTCEx_SetWakeUpTimer_IT(&_hrtc, RTC_CLOCK_FREQUENCY / 1024 / 2, RTC_WAKEUPCLOCK_RTCCLK_DIV2);
+ HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 1, 0U);
+ HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
+}
+extern volatile uint32_t autoreload_delay_ms;
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void) {
+ HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn);
+ HAL_RTCEx_DeactivateWakeUpTimer(&_hrtc);
+}
+
+void port_interrupt_after_ticks(uint32_t ticks) {
+ uint64_t raw_ticks = port_get_raw_ticks(NULL) + ticks;
+
+ RTC_AlarmTypeDef alarm;
+ if (ticks > 1024) {
+ timeutils_struct_time_t tm;
+ timeutils_seconds_since_2000_to_struct_time(raw_ticks / 1024, &tm);
+ alarm.AlarmTime.Hours = tm.tm_hour;
+ alarm.AlarmTime.Minutes = tm.tm_min;
+ alarm.AlarmTime.Seconds = tm.tm_sec;
+ alarm.AlarmDateWeekDay = tm.tm_mday;
+ // Masking here means that the value is ignored so we set none.
+ alarm.AlarmMask = RTC_ALARMMASK_NONE;
+ } else {
+ // Masking here means that the value is ignored so we set them all. Only the subseconds
+ // value matters.
+ alarm.AlarmMask = RTC_ALARMMASK_ALL;
+ }
+
+ alarm.AlarmTime.SubSeconds = RTC_CLOCK_FREQUENCY -
+ ((raw_ticks % 1024) * 32);
+ alarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
+ alarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_SET;
+ // Masking here means that the bits are ignored so we set none of them.
+ alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
+ alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
+ alarm.Alarm = RTC_ALARM_A;
+
+ HAL_RTC_SetAlarm_IT(&_hrtc, &alarm, RTC_FORMAT_BIN);
+ alarmed_already = false;
+}
+
+void port_sleep_until_interrupt(void) {
+ // Clear the FPU interrupt because it can prevent us from sleeping.
+ if (__get_FPSCR() & ~(0x9f)) {
+ __set_FPSCR(__get_FPSCR() & ~(0x9f));
+ (void) __get_FPSCR();
+ }
+ if (alarmed_already) {
+ return;
+ }
+ __WFI();
+}
+
// Required by __libc_init_array in startup code if we are compiling using
// -nostdlib/-nostartfiles.
void _init(void)
diff --git a/ports/stm/supervisor/usb.c b/ports/stm/supervisor/usb.c
index b2f3ad86b..3dd0acafd 100644
--- a/ports/stm/supervisor/usb.c
+++ b/ports/stm/supervisor/usb.c
@@ -26,7 +26,6 @@
*/
-#include "tick.h"
#include "supervisor/usb.h"
#include "lib/utils/interrupt_char.h"
#include "lib/mp-readline/readline.h"
@@ -119,7 +118,6 @@ void init_usb_hardware(void) {
never_reset_pin_number(0, 8);
#endif
-
#if CPY_STM32H7
HAL_PWREx_EnableUSBVoltageDetector();
__HAL_RCC_USB2_OTG_FS_CLK_ENABLE();
diff --git a/ports/stm/tick.c b/ports/stm/tick.c
deleted file mode 100644
index 67adc84e3..000000000
--- a/ports/stm/tick.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-#include "tick.h"
-
-#include "supervisor/filesystem.h"
-#include "supervisor/shared/tick.h"
-#include "shared-bindings/microcontroller/Processor.h"
-
-void SysTick_Handler(void) {
- // SysTick interrupt handler called when the SysTick timer reaches zero
- // (every millisecond).
-
- // Do things common to all ports when the tick occurs
- supervisor_tick();
-}
-
-uint32_t HAL_GetTick(void) //override ST HAL
-{
- return (uint32_t)supervisor_ticks_ms32();
-}
-
-void tick_init() {
- uint32_t ticks_per_ms = SystemCoreClock/ 1000;
- SysTick_Config(ticks_per_ms); // interrupt is enabled
-
- NVIC_EnableIRQ(SysTick_IRQn);
- // Bump up the systick interrupt so nothing else interferes with timekeeping.
- NVIC_SetPriority(SysTick_IRQn, 0);
- NVIC_SetPriority(OTG_FS_IRQn, 1);
-}
-
-void tick_delay(uint32_t us) {
- uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- uint32_t us_between_ticks = SysTick->VAL / ticks_per_us;
- uint64_t start_ms = supervisor_ticks_ms64();
- while (us > 1000) {
- while (supervisor_ticks_ms64() == start_ms) {}
- us -= us_between_ticks;
- start_ms = supervisor_ticks_ms64();
- us_between_ticks = 1000;
- }
- while (SysTick->VAL > ((us_between_ticks - us) * ticks_per_us)) {}
-}
-
-// us counts down!
-void current_tick(uint64_t* ms, uint32_t* us_until_ms) {
- uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- *ms = supervisor_ticks_ms32();
- *us_until_ms = SysTick->VAL / ticks_per_us;
-}
-
-void wait_until(uint64_t ms, uint32_t us_until_ms) {
- uint32_t ticks_per_us = SystemCoreClock / 1000 / 1000;
- while(supervisor_ticks_ms64() <= ms && SysTick->VAL / ticks_per_us >= us_until_ms) {}
-}
diff --git a/ports/stm/tick.h b/ports/stm/tick.h
deleted file mode 100644
index 17e96362d..000000000
--- a/ports/stm/tick.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-#ifndef MICROPY_INCLUDED_STM32_TICK_H
-#define MICROPY_INCLUDED_STM32_TICK_H
-
-#include "py/mpconfig.h"
-
-#include <stdint.h>
-
-extern struct timer_descriptor ms_timer;
-
-void tick_init(void);
-
-void tick_delay(uint32_t us);
-
-void current_tick(uint64_t* ms, uint32_t* us_until_ms);
-// Do not call this with interrupts disabled because it may be waiting for
-// ticks_ms to increment.
-void wait_until(uint64_t ms, uint32_t us_until_ms);
-
-#endif // MICROPY_INCLUDED_STM32_TICK_H
diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk
index 78ab41e12..ec8e6c3e9 100644
--- a/py/circuitpy_defns.mk
+++ b/py/circuitpy_defns.mk
@@ -290,8 +290,7 @@ SRC_COMMON_HAL_ALL = \
rtc/RTC.c \
rtc/__init__.c \
supervisor/Runtime.c \
- supervisor/__init__.c \
- time/__init__.c
+ supervisor/__init__.c
SRC_COMMON_HAL = $(filter $(SRC_PATTERNS), $(SRC_COMMON_HAL_ALL))
@@ -309,7 +308,7 @@ $(filter $(SRC_PATTERNS), \
fontio/Glyph.c \
microcontroller/RunMode.c \
math/__init__.c \
- _eve/__init__.c \
+ _eve/__init__.c \
)
SRC_BINDINGS_ENUMS += \
@@ -370,13 +369,14 @@ SRC_SHARED_MODULE_ALL = \
rgbmatrix/__init__.c \
storage/__init__.c \
struct/__init__.c \
+ time/__init__.c \
terminalio/Terminal.c \
terminalio/__init__.c \
uheap/__init__.c \
ustack/__init__.c \
_pew/__init__.c \
_pew/PewPew.c \
- _eve/__init__.c
+ _eve/__init__.c
# All possible sources are listed here, and are filtered by SRC_PATTERNS.
SRC_SHARED_MODULE = $(filter $(SRC_PATTERNS), $(SRC_SHARED_MODULE_ALL))
diff --git a/py/py.mk b/py/py.mk
index bca6ac14c..ec0625db6 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -107,6 +107,7 @@ endif
ifeq ($(CIRCUITPY_ULAB),1)
SRC_MOD += $(addprefix extmod/ulab/code/, \
+compare.c \
create.c \
extras.c \
fft.c \
diff --git a/shared-bindings/board/__init__.c b/shared-bindings/board/__init__.c
index 3dda59fb8..28d3f7c91 100644
--- a/shared-bindings/board/__init__.c
+++ b/shared-bindings/board/__init__.c
@@ -113,7 +113,7 @@ mp_obj_t board_uart(void) {
}
#else
mp_obj_t board_uart(void) {
- mp_raise_NotImplementedError_varg(translate("No default %q bus"), MP_QSTR_SPI);
+ mp_raise_NotImplementedError_varg(translate("No default %q bus"), MP_QSTR_UART);
return NULL;
}
#endif
diff --git a/shared-bindings/neopixel_write/__init__.h b/shared-bindings/neopixel_write/__init__.h
index 39b565ee2..9799e3413 100644
--- a/shared-bindings/neopixel_write/__init__.h
+++ b/shared-bindings/neopixel_write/__init__.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef SAMD_NEOPIXEL_WRITE_H
-#define SAMD_NEOPIXEL_WRITE_H
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_NEOPIXEL_WRITE_H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_NEOPIXEL_WRITE_H
#include <stdint.h>
#include <stdbool.h>
@@ -34,4 +34,4 @@
extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes);
-#endif
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_NEOPIXEL_WRITE_H
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index aaddbb471..da5713f8c 100644
--- a/shared-module/displayio/Display.c
+++ b/shared-module/displayio/Display.c
@@ -41,8 +41,6 @@
#include <stdint.h>
#include <string.h>
-#include "tick.h"
-
void common_hal_displayio_display_construct(displayio_display_obj_t* self,
mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart,
uint16_t rotation, uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row,
diff --git a/shared-module/displayio/EPaperDisplay.c b/shared-module/displayio/EPaperDisplay.c
index 5b4a8f916..6a55687b9 100644
--- a/shared-module/displayio/EPaperDisplay.c
+++ b/shared-module/displayio/EPaperDisplay.c
@@ -42,8 +42,6 @@
#include <stdint.h>
#include <string.h>
-#include "tick.h"
-
void common_hal_displayio_epaperdisplay_construct(displayio_epaperdisplay_obj_t* self,
mp_obj_t bus, uint8_t* start_sequence, uint16_t start_sequence_len, uint8_t* stop_sequence, uint16_t stop_sequence_len,
uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height,
diff --git a/shared-module/displayio/FourWire.c b/shared-module/displayio/FourWire.c
index fe7234aa7..17e8cfa1d 100644
--- a/shared-module/displayio/FourWire.c
+++ b/shared-module/displayio/FourWire.c
@@ -36,8 +36,6 @@
#include "shared-bindings/time/__init__.h"
#include "shared-module/displayio/display_core.h"
-#include "tick.h"
-
void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self,
busio_spi_obj_t* spi, const mcu_pin_obj_t* command,
const mcu_pin_obj_t* chip_select, const mcu_pin_obj_t* reset, uint32_t baudrate,
diff --git a/shared-module/displayio/I2CDisplay.c b/shared-module/displayio/I2CDisplay.c
index 280476f19..0c8f2e69a 100644
--- a/shared-module/displayio/I2CDisplay.c
+++ b/shared-module/displayio/I2CDisplay.c
@@ -38,8 +38,6 @@
#include "shared-bindings/time/__init__.h"
#include "shared-module/displayio/display_core.h"
-#include "tick.h"
-
void common_hal_displayio_i2cdisplay_construct(displayio_i2cdisplay_obj_t* self,
busio_i2c_obj_t* i2c, uint16_t device_address, const mcu_pin_obj_t* reset) {
diff --git a/shared-module/displayio/display_core.c b/shared-module/displayio/display_core.c
index 4cc7564d0..d01100f7f 100644
--- a/shared-module/displayio/display_core.c
+++ b/shared-module/displayio/display_core.c
@@ -40,8 +40,6 @@
#include <stdint.h>
#include <string.h>
-#include "tick.h"
-
void displayio_display_core_construct(displayio_display_core_t* self,
mp_obj_t bus, uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height, int16_t colstart, int16_t rowstart, uint16_t rotation,
uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row, uint8_t bytes_per_cell, bool reverse_pixels_in_byte, bool reverse_bytes_in_word) {
diff --git a/shared-module/framebufferio/FramebufferDisplay.c b/shared-module/framebufferio/FramebufferDisplay.c
index 13fbb2629..2a88b5307 100644
--- a/shared-module/framebufferio/FramebufferDisplay.c
+++ b/shared-module/framebufferio/FramebufferDisplay.c
@@ -40,8 +40,6 @@
#include <stdint.h>
#include <string.h>
-#include "tick.h"
-
void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebufferdisplay_obj_t* self,
mp_obj_t framebuffer,
uint16_t rotation,
diff --git a/ports/nrf/common-hal/time/__init__.c b/shared-module/time/__init__.c
index c85077868..347e68ae0 100644
--- a/ports/nrf/common-hal/time/__init__.c
+++ b/shared-module/time/__init__.c
@@ -25,19 +25,19 @@
*/
#include "py/mphal.h"
-
-#include "tick.h"
+#include "supervisor/port.h"
+#include "supervisor/shared/tick.h"
uint64_t common_hal_time_monotonic(void) {
return supervisor_ticks_ms64();
}
uint64_t common_hal_time_monotonic_ns(void) {
- uint64_t ms;
- uint32_t us_until_ms;
- current_tick(&ms, &us_until_ms);
- // us counts down.
- return 1000 * (ms * 1000 + (1000 - us_until_ms));
+ uint8_t subticks = 0;
+ uint64_t ticks = port_get_raw_ticks(&subticks);
+ // A tick is 976562.5 nanoseconds so multiply it by the base and add half instead of doing float
+ // math.
+ return 976562 * ticks + ticks / 2 + 30518 * subticks;
}
void common_hal_time_delay_ms(uint32_t delay) {
diff --git a/shared-module/usb_hid/Device.c b/shared-module/usb_hid/Device.c
index 8744f2ed3..8e9df6f04 100644
--- a/shared-module/usb_hid/Device.c
+++ b/shared-module/usb_hid/Device.c
@@ -25,7 +25,7 @@
*/
#include <string.h>
-#include "tick.h"
+
#include "py/runtime.h"
#include "shared-bindings/usb_hid/Device.h"
#include "shared-module/usb_hid/Device.h"
diff --git a/supervisor/flash.h b/supervisor/flash.h
index 0a124353e..a8a77bf04 100644
--- a/supervisor/flash.h
+++ b/supervisor/flash.h
@@ -34,7 +34,7 @@
#ifdef EXTERNAL_FLASH_DEVICE_COUNT
#include "supervisor/shared/external_flash/external_flash.h"
#else
-#include "supervisor/internal_flash.h"
+#include "supervisor/shared/internal_flash.h"
#endif
void supervisor_flash_init(void);
diff --git a/supervisor/port.h b/supervisor/port.h
index b289583dd..ccbb314ad 100644
--- a/supervisor/port.h
+++ b/supervisor/port.h
@@ -70,4 +70,22 @@ uint32_t *port_heap_get_top(void);
void port_set_saved_word(uint32_t);
uint32_t port_get_saved_word(void);
+// Get the raw tick count since start up. A tick is 1/1024 of a second, a common low frequency
+// clock rate. If subticks is not NULL then the port will fill in the number of subticks where each
+// tick is 32 subticks (for a resolution of 1/32768 or 30.5ish microseconds.)
+uint64_t port_get_raw_ticks(uint8_t* subticks);
+
+// Enable 1/1024 second tick.
+void port_enable_tick(void);
+
+// Disable 1/1024 second tick.
+void port_disable_tick(void);
+
+// Wake the CPU after the given number of ticks or sooner. Only the last call to this will apply.
+// Only the common sleep routine should use it.
+void port_interrupt_after_ticks(uint32_t ticks);
+
+// Sleep the CPU until an interrupt is received.
+void port_sleep_until_interrupt(void);
+
#endif // MICROPY_INCLUDED_SUPERVISOR_PORT_H
diff --git a/supervisor/shared/autoreload.c b/supervisor/shared/autoreload.c
index a6212c1a9..1976f6647 100644
--- a/supervisor/shared/autoreload.c
+++ b/supervisor/shared/autoreload.c
@@ -28,6 +28,7 @@
#include "py/mphal.h"
#include "py/reload.h"
+#include "supervisor/shared/tick.h"
static volatile uint32_t autoreload_delay_ms = 0;
static bool autoreload_enabled = false;
@@ -43,6 +44,7 @@ inline void autoreload_tick() {
!autoreload_suspended && !reload_requested) {
mp_raise_reload_exception();
reload_requested = true;
+ supervisor_disable_tick();
}
autoreload_delay_ms--;
}
@@ -69,6 +71,12 @@ inline bool autoreload_is_enabled() {
}
void autoreload_start() {
+ // Enable ticks if we haven't been tracking an autoreload delay. We check
+ // our current state so that we only turn ticks on once. Multiple starts
+ // can occur before we reload and then turn ticks off.
+ if (autoreload_delay_ms == 0) {
+ supervisor_enable_tick();
+ }
autoreload_delay_ms = CIRCUITPY_AUTORELOAD_DELAY_MS;
}
diff --git a/supervisor/shared/external_flash/external_flash.c b/supervisor/shared/external_flash/external_flash.c
index ce4792975..168bbbf68 100644
--- a/supervisor/shared/external_flash/external_flash.c
+++ b/supervisor/shared/external_flash/external_flash.c
@@ -23,11 +23,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-#include "external_flash.h"
+#include "supervisor/shared/external_flash/external_flash.h"
#include <stdint.h>
#include <string.h>
-#include "mpconfigboard.h"
+#include "supervisor/flash.h"
#include "supervisor/spi_flash_api.h"
#include "supervisor/shared/external_flash/common_commands.h"
#include "extmod/vfs.h"
@@ -482,7 +482,7 @@ static void spi_flash_flush_keep_cache(bool keep_cache) {
#endif
}
-void supervisor_flash_flush(void) {
+void supervisor_external_flash_flush(void) {
spi_flash_flush_keep_cache(true);
}
diff --git a/supervisor/shared/external_flash/external_flash.h b/supervisor/shared/external_flash/external_flash.h
index 72b619a2a..db5c677eb 100644
--- a/supervisor/shared/external_flash/external_flash.h
+++ b/supervisor/shared/external_flash/external_flash.h
@@ -45,4 +45,6 @@
#define SPI_FLASH_MAX_BAUDRATE 8000000
#endif
+void supervisor_external_flash_flush(void);
+
#endif // MICROPY_INCLUDED_SUPERVISOR_SHARED_EXTERNAL_FLASH_EXTERNAL_FLASH_H
diff --git a/supervisor/shared/flash.c b/supervisor/shared/flash.c
index 6b1f24b4b..298e7d83e 100644
--- a/supervisor/shared/flash.c
+++ b/supervisor/shared/flash.c
@@ -28,6 +28,7 @@
#include "extmod/vfs_fat.h"
#include "py/runtime.h"
#include "lib/oofatfs/ff.h"
+#include "supervisor/shared/tick.h"
#define VFS_INDEX 0
@@ -110,6 +111,8 @@ mp_uint_t flash_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_bloc
return supervisor_flash_read_blocks(dest, block_num - PART1_START_BLOCK, num_blocks);
}
+volatile bool filesystem_dirty = false;
+
mp_uint_t flash_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t num_blocks) {
if (block_num == 0) {
if (num_blocks > 1) {
@@ -118,10 +121,28 @@ mp_uint_t flash_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t nu
// can't write MBR, but pretend we did
return 0;
} else {
+ if (!filesystem_dirty) {
+ // Turn on ticks so that we can flush after a period of time elapses.
+ supervisor_enable_tick();
+ filesystem_dirty = true;
+ }
return supervisor_flash_write_blocks(src, block_num - PART1_START_BLOCK, num_blocks);
}
}
+void supervisor_flash_flush(void) {
+ #if INTERNAL_FLASH_FILESYSTEM
+ port_internal_flash_flush();
+ #else
+ supervisor_external_flash_flush();
+ #endif
+ // Turn off ticks now that our filesystem has been flushed.
+ if (filesystem_dirty) {
+ supervisor_disable_tick();
+ }
+ filesystem_dirty = false;
+}
+
STATIC mp_obj_t supervisor_flash_obj_readblocks(mp_obj_t self, mp_obj_t block_num, mp_obj_t buf) {
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(buf, &bufinfo, MP_BUFFER_WRITE);
diff --git a/ports/stm/common-hal/time/__init__.c b/supervisor/shared/internal_flash.h
index c85077868..80257a290 100644
--- a/ports/stm/common-hal/time/__init__.c
+++ b/supervisor/shared/internal_flash.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2020 Scott Shawcroft, for Adafruit Industries LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -23,23 +23,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
+#ifndef MICROPY_INCLUDED_SUPERVISOR_SHARED_INTERNAL_FLASH_H
+#define MICROPY_INCLUDED_SUPERVISOR_SHARED_INTERNAL_FLASH_H
-#include "py/mphal.h"
+#include "supervisor/internal_flash.h" // This is per-port.
-#include "tick.h"
+void port_internal_flash_flush(void);
-uint64_t common_hal_time_monotonic(void) {
- return supervisor_ticks_ms64();
-}
-
-uint64_t common_hal_time_monotonic_ns(void) {
- uint64_t ms;
- uint32_t us_until_ms;
- current_tick(&ms, &us_until_ms);
- // us counts down.
- return 1000 * (ms * 1000 + (1000 - us_until_ms));
-}
-
-void common_hal_time_delay_ms(uint32_t delay) {
- mp_hal_delay_ms(delay);
-}
+#endif // MICROPY_INCLUDED_SUPERVISOR_SHARED_INTERNAL_FLASH_H
diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c
index 5668f8fa1..dc38e76f6 100644
--- a/supervisor/shared/tick.c
+++ b/supervisor/shared/tick.c
@@ -26,12 +26,13 @@
#include "supervisor/shared/tick.h"
+#include "py/mpstate.h"
#include "supervisor/linker.h"
#include "supervisor/filesystem.h"
+#include "supervisor/port.h"
#include "supervisor/shared/autoreload.h"
-static volatile uint64_t PLACE_IN_DTCM_BSS(ticks_ms);
-static volatile uint32_t PLACE_IN_DTCM_BSS(background_ticks_ms32);
+static volatile uint64_t PLACE_IN_DTCM_BSS(background_ticks);
#if CIRCUITPY_GAMEPAD
#include "shared-module/gamepad/__init__.h"
@@ -44,9 +45,6 @@ static volatile uint32_t PLACE_IN_DTCM_BSS(background_ticks_ms32);
#include "shared-bindings/microcontroller/__init__.h"
void supervisor_tick(void) {
-
- ticks_ms ++;
-
#if CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS > 0
filesystem_tick();
#endif
@@ -54,7 +52,7 @@ void supervisor_tick(void) {
autoreload_tick();
#endif
#ifdef CIRCUITPY_GAMEPAD_TICKS
- if (!(ticks_ms & CIRCUITPY_GAMEPAD_TICKS)) {
+ if (!(port_get_raw_ticks(NULL) & CIRCUITPY_GAMEPAD_TICKS)) {
#if CIRCUITPY_GAMEPAD
gamepad_tick();
#endif
@@ -68,29 +66,70 @@ void supervisor_tick(void) {
uint64_t supervisor_ticks_ms64() {
uint64_t result;
common_hal_mcu_disable_interrupts();
- result = ticks_ms;
+ result = port_get_raw_ticks(NULL);
common_hal_mcu_enable_interrupts();
+ result = result * 1000 / 1024;
return result;
}
uint32_t supervisor_ticks_ms32() {
- return ticks_ms;
+ return supervisor_ticks_ms64();
}
extern void run_background_tasks(void);
void PLACE_IN_ITCM(supervisor_run_background_tasks_if_tick)() {
- uint32_t now32 = ticks_ms;
+ // TODO: Add a global that can be set by anyone to indicate we should run background tasks. That
+ // way we can short circuit the background tasks early. We used to do it based on time but it
+ // breaks cases where we wake up for a short period and then sleep. If we skipped the last
+ // background task or more before sleeping we may end up starving a task like USB.
+ run_background_tasks();
+}
- if (now32 == background_ticks_ms32) {
- return;
+void mp_hal_delay_ms(mp_uint_t delay) {
+ uint64_t start_tick = port_get_raw_ticks(NULL);
+ // Adjust the delay to ticks vs ms.
+ delay = delay * 1024 / 1000;
+ uint64_t end_tick = start_tick + delay;
+ int64_t remaining = delay;
+ while (remaining > 0) {
+ RUN_BACKGROUND_TASKS;
+ // Check to see if we've been CTRL-Ced by autoreload or the user.
+ if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) ||
+ MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
+ break;
+ }
+ remaining = end_tick - port_get_raw_ticks(NULL);
+ // We break a bit early so we don't risk setting the alarm before the time when we call
+ // sleep.
+ if (remaining < 1) {
+ break;
+ }
+ port_interrupt_after_ticks(remaining);
+ // Sleep until an interrupt happens.
+ port_sleep_until_interrupt();
+ remaining = end_tick - port_get_raw_ticks(NULL);
}
- background_ticks_ms32 = now32;
+}
- run_background_tasks();
+volatile size_t tick_enable_count = 0;
+extern void supervisor_enable_tick(void) {
+ common_hal_mcu_disable_interrupts();
+ if (tick_enable_count == 0) {
+ port_enable_tick();
+ }
+ tick_enable_count++;
+ common_hal_mcu_enable_interrupts();
}
-void supervisor_fake_tick() {
- uint32_t now32 = ticks_ms;
- background_ticks_ms32 = (now32 - 1);
+extern void supervisor_disable_tick(void) {
+ common_hal_mcu_disable_interrupts();
+ if (tick_enable_count > 0) {
+ tick_enable_count--;
+ }
+ if (tick_enable_count == 0) {
+ port_disable_tick();
+ }
+ common_hal_mcu_enable_interrupts();
}
+
diff --git a/supervisor/shared/tick.h b/supervisor/shared/tick.h
index 7ce8281ba..e7e808058 100644
--- a/supervisor/shared/tick.h
+++ b/supervisor/shared/tick.h
@@ -64,4 +64,7 @@ extern uint64_t supervisor_ticks_ms64(void);
*/
extern void supervisor_run_background_if_tick(void);
+extern void supervisor_enable_tick(void);
+extern void supervisor_disable_tick(void);
+
#endif
diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h
index ad5825b6c..1b0c83416 100644
--- a/supervisor/shared/usb/tusb_config.h
+++ b/supervisor/shared/usb/tusb_config.h
@@ -74,8 +74,8 @@
//------------- CLASS -------------//
#define CFG_TUD_CDC 1
#define CFG_TUD_MSC 1
-#define CFG_TUD_HID 1
-#define CFG_TUD_MIDI 1
+#define CFG_TUD_HID CIRCUITPY_USB_HID
+#define CFG_TUD_MIDI CIRCUITPY_USB_MIDI
#define CFG_TUD_CUSTOM_CLASS 0
/*------------------------------------------------------------------*/
diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c
index a0178528d..774055a82 100644
--- a/supervisor/shared/usb/usb.c
+++ b/supervisor/shared/usb/usb.c
@@ -24,7 +24,6 @@
* THE SOFTWARE.
*/
-#include "tick.h"
#include "py/objstr.h"
#include "shared-bindings/microcontroller/Processor.h"
#include "shared-module/usb_midi/__init__.h"
diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk
index 52d60b52b..d6422f074 100644
--- a/supervisor/supervisor.mk
+++ b/supervisor/supervisor.mk
@@ -73,26 +73,34 @@ else
lib/tinyusb/src/device/usbd_control.c \
lib/tinyusb/src/class/msc/msc_device.c \
lib/tinyusb/src/class/cdc/cdc_device.c \
- lib/tinyusb/src/class/hid/hid_device.c \
- lib/tinyusb/src/class/midi/midi_device.c \
lib/tinyusb/src/tusb.c \
supervisor/shared/serial.c \
supervisor/usb.c \
supervisor/shared/usb/usb_desc.c \
supervisor/shared/usb/usb.c \
supervisor/shared/usb/usb_msc_flash.c \
- shared-bindings/usb_hid/__init__.c \
- shared-bindings/usb_hid/Device.c \
- shared-bindings/usb_midi/__init__.c \
- shared-bindings/usb_midi/PortIn.c \
- shared-bindings/usb_midi/PortOut.c \
- shared-module/usb_hid/__init__.c \
- shared-module/usb_hid/Device.c \
- shared-module/usb_midi/__init__.c \
- shared-module/usb_midi/PortIn.c \
- shared-module/usb_midi/PortOut.c \
$(BUILD)/autogen_usb_descriptor.c
+ ifeq ($(CIRCUITPY_USB_HID), 1)
+ SRC_SUPERVISOR += \
+ lib/tinyusb/src/class/hid/hid_device.c \
+ shared-bindings/usb_hid/__init__.c \
+ shared-bindings/usb_hid/Device.c \
+ shared-module/usb_hid/__init__.c \
+ shared-module/usb_hid/Device.c
+ endif
+
+ ifeq ($(CIRCUITPY_USB_MIDI), 1)
+ SRC_SUPERVISOR += \
+ lib/tinyusb/src/class/midi/midi_device.c \
+ shared-bindings/usb_midi/__init__.c \
+ shared-bindings/usb_midi/PortIn.c \
+ shared-bindings/usb_midi/PortOut.c \
+ shared-module/usb_midi/__init__.c \
+ shared-module/usb_midi/PortIn.c \
+ shared-module/usb_midi/PortOut.c
+ endif
+
CFLAGS += -DUSB_AVAILABLE
endif
diff --git a/tools/build_memory_info.py b/tools/build_memory_info.py
index 93b4c1e82..808b70bd2 100644
--- a/tools/build_memory_info.py
+++ b/tools/build_memory_info.py
@@ -52,7 +52,7 @@ regions = {}
with open(sys.argv[1], "r") as f:
for line in f:
line = line.strip()
- if line.startswith(("FLASH_FIRMWARE", "FLASH", "RAM")):
+ if line.startswith(("FLASH_FIRMWARE", "RAM")):
regions[line.split()[0]] = line.split("=")[-1]
for region in regions:
@@ -63,17 +63,15 @@ for region in regions:
space = M_PATTERN.sub(M_REPLACE, space)
regions[region] = int(eval(space))
-# TODO Remove check for both FLASH_FIRMWARE and FLASH after all ports are converted to use FLASH_FIRMWARE.
-try:
- firmware_region = regions["FLASH_FIRMWARE"]
-except KeyError:
- firmware_region = regions["FLASH"]
+firmware_region = regions["FLASH_FIRMWARE"]
ram_region = regions["RAM"]
-free_flash = firmware_region - text - data
-free_ram = ram_region - data - bss
-print("{} bytes free in flash firmware space out of {} bytes ({}kB).".format(free_flash, firmware_region, firmware_region / 1024))
-print("{} bytes free in ram for stack and heap out of {} bytes ({}kB).".format(free_ram, ram_region, ram_region / 1024))
+used_flash = data + text
+free_flash = firmware_region - used_flash
+used_ram = data + bss
+free_ram = ram_region - used_ram
+print("{} bytes used, {} bytes free in flash firmware space out of {} bytes ({}kB).".format(used_flash, free_flash, firmware_region, firmware_region / 1024))
+print("{} bytes used, {} bytes free in ram for stack and heap out of {} bytes ({}kB).".format(used_ram, free_ram, ram_region, ram_region / 1024))
print()
# Check that we have free flash space. GCC doesn't fail when the text + data