GNU bug report logs - #30006
bzip2 does not provide libbz2.so

Previous Next

Package: guix;

Reported by: ludo <at> gnu.org (Ludovic Courtès)

Date: Sat, 6 Jan 2018 13:30:02 UTC

Severity: normal

Done: Marius Bakke <mbakke <at> fastmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 30006 in the body.
You can then email your comments to 30006 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Sat, 06 Jan 2018 13:30:03 GMT) Full text and rfc822 format available.

Acknowledgement sent to ludo <at> gnu.org (Ludovic Courtès):
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Sat, 06 Jan 2018 13:30:03 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: bug-guix <at> gnu.org
Subject: bzip2 does not provide libbz2.so
Date: Sat, 06 Jan 2018 14:29:00 +0100
Our current bzip2 package does not provide libbz2.so:

--8<---------------cut here---------------start------------->8---
$ ls $(guix build bzip2)/lib
libbz2.a  libbz2.so.1.0  libbz2.so.1.0.6
--8<---------------cut here---------------end--------------->8---

Consequently, software that uses libbz2 always ends up
statically-linking it.  Thus, security issues in libbz2 cannot be
grafted.

Ludo’.




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Fri, 23 Mar 2018 12:03:02 GMT) Full text and rfc822 format available.

Message #8 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Ludovic Courtès <ludo <at> gnu.org>, 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Fri, 23 Mar 2018 13:02:07 +0100
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes:

> Our current bzip2 package does not provide libbz2.so:
>
> --8<---------------cut here---------------start------------->8---
> $ ls $(guix build bzip2)/lib
> libbz2.a  libbz2.so.1.0  libbz2.so.1.0.6
> --8<---------------cut here---------------end--------------->8---
>
> Consequently, software that uses libbz2 always ends up
> statically-linking it.  Thus, security issues in libbz2 cannot be
> grafted.

WDYT of this patch?

[0001-gnu-bzip2-Provide-libbz2.so.patch (text/x-patch, inline)]
From 1eec25f2aad3d20289ced4fbca9a614f6d614fa6 Mon Sep 17 00:00:00 2001
From: Marius Bakke <mbakke <at> fastmail.com>
Date: Fri, 23 Mar 2018 12:56:45 +0100
Subject: [PATCH] gnu: bzip2: Provide libbz2.so.

Fixes <https://bugs.gnu.org/30006>.

* gnu/packages/compression.scm (bzip2)[arguments]: In
INSTALL-SHARED-LIBS-PHASE, add a symlink.
---
 gnu/packages/compression.scm | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm
index b158feac4..fd111e579 100644
--- a/gnu/packages/compression.scm
+++ b/gnu/packages/compression.scm
@@ -272,6 +272,9 @@ file; as a result, it is often used in conjunction with \"tar\", resulting in
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out    (assoc-ref outputs "out"))
                     (libdir (string-append out "/lib")))
+               ;; The Make target above does not create "libbz2.so", only
+               ;; the versioned libs, so we have to create it ourselves.
+               (symlink "libbz2.so.1.0" "libbz2.so")
                (for-each (lambda (file)
                            (let ((base (basename file)))
                              (format #t "installing `~a' to `~a'~%"
-- 
2.16.2

[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Fri, 23 Mar 2018 12:20:01 GMT) Full text and rfc822 format available.

Message #11 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Tobias Geerinckx-Rice <me <at> tobias.gr>
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: Ludovic Courtès <ludo <at> gnu.org>, 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Fri, 23 Mar 2018 13:19:33 +0100
Marius,

On 2018-03-23 13:02, Marius Bakke wrote:
> diff --git a/gnu/packages/compression.scm 
> b/gnu/packages/compression.scm
> index b158feac4..fd111e579 100644
> --- a/gnu/packages/compression.scm
> +++ b/gnu/packages/compression.scm
> @@ -272,6 +272,9 @@ file; as a result, it is often used in conjunction 
> with \"tar\", resulting in
>             (lambda* (#:key outputs #:allow-other-keys)
>               (let* ((out    (assoc-ref outputs "out"))
>                      (libdir (string-append out "/lib")))
> +               ;; The Make target above does not create "libbz2.so", 
> only
> +               ;; the versioned libs, so we have to create it 
> ourselves.
> +               (symlink "libbz2.so.1.0" "libbz2.so")

How about symlinking to (string-append ... version) directly?
Seems more robust & worked fine when I tried it, I think.™

Kind regards,

T G-R

Sent from a Web browser. Excuse or enjoy my brevity.




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Fri, 23 Mar 2018 12:39:02 GMT) Full text and rfc822 format available.

Message #14 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Tobias Geerinckx-Rice <me <at> tobias.gr>
Cc: Ludovic Courtès <ludo <at> gnu.org>, 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Fri, 23 Mar 2018 13:38:24 +0100
[Message part 1 (text/plain, inline)]
Tobias Geerinckx-Rice <me <at> tobias.gr> writes:

> Marius,
>
> On 2018-03-23 13:02, Marius Bakke wrote:
>> diff --git a/gnu/packages/compression.scm 
>> b/gnu/packages/compression.scm
>> index b158feac4..fd111e579 100644
>> --- a/gnu/packages/compression.scm
>> +++ b/gnu/packages/compression.scm
>> @@ -272,6 +272,9 @@ file; as a result, it is often used in conjunction 
>> with \"tar\", resulting in
>>             (lambda* (#:key outputs #:allow-other-keys)
>>               (let* ((out    (assoc-ref outputs "out"))
>>                      (libdir (string-append out "/lib")))
>> +               ;; The Make target above does not create "libbz2.so", 
>> only
>> +               ;; the versioned libs, so we have to create it 
>> ourselves.
>> +               (symlink "libbz2.so.1.0" "libbz2.so")
>
> How about symlinking to (string-append ... version) directly?
> Seems more robust & worked fine when I tried it, I think.™

That makes sense.  I just wanted to stay close to the typical Autotools
way of creating these links, where libfoo.so points to libfoo.so.1 which
points to libfoo.so.1.2.  I'll change to (version-major+minor ...)
instead, in the off chance that bzip2 ever gets a new version.

Side note: "copy-file" (and thus "install-file") actually dereferences
symlinks, so in the end you get three copies of the same library.  Is
there an alternative to "copy-file" that preserves soft links?  Not that
it matters in practice due to deduplication, but still...
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Fri, 23 Mar 2018 20:52:02 GMT) Full text and rfc822 format available.

Message #17 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Mark H Weaver <mhw <at> netris.org>
To: Tobias Geerinckx-Rice <me <at> tobias.gr>
Cc: Marius Bakke <mbakke <at> fastmail.com>, 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Fri, 23 Mar 2018 16:50:22 -0400
Hi,

Tobias Geerinckx-Rice <me <at> tobias.gr> writes:

> On 2018-03-23 13:02, Marius Bakke wrote:
>> diff --git a/gnu/packages/compression.scm
>> b/gnu/packages/compression.scm
>> index b158feac4..fd111e579 100644
>> --- a/gnu/packages/compression.scm
>> +++ b/gnu/packages/compression.scm
>> @@ -272,6 +272,9 @@ file; as a result, it is often used in
>> conjunction with \"tar\", resulting in
>>             (lambda* (#:key outputs #:allow-other-keys)
>>               (let* ((out    (assoc-ref outputs "out"))
>>                      (libdir (string-append out "/lib")))
>> +               ;; The Make target above does not create "libbz2.so", only
>> +               ;; the versioned libs, so we have to create it ourselves.
>> +               (symlink "libbz2.so.1.0" "libbz2.so")
>
> How about symlinking to (string-append ... version) directly?
> Seems more robust & worked fine when I tried it, I think.™

In general, the version numbers at the end of shared library names like
"libbz2.so.1.0" do not necessarily match the version number of the
corresponding source release.  Therefore, I don't think we should write
code that assumes that those two versions will coincide.

However, I agree that it would be better not to hardcode the "1.0".  I
would suggest using 'find-files' to find the versioned shared library,
and to verify that there is exactly one match.  (ice-9 match) provides
an elegant way to check for a singleton list while matching its element.

What do you think?

Thanks for working on it.

      Mark




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Sat, 24 Mar 2018 01:19:02 GMT) Full text and rfc822 format available.

Message #20 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Tobias Geerinckx-Rice <me <at> tobias.gr>
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: Mark H Weaver <mhw <at> netris.org>, 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Sat, 24 Mar 2018 02:17:54 +0100
Marius, Mark,

On 2018-03-23 21:50, Mark H Weaver wrote:
> Hi,
> 
> Tobias Geerinckx-Rice <me <at> tobias.gr> writes:
> 
>> On 2018-03-23 13:02, Marius Bakke wrote:
>>> diff --git a/gnu/packages/compression.scm
>>> b/gnu/packages/compression.scm
>>> index b158feac4..fd111e579 100644
>>> --- a/gnu/packages/compression.scm
>>> +++ b/gnu/packages/compression.scm
>>> @@ -272,6 +272,9 @@ file; as a result, it is often used in
>>> conjunction with \"tar\", resulting in
>>>             (lambda* (#:key outputs #:allow-other-keys)
>>>               (let* ((out    (assoc-ref outputs "out"))
>>>                      (libdir (string-append out "/lib")))
>>> +               ;; The Make target above does not create "libbz2.so", 
>>> only
>>> +               ;; the versioned libs, so we have to create it 
>>> ourselves.
>>> +               (symlink "libbz2.so.1.0" "libbz2.so")
>> 
>> How about symlinking to (string-append ... version) directly?
>> Seems more robust & worked fine when I tried it, I think.™
> 
> In general, the version numbers at the end of shared library names like
> "libbz2.so.1.0" do not necessarily match the version number of the
> corresponding source release.  Therefore, I don't think we should write
> code that assumes that those two versions will coincide.

Do note that I'm not suggesting doing so in general; just in the case of 
bzip2 where that rule does historically hold. If that ever changes, so 
will the ‘1.0’ assumption.

(I did substitute ‘version’ for the ‘version-major+minor’ I actually 
used for... simplicity, I guess, which was probably ill advised.)

> However, I agree that it would be better not to hardcode the "1.0".  I
> would suggest using 'find-files' to find the versioned shared library,
> and to verify that there is exactly one match.  (ice-9 match) provides
> an elegant way to check for a singleton list while matching its 
> element.

I wasn't aware of such an elegant possibility. A perfect fit IMO :-)

Thanks,

T G-R

Sent from a Web browser. Excuse or enjoy my brevity.




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Sat, 24 Mar 2018 16:55:01 GMT) Full text and rfc822 format available.

Message #23 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 30006 <at> debbugs.gnu.org
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Sat, 24 Mar 2018 17:54:46 +0100
Hey Marius,

Marius Bakke <mbakke <at> fastmail.com> skribis:

> Ludovic Courtès <ludo <at> gnu.org> writes:
>
>> Our current bzip2 package does not provide libbz2.so:
>>
>> --8<---------------cut here---------------start------------->8---
>> $ ls $(guix build bzip2)/lib
>> libbz2.a  libbz2.so.1.0  libbz2.so.1.0.6
>> --8<---------------cut here---------------end--------------->8---
>>
>> Consequently, software that uses libbz2 always ends up
>> statically-linking it.  Thus, security issues in libbz2 cannot be
>> grafted.
>
> WDYT of this patch?
>
> From 1eec25f2aad3d20289ced4fbca9a614f6d614fa6 Mon Sep 17 00:00:00 2001
> From: Marius Bakke <mbakke <at> fastmail.com>
> Date: Fri, 23 Mar 2018 12:56:45 +0100
> Subject: [PATCH] gnu: bzip2: Provide libbz2.so.
>
> Fixes <https://bugs.gnu.org/30006>.
>
> * gnu/packages/compression.scm (bzip2)[arguments]: In
> INSTALL-SHARED-LIBS-PHASE, add a symlink.

LGTM, thank you!

Ludo’.




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Sat, 24 Mar 2018 17:02:01 GMT) Full text and rfc822 format available.

Message #26 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: 30006 <at> debbugs.gnu.org, Tobias Geerinckx-Rice <me <at> tobias.gr>
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Sat, 24 Mar 2018 18:01:02 +0100
Marius Bakke <mbakke <at> fastmail.com> skribis:

> Tobias Geerinckx-Rice <me <at> tobias.gr> writes:
>
>> Marius,
>>
>> On 2018-03-23 13:02, Marius Bakke wrote:
>>> diff --git a/gnu/packages/compression.scm 
>>> b/gnu/packages/compression.scm
>>> index b158feac4..fd111e579 100644
>>> --- a/gnu/packages/compression.scm
>>> +++ b/gnu/packages/compression.scm
>>> @@ -272,6 +272,9 @@ file; as a result, it is often used in conjunction 
>>> with \"tar\", resulting in
>>>             (lambda* (#:key outputs #:allow-other-keys)
>>>               (let* ((out    (assoc-ref outputs "out"))
>>>                      (libdir (string-append out "/lib")))
>>> +               ;; The Make target above does not create "libbz2.so", 
>>> only
>>> +               ;; the versioned libs, so we have to create it 
>>> ourselves.
>>> +               (symlink "libbz2.so.1.0" "libbz2.so")
>>
>> How about symlinking to (string-append ... version) directly?
>> Seems more robust & worked fine when I tried it, I think.™
>
> That makes sense.  I just wanted to stay close to the typical Autotools
> way of creating these links, where libfoo.so points to libfoo.so.1 which
> points to libfoo.so.1.2.  I'll change to (version-major+minor ...)
> instead, in the off chance that bzip2 ever gets a new version.

Note that there’s no reason for the SONAME numbers to match the version
number (it’s even not recommended to do that because it may not carry
the relevant info regarding ABI compatibility.)

So I think the hard-coded number is fine, but we should probably do:

  (symlink … "libbz2.so")
  (unless (file-exists? "libbz2.so)
    (error "wrong symlink target!" (readlink "libbz2.so")))

to be on the safe side.

> Side note: "copy-file" (and thus "install-file") actually dereferences
> symlinks, so in the end you get three copies of the same library.  Is
> there an alternative to "copy-file" that preserves soft links?  Not that
> it matters in practice due to deduplication, but still...

There’s no such function, which is unfortunate.  But I agree it’s nicer
to preserve symlinks in this case.

Perhaps we should actually do:

  (with-directory-excursion libdir
    (symlink … "libbz2.so"))

?

Thanks,
Ludo’.




Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Mon, 26 Mar 2018 17:37:02 GMT) Full text and rfc822 format available.

Message #29 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: Mark H Weaver <mhw <at> netris.org>, 30006 <at> debbugs.gnu.org,
 Tobias Geerinckx-Rice <me <at> tobias.gr>
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Mon, 26 Mar 2018 19:36:35 +0200
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes:

> There’s no such function, which is unfortunate.  But I agree it’s nicer
> to preserve symlinks in this case.
>
> Perhaps we should actually do:
>
>   (with-directory-excursion libdir
>     (symlink … "libbz2.so"))

Thanks for the feedback everyone.  I settled on a slightly different
solution, that first extracts the (full) soversion from the built
library, then creates symlinks for each "sub-version".

It assumes that the major version is "1".  That could be circumvented
with a regex, but I'm not sure if it's worth the effort.

As an added bonus, this also creates "libbz2.so.1" which was missing too.

WDYT of this approach?  Can it be made simpler?

[0001-gnu-bzip2-Provide-libbz2.so-and-libbz2.so.1.patch (text/x-patch, attachment)]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#30006; Package guix. (Tue, 27 Mar 2018 07:33:02 GMT) Full text and rfc822 format available.

Message #32 received at 30006 <at> debbugs.gnu.org (full text, mbox):

From: ludo <at> gnu.org (Ludovic Courtès)
To: Marius Bakke <mbakke <at> fastmail.com>
Cc: Mark H Weaver <mhw <at> netris.org>, 30006 <at> debbugs.gnu.org,
 Tobias Geerinckx-Rice <me <at> tobias.gr>
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Tue, 27 Mar 2018 09:32:10 +0200
Hello Marius,

Marius Bakke <mbakke <at> fastmail.com> skribis:

> Ludovic Courtès <ludo <at> gnu.org> writes:
>
>> There’s no such function, which is unfortunate.  But I agree it’s nicer
>> to preserve symlinks in this case.
>>
>> Perhaps we should actually do:
>>
>>   (with-directory-excursion libdir
>>     (symlink … "libbz2.so"))
>
> Thanks for the feedback everyone.  I settled on a slightly different
> solution, that first extracts the (full) soversion from the built
> library, then creates symlinks for each "sub-version".
>
> It assumes that the major version is "1".  That could be circumvented
> with a regex, but I'm not sure if it's worth the effort.
>
> As an added bonus, this also creates "libbz2.so.1" which was missing too.
>
> WDYT of this approach?  Can it be made simpler?

Sounds reasonable to me.  I have a suggestion:

> From 6c903b1da1ab64c4f52581c7debb82b65a6afb0e Mon Sep 17 00:00:00 2001
> From: Marius Bakke <mbakke <at> fastmail.com>
> Date: Mon, 26 Mar 2018 19:24:59 +0200
> Subject: [PATCH] gnu: bzip2: Provide libbz2.so and libbz2.so.1.
>
> Fixes <https://bugs.gnu.org/30006>.
>
> * gnu/packages/compression.scm (bzip2)[arguments]: Rework
> INSTALL-SHARED-LIBS-PHASE to manage all library symlinks.

[...]

> +               (with-directory-excursion libdir
> +                 (let ((libs (string-split soversion #\.))
> +                       (base "libbz2.so"))
> +                   (map (lambda (so)
> +                          (let ((next (string-append base "." so)))
> +                            (symlink next base)
> +                            (set! base next)))
> +                        libs)))

To avoid ‘set!’, I’d write it along these lines:

  ;; Create symlinks libbz2.so.1.2 -> libbz2.so.1, etc.
  (let loop ((base "libbz2.so")
             (numbers (string-split soversion #\.)))
    (unless (null? numbers)
      (let ((so-file (string-append base "." (car numbers))))
        (symlink so-file base)
        (loop so-file (cdr numbers)))))

Otherwise LGTM.

Thank you!

Ludo’.




Reply sent to Marius Bakke <mbakke <at> fastmail.com>:
You have taken responsibility. (Tue, 27 Mar 2018 20:50:01 GMT) Full text and rfc822 format available.

Notification sent to ludo <at> gnu.org (Ludovic Courtès):
bug acknowledged by developer. (Tue, 27 Mar 2018 20:50:02 GMT) Full text and rfc822 format available.

Message #37 received at 30006-done <at> debbugs.gnu.org (full text, mbox):

From: Marius Bakke <mbakke <at> fastmail.com>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: Mark H Weaver <mhw <at> netris.org>, 30006-done <at> debbugs.gnu.org,
 Tobias Geerinckx-Rice <me <at> tobias.gr>
Subject: Re: bug#30006: bzip2 does not provide libbz2.so
Date: Tue, 27 Mar 2018 22:49:19 +0200
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes:

> Hello Marius,
>
> Marius Bakke <mbakke <at> fastmail.com> skribis:
>
>> Ludovic Courtès <ludo <at> gnu.org> writes:
>>
>>> There’s no such function, which is unfortunate.  But I agree it’s nicer
>>> to preserve symlinks in this case.
>>>
>>> Perhaps we should actually do:
>>>
>>>   (with-directory-excursion libdir
>>>     (symlink … "libbz2.so"))
>>
>> Thanks for the feedback everyone.  I settled on a slightly different
>> solution, that first extracts the (full) soversion from the built
>> library, then creates symlinks for each "sub-version".
>>
>> It assumes that the major version is "1".  That could be circumvented
>> with a regex, but I'm not sure if it's worth the effort.
>>
>> As an added bonus, this also creates "libbz2.so.1" which was missing too.
>>
>> WDYT of this approach?  Can it be made simpler?
>
> Sounds reasonable to me.  I have a suggestion:

[...]

> To avoid ‘set!’, I’d write it along these lines:
>
>   ;; Create symlinks libbz2.so.1.2 -> libbz2.so.1, etc.
>   (let loop ((base "libbz2.so")
>              (numbers (string-split soversion #\.)))
>     (unless (null? numbers)
>       (let ((so-file (string-append base "." (car numbers))))
>         (symlink so-file base)
>         (loop so-file (cdr numbers)))))

This is much nicer, thanks!  I've pushed the patch with this improvement.
[signature.asc (application/pgp-signature, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 25 Apr 2018 11:24:03 GMT) Full text and rfc822 format available.

This bug report was last modified 5 years and 340 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.