Commit Graph
1657 Commits
Author SHA1 Message Date
Vincent Hilla cc38c15d33 Bug 2045423 - Use memcmp for nsTStringRepr<T>::Equals. r=xpcom-reviewers,hsivonen,nika
Differential Revision: https://phabricator.services.mozilla.com/D305579
2026-06-10 15:24:25 +00:00
serge-sans-paille fac0f5e1a8 Bug 2041298 - Comply with clang-tidy's modernize-use-nullptr check for xpcom/ r=xpcom-reviewers,emilio
Differential Revision: https://phabricator.services.mozilla.com/D301767
2026-05-25 15:20:21 +00:00
Emilio Cobos Álvarez e482f1fd6b Bug 2037178 - Account for mingw builds regarding path separators. r=sergesanspaille,firefox-build-system-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D298634
2026-05-06 13:51:31 +00:00
Emilio Cobos Álvarez 3d16d4f6da Bug 2035679 - Use -ffile-reproducible on windows. r=firefox-build-system-reviewers,sergesanspaille
This makes sure that __FILE__ path separators are consistent regardless
of the build host, which allows us to remove some chromium
base/location.cc changes.

Add a literal type to make using the appropriate separator less awkward.
Document it as matching __FILE__ syntax, which is what it is.

Differential Revision: https://phabricator.services.mozilla.com/D297316
2026-05-05 07:52:19 +00:00
serge-sans-paille 438b5cd118 Bug 2034839 - Make xpcom/ headers compatible with current static analysis r=xpcom-reviewers,mccr8
- use = default when relevant
- use = delete on public method instead of unimplemented private
- replace an invalid std::move by a correct std::forward (it's a
  bugpit!)

This matches the clang-tidy rules:

- https://clang.llvm.org/extra/clang-tidy/checks/modernize/use-equals-default.html
- https://clang.llvm.org/extra/clang-tidy/checks/modernize/use-equals-delete.html
- https://clang.llvm.org/extra/clang-tidy/checks/bugprone/move-forwarding-reference.html

That we already use on source files

Differential Revision: https://phabricator.services.mozilla.com/D296613
2026-04-28 16:15:17 +00:00
serge-sans-paille a1755db116 Bug 2034001 - Remove unused include of <ctype.h> r=profiler-reviewers,firefox-style-system-reviewers,emilio,canaltinova
Differential Revision: https://phabricator.services.mozilla.com/D295789
2026-04-25 07:09:20 +00:00
Alexandru Marc 52197ec05d Revert "Bug 2034001 - Remove unused include of <ctype.h> r=profiler-reviewers,firefox-style-system-reviewers,emilio,canaltinova"
This reverts commit e4406d802d.
2026-04-24 15:08:37 +00:00
serge-sans-paille e4406d802d Bug 2034001 - Remove unused include of <ctype.h> r=profiler-reviewers,firefox-style-system-reviewers,emilio,canaltinova
Differential Revision: https://phabricator.services.mozilla.com/D295789
2026-04-24 14:19:28 +00:00
Emilio Cobos Álvarez 83c0d7c47d Bug 2025279 - Make dependent atom strings keep whether they come from a literal or buffer. r=smaug,nika
After bug 2025271 we support unowned buffers, so we can do this, which
optimizes some conversions like the ones described in bug 1854446:

  https://searchfox.org/firefox-main/rev/7b74d86ca4ce65e82fdaa3095d2d39a26d3ac4f6/dom/base/CustomElementRegistry.cpp#274-276

Arguably those probably hit the inline string cache now, but still seems
like a common enough thing to do.

Differential Revision: https://phabricator.services.mozilla.com/D289180
2026-04-14 17:07:18 +00:00
Emilio Cobos Álvarez fe182cca64 Bug 2025271 - Simplify DOMString. r=smaug,nika,extension-reviewers,core-sessionstore-reviewers,dom-worker-reviewers,robwu,asuth
Make DOMString a regular nsAutoTString with some special methods for
performance in some hot getters. For that, we need to change a bit
nsTString:

 * Support for unowned buffers: Owned buffers now are represented by
   STRINGBUFFER|OWNED flags, rather than REFCOUNTED.

 * Inlining of the destructor: It showed up in profiles, it's also just
   a few instructions, so probably worth it. We could OOL the owned path
   I guess, if we wanted to.

 * Inlinling and reordering of NonVoidStringToJsval. Old code had
   special DOMString path inline with [buffer, literal, copy] paths,
   then out of line code with [literal, buffer, copy]. Instead,
   consolidate everything in a [buffer, literal, copy] inline path.
   Do the same for UTF8/Latin1 strings too for consistency.

Differential Revision: https://phabricator.services.mozilla.com/D288148
2026-04-13 09:33:54 +00:00
Jan Varga 38fdb8c3fa Bug 2028385 - Add nsTSubstring::ToUnsignedInteger64; r=xpcom-reviewers,nika
Add an unsigned 64-bit variant of ToInteger64.

This provides a helper for parsing uint64_t values from strings and completes
the existing set of integer conversion methods.

Differential Revision: https://phabricator.services.mozilla.com/D291416
2026-04-02 11:50:14 +00:00
Nika Layzell 5f0f9dd22a Bug 2020817 - Part 4: Annotate & clean up nsACString callers of BeginReading/Data, r=xpcom-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,toolkit-telemetry-reviewers-rotation,layout-reviewers,dom-worker-reviewers,gfx-reviewers,webgpu-reviewers,necko-reviewers,dom-core,smaug,handyman,emilio,pehrsons,kershaw,timhuang,edenchuang,padenot,bradwerth
This is a large number of largely mechanical changes. When possible, the code
was called to directly call `.get()` instead, performing the assertions
manually. In many places PromiseFlatCString() calls were added to dynamically
copy the strings into null terminated buffers if the string was not null
terminated.

Differential Revision: https://phabricator.services.mozilla.com/D286158
2026-03-25 08:23:04 +00:00
Nika Layzell 8cb61f45af Bug 2020817 - Part 3: Allow .get on nsTLiteralString, r=xpcom-reviewers,layout-reviewers,emilio
This was originally removed due to bug 1341513. Unfortunately this method can
still have occasional value in places which call use a macro which declares a
`nsLiteral[C]String`. This changes some of those callers over & re-adds the
`.get()`.

Differential Revision: https://phabricator.services.mozilla.com/D286157
2026-03-25 08:23:01 +00:00
serge-sans-paille 0c588214e4 Bug 2025707 - Use std::type_identity[_t] instead of our version r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D289446
2026-03-24 15:25:03 +00:00
Emilio Cobos Álvarez 6860b4361b Bug 2025571 - Downgrade some nsTSubstring asserts. r=nika,xpcom-reviewers
Some of the minor regressions that show in the patch for bug 2023628 are
helped by this.

Differential Revision: https://phabricator.services.mozilla.com/D289198
2026-03-24 08:01:44 +00:00
Sylvestre Ledru 6149f49299 Bug 2023419 - Remove Emacs/Vim modelines from xpcom/ r=emilio
replaced by .editorconfig
# ignore-this-changeset

Differential Revision: https://phabricator.services.mozilla.com/D287878
2026-03-16 17:22:07 +00:00
Emilio Cobos Álvarez 93aad2a661 Bug 2011226 - Allow print_stderr to also print formatted strings. r=padenot
This requires Debug.h to include fmt but that seems fine?

Differential Revision: https://phabricator.services.mozilla.com/D279530
2026-01-19 15:15:34 +00:00
Emilio Cobos Álvarez 077d88e977 Bug 2011213 - Remove FMT_STRING() usage. r=padenot
Should not be needed now that we build with C++20.

Differential Revision: https://phabricator.services.mozilla.com/D279521
2026-01-19 15:12:33 +00:00
serge-sans-paille 0257c83b39 Bug 2009953 - Do not use reserved identifiers for macro guard in xpcom r=xpcom-reviewers,emilio
Differential Revision: https://phabricator.services.mozilla.com/D278792
2026-01-16 15:12:05 +00:00
serge-sans-paille 18da74b20f Bug 2008695 - Remove unused <string.h> inclusion and make sure we don't regress on those r=ahal,necko-reviewers,media-playback-reviewers,webrtc-reviewers,win-reviewers,toolkit-telemetry-reviewers,firefox-svg-reviewers,padenot,gstoll,kershaw,ng
Differential Revision: https://phabricator.services.mozilla.com/D277979
2026-01-13 17:21:53 +00:00
serge-sans-paille 93496ffd0e Bug 2008694 - Remove unused <stdint.h> inclusion and make sure we don't regress on those r=webrtc-reviewers,layout-reviewers,manuel,emilio,ng
Differential Revision: https://phabricator.services.mozilla.com/D277978
2026-01-07 14:01:27 +00:00
serge-sans-paille 65808e644b Bug 2008691 - Remove unused <stdarg.h> inclusion and make sure we don't regress on those r=necko-reviewers,media-playback-reviewers,webrtc-reviewers,padenot,kershaw,ng
Differential Revision: https://phabricator.services.mozilla.com/D277976
2026-01-07 09:46:26 +00:00
serge-sans-paille da7ceec18d Bug 1999703 - Remove unused STL header inclusions in xpcom/** r=nika,xpcom-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D272276
2025-11-12 18:37:37 +00:00
Chris Peterson bcd6c96a05 Bug 1997025 - Replace u8"" string literals in mfbt and xpcom tests. r=xpcom-reviewers,emilio
u8"" strings have type const char[] in C++17, but type const char8_t[] in C++20. Since most Firefox code is written assuming char or char16_t strings, char8_t strings cause type mismatches that would require additional overloads or string conversions.

Because Firefox .cpp files are compiled as UTF-8, "" string literals are already UTF-8 encoded and the explicit u8 prefix is unnecessary.

By removing the u8"" string literals in the MFBT and xpcom tests, we can remove nsTStringRepr's Equals() overloads for char8_t. They are now unused and casting a char8_t* string pointer to a char* string pointer is UB.

Differential Revision: https://phabricator.services.mozilla.com/D270453
2025-10-30 17:11:01 +00:00
serge-sans-paille 112b4ba840 Bug 1996697 - Remove unused mfbt inclusion in xpcom/** r=emilio,media-playback-reviewers,profiler-reviewers,profiles-reviewers,chunmin,canaltinova,mossop
Differential Revision: https://phabricator.services.mozilla.com/D270267
2025-10-28 14:33:40 +00:00
serge-sans-paille 8706f4e075 Bug 1990021 - Add MOZ_LIFETIME_BOUND annotations to nsTStringRepr r=nika
Differential Revision: https://phabricator.services.mozilla.com/D267669
2025-10-22 09:00:55 +00:00
serge-sans-paille 7662b3abdc Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch
It is replaced by a standard-conforming cast to (void) which is
understood the same by the compiler.

In some cases this could be replaced by `[[maybe_unused]]` but for
expression whose value is ignored, this requires storing to a temporary
variable first, so not going that way.

One notable change is that marking an object of type already_AddRefed as
unused used to implicitly leak memory. This is now made explicit.

Most of the heavy lifting was done through:

    $ git grep -l '\<Unused\> <<' | xargs sed -i -e 's/Unused << /(void)/g'
    $ git grep -l mozilla/Unused.h | xargs sed -i -e '/mozilla\/Unused.h/ d'

Differential Revision: https://phabricator.services.mozilla.com/D268706
2025-10-21 19:36:01 +00:00
Cristina Horotan 8a1b1970b7 Revert "Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch" for causing Gtest failures on AlreadyAddRefed.h
This reverts commit e98adca292.
2025-10-21 16:16:29 +00:00
serge-sans-paille e98adca292 Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch
It is replaced by a standard-conforming cast to (void) which is
understood the same by the compiler.

In some cases this could be replaced by `[[maybe_unused]]` but for
expression whose value is ignored, this requires storing to a temporary
variable first, so not going that way.

One notable change is that marking an object of type already_AddRefed as
unused used to implicitly leak memory. This is now made explicit.

Most of the heavy lifting was done through:

    $ git grep -l '\<Unused\> <<' | xargs sed -i -e 's/Unused << /(void)/g'
    $ git grep -l mozilla/Unused.h | xargs sed -i -e '/mozilla\/Unused.h/ d'

Differential Revision: https://phabricator.services.mozilla.com/D268706
2025-10-21 15:05:17 +00:00
Cristina Horotan aab924e90d Revert "Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch" for causing build bustage at nsBrowserApp.cpp
This reverts commit fd0ffa193c.
2025-10-21 10:44:13 +00:00
serge-sans-paille fd0ffa193c Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch
It is replaced by a standard-conforming cast to (void) which is
understood the same by the compiler.

In some cases this could be replaced by `[[maybe_unused]]` but for
expression whose value is ignored, this requires storing to a temporary
variable first, so not going that way.

One notable change is that marking an object of type already_AddRefed as
unused used to implicitly leak memory. This is now made explicit.

Most of the heavy lifting was done through:

    $ git grep -l '\<Unused\> <<' | xargs sed -i -e 's/Unused << /(void)/g'
    $ git grep -l mozilla/Unused.h | xargs sed -i -e '/mozilla\/Unused.h/ d'

Differential Revision: https://phabricator.services.mozilla.com/D268706
2025-10-21 09:44:11 +00:00
Narcis Beleuzu e1e6bbb1c9 Revert "Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch" for causing bustages on Document.cpp
This reverts commit b23c15e927.
2025-10-21 06:34:58 +00:00
serge-sans-paille b23c15e927 Bug 1994397 - Remove obsolete Unused.h header r=emilio,tschuster,geckoview-reviewers,extension-reviewers,application-update-reviewers,media-playback-reviewers,webrtc-reviewers,cookie-reviewers,places-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,permissions-reviewers,profiles-reviewers,toolkit-telemetry-reviewers,firefox-style-system-reviewers,firefox-svg-reviewers,layout-reviewers,timhuang,gstoll,TravisLong,bytesized,mstange,karlt,robwu,pehrsons,m_kato,jari,jhirsch
It is replaced by a standard-conforming cast to (void) which is
understood the same by the compiler.

In some cases this could be replaced by `[[maybe_unused]]` but for
expression whose value is ignored, this requires storing to a temporary
variable first, so not going that way.

One notable change is that marking an object of type already_AddRefed as
unused used to implicitly leak memory. This is now made explicit.

Most of the heavy lifting was done through:

    $ git grep -l '\<Unused\> <<' | xargs sed -i -e 's/Unused << /(void)/g'
    $ git grep -l mozilla/Unused.h | xargs sed -i -e '/mozilla\/Unused.h/ d'

Differential Revision: https://phabricator.services.mozilla.com/D268706
2025-10-21 06:01:36 +00:00
serge-sans-paille dddfa6d699 Bug 1769188 - Replace all instances of MOZ_TRY_VAR by MOZ_TRY r=emilio,profiler-reviewers,win-reviewers,firefox-style-system-reviewers,layout-reviewers,dom-worker-reviewers,canaltinova,gstoll
According to the doc of mfbt/Try.h, MOZ_TRY_VAR is obsolete. Yet it was
used a lot across the code base.

Solely relying on MOZ_TRY is both nicer to the eye and more generic, as
it allows setting variable that don't have a default constructor, and
event sometimes more efficient, if the default constructor is
non-trivial.

Differential Revision: https://phabricator.services.mozilla.com/D268466
2025-10-14 15:15:14 +00:00
serge-sans-paille a2f7844ff1 Bug 1991860 - Modernize mfbt/EndianUtils.h r=emilio,necko-reviewers,media-playback-reviewers,padenot
- remove unused headers
- __builtin_bswap* is always available for supported compilers
- do not use union for type punning

Differential Revision: https://phabricator.services.mozilla.com/D267305
2025-10-03 09:54:09 +00:00
serge-sans-paille 0a16df7a28 Bug 1991396 - Cleanup type definition in Char16.h r=emilio
Also cleanup included headers while we're at it.

Differential Revision: https://phabricator.services.mozilla.com/D266654
2025-10-01 08:34:43 +00:00
Sylvestre Ledru 637cccbe8d Bug 1519636 - Reformat recent changes to the Google coding style r=emilio
Generated with clang-format version 19.1.7 (taskcluster-ImeD-jyDRx-_6soViZ_luw)

# ignore-this-changeset

Differential Revision: https://phabricator.services.mozilla.com/D266586
2025-09-30 11:54:45 +00:00
serge-sans-paille 795bee25ab Bug 1967896 - Remove some MOZ_LIFETIME_BOUND qualifiers for nsTDependentSubstring r=xpcom-reviewers,nika
Clang is not able of transitively forward lifetime from a gsl::pointer
to a gsl::pointer.

Differential Revision: https://phabricator.services.mozilla.com/D251148
2025-06-17 05:26:40 +00:00
pstanciu 12aaef2d5a Revert "Bug 1967896 - Flag nsTLiteralString as MOZ_OWNER r=nika" for causing Build Bustages on nsHttpChannelAuthProvider.cpp
This reverts commit 79775f1eae.
2025-05-23 14:16:13 +00:00
serge-sans-paille 79775f1eae Bug 1967896 - Flag nsTLiteralString as MOZ_OWNER r=nika
nsTLiteralString is contractually always associated to global storage,
so it's conceptually a MOZ_OWNER even if it's actually a view.

Differential Revision: https://phabricator.services.mozilla.com/D250724
2025-05-23 13:24:43 +00:00
serge-sans-paille ed1122ceea Bug 1967374 - Use MOZ_LIFETIME_CAPTURE_BY instead of MOZ_LIFETIME_BOUND where it makes sense r=nika
Differential Revision: https://phabricator.services.mozilla.com/D250312
2025-05-21 15:36:13 +00:00
serge-sans-paille 41e238ca0a Bug 1953243 - introduce gsl::Pointer and gsl::Owner semantic to some mfbt / xpcom types r=nika,xpcom-reviewers
The combination of [[gsl::Owner]], [[gsl::Pointer]] and
[[clang::lifetimebound]] attributes makes it possible for clang to
detect some basic form of lifetime issues.

Those are expressed in terms of MOZ_GSL_OWNER, MOZ_GSL_POINTER and
MOZ_LIFETIME_BOUND.

Differential Revision: https://phabricator.services.mozilla.com/D241077
2025-05-19 09:48:28 +00:00
Sylvestre Ledru 8ae54ea4f9 Bug 1519636 - Reformat recent changes to the Google coding style r=geckoview-reviewers,profiler-reviewers,win-reviewers,dom-storage-reviewers,nalexander,gstoll,tcampbell,janv,julienw
Updated with clang-format version 19.1.7 (taskcluster-DYvBxDZJRVqTi8E7pTSJAQ)

Differential Revision: https://phabricator.services.mozilla.com/D249880
2025-05-17 19:11:13 +00:00
Nika Layzell fb603791ab Bug 1944365 - Part 2: Add a fallible version of the substring tuple replace overload, r=xpcom-reviewers,mccr8
This overload removes the need for an extra copy when concatenating
multiple `nsTSubstring`s together to pass to a fallible `Replace`
function.

This slightly reduces the quality of the allocation failure error
reporting, as the infallible variant may report the wrong size if the
failed allocation is the tuple-flattening allocation in the case where
the tuple is dependent on the mutating string buffer. I expect this is
an uncommon situation, and felt that the extra code complexity from
duplicating the codepaths was not worth the OOM failure size accuracy.

Differential Revision: https://phabricator.services.mozilla.com/D236273
2025-02-10 15:34:19 +00:00
Manuel Bucher ff62c7ef81 Bug 1931316 - Update nsTSubstring::SetCapacity documentation to not mention outdated special case of calling AppendLiteral on empty string r=xpcom-reviewers,emilio DONTBUILD
Behavior changed in Bug 1487606 with test covering the case:
gTest "Strings.append_literal_with_capacity"

Differential Revision: https://phabricator.services.mozilla.com/D229635
2024-11-20 16:19:01 +00:00
serge-sans-paille aee8b0d98b Bug 1920080 - Make nsCString default constructor constexpr r=glandium,xpcom-reviewers,emilio
This make it possible to flag a few MOZ_RUNINIT variables as
MOZ_CONSTINIT.

Differential Revision: https://phabricator.services.mozilla.com/D227451
2024-11-13 19:39:45 +00:00
Norisz Fay 94a225c4ec Backed out changeset 75935042f60b (bug 1920080) for causing assertion failure on FetchUtil.cpp 2024-11-13 01:47:14 +02:00
serge-sans-paille 52e61eb6ac Bug 1920080 - Make nsCString default constructor constexpr r=glandium,xpcom-reviewers,emilio
This make it possible to flag a few MOZ_RUNINIT variables as
MOZ_CONSTINIT.

Differential Revision: https://phabricator.services.mozilla.com/D227451
2024-11-12 22:08:02 +00:00
Otto Länd 730b13b123 Bug 1717448: apply code formatting via Lando
# ignore-this-changeset
2024-10-21 13:44:00 +00:00
Nika Layzell 5a28f35835 Bug 1717448 - Integrate {fmt} with nsString. r=xpcom-reviewers,nika,mccr8
Differential Revision: https://phabricator.services.mozilla.com/D217721
2024-10-21 12:54:56 +00:00