[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[patch] Add support for Kurobox Pro to Debian Installer



Hi!

The attached series of patches adds support for Kurobox Pro
to Debian Installer. Kurobox Pro uses Das U-Boot so
flash-kernel is used to create U-Boot images of kernel and
ramdisk during installation. The original firmware has files with
network and host information that can be used by
oldsys-preseed.

In short the installation on Kurobox Pro would be:
1) Build d-i
2) Format /dev/sda1 on Kurobox Pro with ext2
3) Put d-i images on /dev/sda1
4) Run flash-debian
5) Reboot
6) Install as normal
7) Reboot
8) Success

The adding of jffs2 to i386 is not related to Kurobox Pro
support, only done by request. [0]


Attached patches:

0000
  Adds support for Kurobox Pro to flash-kernel

0001
  Adds support for Kurobox Pro to oldsys-preseed, needs
  jffs2-modules to work (see 0003)

0002
  Adds tests for Kurobox Pro to oldsys-preseed.

0003
  Adds support for jffs2 modules to kernel-wedge, needed
  by oldsys-preseed on Kurobox Pro. Also requested to
  support OLPC XO.

0004
   Adds jffs2 modules to armel-orion5x, needed by
   oldsys-preseed on Kurobox Pro, and to i386,
   to support OLPC XO (requested). [0]

0005
   Adds build options and flash-debian script to d-i to
   support Kurobox Pro.

kuroboxpro_dhcp.tgz
kuroboxpro_static.tgz
   Archives of files used by Kurobox Pro tests in
   oldsys-preseed.


-- Per

[0] http://lists.debian.org/debian-boot/2008/07/msg00368.html
diff --git a/packages/flash-kernel/README b/packages/flash-kernel/README
index 6cf34d8..39f3dd5 100644
--- a/packages/flash-kernel/README
+++ b/packages/flash-kernel/README
@@ -22,6 +22,7 @@ Supported systems
 
 At the moment, the following systems are supported:
 
+ - Buffalo/Revogear Kurobox Pro
  - HP Media Vault mv2120
  - Linksys NSLU2
  - QNAP TS-109
diff --git a/packages/flash-kernel/debian/flash-kernel-installer.postinst b/packages/flash-kernel/debian/flash-kernel-installer.postinst
index ad5d0f6..0a2d7d6 100755
--- a/packages/flash-kernel/debian/flash-kernel-installer.postinst
+++ b/packages/flash-kernel/debian/flash-kernel-installer.postinst
@@ -22,7 +22,7 @@ findfs () {
 # Are we writing to flash or constructing an image on disk?
 write_to_flash() {
 	case "$machine" in
-		"HP Media Vault mv2120")
+		"Buffalo/Revogear Kurobox Pro" | "HP Media Vault mv2120")
 			return 1
 		;;
 		*)
@@ -51,6 +51,12 @@ if ! grep -q flash-kernel /target/etc/kernel-img.conf; then
 fi
 
 case "$machine" in
+	"Buffalo/Revogear Kurobox Pro")
+		in-target update-initramfs -u || true
+		if ! apt-install uboot-mkimage; then
+			error "apt-install uboot-mkimage failed"
+		fi
+	;;
 	"HP Media Vault mv2120")
 		in-target update-initramfs -u || true
 		if ! apt-install uboot-mkimage; then
diff --git a/packages/flash-kernel/flash-kernel b/packages/flash-kernel/flash-kernel
index 1614e0c..78b3b10 100755
--- a/packages/flash-kernel/flash-kernel
+++ b/packages/flash-kernel/flash-kernel
@@ -82,6 +82,7 @@ if [ -n "$1" ]; then
 	kfile=/boot/vmlinuz-$kvers
 	ifile=/boot/initrd.img-$kvers
 	desc="Debian kernel $1"
+	idesc="Debian ramdisk $1"
 else
 	if [ -e /vmlinuz ]; then
 		kfile=/vmlinuz
@@ -93,6 +94,7 @@ else
 		error "Cannot find a default kernel in /vmlinuz or /boot/vmlinuz"
 	fi
 	desc="Debian kernel"
+	idesc="Debian ramdisk"
 fi
 
 if [ ! -e $kfile ] || [ ! -e $ifile ]; then
@@ -109,6 +111,32 @@ subarch=$(echo "$kfile" | sed -e 's/.*-//')
 
 machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
 case "$machine" in
+	"Buffalo/Revogear Kurobox Pro")
+		check_subarch "orion5x"
+		printf "Generating kernel u-boot image... " >&2
+		tmp=$(tempfile)
+		# Set machine id 1509 (0x05e5)
+		devio > $tmp 'wl 0xe3a01c05,4' 'wl 0xe38110e5,4'
+		cat $kfile >> $tmp
+		mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "$desc" -d $tmp $tmp.uboot >&2 1>/dev/null
+		echo "done." >&2
+		if [ -e /boot/uImage.buffalo ]; then
+			echo "Creating backup of /boot/uImage.buffalo." >&2
+			mv /boot/uImage.buffalo /boot/uImage.buffalo.bak
+		fi
+		echo "Creating new /boot/uImage.buffalo." >&2
+		mv $tmp.uboot /boot/uImage.buffalo
+		rm -f $tmp
+		printf "Generating initrd u-boot image... " >&2
+		mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00008000 -e 0x00008000 -n "$idesc" -d $ifile initrd.uboot >&2 1>/dev/null
+		echo "done." >&2
+		if [ -e /boot/initrd.buffalo ]; then
+			echo "Creating backup of /boot/initrd.buffalo." >&2
+			mv /boot/initrd.buffalo /boot/initrd.buffalo.bak
+		fi
+		echo "Creating new /boot/initrd.buffalo." >&2
+		mv initrd.uboot /boot/initrd.buffalo
+	;;
 	"HP Media Vault mv2120")
 		check_subarch "orion5x"
 		tmp=$(tempfile)
diff --git a/packages/flash-kernel/initramfs-tools/hooks/flash_kernel_set_root b/packages/flash-kernel/initramfs-tools/hooks/flash_kernel_set_root
index c2e5e0a..f37a6af 100755
--- a/packages/flash-kernel/initramfs-tools/hooks/flash_kernel_set_root
+++ b/packages/flash-kernel/initramfs-tools/hooks/flash_kernel_set_root
@@ -31,7 +31,7 @@ esac
 # Only run on some machines
 machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
 case "$machine" in
-	"HP Media Vault mv2120" | "Linksys NSLU2" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
+	"Buffalo/Revogear Kurobox Pro" | "HP Media Vault mv2120" | "Linksys NSLU2" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
 		# Pass the check and continue below
 	;;
 	*)
@@ -93,7 +93,7 @@ case "$machine" in
 	;;
 	# The boot loader passes a bogus root= (e.g. root=/dev/ram), so
 	# override the command line parameter.
-	"HP Media Vault mv2120" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
+	"Buffalo/Revogear Kurobox Pro" | "HP Media Vault mv2120" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
 		install -d $DESTDIR/conf
 		echo ROOT="$rootdev" >> $DESTDIR/conf/param.conf
 	;;
diff --git a/packages/oldsys-preseed/oldsys-preseed b/packages/oldsys-preseed/oldsys-preseed
index 449bbed..8408ec4 100755
--- a/packages/oldsys-preseed/oldsys-preseed
+++ b/packages/oldsys-preseed/oldsys-preseed
@@ -112,7 +112,46 @@ case "`archdetect`" in
 	;;
 	arm*/orion5x)
 		machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
-		if echo "$machine" | grep -q "^HP Media Vault mv2120"; then
+		if echo "$machine" | grep -q "^Buffalo/Revogear Kurobox Pro"; then
+			check_file /proc/mtd
+			rootfs=$(get_mtdblock "rootfs")
+			if [ -z "$rootfs" ]; then
+				log "Can't find rootfs MTD partition"
+				exit
+			fi
+			path=/tmp/oldsys-preseed
+			mkdir -p $path/rootfs
+			mount -t jffs2 -o ro /dev/$rootfs $path/rootfs || true
+			INTERFACE=eth0
+			parse_unix_tree $path/rootfs
+			netinfo=$path/rootfs/etc/netinfo
+			if [ -e "$netinfo" ]; then
+				usage=$(sed -n '/^my_ipaddress/ {s/.*=//; p}' "$netinfo")
+				if [ "$usage" = "dhcp" ]; then
+					NET_CONFIG=dhcp
+				else
+					NET_CONFIG=static
+					IP_ADDRESS=$usage
+					NETMASK=$(sed -n '/^my_subnetmask/ {s/.*=//; p}' "$netinfo")
+					GATEWAY=$(sed -n '/^my_dgw/ {s/.*=//; p}' "$netinfo")
+				fi
+			fi
+			hostinfo=$path/rootfs/etc/host.info
+			if [ -e "$hostinfo" ]; then
+				HOSTNAME=$(sed '/^hostname/ {s/.*=//; p}' "$hostinfo")
+			fi
+
+			unset_matching_var "HOSTNAME" "KUROBOX-PRO"
+			if [ "$NET_CONFIG" != "static" ]; then
+				IPADDRESS=192.168.11.150
+				NETMASK=255.255.255.0
+				GATEWAY=192.168.11.1
+				[ -z "$NAMESERVERS" ] && NAMESERVERS=192.168.11.1
+				dhcp_fallback $FILE
+			fi
+			umount $path/rootfs || true
+			rmdir $path/rootfs $path || true
+		elif echo "$machine" | grep -q "^HP Media Vault mv2120"; then
 			path=/tmp/oldsys-preseed
 			mkdir -p $path/sda5
 			mount -t ext3 -o ro /dev/sda5 $path/sda5 || true
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.preseed b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.preseed
new file mode 100644
index 0000000..58f50e4
--- /dev/null
+++ b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.preseed
@@ -0,0 +1,8 @@
+d-i netcfg/dhcp_failed note
+d-i netcfg/dhcp_options select Configure network manually
+d-i netcfg/get_ipaddress string 192.168.11.150
+d-i netcfg/get_netmask string 255.255.255.0
+d-i netcfg/get_gateway string 192.168.11.1
+d-i netcfg/get_nameservers string 83.255.249.10 83.255.245.10
+d-i netcfg/choose_interface select eth0
+d-i netcfg/use_dhcp boolean true
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.test b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.test
new file mode 100644
index 0000000..180bf0d
--- /dev/null
+++ b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.test
@@ -0,0 +1,29 @@
+path=$(mktemp -t oldsys-preseed-tests.XXXXXX -d)
+mkdir -p $path/rootfs
+(cd $path/rootfs ; tar -xzf $TEST_DIR/kuroboxpro_dhcp.tgz > /dev/null 2>&1)
+INTERFACE=eth0
+parse_unix_tree $path/rootfs
+netinfo=$path/rootfs/etc/netinfo
+if [ -e "$netinfo" ]; then
+	IPADDRESS=$(sed -n '/^my_ipaddress/ {s/.*=//; p}' "$netinfo")
+	if [ "$IPADDRESS" = "dhcp" ]; then
+		NET_CONFIG=dhcp
+	else
+		NET_CONFIG=static
+		NETMASK=$(sed -n '/^my_subnetmask/ {s/.*=//; p}' "$netinfo")
+		GATEWAY=$(sed -n '/^my_dgw/ {s/.*=//; p}' "$netinfo")
+	fi
+fi
+hostinfo=$path/rootfs/etc/host.info
+if [ -e "$hostinfo" ]; then
+	HOSTNAME=$(sed -n '/^hostname/ {s/.*=//; p}' "$hostinfo")
+fi
+unset_matching_var "HOSTNAME" "KUROBOX-PRO"
+if [ "$NET_CONFIG" != "static" ]; then
+	IPADDRESS=192.168.11.150
+	NETMASK=255.255.255.0
+	GATEWAY=192.168.11.1
+	[ -z "$NAMESERVERS" ] && NAMESERVERS=192.168.11.1
+	dhcp_fallback "$1"
+fi
+generate_preseed_file $1
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.tgz b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.tgz
new file mode 100644
index 0000000..bdbcd12
Binary files /dev/null and b/packages/oldsys-preseed/tests/arm/kuroboxpro_dhcp.tgz differ
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_static.preseed b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.preseed
new file mode 100644
index 0000000..4650bbd
--- /dev/null
+++ b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.preseed
@@ -0,0 +1,7 @@
+d-i netcfg/choose_interface select eth0
+d-i netcfg/get_ipaddress string 192.168.0.22
+d-i netcfg/get_netmask string 255.255.255.0
+d-i netcfg/get_gateway string 192.168.0.10
+d-i netcfg/get_nameservers string 192.168.0.10
+d-i netcfg/confirm_static boolean true
+d-i netcfg/disable_dhcp boolean true
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_static.test b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.test
new file mode 100644
index 0000000..8a43534
--- /dev/null
+++ b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.test
@@ -0,0 +1,29 @@
+path=$(mktemp -t oldsys-preseed-tests.XXXXXX -d)
+mkdir -p $path/rootfs
+(cd $path/rootfs ; tar -xzf $TEST_DIR/kuroboxpro_static.tgz > /dev/null 2>&1)
+INTERFACE=eth0
+parse_unix_tree $path/rootfs
+netinfo=$path/rootfs/etc/netinfo
+if [ -e "$netinfo" ]; then
+	IPADDRESS=$(sed -n '/^my_ipaddress/ {s/.*=//; p}' "$netinfo")
+	if [ "$IPADDRESS" = "dhcp" ]; then
+		NET_CONFIG=dhcp
+	else
+		NET_CONFIG=static
+		NETMASK=$(sed -n '/^my_subnetmask/ {s/.*=//; p}' "$netinfo")
+		GATEWAY=$(sed -n '/^my_dgw/ {s/.*=//; p}' "$netinfo")
+	fi
+fi
+hostinfo=$path/rootfs/etc/host.info
+if [ -e "$hostinfo" ]; then
+	HOSTNAME=$(sed -n '/^hostname/ {s/.*=//; p}' "$hostinfo")
+fi
+unset_matching_var "HOSTNAME" "KUROBOX-PRO"
+if [ "$NET_CONFIG" != "static" ]; then
+	IPADDRESS=192.168.11.150
+	NETMASK=255.255.255.0
+	GATEWAY=192.168.11.1
+	[ -z "$NAMESERVERS" ] && NAMESERVERS=192.168.11.1
+	dhcp_fallback "$1"
+fi
+generate_preseed_file $1
diff --git a/packages/oldsys-preseed/tests/arm/kuroboxpro_static.tgz b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.tgz
new file mode 100644
index 0000000..d166d85
Binary files /dev/null and b/packages/oldsys-preseed/tests/arm/kuroboxpro_static.tgz differ
diff --git a/packages/kernel/kernel-wedge/package-list b/packages/kernel/kernel-wedge/package-list
index 13eba22..5b0e4e4 100644
--- a/packages/kernel/kernel-wedge/package-list
+++ b/packages/kernel/kernel-wedge/package-list
@@ -177,6 +177,12 @@ Priority: standard
 Description: ISOFS filesystem support
  This package contains the ISOFS filesystem module for the Linux kernel.
 
+Package: jffs2-modules
+Depends: kernel-image, zlib-modules
+Priority: standard
+Description: JFFS2 filesystem support
+ This package contains the JFFS2 filesystem module for the Linux kernel.
+
 Package: jfs-modules
 Depends: kernel-image, nls-core-modules
 Priority: standard
diff --git a/packages/kernel/kernel-wedge/modules/jffs2-modules b/packages/kernel/kernel-wedge/modules/jffs2-modules
new file mode 100644
index 0000000..19f4e10
--- /dev/null
+++ b/packages/kernel/kernel-wedge/modules/jffs2-modules
@@ -0,0 +1 @@
+jffs2
diff --git a/packages/kernel/linux-modules-di-armel-2.6/modules/armel/jffs2-modules b/packages/kernel/linux-modules-di-armel-2.6/modules/armel/jffs2-modules
new file mode 100644
index 0000000..245c7d8
--- /dev/null
+++ b/packages/kernel/linux-modules-di-armel-2.6/modules/armel/jffs2-modules
@@ -0,0 +1 @@
+#include <jffs2-modules>
diff --git a/packages/kernel/linux-modules-di-i386-2.6/modules/i386/jffs2-modules b/packages/kernel/linux-modules-di-i386-2.6/modules/i386/jffs2-modules
new file mode 100644
index 0000000..245c7d8
--- /dev/null
+++ b/packages/kernel/linux-modules-di-i386-2.6/modules/i386/jffs2-modules
@@ -0,0 +1 @@
+#include <jffs2-modules>
diff --git a/packages/kernel/linux-kernel-di-armel-2.6/debian/control.stub b/packages/kernel/linux-kernel-di-armel-2.6/debian/control.stub
index f3973e5..2588255 100644
--- a/packages/kernel/linux-kernel-di-armel-2.6/debian/control.stub
+++ b/packages/kernel/linux-kernel-di-armel-2.6/debian/control.stub
@@ -3,5 +3,5 @@ Section: debian-installer
 Priority: optional
 Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
 Uploaders: Joey Hess <joeyh@debian.org>, Martin Michlmayr <tbm@cyrius.com>
-Build-Depends: kernel-wedge (>= 2.45)
+Build-Depends: kernel-wedge (>= 2.46)
 Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/kernel/linux-kernel-di-armel-2.6
diff --git a/packages/kernel/linux-modules-di-i386-2.6/debian/control.stub b/packages/kernel/linux-modules-di-i386-2.6/debian/control.stub
index 7ed9e23..5ea3bd6 100644
--- a/packages/kernel/linux-modules-di-i386-2.6/debian/control.stub
+++ b/packages/kernel/linux-modules-di-i386-2.6/debian/control.stub
@@ -3,5 +3,5 @@ Section: debian-installer
 Priority: optional
 Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
 Uploaders: Max Vozeler <xam@debian.org>, Frans Pop <fjp@debian.org>
-Build-Depends: kernel-wedge (>= 2.45)
+Build-Depends: kernel-wedge (>= 2.46)
 Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/kernel/linux-modules-di-i386-2.6
diff --git a/installer/build/boot/arm/kuroboxpro-flash-debian b/installer/build/boot/arm/kuroboxpro-flash-debian
new file mode 100644
index 0000000..3e766b8
--- /dev/null
+++ b/installer/build/boot/arm/kuroboxpro-flash-debian
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# This code is covered by the GNU General Public License (GPLv2 or higher)
+
+NVRAM=$(which nvram)
+SETENV="$NVRAM -c set"
+
+path=$(mount | grep ext2 | sed -n '/sda1/ {s/\/dev\/sda1 on \(.*\) type.*/\1/; p}')
+if [ -z "$path" ]; then
+    echo "You have to create an ext2 filesystem on /dev/sda1"
+    exit 1
+fi
+
+if [ ! -e $path/uImage.buffalo ]; then
+    echo "You have to download the uImage.buffalo file from the debian-installer for Kurobox Pro, and put it in $path"
+	exit 1
+fi
+
+if [ ! -e $path/initrd.buffalo ]; then
+	echo "You have to download the initrd.buffalo file from the debian-installer for Kurobox Pro, and put it in $path"
+	exit 1
+fi
+
+if [ -z "$NVRAM" ]; then
+	echo "There is no nvram utility to alter Das U-Boot environment"
+	exit 1
+fi
+
+printf "Saving Das U-Boot environment to ubootenv.bak... "
+$NVRAM -c printenv > ubootenv.bak
+echo "done."
+
+echo "Changing Das U-Boot environment... "
+$SETENV bootcmd 'ide reset; ext2load ide 0:1 $(default_kernel_addr) /$(kernel); ext2load ide 0:1 $(default_initrd_addr) /$(initrd); bootm $(default_kernel_addr) $(default_initrd_addr)'
+echo "done."
+
+echo "Please reboot your Kurobox Pro."
diff --git a/installer/build/config/armel/orion5x/netboot.cfg b/installer/build/config/armel/orion5x/netboot.cfg
index 9b00ed8..59bdbc7 100644
--- a/installer/build/config/armel/orion5x/netboot.cfg
+++ b/installer/build/config/armel/orion5x/netboot.cfg
@@ -1,9 +1,25 @@
 MEDIA_TYPE = netboot image
 
-TARGET = $(TEMP_INITRD) $(TEMP_KERNEL) ts209 ts409
+TARGET = $(TEMP_INITRD) $(TEMP_KERNEL) kuroboxpro ts209 ts409
 EXTRANAME = $(MEDIUM)
 TYPE = netboot/network-console
 
+# Kurobox Pro
+kuroboxpro:
+	mkdir -p $(SOME_DEST)/$(EXTRANAME)/kuroboxpro
+	mkdir -p $(TEMP)/kuroboxpro
+	# Set machine id 1509 (0x05e5)
+	devio > $(TEMP)/kuroboxpro/kernel 'wl 0xe3a01c05,4' 'wl 0xe38110e5,4'
+	cat $(TEMP_KERNEL) >> $(TEMP)/kuroboxpro/kernel
+	mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "Debian kernel" -d $(TEMP)/kuroboxpro/kernel $(TEMP)/kuroboxpro/kernel.uboot
+	cp $(TEMP)/kuroboxpro/kernel.uboot $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/uImage.buffalo
+	mkimage -A arm -O linux -T ramdisk -C gzip -a 0x02000000 -e 0x02000000 -n "Debian Installer ramdisk" -d $(TEMP_INITRD) $(TEMP)/kuroboxpro/initrd.uboot
+	cp $(TEMP)/kuroboxpro/initrd.uboot $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/initrd.buffalo
+	install -m 744 boot/arm/kuroboxpro-flash-debian $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/flash-debian
+	update-manifest $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/flash-debian "Script to flash debian-installer"
+	update-manifest $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/uImage.buffalo "Linux kernel for Kurobox Pro"
+	update-manifest $(SOME_DEST)/$(EXTRANAME)/kuroboxpro/initrd.buffalo "Linux kernel for Kurobox Pro"
+
 # QNAP TS-109/TS-209
 ts209:
 	mkdir -p $(SOME_DEST)/$(EXTRANAME)/qnap/ts-209

Attachment: kuroboxpro_dhcp.tgz
Description: GNU Zip compressed data

Attachment: kuroboxpro_static.tgz
Description: GNU Zip compressed data


Reply to: