前言

原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。本文使用markdown标记语言写成,为获得最好的阅读体验,请访问我的博客原文。

1. PocketBeagle Summary

​ PB的包装很简洁,如下图所示,让人莫名想起大学时北门最后在激烈竞争大潮中倒闭的打印店老板,以及卖不掉的扩容U盘。

目前准备分两部分写,基础篇和高级篇,基础篇就是拿到之后可以正常使用,高级篇就是针对PB的特色应用。建议继续本文之前看看《不能再小了--PocketBeagle开发板评测》和《装在口袋里的Beagle,上手很Easy》,一些内容不再赘述。PB虽然是17年发布的,但是并没有多么流行,相关文档较少,Youtube上大多都是关于小型比格犬的。。。

好吧,确实还挺萌的。

1. 硬件概览

BeagleBone Black 自2013年面世以来,其官方及衍生发布的版本硬件规格基本没动过,一块SoC用在好几代板子上,一样的AM335x单核1GHz ARM A8处理器、512MB内存,这和树莓派的思路不同,目前树莓派就是在提升性能上修修补补。

我们看看树莓派基金会设计理念:https://www.raspberrypi.org/about/

The Raspberry Pi Foundation is a UK-based charity that works to put the power of digital making into the hands of people all over the world, so they are capable of understanding and shaping our increasingly digital world, able to solve the problems that matter to them, and equipped for the jobs of the future.

We provide low-cost, high-performance computers that people use to learn, solve problems and have fun. We provide outreach and education to help more people access computing and digital making. We develop free resources to help people learn about computing and how to make things with computers, and train educators who can guide other people to learn.

主要是提供低成本高性能卡片式电脑,促进计算机教育。

我们再来看看BeagleBoard.org基金会的:http://beagleboard.org/about

The BeagleBoard.org Foundation is a US-based non-profit corporation existing to provide education in and collaboration around the design and use of open-source software and hardware in embedded computing......The BeagleBoard.org community collaborates on the development of open source physical computing solutions including robotics, personal manufacturing tools like 3D printers and laser cutters, and other types of industrial and machine controls.

BB基金会拥有类似老Motorola的工程师文化,主要是更专业的领域如机器人、嵌入式学习、3D打印等,而这些并不需要完整的电脑接口和高性能。这两者的理念差异也导致了RPi和BB的产品差异。

有兴趣的也可以看看Arduino的AboutUs

【我所拥有的BeagleBoard家族】之前还有一块BBBlack,后来出掉了,设计理念的差异也体现在PB和RPi Zero上。

下面我们来看看PB的硬件资源:

PocketBeagle 硬件规格:

  • SiP (System-in-Package) – Octavo Systems OSD3358-SM模块,包含

    • TI Sitara AM3358 ARM Cortex-A8 处理器,最高1 GHz, PowerVR SGX530 GPU
    • 2 × PRUs (实时可编程单元, 200MHz ARM Cortex-M3)
    • 512MB DDR3 800 MHz内存
    • 4kB I2C EEPROM存储
    • TPS65217 PMIC + LDO,内置1芯锂电池充放电支持,大家可以看看手册,这块PMIC还是很强的,而RPi没有PMIC电源管理芯片
  • 存储 – micro SD槽
  • USB – 1个micro USB 2.0 OTG接口
  • 扩展接口 – 两排 36-pin引脚
  • 其他 – 电源按钮,4 × LEDs,支持Click™ 扩展板
  • 供电 – microUSB 5V、扩展接口

【Click Board】图示是串口和以太网模块,更多模块可访问https://www.mikroe.com

此外还可以使用AdaFruit的一些Breakout Board,例如这种:

沉寂了多年的BB基金会在2016年发布新的BeagleBone Black Wireless,随之而来新的SiP封装令人眼前一亮,优点是集成度高,焊接方便,保护性好,缺点是内部CPU、RAM、PMIC等一旦损坏很可能得全换。

Compare with RPi Zero

这种小体积的板子有C.H.I.P、RPi Zero以及这次的PB,前两者比较像,归为一类。

PB像是介于Arduino和RPi Zero之间的东西,并且偏向于Arduino,但是国内来说,扩展板难买,性能过剩,价格高昂(5刀 Vs. 25刀,而且RPi Zero接口多,带蓝牙无线模块,TI的东西虽然物美但是价高啊,这或许就是PB不温不火的原因之一)。

PocketBone

比PB早,但是没有正式发售,更多信息请移步:cnx-softwareotcavo(1)otcvo(2) 。看起来大同小异,引脚更少。

小结

在2017年,Arduino都开始逐渐发布带无线能力的开发板,而PB这么一块开发板没有无线/蓝牙、以太网等接口,无拓展板情况下缺少通讯手段,是很不合格的,借助PRU以及丰富的专业接口和开放的软硬件资源,PB在某些专业领域会有人玩。可能为了区别BBB Wireless 、BB Blue的市场,人为地裁剪PocketBeagle的组件,在我看来定位很令人困惑。

注意:

手头拿到的是最新的 Rev A2,GPIO44被错印成GPIO48了——Via

2、文档资料

凭着BeagleBoard多年的技术沉积,虽然目前PocketBeagle的Software Status大多是Work In Process (WIP),但是相信大家也能玩得转。得益于TI的开放,AM335x拥有Mainline Kernel支持,可以获得大多数Linux系统新特性。

2.1 支持的操作系统|Available OS

  • Debian | ☆官方提供,基于Debian 9,有LXQT图形桌面版和IoT 命令终端版,这里选择IoT就可以了
  • Ubuntu 16.04 LTS | 官方rootfs制作
  • 支持TI AM3358的操作系统
    • Arch Linux | Arch Linux很早就支持BB家族的开发板,优秀的滚动Linux发行版,能用到最新的软件
    • Kali Linux | 专注安全审计方面的发行版
    • ROS | Robot Operating System,需要移植
    • Ardupilot | 飞行器、潜水器、遥控车控制系统,需要移植

2.2 文档资源|Documents & Resources

因为PB承载自BeagleBoard家族,所以大部分适用于BBB的书籍都可以参考。官方chat频道不咋活跃,Google Groups有点乱,毕竟不是专门的论坛。好在Youtube视频有各种有趣的内容。国内好像专业定制领域比较多,当创客板还是不如RPi流行。

  • eewiki | 较多系统编译相关内容
  • 官方网站 | 官方资料集散地,有软硬件资料和网络上的项目分享
  • Google Groups | 还是有些可供参考的内容,但是为啥不搞个专业的论坛呢
  • 官方Wiki | ☆ System Reference Manual 章节很有用,基本涵盖了大部分操作
  • 官方github | 不少好东西,Issues讨论也很有用
  • BeagleBoard github | 另外关注下Robert Nelson,他有一些脚本在/opt/scripts
  • Ken Shirriff's blog |大神的博客,有两篇关于PB的
  • Books | 专门的PocketBeagle 书还没有,但是大部分都可借鉴,推荐《Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux》这本书,其他的在鸠摩,这里不便提供电子版。

3、应用方案

受限于PB的硬件资源,目前想到的方案是

  1. 数据线连接主机,作为Agent:

    • 仅主机开机且特殊功能时用到,其他时间处于关机状态,作用是Linux系统,各种服务,软件开发,代理,去广告,Secrue Key,由于只有一个microusb接口,甚至都不能连接第三方USB设备,大大降低了其应用方向,故集中于软件方面。
    • 在其他主机上即插即用,获得熟悉的使用环境和功能
  2. 独立使用,由MicroUSB或锂电池接口供电,外挂ESP8266等无线模块进行通讯,但由于ESP8266本身就可以作为Arduino-Like使用,唯一能想到的就是高实时性和相对的高性能,以及机器人领域

4、开始上路!

讲了这么多,终于要开车了,还是建议先看看官方指南和最前面的两篇评测,我简要记述一下。

4.1 下载烧录上电

下载最新版Headless操作系统镜像Debian 9.3 2018-03-05 4GB SD IoT,用etcher烧录到microSD卡上,退出sd卡,插到PB的卡槽,用MicroUSB数据线与Windows电脑连接,不一会就能看到电脑多出一个BeagleBone Getting Started可移动存储设备。浏览器访问http://192.168.7.2一般可以看到绿色的已连接到开发板

4.2 启动失败问题探讨

表现为烧录好系统上电后,仅电源灯亮,串口无输出或单一乱码(115200波特率),主机不显示移动磁盘,考虑硬件损坏。

RPi的BootLoader是在GPU ROM里的,PB没有eMMC,查看/boot分区可见uboot目录,说明BB的系统是在sd或者eMMC上而不是固化在硬件上的。uboot(类似BIOS)正常时串口会输出硬件自检信息,在确认sd卡没问题的前提下,很有可能是硬件损坏。之前的BBBlue和群友的一块PB也出现相同问题,可能需要参考TI手册来确认问题,比如TI AM3358是自动读取BootLoader还是有NBoot之类的。

4.3 系统基本情况

使用Xshell登录上去,debian:temppwd,可以看到目前是使用4.9.82内核的32位操作系统,默认开启了几个端口:

  • 53 | DNS 和DHCP服务
  • 22 | SSH服务
  • 1880 | 访问可知是node-RED
  • 3000 | Cloud9 Web IDE
  • 80 | 快速指南页面
  • 8080 | apache2网页服务器

此外还有avahi服务,ifconfig可以看到usb0和usb1两个,查看文档可知:

4.3 扩展SD卡分区

不管你的sd卡有多大,默认只使用不超过4G,和RPi不同,需要自行扩展分区,参考这篇文档,执行以下命令sudo /opt/scripts/tools/grow_partition.sh,重启后生效。

4.4 共享主机网络

以Windows 7 为例,Win 下选择共享网络给RNDIS,然后属性更改自动获取ip,默认是192.168.137.2

初始情况下,dns服务器和默认网关(gateway)没有设置,所以无法上网,而/etc/resolv.conf每次开机会重新生成,所以创建自定义resolv.conf,

echo 'nameserver 114.114.114.114' > ~/resolv.conf

/etc/resolv.conf -> /run/connman/resolv.conf 链接到。

PB上新建一个脚本doroute.sh,内容如下:

sudo route add default gw 192.168.7.1
sudo cp /home/debian/resolv.conf /run/connman/resolv.conf

由于系统启动完加载gadget驱动后才会有虚拟网卡,故无法开机设置,需要手动设置。(systemd开启延时?)

4.5 更改软件源以提速:

默认采用Debian官方源和rcn-ee补充源,使用https://mirrors.ustc.edu.cn/repogen/

生成中科大源列表,源文件备份为sources.list.old。重新update & upgrade一下。

4.6 更改账户密码

passwd debian

4.7 电源按钮的使用

得益于强大的PMIC电源管理芯片,PB的电源管理按钮有诸多功能

  1. 轻短按——标准关机,会等待软件服务等退出后才关机,相当于sudo shutdown -h now

    重新开机需要按住10s(灯灭)->松开->轻按开机

  2. 重长按10s——强制关机,内存里未保存的内容将会丢失

    轻按即可重新开机

  3. 重长按>10s——强制重启

4.8 microUSB 虚拟网卡带宽堪用?

PB引出的接口仅有microUSB一个。该接口通过USB Gadage驱动支持虚拟串口、Ethernet和Mass Storage功能。USB 2.0理论传输速度为480Mbps,即60MB/s,那么通过USB Gadget驱动实现虚拟以太网卡性能如何?

4.8.1 使用iperf进行测试(也可以试试netperf)

# 分别在PB和Espressobin开发板上安装iperf 2.0.9,注意iperf3有较大改动
sudo apt install iperf
# 开启iperf服务器,使用udp协议
iperf -u -s

Windows主机上下载iperf(命令行程序),基本用法。通过无线网连接Espressobin,以100M为数据发送速率,进行上下行带宽测试:

iperf -u -c target_IP -b 100M -d -t 60

结果如下:

可见Espressobin带宽约为PB的两倍多,而且PB开始出现丢包。

4.8.2 下载速度测试

# 分别在两板上生成100MB的文件
dd if=/dev/zero of=big.file bs=100M count=1
# 开启单线程web服务暴露出去
python -m SimpleHTTPServer 7777

在Windows主机上使用下载工具下载文件,文件地址:target_IP:7777/big.file

PB速度大约为8MBps,Esp约为17MBps,整体来说,PB的速度可堪一用。

5、 随身助理

先实现方案1,也就是随身助理的功能,又分为两种,从常用主机迁移部分服务;为其他主机提供熟悉的操作环境。

5.1 非常用主机熟悉环境

5.1.1 随身U盘

BBB板载4GB eMMC不大不小,但是PB使用的microSD卡一般都是8GB以上,我们可以合理应用,

将sd卡上的部分空间划分出来,作为U盘使用,其实操作系统本身已经实现了相关功能,就是

我们第一次上电看到的BeagleBone Getting Started,不过缺点在于大小只有18MB,而且

只读属性,无法写入文件。

前面博客讲过Linux USB Gadget驱动相关,我们知道是挂载驱动时指定相关参数。那么我们

只要找到相关设置语句就可以进行修改了。

开启读写

搜索可知相关设置句在/opt/scripts/boot/am335x_evm.sh第77行(usb_massstorage_readonly):

usb_ms_ro=1

设置语句在第650行。nano想要显示行号可以使用nano -c打开。

        #g_multi: Do we have image file?
if [ -f ${usb_image_file} ] ; then
test_usb_image_file=$(echo ${usb_image_file} | grep .iso || true)
if [ ! "x${test_usb_image_file}" = "x" ] ; then
usb_ms_cdrom=1
fi
g_multi_options="file=${usb_image_file} cdrom=${usb_ms_cdrom} ro=${usb_ms_ro}"
g_multi_options="${g_multi_options} stall=${usb_ms_stall} removable=${usb_ms_removable}"
g_multi_options="${g_multi_options} nofua=${usb_ms_nofua} ${g_network}}"
modprobe g_multi ${g_multi_options} || g_multi_retry
usb0="enable"
else
#g_multi: Do we have a non-rootfs "fat" partition?
unset root_drive
root_drive="$(cat /proc/cmdline | sed 's/ /\n/g' | grep root=UUID= | awk -F 'root=' '{print $2}' || true)"
if [ ! "x${root_drive}" = "x" ] ; then
root_drive="$(/sbin/findfs ${root_drive} || true)"
else
root_drive="$(cat /proc/cmdline | sed 's/ /\n/g' | grep root= | awk -F 'root=' '{print $2}' || true)"
fi if [ "x${root_drive}" = "x/dev/mmcblk0p1" ] || [ "x${root_drive}" = "x/dev/mmcblk1p1" ] ; then
#g_ether: Do we have udhcpd/dnsmasq?
if [ -f /usr/sbin/udhcpd ] || [ -f /usr/sbin/dnsmasq ] ; then
modprobe g_ether ${g_network} || g_ether_retry
usb0="enable"
else
#g_serial: As a last resort...
modprobe g_serial || g_serial_retry
fi
else
boot_drive="${root_drive%?}1"
modprobe g_multi file=${boot_drive} cdrom=0 ro=0 stall=0 removable=1 nofua=1 ${g_network} || true
usb0="enable"
fi
fi

重启即可发现可以读写BeagleBone磁盘了。

更改BegaleBone磁盘大小

虽然可以读写了,但是18MB总归不够用,查看上面的脚本,我们发现/var/cache/doc-beaglebone-getting-started/

存放着虚拟磁盘镜像beaglebone-getting-started-2017-05-25.imgls -lh并移出后重启,主机看不到BeagleBone磁盘再一次证实了我们的猜测。

目标找到了,我们要对该文件进行扩容,思路有好多种,最初尝试dd新建空白img然后cat append到源文件,用resize2fs修复,

结果发现resize2fs仅支持ext*文件系统,用sudo fdisk -l beaglebone-getting-started-2017-05-25.img,可以看到是FAT16文件系统的分区,

最后想了一个折中的方法,通过sftp协议(FlashFXP、WinSCP、FileZilla等)将镜像拉出来(192.168.7.2),然后用UltraISO进行修改。

操作——>修改映格式——>新映像大小512MB——>输出映像文件,然后传上去到debian用户目录下,再备份原文件后替代:

sudo mv /var/cache/doc-beaglebone-getting-started/beaglebone-getting-started-2017-05-25.img /var/cache/doc-beaglebone-getting-started/beaglebone-getting-started-2017-05-25.img.old
sudo mv ~/beaglebone-getting-started-2017-05-25.img /var/cache/doc-beaglebone-getting-started/

重启即可以看到512MB的可读磁盘。注意该目录并不与PB Linux共享,必要时可以选择将img文件挂在到pb。

另外我们可以尝试直接新建一个img文件用于挂载,这样主机上显示两个可移动存储设备,一个只读,一个可写,更加安全。

注意:

用最新版本的UltraISO打开img文件时提示无法识别的iso文件,很纳闷之前可以的。从

这里下载旧版(v9.6.x)UltraISO后成功。

一键开关读写权限

脚本如下:

5.1.2 出城地图

有些网站打不开、访问慢,需要一个代理。这里选择简单的brook。

服务端

在远程服务器上使用doubi.io写的一键brook安装脚本即可。

客户端

由于启动流程是:开机——>加载ether gadget驱动——>lan up——>doroute.sh:internet online

所以我们这里建立shell脚本,手动按需开启关闭代理模式。手写脚本如下:

#!/bin/sh

# s=socks5 1081 only, h=http 1080 only,a=all,socks & http,k=kill
case $1 in
s) nohup brook client -l 0.0.0.0:1081 -i 0.0.0.0 -s server_address:port -p password > /dev/null 2>&1 &
;;
h) nohup brook client -l 0.0.0.0:1080 -i 0.0.0.0 -s server_address:port -p password --http > /dev/null 2>&1 &
;;
a)
nohup brook client -l 0.0.0.0:1081 -i 0.0.0.0 -s server_address:port -p password > /dev/null 2>&1 &
nohup brook client -l 0.0.0.0:1080 -i 0.0.0.0 -s server_address:port -p password --http > /dev/null 2>&1 &
;;
k) pkill brook > /dev/null 2>&1
;;
*) echo "wrong option, plz retry with \n {s}=socks5 1081 only, {h}=http 1080 only, {a}=all,socks & http, {k}=kill \n for example, ./brook.sh a"
;;
esac echo 'done'

可以开启socks5/http代理(不同端口)。

看不懂的可以移步Linux Shell 教程,

主要需要了解参数传递、echo、流程控制等。另外dash比bash支持更多参数语法,debian的默认shell是dash。 官方debian系统没有killall命令,用pkill代替,具体参考man.linuxde.net/pkill。

测试的话可以用curl:

# check http proxy
curl -x 127.0.0.1:1080 www.google.com
# check socks5 proxy
curl --socks5 127.0.0.1:1081 www.google.com
主机使用地图

最简单的就是打开ie选项,设置http代理为192.168.7.2:1080,打开google.com,畅游互联网吧!

复杂一点的就是我在个人电脑上会设置哪些电脑需要访问代理,哪些不需要,gfwlist,常用OmegaSwitch+Chrome。

这里我们试试COW。看了一下介绍,还是挺强大的,主要就是自动检测文件是否需要走二级代理。从release界面下载windows版的,编辑rc文件,将http和socks服务器替换为192.168.7.2, 配合一键切换ie浏览器的ahk脚本即可。

常备软件

  • COW + SwitchProxy
  • notepad2-mod | 简洁小巧的文本编辑器
  • KiTTY | 好用简洁的SSH客户端
  • Snipaste | 国人多年开发的截图软件
  • cheatsheet | 一些常用软件的快捷键

PocketBeagle 初高级设置的更多相关文章

  1. Navicat(连接) -1高级设置

    高级设置 设置位置当创建一个新的连接,Navicat 将在设置位置创建一个子文件夹.大多数文件都保存在该子文件夹: Navicat 对象 服务器类型 扩展名 查询 全部 .sql 导出查询结果设置文件 ...

  2. Netsharp快速入门(之17) Netsharp基础功能(参照高级设置)

    5.2     参照高级设置 1. 以往来字段为例,打开平台工具-界面管理-列表管理,找到往来单位的资源节点,记下列表项目中的名称 2.记下往来单位部件工作区的id 3. 打开平台工具-界面管理-参照 ...

  3. 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(四) --高级设置二

    原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(四) --高级设置二 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一4. 根据用户选择的组 ...

  4. 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧

    高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...

  5. Cube的高级设置

    分享来源地址:http://bigdata.51cto.com/art/201705/538648.htm Cube的高级设置 随着维度数目的增加,Cuboid 的数量会爆炸式地增长.为了缓解 Cub ...

  6. cdnbest获取,删除,增加,修改域名列表,高级设置api示例

    <?php $uid = 28; $vhost = 'asdfw'; $token = getToken($uid, $vhost); print_r($token); //获取token fu ...

  7. vsftp 虚拟用户高级设置(转载)

    发布:xiaokk   来源:net     [大 中 小] vsftp 虚拟用户高级设置  本文转自:http://www.jbxue.com/article/1724.html 1.安装所需软件包 ...

  8. 手把手教你搭饥荒专用服务器(三)—MOD及其他高级设置

    友情链接: 手把手教你搭饥荒专用服务器(一)-服务器准备工作 手把手教你搭饥荒专用服务器(二)-环境配置及基本使用 手把手教你搭饥荒专用服务器(三)-MOD及其他高级设置 手把手教你搭饥荒专用服务器( ...

  9. Protel99se轻松入门:特殊技巧和高级设置(一)

    这里简单介绍一下自动布线和手动布线方面的设置问题 1.如何进入PCB的这个布线规则选项: 2.电气安全距离的设置 3.导线宽度的设置 4.学会了设置图层就可以做单面板以及多层板,而不只是双面板 5.布 ...

随机推荐

  1. TortoiseGit保存用户名和密码的方法

    TortoiseGit在提交或者pull时总会提示你输入用户名密码,非常麻烦,那如何解决呢? 1. 对于TortoiseGit 1.8.1.2及其后的版本,右键选择settings ——> Gi ...

  2. HDU 4845 拯救大兵瑞恩(分层图状压BFS)

    拯救大兵瑞恩 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Sub ...

  3. BZOJ3999 [TJOI2015]旅游 【树剖 + 线段树】

    题目 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会选择从A城市买入再 ...

  4. redis学习(七)jedis客户端

    1.下载jedis的jar包 http://repo1.maven.org/maven2/redis/clients/jedis/2.8.1/ 2.启动redis后台 3.测试联通 package c ...

  5. vue子组件向父组件传递数据

    子组件 <template> <div id="header"> <input type="text" v-model=" ...

  6. URL短网址生成算法原理和php实现案例

    短网址(Short URL),顾名思义就是在形式上比较短的网址. 短链接的好处:1.内容需要:2.用户友好:3.便于管理为什么要这样做的,原因我想有这样几点:微博限制字数为140字一条,那么如果我们需 ...

  7. 图片上传封装类【包括图片上传和缩略图上传】.NET

    原文发布时间为:2009-08-30 -- 来源于本人的百度文章 [由搬家工具导入] #region 上传图片及上传缩略图    public class UpFile : System.Web.UI ...

  8. 如何查看用pip命令安装的软件的安装路径

    怎么查看python的pip install xx安装的软件的安装路径? pip freeze命令可以查看用pip安装的软件有哪些 要查看安装路径,在执行一次命令pip install xx,就会告诉 ...

  9. HTML5 录音的踩坑之旅

    开篇闲扯 前一段时间的一个案子是开发一个有声课件,大致就是通过导入文档.图片等资源后,页面变为类似 PPT 的布局,然后选中一张图片,可以插入音频,有单页编辑和全局编辑两种模式.其中音频的导入方式有两 ...

  10. WebStorm使用JetBrains IDE Support调试

    1.安装WebStorm 2.安装谷歌的chome浏览器,并切换到开发者模式 3.下载并安装 JetBrains IDE Support(将2.0.7_0.crx文件直接拖到谷歌浏览器中就会自动安装) ...