Skip to content

Commit 9e212fb

Browse files
committed
Install Docker 17.09 in all the curated images
1 parent df91eeb commit 9e212fb

31 files changed

+947
-87
lines changed

ubuntu/android-java-8/24.4.1/Dockerfile

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
FROM ubuntu:14.04.5
1414

15+
ENV DOCKER_BUCKET="download.docker.com" \
16+
DOCKER_VERSION="17.09.0-ce" \
17+
DOCKER_CHANNEL="stable" \
18+
DOCKER_SHA256="a9e90a73c3cdfbf238f148e1ec0eaff5eb181f92f35bdd938fd7dab18e1c4647" \
19+
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034" \
20+
DOCKER_COMPOSE_VERSION="1.16.1"
21+
1522
# Building git from source code:
1623
# Ubuntu's default git package is built with broken gnutls. Rebuild git with openssl.
1724
##########################################################################
@@ -28,6 +35,7 @@ RUN apt-get update \
2835
libsqlite3-dev=3.8.2-* libssl-dev=1.0.1f-* libtool=2.4.2-* libwebp-dev=0.4.0-* \
2936
libxml2-dev=2.9.1+dfsg1-* libxslt1-dev=1.1.28-* libyaml-dev=0.1.4-* make=3.81-* \
3037
patch=2.7.1-* xz-utils=5.1.1alpha+20120614-* zlib1g-dev=1:1.2.8.dfsg-* unzip=6.0-* curl=7.35.0-* \
38+
e2fsprogs=1.42.9-* iptables=1.4.21-* xfsprogs=3.1.9ubuntu2 xz-utils=5.1.1alpha+20120614-* \
3139
&& apt-get install -y -qq less=458-* groff=1.22.2-* \
3240
&& apt-get -qy build-dep git=1:1.9.1 \
3341
&& apt-get -qy install libcurl4-openssl-dev=7.35.0-* git-man=1:1.9.1-* liberror-perl=0.17-* \
@@ -40,38 +48,65 @@ RUN apt-get update \
4048
&& dpkg-buildpackage -rfakeroot -b \
4149
&& find .. -type f -name "git_*ubuntu*.deb" -exec dpkg -i \{\} \; \
4250
&& rm -rf /usr/src/git-openssl \
43-
# Install dependencies by all python images equivalent to buildpack-deps:jessie
44-
# on the public repos.
4551
&& rm -rf /var/lib/apt/lists/* \
4652
&& apt-get clean
4753

54+
# Install Docker
55+
RUN set -x \
56+
&& curl -fSL "https://${DOCKER_BUCKET}/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
57+
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
58+
&& tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin/ \
59+
&& rm docker.tgz \
60+
&& docker -v \
61+
# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
62+
&& addgroup dockremap \
63+
&& useradd -g dockremap dockremap \
64+
&& echo 'dockremap:165536:65536' >> /etc/subuid \
65+
&& echo 'dockremap:165536:65536' >> /etc/subgid \
66+
&& wget "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -O /usr/local/bin/dind \
67+
&& curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose \
68+
&& chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose \
69+
# Ensure docker-compose works
70+
&& docker-compose version
71+
72+
# Install dependencies by all python images equivalent to buildpack-deps:jessie
73+
# on the public repos.
74+
4875
RUN wget "https://bootstrap.pypa.io/get-pip.py" -O /tmp/get-pip.py \
4976
&& python /tmp/get-pip.py \
5077
&& pip install awscli==1.11.157 \
51-
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
52-
78+
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
79+
80+
VOLUME /var/lib/docker
81+
82+
COPY dockerd-entrypoint.sh /usr/local/bin/
83+
84+
ENTRYPOINT ["dockerd-entrypoint.sh"]
85+
5386

5487
# Copy install tools
5588
COPY tools /opt/tools
5689

5790
ENV ANDROID_HOME="/usr/local/android-sdk-linux" \
58-
JAVA_HOME="/usr/lib/jvm/java-8-oracle" \
59-
JDK_HOME="/usr/lib/jvm/java-8-oracle" \
91+
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \
92+
JDK_VERSION="8u141-b15-3~14.04" \
93+
JDK_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \
94+
JRE_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre" \
6095
JAVA_VERSION="8" \
61-
INSTALLED_GRADLE_VERSIONS="2.10 2.11 2.12 2.13 2.14.1" \
62-
GRADLE_VERSION="2.14.1" \
96+
INSTALLED_GRADLE_VERSIONS="2.14.1 3.5 4.0.2 4.1 4.2.1 4.3.1 4.4" \
97+
GRADLE_VERSION="4.4" \
6398
ANDROID_TOOLS_VER="24.4.1" \
6499
ANDROID_TOOLS_SHA1="725bb360f0f7d04eaccff5a2d57abdd49061326d"
65-
ENV PATH="${PATH}:/opt/tools:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools" \
66-
JAVA_PACKAGE_VERSION="8u151-1~webupd8~0"
100+
ENV PATH="${PATH}:/opt/tools:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools"
67101

68102
# Install java8
69103
RUN apt-get update \
70104
&& apt-get install -y software-properties-common=0.92.37.8 \
71-
&& add-apt-repository -y ppa:webupd8team/java \
105+
&& add-apt-repository -y ppa:openjdk-r/ppa \
72106
&& (echo oracle-java$JAVA_VERSION-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections) \
73107
&& apt-get update \
74-
&& apt-get install -y oracle-java$JAVA_VERSION-installer=$JAVA_PACKAGE_VERSION \
108+
&& apt-get -y install openjdk-$JAVA_VERSION-jdk=$JDK_VERSION \
109+
&& update-ca-certificates -f \
75110
&& apt-get install -y -qq less=458-* groff=1.22.2-* \
76111
&& dpkg --add-architecture i386 \
77112
&& apt-get update && apt-get install -y --force-yes expect=5.45-* libc6-i386=2.19-* \
@@ -100,5 +135,7 @@ RUN apt-get update \
100135
&& tar -xzf /tmp/android-sdk.tgz -C /usr/local/ \
101136
&& chown -R root.root $ANDROID_HOME \
102137
&& ln -s $ANDROID_HOME/tools/android /usr/bin/android \
103-
&& /opt/tools/android-accept-licenses.sh "android update sdk --all --no-ui --filter platform-tools,build-tools-25.0.0,android-23,android-24,android-25" \
138+
&& /opt/tools/android-accept-licenses.sh "android update sdk --all --no-ui --filter platform-tools,build-tools-23.0.3,build-tools-24.0.3,build-tools-25.0.3,build-tools-26.0.2,android-23,android-24,android-25,android-26" \
104139
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
140+
141+
ENTRYPOINT ["dockerd-entrypoint.sh"]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/sh
2+
set -e
3+
4+
/usr/local/bin/dockerd \
5+
--host=unix:///var/run/docker.sock \
6+
--host=tcp://0.0.0.0:2375 \
7+
--storage-driver=overlay &>/var/log/docker.log &
8+
9+
10+
tries=0
11+
d_timeout=60
12+
until docker info >/dev/null 2>&1
13+
do
14+
if [ "$tries" -gt "$d_timeout" ]; then
15+
cat /var/log/docker.log
16+
echo 'Timed out trying to connect to internal docker host.' >&2
17+
exit 1
18+
fi
19+
tries=$(( $tries + 1 ))
20+
sleep 1
21+
done
22+
23+
eval "$@"

ubuntu/docker/17.09.0/Dockerfile

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
FROM ubuntu:14.04.5
1414

15+
ENV DOCKER_BUCKET="download.docker.com" \
16+
DOCKER_VERSION="17.09.0-ce" \
17+
DOCKER_CHANNEL="stable" \
18+
DOCKER_SHA256="a9e90a73c3cdfbf238f148e1ec0eaff5eb181f92f35bdd938fd7dab18e1c4647" \
19+
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034" \
20+
DOCKER_COMPOSE_VERSION="1.16.1"
21+
1522
# Building git from source code:
1623
# Ubuntu's default git package is built with broken gnutls. Rebuild git with openssl.
1724
##########################################################################
@@ -28,6 +35,7 @@ RUN apt-get update \
2835
libsqlite3-dev=3.8.2-* libssl-dev=1.0.1f-* libtool=2.4.2-* libwebp-dev=0.4.0-* \
2936
libxml2-dev=2.9.1+dfsg1-* libxslt1-dev=1.1.28-* libyaml-dev=0.1.4-* make=3.81-* \
3037
patch=2.7.1-* xz-utils=5.1.1alpha+20120614-* zlib1g-dev=1:1.2.8.dfsg-* unzip=6.0-* curl=7.35.0-* \
38+
e2fsprogs=1.42.9-* iptables=1.4.21-* xfsprogs=3.1.9ubuntu2 xz-utils=5.1.1alpha+20120614-* \
3139
&& apt-get install -y -qq less=458-* groff=1.22.2-* \
3240
&& apt-get -qy build-dep git=1:1.9.1 \
3341
&& apt-get -qy install libcurl4-openssl-dev=7.35.0-* git-man=1:1.9.1-* liberror-perl=0.17-* \
@@ -40,36 +48,16 @@ RUN apt-get update \
4048
&& dpkg-buildpackage -rfakeroot -b \
4149
&& find .. -type f -name "git_*ubuntu*.deb" -exec dpkg -i \{\} \; \
4250
&& rm -rf /usr/src/git-openssl \
43-
# Install dependencies by all python images equivalent to buildpack-deps:jessie
44-
# on the public repos.
4551
&& rm -rf /var/lib/apt/lists/* \
4652
&& apt-get clean
4753

48-
RUN wget "https://bootstrap.pypa.io/get-pip.py" -O /tmp/get-pip.py \
49-
&& python /tmp/get-pip.py \
50-
&& pip install awscli==1.11.157 \
51-
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
52-
53-
54-
ENV DOCKER_BUCKET="download.docker.com" \
55-
DOCKER_VERSION="17.09.0-ce" \
56-
DOCKER_CHANNEL="stable" \
57-
DOCKER_SHA256="a9e90a73c3cdfbf238f148e1ec0eaff5eb181f92f35bdd938fd7dab18e1c4647" \
58-
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034" \
59-
DOCKER_COMPOSE_VERSION="1.16.1"
60-
61-
COPY dockerd-entrypoint.sh /usr/local/bin/
62-
63-
# From the docker:17.09
54+
# Install Docker
6455
RUN set -x \
6556
&& curl -fSL "https://${DOCKER_BUCKET}/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
6657
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
6758
&& tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin/ \
6859
&& rm docker.tgz \
6960
&& docker -v \
70-
# From the docker dind 17.09
71-
&& apt-get update && apt-get install -y --no-install-recommends \
72-
e2fsprogs=1.42.9-* iptables=1.4.21-* xfsprogs=3.1.9ubuntu2 xz-utils=5.1.1alpha+20120614-* \
7361
# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
7462
&& addgroup dockremap \
7563
&& useradd -g dockremap dockremap \
@@ -79,11 +67,21 @@ RUN set -x \
7967
&& curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose \
8068
&& chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose \
8169
# Ensure docker-compose works
82-
&& docker-compose version \
83-
&& rm -rf /var/lib/apt/lists/* \
84-
&& apt-get clean
70+
&& docker-compose version
8571

72+
# Install dependencies by all python images equivalent to buildpack-deps:jessie
73+
# on the public repos.
74+
75+
RUN wget "https://bootstrap.pypa.io/get-pip.py" -O /tmp/get-pip.py \
76+
&& python /tmp/get-pip.py \
77+
&& pip install awscli==1.11.157 \
78+
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
8679

8780
VOLUME /var/lib/docker
8881

82+
COPY dockerd-entrypoint.sh /usr/local/bin/
83+
84+
ENTRYPOINT ["dockerd-entrypoint.sh"]
85+
86+
8987
ENTRYPOINT ["dockerd-entrypoint.sh"]

ubuntu/dot-net/core-1/Dockerfile

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
FROM ubuntu:14.04.5
1414

15+
ENV DOCKER_BUCKET="download.docker.com" \
16+
DOCKER_VERSION="17.09.0-ce" \
17+
DOCKER_CHANNEL="stable" \
18+
DOCKER_SHA256="a9e90a73c3cdfbf238f148e1ec0eaff5eb181f92f35bdd938fd7dab18e1c4647" \
19+
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034" \
20+
DOCKER_COMPOSE_VERSION="1.16.1"
21+
1522
# Building git from source code:
1623
# Ubuntu's default git package is built with broken gnutls. Rebuild git with openssl.
1724
##########################################################################
@@ -28,6 +35,7 @@ RUN apt-get update \
2835
libsqlite3-dev=3.8.2-* libssl-dev=1.0.1f-* libtool=2.4.2-* libwebp-dev=0.4.0-* \
2936
libxml2-dev=2.9.1+dfsg1-* libxslt1-dev=1.1.28-* libyaml-dev=0.1.4-* make=3.81-* \
3037
patch=2.7.1-* xz-utils=5.1.1alpha+20120614-* zlib1g-dev=1:1.2.8.dfsg-* unzip=6.0-* curl=7.35.0-* \
38+
e2fsprogs=1.42.9-* iptables=1.4.21-* xfsprogs=3.1.9ubuntu2 xz-utils=5.1.1alpha+20120614-* \
3139
&& apt-get install -y -qq less=458-* groff=1.22.2-* \
3240
&& apt-get -qy build-dep git=1:1.9.1 \
3341
&& apt-get -qy install libcurl4-openssl-dev=7.35.0-* git-man=1:1.9.1-* liberror-perl=0.17-* \
@@ -40,16 +48,41 @@ RUN apt-get update \
4048
&& dpkg-buildpackage -rfakeroot -b \
4149
&& find .. -type f -name "git_*ubuntu*.deb" -exec dpkg -i \{\} \; \
4250
&& rm -rf /usr/src/git-openssl \
43-
# Install dependencies by all python images equivalent to buildpack-deps:jessie
44-
# on the public repos.
4551
&& rm -rf /var/lib/apt/lists/* \
4652
&& apt-get clean
4753

54+
# Install Docker
55+
RUN set -x \
56+
&& curl -fSL "https://${DOCKER_BUCKET}/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
57+
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
58+
&& tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin/ \
59+
&& rm docker.tgz \
60+
&& docker -v \
61+
# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
62+
&& addgroup dockremap \
63+
&& useradd -g dockremap dockremap \
64+
&& echo 'dockremap:165536:65536' >> /etc/subuid \
65+
&& echo 'dockremap:165536:65536' >> /etc/subgid \
66+
&& wget "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -O /usr/local/bin/dind \
67+
&& curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose \
68+
&& chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose \
69+
# Ensure docker-compose works
70+
&& docker-compose version
71+
72+
# Install dependencies by all python images equivalent to buildpack-deps:jessie
73+
# on the public repos.
74+
4875
RUN wget "https://bootstrap.pypa.io/get-pip.py" -O /tmp/get-pip.py \
4976
&& python /tmp/get-pip.py \
5077
&& pip install awscli==1.11.157 \
51-
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
52-
78+
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
79+
80+
VOLUME /var/lib/docker
81+
82+
COPY dockerd-entrypoint.sh /usr/local/bin/
83+
84+
ENTRYPOINT ["dockerd-entrypoint.sh"]
85+
5386
# Install .NET CLI dependencies
5487
RUN apt-get update \
5588
&& apt-get install -y --no-install-recommends \
@@ -87,3 +120,5 @@ RUN mkdir warmup \
87120
&& cd .. \
88121
&& rm -rf warmup \
89122
&& rm -rf /tmp/NuGetScratch
123+
124+
ENTRYPOINT ["dockerd-entrypoint.sh"]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/sh
2+
set -e
3+
4+
/usr/local/bin/dockerd \
5+
--host=unix:///var/run/docker.sock \
6+
--host=tcp://0.0.0.0:2375 \
7+
--storage-driver=overlay &>/var/log/docker.log &
8+
9+
10+
tries=0
11+
d_timeout=60
12+
until docker info >/dev/null 2>&1
13+
do
14+
if [ "$tries" -gt "$d_timeout" ]; then
15+
cat /var/log/docker.log
16+
echo 'Timed out trying to connect to internal docker host.' >&2
17+
exit 1
18+
fi
19+
tries=$(( $tries + 1 ))
20+
sleep 1
21+
done
22+
23+
eval "$@"

ubuntu/dot-net/core-2/Dockerfile

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
FROM ubuntu:14.04.5
1414

15+
ENV DOCKER_BUCKET="download.docker.com" \
16+
DOCKER_VERSION="17.09.0-ce" \
17+
DOCKER_CHANNEL="stable" \
18+
DOCKER_SHA256="a9e90a73c3cdfbf238f148e1ec0eaff5eb181f92f35bdd938fd7dab18e1c4647" \
19+
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034" \
20+
DOCKER_COMPOSE_VERSION="1.16.1"
21+
1522
# Building git from source code:
1623
# Ubuntu's default git package is built with broken gnutls. Rebuild git with openssl.
1724
##########################################################################
@@ -28,6 +35,7 @@ RUN apt-get update \
2835
libsqlite3-dev=3.8.2-* libssl-dev=1.0.1f-* libtool=2.4.2-* libwebp-dev=0.4.0-* \
2936
libxml2-dev=2.9.1+dfsg1-* libxslt1-dev=1.1.28-* libyaml-dev=0.1.4-* make=3.81-* \
3037
patch=2.7.1-* xz-utils=5.1.1alpha+20120614-* zlib1g-dev=1:1.2.8.dfsg-* unzip=6.0-* curl=7.35.0-* \
38+
e2fsprogs=1.42.9-* iptables=1.4.21-* xfsprogs=3.1.9ubuntu2 xz-utils=5.1.1alpha+20120614-* \
3139
&& apt-get install -y -qq less=458-* groff=1.22.2-* \
3240
&& apt-get -qy build-dep git=1:1.9.1 \
3341
&& apt-get -qy install libcurl4-openssl-dev=7.35.0-* git-man=1:1.9.1-* liberror-perl=0.17-* \
@@ -40,16 +48,41 @@ RUN apt-get update \
4048
&& dpkg-buildpackage -rfakeroot -b \
4149
&& find .. -type f -name "git_*ubuntu*.deb" -exec dpkg -i \{\} \; \
4250
&& rm -rf /usr/src/git-openssl \
43-
# Install dependencies by all python images equivalent to buildpack-deps:jessie
44-
# on the public repos.
4551
&& rm -rf /var/lib/apt/lists/* \
4652
&& apt-get clean
4753

54+
# Install Docker
55+
RUN set -x \
56+
&& curl -fSL "https://${DOCKER_BUCKET}/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
57+
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
58+
&& tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin/ \
59+
&& rm docker.tgz \
60+
&& docker -v \
61+
# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
62+
&& addgroup dockremap \
63+
&& useradd -g dockremap dockremap \
64+
&& echo 'dockremap:165536:65536' >> /etc/subuid \
65+
&& echo 'dockremap:165536:65536' >> /etc/subgid \
66+
&& wget "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -O /usr/local/bin/dind \
67+
&& curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose \
68+
&& chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose \
69+
# Ensure docker-compose works
70+
&& docker-compose version
71+
72+
# Install dependencies by all python images equivalent to buildpack-deps:jessie
73+
# on the public repos.
74+
4875
RUN wget "https://bootstrap.pypa.io/get-pip.py" -O /tmp/get-pip.py \
4976
&& python /tmp/get-pip.py \
5077
&& pip install awscli==1.11.157 \
51-
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
52-
78+
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
79+
80+
VOLUME /var/lib/docker
81+
82+
COPY dockerd-entrypoint.sh /usr/local/bin/
83+
84+
ENTRYPOINT ["dockerd-entrypoint.sh"]
85+
5386

5487
# Install .NET CLI dependencies
5588
RUN apt-get update \
@@ -90,3 +123,5 @@ RUN mkdir warmup \
90123
&& cd .. \
91124
&& rm -rf warmup \
92125
&& rm -rf /tmp/NuGetScratch
126+
127+
ENTRYPOINT ["dockerd-entrypoint.sh"]

0 commit comments

Comments
 (0)