diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml new file mode 100644 index 00000000..07382034 --- /dev/null +++ b/.github/workflows/compile-examples.yml @@ -0,0 +1,154 @@ +name: Compile Examples + +on: + pull_request: + paths: + - ".github/workflows/compile-examples.yml" + - "cores/**" + - "libraries/**" + - "variants/**" + - "boards.txt" + - "platform.txt" + push: + paths: + - ".github/workflows/compile-examples.yml" + - "cores/**" + - "libraries/**" + - "variants/**" + - "boards.txt" + - "platform.txt" + +jobs: + compile-test: + runs-on: ubuntu-latest + + env: + # sketch paths to compile (recursive) for all boards + UNIVERSAL_SKETCH_PATHS: | + - extras/examples + - libraries/Wire + - libraries/SPI + - libraries/SoftwareSerial + - libraries/EEPROM + - ~/Arduino/libraries/Servo/examples + - ~/Arduino/libraries/LiquidCrystal/examples + - ~/Arduino/libraries/MFRC522/examples + - ~/Arduino/libraries/Ethernet/examples + - ~/Arduino/libraries/Adafruit_MQTT_Library/examples/mqtt_ethernet + - ~/Arduino/libraries/ArduinoBearSSL/examples/SHA1 + - ~/Arduino/libraries/ArduinoBearSSL/examples/SHA256 + - ~/Arduino/libraries/Arduino_LSM9DS1/examples + - ~/Arduino/libraries/SD/examples + - ~/Arduino/libraries/Arduino_JSON/examples + - ~/Arduino/libraries/TFT/examples/Arduino/TFTBitmapLogo + - ~/Arduino/libraries/TFT/examples/Arduino/TFTColorPicker + - ~/Arduino/libraries/TFT/examples/Arduino/TFTDisplayText + - ~/Arduino/libraries/TFT/examples/Arduino/TFTEtchASketch + - ~/Arduino/libraries/TFT/examples/Arduino/TFTGraph + - ~/Arduino/libraries/TFT/examples/Arduino/TFTPong + - ~/Arduino/libraries/Arduino_CRC32/examples + - ~/Arduino/libraries/Arduino_LSM6DS3/examples + - ~/Arduino/libraries/Stepper/examples + - ~/Arduino/libraries/Arduino_HTS221/examples + - ~/Arduino/libraries/Arduino_DebugUtils/examples + - ~/Arduino/libraries/Arduino_LPS22HB/examples + - ~/Arduino/libraries/ArduinoDMX/examples + - ~/Arduino/libraries/ArduinoRS485/examples + SKETCHES_REPORTS_PATH: sketches-reports + + strategy: + fail-fast: false + + matrix: + board: [ + {"fqbn": "arduino:megaavr:uno2018:mode=on", "type": "UnoWiFiRev2"}, + {"fqbn": "arduino:megaavr:uno2018:mode=off", "type": "UnoWiFiRev2"}, + {"fqbn": "arduino:megaavr:nona4809", "type": "NanoEvery"} + ] + + # make board type-specific customizations to the matrix jobs + include: + # Uno WiFi Rev2 + - board: + type: "UnoWiFiRev2" + additional-sketch-paths: | + - ~/Arduino/libraries/WiFiNINA/examples + - ~/Arduino/libraries/ArduinoMqttClient/examples + - ~/Arduino/libraries/Arduino_OAuth/examples/Tweeter + # Nano Every + - board: + type: "NanoEvery" + additional-sketch-paths: + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # The source files are in a subfolder of the ArduinoCore-API repository, so it's not possible to clone it directly to the final destination in the core + - name: Checkout ArduinoCore-API + uses: actions/checkout@v2 + with: + repository: arduino/ArduinoCore-API + path: extras/ArduinoCore-API + + - name: Install ArduinoCore-API + run: mv "$GITHUB_WORKSPACE/extras/ArduinoCore-API/api" "$GITHUB_WORKSPACE/cores/arduino" + + - name: Checkout Basic examples + uses: actions/checkout@v2 + with: + repository: arduino/arduino-examples + path: extras + + - name: Delete incompatible examples + run: | + # These boards do not support native USB + rm -r "$GITHUB_WORKSPACE/extras/examples/09.USB" + # The next command can be removed after the core integration with ArduinoCore-API + rm -r "$GITHUB_WORKSPACE/extras/examples/10.StarterKit_BasicKit/p11_CrystalBall" + # CapacitiveSensor library does not support megaAVR core yet + rm -r "$GITHUB_WORKSPACE/extras/examples/10.StarterKit_BasicKit/p13_TouchSensorLamp" + - name: Compile examples + uses: arduino/compile-sketches@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + fqbn: ${{ matrix.board.fqbn }} + libraries: | + - name: Adafruit MQTT Library + - name: Servo + - name: LiquidCrystal + - name: MFRC522 + - name: Ethernet + - name: ArduinoBearSSL + - name: Arduino_LSM9DS1 + - name: TFT + - name: ArduinoMqttClient + - name: Arduino_CRC32 + - name: Arduino_LSM6DS3 + - name: Stepper + - name: SD + - name: Arduino_JSON + - name: Arduino_HTS221 + - name: Arduino_DebugUtils + - name: Arduino_LPS22HB + - name: ArduinoDMX + - name: ArduinoRS485 + - name: Arduino_OAuth + - name: WiFiNINA + platforms: | + # Use Board Manager to install the latest release of Arduino megaAVR Boards to get the toolchain + - name: "arduino:megaavr" + # Overwrite the Board Manager installation with the local platform + - source-path: "./" + name: "arduino:megaavr" + sketch-paths: | + ${{ env.UNIVERSAL_SKETCH_PATHS }} + ${{ matrix.additional-sketch-paths }} + enable-deltas-report: 'true' + sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }} + + - name: Save memory usage change report as artifact + uses: actions/upload-artifact@v2 + with: + path: ${{ env.SKETCHES_REPORTS_PATH }} + name: ${{ env.SKETCHES_REPORTS_PATH }} diff --git a/.github/workflows/compile-muxto.yml b/.github/workflows/compile-muxto.yml new file mode 100644 index 00000000..881699af --- /dev/null +++ b/.github/workflows/compile-muxto.yml @@ -0,0 +1,105 @@ +name: Compile MuxTO + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/compile-muxto.yml" + - "firmwares/MuxTO/**" + pull_request: + paths: + - ".github/workflows/compile-muxto.yml" + - "firmwares/MuxTO/**" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to external resources (libraries, platforms). + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +env: + BINARY_FILENAME: MuxTO.ino.bin + BINARY_ARTIFACT_NAME: MuxTO + +jobs: + build: + name: Build firmware + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + board: + - fqbn: arduino:samd:muxto:float=default,config=enabled,clock=internal_usb,timer=timer_732Hz,bootloader=4kb,serial=two_uart,usb=cdc + platforms: | + # Install MattairTech_Arduino:samd via Boards Manager for the toolchain + - name: MattairTech_Arduino:samd + source-url: https://www.mattairtech.com/software/arduino/package_MattairTech_index.json + # This needs to match with the version of MattairTech_Arduino:samd the Arduino fork is based on in order to get the right tool versions + version: 1.6.17 + # Install officila samd version for compiler support + - name: arduino:samd + # Install the platform with MuxTO support + - name: arduino:samd + source-url: https://github.com/arduino/ArduinoCore-samd.git + version: muxto + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + echo "BINARY_OUTPUT_PATH=${{ runner.temp }}/output" >> "$GITHUB_ENV" + echo "SKETCHES_REPORTS_PATH=${{ runner.temp }}/sketches-reports" >> "$GITHUB_ENV" + + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Compile firmware + uses: arduino/compile-sketches@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + fqbn: ${{ matrix.board.fqbn }} + platforms: ${{ matrix.board.platforms }} + libraries: | + - + sketch-paths: | + - firmwares/MuxTO + cli-compile-flags: | + - --output-dir=${{ env.BINARY_OUTPUT_PATH }} + enable-deltas-report: true + sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }} + + - name: Save firmware binary as workflow artifact + uses: actions/upload-artifact@v2 + with: + if-no-files-found: error + path: ${{ env.BINARY_OUTPUT_PATH }}/${{ env.BINARY_FILENAME }} + name: ${{ env.BINARY_ARTIFACT_NAME }} + + - name: Save sketches report as workflow artifact + uses: actions/upload-artifact@v2 + with: + if-no-files-found: error + path: ${{ env.SKETCHES_REPORTS_PATH }} + name: sketches-reports + + size: + name: Check firmware size + needs: build + runs-on: ubuntu-latest + steps: + - name: Download binary artifact + uses: actions/download-artifact@v2 + with: + name: ${{ env.BINARY_ARTIFACT_NAME }} + + # The normal size check done by Arduino CLI is not working correctly, so it's necessary to check the size directly + - name: Check firmware binary size + run: | + BINARY_SIZE="$(stat --printf="%s" "${{ github.workspace }}/${{ env.BINARY_FILENAME }}")" + MAX_BINARY_SIZE=$((12 * 1024)) + echo "File size: ${BINARY_SIZE}/${MAX_BINARY_SIZE} B" + if [[ $BINARY_SIZE -gt $MAX_BINARY_SIZE ]]; then + echo "::error::Binary size of $BINARY_SIZE B exceeds the available memory ($MAX_BINARY_SIZE B)" + exit 1 + fi diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000..d7e23178 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,107 @@ +name: release + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+*" + +jobs: + core-pre-release-from-tag: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Checkout ArduinoCore-API + uses: actions/checkout@v2 + with: + repository: arduino/ArduinoCore-API + path: extras/ArduinoCore-API + + - name: Check if API should be compiled in the core + id: checkapi + run: | + if [[ $(grep -r api platform.txt) ]]; then echo "::set-output name=IS_API::true"; fi + + - name: Checkout latest tag of ArduinoCore-API and add it to the core + run: | + cd extras/ArduinoCore-API + git fetch --tags + git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) + cd ../.. + mv "$GITHUB_WORKSPACE/extras/ArduinoCore-API/api" "$GITHUB_WORKSPACE/cores/arduino" + if: steps.checkapi.outputs.IS_API == 'true' + + - name: Remove ArduinoCore-API + run: rm -r "$GITHUB_WORKSPACE/extras/ArduinoCore-API" + + - name: Set env + run: echo "TAG_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + + - name: Get repo name + run: echo "REPOSITORY_NAME=$(echo ${{ github.repository }} | cut -d "/" -f2-)" >> $GITHUB_ENV + + - name: Package the new core + run: | + extras/pack.release.bash $TAG_VERSION $REPOSITORY_NAME + cd extras + mkdir staging + echo $PWD + mv ../*.json staging/ + mv ../*.tar.bz2 staging/ + cd .. + + - name: Get architecture name + run: | + echo "ARCHITECTURE=$(cat extras/package_index.json.NewTag.template | jq ".packages[0].platforms[0].architecture" | sed 's/\"//g')" >> $GITHUB_ENV + + - name: Upload package_*_index.json and *.tar.bz2 file to Arduino downloads servers + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + run: | + aws s3 sync extras/staging/ s3://${{ secrets.ARDUINO_DOWNLOADS_BUCKET }}/packages/staging/ --exclude "*" --include *.json + aws s3 sync extras/staging/ s3://${{ secrets.ARDUINO_DOWNLOADS_BUCKET }}/cores/staging/ --exclude "*" --include *.tar.bz2 + + - name: Checkout Basic examples + uses: actions/checkout@v2 + with: + repository: arduino/arduino-examples + path: extras/arduino-examples + + - name: Install Arduino CLI + uses: arduino/setup-arduino-cli@v1.1.1 + with: + version: "0.14.0" + + - name: Download and verify new core + run: | + export PATH=$PATH:$PWD + arduino-cli version + cp extras/staging/package_${REPOSITORY_NAME}_${TAG_VERSION}_index.json . + export ARDUINO_DIRECTORIES_DATA=$PWD + export ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS=file://$PWD/package_${REPOSITORY_NAME}_${TAG_VERSION}_index.json + arduino-cli config init + arduino-cli config dump -v + arduino-cli core update-index -v + arduino-cli core install arduino:${ARCHITECTURE}@${TAG_VERSION} + INDEX=0 + arduino-cli board listall --format=json > boardlist.json + N=$(jq '.boards | length' boardlist.json) + let N=N-1 + echo $N + for INDEX in $(seq 0 1 $N); do arduino-cli compile --fqbn $(cat boardlist.json | jq ".boards[$INDEX].FQBN" | sed 's/\"//g') $PWD/extras/arduino-examples/examples/01.Basics/Blink; done + + # See: https://github.com/rtCamp/action-slack-notify + - name: Slack notification of core pre-release + uses: rtCamp/action-slack-notify@v2.1.0 + env: + SLACK_CHANNEL: core_releases + SLACK_COLOR: good + SLACK_USERNAME: ArduinoBot + SLACK_ICON: https://github.com/arduino.png?size=48 + SLACK_TITLE: Arduino core pre-release + SLACK_MESSAGE: 'Version ${{ env.TAG_VERSION }} of core ${{ env.REPOSITORY_NAME }} is now available' + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + MSG_MINIMAL: true \ No newline at end of file diff --git a/.github/workflows/report-size-deltas.yml b/.github/workflows/report-size-deltas.yml new file mode 100644 index 00000000..1e37a511 --- /dev/null +++ b/.github/workflows/report-size-deltas.yml @@ -0,0 +1,16 @@ +name: Report PR Size Deltas + +on: + schedule: + - cron: '*/5 * * * *' + +jobs: + report: + runs-on: ubuntu-latest + + steps: + - name: Comment size deltas reports to PRs + uses: arduino/report-size-deltas@v1 + with: + # The name of the workflow artifact created by the sketch compilation workflow + sketches-reports-source: sketches-reports diff --git a/README.md b/README.md index f5ace4fd..4090cd7e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Arduino Core for ATMEGA4809 CPU +[![Compile MuxTO status](https://github.com/arduino/ArduinoCore-megaavr/actions/workflows/compile-muxto.yml/badge.svg)](https://github.com/arduino/ArduinoCore-megaavr/actions/workflows/compile-muxto.yml) + This repository contains the source code and configuration files of the Arduino Core for Microchip's ATMEGA4809 processor (used on the Arduino Uno WiFi Rev2 boards). diff --git a/boards.txt b/boards.txt index 71a803cc..504c40af 100644 --- a/boards.txt +++ b/boards.txt @@ -1,13 +1,18 @@ -# See: http://code.google.com/p/arduino/wiki/Platforms +# See: https://arduino.github.io/arduino-cli/latest/platform-specification/ ############################################################## -uno2018.name=Arduino Uno WiFi Rev2 +uno2018.name=Arduino UNO WiFi Rev2 uno2018.vid.0=0x03eb uno2018.pid.0=0x2145 +uno2018.upload_port.0.vid=0x03eb +uno2018.upload_port.0.pid=0x2145 +uno2018.upload_port.1.board=uno2018 uno2018.upload.tool=avrdude +uno2018.upload.tool.default=avrdude +uno2018.upload.tool.network=arduino_ota uno2018.upload.protocol=xplainedmini_updi uno2018.upload.maximum_size=48640 uno2018.upload.maximum_data_size=6144 @@ -25,6 +30,7 @@ uno2018.build.extra_flags={build.328emulation} -DMILLIS_USE_TIMERB3 #uno2018.build.extra_flags=-B{runtime.tools.atpack.path}/gcc/dev/{build.mcu} uno2018.bootloader.tool=avrdude +uno2018.bootloader.tool.default=avrdude uno2018.bootloader.file=atmega4809_uart_bl.hex uno2018.bootloader.SYSCFG0=0xC9 uno2018.bootloader.BOOTEND=0x02 @@ -43,8 +49,13 @@ nona4809.name=Arduino Nano Every nona4809.vid.0=0x2341 nona4809.pid.0=0x0058 +nona4809.upload_port.0.vid=0x2341 +nona4809.upload_port.0.pid=0x0058 +nona4809.upload_port.1.board=nona4809 nona4809.upload.tool=avrdude +nona4809.upload.tool.default=avrdude +nona4809.upload.tool.network=arduino_ota nona4809.upload.protocol=jtag2updi nona4809.upload.maximum_size=49152 nona4809.upload.maximum_data_size=6144 @@ -62,6 +73,7 @@ nona4809.build.extra_flags={build.328emulation} -DMILLIS_USE_TIMERB3 -DNO_EXTERN #nona4809.build.extra_flags=-B{runtime.tools.atpack.path}/gcc/dev/{build.mcu} nona4809.bootloader.tool=avrdude +nona4809.bootloader.tool.default=avrdude nona4809.bootloader.file=atmega4809_uart_bl.hex nona4809.bootloader.SYSCFG0=0xC9 nona4809.bootloader.BOOTEND=0x00 diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index 1892a7a1..c40dcb20 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -83,10 +83,11 @@ unsigned long microsecondsToClockCycles(unsigned long microseconds); // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. -extern const uint8_t PROGMEM digital_pin_to_port[]; -extern const uint8_t PROGMEM digital_pin_to_bit_mask[]; -extern const uint8_t PROGMEM digital_pin_to_bit_position[]; -extern const uint8_t PROGMEM digital_pin_to_timer[]; +extern const uint8_t digital_pin_to_port[]; +extern const uint8_t digital_pin_to_bit_mask[]; +extern const uint8_t digital_pin_to_bit_position[]; +extern const uint8_t digital_pin_to_timer[]; +extern const uint8_t analog_pin_to_channel[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. @@ -115,12 +116,12 @@ extern const uint8_t PROGMEM digital_pin_to_timer[]; void setup_timers(); bool isDoubleBondedActive(uint8_t pin); -#define digitalPinToPort(pin) ( (pin < NUM_TOTAL_PINS) ? pgm_read_byte(digital_pin_to_port + pin) : NOT_A_PIN ) -#define digitalPinToBitPosition(pin) ( (pin < NUM_TOTAL_PINS) ? pgm_read_byte(digital_pin_to_bit_position + pin) : NOT_A_PIN ) -#define analogPinToBitPosition(pin) ( (pin < NUM_ANALOG_INPUTS) ? pgm_read_byte(digital_pin_to_bit_position + pin + ANALOG_INPUT_OFFSET) : NOT_A_PIN ) -#define digitalPinToBitMask(pin) ( (pin < NUM_TOTAL_PINS) ? pgm_read_byte(digital_pin_to_bit_mask + pin) : NOT_A_PIN ) -#define analogPinToBitMask(pin) ( (pin < NUM_ANALOG_INPUTS) ? pgm_read_byte(digital_pin_to_bit_mask + pin + ANALOG_INPUT_OFFSET) : NOT_A_PIN ) -#define digitalPinToTimer(pin) ( (pin < NUM_TOTAL_PINS) ? pgm_read_byte(digital_pin_to_timer + pin) : NOT_ON_TIMER ) +#define digitalPinToPort(pin) ( (pin < NUM_TOTAL_PINS) ? digital_pin_to_port[pin] : NOT_A_PIN ) +#define digitalPinToBitPosition(pin) ( (pin < NUM_TOTAL_PINS) ? digital_pin_to_bit_position[pin] : NOT_A_PIN ) +#define digitalPinToBitMask(pin) ( (pin < NUM_TOTAL_PINS) ? digital_pin_to_bit_mask[pin] : NOT_A_PIN ) +#define digitalPinToTimer(pin) ( (pin < NUM_TOTAL_PINS) ? digital_pin_to_timer[pin] : NOT_ON_TIMER ) +#define analogPinToBitPosition(pin) ( (digitalPinToAnalogInput(pin) != NOT_A_PIN) ? digital_pin_to_bit_position[pin + ANALOG_INPUT_OFFSET] : NOT_A_PIN ) +#define analogPinToBitMask(pin) ( (digitalPinToAnalogInput(pin) != NOT_A_PIN) ? digital_pin_to_bit_mask[pin + ANALOG_INPUT_OFFSET] : NOT_A_PIN ) #define portToPortStruct(port) ( (port < NUM_TOTAL_PORTS) ? ((PORT_t *)&PORTA + port) : NULL) #define digitalPinToPortStruct(pin) ( (pin < NUM_TOTAL_PINS) ? ((PORT_t *)&PORTA + digitalPinToPort(pin)) : NULL) @@ -143,11 +144,21 @@ bool isDoubleBondedActive(uint8_t pin); #ifdef UNO_WIFI_REV2_328MODE #include #endif +#ifdef AVR_NANO_4809_328MODE +#include +#endif #if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL) #error "Targets with both UART0 and CDC serial not supported" #endif #endif +#ifdef __cplusplus +extern "C" { +#endif #include "pins_arduino.h" +#ifdef __cplusplus +} // extern "C" +#endif + #endif diff --git a/cores/arduino/NANO_Compat.cpp b/cores/arduino/NANO_compat.cpp similarity index 99% rename from cores/arduino/NANO_Compat.cpp rename to cores/arduino/NANO_compat.cpp index f199125d..997d36e3 100644 --- a/cores/arduino/NANO_Compat.cpp +++ b/cores/arduino/NANO_compat.cpp @@ -16,7 +16,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "NANO_Compat.h" +#include "NANO_compat.h" #ifdef AVR_NANO_4809_328MODE diff --git a/cores/arduino/NANO_Compat.h b/cores/arduino/NANO_compat.h similarity index 100% rename from cores/arduino/NANO_Compat.h rename to cores/arduino/NANO_compat.h diff --git a/cores/arduino/UART.cpp b/cores/arduino/UART.cpp index 8e0520bc..473f59b9 100644 --- a/cores/arduino/UART.cpp +++ b/cores/arduino/UART.cpp @@ -88,7 +88,6 @@ void serialEventRun(void) void UartClass::_tx_data_empty_irq(void) { // Check if tx buffer already empty. - // This interrupt-handler can be called "manually" from flush(); if (_tx_buffer_head == _tx_buffer_tail) { // Buffer empty, so disable "data register empty" interrupt (*_hwserial_module).CTRLA &= (~USART_DREIE_bm); @@ -107,8 +106,6 @@ void UartClass::_tx_data_empty_irq(void) (*_hwserial_module).TXDATAL = c; - while(!((*_hwserial_module).STATUS & USART_DREIF_bm)); - if (_tx_buffer_head == _tx_buffer_tail) { // Buffer empty, so disable "data register empty" interrupt (*_hwserial_module).CTRLA &= (~USART_DREIE_bm); @@ -121,6 +118,23 @@ void UartClass::_tx_data_empty_irq(void) } } +// To invoke data empty "interrupt" via a call, use this method +void UartClass::_poll_tx_data_empty(void) +{ + if ( (!(SREG & CPU_I_bm)) || (!((*_hwserial_module).CTRLA & USART_DREIE_bm)) ) { + // Interrupts are disabled either globally or for data register empty, + // so we'll have to poll the "data register empty" flag ourselves. + // If it is set, pretend an interrupt has happened and call the handler + //to free up space for us. + + // Invoke interrupt handler only if conditions data register is empty + if ((*_hwserial_module).STATUS & USART_DREIF_bm) { + _tx_data_empty_irq(); + } + } + // In case interrupts are enabled, the interrupt routine will be invoked by itself +} + // Public Methods ////////////////////////////////////////////////////////////// void UartClass::begin(unsigned long baud, uint16_t config) @@ -140,7 +154,7 @@ void UartClass::begin(unsigned long baud, uint16_t config) uint8_t oldSREG = SREG; cli(); - baud_setting = (((8 * F_CPU_CORRECTED) / baud) + 1) / 2; + baud_setting = (((8 * F_CPU) / baud) + 1) / 2; // Disable CLK2X (*_hwserial_module).CTRLB &= (~USART_RXMODE_CLK2X_gc); (*_hwserial_module).CTRLB |= USART_RXMODE_NORMAL_gc; @@ -148,8 +162,7 @@ void UartClass::begin(unsigned long baud, uint16_t config) _written = false; int8_t sigrow_val = SIGROW.OSC16ERR5V; - baud_setting *= (1024 + sigrow_val); - baud_setting /= (1024 - abs(sigrow_val)); + baud_setting += (baud_setting * sigrow_val) / 1024; // assign the baud_setting, a.k.a. BAUD (USART Baud Rate Register) (*_hwserial_module).BAUD = (int16_t) baud_setting; @@ -253,9 +266,7 @@ void UartClass::flush() // If interrupts are globally disabled or the and DR empty interrupt is disabled, // poll the "data register empty" interrupt flag to prevent deadlock - if ( (!(SREG & CPU_I_bm)) || (!((*_hwserial_module).CTRLA & USART_DREIE_bm)) ) { - _tx_data_empty_irq(); - } + _poll_tx_data_empty(); } // If we get here, nothing is queued anymore (DREIE is disabled) and // the hardware finished transmission (TXCIF is set). @@ -294,18 +305,9 @@ size_t UartClass::write(uint8_t c) tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE; //If the output buffer is full, there's nothing for it other than to - //wait for the interrupt handler to empty it a bit + //wait for the interrupt handler to empty it a bit (or emulate interrupts) while (i == _tx_buffer_tail) { - if ( ( !(SREG & CPU_I_bm) ) || ( !((*_hwserial_module).CTRLA & USART_DREIE_bm) ) ) { - // Interrupts are disabled either globally or for data register empty, - // so we'll have to poll the "data register empty" flag ourselves. - // If it is set, pretend an interrupt has happened and call the handler - //to free up space for us. - - _tx_data_empty_irq(); - } else { - // nop, the interrupt handler will free up space for us - } + _poll_tx_data_empty(); } _tx_buffer[_tx_buffer_head] = c; diff --git a/cores/arduino/UART.h b/cores/arduino/UART.h index ef966e9f..797ae932 100644 --- a/cores/arduino/UART.h +++ b/cores/arduino/UART.h @@ -27,6 +27,8 @@ #include "api/HardwareSerial.h" #include "pins_arduino.h" +using namespace arduino; + // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which head is the index of the location // to which to write the next incoming character and tail is the index of the @@ -164,11 +166,16 @@ class UartClass : public HardwareSerial inline size_t write(unsigned int n) { return write((uint8_t)n); } inline size_t write(int n) { return write((uint8_t)n); } using Print::write; // pull in write(str) and write(buf, size) from Print - operator bool() { return true; } + explicit operator bool() { return true; } + + void bind(UartClass& ser) {bound = &ser; } // Interrupt handlers - Not intended to be called externally inline void _rx_complete_irq(void); void _tx_data_empty_irq(void); + private: + void _poll_tx_data_empty(void); + UartClass* bound = NULL; }; #if defined(HWSERIAL0) diff --git a/cores/arduino/UART0.cpp b/cores/arduino/UART0.cpp index b8f1f34c..522b6844 100644 --- a/cores/arduino/UART0.cpp +++ b/cores/arduino/UART0.cpp @@ -51,7 +51,7 @@ ISR(HWSERIAL0_DRE_VECTOR) Serial._tx_data_empty_irq(); } #else -#error "Don't know what the Data Received interrupt vector is called for Serial" +#error "Don't know what the Data Register Empty interrupt vector is called for Serial" #endif #if defined(HWSERIAL0) diff --git a/cores/arduino/UART_private.h b/cores/arduino/UART_private.h index 0bca2d3c..2fa93694 100644 --- a/cores/arduino/UART_private.h +++ b/cores/arduino/UART_private.h @@ -66,6 +66,9 @@ void UartClass::_rx_complete_irq(void) _rx_buffer[_rx_buffer_head] = c; _rx_buffer_head = i; } + if (bound != NULL) { + bound->write(c); + } } else { // Parity error, read byte but discard it (*_hwserial_module).RXDATAL; diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.cpp similarity index 87% rename from cores/arduino/WInterrupts.c rename to cores/arduino/WInterrupts.cpp index 64cd9ae6..55155f4c 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.cpp @@ -32,9 +32,10 @@ #include "wiring_private.h" -static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; +static volatile voidFuncPtrParam intFunc[EXTERNAL_NUM_INTERRUPTS]; +static void* args[EXTERNAL_NUM_INTERRUPTS]; -void attachInterrupt(uint8_t pin, void (*userFunc)(void), PinStatus mode) { +void attachInterruptParam(pin_size_t pin, void (*userFunc)(void*), PinStatus mode, void* params) { /* Get bit position and check pin validity */ uint8_t bit_pos = digitalPinToBitPosition(pin); @@ -46,24 +47,27 @@ void attachInterrupt(uint8_t pin, void (*userFunc)(void), PinStatus mode) { /* Check interrupt number and apply function pointer to correct array index */ if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { intFunc[interruptNum] = userFunc; + args[interruptNum] = params; // Configure the interrupt mode (trigger on low input, any change, rising // edge, or falling edge). The mode constants were chosen to correspond // to the configuration bits in the hardware register, so we simply apply // the setting in the pin control register + int isc_mode; + switch (mode) { case CHANGE: - mode = PORT_ISC_BOTHEDGES_gc; + isc_mode = PORT_ISC_BOTHEDGES_gc; break; case FALLING: - mode = PORT_ISC_FALLING_gc; + isc_mode = PORT_ISC_FALLING_gc; break; case RISING: - mode = PORT_ISC_RISING_gc; + isc_mode = PORT_ISC_RISING_gc; break; case LOW: - mode = PORT_ISC_LEVEL_gc; + isc_mode = PORT_ISC_LEVEL_gc; break; default: // AVR doesn't support level triggered interrupts @@ -80,10 +84,14 @@ void attachInterrupt(uint8_t pin, void (*userFunc)(void), PinStatus mode) { *pin_ctrl_reg &= ~(PORT_ISC_gm); /* Apply ISC setting */ - *pin_ctrl_reg |= mode; + *pin_ctrl_reg |= isc_mode; } } +void attachInterrupt(uint8_t pin, void (*userFunc)(void), PinStatus mode) { + attachInterruptParam(pin, (voidFuncPtrParam)userFunc, mode, NULL); +} + void detachInterrupt(uint8_t pin) { /* Get bit position and check pin validity */ uint8_t bit_pos = digitalPinToBitPosition(pin); @@ -127,7 +135,7 @@ static void port_interrupt_handler(uint8_t port) { if(intFunc[interrupt_num] != 0){ /* Call function */ - intFunc[interrupt_num](); + intFunc[interrupt_num](args[interrupt_num]); } } bit_pos++; diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c index c5a715b5..36ddc680 100644 --- a/cores/arduino/wiring_analog.c +++ b/cores/arduino/wiring_analog.c @@ -23,7 +23,6 @@ */ #include "wiring_private.h" -#include "pins_arduino.h" #include "Arduino.h" uint8_t analog_reference = DEFAULT; @@ -146,6 +145,8 @@ void analogWrite(uint8_t pin, int val) uint16_t* timer_cmp_out; TCB_t *timer_B; + uint8_t savedSREG; + /* Find out Port and Pin to correctly handle port mux, and timer. */ switch (digital_pin_timer) { @@ -154,7 +155,10 @@ void analogWrite(uint8_t pin, int val) timer_cmp_out = ((uint16_t*) (&TCA0.SINGLE.CMP0BUF)) + bit_pos; /* Configure duty cycle for correct compare channel */ - (*timer_cmp_out) = (val); + savedSREG = SREG; + cli(); + (*timer_cmp_out) = (val); // non-atomic 16-bit write operation + SREG = savedSREG; /* Enable output on pin */ TCA0.SINGLE.CTRLB |= (1 << (TCA_SINGLE_CMP0EN_bp + bit_pos)); @@ -171,7 +175,12 @@ void analogWrite(uint8_t pin, int val) timer_B = ((TCB_t *)&TCB0 + (digital_pin_timer - TIMERB0)); /* set duty cycle */ - timer_B->CCMPH = val; + // (16-bit read/write operation are non-atomic and use a temporary register) + savedSREG = SREG; + cli(); + timer_B->CCMPL = timer_B->CCMPL; // copy CCMPL into temporary register + timer_B->CCMPH = val; // set CCMPH value + copy temporary register content into CCMPL + SREG = savedSREG; /* Enable Timer Output */ timer_B->CTRLB |= (TCB_CCMPEN_bm); diff --git a/cores/test/CMakeLists.txt b/cores/test/CMakeLists.txt index 2605c248..bea90144 100644 --- a/cores/test/CMakeLists.txt +++ b/cores/test/CMakeLists.txt @@ -25,7 +25,7 @@ set(TEST_TARGET testArduinoCore-megaavr) set(TEST_SRCS src/test_main.cpp - ../arduino/NANO_Compat.cpp + ../arduino/NANO_compat.cpp ) ########################################################################## diff --git a/cores/test/src/test_main.cpp b/cores/test/src/test_main.cpp index 41adfe12..4b0d36da 100644 --- a/cores/test/src/test_main.cpp +++ b/cores/test/src/test_main.cpp @@ -19,11 +19,11 @@ #define CATCH_CONFIG_MAIN #include -#include "../../arduino/NANO_Compat.h" +#include "../../arduino/NANO_compat.h" /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 DDRB compatibility class", "NANO_Compat::DDRBClass") { +SCENARIO("Testing Arduino Nano 4809 DDRB compatibility class", "NANO_compat::DDRBClass") { PORT_t portb, porte; DDRBClass DDRB(&portb, &porte); @@ -63,7 +63,7 @@ SCENARIO("Testing Arduino Nano 4809 DDRB compatibility class", "NANO_Compat::DDR /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 PORTB compatibility class", "NANO_Compat::PORTBClass") { +SCENARIO("Testing Arduino Nano 4809 PORTB compatibility class", "NANO_compat::PORTBClass") { PORT_t portb, porte; PORTBClass PORTB(&portb, &porte); @@ -103,7 +103,7 @@ SCENARIO("Testing Arduino Nano 4809 PORTB compatibility class", "NANO_Compat::PO /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 DDRC compatibility class", "NANO_Compat::DDRCClass") { +SCENARIO("Testing Arduino Nano 4809 DDRC compatibility class", "NANO_compat::DDRCClass") { PORT_t porta, portd; DDRCClass DDRC(&porta, &portd); @@ -149,7 +149,7 @@ SCENARIO("Testing Arduino Nano 4809 DDRC compatibility class", "NANO_Compat::DDR /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 PORTC compatibility class", "NANO_Compat::PORTCClass") { +SCENARIO("Testing Arduino Nano 4809 PORTC compatibility class", "NANO_compat::PORTCClass") { PORT_t porta, portd; PORTCClass PORTC(&porta, &portd); @@ -195,7 +195,7 @@ SCENARIO("Testing Arduino Nano 4809 PORTC compatibility class", "NANO_Compat::PO /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 DDRD compatibility class", "NANO_Compat::DDRDClass") { +SCENARIO("Testing Arduino Nano 4809 DDRD compatibility class", "NANO_compat::DDRDClass") { PORT_t porta, portb, portc, portf; DDRDClass DDRD(&porta, &portb, &portc, &portf); @@ -245,7 +245,7 @@ SCENARIO("Testing Arduino Nano 4809 DDRD compatibility class", "NANO_Compat::DDR /*****************************************************************************/ -SCENARIO("Testing Arduino Nano 4809 PORTD compatibility class", "NANO_Compat::PORTDClass") { +SCENARIO("Testing Arduino Nano 4809 PORTD compatibility class", "NANO_compat::PORTDClass") { PORT_t porta, portb, portc, portf; PORTDClass PORTD(&porta, &portb, &portc, &portf); diff --git a/extras/pack.release.bash b/extras/pack.release.bash index a2999d50..3321340b 100755 --- a/extras/pack.release.bash +++ b/extras/pack.release.bash @@ -1,6 +1,6 @@ #!/bin/bash -ex -# pack.*.bash - Bash script to help packaging avr core releases. +# pack.*.bash - Bash script to help packaging samd core releases. # Copyright (c) 2015 Arduino LLC. All right reserved. # # This library is free software; you can redistribute it and/or @@ -17,17 +17,40 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# Version check removed because version string passed from jenkins was incorrect +VERSION_FROM_TAG=$1 +CORE_NAME=$2 +echo $VERSION_FROM_TAG +echo $CORE_NAME VERSION=`grep version= platform.txt | sed 's/version=//g'` +echo $VERSION + +if [ $VERSION != $VERSION_FROM_TAG ]; then + exit 0 +fi PWD=`pwd` FOLDERNAME=`basename $PWD` THIS_SCRIPT_NAME=`basename $0` +FILENAME=core-$CORE_NAME-$VERSION.tar.bz2 +echo $FILENAME -rm -f avr-$VERSION.tar.bz2 +rm -f *.tar.bz2 +rm -f *.json cd .. -tar --transform "s|$FOLDERNAME|$FOLDERNAME-$VERSION|g" --exclude=extras/** --exclude=.git* --exclude=.idea -cjf avr-$VERSION.tar.bz2 $FOLDERNAME +tar --exclude=extras/** --exclude=.git* --exclude=.idea -cjhf $FILENAME $FOLDERNAME cd - -mv ../avr-$VERSION.tar.bz2 . +mv ../$FILENAME . + +CHKSUM=`sha256sum $FILENAME | awk '{ print $1 }'` +SIZE=`wc -c $FILENAME | awk '{ print $1 }'` +cat extras/package_index.json.NewTag.template | +# sed "s/%%BUILD_NUMBER%%/${BUILD_NUMBER}/" | +# sed "s/%%CURR_TIME%%/${CURR_TIME_SED}/" | +sed "s/%%VERSION%%/${VERSION}/" | +sed "s/%%FILENAME%%/${FILENAME}/" | +sed "s/%%CHECKSUM%%/${CHKSUM}/" | +sed "s/%%SIZE%%/${SIZE}/" > package_${CORE_NAME}_${VERSION}_index.json \ No newline at end of file diff --git a/extras/package_index.json.NewTag.template b/extras/package_index.json.NewTag.template new file mode 100644 index 00000000..fcc12676 --- /dev/null +++ b/extras/package_index.json.NewTag.template @@ -0,0 +1,54 @@ +{ + "packages": [ + { + "name": "arduino", + "maintainer": "Arduino Betatesting", + "websiteURL": "http://www.arduino.cc/", + "email": "packages@arduino.cc", + "help": { + "online": "http://www.arduino.cc/en/Reference/HomePage" + }, + "platforms": [ + { + "name": "Arduino megaAVR Boards - Pre-release", + "architecture": "megaavr", + "version": "%%VERSION%%", + "category": "Arduino", + "url": "http://downloads.arduino.cc/cores/staging/%%FILENAME%%", + "archiveFileName": "%%FILENAME%%", + "checksum": "SHA-256:%%CHECKSUM%%", + "size": "%%SIZE%%", + "help": { + "online": "https://github.com/arduino/ArduinoCore-megaavr/issues" + }, + "boards": [ + { + "name": "Arduino UNO WiFi Rev2" + }, + { + "name": "Arduino Nano Every" + } + ], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "7.3.0-atmel3.6.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.3.0-arduino17" + }, + { + "packager": "arduino", + "name": "arduinoOTA", + "version": "1.3.0" + } + ] + } + ], + "tools": [] + } + ] +} diff --git a/firmwares/MuxTO/JTAG2.h b/firmwares/MuxTO/JTAG2.h index 44b8dfb8..5a85942f 100644 --- a/firmwares/MuxTO/JTAG2.h +++ b/firmwares/MuxTO/JTAG2.h @@ -38,9 +38,9 @@ enum baud_rate { // *** Parameter Values *** constexpr uint8_t PARAM_HW_VER_M_VAL = 0x01; constexpr uint8_t PARAM_HW_VER_S_VAL = 0x01; -constexpr uint8_t PARAM_FW_VER_M_MIN_VAL = 0x00; -constexpr uint8_t PARAM_FW_VER_M_MAJ_VAL = 0x06; -constexpr uint8_t PARAM_FW_VER_S_MIN_VAL = 0x00; +constexpr uint8_t PARAM_FW_VER_M_MIN_VAL = 0x07; +constexpr uint8_t PARAM_FW_VER_M_MAJ_VAL = 0x01; +constexpr uint8_t PARAM_FW_VER_S_MIN_VAL = 0x07; constexpr uint8_t PARAM_FW_VER_S_MAJ_VAL = 0x06; extern uint8_t PARAM_EMU_MODE_VAL; extern baud_rate PARAM_BAUD_RATE_VAL; diff --git a/firmwares/MuxTO/MuxTO.bin b/firmwares/MuxTO/MuxTO.bin index 4b53c5d8..b2902861 100755 Binary files a/firmwares/MuxTO/MuxTO.bin and b/firmwares/MuxTO/MuxTO.bin differ diff --git a/firmwares/MuxTO/MuxTO.hex b/firmwares/MuxTO/MuxTO.hex index 03ccf359..012215d9 100644 --- a/firmwares/MuxTO/MuxTO.hex +++ b/firmwares/MuxTO/MuxTO.hex @@ -1,757 +1,770 @@ -:1010000000100020AD32000091320000A932000033 +:1010000000100020A91C00008D1C0000A51C000081 :1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000091320000FD -:101030000000000000000000913200001D3300009D -:101040009132000091320000913200009132000094 -:101050009132000091320000913200009532000080 -:1010600091320000B51B0000A51B0000913200006A -:101070009132000091320000913200009132000064 -:1010800091320000913200009132000010B5064C00 +:101020000000000000000000000000008D1C000017 +:1010300000000000000000008D1C0000191D0000D1 +:101040008D1C00008D1C00008D1C00008D1C0000FC +:101050008D1C00008D1C00008D1C0000911C0000E8 +:101060008D1C0000191C0000091C00008D1C0000D4 +:101070008D1C00008D1C00008D1C00008D1C0000CC +:101080008D1C00008D1C00008D1C000010B5064C4E :101090002378002B07D1054B002B02D0044800E039 -:1010A00000BF0123237010BDA0010020000000003C -:1010B0008C3D0000044B10B5002B03D003490448BD -:1010C00000E000BF10BDC04600000000A4010020E9 -:1010D0008C3D0000E12110B50248490200F05EFF9E -:1010E00010BDC046680400207047000010B5040021 -:1010F0000100024800F0C8FE200010BD6804002076 -:1011000010B5024800F0F2FEC0B210BD6804002025 -:1011100010B5024800F0C8FE10BDC04668040020AB -:10112000F8B5451E07000C0000F084FC0600EDB287 -:101130000F4800F057FC03231842F9D1300000F0AB -:1011400093FC280000F026FC0A4E3D1933199879CB -:1011500000F09BFCEDB20134E4B2AC4206D033198E -:10116000987900F0AFFC00F0CBFCF4E72000F8BD6C -:1011700002100000C001002070B5FFF7C1FF1B285E -:1011800001D0002070BD224900F08EFC0026040032 -:10119000FFF7B6FF1F4D2100A85500F085FC013672 +:1010A00000BF0123237010BD80010020000000005C +:1010B0007C3E0000044B10B5002B03D003490448CC +:1010C00000E000BF10BDC046000000008401002009 +:1010D0007C3E0000E12110B50248490201F080F990 +:1010E00010BDC0465C0400207047000010B504002D +:1010F0000100024801F0F6F8200010BD5C04002059 +:1011000010B5024801F020F9C0B210BD5C04002007 +:1011100010B5024801F0F6F810BDC0465C0400208E +:10112000F8B5451E07000C0000F0B6FC0600EDB255 +:101130000F4800F089FC03231842F9D1300000F079 +:10114000C5FC280000F058FC0A4E3D193319987967 +:1011500000F0CDFCEDB20134E4B2AC4206D033195C +:10116000987900F0E1FC00F0FDFCF4E72000F8BD08 +:1011700002100000A001002070B5FFF7C1FF1B287E +:1011800001D0002070BD224900F0C0FC0026040000 +:10119000FFF7B6FF1F4D2100A85500F0B7FC013640 :1011A0000400062EF4D1E122EB78A9781B0252004C :1011B0000B439342E5D8FFF7A3FF0E28E1D12100AE -:1011C00000F072FC00260400EA78AB7812021A43A1 +:1011C00000F0A4FC00260400EA78AB7812021A436F :1011D0002B791B041A436B791B0613439E420AD2D8 -:1011E000FFF78EFFAB192100987100F05DFC01360E +:1011E000FFF78EFFAB192100987100F08FFC0136DC :1011F0000400B6B2E8E7FFF783FF0500FFF780FFC2 :1012000003022B439BB21B1B58425841C0B2B9E7A3 -:10121000FFFF0000C001002070B51B20FFF766FF34 -:10122000184900F041FC00250400174E705DFFF7DF -:101230005DFF210000F038FC01350400062DF4D1DB -:101240000E20FFF753FF210000F02EFC00250400C4 +:10121000FFFF0000A001002070B51B20FFF766FF54 +:10122000184900F073FC00250400174E705DFFF7AD +:101230005DFF210000F06AFC01350400062DF4D1A9 +:101240000E20FFF753FF210000F060FC0025040092 :10125000F378B2781B021343AB420AD97319987919 -:10126000FFF744FF210000F01FFC01350400ADB280 +:10126000FFF744FF210000F051FC01350400ADB24E :10127000EEE7E0B22412FFF739FFE0B2FFF736FFE6 -:1012800070BDC046FFFF0000C001002010B5FFF791 -:101290003FFF024B1878FFF727FF10BDBF0100206A +:1012800070BDC046FFFF0000A001002010B5FFF7B1 +:101290003FFF024B1878FFF727FF10BD9F0100208A :1012A0000122034B9A7000229871DA707047C04691 -:1012B000C001002010B5022404220E4B01201C7036 -:1012C0000D4B1A7000F02AFC0821032000F06EFB81 -:1012D0008021200000F06AFB00231D21074A0848F6 +:1012B000A001002010B5022404220E4B01201C7056 +:1012C0000D4B1A7000F05CFC0821032000F0A0FB1D +:1012D0008021200000F09CFB00231D21074A0848C4 :1012E0009170D370074A195CD15401331D2BFAD188 -:1012F00010BDC046BE010020BF010020C00100207B -:1013000060000020C601002010B51C4BD8790138C0 -:1013100005282ED802F096FA030B172D1F2503225D -:101320009A700022DA700132DA711A7208E005212F -:10133000002299700131DA70DA7119725A72997259 -:1013400081229A7118E002229A700022DA700C4A07 -:101350001278DA71F4E702229A700022DA70094AF0 -:10136000F6E703229A700022DA708832DA71753A51 -:10137000DBE7A120FFF794FF10BDC046C0010020AD -:10138000BE010020BF01002010B5094BDA79032A05 -:1013900003D0052A08D0A12003E01A7A054B80204B -:1013A0001A70FFF77DFF10BD1A7A034BF7E7C046AE -:1013B000C0010020BE010020BF010020074B10B576 -:1013C0001A00FA321178064AFC3311701A78054B6C -:1013D00080201A70FFF764FF10BDC046C0010020D6 -:1013E000BC010020BD0100200B2010B500F0EDFA7B -:1013F000EF23184008280AD082280AD00222074B7F -:101400009A700022DA70A5329A71D87104E000F067 -:10141000B1FA8020FFF744FF10BDC046C001002094 -:1014200070B50B2000F0D1FA174C082808D0022321 -:10143000A3700023E370A533A371A43BE37170BDD7 -:10144000637A257A1B021D43637B207B1B022EB22D -:101450001843013E00F008FBF0B200F09BFA00F0E8 -:10146000F9FA0226E071AE4206D800F049FBA31952 -:1014700001369871B6B2F6E70135ABB21B0AE370DC -:101480008223A570A371DAE7C001002070B50500C2 -:10149000552000F017FBE02000F014FB0824013C6D -:1014A0002878E4B200F00EFB0135002CF7D170BDB6 -:1014B00010B500F05FFA0B2000F087FAEF23184018 -:1014C000082806D082280DD10B48FFF7DFFF00F077 -:1014D00051FA80200421400100F095FA8020FFF7A6 -:1014E000DFFE10BD0222054B9A700022DA70A53291 -:1014F0009A71D871F5E7C04691000020C001002024 -:1015000070B5164AD379052B05D8032B0FD8002BBD -:1015100005D0A0201EE0063B012BFAD870BD104874 -:10152000FFF7B4FF00F026FAFFF7C2FFF6E7032645 -:10153000157A547A0B4800F055FA3042FAD120025D -:10154000FF21284300F05FFA80200221400100F0D3 -:101550005AFA8020FFF7A4FEE0E7C046C001002051 -:10156000890000200210000070B5050000F062FA4A -:10157000040080202900400100F045FA200000F01E -:1015800073FA70BDF7B50B2000F01FFA394B08282D -:1015900008D002229A700022DA70A5329A71A43A19 -:1015A000DA71F7BDDA79587B11001D7B00024031FA -:1015B0000543C9B22EB2012929D82F4A1778012232 -:1015C0000092587A1C7A0002044323B22800019347 -:1015D000764200F049FA781E0640F6B2A64201DDD6 -:1015E0006B461E790A25002E09D029003000FFF72E -:1015F00097FD0500A41BA4B20098FFF7B5FF002CCF -:101600002FD0BEB2BC422ED329003800EFE71B49D1 -:101610000F78B32A05D8B12A0ED8A220FFF740FED2 -:10162000BFE7C12A03D8BF2AF7D90322C8E73C3253 -:10163000D2B2012AF1D8F8E71C7C114800F014FA64 -:10164000200000F022FA002000F01FFAF0B200F0B3 -:101650001CFA280A00F019FA80200721400100F046 -:10166000D2F98020DAE72900E0B2FFF759FD002423 -:101670000500C1E7C0010020BC010020BD01002021 -:101680000610000010B50121002001F019FFFFF73E -:1016900021FD00F07BFA044B04481A88044B1968BA -:1016A00001F090FD10BDC04686000020D40300204C -:1016B000800000209F4BF7B51B78002B00D0D6E0B0 -:1016C0009D4D280001F074FC9C4C061E13D0200098 -:1016D00000F0D8FBB04203DA200000F0D3FB060094 -:1016E000974F32003900280000F0BBFB3200390070 -:1016F000200000F0DFFB200000F0D0FB061E13D01E -:10170000280001F066FCB04203DA280001F061FC19 -:1017100006008B4F32003900200000F040FC320000 -:101720003900280000F080FA200000F05DFC854FB1 -:101730003B7883420FD0F022834E200033889343BE -:10174000338000F051FC0122804B38701A709042B7 -:1017500039D002283CD0200000F04CFC7C4F3B7874 -:10176000834215D00F22784E200033889343338074 -:1017700000F040FC0122754B38701A7090422AD05C -:10178000022828D0002803D1032332881343338052 -:10179000200000F035FC6F4F3B78834223D06A4E27 -:1017A0006D4A338820001340338000F029FC012269 -:1017B000664B387005381A70032814D8328802F046 -:1017C00041F80E4E51531023328813433380C2E741 -:1017D00030233288F9E7338818433080D8E78023F4 -:1017E0005B001343338096235C4EDB0032689A42E1 -:1017F00015D1200000F00AFC019000280FD101F063 -:101800009BFD574F3B68C01AC82808D90123494A95 -:10181000137001F091FD534B1860019B3B60200059 -:1018200000F0DCFB3368984203D1484B1B78002B57 -:1018300014D0200000F0EAFB00280FD0200000F0B8 -:10184000CDFB3060280001F0A5FB3F4B28001A8833 -:10185000316801F0B7FC00223C4B1A70F7BD8023C1 -:101860009B00BEE7C023FBE78023DB00B9E7314BD9 -:101870001B78002BF2D03A4C2368002B1CD101F0CE -:101880005BFD384B1B68C01A374B98421CD8FFF7DA -:1018900073FC0028E2D0354B987915281CD801F04C -:1018A000D1FF2F1F2926423F1D1D381D1D2C3C1D19 -:1018B0001D381D1D1D1D2C3201F03EFD2368C01A70 -:1018C000FA235B009842DAD900231A4A13700122E6 -:1018D000224B52421A60C1E7342827D0A02019E0D9 -:1018E000FFF7E8FCFFF798FCFFF7D0FCB6E7FFF73F -:1018F0000BFDF7E7FFF748FDF4E7FFF7D9FDF1E748 -:1019000004221B4B1A70FFF76FFD01F015FD2060DC -:10191000E8E78020FFF7C4FCE4E7FFF74FFDE1E7CD -:10192000FFF77EFDDEE7FFF72DFEDBE7FFF7E8FDC3 -:10193000D8E7C046CA030020D40300206804002072 -:101940008A030020880000208600002089030020F0 -:101950008803002084000020FFF0FFFF80000020AB -:10196000CC030020D003002060EA0000C00100206A -:10197000BF01002010B55921082000F017F8002100 -:10198000082000F013F80E240B2000F01EF820426F -:10199000FAD010BD10B50400552000F093F8A02037 -:1019A00000F090F8200000F08DF810BD70B5040034 -:1019B00055200D0000F086F820004038C0B200F03D -:1019C00081F8280000F07EF870BD10B504005520A5 -:1019D00000F078F820008038C0B200F073F800F012 -:1019E0008FF810BD10B50400552000F06BF80420EE -:1019F00000F068F8E0B200F065F8200A00F062F844 -:101A000000F07EF810BD70B504000D00552000F008 -:101A100059F8442000F056F8E0B200F053F8200ADC -:101A200000F050F800F06CF8280000F04BF800F0DF -:101A300067F870BD10B5552000F044F8292000F07B -:101A400041F800F05DF8040000F05AF8000220436D -:101A500080B210BD10B5552000F034F8242000F0FD -:101A600031F800F04DF810BD10B50400552000F01D -:101A700029F8692000F026F8E0B200F023F8200AE7 -:101A800000F020F800F03CF810BD10B5040055201F -:101A900000F018F8642000F015F8200000F012F8AB -:101AA00000F02EF810BD0000FF224840044BC0B2E9 -:101AB0004000C35A09125940C8B2934318437047B3 -:101AC000903A000070B50D4D01000400280001F0AF -:101AD0000DFB280001F071FA01F02EFC0600280031 -:101AE00001F066FA002804D101F026FC801B1328BF -:101AF000F5D9280001F072FA200070BD180400200A -:101B000010B5054C200001F053FA0028F9D0200050 -:101B100001F064FAC0B210BD18040020962170B51F -:101B2000174C0500174A2000490001F04BFB002D1F -:101B30001BD0012D0DD10021200001F0D7FA20008B -:101B400001F03BFA0021200001F0D0FA200001F062 -:101B500034FA0F2001F0F6FB200001F029FA051EEF -:101B600005D0200001F03AFAF6E72900EBE7E12181 -:101B70002000054A890201F025FB280070BDC046FF -:101B8000180400201304000031040000E12110B506 -:101B9000024A0348890201F015FB10BD3104000020 -:101BA0001804002010B5024801F060FA10BDC046CC -:101BB000D403002010B5024801F058FA10BDC04609 -:101BC00018040020F7B5002601240F4D0F49280006 -:101BD00000F03CF80E4F0F49380000F037F80E497E -:101BE0000E4800F033F839002300019602220094D9 -:101BF0000B4801F00FFA29000196032304220094F8 -:101C0000084801F007FAF7BD5C0400200008004214 -:101C100060040020000C0042001000426404002018 -:101C2000D403002018040020F8B505000E001700AA -:101C30000024BC4208D02B682800315D1B689847FF -:101C4000002801D00134F4E72000F8BD016070479E -:101C50009446F0B505AC25789C1E621E9441624600 -:101C600006689207376824063A4322430724326005 -:101C700000682140AD01002442682943022B00D0B6 -:101C80005C030A4322434260F0BD30B5C0250368BF -:101C9000AD031C6812052A402243C0240904A40293 -:101CA00021400A431A6003685A6814435C6030BDDF -:101CB0000123026811680B43136003681A68D20796 -:101CC000FCD4DA69D207F9D470470223026811689C -:101CD0000B4313600268D3699B07FCD47047036809 -:101CE0001A7ED20702D41A7E9207FCD570470022D2 -:101CF00003685A8370470368187E4007C00F704717 -:101D00000368187EC0097047802302685B42117E19 -:101D10000B43137670470368187EC007C00F7047E7 -:101D20000368188DC0B2704703681A7ED207FCD5CD -:101D300089B2012019857047012203689A7570479E -:101D4000012203681A7570470368194A30B5934237 -:101D500027D0184A934227D0174A934220D10B2309 -:101D60001021032501229A402B40AB40C224FC35B0 -:101D70009D401248A40002600259AA43C0259D401C -:101D80002B00134380220351D2010D4B0A435A808A -:101D90000C4A11680C4A11605A7852B2002AFBDBD7 -:101DA00030BD09230E21DCE70A230F21D9E7C04605 -:101DB00000080042000C00420010004200E100E078 -:101DC000000C0040140100209C000020F8B5040025 -:101DD0000F0016001D00FFF7B7FF2000FFF768FF98 -:101DE0001C21BB000B4071072268090C0B431360D8 -:101DF000842322689375012F1AD11021012E00D05F -:101E000008390C4B69431868C00001F025FD072212 -:101E1000216802408B895203DB04DB0C13438B8166 -:101E2000226803049089DB0C400B40031843908127 -:101E3000F8BDC0469C00002010B5040001F07CFAFB -:101E4000E060236820005B699847002808DA01F009 -:101E500073FAE368C01AA3689842F2D301204042A3 -:101E600010BDF8B506000D0017000024BC4207D0D5 -:101E70003000FFF7E1FF002802DB28550134F5E7C9 -:101E80002000F8BD3F20704713B56B460268D9713A -:101E90000733546819000122A04716BD10B502216E -:101EA000006900F061FC10BD10B50321006900F06D -:101EB00071FC10BD10B5130004000A000069032175 -:101EC00000F060FD002801D10123636010BD000017 -:101ED00010B5054C03002068421C04D11A68180094 -:101EE00052699047206010BDE8000020074A0300B7 -:101EF000106810B5411C03D001235B42136010BD74 -:101F00000221186900F030FDF9E7C046E800002022 -:101F100010B503783A22023303700249024800F0F8 -:101F2000DDFD10BDAC0000208404002010B5027857 -:101F30004378A12A0AD1212B01D0002005E00722F5 -:101F40001349144800F0CAFD012010BD212AF4D124 -:101F5000202B10D10E490F481A3A00F05FFC962250 -:101F60000B4BD2001968914202D1DB79DB07E4D533 -:101F700001F09EFBE1E7222B03D18278044BDA715A -:101F8000EDE7232BD9D14288034B1A60D5E7C04631 -:101F9000A400002084040020A00000207047F7B5B2 -:101FA00005001700019101F0C7F90024E860BC4268 -:101FB00011D2019A022128693B1B121900F068FC1A -:101FC000061E01D0A419F2E701F0B6F9EB68C01AB9 -:101FD000AB689842F6D32000FEBD0000014B1868A4 -:101FE0007047C046A4000020014B1879C0B270476A -:101FF000A4000020014B5879C0B27047A400002013 -:10200000014B9879C0B27047A4000020024BD879E8 -:10201000012318407047C046A4000020FA22002186 -:10202000054B92009A60054A08321A60044A5960CA -:102030001A6119767047C04668040020E43C00002D -:102040008404002070B50F26CB1D02003240D5B2AB -:102050002C0000093034092A00DD07341C705A1E98 -:10206000994200D170BD1300EFE7000070B58229DE -:102070001FD1C3B22B4D5A01AA1891692A4C800175 -:102080000C40C0218905214391612849083340183B -:10209000802150612A685B01D018047949422143AC -:1020A00001717020995C81430800302101439954EB -:1020B00070BD0029FCD1C0241A4EC3B25901711859 -:1020C0008A68194DA4052A4022438A60184A800173 -:1020D000801832680726083348605B01985CB0437B -:1020E0000600012030439854886905402C438C61D8 -:1020F00070240E484861985CA043040010202043DF -:10210000985488680B4CD318044080204022400328 -:10211000204388608868800B8003886059790A436F -:102120005A71C5E7BC070020FFFFFF8FB0040020F5 -:10213000B0050020FF3F00F070B50400012320CC63 -:1021400000212A782000134380222B70520001F0D6 -:1021500002FCAB78DB07FCD46C6270BD1F22144B11 -:1021600070B51B68590B9C0C9B0111405B0F224002 -:102170001F2900D11A391F2A00D1023A072B00D19A -:10218000043B1F2500688E01048D0A492A40214026 -:1021900031430185018D14000A00AA4322430285C0 -:1021A000028D1903044B13400B43038570BDC046D9 -:1021B000246080003FF8FFFFFF8FFFFFEFF31083E5 -:1021C00003600123436072B670470368002B02D19D -:1021D00062B6BFF36F8F704737B505690400684674 -:1021E000002D14D1FFF7EAFF019B621D013B02D3D2 -:1021F000D57FEDB2FAE768460193FFF7E6FF002DC1 -:1022000001D100203EBD206AE369C01AFAE7FFF75A -:10221000D5FF22000025019B3432013B02D3157803 -:10222000EDB2FAE768460193FFF7CFFF002DE8D043 -:10223000206BE36AE9E70000F0B5FF25012642685C -:10224000836811682B405B01CC186419A77AD318F6 -:102250003E43A672C6689C680B4FB60436093C40E4 -:1022600034439C6083682B405B01D2189468A40BB4 -:10227000A4039460402283682B4008335B01CB1891 -:1022800019790A431A71F0BDFF3F00F0F7B50569EF -:1022900004000E0017006846002D43D1FFF78EFFA3 -:1022A000019B601D013B5A1C0BD0C27F591E002AA6 -:1022B00005D168460193FFF788FF2800FEBD0B009B -:1022C000F1E768460193FFF780FFE369AF420AD068 -:1022D000226A9A4207D95A1CE261A269D3181B7874 -:1022E00073550135F1E7226A9A42E6D10023E36192 -:1022F000013368462361FFF761FF22000021019B43 -:10230000671D013B3532581CD3D0F97710785E1E1B -:10231000002805D0200011700193FFF78DFFECE736 -:102320003300F0E7FFF74AFF2000019B3430013B08 -:102330005A1C06D00278591ED5B2002AB9D00B001B -:10234000F6E7684601930025FFF73FFFE36ABD42C9 -:1023500002D0226B9A421CD8226B9A42ADD1002344 -:102360006846E3622361FFF729FF2700220000216E -:10237000019B3437013B3532581C9AD039701078A4 -:102380005E1E00280DD0200011700193FFF754FF4E -:10239000EBE75A1CE262A26AD3181B787355013529 -:1023A000D4E73300E8E7F7B582684368D2B211009A -:1023B00004000831186849014118C879C00729D5B7 -:1023C00001255201CD719B189A6861699204920CA3 -:1023D000002923D12262226A002A41D0A26A6561C3 -:1023E00068465A60FFF7EAFE342294462200019BB9 -:1023F000671D013BA4443532591C2DD06146FD7741 -:102400000978581ECEB2002905D001936846157090 -:10241000FFF7DBFEF7BD03001670EDE72263226BCA -:10242000002A1DD0002227006261A26968465A6016 -:10243000FFF7C4FE019B621D9446013B34373032E6 -:10244000591C09D061463D70C97F581ECEB2002983 -:10245000DBD103001670F3E768460193FFF7B5FE82 -:102460002000FFF7E9FED5E713B56A4600230C000C -:10247000D01DD371FFF74CFD23681818206001F0C0 -:10248000CDF96B46D91D01F086F9236818186B4603 -:102490002060D87916BD000003290ED180220E4B92 -:1024A00062311B68FF31585C524202435A54682221 -:1024B0006339FF32FF39995470470129FCD18022DA -:1024C000054B24311B68FF31585C524202435A5479 -:1024D00028222339FF32EDE7BC07002070B5002425 -:1024E000274B0121050020001C7000F0E9FF0121AD -:1024F000200000F0E9FF234B012120001C7000F0B8 -:10250000DFFF0121200000F0DFFF20231E4A05200D -:10251000D1690B43D3610F2101F028F80F21062068 -:1025200001F024F8194B1A4A5A805A7852B2002AFC -:10253000FBDB184800F0FAFE174C2000FFF7FCFD0B -:102540002000FFF70BFE7F212368C1201A7880004E -:102550000A401A70042219780A430C211A701A8949 -:102560008A430E491A810A581202120A0A5080221E -:102570000A6019787E3A0A431A7001232B7070BDE5 -:10258000A5040020A404002000040040000C00402A -:1025900006400000612F0000BC07002000E100E0C1 -:1025A0000078002810D00121084B1B681A898A4343 -:1025B0001A810822198B0A431A830422198B0A43B1 -:1025C0001A830022024B1A607047C046BC070020E5 -:1025D000B40700200A000E498B699B0B9B038B619B -:1025E0000B680221FF33197298798239014399717E -:1025F000197A8907FCD57F20064B0240997A8143DE -:10260000114380229972997A52420A439A72704712 -:10261000BC0700200050004110B50B790C00002BC6 -:102620000CD10800FFF782FC002801D0012010BD6A -:10263000094A93699B0B9B039361F7E701F0EEF85E -:10264000210001F0DBF80028F0D1034A93699B0BCD -:102650009B039361EBE7C046BC070020F7B50C0075 -:102660001100832A19D1E3B2314D5A01AA18916998 -:102670003048A4010840C0218905014391612E49D9 -:10268000286864187021083354615B011A5C8A431E -:10269000110040220A431A54F7BD022A44D1A30074 -:1026A0000193264BA200D658002EF5D1382000F019 -:1026B00085FE8027224B7F0003601D4B066243602E -:1026C000431D846006614661C661C760DE772F33B3 -:1026D0000500C66206631E7038005E7001F028F9BE -:1026E0000600A861380001F023F9E4B2104A630142 -:1026F000A862D3189A680F4907201140C02292059A -:102700000A439A600A4A083412686401A15C814352 -:10271000080003210143A15428005E60FFF78CFDEF -:10272000064B019AD550B7E72000FFF79FFCB3E7AF -:10273000BC070020FFFFFF8FB004002088040020AA -:10274000143D000070B505000124064BA200D258CC -:10275000002A05D021002800FFF780FF0134F4E7AC -:1027600070BDC046EC000020084B8A00D05810B560 -:10277000002803D003689B68984710BD044BC9B27A -:102780004901591888688004800CF6E78804002005 -:10279000BC07002010B50C00FFF7E6FF00280CD0A6 -:1027A000064BE4B219688023083464010C1962797D -:1027B0005B42134363710223E37110BDBC07002029 -:1027C00070B5CBB2124A13485C018901891802190D -:1027D00051609168104D08330D40802189022943D2 -:1027E000402591609168890B8903916001685A01C5 -:1027F0008A1816793543157195796D06FCD55B01FC -:10280000C918CB79DB07FCD500198068C0B270BD50 -:10281000B0050020BC070020FF3F00F070B5140099 -:1028200040220B4B0D001B68FF3359790A435A7144 -:102830000021FFF7C5FFA04200D920000023054971 -:10284000A34203D0CA5CEA540133F9E770BDC04625 -:10285000BC070020B005002010B50C48C9B24901E2 -:10286000421893689B049B0C3F2B0BD99468403B08 -:102870009B04A40B9B0CA40323439360411888681A -:10288000C0B210BD93689B0B9B03F6E7BC0700200A -:10289000F0B51C002F4B85B01B6806000D0001929F -:1028A000002B54D02C4F3B78D8B2002B02D1010022 -:1028B00000F00AFE64233B70284BAA00D058002881 -:1028C00008D0036822005B68019998470400200043 -:1028D00005B0F0BD29003000FFF746FF844204D95F -:1028E00029003000FFF740FF040029003000FFF707 -:1028F000B3FF0121EBB21A4F03935B010293029ADB -:102900003B6801989B18FF335A7A0A435A72154B59 -:10291000A9012200C91801F015F8002CD7D0290010 -:102920003000FFF721FF0028D1D14021039B3A68F6 -:1029300008335B01D3181879014319710121D9714A -:10294000029BD318FF339A7A0A439A72BFE7012495 -:102950006442BCE7B4070020A404002088040020DF -:10296000BC070020B005002013B56B46DC1D22001B -:102970000123FFF78DFF012801D1207816BD01202A -:102980004042FBE7F0B51C003A4B85B01B680E00D7 -:102990000192002B3FD08023DB019C423BD8364D77 -:1029A0002B78D8B2002B02D1010000F08DFD6423FA -:1029B00000272B70314BB201D3180293002C2CD07E -:1029C0002F4B1B680393FF2333401D0000930835F2 -:1029D000039B6D015D19AB79DB0921D0294B2A4995 -:1029E000186800F039FF294B1721584300F034FFD5 -:1029F000274BEA79920713D49A5D002A01D1013856 -:102A0000F7D201229A55009B5A011D4B9B189A69D7 -:102A1000920B92039A6101277F42380005B0F0BD06 -:102A200000221B4B25009A553F2C00D93F252A0038 -:102A30000199029800F086FF009BA9045A01104BEF -:102A4000890C9B18029A7F195A619A69641B920B30 -:102A500092030A439A61009B039A08335B01D318DF -:102A60000222DA715979823A0A435A71019B5B1941 -:102A70000193A3E7B4070020A5040020B0040020C0 -:102A8000BC0700201401002040420F00701101001B -:102A9000A704002070B50C001D000D4BA601F61810 -:102AA000110030002A0000F04DFFE4B2094A640131 -:102AB00014196661A369084928000B40A361A16944 -:102AC000AB04890B9B0C89031943A16170BDC046FF -:102AD000B0040020BC070020FF3F00F0F7B5104B0A -:102AE0000F001B7814000190002B0CD10D4B160029 -:102AF0001D78002D09D00C4E0C48358828182D194A -:102B000000F020FF35802000FEBD002EFBD03300FA -:102B10007A1900210198FFF7BDFF2D18361AF4E746 -:102B2000B0060020B1070020B2070020B106002047 -:102B3000F8B500200D00140000AF012A27D9D31DDD -:102B40006A46DB08DB00D31A9D46080000F07CFFD4 -:102B50006E46032302220021013040003070737062 -:102B6000A2420DD2287800280AD0531CDBB20135CE -:102B7000B0549C4203D00232F154D2B2F0E72200AA -:102B800031000448FFF7AAFF431E9841C0B2BD467A -:102B9000F8BDC04684040020F0B50025012785B0AB -:102BA000184B0E0069461F7004000095FFF75CFC8F -:102BB000154B01A90B806A3BFF3BCB715A330B725B -:102BC000009B320009334B800E4B8D714F710871A1 -:102BD0001D70092E0FD00D4E092237700C4F2000AA -:102BE00000953D80FFF77AFF69462000FFF73CFC27 -:102BF0003A88084935702000FFF770FF012005B0C2 -:102C0000F0BDC046B006002009020000B107002058 -:102C1000B2070020B106002070B5CE7805000C0088 -:102C200092B0022E08D1C9882B48FFF7B5FF431E8A -:102C30009841C0B212B070BD00F0F0FD210000F06C -:102C4000BEFD002803D0C317181AC00FF2E7012EEB -:102C50000BD1E2882149112A10D8D2B2002A0DD016 -:102C60002800FFF73BFF0120E4E7032EE2D1A37821 -:102C7000002B05D1E2881A49032AEED90A78EFE73A -:102C8000022B05D1A27917492800FFF751FFD1E7A0 -:102C9000012B02D1A2791449F6E7032BCAD1134BB9 -:102CA00001A91868FFF7CEF9114B03A91868FFF7BF -:102CB000C9F9104B05A91868FFF7C4F90E4B07A90D -:102CC0001868FFF7BFF900F0A9FD09A900F087FD1A -:102CD000A27901A9D8E7C04684040020443D000041 -:102CE000343D0000203D0000383D00000CA0800075 -:102CF00040A0800044A0800048A0800073B506007A -:102D000048780D000B2810D800F09CFD061B0F31F1 -:102D10000F474C7450536D70097801AA002906D1F1 -:102D2000022311803000FFF7B5FE012076BD00239D -:102D30001380314B1B78012B00D11370022300212B -:102D4000F0E78A780023012A09D16A4693802B4B49 -:102D50001B78012B00D11371022301AAEFE7264A49 -:102D60001370274A93699B0B9B039361DDE78C7873 -:102D7000012C07D1214B01AA1C70224B1B78137028 -:102D80002300DCE7002C08D101201B4B1C4A1870E3 -:102D900093699B0B9B039361C8E73000A978FFF709 -:102DA00019FCC2E73000FFF737FFBFE70123164ADF -:102DB000C5E70B780020DB06B8D13000FFF7C2FC76 -:102DC0002A200221AA78104BFF301A600C4A13689F -:102DD0001C5C21434A241954FF34195D2938FF38FB -:102DE00001431955D4E70123084AA8E78A78074B1D -:102DF0001A60B6E7002099E7A6040020AE04002080 -:102E0000BC070020083D0000B4070020B8070020E0 -:102E10004B4BF7B51C780700002C00D08FE0494ED3 -:102E200033689B8B1B070ED521002000FFF71EF98E -:102E3000326810231100FF31887A03438B72424BB2 -:102E40001C600823938333689A8B52071FD5042292 -:102E50009A833E4A1378002B0AD01378013BDBB2E9 -:102E600013701378D8B2002B02D1012100F02CFB93 -:102E7000374A1378002B0AD01378013BDBB213706A -:102E80001378D8B2002B02D1012100F01DFB33686A -:102E9000FF331A7AD2061ED510221A7259793032AF -:102EA0000A435A7160232B4938000A781A423BD1F1 -:102EB000FFF724FF3368FF33002838D08022997948 -:102EC00052420A439A711A7A520604D540221A7263 -:102ED000597A0A435A72336807241D8C01239D4393 -:102EE000EDB20193E1B2002D29D0002C27D02B00A8 -:102EF0002341019A134215D02300326808335B0145 -:102F0000D318DA79D20702D4DB799B0707D5124BA5 -:102F1000A200D05800280ED003681B689847019B78 -:102F2000A3409D43013CDDE7FFF776FBC2E720218C -:102F30000A4A9171C7E73800FFF7AEFAEFE7F7BD2D -:102F4000B1070020BC070020B4070020A504002022 -:102F5000A4040020B005002088040020FF50004198 -:102F600010B50248FFF754FF10BDC046840400208E -:102F7000014B024A1A607047BC0700200050004114 -:102F80000120704710B50368014A1B6A984710BDBD -:102F90001304000010B504000069FEF789FE20004C -:102FA000143000F0B9FB2000203000F0B5FB10BD5C -:102FB00010B5143000F0C5FB10BD10B504002000A2 -:102FC000203000F0BEFB0028F9D12069FEF787FE13 -:102FD00010BD10B5203000F0BAFB10BD70B5060072 -:102FE00004001436300000F09BFB230030331B78C4 -:102FF0000500FF2B07D0300000F0A9FB0A2802DDF6 -:10300000A36BE26B1A60280070BD10B5143000F09D -:10301000ACFB10BDF7B51D0008AB1B780400009396 -:1030200009AB1B781600019300234360FA239B0031 -:1030300083600D4B0F0008330360143000F050FB29 -:103040002000203000F04CFB2300009A2C33276135 -:103050009A70019A1E70DA7022005D70FF23303280 -:10306000200013701374FEBD583D000070B50400BD -:103070000069FEF740FE002815D025002069FEF704 -:103080004FFE14350100280000F039FB23003033D7 -:103090001B78FF2B07D0280000F059FB092802DC21 -:1030A000636BE26B1A602069FEF735FE00280DD0D5 -:1030B00025002035280000F044FB002812D028000D -:1030C00000F02EFBC1B22069FEF72EFE2069FEF74C -:1030D00017FE002805D02069FEF716FE2069FEF7CE -:1030E00006FE70BD2069FEF72BFEEFE7F8B5040081 -:1030F00000690D002600FEF70EFE2036002834D1B0 -:103100003F27300000F03CFB002825D0EFF3108370 -:103110000122134211D1EFF305831A003A403B42DA -:10312000EFD0103A53B2002A10DA0F221340083BB6 -:10313000134A9B089B009B181B682069FEF7EBFD58 -:103140000028DED02000FFF791FFDAE79B080D4A48 -:10315000C0339B009B58F0E73000290000F0CFFA05 -:103160002069FEF7E9FD0120F8BD300000F0E9FA22 -:103170000028C5D129002069FEF7D6FDF3E7C04637 -:103180001CED00E000E100E0F0231B01194080236A -:1031900006209B0099420AD00133FF330130994247 -:1031A00005D0802300205B00994200D10530704794 -:1031B0000F2001400020012903D00239481E81411F -:1031C000481C70470300F0B5040085B003912C3310 -:1031D0000E211878150000F0C9F9230026002D33C0 -:1031E00018780E212F3600F0C1F93378022B07D161 -:1031F000230040331878FF2802D00E2100F0B6F9E2 -:10320000270030373878FF2814D0012100F058F912 -:103210000C213B781B4A59438B5C52185178012290 -:103220008A401948DB01181860631848E2631B18CC -:10323000A3631A600122039B11002069FEF7C6FDFB -:1032400029002000FFF7A0FF290007002000FFF75A -:10325000AFFFF0221540303D6A425541030039006E -:10326000206901220095FEF7F3FC23002E331A7823 -:1032700031782069FEF709FD2069FEF726FD05B0CB -:10328000F0BDC046903C0000184400411444004189 -:10329000FEE70000034B10B51B68002B00D09847D9 -:1032A00010BDC046C00800200DBEFEE7134A1448FA -:1032B000110010B5134B824202D0934212D1130079 -:1032C000824212D10222104B5A62104B0832DA703D -:1032D0000F4B20329A7300F085F800F04FF8FEE7AC -:1032E00010CB10C18142FBD3EAE70A4A8B42E9D0F6 -:1032F0000021094B9A42E5D202C2FBE70000002000 -:10330000A0010020903D0000FC70004100500041F1 -:1033100000480041A0010020E808002010B500F09E -:103320002AF8002801D100F01BF810BD014B1860ED -:103330007047C046C0080020014B18687047C0465F -:10334000C408002070B5041E07D0044D2E6800F09C -:1033500011F82B689B1BA342F9D370BDC408002051 -:1033600010B5034A13680133136000F0A9F910BDCA -:10337000C4080020704700207047704710B500F067 -:103380006FF800F0B1FAFFF7F8FF0120FFF7DAFF5E -:10339000084C2000FFF7A2F82000FFF701F9FEF724 -:1033A00071F9FEF787F9044B002BFAD000E000BF5B -:1033B000F7E7C046840400200000000010B500F0CC -:1033C000B7FA10BD024A53785BB2002BFBDB7047A3 -:1033D000000C004010230249CA681A42FCD0704712 -:1033E00000080040822210B5154B164C5A60A38C81 -:1033F000023A9343A384FFF7EDFF8022124B920021 -:103400001B689B0E9B021343A362104BE362922343 -:103410005B00A384FFF7DEFF0223A28C1343A38487 -:10342000FFF7D8FF80230A4C5B00A360FFF7CAFFB9 -:10343000084B6360FFF7C6FF074B084A1A6010BDD0 -:1034400000400041000800402460800080BB0A7CEE -:10345000000C00400007030014010020006CDC0297 -:10346000C0201249124B134A10B54B60136A000674 -:103470001B021B0A03431362002407238C600B60AA -:103480008021136A09061B021B0A0B4313620A4BB5 -:10349000196A1A6A1143094A0A431A6220001A215A -:1034A000013400F00DF8072CF8D110BD10E000E059 -:1034B0007FBB000000ED00E000040040FC050000C0 -:1034C00010B500F053F810BDF7B50C224243244D5F -:1034D0000191535D042B2DD00027AA185278214E5C -:1034E000DB01D418A419204E24789E59E4B2BE42C0 -:1034F00003D0013797407E1EB7411B4E9E19366997 -:10350000B44600266146B14203D001369640711E92 -:103510008E41002F17D10C37784301992D18686818 -:1035200001290DD1012E06D1410706D4D3180D4A29 -:103530009B181C70F7BD0107F8D504210C43F5E773 -:1035400004218C43F2E701209040019A012A03D123 -:10355000054A9B189861EDE7034A9B185861E9E713 -:10356000903C000040440041004400410C22504384 -:10357000494B70B5C65C1B185C78DD78042E00D111 -:1035800087E0081F172842D800F05CF90C31313170 -:10359000414141413333393D3D4141414141413F49 -:1035A000418341830023002E33D0F0013B4E22188B -:1035B00092191678042232404E1F022E3BD82D0756 -:1035C00001D540252A4372B6002901D01A2935D1E8 -:1035D0000123A340324941184B608B6104239A4375 -:1035E0002E4923185B181A7062B6002070BD0123A3 -:1035F000D9E706232B405A1E93410433D3E7012316 -:103600002B400233CFE70623CDE70723CBE709237F -:10361000C9E7022CC9D10629C7D0224A1078002850 -:10362000C3D01670204A1078A0431070D079C0091A -:103630000128FBD0B9E702263243C0E78D1E012DD9 -:103640000CD80123A340164D45196B60032903D103 -:103650006B6104231A43C3E7AB61FAE7012904D184 -:10366000A1400F4BC3189960B8E7104965082D18A1 -:103670006D18E10707D50F2629781B0131400B4350 -:103680002B700123E6E70F262978B14319432970EF -:10369000F7E701204042A9E7903C00004044004188 -:1036A00000440041C8080020002800423044004186 -:1036B0000122024B52421A607047C0461801002096 -:1036C000054A10B51368591C05D0013B1360002B47 -:1036D00001D1024B984710BD1801002001000020C5 -:1036E00010B50400802000F023F980220021206022 -:1036F00000F031F9002320006360A36010BD7F2239 -:10370000436810B50133134082689A4203D042687F -:103710000468A154436010BD002343608360704778 -:10372000826843689A4209D07F2183680268D25C2C -:10373000836801330B4083601000704701204042D2 -:10374000FBE743688068181A00D5803070474268EC -:1037500083689A4204DB43688068C01A7F307047F0 -:1037600083684068181A0138F9E7826843689A420A -:1037700003D083680268D05C704701204042FBE7B9 -:1037800003007F2240689B6801301040C01A43420A -:103790005841C0B2704770B50E0000254468002C37 -:1037A0000BD02368310020005B689847002802DBBB -:1037B000E4682D18F3E701256D42280070BD70B54F -:1037C0000D004468002C08D02368290020009B6865 -:1037D0009847002802D1E468F4E7200070BD70B576 -:1037E0000C004568002D07D02B6821002800DB68FD -:1037F0009847ED682418F5E7257070BD70B50D0089 -:103800004468002C08D02368290020001B689847D2 -:10381000002802D1E468F4E7200070BD064A0123C5 -:10382000116810B50C0005481C40194203D1044929 -:1038300044600180136010BDCC080020D008002037 -:103840000204000002B4714649084900095C4900BD -:103850008E4402BC7047C046002934D001230022A8 -:1038600010B488422CD301242407A14204D28142FF -:1038700002D209011B01F8E7E400A14204D281420F -:1038800002D249005B00F8E7884201D3401A1A438C -:103890004C08A04202D3001B5C0822438C08A042C3 -:1038A00002D3001B9C082243CC08A04202D3001B79 -:1038B000DC082243002803D01B0901D00909E3E7F3 -:1038C000101C10BC704701B5002000F00BF802BDC1 -:1038D0000029F8D003B5FFF7C1FF0EBC4243891A97 -:1038E0001847C0467047C04670B500260C4D0D4CB9 -:1038F000641BA410A64209D1002600F0BDF80A4DB1 -:103900000A4C641BA410A64205D170BDB300EB584D -:1039100098470136EEE7B300EB5898470136F2E7D7 -:103920008001002080010020800100209001002003 -:1039300010B5034B0100186800F016F810BDC04622 -:103940001C010020002310B59A4200D110BDCC5CB0 -:10395000C4540133F8E703001218934200D17047B2 -:1039600019700133F9E70000F8B50323CD1C9D431E -:10397000083506000C2D1FD20C25A9421ED8300098 -:1039800000F069F825490A681400002C1AD1244F68 -:103990003B68002B04D12100300000F043F8386070 -:1039A0002900300000F03EF8431C2AD10C233000DF -:1039B000336000F051F803E0002DDEDA0C233360B1 -:1039C0000020F8BD23685B1B18D40B2B03D92360A0 -:1039D000E418256003E06368A2420DD10B6030005B -:1039E00000F03AF8200007220B30231D9043C21A42 -:1039F000E7D01B1AA350E4E75360F0E722006468A5 -:103A0000C3E70323C41C9C43A042E2D0211A300028 -:103A100000F008F8431CDCD1C8E7C046D8080020F5 -:103A2000DC080020002370B5064C05000800236068 -:103A300000F014F8431C03D12368002B00D02B6046 -:103A400070BDC046E40800200023C25C0133002A98 -:103A5000FBD1581E7047704770470000044A136836 -:103A6000002B03D01818106018007047014BF9E7BD -:103A7000E0080020E8080020F8B5C046F8BC08BC03 -:103A80009E467047F8B5C046F8BC08BC9E467047D5 -:103A90000000891112239B322446AD573665BF744E -:103AA000488CC19D5AAFD3BE6CCAE5DB7EE9F7F8FE -:103AB0008110080193331A22A5562C47B7753E642E -:103AC000C99C408DDBBF52AEEDDA64CBFFF976E8DE -:103AD00002218B30100299132667AF763444BD550E -:103AE0004AADC3BC588ED19F6EEBE7FA7CC8F5D9BE -:103AF00083310A2091121803A7772E66B5543C45EE -:103B0000CBBD42ACD99E508FEFFB66EAFDD874C99D -:103B100004428D5316619F702004A9153227BB36CD -:103B20004CCEC5DF5EEDD7FC6888E1997AABF3BA7D -:103B300085520C4397711E60A1142805B3373A26AD -:103B4000CDDE44CFDFFD56ECE9986089FBBB72AA5D -:103B500006638F7214409D512225AB343006B9178D -:103B60004EEFC7FE5CCCD5DD6AA9E3B8788AF19B3D -:103B700087730E6295501C41A3352A24B11638076D -:103B8000CFFF46EEDDDC54CDEBB962A8F99A708B1D -:103B9000088481951AA793B62CC2A5D33EE1B7F04D -:103BA0004008C919522BDB3A644EED5F766DFF7CFD -:103BB000899400859BB712A6ADD224C3BFF136E02D -:103BC000C1184809D33B5A2AE55E6C4FF77D7E6CDD -:103BD0000AA583B4188691972EE3A7F23CC0B5D10D -:103BE0004229CB38500AD91B666FEF7E744CFD5DBD -:103BF0008BB502A499961087AFF326E2BDD034C1ED -:103C0000C3394A28D11A580BE77F6E6EF55C7C4D9C -:103C10000CC685D71EE597F42880A1913AA3B3B2CC -:103C2000444ACD5B5669DF78600CE91D722FFB3E7C -:103C30008DD604C79FF516E4A9902081BBB332A2AC -:103C4000C55A4C4BD7795E68E11C680DF33F7A2E5C -:103C50000EE787F61CC495D52AA1A3B03882B1938C -:103C6000466BCF7A5448DD59622DEB3C700EF91F3C -:103C70008FF706E69DD414C5ABB122A0B99230836C -:103C8000C77B4E6AD5585C49E33D6A2CF11E780F1C -:103C9000000219087F00000080000280000E190851 -:103CA0003F40000080061080000F19083F700000A0 -:103CB00019070180001619081F40000080160680B1 -:103CC000001719080F40000080161280001819080C -:103CD0000F80000080161280001919080F80000064 -:103CE000801612800000000000000000891E000005 -:103CF000B51E0000851E0000A91E00009D1E0000CC -:103D0000ED1E0000D11E00000000000000000000B9 -:103D100000000000A72300008D220000D921000030 -:103D200041726475696E6F204E616E6F20457665D5 -:103D3000727900000403090441726475696E6F2092 -:103D40004C4C430012011001020000404123580076 -:103D5000000101020301000000000000000000005B -:103D6000ED300000291C0000D32F0000BB2F000005 -:103D7000B12F0000DD2F00000B300000852F000068 -:103D8000C5310000952F0000812F000000000000C9 -:103D900010B572B68122114B92000433934213D3B3 -:103DA0000F4A01211000147D0C42FCD02021148BFD -:103DB000FF319B085B0021431183D361094B1380C2 -:103DC0000123027D1A42FCD0BFF34F8F064B074AF6 -:103DD000DA60BFF34F8FC046FDE7C0460010000019 -:103DE0000040004102A5FFFF00ED00E00400FA05DD -:103DF000860101000601010006010000000000002C -:103E00004A544147494345206D6B49490000000031 -:103E100000C20100080013040165736172454D562C -:103E20004E20676F72504D564E00000040420F000A -:103E3000FFFFFFFF00C201000000080009040000AE -:103E400001020200000524001001042402060524DA -:103E50000600010524010101070581031000100976 -:103E6000040100020A0000000705020240000007EA -:103E70000583024000000000FFFFFFFF000000007C -:103E8000830000000200000082000000000000002B -:103E90000000000000000000000000000000000022 -:103EA0000000000040420F00FFFFFFFF2001002044 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F1000B5100000C51B00001D200000712F00001F -:103F20008D100000000000000000000000000000F4 -:04000003000032AD1A +:1012F00010BDC0469E0100209F010020A0010020DB +:1013000060000020A601002010B51D4BD8790138DF +:10131000052830D802F0B2FA030B192F2127032237 +:101320009A700022DA700132DA711A720AE005222C +:101330009A7000220121DA700732DA715A72013A8A +:1013400019729A7281229A7118E002229A70002210 +:10135000DA700C4A1278DA71F4E702229A700022ED +:10136000DA70094AF6E703229A700022DA708832AE +:10137000DA71753AD9E7A120FFF792FF10BDC04698 +:10138000A00100209E0100209F01002010B5094B04 +:10139000DA79032A03D0052A08D0A12003E01A7ABB +:1013A000054B80201A70FFF77BFF10BD1A7A034BA4 +:1013B000F7E7C046A00100209E0100209F01002009 +:1013C000074B10B51A00FA321178064AFC33117037 +:1013D0001A78054B80201A70FFF762FF10BDC046D7 +:1013E000A00100209C0100209D0100200B2010B5D1 +:1013F00000F01DFBEF23184008280AD082280AD0ED +:101400000222074B9A700022DA70A5329A71D871C5 +:1014100004E000F0E1FA8020FFF742FF10BDC04673 +:10142000A001002070B50B2000F001FB174C08282C +:1014300008D00223A3700023E370A533A371A43B5B +:10144000E37170BD637A257A1B021D43637B207BA9 +:101450001B022EB21843013E00F038FBF0B200F040 +:10146000CBFA00F029FB0226E071AE4206D800F06C +:1014700079FBA31901369871B6B2F6E70135ABB224 +:101480001B0AE3708223A570A371DAE7A001002094 +:1014900070B50500552000F047FBE02000F044FB4C +:1014A0000824013C2878E4B200F03EFB0135002C12 +:1014B000F7D170BD10B500F08FFA0B2000F0B7FA2D +:1014C000EF231840082806D082280DD10B48FFF7DB +:1014D000DFFF00F081FA80200421400100F0C5FA0E +:1014E0008020FFF7DDFE10BD0222054B9A7000221E +:1014F000DA70A5329A71D871F5E7C04691000020E4 +:10150000A001002070B5164AD379052B05D8032B0E +:101510000FD8002B05D0A0201EE0063B012BFAD8E7 +:1015200070BD1048FFF7B4FF00F056FAFFF7C2FF96 +:10153000F6E70326157A547A0B4800F085FA304214 +:10154000FAD12002FF21284300F08FFA80200221E7 +:10155000400100F08AFA8020FFF7A2FEE0E7C046D3 +:10156000A0010020890000200210000070B50500D5 +:1015700000F092FA040080202900400100F075FA82 +:10158000200000F0A3FA70BDF7B50B2000F04FFA71 +:10159000394B082808D002229A700022DA70A5324E +:1015A0009A71A43ADA71F7BDDA79587B11001D7B84 +:1015B000000240310543C9B22EB2012929D82F4A71 +:1015C000177801220092587A1C7A0002044323B251 +:1015D00028000193764200F079FA781E0640F6B2B0 +:1015E000A64201DD6B461E790A25002E09D029008E +:1015F0003000FFF795FD0500A41BA4B20098FFF78B +:10160000B5FF002C2FD0BEB2BC422ED3290038002B +:10161000EFE71B490F78B32A05D8B12A0ED8A220CC +:10162000FFF73EFEBFE7C12A03D8BF2AF7D903223E +:10163000C8E73C32D2B2012AF1D8F8E71C7C114845 +:1016400000F044FA200000F052FA002000F04FFAB7 +:10165000F0B200F04CFA280A00F049FA8020072185 +:10166000400100F002FA8020DAE72900E0B2FFF73B +:1016700057FD00240500C1E7A00100209C010020C7 +:101680009D0100200610000010B50121002000F08F +:10169000F1FBFFF71FFD00F0ABFA054B05481A8878 +:1016A000054B196801F0FEFFFFF704FE10BDC046B0 +:1016B00086000020BC03002080000020AF4BF7B55F +:1016C0001B78002B00D0FFE0AD4E300001F0E0FEB3 +:1016D000AC4C051E1BD0EFF3108372B6AA4F20004E +:1016E0003B6000F0FDFDA84203DA200000F0F8FDA9 +:1016F00005003B6883F31088A44F2A0039003000AE +:1017000000F0DDFD2A003900200000F001FE20007D +:1017100000F0F2FD051E1BD0EFF3108372B69A4F56 +:1017200030003B6001F0C5FEA84203DA300001F052 +:10173000C0FE05003B6883F31088944F2A003900EF +:10174000200000F04EFE2A003900300000F08AFC34 +:10175000200000F06BFE8E4F3B7883420FD0F022CA +:101760008C4D20002B8893432B8000F05FFE0122DC +:10177000894B38701A70904239D002283CD0200032 +:1017800000F05AFE854F3B78834215D00F22814DE1 +:1017900020002B8893432B8000F04EFE01227E4BCD +:1017A00038701A7090422AD0022828D0002803D11D +:1017B00003232A8813432B80200000F043FE784F38 +:1017C0003B78834223D0734D764A2B882000134008 +:1017D0002B8000F037FE01226F4B387005381A70ED +:1017E000032814D82A8802F049F80E5B5E601023A3 +:1017F0002A8813432B80C2E730232A88F9E72B88F5 +:1018000018432880D8E780235B0013432B8096235E +:10181000654DDB002A689A4215D1200000F018FEC1 +:10182000019000280FD100F085FA604F3B68C01A84 +:10183000C82808D90123514A137000F07BFA5C4B89 +:101840001860019B3B60200000F0EAFD2B68594FB7 +:1018500098422DD0200000F0FBFD3870200000F0F1 +:10186000F7FD00282FD0200000F0DAFD28603000BE +:1018700001F000FE96232968DB00994223D0002462 +:10188000444B30001A8801F00DFF434B59210820CA +:101890001C7000F0BDF82100082000F0B9F812E03B +:1018A00080239B00B1E7C023FBE78023DB00ACE78C +:1018B000394B1B78002BCDD1200000F0C9FD00234F +:1018C000FB569842C6D1F7BD2C4B1B78002BFAD0A3 +:1018D000364C2368002B1CD100F02CFA344B1B68CB +:1018E000C01A354B98421CD8FFF746FC0028EAD0B6 +:1018F000324B987915281CD801F0C0FF2F1F2926DC +:1019000067641D1D381D1D2C3C1D1D381D1D1D1D12 +:101910002C3200F00FFA2368C01AFA235B009842B9 +:10192000DAD90023154A137001221F4B52421A6064 +:10193000C9E734284CD0A02019E0FFF7BBFCFFF723 +:101940006BFCFFF7A3FCBEE7FFF7DEFCF7E7FFF752 +:101950001DFDF4E7FFF7AEFDF1E70422184B1A7006 +:10196000FFF744FD00F0E6F92060E8E78020FFF78C +:1019700097FCE4E7FFF724FDE1E7C046B103002050 +:10198000BC0300205C0400206C03002071030020D5 +:1019900088000020860000207003002068030020DB +:1019A00085000020FFF0FFFF80000020B40300202E +:1019B000B80300208400002060EA0000A00100209D +:1019C0009F010020FFF72EFDB9E7FFF7DDFDB6E729 +:1019D000FFF798FDB3E7C04610B55921082000F085 +:1019E00017F80021082000F013F80E240B2000F057 +:1019F0001EF82042FAD010BD10B50400552000F0AA +:101A000093F8A02000F090F8200000F08DF810BDB1 +:101A100070B5040055200D0000F086F82000403815 +:101A2000C0B200F081F8280000F07EF870BD10B55B +:101A30000400552000F078F820008038C0B200F093 +:101A400073F800F08FF810BD10B50400552000F0B9 +:101A50006BF8042000F068F8E0B200F065F8200AA6 +:101A600000F062F800F07EF810BD70B504000D00C3 +:101A7000552000F059F8442000F056F8E0B200F08C +:101A800053F8200A00F050F800F06CF8280000F03D +:101A90004BF800F067F870BD10B5552000F044F821 +:101AA000292000F041F800F05DF8040000F05AF839 +:101AB0000002204380B210BD10B5552000F034F86C +:101AC000242000F031F800F04DF810BD10B50400EE +:101AD000552000F029F8692000F026F8E0B200F067 +:101AE00023F8200A00F020F800F03CF810BD10B5F3 +:101AF0000400552000F018F8642000F015F82000CC +:101B000000F012F800F02EF810BD0000FF2248404F +:101B1000044BC0B24000C35A09125940C8B29343A3 +:101B200018437047703B000070B50D4D0100040074 +:101B3000280001F04BFD280001F0AFFC00F0FAF89E +:101B40000600280001F0A4FC002804D100F0F2F8FF +:101B5000801B1328F5D9280001F0B0FC200070BDCF +:101B60000004002010B5054C200001F091FC002875 +:101B7000F9D0200001F0A2FCC0B210BD000400208A +:101B8000962170B5174C0500174A2000490001F056 +:101B900089FD002D1BD0012D0DD10021200001F069 +:101BA00015FD200001F079FC0021200001F00EFD60 +:101BB000200001F072FC0F2000F0C2F8200001F0BC +:101BC00067FC051E05D0200001F078FCF6E729002F +:101BD000EBE7E1212000054A890201F063FD2800BE +:101BE00070BDC04600040020130400003104000052 +:101BF000E12110B5024A0348890201F053FD10BDEE +:101C0000310400000004002010B5024801F09EFCE1 +:101C100010BDC046BC03002010B5024801F096FC80 +:101C200010BDC04600040020F7B5002601240F4D6A +:101C30000F49280000F038FA0E4F0F49380000F025 +:101C400033FA0E490E4800F02FFA390023000196AE +:101C5000022200940B4801F04DFC29000196032359 +:101C600004220094084801F045FCF7BD440400201C +:101C70000008004248040020000C0042001000420E +:101C80004C040020BC03002000040020FEE70000FC +:101C9000034B10B51B68002B00D0984710BDC04601 +:101CA000500400200DBEFEE7134A1448110010B581 +:101CB000134B824202D0934212D11300824212D1BE +:101CC0000222104B5A62104B0832DA700F4B20324E +:101CD0009A7300F061F801F04DFDFEE710CB10C1E2 +:101CE0008142FBD3EAE70A4A8B42E9D00021094B43 +:101CF0009A42E5D202C2FBE70000002080010020EA +:101D0000803E0000FC70004100500041004800414E +:101D1000800100204408002010B500F02AF80028B7 +:101D200001D100F01BF810BD014B18607047C04690 +:101D300050040020014B18687047C046540400202E +:101D400070B5041E07D0044D2E6800F011F82B6802 +:101D50009B1BA342F9D370BD5404002010B5034A65 +:101D600013680133136000F08FF910BD5404002094 +:101D70007047002070470000024A53785BB2002B86 +:101D8000FBDB7047000C004010230249CA681A426E +:101D9000FCD0704700080040822210B5154B164C4D +:101DA0005A60A38C023A9343A384FFF7EDFF80228D +:101DB000124B92001B689B0E9B021343A362104BB5 +:101DC000E36292235B00A384FFF7DEFF0223A28C71 +:101DD0001343A384FFF7D8FF80230A4C5B00A36062 +:101DE000FFF7CAFF084B6360FFF7C6FF074B084ABF +:101DF0001A6010BD004000410008004024608000CF +:101E000080BB0A7C000C0040000703009C000020FF +:101E1000006CDC02C0201249124B134A10B54B6013 +:101E2000136A00061B021B0A0343136200240723E4 +:101E30008C600B608021136A09061B021B0A0B438E +:101E400013620A4B196A1A6A1143094A0A431A6251 +:101E500020001A21013400F00DF8072CF8D110BD34 +:101E600010E000E07FBB000000ED00E00004004057 +:101E7000FC05000010B500F053F810BDF7B50C22BA +:101E80004243244D0191535D042B2DD00027AA1805 +:101E90005278214EDB01D418A419204E24789E5983 +:101EA000E4B2BE4203D0013797407E1EB7411B4EBD +:101EB0009E193669B44600266146B14203D0013608 +:101EC0009640711E8E41002F17D10C37784301992F +:101ED0002D18686801290DD1012E06D1410706D4BD +:101EE000D3180D4A9B181C70F7BD0107F8D50421C3 +:101EF0000C43F5E704218C43F2E701209040019A5E +:101F0000012A03D1054A9B189861EDE7034A9B1803 +:101F10005861E9E7703D0000404400410044004141 +:101F20000C225043494B70B5C65C1B185C78DD78B9 +:101F3000042E00D187E0081F172842D801F09EFC2C +:101F40000C313131414141413333393D3D41414112 +:101F50004141413F418341830023002E33D0F001B2 +:101F60003B4E221892191678042232404E1F022E40 +:101F70003BD82D0701D540252A4372B6002901D050 +:101F80001A2935D10123A340324941184B608B6196 +:101F900004239A432E4923185B181A7062B6002056 +:101FA00070BD0123D9E706232B405A1E9341043309 +:101FB000D3E701232B400233CFE70623CDE70723E6 +:101FC000CBE70923C9E7022CC9D10629C7D0224A89 +:101FD00010780028C3D01670204A1078A0431070E3 +:101FE000D079C0090128FBD0B9E702263243C0E707 +:101FF0008D1E012D0CD80123A340164D45196B6091 +:10200000032903D16B6104231A43C3E7AB61FAE7E9 +:10201000012904D1A1400F4BC3189960B8E71049BA +:1020200065082D186D18E10707D50F2629781B01C3 +:1020300031400B432B700123E6E70F262978B1438B +:1020400019432970F7E701204042A9E7703D0000DD +:102050004044004100440041580400200028004250 +:1020600030440041F8B505000E0017000024BC42C2 +:1020700008D02B682800315D1B689847002801D0E4 +:102080000134F4E72000F8BD054A10B51368591C67 +:1020900005D0013B1360002B01D1024B984710BDC6 +:1020A000A000002001000020016070479446F0B5B8 +:1020B00005AC25789C1E621E944162460668920714 +:1020C000376824063A4322430724326000682140DF +:1020D000AD01002442682943022B00D05C030A436F +:1020E00022434260F0BD30B5C0250368AD031C68D3 +:1020F00012052A402243C0240904A40221400A43B5 +:102100001A6003685A6814435C6030BD012302689A +:1021100011680B43136003681A68D207FCD4DA69AC +:10212000D207F9D470470223026811680B43136089 +:102130000268D3699B07FCD4704703681A7ED207F4 +:1021400002D41A7E9207FCD57047002203685A8396 +:1021500070470368187E4007C00F70470368187EF9 +:10216000C0097047802302685B42117E0B431376DF +:1021700070470368187EC007C00F70470368188D4A +:10218000C0B2704703681A7ED207FCD589B201201D +:1021900019857047012203689A7570470122036808 +:1021A0001A7570470368194A30B5934227D0184A08 +:1021B000934227D0174A934220D10B2310210325A5 +:1021C00001229A402B40AB40C224FC359D4012486E +:1021D000A40002600259AA43C0259D402B0013436E +:1021E00080220351D2010D4B0A435A800C4A1168D8 +:1021F0000C4A11605A7852B2002AFBDB30BD092329 +:102200000E21DCE70A230F21D9E7C046000800426F +:10221000000C00420010004200E100E0000C004011 +:102220009C000020A4000020F8B504000F00160058 +:102230001D00FFF7B7FF2000FFF768FF1C21BB0060 +:102240000B4071072268090C0B431360842322683A +:102250009375012F1AD11021012E00D008390C4B93 +:1022600069431868C00001F013FB0722216802408F +:102270008B895203DB04DB0C13438B81226803043C +:102280009089DB0C400B400318439081F8BDC04699 +:10229000A400002010B50400FFF74CFDE0602368A7 +:1022A00020005B699847002808DAFFF743FDE368E0 +:1022B000C01AA3689842F2D30120404210BDF8B57D +:1022C00006000D0017000024BC4207D03000FFF7C5 +:1022D000E1FF002802DB28550134F5E72000F8BDB6 +:1022E0003F20704713B56B460268D97107335468B5 +:1022F00019000122A04716BD10B50221006900F0A7 +:10230000ADFC10BD10B50321006900F0BDFC10BD8F +:1023100010B5130004000A000069032100F0ACFDB1 +:10232000002801D10123636010BD000010B5054CE9 +:1023300003002068421C04D11A68180052699047B3 +:10234000206010BDF0000020074A0300106810B59F +:10235000411C03D001235B42136010BD02211869A8 +:1023600000F07CFDF9E7C046F000002010B50378CE +:102370003A22023303700249024800F029FE10BDE0 +:10238000B40000207804002010B5027800244378BF +:10239000A12A09D1212B05D10E490F489A3A00F004 +:1023A00017FE0134200010BD212AFBD1202B05D1BE +:1023B00008491A3A084800F0ABFCF3E7222B05D095 +:1023C000232BEFD14288054B1A60EBE78278014B53 +:1023D000DA71E7E7AC00002078040020A8000020B4 +:1023E0007047F7B5050017000191FFF7A3FC002423 +:1023F000E860BC4211D2019A022128693B1B1219E4 +:1024000000F0C0FC061E01D0A419F2E7FFF792FC11 +:10241000EB68C01AAB689842F6D32000FEBD0000FE +:10242000014B18687047C046AC000020014B18797A +:10243000C0B27047AC000020014B5879C0B2704761 +:10244000AC000020014B9879C0B27047AC0000206E +:10245000024BD879012318407047C046AC000020D9 +:10246000FA220021054B92009A60054A08321A6050 +:10247000044A59601A6119767047C0465C0400200E +:10248000C43D000078040020704770B50F26CB1DB6 +:1024900002003240D5B22C0000093034092A00DD98 +:1024A00007341C705A1E994200D170BD1300EFE72B +:1024B00010B5040001F082F9200010BD70B582292A +:1024C0001FD1C3B22A4D5A01AA189169294C800123 +:1024D0000C40C021890521439161274908334018E8 +:1024E0005061802228685B01C1180C795242224356 +:1024F0000A7170211A5C8A43110030220A431A546F +:1025000070BD0029FCD1C026C1B219484B01C318C7 +:102510009A68184DB6052A4032439A60083104681B +:1025200048010721154A5A60025D8A4311000122C1 +:102530000A43702102559A692A4032439A610E4A31 +:102540005A61025D8A43110010220A4302559A68BB +:102550000B4920181140802252030A439A609A685E +:10256000920B92039A604023427913434371C7E769 +:1025700030070020FFFFFF8FA40400206405002027 +:10258000FF3F00F070B50400012320CC00212A7821 +:102590002000134380222B70520001F002FAAB7826 +:1025A000DB07FCD46C6270BD1F22144B70B51B6836 +:1025B000590B9C0C9B0111405B0F22401F2900D13D +:1025C0001A391F2A00D1023A072B00D1043B1F25DC +:1025D00000688E01048D0A492A402140314301855B +:1025E000018D14000A00AA4322430285028D1903BB +:1025F000044B13400B43038570BDC046246080002C +:102600003FF8FFFFFF8FFFFFEFF31083036001230D +:10261000436072B670470368002B02D162B6BFF305 +:102620006F8F7047836973B50400002B18D10600C3 +:10263000683635786846FFF7E7FF019BEDB2013B4E +:1026400002D33578EDB2FAE768460193FFF7E3FF6E +:10265000002D01D1002076BD606E236EC01AFAE70E +:102660006846FFF7D1FF22000025019BB432013BF1 +:1026700002D31578EDB2FAE768460193FFF7CBFF76 +:10268000002DE7D02300AC34B03318682368E5E7A9 +:1026900010B543694468DBB25A01A2189168094831 +:1026A00008330840802149030143916091685B0130 +:1026B000890B890391602268D318402219790A4353 +:1026C0001A7110BDFF3F00F0F7B504006846FFF730 +:1026D0009BFF0026019B5A1E0192002B05D0200073 +:1026E000083001F0A6F80600F4E76846FFF793FF0C +:1026F000A5696846002D49D1FFF786FF2000019BA0 +:102700006830013B5A1C0BD00278591E002A05D1B3 +:1027100068460193FFF77FFF2800FEBD0B00F1E73D +:1027200068460193FFF777FF236EB5420ED0626EC5 +:102730009A420BD920005A1CE31822660133D97F34 +:102740000830C9B201F04DF80135EDE7626E9A42EA +:10275000E2D10023236601336846A361FFF754FFEB +:10276000270022000021019B6837013BB532581C2D +:10277000CED0397010785E1E002805D02000117070 +:102780000193FFF785FFEBE73300F0E7FFF73CFF2E +:102790002000019BB430013B5A1C06D00278591E20 +:1027A000D5B2002AB4D00B00F6E7684601930025A5 +:1027B000FFF731FF22002100AC321368B031B5427F +:1027C00002D0086898421DD809689942A4D1002314 +:1027D00068461360A361FFF717FF2700220000215E +:1027E000019BB437013BB532581C00D190E73970DA +:1027F00010785E1E002811D0200011700193FFF7A1 +:1028000047FFEAE72000591CE31811606C33197880 +:102810000830C9B200F0E5FF0135CBE73300E3E74C +:1028200010B50400FFF750FF2000083001F00FF84A +:1028300010BD10B50400FFF747FF2000083000F07E +:10284000F2FF10BDF0B585B0160001910500FFF74D +:102850003BFF02A8FFF7D8FE0024039B5A1E0392F9 +:10286000002B0FD0B442F8D22F000837380000F008 +:10287000DAFF0028F1D0380000F0C4FF019B1855A2 +:102880000134EFE702A8FFF7C6FE200005B0F0BD57 +:10289000F7B542694368D2B21100040008311868E4 +:1028A00049014118C979C90712D552019B189A6884 +:1028B0009204910C002A0CD12000FFF7E9FE636816 +:1028C0001A686369DBB208335B01D3187F22DA71BF +:1028D000F7BDE269002A21D1220001256C32616630 +:1028E0006846E5615A60FFF78FFE26002000210050 +:1028F000019B6836013BB430B5315A1C33D035707A +:1029000002785F1ED2B20A700A78002A04D1200031 +:102910000193FFF7BDFEE8E73B00EEE72200B0328F +:1029200011600022E2612200203268465A60FFF7FF +:102930006BFE0125260020002100019BB436013BDF +:102940006830B5315A1C0ED0357002785F1ED2B295 +:102950000A700A78002A04D120000193FFF798FE3C +:10296000E8E73B00EEE768460193FFF754FEA6E771 +:1029700013B56A4600230C00D01DD371FFF7F6FC97 +:10298000236818186B462060D87916BD03290ED12C +:1029900080220E4B62311B68FF31585C5242024369 +:1029A0005A5468226339FF32FF399954704701291C +:1029B000FCD18022054B24311B68FF31585C524208 +:1029C00002435A5428222339FF32EDE73007002012 +:1029D00070B50024274B0121050020001C70FFF773 +:1029E00049FA01212000FFF749FA234B0121200079 +:1029F0001C70FFF73FFA01212000FFF73FFA202368 +:102A00001E4A0520D1690B43D3610F21FFF788FAD5 +:102A10000F210620FFF784FA194B1A4A5A805A7878 +:102A200052B2002AFBDB1848FFF77EF9174C200052 +:102A3000FFF7A8FD2000FFF7B7FD7F212368C12025 +:102A40001A7880000A401A70042219780A430C216F +:102A50001A701A898A430E491A810A581202120AF8 +:102A60000A5080220A6019787E3A0A431A700123BC +:102A70002B7070BD990400209804002000040040D1 +:102A8000000C0040064000004134000030070020E8 +:102A900000E100E00078002810D00121084B1B68FD +:102AA0001A898A431A810822198B0A431A8304223D +:102AB000198B0A431A830022024B1A607047C046E2 +:102AC00030070020280700200A000E498B699B0B65 +:102AD0009B038B610B680221FF331972987982394D +:102AE00001439971197A8907FCD57F20064B024072 +:102AF000997A8143114380229972997A52420A430A +:102B00009A727047300700200050004100200B7976 +:102B100010B583420AD10800FFF736FC002805D122 +:102B2000034A013093699B0B9B03936110BDC04620 +:102B300030070020F7B50D001100832A19D1EBB240 +:102B4000384C5A01A21891693748AD010840C0219C +:102B5000890501439161354920686D18702108335A +:102B600055615B011A5C8A43110040220A431A54E2 +:102B7000F7BD022A52D12E4BAA00D058002802D00D +:102B800003685B699847B82000F014FE0400294BE5 +:102B9000FF260360234B4360083000F013FE29003A +:102BA00022000023606868323140A3616561E361FF +:102BB000236663664901137053649364443213724D +:102BC000411853728B68184AAD001A40C0239B0508 +:102BD00013438B606269036832401100019207223F +:102BE00008314901CF5C9743BC460327624617432F +:102BF000CF542700019A203752018218576062692A +:102C00002000324052019B1801229B19997A0A43F5 +:102C10009A72FFF73DFD064BEC50A9E72800FFF73D +:102C20004DFCA5E730070020FFFFFF8F6405002063 +:102C30007C040020F43D000070B505000124064B23 +:102C4000A200D258002A05D021002800FFF772FF09 +:102C50000134F4E770BDC046F4000020084B8A0040 +:102C6000D05810B5002803D003689B68984710BD62 +:102C7000044BC9B24901591888688004800CF6E7F2 +:102C80007C0400203007002010B50C00FFF7E6FFA1 +:102C900000280CD0064BE4B2196880230834640184 +:102CA0000C1962795B42134363710223E37110BD17 +:102CB0003007002070B5CBB2124A13485C0189017D +:102CC0008918021951609168104D08330D40802118 +:102CD00089022943402591609168890B890391609D +:102CE00001685A018A1816793543157195796D0670 +:102CF000FCD55B01C918CB79DB07FCD500198068CE +:102D0000C0B270BD6405002030070020FF3F00F016 +:102D100070B5140040220B4B0D001B68FF3359792E +:102D20000A435A710021FFF7C5FFA04200D92000D5 +:102D300000230549A34203D0CA5CEA540133F9E7F2 +:102D400070BDC046300700206405002010B50C4857 +:102D5000C9B24901421893689B049B0C3F2B0BD9C5 +:102D60009468403B9B04A40B9B0CA40323439360F7 +:102D700041188868C0B210BD93689B0B9B03F6E7AF +:102D800030070020F0B51C002F4B85B01B680600F3 +:102D90000D000192002B54D02C4F3B78D8B2002B61 +:102DA00002D10100FFF76AF864233B70284BAA00A8 +:102DB000D058002808D0036822005B680199984722 +:102DC0000400200005B0F0BD29003000FFF746FFE9 +:102DD000844204D929003000FFF740FF0400290095 +:102DE0003000FFF7B3FF0121EBB21A4F03935B01F1 +:102DF0000293029A3B6801989B18FF335A7A0A4360 +:102E00005A72154BA9012200C91800F0C1FD002C0F +:102E1000D7D029003000FFF721FF0028D1D1402171 +:102E2000039B3A6808335B01D31818790143197181 +:102E30000121D971029BD318FF339A7A0A439A72FF +:102E4000BFE701246442BCE7280700209804002063 +:102E50007C040020300700206405002013B56B4679 +:102E6000DC1D22000123FFF78DFF012801D120780E +:102E700016BD01204042FBE7F0B51C003A4B85B07F +:102E80001B680E000192002B3FD08023DB019C4287 +:102E90003BD8364D2B78D8B2002B02D10100FEF77B +:102EA000EDFF642300272B70314BB201D31802933E +:102EB000002C2CD02F4B1B680393FF2333401D00A5 +:102EC00000930835039B6D015D19AB79DB0921D0B7 +:102ED000294B2A49186800F0DBFC294B172158437D +:102EE00000F0D6FC274BEA79920713D49A5D002AAA +:102EF00001D10138F7D201229A55009B5A011D4B8E +:102F00009B189A69920B92039A6101277F423800BD +:102F100005B0F0BD00221B4B25009A553F2C00D96F +:102F20003F252A000199029800F032FD009BA90478 +:102F30005A01104B890C9B18029A7F195A619A69A1 +:102F4000641B920B92030A439A61009B039A083315 +:102F50005B01D3180222DA715979823A0A435A7115 +:102F6000019B5B190193A3E7280700209904002027 +:102F7000A4040020300700209C00002040420F00E5 +:102F8000701101009B04002070B50C001D000D4B5A +:102F9000A601F618110030002A0000F0F9FCE4B296 +:102FA000094A640114196661A369084928000B40A5 +:102FB000A361A169AB04890B9B0C89031943A1612F +:102FC00070BDC046A404002030070020FF3F00F081 +:102FD000F7B5104B0F001B7814000190002B0CD19B +:102FE0000D4B16001D78002D09D00C4E0C4835886D +:102FF00028182D1900F0CCFC35802000FEBD002ED5 +:10300000FBD033007A1900210198FFF7BDFF2D187E +:10301000361AF4E7240600202507002026070020A2 +:1030200025060020F8B500200D00140000AF012A8D +:1030300027D9D31D6A46DB08DB00D31A9D4608005A +:1030400000F072FD6E460323022200210130400091 +:1030500030707370A2420DD2287800280AD0531C19 +:10306000DBB20135B0549C4203D00232F154D2B2EB +:10307000F0E7220031000448FFF7AAFF431E984101 +:10308000C0B2BD46F8BDC04678040020F0B50025AA +:10309000012785B0184B0E0069461F70040000958B +:1030A000FFF766FC154B01A90B806A3BFF3BCB7118 +:1030B0005A330B72009B320009334B800E4B8D71DB +:1030C0004F7108711D70092E0FD00D4E09223770F7 +:1030D0000C4F200000953D80FFF77AFF69462000E5 +:1030E000FFF746FC3A88084935702000FFF770FF6B +:1030F000012005B0F0BDC0462406002009020000F2 +:1031000025070020260700202506002070B5CB7873 +:1031100005000E0092B0022B09D1C9882648FFF79E +:10312000B5FF441EA041C4B2200012B070BD012BF7 +:103130000BD1CA882149112A11D8D2B2002A0ED047 +:103140002800FFF745FF0124EEE70024032BEBD115 +:103150008B78A34205D1CA881949032AEDD90A7888 +:10316000EEE7022B06D18A7916492800FFF75AFFAD +:103170000400D9E7012B02D18A791349F5E7032B23 +:10318000D2D1124B01A91868FFF77FF9104B03A9A0 +:103190001868FFF77AF90F4B05A91868FFF775F95A +:1031A0000D4B07A91868FFF770F96B460533DC77FC +:1031B000B27901A9D9E7C04678040020343E000066 +:1031C000243E0000103E0000283E00000CA08000BD +:1031D00040A0800044A0800048A0800073B5060095 +:1031E00048780D000B2810D800F048FB061B0F3163 +:1031F0000F474C7450536D70097801AA002906D10D +:10320000022311803000FFF7BFFE012076BD0023AE +:103210001380314B1B78012B00D113700223002146 +:10322000F0E78A780023012A09D16A4693802B4B64 +:103230001B78012B00D11371022301AAEFE7264A64 +:103240001370274A93699B0B9B039361DDE78C788E +:10325000012C07D1214B01AA1C70224B1B78137043 +:103260002300DCE7002C08D101201B4B1C4A1870FE +:1032700093699B0B9B039361C8E73000A978FFF724 +:1032800023FCC2E73000FFF741FFBFE70123164AE6 +:10329000C5E70B780020DB06B8D13000FFF7CCFC87 +:1032A0002A200221AA78104BFF301A600C4A1368BA +:1032B0001C5C21434A241954FF34195D2938FF3816 +:1032C00001431955D4E70123084AA8E78A78074B38 +:1032D0001A60B6E7002099E79A040020A2040020B3 +:1032E00030070020E83D0000280700202C070020C0 +:1032F0004B4BF7B51C780700002C00D08FE0494EEF +:1033000033689B8B1B070ED521002000FFF7D6F8F2 +:10331000326810231100FF31887A03438B72424BCD +:103320001C600823938333689A8B52071FD50422AD +:103330009A833E4A1378002B0AD01378013BDBB204 +:1033400013701378D8B2002B02D10121FEF796FD3D +:10335000374A1378002B0AD01378013BDBB2137085 +:103360001378D8B2002B02D10121FEF787FD336814 +:10337000FF331A7AD2061ED510221A7259793032CA +:103380000A435A7160232B4938000A781A423BD10C +:10339000FFF724FF3368FF33002838D08022997963 +:1033A00052420A439A711A7A520604D540221A727E +:1033B000597A0A435A72336807241D8C01239D43AE +:1033C000EDB20193E1B2002D29D0002C27D02B00C3 +:1033D0002341019A134215D02300326808335B0160 +:1033E000D318DA79D20702D4DB799B0707D5124BC1 +:1033F000A200D05800280ED003681B689847019B94 +:10340000A3409D43013CDDE7FFF780FBC2E720219D +:103410000A4A9171C7E73800FFF7B8FAEFE7F7BD3E +:1034200025070020300700202807002099040020ED +:1034300098040020640500207C040020FF50004117 +:1034400010B50248FFF754FF10BDC04678040020B5 +:10345000014B024A1A6070473007002000500041BB +:103460000120704710B50368014A1B6A984710BDD8 +:103470001304000010B504000069FEF747FE2000A9 +:10348000143000F0BBF92000203000F0B7F910BD77 +:1034900010B5143000F0C7F910BD10B504002000BD +:1034A000203000F0C0F90028F9D12069FEF745FE70 +:1034B00010BD10B5203000F0BCF910BD70B506008D +:1034C00004001436300000F09DF9230030331B78DF +:1034D0000500FF2B07D0300000F0ABF90A2802DD11 +:1034E000A36BE26B1A60280070BD10B5143000F0B9 +:1034F000AEF910BDF7B51D0008AB1B7804000093B2 +:1035000009AB1B781600019300234360FA239B004C +:1035100083600D4B0F0008330360143000F052F944 +:103520002000203000F04EF92300009A2C33276150 +:103530009A70019A1E70DA7022005D70FF2330329B +:10354000200013701374FEBD483E000070B50400E7 +:103550000069FEF7FEFD002815D025002069FEF762 +:103560000DFE14350100280000F03BF92300303334 +:103570001B78FF2B07D0280000F05BF9092802DC3C +:10358000636BE26B1A602069FEF7F3FD00280DD033 +:1035900025002035280000F046F9002812D0280028 +:1035A00000F030F9C1B22069FEF7ECFD2069FEF7AA +:1035B000D5FD002805D02069FEF7D4FD2069FEF76F +:1035C000C4FD70BD2069FEF7E9FDEFE7F8B5040022 +:1035D00000690D002600FEF7CCFD2036002834D10E +:1035E0003F27300000F03EF9002825D0EFF310838C +:1035F0000122134211D1EFF305831A003A403B42F6 +:10360000EFD0103A53B2002A10DA0F221340083BD1 +:10361000134A9B089B009B181B682069FEF7A9FDB5 +:103620000028DED02000FFF791FFDAE79B080D4A63 +:10363000C0339B009B58F0E73000290000F0D1F820 +:103640002069FEF7A7FD0120F8BD300000F0EBF87F +:103650000028C5D129002069FEF794FDF3E7C04694 +:103660001CED00E000E100E0F0231B011940802385 +:1036700006209B0099420AD00133FF330130994262 +:1036800005D0802300205B00994200D105307047AF +:103690000F2001400020012903D00239481E81413A +:1036A000481C70470300F0B5040085B003912C332B +:1036B0000E2118781500FEF733FC230026002D3369 +:1036C00018780E212F36FEF72BFC3378022B07D10A +:1036D000230040331878FF2802D00E21FEF720FC8B +:1036E000270030373878FF2814D00121FEF7C2FBBD +:1036F0000C213B781B4A59438B5C521851780122AC +:103700008A401948DB01181860631848E2631B18E7 +:10371000A3631A600122039B11002069FEF784FD58 +:1037200029002000FFF7A0FF290007002000FFF775 +:10373000AFFFF0221540303D6A4255410300390089 +:10374000206901220095FEF7B1FC23002E331A7880 +:1037500031782069FEF7C7FC2069FEF7E4FC05B06C +:10376000F0BDC046703D00001844004114440041C3 +:103770007047000010B5FEF74DFB00F0D1F8FFF7E1 +:10378000F7FF0120FEF7DCFA084C2000FFF720F9D4 +:103790002000FFF77FF9FDF777FFFDF78FFF044B60 +:1037A000002BFAD000E000BFF7E7C0467804002005 +:1037B0000000000010B500F0D7F810BD10B500F003 +:1037C000DDF810BD10B50400802000F0CDF8802297 +:1037D0000021206000F0E5F8002320006360A36072 +:1037E00010BD7F22436810B50133134082689A42AE +:1037F00003D042680468A154436010BD00234360B5 +:1038000083607047826843689A4209D07F21836849 +:103810000268D25C836801330B40836010007047FC +:1038200001204042FBE743688068181A00D58030C9 +:103830007047426883689A4204DB43688068C01A14 +:103840007F30704783684068181A0138F9E782684A +:1038500043689A4203D083680268D05C70470120B5 +:103860004042FBE703007F2240689B680130104024 +:10387000C01A43425841C0B27047000002B47146BA +:1038800049084900095C49008E4402BC7047C046A3 +:10389000002934D00123002210B488422CD3012403 +:1038A0002407A14204D2814202D209011B01F8E798 +:1038B000E400A14204D2814202D249005B00F8E751 +:1038C000884201D3401A1A434C08A04202D3001B7D +:1038D0005C0822438C08A04202D3001B9C082243B0 +:1038E000CC08A04202D3001BDC082243002803D0EE +:1038F0001B0901D00909E3E7101C10BC704701B592 +:10390000002000F00BF802BD0029F8D003B5FFF746 +:10391000C1FF0EBC4243891A1847C0467047C046D3 +:1039200070B500260C4D0D4C641BA410A64209D1A5 +:10393000002600F011F90A4D0A4C641BA410A6429F +:1039400005D170BDB300EB5898470136EEE7B300E0 +:10395000EB5898470136F2E7680100206801002023 +:10396000680100207801002010B5034B01001868A1 +:1039700000F06AF810BDC0460401002010B5034BEA +:103980000100186800F016F810BDC04604010020C0 +:10399000002310B59A4200D110BDCC5CC454013351 +:1039A000F8E703001218934200D1704719700133F1 +:1039B000F9E7000070B50500002910D00C1F23683E +:1039C000002B00DAE418280000F0B5F81D4A13684F +:1039D000002B05D163601460280000F0ADF870BDC5 +:1039E000A34209D9216860188342F3D118685B6843 +:1039F00041182160EEE713005A68002A01D0A24264 +:103A0000F9D919685818A0420BD12068091858181C +:103A100019608242E0D110685268411819605A60FA +:103A2000DAE7A04202D90C232B60D5E721686018A1 +:103A3000824203D1106852684118216062605C6064 +:103A4000CAE7C04634080020F8B50323CD1C9D43C7 +:103A5000083506000C2D1FD20C25A9421ED83000B7 +:103A600000F069F825490A681400002C1AD1244F87 +:103A70003B68002B04D12100300000F043F838608F +:103A80002900300000F03EF8431C2AD10C233000FE +:103A9000336000F051F803E0002DDEDA0C233360D0 +:103AA0000020F8BD23685B1B18D40B2B03D92360BF +:103AB000E418256003E06368A2420DD10B6030007A +:103AC00000F03AF8200007220B30231D9043C21A61 +:103AD000E7D01B1AA350E4E75360F0E722006468C4 +:103AE000C3E70323C41C9C43A042E2D0211A300048 +:103AF00000F008F8431CDCD1C8E7C04634080020B9 +:103B000038080020002370B5064C0500080023602B +:103B100000F014F8431C03D12368002B00D02B6065 +:103B200070BDC046400800200023C25C0133002A5B +:103B3000FBD1581E7047704770470000044A136855 +:103B4000002B03D01818106018007047014BF9E7DC +:103B50003C08002044080020F8B5C046F8BC08BC6A +:103B60009E467047F8B5C046F8BC08BC9E467047F4 +:103B70000000891112239B322446AD573665BF746D +:103B8000488CC19D5AAFD3BE6CCAE5DB7EE9F7F81D +:103B90008110080193331A22A5562C47B7753E644D +:103BA000C99C408DDBBF52AEEDDA64CBFFF976E8FD +:103BB00002218B30100299132667AF763444BD552D +:103BC0004AADC3BC588ED19F6EEBE7FA7CC8F5D9DD +:103BD00083310A2091121803A7772E66B5543C450D +:103BE000CBBD42ACD99E508FEFFB66EAFDD874C9BD +:103BF00004428D5316619F702004A9153227BB36ED +:103C00004CCEC5DF5EEDD7FC6888E1997AABF3BA9C +:103C100085520C4397711E60A1142805B3373A26CC +:103C2000CDDE44CFDFFD56ECE9986089FBBB72AA7C +:103C300006638F7214409D512225AB343006B917AC +:103C40004EEFC7FE5CCCD5DD6AA9E3B8788AF19B5C +:103C500087730E6295501C41A3352A24B11638078C +:103C6000CFFF46EEDDDC54CDEBB962A8F99A708B3C +:103C7000088481951AA793B62CC2A5D33EE1B7F06C +:103C80004008C919522BDB3A644EED5F766DFF7C1C +:103C9000899400859BB712A6ADD224C3BFF136E04C +:103CA000C1184809D33B5A2AE55E6C4FF77D7E6CFC +:103CB0000AA583B4188691972EE3A7F23CC0B5D12C +:103CC0004229CB38500AD91B666FEF7E744CFD5DDC +:103CD0008BB502A499961087AFF326E2BDD034C10C +:103CE000C3394A28D11A580BE77F6E6EF55C7C4DBC +:103CF0000CC685D71EE597F42880A1913AA3B3B2EC +:103D0000444ACD5B5669DF78600CE91D722FFB3E9B +:103D10008DD604C79FF516E4A9902081BBB332A2CB +:103D2000C55A4C4BD7795E68E11C680DF33F7A2E7B +:103D30000EE787F61CC495D52AA1A3B03882B193AB +:103D4000466BCF7A5448DD59622DEB3C700EF91F5B +:103D50008FF706E69DD414C5ABB122A0B99230838B +:103D6000C77B4E6AD5585C49E33D6A2CF11E780F3B +:103D7000000219087F00000080000280000E190870 +:103D80003F40000080061080000F19083F700000BF +:103D900019070180001619081F40000080160680D0 +:103DA000001719080F40000080161280001819082B +:103DB0000F80000080161280001919080F80000083 +:103DC000801612800000000000000000E5220000C4 +:103DD00011230000E122000005230000F922000069 +:103DE000492300002D230000000000000000000017 +:103DF0000000000091280000452800003328000042 +:103E00002128000089240000B1240000252600009C +:103E100041726475696E6F204E616E6F20457665E4 +:103E2000727900000403090441726475696E6F20A1 +:103E30004C4C430012011001020000404123580085 +:103E4000000101020301000000000000000000006A +:103E5000CD35000065200000B33400009B34000025 +:103E600091340000BD340000EB34000065340000E4 +:103E7000A536000075340000613400000000000029 +:103E800010B572B68122114B92000433934213D3C2 +:103E90000F4A01211000147D0C42FCD02021148B0C +:103EA000FF319B085B0021431183D361094B1380D1 +:103EB0000123027D1A42FCD0BFF34F8F064B074A05 +:103EC000DA60BFF34F8FC046FDE7C0460010000028 +:103ED0000040004102A5FFFF00ED00E00400FA05EC +:103EE0008601010701010107060100000000000032 +:103EF0004A544147494345206D6B49490000000041 +:103F000000C20100FF0813040165736172454D563C +:103F10004E20676F72504D564E00000040420F0019 +:103F2000FFFFFFFF40420F00FFFFFFFF00C2010045 +:103F3000000008000904000001020200000524003E +:103F400010010424020605240600010524010101D4 +:103F50000705810310001009040100020A00000097 +:103F60000705020240000007058302400000000030 +:103F7000FFFFFFFF000000008300000002000000C0 +:103F80008200000008010020000000000000000086 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE0000000000000000000B5100000291C0000C7 +:103FF00061240000513400008D100000000000001A +:0400000300001CA934 :00000001FF diff --git a/firmwares/MuxTO/MuxTO.ino b/firmwares/MuxTO/MuxTO.ino index 1c50186b..85603071 100644 --- a/firmwares/MuxTO/MuxTO.ino +++ b/firmwares/MuxTO/MuxTO.ino @@ -17,9 +17,11 @@ // Includes #include "sys.h" +#include "lock.h" #include "updi_io.h" #include "JICE_io.h" #include "JTAG2.h" +#include "UPDI_hi_lvl.h" volatile bool updi_mode = false; unsigned long baudrate = 115200; @@ -28,11 +30,15 @@ unsigned long updi_mode_end = 0; uint8_t stopbits = 1; uint8_t paritytype = 0; uint8_t numbits = 8; +int8_t dtr = -1; +int8_t rts = -1; uint16_t serial_mode = SERIAL_8N1; bool serialNeedReconfiguration = false; char support_buffer[64]; +struct lock q; + void setup() { /* Initialize MCU */ pinMode(LED_BUILTIN, OUTPUT); @@ -41,6 +47,8 @@ void setup() { JICE_io::init(); UPDI_io::init(); Serial1.begin(baudrate, serial_mode); + lock_init(&q); + JTAG2::sign_on(); } //#define DEBUG; @@ -62,17 +70,21 @@ void loop() { //blink_delay = 1000; if (int c = Serial1.available()) { + lock(&q); if (c > Serial.availableForWrite()) { c = Serial.availableForWrite(); } + unlock(&q); Serial1.readBytes(support_buffer, c); Serial.write(support_buffer, c); } if (int c = Serial.available()) { + lock(&q); if (c > Serial1.availableForWrite()) { c = Serial1.availableForWrite(); } + unlock(&q); Serial.readBytes(support_buffer, c); Serial1.write(support_buffer, c); } @@ -133,13 +145,18 @@ void loop() { updi_mode_end = 0; } - if (Serial.baud() != baudrate || serialNeedReconfiguration) { + if (Serial.baud() != baudrate || serialNeedReconfiguration || Serial.dtr() != dtr) { + dtr = Serial.dtr(); if (Serial.dtr() == 1) { baudrate = Serial.baud(); Serial1.end(); if (baudrate != 1200) { Serial1.begin(baudrate, serial_mode); serialNeedReconfiguration = false; + // Request reset + UPDI::stcs(UPDI::reg::ASI_Reset_Request, UPDI::RESET_ON); + // Release reset (System remains in reset state until released) + UPDI::stcs(UPDI::reg::ASI_Reset_Request, UPDI::RESET_OFF); } } } diff --git a/firmwares/MuxTO/lock.h b/firmwares/MuxTO/lock.h new file mode 100644 index 00000000..16c5cb36 --- /dev/null +++ b/firmwares/MuxTO/lock.h @@ -0,0 +1,38 @@ +#ifndef _ARCH_LOCK_H_ +#define _ARCH_LOCK_H_ + +struct lock { + uint32_t primask; +}; + +#define LOCK_INIT (struct lock) {} + +static inline void lock_init(struct lock *lock) +{ +} + +// source: +// http://embeddedfreak.wordpress.com/2009/08/14/cortex-m3-global-interruptexception-control/ +// +// confirm this is correct by printing primask before after + +// note arm architecture v7m rm... setting PRIMASK raises priority to 0 + +static inline void lock(struct lock *lock) +{ + uint32_t tmp; + asm volatile ( + "mrs %0, PRIMASK\n\t" + "cpsid i\n\t" + : "=r" (tmp) ); + lock->primask = tmp; +} + +static inline void unlock(struct lock *lock) +{ + asm volatile ( + "msr PRIMASK, %0\n\t" + : : "r" (lock->primask) ); +} + +#endif diff --git a/libraries/HID/keywords.txt b/libraries/HID/keywords.txt deleted file mode 100644 index 32a9ba5f..00000000 --- a/libraries/HID/keywords.txt +++ /dev/null @@ -1,21 +0,0 @@ -####################################### -# Syntax Coloring Map HID -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -HID KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### -begin KEYWORD2 -SendReport KEYWORD2 -AppendDescriptor KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### -HID_TX LITERAL1 \ No newline at end of file diff --git a/libraries/HID/library.properties b/libraries/HID/library.properties deleted file mode 100644 index 499286d4..00000000 --- a/libraries/HID/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=HID -version=1.0 -author=Arduino -maintainer=Arduino -sentence=Module for PluggableUSB infrastructure. Exposes an API for devices like Keyboards, Mice and Gamepads. -paragraph= -category=Communication -url=http://www.arduino.cc/en/Reference/HID -architectures=megaavr diff --git a/libraries/HID/src/HID.cpp b/libraries/HID/src/HID.cpp deleted file mode 100644 index 21ede269..00000000 --- a/libraries/HID/src/HID.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* - Copyright (c) 2015, Arduino LLC - Original code (pre-library): Copyright (c) 2011, Peter Barrett - - Permission to use, copy, modify, and/or distribute this software for - any purpose with or without fee is hereby granted, provided that the - above copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR - BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES - OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - SOFTWARE. - */ - -#include "HID.h" - -#if defined(USBCON) - -HID_& HID() -{ - static HID_ obj; - return obj; -} - -int HID_::getInterface(uint8_t* interfaceCount) -{ - *interfaceCount += 1; // uses 1 - HIDDescriptor hidInterface = { - D_INTERFACE(pluggedInterface, 1, USB_DEVICE_CLASS_HUMAN_INTERFACE, HID_SUBCLASS_NONE, HID_PROTOCOL_NONE), - D_HIDREPORT(descriptorSize), - D_ENDPOINT(USB_ENDPOINT_IN(pluggedEndpoint), USB_ENDPOINT_TYPE_INTERRUPT, USB_EP_SIZE, 0x01) - }; - return USB_SendControl(0, &hidInterface, sizeof(hidInterface)); -} - -int HID_::getDescriptor(USBSetup& setup) -{ - // Check if this is a HID Class Descriptor request - if (setup.bmRequestType != REQUEST_DEVICETOHOST_STANDARD_INTERFACE) { return 0; } - if (setup.wValueH != HID_REPORT_DESCRIPTOR_TYPE) { return 0; } - - // In a HID Class Descriptor wIndex cointains the interface number - if (setup.wIndex != pluggedInterface) { return 0; } - - int total = 0; - HIDSubDescriptor* node; - for (node = rootNode; node; node = node->next) { - int res = USB_SendControl(TRANSFER_PGM, node->data, node->length); - if (res == -1) - return -1; - total += res; - } - - // Reset the protocol on reenumeration. Normally the host should not assume the state of the protocol - // due to the USB specs, but Windows and Linux just assumes its in report mode. - protocol = HID_REPORT_PROTOCOL; - - return total; -} - -uint8_t HID_::getShortName(char *name) -{ - name[0] = 'H'; - name[1] = 'I'; - name[2] = 'D'; - name[3] = 'A' + (descriptorSize & 0x0F); - name[4] = 'A' + ((descriptorSize >> 4) & 0x0F); - return 5; -} - -void HID_::AppendDescriptor(HIDSubDescriptor *node) -{ - if (!rootNode) { - rootNode = node; - } else { - HIDSubDescriptor *current = rootNode; - while (current->next) { - current = current->next; - } - current->next = node; - } - descriptorSize += node->length; -} - -int HID_::SendReport(uint8_t id, const void* data, int len) -{ - auto ret = USB_Send(pluggedEndpoint, &id, 1); - if (ret < 0) return ret; - auto ret2 = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len); - if (ret2 < 0) return ret2; - return ret + ret2; -} - -bool HID_::setup(USBSetup& setup) -{ - if (pluggedInterface != setup.wIndex) { - return false; - } - - uint8_t request = setup.bRequest; - uint8_t requestType = setup.bmRequestType; - - if (requestType == REQUEST_DEVICETOHOST_CLASS_INTERFACE) - { - if (request == HID_GET_REPORT) { - // TODO: HID_GetReport(); - return true; - } - if (request == HID_GET_PROTOCOL) { - // TODO: Send8(protocol); - return true; - } - if (request == HID_GET_IDLE) { - // TODO: Send8(idle); - } - } - - if (requestType == REQUEST_HOSTTODEVICE_CLASS_INTERFACE) - { - if (request == HID_SET_PROTOCOL) { - // The USB Host tells us if we are in boot or report mode. - // This only works with a real boot compatible device. - protocol = setup.wValueL; - return true; - } - if (request == HID_SET_IDLE) { - idle = setup.wValueL; - return true; - } - if (request == HID_SET_REPORT) - { - //uint8_t reportID = setup.wValueL; - //uint16_t length = setup.wLength; - //uint8_t data[length]; - // Make sure to not read more data than USB_EP_SIZE. - // You can read multiple times through a loop. - // The first byte (may!) contain the reportID on a multreport. - //USB_RecvControl(data, length); - } - } - - return false; -} - -HID_::HID_(void) : PluggableUSBModule(1, 1, epType), - rootNode(NULL), descriptorSize(0), - protocol(HID_REPORT_PROTOCOL), idle(1) -{ - epType[0] = EP_TYPE_INTERRUPT_IN; - PluggableUSB().plug(this); -} - -int HID_::begin(void) -{ - return 0; -} - -#endif /* if defined(USBCON) */ diff --git a/libraries/HID/src/HID.h b/libraries/HID/src/HID.h deleted file mode 100644 index ad2b06b1..00000000 --- a/libraries/HID/src/HID.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - Copyright (c) 2015, Arduino LLC - Original code (pre-library): Copyright (c) 2011, Peter Barrett - - Permission to use, copy, modify, and/or distribute this software for - any purpose with or without fee is hereby granted, provided that the - above copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR - BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES - OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - SOFTWARE. - */ - -#ifndef HID_h -#define HID_h - -#include -#include -#include "api/PluggableUSB.h" - -#if defined(USBCON) - -#define _USING_HID - -// HID 'Driver' -// ------------ -#define HID_GET_REPORT 0x01 -#define HID_GET_IDLE 0x02 -#define HID_GET_PROTOCOL 0x03 -#define HID_SET_REPORT 0x09 -#define HID_SET_IDLE 0x0A -#define HID_SET_PROTOCOL 0x0B - -#define HID_HID_DESCRIPTOR_TYPE 0x21 -#define HID_REPORT_DESCRIPTOR_TYPE 0x22 -#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23 - -// HID subclass HID1.11 Page 8 4.2 Subclass -#define HID_SUBCLASS_NONE 0 -#define HID_SUBCLASS_BOOT_INTERFACE 1 - -// HID Keyboard/Mouse bios compatible protocols HID1.11 Page 9 4.3 Protocols -#define HID_PROTOCOL_NONE 0 -#define HID_PROTOCOL_KEYBOARD 1 -#define HID_PROTOCOL_MOUSE 2 - -// Normal or bios protocol (Keyboard/Mouse) HID1.11 Page 54 7.2.5 Get_Protocol Request -// "protocol" variable is used for this purpose. -#define HID_BOOT_PROTOCOL 0 -#define HID_REPORT_PROTOCOL 1 - -// HID Request Type HID1.11 Page 51 7.2.1 Get_Report Request -#define HID_REPORT_TYPE_INPUT 1 -#define HID_REPORT_TYPE_OUTPUT 2 -#define HID_REPORT_TYPE_FEATURE 3 - -typedef struct -{ - uint8_t len; // 9 - uint8_t dtype; // 0x21 - uint8_t addr; - uint8_t versionL; // 0x101 - uint8_t versionH; // 0x101 - uint8_t country; - uint8_t desctype; // 0x22 report - uint8_t descLenL; - uint8_t descLenH; -} HIDDescDescriptor; - -typedef struct -{ - InterfaceDescriptor hid; - HIDDescDescriptor desc; - EndpointDescriptor in; -} HIDDescriptor; - -class HIDSubDescriptor { -public: - HIDSubDescriptor *next = NULL; - HIDSubDescriptor(const void *d, const uint16_t l) : data(d), length(l) { } - - const void* data; - const uint16_t length; -}; - -class HID_ : public PluggableUSBModule -{ -public: - HID_(void); - int begin(void); - int SendReport(uint8_t id, const void* data, int len); - void AppendDescriptor(HIDSubDescriptor* node); - -protected: - // Implementation of the PluggableUSBModule - int getInterface(uint8_t* interfaceCount); - int getDescriptor(USBSetup& setup); - bool setup(USBSetup& setup); - uint8_t getShortName(char* name); - -private: - unsigned int epType[1]; - - HIDSubDescriptor* rootNode; - uint16_t descriptorSize; - - uint8_t protocol; - uint8_t idle; -}; - -// Replacement for global singleton. -// This function prevents static-initialization-order-fiasco -// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use -HID_& HID(); - -#define D_HIDREPORT(length) { 9, 0x21, 0x01, 0x01, 0, 1, 0x22, lowByte(length), highByte(length) } - -#else - -#error "No Native USB support available on this board" - -#endif // USBCON - -#endif // HID_h diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 48a8a74c..d2c94f1c 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -24,8 +24,6 @@ #define SPI_IMODE_EXTINT 1 #define SPI_IMODE_GLOBAL 2 -const SPISettings DEFAULT_SPI_SETTINGS = SPISettings(); - SPIClass::SPIClass(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux) { initialized = false; @@ -66,7 +64,7 @@ void SPIClass::init() initialized = true; } -void SPIClass::config(SPISettings settings) +void SPIClass::config(SPISettingsMegaAVR settings) { SPI0.CTRLA = settings.ctrla; SPI0.CTRLB = settings.ctrlb; @@ -173,7 +171,7 @@ void SPIClass::reattachMaskedInterrupts() { } } -void SPIClass::beginTransaction(SPISettings settings) +void SPIClass::beginTransaction(SPISettingsMegaAVR settings) { if (interruptMode != SPI_IMODE_NONE) { diff --git a/libraries/SPI/src/SPI.h b/libraries/SPI/src/SPI.h index 18262c9d..53e15839 100644 --- a/libraries/SPI/src/SPI.h +++ b/libraries/SPI/src/SPI.h @@ -21,6 +21,7 @@ #define _SPI_H_INCLUDED #include +#include #ifndef USE_MALLOC_FOR_IRQ_MAP #define USE_MALLOC_FOR_IRQ_MAP 0 @@ -31,7 +32,7 @@ // - endTransaction() // - usingInterrupt() // - SPISetting(clock, bitOrder, dataMode) -#define SPI_HAS_TRANSACTION 1 +// #define SPI_HAS_TRANSACTION 1 // SPI_HAS_NOTUSINGINTERRUPT means that SPI has notUsingInterrupt() method #define SPI_HAS_NOTUSINGINTERRUPT 1 @@ -52,9 +53,9 @@ #define EXTERNAL_NUM_INTERRUPTS NUM_TOTAL_PINS #endif -class SPISettings { +class SPISettingsMegaAVR : public arduino::SPISettings { public: - SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { + SPISettingsMegaAVR(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { if (__builtin_constant_p(clock)) { init_AlwaysInline(clock, bitOrder, dataMode); } else { @@ -63,7 +64,9 @@ class SPISettings { } // Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first. - SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + SPISettingsMegaAVR() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); } + + SPISettingsMegaAVR(SPISettings& x) { SPISettingsMegaAVR(x.getClockFreq(), x.getBitOrder(), x.getDataMode()); } private: void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { @@ -142,12 +145,12 @@ class SPISettings { /* member variables containing the desired SPI settings */ uint8_t ctrla; uint8_t ctrlb; - friend class SPIClass; + friend class SPIClassMegaAVR; }; -class SPIClass { +class SPIClassMegaAVR : public arduino::HardwareSPI { public: - SPIClass(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux); + SPIClassMegaAVR(uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI, uint8_t uc_pinSS, uint8_t uc_mux); byte transfer(uint8_t data); uint16_t transfer16(uint16_t data); @@ -156,7 +159,10 @@ class SPIClass { // Transaction Functions void usingInterrupt(int interruptNumber); void notUsingInterrupt(int interruptNumber); - void beginTransaction(SPISettings settings); + void beginTransaction(SPISettingsMegaAVR settings); + void beginTransaction(SPISettings settings) { + beginTransaction(SPISettingsMegaAVR(settings)); + } void endTransaction(void); void begin(); @@ -169,13 +175,16 @@ class SPIClass { private: void init(); - void config(SPISettings settings); + void config(SPISettingsMegaAVR settings); + void config(SPISettings settings) { + config(SPISettingsMegaAVR(settings)); + } // These undocumented functions should not be used. SPI.transfer() // polls the hardware flag which is automatically cleared as the // AVR responds to SPI's interrupt - inline static void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); } - inline static void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); } + inline void attachInterrupt() { SPI0.INTCTRL |= (SPI_IE_bm); } + inline void detachInterrupt() { SPI0.INTCTRL &= ~(SPI_IE_bm); } void detachMaskedInterrupts(); void reattachMaskedInterrupts(); @@ -199,6 +208,7 @@ class SPIClass { #endif }; +#define SPIClass SPIClassMegaAVR #if SPI_INTERFACES_COUNT > 0 extern SPIClass SPI; diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.h b/libraries/SoftwareSerial/src/SoftwareSerial.h index b1a37c4a..edcf7607 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.h +++ b/libraries/SoftwareSerial/src/SoftwareSerial.h @@ -103,7 +103,7 @@ class SoftwareSerial : public Stream virtual int read(); virtual int available(); virtual void flush(); - operator bool() { return true; } + explicit operator bool() { return true; } using Print::write; diff --git a/libraries/Wire/keywords.txt b/libraries/Wire/keywords.txt index 5e3d2b1c..04b8301a 100644 --- a/libraries/Wire/keywords.txt +++ b/libraries/Wire/keywords.txt @@ -6,6 +6,8 @@ # Datatypes (KEYWORD1) ####################################### +Wire KEYWORD2 + ####################################### # Methods and Functions (KEYWORD2) ####################################### @@ -18,12 +20,6 @@ requestFrom KEYWORD2 onReceive KEYWORD2 onRequest KEYWORD2 -####################################### -# Instances (KEYWORD2) -####################################### - -Wire KEYWORD2 - ####################################### # Constants (LITERAL1) ####################################### diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index febee50c..cdec85cf 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -95,7 +95,7 @@ void TwoWire::setClock(uint32_t clock) TWI_MasterSetBaud(clock); } -uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool sendStop) { +size_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool sendStop) { if(quantity > BUFFER_LENGTH){ quantity = BUFFER_LENGTH; } @@ -109,17 +109,17 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool sendStop) { return bytes_read; } -uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity) +size_t TwoWire::requestFrom(uint8_t address, size_t quantity) { return requestFrom(address, quantity, true); } -uint8_t TwoWire::requestFrom(int address, int quantity) +size_t TwoWire::requestFrom(int address, int quantity) { return requestFrom((uint8_t)address, (size_t)quantity, true); } -uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) +size_t TwoWire::requestFrom(int address, int quantity, int sendStop) { return requestFrom((uint8_t)address, (size_t)quantity, (bool)sendStop); } diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index 7a1375bd..3871e350 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -23,6 +23,7 @@ #define TwoWire_h #include +#include #define BUFFER_LENGTH 128 @@ -57,10 +58,10 @@ class TwoWire : public HardwareI2C void beginTransmission(int); uint8_t endTransmission(void); uint8_t endTransmission(bool); - uint8_t requestFrom(uint8_t, size_t); - uint8_t requestFrom(uint8_t, size_t, bool); - uint8_t requestFrom(int, int); - uint8_t requestFrom(int, int, int); + size_t requestFrom(uint8_t, size_t); + size_t requestFrom(uint8_t, size_t, bool); + size_t requestFrom(int, int); + size_t requestFrom(int, int, int); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *, size_t); virtual int available(void); diff --git a/libraries/Wire/src/utility/twi.c b/libraries/Wire/src/utility/twi.c index a313ac07..5e34609a 100644 --- a/libraries/Wire/src/utility/twi.c +++ b/libraries/Wire/src/utility/twi.c @@ -201,7 +201,7 @@ void TWI_MasterSetBaud(uint32_t frequency){ t_rise = 1000; } - uint32_t baud = ((F_CPU_CORRECTED/frequency) - (((F_CPU_CORRECTED*t_rise)/1000)/1000)/1000 - 10)/2; + uint32_t baud = (F_CPU_CORRECTED / frequency - F_CPU_CORRECTED / 1000 / 1000 * t_rise / 1000 - 10) / 2; TWI0.MBAUD = (uint8_t)baud; } @@ -270,8 +270,11 @@ uint8_t TWI_MasterRead(uint8_t slave_address, * \param bytesToWrite Number of bytes to write. * \param bytesToRead Number of bytes to read. * - * \retval true If transaction could be started. - * \retval false If transaction could not be started. + * \retval 0:success + * \retval 1:data too long to fit in transmit buffer + * \retval 2:received NACK on transmit of address + * \retval 3:received NACK on transmit of data + * \retval 4:other error */ uint8_t TWI_MasterWriteRead(uint8_t slave_address, uint8_t *write_data, @@ -335,8 +338,21 @@ uint8_t TWI_MasterWriteRead(uint8_t slave_address, // return bytes really read ret = master_bytesRead; } else { - // return 0 if success, >0 otherwise - ret = (master_result == TWIM_RESULT_OK ? 0 : 1); + // return 0 if success, >0 otherwise (follow classic AVR conventions) + switch (master_result) { + case TWIM_RESULT_OK: + ret = 0; + break; + case TWIM_RESULT_BUFFER_OVERFLOW: + ret = 1; + break; + case TWIM_RESULT_NACK_RECEIVED: + ret = 3; + break; + default: + ret = 4; + break; + } } return ret; diff --git a/platform.txt b/platform.txt index c386d1d6..50992217 100644 --- a/platform.txt +++ b/platform.txt @@ -3,10 +3,10 @@ # ------------------------------ # # For more info: -# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification +# https://arduino.github.io/arduino-cli/latest/platform-specification/ name=Arduino megaAVR Boards -version=1.8.3 +version=1.8.8 # AVR compile variables # --------------------- @@ -34,6 +34,7 @@ compiler.elf2hex.flags=-O ihex -R .eeprom compiler.elf2hex.bin.flags=-O binary -R .eeprom compiler.elf2hex.cmd=avr-objcopy compiler.ldflags= +compiler.libraries.ldflags= compiler.size.cmd=avr-size # This can be overridden in boards.txt @@ -66,7 +67,7 @@ archive_file_path={build.path}/{archive_file} recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" ## Combine gc-sections, archives, and objects -recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm +recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mmcu={build.mcu} {compiler.c.elf.extra_flags} {compiler.ldflags} -o "{build.path}/{build.project_name}.elf" {object_files} {compiler.libraries.ldflags} "{build.path}/{archive_file}" "-L{build.path}" -lm "-Wl,-Map,{build.path}/{build.project_name}.map" ## Create output files (.eep and .hex) recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.eep.flags} {compiler.objcopy.eep.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.eep" @@ -79,7 +80,7 @@ recipe.output.save_file={build.project_name}.{build.variant}.hex ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" -recipe.size.regex=^(?:\.text|\.data|\.bootloader)\s+([0-9]+).* +recipe.size.regex=^(?:\.text|\.data|\.rodata|\.bootloader)\s+([0-9]+).* recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).* recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).* @@ -90,15 +91,19 @@ recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} preproc.macros.flags=-w -x c++ -E -CC recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} "-I{build.core.path}/api/deprecated" {includes} "{source_file}" -o "{preprocessed_file_path}" +# Required discoveries and monitors +# --------------------------------- +pluggable_discovery.required.0=builtin:serial-discovery +pluggable_discovery.required.1=builtin:mdns-discovery +pluggable_monitor.required.serial=builtin:serial-monitor + # AVR Uploader/Programmers tools # ------------------------------ -tools.avrdude.path={runtime.tools.avrdude-6.3.0-arduino16.path} +tools.avrdude.path={runtime.tools.avrdude-6.3.0-arduino17.path} tools.avrdude.cmd.path={path}/bin/avrdude tools.avrdude.config.path={path}/etc/avrdude.conf -tools.avrdude.network_cmd={runtime.tools.arduinoOTA-1.3.0.path}/bin/arduinoOTA - tools.avrdude.upload.params.verbose=-v tools.avrdude.upload.params.quiet=-q -q # tools.avrdude.upload.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value @@ -123,8 +128,17 @@ tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verb tools.avrdude_remote.upload.pattern=/usr/bin/run-avrdude /tmp/sketch.hex {upload.verbose} -p{build.mcu} +# The following rule is deprecated by pluggable discovery. +# We keep it to avoid breaking compatibility with the Arduino Java IDE. +tools.avrdude.network_cmd={runtime.tools.arduinoOTA.path}/bin/arduinoOTA tools.avrdude.upload.network_pattern="{network_cmd}" -address {serial.port} -port 65280 -username arduino -password "{network.password}" -sketch "{build.path}/{build.project_name}.bin" -upload /sketch -d -v +# ArduinoOTA +tools.arduino_ota.cmd={runtime.tools.arduinoOTA-1.3.0.path}/bin/arduinoOTA +tools.arduino_ota.upload.field.password=Password +tools.arduino_ota.upload.field.password.secret=true +tools.arduino_ota.upload.pattern="{tools.arduino_ota.cmd}" -address {upload.port.address} -port 65280 -username arduino -password "{upload.field.password}" -sketch "{build.path}/{build.project_name}.bin" -upload /sketch -d -v + # USB Default Flags # Default blank usb manufacturer will be filled in at compile time # - from numeric vendor ID, set to Unknown otherwise diff --git a/post_install.sh b/post_install.sh new file mode 100644 index 00000000..9a944e8a --- /dev/null +++ b/post_install.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +megaAVR_rules () { + echo "" + echo "# Arduino Mega AVR boards bootloader mode udev rules" + echo "" +cat < /etc/udev/rules.d/60-arduino-megaAVR.rules + +# reload udev rules +echo "Reload rules..." +udevadm control --reload-rules +udevadm trigger + diff --git a/programmers.txt b/programmers.txt index d9e83344..70af3a0a 100644 --- a/programmers.txt +++ b/programmers.txt @@ -3,4 +3,5 @@ medbg.communication=usb medbg.protocol=xplainedmini_updi medbg.program.protocol=xplainedmini_updi medbg.program.tool=avrdude -medbg.program.extra_params=-Pusb \ No newline at end of file +medbg.program.tool.default=avrdude +medbg.program.extra_params=-Pusb diff --git a/scripts/create_dfu_udev_rule b/scripts/create_dfu_udev_rule deleted file mode 100755 index 89d2a8a3..00000000 --- a/scripts/create_dfu_udev_rule +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# - -if [ "$(id -u)" != "0" ]; then - echo "This script must be run as root" - exit -fi - -NAME=99-arduino-uno-wifi-rev2.rules - -echo >/etc/udev/rules.d/$NAME -echo \# Arduino UNO WiFi Rev2 mEDBG CMSIS-DAP >>/etc/udev/rules.d/$NAME -echo SUBSYSTEM==\"tty\", ENV{ID_REVISION}==\"03eb\", ENV{ID_MODEL_ID}==\"2145\", MODE=\"0666\", ENV{ID_MM_DEVICE_IGNORE}=\"1\", ENV{ID_MM_CANDIDATE}=\"0\" >>/etc/udev/rules.d/$NAME -echo SUBSYSTEM==\"usb\", ATTR{idVendor}==\"03eb\", ATTR{idProduct}==\"2145\", MODE=\"0666\", ENV{ID_MM_DEVICE_IGNORE}=\"1\" >>/etc/udev/rules.d/$NAME - -udevadm control --reload-rules -udevadm trigger diff --git a/variants/nona4809/pins_arduino.h b/variants/nona4809/pins_arduino.h index 0c78496f..589dc2ae 100644 --- a/variants/nona4809/pins_arduino.h +++ b/variants/nona4809/pins_arduino.h @@ -142,7 +142,7 @@ static const uint8_t A7 = PIN_A7; // -const uint8_t PROGMEM digital_pin_to_port[] = { +const uint8_t digital_pin_to_port[] = { PC, // 0 PC5/USART1_Rx PC, // 1 PC4/USART1_Tx PA, // 2 PA0 @@ -172,7 +172,7 @@ const uint8_t PROGMEM digital_pin_to_port[] = { }; /* Use this for accessing PINnCTRL register */ -const uint8_t PROGMEM digital_pin_to_bit_position[] = { +const uint8_t digital_pin_to_bit_position[] = { PIN5_bp, // 0 PC5/USART1_Rx PIN4_bp, // 1 PC4/USART1_Tx PIN0_bp, // 2 PA0 @@ -202,7 +202,7 @@ const uint8_t PROGMEM digital_pin_to_bit_position[] = { }; /* Use this for accessing PINnCTRL register */ -const uint8_t PROGMEM digital_pin_to_bit_mask[] = { +const uint8_t digital_pin_to_bit_mask[] = { PIN5_bm, // 0 PC5/USART1_Rx PIN4_bm, // 1 PC4/USART1_Tx PIN0_bm, // 2 PA0 @@ -231,7 +231,7 @@ const uint8_t PROGMEM digital_pin_to_bit_mask[] = { PIN4_bm, // 25 PB4/USART3_Tx }; -const uint8_t PROGMEM digital_pin_to_timer[] = { +const uint8_t digital_pin_to_timer[] = { NOT_ON_TIMER, // 0 PC5/USART1_Rx NOT_ON_TIMER, // 1 PC4/USART1_Tx NOT_ON_TIMER, // 2 PA0 @@ -260,7 +260,7 @@ const uint8_t PROGMEM digital_pin_to_timer[] = { NOT_ON_TIMER, // 25 PB4/USART3_Tx }; -const uint8_t PROGMEM analog_pin_to_channel[] = { +const uint8_t analog_pin_to_channel[] = { 3, 2, 1, @@ -273,8 +273,7 @@ const uint8_t PROGMEM analog_pin_to_channel[] = { #endif -extern const uint8_t analog_pin_to_channel[]; -#define digitalPinToAnalogInput(p) ((p < ANALOG_INPUT_OFFSET) ? pgm_read_byte(analog_pin_to_channel + p) : pgm_read_byte(analog_pin_to_channel + p - ANALOG_INPUT_OFFSET) ) +#define digitalPinToAnalogInput(p) ((p < ANALOG_INPUT_OFFSET) ? analog_pin_to_channel[p] : analog_pin_to_channel[p - ANALOG_INPUT_OFFSET] ) // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type diff --git a/variants/uno2018/pins_arduino.h b/variants/uno2018/pins_arduino.h index 71dd6edd..3b7e3aae 100644 --- a/variants/uno2018/pins_arduino.h +++ b/variants/uno2018/pins_arduino.h @@ -163,7 +163,7 @@ static const uint8_t A5 = PIN_A5; // -const uint8_t PROGMEM digital_pin_to_port[] = { +const uint8_t digital_pin_to_port[] = { PC, // 0 PC5/USART1_Rx PC, // 1 PC4/USART1_Tx PA, // 2 PA0 @@ -208,7 +208,7 @@ const uint8_t PROGMEM digital_pin_to_port[] = { }; /* Use this for accessing PINnCTRL register */ -const uint8_t PROGMEM digital_pin_to_bit_position[] = { +const uint8_t digital_pin_to_bit_position[] = { PIN5_bp, // 0 PC5/USART1_Rx PIN4_bp, // 1 PC4/USART1_Tx PIN0_bp, // 2 PA0 @@ -253,7 +253,7 @@ const uint8_t PROGMEM digital_pin_to_bit_position[] = { }; /* Use this for accessing PINnCTRL register */ -const uint8_t PROGMEM digital_pin_to_bit_mask[] = { +const uint8_t digital_pin_to_bit_mask[] = { PIN5_bm, // 0 PC5/USART1_Rx PIN4_bm, // 1 PC4/USART1_Tx PIN0_bm, // 2 PA0 @@ -297,7 +297,7 @@ const uint8_t PROGMEM digital_pin_to_bit_mask[] = { PIN6_bm // 40 PF6 RESET }; -const uint8_t PROGMEM digital_pin_to_timer[] = { +const uint8_t digital_pin_to_timer[] = { NOT_ON_TIMER, // 0 PC5/USART1_Rx NOT_ON_TIMER, // 1 PC4/USART1_Tx NOT_ON_TIMER, // 2 PA0