diff --git a/README.md b/README.md index 8c1cb34..6c81ce4 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,12 @@ cd antsdr-fw-patch sh patch.sh ant ``` + for linux 7.09 and vivado 2025.2, Infos: `patch/ant-2026/Readme.md` + + ```sh + sh patch.sh ant-2026 + ``` + 2. ant e200 ```sh diff --git a/patch.sh b/patch.sh index 7b5becd..88418ce 100644 --- a/patch.sh +++ b/patch.sh @@ -1,6 +1,7 @@ target=$1 cp ./patch/*v0.39-v1.patch ./plutosdr-fw/hdl +cp ./patch/${target}/*hdl.patch ./plutosdr-fw/hdl cp ./patch/${target}/*linux.patch ./plutosdr-fw/linux cp ./patch/${target}/*buildroot.patch ./plutosdr-fw/buildroot cp ./patch/${target}/*scripts.patch ./plutosdr-fw/ diff --git a/patch/ant-2026/0001-add-support-buildroot.patch b/patch/ant-2026/0001-add-support-buildroot.patch new file mode 100644 index 0000000..1ec63a8 --- /dev/null +++ b/patch/ant-2026/0001-add-support-buildroot.patch @@ -0,0 +1,9490 @@ +From 23f3b78d19411fa1b0643f8bfd09b2a1aeb57666 Mon Sep 17 00:00:00 2001 +From: mrzhuzhe <466648706@qq.com> +Date: Wed, 15 Jul 2026 14:32:45 +0800 +Subject: [PATCH] add-support-buildroot + +--- + board/ant/S10mdev | 24 + + board/ant/S15watchdog | 21 + + board/ant/S20urandom | 29 + + board/ant/S21misc | 36 + + board/ant/S23udc | 175 ++++ + board/ant/S40network | 149 ++++ + board/ant/S41network | 30 + + board/ant/S45msd | 75 ++ + board/ant/S98autostart | 21 + + board/ant/automounter.sh | 87 ++ + board/ant/busybox-1.25.0.config | 1135 ++++++++++++++++++++++++ + board/ant/device_config | 15 + + board/ant/device_format_jffs2 | 17 + + board/ant/device_passwd | 11 + + board/ant/device_persistent_keys | 21 + + board/ant/device_reboot | 32 + + board/ant/dropbrear_localoptions.h | 1 + + board/ant/fw_env.config | 2 + + board/ant/genimage-msd.cfg | 20 + + board/ant/ifupdown.sh | 12 + + board/ant/index.html | 372 ++++++++ + board/ant/input-event-daemon.conf | 12 + + board/ant/mdev.conf | 7 + + board/ant/motd | 9 + + board/ant/msd/.gitignore | 2 + + board/ant/msd/LICENSE | 339 +++++++ + board/ant/msd/img/ADI_Logo_AWP.png | Bin 0 -> 12437 bytes + board/ant/msd/img/GNURadio_logo.png | Bin 0 -> 11379 bytes + board/ant/msd/img/PlutoSDR.png | Bin 0 -> 105306 bytes + board/ant/msd/img/SDR-Sharp.png | Bin 0 -> 11417 bytes + board/ant/msd/img/download.png | Bin 0 -> 2801 bytes + board/ant/msd/img/ez.png | Bin 0 -> 1657 bytes + board/ant/msd/img/favicon.ico | Bin 0 -> 318 bytes + board/ant/msd/img/fb.png | Bin 0 -> 495 bytes + board/ant/msd/img/gp.png | Bin 0 -> 1257 bytes + board/ant/msd/img/ig.png | Bin 0 -> 700 bytes + board/ant/msd/img/li.png | Bin 0 -> 536 bytes + board/ant/msd/img/mathworks_logo.png | Bin 0 -> 10032 bytes + board/ant/msd/img/osc128.png | Bin 0 -> 2622 bytes + board/ant/msd/img/prof_blue.png | Bin 0 -> 20451 bytes + board/ant/msd/img/sdrangel.png | Bin 0 -> 6669 bytes + board/ant/msd/img/ss.png | Bin 0 -> 1794 bytes + board/ant/msd/img/style.css | 164 ++++ + board/ant/msd/img/sw.png | Bin 0 -> 785 bytes + board/ant/msd/img/tw.png | Bin 0 -> 849 bytes + board/ant/msd/img/version.js | 278 ++++++ + board/ant/msd/img/yk.png | Bin 0 -> 888 bytes + board/ant/msd/img/yt.png | Bin 0 -> 653 bytes + board/ant/post-build.sh | 93 ++ + board/ant/test_ensm_pinctrl.sh | 130 +++ + board/ant/udc_handle_suspend.sh | 34 + + board/ant/update.sh | 278 ++++++ + board/ant/update_frm.sh | 49 + + board/ant/update_from_github.sh | 58 ++ + board/ant/wpa_supplicant/action_wpa.sh | 50 ++ + board/ant/wpa_supplicant/functions.sh | 1006 +++++++++++++++++++++ + board/ant/wpa_supplicant/ifupdown.sh | 172 ++++ + configs/zynq_ant_defconfig | 64 ++ + package/m4/m4.hash | 2 +- + package/m4/m4.mk | 2 +- + 60 files changed, 5032 insertions(+), 2 deletions(-) + create mode 100644 board/ant/S10mdev + create mode 100644 board/ant/S15watchdog + create mode 100644 board/ant/S20urandom + create mode 100644 board/ant/S21misc + create mode 100644 board/ant/S23udc + create mode 100644 board/ant/S40network + create mode 100644 board/ant/S41network + create mode 100644 board/ant/S45msd + create mode 100644 board/ant/S98autostart + create mode 100644 board/ant/automounter.sh + create mode 100644 board/ant/busybox-1.25.0.config + create mode 100644 board/ant/device_config + create mode 100644 board/ant/device_format_jffs2 + create mode 100644 board/ant/device_passwd + create mode 100644 board/ant/device_persistent_keys + create mode 100644 board/ant/device_reboot + create mode 100644 board/ant/dropbrear_localoptions.h + create mode 100644 board/ant/fw_env.config + create mode 100644 board/ant/genimage-msd.cfg + create mode 100644 board/ant/ifupdown.sh + create mode 100644 board/ant/index.html + create mode 100644 board/ant/input-event-daemon.conf + create mode 100644 board/ant/mdev.conf + create mode 100644 board/ant/motd + create mode 100644 board/ant/msd/.gitignore + create mode 100644 board/ant/msd/LICENSE + create mode 100644 board/ant/msd/img/ADI_Logo_AWP.png + create mode 100644 board/ant/msd/img/GNURadio_logo.png + create mode 100644 board/ant/msd/img/PlutoSDR.png + create mode 100644 board/ant/msd/img/SDR-Sharp.png + create mode 100644 board/ant/msd/img/download.png + create mode 100644 board/ant/msd/img/ez.png + create mode 100644 board/ant/msd/img/favicon.ico + create mode 100644 board/ant/msd/img/fb.png + create mode 100644 board/ant/msd/img/gp.png + create mode 100644 board/ant/msd/img/ig.png + create mode 100644 board/ant/msd/img/li.png + create mode 100644 board/ant/msd/img/mathworks_logo.png + create mode 100644 board/ant/msd/img/osc128.png + create mode 100644 board/ant/msd/img/prof_blue.png + create mode 100644 board/ant/msd/img/sdrangel.png + create mode 100644 board/ant/msd/img/ss.png + create mode 100644 board/ant/msd/img/style.css + create mode 100644 board/ant/msd/img/sw.png + create mode 100644 board/ant/msd/img/tw.png + create mode 100644 board/ant/msd/img/version.js + create mode 100644 board/ant/msd/img/yk.png + create mode 100644 board/ant/msd/img/yt.png + create mode 100755 board/ant/post-build.sh + create mode 100755 board/ant/test_ensm_pinctrl.sh + create mode 100644 board/ant/udc_handle_suspend.sh + create mode 100644 board/ant/update.sh + create mode 100644 board/ant/update_frm.sh + create mode 100644 board/ant/update_from_github.sh + create mode 100644 board/ant/wpa_supplicant/action_wpa.sh + create mode 100644 board/ant/wpa_supplicant/functions.sh + create mode 100644 board/ant/wpa_supplicant/ifupdown.sh + create mode 100644 configs/zynq_ant_defconfig + +diff --git a/board/ant/S10mdev b/board/ant/S10mdev +new file mode 100644 +index 0000000000..aea3d7d9ea +--- /dev/null ++++ b/board/ant/S10mdev +@@ -0,0 +1,24 @@ ++#!/bin/sh ++# ++# Start mdev.... ++# ++ ++case "$1" in ++ start) ++ echo -n "Starting mdev: " ++ echo /sbin/mdev >/proc/sys/kernel/hotplug ++ /sbin/mdev -s ++ # coldplug modules ++ # find /sys/ -name modalias -print0 | xargs -0 sort -u -z | xargs -0 modprobe -abq ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ stop) ++ ;; ++ restart|reload) ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? +diff --git a/board/ant/S15watchdog b/board/ant/S15watchdog +new file mode 100644 +index 0000000000..fdb9860917 +--- /dev/null ++++ b/board/ant/S15watchdog +@@ -0,0 +1,21 @@ ++#!/bin/sh ++# ++# Start watchdog ++# ++ ++case "$1" in ++ start) ++ echo -n "Starting watchdog: " ++ watchdog -t 5 -T 10 /dev/watchdog ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ stop) ++ ;; ++ restart|reload) ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? +diff --git a/board/ant/S20urandom b/board/ant/S20urandom +new file mode 100644 +index 0000000000..94551f87ca +--- /dev/null ++++ b/board/ant/S20urandom +@@ -0,0 +1,29 @@ ++#! /bin/sh ++# ++# urandom This script saves the random seed between reboots. ++# It is called from the boot, halt and reboot scripts. ++# ++# Version: @(#)urandom 1.33 22-Jun-1998 miquels@cistron.nl ++# ++ ++[ -c /dev/urandom ] || exit 0 ++#. /etc/default/rcS ++ ++case "$1" in ++ start|"") ++ echo -n "Starting initializing random number generator: " ++ ++ # Load and then save 512 bytes, ++ # which is the size of the entropy pool ++ ++ dmesg | sha512sum > /dev/urandom ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ stop) ++ ++ ;; ++ *) ++ echo "Usage: urandom {start|stop}" >&2 ++ exit 1 ++ ;; ++esac +diff --git a/board/ant/S21misc b/board/ant/S21misc +new file mode 100644 +index 0000000000..28c5739ffe +--- /dev/null ++++ b/board/ant/S21misc +@@ -0,0 +1,36 @@ ++#! /bin/sh ++ ++xo_correction() { ++ ++ XO_ENV_VAL=`fw_printenv -n xo_correction 2> /dev/null` ++ if [ $? -eq 0 ]; then ++ ++ for dev in /sys/bus/iio/devices/*; do ++ [ `cat ${dev}/name` == "ad9361-phy" ] && DEV_NAME=`basename ${dev}` ++ done ++ ++ echo ${XO_ENV_VAL} > /sys/bus/iio/devices/${DEV_NAME}/xo_correction ++ fi ++} ++ ++ ++case "$1" in ++ start|"") ++ echo -n "Starting miscellaneous setup: " ++ # Restore saved password and Dropbear keys ++ [[ -d /mnt/jffs2/etc ]] && cd /mnt/jffs2/etc && md5sum -s -c password.md5 && cp passwd shadow group /etc ++ [[ -d /mnt/jffs2/etc/dropbear ]] && cd /mnt/jffs2/etc/dropbear && md5sum -s -c keys.md5 && cp dropbear* /etc/dropbear/ ++ [[ -d /mnt/jffs2/root/.ssh ]] && cd /mnt/jffs2/root/.ssh && md5sum -s -c keys.md5 && mkdir /root/.ssh && cp authorized_keys /root/.ssh ++ xo_correction ++ MAX_BS=`fw_printenv -n iio_max_block_size 2> /dev/null || echo 67108864` ++ echo ${MAX_BS} > /sys/module/industrialio_buffer_dma/parameters/max_block_size ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ stop) ++ ++ ;; ++ *) ++ echo "Usage: $0 {start|stop}" >&2 ++ exit 1 ++ ;; ++esac +diff --git a/board/ant/S23udc b/board/ant/S23udc +new file mode 100644 +index 0000000000..202347f001 +--- /dev/null ++++ b/board/ant/S23udc +@@ -0,0 +1,175 @@ ++#!/bin/sh ++ ++source /etc/device_config ++ ++CONFIGFS=/sys/kernel/config/usb_gadget ++GADGET=$CONFIGFS/composite_gadget ++IIOD_OPTS="-D -n $ENDPOINTS -F /dev/iio_ffs" ++UDC_HANDLE_SUSPEND=`fw_printenv -n udc_handle_suspend 2> /dev/null || echo 0` ++USB_ETH_MODE=`fw_printenv -n usb_ethernet_mode 2> /dev/null || echo rndis` ++ ++if [ "$USB_ETH_MODE" == "ncm" ] ++then ++ USB_NET_FUNCTION=ncm.usb0 ++elif [ "$USB_ETH_MODE" == "ecm" ] ++then ++ USB_NET_FUNCTION=ecm.usb0 ++else ++ USB_NET_FUNCTION=rndis.0 ++fi ++ ++create_iiod_context_attributes() { ++ model=$1 ++ serial=$2 ++ model_variant=$3 ++ ++ if [ "$USBPID" == "0xb673" ]; then ++ # ADALM-PLUTO ++ for dev in /sys/bus/iio/devices/*; do ++ [ `cat ${dev}/name` == "ad9361-phy" ] && DEV_NAME=`basename ${dev}` ++ done ++ ++ AD936X_TYPE=$(cat /sys/bus/iio/devices/${DEV_NAME}/of_node/compatible | sed 's/adi,//g') ++ AD936X_TYPE_CAP=$(echo $AD936X_TYPE | tr a-z A-Z) ++ MODEL=$(echo $model | sed "s/AD936[34]/$AD936X_TYPE_CAP/") ++ else ++ MODEL=$model ++ fi ++ ++ echo "[Context Attributes]" > /etc/libiio.ini ++ echo "hw_model=$MODEL" >> /etc/libiio.ini ++ ++ if [ "$model_variant" == "n25q256a" ] ++ then ++ echo "hw_model_variant=0" >> /etc/libiio.ini ++ else ++ echo "hw_model_variant=1" >> /etc/libiio.ini ++ fi ++ ++ echo -e "hw_serial=$serial\n" >> /etc/libiio.ini ++ echo "fw_version=`grep device-fw /opt/VERSIONS | cut -d ' ' -f 2`" >> /etc/libiio.ini ++ if [ "$USBPID" == "0xb673" ]; then ++ echo ad9361-phy,xo_correction=`cat /sys/bus/iio/devices/${DEV_NAME}/xo_correction` >> /etc/libiio.ini ++ echo ad9361-phy,model=$AD936X_TYPE >> /etc/libiio.ini ++ ++ elif [ "$USBPID" == "0xb672" ]; then ++ cat /opt/${CALIBFILENAME} | grep ^cal,* >> /etc/libiio.ini ++ cat /opt/${CALIBFILENAME_TEMP_LUT} | grep ^cal,* >> /etc/libiio.ini ++ fi ++} ++ ++case "$1" in ++ start) ++ echo -n "Starting UDC Gadgets: " ++ mount configfs -t configfs /sys/kernel/config 2> /dev/null ++ ++ mkdir -p $GADGET ++ ++ model=`cat /sys/firmware/devicetree/base/model | tr / -` ++ model_variant=`dmesg | grep m25p80 | grep Kbytes | cut -d ' ' -f 3` ++ ++ serial=`dmesg | grep SPI-NOR-UniqueID` ++ serial=${serial#*SPI-NOR-UniqueID } ++ ++ create_iiod_context_attributes "$model" "$serial" "$model_variant" ++ ++ echo $serial > /etc/serial ++ sha1=`echo $serial | sha1sum` ++ ++ echo 0x0456 > $GADGET/idVendor ++ echo $USBPID > $GADGET/idProduct ++ ++ mkdir -p $GADGET/strings/0x409 ++ echo "Analog Devices Inc." > $GADGET/strings/0x409/manufacturer ++ echo $PRODUCT > $GADGET/strings/0x409/product ++ echo $serial > $GADGET/strings/0x409/serialnumber ++ ++ mkdir -p $GADGET/functions/ffs.iio_ffs ++ mkdir -p $GADGET/functions/acm.usb0 ++ mkdir -p $GADGET/functions/$USB_NET_FUNCTION ++ mkdir -p $GADGET/functions/mass_storage.0 ++ ++# echo /opt/vfat.img > $GADGET/functions/mass_storage.0/lun.0/file ++ echo Y > $GADGET/functions/mass_storage.0/lun.0/removable ++ ++ host_addr=`echo -n 00:E0:22; echo $sha1 | dd bs=1 count=6 2>/dev/null | hexdump -v -e '/1 ":%01c""%c"'` ++ dev_addr=`echo -n 00:05:F7; echo $sha1 | dd bs=1 count=6 skip=6 2>/dev/null | hexdump -v -e '/1 ":%01c""%c"'` ++ ++ echo $host_addr > $GADGET/functions/$USB_NET_FUNCTION/host_addr ++ echo $dev_addr > $GADGET/functions/$USB_NET_FUNCTION/dev_addr ++ ++ mkdir -p $GADGET/configs/c.1 ++ mkdir -p $GADGET/configs/c.1/strings/0x409 ++ echo "RNDIS/MSD/ACM/IIOUSBD" > $GADGET/configs/c.1/strings/0x409/configuration ++ ++ # In case the M2k is powered via the Power USB, advertise low power on the DATA USB ++ if [ "$TARGET" == "m2k" ]; then ++ echo 905 > /sys/class/gpio/export ++ [ "`cat /sys/class/gpio/gpio905/value`" == "1" ] && echo 4 > $GADGET/configs/c.1/MaxPower || echo 500 > $GADGET/configs/c.1/MaxPower ++ else ++ echo 500 > $GADGET/configs/c.1/MaxPower ++ fi ++ ++ ln -s $GADGET/functions/$USB_NET_FUNCTION $GADGET/configs/c.1 ++ ln -s $GADGET/functions/mass_storage.0 $GADGET/configs/c.1 ++ ln -s $GADGET/functions/acm.usb0 $GADGET/configs/c.1 ++ ln -s $GADGET/functions/ffs.iio_ffs $GADGET/configs/c.1/ffs.iio_ffs ++ ++ mkdir -p /dev/iio_ffs ++ mount iio_ffs -t functionfs /dev/iio_ffs 2> /dev/null ++ ++ start-stop-daemon -S -b -q -m -p /var/run/iiod.pid -x /usr/sbin/iiod -- $IIOD_OPTS ++ sleep 0.2 ++ ++ echo ci_hdrc.0 > $GADGET/UDC ++ ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ++ if [ "$UDC_HANDLE_SUSPEND" == "1" ]; then ++ start-stop-daemon -S -b -q -m -p /var/run/udc_handle_suspend.pid -x /sbin/udc_handle_suspend.sh ++ fi ++ ++ ;; ++ stop) ++ echo "Stopping UDC Gadgets" ++ ++ if [ "$UDC_HANDLE_SUSPEND" == "1" ]; then ++ start-stop-daemon -K -q -p /var/run/udc_handle_suspend.pid 2>/dev/null ++ fi ++ ++ echo "" > $GADGET/UDC ++ start-stop-daemon -K -q -p /var/run/iiod.pid 2>/dev/null ++ ++ rm $GADGET/configs/c.1/$USB_NET_FUNCTION ++ rm $GADGET/configs/c.1/mass_storage.0 ++ rm $GADGET/configs/c.1/acm.usb0 ++ rm $GADGET/configs/c.1/ffs.iio_ffs ++ ++ rmdir $GADGET/strings/0x409 ++ rmdir $GADGET/configs/c.1/strings/0x409 ++ rmdir $GADGET/configs/c.1 ++ ++ rmdir $GADGET/functions/ffs.iio_ffs ++ #rmdir $GADGET/functions/acm.usb0 ++ rmdir $GADGET/functions/$USB_NET_FUNCTION ++ rmdir $GADGET/functions/mass_storage.0 ++ ++ rmdir $GADGET 2> /dev/null ++ ++ ;; ++ restart|reload) ++ "$0" stop ++ "$0" start ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? ++ ++ ++ ++ ++ ++ +diff --git a/board/ant/S40network b/board/ant/S40network +new file mode 100644 +index 0000000000..4082ab1982 +--- /dev/null ++++ b/board/ant/S40network +@@ -0,0 +1,149 @@ ++#!/bin/sh ++# ++# Start the network.... ++# ++ ++# Debian ifupdown needs the /run/network lock directory ++ ++source /etc/device_config ++ ++create_system_files () { ++ ++ UDHCPD_CONF=/etc/udhcpd.conf ++ CONF=/opt/config.txt ++ IFAC=/etc/network/interfaces ++ ++ HOSTNAME=`fw_printenv -n hostname 2> /dev/null || cat /etc/hostname` ++ echo $HOSTNAME > /etc/hostname ++ ++ IPADDR=`fw_printenv -n ipaddr 2> /dev/null || echo 192.168.2.1` ++ IPADDR_HOST=`fw_printenv -n ipaddr_host 2> /dev/null || echo 192.168.2.10` ++ NETMASK=`fw_printenv -n netmask 2> /dev/null || echo 255.255.255.0` ++ ++ ETH_IPADDR=`fw_printenv -n ipaddr_eth 2> /dev/null || echo 192.168.1.10` ++ ETH_NETMASK=`fw_printenv -n netmask_eth 2> /dev/null || echo 255.255.255.0` ++ ETH_GATEWAY=`fw_printenv -n eth_gateway 2> /dev/null || echo 192.168.1.1` ++ ++ WLAN_SSID=`fw_printenv -n ssid_wlan 2> /dev/null` ++ WLAN_PWD=`fw_printenv -n pwd_wlan 2> /dev/null` ++ WLAN_IPADDR=`fw_printenv -n ipaddr_wlan 2> /dev/null` ++ ++ XO_CORRECTION=`fw_printenv -n xo_correction 2> /dev/null` ++ UDC_HANDLE_SUSPEND=`fw_printenv -n udc_handle_suspend 2> /dev/null || echo 0` ++ USB_ETH_MODE=`fw_printenv -n usb_ethernet_mode 2> /dev/null || echo rndis` ++ ++ ### /etc/udhcpd.conf ### ++ echo "start $IPADDR_HOST" > $UDHCPD_CONF ++ echo "end $IPADDR_HOST" >> $UDHCPD_CONF ++ echo "interface usb0" >> $UDHCPD_CONF ++ echo "option subnet $NETMASK" >> $UDHCPD_CONF ++ ++ ### /etc/network/interfaces ### ++ echo -e "auto lo\n""iface lo inet loopback\n" > $IFAC ++ echo -e "auto usb0\n""iface usb0 inet static" >> $IFAC ++ echo -e "\taddress $IPADDR\n""\tnetmask $NETMASK\n" >> $IFAC ++ echo -e "auto usb1\n""iface usb1 inet dhcp\n" >> $IFAC ++ ++ echo -e "auto eth0" >> $IFAC ++ if [ -n "$ETH_IPADDR" ] ++ then ++ echo -e "iface eth0 inet static" >> $IFAC ++ echo -e "\taddress $ETH_IPADDR\n""\tnetmask $ETH_NETMASK\n" >> $IFAC ++ else ++ echo -e "iface eth0 inet dhcp\n" >> $IFAC ++ fi ++ ++ ### /etc/wpa.conf ### ++ if [ -n "$WLAN_SSID" ] ++ then ++ if [ -n "$WLAN_PWD" ] ++ then ++ wpa_passphrase "$WLAN_SSID" "$WLAN_PWD" > /etc/wpa.conf ++ else ++ echo "network={" > /etc/wpa.conf ++ echo " ssid=\"$WLAN_SSID\"" >> /etc/wpa.conf ++ echo " key_mgmt=NONE" >> /etc/wpa.conf ++ echo "}" >> /etc/wpa.conf ++ fi ++ ++ echo -e "auto wlan0" >> $IFAC ++ ++ if [ -n "$WLAN_IPADDR" ] ++ then ++ echo -e "iface wlan0 inet static" >> $IFAC ++ echo -e "\taddress $WLAN_IPADDR\n""\tnetmask 255.255.255.0" >> $IFAC ++ else ++ echo -e "iface wlan0 inet dhcp" >> $IFAC ++ fi ++ echo -e "\twpa-conf /etc/wpa.conf\n" >> $IFAC ++ fi ++ ++ ### /opt/config.txt ### ++ echo "# $(cat /sys/firmware/devicetree/base/model | tr / -)"$'\r' > $CONF ++ echo "# Device Configuration File"$'\r' >> $CONF ++ echo "# 1. Open with an Editor"$'\r' >> $CONF ++ echo "# 2. Edit this file"$'\r' >> $CONF ++ echo "# 3. Save this file on the device USB drive"$'\r' >> $CONF ++ echo "# 4. Eject the device USB Drive"$'\r' >> $CONF ++ echo "# Doc: https://wiki.analog.com/university/tools/pluto/users/customizing"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ echo "[USB_ETHERNET]"$'\r' >> $CONF ++ echo "hostname = $HOSTNAME"$'\r' >> $CONF ++ echo "ipaddr = $IPADDR"$'\r' >> $CONF ++ echo "ipaddr_host = $IPADDR_HOST"$'\r' >> $CONF ++ echo "netmask = $NETMASK"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ echo "[WLAN]"$'\r' >> $CONF ++ echo "ssid_wlan = $WLAN_SSID"$'\r' >> $CONF ++ echo "pwd_wlan = $WLAN_PWD"$'\r' >> $CONF ++ echo "ipaddr_wlan = $WLAN_IPADDR"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ echo "[NETWORK]"$'\r' >> $CONF ++ echo "ipaddr_eth = $ETH_IPADDR"$'\r' >> $CONF ++ echo "netmask_eth = $ETH_NETMASK"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ echo "[SYSTEM]"$'\r' >> $CONF ++ echo "xo_correction = $XO_CORRECTION"$'\r' >> $CONF ++ echo "udc_handle_suspend = $UDC_HANDLE_SUSPEND"$'\r' >> $CONF ++ echo "# USB Communication Device Class Compatibility Mode [rndis|ncm|ecm]"$'\r' >> $CONF ++ echo "usb_ethernet_mode = $USB_ETH_MODE"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ echo "[ACTIONS]"$'\r' >> $CONF ++ echo "diagnostic_report = 0"$'\r' >> $CONF ++ echo "dfu = 0"$'\r' >> $CONF ++ echo "reset = 0"$'\r' >> $CONF ++ echo "calibrate = 0"$'\r' >> $CONF ++ echo ""$'\r'>> $CONF ++ ++ ### /www/index.html ### ++ ++ sed -i -e "s/#IP#/$IPADDR/g" -e "s/#HOSTIP#/$IPADDR_HOST/g" -e "s/#NETMASK#/$NETMASK/g" -e "s/#HOSTNAME#/$HOSTNAME/g" -e "s/#SSID_WLAN#/$WLAN_SSID/g" -e "s/#IPADDR_WLAN#/$WLAN_IPADDR/g" -e "s/#IPADDR_ETH#/$ETH_IPADDR/g" -e "s/#NETMASK_ETH#/$ETH_NETMASK/g" /www/index.html ++ ++ } ++ ++mkdir -p /run/network ++ ++case "$1" in ++ start) ++ create_system_files ++ printf "Starting network: " ++ /bin/hostname -F /etc/hostname ++ /sbin/ifup -a 2>&1 | logger ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ stop) ++ printf "Stopping network: " ++ /sbin/ifdown -a ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ restart|reload) ++ "$0" stop ++ "$0" start ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? ++ +diff --git a/board/ant/S41network b/board/ant/S41network +new file mode 100644 +index 0000000000..78433a60d7 +--- /dev/null ++++ b/board/ant/S41network +@@ -0,0 +1,30 @@ ++#!/bin/sh ++# Server-side demuxing by default ++ ++source /etc/device_config ++ ++case "$1" in ++ start) ++ echo -n "Starting dhcpd Daemon & httpd Server: " ++ start-stop-daemon -S -q -p /var/run/udhcpd.pid -x /usr/sbin/udhcpd -- $UDHCPD_CONF ++ httpd -h /www ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ ++ stop) ++ echo -n "Stopping dhcpd Daemon & httpd Server: " ++ killall -7 httpd ++ start-stop-daemon -K -q -p /var/run/udhcpd.pid 2>/dev/null ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ ++ restart) ++ $0 stop ++ sleep 1 ++ $0 start ++ ;; ++ ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac +diff --git a/board/ant/S45msd b/board/ant/S45msd +new file mode 100644 +index 0000000000..8b73beeb52 +--- /dev/null ++++ b/board/ant/S45msd +@@ -0,0 +1,75 @@ ++#!/bin/sh ++# Server-side demuxing by default ++ ++source /etc/device_config ++ ++CONF=/opt/config.txt ++file=/sys/kernel/config/usb_gadget/composite_gadget/functions/mass_storage.0/lun.0/file ++img=/opt/vfat.img ++ ++patch_html_page() { ++ LINUX=`uname -a | tr / - | tr '\n' ';' ; echo -n $(nproc) "core(s)"` ++ MODEL=`cat /etc/libiio.ini | grep hw_model= | cut -d '=' -f 2` ++ SERIAL=`cat /sys/kernel/config/usb_gadget/composite_gadget/strings/0x409/serialnumber` ++ MACHOST=`cat /sys/kernel/config/usb_gadget/composite_gadget/functions/*/host_addr` ++ MAC=`cat /sys/kernel/config/usb_gadget/composite_gadget/functions/*/dev_addr` ++ IIO=`iio_info -V 2>/dev/null | tail -1` ++ BUILD=`grep device-fw /opt/VERSIONS | cut -d ' ' -f 2` ++ FPGA=`grep hdl /opt/VERSIONS | cut -d ' ' -f 2` ++ ROOTFS=`grep buildroot /opt/VERSIONS | cut -d ' ' -f 2` ++ UBOOT=`cat /proc/cmdline | tr "=" "\n" | grep "U-Boot"` ++ USB_ETH_MODE=`fw_printenv -n usb_ethernet_mode 2> /dev/null || echo rndis` ++ if [ "$USB_ETH_MODE" == "ncm" ]; then ++ NETWORKUSB="Communications Device Class – Network Control Model (CDC-NCM)" ++ elif [ "$USB_ETH_MODE" == "ecm" ]; then ++ NETWORKUSB="Communications Device Class – Ethernet Control Module (CDC-EMC)" ++ else ++ NETWORKUSB="Remote Network Driver Interface Specification (RNDIS)" ++ fi ++ ++ sed -i -e "s/#LINUX#/$LINUX/g" -e "s/#MODEL#/$MODEL/g" -e "s/#SERIAL#/$SERIAL/g" -e "s/#MACHOST#/$MACHOST/g" -e "s/#MAC#/$MAC/g" -e "s/#IIO#/$IIO/g" -e "s/#BUILD#/$BUILD/g" -e "s/#FPGA#/$FPGA/g" -e "s/#ROOTFS#/$ROOTFS/g" -e "s/#UBOOT#/$UBOOT/g" -e "s/#NETWORKUSB#/$NETWORKUSB/g" $1 ++ ++ sed -i -e "s/#BUILD#/$BUILD/g" $2 /etc/motd ++} ++ ++ ++case "$1" in ++ start) ++ echo -n "Starting MSD Daemon: " ++ patch_html_page /www/index.html /www/img/version.js ++ losetup /dev/loop7 $img -o 512 ++ mount /dev/loop7 /mnt/msd ++ ++ if [ "$TARGET" == "m2k" ]; then ++ cp /opt/${CALIBFILENAME} /mnt ++ md5sum /mnt/msd/${CALIBFILENAME} > /opt/${CALIBFILENAME}.md5 ++ fi ++ ++ cp $CONF /mnt/msd ++ md5sum /mnt/msd/config.txt > /opt/config.md5 ++ ++ cp -a /www/* /mnt/msd ++ mv /mnt/msd/index.html /mnt/msd/info.html ++ umount /mnt/msd ++ echo $img > $file ++ ++ start-stop-daemon -S -b -q -m -p /var/run/update.pid -x /bin/sh -- /sbin/update.sh ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ ++ stop) ++ echo -n "Stopping MSD Daemon: " ++ start-stop-daemon -K -q -p /var/run/update.pid 2>/dev/null ++ [ $? = 0 ] && echo "OK" || echo "FAIL" ++ ;; ++ ++ restart) ++ $0 stop ++ sleep 1 ++ $0 start ++ ;; ++ ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac +diff --git a/board/ant/S98autostart b/board/ant/S98autostart +new file mode 100644 +index 0000000000..9515ccc682 +--- /dev/null ++++ b/board/ant/S98autostart +@@ -0,0 +1,21 @@ ++#!/bin/sh ++# ++# Script to check for and run user-supplied /mnt/jffs2/autorun.sh ++# ++ ++case "$1" in ++ start) ++ if test -f /mnt/jffs2/autorun.sh; then ++ source /mnt/jffs2/autorun.sh ++ fi ++ ;; ++ stop) ++ ;; ++ restart|reload) ++ ;; ++ *) ++ echo "Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? +diff --git a/board/ant/automounter.sh b/board/ant/automounter.sh +new file mode 100644 +index 0000000000..0d093a53fc +--- /dev/null ++++ b/board/ant/automounter.sh +@@ -0,0 +1,87 @@ ++#!/bin/sh ++ ++destdir=/media ++ ++my_umount() ++{ ++ if grep -qs "^/dev/$1 " /proc/mounts ; then ++ umount "${destdir}/$1"; ++ echo heartbeat > /sys/class/leds/led0:green/trigger ++ fi ++ ++ [ -d "${destdir}/$1" ] && rmdir "${destdir}/$1" ++} ++ ++do_mount() ++{ ++ local errno ++ local err ++ ++ errno=0 ++ for I in $(seq 5) ++ do ++ err=$(mount -t auto -o sync "/dev/$1" "${destdir}/$1" 2>&1) ++ errno=$? ++ ++ # If we get a "Device or resource busy" error, retry again in a ++ # little bit, otherwise just return immediately. ++ if ! echo "${err}" | grep -q "Device or resource busy" ++ then ++ return ${errno} ++ fi ++ ++ sleep .25 ++ done ++ ++ echo "${err}" >&2 ++ return ${errno} ++} ++ ++my_mount() ++{ ++ mkdir -p "${destdir}/$1" || exit 1 ++ ++ if ! do_mount $1; then ++ # failed to mount, clean up mountpoint ++ rmdir "${destdir}/$1" ++ exit 1 ++ fi ++ ++ echo default-on > /sys/class/leds/led0:green/trigger ++ ++ for i in ${destdir}/$1/runme??* ;do ++ ++ # Ignore dangling symlinks (if any). ++ [ ! -f "$i" ] && continue ++ ++ case "$i" in ++ *.sh) ++ # Source shell script for speed. ++ ( ++ trap - INT QUIT TSTP ++ set start ++ . $i ++ ) ++ ;; ++ *) ++ # No sh extension, so fork subprocess. ++ $i start ++ ;; ++ esac ++ done ++} ++ ++case "${ACTION}" in ++add|"") ++ my_umount ${MDEV} ++ my_mount ${MDEV} ++ ;; ++remove) ++ my_umount ${MDEV} ++ ;; ++remove_all) ++ for i in ${destdir}/??* ++ do ++ my_umount $(basename $i) ++ done ++esac +diff --git a/board/ant/busybox-1.25.0.config b/board/ant/busybox-1.25.0.config +new file mode 100644 +index 0000000000..88728cc9f2 +--- /dev/null ++++ b/board/ant/busybox-1.25.0.config +@@ -0,0 +1,1135 @@ ++# ++# Automatically generated make config: don't edit ++# Busybox version: 1.27.2 ++# Mon Apr 23 16:47:13 2018 ++# ++CONFIG_HAVE_DOT_CONFIG=y ++ ++# ++# Busybox Settings ++# ++CONFIG_DESKTOP=y ++# CONFIG_EXTRA_COMPAT is not set ++# CONFIG_FEDORA_COMPAT is not set ++CONFIG_INCLUDE_SUSv2=y ++# CONFIG_USE_PORTABLE_CODE is not set ++CONFIG_SHOW_USAGE=y ++CONFIG_FEATURE_VERBOSE_USAGE=y ++# CONFIG_FEATURE_COMPRESS_USAGE is not set ++CONFIG_BUSYBOX=y ++CONFIG_FEATURE_INSTALLER=y ++# CONFIG_INSTALL_NO_USR is not set ++# CONFIG_PAM is not set ++CONFIG_LONG_OPTS=y ++CONFIG_FEATURE_DEVPTS=y ++CONFIG_FEATURE_CLEAN_UP=y ++CONFIG_FEATURE_UTMP=y ++CONFIG_FEATURE_WTMP=y ++CONFIG_FEATURE_PIDFILE=y ++CONFIG_PID_FILE_PATH="/var/run" ++CONFIG_FEATURE_SUID=y ++# CONFIG_FEATURE_SUID_CONFIG is not set ++# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set ++# CONFIG_SELINUX is not set ++# CONFIG_FEATURE_PREFER_APPLETS is not set ++CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" ++CONFIG_FEATURE_SYSLOG=y ++# CONFIG_FEATURE_HAVE_RPC is not set ++CONFIG_PLATFORM_LINUX=y ++ ++# ++# Build Options ++# ++# CONFIG_STATIC is not set ++# CONFIG_PIE is not set ++# CONFIG_NOMMU is not set ++# CONFIG_BUILD_LIBBUSYBOX is not set ++# CONFIG_FEATURE_INDIVIDUAL is not set ++# CONFIG_FEATURE_SHARED_BUSYBOX is not set ++CONFIG_LFS=y ++CONFIG_CROSS_COMPILER_PREFIX="" ++CONFIG_SYSROOT="" ++CONFIG_EXTRA_CFLAGS="" ++CONFIG_EXTRA_LDFLAGS="" ++CONFIG_EXTRA_LDLIBS="" ++ ++# ++# Installation Options ("make install" behavior) ++# ++CONFIG_INSTALL_APPLET_SYMLINKS=y ++# CONFIG_INSTALL_APPLET_HARDLINKS is not set ++# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set ++# CONFIG_INSTALL_APPLET_DONT is not set ++# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set ++# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set ++# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set ++CONFIG_PREFIX="./_install" ++ ++# ++# Debugging Options ++# ++# CONFIG_DEBUG is not set ++# CONFIG_DEBUG_PESSIMIZE is not set ++# CONFIG_DEBUG_SANITIZE is not set ++# CONFIG_UNIT_TEST is not set ++# CONFIG_WERROR is not set ++CONFIG_NO_DEBUG_LIB=y ++# CONFIG_DMALLOC is not set ++# CONFIG_EFENCE is not set ++ ++# ++# Busybox Library Tuning ++# ++# CONFIG_FEATURE_USE_BSS_TAIL is not set ++CONFIG_FEATURE_RTMINMAX=y ++CONFIG_FEATURE_BUFFERS_USE_MALLOC=y ++# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set ++# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set ++CONFIG_PASSWORD_MINLEN=6 ++CONFIG_MD5_SMALL=1 ++CONFIG_SHA3_SMALL=1 ++# CONFIG_FEATURE_FAST_TOP is not set ++# CONFIG_FEATURE_ETC_NETWORKS is not set ++CONFIG_FEATURE_EDITING=y ++CONFIG_FEATURE_EDITING_MAX_LEN=1024 ++CONFIG_FEATURE_EDITING_VI=y ++CONFIG_FEATURE_EDITING_HISTORY=999 ++CONFIG_FEATURE_EDITING_SAVEHISTORY=y ++# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set ++CONFIG_FEATURE_REVERSE_SEARCH=y ++CONFIG_FEATURE_TAB_COMPLETION=y ++# CONFIG_FEATURE_USERNAME_COMPLETION is not set ++CONFIG_FEATURE_EDITING_FANCY_PROMPT=y ++# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set ++# CONFIG_LOCALE_SUPPORT is not set ++# CONFIG_UNICODE_SUPPORT is not set ++# CONFIG_UNICODE_USING_LOCALE is not set ++# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set ++CONFIG_SUBST_WCHAR=0 ++CONFIG_LAST_SUPPORTED_WCHAR=0 ++# CONFIG_UNICODE_COMBINING_WCHARS is not set ++# CONFIG_UNICODE_WIDE_WCHARS is not set ++# CONFIG_UNICODE_BIDI_SUPPORT is not set ++# CONFIG_UNICODE_NEUTRAL_TABLE is not set ++# CONFIG_UNICODE_PRESERVE_BROKEN is not set ++CONFIG_FEATURE_NON_POSIX_CP=y ++# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set ++CONFIG_FEATURE_USE_SENDFILE=y ++CONFIG_FEATURE_COPYBUF_KB=4 ++CONFIG_FEATURE_SKIP_ROOTFS=y ++CONFIG_MONOTONIC_SYSCALL=y ++CONFIG_IOCTL_HEX2STR_ERROR=y ++CONFIG_FEATURE_HWIB=y ++ ++# ++# Applets ++# ++ ++# ++# Archival Utilities ++# ++# CONFIG_FEATURE_SEAMLESS_XZ is not set ++# CONFIG_FEATURE_SEAMLESS_LZMA is not set ++# CONFIG_FEATURE_SEAMLESS_BZ2 is not set ++# CONFIG_FEATURE_SEAMLESS_GZ is not set ++# CONFIG_FEATURE_SEAMLESS_Z is not set ++CONFIG_AR=y ++# CONFIG_FEATURE_AR_LONG_FILENAMES is not set ++CONFIG_FEATURE_AR_CREATE=y ++# CONFIG_UNCOMPRESS is not set ++CONFIG_GUNZIP=y ++CONFIG_ZCAT=y ++CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y ++CONFIG_BUNZIP2=y ++CONFIG_BZCAT=y ++CONFIG_UNLZMA=y ++CONFIG_LZCAT=y ++CONFIG_LZMA=y ++# CONFIG_FEATURE_LZMA_FAST is not set ++CONFIG_UNXZ=y ++CONFIG_XZCAT=y ++CONFIG_XZ=y ++# CONFIG_BZIP2 is not set ++CONFIG_FEATURE_BZIP2_DECOMPRESS=y ++CONFIG_CPIO=y ++# CONFIG_FEATURE_CPIO_O is not set ++# CONFIG_FEATURE_CPIO_P is not set ++# CONFIG_DPKG is not set ++# CONFIG_DPKG_DEB is not set ++CONFIG_GZIP=y ++# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set ++CONFIG_GZIP_FAST=0 ++# CONFIG_FEATURE_GZIP_LEVELS is not set ++CONFIG_FEATURE_GZIP_DECOMPRESS=y ++# CONFIG_LZOP is not set ++# CONFIG_UNLZOP is not set ++# CONFIG_LZOPCAT is not set ++# CONFIG_LZOP_COMPR_HIGH is not set ++# CONFIG_RPM is not set ++# CONFIG_RPM2CPIO is not set ++CONFIG_TAR=y ++CONFIG_FEATURE_TAR_LONG_OPTIONS=y ++CONFIG_FEATURE_TAR_CREATE=y ++# CONFIG_FEATURE_TAR_AUTODETECT is not set ++CONFIG_FEATURE_TAR_FROM=y ++# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set ++# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set ++CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y ++CONFIG_FEATURE_TAR_TO_COMMAND=y ++# CONFIG_FEATURE_TAR_UNAME_GNAME is not set ++# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set ++# CONFIG_FEATURE_TAR_SELINUX is not set ++CONFIG_UNZIP=y ++CONFIG_FEATURE_UNZIP_CDF=y ++CONFIG_FEATURE_UNZIP_BZIP2=y ++CONFIG_FEATURE_UNZIP_LZMA=y ++CONFIG_FEATURE_UNZIP_XZ=y ++ ++# ++# Coreutils ++# ++CONFIG_BASENAME=y ++CONFIG_CAT=y ++CONFIG_FEATURE_CATV=y ++CONFIG_CHGRP=y ++CONFIG_CHMOD=y ++CONFIG_CHOWN=y ++# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set ++CONFIG_CHROOT=y ++CONFIG_CKSUM=y ++# CONFIG_COMM is not set ++CONFIG_CP=y ++# CONFIG_FEATURE_CP_LONG_OPTIONS is not set ++CONFIG_CUT=y ++CONFIG_DATE=y ++CONFIG_FEATURE_DATE_ISOFMT=y ++CONFIG_FEATURE_DATE_NANO=y ++CONFIG_FEATURE_DATE_COMPAT=y ++CONFIG_DD=y ++CONFIG_FEATURE_DD_SIGNAL_HANDLING=y ++# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set ++CONFIG_FEATURE_DD_IBS_OBS=y ++CONFIG_FEATURE_DD_STATUS=y ++CONFIG_DF=y ++# CONFIG_FEATURE_DF_FANCY is not set ++CONFIG_DIRNAME=y ++CONFIG_DOS2UNIX=y ++CONFIG_UNIX2DOS=y ++CONFIG_DU=y ++CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y ++CONFIG_ECHO=y ++CONFIG_FEATURE_FANCY_ECHO=y ++CONFIG_ENV=y ++# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set ++# CONFIG_EXPAND is not set ++# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set ++# CONFIG_UNEXPAND is not set ++# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set ++CONFIG_EXPR=y ++CONFIG_EXPR_MATH_SUPPORT_64=y ++CONFIG_FACTOR=y ++CONFIG_FALSE=y ++CONFIG_FOLD=y ++# CONFIG_FSYNC is not set ++CONFIG_HEAD=y ++CONFIG_FEATURE_FANCY_HEAD=y ++CONFIG_HOSTID=y ++CONFIG_ID=y ++# CONFIG_GROUPS is not set ++CONFIG_INSTALL=y ++CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y ++CONFIG_LINK=y ++CONFIG_LN=y ++CONFIG_LOGNAME=y ++CONFIG_LS=y ++CONFIG_FEATURE_LS_FILETYPES=y ++CONFIG_FEATURE_LS_FOLLOWLINKS=y ++CONFIG_FEATURE_LS_RECURSIVE=y ++CONFIG_FEATURE_LS_WIDTH=y ++CONFIG_FEATURE_LS_SORTFILES=y ++CONFIG_FEATURE_LS_TIMESTAMPS=y ++CONFIG_FEATURE_LS_USERNAME=y ++CONFIG_FEATURE_LS_COLOR=y ++CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y ++CONFIG_MD5SUM=y ++CONFIG_SHA1SUM=y ++CONFIG_SHA256SUM=y ++CONFIG_SHA512SUM=y ++CONFIG_SHA3SUM=y ++ ++# ++# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum ++# ++CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y ++CONFIG_MKDIR=y ++CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y ++CONFIG_MKFIFO=y ++CONFIG_MKNOD=y ++CONFIG_MKTEMP=y ++CONFIG_MV=y ++CONFIG_FEATURE_MV_LONG_OPTIONS=y ++CONFIG_NICE=y ++CONFIG_NL=y ++CONFIG_NOHUP=y ++CONFIG_NPROC=y ++CONFIG_OD=y ++CONFIG_PASTE=y ++CONFIG_PRINTENV=y ++CONFIG_PRINTF=y ++CONFIG_PWD=y ++CONFIG_READLINK=y ++CONFIG_FEATURE_READLINK_FOLLOW=y ++CONFIG_REALPATH=y ++CONFIG_RM=y ++CONFIG_RMDIR=y ++# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set ++CONFIG_SEQ=y ++CONFIG_SHRED=y ++# CONFIG_SHUF is not set ++CONFIG_SLEEP=y ++CONFIG_FEATURE_FANCY_SLEEP=y ++CONFIG_FEATURE_FLOAT_SLEEP=y ++CONFIG_SORT=y ++CONFIG_FEATURE_SORT_BIG=y ++# CONFIG_SPLIT is not set ++# CONFIG_FEATURE_SPLIT_FANCY is not set ++# CONFIG_STAT is not set ++# CONFIG_FEATURE_STAT_FORMAT is not set ++# CONFIG_FEATURE_STAT_FILESYSTEM is not set ++CONFIG_STTY=y ++# CONFIG_SUM is not set ++CONFIG_SYNC=y ++# CONFIG_FEATURE_SYNC_FANCY is not set ++# CONFIG_TAC is not set ++CONFIG_TAIL=y ++CONFIG_FEATURE_FANCY_TAIL=y ++CONFIG_TEE=y ++CONFIG_FEATURE_TEE_USE_BLOCK_IO=y ++CONFIG_TEST=y ++CONFIG_TEST1=y ++CONFIG_TEST2=y ++CONFIG_FEATURE_TEST_64=y ++# CONFIG_TIMEOUT is not set ++CONFIG_TOUCH=y ++# CONFIG_FEATURE_TOUCH_NODEREF is not set ++CONFIG_FEATURE_TOUCH_SUSV3=y ++CONFIG_TR=y ++CONFIG_FEATURE_TR_CLASSES=y ++CONFIG_FEATURE_TR_EQUIV=y ++CONFIG_TRUE=y ++CONFIG_TRUNCATE=y ++CONFIG_TTY=y ++CONFIG_UNAME=y ++CONFIG_UNAME_OSNAME="GNU/Linux" ++CONFIG_UNIQ=y ++CONFIG_UNLINK=y ++CONFIG_USLEEP=y ++CONFIG_UUDECODE=y ++# CONFIG_BASE64 is not set ++CONFIG_UUENCODE=y ++CONFIG_WC=y ++# CONFIG_FEATURE_WC_LARGE is not set ++CONFIG_WHO=y ++CONFIG_W=y ++# CONFIG_USERS is not set ++CONFIG_WHOAMI=y ++CONFIG_YES=y ++ ++# ++# Common options ++# ++CONFIG_FEATURE_VERBOSE=y ++ ++# ++# Common options for cp and mv ++# ++CONFIG_FEATURE_PRESERVE_HARDLINKS=y ++ ++# ++# Common options for df, du, ls ++# ++CONFIG_FEATURE_HUMAN_READABLE=y ++ ++# ++# Console Utilities ++# ++CONFIG_CHVT=y ++CONFIG_CLEAR=y ++CONFIG_DEALLOCVT=y ++CONFIG_DUMPKMAP=y ++# CONFIG_FGCONSOLE is not set ++# CONFIG_KBD_MODE is not set ++CONFIG_LOADFONT=y ++# CONFIG_SETFONT is not set ++# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set ++CONFIG_DEFAULT_SETFONT_DIR="" ++ ++# ++# Common options for loadfont and setfont ++# ++CONFIG_FEATURE_LOADFONT_PSF2=y ++CONFIG_FEATURE_LOADFONT_RAW=y ++CONFIG_LOADKMAP=y ++CONFIG_OPENVT=y ++CONFIG_RESET=y ++CONFIG_RESIZE=y ++CONFIG_FEATURE_RESIZE_PRINT=y ++CONFIG_SETCONSOLE=y ++# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set ++CONFIG_SETKEYCODES=y ++CONFIG_SETLOGCONS=y ++# CONFIG_SHOWKEY is not set ++ ++# ++# Debian Utilities ++# ++CONFIG_PIPE_PROGRESS=y ++CONFIG_RUN_PARTS=y ++CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y ++# CONFIG_FEATURE_RUN_PARTS_FANCY is not set ++CONFIG_START_STOP_DAEMON=y ++CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y ++CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y ++CONFIG_WHICH=y ++ ++# ++# Editors ++# ++CONFIG_AWK=y ++# CONFIG_FEATURE_AWK_LIBM is not set ++CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y ++CONFIG_CMP=y ++CONFIG_DIFF=y ++# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set ++CONFIG_FEATURE_DIFF_DIR=y ++# CONFIG_ED is not set ++CONFIG_PATCH=y ++CONFIG_SED=y ++CONFIG_VI=y ++CONFIG_FEATURE_VI_MAX_LEN=4096 ++CONFIG_FEATURE_VI_8BIT=y ++CONFIG_FEATURE_VI_COLON=y ++CONFIG_FEATURE_VI_YANKMARK=y ++CONFIG_FEATURE_VI_SEARCH=y ++# CONFIG_FEATURE_VI_REGEX_SEARCH is not set ++CONFIG_FEATURE_VI_USE_SIGNALS=y ++CONFIG_FEATURE_VI_DOT_CMD=y ++CONFIG_FEATURE_VI_READONLY=y ++CONFIG_FEATURE_VI_SETOPTS=y ++CONFIG_FEATURE_VI_SET=y ++CONFIG_FEATURE_VI_WIN_RESIZE=y ++CONFIG_FEATURE_VI_ASK_TERMINAL=y ++CONFIG_FEATURE_VI_UNDO=y ++CONFIG_FEATURE_VI_UNDO_QUEUE=y ++CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 ++CONFIG_FEATURE_ALLOW_EXEC=y ++ ++# ++# Finding Utilities ++# ++CONFIG_FIND=y ++CONFIG_FEATURE_FIND_PRINT0=y ++CONFIG_FEATURE_FIND_MTIME=y ++CONFIG_FEATURE_FIND_MMIN=y ++CONFIG_FEATURE_FIND_PERM=y ++CONFIG_FEATURE_FIND_TYPE=y ++CONFIG_FEATURE_FIND_XDEV=y ++CONFIG_FEATURE_FIND_MAXDEPTH=y ++CONFIG_FEATURE_FIND_NEWER=y ++# CONFIG_FEATURE_FIND_INUM is not set ++CONFIG_FEATURE_FIND_EXEC=y ++CONFIG_FEATURE_FIND_EXEC_PLUS=y ++CONFIG_FEATURE_FIND_USER=y ++CONFIG_FEATURE_FIND_GROUP=y ++CONFIG_FEATURE_FIND_NOT=y ++CONFIG_FEATURE_FIND_DEPTH=y ++CONFIG_FEATURE_FIND_PAREN=y ++CONFIG_FEATURE_FIND_SIZE=y ++CONFIG_FEATURE_FIND_PRUNE=y ++# CONFIG_FEATURE_FIND_DELETE is not set ++CONFIG_FEATURE_FIND_PATH=y ++CONFIG_FEATURE_FIND_REGEX=y ++# CONFIG_FEATURE_FIND_CONTEXT is not set ++# CONFIG_FEATURE_FIND_LINKS is not set ++CONFIG_GREP=y ++CONFIG_EGREP=y ++CONFIG_FGREP=y ++CONFIG_FEATURE_GREP_CONTEXT=y ++CONFIG_XARGS=y ++# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set ++CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y ++CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y ++CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y ++CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y ++ ++# ++# Init Utilities ++# ++# CONFIG_BOOTCHARTD is not set ++# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set ++# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set ++CONFIG_HALT=y ++CONFIG_POWEROFF=y ++CONFIG_REBOOT=y ++# CONFIG_FEATURE_CALL_TELINIT is not set ++CONFIG_TELINIT_PATH="" ++CONFIG_INIT=y ++CONFIG_LINUXRC=y ++CONFIG_FEATURE_USE_INITTAB=y ++CONFIG_FEATURE_KILL_REMOVED=y ++CONFIG_FEATURE_KILL_DELAY=0 ++CONFIG_FEATURE_INIT_SCTTY=y ++CONFIG_FEATURE_INIT_SYSLOG=y ++CONFIG_FEATURE_INIT_QUIET=y ++# CONFIG_FEATURE_INIT_COREDUMPS is not set ++CONFIG_INIT_TERMINAL_TYPE="linux" ++CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y ++ ++# ++# Login/Password Management Utilities ++# ++CONFIG_FEATURE_SHADOWPASSWDS=y ++# CONFIG_USE_BB_PWD_GRP is not set ++# CONFIG_USE_BB_SHADOW is not set ++CONFIG_USE_BB_CRYPT=y ++# CONFIG_USE_BB_CRYPT_SHA is not set ++# CONFIG_ADD_SHELL is not set ++# CONFIG_REMOVE_SHELL is not set ++CONFIG_ADDGROUP=y ++# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set ++# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set ++CONFIG_ADDUSER=y ++# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set ++# CONFIG_FEATURE_CHECK_NAMES is not set ++CONFIG_LAST_ID=60000 ++CONFIG_FIRST_SYSTEM_ID=100 ++CONFIG_LAST_SYSTEM_ID=999 ++# CONFIG_CHPASSWD is not set ++CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="md5" ++# CONFIG_CRYPTPW is not set ++CONFIG_MKPASSWD=y ++CONFIG_DELUSER=y ++CONFIG_DELGROUP=y ++# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set ++CONFIG_GETTY=y ++CONFIG_LOGIN=y ++# CONFIG_LOGIN_SESSION_AS_CHILD is not set ++# CONFIG_LOGIN_SCRIPTS is not set ++CONFIG_FEATURE_NOLOGIN=y ++CONFIG_FEATURE_SECURETTY=y ++CONFIG_PASSWD=y ++CONFIG_FEATURE_PASSWD_WEAK_CHECK=y ++CONFIG_SU=y ++CONFIG_FEATURE_SU_SYSLOG=y ++CONFIG_FEATURE_SU_CHECKS_SHELLS=y ++# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set ++CONFIG_SULOGIN=y ++CONFIG_VLOCK=y ++ ++# ++# Linux Ext2 FS Progs ++# ++CONFIG_CHATTR=y ++CONFIG_FSCK=y ++CONFIG_LSATTR=y ++# CONFIG_TUNE2FS is not set ++ ++# ++# Linux Module Utilities ++# ++# CONFIG_MODPROBE_SMALL is not set ++# CONFIG_DEPMOD is not set ++CONFIG_INSMOD=y ++CONFIG_LSMOD=y ++CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT=y ++# CONFIG_MODINFO is not set ++CONFIG_MODPROBE=y ++# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set ++CONFIG_RMMOD=y ++ ++# ++# Options common to multiple modutils ++# ++CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y ++# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set ++# CONFIG_FEATURE_2_4_MODULES is not set ++# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set ++# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set ++# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set ++# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set ++# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set ++CONFIG_FEATURE_CHECK_TAINTED_MODULE=y ++# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set ++CONFIG_FEATURE_MODUTILS_ALIAS=y ++CONFIG_FEATURE_MODUTILS_SYMBOLS=y ++CONFIG_DEFAULT_MODULES_DIR="/lib/modules" ++CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" ++ ++# ++# Linux System Utilities ++# ++# CONFIG_ACPID is not set ++# CONFIG_FEATURE_ACPID_COMPAT is not set ++# CONFIG_BLKDISCARD is not set ++CONFIG_BLKID=y ++# CONFIG_FEATURE_BLKID_TYPE is not set ++# CONFIG_BLOCKDEV is not set ++# CONFIG_CAL is not set ++CONFIG_CHRT=y ++CONFIG_DMESG=y ++CONFIG_FEATURE_DMESG_PRETTY=y ++CONFIG_EJECT=y ++# CONFIG_FEATURE_EJECT_SCSI is not set ++CONFIG_FALLOCATE=y ++# CONFIG_FATATTR is not set ++CONFIG_FBSET=y ++CONFIG_FEATURE_FBSET_FANCY=y ++CONFIG_FEATURE_FBSET_READMODE=y ++CONFIG_FDFORMAT=y ++CONFIG_FDISK=y ++# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set ++CONFIG_FEATURE_FDISK_WRITABLE=y ++# CONFIG_FEATURE_AIX_LABEL is not set ++# CONFIG_FEATURE_SGI_LABEL is not set ++# CONFIG_FEATURE_SUN_LABEL is not set ++# CONFIG_FEATURE_OSF_LABEL is not set ++CONFIG_FEATURE_GPT_LABEL=y ++CONFIG_FEATURE_FDISK_ADVANCED=y ++# CONFIG_FINDFS is not set ++CONFIG_FLOCK=y ++CONFIG_FDFLUSH=y ++CONFIG_FREERAMDISK=y ++# CONFIG_FSCK_MINIX is not set ++CONFIG_FSFREEZE=y ++CONFIG_FSTRIM=y ++CONFIG_GETOPT=y ++CONFIG_FEATURE_GETOPT_LONG=y ++CONFIG_HEXDUMP=y ++# CONFIG_FEATURE_HEXDUMP_REVERSE is not set ++# CONFIG_HD is not set ++CONFIG_XXD=y ++CONFIG_HWCLOCK=y ++CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y ++CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y ++# CONFIG_IONICE is not set ++CONFIG_IPCRM=y ++CONFIG_IPCS=y ++CONFIG_LAST=y ++# CONFIG_FEATURE_LAST_FANCY is not set ++CONFIG_LOSETUP=y ++CONFIG_LSPCI=y ++CONFIG_LSUSB=y ++CONFIG_MDEV=y ++CONFIG_FEATURE_MDEV_CONF=y ++CONFIG_FEATURE_MDEV_RENAME=y ++# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set ++CONFIG_FEATURE_MDEV_EXEC=y ++CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y ++CONFIG_MESG=y ++CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y ++CONFIG_MKE2FS=y ++# CONFIG_MKFS_EXT2 is not set ++# CONFIG_MKFS_MINIX is not set ++# CONFIG_FEATURE_MINIX2 is not set ++# CONFIG_MKFS_REISER is not set ++CONFIG_MKDOSFS=y ++CONFIG_MKFS_VFAT=y ++CONFIG_MKSWAP=y ++# CONFIG_FEATURE_MKSWAP_UUID is not set ++CONFIG_MORE=y ++CONFIG_MOUNT=y ++# CONFIG_FEATURE_MOUNT_FAKE is not set ++# CONFIG_FEATURE_MOUNT_VERBOSE is not set ++# CONFIG_FEATURE_MOUNT_HELPERS is not set ++# CONFIG_FEATURE_MOUNT_LABEL is not set ++# CONFIG_FEATURE_MOUNT_NFS is not set ++CONFIG_FEATURE_MOUNT_CIFS=y ++CONFIG_FEATURE_MOUNT_FLAGS=y ++CONFIG_FEATURE_MOUNT_FSTAB=y ++CONFIG_FEATURE_MOUNT_OTHERTAB=y ++CONFIG_MOUNTPOINT=y ++# CONFIG_NSENTER is not set ++# CONFIG_FEATURE_NSENTER_LONG_OPTS is not set ++CONFIG_PIVOT_ROOT=y ++CONFIG_RDATE=y ++# CONFIG_RDEV is not set ++CONFIG_READPROFILE=y ++CONFIG_RENICE=y ++# CONFIG_REV is not set ++# CONFIG_RTCWAKE is not set ++# CONFIG_SCRIPT is not set ++# CONFIG_SCRIPTREPLAY is not set ++CONFIG_SETARCH=y ++CONFIG_LINUX32=y ++CONFIG_LINUX64=y ++CONFIG_SETPRIV=y ++CONFIG_SETSID=y ++CONFIG_SWAPON=y ++# CONFIG_FEATURE_SWAPON_DISCARD is not set ++# CONFIG_FEATURE_SWAPON_PRI is not set ++CONFIG_SWAPOFF=y ++CONFIG_SWITCH_ROOT=y ++# CONFIG_TASKSET is not set ++# CONFIG_FEATURE_TASKSET_FANCY is not set ++CONFIG_UEVENT=y ++CONFIG_UMOUNT=y ++CONFIG_FEATURE_UMOUNT_ALL=y ++# CONFIG_UNSHARE is not set ++# CONFIG_WALL is not set ++ ++# ++# Common options for mount/umount ++# ++CONFIG_FEATURE_MOUNT_LOOP=y ++CONFIG_FEATURE_MOUNT_LOOP_CREATE=y ++# CONFIG_FEATURE_MTAB_SUPPORT is not set ++CONFIG_VOLUMEID=y ++ ++# ++# Filesystem/Volume identification ++# ++# CONFIG_FEATURE_VOLUMEID_BCACHE is not set ++# CONFIG_FEATURE_VOLUMEID_BTRFS is not set ++# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set ++CONFIG_FEATURE_VOLUMEID_EXFAT=y ++CONFIG_FEATURE_VOLUMEID_EXT=y ++CONFIG_FEATURE_VOLUMEID_F2FS=y ++CONFIG_FEATURE_VOLUMEID_FAT=y ++# CONFIG_FEATURE_VOLUMEID_HFS is not set ++# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set ++# CONFIG_FEATURE_VOLUMEID_JFS is not set ++# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set ++# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set ++# CONFIG_FEATURE_VOLUMEID_LUKS is not set ++# CONFIG_FEATURE_VOLUMEID_NILFS is not set ++# CONFIG_FEATURE_VOLUMEID_NTFS is not set ++# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set ++# CONFIG_FEATURE_VOLUMEID_REISERFS is not set ++# CONFIG_FEATURE_VOLUMEID_ROMFS is not set ++# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set ++# CONFIG_FEATURE_VOLUMEID_SYSV is not set ++CONFIG_FEATURE_VOLUMEID_UBIFS=y ++# CONFIG_FEATURE_VOLUMEID_UDF is not set ++# CONFIG_FEATURE_VOLUMEID_XFS is not set ++ ++# ++# Miscellaneous Utilities ++# ++# CONFIG_ADJTIMEX is not set ++# CONFIG_BBCONFIG is not set ++# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set ++# CONFIG_BEEP is not set ++CONFIG_FEATURE_BEEP_FREQ=0 ++CONFIG_FEATURE_BEEP_LENGTH_MS=0 ++# CONFIG_CHAT is not set ++# CONFIG_FEATURE_CHAT_NOFAIL is not set ++# CONFIG_FEATURE_CHAT_TTY_HIFI is not set ++# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set ++# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set ++# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set ++# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set ++# CONFIG_FEATURE_CHAT_CLR_ABORT is not set ++# CONFIG_CONSPY is not set ++CONFIG_CROND=y ++# CONFIG_FEATURE_CROND_D is not set ++# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set ++CONFIG_FEATURE_CROND_DIR="/var/spool/cron" ++CONFIG_CRONTAB=y ++CONFIG_DC=y ++# CONFIG_FEATURE_DC_LIBM is not set ++# CONFIG_DEVFSD is not set ++# CONFIG_DEVFSD_MODLOAD is not set ++# CONFIG_DEVFSD_FG_NP is not set ++# CONFIG_DEVFSD_VERBOSE is not set ++# CONFIG_FEATURE_DEVFS is not set ++CONFIG_DEVMEM=y ++# CONFIG_FBSPLASH is not set ++# CONFIG_FLASH_ERASEALL is not set ++# CONFIG_FLASH_LOCK is not set ++# CONFIG_FLASH_UNLOCK is not set ++# CONFIG_FLASHCP is not set ++CONFIG_HDPARM=y ++CONFIG_FEATURE_HDPARM_GET_IDENTITY=y ++# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set ++# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set ++# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set ++# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set ++# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set ++CONFIG_I2CGET=y ++CONFIG_I2CSET=y ++CONFIG_I2CDUMP=y ++CONFIG_I2CDETECT=y ++# CONFIG_INOTIFYD is not set ++CONFIG_LESS=y ++CONFIG_FEATURE_LESS_MAXLINES=9999999 ++CONFIG_FEATURE_LESS_BRACKETS=y ++CONFIG_FEATURE_LESS_FLAGS=y ++CONFIG_FEATURE_LESS_TRUNCATE=y ++# CONFIG_FEATURE_LESS_MARKS is not set ++CONFIG_FEATURE_LESS_REGEXP=y ++# CONFIG_FEATURE_LESS_WINCH is not set ++# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set ++# CONFIG_FEATURE_LESS_DASHCMD is not set ++# CONFIG_FEATURE_LESS_LINENUMS is not set ++CONFIG_LSSCSI=y ++CONFIG_MAKEDEVS=y ++# CONFIG_FEATURE_MAKEDEVS_LEAF is not set ++CONFIG_FEATURE_MAKEDEVS_TABLE=y ++# CONFIG_MAN is not set ++CONFIG_MICROCOM=y ++CONFIG_MT=y ++# CONFIG_NANDWRITE is not set ++# CONFIG_NANDDUMP is not set ++CONFIG_PARTPROBE=y ++# CONFIG_RAIDAUTORUN is not set ++# CONFIG_READAHEAD is not set ++# CONFIG_RFKILL is not set ++CONFIG_RUNLEVEL=y ++# CONFIG_RX is not set ++CONFIG_SETSERIAL=y ++CONFIG_STRINGS=y ++CONFIG_TIME=y ++# CONFIG_TTYSIZE is not set ++# CONFIG_UBIATTACH is not set ++# CONFIG_UBIDETACH is not set ++# CONFIG_UBIMKVOL is not set ++# CONFIG_UBIRMVOL is not set ++# CONFIG_UBIRSVOL is not set ++# CONFIG_UBIUPDATEVOL is not set ++CONFIG_UBIRENAME=y ++# CONFIG_VOLNAME is not set ++CONFIG_WATCHDOG=y ++ ++# ++# Networking Utilities ++# ++CONFIG_FEATURE_IPV6=y ++# CONFIG_FEATURE_UNIX_LOCAL is not set ++CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y ++# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set ++CONFIG_ARP=y ++CONFIG_ARPING=y ++# CONFIG_BRCTL is not set ++# CONFIG_FEATURE_BRCTL_FANCY is not set ++# CONFIG_FEATURE_BRCTL_SHOW is not set ++CONFIG_DNSD=y ++CONFIG_ETHER_WAKE=y ++# CONFIG_FTPD is not set ++# CONFIG_FEATURE_FTPD_WRITE is not set ++# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set ++# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set ++# CONFIG_FTPGET is not set ++# CONFIG_FTPPUT is not set ++# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set ++CONFIG_HOSTNAME=y ++CONFIG_DNSDOMAINNAME=y ++CONFIG_HTTPD=y ++CONFIG_FEATURE_HTTPD_RANGES=y ++CONFIG_FEATURE_HTTPD_SETUID=y ++CONFIG_FEATURE_HTTPD_BASIC_AUTH=y ++CONFIG_FEATURE_HTTPD_AUTH_MD5=y ++CONFIG_FEATURE_HTTPD_CGI=y ++CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y ++CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y ++CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y ++CONFIG_FEATURE_HTTPD_ERROR_PAGES=y ++CONFIG_FEATURE_HTTPD_PROXY=y ++CONFIG_FEATURE_HTTPD_GZIP=y ++CONFIG_IFCONFIG=y ++CONFIG_FEATURE_IFCONFIG_STATUS=y ++CONFIG_FEATURE_IFCONFIG_SLIP=y ++CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y ++CONFIG_FEATURE_IFCONFIG_HW=y ++# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set ++# CONFIG_IFENSLAVE is not set ++# CONFIG_IFPLUGD is not set ++CONFIG_IFUP=y ++CONFIG_IFDOWN=y ++CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" ++CONFIG_FEATURE_IFUPDOWN_IP=y ++CONFIG_FEATURE_IFUPDOWN_IPV4=y ++CONFIG_FEATURE_IFUPDOWN_IPV6=y ++CONFIG_FEATURE_IFUPDOWN_MAPPING=y ++# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set ++CONFIG_INETD=y ++CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y ++CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y ++CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y ++CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y ++CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y ++# CONFIG_FEATURE_INETD_RPC is not set ++CONFIG_IP=y ++CONFIG_IPADDR=y ++CONFIG_IPLINK=y ++CONFIG_IPROUTE=y ++CONFIG_IPTUNNEL=y ++CONFIG_IPRULE=y ++CONFIG_IPNEIGH=y ++CONFIG_FEATURE_IP_ADDRESS=y ++CONFIG_FEATURE_IP_LINK=y ++CONFIG_FEATURE_IP_ROUTE=y ++CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" ++CONFIG_FEATURE_IP_TUNNEL=y ++CONFIG_FEATURE_IP_RULE=y ++CONFIG_FEATURE_IP_NEIGH=y ++# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set ++# CONFIG_IPCALC is not set ++# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set ++# CONFIG_FEATURE_IPCALC_FANCY is not set ++# CONFIG_FAKEIDENTD is not set ++CONFIG_NAMEIF=y ++# CONFIG_FEATURE_NAMEIF_EXTENDED is not set ++# CONFIG_NBDCLIENT is not set ++# CONFIG_NC is not set ++# CONFIG_NC_SERVER is not set ++# CONFIG_NC_EXTRA is not set ++# CONFIG_NC_110_COMPAT is not set ++CONFIG_NETSTAT=y ++# CONFIG_FEATURE_NETSTAT_WIDE is not set ++# CONFIG_FEATURE_NETSTAT_PRG is not set ++CONFIG_NSLOOKUP=y ++# CONFIG_NTPD is not set ++# CONFIG_FEATURE_NTPD_SERVER is not set ++# CONFIG_FEATURE_NTPD_CONF is not set ++CONFIG_PING=y ++# CONFIG_PING6 is not set ++CONFIG_FEATURE_FANCY_PING=y ++# CONFIG_PSCAN is not set ++CONFIG_ROUTE=y ++# CONFIG_SLATTACH is not set ++CONFIG_SSL_CLIENT=y ++# CONFIG_TCPSVD is not set ++# CONFIG_UDPSVD is not set ++CONFIG_TELNET=y ++CONFIG_FEATURE_TELNET_TTYPE=y ++CONFIG_FEATURE_TELNET_AUTOLOGIN=y ++CONFIG_FEATURE_TELNET_WIDTH=y ++# CONFIG_TELNETD is not set ++# CONFIG_FEATURE_TELNETD_STANDALONE is not set ++# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set ++CONFIG_TFTP=y ++# CONFIG_TFTPD is not set ++ ++# ++# Common options for tftp/tftpd ++# ++CONFIG_FEATURE_TFTP_GET=y ++CONFIG_FEATURE_TFTP_PUT=y ++CONFIG_FEATURE_TFTP_BLOCKSIZE=y ++# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set ++# CONFIG_TFTP_DEBUG is not set ++CONFIG_TLS=y ++CONFIG_TRACEROUTE=y ++# CONFIG_TRACEROUTE6 is not set ++# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set ++# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set ++# CONFIG_TUNCTL is not set ++# CONFIG_FEATURE_TUNCTL_UG is not set ++CONFIG_VCONFIG=y ++CONFIG_WGET=y ++CONFIG_FEATURE_WGET_LONG_OPTIONS=y ++CONFIG_FEATURE_WGET_STATUSBAR=y ++CONFIG_FEATURE_WGET_AUTHENTICATION=y ++CONFIG_FEATURE_WGET_TIMEOUT=y ++CONFIG_FEATURE_WGET_HTTPS=y ++# CONFIG_FEATURE_WGET_OPENSSL is not set ++# CONFIG_WHOIS is not set ++# CONFIG_ZCIP is not set ++# CONFIG_UDHCPC6 is not set ++# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set ++# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set ++# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set ++CONFIG_UDHCPD=y ++CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y ++# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set ++CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" ++CONFIG_DUMPLEASES=y ++CONFIG_DHCPRELAY=y ++CONFIG_UDHCPC=y ++CONFIG_FEATURE_UDHCPC_ARPING=y ++CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y ++CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" ++# CONFIG_FEATURE_UDHCP_PORT is not set ++CONFIG_UDHCP_DEBUG=0 ++# CONFIG_FEATURE_UDHCP_RFC3397 is not set ++CONFIG_FEATURE_UDHCP_8021Q=y ++CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 ++CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" ++ ++# ++# Print Utilities ++# ++# CONFIG_LPD is not set ++# CONFIG_LPR is not set ++# CONFIG_LPQ is not set ++ ++# ++# Mail Utilities ++# ++# CONFIG_MAKEMIME is not set ++# CONFIG_POPMAILDIR is not set ++# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set ++# CONFIG_REFORMIME is not set ++# CONFIG_FEATURE_REFORMIME_COMPAT is not set ++# CONFIG_SENDMAIL is not set ++CONFIG_FEATURE_MIME_CHARSET="" ++ ++# ++# Process Utilities ++# ++CONFIG_FREE=y ++CONFIG_FUSER=y ++# CONFIG_IOSTAT is not set ++CONFIG_KILL=y ++CONFIG_KILLALL=y ++CONFIG_KILLALL5=y ++CONFIG_LSOF=y ++# CONFIG_MPSTAT is not set ++# CONFIG_NMETER is not set ++# CONFIG_PGREP is not set ++# CONFIG_PKILL is not set ++CONFIG_PIDOF=y ++CONFIG_FEATURE_PIDOF_SINGLE=y ++CONFIG_FEATURE_PIDOF_OMIT=y ++# CONFIG_PMAP is not set ++# CONFIG_POWERTOP is not set ++# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set ++CONFIG_PS=y ++# CONFIG_FEATURE_PS_WIDE is not set ++# CONFIG_FEATURE_PS_LONG is not set ++# CONFIG_FEATURE_PS_TIME is not set ++# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set ++# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set ++# CONFIG_PSTREE is not set ++# CONFIG_PWDX is not set ++# CONFIG_SMEMCAP is not set ++CONFIG_BB_SYSCTL=y ++CONFIG_TOP=y ++CONFIG_FEATURE_TOP_INTERACTIVE=y ++CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y ++CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y ++# CONFIG_FEATURE_TOP_SMP_CPU is not set ++# CONFIG_FEATURE_TOP_DECIMALS is not set ++# CONFIG_FEATURE_TOP_SMP_PROCESS is not set ++# CONFIG_FEATURE_TOPMEM is not set ++CONFIG_UPTIME=y ++# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set ++CONFIG_WATCH=y ++# CONFIG_FEATURE_SHOW_THREADS is not set ++ ++# ++# Runit Utilities ++# ++# CONFIG_CHPST is not set ++# CONFIG_SETUIDGID is not set ++# CONFIG_ENVUIDGID is not set ++# CONFIG_ENVDIR is not set ++# CONFIG_SOFTLIMIT is not set ++# CONFIG_RUNSV is not set ++# CONFIG_RUNSVDIR is not set ++# CONFIG_FEATURE_RUNSVDIR_LOG is not set ++# CONFIG_SV is not set ++CONFIG_SV_DEFAULT_SERVICE_DIR="" ++CONFIG_SVC=y ++# CONFIG_SVLOGD is not set ++# CONFIG_CHCON is not set ++# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set ++# CONFIG_GETENFORCE is not set ++# CONFIG_GETSEBOOL is not set ++# CONFIG_LOAD_POLICY is not set ++# CONFIG_MATCHPATHCON is not set ++# CONFIG_RUNCON is not set ++# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set ++# CONFIG_SELINUXENABLED is not set ++# CONFIG_SESTATUS is not set ++# CONFIG_SETENFORCE is not set ++# CONFIG_SETFILES is not set ++# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set ++# CONFIG_RESTORECON is not set ++# CONFIG_SETSEBOOL is not set ++ ++# ++# Shells ++# ++CONFIG_SH_IS_ASH=y ++# CONFIG_SH_IS_HUSH is not set ++# CONFIG_SH_IS_NONE is not set ++# CONFIG_BASH_IS_ASH is not set ++# CONFIG_BASH_IS_HUSH is not set ++CONFIG_BASH_IS_NONE=y ++CONFIG_ASH=y ++CONFIG_ASH_OPTIMIZE_FOR_SIZE=y ++CONFIG_ASH_INTERNAL_GLOB=y ++CONFIG_ASH_BASH_COMPAT=y ++CONFIG_ASH_JOB_CONTROL=y ++CONFIG_ASH_ALIAS=y ++CONFIG_ASH_RANDOM_SUPPORT=y ++CONFIG_ASH_EXPAND_PRMT=y ++CONFIG_ASH_IDLE_TIMEOUT=y ++# CONFIG_ASH_MAIL is not set ++CONFIG_ASH_ECHO=y ++CONFIG_ASH_PRINTF=y ++CONFIG_ASH_TEST=y ++CONFIG_ASH_HELP=y ++CONFIG_ASH_GETOPTS=y ++CONFIG_ASH_CMDCMD=y ++# CONFIG_CTTYHACK is not set ++# CONFIG_HUSH is not set ++# CONFIG_HUSH_BASH_COMPAT is not set ++# CONFIG_HUSH_BRACE_EXPANSION is not set ++# CONFIG_HUSH_INTERACTIVE is not set ++# CONFIG_HUSH_SAVEHISTORY is not set ++# CONFIG_HUSH_JOB is not set ++# CONFIG_HUSH_TICK is not set ++# CONFIG_HUSH_IF is not set ++# CONFIG_HUSH_LOOPS is not set ++# CONFIG_HUSH_CASE is not set ++# CONFIG_HUSH_FUNCTIONS is not set ++# CONFIG_HUSH_LOCAL is not set ++# CONFIG_HUSH_RANDOM_SUPPORT is not set ++# CONFIG_HUSH_MODE_X is not set ++# CONFIG_HUSH_ECHO is not set ++# CONFIG_HUSH_PRINTF is not set ++# CONFIG_HUSH_TEST is not set ++# CONFIG_HUSH_HELP is not set ++# CONFIG_HUSH_EXPORT is not set ++# CONFIG_HUSH_EXPORT_N is not set ++# CONFIG_HUSH_KILL is not set ++# CONFIG_HUSH_WAIT is not set ++# CONFIG_HUSH_TRAP is not set ++# CONFIG_HUSH_TYPE is not set ++# CONFIG_HUSH_READ is not set ++# CONFIG_HUSH_SET is not set ++# CONFIG_HUSH_UNSET is not set ++# CONFIG_HUSH_ULIMIT is not set ++# CONFIG_HUSH_UMASK is not set ++# CONFIG_HUSH_MEMLEAK is not set ++# CONFIG_MSH is not set ++ ++# ++# Options common to all shells ++# ++CONFIG_FEATURE_SH_MATH=y ++CONFIG_FEATURE_SH_MATH_64=y ++CONFIG_FEATURE_SH_EXTRA_QUIET=y ++# CONFIG_FEATURE_SH_STANDALONE is not set ++# CONFIG_FEATURE_SH_NOFORK is not set ++# CONFIG_FEATURE_SH_HISTFILESIZE is not set ++ ++# ++# System Logging Utilities ++# ++CONFIG_KLOGD=y ++CONFIG_FEATURE_KLOGD_KLOGCTL=y ++CONFIG_LOGGER=y ++# CONFIG_LOGREAD is not set ++# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set ++CONFIG_SYSLOGD=y ++CONFIG_FEATURE_ROTATE_LOGFILE=y ++CONFIG_FEATURE_REMOTE_LOG=y ++# CONFIG_FEATURE_SYSLOGD_DUP is not set ++# CONFIG_FEATURE_SYSLOGD_CFG is not set ++CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 ++# CONFIG_FEATURE_IPC_SYSLOG is not set ++CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 ++# CONFIG_FEATURE_KMSG_SYSLOG is not set +diff --git a/board/ant/device_config b/board/ant/device_config +new file mode 100644 +index 0000000000..c241bf90a0 +--- /dev/null ++++ b/board/ant/device_config +@@ -0,0 +1,15 @@ ++#S23udc ++PRODUCT="PlutoSDR (ADALM-PLUTO)" ++USBPID=0xb673 ++ENDPOINTS=3 ++ ++#S40network / S41network ++UDHCPD_CONF=/etc/udhcpd.conf ++CONF=/opt/config.txt ++IFAC=/etc/network/interfaces ++ ++#update.sh ++TARGET=plutosdr ++FIRMWARE=/mnt/msd/ant.frm ++FRM_MAGIC="ITB PlutoSDR (ADALM-PLUTO)" ++ +diff --git a/board/ant/device_format_jffs2 b/board/ant/device_format_jffs2 +new file mode 100644 +index 0000000000..eb2e5ce7e3 +--- /dev/null ++++ b/board/ant/device_format_jffs2 +@@ -0,0 +1,17 @@ ++#!/bin/sh ++set +e ++ ++while true; ++do ++ read -p "Are you sure to delete/format your mtd2 JFFS2 (/mnt/jffs2) partition? (yes/no) " answ ++ case $answ in ++ [Yy]* ) ++ umount /mnt/jffs2 ++ flash_erase -j /dev/mtd2 0 0 ++ mount -a ++ break ++ ;; ++ [Nn]* ) exit;; ++ * ) echo "Please answer yes or no.";; ++ esac ++done +diff --git a/board/ant/device_passwd b/board/ant/device_passwd +new file mode 100644 +index 0000000000..c3c50dddc4 +--- /dev/null ++++ b/board/ant/device_passwd +@@ -0,0 +1,11 @@ ++#!/bin/sh ++set +e ++ ++cat /proc/mounts | grep -q mtd2 || (echo "Filesystem not mounted use device_format_jffs2 command to setup your partition"; exit 1) ++ ++passwd ++install -D /etc/passwd /etc/shadow /etc/group -t /mnt/jffs2/etc ++cd /etc ++md5sum passwd shadow group 2>/dev/null > /mnt/jffs2/etc/password.md5 ++sync ++ +diff --git a/board/ant/device_persistent_keys b/board/ant/device_persistent_keys +new file mode 100644 +index 0000000000..a67d3a8db2 +--- /dev/null ++++ b/board/ant/device_persistent_keys +@@ -0,0 +1,21 @@ ++#!/bin/sh ++set +e ++ ++KEYFILE=/etc/dropbear/dropbear_ecdsa_host_key ++IDFILE=/root/.ssh/authorized_keys ++ ++cat /proc/mounts | grep -q mtd2 || (echo "Filesystem not mounted use device_format_jffs2 command to setup your partition"; exit 1) ++ ++#dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key ++[[ ! -f ${KEYFILE} ]] && dropbearkey -t ecdsa -f ${KEYFILE} ++install -D /etc/dropbear/dropbear_* -t /mnt/jffs2/etc/dropbear ++cd /etc/dropbear ++md5sum dropbear_* /etc/dropbear/ 2>/dev/null > /mnt/jffs2/etc/dropbear/keys.md5 ++ ++if [ -f ${IDFILE} ]; then ++ install -D ${IDFILE} -t /mnt/jffs2/root/.ssh ++ cd /root/.ssh ++ md5sum authorized_keys 2>/dev/null > /mnt/jffs2/root/.ssh/keys.md5 ++fi ++ ++sync +diff --git a/board/ant/device_reboot b/board/ant/device_reboot +new file mode 100644 +index 0000000000..1134b2a240 +--- /dev/null ++++ b/board/ant/device_reboot +@@ -0,0 +1,32 @@ ++#!/bin/sh ++ ++case "$1" in ++ ram) ++ cause=7 ++ ;; ++ sf) ++ cause=3 ++ ;; ++ verbose) ++ cause=6 ++ ;; ++ break) ++ cause=2 ++ ;; ++ reset) ++ cause=0 ++ ;; ++ ++ *) ++ echo "Usage: $0 {ram|sf|reset|verbose|break}" ++ echo " sf : Reboot and enter Serial Flash DFU mode" ++ echo " ram : Reboot and enter RAM DFU mode" ++ echo " reset : Reboot" ++ echo " verbose: Reboot and start serial console Verbose" ++ echo " break : Reboot and HALT in u-boot" ++ exit 1 ++esac ++ ++echo $cause > /sys/kernel/debug/zynq_rst/code && /sbin/reboot ++ ++exit 0 +diff --git a/board/ant/dropbrear_localoptions.h b/board/ant/dropbrear_localoptions.h +new file mode 100644 +index 0000000000..8d1cd4ab7b +--- /dev/null ++++ b/board/ant/dropbrear_localoptions.h +@@ -0,0 +1 @@ ++#define DO_MOTD 1 +diff --git a/board/ant/fw_env.config b/board/ant/fw_env.config +new file mode 100644 +index 0000000000..402a3409ff +--- /dev/null ++++ b/board/ant/fw_env.config +@@ -0,0 +1,2 @@ ++# MTD device name Device offset Env. size Flash sector size ++/dev/mtd1 0x0000 0x20000 0x20000 +diff --git a/board/ant/genimage-msd.cfg b/board/ant/genimage-msd.cfg +new file mode 100644 +index 0000000000..71872e8596 +--- /dev/null ++++ b/board/ant/genimage-msd.cfg +@@ -0,0 +1,20 @@ ++image boot.vfat { ++ vfat { ++ extraargs = "-n PlutoSDR" ++ files = {"index.html", "LICENSE.html"} ++ } ++ size = 30M ++} ++ ++image vfat.img { ++ hdimage { ++ } ++ ++ partition boot { ++ partition-type = 0xC ++ bootable = "false" ++ image = "boot.vfat" ++ } ++} ++ ++ +diff --git a/board/ant/ifupdown.sh b/board/ant/ifupdown.sh +new file mode 100644 +index 0000000000..0e75ce188d +--- /dev/null ++++ b/board/ant/ifupdown.sh +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++case "${ACTION}" in ++add|"") ++ ifconfig ${MDEV} up ++ ifup ${MDEV} ++ echo $(ip -f inet -o addr show ${MDEV}|cut -d\ -f 7 | cut -d/ -f 1) > /opt/ipaddr-${MDEV} ++ ;; ++remove) ++ ifdown ${MDEV} ++ ;; ++esac +diff --git a/board/ant/index.html b/board/ant/index.html +new file mode 100644 +index 0000000000..a09ecf0b3e +--- /dev/null ++++ b/board/ant/index.html +@@ -0,0 +1,372 @@ ++ ++ ++ ++ ++ ++ ++ADALM-PLUTO On-board documentation ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++Analog Devices logo ++ ++
++Network Version | ++Register your PlutoSDR | ++Share PlutoSDR: Twitter Logo ++
++
++ ++ ++
++
++

Welcome to the ADALM-PLUTO Active Learning Module

++ADI Professor ++

Thank you for purchasing the ADALM-PLUTO Active Learning Module (PlutoSDR). The easy-to-use PlutoSDR helps introduce the fundamentals of software-defined radio (SDR), radio frequency (RF), and wireless communications to everyone. Designed for users at all levels and all backgrounds, the PlutoSDR can be used as:

++ ++

Based on the AD9363, the PlutoSDR features independent receive and transmit channels that can be operated in full duplex. The PlutoSDR can generate or acquire RF analog signals from 325 MHz to 3800 MHz at up to 61.44 MegaSamples per second (MSPS). Small enough to fit in a shirt pocket, the PlutoSDR is completely self-contained and entirely USB powered with the default firmware. PlutoSDR is enabled by libiio drivers and supports macOS®, Windows®, and Linux®, allowing students and engineers to learn and explore on a variety of host platforms.

++
++
++
++Back to top ++

Getting Started

++

The PlutoSDR online documentation provides instruction on how to set up the software on your Windows, Linux, or macOS based host to use the PlutoSDR. For those who do not read instructions, do the following steps:

++
    ++
  1. Upgrade your Firmware ++
  2. Install the Windows driver : Latest Windows Driver
  3. ++
  4. Install the libiio Library: : Latest version of the libiio
  5. ++
++

Test your installation:

++

Once everything above is installed, with your favorite console (Windows Linux or macOS), try these two commands (in bold below) to make sure the drivers and software is installed properly. It is expected that the serial number (specific to the PlutoSDR device) and usb uri (the three numbers after the 'usb:' field, based on your host) will be different than the examples below.

++
++rgetz@brain:~/$ iio_info -s
++Library version: 0.16 (git tag: 5cdeaaa)
++Compiled with backends: local xml ip usb serial
++Available contexts:
++	0: 0456:b673 (Analog Devices Inc. PlutoSDR (ADALM-PLUTO)), serial=100000235523730700190030090216fd23 [usb:3.15.5]
++
++rgetz@brain:~/$ iio_info -u ip:192.168.2.1
++Library version: 0.16 (git tag: 5cdeaaa)
++Compiled with backends: local xml ip usb serial
++IIO context created with network backend.
++Backend version: 0.15 (git tag: v0.15  )
++Backend description string: 192.168.2.1 Linux (none) 4.9.0-10475-g2398d50 #269 SMP PREEMPT Mon Oct 15 20:18:34 CEST 2018 armv7l
++IIO context has 8 attributes:
++        hw_model: Analog Devices PlutoSDR Rev.A (Z7010-AD9363)
++        hw_model_variant: 0
++        hw_serial: 100000235523730700190030090216fd23
++....
++			2 channel-specific attributes found:
++				attr  0: scale value: 6.433105468
++				attr  1: raw value: 778
++
++

If the 'iio_info -s' command cannot find the PlutoSDR on your host, you will need to do some reading and troubleshooting. If you are having issues installing the software, check out the on-line tutorials. Once the software is running, you can enable PlutoSDR in your communications framework like MATLAB, by following along the on-line tutorials.

++
++
++
++Back to top ++

Frameworks

++

Use the PlutoSDR with your favorite communications framework, visualization, or signal processing tool.

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
Framework / ApplicationOSDescription
MathWorks logoWindows, Linux, macOSCommunications Toolbox™ Support Package for Analog Devices PlutoSDR (doc) enables you to use MATLAB® and Simulink® to prototype, verify, and test practical wireless systems. Request a zero cost trial and then use, study, modify, and/or distribute a variety of MATLAB and Simulink examples.
GNU Radio logoLinux, macOSGNU Radio is a Free and Open-Source Toolkit for Software Radio, primarily supported on Linux operating systems. It has both generic IIO blocks, and PlutoSDR specific blocks
IIO Command Line ToolsWindows, Linux, macOSiio_info, ++iio_attr, ++iio_readdev, ++iio_writedev, ++iio_reg ++for interacting with the PlutoSDR from your favorite shell. ++
Osc logo IIO OscilloscopeWindows, LinuxThe IIO Oscilloscope is an application, which demonstrates how to interface various IIO devices to different visualization methods on Linux and Windows
SDRAngel logoWindows, LinuxSDRangel is an Open Source Qt5 / OpenGL 3.0+ SDR and signal analyzer frontend to various hardware. Check the discussion group and wiki. While SDRangel seeks to be approachable, it is targeted towards the experienced SDR user with some digital signal processing understanding.
SDR Sharp logoWindowsSDR# (SDR Sharp) is a popular SDR program for the Airspy, and supports the PlutoSDR with a third party plugin. A complete installation tutorial exists.
other tools ++Windows, Linux, macOSA variety of other tools and projects using the PlutoSDR
++ ++ ++

Detailed documentation can be found at the Main Documentation page. Information on regulatory compliance and safety information can be found online.

++
++
++
++Back to top ++

Firmware

++

The ADALM-PLUTO Firmware refers to the U-Boot, HDL, Linux kernel, device drivers, and user space software, which runs on the PlutoSDR. This is bundled up and given a specific version number for the PlutoSDR. For help upgrading firmware, check out the online documentation.

++
++

Status of the PlutoSDR firmware:

++

Need javascript to check (sorry)

++

Check the latest version ++

++
++Back to top ++

Version Information:

++

The various parts of the firmware all have their own unique versions as well:

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
Model#MODEL#
Serial#SERIAL#
Build#BUILD#
Linux#LINUX#
U-Boot#UBOOT#
FPGA#FPGA#
Root FS#ROOTFS#
IIO#IIO#
Network over USB#NETWORKUSB#
++Back to top ++

Standalone Applications:

++

Custom C/C++ applications can be created/compiled on a host with a Linaro GNU Compiler Collection (GCC) toolchain (with the appropriate flags), transferred over and run directly on the PlutoSDR.

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
GCC Compiler Target Triple#GCC_TRIPLE#
GCC version#GCC_VERSION#
Binutils version#BIN_VERSION#
SysRootLatest SYSROOT
++Back to top ++

Build Settings:

++

There are many settings which are set as part of the build configuration, and can not be changed without rebuilding the firmware.

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
Username:root
Password:#ROOTPASSWORD#
++Back to top ++

Configuration Settings:

++

On the root file system, there are configuration settings that can modify the default configuration, they currently are:

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
Hostname#HOSTNAME#
IP Address (PlutoSDR)#IP#
IP Address (HOST)#HOSTIP#
Netmask#NETMASK#
MAC Address (PlutoSDR)#MAC#
MAC Address (HOST)#MACHOST#
++Back to top ++

Wi-Fi Update

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
SSID#SSID_WLAN#
WPA-PSK Passphrase********
IP Address#IPADDR_WLAN#
++Back to top ++

Wired Ethernet using a USB Ethernet adapter. Update

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
IP Address#IPADDR_ETH#
Netmask#NETMASK_ETH#
++ ++

To change these settings, check the on-line documentation.

++
++
++
++Back to top ++

Help and Support

++

If you have any questions regarding the PlutoSDR or are experiencing any problems following the user guides, or experiments feel free to ask us a question. Questions can be asked on our Virtual Classroom. Help and support for the PlutoSDR is provided exclusively online. If you don't have an internet connection on this computer, please find one that does.

++
++
++
++
++ ++
++

About Analog Devices

++
++

Analog Devices (Nasdaq: ADI) is a leading global high-performance analog technology company dedicated to solving the toughest engineering challenges. We enable our customers to interpret the world around us by intelligently bridging the physical and digital with unmatched technologies that sense, measure, power, connect and interpret.

++
++
++

We offer technical journals and other community resources to engineers, scientists, technicians, and students looking to help and share with one another. Interested in the latest news and articles about ADI products, design tools, training and events? Choose from one of our 12 newsletters that match your product area of interest, delivered monthly or quarterly to your inbox. Sign up

++

Follow Analog Devices on your favorite social media site:

++
++

EngineerZone logo ++FaceBook Logo ++Twitter Logo ++Instgram Logo ++Google+ Logo ++LinkedIn Logo ++YouTube Logo ++Sina Weibo Logo ++YouKu Logo ++SlideShare Logo ++

++
++
++
++ ++ ++ ++ ++ ++ +diff --git a/board/ant/input-event-daemon.conf b/board/ant/input-event-daemon.conf +new file mode 100644 +index 0000000000..96c1c9a3a1 +--- /dev/null ++++ b/board/ant/input-event-daemon.conf +@@ -0,0 +1,12 @@ ++# ++# /etc/input-event-daemon.conf ++# ++ ++[Global] ++listen = /dev/input/event0 ++ ++[Keys] ++BTN_0 = ACTION=remove_all /lib/mdev/automounter.sh ++ ++ ++ +diff --git a/board/ant/mdev.conf b/board/ant/mdev.conf +new file mode 100644 +index 0000000000..09ad12fbb8 +--- /dev/null ++++ b/board/ant/mdev.conf +@@ -0,0 +1,7 @@ ++# block devices ++sd[a-z] root:root 660 */lib/mdev/automounter.sh ++sd[a-z][0-9] root:root 660 */lib/mdev/automounter.sh ++# net devices ++wlan[0-9] root:root 660 */lib/mdev/ifupdown.sh ++usb[0-9] root:root 660 */lib/mdev/ifupdown.sh ++eth[0-9] root:root 660 */lib/mdev/ifupdown.sh +diff --git a/board/ant/motd b/board/ant/motd +new file mode 100644 +index 0000000000..06bc0aea56 +--- /dev/null ++++ b/board/ant/motd +@@ -0,0 +1,9 @@ ++Welcome to: ++ ___ _ _____________ ____ ____ ++ / | / | / /_ __/ ___// __ \/ __ \ ++ / /| | / |/ / / / \__ \/ / / / /_/ / ++ / ___ |/ /| / / / ___/ / /_/ / _, _/ ++/_/ |_/_/ |_/ /_/ /____/_____/_/ |_| ++ ++#BUILD# ++https://github.com/MicroPhase/antsdr-fw-patch +diff --git a/board/ant/msd/.gitignore b/board/ant/msd/.gitignore +new file mode 100644 +index 0000000000..ef2d66efd1 +--- /dev/null ++++ b/board/ant/msd/.gitignore +@@ -0,0 +1,2 @@ ++LICENSE.html ++index.html +diff --git a/board/ant/msd/LICENSE b/board/ant/msd/LICENSE +new file mode 100644 +index 0000000000..d159169d10 +--- /dev/null ++++ b/board/ant/msd/LICENSE +@@ -0,0 +1,339 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 2, June 1991 ++ ++ Copyright (C) 1989, 1991 Free Software Foundation, Inc., ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The licenses for most software are designed to take away your ++freedom to share and change it. By contrast, the GNU General Public ++License is intended to guarantee your freedom to share and change free ++software--to make sure the software is free for all its users. This ++General Public License applies to most of the Free Software ++Foundation's software and to any other program whose authors commit to ++using it. (Some other Free Software Foundation software is covered by ++the GNU Lesser General Public License instead.) You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++this service if you wish), that you receive source code or can get it ++if you want it, that you can change the software or use pieces of it ++in new free programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must show them these terms so they know their ++rights. ++ ++ We protect your rights with two steps: (1) copyright the software, and ++(2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ Finally, any free program is threatened constantly by software ++patents. We wish to avoid the danger that redistributors of a free ++program will individually obtain patent licenses, in effect making the ++program proprietary. To prevent this, we have made it clear that any ++patent must be licensed for everyone's free use or not licensed at all. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ GNU GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License applies to any program or other work which contains ++a notice placed by the copyright holder saying it may be distributed ++under the terms of this General Public License. The "Program", below, ++refers to any such program or work, and a "work based on the Program" ++means either the Program or any derivative work under copyright law: ++that is to say, a work containing the Program or a portion of it, ++either verbatim or with modifications and/or translated into another ++language. (Hereinafter, translation is included without limitation in ++the term "modification".) Each licensee is addressed as "you". ++ ++Activities other than copying, distribution and modification are not ++covered by this License; they are outside its scope. The act of ++running the Program is not restricted, and the output from the Program ++is covered only if its contents constitute a work based on the ++Program (independent of having been made by running the Program). ++Whether that is true depends on what the Program does. ++ ++ 1. You may copy and distribute verbatim copies of the Program's ++source code as you receive it, in any medium, provided that you ++conspicuously and appropriately publish on each copy an appropriate ++copyright notice and disclaimer of warranty; keep intact all the ++notices that refer to this License and to the absence of any warranty; ++and give any other recipients of the Program a copy of this License ++along with the Program. ++ ++You may charge a fee for the physical act of transferring a copy, and ++you may at your option offer warranty protection in exchange for a fee. ++ ++ 2. You may modify your copy or copies of the Program or any portion ++of it, thus forming a work based on the Program, and copy and ++distribute such modifications or work under the terms of Section 1 ++above, provided that you also meet all of these conditions: ++ ++ a) You must cause the modified files to carry prominent notices ++ stating that you changed the files and the date of any change. ++ ++ b) You must cause any work that you distribute or publish, that in ++ whole or in part contains or is derived from the Program or any ++ part thereof, to be licensed as a whole at no charge to all third ++ parties under the terms of this License. ++ ++ c) If the modified program normally reads commands interactively ++ when run, you must cause it, when started running for such ++ interactive use in the most ordinary way, to print or display an ++ announcement including an appropriate copyright notice and a ++ notice that there is no warranty (or else, saying that you provide ++ a warranty) and that users may redistribute the program under ++ these conditions, and telling the user how to view a copy of this ++ License. (Exception: if the Program itself is interactive but ++ does not normally print such an announcement, your work based on ++ the Program is not required to print an announcement.) ++ ++These requirements apply to the modified work as a whole. If ++identifiable sections of that work are not derived from the Program, ++and can be reasonably considered independent and separate works in ++themselves, then this License, and its terms, do not apply to those ++sections when you distribute them as separate works. But when you ++distribute the same sections as part of a whole which is a work based ++on the Program, the distribution of the whole must be on the terms of ++this License, whose permissions for other licensees extend to the ++entire whole, and thus to each and every part regardless of who wrote it. ++ ++Thus, it is not the intent of this section to claim rights or contest ++your rights to work written entirely by you; rather, the intent is to ++exercise the right to control the distribution of derivative or ++collective works based on the Program. ++ ++In addition, mere aggregation of another work not based on the Program ++with the Program (or with a work based on the Program) on a volume of ++a storage or distribution medium does not bring the other work under ++the scope of this License. ++ ++ 3. You may copy and distribute the Program (or a work based on it, ++under Section 2) in object code or executable form under the terms of ++Sections 1 and 2 above provided that you also do one of the following: ++ ++ a) Accompany it with the complete corresponding machine-readable ++ source code, which must be distributed under the terms of Sections ++ 1 and 2 above on a medium customarily used for software interchange; or, ++ ++ b) Accompany it with a written offer, valid for at least three ++ years, to give any third party, for a charge no more than your ++ cost of physically performing source distribution, a complete ++ machine-readable copy of the corresponding source code, to be ++ distributed under the terms of Sections 1 and 2 above on a medium ++ customarily used for software interchange; or, ++ ++ c) Accompany it with the information you received as to the offer ++ to distribute corresponding source code. (This alternative is ++ allowed only for noncommercial distribution and only if you ++ received the program in object code or executable form with such ++ an offer, in accord with Subsection b above.) ++ ++The source code for a work means the preferred form of the work for ++making modifications to it. For an executable work, complete source ++code means all the source code for all modules it contains, plus any ++associated interface definition files, plus the scripts used to ++control compilation and installation of the executable. However, as a ++special exception, the source code distributed need not include ++anything that is normally distributed (in either source or binary ++form) with the major components (compiler, kernel, and so on) of the ++operating system on which the executable runs, unless that component ++itself accompanies the executable. ++ ++If distribution of executable or object code is made by offering ++access to copy from a designated place, then offering equivalent ++access to copy the source code from the same place counts as ++distribution of the source code, even though third parties are not ++compelled to copy the source along with the object code. ++ ++ 4. You may not copy, modify, sublicense, or distribute the Program ++except as expressly provided under this License. Any attempt ++otherwise to copy, modify, sublicense or distribute the Program is ++void, and will automatically terminate your rights under this License. ++However, parties who have received copies, or rights, from you under ++this License will not have their licenses terminated so long as such ++parties remain in full compliance. ++ ++ 5. You are not required to accept this License, since you have not ++signed it. However, nothing else grants you permission to modify or ++distribute the Program or its derivative works. These actions are ++prohibited by law if you do not accept this License. Therefore, by ++modifying or distributing the Program (or any work based on the ++Program), you indicate your acceptance of this License to do so, and ++all its terms and conditions for copying, distributing or modifying ++the Program or works based on it. ++ ++ 6. Each time you redistribute the Program (or any work based on the ++Program), the recipient automatically receives a license from the ++original licensor to copy, distribute or modify the Program subject to ++these terms and conditions. You may not impose any further ++restrictions on the recipients' exercise of the rights granted herein. ++You are not responsible for enforcing compliance by third parties to ++this License. ++ ++ 7. If, as a consequence of a court judgment or allegation of patent ++infringement or for any other reason (not limited to patent issues), ++conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot ++distribute so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you ++may not distribute the Program at all. For example, if a patent ++license would not permit royalty-free redistribution of the Program by ++all those who receive copies directly or indirectly through you, then ++the only way you could satisfy both it and this License would be to ++refrain entirely from distribution of the Program. ++ ++If any portion of this section is held invalid or unenforceable under ++any particular circumstance, the balance of the section is intended to ++apply and the section as a whole is intended to apply in other ++circumstances. ++ ++It is not the purpose of this section to induce you to infringe any ++patents or other property right claims or to contest validity of any ++such claims; this section has the sole purpose of protecting the ++integrity of the free software distribution system, which is ++implemented by public license practices. Many people have made ++generous contributions to the wide range of software distributed ++through that system in reliance on consistent application of that ++system; it is up to the author/donor to decide if he or she is willing ++to distribute software through any other system and a licensee cannot ++impose that choice. ++ ++This section is intended to make thoroughly clear what is believed to ++be a consequence of the rest of this License. ++ ++ 8. If the distribution and/or use of the Program is restricted in ++certain countries either by patents or by copyrighted interfaces, the ++original copyright holder who places the Program under this License ++may add an explicit geographical distribution limitation excluding ++those countries, so that distribution is permitted only in or among ++countries not thus excluded. In such case, this License incorporates ++the limitation as if written in the body of this License. ++ ++ 9. The Free Software Foundation may publish revised and/or new versions ++of the General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Program ++specifies a version number of this License which applies to it and "any ++later version", you have the option of following the terms and conditions ++either of that version or of any later version published by the Free ++Software Foundation. If the Program does not specify a version number of ++this License, you may choose any version ever published by the Free Software ++Foundation. ++ ++ 10. If you wish to incorporate parts of the Program into other free ++programs whose distribution conditions are different, write to the author ++to ask for permission. For software which is copyrighted by the Free ++Software Foundation, write to the Free Software Foundation; we sometimes ++make exceptions for this. Our decision will be guided by the two goals ++of preserving the free status of all derivatives of our free software and ++of promoting the sharing and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ++REPAIR OR CORRECTION. ++ ++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR ++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, ++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING ++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED ++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY ++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER ++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE ++POSSIBILITY OF SUCH DAMAGES. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++convey the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++If the program is interactive, make it output a short notice like this ++when it starts in an interactive mode: ++ ++ Gnomovision version 69, Copyright (C) year name of author ++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, the commands you use may ++be called something other than `show w' and `show c'; they could even be ++mouse-clicks or menu items--whatever suits your program. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a "copyright disclaimer" for the program, if ++necessary. Here is a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program ++ `Gnomovision' (which makes passes at compilers) written by James Hacker. ++ ++ , 1 April 1989 ++ Ty Coon, President of Vice ++ ++This General Public License does not permit incorporating your program into ++proprietary programs. If your program is a subroutine library, you may ++consider it more useful to permit linking proprietary applications with the ++library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. +diff --git a/board/ant/msd/img/ADI_Logo_AWP.png b/board/ant/msd/img/ADI_Logo_AWP.png +new file mode 100644 +index 0000000000000000000000000000000000000000..231fa10875b8f8f8522784f2cf9368c122f05e05 +GIT binary patch +literal 12437 +zcmeAS@N?(olHy`uVBq!ia0y~yV6fq_A?#5JNMI6tkVJh3R1 +z!7(L2DOJHUH!(dmC^a#qvhZZ84FdzSPi9C&NrbPDRdRl=ULr`1UPW#J0|?mIR}>^B +zXQ!4ZB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT8h +zBDWwnwIorYA~z?m*s8)-32d%aUa=KOSYJs2tfVB{Rte&$2;Tq&=lr5n1yemU-DCqZ +za|LrtJwsD-a}#qN1tSAPQ+)$tePaV%BV#KQ11l3F1t?ImQ?MyYNwW%aaf8}bl#*tv +zlu=SrV5P5LUS6(OZmgGIl&)`RX=$l%V5Dzkq+67drdwQ@SCUwvn^&w1Gr=XbIJqdZ +zpd>RtPXT0NVp4u-iLH_n)YyvL0$*Ra!Fk2dfJ)BK)vrh_&^OdG(9g{U`3vmf;*y|L +zgfpUdMTMH +zRu-0~7ACHajuwXIPKJiArcN%FmM#X)rj~BbmX3~=PB6WmdBr7(dC93Ty_uOQR%VV) +z=1#6|CV2H)ITxiSmgE5WS +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 +z_=SrvSXbW&&+%M^0a>&j4DG< +zSY2%W@+0OHzFchQ-$Sd7qe3oU(~Ulp-*cf|!>ax7x=T62H&PGZcvYgfS7`N~ +zph|_GFaEG>ln7B~u9duWZL&`9ypw4?8~#dOk_^jy_-Tvw)63@{c@|hW3j7t1I$XQP +ztDTWa?Lp5=+l>>H{{9!)zj*$-t)bIZuPj)4=p3Vpd(gw|56z+iPKA@hp6v!~-cMi-bdIOwDhj!nOJM`hHGTSK~POUMi9A=i>(t0*l +z_xpZ|E>L{H&wAW5=gPfB4No0d`s$DEk?mXMJ@dh3Q{B$hyz+8at@_vhSK(W?=(*C3 +zS3hT!IBVS9&B-onc4PIomwpHAqWFGPE>qKHxmclf?DKZfop-g4cidUGIM(La@#`NM +zH*+_2Dv8O-%(%}deN^4$@697O3=CCQ`rMe@TYK`x%%%)e4x6SGcC$S*H!NnpZMJ+d +zZ%13;z2HlAjYVhw2owZ9@q3|l)}hcqI4<+!-2;CFTpnoJ3F>q4ZH=5JAmQ9%WM*U| +zeyMU&f~c=+o}qVZoXrn`+y3dFkG^YNuC#@9(JX~W0!$_|%FZd+gc>i)b2fGed2+V8m(7L7=_i^@0Hlk_%G|i9NeWBXD4p6BI&!D6sxC_ +za*samgS{K-%cPQi2)+$vNi}N?&XWCphs(|S@Yk!;en*xn8JzS~5*M^OH_g$Y?{r6+ +z!lun@g)arkL|^?eqw}RsYo4UB_L1MtKekSs62I5vRMff|@}Wvjb;}UTu*4 +zD{3fNE3m-G|Iq^ZzMn@krf}7?9l37P9VYOU-(rrG;U%`hf(vIF7Z>q!9X#>)3*(LJ +zB@1`$d$^-6%!GR)cmMuiuB$C;XDt3XXSz0-7zKNw;3Kw=k2~ft@7D%_A3j5 +zA8YKpb%;^0ggszy$hnN4K7l)Ke>~KhyE4CF>AyBt-XkZtr5z<3+3kdPvi8k)y2t$N +zmzR@p!&yVNP?>N0-#V+fC$QcqPb@nWX%gRJVxGW$ZLQhq*fepQ2%m3E%F|dYw3D=^ +zuJB{&{N|#x;=lNDozpIf`W31Q>}E%sn0bElie@JMcXa6D*D>DTDE3R{O0>)+k!Kx# +zI&O&@-_}~z$^M@CjVE#1!9^lU!hda&^P5_FnmLk0ZNe+lf~3^(iObEA3)$ +zS3D~DW$xv!sOG7*TH*C_99CDqH*?f7<+-$HPpWY{|M!g3$H4c;r7k`AvZwe(rL)L; +z`@U1vJhRi^8E2%22Sy!vGFxU-jr#2zt##2~HqSPBS@7X9XUMUav&`D(-w!y&{ZXs% +z(d<_OOTF&we_wRw{rb5wTCwsImkZzD%+hzc?Q{C^Aln133+5-9vB@piqFmt}e=Q_l +z`15WJM&8GJjc{f)Bz@(W?d +zIsazXEPo*}e|^pC!YT#tt-rM<%}wb3IhAv^{2c4fdxASRYo3yQ%>BZ}qGOrr#oKL5 +zN?ZT^IOsH0zR`Sn=A<|0R#k+XuIjm+AAi1L{QHy3c~e-3cOQpxi@_EVX6f}b2NkArABg`mups>E3&CS +zA#lM|HBP?PS(yv>sQuOqxxCNt*2nroIsJQq2)nuvNJ@L8~iZ|C< +zDA+zzzHq$sU;pw=Z`TT3urz#saNCO&f5o&Pd`Mlhbiq$EuDB92`&B+36&<@a^(W^q +zw7RrABz=bG?Tkrt9lvB8J7wE`iZ|Z!D&sqgq|I_mjd!-sP&sl?tgCv@L#w{)HMWki +zI!nrrE;?jya`KyQK=8{uAsf27j~rIQOfy4ZQoyf;{Nf0ksA +z)+PVLe-geoo<1ksX5)7yMw(wOd*K{k-s|mZ6MosGH3;9HXVNoKmivO+vd8ipRQVel +zA1>OY<~>*Y^O^pm&!lIpva%E7UhJB8|IK}o>)IP`nc1Y&9S_|7XU>)Y#V~nx!^i7Z +z1lG>K@I_XK<%Pr{2k)=hmz?gMJrS`gQ*pLv&4<107TWPCJJ_we^_Dz$-YpSyLil!9 +z+t0w%xu-70)jpiia&k?pcei7fodMJ5%}bT0OPt!1~C6`&utOwc}{!tdymFo=FmrU=vqxG)-Mk{;Yr-DYuA9`!v)z3ShY-)V^ +z&x#^}i;NQ$qb#na@=oSGlRv#@+HY3g&&_HK_L~(AL+%-x+;|rKVs%8u1<#NhoS%Iq +z=S75X&cC->Fz{vXl>1Mg)MY<@U)#Q+kms>d@anx^K5gyXz+T>!TyxFva6#?w +zo@u{LC*BrSG+C7&5Pxgl(nwLZ2(5V2!(UZ1k1jqf!0aM@cZPv9N79X3*XF7l>wMbd +zS5gx-vBT)#pBtsDw<{m)D(Wm?*IvqadDV++lClxn5nF>6>Mr``GUe9;kKaM_;uglV +zEL&c-EBMK`i~3uqs50dzOyqM^N-HS&xasJh7fT-~@~NjvY|FNkn=0kg$g$~-_R8)r +zO?H=U9@O7m$G0M+TW9LoEnU$;aaIynHN{qJ`24Ic(fk9e)5N`=dmhc3Ay^ACMb)db +zAi^R{>3i88&C(e&ZvWz$F1xT_EMwjLC$FOm_FQ#!eVJc);Qy&fOSnu=2dg*VR~1z1 +znBEm5@!MZFt$yoU)Ql2fT +zb2+@b=~MOOPxAA=HEcNf#p{L|!}Y1MGWw^ieSRy}cTKo%eC6jc5r?m#hV~hPzXNC5 +zaZX~XJ#aF?TX*_fZQjq!!pFRRO_zMZoGx}~;#~f?L;IfXTeD5cKvRkD;A-aXAd9QI +zry}J!p2y3a>7VPnQS~jy@n$Zz;4QN)CH4RRRw~bmV($I&om0Q=McHN^uZ1}U7cHWS +z_ZGU%h!?w(au{F-c*Z*$G-QC9#&Aa~D$+t%Zw#&}> +zvU8TvqLAle-cU +zYP{Yz6@1ou&#+_roQ#BdnNzYkr)IBl``UWgRB1nt_XmlVhw_Ve@=YzQo%dU`EbGOe +z_rH#ErX3KRn{RHg|A_j|n<;g?D-VQseJH#p^Qrwc@AdYd{8LZv__Dm~OZST7yE7#I +zbcme(y5_>|zj@0(espWPD>q$ooj*_Ftqr_$+J0<#W+kTjC{NMkZM$F1fjz#n?+5pN +zObvQBXKol>-O!{UYgiZ`1D +z&&vtc?ECcCX@BsOn@n3--z>L^F5J#?b2ifvwQYgc&%(`S#&HTRGFBGalzIN$SJxdM +z?N+_zQ+#m$ob%2H=ax=BAmCr9vh}Q<;_Z!0tEXC(ma!TicXAXL<0+Is-+!^bTxe(T +z%aDfXut$sCw5`Gd)n>@DdHRO^?o0Tpu@VHvh#M!>>)9;HV&NoVWc{Aj1`{t7@ +ze#ck6Fzdf)ynXR`Yu|49Hw?VOXZN;w{;oGu%Q^n1i=B5x@r@}L1kBb{pQ*N9_MtA^ +zHNj|qKx_}sLaE9Z^VhpA+Vt>4uEE;Ryg~|>zC6gS{vhmmhv7kj@y?IXvY`8KOUP384IGp_eD +z;(xM)v|anzH)nR!E9thM2Mz4>&ZizerL(QT)R^tF%6Scj(z~(3}vkubJz^BlbCKFMpcb +z^4nwelH0p=_USjN9yo4v>gVz3V+l3ST`j-dHMD2vx9_+kICc4w4IB3hF!N1vp0PHI +znJZ);>zaMH?)kO5u3>)gVeZCn4Y%rMbZi&OXR0x=zGS>+U6%E;@NF9>vU9)j=Uw^v +zi+-}=Ro~V7CiJL@O;AjjbnwuHr%IJB=__`M3vXReQ-3BYxj{85cx6SW4F*p8>eM@bA>b%>zo(Fy}l2?9Y6jO3e`IXm}@Sb1o +zmCN*>nk%k7H2uTBJ&b+dBV5y^)tfD+*lvgx5@XwtU+SOM5<2r@2B-FjugEiG9-BgIlJaSX*)U-S(JSTkM~o%!!$(f6UTiAixt@RmXa>tbi`(Dcc{; +z-+y+F?Q3<{U0q)`GXIb9dnu-I>FSdHS${sWzkgDB|G!nvg6d})pVs-wZ~gh)$ZNa7 +z5o^{&!@IjpGFvYdmpyp?z~R|c7yICSn@wJBU)+C6anrS{`h1P+4%&a*Gu7~PT>EL> +zGs|njKK@=X_xgqR@*>}J6^q*QnY%UauJ04wdzDQR^F{yREU)^TceuRlAr*1}Ex +z$KskG`LEkgYfZFPsO`IBH%0Di{OUzYkKeh}{`lR0BIe?biWlX7{zfj+>-w`!>6du@ +z{rMSL2mV{>Ts1iPUnus>{rk#RP7~h+EGp*_?LYX#Ccj1X%^CXz`Y&F6ztV;O^Y`qIcbzA9$E#;KZJD@2u3YX)Ci5cy4k_(-)_oZo +z_4{YNuyfrt&1LbDs+;$Y2goa1X{JQRD`x56ef;;^C%ZPgDnV23jQ*Qn3e|0YKb&y> +zP=rNz@n7*%pEZBIku~{vVXNPlLgDYV_F)%Fuf+B%EbFma)F0hxWz78jzV!sV^^2>; +zf4*CNrgoFH@jiP_;gVXJTV3yd-zd+OGJd}CPTar$p$?I44{SBhzhC-4yXA>s;O~YQ +zyY>CQejk@uRNd*PE~OAF?Njn5ZPvjjiP32?GnqrnSbx1x_**LRcYAJ=&TC_1IoF>d +zoRMv3cPz^1PpaWDm^9n+{wd9nqZ&K;lCG($%x?bi{P>l|de4P(mj9|N_gNXA(9p|~ +zRKvqFrCsCh*=ce+O)v7gDF1!yz5n1BHcbinfZi86i%w42cBNeZ*X5K&>lk~^@BVJH +zXnW-5kKa$;W|Eknz`2g~qJ`J)?Mtm3BG0MKI&mrboL?|^}jwh`{yj7xeHG`uRi;_Q+>TQYg>rs +z0{N}q|L!~S{oHlW>+3$p?(X>s|qy?IJD^RABgN5Izcv@ix#(|9`6OV>?DHkxt%CnX|1^*N`NEdn-25wbsh2&?=jmFV(!S0Fqd$9DrFT9KG0Q2A|8V}U^Sx)DOZR`$k)HCter=Mv;`eLy+Cy^RcfW0W@mJ)Oy8o){-mk)UxBPuj_wK^qAM0bEa{4CQe^u$& +zD8}|uBsWjEd+xpEgtxWE{}z1K7!XR)}5p@?O6)z-VvC!e%3ct{j}9y@u`jgkM*sPOhsk*)4aZ_PwXer-Wv%-EmdgF?d4ExHyh4^ZnFZ#DH)ZsU~W7>`A$}^pIYM$Q?^uM%>7vxpj)%}8L +zQLV_&y^6Kq}< +z<*Qt7&Hjg7d&;kE$(MEB={J2}^|Q|Fl}>BVY%|nmX6v>OIj8NC*SLVm`0FwsxoexF +zk4>HO&)u6jyPbh^Pg98A+^_|&tRtSvDy}@V+u&p}Z|)tReSf;Z9HJl7&=963qQZi1JRQo +zFD2K_b6HxovC5}VFr|9NT94``6nAMfY*)=x*ZdqkSLk!}svr6%EGwK^YL0JciF{;e@A)eF_^S(L +zcf@{gl9yakbG|=#`>F1u3Rks$z1wFt@uJ(NM&4=ZNmc(?rUmq|PwqL<;=?1L)-YRD +zEoQnT!;C|sIhStqF1@r|DW!JzqyM}*p8KBv*4LW$`(Co;_m}NIZC7pla=qt%vUyro +z!AeWFUHQt}|7X|4yIwo+?YZZ{=r6mbt^4|MZ9;d)-vxZeksd3|i~jGv=w$qj>&JU; +z-`T%k=apWNcs5tVJLTDR&!F?)9!fsv|2lc*ea3<#ArhX;Fa5U_-CTcO;LLl$UH3Jf +zZZLk=Ice@&mtX#Vn`XQ%$kpLlVeoxjQs${Gs>>%m{3R6n*Hz*}_lvp9H;BB|t=cmE +zO6$=QS)LDinalpfI(O)2udhyFbKHRINKow@cR7wWH{C^J0kbm>{5q}tPsP4msCetM%{6vtx9^k$DE +z^FQfj2k-FrJ>TYDFDd%zFY|B4r|fQDHM8rdU(SD%7By|d*{Uv)z=_;_Q}@mNv0o^& +zfQ3=()LmASm~E+P$}>*hT`hRNUyw_jnK#RGQqYWJ(I<@Kbe(ruO)}YOa`czv*||Rx +ze*E5e>icfZX6q{@_wHS7czww@bj|mht8;GTZ2NL^R>{8jx48!PD>f!wE;|^0L-t7j +z$4lQ=bnE_hn=nc2$F2YD&htOdSh-#Orm?tBa=Da!al{!jd!Lff4Ih|pE7i_B^vd{8 +zWPGSi@thk^=EUDU^yCxw?ZDj|6&N~8Hk~jq;|@@^PZz!BFRfa-X@bS!7L<#cT7bdqDam-Qep>9Su#ryyHt#2gjh +zkjdhRF`6%GMSi|l_dIafNi3V`{GN;-o0~#3!npV5RtN{LQ#n66Vn{-+8jx3eAO1qepuM9xaW)PtLxE>lV|LS +zez{lVwo~3~ZkGmOo7=I`p2Cm)bvzXpoCsHXzTu8sU?|g~2V15}JhzCKbzo}y!V&%N +z^SGGWMyL?Wg$Zm4?49>ZSe|KzrVcf53{pI_+q{~eK +z_4of8=-Zykdf6T^BO!CA(SB$1_$dB@-d$HF%e~yEX0vl`+T;VGlfL{8aM}GMY~M!Z +zilpP8_taj}-;jH$e=hU8zlURl58T-;k<)*8vXTAG$chzeZ?h*!UDafLcHO%;SJRj` +za?*v;Tj58RU9gm8V*B>;(fPItd$|Q&vQkAGYEN)m+3vL4{nKh`54+~yXrTRuw9**$ZS)EZBAx2;W*4%Yek*@x1b4_4aspRFzZc>FfwB#&E9 +zmEG+7@?{&$d>k9jFRfSoStw?4F4J-6X*TbEi2pbs@rTw&&mG8q{+L3 +zBi@|&xr$-)W!|prcFxiVy^|}OCM~Q!cVmgLD%)#C8|Ht@X8&F3WS@GqJbGLH!3Deg +zay}h3uG~=l@|woK>kq^0;*|aDy&vbiJ-fsB=UgY660Dx=tlASNMgWoMNb{z{~bTF0P9A@J#io!L3t+?p9TM +z&i4Axd-2NMthlW<)BZQ@GK?{Ik=crDr&@izT0R`6|w7 +z5_A6b@znpVI;z*wdD9jBOU^&o$@uNLWlqzK^*`)6Uhk}XkoB!2|MY{l3CT4}Q<`}v +i*VSEe{PdrRhe7%N&cc%8&GSJU1w38-T-G@yGywn{B�) + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/GNURadio_logo.png b/board/ant/msd/img/GNURadio_logo.png +new file mode 100644 +index 0000000000000000000000000000000000000000..e9936c07de1721aac40996a0a2c7c6e3bd846ca8 +GIT binary patch +literal 11379 +zcmeAS@N?(olHy`uVBq!ia0y~yV7SS^z+lM1#=yW3zLIAq0|Ns~x}&cn1H;CC?mvmF +z3=9kk$sR$z3=CCj3=9n|3=F>*7#JE}Fff!FFfhDIU|_JC!N4G1FlSew4FdxMTavfC +z3&Vd9T(EcfWCjKX&H|6fVg?329S~;xIs2Ue0|NtliKnkC`y*yf9yN~4_tzO27_@CY +zT^vIyZoS=GJ|{Nx>i_?7zvmRc-*RS2ImbelOvaF14I)$1>KR-eGo6GSy@V7RE~)e? +z*-cQ;u<@9)*%knHQ%Qr5nvuS+qaiZvFMz +zvvZ5j-%NeG_gY-_+O5|GPc2ARx*(t;$s)ri!&@UG!FPp8EQ9G8(|N{z#(L%`feDg^ +z(HljhFUm2^+bL7Utj@HYadG1+UYq@F6;d-eZ5TyTpM|;I?pmwSKE?3HyaQVgEN{FJ +zug%c?C!IH;q3(d$0R@E*-%Xjze?7NnxN#~cdZQ?xs+zUL4$&J|{ji*)?R^3__-8aG8?eq}T6f^>&I4;B +zs+oBmx{`OWMih%5vty~@{Gqo&xIm^)azE>?Plw;#3ClTJ&*b#r^?|&9|9>}fH(a$? +zd_26+$3o!5BOdv+2bg+lg?6w%jGI!=w4G7@sHD#~mVaLo%k#9iJ+fz1EMVTC8_=G- +zf#-wrgNg;q4jG3!#3$%KSgm2sWX}AYp`4+d@qEn<+1p)ffA~9Q`kRRy4{()PEc3Ab +zJYzn?=7yyf%Vap;JpRx2Z>DtP>OWh*H(WcL`eVn(w$~C?IU4KFRq6U%R$07?P0;k% +zk*im)7Rns2I{SV7+p@~*{_~GbuKy*x*uB5+%B|8cc|pxpSw^M5N@MNnzlMfySXRiJ +zD3KOodT8a1)T17TzLzV0eKjw5xx`yQ(DRYS>Q$=B6HOaWGFw%i+T!)Gr!<(-2lm)V7DCOywh%#YL> +zTiU)jc(mg2=X#U0xh4~ywrYLLh=>*KYFqkmi%Q@=wVuhhx9^-Vb#?fplPR0$_4PFz +zJ5rqffAxmjan;37L&Nhgnpp||yRpKgMV#UK&)1t9P9Bi=%v4!Y(tq&h*?nwt+JjZ6 +zKmL}ipTqZTSH__VAAuPvecJ=C{tfy1_&}e<=`@$w`|}JxOzYT_(NmfG>dR{>{rM)H +z*=qjlBHp!d>pQq?TDdje>1)M;{r^ug*uM{ruMgInetG5PW#zZFtzNgINmP59uE8u2kn}e&4WW<~3I5_`;*2YhwN}&dj;G +zbH%(H8|7NqA36OwJZqQKGM~BU{^Wm4D_j@lW^N)U*=c*ZgYUk?tkv54T|>p9pM1S> +zYO}BBm#WwqPt?!f?A5IQd0egk^|S+XCjZ`K5uf_)_3l@%Jl;%HwOXpRxhT`ZRQLv~ +zaC82Ivte`FZ~t4e1Fae7n)O1Z|-Yr$nNyZ^xKOf+@6~iUEaFy<= +zU$=g6pWA<5;`4*b=W{+g#@6be3g6MK?w9cCN@mag2Y(D#Rq38nit2kCHEZ_#u&dMG +z?R?L;ukKQ3>{a#`-&R#6w9fy}lfV=_SMBB2RaI6`y_-C2y{^E-2ro~G-c{r9WxP0jiG +zdAg@Nl2|xh+*ud>p0!vn7l!`VA&t`LhU=c2i`YGc1W_>^i1XpZoIQ>O_K1j_>NU)&CJ$X +z-d*-Gc~uqT24?95gMO<}+knvgE!XUX+#W6ue6oo1@%6hCmT3wfkGBX3-GB5K51WBc +z=y~qL8(wXl9)Ck+Q5T2VR{7wo!avMk#I%2jKDOb0ZKTn$y4=YUYk1tY-zKhCW9r#-W{=)UgVsdA3i6C)a5EU#+)=x(>_ed)IseXFV}W-ZI{oN-Bfr|CDo +zlvs{ETs1uD3^&D>^ZgS`zrax_sA&G^TVegQnT4m-3}*yC&YGmMGiL4I_=MkbVxlWv +zFJ-1(E-HY`oJwqNA| +zkJRG=?USo5;%_`JO#Az}@S=SDk++9W9o}RnC44;ILx3f5mWpslDbv*OnY~99wtj2d +zs;lcR&dsV8TU1zCzdI^2EA(rV0T27L&p&;0oj0sxEfMchT2XS%oOShtvX2{M%UnvX +z=S-Lv_j&Q1`ZrnESXI24PA~~py1K;a{5~Tz@u*UC*v%I{qS77RFBo=kR@|%aFMJr> +z&ZN%R-hA(NaPNyp-D;E0Kjk?5!FyGe;X7}`{F;fG-~JzqI(=qZt=-*UcjHBfjCgKAdeYPD9;wH~O{6>C +ziFDN&3f!H{^@Yc^KeE#8E^n>zQGUBOeR(=%msE9n+U~8HcAG)S@Rrn-SA1oG7rdjn +z<;5mnW%_F2eBAoMx7@m;U5(rS*8X*HQh4e4)N_)6>&1fXw?|9XMd^x7yzTl#{Md}2 +zjsj0YL)UCIy>@Hjs$cf2s@Mz`JZ@g~D=_=5`Rv)V*R5Kg{~~X5&#HNMcl*!3uTr?j +z)%?hRK8=K_;n|CS1kMbsoH5V7(BL<3;ElK^SJc(UDlgTck^r4 +z+IxQr-BdpR>fu#ByXFg)32)&Sh@Seh^Hld)&o5EeM2fpV#cJDcU3S1ftp59o6E~a- +zSC_3iwV!L{A1mPtCEulAUrs$GSZ$E@yF9aNaZatsdy&q&mpN{8-||-o%Gj#Kt@|m> +z&UF3Wdsp&*Hstt~?@s?&m0Ef%<*bA9xl=ogKa|Y$n!#H3@&0tf#WM`HZDw6j?6d2K +zQdCq_$D$Y7t9FH}Z$E2xtS9ru-RI|ZbxrLxGA;dSRP_JEwR0JH-bFMV +z`pC<>H$VKUs`SM@Z$rP{@lpHywo~}n@yliptbgYp|HrTM^j)%h;hztzpSf4=G~@W< +zpnPljA34YD-WL-t>|p(TcKz4%>(yZwzO1d7?s)Uh&BhlS-AbfaF6gZ|?6U6EiQikd +zo}A1oedpt&aQ3}63c(iyWoNAY-Vq$}<7NAar9ayymg+8dPdaa~$lCK}OsK-*OEXNr +z@mEUM)YoO7m1h6)_RuHEB`#(bHpy>xrlv+HKYO@L#p?Bs*yhmtRqJ{$ip`Jm&)%fL +zalx4_^>Z@QMQ7J7`$KNTX+GKHcJJQ)_nUr4Pk!JhE3Q+U^U +zCV!S6+QYS7g83?2>O0Na8*lF!XWFj*wRx-Kr_((fpR+Bp_E3MduYuzV%OdOa9@%JV +zmHv0Pvd?B(O0#tPug%|WxU0i;e&vKkvlMv)ZH%)oWj4OhyOd}saG>K`UytoVHIH}y +z4^24Qz99C!cIw~%z8P=Cvzne5^9IgNOgZ|pl;P^(tSI#m_Lt5RHy)S1*m#L^Jx2)p +zqQ%B)dzXca*x!gb^QQRDw$Bw`mzW*R`pbSdWy^v8kCZ-?Gs`jk(6ZMyRet#f|VMRPyW-Je75NAl$CR*8K>SV`F5*1ze!<7uuI-i$<#@k +z{M|yo-(r~jv~jEKI@1bekNHU(FHF|^cm3e139F9m$URhLAFZKrsBEjQ$^4(q&Z~W_ +zlm%qBZu}~7F)=cE{q1GDzJ7MjikeY6$@s@Qo2O~BCa>71=dsN7SY7C@L>n%b@|Ap( +z&@B7sNZ|30XWq+Yb2TM2ZT+@< +zhrz~4AB>bft=l@6+e$F9=fvc!w=bt~%7xnM_`VH)oRoO1ex~3O_Y-WI8hcl6+3y;) +z_SB;qtu?+zU;l18>N(eSYDIQxlXP={R)&__mhxjup6i~z`Y*GhH2d-H-jEaOLxzl +z+$Xm$!L($P`sA60Rb?DX>mRJ?sD4xv?)t!2hBkgqGE&ppb=x^rGIpF&B{-WeX +zsY{C(FR3hCSe}3R(jA*!Nq?0#ADwZ1SN7+hf0py<*Pdk-eO!MmzM$@TO4!y$L;Gz? +z)ny%A9HM{Awyk=_?OP}Ix7YeBKNHRQkXJe(KwOob +zCCPr{J=+VDB0isXdFtspt%;4Tjoq!E>!_S=p8bA4wr^`VC&l)>xWDPxrnI`ZeWi&u +zZd&KPeM9eU)>_Y`t7LWMKwRBc!J972|9_Yj7WOQQ&CKN}H&0af!u-zAO6}0fu*BBJ +zx6BundtOwPH8{MPSejT=6S}S7_GfjTw>Gn!@?y8|&19VSRX#j1dd=g{7FQolmX%w7 +zXl>T?$9?;ISnplmC}^atwsl&JUU;*0Vk~DqpZrGO$CFyS&0F)NnUxRy?zq$NYVMTZ +zuR_WpOEYE)Ze13MR%dgGM +za;slW*Q{Bi<*}Z}l|NnhqPo^3?`CDDi~V6M_HWH-);#O^V{yE`?6yB0jNYY{3)Lh- +zx2OGorSLQH#zVv_G+>4U$nfEh2W0q&M>khW= +zJG^p6av+z3rrLV9h5qWMXR6=7E#F!`|DI_5oRX8O9S$))*)h-NuTxYioV6^rO?yRB +zlR||_Xsu7|hk~2=RYi95|1VwjZ|m~rABm0)Yc?i-d%gY9=8$RMm_no_lomB>uT|wp|8GE&Jro%zSY1n~6}@wJq1G*_a~?-rGs#vC9f?7t8t3bZDillmgR4 +zEuEaK6_PPitycvx3unt^_831_PM-a(I)Sr*|9!9AH0dd4?Khio?hh4L<7Zt|{e6aq +z)}8$Y)}Nm)OQH5c2cK5G +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 +z*IVs(M^)ZVSYZ~+nj1EwB-yIbwy +zx0LpWb1t+q9{*LX_3ZzOmFpDy9?$8xV;rlU4QwU1WUTBYiq`@~yr(F(3E7 +zFFIIxpE0B3@eid?+2d(`QO2paOpIpgG;+!bOjO_XcR^E!j+0jO9udD@qnZ68+^l-D +zuh>mLF*UrVzb2bcm}PJ1*BCALqarRT@1EIQtbS~KzL}TdWyq)fI}u>Kr;P +zkmKg}#{1i1X-1*p_X{+Q$^}X{~pR6f}n%(;GrEr_! +zqHV3V(qZyKU2?nY?p~S`QE3)`V%=r??MGeHWr7xR%7&&MTscWI&;DCD!%WHb3nwWr +z7LF;rdeujwUQy{!SZMv~RZ~OuW`)j8SZixD`Q#s)`RD&9|6zTu&z$33T%0d>Q``5l +zaL8BTl1zmcmYZ(s?2O6l?TA^w>i5GdkMtI#oJmm{=D5KAV^K +zZKk`{6`2D0(y=IQ91x0CF8cm3nE3pdt( +zIWH2nMdcxHe{JFJql=}(ULU#>-V<8(M)X*C+amT*ty`;XtSeHAjeT{M;7y${Z^ +zZ_)dreS6_Q;r7ty&rFV9%>5M`w%>X^f4;fvonI2_NrQ=V{(A!qxgakJBn_rQ`KM#!i+}%)9H`3Orls9=%_d1aEb!`vha4M@ +zSsYTT@9e2n6tUgm{C8{Q5*NNw!^`(=K +zJvQ4v*Ri0-l;QibnQ=LZY}$#pO0Ng%hzSe+j8E_@pT~JvAoU04y|}7s +z%__O|tLA@AOo~-iiBwZ6e^Rt_%c`nkm2X-7>#iMJr7+d;>sjBGrylS6SG-j+`TRP* +zOYK>QpM0F9P-!B)#Qvm2^|Y5(cRU%ViLa`t3*8^N@sz*z+XXC54kg!5+{jPqvDG*F +zw%V;kW$uav8&A!Bzvk`NLz|qw>-^q4`}NECsnMZZo>{HF6tVE1k4BZlu^XO|$?H!` +zRHvo?^;+{YG+4-Xk5T;Du6VqEl`Q}WDLz2J*-O(`n%J$t{&;Es~zovG)9UvOWz5#+7M``#}!?!}XN7u+jT +z%%1gJ@7OJMbNzd--DaHi6IT3mK7ZSPPDF9Iw~+7Mealp9i$cE#1-ul2=mZzEvu0QG(l|A`bQkS)^YqQ3*4bpk3 +zFAbOZ?eB}xTmDBaA#Uw*JBH~6nW3(_be_}P7c4f +zzhHN7)`<(&vn3{IE;-E|YW_UfSTA(uSvKFvuV3jOyY^>~DX0J1{zu#6GvA!QVZVpb +zLQVU6{q#qDYfHXP`r5iBe5TZkHp2wx8Ahd2pYPA^UiD9zqiJ%Fp?dd;!~6Dm9SKWV +z+p$MW>AvwX8TrEdK6#ef@Pqo}0GE(@53VItlC7 +z%K5~`zRS;^{NcwUQ}f8F-?ub%JA3Q*1V&C-b>|$pm96>j>rP*CDlIYDsImstN--Ha_>}F=vt3SE}~9?l^ox9Ef;d^>DZHVRY}R)^-0v7d+S`v8N<3yu+4mS +z>tyf@i+@fH_A6hN7p&ZInls-hVR*MHy3 +z&#c&C*R#F1=UvVPL8V&^3$%L0D(yFZDk~N`E4}UTtULPiZa1%b_< +z6+7mbEz39?zsW44ymESV7=wTDvkt}g`|e))@K>2#Z`V>Qk1{S7_fCU|3q7m0M5NRu +zrGgBTzn1R%@1D8cp_%nHtj`~6t#&=`^7&5+<8z;XCI+h~<)4-|XM6Zaz`O6h>y9tX +z?{jJ;e~0B9{bk^=lX;!}+z9T||LnP@?_bXA4$?sXpH2_D7zNZ@V)u&s3^kTOxB~TI}MU +zb5pjibveCg$BF7wr}UU+sR^{aKBl%XH$F;gb`(h>Y0BE1l>O)LQp?$2pGMpY>R!HYo>a_?gqQz6na_J>)wBIqw&bmCA(02# +z4kRCt|DY{#j=xm9K;Xj;|L0-n^DaKz@qOCV^chv6)4%n~t>_9pP+p*4*WY-*`A+BQ +zh(F?USU<}oSQUur>Be$@m}7b;RIIINfquHEpT(Uv?$5UlPXFDs;t$IX5%JoKuYUhl +z)0-Q+SiVL6(!JUZ`g-{%jUHHCFnz$%!es1jQ?_Bbdxy289rJRh_*b`gvWQ={)kwFBA8iD0?ySiVvoDs-MRl&lO$vAWr9#xnsbW9Q%LSh3}nq9K2pS +zVSTn(fpxCWPV;l^yQIFe&6F+-yBBCtenBK*ntx@9-MiYyl@G!>`WMW3nfck|UGDnb +zzYBM|ROb8NKPmRzX7AQ4-K&|#`oZ?r?9b+GtaElJM8_XHFBlk7{xNse@uicy +z8|K!e&u4v>di%MObjxIo@4Grx#7ac;GS5dnNb!F%x8eF9mYKbqSAF|_ernUK(}s8a +zCrR0_c-l76%71?QABFh$|K0ZKZvT1k7l)sQDP#WwiLgfInxEyr%ciO*)?KP+Dz{m& +zefi%E`$Rp4Zy!qcw+O4ee<<-RH~ze=h1$GM1M$@I2f=khZ@RhdZk)c}`#(4RLHDXp +zdn}Y6_0=iu?MePoT^q|?`1@n)$`-Q=rEOCf_sz9uJocF7eooAk3mSJ`_C(&x-zMyL +z;w<~I#Wt@`$MtgO{aB&@`0~E_=?&9VDxTc_#-JzkQg@EPZASG7dtQ@{3k)@P<5#n* +zJy4p#cPR3(JbTlDC7D^x;x)FtJ9KPU+y4Fj@$buCZ^0k#GL!51)B~nCZRsDj#qkrSFh~%++%&ew;eUi65g;W +zM~Hn##^n4TekIWKQMO`N~u{{h1~+gzUNJ^9&;+nb&>9JRCmGkeG9y2XX7 +zpHKhO67lNy2gx~Rp9=-=`e`mrc<6EG+5^rBu5~q3zEL +z?A`g;+R|EhHoeRZnE%Ai}P|45d5l*lQh +z3fmn>J@t$4!xI19GLM&>HJ-W_aS} +zf9CwdD_h_GeZujlA+|C3!_Vzx3UWIA9MFfs4U?zT +ze`T5d_Wf<%<#|(QEL@`W{uO6%)qlTx{J$9Y&G}vsv~f$I|DVt8jPmSqjI~Tl#J0cu +zFMN)H!SC*kyVnhmY~RbbylxNw8jIL7-o2|-Ll+*sUp-^_@5TT2+2q~7!!3SqTgNur +z!+SP9-nVw%yot+ibMN4-eYAdW+wIraei+8R$^0y%XZBS$VZ$PQ&P(V0@7;emW8ag= +zyNACob)54nT*$|?!S##a{>^WkZ+De#p0EE`caKsodlUPEklQ!^{jQM_PA{0%bM)=x +z@M&-NGtb$e*_$lJrq`ZCOO@riP +zYo|OvASf8JwWeMv@4}s*UxF^Xtnub`d>}NFLn2w@DU0CoHC@Yg=a?q)hqwWH5WUmr(R?hQt4d9VaDNobk-)h$m>pl^S}AE=|(N_X6Jvl +zrudxZ_C-_U)~)#AwyOH!BGxsWPN#~0_Q+aKlQd47@-J6=&l$sc%QPJYI2J4tE6qH7 +zDkM}iMAR_Xc3RMi_Ke+iQzUX?KPs&XbLCkv%S>vzMtg%+(w~S`)0hgcZ4JE6`gHy4 +z=MnzzXBwyfioSK8^?!io(-^K5QQe(J8MCJ3Tv!=V$|-ldN&U_auh~+GJ&JwFOy%*v +z4KsH8H!WD +zRdP{kVo554k%6IwuAz~xkzt6Tg_Vhkm5I5ofvJ^&LD|dpX($?U^HVa@Dj^ySjCBnx +zLk!KWj4iATEFc<6vae2OU|^60*$|wcR#Ki=l*&+EUaps!mtCBkSdglhUz9%kosAR& +P0|SGntDnm{r-UW|u;(+H + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/PlutoSDR.png b/board/ant/msd/img/PlutoSDR.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b3026eeff2fec90e747619a36e5a8c547824aad1 +GIT binary patch +literal 105306 +zcmeAS@N?(olHy`uVBq!ia0y~yV0g&Dz!=5B#=yYv;-pmt0|Ns~x}&cn1H;CC?mvmF +z3=9kk$sR$z3=CCj3=9n|3=F>*7#JE}Fff!FFfhDIU|_JC!N4G1FlSew4FdxMTavfC +z3&Vd9T(EcfWCjKX&H|6fVg?3oVGw3ym^DX&fq{X&#M9T6{Q;*iw;7M*Wy!e=3=IsP +zE{-7;w`%@|Pgn7rrq)p#?sE0a95(ft6D223oFo4F)v7Ej+uOF*#@08)|7ic=WZ<_* +zFWhi|k!`oJ?dIxPXM85VTBYZ=$>S5xEJvF;GiR>qh_UIoqaA)_&x6p3@AC4NX=xRm +zEVumo%KqPci8BwTI50?@_@DaXy$=I}0P_<4Y58*wOtE)$(a6`8KbN1jQ)PKk?Wz6C +zTO^pAWDMIl(%6dY-0PHI)*j?LB3pIq;JG(8&;FWq*vM4sY%ANiyPj|JT1zH&p4X~D +zT?OYJew=&0u;jVjwr$%d1RXKp@tAYKgTYXuM}Rr0r$a_Cv*mVif%UpIq6!8QECx@X +zvp0OItaMLen^DUC*>8efSKXSQd-HTQSN5JduX5ev=X;g;=hp{Y@;v%esm5eHA!rh> +z{`KU&=7Du=mXm87nP!~!46L-e*1uV1TcwsWTTx=Io8J56E2hCa%j@JD=QMxki@ko> +zvi*;Gr9)*z_h80O~`FxmN{y7H>?EDfh-emZ8mVx9QPoGCGj +zf4clL-my@8#@$y>9^MeND7F14hnMDK0D))Anh2L)%tZV-+`z+e}#?8C#_VW{Yln?DVW}qXO+)&Jy +z9HHD|>hywvDX6PMF=bm(@R{VxUWhEvN`;U`1O=1)#HowFn|y=Hf^P9US~SG-YR=H@aY{TzRwe%zBo^+zK~4&V2NV +zWNMz9CtV`E(B-xrW22JvJ+%p+3-k`|+!K{_^=OsClxHt8*`xo;rQJ2NvOk<-cKq8r +zy|ifSf^&%x+@GJmpCfcaI7n)9+JlxELP-)6oI+er^LfY^GcW5n!ue2z!8Wn3Zdp|G +zla(>5wR$b9nwnpKKFlRuUG?n6xthHPcvpLVWpMd!GAV3JlB&x2mX?rO&Egw`lO@79 +z9yds^w^%6jGBdbw2+AbFOl3e +z>-l-9n`nIETuFGK8($ +z5OD9*`mlnPi>?}P+7LT`@``ua$^{XDO;WKTz6{w>3oh6dyNZV%W}Yjz=!C%L$1GY* +z?Vs;+|b#7`t-feiC%nKyOeF+$*;4-r(A4pSaG9P +zRPWU9Wh@~NH=J&7-R$Bt^())IX~o+`s=g^lz4ZTj;%o7-3A$(8&aJ#qdM@;A{=4fL +zImta+#U|Zct<*5%^{=(PS#pQ0Z2Lme^v&W77{*5u3)mWWnZ@AW@vwxDo_tc8$(b;68=k6F|1 +zidD^*EXdy2d$fj|CFSh&P1hcY94tJNRoQWQa(aSG#rw_58mtCNL0knaOCIguII7p9 +zsko$N29wjNSrcNOP5AmzDq4Ko!(T=IOzml#{Twl#MRkO!nRz+^q-FtT;BlCmB7bTW;e|{Kji*av +z8@3icwP8p(-s6#a(^mU4Yu6^F{9Avdee>E*-hT7A*p8!&rEie|r;A(*pWZiz8O%1$ +z@6%_L7N6N=Db~%Jwpr35^@T*RmXCzsW2x6q75)174fwRb)bhWxVNhsgc*b!*{a8n$ +ziwtv+PT4}`y=h*Ynn(ZG@I}b#Pdrvz@;R=R&HTLPt&@^&Ck!rZ{kM@*aDm05H~%^g +zA2Vv7xXk65%$lW#W=vRqD^_dqN{`IO2Qi^ut$A%5EG4tMdYv}!Pd7ht>}Otq_{w7i +zQy#9iN;*)$D!o;H#$CA +z%--dpJJNi;&#j!cdbszFnJV$|Mev<_a~IgsmyvC95YN +z(R`)2d0UaF@(k8}>A%l2uB-Cw)iC%z{r47^bHQ9@hdO!=Jo4JPt5_SW2UG%dSdc@vV*yl4WMn +zm*1HlK4{q>tay+)vrq3`Lq*#RA&H)KuMOtwUifOc#h_35z|FekXKNTO8!j^x97!@{ +zzv#m`KiEO0?afyiH=fg~k1UjqHW;|INC+P6ICE2vWp()$m*5F)f~y~ko{P0(f6mD% +zn$@korO{7m0#EX)HKreej|xS<&}@IowLeVyLSU*>npu;-&6Z=e@hfr<&t9=1;9i(% +zVd|zOa`#t?rKhDvou1;>E*+BH(jCbyD7r%5ERi=a^6otjjas%<;&&46RDIUu4c}s< +zc!(|dN;Zeml9RR}0%9S7t#khFjGd$*v)XZWV~}D&y6WA?dAds#wan-2JMJ;F>@m;A +z1zur6RYKjIs~?L7`FyD5pYD9aYs$$C +z)mGOxB1zAUS51ktt+>`1nmE7c37blmV&v%#mZo6#nOonp%=Ky6Z}o9a?99EFu1x5> +z@mKPX#KDEHjy65adL79W{JgbOxT{$0aK)AVhwaL*R;{W$efWxX(cSFD3$=ENJDynU +z5xC95+ug(@=WL&^^8#0%qH~@TUz^AT3hsT%?q(i)^L>&_?1G7tk`7xeX1zN32oq=P +zGn=GS+vbDg1A&Zg^JF^*~cb?1=FR0G~6LGPw!FBUx}(81MuqvzVXP3J0<1eXNgXE6W1 +z*(pMCSE5t+f{mY#2Ctg0xb#A%#bG5K&ytl*N39xNf+L=3)RzQ53DaM6Yj5g#UR}-V +zvq|hGJdx{+Of_a_M`T7gM;dk|AM=o{ojq0W*Mi(LD!~huFiT_{eahy1d)2RH)U)mCpu((zn8%^*<;b6Em=Ip+K&}Z)C)=< +zJD~e@S=2G1+b7n|oS+eTI_Get@_fPRjm1kIc20ZPQ$8hO&qB2T|MWd+trD+{ql)q# +zHwMRs&GcFqd_OL8Z=w8LQNBxCJNDW?OnCi3>xmH$qr19x$<5%%Tp4cNr->eg$Bshs-jzIqbi2FlXCb#grZiVTaC##$TD| +zJdnLm+4SCON8bY*hbcw#(x2qqUmM18`tq5Q)uD;|7!`XY+6519IQKF~v0e3;!L#$L +z%1spu%eH&>EwRvbnDe;%vBk#CSyl6e@{4!a+>~LSz%#L1%y`wg3;tK_bRUbJb@`S* +z&BA<2Tw%tEmnVyNc-g6G&alvw$v>;nc-@Knrz(4RfMaUi!tCyOC)S)7%I8+>y*DH4 +zNL%2=mU9xOzP{_OZQwM&|K{#Ofu)tU@7s-(ub2D(U0WKj8{&3&g7p04V+L$8GV>lB +ze0(@bn5(h#h$(ydHMJGnHKral6liZL6y0DaWuW8UVyM*Db5D1})~n0~9;*dkmbC7? +z?{u6ee9yXj)&b82Y(8bPR203iTJXMjRfNm7?*{}8Q-165X7`*HJ$6~R<*8KS-a|X$ +z#AoX}pDUCpHuLF_IL4^xW+0q&=HA7K838#5MU;b9u~l%)e3?4glQ)I)jMqH1aQ=lt +zL5U*TiEAIt5r|WZTerb`<~1R~>}RcQ0%kAQE}YHv-K8Z;Y3mU;$(s_ow{P{fG4IF< +z{y1s#J5TQPRLyHwRyG}a6}dDpwP#wox!~-5?Y-M2GPbNVa&Mdz8nDTcr>N{I_wG#T +zE=_~Nb0_A__?4W2g?rs1(s(V_U6W`#lcDLFx=*6`QrR~B&2Oh~O(?s5Jmk%0CQsG5 +zye%@vI#ym}o7Sl{Q`lm6#hEhhZ|zyluMVy$SS43}>GkSn_s)B}&bh9ZD&|-rsT}fN +z|N7ENDLsdBuJJ5vJK3ACfb)}3)6&e0!;;Oq^_F`XdfqSy~cX6C<96Y!MJRp7Xy|py-DpYmee_QR6Qu +zF2eFpm>j>#ODImQ=-0o>KkNA^uU|^O3ny(8>S~=X_P<+vq8j^3NoU=6*%7nX>Na+6 +zcI#Ljvxd=Y*2NIchBs%|%FI93wf0r%+PPX*hc2z|%KOT(-DiSvYRt!LyCx;??%d+C +z-uz`k){|?s>*dyMp0VUs`l6?I($1s?U!L{%l%!{6F6LKcjd9&Fa2=tuw}o5u*}o> +ztZf!TYD*@W&X+fkekpe^wLh{;uu%3uArwL +zDY%pQ*pkXco|Cq9YumkCR#2DUDZZ+z@aG31b=wbTyEtsOeVVkIebvd^ZH-^|ZuRRs +zZEMPKK2$m^(|c)Jz%@pLr!(UAO*(67;-b@Y>S|p{@3c9)d|sz&y;*h7+w6?x)vczv +z{h^m%p37*6^O}CA=CAQoxM?ge=)@3s=-MLZ<125Jao+Tk+N3+3OIYdYnW~lTPDLM{Jgi}V +zWwU4Y!E)o0*!9v^isL$-h@?4{omlF1LCL*Sdgmm^gJ&KHm~1<4n7wa?Tx2_*>;Ea6| +z&nmVpF7_JJvsWd792s0`v89Kz3gYY*D@siJGwD=<5U-c?n!x$zt=!*!HWgcD{NDU} +ze$bY)lKBQTk^3#)tXekZLdT1D9h%z48A<;)AKMk|nA*~E^v*(VbwL}UM>8fkIdP?0 +z$F7SipE6hN(Fz6zf6KK!4;}=cY}O;Q3eSeEWt;ntF&7?L#2IrK*6q7}!;_I(-EdDR~v31ia$rUBR1&N@kTtL%w#%M*4i1w0ac{S&WgC&+BnyQRN$0(b85Lp_>@6FYx;nz9&A&+7P8obxa< +z&B3ihHC)6YCFNO)+ca<2?BH`v?VoQhd;6PfVd!PiXOnJu*w!ykx*}99Cl#xkBKQy@^2%Tf7>t#T@?8 +z`a!0^-Cw!xZp-&G|F$zFyjpvf$@yBsTHZg6z}sY#g; +zdVh)8`UNt}UP%PmOEP?82xMQxqQLao?tS0)7c$>>o^AR5YT=?ux2G5Xv8uS=JV)EF +zCnvh{{lnck-=8vFTGRMs!%m6$hZK}TRrvajcyP3ODpyDd`1u>^`3tr)KDJO;#t`^8 +zS;E_XR)a+G0bA)T^hgH5#y6GvrW69FOQ`HlUjK6KZ +z!|u9TqlfqCy%}m;Z&!)$Y`PZo(od*N;I^wtx^KDD#k^?}xpm7v`ucIq6R}bA)Y1!i +zFk{QvCe=J|7wHLWrd>DjTgDa1{dt2;e@4Tq$Sv!Am?dwYkx<{Bm28+c|LiS`nbzCw +zBYan!KK{kKs8C&Jy%XQp%BzLf-fYV{{;SY4)J4xNV`Jdn>B>JI&2jlCR{j3M*UhXP +zGdbTTb}d=md8*~y&zMiAG_&mws`@R~n>iy$Yo^Y|7FMA>H#&p@yEqRE957VsRX$WS +zv-#cORV=#Oh^rt`R**n=HJ>u8Nl+7l)zi#f=EUNUs +z8FO4R>F2%0^S|$sPhxFY9eerLB-MgDUYDw3RM(j)PRQY2mQ}pq)SoDc*mnsz_O`E* +z7JKw;efB9lW9=8ut9q-ZJ)WYVt1P+CCfL}Lxk1Y(C+PZ>d&ZSkPW&dKTF2No9&|qX +z(lz~m7~%| +zoa3tJ3?_MB-F@Vn6VHPq9YWHlPY3jBe~a%p%8-_lrgL9)KZB~B)Dz>U`JUUlBN;{lV_EB*n7=Cm9p;>6c`j?ypl2=Rvij=m>!Ne|H;#+`OMvyQ}yebZIKU@8fR)9^fYxyQec=mbLM8VmMANQ_Zv2E@7?!)!K}58 +zhH6_B-n~BMJV98+TQKW?s$0g+z#D6;ES9sZic1kr+3?RUJt36MX4(;!8{1M8`xYJ( +zG~#9D*zEhw;m_eaae*_>hBY*(T{q1*nD$@5W|eG|Z3vf=xx}K_)v>HI|KGYUC6Ui_ +z@*C$FW8Z}J>sIU(l-!g5E#fpoqe}0^Nfzp|yJTAYk4i^z>^4v=ZkxDht7FK5w3WNH +zBP^D-i0ow9_Swne*q>@IhpweXi`1%{Cnonf=j~DP(>&=srMFA7dRfrIy!X3fc>8%2 +zEk$047B4cFd7e;xg6Ey0k3=`a$?sk(T=)EpirKU5XFwHy$=>7d{)PFi-Yhgt+i{i5 +z7F~6pj3(Zv9`{yMSxH~?e)eIK?aj73vliID^4&6F*776#TYaTJ8Lj;nrM5ORHYdmM +zl4=-VN}->r)VVb`4-^F@sqcQno0cWqWwv3_yXex*GjcWl=iZ9hu(R)OlB2%Cb)|Jp +z7vHVDea3Yw)6OXATsHq@FSCNh9`w2JJfAY7exGsI=`&_YKlJqM-(^;dtc0Rw +zSX?|LU2q|zFgb0@%F?TBAz^tUiKo3pt+b4Nsu)48*mS5}|! +zluZ?VmXhC_^L~#_s6FUuHBq_BQrER@4AKN?BaDf9d=-epHeNicIKpGJJndi>P$O* +z8`R=W`g6{@bmWH_C4V`$OdufqW`)n>s`KYJJv7;freYDp3B{u! +zM&V7{c+TvcC+BjL+p^Dc`()>)a=sV8|Hwv~E*I!Nyv!hhr{gu_>!(7AXE<+dREh2O +zm9TskW&i%cjps9zRrvj7EFLvX)R8RQQt-8hjWz60> +z!S1!LWja%QpJ?_yk+Rs{c}q$8=(S5f6pt+J_hJ$Fy}@WoY1@sUna?zMjk%7RI99ED +znLN#5R#;rxUbCJXH$2-e>I8ZzZrB;_Jpww&0Xx+!y +z>3iMy$~>c(JsUJr*F;LLS#rbk$HF68E0=h9x|=VPvG#7|DRQmNt(0Ktn$~MwUMC*D +zKE6f&{Is+3uTP23F +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 +zPd;*ZF=M<HmAzvP`Vyu5ABY-S)LR +zkAFL~u(;>vn#0%jI6vp?-g$VB`j>kP-|w=KJmomsaiU!N6V9~8jdA@Ey6#J6bS7*w +zJ)Bg{|M!~Nv*_EB5>`x>?N_r{{aTJDac{0O3*7c-XKr$17_UH%?!pU)mc?HF<)~(+ +zoWpLO&JoR^*_?df(-VQymy_3A_qM6~A~C=2i{Q6)``Z>bFaPmkyZplsFO}cCvDop> +z^35B8M@Icd{zn&X-??Cu$f7;vlNN40*q|Y>v370Jgjatuel+$zt`MGUCcdfXPRsYD +zsoauBuYFm(cF8@XxSNs6rn>~3{wjD+R^gmyoOHr>s>QPjjN;XO6LwDs%#?pPVdjL> +z4PtzXr{{z`YF7QL6K)-_k$-2_p@`Riisl$K27heedZP1liOZ7tXa71G8?T?a@mb4d +zfe$5;1jRt5Jeavs!bNbN +zn}EdL=;UjRbNz43QqB3wX&o(Fwq5+jy;mFdvcAc;&N(l;?V0U1uEpo7;w7#sE^>Bh +zpRnuAN?G9~2?IH~2QMc#znQA%q1bZgkm2@n9)_aHX{n6G2QKycuFQ5Sn5uMv;SH}_ +zj>ICSxRaZwesI0*V*m7x%aeUJ_s(B9zm3r#O#QfpZDiW}FIErE9glx-^6+ts{ndi^ +zI5WPvvEA^QrIj#8`|lQs;Eh4^3{5>>yVfMUV%k_ReMi>vmvvVJ{JK4tKh!w-yo)bE +zNU&%7)LZe(+kDjxtu?QlwY8ait33H*j#Y}rjHJva7Y25=uFtHUrgk%q#hiQ6vGr?m +z($zwTmaN+XOVu-smU<>VnO0}OD(B5VW6r5*kE0JYFsrXgI^x+;Q6co<@)b72M_NUMrjP{>|d~?-$H}pOF6EMr?QWhrc|XjL$cl&xq-p-FLLO+RCU#W72zz +z2Frz?EkiZ8yYamE+fd1WCS7iC_lt^KQ?{N6d)bN}|hraCoc{3(Jq9S=p!^z00s#fb{AFcU#llSn9 +z#3{}j?KfRFoT}!zbB)H6N?y-n{^=)`H#&HoNbHt5%;5F9E9dq`!*7x18uu6P*pU47 +zNLKTFm7XYTado{j$2ljqa7rp0U(*Kv#ENp!K#+?vz}tz +z76ze*4CfzT%wp%~SAJIQaDSoaE4C#OJ5=~oP6s_(B7Od+$?p4X&mu2B_%fBZd39EF +zfSKkoMeErPe48Wt-|meq`Rv-+_{{v*J@JEA6U)=B->W+28gE^9?og}Is$DlacRpfi +zOEt4Kzx8#ErmInp-&WtnRz@p#dR_dLe)y@H!NPMhZppYxuk|ou^uOcgHn%L{n1I{S +zZ5wYiZrrkF!jfFh_>lC_!f8)l&T=>-TqKyRwri5RC#&`Id&ZT*DL=fnaeKd5%oChg +zsWIUg&(_;g8qOCM{S{)IDDnD;g%r~}xxOD~CkyiTaVl4zc*A`E>y4YY58vDQc}D)* +zMYD4c|CFn>XPZ{*&+nv7LJNQ*@-RskL +zY?(BscsS-nHkzjZ#gcrf{RL-~OYZ;s83>N15N7!;1bc%GkV(^>JYTT-vi +zFsXdvhTR=AN?R)5Z`@pPW1i(1>-I?gFMSVf#eYvJ?NJtexYi|ZNuAI$)|tgyzbGn- +zEw;SD^>L2sR=H0i>+WzVO|R=+t!z{MOGHy}7t`_fuN{fDJ|?FnKV0f))nvA~dA@1V +zlG)XJ?_E(%lVH8pndZbLsuQA^>d?r=v1#>OkM6XC*TkOQN(wZ7cJ(<=!^NHF8kLh} +znyoU9bc;J(xxVO0-L*E=rR@CT?mibA=9KU`zZIOBKRrpyL1@(_;l&~TE>jOg_D*Z_ +zNu9C$%5T*tcl;9%O_Xd;KC<_*;QmS(F6L)35n6sTK8x!;IJNcljaxUFe_9IJIQ)FS +zQ(RNQ(7~%`hEu2TF&VQ9j|&Uxu3Ua;HQ)S3VA{S%S>mfTzZa=4l*>KNcu~OQbSG=U +zg1p9a>QjFN?XQ^9@HF_Cd%xQf6Q()2A^gX#^%xWj8q06ko$w~d_}S);wULL;H5rM- +zG2G_vUpw>o9%Y?fNz1*CGcsIqyMJlZS+mSl?j_gCmR%~8DXiM$#G$$~`C8((t-SYj +zFZ`4YVmcuxcAMK^lkWYQ8@jh_R9Gr(rV`U})vM_fUy$C=z6 +zG`udB%ULy{u7gh^`QG=*ELC$3NF2;$Q9Kmbw7kJp+~76ywyHxrb&oBr?dSe2ce^;D +z-0{XN=FNOFO6|;dypp)bd~fHYkD_XV-zF?+y_FjukWm5ej>n>y(`WysGvjh;7`7F +zuMc#7I=?Q~FD(khD}sGE-O}=gGpR#VzLyWt5)X?U?I&!AYm;XNRV&$>PhehYf>2Bm}NKde3Im>_T--ag} +zwi>%zt&B9VTIji@ts;Kyvl{`?i?}!~r$;zB#0dZP<)0gq8MOM|YVpa^YRVnY#M$Pg +z-QITewv_&(6t6W)iq!7UXE8P5KRDx9a^t03-IfK7-wGoRH*QfhQ1F?)>T=6xwdE6X +z9eS@%xh5L2DN823KWy!hbl+>!e9!YqZFCLnF7IZJZYycKw9hV}k9pmUk12CMoIEJS +z-=};mVrI*n!#Q?`k9t4fxOsQ;<*Qt$zZ!^Y8aF#T}iO6kzs{@yLV%86m!FGqs#JPON*~aYx;3QE|_?-WfYv +z-byCkd!DG)ExBQL!ji_1Zys3MNT){#6i7ZVFnZVEXUpf$d3^Pra{`T%AG4GdmweWp +z@P1SJP6HP2-7U+^0!vOU@wnB(qEqj+XwQXdsf*{F%Q$TAy1?v@-uGhOFHjPbxpw)ZQlF)_OC>fdAN&0#Xj%!2HQ(w*=Q-Y*9-LG@>#&fO +z*}4pei^~k3YIiGf{P=9B_D09*wn>wZmq0r%=Lr6?|3!GunS&nF`C$QW&{7m +zxku){=TL~3F(IBc$#`+wq{nV|nJ(S1T-su&wnkZGrNtAmX_{&8Hzd1p$sN#> +z*#5xz$l`v9`TTspcQbx}A9t*|T0gn^T!hWOro-v&Ki(Wj{@3ZgegCni+;ZKO?Q3T` +z-xu6-n&ZIFHI*`{A +z<|VNmGj62KJN_kV(>A^D1*hJnD$X%@rcijj^p@t?d!Cykf|f}&ePt-}j81;5vs5)e +zb%);8`b|0)D=w8ev28iAVzc4VIX$wUzo#c3S?;d9&w?+aHH%%~sonq2KY2FqJ6^Q& +zh{d{sT|5#_Oq)+fG0M)6aggP(%g#>8&v>`_@z?q9e>HJ*aX0VzIn(54!vmj>B|-fW +zj^?Io0_wulSes8Vga*h?d^_hf%S)RbXI3_3qGv9dKO}n~B +z&v??-D2;5E``@$7Gb@M+{8rBPChz-=+iGv}g~eo(({Cr%s~>*!cCB1=w5^!&p=)On +zuL=G-mma;fXLYkuuhWc0l`feDzAM+9d~vljNOqQ*UZ&~1jgP;$uzL9|FrJy6U*jw5 +zx}rGFN|Dc9uGZc?Mx{kyW1OB~@Hf6|KWj=Sp4qfujI5IztoWe&v0!ZkKT=}~)M--Q|Ez{xe9@tcT+=oF&y7)R*;Bvull@BXIcv=~8YF(ZdF9%l +zx%~nyiTr0dA9o38T-BT8!|*(W+j>F9t(x5TS`z~{PF%VoWUiv>t`M9&6{~%f}^5f#)l6c3A3lf8t>tL +z@wa22_l)y3p0X)#^dxo{A3EpPe^JIGw$ClY<2BnQ`k +z`zKv%FmTLv|1h`x{q8qb{K`%$EjJX4;(K2@y@_Gkx%ElQ7fXqyYnA#>Jl)^QsIXzG +z)?=yJf=3I3dMndaid|Jbvrl;y)o`6!U=$F%#C2a=&q~dCUb0C+Z|pv1iMzKfTe0(2 +z$MtId=esUFi+|Dhko(Klss=B%sm~5KJ&fJzyVu<>b&9aYOr|F?F(t0Qrx;J`d$(w- +zq{95f{l{cY^^Qs?Z;&c>+F!vTDaj>lD8pJ}w<0;?TJXuwu4!jj6Z6?`+%CIu^VNpU +zPdAzt-K&ZC0S;rZgAc|rFF9p +zwWOZtes7~8BxI>07Aak6< +zN@Zay>Rgnu@6J5~BZFmY82ytEJpS6D-{)4d^GsP+9($^PbX)$q7S2;F%dd#8ef3(c +z!??rfa!1%{`{}&XH7%M{6*WDQ_vCcZ?3xSm +zPm2}BIObg_WxUsK`E#GTPMYkt^aJObHg5K~abGp&#_Ph&{fB?<<=cH*?l-8fYxB%l +z>!0c2P`AZf;J6UD_JXu5jm{>j;*5>HPkr=J$fU2V3w(JhJJH16mh(HlOs>1I-)HR5Z8 +zJAz-zzFsnW?v;{Bm$&F_Ony4w*hwurRj}#ilMhFKYfFXxVbfdIR+gH*=ey;az!@`S +zGS4e+JiYhyip5v8BM(F@HRf45v+#`NJ_awT#Cd$z$`70qE2x{kVLNY*enWTlfzQ*0 +z@?v~%-1ghC<849V`sVef=hJW3oLVjHq3tAFmMOaVRAi}P+UX-Zz3R_df2r+%`&PDP +zhW3T<*Nn+MFMjjYzIxbwZDOw|yW>`F(ex0tlojlzVUq*Ym0Zt#W;!ZeHA`q-k6^sa +zx{n_!4$OG+p=2WdS@-lTPutD8YjIb$=;uc&KzZ_}rDE +zbvL#io%~uRJ73ASza@QQOhnLUVn+nVS03A!OB8! +zEzZ5g5ogjpGR+TP`luPUTGZ(aN2{du`_GC;-c+1?tGD3N{?;Qm-!;#i!aeO(g;{UK +z=l!W(6=rOAY~vn3JSo+DYx+r>6)o8iR>tykT_!%J)2Fp6mrJv8$xgdTJlSwr`Rx7<=#(Z*>Rs&iIGyG7INOpV>~ +zd;jd(Bn)h7o32*Po&9u~+}>?2|YXA9`VUZ)p55$(t{R7wKYM90(mNS +zNPT#b(pxIY7j<@*mZ!<*MKFi* +z&N+m&PM9lre4SLP)16Mn5?}5T5nrW+Tr>Vou3g34pncFhDm-|HNBQEFL5B9hnW>s) +z;kH$l>Om{QC7pTdGczLYmlwfW%OuAN{@O-0R@t+@uMZayA +ze|#se|Mhh7jD0%ttLz=+9_8%5a7~jd;Ej&Uq^2OwT(0xy(rv$e|7Os`JkQSdK$dL^ +zyZ4(@48AMWLu7@kEIuXARn<55k9qagDpYNG@iZdf*{`r)bDX%owt9LHG +z7IWj+JcTDaW`Dl$LotCRY1PJ%&;`fR6w+n#w&^S{Q(N)f$anRZh*di$cxek8$t8%Y +zs2$&U%T|hEEKF%1s4UB|qBd&wccBb^pip|6f>b6Mqzv^i^<%YS_71 +zbGANp>*iuu5bPXpGtJX0jrSXSqG9}lJO3(sl8XZy07Q~QL>*YF9&-}8TJ?CL#1_AT6o +z8P^zVnY?}_^eDGUeEcB!IKS=#%lf@rTFc{hE+~jLmA(G;=3WDl+kdWbm@&*vS#`YAjjOd(Md~bfA30TMcAUmw>&T$7Xt@+ni^!~ehX6I#N<4M7$EA?;fXP+3}v`)&1 +zKWi%2PqVGul_i!}{|cVU6gqX(lQn47rM*Vm*8Ge8GN)>P@>X9{`yHZEOX6Pc`ZsG{ +z`uPn8rc1W6iR{v9ezi&Ka2VqXomk0$?`r!kg(kQ;#aMs%CSz^Q{iSw#u*Knyjc2@m +zeofc@^Oyhq<7>s%7Tc|jZw9t)SNIU$GXL-9uia9!g{JIY>!^B7twi7$WBTFBY{TO} +zi=Q80;N$1tC|AsVaNl>UTi!zZS_PLRN1t;%bDeiiv9NH&%z~*xVTwtjLSf18Zlzt_ +z#pJ7G5pNWAM9-k-#M_B0dKcu%F*F3Pi`o$RRwweG>;GacmMP6IWm+$Kr}0z<2>HJ3 +z?$!9XpR3+8VdrPJfG0tke&-C@PP{gI!#L?r$jV3k&#a947jtRpsYd!r=R`EArPg&a +zn+3(na5)*JHZ1zEs>-=@Lh-+@WBT6%>>V4^RSrekONut7CyIBkNPVGmVA3AHqfbtJ +ziDY4U`te29_g9-kOSMj3+$ytRmYd49wKLr2%Z)+J3Ac=he6%7e9QbyZ(A +zA9h~T&Nxvr_W2fZ&FLj(X_9S`Li>eZC7gRSVdX4?L{Z^shKX}kWE>{9FA%!?CDeI^ +z^*XO;UqkK6-fKRtCsSTl_ph73dal++BU$5Vx7eIZox2~#o9OH~5d7(?;E|gLnfpZh +z)GlSGJ`>szz14bk*lVsgXE)3UoH=*S*8^g`mrXwCZkxV}GmFDbew{=3Y-7z?-k0vr +za$GVeWVhoy*$ah_s+dymn+E%DIiIrX<&)sAH9S9!CQVuD#C|wnP1tg~MFtB`Y)Mj` +zeELl`>n^7gmolVO4|ls;Og~(D`*!q;>i(}*%kQ>w)YQ};;II41lE1fzGrD+v9@}q` +zUPjx8_P^P<_gece^Y1#aNzK;T#K+S3xxr$-JvW%nrL$EO6*PRUa`8}oIb+pvzgxFY +zJ9>L4O_|y7>GLdO=5;}37g(IXh$c>#m?GT&f=w)=?t0kA9I1~c$uqsn`af(ER*suv +zq`}vm>1MldTZhhvxl5K!@m=Q5Qp_h1uHM~X%)TM`<;>14ZSpG&O8LI0bDUYnzFTsJ +zl|ZR5qiWgG_R=Fya!>Nywct=&$n`pU;*@>I*uuBWVdb7##6LGv!#m+gX-3VI*#cBAqGznCO1u5%>90Aa-rG|+HUB<8vu;X~CXbrVbj~1~D_?j1 +zvM+S<5p?%HcD}B<;kbWz#m8T9FL_q{TXCvpQ)Y_$F429njMR*G#oQ9|j%iIixbBt1 +zPaVC30D}u->#BunHWrc+v&6MD +zE6-V9Ny>O~t=BU)VM5absqiVYr8)Ue6-IX$oV;m#BxZ)yjNig4k`C)5{uujAQJ>G1 +zqUYoLYnJx6rP*@rr{y?#uIb%r-MGV{Jo}^Xc_&td36sxuKUk$FJ-ahx@2#no3l^$4 +zre5W1yI9qFVd=k3flAMOW30|>RtXnh(sWCsQbyU&@AK!gX|_%hf{z;{*i`y{yvaMV +zyuAP8p{;wHwte20;%dEfy`apJODlgR?6?p;{kedZ%Br_7J3q;A%+ydh5~6i|2FLDb>IU?^;^n;QmvT<;*`%$B&AUwX +zUVPD6_4rr;=Zd0DoZS!y&4>&zl{IQP-L)#?i%8V{HDS#q3_lmC +zcU|`MT6N;-kCiO}Up^cD&tB8=(&uo@!obNtTSK{9mP#?5I{7BdJ9?35Tz2>cpIdnf +zd0%%-V4Jq~1GCA^WM`MnmpnN*SEnAacv9<^$kMNEpl(xr?8lpP!hil%UpIK|)x^#d +z?t5V7U&k5S0^c!MJ>RVp+H5C!L{>}sA(vzE$#)AjT}*oNeeUsl_vCiud_H;7Xm@Sw +zTUjCRhj}R?)&de1=2=oKP1D-;-Rv|@)LbP{viK^))x}AlSL$r(by+1kmu=?NCEAu! +zQfs(6ohq`}@+R}0M(!`Ed=65Mnpe`|Sk2OZ +zPt;Q8K4$*FpxTx9iRjz4WxG->^S%dc%qv_IvCR0${S2?pa_?#V#SGN~$8+ZUZwb5B +z!PDpPph2WdLG%1s&BU#KJN|#*SgpwZ)s!zsapQ%{EIOS*&zL^0xR4>9^zO@?&+eOL +zRsO~~q>8n6G8Z{N`#GO^;deP}>)S^czbq)JX)>I$F4d?(BuIARO#PsVt2?)@TyNlN +zr0MpkA&^Zc;P}nrY2P((xv|iBTOwzQ!ukO2IVT%KH7>sX +z8gaHOD`V0_^NHp{_S@869#IN$TD!}ndW|%DSB?G!lcij{H;3_tu6956xH(uST=`r1 +zGvU(fRd&XIi>jp~`!7C-HC6D^W^JrExofVma+`!tXw6m0LpF2EZ`_MYdFtHKd^mZ{ +z;T3ZGSrnE`TGIPzuIv7k>+96pBkw2fm0JCcRf_G(=4;GFyC%6wZ%S2MXqA}J=;C>E +zi(QRsQ`(!Ev%XKde$%L+dd(vP1D7b4iTd{w$v@8C5LiO_D8|bp4%| +z%(b0PDl0uQY{M@p#k4LvlCbUMi>F(-M9$4JIULU5(K%tqk=H96HZn;c-8-@RPVb4b +z;<-olSPwDnW@KVtaV+S4?!`H#f{U1U%N0}}+OQ{lYwN~j#gkk`t8|X!T|U7r?dM}0 +znY^}iO+mb@$0ldZmkNvS6fZYX({B3rqvXKLEQ55Hqy}jzk6+c^vZ0C{8(y#kT~e`F +zN|789A!>_vOZkc%7cT?koBsLK@ +z-y9b9>od3%=X1N(#&H-G{A}Fo{&wfdB-N)atZo{X`>u-lcfMNk?8pL@v$K0=v8J1F +zJ8^iUqPdiz;!fJYEa$iu}x+4X$3*XCZ+s64MUBdlZmA5IonZ}YT=hf#67OkAA +zCA^B)b!pGi8&XkU<(%%-OlzFC&F#W7tF+9$FRVYj^Sidl{kTPxo?%N%fY3aqq7_Z2 +z4^})cc>Ig?&+hu~xjlU!7subtF4AM|dl7c}^`d^(CbKokTc!vs$O=hc60x(vVv$17 +zs$Df&CUd3!9D1^*=ia-jxZrowo^3hWUVI>X{oWq?AK$J|OgiE&U)K@;|Jh?9Jtfhi +zt1J`VWk#M-Q(W?Lhsh+Fdr8G7yDa_6mKbcFxqSIUMxpqXbF(HcG_q!^zF4=^iFK}` +zi(V+t#w~3kKO)|!RoZ!odh0lO2fgod4hRz6`D9{OS*yd&U*|LBFELdgHI8<&{<>Fl +z`O3~P?cdKUSo@tVJ71uS5glbz9?RF +z^sTV=BGpEo+}v4PzkJ>A`{MAPvjQtUOiiS`Go^S$cIyehyt;b&NA~;wtny;^_ecoe +ztNdMB^X+HsoH^^f#H|w_9BN>l_B?BY)$x6DHCLWzzfpQw7%X;~NhPc9OkknYOwTw~ +ztIfwQeo5|mw5K>dX0pS*#pleHYJKQ>;5+Aef|paH@0kli>kjQuEb?q$-KebnAnJy@ +zYc$uMjg7qF3-Sbyc_{QO_#&Wr*ZI-Ht1+IZZc21oTYQoD!xQ~itgL*OP}#}fk83u5 +zT*~G4f-!8v_Id0JyU$toyKwepzx3$i4NCUn{QAu2^pe5_$M%_C3b-_NkNTP4eAc&% +zSyT*oJsw9a`yMjmT4j4Wd;5;+?{fQUiaHW|elet2xNpi|(>~?Oj`f$8-{PLS(1=@{ +zoxg~mLG!cWi)}a89eaM^&V@VYrEY~?f06px%`1Oyr2XOD@AouckE>O!p8lIJfA3eT +zx-XOYKfJzQ!}Io}R#wX?pWi}X#2v#!^Lv9omR!uaw$3aoF<)qUPwjzKPjin=*((wG +z%$577$4n00-U$wN2p3gxy>_-k3h;VO^}nyj=Ei=gr +zV7yIDoBW>_%r$l24Ymgg^4>5|-g4B&lz+QtbuPE{L=Uzy%|_L`Z+c_w!-DtcRjBTF +z+P=wy`Tvv$5=Vlh*esqu+|75sukYjc`+pVBy?>urUCqe0Vf%LW_l<=;s+)pNv}Zrq +zEw{?kRAfP3)Bo0T*Tiu5;LV}ms-`(|o0vH9e2bd=cHTQl)AfeWx>@HGN6cIIif{E| +z?QZAFY7^$TC0E_I8J<4B^vB_e%^FcfEi;S`d)`g#`T4ytrKefY_vq0%&T&b`{`-8Y +zq-V~*nz;0e^RDfWSkEedT`{BN&YZ~CD^{#8zo{A>-L+aUI&alOuHu}Xf7EWv1afXr +zO;F^Y_>5&idCSal3G4aYOEs!Jl9SdP>sWqV`QOju^B=vNJUQt4iZ|ic)T7p9Nlnn* +zZkWrw{M^K}e%8t1hgOHrcq8fABOuInMnC758{^6KTYl%JUp*@D;j#Q*7W@A<^*3zY +z+j=yK@4anX;)%%LGJ(ZKJeI|&91TT$nTw7IXB=kzS)93OCy(Kc?_9SSrN89HMC*9o +z|5`fl&Ppp+E#vd)#x-wOzi+a9IRF38Z+KFf8M0|73 +zab0B8vZZ9R^w~GwGbdj9lQXYfE6C`j#bjf>%-VIOi(VemEBBKlYzIA8|C)6?QZII6uqqqdj8zU9D|hZHc$0Yb +zhWKpm=lZhKPW4=UC8Ed^F|RCDqIWgtm2YRd3v#wDwCs2K@a&m@)TwV32U*JGPrNGs +zyhiI&%ZBc6;VZI@{8y~ooO=3C+;fiYd3O)Y|NCY|@O%>6aXTQc +zamCsvYZy6pt20Qm9!%?(iLy4(I{dt3cZ9D*UsuAXxlehr+#{?)D8F +z6N09OyX8G^_**4W{H-U%C%SI-E90+?H+WYB7;pSIMQW?crE~lC3vHM9sl>_a*~OyF +zeD+*|`$`7^b(c`5NpI%v?kwGV=GTNQ;YJhP$>HnQx3(LcSXLG%%%QVlVO#W)r7o-A +z`u6#^MnByn)@BC|9^E~?gfz#XL54?P-8CU&OwdUuGLc`=Wy75OH +z4`;;W2Q6m~ew@=-nU>0^{H5sm$3rR=n +z*?rFES?<1%G@n-KFTc=MB-&WK$bLs)#rD2mx;GdHc^8&!6@EJ@^w5lh +z#?Be9Io_6aO__47#muCL?L|wL3Adz4K>o*On>klYl4`;{15{0X|6P63x@|(TRQ=ie +zoA=JWFx{n`*L6yemT2-TmDB5A7ldv(v!Llvj-x5_3MBARw| +z*W6sw-mP|ulPyv>jVD`}k4Mem_tgI(Gt-LYU!R(_#52*z^~6o%*%_Z!oOxlgIaX*% +zH}_n{V!kI`Kj&-D)DL{@H?w+a^LDfUS4E6oFA|t!c((4!rM0Pky>D+_=n~i?F!M{k +z;k_8n**AQ3W=~(OU(_7;_8E8liuIjx_U?1Tdj_U +z=ANaVt&K2+Evr1U+Aj8_IqX7BwsC2 +z{;8La+)Vw}BoS-h{=TZ_$H(UtKRy^f`z#q_fBfg?=O4d3I8hgKmY3K3#@f6bx7m{` +z*<>0uc5vyd&J9ShH4E=JPkG +zUOsi^)122|rT+ibSgKagNk`H96m&!+$K<=`VCAD?`jJV)x9$BiVV46k_?6OOH0ZMJwLFZaW1i=O@3 +z!ka89XVyY9-?wmn@+3dYZ7U%dHFuINM4 +znV +zmwey6efLP+{->s#ZBaj&ue-o142Z6>becmcR&BR +zKCMo1nfP?u^r@Y`?Tx*64GhDXiuC8{OxZnUiROeZgW}t-yr!OEIq^CFN#CY4bC12z +zS03t@3Ghs3TyWuidZOa$hMYE@ng2tTwtTp_DNOt9ij1<)Gt%$OI2YqzE%7OCxBTU= +zv!^vzaYP0@3G1zV=fuG{_w$WgQ4elDOgwkO;BU~a-QntetxLE0xZ5`CysS+zi!`~n +ztZm!%$#M&N-GgqfKbS5Z9hR8Fm+w(%v{ioQ9N}5N=j`o&7F#v<cHcUUg;ltwVAvWYU_OSLD5(nW7>kx%Miv!gDLXwoVVR +zmfVZizvse&&P?C69;za>rA#+>+Qz?Km+*2nL&RjKZ);l8)c4hF6AVJN*|dbLxhuNY +zFTSa2b~CyyF}g&1-t{6?p(n>)gftmVcPU$E5aP_RcCD*x@3IqCUXfj%ugmqWK8%r^ +zpdGx~D0k|c-2VaIK9yI$eph>ZF(}8o;H+B6?o0o27kkw|&Uicj?fq!a72C8z-Mjvr +zne2UB$4y4PCr@$p|Qx81d``SP*o91ah=Q@WQmH>NqQ;PFWFUDf>mzis4R +zje{ZUoY(8K+<9ig# +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 +zuDMdD(}nq7If`6MoKndpS2`)+W<+L+YtlZh= +zDX8&&_7znrBdhKE+v`87-#_-Vcz47+y^S&JHpI+J+8UL(Rcd1lZ-icW#Cmp~#~oiS +zl4L$>G$zVy;n?c*xTrF`r7LINZ&}mMkeAh`in2~i?Fjy_acPdx!AXhktud2>)F0nk +zf3V2=*4J`X?NvGPkSt+Hh|;T4g-E`i^PK&P(1{6~%uVH1?0&4-hDznTAa;mX_KdFSmx +z?!c89*(M8RwPr2WTQdLR`#TpD84}XVx%dA+yZ*t|>G`i>4vH`zn_$q#_&V`OmT7{- +zHHkLH)mNpCt83d>S{y0=|I+=(+jjX(&rARQ$<3?(XC-G_)w0~5|H60KvTfxXV%7>I +zHGHD->7$`XM~~g4&(zbE`U~qt}04 +z_R=m1EeVC0DPMO{ewpcT5<*mBV58cc6 +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 +z=zhFi;+P=6TutZX$-*-7^B?^CTm9kOrzW>8{i +zxlm)kz3@%Wg^Q`{)-DKeV|ie;zU-L<6JMX-$D7Z;fB5<}`o^ueE1^shP6sZY)Lg`K +zC%4UUmsVkpO;^n0M{2#fQC>|}6)KM%jIx(adoX3^++tO~8HvSSg69msm5J@B{q0)w +zSvvmU^?jej=IyVO{QUEbfUxq?4hc64_Z#=_9h%NB|Iq$V`+wQ%>tc_}|NkhTAme_g +z<|FHx>)ACQ4z_=&ZBLAN{B3RYj)I3W@9ynvU;9?~&(Zil-k`w#)B5?xKl{H7=M>NX +znti^YqM~K~pC{=v&Q|UD@rb+P-_F+&>%%L)yx@FycYpu=Ki{_BxO?~L!_CPyRexAc +zm(Kj5^3Lp{#xb*tm#UCQA +z)v=XF`c~~-d--ft(o@mQQ>-Gn7LvQuWSeJypVpMQs`av|#Jx2?di@h_Kwoet~u}X4wkpPeaq_SH+{$F +zqpyS^&TtAEHAVzHJbZhOW)-{1SyEtc?-8#N*=cVvQi?8Xgf0!&< +zk!Uwhr6QVnqCug^wCi=tQ}Q3aT=q>@(%ACGS*e7yi3zN;p6$$%v%4On(BybD`nk-@ +zMLT*_(ylx-=#*GpdSveI{*PZ?D(c1DX@9bKqVk$!9qGrHUyU{|U325?MP2U=I;qm0 +zTZ3%Z_s%h%ce(1!w+-25e*Zq%`Cn9ZuXy|Q_Kw2GmNEM(7^Ax_Uo8;Xyh`a~uuq5K +z_dO@yI!(GY)zB?Rf1APVvm5qq?cIK_PWZ4uLDjBf&FuY~!aslWjoDqs`~BVBH-~VyR*Z$Cacdxo3Jib;mfB#o5IlCW1|3C2m@41@A`<}D@m;OHv +zfBt!(PA~JFx}U0Z?Cb58-&^am*wd`qBvJEhmEz6Sop*wFot}SoW5VR8E^n`$SnrYkUtJS~nDR96HXS#q1n>if5T> +zz!{Flk1sA7zPnf1a(jC`L+POizQYoQHJe&I;%&(bll<^NqWAU3&zVpH{Vc|6osMY(9sN(2cpDU;LKSbenVg +z{=ui((+gfca=o+rH^aT^nhyuhfBgIYzXZ>NA3r!09$b8^Uh)3!_J_OW>VL=obDUgj +zaobc@H9TJze>^&WZ(Do3 +z-7)d +zRT6zSYQGo$Cvr)HPkD9Y)i_gKk=%c&j~%!FStlmsA8)X)^UtLBHIg?I6!zVl +zXRYOy8v;r!r+Vi##Jr!b+IybO@^q_LvGl16m#o{@oz6^3_W7X5AA7}Jlq0&JDdncj +z{51v7-zoPfCSCk_Na27*PlR5(PM~?0_3H0EXBzz+Cw}7#e3`k>zf9GCvGX>b6;($+ +z&k~l{|Lg4WAN&8r|4+}!*WWPX{Dz1#8@KK~@GYrr?OIl`=;(+u+c!jtx^p7IOV}?~|9s!-<|6pw;>oS6G8eTTYzx>b7kqw)fQhJk%&O~`=Un1F +z81r?-+MN8QPK9%B{M0%dy`!?>7-Noo&@Yj%bKAdL)`!T1w_e)xwnMApQU|6hMc#Yd)HH+c>lJUIB5UE-LaxPI)R +z&)3&II(2n*!9C>-ht=obJ$QV6P2>HVFOqgYp05A+<0WI>V==zIzK^&2?T)^?C%5nG +z+x$nrzOJr#cvSqtPswfDwrz}(ej&!zWssye>U46TsvDo +zVWa7JpNwzCmnXWO3OGCe>_79b>$z-onWZx{{v2Ss8d)0P%d+0+z@{msuR?lF8rOEs +z%T+oUsVB%S=&iijX!E^$Gt}f~8g&&fsV$oOys| +zy}u)Lo>e?NR$Ni_f#PEqpr)K|UgmknZW-@13BXIH$#Q-wmWEmj(n +z8}?prQM_Q35Y3&HYjHTD=>M@*r?vfuxC +zXQksh=hC%TwI*3bNT)HX#ARN;*ty_hWYf`U*(!}IP0vIr3KvdeOBLjEP>JnWRB%o$ +zI^odb2bR{|Nbrh@m&5d&;Flh +z^Ebw=IscbcdH?mox3s4QZ2Y7V +zSoMv;G6m0%->ckFY=V1 +zsa1JGaK)3*VlQd=YkVQA1SMysAOD&oY58Kg*ygDW3=IsPE{-AfTVy`Ge9m83Qq$$V +zxmJaZuYY<3e{!sX_wJ)%n?fssUf;UnYWuY7?6Cz|H^SAgg&57sO*@ujceqzP{=mnN +zhE5z3?SkDuna)|ynKS3WMCT61N;kGdTb>TZMXz_s`1cC-tuV8>_vFs1qh|xX1UJ8l +z_2RjonrP0Wd`$60pqz}&;e!VkUQ~+wVO#Y@#AS(Gq^9E|Cf>vr-?;A0{r$$`YnV=m +zJUA6r%-S+FBs!hHq*HZW#;=`z`=`{j7I05q^e1Ple|Dm;WNi}Dq&Mr|l>MD?`A(9f +z%hktO-@7!#RW&wEyjt|t@=4?Fv^P7irc1w0DOtzzBA2y#S@|`d#y|ZfYzt$Y+V?tK +z**D8FHN?9ph%F#Gp4wP0QA6I(rHO3!AU +zSQEv+vhG~xHNEpmEbAUW?FRK+pfBJbRRY}Ir_~>`^ufxjtiCZ*E_Gw +zD*l>2#Z<*@NraGHPi6YW(wh_f%;S49Ql2+gNYDQHyyaGNJeP>$(#bQYx`*!Z-WB1~ +zBOoMK_mgM;kE7}pZ?E3IaqH%>lP|dxU9QYi{rWT0DdyXjCI7m+*G9>*ZVEG!%^24#TAMa&~e3SSJZ~8Jp_1%TI-FTi^a^ +zu$yo5xyQ$Pr7J!?(d3(Fd$^Tbe8cwr;k#Bp^Y-DgZ(Xt?Z_z8kWR-1Ke=u>cp1b}+z(02}w`bXbo`23O-{4wmXs&)U +zLu&HnNdAgLd*%oSFa@Ow+!D!cikVaVVO>hX(iIcx7BwrjKG$68salskuVKRDmY+{U +zOycHsxSYB5=zPZA9P73Qkww4Evzk`#bqqZpbVqtdVUf{;QGEyM65g5{p_nzrGKdBshzQH`1J$|DFAj#rpEe)#dDp +zPyDjP_2Q0vyC#;lS#EyqFUe=0CDT-E3TtXwB#dRg?mKM3CL=4Gyf;euXos|U9D`s% +zO-0MT`Ha&WpB8og-CJu@^+!Unr$aNbzMel^FW!lRaq~?c{k>m;6TUK%?WJFvU)r0SGCV(Lv2;JcPq#&$jJdzhRBka#1T~8IKm2|FUn>5N^&$5CySfFI<{2Dko4tnf&@nc%ziw9z +zA4h2}pTG9(+czG&)eI|=m<=SwNut0-ICEi>m&$N15&k_VxRp +zRxDKzNb0h%v2o#GJbqmL$D_~s4`dP}cs=GgoJ*{)mv49f`O8psjo)+!O}2UZ+a@G6 +zy|)Qd&$eJXCb6MBPk!I)4bN>mWcGZ&ar3tG{jV=}^BKC??D@~2*t4VHq0PIywGHdu +zUo7QwKR@r`hYuUL%9RbC&R8AX%*8mFYuT-TbIrc36P)&GvEkz>H*ehAeD!e1s**S2 +zuWePbLnV~FIcFI)$gMV=ye9d~r>$3CsNH+1b+fzK_eg8;&b-ZHa+B||8$1+Zx0t!| +zh~?GGJ8uchJbTNkHe#CO7th2w6&E-{mTRd#VeR007LvVfmU3=&gwdxvze*Kk=JEY_ +z^iO$CPtWdh`RO{+tNhoMd1-H4_HBZQY_?nb*G-bqVM6RKQQ`M{Ix`QlET5XVSysnK +z;-E*ShW~MiYl4rnV(-mYynL9QUvX!9%)I9>ez5HS`8B`j|5YWN}Dv9XVE8-Nhw_S+|)!fRk}(otnY1#maMJ}*u8g$#)WVGKa=`6`1trd?{gR5ySAgx +zb@iI#9g{DMDsikE~lr9telqOy7^kE +zm(b2!(UU99l9i@Me<>7VThHXIE~pu^CS$SZBVqmCj~kw;-s+L=mbrD|^p(8ThiaM% +zqzd)<9XO`+@;f-F6Q~EyT{$6)@&wHtlCZal~n@=p@ +z`K%+lR0H_ut_Nc!)Yo}(ov!5ek!O*1d+qQZBCWlE$#2zA-F26I`F3b?7o!?xw#oy;?FF;zIux~hhkl~de8SQigl~P7xbP_ +zjXqPi>C$V-4zE@l?aNQrE-Mm~{k5+><5%1FQ^!M}NJOoBYp}vGYHL@Mk;vC`iaWZt +z@2q^WOVH@_-i>QrmYUC)YTC=OV&keQ5{D&<9E_KhF`L{mY@OKP_vGSaZN;|E>=^S2 +zF?mjF3dPAydyS+OtvmTlF0#u7^vAyt11Zg?dh7Y7FIQyBo^9ki@uAgQ;?Pv5F!!ZC`UlT6wQJZk&*fccc4^Nx +z%MI)Y=LpYVvN-zej>erImf1WzsXg_k`lVxgT+U6O+49s;N}IRsWNW2_SfB6qZQt&R +zWSA9tbvzNtWi%6B^eXs9VE*JO$tGn&p=Y0-cwIZ^{6fys8qVC?71LJV^xyaS!Z+cN +z^A>B{y^g0GVxDEY+0!EDn`3!gtMBgAZFg2KD3vh?`Y{H<``X{US-Ri +z`IJX1&*;`kH3g3wu1+Gn%ziUEigdPpj$UCWfoXqrMZ|d|_+r2tlbAB=3y3-#WEKYHLc3G;m +zm}5)CVfH5~yW_e1vsW!Fo+-GvN6W)3C7`8Y7PFDgf;TL?PaTOVU-7h$GwRW_o3qw# +zXN=zb-z`<6_@rTEPu$@XP5UCwN9C<%^39y8p1tOGKI;~>kLI)3x+-E44?Wuu{Uy8Q +z#rq{Ix&%5eX6jGXSm~dXe?oDKA8RGURcY5>UG7HuA`2pB%rtsiI5BGFndKdv65U}U +zv$7@nRPdT{_Ha#+zMt)@}@4IBSv6iDkSyP98C7 +zENN4i)i~*GsLHV?ClZWO&CjGlUx2#*eVoBYZ6c*8k=gu`{-BK_N%$8-iZ0nUVYt=511y5FmoSm@AYra#` +zO;#tqJ{y^%t9pXWZUuMNKK&`SwRpDBw!q7}TXK>o|0*k*ute^(M#%ku=&}npk6bn4 +zp8NAV*O51zxBF)YY_S>YW^UBxzO0LaoO0+m#bNTNURiCwgQ_Zu4Ur!WuOP}YvRsZ&B +z%L5C{tM@;rH>*qv+p^zZ8Cqc{+M9!Dc{94 +z*B8IHu6SO$zKG55;-Yg0owoTbkF%X0bf_gFN4|0GiIWd>{CJnT23dP9=lRQ*v~I@< +zkLtYEWo$Q|{t4I~$@Jlsh>-s#S6#IZy=@<^e7;q2t^3>d#n%?d%4;!C_?L2W*N2un +z^A}_XSI3;+mT}|Q?ikamx4A0%w`E?}T-RInMrCF4rnO#T)$8w_5#3(#fJN^r|EV=j +z`2zm)Qf8$)P5T&l#%bD`_O+pBr2@2Ouzs>P&e)p0~&o-!KhpVx9{+gT8FyZE|sB=s!FJ#C?^aXXq +z*d;S8lxgE)PqYZJ_O*L#_4uT5kdVg5-`7rir6p?>Ztt7C$JcZIF@|%iG|zs#IbVCr +zs>1ey<2Oz-MEa6&UoQ#f~} +z-3p^qZ|Xi*KXp?~|7vw@^137U4cN~}Za;e9+RIA?%{LmQH=6%e+ju|qW6nRpSr%oR +z{eIVk9*^uw6bbH@_2Zu|asK_H*^=uw*X;?D&HT4v>q2SIDfcgU&Tx?W{p{7FIUD9$ +zXFI=j_`6_f(19nD)0jRjEspkDbd%$V<<_&iJfA4s$XH|M5-`)hWAe%s7dhjuMphm= +z_Qc`I!E@WMZLn!Ov_))L)~0WW2P?*;9yMTNl>r#_TXN%Hd*6)#9H6!CwETL +zijXc|Y9wKrDOa$NbzQ-PEfa3NnCSa}HId_a +zJacYVbhr7}BHc~5CnyN?UNhSJ#rtac6rN=tD|-9uei%MlEF4qyj_KR_Hw)&^{%a() +z{pIV$iUN(@riL-ma%n4sip}3n;P>RIzS!rfcERV;ZI!)U9Ysft8RKTGdQiKANwhQY +zZt0SbGQ~-4CtW8MZGQ18YFp2Z4LOlBg00;Zcz1FYi+(Q7N?3D4Q{zy2eLnmDZ~Ffv +z?*F-U`^QQBy5|3%|G)j;t1mDA!ZdE@U#5R=BI5i#Up-c!8OGUWQfMggb1 +zwT$7Mb8HqnZ#zEsv*fg684Q7`6Le};yKS#ueUks^yoXs@PyPm#nVz}SQEkiXD`C*L +zS*FWK;Nm9*pRVZUyfaG;x2ha*4ho#2oxe(ID%T^Qub*AZJfi09oV@U0R+jM7qJ4|o +z-GBVaI5PSC{0E1=7Vr3QNABDDHwoLWW}jR4@Y$ytrCgp~an|dV?@v1%ZxCQgT5-Y1 +zKfKGeeroqpF6+=}(T=H!8lp@5S+@yk2qr1H++wJ{y07WLmPtEu_#7@@>v0b}?aU)- +zy2ocq^VeevVh;n812$>qC7qD=?&UDgk2x&8{_dfj#nu%+uN7CkyX9(ArRC$XqvWB? +zz3ShgOOEXL|G{uh@rT<2}_ +z4JQa#DvHm3b$e%4^~T;QirzH_)(=*dK9w*^=CTu9)LIpjs}~t#dLcG;^$ekvkKX>W +z+}+7`)?3ur^Jl8+g0u4`|8!XOH+t!fB)h}6^Y``4y{lVO_MLItcCm_=*Sdc^&9^^W +zxqiy=6^0V_|9<9wc>n+L{bvW~ezuIO`e+48u#Eqn&adI#|MNw0&5xJjS<(A`{1N?g +zFZ})?Zu5DEE!1kh|F%DtH8Wdy?)Qq%UvK~TT>nv4Mt*LJnog5mk<)wGeIKuue_+4= +zORMhh?EVk(|F-{cYF<2f&UEX(j&lzW{gZjW|F2ZqX34s5r}+#2UleY=tJASe;KsFU +zGToK^A#8KnPH-qD$s}_YcKGJZ;LWv<5UhE7Fk*S%n^NCp=N;U4?UOW`JICL6kL#vM +zZz4>KzlG?n*%eeQdrW4tcsON8zmMgPgh<4L{;n0oe4f)89R$}x;(q8j|xZ5F=Wg1 +zSS&4YaQPHjj#oR +z_2wR*y?%es@^>KxP9eViDkiqHtSA`-A8>^#ptNDw)IhF40 +z{?D*IzKU=E|F7Ra-YLHR;o|f1#wiB#zgN6I8@_S-?(X#V<2!0T+N_J+*8!Tn*L?or +zUC!4T-}wxmY93TH2+@O`{+x^M8_9NAJ>)MOV;R_@%+5_vvN%iL29asu}USi$z_1WqlpH2$e{d-cp=l8Yj9X}rx|2Vqd-mPP&;e|Ex +zr>@Ig=<~n#MUWOBQ~SR2oJYm==Ny+_zpo{}_KV~pt@p35djI}$?fU&=TeHPKzBrk< +zRo+)?;Q{0KvUxV;toeICa>?1&H9dZ;su%yQ;`iF?AJ*pY>)-!N|NhbXzwPn~_5Wr5 +zo!$RSJYwFwNA}5rpPyWxFTUIQHpk`G_Ic%*08)Nt_VxMuw@+~>KdE=KGoh!4hxlQZZFzwI% +zwl!`8HSlZXKHP#ix(+u|bl_E}zoqi$$l?nXeu9FZ}X?MSPxp +zd$;+yeRVa<}Xd@IO(IgYSp!!lcpY# +z+_mr9r|yb>zeN9h?yqm2|L4o}inmjvca(mv%*oX)DA}a*_N(=g8PE5hR$d~pS^ehO +z3*T+0y%u~tmPiw|1UDXworcay~lI6#~t+Eo-f5DznblWScha^)%%TmO%K0( +zDfIt#e7*SoUuTzpxXZJCPYv_`U+4EX+yA*1{&DvGx+a$PZt-s)Q#D*~oC~e=LIBF+qZD +zO?yXt{SVfE-}cvvyBv5Meg5&St*2+4uUd1RSHNMO{qFvK0*_4GZf9-T_1V>R +z<^*rs>e*j%e_Z`hsCCHrKR0KhZNif`FJ7j9s+%qT=0N8Ln+WAK^B;VjAeMjwU%Re97javjRl>by(XmTp3U1VoW^|7OtOo!fm +zV|u@*Qo7;rdHWv{^Y2zRsI#B{aHuzXN5MmxKEJRJcJ+Eo@6>1?=XB+Gx~6yC{D&tG +z8ruDSq?mWVhHw488sYMHwgeyrSX5n->-1s-L><`Fu<_W_J;%KfnKlQoh%T48=|5SARMwI +zt+x0?Ip6Q!)-SBvCtnt=`*~2^qNc2iTfFRJ@Avym2Y!5*tZ#5c=E%L!1*u4kQ#{c7b} +z*{;SUxydjes){vP=qXyFIlVcstkL4hkuDRJId+jsJj!iXJG{;H5;oeNFLvk-c(G)C +zulk`i-#y-Z_UT%rr>a;X!xXdf(zL#8xt-F5?`@j6Kd4F{>vS=wQR?&zIkj}b->{0L +z`? +z`2S&Y&8L^oEo^KK?fo79DEs~X&gbjmk3BD!U+|glbL8~o-eetP?LBNC=6-*XZain* +zHSqcs?dj(quDu?AOyBN@=)LOiyfOP~B=7%zKL5eb*Wm?EPr0r+E_f*^;OXoNhq=dd +z><&vPhaHw$pktEEA<>p|+sgiM(mXEVKGT2E^DbNWzkRFQ!1;RNG5^kn$mbhpe3uB* +zmYJ*b@um3w1O0Ws81wcO@UFjCC+I)l?(qM||3AEfBb#FLcV{V%!B>^ +z9`}EE@<1RuI=bTj-0L5oSrhI0#xE$5yRJSaZfeRJxHD&x&9 +z3MKaxmrOb)+H1C@F(OeVQ84**s5;-Q!(zhv%M%43*f0ny%+D!mU3tank&^8B_xX>{ +zn&&m2c$i}O;M?2i7xC4SoAQ2eE!4ewxqx?!M|M;;R3B +zFHwT|-JQQe^0h_m`FrcQ>p%RCKRi2sU!(PRxrfi?Yg(kw$Gh?{8oHhNCHFaU`s2N+ +z4X;;xOAmi^C{oM%`G-Tr;vXM<4lk(Mb>!gY&c<67US4`NBrPl~ZE1(d!oyp4{OZs>)5D*3 +z`pmbFdldEUWn(t)_?!aq6Dqzh^#pX|I9-c* +z3}5BWEiOG?xZt&uPS|lfha$eM*DOw|ZGI3kqq0AA$GPIqMTg(*di>*H*W~u&A-S%q +z^TjS*&~aluxJl2elt(CA)QoHGO3shYPi0G&X7(hSh~De(IoJ9$z}2k2=9)l*nS{Et +z>*i}hyk?rxUH>n${tI7pGW>3WygPQe3%O?7Iiz|DTO7t}AqoHRpNU@wxB2eMS5J +zKi%>dLN1isJ`c~X`{rMtAj5uZ*`p5$C*%Jd%b+&)V2**?Lx}V+!9Ndt-bEM=JKAof!9rU$DWrs9Pg!_w%LrUw0*Op +z+Rby%?(C~Rm3RH)pQE!?8txrFTXlTf>zU`HUhO)i_;~MwzyBORRv*11>EnAo!m2gM +zf5-77r%un6m24B_J^ACumwf_pT;FpHHZI)IJ3m-6K)K}ZiP?1y+DA_=7G4#3`-zya +zp3Eb!>^){Lw0stSy_Y;CO@e*R_m#IlXXIwFq;|DAuar>B;>^68Ipxrch$X9v97>Z~ +z)utJ)4{kVGXY^m`@i!-dlW$V8!Y6)7cv&naX3Dj%tFP#`S5s +zSXX$o{k{Ezz2D_Nt-fD-wEmC&|Awu7%QAPA)|{yStp9&X`}h3f-`50ZztuZqB_mr_ +zGC5)W@#Iwo{2$X~ml@Z7{c60g@>f^=x4rqFPv8I3Hm=tFF3|#?TNcKG4X4Dp0EFH +zJa2EsVf(+Iw#UTA7yrMf=^I-Se4 +z{Qv#_U*6Zb?xEo&wdZG>KVNe_y64)NTVk!t-|ueG*|KK3q0Td1vnbA!CyyS^k&_aA +z&n2;XN|NRLWS^sD+YcXmXufP!Mmq2ASn+ki8V@6*4d-8tnG(QQZA%iKmK2yk1?B-S^4LTqg`){#9~X?#uMWar04?_ae(Q +zSp>PBiCmlA_y5Cn`(q)Zv(Kt|SBgA2em?H=|3C8o#b+&h`sq_!{GU(3dDm=Dr_Klt +zyejIZZTI&PYyFQm+I3%N+Z)W@dgbjLf4kZ<`St%@Thh4R%glZ|ZM~fRbN~7uv2u6z +zAMc*N-r!il`**tk^8Zi&-#7c~w8WB}GTHxMR^Pw))@s$NMe^=zig_L%(69R$UHA8- +zyu@*V@HMNtRvEq7r6;60T#4RsVi)z1~xi}+T +z_n!0hubBt;oSvQ7!}(A^dd(7%#xu`#-LiM(O|MZ~Yx?;n&r*(+HGwzHe4THb#H?R0 +zdE7ADgLU(^g=@37?dE%ZY>B~rJMpELA5Q+zdg@xyo_NI-!n?IT9%)*ye@LXFwbw0i +zgX06O}$-UvC0Uz_#MROkp@;vsq{*}jBJlR4{ +zOL*a`<=1ApN$1E!tmr)`*?l-LRMhva#GK>}iW2jg*RkzM?%`xmN)b|?xJh$k-Ou-n +z4mmDZtlgTs{%hjNF43DtR^Zq||o38Nn_k9$WZJieX=hgR$^%b9g^~`>I +zz`y<@`@PCyS+2^}tn8;}Efzj&-XH(*%}?&Q_%)TqWwPo<2Q!jw477IcT6fXSU9rTl +zFZ9ZF*Q8bJcur-M#mYb4k-Es`$EB#t+e`&^`RhM7KK9~8gmlNW*z3iwGY&q?I`?|B +z_nz`CzDM6qW}Z_zC;rZZS`R)0!F^HhZ@k;(^Wn(W&1E`MvVTPBJqwxouxfATHL*W& +zP9<(GT&j}i9|`{odb4b+c2VDH{b#Z@!r$d93mO_5aWBUw&J)Yn}e4MkAHod+vRBJpb>s=lb^y`pk^ae$vou +z(Xr_|{kpMx^<5XwQ&p``7-|xaxfE6W{~hPCjJW;#IzC1y-s#$_+d19#TkyvFeVc#m)p~S3^Tb+z%k!FfFAl60 +z;NLRsz}y`HD~+-O6CR#QliA23A@yjL)Sm9U+e$e;&-n1`RIk`lnF#S#y(P~jSoOGO +ze&%~B%l6Hnkg)_a_a3qLt}T&{EB390(ENJt^( +zyxYQSD>}T6eYqLcexarBu-m?0uVz0wR~zMivby%`t2y=G_y6HFdeMIJ)9)qy^K9)O +z|Nm?M*EIb4^^&_YCf%4C_VU-c%6*ley6S(u4bNC>X=Al)rBm?AecS(h`yT&c^Zfcl +zFV`mT`~0wd&-a7XJ;^5~-hIRN@7eqMbKT+31(#L5T9ss%ojfyax>;52=BGEi&HrqE +zzwh||pR4yjxIVwe?|S*2z14^8|8IU@Si1Mw>HK-gxs2kIoo0t!QaM;-y;iGxrNty+ +zw$fGGgKMn!U9ape<`S3Ii_Vt3+7ZaMJk&#}fbY4^wRfy{+)j76duvYTUa^>KnqE%V +z$Awp21Nao#uSm|lC6~2!<(A`Gy~@uFkF8wC*tT-U3#ohhO=%^2rs>|YUXc^}$x(<= +zi-}A4ZH&){uQ$uywto*Tuxqi?NN`=q`8}5X(80-?N^yLPxZdQg3e*2_RiUBvhj)|H +z#jwPr)!!?>oX~pO6dEX`q+uAKBb>eX>!f$Lmu}MP-gU(2TkVJYEOP$#)_=Cf<^TA* +zeEu`FxKG*h->-jPRrlv|{KxM2e{xHi)~s69bxUH~Zr$0r=c|6t`v3C&zw~>RCH=RT +zyKnJ5UAFu2%gy07mEV+>+!y`+=hvGq`JBYKf^_=~pxNtX^RBQbYQrXt&b}ZQ(VGwT~_I+;ac8%4?Mlvkaa@ +z+ftt^W`-X5-Bm`itv*hRq+FMlaLhe*Fr<=k`Gt)Z^CvS0b2K;vMdmH^czRT8$r{GW +zc}Ze{TZ&?sS0|>-&^g}^(I8)w14)D7uD}?zOCAoH$%f@W~jb@QC;1^ +zpGQ*_-u7??oMm-#xpvyxfBWknyXF5YmxdNsmbM;{eJ;EI_u=Vt;$uFYTfF;@mEDqc +z&Z);Pr=S1%XtnyAUk}$Fij@D!9vHXieDLY1i*(XvZF(_NC8Da`i*3OiwxyT+FSY0z +za*v-znbd5{VoubdH +zF7Zxz7uzZu`h+b&C^u-+gUX(wPuAZ`-1c4Hv$NW0=DgUqp3A;GoOtc4Hd`OJv@PWt6^(#L8am|>!(l<+b(z(Ddi-XndpZ@=}KUl(N$`?5!Up?ol +z9WVFo`}%b8g&BHU +z7jM<6zcxWwW&N_%_O81VEBpHSR?MDdo_}t|>^9JGjKw*-`)1EBNO*PQf3b|)n~da> +zVJ|w&QZGF!=6LCv7IAs*8|?`%El*rk6U<7Bob-{&HSPG3S-;;Hul6Y8EYs3lCS-YH +z|77!kZ}T+&gzXgf4_nn4d*=JL^_fhas{5yRi+-1=*Z-}ra_WW5sZ$?M+`3Gr?I$}9 +zS2SOjo6`GCU1DAWXP`#<2eYuC(~f=jUn@1lIXORSW!c4bXQhvh+fjDzRU(T|&3+Zb +z(>P`EB~AX74h))`&dw_Gy7xw2=c3J|slu!IQx1i=&Hs5o;L_=TkNoRBth0am*Z=-* +zQ}d(Y_xJaO#haJqN$vadD0@nf%v_n^P}AA7P4(mUJoxfO?DNf@yLrbyi|fxg|9lN! +zSkJYhZ_juXxHdn3^r_1*?UID7)QKv7=ljiE3uPAWyKkj1xqg+7;Epv1x~A{Sc(~+< +z*Ol;hH}vXWY|;H+QoC&a+-Mt-F4cW0M%VoxEI2j4MgQJ>k+N+*=fq?GZmLK1c} +zb&>Es#e;v0cy$+<)y&Z|+xgw;)T6A_th!%PQ{O4inHwRgy_Nl-{1>^WP9Ngj{|DTA +zy!VN4`x5c=9FAZO*$=&4Kd;1jPG0_ju~J5A^2N(LdlcF4gkDOz$ryH|Va>&g^pE$N +z%nC22v@yNm4h^~|ln@@=t14z8ku}w)wO(5K*iLS%w_Cd=IG8!7pAuUv+W+ouqG7gU +z_Os2F?(OY+Dn3p+e&6Pq_5Hsy%I{TnT${Cie`Qn9EdKlT)6YIrQ_(4x?U%FV5cyYh +z@ax%G&D%IrNy1PCtB@Su45X&lAmx9p&%&?iy@} +zTwnR|k*a&UHXmO&&*2kCpQ_&eY9_gP*-Flv#)qR>796m%JfOKk_kyv}Vd1Pr9;Rph +zm5NBKK^_}_SeBPq!&nGo!=`6q5Tx6|UGja0dch$3=F5;f< +zxaa@&J2N&-C|~qsGye>Z2-O9lcHSw++SeG#-#Ub^+4 +z>{;i#V$JlPuEH%B%}XLL`z-jfFHG(6{~5fCdmWD-&W*hxB0GCY)yr_>kDA{eG`?|; +zSrPJh!KrJ17Wq7V#^oUL*E;?Q%QC&}r;fey^(7k~+;#t6`T1AR)r*3wkIvb(YKMjW +z^7p?dY<{Kl`Df45qe|g7i}sErWbCx;(Pe*S>3w7 +ztNjbE8PDGO=jHr=6Yj2ie0~4VSPK@xeW6nm?ecHtm6`Y+&Nv>yF7^AXkK4r7sivV4 +z6*E`8PrYh0MOS;dNl4;Zh1BCe7L_u;+&xJ|Fi~0h5R0Q{SMaB(Zwr4$s~c>*Xg9a@ +zz?5H0IEsQr6c=#KdAXErqrruv%a<5PsfG&kOjG7q*dt{dd=sKUHyWiV9`tV`G&!lq~ +zFEXkhcYlz$_ntxgnatVK#P#DoT@8;94xM%RwtCNFkL&$cd=KBPE?+r2!1cm5-uL@H +zcf7Cp66h1R;>U->{5#73>xoYnw@8<4lk0!{_q+T>6VdSS=^;}ezRutG?BrziFV5!= +z9-Oo-xANN?%j@CSLqg~BotwLR`_AI;eC_S*GfoxMl$==H{(Wa@(UHULc+cW>|6zwF;1O-i%h_vXaBH9_AtJ)YOP?$M_Et2QV^ +z7VIhT3HDd=n;E+Cio5Ios89W;&z^4enCWvWApF+U6)9gY=g&Qz{$%aBtfe!*zU)~t +zUwdx%1@#Z+Kb|YK1Zk$sO)fDD+vjpv?7yv>;Rw*qrZ4_@y++bC*StFE`@qLgx~%SXi+&c;Pb#eT;YiJC^& +z?XsAB_DptUN7_LirF{Wcd>%bsrXxQ8Pt4C-Z>#=&IC?#2yY-x}e?Co~kWpJu(Qr{T +z{JM19zM5XcHg|P?OB<_akFw4l{mI%dXZyr4*068d`u&xs-rinrQ}IFIwaoPE<}z|} +zg+)c&&t=7@hv#gUUAF4Shr{0`+Z$)kme$kL%bdlQY~mYR{Q6qvr_XZsb*COaRGdCN +zd{0$vn_=7c`__ZArv$B;RxH+SnZEx1 +z1}lq{y^+eTNAFd~?WvH=_A}j{C(G>E@O$6$gsog$X`2)G-ZaXOuKS{1f9U5=$^E~s +z=7ZYqhl>oKzpwvgta2wIdG1QXuHEH%iE|$x?GEo`v$3;UvMxJrU)AJ_y*@%y>sC1X +zdaRptLaWAMV~b(+GMlQEZULGlf996koq1PqFv@B<(~_Qd!JkAI=U6NaFf7$waOlA@ +z&8G+3HbjVCD#&S>W>$W0TdKh2<8j8xugrsun5^_1GFTOy9tPWnRV^v?fH@zI+!I{o)V9?(?8_UajQY4er>4~O^v2y^bMcq~ +zU*g`pYtgfoEqq`7Yv1EHf10jlbr$!{ex1E)*RwBQ#O_tg*;gJ*+wIJFK7P-Wi;LSc +zl7D=Mr!@T>{b*3(~aVPo@T@ArET&%QQ~c%FIt!olBHKTp4Lv8Z4J +zlg#U{yxm88+WF-#d}pq(u!(4$ard!$&5wiCI@7pUohm4;JZk;k=FziXZ9i*{9cKSt +zSTSqa!gX554i>$>W*B?@vWY1>JG)K&zozqc|0f+)vN>I2_V{kOT+#P;x##ZfdHCeT +zgu{!S+Y+DrJRN@KxiKGK*d4pQN4v%KXP%XMV{z$<>GI{rzZ^c0bL|Mr*G9u--+dpQ +z>C0h#yzlu3k3u!BWwx>tRaQAUcy%r9-*{ZXC$VYMnViBM5)}pamKU^5pIB_?qbMAA +z*t6q&rB=2w&sMW@i#tl}9vx4Ocy(t+l=6wgQld3SPgT$1epr6+QdIlwlK~quJpB#T +z)PB}fFJzDZ#qeo=(?st-cS7#_rfuy$>l3N3wNphgapwZTns3HQ(~q+pY%6RzsK&kL +z_PZBlyT81jJ-f6+{g`#hZQbze*LVJPOj$VJuKM8V@caYKTa~x2toZlIG)nWB;g&u1 +z#dYT_qRyQ=7peEW!shRV&o7_H7Zesc2Ak(>lkPE-k(Di~C^+%+ChP9EeLrg)@AJ=@ +z8ygU6div<3^z(5GwjA88x_jN@M~{S_+nj#d^|R*K+GusnC6`NOcjt*;Sr)Xg&%o(O +zy8rymarrOGY|qcz`{3eY_JzSse7isVI2n9v+tYJ%Z%ZWq__aE};(M&`_S=o$W!6ob +zv$yi_tAvw>-T8Oy*_E{SUcvKony26IgZyxM@9?G-!+>&^? +z+0!Zyot$}?aijj^=^^J6rW`pIa&Fg^%G=9-ve>cS7M}VxImch7sPJ$%GJE-*8ot|9 +zf3wL*%HFwa51*v}xkUHVWt$&>4y&ui5u3KTL*NlUY#AcujcTYxy8ks +zpB?QEmso6J&#!W+`S#uEBvrbm+ +zO*EWe{Q4TF@8zP>+UAu!-A^Y?UmsUoSjl?eV3y>!gO%s>&RJU6JbCeALi+jm2Wyt* +z-o809+v09`+{xu@3VOASZV#d(2Bo-^VAL1AKiU+iCK~pKe>0uoGx)T44iFI +zeCYV4-Y@%3WIUSq=h4Xn6P0>3GdhL5{P^n&pIufAZ#@?H``dYcr%Mx^rmvYf$>4mI +z*V6f&N;m!23a^}f@0!Z@4FdZ*H>^InT5Y}f1Ld6c3Jpu%U8-I2<>yb&+6 +z?Raf{s^&)Q^@Ho2HP3$i%6t8~c}DQkTZc|}Yp+|k?r^Nd`PJ9c7tYJ)`S9+SRz#Wj +zXHR$QfKbubU#BHX{CqZBJ#+n5!<_BWar^C-uha7L&o6xbF7{aBlGoK+%+_4bzBgy? +z#>o6gz3D4{e}Az{c6qs9<&O`7v)_vG%gD-I+_o_2{*122iSR6j^p{JjsXQ(IsTGG_ +zrM#A4^?QCKcYTONWTu08+o`2j=6OUP_w><=JoIMn)aEJ86GfHZbyzZJUf)>(hA- +z&!|a$u5+%^Y&P%xn$HriWnRZ__!Ax;ekR?RkH3G%u3Zn)_CEXYpyB44r;i@Zn*Eix +zY)eV(`5ME=ud>dnMSTs5Y~R|$Q#b2hh=Adv@0{lqv=QWF>F(VAO>EVr8Qan-e;f3j=4%s{pBz-XGBU>RH|I^hB;C&zrixixc0^n> +z;!2)*FZS46CFQSWz6)&@Kk@cjuv0_v7JJvHD1Hs!%{E8m@AK_!*E?pvc>e5Ndnylo +z@7zCH$x8Xd;#!<3fgzJw%`ZN8 +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 +zikte}<5o^f&djTec$fj$YSHH8U6P +z`@X(LBdV;$L^w1qdzZZDM2Bluix21KOPrg(srskn-J8O1zDeb~e_HqJPt|;n{}qLS +zu7%!vl6O=&mj9emR@RVrNWv&pg+=h8|F3-!yz}R8<~cs)v-0=OHB&eOIXb@gCBAv_ +zt7}=-i;~u_mn9p6f7tuZ6ll~ve0c)6;H#jr-9D67-uS +z#ces37pQq1OMPx8aH&YivsiI~`EgK#@RbD#hWYXqMyQj=_*tvO%rigf? +zf6^gE*Nt;d=)|8B50&NQY}ukC8{1O1yH_=C=e7w>j=mz^FT0QIoqi;D>4KHn(@v+( +zc^>#cz_26AH~&Jqs;ZE(`c{{Qo$Q4tynX+*E>_@EVO?wR_1dXFCHgG>n^Nr5?3VkT +zE@bNewqQ<%h2@Vfqi&_2TB=iY_;bQ)k8X1PpVeedClC>6dNx!Z5-JMl_?&2EdQ^EMQQh9=LF%5^%; +zd38&LdDGjAi`J$(*Vb(-YTFg@a?(Q4qpI0It{I%=I24dMI`)*xW +z`s7d0xl<|aMpAQj2`oxVUR85!*0Qv%LW(6fCy9FPwu!%ND}F=!RfNtqiM|iJvY5K3 +zcpYu>YOiqPazA3wR%SU*S@n02?}SHLOZfzhWqd=Fft)`$Z7oL?o%eFxJ;HJHQqXBNp0ZQFODx~L +z`mCvu=6OO;dvh9h{HhD*H*qB1@N6h{-oJRI^s6*C^D@QXtwKpt-!-Qn+Hm}S>WP__ +z><<~3 +zyk8|^ED5I-Jrqj>*91+T_A@#7SHY^dW&I!B_b=J7;{o%g4O9OGDAxSE_3>45|K7U8 +zAO0AdowrZFGv{&gYR;vHDl*1T!w_r+i4tZ0gv{J;Cc((^iz9)0$N +z4e9j)E5>LH!&Sjzu)Sl!OFVI;>HU3A8)SDFS5$6_;D^bZF7~?hLgW1O{$3g +zeY$q(>D4(Gj|zE7%?c9I?PLrz6wg#kxF*54{%g7xR5 +zv&D?tPo-;LjqCb+a-*gve`rc?i|bWEJ@qtg&uYfcm;7Z`-M+B*N7vcM{u`#B|G2IH +zm&?-gU(KczpM92iXUAscJekYJ*(Rr67+CLHd7-p7tLekew9b70fX&W6)eg4S2d)_J +z>FZ>B87Ojz*Y-}%Mdx6?{3M5NojwVDj;_Gx#m~5>AMjSKZJDuei`9ki*0Xjk&3(4; +z^gQX!xxVUN(>9fe*6dQR$#^^=C+?zCu;9;?wxwF^x5XFg>2`8X@}Fb;xS6#?vg?uT +zJ-(MZB7GSPGi#5%J{c~;cyXrWTAqFKKfn6dojq!P{^vdZ{YT69{nyR2-{ESz`qJMj +z?W^KN^MB@S`hT(L{?VWF4qUvnT+78=fN@(6lT3X4rp0#CwNe*^t9XjnH_06F=}8gw +zUcKcz$G$)F{RMP7mu|`KICzCAmGx{?)XgPRyU(;uvbhnr`QNYWIrILAZQt#5dWPZB +zpg#hlmzI>x_KlFPS!Kidc#qTeox4^VmWHz26I~S*Bx`p_=Y7I0)frN2S2I`(Z+zID +zJMk><{E5#B9t0n)nwj?WgW;cB +zw#~CQTWz;k@xS{WnM;-vbygb0^6V--|9O4fCcFL5UW%Xp@o#?JneFu-7*{_|edZDK +zu>N%V)PE1>g?jE@yhp%Ta`WjzpPNEni<9gFw=ZA1Bu&q_KzOd$I+fCBr3R4<;Ta6NzQ3#&0x +zkX8EalI0;!SDb6Sl_9wkPd#iDKGKU)Bx4UNHtaI +z{aqG`e1<7kJvXk<3T>)Bu=52P@k|$PWai{2);Dws} +zp&Ip_S9!B$bxn&ry8Vmuy**!6bTuDN7UP%y_^ey|j>VJj({fd~;_Xb{tz7X+O8EJX +z-8ZfuyBQ$rV7N7FM_u#ZN8%>a)6cxC_o=P1f6^m%ex^drC)-oCC)szq2v$sW;@y;f +zus+;1<50TyIXM+?ozNW_A8zV6?@zU}Uyz&jW>=||!@dxK6F-_Oj6F9@n#Ex{?cVWy +zThtycS!sVRWxdevz&Y}k#bz3}Q+5_@G|4;AcQ=IN$btnNsR8qXj63K0*x4BQhhNNc +zmVV8lt)-Rq>+6B(`~SA(UH^Qz{$s6NU4ecf%VhtrmYRqBuPxqiYF+~8=i4cw4Fl +z@8bT<*#5*IPW}6#z&Z2oJ-h4vziYpB{kf;Fr(5UMW-HSa&A(yy+xGBP?Pultj{f<#{le<#9Wzd^Dp9eBS=gXv%ll|)i_gW4m1~zbRJq2B +zxt^QgdGu(VP~IflbN`kfwLWT5a-+&E*u3Pf+On6f+)-;DesOqy|2bcQYnRkbec!8A +zTIV&c>?}z6)XOoe`^kL02g-If{l^|1Usw@e*|GVNM(5-!&(+`NMg%Vw-MVr{sA+HC +zzrBW6ZY@~*=LHB{s{DHoq<>OtY)g5w$$r6<9RG=BU&KU27X}`^mv(!)aRgV-+wZD6*%>EuI^Osv +zS{>T%)@pw!;_R(y?eFiU71qo?ZNC2V!~WIUP2#&UTEF)k7LfYN=d2f_d(`&O?#||S +zZg{;OAPvzof*ONKgD=^ +z+3plvc{M=r+=mBK7T?dEq0hHsb=$i8YKqFgnpm@3UOnFwIMrD`ZAwL;+^4<$J5Hvj +zs;^jlVq341%;`DbIOg^QisVT+bsU=B*Tdnsq3LAO>KdQZaqBC;En5`Swk$70+c`FL +z<$9l`Jjb&1=Er~fJ-^m#srEY?t6na{MF)~3`bv0p_?x=*0##ocPxfJ-TKs>L+sU6L +za-z%=^v=xdUux$$`AFZAbKd8k&%3|e>$L()->f;8GPiZ^30b!}|FYL=?O*;=I<%f_ +z*^yS0wwRYKuxH{A1KqO^ZNI$H%qwp_w0L$`mEH2#Gb^T~ZQr->{#&LeJ#(*rQhw8! +zcxn*``(ce43oVSgroO8T$=~_;p<(}V=Xv|~ER$xr#BCF7ctHBmmZ?DtLtPIFMZbU1 +zbMTdv^4??@Vezgr;@_up{)_3F>>;l5^M>&k+0wh0%ybXmIBwRdC${p%oc!5G=Lgs_ +zOgf?PFXpDF$0fPe)){8;VlUt)BwU@iRtk_fPwU=6H +zO-)##7LsvABP;ge71Pqx71_el)~!AUa~}P<$vXeuZ@2lREgMerZ3(jqI2ZS8?vt1R(U&hu9_{s-$)wa^c~>|2+yc{Ob{Rrp +zA9+(?UA +zw@h0W?%tWW{qDoIx&{i}b=+y7zIP+@u`-jgC56maZ!FC1-^kosEb%@<`>eV9`wMIH+KWDX@~%0n +zdbwESrdFE1diRjY%Ev*YfAqAlk6s+rIy!tEkAS0U|zJNccFezfLDv|(RrtMwRBPp +zR!fGzwh;4e+LFlOGp%N(&Ew05*#AG%^mX7X&cf2)e#eyVknikke- +z&!xvZGc)jXilgJju+R-{Unl+i+do5I?!oS2H?1{s3sy^A*PK&5&E)HniTO+-4_QJ> +z&t80~*}w0rpnTo;Y8wmN)bF$7Kl}>cpHN-wY&zfY|Fv?7^kS*UKd$X%{l4SjOLcvT +z^XD>l^KSmfW}FwW&HXpy8-|UR(^;10nl4|oXuhnHF8^llrCp_b|NT@WmU6sn>?vs| +zyis_-`gD?6x=dA@gx<-OX|7@ZF=2Cs#2=-Ly-5$7t|YlBYgIr7Q(j5XkI5p3AN^U9 +zY`|w(yyAkk+;qF$A`Nr0P5<6Ly6eW3Q%U{XW0PMc@E*Npm0tPtDR*DKY|;C} +zyEB5H{Nf6X&}ckTsj*_u`APm-&O*-fX0G)4)6p+zlG=5X#a~kOG6$ +zK0m6CpTjV9VbHhCB!`<~BLC*8epz}=z)aUL^r&O^@*_)h{_L6Qw%WkxtoD^Z9IvJ& +z7PlM^FfD$yEOEoUx&LJR=T8ZY{IYt>qM77G4`-j7%>Os*a{j(W@$rlAc1+7-UvjK8;=N?-8?Uv8 +z{#0$YZQpn}+;rcG?7~!5w>y7gehE)(3YoGbcv9=3>i)0OVz)nCV6|kW^f8aRj)diQ +zYxUkc1_e!8{%UD;qnBQPGt1m!CHHTa_x$+qDE?UJ2fJ>p?jOAxWTtc2ib40*xGG7dC~o4#fpm!9(ZabubsQ2`?AHgEoanM +zZ+da$$!n&)x)}NLZlKpe?Xo%2)uiF-HU$9Eb$2V60P}s|e;Iy +zkAsrbMzQU;kHlO*G(qL)n~8ZP}X#E?+sTLn^u0KxAcNndK&h?b|&XpY!kpU0keWc{t89A$Vbo1<&Hs +z(t;@l;yu44&TN-k^SN4)Z>xI4ss{!CEI5sOx2r_YjDM)?uW(o+D!}|zdH3D6=4Rzrs}d#JOkSwCYjs&U +zFML?qvXAk3s_Xn~aSF9|{C4wXe^v(AY+T)ZPSR}U^?rV*jNh{NZg;AldG5h-+yCx` +zmQ|Y+l61GSzl~A*P%@S2$1!JBHcyqP=A(uGzL=_i@3+`j?sRVMSw_p}%6^?M7EbEn +z4|h7(ayoR~ssKSp@olyx8U1_>`d!W}RmXVwc_yCTxH>1^cu9cI0>xHoxt99*g1T2C +zKI&I`oSboib*IWH6RHh17|OO< +z%PMx`RnzOco*p}M!;HPB{riQ|?ur(#$}JbKl)5gpG56n}`1zILuLpdat=}*1@k}?q +zb%^Ks)sk3Iu9y>xUjFXemU;8-wg~G5wVv&%ie9svL>#AWc(mE5dhV6_Q(lwyb{LZ;PVpPo{B~wj)^av2``9?=qS}vxN0L~cU%Zwa +zB*W8V^y6IN*H4q0quXcP5>YpEdTXm1ax+Et)1>qj5=-u!3wWqR4mPhk-oWz4}hqjq;C2UkL`&s=_F;++0^N`5RO;-|U@)UBtpL;B0 +zkL;ljrxzVxS-f+8&$U@)X3SepABl3b8u`m16(WxDe{iFCRJM=jH!+vnM&5ui!1?7H%Kw +zlg_Cl{}o0p!mhxZp&%SaVh +zjgx6yU8TDtiz_OeZf{v*Zfmx#@fz2jc{$z}a+NX;wqJdDL2R0PoNi{;y>_*8_mqX%4;&p)=kMQtp6gg$R!RUp@ +z?Bqw4)!Dz9pT?aQxIeSwM~bz;qqIgJuhpCd@eb-lK1ehVS$^{r%-h +zoSPpm4w#19feEsN<*aj3S}&<_aDeO{PuG4DlNYg66|?(|D*Nn +z|LQ)rc%DoQI}c&j=sKk$5?hlc0-uYA|vOZ?VL +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 +zZFy5>eJwn^Sn$=Ckz4p|{a+pC+J9;>$CAvo +zlbk1IGLGZ@6*sK`*!ERm0^G(&9fj*EXMjUV0|G +zbVY*wN3$iKdGT?D+p3QKDe&98Vujk-x=(*y#SGdN)z%b0JiJs@b3@InoX6Z8QA@U+ +z)T(5CeB*fGZ6ChVDjf4Ht{Lr|<1)pM(`@=P3l8nMlLQy3nHp-^3Nr@Yu5RBXJ9{>F +zTj7z_ZG~HI1O|N!S@9}-R$A$iH&6J^9yC1tIJ)NdwYxKp$lUrV*u2w~N&Iof&D`y4 +z)~}CTfBj&TcB{1R-8}cpW*NB~%s8G^ZC?1AZ^h$>Vxbz1&qMBWaDHn4dNH#%XpNuF +zzJRk{%We1V*zx4gC$vvctEttn~^~iGl7WMKrZ4XnMgyd~Kv-hmG5!Y0i +z^lxr~coWAFj#jQ;H>`qN=UY85JoSjdy06DAShKg>OlwYp;$FjvC%V_{?*9JVSze+4 +zQ1;ocm(B0kSUh`j_p(y%+8vKWtb#e5{PItID7KPt(|a)aykcX*&JKm;TQ~%{6cbxi +zuH;7_$mD2UbYQcOtC05W>iJ71N$NAbSsXUq&eAgb2%l{Hzh~t&w)Zxy_0RN|OIo}1 +z_SYS$M_(L!Qf>F+#qT?H-(txg +z{{*GZv>!cnN+D;CUz6ajBc9ogKY6Ub#q6y+Sn#*&XKi!*-LxyS%=6bpY-u}sh-Jre +zk<-n}78XA3d+zuJa;s`>*r?uZsJ43Mk$=Ay#2yzEUYOo@wbfmwt?~2cZiT+WyGvqs +zcbYc)h6Y~Ge8abMt9zj2#Ox+X_S4tn?H_jQ?{j>q;PR<4f2GL#8LMTxqb{CHJ0s4W +z_L=oyfy}q8j=0(fP`W~mAKl$~<(H9)e@ve=}a#Swu +zJi}X;>d;dlevj`)-sJO#>gMMe+ +z(NtNj@*~xApG)`8PhVX_H_6<0Vz}Hp`C9vvE#lrg^uH8YzUqb!gm(ctCA*E*%*Bn~mBWhfyl;YE~oFk@@<&oVE54+s! +z())hBGPM8yQ+-bSw=0_;o2&?4WVNy`q%z91XaW1Pw>?K|4(6Eg=Q6zR+O;lo)~r?Q +zoc)$=wwV1q<;RT9lvix|=@t8(du`ngJDLV)o{w0d`Mk-0no-pp{$!S#4=atP%ALPv +z@#t6VuJ4l$erS1lKx>)9yRQqCTVK~+2skDD>-dZSsoc5ATc%012J4Aw9yw$1KIp&1 +z(om0s!3(>NSGI3bK9y0D8dPJo{F7t(=4ZdIN>07PwXFB@!-d5++eN;ntya3S`Lk=i +z)TfYZXQJLsRTgdWIi$VmW+&(5Y#-r9=e(669ioq?s;^h%y)*H9$9-Xw9Gx>$ZzR3y +z6gOYbSKThIEtXa6e|qn)a#;K7H8G0~I9R^6N_55NY)LbmZ!9DC +zC|PRC?352J)n-w}TdW>j`)K&NOzaiY>sis;`*!Y$Gv@1CHm|jZ@6$q&=r!L&rf)Ud +zqA00zJ^cEfiho`D`+v+*_mAIrGjr89hPAI#Qm4#cW%hJoVnSeb+U9A?a-Fx2r!&ZFl@s#v02X(w0?hE|+c0jdai+N+= +z(c^3xM)y@WZ{8<=W8c0dUb(lqxYup*JJRMo?dZBRp+Qzvw^kqToomlHWo&nmJY^-5%cR65MfZzt?R6J4a&3ArQ=>vn^V9_?0}b6= +zleCbMGMATD=U#VYXluo_KT3OTasS5*>nx!TzCYXi-*uInE$sF@yzxhs^|6uzLTpQ2 +zQsz&s@>Ee%)H|2`r!qI>TkhkR+yy2(j5IEMyyv82-t%wr8@uT1Xx +zJK?#&ZUgc1SKMh~zgDhVba)55PiS#L#fcoVbP2XS+jXXUzq`NR|F#*=?s=}4my~i{ +z=R5N{YvY1dT4uLpcjp~n*X?=w-cc#PX2DN~$wnz`hvo2zDZ +zz>nlrHo`8q?gd;`Gc7;WZu>jy+|G!9Pd}$5E^>dMd+9g3NOSAm1y4MdS&C~d%YUkw +zkeXDtXWpGf-y0=+MP>49mo8S3v^dft^vNVuTU+Lk!PaZ8pLWg3Z!f-7tCzFns>>A# +zkbJ>+$usZw;?^iSn$;?vnVJ#hd%5Mx#@ox6-`QU- +z&RX)?w4aZ^pd#;0N4Q#_6vzDQX1b-Z?O9XpCn+wOI?qpc(zlP-qo=GgyegCXYR`k} +zoQf!kP^}poq)V4_L`Ki-Io%|-VY2d*h*cJ>w{8W*rLFZ|e0^;(&$Y(}FFyy}OTY4N +zr*ZsA(GFgo``I?@Za;F*+^pv`A)|Z#(F#Cpo +zlJ(&o2QnY0cujh8P1Eq=%xZ6D*Api<%?w+ftXejW-BxDTBJ<3JEPKEA#2H4kU+X(nF=dltt@pXs%{+P$%E2#pm^rE(zqqVo +zwXE!6i%oCcb_wc;PFtkRoRX^k?|yV%pV!s}_xf+-dB00ldah`G=Wg)hCx;5v_6Oe! +zURh%|nYBeiJ><`Rm8+W>=rm +zSrZ}UyGhMCn{>zP6mbs22U5q +zka&X|2EPl;vM;StlizKT_wxAxiyoW$Z%uEvxreU)V)IGue~>*#R$`CuZ`oBWOwks%CN7jeG=JgoKIYx$iYjdjwtZa_EBZ@JHAwsH +zb-#6f%d#H_i%LqBZCSXeZq>6QgE)=$BXZSCV!c0UP4@RcCCU3coB6S%?)+ARM~+>4 +zL(d%uI?3nKcIA|&u(^xYht1K8V;x+k>J&vXO=>Z)b*$+9y3^IQo0Cw +zY}A(b##wFwll8j|cTG!oD}@KSpUzj-3ALQDdQs}>tBgl&y*KSv;w}<7^EAov@|Dck +zlGx8#n^P+{KRb7jarMuhqidF~%D#53X!G5sAf0E8mUn}{2#Y9$-n%XyUi0~?@SOgc +za!H9@KFf6`8{ITJoY#LWNn%^}FJD%6?k!Ru*DZg~{jgz1fFpIz94a-O@h>b5^V +z`*Yg!blG%k=jXm}ZrJ(?op_<0?zJ@Q!HPe7%XchHzLUE=!1>-Pqhy_c(BL0?SPR7j +zqCRk{HXgF-zAh!5WhrsFs>N;3x#o)x=VS`HiKZ|<{TP*8Blmb+=mg1=*+E>Zwk?}f +zJKZjEQEKd4)7{3Y?o5pbZ)S8)dK0i-x&ud)g*qriq%5|mxvA0&7Ty$)H)e`BF +ze@pvsskH{oaZuek`+;m0coKQTlX{-?MzXglqsrs^~~eou@Rn?LJq+u;AjxlZ9C537LI%r#q1Y8kn- +zt~zz{;KPRtW(3E{^=+9kQ*>&k($5X4J2u(h_j6^Pz_4h;s=(kMh3q{&W@n~}PZPME +zTps>oA@gOo`*BPU8rSlKD(n=VsrAnK?xy)#SxPnLZkuEDBJ`fK9^rcPD#tAOda2Fc +zea~w4rd_)d(d55Kdve_T+JZvaN5xgs-#z*BW|IH^54_E*SI%D6Q0depqB2=2dZ}j; +z>zwyI=dX!&mo3<9bG-U|($f{uMyU@)oG0d6_x0s%U;KVsj=A}q_?(@$H1*!jX;eF2 +za9?QFhlM*`!|Zs4j)yQj7Et@VtT|v!iIY>HNoponsc2EbVaou)I_u{_roC6E8K%u? +zNq#2uOG7nTK+tHYtU!O-W_W*(7*s<{rVU_f?mlYR9Q@i|8)hdb59q#`y^; +z6QuSDaj@E#-MIKJ^Dh-D +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 +z{-ixmGw{z3l^v27PabDg+> +zt6SdVphKNG&da-Ft7}3r3fmd4X`oAx#k+X=B*<8C( +ztW_&g!m+{g*cB`H{dX_i{qiubHtp-FMXBo#Da`y;(06<7&2N=grhDbu7un0MKhay$ +z7^S&m=dm?>fvcM%Zu0JqJw83&?%8ttpRD(7Dx24Zg0e?WT3PgORz6&I;Ej`yL5~^t*$v0) +z7Thnr6SKDR+ga~hm8ab|&w6@M$-i7LARxeQqvw|Lg|D~S1oz0T;D~Hq(^gUOw9DoG +zgUwGLUcA@-rqG+u{>BULlWtQQgA(_A+qx^{I=fn^&QdR3H6fMWH)+>;o;H?cZrogP +z>g5Dk@oZV)Rq8F?d#)c@CFT-hW0-owaH372vhf-&ap~Q<@&8^G?|XNSVYbe+A6q56 +zgoU?Gzmhw%TV3Z>sn^=hZvgTkY?itdm!p?Ei5*{v-eX +zpL0HIcW3flOl$Lhd2SwSblyzup4iXN(jKhI-*{GVSzMCOWYOqC`;+d=Vm9;mg|5`*S4zF-M+IAGCZ17TI%Ug*+LZM+c`pi*_dj1Z +za}}I!*lko}{f&FR&v^FM +z#rmg0Wkk+B|J))afUedR~xwI83KqE)9pJM_l1mh71^ +z+HMD$#rmAoH!Yl`@T~R!W4VNrE4!ZR?l5?+31;O8sL$6q%aELKR9n40sXWoGcwvv;$(=FIt;#A|bBZ}IH?zb4Cne6id9!K;tr +zdw%f$pZ4yD*#4TzbN=<8C2!xfO>^frT;}O@;K#(NyB@m48@w^Ixh=KM;>ek>kkD?W +zErmL|!C9Z)Y7iYKilwXGIFK8+zp* +zope?taq_2`K^nyh_FOGp>(-w)JoM)Nj}nLFD*L)-=|wM6&{^b~>RkL`cgziyeR)TA +z3eH`2>3w(6x2H9VF^|eSJZC68*D;#t%RAH5H#YEU;)atJZR>94@i_kf>-4-Ph_N}r|aKXDf#x1VpRAEk56G=@2tw7 +zant);KHI$#UFX_{JaLI&^@pEXJC(Rj`6E!e*3xSWpG3Caon+j} +zA3M87LiL7}bF}%HSF<8Rjn`*I#RmW8GS)i7uxfLTeqP1Luf<{Q+{v@`7oIz+FEDxjrc8lp8qcIF +z7N&C`1{*DeG~bFRfL*ahhaqOLH7Y#tVVgL&ouXGuDc&*{wU@ +zrv9A$o{F=VS7)#K*|c-!;wg@n{ejb_-Yg7>P55nk|IUG4dxx#stE$+nwjKR$`E(V7 +zVDNdHN9Q(eZhCQ@$J+Rnp0gHbq==pu!-|uaJG^DT)xEI3Q{#I1jAUDE&<;s!(Z=$Z +zcV9Nko0sjjsCJqX7IEC9t9rd|x8BqWBdLe!Yt3|SO-sGKDMNZ%>ES)=l8cj_mzwg< +zI>lst`s{1%bMyA6ndKj{ut-gs+B)w_`7>b|vC|pC$5vDpSx(h^up;QD6w4uHnYx#K +zQ?HgBxqR=qQ+&9?>@&M7{9kPlZTj4LSIEdo)ZF@@;ms;n*6ALTI$NB0=63v_QG4i! +zjngfLK&3^QTkqswO4H)Z`{cWL@!ZI58T(TOYh{){%c(kFvo&d7%mzgnleImunKh6JfQ@`%u)3WB3T5V^iT?{?*K_~Qh +z;N8nb2cP;LkF-x;(P!{giEp`P$J!Hhrz{#c_1|tX@Kw=Rm;Uf+npyaot`e(&;DaZx +z&(tyuEIZfNW?r3rE*oM>c2RGS$<^5`L`*QiD9e>SOrq%l}f4yk0Q)|J*Xuf)t +zLd|AL_P0Huw=aZ&_Pnp=N)CCkv&)TNuHLxl>zhf@+w&7&N#!OTZ8_Bv5~bmlbRv0+ +zXVPsbhsHX7Md*d#@SApIbTWL-EptH%;q5zj+z_PyYYm +z{|?tn7ck$syVm?mt^ZylnXA!qSLPMIso1tHW~b;b+hwcLHKrDQHrC#wuC!=hkk*4E +z*MldYS$;|O#Q9m)TbFk2UGX${Y8MxW+V2l8-7E)2rqd8q8(5YW%yfjTyZ9@Zp?A+gYFy+}} +z`NOP-R-A0(Xw^^NymXVTZepj?SP +z6UOZkm#%25ov-769$>|?q9$sIo&Mtsd*WLImZXcjhN_)UyBl32y3S?KKZ|b_)|X6l +zYwwG`^V;FDg0(+G<=4Dz_a6nt&n)?{i770vs=g>p{hH>V1sAK78dm?b;aI@;wR!8x +z6+Mo#4-~Do`c=goV`umL!&oVN>Z-;GHo-$OEawWmvzsr@TKN7(&-F9n+h`r+n(oHdW@DqJTs&erGKFeO`*^XJQkY8CGop`Rb0cnJpX +zQ5BV09rkPA@+_xYb3U6*RcJNsuU1Xz>RQqxt9me#_&ymX%Ld&R9S +zSE3&07JSuGj15}$yCo}JGefpLrrkG8Y0IKqFQy$0>s(KTuDHm3X!(h&e}e0b^UIpr +zSADtsZ7=WFYxh@*&Xb*Jr+kz*^|?*mj((L%x2pTTaDL>K+phlJ^=I#wuwHiV^(%T3 +zdp6YUzGu*Ky-F42IuG{Z!oLnh#@AI>(*?#ZuCYP3Y?0+3(w=C#F#?h0D +zo@H!(lD7Hr=jqXHPi4=15(~YmWaxDAi08BgF`J8cC*NLpDd=&nfl|^fVHxpX@ehN1 +zw)X5l$;vdzqw=`$=^3?!C(A`ArConJ<2vuItfJLjKjh?Z9~XbdBAzbD<@n8P+P4W0 +z%1<89K4rY5VWyeRthQ~r8M9{H3Ng8L!KHq~swRQ3shwvJJv!NcYjySI!f!XV&m5oi +zEo0)1qzexg9rCKYXc>JfqqSdDZ))*Qu}5!tb!rs+jW%*hiLhIz$35YnQoXHnMyk*s +z-M(U#=5Kq}gm|e$hkuzkanD&1ov=vlYWc$=dOv40s|Nq?ov)$r( +z#os@c{`-G*O`BNmA1-nI^PjV#`sdAi-fC`soSNaYMkQL~dhn^m)1G=S5S~2ukL|~e +zM_UCNKh`ZOIg)$QQ>ao_#W&EsclM<#C;lbQd|{C4Z);X2oIgu#n^57&Nlz+g7Ve(o +zdnRL@NASz2Pj^(OPdvB$O>~G`ROPeMqkHBWW=BT_UzBi8UUj4=%js)vs?VIS6W>d- +zM%>sJ^EqnolWW`GZ?K4Lbz$QVIwan=JmpeLj@tX?0O?#O+l3KMGp!?jr7D>O6$LpR +zPg%$%va&|ZEAT8+ebAf0f5H{ZH!q$e{M$rwib3mSi<+F)`Iq)ysy*^_nwWU&9}mH_ +zegF6Rere4+uj9Ol>2mY*-R;j)zJB;wwuNz$lyJo59}(xG)~#O`@L~n?ohJwHSQLGG +zWGVmuh5MhA^&p(szfB5uB^e#tQn$jQ5uT@w6oP3f}I{kJ> +zN~4GJOEn#*eb-u8H9CYm-+Nq@U1jm9&cAZG+{Vb;OHKCQ;J#MfFI#q{TlJWPTl(jU +zZA}_S+8KV_$iIB^^T%5dL +zWok~#^#yYlRd0RT6aJ##^z-D@Gd`zTLRQV!xfV5V|EEc8PyU7^duE-t`y5g;m9cnj +zhoQarxv($1r}wEBam?ut{di3@YEH`8OQGrNyG5;N!C~f0TYPm2HCs*N7As8knw3>tdQ!gbAOD`uFBq5i +z-+O*;u{+P>+Ff5w*{4hY_~e=Ma>2lW~wk6zcPJum(e)6`RE=S}RHX>@qG$Inkc +zD^D8-{JO2V=jmo6-`~cPHj)>ee+9;6-{xO2bLq-k2EXs_zM!9R|Dk-uDD`q;>9gne1$nBel9jN{3G(H{^t!2sgTT~;E@Fd^x6OD+woa9 +zFE-6llX}1W&8p|0*M%?M9_YAZkDt=Y7Kz!-JeE%mFP(Mgx54=fK62(!c8Lm`=W|#d +zvxvQ?$#TxtX_-V^Q1Ri37bpMbpL6`4$Db@ +zg>yvRQ`g*A=CR^LUt*eTXeejm$$39N<@D^Hut0yhR_)(M%YvQ-KWz82tjt*5^)$!t +z_LY!{J%)v5%N;V;nuMy{YPmXHXj@7BrO?}1X6LWPnB}jqTem_?_ulc3mGeX{c}BVw +z&euvemff?yfnrUO)5Jm&2|0K_O3q=L?J>>aT +z+rEvjw7Fe!rHuH)Cd|v|Q_ys8dCv8!kA%$Ys?k+doU;pHr|i +z$1HEDsSe7b{53meoxGmhELC;st?v@qe4#MLF!eW=#_N_RMJ2am=X|<->HV&ivou@c +zvyXnvI%ZwY|KZ-}r<;q{S)b0?*b`>@WQiJwiRIO!f0wmtpPaVA>{G4fql6;+mlwo7 +z%c<&!w#NMYTdMZ+Opy7DJ0*9EOr5_;p1yi!p+~ +zX`Yhu>%$K{5L(LmC2h*11-Ub?n@(kO?n#br?_%9q6cJ!X}fQRjXGq|GR3(wQ#mv(ngn?i%)bb +zoZDL5m$-#z4rL()6@B=4@e(Y5jzw~G4zDsKj${Q>vQFpI2X4Bz^r(%y_eX>S;Bn&_DK3Yrb50d8YGd$VsQE +z+@^y4U#`n5icVT_#I%&px^KoRx0QVt_FYo{@%HV38}E&#cm$X~PF~wx?f);oPDS*7 +zu=LqgxtXgjh=v?*Ey`RprR_$5rOBzH2gb`zd8!}z*s$>a+8>*Cn`d9kUuXE)An$I! +z-B#1W!hoJ{jGm!d+m`9?RJr&niSzK38wx(E{z`|`#8jS!RXtRfxz^ib#__;_ZS5jc +zPlFiEc;@tF&`Ta4A*LMt#&XG*v`l#^mRZYd?g&nuvt!=tc +zvUpiaj!}%iekjl1hVpsaa#z0YTK8Jw_(Y+}RW{GB%Pup!@>w+WetV^qnNuZeMW&6; +z`%9Cb&z)DN-xIj2?o;9YPvF{T+?*#JrSR_ +zYKh;C+p?54+dK)^{7}a6GRyNwZJ|VRso%sMbH5w!k70Vg`P7CCX2s-^ozn{Y+OCKE +zND$r2a_y<)C)TOgfASnr5qvNE_}Zq*;X)7$bC#Nf&bXd7X{Bly +zv&wz#GL30$QAIaWPUU>kJyADbC`!du?4^M +zd9M9i*U%$&$)U;=4IiIJ-}KVg1*g<53IBcaxVLTMF40T}>5tnOtYm-BU&edUs^so1 +z;Twe|}PFlGt`wz+={~zVNOUj?*9CZP{}oOyl?x +zBbT6~jFU^f1+P0*2#ffyi4F7=$^9n +zVM5%~D^{$hZWi#VXvih5+&t~>(YD0f>=kRB-=Q`)1Whhw|sH7vpm +zeC@Uv-Vczl{HV!o{6g6|V{URupW-&LD^>xvR(fkJ4s8lIir;(X)XkUQR!+~jk$1D8 +z`G>gX;iHj3?K_^Nv}Z3}HDNEauGkJ9RUeZEtyX)zG>t%C_MJIdQ*?HGim+}Iy#BXg +zYv0i!Q`}1yWg8mrs|8?&&~aM +z?eX)T1+|Qmswb4{oay_K9wfZtlef3&4AYk5Mn-(HrFRpya2}4>tL}3`t8G6An{aEd +z*S`h+>)JPX{gm7LU4r%Ww#2ybM7zCTSh}9ya9pt>JV4Zc^Cvy$vvGHB3h>?tHwUGIoY)2xj?LvUnGxu&$YHE@9a$e%eFJd&Rmgc +z%sX#QxX7QAXHKZJEM=GOUwWh}byI=hhV$oR4mm{bifNctm9tlLyKchX3G$wn+>XNQ +zmv*(z{n5hOr}=l4(m(6IWC_OQyx003mfm~Vmg{$D!s=gp+**-t0R%}Hfy4(40Q +z^ZlHgQ+G&pL|JycB%0wC}adKjJ)jMWoe)(_KG!7iCnreVTge@1$nU>ght(dyelqz_vV)<%pcF +z^L(9p1qYiK751kdPxY>xb<<8rG$Cw{Z*IhySyT9DrMqkBEHpFt(dlU6`^RRk*Mvi_ +zw=(cbTMI8)%d`H%G=tZ{ItwPg5<5AKb5lU((uq6gq`vf1Oy-y{In|rvUiY-V!!Dd+ +z8{`kU%r4|{UF~+9vD0h0*6S;((bGmeJZ~=kt2L +zPO#mys3Pf;OiK0Ms)^r{la!U@o9_CBT3mh}2D!pJCr$~b7=`gQ5twD)Dl};+;T~j%{ +z)MCY_7nkD}xoRkLWtr(rIu{`pv;69;Mcf-7e7to}bYJu(@l^s}8f@IGlYCl(5})ms +zuXcNBJZnqIPu0fy>E_j0$0s*MoAGupoA>3KXP3y-G|@i0FPk~Jj<-K4eL9Kh%*yF} +z(zk2X1md?|mKTRyXRkD6xlGj{j9H^HtMe4b;LLAEltM=fa +zQ;QZI6Go;+urF1`zr14HMu-3<=*k^Y31jd +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 +zY;|66e#7x%W**16AWv^ +z=;j?3x(R1%=XOQ#pX!nHnEEfkOXRyrG=-km!ulQSpD9og+~FTHc((hw!t?c2*=I8C^08T4BE&Y|FI +zw{QQp5XgTo=fDyZ7nk(=rT)iPS9`UpDt%p(&lTz%n5o2eDCn5x=IBoat9I;Q@H$uV +z=?T~CT@UjAeVhN`ntS3Rd*@x;&TFv3 +z?{b(?ZRBT-{!Q{-Z?dkmWS^{f{?hbX(3;e%2P-{7GICdD-A+38WMyjh*<~$X=9%AD +zJs7p^<(!4zt}@Q>QT1)O;_*~gl6Tsa%$ZIsYc!YLW62HG`L<|r`jy?6YMd@@_`ad0 +zzoz|h*CstF*6E_E=_+!`e^}c4&u)xdHDS`yLk(^ZElq!U&E05i+<(yYfQn*T3(sEX +ztgYGoX4Ok1e_x+n$JcRQ+GFz=)P53jfXEwlV{Ws8aj +z1JAlBIm|Gt?sF#P{=-u{q&-B(G!=&QM>m4qYH*6fpR +zsl9ye%N8RUUL~O&k#28a2%cWtY;7zUBg_Bed;K5Vn0TFvudmon2NhV&FRZUW^z)(I +z|7Ydy +zW9J9To!XJ}%74Sx^Sk_GOpW{*)ixM^WK>QSe-d=zqGRu&9jAis_}-fRGs{zd!%4IG +zul~fgEl6?mW7z)lV87bC4gBocHqWIVoOvT_JINz|b1-|yhG|Kg%6{qlvZNb_nJ@V0 +zH;rwl;OxXK-WdfJI=lYe(96yiz5Uas&TiYso?H1T@yeXCTII@DFZWwC@c*B8eSQ9i +z^Y%Xk_x-QFfAs5B)409+T-U~3FL8FxWN&IIZalJS&VyCAf4{kVH>Dy`z1c%nV<*G= +zy`N>|_kEZ7|5pE>)co3iLeq~kZ@VnHKL6dv#q<9N)&I$_7YECKIXwTp(wi@zE=O}M +z$!lZJ2x(gR^=0%o$G^d+Ww&m&u2fp$vcpPj&CCn4zixWGd4}*7Ro%Xp?e{J$ZSFni +z=HoHxLC>6P);lI=-sf>&>bC6rG1fV@r>dqsj-Gj^VmC+B+Y{#;&bLVzZRvY;>0*@Y +z>hzH4TQhp1)j|)y+N5{FyVF_c8Eep^h`NWo$$Pi&JMC0vVm|f8^|-}BZNDr^Dpa-_ +z$WAu&O4&WPEJUZeVVc!%B>@JDb=?2{%Gb)@|9g$yW68y*$M^r?ss9)Lzr%bx|76GW +zy28dCeG4D(KKNTc@A3J6U-&=X`<%_eQvSTn{{QRxBldq!??3i^W6u|>o~$C#UI(_}eboqZ0mg2Fq#m*(2T4I>xxczAX)3>jh7iIktc3qxV_I_W( +z&td^Ref^0uKD>I$8Q&pq#Yt=+k>;W&@nf6-F0D;Ferm!{;*-ZrC+ +zqkXY~;9~X}&-GL4V}p)eKFyt?bmf-AO*X*`6NMI*x^0?sYw?X8?|c;=3TdUoVWRRmHX2>p*R0n +z{WW)UvPjzcG(<^XQ+??F@4@zue@+Un&&&JR?QefM%vqw@eQ)Kin6rs|2l)BbZT9Xu +z@c)zjU%sHEKY#h_8+Y%H-f}NTB1Cz$+ug`^HLm@PVK=Ppmp$!0Q+|y- +zJpMlaq4;~-!>4CU=gfOlwaWeXtqZ$3Yj^E0u06hcTa)z7@YuvV{M<{wfB&ukO0GQi +zKaZ~8m@6uJU{gxX>)G;(>BpAu|7TORu=ofsr$hbAU5VCn4|P_qG&sSsaf7to`4 +z_-3gtZCRQU6EAb%h{gQX^Va9AWtqMHRoT0m4>yDFRVFPmUn_j_eBAYYn@(45TP9_6 +z#PjI6ZCocKZzgzp@78nHT3Vj#zhm*4S#A?K*Iue{$el2|*t0MrYVEF5uQw=7O?fHC +zdTDadHaB&)gXU$&-d4N1>@v9Y+97{k+w=K%zVV!OIq%(bR{yg3o0`3MPh4|YW})`N +zA~*fd{{J7G|NMJj!(9JoZ~o)=|DUG+kgxyDJm;KqcKZGMpPbEu`2Rn8J=^@p=ly@8 +z|D4O;+kd$5VExa}`w!{Y{p{2Ykk!0x=i+{mRF)Qe(0;3eJ}OdLjHX{a2Rnn==9lx6fJF+VmV<@o{qhrG)>l +zSeo9wj%9YM;ofxDOa9c|c6}EXriSbJ??1%B*zhkep;<0-5l+y2kiW96dYTvzorW^Sy^4P3>8y#=8F+{jl>GQFQXNM_xu{`fx +z)0nS1yGmoM4%PjSdN`{4`MCF_4b+3k;t&)cAAK3rhzMqld&Yqp!D=g<6eX;**hRQ~zg|Bu`*8aF{YTX2*LCi`-1cGB$I3^FeD0U6 +zfBnp1uf6i!h12iKJk!)SdA%W5W*Au->+ws@yb@ty`0Cn*rCFz*w%odPLAEzNi7D-& +zhQ$HbMeDSL?maf{X;$x&cA0uL>UBbvho$?@hi|k)W2K*4RL@Rm@l4QUm2FxZmaV;n +zfivi&$I^&>dN0DRY`oj@aOIJ6k^IV~%NP!av-cZ&Fc@hzPJ1RGQh1pEV)EiSb2o3- +z=$W1#|9)-O`U#iy-tOMN|M>a$@0)WB7B6bFwJ_LZeZwf#xr!tH{+?duSD{D$Sp5oC +z?sZ*KeRz?rE$@aSGM=+vWth7$ZOE0b`>}Yw^MeC7Jf?q3-Lm|LiCdl8hV(7$Y!k%z +zrpPZpE6gFJ*;j43nsa!$B*){&JzD`pg7k?UaPtyFqlp0n@3Y3yVIGk?@JWUPVW4A +zTxRX;&iA{cwD!GPI`v5Y`=4)v;`&Qc?yGXJ=9b5O{JW;;_g#&aCtocdepKhK^vX~C +zx%J4C1!gbUHkj6i{ohx%%lY;;!I?)>H&vcm)8;VcdgH#Za|idDs>iJJZqWPJwAC!< +zxo=_bq-AC|M3&yw+-3@uhq+AFoGc1$8j81myy;|GI(PAj +zHNldGh1=^+oV-*0Tt+dHV{O=-eZOSp6w4e6w7U3Z`d>GZ<*Uz@Ug7w3IJn=l@pwar +z64q$~?u$h22nUMfe1h-`nl(%C9y|zi?Ww-%Toc +zf5c*e^d~VF4j!C8XF4nIPR`$jk0rWI9A?ejs=fRCE=y*GOYa3$bABtyZ}44wdmsCy +z>q6qw_#T{ow>Xi@GF7JN*ufv?KbJbOY&F{wb~V82c+;XA4sVl#jtE-F#C%Lxymjuv +zxt9(uS#{6vgP-P0zpBrtaz4#VS<C2dX0OB?RR^1lsKI0_?j+k@x;Vb>8<_rDGqC$qu6hA +z8EuPg+gpAmYGSa{^S;k&5nk7xpZCiQe%2e&wd&@)u8Em9H9nr%rMX>I+W*s==3t|; +z$jjLRuic~gFP`2$$D1)y!!>;8;XcJ=e;=#T`Nl_7zpt^(dm^{?P)G91M-54{zrE~v +zVJqNweV@r$vFa*SRhc4pPj0`^FApPC3frt(8P>}(UD`NJZ{78m`!5%K-hCpIT_a7@ +zHYtgTsjbl|jg$XKHmAtfyX!aHla5$m6MW6=_|3WJ?th7X_J2~n+%3kyex2GqN8g#& +z9;&YE=M=d4a`vy%%92mtWimJJv+1qx)}FEM_-U3!6F2^_ol;qPSW=gERTI#h~+kL;Xzl=#VIR2LNmqgcn9`_|* +zlwVw_et$No+w2v?1l_MD^~bXuHpuK(Ke$juW;*jbt=n~P_#Sun9x%RyWANiO)*5GX(tap1d|u+{5DHPo7@KsJ%I*hhihD?;Wu)(98>* +z%B&fC;ljj@wZaQteY^`cf|NgmTZ^W50x?$x0?(pJn@E?1wU#R7YMcP-Enn?<%vT% +zI?Z`=_FQXpW?LtI?5wln>zki0F4H=lvXXnEqHhj+pW>toQH|>^USU2mXQND?N99H5 +zxATmvyktInoRJiuu!?SLeEq-q|s +zwG%uxs2$wQ{P^kI2MeQm{j(yv8eV=eUTWi~$eU*Kb>>4S2B8_;b2=8hx}bIOer2?V2n0MAQ +zf40lE*OFY0JQE7-a_{f#wS3pR{FPvykc8NNzTUQVCd;lrnHcbBvyW6xVoOy2wi_v5 +zei%ppn5XnI!M`!#$lHTbtuhKV2Fw?(r-Z0vozOXPM8jo=SI_FwgC7ex4!)cc++n3U +zk9AsY-&MEiJRKS{b84l0x6ZW|+_WOERH@T7IrymeD~6<1N*_z6yT@OBU-#|S@@}vD +z+UF-HnQ49bBdhAtZ(l8V#!`BFU-Dehn%8HZd^;%++|*mW!pv%$d$6cKe^a?0OaA$$ +zwfv5E@0pZsal5syw%_$X?0L5r`>Q2;7B0RU@*|^2O73_10`hsyGB^_aUNrG@0Be- +zkI6~=R#4v3P|C>@zw_*6#;>|1OE&d#addj#oK*K?j)Z&3o?_P@pB6r@@xSqFUBc|X +zA3ttcEa6-7=DNb{Z`+>!t}ZF5yL<78TWrt;OD?#CRelR1nR +z1qSq#R5+zAuWe&iD0P-|xbpbr&zm>O{L(Ioe7be|yhN~jliPI`Ro`?Wk#`jv)oLE^ +zRsZp!S-j%kA5A^IK8q(UE*H-9NX~5BU3RQ(;!@M>WS06XKQ6DZ3h`OOqpZmy(50_ufq60Y|$-qy!IC68jI$ex%{v1 +z4_R`3b!}RA)1`?kRts)=@Y3tYx8K))T)Tenu=V>r&97H;ud!Sxa9~-Pu8N1Jr2h6= +z=c!_SK2_JvWL|UX``K_ZocA)>G*P|hxyTKU*XKKW{~a~na^-gDUyXljN|V>|Z8(t?#3N_pirf32w5WT2`1+hn +zqW0f~i@;m-yg3BS!BN1$EjlDt_ +zf_h)7J`(X`GvXUZ#}Z4$+(kaN@I0kQ^)?&q+Ir$m!#bJa*n;| +z>o8~&^>I9V-pFvVq?g?dtGeCnss4`AQ&Y~IC$=k72dKZi7 +z+SwZ>Jz~1%{xBtb^YXg8PyWXopQ7j$w#|7T$HTeY*B+h-Kk!;>h0iW~hZr;E1HQZW +zO%&>7b~@ZvW>@{|QU0fQ{TgZeSH4?(_nnjVin_yp6{7EFe&3n8YU&}4Fa4bvU%1P^ +zYj>SKIn7pgyU(F`Z;M4AcDz~`V&Ks9kjo)#es-NaL#I*tpD3Ny<${S{H(6}zRAe-& +zJ@=BK?&)=#PxAAx$jn^2oQ0==U3R9mn3#>VP~G>%%YWP}-`Cb}SHpjPp3T9hADOZ} +zPY4tQGntj{UB2tb(nk#~eg~$N-0zC;_m}<>XV&}q)&JhjS$hkozxmR0^lR#>g)8IM +zopta1JM;LtUvc02Z!oZ&&z`GmP_T{Bo1fXF%;)v0l$<2XSQl2mT+K&Q*0TgKGE9+> +zbgrm~I~XhU@UC|5ihpn13NBlzq;qhDHeCDiclOH(XPDfp(~i}ANb7rkp-ob*cFF4g +z%UcXSbgU|Fxh?(fTt<5GE!WxZeg}hP^8+tj;p<5Hb}^CH;b4|=u#>#$J&$j4*V~@x +zihr^;lVrOh*t0b^*)U+q`^#U?f4}vzsH(nV*Y=b5YMPoC?cKDSHL>d!Ux-c9ipG_X +z5Af>i3Dtei*8fm_{}+dR-3PmQw$)vyySZhG4jy7LTcy(Bn3>|fu5Ht;-(RLEtkIb^ +zMR=0IoZz))8{KywoAUQc)$EM2Gru%%FL8Ns{(O9AFjrWVTlS6Gs^5;bXPh5|>`&XP +z`CCB1Fi^vrarfz(a^)4PrhB+COI3z{J2Z9O-B-Nw%oqQB>%1!G +z$4n1f)~=MxSey3a?xhg>AR~FFS$?PX=}qSBoRj$Lum1jvEbrreuZk&gEz(|{ylt09 +zsl4Rdcm5JLnN*+lADVisE%5E8>nnfi&t=G5@PzMRaLYbs>pu=Gg>yEn)=y^(y1S($$%iB3~uNNuVl`gz&aqy^YXhceIUlen4iZ);U_1EgbLH<_?&&a-y6RmmvSp3J^ +z{F;vbd-dY}^X(2E{n(+JZfhKyqq +zPfkzWvRl%?twP?o*vv#zZ@v91;RK$3F}8cQOyZp%emWms?Y81fhPR{Wp)l6y($rMP +z&1|3gR@i+1+_W`;Pod!INv)J3nM4a4$(J0J=laS8PVw*je}$uN_hYM`lCGVH)(9#u +zQs`xty04PB;Ys{-mQ^>ZHUpDB$(xVmS +zpJXouZq4Sue7#|JcF6D7h3iZXXE|*Bv@C3ciO!XeC8;%E9&yG0e_^@r-$Uz)_eYIm +z;$t5r#Rgh5RtLBB*(-Y|>NYX>Hn1)6J8>wYidpD_xTy=1(~^_9&1y$Y{%^V0)6bCN +z*W9~6cGj+Cx4TV#y{$D1Q%X7TT5GRlS03N1TaQ1A$zS5}_3Lja-J-UHJLudAOX>IL +zj=NM;>|ZG-c>PcLY<1?)8@E}TU20=Fj{8)Ev6|nO%y%j9;`Z`dk!^Tt#=5`vxLJM6 +zS`3Re`7imla!FeKzn`|Nc72~O(4ysW85zMncvjh +zxXIzoW4n)=HP;=yxx2VP=9}zQI~k6`#%^2Dy!Ufz(k3=Xb^Q2Q5xY9rmi2qH_FCrH +zx#g3W)trxVT-#LTJgqHR$Y!_3j~{#0f4n$c{^8#4^B?})G+nn|uOLE9C7{NhaY4$d +zEHlrCY?`6H(LJ$K%^fB!5akQGJ-ua>Li3ToFZUj|<5uCE>HSvc$Kz|i56^ic`TfS- +zg)cNsvNx-`Iyt=C>&_i_d6$@1(3xp*lA>osd!i=`{>%wkytOa)wPTU*N%e)AI(AAi +zOFB&U?3%%I=gbs^{12BC-cI;+Z4yg(WI?ol#bvE`R*zjIr*c~fMyXXuyq?(e{qDlz +zrftjO<#Kg)_6Yf`yz%?yp;!({HrL>}+~qo(vKO2WOkT3=Tlw>}r2IG5v;Unseda;O +zrqDmDKmCw9E%f_s_;yFueF4ALV{O +z=fm#uEvqIrSGhYKZ)6S6KJ@uD^S#P{EbsUJXF4BmbM)$0RlRGh*~mPXK-R~2W$BVh6F2*MNOWA7@BQyy|3NRLNQs`Ni_E* +zo4@~`51ukRwVKwN&N+8=$zwtGFvdlKlC={`%-vKDx0Ia@yu*@WrspH}E_|-J)>NQ|L8&?B>g@%MQ-ZcQ3K6Pv;7n!%bev#NP +zOYEoBsuM|v-QTcHHVdE +z&T?&^#v*%QW$B%H=PIhJ+jqCKPgav)FJXDYc(=!H(Ghn}6UobS?mT{0cHd~4~L5YL#gX6wVA-j0mP7g;x$2qbOFao7_tvwo{P8}o^c=XaSdnE&3< +zbg>M-#X8BOb5c9>b{2$R*0{c8Vb`@>-fMCX9G9K&ET5&b^FfyG4x2R31wMoy5#e+x7vaMSMPTDuGC!c#A?^$f0bL_K61OSynAvn>yjfWF5*iMuT1H# +zpSL7)4Ws#9<~K+DFY-Aq+H(IO(~T4Jrlu~Cc({72R`>Dpk3V1V6`Pr4R$OhI;@7%@ +z(O_Sam*i8aq;{P-bCv7vOp^1sGpFqAjfK~8$~Lf0-q*9d>Q(B|w#u1DRus;%NxOE- +zm*?%c6^aQ3dP-@dbD*C%}YVRp5dp{?t7icO;7x7jjHRe!Q~vG4x# +zC2*}pZRNgXk^5GSw%_i(dlIsSW7^I$ZOXgF)z2HMH!xhvJ#Vw@N|E2R-kJpa=kwQl +zAOHJv&E;3Q2cIS$j1m$$Hpy?>KGpQQ +z#H&@?ZeHBB>{j=O)}EUyGVPo_61*OJ94k=s)qd{Ywe|mGW@dv1jWxyP98<11u)Xpz +zW<1gglySP1@}o7Qr&Iq`p%t+k?+;U!~cUn_r2!x?X# +zTtD2-&U~{n??pN9^R)o^^*)fs(THus#DotVGQ+n3qX>X+J!=%Ynvo;^7! +z)9iNH!7_7}cFVF*zBbEhHxXGESLa7dCSJZ>yS6d%d3N!o$g4JTR?3Cj_O|?b^31B> +z3v=$9m0=;T4Yi6DT;HlcGfS5ZI_mIdZ;H)}9f~3q30n#eKj{7P=IEZTzX~2Vo|vj` +zIe99rVNp}wj`gDP`}Q86p8u}!dqGf{jf{?z&B>n=`gMJNUpb`y`S9+Wrv2}(i`-TE +z#B$B*D&ILn*#nnP@TBZHR^nTnWpydeee&C=V8FgK~Zb-9d+!?#F{O`0j^(`z() +zs?HZiEH%%$E&2Sj*hT%Pd#W9BGNqR*sv30Pw6ZW*ZdLr(*+j?Cf#tU9LdHY31}gZ8Zs;$HJVx^~TJ +z^KW)>ZJYM%DIM6hSL@Qs4O{(ARg{!0XIs$q;O$|_=TU|Cq~^uR9Q4sxBR#WKlIPel +zX$6O8OWLM=+3)RXp~ISeQe)=ECrg@lp4s&{c-ds*OM=eUZ_n?$A?7T8EI8o)9+ejv +zwa)2n8}8k|$9nRd`+M2wwHn(5u9^S-r9YK>E5qb9CPIM^7=@brs(w$JYdh;#OO||O +zwu6iHqUagPH8?(60J7P-@^+)lMxtdO~u@v^12sB%h4E8`?b +z=c1GDv9Fg2UlrLM$8oA#>Y%}<=D-uaz4sNxL<5f}n)vr0-hScTer4BZ3jDwGSogc< +zXjS}cn|VSlxo3lZ(rK-~zu06iD);#)CtN%%>bTx?PT&;DZ!y*^(eHQctUs{R?9P1i +z82K<6@w=ikye>s8y6IA5lecaohsVvKPj`2vwD@n5~Yu;SL%qiRqTLpVh +zKIe=rKI}KGvMPJtZO>PGSN2q_W#HJE^5oGZv3onp4VF1txu1I0`!O+R6Z_w?k~I^% +zET1`swYRD?{r|8e`ZD93>f^6}3)}6kY`&iVKItI0pyEV#2lFOHiPwR*ON)w5mQ85i +z)85fw)xJGc=Wv9EaG~N2mAK%unF}wUU)J=m(3HpLw7Tsq-@c?f$5x7!JYKxl~e%tomx$x71`9V&g+M~#*Q(6t?_hJ)HDVE(gi9SDD^0C8|-MRObs{a;eSJW=o +z_)-{K5W_WX&cw-XyUuWWpNj}Ol*H!V^Fr5omZVI(bAMXrj7>9NeDK(GHhkBWZQ3W2 +z7WfGNtrmBD9ojDZhGnUf)=SR|R>q~f&F{9X-@H}K#A4}_oAdA8KeFtoiDgCTmv>fd +zH@<(r_PsPHJ;mIi@q1^AMjCs}?ZES*rK<(oiqDyC>c5aH8Drh;y`=ouWw&#hd@%}( +z!uornSPwHCUV0`Wu78En5+<+bQH9m_J{*nit=rDee^Fj)@?Yg&KX_6$9roPjZ>Vl+ +zC+=jnoKJnD@JohGZ?`#_J$^G~ks^0R%Cg2KRa|!KYx?e#)ZF{vS-ifxUPr`5}}RqWo} +z%FWheH3(n&_+8DRow**J8=v%?{<@&%{F`dslV)bCKUxaiuV!srn}6M;R3*3mhZozj +zl;)>p?_GMjG$*Pmie0$%MS$^ygTB}QWM})=VWB*?U;n$OIK}P%ZJvOWnwHDd%bxm9 +zxIX(UtE$%?3*k$Gldi1N%#u4CCAQ>d)2589%_3L0QohwhI9+05+i=EL$Ck(LQR1VO +z!cO8ZpDxKZt%@?@%lNW9Cf?ij&D+Cm)AR2=dV1UXj@_I<-SQhN_gkLIWM~t=wM!zj +zb#c(S2(OQe#Pp=@_{yFMs=Yac6RkP=x)? +zRa^d^vGAyhVBWN_vhfMe(${8-{Z_@5D%o)FL=ke9s%XjRpcX)eOz&}BtPf*FO +ziu0P6;wIHeuK(u=Z~A+)ao(-aQeDGLbB>e>83vy1wY4#*uGb}u|oT5&&dn&<=fZwr0vgCIB{$B +zI%hXlUQTD_@b`=P#ViyXm@M--C#W)ew;8LP6%(Ts4 +z_`Is#Og=Qb;fckZOW9X~Rhr)H+A456%EawX(a8s@3sn~wZCJ*6V8g8fwlyZLGJVnI +zMph4$wuPK{KQT4Ja7$jhv7w6Ltx1Z)4 +z4sGPC)T&!^?bBhg>W8wDqDFbkAG~|mV_yFKR>pqohcTA8cSJhumT5ee> +z@LgDxEzMdg-Tv9udGCF`q^dM8JYTr+rdqV- +zN$D0&Y%|%FAh`Ma2M$Z&hD9=G!yE--=kpmm6=&>BQBj*RX@d^yN)Z#K5H_*ZmoqL~mZountN4 +zp>*qUX?oX`eX~AJSUUM~df@Xp4DOkUUP-pIFE5bbS1RT>9kj+qVa@5TR86igB@0wS +zLoSpmZTT%bgE8|;@lx}`vsc~cTdrwZa5`3Kpta{E2+y8T-??_FNu=WlY`zt6r_m6$E{v+a93 +zZ$QwS+1lO*6JrCtjy>G)BJR_afG#7WBfo9ZLb&p)FWWD?sS)0HbYj~C&c%V7eGD6O +zT$bJx*pgDN6E|OhZ>M~d*zWVH0jFoiUVD2%#ZT+&#pB-|PweY#6t}thscuKRinXBj +zZ_Xr5lPerEo8<50>bU=$yLeA|0{fz(hKofTnxEWcpX~iB@Xqx)moq98Ji?xsOn5a# +z!dvr1WcI}%E-ybvUhC!wlebNsbbtEF3E!g3nKtWgykj`~i0Gq*HD_HiIs=3sH*%`~ +ze#q1Cwo27_iS}gneKyktB72kA!!Aw9={vL3#jcjS6WH7;-ezcIZ2ut3Gx5Wwl&z_=jSSdRA_6zAOLpOZ-u3&kWd1w(58uL+ +z@1?zATYt3Xk=-l1-!VBG$~-w=2W^n+%JP-ti@4r2$J^!3rVN%lIgF`ZoNGgKuKH-b +z6iD0Jx9ZK*Mct&TwDVX__FVTAlQC802~}TxcC(c$&lIyu>5S)0GI#nor99(mnxQ*O{*d^w +z7q$jAjuW*SID0wyWi7gosPx|W$LZH|%W6kif#xWL!;f_g}-(?@Z-7cK>{{6=SD{b!OyUxv88ve(_t4}~`d=ba9xV}|m%{SHR_cx+~^Jf?LOm`GGQq^ye(-8jd@{_%`wPrWunhZK7 +zai06AvU)qa{3W#ym1`!QzQ*3h5dD-vdj^N<%ciNH%dRzNOmP)l{!=j{{+FpYfA#fS +z{WY77*}ZPfwyQSV$E$yf2$of|lPCeRV%7T<+n{q}8I&qe>+#Caj1| +zI=5$4C8xjRT+U58td$p^y*PT5vHft@;l!gso0eIg&iZ3hDzH>#%QPj6sdJpH)t9%- +z(`7v)d5LxB3w4XR*;n>X{2g8RR?6lBZ{U(ETXV9Q7c<*=%JdU#J?3tdUKyQb%hxr( +z@kmdqrsEei=8ht-tP++ds-co*(TRzBd+yD==BCNZTyp$u=Rt2iK0U$a;L!A7 +zE)DfszB9k>zh!CpVumiY3g_{O6P +zI-h??3z{dAx@pn5D*hm^7bXmr`qp1Mq}{8XcJJLfarg3tPco*zkH36)+t;q(+#S^x +zkH0-^xm|5~NR2ro!)V#Yzm4V927&)Am-5d0rxEbr$)gWf3NE;2OQmkg(AuoS+Wy$F +zaoU^>YqvRYoJy%Q0~I1ktN&%~x~ZJRr7LGB#wPx5KVYXDio;&Aq$3 +zlac?O!>;N>M;0D@WnO)I+Y0aJhy5Q&9FDp!y4BPmztE%m;J>q1FLrK_x&B~bnWV3I`HDbnLzGCE6dxqbh)OxPBlGzVP2fs#r0_`mt?YcF35|vFy6Fu +z&B;qK-_CGJDOQ_n_AELuv)NlSQ+Bzw$d`P+I?h?)Mqi%ZPR#d +z)Av};Ey&#TjivY9nO9S6u8MmwL}-<)IdA;jMpE5%)y-MOVZG74>zI$2$p*fSIk;$E +z7pMPgw!?8MVwXx@o!Dx6dv&|uQH2$IAMOjgbI10>>)mV8-5I1N+pwy1m91}N +zkZme6aLS(?+ke$dPv%Hx^7}wjw#oi0Crj?_h+r{g+7@oGO?qywoBw9V*-S6?Wkx!- +zsis~Qxm0@YrrG(vQjTeMB@MHz+)Eo+Yi}QVtiSZemLB)Xa%-k5@XlBqpez@)$}e>B +z%9H1I$!dtTsa<<>;9%dhsyp%V;p%KhmP{$AEbY|aZ;`lK)NVnJCww@vPGB!VFi#D3oWpCCA<#mMmXxd@j1T>E`@y{%2KhPrNBA=MXqrt9bcK!eMRR2Bp-uPp1Z%SZy*Z +z>~9ZEKXa|A^x{kt-$328EO6~ +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 +zRkxf;lW9uN*@wk#ULxl_!laoQswhHE=F89!6* +zw{Pw4?D_7l(@#VNzlz~FmymJKUbJb8*_PxEhS&Qot#}K+viZhudz%yd>eQm34c*S` +znt6_uPb~tMNZ9o2Qxc_-g%KBve-O&5^x~}Ewd;&IcTVsvE@3p4e_>KqzbVqSY^v6RuPl#*&dj**+n}>~ +z&gTVc7XuE+-3hqwy1be*IE-z#)Z{|XlbI<(8MCCPGAGG*< +zz|7!hef7L96>5cb`-mHYGj +zt}arj?q0e@Ql`RD_gJNYwPYZ&I&9}nzgh^0PTUG9#%UbgPsD?`!Pq{g5mxYz(_P{+G)Ux-N6qn0w-POC0XQBK4m(5B>anXym +zK8Wr;y(y!A`Bn$Hn-vSVbZjR1E^D-N*4ZbDJ#+5O=K3qO +z$S3B@*PP&jBsTG54=axReXGltebH*|s&z}_)Q<~($mA~6JR2ahq$1C+c=fWlchajT +z`KwCGP2j!2%~@-cwzImz2F%6YQbWyUv2TiQ-_Ts|=;F72loyI}1WIh#<0 +zB;6MeYXW9WRItm>k^LkxwPsz;8B|9i{E_SaGW};do18nW~plBhX~08j*2AT5id +zBuFjcSoB>J$)u|XCb<2&u^?M&&(y|t!|6b*{N^XeCQ8=TL$FIAi+`Fuv-hj&x;^)lBoU!8XHfLMjZ +z72h)%Tixq7Zs*!0+fj9NouHQ5Y=*__bF(T6jGDG9?Rocd^5l(;al-rFPTRK8Fldik +z>7*U+(^X!iu$1=Jb;)@JtnT2L{ZSy;>(-w%-?_Uhzs(7mxAC^YD)SAUoCW&!x~el% +zjrrP}rOqC1_+s +zcIU#8ZyC@cHyh08KUyi!k% +zgn~Xiu4xlE_8=lW_rvap{>_0~CR{t>nHf8+F48#qb@uXoGY@WRG1FQjCw)s>?c@!q +zNv=WfOJ^GMCSS1+Hp!}7XfeTV$(#L5cMNugXga^Uv)sKSLelb@lY*DU{Ou0@wne)) +zYsPF?H_MFkb(oS+>wQVChM#AWR-0N(kCnMvdQkQ0xvJ(lFASoL+^#NKb5A|Ui(#v| +z_v0g3Mql4Wn`TM5Y*!Y|ZP+apC1bI|`C5pJ`=kUNsY!XO*H8AnW_`H*(Sheq7PmeZ +z8fq7A+B{d&k8|xxi|NZ=%gwYtc5Hp-uH)Ysr4G0#$o_9yu$^mJ&+66MclPaceBbo= +zBf|n$t+^|2$o)=xI>|HT%etG>3x93-F8SK_s#(?H!-tz0C+sqeFh141@H+49Z3}f+ +zmkKbHe!8`YL**SaO@MUx370n@dXH +z8XdRUW}aNJb+O%*9V??=@7NV>u4do7(DzE4*k7CU&%ZzQ^=+JYX8*OS*&(}PwJ(1Y +zukt>US(tX_WMw$0n?3_lYy(+@Ca2;hCbkRl=!Li860GQ@SJDyk_<*Yfg-E +z^4fHxXU;c=#CYRQPPub_i*4NX{W?G99B?(&bUEAN#575mYxTQc>mZ4g_s5QyY;muB +z(o|E`8ks8OD{?b4j<2jVTJQ9dSDd*_{(HW0Z`pCZqr~pW?dpEE9mxX!c&>EbPU(#G +z-}G(T`!&}u?qrsG_im$Hm~zAGr0F3-H#j(MZ9eny&g|3qA!`Fa@5<`slaDzc_Mgi^ +z)>A~)e*XD|T!FLKE%*0)9+3U^#K~hZb8avDu-Munop@h(D0lOSCZ>Q#EdA_1c +zWZl>mJ-b@kJa99Bs1T;ZQ+@oKHGzS_scH>%TF1xsRL;vRkb#>dakZ=qwU +zq^&O5ca&k>x;S++zsg&>e%4DC3MJ0VvxvF;C39_?a$w);ec!^YHyO(m1-?C(YRJh{ +zq!+)<@g~#sv~sZ>_bhBTFeI5ylU}jQpVxQo_ZQX^duO*u2rvg7U$A&_$;nF!-zyfr +zyEC=qtdqx_NZZG=%?bR~PXiWu!Q@gUX7woLd +zH0*zI=Lnzt|02nKL0z7QZg;)7Y-5n+8>PW?qnbZ#f9Ho8Hhb<}zPxSW_Ol|_Byv|z +zxEFBt=MgXS*OogSgruX7Hn!%e6f-G`^SQa-HJh`&_(O55<-y|&rT<$_M;WZD@NSq; +zcNC{8UgKhE;;Pn`$u59kIGc8 +z9+T@mvo1Ro^r>^RSIwH&O>4tq;$)iaUPw;+>{*&te1v=XuEGMZuf{3f +zwb`r7_6u}uSoT;-w)mXIe6yur0#_Jk>{_y^@#v!Vvnjf#CVu&;XD+4wewDh>LKU@~ +zsTcgzcYN?Oub7_0b$+p)aii4~#v&q$E+}X>{sU8_YBOEuZVK# +z`ab{I_8FYAJy)-Zc5qBMniafO`>rOl^Hlv`lgip=Z0TRS*!7lER&?`vE(~V?R(I}64|h5~DJNnx^ND>Qx%S?0oZfau`BbnOn_acN{_W<_ +zgArn}9Ly=s;YUv#W0=Ls9{G2B?(C1@hVNuosyv=#%(9OC)nenY)uC(qO;Rr}+kAb4 +zpWg+aDxDuWYZry>4;NYL5O7TAmk!&qpCXO8Z`TxZHD>+x +zn0>z8%8@CI$#S>GwkJXlA3b8qzrW|;?c3Eh)m6OPCay|*Gd(Hzlbpkz`#ZNv<#y&c +zKj?dZd~ysH&Asyd8nbVy5aR({3pGPy!?6xS|nQ}rj +zML(oUvOQ&J??2s9z$3i7Zk722+ey+>4=6Fs{;_dmh>-H;)hn}qt!1f-PtVIHrml8 +zb}@Uc!m9#RqjEWeRdY^P8!W$Z@?kLR?Mj#SO8%DR5ht_uWK5s1@az$b?~`2%v)_p4 +zTB^u>U9ZgkF68Ru=%{ClllI7la-ruw>D2# +z40Jr9Q1q_o(B$R*AHThozGHt!c{z9T>Wd1^(r%CUWV&}hH=fbGy{#tyRK%WDE4K?9 +zNBlnV>)kf(rH}tJTdZKnInr?F4Fdy%Vu@=+iE~kEVo7FxoBoqy~`6-!cm0)-18d&NYT80=JTA7+y85-#tm{=JY98cKN +z%D}*22C^YIKdq!Zu_%?nH#4~?zc@dwL?JvgFD1XcSRo)Iza(EFEHkw{wMfBC&rr|Y +z%)mg;(9GDvRIZmzopr01C2d +A7XSbN + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/SDR-Sharp.png b/board/ant/msd/img/SDR-Sharp.png +new file mode 100644 +index 0000000000000000000000000000000000000000..e761be0a41ec1160b3ea3f0532f41d6e3b4edd35 +GIT binary patch +literal 11417 +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 +zAMzpheobx=Tep^FhfvpNP0<|;nM*{k`mX`s +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 +zk6!1`fY9L?91Cfiyz`@ +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 +z@6+N{r +zDN(Q~Ijvv(?p(jfzxZPe61{G_;$`Gcy!x~^PwMMEdGAR_u70k6b?cAM`|Xy~{;AAm +zcKW{Ifm+zTS?9w`7xFx+a*eA!dSeHV`Fq>5zy1D7yC0|Exhr^J +zx!qUu6*py5rKC?fRUa<2Gx#emlewq)-oyh}>^t5riMH&J-a*TM^xCY7_+c_`FAc@9NB4Ycj(TQg9}eHi2N3-Zhvt5-p^;Hj34w$ +zF01VIJav@ejL21w9!tY#b3Ei9+&QEE(kw0WeQC=yg+v|h*0-)}|IgZ35;rqn?(xUn +z|2h^MZ&%_7I5O+A-1C~sXF_|vUw(9>IF@0OO3B{xYOYrCR<~pq(?zqy?N%Mz_$BV$ +zdpl3Kb0u}Gi$3(vuJ3u77RVnnvo$My@s0MU-EODTD&Obs +zKlt*nefTa;4p#S=LiG<}^VYLGuMKutcfR$^n~F&+>7oq_pJ{8q*dVX-u;lsl9ks6( +z9(rRW#+~{#cK4E$*9HGC9Tx>wxS +z^?$h3BD~w<;s3)v&kcA2owsz@zmHLF*-(C6>_gnGxqiRhLUqrpOx6ilo>X`0?1u+u +zCZADP@0cyX-YRM))_c%s&aLkZ{P+K;+-qI9jr;BO+I=&M&pq@icocKFvi|ToMiVJd +zb>BmcHs?Dl-RAM1*vuF?P1HtyLaM1$%9BdJdG2Y463@N;FTs8}`lY^T-sYVOGVkvl +zX7{g~GxM3^8Hck5w|DKyv5of-X +za;MV&%376$tNaqa8$OtG##;S1TQj5Kvl*e{Zy77)PJU*JIJotJ)XB|rRvg{2*4;wc +zzu=eSi^>EwUZ+VDmT4-gEXj1@XcXw09QSnBBbPbTXT~yn +zTuRZOu!{2$lSo|$Kc9-yBxSv(Cmp95`&TGUdYp9RH%sW#XHS;zn7Ets(h<*@v3s<) +z==4?9b}Ai-X;Tjg5BqoaEYHCMPadpe{IYBBWpVv|m#Y5#TwnO}6w~YM>=nlzzE|FU +zFmd7LUj=_wZ#p?aR5Xr5apBFZ$8!$*-0WFBL;As5SM9e(#2DF-k8WHz)c2;j)Lv`7D(mTW$DQ`&uEXSIfJ{hO>R6{iIKef4O}<8*_907DK%c +zD!km2b;IJzCmqsaux#DNu9~WPv{12CSGafb?MDA1OSKQznHQMGU9Spz9GP2l_NaE_ +zD+aBCyh9Z>Z3!kG$G^{5@^$W=Ws7<^H-4=8?;mqsqOQmPl+9z4d+SvH?6@5ga`vsp +zgRfgWovyW}JJqW{e9ds|<=Ssy)vMnw`fG3hCDG=}YQa1P1_lOCS3j3^P6!lvVtU& +zJ%W507^>757#dm_7=AG@Ff_biU???UV0e|lz+g3lfkC`r&aOZk1_lPUByV>YhW{YA +zVDIwD3=9nHC7!;n?2ov48T3?x9;);)Ffa%tC;F8!FfguVU|KlAR)o4nh1x80t$cxixGuA?TeP;#JhCp)81V2?z9 +z0gH2bHJawPXZ4VCCEJZGyRi#!(0c~ +zuS?GESAVUrWQy&hsSU5y{$_}1__JM1KKN<2hF|%+rzhjSL>Rm~<#u{o$IZf1HHT*! +zmq?}lW6DWP^0Lk>YYzxm(!6R~mED@ZJ*)bXUv#ytS`l6*eO>xM=sfqe8i#8cpNaaX +zPS9@uyViY0_Z8uu_6bfGHkWZI3It7BxHRyIUP8pNrTO?<(Y<*&?5N-?i(7%G7ksI?r#sibHeFbhJ$#aZZ%q~3wke^{G2s{Xp +z)!=9m*b&;i?SpIB^?VjSZ+Vy-*;%;CT{9?*vK3;~zd=J0V`7W*`@P(L&J1cV@YWc7MHRqg~58Ob>&}7Gzo#4CFcyd{eH6x<<;)vmvhG33^USvD{KqLD +zbk1%J6WZpvZ?$}R>Qtew<=ZZ+v)%~UJyo)i^9+y8u~oveBZ9ZHdPhyynb=fvws#Rn +zOxL+@++S+~_p^$!r$!zE1)IJ-naBl{Ha;9*54>8GcNesI6*`qM=c_7@4QvtCZEx( +z>T5k}eBzqT6_)cKZaw_IQy}x8h?wY6f5X}nEKz67bfN=uzeb&L +z;qf)SAj*Do7k}uA8%A4?zL>?ZZHpkso>|iuSo3dxw)Aw5;gR42YaA!B@| +zpnw^14O4`qJ9XbqIaLvgR_K@8&$+8|Rak+Tkwd +z^XvSPx`>T$<#X$qjar238`tsPVPIfTEpd$~Nl7e8wMs5ZO)N=eFfuT-)HN{FHLwUV +zFt#!>wlXo(H88a@FsR6P`Hi9>H$NpatrDccLf6nx*U&h`z|_jb%*xmtqG8GD`5p`m +w43Z!lg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4hg6abXPgg&ebxsLQ0ATCh3IG5A + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/favicon.ico b/board/ant/msd/img/favicon.ico +new file mode 100644 +index 0000000000000000000000000000000000000000..0faa5e99110279262e1f9c6b5418931f164912fe +GIT binary patch +literal 318 +zcmZQzU}Ruq5D*Yx009j~1_m((1_liV1_qFb0s}~%1tf(P|NsA=Vdl)44EFZ+3~6a; +z4EOKfXW-}OXV|}gKSO`x(}+Uk_G;Y|vc@xCEi@Ub=fr7sR}D +z_Zs8eyLazix_gbG9ZEAeLHG;|nP71S28LRYJOcyUTrka|3l`_Fg{Uiq=-UY~?!lvVtU& +zJ%W507^>757#dm_7=AG@Ff_biU???UV0e|lz+g3lfkC`r&aOZk1_lQ80G|-o|NsA& +zdG{1GEeXq=XCE`uHfn}r?9ANeP1kPT{r~^}*KgkrpT4kg!>(Te_pLzIl?3?(Gcbg| +zd4H8Tih+TFG0EHAg`tC0)`Nk8fxX1j*OmPdH!p*pYS2TKJ_ZH`f#gKLG6n|5wG0f5 +zAq)(R-3$y24B_GrRTvl;N<3X0Lp07OCoEtRFyd@wOn05o5T(JS(#Ya7k)_FzX`Mk_ +zWo8D42g51e_j4?bO+-8wWU0+^P~Uan%uHje39N_G&*|{G3UjFXGNc?o6ZwM4_yTL% +zV(v2w&qQ5fiJ8daB+$qs$l>O~?4rOa7?{B5;UdVwpea)S_t0Ozbqov)swJ)wB`Jv| +zsaDBFsfi`23`PcqmbwOpx&{^@2F6xK##Sa~x(23J1_l-RF27MUKYn{7?@g_m{}Q{Lo_ToJs%Vxk{}y`^V3So6N^$A98>a>QWZRN6Vp?JQWH}u3s0tk +PVu8Wa)z4*}Q$iB}M$MHa + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/gp.png b/board/ant/msd/img/gp.png +new file mode 100644 +index 0000000000000000000000000000000000000000..7eced6ee02fc58163919cf6bef62c416188ac283 +GIT binary patch +literal 1257 +zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tGSkfJR9T^xl_H+M9WCckk +zdj$D1FjT2AFf_C#yQsmoR+kU-&_y7O@zrTNfxpDPTXVX=0hpQfTmz~V+mFN9<`Qp#l +zuRq_t{rCU>&$n-G#0KAt4*dD%_3w`#o=lr?BRcS2MZvoRd#^Z~Uvaa3v1-Ym@82$2 +z8(eWRyJTZ{+0pc>tJSptw-3h-zuva#s=Lj#AdjyP?!Vc(@sgd<^~ivm@u4?kgKx%# +zT=j9f7V3RFC*|+2Uq4)bT%GKL7dr`S+(! +zx3iNk*&2O3e)#XNpa1{;`}gnf-=9BUZ(e`N(ey@4@T0Eg%XY?ByzD<*Jp1p@-#htf +zm+TB*tzGf;){TFE{`~#^{mb>M&*sgz>g)9R>gA88j$L-PxawwoJ2Tqwzs)+4m=p?-pd-hzk60^4PCWA0M_iJnC!zc;@8K*ROtm{P_LBy*FFd +z-^xt5>S1#|)cZz+-!*@iYhLy@!hCOp``!riIXO2_2$VKTg8YIR+J3j%Z1gK+U|?WO +z@^*J&=wOxgU|?Y2%y)AuW?*3KU|?WKV0i89kio#fz+U3%>&pIshf_dBu5@LN3`kvB +zfnz!Y1LIl-2F4JElSXc@7#J8gd%8G=Se#BySiqf-l5~)3#*Bqr5jPzgri%J7XbPmU +zZ;Y5I($Lb#G9#sRMY3}k!^LA<<_w2iG#WgcmRLjxGAv_Q(?54|_w07@JdRyVVRm(l +zj*5wbdSxqE6Wo_Bt*o}TOocV)O$^(lHY+!qV`?$W(&oHbWAjXG+OISY^9_-aw>@s% +z+PL|awS|@C3d_&CcI?_&U2#hB&VlDobzeR{{rb7QfW(rOQZhnPVse6#qG!+X1s{-H +ztSKpdTzdWlji+iWCrz0%Y1XuP6HoRREC~(Umg1Kux7vN5L*o(`MfLQF(S@FxMKJ}_ +zJ-wzChf9Qpg?e8r*mV8cRdbV1O6|_M!JC()cxOjf?p_kzZfGFkvhxB{*ZR%gLOi>w +zzbx2zvQ6en&KjF@du#s+tNG13bC$1PZ_18@xrbt{N^g}^%I(mZ#iTGlcK&9Oi6S=w +z9x{aF9r}^Pa`j#+W!6ivsIBxoq>UYwIs+dn1O*I{LMVwuJRbmbWa28OSm +zE{-7!l0^=yh)sO2+xN1#QZt94=-q^REB)#&9^GpKD_L$VdnYHe%qiaP~=^cVi#k@{{BW6j)}|uPGa~t@4j7w +zLfaX+@^qoX1jgtS%Wt&*(O9UXaO6jA;562YoRw`Cn9gy^hp%GG3XSz+_fq0+c<`Am +zeC_&-RsS3lxHRrWE&68GGM}+)SGHxq?W;#cJUYEz7;^Sb()cS{(Dvh*y5(8F*Lh~X +zy94&rYfg#H%De8pvOH{amFJWFTYqm(bUVE={q)mmPv-vhqW=7{>_6{2&dSc* +zxZGkd0|SFRdP{kVo554k%6J5u7RPhfklXcv6Ydrm5G_IfvJ^&K}EjH +zZxju=`6-!cl^_ikx`u|jhQ=WVrdB3qR>tNK4NFeX_h4XPkObKfoS#-wo>-L1;Fyx1 +gl&avFo0y&&l$w}QS$HxPl%yCuUHx3vIVCg!08ddKU;qFB + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/li.png b/board/ant/msd/img/li.png +new file mode 100644 +index 0000000000000000000000000000000000000000..fd12daf40f3c4f7a8349b3078da088c4d30faf21 +GIT binary patch +literal 536 +zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tGSkfJR9T^xl_H+M9WCckk +zdj$D1FjT2AFf_CTL8LGFk)o!()eWLEry_CZ@{{R1f=<)lj@7~9+yem3q_vDKYSKN5< +z^vh2v4ekPv?Il5e!3+%HZ{A;Jj$&Y7U`+CMcVXyYmGxj?U|=ut^mS!_#Ldf~ryBH7 +zrH_GuK_EHNuZ)3#aV-M_V+aESV;2JhgM-ZKP8J3RhCWXh#}JFtS1%vrYf#`|dvM9) +z(59;Y(|x6`hH)*w^^3pcgY?S7%YG`X{VZ#9sq#8kfvw18YeqS(k4!u24=ns3&bY_V +z<)fxvgJi&lhHH#&i#%BcgfbKqlip3xcAD|n=uYFDrgEd=g{Gm6DH|C=56)N@t;rM@ +z!1!J-i=mF|+r-nBuYTIPos)?wesi|{bCsD$lc4AMw&?2&3=FCzt`Q|Ei6yC4$wjG& +zC8-QX28Ncp28Ox@79j@4Rz}8FCT6+@rd9?975Of|Q8eV{r(~v8f;3p@8XD>v8iyE| +zTA7$x8Jj~iEIB{(JaZG%Q-e|yQz{Ejrh=l2!PC{x +JWt~$(69DJOxUB#H + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/mathworks_logo.png b/board/ant/msd/img/mathworks_logo.png +new file mode 100644 +index 0000000000000000000000000000000000000000..ba21f31ad1c6088057698910d2c31d127a486f8c +GIT binary patch +literal 10032 +zcmeAS@N?(olHy`uVBq!ia0y~yVED$sz+lM1#=yYv@_)z?1_lO}bVpxD28NCO+U)-}E;%|*HuN1KeMI5Gx0a3*kYPMCS-vE=>A_j}*TpN~r4pMJ)( +z=!Br%^Pe?wMHT1oWmjDLT)ph;no^O=9`pBA8~5kSFNs?F^vtsK`+GjTthOsVIM4L6 +z82iibUWpaSB5k*eH>b}wulxV*rOY#)vlmYHeJLsX_o0nBM7mS_de-w_wZHRTytw)C +z*v`7gbJorIzHrVnskv&gCmrPdYya%`HJ_iB(H0kGl6#=;d;I@~eFrzKx+?woY{GqZ +zZtHpVmp^W`T{_vn>yNNsm!Fo~E35NMrmsko;mx~aaJOdGLdmMgi(43fAFZub+3K|} +za&_FoZ|@^6Zv6an+s>ae9#3~YQ`OQ>U?XbRo@6P%Ae_s(-XCfw_c&noFOyl1d +z)8byav1a^V6ffb! +z|8|#utcmyWxsZC{dd5=y^IzYbnf@(r*%G0yL=U~?7o~dGLPJ<`rS7X=*tqk+l4miO +zbKc#kJ|FurkT>P17i&vLnXD(9;48L*CwU>;J}3&@oPYe?^BcRf6hE*%2yfgh;84zF +z_<>3IX>3Z|MT=r7&%C;40yaf|Bxc|LG{^0l_KXGlB~~!KG<>v@KZYeH`R5La7n_Q2 +za#kEq5)kHnr@H+0{vvbx+o4O>9dcT=^N>buu7LS2ZtHo=L+m^*w%0rnWRprgpb=pC +z!MjT##OwN*rXw@DeP`KRve>Xco$FbR;s>`QMXV`@Vw~4pQ?@9Ow|v@gT2R2U(I5V7a^ +zTkFSxfmEP#Yo6>lV`F6y{PaoEnrFDui?&pk2 +z{2Alg@JB+Zp7)W?)s0IfBDx!179J6`e`rt00x>^Z17UoG(>bza9Vg +zDEd#u+p<%Rv+sX7v|0E{{_@PCz$?`7esSA5P`YRz>$b2L%MPlrE#3wlV@s~a>o?1~IvVWR +zYa~Cit=jf>rGJp`l&9w$CT~hg?P^&1+~C+mhHQbvef&RI3f4YN=G_=q&-%t$=emo- +zY~DThK4nUN;CX!fTj+!K4)y}MMICw!^H{=e)oaWAtdf=MeU@y$C}Np&V85sSO}lT_ +zcE4Eb_GQXHov~u#4DO`E@0WVkOw9}9{(0}N$oBP%CBjc+a?}|3b5pKGJ^K0bW}K1k{CKWeK?(IA`2V%7 +zzW>*AUCr&|SN1Xgt+Twkd9_uIcks{ur&Z3D|GN6GuO_$Q(z>rAeD4-`csl;^SX5Fv*P-alIF843z|4QnKwSOJaW}~zVhdc +znj=he8#Vf7ocX)H|3&pH4d$;o4{8svPgpyB<$Zm< +zy7WKe$IkP!O)9-3-esN-uL@24pm6kUwx$W2W`#f&W9b8J5w5HStGPtAr-Z%mc*xGR +z_5zn*(6Kq`lT_Z+r+p3Ky{q7~OL*fd&PfmV2yLvHyx2$KIm2|tcQ4Khye`r)*~yf~ +z_@33SEhVdYaaN(tDTgb`&u<(r(5}&Fz0s=j@Yb6h;!LL-|0v$$ZU~-xRtb{;oTu6o37*?|z_XjbCCy{FQ6l+iMp4 +z)ZGu``W?R{BT0$3aXDvA?|bbjj8a|=cc)x@8St>3%U@fhBr(EoR@sriwZSKuN{KJ&3rO^PsVdg>CW2j +zWV^YQqTRav8{SWypz^G+{l)qYjXo`=H;!o;K31=u+?4+JPqXTjudK9KMP0$%>({<6 +zY?~fEC4{{x;Q_e8Ot9iN`7Q~;C^7I2h-b-l-;kyJ5p!y +zlqz1^)x+@nli(h^ElRTMT(3Ni|!a(2ek#SMfLYWzSx8p>of+=GT`^{;o~i +zx~btG^R5fK+iU*EePU++kS+QsNPSoS{D?OuYT_D9Yuj|TJwLL2TM<-ypfMr&%mu?c?_@E&FDlG1gGh%j@&8_$_!qRx9z@ +zZ8QHZxgvtEcO0$z6@Bai^BSgmX}|47Z%(>(plj+!37gj&Y;I*%{*LC@@m%pMEB|f7 +zz9+rg{>*5v2;0qI+?1~<#HG9G{L=}0j>(Gk5jyA*SqcJ +zlkaQPs}*CH*);Qs%v&GusdTxKj(O&RAdO +z|H~dIFLcsl=56!nJ80sVX;^Y9_=Us6-w!ff=gbl~**Aa6wb#Gr +z{kx)m`Sbr@`F$x;Yn=oY!!|ZH{7?`3aZ9lLm)?VyhTIxP*+o)JEukKa9;XVnXO{HX +z##qnih-q!uC4W=$jE +z<~O%p`q;s0%_#VX?}2uTSoY+(pCdUO;#(`En3aEVyfIciyw)1l`kIN}Z +z)=z)&yXCFD67w%vk4awwLN*rfWeT)mKF}|CK6!0yw)r%Uipg*JAEa3?Z<^ZpUD@lq +z;_YWn*8iGnx3kT$&P<5^ewTO3YtE@vhZ>9CEM2ab-LJisySaCDJ_p|$D_>LTd0t5& +zmt2k-su*hdb`-15+9|ZNcJ_(T-x^xZOGNjDvCONfiC?&tiCK*?skw07PBz&Fag8n0 +zHbfsxNNwg~af17EOBwCfbo6qH( +zsJ!+VDPEjA*fk|A6Do_%Hno0ZV|no2t>qs(#{oVje}&Zfb2}zQGv!DM>Tg$E +zVBf%zeRJP-&W+#l{D0g1?on=yxH4Hl;mw9i52NqZa%qywXFOx2vZ4NY-`O|okI1Z0TQzZpfuE0g +z+vZyPn#Fb>-<-ab^)x2`@8pH%7n-xKDfk|cFwk_XHhHGwV!HYXf6np=$3$$D^>%E% +zwr~B%y^0r{xYWWl?(;B4|2(C3K_p6Y%0lL3Jtg0~e)eD6{hKxl2WHr>6I#=`qsrcW +zOQL#G;5*i9e4B60tgf6Sx+Yz4yNO%FrCAk{r$x)(*D*03HSSowXP%DbXYSoQ#FfMT +zy0FCP8|*n^oZfo9lGF6auD5cgk1uXqx>&riep78&^s#?Eq9^i>yp8VQ_}#xI;HseO +zro*3JTd*9kXFH`^6V(v$)b!g;kxudX8{WEc1c)=UM?b1K&sAg{gb)gxpAs-HbYtV&a($*(9O8?&&YLq!*qS_MFxHw->*|F_W#^*-JnC`{Ib9AxLjVk +zZ95y46zvA=+Kz4)SnG{sX75?KWFS~>-nUfi-N&|%G!@;Ai_r_Q(LP1a28T~ia& +zr_sJ%*(+mBN=`?_8$WIB&u`1mX`6N!{c4*!dsA+)@YjknQ0i){YG_L=GxL5*F5u1{``?1$5HIZVDB)o>3!hb +z%^d6F)b4MdTr(@+!m*|({-f9T>3`f>rtG;k&V%KJSMw*8%4a_pF>GQ$%KTyQ$Vl(Xf~)v7gDGH-p{^oVWax%%!a +z6Yn2;p)z;l(C^X8~q?~bM3VvSJX`tIejVs+VCzCMZK*XKi3)|Hj#$fjS<{nqi^ +z=k$JSLI2$H(^1z1Qq3d-cF&!ZJ>ku--X8u}*Z#%&9xy%O=h&EYcCP!+4Ra@RH=Erw +ztq_WMTK^(iKcLHIRpF_92bcBn9%b2VV75oiF?N#FW*yVCKrYqf4?Tv5mw09NhG!^S +zJk@!0LA}mQ;qKOnQPt*WFX`OczE&|@zkBO70gc}EN22(*-_X76CAuU{LZzgk;WqQs +z2BRrc48><%sZn1UYVO-~@^N5G#N@E<+%*h;1q!=&35dVk`mLIM(}lY20)>gH(Q_kr +zos4*6mvZ~L-R*T8HPfbOD~7FktnsX(!sH*PcKTU`+s{iwobNojTejx&grvF0-@JdO +z_#md6V|(UJ?)!ZW@05&K3$!BZ5)2=S+4n?LwC*^p=lxFS`i+FibwNk|-fdBN5ySb0 +zX;W<5M3aUotnyi_i&b_?hfZUV-*W%&?6=iQ0pTLl7b=}WK +z96PFWrP&PX7EOJ%Qk}6aa;4$&fq-p_dZpq* +zZgUdr%fj|fWz+p%$IEzFDP?#1)Ta+4x8;l5|Mt*$(AQ&D@Uyk^a987%JePZRYIqmNtHT^8m|0Rzzd7Idw^DPF@6t6zI}&FcHR=RfftGuGzp^!GScSc?P3b%8(C+2Q3SJeCJ;-1aBsA6AN&dr^s^ZQl8 +z|8x8(RuQ~@kflAhgzLG=hkp|Hqz_ka43h0U=*^>YETTv9(v^guoh**l-MLXeR~j5h +z;CgzHk?Z#LiTd9ILRL=cugZ!rv-vRf?~6dO*^1q{7uQ`4U^@GGGtaIjn>KFG%dDPT +zSIzs?>@W9DX$MPZ@lkiC&HNW9L`O;d5p#KPC$T@y=tKXKFz)9uAALGDxt>&R`XBhD +z=3{9GL%nq8-uI7g+~p}U32|+ByX6gM$L(sSq>a}vzG~xNZtEeG%MjUL{Ki^cY2A+7 +zb1fX#bkg5#!jK`SbtEeRC8YAN^ggTokzd^AC+lf&C4gljd%m`&zugUb*|D +zW6C?N2gWC+#U$==GwE{g35xd*j(KHdqo*N+?Ut8);8Kp>)P#N!!qwVxpQVO$YDBL-m0}NFUIp{*ReT% +zS?84d{+{Y?ul>Hmo2fG8xOS_N_a~m2vt@4{jchw|=eg2R9cjtvh-lOKX*u0*H|?%x +z`(u~1b{}6&=bDmFH)0eDOs0H%&HCF@FuX`|(()N+Z{+P*EVb$A3$a4Gn@hz7nZ(3j +z?J$1GH>EPh^6kRx&C#D_QkVT}Vku9(6zfrXWAV4&Pfx7e{kd@IowdobcJFR{dN})l +zypm|kcjY!Uhbi~Ic68ep^$+O-owrHQVoG^*5I3LD#-cyY)d~!}47=;>ouKC7;eZb0b%AVe_=V +zId2d6ZZ~>Xx+K$m^LGQigcGlJ-#+ne&hbTmJq~tVp4B}e;)9gSZ~GH3xK>}2?2%1Q +zkNkSM@xEiySF1@WJEc3l+qGv;XMgLsrc89>s?!433nx4jO_t>4ubsE0MpsGhVrWPA +z{zje?hL1K`?Rzdby?zb1R`f~tYqvN5eXDf3!e3R=y8ZZsO_#5B^z4<~cxSocwn_aH +zE*##T8zP|pT}rCFrCsv;HjC=pL)RS?b58#;I&|v!qUGN<42;mNc+VL5l<)orCznSt8SUCTNLqbp|7flt@9I2#;t3)`D^+wTyJq+x8rO{wx*_Z +zQn&K+iPa03TE$bQW_=5v*p#~D<;l#w>*oL2+b@5PX$P~2u;{BJ9jcM3_2-m7o?H5@ +zT2o%uI`i_Q@*c@#_72x7QKqK39qk69)7g8@M9FKfQh0F3J?zrYs1)mL8}mCC9goPq +z-?+z$zcc*$!&l5t?n-!G+Bw78>Cw-f2VC;<ymwa{e<2Dom)G5G&hF$m7bo#J6EkZ%3Hp!V$P8-A*({la+iKN^ms~D*(E=plg3YM+8(_+aG7Nu +zYv}?G=I33n&m^tB#xrZ~TBk?({(2Ty><-^4?7hTQY;;UVy>IbB-q-x?9~B=du~}T$ +z%H=xk!i`k%7YaA8I{)oZm9I6h$zE)_tZaE@)JgZ2jTb)si3r=fb?(G>DcW17sfiVS +zyz}tVL%Gi~=hm|@&Rsq4w4%eD6TIbD9Hty%vz~7A=;)uOhn76e3{M@8WM!wkKCO9T +zSVzsMiUV}Ep4Mm8^ew`S|~DDyiiCbM~~v_el+ +zmj_h63$*%{vqX9A<#m_el!+|mY`>Gg^R^C`$-=)D-D}$~J<|1F&M?JMPo8}-esI;*?!i@-09K5iyQj`csHu(Wk+xS|NfNw@yEII +zcviey@3JK;Gko?v1?`kQXPy)}=Rt0U;E9cz!Hc3NYMFn3rxx?^)Qcm} +zWKVnx5bivA|DcEWj9%OJBRiKX6n>T6HoxLX@!HR)>g-D1taICQ{ZxOg$F$$O%kC6U +z{QH*Qpl0{lHi=pBM@7H)+`Cl7dGl|_Cz;9151;wb``&8i_W!@RpV){l@4U(JXY-*w +z4Tje<4@>X4Qlc^0Y1WdjRcF71uiCY(etKT?cj2_R5#H`Gf&srz*rr7}$X3ZMd@sy8 +zD`rKflW)q}ZQV03My$5Ysqq!DzK|t4?^o-m8~w{|t*!^1E +z?$d(LZfu)-^^MD;Me`?2O*EVMBU?DK_iJfNSiae#RlB=69UN*cnI0Y3_kLYTmEcL4 +z^P8Fqbr-dKi)75&eyC=G4$n;AGQLW^cgF(F|L6FzZVL84m;I70F6HQ{i8~t{k2uM1 +zIB(Nwy`%8Oheh(97JE;BN;XyI_Sn=kIeo&R1!YH~;?pXBu0K$=dpqAv&JE?!^X@jz +znU!Tb^Jz+w-|1O97f(9RJGrwbYHGguOr;mwUWcf0AK!MfP_{p1i?~vB5+~EIy=CuA +zRnGk8eIjzp%$mPfW9{X)#`aEkJ{#&Ul@L8(|Nrj#4|j6wkF&o289V7ph+*1hGn?1T +z)h?>dUFun`e)d>0^VVCFr~bRg{5D%o>)g#fTK6Mg2g}Ae9c(|*WcA5p;(NhXyPp@7 +zWh&B>c}Qaj#!nmfO3>2&M*(>te_E8g=x^^09%dQ1DUPd}Ns*W@dA +zDN26J+opDV;vJWE)^6*=@1AWwaPF%WcaL>L{gJx|l&+-xEMZ*~FfHPq+qd%EGTGHB +z4_mC||FIpZ-PiP{Z%@+c-M-v6j;#A`x7+RW+t1!7xpJ!}syv7cJNInD(aY(Pm9?ft +ztzX06M)jS%T*$3Z!O +zwdRP+U%%a#W4ZBJ_x<(T@3-C9CcDAG +z%DrEtc+lm*xqEA)7v?K0pIO#dWnR54@#l7_lPBEEa;HxWeLJ_eBK$tnzvPTHl4o5- +z{{Ebn?x(g*fvb4k-wvOSPbZbR9#5LKwXCKjyI{`KmtnW#la5zRIMelBHF#3CfcBm2 +z+xEPH@5Cov?YZBX)4uLtZgbzk%bfkW_e$2D`1gDNJ}XIsHzr>1!!m-iw3j;GH|xrl +zyKy}lW(RzF|~fGfA$*5T*>?ueXJl$%X3R<^ZB*1 +zujg#DZvArA`HbzxGqN*hNH_?ky_-2vC0YELeAk_$?0S~v%0UOqgbsCzuVL8rc(Oh7 +zKZ%R)q)+}^;J7;bhD*{p*)WY;xwp?NKPV1=Y17E@uENuz{Fs%i!&ly8`#)ZZ-Dy&^ +zey{w-E0uiz%`S2U$^VTP-Z#6|!SqP?tqu+A@5`H&TyDN~IyB|);fiT{_lp;vRo~TK +zyTm8t?GL%cKX=*Fd1mR>h6?b%DQr8vV0Blv(y51Go4iG0Y=3l@<(}@bS!3MPmu3AV +zIDL-uI>QxzOyb@wf0^#I!|Y3`Ay-Y&LgpJX0204S6y&C{?)wy=Ksms>s0jkS8ciZ#&6P->z7Ra7IZ~*KmR-N-1BYc +zDlezb`FFg2*4_e@oA*v~J)W30$$h>1Y0K?_w+-|hCu`2R_OW+ghyUcePl|Ff-kko? +z7JsNhL&~oIW_VSgxCVbX-vbo}x>RG4glt=7ID@#}8#H`J(_!al`_0&_J!zOaieyAxP +zwC9(<+MEBKtM!yuUJt#LQKDK{Q<`-qG~=(Y=#TGhcZ(l&@B7|7J!@rJMq6Fx%N6V8 +z=WTxBq9tv9r0!OY(epxo#h~TWxZy?V9lDYJJU#fAPiVng6_b6>peTu)$sOv+dMn?7cy(Q_j8CkeYEs1hnX- +z&_s2rr+Iv(=FY19*X5RqPyh7Fd+DO@tDGEPYh3!qv-OSnZtl|o-!8OYsaDt6Di;5r +zbzk{zuEm?|>p9=b|G9lw>hSsdAI)CvW%rz{vfgHWuzR3?-oK_>tMm8#+;D5=Ldh!C +z3se56PT;@uTcP-w$Yj>fpR%8yKmWJl+@A%v3Tqtd*12C<`!PLpk6-WgWfxt0&uNFO +z2$*N2v90l!mD~NrApzHxzB|ljdSKJ-dWVWTg%wMKuD*Y9L$;*s+Ml4zT|cdzjZJh- +zQtREy-*FbtnEL+h*RGHJrFylixgre@J`&an~N(xaGeV +z=B4k?W53I`OSWXUlenl>f1u#+&?R|+3xByQ<#Ye6x%GAC?d7w@jZK`_OU$~ozyGal +zz0t0-*(;d(Uv^xzGU@E&(MrEi*{nBd#hzQslxi1ueF^XQQYBjDx#306%V&pq&R)>& +zTJ~p8-qVAt6(w~NAN4o=oPR)vht2t{N>*;vb@SP){;kWbu=e=8a;3@3KR0YIpKX_% +zwJ==7H?rrghj^c|Zn*Z6m;Ht(ts9F2-ngxl*Iv4B@zgq#P)B*kdt2g-AJ?6~z_VB6 +z%cMIS0xMsvoe=UYVbcAh1zIcQ7kzPlkn8%BcaI;}^gBj(i{~$ttU7w>Kl}Y}s;c_+ +zh07Tj7*tDKBT7;dOH!?pi&7IyQW=a449#^740Vl+LyQcqj7+UejC2i5tqcrYBbRMP +e(U6;;l9^VCTZ0LU96tjC1B0ilpUXO@geCyYbauS} + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/osc128.png b/board/ant/msd/img/osc128.png +new file mode 100644 +index 0000000000000000000000000000000000000000..cc85232ddd615d494f86aa75a68471ba8744175b +GIT binary patch +literal 2622 +zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2yHSkfJR9T^xl_H+M9WMyDr +zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7}%1$-CY>| +zgW!U_%O^81FmM)lL>4nJu)P6cM!8Z8Qw9bG_7YEDSN1#Xa%_TDR?~PQ7#KJ?JY5_^ +zA`ZWuak5`FT=ZD|^Lx>u`LF8M@6O$R-0#uCw_BVI7@Jrj(_)qhhg0BA0Yx+J>~=vmN1p?o +zA3IKj?!1y8z?tQ;&Mjqi%Q~+NZ5FdbHwDs}dLmew7pGz(~`Mc%kkGBCl3pPFVHn8CA$mwkoG?G;SvL +zPEyHaXk01(ia{cF`r~uu +zw(9>T7#Dh0KH6@%xVS5?Rb|7JDdJ39Q&V4=`oCV4e*I_Dinkv%x{m*5de6-@KRBcB +zy3BgH(Ef1N(2!7u{4FsRH~9s00c-s0BpmY4g*W;{B)Vyf1e+Jg_>&MkCn +zQ?s0$zqBMua=P8j%X!O8^mtD`W-PpxK4I%iHSLl|s#PDk{w_Id@Ot8t+Dl0u&w{z) +zMI3eozP@tc$Qq&2DcbY5rikwN!Fqam{p8DgR<5yAIq|zAI`m`IgW6+%6qY_SUS*zi +zC+NV}$)Rf`HyFHJu|GK>?!`NOkM0WRqj9#a{+^#^sJs^zx1ChuFwL8d=guxM1J*b7 +zmp7LjF^~}VVSHQbl-|GLz3%x}Q~omiZ@k`gXSvQX!>>sPHr7W?i<(v@66DL%vLWKM +ztFw*PY~Gi8UH8OQmdIp%xp`CUjO)`|m#3LbzvMj2*jy@j{|)uouP@K# +z+4x9c$r-QtlYjSY={Wgkg5xd4K55PiWy>@;-|c$f>6Y;IK$?bY;>Qh%zg*8BSyS|w +zv-19?#Tq|)ZtAtHcWl^n!KkIs@tx5oCAGrPD4`@hmo>dE5<4$XE45{^teiOE=Zv~r +zOYKbzH$1YdUqvuW;4g1O}a*@BhmE`?EvcW2*M$ +zrtl37`-7Qy&)8;F{PDM(YU;dSRa)6|VZt@<07jWNVm3^~HSN9koXu2<*{{6J5B5g;nzIjSbg0*$*tb&AP+qrK|v-9oOTqo%h7kX3g6g +zGNZq>S$)d2?hWsEU9wqp=MCrGHFt`as;k6V-1^kAd}>NaWr^D3m^Yn1hm?7DTrlkE +z*if&o!+L7nb;UV`bK;GC!lrx-u)Hny?Yd3xfzRh+dP^!zSgW43u6K$NUT2rN!Bo|x +zi$RpTF;f1~tP8d}Z!Dj$Wb!+8a9z?tDS^OOa%$%)uk~@RV`J+N5SS%%mFKERw(zt5 +zB_{V}gWmF;tm(<>QB>0xQdl}^iO=3yLS;p+E_c`OCsK0IN%bcTQ!qjH_?^)KfhL^4U=%sDI;VV&^7??&O# +z{68Bvx+i>hU3yz!T|al2`SEAgmRheZ3WFnN8@;hy-*Iodd%`DM)#5`N@_rmOPF*6m +zM`Y5mU9-+>6~({aEa@}vJ5L%*7Jq}$1_NcEn6O29-+7evG}9Z8W;%y8n(yBk+Vom4 +zqT-A}+1bkxcVrZ<9C$G&C^lr4`okM5J|({QU$k`LqEmg{|K#R8<6U~I?Y4XB;=r7l +z3o0TiBP6z+y0$%W=b?S(wtH<4tu{S;Q}m|CWd1HU8?8H5X*d429ZxBLIOpS*?_7K5 +zZW3I&wp!qX@{WI+hwp8-om!SzTIxG<&x4>NFFIQu9@%%>5!Z6aNFnC4o*RCK&|S-jUjV(zUYGp*j9 +zTz%-#mYvJzTHWM3`t@4*zwBxK{|(cRS9@IvKWCGC^7V&rS)6Ix3?5XmzpuUdX=VKL +zIe${mozQ(c-#_}2)rM_(9gO1oA&t7cXQi*{%L)Gb7<;@gGWBU<;?svkr!v`=zT6ul +z_hXrY+^yfO+vk=7xgbqiaUXlTug+H|oBI+X&gE{!%@>_C+75dE?M~MJqQCuG^7`BRLZ+OYmA>g& +z;LU%Pn(?<^#OGbyZ}H8^kSFevQvt_~tZUxWSKG(@{e4eqXXt;o)bjOu=k}lf^5@`b +zWf$Spk5W3(XUh1vGx9pbrT!j#`fO#%&R@#WXRGd9&9k)oYE%O=T-CpP8Q +z{0&lwnJ;kZ(Ltr1|95Dewku2TzVSD<=iB*t)v47S@@xCA{eS(-{6bLbne2ew4;dI3 +zR7+eVN>UO_QmvAUQWHy38H@}JEp!cybd3!{3=OSJ46IDebPY_c3=DR+)cirwkei>9 +znN|tXV5Dnc4%T2`WoT|?YN2ajVr5{kVCVZ?3=9mCARB`7(@M${i&7cN%ggmL^RkPR +c6AM!H@{7`Ezq65IU|?YIboFyt=akR{0E3Ro*Z=?k + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/prof_blue.png b/board/ant/msd/img/prof_blue.png +new file mode 100644 +index 0000000000000000000000000000000000000000..17ecd8f1320897c88b0b3414eca473e85e8eeb2b +GIT binary patch +literal 20451 +zcmeAS@N?(olHy`uVBq!ia0y~yV8~)%V3@$c#=yYvK;z#F1_lO}bVpxD28NCO+^e0|NtliKnkC`$I-?adY*vY%RMP82r|H +zx;TbZ+xb$3NlD{0!B?bit0m}&qA|9PWnwhF^tKQ!Inzj9! +zbj(w&+rQgSZ~bP!?ex7>ccZex^*SecI4yGMn&P1}nZrdU#pm40<(FSi-&b<@qx}8X +zj^`8Dj1Qa<5P1@O_4B=w{oh-E|30@&bw14IOzjeYN4gY;SbCzazGA3*-emBeJeEyrV-M9Vb*;rOS +zIWh5J?C!Fp_0vCy@B7gD^?Gdi-SDYF?->q6pLz37ui@)N#;fd^oz-qLDpz0oHF>Vz +z^JR~Z_vhEVUb}sjb=e-Fecx_nSA2Njxc+92mdh4y?$0-$Jo#U6`N)wYe>*BT7;edb +zRr;s&LY(W05uZ}U^y)mX%U{0z{Q2{B`TKjepY9Z&ck{RZyXDUA@_YkxbM?N1{gH_smS1gZ2i!zu+X218C^rSEOcwcVS +z%cbJ%a`k^W-(L+cUvapdzuI$>N4D)=)_Tv(nUen5x-)*( +zMk=2#{&;!5-P6B+o}WLetju3$#dCN$!-J>&*5R>&3(m21%v`_qTHUU@dH45~zn>S{ +zZ~xEb!;8iJE6VRx9?v(MeM-VP;9a--zW*Ouc-eRU4I@+2QhUL-j15Qo +zs|?qx#F{NQCsfGf_4QX(@|pDLwbycYm%WYp`{Qwcb-&%Oj_>EJt^fKhUwcmVo?hFQ +zYmat5pZ9fs?YBsCL&L&)5m$ev1KnqG?AOJV?zHS;Sa9x4xOB2yhS}`${eQpR&X%wJ +zGV#I3B^ +z6oGz*1H}vp_ODv^-YL20Fjw`N)U{i$ci(-tUdE!}!Mfve)j5CI?SHKPaMt`jkJa41 +zq%;@BH6f=go}Z9Ze!!IV{dXYe1f!1+9IPxXFMfUO@%-*QovKd#7L7|v*Zb~zF>K^y +zh-=!v+CjJYd&`+UhUYh*m$xo^bJ_myOMi2lKOYWHogP=E850rlVNS8e;T0V0Y(}DP +zv63vD3`gDyA7|T?X1rrUZ;9Dl-hhD4l8GsY(sth3Qo4HY=Xbk*tc%Y7ynW3~C)Fo@ +z3>Iwi&J(7I{ok{tr<=vNUn==sTtvi=tFqQ*Isf04?~ktk^YQp1VRgSBQQ3?gGFM)` +zeDI4`SLBdd@#a%0Ggq&RNIYP8X3ytqGfo=4U!?cSmf>jYxnj+U8F!cUemiIV{*iUw +z&y)>?SEW|Ce&p0Va+%}9b%qZ%3|j;z>OZropZ#Kw%vPQy2Q0Vmy#Bhj^!~ou`M+oH +z|2caqzx|)-57))+K4jwiRA@TK(wN$>ueM#468rv6@=B%gyG +z+A(G2l3wZFl!B)&=Buu9&3)RmHE{O!oYL~U#oPBj7T*5jb@-a5C=vPTP4nCixHCKm +zWthRr@HbHZ#neUL8MekOPJY&Q?bo*8<$kq)Z>G=R`_=mX&vOShpSRnr^6XrIh=*ugvvPx}W@RZ+F!@S1rn+vt&!)+G%_~edUiD8xKV~C(OOGD|hzZ +z*Y9>e_%=K5C$}0{DYaCvG0HJETxUq&o5uL1Fyt)bx$}XCEVnPZ{<=2v{JgvI +zwLc!Vo7?^QaQN%r-{09?1Lu6UJ|}VJc5WYA`>qZR#sd{oz516Fy?uO~ZOyg!f8~@W +z3z)44yL9YE#&V+zCuYuMX}D4K_3FEKyWf>gLqTVNAuTuC@57=^;&OccaQV+)+q-JjZS;*&CB2SH0|H7 +z=J?LM8@txVb!+D;{ZeH5V>v};3j;&i%|g3Zrhi%|uvjoJxe@hyW$<#pzxVp|XW5yEFS`;yKlsP6a!S`Zi3i56DwC)9wI!-e*_62V-dC-u +zR}8t?N@7GTs(*O=o$A-`7Fc*DV|(7sS6WlKxD|D#NZsAN>F0Y64~D---!rSu{Q2$W +z%gO(rS>LbB_$~kEpt)A{_jkR$hL0}!1qyj4?)6gbc6YCKTs&=t33EwLoQSy9`M>wh +z_?X7V^!Nl;a2&Xrbv35+YUt1D`@X3Doq677Lhg+X4;^HV_jg`eQOnL?#qfaPUmn9Y +znH61IzwNL6_jCUL?)ty$|CfH98XniVcI$K=A +zdfMufkCIY8JIy^WuAkAgXCG}mE+-!U@6+`B9gq8NU-$Q0w?mbq +zsa^2nat4FLXT%;nJ{^17vWwxtt+@5y_t*XZeSiP^`+s-WKYxE~tMJ@n`8N$t7NV_{ +zCN@{r_Vj)Wk&tvsxYo8QO#8*0S)G@UhNX0WW-hS{^1Au)O&?fJ3(Ue)in|36CK|Kav{ +z;rkly=(W>!tzZ`X$|&{j$YSMAo@ORV9V_k6Ve0SZ%v!l*?a>QjQFQ?g=PdY@-1o)D +zY%b0IJ^%me`l&S^wfB2XHMrB*ai6VW`2v%g^Cx4|Sa^I%xOaG=>pS&OBCF+ncr +z0UMK*!yRUZ-wX?WtZ1;hz0GsY=J!XYp88Y!{eJw-?dAQI&t@+7%&xt+x2vTfP9*K& +z0|#pvNxu-0=V$mz^aCR|N1hamp1S8U@7#SZ4GcGwH-$RhY&r7o*_yo`+?yYkEEn$O +zs*GOqB+7Bi+V#iYGdASR?4R`OyVkFS5XJ?347>?)DbE7a&qzdDA3WD*nat*UiQ9M9 +zk5xfS6AFH~PWtqprQz-dpVxmp8k}4b($bD|Dyd1E=Y_=o|8>2)nVtVhJHI^N`M4CJ +zL#$IRa9lfjP0(=r}oEGH%I?}5dQw#Yi4`qhUPPK +z>P2F{#)%7UU`&(!!FZ?o{oYqs!^@xC|MSc|b^Z0ve#|27KM!fB>5JmlIG +zWvmN4&d#$5@)Z-yn$9Jl)bzLzm%OKKs&xUi8--a$!Up-Iig-T}1R<>XfwX3@> +zzg4YLJo%|irb>9~k8`V@=LWh|-@J7u?PkZxNu7JHc3qm8IZ;Sp7;_f}3; +zi;v;x&NJ8Ab$8K=uT@s(h0=Y_ofBl*kk}CV-R{DN?A~m~kL?T-{vQf#D*pXzP4Sww +zrpw*JeYVs+Hs5FV>s9vpRO`6P))avmjVC|8yRmEQ+k+=R=H!&{Y|Fj*sQ<{-2mJru +z|5wkDw+-8TEau9*GP#Bu{7mLnhLJJFmwk_Zy}kYQ#>ec%KW}+YICHi#b5`rwJs%`5 +ztTtmSmXmtj(*Pde2&wR3E$)=yq&C`VzV*HmeY_UmG7Z`%%8pN +z8qeo!y(Z$iuwUU(GN}Fiy#Dp}`fA^WE?rx_j7$utt%=wvwC?7fqq{S2Z=LF^9e$j9 +zdD@ftoJ;SvZ`s|^aaf~Bcy;*e*ZKQg@7G+n-SBf(_MWQ6a-TXEXQo#KoZ0)UD{I~y +zvuO*Zd;4}hy#0RDy>GKuIxv}-IVUXN()R6PZBpU&=$w0%!OPYAoVM@G*pzpDN}SMa +zMTV(4=UN(8a0IJ)Y%M(`wR+3e((JjV=URCdJnNT_kFcpyk=~#8TT38Gl|d%yS^SQ> +z-{KamF+LWRyGHZVo{Ck57aHP!ewtn{e!M;N{>H^WkA<$@Gke{xWt-}XmaaMeagIu% +zMr_O-0TxCjrTI%EV+9s?txa2Qmb>Y;{ZGy6$GO`NURidwZtcYhPF^VtWvj1M{S&X# +z?c5f3Kk)PBu!_dkiGfQtaz=)%3R2qSB68(*(8o{bSN^=?uW7ks{^v67?NQ4Q=&&k! +zE0rDKVlYuEn|V+&om0m^Fzt*2LxP8prRNpq7AD5PsJUPJWGAZmwzod_ca;3Bb*|h$ +zedUkzKb#K^ul}CSaFi!u?$&EjXU~}FcV#+$*?aQi$6Wqo+@WfHJH!V~2)`WaLawVkbw(a*@x8LpEzNzZ2m3~)}qmu$dL$X=t +zwYf_!tkvl--uzRG;k5|YLvK|_PR>alKbxE~wy*ekW%1jc`+x2`x!j*YVzS^uEpZv! +zY+38)lY$bNlG6MIq*yNS?Z}c9Hcn}|k;LNd!K(B{#<3Zu&*QIAKI5SiK +z9MjV;o3F=T7C3e0!Nz~jmop~VGb}mtXW;=WW{qrJiR87#=NOt(pD{7;X)FFuIr^Z0 +z<&3FH)l&Ja2(D{)HCo;rD>QL&NqDYu +z*r6nOk-b5ap@U(;&NH40zYg#)9k4LY-*PR_Z&J$NM~@zH-T(gD+1Yvb(kcJhr~H(W +zKhs>Gx1ehg!`iLIeYy$}X=MRXzx#zBIXZ*{JX1Y$c=y6KC$E`dTA~V8>6Zj2D+J3* +z_*}nVF!^@LXWbn|m($i;S*R>s{%4t4?#>%VkH609wRvw6(efg+cD{(gJi|LmWy-*1(r&6?_F6@XhKon+~l%j5hmw;p7A+m#mJz+ +zA*;lo7^(6pRp7=3!v~8#p3F!%{H$@~>TL&4z0U7AbTF|kXrh8f=szijH3$zX?)^vO7Yq8(_|Nhx$^z`(^GUo)vYAV&r_It_0_Ql +z$IedOn7zIG*DF&;6B{qBbz7DO{SN5(%kaUB;m*4m*Q45WZ|yX-O>Wh;&Asx1sIB~Aegr@V3vys_q*R`=AbH5Z<2s(ch-v9C^Y$_W?|J*S+1JjjU@Q +zWz5?Dr+DS35G%)HR(@-?9w(-XMx-FD?f4=zQIwuSO0Qd%<7;Rjc3eX>5z``#T%Qgh%=AD`x&j<@=~*M_l8RBk9={eChkE_T!Q;;14A*c=Sz~O +z{dwoier<-z>yo0fbMNi{EZM52QQIkRrTCR+!6u#NMHkMT;S-p%+ah-NgrGFx$-*~} +zJehHA*MxJH@&YHOUb8i{-gK-?Y`K3*x4Qq1Une9UTZYIdubuU}#8GH#7!O}cW6;N) +z4MmY*D*1cwo#~g=TeJ08RQj6Yh7J|hUmhtQl~0au{KVe=C!wg7WfPST;FKM=a`GTI<}?rB}`rze%x_Wa#(gu)Dmuj_svR +z>E5HPhySiP9ND>A{?-pG<`pWZ7hc$PgSs`JXU41CT!aG +z!h|8?rlm>btI}ub#p$^k9p`2~UcPqf@>_FPDZKLKGigyzEjY$&w0Yi4zuVSvKHYxp +zzmF{s^0Ev$6?}Epmv;BX8E2ye{c=C-4b8SS-Pp7u?7IO6hbPAidu5&nT+eg#wU7AZ +zRp~6r$~HEL&+zNv<$7-58*H&PKff&N{ydd6S3gg^9uvNjhqwB9@W#t!(OdlIewud3 +zdEayEl`76F-_~aIADbz&)Knt3C~dmIVFu1my&EeUg+&-9RGfNjz;jcA`^>td4J$Y6 +zX@%CDo9Vb|^Df(Bt?QNNoaSD?+|p`zuVnREudbXmapFaiD{|JJ<&*c=?99HTl<&sp +zxvQ>fMs4g`wDt9(f~@9G*L^fCZKML0ss*eJI-}H7d~TU%(k2sAftJj5H5ZF>gkLWy +zi!o$aRPbiHrA))QsPZ>&&8_|a9;|=z($-qracNfmzpwXS-Tg6j{UZ7Bd!H8=ZhozI +z=H|CIJ_pWC6gb4o!_DCPx^S}xjwPzxA%(e +zf5^S5eyv;os;_#})%m+NH+mgo476M0vWg>dnZdeb3pR$5V>@2n-Tg`U{hmBUW$@oG8-9d9%?GuUOZ{zY_GB4d(}##H_g?arX4&3iiL6z^Le +z(tp$Q`5dPPGiH~L7l&PU1fh7Tl)Qy{Qqw{rL_3h{kJk1Km{RQy)rTDI`|XT@;=EBCd}o@4s$ +z$-22mKW@Jta!$h0Wl!N_x4)gU?GDa+{z9Sxhwd-F?yVRhZ24NpvMfb^j`2Z` +z2^B%JZhStFA)K9@%`|@kG(c! +zdA`Tyw9o3BSC;q5AJ3ato;7=&)0(Tbu2UErVy>9kRXy2I{rBW?E#u$c-5O3fRsOu< +zYtEhAv%05Oe;GIT)$9L%tv~W&*VoD&e~%^1(wO_ju$!eyn|bQI6TaJ1V?@l^u6&KJ +zm|%9l(BCmADPr|+m8UbWpF1;m=gvQK)#aZaoqW7Dt<7z5V9mG9^G&7A^WJbM&TG4L +zzr1ov=Tm+TW@Y9Jt{E?Q7&JAH@@Z~5r+NSLEvHl4Ox02tR!+I%Ai}>cPCRGVS3bdz +zRpO$XlhVqr?J8UU`kqxK6W@%ajg^mD>fc;&w5t5F!fsD}e2!;G-oLZ=&#wRZCH?BF +zgS+Iuif}*pGDE&&L)2C$FZK?eGe`eiJS=f+V$}bYx1)B~e+w=xI)Cm(Yx_SP&Q+!d +zdS@#!oKUNgp+kJnVFT|Yk>E3TmIq7ZA +z^Gu?zulN4E{(soE=QpQzvQ7E-gRA<()aiS^1_#%iPM7;oGEY7K?^*ul+Vi%;Rf$s$ +z^`}#Eu5WCUO7D6AQXAtYNGWw0SE0vK1x}q*F4|)HBJ2X*I0ksytuj_ +z=l7nw(<9!taOdN1)|c-8|9gMA?`$(!ai>25r<~dpUp&t-a9}wj%CLfAQUB8SCFWDs +z?JCyWW%K-yu}F-bbgauR3FV|kHS@Es&f-58xwiC0rQDOK9=s~%UrAT?w!7@vgz0Yfu`{MTX%kb +zdjGHX&X&?_gN<3CAImzVm#t=awW+hhCAt|im!9$nw}Zqw@Z +zAEU0WTCKV8^&|@g5njzX%;$8NCDZha&vZw=n{QDlbid-!#y?Nr|E=6m@MD9yiABVn +z`u~4#+W$QM-{o$}W#1>i|H&};L_Vv}TeCX4tn~GcMRP@uZDe|&Fh#4+##CS6KLf+R +zSu-~m7hbJy5OOj|nt3pJt*BRQfY;PT{U?6Tn-t{5!OE$`Y1Gx+xi)-t@Af-kvN1cg +zgn~HB`qmn%`3qgnHLEOq7GhTWp<#w?mBh0?*~8!N6 +zy>I#LcfWo1Jq#}ISSY%Bj{(<3@g=N_lG9AC1x|Z@W8VD3$-D1uw4Pt(BvbX&mA_ji +zf8WbxUk)o!2vofcZe_FI?ZnsSFbw+iLjMw{? +zZ{y)#E7f&~o%5qAgGH6zx+?yFd7mtn>ZFHnD1HdCeI|FryKt7EsO&ow)D^WnzA_uTvcz25S4R`#dq^J>*@ +z|GbrLQ~PJf?cY}xzq+wnKXh@_*{iR3jqS`wL7Klc#mpe0wg>T~;?KMBe +z8y=fF`*U$+aoM@0nMyYewayz~t?F%ebKmQ=cHNXITT-M#YR=!^leB1=U1@dk-&RzO-UPm`++{mQ23} +zqxOQ32lo~q+t0p2gKOv2X|9=ajyf#@r%k4Mrv2Mg_-E#wS)nrx9hd1!r0-SoJ-et> +zQ~B8$9fpm0U32dLxOx7PZ2zAfv&wEA64@n^E`A|MaN=K$P088UQ?K7C-F~y^^xC-G +z3JV3r6?-g|{q?rRKKaeP)qqEUAywePi6>rC@jFjBGh8kI#rF5{-tUSIOD1~76rL&5 +zK+V|qGgyH>}6$k|b4b_^yDY|>6!T4=FoF4dgszQ*GD +zG?OheB==po{A<76o(&c?6@`LUk>^%kTd{VkTeek*#l*=IIy5*AC`>H7R&*)Pdv3aT +z&rt;>?fcuCg(n|9=6`3+`d?SxCgq&H6~Ws0Mt>XQ5gvihd4VbJv$~6g`-=U!lG6GG +zrs}6EbSOCra30wZ|F^<#l1tK>sFmJ|1xZJgr7xo|^`mE8naZ;m$%CdMou>^`pg{-^Pjg0%2NhXYZ8 +z(@K;Wd?L!e%jIrsn{QoW5#@7xbXI?wEa$jeYi${~j +z$E6JiFRVX4?@_=?2hK@Mg8EI__omA*bE(7&C{3BUSA6-r$C(>g6q8cUyo}jfnEUpX +z@Y`+CKAUe?xO;Ut32f!q@mwH~i_=Brl#SYA!2_ml$2C@6`?Tfq)TQkFl7fyL2kS&$ +zzk0AhI@&sP&5bQH)y#8RE}CXHDXd$uZw51ihD6~-Mjff(6wi5q>b`rooM0;3cJ0;H +zrjG~Pm|glC9Va~S_*tpj5#(}l)sKA=Yme~ybN&D0ZyI#=`{D@A{Tr@5y(X0#>&Wqf +zGjOU(mX`pBOQ-xb_7c7%hHd9=HngZu*!98gJb?RBd0CXVntg%bhu2OP_%8@+KbB!t(LJLQ(tgBOLL)0+tjYip1!Bf+F@NE +zS85t>E1R3q)AuuQty=38rs+>(4I0eOoi!}7Hn;M%-3!)G>BR&wzqTl{QjKjnUNevUGb#pT{++ftcy#C}=m7*8wQxq2YcXSD?6<~4V*tY9| +zjpq)-otO6i+vmSrI&a6uNLi^*tD2kZYAamazP5$zljqbtuWmP^ardm!_?&r1IQ#RfacJb8L-(`A#yH^)m+?@W8;*;33 +zWjB|;X*(3ad1x|2fs9_;;$QC;7umZgC~ADM*}6r;yUJwxe*>Wjk1tKz)TF`fB|qQU +zDY45*#MA$Wqd?B?zkKoxb0$oh;1RRrhrzVitQ%F4aZApYWow+>te9qZn5n!kb=p&b +z_Jz}eboR?{I>*v_a`xUuGu}RNjZ?Ru;_|T7?+gRanFn4MQ%W+oFH9C|6cN!-wO?_m +zKu>GUNn6Jl{u;+r-fMSQ8(*z{z$B>NDzLgik%Q^~uc)=ZBpE717^+$#DuRA=a2&Ie +zXZ32FAaRL+wvLawhzm +zzt~3KCbvZIbnOe1;|3e9T=RIoX5$;7<8vHWZqgTDf8fkHt8LdTFPtk{0Ifds+HZ8J_>~uZ)If~%}7sDKLuibw*T^JQf{{7ZZTZ|i8eG|_d23#ax@sG{MIRSsQ)BS3Rot}deYpFc43&^mZC=0jP58G| +zOXQm6ZJ*6@j4wjJMlI=xV`-56U? +zc7I*v17rT0K+RGgPAj{()qY3ko#IZm(VN;k!P{Jj<9u`D$CIZO9||&vC^~6`+|m>l +zKQGUlHZ5wlkuQ&-&1(xqhTjYmjGLL+3J$zWS$_Mrsqyv*ex^w7KL;I7dg*@X4)7Ay +z64i7pbv(l4DWDk37kHc}CSvjP$y?U;o?Ry|&&ziBfr^qH4@3KdS{ugn;tsV=ym;~A;`#sY +zJXbG&bK~Oe4Ry^o_toy65G2Rez|65B;Nu?a?d#|4vHKMAI%N53tIED(yDkZKaNLS~ +z_0;vvxsCH{6c#Y3C|#YnA*lCJp7u+z$eTZ2&FMa&I`^ZslgU?uS7wJKYE{{mF7W!v +zqrlUaxTUV(fK2}O>d&5&dc(E7gkq;XQ$KTn??&Wv3v;#iqE^?hscj6}lbUg1{+h5A +zuYR(#J}hT=p!mYQ{=WaBd5j_qKEL*`l`Z3;P3N~ +zSx@Ep+8%~>UYjBkC4P?So4b)rre2zLpPcy0Ytvb-2*q`1DBJT$6`Ic7943){Zl=iL +z_y2Z>w5KpV-F|FUZ;C=!o2@3>MxHy24w=Tj*R(>9_x0;-+ugdgY)^=YNbHjBiJsOe +z3>(hPJY*Fc(Y@2qb-l)|PBX5?vlTMCd7Ygvx@=9-nrEffG0(kWf8(ZWt2o6cdT-n# +zE@bpMVE0|QnrAoDA6!`IoVYjc`sU4>e}4E-;Nl|Wb^2#M$H$BXPuA|6B+YgxVFu$X +z4uc0X!qua+9e*tJ@;+BR(W%0DYn$VdC0Ae1h{-;`QTU8cZNLlx$%!V4&sweoJ8e~a +z?ff!htK9D(9>t`BZ-r9@ic~ +zKkoGhH+|n%{I0FJoo`*`tCh=BcHjN>?d{$4`&F-XZ|x|29CrS5n1iIzJEjBO3?HnR +zTpA*d8htVBW7w}RxPCWN>f|Td`f`~(&#oHyRYy+x^68BEwFGHC2wrZb{ +z)2k~H!C#vVCL{?6DqHlQ2x)ravNdS+uX*;jeXEx5+WRJD`DE`!CKE34Pmu{wVRA9J +zwbO4|srA)kk;hFL+?-yu&ik@zUbuYc;)@QRpIUiX5}g%_&VHZ0Z;G41KN*I9!c*3Y +z+7*;S9;!xTD=r)y>RX4G0XE-Y+93Z_Xe!=y83;t +z{!(!dNlnL6&laZhlGh5RNzOdzASp1X(J1jN^Zh+BMkO;Vvl0^@zDl28eJ$H;w$Oq# +zE)_qgPJj619K&O>)N*O!_P1}b4YMFx;)9$=ndDNP_QPh +zeQI;>3E@MR&wWggl8cI7U9@7)nrM+?zf-G3looye_?^>9aH7z{pezlmwKjTpdm1ir +z2me*LrKre|6#12D`h^)4FF8M~*?L{xswCsdS@ZiL-gBeo6qh9YXRLpIZmv^ytuBL) +z)6VI0Uq^^B?(*VT-eOR&@Wq36^~MH8#cLdeGX#!LSrTQ+GetjD=aj+r4@(y{8gOmv +z;pz9e`Z~x!e@Ug?^z6%}XP)o1JO1X9)APQYLQ2yn-n?w@abtNm11IAFai`8n7sVb5 +zRo&BLysFXlXx3co@@xGvmPKybb9Vl;{CLS*KXLu_*-Q<&0aEjy?{Rl{Q`vMw{E$Li +zTIQerZugW^(ZB +zIfXS*JD-Ql{&ON}^<>G<3orNkGq+|iDFzCt1xRg?-!=0@P(Z=ar0l|1z2^5C;?}Es +zdNp_Oq%M`+|MOdP-mfbwvld^x(bv&`XyYES9NGAs_3>4&Yd)7#_D%m5<$5vasp|x5^%}(k;YJZYoA*S& +z=n;55y()Lo36`J?t5g^6Ovj?z3(JTimn? +zlRZs@lvsm)#pz68EeP_Q8Z9mLT84RdfTpV6MQ=p`->aYJsJjR=)bUNX=;&cs5F~Q+ +zm-6xc-7+hmuhCs&HlcL)!i!O&k!rY6fX>w)jD93NCq +zKj-_#J21rdXv+@iQ+-Uog08hNBy7;=I+?8Q7qWQ~N7dS+2c&$@@SKZW`1#IdS4Vb! +z`IFz?-9CP7MmA%D>YUxJK7AZBMW#=AU-(hnKV`M!0$a`VFT;YIRy_2wnPwawXHk~) +z@95&={qivxdM1~*L{DkGIkWKGhna!*z3UEfTnw4AoLMuNr9$l7GTolh@ +zzfrv<@5sa&`E;#cK`o1~o{BI(|2QqKM0{ELt%V|)${ZWSSSruYI>FS|^kI`l3S)!l +z#C4T&UPqc4KA13k(fhh!(#&w(ZMQ$x?B2VeTV{=(R?V$*4%?1-WcQ?Gf1E07T~SrF +z>tcpUp2Lyj5BDy9<+b2cop5+bzmv;4wtef^_LVQ3qU*WjRpN~mzZ|bxL@#MQmwstW +z?Vj6D&+II5-McQ?KUQpkz{N0|P!}(;jvqWz^cH*16H=d9S-SkPWW<{itIX}EuSKvg +zO-f*BNheUt1qvzxR2iaKJZ~sCV=91r)xv7BF3WacR5J<9r@r(1x@5c#Oj)#P_i53yyOTAp{^YI|V~kl6 +zVkW_+(fN((K>ze>&zigT?%(m9ZG*zZM(qQ6(hNK&7iqXX6BDbtb!*C8(PbJO3^Ia| +z$KOmi!LiavNXbd_&c46Due`gvd+*oR*Yd-?e4R4ob>6zODv5P@#2&Qms@445XtC(@ +zQO?sRte#E(Q~~*0bmD +z`?<_>Qi?7^PLuJ`ct(bmDn%tTo7=rxI@U?G>=I-9*E*$x-|LuV?Vh`FcZ|*N+g*EQ +zV(l6ylex9KEN;mkyH}=)v)bN^mfm-Esu4W(;w}5E`2W-A{}eGvWn);dBj$QN2Sa@G +zrLSMqgE#_X4Gk~ue7S0E<;3SRN_Q7!PT84boi*2pnS`kVj5o%*fzKf@GfpJ~=orVJ`fC%d!-CTs1~ +z)Q~EC5t|ct_-H_$&qIkd>K?tJ+FM_iEw9#kxwBPe>TI{R4Ua1SReo~{b9!<(@rBaT +zAeJ9?3^ttNCp4lK?f>!RYy+P{x>|w+Q_FA02ikv4|JF19@N~&gV)E8}`rpXLW)H8| +z_6e;)-i86Eu0Q?1{d8P0g9RtU?gwWixS5l*I@TyOoqjtbw5jW1)|tkj_qV@3Z5Cku +zkTgwwxz*i!uiR=E$o&XSI5snGlSSa_6THsNqW^8~+`j&4)2`=@4mDy7|Cmn2bacOZ +z^yXBOBdhB78dipPj17AkKIo=Y$jUAcWBPw=@%jdq2KC=0#nDjU_`Ri8KIbj;7{Y8s=OmmfJAbZx)jn~tYqxF$CuJ=V +z46W6-5I0wB=$(41?Qp{sf!z!b{1?;|=x5xq`|{GCLDH#AkEP``!-Llh8(10UB{jTP +z`rycNVgI))+ROJVKaB0Oy#A=>!f!p<%`I-6QCUX{BN-;U91U3d$m#v3!plOgUO#8I +zv9qUDd)_+R9k*o4_EmxMIV|tll+W+;kMAn6;K|i^Dl<*tFOQyq*w=;8`K&y;49puJ +zI4101XV}N}bk78P)`s~EhjW%4biFvUMp1wB^w|rq{92{|V51IwP57$#>7>G}kHotP5BEjC1O^&)l%TsZQc??R8@V1_mLCFy;f( +z86Rv8P}^J6%oxXTKyJa~`<1_*ey{mjbX&29VWrC>2e0-H@!Nl&)_MxPe3EO3Ll%JVy7H)L%!4gbuVia{$6Dccg#~}XcJ&q$JlV6r6GG^Pp~Zu +z&u+=sdEC7Ff1i+kZgVV^oy+SY`@Sh9mOXJS1smT#Z~i#-;WB=wmKCe#U6<~3ddpoU +z$M}yyZ-f5dpS9+WiIR*33=HpDgqBD#{9$GI*TCq<)TAo*VR!$YqI<>hoC|`SOoApH +zKE2=zr{b4@t&g1Ub3f!Ny4=bk=({GwO3dAC$|qfyKWtN$8a@A#X;=CE?gbG^iw%<` +z!^XGTt{4WcC=QTz8F-S5w++b4`zstj5&G68_@u6?p +z2?3d!zZ=E%UP-Ova92!FoG78ct@cBuhrrB*UOCCZL2A#X*!=sg)XFY4QzUGij!(2`y6<%K)yIT-94>Si}?-v5rX +zDNlw&LpXFl3&(yg)dlw%8jd#>9%S6T{@;((9}7xUk90CNgiK7>#gghIFtgF((#H4U +z_omODVSmA`gW*hNUe5N|jw)q`r*pj>6Il#42HmU>xjpOsS&k$2Yz^<7>_hV`J?`&+ +zYo@`(%kzf$QJ4nrjoS;?-1-shR@cg^&LQ{zn7`g0`MKTeI08CmR5a-rrk|7OpEZr*(dtUn8_r&+*M^f0>%FdjN)N|*HEO@`KshDqW +zaq86in;Us#tfx2~dUcZX@p)hIliB)*59EGNnc5p2V)^ngqmUx=p``4KRVr^>7VBm2 +zGk5N&XJWYDW_0pD&jh($|Ahk@+!9tW9$3rp;dX%8*D4kUxuj!%IaXZulCFEdTU`HD +zouWhIW0hR9yZ5HYW%!;yn;D#8*K!+A +zmTMBxX|9&rj#)gvbE(?w*oLibYYh|DvS#b(FdjSO-JrO+`QpUD@A?03+Mf+K_upA_ +zynEy4J#jjovrNwV&Re?m>+C-_omRX5`;=Jw)->Gx`nnlD93T4^Y?J2uBInGHj?*D!_cKVhT;Y=E@=lJ@|+>p2bxcq)kzl^Qc +z&B&5-iqrkA9B-a)y0LSqSwXt=%rj^Hy{zg?bu*s-bER>8{XVI94cB>2XC7;OJLbN= +z>BMJ`@>_e}_y1S8a(CV8HTQQ^XldWsUjHZK$BoDR;qL#B?k_mEb8o;iTbcIM#P0TY +zzgY|n6eRc=%oq<}XLt~&k?da2!=umOFrD#dcK`m8NU^V71tNk=6Gb!yS+8-j%oT6c +z-SR+aP4}xgMK{-T2~G)GcS&M`wq0fS{!hW>Nxx4h*1X>Tr(MZcsNARZ!}R(;>KBv! +zZ9`vgFVb4jBQ(db``_{HIj!@OOIi#W?l3XzXJ(LQe6XD1LvF&2rx!#I3I6#dJe^&o +zL7P1!Xl3Zz3$w1i%@fgx7Fp>RbS`SGLVkJ8Z`^LMY~u}HtaX3DkCwu*lp +z6qK%9^Ql~1Ucc-6xyk-%_y2xe{IPre-Z<|`F2|;Jy)NF>lzLU0|8B8x$plUY_Jur? +z|Eo<|EB&vdfq!{52~!*6^U; +z>%OaPCHkG8{Emy>l@qy}m$AvmGI_>Y)op$SmSNE3lm{&b*rz9jf<=-76@F7W_q=-I*(0dIYYt8g}+!eR^Qxzki*}2=d`Vp +z>R)$u8zCE-AQXH9LiM+R`O*3@c`a$2qxhFcw%( +zi7Am~*u%haKdE7RqoVP=w)_7cK7GDKn{!HQ(XU>6}?}pcJpWK|A|18#Z +zmz|;8+@GxvUPN1mR+s51JYVp0tVb*`e`AY;cm%lzMXBAX@ElKA1 +zwaDx_hBbeFE)N%(d##k=gDXP>!-M|}4gQ7+!gGt`tG}EoyeP`NO1_Vs;e^fk(~m8V +zU3M@O4|$dx?!7_cM%0@*vzC4PC>)sl^;Jzq*4nVf`}1yZ-#@8*_rjChr*_$%m~7&% +zbkoMrHmA$!SK*a4y*%ej(w=AS($H!-GIim>wA_@8jn?;Nu2t$iYOFGU{bkkOqt_Ia +zcK!O1ar?9F&mSLOx=mZg)p|jD{jEE%%w{XCII?ham`>)BGiM^VPd>A6i{wM|c|VRel-z85CH%cnYt>XOMWu$~1Lq=zE=_s(^OEzz&u4@> +z!|uIxyPUr_^!>RrOPYg&_jYEl%RDP@5%A^NvqweWY?KX@HweF(vn9%#Wx_ej#7|6~ +z9M69?M(-`1EqdtnoEzKCbIzaNU>GHm`HGPteeODkHM`=rYp*qQV%-jrrthpN0dv*1$$Ft3JZ=4i;dFCK9@7(7V +z(?03#(cqc#o_XR4_ptTv{9=o9<-)Qinug`=eR}QDi+SZ=9+uxz(|Eq9x!7-#$g>#V +zt#dZ>FiaDOJv;fQdVAK*Tjy$c*%$qM^<-6ksh`Z>KEs=95{lw$-+a31CT|(gG2`dH +z{H&`{mfRC0=NPKkyx*dBtnZ-Mt?ybQt27?%xtyA|Y|m}pXW!mU-gbGhuX*hv^LnwoT^Vz2$_9iga>vVseE}XEt-CfP2}q6Axc?)>dnGbj<(pM|`$)-kyu|?F(ac +zWNh~>QLI|@roBQfi046%>As+wud-OS^P0c;dYIR8V`lNbujc>a%ytxB-d9pq_OA2) +zOZnY%=hrO#5?tfcpd}nL$tp@y=KlG;=)9zIMD%0#k4gO+N!h9l3$8}# +z&atrj@Xa`KOWEzKbI)$CG19%n(v>%ByZE!a501EO%DQ}wr}4pyb8`>Qn;w_3|~rCmvj`X?CO|IV%C#1?i=Vm{;V$9E-eSSGyQ +z@S?2w){zP|e~s1N3m6yn!#0cJQ^E7xJ2a+w+c`Bj#*5DG +z{A*n!<-v0?S^e3a=({Fsz6CuLxLnu#yI+U(ffw^srKDHC>-=1pBy7@q_z&ECnJ~BX +z$r@4D_2LslVntn7p4((x^lgUZXOpS!<@Y>NID~iQ4|->;3=Fb@$$wqV6ZNylneg-_^6v&9xF$*dXh^Kw7=+h}O1y +zG1F$t%Uhn@EpEM0I7qBj@6<<;4-?g{#CR_F6&UAp*uZ2{4j)Z^fA>EP&5 +zJKcJ+Sd^FVR!QN-kGqxC{3dUn7PZ;h4S%Oa +zS6#nf9`A9k^=_W}-Qw@HCvUIcdn-%UDq(xI#JUSB_piU2XM6o}Rk?oj%*f}JOmhs| +zen0;aQ9Q-%hzgJM;wg`oUQJGpwYU4Amn^CL$xpq9js5na&qRIS5PgRjMBG58Yc6;=SjY=elONI(=awBBu*qSV*T?1N$v+#Z>N2K +z73_b^IF&FF#@Qk%E&^8dDQ6z-^0g`WZToAPe*M*Tw`)Z8^`DxiHWZy~uG{Ap +zyWe2f8=0%${UTi691T3PZ~v8G@xT>D6AJ%NUf$f~y8ZQQ6Va`mojQ>b9l4e}o=)nV +zdw8aD`{C*JpBCph@4eM~ZN2d}!x>9=vL(;`xa2_GtOIvW3M-ur`kB`;bD{pPY1dwe +zU$%H$`@*Z!&fR6NMW11WSJ-soTqP`&eENfw%KUk+f{L|e|+3xZ63Z;<|r%2 +zfqkaSHvRTZ{BP6Q=i?)`n@#OSN*+-#l!MnQQ_soknWnnTU3O@7$mK@U?3im=KbL9ft^C^P +zP;z*lSDx&um$Q{LXCLoB__{LC=Kr6*R~HW-mvTrscHMvGmfO9vE-%kg&JNet$ +zt9xyYC6{1zph%|zhu7aeS*AsTUYW_o>(}JgeCH0!e&;j)$%a6Et>omp*FHY}TAbM+ +z?%WlyzWeZ-brW~Z>~h|@fA*|&F{_Xa!3yTyJ92huzSB6@n%?{uuWf3PSE=K*W=~WS>JZ-ITH4_#qjRTd3>Mp +z!g<$5U;n0E_{(vNLwwhxUk9UJ7YjQ(bo^O7`SZJv!DkE1t}9l~Tgk_pc1=R#(j^uL +z7l$QFFZ4{CcWSzmshf0x>h{_-jY$kIJQceS@S6m2PT6dxWxe*nrIc+?J*PW3Nvz&F +z%s<7=bdrEtX;4?EF%beK~Jo_qCh-d()X176=5X +z6v`M2PW?3RXUSa$&9Zw>MbdQ*tsR}F*zJqcpJ88;vBc2uo@Dg)Z8LSYbzNI|(`#bt +zsYvhV5jJj0=}Qv?+iqSs5s+VW`Iyb?uPg@*m +z@AtSgd4zUNTKoHO<&2Aw&$(4y?{l$d>+USFICFf~VhIMWr6EzPueJyzoor9*Y&ljm +z!{D%F)cnbBEYu3qelEZ2R`N{z(6=`+%XeQ;d8ui@Q +zkL(FVvl}R2h +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 +z*7P{AzoPrXedg!EUO#=Om&|xW~QAA}#N= +zM1V{ok>p9nI-;z +z&BrZU9QC}fDF~__u+*9D+jK0+#ewa;`O>J}duBc?jug|^cwaVm_lLx+MJ$t)iv%U- +zuVntZxhwL_wiRhH_kV`#_2(Zru*vOq(!g)nbZ +z2x|a#^%i9MQx_&=1&BFTi_PA(Q +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 +zj$d<7qe8>seO)8zQKbq-Oi`Dy!E%KIZ +z*{|7Jk)3ZaX|M4)^LJH7XVy17u}>>ddSlr*p+Ly-pR&`f^BlAKxNaoOI#76LGvnm7 +zhTUd8ZPr>JN-IoWr7!f>Ju+L1EnlT$r68x!(J$VgfWZiWVB8uMDM*HE;V}>#>;4L^fngr|`0?KR6w4{ZaI1+#z;s%MG8S +zJKfw_U+hx;Z&D`hA|>Hcly+sa==!AMOsBa!zg&=AJ0s)h>d4+B4<{Mgnm?YQz1MKj +zn|X7Ej#;m?{BEEU|BET)ZSIGwn(A+?Zt@kXZ$B7y_^q!*@&^B#K{pcS#G5rtxS8B! +z%Uk#7O1#9W2`-al9Ic<7b26(BwESt7^fw{SCF8j|)B5O7f<9%r^LK5?E>4(He(>&% +zDj$~kd2uYW?iF9<1|Tk +z&5@>nBZs*sNX&bspn87l#-sXgRPV3vQF=OY{-jeUWOI&cv1-oxEv0jKV}MT_zwX|Z +zX{`jXu4_SaxE^cG<@U#)?{NHHC)T)2ch2-*)dEu!PObGh +z_&jIY65g-IFDG(4o9MXc)Ua)=kW4!Hxg+(wqFllpK3|t>J#)^*|M3!3mvy@nkmZn^R)-`?=;(QyTP>(1#r%z08en%hg1rmB}do1h-q!raLubAh8! +z!LuW8D?{Ykj&Ce%Yc;hCs*`lIN^XA)+s5Lrs_(GyPUC`o51OX*SzP#|^F;H%b)Ia@ +zA2H3ScOPFgT|CQ~edOLlFQMf6MMn-V9GaZg^3Remi;!o*d! +zta-AshFQ$*#D)aUvr!H2QncosS>S#6!GtiU*%!YQyLN?_D+QFQ=M~LpRCU?pE7@`+qo5$TK643iLW#$w=-2(#3u2^Kk37=pdRL|ECrzZPGdY_#X&jyJns#$H&y +zfGvgbY_v$%_Z5wN7cN|Tt!sO>?z>@&MV7+0gUr^iu73#Gw=n*+PdfjZ%mZ%(-h_5; +za92E*ZDeTmcx9u-|IN{lz6UVh6?gRgZU6n=(h!?%ef!$PT4o5FZdj?)u>6y(b7cR1 +zmrYLV64MNJy~uqr#c<0XMUSNAGB-sg8^{|~zgGNv>VvDw;?RH#clWPe$-T{T+GmmP +z{R>S#dQB3mNzw4UWUIjcPQE8yihUnX)Wf-FUPSV)j9va>;_Kxz?=!s2RDP2qVf)eE +z@yWl*cdA{^fAdzIcs==u@sAG%W%Cmi7FLSt{ub&m>wi_>^OJ{J+2d|EFg^kDmTN +z-{JqUp8snif9}}$e`oOvRjW4vN#D2a{lCoj*X0`@YdXKJ*zo7k)A#S+@87?_p`qbj +zeEw^vkooiH3kV2+9IBvj{``3d2Zw-w00RSqgoK3k>(>_)6nvSvIL|?yg@J*AsU*lR +zm|?z{vh!O81_s6?Z+91l4pvzY1_lPsd^fjZ1_s6s1_p**3=^j0{$*fbU@!6Xb!C6R +z!zrL5SGqDs2Bfa6z%iYHfpIMZ17iroNh7yc3=E8No-U3d7N?I+&J1pL;Ay+Pq4hu! +zhn&OG0KUd+asU5cpZVZYQ^&a##{1@PI=R`?Y;vs5KPT@Q7lRlLR?laeC6KhVo>AgN +z)LG_b>!KGaA8Xhmd;RN;UB*23owgiva7YxIUGg`s`oM9)gx%|ynjU!a8-5XNZ&>~) +zF#SjalfYT&3-{l%O3XUU^P2x7he`0^=h_O&->R}bcTVD!oijz}?tZ2ig>wnB#Vzf( +zFG*HypIlS_-}|nK?{4KoFMr7}goHTVE4ek<{w;eEvl+vB-|7c43##TZ{1$6?v{mZV +zik9Q5eP3Vt9Ec3{Xk#c1J^8jV+JY&@VqTxP+Uh$e&iT1+oUCbokW)?i=s%6V-JO=( +z{^UHJ92r>mdKI;Vst0J=;; +AE&u=k + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/tw.png b/board/ant/msd/img/tw.png +new file mode 100644 +index 0000000000000000000000000000000000000000..afab2a9892a698e6a916e00d36fb740f6e1baa96 +GIT binary patch +literal 849 +zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tGSkfJR9T^xl_H+M9WCckk +zdj$D1FjT2AFf_CsQ4^pKgEnYrpdKbhVJ;PvgA|V;qRO7|Gxh2@8X-kB6fW} +zbo@s=0|NtFNswPK1B1cNU*F#Kr)*?kU|>x0c6VX?&!l^gfq{X&#M9T6{Sh}WgPv;8 +zLzO-T1_puTM87fy2FA4v42&TR42)f%U=Ngh5yQa1$mHqb7-DgH?d0_ELk1#k8+E5M +zX}vZQU8>-GYQjSX*Ob*c|Ni%Hbl~#66lDLQ=ETXJ?~99!@?`k3^|rk^F8s$`z=hL7 +zCGZ04LC$3stV$gTjUFr~y(V-pOp{=_zEESg?Y-056V_`Ue9k|?M#8DLKt*bCi-lTV +z+0R^|@|Jh+G!i~^`A}ZZ&|73eH7@L +z!@$6xTH+c}l9E`GYL#4+npl#`U}RuuscT@UYhV##U~FY%Y-M7mYhY?+U{I0o@*71% +zZhlH;S|vz>g|4BYuAy;=fvJ^=nU%3QM8lHP^F0_C7$iY91m~xflqVLYGB~E>C#5QQ +c<|d}62BjvZR2H601*LNaPgg&ebxsLQ0AV?maR2}S + +literal 0 +HcmV?d00001 + +diff --git a/board/ant/msd/img/version.js b/board/ant/msd/img/version.js +new file mode 100644 +index 0000000000..71f0f84063 +--- /dev/null ++++ b/board/ant/msd/img/version.js +@@ -0,0 +1,278 @@ ++function OnTheWeb() { ++ window.location.assign("https://wiki.analog.com/university/tools/pluto"); ++} ++ ++function versionCompare(v1, v2) { ++ var v1parts = ("" + v1).replace(/[a-zA-Z]/g, "").replace("-", ".").split("."), ++ v2parts = ("" + v2).replace(/[a-zA-Z]/g, "").replace("-", ".").split("."), ++ minLength = Math.min(v1parts.length, v2parts.length), ++ p1, p2, i; ++ console.log(v1parts + " || " + v2parts); ++ for(i = 0; i < minLength; i++) { ++ p1 = parseInt(v1parts[i], 10); ++ p2 = parseInt(v2parts[i], 10); ++ if (isNaN(p1)){ p1 = v1parts[i]; } ++ if (isNaN(p2)){ p2 = v2parts[i]; } ++ if (p1 == p2) { ++ continue; ++ }else if (p1 > p2) { ++ return 1; ++ }else if (p1 < p2) { ++ return -1; ++ } ++ return NaN; ++ } ++ if (v1parts.length === v2parts.length) { ++ return 0; ++ } ++ return (v1parts.length < v2parts.length) ? -1 : 1; ++} ++ ++var latest_libiio; ++var mac = false; ++ ++function GetDriverurl() { ++ mac = navigator.platform.match(/Mac/i) ? true : false; ++ if (mac) { ++ var uAgent = navigator.userAgent.toLowerCase(); ++ //uAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36".toLowerCase(); ++ var test = uAgent.match(/mac os x 10_[0-9]*/); ++ if (test) { ++ mac = "darwin-" + test[0].match(/10_[0-9]*/)[0].replace("_", "."); ++ } ++ document.getElementById('prompt0').innerHTML = "adi-mm:tests analogdevices$"; ++ document.getElementById('prompt1').innerHTML = "adi-mm:tests analogdevices$"; ++ } ++ var win = navigator.platform.indexOf('Win') > -1 ? true : false; ++ if (win) { ++ document.getElementById('prompt0').innerHTML = "C:\>"; ++ document.getElementById('prompt1').innerHTML = "C:\>"; ++ } else ++ document.getElementById('hidedriver').style.display = "none"; ++ var linux = navigator.platform.indexOf('Linux') > -1 ? true : false; ++ if (mac || win || linux) ++ document.getElementById('hidelib').style.display = "inline"; ++ else { ++ if (navigator.platform.match(/(Linux|iPhone|iPod|iPad|Android)/i)) { ++ document.getElementById('libtest').innerHTML = "Sorry, we don't support " + navigator.platform + " yet. Please ask."; ++ jQuery('#libtest').attr ('href', "https://ez.analog.com/university-program"); ++ } else ++ document.getElementById('libtest').innerHTML = "Unsupported host \"" + navigator.platform + "\". Please check, and report an issue"; ++ return; ++ } ++ ++ var i; var j; ++ ++ var req = jQuery.getJSON("https://api.github.com/repos/analogdevicesinc/libiio/releases/latest"); ++ req.fail(function() { ++ document.getElementById('hidelib').style.display = "none"; ++ latest_libiio = null; ++ }); ++ req.done(function(response) { ++ latest_libiio = response; ++ var select = document.getElementById("os-select"); ++ var suffix = ""; ++ var os; ++ for (i = 0; i < latest_libiio.assets.length; i++) { ++ os = latest_libiio.assets[i].name.split('-')[2]; ++ suffix = os.slice(-4); ++ if (suffix == ".zip" ) { ++ os = os.slice(0, os.length-4); ++ } ++ for (j = 0; j < select.length; j++) { ++ if (os.match(select[j].value)) ++ break; ++ } ++ if (j == select.length) { ++ select.options[select.options.length] = new Option(os); ++ if ((win && os == "Windows") || (mac && os == "darwin") || (linux && os == "ubuntu")) { ++ select.value = os; ++ libiio_type(); ++ } ++ } ++ } ++ if (latest_libiio.hasOwnProperty('tarball_url') || latest_libiio.hasOwnProperty('zipball_url')) ++ select.options[select.options.length] = new Option("source"); ++ }); ++ if (win) { ++ req = jQuery.getJSON("https://api.github.com/repos/analogdevicesinc/plutosdr-m2k-drivers-win/releases/latest"); ++ req.done(function(response) { ++ for (i = 0; i < response.assets.length; i++) { ++ if (response.assets[i].content_type == "application/x-msdownload") { ++ jQuery('#drivertest').attr ('href', response.assets[i].browser_download_url); ++ document.getElementById('drivertest').innerHTML = response.name; ++ } ++ } ++ }); ++ } else if (mac) { ++ document.getElementById('hidedriver').style.display = "none"; ++ } else { ++ document.getElementById('hidedriver').style.display = "none"; ++ } ++} ++ ++function libiio_type() { ++ var select = document.getElementById("type-select"); ++ var os = document.getElementById("os-select").value; ++ select.onchange = null; ++ var i; ++ var j; ++ for (i = select.options.length - 1 ; i >= 0 ; i--) { ++ select.remove(i); ++ } ++ var suffix = ""; ++ for (i = 0; i < latest_libiio.assets.length; i++) { ++ if (latest_libiio.assets[i].browser_download_url.match(os)) { ++ suffix = latest_libiio.assets[i].browser_download_url.slice(-4); ++ if (suffix == "r.gz" ) { ++ suffix = ".tar.gz"; ++ } ++ for (j = 0; j < select.length; j++) { ++ if (suffix.match(select[j].value)) ++ break; ++ } ++ if (j == select.length) { ++ select.options[select.options.length] = new Option(suffix); ++ if (os.match('centos') && suffix.match('.rpm')) { ++ select.value = suffix; ++ } ++ } ++ } ++ } ++ if (os.match('source')) { ++ if (latest_libiio.hasOwnProperty('tarball_url')) ++ select.options[select.options.length] = new Option('.tar'); ++ if (latest_libiio.hasOwnProperty('zipball_url')) ++ select.options[select.options.length] = new Option('.zip'); ++ } ++ select.onchange = libiio_ver; ++ libiio_ver(); ++} ++ ++function libiio_ver() { ++ var select = document.getElementById("ver-select"); ++ var os = document.getElementById("os-select").value; ++ var suffix = document.getElementById("type-select").value; ++ select.onchange = null; ++ var i; ++ for (i = select.options.length - 1 ; i >= 0 ; i--) { ++ select.remove(i); ++ } ++ for (i = 0; i < latest_libiio.assets.length; i++) { ++ if (latest_libiio.assets[i].browser_download_url.match(os) && latest_libiio.assets[i].browser_download_url.match(suffix)) { ++ var file = latest_libiio.assets[i].name.replace(/libiio-[0-9]*\.[0-9]*.[a-z0-9]*-/, ''); ++ file = file.slice(0, file.length - suffix.length); ++ select.options[select.options.length] = new Option(file); ++ if (mac && (file.match(mac) || ++ file.match(/darwin-10.[0-9]*/) < mac)) { ++ select.value = file; ++ console.log('hit'); ++ } ++ } ++ } ++ if (os.match('source')) { ++ select.options[select.options.length] = new Option(latest_libiio.tag_name); ++ } ++ select.onchange = libiio_url; ++ libiio_url(); ++} ++ ++function libiio_url() { ++ var os = document.getElementById("os-select").value; ++ var suffix = document.getElementById("type-select").value; ++ var ver = document.getElementById("ver-select").value; ++ var i, url; ++ for (i = 0; i < latest_libiio.assets.length; i++) { ++ url = latest_libiio.assets[i].browser_download_url; ++ if (url.match(ver) && url.match(os) && url.match(suffix)) { ++ jQuery('#libtest').attr ('href', url); ++ document.getElementById('libtest').innerHTML = latest_libiio.assets[i].name; ++ } ++ } ++ if (os.match('source')) { ++ if (suffix.match('.tar')) { ++ document.getElementById('libtest').innerHTML = "Source code (tar)"; ++ jQuery('#libtest').attr ('href', latest_libiio.tarball_url); ++ } ++ if (suffix.match('.zip')) { ++ document.getElementById('libtest').innerHTML = "Source code (zip)"; ++ jQuery('#libtest').attr ('href', latest_libiio.zipball_url); ++ } ++ ++ } ++} ++ ++function CheckFrmVersion() { ++ GetDriverurl(); ++ var req = jQuery.getJSON("https://api.github.com/repos/analogdevicesinc/plutosdr-fw/releases"); ++ req.fail(function() { ++ document.getElementById('versiontest').innerHTML = "Can't check right now, try manually"; ++ document.getElementById('sysroot').innerHTML = "Latest SysRoot"; ++ }); ++ req.done(function(response) { ++ var VerOnGithub = response[0].name; ++ var VerLocal = "#BUILD#"; ++ if (VerLocal.match(/BUILD/)) { ++ document.getElementById('versiontest').innerHTML = "Seems not to be deployed"; ++ document.getElementById('sysroot').innerHTML = "Unknown SysRoot"; ++ jQuery('#sysroot').removeAttr('href'); ++ } else { ++ var res = versionCompare(VerLocal, VerOnGithub); ++ var message; ++ var sysroot_message; ++ var j; ++ var k; ++ var sysroot_url = null; ++ for (j = 0; j < response.length; j++) { ++ if (response[j].name.match(VerLocal+"$")) { ++ for (k = 0; k < response[j].assets.length; k++) { ++ if (response[j].assets[k].name.match(/sysroot/i)) { ++ sysroot_url = response[j].assets[k].browser_download_url; ++ break; ++ } ++ } ++ break; ++ } ++ } ++ if (res < 0) { ++ message = "Newer version available online (Version " + VerOnGithub + " )"; ++ if (sysroot_url) ++ sysroot_message = "Old Sysroot for firmware " + VerLocal + ++ " (please upgrade firmware to " + VerOnGithub + ")"; ++ else ++ sysroot_message = "No Sysroot for firmware " + VerLocal + ++ " (please upgrade firmware to " + VerOnGithub + ")"; ++ document.getElementById('versionsection').className = "download"; ++ } else if (res > 0) { ++ message = "Wow! Your Pluto Firmware Version " + VerLocal + ++ " is newer than (" + VerOnGithub + ") on Github."; ++ sysroot_message = "Firmware " + VerLocal + " doesn't have pre-built SYSROOT"; ++ jQuery('#sysroot').removeAttr('href'); ++ document.getElementById('versionsection').className = ""; ++ document.getElementById('plutsdr-fw-download').style.visibility = "hidden"; ++ document.getElementById('hideupgrade').style.display = "none"; ++ } else if (res == 0) { ++ message = "Pluto is using the same version as latest release!"; ++ sysroot_message = "SYSROOT for firmware version " + VerOnGithub; ++ document.getElementById('versionsection').className = ""; ++ document.getElementById('plutsdr-fw-download').style.visibility = "hidden"; ++ document.getElementById('hideupgrade').style.display = "none"; ++ } else { ++ message = "Failure in comparing version, latest upstream is " + VerOnGithub; ++ sysroot_message = "SYSROOT for firmware version " + VerOnGithub; ++ document.getElementById('versionsection').className = ""; ++ } ++ document.getElementById('versiontest').innerHTML = message; ++ document.getElementById('plutsdr-fw-download').innerHTML = "Download version " + VerOnGithub; ++ jQuery('#plutsdr-fw-download').attr ('href', response[0].assets[0].browser_download_url); ++ ++ document.getElementById('sysroot').innerHTML = sysroot_message; ++ if(sysroot_url) ++ jQuery('#sysroot').attr ('href', sysroot_url); ++ else ++ jQuery('#sysroot').removeAttr('href'); ++ } ++ }); ++} ++ ++window.onload = CheckFrmVersion; +diff --git a/board/ant/msd/img/yk.png b/board/ant/msd/img/yk.png +new file mode 100644 +index 0000000000000000000000000000000000000000..bcb5cf5d62656b664c2a1a7ad75df3d9b2aebd83 +GIT binary patch +literal 888 +zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tGSkfJR9T^xl_H+M9WCckk +zdj$D1FjT2AFf_Cv7WJ$m%$^y$<09z42s^X|E`=MEk`c(=M*-oJnU;p)5hj|&T*=&HVc{rXa(!naDnJHY{WHI!b}n>lSi +zQ+MdzwnuLiw>$~jeR0K&7muGjf70E3FE;q`!uc;vTvHC;cwC@A`QpRN4yISV?B~s! +zw|n<)W@YQ7q@;qvLRWXs)YMci1NXzHFElnbPMS1n&6+j;|Nm$0-?s-8E+s*J!3+${ +zVOy@<{QK|U#lK!F9;`jXz`($mgddx@v7EBhmEUIsnYpoc1b3=9kc +z$%%et3=E8G85kHt7#JA47#JA7*{z(vmw|yX#nZ(x#NzbY%e=u&1`-DfKdYK8SM|<4 +z9QCjv(Z%SY;>q{__ulfU@!Yd(_5VWiyx#{6-(Aa!eRt~GFYAo*U3=Sh&Hct#(q`Vv +zYi)f&I&MXD^KI_0b-ZqROO?w@o?kLtT4Jk|W#&rLnf@;ye5#fW2R`nuOr6@_PZ1k8K1aeIa5k}uAZXZszt2*hX}OzThj +zb83>x)O}wrE8Jpc-^=+#W0^qou@nAt4SXl7l<+a=Cof+p^<|@^c&e#ZyFKCN8htb0?eMh*ex-?lGG&*=1kjTO+6V +z`WyFdvVS<)e@p-NiLf^ZA7t2ey_!Dbq+@LX+uvhsZ|kjR+c)|bmY8nzGTXe6fq_A_ +z#5JNMC9x#cD!C{%u_Tqj$iUE2*T7KMz#_!J*viP*%EV09z|_jXpd#PpH;RVb{FKbJ +zN{|K%T|+}%L*ozwQ!5iQD`Rtrh9#%xdoVCCNP=t#&QB{TPb^Aha7@WhN>%X8O-xS> +XN=;0uEIgSC$_@;ku6{1-oD!Mu6JkeEsWTbUhL+PrQ{k_=W#|!6w{r2ts`wx!` +z3!ij%pOllk_u$c;;DE^|FKMZZXN%uU~Hy7T+c&wM|m?|NsBz7~&%t7#KK8 +zg8YIR7#JAB-@FNTV>CI*z`($mgddx@v7EBhmEUIsnYpoc1b3=9kc +z$%%et3=E8G85kHt7#JA47#JAlOg<<6n}LDhhNp{Th{fr(lV1xpDG0dfIv(IwSkgBA +zd;M7zGgqe7Gx^T#IxJ^*Ts|doR`=1X!utf)aRh&3JNkl)Nh@-SP-8gw882%(Ho=kl5PIY$GD2_{3~$tTe}|cU}?OH2g1UpPKvFoI~K$yDFyg=hkbh +zu77lph$;GBbX0)rljrjHcS;v7xKqZQuNfM1!;-^owwXv&ZjXA#U2n@>7c*wZv2!j9 +zZf1|KPxm)4REs{x^10ip>c?Tsg;SDm9aTQ!;;hUJs21mBtbR==ckpFCl;kLIHu$$ +fr7C#lCZ?wbr6#6S7M@H6r4a^CS3j3^P6> ${TARGET_DIR}/etc/fstab ++ ++BOARD_DIR="$(dirname $0)" ++BOARD_NAME="$(basename ${BOARD_DIR})" ++GENIMAGE_CFG="${BOARD_DIR}/genimage-msd.cfg" ++GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp" ++GCC_VERSION=$(${BR2_TOOLCHAIN_EXTERNAL_PREFIX}-gcc --version | head -1 | sed 's/.*(\(.*\))/\1/') ++BIN_VERSION=$(${BR2_TOOLCHAIN_EXTERNAL_PREFIX}-as --version | head -1 | sed 's/.*(\(.*\))/\1/') ++GCC_TRIPLE=$(${BR2_TOOLCHAIN_EXTERNAL_PREFIX}-gcc -v -c 2>&1 | sed 's/ /\n/g' | grep -e "--target" | awk -F= '{print $2}') ++if [ "$BR2_TARGET_GENERIC_ROOT_PASSWD" = "analog" ] ; then ++ ROOTPASSWD=$BR2_TARGET_GENERIC_ROOT_PASSWD; ++else ++ ROOTPASSWD="********" ++fi ++ ++sed -e "s/#GCC_TRIPLE#/$GCC_TRIPLE/g" -e "s/#GCC_VERSION#/$GCC_VERSION/g" -e "s/#BIN_VERSION#/$BIN_VERSION/g" ${BOARD_DIR}/index.html -e "s/#ROOTPASSWORD#/$ROOTPASSWD/g" > ${BOARD_DIR}/msd/index.html ++ ++rm -rf "${GENIMAGE_TMP}" ++ ++genimage \ ++ --rootpath "${TARGET_DIR}" \ ++ --tmppath "${GENIMAGE_TMP}" \ ++ --inputpath "${BOARD_DIR}/msd" \ ++ --outputpath "${TARGET_DIR}/opt/" \ ++ --config "${GENIMAGE_CFG}" ++ ++rm -f ${TARGET_DIR}/opt/boot.vfat ++rm -f ${TARGET_DIR}/etc/init.d/S99iiod ++rm -Rf ${TARGET_DIR}/etc/dropbear ++ ++mkdir -p ${TARGET_DIR}/www/img ++mkdir -p ${TARGET_DIR}/etc/wpa_supplicant/ ++mkdir -p ${TARGET_DIR}/mnt/jffs2 ++mkdir -p ${TARGET_DIR}/mnt/msd ++mkdir -p ${TARGET_DIR}/etc/dropbear ++ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/update.sh ${TARGET_DIR}/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/update_from_github.sh ${TARGET_DIR}/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/update_frm.sh ${TARGET_DIR}/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/udc_handle_suspend.sh ${TARGET_DIR}/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S10mdev ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S15watchdog ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S20urandom ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S21misc ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S23udc ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S40network ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S41network ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S45msd ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/S98autostart ${TARGET_DIR}/etc/init.d/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/fw_env.config ${TARGET_DIR}/etc/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/VERSIONS ${TARGET_DIR}/opt/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/device_reboot ${TARGET_DIR}/usr/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/device_passwd ${TARGET_DIR}/usr/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/device_persistent_keys ${TARGET_DIR}/usr/sbin/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/device_format_jffs2 ${TARGET_DIR}/usr/sbin/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/motd ${TARGET_DIR}/etc/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/test_ensm_pinctrl.sh ${TARGET_DIR}/usr/sbin/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/device_config ${TARGET_DIR}/etc/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/mdev.conf ${TARGET_DIR}/etc/ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/automounter.sh ${TARGET_DIR}/lib/mdev/automounter.sh ++${INSTALL} -D -m 0755 ${BOARD_DIR}/ifupdown.sh ${TARGET_DIR}/lib/mdev/ifupdown.sh ++${INSTALL} -D -m 0644 ${BOARD_DIR}/input-event-daemon.conf ${TARGET_DIR}/etc/ ++ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/msd/img/* ${TARGET_DIR}/www/img/ ++${INSTALL} -D -m 0644 ${BOARD_DIR}/msd/*.html ${TARGET_DIR}/www/ ++ ++${INSTALL} -D -m 0755 ${BOARD_DIR}/wpa_supplicant/* ${TARGET_DIR}/etc/wpa_supplicant/ ++ ++ln -sf ../../wpa_supplicant/ifupdown.sh ${TARGET_DIR}/etc/network/if-up.d/wpasupplicant ++ln -sf ../../wpa_supplicant/ifupdown.sh ${TARGET_DIR}/etc/network/if-down.d/wpasupplicant ++ln -sf ../../wpa_supplicant/ifupdown.sh ${TARGET_DIR}/etc/network/if-pre-up.d/wpasupplicant ++ln -sf ../../wpa_supplicant/ifupdown.sh ${TARGET_DIR}/etc/network/if-post-down.d/wpasupplicant ++ ++ln -sf device_reboot ${TARGET_DIR}/usr/sbin/pluto_reboot +diff --git a/board/ant/test_ensm_pinctrl.sh b/board/ant/test_ensm_pinctrl.sh +new file mode 100755 +index 0000000000..963b22ee46 +--- /dev/null ++++ b/board/ant/test_ensm_pinctrl.sh +@@ -0,0 +1,130 @@ ++#!/bin/sh ++ ++find_zynq_base_gpio () { ++ for i in /sys/class/gpio/gpiochip*; do ++ if [ "zynq_gpio" = `cat $i/label` ]; then ++ echo $i | sed 's/^[^0-9]\+//' ++ break ++ fi ++ done ++ return -1 ++} ++ ++fdd_pin_control_test () { ++ echo Running FDD Pin Control Test ++ while true; do ++ echo high > $ENABLE # RX&TX ON ++ ++ sleep 1 ++ ++ echo low > $ENABLE # RX&TX OFF ++ ++ sleep 1 ++ ++ done ++} ++ ++fdd_independant_mode_pin_control_test () { ++ echo Running FDD Independant Pin Control Test ++ while true; do ++ echo high > $ENABLE # RX ON ++ echo low > $TXNRX # TX OFF ++ ++ sleep 1 ++ ++ echo high > $TXNRX #TX ON ++ ++ sleep 1 ++ ++ done ++} ++ ++tdd_pin_control_test () { ++ ++ echo Running TDD Pin Control Test ++ while true; do ++ ++ # RX ++ echo low > $ENABLE ++ echo low > $TXNRX ++ echo low > $TXNRX # add some extra delay required for VCO cal in single synthesizer mode. ++ echo high > $ENABLE ++ ++ sleep 1 ++ ++ # TX ++ echo low > $ENABLE ++ echo high > $TXNRX ++ echo high > $TXNRX # add some extra delay required for VCO cal in single synthesizer mode. ++ echo high > $ENABLE ++ ++ sleep 1 ++ done ++} ++ ++if [ `id -u` != "0" ] ++then ++ echo "This script must be run as root" 1>&2 ++ exit 1 ++fi ++ ++for i in $(find -L /sys/bus/iio/devices -maxdepth 2 -name name) ++do ++ dev_name=$(cat $i) ++ if [ "$dev_name" = "ad9361-phy" ]; then ++ phy_path=$(echo $i | sed 's:/name$::') ++ ensm_modes=$(cat $phy_path/ensm_mode_available) ++ break ++ fi ++done ++ ++if [ "$dev_name" != "ad9361-phy" ]; then ++ echo "This test if for FMCOMMS2/3/4 and pluto only" ++ exit ++fi ++ ++GPIO_BASE=$(find_zynq_base_gpio) ++ ++cd /sys/class/gpio ++ ++if [ $GPIO_BASE -ge 0 ] ++then ++ GPIO_ENABLE=`expr $GPIO_BASE + 69` ++ GPIO_TXNRX=`expr $GPIO_BASE + 70` ++ #Export the CTRL_IN GPIOs ++ echo $GPIO_ENABLE > export 2> /dev/null ++ echo $GPIO_TXNRX > export 2> /dev/null ++else ++ echo ERROR: Wrong board? ++ exit ++fi ++ ++ENABLE=gpio${GPIO_ENABLE}/direction ++TXNRX=gpio${GPIO_TXNRX}/direction ++ ++echo low > $ENABLE ++echo low > $TXNRX ++ ++echo Press CTRL-C to exit ++ ++case "$ensm_modes" in ++ *fdd*) ++ echo "Type: 0 for FDD Pin Control Mode" ++ echo "Type: 1 for FDD Independant Pin Control Mode" ++ ++ read mode ++ ++ if [ $mode = "1" ]; then ++ echo pinctrl_fdd_indep > $phy_path/ensm_mode #Enable Pincontrol Mode ++ fdd_independant_mode_pin_control_test ++ else ++ echo pinctrl > $phy_path/ensm_mode #Enable Pincontrol Mode ++ fdd_pin_control_test ++ fi ++ ++ ;; ++ *rx*) ++ echo pinctrl > $phy_path/ensm_mode #Enable Pincontrol Mode ++ tdd_pin_control_test ++ ;; ++esac +diff --git a/board/ant/udc_handle_suspend.sh b/board/ant/udc_handle_suspend.sh +new file mode 100644 +index 0000000000..785482e2b1 +--- /dev/null ++++ b/board/ant/udc_handle_suspend.sh +@@ -0,0 +1,34 @@ ++#!/bin/sh ++ ++source /etc/device_config ++ ++DEV_NAME= ++ ++for dev in /sys/bus/iio/devices/*; do ++ [ `cat ${dev}/name` == "ad9361-phy" ] && DEV_NAME=`basename ${dev}` ++done ++ ++prev_ensm_mode=`cat /sys/bus/iio/devices/${DEV_NAME}/ensm_mode` ++ ++while [ 1 ] ++do ++ ++state=`/sbin/poll_sysfs /sys/class/udc/ci_hdrc.0/state` ++case "$state" in ++ suspended) ++ prev_ensm_mode=`cat /sys/bus/iio/devices/${DEV_NAME}/ensm_mode` ++ echo sleep > /sys/bus/iio/devices/${DEV_NAME}/ensm_mode ++ echo none > /sys/class/leds/led0:green/trigger ++ echo "UDC: $state: $prev_ensm_mode -> sleep" | logger ++ ;; ++ *) ++ current_ensm_mode=`cat /sys/bus/iio/devices/${DEV_NAME}/ensm_mode` ++ echo heartbeat > /sys/class/leds/led0:green/trigger ++ if [ "$current_ensm_mode" != "$prev_ensm_mode" ] ++ then ++ echo $prev_ensm_mode > /sys/bus/iio/devices/${DEV_NAME}/ensm_mode ++ fi ++ echo "UDC: $state: $current_ensm_mode -> $prev_ensm_mode" | logger ++ ;; ++esac ++done +diff --git a/board/ant/update.sh b/board/ant/update.sh +new file mode 100644 +index 0000000000..4a4bac416c +--- /dev/null ++++ b/board/ant/update.sh +@@ -0,0 +1,278 @@ ++#!/bin/sh ++ ++source /etc/device_config ++ ++file=/sys/kernel/config/usb_gadget/composite_gadget/functions/mass_storage.0/lun.0/file ++bootimage=/mnt/msd/boot.frm ++conf=/mnt/msd/config.txt ++img=/opt/vfat.img ++ ++ini_parser() { ++ FILE=$1 ++ SECTION=$2 ++ eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \ ++ -e 's/[#;\`].*$//' \ ++ -e 's/[[:space:]]*$//' \ ++ -e 's/^[[:space:]]*//' \ ++ -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \ ++ < $FILE \ ++ | sed -n -e "/^\[$SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}"` ++} ++ ++reset() { ++ echo "REBOOT/RESET using Watchdog timeout" ++ flash_indication_off ++ sync ++ device_reboot reset ++ sleep 10 ++} ++ ++dfu() { ++ echo "Entering DFU mode using SW Reset" ++ flash_indication_off ++ sync ++ device_reboot sf ++} ++ ++flash_indication_on() { ++ echo timer > /sys/class/leds/led0:green/trigger ++ echo 40 > /sys/class/leds/led0:green/delay_off ++ echo 40 > /sys/class/leds/led0:green/delay_on ++} ++ ++flash_indication_off() { ++ echo heartbeat > /sys/class/leds/led0:green/trigger ++} ++ ++make_diagnostic_report () { ++ FILE=$1 ++ cat /opt/VERSIONS /etc/os-release /var/log/messages /proc/cpuinfo /proc/interrupts /proc/iomem /proc/meminfo /proc/cmdline /sys/kernel/debug/clk/clk_summary > ${FILE} ++ grep -r "" /sys/kernel/debug/regmap/ >> ${FILE} 2>&1 ++ iio_info >> ${FILE} 2>&1 ++ ifconfig -a >> ${FILE} 2>&1 ++ mount >> ${FILE} 2>&1 ++ top -b -n1 >> ${FILE} 2>&1 ++ fw_printenv >> ${FILE} 2>&1 ++ unix2dos ${FILE} ++} ++ ++calibrate () { ++ /usr/sbin/ad936x_ref_cal -e $1 ad9361-phy ++ if [ $? -eq 0 ]; then ++ ++ for dev in /sys/bus/iio/devices/*; do ++ [ `cat ${dev}/name` == "ad9361-phy" ] && DEV_NAME=`basename ${dev}` ++ done ++ NEW_XO=`cat /sys/bus/iio/devices/${DEV_NAME}/xo_correction` ++ flash_indication_on ++ fw_setenv xo_correction $NEW_XO ++ flash_indication_off ++ ++ sed -i -e "s/^xo_correction .*$/xo_correction = $NEW_XO/" -e "s/^calibrate .*$/calibrate = 0/" $conf ++ else ++ sed -i -e "s/^calibrate .*$/calibrate = 0/" $conf ++ fi ++} ++ ++process_ini() { ++ FILE=$1 ++ ++ ini_parser $FILE "NETWORK" ++ ini_parser $FILE "WLAN" ++ ini_parser $FILE "SYSTEM" ++ ini_parser $FILE "USB_ETHERNET" ++ ++ rm -f /mnt/msd/SUCCESS_ENV_UPDATE /mnt/msd/FAILED_INVALID_UBOOT_ENV /mnt/msd/CAL_STATUS ++ ++ ++ fw_printenv qspiboot ++ if [ $? -eq 0 ]; then ++ flash_indication_on ++ echo "hostname $hostname" > /opt/fw_set.tmp ++ echo "ipaddr $ipaddr" >> /opt/fw_set.tmp ++ echo "ipaddr_host $ipaddr_host" >> /opt/fw_set.tmp ++ echo "netmask $netmask" >> /opt/fw_set.tmp ++ echo "ssid_wlan $ssid_wlan" >> /opt/fw_set.tmp ++ echo "ipaddr_wlan $ipaddr_wlan" >> /opt/fw_set.tmp ++ echo "pwd_wlan $pwd_wlan" >> /opt/fw_set.tmp ++ echo "xo_correction $xo_correction" >> /opt/fw_set.tmp ++ echo "udc_handle_suspend $udc_handle_suspend" >> /opt/fw_set.tmp ++ echo "usb_ethernet_mode $usb_ethernet_mode" >> /opt/fw_set.tmp ++ echo "ipaddr_eth $ipaddr_eth" >> /opt/fw_set.tmp ++ echo "netmask_eth $netmask_eth" >> /opt/fw_set.tmp ++ fw_setenv -s /opt/fw_set.tmp ++ rm /opt/fw_set.tmp ++ flash_indication_off ++ touch /mnt/msd/SUCCESS_ENV_UPDATE ++ else ++ touch /mnt/msd/FAILED_INVALID_UBOOT_ENV ++ fi ++ ++ ini_parser $FILE "ACTIONS" ++ ++ if [ "$reset" == "1" ] ++ then ++ reset ++ fi ++ ++ if [ "$dfu" == "1" ] ++ then ++ dfu ++ fi ++ ++ if [ "$diagnostic_report" == "1" ] ++ then ++ make_diagnostic_report /mnt/msd/diagnostic_report ++ fi ++ ++ if [ "$calibrate" -gt "70000000" ] ++ then ++ calibrate $calibrate > /mnt/msd/CAL_STATUS ++ fi ++ ++ echo here_1: > /mnt/msd/status ++ ++ if [ "$revert_passwd" == "1" ] ++ then ++ echo here $revert_passwd >> /mnt/msd/status ++ rm -f /mnt/jffs2/etc/passwd /mnt/jffs2/etc/group /mnt/jffs2/etc/password.md5 /mnt/jffs2/etc/shadow 2>&1 >> /mnt/msd/status ++ echo here_2: >> /mnt/msd/status ++ fi ++ ++ md5sum $FILE > /opt/config.md5 ++} ++ ++handle_boot_frm () { ++ FILE="$1" ++ rm -f /mnt/msd/BOOT_SUCCESS /mnt/msd/BOOT_FAILED /mnt/msd/FAILED_MTD_PARTITION_ERROR /mnt/msd/FAILED_BOOT_CHSUM_ERROR ++ head -3 /proc/mtd | sed 's/00010000/00001000/g' > /opt/mtd ++ ++ md5=`tail -c 33 ${FILE}` ++ head -c -33 ${FILE} > /opt/boot_and_env_and_mtdinfo.bin ++ ++ tail -c 1024 /opt/boot_and_env_and_mtdinfo.bin | head -3 > /opt/mtd-info.txt ++ head -c -1024 /opt/boot_and_env_and_mtdinfo.bin > /opt/boot_and_env.bin ++ ++ tail -c 131072 /opt/boot_and_env.bin > /opt/u-boot-env.bin ++ head -c -131072 /opt/boot_and_env.bin > /opt/boot.bin ++ ++ frm=`md5sum /opt/boot_and_env_and_mtdinfo.bin | cut -d ' ' -f 1` ++ ++ if [ "$frm" = "$md5" ] ++ then ++ diff -w /opt/mtd /opt/mtd-info.txt ++ if [ $? -eq 0 ]; then ++ flash_indication_on ++ dd if=/opt/boot.bin of=/dev/mtdblock0 bs=64k && dd if=/opt/u-boot-env.bin of=/dev/mtdblock1 bs=64k && do_reset=1 && touch /mnt/msd/BOOT_SUCCESS || touch /mnt/msd/BOOT_FAILED ++ flash_indication_off ++ else ++ cat /opt/mtd /opt/mtd-info.txt > /mnt/msd/FAILED_MTD_PARTITION_ERROR ++ do_reset=0 ++ fi ++ else ++ echo $md5 $frm > /mnt/msd/FAILED_BOOT_CHSUM_ERROR ++ do_reset=0 ++ fi ++ ++ rm -f ${FILE} /opt/boot_and_env_and_mtdinfo.bin /opt/mtd-info.txt /opt/boot_and_env.bin /opt/u-boot-env.bin /opt/boot.bin /opt/mtd ++} ++ ++ ++ ++handle_frimware_frm () { ++ FILE="$1" ++ MAGIC="$2" ++ rm -f /mnt/msd/SUCCESS /mnt/msd/FAILED /mnt/msd/FAILED_FIRMWARE_CHSUM_ERROR ++ md5=`tail -c 33 ${FILE}` ++ head -c -33 ${FILE} > /opt/firmware.frm ++ FRM_SIZE=`cat /opt/firmware.frm | wc -c | xargs printf "%X\n"` ++ frm=`md5sum /opt/firmware.frm | cut -d ' ' -f 1` ++ if [ "$frm" = "$md5" ] ++ then ++ flash_indication_on ++ grep -q "${MAGIC}" /opt/firmware.frm && dd if=/opt/firmware.frm of=/dev/mtdblock3 bs=64k && fw_setenv fit_size ${FRM_SIZE} && do_reset=1 && touch /mnt/msd/SUCCESS || touch /mnt/msd/FAILED ++ flash_indication_off ++ else ++ echo $frm $md5 > /mnt/msd/FAILED_FIRMWARE_CHSUM_ERROR ++ do_reset=0 ++ fi ++ ++ rm -f ${FILE} /opt/firmware.frm ++ sync ++} ++ ++while [ 1 ] ++do ++ if [[ -r ${file} ]] ++ then ++ lun=`cat $file` ++ if [ ${#lun} -eq 0 ] ++ then ++ do_reset=0 ++ losetup /dev/loop7 $img -o 512 ++ mkdir -p /mnt/msd ++ mount /dev/loop7 /mnt/msd ++ ++ if [[ -s /mnt/msd/$TARGET-fw-*.zip ]] ++ then ++ mv /mnt/msd/$TARGET-fw-*.zip /opt/ ++ unzip -o /opt/$TARGET-fw-*.zip *.frm -d /mnt/msd ++ rm /opt/$TARGET-fw-*.zip ++ fi ++ ++ if [[ -s ${FIRMWARE} ]] ++ then ++ handle_frimware_frm "${FIRMWARE}" "${FRM_MAGIC}" ++ fi ++ ++ if [[ -s ${bootimage} ]] ++ then ++ handle_boot_frm "${bootimage}" ++ fi ++ ++ md5sum -c /opt/config.md5 || process_ini $conf ++ ++ if [ "$TARGET" == "m2k" ]; then ++ if [[ -s /mnt/msd/${CALIBFILENAME} ]]; then ++ md5sum -c /opt/${CALIBFILENAME}.md5 ++ if [ $? -ne 0 ]; then ++ cp /mnt/msd/${CALIBFILENAME} /mnt/jffs2/${CALIBFILENAME} && do_reset=1 ++ fi ++ ++ else ++ rm /mnt/jffs2/${CALIBFILENAME} && do_reset=1 ++ fi ++ ++ if [[ -s /mnt/msd/${CALIBFILENAME_FACTORY} ]]; then ++ if [[ ! -s /mnt/jffs2/${CALIBFILENAME_FACTORY} ]]; then ++ cp /mnt/msd/${CALIBFILENAME_FACTORY} /mnt/jffs2/${CALIBFILENAME_FACTORY} ++ do_reset=1 ++ fi ++ fi ++ ++ if [[ -s /mnt/msd/${CALIBFILENAME_TEMP_LUT} ]]; then ++ cp /mnt/msd/${CALIBFILENAME_TEMP_LUT} /mnt/jffs2/${CALIBFILENAME_TEMP_LUT} ++ do_reset=1 ++ fi ++ fi ++ ++ if [[ $do_reset = 1 ]] ++ then ++ reset ++ fi ++ ++ cp /opt/ipaddr-* /mnt/msd 2>/dev/null ++ ++ umount /mnt/msd ++ #losetup -d /dev/loop7 ++ echo $img > $file ++ flash_indication_off ++ sleep 1 ++ fi ++fi ++ ++sleep 1 ++ ++done ++ ++exit 1 +diff --git a/board/ant/update_frm.sh b/board/ant/update_frm.sh +new file mode 100644 +index 0000000000..d0b42f139f +--- /dev/null ++++ b/board/ant/update_frm.sh +@@ -0,0 +1,49 @@ ++#!/bin/sh ++ ++#set -x ++ ++source /etc/device_config ++ ++FRM_FILE="$1" ++ ++flash_indication_on() { ++ echo timer > /sys/class/leds/led0:green/trigger ++ echo 40 > /sys/class/leds/led0:green/delay_off ++ echo 40 > /sys/class/leds/led0:green/delay_on ++} ++ ++flash_indication_off() { ++ echo heartbeat > /sys/class/leds/led0:green/trigger ++} ++ ++handle_frimware_frm () { ++ FILE="$1" ++ MAGIC="$2" ++ md5=`tail -c 33 ${FILE}` ++ head -c -33 ${FILE} > /opt/firmware.frm ++ FRM_SIZE=`cat /opt/firmware.frm | wc -c | xargs printf "%X\n"` ++ frm=`md5sum /opt/firmware.frm | cut -d ' ' -f 1` ++ if [ "$frm" = "$md5" ] ++ then ++ flash_indication_on ++ grep -q "${MAGIC}" /opt/firmware.frm && dd if=/opt/firmware.frm of=/dev/mtdblock3 bs=64k && fw_setenv fit_size ${FRM_SIZE} && echo "Done" || echo "Failed" ++ flash_indication_off ++ rm -f /opt/firmware.frm ++ sync ++ exit 0 ++ else ++ rm -f /opt/firmware.frm ++ echo Failed Checksum error: $frm $md5 ++ exit 1 ++ fi ++} ++ ++ ++ ++if [[ -f ${FRM_FILE} ]] && [[ ${FRM_FILE: -4} == ".frm" ]] && [[ -s ${FRM_FILE} ]] ++then ++ handle_frimware_frm "${FRM_FILE}" "${FRM_MAGIC}" ++else ++ echo "Failed" ++ exit 1 ++fi +diff --git a/board/ant/update_from_github.sh b/board/ant/update_from_github.sh +new file mode 100644 +index 0000000000..0149e1e188 +--- /dev/null ++++ b/board/ant/update_from_github.sh +@@ -0,0 +1,58 @@ ++#!/bin/sh ++ ++cd /root ++rm -f /root/latest /root/*.zip /root/*.frm ++ ++# get the location of the latest release ++wget https://api.github.com/repos/analogdevicesinc/plutosdr-fw/releases/latest ++if [ "$?" -ne "0" ] ; then ++ echo "Error talking to github - is this pluto on the internet?" ++ exit ++fi ++if [ ! -f "latest" ] ; then ++ echo "downloaded file missing" ++ exit ++fi ++# get the FIRMWARE file name ++FIRMWARE=$(grep "name.*plutosdr-fw-" latest | cut -d : -f 2,3 | tr -d \", | sed 's/^ //g') ++if [ -z "${FIRMWARE}" ] ; then ++ echo "Error parsing download file name - please report a bug" ++ exit ++fi ++# get the FIRMWARE URL ++URL=$(grep "browser_download_url.*plutosdr-fw-" latest | cut -d : -f 2,3 | awk '{print $1}' | tr -d \") ++if [ -z "${URL}" ] ; then ++ echo "Error parsing download url - please report a bug" ++ exit ++fi ++# get the URL ++wget ${URL} ++if [ "$?" -ne "0" ] ; then ++ echo "Error talking to github - is this pluto on the internet?" ++ exit ++fi ++if [ ! -f "${FIRMWARE}" ] ; then ++ echo "Can not find downloaded file - report a bug" ++ exit ++fi ++# find the frm inside the zip file ++FILE=$(unzip -l "${FIRMWARE}" | grep frm | sort -nr | head -1 | awk '{print $NF}') ++if [ -z "${FILE}" ] ; then ++ echo "not sure which file to extract - report a bug" ++ exit ++fi ++# upzip it ++unzip ${FIRMWARE} ${FILE} ++if [ "$?" -ne "0" ] ; then ++ echo "Error unzipping ${FILE} from ${FIRMWARE}" ++ exit ++fi ++if [ ! -f ${FILE} ] ; then ++ echo "Can not file file to write to flash" ++ exit ++fi ++ ++# write to flash ++update_frm.sh /root/${FILE} ++ ++echo "Reboot your system to run the new firmware" +diff --git a/board/ant/wpa_supplicant/action_wpa.sh b/board/ant/wpa_supplicant/action_wpa.sh +new file mode 100644 +index 0000000000..bb4c7c10af +--- /dev/null ++++ b/board/ant/wpa_supplicant/action_wpa.sh +@@ -0,0 +1,50 @@ ++#!/bin/sh ++ ++# Action script to enable/disable wpa-roam interfaces in reaction to ++# ifplugd events. ++# ++# Copyright: Copyright (c) 2008-2010, Kel Modderman ++# License: GPL-2 ++# ++ ++PATH=/sbin:/usr/sbin:/bin:/usr/bin ++ ++if [ ! -x /sbin/wpa_action ]; then ++ exit 0 ++fi ++ ++# ifplugd(8) - ++# ++# If an ifplugd managed interface is brought up, disconnect any ++# wpa-roam managed interfaces so that only one "roaming" interface ++# remains active on the system. ++ ++IFPLUGD_IFACE="${1}" ++ ++case "${2}" in ++ up) ++ COMMAND=disconnect ++ ;; ++ down) ++ COMMAND=reconnect ++ ;; ++ *) ++ echo "$0: unknown arguments: ${@}" >&2 ++ exit 1 ++ ;; ++esac ++ ++for CTRL in /run/wpa_supplicant/*; do ++ [ -S "${CTRL}" ] || continue ++ ++ IFACE="${CTRL#/run/wpa_supplicant/}" ++ ++ # skip if ifplugd is managing this interface ++ if [ "${IFPLUGD_IFACE}" = "${IFACE}" ]; then ++ continue ++ fi ++ ++ if wpa_action "${IFACE}" check; then ++ wpa_cli -i "${IFACE}" "${COMMAND}" ++ fi ++done +diff --git a/board/ant/wpa_supplicant/functions.sh b/board/ant/wpa_supplicant/functions.sh +new file mode 100644 +index 0000000000..bf01819f17 +--- /dev/null ++++ b/board/ant/wpa_supplicant/functions.sh +@@ -0,0 +1,1006 @@ ++#!/bin/sh ++ ++##################################################################### ++## Purpose ++# This file contains common shell functions used by scripts of the ++# wpasupplicant package to allow ifupdown to manage wpa_supplicant. ++# It also contains some functions used by wpa_action(8) that allow ++# ifupdown to be managed by wpa_cli(8) action events. ++# ++# This file is provided by the wpasupplicant package. ++ ++##################################################################### ++# Copyright (C) 2006 - 2009 Debian/Ubuntu wpasupplicant Maintainers ++# ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# On Debian GNU/Linux systems, the text of the GPL license, ++# version 2, can be found in /usr/share/common-licenses/GPL-2. ++ ++##################################################################### ++## global variables ++# wpa_supplicant variables ++WPA_SUP_BIN="/usr/sbin/wpa_supplicant" ++WPA_SUP_PNAME="wpa_supplicant" ++WPA_SUP_PIDFILE="/run/wpa_supplicant.${WPA_IFACE}.pid" ++WPA_SUP_OMIT_DIR="/run/sendsigs.omit.d" ++WPA_SUP_OMIT_PIDFILE="${WPA_SUP_OMIT_DIR}/wpasupplicant.wpa_supplicant.${WPA_IFACE}.pid" ++ ++# wpa_cli variables ++WPA_CLI_BIN="/usr/sbin/wpa_cli" ++WPA_CLI_PNAME="wpa_cli" ++WPA_CLI_PIDFILE="/run/wpa_action.${WPA_IFACE}.pid" ++WPA_CLI_TIMESTAMP="/run/wpa_action.${WPA_IFACE}.timestamp" ++WPA_CLI_IFUPDOWN="/run/wpa_action.${WPA_IFACE}.ifupdown" ++ ++# default ctrl_interface socket directory ++if [ -z "$WPA_CTRL_DIR" ]; then ++ WPA_CTRL_DIR="/run/wpa_supplicant" ++fi ++ ++# verbosity variables ++if [ -n "$IF_WPA_VERBOSITY" ] || [ "$VERBOSITY" = "1" ]; then ++ TO_NULL="/dev/stdout" ++ DAEMON_VERBOSITY="--verbose" ++else ++ TO_NULL="/dev/null" ++ DAEMON_VERBOSITY="--quiet" ++fi ++ ++##################################################################### ++## wpa_cli wrapper ++# Path to common ctrl_interface socket and iface supplied. ++# NB: WPA_CTRL_DIR cannot be used for interactive commands, it is ++# set only in the environment that wpa_cli provides when processing ++# action events. ++# ++wpa_cli () { ++ "$WPA_CLI_BIN" -p "$WPA_CTRL_DIR" -i "$WPA_IFACE" "$@" ++ ++ return "$?" ++} ++ ++##################################################################### ++## verbose and stderr message wrapper ++# Ensures a standard and easily identifiable message is printed by ++# scripts using this function library. ++# ++# log Log a message to syslog when called non-interactively ++# by wpa_action ++# ++# verbose To stdout when IF_WPA_VERBOSITY or VERBOSITY is true ++# ++# action Same as verbose but without newline ++# Useful for allowing wpa_cli commands to echo result ++# value of 'OK' or 'FAILED' ++# ++# stderr Echo warning or error messages to stderr ++# ++# NB: when called by wpa_action, there is no redirection (verbose) ++# ++wpa_msg () { ++ if [ "$1" = "log" ]; then ++ shift ++ case "$WPA_ACTION" in ++ "CONNECTED"|"DISCONNECTED") ++ [ -x /usr/bin/logger ] || return ++ if [ "$#" -gt 0 ]; then ++ logger -t "wpa_action" "$@" ++ else ++ logger -t "wpa_action" ++ fi ++ ;; ++ *) ++ [ "$#" -gt 0 ] && echo "wpa_action: $@" ++ ;; ++ esac ++ return ++ fi ++ ++ case "$1" in ++ "verbose") ++ shift ++ echo "$WPA_SUP_PNAME: $@" >$TO_NULL ++ ;; ++ "action") ++ shift ++ echo -n "$WPA_SUP_PNAME: $@ -- " >$TO_NULL ++ ;; ++ "stderr") ++ shift ++ echo "$WPA_SUP_PNAME: $@" >/dev/stderr ++ ;; ++ *) ++ ;; ++ esac ++} ++ ++##################################################################### ++## validate daemon pid files ++# Test daemon process ID files via start-stop-daemon with a signal 0 ++# given the exec binary and pidfile location. ++# ++# $1 daemon ++# $2 pidfile ++# ++# Returns true when pidfile exists, the process ID exists _and_ was ++# created by the exec binary. ++# ++# If the test fails, but the pidfile exists, it is stale ++# ++test_daemon_pidfile () { ++ local DAEMON ++ local PIDFILE ++ ++ if [ -n "$1" ]; then ++ DAEMON="$1" ++ fi ++ ++ if [ -f "$2" ]; then ++ PIDFILE="$2" ++ fi ++ ++ if [ -n "$DAEMON" ] && [ -f "$PIDFILE" ]; then ++ if start-stop-daemon --stop --quiet --signal 0 \ ++ --exec "$DAEMON" --pidfile "$PIDFILE"; then ++ return 0 ++ else ++ rm -f "$PIDFILE" ++ return 1 ++ fi ++ else ++ return 1 ++ fi ++} ++ ++# validate wpa_supplicant pidfile ++test_wpa_supplicant () { ++ test_daemon_pidfile "$WPA_SUP_BIN" "$WPA_SUP_PIDFILE" ++} ++ ++# validate wpa_cli pidfile ++test_wpa_cli () { ++ test_daemon_pidfile "$WPA_CLI_BIN" "$WPA_CLI_PIDFILE" ++} ++ ++##################################################################### ++## daemonize wpa_supplicant ++# Start wpa_supplicant via start-stop-dameon with all required ++# options. Will start if environment variable WPA_SUP_CONF is present ++# ++# Default options: ++# -B dameonize/background process ++# -D driver backend ('wext' if none given) ++# -P process ID file ++# -C path to ctrl_interface socket directory ++# -s log to syslog ++# ++# Conditional options: ++# -c configuration file ++# -W wait for wpa_cli to attach to ctrl_interface socket ++# -b bridge interface name ++# -f path to log file ++# ++init_wpa_supplicant () { ++ [ -n "$WPA_SUP_CONF" ] || return 0 ++ ++ local WPA_SUP_OPTIONS ++ WPA_SUP_OPTIONS="-B -P $WPA_SUP_PIDFILE -i $WPA_IFACE" ++ ++ if [ -n "$WPA_ACTION_SCRIPT" ]; then ++ if [ -x "$WPA_ACTION_SCRIPT" ]; then ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -W" ++ wpa_msg verbose "wait for wpa_cli to attach" ++ else ++ wpa_msg stderr "action script \"$WPA_ACTION_SCRIPT\" not executable" ++ return 1 ++ fi ++ fi ++ ++ if [ -n "$IF_WPA_BRIDGE" ]; then ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -b $IF_WPA_BRIDGE" ++ wpa_msg verbose "wpa-bridge $IF_WPA_BRIDGE" ++ fi ++ ++ if [ -n "$IF_WPA_DRIVER" ]; then ++ wpa_msg verbose "wpa-driver $IF_WPA_DRIVER" ++ case "$IF_WPA_DRIVER" in ++ hostap|ipw|madwifi|ndiswrapper) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D nl80211,wext" ++ wpa_msg stderr "\"$IF_WPA_DRIVER\" wpa-driver is unsupported" ++ wpa_msg stderr "using \"nl80211,wext\" wpa-driver instead ..." ++ ;; ++ *) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D $IF_WPA_DRIVER" ++ ;; ++ esac ++ else ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -D nl80211,wext" ++ wpa_msg verbose "wpa-driver nl80211,wext (default)" ++ fi ++ ++ if [ -n "$IF_WPA_DEBUG_LEVEL" ]; then ++ case "$IF_WPA_DEBUG_LEVEL" in ++ 3) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -ddd" ++ ;; ++ 2) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -dd" ++ ;; ++ 1) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -t -d" ++ ;; ++ 0) ++ # wpa_supplicant default verbosity ++ ;; ++ -1) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -q" ++ ;; ++ -2) ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -qq" ++ ;; ++ esac ++ wpa_msg verbose "using debug level: $IF_WPA_DEBUG_LEVEL" ++ fi ++ ++ if [ -n "$IF_WPA_LOGFILE" ]; then ++ # custom log file ++ WPA_SUP_OPTIONS="$WPA_SUP_OPTIONS -f $IF_WPA_LOGFILE" ++ WPA_SUP_LOGFILE="$IF_WPA_LOGFILE" ++ wpa_msg verbose "logging to $IF_WPA_LOGFILE" ++ fi ++ ++ wpa_msg verbose "$WPA_SUP_BIN $WPA_SUP_OPTIONS $WPA_SUP_CONF" ++ ++ start-stop-daemon --start --oknodo $DAEMON_VERBOSITY \ ++ --name $WPA_SUP_PNAME --startas $WPA_SUP_BIN --pidfile $WPA_SUP_PIDFILE \ ++ -- $WPA_SUP_OPTIONS $WPA_SUP_CONF ++ ++ if [ "$?" -ne 0 ]; then ++ wpa_msg stderr "$WPA_SUP_BIN daemon failed to start" ++ return 1 ++ fi ++ ++ local WPA_PIDFILE_WAIT ++ local MAX_WPA_PIDFILE_WAIT ++ WPA_PIDFILE_WAIT="0" ++ MAX_WPA_PIDFILE_WAIT="5" ++ until [ -s "$WPA_SUP_PIDFILE" ]; do ++ if [ "$WPA_PIDFILE_WAIT" -ge "$MAX_WPA_PIDFILE_WAIT" ]; then ++ wpa_msg stderr "timed out waiting for creation of $WPA_SUP_PIDFILE" ++ return 1 ++ else ++ wpa_msg verbose "waiting for \"$WPA_SUP_PIDFILE\": " \ ++ "$WPA_PIDFILE_WAIT (max. $MAX_WPA_PIDFILE_WAIT)" ++ fi ++ ++ WPA_PIDFILE_WAIT=$(($WPA_PIDFILE_WAIT + 1)) ++ sleep 1 ++ done ++ if [ -d "${WPA_SUP_OMIT_DIR}" ]; then ++ wpa_msg verbose "creating sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" ++ cat "$WPA_SUP_PIDFILE" > "$WPA_SUP_OMIT_PIDFILE" ++ fi ++ ++ local WPA_SOCKET_WAIT ++ local MAX_WPA_SOCKET_WAIT ++ WPA_SOCKET_WAIT="0" ++ MAX_WPA_SOCKET_WAIT="5" ++ until [ -S "$WPA_CTRL_DIR/$WPA_IFACE" ]; do ++ if [ "$WPA_SOCKET_WAIT" -ge "$MAX_WPA_SOCKET_WAIT" ]; then ++ wpa_msg stderr "ctrl_interface socket not found at $WPA_CTRL_DIR/$WPA_IFACE" ++ return 1 ++ else ++ wpa_msg verbose "waiting for \"$WPA_CTRL_DIR/$WPA_IFACE\": " \ ++ "$WPA_SOCKET_WAIT (max. $MAX_WPA_SOCKET_WAIT)" ++ fi ++ ++ WPA_SOCKET_WAIT=$(($WPA_SOCKET_WAIT + 1)) ++ sleep 1 ++ done ++ ++ wpa_msg verbose "ctrl_interface socket located at $WPA_CTRL_DIR/$WPA_IFACE" ++} ++ ++##################################################################### ++## stop wpa_supplicant process ++# Kill wpa_supplicant via start-stop-daemon, given the location of ++# the pidfile or ctrl_interface socket path and interface name ++# ++kill_wpa_supplicant () { ++ test_wpa_supplicant || return 0 ++ ++ wpa_msg verbose "terminating $WPA_SUP_PNAME daemon via pidfile $WPA_SUP_PIDFILE" ++ ++ start-stop-daemon --stop --oknodo $DAEMON_VERBOSITY \ ++ --exec $WPA_SUP_BIN --pidfile $WPA_SUP_PIDFILE ++ ++ if [ -f "$WPA_SUP_PIDFILE" ]; then ++ rm -f "$WPA_SUP_PIDFILE" ++ fi ++ ++ if [ -f "$WPA_SUP_OMIT_PIDFILE" ]; then ++ wpa_msg verbose "removing $WPA_SUP_OMIT_PIDFILE" ++ rm -f "$WPA_SUP_OMIT_PIDFILE" ++ fi ++} ++ ++##################################################################### ++## reload wpa_supplicant process ++# Sending a HUP signal causes wpa_supplicant to reparse its ++# configuration file ++# ++reload_wpa_supplicant () { ++ if test_wpa_supplicant; then ++ wpa_msg verbose "reloading wpa_supplicant configuration file via HUP signal" ++ start-stop-daemon --stop --signal HUP \ ++ --name "$WPA_SUP_PNAME" --pidfile "$WPA_SUP_PIDFILE" ++ else ++ wpa_msg verbose "cannot $WPA_ACTION, $WPA_SUP_PIDFILE does not exist" ++ fi ++} ++ ++##################################################################### ++## daemonize wpa_cli and action script ++# If environment variable WPA_ACTION_SCRIPT is present, wpa_cli will ++# be spawned via start-stop-daemon ++# ++# Required options: ++# -a action script => wpa_action ++# -P process ID file ++# -B background process ++# ++init_wpa_cli () { ++ [ -n "$WPA_ACTION_SCRIPT" ] || return 0 ++ ++ local WPA_CLI_OPTIONS ++ WPA_CLI_OPTIONS="-B -P $WPA_CLI_PIDFILE -i $WPA_IFACE" ++ ++ wpa_msg verbose "$WPA_CLI_BIN $WPA_CLI_OPTIONS -p $WPA_CTRL_DIR -a $WPA_ACTION_SCRIPT" ++ ++ start-stop-daemon --start --oknodo $DAEMON_VERBOSITY \ ++ --name $WPA_CLI_PNAME --startas $WPA_CLI_BIN --pidfile $WPA_CLI_PIDFILE \ ++ -- $WPA_CLI_OPTIONS -p $WPA_CTRL_DIR -a $WPA_ACTION_SCRIPT ++ ++ if [ "$?" -ne 0 ]; then ++ wpa_msg stderr "$WPA_CLI_BIN daemon failed to start" ++ return 1 ++ fi ++} ++ ++##################################################################### ++## stop wpa_cli process ++# Kill wpa_cli via start-stop-daemon, given the location of the ++# pidfile ++# ++kill_wpa_cli () { ++ test_wpa_cli || return 0 ++ ++ wpa_msg verbose "terminating $WPA_CLI_PNAME daemon via pidfile $WPA_CLI_PIDFILE" ++ ++ start-stop-daemon --stop --oknodo $DAEMON_VERBOSITY \ ++ --exec $WPA_CLI_BIN --pidfile $WPA_CLI_PIDFILE ++ ++ if [ -f "$WPA_CLI_PIDFILE" ]; then ++ rm -f "$WPA_CLI_PIDFILE" ++ fi ++ ++ if [ -f "$WPA_CLI_TIMESTAMP" ]; then ++ rm -f "$WPA_CLI_TIMESTAMP" ++ fi ++ ++ if [ -L "$WPA_CLI_IFUPDOWN" ]; then ++ rm -f "$WPA_CLI_IFUPDOWN" ++ fi ++} ++ ++##################################################################### ++## higher level wpa_cli wrapper for variable and set_network commands ++# wpa_cli_do [set_network variable] ++# ++# $1 envorinment variable ++# $2 data type of variable {raw|ascii} ++# $3 wpa_cli variable, if $3 is set_network, shift and take ++# set_network subvariable ++# $4 wpa-* string as it would appear in interfaces file, enhances ++# verbose messages ++# ++wpa_cli_do () { ++ if [ -z "$1" ]; then ++ return 0 ++ fi ++ ++ local WPACLISET_VALUE ++ local WPACLISET_VARIABLE ++ local WPACLISET_DESC ++ ++ case "$2" in ++ ascii) ++ # Double quote ++ WPACLISET_VALUE="\"$1\"" ++ ;; ++ raw|*) ++ # Provide raw value ++ WPACLISET_VALUE="$1" ++ ;; ++ esac ++ ++ case "$3" in ++ set_network) ++ if [ -z "$WPA_ID" ]; then ++ return 1 ++ fi ++ shift ++ WPACLISET_VARIABLE="set_network $WPA_ID $3" ++ ;; ++ *) ++ WPACLISET_VARIABLE="$3" ++ ;; ++ esac ++ ++ case "$4" in ++ *-psk|*-passphrase|*-passwd*|*-password*|*-wep-key*) ++ WPACLISET_DESC="$4 *****" ++ ;; ++ *) ++ WPACLISET_DESC="$4 $WPACLISET_VALUE" ++ ;; ++ esac ++ ++ wpa_msg action "$WPACLISET_DESC" ++ ++ wpa_cli $WPACLISET_VARIABLE "$WPACLISET_VALUE" >$TO_NULL ++ ++ if [ "$?" -ne 0 ]; then ++ wpa_msg stderr "$WPACLISET_DESC failed!" ++ fi ++} ++ ++##################################################################### ++## check value data type in plaintext or hex ++# returns 0 if input consists of hexadecimal digits only, 1 otherwise ++# ++ishex () { ++ if [ -z "$1" ]; then ++ return 0 ++ fi ++ ++ case "$1" in ++ *[!0-9a-fA-F]*) ++ # plaintext ++ return 1 ++ ;; ++ *) ++ # hexadecimal ++ return 0 ++ ;; ++ esac ++} ++ ++##################################################################### ++## sanity check and set psk|passphrase ++# Warn about strange psk|passphrase values ++# ++# $1 psk or passphrase value ++# ++# If psk is surrounded by quotes strip them. ++# ++# If psk contains all hexadecimal characters and string length is 64: ++# is 256bit hexadecimal ++# else: ++# is plaintext ++# ++# plaintext passphrases must be 8 - 63 characters in length ++# 256-bit hexadecimal key must be 64 characters in length ++# ++wpa_key_check_and_set () { ++ if [ "$#" -ne 3 ]; then ++ return 0 ++ fi ++ ++ local KEY ++ local KEY_LEN ++ local KEY_TYPE ++ local ENC_TYPE ++ ++ case "$1" in ++ '"'*'"') ++ # Strip surrounding quotation marks ++ KEY=$(echo -n "$1" | sed 's/^"//;s/"$//') ++ ;; ++ *) ++ KEY="$1" ++ ;; ++ esac ++ ++ KEY_LEN="${#KEY}" ++ ++ case "$2" in ++ wep_key*) ++ ENC_TYPE="WEP" ++ ;; ++ psk) ++ ENC_TYPE="WPA" ++ ;; ++ *) ++ return 0 ++ ;; ++ esac ++ ++ if [ "$ENC_TYPE" = "WEP" ]; then ++ if ishex "$KEY"; then ++ case "$KEY_LEN" in ++ 10|26|32|58) ++ # 64/128/152/256-bit WEP ++ KEY_TYPE="raw" ++ ;; ++ *) ++ KEY_TYPE="ascii" ++ ;; ++ esac ++ else ++ KEY_TYPE="ascii" ++ fi ++ ++ if [ "$KEY_TYPE" = "ascii" ]; then ++ if [ "$KEY_LEN" -lt "5" ]; then ++ wpa_msg stderr "WARNING: plaintext or ascii WEP key has $KEY_LEN characters," ++ wpa_msg stderr "it must have at least 5 to be valid." ++ fi ++ fi ++ elif [ "$ENC_TYPE" = "WPA" ]; then ++ if ishex "$KEY"; then ++ case "$KEY_LEN" in ++ 64) ++ # 256-bit WPA ++ KEY_TYPE="raw" ++ ;; ++ *) ++ KEY_TYPE="ascii" ++ ;; ++ esac ++ else ++ KEY_TYPE="ascii" ++ fi ++ ++ if [ "$KEY_TYPE" = "ascii" ]; then ++ if [ "$KEY_LEN" -lt "8" ] || [ "$KEY_LEN" -gt "63" ]; then ++ wpa_msg stderr "WARNING: plaintext or ascii WPA key has $KEY_LEN characters," ++ wpa_msg stderr "it must have between 8 and 63 to be valid." ++ wpa_msg stderr "If the WPA key is a 256-bit hexadecimal key, it must have" ++ wpa_msg stderr "exactly 64 characters." ++ fi ++ fi ++ fi ++ ++ wpa_cli_do "$KEY" "$KEY_TYPE" set_network "$2" "$3" ++} ++ ++##################################################################### ++## formulate a usable configuration from interfaces(5) wpa- lines ++# A series of wpa_cli commands corresponding to environment variables ++# created as a result of wpa- lines in an interfaces stanza. ++# ++# NB: no-act when roaming daemon is used (to avoid prematurely ++# attaching to ctrl_interface socket) ++# ++conf_wpa_supplicant () { ++ if [ -n "$WPA_ACTION_SCRIPT" ]; then ++ return 0 ++ fi ++ ++ if [ "$IF_WPA_DRIVER" = "wired" ]; then ++ IF_WPA_AP_SCAN="0" ++ wpa_msg verbose "forcing ap_scan=0 (required for wired IEEE8021X auth)" ++ fi ++ ++ if [ -n "$IF_WPA_ESSID" ]; then ++ # #403316, be similar to wireless tools ++ IF_WPA_SSID="$IF_WPA_ESSID" ++ fi ++ ++ wpa_cli_do "$IF_WPA_AP_SCAN" raw \ ++ ap_scan wpa-ap-scan ++ ++ wpa_cli_do "$IF_WPA_PREAUTHENTICATE" raw \ ++ preauthenticate wpa-preauthenticate ++ ++ if [ -n "$IF_WPA_SSID" ] || [ "$IF_WPA_DRIVER" = "wired" ] || \ ++ [ -n "$IF_WPA_KEY_MGMT" ]; then ++ ++ case "$IF_WPA_SSID" in ++ '"'*'"') ++ IF_WPA_SSID=$(echo -n "$IF_WPA_SSID" | sed 's/^"//;s/"$//') ++ ;; ++ *) ++ ;; ++ esac ++ ++ WPA_ID=$(wpa_cli add_network) ++ ++ wpa_msg verbose "configuring network block -- $WPA_ID" ++ ++ wpa_cli_do "$IF_WPA_SSID" ascii \ ++ set_network ssid wpa-ssid ++ ++ wpa_cli_do "$IF_WPA_PRIORITY" raw \ ++ set_network priority wpa-priority ++ ++ wpa_cli_do "$IF_WPA_BSSID" raw \ ++ set_network bssid wpa-bssid ++ ++ if [ -s "$IF_WPA_PSK_FILE" ]; then ++ IF_WPA_PSK=$(cat "$IF_WPA_PSK_FILE") ++ fi ++ ++ # remain compat with wpa-passphrase-file ++ if [ -s "$IF_WPA_PASSPHRASE_FILE" ]; then ++ IF_WPA_PSK=$(cat "$IF_WPA_PASSPHRASE_FILE") ++ fi ++ ++ # remain compat with wpa-passphrase ++ if [ -n "$IF_WPA_PASSPHRASE" ]; then ++ IF_WPA_PSK="$IF_WPA_PASSPHRASE" ++ fi ++ ++ if [ -n "$IF_WPA_PSK" ]; then ++ wpa_key_check_and_set "$IF_WPA_PSK" \ ++ psk wpa-psk ++ fi ++ ++ wpa_cli_do "$IF_WPA_PAIRWISE" raw \ ++ set_network pairwise wpa-pairwise ++ ++ wpa_cli_do "$IF_WPA_GROUP" raw \ ++ set_network group wpa-group ++ ++ wpa_cli_do "$IF_WPA_MODE" raw \ ++ set_network mode wpa-mode ++ ++ wpa_cli_do "$IF_WPA_FREQUENCY" raw \ ++ set_network frequency wpa-frequency ++ ++ wpa_cli_do "$IF_WPA_SCAN_FREQ" raw \ ++ set_network scan_freq wpa-scan-freq ++ ++ wpa_cli_do "$IF_WPA_FREQ_LIST" raw \ ++ set_network freq_list wpa-freq-list ++ ++ wpa_cli_do "$IF_WPA_KEY_MGMT" raw \ ++ set_network key_mgmt wpa-key-mgmt ++ ++ wpa_cli_do "$IF_WPA_PROTO" raw \ ++ set_network proto wpa-proto ++ ++ wpa_cli_do "$IF_WPA_AUTH_ALG" raw \ ++ set_network auth_alg wpa-auth-alg ++ ++ wpa_cli_do "$IF_WPA_SCAN_SSID" raw \ ++ set_network scan_ssid wpa-scan-ssid ++ ++ wpa_cli_do "$IF_WPA_IDENTITY" ascii \ ++ set_network identity wpa-identity ++ ++ wpa_cli_do "$IF_WPA_ANONYMOUS_IDENTITY" ascii \ ++ set_network anonymous_identity wpa-anonymous-identity ++ ++ wpa_cli_do "$IF_WPA_EAP" raw \ ++ set_network eap wpa-eap ++ ++ wpa_cli_do "$IF_WPA_EAPPSK" raw \ ++ set_network eappsk wpa-eappsk ++ ++ wpa_cli_do "$IF_WPA_NAI" ascii \ ++ set_network nai wpa-nai ++ ++ wpa_cli_do "$IF_WPA_PASSWORD" ascii \ ++ set_network password wpa-password ++ ++ wpa_cli_do "$IF_WPA_CA_CERT" ascii \ ++ set_network ca_cert wpa-ca-cert ++ ++ wpa_cli_do "$IF_WPA_CA_PATH" ascii \ ++ set_network ca_path wpa-ca-path ++ ++ wpa_cli_do "$IF_WPA_CLIENT_CERT" ascii \ ++ set_network client_cert wpa-client-cert ++ ++ wpa_cli_do "$IF_WPA_PRIVATE_KEY" ascii \ ++ set_network private_key wpa-private-key ++ ++ wpa_cli_do "$IF_WPA_PRIVATE_KEY_PASSWD" ascii \ ++ set_network private_key_passwd wpa-private-key-passwd ++ ++ wpa_cli_do "$IF_WPA_DH_FILE" ascii \ ++ set_network dh_file wpa-dh-file ++ ++ wpa_cli_do "$IF_WPA_SUBJECT_MATCH" ascii \ ++ set_network subject_match wpa-subject-match ++ ++ wpa_cli_do "$IF_WPA_ALTSUBJECT_MATCH" ascii \ ++ set_network altsubject_match wpa-altsubject-match ++ ++ wpa_cli_do "$IF_WPA_CA_CERT2" ascii \ ++ set_network ca_cert2 wpa-ca-cert2 ++ ++ wpa_cli_do "$IF_WPA_CA_PATH2" ascii \ ++ set_network ca_path2 wpa-ca-path2 ++ ++ wpa_cli_do "$IF_WPA_CLIENT_CERT2" ascii \ ++ set_network client_cert2 wpa-client-cert2 ++ ++ wpa_cli_do "$IF_WPA_PRIVATE_KEY2" ascii \ ++ set_network private_key2 wpa-private-key2 ++ ++ wpa_cli_do "$IF_WPA_PRIVATE_KEY_PASSWD2" ascii \ ++ set_network private_key_passwd2 wpa-private-key-passwd2 ++ ++ wpa_cli_do "$IF_WPA_DH_FILE2" ascii \ ++ set_network dh_file2 wpa-dh-file2 ++ ++ wpa_cli_do "$IF_WPA_SUBJECT_MATCH2" ascii \ ++ set_network subject_match2 wpa-subject-match2 ++ ++ wpa_cli_do "$IF_WPA_ALTSUBJECT_MATCH2" ascii \ ++ set_network altsubject_match2 wpa-altsubject-match2 ++ ++ wpa_cli_do "$IF_WPA_EAP_METHODS" raw \ ++ set_network eap_methods wpa-eap-methods ++ ++ wpa_cli_do "$IF_WPA_PHASE1" ascii \ ++ set_network phase1 wpa-phase1 ++ ++ wpa_cli_do "$IF_WPA_PHASE2" ascii \ ++ set_network phase2 wpa-phase2 ++ ++ wpa_cli_do "$IF_WPA_PCSC" raw \ ++ set_network pcsc wpa-pcsc ++ ++ wpa_cli_do "$IF_WPA_PIN" ascii \ ++ set_network pin wpa-pin ++ ++ wpa_cli_do "$IF_WPA_ENGINE" raw \ ++ set_network engine wpa-engine ++ ++ wpa_cli_do "$IF_WPA_ENGINE_ID" ascii \ ++ set_network engine_id wpa-engine-id ++ ++ wpa_cli_do "$IF_WPA_KEY_ID" ascii \ ++ set_network key_id wpa-key-id ++ ++ wpa_cli_do "$IF_WPA_EAPOL_FLAGS" raw \ ++ set_network eapol_flags wpa-eapol-flags ++ ++ if [ -n "$IF_WPA_WEP_KEY0" ]; then ++ wpa_key_check_and_set "$IF_WPA_WEP_KEY0" \ ++ wep_key0 wpa-wep-key0 ++ fi ++ ++ if [ -n "$IF_WPA_WEP_KEY1" ]; then ++ wpa_key_check_and_set "$IF_WPA_WEP_KEY1" \ ++ wep_key1 wpa-wep-key1 ++ fi ++ ++ if [ -n "$IF_WPA_WEP_KEY2" ]; then ++ wpa_key_check_and_set "$IF_WPA_WEP_KEY2" \ ++ wep_key2 wpa-wep-key2 ++ fi ++ ++ if [ -n "$IF_WPA_WEP_KEY3" ]; then ++ wpa_key_check_and_set "$IF_WPA_WEP_KEY3" \ ++ wep_key3 wpa-wep-key3 ++ fi ++ ++ wpa_cli_do "$IF_WPA_WEP_TX_KEYIDX" raw \ ++ set_network wep_tx_keyidx wpa-wep-tx-keyidx ++ ++ wpa_cli_do "$IF_WPA_PROACTIVE_KEY_CACHING" raw \ ++ set_network proactive_key_caching wpa-proactive-key-caching ++ ++ wpa_cli_do "$IF_WPA_PAC_FILE" ascii \ ++ set_network pac_file wpa-pac-file ++ ++ wpa_cli_do "$IF_WPA_PEERKEY" raw \ ++ set_network peerkey wpa-peerkey ++ ++ wpa_cli_do "$IF_FRAGMENT_SIZE" raw \ ++ set_network fragment_size wpa-fragment-size ++ ++ wpa_cli_do "$IF_WPA_ID_STR" ascii \ ++ set_network id_str wpa-id-str ++ ++ wpa_cli_do "$WPA_ID" raw \ ++ enable_network "enabling network block" ++ fi ++} ++ ++##################################################################### ++## Log wpa_cli environment variables ++wpa_log_env () { ++ wpa_msg log "WPA_IFACE=$WPA_IFACE WPA_ACTION=$WPA_ACTION" ++ wpa_msg log "WPA_ID=$WPA_ID WPA_ID_STR=$WPA_ID_STR WPA_CTRL_DIR=$WPA_CTRL_DIR" ++} ++ ++##################################################################### ++## hysteresis checking ++# Networking tools such as dhcp clients used with ifupdown can ++# synthesize artificial ACTION events, particularly just after a ++# DISCONNECTED/CONNECTED events are experienced in quick succession. ++# This can lead to infinite event loops, and in extreme cases has the ++# potential to cause system instability. ++# ++wpa_hysteresis_event () { ++ echo "$(date +%s)" > "$WPA_CLI_TIMESTAMP" 2>/dev/null ++} ++ ++wpa_hysteresis_check () { ++ if [ -f "$WPA_CLI_TIMESTAMP" ]; then ++ local TIME ++ local TIMESTAMP ++ local TIMEWAIT ++ TIME=$(date +%s) ++ # current time minus 4 second event buffer ++ TIMEWAIT=$(($TIME-4)) ++ # get time of last event ++ TIMESTAMP=$(cat $WPA_CLI_TIMESTAMP) ++ # compare values, allowing new action to be processed ++ # only if last action was more than 4 seconds ago ++ if [ "$TIMEWAIT" -le "$TIMESTAMP" ]; then ++ wpa_msg log "$WPA_ACTION event blocked by hysteresis check" ++ return 1 ++ fi ++ fi ++ ++ return 0 ++} ++ ++##################################################################### ++## ifupdown locking functions ++# A collection of rudimentary locking functions to lock ifup/ifdown ++# actions. ++# ++ ++ifupdown_lock () { ++ ln -s lock "$WPA_CLI_IFUPDOWN" ++} ++ ++ifupdown_locked () { ++ [ -L "$WPA_CLI_IFUPDOWN" ] && return 0 ++ ++ return 1 ++} ++ ++ifupdown_unlock () { ++ rm -f "$WPA_CLI_IFUPDOWN" ++} ++ ++##################################################################### ++## apply mapping logic and ifup logical interface ++# Apply mapping logic via id_str or external mapping script, check ++# state of IFACE with respect to ifupdown and ifup logical interaface ++# ++ifup () { ++ local INTERFACES_FILE ++ local IFSTATE_FILE ++ local IFUP_RETVAL ++ local WPA_LOGICAL_IFACE ++ ++ if [ -e /etc/network/interfaces ]; then ++ INTERFACES_FILE="/etc/network/interfaces" ++ else ++ wpa_msg log "/etc/network/interfaces does not exist, $WPA_IFACE will not be configured" ++ return 1 ++ fi ++ ++ if [ -e /etc/network/run/ifstate ]; then ++ # debian's ifupdown ++ IFSTATE_FILE="/etc/network/run/ifstate" ++ elif [ -e /run/network/ifstate ]; then ++ # ubuntu's ++ IFSTATE_FILE="/run/network/ifstate" ++ else ++ unset IFSTATE_FILE ++ fi ++ ++ if [ -z "$IF_WPA_MAPPING_SCRIPT_PRIORITY" ] && [ -n "$WPA_ID_STR" ]; then ++ WPA_LOGICAL_IFACE="$WPA_ID_STR" ++ fi ++ ++ if [ -z "$WPA_LOGICAL_IFACE" ] && [ -n "$IF_WPA_MAPPING_SCRIPT" ]; then ++ local WPA_MAP_STDIN ++ ++ WPA_MAP_STDIN=$(set | sed -n 's/^\(IF_WPA_MAP[0-9]*\)=.*/echo \$\1/p') ++ ++ if [ -n "$WPA_MAP_STDIN" ]; then ++ WPA_LOGICAL_IFACE=$(eval "$WPA_MAP_STDIN" | "$IF_WPA_MAPPING_SCRIPT" "$WPA_IFACE") ++ else ++ WPA_LOGICAL_IFACE=$("$IF_WPA_MAPPING_SCRIPT" "$WPA_IFACE") ++ fi ++ ++ if [ -n "$WPA_LOGICAL_IFACE" ]; then ++ wpa_msg log "mapping script result: $WPA_LOGICAL_IFACE" ++ else ++ wpa_msg log "mapping script failed." ++ fi ++ fi ++ ++ if [ -z "$WPA_LOGICAL_IFACE" ]; then ++ if [ -n "$IF_WPA_ROAM_DEFAULT_IFACE" ]; then ++ WPA_LOGICAL_IFACE="$IF_WPA_ROAM_DEFAULT_IFACE" ++ else ++ WPA_LOGICAL_IFACE="default" ++ fi ++ fi ++ ++ if [ -n "$WPA_LOGICAL_IFACE" ]; then ++ if egrep -q "^iface[[:space:]]+${WPA_LOGICAL_IFACE}[[:space:]]+inet" "$INTERFACES_FILE"; then ++ : # logical network is defined ++ else ++ wpa_msg log "network settings not defined for $WPA_LOGICAL_IFACE in $INTERFACES_FILE" ++ WPA_LOGICAL_IFACE="default" ++ fi ++ ++ wpa_msg log "ifup $WPA_IFACE=$WPA_LOGICAL_IFACE" ++ ++ ifupdown_lock ++ ++ if [ -n "$IFSTATE_FILE" ] && grep -q "^$WPA_IFACE=$WPA_IFACE" "$IFSTATE_FILE"; then ++ # Force settings over the unconfigured "master" IFACE ++ /sbin/ifup -v --force "$WPA_IFACE=$WPA_LOGICAL_IFACE" ++ else ++ /sbin/ifup -v "$WPA_IFACE=$WPA_LOGICAL_IFACE" ++ fi ++ IFUP_RETVAL="$?" ++ ++ ifupdown_unlock ++ fi ++ ++ if [ -d "${WPA_SUP_OMIT_DIR}" ]; then ++ wpa_msg log "creating sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" ++ cat "$WPA_SUP_PIDFILE" > "$WPA_SUP_OMIT_PIDFILE" ++ fi ++ ++ return "$IFUP_RETVAL" ++} ++ ++##################################################################### ++## ifdown IFACE ++# Check IFACE state and ifdown as requested. ++# ++ifdown () { ++ wpa_msg log "ifdown $WPA_IFACE" ++ ++ ifupdown_lock ++ ++ /sbin/ifdown -v "$WPA_IFACE" ++ ++ ifupdown_unlock ++ ++ wpa_msg log "removing sendsigs omission pidfile: $WPA_SUP_OMIT_PIDFILE" ++ rm -f "$WPA_SUP_OMIT_PIDFILE" ++} ++ ++##################################################################### ++## keep IFACE scanning ++# After ifdown, the IFACE may be left "down", and inhibits ++# wpa_supplicant's ability to continue roaming. ++# ++# NB: use iproute if present, flushing the IFACE first ++# ++if_post_down_up () { ++ if [ -x /bin/ip ]; then ++ ip addr flush dev "$WPA_IFACE" 2>/dev/null ++ ip link set "$WPA_IFACE" up ++ else ++ ifconfig "$WPA_IFACE" up ++ fi ++} +diff --git a/board/ant/wpa_supplicant/ifupdown.sh b/board/ant/wpa_supplicant/ifupdown.sh +new file mode 100644 +index 0000000000..2c5b0608ce +--- /dev/null ++++ b/board/ant/wpa_supplicant/ifupdown.sh +@@ -0,0 +1,172 @@ ++#!/bin/sh ++ ++##################################################################### ++## Purpose ++# This file is executed by ifupdown in pre-up, post-up, pre-down and ++# post-down phases of network interface configuration. It allows ++# ifup(8), and ifdown(8) to manage wpa_supplicant(8) and wpa_cli(8) ++# processes running in daemon mode. ++# ++# /etc/wpa_supplicant/functions.sh is sourced by this file. ++# ++# This file is provided by the wpasupplicant package. ++ ++##################################################################### ++# Copyright (C) 2006 - 2009 Debian/Ubuntu wpasupplicant Maintainers ++# ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# On Debian GNU/Linux systems, the text of the GPL license, ++# version 2, can be found in /usr/share/common-licenses/GPL-2. ++ ++if [ -n "$IF_WPA_MAINT_DEBUG" ]; then ++ set -x ++fi ++ ++# quit if we're called for the loopback ++if [ "$IFACE" = lo ]; then ++ exit 0 ++fi ++ ++# allow wpa_supplicant interface to be specified via wpa-iface ++# useful for starting wpa_supplicant on one interface of a bridge ++if [ -n "$IF_WPA_IFACE" ]; then ++ WPA_IFACE="$IF_WPA_IFACE" ++else ++ WPA_IFACE="$IFACE" ++fi ++ ++# source functions ++if [ -f /etc/wpa_supplicant/functions.sh ]; then ++ . /etc/wpa_supplicant/functions.sh ++else ++ exit 0 ++fi ++ ++# quit if executables are not installed ++if [ ! -x "$WPA_SUP_BIN" ] || [ ! -x "$WPA_CLI_BIN" ]; then ++ exit 0 ++fi ++ ++do_start () { ++ if test_wpa_cli; then ++ # if wpa_action is active for this IFACE, do nothing ++ ifupdown_locked && exit 0 ++ ++ # if the administrator is calling ifup, say something useful ++ if [ "$PHASE" = "pre-up" ]; then ++ wpa_msg stderr "wpa_action is managing ifup/ifdown state of $WPA_IFACE" ++ wpa_msg stderr "execute \`ifdown --force $WPA_IFACE' to stop wpa_action" ++ fi ++ exit 1 ++ elif ! set | grep -q "^IF_WPA"; then ++ # no wpa- option defined for IFACE, do nothing ++ exit 0 ++ fi ++ ++ # ensure stale ifupdown_lock marker is purged ++ ifupdown_unlock ++ ++ # preliminary sanity checks for roaming daemon ++ if [ -n "$IF_WPA_ROAM" ]; then ++ if [ "$METHOD" != "manual" ]; then ++ wpa_msg stderr "wpa-roam can only be used with the \"manual\" inet METHOD" ++ exit 1 ++ fi ++ if [ -n "$IF_WPA_MAPPING_SCRIPT" ]; then ++ if ! type "$IF_WPA_MAPPING_SCRIPT" >/dev/null; then ++ wpa_msg stderr "wpa-mapping-script \"$IF_WPA_MAPPING_SCRIPT\" is not valid" ++ exit 1 ++ fi ++ fi ++ if [ -n "$IF_WPA_MAPPING_SCRIPT_PRIORITY" ] && [ -z "$IF_WPA_MAPPING_SCRIPT" ]; then ++ wpa_msg stderr "\"wpa-mapping-script-priority 1\" is invalid without a wpa-mapping-script" ++ exit 1 ++ fi ++ IF_WPA_CONF="$IF_WPA_ROAM" ++ WPA_ACTION_SCRIPT="/sbin/wpa_action" ++ fi ++ ++ # master function; determines if ifupdown.sh should do something or not ++ if [ -n "$IF_WPA_CONF" ] && [ "$IF_WPA_CONF" != "managed" ]; then ++ if [ ! -s "$IF_WPA_CONF" ]; then ++ wpa_msg stderr "cannot read contents of $IF_WPA_CONF" ++ exit 1 ++ fi ++ WPA_SUP_CONF_CTRL_DIR=$(sed -n -e 's/[[:space:]]*#.*//g' -e 's/[[:space:]]\+.*$//g' \ ++ -e 's/^ctrl_interface=\(DIR=\)\?\(.*\)/\2/p' "$IF_WPA_CONF") ++ if [ -n "$WPA_SUP_CONF_CTRL_DIR" ]; then ++ WPA_CTRL_DIR="$WPA_SUP_CONF_CTRL_DIR" ++ WPA_SUP_CONF="-c $IF_WPA_CONF" ++ else ++ # specify the default ctrl_interface since none was defined in ++ # the given IF_WPA_CONF ++ WPA_SUP_CONF="-c $IF_WPA_CONF -C $WPA_CTRL_DIR" ++ fi ++ else ++ # specify the default ctrl_interface ++ WPA_SUP_CONF="-C $WPA_CTRL_DIR" ++ fi ++} ++ ++do_stop () { ++ if test_wpa_cli; then ++ # if wpa_action is active for this IFACE and calling ifdown, ++ # do nothing ++ ifupdown_locked && exit 0 ++ elif test_wpa_supplicant; then ++ # wpa_supplicant process exists for this IFACE, but wpa_cli ++ # process does not. Allow stop mode to kill this process. ++ : ++ else ++ exit 0 ++ fi ++} ++ ++case "$MODE" in ++ start) ++ do_start ++ case "$PHASE" in ++ pre-up) ++ kill_wpa_supplicant ++ init_wpa_supplicant || exit 1 ++ conf_wpa_supplicant || { kill_wpa_supplicant; exit 1; } ++ ;; ++ post-up) ++ init_wpa_cli || { kill_wpa_supplicant; exit 1; } ++ ;; ++ esac ++ ;; ++ ++ stop) ++ do_stop ++ case "$PHASE" in ++ pre-down) ++ kill_wpa_cli ++ ;; ++ post-down) ++ kill_wpa_supplicant ++ ;; ++ *) ++ wpa_msg stderr "unknown phase: \"$PHASE\"" ++ exit 1 ++ ;; ++ esac ++ ;; ++ ++ *) ++ wpa_msg stderr "unknown mode: \"$MODE\"" ++ exit 1 ++ ;; ++esac ++ ++exit 0 +diff --git a/configs/zynq_ant_defconfig b/configs/zynq_ant_defconfig +new file mode 100644 +index 0000000000..3c88c4aec6 +--- /dev/null ++++ b/configs/zynq_ant_defconfig +@@ -0,0 +1,64 @@ ++BR2_arm=y ++BR2_cortex_a9=y ++BR2_ARM_ENABLE_NEON=y ++BR2_ARM_ENABLE_VFP=y ++BR2_ARM_FPU_NEON=y ++BR2_TOOLCHAIN_EXTERNAL=y ++BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=y ++BR2_OPTIMIZE_2=y ++BR2_TARGET_GENERIC_HOSTNAME="ant" ++BR2_TARGET_GENERIC_ISSUE="Welcome to ANTSDR" ++BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y ++BR2_TARGET_GENERIC_ROOT_PASSWD="analog" ++BR2_TARGET_GENERIC_GETTY_PORT="ttyPS0" ++BR2_ROOTFS_POST_BUILD_SCRIPT="board/ant/post-build.sh" ++BR2_PACKAGE_ZSTD=y ++BR2_PACKAGE_MTD=y ++# BR2_PACKAGE_MTD_NANDDUMP is not set ++# BR2_PACKAGE_MTD_NANDTEST is not set ++# BR2_PACKAGE_MTD_NANDWRITE is not set ++# BR2_PACKAGE_MTD_UBIATTACH is not set ++# BR2_PACKAGE_MTD_UBICRC32 is not set ++# BR2_PACKAGE_MTD_UBIDETACH is not set ++# BR2_PACKAGE_MTD_UBIFORMAT is not set ++# BR2_PACKAGE_MTD_UBIMKVOL is not set ++# BR2_PACKAGE_MTD_UBINFO is not set ++# BR2_PACKAGE_MTD_UBINIZE is not set ++# BR2_PACKAGE_MTD_UBIRENAME is not set ++# BR2_PACKAGE_MTD_UBIRMVOL is not set ++# BR2_PACKAGE_MTD_UBIRSVOL is not set ++# BR2_PACKAGE_MTD_UBIUPDATEVOL is not set ++# BR2_PACKAGE_MTD_UBIBLOCK is not set ++BR2_PACKAGE_LINUX_FIRMWARE=y ++BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT61=y ++BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT73=y ++BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT2XX=y ++BR2_PACKAGE_LINUX_FIRMWARE_RTL_81XX=y ++BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX=y ++BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX=y ++BR2_PACKAGE_INPUT_EVENT_DAEMON=y ++BR2_PACKAGE_UBOOT_TOOLS=y ++BR2_PACKAGE_ZLIB=y ++BR2_PACKAGE_LIBAD9361_IIO=y ++BR2_PACKAGE_LIBGPIOD=y ++BR2_PACKAGE_LIBGPIOD_TOOLS=y ++BR2_PACKAGE_LIBIIO_IIOD_USBD=y ++BR2_PACKAGE_LIBIIO_TESTS=y ++BR2_PACKAGE_LIBINI=y ++BR2_PACKAGE_AVAHI=y ++BR2_PACKAGE_AVAHI_DAEMON=y ++BR2_PACKAGE_AVAHI_LIBDNSSD_COMPATIBILITY=y ++BR2_PACKAGE_DROPBEAR=y ++BR2_PACKAGE_DROPBEAR_LOCALOPTIONS_FILE="board/ant/dropbrear_localoptions.h" ++BR2_PACKAGE_IW=y ++BR2_PACKAGE_WPA_SUPPLICANT=y ++BR2_PACKAGE_WPA_SUPPLICANT_CLI=y ++BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y ++BR2_PACKAGE_POLL_SYSFS=y ++BR2_PACKAGE_AD936X_REF_CAL=y ++BR2_TARGET_ROOTFS_CPIO=y ++BR2_TARGET_ROOTFS_CPIO_GZIP=y ++BR2_TARGET_ROOTFS_CPIO_UIMAGE=y ++BR2_PACKAGE_HOST_DOSFSTOOLS=y ++BR2_PACKAGE_HOST_GENIMAGE=y ++BR2_PACKAGE_HOST_MTOOLS=y +diff --git a/package/m4/m4.hash b/package/m4/m4.hash +index a81f4fab9c..b6dcca6c7d 100644 +--- a/package/m4/m4.hash ++++ b/package/m4/m4.hash +@@ -1,4 +1,4 @@ + # Locally calculated after checking pgp signature +-sha256 63aede5c6d33b6d9b13511cd0be2cac046f2e70fd0a07aa9573a04a82783af96 m4-1.4.19.tar.xz ++sha256 f25c6ab51548a73a75558742fb031e0625d6485fe5f9155949d6486a2408ab66 m4-1.4.21.tar.xz + # License files, locally calculated + sha256 3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986 COPYING +diff --git a/package/m4/m4.mk b/package/m4/m4.mk +index 39ad898b10..d498754b35 100644 +--- a/package/m4/m4.mk ++++ b/package/m4/m4.mk +@@ -4,7 +4,7 @@ + # + ################################################################################ + +-M4_VERSION = 1.4.19 ++M4_VERSION = 1.4.21 + M4_SOURCE = m4-$(M4_VERSION).tar.xz + M4_SITE = $(BR2_GNU_MIRROR)/m4 + M4_LICENSE = GPL-3.0+ +-- +2.54.0 + diff --git a/patch/ant-2026/0001-add-support-linux.patch b/patch/ant-2026/0001-add-support-linux.patch new file mode 100644 index 0000000..6c7645a --- /dev/null +++ b/patch/ant-2026/0001-add-support-linux.patch @@ -0,0 +1,1254 @@ +From 1678aa4b6aea1ae2049051818fd1f133e11df853 Mon Sep 17 00:00:00 2001 +From: wjx <3570534440@qq.com> +Date: Tue, 17 Dec 2024 09:49:40 +0800 +Subject: [PATCH] add-support-linux + +--- + arch/arm/boot/dts/zynq-7000.dtsi | 2 +- + arch/arm/boot/dts/zynq-ant.dts | 62 ++++ + arch/arm/boot/dts/zynq-ant.dtsi | 504 ++++++++++++++++++++++++++++ + arch/arm/configs/zynq_ant_defconfig | 285 ++++++++++++++++ + drivers/iio/adc/Kconfig | 7 + + drivers/iio/adc/Makefile | 1 + + drivers/iio/adc/ad5660_mp.c | 272 +++++++++++++++ + drivers/mtd/spi-nor/core.c | 8 +- + 8 files changed, 1138 insertions(+), 3 deletions(-) + create mode 100644 arch/arm/boot/dts/zynq-ant.dts + create mode 100644 arch/arm/boot/dts/zynq-ant.dtsi + create mode 100644 arch/arm/configs/zynq_ant_defconfig + create mode 100644 drivers/iio/adc/ad5660_mp.c + +diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi +index a5bf385d2c85..c229ee9c4e1c 100644 +--- a/arch/arm/boot/dts/zynq-7000.dtsi ++++ b/arch/arm/boot/dts/zynq-7000.dtsi +@@ -95,7 +95,7 @@ replicator_in_port0: endpoint { + }; + }; + +- amba: axi { ++ amba: amba { + u-boot,dm-pre-reloc; + compatible = "simple-bus"; + #address-cells = <1>; +diff --git a/arch/arm/boot/dts/zynq-ant.dts b/arch/arm/boot/dts/zynq-ant.dts +new file mode 100644 +index 000000000000..d9ee46e79b33 +--- /dev/null ++++ b/arch/arm/boot/dts/zynq-ant.dts +@@ -0,0 +1,62 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * ++ * hdl_project: ++ * board_revision: ++ * ++ * Copyright (C) 2016-2019 MicroPhase Inc. ++ */ ++/dts-v1/; ++#include "zynq-ant.dtsi" ++ ++ ++// &axi_i2c0 { ++// current_limiter@5a { ++// compatible = "adi,adm1177"; ++// reg = <0x5a>; ++// adi,r-sense-mohm = <50>; /* 50 mOhm */ ++// adi,shutdown-threshold-ma = <1059>; /* 1.059 A */ ++// adi,vrange-high-enable; ++// }; ++// }; ++ ++ ++&adc0_ad9364 { ++ /* This property is controlled by u-boot environment. */ ++ adi,2rx-2tx-mode-enable; ++}; ++ ++&cf_ad9364_dac_core_0 { ++ /* This property is controlled by u-boot environment. */ ++ compatible = "adi,axi-ad9361-dds-6.00.a"; ++}; ++ ++ ++/ { ++ ++ leds { ++ compatible = "gpio-leds"; ++ led0 { ++ label = "led0:green"; ++ gpios = <&gpio0 15 0>; ++ linux,default-trigger = "heartbeat"; ++ }; ++ }; ++ ++ gpio_keys { ++ compatible = "gpio-keys"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ button { ++ interrupt-parent = <&gpio0>; ++ interrupts = <14 IRQ_TYPE_EDGE_FALLING>; ++ label = "Button"; ++ linux,code = ; ++ }; ++ ++ }; ++}; ++ ++ ++ +diff --git a/arch/arm/boot/dts/zynq-ant.dtsi b/arch/arm/boot/dts/zynq-ant.dtsi +new file mode 100644 +index 000000000000..28d95f782d33 +--- /dev/null ++++ b/arch/arm/boot/dts/zynq-ant.dtsi +@@ -0,0 +1,504 @@ ++/* ++ * ZYNQ Pluto SDR (Z7020/AD936x) ++ * ++ * Copyright (C) 2021 MicroPhase Inc. ++ * ++ * Licensed under the GPL-2. ++ */ ++#include "zynq.dtsi" ++#include ++#include ++#include ++ ++#define AD9361_EXT_BAND_CTL_SHORTHANDS ++#include ++ ++/ { ++ model = "Analog Devices ANTSDR Rev.C (Z7020/AD9363)"; ++ memory { ++ device_type = "memory"; ++ reg = <0x00000000 0x40000000>; ++ }; ++ ++ chosen { ++ stdout-path = "/amba@0/uart@E0001000"; ++ }; ++ ++ ++ clocks { ++ ad9364_clkin: clock@0 { ++ #clock-cells = <0>; ++ compatible = "adjustable-clock"; ++ clock-frequency = <40000000>; ++ clock-accuracy = <200000>; /* 200 ppm (ppb) */ ++ clock-output-names = "ad9364_ext_refclk"; ++ }; ++ }; ++ ++ usb_phy0: phy0 { ++ compatible = "ulpi-phy"; ++ #phy-cells = <0>; ++ reg = <0xe0002000 0x1000>; ++ view-port = <0x0170>; ++ drv-vbus; ++ }; ++ ++ mp5660{ ++ compatible = "microphase,ad5660"; ++ }; ++ ++}; ++ ++ ++&sdhci0 { ++ status = "okay"; ++ xlnx,has-cd = <0x0>; ++ xlnx,has-power = <0x0>; ++ xlnx,has-wp = <0x0>; ++}; ++ ++&watchdog0 { ++ status = "okay"; ++ reset-on-timeout; ++}; ++ ++&gem0 { ++ status = "okay"; ++ phy-mode = "rgmii-id"; ++ phy-handle = <&phy0>; ++ ++ phy0: phy@0 { /* Marvell 88e1512 */ ++ reg = <0>; ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reset-gpios = <&gpio0 46 1>; ++ }; ++}; ++ ++&usb0 { ++ xlnx,phy-reset-gpio = <&gpio0 47 0>; ++ dr_mode = "otg"; ++ status = "okay"; ++ usb-phy = <&usb_phy0>; ++}; ++ ++&qspi { ++ status = "okay"; ++ is-dual = <0>; ++ num-cs = <1>; ++ primary_flash: ps7-qspi@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-tx-bus-width = <1>; ++ spi-rx-bus-width = <4>; ++ compatible = "n25q256a", "n25q512a", "jedec,spi-nor"; /* same as S25FL256 */ ++ reg = <0x0>; ++ spi-max-frequency = <50000000>; ++ partition@qspi-fsbl-uboot { ++ label = "qspi-fsbl-uboot"; ++ reg = <0x0 0x100000>; /* 1M */ ++ }; ++ partition@qspi-uboot-env { ++ label = "qspi-uboot-env"; ++ reg = <0x100000 0x20000>; /* 128k */ ++ }; ++ partition@qspi-nvmfs { ++ label = "qspi-nvmfs"; ++ reg = <0x120000 0xE0000>; /* 1M */ ++ }; ++ partition@qspi-linux { ++ label = "qspi-linux"; ++ reg = <0x200000 0x1E00000>; /* 30M */ ++ }; ++ }; ++}; ++ ++&adc { ++ xlnx,channels { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ channel@0 { ++ reg = <0>; ++ }; ++ }; ++}; ++ ++/ { ++ fpga_axi: fpga-axi@0 { ++ compatible = "simple-bus"; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ ranges; ++ ++ // axi_i2c0: i2c@41600000 { ++ // compatible = "xlnx,axi-iic-1.02.a", "xlnx,xps-iic-2.00.a"; ++ // reg = <0x41600000 0x10000>; ++ // interrupt-parent = <&intc>; ++ // interrupts = <0 59 IRQ_TYPE_LEVEL_HIGH>; ++ // clocks = <&clkc 15>; ++ // clock-names = "pclk"; ++ ++ // #address-cells = <1>; ++ // #size-cells = <0>; ++ ++ // }; ++ ++ rx_dma: dma@7c400000 { ++ compatible = "adi,axi-dmac-1.00.a"; ++ reg = <0x7c400000 0x10000>; ++ #dma-cells = <1>; ++ interrupts = <0 57 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&clkc 16>; ++ ++ adi,channels { ++ #size-cells = <0>; ++ #address-cells = <1>; ++ ++ dma-channel@0 { ++ reg = <0>; ++ adi,source-bus-width = <32>; ++ adi,source-bus-type = <2>; ++ adi,destination-bus-width = <64>; ++ adi,destination-bus-type = <0>; ++ }; ++ }; ++ }; ++ ++ tx_dma: dma@7c420000 { ++ compatible = "adi,axi-dmac-1.00.a"; ++ reg = <0x7c420000 0x10000>; ++ #dma-cells = <1>; ++ interrupts = <0 56 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&clkc 16>; ++ ++ adi,channels { ++ #size-cells = <0>; ++ #address-cells = <1>; ++ ++ dma-channel@0 { ++ reg = <0>; ++ adi,source-bus-width = <64>; ++ adi,source-bus-type = <0>; ++ adi,destination-bus-width = <32>; ++ adi,destination-bus-type = <2>; ++ }; ++ }; ++ }; ++ ++ cf_ad9364_adc_core_0: cf-ad9361-lpc@79020000 { ++ compatible = "adi,axi-ad9361-6.00.a"; ++ reg = <0x79020000 0x6000>; ++ dmas = <&rx_dma 0>; ++ dma-names = "rx"; ++ spibus-connected = <&adc0_ad9364>; ++ adi,axi-decimation-core-available; ++ }; ++ ++ cf_ad9364_dac_core_0: cf-ad9361-dds-core-lpc@79024000 { ++ compatible = "adi,axi-ad9364-dds-6.00.a"; ++ reg = <0x79024000 0x1000>; ++ clocks = <&adc0_ad9364 13>; ++ clock-names = "sampl_clk"; ++ dmas = <&tx_dma 0>; ++ dma-names = "tx"; ++ adi,axi-interpolation-core-available; ++ adi,axi-dds-default-scale = <0>; ++ }; ++ ++ mwipcore@43c00000 { ++ compatible = "mathworks,mwipcore-axi4lite-v1.00"; ++ reg = <0x43c00000 0xffff>; ++ }; ++ }; ++}; ++ ++&spi0 { ++ status = "okay"; ++ ++ adc0_ad9364: ad9361-phy@0 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ compatible = "adi,ad9364"; ++ ++ /* SPI Setup */ ++ reg = <0>; ++ spi-cpha; ++ spi-max-frequency = <10000000>; ++ ++ /* Clocks */ ++ clocks = <&ad9364_clkin 0>; ++ clock-names = "ad9364_ext_refclk"; ++ clock-output-names = "rx_sampl_clk", "tx_sampl_clk"; ++ ++ /* Digital Interface Control */ ++ ++ /* adi,digital-interface-tune-skip-mode: ++ * 0 = TUNE RX&TX ++ * 1 = SKIP TX ++ * 2 = SKIP ALL ++ */ ++ //adi,digital-interface-tune-skip-mode = <0>; ++ ++ adi,pp-tx-swap-enable; ++ adi,pp-rx-swap-enable; ++ adi,rx-frame-pulse-mode-enable; ++ ++ adi,xo-disable-use-ext-refclk-enable; ++ ++ /* Enable CMOS Mode */ ++ adi,full-port-enable; ++ adi,digital-interface-tune-fir-disable; ++ ++ adi,digital-interface-tune-skip-mode = <0>; /* TUNE RX & TX */ ++ adi,tx-fb-clock-delay = <0>; ++ adi,tx-data-delay = <9>; ++ adi,swap-ports-enable; ++ ++ /* Mode Setup */ ++ ++ //adi,split-gain-table-mode-enable; ++ ++ /* ENSM Mode */ ++ adi,frequency-division-duplex-mode-enable; ++ //adi,ensm-enable-pin-pulse-mode-enable; ++ //adi,ensm-enable-txnrx-control-enable; ++ ++ ++ /* adi,rx-rf-port-input-select: ++ * 0 = (RX1A_N & RX1A_P) and (RX2A_N & RX2A_P) enabled; balanced ++ * 1 = (RX1B_N & RX1B_P) and (RX2B_N & RX2B_P) enabled; balanced ++ * 2 = (RX1C_N & RX1C_P) and (RX2C_N & RX2C_P) enabled; balanced ++ * ++ * 3 = RX1A_N and RX2A_N enabled; unbalanced ++ * 4 = RX1A_P and RX2A_P enabled; unbalanced ++ * 5 = RX1B_N and RX2B_N enabled; unbalanced ++ * 6 = RX1B_P and RX2B_P enabled; unbalanced ++ * 7 = RX1C_N and RX2C_N enabled; unbalanced ++ * 8 = RX1C_P and RX2C_P enabled; unbalanced ++ */ ++ ++ adi,rx-rf-port-input-select = <0>; /* (RX1A_N & RX1A_P) and (RX2A_N & RX2A_P) enabled; balanced */ ++ adi,rx-rf-port-input-select-lock-enable; ++ ++ /* adi,tx-rf-port-input-select: ++ * 0 TX1A, TX2A ++ * 1 TX1B, TX2B ++ */ ++ ++ adi,tx-rf-port-input-select = <0>; /* TX1A, TX2A */ ++ adi,tx-rf-port-input-select-lock-enable; ++ ++ //adi,update-tx-gain-in-alert-enable; ++ adi,tx-attenuation-mdB = <10000>; ++ adi,tx-lo-powerdown-managed-enable; ++ ++ adi,rf-rx-bandwidth-hz = <18000000>; ++ adi,rf-tx-bandwidth-hz = <18000000>; ++ adi,rx-synthesizer-frequency-hz = /bits/ 64 <2400000000>; ++ adi,tx-synthesizer-frequency-hz = /bits/ 64 <2450000000>; ++ ++ /* BBPLL ADC R2CLK R1CLK CLKRF RSAMPL */ ++ adi,rx-path-clock-frequencies = <983040000 245760000 122880000 61440000 30720000 30720000>; ++ /* BBPLL DAC T2CLK T1CLK CLKTF TSAMPL */ ++ adi,tx-path-clock-frequencies = <983040000 122880000 122880000 61440000 30720000 30720000>; ++ ++ /* Gain Control */ ++ ++ /* adi,gc-rx[1|2]-mode: ++ * 0 = RF_GAIN_MGC ++ * 1 = RF_GAIN_FASTATTACK_AGC ++ * 2 = RF_GAIN_SLOWATTACK_AGC ++ * 3 = RF_GAIN_HYBRID_AGC ++ */ ++ ++ adi,gc-rx1-mode = <2>; ++ adi,gc-rx2-mode = <2>; ++ adi,gc-adc-ovr-sample-size = <4>; /* sum 4 samples */ ++ adi,gc-adc-small-overload-thresh = <47>; /* sum of squares */ ++ adi,gc-adc-large-overload-thresh = <58>; /* sum of squares */ ++ adi,gc-lmt-overload-high-thresh = <800>; /* mV */ ++ adi,gc-lmt-overload-low-thresh = <704>; /* mV */ ++ adi,gc-dec-pow-measurement-duration = <8192>; /* 0..524288 Samples */ ++ adi,gc-low-power-thresh = <24>; /* 0..-64 dBFS vals are set pos */ ++ //adi,gc-dig-gain-enable; ++ //adi,gc-max-dig-gain = <15>; ++ ++ /* Manual Gain Control Setup */ ++ ++ //adi,mgc-rx1-ctrl-inp-enable; /* uncomment to use ctrl inputs */ ++ //adi,mgc-rx2-ctrl-inp-enable; /* uncomment to use ctrl inputs */ ++ adi,mgc-inc-gain-step = <2>; ++ adi,mgc-dec-gain-step = <2>; ++ ++ /* adi,mgc-split-table-ctrl-inp-gain-mode: ++ * (relevant if adi,split-gain-table-mode-enable is set) ++ * 0 = AGC determine this ++ * 1 = only in LPF ++ * 2 = only in LMT ++ */ ++ ++ adi,mgc-split-table-ctrl-inp-gain-mode = <0>; ++ ++ /* Automatic Gain Control Setup */ ++ ++ adi,agc-attack-delay-extra-margin-us= <1>; /* us */ ++ adi,agc-outer-thresh-high = <5>; /* -dBFS */ ++ adi,agc-outer-thresh-high-dec-steps = <2>; /* 0..15 */ ++ adi,agc-inner-thresh-high = <10>; /* -dBFS */ ++ adi,agc-inner-thresh-high-dec-steps = <1>; /* 0..7 */ ++ adi,agc-inner-thresh-low = <12>; /* -dBFS */ ++ adi,agc-inner-thresh-low-inc-steps = <1>; /* 0..7 */ ++ adi,agc-outer-thresh-low = <18>; /* -dBFS */ ++ adi,agc-outer-thresh-low-inc-steps = <2>; /* 0..15 */ ++ ++ adi,agc-adc-small-overload-exceed-counter = <10>; /* 0..15 */ ++ adi,agc-adc-large-overload-exceed-counter = <10>; /* 0..15 */ ++ adi,agc-adc-large-overload-inc-steps = <2>; /* 0..15 */ ++ //adi,agc-adc-lmt-small-overload-prevent-gain-inc-enable; ++ adi,agc-lmt-overload-large-exceed-counter = <10>; /* 0..15 */ ++ adi,agc-lmt-overload-small-exceed-counter = <10>; /* 0..15 */ ++ adi,agc-lmt-overload-large-inc-steps = <2>; /* 0..7 */ ++ //adi,agc-dig-saturation-exceed-counter = <3>; /* 0..15 */ ++ //adi,agc-dig-gain-step-size = <4>; /* 1..8 */ ++ ++ //adi,agc-sync-for-gain-counter-enable; ++ adi,agc-gain-update-interval-us = <1000>; /* 1ms */ ++ //adi,agc-immed-gain-change-if-large-adc-overload-enable; ++ //adi,agc-immed-gain-change-if-large-lmt-overload-enable; ++ ++ /* Fast AGC */ ++ ++ adi,fagc-dec-pow-measurement-duration = <64>; /* 64 Samples */ ++ //adi,fagc-allow-agc-gain-increase-enable; ++ adi,fagc-lp-thresh-increment-steps = <1>; ++ adi,fagc-lp-thresh-increment-time = <5>; ++ ++ adi,fagc-energy-lost-stronger-sig-gain-lock-exit-cnt = <8>; ++ adi,fagc-final-overrange-count = <3>; ++ //adi,fagc-gain-increase-after-gain-lock-enable; ++ adi,fagc-gain-index-type-after-exit-rx-mode = <0>; ++ adi,fagc-lmt-final-settling-steps = <1>; ++ adi,fagc-lock-level = <10>; ++ adi,fagc-lock-level-gain-increase-upper-limit = <5>; ++ adi,fagc-lock-level-lmt-gain-increase-enable; ++ ++ adi,fagc-lpf-final-settling-steps = <1>; ++ adi,fagc-optimized-gain-offset = <5>; ++ adi,fagc-power-measurement-duration-in-state5 = <64>; ++ adi,fagc-rst-gla-engergy-lost-goto-optim-gain-enable; ++ adi,fagc-rst-gla-engergy-lost-sig-thresh-below-ll = <10>; ++ adi,fagc-rst-gla-engergy-lost-sig-thresh-exceeded-enable; ++ adi,fagc-rst-gla-if-en-agc-pulled-high-mode = <0>; ++ adi,fagc-rst-gla-large-adc-overload-enable; ++ adi,fagc-rst-gla-large-lmt-overload-enable; ++ adi,fagc-rst-gla-stronger-sig-thresh-above-ll = <10>; ++ adi,fagc-rst-gla-stronger-sig-thresh-exceeded-enable; ++ adi,fagc-state-wait-time-ns = <260>; ++ adi,fagc-use-last-lock-level-for-set-gain-enable; ++ ++ /* RSSI */ ++ ++ /* adi,rssi-restart-mode: ++ * 0 = AGC_IN_FAST_ATTACK_MODE_LOCKS_THE_GAIN, ++ * 1 = EN_AGC_PIN_IS_PULLED_HIGH, ++ * 2 = ENTERS_RX_MODE, ++ * 3 = GAIN_CHANGE_OCCURS, ++ * 4 = SPI_WRITE_TO_REGISTER, ++ * 5 = GAIN_CHANGE_OCCURS_OR_EN_AGC_PIN_PULLED_HIGH, ++ */ ++ adi,rssi-restart-mode = <3>; ++ //adi,rssi-unit-is-rx-samples-enable; ++ adi,rssi-delay = <1>; /* 1us */ ++ adi,rssi-wait = <1>; /* 1us */ ++ adi,rssi-duration = <1000>; /* 1ms */ ++ ++ /* Control Outputs */ ++ adi,ctrl-outs-index = <0>; ++ adi,ctrl-outs-enable-mask = <0xFF>; ++ ++ /* AuxADC Temp Sense Control */ ++ ++ adi,temp-sense-measurement-interval-ms = <1000>; ++ adi,temp-sense-offset-signed = <0xCE>; ++ adi,temp-sense-periodic-measurement-enable; ++ ++ /* AuxDAC Control */ ++ ++ adi,aux-dac-manual-mode-enable; ++ ++ adi,aux-dac1-default-value-mV = <0>; ++ //adi,aux-dac1-active-in-rx-enable; ++ //adi,aux-dac1-active-in-tx-enable; ++ //adi,aux-dac1-active-in-alert-enable; ++ adi,aux-dac1-rx-delay-us = <0>; ++ adi,aux-dac1-tx-delay-us = <0>; ++ ++ adi,aux-dac2-default-value-mV = <0>; ++ //adi,aux-dac2-active-in-rx-enable; ++ //adi,aux-dac2-active-in-tx-enable; ++ //adi,aux-dac2-active-in-alert-enable; ++ adi,aux-dac2-rx-delay-us = <0>; ++ adi,aux-dac2-tx-delay-us = <0>; ++ ++ /* Control GPIOs */ ++ ++ en_agc-gpios = <&gpio0 66 0>; ++ reset-gpios = <&gpio0 67 0>; ++ adi,band-ctl-0-gpio = <&gpio0 86 0>;/* RX1 3~6G */ ++ adi,band-ctl-1-gpio = <&gpio0 87 0>;/* RX1 4.5M~3G */ ++ adi,band-ctl-2-gpio = <&gpio0 88 0>;/* TX1 3~6G */ ++ adi,band-ctl-3-gpio = <&gpio0 89 0>;/* TX1 4.5M~3G */ ++ adi,band-ctl-4-gpio = <&gpio0 90 0>;/* RX2 3~6G */ ++ adi,band-ctl-5-gpio = <&gpio0 91 0>;/* RX2 4.5M~3G */ ++ adi,band-ctl-6-gpio = <&gpio0 92 0>;/* TX2 3~6G */ ++ adi,band-ctl-7-gpio = <&gpio0 93 0>;/* TX2 4.5M~3G */ ++ ++ ++ ad9361_rx_ant_port_a: ad9361_rx_ant_port_a { ++ adi,rx-rf-port-input-select = <0>; /* (RX1A_N & RX1A_P) and (RX2A_N & RX2A_P) enabled; balanced */ ++ }; ++ ++ ad9361_rx_ant_port_b: ad9361_rx_ant_port_b { ++ adi,rx-rf-port-input-select = <1>; /* (RX1B_N & RX1B_P) and (RX2B_N & RX2B_P) enabled; balanced */ ++ }; ++ ++ ad9361_tx_ant_port_a: ad9361_tx_ant_port_a { ++ adi,tx-rf-port-input-select = <0>; /* TX1A, TX2A */ ++ }; ++ ++ ad9361_tx_ant_port_b: ad9361_tx_ant_port_b { ++ adi,tx-rf-port-input-select = <1>; /* TX1B, TX2B */ ++ }; ++ ++ ++ adi_rx_band_setting_0 { ++ adi,lo-freq-min = /bits/ 64 <0>; ++ adi,lo-freq-max = /bits/ 64 <3000000000>; ++ adi,gpio-settings = <0 1 _ _ 0 1 _ _>; ++ adi,band-ctl-post = <&ad9361_rx_ant_port_b 0>; ++ }; ++ ++ adi_rx_band_setting_1 { ++ adi,lo-freq-min = /bits/ 64 <3000000000>; ++ adi,lo-freq-max = /bits/ 64 <6000000000>; ++ adi,gpio-settings = <1 0 _ _ 1 0 _ _>; ++ adi,band-ctl-post = <&ad9361_rx_ant_port_a 0>; ++ }; ++ ++ adi_tx_band_setting_0 { ++ adi,lo-freq-min = /bits/ 64 <0>; ++ adi,lo-freq-max = /bits/ 64 <3000000000>; ++ adi,gpio-settings = <_ _ 0 1 _ _ 0 1>; ++ adi,band-ctl-post = <&ad9361_tx_ant_port_b 0>; ++ }; ++ ++ adi_tx_band_setting_1 { ++ adi,lo-freq-min = /bits/ 64 <3000000000>; ++ adi,lo-freq-max = /bits/ 64 <6000000000>; ++ ++ adi,gpio-settings = <_ _ 1 0 _ _ 1 0>; ++ adi,band-ctl-post = <&ad9361_tx_ant_port_a 0>; ++ }; ++ }; ++}; ++ +diff --git a/arch/arm/configs/zynq_ant_defconfig b/arch/arm/configs/zynq_ant_defconfig +new file mode 100644 +index 000000000000..28d1ac9bb35d +--- /dev/null ++++ b/arch/arm/configs/zynq_ant_defconfig +@@ -0,0 +1,285 @@ ++CONFIG_SYSVIPC=y ++CONFIG_USELIB=y ++CONFIG_HIGH_RES_TIMERS=y ++CONFIG_PREEMPT=y ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=15 ++CONFIG_CGROUPS=y ++CONFIG_BLK_DEV_INITRD=y ++# CONFIG_RD_BZIP2 is not set ++# CONFIG_RD_LZMA is not set ++# CONFIG_RD_XZ is not set ++# CONFIG_RD_LZO is not set ++# CONFIG_RD_LZ4 is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_EMBEDDED=y ++CONFIG_PERF_EVENTS=y ++CONFIG_SLAB=y ++CONFIG_ARCH_ZYNQ=y ++ ++CONFIG_MMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_PLTFM=y ++CONFIG_MMC_SDHCI_OF_ARASAN=y ++CONFIG_UEVENT_HELPER=y ++CONFIG_MACB=y ++CONFIG_MDIO_BITBANG=y ++CONFIG_MARVELL_PHY=y ++CONFIG_XILINX_GMII2RGMII=y ++CONFIG_USB_NET_DM9601=y ++ ++CONFIG_XILINX_RESET_CODE=y ++CONFIG_PL310_ERRATA_588369=y ++CONFIG_PL310_ERRATA_727915=y ++CONFIG_PL310_ERRATA_769419=y ++# CONFIG_ARM_ERRATA_643719 is not set ++CONFIG_ARM_ERRATA_754322=y ++CONFIG_ARM_ERRATA_754327=y ++CONFIG_ARM_ERRATA_764369=y ++CONFIG_ARM_ERRATA_775420=y ++CONFIG_SMP=y ++CONFIG_SCHED_MC=y ++CONFIG_SCHED_SMT=y ++CONFIG_HIGHMEM=y ++# CONFIG_HIGHPTE is not set ++CONFIG_CMDLINE="console=ttyPS0,115200n8 root=/dev/ram rw earlyprintk" ++CONFIG_CPU_IDLE=y ++CONFIG_CPU_IDLE_GOV_MENU=y ++CONFIG_ARM_ZYNQ_CPUIDLE=y ++CONFIG_VFP=y ++CONFIG_NEON=y ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++CONFIG_MODULE_FORCE_UNLOAD=y ++CONFIG_MODVERSIONS=y ++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set ++# CONFIG_COMPACTION is not set ++CONFIG_CMA=y ++CONFIG_NET=y ++CONFIG_PACKET=y ++CONFIG_UNIX=y ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++CONFIG_IP_PNP_BOOTP=y ++CONFIG_IP_PNP_RARP=y ++CONFIG_NET_IPIP=m ++# CONFIG_IPV6 is not set ++CONFIG_VLAN_8021Q=m ++CONFIG_CFG80211=y ++CONFIG_MAC80211=y ++CONFIG_MAC80211_LEDS=y ++CONFIG_RFKILL=y ++CONFIG_RFKILL_INPUT=y ++CONFIG_UEVENT_HELPER=y ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y ++CONFIG_CONNECTOR=y ++CONFIG_MTD=y ++CONFIG_MTD_CMDLINE_PARTS=y ++CONFIG_MTD_BLOCK=y ++CONFIG_MTD_CFI=y ++CONFIG_MTD_CFI_AMDSTD=y ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_OF=y ++CONFIG_MTD_SPI_NOR=y ++# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_SIZE=16384 ++CONFIG_ADI_AXI_TDD=y ++CONFIG_SRAM=y ++# CONFIG_MATHWORKS_IP_CORE is not set ++CONFIG_SCSI=y ++CONFIG_BLK_DEV_SD=y ++CONFIG_CHR_DEV_SG=y ++# CONFIG_BLK_DEV_BSG is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NET_VENDOR_ALACRITECH is not set ++# CONFIG_NET_VENDOR_AMAZON is not set ++# CONFIG_NET_VENDOR_AQUANTIA is not set ++# CONFIG_NET_VENDOR_ARC is not set ++# CONFIG_NET_VENDOR_BROADCOM is not set ++# CONFIG_NET_VENDOR_CIRRUS is not set ++# CONFIG_NET_VENDOR_EZCHIP is not set ++# CONFIG_NET_VENDOR_FARADAY is not set ++# CONFIG_NET_VENDOR_HISILICON is not set ++# CONFIG_NET_VENDOR_HUAWEI is not set ++# CONFIG_NET_VENDOR_INTEL is not set ++# CONFIG_NET_VENDOR_MARVELL is not set ++# CONFIG_NET_VENDOR_MELLANOX is not set ++# CONFIG_NET_VENDOR_MICREL is not set ++# CONFIG_NET_VENDOR_MICROCHIP is not set ++# CONFIG_NET_VENDOR_NATSEMI is not set ++# CONFIG_NET_VENDOR_NETRONOME is not set ++# CONFIG_NET_VENDOR_QUALCOMM is not set ++# CONFIG_NET_VENDOR_RENESAS is not set ++# CONFIG_NET_VENDOR_ROCKER is not set ++# CONFIG_NET_VENDOR_SAMSUNG is not set ++# CONFIG_NET_VENDOR_SEEQ is not set ++# CONFIG_NET_VENDOR_SOLARFLARE is not set ++# CONFIG_NET_VENDOR_SMSC is not set ++# CONFIG_NET_VENDOR_STMICRO is not set ++# CONFIG_NET_VENDOR_SYNOPSYS is not set ++# CONFIG_NET_VENDOR_VIA is not set ++# CONFIG_NET_VENDOR_WIZNET is not set ++# CONFIG_NET_VENDOR_XILINX is not set ++CONFIG_USB_RTL8152=y ++CONFIG_USB_LAN78XX=y ++CONFIG_USB_USBNET=y ++# CONFIG_USB_NET_CDC_NCM is not set ++CONFIG_USB_NET_DM9601=y ++CONFIG_USB_NET_SMSC75XX=y ++CONFIG_USB_NET_SMSC95XX=y ++# CONFIG_USB_NET_NET1080 is not set ++CONFIG_USB_NET_RNDIS_HOST=y ++# CONFIG_USB_NET_CDC_SUBSET is not set ++# CONFIG_USB_NET_ZAURUS is not set ++# CONFIG_WLAN_VENDOR_ADMTEK is not set ++# CONFIG_WLAN_VENDOR_ATH is not set ++# CONFIG_WLAN_VENDOR_ATMEL is not set ++# CONFIG_WLAN_VENDOR_BROADCOM is not set ++# CONFIG_WLAN_VENDOR_CISCO is not set ++# CONFIG_WLAN_VENDOR_INTEL is not set ++# CONFIG_WLAN_VENDOR_INTERSIL is not set ++# CONFIG_WLAN_VENDOR_MARVELL is not set ++# CONFIG_WLAN_VENDOR_MEDIATEK is not set ++CONFIG_RT2X00=y ++CONFIG_RT2500USB=y ++CONFIG_RT73USB=y ++CONFIG_RT2800USB=y ++CONFIG_RT2800USB_RT3573=y ++CONFIG_RT2800USB_RT53XX=y ++CONFIG_RT2800USB_RT55XX=y ++CONFIG_RT2800USB_UNKNOWN=y ++CONFIG_RTL8187=y ++CONFIG_RTL8192CU=y ++# CONFIG_RTLWIFI_DEBUG is not set ++CONFIG_RTL8XXXU=y ++CONFIG_RTL8XXXU_UNTESTED=y ++# CONFIG_WLAN_VENDOR_RSI is not set ++# CONFIG_WLAN_VENDOR_ST is not set ++# CONFIG_WLAN_VENDOR_TI is not set ++# CONFIG_WLAN_VENDOR_ZYDAS is not set ++CONFIG_INPUT_FF_MEMLESS=y ++CONFIG_INPUT_SPARSEKMAP=y ++CONFIG_INPUT_EVDEV=y ++CONFIG_KEYBOARD_GPIO=y ++# CONFIG_INPUT_MOUSE is not set ++CONFIG_VT_HW_CONSOLE_BINDING=y ++# CONFIG_LEGACY_PTYS is not set ++CONFIG_SERIAL_XILINX_PS_UART=y ++CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y ++# CONFIG_HW_RANDOM is not set ++CONFIG_I2C=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_CADENCE=y ++CONFIG_I2C_GPIO=y ++CONFIG_I2C_XILINX=y ++CONFIG_SPI=y ++CONFIG_SPI_AXI_SPI_ENGINE=y ++CONFIG_SPI_CADENCE=y ++CONFIG_SPI_XILINX=y ++CONFIG_SPI_ZYNQ_QSPI=y ++CONFIG_SPI_SPIDEV=y ++CONFIG_GPIOLIB=y ++CONFIG_GPIO_SYSFS=y ++CONFIG_GPIO_ZYNQ=y ++CONFIG_POWER_SUPPLY=y ++CONFIG_THERMAL=y ++CONFIG_WATCHDOG=y ++CONFIG_XILINX_WATCHDOG=y ++CONFIG_CADENCE_WATCHDOG=y ++CONFIG_SSB=y ++CONFIG_REGULATOR=y ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++CONFIG_HIDRAW=y ++CONFIG_USB_HIDDEV=y ++CONFIG_USB=y ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++CONFIG_USB_OTG=y ++CONFIG_USB_EHCI_HCD=y ++# CONFIG_USB_EHCI_TT_NEWSCHED is not set ++CONFIG_USB_STORAGE=y ++CONFIG_USB_CHIPIDEA=y ++CONFIG_USB_CHIPIDEA_UDC=y ++CONFIG_USB_CHIPIDEA_HOST=y ++CONFIG_USB_SERIAL=y ++CONFIG_USB_SERIAL_GENERIC=y ++CONFIG_USB_SERIAL_FTDI_SIO=y ++CONFIG_USB_ULPI=y ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_VBUS_DRAW=500 ++CONFIG_USB_GADGET_XILINX=y ++CONFIG_USB_CONFIGFS=y ++CONFIG_USB_CONFIGFS_SERIAL=y ++CONFIG_USB_CONFIGFS_ACM=y ++CONFIG_USB_CONFIGFS_NCM=y ++CONFIG_USB_CONFIGFS_ECM=y ++CONFIG_USB_CONFIGFS_ECM_SUBSET=y ++CONFIG_USB_CONFIGFS_RNDIS=y ++CONFIG_USB_CONFIGFS_EEM=y ++CONFIG_USB_CONFIGFS_MASS_STORAGE=y ++CONFIG_USB_CONFIGFS_F_FS=y ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++CONFIG_LEDS_GPIO=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_ONESHOT=y ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++CONFIG_LEDS_TRIGGER_CPU=y ++CONFIG_LEDS_TRIGGER_GPIO=y ++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y ++CONFIG_DMADEVICES=y ++CONFIG_AXI_DMAC=y ++CONFIG_UIO=y ++CONFIG_UIO_PDRV_GENIRQ=y ++CONFIG_UIO_DMEM_GENIRQ=y ++CONFIG_UIO_XILINX_APM=y ++CONFIG_STAGING=y ++CONFIG_R8712U=y ++CONFIG_R8188EU=y ++CONFIG_COMMON_CLK_AXI_CLKGEN=y ++# CONFIG_IOMMU_SUPPORT is not set ++CONFIG_MEMORY=y ++CONFIG_IIO=y ++CONFIG_ADM1177=y ++CONFIG_AD9361=y ++CONFIG_AD9361_EXT_BAND_CONTROL=y ++CONFIG_ADMC=y ++CONFIG_XILINX_XADC=y ++CONFIG_ONE_BIT_ADC_DAC=y ++CONFIG_CF_AXI_DDS=y ++CONFIG_ADI_IIO_FAKEDEV=y ++CONFIG_FPGA=y ++CONFIG_FPGA_MGR_ZYNQ_FPGA=y ++CONFIG_EXT4_FS=y ++# CONFIG_DNOTIFY is not set ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_TMPFS=y ++CONFIG_TMPFS_POSIX_ACL=y ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_COMPRESSION_OPTIONS=y ++# CONFIG_NETWORK_FILESYSTEMS is not set ++CONFIG_NLS_CODEPAGE_437=y ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_MICHAEL_MIC=y ++CONFIG_DMA_CMA=y ++CONFIG_CMA_SIZE_MBYTES=256 ++CONFIG_DEBUG_INFO=y ++CONFIG_DEBUG_FS=y ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=20 ++# CONFIG_SCHED_DEBUG is not set ++# CONFIG_DEBUG_PREEMPT is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=60 ++# CONFIG_FTRACE is not set ++CONFIG_DEBUG_LL=y ++CONFIG_DEBUG_ZYNQ_UART1=y ++CONFIG_EARLY_PRINTK=y ++CONFIG_AD5660_MP=y +diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig +index 84aee568537c..8462abfa9d58 100644 +--- a/drivers/iio/adc/Kconfig ++++ b/drivers/iio/adc/Kconfig +@@ -6,6 +6,13 @@ + + menu "Analog to digital converters" + ++config AD5660_MP ++ tristate "Microphase ad5660 control" ++ depends on GPIOLIB ++ help ++ If you say yes here you get support for ad5660mp dac control. ++ ++ + config AB8500_GPADC + bool "ST-Ericsson AB8500 GPADC driver" + depends on AB8500_CORE && REGULATOR_AB8500 +diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile +index 339ddf2d0ea3..a7698f4dabde 100644 +--- a/drivers/iio/adc/Makefile ++++ b/drivers/iio/adc/Makefile +@@ -11,6 +11,7 @@ obj-$(CONFIG_AD400X) += ad400x.o + obj-$(CONFIG_AD4130) += ad4130.o + obj-$(CONFIG_AD4134) += ad4134.o + obj-$(CONFIG_AD4630) += ad4630.o ++obj-$(CONFIG_AD5660_MP) += ad5660_mp.o + obj-$(CONFIG_AD6676) += ad6676.o + obj-$(CONFIG_AD7173) += ad7173.o + obj-$(CONFIG_AD7091R5) += ad7091r5.o ad7091r-base.o +diff --git a/drivers/iio/adc/ad5660_mp.c b/drivers/iio/adc/ad5660_mp.c +new file mode 100644 +index 000000000000..0f97c1e815c4 +--- /dev/null ++++ b/drivers/iio/adc/ad5660_mp.c +@@ -0,0 +1,272 @@ ++/* ++ * AD5660: ad5660 control ++ * ++ * Copyright (c) 2023 lone boy ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++#define DAC_MEM_ADDR 0x43C00000 ++ ++/* ++* DAC MODE 0 自动设置 1 手动设置 ++* DAC value 1 写 dac的值 ++* DAC dyn_value mode 1 用户设置的值 mode 0 外部参考校准的值 ++* DAC ref sel DAC MODE 0 0:10M 1:PPS 2:GPS ++* DAC_LOCKED PLL 锁定状态 ++*/ ++ ++struct ad5660_data{ ++ struct device *dev; ++ void __iomem *control_virtualaddr; ++}; ++ ++enum ad5660_iio_dev_attr{ ++ DAC_MODE, ++ DAC_VALUE, ++ DAC_READ_VALUE, ++ DAC_REF_SEL, ++ DAC_LOCKED, ++}; ++ ++static ssize_t ad5660_show(struct device *dev,struct device_attribute *attr,char *buf) ++{ ++ struct iio_dev *indio_dev = dev_to_iio_dev(dev); ++ struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ++ struct ad5660_data *ad5660 = iio_priv(indio_dev); ++ int ret = 0; ++ ++ switch ((u32) this_attr->address) ++ { ++ case DAC_MODE: ++ ret = sprintf(buf,"%u\n",ioread32(ad5660->control_virtualaddr)); ++ break; ++ case DAC_VALUE: ++ ret = sprintf(buf,"%u\n",ioread32(ad5660->control_virtualaddr + 4)); ++ break; ++ case DAC_READ_VALUE: ++ ret = sprintf(buf,"%u\n",ioread32(ad5660->control_virtualaddr + 8)); ++ break; ++ case DAC_REF_SEL: ++ ret = sprintf(buf,"%u\n",ioread32(ad5660->control_virtualaddr + 12)); ++ break; ++ case DAC_LOCKED: ++ ret = sprintf(buf,"%u\n",ioread32(ad5660->control_virtualaddr + 16)); ++ break; ++ default: ++ ret = EINVAL; ++ break; ++ } ++ return ret; ++} ++ ++ ++static ssize_t ad5660_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t len) ++{ ++ struct iio_dev *indio_dev = dev_to_iio_dev(dev); ++ struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ++ struct ad5660_data *ad5660 = iio_priv(indio_dev); ++ int ret = 0; ++ u32 val; ++ ++ switch ((u32) this_attr->address) ++ { ++ case DAC_MODE: ++ ret = kstrtou32(buf,10,&val); ++ iowrite32(val,ad5660->control_virtualaddr); ++ break; ++ case DAC_VALUE: ++ ret = kstrtou32(buf,10,&val); ++ iowrite32(val,ad5660->control_virtualaddr+4); ++ break; ++ case DAC_REF_SEL: ++ ret = kstrtou32(buf,10,&val); ++ iowrite32(val,ad5660->control_virtualaddr+12); ++ break; ++ default: ++ ret = EINVAL; ++ break; ++ } ++ return ret; ++} ++ ++static IIO_DEVICE_ATTR(in_voltage_dac_mode,S_IRUGO | S_IWUSR, ++ ad5660_show, ++ ad5660_store, ++ DAC_MODE ++); ++ ++static IIO_DEVICE_ATTR(in_voltage_dac_value,S_IRUGO | S_IWUSR, ++ ad5660_show, ++ ad5660_store, ++ DAC_VALUE ++); ++ ++static IIO_DEVICE_ATTR(in_voltage_dac_read_value,S_IRUGO | S_IWUSR, ++ ad5660_show, ++ ad5660_store, ++ DAC_READ_VALUE ++); ++ ++static IIO_DEVICE_ATTR(in_voltage_dac_ref_sel,S_IRUGO | S_IWUSR, ++ ad5660_show, ++ ad5660_store, ++ DAC_REF_SEL ++); ++ ++static IIO_DEVICE_ATTR(in_voltage_dac_locked,S_IRUGO | S_IWUSR, ++ ad5660_show, ++ ad5660_store, ++ DAC_LOCKED ++); ++ ++static struct attribute *ad5660_attributes[] = { ++ &iio_dev_attr_in_voltage_dac_mode.dev_attr.attr, ++ &iio_dev_attr_in_voltage_dac_value.dev_attr.attr, ++ &iio_dev_attr_in_voltage_dac_read_value.dev_attr.attr, ++ &iio_dev_attr_in_voltage_dac_ref_sel.dev_attr.attr, ++ &iio_dev_attr_in_voltage_dac_locked.dev_attr.attr, ++ NULL ++}; ++ ++static const struct attribute_group ad5660_attribute_group = { ++ .attrs = ad5660_attributes, ++}; ++ ++ ++static int ad5660_read_raw(struct iio_dev *indio_dev, ++ const struct iio_chan_spec *chan, int *val, ++ int *val2, long mask) ++{ ++ return 0; ++} ++ ++static int ad5660_write_raw(struct iio_dev *indio_dev, ++ struct iio_chan_spec const *chan, int val, ++ int val2, long mask) ++{ ++ return 0; ++} ++ ++static const struct iio_info ad5660_iio_info = { ++ .read_raw = &ad5660_read_raw, ++ .write_raw = &ad5660_write_raw, ++ .attrs = &ad5660_attribute_group, ++}; ++ ++static const struct of_device_id of_ad5660mp_match[] = { ++ { .compatible = "microphase,ad5660" }, ++ {}, ++}; ++ ++MODULE_DEVICE_TABLE(of, of_ad5660mp_match); ++ ++ ++static const struct iio_chan_spec ad5660_channles[] = { ++ { ++ .type = IIO_VOLTAGE, ++ .indexed = 1, ++ .channel = 0, ++ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_RAW), ++ }, ++}; ++ ++static int ad5660_probe(struct platform_device *pdev) ++{ ++ struct ad5660_data *ad5660; ++ struct iio_dev *indio_dev; ++ int ret; ++ ++ indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*ad5660)); ++ if (!indio_dev) ++ return -ENOMEM; ++ ++ ad5660 = iio_priv(indio_dev); ++ ad5660->dev = &pdev->dev; ++ ++ ad5660->control_virtualaddr = ioremap(DAC_MEM_ADDR, 0x10000); ++ if (!ad5660->control_virtualaddr) { ++ dev_err(&pdev->dev, "unable to IOMAP ad5660mp registers\n"); ++ return -ENOMEM; ++ } ++ ++ dev_info(&pdev->dev,"IOMAP ad5660mp registers phyaddr %x virtaddr %x",DAC_MEM_ADDR,ad5660->control_virtualaddr); ++ ++ iowrite32(1,ad5660->control_virtualaddr); ++ iowrite32(23000,ad5660->control_virtualaddr+4); ++ ++ ++ indio_dev->name = "ad5660mp"; ++ indio_dev->dev.parent = &pdev->dev; ++ indio_dev->dev.of_node = pdev->dev.of_node; ++ indio_dev->info = &ad5660_iio_info; ++ indio_dev->modes = INDIO_DIRECT_MODE; ++ ++ indio_dev->channels = ad5660_channles; ++ indio_dev->num_channels = ARRAY_SIZE(ad5660_channles); ++ ret = iio_device_register(indio_dev); ++ if (ret < 0) { ++ dev_err(&pdev->dev, "Couldn't register the device\n"); ++ } ++ ++ platform_set_drvdata(pdev, indio_dev); ++ ++ return ret; ++} ++ ++ ++static int ad5660_removed(struct platform_device *pdev) ++{ ++ struct ad5660_data *ad5660; ++ struct iio_dev *indio_dev; ++ ++ indio_dev = platform_get_drvdata(pdev); ++ ad5660 = iio_priv(indio_dev); ++ ++ if (ad5660->control_virtualaddr) ++ iounmap(ad5660->control_virtualaddr); ++ ++ iio_device_unregister(indio_dev); ++ return 0; ++} ++ ++static struct platform_driver lpf1600_driver = { ++ .probe = ad5660_probe, ++ .remove = ad5660_removed, ++ .driver = { ++ .name = KBUILD_MODNAME, ++ .of_match_table = of_ad5660mp_match, ++ }, ++}; ++ ++module_platform_driver(lpf1600_driver); ++ ++MODULE_AUTHOR("loneboy <995586238@qq.com>"); ++MODULE_DESCRIPTION("ad5660mp driver"); ++MODULE_LICENSE("GPL V2"); +\ No newline at end of file +diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c +index 47c49589f81f..149d9432935b 100644 +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -424,6 +424,7 @@ int spi_nor_read_id(struct spi_nor *nor, u8 naddr, u8 ndummy, u8 *id, + enum spi_nor_protocol proto) + { + int ret; ++ + #define SPI_NOR_MAX_EDID_LEN 20 + + if (nor->spimem) { +@@ -623,7 +624,8 @@ static int spi_nor_write_ear(struct spi_nor *nor, u32 addr) + code = SPINOR_OP_BRWR; + if (nor->info->id[0] == CFI_MFR_ST || + nor->info->id[0] == CFI_MFR_MACRONIX || +- nor->info->id[0] == CFI_MFR_PMC) { ++ nor->info->id[0] == CFI_MFR_PMC || ++ nor->info->id[0] == CFI_MFR_WINBND ) { + spi_nor_write_enable(nor); + code = SPINOR_OP_WREAR; + } +@@ -669,7 +671,8 @@ static int read_ear(struct spi_nor *nor, struct flash_info *info) + /* This is actually Micron */ + else if (nor->info->id[0] == CFI_MFR_ST || + nor->info->id[0] == CFI_MFR_MACRONIX || +- nor->info->id[0] == CFI_MFR_PMC) ++ nor->info->id[0] == CFI_MFR_PMC || ++ nor->info->id[0] == CFI_MFR_WINBND) + code = SPINOR_OP_RDEAR; + else + return -EINVAL; +@@ -3455,6 +3458,7 @@ static int spi_nor_init(struct spi_nor *nor) + if (nor->info->id[0] == CFI_MFR_ATMEL || + nor->info->id[0] == CFI_MFR_INTEL || + nor->info->id[0] == CFI_MFR_SST || ++ nor->info->id[0] == CFI_MFR_WINBND || + nor->info->id[0] & SNOR_F_HAS_LOCK) { + spi_nor_write_enable(nor); + nor->bouncebuf[0] = 0; +-- +2.25.1 + diff --git a/patch/ant-2026/0001-add-support-makefile-scripts.patch b/patch/ant-2026/0001-add-support-makefile-scripts.patch new file mode 100644 index 0000000..15eeb9f --- /dev/null +++ b/patch/ant-2026/0001-add-support-makefile-scripts.patch @@ -0,0 +1,386 @@ +From 8af36bef50ddedac03c6d9ec4d2ea18eb336e770 Mon Sep 17 00:00:00 2001 +From: mrzhuzhe <466648706@qq.com> +Date: Wed, 15 Jul 2026 15:07:12 +0800 +Subject: [PATCH] add-support-makefile-scripts + +--- + Makefile | 41 +++++++-- + scripts/ant.its | 158 +++++++++++++++++++++++++++++++++ + scripts/ant.mk | 10 +++ + scripts/create_fsbl_project.py | 92 +++++++++++++++++++ + 4 files changed, 292 insertions(+), 9 deletions(-) + create mode 100644 scripts/ant.its + create mode 100644 scripts/ant.mk + create mode 100644 scripts/create_fsbl_project.py + +diff --git a/Makefile b/Makefile +index 0b2e57a..a42cfca 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,5 +1,5 @@ + +-VIVADO_VERSION ?= 2023.2 ++VIVADO_VERSION ?= 2025.2 + + # Use Buildroot External Linaro GCC 7.3-2018.05 arm-linux-gnueabihf Toolchain + CROSS_COMPILE = arm-linux-gnueabihf- +@@ -27,8 +27,8 @@ $(error " 3] export VIVADO_VERSION=v20xx.x") + endif + endif + +-TARGET ?= pluto +-SUPPORTED_TARGETS:=pluto sidekiqz2 ++TARGET ?= ant ++SUPPORTED_TARGETS:=pluto sidekiqz2 ant + + # Include target specific constants + include scripts/$(TARGET).mk +@@ -91,14 +91,15 @@ build/uboot-env.bin: build/uboot-env.txt + linux/arch/arm/boot/zImage: TOOLCHAIN + $(TOOLS_PATH) make -C linux ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) zynq_$(TARGET)_defconfig + $(TOOLS_PATH) make -C linux -j $(NCORES) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) zImage UIMAGE_LOADADDR=0x8000 +- ++ $(TOOLS_PATH) make -C linux -j $(NCORES) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) uImage UIMAGE_LOADADDR=0x8000 + + .PHONY: linux/arch/arm/boot/zImage +- ++.PHONY: linux/arch/arm/boot/uImage + + build/zImage: linux/arch/arm/boot/zImage | build + cp $< $@ +- ++build/uImage: linux/arch/arm/boot/uImage | build ++ cp $< $@ + ### Device Tree ### + + linux/arch/arm/boot/dts/%.dtb: TOOLCHAIN linux/arch/arm/boot/dts/%.dts linux/arch/arm/boot/dts/zynq-pluto-sdr.dtsi +@@ -142,15 +143,17 @@ endif + + ### TODO: Build system_top.xsa from src if dl fails ... + +-build/sdk/fsbl/Release/fsbl.elf build/system_top.bit : build/system_top.xsa ++build/sdk/fsbl/export/fsbl/sw/boot/fsbl.elf build/system_top.bit : build/system_top.xsa + rm -Rf build/sdk + ifeq (1, ${HAVE_VIVADO}) +- bash -c "source $(VIVADO_SETTINGS) && xsct scripts/create_fsbl_project.tcl" ++# bash -c "source $(VIVADO_SETTINGS) && xsct scripts/create_fsbl_project.tcl" ++# Vivado 2025 use new vitis server ++ bash -c "source $(VIVADO_SETTINGS) && vitis -s scripts/create_fsbl_project.py" + else + unzip -o build/system_top.xsa system_top.bit -d build + endif + +-build/boot.bin: build/sdk/fsbl/Release/fsbl.elf build/u-boot.elf ++build/boot.bin: build/sdk/fsbl/export/fsbl/sw/boot/fsbl.elf build/u-boot.elf + @echo img:{[bootloader] $^ } > build/boot.bif + bash -c "source $(VIVADO_SETTINGS) && bootgen -image build/boot.bif -w -o $@" + +@@ -187,6 +190,26 @@ clean: + rm -f $(notdir $(wildcard build/*)) + rm -rf build/* + ++SDIMGDIR = $(CURDIR)/build_sdimg ++sdimg: build/ ++ mkdir $(SDIMGDIR) ++ cp build/sdk/fsbl/export/fsbl/sw/boot/fsbl.elf $(SDIMGDIR)/fsbl.elf ++ cp build/system_top.bit $(SDIMGDIR)/system_top.bit ++ cp build/u-boot.elf $(SDIMGDIR)/u-boot.elf ++ cp $(CURDIR)/linux/arch/arm/boot/uImage $(SDIMGDIR)/uImage ++ cp build/zynq-$(TARGET).dtb $(SDIMGDIR)/devicetree.dtb ++ cp build/uboot-env.txt $(SDIMGDIR)/uEnv.txt ++ cp build/rootfs.cpio.gz $(SDIMGDIR)/ramdisk.image.gz ++ mkimage -A arm -T ramdisk -C gzip -d $(SDIMGDIR)/ramdisk.image.gz $(SDIMGDIR)/uramdisk.image.gz ++ touch $(SDIMGDIR)/boot.bif ++ echo "img : {[bootloader] $(SDIMGDIR)/fsbl.elf $(SDIMGDIR)/system_top.bit $(SDIMGDIR)/u-boot.elf}" > $(SDIMGDIR)/boot.bif ++ bash -c "source $(VIVADO_SETTINGS) && bootgen -image $(SDIMGDIR)/boot.bif -w -o $(SDIMGDIR)/BOOT.bin" ++ rm $(SDIMGDIR)/fsbl.elf ++ rm $(SDIMGDIR)/system_top.bit ++ rm $(SDIMGDIR)/u-boot.elf ++ rm $(SDIMGDIR)/ramdisk.image.gz ++ rm $(SDIMGDIR)/boot.bif ++ + zip-all: $(TARGETS) + zip -j build/$(ZIP_ARCHIVE_PREFIX)-fw-$(VERSION).zip $^ + +diff --git a/scripts/ant.its b/scripts/ant.its +new file mode 100644 +index 0000000..7d1adb0 +--- /dev/null ++++ b/scripts/ant.its +@@ -0,0 +1,158 @@ ++/* ++ * U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs ++ * This example makes use of the 'loadables' field ++ */ ++ ++/* ++ * fdt get addr foo /images/fdt@1 data ++ */ ++ ++/dts-v1/; ++ ++/ { ++ description = "Configuration to load fpga before Kernel"; ++ magic = "ITB PlutoSDR (ADALM-PLUTO)"; ++ #address-cells = <1>; ++ images { ++ ++ fdt@1 { ++ description = "zynq-pluto-sdr"; ++ data = /incbin/("../build/zynq-ant.dtb"); ++ type = "flat_dt"; ++ arch = "arm"; ++ compression = "none"; ++ }; ++ ++ fpga@1 { ++ description = "FPGA"; ++ data = /incbin/("../build/system_top.bit"); ++ type = "fpga"; ++ arch = "arm"; ++ compression = "none"; ++ load = <0xF000000>; ++ hash@1 { ++ algo = "md5"; ++ }; ++ }; ++ ++ linux_kernel@1 { ++ description = "Linux"; ++ data = /incbin/("../build/zImage"); ++ type = "kernel"; ++ arch = "arm"; ++ os = "linux"; ++ compression = "none"; ++ load = <0x8000>; ++ entry = <0x8000>; ++ hash@1 { ++ algo = "md5"; ++ }; ++ }; ++ ramdisk@1 { ++ description = "Ramdisk"; ++ data = /incbin/("../build/rootfs.cpio.gz"); ++ type = "ramdisk"; ++ arch = "arm"; ++ os = "linux"; ++ compression = "gzip"; ++ hash@1 { ++ algo = "md5"; ++ }; ++ }; ++ ++ }; ++ ++ configurations { ++ default = "config@0"; ++ config@0 { ++ description = "Linux with fpga RevA"; ++ fdt = "fdt@1"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ /* all below is currently RevB ! */ ++ ++ config@1 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@2 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@3 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@4 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@5 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@6 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ ++ config@7 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@8 { /* This one is actually RevC */ ++ description = "Linux with fpga RevC"; ++ fdt = "fdt@3"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@9 { /* This one is actually RevB */ ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ ++ config@10 { ++ description = "Linux with fpga RevB"; ++ fdt = "fdt@2"; ++ kernel = "linux_kernel@1"; ++ ramdisk = "ramdisk@1"; ++ fpga = "fpga@1"; ++ }; ++ }; ++}; +diff --git a/scripts/ant.mk b/scripts/ant.mk +new file mode 100644 +index 0000000..cd48388 +--- /dev/null ++++ b/scripts/ant.mk +@@ -0,0 +1,10 @@ ++ ++# Target specific constants go here ++ ++HDF_URL:=http://github.com/analogdevicesinc/plutosdr-fw/releases/download/${LATEST_TAG}/system_top.hdf ++TARGET_DTS_FILES:= zynq-ant.dtb ++COMPLETE_NAME:=ANTSDR ++ZIP_ARCHIVE_PREFIX:=antsdr ++DEVICE_VID:=0x0456 ++DEVICE_PID:=0xb673 ++ +diff --git a/scripts/create_fsbl_project.py b/scripts/create_fsbl_project.py +new file mode 100644 +index 0000000..e11e7d2 +--- /dev/null ++++ b/scripts/create_fsbl_project.py +@@ -0,0 +1,92 @@ ++""" ++hsi open_hw_design build/system_top.xsa ++set cpu_name [lindex [hsi get_cells -filter {IP_TYPE==PROCESSOR}] 0] ++ ++setws ./build/sdk ++app create -name fsbl -hw build/system_top.xsa -proc $cpu_name -os standalone -lang C -template {Zynq FSBL} ++# Optional: build-config is a java style, you should set domain_object.get_config compiler_flags instead ++app config -name fsbl -set build-config release ++app build -name fsbl ++ ++""" ++ ++import vitis ++import hsi ++import os ++ ++def get_metadata(**kwargs): ++ xsa = "" ++ open_xsa = 0 ++ ret_metadata = {'arch' : '', 'target_proc' : ''} ++ for key, value in kwargs.items(): ++ if key == "xsa": ++ xsa = value ++ if key == "open_xsa": ++ open_xsa = 1 ++ ++ if open_xsa == 1: ++ if xsa != "": ++ print("Info: Using XSA file: " + xsa + " to extract HW metadata using HSI Python API") ++ HwDesign = hsi.HwManager.open_hw_design(xsa) ++ ret_metadata['arch'] = HwDesign.FAMILY ++ for proc in HwDesign.get_cells(hierarchical='true',filter='IP_TYPE==PROCESSOR'): ++ if proc.IP_NAME == "psu_cortexa53" or proc.IP_NAME == "psv_cortexa72" or proc.IP_NAME == "ps7_cortexa9": ++ ret_metadata['target_proc'] = proc.IP_NAME+"_0" ++ #notice there are two cpu ++ HwDesign.close() ++ else: ++ print("Error: No XSA passed. HW metadata will not be extracted.") ++ else: ++ print("Info: no need to open XSA") ++ ++ return ret_metadata ++ ++def get_domain_info(platform): ++ #list all domains (there will just be one here). Users can use print(domains) to see the attributes ++ domains = platform.list_domains() ++ platform_domain_name = domains[0]['domain_name'] ++ print("Info: platform created a domain called " + platform_domain_name) ++ ++ #get domain object. I used the format to pass a variable inside quoatation ++ domain_object = platform.get_domain(name = "{}".format(platform_domain_name)) ++ ++ # users can view the os settings of the domain_object. same can be used for get_libs and get_drivers() ++ os_object = domain_object.get_os() ++ print("OS for " + platform_domain_name + " is " + os_object['os']) ++ ++ #This will list all the os parameters for the OS. Users can see this in the bsp.yaml which replaces the mss file. ++ #For ease of use, Users should look at the bsp.yaml to get the valid values. ++ #os_params = domain_object.list_params("os", "{}".format(os_object['os'])) ++ ++ #For example, I can read the standalone_stdin param ++ standalone_stdin = domain_object.get_config(option = 'os', param = 'standalone_stdin') ++ print("Info: standalone_stdin for " + platform_domain_name + " is " + standalone_stdin['value']) ++ #domain_object.set_config(option = 'os', param = 'standalone_stdin', value = 'true') ++ ++ # Get compiler flags ++ proc_compiler_flags = domain_object.get_config(option = 'proc', param = 'proc_compiler_flags') ++ print("Current proc_compiler_flags: " + proc_compiler_flags['value']) ++ ++ proc_extra_compiler_flags = domain_object.get_config(option = 'proc', param = 'proc_extra_compiler_flags') ++ print("Current proc_extra_compiler_flags: " + proc_compiler_flags['value']) ++ ++# main ++client = vitis.create_client() ++xsa = os.path.join(os.getcwd(), "./build/system_top.xsa") ++workspace = os.path.join(os.getcwd(), "./build/sdk") ++client.set_workspace(workspace) ++ ++metadata = get_metadata(xsa=xsa, open_xsa="1") ++arch = metadata['arch'] ++target_proc = metadata['target_proc'] ++print("Info: Detected arch: " + arch) ++print("Info: Using target processor: " + target_proc) ++ ++platform = client.create_platform_component(name = "fsbl", ++ hw_design = xsa,os = "standalone",compiler = "gcc", ++ cpu = target_proc, template = "zynq_fsbl") ++ ++get_domain_info(platform) ++ ++platform = client.get_component(name="fsbl") ++status = platform.build() +\ No newline at end of file +-- +2.54.0 + diff --git a/patch/ant-2026/0001-add-support-uboot.patch b/patch/ant-2026/0001-add-support-uboot.patch new file mode 100644 index 0000000..5fc79a6 --- /dev/null +++ b/patch/ant-2026/0001-add-support-uboot.patch @@ -0,0 +1,2956 @@ +From 4e3d836c47e6db634a6ae2a12beac085bddfb527 Mon Sep 17 00:00:00 2001 +From: mrzhuzhe <466648706@qq.com> +Date: Wed, 15 Jul 2026 12:34:11 +0800 +Subject: [PATCH] add-support-uboot + +--- + arch/arm/cpu/armv7/ls102xa/fdt.c | 2 +- + arch/arm/cpu/armv7/omap5/fdt.c | 2 +- + arch/arm/cpu/armv7/virt-dt.c | 2 +- + arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 2 +- + arch/arm/dts/Makefile | 4 +- + arch/arm/dts/zynq-ant-sdr.dts | 96 +++++++++++++++++++ + arch/arm/lib/bootm.c | 2 +- + arch/arm/mach-meson/board.c | 2 +- + arch/arm/mach-socfpga/misc.c | 2 +- + arch/arm/mach-uniphier/board_early_init_f.c | 2 +- + arch/arm/mach-uniphier/board_late_init.c | 2 +- + arch/arm/mach-uniphier/boards.c | 2 +- + arch/arm/mach-uniphier/dram_init.c | 2 +- + arch/nios2/cpu/fdt.c | 2 +- + arch/powerpc/cpu/mpc512x/pci.c | 2 +- + arch/powerpc/cpu/mpc5xxx/cpu.c | 2 +- + arch/powerpc/cpu/mpc8260/cpu.c | 2 +- + arch/powerpc/cpu/mpc8260/pci.c | 2 +- + arch/powerpc/cpu/mpc83xx/cpu.c | 2 +- + arch/powerpc/cpu/mpc83xx/fdt.c | 2 +- + arch/powerpc/cpu/mpc83xx/pci.c | 2 +- + arch/powerpc/cpu/mpc85xx/fdt.c | 2 +- + arch/powerpc/cpu/mpc85xx/liodn.c | 2 +- + arch/powerpc/cpu/mpc85xx/portals.c | 2 +- + arch/powerpc/cpu/mpc86xx/fdt.c | 2 +- + arch/powerpc/cpu/mpc8xx/cpu.c | 2 +- + arch/powerpc/cpu/mpc8xx/fdt.c | 2 +- + arch/powerpc/cpu/mpc8xxx/fdt.c | 2 +- + arch/powerpc/cpu/ppc4xx/fdt.c | 2 +- + arch/powerpc/lib/bootm.c | 2 +- + arch/x86/cpu/intel_common/microcode.c | 2 +- + board/Arcturus/ucp1020/ucp1020.c | 2 +- + board/a4m072/a4m072.c | 2 +- + board/amcc/canyonlands/canyonlands.c | 2 +- + board/amcc/katmai/katmai.c | 2 +- + board/amcc/kilauea/kilauea.c | 2 +- + board/amcc/makalu/makalu.c | 2 +- + board/amcc/sequoia/sequoia.c | 2 +- + board/amcc/yosemite/yosemite.c | 2 +- + board/cm5200/cm5200.c | 2 +- + board/congatec/cgtqmx6eval/cgtqmx6eval.c | 2 +- + board/esd/cpci405/cpci405.c | 2 +- + board/esd/pmc405de/pmc405de.c | 2 +- + board/esd/pmc440/pmc440.c | 2 +- + board/esd/vme8349/vme8349.c | 2 +- + board/freescale/b4860qds/pci.c | 2 +- + board/freescale/bsc9131rdb/bsc9131rdb.c | 2 +- + board/freescale/bsc9132qds/bsc9132qds.c | 2 +- + board/freescale/c29xpcie/c29xpcie.c | 2 +- + board/freescale/common/cds_pci_ft.c | 2 +- + board/freescale/common/fman.c | 4 +- + board/freescale/common/p_corenet/pci.c | 2 +- + board/freescale/common/sgmii_riser.c | 2 +- + board/freescale/ls1043aqds/eth.c | 2 +- + board/freescale/ls2080a/ls2080a.c | 2 +- + board/freescale/ls2080aqds/ls2080aqds.c | 2 +- + board/freescale/ls2080ardb/ls2080ardb.c | 2 +- + board/freescale/mpc8308rdb/mpc8308rdb.c | 2 +- + board/freescale/mpc8313erdb/mpc8313erdb.c | 2 +- + board/freescale/mpc8315erdb/mpc8315erdb.c | 2 +- + board/freescale/mpc8323erdb/mpc8323erdb.c | 2 +- + board/freescale/mpc832xemds/mpc832xemds.c | 2 +- + board/freescale/mpc8349emds/mpc8349emds.c | 2 +- + board/freescale/mpc8349itx/mpc8349itx.c | 2 +- + board/freescale/mpc837xemds/mpc837xemds.c | 2 +- + board/freescale/mpc8536ds/mpc8536ds.c | 2 +- + board/freescale/mpc8540ads/mpc8540ads.c | 2 +- + board/freescale/mpc8541cds/mpc8541cds.c | 2 +- + board/freescale/mpc8544ds/mpc8544ds.c | 2 +- + board/freescale/mpc8548cds/mpc8548cds.c | 2 +- + board/freescale/mpc8555cds/mpc8555cds.c | 2 +- + board/freescale/mpc8560ads/mpc8560ads.c | 2 +- + board/freescale/mpc8568mds/mpc8568mds.c | 2 +- + board/freescale/mpc8569mds/mpc8569mds.c | 2 +- + board/freescale/mpc8572ds/mpc8572ds.c | 2 +- + board/freescale/mpc8610hpcd/mpc8610hpcd.c | 2 +- + board/freescale/mpc8641hpcn/mpc8641hpcn.c | 2 +- + board/freescale/mx6sabresd/mx6sabresd.c | 2 +- + board/freescale/mx6slevk/mx6slevk.c | 2 +- + board/freescale/mx6sxsabresd/mx6sxsabresd.c | 2 +- + .../mx6ul_14x14_evk/mx6ul_14x14_evk.c | 2 +- + board/freescale/p1010rdb/p1010rdb.c | 2 +- + board/freescale/p1022ds/p1022ds.c | 2 +- + board/freescale/p1023rdb/p1023rdb.c | 2 +- + board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c | 2 +- + board/freescale/p1_twr/p1_twr.c | 2 +- + board/freescale/qemu-ppce500/qemu-ppce500.c | 2 +- + board/freescale/t102xqds/pci.c | 2 +- + board/freescale/t102xrdb/pci.c | 2 +- + board/freescale/t1040qds/pci.c | 2 +- + board/freescale/t104xrdb/pci.c | 2 +- + board/freescale/t208xqds/pci.c | 2 +- + board/freescale/t208xrdb/pci.c | 2 +- + board/freescale/t4qds/pci.c | 2 +- + board/freescale/t4rdb/pci.c | 2 +- + board/gdsys/405ex/io64.c | 2 +- + board/gdsys/intip/intip.c | 2 +- + board/gdsys/mpc8308/hrcon.c | 2 +- + board/gdsys/mpc8308/strider.c | 2 +- + board/gdsys/p1022/controlcenterd.c | 2 +- + board/ids/ids8313/ids8313.c | 2 +- + board/ifm/o2dnt2/o2dnt2.c | 2 +- + board/intercontrol/digsy_mtc/digsy_mtc.c | 2 +- + board/ipek01/ipek01.c | 2 +- + board/jupiter/jupiter.c | 2 +- + board/keymile/km82xx/km82xx.c | 2 +- + board/keymile/km83xx/km83xx.c | 2 +- + board/keymile/kmp204x/pci.c | 2 +- + board/mosaixtech/icon/icon.c | 2 +- + board/motionpro/motionpro.c | 2 +- + board/mpc8308_p1m/mpc8308_p1m.c | 2 +- + board/sbc8349/sbc8349.c | 2 +- + board/sbc8548/sbc8548.c | 2 +- + board/sbc8641d/sbc8641d.c | 2 +- + board/socrates/socrates.c | 2 +- + board/t3corp/t3corp.c | 2 +- + board/tqc/tqm5200/tqm5200.c | 2 +- + board/tqc/tqm8xx/tqm8xx.c | 2 +- + board/tqc/tqma6/tqma6.c | 2 +- + board/tqc/tqma6/tqma6_mba6.c | 2 +- + board/tqc/tqma6/tqma6_wru4.c | 2 +- + board/varisys/cyrus/pci.c | 2 +- + board/ve8313/ve8313.c | 2 +- + board/vscom/baltos/board.c | 2 +- + board/xes/common/fsl_8xxx_pci.c | 2 +- + board/xes/xpedite520x/xpedite520x.c | 2 +- + board/xes/xpedite537x/xpedite537x.c | 2 +- + board/xes/xpedite550x/xpedite550x.c | 2 +- + cmd/bootefi.c | 4 +- + cmd/fdt.c | 2 +- + common/board_info.c | 2 +- + common/bootm_os.c | 2 +- + common/bootstage.c | 2 +- + common/fdt_support.c | 2 +- + common/image-fdt.c | 2 +- + common/image.c | 2 +- + common/lcd_simplefb.c | 2 +- + common/spl/spl_fat.c | 2 +- + common/spl/spl_fit.c | 2 +- + common/spl/spl_nand.c | 2 +- + common/spl/spl_ymodem.c | 2 +- + configs/zynq_ant_defconfig | 61 ++++++++++++ + drivers/core/regmap.c | 2 +- + drivers/core/root.c | 2 +- + drivers/crypto/fsl/sec.c | 2 +- + drivers/mmc/exynos_dw_mmc.c | 2 +- + drivers/mmc/s5p_sdhci.c | 2 +- + drivers/mmc/socfpga_dw_mmc.c | 2 +- + drivers/mmc/zynq_sdhci.c | 2 +- + drivers/net/fsl-mc/mc.c | 2 +- + drivers/pci/fsl_pci_init.c | 2 +- + drivers/pci/pci-emul-uclass.c | 2 +- + drivers/pci/pcie_layerscape.c | 2 +- + drivers/pci/tsi108_pci.c | 2 +- + drivers/pinctrl/pinctrl-uclass.c | 2 +- + drivers/power/pmic/act8846.c | 2 +- + drivers/power/pmic/rk808.c | 2 +- + drivers/qe/fdt.c | 2 +- + drivers/sound/sound-i2s.c | 2 +- + drivers/usb/common/common.c | 2 +- + drivers/usb/host/ehci-exynos.c | 2 +- + drivers/usb/host/ehci-msm.c | 2 +- + drivers/usb/host/ehci-tegra.c | 2 +- + drivers/usb/host/xhci-exynos5.c | 2 +- + drivers/video/exynos/exynos_dp.c | 2 +- + drivers/video/exynos/exynos_dp_lowlevel.c | 2 +- + drivers/video/exynos/exynos_fb.c | 2 +- + drivers/video/exynos/exynos_mipi_dsi.c | 2 +- + include/configs/zynq-common.h | 36 ++++--- + include/fdt_support.h | 2 +- + include/fdtdec.h | 2 +- + include/image.h | 2 +- + include/{libfdt_env.h => libfdt_env_legacy.h} | 0 + include/{libfdt.h => libfdt_legacy.h} | 2 +- + lib/efi_loader/efi_boottime.c | 2 +- + lib/efi_loader/efi_memory.c | 2 +- + lib/fdtdec.c | 2 +- + lib/fdtdec_common.c | 4 +- + lib/fdtdec_test.c | 2 +- + lib/libfdt/fdt.c | 4 +- + lib/libfdt/fdt_addresses.c | 4 +- + lib/libfdt/fdt_empty_tree.c | 4 +- + lib/libfdt/fdt_region.c | 4 +- + lib/libfdt/fdt_ro.c | 4 +- + lib/libfdt/fdt_rw.c | 4 +- + lib/libfdt/fdt_strerror.c | 4 +- + lib/libfdt/fdt_sw.c | 4 +- + lib/libfdt/fdt_wip.c | 4 +- + tools/Makefile | 2 +- + tools/fdt_host.h | 2 +- + tools/fdtgrep.c | 2 +- + tools/ifdtool.c | 2 +- + 192 files changed, 383 insertions(+), 212 deletions(-) + create mode 100644 arch/arm/dts/zynq-ant-sdr.dts + create mode 100644 configs/zynq_ant_defconfig + rename include/{libfdt_env.h => libfdt_env_legacy.h} (100%) + rename include/{libfdt.h => libfdt_legacy.h} (99%) + +diff --git a/arch/arm/cpu/armv7/ls102xa/fdt.c b/arch/arm/cpu/armv7/ls102xa/fdt.c +index ae5e794230c..75881ca500b 100644 +--- a/arch/arm/cpu/armv7/ls102xa/fdt.c ++++ b/arch/arm/cpu/armv7/ls102xa/fdt.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/arm/cpu/armv7/omap5/fdt.c b/arch/arm/cpu/armv7/omap5/fdt.c +index 0493cd1eab3..c407b1b4e42 100644 +--- a/arch/arm/cpu/armv7/omap5/fdt.c ++++ b/arch/arm/cpu/armv7/omap5/fdt.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/arch/arm/cpu/armv7/virt-dt.c b/arch/arm/cpu/armv7/virt-dt.c +index 32c368f1455..325a42ca5b3 100644 +--- a/arch/arm/cpu/armv7/virt-dt.c ++++ b/arch/arm/cpu/armv7/virt-dt.c +@@ -21,7 +21,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c +index d17227ab2b2..37a03736db4 100644 +--- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c ++++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #ifdef CONFIG_FSL_LSCH3 +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 7b19efc9b80..54e2759cca8 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -101,7 +101,9 @@ dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \ + zynq-zc770-xm010.dtb \ + zynq-zc770-xm011.dtb \ + zynq-zc770-xm012.dtb \ +- zynq-zc770-xm013.dtb ++ zynq-zc770-xm013.dtb \ ++ zynq-ant-sdr.dtb ++ + dtb-$(CONFIG_ARCH_ZYNQMP) += \ + zynqmp-ep108.dtb \ + zynqmp-zcu100.dtb \ +diff --git a/arch/arm/dts/zynq-ant-sdr.dts b/arch/arm/dts/zynq-ant-sdr.dts +new file mode 100644 +index 00000000000..b41083b4fa6 +--- /dev/null ++++ b/arch/arm/dts/zynq-ant-sdr.dts +@@ -0,0 +1,96 @@ ++/* ++ * Analog Devices Inc. Pluto SDR board DTS ++ * ++ * Copyright (C) 2015-2018 Analog Devices Inc. ++ * ++ * SPDX-License-Identifier: GPL-2.0+ ++ */ ++/dts-v1/; ++#include "zynq-7000.dtsi" ++ ++/ { ++ model = "Analog Devices E310 board"; ++ compatible = "xlnx,zynq-7000"; ++ ++ aliases { ++ ethernet0 = &gem0; ++ serial0 = &uart1; ++ spi0 = &qspi; ++ }; ++ ++ memory { ++ device_type = "memory"; ++ reg = <0x0 0x40000000>; ++ }; ++ ++ chosen { ++ bootargs = "earlyprintk"; ++ linux,stdout-path = &uart1; ++ stdout-path = &uart1; ++ }; ++ ++ usb_phy0: phy0 { ++ compatible = "usb-nop-xceiv"; ++ #phy-cells = <0>; ++ }; ++}; ++ ++&qspi { ++ status = "okay"; ++ is-dual = <0>; ++ num-cs = <1>; ++ flash@0 { ++ compatible = "n25q256a11,"; ++ reg = <0x0>; ++ spi-tx-bus-width = <1>; ++ spi-rx-bus-width = <4>; ++ spi-max-frequency = <50000000>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ partition@qspi-fsbl-uboot { ++ label = "qspi-fsbl-uboot"; ++ reg = <0x0 0x100000>; /* 1M */ ++ }; ++ partition@qspi-uboot-env { ++ label = "qspi-uboot-env"; ++ reg = <0x100000 0x20000>; /* 128k */ ++ }; ++ partition@qspi-nvmfs { ++ label = "qspi-nvmfs"; ++ reg = <0x120000 0xE0000>; /* 1M */ ++ }; ++ partition@qspi-linux { ++ label = "qspi-linux"; ++ reg = <0x200000 0x1E00000>; /* 30M */ ++ }; ++ }; ++}; ++ ++&uart1 { ++ status = "okay"; ++}; ++ ++&usb0 { ++ status = "okay"; ++ dr_mode = "host"; ++ usb-phy = <&usb_phy0>; ++}; ++ ++&sdhci0 { ++ u-boot,dm-pre-reloc; ++ status = "okay"; ++}; ++ ++&gem0 { ++ status = "okay"; ++ phy-mode = "rgmii-id"; ++ phy-handle = <ðernet_phy0>; ++ ++ ethernet_phy0: ethernet-phy@0 { ++ reg = <0>; ++ reset-gpios = <&gpio0 46 0>; ++ }; ++}; ++ ++ ++ +diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c +index 82354ddfebd..638ab153365 100644 +--- a/arch/arm/lib/bootm.c ++++ b/arch/arm/lib/bootm.c +@@ -17,7 +17,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/arm/mach-meson/board.c b/arch/arm/mach-meson/board.c +index 64fa3c191ee..dca98c8eb0d 100644 +--- a/arch/arm/mach-meson/board.c ++++ b/arch/arm/mach-meson/board.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/arm/mach-socfpga/misc.c b/arch/arm/mach-socfpga/misc.c +index 5cbd8a43255..9bfeb2470ac 100644 +--- a/arch/arm/mach-socfpga/misc.c ++++ b/arch/arm/mach-socfpga/misc.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/arm/mach-uniphier/board_early_init_f.c b/arch/arm/mach-uniphier/board_early_init_f.c +index d35d38dcbf3..a9ac0c2a3d4 100644 +--- a/arch/arm/mach-uniphier/board_early_init_f.c ++++ b/arch/arm/mach-uniphier/board_early_init_f.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "init.h" +diff --git a/arch/arm/mach-uniphier/board_late_init.c b/arch/arm/mach-uniphier/board_late_init.c +index a45412677a0..26fa40f7503 100644 +--- a/arch/arm/mach-uniphier/board_late_init.c ++++ b/arch/arm/mach-uniphier/board_late_init.c +@@ -6,7 +6,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include <../drivers/mtd/nand/denali.h> +diff --git a/arch/arm/mach-uniphier/boards.c b/arch/arm/mach-uniphier/boards.c +index ed308f3ecba..befc11d1cb9 100644 +--- a/arch/arm/mach-uniphier/boards.c ++++ b/arch/arm/mach-uniphier/boards.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "init.h" +diff --git a/arch/arm/mach-uniphier/dram_init.c b/arch/arm/mach-uniphier/dram_init.c +index 489366c63f9..c49ecc025f3 100644 +--- a/arch/arm/mach-uniphier/dram_init.c ++++ b/arch/arm/mach-uniphier/dram_init.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/arch/nios2/cpu/fdt.c b/arch/nios2/cpu/fdt.c +index a44f51a7f2a..7cc2e007f93 100644 +--- a/arch/nios2/cpu/fdt.c ++++ b/arch/nios2/cpu/fdt.c +@@ -13,7 +13,7 @@ + #include + + #ifdef CONFIG_OF_BOARD_SETUP +-#include ++#include "libfdt_legacy.h" + #include + + DECLARE_GLOBAL_DATA_PTR; +diff --git a/arch/powerpc/cpu/mpc512x/pci.c b/arch/powerpc/cpu/mpc512x/pci.c +index 7ea5df2960b..a0b82f59256 100644 +--- a/arch/powerpc/cpu/mpc512x/pci.c ++++ b/arch/powerpc/cpu/mpc512x/pci.c +@@ -12,7 +12,7 @@ + #include + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc5xxx/cpu.c b/arch/powerpc/cpu/mpc5xxx/cpu.c +index 84fabbd473a..92143b4608e 100644 +--- a/arch/powerpc/cpu/mpc5xxx/cpu.c ++++ b/arch/powerpc/cpu/mpc5xxx/cpu.c +@@ -19,7 +19,7 @@ + #include + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc8260/cpu.c b/arch/powerpc/cpu/mpc8260/cpu.c +index 9f2be3cb22c..01a482ab790 100644 +--- a/arch/powerpc/cpu/mpc8260/cpu.c ++++ b/arch/powerpc/cpu/mpc8260/cpu.c +@@ -33,7 +33,7 @@ + #include + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc8260/pci.c b/arch/powerpc/cpu/mpc8260/pci.c +index 56f290ca92d..47b515e47be 100644 +--- a/arch/powerpc/cpu/mpc8260/pci.c ++++ b/arch/powerpc/cpu/mpc8260/pci.c +@@ -18,7 +18,7 @@ + #include + #include + #ifdef CONFIG_OF_LIBFDT +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc83xx/cpu.c b/arch/powerpc/cpu/mpc83xx/cpu.c +index 38093097e47..7f80b30bbda 100644 +--- a/arch/powerpc/cpu/mpc83xx/cpu.c ++++ b/arch/powerpc/cpu/mpc83xx/cpu.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/powerpc/cpu/mpc83xx/fdt.c b/arch/powerpc/cpu/mpc83xx/fdt.c +index f249a585edf..e5ae476a970 100644 +--- a/arch/powerpc/cpu/mpc83xx/fdt.c ++++ b/arch/powerpc/cpu/mpc83xx/fdt.c +@@ -8,7 +8,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/arch/powerpc/cpu/mpc83xx/pci.c b/arch/powerpc/cpu/mpc83xx/pci.c +index c7ea94cab56..d5a81bc3fec 100644 +--- a/arch/powerpc/cpu/mpc83xx/pci.c ++++ b/arch/powerpc/cpu/mpc83xx/pci.c +@@ -11,7 +11,7 @@ + #include + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c +index ced216c6806..eee70ef1abd 100644 +--- a/arch/powerpc/cpu/mpc85xx/fdt.c ++++ b/arch/powerpc/cpu/mpc85xx/fdt.c +@@ -8,7 +8,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/powerpc/cpu/mpc85xx/liodn.c b/arch/powerpc/cpu/mpc85xx/liodn.c +index 7a4465fefc5..f3f7c1d1a34 100644 +--- a/arch/powerpc/cpu/mpc85xx/liodn.c ++++ b/arch/powerpc/cpu/mpc85xx/liodn.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include +diff --git a/arch/powerpc/cpu/mpc85xx/portals.c b/arch/powerpc/cpu/mpc85xx/portals.c +index 3777c6faa16..dcd9e62c2b1 100644 +--- a/arch/powerpc/cpu/mpc85xx/portals.c ++++ b/arch/powerpc/cpu/mpc85xx/portals.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include +diff --git a/arch/powerpc/cpu/mpc86xx/fdt.c b/arch/powerpc/cpu/mpc86xx/fdt.c +index dd99155a28d..21f22868fed 100644 +--- a/arch/powerpc/cpu/mpc86xx/fdt.c ++++ b/arch/powerpc/cpu/mpc86xx/fdt.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/arch/powerpc/cpu/mpc8xx/cpu.c b/arch/powerpc/cpu/mpc8xx/cpu.c +index 105be9ccc7e..3e6c8984d95 100644 +--- a/arch/powerpc/cpu/mpc8xx/cpu.c ++++ b/arch/powerpc/cpu/mpc8xx/cpu.c +@@ -28,7 +28,7 @@ + #include + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/powerpc/cpu/mpc8xx/fdt.c b/arch/powerpc/cpu/mpc8xx/fdt.c +index 97830e3c8bd..b266176a9e5 100644 +--- a/arch/powerpc/cpu/mpc8xx/fdt.c ++++ b/arch/powerpc/cpu/mpc8xx/fdt.c +@@ -7,7 +7,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + DECLARE_GLOBAL_DATA_PTR; +diff --git a/arch/powerpc/cpu/mpc8xxx/fdt.c b/arch/powerpc/cpu/mpc8xxx/fdt.c +index 9cc1676b602..218557c16f8 100644 +--- a/arch/powerpc/cpu/mpc8xxx/fdt.c ++++ b/arch/powerpc/cpu/mpc8xxx/fdt.c +@@ -8,7 +8,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/arch/powerpc/cpu/ppc4xx/fdt.c b/arch/powerpc/cpu/ppc4xx/fdt.c +index c73509b3ee3..ed57a390e79 100644 +--- a/arch/powerpc/cpu/ppc4xx/fdt.c ++++ b/arch/powerpc/cpu/ppc4xx/fdt.c +@@ -12,7 +12,7 @@ + #include + + #ifdef CONFIG_OF_BOARD_SETUP +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c +index ef15e7ac92f..f7b6f823e8e 100644 +--- a/arch/powerpc/lib/bootm.c ++++ b/arch/powerpc/lib/bootm.c +@@ -20,7 +20,7 @@ + #include + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/arch/x86/cpu/intel_common/microcode.c b/arch/x86/cpu/intel_common/microcode.c +index daf0d69494a..e0221f8d3aa 100644 +--- a/arch/x86/cpu/intel_common/microcode.c ++++ b/arch/x86/cpu/intel_common/microcode.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/Arcturus/ucp1020/ucp1020.c b/board/Arcturus/ucp1020/ucp1020.c +index 0fc2bac55d6..9e71efd02c8 100644 +--- a/board/Arcturus/ucp1020/ucp1020.c ++++ b/board/Arcturus/ucp1020/ucp1020.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/a4m072/a4m072.c b/board/a4m072/a4m072.c +index 20d8b80f7ef..cefda4268de 100644 +--- a/board/a4m072/a4m072.c ++++ b/board/a4m072/a4m072.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/canyonlands/canyonlands.c b/board/amcc/canyonlands/canyonlands.c +index dc2e3ba3a08..5e29aef1727 100644 +--- a/board/amcc/canyonlands/canyonlands.c ++++ b/board/amcc/canyonlands/canyonlands.c +@@ -7,7 +7,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/katmai/katmai.c b/board/amcc/katmai/katmai.c +index 6ae340ba16c..5425fcd25ed 100644 +--- a/board/amcc/katmai/katmai.c ++++ b/board/amcc/katmai/katmai.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/kilauea/kilauea.c b/board/amcc/kilauea/kilauea.c +index abfaa1eee09..5b4278b6970 100644 +--- a/board/amcc/kilauea/kilauea.c ++++ b/board/amcc/kilauea/kilauea.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/makalu/makalu.c b/board/amcc/makalu/makalu.c +index a6ad2a1ba60..0cc1cfd233e 100644 +--- a/board/amcc/makalu/makalu.c ++++ b/board/amcc/makalu/makalu.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/sequoia/sequoia.c b/board/amcc/sequoia/sequoia.c +index 91c6cbf7aa8..edc9666d9b4 100644 +--- a/board/amcc/sequoia/sequoia.c ++++ b/board/amcc/sequoia/sequoia.c +@@ -11,7 +11,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/amcc/yosemite/yosemite.c b/board/amcc/yosemite/yosemite.c +index 56b5191d666..d9ebce353e2 100644 +--- a/board/amcc/yosemite/yosemite.c ++++ b/board/amcc/yosemite/yosemite.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + DECLARE_GLOBAL_DATA_PTR; +diff --git a/board/cm5200/cm5200.c b/board/cm5200/cm5200.c +index fce998d00fc..3c30cef43c3 100644 +--- a/board/cm5200/cm5200.c ++++ b/board/cm5200/cm5200.c +@@ -27,7 +27,7 @@ + #include + + #ifdef CONFIG_OF_LIBFDT +-#include ++#include "libfdt_legacy.h" + #include + #endif /* CONFIG_OF_LIBFDT */ + +diff --git a/board/congatec/cgtqmx6eval/cgtqmx6eval.c b/board/congatec/cgtqmx6eval/cgtqmx6eval.c +index 225de7c543f..2d61becd3bf 100644 +--- a/board/congatec/cgtqmx6eval/cgtqmx6eval.c ++++ b/board/congatec/cgtqmx6eval/cgtqmx6eval.c +@@ -772,7 +772,7 @@ int board_late_init(void) + #ifdef CONFIG_SPL_BUILD + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/esd/cpci405/cpci405.c b/board/esd/cpci405/cpci405.c +index c510ab13aca..aba1012afd3 100644 +--- a/board/esd/cpci405/cpci405.c ++++ b/board/esd/cpci405/cpci405.c +@@ -6,7 +6,7 @@ + */ + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/esd/pmc405de/pmc405de.c b/board/esd/pmc405de/pmc405de.c +index 31ac72861f1..05a0ecf769d 100644 +--- a/board/esd/pmc405de/pmc405de.c ++++ b/board/esd/pmc405de/pmc405de.c +@@ -7,7 +7,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/esd/pmc440/pmc440.c b/board/esd/pmc440/pmc440.c +index 0d43505e358..ae395158bfc 100644 +--- a/board/esd/pmc440/pmc440.c ++++ b/board/esd/pmc440/pmc440.c +@@ -14,7 +14,7 @@ + */ + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/esd/vme8349/vme8349.c b/board/esd/vme8349/vme8349.c +index f8f1834b59c..6f6571aa9f1 100644 +--- a/board/esd/vme8349/vme8349.c ++++ b/board/esd/vme8349/vme8349.c +@@ -17,7 +17,7 @@ + #include + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + #include + #include +diff --git a/board/freescale/b4860qds/pci.c b/board/freescale/b4860qds/pci.c +index d9ccac7a6ab..cbdcd9f8ab0 100644 +--- a/board/freescale/b4860qds/pci.c ++++ b/board/freescale/b4860qds/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/bsc9131rdb/bsc9131rdb.c b/board/freescale/bsc9131rdb/bsc9131rdb.c +index 75e114217b6..82b15720098 100644 +--- a/board/freescale/bsc9131rdb/bsc9131rdb.c ++++ b/board/freescale/bsc9131rdb/bsc9131rdb.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/bsc9132qds/bsc9132qds.c b/board/freescale/bsc9132qds/bsc9132qds.c +index 71a7bb55c48..84b0969611a 100644 +--- a/board/freescale/bsc9132qds/bsc9132qds.c ++++ b/board/freescale/bsc9132qds/bsc9132qds.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/c29xpcie/c29xpcie.c b/board/freescale/c29xpcie/c29xpcie.c +index 45f463f01f3..6d385b04f76 100644 +--- a/board/freescale/c29xpcie/c29xpcie.c ++++ b/board/freescale/c29xpcie/c29xpcie.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/common/cds_pci_ft.c b/board/freescale/common/cds_pci_ft.c +index 571dfbbaada..efa1297fe74 100644 +--- a/board/freescale/common/cds_pci_ft.c ++++ b/board/freescale/common/cds_pci_ft.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include "cadmus.h" + +diff --git a/board/freescale/common/fman.c b/board/freescale/common/fman.c +index b5025ab14e8..0140a4fab3f 100644 +--- a/board/freescale/common/fman.c ++++ b/board/freescale/common/fman.c +@@ -5,8 +5,8 @@ + */ + + #include +-#include +-#include ++#include "libfdt_env_legacy.h" ++#include "libfdt_env_legacy.h" + #include + + #include +diff --git a/board/freescale/common/p_corenet/pci.c b/board/freescale/common/p_corenet/pci.c +index 9f4f808376b..d64e9891b9d 100644 +--- a/board/freescale/common/p_corenet/pci.c ++++ b/board/freescale/common/p_corenet/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/common/sgmii_riser.c b/board/freescale/common/sgmii_riser.c +index 5c3c59375cb..aad69a226fb 100644 +--- a/board/freescale/common/sgmii_riser.c ++++ b/board/freescale/common/sgmii_riser.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/ls1043aqds/eth.c b/board/freescale/ls1043aqds/eth.c +index bf263761f1d..ed3c3d66e59 100644 +--- a/board/freescale/ls1043aqds/eth.c ++++ b/board/freescale/ls1043aqds/eth.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/ls2080a/ls2080a.c b/board/freescale/ls2080a/ls2080a.c +index 00337d7091c..4c59656454d 100644 +--- a/board/freescale/ls2080a/ls2080a.c ++++ b/board/freescale/ls2080a/ls2080a.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/ls2080aqds/ls2080aqds.c b/board/freescale/ls2080aqds/ls2080aqds.c +index 7d95debcaaf..145a3584994 100644 +--- a/board/freescale/ls2080aqds/ls2080aqds.c ++++ b/board/freescale/ls2080aqds/ls2080aqds.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/ls2080ardb/ls2080ardb.c b/board/freescale/ls2080ardb/ls2080ardb.c +index a65cd4ab805..d2d2936bc70 100644 +--- a/board/freescale/ls2080ardb/ls2080ardb.c ++++ b/board/freescale/ls2080ardb/ls2080ardb.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8308rdb/mpc8308rdb.c b/board/freescale/mpc8308rdb/mpc8308rdb.c +index 93e1c50f393..c955f106161 100644 +--- a/board/freescale/mpc8308rdb/mpc8308rdb.c ++++ b/board/freescale/mpc8308rdb/mpc8308rdb.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8313erdb/mpc8313erdb.c b/board/freescale/mpc8313erdb/mpc8313erdb.c +index eac193e8177..5717de80a21 100644 +--- a/board/freescale/mpc8313erdb/mpc8313erdb.c ++++ b/board/freescale/mpc8313erdb/mpc8313erdb.c +@@ -8,7 +8,7 @@ + + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + #include + #include +diff --git a/board/freescale/mpc8315erdb/mpc8315erdb.c b/board/freescale/mpc8315erdb/mpc8315erdb.c +index ed611c56c3f..54ab16f35e4 100644 +--- a/board/freescale/mpc8315erdb/mpc8315erdb.c ++++ b/board/freescale/mpc8315erdb/mpc8315erdb.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8323erdb/mpc8323erdb.c b/board/freescale/mpc8323erdb/mpc8323erdb.c +index 0a0152ad9ea..d82249e7330 100644 +--- a/board/freescale/mpc8323erdb/mpc8323erdb.c ++++ b/board/freescale/mpc8323erdb/mpc8323erdb.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #if defined(CONFIG_PCI) + #include + #endif +diff --git a/board/freescale/mpc832xemds/mpc832xemds.c b/board/freescale/mpc832xemds/mpc832xemds.c +index adf425486e1..c235d02aca2 100644 +--- a/board/freescale/mpc832xemds/mpc832xemds.c ++++ b/board/freescale/mpc832xemds/mpc832xemds.c +@@ -17,7 +17,7 @@ + #endif + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + #if defined(CONFIG_PQ_MDS_PIB) + #include "../common/pq-mds-pib.h" +diff --git a/board/freescale/mpc8349emds/mpc8349emds.c b/board/freescale/mpc8349emds/mpc8349emds.c +index 02b5040ef4a..e2b2d21d29d 100644 +--- a/board/freescale/mpc8349emds/mpc8349emds.c ++++ b/board/freescale/mpc8349emds/mpc8349emds.c +@@ -19,7 +19,7 @@ + #endif + + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + + int fixed_sdram(void); +diff --git a/board/freescale/mpc8349itx/mpc8349itx.c b/board/freescale/mpc8349itx/mpc8349itx.c +index 22a1d99c884..f89b53cf3ee 100644 +--- a/board/freescale/mpc8349itx/mpc8349itx.c ++++ b/board/freescale/mpc8349itx/mpc8349itx.c +@@ -17,7 +17,7 @@ + #include + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + + #ifndef CONFIG_SPD_EEPROM +diff --git a/board/freescale/mpc837xemds/mpc837xemds.c b/board/freescale/mpc837xemds/mpc837xemds.c +index 572913c7ac5..5a558d44ce0 100644 +--- a/board/freescale/mpc837xemds/mpc837xemds.c ++++ b/board/freescale/mpc837xemds/mpc837xemds.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8536ds/mpc8536ds.c b/board/freescale/mpc8536ds/mpc8536ds.c +index 7b0f4619714..f18e6542da0 100644 +--- a/board/freescale/mpc8536ds/mpc8536ds.c ++++ b/board/freescale/mpc8536ds/mpc8536ds.c +@@ -17,7 +17,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8540ads/mpc8540ads.c b/board/freescale/mpc8540ads/mpc8540ads.c +index 1069e2c8c86..4584807752f 100644 +--- a/board/freescale/mpc8540ads/mpc8540ads.c ++++ b/board/freescale/mpc8540ads/mpc8540ads.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +diff --git a/board/freescale/mpc8541cds/mpc8541cds.c b/board/freescale/mpc8541cds/mpc8541cds.c +index 7b264dddd15..974828c11fb 100644 +--- a/board/freescale/mpc8541cds/mpc8541cds.c ++++ b/board/freescale/mpc8541cds/mpc8541cds.c +@@ -14,7 +14,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "../common/cadmus.h" +diff --git a/board/freescale/mpc8544ds/mpc8544ds.c b/board/freescale/mpc8544ds/mpc8544ds.c +index 66fb228a908..2d9d0fab557 100644 +--- a/board/freescale/mpc8544ds/mpc8544ds.c ++++ b/board/freescale/mpc8544ds/mpc8544ds.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8548cds/mpc8548cds.c b/board/freescale/mpc8548cds/mpc8548cds.c +index de76d36174a..0f460c0fc29 100644 +--- a/board/freescale/mpc8548cds/mpc8548cds.c ++++ b/board/freescale/mpc8548cds/mpc8548cds.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8555cds/mpc8555cds.c b/board/freescale/mpc8555cds/mpc8555cds.c +index de5f5669e62..16b175b4a21 100644 +--- a/board/freescale/mpc8555cds/mpc8555cds.c ++++ b/board/freescale/mpc8555cds/mpc8555cds.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "../common/cadmus.h" +diff --git a/board/freescale/mpc8560ads/mpc8560ads.c b/board/freescale/mpc8560ads/mpc8560ads.c +index f99d639b2fb..fd86c3709d0 100644 +--- a/board/freescale/mpc8560ads/mpc8560ads.c ++++ b/board/freescale/mpc8560ads/mpc8560ads.c +@@ -18,7 +18,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/mpc8568mds/mpc8568mds.c b/board/freescale/mpc8568mds/mpc8568mds.c +index a5c5d9dd1ac..115e07a959c 100644 +--- a/board/freescale/mpc8568mds/mpc8568mds.c ++++ b/board/freescale/mpc8568mds/mpc8568mds.c +@@ -17,7 +17,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "bcsr.h" +diff --git a/board/freescale/mpc8569mds/mpc8569mds.c b/board/freescale/mpc8569mds/mpc8569mds.c +index 122490c026e..ec7434f4989 100644 +--- a/board/freescale/mpc8569mds/mpc8569mds.c ++++ b/board/freescale/mpc8569mds/mpc8569mds.c +@@ -21,7 +21,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8572ds/mpc8572ds.c b/board/freescale/mpc8572ds/mpc8572ds.c +index ed6836a9302..dc4f84480af 100644 +--- a/board/freescale/mpc8572ds/mpc8572ds.c ++++ b/board/freescale/mpc8572ds/mpc8572ds.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8610hpcd/mpc8610hpcd.c b/board/freescale/mpc8610hpcd/mpc8610hpcd.c +index 95e398c9f49..2ba0aa4ea0a 100644 +--- a/board/freescale/mpc8610hpcd/mpc8610hpcd.c ++++ b/board/freescale/mpc8610hpcd/mpc8610hpcd.c +@@ -14,7 +14,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/mpc8641hpcn/mpc8641hpcn.c b/board/freescale/mpc8641hpcn/mpc8641hpcn.c +index 94633b5c99d..b1245e5f6e5 100644 +--- a/board/freescale/mpc8641hpcn/mpc8641hpcn.c ++++ b/board/freescale/mpc8641hpcn/mpc8641hpcn.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c +index 0cf68097f4f..ed3c838709d 100644 +--- a/board/freescale/mx6sabresd/mx6sabresd.c ++++ b/board/freescale/mx6sabresd/mx6sabresd.c +@@ -680,7 +680,7 @@ int checkboard(void) + + #ifdef CONFIG_SPL_BUILD + #include +-#include ++#include "libfdt_legacy.h" + + const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = { + .dram_sdclk_0 = 0x00020030, +diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c +index 256d6029b4e..0a5346a94af 100644 +--- a/board/freescale/mx6slevk/mx6slevk.c ++++ b/board/freescale/mx6slevk/mx6slevk.c +@@ -409,7 +409,7 @@ int checkboard(void) + + #ifdef CONFIG_SPL_BUILD + #include +-#include ++#include "libfdt_legacy.h" + + const struct mx6sl_iomux_ddr_regs mx6_ddr_ioregs = { + .dram_sdqs0 = 0x00003030, +diff --git a/board/freescale/mx6sxsabresd/mx6sxsabresd.c b/board/freescale/mx6sxsabresd/mx6sxsabresd.c +index 25e009ee9bc..9a583a297d8 100644 +--- a/board/freescale/mx6sxsabresd/mx6sxsabresd.c ++++ b/board/freescale/mx6sxsabresd/mx6sxsabresd.c +@@ -548,7 +548,7 @@ int checkboard(void) + } + + #ifdef CONFIG_SPL_BUILD +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +index 92c92117cd9..2d162709215 100644 +--- a/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c ++++ b/board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +@@ -703,7 +703,7 @@ int checkboard(void) + } + + #ifdef CONFIG_SPL_BUILD +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/p1010rdb/p1010rdb.c b/board/freescale/p1010rdb/p1010rdb.c +index 1ae15407db4..7e90112d05a 100644 +--- a/board/freescale/p1010rdb/p1010rdb.c ++++ b/board/freescale/p1010rdb/p1010rdb.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/p1022ds/p1022ds.c b/board/freescale/p1022ds/p1022ds.c +index d7dd478dff9..45358c73e73 100644 +--- a/board/freescale/p1022ds/p1022ds.c ++++ b/board/freescale/p1022ds/p1022ds.c +@@ -17,7 +17,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/p1023rdb/p1023rdb.c b/board/freescale/p1023rdb/p1023rdb.c +index 074b71326f0..caad4e2247b 100644 +--- a/board/freescale/p1023rdb/p1023rdb.c ++++ b/board/freescale/p1023rdb/p1023rdb.c +@@ -18,7 +18,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c b/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +index 61b7a91333f..8ffb9f30492 100644 +--- a/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c ++++ b/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/p1_twr/p1_twr.c b/board/freescale/p1_twr/p1_twr.c +index a40bea328b0..aae9f67b246 100644 +--- a/board/freescale/p1_twr/p1_twr.c ++++ b/board/freescale/p1_twr/p1_twr.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/qemu-ppce500/qemu-ppce500.c b/board/freescale/qemu-ppce500/qemu-ppce500.c +index 6cb5692eda6..27793f12799 100644 +--- a/board/freescale/qemu-ppce500/qemu-ppce500.c ++++ b/board/freescale/qemu-ppce500/qemu-ppce500.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/freescale/t102xqds/pci.c b/board/freescale/t102xqds/pci.c +index 73692896185..3caef603a2e 100644 +--- a/board/freescale/t102xqds/pci.c ++++ b/board/freescale/t102xqds/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t102xrdb/pci.c b/board/freescale/t102xrdb/pci.c +index ba7041af957..dc24eb78ac6 100644 +--- a/board/freescale/t102xrdb/pci.c ++++ b/board/freescale/t102xrdb/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t1040qds/pci.c b/board/freescale/t1040qds/pci.c +index c53e3b76a45..1e43040cc3d 100644 +--- a/board/freescale/t1040qds/pci.c ++++ b/board/freescale/t1040qds/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t104xrdb/pci.c b/board/freescale/t104xrdb/pci.c +index c53e3b76a45..1e43040cc3d 100644 +--- a/board/freescale/t104xrdb/pci.c ++++ b/board/freescale/t104xrdb/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t208xqds/pci.c b/board/freescale/t208xqds/pci.c +index 84a89dad4f2..98d9fbf8671 100644 +--- a/board/freescale/t208xqds/pci.c ++++ b/board/freescale/t208xqds/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t208xrdb/pci.c b/board/freescale/t208xrdb/pci.c +index ba7041af957..dc24eb78ac6 100644 +--- a/board/freescale/t208xrdb/pci.c ++++ b/board/freescale/t208xrdb/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t4qds/pci.c b/board/freescale/t4qds/pci.c +index 08d74b444ad..f1981ae79ff 100644 +--- a/board/freescale/t4qds/pci.c ++++ b/board/freescale/t4qds/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/freescale/t4rdb/pci.c b/board/freescale/t4rdb/pci.c +index 6387a20caec..db956e041c2 100644 +--- a/board/freescale/t4rdb/pci.c ++++ b/board/freescale/t4rdb/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/gdsys/405ex/io64.c b/board/gdsys/405ex/io64.c +index 3a075c471f8..f129dc48a76 100644 +--- a/board/gdsys/405ex/io64.c ++++ b/board/gdsys/405ex/io64.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/gdsys/intip/intip.c b/board/gdsys/intip/intip.c +index 2d7d789b23b..4f74846e9ea 100644 +--- a/board/gdsys/intip/intip.c ++++ b/board/gdsys/intip/intip.c +@@ -11,7 +11,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/gdsys/mpc8308/hrcon.c b/board/gdsys/mpc8308/hrcon.c +index 880b6387de2..7b7b2164ab0 100644 +--- a/board/gdsys/mpc8308/hrcon.c ++++ b/board/gdsys/mpc8308/hrcon.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/gdsys/mpc8308/strider.c b/board/gdsys/mpc8308/strider.c +index 121977d315f..99163b80987 100644 +--- a/board/gdsys/mpc8308/strider.c ++++ b/board/gdsys/mpc8308/strider.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/gdsys/p1022/controlcenterd.c b/board/gdsys/p1022/controlcenterd.c +index 2f98e4757f9..de38d198284 100644 +--- a/board/gdsys/p1022/controlcenterd.c ++++ b/board/gdsys/p1022/controlcenterd.c +@@ -32,7 +32,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/ids/ids8313/ids8313.c b/board/ids/ids8313/ids8313.c +index e7838dcd2a6..3d823b49dd0 100644 +--- a/board/ids/ids8313/ids8313.c ++++ b/board/ids/ids8313/ids8313.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + DECLARE_GLOBAL_DATA_PTR; + /** CPLD contains the info about: +diff --git a/board/ifm/o2dnt2/o2dnt2.c b/board/ifm/o2dnt2/o2dnt2.c +index 4fc6809ad61..f0ca2301a67 100644 +--- a/board/ifm/o2dnt2/o2dnt2.c ++++ b/board/ifm/o2dnt2/o2dnt2.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/intercontrol/digsy_mtc/digsy_mtc.c b/board/intercontrol/digsy_mtc/digsy_mtc.c +index 2e52d51b6b1..f1a9cacdca1 100644 +--- a/board/intercontrol/digsy_mtc/digsy_mtc.c ++++ b/board/intercontrol/digsy_mtc/digsy_mtc.c +@@ -30,7 +30,7 @@ + #else + #include "is42s16800a-7t.h" + #endif +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/ipek01/ipek01.c b/board/ipek01/ipek01.c +index 2e62355c483..29e85414c35 100644 +--- a/board/ipek01/ipek01.c ++++ b/board/ipek01/ipek01.c +@@ -19,7 +19,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/jupiter/jupiter.c b/board/jupiter/jupiter.c +index d56902bcd23..ec1abf2cdc4 100644 +--- a/board/jupiter/jupiter.c ++++ b/board/jupiter/jupiter.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + #define SDRAM_DDR 0 + #if 1 +diff --git a/board/keymile/km82xx/km82xx.c b/board/keymile/km82xx/km82xx.c +index c2a7a5f9957..4454be803f5 100644 +--- a/board/keymile/km82xx/km82xx.c ++++ b/board/keymile/km82xx/km82xx.c +@@ -11,7 +11,7 @@ + #include + #include + +-#include ++#include "libfdt_legacy.h" + #include + #include "../common/common.h" + +diff --git a/board/keymile/km83xx/km83xx.c b/board/keymile/km83xx/km83xx.c +index 154f97457b4..63e9030649e 100644 +--- a/board/keymile/km83xx/km83xx.c ++++ b/board/keymile/km83xx/km83xx.c +@@ -23,7 +23,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "../common/common.h" +diff --git a/board/keymile/kmp204x/pci.c b/board/keymile/kmp204x/pci.c +index 2b0b054a11c..0bfcfb44e16 100644 +--- a/board/keymile/kmp204x/pci.c ++++ b/board/keymile/kmp204x/pci.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/mosaixtech/icon/icon.c b/board/mosaixtech/icon/icon.c +index e3fb1e63fe3..0064beaccb0 100644 +--- a/board/mosaixtech/icon/icon.c ++++ b/board/mosaixtech/icon/icon.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/motionpro/motionpro.c b/board/motionpro/motionpro.c +index dc237c1ceda..91d17f093f7 100644 +--- a/board/motionpro/motionpro.c ++++ b/board/motionpro/motionpro.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + #if defined(CONFIG_STATUS_LED) + #include +diff --git a/board/mpc8308_p1m/mpc8308_p1m.c b/board/mpc8308_p1m/mpc8308_p1m.c +index 688cc12a6c9..1dd0b1de42c 100644 +--- a/board/mpc8308_p1m/mpc8308_p1m.c ++++ b/board/mpc8308_p1m/mpc8308_p1m.c +@@ -7,7 +7,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/sbc8349/sbc8349.c b/board/sbc8349/sbc8349.c +index 72786d2ace6..047deb69a09 100644 +--- a/board/sbc8349/sbc8349.c ++++ b/board/sbc8349/sbc8349.c +@@ -16,7 +16,7 @@ + #include + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + + int fixed_sdram(void); +diff --git a/board/sbc8548/sbc8548.c b/board/sbc8548/sbc8548.c +index 25329e44736..b6b86140850 100644 +--- a/board/sbc8548/sbc8548.c ++++ b/board/sbc8548/sbc8548.c +@@ -21,7 +21,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + DECLARE_GLOBAL_DATA_PTR; +diff --git a/board/sbc8641d/sbc8641d.c b/board/sbc8641d/sbc8641d.c +index 6bdf1a28e97..01f595187dd 100644 +--- a/board/sbc8641d/sbc8641d.c ++++ b/board/sbc8641d/sbc8641d.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + long int fixed_sdram (void); +diff --git a/board/socrates/socrates.c b/board/socrates/socrates.c +index 8b34a80e8f7..255d240fb2c 100644 +--- a/board/socrates/socrates.c ++++ b/board/socrates/socrates.c +@@ -17,7 +17,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/t3corp/t3corp.c b/board/t3corp/t3corp.c +index 586c6f9a62b..eab58e7bfbd 100644 +--- a/board/t3corp/t3corp.c ++++ b/board/t3corp/t3corp.c +@@ -7,7 +7,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/tqc/tqm5200/tqm5200.c b/board/tqc/tqm5200/tqm5200.c +index 8b82c348a70..4d3b6651e45 100644 +--- a/board/tqc/tqm5200/tqm5200.c ++++ b/board/tqc/tqm5200/tqm5200.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #ifdef CONFIG_VIDEO_SM501 +diff --git a/board/tqc/tqm8xx/tqm8xx.c b/board/tqc/tqm8xx/tqm8xx.c +index 6d17830575f..ad119038f16 100644 +--- a/board/tqc/tqm8xx/tqm8xx.c ++++ b/board/tqc/tqm8xx/tqm8xx.c +@@ -13,7 +13,7 @@ + #endif + + #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #endif + + extern flash_info_t flash_info[]; /* FLASH chips info */ +diff --git a/board/tqc/tqma6/tqma6.c b/board/tqc/tqma6/tqma6.c +index 7fc57da1324..479a0e89c76 100644 +--- a/board/tqc/tqma6/tqma6.c ++++ b/board/tqc/tqma6/tqma6.c +@@ -20,7 +20,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/tqc/tqma6/tqma6_mba6.c b/board/tqc/tqma6/tqma6_mba6.c +index e58b71402b5..f8793aed91a 100644 +--- a/board/tqc/tqma6/tqma6_mba6.c ++++ b/board/tqc/tqma6/tqma6_mba6.c +@@ -20,7 +20,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/tqc/tqma6/tqma6_wru4.c b/board/tqc/tqma6/tqma6_wru4.c +index c9a7ab7ea92..b7c11b8356a 100644 +--- a/board/tqc/tqma6/tqma6_wru4.c ++++ b/board/tqc/tqma6/tqma6_wru4.c +@@ -23,7 +23,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/varisys/cyrus/pci.c b/board/varisys/cyrus/pci.c +index 4780e8c147a..5cbd675f0a5 100644 +--- a/board/varisys/cyrus/pci.c ++++ b/board/varisys/cyrus/pci.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/ve8313/ve8313.c b/board/ve8313/ve8313.c +index 7f24a30688a..a86fc45f024 100644 +--- a/board/ve8313/ve8313.c ++++ b/board/ve8313/ve8313.c +@@ -10,7 +10,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/vscom/baltos/board.c b/board/vscom/baltos/board.c +index 27056e195a9..1ab7821b277 100644 +--- a/board/vscom/baltos/board.c ++++ b/board/vscom/baltos/board.c +@@ -10,7 +10,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/board/xes/common/fsl_8xxx_pci.c b/board/xes/common/fsl_8xxx_pci.c +index 510f638ffea..dfd98202c9d 100644 +--- a/board/xes/common/fsl_8xxx_pci.c ++++ b/board/xes/common/fsl_8xxx_pci.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + +diff --git a/board/xes/xpedite520x/xpedite520x.c b/board/xes/xpedite520x/xpedite520x.c +index 6a3df52391e..9fc5be2229c 100644 +--- a/board/xes/xpedite520x/xpedite520x.c ++++ b/board/xes/xpedite520x/xpedite520x.c +@@ -14,7 +14,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/xes/xpedite537x/xpedite537x.c b/board/xes/xpedite537x/xpedite537x.c +index 41419feb178..56145709436 100644 +--- a/board/xes/xpedite537x/xpedite537x.c ++++ b/board/xes/xpedite537x/xpedite537x.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/board/xes/xpedite550x/xpedite550x.c b/board/xes/xpedite550x/xpedite550x.c +index 1f05150d0ff..1152f07fa39 100644 +--- a/board/xes/xpedite550x/xpedite550x.c ++++ b/board/xes/xpedite550x/xpedite550x.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/cmd/bootefi.c b/cmd/bootefi.c +index 011f62c5b1c..6d178206bc2 100644 +--- a/cmd/bootefi.c ++++ b/cmd/bootefi.c +@@ -10,8 +10,8 @@ + #include + #include + #include +-#include +-#include ++#include "libfdt_env_legacy.h" ++#include "libfdt_env_legacy.h" + #include + #include + +diff --git a/cmd/fdt.c b/cmd/fdt.c +index 898217ffe5f..f0afdfb7b14 100644 +--- a/cmd/fdt.c ++++ b/cmd/fdt.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/common/board_info.c b/common/board_info.c +index bd5dcfa0663..bb748ff77f4 100644 +--- a/common/board_info.c ++++ b/common/board_info.c +@@ -3,7 +3,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + int __weak checkboard(void) +diff --git a/common/bootm_os.c b/common/bootm_os.c +index 9ec84bd0dbe..cf125a7c7f0 100644 +--- a/common/bootm_os.c ++++ b/common/bootm_os.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/common/bootstage.c b/common/bootstage.c +index 35bce3d881a..a7fe57e81fc 100644 +--- a/common/bootstage.c ++++ b/common/bootstage.c +@@ -13,7 +13,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/common/fdt_support.c b/common/fdt_support.c +index 5d8eb12f107..d5f64baf832 100644 +--- a/common/fdt_support.c ++++ b/common/fdt_support.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/common/image-fdt.c b/common/image-fdt.c +index d6ee225d409..903a7182e16 100644 +--- a/common/image-fdt.c ++++ b/common/image-fdt.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/common/image.c b/common/image.c +index f964e93afcf..d5dbb2ff009 100644 +--- a/common/image.c ++++ b/common/image.c +@@ -30,7 +30,7 @@ + #include + + #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/common/lcd_simplefb.c b/common/lcd_simplefb.c +index 2ba00f6d34c..297e0799ea6 100644 +--- a/common/lcd_simplefb.c ++++ b/common/lcd_simplefb.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + DECLARE_GLOBAL_DATA_PTR; + +diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c +index 73d33f54fc1..767a0372e7e 100644 +--- a/common/spl/spl_fat.c ++++ b/common/spl/spl_fat.c +@@ -15,7 +15,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + static int fat_registered; + +diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c +index 987470896c4..6b8d3ce3d6f 100644 +--- a/common/spl/spl_fit.c ++++ b/common/spl/spl_fit.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + static ulong fdt_getprop_u32(const void *fdt, int node, const char *prop) +diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c +index 0e35e0fd6b1..ecceb22d9d6 100644 +--- a/common/spl/spl_nand.c ++++ b/common/spl/spl_nand.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_env_legacy.h" + #include + + #if defined(CONFIG_SPL_NAND_RAW_ONLY) +diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c +index 5402301c783..cf1cec5e442 100644 +--- a/common/spl/spl_ymodem.c ++++ b/common/spl/spl_ymodem.c +@@ -14,7 +14,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + + #define BUF_SIZE 1024 + +diff --git a/configs/zynq_ant_defconfig b/configs/zynq_ant_defconfig +new file mode 100644 +index 00000000000..eeaf77721de +--- /dev/null ++++ b/configs/zynq_ant_defconfig +@@ -0,0 +1,61 @@ ++CONFIG_ARM=y ++CONFIG_SYS_CONFIG_NAME="zynq_zc70x" ++CONFIG_ARCH_ZYNQ=y ++CONFIG_SYS_MALLOC_F_LEN=0x800 ++CONFIG_DEFAULT_DEVICE_TREE="zynq-ant-sdr" ++CONFIG_SPL=y ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_FIT_SIGNATURE=y ++CONFIG_BOOTDELAY=0 ++CONFIG_SYS_NO_FLASH=y ++CONFIG_HUSH_PARSER=y ++CONFIG_SYS_PROMPT="ant> " ++# CONFIG_CMD_IMLS is not set ++# CONFIG_CMD_XIMG is not set ++# CONFIG_CMD_FLASH is not set ++CONFIG_CMD_SF=y ++CONFIG_CMD_SPI=y ++CONFIG_CMD_USB=y ++CONFIG_CMD_DFU=y ++CONFIG_CMD_GPIO=y ++# CONFIG_CMD_SETEXPR is not set ++# CONFIG_CMD_NET is not set ++# CONFIG_CMD_NFS is not set ++CONFIG_CMD_CACHE=y ++CONFIG_CMD_EXT2=y ++CONFIG_CMD_EXT4=y ++CONFIG_CMD_EXT4_WRITE=y ++CONFIG_CMD_FAT=y ++CONFIG_CMD_FS_GENERIC=y ++CONFIG_OF_EMBED=y ++CONFIG_SPL_DM_SEQ_ALIAS=y ++CONFIG_LED=y ++CONFIG_LED_GPIO=y ++CONFIG_SPI_FLASH=y ++CONFIG_SPI_FLASH_BAR=y ++CONFIG_SPI_FLASH_ISSI=y ++CONFIG_SPI_FLASH_MACRONIX=y ++CONFIG_SPI_FLASH_SPANSION=y ++CONFIG_SPI_FLASH_STMICRO=y ++CONFIG_SPI_FLASH_WINBOND=y ++CONFIG_ZYNQ_QSPI=y ++CONFIG_USB=y ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_ULPI_VIEWPORT=y ++CONFIG_USB_ULPI=y ++CONFIG_USB_STORAGE=y ++CONFIG_USB_GADGET=y ++CONFIG_CI_UDC=y ++CONFIG_USB_GADGET_VBUS_DRAW=500 ++CONFIG_USB_GADGET_DOWNLOAD=y ++CONFIG_G_DNL_MANUFACTURER="Analog Devices Inc." ++CONFIG_G_DNL_VENDOR_NUM=0x0456 ++CONFIG_G_DNL_PRODUCT_NUM=0xb674 ++CONFIG_REGEX=y ++CONFIG_LIB_RAND=y ++CONFIG_ZYNQ_SDHCI=y ++CONFIG_CMD_MMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_ZYNQ=y ++CONFIG_SD_BOOT=y +diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c +index 519832f1733..d0ad3a2cb23 100644 +--- a/drivers/core/regmap.c ++++ b/drivers/core/regmap.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/core/root.c b/drivers/core/root.c +index 95886add238..f593f653a81 100644 +--- a/drivers/core/root.c ++++ b/drivers/core/root.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/crypto/fsl/sec.c b/drivers/crypto/fsl/sec.c +index 0940faf768c..cb6205b9f96 100644 +--- a/drivers/crypto/fsl/sec.c ++++ b/drivers/crypto/fsl/sec.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #if CONFIG_SYS_FSL_SEC_COMPAT == 2 || CONFIG_SYS_FSL_SEC_COMPAT >= 4 + #include +diff --git a/drivers/mmc/exynos_dw_mmc.c b/drivers/mmc/exynos_dw_mmc.c +index 863bbb3f64b..eea6f73eaaa 100644 +--- a/drivers/mmc/exynos_dw_mmc.c ++++ b/drivers/mmc/exynos_dw_mmc.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c +index 44353c72f4d..445cbb1be49 100644 +--- a/drivers/mmc/s5p_sdhci.c ++++ b/drivers/mmc/s5p_sdhci.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c +index 6a0e9719b8a..7b6ec9e7cf1 100644 +--- a/drivers/mmc/socfpga_dw_mmc.c ++++ b/drivers/mmc/socfpga_dw_mmc.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c +index d405929b641..629051eb826 100644 +--- a/drivers/mmc/zynq_sdhci.c ++++ b/drivers/mmc/zynq_sdhci.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/net/fsl-mc/mc.c b/drivers/net/fsl-mc/mc.c +index 1811b0fe1a3..da319f8242e 100644 +--- a/drivers/net/fsl-mc/mc.c ++++ b/drivers/net/fsl-mc/mc.c +@@ -7,7 +7,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/pci/fsl_pci_init.c b/drivers/pci/fsl_pci_init.c +index 52792dcd597..429ff9f3d8e 100644 +--- a/drivers/pci/fsl_pci_init.c ++++ b/drivers/pci/fsl_pci_init.c +@@ -879,7 +879,7 @@ int fsl_pcie_init_board(int busno) + #endif + + #ifdef CONFIG_OF_BOARD_SETUP +-#include ++#include "libfdt_legacy.h" + #include + + void ft_fsl_pci_setup(void *blob, const char *pci_compat, +diff --git a/drivers/pci/pci-emul-uclass.c b/drivers/pci/pci-emul-uclass.c +index 0f8e3c9fcbd..94a86d5a858 100644 +--- a/drivers/pci/pci-emul-uclass.c ++++ b/drivers/pci/pci-emul-uclass.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/pci/pcie_layerscape.c b/drivers/pci/pcie_layerscape.c +index 2e6b986dbce..1e7859d1393 100644 +--- a/drivers/pci/pcie_layerscape.c ++++ b/drivers/pci/pcie_layerscape.c +@@ -769,7 +769,7 @@ void pci_init_board(void) + } + + #ifdef CONFIG_OF_BOARD_SETUP +-#include ++#include "libfdt_legacy.h" + #include + + static void ft_pcie_ls_setup(void *blob, const char *pci_compat, +diff --git a/drivers/pci/tsi108_pci.c b/drivers/pci/tsi108_pci.c +index d48e1e6fe65..aa8bd4735af 100644 +--- a/drivers/pci/tsi108_pci.c ++++ b/drivers/pci/tsi108_pci.c +@@ -16,7 +16,7 @@ + #include + #include + #if defined(CONFIG_OF_LIBFDT) +-#include ++#include "libfdt_legacy.h" + #include + #endif + +diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c +index fd04b264541..3509c13e157 100644 +--- a/drivers/pinctrl/pinctrl-uclass.c ++++ b/drivers/pinctrl/pinctrl-uclass.c +@@ -5,7 +5,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/power/pmic/act8846.c b/drivers/power/pmic/act8846.c +index ff096b3a9cc..4fea86639a9 100644 +--- a/drivers/power/pmic/act8846.c ++++ b/drivers/power/pmic/act8846.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/power/pmic/rk808.c b/drivers/power/pmic/rk808.c +index 770f471672e..14131726a2d 100644 +--- a/drivers/power/pmic/rk808.c ++++ b/drivers/power/pmic/rk808.c +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/qe/fdt.c b/drivers/qe/fdt.c +index 4f48f984ab5..0b98a5858e4 100644 +--- a/drivers/qe/fdt.c ++++ b/drivers/qe/fdt.c +@@ -8,7 +8,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/drivers/sound/sound-i2s.c b/drivers/sound/sound-i2s.c +index 749bbbd0318..f79c701c6aa 100644 +--- a/drivers/sound/sound-i2s.c ++++ b/drivers/sound/sound-i2s.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c +index 35c2dc18d95..6c35037d532 100644 +--- a/drivers/usb/common/common.c ++++ b/drivers/usb/common/common.c +@@ -8,7 +8,7 @@ + */ + + #include +-#include ++#include "libfdt_legacy.h" + #include + + DECLARE_GLOBAL_DATA_PTR; +diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c +index bede04b748a..fb921b485e8 100644 +--- a/drivers/usb/host/ehci-exynos.c ++++ b/drivers/usb/host/ehci-exynos.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c +index 6484c1c3344..ecb497b9547 100644 +--- a/drivers/usb/host/ehci-msm.c ++++ b/drivers/usb/host/ehci-msm.c +@@ -12,7 +12,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c +index 31d54ab285b..98c5d3ba600 100644 +--- a/drivers/usb/host/ehci-tegra.c ++++ b/drivers/usb/host/ehci-tegra.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + + #include "ehci.h" +diff --git a/drivers/usb/host/xhci-exynos5.c b/drivers/usb/host/xhci-exynos5.c +index 28416ed1064..b3ed0fc5ab0 100644 +--- a/drivers/usb/host/xhci-exynos5.c ++++ b/drivers/usb/host/xhci-exynos5.c +@@ -16,7 +16,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/video/exynos/exynos_dp.c b/drivers/video/exynos/exynos_dp.c +index fc39f2c5620..702774e9053 100644 +--- a/drivers/video/exynos/exynos_dp.c ++++ b/drivers/video/exynos/exynos_dp.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/video/exynos/exynos_dp_lowlevel.c b/drivers/video/exynos/exynos_dp_lowlevel.c +index f9784738bb9..48a0629880e 100644 +--- a/drivers/video/exynos/exynos_dp_lowlevel.c ++++ b/drivers/video/exynos/exynos_dp_lowlevel.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include "exynos_dp_lowlevel.h" + + /* Declare global data pointer */ +diff --git a/drivers/video/exynos/exynos_fb.c b/drivers/video/exynos/exynos_fb.c +index 97228cd3cc3..025130664a2 100644 +--- a/drivers/video/exynos/exynos_fb.c ++++ b/drivers/video/exynos/exynos_fb.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/drivers/video/exynos/exynos_mipi_dsi.c b/drivers/video/exynos/exynos_mipi_dsi.c +index a5d9b592186..81985916bbe 100644 +--- a/drivers/video/exynos/exynos_mipi_dsi.c ++++ b/drivers/video/exynos/exynos_mipi_dsi.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h +index fd50caf4502..3caaaecdba6 100644 +--- a/include/configs/zynq-common.h ++++ b/include/configs/zynq-common.h +@@ -280,13 +280,13 @@ + "setenv refclk_source internal; " \ + "saveenv; " \ + "fi; " \ +- "if test \"${refclk_source}\" = \"internal\" && test \"${model}\" = \"Analog Devices PlutoSDR Rev.C (Z7010/AD9363)\" ; then " \ +- "fdt rm /amba/gpio@e000a000/clock_extern_en || fdt rm /axi/gpio@e000a000/clock_extern_en; " \ ++ "if test \"${refclk_source}\" = \"internal\" && test \"${model}\" = \"Analog Devices ANTSDR Rev.C (Z7020/AD9363)\" ; then " \ ++ "fdt rm /amba/gpio@e000a000/clock_extern_en || fdt rm /amba/gpio@e000a000/clock_extern_en; " \ + "fi; " \ +- "if test \"${refclk_source}\" = \"external\" && test \"${model}\" = \"Analog Devices PlutoSDR Rev.C (Z7010/AD9363)\" ; then " \ +- "fdt rm /amba/gpio@e000a000/clock_internal_en || fdt rm /axi/gpio@e000a000/clock_internal_en; " \ ++ "if test \"${refclk_source}\" = \"external\" && test \"${model}\" = \"Analog Devices ANTSDR Rev.C (Z7020/AD9363)\" ; then " \ ++ "fdt rm /amba/gpio@e000a000/clock_internal_en || fdt rm /amba/gpio@e000a000/clock_internal_en; " \ + "fi; " \ +- "if test \"${attr_val}\" = \"ad9361\" && test ! \"${model}\" = \"Analog Devices PlutoSDR Rev.C (Z7010/AD9363)\" ; then " \ ++ "if test \"${attr_val}\" = \"ad9361\" && test ! \"${model}\" = \"Analog Devices ANTSDR Rev.C (Z7020/AD9363)\" ; then " \ + "setenv attr_val ad9363a; " \ + "saveenv; " \ + "fi; " \ +@@ -299,19 +299,19 @@ + "saveenv; " \ + "fi; " \ + "if test -n \"${attr_name}\" && test -n \"${attr_val}\"; then " \ +- "fdt set /amba/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val} || fdt set /axi/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val}; " \ ++ "fdt set /amba/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val} || fdt set /amba/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val}; " \ + "fi; " \ +- "if test \"${mode}\" = \"1r1t\" && test \"${model}\" = \"Analog Devices PlutoSDR Rev.C (Z7010/AD9363)\"; then " \ +- "fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable || fdt rm /axi/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; " \ ++ "if test \"${mode}\" = \"1r1t\" && test \"${model}\" = \"Analog Devices ANTSDR Rev.C (Z7020/AD9363)\"; then " \ ++ "fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable || fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; " \ + "fdt set /fpga-axi/cf-ad9361-dds-core-lpc@79024000 compatible adi,axi-ad9364-dds-6.00.a; " \ + "fi; " \ +- "if test -n \"${cs_gpio}\" && test \"${model}\" = \"Analog Devices PlutoSDR Rev.C (Z7010/AD9363)\"; then " \ ++ "if test -n \"${cs_gpio}\" && test \"${model}\" = \"Analog Devices ANTSDR Rev.C (Z7020/AD9363)\"; then " \ + "fdt set /amba/axi_quad_spi@7C430000/ cs-gpios \"<0x06 ${cs_gpio} 0>\" || fdt set /axi/axi_quad_spi@7C430000/ cs-gpios \"<0x06 ${cs_gpio} 0>\"; " \ + "fi; " \ + "if test -n \"${attr_val}\" && test \"${attr_val}\" = \"ad9364\"; then " \ + "fdt set /fpga-axi/cf-ad9361-dds-core-lpc@79024000 compatible adi,axi-ad9364-dds-6.00.a; " \ + "if test ! \"${mode}\" = \"1r1t\"; then " \ +- "fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable || fdt rm /axi/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; " \ ++ "fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable || fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; " \ + "setenv mode 1r1t; " \ + "saveenv; " \ + "fi; " \ +@@ -319,8 +319,7 @@ + "adi_loadvals=fdt addr ${fit_load_address} && fdt get value fdt_choosen /configurations/${fit_config}/ fdt && " \ + "fdt get addr fdtaddr /images/${fdt_choosen} data && fdt addr ${fdtaddr}; "\ + "fdt get value model / model; " \ +- "if test \"${model}\" \> \"Analog Devices Pluto\"; then " \ +- "run adi_loadvals_pluto; " \ ++ "run adi_loadvals_pluto; " \ + "fi; \0" \ + "qspiboot_extraenv=sf read ${extraenv_load_address} 0xFF000 0x1000 && " \ + "env import -c ${extraenv_load_address} 0x1000 || true \0" \ +@@ -362,6 +361,19 @@ + "echo Running uenvcmd ...; " \ + "run uenvcmd; " \ + "fi\0" \ ++ "loaddfu=if mmc rescan; then fatload mmc 0 0x1000 boot.dfu; sf probe;"\ ++ "sf update 0x1000 0x0 0x100000; fatload mmc 0 ${fit_load_address} ant.dfu;"\ ++ "sf update ${fit_load_address} 0x200000 0x1E00000;"\ ++ "fatload mmc 0 0x20000 uboot-env.dfu; sf update 0x20000 0x100000 0x20000;"\ ++ "bootm ${fit_load_address}#${fit_config};fi\0"\ ++ "sdboot=if mmcinfo; then " \ ++ "run uenvboot; " \ ++ "echo Copying Linux from SD to RAM... && " \ ++ "load mmc 0 ${fit_load_address} ${kernel_image} && " \ ++ "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \ ++ "load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \ ++ "bootm ${fit_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \ ++ "fi\0" \ + "usbboot=if usb start; then " \ + "run uenvboot; " \ + "echo Copying Linux from USB to RAM... && " \ +diff --git a/include/fdt_support.h b/include/fdt_support.h +index d34e959ca78..38eb200a854 100644 +--- a/include/fdt_support.h ++++ b/include/fdt_support.h +@@ -10,7 +10,7 @@ + + #ifdef CONFIG_OF_LIBFDT + +-#include ++#include "libfdt_legacy.h" + + u32 fdt_getprop_u32_default_node(const void *fdt, int off, int cell, + const char *prop, const u32 dflt); +diff --git a/include/fdtdec.h b/include/fdtdec.h +index 05d70c4b9b3..03ba42d7e08 100644 +--- a/include/fdtdec.h ++++ b/include/fdtdec.h +@@ -14,7 +14,7 @@ + * changes to support FDT are minimized. + */ + +-#include ++#include "libfdt_legacy.h" + #include + + /* +diff --git a/include/image.h b/include/image.h +index d788c260e30..dcef66351d3 100644 +--- a/include/image.h ++++ b/include/image.h +@@ -50,7 +50,7 @@ struct lmb; + + #if IMAGE_ENABLE_FIT + #include +-#include ++#include "libfdt_legacy.h" + #include + # ifdef CONFIG_SPL_BUILD + # ifdef CONFIG_SPL_CRC32_SUPPORT +diff --git a/include/libfdt_env.h b/include/libfdt_env_legacy.h +similarity index 100% +rename from include/libfdt_env.h +rename to include/libfdt_env_legacy.h +diff --git a/include/libfdt.h b/include/libfdt_legacy.h +similarity index 99% +rename from include/libfdt.h +rename to include/libfdt_legacy.h +index 74b1d149c2d..00a40157840 100644 +--- a/include/libfdt.h ++++ b/include/libfdt_legacy.h +@@ -51,7 +51,7 @@ + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-#include ++#include "libfdt_env_legacy.h" + #include + + #define FDT_FIRST_SUPPORTED_VERSION 0x10 +diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c +index be6f5e81124..d60e6a2fecf 100644 +--- a/lib/efi_loader/efi_boottime.c ++++ b/lib/efi_loader/efi_boottime.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_env_legacy.h" + #include + #include + #include +diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c +index df2381e42c2..622da83f78a 100644 +--- a/lib/efi_loader/efi_memory.c ++++ b/lib/efi_loader/efi_memory.c +@@ -10,7 +10,7 @@ + #include + #include + #include +-#include ++#include "libfdt_env_legacy.h" + #include + #include + #include +diff --git a/lib/fdtdec.c b/lib/fdtdec.c +index 0534c0b767d..3ffb201a961 100644 +--- a/lib/fdtdec.c ++++ b/lib/fdtdec.c +@@ -8,7 +8,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + #include +diff --git a/lib/fdtdec_common.c b/lib/fdtdec_common.c +index 63b704a3d71..dfc61266080 100644 +--- a/lib/fdtdec_common.c ++++ b/lib/fdtdec_common.c +@@ -10,10 +10,10 @@ + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #include + #else +-#include "libfdt.h" ++#include "libfdt_legacy.h" + #include "fdt_support.h" + + #define debug(...) +diff --git a/lib/fdtdec_test.c b/lib/fdtdec_test.c +index cc8b918f64d..11acd963de4 100644 +--- a/lib/fdtdec_test.c ++++ b/lib/fdtdec_test.c +@@ -8,7 +8,7 @@ + + #include + #include +-#include ++#include "libfdt_legacy.h" + #include + #include + +diff --git a/lib/libfdt/fdt.c b/lib/libfdt/fdt.c +index 96017a15a27..0c379b42857 100644 +--- a/lib/libfdt/fdt.c ++++ b/lib/libfdt/fdt.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_addresses.c b/lib/libfdt/fdt_addresses.c +index b6bc66ea323..520118ae5d0 100644 +--- a/lib/libfdt/fdt_addresses.c ++++ b/lib/libfdt/fdt_addresses.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2014 David Gibson + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_empty_tree.c b/lib/libfdt/fdt_empty_tree.c +index 6fde1eb9eda..50346080e57 100644 +--- a/lib/libfdt/fdt_empty_tree.c ++++ b/lib/libfdt/fdt_empty_tree.c +@@ -3,9 +3,9 @@ + * Copyright (C) 2012 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + #include +-#include ++#include "libfdt_legacy.h" + + #include "libfdt_internal.h" + +diff --git a/lib/libfdt/fdt_region.c b/lib/libfdt/fdt_region.c +index d2ce4c1c537..5a6126b6fc2 100644 +--- a/lib/libfdt/fdt_region.c ++++ b/lib/libfdt/fdt_region.c +@@ -5,11 +5,11 @@ + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ + +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c +index 12214c2dc2b..83e7f2d657d 100644 +--- a/lib/libfdt/fdt_ro.c ++++ b/lib/libfdt/fdt_ro.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_rw.c b/lib/libfdt/fdt_rw.c +index e7321ccae47..7dc5d2a73da 100644 +--- a/lib/libfdt/fdt_rw.c ++++ b/lib/libfdt/fdt_rw.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_strerror.c b/lib/libfdt/fdt_strerror.c +index 3b7e1683d0d..b9006e77043 100644 +--- a/lib/libfdt/fdt_strerror.c ++++ b/lib/libfdt/fdt_strerror.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/lib/libfdt/fdt_sw.c b/lib/libfdt/fdt_sw.c +index 70fd0265507..314567bf12a 100644 +--- a/lib/libfdt/fdt_sw.c ++++ b/lib/libfdt/fdt_sw.c +@@ -3,9 +3,9 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + #include +-#include ++#include "libfdt_legacy.h" + + #include "libfdt_internal.h" + +diff --git a/lib/libfdt/fdt_wip.c b/lib/libfdt/fdt_wip.c +index 9fe988655fe..144e41f227b 100644 +--- a/lib/libfdt/fdt_wip.c ++++ b/lib/libfdt/fdt_wip.c +@@ -3,11 +3,11 @@ + * Copyright (C) 2006 David Gibson, IBM Corporation. + * SPDX-License-Identifier: GPL-2.0+ BSD-2-Clause + */ +-#include ++#include "libfdt_env_legacy.h" + + #ifndef USE_HOSTCC + #include +-#include ++#include "libfdt_legacy.h" + #else + #include "fdt_host.h" + #endif +diff --git a/tools/Makefile b/tools/Makefile +index f72294a98a5..80a977c71a3 100644 +--- a/tools/Makefile ++++ b/tools/Makefile +@@ -221,7 +221,7 @@ LICENSE-$(CONFIG_CMD_LICENSE) += $(LICENSE_H) + # Define __KERNEL_STRICT_NAMES to prevent typedef overlaps + # Define _GNU_SOURCE to obtain the getline prototype from stdio.h + # +-HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \ ++HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env_legacy.h \ + $(patsubst -I%,-idirafter%, $(filter -I%, $(UBOOTINCLUDE))) \ + -I$(srctree)/lib/libfdt \ + -I$(srctree)/tools \ +diff --git a/tools/fdt_host.h b/tools/fdt_host.h +index 134d9657139..8807b3ee02e 100644 +--- a/tools/fdt_host.h ++++ b/tools/fdt_host.h +@@ -8,7 +8,7 @@ + #define __FDT_HOST_H__ + + /* Make sure to include u-boot version of libfdt include files */ +-#include "../include/libfdt.h" ++#include "../include/libfdt_legacy.h" + #include "../include/fdt_support.h" + + int fit_check_sign(const void *working_fdt, const void *key); +diff --git a/tools/fdtgrep.c b/tools/fdtgrep.c +index 8d3fef40279..7f1ae1e7e61 100644 +--- a/tools/fdtgrep.c ++++ b/tools/fdtgrep.c +@@ -16,7 +16,7 @@ + #include + #include + +-#include <../include/libfdt.h> ++#include <../include/libfdt_legacy.h> + #include + + /* Define DEBUG to get some debugging output on stderr */ +diff --git a/tools/ifdtool.c b/tools/ifdtool.c +index 48059c02b55..f25f2188947 100644 +--- a/tools/ifdtool.c ++++ b/tools/ifdtool.c +@@ -18,7 +18,7 @@ + #include + #include + #include +-#include ++#include "libfdt_legacy.h" + #include "ifdtool.h" + + #undef DEBUG +-- +2.54.0 + diff --git a/patch/ant-2026/0002-add-support-hdl.patch b/patch/ant-2026/0002-add-support-hdl.patch new file mode 100644 index 0000000..482c360 --- /dev/null +++ b/patch/ant-2026/0002-add-support-hdl.patch @@ -0,0 +1,25 @@ +From 9c1d2ac267bc37484b6f3489a4cd4f8642f9f533 Mon Sep 17 00:00:00 2001 +From: mrzhuzhe <466648706@qq.com> +Date: Wed, 15 Jul 2026 14:22:33 +0800 +Subject: [PATCH 2/2] add-support-hdl + +--- + scripts/adi_env.tcl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/adi_env.tcl b/scripts/adi_env.tcl +index 53eae54d1..fb5b6eb9a 100644 +--- a/scripts/adi_env.tcl ++++ b/scripts/adi_env.tcl +@@ -15,7 +15,7 @@ if [info exists ::env(ADI_GHDL_DIR)] { + } + + # Define the supported tool version +-set required_vivado_version "2023.2" ++set required_vivado_version "2025.2" + if {[info exists ::env(REQUIRED_VIVADO_VERSION)]} { + set required_vivado_version $::env(REQUIRED_VIVADO_VERSION) + } elseif {[info exists REQUIRED_VIVADO_VERSION]} { +-- +2.54.0 + diff --git a/patch/ant-2026/Readme.md b/patch/ant-2026/Readme.md new file mode 100644 index 0000000..2eada47 --- /dev/null +++ b/patch/ant-2026/Readme.md @@ -0,0 +1,95 @@ +# AntSDR 2026 + AntSDR patches for recently linux and vivado + +# Host Version + 1. GNU/Linux kernel 7.0.9 + 2. Vivado 2025.2 + 3. gcc version 16.1.1 + 4. cmake version 4.3.2 + +# Enviroment variable +``` +export VIVADO_SETTINGS=~/${your path to vivado}/vivado/2025.2/Vivado/settings64.sh + +# for buildroot issue +export LD_LIBRARY_PATH= +# for buildroot download packages +export http_proxy=http://${your proxy host}$:${your proxy port} +export https_proxy=http://${your proxy host}$:${your proxy port} +export ftp_proxy=http://${your proxy host}$:${your proxy port} +export no_proxy="localhost, 127.0.0.1" +``` + +# TroubleShooting + +## Error: libad9361-iio-0.3 and libini-a467418 use cmake_minimum_required 2.8 or 3.1 is depracate in cmake + +This error jump out due to my cmake version 4.3.2 depracate cmake version under 3.5 + +In `plutosdr-fw/buildroot/output/build/libad9361-iio-0.3` and libini-a467418 + +Mandatory update cmake_minimum_required to 3.5 after buildroot package is been download +``` +cmake_minimum_required(VERSION 3.5) +``` + +# Changes + +## 1. Buildroot cannot use LD_LIBRARY_PATH with empty ":" + +which is a common issue , you can just tempory leave LD_LIBRARY_PATH empty +``` +export LD_LIBRARY_PATH= +``` + +## 2. Nneed change vivado version +In plutosdr-fw/Makefile + +`VIVADO_VERSION ?= 2025.2` + +In `plutosdr-fw/hdl/scripts/adi_env.tcl` + +`set required_vivado_version "2025.2"` + +## 3. In u-boot-xlnx libfdt_env and libfdt.h conflict with /usr/include + +rename `include ` and `` to `include "libfdt_env_legacy.h"` and `"libfdt_legacy.h"` + +## 4. buildroot wget and curl need setup proxy + +Notice: don't forget to set +``` +export no_proxy="localhost, 127.0.0.1" +``` +Or you may be cannot connect to local vitis server + +## 5. m4-1.4.19 build need under gcc gnu17 + +already upgrade to `m4-1.4.21` + +Or you can mandatory change `GL_LIST_INLINE _GL_ATTRIBUTE_NODISCARD` to `_GL_ATTRIBUTE_NODISCARD GL_LIST_INLINE` in `m4-1.4.19` as a ad hoc + +## 6. XSCT cannot connect to vitis server and suggest migration to vitis -s +In pluto-fw/Makefile +``` + # we need use new vitis python api + # change + # bash -c "source $(VIVADO_SETTINGS) && xsct scripts/create_fsbl_project.tcl" + bash -c "source $(VIVADO_SETTINGS) && vitis -s scripts/create_fsbl_project.py" + + # python api output path is changed + # change + build/sdk/fsbl/Release/fsbl.elf + # to + build/sdk/fsbl/export/fsbl/sw/boot/fsbl.elf + +``` + +Reffer: + +(a) https://docs.amd.com/r/en-US/ug1400-vitis-embedded/XSCT-to-Python-API-Migration + +(b) https://github.com/Xilinx/Vitis-Tutorials/tree/2024.1/Embedded_Software/Feature_Tutorials/04-vitis_scripting_flows + + +