* [Patch 0/2] MdeModulePkg/CapsuleApp: CleanGatherList() fix and UX enhancements
@ 2018-03-21 21:13 Michael D Kinney
2018-03-21 21:13 ` [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList() Michael D Kinney
2018-03-21 21:13 ` [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen Michael D Kinney
0 siblings, 2 replies; 5+ messages in thread
From: Michael D Kinney @ 2018-03-21 21:13 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiewen Yao, Star Zeng, Eric Dong
https://bugzilla.tianocore.org/show_bug.cgi?id=905
https://bugzilla.tianocore.org/show_bug.cgi?id=907
* Fix logic bug in CleanGatherList()
* Make sure BMP file is valid and fits in current GOP resolution
* Generate UX capsule with BMP centered in lower half of display
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Michael D Kinney (2):
MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList()
MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 67 ++++++++++++++++++++--
MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +-
2 files changed, 63 insertions(+), 7 deletions(-)
--
2.14.2.windows.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList()
2018-03-21 21:13 [Patch 0/2] MdeModulePkg/CapsuleApp: CleanGatherList() fix and UX enhancements Michael D Kinney
@ 2018-03-21 21:13 ` Michael D Kinney
2018-03-22 0:19 ` Yao, Jiewen
2018-03-21 21:13 ` [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen Michael D Kinney
1 sibling, 1 reply; 5+ messages in thread
From: Michael D Kinney @ 2018-03-21 21:13 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiewen Yao, Star Zeng, Eric Dong
https://bugzilla.tianocore.org/show_bug.cgi?id=905
Fix pointer math when more than one capsule is passed
to the CapsuleApp. Use the ContinuationPointer from
the last array entry instead of the first array entry.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
---
MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
index 393cfe5060..b9ff812179 100644
--- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
+++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
@@ -1,7 +1,7 @@
/** @file
A shell application that triggers capsule update process.
- Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -653,7 +653,7 @@ CleanGatherList (
break;
}
- TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr->Union.ContinuationPointer);
+ TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr[Index].Union.ContinuationPointer);
FreePool(TempBlockPtr1);
TempBlockPtr1 = TempBlockPtr2;
}
--
2.14.2.windows.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
2018-03-21 21:13 [Patch 0/2] MdeModulePkg/CapsuleApp: CleanGatherList() fix and UX enhancements Michael D Kinney
2018-03-21 21:13 ` [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList() Michael D Kinney
@ 2018-03-21 21:13 ` Michael D Kinney
2018-03-22 0:25 ` Yao, Jiewen
1 sibling, 1 reply; 5+ messages in thread
From: Michael D Kinney @ 2018-03-21 21:13 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiewen Yao, Star Zeng, Eric Dong
https://bugzilla.tianocore.org/show_bug.cgi?id=907
When -G option is used to convert a BMP file to a UX capsule,
the bitmap is centered horizontally and placed in the lower
half of the screen below the boot logo.
This matches examples shown in the following pages:
https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/user-experience-for-uefi-firmware-updates
https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-screen-components
Checks are also made to make sure the bitmap provided
fits in the current GOP mode.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
---
MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 63 ++++++++++++++++++++--
MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +-
2 files changed, 61 insertions(+), 5 deletions(-)
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
index b9ff812179..e1e48befc2 100644
--- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
+++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
@@ -21,6 +21,7 @@
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
+#include <Library/BmpSupportLib.h>
#include <Protocol/GraphicsOutput.h>
#include <Guid/GlobalVariable.h>
#include <Guid/CapsuleReport.h>
@@ -173,15 +174,21 @@ CreateBmpFmp (
EFI_DISPLAY_CAPSULE *DisplayCapsule;
EFI_STATUS Status;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
+ UINTN GopBltSize;
+ UINTN Height;
+ UINTN Width;
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
if (EFI_ERROR(Status)) {
Print(L"CapsuleApp: NO GOP is found.\n");
return EFI_UNSUPPORTED;
}
+ Info = Gop->Mode->Info;
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
- Print(L"HorizontalResolution - %d, ", Gop->Mode->Info->HorizontalResolution);
- Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);
+ Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
+ Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
@@ -207,6 +214,35 @@ CreateBmpFmp (
goto Done;
}
+ GopBlt = NULL;
+ Status = TranslateBmpToGopBlt (
+ BmpBuffer,
+ FileSize,
+ &GopBlt,
+ &GopBltSize,
+ &Height,
+ &Width
+ );
+ if (EFI_ERROR(Status)) {
+ Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
+ goto Done;
+ }
+ if (GopBlt != NULL) {
+ FreePool (GopBlt);
+ }
+ Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
+
+ if (Height > Info->VerticalResolution) {
+ Status = EFI_INVALID_PARAMETER;
+ Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
+ goto Done;
+ }
+ if (Width > Info->HorizontalResolution) {
+ Status = EFI_INVALID_PARAMETER;
+ Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
+ goto Done;
+ }
+
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
if (FullCapsuleBuffer == NULL) {
@@ -226,8 +262,27 @@ CreateBmpFmp (
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
DisplayCapsule->ImagePayload.Reserved = 0;
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
- DisplayCapsule->ImagePayload.OffsetX = 0;
- DisplayCapsule->ImagePayload.OffsetY = 0;
+
+ //
+ // Center the bitmap horizontally
+ //
+ DisplayCapsule->ImagePayload.OffsetX = (UINT32)((Info->HorizontalResolution - Width) / 2);
+
+ //
+ // Put bitmap 3/4 down the display. If bitmap is too tall, then align bottom
+ // of bitmap at bottom of display.
+ //
+ DisplayCapsule->ImagePayload.OffsetY =
+ MIN (
+ (UINT32)(Info->VerticalResolution - Height),
+ (UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)
+ );
+
+ Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
+ BmpName,
+ DisplayCapsule->ImagePayload.OffsetX,
+ DisplayCapsule->ImagePayload.OffsetY
+ );
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
index b06c4ea1bc..3a67c6b909 100644
--- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
+++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -4,7 +4,7 @@
# This application can trigger capsule update process. It can also
# generate capsule image, or dump capsule variable information.
#
-# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
@@ -63,6 +63,7 @@ [LibraryClasses]
UefiRuntimeServicesTableLib
UefiLib
PrintLib
+ BmpSupportLib
[UserExtensions.TianoCore."ExtraFiles"]
CapsuleAppExtra.uni
--
2.14.2.windows.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList()
2018-03-21 21:13 ` [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList() Michael D Kinney
@ 2018-03-22 0:19 ` Yao, Jiewen
0 siblings, 0 replies; 5+ messages in thread
From: Yao, Jiewen @ 2018-03-22 0:19 UTC (permalink / raw)
To: Kinney, Michael D, edk2-devel@lists.01.org; +Cc: Zeng, Star, Dong, Eric
Reviewed-by: jiewen.yao@intel.com
> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, March 22, 2018 5:13 AM
> To: edk2-devel@lists.01.org
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>;
> Dong, Eric <eric.dong@intel.com>
> Subject: [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in
> CleanGatherList()
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=905
>
> Fix pointer math when more than one capsule is passed
> to the CapsuleApp. Use the ContinuationPointer from
> the last array entry instead of the first array entry.
>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> ---
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> index 393cfe5060..b9ff812179 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> @@ -1,7 +1,7 @@
> /** @file
> A shell application that triggers capsule update process.
>
> - Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
> + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> This program and the accompanying materials
> are licensed and made available under the terms and conditions of the BSD
> License
> which accompanies this distribution. The full text of the license may be
> found at
> @@ -653,7 +653,7 @@ CleanGatherList (
> break;
> }
>
> - TempBlockPtr2 = (VOID *) ((UINTN)
> TempBlockPtr->Union.ContinuationPointer);
> + TempBlockPtr2 = (VOID *) ((UINTN)
> TempBlockPtr[Index].Union.ContinuationPointer);
> FreePool(TempBlockPtr1);
> TempBlockPtr1 = TempBlockPtr2;
> }
> --
> 2.14.2.windows.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
2018-03-21 21:13 ` [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen Michael D Kinney
@ 2018-03-22 0:25 ` Yao, Jiewen
0 siblings, 0 replies; 5+ messages in thread
From: Yao, Jiewen @ 2018-03-22 0:25 UTC (permalink / raw)
To: Kinney, Michael D, edk2-devel@lists.01.org; +Cc: Zeng, Star, Dong, Eric
Reviewed-by: Jiewen.yao@intel.com
> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, March 22, 2018 5:13 AM
> To: edk2-devel@lists.01.org
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>;
> Dong, Eric <eric.dong@intel.com>
> Subject: [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of
> screen
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=907
>
> When -G option is used to convert a BMP file to a UX capsule,
> the bitmap is centered horizontally and placed in the lower
> half of the screen below the boot logo.
>
> This matches examples shown in the following pages:
>
> https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/user-exp
> erience-for-uefi-firmware-updates
> https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-scr
> een-components
>
> Checks are also made to make sure the bitmap provided
> fits in the current GOP mode.
>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> ---
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 63
> ++++++++++++++++++++--
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +-
> 2 files changed, 61 insertions(+), 5 deletions(-)
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> index b9ff812179..e1e48befc2 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> @@ -21,6 +21,7 @@
> #include <Library/UefiRuntimeServicesTableLib.h>
> #include <Library/UefiLib.h>
> #include <Library/PrintLib.h>
> +#include <Library/BmpSupportLib.h>
> #include <Protocol/GraphicsOutput.h>
> #include <Guid/GlobalVariable.h>
> #include <Guid/CapsuleReport.h>
> @@ -173,15 +174,21 @@ CreateBmpFmp (
> EFI_DISPLAY_CAPSULE *DisplayCapsule;
> EFI_STATUS Status;
> EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
> + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
> + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
> + UINTN GopBltSize;
> + UINTN Height;
> + UINTN Width;
>
> Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL,
> (VOID **)&Gop);
> if (EFI_ERROR(Status)) {
> Print(L"CapsuleApp: NO GOP is found.\n");
> return EFI_UNSUPPORTED;
> }
> + Info = Gop->Mode->Info;
> Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
> - Print(L"HorizontalResolution - %d, ",
> Gop->Mode->Info->HorizontalResolution);
> - Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);
> + Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
> + Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
> // HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
> // VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
>
> @@ -207,6 +214,35 @@ CreateBmpFmp (
> goto Done;
> }
>
> + GopBlt = NULL;
> + Status = TranslateBmpToGopBlt (
> + BmpBuffer,
> + FileSize,
> + &GopBlt,
> + &GopBltSize,
> + &Height,
> + &Width
> + );
> + if (EFI_ERROR(Status)) {
> + Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
> + goto Done;
> + }
> + if (GopBlt != NULL) {
> + FreePool (GopBlt);
> + }
> + Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width,
> Height);
> +
> + if (Height > Info->VerticalResolution) {
> + Status = EFI_INVALID_PARAMETER;
> + Print(L"CapsuleApp: BMP image (%s) height is larger than current
> resolution.\n", BmpName);
> + goto Done;
> + }
> + if (Width > Info->HorizontalResolution) {
> + Status = EFI_INVALID_PARAMETER;
> + Print(L"CapsuleApp: BMP image (%s) width is larger than current
> resolution.\n", BmpName);
> + goto Done;
> + }
> +
> FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
> FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
> if (FullCapsuleBuffer == NULL) {
> @@ -226,8 +262,27 @@ CreateBmpFmp (
> DisplayCapsule->ImagePayload.ImageType = 0; // BMP
> DisplayCapsule->ImagePayload.Reserved = 0;
> DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
> - DisplayCapsule->ImagePayload.OffsetX = 0;
> - DisplayCapsule->ImagePayload.OffsetY = 0;
> +
> + //
> + // Center the bitmap horizontally
> + //
> + DisplayCapsule->ImagePayload.OffsetX =
> (UINT32)((Info->HorizontalResolution - Width) / 2);
> +
> + //
> + // Put bitmap 3/4 down the display. If bitmap is too tall, then align bottom
> + // of bitmap at bottom of display.
> + //
> + DisplayCapsule->ImagePayload.OffsetY =
> + MIN (
> + (UINT32)(Info->VerticalResolution - Height),
> + (UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)
> + );
> +
> + Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
> + BmpName,
> + DisplayCapsule->ImagePayload.OffsetX,
> + DisplayCapsule->ImagePayload.OffsetY
> + );
>
> CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> index b06c4ea1bc..3a67c6b909 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> @@ -4,7 +4,7 @@
> # This application can trigger capsule update process. It can also
> # generate capsule image, or dump capsule variable information.
> #
> -# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
> # This program and the accompanying materials
> # are licensed and made available under the terms and conditions of the BSD
> License
> # which accompanies this distribution. The full text of the license may be
> found at
> @@ -63,6 +63,7 @@ [LibraryClasses]
> UefiRuntimeServicesTableLib
> UefiLib
> PrintLib
> + BmpSupportLib
>
> [UserExtensions.TianoCore."ExtraFiles"]
> CapsuleAppExtra.uni
> --
> 2.14.2.windows.3
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-03-22 0:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-21 21:13 [Patch 0/2] MdeModulePkg/CapsuleApp: CleanGatherList() fix and UX enhancements Michael D Kinney
2018-03-21 21:13 ` [Patch 1/2] MdeModulePkg/CapsuleApp: Fix logic bug in CleanGatherList() Michael D Kinney
2018-03-22 0:19 ` Yao, Jiewen
2018-03-21 21:13 ` [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen Michael D Kinney
2018-03-22 0:25 ` Yao, Jiewen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox