Date   

[PATCH v7 0/5] Use RngLib instead of TimerLib for OpensslLib

Matthew Carlson
 

From: Matthew Carlson <macarl@microsoft.com>

Hello all,

This patch contains a fix for Bugzilla 1871.
There's been a good bit of community discussion around the topic,
so below follows a general overview of the discussion and what this patch does.

This is the seventh iteration of this patch series, focused on code style and a
few functions being renamed to comply with style.

Back in Devel message#40590 (https://edk2.groups.io/g/devel/message/40590)
around the patch series that updates OpenSSL to 1.1.1b, a comment was made
that suggested that platforms be in charge of the entropy/randomness that
is provided to OpenSSL as currently the entropry source seems to be a
hand-rolled random number generator that uses the PerformanceCounter from
TimerLib. This causes OpenSSL to depend on TimerLib, which is often platform
specific. In addition to being a potentially weaker source of randomness,
this also poses a challenge to compile BaseCryptLibOnProtocol with a platform-
agnostic version of TimerLib that works universally.

The solution here is to allow platform to specify their source of entropy in
addition to providing two new RngLibs: one that uses the TimerLib as well as
one that uses RngProtocol to provide randomness. Then the decision to use
RDRAND or other entropy sources is up to the platform. Mixing various entropy
sources is the onus of the platform. It has been suggested on Devel#40590 and
BZ#1871 that there should be mixing of the PerformanceCounter and RDRAND using
something similar to the yarrow alogirthm that FreeBSD uses for example. This
patch series doesn't offer an RngLib that offers that sort of mixing as the
ultimate source of random is defined by the platform.

This patch series offers three benefits:
1. Dependency reduction: Removes the need for a platform specific timer
library. We publish a single binary used on numerous platforms for
crypto and the introduced timer lib dependency caused issues because we
could not fulfill our platform needs with one library instance.

2. Code maintenance: Removing this additional code and leveraging an existing
library within Edk2 means less code to maintain.

3. Platform defined quality: A platform can choose which instance to use and
the implications of that instance.

This patch series seeks to address five seperate issues.
1) Use RngLib interface to generate random entropy in rand_pool
2) Remove dependency on TimerLib in OpensslLib
3) Add a new version of RngLib implemented by TimerLib
4) Add a new version of RngLib implemented by EFI_RNG_PROTOCOL
5) Add RngLib to platforms in EDK2 such as ArmVirtPkg and OvmfPkg

Since this changes the dependencies of OpenSSL, this has the potential of being
a breaking change for platforms in edk2-platforms. The easiest solution is just
to use the RngLib that uses the TimerLib as this closely mimics the behavior of
OpenSSL prior to this patch series. There is also a null version of RngLib for
CI environments that need this change
(https://edk2.groups.io/g/devel/message/50432). Though it should be pointed out
that in CI environments, the null version of BaseCryptLib or OpenSSL should be
used.

In addition, it has been suggested that
1) Add AsmRdSeed to BaseLib.
2) Update BaseRngLib to use AsmRdSeed() for the random number,
if RdSeed is supported (CPUID BIT18)

However, this is largely out of scope for this particular patch series and
will likely need to be in a follow-up series later.

It is my understanding that the OpenSSL code uses the values provided as a
randomness pool rather than a seed or random numbers itself, so the
requirements for randomness are not quite as stringent as other applications.

For the ArmVirtPkg and OvmfPkg platforms, the patch series here just adds in
the TimerLib based RngLib as that is similar to the functionality of before.
It is added as a common library so any custom RngLib defined in the DSC
should take precedence over the TimerLibRngLib.

Ref: https://github.com/tianocore/edk2/pull/845
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1871

Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Anthony Perard <anthony.perard@citrix.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Julien Grall <julien@xen.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>

Signed-off-by: Matthew Carlson <matthewfcarlson@gmail.com>


Matthew Carlson (5):
MdePkg: TimerRngLib: Added RngLib that uses TimerLib
MdePkg: BaseRngLibDxe: Add RngLib that uses RngDxe
OvmfPkg: Add RngLib based on TimerLib for Crypto
ArmVirtPkg: Add RngLib based on TimerLib for CryptoPkg
CryptoPkg: OpensslLib: Use RngLib to generate entropy in rand_pool

CryptoPkg/Library/OpensslLib/rand_pool.c | 265 +++++---------------
CryptoPkg/Library/OpensslLib/rand_pool_noise.c | 29 ---
CryptoPkg/Library/OpensslLib/rand_pool_noise_tsc.c | 43 ----
MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c | 188 ++++++++++++++
MdePkg/Library/DxeRngLib/DxeRngLib.c | 206 +++++++++++++++
ArmVirtPkg/ArmVirt.dsc.inc | 1 +
CryptoPkg/CryptoPkg.dsc | 1 +
CryptoPkg/Library/OpensslLib/OpensslLib.inf | 15 +-
CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 15 +-
CryptoPkg/Library/OpensslLib/rand_pool_noise.h | 29 ---
MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf | 36 +++
MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni | 15 ++
MdePkg/Library/DxeRngLib/DxeRngLib.inf | 37 +++
MdePkg/MdePkg.dsc | 5 +-
OvmfPkg/Bhyve/BhyvePkgX64.dsc | 1 +
OvmfPkg/OvmfPkgIa32.dsc | 1 +
OvmfPkg/OvmfPkgIa32X64.dsc | 1 +
OvmfPkg/OvmfPkgX64.dsc | 1 +
OvmfPkg/OvmfXen.dsc | 1 +
19 files changed, 555 insertions(+), 335 deletions(-)
delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise.c
delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise_tsc.c
create mode 100644 MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c
create mode 100644 MdePkg/Library/DxeRngLib/DxeRngLib.c
delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise.h
create mode 100644 MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
create mode 100644 MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni
create mode 100644 MdePkg/Library/DxeRngLib/DxeRngLib.inf

--
2.27.0.windows.1


Re: [PATCH v6 0/5] Use RngLib instead of TimerLib for OpensslLib

Matthew Carlson
 

I'll file a new bugzilla.


On Thu, Aug 13, 2020 at 8:15 AM Yao, Jiewen <jiewen.yao@...> wrote:
Thanks Matthew.

I am OK, if you want to address the RDSEED in follow-up patch series.

Would you please file a new Bugzilla to record this, so we won't lose the information ?



> -----Original Message-----
> From: matthewfcarlson@... <matthewfcarlson@...>
> Sent: Thursday, August 13, 2020 6:44 AM
> To: devel@edk2.groups.io
> Cc: Ard Biesheuvel <ard.biesheuvel@...>; Anthony Perard
> <anthony.perard@...>; Yao, Jiewen <jiewen.yao@...>; Wang,
> Jian J <jian.j.wang@...>; Julien Grall <julien@...>; Justen, Jordan L
> <jordan.l.justen@...>; Laszlo Ersek <lersek@...>; Gao, Liming
> <liming.gao@...>; Leif Lindholm <leif@...>; Kinney, Michael D
> <michael.d.kinney@...>; Lu, XiaoyuX <xiaoyux.lu@...>; Liu,
> Zhiguang <zhiguang.liu@...>; Sean Brogan
> <sean.brogan@...>; Matthew Carlson
> <matthewfcarlson@...>
> Subject: [PATCH v6 0/5] Use RngLib instead of TimerLib for OpensslLib
>
> From: Matthew Carlson <macarl@...>
>
> Hello all,
>
> This patch contains a fix for Bugzilla 1871.
> There's been a good bit of community discussion around the topic,
> so below follows a general overview of the discussion and what this patch does.
>
> Back in Devel message#40590 (https://edk2.groups.io/g/devel/message/40590)
> around the patch series that updates OpenSSL to 1.1.1b, a comment was made
> that suggested that platforms be in charge of the entropy/randomness that
> is provided to OpenSSL as currently the entropry source seems to be a
> hand-rolled random number generator that uses the PerformanceCounter from
> TimerLib. This causes OpenSSL to depend on TimerLib, which is often platform
> specific. In addition to being a potentially weaker source of randomness,
> this also poses a challenge to compile BaseCryptLibOnProtocol with a platform-
> agnostic version of TimerLib that works universally.
>
> The solution here is to allow platform to specify their source of entropy in
> addition to providing two new RngLibs: one that uses the TimerLib as well as
> one that uses RngProtocol to provide randomness. Then the decision to use
> RDRAND or other entropy sources is up to the platform. Mixing various entropy
> sources is the onus of the platform. It has been suggested on Devel#40590 and
> BZ#1871 that there should be mixing of the PerformanceCounter and RDRAND
> using
> something similar to the yarrow alogirthm that FreeBSD uses for example. This
> patch series doesn't offer an RngLib that offers that sort of mixing as the
> ultimate source of random is defined by the platform.
>
> This patch series offers three benefits:
> 1. Dependency reduction: Removes the need for a platform specific timer
> library.  We publish a single binary used on numerous platforms for
> crypto and the introduced timer lib dependency caused issues because we
> could not fulfill our platform needs with one library instance.
>
> 2. Code maintenance: Removing this additional code and leveraging an existing
> library within Edk2 means less code to maintain.
>
> 3. Platform defined quality: A platform can choose which instance to use and
> the implications of that instance.
>
> This patch series seeks to address five seperate issues.
>   1) Use RngLib interface to generate random entropy in rand_pool
>   2) Remove dependency on TimerLib in OpensslLib
>   3) Add a new version of RngLib implemented by TimerLib
>   4) Add a new version of RngLib implemented by EFI_RNG_PROTOCOL
>   5) Add RngLib to platforms in EDK2 such as ArmVirtPkg and OvmfPkg
>
> Since this changes the dependencies of OpenSSL, this has the potential of being
> a breaking change for platforms in edk2-platforms. The easiest solution is just
> to use the RngLib that uses the TimerLib as this closely mimics the behavior of
> OpenSSL prior to this patch series. There is also a null version of RngLib for
> CI environments that need this change
> (https://edk2.groups.io/g/devel/message/50432). Though it should be pointed
> out
> that in CI environments, the null version of BaseCryptLib or OpenSSL should be
> used.
>
> In addition, it has been suggested that
> 1) Add AsmRdSeed to BaseLib.
> 2) Update BaseRngLib to use AsmRdSeed() for the random number,
> if RdSeed is supported (CPUID BIT18)
>
> However, this is largely out of scope for this particular patch series and
> will likely need to be in a follow-up series later.
>
> It is my understanding that the OpenSSL code uses the values provided as a
> randomness pool rather than a seed or random numbers itself, so the
> requirements for randomness are not quite as stringent as other applications.
>
> For the ArmVirtPkg and OvmfPkg platforms, the patch series here just adds in
> the TimerLib based RngLib as that is similar to the functionality of before.
> It is added as a common library so any custom RngLib defined in the DSC
> should take precedence over the TimerLibRngLib.
>
> Ref: https://github.com/tianocore/edk2/pull/845
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1871
>
> Cc: Ard Biesheuvel <ard.biesheuvel@...>
> Cc: Anthony Perard <anthony.perard@...>
> Cc: Jiewen Yao <jiewen.yao@...>
> Cc: Jian J Wang <jian.j.wang@...>
> Cc: Julien Grall <julien@...>
> Cc: Jordan Justen <jordan.l.justen@...>
> Cc: Laszlo Ersek <lersek@...>
> Cc: Liming Gao <liming.gao@...>
> Cc: Leif Lindholm <leif@...>
> Cc: Michael D Kinney <michael.d.kinney@...>
> Cc: Xiaoyu Lu <xiaoyux.lu@...>
> Cc: Zhiguang Liu <zhiguang.liu@...>
> Cc: Sean Brogan <sean.brogan@...>
>
> Signed-off-by: Matthew Carlson <matthewfcarlson@...>
>
>
> Matthew Carlson (5):
>   MdePkg: TimerRngLib: Added RngLib that uses TimerLib
>   MdePkg: BaseRngLibDxe: Add RngLib that uses RngDxe
>   OvmfPkg: Add RngLib based on TimerLib for Crypto
>   ArmVirtPkg: Add RngLib based on TimerLib for CryptoPkg
>   CryptoPkg: OpensslLib: Use RngLib to generate entropy in rand_pool
>
>  CryptoPkg/Library/OpensslLib/rand_pool.c                 | 203 ++------------------
>  CryptoPkg/Library/OpensslLib/rand_pool_noise.c           |  29 ---
>  CryptoPkg/Library/OpensslLib/rand_pool_noise_tsc.c       |  43 -----
>  MdePkg/Library/BaseRngLibDxe/RngDxeLib.c                 | 200
> +++++++++++++++++++
>  MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c          | 187
> ++++++++++++++++++
>  ArmVirtPkg/ArmVirt.dsc.inc                               |   1 +
>  CryptoPkg/CryptoPkg.dsc                                  |   1 +
>  CryptoPkg/Library/OpensslLib/OpensslLib.inf              |  15 +-
>  CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf        |  15 +-
>  CryptoPkg/Library/OpensslLib/rand_pool_noise.h           |  29 ---
>  MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf           |  38 ++++
>  MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf |  40 ++++
>  MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni |  17 ++
>  MdePkg/MdePkg.dsc                                        |   5 +-
>  OvmfPkg/Bhyve/BhyvePkgX64.dsc                            |   1 +
>  OvmfPkg/OvmfPkgIa32.dsc                                  |   1 +
>  OvmfPkg/OvmfPkgIa32X64.dsc                               |   1 +
>  OvmfPkg/OvmfPkgX64.dsc                                   |   1 +
>  OvmfPkg/OvmfXen.dsc                                      |   1 +
>  19 files changed, 514 insertions(+), 314 deletions(-)
>  delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise.c
>  delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise_tsc.c
>  create mode 100644 MdePkg/Library/BaseRngLibDxe/RngDxeLib.c
>  create mode 100644 MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c
>  delete mode 100644 CryptoPkg/Library/OpensslLib/rand_pool_noise.h
>  create mode 100644 MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf
>  create mode 100644
> MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
>  create mode 100644
> MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni
>
> --
> 2.27.0.windows.1


Re: [PATCH v6 2/5] MdePkg: BaseRngLibDxe: Add RngLib that uses RngDxe

Matthew Carlson
 

Thanks for the feedback.

I've addressed all the comments except the one about the success handling pattern. I think the algorithms it requests are made in a specific order so that it can make some promising regarding the validity of its random number generation. That said, this is code that another coworker at Microsoft wrote, so I'm not 100% sure why it does that this particular way. 

Do you have a suggestion about what sort of algorithm should be selected? Perhaps just using the default every time? Keep the pattern as it stands now but add a final check to use the default if the previous ones fail?

I kept in the check for NULL since any inputs should be sanitized regardless of where they're coming from. I'm open to adding an assert there as well to help debugability. 

-Matthew Carlson


On Thu, Aug 13, 2020 at 5:19 AM Ard Biesheuvel <ard.biesheuvel@...> wrote:
On 8/13/20 12:43 AM, matthewfcarlson@... wrote:
> From: Matthew Carlson <macarl@...>
>
> This adds a RngLib that uses the RngProtocol to provide randomness.
> This means that the RngLib is meant to be used with DXE_DRIVERS.
>
> Ref: https://github.com/tianocore/edk2/pull/845
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1871
>
> Cc: Ard Biesheuvel <ard.biesheuvel@...>
> Cc: Michael D Kinney <michael.d.kinney@...>
> Cc: Liming Gao <liming.gao@...>
> Cc: Zhiguang Liu <zhiguang.liu@...>
> Signed-off-by: Matthew Carlson <matthewfcarlson@...>
> ---
>   MdePkg/Library/BaseRngLibDxe/RngDxeLib.c       | 200 ++++++++++++++++++++
>   MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf |  38 ++++
>   MdePkg/MdePkg.dsc                              |   4 +-
>   3 files changed, 241 insertions(+), 1 deletion(-)
>
> diff --git a/MdePkg/Library/BaseRngLibDxe/RngDxeLib.c b/MdePkg/Library/BaseRngLibDxe/RngDxeLib.c
> new file mode 100644
> index 000000000000..8ee29329de13
> --- /dev/null
> +++ b/MdePkg/Library/BaseRngLibDxe/RngDxeLib.c
> @@ -0,0 +1,200 @@
> +/** @file
> + Provides an implementation of the library class RngLib that uses the Rng protocol.
> +
> +Copyright (c) Microsoft Corporation. All rights reserved.
> +SPDX-License-Identifier: BSD-2-Clause-Patent

Please use matching indentation

> +
> +**/
> +#include <Uefi.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/RngLib.h>
> +#include <Protocol/Rng.h>
> +
> +/**
> +Routine Description:
> +
> +    Generates a random number via the NIST
> +    800-9A algorithm.  Refer to
> +    http://csrc.nist.gov/groups/STM/cavp/documents/drbg/DRBGVS.pdf
> +    for more information.
> +
> +    Arguments:
> +
> +    Buffer      -- Buffer to receive the random number.
> +    BufferSize  -- Number of bytes in Buffer.
> +
> +Return Value:
> +
> +    EFI_SUCCESS or underlying failure code.
> +
> +**/

STATIC ?

> +EFI_STATUS
> +EFIAPI
> +GenerateRandomNumberViaNist800Algorithm(

space before (

> +  OUT UINT8* Buffer,

put * on the rhs

> +  IN  UINTN  BufferSize
> +  )
> +{
> +  EFI_STATUS        Status;
> +  EFI_RNG_PROTOCOL* RngProtocol;

likewise

> +
> +  RngProtocol = NULL;
> +
> +  if (Buffer == NULL) {
> +      DEBUG((DEBUG_ERROR, "[%a] Buffer == NULL.\n", __FUNCTION__));

Could you drop the [] around the function name? This is rather
unidiomatic for EDK2

> +      return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = gBS->LocateProtocol(&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol);

Space before (

> +  if (EFI_ERROR(Status) || RngProtocol == NULL) {

Space before (. Also, I think the second condition could be an ASSERT()

> +      DEBUG((DEBUG_ERROR, "[%a] Could not locate RNG prototocol, Status = %r\n", __FUNCTION__, Status));
> +      return Status;
> +  }
> +
> +  Status = RngProtocol->GetRNG(RngProtocol, &gEfiRngAlgorithmSp80090Ctr256Guid, BufferSize, Buffer);
> +  DEBUG((DEBUG_INFO, "[%a] GetRNG algorithm CTR-256 - Status = %r\n", __FUNCTION__, Status)); > +  if(!EFI_ERROR(Status)) {

Space after 'if' and before (.

Please do a pass over all the patches, I will stop pointing out the
spacing around ( from this point.


> +    return Status;
> +  }
> +
> +  Status = RngProtocol->GetRNG(RngProtocol, &gEfiRngAlgorithmSp80090Hmac256Guid, BufferSize, Buffer);
> +  DEBUG((DEBUG_INFO, "[%a] GetRNG algorithm HMAC-256 - Status = %r\n", __FUNCTION__, Status));
> +  if(!EFI_ERROR(Status)) {
> +    return Status;
> +  }
> +
> +  Status = RngProtocol->GetRNG(RngProtocol, &gEfiRngAlgorithmSp80090Hash256Guid, BufferSize, Buffer);
> +  DEBUG((DEBUG_INFO, "[%a] GetRNG algorithm Hash-256 - Status = %r\n", __FUNCTION__, Status));
> +  if(!EFI_ERROR(Status)) {
> +    return Status;
> +  }

I don't like this 'success handling' pattern tbh. Also, why are these
algorithms singled out like this? EFI_RNG_PROTOCOL typically has a
default algorithm, and even raw entropy is perfectly suitable for key
generation (although perhaps slightly wasteful in some case)

I am aware there is a check in the RdRand RngDxe that refuses to return
32 bytes from the raw algorithm, but this is simply a misinterpretation
of the spec that we should fix at some point,

> +  // If we get to this point, we have failed
> +  DEBUG((DEBUG_ERROR, "[%a] GetRNG() failed, staus = %r\n", __FUNCTION__, Status));
> +
> +  return Status;
> +}// GenerateRandomNumberViaNist800Algorithm()
> +
> +
> +/**
> +  Generates a 16-bit random number.
> +
> +  if Rand is NULL, return FALSE.
> +

Can't we simply stipulate that Rand != NULL? Is there ever a point to
calling this function with a NULL buffer?

> +  @param[out] Rand     Buffer pointer to store the 16-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber16 (
> +  OUT     UINT16                    *Rand
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  if (Rand == NULL)
> +  {
> +    return FALSE;
> +  }
> +
> +  Status = GenerateRandomNumberViaNist800Algorithm ((UINT8 *)Rand, 2);
> +  if (EFI_ERROR(Status))
> +  {
> +    return FALSE;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 32-bit random number.
> +
> +  if Rand is NULL, return FALSE.
> +
> +  @param[out] Rand     Buffer pointer to store the 32-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber32 (
> +  OUT     UINT32                    *Rand
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  if (Rand == NULL) {
> +    return FALSE;
> +  }
> +
> +  Status = GenerateRandomNumberViaNist800Algorithm ((UINT8 *)Rand, 4);
> +  if (EFI_ERROR(Status)) {
> +    return FALSE;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 64-bit random number.
> +
> +  if Rand is NULL, return FALSE.
> +
> +  @param[out] Rand     Buffer pointer to store the 64-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber64 (
> +  OUT     UINT64                    *Rand
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  if (Rand == NULL)
> +  {
> +    return FALSE;
> +  }
> +
> +  Status = GenerateRandomNumberViaNist800Algorithm ((UINT8 *)Rand, 8);
> +  if (EFI_ERROR(Status)) {
> +    return FALSE;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 128-bit random number.
> +
> +  if Rand is NULL, return FALSE.
> +
> +  @param[out] Rand     Buffer pointer to store the 128-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber128 (
> +  OUT     UINT64                    *Rand
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  if (Rand == NULL) {
> +    return FALSE;
> +  }
> +
> +  Status = GenerateRandomNumberViaNist800Algorithm ((UINT8 *)Rand, 16);
> +  if (EFI_ERROR(Status)) {
> +    return FALSE;
> +  }
> +  return TRUE;
> +}
> diff --git a/MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf b/MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf
> new file mode 100644
> index 000000000000..819a106b1376
> --- /dev/null
> +++ b/MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf
> @@ -0,0 +1,38 @@
> +# @file
> +# Provides implementation of the library class RngLib that uses the RngProtocol
> +#
> +# @copyright
> +# Copyright (c) Microsoft Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +# MU_CHANGE: New file

Drop this please

> +##
> +
> +[Defines]
> +  INF_VERSION     = 0x00010017
> +  BASE_NAME       = BaseRngLibDxe
> +  FILE_GUID       = FF9F84C5-A33E-44E3-9BB5-0D654B2D4149
> +  MODULE_TYPE     = DXE_DRIVER
> +  VERSION_STRING  = 1.0
> +  LIBRARY_CLASS   = RngLib|DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +
> +[Sources]
> +  RngDxeLib.c
> +
> +[LibraryClasses]
> +  DebugLib
> +  UefiBootServicesTableLib
> +
> +[Protocols]
> +  gEfiRngProtocolGuid                 ## CONSUMES
> +
> +[Depex]
> +  gEfiRngProtocolGuid
> +
> +[Guids]
> +  gEfiRngAlgorithmSp80090Ctr256Guid            ## CONSUMES
> +  gEfiRngAlgorithmSp80090Hash256Guid           ## CONSUMES
> +  gEfiRngAlgorithmSp80090Hmac256Guid           ## CONSUMES

I'm not sure these annotations are appropriate for the [Guids] section

> diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc
> index d7ba3a730909..837a0047400e 100644
> --- a/MdePkg/MdePkg.dsc
> +++ b/MdePkg/MdePkg.dsc
> @@ -62,8 +62,10 @@
>     MdePkg/Library/BasePostCodeLibPort80/BasePostCodeLibPort80.inf
>     MdePkg/Library/BasePrintLib/BasePrintLib.inf
>     MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
> -  MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> +  MdePkg/Library/BaseRngLibDxe/BaseRngLibDxe.inf
>     MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf
> +  MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> +
>     MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
>     MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>     MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
>


Re: [PATCH v6 1/5] MdePkg: TimerRngLib: Added RngLib that uses TimerLib

Matthew Carlson
 

Good things to point out. Should be fixed.

The original code in CryptoPkg simply just delayed 10 microseconds and hoped the performance counter had incremented in that time frame.

This new code ensures that we are delaying for at least 1.5 performance counter ticks, so we're guaranteed to get a different performance counter value with some hope for randomness. As Mike K pointed out if a system has a slow performance counter you just get the same number repeated a few times.

 Copyright (c) Microsoft Corporation is the preferred way for the Microsoft copyright

-Matthew Carlson


On Thu, Aug 13, 2020 at 5:09 AM Ard Biesheuvel <ard.biesheuvel@...> wrote:
On 8/13/20 12:43 AM, matthewfcarlson@... wrote:
> From: Matthew Carlson <macarl@...>
>
> Added a new RngLib that provides random numbers from the TimerLib
> using the performance counter. This is meant to be used for OpenSSL
> to replicate past behavior. This should not be used in production as
> a real source of entropy.
>
> Ref: https://github.com/tianocore/edk2/pull/845
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1871
>
> Cc: Ard Biesheuvel <ard.biesheuvel@...>
> Cc: Michael D Kinney <michael.d.kinney@...>
> Cc: Liming Gao <liming.gao@...>
> Cc: Zhiguang Liu <zhiguang.liu@...>
> Signed-off-by: Matthew Carlson <matthewfcarlson@...>
> ---
>   MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c          | 187 ++++++++++++++++++++
>   MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf |  40 +++++
>   MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni |  17 ++
>   MdePkg/MdePkg.dsc                                        |   3 +-
>   4 files changed, 246 insertions(+), 1 deletion(-)
>
> diff --git a/MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c b/MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c
> new file mode 100644
> index 000000000000..915382fb9278
> --- /dev/null
> +++ b/MdePkg/Library/BaseRngLibTimerLib/RngLibTimer.c
> @@ -0,0 +1,187 @@
> +/** @file
> +  BaseRng Library that uses the TimerLib to provide reasonably random numbers.
> +  Do not use this on a production system.
> +
> +  Copyright (c) Microsoft Corporation.
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <Base.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/TimerLib.h>
> +
> +/**
> + * Using the TimerLib GetPerformanceCounterProperties() we delay
> + * for enough time for the PerformanceCounter to increment.
> + * Depending on your system
> + *
> + * If the return value from GetPerformanceCounterProperties (TimerLib)
> + * is zero, this function will not delay and attempt to assert.
> + */

Make this STATIC please

> +VOID
> +EFIAPI
> +DecentDelay(

space before (

> +  VOID
> +  )
> +{
> +  UINT64 StartValue;
> +  UINT64 EndValue;
> +  UINT64 CounterHz;
> +  UINT64 MinumumDelayInMicroSeconds;

newline here

> +  // Get the counter properties
> +  CounterHz = GetPerformanceCounterProperties(&StartValue, &EndValue);

space before (

> +  // Make sure we won't divide by zero
> +  if (CounterHz == 0) {
> +    ASSERT(FALSE); // Assert so the developer knows something is wrong

This will print

ASSERT (FALSE)

into the DEBUG log, whereas

ASSERT (CounterHz != 0)

will appear if you assert on the actual value, which is much more useful.

> +    return;
> +  }
> +  // Calculate the minimum delay based on 1.5 microseconds divided by the hertz.
> +  // We calculate the length of a cycle (1/CounterHz) and multiply it by 1.5 microseconds
> +  // This ensures that the performance counter has increased by at least one
> +  MinumumDelayInMicroSeconds = 1500000 / CounterHz;
> +
> +  MicroSecondDelay(MinumumDelayInMicroSeconds);

Space before (

> +}
> +
> +
> +/**
> +  Generates a 16-bit random number.
> +
> +  if Rand is NULL, then ASSERT().
> +
> +  @param[out] Rand     Buffer pointer to store the 16-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber16 (
> +  OUT     UINT16                    *Rand
> +  )
> +{
> +  UINT32  Index;
> +  UINT8* RandPtr;

Please align the variable names vertically, and put the * on the right
hand side.

> +
> +  ASSERT (Rand != NULL);
> +
> +  if (NULL == Rand) {

No yoda style comparisons please

> +    return FALSE;
> +  }
> +
> +  RandPtr = (UINT8 *) Rand;

Please drop the space after )

> +  // Get 2 bytes of random ish data
> +  // This should take around 10us
> +  for (Index = 0; Index < 2; Index ++) {
> +    *RandPtr = (UINT8) (GetPerformanceCounter () & 0xFF);

Same here

> +    DecentDelay (); // delay to give chance for performance counter to catch up

So the delay is intended to ensure that the perf counter assumes its
prior value + 1? How does that help? I'd argue that this actually makes
the value more predictable than simply taking 16 bits worth of
performance counter bits.

Or was this code simply adopted from CryptoPkg in some way?

> +    RandPtr++;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 32-bit random number.
> +
> +  if Rand is NULL, then ASSERT().
> +
> +  @param[out] Rand     Buffer pointer to store the 32-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber32 (
> +  OUT     UINT32                    *Rand
> +  )
> +{
> +  UINT32  Index;
> +  UINT8* RandPtr;
> +
> +  ASSERT (Rand != NULL);
> +
> +  if (NULL == Rand) {
> +    return FALSE;
> +  }
> +
> +  RandPtr = (UINT8 *) Rand;
> +  // Get 4 bytes of random ish data
> +  // This should take around 20ms
> +  for (Index = 0; Index < 4; Index ++) {
> +    *RandPtr = (UINT8) (GetPerformanceCounter () & 0xFF);
> +    DecentDelay (); // delay to give chance for performance counter to catch up
> +    RandPtr++;
> +  }
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 64-bit random number.
> +
> +  if Rand is NULL, then ASSERT().
> +
> +  @param[out] Rand     Buffer pointer to store the 64-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber64 (
> +  OUT     UINT64                    *Rand
> +  )
> +{
> +  UINT32  Index;
> +  UINT8* RandPtr;
> +
> +  ASSERT (Rand != NULL);
> +
> +  if (NULL == Rand) {
> +    return FALSE;
> +  }
> +
> +  RandPtr = (UINT8 *) Rand;
> +  // Get 8 bytes of random ish data
> +  // This should take around 40ms
> +  for (Index = 0; Index < 8; Index ++) {
> +    *RandPtr = (UINT8) (GetPerformanceCounter () & 0xFF);
> +    DecentDelay (); // delay to give chance for performance counter to catch up
> +    RandPtr++;
> +  }
> +
> +  return TRUE;
> +}
> +
> +/**
> +  Generates a 128-bit random number.
> +
> +  if Rand is NULL, then ASSERT().
> +
> +  @param[out] Rand     Buffer pointer to store the 128-bit random value.
> +
> +  @retval TRUE         Random number generated successfully.
> +  @retval FALSE        Failed to generate the random number.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +GetRandomNumber128 (
> +  OUT     UINT64                    *Rand
> +  )
> +{
> +  ASSERT (Rand != NULL);
> +  // This should take around 80ms
> +
> +  // Read first 64 bits
> +  if (!GetRandomNumber64 (Rand)) {
> +    return FALSE;
> +  }
> +
> +  // Read second 64 bits
> +  return GetRandomNumber64 (++Rand);
> +}
> diff --git a/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf b/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> new file mode 100644
> index 000000000000..34dea0152497
> --- /dev/null
> +++ b/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> @@ -0,0 +1,40 @@
> +## @file
> +#  Instance of RNG (Random Number Generator) Library.
> +#
> +#  BaseRng Library that uses the TimerLib to provide reasonably random numbers.
> +#  Do NOT use this on a production system as this uses the system performance
> +#  counter rather than a true source of random in addition to having a weak
> +#  random algorithm. This is provided primarily as a source of entropy for
> +#  OpenSSL for platforms that do not have a good built in RngLib as this
> +#  emulates what was done before (though it isn't perfect).
> +#
> +#  Copyright (c) Microsoft Corporation. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005

Please use the latest version (1.27 iirc, which you don't actually need
to convert to hex format like above)

> +  BASE_NAME                      = BaseRngLibTimerLib
> +  MODULE_UNI_FILE                = BaseRngLibTimerLib.uni
> +  FILE_GUID                      = 74950C45-10FC-4AB5-B114-49C87C17409B
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = RngLib
> +  CONSTRUCTOR                    = BaseRngLibConstructor
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64

Drop this unless it is accurate.

> +#
> +
> +[Sources]
> +  RngLibTimer.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  TimerLib
> diff --git a/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni b/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni
> new file mode 100644
> index 000000000000..766a8e0ddf97
> --- /dev/null
> +++ b/MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.uni
> @@ -0,0 +1,17 @@
> +// /** @file
> +// Instance of RNG (Random Number Generator) Library.
> +//
> +// BaseRng Library that uses TimerLib's performance counter

Please refer to this library as RngLib, to avoid confusion. Adding
'base' to qualify it is fine.

> +// to provide random numbers.
> +//
> +// Copyright (c) Microsoft Corporation

year?

> +//
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +// **/
> +
> +
> +#string STR_MODULE_ABSTRACT             #language en-US "Instance of RNG Library"
> +
> +#string STR_MODULE_DESCRIPTION          #language en-US "BaseRng Library that uses the TimerLib to provide low-entropy random numbers"
> +
> diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc
> index 472fa3777412..d7ba3a730909 100644
> --- a/MdePkg/MdePkg.dsc
> +++ b/MdePkg/MdePkg.dsc
> @@ -62,6 +62,8 @@
>     MdePkg/Library/BasePostCodeLibPort80/BasePostCodeLibPort80.inf
>     MdePkg/Library/BasePrintLib/BasePrintLib.inf
>     MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
> +  MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> +  MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf

Please match the indentation of the surrounding lines.

>     MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
>     MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>     MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
> @@ -69,7 +71,6 @@
>     MdePkg/Library/BaseUefiDecompressLib/BaseUefiTianoCustomDecompressLib.inf
>     MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
>     MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
> -  MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf
>   
>     MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
>


Re: [PATCH] UefiCpuPkg/MtrrLibUnitTest: Change to use static array for CI test

Michael D Kinney
 

Hi Ray,

How did you determine the number of random values you needed? 50000 seems like a lot.
Perhaps add a comment on how the value was selected.

+UINTN mNumberCount = 50000;
Also, do you really need this global variable? Can you determine the number of vales
using ARRAY_SIZE(mNumbers)? That way if we need a larger of smaller set, you only have
to update the array of values?

Thanks,

Mike

-----Original Message-----
From: Ni, Ray <ray.ni@intel.com>
Sent: Wednesday, August 12, 2020 7:22 AM
To: devel@edk2.groups.io
Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Dong, Eric <eric.dong@intel.com>; Laszlo Ersek <lersek@redhat.com>;
Shao, Ming <ming.shao@intel.com>; Sean Brogan <sean.brogan@microsoft.com>; Bret Barkelew <Bret.Barkelew@microsoft.com>;
Yao, Jiewen <jiewen.yao@intel.com>
Subject: [PATCH] UefiCpuPkg/MtrrLibUnitTest: Change to use static array for CI test

The unit test app supports running in 3 mode:
1. MtrrLibUnitTest generate-random-numbers
<path to MtrrLib/UnitTest/RandomNumber.c> <random-number count>
It generates random numbers and writes to RandomNumber.c.

2. MtrrLibUnitTest [<iterations>]
It tests MtrrLib APIs using configurations generated from static
numbers generated by mode #1.
This is the default execution mode running in CI environment.

3. MtrrLibUnitTest <iterations> random
It tests MtrrLib APIs using configurations generated from random
numbers.
This is what developers can use to test MtrrLib for regressions.

Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ming Shao <ming.shao@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
---
.../MtrrLib/UnitTest/MtrrLibUnitTest.c | 44 +-
.../MtrrLib/UnitTest/MtrrLibUnitTest.h | 13 +
.../MtrrLib/UnitTest/MtrrLibUnitTestHost.inf | 4 +
.../Library/MtrrLib/UnitTest/RandomNumber.c | 5009 +++++++++++++++++
UefiCpuPkg/Library/MtrrLib/UnitTest/Support.c | 68 +-
5 files changed, 5126 insertions(+), 12 deletions(-)
create mode 100644 UefiCpuPkg/Library/MtrrLib/UnitTest/RandomNumber.c

diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.c b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.c
index 123e1c741a..30ee1dc325 100644
--- a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.c
+++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.c
@@ -1055,8 +1055,6 @@ UnitTestingEntry (
GetFirmwareVariableMtrrCountContext.SystemParameter = &mDefaultSystemParameter;

Framework = NULL;



- DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION));

-

//

// Setup the test framework for running the tests.

//

@@ -1100,7 +1098,6 @@ UnitTestingEntry (
//

// Execute the tests.

//

- srand ((unsigned int) time (NULL));

Status = RunAllTestSuites (Framework);



EXIT:

@@ -1125,15 +1122,42 @@ main (
CHAR8 *Argv[]

)

{

- UINTN Iteration;

+ UINTN Count;

+

+ DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION));

+ srand ((unsigned int) time (NULL));

+

+ //

+ // MtrrLibUnitTest generate-random-numbers <path to MtrrLib/UnitTest/RandomNumber.c> <random-number count>

+ //

+ if ((Argc == 4) && (AsciiStriCmp ("generate-random-numbers", Argv[1]) == 0)) {

+ Count = atoi (Argv[3]);

+ DEBUG ((DEBUG_INFO, "Generate %d random numbers to %a.\n", Count, Argv[2]));

+ GenerateRandomNumbers (Argv[2], Count);

+ return 0;

+ }



//

- // First parameter specifies the test iterations.

- // Default is 10.

+ // MtrrLibUnitTest [<iterations>]

+ // <iterations> [fixed|random]

+ // Default <iterations> is 10.

+ // Default uses fixed inputs.

//

- Iteration = 10;

- if (Argc == 2) {

- Iteration = atoi (Argv[1]);

+ Count = 10;

+ mRandomInput = FALSE;

+ if ((Argc == 2) || (Argc == 3)) {

+ Count = atoi (Argv[1]);

+ if (Argc == 3) {

+ if (AsciiStriCmp ("fixed", Argv[2]) == 0) {

+ mRandomInput = FALSE;

+ } else if (AsciiStriCmp ("random", Argv[2]) == 0) {

+ mRandomInput = TRUE;

+ }

+ }

}

- return UnitTestingEntry (Iteration);

+

+ DEBUG ((DEBUG_INFO, "Iterations = %d\n", Count));

+ DEBUG ((DEBUG_INFO, "Input = %a\n", mRandomInput ? "random" : "fixed"));

+

+ return UnitTestingEntry (Count);

}

diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.h b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.h
index 9750523133..16cead867f 100644
--- a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.h
+++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTest.h
@@ -43,6 +43,7 @@ typedef struct {
} MTRR_LIB_SYSTEM_PARAMETER;



extern UINT32 mFixedMtrrsIndex[];

+extern BOOLEAN mRandomInput;



/**

Initialize the MTRR registers.

@@ -179,4 +180,16 @@ Random32 (
UINT32 Start,

UINT32 Limit

);

+

+/**

+ Generate Count random numbers in FilePath.

+

+ @param FilePath The file path to put the generated random numbers.

+ @param Count Count of random numbers.

+**/

+VOID

+GenerateRandomNumbers (

+ CHAR8 *FilePath,

+ UINTN Count

+ );

#endif

diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf
b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf
index 447238dc81..9009fc2785 100644
--- a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf
+++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf
@@ -22,6 +22,7 @@ [Sources]
MtrrLibUnitTest.c

MtrrLibUnitTest.h

Support.c

+ RandomNumber.c



[Packages]

MdePkg/MdePkg.dec

@@ -37,3 +38,6 @@ [LibraryClasses]


[Pcd]

gUefiCpuPkgTokenSpaceGuid.PcdCpuNumberOfReservedVariableMtrrs ## SOMETIMES_CONSUMES

+

+[BuildOptions]

+ MSFT:*_*_*_CC_FLAGS = -D _CRT_SECURE_NO_WARNINGS

diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/RandomNumber.c b/UefiCpuPkg/Library/MtrrLib/UnitTest/RandomNumber.c
new file mode 100644
index 0000000000..06104d8928
--- /dev/null
+++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/RandomNumber.c
@@ -0,0 +1,5009 @@
+/** @file

+ Pre-generated random number used by MtrrLib test.

+

+ Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+**/

+UINTN mNumberCount = 50000;

+UINTN mNumbers[] = {

+ 7791, 9427, 6867, 23807, 10984, 16661, 1863, 16690, 14810, 14550,

+ 11382, 15755, 19806, 32737, 209, 14661, 4112, 13680, 2425, 15502,

+ 25268, 2882, 29953, 12346, 27936, 8942, 21365, 17849, 13910, 21879,

+ 3995, 6982, 2032, 6432, 3448, 28770, 8385, 31106, 4630, 32385,

+ 31417, 21979, 22661, 18947, 10249, 22953, 30752, 32613, 2952, 25464,

+ 17, 12473, 28757, 19960, 27672, 1875, 17598, 20306, 22152, 15814,

+ 31841, 25276, 2962, 30223, 23953, 28748, 25029, 16399, 15868, 9993,

+ 31702, 25663, 29322, 15688, 22429, 18079, 30344, 2870, 20065, 30191,

+ 3589, 13233, 27221, 15138, 26492, 20316, 13666, 15632, 180, 19954,

+ 25895, 3179, 21221, 474, 2111, 11252, 2588, 2556, 6338, 26862,

+ 19424, 3540, 6158, 6099, 20758, 32708, 6087, 2375, 22306, 22959,

+ 21532, 19274, 11343, 1987, 17228, 2737, 23409, 30102, 15977, 10455,

+ 15049, 29045, 10077, 22928, 25128, 23033, 12330, 23902, 19543, 18906,

+ 10102, 11240, 10167, 13832, 28230, 8871, 6693, 12792, 31498, 3043,

+ 31776, 20028, 3546, 4574, 20270, 17751, 31231, 29263, 29563, 27343,

+ 10421, 1553, 24772, 4228, 14639, 28957, 26227, 22079, 25052, 3766,

+ 14092, 6030, 30441, 28131, 17095, 27600, 14855, 29218, 9599, 27788,

+ 22382, 27739, 11210, 13831, 13345, 16403, 13162, 22037, 29044, 26850,

+ 27364, 7471, 18892, 29735, 13422, 1478, 10919, 17146, 12302, 9687,

+ 12252, 10338, 12545, 24256, 25635, 14280, 8794, 16210, 27351, 22444,

+ 7915, 19495, 30459, 27799, 16488, 8757, 13180, 12369, 27082, 10148,

+ 181, 2387, 4338, 16093, 11064, 30335, 19343, 12260, 32716, 25359,

+ 9025, 15335, 24754, 30412, 29951, 3863, 16429, 13952, 24502, 1206,

+ 9281, 2221, 1586, 29041, 6074, 29311, 10306, 26609, 11376, 8448,

+ 22295, 11181, 29386, 4747, 18670, 17922, 2689, 29827, 4079, 29061,

+ 12454, 2372, 14420, 20376, 28391, 10842, 4557, 7227, 20494, 15090,

+ 10275, 21541, 15818, 7821, 12060, 276, 27570, 2044, 26016, 8289,

+ 29575, 13448, 13337, 22487, 1721, 26481, 2592, 27845, 22829, 14746,

+ 16213, 12626, 10558, 4482, 31630, 23569, 2306, 22390, 27189, 32213,

+ 19662, 14853, 15595, 2503, 17148, 5813, 16753, 9141, 6379, 23284,

+ 3785, 10413, 4424, 29009, 3480, 9675, 28556, 3820, 24527, 12623,

+ 15558, 29995, 27530, 23026, 18843, 31663, 3385, 8315, 4491, 30343,

+ 13565, 12173, 25462, 19619, 29525, 17859, 29534, 21131, 14585, 1535,

+ 14702, 15697, 19974, 8702, 16955, 16835, 17500, 4912, 21579, 13286,

+ 26948, 21959, 3796, 15008, 31319, 23054, 26053, 27573, 8603, 8189,

+ 7946, 25589, 31982, 12554, 13580, 12211, 13480, 27713, 17016, 6008,

+ 25980, 22679, 23362, 9465, 24991, 29052, 30441, 29767, 3372, 8623,

+ 20476, 9542, 22984, 24662, 23773, 352, 9602, 9294, 17861, 10618,

+ 252, 8640, 31752, 24615, 8400, 1525, 22171, 17436, 32301, 9579,

+ 22483, 3813, 27329, 20520, 111, 11222, 7132, 16462, 21465, 15171,

+ 28882, 22256, 29097, 22004, 30881, 6948, 26731, 9427, 31443, 12121,

+ 9634, 8424, 1958, 12523, 9997, 3975, 21355, 13813, 20776, 3784,

+ 24876, 23911, 3830, 17976, 16529, 9560, 7934, 4046, 25348, 31645,

+ 12691, 11553, 19476, 15514, 15449, 23767, 8471, 5208, 9989, 25697,

+ 23572, 30168, 13668, 25062, 9696, 7335, 21151, 31356, 7046, 19635,

+ 8637, 14494, 748, 17501, 30569, 11995, 12980, 5327, 8438, 13003,

+ 12641, 21648, 7328, 17479, 20411, 24661, 10005, 29913, 17012, 7707,

+ 16948, 25458, 32523, 30322, 6420, 8283, 24561, 30748, 25928, 3438,

+ 21483, 22998, 14689, 3718, 7351, 20086, 21685, 7732, 24818, 24374,

+ 25695, 6836, 5433, 16464, 21895, 24351, 143, 21451, 7396, 31969,

+ 24574, 20116, 6014, 10606, 28033, 13264, 26809, 13361, 20002, 6769,

+ 31119, 6341, 11104, 28935, 32029, 360, 31699, 13273, 7777, 19885,

+ 16147, 18741, 15170, 29041, 12501, 30724, 20688, 16399, 14167, 11425,

+ 31950, 30680, 4351, 32748, 14446, 8637, 1343, 13466, 12379, 6479,

+ 7355, 7887, 24060, 20714, 9390, 10734, 17912, 9772, 393, 28848,

+ 32757, 23212, 5342, 7027, 27558, 1257, 14973, 30933, 14084, 3457,

+ 8413, 1154, 6619, 3236, 189, 20554, 27273, 7111, 30730, 887,

+ 28674, 28573, 3076, 25693, 5400, 20035, 5789, 8242, 24826, 13755,

+ 8993, 17696, 22778, 18075, 32284, 8857, 12179, 18182, 31865, 1003,

+ 25770, 20956, 15847, 30996, 15124, 1582, 28289, 8663, 10073, 19189,

+ 19373, 12047, 7095, 31491, 28740, 3652, 21866, 3385, 11252, 29564,

+ 3883, 3323, 27107, 13651, 15607, 30433, 27285, 12110, 13585, 19887,

+ 21776, 7789, 27210, 31624, 25406, 11263, 7040, 21342, 11666, 6842,

+ 7269, 18093, 23022, 18955, 7041, 9065, 12741, 939, 2427, 28213,

+ 25469, 18291, 1428, 11477, 29463, 2417, 29556, 13542, 7697, 5691,

+ 7721, 21196, 13963, 4483, 3181, 23789, 14762, 17132, 27175, 1821,

+ 9530, 9500, 11061, 2648, 20631, 27411, 19305, 29879, 19661, 28603,

+ 20433, 13725, 4094, 17344, 27964, 14897, 28676, 19873, 30713, 11794,

+ 12376, 12296, 226, 13382, 10034, 27223, 17306, 11379, 15858, 26499,

+ 18962, 22609, 20671, 28453, 26962, 30047, 12654, 11470, 31606, 7893,

+ 20901, 16795, 31478, 3034, 22592, 5130, 25387, 32248, 9715, 21004,

+ 31247, 29645, 3377, 22876, 26437, 29699, 16717, 31246, 15449, 1154,

+ 16608, 18283, 21064, 8675, 16234, 27388, 8259, 19240, 21052, 11749,

+ 28592, 30123, 25749, 11381, 4466, 32085, 14091, 26618, 30826, 25872,

+ 28204, 10970, 23869, 31615, 29798, 29407, 20312, 14316, 13092, 21971,

+ 22322, 25474, 26426, 5197, 3537, 25276, 5251, 20170, 19856, 13085,

+ 23752, 4351, 24607, 28962, 15844, 10094, 19915, 31349, 31526, 29496,

+ 12800, 99, 13815, 12338, 14604, 7824, 31165, 24890, 11045, 18921,

+ 16127, 22220, 10414, 11227, 10697, 976, 31670, 15810, 1874, 5302,

+ 8898, 14501, 20188, 31941, 30924, 11552, 10716, 28080, 7819, 22433,

+ 18267, 28011, 2293, 1240, 32412, 32316, 22787, 6760, 1279, 3349,

+ 24756, 6115, 15141, 6689, 31060, 9205, 21845, 20381, 3838, 31199,

+ 25374, 31465, 1376, 19239, 31294, 7135, 22974, 27022, 2243, 32355,

+ 9785, 19779, 4720, 4667, 27218, 19286, 23906, 29986, 15530, 4207,

+ 20980, 25367, 18955, 13248, 4575, 251, 17836, 30264, 2726, 13659,

+ 11953, 506, 1841, 907, 3826, 15885, 1207, 7412, 5885, 2645,

+ 20194, 7342, 15198, 30658, 10030, 8530, 14110, 20679, 31635, 14601,

+ 6025, 1550, 28771, 21481, 13620, 21354, 16757, 12418, 15935, 12557,

+ 16003, 30387, 13784, 25851, 26321, 29891, 3328, 18622, 26639, 12972,

+ 14482, 5979, 1153, 20410, 26753, 22406, 9309, 24149, 17505, 13842,

+ 5749, 12827, 20777, 25771, 17429, 21555, 25655, 20679, 23599, 4573,

+ 18324, 18138, 14773, 22861, 29562, 21961, 2375, 22713, 275, 1698,

+ 29198, 5041, 14980, 15498, 17896, 25263, 27690, 20727, 31941, 4335,

+ 23331, 16415, 32593, 3200, 1297, 31152, 1235, 23708, 3354, 10689,

+ 2132, 21045, 31284, 3592, 6405, 9936, 10911, 11086, 2523, 32150,

+ 8370, 30497, 17532, 31400, 3291, 18889, 17246, 25780, 14562, 11389,

+ 30509, 1222, 14445, 22486, 7022, 14432, 713, 30339, 15971, 27084,

+ 23015, 63, 46, 25265, 8869, 16640, 19768, 11493, 4687, 24689,

+ 6100, 30082, 21862, 32163, 21792, 9788, 5024, 13055, 16684, 10481,

+ 29999, 5760, 11871, 2434, 3398, 2591, 25622, 27106, 19930, 28814,

+ 20621, 31852, 26790, 6696, 4611, 30842, 16753, 32297, 6937, 15667,

+ 21907, 5146, 30332, 5796, 15542, 24976, 28099, 22803, 9946, 4118,

+ 6043, 18063, 31644, 8040, 4385, 29388, 32439, 2018, 26255, 6446,

+ 7627, 24887, 28443, 6436, 19293, 24934, 8220, 3255, 2847, 18410,

+ 7023, 11619, 4978, 2353, 32025, 31525, 10282, 20048, 11309, 22997,

+ 4753, 7413, 13041, 6326, 23214, 15261, 25148, 6220, 9671, 9735,

+ 17442, 621, 24100, 9704, 8659, 18587, 2070, 25568, 8385, 23697,

+ 26680, 1197, 15105, 22300, 24309, 9887, 5876, 300, 7498, 21323,

+ 550, 29483, 5837, 14724, 4982, 16013, 21743, 17287, 14456, 21929,

+ 3966, 23926, 12823, 9671, 11886, 8, 17535, 6010, 6360, 21374,

+ 7738, 26928, 30019, 32473, 15000, 6151, 16163, 30538, 17237, 19170,

+ 21919, 25578, 13686, 29629, 26519, 27051, 19828, 6973, 24806, 29582,

+ 32412, 2699, 15588, 19223, 31158, 18275, 25135, 5375, 1765, 5736,

+ 27564, 1576, 14030, 30651, 712, 25814, 12028, 20939, 12036, 10779,

+ 5507, 15983, 16048, 22419, 24548, 11826, 11510, 21842, 2353, 21997,

+ 10523, 27675, 29554, 6812, 8962, 12242, 30790, 28522, 242, 28212,

+ 27854, 23054, 25240, 30150, 7366, 4442, 5456, 18699, 245, 27153,

+ 7584, 4602, 13512, 1530, 31237, 27055, 28474, 31026, 755, 18529,

+ 758, 22982, 3095, 12692, 10688, 28033, 10975, 28816, 7953, 27139,

+ 17980, 30993, 19969, 31507, 21415, 16448, 5738, 823, 25954, 8674,

+ 27979, 19073, 28160, 9680, 23658, 4011, 23847, 14759, 9534, 12135,

+ 31125, 12992, 2827, 22000, 7265, 11363, 2127, 28389, 12675, 5687,

+ 29533, 18263, 8599, 1789, 22088, 5665, 2270, 10110, 32258, 24183,

+ 24454, 18882, 1221, 24770, 30507, 131, 23474, 3499, 29085, 19169,

+ 6073, 12150, 5348, 10328, 1464, 15762, 8321, 10478, 18919, 3694,

+ 2039, 19889, 3699, 23438, 13962, 19808, 1385, 19421, 16455, 4457,

+ 16854, 30789, 9284, 32531, 11309, 7805, 1065, 24829, 5608, 30242,

+ 29935, 1223, 12402, 23562, 19688, 24847, 27461, 18389, 4864, 22431,

+ 32079, 16324, 29506, 26596, 7579, 16079, 23710, 26019, 12077, 16625,

+ 11241, 2023, 25646, 27079, 2085, 25662, 7241, 31065, 21507, 10788,

+ 596, 824, 22694, 12992, 11571, 7113, 3498, 14542, 18425, 28640,

+ 8805, 19677, 1361, 31376, 11372, 22970, 25117, 19778, 8025, 19756,

+ 31580, 7685, 29132, 14561, 31569, 4133, 5040, 32681, 25058, 27391,

+ 6592, 25314, 11326, 13075, 16969, 1075, 8130, 22875, 14129, 12158,

+ 15390, 29916, 12600, 271, 6323, 14970, 24702, 15386, 12608, 10000,

+ 15942, 25956, 26046, 4032, 11257, 30272, 12680, 3208, 878, 15293,

+ 23999, 28950, 31848, 13854, 13037, 18398, 2912, 3210, 28136, 873,

+ 7557, 26885, 31738, 23024, 22018, 20639, 16958, 32553, 12415, 19435,

+ 29773, 12385, 11498, 29619, 15898, 18123, 26743, 13802, 17691, 17432,

+ 18405, 26338, 17578, 3399, 5892, 29376, 18858, 18367, 16756, 17196,

+ 20845, 3227, 2223, 11597, 20437, 26181, 23369, 31732, 24762, 19526,

+ 12663, 27159, 10380, 4444, 4815, 8578, 10298, 30669, 10574, 4553,

+ 2130, 24572, 1439, 13185, 8041, 17722, 30874, 2991, 14269, 31966,

+ 9740, 897, 22553, 27544, 13494, 26684, 5113, 9474, 16280, 10102,

+ 9967, 10616, 27759, 7045, 24389, 13866, 19324, 31799, 7140, 23407,

+ 25735, 18372, 24948, 19805, 5412, 14336, 19141, 8854, 9269, 6101,

+ 22638, 30052, 11952, 3313, 25524, 6921, 20898, 10684, 14509, 25936,

+ 13684, 23437, 7077, 8808, 24173, 2333, 15808, 20210, 26233, 30012,

+ 25825, 11865, 1065, 14786, 19147, 15714, 762, 28361, 30598, 13060,

+ 4314, 21017, 6917, 889, 1256, 740, 10757, 6549, 892, 9652,

+ 16952, 14935, 9063, 1185, 6563, 18110, 30844, 32711, 32068, 20445,

+ 10063, 25079, 8953, 12594, 26172, 28077, 21149, 9524, 4011, 13890,

+ 10868, 2091, 10643, 6499, 713, 15684, 1597, 27842, 13525, 27109,

+ 25163, 13323, 18659, 31550, 9208, 29466, 20402, 10785, 8097, 28779,

+ 27419, 28947, 1413, 31698, 18931, 10403, 23753, 3436, 6963, 15866,

+ 12223, 20693, 15446, 14260, 19815, 28827, 9987, 31982, 17462, 13811,

+ 25068, 4768, 31255, 20651, 30966, 17198, 1456, 23392, 16538, 25657,

+ 11494, 28657, 26763, 11963, 11427, 24627, 8601, 23891, 11734, 26343,

+ 23253, 1245, 3004, 25833, 23030, 23366, 20319, 32426, 13051, 24734,

+ 1116, 11743, 25362, 7791, 19176, 7035, 4793, 29006, 19221, 21979,

+ 17187, 4271, 27986, 14145, 27357, 18686, 31793, 4228, 17841, 7147,

+ 4974, 27654, 23499, 15109, 44, 31973, 1050, 4234, 30337, 3702,

+ 26105, 19069, 16437, 2031, 15887, 7162, 18631, 22627, 27251, 10439,

+ 10929, 24308, 532, 20267, 8685, 9028, 31577, 17411, 1976, 29228,

+ 9732, 13586, 15254, 12977, 31836, 26009, 7574, 1843, 3979, 31015,

+ 32215, 3816, 4933, 24755, 9547, 23433, 19626, 7656, 23483, 28491,

+ 26734, 20672, 3852, 22289, 31799, 17236, 32704, 13536, 14150, 26611,

+ 5824, 20115, 1626, 32113, 18520, 29904, 11985, 19905, 10371, 22074,

+ 9489, 15046, 5225, 4840, 8742, 3431, 5414, 9239, 15532, 15074,

+ 24525, 27675, 2288, 5218, 5804, 668, 1106, 5331, 12242, 4350,

+ 20462, 16629, 9423, 21281, 32379, 19887, 20411, 4171, 31090, 167,

+ 6522, 8290, 16755, 32527, 23869, 20831, 3558, 32450, 9548, 16639,

+ 4062, 3471, 9476, 32443, 23618, 25300, 5147, 2555, 16686, 28495,

+ 20268, 135, 2711, 7986, 24943, 4414, 31278, 629, 23495, 1802,

+ 30343, 20336, 7427, 19, 13691, 29609, 28509, 9523, 26059, 9963,

+ 8007, 30123, 7173, 13464, 28520, 31508, 1708, 28479, 3553, 31128,

+ 11667, 625, 28372, 28769, 16522, 5841, 12327, 32338, 14652, 31851,

+ 27269, 32501, 21592, 20295, 5030, 29621, 9711, 19005, 21969, 3406,

+ 19742, 15370, 159, 27009, 2796, 21156, 30465, 22796, 16501, 12491,

+ 16004, 16857, 6217, 481, 5076, 29046, 24335, 32763, 10367, 29637,

+ 20334, 8248, 28156, 16885, 21805, 22866, 4588, 23984, 2968, 14450,

+ 3999, 11414, 31526, 14409, 31450, 10219, 23130, 3676, 26584, 13452,

+ 21991, 25247, 5262, 14120, 9239, 9542, 14132, 14508, 26477, 30424,

+ 5632, 12031, 9354, 22149, 19509, 15856, 20301, 2745, 24668, 1133,

+ 13118, 30705, 4049, 18933, 15149, 22990, 29570, 8271, 23574, 4711,

+ 25076, 19837, 10056, 996, 12935, 4588, 18374, 10313, 17914, 7917,

+ 28398, 23439, 30769, 20841, 29784, 3065, 24374, 1231, 11521, 17573,

+ 31615, 4690, 15785, 18018, 15727, 20562, 27769, 8897, 1054, 9751,

+ 13801, 3439, 31069, 1989, 10465, 22465, 28405, 28300, 19998, 19089,

+ 8496, 8480, 7896, 21065, 667, 24681, 20130, 12605, 29961, 19579,

+ 27793, 11326, 5083, 5576, 8096, 25963, 29567, 20116, 595, 22859,

+ 31287, 28842, 24987, 12825, 13852, 27470, 25338, 25951, 21602, 19826,

+ 21991, 20423, 7645, 24621, 13428, 17197, 7364, 17768, 5934, 15096,

+ 20406, 28379, 8261, 10923, 3578, 312, 8685, 6839, 267, 30629,

+ 1027, 1940, 22356, 7024, 11508, 14095, 5176, 9214, 29147, 30694,

+ 8533, 4869, 20969, 32658, 1290, 8443, 266, 23140, 25142, 19919,

+ 1477, 8659, 9539, 27094, 28260, 27925, 612, 11016, 24918, 12268,

+ 10522, 8812, 3281, 31683, 20733, 9681, 14780, 22265, 953, 447,

+ 1483, 7805, 18519, 1965, 2284, 9627, 5054, 19572, 27106, 2069,

+ 8825, 11012, 9775, 25206, 8122, 24406, 4408, 25763, 15775, 19874,

+ 20132, 29363, 8885, 18897, 19461, 18432, 20667, 29493, 32186, 20606,

+ 26792, 30840, 25364, 11340, 28655, 22482, 5559, 4489, 31489, 28543,

+ 26691, 105, 24851, 29297, 22580, 32136, 23842, 5442, 22279, 18046,

+ 16437, 1900, 11935, 13491, 6371, 3260, 1254, 17013, 29716, 19204,

+ 17079, 26183, 6924, 8209, 25084, 14460, 29349, 5084, 26387, 5893,

+ 24539, 15108, 2423, 15240, 21902, 7548, 20380, 30642, 28548, 30081,

+ 8730, 3021, 16046, 23248, 6670, 19349, 10924, 11797, 3773, 1351,

+ 3218, 22694, 9851, 24316, 26349, 13425, 28364, 7733, 24321, 12340,

+ 16328, 3511, 23381, 1004, 28356, 30105, 27506, 2447, 5166, 22939,

+ 23783, 3581, 26809, 29113, 8592, 11828, 32186, 4352, 27416, 5316,

+ 21714, 28321, 8125, 11140, 6862, 1348, 3155, 5506, 2507, 31902,

+ 30604, 1344, 13982, 20806, 31350, 17181, 19827, 11972, 16965, 30737,

+ 435, 12267, 8019, 4253, 13612, 31082, 1381, 19458, 6764, 25245,

+ 24880, 19378, 22125, 8361, 26396, 14084, 25976, 10183, 16199, 18219,

+ 18243, 14048, 13005, 20329, 13917, 16731, 15943, 5504, 28363, 11059,

+ 11665, 3690, 18420, 2892, 9425, 21321, 9658, 26631, 15028, 25249,

+ 1258, 8724, 2043, 453, 9942, 391, 20535, 21135, 8256, 6446,

+ 10192, 29012, 20346, 29730, 15180, 12055, 32204, 16797, 7118, 15357,

+ 12310, 29451, 13533, 22017, 27318, 100, 20327, 20457, 27820, 18104,

+ 17926, 1145, 9724, 13580, 20097, 2534, 27988, 15204, 31894, 14734,

+ 14575, 12321, 25079, 24549, 24249, 8077, 28562, 10419, 8116, 14773,

+ 31765, 7037, 666, 21111, 5042, 15424, 16836, 10203, 29984, 9318,

+ 20554, 25255, 24546, 10226, 14956, 1325, 6091, 23294, 25905, 15464,

+ 16834, 2919, 29005, 18247, 32195, 711, 17736, 26697, 25126, 9379,

+ 733, 5450, 15396, 15590, 27553, 22941, 14743, 4750, 30949, 7770,

+ 24577, 4774, 10972, 19705, 29904, 10100, 21249, 32, 15072, 4083,

+ 23987, 14010, 10562, 19332, 24354, 15689, 32572, 28128, 26479, 16765,

+ 22928, 28497, 25103, 17413, 11521, 19746, 1137, 23717, 18964, 3667,

+ 4064, 1161, 19988, 146, 27306, 23257, 9560, 16743, 21634, 6029,

+ 713, 26543, 14883, 8323, 28830, 24907, 27702, 29902, 24170, 22809,

+ 15734, 25170, 20569, 14627, 19474, 14734, 5046, 7447, 31314, 29624,

+ 7345, 18680, 23166, 32527, 29024, 30738, 4604, 9581, 17923, 6195,

+ 30648, 16667, 11916, 17688, 29129, 13290, 2399, 6182, 22097, 21631,

+ 1878, 8283, 21412, 17903, 29960, 5763, 9133, 28044, 10571, 8623,

+ 3726, 31486, 15607, 16355, 135, 13973, 28653, 9999, 14105, 2525,

+ 24408, 12864, 18795, 30323, 28979, 12056, 4076, 28440, 6412, 8060,

+ 12090, 18180, 23047, 17292, 19011, 11132, 10789, 32728, 8106, 23463,

+ 6854, 29648, 5740, 4766, 27245, 21629, 32195, 22466, 25540, 24431,

+ 1098, 10578, 11744, 31223, 10850, 13629, 29125, 20630, 13269, 5172,

+ 31021, 2740, 23738, 15108, 10885, 26261, 21913, 5667, 1593, 20874,

+ 19151, 904, 2353, 20580, 31539, 7872, 6300, 19502, 8697, 4927,

+ 23276, 5916, 14295, 26868, 8737, 15806, 20327, 32544, 19275, 30841,

+ 4301, 10599, 14154, 20792, 6297, 9000, 16601, 20831, 15855, 19722,

+ 21451, 19457, 997, 26839, 2451, 6226, 14892, 18318, 28426, 20575,

+ 4339, 7603, 22381, 26620, 9224, 29162, 24741, 12286, 16704, 22980,

+ 3276, 6571, 28186, 30937, 5356, 20079, 28831, 30231, 22794, 28625,

+ 24460, 23385, 4451, 5028, 32179, 4923, 9461, 20610, 25759, 31021,

+ 18753, 28278, 17015, 12231, 20304, 4089, 12068, 12637, 16884, 26400,

+ 23734, 20178, 14672, 19219, 9988, 4273, 1946, 16833, 18067, 11897,

+ 8992, 20946, 10938, 4153, 29065, 12509, 16131, 3677, 22622, 8668,

+ 8147, 25544, 14025, 6109, 590, 1571, 11420, 28922, 21365, 22644,

+ 21140, 23946, 21137, 27634, 18400, 18329, 10965, 17176, 14557, 20118,

+ 20543, 19192, 17188, 11084, 9151, 32466, 23238, 4116, 8859, 27109,

+ 5334, 22856, 9490, 31621, 31528, 8698, 28736, 24942, 19801, 4326,

+ 8001, 23640, 21263, 29094, 10137, 17099, 9090, 28197, 31955, 9781,

+ 1596, 31830, 5993, 20026, 20765, 21542, 25316, 32331, 26529, 431,

+ 22340, 14714, 16230, 26542, 16802, 30860, 3560, 17975, 20, 1616,

+ 911, 6567, 13521, 30256, 14317, 26075, 13462, 26886, 11072, 16799,

+ 13384, 5169, 319, 13929, 31194, 16103, 22803, 18504, 5233, 10700,

+ 26275, 14871, 24518, 5316, 12564, 25078, 22220, 22278, 6800, 8699,

+ 31124, 15731, 5447, 22820, 19053, 8997, 10676, 24720, 9807, 30794,

+ 12834, 26863, 31866, 11059, 28526, 19512, 10586, 10152, 23310, 10138,

+ 30894, 24703, 23122, 20916, 4841, 5997, 14058, 264, 23000, 22299,

+ 169, 13997, 30854, 21372, 15497, 16709, 10845, 9311, 1262, 27695,

+ 32141, 3648, 32559, 12030, 5298, 19812, 19026, 28969, 11185, 5925,

+ 19223, 13827, 25570, 17802, 31033, 17646, 7029, 24858, 4592, 8652,

+ 21518, 31986, 21434, 27063, 27827, 6422, 10075, 26610, 13032, 32517,

+ 23074, 30495, 3864, 19600, 19823, 690, 20535, 8427, 16242, 15525,

+ 23206, 8197, 4405, 23406, 15959, 16405, 11741, 29742, 30769, 5493,

+ 30509, 17707, 25270, 4276, 23371, 1152, 6627, 25319, 30663, 1811,

+ 22103, 31807, 28121, 21448, 952, 22753, 19434, 30452, 5715, 4081,

+ 12374, 10773, 25602, 22768, 2417, 9152, 1107, 31561, 5832, 9178,

+ 31718, 23590, 4009, 4107, 14103, 7816, 4837, 13424, 6109, 2455,

+ 17364, 31888, 6898, 10551, 14490, 14482, 22581, 23771, 7593, 17069,

+ 25164, 18590, 12935, 6367, 18829, 23696, 978, 16098, 17951, 26189,

+ 1665, 31836, 19804, 24789, 30828, 19286, 5754, 30359, 10767, 2799,

+ 21099, 27087, 5514, 19025, 6913, 22290, 26349, 16357, 23894, 1575,

+ 22963, 16579, 17259, 15641, 3980, 19565, 24847, 18826, 17504, 188,

+ 10243, 13386, 912, 2586, 26459, 21289, 17023, 25586, 23079, 11529,

+ 1105, 32101, 2387, 25655, 27378, 5695, 1228, 6907, 22874, 26665,

+ 14308, 1645, 2832, 28704, 23800, 9099, 17645, 27685, 21584, 17033,

+ 803, 24886, 25158, 23656, 18558, 15742, 6315, 26314, 29417, 27337,

+ 28518, 6661, 14643, 25914, 20574, 23926, 13843, 10816, 6811, 19992,

+ 9322, 5062, 24744, 4948, 12489, 29610, 26171, 30235, 1075, 881,

+ 8471, 28211, 27684, 31801, 16690, 6606, 17361, 27374, 1043, 21345,

+ 690, 5313, 22399, 22963, 5182, 32726, 3924, 15925, 23798, 29757,

+ 12981, 3473, 4260, 2340, 9319, 26245, 15845, 4683, 10875, 29426,

+ 13029, 440, 6446, 30512, 8042, 4523, 9485, 27557, 6164, 19156,

+ 8285, 21654, 24291, 15044, 10169, 19516, 5369, 28322, 509, 29467,

+ 14753, 1567, 14179, 14991, 6801, 29355, 9196, 15784, 6508, 14058,

+ 2306, 7223, 27275, 14945, 25179, 3113, 12541, 1398, 544, 5396,

+ 7116, 31127, 14415, 10768, 26754, 22969, 2398, 5576, 28396, 14084,

+ 14369, 27857, 6686, 5580, 9965, 31290, 29367, 24260, 21502, 23140,

+ 7783, 28782, 29974, 14355, 30894, 25814, 30311, 24518, 10470, 24448,

+ 24755, 7492, 22915, 30623, 27314, 6008, 29850, 4743, 14772, 7806,

+ 2464, 16997, 5511, 8190, 16501, 32046, 5019, 13753, 32160, 16341,

+ 32100, 609, 7133, 29121, 30208, 20654, 24277, 7294, 8986, 10414,

+ 812, 19379, 23822, 20317, 4032, 10580, 10829, 25717, 19504, 10776,

+ 2564, 4743, 156, 24110, 20984, 1355, 25260, 14892, 9140, 6709,

+ 21460, 27720, 15591, 32584, 21718, 4554, 9992, 13359, 21128, 24769,

+ 2619, 8586, 12247, 6645, 10104, 14982, 12556, 22302, 15850, 23728,

+ 11342, 2387, 24469, 25099, 9064, 15301, 31036, 6495, 10957, 28333,

+ 4482, 6357, 16857, 7811, 847, 7873, 90, 19313, 14197, 29887,

+ 15695, 5383, 8596, 2305, 4848, 15920, 1083, 12775, 25582, 11621,

+ 16463, 20432, 17915, 15648, 13233, 16689, 30093, 28820, 27419, 23780,

+ 14047, 24731, 11083, 26306, 18489, 29936, 5476, 12915, 18802, 15774,

+ 27281, 26757, 15539, 184, 13035, 8636, 1149, 20555, 19357, 19625,

+ 750, 15505, 8261, 4478, 15936, 30311, 5022, 10273, 11922, 30209,

+ 23389, 21631, 6379, 31197, 21336, 32035, 7036, 29173, 3053, 4103,

+ 20261, 11065, 6050, 10666, 8763, 20284, 23561, 12898, 20617, 3118,

+ 27111, 26100, 7316, 30986, 8340, 31074, 11812, 2576, 8357, 21252,

+ 14847, 10614, 20937, 2266, 22264, 18523, 32753, 6433, 9256, 31740,

+ 21428, 4388, 9340, 31530, 10737, 5717, 29552, 4092, 3766, 1436,

+ 14105, 20929, 24416, 7407, 29545, 15160, 22532, 25379, 8879, 28932,

+ 4110, 16898, 14173, 19546, 10792, 1693, 27406, 32253, 15198, 15332,

+ 32455, 23916, 11647, 4979, 20605, 14425, 8390, 20655, 27096, 13918,

+ 4281, 27154, 27703, 9452, 16466, 21699, 32244, 16260, 12637, 11882,

+ 7401, 18473, 11041, 14658, 31283, 1045, 5186, 24176, 17205, 28843,

+ 9190, 10899, 31712, 17581, 11799, 30876, 20018, 4527, 3945, 16096,

+ 29437, 6603, 31708, 12907, 6122, 11671, 13571, 13463, 26301, 9812,

+ 27494, 16094, 4571, 20584, 20262, 16621, 2569, 23055, 5087, 9465,

+ 16758, 6733, 27602, 28246, 8188, 17447, 15940, 9798, 3235, 23058,

+ 7457, 2831, 12391, 30124, 15845, 13648, 22075, 14250, 31164, 10132,

+ 3149, 29713, 6376, 31784, 27276, 28330, 28004, 9514, 8808, 15279,

+ 199, 29411, 15320, 6347, 22890, 21591, 9122, 21058, 6861, 1561,

+ 28375, 2155, 1335, 9060, 30620, 26983, 6301, 19816, 14128, 13069,

+ 24261, 23778, 299, 4388, 8364, 20975, 1028, 11221, 2852, 30242,

+ 13014, 31327, 1729, 25812, 31844, 11789, 18166, 28091, 29530, 18790,

+ 21628, 1471, 19414, 14243, 5875, 14856, 21030, 30822, 8652, 22876,

+ 16084, 13224, 18534, 18344, 3039, 18931, 15735, 12252, 12108, 13522,

+ 16814, 2044, 24285, 19335, 9623, 7028, 16673, 16379, 8894, 4013,

+ 12205, 26619, 20503, 5853, 28328, 9888, 13725, 17699, 32141, 2575,

+ 17210, 15315, 25900, 29027, 12007, 7951, 9970, 20200, 32276, 2455,

+ 12651, 23178, 15946, 29409, 32261, 18573, 12559, 15213, 15383, 22654,

+ 28426, 21331, 11553, 20585, 18023, 12062, 5718, 14412, 22653, 32476,

+ 27479, 27084, 15022, 23414, 5698, 18471, 7823, 24126, 235, 13418,

+ 17737, 22215, 17257, 4580, 16960, 4857, 7125, 28378, 20722, 28004,

+ 4942, 9596, 16929, 5589, 29760, 2328, 17460, 18471, 30182, 29582,

+ 2779, 25948, 16654, 18180, 6642, 8941, 12829, 14298, 14248, 17501,

+ 31826, 29408, 18912, 4884, 4687, 29639, 8919, 2155, 30677, 8150,

+ 263, 24068, 24783, 30942, 17996, 30812, 16786, 31856, 10822, 24483,

+ 13411, 845, 27646, 15051, 22585, 13598, 18124, 223, 3269, 25702,

+ 11896, 21654, 12208, 26292, 5791, 15912, 16164, 15645, 18776, 14176,

+ 1421, 8425, 4376, 15858, 12961, 18573, 14803, 24592, 1438, 30938,

+ 11620, 30520, 27858, 13939, 12079, 1360, 15969, 11140, 31493, 26612,

+ 28227, 5553, 19272, 22031, 25996, 20557, 2639, 23464, 24304, 20173,

+ 13067, 18431, 27782, 7036, 9451, 16857, 2764, 11888, 28414, 30232,

+ 25836, 12476, 22104, 5262, 11837, 32743, 7094, 3859, 13581, 1437,

+ 17509, 20181, 4766, 14245, 27231, 21488, 7278, 21523, 22456, 29503,

+ 31419, 11711, 28984, 9841, 2119, 7413, 13386, 8799, 24409, 26734,

+ 19476, 10140, 14340, 14975, 488, 16718, 31659, 30353, 3291, 26173,

+ 12741, 721, 1203, 12330, 10718, 23081, 31751, 7522, 1758, 31342,

+ 1441, 4243, 3982, 731, 10535, 733, 26712, 5822, 2811, 7212,

+ 6735, 22641, 19295, 9670, 2927, 4236, 24797, 2848, 19493, 21849,

+ 29158, 23798, 24082, 18056, 29113, 2714, 22540, 12580, 1158, 17805,

+ 2917, 12230, 28371, 17228, 3696, 6921, 5152, 20844, 20546, 24125,

+ 18630, 28649, 6582, 1120, 31525, 26044, 8116, 4426, 30718, 939,

+ 2738, 31527, 19998, 2405, 6010, 22570, 5437, 24782, 13614, 5248,

+ 7205, 9112, 17546, 17539, 16919, 7955, 23658, 26417, 32618, 19014,

+ 14220, 11484, 24949, 25150, 12182, 5666, 32175, 8358, 26971, 32544,

+ 8213, 16536, 5722, 27363, 14540, 17843, 28551, 8991, 19720, 14702,

+ 19791, 36, 28460, 21163, 214, 27917, 563, 15248, 21123, 31803,

+ 19534, 27026, 18878, 8194, 7374, 15314, 8696, 23457, 2373, 21421,

+ 4332, 120, 1512, 23438, 16933, 19317, 23864, 12295, 11201, 30416,

+ 19170, 7969, 8308, 5112, 15843, 12784, 17104, 16845, 1519, 13418,

+ 15811, 4879, 28692, 28537, 26209, 14614, 5787, 18766, 10979, 18116,

+ 26671, 16377, 29424, 8121, 10817, 29238, 21788, 26565, 31402, 10890,

+ 17839, 1699, 5266, 8335, 8871, 5092, 23697, 25740, 16640, 16169,

+ 30741, 10569, 24370, 2197, 29700, 24610, 8444, 23938, 16034, 23385,

+ 30816, 28019, 30900, 27313, 8175, 19274, 25062, 9784, 2630, 11964,

+ 25706, 23396, 27353, 27137, 994, 20577, 15343, 26576, 13184, 20906,

+ 26094, 17802, 22379, 15831, 27609, 23990, 30053, 949, 16663, 22189,

+ 22700, 18076, 11382, 2454, 11549, 7421, 23663, 21909, 21919, 7483,

+ 4268, 13120, 447, 11452, 31943, 7251, 18072, 17727, 18517, 7076,

+ 16118, 9328, 20515, 6489, 30395, 6585, 3263, 14168, 9601, 26204,

+ 16954, 20991, 31872, 25535, 23853, 30998, 2994, 25606, 8442, 29953,

+ 566, 231, 2900, 11322, 19955, 19642, 4354, 31999, 24189, 6608,

+ 6111, 24392, 3900, 19462, 21030, 25340, 31947, 26778, 24300, 24164,

+ 18846, 22589, 21486, 24800, 5608, 3945, 5261, 15833, 11963, 4340,

+ 6679, 17398, 14449, 32486, 4424, 29843, 22604, 11656, 28945, 20335,

+ 8537, 27837, 28311, 1700, 18586, 31637, 29311, 11997, 25699, 23072,

+ 29545, 16323, 15109, 28032, 22970, 30904, 25770, 10818, 20639, 32200,

+ 17536, 14575, 10319, 16604, 7450, 18653, 11664, 2865, 17427, 1355,

+ 6780, 15113, 14580, 24749, 1157, 2465, 9047, 10821, 27575, 28002,

+ 31821, 8691, 20285, 27739, 26366, 32334, 27431, 29423, 31887, 6387,

+ 874, 715, 3913, 13598, 24616, 19996, 10487, 5239, 24370, 4862,

+ 18575, 20014, 16076, 19255, 8981, 7241, 1456, 1061, 27581, 4925,

+ 11349, 29429, 26448, 30652, 27504, 6422, 20176, 9935, 21436, 3309,

+ 17759, 17444, 4854, 15051, 25949, 8873, 2604, 12828, 10449, 7002,

+ 6456, 21217, 12554, 18006, 17288, 28512, 12678, 19001, 4640, 13849,

+ 530, 13734, 22241, 30717, 7219, 5923, 13579, 7899, 1989, 18218,

+ 4865, 26651, 31458, 6268, 22860, 14254, 12549, 25273, 8931, 5957,

+ 15727, 6958, 17065, 13761, 23754, 28654, 16952, 31467, 2573, 6436,

+ 15837, 870, 23199, 21671, 16867, 6370, 26047, 16335, 3349, 31377,

+ 15139, 904, 23678, 2527, 11487, 1700, 9331, 12126, 28809, 6774,

+ 23252, 3071, 23451, 21916, 13966, 19080, 16152, 4380, 2148, 9538,

+ 9843, 15283, 4336, 29682, 32172, 30569, 30692, 22027, 25276, 13673,

+ 18582, 19746, 9779, 17424, 6076, 23458, 16160, 836, 13939, 31681,

+ 13873, 13063, 5767, 691, 19483, 4171, 17390, 17437, 24380, 13320,

+ 6037, 2508, 21631, 26765, 1888, 13223, 1921, 26900, 14188, 5090,

+ 1522, 16280, 12439, 23413, 6717, 13547, 24642, 10957, 26987, 1795,

+ 17749, 6849, 10308, 22932, 28292, 20935, 11192, 5349, 11729, 31080,

+ 22654, 9948, 9554, 10225, 13819, 23130, 4405, 4716, 10341, 14543,

+ 29441, 6862, 5672, 10757, 542, 3698, 31881, 17984, 1432, 10438,

+ 14217, 3721, 31520, 11845, 268, 32583, 12116, 13221, 27450, 12559,

+ 11072, 25937, 23078, 31677, 6948, 25369, 16557, 20420, 4727, 1064,

+ 9378, 14786, 20781, 5943, 11816, 17496, 28214, 29441, 18014, 11320,

+ 2887, 27383, 2370, 6783, 30172, 31796, 3791, 22854, 22910, 18099,

+ 20329, 13939, 26433, 9920, 10107, 2261, 5778, 684, 15967, 2929,

+ 25391, 8389, 21630, 790, 11383, 6533, 15544, 25144, 6628, 14858,

+ 1286, 24315, 10454, 27334, 4701, 12173, 18322, 28280, 13270, 24761,

+ 8586, 3419, 28941, 31417, 223, 157, 6086, 26700, 26916, 12818,

+ 19671, 21513, 20325, 9258, 9282, 28659, 4967, 5665, 1185, 23373,

+ 7730, 14453, 22983, 6832, 18893, 1437, 23204, 22106, 30281, 4856,

+ 26217, 21193, 28672, 28164, 15597, 22409, 2847, 22992, 5711, 30794,

+ 6242, 180, 24030, 29749, 5919, 28223, 5173, 8064, 18566, 25969,

+ 7338, 2880, 2087, 26410, 31210, 24447, 3509, 31971, 15837, 7055,

+ 31753, 7068, 12496, 12445, 24937, 13077, 29650, 10889, 3339, 15681,

+ 8798, 23286, 24021, 25080, 14139, 15005, 28263, 748, 14497, 29926,

+ 16987, 17374, 28573, 20921, 22731, 25362, 11958, 29073, 18452, 30208,

+ 27601, 4051, 18138, 24140, 12626, 16223, 17997, 2808, 10884, 21860,

+ 426, 23001, 20283, 30328, 9988, 11591, 29368, 31208, 32068, 2585,

+ 14796, 5964, 11119, 20945, 15425, 4703, 1319, 27923, 21877, 22798,

+ 117, 31324, 26696, 18383, 14533, 21744, 6712, 2100, 9010, 2068,

+ 18891, 15808, 22532, 638, 17454, 29945, 5495, 7690, 32283, 2238,

+ 24511, 20398, 21503, 29147, 25160, 5040, 5469, 13531, 30274, 27158,

+ 24429, 25118, 29277, 30559, 2826, 23595, 10193, 7536, 12747, 22598,

+ 12450, 8401, 3695, 19782, 29474, 11801, 15486, 17569, 32439, 21415,

+ 6957, 16841, 9694, 17299, 22402, 13243, 31088, 29156, 25018, 9428,

+ 2341, 25348, 20968, 7399, 3414, 15985, 32734, 27022, 24071, 31156,

+ 21072, 16573, 23332, 12183, 2359, 29085, 10763, 30611, 1908, 6039,

+ 27723, 20872, 24502, 942, 21419, 31153, 10397, 20499, 14191, 14550,

+ 23584, 20979, 3798, 1219, 17964, 23956, 29927, 1274, 18061, 4256,

+ 6509, 20389, 27154, 5825, 17217, 29390, 7916, 7277, 18375, 7634,

+ 2136, 25604, 7099, 32531, 13694, 12568, 24878, 10734, 16280, 32267,

+ 5835, 6381, 4950, 12256, 19551, 8253, 27009, 15435, 153, 25698,

+ 13024, 30218, 3086, 10537, 31576, 29560, 15743, 3294, 2134, 17248,

+ 2911, 960, 13938, 25615, 32400, 10162, 23116, 12461, 14958, 12339,

+ 10426, 14541, 17934, 9872, 27174, 13890, 31431, 10840, 32049, 5428,

+ 15346, 23057, 27804, 17012, 23535, 13353, 7273, 13325, 21097, 1072,

+ 21053, 24604, 10202, 12356, 7433, 5601, 14929, 31436, 24553, 27925,

+ 16243, 3177, 1101, 16254, 10175, 23081, 5974, 24770, 18199, 15358,

+ 22147, 2169, 26236, 18287, 28556, 8837, 8986, 17038, 30606, 31142,

+ 16004, 17194, 23913, 28745, 17472, 20037, 23398, 15265, 10374, 3016,

+ 11294, 21753, 17477, 25206, 1687, 5449, 21095, 4127, 9647, 12039,

+ 21078, 4630, 24254, 31295, 29631, 29157, 2935, 18150, 28566, 19006,

+ 19215, 10604, 29274, 6197, 24226, 30096, 31642, 11437, 9426, 23416,

+ 22200, 21008, 30897, 23297, 4333, 31300, 30689, 340, 4237, 2266,

+ 29689, 9402, 12684, 3464, 4907, 4785, 2882, 729, 25636, 25663,

+ 17259, 25891, 26932, 27782, 4722, 13754, 24239, 30105, 23791, 15971,

+ 16531, 16270, 1646, 10507, 21354, 30164, 24946, 16313, 13426, 3783,

+ 24761, 26818, 13564, 18818, 28098, 13116, 1298, 15860, 2189, 1972,

+ 29020, 13111, 5282, 20772, 14405, 12316, 30548, 12831, 14937, 31243,

+ 27463, 6735, 2545, 30218, 11568, 20513, 7699, 8219, 26076, 17087,

+ 11412, 3275, 30068, 14399, 28543, 10504, 1023, 11289, 22971, 11315,

+ 31528, 29151, 32487, 28790, 19777, 28712, 12937, 9560, 11657, 1998,

+ 8808, 4238, 7594, 31577, 28726, 20756, 29830, 27322, 3698, 22653,

+ 16947, 14141, 25741, 3720, 13636, 25529, 32332, 21235, 25931, 17673,

+ 19053, 20884, 9884, 5824, 11405, 23717, 19283, 18457, 26185, 16736,

+ 30104, 5421, 7076, 19148, 24353, 16489, 30376, 26326, 14841, 62,

+ 11857, 8611, 3712, 29978, 29862, 27429, 15028, 15256, 4137, 23276,

+ 30382, 28404, 9329, 26175, 623, 12225, 28182, 15468, 24797, 734,

+ 30157, 15708, 17417, 7334, 32468, 15978, 3763, 27751, 13457, 4469,

+ 3856, 31765, 23414, 564, 22219, 30784, 2343, 15818, 21577, 29764,

+ 10207, 22683, 4401, 16064, 18704, 26205, 14892, 23113, 2889, 22642,

+ 21481, 28255, 5981, 5749, 16741, 17567, 30914, 1299, 32617, 9787,

+ 21815, 28444, 14676, 11688, 18345, 1241, 6938, 24726, 25176, 26017,

+ 1165, 9765, 7222, 26535, 475, 27990, 11663, 4630, 11608, 6079,

+ 8175, 32096, 24190, 31876, 5441, 3538, 18994, 6018, 2612, 15469,

+ 30793, 14541, 6115, 25073, 12875, 18525, 30900, 14394, 20343, 29188,

+ 21632, 1487, 519, 19875, 6133, 10169, 2485, 22430, 23353, 28049,

+ 28541, 19853, 7120, 31709, 11941, 17205, 19904, 10397, 28411, 950,

+ 2035, 1568, 13406, 4869, 20444, 4124, 10111, 25501, 18526, 12030,

+ 23529, 5234, 18409, 1407, 14143, 19239, 6630, 15480, 24005, 32384,

+ 28501, 16631, 18466, 17690, 17076, 10386, 26213, 31834, 13091, 12283,

+ 29765, 23459, 6855, 2005, 25261, 18380, 25708, 25542, 31352, 31441,

+ 25710, 32718, 7289, 21448, 14553, 4055, 17086, 25367, 29903, 19853,

+ 10005, 1765, 6954, 6255, 13008, 11214, 11363, 23590, 7110, 1499,

+ 19379, 12566, 21146, 21937, 16247, 27444, 9792, 3592, 20697, 2839,

+ 16572, 27999, 20141, 17745, 24877, 24558, 14233, 5119, 30475, 15837,

+ 20345, 1695, 685, 14771, 9217, 17442, 24334, 4881, 17572, 29506,

+ 22736, 24992, 12725, 32022, 13953, 3144, 18125, 24036, 5662, 16547,

+ 9324, 30774, 17365, 32433, 23779, 7728, 28175, 3277, 26737, 17696,

+ 23214, 26591, 9388, 5975, 403, 980, 25378, 22584, 12388, 28747,

+ 19265, 20110, 7052, 13713, 4980, 10531, 131, 32208, 21903, 4494,

+ 15695, 24195, 621, 24908, 331, 22061, 14551, 11538, 31527, 21067,

+ 936, 6754, 10288, 20871, 17199, 13149, 10449, 30254, 17877, 11480,

+ 15962, 7396, 21504, 21169, 22017, 19351, 13111, 3683, 17703, 3249,

+ 25734, 15321, 6876, 2706, 8740, 16512, 10916, 32573, 24659, 6304,

+ 13435, 19537, 21896, 20204, 19992, 20284, 19916, 4696, 29039, 17835,

+ 19810, 24106, 21625, 22084, 18090, 26708, 28215, 4504, 26437, 18945,

+ 19701, 32595, 16506, 5742, 8652, 2998, 20184, 21499, 9578, 26952,

+ 9501, 2946, 14870, 15048, 15959, 25063, 28398, 6501, 15177, 28656,

+ 18547, 19250, 3856, 19543, 29256, 15828, 24327, 31774, 15927, 6525,

+ 6631, 15651, 5237, 31, 2611, 24308, 14631, 19673, 26579, 7652,

+ 2852, 26550, 11518, 13407, 8189, 406, 12894, 5754, 24891, 19564,

+ 22127, 3022, 3815, 938, 13353, 7047, 19280, 22778, 11486, 32440,

+ 5128, 6447, 18789, 3314, 19504, 7547, 13944, 22292, 15349, 23778,

+ 24667, 25700, 10587, 12782, 29118, 17887, 28218, 10405, 14821, 29646,

+ 12165, 26808, 15878, 10650, 6610, 4093, 31219, 13281, 18199, 4383,

+ 5112, 25801, 12722, 27285, 2055, 8853, 22701, 18896, 3602, 17526,

+ 31039, 28345, 16313, 12707, 406, 25434, 16677, 30379, 8403, 23515,

+ 28980, 17674, 6231, 21169, 25814, 4347, 12861, 13586, 12727, 16782,

+ 295, 13228, 19486, 9978, 19774, 2966, 31765, 11060, 21108, 23431,

+ 11722, 28865, 13325, 22854, 8501, 21448, 18781, 31585, 15611, 363,

+ 10195, 27426, 2194, 6487, 3638, 21183, 4518, 3482, 5423, 23505,

+ 16572, 13494, 18696, 29191, 24854, 16883, 4275, 7708, 24534, 6137,

+ 1550, 3334, 1638, 10653, 9061, 6001, 13334, 23804, 27192, 23915,

+ 23303, 9414, 26431, 19041, 17481, 17373, 14252, 5450, 24384, 28447,

+ 29616, 4386, 8268, 16767, 8768, 24986, 12968, 13915, 6681, 26638,

+ 403, 7690, 29698, 31927, 23726, 16564, 29265, 18466, 15270, 9062,

+ 432, 20704, 25874, 9061, 14113, 4480, 31903, 23491, 28480, 10938,

+ 15466, 2353, 29384, 1517, 23981, 24596, 17497, 31692, 29854, 2267,

+ 31609, 21331, 17300, 13967, 20696, 11521, 18796, 2987, 16344, 11841,

+ 3883, 16687, 24908, 297, 30948, 17392, 25472, 31846, 7645, 15410,

+ 17275, 1911, 27629, 13176, 11136, 3866, 6696, 19611, 6875, 7684,

+ 11967, 16922, 15066, 28117, 7201, 7857, 1305, 1099, 14694, 25645,

+ 7938, 12470, 6638, 5246, 3733, 32172, 2117, 20750, 11365, 27389,

+ 10314, 1105, 30435, 1001, 1169, 18846, 10975, 9617, 2821, 1853,

+ 17740, 2476, 15570, 28353, 21060, 27003, 5506, 22423, 11596, 19711,

+ 28005, 10208, 5848, 23145, 23351, 16252, 17170, 14802, 22781, 6503,

+ 17879, 24876, 12336, 5961, 2, 23673, 28957, 11080, 29166, 26171,

+ 31116, 21537, 5942, 25643, 20128, 8055, 12223, 7213, 19966, 9835,

+ 6649, 13700, 31281, 14444, 8801, 23106, 26190, 10320, 27723, 3331,

+ 1235, 28580, 22494, 1755, 24021, 7233, 2400, 12685, 28763, 15392,

+ 30132, 4606, 17157, 15216, 6176, 14057, 26609, 26853, 13652, 32723,

+ 30686, 5202, 20392, 20546, 18578, 31610, 12454, 810, 25210, 31012,

+ 11208, 12968, 31121, 10861, 32386, 10226, 28034, 32354, 29059, 1935,

+ 5393, 25550, 7993, 3523, 22711, 2385, 915, 28494, 24716, 25522,

+ 14602, 12886, 22891, 28278, 1762, 5025, 5456, 23218, 9389, 19463,

+ 2820, 8221, 22290, 18983, 30973, 9321, 18892, 13402, 12159, 27860,

+ 19189, 18149, 17928, 3578, 19333, 25203, 16363, 19949, 18710, 24258,

+ 25659, 11399, 1258, 30108, 19690, 17919, 11310, 23049, 28978, 17339,

+ 21888, 20419, 12084, 20325, 30640, 22250, 6368, 15425, 15811, 16377,

+ 2068, 23230, 23614, 15353, 15880, 10827, 19361, 15604, 4585, 23915,

+ 3121, 15021, 29380, 25612, 22266, 12174, 16550, 28693, 24597, 25058,

+ 16642, 10302, 3623, 19780, 12882, 32036, 19242, 16471, 17153, 21661,

+ 21104, 696, 28553, 32584, 8164, 5937, 3033, 11369, 25748, 28208,

+ 31737, 20468, 9324, 7287, 24560, 12008, 24900, 27156, 14054, 1502,

+ 30494, 19860, 15750, 32226, 3496, 10100, 2982, 25473, 17161, 20952,

+ 13610, 21539, 29657, 22655, 29221, 21916, 17521, 27895, 4674, 3069,

+ 20326, 27405, 16227, 432, 7504, 392, 21383, 13764, 18896, 21271,

+ 17905, 25733, 31185, 9095, 29575, 15952, 1805, 25913, 18040, 165,

+ 1235, 15060, 289, 9598, 520, 16695, 12338, 7391, 11373, 13746,

+ 2060, 17583, 14623, 19573, 12654, 4806, 13924, 19272, 18769, 9543,

+ 10916, 15485, 6160, 11568, 9398, 20003, 17356, 26415, 8542, 12669,

+ 527, 5816, 27155, 3763, 3247, 14164, 20741, 24774, 24054, 22588,

+ 28254, 19913, 30719, 22054, 17096, 20303, 15203, 26463, 25392, 16160,

+ 4374, 11802, 4554, 7216, 27531, 17672, 26710, 7121, 25375, 31272,

+ 30625, 23335, 29108, 11233, 78, 17628, 4508, 31822, 10454, 32534,

+ 17338, 20185, 21710, 30118, 16611, 17419, 361, 21635, 23178, 10146,

+ 19261, 1654, 20125, 1252, 330, 3094, 4778, 21812, 26936, 16119,

+ 23110, 31971, 6368, 21791, 23727, 2632, 2318, 14521, 7600, 27411,

+ 17797, 2062, 15813, 3038, 24132, 20912, 5504, 5637, 32264, 24824,

+ 8235, 16312, 18962, 11955, 31151, 25166, 28458, 18969, 29621, 19164,

+ 32740, 19967, 1546, 30983, 2082, 13901, 7752, 16406, 31194, 10673,

+ 4787, 32332, 22298, 2965, 15457, 24180, 15689, 27215, 31902, 22461,

+ 13743, 7576, 12686, 24520, 28472, 10560, 24084, 768, 17780, 14368,

+ 2291, 22314, 14563, 17231, 5939, 31804, 15472, 14745, 9671, 8051,

+ 31803, 15148, 9836, 13472, 411, 15765, 17364, 22979, 22628, 11243,

+ 20740, 6362, 6501, 22346, 18427, 31739, 32309, 19331, 7060, 10145,

+ 25136, 23570, 24749, 28484, 21692, 32081, 4745, 6188, 8401, 15851,

+ 30323, 16006, 28088, 29842, 25252, 4280, 23826, 30197, 27751, 21746,

+ 18973, 26348, 16763, 27909, 3635, 32502, 12473, 19577, 28307, 20198,

+ 9718, 5337, 5988, 24537, 7467, 19538, 18423, 15979, 20692, 25213,

+ 5197, 17963, 10133, 30584, 24537, 16716, 9507, 6459, 30086, 12445,

+ 25186, 27433, 24828, 20411, 20683, 27622, 27935, 10628, 19729, 19817,

+ 27609, 20688, 17668, 4946, 11034, 4444, 29877, 27517, 15133, 11527,

+ 32475, 29911, 27116, 31041, 25717, 26736, 6182, 28864, 8113, 22738,

+ 19200, 3444, 26125, 31634, 8074, 32446, 21948, 12580, 820, 4061,

+ 4683, 16115, 21904, 21161, 5252, 28593, 22361, 25219, 12691, 3564,

+ 2741, 21388, 7527, 27875, 26807, 8725, 27739, 29591, 4136, 13911,

+ 22550, 24101, 20871, 20580, 19375, 10578, 15438, 28766, 31509, 23656,

+ 4471, 3815, 2479, 9537, 16191, 14808, 1087, 31393, 18986, 26934,

+ 12812, 14537, 18247, 8290, 320, 27720, 19381, 12175, 4751, 16149,

+ 30054, 10617, 10265, 15323, 28963, 24917, 31634, 23444, 8656, 1283,

+ 16288, 4441, 19698, 10123, 20612, 18552, 28782, 20423, 22525, 2248,

+ 9619, 24413, 26729, 13625, 13659, 26097, 21294, 6319, 16878, 13464,

+ 15960, 13585, 10600, 17807, 15748, 2204, 1500, 19501, 29180, 15742,

+ 28313, 278, 30243, 30624, 24236, 32434, 6164, 13507, 25766, 16861,

+ 10118, 29390, 32671, 8928, 23283, 4198, 19834, 23200, 4089, 7104,

+ 28267, 26646, 27392, 947, 16823, 27135, 6685, 24338, 24507, 16597,

+ 16182, 15928, 30000, 3325, 17767, 15076, 25517, 23874, 9637, 14920,

+ 19309, 8578, 24225, 5468, 25171, 13735, 9199, 7032, 15403, 6361,

+ 2152, 8994, 26675, 9459, 10189, 7461, 2010, 23091, 5037, 24035,

+ 17095, 4917, 1928, 4331, 15389, 13602, 10292, 2766, 27902, 12325,

+ 21120, 27951, 2126, 25630, 15640, 20762, 19385, 15771, 29096, 27543,

+ 25079, 7940, 24900, 24702, 14926, 27157, 6152, 14220, 31065, 15761,

+ 21499, 10167, 26377, 15157, 825, 11455, 32233, 27115, 27986, 6918,

+ 32678, 2113, 3053, 9633, 13006, 25369, 22193, 2735, 11736, 1186,

+ 1637, 23017, 21349, 20359, 4949, 2427, 25541, 23142, 29432, 19731,

+ 18365, 8067, 22737, 25399, 30855, 21694, 32403, 19675, 10523, 32706,

+ 14216, 9011, 5293, 6784, 21299, 32710, 5751, 23516, 4917, 10948,

+ 28344, 30885, 14445, 921, 22781, 28875, 27491, 22466, 22431, 15564,

+ 999, 7135, 22669, 28528, 29685, 15114, 5963, 8118, 23004, 28776,

+ 24635, 12046, 32159, 24317, 6428, 16328, 15772, 23493, 13008, 28621,

+ 11883, 7680, 26722, 11149, 29193, 18893, 28487, 11576, 2614, 2298,

+ 31972, 31793, 10779, 9755, 17745, 192, 19248, 24025, 22365, 7,

+ 2397, 23181, 31186, 5175, 2656, 3598, 28154, 29955, 29806, 24006,

+ 15201, 9301, 14365, 21772, 26845, 21312, 12673, 20910, 18124, 4919,

+ 25749, 24268, 11933, 10108, 22749, 12781, 23442, 2778, 22602, 32332,

+ 16579, 32151, 5470, 4723, 103, 12197, 31888, 29707, 26703, 23320,

+ 13554, 28147, 6067, 25309, 5137, 17551, 12849, 18856, 2333, 1123,

+ 17427, 5422, 17226, 7904, 15313, 29077, 6005, 18813, 7382, 10536,

+ 26891, 21258, 20359, 17488, 6695, 25409, 12930, 26047, 18170, 22687,

+ 20771, 14063, 20592, 14450, 25421, 30923, 31248, 25906, 31335, 3244,

+ 7973, 3860, 32676, 2438, 17179, 4829, 26504, 12644, 299, 15092,

+ 16040, 23313, 7995, 5820, 29617, 9240, 18431, 23584, 683, 32495,

+ 12389, 1904, 25983, 29040, 11312, 11627, 28087, 6024, 30178, 13213,

+ 27526, 15923, 11744, 25323, 17928, 10920, 21713, 2156, 26826, 25040,

+ 17735, 6266, 10893, 1021, 28833, 2057, 4423, 4313, 25392, 20536,

+ 5995, 10141, 21400, 20518, 22122, 6019, 16761, 263, 14970, 21629,

+ 26447, 12407, 9110, 9255, 919, 13581, 6086, 5882, 15668, 20788,

+ 27296, 8643, 10000, 14390, 32271, 27476, 9990, 27034, 83, 8826,

+ 17408, 22192, 19273, 28719, 8028, 1642, 18669, 23056, 7573, 11117,

+ 285, 10513, 543, 24680, 13472, 10351, 658, 32421, 10598, 20710,

+ 5387, 17118, 3089, 13349, 32207, 13393, 2741, 15487, 24626, 534,

+ 3292, 5347, 22200, 19121, 11470, 19726, 22137, 484, 22031, 3583,

+ 25034, 26823, 11560, 29355, 19993, 19482, 9386, 22771, 8473, 31961,

+ 25457, 16083, 18720, 14097, 24614, 32732, 13517, 27379, 22023, 1764,

+ 3565, 7206, 30443, 18428, 7071, 19298, 32384, 5794, 4023, 7739,

+ 2776, 11320, 17249, 14650, 24100, 29365, 9991, 50, 28095, 26523,

+ 26996, 12497, 25198, 11049, 6713, 2934, 28134, 4049, 19279, 32322,

+ 6542, 15852, 30207, 1650, 29319, 16301, 9983, 15340, 14058, 2387,

+ 13790, 15127, 26704, 20899, 2977, 24816, 26520, 20118, 15535, 3419,

+ 32228, 10831, 31210, 24502, 30437, 17487, 7455, 8628, 12377, 4844,

+ 21664, 21609, 17105, 14591, 12847, 5025, 10168, 9182, 8478, 17270,

+ 145, 17802, 1973, 15394, 25472, 16169, 6100, 26641, 20748, 4022,

+ 4825, 2107, 14115, 6903, 1220, 4784, 9566, 7343, 15002, 24436,

+ 5767, 23574, 30727, 6030, 29529, 13190, 12358, 6748, 12934, 16503,

+ 17990, 19753, 14847, 20397, 6149, 2305, 25967, 22960, 22848, 6852,

+ 22024, 9085, 335, 2426, 28547, 22395, 20555, 5862, 9826, 10928,

+ 12145, 11870, 889, 25141, 28875, 13786, 172, 19687, 12813, 30026,

+ 8954, 1376, 26301, 2093, 30139, 4134, 19862, 3423, 19237, 10785,

+ 21807, 2354, 26133, 23379, 13272, 11713, 28941, 8643, 14020, 32129,

+ 26232, 18618, 3182, 31769, 20022, 16434, 3637, 24948, 29780, 2188,

+ 19785, 788, 32027, 1665, 26315, 26537, 31309, 21339, 25392, 14562,

+ 26027, 23909, 9447, 1923, 9402, 27808, 10811, 5560, 31175, 24503,

+ 9850, 7080, 1577, 13621, 13911, 14926, 16838, 13558, 13197, 4228,

+ 3033, 19931, 27589, 9825, 14578, 31682, 16058, 8901, 16958, 18870,

+ 26523, 32562, 31240, 17506, 30129, 11742, 27008, 28876, 14401, 26118,

+ 15291, 6976, 8628, 2692, 23036, 4745, 26101, 24228, 7474, 9064,

+ 22555, 32052, 14529, 26686, 19272, 17882, 17029, 16652, 31440, 13483,

+ 31764, 1949, 15774, 22520, 16708, 21506, 2260, 22635, 16366, 25919,

+ 1458, 18259, 23793, 580, 16057, 10045, 27257, 26399, 10256, 25284,

+ 4993, 4719, 1830, 9642, 8342, 1820, 32153, 19495, 31198, 22085,

+ 15191, 23680, 2650, 1402, 7171, 16092, 26728, 9516, 13210, 10068,

+ 26508, 11105, 3670, 26185, 30575, 26284, 10194, 4858, 29736, 7517,

+ 23920, 17493, 19387, 11509, 24568, 19470, 7391, 15837, 26753, 10223,

+ 13061, 24407, 13461, 7535, 917, 8116, 3472, 13189, 4219, 29896,

+ 24393, 32446, 21474, 2203, 8692, 29582, 6463, 15969, 6983, 13027,

+ 26514, 940, 15068, 1280, 24809, 16865, 5591, 30345, 15141, 1000,

+ 17864, 19418, 13824, 9256, 11987, 16029, 12879, 5811, 28942, 14748,

+ 20101, 9149, 2346, 1747, 11385, 9811, 25686, 9162, 17513, 9034,

+ 27488, 12322, 26942, 19573, 18717, 10861, 25105, 17435, 28684, 28483,

+ 15599, 13479, 9014, 11922, 16089, 4258, 1624, 19253, 5391, 3807,

+ 31044, 22728, 11151, 14069, 17029, 11195, 19672, 4594, 19778, 12198,

+ 28403, 21326, 32357, 30684, 20916, 3614, 25851, 15939, 21054, 19082,

+ 18910, 17507, 6085, 3969, 25234, 19132, 32152, 13484, 11118, 4701,

+ 24158, 4256, 11516, 7346, 9375, 22359, 12450, 7582, 17543, 15585,

+ 10369, 21449, 743, 12375, 20125, 15164, 11645, 17169, 16190, 20011,

+ 10357, 4120, 4759, 18449, 29999, 14302, 14758, 7939, 5699, 17453,

+ 8795, 10045, 29891, 2142, 26364, 5378, 10944, 20939, 3272, 20643,

+ 22287, 31879, 5595, 20701, 24140, 16460, 27217, 28519, 15648, 18868,

+ 23726, 27596, 20416, 29612, 19838, 4215, 12982, 13606, 12856, 11788,

+ 8420, 5903, 872, 24831, 29382, 18049, 22029, 21855, 8951, 5945,

+ 9280, 31986, 31735, 2635, 2327, 27527, 21291, 11540, 29641, 19848,

+ 29989, 25713, 5651, 11471, 10022, 30766, 4570, 30650, 25057, 29378,

+ 10769, 32386, 10626, 10553, 31453, 23240, 9967, 32625, 31991, 30065,

+ 26190, 15497, 22611, 7860, 24263, 919, 18943, 27761, 10123, 17561,

+ 8525, 21189, 32277, 14767, 6196, 10971, 432, 17543, 2804, 7173,

+ 18489, 16408, 21241, 6923, 12326, 6803, 18690, 29635, 5063, 19350,

+ 12930, 4321, 16844, 31395, 7750, 30225, 24328, 27090, 29785, 8259,

+ 5492, 30914, 15653, 16454, 13431, 21461, 25562, 921, 9828, 9117,

+ 30740, 24446, 24389, 20625, 12984, 4687, 10455, 12037, 16926, 20245,

+ 28629, 10073, 8566, 18263, 30329, 11888, 32612, 1840, 4161, 8803,

+ 30702, 22436, 19183, 24439, 9624, 6964, 10451, 8525, 19917, 22704,

+ 20556, 1113, 11393, 26701, 21645, 15253, 8981, 30456, 31645, 20087,

+ 20091, 21481, 9633, 29472, 18586, 15482, 14686, 22742, 6388, 6714,

+ 14842, 30388, 6278, 26429, 27138, 12960, 19695, 11447, 8114, 29822,

+ 32469, 20425, 11888, 31139, 3973, 8347, 2457, 31885, 20953, 24491,

+ 1152, 1233, 27231, 11621, 21428, 29524, 31415, 6131, 13186, 7870,

+ 7229, 15190, 22459, 5164, 28137, 10166, 2232, 20518, 14707, 502,

+ 4506, 976, 29626, 4748, 25558, 14948, 7270, 13968, 5106, 29407,

+ 16588, 26386, 5001, 507, 9747, 19121, 19605, 20574, 24213, 1385,

+ 494, 18705, 20104, 15021, 6413, 3123, 25566, 30134, 12566, 14831,

+ 1385, 27674, 11030, 27051, 32067, 20128, 1928, 8578, 25197, 7251,

+ 15647, 25077, 17846, 11221, 27839, 6621, 9695, 24310, 5836, 5796,

+ 28412, 13445, 13736, 17589, 2333, 11367, 24951, 21553, 14894, 12773,

+ 24870, 5604, 24348, 74, 19627, 9335, 16442, 13742, 9358, 11751,

+ 1250, 2061, 680, 28982, 2655, 20636, 18475, 17504, 8714, 24924,

+ 27874, 13968, 31412, 22767, 21434, 8852, 14660, 26795, 18562, 17806,

+ 1185, 16621, 2799, 11757, 2259, 6063, 2787, 5788, 13669, 32093,

+ 14830, 633, 15117, 29669, 5654, 11273, 3215, 31758, 20947, 7530,

+ 26334, 3338, 15710, 1161, 9348, 10830, 21803, 6037, 24645, 2977,

+ 6580, 7603, 11007, 2931, 5241, 28659, 22741, 20337, 11845, 1666,

+ 10636, 24406, 15026, 26146, 20533, 7684, 23791, 472, 7693, 22739,

+ 10689, 25828, 21665, 24873, 10952, 14582, 25398, 25675, 9988, 31903,

+ 4967, 30066, 21656, 32262, 26896, 32290, 22477, 28124, 14699, 2231,

+ 13145, 7826, 15737, 6465, 3554, 17353, 9124, 2193, 28862, 17930,

+ 25762, 5524, 25597, 32439, 24476, 8416, 2985, 28737, 400, 18061,

+ 10828, 20124, 31732, 19014, 11443, 27632, 20124, 2463, 8946, 23954,

+ 10461, 26793, 19112, 27954, 26099, 27845, 3716, 10838, 10400, 31157,

+ 7944, 12295, 23062, 25849, 2189, 29385, 4119, 21336, 27272, 10961,

+ 7771, 5309, 13323, 11891, 22322, 29252, 2447, 20698, 16234, 8853,

+ 14320, 6395, 14707, 22641, 22713, 25803, 27585, 8074, 2978, 19632,

+ 26226, 31640, 26967, 23350, 19505, 32169, 4987, 27908, 602, 17336,

+ 1517, 19726, 11358, 5762, 3402, 24844, 30314, 6549, 1715, 31274,

+ 29507, 16810, 19664, 7681, 4469, 1332, 30228, 23494, 27564, 31545,

+ 18499, 449, 30818, 23649, 1330, 18177, 23738, 6733, 29903, 15695,

+ 26284, 297, 20576, 8032, 29283, 6021, 29456, 20303, 16099, 12384,

+ 29607, 6474, 30191, 25478, 2969, 3723, 27434, 24605, 28482, 3209,

+ 22140, 19834, 31600, 17520, 3511, 11833, 23586, 22223, 379, 31116,

+ 4239, 22417, 343, 24275, 28778, 20015, 2864, 26477, 5733, 1572,

+ 10727, 27342, 21492, 17312, 10038, 2258, 4691, 12416, 5339, 7761,

+ 17610, 5502, 28921, 26612, 20528, 13221, 27067, 18247, 2990, 21001,

+ 1082, 24079, 16069, 21428, 10913, 29661, 16530, 27107, 25999, 23011,

+ 7249, 13939, 17596, 16647, 24353, 29334, 15072, 13878, 29446, 28106,

+ 28880, 14587, 11060, 30988, 21482, 8272, 25995, 4680, 25524, 16820,

+ 25950, 25621, 704, 3709, 19320, 28063, 20179, 7024, 20321, 26340,

+ 17477, 18063, 7645, 13604, 12459, 28466, 182, 914, 14516, 29785,

+ 13243, 21584, 30033, 27969, 2825, 7578, 27673, 20533, 20105, 18242,

+ 26347, 31655, 28346, 7260, 28373, 21887, 30385, 1338, 28212, 29875,

+ 24414, 7579, 15901, 2328, 10256, 31519, 8956, 30072, 22587, 14334,

+ 31867, 20452, 20090, 5626, 11430, 15435, 208, 19858, 31308, 21836,

+ 4659, 23929, 29352, 5961, 24907, 28230, 3648, 445, 29815, 7789,

+ 7438, 25295, 26385, 19054, 15838, 295, 15347, 9548, 25847, 6144,

+ 14649, 13633, 13821, 22910, 12617, 2224, 13590, 27458, 23825, 14171,

+ 4940, 4413, 11152, 982, 6707, 31425, 10904, 12604, 31435, 26078,

+ 27858, 24864, 935, 3307, 4354, 3526, 591, 4707, 20108, 29843,

+ 21476, 24307, 11064, 1219, 26882, 9680, 15922, 9818, 16618, 846,

+ 9301, 27997, 8161, 27055, 2472, 3393, 1235, 20536, 27689, 8356,

+ 8764, 22667, 31690, 6459, 24137, 24112, 15290, 27660, 7738, 9333,

+ 18661, 19933, 24842, 5752, 27070, 5100, 27986, 19842, 19260, 3296,

+ 5739, 20886, 3874, 26112, 23762, 18506, 3972, 28835, 28113, 1494,

+ 31623, 23527, 18012, 13419, 12648, 13990, 32058, 1478, 31168, 19878,

+ 30821, 8964, 2054, 14864, 4530, 20152, 25685, 13348, 28340, 27963,

+ 8815, 32298, 4062, 26435, 2563, 31660, 23273, 6839, 5163, 18658,

+ 9333, 19906, 25145, 26222, 31987, 22567, 4531, 19786, 17602, 30420,

+ 4508, 32510, 19352, 32185, 23797, 26134, 32548, 23514, 16004, 6867,

+ 27890, 9635, 468, 24609, 7054, 6524, 13693, 27849, 32492, 21150,

+ 25253, 21736, 3079, 7717, 24007, 10144, 12233, 9830, 5300, 5389,

+ 11563, 26754, 32215, 12410, 9885, 10300, 3260, 8917, 22184, 22023,

+ 20436, 24929, 15314, 7011, 7026, 15531, 15298, 362, 26138, 23487,

+ 420, 26022, 14843, 30619, 7119, 12582, 24506, 27364, 7333, 1489,

+ 9841, 27096, 17083, 22010, 27896, 30340, 27707, 6708, 20579, 25911,

+ 22918, 6503, 9163, 1334, 797, 30499, 5458, 16817, 1729, 31797,

+ 9313, 20214, 28633, 19832, 19764, 14309, 24341, 1262, 3481, 24484,

+ 21841, 24847, 9972, 19348, 9660, 32353, 16775, 18819, 21305, 20297,

+ 21744, 17955, 23813, 17953, 31219, 26554, 16026, 25994, 2426, 16668,

+ 9940, 11012, 11482, 12503, 10835, 1980, 17240, 16557, 29984, 23460,

+ 16620, 6471, 16275, 9929, 27205, 24103, 2676, 25826, 4620, 1503,

+ 26208, 18212, 15213, 640, 19054, 16478, 17876, 20054, 15891, 5953,

+ 1524, 12498, 23107, 29439, 28686, 20424, 26073, 5657, 14192, 24795,

+ 4409, 15217, 1852, 3893, 5428, 18855, 14442, 27003, 14636, 20642,

+ 10512, 27647, 1144, 1389, 6369, 31544, 7945, 12357, 12020, 25200,

+ 9550, 16624, 3272, 10941, 29526, 32080, 4740, 24114, 11061, 32311,

+ 14467, 2902, 31400, 28285, 8719, 7381, 25596, 16464, 19821, 22902,

+ 3627, 19660, 1307, 8269, 24649, 4555, 30293, 13618, 27678, 511,

+ 4317, 12658, 27669, 6974, 5116, 27844, 22613, 14108, 27844, 29310,

+ 22317, 18879, 18841, 22280, 3253, 751, 1776, 401, 3506, 1389,

+ 22869, 15874, 31163, 10374, 22707, 11056, 154, 30695, 20688, 22870,

+ 22261, 26035, 31511, 11458, 24110, 25299, 1434, 22734, 903, 20878,

+ 2903, 1810, 6794, 1625, 25018, 32472, 13992, 19184, 24420, 24784,

+ 18464, 6053, 43, 19206, 34, 30456, 2658, 30992, 16436, 18281,

+ 6490, 13452, 6358, 20362, 12584, 10698, 7009, 22616, 16297, 29893,

+ 821, 16843, 11972, 31320, 31251, 17836, 27631, 25006, 31688, 23719,

+ 2293, 16891, 7436, 31137, 23030, 22633, 14761, 3916, 13487, 23126,

+ 19936, 5112, 13563, 14268, 32520, 30636, 10906, 25072, 6008, 16501,

+ 5170, 27280, 31143, 16638, 19347, 3766, 20114, 7521, 18239, 626,

+ 29534, 4669, 5418, 4216, 27199, 12809, 29374, 25109, 21144, 3239,

+ 9762, 872, 11364, 30012, 31932, 30670, 27348, 23104, 4853, 29342,

+ 6713, 25553, 18748, 2071, 7461, 19533, 2637, 27286, 17613, 10015,

+ 18099, 2060, 18610, 2521, 18827, 7088, 24961, 19332, 19084, 2033,

+ 2871, 20019, 24900, 3247, 12936, 1759, 15780, 11690, 20866, 14190,

+ 18879, 23867, 16238, 3861, 6351, 16194, 14327, 9440, 18297, 6239,

+ 23950, 143, 12626, 15717, 15116, 9636, 8097, 5899, 2201, 21690,

+ 21863, 3557, 14285, 30488, 7324, 29331, 2838, 26758, 14524, 13881,

+ 15450, 4960, 25218, 1839, 30429, 4840, 12531, 9721, 10340, 20448,

+ 5023, 1657, 28059, 19289, 16932, 4451, 7604, 3014, 17651, 6642,

+ 14673, 24660, 31575, 23513, 16548, 28286, 17075, 5501, 13524, 15835,

+ 8971, 4705, 18595, 13883, 9413, 14817, 1103, 17395, 13233, 30244,

+ 24757, 5749, 13128, 1868, 7612, 11556, 10289, 5871, 22513, 9830,

+ 6922, 8139, 8559, 1274, 6244, 32181, 8706, 24460, 29199, 14803,

+ 652, 11910, 9625, 26379, 10151, 11306, 3089, 8891, 32651, 31454,

+ 14096, 3499, 26419, 1478, 7931, 20800, 27323, 20376, 1666, 1266,

+ 25869, 9132, 14188, 2047, 17084, 23891, 31895, 9057, 27696, 14698,

+ 32058, 2046, 6916, 26159, 23918, 32032, 7852, 17747, 18413, 21284,

+ 21595, 5200, 17689, 28278, 22051, 28412, 832, 32445, 9567, 24670,

+ 29726, 13906, 21582, 30145, 25507, 5623, 29440, 2056, 27639, 8390,

+ 17270, 12097, 27324, 3175, 30981, 5245, 23443, 16774, 1787, 5598,

+ 15329, 16516, 17029, 28913, 23507, 15981, 23504, 26430, 16543, 3627,

+ 29295, 4382, 31757, 10745, 18685, 21197, 7479, 28954, 23555, 10176,

+ 7820, 28106, 24603, 14393, 29979, 14197, 27478, 27928, 9487, 17703,

+ 19932, 30196, 32629, 17476, 24018, 30058, 27974, 18297, 14977, 18357,

+ 27553, 25074, 19124, 6015, 7512, 717, 31329, 13559, 5550, 9423,

+ 31628, 25380, 16479, 9814, 3689, 3961, 2785, 23951, 5313, 10153,

+ 13034, 15593, 29846, 445, 24114, 7114, 3594, 2659, 24442, 30592,

+ 18557, 11657, 19661, 16506, 31478, 11562, 19206, 1976, 13252, 23144,

+ 12946, 8320, 9061, 25820, 29047, 2643, 11942, 13354, 20117, 14111,

+ 27660, 32728, 29228, 438, 4211, 6496, 22431, 26751, 3829, 7299,

+ 3192, 24683, 28685, 31201, 24747, 21547, 9212, 4039, 27679, 9121,

+ 21612, 17736, 3434, 14228, 31060, 23439, 17885, 32167, 13595, 26995,

+ 5824, 24716, 15360, 13644, 17374, 4213, 19129, 24837, 8005, 12235,

+ 28762, 7283, 16967, 14371, 12153, 20965, 22468, 11118, 14992, 253,

+ 23468, 25967, 20386, 15294, 29631, 8563, 30498, 31205, 17815, 2108,

+ 10768, 13949, 28137, 23102, 9061, 2990, 32008, 2574, 24753, 16598,

+ 7338, 23319, 5635, 32475, 17135, 22671, 6409, 7871, 5791, 14505,

+ 1912, 18036, 26803, 12, 11438, 18418, 26392, 31109, 27287, 30344,

+ 27823, 22008, 10701, 26223, 4760, 2205, 5379, 19109, 26288, 13160,

+ 9123, 25848, 27480, 14281, 14262, 15457, 17529, 16278, 21253, 3476,

+ 13765, 21062, 10109, 10709, 22079, 19039, 1752, 14349, 7421, 16177,

+ 30074, 3101, 11052, 14021, 25753, 2162, 30550, 13329, 22433, 15834,

+ 15840, 30061, 30935, 15766, 23255, 30539, 24892, 20912, 28908, 3874,

+ 6068, 3983, 444, 12971, 2919, 30920, 23381, 16208, 3432, 7735,

+ 32502, 21986, 3477, 31055, 25879, 7818, 7870, 28590, 17065, 2306,

+ 1545, 13556, 13215, 23812, 22932, 32470, 28333, 12035, 29277, 16238,

+ 26192, 3354, 13663, 22997, 31502, 30786, 30718, 1268, 8959, 32199,

+ 933, 20631, 10892, 1277, 31918, 195, 29303, 9519, 12418, 13130,

+ 20252, 6104, 3841, 924, 27894, 6933, 21284, 8416, 24164, 22619,

+ 7904, 2628, 13997, 9061, 3662, 26001, 22082, 9585, 1546, 9218,

+ 19524, 18604, 16601, 26966, 28998, 30699, 24718, 26916, 8020, 1691,

+ 1582, 11887, 11060, 21755, 13650, 378, 747, 1161, 1741, 24541,

+ 5508, 20665, 28303, 15065, 26636, 24557, 6345, 28649, 31713, 8354,

+ 8786, 12185, 27181, 1767, 12362, 18075, 22701, 15892, 11005, 32024,

+ 11191, 8888, 8201, 68, 6523, 6355, 4036, 2613, 649, 4678,

+ 10712, 15349, 13203, 22919, 15664, 24022, 29812, 29849, 24344, 31237,

+ 2162, 13372, 3487, 1378, 960, 17249, 20800, 2703, 6727, 19168,

+ 8642, 2887, 19367, 32109, 4701, 3058, 4216, 8137, 2334, 32118,

+ 27861, 24885, 1421, 31055, 3099, 6188, 14988, 994, 18926, 14161,

+ 32642, 18702, 19581, 3751, 23737, 1797, 5127, 11520, 14085, 7002,

+ 9119, 30136, 24231, 26203, 10028, 16034, 1392, 30880, 15027, 2627,

+ 24618, 16100, 14041, 12862, 30515, 8212, 9891, 5648, 27243, 16806,

+ 19073, 8701, 11344, 26156, 19595, 16970, 30824, 6697, 2570, 5805,

+ 2272, 8995, 5690, 31234, 20338, 25849, 23118, 12863, 13708, 12663,

+ 30389, 23722, 10158, 13864, 18844, 27210, 28691, 31851, 16052, 16539,

+ 9365, 12233, 19509, 21126, 11211, 7814, 16675, 17807, 7540, 10358,

+ 18640, 30545, 536, 4114, 18338, 30503, 13804, 25035, 29974, 18477,

+ 29431, 26015, 22277, 32615, 18035, 20201, 550, 4671, 30070, 7805,

+ 17365, 26933, 5329, 27380, 6418, 2770, 22584, 837, 5837, 29405,

+ 23716, 8086, 10081, 27090, 29174, 5201, 16734, 28816, 10205, 15225,

+ 31627, 5202, 8697, 2111, 8747, 16096, 30529, 30928, 12672, 22279,

+ 8354, 23154, 22926, 17734, 15080, 5071, 28449, 12490, 8162, 27024,

+ 28177, 2205, 6849, 28974, 28869, 11546, 15298, 9733, 16630, 19876,

+ 3853, 21675, 26037, 20119, 15068, 20607, 21168, 19327, 18655, 10117,

+ 7345, 2440, 7904, 18545, 22375, 28214, 27299, 20225, 105, 20054,

+ 1296, 27280, 7032, 10549, 4243, 4841, 25604, 9231, 22212, 32601,

+ 14322, 22986, 10563, 5128, 8093, 21220, 18918, 14728, 5915, 14763,

+ 7703, 21167, 31937, 7852, 12663, 17570, 18665, 24941, 19400, 17715,

+ 29426, 4447, 7689, 25453, 10121, 23310, 19170, 32364, 13351, 21915,

+ 20035, 7795, 19419, 17516, 2121, 25656, 2378, 8482, 28513, 642,

+ 20980, 459, 11695, 30198, 32441, 12121, 11697, 28462, 28059, 84,

+ 23071, 8972, 24773, 19403, 5398, 30030, 20173, 2192, 10870, 12642,

+ 2102, 27813, 16777, 17787, 22073, 8433, 4581, 13284, 30404, 23863,

+ 24467, 11925, 6596, 73, 624, 4356, 17312, 30841, 31956, 11325,

+ 14597, 4177, 25970, 6453, 22505, 29572, 10367, 1371, 458, 35,

+ 25623, 11633, 31543, 14356, 25564, 31386, 25746, 26305, 32736, 30132,

+ 12308, 20237, 25285, 1255, 14609, 30092, 31522, 10110, 24702, 23283,

+ 7209, 9206, 21168, 15053, 4487, 23637, 23142, 8816, 10892, 15550,

+ 25866, 29744, 140, 30785, 7220, 10962, 31877, 2039, 14448, 28996,

+ 24577, 8271, 28993, 25227, 21822, 4259, 11878, 1532, 19085, 16655,

+ 24155, 23471, 7416, 17026, 5667, 3377, 22055, 9493, 24133, 5753,

+ 389, 2204, 20757, 31517, 23710, 7035, 28212, 23494, 26315, 31676,

+ 18266, 32738, 5138, 11870, 27219, 10136, 10056, 8431, 11336, 14849,

+ 30584, 26973, 14912, 9109, 9353, 14345, 4838, 30947, 32538, 12317,

+ 19853, 12678, 10161, 6688, 21105, 3924, 10517, 9415, 26688, 1496,

+ 4600, 10254, 15065, 13827, 20953, 7816, 16211, 21022, 23849, 18675,

+ 6465, 32259, 23725, 12304, 25908, 32653, 27683, 30898, 3202, 21325,

+ 11304, 15892, 1606, 31102, 11097, 26223, 10664, 3899, 27321, 9676,

+ 30047, 2032, 339, 8983, 28788, 6927, 8992, 29558, 2120, 14852,

+ 3882, 24537, 4056, 8810, 10482, 10449, 17472, 24703, 16655, 15525,

+ 31358, 21973, 20761, 5027, 23161, 6219, 11973, 9908, 19266, 15676,

+ 31313, 13363, 29849, 25846, 19491, 18175, 31155, 6766, 26029, 13263,

+ 20794, 23346, 27027, 198, 24214, 23454, 24336, 27464, 12395, 23379,

+ 1174, 11, 2146, 7653, 13748, 31089, 4141, 23508, 26685, 22549,

+ 24517, 16318, 1191, 27043, 14582, 17362, 7601, 12782, 7198, 904,

+ 19272, 27196, 6706, 21903, 11436, 2788, 2049, 16903, 21967, 4892,

+ 30397, 10481, 11262, 780, 5559, 11492, 30146, 15399, 24938, 13825,

+ 8713, 15290, 17339, 8489, 2689, 25541, 2431, 28525, 13637, 17931,

+ 20798, 2501, 22971, 9573, 22326, 27909, 11452, 8539, 17059, 21006,

+ 14326, 16373, 22590, 9793, 16527, 18895, 13828, 26682, 267, 11372,

+ 31800, 15546, 14960, 22220, 1963, 20452, 24744, 17473, 8507, 22189,

+ 26150, 10622, 18074, 17550, 27341, 30705, 28753, 2427, 21005, 11091,

+ 30980, 27673, 1103, 5501, 2551, 21548, 24467, 7293, 12497, 6478,

+ 6999, 7913, 672, 10727, 9147, 29299, 28702, 7769, 12260, 12478,

+ 12083, 3195, 6046, 18032, 23994, 12105, 11333, 30857, 16776, 14042,

+ 6373, 21491, 18858, 21650, 3488, 15193, 13551, 22424, 14928, 1853,

+ 423, 28042, 23662, 27717, 2729, 23408, 25651, 7126, 30107, 17135,

+ 29948, 21220, 22125, 18368, 17651, 19209, 11303, 10592, 8172, 16852,

+ 6885, 9480, 4493, 2659, 1823, 13279, 31410, 23860, 30254, 31087,

+ 5647, 23096, 22540, 30293, 12312, 28969, 7772, 21309, 5661, 9246,

+ 17578, 22542, 186, 22621, 11763, 25442, 32110, 10608, 31592, 30265,

+ 7050, 29307, 16495, 10222, 24653, 460, 14315, 5738, 17997, 10932,

+ 24253, 9879, 19480, 10645, 6027, 10519, 22044, 3645, 15295, 14135,

+ 26564, 8306, 15827, 23582, 30692, 29390, 16589, 24139, 25687, 6094,

+ 18693, 15678, 18663, 11557, 27182, 14196, 15724, 12630, 5780, 27801,

+ 16184, 22401, 29603, 28666, 18867, 19837, 22441, 24377, 25155, 10280,

+ 21725, 20804, 7023, 27131, 30111, 12679, 21315, 22498, 3585, 23393,

+ 12534, 4170, 18055, 2517, 9674, 6267, 17451, 28547, 30004, 21544,

+ 4516, 2774, 2109, 6980, 11752, 2686, 4136, 25112, 25584, 22049,

+ 15445, 10131, 20411, 3917, 1893, 7649, 13461, 7858, 24479, 16703,

+ 2201, 8590, 11922, 20749, 22901, 19304, 1020, 24356, 28269, 4097,

+ 26603, 26987, 19363, 10632, 6178, 12709, 31381, 20237, 13502, 18317,

+ 15335, 12088, 8218, 31013, 1635, 827, 5615, 7499, 30526, 19973,

+ 15808, 27789, 6044, 7096, 15477, 23614, 6999, 21854, 2374, 12233,

+ 31996, 31960, 2522, 13382, 6935, 25878, 14768, 23115, 15025, 14990,

+ 24767, 8709, 4886, 28646, 7513, 3463, 18140, 25332, 17749, 3425,

+ 28192, 19945, 25197, 7029, 5651, 22729, 19941, 30726, 22966, 24351,

+ 12142, 15634, 30689, 15854, 25417, 15330, 2698, 15850, 2991, 22751,

+ 17220, 28136, 20849, 22951, 20742, 404, 6108, 22880, 21294, 2146,

+ 10207, 22349, 32197, 4295, 5744, 5022, 21253, 2984, 27179, 11917,

+ 5656, 1043, 17468, 15782, 23331, 32557, 4224, 19302, 22659, 6251,

+ 231, 29960, 23895, 11781, 22557, 6812, 4414, 12712, 18281, 21849,

+ 24930, 29036, 25557, 10292, 16053, 27909, 30351, 7858, 4474, 2877,

+ 11407, 19962, 1544, 17314, 27002, 27694, 5834, 4219, 16838, 29179,

+ 30603, 15617, 24608, 31343, 17904, 25548, 23050, 21771, 9030, 12684,

+ 14281, 32282, 7038, 16377, 13182, 28993, 32118, 7437, 29587, 2646,

+ 2171, 21104, 17496, 26741, 4875, 308, 5358, 1873, 3807, 26050,

+ 15205, 713, 3625, 22548, 17441, 14524, 11802, 7205, 20610, 15645,

+ 2727, 5798, 18628, 21578, 8077, 14835, 25891, 26521, 14994, 16197,

+ 21059, 10292, 25358, 41, 29904, 21544, 23211, 1073, 4193, 20920,

+ 7017, 5865, 21923, 5367, 30437, 31244, 7091, 918, 15066, 2040,

+ 18635, 19194, 32488, 23136, 11809, 23697, 32660, 18753, 23308, 1127,

+ 10897, 22039, 11113, 19956, 16446, 22352, 5437, 11065, 11887, 30721,

+ 31132, 4619, 2160, 24536, 31945, 942, 16455, 5970, 10654, 12965,

+ 1338, 31789, 25646, 15049, 27537, 23073, 28586, 8089, 16797, 31691,

+ 2945, 1233, 13817, 18410, 27595, 21822, 13072, 16077, 4328, 19408,

+ 5087, 27660, 16996, 4849, 5629, 8311, 12574, 28181, 11480, 2124,

+ 1194, 8594, 6721, 29101, 22515, 3251, 28715, 22352, 26917, 10759,

+ 24495, 889, 202, 27135, 31060, 24357, 21555, 7096, 17038, 16776,

+ 26393, 22550, 17540, 21434, 12420, 8978, 30742, 23726, 1772, 14165,

+ 13087, 2403, 6046, 12293, 31479, 1374, 28002, 1247, 24637, 30551,

+ 19035, 3206, 18387, 13875, 22830, 31002, 17705, 18994, 31079, 781,

+ 27071, 3690, 11032, 13874, 11749, 1652, 24002, 5399, 22214, 15461,

+ 9849, 1685, 32164, 15103, 8516, 16805, 7269, 30761, 451, 11125,

+ 17231, 17309, 5908, 23484, 23568, 3553, 18166, 15178, 7681, 7032,

+ 17455, 28899, 6059, 30809, 1068, 4173, 29067, 16288, 14312, 16296,

+ 19986, 2948, 19471, 18174, 27376, 8585, 13410, 15899, 26514, 12022,

+ 1629, 19615, 21737, 10634, 10007, 12369, 29294, 10347, 4203, 32182,

+ 15459, 18783, 29013, 20195, 12123, 30270, 11678, 21647, 25852, 7848,

+ 188, 32108, 28164, 14835, 18420, 10168, 3466, 9575, 14273, 4366,

+ 14727, 12974, 121, 30851, 1172, 31366, 9774, 9966, 21749, 18361,

+ 4050, 20871, 3287, 11855, 4511, 2740, 2006, 8962, 30390, 13599,

+ 4546, 9970, 19975, 11532, 15011, 23450, 32368, 7146, 11258, 4867,

+ 26153, 10791, 25418, 12343, 2399, 841, 30167, 27641, 5151, 24635,

+ 16814, 20915, 13174, 3044, 12261, 2224, 2519, 5630, 27684, 15755,

+ 17084, 10278, 13669, 16360, 2448, 12591, 11255, 10337, 26573, 23228,

+ 16585, 6852, 20066, 32014, 10725, 30843, 20055, 1306, 59, 5963,

+ 17587, 223, 27296, 20546, 32158, 17910, 31254, 31466, 4803, 26219,

+ 6990, 10435, 2296, 26571, 16747, 13552, 28961, 28798, 11785, 31793,

+ 4177, 24407, 31358, 20753, 21299, 362, 18015, 97, 4265, 23070,

+ 12103, 31204, 24498, 12675, 30163, 29004, 1169, 23781, 29681, 2917,

+ 14636, 30113, 18523, 27537, 21682, 29239, 23390, 13684, 5760, 21921,

+ 8416, 22256, 6214, 26851, 15265, 11860, 11109, 13028, 26049, 24784,

+ 9628, 8828, 17027, 29997, 24804, 7886, 32080, 1722, 29336, 29144,

+ 23039, 9354, 24025, 16712, 6739, 12508, 17713, 2449, 23749, 21723,

+ 24438, 20287, 22660, 23688, 13298, 31367, 6843, 3828, 25024, 4387,

+ 10514, 22194, 30329, 16989, 11639, 20108, 6161, 31081, 3870, 1653,

+ 1531, 27127, 7366, 5311, 13716, 19209, 11327, 18318, 3518, 13314,

+ 21289, 2701, 1483, 20480, 7422, 21727, 11166, 23404, 25171, 13145,

+ 21772, 8144, 9562, 17134, 136, 25064, 6060, 12138, 10496, 30203,

+ 11589, 2660, 4354, 28267, 24784, 3693, 18723, 6284, 3366, 8846,

+ 30113, 15282, 17, 12786, 5959, 20110, 10837, 11231, 23441, 5818,

+ 4337, 16363, 14353, 26258, 25506, 10860, 21777, 27974, 23721, 9520,

+ 2938, 19757, 19918, 20590, 31221, 27740, 32421, 10237, 30031, 13176,

+ 16400, 22724, 22562, 11976, 22789, 2674, 30130, 17806, 12433, 29039,

+ 13333, 31640, 22813, 15634, 4503, 28946, 24817, 13844, 6492, 5278,

+ 3062, 8516, 2887, 15271, 23232, 14973, 15131, 5361, 715, 23509,

+ 27360, 10613, 15365, 9496, 9353, 24429, 1933, 14197, 22227, 13227,

+ 21435, 22902, 14704, 7470, 8544, 5942, 15461, 20215, 3663, 13006,

+ 1713, 19481, 26908, 30992, 18479, 528, 12835, 20088, 25277, 23891,

+ 11724, 2143, 11934, 3117, 27662, 26226, 24093, 25544, 26930, 16483,

+ 17523, 7051, 11226, 15326, 1003, 21157, 1089, 7871, 26436, 5098,

+ 20676, 4482, 27223, 19423, 27554, 26106, 13818, 25872, 9728, 13894,

+ 4899, 32426, 29744, 28674, 6481, 28997, 12082, 8122, 7207, 5634,

+ 3963, 4260, 7258, 982, 17654, 5262, 16334, 14117, 20553, 2069,

+ 5372, 22419, 345, 26392, 9623, 4119, 16144, 1388, 7279, 11601,

+ 31838, 16337, 661, 30237, 32381, 14629, 22464, 29288, 22650, 30680,

+ 2543, 5186, 16369, 30624, 4176, 30517, 7960, 878, 11617, 10709,

+ 2046, 27552, 7253, 13721, 27925, 27768, 11705, 22761, 17135, 22733,

+ 5975, 10104, 28485, 23808, 31579, 1236, 10557, 28210, 27316, 11580,

+ 12012, 14772, 26301, 16561, 29722, 10431, 9757, 1103, 11846, 19558,

+ 8428, 19934, 25066, 17864, 10263, 19877, 21761, 32394, 3077, 10878,

+ 2757, 17797, 5754, 9264, 11453, 9147, 23484, 12280, 1271, 32144,

+ 9973, 17257, 28051, 21559, 1497, 16759, 22913, 15210, 14216, 15822,

+ 23178, 22366, 694, 2664, 18581, 30454, 14089, 17246, 28195, 7735,

+ 24002, 19710, 24093, 5372, 23968, 30751, 22223, 19946, 5633, 16561,

+ 22068, 14759, 13643, 23192, 17268, 23111, 20106, 187, 20907, 11015,

+ 29275, 14935, 32748, 12350, 20232, 2714, 23174, 17296, 7156, 15981,

+ 24965, 28773, 21562, 19601, 14460, 29849, 1169, 31725, 898, 14710,

+ 12403, 17446, 5499, 22751, 4734, 7281, 21401, 717, 15386, 11429,

+ 29218, 22272, 22620, 5269, 28275, 1774, 5674, 15772, 27205, 21504,

+ 32160, 27257, 19503, 15869, 13491, 31069, 18796, 30150, 30484, 3139,

+ 15583, 26693, 17751, 2944, 28500, 30112, 3925, 13979, 13577, 10418,

+ 24015, 14174, 1133, 699, 16212, 27437, 27175, 12118, 31844, 22167,

+ 32346, 13484, 22229, 30507, 16167, 29672, 22646, 26509, 29812, 3563,

+ 29939, 2505, 236, 64, 760, 11238, 17479, 3666, 20633, 23231,

+ 29388, 19164, 22258, 22286, 1556, 21922, 20746, 24778, 11024, 8543,

+ 14846, 19635, 20814, 22014, 30299, 6187, 16247, 8972, 11467, 28487,

+ 20765, 5742, 4596, 22822, 16819, 19279, 11165, 32385, 10461, 1373,

+ 20242, 16004, 3051, 3125, 24266, 1500, 10399, 23323, 2888, 7186,

+ 23863, 30959, 6975, 23319, 20903, 3164, 32505, 1312, 17959, 83,

+ 13049, 11443, 10989, 19640, 13792, 25346, 25916, 14171, 5517, 8313,

+ 26013, 8489, 22408, 7059, 29549, 13220, 16545, 497, 20887, 656,

+ 16340, 18349, 8355, 30191, 112, 236, 8688, 4144, 26489, 31154,

+ 16445, 25764, 74, 32763, 366, 21041, 7294, 5127, 17805, 22090,

+ 11025, 29429, 30480, 3102, 2755, 12179, 4186, 11280, 23485, 19829,

+ 6788, 8040, 5239, 4676, 2396, 31816, 24025, 345, 6318, 32225,

+ 31393, 13706, 3779, 19686, 15876, 3396, 2088, 11329, 21912, 23771,

+ 12464, 24070, 27249, 6941, 3516, 21669, 23946, 15405, 15802, 1123,

+ 9063, 11919, 20716, 26891, 761, 11903, 8043, 5088, 15298, 25479,

+ 16491, 21975, 22330, 31824, 1728, 23043, 10608, 15545, 9890, 17489,

+ 17652, 12838, 26797, 10357, 26101, 538, 3627, 27940, 6311, 1801,

+ 19094, 28548, 7911, 12135, 30297, 31457, 22818, 21253, 24279, 26785,

+ 13939, 29341, 22446, 31866, 28683, 5548, 28989, 20706, 5078, 14975,

+ 30820, 26567, 8796, 3217, 9098, 13185, 17381, 21780, 4325, 11269,

+ 22752, 22990, 31221, 17499, 27013, 7718, 16466, 21586, 14522, 14975,

+ 14248, 19058, 32307, 15812, 20736, 14898, 3038, 19780, 2881, 6763,

+ 25214, 30401, 19702, 18445, 31125, 26819, 2897, 8465, 16008, 1330,

+ 25200, 19374, 3838, 548, 736, 32208, 12937, 3316, 6240, 22726,

+ 6024, 9108, 3559, 11578, 22348, 6180, 21224, 15207, 17785, 29379,

+ 1492, 17286, 3759, 9637, 10209, 31369, 10858, 18277, 15882, 14092,

+ 9255, 18333, 854, 27273, 32713, 20917, 4190, 15051, 15674, 20984,

+ 7177, 20389, 16213, 20717, 14747, 10467, 6660, 6372, 14318, 4225,

+ 2981, 22991, 1534, 32027, 9651, 16211, 16556, 30885, 26786, 11551,

+ 19899, 24412, 22282, 5501, 10271, 2812, 17416, 7718, 16759, 15924,

+ 24802, 1883, 7384, 25687, 19945, 2353, 1740, 31060, 12964, 6957,

+ 3738, 11752, 8490, 23056, 9416, 7186, 18640, 32756, 735, 8136,

+ 15364, 8856, 16494, 10216, 19833, 11257, 14673, 4977, 18565, 16674,

+ 10547, 28403, 2247, 2884, 8274, 9796, 13580, 5897, 13698, 32373,

+ 8563, 15910, 6517, 27652, 7376, 20272, 28473, 6483, 11599, 26544,

+ 3586, 12633, 90, 13433, 4138, 17048, 4540, 3129, 21366, 20047,

+ 19974, 6223, 20123, 22512, 13361, 32732, 24577, 2260, 14982, 18717,

+ 31174, 15406, 31419, 25848, 20230, 1854, 26975, 6356, 26202, 4551,

+ 7288, 15022, 13726, 21186, 25962, 29545, 11000, 1364, 16922, 31590,

+ 18197, 27134, 26964, 1365, 11446, 10260, 30314, 19275, 18796, 25456,

+ 30750, 29204, 31647, 23143, 26306, 14026, 22997, 8188, 17822, 6822,

+ 32561, 18004, 29586, 279, 314, 3434, 28413, 29713, 29407, 27140,

+ 4317, 680, 6327, 30950, 823, 28125, 12941, 12869, 30393, 6072,

+ 32283, 29054, 23454, 26775, 22294, 9480, 8658, 7877, 6251, 15015,

+ 17494, 15438, 8905, 7139, 9191, 1810, 11359, 20153, 29914, 20249,

+ 15847, 3728, 17483, 28454, 227, 29039, 22646, 15247, 17190, 28012,

+ 28773, 21323, 21399, 21096, 9932, 1869, 7218, 3065, 31793, 19472,

+ 7503, 16296, 19535, 26996, 11815, 7005, 12989, 23752, 9876, 26647,

+ 8907, 8488, 22040, 13536, 13997, 21001, 27681, 11777, 31195, 23570,

+ 13707, 29810, 12983, 12334, 21351, 2452, 28528, 11487, 20219, 8994,

+ 23079, 12757, 12041, 31589, 6225, 4543, 29269, 29096, 14685, 22113,

+ 4961, 3820, 30870, 2790, 31099, 17117, 22090, 120, 31481, 27908,

+ 19500, 16655, 21700, 1597, 8439, 9350, 15123, 32364, 8020, 15348,

+ 26489, 8812, 13310, 1849, 18466, 7752, 14116, 10455, 13402, 28590,

+ 25871, 3076, 19022, 23712, 18948, 12541, 23063, 17005, 9580, 5020,

+ 500, 20704, 2098, 24621, 24535, 1463, 12909, 27262, 31780, 31830,

+ 29759, 6965, 20917, 26045, 5628, 18278, 5921, 15544, 2959, 9829,

+ 11582, 2645, 30490, 23001, 22244, 20123, 16093, 15378, 7668, 24953,

+ 14937, 26781, 2457, 24573, 15029, 13077, 2510, 31175, 29280, 59,

+ 15393, 12988, 32760, 13641, 28086, 27903, 8299, 12676, 32398, 20253,

+ 19548, 1553, 2569, 23175, 17608, 24585, 30890, 17990, 21225, 22736,

+ 24347, 29162, 16218, 8354, 20081, 1219, 17533, 14190, 31152, 3412,

+ 26, 10216, 21650, 13573, 10312, 30938, 3972, 23576, 1937, 18618,

+ 5362, 12766, 1105, 18306, 27588, 7467, 14175, 700, 9001, 2311,

+ 21999, 14300, 11155, 27046, 29367, 8403, 16643, 3483, 23121, 28385,

+ 19078, 3912, 3809, 26539, 21247, 31385, 9975, 22669, 32552, 31474,

+ 5047, 21553, 9428, 9573, 4663, 28257, 26487, 13097, 19496, 27161,

+ 32231, 16455, 27577, 3553, 1380, 25239, 9912, 4697, 1495, 11499,

+ 1274, 24342, 2903, 29322, 26110, 2476, 30961, 24288, 2509, 19212,

+ 30889, 13683, 8484, 24337, 11452, 19993, 10453, 597, 1576, 8553,

+ 5227, 585, 25710, 31087, 3085, 4997, 25239, 6820, 16805, 25180,

+ 30069, 31004, 8513, 4532, 16171, 19970, 24761, 7188, 15344, 8514,

+ 12946, 19199, 11279, 7045, 8226, 14465, 24370, 13410, 20213, 3847,

+ 17633, 4306, 13680, 31604, 26182, 9701, 692, 1392, 11571, 29620,

+ 15813, 16899, 7270, 27799, 24556, 5220, 23819, 23704, 28249, 28939,

+ 17794, 25895, 22285, 22285, 15715, 24847, 5367, 29609, 8895, 17576,

+ 24413, 9246, 5289, 20046, 26750, 18880, 18165, 6931, 28534, 9291,

+ 17216, 29617, 10593, 9847, 15153, 26051, 17859, 30925, 20477, 32052,

+ 4648, 7864, 29489, 12791, 263, 29151, 17580, 24056, 6124, 26546,

+ 4586, 20307, 2262, 21827, 23177, 19141, 31454, 9560, 32261, 4703,

+ 17946, 13502, 30407, 17538, 9921, 18656, 18014, 9991, 11152, 21656,

+ 30476, 12990, 25452, 32580, 22148, 29466, 3656, 8733, 19954, 3626,

+ 21833, 12228, 31548, 2251, 20008, 14878, 28551, 6941, 19929, 2658,

+ 14078, 10547, 20074, 32624, 3534, 13327, 27693, 9829, 26229, 22221,

+ 15897, 16748, 9533, 9246, 3438, 12503, 13571, 30712, 12440, 29294,

+ 22845, 4492, 3414, 11014, 24892, 2425, 1563, 28246, 8366, 30783,

+ 22197, 14599, 20838, 24822, 9260, 20746, 16992, 13376, 17389, 46,

+ 30719, 32636, 32295, 23794, 8602, 7228, 20342, 5527, 2103, 29689,

+ 28095, 29050, 23190, 11270, 5211, 31905, 31346, 19907, 23415, 4500,

+ 12035, 16147, 7866, 13678, 24775, 7952, 14121, 31283, 17026, 23293,

+ 3144, 23396, 2948, 3963, 16514, 18641, 10026, 2560, 31947, 21423,

+ 32167, 32390, 8068, 12778, 14852, 17792, 21151, 3005, 12646, 13842,

+ 19715, 18303, 20368, 28801, 17202, 18368, 11432, 11497, 19241, 20372,

+ 12350, 25134, 14216, 303, 25994, 22836, 11762, 10930, 25845, 83,

+ 31927, 21829, 30428, 4869, 29616, 19046, 21392, 27106, 17515, 896,

+ 9377, 1743, 11656, 14272, 11100, 12658, 30051, 31780, 12434, 14313,

+ 30708, 10709, 8603, 10171, 19443, 32438, 32411, 4878, 17215, 11325,

+ 32260, 13851, 19072, 18562, 2396, 4320, 27659, 21909, 30529, 18708,

+ 31239, 21269, 9898, 26720, 9166, 3582, 24431, 19148, 31382, 8899,

+ 7180, 20856, 10577, 26013, 8354, 11660, 25554, 9506, 830, 22385,

+ 20784, 31513, 2398, 1602, 30063, 8077, 32433, 15229, 24157, 29216,

+ 26911, 14079, 6075, 11682, 15881, 26415, 10909, 31202, 31954, 10617,

+ 11284, 20420, 21150, 28414, 7945, 25492, 11097, 6537, 11628, 2458,

+ 21500, 9413, 31887, 18671, 4619, 28590, 8396, 4239, 21602, 14918,

+ 29806, 17070, 24882, 11145, 21967, 2640, 9543, 29602, 4285, 12052,

+ 2188, 24159, 30498, 23376, 27600, 27107, 27876, 2147, 13258, 13723,

+ 27403, 1351, 1371, 23923, 15906, 19302, 5908, 5449, 991, 5551,

+ 15352, 6305, 11270, 28136, 2947, 17051, 138, 9286, 19179, 25123,

+ 30965, 25915, 31653, 7784, 23819, 24975, 13099, 32655, 31402, 15538,

+ 8189, 28584, 29429, 13649, 24549, 18401, 25266, 15399, 2944, 15865,

+ 27119, 27926, 6906, 17912, 22252, 7798, 2073, 15390, 30773, 31405,

+ 20861, 27417, 23055, 22527, 17190, 17019, 29461, 17064, 10294, 20842,

+ 1059, 27944, 18936, 22937, 12147, 31455, 24610, 3704, 2822, 22745,

+ 22103, 21672, 12870, 6379, 2800, 5554, 6889, 767, 27388, 31736,

+ 12568, 20652, 3973, 10988, 32465, 18186, 16406, 18303, 25226, 8900,

+ 32377, 25821, 6423, 2670, 32709, 10583, 7885, 31513, 13977, 16288,

+ 11240, 25381, 21154, 26685, 20522, 24407, 22883, 16183, 29125, 20011,

+ 15413, 2579, 13179, 11628, 3980, 8707, 1540, 30209, 18301, 20062,

+ 26800, 27146, 7549, 9038, 7501, 2348, 876, 14537, 21323, 7976,

+ 18386, 19906, 3614, 8371, 20328, 11168, 19172, 19074, 2010, 24047,

+ 10568, 13988, 30667, 4693, 7078, 23572, 4121, 13512, 25200, 11407,

+ 8803, 7167, 22224, 17571, 8393, 23078, 18574, 25097, 2803, 1494,

+ 29493, 5172, 11349, 3908, 20081, 23338, 4017, 30137, 15804, 10387,

+ 19421, 28994, 25401, 30479, 3526, 25768, 6624, 27597, 949, 11170,

+ 23260, 13914, 3537, 6474, 4657, 8886, 22502, 15054, 9890, 4525,

+ 16484, 12904, 14546, 19300, 12459, 16016, 23977, 24627, 19077, 16752,

+ 22521, 2994, 3828, 23704, 5474, 19991, 25135, 29939, 29299, 12223,

+ 4327, 13049, 2577, 25354, 15054, 21287, 5149, 14444, 18010, 23212,

+ 5969, 6337, 16838, 1126, 29291, 31201, 21851, 31244, 142, 373,

+ 10989, 11693, 23781, 18953, 28328, 26457, 2441, 32354, 19725, 23326,

+ 32165, 16145, 4663, 23350, 24280, 1608, 20067, 31358, 27098, 32237,

+ 9135, 13098, 20067, 31725, 8482, 26039, 584, 6355, 20205, 17442,

+ 20455, 5273, 20464, 32088, 9158, 32189, 15488, 15597, 23927, 20120,

+ 6760, 21264, 10175, 29932, 5677, 6335, 7159, 30652, 24983, 25655,

+ 13489, 12128, 23404, 8623, 21407, 17368, 25727, 25669, 24241, 25953,

+ 1513, 825, 14462, 29510, 19607, 5977, 6117, 1273, 32261, 27836,

+ 756, 2402, 2632, 15539, 28936, 28791, 24402, 17405, 22582, 4877,

+ 370, 2362, 10730, 19693, 3354, 26530, 718, 32043, 1509, 12791,

+ 4590, 24755, 5848, 440, 31513, 31525, 10217, 1688, 14474, 483,

+ 27837, 27183, 16328, 32104, 20662, 7150, 28106, 5339, 25645, 6488,

+ 32351, 14307, 12028, 1647, 4813, 6846, 3136, 10861, 3000, 14477,

+ 29533, 9397, 14918, 20466, 21058, 28169, 11393, 3549, 23790, 31229,

+ 6397, 23203, 30258, 3244, 11706, 32081, 5561, 6313, 17995, 2367,

+ 20295, 14649, 19768, 18920, 24382, 7359, 19618, 8440, 24678, 29559,

+ 29221, 2727, 3821, 13927, 2563, 15430, 15533, 23187, 13694, 4375,

+ 23214, 17521, 24709, 14690, 15340, 3996, 14995, 24517, 30042, 32460,

+ 14037, 14540, 32550, 10246, 22411, 12482, 31551, 12560, 18608, 11206,

+ 17685, 12328, 3549, 3105, 11936, 1269, 18283, 29398, 3747, 15806,

+ 21208, 28283, 1074, 23770, 19051, 3144, 4978, 4712, 10267, 32622,

+ 32672, 15936, 4014, 21161, 1620, 20009, 1054, 22553, 24583, 19532,

+ 3136, 19278, 10707, 12776, 2727, 22946, 7291, 21064, 19655, 1227,

+ 13483, 29170, 5462, 5040, 12417, 24098, 9720, 1404, 1611, 6262,

+ 3098, 15089, 14483, 27371, 13598, 18944, 11097, 30728, 3513, 12182,

+ 24223, 7001, 12442, 21432, 12843, 11807, 26701, 5074, 5768, 1094,

+ 2142, 18252, 20302, 13719, 25025, 29279, 10915, 1839, 22129, 6951,

+ 20994, 2352, 20568, 29945, 6203, 15542, 8047, 22006, 26811, 22029,

+ 806, 10976, 15374, 28449, 25350, 23853, 13730, 15925, 31381, 24410,

+ 20174, 9432, 31866, 21378, 13074, 11029, 28897, 47, 12705, 15083,

+ 21281, 1904, 26652, 12285, 12956, 5164, 2721, 3977, 23271, 29109,

+ 27908, 31902, 18220, 16800, 12636, 15498, 25804, 17365, 16322, 24466,

+ 26952, 25826, 27477, 25063, 16225, 1685, 26754, 22741, 20350, 14025,

+ 30850, 60, 10063, 18560, 28195, 15428, 17584, 818, 28620, 25421,

+ 2000, 23653, 6843, 25637, 4242, 28542, 27538, 7294, 2867, 10199,

+ 4114, 29599, 12334, 20753, 1574, 3417, 31580, 428, 11299, 10557,

+ 24160, 5076, 9806, 524, 29250, 8318, 15775, 16751, 27738, 12468,

+ 7108, 23528, 23152, 6445, 2153, 26889, 27169, 13345, 2999, 19428,

+ 16260, 27995, 6682, 16322, 7950, 21648, 11592, 7448, 28339, 10735,

+ 28287, 27318, 21070, 6393, 22029, 3906, 26435, 5523, 25622, 14053,

+ 25443, 3930, 22162, 16708, 6928, 28470, 149, 19378, 12961, 4914,

+ 9939, 11171, 32520, 15499, 1379, 28004, 22961, 9222, 25283, 11018,

+ 27566, 10375, 21533, 20393, 13330, 19424, 5832, 6854, 19866, 29159,

+ 8978, 30734, 14227, 5579, 23613, 32584, 9719, 27048, 455, 12424,

+ 7386, 5208, 17903, 16549, 23300, 397, 11636, 2542, 22496, 30748,

+ 7328, 29977, 22677, 27292, 13701, 28284, 24690, 13872, 27527, 15232,

+ 143, 17313, 28698, 17490, 19121, 16048, 23757, 9691, 27503, 22442,

+ 16008, 8179, 12179, 17212, 26129, 13265, 30915, 27785, 8661, 1734,

+ 25953, 3450, 17638, 23852, 12207, 8533, 8000, 16793, 2103, 26002,

+ 19280, 11352, 28522, 23786, 29879, 16153, 21127, 2224, 31819, 26855,

+ 28606, 19556, 7518, 1627, 17814, 12166, 30788, 21007, 4492, 29096,

+ 9743, 14678, 8700, 9415, 14749, 26922, 32581, 16859, 20949, 10086,

+ 12329, 27565, 8493, 19510, 7538, 21481, 3695, 28619, 22747, 30324,

+ 21182, 8275, 19245, 7935, 14548, 13352, 3497, 27869, 24973, 3143,

+ 29350, 18705, 12713, 23301, 379, 684, 19661, 17149, 27039, 1366,

+ 16844, 25165, 12559, 24106, 19493, 7682, 8688, 711, 20173, 16848,

+ 15222, 3747, 27694, 18439, 10756, 27299, 24431, 24002, 2709, 4841,

+ 31478, 30561, 32090, 28398, 28715, 2362, 19364, 28624, 17535, 14476,

+ 9477, 26861, 6062, 6324, 14258, 22192, 8000, 18596, 10284, 1963,

+ 31574, 1168, 11296, 23526, 18595, 32746, 19595, 3703, 5049, 7057,

+ 4897, 15699, 4486, 19526, 9968, 9060, 16670, 17759, 7233, 14556,

+ 23227, 15295, 31679, 11720, 12289, 21765, 17627, 29416, 24967, 5892,

+ 28526, 17598, 3476, 27508, 12448, 27877, 23590, 3046, 1802, 11684,

+ 3129, 27134, 21015, 3011, 26181, 26588, 30896, 27293, 14345, 29915,

+ 25368, 11895, 15751, 25214, 19476, 22800, 6992, 1447, 11600, 21625,

+ 19969, 30730, 19198, 24615, 13070, 3554, 8896, 21575, 3774, 21474,

+ 16840, 12113, 13175, 10607, 17981, 8672, 11836, 19212, 4065, 3265,

+ 7284, 24854, 25586, 9546, 3821, 26289, 2126, 13293, 7712, 32002,

+ 6618, 8461, 5047, 32415, 8739, 17423, 19788, 26435, 12358, 10421,

+ 15476, 25543, 30990, 16039, 10236, 7757, 16989, 10067, 4722, 6847,

+ 7629, 5623, 27111, 14200, 13974, 30204, 25844, 9792, 14003, 19334,

+ 12539, 29054, 1856, 585, 21935, 25001, 28711, 7838, 29143, 22272,

+ 23291, 1238, 13647, 27515, 15652, 19150, 15439, 28929, 27965, 18371,

+ 12271, 8155, 26554, 22120, 20459, 2409, 18126, 32054, 18852, 8979,

+ 29068, 28932, 104, 32131, 17996, 9687, 10995, 31761, 17488, 25083,

+ 27190, 8319, 30887, 1875, 15703, 16103, 12882, 1773, 30456, 11761,

+ 16806, 13017, 6076, 18249, 18161, 25148, 12807, 19537, 21600, 7072,

+ 15110, 787, 26400, 14734, 27888, 8057, 31684, 15711, 7819, 19648,

+ 16871, 17487, 13297, 27434, 13074, 21203, 3220, 22003, 4320, 27181,

+ 4736, 17799, 3679, 7229, 20192, 8690, 10426, 4506, 10180, 22936,

+ 29461, 13793, 11041, 4134, 22969, 32333, 2841, 14792, 8305, 32392,

+ 12157, 30365, 8243, 16321, 145, 17000, 2051, 3583, 20239, 19592,

+ 9493, 12213, 32110, 3114, 30258, 15254, 20067, 25789, 3676, 170,

+ 31913, 28326, 2741, 13474, 32766, 14389, 8093, 23657, 9070, 4824,

+ 283, 8955, 20691, 16527, 10878, 4730, 13725, 5536, 18756, 25471,

+ 9423, 25228, 20282, 22190, 23114, 14913, 28645, 19597, 846, 26769,

+ 3361, 3990, 12350, 11491, 22280, 1162, 5027, 3369, 8981, 13577,

+ 12916, 21778, 16009, 26720, 27029, 5504, 16398, 16034, 27805, 14396,

+ 7323, 506, 8668, 31721, 919, 8767, 32669, 27702, 17985, 3785,

+ 20136, 10840, 20047, 25219, 30219, 6584, 26581, 5698, 13338, 17640,

+ 25193, 11605, 26805, 3804, 19845, 4190, 21705, 1111, 21549, 2656,

+ 29465, 24995, 31697, 7192, 20031, 8325, 19060, 6545, 30701, 8816,

+ 6158, 17907, 1401, 19193, 3887, 24987, 13721, 7819, 8422, 24177,

+ 9067, 14684, 28641, 11894, 10936, 12959, 30421, 24733, 24953, 16380,

+ 28193, 32732, 19098, 11581, 13486, 26754, 9727, 31818, 16409, 1995,

+ 453, 16727, 22548, 14770, 28874, 3932, 8457, 14598, 2671, 2245,

+ 14849, 21952, 6044, 26731, 29125, 26004, 4357, 5828, 22338, 8902,

+ 21164, 8022, 10546, 27967, 10407, 6770, 26873, 8672, 6436, 24350,

+ 5325, 31766, 4010, 4435, 19738, 13743, 19874, 24681, 26917, 22764,

+ 17429, 2511, 16111, 30935, 15031, 29695, 8796, 17366, 26661, 30129,

+ 24468, 9345, 24427, 7503, 13482, 25777, 30409, 3242, 3708, 1753,

+ 2999, 15595, 3290, 18842, 18470, 16076, 4586, 2449, 19721, 19208,

+ 24778, 30068, 26132, 14095, 3960, 18525, 10947, 8703, 20463, 32357,

+ 12447, 28112, 21651, 14197, 12989, 22734, 21455, 15449, 21127, 19277,

+ 28413, 23062, 21950, 11672, 134, 1918, 1472, 23082, 5450, 2305,

+ 5127, 33, 5442, 1734, 10227, 2543, 24419, 18683, 31177, 23635,

+ 23750, 3689, 7931, 392, 20231, 12619, 27562, 5308, 24043, 3680,

+ 3433, 451, 10309, 25151, 17220, 27917, 23578, 4331, 22273, 22485,

+ 6659, 2983, 15269, 21660, 10195, 18699, 30010, 24534, 13946, 856,

+ 11728, 12515, 16169, 12553, 7106, 5952, 15287, 27562, 7482, 14335,

+ 15940, 14573, 11511, 16244, 11292, 27131, 5198, 23346, 8157, 1288,

+ 32367, 4150, 14045, 27946, 20714, 16737, 19910, 15467, 28018, 31276,

+ 28803, 1053, 16608, 20887, 352, 26477, 17275, 31074, 23404, 17467,

+ 20086, 19840, 29730, 24105, 27322, 30665, 16457, 16370, 31974, 31727,

+ 24601, 18174, 29332, 16307, 22175, 3379, 21727, 25432, 20579, 9485,

+ 25634, 32344, 15687, 23537, 8449, 5207, 16818, 30398, 26286, 22101,

+ 17134, 7334, 31333, 1063, 4815, 25660, 13369, 552, 32406, 14029,

+ 9491, 30508, 17684, 32244, 24056, 1717, 14355, 20329, 15498, 31594,

+ 3313, 2842, 24786, 30148, 8334, 8061, 12348, 29451, 12905, 26660,

+ 2531, 16513, 23301, 23186, 4111, 11997, 16786, 30029, 11004, 6650,

+ 21705, 9524, 10462, 6353, 2840, 5395, 7969, 27045, 28159, 7029,

+ 28917, 28285, 29882, 15033, 7946, 19927, 29216, 26472, 17560, 2971,

+ 6603, 2246, 26019, 11854, 24697, 26535, 29309, 17544, 15282, 32644,

+ 9356, 24232, 1195, 26062, 6221, 20678, 619, 15234, 18585, 20713,

+ 24364, 23806, 20264, 17786, 3332, 17427, 3667, 22521, 24004, 20571,

+ 10270, 8175, 21025, 27085, 26229, 31268, 25617, 12686, 30902, 24593,

+ 20600, 13578, 10864, 21400, 9220, 22340, 30571, 13043, 3925, 25706,

+ 8424, 2283, 18018, 941, 10281, 11594, 28440, 31568, 21044, 18834,

+ 25412, 31486, 6357, 5615, 18866, 24672, 11490, 25195, 19094, 10735,

+ 28098, 16481, 25388, 3079, 31280, 24628, 7324, 23613, 15933, 30528,

+ 10784, 18163, 8852, 16913, 12904, 810, 16642, 30419, 18494, 30871,

+ 16950, 15370, 22118, 3064, 18629, 30596, 712, 1448, 3441, 2443,

+ 19665, 18033, 4266, 18527, 27414, 16034, 1365, 20451, 11322, 23394,

+ 22733, 31126, 24338, 24132, 31783, 4293, 1544, 21276, 21179, 5887,

+ 22973, 6160, 27103, 11466, 24307, 11250, 24054, 29332, 5033, 14029,

+ 4266, 30188, 30599, 189, 5237, 32498, 29565, 19204, 29030, 21004,

+ 25768, 16219, 10018, 14811, 20085, 27014, 4137, 28014, 30728, 28459,

+ 2650, 9909, 30943, 31204, 2234, 32056, 30898, 1939, 29297, 22792,

+ 9886, 5366, 29461, 4598, 11139, 22139, 8235, 3844, 7083, 29525,

+ 6123, 31257, 11180, 30415, 32068, 23545, 11407, 27616, 29984, 13427,

+ 4913, 22272, 2281, 25309, 3818, 571, 4684, 29373, 29549, 20356,

+ 5181, 8393, 31215, 1355, 9531, 11282, 7564, 18770, 20181, 18300,

+ 5862, 15804, 1645, 16241, 15119, 29799, 9020, 10198, 16809, 11387,

+ 30102, 9790, 13899, 3651, 25455, 11358, 6439, 22844, 11807, 14018,

+ 29418, 14444, 17762, 25534, 24548, 12533, 19363, 30374, 22121, 24298,

+ 12154, 6977, 11383, 29793, 32371, 32124, 8344, 11978, 21777, 2396,

+ 27146, 13951, 4114, 26422, 5150, 7324, 8949, 2082, 10462, 27408,

+ 14266, 22189, 28402, 31476, 31721, 24526, 16069, 1308, 16085, 2076,

+ 13027, 8428, 17698, 8509, 14246, 9581, 30085, 29602, 15889, 8352,

+ 17099, 4209, 5628, 22803, 30493, 32707, 13169, 3505, 17538, 7952,

+ 25431, 26590, 16037, 17383, 13133, 21444, 8665, 30435, 4313, 13031,

+ 2906, 23258, 25538, 7424, 1749, 5207, 10170, 8968, 5419, 17739,

+ 18752, 18579, 4211, 28927, 18885, 10079, 4414, 23629, 28430, 28973,

+ 14622, 15888, 473, 17359, 1641, 21465, 24515, 899, 5434, 12004,

+ 25705, 12159, 29113, 19786, 28110, 25805, 24476, 21367, 32765, 857,

+ 15086, 31199, 19439, 10569, 22031, 749, 7598, 30860, 30973, 19772,

+ 30139, 23222, 26065, 22026, 20909, 14091, 1677, 16362, 26652, 20185,

+ 10260, 12728, 23485, 13324, 26234, 8658, 10702, 3580, 11902, 24965,

+ 22453, 8329, 30805, 31942, 9188, 18794, 8106, 16931, 15871, 26562,

+ 31970, 1785, 19009, 25076, 9124, 31718, 13340, 15801, 27289, 9601,

+ 5151, 32368, 8304, 19785, 11549, 15797, 4646, 32476, 17548, 12852,

+ 18052, 25962, 23083, 6335, 4841, 7528, 744, 13215, 27977, 20105,

+ 27392, 21544, 8054, 8682, 17256, 8849, 16286, 26764, 7788, 6146,

+ 4629, 1544, 32662, 24301, 14421, 29566, 8913, 3490, 20804, 28367,

+ 16078, 28446, 28341, 10764, 18087, 20004, 1072, 3886, 28354, 30352,

+ 13046, 27655, 30969, 24807, 5952, 6776, 3063, 15410, 31432, 30949,

+ 6629, 18957, 4234, 18150, 6727, 16635, 7628, 14911, 6944, 10492,

+ 13404, 24595, 27997, 26210, 25113, 7764, 28784, 26336, 31156, 27006,

+ 16700, 9444, 22712, 645, 20529, 29990, 20168, 20747, 8888, 21121,

+ 2600, 11735, 17361, 7171, 11648, 12675, 10234, 31040, 29404, 23412,

+ 2132, 22763, 32758, 9488, 30977, 15783, 20408, 21802, 16080, 19738,

+ 21757, 10177, 10268, 21827, 15000, 7659, 27889, 15374, 25751, 2572,

+ 23153, 3366, 5833, 11339, 19830, 6667, 25725, 29511, 16505, 24676,

+ 19853, 13573, 28851, 10902, 11419, 29742, 24193, 7829, 23195, 1399,

+ 11533, 12027, 11153, 10592, 9515, 8791, 10396, 28193, 24449, 9415,

+ 11060, 28129, 23019, 6089, 15792, 15658, 31774, 5198, 25867, 7578,

+ 20363, 21264, 14311, 18651, 28294, 28454, 26322, 26581, 28327, 14037,

+ 6601, 2593, 19056, 32426, 18170, 12737, 3633, 10949, 26318, 18191,

+ 19497, 25208, 10535, 2292, 7150, 8721, 4071, 19802, 10511, 7923,

+ 4785, 9700, 5367, 12780, 12275, 15580, 12308, 15298, 3876, 32365,

+ 20025, 14351, 6218, 25106, 14913, 29263, 9408, 26702, 3318, 4408,

+ 11574, 8350, 27441, 27722, 6393, 19372, 28482, 24486, 4725, 28101,

+ 16785, 4643, 1272, 25997, 9350, 24991, 10168, 23281, 30631, 27027,

+ 14872, 6750, 30208, 22506, 21799, 12336, 13256, 1044, 30313, 22638,

+ 8001, 31830, 10203, 5812, 2272, 32100, 26929, 2672, 30382, 2097,

+ 15970, 21329, 18158, 2566, 1894, 6653, 26112, 19154, 1342, 4355,

+ 7045, 5569, 12342, 528, 12996, 20495, 17255, 15205, 589, 29215,

+ 8575, 29064, 5851, 5831, 30405, 26938, 1407, 5358, 15447, 32170,

+ 10491, 22362, 182, 22248, 20076, 26307, 6533, 25756, 5421, 23084,

+ 8846, 28920, 1527, 8563, 28166, 24555, 9549, 24102, 18962, 28312,

+ 1303, 16024, 16266, 1798, 6541, 3892, 11772, 31769, 21846, 30226,

+ 26868, 16833, 20721, 3272, 14970, 30065, 341, 19587, 28381, 19155,

+ 16852, 86, 19887, 12474, 13637, 12753, 9233, 16984, 16994, 17366,

+ 17457, 22705, 12143, 12200, 7696, 20559, 8477, 6213, 21897, 22327,

+ 173, 10230, 31119, 22301, 3416, 27684, 16566, 20436, 7407, 9069,

+ 28404, 13832, 20415, 12791, 18601, 10799, 15287, 12292, 14046, 7101,

+ 21197, 18119, 202, 11415, 2205, 20343, 16027, 26827, 31571, 26785,

+ 26995, 9854, 9164, 30146, 11440, 8742, 20728, 15637, 23664, 11001,

+ 29315, 6058, 13652, 29604, 30388, 26552, 18821, 23361, 16277, 18740,

+ 16117, 17027, 29524, 12450, 17128, 16692, 11241, 27692, 22194, 20450,

+ 18937, 15089, 22978, 14805, 28410, 28319, 29919, 27460, 25241, 19268,

+ 19122, 28616, 26456, 6497, 4485, 13584, 17020, 7745, 31306, 26071,

+ 31526, 28296, 2271, 28947, 5312, 20239, 16784, 4463, 18586, 6127,

+ 20446, 26876, 725, 19932, 2686, 1315, 9857, 26037, 30885, 24287,

+ 23810, 26200, 15491, 11049, 29880, 23739, 1805, 4019, 4831, 22073,

+ 30976, 4056, 15539, 21801, 5411, 17875, 31704, 29621, 10188, 15408,

+ 8698, 10474, 18341, 31617, 28593, 25611, 21424, 8274, 8871, 29227,

+ 4745, 3423, 12028, 25082, 22252, 3588, 10217, 23008, 19830, 31988,

+ 7076, 5192, 22448, 17198, 26244, 30271, 6217, 17197, 16742, 29757,

+ 5283, 1119, 3919, 14658, 3986, 13017, 11859, 17445, 352, 18249,

+ 20405, 28457, 20756, 27436, 6991, 5586, 13043, 27969, 8756, 19703,

+ 20552, 23101, 25749, 24855, 7265, 3520, 28385, 3825, 31450, 20360,

+ 21040, 10830, 6942, 20709, 31714, 10018, 11562, 7788, 12419, 14547,

+ 21396, 23024, 11762, 31705, 30412, 20654, 14531, 23943, 23971, 16840,

+ 6369, 13864, 12041, 26869, 18808, 18766, 16667, 8566, 24594, 8295,

+ 22877, 13644, 28416, 29585, 16963, 11432, 26363, 5296, 23031, 12707,

+ 15371, 4285, 32342, 23599, 20904, 31585, 31291, 31309, 29215, 6338,

+ 22529, 10369, 21816, 22941, 15683, 20099, 31254, 23957, 13286, 21560,

+ 22622, 28618, 1114, 8928, 11420, 12718, 1308, 18065, 25570, 26644,

+ 896, 17380, 27314, 7818, 10669, 30190, 25373, 5353, 1513, 2162,

+ 1581, 11050, 5911, 25172, 13441, 16251, 637, 5201, 31287, 12946,

+ 22219, 8174, 2575, 1602, 89, 10926, 29644, 19020, 21169, 29064,

+ 6622, 19319, 19277, 4248, 10815, 14563, 29090, 29461, 7835, 13210,

+ 30813, 32643, 1971, 31848, 1004, 21546, 10243, 13293, 14912, 10182,

+ 8610, 24816, 32721, 8832, 15211, 12534, 1507, 17181, 346, 10003,

+ 3592, 9334, 17464, 11521, 1767, 14120, 15483, 14959, 26171, 17292,

+ 21608, 1691, 25631, 18410, 23930, 30755, 31624, 1769, 13575, 18201,

+ 21523, 23114, 7201, 1365, 30977, 7638, 18107, 271, 383, 18069,

+ 26124, 13741, 3627, 31297, 12857, 16089, 16341, 15098, 14126, 471,

+ 2946, 31547, 26828, 277, 4023, 11789, 16970, 3588, 20212, 10107,

+ 29909, 19751, 29566, 24901, 27002, 16490, 97, 30681, 6726, 19380,

+ 5046, 29566, 1708, 26559, 7714, 12755, 18214, 30504, 13215, 888,

+ 1055, 29122, 22911, 21003, 21521, 23088, 30126, 25174, 17643, 12723,

+ 17207, 1734, 5301, 24128, 28681, 22047, 23926, 14038, 18428, 14959,

+ 14422, 10766, 4367, 27713, 7168, 13044, 31987, 11794, 31306, 4117,

+ 21454, 23561, 24856, 28889, 15417, 9186, 8829, 3347, 17546, 31020,

+ 18468, 23255, 4441, 6580, 21999, 22156, 21821, 13889, 8157, 4417,

+ 30167, 4993, 14129, 31045, 530, 14148, 13009, 4337, 23976, 30184,

+ 22252, 1993, 17897, 29716, 24543, 27076, 5048, 28842, 29786, 22759,

+ 24278, 27382, 702, 1304, 26211, 31020, 3530, 22066, 25249, 25361,

+ 11383, 31829, 9212, 21752, 16672, 23168, 9031, 16112, 11238, 32609,

+ 26441, 13372, 31827, 8299, 25464, 24323, 26174, 19242, 13316, 23625,

+ 32238, 16595, 23319, 5150, 32642, 12320, 25436, 25109, 9615, 16730,

+ 3006, 8696, 21260, 10423, 24690, 29882, 5227, 13031, 25911, 20909,

+ 15369, 32746, 13532, 14325, 7624, 24612, 14851, 5181, 11770, 1971,

+ 25894, 11945, 1922, 3072, 983, 13579, 7477, 24468, 7500, 13657,

+ 6791, 16430, 30746, 7263, 14179, 19218, 11585, 3249, 858, 11171,

+ 27753, 8676, 27648, 6196, 21867, 29693, 659, 4380, 2835, 28458,

+ 17630, 5640, 25381, 21424, 27997, 17814, 22429, 29221, 3746, 6943,

+ 7483, 30687, 32247, 16083, 831, 24492, 20805, 7180, 114, 23235,

+ 29749, 12764, 4453, 17915, 6292, 20968, 19453, 32571, 1532, 16762,

+ 19503, 12082, 3249, 28881, 24073, 23368, 8137, 15548, 2290, 21460,

+ 23184, 28263, 24626, 21135, 29994, 28020, 15541, 23881, 27770, 22605,

+ 17419, 16602, 24899, 30393, 24756, 14428, 29325, 15022, 3995, 5271,

+ 5963, 17255, 9952, 30653, 15162, 5813, 31194, 31064, 8972, 1178,

+ 32349, 18048, 23494, 26900, 22328, 4689, 14695, 16439, 26626, 27292,

+ 10442, 16510, 22039, 17629, 22733, 28515, 6877, 22381, 32435, 25645,

+ 2892, 4857, 14791, 11530, 30893, 20531, 23106, 2653, 20129, 1479,

+ 3951, 29785, 21094, 6801, 16653, 7887, 26454, 10253, 6133, 28484,

+ 31920, 16655, 31229, 6471, 2203, 4276, 32027, 21762, 13416, 26008,

+ 5582, 25614, 7704, 32073, 1209, 22668, 21278, 9212, 18321, 21105,

+ 26726, 31871, 4410, 10017, 21397, 1135, 3373, 10048, 27027, 10411,

+ 29213, 30404, 9799, 32264, 10202, 11087, 8609, 29255, 1141, 9405,

+ 21982, 2372, 25765, 21496, 6919, 31343, 9065, 25620, 31675, 17024,

+ 13551, 31128, 18223, 32103, 26805, 31769, 1139, 7298, 5870, 7694,

+ 10999, 19731, 15655, 5855, 17485, 8945, 20010, 17215, 23344, 23422,

+ 14627, 8124, 23494, 19672, 27649, 20884, 18722, 21844, 21791, 12747,

+ 27661, 24360, 10276, 3706, 24326, 19559, 27176, 5738, 7047, 24371,

+ 2328, 8929, 27786, 29230, 603, 21436, 27212, 5425, 23733, 12734,

+ 25425, 25153, 31084, 19240, 22184, 7870, 170, 32394, 25456, 31966,

+ 27939, 26584, 20891, 4442, 31479, 9152, 6130, 20839, 32218, 23867,

+ 857, 11496, 25202, 22883, 25429, 6370, 24320, 30084, 24523, 7728,

+ 5955, 19317, 23563, 16504, 14234, 28713, 2828, 20829, 19304, 129,

+ 6393, 1014, 21180, 28772, 3565, 21631, 23346, 20498, 19964, 6223,

+ 8212, 31669, 23154, 18954, 30149, 26938, 14431, 26136, 1120, 2142,

+ 8275, 27478, 5532, 26892, 23398, 21515, 31219, 7142, 29051, 6941,

+ 18691, 290, 3270, 8581, 308, 31127, 13964, 2048, 19099, 11799,

+ 20778, 20743, 24862, 24832, 29529, 24322, 27097, 32270, 2224, 8889,

+ 14273, 23667, 23403, 3595, 17287, 26410, 27498, 7906, 23232, 8072,

+ 13949, 5734, 19010, 11796, 21982, 12401, 2001, 30104, 5375, 28483,

+ 7931, 23672, 25990, 20344, 25920, 16451, 21654, 30775, 14710, 18312,

+ 25937, 15275, 21100, 1515, 29851, 31671, 24782, 9847, 2592, 18149,

+ 2120, 4150, 15000, 16800, 29678, 14591, 32586, 12196, 2524, 6800,

+ 9934, 12722, 537, 32221, 17176, 2952, 25794, 4263, 14514, 1552,

+ 13156, 31055, 21321, 16856, 16809, 23789, 875, 3522, 311, 2973,

+ 10639, 5629, 17621, 18201, 4694, 32563, 16079, 22413, 2064, 16900,

+ 16028, 25254, 7554, 23220, 29119, 14572, 5607, 8480, 11243, 3411,

+ 3636, 23799, 31338, 19212, 19360, 27174, 1728, 32161, 21348, 404,

+ 3211, 32577, 12223, 31248, 26285, 24921, 1598, 5512, 30637, 17252,

+ 25402, 11899, 29019, 3075, 24226, 22960, 16307, 14416, 32251, 20521,

+ 6916, 13679, 30628, 13651, 1362, 30823, 15199, 3455, 14072, 18480,

+ 25613, 30869, 16017, 28174, 30393, 1287, 22553, 16413, 4824, 12037,

+ 16208, 14892, 30671, 24560, 351, 6350, 950, 528, 4542, 10927,

+ 3932, 31881, 9813, 19493, 19339, 11147, 7906, 16647, 909, 10442,

+ 31642, 24770, 26862, 30766, 10003, 18601, 19588, 27851, 5985, 2189,

+ 26797, 23059, 2688, 32142, 8408, 25930, 25074, 20272, 23111, 2875,

+ 25000, 17074, 21011, 11818, 22054, 22683, 5232, 16393, 26083, 26773,

+ 31026, 23791, 4590, 12158, 18832, 27077, 10711, 957, 29480, 2883,

+ 14029, 9170, 27716, 2331, 8708, 21297, 11612, 29043, 6746, 14673,

+ 25564, 4249, 32057, 14080, 16934, 4338, 18111, 9721, 4315, 22324,

+ 19740, 14008, 25943, 28373, 19260, 24717, 8570, 6852, 32423, 6128,

+ 8366, 24150, 23717, 16148, 13861, 4739, 8869, 1215, 24675, 23378,

+ 17887, 9560, 22013, 4498, 1593, 16962, 20384, 29899, 10343, 17256,

+ 13140, 14708, 6999, 30489, 1282, 18278, 3276, 25623, 16436, 15505,

+ 12617, 490, 32541, 2030, 17200, 19322, 4825, 12468, 32043, 24541,

+ 28918, 7631, 5067, 9582, 6706, 29070, 29295, 8991, 24198, 19868,

+ 16232, 1040, 8804, 4913, 27482, 31072, 2366, 29577, 20453, 28227,

+ 10567, 25750, 8581, 16980, 11389, 19954, 14519, 32301, 743, 535,

+ 30302, 13877, 2587, 22482, 18276, 4026, 19972, 30709, 2980, 7232,

+ 18146, 13133, 25608, 32536, 14482, 29907, 11246, 4404, 5904, 9254,

+ 8657, 30521, 5178, 3129, 805, 24022, 15063, 6729, 8066, 20565,

+ 15063, 2323, 9989, 23919, 19164, 19523, 14324, 32357, 17146, 20527,

+ 28576, 29772, 21691, 25029, 656, 4008, 1127, 21186, 8155, 5693,

+ 18306, 11814, 9174, 15138, 27797, 4324, 24047, 23831, 12338, 31453,

+ 28121, 32536, 9010, 11279, 31722, 12083, 17985, 25098, 20673, 20374,

+ 32413, 2468, 4139, 30188, 18458, 14574, 6984, 21738, 18538, 1383,

+ 24041, 25636, 10139, 2671, 2877, 14886, 20961, 13310, 3501, 19648,

+ 1686, 8597, 11780, 2977, 22655, 13685, 13779, 2343, 849, 9232,

+ 4372, 9590, 14963, 6077, 13069, 28616, 21766, 15535, 17015, 12804,

+ 31523, 18728, 20704, 23185, 14435, 21994, 8526, 14444, 6053, 6895,

+ 16933, 15736, 11275, 25689, 32330, 15126, 11078, 21420, 27017, 19702,

+ 32020, 16699, 3124, 26157, 25606, 20960, 29197, 13447, 9095, 5360,

+ 8294, 19998, 18202, 15982, 14215, 23851, 28387, 20863, 17232, 15901,

+ 17769, 20254, 32544, 17384, 666, 15633, 4341, 5792, 8208, 6428,

+ 32724, 24646, 8850, 3188, 26987, 15330, 7390, 29558, 15093, 6865,

+ 20389, 3481, 29022, 5217, 2776, 27042, 9383, 21403, 13346, 25111,

+ 25229, 5984, 5814, 15861, 7269, 30904, 24650, 18853, 11339, 27494,

+ 28515, 31789, 13691, 11456, 22228, 31908, 25599, 5309, 14977, 7144,

+ 20363, 32080, 26985, 5779, 1445, 13300, 22756, 13098, 32520, 10632,

+ 25896, 4248, 1099, 21598, 31506, 14555, 17854, 30863, 3876, 19454,

+ 10901, 19089, 1482, 22343, 6984, 8203, 28897, 11441, 19257, 8935,

+ 18041, 20124, 17816, 15017, 29914, 17348, 16771, 8192, 30662, 26480,

+ 370, 20123, 21246, 2540, 16851, 18750, 5640, 30008, 31473, 25621,

+ 19758, 10754, 31258, 2376, 970, 26834, 5633, 11215, 15297, 23429,

+ 609, 23688, 32334, 29436, 1763, 13703, 27137, 19733, 7490, 4013,

+ 25095, 14042, 15021, 13948, 17067, 7929, 18541, 3625, 16157, 3189,

+ 4039, 24563, 19570, 28058, 7460, 16564, 15853, 21302, 24175, 17846,

+ 30333, 27654, 191, 31687, 21382, 21615, 20790, 21648, 13540, 3694,

+ 9513, 32290, 17966, 13778, 3456, 22738, 27959, 17577, 22880, 32583,

+ 475, 31736, 11272, 5329, 13048, 17583, 10745, 19964, 15546, 7387,

+ 346, 26470, 21532, 25886, 20890, 32461, 27563, 8796, 13911, 620,

+ 13709, 1976, 31103, 10888, 1731, 23743, 12469, 12614, 32683, 5090,

+ 18934, 15551, 7625, 9514, 19324, 12118, 6854, 295, 19170, 21066,

+ 15545, 12330, 24458, 3719, 31654, 29108, 5180, 10178, 8260, 28717,

+ 7183, 11716, 16388, 23769, 20109, 6150, 14926, 2057, 12050, 16255,

+ 6926, 18830, 885, 10938, 1647, 19827, 15850, 24619, 4582, 6380,

+ 15911, 12995, 11891, 23433, 11718, 15554, 2084, 24751, 31723, 31949,

+ 32474, 13641, 15398, 18752, 7247, 21947, 27803, 3525, 11096, 30743,

+ 26464, 1830, 21608, 18068, 806, 29023, 25430, 7740, 10012, 23544,

+ 6752, 9700, 22032, 6289, 13935, 20833, 29911, 30655, 2205, 9465,

+ 20464, 18454, 18676, 19736, 9316, 19335, 1656, 24132, 12272, 5869,

+ 22632, 20819, 3174, 4066, 13506, 4060, 23121, 31959, 4101, 9451,

+ 32472, 23396, 10810, 26105, 30949, 28892, 11573, 10267, 4486, 18725,

+ 25, 21881, 27539, 6086, 29722, 30466, 13969, 12098, 11911, 1630,

+ 2262, 677, 29703, 7204, 9454, 25948, 14627, 20046, 11838, 32073,

+ 7172, 21226, 4327, 6935, 11134, 15122, 8429, 27851, 8014, 23069,

+ 13465, 16028, 26016, 11543, 15899, 15877, 10709, 22127, 10356, 29464,

+ 14466, 496, 31635, 25621, 25788, 17650, 3006, 5947, 21139, 20178,

+ 14388, 26334, 19164, 32159, 32017, 23482, 31796, 11030, 23665, 391,

+ 19777, 17873, 25304, 27086, 9275, 2747, 19154, 20730, 18347, 29383,

+ 982, 6578, 15475, 10466, 8304, 4710, 17679, 7206, 28576, 14632,

+ 26138, 592, 17789, 29118, 5140, 24180, 14109, 25077, 28258, 24559,

+ 19897, 26680, 11158, 11678, 29965, 24672, 6897, 29005, 10494, 10958,

+ 24358, 14194, 9855, 10679, 18017, 30492, 9141, 10432, 25480, 22054,

+ 21337, 25291, 19649, 32176, 14175, 6672, 9012, 4815, 1749, 30319,

+ 18450, 10116, 11021, 7684, 25302, 14315, 6142, 15357, 7371, 1973,

+ 1000, 27048, 13774, 29656, 16951, 11728, 22101, 3205, 17834, 1610,

+ 17072, 2907, 3508, 12235, 21391, 31194, 803, 8189, 22469, 7194,

+ 2047, 26065, 17227, 29629, 16053, 25622, 20360, 28450, 19572, 6731,

+ 28879, 6363, 6872, 28593, 17706, 23394, 23750, 13477, 24662, 11527,

+ 23191, 20013, 6414, 14381, 18808, 16337, 15245, 21430, 12816, 1964,

+ 17742, 24508, 10852, 194, 3606, 23170, 26360, 16276, 564, 16810,

+ 26423, 7410, 20999, 5032, 16661, 25361, 15042, 1398, 20467, 20701,

+ 19564, 16521, 19139, 26512, 20779, 15621, 1388, 13956, 14785, 3117,

+ 24944, 6469, 13143, 10013, 12748, 7147, 19066, 5563, 5664, 31143,

+ 16227, 491, 4367, 27035, 28539, 2818, 24041, 11759, 30750, 28030,

+ 18823, 6433, 30367, 21236, 4727, 32156, 2445, 24137, 5210, 15245,

+ 30517, 18469, 17033, 24818, 7528, 8101, 13823, 4083, 3711, 848,

+ 21107, 8054, 32667, 26189, 18116, 10734, 27698, 13779, 27802, 32371,

+ 4807, 29408, 19275, 10264, 12024, 5166, 16891, 32633, 5310, 17507,

+ 7432, 31379, 4337, 20615, 6821, 11993, 13066, 23228, 8900, 14724,

+ 25645, 9513, 13882, 554, 28519, 2360, 22813, 2962, 24372, 28417,

+ 31857, 18119, 21572, 22790, 11012, 7275, 14718, 22560, 32151, 8270,

+ 31046, 31673, 6718, 9023, 6139, 4668, 17162, 5922, 22468, 19914,

+ 14308, 31043, 18829, 8495, 28604, 14058, 28492, 26900, 27876, 16432,

+ 21385, 13685, 12470, 15632, 14877, 18262, 4733, 6337, 20026, 5810,

+ 32147, 22339, 29099, 29877, 23238, 26937, 4445, 7723, 10496, 29174,

+ 8991, 21047, 2344, 13274, 12454, 16712, 16707, 5855, 5076, 26697,

+ 31455, 32111, 18490, 11288, 16561, 23417, 30171, 18746, 32637, 17347,

+ 6450, 27597, 3638, 24450, 27767, 957, 359, 1064, 30239, 10555,

+ 19921, 23421, 24738, 9579, 32341, 20977, 32640, 29533, 277, 16176,

+ 9606, 19775, 20439, 31992, 12365, 6609, 30634, 24615, 27909, 19993,

+ 17355, 18457, 14960, 5975, 4041, 14384, 3121, 24891, 1256, 12212,

+ 13127, 3158, 18115, 13278, 4053, 26831, 21302, 16431, 4132, 18775,

+ 6523, 4358, 8426, 16990, 3219, 31858, 29389, 27015, 13544, 19781,

+ 14627, 10586, 1328, 21610, 17916, 32058, 30356, 9336, 10082, 10646,

+ 12306, 11142, 10719, 17507, 15648, 8002, 25664, 8649, 6034, 28477,

+ 12441, 31004, 2237, 12681, 13961, 22031, 9693, 15750, 27327, 10788,

+ 27572, 26873, 10173, 4711, 15732, 7006, 17372, 9564, 19167, 11136,

+ 18577, 23862, 8621, 15174, 12014, 29257, 28206, 1488, 17772, 14786,

+ 12080, 21442, 8935, 23702, 24867, 2528, 19178, 31416, 25723, 1500,

+ 26413, 3727, 9046, 15723, 14940, 9383, 14943, 21406, 12314, 15271,

+ 10482, 6256, 11846, 24707, 19585, 9884, 2941, 23282, 11062, 5041,

+ 20192, 32291, 20953, 26215, 7447, 29099, 18677, 18228, 30358, 1731,

+ 25910, 7963, 11038, 28080, 30486, 6341, 9863, 24450, 7608, 14290,

+ 31422, 4097, 16660, 31345, 19210, 31717, 30549, 14638, 31891, 26437,

+ 22911, 14604, 20516, 8274, 2901, 9172, 18736, 23109, 31354, 23212,

+ 1555, 13462, 6358, 22251, 28059, 17007, 5691, 3372, 21959, 9824,

+ 23881, 1698, 1998, 5716, 22415, 9387, 17763, 23492, 15602, 17063,

+ 13112, 9258, 29267, 10762, 19649, 13753, 15212, 3248, 17722, 23627,

+ 17403, 31089, 31211, 8859, 17443, 32502, 22955, 11188, 17423, 28874,

+ 26019, 16553, 17112, 692, 12116, 26247, 17577, 11845, 30684, 4232,

+ 3105, 5805, 21620, 17033, 760, 24275, 31806, 14270, 5606, 9636,

+ 9022, 24997, 1984, 7338, 1701, 21304, 32741, 27873, 3670, 27751,

+ 22488, 24007, 10147, 22981, 27694, 29363, 15703, 15490, 29867, 29287,

+ 28922, 3737, 10152, 3304, 31056, 5962, 11447, 5006, 18979, 971,

+ 8842, 30551, 26946, 30779, 15377, 384, 5322, 11479, 14563, 31319,

+ 7844, 27504, 15583, 12875, 8527, 285, 19219, 8517, 29152, 30765,

+ 26589, 4155, 29511, 11871, 9807, 258, 11987, 6998, 9432, 18531,

+ 22009, 23367, 15649, 3698, 4433, 20981, 27446, 10523, 16609, 31199,

+ 12262, 1278, 4510, 13239, 29292, 4221, 3120, 10775, 9551, 23826,

+ 246, 7536, 12934, 27366, 30026, 11331, 29408, 21152, 30214, 27539,

+ 13475, 16763, 29510, 25498, 5491, 31644, 2416, 17595, 13174, 22690,

+ 23410, 26808, 31158, 28286, 25163, 29733, 3015, 24197, 21965, 11292,

+ 5289, 30915, 4769, 21555, 31983, 10643, 8587, 10411, 19489, 25965,

+ 17391, 18666, 14688, 1790, 10645, 9771, 12104, 21374, 13225, 19061,

+ 18203, 6462, 26886, 3017, 32539, 7296, 32692, 32672, 12343, 18060,

+ 8110, 17045, 1770, 19200, 17129, 26718, 865, 14184, 22163, 10240,

+ 17628, 8462, 408, 6211, 9302, 25876, 13419, 4196, 25192, 11967,

+ 26115, 267, 27755, 14358, 8740, 22908, 31965, 30892, 19679, 19729,

+ 6917, 14010, 16220, 3304, 15834, 11888, 8663, 18905, 5666, 17293,

+ 9961, 4779, 17367, 28974, 3081, 25223, 31438, 27619, 850, 29612,

+ 23195, 10760, 27271, 10853, 32175, 18003, 29524, 11320, 963, 28841,

+ 8406, 30561, 7034, 24886, 15966, 3711, 20289, 444, 13170, 3212,

+ 6522, 16683, 22805, 13586, 987, 17779, 13385, 21660, 22032, 28566,

+ 14801, 1387, 6056, 26113, 32571, 11371, 26926, 6428, 32030, 16998,

+ 30870, 30240, 18081, 15734, 5340, 15401, 23100, 11968, 9447, 10124,

+ 28611, 26719, 1459, 26474, 26528, 16287, 5039, 4485, 16223, 16236,

+ 25444, 2131, 12145, 24330, 27992, 1873, 22057, 4358, 12594, 18842,

+ 5131, 15980, 5150, 32440, 32070, 570, 32371, 442, 1151, 14613,

+ 31892, 1670, 17104, 14651, 26388, 12657, 273, 18105, 22045, 19725,

+ 26198, 6110, 25618, 4674, 28600, 32239, 883, 13985, 5465, 1564,

+ 27649, 13556, 16546, 9907, 25379, 1050, 30671, 19604, 25481, 12306,

+ 25262, 23781, 26639, 2389, 3235, 32518, 24036, 24169, 2032, 17095,

+ 491, 29619, 22067, 30425, 11617, 11661, 14896, 17283, 21953, 8344,

+ 22225, 23958, 17380, 31827, 16235, 26019, 18029, 1005, 23875, 18283,

+ 25444, 2392, 20049, 11671, 19745, 7839, 8516, 23978, 7788, 29049,

+ 4806, 4147, 8674, 1310, 12288, 6471, 10395, 15961, 609, 29998,

+ 13321, 30175, 10395, 3421, 30499, 1247, 239, 18852, 29379, 32730,

+ 18603, 16809, 12621, 5045, 21745, 8853, 26002, 14605, 18617, 7437,

+ 28916, 12746, 27673, 28516, 5322, 1271, 2245, 24591, 21254, 27857,

+ 28626, 15449, 16917, 27421, 3263, 12120, 22534, 30655, 10677, 1311,

+ 28911, 32137, 18702, 11829, 5260, 6481, 14357, 5958, 16170, 20294,

+ 16140, 10521, 12739, 10884, 4724, 1218, 3435, 31461, 27016, 20505,

+ 15850, 9498, 24075, 9834, 30635, 14587, 31043, 366, 19669, 16924,

+ 4678, 11898, 7607, 1697, 24948, 9207, 26729, 10323, 27973, 19218,

+ 15280, 23539, 13381, 4532, 20771, 10958, 14428, 22709, 4748, 29329,

+ 20307, 4685, 3729, 5983, 23700, 9419, 8340, 7201, 22577, 25993,

+ 20439, 5405, 18216, 16415, 10724, 10443, 2278, 24023, 7212, 4835,

+ 7689, 24929, 4334, 23995, 19562, 2760, 21338, 17872, 17499, 22437,

+ 32503, 31650, 11053, 29587, 32322, 14278, 12022, 3298, 23704, 21814,

+ 1936, 24976, 28501, 26091, 2277, 6260, 6718, 30126, 10858, 15037,

+ 13084, 28459, 10218, 24987, 18602, 22343, 8069, 27708, 20657, 21171,

+ 20728, 20986, 370, 10689, 25119, 25811, 23108, 15991, 19640, 6169,

+ 8062, 10467, 22889, 8042, 19863, 28077, 19461, 31203, 18316, 755,

+ 9483, 15761, 17538, 5968, 7279, 14120, 16557, 20286, 14749, 12792,

+ 30064, 27807, 11452, 31772, 7366, 5270, 19759, 31477, 992, 10139,

+ 24930, 25559, 12560, 24527, 5059, 27905, 8421, 10636, 14606, 2771,

+ 24216, 27201, 19406, 3387, 31654, 10621, 16673, 12657, 10943, 20553,

+ 6843, 31716, 479, 29371, 23085, 28276, 10171, 22472, 14695, 28385,

+ 28766, 13146, 19580, 29059, 11540, 18082, 28838, 15420, 13191, 23216,

+ 11402, 21932, 24616, 18753, 26045, 29859, 6096, 2008, 3974, 988,

+ 3239, 26896, 14054, 3560, 19014, 2096, 4053, 9576, 19736, 4864,

+ 26575, 7551, 10502, 26075, 8591, 9863, 851, 11782, 7707, 8963,

+ 25540, 1600, 14080, 18645, 8453, 16794, 11743, 25266, 27720, 22665,

+ 13608, 17874, 16431, 11322, 30246, 20460, 14060, 5157, 14396, 353,

+ 2983, 27109, 3438, 1976, 19231, 1863, 10274, 19530, 30613, 27297,

+ 15912, 23358, 9190, 30053, 7417, 14008, 18935, 30965, 21308, 27214,

+ 24661, 1465, 5007, 29372, 29469, 12400, 13443, 19928, 17434, 16835,

+ 29160, 18120, 13870, 1056, 21324, 21106, 2035, 9157, 23486, 4148,

+ 8609, 21787, 26328, 17109, 31283, 13638, 22268, 21948, 22469, 6394,

+ 30941, 16992, 28481, 15760, 16449, 27136, 10042, 4185, 16902, 14228,

+ 536, 50, 3939, 7683, 29558, 3416, 22129, 18070, 9416, 2942,

+ 27626, 941, 27969, 18973, 8752, 23473, 244, 5900, 4497, 16457,

+ 6969, 20304, 13769, 17873, 10322, 29237, 1224, 28424, 12878, 27294,

+ 25270, 24840, 5422, 665, 5941, 4988, 15943, 13622, 10214, 20749,

+ 31463, 21146, 15406, 7197, 6715, 10831, 28218, 19384, 26224, 12254,

+ 11584, 29895, 14617, 19872, 5384, 29575, 11985, 22993, 24236, 10554,

+ 15905, 25062, 20124, 16925, 13732, 16416, 17380, 6041, 25960, 12130,

+ 19634, 701, 30616, 20800, 25618, 13036, 15448, 23128, 15613, 23763,

+ 27889, 22757, 16018, 21918, 10798, 18833, 5539, 28268, 14854, 28299,

+ 32627, 9216, 18554, 7386, 12734, 30393, 12225, 29681, 1018, 32452,

+ 2979, 13187, 15837, 4240, 7203, 9112, 12063, 1410, 15200, 17121,

+ 29825, 31979, 27325, 12104, 3598, 10551, 15168, 31948, 10913, 32103,

+ 5432, 28300, 19623, 20161, 8995, 17953, 11302, 16069, 25550, 7473,

+ 31231, 356, 10174, 32065, 26736, 21357, 32207, 10699, 7388, 13640,

+ 21275, 20625, 28367, 15846, 18973, 5168, 6205, 6648, 3351, 9464,

+ 15114, 2911, 8112, 23547, 24527, 31972, 29666, 3172, 20956, 32298,

+ 17939, 32523, 31865, 15328, 1154, 19526, 11634, 18491, 17893, 2049,

+ 24786, 18340, 4945, 29713, 31214, 21934, 2393, 11461, 3493, 13898,

+ 5242, 958, 8679, 10046, 19639, 32001, 1652, 26067, 13440, 8779,

+ 10982, 15566, 24280, 8357, 5618, 11938, 16567, 25655, 25067, 4068,

+ 12717, 9825, 25223, 9727, 24521, 8712, 22502, 7721, 15033, 25134,

+ 21200, 28822, 6706, 24262, 11839, 1003, 9107, 23494, 16925, 9461,

+ 12997, 15997, 13134, 9883, 19045, 19751, 1265, 15889, 20261, 3263,

+ 20195, 28495, 4719, 12564, 15749, 7618, 28748, 21279, 16064, 5441,

+ 1157, 24980, 70, 8002, 15112, 32695, 8986, 30798, 16268, 18033,

+ 18514, 14770, 4216, 7075, 23324, 2936, 14593, 5050, 15359, 12949,

+ 30355, 4484, 12643, 20324, 19827, 6210, 16724, 24659, 20642, 1022,

+ 22659, 23773, 8452, 7198, 25229, 31928, 26561, 13370, 14208, 32591,

+ 20460, 20267, 668, 1906, 17251, 30820, 1622, 24396, 28406, 18310,

+ 24995, 14486, 20939, 16942, 14962, 15627, 23552, 4113, 29050, 796,

+ 24723, 13644, 17207, 15076, 24191, 18165, 31279, 10078, 25896, 19958,

+ 5754, 14294, 6137, 19483, 3713, 21917, 5452, 5993, 3334, 14849,

+ 17546, 32690, 20581, 24700, 20371, 29286, 3865, 26924, 19296, 4268,

+ 1409, 32643, 21479, 27569, 4324, 6464, 7998, 23360, 31668, 8606,

+ 19460, 8852, 24335, 25803, 28413, 22378, 15755, 20379, 9212, 16218,

+ 15155, 22398, 9734, 5990, 5837, 7856, 12980, 31188, 18527, 10415,

+ 15577, 22073, 26865, 13042, 12901, 12247, 18323, 1496, 22921, 5672,

+ 20386, 20959, 2332, 3003, 9288, 27926, 16446, 20287, 5442, 1237,

+ 24891, 15070, 20710, 6059, 5042, 11724, 30564, 19352, 4598, 13343,

+ 29516, 29820, 26036, 24801, 15184, 24272, 22486, 3683, 24908, 12948,

+ 6056, 30933, 4739, 648, 23865, 26388, 27947, 23455, 2821, 21955,

+ 20269, 26801, 4816, 22685, 550, 32368, 8661, 9737, 26801, 9117,

+ 22560, 239, 4328, 27004, 3897, 29899, 20520, 10373, 29698, 6144,

+ 19477, 30044, 30690, 18542, 5342, 25091, 23843, 5702, 13507, 24399,

+ 25241, 20765, 22740, 21144, 21125, 27456, 30459, 13237, 30904, 10056,

+ 5436, 18215, 17404, 17390, 5692, 18581, 5807, 6688, 12032, 6521,

+ 2737, 24916, 27128, 18456, 11393, 3612, 23356, 695, 29090, 32506,

+ 27157, 19212, 28228, 27510, 21439, 32243, 3616, 18799, 19309, 866,

+ 21668, 7343, 23438, 15007, 26704, 25794, 27727, 30384, 28000, 7431,

+ 4961, 7956, 29611, 775, 4348, 18608, 31691, 5894, 7716, 23308,

+ 22398, 2776, 28715, 5567, 26956, 4854, 5495, 2600, 1898, 19921,

+ 3973, 23903, 1503, 13670, 20014, 26219, 11237, 20243, 28713, 31926,

+ 6290, 3497, 27858, 2750, 23223, 6594, 2857, 14604, 16393, 29781,

+ 18974, 17770, 8062, 10119, 7692, 23121, 8954, 31172, 10115, 31393,

+ 21547, 22287, 18250, 21908, 28849, 25750, 13220, 5877, 18819, 29322,

+ 29395, 1933, 12686, 16429, 24283, 4575, 16287, 17965, 5768, 32533,

+ 26498, 31536, 32690, 57, 11884, 18096, 16064, 22440, 32406, 5641,

+ 18283, 14020, 24107, 18384, 27333, 9194, 3428, 24935, 1657, 31908,

+ 20465, 17102, 14676, 26655, 26012, 19644, 16644, 19935, 30249, 11503,

+ 25888, 9393, 29824, 17600, 4969, 11745, 15630, 24058, 4432, 28846,

+ 29544, 8684, 26296, 2555, 25393, 1725, 26108, 9287, 26687, 9984,

+ 30004, 11231, 8697, 14216, 31924, 4946, 30211, 3966, 7894, 15398,

+ 9758, 30384, 7418, 22473, 32073, 11820, 3530, 21706, 22572, 26382,

+ 18627, 11337, 3255, 7062, 10993, 9133, 29959, 32382, 6393, 22165,

+ 8585, 29834, 25181, 7440, 30305, 19552, 27132, 8720, 14349, 10394,

+ 14296, 15900, 19269, 20506, 22556, 27206, 11302, 22685, 11102, 24413,

+ 24720, 24467, 3105, 13667, 27085, 17711, 28062, 5953, 31091, 7610,

+ 22468, 24250, 28043, 19756, 25725, 11422, 22514, 253, 8755, 20800,

+ 5376, 31801, 32659, 6441, 13672, 27091, 9360, 21006, 16223, 10555,

+ 23723, 7168, 2817, 18738, 30322, 23267, 15856, 9438, 15431, 23585,

+ 10814, 22297, 27235, 1184, 5261, 30735, 17947, 6897, 9588, 22792,

+ 14945, 458, 2597, 12930, 7565, 30390, 2125, 30851, 1118, 10507,

+ 2364, 18733, 17979, 15644, 24646, 10643, 5823, 4017, 20585, 1227,

+ 22645, 19892, 5424, 8517, 3296, 13357, 29398, 90, 1471, 3185,

+ 4527, 23592, 15246, 14485, 10436, 14238, 27984, 25641, 15293, 13523,

+ 28044, 11555, 28677, 9628, 16534, 22810, 15656, 2653, 28687, 27317,

+ 31872, 29471, 14255, 11106, 7184, 30435, 28482, 32075, 30896, 13622,

+ 22001, 2438, 9067, 5638, 8899, 7819, 5669, 15284, 32356, 21228,

+ 7040, 23402, 18980, 16448, 28161, 28591, 22594, 27232, 21103, 31033,

+ 31083, 9943, 12668, 16898, 894, 6291, 29864, 22174, 13714, 5089,

+ 10849, 10699, 7482, 32408, 13679, 5706, 24840, 147, 2959, 13037,

+ 5199, 6245, 18270, 11506, 30765, 26697, 4473, 7311, 19913, 20312,

+ 9443, 1998, 7642, 8959, 29351, 1947, 6505, 7343, 10430, 17179,

+ 30679, 20438, 8242, 13632, 30241, 15375, 30340, 28827, 23395, 20373,

+ 22092, 21873, 9883, 28158, 13087, 28176, 18864, 20262, 31925, 25955,

+ 5555, 19049, 3403, 19397, 15460, 25109, 22343, 7699, 2808, 8990,

+ 5659, 17157, 16921, 11540, 1643, 29374, 12079, 30291, 26994, 15521,

+ 27358, 8314, 22434, 8039, 24783, 28958, 9866, 26478, 1204, 17087,

+ 26109, 18260, 22662, 506, 14449, 24261, 10257, 2817, 2725, 9105,

+ 7603, 31561, 28295, 24834, 5217, 19330, 7508, 16748, 19178, 17868,

+ 25857, 5637, 23680, 11304, 1242, 20727, 8820, 9004, 15721, 26036,

+ 25409, 13564, 6041, 906, 29388, 117, 10011, 24183, 10218, 26795,

+ 19465, 31294, 19235, 22678, 14281, 11194, 25270, 28424, 14645, 17523,

+ 32732, 9954, 5112, 7279, 29009, 20360, 26427, 28235, 32529, 27026,

+ 26498, 14730, 4959, 15301, 28624, 7980, 29964, 13377, 11794, 27778,

+ 30454, 27131, 28346, 18498, 16591, 21102, 19371, 13783, 5408, 32654,

+ 16981, 25338, 14477, 31230, 29985, 29574, 24154, 2946, 7183, 16264,

+ 15918, 3511, 26781, 14230, 14103, 4354, 24812, 25443, 9167, 28614,

+ 30238, 11920, 17470, 8666, 23042, 30660, 24639, 25658, 22515, 5630,

+ 1959, 2300, 13565, 18474, 4996, 902, 23362, 17139, 19618, 1279,

+ 21660, 20697, 23380, 15619, 22660, 14467, 25712, 4763, 28979, 23894,

+ 30620, 26988, 31750, 20038, 13000, 18222, 2343, 14060, 16124, 28000,

+ 24170, 26329, 2644, 15162, 8565, 25387, 25417, 27620, 27940, 13918,

+ 22833, 1253, 22060, 29284, 1545, 2270, 8958, 6391, 9587, 17016,

+ 15086, 24110, 7419, 15259, 4244, 31054, 22942, 13537, 2930, 30691,

+ 9869, 12618, 13528, 18192, 24878, 27185, 11269, 26404, 11876, 16254,

+ 9615, 32109, 5392, 30750, 31237, 14417, 8664, 26288, 2002, 14746,

+ 30759, 18049, 27748, 31506, 29812, 25787, 22670, 24912, 17352, 27097,

+ 1067, 28881, 5242, 22366, 1285, 22859, 17469, 3527, 3317, 19261,

+ 12126, 28350, 21323, 19403, 1350, 28560, 11631, 31433, 17990, 12257,

+ 6857, 32534, 20116, 26783, 18399, 3371, 4752, 18228, 19645, 15347,

+ 28748, 2304, 10906, 7134, 14924, 27398, 19640, 17457, 24458, 16869,

+ 4236, 19104, 21693, 19979, 6431, 22814, 8923, 8229, 29108, 22004,

+ 16093, 8665, 17323, 21008, 3778, 5816, 9125, 12704, 16342, 10606,

+ 14825, 17120, 21044, 22844, 18951, 14128, 32138, 23465, 23995, 12906,

+ 21276, 18036, 5907, 25714, 16652, 5580, 28116, 24847, 23256, 25283,

+ 23579, 10745, 2852, 24065, 15936, 7987, 4794, 25269, 27135, 18842,

+ 30927, 13778, 16602, 13247, 20616, 17783, 16825, 17650, 30652, 31918,

+ 24020, 21151, 13052, 32602, 5330, 23518, 19152, 25195, 7218, 9029,

+ 3652, 13396, 5611, 6912, 24227, 27071, 6735, 22308, 10371, 639,

+ 6453, 31297, 28161, 31430, 22103, 20535, 17998, 23704, 1273, 2890,

+ 30315, 1407, 18124, 22392, 1840, 29825, 4625, 14345, 31891, 13391,

+ 17153, 25449, 4647, 13759, 23661, 4403, 8419, 11900, 15266, 28302,

+ 4645, 20476, 17295, 11452, 1014, 27315, 17194, 24048, 656, 20871,

+ 6927, 5216, 31518, 4483, 26218, 30620, 19394, 20943, 11032, 17438,

+ 5340, 28640, 21769, 26914, 12170, 11244, 233, 14520, 28011, 31137,

+ 23039, 24087, 1449, 18710, 3925, 3636, 21302, 23554, 9241, 9875,

+ 18517, 31532, 8003, 11869, 15197, 8226, 24184, 28084, 28857, 26414,

+ 4142, 3907, 1588, 23942, 6418, 25, 9076, 32707, 26790, 439,

+ 5059, 31892, 303, 8807, 11542, 4020, 14030, 4048, 10311, 2329,

+ 27117, 30664, 20134, 21615, 16604, 27497, 8368, 5316, 9404, 30823,

+ 23070, 10373, 1437, 27808, 30498, 10665, 10723, 30709, 7917, 15916,

+ 3310, 8281, 6004, 19647, 4346, 15399, 9844, 27070, 2115, 26297,

+ 947, 4194, 22893, 9014, 16522, 31800, 17188, 8619, 18592, 14033,

+ 768, 23134, 24568, 11707, 25515, 29535, 16942, 25777, 30277, 9311,

+ 18173, 6159, 31495, 3269, 12293, 25481, 15655, 12287, 971, 16667,

+ 26108, 3094, 6658, 29763, 2915, 32390, 15625, 13679, 32097, 27468,

+ 1204, 12721, 5898, 23104, 20047, 12986, 5793, 32421, 30176, 774,

+ 16640, 23807, 13485, 25172, 21562, 804, 18686, 7769, 3456, 1686,

+ 19236, 9141, 17985, 15632, 21434, 6950, 27797, 25439, 22315, 26364,

+ 23260, 9843, 23157, 5325, 21154, 17078, 25900, 5993, 7879, 11677,

+ 21697, 23824, 8412, 32124, 29956, 5603, 19919, 926, 488, 16025,

+ 24011, 19605, 30342, 17267, 13146, 31439, 19813, 20338, 15821, 12138,

+ 5625, 7111, 23261, 30025, 873, 21387, 31634, 25192, 22678, 24496,

+ 4196, 25452, 21848, 12088, 161, 25983, 2314, 20388, 12558, 21082,

+ 11850, 27056, 24017, 4771, 29690, 30269, 19342, 2682, 22410, 16271,

+ 5073, 17487, 29818, 696, 4268, 15862, 27930, 17748, 11169, 3069,

+ 20629, 13175, 5057, 18237, 8749, 6628, 7958, 30895, 26056, 20608,

+ 23359, 30593, 21932, 10502, 4442, 28009, 9607, 13819, 16679, 30010,

+ 30386, 32229, 22377, 1973, 25014, 28344, 9104, 10913, 14608, 9617,

+ 20630, 5662, 26929, 24230, 25895, 17462, 6601, 8573, 3844, 7861,

+ 29765, 32093, 15785, 16186, 13206, 27139, 20526, 30095, 24885, 8341,

+ 23147, 2102, 25444, 220, 17759, 25412, 16566, 22189, 20179, 10611,

+ 15569, 5032, 11322, 23410, 12915, 20774, 21724, 2431, 20147, 11884,

+ 14131, 17208, 4490, 24357, 23957, 14766, 14225, 32271, 17940, 18364,

+ 28940, 30708, 29091, 21655, 2600, 8924, 28282, 17573, 26753, 21889,

+ 25019, 27795, 487, 4867, 21589, 15010, 12386, 7901, 18216, 2625,

+ 1907, 3352, 21099, 21985, 3741, 8894, 21579, 15109, 1316, 6802,

+ 29397, 1176, 4885, 8702, 29974, 12164, 2950, 8781, 14209, 7552,

+ 9247, 10778, 16273, 27177, 17882, 2824, 12975, 5717, 23302, 32692,

+ 13397, 32164, 16018, 28136, 28532, 19032, 12424, 6418, 20243, 23398,

+ 29656, 22772, 10809, 20684, 31063, 10396, 26382, 12838, 15367, 8599,

+ 22845, 25468, 12953, 14178, 24476, 23647, 31280, 18209, 1295, 21812,

+ 7784, 20371, 10410, 24271, 8855, 25926, 28949, 6212, 12371, 14087,

+ 3893, 30457, 3892, 13981, 5128, 21760, 18906, 14775, 24017, 14756,

+ 9266, 10018, 24694, 4162, 18166, 1087, 19750, 16731, 17523, 30389,

+ 23870, 25062, 23183, 3683, 17518, 27883, 5642, 27545, 3608, 15181,

+ 15108, 5511, 27128, 11752, 5824, 5365, 11274, 15835, 7847, 10037,

+ 936, 26407, 144, 7510, 11763, 8570, 2110, 15259, 10101, 23365,

+ 32298, 11563, 8453, 11028, 25475, 24586, 15338, 11039, 12148, 23880,

+ 20803, 13084, 29093, 29049, 18598, 25688, 32260, 14693, 16903, 15366,

+ 1477, 26368, 5851, 8151, 16807, 21148, 30334, 6347, 4474, 11357,

+ 8658, 12358, 13534, 25069, 2602, 9062, 333, 3186, 22374, 24724,

+ 14684, 31421, 6495, 857, 26941, 11204, 10373, 17011, 27785, 19795,

+ 31174, 1065, 316, 4862, 27058, 3291, 3074, 31066, 17117, 31709,

+ 29105, 18797, 901, 2694, 10774, 28770, 9845, 16771, 28660, 32641,

+ 29481, 6257, 12874, 26719, 6451, 13228, 10965, 18770, 6878, 13409,

+ 15830, 24104, 19216, 20203, 1813, 26905, 25205, 7004, 14374, 10233,

+ 28633, 21593, 11243, 10675, 10198, 30764, 21338, 6130, 22448, 20,

+ 24448, 18721, 32637, 8671, 19654, 11926, 22409, 20411, 13172, 29450,

+ 17656, 27210, 371, 23885, 429, 22772, 343, 19255, 31595, 31873,

+ 21149, 22754, 11834, 12263, 14128, 2070, 32269, 19296, 23090, 31749,

+ 21409, 24000, 29690, 7481, 168, 4102, 28505, 14794, 12071, 26417,

+ 29730, 30164, 24605, 22613, 31465, 8232, 15717, 25325, 19978, 16194,

+ 17117, 9587, 7150, 27260, 712, 8238, 32393, 17281, 2417, 6732,

+ 7207, 9219, 9234, 23856, 17769, 21425, 3827, 14861, 13450, 23139,

+ 20182, 3508, 20967, 17048, 14739, 13994, 8639, 24611, 29184, 12670,

+ 16183, 28449, 23315, 20313, 2209, 7982, 17995, 15063, 24829, 24281,

+ 24907, 16149, 10944, 31573, 9929, 1292, 24533, 26737, 22182, 15133,

+ 27362, 17609, 14686, 23276, 9676, 28222, 12963, 370, 8573, 15013,

+ 26437, 3406, 6885, 10428, 31317, 30556, 16702, 7522, 9610, 6537,

+ 12693, 263, 12515, 22502, 19334, 20833, 3470, 24571, 17223, 31584,

+ 6153, 29277, 5352, 4453, 17799, 27267, 15576, 12719, 16533, 30933,

+ 22956, 12565, 14589, 17158, 6940, 24059, 27371, 24228, 8782, 28543,

+ 8526, 23021, 14168, 29939, 14209, 18149, 30720, 22928, 24107, 31909,

+ 25541, 20584, 10084, 758, 26916, 15517, 7705, 23582, 22548, 27089,

+ 27825, 8442, 24019, 10461, 22256, 9037, 28132, 9414, 2844, 2648,

+ 15449, 1005, 3679, 7595, 11598, 10629, 18541, 12858, 23990, 11082,

+ 29286, 28083, 10586, 20336, 27902, 21519, 21022, 9946, 16859, 21352,

+ 11398, 6029, 21567, 16906, 30074, 27492, 1254, 716, 13638, 14085,

+ 19762, 17313, 21477, 11539, 5509, 2666, 17023, 12710, 19182, 1038,

+ 24112, 16888, 30729, 18893, 28683, 1121, 25888, 4305, 28255, 5253,

+ 918, 30726, 25400, 24524, 10374, 26668, 7209, 9746, 23207, 14891,

+ 1865, 29344, 14195, 6054, 24956, 8539, 13192, 18898, 6644, 17468,

+ 14926, 27273, 3831, 32000, 28890, 11162, 2018, 7969, 8210, 10340,

+ 4206, 11780, 2578, 30115, 6450, 2932, 11983, 25481, 361, 27215,

+ 17402, 9745, 28150, 22911, 25640, 22416, 4517, 31532, 14639, 2444,

+ 19124, 15408, 9683, 22482, 14738, 8140, 12962, 12739, 13542, 29593,

+ 16924, 19951, 16083, 32705, 20503, 31717, 24442, 1902, 16482, 18504,

+ 2241, 11651, 169, 10022, 26451, 4491, 408, 6278, 17641, 14574,

+ 19267, 31552, 24519, 6251, 12486, 530, 23433, 20930, 26408, 32495,

+ 12063, 31153, 902, 30874, 13335, 31266, 9325, 15988, 15130, 25763,

+ 19079, 28307, 18874, 18710, 9338, 8723, 25963, 25770, 21005, 13233,

+ 4046, 15626, 25229, 21653, 22582, 31700, 4719, 25456, 9829, 7756,

+ 3126, 14791, 8854, 19794, 12439, 25487, 24257, 29073, 10715, 29945,

+ 9498, 22522, 20102, 29327, 4058, 31345, 5942, 32640, 20035, 16581,

+ 11213, 17976, 15070, 19942, 19410, 20276, 9992, 11602, 5653, 14869,

+ 32684, 29905, 29586, 3315, 12114, 11874, 10648, 3571, 24921, 7797,

+ 22315, 23324, 2688, 14938, 24998, 13414, 23212, 25338, 5285, 11284,

+ 31717, 14277, 31009, 12612, 17057, 5611, 10205, 10437, 13125, 6095,

+ 6913, 2088, 233, 10425, 17157, 10010, 26971, 202, 25297, 15089,

+ 4711, 7478, 30499, 12420, 19542, 2221, 11568, 22592, 23989, 2074,

+ 11406, 6264, 15448, 32656, 14417, 6653, 22430, 9089, 27509, 8943,

+ 22517, 18994, 5244, 5074, 30625, 29035, 29783, 15076, 22714, 19571,

+ 25738, 29102, 31860, 28220, 10380, 14554, 16292, 25562, 28268, 17988,

+ 127, 21305, 17082, 14676, 20900, 29200, 31653, 27018, 24157, 26897,

+ 24417, 858, 25633, 30563, 2508, 26427, 25950, 27217, 21840, 32507,

+ 31094, 15684, 19211, 32085, 24071, 30190, 24109, 15301, 11632, 4297,

+ 30370, 10907, 24209, 4544, 3826, 1871, 29138, 3371, 26981, 19732,

+ 28518, 15617, 8298, 5039, 6865, 30281, 5689, 20618, 32679, 4818,

+ 1976, 11780, 15255, 8996, 18075, 27916, 10665, 31926, 24272, 1262,

+ 21188, 30818, 11034, 30060, 18291, 29973, 7420, 32529, 18152, 29387,

+ 15320, 13762, 22338, 22971, 8024, 8598, 13067, 16846, 26893, 25064,

+ 12293, 20054, 342, 1706, 806, 29181, 7044, 5115, 1505, 12027,

+ 17723, 25596, 24743, 10125, 1307, 23264, 16046, 4770, 19616, 8515,

+ 28401, 26839, 16711, 22717, 5752, 23973, 8435, 32438, 22489, 30937,

+ 17806, 29052, 5119, 25669, 3059, 19346, 10282, 16822, 8716, 2380,

+ 19767, 7462, 55, 11416, 31778, 20274, 4591, 21279, 31689, 25550,

+ 20904, 29325, 31730, 22839, 23546, 12076, 24976, 19241, 15874, 184,

+ 10306, 24147, 774, 6511, 32029, 8, 17751, 17255, 30379, 20023,

+ 18044, 10276, 3635, 15261, 21132, 13930, 15931, 17465, 29404, 6736,

+ 27212, 17920, 13274, 31638, 29685, 20947, 569, 30264, 8466, 2222,

+ 25423, 323, 14159, 22818, 3259, 14312, 28903, 12549, 8010, 14543,

+ 11954, 30568, 2332, 4014, 2910, 25289, 21250, 23833, 13308, 32650,

+ 23851, 12444, 10687, 31394, 20224, 18695, 20737, 1171, 15948, 12041,

+ 29063, 24732, 20896, 24064, 3078, 29743, 25078, 28432, 10470, 27301,

+ 24468, 31346, 1093, 16689, 32307, 8975, 15167, 20242, 27745, 78,

+ 24173, 7693, 6692, 23082, 3499, 10011, 21216, 27527, 287, 18271,

+ 11898, 7878, 9079, 346, 7614, 30871, 8561, 24162, 5630, 9486,

+ 4769, 1104, 8188, 23290, 8047, 21370, 19979, 2418, 18527, 8417,

+ 23920, 944, 12949, 24747, 1806, 7971, 7576, 21715, 17219, 30655,

+ 26198, 5151, 1293, 20120, 15208, 32082, 12401, 13999, 26264, 27299,

+ 20509, 1035, 20384, 14703, 20044, 12556, 7221, 31275, 13546, 11773,

+ 4420, 23708, 14584, 20200, 6524, 11338, 5427, 19374, 5388, 28978,

+ 30704, 1622, 22190, 2235, 2123, 2982, 29156, 19179, 18048, 496,

+ 16001, 4059, 19353, 31279, 13676, 10600, 11338, 22355, 2721, 9516,

+ 793, 16344, 10360, 27309, 26049, 19869, 28714, 2515, 18905, 28660,

+ 25489, 19872, 7345, 13301, 7215, 26395, 4733, 26393, 13170, 17549,

+ 28853, 18436, 54, 26864, 22459, 14753, 19852, 22437, 20415, 11380,

+ 28346, 26725, 7392, 12844, 21635, 6010, 7827, 28536, 1960, 9775,

+ 15945, 24604, 11438, 8069, 12620, 8516, 29922, 5415, 4586, 13848,

+ 8347, 10400, 5078, 31376, 30399, 13516, 22475, 14474, 21896, 11148,

+ 8818, 4890, 16520, 31678, 31366, 15393, 4075, 4973, 29238, 10273,

+ 9469, 21060, 8139, 13391, 18412, 73, 2442, 29418, 4814, 7368,

+ 2268, 4556, 3557, 6540, 26796, 3903, 24866, 22101, 17169, 12561,

+ 16105, 28807, 25133, 29163, 27668, 15136, 10325, 22750, 2362, 29420,

+ 17265, 28479, 305, 764, 12198, 18613, 16593, 27988, 19763, 20880,

+ 7163, 11236, 3481, 22364, 986, 7610, 31743, 32694, 29289, 21621,

+ 9428, 8543, 12086, 22013, 8374, 13199, 20837, 9841, 18067, 18316,

+ 8951, 11873, 18702, 16506, 18765, 20798, 17188, 15733, 22247, 18446,

+ 30735, 27101, 10866, 5220, 19050, 10225, 16130, 8080, 11927, 18848,

+ 20892, 23059, 7262, 19355, 32759, 28502, 17366, 18095, 17539, 24987,

+ 2441, 2898, 29611, 8755, 3539, 7036, 7767, 31217, 17291, 30392,

+ 32182, 21984, 23013, 27770, 19514, 19505, 32151, 26803, 12260, 28023,

+ 13627, 28323, 6593, 13847, 23797, 13806, 16053, 13305, 1365, 7667,

+ 3447, 13444, 14719, 27481, 17885, 3786, 28809, 1002, 5466, 24063,

+ 11812, 7333, 23749, 16432, 5759, 3598, 859, 27953, 31080, 17097,

+ 31496, 14808, 6325, 29799, 23010, 23400, 11746, 10880, 11510, 32592,

+ 29435, 12290, 26696, 2838, 12988, 29384, 6165, 6286, 9208, 367,

+ 14171, 591, 5175, 7013, 20380, 5223, 9635, 1858, 17886, 13646,

+ 9253, 9052, 30966, 6937, 13771, 25749, 5382, 24816, 27245, 14200,

+ 16453, 4290, 28304, 30597, 1278, 30007, 25994, 28872, 7388, 18407,

+ 12007, 8113, 356, 4041, 6924, 8991, 26051, 17390, 21274, 5310,

+ 32202, 1647, 30741, 15251, 13879, 2980, 15686, 19669, 16950, 406,

+ 477, 12031, 8743, 2999, 11739, 29475, 1954, 9937, 22063, 30849,

+ 15032, 2365, 27679, 28248, 25724, 21333, 31722, 10236, 25283, 9259,

+ 16044, 30505, 2343, 26236, 897, 151, 29522, 27103, 13293, 16078,

+ 19577, 7234, 30588, 10044, 12326, 30615, 15013, 9605, 2107, 30667,

+ 7412, 24858, 3124, 11512, 2665, 269, 17836, 15835, 1051, 25124,

+ 15906, 28296, 23584, 29484, 14846, 32604, 26801, 11151, 9423, 30772,

+ 29322, 20521, 4823, 13276, 25232, 31320, 31689, 16331, 29366, 5458,

+ 4817, 25613, 26145, 17852, 24533, 26496, 3211, 28536, 32251, 25667,

+ 5349, 19902, 9067, 16492, 29504, 20846, 22102, 7929, 24045, 14756,

+ 29495, 23818, 9699, 6797, 26712, 28493, 28258, 18042, 19096, 13241,

+ 2006, 19763, 10093, 2943, 29182, 1422, 14373, 20797, 18765, 21824,

+ 23153, 32629, 9105, 10994, 29219, 6975, 8146, 24216, 6199, 14138,

+ 11645, 27646, 15120, 8904, 20162, 15267, 5125, 6523, 23098, 28107,

+ 5660, 1738, 32717, 23504, 14869, 12809, 5331, 17337, 19371, 26264,

+ 27513, 21005, 7190, 27738, 14694, 32234, 15828, 25704, 20895, 27473,

+ 11689, 24071, 13736, 18372, 3301, 14296, 16877, 21779, 20709, 8527,

+ 31072, 5747, 3036, 20582, 13410, 21456, 13012, 16275, 14055, 26468,

+ 1263, 2039, 29141, 2441, 30707, 11224, 29614, 3787, 19973, 25937,

+ 19567, 19522, 14517, 19784, 26808, 5663, 11579, 28321, 10284, 3204,

+ 19968, 6577, 13083, 10905, 3425, 3062, 21343, 19420, 28079, 16389,

+ 21635, 7096, 634, 31171, 12075, 9050, 5903, 25304, 943, 27072,

+ 7743, 19297, 10250, 23058, 20322, 25317, 19699, 25654, 5276, 32139,

+ 32329, 2975, 11871, 14730, 692, 22629, 12337, 6368, 24202, 24219,

+ 15024, 25415, 32239, 20445, 5843, 25701, 19009, 19240, 5746, 23107,

+ 11955, 24302, 24073, 10240, 20535, 29034, 31673, 8391, 31906, 818,

+ 28559, 32510, 5386, 11, 2313, 23488, 30579, 4608, 15830, 14990,

+ 11179, 10934, 24030, 32065, 22387, 14074, 18562, 21571, 15839, 12444,

+ 1829, 32511, 19968, 640, 28907, 28822, 1216, 29426, 15296, 11476,

+ 9740, 2106, 7837, 29026, 4409, 7024, 26886, 32573, 13472, 3474,

+ 13272, 6246, 25740, 21204, 3905, 1500, 6487, 18487, 21008, 14791,

+ 22735, 1885, 28207, 25078, 20190, 11420, 28269, 32395, 22891, 17233,

+ 385, 20725, 2939, 19575, 13900, 14111, 27548, 4984, 19807, 18151,

+ 29059, 17730, 17341, 15826, 1780, 32158, 31458, 6398, 4066, 16061,

+ 8708, 26968, 15832, 1812, 17560, 14350, 12951, 31083, 8728, 3912,

+ 13825, 19248, 13060, 31507, 821, 27920, 32551, 5789, 28924, 8649,

+ 10523, 31144, 31076, 30521, 21263, 6713, 25770, 21947, 16584, 30352,

+ 7005, 6580, 23270, 7005, 25537, 27497, 30569, 23089, 3698, 18708,

+ 2931, 17459, 22089, 30518, 10831, 15636, 30595, 19246, 30131, 14917,

+ 16928, 1035, 25410, 615, 11146, 9631, 31573, 259, 9079, 2516,

+ 29947, 635, 12304, 7236, 21311, 27712, 5459, 29699, 26537, 17734,

+ 2998, 16319, 24071, 8885, 18957, 14348, 13676, 19682, 26285, 3065,

+ 19066, 12413, 21458, 31719, 22237, 28684, 31550, 5787, 2584, 10647,

+ 15651, 19601, 8068, 17573, 22083, 19859, 5525, 23656, 29014, 25739,

+ 27232, 6709, 26540, 17814, 346, 5175, 29971, 601, 5731, 1123,

+ 25339, 6296, 25091, 27566, 28376, 20228, 21235, 30078, 28616, 21589,

+ 223, 12127, 32630, 21657, 15466, 26872, 10814, 30924, 24691, 20541,

+ 27282, 1192, 18582, 7654, 29596, 1726, 4342, 26143, 3876, 20166,

+ 826, 24961, 4789, 7732, 21718, 16961, 12283, 18188, 6796, 27047,

+ 9328, 11510, 5426, 4546, 3128, 23701, 15285, 16219, 23624, 11541,

+ 9822, 4135, 18382, 8195, 16212, 14656, 5325, 29538, 23651, 18902,

+ 9224, 6651, 9723, 1570, 12322, 3572, 28540, 28316, 2051, 12708,

+ 25776, 18286, 18558, 12966, 12441, 13352, 22832, 9004, 366, 15285,

+ 12459, 15766, 3552, 18574, 9172, 1604, 32673, 31021, 17545, 16296,

+ 26407, 21701, 4999, 25759, 7342, 14384, 2443, 7425, 12924, 3881,

+ 15288, 24694, 23656, 11707, 7993, 15244, 28829, 24057, 12327, 27399,

+ 26012, 30192, 32685, 16761, 29056, 2522, 28010, 2834, 11910, 3733,

+ 4118, 25528, 26828, 83, 4457, 13146, 31065, 24978, 312, 17538,

+ 21086, 9807, 25570, 10538, 8379, 24438, 32746, 25041, 9925, 15006,

+ 12005, 31438, 13383, 10739, 13719, 5091, 24519, 18547, 26457, 1557,

+ 25866, 20062, 6333, 7099, 19674, 10727, 9589, 3798, 16902, 4144,

+ 3441, 16800, 14251, 6773, 27976, 25960, 17586, 17288, 21977, 924,

+ 22682, 22909, 18226, 7464, 11639, 14246, 21169, 21502, 6971, 23746,

+ 10344, 21238, 12341, 12657, 5062, 26585, 13015, 4843, 11124, 952,

+ 28860, 30194, 14462, 5507, 32490, 13829, 6323, 29399, 20308, 25815,

+ 8270, 17174, 16291, 11775, 16086, 8381, 1333, 8945, 27458, 25842,

+ 6758, 813, 7009, 20829, 4367, 21686, 19065, 3129, 28237, 24774,

+ 21295, 8875, 29572, 26816, 8358, 1362, 30883, 10086, 31467, 13087,

+ 15273, 29260, 29329, 1639, 18792, 3980, 12184, 22582, 25480, 5052,

+ 10132, 28135, 2000, 23581, 32522, 25841, 31905, 30997, 6686, 4356,

+ 1731, 7392, 8299, 85, 11365, 25218, 30771, 6710, 10590, 256,

+ 31928, 3049, 30905, 16079, 29673, 30646, 6001, 14733, 1857, 6715,

+ 25721, 21999, 17389, 23044, 16895, 27643, 26157, 30043, 23538, 887,

+ 29692, 16993, 14274, 13473, 27379, 13662, 29031, 288, 1387, 8534,

+ 18852, 14651, 23266, 26333, 27021, 16713, 24480, 1323, 32583, 19304,

+ 1945, 16755, 6159, 22898, 4246, 22641, 23421, 6957, 14224, 28227,

+ 3082, 31938, 23900, 12409, 28881, 31089, 24206, 24175, 3218, 1666,

+ 8855, 11227, 17916, 10879, 9776, 12706, 25900, 5280, 1276, 24816,

+ 2673, 18567, 18024, 11399, 594, 12845, 29143, 23639, 6866, 13853,

+ 11772, 16207, 24050, 4576, 28550, 12148, 21880, 8376, 31491, 7216,

+ 15343, 22673, 15870, 3820, 16111, 4916, 17259, 24033, 13982, 30654,

+ 18246, 298, 30327, 6224, 11638, 15902, 6986, 6153, 24567, 7390,

+ 31364, 27953, 22584, 23594, 5809, 5047, 22466, 22393, 15679, 17374,

+ 5147, 4936, 12677, 307, 23018, 25522, 2308, 5570, 27483, 24897,

+ 7404, 19849, 7621, 8196, 13538, 1581, 31371, 23777, 20224, 26348,

+ 26432, 5421, 10525, 21715, 6414, 15482, 28495, 30513, 22360, 1200,

+ 13231, 24651, 20894, 27744, 4956, 11857, 3233, 1876, 11459, 14481,

+ 10952, 13675, 19229, 7403, 5059, 15268, 27448, 16773, 16238, 29560,

+ 32123, 7872, 10232, 1133, 2341, 25962, 10052, 23528, 5333, 21813,

+ 17295, 22338, 30799, 22375, 12116, 21535, 31613, 12756, 108, 6907,

+ 26292, 26121, 25210, 22534, 26681, 4299, 18566, 5682, 29444, 24000,

+ 25064, 28810, 31427, 25451, 22120, 28101, 12578, 31582, 3491, 14875,

+ 10314, 27306, 1457, 13143, 32423, 28315, 32004, 31534, 30703, 418,

+ 29587, 975, 10080, 27795, 18232, 19131, 3913, 30736, 28503, 13783,

+ 22987, 21061, 7105, 18111, 3809, 31959, 15064, 6238, 27550, 22294,

+ 10995, 23228, 16054, 6266, 6916, 16662, 28224, 20301, 24184, 5684,

+ 2746, 14245, 14430, 27383, 4942, 32405, 25036, 4914, 20307, 17828,

+ 20350, 25786, 24855, 31358, 31425, 27841, 30172, 22250, 12687, 3935,

+ 14112, 7420, 12796, 17778, 24866, 25484, 5329, 27816, 8865, 1767,

+ 19318, 24026, 10727, 4547, 13589, 15772, 774, 12921, 3836, 15122,

+ 11106, 4206, 17475, 12549, 32367, 5586, 24751, 23861, 24508, 398,

+ 10967, 8689, 17969, 21879, 10629, 1510, 3221, 29896, 6239, 26165,

+ 11090, 1743, 4039, 3784, 16253, 29158, 25599, 11493, 785, 677,

+ 32657, 20483, 6779, 4950, 15598, 27869, 23388, 18345, 853, 5830,

+ 28810, 12458, 10998, 25404, 32600, 27887, 27736, 11199, 12823, 6422,

+ 24312, 8676, 19420, 9327, 19251, 27045, 10628, 24053, 21349, 11771,

+ 21494, 19843, 14419, 25519, 1960, 11588, 15558, 11884, 21861, 5996,

+ 27769, 7194, 16461, 15397, 18997, 10855, 32029, 13260, 10555, 19110,

+ 14000, 16734, 13794, 22493, 31686, 6445, 29057, 13081, 14853, 32728,

+ 9615, 31237, 27197, 21881, 4617, 3003, 20976, 24864, 23316, 20442,

+ 32274, 28801, 31204, 29657, 23309, 8169, 13532, 4763, 3592, 24183,

+ 25335, 31299, 29545, 648, 32358, 1097, 26264, 627, 19067, 13262,

+ 14086, 9591, 4293, 3628, 28271, 16625, 14717, 25042, 19548, 21970,

+ 17184, 28495, 6891, 8785, 23902, 10412, 16594, 31709, 11059, 31487,

+ 13474, 1366, 28756, 22077, 13641, 5500, 11724, 26448, 27611, 25000,

+ 29159, 14441, 23186, 16570, 24399, 11160, 15635, 6738, 12149, 922,

+ 15858, 22083, 13362, 28402, 9593, 24644, 7343, 18747, 26021, 5097,

+ 386, 1724, 10098, 9426, 31769, 32317, 15704, 22307, 19804, 1305,

+ 7958, 7219, 22414, 4501, 21166, 26505, 28532, 22384, 26289, 20484,

+ 18618, 4795, 25020, 20825, 402, 29931, 19267, 16835, 4510, 26669,

+ 12685, 20469, 8208, 7417, 20736, 7508, 1296, 5610, 16543, 18531,

+ 31326, 9677, 18385, 31614, 16184, 5112, 16740, 21452, 13182, 23261,

+ 12241, 13423, 11796, 13534, 26306, 23037, 4744, 27491, 28113, 16948,

+ 27124, 7210, 147, 15337, 806, 26847, 20437, 13122, 24063, 17645,

+ 26661, 3621, 26137, 21907, 24981, 11504, 16556, 6202, 15547, 25451,

+ 12723, 17158, 4348, 32251, 23626, 5035, 28683, 10008, 25179, 130,

+ 8876, 16640, 10105, 32732, 8894, 1965, 15116, 22934, 30328, 3845,

+ 11695, 14061, 20723, 29010, 21974, 25748, 7144, 16881, 18356, 31492,

+ 20156, 6222, 1116, 24852, 14009, 18192, 9254, 23753, 5279, 5008,

+ 84, 9839, 13147, 400, 8181, 12776, 23574, 1834, 27658, 8773,

+ 19313, 15622, 28392, 7059, 3087, 24272, 8925, 26359, 23125, 12265,

+ 5142, 7422, 30061, 6237, 22976, 18990, 401, 3606, 10862, 16865,

+ 24454, 7759, 4027, 4947, 7526, 11083, 32048, 21753, 25763, 12870,

+ 20072, 14868, 2377, 11692, 28785, 9863, 7811, 26505, 14966, 13541,

+ 13409, 20544, 14747, 25295, 8920, 11649, 29737, 22397, 1547, 13685,

+ 26603, 30874, 20424, 27195, 18392, 16725, 4694, 18840, 15601, 4021,

+ 26734, 9450, 11885, 23596, 7815, 13662, 21780, 3952, 343, 16483,

+ 7657, 27270, 30102, 24671, 8203, 13599, 15621, 17824, 10717, 9768,

+ 3247, 917, 10597, 15005, 22638, 15934, 29682, 28318, 30642, 19425,

+ 12546, 3268, 1918, 7935, 27746, 1973, 11699, 3206, 5015, 4598,

+ 8593, 16968, 25213, 26625, 7547, 428, 814, 152, 7674, 29347,

+ 25893, 5976, 4613, 8926, 4004, 17809, 24704, 1343, 29522, 7509,

+ 26370, 1421, 32553, 31439, 21979, 1131, 31887, 32726, 3414, 20363,

+ 30403, 28098, 24635, 27167, 12667, 20863, 24472, 14736, 29388, 13792,

+ 5057, 27251, 9289, 20533, 18070, 8633, 3951, 23327, 17156, 20005,

+ 14657, 5027, 11727, 11780, 8495, 3198, 23438, 23832, 26428, 19384,

+ 18423, 32469, 7520, 26236, 4700, 22736, 18475, 3879, 9078, 29044,

+ 21164, 18847, 24674, 1782, 31121, 14822, 3817, 29324, 29071, 16623,

+ 20228, 19418, 19717, 23472, 19871, 24749, 25820, 30840, 5278, 21740,

+ 18609, 13955, 7198, 32460, 31286, 17356, 253, 21314, 30677, 19746,

+ 1180, 30398, 23191, 13438, 14819, 17942, 2885, 404, 902, 27584,

+ 21197, 16552, 18311, 21829, 18918, 17315, 31741, 7410, 27639, 31078,

+ 28947, 15313, 20789, 20318, 31827, 6104, 21516, 20824, 26917, 16991,

+ 9665, 31639, 21138, 31448, 5717, 29476, 19022, 18874, 5036, 6246,

+ 28918, 18366, 9199, 10226, 25494, 25934, 24366, 23972, 8814, 17978,

+ 11338, 19951, 21750, 1454, 17682, 26993, 3871, 30305, 17836, 24267,

+ 31708, 13070, 19255, 20143, 4321, 4904, 26030, 1595, 12202, 22474,

+ 24847, 13189, 22464, 9453, 10685, 18551, 20024, 6877, 20515, 32733,

+ 24188, 9198, 28571, 14524, 6222, 19050, 31886, 7141, 12041, 10959,

+ 15836, 16331, 24106, 22071, 30078, 16018, 30480, 14616, 31850, 29288,

+ 31744, 23085, 21942, 19480, 27756, 1460, 32001, 30684, 9845, 14554,

+ 29711, 17523, 430, 24948, 21427, 116, 1827, 17903, 25586, 16866,

+ 27290, 10634, 32613, 19456, 10520, 194, 17887, 1895, 28839, 18958,

+ 25168, 16469, 13655, 24269, 26601, 8008, 6019, 20605, 2689, 4044,

+ 32597, 9773, 13880, 2449, 4492, 3637, 19034, 28608, 24957, 22564,

+ 31622, 31375, 1112, 19194, 8463, 24340, 27053, 11160, 29090, 10582,

+ 7471, 1908, 29481, 31914, 21943, 6033, 8688, 11837, 30092, 20399,

+ 4870, 28141, 24545, 28095, 5607, 29021, 18335, 7577, 6487, 21832,

+ 23397, 1265, 22417, 10517, 29389, 19335, 3489, 22700, 8434, 29599,

+ 16911, 26761, 20527, 5809, 24253, 14350, 19241, 23137, 8722, 15902,

+ 22287, 12721, 11096, 29671, 17184, 15990, 9827, 25087, 4462, 26377,

+ 23156, 947, 7394, 29758, 8285, 29852, 24705, 19354, 997, 7283,

+ 17389, 6592, 5229, 19749, 4399, 301, 10452, 1834, 30643, 8485,

+ 6809, 22547, 16532, 2285, 15423, 1891, 6171, 27451, 3830, 1440,

+ 4226, 9707, 31607, 20906, 16893, 29171, 4656, 18507, 11259, 20377,

+ 5793, 4622, 15272, 740, 23046, 9045, 7095, 13392, 10550, 678,

+ 12640, 2501, 20939, 18758, 27300, 19402, 643, 4617, 16856, 27383,

+ 2790, 19048, 6753, 31144, 15913, 6612, 23229, 28153, 32083, 21322,

+ 26563, 16366, 11422, 9512, 25899, 14321, 6176, 31551, 24400, 386,

+ 2986, 18217, 16949, 22058, 8689, 8924, 16838, 21680, 3819, 384,

+ 5985, 22672, 27004, 25214, 14485, 26025, 14418, 15066, 27434, 31798,

+ 17934, 2242, 23137, 26879, 164, 17767, 4476, 26065, 26628, 10507,

+ 32641, 7723, 20474, 30043, 26684, 27706, 31058, 14848, 26243, 25095,

+ 17985, 18289, 25534, 29424, 3584, 17419, 10406, 20821, 21434, 5987,

+ 27468, 21651, 25768, 8155, 32349, 31542, 8571, 26227, 1445, 23914,

+ 30458, 17634, 21459, 9139, 18924, 12774, 21884, 21982, 23096, 10200,

+ 11618, 5688, 24907, 22915, 26101, 7421, 28602, 10550, 23578, 2067,

+ 20008, 5656, 18220, 21240, 25963, 5052, 576, 2810, 29162, 32757,

+ 31406, 5030, 1609, 10988, 26573, 3970, 8521, 9583, 12285, 16639,

+ 23273, 18828, 7915, 30633, 27858, 12639, 20752, 23969, 6641, 4136,

+ 30843, 14669, 14694, 8608, 24273, 30542, 26781, 9102, 18578, 4274,

+ 10426, 3477, 7581, 8555, 27451, 31568, 31479, 17152, 20952, 31905,

+ 4552, 32643, 9646, 16453, 30630, 28867, 18845, 19628, 19478, 24514,

+ 11247, 15112, 22352, 30826, 31546, 10405, 1603, 25979, 8839, 21112,

+ 26585, 26824, 20659, 3834, 3964, 17315, 3862, 6711, 217, 918,

+ 11107, 26657, 2276, 1876, 30927, 28971, 10268, 20462, 11382, 11539,

+ 29200, 29258, 22778, 12287, 1570, 15570, 19821, 7628, 1419, 25961,

+ 23409, 26531, 10911, 21411, 18589, 1997, 25938, 23349, 28451, 12232,

+ 8444, 31402, 20912, 7322, 5977, 29272, 9876, 1381, 21716, 18323,

+ 7715, 22588, 20997, 2080, 26715, 14645, 18040, 25068, 15815, 30655,

+ 6320, 25342, 28578, 28214, 3947, 30123, 17216, 32693, 10280, 27913,

+ 7338, 10284, 14055, 13734, 15497, 21170, 13104, 32377, 5445, 27164,

+ 22102, 28184, 31597, 22478, 28413, 14380, 13658, 25809, 3546, 10018,

+ 11791, 12582, 28602, 28196, 20324, 13658, 18630, 22344, 18276, 603,

+ 21765, 8711, 15603, 13194, 21026, 9712, 14260, 18193, 18032, 3485,

+ 16169, 20599, 14635, 15847, 29980, 14706, 16385, 15702, 12094, 1276,

+ 1488, 12251, 21519, 18600, 11954, 15042, 32509, 20535, 15671, 25826,

+ 12240, 8038, 23793, 18199, 2373, 17931, 13878, 8434, 25337, 14944,

+ 12065, 9646, 12937, 11679, 15834, 5478, 4088, 3791, 12311, 30342,

+ 22865, 12253, 3043, 896, 14733, 16622, 28063, 8384, 5814, 5620,

+ 1862, 28385, 11085, 27263, 9461, 19745, 20202, 6103, 23210, 24594,

+ 12834, 28999, 16203, 28819, 4525, 15035, 22763, 14079, 9416, 28046,

+ 7754, 26276, 19161, 16285, 12698, 3447, 15442, 8352, 14473, 7173,

+ 17111, 8634, 30075, 10669, 15523, 31566, 1559, 18701, 28456, 9493,

+ 27398, 186, 27893, 13421, 15607, 15412, 4829, 29940, 13031, 18713,

+ 24662, 28502, 23967, 13464, 12063, 21091, 15486, 7465, 3622, 29285,

+ 3960, 19579, 17320, 21168, 2655, 11694, 15002, 28026, 19809, 29635,

+ 24392, 11757, 18131, 1105, 12092, 20603, 25133, 31353, 97, 7538,

+ 10325, 22043, 17256, 12752, 13600, 11082, 17771, 19032, 9750, 26110,

+ 13520, 17637, 26229, 30217, 28017, 19455, 31865, 30541, 20473, 24748,

+ 15323, 10795, 10385, 13960, 407, 20543, 26813, 5656, 23795, 16714,

+ 14464, 14684, 18877, 19567, 8903, 22179, 24532, 14755, 24837, 19875,

+ 7146, 32607, 2586, 10953, 9607, 151, 10361, 29902, 13905, 26352,

+ 31626, 30859, 1676, 27950, 26701, 1806, 25309, 11755, 23873, 23021,

+ 20307, 19087, 11652, 4570, 23463, 32380, 10043, 888, 3267, 29321,

+ 26932, 18030, 32642, 25778, 15306, 15033, 10423, 30734, 28937, 30790,

+ 22128, 16641, 4115, 23744, 22140, 25010, 20418, 11175, 26154, 19135,

+ 9359, 29858, 20308, 29744, 26035, 13334, 22172, 8874, 19852, 25079,

+ 24310, 3301, 22849, 25310, 26215, 30048, 19369, 3932, 16396, 3156,

+ 22377, 17807, 12125, 11750, 13405, 14578, 18611, 20640, 9274, 29817,

+ 15112, 14370, 10865, 17118, 26366, 16405, 31574, 28981, 26403, 21345,

+ 26241, 8135, 28020, 25504, 16500, 5405, 6688, 29906, 3967, 18267,

+ 12174, 4434, 32737, 4048, 18336, 14857, 25392, 15562, 28218, 9953,

+ 16123, 30127, 17662, 27516, 11949, 9545, 5210, 21543, 7348, 24162,

+ 28101, 3849, 5859, 28305, 17221, 30112, 16917, 4947, 6197, 2671,

+ 12564, 1373, 12101, 32496, 8889, 20017, 22978, 21968, 27476, 7152,

+ 19480, 30043, 3405, 1903, 7061, 15926, 17676, 140, 18799, 31308,

+ 3095, 21699, 32521, 14346, 22394, 1020, 24434, 26063, 5484, 22439,

+ 4654, 16798, 11823, 28683, 27450, 28951, 3128, 15323, 21578, 21925,

+ 28560, 3595, 23381, 28920, 4218, 17889, 2643, 28086, 21846, 15695,

+ 27718, 8301, 8133, 29056, 25463, 5325, 29966, 6577, 13570, 31508,

+ 1473, 8258, 28052, 2505, 22682, 12813, 884, 10157, 7335, 22518,

+ 22976, 29167, 26285, 20163, 2298, 29343, 24009, 4399, 4291, 7013,

+ 6995, 18489, 22245, 22643, 16903, 5570, 6039, 20408, 4199, 27991,

+ 11005, 8278, 29275, 28492, 17391, 13911, 22043, 31242, 3067, 1691,

+ 18510, 26025, 16557, 18197, 7028, 7618, 13837, 30520, 7809, 3454,

+ 25194, 19627, 9930, 4595, 22358, 22596, 28965, 26289, 19442, 30516,

+ 7756, 16535, 7276, 25727, 20099, 2796, 25285, 32432, 8315, 31403,

+ 3288, 5578, 6005, 27677, 5016, 21889, 11434, 16045, 14233, 8106,

+ 4075, 8953, 26322, 27377, 23429, 3877, 12193, 31178, 16231, 19828,

+ 25871, 32170, 26503, 22809, 22614, 31350, 8577, 32074, 19360, 32316,

+ 1409, 27287, 530, 289, 9828, 13946, 4361, 410, 3354, 31023,

+ 22179, 12511, 847, 32197, 14722, 17309, 29002, 14454, 5580, 15083,

+ 21269, 30516, 31606, 14720, 2270, 132, 8643, 14627, 1693, 5263,

+ 13319, 13410, 9975, 1142, 23473, 6279, 9570, 21479, 11144, 5064,

+ 907, 6382, 20533, 5054, 24053, 3597, 10754, 2073, 29666, 2702,

+ 13281, 15761, 26230, 21784, 23472, 25888, 29466, 1153, 12219, 7022,

+ 11551, 25315, 1411, 1165, 31395, 1778, 32190, 20454, 22713, 6028,

+ 2462, 14451, 10948, 28050, 21846, 21807, 6436, 2039, 15323, 19915,

+ 17173, 1558, 10215, 18339, 18387, 7241, 1604, 7920, 27395, 14007,

+ 11591, 16447, 22606, 15981, 23963, 13858, 19023, 13489, 16447, 16165,

+ 6319, 6290, 1490, 3, 29070, 19140, 2831, 9754, 16933, 25515,

+ 9876, 3613, 4778, 12214, 999, 17161, 22900, 17902, 12218, 26970,

+ 2400, 27855, 14702, 27262, 24435, 16726, 3543, 29834, 13249, 21595,

+ 28479, 8748, 20877, 12833, 11949, 24288, 6833, 2092, 2663, 23399,

+ 31297, 23890, 21941, 9846, 27243, 4117, 19944, 15787, 4513, 3888,

+ 16539, 10948, 15099, 112, 26425, 275, 11734, 18885, 7103, 20269,

+ 10434, 12441, 19139, 22755, 923, 864, 18102, 11635, 15605, 369,

+ 24678, 28159, 30397, 29972, 26822, 22589, 9758, 13276, 32754, 26993,

+ 31394, 31031, 21870, 11672, 16538, 20291, 15790, 3814, 17087, 31203,

+ 16604, 14707, 28441, 6163, 1749, 26418, 17184, 28536, 17525, 10274,

+ 17186, 5691, 3604, 31432, 228, 28440, 13136, 18652, 30092, 11186,

+ 2061, 7235, 12990, 18730, 16059, 8253, 12038, 15087, 14296, 17120,

+ 12662, 14296, 27317, 2757, 8336, 23920, 19324, 29953, 14438, 7569,

+ 21106, 28502, 27647, 10804, 2170, 17067, 30205, 21383, 15579, 442,

+ 23677, 3136, 18498, 20489, 27711, 2097, 267, 5403, 28423, 10525,

+ 17596, 28647, 8514, 11723, 15058, 32393, 10989, 22360, 13505, 20024,

+ 8115, 30929, 20278, 1912, 19029, 9474, 14495, 10896, 18255, 28296,

+ 16621, 28735, 12985, 28206, 5784, 8875, 28011, 886, 21732, 666,

+ 15716, 885, 18276, 3300, 19821, 18916, 1724, 13353, 20473, 24693,

+ 21162, 25279, 18768, 12387, 19784, 22766, 17644, 29261, 31627, 15200,

+ 31267, 20548, 12048, 26067, 9223, 28195, 15640, 22033, 4235, 19486,

+ 9937, 17186, 10983, 14238, 5847, 13504, 1341, 15949, 22522, 12043,

+ 9596, 22380, 10562, 18046, 6533, 14189, 4912, 12322, 5772, 446,

+ 8775, 8705, 10177, 19683, 10955, 6110, 12336, 11463, 31177, 20515,

+ 17382, 14164, 5975, 5403, 7254, 14145, 32285, 9825, 11259, 299,

+ 27668, 22169, 5438, 7912, 12430, 12637, 2201, 17688, 7031, 15738,

+ 19965, 18172, 29146, 12125, 32113, 31884, 2982, 8136, 11005, 20163,

+ 32435, 6858, 2502, 24126, 31488, 6893, 19066, 30725, 15423, 17585,

+ 14574, 19625, 13459, 30265, 23814, 7567, 21656, 32581, 8918, 21643,

+ 5284, 5472, 19974, 14768, 9036, 22619, 15483, 15207, 23850, 31481,

+ 15411, 31935, 29150, 25580, 30833, 7684, 23123, 23296, 16923, 29587,

+ 1092, 5783, 14176, 7916, 22270, 15701, 3741, 15881, 30055, 12316,

+ 2178, 9455, 24895, 12347, 19825, 21890, 25510, 13794, 14886, 10653,

+ 24286, 2778, 24477, 25442, 27987, 32114, 14896, 6095, 29144, 16317,

+ 25601, 10130, 32052, 18170, 18071, 14879, 11485, 16212, 4044, 28415,

+ 26371, 26572, 28134, 14699, 6096, 27251, 22276, 6681, 21487, 1244,

+ 24508, 11094, 1099, 5329, 25858, 13141, 32537, 23877, 3403, 12487,

+ 12824, 6026, 25843, 5547, 16919, 9412, 6620, 9320, 17337, 29598,

+ 6745, 8985, 29045, 28219, 6986, 22824, 736, 1136, 18824, 2846,

+ 2351, 9776, 10883, 26809, 29943, 16967, 28713, 8512, 10552, 7499,

+ 17418, 4627, 16282, 5328, 19898, 17286, 25078, 8924, 30839, 10223,

+ 23832, 13723, 15372, 20734, 20676, 12115, 27893, 3917, 8438, 8857,

+ 22468, 12344, 3182, 7878, 11204, 19951, 3180, 8357, 30939, 26057,

+ 25017, 31598, 17589, 10460, 29414, 19960, 31518, 15050, 24536, 22570,

+ 15792, 21213, 28293, 17587, 22191, 29527, 13560, 15098, 21297, 11011,

+ 9371, 19800, 2178, 5392, 23221, 6022, 2246, 2847, 23090, 8529,

+ 19168, 15771, 4771, 22933, 2451, 9801, 22661, 15720, 7655, 2336,

+ 12998, 32662, 22735, 30554, 8581, 17486, 8200, 2251, 16922, 17690,

+ 21060, 16242, 29782, 28948, 13960, 18766, 25867, 23896, 31443, 5234,

+ 8655, 6581, 1536, 26972, 6654, 15784, 8429, 32643, 12542, 16778,

+ 15069, 16431, 17863, 30728, 19739, 11149, 21410, 15316, 8673, 5123,

+ 4144, 9626, 631, 9153, 10927, 24118, 4255, 24729, 4217, 24868,

+ 20273, 8720, 23245, 17207, 7683, 11701, 18898, 20878, 11531, 28081,

+ 28889, 7365, 10952, 30112, 30691, 17512, 12765, 18847, 5731, 5805,

+ 14848, 7078, 11077, 22626, 4114, 29465, 5678, 18724, 6543, 29337,

+ 13830, 14290, 26409, 12320, 12468, 15169, 23216, 21325, 26664, 25393,

+ 25653, 28156, 16543, 30080, 6767, 17178, 7202, 2974, 12894, 28600,

+ 12112, 9281, 6701, 10845, 4958, 32090, 15197, 3233, 14684, 19015,

+ 10272, 6903, 8890, 6730, 14339, 32459, 778, 826, 22480, 9933,

+ 12039, 25720, 4275, 16780, 31959, 22053, 2715, 17990, 31117, 6290,

+ 3555, 32766, 6130, 6136, 18482, 20176, 15493, 22634, 22688, 4994,

+ 19136, 24071, 26394, 31067, 6045, 25972, 19207, 4664, 25945, 138,

+ 1323, 30940, 19576, 27467, 4300, 28040, 13833, 11547, 20500, 8395,

+ 19243, 23085, 6071, 8348, 32208, 2363, 7638, 7078, 3777, 20858,

+ 20514, 28387, 13539, 25805, 21828, 12652, 18872, 6712, 15741, 12944,

+ 7976, 31896, 9865, 7715, 25218, 12690, 22218, 15128, 12478, 19658,

+ 5026, 30803, 16389, 25429, 14113, 15288, 17011, 29552, 18656, 10120,

+ 26139, 29810, 7724, 18925, 5707, 8959, 17767, 27347, 25106, 23935,

+ 16556, 27642, 11264, 9422, 21426, 28489, 1837, 5429, 26867, 14182,

+ 25980, 27546, 21005, 30339, 31521, 27379, 26472, 32635, 31585, 13825,

+ 19225, 3357, 4761, 28986, 21254, 5063, 16770, 16647, 24139, 20792,

+ 32179, 30767, 6621, 3743, 15208, 2707, 30829, 18679, 17537, 6173,

+ 24976, 13207, 206, 9203, 23580, 18693, 5001, 19440, 14293, 24076,

+ 29220, 5204, 31305, 27406, 22598, 7098, 4856, 32667, 15632, 19275,

+ 6840, 5185, 11684, 22322, 8792, 11942, 12520, 9039, 21636, 3029,

+ 6279, 24624, 28392, 17622, 25401, 29757, 22169, 8577, 5189, 1330,

+ 19376, 3475, 9284, 13779, 56, 25602, 28455, 27611, 5706, 1166,

+ 17275, 12853, 18806, 26521, 30444, 2926, 18277, 9272, 9224, 18539,

+ 31677, 7306, 30022, 14167, 21317, 17481, 8519, 16096, 14922, 13726,

+ 31835, 14755, 23105, 2106, 17223, 9700, 23213, 7842, 838, 32131,

+ 10563, 24010, 17229, 18987, 3404, 742, 21139, 18893, 2636, 2941,

+ 24657, 14157, 21985, 25535, 16582, 2939, 25837, 20248, 895, 19012,

+ 21495, 16133, 16085, 12330, 11983, 3111, 13495, 21489, 23409, 17814,

+ 13482, 4251, 11308, 2679, 24333, 19351, 23812, 8657, 11682, 27446,

+ 84, 17564, 25930, 4446, 7864, 19995, 21776, 28290, 3625, 18028,

+ 1641, 16593, 17514, 31582, 17082, 21422, 10404, 7042, 4635, 4961,

+ 10317, 1925, 5979, 2316, 4941, 19900, 27972, 21216, 868, 1025,

+ 26912, 27792, 21190, 29630, 26236, 23558, 26121, 19527, 43, 5718,

+ 19777, 20333, 23182, 12528, 106, 11344, 25363, 13081, 15110, 31860,

+ 10492, 7068, 15110, 5911, 13154, 28348, 26350, 11970, 30841, 24686,

+ 7989, 27935, 23061, 28357, 16106, 266, 19309, 174, 3998, 21226,

+ 1055, 23773, 13437, 21314, 25717, 3335, 20670, 6019, 28391, 338,

+ 27966, 14629, 31457, 2058, 24935, 10997, 1222, 28053, 17239, 30897,

+ 16180, 22697, 9022, 9426, 18826, 14012, 5640, 6313, 12199, 19644,

+ 21309, 23213, 5877, 16385, 27173, 32532, 15527, 11136, 21039, 1696,

+ 10558, 5441, 23187, 8124, 15698, 22547, 15671, 32199, 31631, 21886,

+ 22736, 15024, 13310, 1017, 22089, 30403, 29829, 11613, 15720, 10946,

+ 25266, 29082, 15535, 24632, 25268, 25000, 10368, 17418, 12202, 18113,

+ 30085, 18255, 18721, 27086, 12879, 16993, 22999, 28447, 17469, 20020,

+ 31685, 6750, 27552, 18407, 32093, 3782, 21276, 12953, 3089, 24464,

+ 11858, 27518, 26644, 1198, 11195, 25650, 1380, 1980, 15831, 22349,

+ 15880, 32052, 32648, 11063, 31126, 7649, 14264, 30526, 28153, 5270,

+ 16450, 24293, 23921, 21535, 21520, 14207, 30171, 2424, 2177, 11261,

+ 13619, 32317, 30221, 21253, 30551, 32610, 21547, 27460, 4366, 7204,

+ 3186, 12804, 7240, 20799, 2303, 2049, 22952, 29794, 16920, 22648,

+ 19263, 29664, 20238, 30338, 27803, 16040, 32360, 25760, 11264, 26743,

+ 14653, 14999, 2293, 24140, 13794, 7550, 31746, 16157, 15814, 32277,

+ 3001, 11464, 2713, 4440, 13043, 10572, 32436, 14164, 31836, 21561,

+ 15541, 17466, 30514, 7269, 25193, 24498, 26953, 14817, 27376, 28273,

+ 25171, 1067, 31771, 14862, 5214, 30885, 8985, 19217, 5534, 1350,

+ 17491, 10574, 28525, 27536, 17044, 30321, 7824, 20418, 8557, 5849,

+ 26812, 18510, 9944, 23722, 11096, 397, 16411, 26909, 1925, 18866,

+ 11759, 14363, 3932, 6397, 15330, 2571, 22646, 27185, 1786, 8168,

+ 6066, 30535, 6043, 32150, 10802, 11876, 21162, 9846, 12199, 29449,

+ 1523, 2104, 6607, 32649, 5064, 2032, 21820, 31425, 491, 25964,

+ 28502, 5635, 28591, 26821, 23971, 18259, 14169, 3637, 19014, 29654,

+ 16076, 9256, 2502, 7815, 15206, 3990, 7697, 28460, 27941, 10895,

+ 27329, 9609, 5390, 28952, 32413, 19667, 10959, 28725, 5731, 17255,

+ 5539, 11079, 15557, 27324, 27766, 27544, 11185, 5014, 330, 11829,

+ 21205, 31357, 15321, 9212, 10083, 26734, 1915, 30709, 8465, 19408,

+ 22603, 20454, 2149, 23977, 2949, 15137, 31279, 10002, 10035, 929,

+ 17495, 31465, 15625, 5461, 32728, 14277, 29837, 28604, 3085, 26159,

+ 123, 21938, 20268, 1807, 871, 12170, 24592, 9828, 10148, 21340,

+ 32059, 1592, 28261, 10144, 29979, 30164, 31266, 21500, 25484, 10544,

+ 22589, 29787, 26783, 9389, 3558, 575, 15513, 4358, 27708, 26712,

+ 17727, 2948, 28596, 29781, 4177, 18034, 11967, 6906, 22357, 3537,

+ 7079, 17011, 28821, 1101, 7610, 1768, 20843, 11375, 17835, 11601,

+ 1468, 4627, 8501, 14476, 16579, 10269, 29185, 21676, 27408, 11880,

+ 19402, 3221, 20944, 13311, 23999, 32198, 23374, 2448, 27433, 32373,

+ 25786, 14365, 14157, 27105, 11562, 20469, 26772, 1764, 29150, 9187,

+ 9961, 15559, 8136, 17573, 31075, 2651, 15947, 20639, 10020, 29509,

+ 30532, 27601, 8065, 22426, 24647, 29703, 11619, 27052, 26923, 17743,

+ 31212, 13859, 5064, 8880, 8798, 29263, 22783, 5913, 25913, 1212,

+ 24315, 25240, 10916, 31751, 25783, 18380, 27662, 26609, 1728, 19869,

+ 16149, 18610, 16701, 18730, 1959, 2192, 21292, 17411, 5479, 13231,

+ 26350, 4761, 12370, 25131, 9222, 12019, 22690, 2148, 3614, 11170,

+ 15858, 8601, 21834, 21238, 12708, 26809, 31633, 18034, 6272, 4981,

+ 29610, 12926, 8093, 17306, 7427, 27228, 14469, 8862, 16648, 93,

+ 8340, 23416, 30113, 11861, 30625, 26293, 2300, 8780, 10721, 23753,

+ 23182, 886, 12551, 17059, 17748, 17254, 28848, 1156, 32607, 3966,

+ 12799, 4880, 4751, 30378, 644, 22182, 21151, 5966, 31331, 27885,

+ 29793, 27004, 11698, 25775, 10827, 31083, 19746, 27627, 27187, 9764,

+ 14818, 9253, 16471, 14463, 4288, 4353, 21408, 26190, 28818, 21776,

+ 32552, 5592, 32724, 12522, 9465, 30089, 30098, 30845, 7704, 15335,

+ 10633, 29348, 27586, 9160, 28553, 22268, 3573, 30914, 16925, 24051,

+ 9010, 18404, 110, 5921, 13698, 2211, 17253, 31196, 22711, 21015,

+ 3600, 25606, 32244, 28776, 23879, 31530, 8303, 28291, 23183, 9159,

+ 12150, 26641, 13886, 748, 22960, 14249, 27872, 15877, 7590, 21828,

+ 31706, 27893, 17281, 30962, 18765, 29285, 9237, 21964, 17213, 11867,

+ 24863, 298, 31219, 16142, 29387, 23062, 14751, 17401, 11898, 1280,

+ 26434, 22318, 10945, 20403, 9419, 12525, 9397, 4487, 128, 10613,

+ 19046, 23512, 13216, 3354, 3753, 3768, 13383, 30360, 27163, 9697,

+ 7825, 9127, 11618, 20973, 14594, 30671, 18614, 12746, 6182, 8574,

+ 11425, 16488, 9588, 5464, 10242, 19124, 3448, 21454, 26456, 458,

+ 22834, 11506, 31037, 32102, 14009, 30345, 31793, 17052, 13603, 26722,

+ 22937, 8906, 30633, 4839, 12807, 1738, 9223, 9202, 24252, 31340,

+ 4130, 28130, 11372, 3107, 29421, 25837, 13121, 21758, 7309, 1720,

+ 28706, 15578, 31164, 24612, 820, 20183, 26219, 9579, 14241, 12808,

+ 5035, 4205, 14489, 6767, 1229, 31044, 6039, 17960, 26568, 23838,

+ 2022, 23268, 19676, 18252, 29539, 14233, 373, 20630, 19588, 3704,

+ 4690, 10450, 16793, 23328, 14566, 24245, 13650, 2321, 14335, 23016,

+ 8322, 24163, 27557, 15198, 16674, 32440, 4165, 6118, 15001, 6767,

+ 1295, 16636, 2875, 7706, 3484, 4069, 31503, 30258, 22228, 26363,

+ 26581, 15114, 17167, 23877, 4679, 22786, 16762, 18506, 20640, 2301,

+ 13501, 6183, 19035, 11541, 11482, 14816, 8509, 25997, 30808, 29684,

+ 11157, 29190, 20642, 28980, 9155, 13046, 9642, 28116, 28919, 24407,

+ 19665, 15043, 27963, 17052, 5899, 2872, 19636, 5865, 4670, 16526,

+ 2596, 20355, 31212, 10321, 31924, 26502, 6930, 24729, 31473, 2262,

+ 12112, 22166, 12052, 8023, 29513, 4973, 134, 11361, 31821, 19266,

+ 13987, 28270, 4406, 25238, 14527, 12566, 2703, 24020, 3942, 22846,

+ 32252, 28454, 2792, 396, 14549, 5773, 13077, 15134, 19989, 2097,

+ 25670, 18043, 15219, 19702, 15773, 22729, 27086, 20815, 17549, 16705,

+ 3278, 22103, 24988, 737, 9673, 31006, 6759, 13920, 11747, 17472,

+ 11495, 18535, 11130, 32701, 28660, 26622, 14017, 13060, 7431, 14661,

+ 12714, 3409, 26436, 8292, 14090, 10297, 952, 14532, 1272, 22660,

+ 1759, 19584, 26229, 314, 15209, 24598, 24659, 7424, 22077, 9827,

+ 9551, 29093, 11199, 28878, 5505, 8697, 19022, 28611, 19702, 4574,

+ 7697, 22371, 1435, 20641, 500, 15481, 20572, 32138, 25069, 15792,

+ 27022, 23217, 21124, 19716, 11402, 532, 16786, 11639, 27291, 28903,

+ 9289, 30981, 10523, 23851, 18036, 17113, 2776, 2434, 7936, 10689,

+ 26813, 2882, 19900, 28384, 23982, 14024, 9821, 25763, 18867, 9743,

+ 27845, 18934, 4185, 3457, 9861, 26039, 5717, 21260, 9632, 30314,

+ 17003, 7033, 12434, 18991, 1422, 16889, 27536, 4850, 11849, 28161,

+ 26386, 19170, 2909, 15192, 30607, 15652, 8620, 10351, 14983, 1736,

+ 31061, 16112, 27847, 9212, 17953, 10905, 30185, 23935, 28446, 12875,

+ 19738, 10841, 14729, 18270, 6944, 22986, 6897, 7992, 15771, 6528,

+ 30362, 2846, 3978, 11276, 18976, 585, 6930, 25495, 3420, 4669,

+ 6267, 13521, 18827, 10582, 24188, 30251, 11181, 28580, 10168, 8006,

+ 5676, 8697, 20872, 7339, 30142, 9023, 30715, 3004, 23948, 14351,

+ 4891, 29419, 11924, 8320, 31090, 18985, 20044, 1085, 27597, 26529,

+ 12424, 25819, 3648, 9383, 14493, 2665, 29290, 20203, 13767, 7752,

+ 5882, 14835, 32456, 26685, 114, 1224, 28882, 25028, 20268, 26607,

+ 21927, 5031, 30362, 8090, 29951, 29136, 31185, 17952, 21802, 10587,

+ 20809, 12971, 28406, 5360, 24030, 12336, 22739, 19280, 3355, 8357,

+ 11573, 31789, 4792, 24686, 12346, 3903, 23393, 32280, 30861, 14740,

+ 7354, 6729, 8074, 32040, 9887, 1015, 15523, 18101, 22960, 25817,

+ 12290, 7628, 26381, 4635, 111, 6949, 15710, 21846, 20597, 6452,

+ 18199, 16831, 11968, 21244, 24058, 27039, 17866, 25896, 6109, 2051,

+ 11959, 25944, 20653, 29364, 27517, 953, 5555, 26729, 19527, 27352,

+ 22038, 3900, 17436, 20920, 31905, 14171, 28859, 29730, 22215, 13824,

+ 22986, 25916, 27876, 27811, 11056, 28765, 12230, 20590, 28352, 31776,

+ 8044, 1521, 2327, 9143, 20237, 25879, 32199, 31362, 27229, 31064,

+ 16053, 11744, 8203, 21041, 2751, 31046, 5518, 14289, 8098, 8334,

+ 18465, 6166, 17179, 25745, 32524, 16311, 26445, 9719, 13094, 13251,

+ 28259, 10830, 3992, 16202, 20854, 14170, 28643, 2393, 11953, 30892,

+ 32549, 18220, 691, 25462, 23704, 24224, 4404, 3230, 26971, 3303,

+ 16620, 9489, 9077, 25983, 28336, 4186, 12823, 15717, 31711, 18803,

+ 1825, 22150, 7164, 2523, 14824, 24438, 9628, 26344, 32566, 7012,

+ 27267, 22879, 25235, 17998, 23306, 25410, 9411, 2417, 30916, 18409,

+ 25488, 5124, 23648, 2644, 28362, 11301, 21201, 9664, 28299, 19476,

+ 21933, 13432, 16063, 8095, 25299, 30958, 9188, 30173, 30545, 32010,

+ 15631, 31519, 12677, 15298, 22320, 20260, 24194, 2283, 1430, 19340,

+ 30388, 11087, 9142, 3727, 19912, 23807, 9256, 7663, 31174, 9707,

+ 20722, 13867, 13696, 17583, 24841, 6646, 16944, 6576, 1813, 30183,

+ 3165, 18536, 23925, 11378, 6142, 766, 21379, 7703, 30690, 13338,

+ 25, 16857, 21583, 31479, 32084, 8690, 17642, 11706, 12695, 4293,

+ 470, 22018, 10707, 10772, 12320, 23488, 26886, 29811, 19803, 21065,

+ 20738, 14077, 32391, 7081, 2160, 22341, 17976, 22074, 532, 21392,

+ 26100, 18550, 2387, 11585, 28380, 16138, 30706, 22420, 17806, 4395,

+ 31008, 32399, 7499, 16173, 32183, 14902, 11861, 24402, 17855, 511,

+ 11163, 19680, 9012, 29829, 15256, 19830, 23048, 18304, 30841, 8351,

+ 16748, 29685, 15230, 11688, 2636, 29354, 14242, 17327, 20248, 7389,

+ 10110, 8189, 20682, 1333, 4715, 11926, 1317, 23801, 27879, 14605,

+ 23098, 14720, 6202, 30621, 21297, 19945, 1369, 14454, 25158, 27916,

+ 32522, 4437, 9234, 26543, 24393, 20311, 24588, 6910, 13290, 6415,

+ 29263, 17205, 5761, 30422, 670, 26272, 15231, 13666, 11429, 27845,

+ 31901, 22171, 32129, 13792, 25214, 1193, 27267, 18063, 29071, 15186,

+ 9521, 23503, 15923, 7043, 28814, 31527, 3101, 7468, 23452, 21283,

+ 31996, 4945, 1310, 4, 4702, 13919, 19618, 2230, 1742, 10428,

+ 5311, 10242, 16960, 10657, 31388, 13829, 28080, 27180, 9905, 17889,

+ 27141, 14513, 6866, 19378, 11835, 30290, 8553, 24260, 20673, 2767,

+ 16899, 27651, 16416, 19103, 24334, 27826, 28382, 831, 24800, 30048,

+ 30370, 8650, 4604, 12568, 30360, 10186, 4241, 7385, 12567, 25165,

+ 31044, 5957, 11394, 5948, 12079, 6301, 23404, 7401, 25898, 9965,

+ 4095, 4071, 19529, 23172, 16030, 6942, 2982, 1703, 21449, 1566,

+ 25952, 23175, 8513, 32180, 11491, 3696, 9837, 19131, 29290, 28994,

+ 14333, 27445, 1987, 27173, 19149, 16795, 16978, 17017, 26124, 20081,

+ 7769, 19468, 157, 10268, 10103, 14224, 19901, 9464, 19054, 12108,

+ 15591, 27558, 29737, 2577, 12532, 23971, 8701, 10864, 12935, 4127,

+ 18223, 24106, 8616, 18188, 11190, 20968, 10927, 9845, 10307, 27948,

+ 612, 3601, 25471, 10888, 11620, 21272, 29843, 16398, 22215, 19541,

+ 3822, 11271, 31231, 25725, 6978, 31208, 25603, 9919, 25040, 21377,

+ 20398, 31132, 10726, 12920, 8545, 31737, 29350, 17910, 1520, 14450,

+ 10504, 24736, 30908, 8946, 32547, 713, 29980, 5248, 18600, 21733,

+ 22274, 14684, 175, 9793, 11995, 9547, 23734, 17394, 3254, 559,

+ 4326, 15372, 1705, 3290, 10649, 24852, 32368, 21540, 7706, 8631,

+ 27224, 28219, 171, 2235, 9564, 6203, 28621, 31031, 2701, 29695,

+ 11451, 31487, 24503, 22582, 31544, 11107, 21313, 26297, 11914, 9753,

+ 4437, 23836, 1991, 31351, 13377, 21378, 18767, 229, 5149, 23990,

+ 9114, 9363, 14766, 17016, 24372, 30055, 30859, 15637, 26629, 5690,

+ 29822, 32059, 7638, 23363, 5677, 22794, 3601, 11475, 13050, 25966,

+ 31432, 579, 27687, 26797, 21241, 2347, 2366, 23356, 17, 19669,

+ 20912, 27351, 11438, 29170, 10684, 13264, 26793, 23179, 30354, 9384,

+ 20052, 17978, 3513, 16348, 3328, 17049, 13230, 12289, 31939, 32763,

+ 28110, 25107, 8056, 24154, 11125, 6667, 13062, 18065, 2664, 13743,

+ 14566, 9163, 14960, 4526, 5855, 4412, 17480, 17644, 13588, 4111,

+ 14265, 9755, 15681, 22943, 1284, 20363, 24386, 8681, 1408, 5443,

+ 16085, 24130, 30596, 8528, 28320, 25669, 29063, 10845, 7286, 29968,

+ 4230, 30852, 21206, 2224, 26023, 11364, 29620, 28121, 26395, 31860,

+ 20604, 4570, 26696, 23702, 853, 1233, 23848, 17392, 28067, 3611,

+ 27884, 1271, 32719, 25871, 6118, 27596, 11850, 25068, 29861, 5836,

+ 14287, 15119, 18530, 15715, 8425, 8810, 32411, 22816, 2230, 22321,

+ 17405, 25871, 15082, 32726, 18567, 10051, 8982, 24632, 27885, 14514,

+ 1323, 16408, 24378, 16198, 7994, 5580, 27322, 3632, 6269, 18743,

+ 32535, 8320, 24987, 8952, 12994, 8690, 27176, 15330, 17556, 31243,

+ 20331, 172, 24758, 3429, 26725, 7658, 11454, 10568, 21262, 26684,

+ 24346, 19833, 26338, 5318, 26034, 18519, 12444, 21984, 24521, 22819,

+ 23362, 12302, 28452, 19616, 10849, 6962, 9327, 18396, 27034, 17408,

+ 2780, 13645, 30045, 435, 5901, 2079, 16629, 21502, 32052, 18893,

+ 32197, 32070, 12921, 9711, 18385, 3342, 7580, 26707, 31616, 28339,

+ 15067, 8526, 6304, 20569, 14102, 25684, 22186, 30245, 17969, 21703,

+ 20039, 19885, 14522, 29965, 23572, 21932, 5323, 27621, 8354, 11771,

+ 13874, 13307, 16834, 25532, 14800, 27066, 20735, 19928, 14399, 11105,

+ 31595, 3501, 5048, 16217, 26271, 2048, 23859, 29894, 24317, 27193,

+ 5327, 29276, 15160, 4047, 18805, 26483, 6423, 23553, 23480, 21342,

+ 22389, 23495, 26624, 22265, 29069, 17416, 7144, 17538, 8052, 8205,

+ 31460, 25002, 24551, 17462, 22055, 4075, 20295, 22763, 31684, 20251,

+ 28642, 4566, 24851, 20034, 18292, 25935, 19542, 32425, 30190, 22552,

+ 16796, 23859, 10613, 12619, 14054, 26096, 5038, 10896, 21385, 26096,

+ 17465, 28819, 16083, 8021, 3195, 1974, 16881, 29612, 20641, 26883,

+ 16656, 2174, 27105, 27492, 20419, 6689, 32259, 19734, 25765, 28884,

+ 28705, 29019, 28735, 11276, 20139, 9839, 23340, 22536, 25261, 1982,

+ 12154, 427, 17493, 20564, 29012, 15499, 6320, 12693, 27358, 20294,

+ 23732, 558, 28513, 31253, 24963, 22859, 22952, 2979, 24046, 27147,

+ 18858, 14367, 14648, 13104, 25961, 26255, 29469, 22300, 8473, 26728,

+ 19731, 12281, 21125, 20316, 6352, 29751, 5039, 21876, 20492, 32571,

+ 14518, 2910, 22920, 4693, 23805, 16648, 8015, 8691, 19338, 23662,

+ 23100, 789, 18092, 4784, 14012, 3329, 29409, 14183, 14037, 824,

+ 26870, 5689, 30056, 23464, 13168, 2731, 11955, 13603, 15147, 18999,

+ 12825, 4624, 26433, 5279, 8486, 11105, 29741, 16000, 8142, 28613,

+ 17969, 18986, 23029, 798, 15093, 687, 565, 21045, 15984, 19770,

+ 11739, 3756, 9995, 9378, 12850, 10037, 7428, 29503, 26373, 4098,

+ 4369, 16125, 29279, 28541, 1607, 23470, 405, 824, 13113, 6053,

+ 4998, 20775, 15972, 5760, 14370, 30989, 6603, 20037, 26921, 14900,

+ 16862, 23217, 24629, 353, 25504, 6860, 3579, 4871, 11785, 19649,

+ 5838, 9659, 21161, 7149, 30821, 232, 31119, 21814, 15581, 29636,

+ 11369, 13726, 24321, 14466, 31981, 1815, 17354, 6090, 27255, 32666,

+ 27938, 24678, 19187, 5747, 18925, 1854, 15101, 17375, 18250, 902,

+ 22855, 24280, 1814, 15158, 20795, 3376, 24499, 5050, 30946, 31197,

+ 2311, 31467, 1541, 17812, 6855, 31807, 7826, 26009, 16373, 13884,

+ 18496, 25813, 17319, 17459, 31606, 15145, 23307, 28714, 23914, 12034,

+ 20648, 16666, 25990, 29997, 29926, 14683, 29199, 749, 30673, 22876,

+ 4104, 17995, 4122, 14999, 31316, 14510, 4958, 22212, 5148, 32683,

+ 25515, 20301, 25200, 4126, 22081, 18691, 18737, 1914, 30613, 12303,

+ 3886, 12125, 20636, 30763, 28045, 24424, 4421, 11538, 11885, 12621,

+ 17480, 26420, 7881, 15145, 28702, 30895, 22431, 17429, 18768, 26235,

+ 8786, 9975, 23029, 484, 31822, 22431, 17014, 13886, 32234, 15887,

+ 30613, 24276, 10386, 23577, 8622, 14625, 24613, 28976, 316, 18243,

+ 5020, 4216, 31902, 13996, 22765, 23839, 15132, 7963, 46, 24816,

+ 28965, 11722, 25086, 12581, 16858, 4329, 27937, 21885, 22993, 14156,

+ 14186, 9615, 10002, 14433, 5598, 4190, 21094, 30820, 22, 557,

+ 24018, 23766, 17125, 23701, 3166, 9515, 17979, 13524, 30490, 15299,

+ 27209, 19560, 29539, 4891, 16358, 30685, 11875, 25413, 8242, 26595,

+ 8663, 23445, 26489, 2211, 17941, 7326, 22362, 27475, 9549, 3676,

+ 25640, 28168, 13327, 26291, 29072, 5580, 4877, 29720, 17020, 20209,

+ 7715, 143, 8248, 1957, 27796, 24789, 31955, 22726, 9879, 990,

+ 5321, 12535, 21522, 5762, 21470, 13811, 2213, 3955, 333, 20513,

+ 4330, 14194, 30498, 5225, 1275, 450, 26853, 71, 25653, 18653,

+ 32120, 15389, 7740, 17255, 16450, 22478, 11583, 17760, 11662, 13704,

+ 9598, 8605, 24109, 5857, 24073, 16249, 5731, 38, 5834, 14536,

+ 15361, 26095, 16325, 5132, 30670, 22775, 17823, 28396, 1579, 9259,

+ 1885, 11489, 31479, 4353, 22895, 32307, 31921, 17931, 14829, 21284,

+ 15068, 29644, 6688, 3946, 9128, 17354, 24900, 4579, 7374, 15844,

+ 3212, 25733, 17340, 6118, 4199, 10388, 30962, 9051, 24322, 4887,

+ 15020, 19875, 14350, 3468, 4801, 26181, 9667, 20187, 7115, 8070,

+ 19237, 137, 24968, 32058, 26502, 17454, 8320, 9690, 13132, 11561,

+ 10472, 18903, 31220, 658, 26823, 5422, 5463, 23920, 24919, 24381,

+ 11820, 30508, 2990, 3284, 26063, 15430, 28829, 22672, 19777, 30535,

+ 30681, 30052, 19823, 10231, 12888, 16249, 25783, 23247, 9214, 28472,

+ 23976, 5297, 20601, 677, 25353, 9943, 3946, 20718, 5405, 32522,

+ 27589, 31811, 1062, 18452, 4730, 13801, 13352, 28279, 5205, 2186,

+ 3567, 23903, 32546, 7376, 24915, 2006, 4630, 11314, 23739, 4663,

+ 4458, 5645, 7648, 12261, 32073, 19190, 16340, 2364, 12268, 591,

+ 2626, 15816, 9988, 28184, 9719, 22197, 31832, 24840, 31393, 15751,

+ 20911, 6876, 6615, 2828, 13296, 12016, 23386, 17038, 14728, 14604,

+ 3739, 19788, 24588, 21632, 25981, 18988, 27935, 2419, 31835, 1450,

+ 22167, 9336, 9037, 11796, 30171, 11362, 19623, 6137, 2703, 27226,

+ 17603, 9951, 20596, 14382, 5889, 11828, 11401, 2284, 17419, 24199,

+ 13687, 24496, 11614, 4856, 6955, 10426, 23046, 4845, 12741, 10435,

+ 30888, 7175, 9137, 30353, 17094, 18517, 3859, 13002, 9535, 9415,

+ 4713, 29190, 21013, 3045, 3180, 3367, 8051, 6336, 4918, 19437,

+ 22511, 17961, 26282, 7621, 24588, 3618, 25105, 21730, 21763, 7570,

+ 12545, 6031, 2243, 28733, 19331, 31684, 32566, 26866, 32116, 247,

+ 20678, 14854, 32044, 23604, 5664, 12802, 21854, 19056, 16695, 16537,

+ 9791, 23835, 1932, 18397, 491, 29940, 16814, 3506, 26628, 24353,

+ 25596, 24962, 9372, 18559, 29874, 18994, 5717, 31543, 8996, 20565,

+ 8134, 6802, 25668, 14496, 18465, 20750, 14442, 17054, 20243, 9393,

+ 32341, 16293, 14316, 26013, 30573, 5641, 4096, 27365, 24906, 1167,

+ 29773, 4511, 18554, 14885, 6750, 12858, 30847, 5584, 24687, 18,

+ 11544, 8933, 10449, 1858, 26818, 9596, 1168, 15545, 5245, 19234,

+ 29012, 21649, 19667, 21454, 11909, 21148, 23, 18199, 28082, 2367,

+ 16875, 2467, 25140, 31363, 30724, 26339, 29710, 20329, 17458, 25341,

+ 6680, 22910, 20378, 26890, 8029, 21168, 23366, 10626, 22465, 20320,

+ 14817, 15604, 2023, 5816, 5819, 24315, 1105, 21823, 11796, 21869,

+ 19401, 23978, 23190, 22485, 8448, 27638, 7203, 2852, 26486, 7859,

+ 31697, 26019, 18329, 6819, 28979, 3884, 24113, 3203, 11483, 4506,

+ 31483, 32041, 27676, 28030, 12948, 11215, 14869, 26388, 18329, 25263,

+ 16874, 8053, 12045, 31184, 5717, 19981, 13307, 31775, 4702, 11856,

+ 32348, 8897, 14182, 30121, 314, 6824, 11370, 26035, 5142, 18532,

+ 17030, 20140, 15240, 32316, 8888, 5671, 25893, 22654, 2279, 5632,

+ 6821, 13331, 12324, 26517, 28742, 29526, 21551, 28467, 12907, 1319,

+ 27709, 15311, 5769, 25146, 760, 3831, 29507, 29877, 20424, 8456,

+ 17364, 7675, 30033, 30112, 31406, 20162, 2365, 21590, 26464, 25964,

+ 18747, 14761, 13245, 18068, 8519, 21559, 15419, 25575, 26413, 25136,

+ 18329, 9525, 28488, 777, 25029, 26567, 24208, 20853, 24060, 2036,

+ 24020, 22929, 17459, 10479, 4675, 16222, 11702, 12003, 32561, 10613,

+ 21775, 8002, 13592, 17398, 23849, 23386, 29149, 28610, 5045, 26921,

+ 5717, 29162, 13005, 15986, 5384, 14183, 26071, 16912, 15925, 267,

+ 5549, 30603, 3350, 2999, 16379, 2281, 23140, 2255, 24040, 8902,

+ 6174, 31467, 7672, 22183, 31367, 19151, 30000, 30604, 12910, 10398,

+ 19324, 9412, 7345, 3402, 18255, 30469, 2820, 28751, 31881, 956,

+ 2543, 1441, 669, 10914, 18454, 6114, 13811, 24976, 701, 21209,

+ 10379, 29332, 7051, 4640, 1508, 24644, 15246, 2076, 28188, 25682,

+ 10112, 20786, 3160, 15457, 10569, 18232, 27750, 14615, 12996, 10538,

+ 21409, 17268, 7622, 27423, 8469, 19554, 11613, 17019, 30948, 23181,

+ 13397, 16997, 16105, 10868, 1281, 7292, 9370, 5313, 3640, 22981,

+ 20019, 11989, 18845, 8168, 21265, 22952, 24355, 22173, 7515, 13008,

+ 8657, 16737, 27880, 7135, 18883, 24941, 349, 19442, 3954, 13288,

+ 12182, 8071, 3125, 8284, 26184, 6799, 1031, 11111, 26084, 20677,

+ 31882, 16819, 12222, 10301, 17740, 12071, 28782, 10816, 21833, 5727,

+ 26998, 22103, 8626, 31834, 7718, 11174, 20973, 15475, 18365, 23675,

+ 29917, 30867, 21713, 24615, 7011, 22948, 30705, 22285, 31781, 13385,

+ 2440, 29944, 1166, 26060, 16644, 26034, 31510, 32088, 2360, 24530,

+ 5827, 1384, 29695, 22997, 12271, 383, 4387, 5488, 28237, 29722,

+ 11389, 29989, 6183, 226, 14173, 20501, 26345, 32551, 24876, 14357,

+ 1251, 4234, 9039, 26115, 6219, 4089, 17487, 16475, 32641, 27873,

+ 5687, 12293, 8855, 18078, 29758, 14193, 32273, 23607, 17318, 32742,

+ 19177, 9288, 31716, 20759, 26583, 8511, 31233, 9976, 26575, 17867,

+ 9024, 22991, 27082, 32146, 6913, 3214, 7625, 11811, 4069, 21856,

+ 6935, 17451, 25651, 21634, 27599, 8427, 13691, 11604, 29087, 31721,

+ 1913, 5552, 1995, 3302, 5691, 28538, 1653, 4625, 4998, 8312,

+ 2843, 1658, 21367, 7268, 10849, 7369, 11366, 21824, 28433, 21040,

+ 3599, 1514, 19040, 11678, 5108, 2800, 22899, 32566, 5885, 15781,

+ 9249, 13311, 610, 1397, 14587, 4573, 28618, 4981, 19081, 28608,

+ 20149, 31806, 12759, 15899, 6935, 9212, 31280, 29592, 26437, 12482,

+ 23082, 12810, 15637, 30497, 15843, 14242, 6721, 5368, 18057, 28775,

+ 3085, 11917, 25376, 15328, 11818, 477, 26239, 15123, 4313, 17457,

+ 16028, 15028, 19028, 32242, 12554, 3478, 14185, 22718, 16576, 27493,

+ 12136, 5051, 8476, 10135, 12095, 4652, 23080, 21664, 16356, 14402,

+ 539, 10085, 7155, 2612, 12323, 12020, 22681, 16786, 3169, 13426,

+ 5552, 19670, 8501, 22356, 31019, 27964, 20925, 14803, 31157, 26323,

+ 6552, 20889, 15509, 30420, 31216, 12481, 2773, 1075, 14263, 23294,

+ 8611, 15989, 20272, 31514, 25079, 7873, 16562, 3235, 9078, 32569,

+ 6825, 19937, 11927, 15499, 25821, 3594, 8708, 5570, 20727, 11193,

+ 18243, 15971, 21569, 22429, 6805, 22197, 3757, 28526, 2590, 15968,

+ 8985, 1318, 12359, 30009, 25809, 26221, 3425, 32349, 32341, 14421,

+ 1163, 31101, 30045, 31559, 8149, 26232, 12315, 2878, 24485, 18223,

+ 24512, 28722, 6490, 5013, 29761, 4824, 10544, 13317, 32091, 10632,

+ 31587, 30169, 7381, 29054, 12440, 11832, 28165, 2118, 24952, 32559,

+ 1685, 31090, 17822, 29443, 29831, 21646, 16819, 25030, 23927, 24406,

+ 8407, 21801, 8992, 14374, 32067, 24209, 12578, 31921, 7213, 4973,

+ 22531, 18678, 16620, 9158, 22899, 8816, 15197, 16151, 2516, 9101,

+ 13701, 15200, 11001, 31586, 1144, 12918, 25646, 5533, 121, 2461,

+ 31609, 32443, 10338, 5976, 13344, 22651, 5191, 23424, 30315, 29330,

+ 31574, 32148, 9387, 23456, 20737, 1360, 16763, 32355, 15712, 385,

+ 19270, 7978, 29904, 4375, 28938, 19853, 13025, 636, 1115, 7772,

+ 23663, 32036, 19626, 16853, 3342, 26982, 8135, 18970, 5036, 2698,

+ 25509, 13794, 8817, 32547, 23902, 4974, 13802, 7071, 29046, 20415,

+ 30567, 21276, 14692, 1542, 7841, 8829, 4686, 25436, 5792, 12733,

+ 2325, 29363, 27100, 8068, 18321, 25868, 14755, 11000, 26398, 10731,

+ 17594, 12246, 19543, 27656, 16711, 10433, 28705, 17992, 3566, 11226,

+ 14828, 17643, 32315, 5520, 20277, 1799, 17984, 21946, 31823, 5173,

+ 18815, 4835, 6756, 14986, 20746, 6116, 5815, 2249, 27880, 16313,

+ 32555, 14550, 1211, 21389, 14345, 7790, 23456, 3863, 16126, 28182,

+ 2903, 16169, 8035, 28753, 15012, 11910, 31681, 29974, 4852, 21749,

+ 20629, 7041, 14660, 31891, 21584, 16841, 20031, 20845, 6306, 12658,

+ 14758, 3918, 20728, 23492, 17653, 16854, 25156, 14971, 18756, 19148,

+ 8188, 10432, 29803, 8885, 23141, 18520, 26985, 1958, 8721, 18204,

+ 16391, 3670, 25766, 6313, 10168, 18807, 18146, 30808, 12740, 31559,

+ 24540, 18289, 1701, 1378, 14733, 7067, 2737, 2778, 14990, 4503,

+ 13818, 30857, 23843, 14382, 9075, 26534, 22393, 10088, 6996, 3735,

+ 6444, 6143, 7359, 13318, 16908, 3859, 10915, 22583, 30241, 29215,

+ 24545, 2201, 13037, 5932, 3757, 4507, 2544, 9541, 28471, 704,

+ 25714, 22826, 8587, 14582, 13436, 585, 1718, 25380, 14120, 19433,

+ 13611, 13570, 11290, 9897, 3173, 15405, 9807, 26153, 11213, 2939,

+ 23062, 26375, 20701, 12427, 3163, 20749, 24710, 10145, 1835, 18856,

+ 8143, 16817, 14197, 10908, 24512, 12474, 22542, 4343, 8318, 11862,

+ 19960, 22595, 28599, 28814, 6628, 22016, 1600, 24818, 757, 26962,

+ 26877, 18922, 24263, 13046, 4354, 28231, 6832, 2426, 24311, 16157,

+ 27206, 32174, 24001, 9173, 16161, 854, 6239, 2174, 28130, 4641,

+ 1809, 9828, 9331, 21215, 22464, 15076, 5521, 11502, 5530, 8318,

+ 32136, 18421, 29693, 32300, 25662, 21973, 16534, 242, 16499, 14557,

+ 16586, 21431, 24647, 23102, 32340, 18771, 15101, 17598, 18224, 27881,

+ 4094, 22448, 25784, 27767, 30497, 9763, 19982, 4523, 17961, 22106,

+ 22969, 15609, 28560, 5500, 12947, 5866, 16003, 29581, 5090, 27575,

+ 5165, 15261, 4293, 25878, 2616, 7231, 27346, 5716, 7825, 13373,

+ 15357, 3748, 19564, 22410, 30651, 26039, 13961, 8312, 1896, 30348,

+ 18101, 8491, 1510, 15498, 26259, 18766, 24200, 1740, 13724, 21508,

+ 21294, 30140, 24677, 21026, 11697, 30435, 32032, 9371, 8321, 13055,

+ 4454, 31548, 6796, 8790, 9524, 11161, 4706, 15179, 1843, 29767,

+ 3223, 28463, 9788, 75, 24937, 26969, 9243, 16083, 1443, 17529,

+ 1427, 25380, 23234, 10793, 9123, 8404, 19029, 4293, 16904, 30777,

+ 12458, 2941, 28419, 10017, 23206, 24744, 4188, 4547, 6901, 23131,

+ 16807, 14326, 14948, 1339, 26566, 2721, 18314, 20879, 7599, 13683,

+ 2478, 19098, 24176, 12500, 6885, 22567, 4208, 12315, 28027, 15973,

+ 22007, 16385, 16532, 20469, 18160, 10581, 18451, 1602, 30702, 27634,

+ 3003, 29713, 29294, 26095, 16788, 18009, 604, 31509, 10129, 18260,

+ 31960, 20630, 8303, 6102, 25657, 28923, 6112, 4830, 3410, 27743,

+ 29161, 3946, 10741, 18651, 2441, 29840, 23734, 22337, 667, 21451,

+ 14833, 16397, 29437, 32147, 23055, 23704, 9970, 17456, 24836, 12431,

+ 1221, 24783, 7964, 6052, 21424, 11990, 12024, 31619, 27131, 12661,

+ 13523, 9736, 1640, 6013, 8971, 943, 22735, 12662, 10204, 27212,

+ 32262, 3564, 10350, 14332, 29443, 12297, 27922, 24155, 17221, 5225,

+ 25288, 11767, 30320, 30761, 5638, 30213, 311, 5697, 19124, 19539,

+ 15742, 20244, 21883, 4478, 11712, 28230, 6719, 1381, 4015, 718,

+ 21482, 32733, 539, 32076, 2412, 8615, 16917, 2204, 21504, 4511,

+ 17236, 20651, 23216, 6709, 10200, 11145, 10011, 15137, 23244, 22720,

+ 14198, 851, 21169, 19173, 29137, 18217, 16057, 12140, 23707, 1765,

+ 9073, 10432, 16489, 6494, 10915, 28308, 5875, 28406, 10875, 18547,

+ 27487, 203, 10216, 5791, 4035, 16434, 22597, 23832, 19429, 6753,

+ 26169, 1275, 26949, 25707, 32220, 18445, 16477, 17266, 25627, 31384,

+ 11047, 25879, 7517, 10102, 224, 7222, 26471, 12907, 32524, 13777,

+ 2684, 29880, 17338, 6729, 17865, 2028, 15625, 3796, 23297, 13054,

+ 12779, 11051, 32069, 11673, 18473, 22403, 10054, 11703, 11175, 26303,

+ 7341, 29553, 15082, 8420, 6843, 18197, 23767, 20941, 31788, 7546,

+ 25533, 12320, 21602, 22160, 8598, 12416, 17855, 19003, 4490, 6404,

+ 5971, 5986, 15029, 26856, 19895, 26947, 12330, 26755, 19256, 9993,

+ 21048, 30073, 15160, 16800, 13548, 24370, 19666, 5064, 20438, 26507,

+ 189, 2152, 23312, 15307, 3699, 31525, 32125, 31192, 9362, 1844,

+ 12367, 5547, 2178, 14444, 31692, 13057, 22872, 21152, 29009, 18259,

+ 31226, 9003, 1687, 6153, 26244, 4300, 13877, 26859, 30955, 23989,

+ 2406, 28376, 24801, 20446, 28429, 23226, 21240, 13215, 1014, 4281,

+ 13065, 27774, 12383, 24495, 15831, 2118, 16055, 19676, 30192, 2137,

+ 20389, 18396, 22484, 21830, 20300, 23253, 6489, 4254, 20430, 10997,

+ 30798, 14596, 27918, 23836, 23647, 21636, 7611, 13013, 20536, 5414,

+ 5514, 29579, 5614, 11202, 7362, 30202, 23194, 15637, 254, 24035,

+ 19783, 11541, 814, 25092, 7438, 13442, 26336, 11847, 8831, 29886,

+ 1726, 13882, 14403, 32222, 4695, 3007, 1792, 31489, 22818, 3589,

+ 18557, 30944, 18111, 1206, 17927, 31399, 29825, 31602, 5651, 20740,

+ 29738, 29053, 23844, 26493, 14325, 12724, 5615, 31750, 15322, 26310,

+ 9405, 29907, 21517, 16288, 14866, 18539, 17608, 14377, 18572, 11262,

+ 1866, 23088, 4621, 31736, 24608, 2722, 4125, 4822, 10915, 14081,

+ 15241, 568, 32194, 30481, 30544, 25144, 3585, 30421, 8896, 11003,

+ 28866, 15545, 5853, 19589, 9411, 8209, 4866, 30930, 1001, 962,

+ 23755, 21538, 572, 10559, 5937, 32660, 24114, 12216, 5367, 12790,

+ 9776, 5006, 10822, 21212, 14158, 16905, 16788, 19439, 6491, 5453,

+ 14282, 1160, 23585, 19594, 17317, 15230, 23017, 21620, 27740, 13116,

+ 834, 29683, 21380, 25622, 6143, 12571, 22065, 10461, 29055, 606,

+ 18783, 6576, 16945, 8192, 21904, 2326, 28246, 2508, 13750, 22346,

+ 25097, 5382, 23890, 4054, 2173, 5792, 18910, 1379, 18567, 32176,

+ 873, 24528, 10844, 29218, 4225, 20609, 2715, 19370, 24917, 24826,

+ 32398, 29949, 30235, 4012, 19885, 3905, 17584, 12046, 9315, 27074,

+ 8574, 15088, 25621, 8678, 12195, 6157, 13409, 32611, 7248, 29151,

+ 14755, 24751, 10606, 10935, 5310, 19385, 19336, 4620, 4121, 30422,

+ 24293, 21779, 7655, 24062, 14324, 23953, 2988, 14392, 4846, 4846,

+ 3836, 24915, 9910, 12682, 3974, 3031, 24324, 11348, 21074, 20283,

+ 450, 19608, 27207, 26200, 17334, 1048, 4592, 12830, 4194, 9567,

+ 21120, 21638, 2344, 30290, 7187, 30663, 32690, 20744, 13110, 5581,

+ 28561, 18139, 6058, 21479, 15140, 31167, 18533, 18112, 12220, 8147,

+ 2266, 12944, 5373, 25910, 2938, 7059, 19336, 8220, 9595, 15035,

+ 16087, 2849, 28632, 10914, 11879, 31197, 31129, 24770, 4637, 15288,

+ 28500, 18152, 7651, 8447, 23540, 2278, 10386, 22072, 26297, 27272,

+ 31252, 2483, 12928, 14794, 17610, 3938, 16965, 12616, 20011, 30442,

+ 1766, 24310, 2734, 18426, 31273, 25361, 12522, 22748, 27393, 6998,

+ 2044, 29514, 24333, 3697, 29994, 15234, 11618, 11192, 3270, 3485,

+ 13962, 13081, 10836, 17692, 24012, 22865, 21487, 8900, 10158, 31839,

+ 27880, 17580, 8633, 31801, 31665, 25748, 30588, 3005, 1785, 20600,

+ 22740, 3562, 19993, 20837, 5482, 21328, 24751, 29836, 4476, 19397,

+ 22920, 27285, 30689, 90, 16580, 28981, 19783, 27022, 22836, 31491,

+ 18624, 30145, 23815, 2439, 5501, 21483, 28070, 28052, 25048, 22157,

+ 15068, 25048, 24472, 744, 9530, 13234, 6513, 8302, 24506, 28227,

+ 16843, 23670, 21666, 15304, 24261, 22067, 20907, 28967, 30584, 9959,

+ 16227, 30663, 9856, 14932, 26576, 2469, 13753, 2931, 4182, 29605,

+ 10054, 6505, 27354, 21030, 20440, 10423, 8744, 31704, 26156, 9393,

+ 1426, 3794, 11222, 13617, 6106, 21471, 4926, 23692, 1363, 27673,

+ 1768, 12741, 17730, 31930, 13816, 2817, 27274, 19758, 2549, 11323,

+ 26505, 2925, 10701, 20025, 18749, 10887, 11801, 4543, 11691, 3968,

+ 27299, 13058, 31105, 95, 28965, 4447, 4346, 2434, 12628, 24397,

+ 6146, 19764, 23069, 3729, 32155, 29058, 24623, 19633, 22143, 8266,

+ 19897, 9130, 19206, 19860, 16245, 4837, 7243, 14373, 13029, 13416,

+ 1162, 22610, 2525, 16970, 30413, 12563, 26433, 4201, 456, 14168,

+ 18704, 20063, 23041, 17312, 929, 9649, 20276, 16839, 557, 2122,

+ 12533, 4895, 28814, 17192, 26263, 22211, 12870, 10582, 15949, 3112,

+ 19139, 27418, 14223, 17397, 6882, 28015, 19647, 21269, 6065, 13749,

+ 13, 15370, 24185, 15784, 12184, 17028, 18940, 17295, 29909, 23858,

+ 27899, 27317, 4917, 31192, 5627, 16413, 14850, 18338, 16457, 30578,

+ 7562, 31672, 5692, 29757, 11136, 17426, 26810, 29531, 24223, 23694,

+ 16381, 26797, 30096, 31295, 27031, 25873, 4366, 264, 10164, 6289,

+ 32072, 14186, 26016, 17627, 10887, 27803, 5513, 13297, 6416, 17624,

+ 7045, 1826, 15436, 8187, 27095, 29241, 6438, 20048, 12910, 14068,

+ 9141, 1957, 20910, 29880, 8219, 22688, 22131, 8322, 2733, 31318,

+ 19283, 14625, 19284, 18456, 9508, 2979, 14386, 18320, 31422, 7181,

+ 11145, 30478, 27138, 1615, 12505, 22044, 19996, 27510, 3401, 23640,

+ 11012, 16164, 10056, 21123, 29259, 2365, 4468, 16853, 1300, 28644,

+ 15547, 28051, 5985, 7590, 5568, 2788, 22672, 22516, 4480, 10977,

+ 1317, 22999, 27957, 2795, 17865, 18143, 9595, 16193, 32659, 19037,

+ 26801, 27601, 31111, 14033, 2210, 32591, 31580, 14758, 12132, 9349,

+ 18819, 30493, 23425, 24042, 8804, 8840, 26453, 32629, 8427, 26296,

+ 8119, 31411, 10307, 12984, 11740, 12568, 15585, 16060, 22647, 16531,

+ 28357, 23892, 24613, 32356, 14588, 27877, 31497, 5170, 31338, 32090,

+ 13235, 29528, 27590, 32279, 12103, 4737, 14054, 2094, 7899, 10612,

+ 4925, 6358, 24608, 24369, 2978, 20505, 4421, 7740, 20818, 1996,

+ 7192, 825, 16441, 22212, 31855, 6585, 30829, 21575, 17862, 23380,

+ 12540, 12225, 11305, 9464, 10215, 28856, 5205, 5760, 21358, 29442,

+ 28442, 4232, 14478, 29494, 25603, 17536, 2761, 16224, 3897, 2816,

+ 31013, 24569, 22181, 29787, 19575, 19734, 6741, 18295, 15073, 991,

+ 17441, 25308, 5274, 4163, 31374, 13322, 11757, 24298, 31474, 14608,

+ 10885, 27499, 24281, 16474, 3559, 7872, 20648, 23243, 13632, 29175,

+ 29568, 13324, 7777, 10537, 613, 17699, 8200, 15024, 27296, 5447,

+ 30561, 13973, 25953, 31986, 20172, 16968, 21673, 7993, 8673, 31892,

+ 26471, 3417, 8881, 24017, 18658, 18578, 1103, 26716, 24406, 5688,

+ 20112, 15684, 24034, 23047, 7950, 26950, 11681, 27319, 31603, 32252,

+ 29208, 5328, 6388, 19281, 11472, 16320, 15643, 19768, 17475, 26922,

+ 7114, 8606, 29181, 27266, 22141, 6812, 23547, 15575, 207, 16626,

+ 23895, 12015, 20032, 23217, 16935, 16793, 19765, 18999, 31394, 7743,

+ 21312, 22880, 2436, 23483, 32418, 17659, 12724, 1387, 28942, 7291,

+ 10020, 6280, 10160, 18927, 18169, 27571, 5230, 22069, 6893, 13521,

+ 23662, 15722, 11249, 8473, 24536, 26532, 26646, 13163, 28381, 6628,

+ 8109, 23780, 20472, 29510, 23981, 943, 31603, 19067, 8022, 27678,

+ 12334, 32633, 12052, 14329, 17820, 5489, 9894, 28694, 24334, 10498,

+ 23679, 19497, 25652, 5804, 16493, 11486, 25312, 25991, 27512, 31781,

+ 15886, 18997, 26381, 26573, 20002, 22037, 28508, 10837, 22128, 9913,

+ 13566, 22015, 29697, 10651, 25051, 22053, 27028, 18443, 25931, 6864,

+ 27876, 3948, 19323, 8839, 22825, 10656, 9235, 22117, 27361, 14785,

+ 15381, 27759, 26832, 28946, 12040, 17444, 24134, 28725, 4951, 29013,

+ 19104, 18590, 17908, 26934, 27153, 12871, 6464, 1462, 31651, 18853,

+ 27439, 21260, 10360, 27100, 26279, 23442, 28758, 30511, 29738, 26071,

+ 16227, 11706, 7605, 22767, 4396, 18531, 27112, 15118, 17644, 5134,

+ 29286, 32342, 1804, 17168, 14719, 4076, 29670, 5350, 781, 23889,

+ 22478, 9768, 13467, 17392, 12371, 31928, 205, 7923, 21186, 9279,

+ 25084, 26459, 23532, 28378, 10272, 6736, 19753, 11792, 7667, 22965,

+ 31389, 30728, 2387, 31488, 11962, 19704, 2792, 30793, 9990, 12513,

+ 8456, 30624, 19999, 3450, 20951, 23716, 22268, 28777, 16563, 6226,

+ 7541, 31161, 13007, 11034, 28678, 3721, 18205, 3384, 9936, 9217,

+ 25970, 28993, 11232, 13963, 10469, 5372, 22708, 16703, 18808, 5236,

+ 19707, 18846, 18682, 29515, 8861, 21380, 26411, 20561, 8955, 20824,

+ 8482, 30549, 24952, 25734, 16364, 17724, 24376, 559, 14966, 4688,

+ 7208, 20511, 28332, 5850, 14654, 19967, 30179, 32242, 4098, 7883,

+ 6260, 6806, 25421, 1671, 9386, 29434, 3408, 28718, 11487, 5663,

+ 20185, 4076, 28897, 28583, 9170, 30092, 30363, 3560, 16650, 9012,

+ 5617, 3647, 7993, 31824, 31723, 9126, 14142, 8396, 26902, 27529,

+ 21418, 2182, 12071, 1238, 7042, 29443, 12770, 7508, 14913, 32609,

+ 28474, 26933, 18717, 140, 21178, 14574, 23947, 25013, 22563, 8518,

+ 24837, 12032, 16727, 27053, 5643, 5757, 25461, 13520, 28264, 30042,

+ 20294, 5994, 5814, 17751, 22744, 4445, 23332, 32377, 17000, 7425,

+ 18807, 16643, 3717, 18620, 13391, 23458, 15731, 3795, 31660, 488,

+ 31182, 24447, 16048, 18171, 30831, 4420, 23207, 12431, 3988, 11134,

+ 23364, 30225, 18746, 16189, 16429, 16421, 29902, 16978, 15291, 31827,

+ 31749, 8362, 20218, 6397, 32521, 30683, 26360, 15765, 31701, 12541,

+ 24380, 21261, 1250, 27835, 3476, 28814, 19203, 30121, 15124, 108,

+ 32397, 11481, 11867, 12634, 19388, 9385, 11032, 2010, 30290, 24030,

+ 2765, 9208, 22657, 23287, 21203, 3896, 18699, 32187, 27551, 9933,

+ 11432, 25365, 23875, 30219, 13992, 12577, 13623, 5407, 7385, 2951,

+ 31066, 24574, 17067, 8712, 19508, 6555, 8082, 3414, 9854, 20317,

+ 25772, 28201, 18916, 4304, 9636, 655, 20745, 20379, 2262, 9603,

+ 204, 31666, 17076, 27842, 16074, 12236, 24680, 22746, 20771, 536,

+ 9659, 19332, 19330, 19755, 565, 14387, 19799, 1341, 24965, 17133,

+ 30055, 28054, 23332, 16730, 11911, 16963, 1334, 21019, 14756, 10765,

+ 28337, 32348, 6407, 1196, 1216, 6573, 16599, 26935, 26474, 21517,

+ 12512, 26847, 29039, 12872, 23442, 27101, 30578, 24708, 32333, 11945,

+ 605, 4886, 20188, 23917, 2306, 27034, 8767, 7097, 27902, 2114,

+ 28845, 4728, 16099, 23406, 23257, 28195, 3478, 14717, 5237, 12084,

+ 17653, 22243, 22516, 24286, 24509, 16508, 18325, 31739, 28843, 20513,

+ 24477, 13382, 18146, 20344, 24035, 15818, 12685, 15632, 17042, 25754,

+ 9925, 26541, 20011, 8387, 20917, 21472, 8393, 18559, 19452, 8155,

+ 24233, 12971, 1618, 22916, 32233, 23931, 9327, 31432, 8592, 28013,

+ 20521, 50, 9679, 6267, 18396, 19900, 16775, 20885, 11278, 21989,

+ 24842, 18510, 20563, 14083, 7718, 4310, 4975, 17115, 31072, 2088,

+ 699, 9327, 14461, 18564, 19658, 6167, 3655, 16928, 18251, 27091,

+ 28557, 19483, 3121, 11744, 14700, 16818, 29202, 26505, 3277, 32694,

+ 25549, 4672, 815, 22077, 23408, 16621, 8359, 17049, 1113, 18310,

+ 10020, 1414, 18587, 8928, 12024, 27047, 19875, 4805, 10388, 20020,

+ 9243, 6726, 11155, 18925, 12046, 23122, 14075, 31314, 1613, 31368,

+ 18111, 21269, 22546, 5194, 25224, 464, 3556, 21523, 2484, 14836,

+ 14522, 17674, 8351, 32001, 2147, 31447, 17186, 13053, 21029, 3509,

+ 8282, 10015, 27301, 7368, 17323, 15563, 22278, 19122, 28420, 28867,

+ 6485, 26721, 27236, 31387, 7205, 16938, 27805, 8813, 374, 17180,

+ 344, 7887, 22748, 25230, 4185, 3842, 221, 4091, 27140, 25964,

+ 14234, 4368, 32032, 22088, 7858, 1538, 6620, 7837, 13923, 2085,

+ 26127, 14188, 5106, 5819, 26308, 18734, 22349, 17929, 17142, 29566,

+ 9200, 25777, 9112, 15634, 8453, 2875, 21721, 16367, 17615, 18933,

+ 3237, 26077, 28488, 26877, 31343, 18713, 6153, 28316, 1070, 3403,

+ 4971, 24533, 21669, 17591, 13036, 28478, 7912, 13751, 17620, 3599,

+ 15132, 5225, 14104, 4985, 126, 1189, 24958, 28217, 167, 30770,

+ 15106, 5228, 2062, 15673, 32376, 9637, 1998, 20729, 628, 29501,

+ 19625, 19133, 18535, 25322, 10061, 29451, 1802, 24467, 27095, 23327,

+ 13312, 19555, 24214, 2200, 20663, 11805, 7185, 2416, 32399, 32431,

+ 23115, 1073, 7742, 24329, 11589, 6246, 32371, 6959, 18629, 9040,

+ 23993, 13453, 12630, 15579, 17310, 26252, 32400, 208, 29973, 22882,

+ 4761, 30796, 2074, 30510, 27372, 14193, 23188, 5956, 28249, 859,

+ 28799, 29637, 23629, 5206, 32074, 7540, 16724, 18510, 7294, 25028,

+ 5340, 22919, 32161, 22326, 25660, 28046, 1882, 993, 12021, 4207,

+ 13782, 21074, 22583, 28712, 14441, 18583, 20903, 27742, 4729, 13719,

+ 25439, 20047, 17304, 18597, 13622, 15624, 15088, 18260, 32066, 16855,

+ 6628, 21900, 30620, 28932, 2548, 989, 2915, 2748, 10721, 6164,

+ 16644, 10318, 22034, 17420, 28088, 18842, 20535, 16071, 14414, 22213,

+ 2604, 29629, 23338, 27186, 6176, 15476, 18318, 30382, 3574, 22609,

+ 3608, 7659, 19435, 5806, 12428, 19248, 32378, 26413, 16596, 26190,

+ 21885, 17483, 28997, 13014, 13972, 11320, 31268, 12169, 28362, 7142,

+ 30825, 2576, 10102, 16479, 10690, 31470, 8800, 21085, 10715, 7602,

+ 293, 20500, 5341, 6513, 7133, 2387, 13109, 11635, 11002, 12747,

+ 4758, 30253, 18547, 28078, 12353, 32367, 3107, 3197, 6276, 28895,

+ 18284, 26139, 8064, 32166, 9247, 3621, 5936, 18537, 10912, 20870,

+ 9895, 29307, 29509, 12869, 9881, 5457, 1792, 21922, 10013, 16694,

+ 13118, 6242, 689, 21567, 21774, 15719, 8831, 15746, 24454, 27267,

+ 22495, 131, 8546, 26510, 28444, 3311, 3567, 21430, 24443, 16013,

+ 3368, 17687, 15481, 6513, 5918, 1676, 19541, 5747, 7837, 26564,

+ 26574, 5087, 3852, 21400, 1838, 15982, 24981, 8347, 8327, 1653,

+ 3462, 20467, 15165, 30045, 22519, 11880, 23748, 30547, 18094, 3003,

+ 12971, 27968, 14911, 31801, 7642, 6908, 29559, 22671, 792, 17855,

+ 2043, 28640, 1232, 5848, 2605, 8213, 2580, 5793, 26703, 18549,

+ 14050, 21426, 18155, 19061, 14758, 2645, 23154, 3281, 4609, 24634,

+ 1059, 13531, 13513, 2156, 13870, 2579, 12625, 25476, 25370, 14329,

+ 15338, 28701, 31844, 25119, 16809, 8071, 17513, 16002, 26987, 25280,

+ 30597, 10778, 9751, 927, 4221, 27568, 15907, 7763, 11290, 6384,

+ 27738, 20236, 20503, 20927, 32220, 26616, 6462, 17871, 4454, 17265,

+ 5325, 14448, 23507, 1653, 18718, 30377, 5603, 26454, 12679, 29575,

+ 30524, 19634, 12672, 32437, 25262, 22694, 17155, 18765, 10171, 13375,

+ 25657, 11502, 32087, 12081, 2130, 26895, 6636, 1996, 4020, 19090,

+ 3233, 28459, 2905, 29084, 15324, 7599, 20338, 10661, 11525, 2988,

+ 6481, 1995, 31118, 8801, 19589, 17260, 5424, 31022, 2887, 31987,

+ 18807, 29441, 11797, 26354, 2688, 20498, 24220, 1394, 2306, 2000,

+ 23003, 30599, 9611, 32538, 7558, 32551, 10508, 28339, 1192, 15163,

+ 26264, 3568, 6029, 18423, 10857, 21940, 4831, 14695, 6692, 28574,

+ 27151, 9291, 27229, 9601, 18678, 10533, 3422, 25877, 22717, 13712,

+ 16164, 11244, 19450, 28627, 4779, 28583, 30235, 182, 25708, 22121,

+ 29192, 12181, 22051, 21388, 7172, 1202, 14293, 31891, 25300, 26063,

+ 530, 10848, 13348, 24829, 17784, 15016, 2086, 6575, 13176, 1443,

+ 20604, 3090, 9309, 23560, 20056, 6817, 16009, 8504, 5090, 6644,

+ 8962, 21945, 13530, 20184, 17198, 9703, 27262, 4773, 17371, 20710,

+ 11950, 4556, 4482, 31707, 4686, 22704, 2509, 17756, 21228, 8887,

+ 24150, 11557, 29602, 8096, 5298, 9228, 23870, 8983, 18350, 22583,

+ 18849, 29318, 3544, 4492, 32357, 9519, 10562, 12905, 6851, 19064,

+ 25730, 12437, 31923, 19077, 16637, 6775, 340, 13580, 23142, 31878,

+ 9359, 29285, 9089, 15105, 17399, 2785, 24621, 13280, 2292, 30813,

+ 161, 15626, 15905, 13847, 16886, 21192, 5106, 704, 14310, 2682,

+ 6298, 2258, 9171, 7561, 26412, 24867, 15626, 8348, 20992, 9147,

+ 20042, 15119, 3160, 31458, 19584, 29345, 5955, 27774, 19157, 24428,

+ 30146, 19868, 28650, 23579, 27690, 5197, 20578, 1623, 20169, 31667,

+ 21154, 9090, 9164, 11867, 32724, 15784, 7264, 27341, 26162, 3250,

+ 10520, 22114, 28801, 32733, 11663, 29270, 22235, 31595, 5966, 26398,

+ 3250, 7833, 23536, 6652, 20498, 9680, 8836, 16592, 15910, 15647,

+ 7218, 26673, 4350, 22249, 20514, 8124, 27279, 23259, 24217, 16556,

+ 20732, 16673, 32613, 684, 16404, 28122, 16252, 21225, 29723, 24777,

+ 16864, 8554, 20941, 3405, 1989, 6308, 4000, 28307, 1014, 29513,

+ 1098, 11274, 32117, 25698, 16003, 25111, 1377, 17821, 18956, 25355,

+ 1053, 32744, 17904, 1106, 8623, 25150, 12298, 19436, 3430, 23233,

+ 2503, 4642, 26816, 17930, 14893, 27505, 22922, 18621, 20764, 28363,

+ 1865, 26464, 4052, 11263, 2009, 20589, 23224, 26229, 32596, 3237,

+ 30802, 26654, 30518, 2472, 16790, 171, 12478, 12995, 10091, 1277,

+ 30359, 3081, 12647, 25309, 12727, 933, 23002, 7406, 17800, 28014,

+ 27407, 17119, 30533, 23740, 16846, 14821, 25767, 20602, 6437, 26985,

+ 19906, 25981, 17257, 8190, 13865, 788, 29815, 17557, 8537, 13793,

+ 319, 10228, 28245, 11495, 14468, 2660, 5773, 3299, 14557, 10666,

+ 21508, 3552, 26624, 27449, 29362, 5894, 28479, 30374, 20776, 19635,

+ 24915, 21596, 21618, 17613, 27993, 25745, 21313, 21846, 17178, 17017,

+ 15434, 12608, 3215, 26553, 31721, 18307, 8357, 9246, 25866, 6254,

+ 21309, 15759, 8521, 30010, 1655, 19520, 27736, 24037, 24880, 10025,

+ 7841, 28990, 20169, 29879, 19245, 9020, 11306, 13249, 29893, 11667,

+ 17927, 20669, 7767, 28297, 3170, 6964, 15003, 10758, 8018, 12147,

+ 16117, 24811, 6402, 10372, 23966, 12965, 14588, 11868, 11007, 32002,

+ 21672, 13398, 12893, 11843, 12559, 31712, 15803, 32114, 10725, 12148,

+ 21756, 31990, 18887, 10699, 14409, 15204, 14273, 15693, 22962, 26264,

+ 7699, 4043, 6680, 9477, 28213, 24176, 19786, 6473, 9752, 15861,

+ 18798, 17412, 31407, 11029, 1443, 14315, 2990, 32577, 3044, 21528,

+ 1170, 7572, 16943, 30884, 20193, 27657, 20199, 27000, 14771, 27884,

+ 7288, 21344, 14961, 3214, 16441, 10082, 10973, 30525, 18582, 16461,

+ 10322, 2931, 13934, 1684, 30797, 15438, 9658, 1629, 5677, 30784,

+ 26992, 11222, 20023, 26632, 7847, 6600, 2525, 6625, 31483, 20078,

+ 12608, 27897, 23091, 2695, 17907, 20772, 20257, 11946, 6914, 11986,

+ 15306, 730, 20019, 2879, 13511, 7258, 26251, 15593, 13291, 21954,

+ 15380, 17479, 24102, 3411, 3294, 7352, 24745, 7560, 25412, 6586,

+ 10571, 17389, 12656, 9308, 32300, 27188, 17954, 27894, 14488, 1414,

+ 32428, 25879, 10030, 23, 23106, 5567, 23361, 24829, 21104, 9678,

+ 25982, 9794, 7404, 9405, 17871, 1336, 14990, 28044, 4736, 1292,

+ 30621, 13819, 6817, 10142, 16716, 7677, 1963, 5264, 29828, 21354,

+ 16998, 31390, 2532, 7668, 7945, 6957, 17159, 26460, 5283, 13350,

+ 15621, 5094, 955, 15364, 3132, 16138, 20531, 9260, 17744, 12396,

+ 21107, 5501, 6000, 7438, 25539, 23337, 23515, 2244, 2551, 28611,

+ 16035, 23529, 1618, 24729, 25777, 337, 19365, 31555, 13066, 8318,

+ 8119, 31100, 6993, 18455, 27625, 7985, 4492, 7317, 282, 32472,

+ 3883, 24384, 21193, 22531, 18246, 24922, 28025, 17461, 28710, 14234,

+ 11354, 9716, 17927, 16860, 29221, 3615, 11036, 23318, 26952, 2946,

+ 2260, 17806, 3907, 6312, 22108, 10058, 3922, 7152, 26725, 10952,

+ 12364, 11747, 28199, 6128, 22987, 6597, 16293, 31047, 29837, 19562,

+ 24883, 8549, 10778, 9548, 24630, 9385, 18343, 24026, 27948, 6955,

+ 18491, 31506, 22252, 16114, 18960, 32081, 19246, 14952, 29500, 17002,

+ 77, 15114, 2448, 19958, 11340, 7268, 16833, 27628, 27928, 16189,

+ 2501, 24946, 1548, 24847, 21120, 8178, 5818, 1978, 7328, 11887,

+ 12009, 21880, 19654, 15642, 25562, 22804, 2790, 5920, 19152, 11863,

+ 12528, 26311, 31950, 708, 3248, 32697, 1955, 21125, 30963, 9119,

+ 28708, 29092, 4587, 29938, 10681, 13694, 2260, 3086, 10011, 21109,

+ 23256, 25225, 26715, 16870, 28464, 2242, 10791, 17499, 24717, 22973,

+ 6729, 21505, 30134, 8494, 13680, 7004, 3442, 26579, 12851, 17465,

+ 424, 23047, 7507, 13028, 17861, 31893, 2880, 412, 17502, 9162,

+ 735, 20548, 16407, 24782, 1419, 15451, 15299, 22836, 22618, 5422,

+ 11724, 15567, 29345, 8268, 725, 19911, 13754, 571, 13215, 12013,

+ 20996, 8041, 29225, 27724, 32044, 2405, 12828, 29184, 23979, 19535,

+ 4197, 25932, 20368, 12430, 24100, 5094, 26240, 17600, 21189, 28053,

+ 20731, 17399, 10604, 15358, 224, 11298, 11671, 3259, 15668, 6345,

+ 31487, 430, 287, 13822, 29887, 31637, 19511, 24464, 14263, 21214,

+ 18434, 16513, 3123, 4796, 26293, 1722, 6856, 27258, 24386, 32510,

+ 26751, 18704, 10898, 11549, 24118, 22260, 26127, 13418, 24386, 16946,

+ 16230, 9326, 13145, 4287, 19851, 32222, 18352, 27914, 31485, 971,

+ 2912, 8405, 25931, 11545, 27406, 12867, 21975, 18994, 12235, 22322,

+ 14298, 13051, 17721, 13002, 12200, 4360, 10991, 4438, 14134, 6668,

+ 5407, 5715, 25561, 20115, 118, 4295, 14672, 4339, 15684, 27093,

+ 11781, 10367, 13789, 24973, 17552, 1279, 29759, 3593, 24189, 22109,

+ 10997, 20661, 11343, 19617, 17723, 13806, 24260, 5151, 16994, 29391,

+ 32091, 25071, 24694, 30023, 1556, 9374, 23071, 14959, 14967, 11555,

+ 15301, 24347, 15831, 25621, 5111, 7856, 26840, 24347, 782, 13365,

+ 30255, 27299, 28173, 20908, 27817, 23511, 22732, 8610, 27247, 16076,

+ 11094, 1797, 13704, 13565, 26255, 3894, 13727, 6137, 3098, 19039,

+ 15111, 13400, 15737, 32263, 14076, 12531, 22134, 26083, 18732, 30293,

+ 1730, 30447, 18038, 10860, 11997, 22718, 7409, 5252, 1077, 2318,

+ 14640, 32119, 16530, 23968, 20676, 24605, 24753, 22599, 13827, 32266,

+ 13871, 318, 6408, 11385, 20650, 15294, 23035, 28035, 546, 18640,

+ 20627, 10645, 677, 27745, 11480, 7456, 30507, 26772, 21806, 20114,

+ 24511, 17244, 25999, 8326, 12511, 2633, 13336, 21559, 7206, 2210,

+ 32455, 4155, 19496, 9141, 9859, 16238, 6046, 20843, 7004, 23596,

+ 28611, 23839, 24085, 31683, 3581, 28336, 15071, 11815, 9408, 2005,

+ 8552, 1512, 6063, 27569, 15892, 23650, 32517, 9384, 14474, 9780,

+ 31284, 7280, 15219, 27635, 5580, 31339, 10622, 15135, 18589, 15412,

+ 9128, 9045, 19488, 15480, 17594, 5063, 21523, 7175, 13843, 11498,

+ 26980, 16682, 423, 23150, 27728, 24888, 17736, 18803, 460, 18532,

+ 11045, 3834, 28708, 21465, 19344, 4761, 12002, 21001, 23556, 4468,

+ 11761, 15681, 20326, 19816, 6146, 1153, 19339, 15497, 5167, 22156,

+ 6139, 19663, 19166, 9019, 27124, 4108, 12777, 18198, 12722, 25633,

+ 25596, 5413, 19694, 27506, 1854, 13060, 17061, 27031, 1843, 31542,

+ 27674, 22613, 9697, 22971, 12062, 18636, 10289, 22245, 11663, 25841,

+ 8601, 17511, 3615, 9535, 8952, 16559, 16982, 3754, 20673, 1142,

+ 28123, 3285, 9308, 11925, 21231, 15492, 23753, 538, 26682, 14932,

+ 25223, 19099, 31690, 18858, 8884, 23242, 1881, 26601, 9589, 22858,

+ 6606, 8168, 25496, 20417, 31239, 12707, 8056, 12335, 26326, 25136,

+ 17697, 17534, 6217, 2037, 5557, 15450, 26159, 10009, 8719, 19778,

+ 14295, 12856, 22693, 6367, 8475, 17243, 10931, 19861, 20637, 24871,

+ 3222, 13657, 13137, 9300, 21877, 9922, 28988, 20833, 16935, 3170,

+ 10107, 14982, 8017, 30294, 902, 32235, 24271, 27164, 9142, 29719,

+ 7254, 25765, 24837, 25259, 21847, 17067, 26134, 18256, 22566, 837,

+ 14197, 20206, 11867, 6329, 4383, 19743, 1657, 15249, 15685, 18403,

+ 24781, 29681, 18509, 27541, 921, 19751, 13850, 31517, 31346, 26500,

+ 7309, 4200, 9447, 23658, 18251, 16661, 6243, 10407, 18625, 31601,

+ 22869, 4353, 7270, 12198, 12173, 13586, 15936, 6447, 6633, 17495,

+ 23466, 15503, 9522, 2435, 340, 27971, 10817, 16409, 27275, 28661,

+ 14182, 26681, 21947, 3314, 10506, 3258, 562, 9950, 13714, 12154,

+ 15142, 10663, 28807, 20466, 5114, 26039, 2292, 16398, 14781, 11118,

+ 18192, 15163, 32244, 15055, 3357, 29633, 32409, 23417, 24464, 2643,

+ 3939, 12505, 14450, 9188, 18504, 7839, 10758, 4541, 23873, 20846,

+ 5292, 16333, 9037, 16344, 29701, 23872, 26296, 14217, 1880, 29523,

+ 30365, 19138, 22837, 24166, 2474, 12810, 27224, 23890, 24611, 30240,

+ 975, 11006, 18217, 30259, 29792, 22061, 24893, 7765, 15653, 19354,

+ 22528, 25134, 29049, 17991, 23356, 20461, 19992, 6674, 4392, 20356,

+ 19329, 3209, 23528, 25109, 12191, 12287, 6228, 30119, 25257, 29920,

+ 14842, 8478, 2887, 25921, 26726, 23658, 13814, 16059, 417, 2302,

+ 2989, 24186, 9719, 24196, 23489, 13201, 12541, 4047, 32006, 11152,

+ 17363, 15377, 18999, 19801, 17575, 78, 15767, 30255, 30586, 15632,

+ 28633, 27920, 5159, 25693, 32317, 16453, 32161, 25574, 7165, 8503,

+ 32380, 32641, 21223, 12932, 11951, 12249, 14155, 31826, 26264, 22884,

+ 4887, 31460, 25408, 28566, 19521, 31595, 32737, 22613, 2661, 15134,

+ 10405, 9132, 24496, 31884, 27313, 27587, 30972, 1841, 17762, 28943,

+ 6460, 17736, 8406, 18118, 25627, 29665, 3503, 9110, 15328, 6451,

+ 12819, 10902, 13973, 13619, 2039, 16509, 28264, 24678, 20638, 16658,

+ 12625, 19699, 24924, 10467, 21493, 24060, 11680, 1850, 11211, 18734,

+ 12850, 19533, 29821, 30359, 9656, 18357, 9361, 4792, 4735, 27425,

+ 30024, 1756, 15736, 9548, 8646, 19368, 32385, 26924, 8564, 18930,

+ 28134, 13677, 24995, 15831, 2856, 12317, 17010, 20487, 16637, 10921,

+ 23281, 22884, 27287, 8712, 18566, 1228, 15913, 3894, 3472, 17202,

+ 16552, 7140, 17227, 17908, 9935, 3950, 8948, 29544, 18277, 2061,

+ 10797, 2488, 706, 21582, 24226, 25585, 17296, 194, 29933, 5462,

+ 31951, 28151, 24247, 20218, 18715, 680, 1056, 17294, 3890, 20017,

+ 11361, 32119, 20401, 12101, 22960, 23332, 30, 21219, 7269, 9630,

+ 5931, 8070, 8538, 30048, 11833, 24733, 32663, 22890, 23580, 17978,

+ 2351, 29841, 11550, 3342, 9061, 1305, 23622, 25237, 27155, 2693,

+ 12762, 22926, 8781, 32174, 11042, 686, 16449, 20243, 20335, 32149,

+ 1121, 8048, 22108, 5633, 29637, 26258, 852, 16706, 12234, 31849,

+ 23124, 4078, 28928, 14431, 4594, 26581, 10563, 6888, 26271, 6711,

+ 4391, 13658, 13097, 10805, 9370, 17408, 29316, 22406, 21188, 11881,

+ 3785, 16747, 25906, 25094, 8575, 13797, 25140, 15093, 2330, 293,

+ 28291, 28439, 30657, 20804, 29223, 12136, 24404, 564, 1176, 29584,

+ 24238, 26103, 25636, 9141, 5159, 23822, 31888, 5268, 31069, 21301,

+ 16642, 2512, 11317, 29773, 23839, 12937, 18716, 11674, 368, 21553,

+ 14995, 20270, 20234, 6043, 8682, 24997, 9838, 11349, 15691, 1043,

+ 23982, 13880, 28411, 26171, 8657, 14653, 18909, 13058, 1913, 30611,

+ 18232, 32547, 3779, 30190, 2489, 4131, 7791, 6689, 20924, 3976,

+ 14913, 6127, 1735, 32326, 30886, 8222, 31319, 31866, 31643, 1486,

+ 18400, 14682, 28875, 19977, 30223, 8044, 23799, 23963, 15698, 4343,

+ 13979, 14628, 6042, 18616, 5071, 2923, 32096, 13013, 28523, 26101,

+ 29670, 21015, 18798, 28631, 20671, 1363, 9889, 30408, 22161, 16681,

+ 13175, 5754, 3866, 4593, 3640, 27179, 1649, 31219, 31838, 31863,

+ 19342, 32726, 3904, 26992, 23053, 348, 31725, 26352, 20783, 7756,

+ 10843, 10030, 7202, 20399, 16321, 18832, 28546, 32574, 10305, 19904,

+ 16415, 13084, 25546, 15618, 5889, 8641, 6717, 32197, 26281, 16950,

+ 15054, 1399, 17818, 11400, 10926, 23710, 12824, 24183, 18151, 10533,

+ 17200, 14446, 15751, 13043, 27384, 18104, 512, 5827, 11800, 10992,

+ 24783, 6959, 29833, 14777, 30300, 23565, 22429, 8368, 3361, 16383,

+ 4416, 10399, 9999, 27718, 28797, 26612, 13869, 10967, 30532, 31089,

+ 18563, 30385, 1386, 2852, 11062, 8813, 13553, 22938, 18676, 19735,

+ 19338, 27472, 18322, 6460, 25944, 8298, 10484, 23108, 15607, 27303,

+ 29486, 11266, 13501, 16789, 9192, 10378, 1343, 9985, 29447, 12355,

+ 13591, 20402, 10378, 30781, 15845, 17495, 2481, 21188, 660, 3773,

+ 8549, 26165, 31455, 18245, 26580, 17936, 14355, 5782, 3420, 8783,

+ 10006, 32655, 27818, 246, 13224, 1407, 26659, 13804, 12521, 665,

+ 13954, 3337, 11035, 17058, 25283, 23152, 1706, 13805, 833, 25887,

+ 4201, 20617, 27675, 24516, 25375, 27065, 24795, 25554, 17986, 12196,

+ 2394, 8917, 27138, 846, 11742, 16899, 9354, 20679, 32390, 5139,

+ 5250, 14243, 27112, 9554, 19672, 6057, 18168, 19955, 28096, 21968,

+ 22060, 16038, 20217, 28007, 24029, 15213, 8018, 8595, 26097, 30891,

+ 7534, 25342, 22199, 20094, 19908, 15822, 32530, 13903, 20969, 25556,

+ 17882, 18088, 17682, 9990, 2687, 8517, 16853, 30768, 30959, 1901,

+ 29999, 15846, 21690, 2179, 25291, 6077, 32628, 32472, 16001, 25019,

+ 15964, 20163, 32542, 3083, 826, 7156, 3683, 6901, 15502, 26885,

+ 14928, 25358, 28902, 21842, 19362, 21932, 10640, 27915, 26010, 29085,

+ 28785, 16263, 4864, 11289, 25909, 12251, 9320, 26100, 11689, 13228,

+ 17332, 16664, 17764, 29761, 24794, 27187, 28845, 1500, 23527, 10925,

+ 22169, 10571, 4164, 22237, 1652, 19386, 9528, 27772, 27746, 14539,

+ 18351, 30042, 31046, 13033, 12602, 591, 483, 26073, 8278, 21109,

+ 6466, 26513, 9713, 31380, 27219, 15182, 27690, 8414, 21718, 2785,

+ 23129, 8413, 20860, 2633, 14927, 11177, 24906, 14727, 17119, 14430,

+ 3135, 30894, 11165, 22733, 13110, 8762, 11749, 18034, 14606, 8098,

+ 5919, 15271, 18183, 11313, 20546, 27926, 12399, 14865, 32407, 14196,

+ 14719, 11689, 8640, 21869, 17792, 25385, 21240, 12762, 12337, 12898,

+ 2460, 10810, 22125, 25820, 2283, 21856, 4617, 21026, 23306, 8809,

+ 11516, 5729, 32074, 25585, 4034, 5937, 8622, 7047, 12034, 19123,

+ 10664, 6493, 31854, 29916, 15908, 17476, 24298, 20240, 10439, 7640,

+ 30193, 19955, 21113, 22264, 11317, 31100, 2849, 2170, 23942, 2891,

+ 32431, 25628, 5109, 18236, 31584, 29117, 8249, 16956, 27965, 11469,

+ 4434, 2907, 13030, 5634, 20332, 27427, 12173, 3404, 24069, 11560,

+ 15941, 2060, 2386, 10209, 27261, 30593, 735, 30390, 4551, 29570,

+ 12663, 6746, 21215, 32115, 14403, 29531, 28136, 28530, 31029, 19192,

+ 31224, 27601, 5800, 24114, 5079, 24777, 14400, 7974, 27140, 29804,

+ 5912, 8345, 18937, 27868, 5404, 24533, 4784, 26811, 25523, 24756,

+ 12390, 31714, 32162, 20474, 1439, 1110, 30765, 8167, 25962, 19319,

+ 28542, 21261, 742, 18299, 4683, 26976, 31237, 4379, 4276, 9100,

+ 21904, 24972, 29290, 4235, 13932, 11441, 6166, 6518, 27, 11151,

+ 27641, 32667, 11909, 27393, 1487, 209, 14585, 12973, 17914, 5640,

+ 9839, 22582, 11228, 36, 14096, 21172, 27525, 5900, 18168, 8801,

+ 1678, 3837, 20026, 24724, 27716, 10277, 8740, 3060, 25866, 31853,

+ 23493, 25829, 19704, 24470, 1965, 28231, 25032, 1415, 756, 26208,

+ 10227, 25317, 10622, 19478, 11031, 31717, 14716, 17506, 7580, 5470,

+ 4150, 29697, 7063, 31779, 9225, 8557, 5358, 22159, 24491, 13067,

+ 8894, 13409, 17079, 23974, 19449, 20682, 27493, 5916, 32084, 15045,

+ 28056, 8535, 14432, 22439, 6943, 16767, 15862, 29687, 8500, 30574,

+ 14297, 22143, 8009, 18789, 9623, 2467, 6917, 30717, 4272, 20210,

+ 30089, 11872, 19450, 28923, 17911, 696, 16964, 26466, 15669, 23272,

+ 6202, 307, 30446, 2427, 9609, 2421, 23514, 14041, 2371, 6659,

+ 31040, 27329, 23940, 4247, 29113, 18931, 20054, 23080, 27446, 23597,

+ 6098, 2166, 7748, 28249, 12168, 26083, 27279, 25861, 7457, 31620,

+ 5285, 4883, 17987, 15736, 4349, 26802, 12725, 20856, 56, 3725,

+ 1476, 9136, 16550, 16706, 17893, 15821, 14604, 277, 5019, 5208,

+ 16549, 27110, 30363, 15938, 18534, 18272, 28719, 19136, 10630, 14708,

+ 24024, 10585, 15678, 32005, 28471, 22588, 8654, 11493, 13101, 19672,

+ 20672, 3841, 66, 19111, 27248, 16856, 15427, 7242, 23244, 24114,

+ 18223, 25307, 15193, 24846, 3413, 28543, 5751, 29148, 1206, 23354,

+ 28645, 22764, 6576, 20744, 13959, 14887, 20190, 15913, 871, 26621,

+ 5178, 23740, 18939, 25246, 6532, 19599, 23974, 22381, 8168, 11830,

+ 28800, 13489, 3803, 29786, 28506, 9614, 20550, 24404, 24317, 2613,

+ 14310, 22266, 7859, 16471, 31218, 5817, 13321, 20447, 29951, 24549,

+ 978, 20448, 21282, 9804, 7279, 6092, 18004, 27409, 30030, 4328,

+ 25626, 14776, 18353, 15356, 25701, 31613, 25777, 16207, 18358, 5354,

+ 11394, 4306, 10375, 424, 2808, 4252, 15335, 25238, 7498, 10134,

+ 17764, 12824, 25879, 15992, 557, 4786, 11430, 8436, 20344, 27605,

+ 114, 8496, 4130, 18680, 25062, 3962, 5525, 12011, 5989, 23096,

+ 4079, 23400, 15757, 27165, 18785, 8940, 32189, 3747, 12500, 24772,

+ 3540, 3765, 30675, 11627, 23868, 12715, 18341, 20243, 4904, 21628,

+ 20921, 6274, 16921, 24367, 16200, 10783, 29863, 11923, 17461, 18765,

+ 30590, 17968, 22840, 16887, 1191, 24189, 24891, 1644, 13321, 9044,

+ 15876, 366, 21807, 13986, 6165, 20101, 5707, 19299, 24016, 19610,

+ 7291, 27854, 15839, 16064, 29004, 17868, 8403, 28501, 27005, 31919,

+ 26123, 2378, 26885, 30497, 26584, 7103, 10326, 6746, 2782, 31699,

+ 24292, 23447, 23742, 30906, 30433, 13511, 1522, 5648, 11851, 20871,

+ 4856, 16492, 18729, 2128, 22706, 12345, 14610, 29679, 30733, 28353,

+ 24046, 16694, 17633, 12683, 17409, 1266, 5144, 32743, 805, 11805,

+ 13587, 22215, 9046, 26708, 6729, 16080, 10868, 651, 30001, 2225,

+ 14149, 11775, 18787, 9140, 19898, 10604, 15098, 17042, 14451, 11392,

+ 7228, 17036, 9092, 10128, 32381, 2231, 21626, 11147, 19008, 18840,

+ 9113, 3628, 8864, 28400, 6760, 7795, 6126, 4057, 23408, 32085,

+ 28060, 12050, 14144, 28339, 30553, 13208, 4788, 13961, 20862, 20342,

+ 631, 22120, 30889, 18653, 16327, 16166, 1191, 22903, 23160, 19156,

+ 2712, 6137, 19516, 4848, 27213, 8184, 20769, 30428, 2805, 27645,

+ 10587, 26255, 19193, 5595, 10308, 17803, 10020, 28992, 13473, 31246,

+ 23815, 13451, 7719, 31885, 3228, 9181, 27710, 31582, 7465, 29299,

+ 2564, 26293, 26983, 20019, 29589, 30929, 30436, 18820, 18570, 3703,

+ 15526, 5987, 26559, 25504, 15633, 19892, 30810, 2159, 30475, 8661,

+ 1032, 8805, 29277, 21369, 1674, 19928, 27484, 14772, 5745, 13217,

+ 25034, 9810, 2853, 10006, 3831, 4973, 17452, 24632, 1835, 20287,

+ 30121, 9773, 2632, 6708, 7715, 32240, 18348, 27459, 2440, 12615,

+ 6485, 20095, 1394, 16885, 31304, 4585, 10920, 7473, 15411, 13449,

+ 24552, 9048, 16465, 19389, 31204, 22495, 14222, 21200, 7306, 19851,

+ 11756, 6350, 16776, 8932, 25893, 16535, 2064, 8935, 17042, 1843,

+ 12760, 24059, 21579, 17509, 29030, 20262, 12688, 22915, 28042, 24961,

+ 14951, 644, 7724, 27113, 31367, 15707, 26183, 26872, 13173, 15236,

+ 3894, 10547, 20973, 4572, 2351, 3461, 21123, 6837, 5389, 9197,

+ 22922, 15914, 15186, 20595, 565, 5296, 13420, 9312, 10492, 6126,

+ 9783, 13742, 13633, 21967, 23236, 2750, 9780, 22997, 21593, 28233,

+ 26356, 16560, 25272, 16281, 11767, 10767, 7588, 4857, 27563, 31926,

+ 26786, 13930, 3165, 12496, 25597, 28311, 4443, 5255, 28428, 11,

+ 17749, 16083, 8119, 22690, 4105, 9359, 21304, 27965, 11552, 978,

+ 15391, 8122, 19026, 6524, 4505, 16676, 20689, 21775, 17393, 1062,

+ 24037, 32449, 23127, 29638, 11987, 975, 24033, 16976, 1028, 23827,

+ 30159, 1167, 16227, 17369, 6419, 11587, 16903, 10479, 30993, 23760,

+ 19730, 8699, 2467, 22836, 27097, 16657, 19040, 16955, 7493, 2693,

+ 13598, 22006, 27257, 31998, 30133, 22889, 26804, 24524, 20230, 31108,

+ 28793, 19324, 20796, 14421, 9198, 8361, 17746, 14971, 22147, 24853,

+ 29142, 2270, 6099, 7928, 7404, 6813, 26063, 30359, 28565, 15176,

+ 18969, 17945, 7729, 8528, 26286, 6038, 31299, 18619, 13768, 29042,

+ 20853, 26140, 259, 233, 15836, 1475, 21438, 21226, 19324, 11057,

+ 27844, 3881, 5903, 1231, 29484, 26992, 18946, 2015, 29309, 15669,

+ 6081, 2226, 25110, 1906, 8244, 8987, 15309, 12977, 23433, 1829,

+ 26071, 26982, 29493, 32257, 29672, 25218, 11317, 15170, 922, 23621,

+ 18074, 20045, 14355, 14676, 30276, 18442, 6370, 29707, 22766, 26848,

+ 22571, 23572, 3435, 27361, 17412, 21049, 20526, 15425, 26398, 30326,

+ 16656, 15885, 7336, 31827, 13902, 23321, 7024, 6513, 16593, 2875,

+ 15436, 16994, 17843, 5814, 32696, 10685, 20734, 11769, 5824, 13682,

+ 1463, 10634, 29473, 24156, 20251, 1597, 8875, 11797, 14120, 29097,

+ 31209, 20238, 1631, 31452, 20996, 25311, 4297, 15182, 24037, 4827,

+ 21560, 3092, 23194, 3816, 19407, 6998, 7931, 28302, 7364, 30211,

+ 20109, 10317, 101, 22979, 13222, 4916, 3929, 25390, 1234, 9903,

+ 21033, 27707, 6518, 27809, 15103, 12027, 20915, 22962, 27821, 135,

+ 13709, 32747, 29424, 14391, 3917, 20352, 20470, 5908, 1315, 23020,

+ 799, 17296, 30224, 19267, 27905, 11637, 7683, 3524, 13486, 28188,

+ 17731, 19374, 4665, 30943, 32524, 17238, 8822, 12240, 15229, 8565,

+ 10242, 12460, 12466, 21958, 23939, 28170, 24365, 5585, 15665, 26840,

+ 13690, 513, 24982, 7688, 5906, 8445, 25489, 31879, 19073, 9525,

+ 22945, 30575, 4804, 12475, 23648, 2173, 30709, 2901, 13390, 14021,

+ 810, 32464, 5328, 30116, 29082, 19863, 2169, 28663, 8961, 30596,

+ 29319, 5002, 18246, 16629, 18865, 28884, 3931, 12323, 28704, 17121,

+ 25958, 29871, 19643, 13199, 28702, 28030, 2471, 12285, 25975, 16583,

+ 7182, 24897, 28801, 14954, 31008, 7513, 11917, 25732, 7256, 25700,

+ 1939, 3648, 17153, 15891, 26064, 13552, 248, 2906, 4275, 860,

+ 4787, 8299, 12026, 23385, 4226, 15076, 13337, 7582, 26389, 10311,

+ 15579, 9172, 14655, 12460, 8011, 8428, 3833, 6578, 12757, 23477,

+ 30122, 21947, 3497, 30638, 30118, 13145, 20576, 16409, 244, 8451,

+ 8418, 10576, 16212, 22797, 31623, 31836, 23424, 2519, 2428, 24772,

+ 13747, 20036, 1897, 14499, 8040, 2669, 32592, 765, 1124, 151,

+ 22969, 14419, 9462, 12899, 2572, 21877, 17790, 25157, 23102, 2200,

+ 30508, 18743, 6575, 13480, 24074, 21679, 13139, 16096, 6205, 206,

+ 28433, 23191, 10888, 8922, 25192, 18269, 5649, 14318, 21592, 13638,

+ 31592, 3056, 6272, 17286, 28357, 19652, 9604, 19774, 24977, 23999,

+ 27313, 30870, 17704, 32607, 10468, 15372, 19166, 7993, 21159, 19980,

+ 25920, 25650, 14238, 12992, 28316, 19186, 32546, 23593, 6339, 26262,

+ 13867, 4207, 2573, 6565, 29811, 2677, 19358, 23366, 23768, 2225,

+ 27880, 23728, 32002, 15931, 113, 8929, 20551, 23075, 21974, 26771,

+ 27083, 6408, 5393, 23660, 2540, 5350, 7927, 3957, 8925, 18224,

+ 22276, 10189, 4240, 28959, 14939, 11167, 2010, 24137, 26633, 30801,

+ 210, 13685, 32394, 14846, 8314, 19374, 29326, 30503, 26017, 11670,

+ 17149, 1189, 7431, 21245, 11832, 30178, 24771, 12466, 19618, 23881,

+ 9954, 7321, 13407, 28923, 9041, 14334, 2651, 26564, 253, 21545,

+ 9358, 8781, 13880, 1331, 8575, 29843, 30815, 22296, 6407, 9111,

+ 4793, 22796, 19032, 27480, 9379, 29459, 27453, 8446, 2794, 14796,

+ 31908, 17752, 30841, 13453, 18521, 7048, 564, 18869, 27668, 6141,

+ 8739, 17726, 5558, 15266, 30163, 11666, 21712, 12117, 15353, 23200,

+ 9573, 13211, 21849, 814, 6129, 14482, 19686, 13425, 15017, 12839,

+ 11051, 26587, 10245, 31880, 6377, 11060, 24188, 25821, 5378, 3820,

+ 17806, 10803, 16789, 20144, 1032, 2744, 3179, 26683, 2948, 12590,

+ 13970, 5231, 32047, 5786, 32583, 22180, 19407, 11324, 30234, 5696,

+ 16132, 25028, 14412, 30343, 15309, 23491, 7548, 24757, 30287, 28256,

+ 6018, 29770, 28882, 12364, 18844, 20902, 27661, 14840, 6856, 29397,

+ 11427, 25861, 18288, 1708, 14829, 8188, 13900, 533, 31226, 10815,

+ 5253, 23463, 20180, 19519, 32022, 9594, 6405, 24560, 12152, 31033,

+ 17242, 15738, 6526, 27256, 15335, 24626, 14462, 29512, 32331, 22472,

+ 5553, 3849, 4918, 22977, 25052, 30592, 10536, 1832, 29744, 14378,

+ 10875, 14977, 12399, 3023, 29859, 29183, 6225, 14425, 5301, 10743,

+ 3110, 23783, 11558, 15251, 32444, 26142, 26837, 5067, 8323, 7359,

+ 8012, 22161, 17903, 639, 3651, 16972, 3358, 28947, 19558, 26504,

+ 1723, 12170, 22873, 2284, 26146, 29151, 28408, 14188, 31941, 30415,

+ 30691, 32448, 1230, 14312, 20282, 13844, 32518, 24547, 11685, 18689,

+ 10229, 31539, 26520, 3260, 18507, 5854, 24789, 30093, 25726, 16780,

+ 22834, 16515, 4021, 8925, 30364, 25959, 26085, 7424, 12380, 25838,

+ 28985, 11394, 32665, 18226, 32440, 31331, 31006, 24163, 9762, 21615,

+ 13406, 8634, 2330, 32715, 9141, 13487, 3466, 6607, 16881, 28268,

+ 5956, 31507, 14609, 30081, 1253, 20685, 26189, 17369, 29695, 24666,

+ 24406, 9965, 4215, 10522, 23774, 4151, 29483, 22657, 11867, 18922,

+ 21464, 17515, 6920, 25568, 4668, 24496, 21549, 27860, 23159, 23801,

+ 23713, 19409, 26807, 29650, 2445, 19946, 12308, 31744, 114, 15404,

+ 26809, 21268, 22126, 3537, 18757, 16448, 13499, 2742, 28529, 19050,

+ 9848, 29200, 15346, 13439, 29612, 31066, 9633, 5130, 11656, 14226,

+ 18393, 13829, 20460, 20644, 12320, 17902, 7213, 29991, 12042, 27422,

+ 4374, 2631, 12379, 20567, 9260, 3586, 24172, 18844, 8246, 2968,

+ 5328, 3141, 19709, 13372, 26166, 11602, 17489, 28688, 14737, 23040,

+ 6220, 31568, 17015, 32410, 11995, 25549, 22727, 20370, 30329, 31390,

+ 29583, 26832, 22590, 3602, 19245, 30538, 2841, 32745, 26292, 8405,

+ 11354, 3011, 6289, 7738, 16755, 20952, 11886, 15245, 1791, 31210,

+ 22614, 12986, 12547, 632, 2842, 5217, 116, 4149, 25076, 13028,

+ 20986, 20920, 17259, 17342, 2548, 19317, 19830, 11030, 444, 8172,

+ 19684, 9619, 23084, 10272, 17403, 17523, 22369, 28747, 17504, 28631,

+ 10686, 27856, 8247, 25441, 18484, 31601, 13962, 22785, 16321, 1218,

+ 24303, 22028, 7223, 20957, 14437, 20111, 20031, 27224, 24448, 4834,

+ 12957, 3700, 20422, 15232, 7862, 8599, 29784, 1813, 5711, 6397,

+ 11221, 24281, 3735, 17066, 17275, 29981, 25192, 30883, 11663, 12835,

+ 23498, 5213, 30463, 25395, 30393, 13942, 16455, 24555, 16680, 13987,

+ 15761, 6615, 31813, 20458, 544, 19010, 25343, 23825, 6894, 12875,

+ 14789, 14678, 15508, 8507, 2961, 6496, 2155, 13589, 14374, 28790,

+ 11505, 2415, 14230, 13807, 25966, 18561, 14086, 7913, 7383, 21116,

+ 29365, 8254, 14322, 28445, 28987, 19636, 19131, 15745, 1039, 25460,

+ 15623, 22075, 12620, 8894, 8807, 21412, 27317, 13018, 18767, 13426,

+ 13814, 15698, 17783, 19596, 10797, 1118, 31106, 14365, 26280, 3744,

+ 25566, 1255, 26352, 15121, 13035, 1499, 22535, 20796, 25695, 1254,

+ 21231, 25002, 29673, 18189, 8299, 2717, 23828, 5820, 27146, 29953,

+ 29807, 18523, 31840, 7583, 23531, 27939, 32407, 16020, 5764, 10288,

+ 17191, 27905, 32547, 22999, 5601, 16133, 9923, 5433, 11058, 3560,

+ 24019, 5144, 5286, 10393, 27868, 7402, 24235, 2651, 16484, 3884,

+ 15256, 27067, 3090, 2553, 24557, 13253, 10515, 24795, 29660, 18295,

+ 13243, 21217, 15881, 1398, 11376, 14322, 27535, 2048, 8132, 6240,

+ 6467, 5922, 6625, 25280, 572, 11563, 26922, 13306, 30611, 8032,

+ 29727, 26012, 1383, 16113, 9857, 22132, 26916, 1580, 14775, 8541,

+ 15621, 9713, 23665, 13913, 31960, 1894, 32139, 2528, 18434, 5611,

+ 15924, 20088, 1218, 25937, 20303, 27782, 18618, 2118, 15897, 11364,

+ 10923, 11028, 29709, 18099, 24960, 18060, 28165, 20211, 21646, 32572,

+ 28321, 11345, 282, 1257, 12268, 5311, 22811, 1593, 22589, 15946,

+ 32578, 3247, 13916, 15016, 1080, 21724, 2278, 12561, 2343, 30420,

+ 21747, 27217, 27515, 29408, 4085, 25370, 24042, 30322, 8420, 22686,

+ 4785, 27998, 31896, 861, 23329, 13126, 24950, 29756, 24667, 31062,

+ 30286, 18392, 22872, 13362, 20612, 9241, 25132, 9773, 9582, 13322,

+ 22667, 22972, 11006, 5608, 24972, 8234, 27553, 28537, 31917, 26765,

+ 4454, 7326, 18455, 760, 27747, 11308, 23076, 9202, 14421, 7928,

+ 21535, 15399, 25990, 7473, 4683, 30814, 26868, 5619, 7462, 32171,

+ 22447, 32024, 16366, 13798, 20867, 6994, 26725, 16475, 32471, 9335,

+ 13266, 23235, 9685, 2075, 19784, 22132, 6859, 12388, 298, 28116,

+ 4049, 8986, 10735, 3603, 1965, 14590, 23075, 26906, 28659, 24413,

+ 26542, 25534, 9841, 6116, 15449, 13370, 28105, 10934, 3982, 17628,

+ 5472, 16060, 27999, 12030, 22647, 19516, 11979, 25144, 14488, 7598,

+ 18236, 19412, 22324, 21195, 2899, 4738, 4746, 6630, 21736, 14925,

+ 27082, 4991, 10317, 17614, 27771, 5142, 16083, 8608, 14618, 14397,

+ 6800, 788, 20228, 32497, 1887, 27429, 14230, 24106, 11559, 1198,

+ 19090, 1457, 5985, 7386, 4548, 17458, 21972, 20700, 4070, 17042,

+ 6819, 17377, 28354, 2434, 31114, 28995, 22678, 1365, 11365, 28416,

+ 188, 31758, 242, 13418, 8074, 10686, 21463, 14624, 25976, 30477,

+ 15591, 60, 10624, 32278, 20641, 25550, 22219, 20856, 6905, 13450,

+ 23945, 14761, 14172, 445, 11041, 23694, 10734, 7558, 28042, 841,

+ 24086, 12610, 9720, 29267, 28220, 30280, 20156, 1994, 6353, 26327,

+ 6245, 5132, 1680, 31564, 556, 8324, 17924, 18328, 20879, 6340,

+ 8267, 3314, 11579, 2516, 11033, 5065, 24367, 27594, 15360, 25085,

+ 543, 10651, 8430, 8526, 7702, 23345, 16887, 18965, 30816, 26046,

+ 4180, 26162, 6823, 30287, 26284, 69, 21852, 2724, 16019, 4897,

+ 16729, 31807, 24401, 3453, 1220, 16827, 27108, 15853, 24374, 23135,

+ 26184, 15121, 16668, 6131, 13813, 7180, 29278, 15058, 4010, 5432,

+ 3135, 5185, 26729, 19737, 19077, 8959, 28098, 32143, 30681, 24094,

+ 30037, 13647, 31088, 8720, 1427, 19859, 15851, 29701, 23492, 26641,

+ 4988, 3957, 4942, 2346, 10571, 29176, 21044, 8805, 16408, 22878,

+ 7901, 8475, 20001, 26620, 17175, 21876, 6726, 25412, 24667, 17810,

+ 4715, 16537, 6483, 16651, 24862, 29793, 29849, 18589, 1657, 14171,

+ 23746, 7709, 30794, 13874, 24987, 4273, 3442, 24403, 7858, 22847,

+ 14475, 17148, 27416, 6949, 21966, 14742, 13926, 23851, 4147, 17477,

+ 14078, 3765, 8665, 23485, 19859, 27966, 29609, 8535, 16876, 24065,

+ 24631, 9828, 15588, 4089, 7656, 15809, 9142, 31244, 5210, 2988,

+ 14455, 2436, 8448, 18389, 9188, 5310, 3853, 26040, 19550, 26150,

+ 18068, 5931, 7731, 29539, 30445, 23859, 10527, 5326, 16474, 6940,

+ 14099, 20777, 8426, 24521, 16436, 4494, 10398, 22856, 24615, 20901,

+ 14539, 9897, 12428, 8218, 21183, 31761, 11464, 846, 14759, 19722,

+ 776, 5709, 27569, 28957, 30339, 29185, 13933, 30371, 14079, 13989,

+ 27257, 6104, 20886, 18811, 29277, 1585, 7866, 6850, 20660, 32752,

+ 20855, 2019, 18829, 25589, 3064, 11755, 15120, 14295, 7501, 16445,

+ 26981, 21555, 19563, 14217, 16849, 11076, 21620, 27896, 22818, 23988,

+ 30265, 30121, 10574, 4530, 17150, 21089, 21079, 16453, 1149, 18302,

+ 25201, 27872, 26157, 28973, 26983, 31542, 17347, 26589, 23355, 5967,

+ 16633, 2292, 1549, 25564, 3727, 14272, 7997, 25288, 144, 10928,

+ 11220, 19471, 22999, 6340, 18464, 18131, 28881, 23362, 4767, 14509,

+ 4485, 22443, 15903, 8001, 16593, 17901, 3874, 10261, 17654, 9946,

+ 18567, 31395, 5975, 32473, 19303, 26796, 9085, 10459, 28222, 30928,

+ 30559, 21905, 20299, 32604, 18656, 2781, 9785, 14691, 29850, 14214,

+ 22782, 7696, 23002, 12079, 22532, 23098, 14315, 8842, 1414, 10809,

+ 28824, 26569, 11326, 1528, 21484, 10069, 18749, 21324, 22844, 16579,

+ 11546, 4740, 26984, 31748, 14414, 14658, 7773, 23259, 14047, 12169,

+ 7134, 7828, 7996, 8982, 25989, 22004, 14440, 9460, 22020, 1900,

+ 27483, 17739, 7089, 19345, 17318, 8569, 24130, 27601, 25429, 6243,

+ 29140, 22878, 28185, 6413, 15155, 4207, 12199, 16233, 10581, 15272,

+ 347, 13165, 26663, 11222, 13089, 32360, 12429, 30688, 31637, 19094,

+ 22947, 22779, 13161, 16626, 3914, 5916, 24583, 31051, 20960, 6579,

+ 20856, 12442, 9038, 28822, 22405, 14739, 1352, 26939, 21020, 23418,

+ 11472, 1067, 8437, 4920, 3836, 24243, 13940, 27310, 11002, 25821,

+ 20946, 23113, 13649, 24479, 9336, 26839, 2153, 13137, 26283, 32153,

+ 32334, 25188, 8046, 6297, 6065, 10322, 9124, 25917, 5168, 16593,

+ 4214, 23325, 24535, 12108, 17652, 24850, 31206, 6803, 7935, 9871,

+ 14548, 4306, 32614, 10037, 3989, 18368, 22863, 3233, 14361, 11544,

+ 20697, 25225, 26389, 23373, 11519, 20743, 27909, 18042, 8384, 20788,

+ 26738, 13719, 12156, 4089, 28016, 23539, 12450, 29474, 18028, 9950,

+ 13960, 29876, 12836, 5030, 23706, 18561, 17143, 8646, 16567, 32761,

+ 17247, 13657, 11224, 8259, 17340, 32213, 11763, 24205, 13651, 13557,

+ 12575, 30368, 13974, 18935, 18424, 20407, 29862, 19720, 15173, 25489,

+ 17942, 12029, 6872, 7109, 25330, 10563, 21942, 6486, 24063, 25113,

+ 7544, 6791, 17221, 8444, 6385, 29424, 32715, 10083, 10769, 18898,

+ 30370, 429, 19209, 4776, 26404, 25688, 18096, 29694, 2174, 26995,

+ 20518, 4230, 32364, 16982, 15799, 26217, 2884, 12688, 27394, 14555,

+ 9014, 24865, 1626, 14322, 17618, 26858, 19820, 23224, 15050, 6497,

+ 32034, 8063, 11002, 24201, 30920, 9844, 5797, 20258, 27758, 23159,

+ 12290, 15388, 28301, 7210, 10487, 21586, 25837, 9032, 24356, 12405,

+ 12485, 2617, 2339, 23366, 26149, 14307, 18702, 10761, 4753, 7106,

+ 18498, 31030, 22254, 28731, 16483, 8561, 22691, 30509, 5537, 14524,

+ 19960, 25802, 26169, 29676, 10689, 27813, 13118, 15449, 10817, 9483,

+ 1689, 19930, 20297, 13463, 14927, 28913, 31648, 32257, 17666, 9538,

+ 17831, 15927, 12219, 20554, 15165, 20655, 6374, 17485, 7393, 3579,

+ 26782, 13200, 21526, 30878, 6699, 25545, 10508, 11294, 16073, 13780,

+ 31612, 16986, 7595, 21927, 724, 8990, 5440, 9864, 22932, 29173,

+ 8629, 16254, 22520, 3646, 11451, 3077, 471, 22914, 2698, 25861,

+ 3019, 14341, 18470, 13829, 15250, 32667, 12001, 668, 10164, 18621,

+ 8481, 24617, 6758, 21980, 13411, 14276, 7087, 1269, 11392, 25717,

+ 26313, 32614, 15407, 419, 20170, 7168, 11980, 32207, 22148, 10077,

+ 24408, 17794, 32681, 1652, 8384, 6787, 5427, 26474, 31586, 27470,

+ 29954, 29868, 25549, 16066, 7367, 15930, 20168, 2074, 32290, 19782,

+ 18071, 30494, 24071, 5629, 25977, 6298, 17254, 15269, 22901, 23312,

+ 14603, 23272, 21846, 19370, 26307, 20079, 4853, 8050, 17856, 8627,

+ 19126, 23749, 29758, 9744, 17493, 14597, 27751, 24092, 25827, 32399,

+ 8820, 13110, 24075, 3821, 19990, 10594, 25242, 21836, 25364, 1364,

+ 1087, 15664, 32053, 6346, 7822, 358, 17248, 10527, 29515, 26427,

+ 1538, 9245, 23526, 14827, 7344, 5908, 13378, 6748, 18190, 7208,

+ 25274, 30476, 5359, 12783, 8550, 16456, 6589, 12604, 27802, 11424,

+ 28444, 21813, 15024, 8599, 19146, 2476, 24840, 5279, 11209, 29612,

+ 19020, 30788, 25281, 26705, 25081, 2471, 31136, 17885, 22811, 4654,

+ 16003, 25353, 10328, 29050, 30169, 2201, 29487, 921, 30661, 10547,

+ 12418, 14205, 15557, 19313, 15442, 27053, 7570, 23093, 14027, 22331,

+ 19015, 20285, 21632, 15606, 15556, 27639, 1015, 30432, 10837, 29846,

+ 3176, 13283, 14479, 8549, 2498, 4543, 31099, 14939, 27119, 13639,

+ 29431, 4336, 20313, 13005, 13656, 19504, 31917, 23259, 17748, 15118,

+ 11743, 16164, 23840, 8442, 622, 953, 18645, 12470, 23785, 20608,

+ 25112, 10597, 23474, 30435, 28410, 18917, 20226, 8133, 26653, 3678,

+ 20525, 5562, 27161, 27675, 24103, 32631, 22045, 32665, 9031, 7815,

+ 26074, 24798, 18508, 26176, 13980, 4620, 30878, 32502, 4026, 15414,

+ 31702, 2414, 26673, 11890, 2175, 13973, 28556, 21296, 13342, 1906,

+ 7687, 4042, 9329, 18778, 4083, 16988, 26101, 8803, 12380, 20949,

+ 2986, 16923, 30442, 1102, 31770, 2681, 15621, 3995, 3992, 17683,

+ 28220, 6176, 25542, 14482, 6120, 4582, 2138, 12899, 7180, 14319,

+ 26913, 22704, 2944, 3526, 6468, 22671, 27471, 8025, 25546, 17529,

+ 26973, 29451, 17758, 14077, 17485, 25094, 13138, 3509, 27297, 19150,

+ 21477, 20602, 5411, 21020, 3009, 6356, 24708, 9705, 1224, 3508,

+ 10820, 30409, 4624, 18278, 13521, 7034, 5420, 12225, 22259, 4797,

+ 18606, 12961, 14951, 22372, 5097, 21143, 28107, 15021, 19452, 30174,

+ 19898, 14542, 1548, 32657, 2359, 31697, 24272, 2332, 17743, 162,

+ 23379, 20465, 9210, 4711, 18165, 11132, 12867, 4111, 12979, 8024,

+ 424, 12334, 31145, 24003, 28868, 14088, 28373, 20047, 26411, 21227,

+ 6174, 27867, 2198, 4803, 6805, 5314, 9024, 10984, 15354, 3154,

+ 23951, 31802, 7554, 25728, 26359, 4464, 5079, 217, 12316, 1709,

+ 16481, 23484, 28214, 3924, 20420, 23239, 28090, 3614, 426, 18319,

+ 30775, 29546, 24002, 16532, 20861, 21972, 14857, 13940, 4101, 30984,

+ 30280, 18782, 21645, 14041, 4317, 6858, 9475, 32397, 30911, 26471,

+ 28324, 24187, 16573, 32085, 29541, 19417, 6150, 25237, 9874, 7375,

+ 11246, 16318, 15541, 26831, 22255, 25329, 29369, 17193, 16622, 28430,

+ 20559, 986, 21696, 2856, 27025, 4773, 12013, 9783, 25573, 26726,

+ 27060, 8973, 16933, 15010, 27215, 140, 15357, 1378, 4984, 21013,

+ 9364, 26434, 299, 7235, 9326, 965, 12718, 27098, 19089, 24555,

+ 16335, 11514, 14566, 27910, 4717, 16537, 28643, 13769, 9529, 7728,

+ 32103, 24994, 20158, 7091, 4837, 586, 10143, 17863, 18117, 24474,

+ 30496, 10800, 1287, 13728, 18664, 9864, 29482, 6386, 4102, 3895,

+ 19276, 30018, 31537, 17055, 29330, 23091, 24148, 31895, 20170, 2667,

+ 21834, 32283, 8015, 233, 997, 23873, 23853, 24729, 5942, 4463,

+ 26246, 550, 27656, 4044, 31029, 5136, 32430, 3060, 16560, 254,

+ 2047, 12528, 31539, 4181, 27550, 26213, 31259, 29961, 23423, 30219,

+ 400, 16052, 21670, 9569, 19302, 24805, 22834, 6048, 12613, 17594,

+ 2971, 3053, 16904, 6321, 3896, 19410, 18020, 21179, 20996, 24047,

+ 30922, 6290, 9121, 20717, 29838, 589, 15773, 12980, 8264, 27442,

+ 8437, 2014, 6011, 17611, 27863, 22379, 22388, 8252, 4780, 7862,

+ 13173, 25043, 2902, 16807, 21523, 21217, 29110, 19243, 17885, 1480,

+ 9842, 4577, 23358, 16470, 24821, 5399, 26021, 24657, 20919, 9716,

+ 2530, 28243, 14782, 12534, 13268, 21208, 7013, 15264, 27969, 24982,

+ 26716, 27244, 7173, 12045, 20720, 8967, 27503, 25694, 6284, 7869,

+ 25832, 1376, 4992, 306, 31701, 23793, 12802, 18260, 4287, 906,

+ 15474, 8845, 12209, 13335, 9443, 5181, 3554, 25349, 4566, 23911,

+ 2708, 19356, 1608, 5803, 14140, 26511, 19184, 1140, 10979, 1233,

+ 31938, 31602, 9420, 28075, 25783, 26955, 16983, 22284, 31952, 21901,

+ 19493, 2336, 18009, 28392, 24189, 30243, 21867, 30874, 28911, 13176,

+ 13748, 11306, 311, 2293, 3194, 25433, 25956, 2690, 7134, 7766,

+ 2361, 28642, 2910, 14897, 6867, 7888, 6558, 27538, 27276, 6990,

+ 7016, 20907, 544, 21050, 27633, 13675, 14094, 29218, 12894, 18676,

+ 15425, 18009, 8326, 31568, 30448, 18506, 3834, 13407, 6851, 23309,

+ 6723, 3348, 20791, 25912, 9578, 22497, 28739, 15608, 26046, 3440,

+ 1084, 6752, 23505, 29076, 12534, 1024, 24004, 1151, 11820, 27066,

+ 5828, 5173, 25377, 25041, 8149, 577, 25992, 15427, 5582, 4518,

+ 24481, 24665, 20645, 20760, 8614, 10364, 8173, 30060, 25189, 12362,

+ 12445, 14414, 29486, 18665, 19, 3890, 27375, 1947, 89, 20109,

+ 3230, 8851, 20902, 3396, 27863, 4104, 13608, 23652, 6855, 7047,

+ 7424, 10005, 20552, 25997, 32143, 20169, 27981, 341, 17392, 22457,

+ 17025, 9455, 5573, 14738, 28459, 8082, 15927, 10347, 22101, 2611,

+ 27704, 27131, 28461, 26198, 9739, 2825, 29867, 7973, 5639, 2339,

+ 14452, 8383, 5272, 17555, 7423, 31186, 4998, 20111, 31478, 15212,

+ 20090, 26544, 30175, 2830, 25790, 17062, 1019, 6915, 16452, 24361,

+ 11630, 31983, 28138, 4402, 18081, 683, 19196, 2156, 10725, 8528,

+ 11258, 27621, 13401, 2706, 24732, 24074, 2573, 28752, 14612, 31954,

+ 25959, 9832, 28819, 12857, 30150, 5840, 8462, 26864, 4454, 15331,

+ 9282, 31059, 16004, 5368, 1526, 25243, 22466, 18745, 27520, 9301,

+ 20428, 27827, 5258, 19475, 22588, 7081, 22806, 2913, 28603, 24622,

+ 18624, 27130, 7017, 5619, 20291, 26684, 20352, 16477, 575, 9690,

+ 19252, 1754, 31802, 24785, 27613, 19318, 26852, 24733, 15191, 4009,

+ 9887, 8620, 15785, 7027, 8510, 21779, 16870, 6827, 18957, 2176,

+ 14929, 9365, 20754, 2671, 24516, 25010, 915, 24225, 9299, 17372,

+ 29657, 22218, 14636, 1170, 20019, 9099, 11201, 23952, 32573, 29087,

+ 24106, 12194, 3937, 26457, 24260, 3003, 22431, 5710, 25375, 21057,

+ 29578, 13647, 27159, 23724, 5267, 13978, 18752, 25935, 6794, 3664,

+ 10632, 8565, 5474, 15658, 14103, 16816, 5173, 29544, 2170, 19566,

+ 25991, 24587, 257, 1741, 11471, 68, 12901, 24497, 28980, 812,

+ 430, 4371, 2452, 5557, 4948, 27548, 2506, 10977, 17061, 114,

+ 5425, 5170, 10342, 7506, 14948, 32353, 29885, 20191, 15432, 9811,

+ 8271, 23865, 27725, 23112, 14501, 30418, 31216, 6998, 19412, 32125,

+ 23429, 29462, 14173, 10696, 13363, 20893, 24146, 30860, 23360, 1965,

+ 2746, 5826, 26766, 12589, 32311, 16280, 27238, 9175, 30182, 16581,

+ 10357, 13873, 9607, 6425, 6164, 29374, 28126, 25944, 26061, 2933,

+ 21080, 3912, 14362, 8562, 29170, 29449, 3951, 13548, 1879, 28325,

+ 26491, 20839, 13384, 4072, 32172, 18986, 7233, 21618, 24817, 6900,

+ 4698, 12298, 11971, 16619, 24171, 19765, 8550, 8149, 23923, 15367,

+ 21356, 18314, 315, 826, 23676, 11689, 29494, 18301, 11089, 12171,

+ 24236, 32014, 16645, 28789, 9751, 22411, 12688, 26642, 1998, 27654,

+ 3468, 13600, 30176, 14679, 6459, 2153, 9539, 2742, 29898, 15349,

+ 6190, 26761, 6615, 27262, 10179, 2938, 21042, 6948, 20721, 1485,

+ 3040, 21858, 18585, 5872, 11878, 12609, 6895, 23892, 21828, 14283,

+ 23076, 23164, 5055, 10179, 8258, 32084, 9699, 29331, 26711, 9923,

+ 13001, 1414, 725, 23683, 1046, 13111, 10553, 7729, 22212, 20810,

+ 29931, 4256, 10533, 24153, 15717, 29555, 10788, 17457, 8600, 5355,

+ 11727, 2623, 16523, 14333, 19218, 3141, 25926, 8360, 1733, 2385,

+ 10734, 14981, 12266, 7920, 22065, 3488, 20783, 1183, 31973, 30086,

+ 23483, 7042, 7403, 20127, 28454, 9817, 18778, 3518, 25289, 15791,

+ 7385, 30199, 29753, 21588, 31821, 24753, 16142, 24590, 27829, 19451,

+ 25065, 31372, 81, 8996, 29877, 3739, 7946, 30085, 13356, 26013,

+ 11790, 4002, 1693, 10550, 23227, 10866, 15853, 11592, 3262, 9466,

+ 15069, 5666, 17276, 31777, 21898, 12020, 25265, 29887, 12090, 1158,

+ 12886, 11255, 20821, 6186, 5577, 455, 15794, 16112, 15912, 4573,

+ 21524, 280, 23549, 11948, 12533, 3533, 5153, 4800, 27010, 5904,

+ 15322, 15438, 18662, 10738, 8263, 10000, 29387, 22278, 23806, 22607,

+ 3870, 16150, 1523, 28994, 25363, 22549, 10396, 15254, 31594, 32341,

+ 26706, 25678, 19440, 9722, 14843, 22733, 26696, 16559, 742, 31281,

+ 14827, 11159, 7926, 6883, 22382, 14726, 4611, 31340, 24836, 11634,

+ 26749, 13195, 1603, 14628, 2898, 20612, 6443, 21555, 2834, 31162,

+ 21092, 32563, 9810, 29312, 10951, 18218, 3918, 22573, 28192, 7491,

+ 13522, 22382, 27442, 22215, 4698, 19425, 25852, 26952, 19320, 32223,

+ 10555, 14112, 5750, 29337, 28720, 26, 14908, 614, 27043, 19054,

+ 9077, 10587, 6952, 22515, 21742, 17949, 29601, 31632, 14142, 15091,

+ 14340, 25331, 2988, 9503, 11615, 10374, 1613, 7791, 9241, 16799,

+ 21357, 15631, 18554, 7416, 3120, 17825, 23661, 1374, 24185, 17295,

+ 16005, 7341, 27659, 31648, 25151, 763, 9455, 27850, 7559, 32276,

+ 8469, 21320, 28541, 13607, 15678, 25068, 9336, 21694, 32536, 9653,

+ 31563, 12019, 1195, 18340, 12232, 11233, 757, 8396, 3715, 7770,

+ 6097, 21673, 30169, 20696, 29470, 26034, 26672, 24245, 6940, 30769,

+ 4991, 11678, 20505, 14163, 29202, 6981, 21326, 4219, 26759, 13142,

+ 5380, 14556, 1309, 429, 3579, 12615, 17454, 21702, 18443, 15425,

+ 32249, 1140, 23052, 31321, 24997, 4310, 23284, 8377, 8579, 11655,

+ 4159, 32250, 13460, 3350, 23444, 16701, 20811, 182, 11173, 14199,

+ 1427, 16438, 29783, 29452, 4116, 28211, 29219, 4512, 24242, 11404,

+ 15547, 5161, 22103, 21782, 27889, 32073, 18419, 10897, 22997, 10716,

+ 14017, 5595, 12574, 6093, 21451, 17252, 28364, 3885, 21168, 13538,

+ 30731, 24966, 31653, 6982, 23897, 13164, 7866, 3310, 2027, 1110,

+ 19551, 27676, 22093, 26796, 30502, 4519, 27722, 10785, 25290, 4080,

+ 14859, 16963, 1137, 8728, 32387, 25424, 14382, 7024, 18698, 844,

+ 28618, 27441, 15943, 7504, 16068, 2158, 9300, 7461, 26518, 23110,

+ 31261, 10514, 20026, 28766, 7689, 15857, 29677, 8079, 18397, 20872,

+ 24627, 22235, 23005, 28439, 6939, 16550, 19764, 558, 7364, 1058,

+ 15765, 17345, 22048, 15116, 22563, 32126, 14072, 28566, 12686, 5982,

+ 21808, 13988, 18303, 9083, 6477, 14906, 12599, 23585, 5172, 18485,

+ 17267, 18471, 25140, 14650, 11154, 31104, 16199, 17389, 17913, 6669,

+ 12437, 4195, 13239, 15029, 26426, 8153, 29541, 6328, 16457, 23718,

+ 336, 19776, 1553, 26222, 17115, 6970, 22175, 28313, 16670, 20323,

+ 21380, 14595, 30419, 26278, 32472, 5365, 13683, 28325, 27006, 25173,

+ 26012, 21654, 5802, 30489, 9910, 5712, 14497, 30977, 4566, 2469,

+ 10944, 32646, 9186, 11763, 19648, 4622, 4855, 15350, 9016, 22113,

+ 4871, 26592, 24931, 864, 19911, 2476, 16420, 27637, 4552, 8111,

+ 17991, 13894, 31971, 24432, 26122, 4910, 9691, 18617, 5084, 2541,

+ 2366, 28398, 14948, 11294, 15756, 27806, 12229, 17898, 12955, 13656,

+ 4129, 24188, 58, 14784, 8540, 7348, 2069, 4577, 9250, 25632,

+ 28377, 8645, 13867, 15912, 12440, 27715, 10685, 25480, 21614, 2073,

+ 30323, 31236, 869, 27451, 10046, 23126, 1686, 106, 27049, 29292,

+ 28817, 15111, 8801, 6096, 30207, 7466, 10996, 24168, 14726, 25583,

+ 7385, 18271, 3821, 19984, 19889, 23651, 31105, 12473, 24780, 2833,

+ 27063, 20119, 4591, 21677, 32274, 9523, 7508, 9751, 19271, 9342,

+ 26867, 27642, 28576, 1196, 21248, 14151, 30110, 11846, 18869, 1506,

+ 18914, 26747, 4177, 923, 18509, 16824, 21857, 22367, 9319, 26232,

+ 32318, 20655, 12541, 23132, 19415, 2386, 19215, 18302, 15536, 20295,

+ 27625, 22531, 20523, 27390, 9871, 19951, 3847, 5576, 5214, 19773,

+ 32038, 13451, 29937, 3120, 22675, 10938, 1346, 24036, 18883, 22916,

+ 21009, 19240, 26907, 8012, 2442, 11664, 15795, 27482, 4130, 197,

+ 6490, 14800, 23746, 24096, 30170, 3039, 24615, 22135, 14205, 12346,

+ 31625, 7735, 30927, 28619, 19066, 16307, 17318, 29350, 17426, 18364,

+ 23392, 28987, 30537, 8306, 31852, 1487, 26276, 3673, 13580, 12845,

+ 18196, 944, 15192, 28056, 9755, 15870, 25735, 20229, 15152, 25069,

+ 8554, 10119, 26725, 2395, 9273, 8459, 11847, 30639, 5010, 13637,

+ 5893, 26729, 28351, 4330, 23765, 11262, 1848, 14112, 20372, 1762,

+ 13160, 31027, 15788, 1766, 7860, 5769, 25659, 17092, 23226, 6360,

+ 10866, 14328, 5590, 16534, 11323, 15058, 6891, 5553, 22558, 11466,

+ 32352, 28801, 9317, 27923, 7272, 3835, 8062, 14195, 19591, 2599,

+ 24482, 25937, 28242, 16340, 5556, 17680, 13174, 1162, 18284, 31643,

+ 19195, 12736, 29876, 9281, 20938, 25679, 11346, 8900, 11373, 32551,

+ 21448, 23468, 11799, 17984, 9848, 18145, 12516, 9684, 12300, 4217,

+ 865, 31180, 17941, 15311, 20303, 27000, 17650, 31957, 23972, 11138,

+ 5108, 15275, 23507, 17957, 13504, 30320, 1613, 8090, 25076, 30040,

+ 23624, 29395, 269, 1278, 16575, 31852, 27528, 11004, 11450, 29663,

+ 21319, 2234, 22223, 9463, 17975, 24707, 29673, 15751, 5424, 28894,

+ 30024, 9051, 8732, 6683, 26569, 26223, 22876, 556, 22632, 9055,

+ 23143, 10934, 25091, 27167, 5044, 11624, 18529, 31980, 21979, 4748,

+ 17522, 31618, 8695, 30171, 26072, 20112, 14158, 28054, 11687, 26473,

+ 9268, 26578, 18025, 10236, 24108, 29204, 32102, 1798, 9553, 7965,

+ 24866, 17542, 14068, 32519, 10534, 17010, 4999, 23953, 19203, 21928,

+ 23481, 15032, 24725, 8999, 2275, 12679, 17285, 23935, 1187, 16687,

+ 529, 30342, 25542, 11354, 4368, 6477, 18540, 25277, 24368, 82,

+ 12134, 10476, 11651, 31735, 11491, 29299, 20794, 15667, 23628, 8738,

+ 17072, 14472, 1900, 9384, 7594, 13621, 18644, 6500, 30429, 23724,

+ 11646, 32119, 10928, 24134, 6576, 3358, 2372, 31542, 29987, 20287,

+ 945, 3772, 25189, 32577, 16019, 26267, 1404, 18721, 11718, 32716,

+ 7628, 3010, 7533, 31604, 30523, 5509, 19513, 24596, 30354, 3866,

+ 31464, 31487, 17702, 2198, 5387, 30226, 24505, 23749, 22285, 30111,

+ 3227, 24257, 5489, 21162, 32020, 1475, 2395, 17752, 7687, 2874,

+ 18002, 5028, 23503, 12058, 15684, 6228, 23917, 5751, 28874, 13867,

+ 31461, 30802, 16046, 2913, 29413, 3251, 25259, 31056, 9128, 29176,

+ 5747, 21616, 19226, 31852, 29431, 20613, 4669, 9243, 30434, 32023,

+ 26571, 1253, 22118, 26147, 28189, 9426, 30780, 11536, 75, 29861,

+ 17382, 11748, 4757, 16052, 9528, 1208, 29185, 30710, 26902, 1898,

+ 10054, 10078, 22399, 1937, 233, 22375, 11979, 28854, 2214, 17905,

+ 25648, 5825, 26641, 17995, 19851, 18609, 125, 2449, 6237, 31632,

+ 14877, 16696, 12820, 8614, 20073, 20455, 1421, 494, 4547, 31880,

+ 12758, 9158, 91, 23456, 7736, 8938, 4688, 25307, 3957, 32675,

+ 6936, 23276, 8782, 16188, 14369, 9107, 20296, 28854, 4792, 32255,

+ 23472, 27069, 31019, 20823, 23517, 20442, 4906, 7572, 10933, 16873,

+ 13683, 4241, 31347, 13774, 6319, 29029, 25255, 24164, 30614, 22000,

+ 3965, 11702, 22618, 22196, 30275, 18290, 1347, 13542, 13094, 30618,

+ 30870, 9925, 29756, 381, 16316, 15915, 5576, 23270, 6560, 7522,

+ 21433, 10131, 21593, 28216, 13427, 2280, 11785, 20310, 4306, 5605,

+ 15621, 11213, 23916, 3926, 9014, 12530, 6423, 9289, 4287, 22124,

+ 1196, 23237, 23007, 11403, 2058, 28857, 9241, 25820, 26717, 18739,

+ 28307, 18682, 13216, 14802, 31165, 5030, 1376, 19582, 21042, 24602,

+ 2243, 18774, 739, 9115, 23498, 7402, 12914, 25934, 14291, 28331,

+ 12252, 10316, 866, 31648, 12891, 15352, 12576, 2394, 20619, 26257,

+ 4132, 1321, 29387, 7683, 29042, 9104, 17638, 17155, 18113, 5111,

+ 27379, 4698, 7810, 7328, 32121, 16513, 8477, 13020, 4311, 29551,

+ 29566, 25471, 19427, 3759, 8912, 8081, 20946, 1461, 32136, 16710,

+ 856, 10354, 32166, 23856, 23311, 7718, 10295, 13236, 26909, 630,

+ 1567, 22203, 12818, 22718, 6677, 22441, 29967, 18856, 30703, 4499,

+ 7469, 24318, 24864, 25517, 25116, 12732, 2687, 28673, 23563, 15978,

+ 28490, 12903, 3784, 21416, 21866, 945, 12329, 20235, 26360, 23846,

+ 11690, 7207, 1281, 28722, 13655, 10733, 14214, 26203, 17901, 19000,

+ 24263, 23927, 2620, 12194, 2498, 29724, 975, 32156, 5622, 31321,

+ 18639, 7870, 31852, 6819, 22821, 21851, 28664, 3858, 20191, 14937,

+ 12477, 14030, 28117, 7743, 14575, 8132, 22156, 144, 9949, 22685,

+ 24666, 4440, 2094, 7920, 24267, 28932, 27242, 15798, 22084, 8822,

+ 21693, 12287, 25574, 25433, 3832, 23524, 23733, 24242, 23001, 31165,

+ 26618, 28088, 31884, 31636, 6374, 23270, 19313, 2265, 19319, 23374,

+ 3104, 25174, 18592, 12848, 23211, 16998, 30116, 13003, 29731, 3426,

+ 4803, 5235, 2653, 26205, 19736, 19684, 1269, 31761, 10178, 25814,

+ 21396, 8728, 66, 31442, 13679, 2656, 12836, 26691, 6672, 13017,

+ 7650, 15568, 32601, 23408, 5893, 1001, 28870, 6209, 32141, 2208,

+ 3058, 21512, 1683, 3003, 11869, 22233, 30765, 8199, 12396, 9490,

+ 23698, 8431, 20913, 19085, 28798, 30540, 14957, 26138, 20696, 8319,

+ 13907, 2348, 11155, 11198, 3215, 16338, 30674, 8619, 6407, 21737,

+ 31055, 2603, 2785, 9873, 4861, 1141, 27717, 7901, 11500, 9577,

+ 22372, 9423, 12653, 4132, 31929, 6531, 25976, 31953, 24206, 13738,

+ 8266, 8641, 26051, 23354, 9810, 12991, 13259, 12132, 11086, 27293,

+ 22007, 4295, 16306, 21267, 15863, 15843, 11593, 16074, 9118, 16336,

+ 1822, 10675, 13285, 27951, 28829, 29597, 12595, 6498, 24566, 10503,

+ 26843, 17400, 24514, 20018, 8678, 23659, 5097, 24699, 26900, 28174,

+ 1475, 488, 24093, 18497, 31613, 769, 26172, 30439, 24255, 16097,

+ 26606, 7962, 30347, 32140, 29688, 5149, 30825, 20611, 32679, 14481,

+ 13505, 7574, 5211, 32748, 25224, 19450, 6215, 9256, 19998, 18331,

+ 5234, 25528, 28535, 20147, 7169, 23488, 11130, 15772, 14521, 21125,

+ 17574, 19683, 192, 1571, 16123, 30109, 14755, 21374, 15128, 28670,

+ 11421, 18810, 3233, 39, 4119, 31855, 4067, 1344, 10859, 11735,

+ 699, 32455, 4589, 7242, 25779, 31783, 11820, 4013, 8815, 10893,

+ 24181, 30118, 4168, 29943, 27033, 8786, 30774, 27278, 6896, 2363,

+ 16115, 24373, 12446, 644, 25693, 31330, 32533, 28775, 25373, 10284,

+ 28124, 22754, 13190, 8358, 12686, 18348, 30143, 31084, 26405, 3182,

+ 1829, 30075, 29816, 10544, 1771, 1862, 20995, 1297, 3587, 14598,

+ 8679, 14140, 7746, 28497, 14385, 32279, 3263, 14830, 30815, 14014,

+ 27516, 9960, 11297, 26799, 13896, 19425, 14172, 14791, 18147, 31145,

+ 19828, 24173, 21604, 19983, 3019, 23053, 472, 6135, 7557, 9160,

+ 16428, 16813, 19599, 873, 1869, 13689, 9183, 15003, 10893, 28788,

+ 1789, 20058, 19529, 14233, 25282, 1192, 13512, 8991, 23391, 27265,

+ 4199, 29703, 7074, 30224, 22771, 26609, 10613, 6435, 28247, 32563,

+ 25512, 22493, 8823, 26924, 3312, 14250, 15451, 2774, 2095, 6776,

+ 13968, 21403, 10741, 23077, 15563, 21610, 17223, 14387, 11472, 19721,

+ 18848, 30147, 7826, 9133, 16438, 10177, 14236, 31432, 18046, 7004,

+ 19887, 22818, 28658, 24249, 7341, 6187, 18706, 16872, 5045, 3216,

+ 11689, 25623, 32144, 7436, 21585, 8453, 2124, 15233, 13113, 29370,

+ 28710, 29767, 8742, 7030, 20910, 1987, 23992, 11239, 26405, 16956,

+ 20463, 14750, 13610, 1515, 16877, 22980, 27286, 15185, 23294, 13321,

+ 30628, 7118, 4309, 16862, 8277, 2670, 27929, 3556, 3602, 28422,

+ 19488, 1956, 9363, 18304, 30970, 16256, 7681, 25459, 19121, 7913,

+ 12887, 32247, 9935, 28883, 19982, 10679, 3361, 20070, 7161, 17223,

+ 4283, 17399, 26222, 23992, 25148, 16950, 5030, 23914, 20307, 12201,

+ 16742, 13602, 23426, 11865, 17375, 31068, 22050, 27083, 3028, 15843,

+ 4520, 305, 14330, 29086, 8230, 25058, 21924, 11437, 14613, 9736,

+ 5279, 9397, 11345, 19352, 29275, 15223, 1637, 22408, 8268, 23464,

+ 18953, 14652, 10640, 6140, 25321, 577, 7122, 16517, 13736, 17981,

+ 14190, 25147, 28965, 14118, 27350, 25820, 1277, 20915, 7476, 15094,

+ 24913, 11792, 3153, 22593, 25545, 18646, 16821, 25139, 5592, 22586,

+ 25360, 20175, 8258, 389, 25048, 26046, 6108, 708, 20020, 22432,

+ 1939, 9408, 20761, 24484, 23472, 2352, 4530, 9046, 4699, 10542,

+ 2566, 17593, 21853, 6120, 3797, 23190, 24874, 23960, 3778, 17171,

+ 23838, 32438, 19640, 1159, 2311, 875, 6534, 12429, 25572, 4938,

+ 20684, 32088, 12268, 31035, 7451, 2374, 30674, 9143, 18264, 31927,

+ 31048, 30011, 5473, 32287, 6338, 30966, 31731, 11354, 17020, 20421,

+ 10188, 4928, 23742, 26978, 8716, 20090, 12127, 24025, 5089, 20116,

+ 25736, 31547, 28003, 29778, 1722, 23445, 29629, 30280, 8210, 5923,

+ 31374, 17573, 24268, 26306, 19599, 24400, 25351, 19108, 1909, 21046,

+ 6599, 2375, 28441, 19426, 18752, 6824, 31702, 590, 12882, 21428,

+ 10290, 23032, 27472, 26111, 16833, 825, 22533, 1976, 16711, 466,

+ 25337, 22493, 28189, 21192, 23536, 21163, 20694, 9331, 8116, 27225,

+ 14625, 21713, 27924, 6149, 23281, 10784, 2861, 30959, 18140, 31147,

+ 9448, 19429, 16833, 12516, 32196, 25342, 16302, 29875, 25558, 23947,

+ 1537, 19214, 782, 15947, 14541, 714, 32187, 12766, 22399, 19888,

+ 28241, 6524, 27841, 16596, 13930, 11751, 30110, 12066, 16140, 20126,

+ 17383, 4666, 3626, 20820, 24534, 30078, 21869, 26016, 11506, 5992,

+ 24116, 24822, 22066, 13602, 30425, 1750, 17765, 13392, 17718, 8515,

+ 10705, 7984, 8807, 32119, 21019, 9958, 25554, 8405, 23911, 8209,

+ 13669, 18975, 1983, 11682, 26911, 4841, 5561, 3566, 24530, 17742,

+ 9044, 15874, 28455, 14817, 23076, 26422, 26850, 20966, 21167, 19205,

+ 10087, 25027, 9494, 8475, 17277, 8113, 27896, 7088, 22355, 27319,

+ 17555, 1557, 29377, 32217, 31532, 12684, 9423, 25485, 2737, 9309,

+ 15995, 15726, 4254, 16166, 12983, 13364, 19997, 19571, 14258, 9188,

+ 29553, 11918, 3416, 22596, 14996, 8089, 3356, 28050, 5407, 14297,

+ 26357, 10613, 29035, 11861, 12198, 24628, 23286, 1952, 9283, 14886,

+ 31240, 9971, 18161, 28010, 13974, 30078, 14573, 16343, 614, 5120,

+ 30160, 25910, 3700, 19094, 21521, 3503, 28565, 10960, 28363, 14466,

+ 30298, 6154, 23744, 7928, 15927, 10746, 22687, 19352, 14308, 7557,

+ 16002, 12701, 13060, 18391, 699, 22696, 11013, 16306, 1488, 28851,

+ 23367, 12550, 27076, 25158, 24192, 3779, 19608, 12013, 23903, 5867,

+ 3090, 13801, 4207, 23787, 30397, 12582, 6463, 20011, 3633, 32365,

+ 30400, 25828, 16020, 2267, 6382, 32050, 12129, 26258, 22450, 106,

+ 4456, 32430, 20743, 23213, 3607, 19323, 29277, 28349, 15351, 3301,

+ 12602, 31760, 15481, 32559, 14119, 11043, 26355, 27112, 1226, 13329,

+ 9446, 6939, 20560, 21348, 25474, 8903, 8974, 299, 15980, 25230,

+ 31335, 7757, 18366, 17841, 28656, 3100, 4432, 13628, 11474, 25133,

+ 23350, 7294, 11376, 13928, 2953, 4540, 4682, 11099, 21355, 30503,

+ 5921, 14547, 9541, 10250, 20829, 25262, 24659, 1608, 23723, 20971,

+ 21859, 31750, 9450, 1027, 2265, 17829, 22600, 1148, 22007, 6131,

+ 17576, 25787, 22363, 30370, 9288, 26138, 14537, 20217, 7584, 2618,

+ 22059, 10953, 31373, 32155, 19414, 4003, 23214, 4201, 23567, 24136,

+ 25870, 12697, 19918, 18017, 15620, 8245, 10434, 8816, 15960, 18164,

+ 29332, 20487, 17575, 30222, 20848, 22584, 521, 28494, 14274, 31820,

+ 10480, 30825, 32061, 31415, 27988, 26510, 2338, 8268, 8461, 24126,

+ 29119, 31150, 28544, 9822, 13622, 14599, 31869, 25995, 28543, 9212,

+ 27240, 6829, 12720, 7648, 2967, 6607, 24188, 8743, 17148, 31278,

+ 12282, 17182, 22532, 10895, 19112, 218, 16830, 8150, 432, 3182,

+ 11584, 20949, 12394, 19298, 17223, 31330, 19745, 12128, 28957, 19116,

+ 6426, 13871, 14528, 2767, 4562, 9702, 19520, 22437, 1928, 22873,

+ 30825, 29407, 31995, 12504, 8866, 22869, 13429, 31513, 24085, 5019,

+ 3592, 27250, 23568, 29909, 6936, 27211, 15275, 15308, 2842, 26836,

+ 31916, 19009, 21914, 26867, 6567, 26241, 17795, 28801, 3434, 15161,

+ 18843, 9909, 18328, 2444, 11853, 14048, 21651, 16739, 9387, 19291,

+ 15519, 29700, 15027, 13502, 24133, 21735, 10449, 4435, 18422, 15556,

+ 6310, 2251, 21745, 25329, 18696, 28719, 4455, 16619, 13130, 27161,

+ 10716, 21555, 5565, 22307, 27088, 12891, 1910, 10912, 3487, 9056,

+ 31058, 30602, 27558, 13882, 18488, 18876, 14503, 946, 17566, 8033,

+ 27502, 4980, 21327, 5805, 949, 5989, 2923, 9163, 14406, 28982,

+ 30127, 25366, 20575, 13882, 20726, 23435, 11354, 9588, 0, 17790,

+ 16781, 17397, 1139, 10637, 3440, 4965, 11039, 27603, 17405, 5855,

+ 19846, 5982, 15709, 6658, 19612, 32226, 26304, 28228, 10443, 32686,

+ 14989, 4746, 23354, 4064, 955, 30966, 21583, 18645, 28798, 24320,

+ 17267, 9444, 14375, 27593, 3093, 12108, 22597, 2219, 3057, 16746,

+ 11537, 10261, 5778, 8240, 26889, 28310, 18965, 3538, 12250, 29239,

+ 8497, 9154, 22659, 1038, 26228, 2271, 6840, 14352, 27855, 22506,

+ 11140, 7975, 12629, 19001, 3379, 26501, 19008, 31407, 5743, 22327,

+ 18229, 21739, 29865, 21757, 26313, 1216, 11707, 29529, 17731, 31205,

+ 25803, 12774, 26787, 21486, 26226, 26859, 19940, 19067, 16413, 4912,

+ 23423, 26032, 26292, 27152, 23856, 6885, 12410, 2000, 27900, 8606,

+ 9781, 1071, 28019, 5309, 28558, 16190, 31027, 13302, 24250, 20082,

+ 27565, 22916, 24410, 16376, 26412, 30746, 19616, 10312, 31763, 13597,

+ 29364, 11773, 21861, 29456, 16214, 2020, 3723, 24656, 26052, 8531,

+ 5714, 24065, 31198, 22716, 17204, 21320, 18056, 3201, 31960, 16570,

+ 25424, 27146, 7900, 10261, 19793, 13078, 30929, 7214, 1878, 27982,

+ 3975, 3371, 1347, 12320, 907, 9458, 26289, 1226, 16623, 18402,

+ 17625, 3253, 23625, 3520, 6067, 25093, 16638, 18164, 30303, 26222,

+ 5313, 25077, 14019, 29769, 29782, 17666, 12406, 9703, 28060, 28691,

+ 9948, 10021, 23242, 31503, 7827, 17728, 761, 17471, 8718, 12523,

+ 9187, 25347, 14720, 9887, 18666, 12995, 6652, 28979, 4956, 2601,

+ 20442, 31404, 22517, 29325, 26716, 24406, 13733, 29617, 24210, 14100,

+ 2452, 18351, 20346, 2292, 25700, 2863, 14700, 7430, 25782, 15837,

+ 19125, 8303, 6895, 10011, 899, 20409, 23100, 29426, 12033, 7021,

+ 6867, 6991, 30658, 31460, 20860, 29036, 7011, 24922, 24656, 23436,

+ 364, 2372, 1217, 6891, 14712, 2531, 26331, 11765, 9366, 27418,

+ 11722, 8886, 19950, 11133, 15771, 28050, 13992, 27818, 583, 6198,

+ 6409, 14812, 27629, 23758, 26335, 7357, 95, 376, 1824, 29820,

+ 9696, 2041, 5838, 17184, 2860, 1456, 12573, 25884, 20665, 14280,

+ 728, 26403, 22333, 10161, 11521, 28221, 22384, 29648, 15032, 26139,

+ 10003, 4213, 11869, 27047, 20273, 5390, 27129, 6624, 22437, 27035,

+ 30426, 22245, 27612, 26722, 28798, 3919, 15580, 18404, 5811, 6596,

+ 17541, 24847, 19195, 19658, 19991, 9653, 32053, 18648, 26613, 23357,

+ 19322, 10419, 8873, 28057, 22854, 3064, 16679, 28280, 8664, 12276,

+ 15958, 5308, 18907, 2748, 19404, 20526, 13381, 7290, 11737, 17776,

+ 24192, 27398, 6344, 17972, 18376, 23478, 29537, 6572, 26580, 24438,

+ 8883, 10561, 30904, 9499, 17168, 25992, 6154, 17908, 29272, 30578,

+ 835, 8354, 3963, 4547, 29545, 22058, 4921, 30405, 23531, 7497,

+ 26156, 1597, 4301, 24584, 22537, 26526, 6148, 22415, 7203, 9341,

+ 10788, 6718, 28464, 18245, 9784, 20474, 19024, 21036, 31985, 197,

+ 18251, 8805, 22276, 12690, 6682, 5015, 31437, 17239, 17322, 30607,

+ 13624, 18531, 25052, 13874, 18913, 17394, 16592, 10677, 11898, 2047,

+ 4451, 2832, 5486, 9561, 26870, 687, 3011, 8697, 28274, 12651,

+ 11845, 27027, 22664, 17850, 14817, 11371, 8510, 28962, 31567, 8298,

+ 4775, 20980, 25076, 22641, 4337, 9526, 14854, 9709, 17830, 21729,

+ 20977, 14508, 4139, 13901, 3833, 28911, 24461, 3305, 13601, 6080,

+ 22908, 9519, 26188, 29061, 29336, 7127, 7331, 24278, 23532, 9547,

+ 9270, 32652, 27064, 26972, 22502, 3098, 22388, 18227, 9602, 22817,

+ 3345, 5514, 7472, 14654, 18818, 13084, 4111, 12583, 22139, 31577,

+ 538, 12790, 10617, 29535, 29520, 19908, 5634, 17190, 17426, 6778,

+ 29998, 20218, 14540, 14052, 26214, 1327, 24791, 9735, 3436, 13328,

+ 25758, 29877, 29083, 31768, 32512, 23902, 25201, 12901, 9718, 24105,

+ 1354, 18281, 9846, 30019, 28782, 1507, 14231, 30583, 30542, 15885,

+ 18677, 13568, 3083, 12567, 4183, 24731, 23096, 20693, 6799, 27872,

+ 32481, 10165, 25506, 21457, 460, 31987, 14889, 31924, 29694, 2320,

+ 29175, 13342, 22401, 20096, 10748, 27217, 13413, 27299, 10601, 11207,

+ 32517, 29430, 6165, 2063, 13196, 12939, 5664, 23256, 19127, 23478,

+ 30422, 11084, 27612, 522, 8918, 5535, 43, 28803, 25971, 29415,

+ 2868, 12293, 10586, 13102, 27817, 20997, 26741, 7621, 28517, 21382,

+ 21264, 27612, 18862, 11336, 29243, 29008, 29367, 24124, 18799, 18372,

+ 29033, 6458, 15220, 12275, 2147, 18166, 13953, 7492, 25408, 4913,

+ 27558, 8096, 10520, 17452, 5479, 8064, 6217, 30562, 4522, 8266,

+ 3959, 5750, 21203, 31965, 10193, 6251, 27693, 21098, 17558, 25363,

+ 15756, 3463, 15320, 24778, 560, 19838, 31873, 7780, 18157, 4587,

+ 21907, 1379, 2953, 26246, 17076, 1645, 4966, 317, 25065, 18430,

+ 10592, 1670, 30370, 11611, 23289, 26611, 7671, 18887, 28340, 4358,

+ 6193, 5112, 6590, 22088, 19340, 28108, 14547, 23189, 25659, 21561,

+ 4192, 24250, 13741, 19330, 22501, 12098, 16655, 23473, 5278, 9356,

+ 1298, 12609, 1890, 26913, 31470, 13851, 12747, 31301, 25767, 14020,

+ 13975, 5836, 20622, 26580, 6478, 4143, 30220, 24490, 8485, 12767,

+ 20379, 22622, 25379, 13017, 5653, 19959, 14210, 25979, 305, 19678,

+ 7768, 6550, 29002, 1171, 22391, 25796, 26211, 29343, 12689, 17660,

+ 26729, 14794, 21664, 20835, 17591, 31117, 2948, 28005, 17632, 14794,

+ 20718, 12805, 17064, 16059, 9086, 369, 15699, 22825, 25896, 30938,

+ 21539, 1758, 18908, 13442, 18972, 30556, 6502, 6679, 30474, 18639,

+ 18579, 7487, 18885, 4417, 11669, 12916, 16308, 2061, 21416, 25618,

+ 30096, 25494, 12790, 15790, 13674, 16184, 18872, 426, 9712, 7551,

+ 28575, 23814, 32492, 23191, 17522, 3449, 26381, 8964, 8440, 11713,

+ 24298, 17043, 31000, 7223, 23876, 24465, 31295, 12198, 139, 30266,

+ 26882, 11869, 31140, 10356, 517, 15235, 5098, 13758, 25115, 11947,

+ 32371, 12131, 14766, 2472, 14996, 15603, 20322, 163, 21415, 1267,

+ 5621, 18539, 17419, 3540, 22890, 7947, 11117, 11042, 18278, 17058,

+ 14918, 19198, 22234, 19055, 30373, 14286, 21218, 5676, 15919, 8755,

+ 3309, 18333, 10596, 1852, 31263, 31336, 13348, 18137, 16371, 11815,

+ 20337, 32402, 29733, 5820, 16502, 31864, 5071, 18148, 28872, 24156,

+ 30162, 26896, 5101, 12608, 15479, 31344, 17947, 9483, 2646, 15440,

+ 2113, 10369, 32375, 20391, 15692, 369, 15288, 12013, 3235, 13616,

+ 32622, 31278, 19955, 21831, 2895, 18781, 25138, 1129, 26256, 30954,

+ 7646, 18344, 14922, 9366, 10374, 30696, 19746, 17543, 30092, 26515,

+ 25129, 8343, 14889, 4238, 32513, 3570, 1201, 24172, 23874, 10976,

+ 22809, 26850, 2843, 3295, 30390, 12923, 32573, 5365, 11079, 16269,

+ 9204, 24132, 22326, 6508, 7575, 31455, 1819, 4573, 20515, 29404,

+ 18050, 23246, 26659, 14763, 4078, 17988, 27347, 3494, 32286, 17044,

+ 4484, 30184, 8846, 26326, 29762, 21091, 9537, 9111, 18357, 12845,

+ 4542, 27598, 12869, 25627, 30041, 27153, 31873, 30097, 12979, 5641,

+ 8386, 5016, 11908, 15908, 32267, 561, 14744, 22921, 12852, 7658,

+ 23576, 13905, 24392, 7086, 26123, 22516, 24619, 31457, 26908, 6657,

+ 12416, 23981, 32670, 27411, 3017, 15254, 1229, 13312, 2000, 8789,

+ 8791, 16211, 11847, 30947, 22299, 13565, 22955, 30932, 23344, 32327,

+ 22894, 20966, 1321, 9739, 8532, 11226, 5271, 2340, 2078, 31362,

+ 1488, 27427, 22886, 22556, 21231, 17219, 16074, 23006, 17948, 21920,

+ 17484, 4818, 16654, 27811, 31737, 14564, 7629, 18113, 1225, 8250,

+ 3261, 3173, 30919, 195, 5080, 25130, 1649, 14867, 4923, 27470,

+ 14690, 2414, 29412, 20580, 13870, 26146, 23994, 7752, 28046, 30746,

+ 11725, 4440, 2749, 23729, 28128, 8417, 8481, 11716, 5157, 24280,

+ 23854, 32523, 23111, 32715, 15496, 17833, 22189, 7958, 4455, 24065,

+ 15102, 4954, 21824, 9164, 23520, 26411, 3746, 20584, 26118, 18953,

+ 20062, 4979, 25705, 3474, 2026, 6553, 31701, 757, 18695, 30122,

+ 32680, 19626, 5282, 8176, 17367, 30817, 25848, 32703, 20529, 30008,

+ 6398, 13133, 22760, 14896, 20736, 2500, 8269, 12514, 32392, 25494,

+ 9691, 14446, 11137, 27921, 18039, 21685, 15516, 26419, 12790, 24008,

+ 13043, 29375, 23008, 17311, 12525, 4496, 15731, 14863, 18017, 21038,

+ 14059, 24822, 18430, 22943, 11777, 15545, 13802, 16256, 21426, 4848,

+ 30121, 28756, 19265, 32607, 25409, 2587, 25727, 21801, 32155, 26407,

+ 19274, 8256, 12845, 19243, 20564, 23328, 3030, 26261, 12070, 11453,

+ 18697, 9245, 30052, 17081, 7470, 29854, 28498, 7131, 8517, 3365,

+ 15767, 22205, 14285, 19272, 30785, 22724, 26596, 13242, 778, 24917,

+ 29615, 16156, 30425, 23878, 11772, 26901, 17548, 3731, 21286, 13732,

+ 29941, 23635, 26937, 8373, 10786, 24298, 27479, 11251, 17890, 31871,

+ 17499, 32478, 22916, 10673, 23739, 19741, 17122, 8837, 16307, 30485,

+ 6815, 12195, 7072, 6330, 22444, 19395, 8618, 31397, 19473, 15714,

+ 2213, 6504, 24298, 30905, 14137, 14110, 10159, 24047, 22849, 11078,

+ 20153, 10126, 25714, 25809, 22274, 7476, 20541, 21113, 13613, 24203,

+ 1270, 9557, 22470, 23162, 17973, 8618, 1226, 18077, 7293, 29189,

+ 12394, 10995, 539, 12422, 12556, 21975, 22353, 6783, 29843, 19506,

+ 25012, 8766, 6880, 2542, 23251, 21286, 6552, 9902, 21017, 15365,

+ 19752, 12988, 26101, 21409, 6919, 24642, 6199, 2964, 2363, 19646,

+ 16830, 1370, 28447, 32432, 26960, 7593, 9059, 27541, 457, 16896,

+ 19284, 6681, 21368, 17539, 12126, 13449, 5318, 8710, 14543, 8071,

+ 30232, 28264, 31965, 26881, 9463, 23330, 30955, 9060, 2671, 3103,

+ 25608, 268, 18612, 11983, 14777, 17408, 15372, 1911, 25080, 21980,

+ 744, 26827, 6780, 7182, 20820, 18878, 1339, 23621, 5010, 28057,

+ 46, 17703, 9218, 21066, 10836, 28483, 6214, 22783, 14841, 27206,

+ 27042, 23796, 2104, 10865, 31913, 11401, 30143, 27210, 19478, 6296,

+ 3282, 21650, 15096, 3589, 1171, 2680, 21010, 28055, 2432, 23052,

+ 27777, 5638, 28477, 14582, 6047, 21589, 12180, 22376, 10792, 11873,

+ 23226, 24401, 22171, 15291, 23763, 13268, 15587, 179, 15545, 17656,

+ 16183, 32693, 14329, 19361, 7743, 29913, 24607, 447, 8312, 28597,

+ 7476, 10949, 18649, 16246, 14724, 93, 24759, 25903, 23205, 22361,

+ 22758, 112, 2996, 4333, 17953, 27163, 15586, 11292, 31915, 29043,

+ 23599, 2929, 3895, 28534, 27510, 17135, 13574, 9325, 14250, 586,

+ 23375, 5057, 5471, 28504, 26083, 21008, 18060, 1218, 25361, 31104,

+ 28047, 18687, 14023, 14419, 12657, 29059, 251, 11708, 30572, 17971,

+ 17225, 2289, 21930, 22813, 2526, 7810, 9040, 26214, 7060, 26601,

+ 18875, 28803, 30046, 8546, 15113, 27820, 5351, 31229, 12764, 5006,

+ 22134, 2545, 7770, 10817, 27157, 819, 25721, 22393, 9202, 20551,

+ 20345, 22784, 11269, 5463, 24242, 11620, 20723, 18306, 20367, 1517,

+ 563, 20086, 2267, 5329, 13679, 25665, 19259, 2987, 15149, 10084,

+ 19196, 24106, 18094, 4905, 5903, 7430, 11542, 21047, 29010, 32057,

+ 8142, 8036, 31762, 24427, 26151, 10442, 24781, 27566, 23104, 10525,

+ 21564, 5483, 11561, 11068, 7056, 7068, 13896, 11269, 30461, 22844,

+ 20988, 3694, 5493, 31228, 4993, 5585, 30134, 26424, 19988, 23176,

+ 22662, 297, 14679, 27834, 10301, 30812, 13558, 6516, 31109, 23395,

+ 28555, 1532, 2398, 11466, 29887, 5474, 23653, 5453, 26290, 19543,

+ 25429, 1607, 26270, 10050, 18638, 24686, 28855, 5777, 19541, 29374,

+ 12117, 5453, 20125, 26035, 2388, 3570, 29444, 26299, 28603, 381,

+ 31329, 10219, 11933, 9414, 15101, 2033, 17725, 26640, 23007, 30282,

+ 2421, 7391, 10573, 26549, 6745, 11786, 20623, 28391, 26135, 7696,

+ 8438, 19840, 18210, 16303, 15389, 4414, 31887, 23731, 28527, 4464,

+ 447, 16141, 26857, 24750, 2366, 20516, 10529, 1736, 7915, 17008,

+ 22152, 5884, 13657, 31044, 21996, 30316, 8822, 8939, 19521, 26319,

+ 20330, 14583, 28064, 10598, 8130, 23254, 15760, 20017, 21454, 13990,

+ 9349, 868, 27207, 29770, 32422, 30997, 17717, 22206, 2003, 11575,

+ 5648, 1959, 18663, 13259, 21798, 16687, 27194, 20309, 18492, 18959,

+ 3947, 28045, 23672, 30701, 8284, 23640, 22399, 11241, 9085, 19190,

+ 9178, 32115, 3406, 27517, 15518, 1887, 10527, 18566, 31820, 2875,

+ 32538, 8998, 21238, 24288, 23428, 27936, 10147, 22599, 23360, 13144,

+ 26869, 11166, 8597, 3211, 4361, 28571, 6961, 24638, 8351, 15377,

+ 29293, 6644, 21883, 5825, 6354, 7332, 8203, 8818, 2524, 2666,

+ 7241, 17476, 11007, 13437, 4579, 13121, 27880, 18273, 16281, 9781,

+ 4613, 1886, 30183, 5055, 15943, 12592, 17637, 14505, 13351, 21248,

+ 16747, 22645, 25319, 12691, 9592, 27704, 10778, 3522, 20437, 13228,

+ 30310, 24106, 26357, 23680, 7049, 20772, 8992, 13298, 3994, 11000,

+ 977, 5792, 27537, 21581, 29788, 4763, 21770, 11492, 9171, 28606,

+ 13638, 30342, 5163, 4670, 24947, 27707, 9371, 27521, 6189, 22973,

+ 6981, 27956, 30788, 18220, 29208, 12952, 21696, 3331, 27381, 21532,

+ 2594, 25675, 12048, 6449, 14573, 18191, 32154, 31834, 2405, 13583,

+ 11677, 13698, 23703, 12472, 1831, 16019, 3737, 2132, 14250, 1604,

+ 11795, 16255, 26019, 17715, 19710, 11482, 10106, 10547, 20140, 8195,

+ 25001, 19175, 22281, 9156, 20513, 8592, 16160, 12426, 16105, 26915,

+ 13025, 25369, 13833, 11935, 23585, 2943, 7334, 30365, 16098, 10310,

+ 5998, 12840, 10965, 8686, 9783, 30160, 26141, 23195, 17634, 9978,

+ 30038, 26122, 4998, 4986, 9430, 32201, 18891, 10084, 14130, 1448,

+ 31123, 13598, 23812, 13419, 25824, 954, 23020, 13505, 27378, 6019,

+ 31445, 21114, 20655, 26838, 16762, 2036, 26696, 32052, 26920, 32726,

+ 23578, 5780, 10437, 24321, 8402, 27902, 22033, 27332, 21205, 9813,

+ 20012, 24399, 735, 117, 18265, 2667, 13801, 24958, 28673, 32360,

+ 7249, 17006, 32507, 29014, 17461, 10230, 6410, 7288, 19231, 7558,

+ 12199, 12277, 21224, 26283, 15617, 11985, 15830, 23194, 323, 18204,

+ 30216, 7693, 9493, 31337, 17428, 12109, 25957, 10882, 30958, 30864,

+ 11367, 24154, 28428, 23686, 15322, 21315, 9927, 28975, 19598, 11873,

+ 517, 23791, 18211, 25183, 25365, 2532, 31251, 7520, 13018, 9079,

+ 28915, 21305, 4652, 4657, 20725, 14301, 14971, 27089, 24242, 15896,

+ 20917, 32155, 4390, 28289, 13674, 3826, 22012, 10922, 303, 18985,

+ 27404, 12441, 21568, 1431, 28963, 29308, 6761, 30441, 7170, 5784,

+ 23590, 21180, 9129, 13187, 23049, 2668, 23253, 7315, 30556, 7206,

+ 3783, 21142, 14344, 10565, 5191, 27843, 21941, 18139, 9705, 3569,

+ 12339, 15501, 30607, 14855, 7448, 9637, 9007, 8116, 23211, 10338,

+ 21206, 10848, 10753, 14226, 19437, 28770, 21606, 4707, 16316, 20851,

+ 8191, 30327, 1324, 22882, 30637, 14390, 8145, 15114, 18995, 13672,

+ 14375, 30594, 25756, 22019, 26908, 1427, 19415, 3905, 1743, 3439,

+ 22949, 7414, 17048, 3231, 8373, 25889, 20552, 30270, 23564, 14785,

+ 28850, 9061, 28075, 27882, 1386, 10214, 12396, 27415, 4556, 24381,

+ 8494, 20418, 19776, 17859, 9009, 10290, 10941, 29221, 25539, 22677,

+ 31116, 17173, 8477, 22350, 847, 5439, 22664, 12944, 19265, 5503,

+ 8132, 5164, 21183, 849, 11689, 14247, 1800, 30601, 22031, 1680,

+ 15425, 836, 31980, 20240, 22972, 15134, 17596, 18627, 7033, 677,

+ 31782, 23494, 3309, 11278, 3804, 24082, 8451, 16423, 32195, 15112,

+ 2913, 653, 8788, 14668, 16108, 1567, 16706, 21207, 13710, 26034,

+ 12380, 21320, 25911, 29959, 5046, 12411, 1569, 32250, 30211, 20829,

+ 3673, 24059, 16454, 14079, 1659, 6082, 21674, 15337, 7100, 11583,

+ 20653, 23984, 4910, 21968, 14980, 17611, 576, 25783, 7611, 32418,

+ 28804, 29643, 23325, 7656, 18102, 9837, 12243, 13611, 12025, 6334,

+ 14288, 24489, 19043, 20240, 28524, 19558, 24508, 14746, 30798, 32635,

+ 26499, 8303, 9616, 15793, 6450, 2993, 4894, 22094, 24004, 31745,

+ 19551, 16175, 19315, 1851, 17944, 14103, 3782, 11616, 12173, 25159,

+ 25803, 31188, 24297, 5455, 2721, 17610, 23775, 16931, 17978, 10492,

+ 21394, 15217, 27743, 415, 25778, 16946, 2037, 1174, 10984, 4480,

+ 1662, 19686, 27253, 23719, 3555, 26986, 13590, 29566, 24432, 17352,

+ 1322, 248, 27680, 29603, 5142, 6134, 32283, 21010, 28649, 607,

+ 7037, 24913, 5180, 1651, 1625, 23735, 2653, 5724, 32254, 1256,

+ 21676, 7686, 9592, 31820, 10564, 25393, 13146, 18368, 16350, 11205,

+ 20155, 18315, 14067, 7781, 15743, 15507, 21537, 4422, 18392, 11729,

+ 9168, 15170, 29963, 16898, 15381, 31528, 1400, 24991, 9943, 10583,

+ 19925, 13584, 14128, 10123, 22458, 21277, 19989, 8950, 27490, 13221,

+ 21050, 15507, 26288, 14994, 24368, 2999, 1392, 28428, 28624, 12009,

+ 32480, 13037, 2013, 24307, 7278, 3701, 8421, 14393, 11716, 25664,

+ 24168, 11850, 32258, 8564, 19773, 23989, 11850, 15935, 12848, 12318,

+ 6530, 8833, 11248, 1680, 9557, 17093, 11305, 24085, 9339, 2422,

+ 3053, 8836, 11835, 24656, 16216, 9115, 3886, 28180, 27764, 24653,

+ 14149, 23680, 26970, 7261, 18701, 14974, 26010, 29740, 11826, 20124,

+ 17117, 25296, 21827, 28092, 24777, 28261, 31924, 10764, 24613, 28328,

+ 12073, 28217, 8510, 8642, 21746, 22752, 393, 865, 32465, 27718,

+ 7305, 6669, 19972, 26184, 5107, 11962, 7551, 21653, 8977, 8857,

+ 20602, 14618, 356, 22324, 27179, 21182, 22669, 23738, 21205, 24144,

+ 20846, 23191, 28161, 25533, 31884, 26184, 26123, 25479, 6583, 15470,

+ 20705, 30834, 750, 4129, 4616, 16769, 15997, 25734, 7648, 10272,

+ 31848, 9380, 552, 22179, 780, 28019, 22468, 29423, 20228, 15926,

+ 446, 29047, 27210, 779, 23948, 5227, 16030, 11713, 18577, 27435,

+ 26412, 20713, 7910, 26114, 17769, 28976, 5977, 21009, 23870, 236,

+ 8374, 20873, 15464, 14836, 9286, 9246, 28959, 18869, 20886, 21432,

+ 21493, 898, 22393, 6507, 10498, 3372, 11856, 3753, 23614, 14803,

+ 22409, 32438, 23854, 1787, 13926, 27741, 24003, 28642, 26112, 8162,

+ 30847, 2834, 12427, 20791, 473, 9778, 3035, 17010, 2275, 21537,

+ 16167, 24191, 19242, 8518, 5646, 12306, 8157, 25121, 17623, 17632,

+ 7730, 20518, 25085, 20751, 774, 26828, 6379, 9963, 6596, 17121,

+ 31236, 22234, 11399, 20000, 3046, 2962, 16259, 12549, 496, 30345,

+ 7073, 14560, 15362, 24749, 27753, 4137, 29571, 13142, 29989, 12051,

+ 14761, 3449, 8515, 14947, 10996, 14622, 29692, 17539, 31740, 5396,

+ 6963, 9426, 17261, 18147, 10656, 22847, 9552, 18690, 15405, 9750,

+ 17292, 10570, 3744, 26649, 6060, 2987, 17275, 19667, 6626, 17694,

+ 25376, 25897, 22860, 8922, 22073, 17970, 26999, 12747, 24407, 11337,

+ 18722, 6720, 22489, 21600, 9796, 25572, 13328, 32663, 9040, 13807,

+ 4769, 21773, 439, 26525, 23338, 5621, 21934, 29920, 12328, 22509,

+ 10035, 11089, 14360, 14732, 9290, 9069, 476, 17722, 18573, 23038,

+ 2145, 30277, 7651, 32215, 6527, 5169, 31376, 17860, 9248, 22607,

+ 24686, 25281, 12709, 4497, 24953, 25194, 3717, 15004, 11665, 5555,

+ 26167, 13855, 11644, 20441, 22099, 9571, 20267, 4505, 15604, 3364,

+ 26430, 29855, 18016, 15520, 19402, 27457, 32235, 10989, 3161, 10349,

+ 26136, 16015, 27442, 17376, 23554, 13130, 31707, 28313, 18938, 4661,

+ 2781, 19342, 28018, 28688, 12999, 16541, 13338, 26071, 17013, 21445,

+ 29768, 30615, 22674, 26774, 1181, 23937, 22620, 29158, 30438, 25405,

+ 7079, 27590, 31296, 20865, 1573, 12725, 10368, 5601, 24036, 1299,

+ 17105, 7401, 3352, 22488, 8607, 4713, 12571, 12165, 23476, 31760,

+ 6834, 13403, 26785, 25148, 9106, 16587, 16992, 31505, 32035, 1327,

+ 18999, 3017, 23683, 5047, 29919, 29770, 10190, 26790, 486, 6398,

+ 2205, 17086, 16978, 7903, 1996, 24568, 12935, 11729, 5761, 29305,

+ 27499, 11573, 10345, 25026, 11975, 11963, 17221, 11303, 4849, 31607,

+ 10150, 31874, 4520, 30520, 30452, 18472, 32319, 19989, 31413, 2332,

+ 9982, 8264, 28940, 26755, 9669, 8256, 640, 27992, 9202, 22257,

+ 17663, 865, 5509, 623, 28707, 28258, 12162, 17083, 9908, 32144,

+ 7575, 2268, 31085, 4936, 15103, 31794, 1795, 21761, 21158, 18952,

+ 23907, 6016, 10894, 4968, 59, 23371, 24177, 27955, 14525, 27999,

+ 19880, 9841, 4768, 37, 8267, 18661, 10855, 20643, 10138, 2020,

+ 12517, 11247, 7579, 4456, 18433, 26858, 2053, 30049, 7351, 10794,

+ 16989, 5963, 25183, 31800, 29535, 24069, 4914, 9212, 29087, 5601,

+ 6666, 12661, 23408, 14584, 18793, 10926, 26117, 4544, 17341, 25325,

+ 10198, 27616, 14562, 21037, 25157, 18242, 7401, 206, 3714, 16746,

+ 15384, 23436, 12716, 10503, 20529, 942, 15417, 28616, 31480, 28543,

+ 30871, 28273, 18927, 28418, 19731, 12078, 10084, 26850, 21755, 12839,

+ 23725, 25512, 5375, 24660, 2483, 12080, 20189, 8339, 13741, 16990,

+ 14398, 17144, 23854, 8461, 6362, 13924, 8546, 24136, 5091, 15449,

+ 31892, 3773, 8353, 3852, 8180, 16238, 30298, 11708, 24216, 17578,

+ 28532, 17219, 18880, 30012, 10205, 23275, 25182, 9698, 23211, 22402,

+ 982, 30977, 17152, 24753, 27650, 22166, 1073, 14985, 1145, 8304,

+ 23847, 15199, 20753, 30365, 11013, 21466, 10146, 8226, 32522, 23882,

+ 5389, 27631, 19386, 8763, 4989, 7697, 27960, 21835, 30189, 15658,

+ 4343, 27192, 11499, 21534, 16529, 1341, 18587, 31760, 5111, 29855,

+ 23550, 17037, 20171, 26755, 9588, 16390, 27914, 23810, 8320, 29316,

+ 25326, 27263, 25804, 12439, 5139, 28728, 30317, 18575, 17880, 19740,

+ 27495, 8175, 4360, 6877, 2676, 26399, 5818, 8005, 18177, 13665,

+ 31861, 26573, 15994, 8454, 29592, 17260, 6855, 10210, 20473, 3757,

+ 32279, 31741, 29133, 1540, 23516, 2187, 1736, 4706, 25366, 17183,

+ 26245, 17415, 24021, 7451, 3623, 28568, 10745, 10603, 32577, 8561,

+ 12093, 19059, 1523, 23356, 30324, 31813, 10838, 20418, 17938, 3864,

+ 20762, 4354, 26605, 26102, 20334, 25728, 31813, 3508, 30240, 12768,

+ 32258, 16423, 22534, 16307, 23614, 10133, 20380, 12945, 19715, 30314,

+ 2030, 616, 15702, 10028, 3257, 23059, 628, 30897, 9677, 5423,

+ 12379, 31376, 437, 20522, 14732, 15829, 29594, 16028, 15376, 32249,

+ 18533, 15323, 8121, 22033, 30500, 18890, 27050, 22085, 12463, 29169,

+ 26905, 3460, 4747, 15571, 8532, 23414, 270, 13179, 5378, 7858,

+ 27844, 8025, 22188, 4914, 1810, 31820, 636, 29955, 10777, 20736,

+ 1348, 15169, 30685, 24954, 21697, 32579, 29863, 28657, 32034, 25619,

+ 8360, 32736, 10180, 4641, 21726, 20313, 32576, 6968, 26428, 31388,

+ 5287, 23216, 23045, 32232, 10764, 9702, 6777, 2449, 1603, 24809,

+ 4787, 23635, 13801, 19318, 4818, 6118, 23972, 6695, 21847, 17362,

+ 428, 12263, 8910, 29317, 26251, 2985, 22705, 15523, 28449, 15962,

+ 22409, 1693, 7146, 32019, 7254, 17541, 3972, 9108, 2353, 12321,

+ 15467, 15086, 8496, 9534, 8200, 22655, 15242, 6214, 12010, 26915,

+ 29179, 23317, 22099, 15529, 20074, 9225, 14070, 25988, 31690, 2904,

+ 31999, 16579, 32318, 29351, 31060, 14916, 13952, 2776, 24602, 8484,

+ 13443, 27683, 20604, 8313, 7511, 29800, 2471, 12356, 10318, 24515,

+ 28953, 4769, 30557, 20322, 19996, 12609, 20164, 12947, 24205, 28442,

+ 28657, 17953, 10466, 16989, 7074, 7649, 12140, 10921, 32587, 27784,

+ 26840, 22398, 4535, 32191, 8700, 4852, 8945, 5754, 11473, 17581,

+ 9061, 12165, 187, 8456, 26179, 15967, 12305, 22679, 25380, 76,

+ 22233, 23508, 15088, 31654, 26323, 1807, 1023, 11124, 29882, 19115,

+ 8574, 2366, 27334, 9098, 10773, 26911, 17525, 30662, 8646, 23579,

+ 14219, 11170, 2841, 3251, 28247, 704, 4982, 18871, 14137, 8596,

+ 24274, 13148, 19809, 17176, 13966, 16014, 7897, 30401, 8091, 647,

+ 13254, 31410, 7139, 1185, 6891, 1585, 6884, 30312, 32622, 6231,

+ 23966, 6644, 19423, 7947, 20912, 16502, 32374, 2609, 10174, 5904,

+ 4764, 7966, 10517, 13802, 9133, 8271, 4242, 9602, 11517, 7515,

+ 27328, 20035, 2841, 32551, 16704, 1626, 8783, 9305, 5486, 12741,

+ 20080, 8719, 28225, 10412, 32724, 31952, 32115, 22517, 10655, 28099,

+ 8162, 20499, 25923, 2078, 15671, 13854, 28486, 21218, 19141, 19241,

+ 24902, 10950, 30132, 32208, 19770, 112, 14430, 14864, 7674, 18155,

+ 24313, 27484, 24834, 9814, 16247, 25836, 23922, 18137, 10410, 9305,

+ 7258, 18398, 19628, 8807, 17973, 14205, 10878, 9761, 31155, 7735,

+ 15087, 20012, 32700, 29416, 25791, 17493, 177, 2807, 31749, 20332,

+ 7925, 23248, 20686, 14165, 6828, 6804, 4359, 12124, 25282, 8974,

+ 413, 15049, 14127, 5866, 21218, 16308, 16506, 11297, 5171, 15387,

+ 16508, 10680, 2776, 20786, 16487, 28074, 28715, 6394, 24583, 3875,

+ 23292, 31253, 10823, 28910, 22581, 28121, 4854, 22577, 30394, 27811,

+ 459, 23384, 19091, 29806, 3751, 15695, 11085, 23972, 21275, 2292,

+ 12701, 29235, 29994, 204, 14407, 31460, 20304, 14068, 25662, 14057,

+ 22979, 24923, 30733, 29108, 14584, 15919, 30325, 11024, 5481, 7317,

+ 22616, 1386, 8342, 23965, 22998, 28271, 27465, 373, 8885, 13789,

+ 28959, 5341, 19974, 1682, 32068, 4826, 5381, 30186, 19582, 3759,

+ 8514, 7495, 4205, 14857, 18942, 29169, 14353, 7034, 16600, 20257,

+ 8588, 2344, 29097, 26200, 6441, 15303, 6572, 2549, 18846, 3524,

+ 23010, 1543, 398, 15043, 18612, 31584, 29266, 13132, 18139, 28907,

+ 19449, 22721, 7037, 3903, 23181, 13716, 7064, 14963, 2200, 1462,

+ 24740, 32308, 27367, 9043, 21108, 22, 14734, 11196, 2142, 27688,

+ 23085, 28837, 17819, 4043, 24433, 2448, 5360, 5828, 8669, 6537,

+ 18318, 7823, 21962, 7444, 23352, 5110, 17068, 21604, 2979, 3811,

+ 32664, 7629, 4898, 8307, 22787, 21628, 24195, 18251, 17357, 1894,

+ 14387, 32303, 382, 7294, 11945, 6353, 22991, 13355, 14850, 25318,

+ 3436, 24825, 25833, 13695, 26104, 1935, 31930, 30359, 1873, 31457,

+ 3303, 14056, 26134, 10406, 10650, 25092, 1895, 27149, 19868, 13472,

+ 28140, 19627, 20341, 27955, 22553, 26552, 12757, 27328, 13232, 4476,

+ 21298, 11759, 27271, 2308, 16563, 28771, 27787, 26649, 12365, 17992,

+ 6917, 29043, 26156, 32299, 31004, 3881, 2388, 13071, 17819, 5484,

+ 11144, 17597, 25077, 7541, 2154, 10843, 10887, 3260, 16357, 21312,

+ 9244, 7275, 4040, 2567, 8886, 29970, 20659, 3554, 19852, 12956,

+ 14903, 22065, 9295, 25730, 12857, 13396, 27057, 24126, 11159, 18365,

+ 5928, 27651, 22543, 30793, 15855, 16299, 12636, 27344, 31055, 10737,

+ 7585, 9211, 22044, 29664, 13067, 19797, 21378, 27787, 24242, 20645,

+ 24834, 32511, 29377, 15740, 32183, 25718, 24535, 11530, 23774, 18125,

+ 7597, 6197, 13205, 26424, 1784, 21485, 5091, 7477, 11409, 10169,

+ 30969, 16830, 25555, 12950, 26807, 23235, 5188, 4610, 20082, 6871,

+ 2168, 32596, 29429, 2346, 17971, 22350, 13765, 26039, 12750, 16373,

+ 27562, 7614, 220, 24736, 1642, 25717, 16397, 24656, 27096, 17403,

+ 28754, 7743, 4621, 14989, 32577, 22716, 28406, 14332, 7868, 13877,

+ 6415, 3934, 16333, 25750, 17261, 12548, 13525, 17106, 3842, 16557,

+ 16102, 18622, 8989, 23545, 2669, 8486, 12080, 9505, 24340, 10779,

+ 14806, 26084, 1766, 20362, 24852, 24261, 12468, 29715, 28639, 5747,

+ 20920, 23575, 27871, 15753, 19065, 20243, 1651, 31351, 21230, 25389,

+ 32757, 12736, 29158, 9997, 1087, 7783, 936, 7662, 366, 20131,

+ 5078, 16885, 29158, 22746, 3735, 193, 13974, 23757, 3316, 26179,

+ 26237, 9489, 16515, 27088, 14188, 31934, 16963, 4468, 25614, 3435,

+ 18632, 24458, 13095, 22873, 2456, 16009, 1049, 9710, 18900, 24353,

+ 1196, 27237, 25115, 15495, 29710, 5829, 14763, 15117, 5913, 18191,

+ 31945, 5365, 16853, 14012, 4708, 2439, 6718, 2150, 5365, 609,

+ 30791, 13766, 21161, 8975, 1822, 15326, 6338, 30427, 2994, 22391,

+ 20026, 12518, 29811, 26062, 8618, 12920, 5720, 15755, 20075, 19349,

+ 15143, 5106, 15611, 27089, 25841, 16989, 674, 10597, 27355, 32746,

+ 1109, 31873, 21285, 25457, 16602, 23780, 3684, 16825, 1581, 15275,

+ 30738, 15339, 5667, 9062, 16457, 4678, 32333, 16497, 8908, 3861,

+ 10015, 17282, 3911, 7646, 24145, 21118, 9944, 25309, 24710, 31633,

+ 13005, 26288, 9772, 24189, 30896, 10836, 30627, 50, 3969, 14160,

+ 3233, 31904, 6722, 48, 15061, 2761, 3001, 9525, 30666, 1818,

+ 22385, 29003, 12815, 30715, 13314, 9019, 17813, 16549, 21138, 22306,

+ 3928, 30259, 12188, 9250, 25665, 2812, 24816, 16983, 28491, 17441,

+ 1275, 19725, 15078, 11618, 14153, 30000, 27033, 32566, 11848, 14339,

+ 25066, 11034, 26191, 28181, 29058, 553, 32222, 18034, 11149, 10733,

+ 10024, 534, 1632, 21365, 21198, 935, 31838, 26791, 30702, 1891,

+ 13340, 9176, 7516, 5975, 29635, 17818, 2095, 4049, 25526, 23765,

+ 13184, 18457, 25717, 21786, 30062, 13148, 31682, 16179, 30053, 3561,

+ 7426, 2047, 22433, 27296, 20709, 4477, 16877, 13478, 73, 25126,

+ 7601, 31070, 26204, 24192, 15147, 3733, 28161, 16624, 14845, 26877,

+ 32374, 17359, 23272, 14045, 31539, 12737, 7895, 4870, 31509, 20546,

+ 22303, 25609, 31419, 22658, 2821, 15271, 3633, 29299, 22145, 19081,

+ 21963, 26144, 9793, 15410, 14932, 30528, 29937, 3889, 13416, 7947,

+ 28090, 15771, 8991, 6220, 6152, 18872, 30188, 29112, 28817, 765,

+ 11716, 6782, 5011, 5946, 31106, 7455, 23644, 17429, 29066, 31872,

+ 7696, 15543, 13996, 26430, 22951, 6085, 30796, 13633, 5429, 22930,

+ 9664, 25492, 14446, 28307, 20218, 627, 4713, 10771, 30823, 18854,

+ 27812, 7463, 26134, 18190, 20297, 23013, 8733, 23422, 23215, 30417,

+ 16953, 31180, 23076, 26264, 12468, 23591, 29674, 30721, 31884, 9130,

+ 6783, 4640, 29905, 5682, 8993, 205, 4943, 28269, 9618, 25940,

+ 31341, 29236, 2329, 8046, 2645, 17179, 25289, 17008, 20821, 7494,

+ 2309, 27331, 23429, 30846, 68, 1940, 9643, 16259, 9490, 27852,

+ 14171, 4516, 14168, 16707, 10339, 17038, 10972, 7472, 5478, 3170,

+ 24843, 27877, 18374, 10250, 12279, 27577, 5319, 16332, 23196, 19269,

+ 14322, 28703, 24167, 23251, 11448, 19134, 14841, 17171, 19288, 4092,

+ 4392, 10768, 11523, 4695, 21062, 21347, 6973, 30799, 16550, 4262,

+ 3718, 20601, 2141, 5676, 58, 11215, 16198, 2031, 5046, 12874,

+ 30537, 21194, 23228, 26035, 17884, 9705, 14617, 1718, 25801, 8317,

+ 11140, 20536, 20530, 1972, 30154, 31978, 1491, 6376, 31784, 19230,

+ 18824, 19479, 19448, 29402, 4879, 6803, 6033, 16939, 2318, 7674,

+ 10600, 21436, 11608, 7017, 4731, 5031, 7788, 20205, 6127, 1675,

+ 4671, 2874, 9207, 1759, 28219, 416, 15865, 27782, 8327, 17978,

+ 19948, 21155, 7817, 25705, 12037, 28590, 11433, 6016, 21906, 13256,

+ 21336, 31681, 3110, 8523, 9553, 19337, 3062, 5030, 15135, 31943,

+ 29827, 26728, 2016, 21170, 26233, 16026, 27464, 14268, 17879, 16466,

+ 9449, 29633, 26449, 10885, 3249, 4741, 11507, 1821, 13492, 3677,

+ 22022, 19787, 22571, 4908, 1591, 23583, 15293, 28049, 18422, 854,

+ 25342, 31327, 3613, 3699, 16182, 10830, 30930, 1553, 15203, 28144,

+ 25006, 7031, 18817, 7654, 29471, 29293, 21768, 13139, 20234, 15694,

+ 16055, 25745, 2229, 24415, 17808, 31267, 30181, 2399, 292, 28651,

+ 6979, 1119, 20752, 13981, 14340, 7892, 26056, 10612, 13513, 28651,

+ 18067, 3108, 31172, 25884, 30935, 9487, 28701, 19970, 11415, 18363,

+ 12948, 23146, 4666, 25476, 12647, 16042, 15758, 27278, 19830, 29236,

+ 14860, 9470, 11941, 15466, 13406, 17514, 22914, 948, 23838, 19341,

+ 18472, 4816, 26849, 7744, 2659, 18538, 20852, 19878, 12564, 25837,

+ 15461, 29862, 2263, 27288, 10949, 14494, 26596, 17364, 22061, 16981,

+ 4915, 9157, 24319, 17202, 32484, 21791, 12270, 23212, 28125, 27451,

+ 15041, 28674, 13493, 2410, 29267, 21548, 9169, 13449, 9695, 16401,

+ 23756, 25301, 8570, 762, 5916, 15873, 14305, 30023, 6131, 19334,

+ 6517, 865, 24932, 28475, 7300, 25839, 23751, 31781, 23242, 21581,

+ 1118, 18320, 18488, 23097, 20537, 29278, 9972, 464, 27222, 23712,

+ 31904, 2234, 28173, 30563, 27871, 24481, 13995, 26828, 7445, 3815,

+ 350, 13928, 1391, 21400, 26193, 27069, 21284, 2205, 27927, 25381,

+ 16378, 12339, 16461, 20188, 779, 12700, 17531, 28759, 16073, 7956,

+ 5692, 14295, 4160, 6151, 13215, 22079, 9115, 7041, 21708, 17186,

+ 29162, 24294, 14315, 26913, 3106, 31971, 25665, 27764, 5989, 4260,

+ 10396, 16326, 24196, 4424, 22770, 31558, 7363, 402, 3909, 10747,

+ 26076, 18401, 29641, 343, 20294, 16994, 20553, 14096, 16054, 27524,

+ 29383, 26923, 487, 8876, 9059, 19546, 5015, 27947, 12670, 5255,

+ 12754, 17261, 23582, 19377, 10610, 15986, 6548, 2807, 31463, 14722,

+ 605, 18930, 15412, 15389, 25415, 14408, 23610, 16434, 15060, 21886,

+ 11065, 10385, 9699, 15118, 19604, 31649, 32653, 19642, 30164, 13910,

+ 14414, 17183, 7920, 19294, 10341, 17549, 1996, 8859, 24957, 22,

+ 14079, 11478, 17292, 32485, 21977, 24498, 22780, 8146, 3493, 11742,

+ 15881, 28979, 18987, 20367, 5994, 23796, 1401, 28462, 23603, 23274,

+ 227, 3661, 30458, 7524, 3913, 14048, 568, 27651, 21656, 19626,

+ 9203, 8396, 7827, 4853, 19610, 31612, 15060, 14982, 23857, 16155,

+ 28173, 3024, 30893, 19924, 28820, 360, 1186, 14084, 5151, 26297,

+ 7451, 27537, 30412, 20217, 32713, 3197, 26468, 30812, 12897, 1979,

+ 24288, 28551, 26687, 30529, 13100, 1863, 27471, 30302, 26412, 30851,

+ 3117, 24910, 15357, 15983, 23947, 13068, 26493, 771, 16084, 30055,

+ 5133, 12204, 31246, 30552, 3477, 30273, 30981, 15763, 16329, 26168,

+ 21926, 24924, 27051, 25114, 18857, 20892, 10833, 2356, 16755, 10804,

+ 19177, 27024, 5690, 5521, 27130, 3619, 13162, 27776, 27629, 15688,

+ 11079, 2116, 21707, 31597, 32468, 31463, 28488, 9740, 7412, 8653,

+ 25857, 15070, 23760, 18063, 11266, 8011, 30584, 16902, 28043, 31780,

+ 17613, 21925, 18964, 404, 16286, 12044, 7822, 10068, 5393, 18907,

+ 12012, 15647, 17221, 9156, 23010, 24422, 2869, 30437, 14828, 9284,

+ 14816, 28244, 22419, 5300, 3239, 2299, 20716, 17922, 13558, 7846,

+ 6753, 10111, 16166, 15194, 15539, 22649, 24738, 17641, 13376, 6762,

+ 29001, 7875, 21890, 13168, 5140, 16399, 23257, 21757, 21241, 28666,

+ 32650, 23248, 12815, 7247, 19463, 30244, 32242, 32329, 30577, 6439,

+ 22889, 421, 603, 13997, 20038, 8698, 28369, 10790, 25998, 12877,

+ 14744, 23501, 2778, 17120, 30904, 29987, 16125, 6476, 17208, 14748,

+ 24039, 28367, 17961, 22424, 31690, 26855, 10982, 17812, 7547, 32,

+ 12953, 32674, 20506, 18730, 11009, 14614, 25589, 21550, 8307, 22147,

+ 20138, 5730, 28959, 17382, 30860, 4572, 9621, 31520, 31048, 12196,

+ 12936, 20138, 1993, 12, 2001, 19588, 8536, 21828, 4278, 19822,

+ 11272, 27689, 2413, 1115, 6225, 5982, 19932, 8739, 17915, 8350,

+ 1443, 24952, 12349, 21584, 20828, 3867, 9511, 27484, 23841, 25167,

+ 3133, 18238, 31823, 14735, 101, 13401, 12938, 3964, 16643, 9869,

+ 19970, 15385, 15970, 9227, 30452, 22074, 17750, 21096, 22643, 18746,

+ 3615, 23025, 18024, 29421, 12945, 4927, 1240, 24021, 20338, 13067,

+ 5221, 27545, 21796, 26691, 10264, 946, 19331, 8284, 10333, 6760,

+ 3345, 26091, 26447, 9213, 15697, 3439, 27190, 18472, 32368, 9329,

+ 27726, 27077, 10794, 22224, 32459, 22218, 4588, 15958, 27161, 13437,

+ 2614, 20622, 13416, 31716, 17732, 24282, 29032, 6781, 16621, 23744,

+ 16209, 2864, 19403, 24709, 5415, 31618, 26012, 4605, 17980, 20747,

+ 32488, 31649, 24310, 9002, 23525, 29154, 16082, 31991, 7831, 1213,

+ 5033, 31609, 15419, 12176, 6707, 7194, 25062, 15148, 18377, 20311,

+ 3178, 1579, 16751, 9148, 22393, 10116, 17425, 7440, 18445, 8028,

+ 25101, 3021, 5638, 2591, 14834, 30931, 14613, 2512, 2695, 31068,

+ 15578, 22941, 18448, 32563, 8265, 16311, 5836, 31009, 17490, 20832,

+ 20162, 22440, 11713, 15686, 27838, 18932, 7779, 4111, 5270, 18191,

+ 18794, 10037, 2225, 14164, 10002, 17940, 15050, 21030, 11141, 321,

+ 23026, 994, 25852, 29726, 468, 28689, 17704, 29867, 28477, 25571,

+ 6608, 14751, 24028, 19673, 30907, 9912, 29510, 1985, 8912, 13135,

+ 23356, 7143, 8828, 7983, 31025, 13962, 10580, 27047, 21255, 31373,

+ 28924, 16094, 6426, 30831, 9031, 20327, 28543, 25213, 3487, 17941,

+ 23694, 20806, 9128, 20497, 157, 11344, 5408, 27433, 31503, 2825,

+ 31498, 28267, 8334, 8704, 24587, 243, 26260, 4181, 10260, 29441,

+ 10288, 8559, 6977, 11599, 10247, 22252, 6145, 10913, 29593, 20190,

+ 12408, 12189, 3013, 23092, 14113, 13533, 30351, 22390, 32440, 14147,

+ 7714, 9654, 20823, 25228, 8465, 17347, 25311, 18984, 30690, 28575,

+ 17049, 9289, 5069, 23091, 4125, 15163, 23233, 17218, 30579, 2291,

+ 9384, 4508, 14457, 12522, 7660, 15252, 15748, 19500, 13114, 5043,

+ 1354, 15275, 27270, 19886, 25600, 29914, 19791, 20374, 24511, 31863,

+ 18468, 9039, 11308, 936, 9063, 7235, 2392, 23370, 31057, 1367,

+ 2533, 12678, 19766, 27423, 1131, 19877, 10250, 22093, 13337, 15909,

+ 24101, 2672, 19616, 11532, 25155, 7387, 1356, 20092, 18895, 30690,

+ 24436, 7560, 26209, 7757, 11285, 23366, 6277, 17158, 5306, 1061,

+ 16318, 2325, 11167, 12161, 27594, 32718, 18197, 3445, 13096, 12105,

+ 11304, 30449, 21208, 18707, 19584, 17420, 31586, 20771, 7045, 23707,

+ 28441, 21264, 16071, 14082, 21921, 30593, 7580, 14666, 26799, 3556,

+ 5131, 12404, 24080, 24163, 19688, 21005, 13037, 22547, 1857, 31747,

+ 15437, 28527, 19193, 9911, 8411, 16646, 20659, 15699, 8170, 19568,

+ 8433, 20574, 18870, 23430, 11901, 22158, 3308, 27091, 28681, 28637,

+ 15725, 8261, 15634, 24286, 30799, 14632, 29194, 11346, 2341, 24661,

+ 8117, 10487, 13441, 25511, 18900, 16800, 2999, 18351, 30977, 22922,

+ 11747, 5289, 9178, 7918, 6701, 28590, 13153, 3539, 30539, 21547,

+ 9891, 5414, 29768, 401, 6552, 4620, 9860, 29006, 13131, 5495,

+ 2301, 26877, 16186, 10232, 204, 31961, 30208, 32724, 2803, 5752,

+ 14641, 23897, 30549, 21430, 18054, 370, 21766, 20975, 9786, 29306,

+ 29637, 14705, 22707, 846, 7879, 7472, 1893, 20646, 29879, 700,

+ 15604, 10405, 250, 9841, 26776, 4270, 31287, 20461, 12486, 23930,

+ 18967, 19144, 22797, 4455, 16969, 22399, 16190, 29971, 8906, 10416,

+ 13263, 7722, 21859, 16525, 12673, 22652, 627, 17035, 14401, 9555,

+ 25326, 3418, 20300, 17667, 29606, 12570, 29335, 32450, 28105, 5580,

+ 28526, 6842, 10411, 26118, 29787, 16989, 18630, 4587, 22601, 15097,

+ 24576, 32347, 23785, 11916, 25388, 13415, 28757, 30425, 6354, 9480,

+ 12788, 7867, 25907, 21776, 16029, 3514, 6024, 1376, 2047, 4572,

+ 7307, 11100, 15168, 15293, 14904, 19868, 31460, 16610, 14549, 6372,

+ 28657, 22603, 7472, 16727, 30288, 17735, 22568, 999, 26743, 1165,

+ 3950, 23568, 20037, 20359, 25485, 16838, 29485, 27121, 22312, 940,

+ 10135, 28067, 15235, 4486, 12675, 2219, 17990, 19185, 12400, 24991,

+ 13437, 9810, 30844, 5682, 7906, 17420, 10444, 2052, 25439, 16886,

+ 302, 27583, 18383, 25356, 15101, 20063, 14853, 24420, 26950, 1233,

+ 20751, 28772, 9256, 14784, 29627, 27955, 897, 3500, 18523, 2925,

+ 11463, 32060, 20934, 6171, 30771, 469, 23967, 15586, 28965, 8299,

+ 10202, 9594, 13764, 23191, 22395, 6498, 31204, 13802, 14497, 24018,

+ 12590, 19842, 22468, 29682, 9338, 8666, 25147, 1865, 30336, 6886,

+ 28673, 8312, 23472, 28768, 6840, 28712, 2398, 27741, 1518, 17985,

+ 8226, 15395, 15520, 2396, 5503, 17214, 2044, 17020, 24770, 9425,

+ 9067, 4344, 28461, 30507, 29135, 6844, 9045, 21914, 6153, 19634,

+ 25545, 17540, 8383, 32634, 31988, 7091, 3420, 21601, 23109, 27377,

+ 30808, 24209, 23181, 3285, 11449, 27781, 17320, 23516, 22234, 1472,

+ 6495, 15803, 12907, 28863, 23437, 30964, 22969, 21804, 28545, 2216,

+ 6703, 20052, 14500, 25260, 29213, 475, 9307, 25567, 7097, 3758,

+ 11567, 22202, 18788, 26682, 6444, 18472, 30510, 29148, 30598, 7832,

+ 30107, 28312, 8579, 10065, 4520, 6413, 17044, 3590, 32265, 30632,

+ 11205, 29355, 25013, 16665, 30296, 4487, 12196, 25859, 14765, 12681,

+ 11223, 3320, 22630, 19679, 16794, 10660, 10440, 10181, 3846, 24648,

+ 31843, 18843, 18889, 27755, 19189, 3131, 24874, 18892, 1164, 13705,

+ 327, 15002, 20203, 20300, 23457, 32231, 12847, 12604, 22747, 19035,

+ 30898, 29019, 6079, 24869, 17968, 11913, 23938, 19767, 10792, 26963,

+ 23369, 8883, 12677, 24333, 27883, 21152, 15230, 6944, 13561, 26338,

+ 5563, 12964, 14844, 14953, 9145, 24114, 26877, 424, 5487, 26099,

+ 8523, 14153, 28978, 5117, 11640, 16671, 29910, 8416, 19877, 24924,

+ 4630, 20091, 14079, 18436, 2613, 9493, 11402, 22689, 27878, 1705,

+ 5406, 30777, 32362, 3200, 12975, 30589, 18680, 25349, 24273, 27971,

+ 23905, 6102, 28794, 5430, 1780, 3607, 12042, 1740, 30367, 3339,

+ 30346, 22649, 10584, 7397, 28977, 803, 3515, 9691, 2605, 6613,

+ 11509, 1405, 32160, 10679, 23264, 3653, 10728, 22078, 12655, 9583,

+ 1571, 1440, 23373, 29450, 25074, 12683, 29121, 22608, 21118, 12310,

+ 29141, 8243, 28857, 2296, 3255, 7736, 19687, 10999, 22367, 12168,

+ 15196, 5540, 7538, 21061, 24199, 19270, 23399, 18202, 4655, 7956,

+ 9192, 28950, 7165, 13223, 29819, 26554, 17723, 15790, 15713, 28496,

+ 16859, 24292, 8382, 19327, 2235, 11583, 11515, 8221, 295, 14954,

+ 5737, 21572, 10656, 12150, 13351, 11176, 7131, 20685, 17477, 2599,

+ 4621, 32359, 15145, 5538, 20838, 1088, 8754, 10764, 7643, 20233,

+ 18844, 21440, 6953, 22813, 20900, 17432, 16151, 25528, 20204, 29755,

+ 14587, 20579, 3616, 27190, 29311, 11955, 15066, 21583, 3493, 21043,

+ 28099, 28309, 1033, 1183, 26108, 26300, 19303, 10323, 29116, 12840,

+ 9052, 24322, 19002, 2632, 28785, 2219, 26317, 805, 18517, 11977,

+ 2897, 28731, 4970, 12235, 5582, 2951, 26499, 16067, 20308, 4833,

+ 32749, 2914, 17449, 20364, 30380, 9764, 26407, 15372, 8966, 29896,

+ 1119, 15415, 16710, 19203, 18178, 7055, 18362, 31605, 22146, 17871,

+ 3326, 29916, 20212, 28100, 9084, 16264, 6329, 5726, 3636, 28431,

+ 25437, 12807, 12985, 23617, 18367, 19507, 11388, 15198, 21874, 28985,

+ 25933, 25223, 3940, 18529, 5919, 21619, 7101, 5182, 6924, 25443,

+ 11018, 3390, 10649, 88, 23195, 19071, 28730, 2691, 5673, 11492,

+ 8217, 13053, 15549, 105, 23059, 18616, 3276, 18355, 7171, 182,

+ 7079, 26092, 4932, 3704, 23571, 6861, 30833, 8378, 30771, 1276,

+ 22639, 5725, 687, 7833, 28334, 32677, 17167, 26643, 29867, 16292,

+ 8552, 13633, 2746, 25078, 30011, 20654, 7682, 30895, 15258, 26932,

+ 28617, 5778, 30860, 32204, 8690, 14724, 18355, 15268, 27843, 14656,

+ 24620, 626, 25068, 3659, 4023, 777, 24773, 1323, 28952, 11305,

+ 8152, 12756, 25021, 22940, 28575, 14179, 31392, 31102, 6799, 14350,

+ 4207, 7133, 1621, 347, 32491, 8322, 31327, 18577, 17294, 30477,

+ 12190, 2924, 11120, 9544, 3466, 26901, 6251, 1973, 14439, 1873,

+ 8573, 105, 21703, 22521, 4719, 2077, 9297, 21162, 3764, 21891,

+ 24512, 30397, 23444, 3798, 29231, 10618, 5514, 14773, 31123, 17544,

+ 21738, 23857, 12425, 26792, 1478, 2597, 9554, 26788, 30483, 15814,

+ 25115, 24705, 25864, 21114, 27266, 19708, 711, 29422, 12887, 14133,

+ 18239, 17250, 29087, 18597, 337, 13640, 31199, 23381, 30513, 14606,

+ 28823, 23122, 5392, 16952, 4876, 1628, 28408, 20913, 26442, 29406,

+ 6647, 31331, 32362, 20259, 8319, 5125, 11281, 20422, 5645, 4148,

+ 22329, 19562, 3593, 9670, 18484, 26028, 31213, 18011, 6125, 18262,

+ 12970, 4660, 9330, 23253, 12616, 15945, 11951, 32238, 15052, 8341,

+ 1404, 4524, 862, 22197, 25051, 30109, 3243, 15025, 22650, 17214,

+ 17289, 6682, 1152, 23987, 8409, 25429, 20358, 10683, 20914, 15670,

+ 31458, 484, 10940, 15569, 20012, 15099, 27353, 11660, 3835, 19655,

+ 4363, 8057, 9712, 29431, 18834, 12259, 5366, 23128, 13908, 16423,

+ 8903, 11851, 5762, 3781, 24499, 6775, 4473, 26295, 26525, 5307,

+ 10470, 22786, 1350, 870, 5678, 13450, 6862, 5035, 5901, 12330,

+ 29559, 21583, 28029, 31492, 25261, 26789, 5849, 10006, 21571, 26556,

+ 32322, 8719, 12800, 15319, 11842, 12384, 16986, 5661, 17839, 7829,

+ 25729, 19090, 13266, 7398, 19871, 10310, 32713, 30985, 11102, 8653,

+ 7978, 10827, 20396, 23022, 8169, 25567, 18875, 26783, 10620, 8566,

+ 4171, 27698, 6460, 25104, 8491, 15049, 15887, 1297, 14845, 18447,

+ 30532, 32151, 3643, 4906, 15038, 20491, 7799, 12523, 18005, 3574,

+ 5351, 17992, 121, 17430, 19232, 1805, 19480, 3762, 23842, 3278,

+ 21442, 18474, 28053, 6688, 4108, 1490, 32594, 7689, 3378, 22272,

+ 2085, 2996, 13312, 31332, 8401, 23145, 6642, 32152, 30293, 16829,

+ 7322, 31480, 24686, 1542, 19522, 27060, 16733, 26898, 27091, 13348,

+ 4842, 4889, 31733, 2139, 17577, 2031, 16248, 5886, 20348, 31870,

+ 30451, 13399, 8793, 8308, 23978, 4005, 19534, 12345, 16821, 29878,

+ 1986, 25380, 2399, 19384, 2813, 2542, 10189, 19277, 16875, 29031,

+ 17632, 4317, 21788, 23911, 7259, 4912, 8720, 12296, 22601, 9020,

+ 2226, 4370, 27289, 28475, 12834, 10679, 10764, 15361, 13495, 18561,

+ 13905, 18573, 14661, 392, 26478, 4062, 1435, 7912, 19553, 23816,

+ 4176, 30066, 32007, 25990, 448, 29090, 17214, 24018, 18001, 28881,

+ 24390, 15411, 5627, 15020, 27502, 7638, 5383, 12005, 8940, 545,

+ 29206, 31529, 4108, 20548, 9574, 27985, 25997, 23313, 13649, 13788,

+ 1863, 22285, 9238, 11933, 1554, 30407, 27356, 31153, 4836, 8552,

+ 9716, 3252, 11577, 30604, 22111, 31796, 4280, 6736, 23696, 7014,

+ 9747, 26796, 4210, 17432, 31535, 9988, 6829, 23271, 1669, 17657,

+ 29478, 25522, 14792, 13701, 10436, 14927, 10183, 3399, 22138, 17276,

+ 16790, 23323, 27010, 10776, 28392, 28398, 7398, 31891, 1472, 721,

+ 20037, 16035, 25929, 31307, 4052, 17208, 14337, 11252, 7075, 25267,

+ 8477, 26943, 3106, 24914, 22826, 14488, 32227, 6639, 32240, 30127,

+ 32417, 16619, 6555, 19475, 28034, 21349, 9501, 16386, 12441, 1711,

+ 2510, 14720, 25519, 19458, 26197, 17830, 25667, 15472, 6860, 573,

+ 24271, 283, 24607, 26507, 16717, 2981, 28341, 25709, 14074, 13031,

+ 30803, 166, 4442, 2022, 31037, 31095, 17020, 30466, 9374, 3184,

+ 19583, 2417, 28713, 25733, 19029, 23276, 769, 23908, 30151, 6056,

+ 3030, 4358, 20153, 5768, 16977, 25476, 18352, 25489, 6067, 301,

+ 7057, 20126, 23225, 725, 12460, 21077, 21186, 11375, 11512, 26457,

+ 5683, 31199, 8096, 6081, 8219, 28169, 25535, 26314, 26899, 22574,

+ 8296, 24776, 1897, 888, 2538, 26467, 6781, 1235, 18514, 3583,

+ 1386, 6911, 10033, 6780, 15593, 21731, 29343, 32288, 11379, 29221,

+ 9599, 23249, 30374, 12791, 19717, 26760, 5354, 1076, 17782, 20226,

+ 6740, 20651, 13359, 18361, 7627, 18619, 25321, 7186, 3945, 30496,

+ 24635, 21464, 32035, 524, 2400, 10217, 2733, 21369, 24891, 3375,

+ 8344, 7102, 22680, 27602, 5822, 25185, 27573, 22188, 24031, 6445,

+ 14593, 22270, 27788, 25988, 29987, 8289, 29508, 5110, 24638, 16639,

+ 7134, 27154, 8308, 8706, 22566, 19067, 9641, 27725, 971, 24383,

+ 31369, 9578, 23929, 15973, 9932, 6340, 6978, 15557, 1720, 24855,

+ 7746, 25373, 15336, 9764, 2435, 14688, 6989, 25257, 16414, 23633,

+ 15474, 18064, 3747, 4433, 3588, 2407, 955, 19573, 5009, 16656,

+ 15372, 23772, 12432, 4282, 9565, 13120, 9378, 17424, 31995, 30410,

+ 7447, 10927, 3419, 23595, 32692, 18398, 28416, 29416, 21171, 10873,

+ 20639, 23797, 26124, 303, 2690, 9350, 8691, 16110, 298, 9250,

+ 7842, 25498, 6968, 13561, 26968, 15621, 20110, 6007, 6818, 13340,

+ 2225, 18969, 8665, 31326, 30321, 17024, 27116, 11155, 28365, 15556,

+ 15199, 14266, 1297, 5386, 32660, 10563, 1601, 24409, 18762, 7038,

+ 26042, 12713, 18019, 30036, 23831, 21565, 32490, 15413, 17234, 19507,

+ 1364, 4945, 24363, 29786, 31750, 15115, 14542, 6211, 5144, 9386,

+ 11952, 17819, 26969, 28242, 20922, 18359, 24467, 23348, 19625, 369,

+ 25872, 7169, 23221, 6451, 15964, 31652, 4464, 11089, 16205, 17456,

+ 498, 30364, 5441, 28695, 30003, 14132, 1703, 31646, 18360, 9117,

+ 19393, 27277, 10354, 16405, 25767, 22059, 16099, 31781, 4240, 5993,

+ 31874, 20087, 19021, 24926, 7521, 17127, 28182, 24563, 7181, 11996,

+ 27785, 12000, 7349, 32729, 12016, 15575, 5007, 22607, 4291, 28414,

+ 10872, 28342, 4718, 6307, 10715, 25307, 10579, 6956, 26835, 32124,

+ 20755, 16972, 2196, 3602, 16905, 12413, 32519, 23278, 28952, 28586,

+ 13492, 22407, 15527, 31275, 14821, 5395, 27369, 20471, 22280, 8532,

+ 23906, 27669, 31830, 18357, 7591, 11860, 21682, 26773, 10085, 3388,

+ 32724, 23267, 5028, 9284, 14246, 3051, 2381, 29254, 25838, 20847,

+ 5866, 23599, 26414, 8698, 22958, 18427, 5064, 10097, 5557, 25569,

+ 12390, 24555, 9100, 28106, 27801, 16578, 22260, 3848, 7873, 4075,

+ 17123, 8261, 18476, 26498, 32460, 27065, 9346, 6057, 20768, 13217,

+ 18528, 23187, 25365, 15084, 4931, 3804, 24998, 24119, 30888, 27676,

+ 12251, 5883, 25713, 26043, 3658, 4869, 16011, 12295, 23518, 551,

+ 20942, 7043, 21463, 27694, 6692, 14978, 27922, 8979, 15854, 1269,

+ 16011, 9590, 13987, 28290, 3360, 1351, 27834, 8918, 26264, 9927,

+ 19147, 23611, 28131, 27567, 3057, 2157, 15523, 7854, 18802, 12201,

+ 32236, 13081, 2978, 21000, 9800, 11487, 25092, 12043, 27903, 17595,

+ 18099, 11127, 27285, 7341, 20736, 18787, 147, 6314, 31581, 26255,

+ 28299, 12179, 122, 13559, 14422, 18532, 5037, 8616, 16800, 30638,

+ 30871, 7635, 17063, 12615, 15877, 32288, 31295, 16959, 8212, 25668,

+ 16666, 10007, 21913, 26326, 25158, 4654, 19647, 27486, 23799, 13948,

+ 6898, 26288, 29575, 10882, 9212, 30584, 11195, 30593, 15470, 3861,

+ 9288, 10475, 19266, 7339, 25493, 28695, 11966, 28275, 963, 12344,

+ 26780, 15702, 24555, 1680, 21863, 5819, 9894, 8929, 29480, 6301,

+ 30163, 1061, 31554, 13280, 25492, 28030, 21403, 26853, 6298, 10096,

+ 6908, 12892, 24483, 24910, 21691, 4697, 20032, 18162, 30615, 30122,

+ 27356, 7857, 25571, 24937, 29690, 911, 1255, 7885, 11454, 4014,

+ 8579, 22853, 21167, 2829, 8213, 25288, 8379, 29295, 16797, 4710,

+ 892, 27288, 6175, 28964, 25273, 29631, 15433, 10502, 9264, 28993,

+ 1622, 27245, 19346, 22931, 20018, 15267, 23504, 8826, 30431, 26293,

+ 23957, 15742, 18711, 31105, 12051, 14492, 24883, 3087, 259, 22331,

+ 13387, 16677, 9447, 14177, 28831, 13589, 4243, 22311, 15669, 20186,

+ 15083, 3690, 7364, 10083, 13806, 20676, 30673, 31535, 10740, 19386,

+ 4632, 23066, 5683, 13623, 28461, 2423, 31368, 24122, 27235, 19550,

+ 20085, 24011, 1517, 1607, 26982, 26675, 13635, 27608, 16440, 9836,

+ 9928, 13820, 7163, 8663, 20649, 2869, 11767, 6189, 17672, 4915,

+ 9454, 19384, 4442, 26789, 10145, 9155, 11533, 23887, 22677, 12623,

+ 15214, 17501, 18199, 27655, 9419, 14071, 29054, 15222, 19156, 1813,

+ 15536, 8312, 23623, 21653, 1256, 4846, 3021, 30859, 11190, 26550,

+ 11807, 15064, 18247, 21211, 876, 1534, 22246, 23048, 12287, 3378,

+ 8387, 19267, 10269, 6323, 7411, 3031, 4908, 27739, 4537, 21394,

+ 27163, 31859, 17668, 10289, 21757, 25804, 26424, 11545, 3063, 22027,

+ 6961, 6984, 16221, 27973, 16262, 30090, 19224, 10700, 23818, 19696,

+ 14667, 30024, 24217, 10622, 22582, 29193, 30225, 27428, 26458, 923,

+ 21150, 14064, 8157, 17819, 3131, 17537, 7217, 25802, 26741, 8127,

+ 25329, 3680, 23666, 13001, 6411, 27043, 28723, 11311, 7972, 20407,

+ 26390, 5474, 7736, 13752, 20895, 11624, 18305, 32006, 27767, 23508,

+ 19355, 7648, 28853, 20470, 19685, 24629, 14685, 8271, 20778, 5814,

+ 25126, 32327, 30337, 4144, 17281, 21027, 28529, 13081, 28630, 21297,

+ 2649, 30569, 5649, 28741, 18447, 12971, 27997, 7273, 17864, 27219,

+ 3631, 21457, 32312, 8274, 23687, 27917, 9722, 19944, 26483, 2690,

+ 10033, 185, 25044, 16411, 112, 20004, 6244, 16700, 2775, 4304,

+ 2296, 11000, 27519, 9351, 32515, 16003, 13337, 5192, 22876, 8170,

+ 30417, 28311, 23873, 27905, 20857, 13336, 15003, 16541, 13283, 5212,

+ 9603, 30212, 25998, 27899, 10502, 16546, 3717, 16099, 5925, 27646,

+ 18309, 3567, 14880, 22508, 30046, 24252, 10997, 1283, 29595, 18104,

+ 28963, 17745, 21093, 17019, 20403, 25934, 11173, 18011, 25465, 24847,

+ 21353, 15674, 30360, 31164, 26505, 27043, 11588, 16196, 650, 23830,

+ 28620, 25167, 5570, 31135, 13783, 25205, 11965, 12717, 5869, 27821,

+ 11232, 31266, 17466, 32264, 9292, 8871, 20367, 7839, 1798, 2114,

+ 25514, 18633, 13652, 22058, 20919, 20626, 7274, 18650, 6167, 24425,

+ 4677, 10084, 18015, 22553, 31192, 26376, 25252, 14075, 29286, 11525,

+ 13302, 17001, 5679, 8879, 5674, 8053, 3150, 20418, 15069, 7899,

+ 29154, 28406, 31669, 22069, 24172, 28883, 8682, 22894, 1912, 8391,

+ 18181, 10361, 18304, 8310, 13032, 9539, 3085, 11601, 23311, 9702,

+ 28447, 25706, 26389, 30495, 32719, 30854, 24186, 25346, 32307, 3700,

+ 25507, 4076, 3714, 13214, 8226, 19386, 10104, 8926, 17976, 5944,

+ 16380, 19347, 19352, 1500, 1, 20211, 16750, 17845, 30890, 26531,

+ 28064, 25502, 10161, 28549, 2388, 8119, 18953, 30673, 18610, 26134,

+ 16834, 10087, 4075, 16313, 4910, 21347, 31098, 20415, 15682, 1522,

+ 4522, 12504, 28990, 26469, 27480, 18171, 28049, 15748, 29178, 22871,

+ 32758, 29989, 7392, 2187, 29412, 27133, 26554, 29977, 27173, 24757,

+ 13403, 10776, 29380, 26432, 31164, 8234, 18989, 3949, 25668, 27822,

+ 8336, 14264, 19270, 28983, 23174, 22118, 8140, 7996, 5623, 31441,

+ 14483, 9233, 30267, 30976, 8022, 4373, 31615, 29562, 17231, 21550,

+ 26987, 14172, 13564, 5234, 258, 7850, 20255, 18215, 4553, 27875,

+ 28936, 4334, 9771, 23000, 11798, 18235, 20252, 16061, 5756, 9736,

+ 21245, 6529, 32065, 3531, 17343, 23131, 24459, 23973, 16460, 12198,

+ 20764, 15836, 25890, 17390, 4637, 28299, 12353, 8779, 12826, 28312,

+ 23624, 13549, 25679, 3815, 30427, 4601, 26914, 17869, 13895, 2708,

+ 12528, 22216, 21097, 12348, 7180, 8813, 25804, 17503, 31749, 12961,

+ 5137, 17958, 14888, 22284, 3732, 4754, 18246, 26059, 6220, 19147,

+ 14520, 29797, 12275, 29877, 13983, 7425, 3943, 2499, 8048, 9174,

+ 2897, 26640, 1201, 4322, 5636, 22956, 25853, 4575, 27048, 9779,

+ 18254, 14451, 7575, 25253, 7036, 26791, 11015, 29553, 1024, 2970,

+ 9450, 29907, 27902, 23159, 10002, 32096, 5251, 21924, 16537, 28384,

+ 26635, 15420, 23936, 18779, 23366, 6080, 29590, 13431, 7195, 12297,

+ 30363, 13057, 18414, 31617, 22438, 13513, 1566, 24467, 5060, 31411,

+ 11218, 21856, 5602, 267, 19702, 18100, 28653, 25625, 24192, 14136,

+ 12087, 29429, 19960, 3561, 20509, 25757, 12855, 4808, 5351, 25413,

+ 31087, 29907, 17391, 25070, 14443, 27701, 4358, 28730, 32536, 19642,

+ 13843, 127, 22085, 7301, 32509, 21530, 19111, 773, 19659, 518,

+ 10528, 9253, 21514, 19373, 20544, 15299, 6767, 13309, 15117, 3428,

+ 30654, 3263, 10495, 31782, 7658, 28196, 1871, 24310, 27774, 19617,

+ 32626, 25858, 4923, 8445, 20192, 7793, 18435, 22185, 19481, 32082,

+ 5110, 29775, 15594, 25299, 31706, 12973, 25068, 3252, 1984, 30116,

+ 23375, 30459, 28132, 23436, 19157, 1512, 25814, 22219, 22305, 3115,

+ 24791, 1446, 29746, 341, 16518, 15447, 5419, 31885, 11452, 30047,

+ 11093, 18308, 12212, 7197, 5734, 7595, 18287, 26016, 27140, 27555,

+ 30550, 11194, 11397, 8948, 7458, 32341, 29433, 30211, 3321, 24330,

+ 32362, 4158, 14553, 23280, 15970, 7834, 26426, 30386, 23726, 15423,

+ 15599, 8421, 13922, 6017, 7758, 7832, 26141, 25363, 11152, 9772,

+ 17294, 26487, 23675, 7270, 31799, 18617, 32574, 10178, 10609, 21597,

+ 7836, 3594, 1969, 27542, 4940, 4136, 13065, 23993, 17568, 14393,

+ 3314, 18160, 23654, 19938, 12104, 18227, 29196, 25831, 4246, 9588,

+ 28935, 14841, 15764, 13082, 15988, 20944, 19438, 945, 25088, 3706,

+ 27207, 19680, 13830, 12019, 12670, 667, 25336, 27893, 6960, 921,

+ 10752, 11537, 16766, 27145, 17127, 29951, 19472, 21633, 20789, 7219,

+ 11865, 15159, 13466, 27312, 6941, 9587, 14476, 6689, 20785, 21316,

+ 26418, 27942, 9603, 12147, 897, 20716, 28250, 7605, 28325, 15616,

+ 13278, 31012, 31906, 17765, 18906, 22256, 31803, 4836, 14017, 24914,

+ 30227, 13731, 3055, 24258, 26386, 1529, 4914, 14698, 31242, 1921,

+ 30089, 6874, 1178, 621, 16171, 28669, 19283, 18205, 25803, 26956,

+ 20762, 20465, 11803, 19265, 13773, 13659, 10639, 8975, 26666, 10296,

+ 3427, 13200, 12012, 26208, 10719, 11903, 19766, 23931, 20698, 3559,

+ 17973, 28695, 22141, 8667, 1026, 4344, 3913, 9832, 26053, 10415,

+ 28507, 30152, 31008, 31087, 12015, 10968, 25291, 29979, 6180, 18381,

+ 14971, 14755, 25087, 13602, 24073, 10129, 15537, 11476, 32720, 18143,

+ 29469, 26066, 29783, 28172, 17813, 5039, 816, 24431, 25060, 3739,

+ 16159, 20682, 7314, 14225, 10623, 4386, 20323, 27858, 9442, 16590,

+ 289, 8849, 31480, 20431, 15003, 29680, 31154, 13919, 11502, 16427,

+ 27558, 7116, 3331, 10259, 28598, 24455, 18521, 32703, 29676, 14456,

+ 30469, 2174, 22441, 24213, 12023, 1807, 30975, 29363, 7294, 2581,

+ 12635, 6300, 1039, 29893, 1383, 30561, 4418, 8674, 3118, 5106,

+ 5917, 13035, 20866, 14827, 9621, 24467, 14234, 26289, 6226, 22897,

+ 7168, 27326, 691, 6137, 17323, 13625, 7442, 8363, 21095, 32202,

+ 5961, 8074, 20862, 16556, 29812, 25552, 2449, 16644, 21497, 5344,

+ 13255, 1393, 19398, 13180, 17962, 740, 14298, 15160, 24397, 27058,

+ 8967, 30766, 5426, 18663, 11510, 25844, 11116, 31710, 4459, 9419,

+ 29825, 5646, 13514, 28185, 25234, 16679, 23003, 31002, 2878, 16734,

+ 25802, 18130, 8899, 5124, 20338, 21574, 12902, 23646, 13018, 3563,

+ 3606, 4785, 2560, 5983, 19788, 10652, 4566, 15191, 19253, 7594,

+ 27275, 6105, 29203, 9000, 24075, 23211, 21985, 26164, 28617, 8715,

+ 25141, 4375, 6588, 21920, 8043, 3285, 23207, 2993, 21248, 12290,

+ 31134, 20117, 32572, 20438, 8902, 22122, 1556, 26500, 16732, 2826,

+ 29518, 18888, 15097, 25147, 12774, 4287, 28692, 28198, 12465, 16380,

+ 9672, 12299, 14912, 19672, 15575, 818, 1031, 265, 23024, 13349,

+ 14526, 27511, 25389, 6172, 520, 21323, 30432, 14521, 21843, 24904,

+ 16271, 26613, 2047, 29534, 18749, 20571, 28354, 20092, 15339, 21876,

+ 3147, 8871, 8031, 22658, 4901, 5449, 3108, 13680, 16095, 17867,

+ 28114, 3082, 18538, 101, 14992, 10602, 31170, 4917, 17366, 9650,

+ 9424, 31119, 1144, 2561, 400, 20885, 4064, 4767, 14191, 20487,

+ 1690, 24955, 5623, 9820, 13335, 13528, 16557, 3857, 14762, 30275,

+ 21050, 29761, 27351, 13768, 15050, 25718, 16077, 25957, 23986, 18879,

+ 31537, 26815, 12885, 5890, 31773, 19732, 27720, 24468, 15721, 15729,

+ 28340, 3335, 2345, 1829, 3836, 10051, 28534, 17013, 27296, 25304,

+ 27506, 29585, 21602, 27027, 22918, 14279, 7335, 4432, 8942, 21239,

+ 14623, 29966, 17016, 12615, 4008, 9289, 1672, 12567, 26736, 23684,

+ 13408, 18744, 19290, 293, 28830, 24408, 19620, 17797, 4358, 25281,

+ 3270, 15688, 15234, 32580, 28573, 18154, 30311, 31855, 20168, 1179,

+ 3578, 7431, 11091, 22349, 29491, 4786, 8850, 4107, 30657, 23027,

+ 10832, 19340, 2893, 4699, 22570, 11272, 24067, 9982, 14389, 25930,

+ 3151, 23333, 30439, 20231, 14308, 3906, 25140, 29038, 12803, 21033,

+ 1527, 16384, 6906, 4732, 26516, 30370, 6891, 1127, 9435, 19696,

+ 6094, 3982, 31280, 29653, 3257, 22852, 29673, 4440, 26207, 16126,

+ 20216, 11961, 2264, 21767, 19658, 19645, 25248, 15733, 32367, 4678,

+ 12513, 27483, 19194, 18726, 22773, 9792, 13611, 7477, 31526, 25040,

+ 9291, 20898, 8889, 15826, 13400, 24710, 14124, 16986, 20834, 14527,

+ 4795, 11328, 8757, 3579, 25129, 24016, 1592, 28435, 12732, 18371,

+ 10901, 5787, 19338, 24175, 31386, 10679, 19187, 28474, 28512, 22831,

+ 2415, 27220, 682, 6342, 18570, 29862, 18703, 24776, 15660, 22021,

+ 30556, 11747, 24606, 6060, 22324, 13111, 10186, 26345, 28409, 29360,

+ 3906, 4118, 24816, 12180, 3716, 9675, 17823, 28504, 26621, 10322,

+ 1402, 31928, 28491, 16731, 30143, 8455, 11591, 26609, 15519, 1987,

+ 1347, 173, 16542, 108, 16272, 20010, 10044, 4758, 7492, 17848,

+ 9941, 6206, 22841, 7253, 12230, 21082, 14937, 8153, 12497, 11187,

+ 6937, 12400, 31427, 7671, 2628, 28237, 1875, 27914, 26874, 28573,

+ 10062, 11422, 10744, 4794, 23537, 17411, 5658, 16546, 24470, 25664,

+ 14877, 13223, 8596, 9314, 25002, 5736, 14688, 14356, 17296, 3839,

+ 5368, 29808, 17234, 2684, 26241, 5909, 27617, 23699, 5422, 890,

+ 1962, 1937, 13669, 27266, 31187, 16532, 19485, 4176, 15554, 1020,

+ 24971, 9308, 10720, 19997, 9981, 24518, 28316, 19510, 13318, 24043,

+ 21170, 6567, 7899, 25399, 13229, 23902, 29693, 1594, 22954, 23443,

+ 20760, 28413, 2400, 20405, 10027, 8342, 30557, 8868, 26602, 250,

+ 146, 20768, 8801, 4883, 19474, 5762, 21209, 5906, 14871, 12201,

+ 27135, 1287, 17478, 19000, 20291, 5550, 13108, 29695, 25215, 19852,

+ 19752, 7862, 16601, 15931, 25123, 3057, 20714, 29187, 22813, 13648,

+ 23072, 13738, 8850, 1270, 11104, 13452, 13373, 29245, 5360, 6894,

+ 29220, 22184, 14741, 12943, 10452, 3866, 31480, 11648, 31982, 15685,

+ 1358, 4918, 29666, 15716, 15928, 990, 31227, 9261, 6888, 17904,

+ 2460, 22785, 8582, 20999, 22473, 8295, 6610, 20720, 10728, 10936,

+ 12554, 16384, 14537, 31516, 5390, 12203, 17637, 15028, 19138, 20563,

+ 16355, 19481, 17332, 16734, 12129, 13062, 30463, 22155, 11504, 9297,

+ 367, 18310, 10080, 21024, 4325, 32186, 18751, 18521, 7933, 29798,

+ 10396, 27994, 16111, 24307, 9232, 31467, 691, 2437, 4352, 880,

+ 15209, 10192, 7964, 22372, 6391, 1581, 5419, 24322, 27892, 20716,

+ 19211, 15429, 5317, 26092, 1267, 18707, 20229, 25706, 5116, 17845,

+ 43, 28439, 24544, 19339, 10854, 21613, 15873, 22526, 7372, 4418,

+ 14765, 949, 7604, 24990, 12704, 14860, 5216, 21450, 28362, 1218,

+ 30176, 4521, 6227, 16369, 31026, 21579, 10461, 19012, 22190, 13760,

+ 18697, 1380, 5794, 21802, 13116, 15027, 13113, 278, 1187, 14397,

+ 4513, 23565, 8052, 14828, 5740, 12133, 631, 29435, 22839, 24669,

+ 14790, 19372, 15242, 15210, 19665, 10046, 26368, 2507, 19876, 17945,

+ 30376, 9571, 28013, 6221, 20394, 32456, 14904, 5178, 27950, 18840,

+ 27134, 26000, 9081, 17164, 22238, 2171, 7769, 18127, 4266, 9495,

+ 7876, 9744, 10149, 16170, 15292, 29910, 5259, 3602, 10869, 16787,

+ 25042, 4348, 20922, 27389, 31280, 13143, 11405, 2073, 16477, 5513,

+ 16398, 5784, 21530, 19936, 10398, 25447, 10354, 13771, 579, 24962,

+ 20288, 5962, 12366, 25353, 7665, 20131, 18492, 26773, 3979, 13399,

+ 9179, 31436, 2030, 25428, 24238, 16947, 23643, 12140, 17041, 20804,

+ 17714, 24582, 26528, 21697, 7424, 787, 2902, 7751, 4280, 27716,

+ 25330, 15654, 9537, 13434, 27935, 6512, 13873, 19839, 1747, 17744,

+ 20953, 32243, 18296, 30877, 5761, 22921, 26698, 27311, 29940, 2419,

+ 15104, 32370, 31808, 31002, 29614, 29880, 4791, 15123, 18922, 6356,

+ 16441, 14926, 13614, 7012, 28086, 2961, 18557, 3950, 15854, 29477,

+ 29001, 15791, 25467, 29392, 7573, 16943, 6162, 29699, 3415, 10265,

+ 6406, 25171, 21280, 30666, 19725, 18989, 18430, 27432, 30535, 20422,

+ 30370, 15413, 7036, 4690, 16830, 16868, 30630, 20342, 18865, 20267,

+ 13999, 23295, 21862, 2137, 16507, 16084, 17017, 8874, 19241, 5929,

+ 16540, 16920, 4502, 32502, 23610, 26997, 21283, 8360, 7258, 12471,

+ 185, 16150, 14277, 13715, 15114, 19126, 9579, 31309, 1561, 22289,

+ 3075, 9934, 22012, 1140, 21746, 24567, 22752, 12777, 26222, 10549,

+ 8783, 2917, 18659, 1109, 7086, 18499, 15253, 17306, 24074, 11761,

+ 31880, 16909, 22804, 10986, 18333, 30229, 27497, 7652, 20733, 4679,

+ 20503, 7498, 16058, 10367, 1373, 21228, 26036, 816, 4275, 16374,

+ 19898, 10488, 17418, 32030, 16626, 15992, 26709, 19234, 27259, 14946,

+ 29000, 1906, 18512, 8147, 7776, 22825, 29808, 13028, 11555, 10818,

+ 2364, 23420, 169, 16649, 9504, 10856, 25179, 3535, 20853, 13485,

+ 16379, 226, 20646, 14620, 2789, 31933, 6034, 17448, 7316, 14459,

+ 30258, 17909, 17511, 9874, 13180, 20145, 25253, 13245, 8327, 25895,

+ 13504, 29242, 26351, 11153, 14038, 1334, 5755, 18094, 15997, 24710,

+ 13821, 15125, 12992, 12439, 23418, 13513, 1381, 32424, 3979, 27917,

+ 20850, 25910, 3, 8826, 17135, 26808, 17874, 22350, 11244, 18573,

+ 16938, 18951, 27334, 23603, 22240, 23601, 1447, 20665, 32276, 23420,

+ 8012, 23159, 1300, 24849, 10507, 12028, 28286, 15142, 30228, 23368,

+ 16293, 5328, 5111, 19004, 15670, 20505, 3174, 3918, 23324, 18003,

+ 29756, 18817, 25504, 25260, 27583, 12949, 6613, 19202, 29730, 11898,

+ 23347, 2808, 15951, 28427, 1154, 30025, 22243, 32761, 7674, 12124,

+ 21369, 20229, 4776, 6937, 25899, 1139, 30483, 4860, 29782, 16315,

+ 8992, 11367, 10654, 3201, 9011, 29757, 2098, 9159, 17559, 22956,

+ 32081, 19810, 16672, 15178, 2318, 30122, 19982, 19044, 25680, 19318,

+ 4661, 14482, 18460, 31304, 18267, 25487, 14871, 21700, 2786, 29512,

+ 582, 871, 8615, 7731, 11801, 2933, 13097, 2018, 17576, 16947,

+ 16366, 28120, 4156, 87, 22306, 5787, 8465, 10685, 20354, 14091,

+ 27994, 23899, 1912, 16881, 12934, 24951, 28807, 21979, 31682, 8215,

+ 27114, 15656, 29119, 18362, 11896, 13407, 22453, 25669, 22987, 27333,

+ 22952, 1088, 18593, 28974, 4074, 15938, 22658, 2835, 23521, 10922,

+ 19108, 5605, 522, 9616, 19979, 31393, 9534, 27900, 29940, 23973,

+ 1844, 28501, 6516, 194, 12872, 24092, 30045, 2962, 28794, 22746,

+ 29025, 11787, 13242, 17494, 28538, 20821, 21347, 8716, 5257, 19161,

+ 17157, 31707, 21821, 17819, 9831, 14334, 18998, 21961, 26316, 26941,

+ 3946, 27284, 11638, 28516, 13000, 4670, 26473, 31733, 30236, 17524,

+ 13937, 20250, 26675, 9951, 29542, 16605, 6463, 32758, 9647, 27291,

+ 28284, 19478, 5125, 1206, 22804, 10452, 21113, 19595, 29761, 2706,

+ 29113, 1700, 20145, 28752, 13199, 28974, 25390, 2501, 26794, 15021,

+ 1150, 942, 23457, 20718, 16520, 28263, 27957, 7229, 32441, 29368,

+ 17879, 31449, 23974, 18673, 16490, 4261, 5107, 9785, 29257, 16160,

+ 22643, 5155, 29836, 22935, 5520, 26242, 21127, 27034, 27630, 17279,

+ 16788, 6060, 18507, 29160, 1555, 3134, 4266, 25035, 10670, 23775,

+ 11440, 9028, 26338, 22957, 27982, 16275, 28090, 20239, 6048, 10353,

+ 26078, 4006, 5909, 12709, 20941, 23168, 6865, 18642, 14183, 29071,

+ 8783, 24467, 12718, 29786, 15691, 15305, 20429, 21235, 735, 8756,

+ 25946, 27945, 1004, 3905, 12248, 12798, 15547, 29219, 30080, 21340,

+ 18916, 7717, 321, 25091, 25711, 26175, 8197, 26054, 26938, 5863,

+ 822, 17911, 28570, 16937, 11392, 5664, 13125, 4602, 18137, 6899,

+ 21872, 5322, 4287, 7044, 14644, 14424, 15297, 21174, 32566, 26314,

+ 25921, 5363, 25735, 31229, 3192, 32289, 2249, 31002, 10683, 15313,

+ 24468, 21610, 19196, 18361, 20760, 4971, 22931, 9828, 19971, 10531,

+ 27967, 32296, 23205, 25268, 20583, 6745, 21841, 9265, 6566, 11964,

+ 31751, 26544, 32391, 28478, 30033, 12960, 17293, 20454, 24683, 30045,

+ 28023, 265, 12454, 2306, 6081, 31677, 22542, 16255, 5230, 12943,

+ 1355, 14827, 14597, 14969, 30917, 31003, 31962, 14, 13580, 23667,

+ 19598, 23800, 3702, 764, 14041, 8612, 24074, 17079, 22151, 26428,

+ 23452, 10801, 7617, 15830, 25402, 16472, 26254, 2795, 10695, 30349,

+ 27802, 11274, 9446, 250, 5173, 12749, 10778, 2342, 8862, 18189,

+ 2347, 28358, 19330, 6226, 9675, 2775, 14272, 20365, 21625, 10473,

+ 26991, 30730, 32422, 10942, 8482, 24224, 21014, 2579, 10346, 16939,

+ 32650, 11454, 9629, 26684, 19612, 16121, 23766, 27150, 31978, 2046,

+ 573, 19900, 22134, 27860, 393, 16306, 17741, 5480, 24259, 97,

+ 25191, 26591, 5196, 23096, 25039, 20011, 4641, 13263, 11267, 31196,

+ 16990, 4709, 9886, 6713, 14081, 8332, 28724, 14480, 25841, 3363,

+ 4990, 11978, 4159, 22149, 30135, 27714, 19883, 22016, 1093, 31960,

+ 15722, 8073, 26012, 1601, 25382, 2477, 12640, 12193, 16199, 29131,

+ 29641, 10075, 3441, 4225, 76, 15143, 19533, 29284, 22392, 13926,

+ 29325, 26868, 9246, 31411, 29994, 1999, 5044, 1723, 752, 548,

+ 3579, 24398, 6461, 31851, 4064, 3766, 22022, 9811, 11680, 11847,

+ 11034, 12540, 48, 11831, 22187, 30055, 476, 20400, 17674, 24363,

+ 7726, 1316, 16306, 28521, 30993, 11489, 3464, 27649, 12598, 23013,

+ 26721, 3846, 8631, 7923, 27589, 19056, 26363, 4070, 24819, 29713,

+ 10969, 27974, 3108, 28107, 31744, 11801, 24340, 7679, 13462, 23547,

+ 13503, 19528, 13343, 30065, 31336, 13930, 28833, 19067, 27104, 29061,

+ 8965, 1896, 14597, 27535, 4801, 25070, 25225, 8448, 17588, 7290,

+ 27637, 23247, 4433, 21445, 19693, 2206, 26112, 19112, 23477, 2866,

+ 13761, 10289, 25332, 805, 23827, 23542, 17592, 30687, 32020, 7337,

+ 20155, 27330, 4585, 13549, 9189, 10917, 18528, 4712, 24337, 31620,

+ 22228, 19226, 21268, 26229, 23890, 3309, 3067, 17886, 4345, 11149,

+ 30101, 25062, 13991, 16505, 19250, 12585, 12498, 4443, 13481, 4528,

+ 9395, 12437, 13472, 3616, 31402, 3100, 19463, 817, 15838, 24201,

+ 30438, 14690, 7972, 13933, 26201, 18156, 7970, 2021, 7128, 19956,

+ 9140, 31855, 18876, 27396, 31886, 29948, 7423, 26556, 6947, 29255,

+ 21572, 1477, 454, 22372, 18455, 30215, 11791, 15004, 18549, 20508,

+ 641, 14456, 29583, 7684, 29545, 32028, 27083, 20506, 31497, 30678,

+ 780, 11590, 6390, 27895, 26931, 4981, 24767, 23010, 15334, 7238,

+ 23503, 24418, 8592, 31238, 17045, 9793, 27048, 8415, 20706, 29206,

+ 9271, 4172, 14738, 22110, 21140, 20688, 32110, 16846, 5490, 31208,

+ 10577, 21480, 31773, 21566, 16266, 12493, 22785, 27679, 20610, 18258,

+ 16236, 10287, 1695, 15701, 3733, 14428, 10599, 30290, 11740, 28944,

+ 23529, 26673, 24147, 26283, 6744, 12898, 17790, 23856, 15098, 11052,

+ 5463, 24638, 30272, 22338, 30101, 5955, 14903, 32664, 4654, 10732,

+ 19743, 22900, 29467, 18656, 856, 29896, 347, 11949, 3206, 25791,

+ 23866, 11522, 7149, 22166, 27091, 6688, 28701, 2733, 12756, 12939,

+ 32212, 25566, 2433, 17157, 16928, 269, 4604, 11964, 32708, 5376,

+ 451, 9667, 27613, 28785, 22138, 8127, 3525, 29282, 21483, 28387,

+ 22072, 21169, 29771, 32542, 12725, 31468, 11710, 5522, 6695, 24934,

+ 12574, 9289, 27589, 6795, 1528, 1571, 311, 5232, 10200, 14099,

+ 23290, 12463, 2247, 23691, 22021, 12401, 7441, 12853, 13741, 9932,

+ 21580, 12004, 1222, 25936, 9109, 30154, 4619, 5852, 1309, 26603,

+ 3008, 31926, 4325, 27089, 32405, 475, 4805, 12674, 15310, 6292,

+ 16819, 12463, 27297, 5706, 31810, 28462, 18655, 411, 11881, 27051,

+ 24279, 1710, 17542, 18586, 10872, 1475, 20386, 879, 1461, 28686,

+ 16119, 17426, 19502, 26309, 21167, 7821, 1036, 20600, 11247, 28936,

+ 3628, 22689, 7700, 32760, 8577, 3452, 9533, 8851, 5555, 4120,

+ 9737, 4999, 16652, 2734, 23202, 14827, 28053, 24883, 4346, 32374,

+ 10620, 20521, 7764, 239, 30393, 28090, 11271, 16868, 7665, 16647,

+ 16766, 5279, 10395, 25534, 12164, 27990, 18017, 25066, 16574, 24482,

+ 8649, 19472, 21369, 24882, 26644, 12151, 16551, 9409, 2151, 26823,

+ 13347, 8517, 28200, 1238, 23101, 6506, 15019, 9150, 1650, 14142,

+ 16910, 4659, 14203, 4142, 20321, 3347, 7306, 9521, 29706, 25407,

+ 32720, 13123, 26216, 27050, 14914, 26645, 13239, 30127, 5277, 20227,

+ 18740, 20904, 14759, 2630, 6273, 24508, 7608, 11371, 23370, 24312,

+ 32634, 17923, 14889, 1697, 26093, 31645, 23239, 27593, 16302, 14321,

+ 6469, 25889, 1912, 20062, 28890, 24846, 4587, 8599, 22461, 25087,

+ 26764, 8857, 4677, 5373, 22030, 15328, 16718, 13956, 2000, 31962,

+ 12256, 14737, 26790, 6556, 9227, 25852, 6364, 4820, 14101, 23304,

+ 10104, 6654, 30936, 16185, 28864, 1499, 25189, 28261, 17916, 27423,

+ 23533, 32014, 17021, 11626, 23010, 28655, 29150, 7290, 21849, 25301,

+ 11146, 29087, 9139, 4528, 18302, 16751, 29052, 30698, 4177, 13754,

+ 25747, 31223, 5745, 9153, 10635, 19758, 18607, 21154, 28754, 4567,

+ 30206, 1559, 7184, 21381, 7287, 8544, 10834, 25510, 10657, 30334,

+ 5480, 16984, 4080, 5538, 13835, 2430, 21899, 12517, 26692, 3603,

+ 82, 26681, 30601, 11199, 800, 4512, 5672, 28328, 4173, 20892,

+ 25577, 3979, 30072, 6118, 18414, 30219, 25731, 21602, 8671, 13641,

+ 19934, 30803, 5700, 14004, 12297, 6092, 31282, 1827, 84, 16231,

+ 8746, 31265, 4330, 21048, 6206, 6023, 6157, 1028, 32117, 1873,

+ 15523, 17327, 6769, 28586, 19442, 10740, 25423, 31049, 31912, 16473,

+ 29391, 28160, 25374, 13409, 16565, 9618, 31453, 19203, 5999, 13510,

+ 26978, 10331, 3319, 4793, 24094, 16288, 763, 10360, 13249, 32598,

+ 29244, 32462, 14008, 3524, 1332, 32347, 13556, 10665, 17915, 30182,

+ 15086, 811, 25451, 23285, 8680, 8464, 20867, 30874, 21365, 9776,

+ 18697, 143, 26171, 2858, 27251, 12933, 30712, 8279, 2056, 3514,

+ 26819, 27644, 23363, 16586, 23445, 14532, 10616, 19399, 8199, 26733,

+ 7097, 2187, 26973, 24257, 19963, 3405, 30404, 6344, 22901, 7539,

+ 4312, 17468, 24137, 7335, 105, 27453, 20582, 14381, 25215, 2118,

+ 2989, 14964, 32155, 5728, 29523, 15595, 31808, 29077, 8326, 11285,

+ 12466, 7080, 25683, 20960, 17918, 14595, 8391, 23091, 570, 23025,

+ 15700, 1478, 32270, 25613, 14967, 32566, 30068, 12283, 10392, 1625,

+ 5563, 12117, 1586, 26063, 27858, 12008, 18739, 26329, 24003, 2337,

+ 6054, 14190, 15998, 23746, 29583, 30348, 728, 7129, 24086, 23245,

+ 6355, 1779, 13800, 10042, 23072, 26765, 21723, 25187, 14050, 9419,

+ 12497, 944, 32181, 29037, 990, 2802, 25839, 18942, 16301, 13885,

+ 14630, 29774, 20511, 18938, 21746, 10531, 28982, 7992, 17907, 13612,

+ 7218, 27715, 17174, 9782, 20473, 31608, 22549, 22690, 14524, 17495,

+ 27197, 30999, 31448, 6874, 31348, 20084, 9466, 26885, 18554, 24585,

+ 3463, 9919, 15215, 19462, 7995, 992, 13206, 25139, 22800, 30859,

+ 10584, 22242, 1377, 12222, 15756, 8739, 27727, 39, 7925, 24374,

+ 1380, 26426, 26892, 16454, 27766, 14976, 24576, 27220, 7630, 818,

+ 11772, 19825, 15754, 14342, 1448, 19760, 28224, 18761, 19954, 19803,

+ 31460, 13102, 15118, 30437, 22508, 2662, 30907, 18720, 16305, 14064,

+ 18889, 19248, 28185, 20787, 16600, 29120, 16243, 21834, 30306, 3315,

+ 13986, 8351, 24572, 21149, 11902, 28091, 11480, 22708, 14967, 16988,

+ 19343, 5121, 31356, 968, 32029, 12059, 26139, 9570, 6445, 19862,

+ 21225, 9595, 26520, 3960, 14884, 19562, 13096, 26860, 407, 25055,

+ 31137, 8763, 19390, 19572, 23810, 5111, 4907, 20357, 14856, 29562,

+ 5416, 23362, 2036, 17295, 20382, 8962, 25998, 15726, 5685, 28123,

+ 30570, 17902, 701, 21871, 31594, 17142, 17613, 26376, 13700, 25908,

+ 5289, 23272, 6597, 14866, 19817, 21978, 22422, 6630, 29272, 26893,

+ 10815, 18025, 9115, 17442, 4777, 19819, 17939, 19844, 24168, 965,

+ 25220, 5368, 8184, 11406, 32758, 21621, 31815, 8338, 32091, 29493,

+ 29044, 2559, 11891, 16140, 31447, 2146, 16365, 20473, 13889, 20690,

+ 9935, 18939, 28293, 7787, 7959, 28965, 12087, 1791, 32162, 17397,

+ 17843, 2055, 22862, 4066, 21345, 24544, 20316, 13364, 21816, 1844,

+ 26392, 1816, 17537, 24246, 22715, 4340, 13534, 25874, 15248, 4600,

+ 5002, 2339, 24406, 1526, 27618, 27751, 21734, 6771, 21797, 10673,

+ 27157, 19198, 28024, 29726, 7388, 6080, 1581, 8778, 18870, 2645,

+ 25924, 31172, 6474, 31962, 16434, 20159, 29002, 22343, 21474, 19466,

+ 27803, 14079, 15866, 30530, 7862, 13478, 31583, 17734, 9806, 15411,

+ 12283, 21227, 21299, 11078, 7102, 5617, 25462, 10683, 24802, 6710,

+ 7118, 28799, 32628, 7978, 16186, 29346, 10768, 10627, 10728, 7342,

+ 22508, 23858, 4950, 7736, 14359, 13205, 15287, 29108, 27139, 25070,

+ 2200, 5774, 8002, 1044, 21699, 12662, 2701, 24424, 30563, 1787,

+ 16394, 21003, 18026, 1115, 27343, 16974, 6192, 19097, 31650, 8810,

+ 2140, 28625, 13570, 23666, 1032, 27337, 14444, 14981, 24864, 23752,

+ 30935, 8008, 1291, 11691, 13953, 8851, 24206, 11829, 26605, 26219,

+ 14061, 13479, 13356, 14385, 7763, 26512, 25181, 21016, 30579, 10983,

+ 25200, 20701, 26224, 25431, 21295, 12722, 9978, 986, 10622, 27771,

+ 3515, 6537, 23777, 32316, 14577, 18867, 15680, 30674, 13404, 30252,

+ 21991, 25826, 5210, 31719, 465, 7952, 19537, 16327, 5414, 24945,

+ 17485, 32179, 16386, 12354, 29162, 3561, 3704, 26842, 30837, 5268,

+ 10711, 3549, 5198, 20384, 16171, 9139, 21904, 30413, 12039, 12600,

+ 28148, 25090, 27266, 14517, 5619, 27109, 8576, 15632, 19755, 13992,

+ 9779, 10047, 31236, 28965, 10721, 8194, 11411, 2606, 14055, 12754,

+ 2239, 3102, 3070, 18196, 7074, 10932, 15549, 22675, 8242, 1314,

+ 15199, 24621, 30496, 20064, 12231, 25549, 22016, 20422, 16321, 11417,

+ 29099, 31194, 11403, 32364, 10209, 30567, 27028, 25478, 27699, 30415,

+ 4227, 24706, 31776, 7585, 22139, 9353, 7807, 23150, 26269, 2502,

+ 29213, 2265, 17871, 31257, 4006, 7150, 9148, 3088, 713, 17077,

+ 15644, 27667, 24215, 15110, 13110, 26078, 28972, 18078, 31907, 8757,

+ 23186, 30323, 21332, 27858, 2786, 16453, 17367, 5795, 27564, 4726,

+ 16853, 18482, 14489, 23067, 26080, 22629, 19279, 12115, 14443, 31591,

+ 24213, 7128, 11802, 24038, 3256, 12243, 14653, 127, 3373, 22773,

+ 5271, 26486, 30071, 12227, 11107, 29355, 332, 12081, 17049, 29129,

+ 9715, 2675, 18285, 18625, 29936, 5392, 26392, 14455, 4579, 28984,

+ 21468, 8122, 16302, 30807, 23362, 18554, 18646, 4586, 12711, 5429,

+ 18220, 27794, 5878, 8883, 3756, 19814, 14519, 12787, 16293, 27022,

+ 30025, 28261, 17434, 32270, 25707, 25690, 15464, 6623, 18690, 15288,

+ 7978, 20036, 20502, 2802, 4186, 14683, 16669, 22071, 13241, 7922,

+ 892, 3818, 32368, 925, 7499, 10067, 19447, 32261, 3928, 3732,

+ 14902, 12931, 12911, 10462, 4330, 11502, 31193, 6116, 14411, 3249,

+ 16163, 26512, 748, 14112, 31521, 29429, 20194, 1036, 4145, 5510,

+ 16936, 6292, 2500, 31877, 9794, 25663, 29979, 11454, 10017, 29768,

+ 14159, 4212, 31047, 4409, 1172, 8604, 11051, 23227, 23742, 1097,

+ 9695, 21933, 12549, 9576, 8432, 8307, 5893, 12717, 3470, 16785,

+ 11529, 30925, 15596, 17528, 5000, 4334, 17898, 6303, 8176, 20059,

+ 28146, 26326, 11427, 25469, 6431, 20696, 10815, 15623, 1445, 20255,

+ 22051, 28272, 22125, 8444, 14895, 17062, 12543, 742, 22986, 17665,

+ 29349, 7955, 12330, 22133, 16589, 27717, 25552, 8973, 30896, 28391,

+ 21329, 2964, 16945, 4184, 24412, 22421, 18952, 135, 5625, 17287,

+ 26399, 21952, 8975, 16193, 12092, 24261, 10793, 28852, 16097, 23329,

+ 28025, 20184, 14449, 3513, 26142, 26855, 16019, 23972, 12706, 11722,

+ 28123, 31036, 30919, 18384, 6568, 12149, 13187, 24742, 20552, 29550,

+ 28233, 24964, 27235, 15942, 29834, 932, 10646, 17201, 1148, 17656,

+ 10846, 10699, 28698, 5404, 11576, 17068, 20332, 20106, 31494, 27196,

+ 10248, 20493, 26805, 3528, 11737, 19064, 15901, 1750, 287, 5783,

+ 1064, 16566, 3511, 10086, 32311, 23642, 28573, 27777, 21185, 18024,

+ 175, 14556, 10045, 29580, 29619, 436, 13123, 14099, 8348, 2501,

+ 3822, 26550, 26121, 19646, 16516, 18099, 17423, 16114, 19801, 23843,

+ 5176, 13648, 20976, 17287, 715, 2453, 25956, 1956, 11598, 20160,

+ 19462, 9361, 2634, 10694, 15688, 16654, 32334, 8840, 16602, 10263,

+ 16950, 258, 26386, 12217, 32429, 2757, 24721, 549, 16625, 13479,

+ 14628, 32003, 11479, 7353, 14824, 6920, 4110, 24697, 14002, 7115,

+ 15015, 9033, 19117, 24020, 16597, 22816, 18501, 7926, 2546, 10624,

+ 24644, 5856, 20675, 32424, 17467, 8174, 30973, 5386, 18468, 25157,

+ 24072, 7935, 18245, 13598, 32514, 20666, 20568, 10850, 11271, 26746,

+ 23784, 30840, 6320, 1796, 6142, 13914, 30681, 27729, 30717, 7663,

+ 1192, 27780, 12235, 18581, 7371, 12575, 15153, 6652, 20480, 6773,

+ 2693, 19771, 2267, 21859, 4486, 22557, 12996, 31035, 15751, 6332,

+ 319, 16897, 5840, 338, 15472, 15066, 4417, 13899, 14046, 27841,

+ 20536, 21151, 20599, 25980, 25013, 18014, 10964, 10958, 13500, 909,

+ 29375, 28143, 20219, 27952, 25330, 4921, 1453, 15528, 25634, 25124,

+ 15806, 20799, 28220, 29044, 30512, 7682, 3823, 9137, 10173, 10703,

+ 14698, 18392, 10430, 21934, 17255, 12880, 15435, 23908, 13160, 25119,

+ 28068, 17990, 17472, 1630, 20687, 12364, 16854, 30698, 25987, 15718,

+ 8998, 31581, 8517, 787, 1416, 24381, 25809, 14895, 27957, 19059,

+ 24763, 8460, 28423, 20222, 11606, 17349, 10112, 5352, 6613, 7887,

+ 8974, 12665, 30384, 20433, 7053, 32428, 24394, 18614, 12046, 1759,

+ 18128, 14592, 29655, 22734, 19556, 8543, 3499, 22466, 6779, 17794,

+ 10315, 23558, 21891, 28717, 31548, 14235, 24010, 15756, 15051, 29484,

+ 26779, 24519, 6735, 22340, 13482, 4566, 17326, 5567, 23985, 11415,

+ 26658, 10111, 4956, 4637, 20029, 12896, 14179, 25419, 299, 2925,

+ 9973, 13218, 1336, 10580, 13149, 12120, 13713, 6935, 3552, 26538,

+ 12111, 22277, 10980, 14707, 28081, 30185, 24664, 508, 31657, 11905,

+ 17231, 5654, 24219, 9521, 2286, 12134, 7777, 25593, 28297, 17409,

+ 3730, 3749, 27913, 31801, 15620, 10051, 15249, 15030, 10639, 30426,

+ 25953, 27336, 11028, 28249, 30458, 2299, 9662, 5070, 1666, 6636,

+ 30344, 20440, 7019, 860, 14336, 12127, 14672, 31619, 17482, 28034,

+ 4639, 678, 6247, 22993, 9085, 6892, 31928, 28349, 17254, 12910,

+ 5821, 11340, 24596, 29581, 18467, 2834, 30499, 28552, 32510, 7004,

+ 2034, 22350, 23379, 9390, 1356, 13968, 19929, 22896, 2632, 25883,

+ 5120, 29412, 22125, 8805, 13619, 18779, 21786, 3941, 25946, 15529,

+ 13349, 31400, 28836, 214, 19907, 12962, 5251, 8982, 27048, 21058,

+ 27128, 23291, 6511, 15305, 17680, 31722, 13371, 13787, 11695, 6860,

+ 13727, 24278, 21900, 15365, 955, 27236, 12157, 7594, 24744, 23884,

+ 3061, 29166, 2839, 15246, 24266, 7646, 21044, 23726, 4668, 20559,

+ 8401, 23120, 2868, 1300, 17344, 19717, 17097, 18548, 28544, 19301,

+ 6408, 20187, 18717, 24414, 17653, 13519, 30289, 26059, 1485, 31526,

+ 30959, 3144, 31118, 4982, 22913, 24901, 15545, 4302, 25904, 10842,

+ 14167, 20643, 741, 29914, 15162, 12301, 25518, 5291, 22405, 8500,

+ 4707, 1365, 1391, 13572, 9865, 24920, 4675, 27945, 7798, 25539,

+ 27307, 27191, 9398, 10242, 11055, 18984, 17582, 7160, 6649, 19212,

+ 21119, 22606, 28123, 1532, 2606, 21258, 1683, 22096, 10753, 8291,

+ 31309, 16658, 3116, 13779, 7273, 28850, 940, 25455, 24959, 6394,

+ 116, 30580, 17568, 22341, 16071, 16418, 4575, 25324, 1509, 24525,

+ 14864, 8706, 14825, 10033, 5072, 30273, 17650, 27142, 11718, 22083,

+ 7041, 468, 5672, 1782, 24610, 29449, 15232, 2378, 27215, 26697,

+ 19120, 4140, 13457, 30725, 11827, 4792, 30184, 26703, 4775, 20138,

+ 27245, 25836, 5256, 20246, 3894, 23467, 31551, 19290, 21882, 29430,

+ 9563, 29264, 4341, 20135, 2590, 30152, 9614, 5917, 29755, 27189,

+ 14392, 30350, 23006, 20134, 26390, 158, 30189, 20728, 19682, 14385,

+ 1677, 8778, 21391, 10110, 21737, 28594, 6701, 15974, 27183, 21294,

+ 29198, 27395, 5594, 20702, 14119, 8323, 10551, 13424, 1976, 16439,

+ 3106, 25307, 7984, 6375, 3857, 29776, 22603, 28777, 7765, 10861,

+ 6781, 19313, 15004, 5813, 13971, 26539, 23225, 1341, 30360, 7175,

+ 6824, 32679, 25845, 4949, 23500, 31828, 3805, 5393, 14972, 3542,

+ 17896, 20608, 31934, 9892, 9470, 24060, 24146, 17682, 23671, 27275,

+ 24051, 7040, 2432, 16823, 28633, 2257, 7361, 10650, 14722, 29983,

+ 5181, 17721, 15026, 26284, 3193, 28947, 1977, 25372, 27872, 19961,

+ 30964, 28898, 13158, 28191, 29590, 19705, 9068, 22644, 12200, 10452,

+ 23523, 22063, 8015, 1175, 6325, 16042, 23374, 31111, 9056, 13684,

+ 14539, 2239, 14052, 3746, 27734, 16934, 23264, 19813, 24103, 22429,

+ 31224, 28898, 5031, 28797, 14201, 829, 21043, 20800, 18496, 7927,

+ 24348, 11134, 21208, 24187, 242, 10780, 6882, 27123, 9730, 3520,

+ 31674, 5984, 21533, 28039, 30295, 20714, 17819, 28667, 22131, 13684,

+ 22432, 4159, 13036, 10100, 11678, 17293, 19819, 15874, 11803, 4835,

+ 5443, 19503, 15541, 31992, 20892, 29335, 21859, 13429, 14032, 28474,

+ 27901, 3682, 27413, 8071, 15103, 13534, 15965, 26810, 20618, 29204,

+ 6522, 31336, 8363, 10090, 26758, 8024, 24032, 17659, 1154, 4245,

+ 20696, 21832, 24637, 32449, 3195, 28970, 31863, 17836, 9002, 12300,

+ 26439, 32294, 16712, 26710, 19130, 25105, 20729, 21548, 20157, 14010,

+ 2857, 28249, 21053, 12649, 6609, 7046, 16268, 2614, 12149, 29616,

+ 7, 12575, 14322, 16345, 21238, 22872, 1654, 32765, 2995, 20194,

+ 9424, 3399, 31503, 19039, 10218, 11397, 2033, 14117, 11667, 9434,

+ 15168, 8081, 26498, 11954, 17155, 13213, 22424, 20219, 12487, 7605,

+ 8550, 29331, 30529, 6599, 5359, 24060, 27445, 666, 22191, 17751,

+ 19351, 18784, 18652, 8336, 5359, 2958, 6635, 4054, 9218, 15083,

+ 7254, 25678, 27566, 3047, 19357, 8456, 16918, 7727, 8843, 2098,

+ 2303, 4990, 9914, 2187, 13690, 2230, 19801, 7963, 31428, 9519,

+ 7469, 290, 7274, 13391, 12758, 8782, 11184, 32091, 1108, 27440,

+ 13364, 19852, 7369, 13297, 7119, 26726, 4480, 22337, 14780, 21061,

+ 30511, 29073, 26876, 10553, 9849, 8322, 6648, 19, 31415, 22173,

+ 10089, 28608, 28152, 5956, 29301, 21206, 13894, 12008, 2586, 24429,

+ 18476, 15229, 25040, 4912, 25205, 6443, 23402, 9652, 1845, 1863,

+ 10302, 29960, 1550, 6529, 17797, 8333, 31660, 18783, 6149, 17927,

+ 27282, 15338, 27373, 5365, 20761, 4007, 22016, 11294, 24757, 18120,

+ 20213, 30061, 14971, 8612, 27166, 29694, 21728, 32101, 3657, 14457,

+ 28356, 2816, 8164, 28575, 13231, 29291, 26468, 16162, 30042, 13834,

+ 14055, 25786, 7793, 27242, 4887, 19317, 17047, 5681, 25426, 2895,

+ 28587, 20053, 27913, 1794, 9289, 25229, 7782, 7199, 3988, 11781,

+ 27698, 6494, 32307, 24662, 18165, 28466, 6298, 21173, 27487, 20129,

+ 22155, 15722, 4582, 10835, 19420, 24965, 16817, 19945, 12922, 31436,

+ 19125, 32656, 21934, 3575, 11038, 24533, 17055, 26400, 25584, 31675,

+ 25113, 23669, 238, 17674, 24460, 10544, 22459, 25835, 344, 29897,

+ 16959, 7346, 22087, 23145, 22604, 10491, 23643, 1187, 27777, 23288,

+ 1227, 12639, 20591, 23561, 14664, 12822, 9211, 20365, 18052, 15429,

+ 13315, 18169, 20469, 7707, 11333, 15399, 12503, 11125, 8316, 1520,

+ 28272, 30477, 12491, 31484, 8087, 11246, 19807, 14041, 28023, 6956,

+ 23889, 13643, 4497, 20945, 19657, 14307, 29952, 19226, 18025, 10707,

+ 21761, 4836, 7145, 30209, 4274, 27745, 8702, 858, 1050, 20751,

+ 897, 19305, 5226, 23531, 20429, 16168, 20866, 29922, 18537, 28182,

+ 20663, 20616, 12775, 9097, 9428, 6156, 11275, 28230, 5982, 19820,

+ 21808, 17999, 1821, 16357, 15592, 17660, 4055, 9390, 27107, 9037,

+ 24415, 10213, 30482, 29311, 23503, 2506, 3083, 17117, 32529, 7211,

+ 13488, 11481, 2980, 13343, 23563, 28763, 32412, 25591, 28285, 7769,

+ 25323, 4466, 26392, 168, 27104, 15408, 19529, 13330, 27885, 2153,

+ 24506, 10408, 15533, 25055, 1398, 31833, 24869, 19217, 9807, 25540,

+ 12107, 11442, 4477, 5451, 22468, 14681, 8583, 27241, 21234, 14714,

+ 10343, 11077, 20014, 21397, 26345, 14471, 32338, 9389, 4948, 1898,

+ 31611, 15612, 13132, 9234, 2573, 21733, 19703, 11809, 29943, 20010,

+ 13151, 901, 23864, 21855, 29207, 3475, 8866, 14239, 7202, 25690,

+ 18909, 16509, 528, 15409, 944, 13373, 4970, 20883, 14716, 14917,

+ 28496, 18221, 17161, 19406, 26721, 10804, 10629, 31455, 32731, 4348,

+ 7114, 9596, 7171, 1991, 30688, 26907, 32200, 16347, 3523, 27223,

+ 14755, 13527, 32614, 17640, 14273, 15430, 25079, 14291, 32612, 13173,

+ 1125, 25054, 20871, 16258, 32544, 8775, 22209, 21430, 28960, 29109,

+ 25707, 29204, 3624, 18287, 7429, 23090, 25164, 24268, 28630, 6728,

+ 28337, 28907, 15315, 13959, 916, 13987, 6594, 23212, 31629, 18109,

+ 4511, 18900, 15381, 9313, 16191, 146, 8007, 4559, 10803, 15679,

+ 10979, 31568, 21743, 25233, 14488, 3691, 18220, 26735, 29571, 20827,

+ 6026, 20228, 20211, 20161, 14458, 18451, 23151, 10647, 3163, 2698,

+ 5882, 11621, 1251, 1113, 12693, 11959, 20929, 24196, 18182, 20430,

+ 25216, 1911, 5336, 32150, 16303, 14235, 15267, 14552, 32575, 9254,

+ 30349, 32689, 22572, 21559, 27665, 27459, 6496, 19490, 31743, 21930,

+ 2004, 776, 11972, 7217, 26616, 22188, 10732, 20934, 13909, 29057,

+ 19941, 30124, 21360, 22280, 24838, 624, 9970, 2648, 27599, 26910,

+ 32263, 766, 10867, 19636, 10500, 25608, 14227, 4567, 7244, 10589,

+ 21581, 5829, 6260, 16208, 29045, 10123, 7589, 14452, 24098, 632,

+ 11842, 5553, 16237, 209, 9419, 21655, 13685, 14278, 8450, 14323,

+ 20903, 9637, 20556, 32416, 16956, 16206, 5465, 31904, 22274, 29159,

+ 21255, 19051, 17248, 27857, 24196, 32391, 16788, 18394, 23731, 9561,

+ 31552, 22964, 3794, 27451, 23333, 21158, 21081, 11471, 11310, 28545,

+ 22565, 24978, 10672, 22742, 22229, 5300, 25840, 614, 15477, 24615,

+ 9190, 7898, 9050, 7670, 7488, 31668, 3660, 17368, 13738, 22918,

+ 12267, 7429, 8781, 5217, 16715, 22088, 5269, 12433, 11234, 4181,

+ 21304, 8071, 2724, 27742, 25716, 20759, 18028, 18145, 11672, 25828,

+ 20894, 5316, 11205, 4120, 18186, 5795, 10742, 2904, 28692, 22121,

+ 6206, 7415, 30226, 8989, 26705, 4969, 17142, 32511, 4934, 17403,

+ 21805, 13268, 11419, 25026, 2759, 382, 9850, 16593, 10199, 6863,

+ 11066, 22959, 7197, 25759, 12329, 8457, 19426, 11036, 9609, 1955,

+ 24612, 16738, 26584, 13972, 25075, 16204, 22101, 23475, 9499, 20873,

+ 12991, 6733, 17923, 20466, 11872, 29721, 16085, 3610, 18506, 15981,

+ 22495, 6695, 24801, 30641, 30522, 24033, 9881, 4373, 5033, 22025,

+ 16385, 127, 20163, 21484, 22273, 11975, 31317, 32056, 26975, 5671,

+ 3330, 32269, 648, 9453, 18988, 8535, 17038, 14451, 8472, 17244,

+ 22125, 17489, 1868, 21137, 17810, 31185, 21052, 21170, 14494, 932,

+ 21542, 5649, 7527, 10707, 16443, 8495, 19519, 29176, 6655, 27785,

+ 4730, 4013, 13298, 30900, 17962, 14661, 368, 26796, 18221, 13498,

+ 16342, 5738, 4458, 12519, 15078, 21940, 17495, 16119, 12397, 22841,

+ 17343, 30, 5922, 28125, 21954, 23431, 19666, 82, 25117, 20621,

+ 28602, 8424, 13995, 14637, 26421, 31142, 29996, 4283, 24471, 27289,

+ 3654, 4821, 15704, 16492, 28105, 18070, 19317, 14649, 15415, 18955,

+ 10515, 19359, 22916, 29163, 14949, 25621, 29978, 4482, 8401, 3197,

+ 26400, 32495, 32334, 12797, 12028, 10127, 2065, 32010, 15126, 18617,

+ 11368, 28613, 24031, 8364, 20454, 16011, 5139, 11205, 26048, 5831,

+ 59, 16886, 26487, 18443, 16245, 10355, 28599, 864, 31607, 27566,

+ 31872, 9434, 24018, 5510, 7299, 15215, 18548, 5051, 3023, 17160,

+ 30577, 25254, 940, 17625, 28675, 20519, 16839, 20974, 24783, 27358,

+ 2704, 3079, 22377, 29086, 10977, 12454, 28443, 22302, 15584, 23142,

+ 23778, 11762, 13350, 27790, 31930, 4282, 29985, 23782, 17435, 23194,

+ 31670, 20426, 15812, 17386, 21803, 14972, 29367, 14126, 28997, 32703,

+ 25733, 29256, 3757, 15009, 31947, 18412, 18072, 11160, 5629, 5461,

+ 31655, 31696, 354, 16438, 12300, 19140, 11872, 20724, 1775, 14860,

+ 22266, 32018, 29968, 27509, 21911, 13805, 25773, 9559, 2053, 4009,

+ 20646, 4387, 25533, 5227, 6879, 18492, 8041, 22472, 8678, 8968,

+ 5539, 24190, 22998, 32326, 17664, 11874, 27771, 27298, 4429, 6810,

+ 9398, 31366, 10776, 8204, 10531, 8756, 14963, 26134, 18938, 24082,

+ 17908, 14208, 26163, 4932, 22272, 1967, 11246, 24192, 25161, 22555,

+ 14353, 17694, 918, 4611, 22835, 31855, 30659, 10335, 31161, 15184,

+ 30728, 5654, 30014, 18943, 23166, 3185, 23865, 17453, 7134, 26063,

+ 28889, 16724, 13964, 12443, 19508, 22346, 27349, 26236, 4769, 11031,

+ 23669, 9163, 6242, 1028, 10589, 29514, 20359, 5364, 23987, 531,

+ 31758, 28663, 26905, 20430, 29519, 22557, 31026, 12071, 27288, 25992,

+ 23906, 10880, 6420, 12229, 22486, 8418, 12529, 29277, 32709, 12090,

+ 29633, 24486, 6389, 14786, 26145, 5599, 1152, 10685, 26265, 27260,

+ 11992, 13159, 11204, 32703, 7945, 14380, 28081, 22664, 2878, 6424,

+ 16008, 24174, 5767, 3471, 22129, 3598, 7129, 21054, 22193, 15779,

+ 10839, 17489, 18454, 12760, 5839, 15590, 22678, 29914, 18056, 16578,

+ 7219, 9136, 5947, 22595, 21794, 9679, 2143, 9110, 1835, 745,

+ 2473, 32554, 23123, 19207, 4820, 19557, 4281, 17623, 26782, 12949,

+ 5054, 22087, 13075, 27689, 23656, 23378, 18701, 29729, 15113, 24346,

+ 21756, 10179, 16923, 27448, 14051, 12432, 22639, 24912, 18339, 19062,

+ 13959, 4840, 24956, 14919, 21312, 2938, 20945, 2154, 947, 16583,

+ 6187, 21457, 21086, 7535, 5761, 20778, 20863, 6591, 5815, 19034,

+ 27841, 22218, 18788, 12839, 32282, 28603, 8664, 8244, 10740, 30057,

+ 13150, 18739, 18059, 18476, 29630, 18262, 21142, 17392, 1798, 18182,

+ 16169, 29319, 30858, 27608, 4314, 14404, 1322, 445, 7203, 11973,

+ 23251, 20089, 24839, 8720, 29001, 5974, 18936, 25570, 24611, 12057,

+ 20985, 26947, 22039, 8245, 22016, 26206, 5495, 18239, 5534, 23696,

+ 6652, 29090, 9953, 20159, 19395, 21652, 24954, 4077, 25493, 28744,

+ 1307, 24588, 25707, 13157, 7971, 19220, 20017, 29368, 29565, 32340,

+ 28107, 2341, 27845, 2053, 28246, 13284, 22445, 13605, 4016, 32490,

+ 28064, 387, 9786, 21924, 29349, 19990, 18396, 3051, 27269, 20882,

+ 19018, 29493, 10544, 30525, 30342, 20488, 16989, 8191, 5543, 17333,

+ 7281, 31161, 15064, 32322, 10914, 24792, 28323, 19624, 4700, 42,

+ 8048, 22335, 16355, 8944, 31560, 9334, 11835, 27956, 5855, 13255,

+ 26181, 28253, 1490, 17642, 31018, 16896, 18477, 8009, 31228, 13049,

+ 12592, 28085, 15003, 5307, 11091, 599, 20438, 18148, 32135, 5865,

+ 8403, 5909, 30143, 23846, 1457, 29952, 7343, 29566, 14699, 11458,

+ 22227, 4623, 8960, 7028, 5812, 977, 14801, 4604, 1127, 16400,

+ 2378, 23081, 15958, 14368, 6084, 4608, 5955, 11596, 13482, 20816,

+ 30089, 8975, 29147, 19853, 14245, 16775, 19536, 28634, 16886, 15398,

+ 18431, 4456, 6593, 4267, 767, 20991, 12664, 12880, 1004, 15578,

+ 19004, 30021, 18317, 12216, 3744, 20062, 20916, 14384, 19120, 15113,

+ 17766, 23365, 25906, 25986, 18492, 31546, 32299, 22858, 13577, 20392,

+ 22181, 23509, 25021, 9165, 26032, 15746, 31882, 20263, 16039, 14033,

+ 17477, 7233, 11444, 9681, 8206, 4558, 10134, 16343, 23091, 20980,

+ 1442, 2933, 594, 1002, 3848, 13994, 15038, 31685, 22104, 7511,

+ 29988, 5263, 31301, 5106, 25199, 28826, 13480, 19070, 6632, 5139,

+ 23240, 23483, 15266, 3546, 13016, 23706, 4629, 8849, 17089, 32755,

+ 30473, 11764, 31778, 8826, 32694, 11880, 27029, 21232, 13353, 11990,

+ 16693, 10902, 21993, 697, 93, 2535, 31195, 2166, 29874, 3462,

+ 31075, 26093, 22115, 20342, 32460, 29517, 22447, 18569, 12522, 18476,

+ 19880, 26139, 16893, 7895, 22071, 10239, 26073, 486, 8033, 23226,

+ 29508, 30740, 13256, 16879, 13472, 8782, 28789, 18203, 11210, 10,

+ 2004, 131, 19777, 19930, 13824, 9322, 30347, 12865, 2625, 15494,

+ 9172, 11461, 27092, 11701, 10457, 31557, 12266, 26605, 28932, 27021,

+ 3826, 21105, 2776, 16168, 5915, 18507, 656, 16245, 1557, 14582,

+ 20483, 28670, 17432, 16731, 23499, 6404, 12840, 20735, 24486, 13407,

+ 11671, 12154, 9756, 16005, 27851, 30251, 28003, 7656, 6466, 21034,

+ 29055, 5253, 19154, 8830, 25005, 28601, 18486, 18064, 17666, 27223,

+ 12486, 12512, 4688, 29945, 29574, 4599, 32585, 22675, 14178, 12189,

+ 19175, 26446, 6328, 15435, 1803, 12179, 24599, 17123, 9572, 25957,

+ 5703, 31391, 19346, 30197, 6537, 5959, 12939, 31088, 6175, 27048,

+ 5438, 30492, 5135, 25665, 29303, 12195, 21541, 22591, 9731, 25007,

+ 26167, 32428, 7444, 15542, 5804, 8675, 10727, 30232, 319, 31559,

+ 15011, 13415, 7937, 6452, 30597, 17669, 30109, 24886, 3130, 20469,

+ 19424, 633, 8332, 32235, 1913, 27777, 17473, 17573, 6141, 7707,

+ 21056, 19838, 4910, 24724, 3830, 10817, 26236, 17192, 1528, 19515,

+ 16844, 27325, 27370, 29076, 8057, 2514, 415, 31967, 3480, 5298,

+ 20865, 27375, 7297, 1517, 10292, 23276, 5771, 18184, 12150, 23719,

+ 25878, 4468, 6730, 31019, 18127, 23485, 11605, 10645, 15151, 9988,

+ 9864, 12325, 18245, 16559, 18431, 1940, 30646, 19551, 2601, 23720,

+ 17410, 10786, 14634, 17927, 14088, 3307, 381, 11849, 205, 21823,

+ 12254, 9296, 21881, 1072, 10343, 1500, 15778, 23183, 22777, 14426,

+ 15309, 30814, 10973, 25597, 27442, 4228, 14251, 25872, 31680, 1220,

+ 17771, 26507, 12129, 32240, 19963, 24804, 15487, 21594, 5553, 23591,

+ 14791, 23692, 5440, 19529, 30509, 27705, 15072, 22714, 26672, 11123,

+ 18089, 22585, 863, 1565, 17984, 28140, 15132, 20900, 29622, 31920,

+ 29600, 31466, 31661, 25774, 6719, 20611, 28349, 16175, 16877, 15652,

+ 25110, 3249, 26882, 1624, 870, 2361, 19514, 25461, 9213, 6892,

+ 27392, 207, 32559, 3801, 8428, 17195, 16377, 6170, 30858, 24439,

+ 2536, 17691, 7005, 6840, 2359, 24377, 803, 17987, 20023, 26767,

+ 20571, 19504, 30708, 11276, 27141, 24588, 29206, 5065, 19113, 10190,

+ 18949, 14746, 7834, 28940, 24401, 26084, 6012, 18031, 29520, 28846,

+ 6404, 31077, 23561, 14586, 8959, 29717, 24144, 9813, 7318, 26520,

+ 29491, 26797, 25808, 10854, 31893, 27235, 19544, 23310, 11545, 10401,

+ 23681, 6955, 10050, 26094, 3975, 30355, 6104, 27391, 24088, 19153,

+ 20365, 18896, 17938, 17110, 8160, 22260, 11919, 15083, 32578, 19754,

+ 19743, 8426, 14455, 20272, 28756, 9390, 10560, 15324, 21380, 19656,

+ 21559, 2152, 24522, 17267, 18938, 5390, 32334, 28619, 11659, 12244,

+ 24518, 12089, 22519, 14762, 23869, 17202, 24374, 8626, 22035, 18209,

+ 1107, 10975, 12102, 17057, 19661, 12225, 22511, 11248, 19260, 22687,

+ 30480, 28320, 23351, 30663, 9868, 19088, 21622, 34, 24439, 7963,

+ 31028, 18955, 31632, 30351, 9175, 6753, 28684, 26081, 30675, 8155,

+ 9622, 5279, 6604, 23196, 4499, 293, 13051, 8712, 29866, 21780,

+ 17362, 15573, 25220, 24064, 2531, 16229, 30416, 32361, 31998, 9299,

+ 23435, 10989, 10137, 21324, 1150, 18363, 24181, 2592, 17416, 31307,

+ 7039, 23576, 7453, 17229, 32757, 15243, 30351, 29919, 16841, 16812,

+ 5004, 22786, 2122, 10406, 30057, 7247, 31745, 11243, 2717, 20710,

+ 3545, 17096, 20241, 7592, 14724, 26942, 16791, 28070, 18201, 27405,

+ 21175, 13272, 20482, 25873, 12466, 5907, 2837, 28881, 5313, 6709,

+ 9217, 11862, 30110, 5283, 8684, 8249, 17221, 3829, 8538, 3584,

+ 4092, 22511, 25937, 24747, 19089, 26035, 955, 11657, 28131, 22326,

+ 12555, 25424, 18851, 10737, 28451, 19821, 18524, 30681, 9077, 24985,

+ 22193, 20880, 22633, 2989, 20455, 2269, 11775, 27575, 5027, 32602,

+ 15798, 14925, 10484, 19820, 30124, 18209, 4755, 21880, 12038, 17878,

+ 14442, 5972, 914, 23826, 2644, 22524, 9899, 11221, 16420, 29063,

+ 17758, 14601, 23272, 24409, 12747, 346, 19311, 23193, 24013, 5959,

+ 25096, 6886, 26845, 2425, 27533, 3909, 17715, 852, 8096, 9054,

+ 14383, 23501, 17461, 25833, 14840, 1659, 10833, 7523, 30819, 6896,

+ 26640, 13317, 278, 26185, 29677, 27638, 22253, 15108, 1342, 21184,

+ 30364, 29458, 24062, 29441, 3734, 22573, 25039, 8035, 28206, 26220,

+ 7743, 27085, 28668, 7445, 10315, 6875, 25475, 20914, 29474, 15756,

+ 14864, 14695, 1067, 4923, 31461, 7298, 10312, 977, 17047, 26708,

+ 3677, 24120, 20917, 4928, 27404, 32019, 28330, 1809, 2499, 9132,

+ 7909, 1424, 28409, 10029, 31543, 15191, 28596, 14356, 9084, 29920,

+ 25167, 24545, 5501, 10721, 19578, 1809, 27413, 21212, 12930, 5968,

+ 17299, 15601, 27603, 3563, 23648, 20472, 8379, 4740, 7394, 31436,

+ 21872, 26121, 6559, 14825, 9813, 15847, 21158, 27706, 6521, 24442,

+ 12587, 27180, 10592, 4040, 2161, 4871, 27911, 11120, 7661, 17534,

+ 290, 31453, 31912, 28805, 5800, 5823, 6117, 17762, 19089, 28860,

+ 260, 7175, 10975, 21602, 13478, 8351, 3291, 29793, 17170, 26983,

+ 6305, 22519, 22487, 28607, 11742, 15531, 25779, 8065, 1497, 16446,

+ 29620, 28817, 14000, 26335, 25757, 16053, 31716, 20894, 6539, 21415,

+ 26648, 14627, 22232, 22377, 25622, 160, 23104, 6873, 7955, 29956,

+};

diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/Support.c b/UefiCpuPkg/Library/MtrrLib/UnitTest/Support.c
index a7eed45940..4fc222bdee 100644
--- a/UefiCpuPkg/Library/MtrrLib/UnitTest/Support.c
+++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/Support.c
@@ -20,6 +20,70 @@ MSR_IA32_MTRRCAP_REGISTER mMtrrCapMsr;
CPUID_VERSION_INFO_EDX mCpuidVersionInfoEdx;

CPUID_VIR_PHY_ADDRESS_SIZE_EAX mCpuidVirPhyAddressSizeEax;



+BOOLEAN mRandomInput;

+UINTN mNumberIndex = 0;

+extern UINTN mNumbers[];

+extern UINTN mNumberCount;

+

+/**

+ Return a random number between 0 and RAND_MAX.

+

+ If mRandomInput is TRUE, the routine directly calls rand().

+ Otherwise, the routine returns the pre-generated numbers.

+

+ @return a number between 0 and RAND_MAX.

+**/

+UINTN

+Rand (

+ VOID

+ )

+{

+ if (mRandomInput) {

+ return rand ();

+ } else {

+ DEBUG ((DEBUG_INFO, "random: %d\n", mNumberIndex));

+ return mNumbers[mNumberIndex++ % (mNumberCount - 1)];

+ }

+}

+

+CHAR8 mContentTemplate[] = {

+ "/** @file\n"

+ " Pre-generated random number used by MtrrLib test.\n"

+ "\n"

+ " Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\n"

+ " SPDX-License-Identifier: BSD-2-Clause-Patent\n"

+ "**/\n"

+ "UINTN mNumberCount = %d;\n"

+ "UINTN mNumbers[] = {"

+};

+

+/**

+ Generate Count random numbers in FilePath.

+

+ @param FilePath The file path to put the generated random numbers.

+ @param Count Count of random numbers.

+**/

+VOID

+GenerateRandomNumbers (

+ CHAR8 *FilePath,

+ UINTN Count

+ )

+{

+ FILE *File;

+ UINTN Index;

+

+ File = fopen (FilePath, "w");

+ fprintf (File, mContentTemplate, Count);

+ for (Index = 0; Index < Count; Index++) {

+ if (Index % 10 == 0) {

+ fprintf (File, "\n ");

+ }

+ fprintf (File, " %d,", rand ());

+ }

+ fprintf (File, "\n};\n");

+ fclose (File);

+}

+

/**

Retrieves CPUID information.



@@ -328,7 +392,7 @@ Random32 (
UINT32 Limit

)

{

- return (UINT32) (((double) rand () / RAND_MAX) * (Limit - Start)) + Start;

+ return (UINT32) (((double) Rand () / RAND_MAX) * (Limit - Start)) + Start;

}



/**

@@ -344,7 +408,7 @@ Random64 (
UINT64 Limit

)

{

- return (UINT64) (((double) rand () / RAND_MAX) * (Limit - Start)) + Start;

+ return (UINT64) (((double) Rand () / RAND_MAX) * (Limit - Start)) + Start;

}



/**

--
2.27.0.windows.1


Re: [PATCH EDK2 v2 1/1] SecurityPkg/DxeImageVerificationLib:Enhanced verification of Offset

Laszlo Ersek
 

On 08/13/20 13:55, Wenyi Xie wrote:
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2215

There is an integer overflow vulnerability in DxeImageVerificationHandler
function when parsing the PE files attribute certificate table. In cases
where WinCertificate->dwLength is sufficiently large, it's possible to
overflow Offset back to 0 causing an endless loop.

Check offset inbetween VirtualAddress and VirtualAddress + Size.
Using SafeintLib to do offset addition with result check.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Wenyi Xie <xiewenyi2@huawei.com>
---
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf | 1 +
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.h | 1 +
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c | 111 +++++++++++---------
3 files changed, 63 insertions(+), 50 deletions(-)

diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
index 1e1a639857e0..a7ac4830b3d4 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
@@ -53,6 +53,7 @@ [LibraryClasses]
SecurityManagementLib
PeCoffLib
TpmMeasurementLib
+ SafeIntLib

[Protocols]
gEfiFirmwareVolume2ProtocolGuid ## SOMETIMES_CONSUMES
diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.h b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.h
index 17955ff9774c..060273917d5d 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.h
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.h
@@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/DevicePathLib.h>
#include <Library/SecurityManagementLib.h>
#include <Library/PeCoffLib.h>
+#include <Library/SafeIntLib.h>
#include <Protocol/FirmwareVolume2.h>
#include <Protocol/DevicePath.h>
#include <Protocol/BlockIo.h>
diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
index 36b87e16d53d..dbc03e28c05b 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
@@ -1658,6 +1658,10 @@ DxeImageVerificationHandler (
EFI_STATUS HashStatus;
EFI_STATUS DbStatus;
BOOLEAN IsFound;
+ UINT32 AlignedLength;
+ UINT32 Result;
+ EFI_STATUS AddStatus;
+ BOOLEAN IsAuthDataAssigned;

SignatureList = NULL;
SignatureListSize = 0;
@@ -1667,6 +1671,7 @@ DxeImageVerificationHandler (
Action = EFI_IMAGE_EXECUTION_AUTH_UNTESTED;
IsVerified = FALSE;
IsFound = FALSE;
+ Result = 0;

//
// Check the image type and get policy setting.
@@ -1850,9 +1855,10 @@ DxeImageVerificationHandler (
// The first certificate starts at offset (SecDataDir->VirtualAddress) from the start of the file.
//
for (OffSet = SecDataDir->VirtualAddress;
- OffSet < (SecDataDir->VirtualAddress + SecDataDir->Size);
- OffSet += (WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength))) {
+ (OffSet >= SecDataDir->VirtualAddress) && (OffSet < (SecDataDir->VirtualAddress + SecDataDir->Size));) {
+ IsAuthDataAssigned = FALSE;
WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
+ AlignedLength = WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength);
I disagree with this patch.

The primary reason for my disagreement is that the bug report
<https://bugzilla.tianocore.org/show_bug.cgi?id=2215#c0> is inexact, and
so this patch tries to fix the wrong thing.

With edk2 master at commit 65904cdbb33c, it is *not* possible to
overflow the OffSet variable to zero with "WinCertificate->dwLength"
*purely*, and cause an endless loop. Note that we have (at commit
65904cdbb33c):

for (OffSet = SecDataDir->VirtualAddress;
OffSet < (SecDataDir->VirtualAddress + SecDataDir->Size);
OffSet += (WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength))) {
WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
if ((SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) <= sizeof (WIN_CERTIFICATE) ||
(SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) < WinCertificate->dwLength) {
break;
}

The last sub-condition checks whether the Security Data Directory has
enough room left for "WinCertificate->dwLength". If not, then we break
out of the loop.

If we *do* have enough room, that is:

(SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) >= WinCertificate->dwLength

then we have (by adding OffSet to both sides):

SecDataDir->VirtualAddress + SecDataDir->Size >= OffSet + WinCertificate->dwLength

The left hand side is a known-good UINT32, and so incrementing OffSet (a
UINT32) *solely* by "WinCertificate->dwLength" (also a UINT32) does not
cause an overflow.

Instead, the problem is with the alignment. The "if" statement checks
whether we have enough room for "dwLength", but then "OffSet" is
advanced by "dwLength" *aligned up* to the next multiple of 8. And that
may indeed cause various overflows.

Now, the main problem with the present patch is that it does not fix one
of those overflows. Namely, consider that "dwLength" is very close to
MAX_UINT32 (or even think it's exactly MAX_UINT32). Then aligning it up
to the next multiple of 8 will yield 0. In other words, "AlignedLength"
will be zero.

And when that happens, there's going to be an infinite loop just the
same: "OffSet" will not be zero, but it will be *stuck*. The
SafeUint32Add() call at the bottom will succeed, but it will not change
the value of "OffSet".

More at the bottom.


if ((SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) <= sizeof (WIN_CERTIFICATE) ||
(SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) < WinCertificate->dwLength) {
break;
@@ -1872,6 +1878,8 @@ DxeImageVerificationHandler (
}
AuthData = PkcsCertData->CertData;
AuthDataSize = PkcsCertData->Hdr.dwLength - sizeof(PkcsCertData->Hdr);
+ IsAuthDataAssigned = TRUE;
+ HashStatus = HashPeImageByType (AuthData, AuthDataSize);
} else if (WinCertificate->wCertificateType == WIN_CERT_TYPE_EFI_GUID) {
//
// The certificate is formatted as WIN_CERTIFICATE_UEFI_GUID which is described in UEFI Spec.
@@ -1880,72 +1888,75 @@ DxeImageVerificationHandler (
if (WinCertUefiGuid->Hdr.dwLength <= OFFSET_OF(WIN_CERTIFICATE_UEFI_GUID, CertData)) {
break;
}
- if (!CompareGuid (&WinCertUefiGuid->CertType, &gEfiCertPkcs7Guid)) {
- continue;
+ if (CompareGuid (&WinCertUefiGuid->CertType, &gEfiCertPkcs7Guid)) {
+ AuthData = WinCertUefiGuid->CertData;
+ AuthDataSize = WinCertUefiGuid->Hdr.dwLength - OFFSET_OF(WIN_CERTIFICATE_UEFI_GUID, CertData);
+ IsAuthDataAssigned = TRUE;
+ HashStatus = HashPeImageByType (AuthData, AuthDataSize);
}
- AuthData = WinCertUefiGuid->CertData;
- AuthDataSize = WinCertUefiGuid->Hdr.dwLength - OFFSET_OF(WIN_CERTIFICATE_UEFI_GUID, CertData);
} else {
if (WinCertificate->dwLength < sizeof (WIN_CERTIFICATE)) {
break;
}
- continue;
}

- HashStatus = HashPeImageByType (AuthData, AuthDataSize);
- if (EFI_ERROR (HashStatus)) {
- continue;
- }
-
- //
- // Check the digital signature against the revoked certificate in forbidden database (dbx).
- //
- if (IsForbiddenByDbx (AuthData, AuthDataSize)) {
- Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED;
- IsVerified = FALSE;
- break;
- }
-
- //
- // Check the digital signature against the valid certificate in allowed database (db).
- //
- if (!IsVerified) {
- if (IsAllowedByDb (AuthData, AuthDataSize)) {
- IsVerified = TRUE;
+ if (IsAuthDataAssigned && !EFI_ERROR (HashStatus)) {
+ //
+ // Check the digital signature against the revoked certificate in forbidden database (dbx).
+ //
+ if (IsForbiddenByDbx (AuthData, AuthDataSize)) {
+ Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED;
+ IsVerified = FALSE;
+ break;
}
- }

- //
- // Check the image's hash value.
- //
- DbStatus = IsSignatureFoundInDatabase (
- EFI_IMAGE_SECURITY_DATABASE1,
- mImageDigest,
- &mCertType,
- mImageDigestSize,
- &IsFound
- );
- if (EFI_ERROR (DbStatus) || IsFound) {
- Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND;
- DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but %s hash of image is found in DBX.\n", mHashTypeStr));
- IsVerified = FALSE;
- break;
- }
+ //
+ // Check the digital signature against the valid certificate in allowed database (db).
+ //
+ if (!IsVerified) {
+ if (IsAllowedByDb (AuthData, AuthDataSize)) {
+ IsVerified = TRUE;
+ }
+ }

- if (!IsVerified) {
+ //
+ // Check the image's hash value.
+ //
DbStatus = IsSignatureFoundInDatabase (
- EFI_IMAGE_SECURITY_DATABASE,
+ EFI_IMAGE_SECURITY_DATABASE1,
mImageDigest,
&mCertType,
mImageDigestSize,
&IsFound
);
- if (!EFI_ERROR (DbStatus) && IsFound) {
- IsVerified = TRUE;
- } else {
- DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but signature is not allowed by DB and %s hash of image is not found in DB/DBX.\n", mHashTypeStr));
+ if (EFI_ERROR (DbStatus) || IsFound) {
+ Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND;
+ DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but %s hash of image is found in DBX.\n", mHashTypeStr));
+ IsVerified = FALSE;
+ break;
}
+
+ if (!IsVerified) {
+ DbStatus = IsSignatureFoundInDatabase (
+ EFI_IMAGE_SECURITY_DATABASE,
+ mImageDigest,
+ &mCertType,
+ mImageDigestSize,
+ &IsFound
+ );
+ if (!EFI_ERROR (DbStatus) && IsFound) {
+ IsVerified = TRUE;
+ } else {
+ DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but signature is not allowed by DB and %s hash of image is not found in DB/DBX.\n", mHashTypeStr));
+ }
+ }
+ }
+
+ AddStatus = SafeUint32Add (OffSet, AlignedLength, &Result);
+ if (EFI_ERROR (AddStatus)) {
+ break;
}
+ OffSet = Result;
}

if (OffSet != (SecDataDir->VirtualAddress + SecDataDir->Size)) {
There are other (smaller) reasons why I dislike this patch:

- The "IsAuthDataAssigned" variable is superfluous; we could use the
existent "AuthData" variable (with a NULL-check and a NULL-assignment)
similarly.

- The patch complicates / reorganizes the control flow needlessly. This
complication originates from placing the checked "OffSet" increment at
the bottom of the loop, which then requires the removal of all the
"continue" statements. But we don't need to check-and-increment at the
bottom. We can keep the increment inside the "for" statement, only
extend the *existent* room check (which I've quoted) to take the
alignment into account as well. If there is enough room for the
alignment in the security data directory, then that guarantees there
won't be a UINT32 overflow either.

All in all, I'm proposing the following three patches instead. The first
two patches are preparation, the last patch is the fix.

Patch#1:

From 11af0a104d34d39bf1b1aab256428ae4edbddd77 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 13 Aug 2020 19:11:39 +0200
Subject: [PATCH 1/3] SecurityPkg/DxeImageVerificationLib: extract
SecDataDirEnd, SecDataDirLeft

The following two quantities:

SecDataDir->VirtualAddress + SecDataDir->Size
SecDataDir->VirtualAddress + SecDataDir->Size - OffSet

are used multiple times in DxeImageVerificationHandler(). Introduce helper
variables for them: "SecDataDirEnd" and "SecDataDirLeft", respectively.
This saves us multiple calculations and significantly simplifies the code.

Note that all three summands above have type UINT32, therefore the new
variables are also of type UINT32.

This patch does not change behavior.

(Note that the code already handles the case when the

SecDataDir->VirtualAddress + SecDataDir->Size

UINT32 addition overflows -- namely, in that case, the certificate loop is
never entered, and the corruption check right after the loop fires.)

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
index 36b87e16d53d..8761980c88aa 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
@@ -1652,6 +1652,8 @@ DxeImageVerificationHandler (
UINT8 *AuthData;
UINTN AuthDataSize;
EFI_IMAGE_DATA_DIRECTORY *SecDataDir;
+ UINT32 SecDataDirEnd;
+ UINT32 SecDataDirLeft;
UINT32 OffSet;
CHAR16 *NameStr;
RETURN_STATUS PeCoffStatus;
@@ -1849,12 +1851,14 @@ DxeImageVerificationHandler (
// "Attribute Certificate Table".
// The first certificate starts at offset (SecDataDir->VirtualAddress) from the start of the file.
//
+ SecDataDirEnd = SecDataDir->VirtualAddress + SecDataDir->Size;
for (OffSet = SecDataDir->VirtualAddress;
- OffSet < (SecDataDir->VirtualAddress + SecDataDir->Size);
+ OffSet < SecDataDirEnd;
OffSet += (WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength))) {
WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
- if ((SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) <= sizeof (WIN_CERTIFICATE) ||
- (SecDataDir->VirtualAddress + SecDataDir->Size - OffSet) < WinCertificate->dwLength) {
+ SecDataDirLeft = SecDataDirEnd - OffSet;
+ if (SecDataDirLeft <= sizeof (WIN_CERTIFICATE) ||
+ SecDataDirLeft < WinCertificate->dwLength) {
break;
}

@@ -1948,7 +1952,7 @@ DxeImageVerificationHandler (
}
}

- if (OffSet != (SecDataDir->VirtualAddress + SecDataDir->Size)) {
+ if (OffSet != SecDataDirEnd) {
//
// The Size in Certificate Table or the attribute certificate table is corrupted.
//
--
2.19.1.3.g30247aa5d201
Patch#2:

From 72012c065a53582f7df695e7b9730c45f49226c6 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 13 Aug 2020 19:19:06 +0200
Subject: [PATCH 2/3] SecurityPkg/DxeImageVerificationLib: assign
WinCertificate after size check

Currently the (SecDataDirLeft <= sizeof (WIN_CERTIFICATE)) check only
guards the de-referencing of the "WinCertificate" pointer. It does not
guard the calculation of hte pointer itself:

WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);

This is wrong; if we don't know for sure that we have enough room for a
WIN_CERTIFICATE, then even creating such a pointer, not just
de-referencing it, may invoke undefined behavior.

Move the pointer calculation after the size check.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
index 8761980c88aa..461ed7cfb5ac 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
@@ -1855,10 +1855,12 @@ DxeImageVerificationHandler (
for (OffSet = SecDataDir->VirtualAddress;
OffSet < SecDataDirEnd;
OffSet += (WinCertificate->dwLength + ALIGN_SIZE (WinCertificate->dwLength))) {
- WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
SecDataDirLeft = SecDataDirEnd - OffSet;
- if (SecDataDirLeft <= sizeof (WIN_CERTIFICATE) ||
- SecDataDirLeft < WinCertificate->dwLength) {
+ if (SecDataDirLeft <= sizeof (WIN_CERTIFICATE)) {
+ break;
+ }
+ WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
+ if (SecDataDirLeft < WinCertificate->dwLength) {
break;
}

--
2.19.1.3.g30247aa5d201
Patch#3:

From 0bbba15b84f8f9f2cdc770a89f418aaec6cfb31e Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Thu, 13 Aug 2020 19:34:33 +0200
Subject: [PATCH 3/3] SecurityPkg/DxeImageVerificationLib: catch alignment
overflow (CVE-2019-14562)

The DxeImageVerificationHandler() function currently checks whether
"SecDataDir" has enough room for "WinCertificate->dwLength". However, for
advancing "OffSet", "WinCertificate->dwLength" is aligned to the next
multiple of 8. If "WinCertificate->dwLength" is large enough, the
alignment will return 0, and "OffSet" will be stuck at the same value.

Check whether "SecDataDir" has room left for both
"WinCertificate->dwLength" and the alignment.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
index 461ed7cfb5ac..e38eb981b7a0 100644
--- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
+++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c
@@ -1860,7 +1860,9 @@ DxeImageVerificationHandler (
break;
}
WinCertificate = (WIN_CERTIFICATE *) (mImageBase + OffSet);
- if (SecDataDirLeft < WinCertificate->dwLength) {
+ if (SecDataDirLeft < WinCertificate->dwLength ||
+ (SecDataDirLeft - WinCertificate->dwLength <
+ ALIGN_SIZE (WinCertificate->dwLength))) {
break;
}

--
2.19.1.3.g30247aa5d201
If Wenyi and the reviewers are OK with these patches, I can submit them
as a standalone patch series.

Note that I do not have any reproducer for the issue; the best testing
that I could offer would be some light-weight Secure Boot regression
tests.

Thanks
Laszlo


Re: [edk2-platform][PATCH v1 1/1] Platforms/RaspberryPi: Fix DBG2 UART namespace reference

Ard Biesheuvel
 

On 8/13/20 5:13 PM, Pete Batard wrote:
On 2020.08.13 15:27, Samer El-Haj-Mahmoud wrote:
The UART namespace reference in DBG2 is incorrect. Fix to point to the
correct name.

This fixes the certification failure reported by FWTS tests at:
https://github.com/pftf/RPi4/issues/69

Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Pete Batard <pete@akeo.ie>
Cc: Andrei Warkentin <awarkentin@vmware.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Signed-off-by: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@arm.com>
---
  Platform/RaspberryPi/AcpiTables/Dbg2.aslc | 8 ++++----
  1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc b/Platform/RaspberryPi/AcpiTables/Dbg2.aslc
index c35b15693f5a..e3f2adae7e21 100644
--- a/Platform/RaspberryPi/AcpiTables/Dbg2.aslc
+++ b/Platform/RaspberryPi/AcpiTables/Dbg2.aslc
@@ -3,7 +3,7 @@
   *  Debug Port Table (DBG2)
   *
   *  Copyright (c) 2019, Pete Batard <pete@akeo.ie>
- *  Copyright (c) 2012-2016, ARM Limited. All rights reserved.
+ *  Copyright (c) 2012-2020, ARM Limited. All rights reserved.
   *
   *  SPDX-License-Identifier: BSD-2-Clause-Patent
   *
@@ -21,13 +21,13 @@
  #define RPI_DBG2_NUM_DEBUG_PORTS                        1
  #define RPI_DBG2_NUMBER_OF_GENERIC_ADDRESS_REGISTERS    1
-#define RPI_DBG2_NAMESPACESTRING_FIELD_SIZE             10
+#define RPI_DBG2_NAMESPACESTRING_FIELD_SIZE             15
  #if (RPI_MODEL == 4)
  #define RPI_UART_INTERFACE_TYPE EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART
  #define RPI_UART_BASE_ADDRESS BCM2836_PL011_UART_BASE_ADDRESS
  #define RPI_UART_LENGTH BCM2836_PL011_UART_LENGTH
-#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'U', 'R', 'T', '0', 0x00 }
+#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', '0', 0x00 }
  #else
  #define RPI_UART_INTERFACE_TYPE EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_BCM2835_UART
  #define RPI_UART_BASE_ADDRESS BCM2836_MINI_UART_BASE_ADDRESS
@@ -35,7 +35,7 @@
  //
  // RPI_UART_STR should match the value used Uart.asl
  //
-#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'U', 'R', 'T', 'M', 0x00 }
+#define RPI_UART_STR                                    { '\\', '_', 'S', 'B', '.', 'G', 'D', 'V', '0', '.', 'U', 'R', 'T', 'M', 0x00 }
  #endif
  typedef struct {
Reviewed-by: Pete Batard <pete@akeo.ie>
Thanks

Pushed as cec6bb18ae97..fe34d84a73cf


Re: [edk2-test] [PATCH 1/1] uefi-sct/SctPkg: fix variable services conformance test

G Edhaya Chandran
 

Hello Heinrich,

The patches are under review.
Will complete the review and merge by end of this week.

With Warm Regards,
Edhay

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Heinrich
Schuchardt via groups.io
Sent: 12 August 2020 19:25
To: devel@edk2.groups.io; G Edhaya Chandran <Edhaya.Chandran@arm.com>
Cc: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>; Eric Jin
<eric.jin@intel.com>
Subject: Re: [edk2-devel] [edk2-test] [PATCH 1/1] uefi-sct/SctPkg: fix variable
services conformance test

On 8/4/20 1:13 PM, Samer El-Haj-Mahmoud wrote:
Reviewed-by: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
Dear Edhaya,

could you, please, consider these patches

https://edk2.groups.io/g/devel/message/63354
https://edk2.groups.io/g/devel/message/52599

for review and merging.

Best regards

Heinrich

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


[PATCH v15 46/46] Maintainers.txt: Add reviewers for the OvmfPkg SEV-related files

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

Register reviewers for the SEV-related files in OvmfPkg.

Cc: Andrew Fish <afish@apple.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Acked-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
Maintainers.txt | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/Maintainers.txt b/Maintainers.txt
index 4c163496b1b0..f673ddd2b38c 100644
--- a/Maintainers.txt
+++ b/Maintainers.txt
@@ -441,6 +441,16 @@ F: OvmfPkg/PvScsiDxe/
R: Liran Alon <liran.alon@oracle.com>
R: Nikita Leshenko <nikita.leshchenko@oracle.com>

+OvmfPkg: SEV-related modules
+F: OvmfPkg/AmdSevDxe/
+F: OvmfPkg/Include/Library/MemEncryptSevLib.h
+F: OvmfPkg/IoMmuDxe/AmdSevIoMmu.*
+F: OvmfPkg/Library/BaseMemEncryptSevLib/
+F: OvmfPkg/Library/VmgExitLib/
+F: OvmfPkg/PlatformPei/AmdSev.c
+R: Tom Lendacky <thomas.lendacky@amd.com>
+R: Brijesh Singh <brijesh.singh@amd.com>
+
OvmfPkg: TCG- and TPM2-related modules
F: OvmfPkg/Include/IndustryStandard/QemuTpm.h
F: OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
--
2.28.0


[PATCH v15 45/46] UefiCpuPkg/MpInitLib: Prepare SEV-ES guest APs for OS use

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

Before UEFI transfers control to the OS, it must park the AP. This is
done using the AsmRelocateApLoop function to transition into 32-bit
non-paging mode. For an SEV-ES guest, a few additional things must be
done:
- AsmRelocateApLoop must be updated to support SEV-ES. This means
performing a VMGEXIT AP Reset Hold instead of an MWAIT or HLT loop.
- Since the AP must transition to real mode, a small routine is copied
to the WakeupBuffer area. Since the WakeupBuffer will be used by
the AP during OS booting, it must be placed in reserved memory.
Additionally, the AP stack must be located where it can be accessed
in real mode.
- Once the AP is in real mode it will transfer control to the
destination specified by the OS in the SEV-ES AP Jump Table. The
SEV-ES AP Jump Table address is saved by the hypervisor for the OS
using the GHCB VMGEXIT AP Jump Table exit code.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
UefiCpuPkg/Library/MpInitLib/MpLib.h | 8 +-
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 54 +++++++-
UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 5 +-
UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 130 ++++++++++++++++++--
4 files changed, 179 insertions(+), 18 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index b1a9d99cb3eb..02652eaae126 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -293,7 +293,8 @@ struct _CPU_MP_DATA {
UINT64 GhcbBase;
};

-#define AP_RESET_STACK_SIZE 64
+#define AP_SAFE_STACK_SIZE 128
+#define AP_RESET_STACK_SIZE AP_SAFE_STACK_SIZE

#pragma pack(1)

@@ -350,7 +351,10 @@ VOID
IN UINTN ApTargetCState,
IN UINTN PmCodeSegment,
IN UINTN TopOfApStack,
- IN UINTN NumberToFinish
+ IN UINTN NumberToFinish,
+ IN UINTN Pm16CodeSegment,
+ IN UINTN SevEsAPJumpTable,
+ IN UINTN WakeupBuffer
);

/**
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 9115ff9e3e30..2c00d72ddefe 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -12,6 +12,7 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugAgentLib.h>
#include <Library/DxeServicesTableLib.h>
+#include <Library/VmgExitLib.h>
#include <Register/Amd/Fam17Msr.h>
#include <Register/Amd/Ghcb.h>

@@ -85,6 +86,13 @@ GetWakeupBuffer (
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS StartAddress;
+ EFI_MEMORY_TYPE MemoryType;
+
+ if (PcdGetBool (PcdSevEsIsEnabled)) {
+ MemoryType = EfiReservedMemoryType;
+ } else {
+ MemoryType = EfiBootServicesData;
+ }

//
// Try to allocate buffer below 1M for waking vector.
@@ -97,7 +105,7 @@ GetWakeupBuffer (
StartAddress = 0x88000;
Status = gBS->AllocatePages (
AllocateMaxAddress,
- EfiBootServicesData,
+ MemoryType,
EFI_SIZE_TO_PAGES (WakeupBufferSize),
&StartAddress
);
@@ -159,8 +167,10 @@ GetSevEsAPMemory (
VOID
)
{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS StartAddress;
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS StartAddress;
+ MSR_SEV_ES_GHCB_REGISTER Msr;
+ GHCB *Ghcb;

//
// Allocate 1 page for AP jump table page
@@ -176,6 +186,16 @@ GetSevEsAPMemory (

DEBUG ((DEBUG_INFO, "Dxe: SevEsAPMemory = %lx\n", (UINTN) StartAddress));

+ //
+ // Save the SevEsAPMemory as the AP jump table.
+ //
+ Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);
+ Ghcb = Msr.Ghcb;
+
+ VmgInit (Ghcb);
+ VmgExit (Ghcb, SVM_EXIT_AP_JUMP_TABLE, 0, (UINT64) (UINTN) StartAddress);
+ VmgDone (Ghcb);
+
return (UINTN) StartAddress;
}

@@ -330,17 +350,26 @@ RelocateApLoop (
BOOLEAN MwaitSupport;
ASM_RELOCATE_AP_LOOP AsmRelocateApLoopFunc;
UINTN ProcessorNumber;
+ UINTN StackStart;

MpInitLibWhoAmI (&ProcessorNumber);
CpuMpData = GetCpuMpData ();
MwaitSupport = IsMwaitSupport ();
+ if (CpuMpData->SevEsIsEnabled) {
+ StackStart = CpuMpData->SevEsAPResetStackStart;
+ } else {
+ StackStart = mReservedTopOfApStack;
+ }
AsmRelocateApLoopFunc = (ASM_RELOCATE_AP_LOOP) (UINTN) mReservedApLoopFunc;
AsmRelocateApLoopFunc (
MwaitSupport,
CpuMpData->ApTargetCState,
CpuMpData->PmCodeSegment,
- mReservedTopOfApStack - ProcessorNumber * AP_SAFE_STACK_SIZE,
- (UINTN) &mNumberToFinish
+ StackStart - ProcessorNumber * AP_SAFE_STACK_SIZE,
+ (UINTN) &mNumberToFinish,
+ CpuMpData->Pm16CodeSegment,
+ CpuMpData->SevEsAPBuffer,
+ CpuMpData->WakeupBuffer
);
//
// It should never reach here
@@ -374,6 +403,21 @@ MpInitChangeApLoopCallback (
while (mNumberToFinish > 0) {
CpuPause ();
}
+
+ if (CpuMpData->SevEsIsEnabled && (CpuMpData->WakeupBuffer != (UINTN) -1)) {
+ //
+ // There are APs present. Re-use reserved memory area below 1MB from
+ // WakeupBuffer as the area to be used for transitioning to 16-bit mode
+ // in support of booting of the AP by an OS.
+ //
+ CopyMem (
+ (VOID *) CpuMpData->WakeupBuffer,
+ (VOID *) (CpuMpData->AddressMap.RendezvousFunnelAddress +
+ CpuMpData->AddressMap.SwitchToRealPM16ModeOffset),
+ CpuMpData->AddressMap.SwitchToRealPM16ModeSize
+ );
+ }
+
DEBUG ((DEBUG_INFO, "%a() done!\n", __FUNCTION__));
}

diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
index 309d53bf3b37..7e81d24aa60f 100644
--- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
@@ -226,7 +226,10 @@ SwitchToRealProcStart:
SwitchToRealProcEnd:

;-------------------------------------------------------------------------------------
-; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish);
+; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish, Pm16CodeSegment, SevEsAPJumpTable, WakeupBuffer);
+;
+; The last three parameters (Pm16CodeSegment, SevEsAPJumpTable and WakeupBuffer) are
+; specific to SEV-ES support and are not applicable on IA32.
;-------------------------------------------------------------------------------------
global ASM_PFX(AsmRelocateApLoop)
ASM_PFX(AsmRelocateApLoop):
diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
index 6956b408d004..5d30f35b201c 100644
--- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
@@ -465,6 +465,10 @@ BITS 16
; - IP for Real Mode (two bytes)
; - CS for Real Mode (two bytes)
;
+ ; This label is also used with AsmRelocateApLoop. During MP finalization,
+ ; the code from PM16Mode to SwitchToRealProcEnd is copied to the start of
+ ; the WakeupBuffer, allowing a parked AP to be booted by an OS.
+ ;
PM16Mode:
mov eax, cr0 ; Read CR0
btr eax, 0 ; Set PE=0
@@ -487,32 +491,96 @@ PM16Mode:
SwitchToRealProcEnd:

;-------------------------------------------------------------------------------------
-; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish);
+; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish, Pm16CodeSegment, SevEsAPJumpTable, WakeupBuffer);
;-------------------------------------------------------------------------------------
global ASM_PFX(AsmRelocateApLoop)
ASM_PFX(AsmRelocateApLoop):
AsmRelocateApLoopStart:
BITS 64
+ cmp qword [rsp + 56], 0 ; SevEsAPJumpTable
+ je NoSevEs
+
+ ;
+ ; Perform some SEV-ES related setup before leaving 64-bit mode
+ ;
+ push rcx
+ push rdx
+
+ ;
+ ; Get the RDX reset value using CPUID
+ ;
+ mov rax, 1
+ cpuid
+ mov rsi, rax ; Save off the reset value for RDX
+
+ ;
+ ; Prepare the GHCB for the AP_HLT_LOOP VMGEXIT call
+ ; - Must be done while in 64-bit long mode so that writes to
+ ; the GHCB memory will be unencrypted.
+ ; - No NAE events can be generated once this is set otherwise
+ ; the AP_RESET_HOLD SW_EXITCODE will be overwritten.
+ ;
+ mov rcx, 0xc0010130
+ rdmsr ; Retrieve current GHCB address
+ shl rdx, 32
+ or rdx, rax
+
+ mov rdi, rdx
+ xor rax, rax
+ mov rcx, 0x800
+ shr rcx, 3
+ rep stosq ; Clear the GHCB
+
+ mov rax, 0x80000004 ; VMGEXIT AP_RESET_HOLD
+ mov [rdx + 0x390], rax
+
+ pop rdx
+ pop rcx
+
+NoSevEs:
cli ; Disable interrupt before switching to 32-bit mode
mov rax, [rsp + 40] ; CountTofinish
lock dec dword [rax] ; (*CountTofinish)--
- mov rsp, r9
- push rcx
- push rdx

- lea rsi, [PmEntry] ; rsi <- The start address of transition code
+ mov r10, [rsp + 48] ; Pm16CodeSegment
+ mov rax, [rsp + 56] ; SevEsAPJumpTable
+ mov rbx, [rsp + 64] ; WakeupBuffer
+ mov rsp, r9 ; TopOfApStack
+
+ push rax ; Save SevEsAPJumpTable
+ push rbx ; Save WakeupBuffer
+ push r10 ; Save Pm16CodeSegment
+ push rcx ; Save MwaitSupport
+ push rdx ; Save ApTargetCState
+
+ lea rax, [PmEntry] ; rax <- The start address of transition code

push r8
- push rsi
- DB 0x48
- retf
+ push rax
+
+ ;
+ ; Clear R8 - R15, for reset, before going into 32-bit mode
+ ;
+ xor r8, r8
+ xor r9, r9
+ xor r10, r10
+ xor r11, r11
+ xor r12, r12
+ xor r13, r13
+ xor r14, r14
+ xor r15, r15
+
+ ;
+ ; Far return into 32-bit mode
+ ;
+o64 retf
+
BITS 32
PmEntry:
mov eax, cr0
btr eax, 31 ; Clear CR0.PG
mov cr0, eax ; Disable paging and caches

- mov ebx, edx ; Save EntryPoint to rbx, for rdmsr will overwrite rdx
mov ecx, 0xc0000080
rdmsr
and ah, ~ 1 ; Clear LME
@@ -525,6 +593,8 @@ PmEntry:
add esp, 4
pop ecx,
add esp, 4
+
+MwaitCheck:
cmp cl, 1 ; Check mwait-monitor support
jnz HltLoop
mov ebx, edx ; Save C-State to ebx
@@ -538,10 +608,50 @@ MwaitLoop:
shl eax, 4
mwait
jmp MwaitLoop
+
HltLoop:
+ pop edx ; PM16CodeSegment
+ add esp, 4
+ pop ebx ; WakeupBuffer
+ add esp, 4
+ pop eax ; SevEsAPJumpTable
+ add esp, 4
+ cmp eax, 0 ; Check for SEV-ES
+ je DoHlt
+
+ cli
+ ;
+ ; SEV-ES is enabled, use VMGEXIT (GHCB information already
+ ; set by caller)
+ ;
+BITS 64
+ rep vmmcall
+BITS 32
+
+ ;
+ ; Back from VMGEXIT AP_HLT_LOOP
+ ; Push the FLAGS/CS/IP values to use
+ ;
+ push word 0x0002 ; EFLAGS
+ xor ecx, ecx
+ mov cx, [eax + 2] ; CS
+ push cx
+ mov cx, [eax] ; IP
+ push cx
+ push word 0x0000 ; For alignment, will be discarded
+
+ push edx
+ push ebx
+
+ mov edx, esi ; Restore RDX reset value
+
+ retf
+
+DoHlt:
cli
hlt
- jmp HltLoop
+ jmp DoHlt
+
BITS 64
AsmRelocateApLoopEnd:

--
2.28.0


[PATCH v15 44/46] OvmfPkg: Move the GHCB allocations into reserved memory

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

After having transitioned from UEFI to the OS, the OS will need to boot
the APs. For an SEV-ES guest, the APs will have been parked by UEFI using
GHCB pages allocated by UEFI. The hypervisor will write to the GHCB
SW_EXITINFO2 field of the GHCB when the AP is booted. As a result, the
GHCB pages must be marked reserved so that the OS does not attempt to use
them and experience memory corruption because of the hypervisor write.

Change the GHCB allocation from the default boot services memory to
reserved memory.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
OvmfPkg/PlatformPei/AmdSev.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c
index a2b38c591236..4a515a484720 100644
--- a/OvmfPkg/PlatformPei/AmdSev.c
+++ b/OvmfPkg/PlatformPei/AmdSev.c
@@ -51,9 +51,11 @@ AmdSevEsInitialize (

//
// Allocate GHCB and per-CPU variable pages.
+ // Since the pages must survive across the UEFI to OS transition
+ // make them reserved.
//
GhcbPageCount = mMaxCpuCount * 2;
- GhcbBase = AllocatePages (GhcbPageCount);
+ GhcbBase = AllocateReservedPages (GhcbPageCount);
ASSERT (GhcbBase != NULL);

GhcbBasePa = (PHYSICAL_ADDRESS)(UINTN) GhcbBase;
--
2.28.0


[PATCH v15 43/46] OvmfPkg: Use the SEV-ES work area for the SEV-ES AP reset vector

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

A hypervisor is not allowed to update an SEV-ES guest's register state,
so when booting an SEV-ES guest AP, the hypervisor is not allowed to
set the RIP to the guest requested value. Instead an SEV-ES AP must be
re-directed from within the guest to the actual requested staring location
as specified in the INIT-SIPI-SIPI sequence.

Use the SEV-ES work area for the reset vector code that contains support
to jump to the desired RIP location after having been started. This is
required for only the very first AP reset.

This new OVMF source file, ResetVectorVtf0.asm, is used in place of the
original file through the use of the include path order set in
OvmfPkg/ResetVector/ResetVector.inf under "[BuildOptions]".

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm | 100 ++++++++++++++++++++
OvmfPkg/ResetVector/ResetVector.nasmb | 1 +
2 files changed, 101 insertions(+)

diff --git a/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm b/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm
new file mode 100644
index 000000000000..980e0138e7fe
--- /dev/null
+++ b/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm
@@ -0,0 +1,100 @@
+;------------------------------------------------------------------------------
+; @file
+; First code executed by processor after resetting.
+; Derived from UefiCpuPkg/ResetVector/Vtf0/Ia16/ResetVectorVtf0.asm
+;
+; Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+;
+;------------------------------------------------------------------------------
+
+BITS 16
+
+ALIGN 16
+
+;
+; Pad the image size to 4k when page tables are in VTF0
+;
+; If the VTF0 image has page tables built in, then we need to make
+; sure the end of VTF0 is 4k above where the page tables end.
+;
+; This is required so the page tables will be 4k aligned when VTF0 is
+; located just below 0x100000000 (4GB) in the firmware device.
+;
+%ifdef ALIGN_TOP_TO_4K_FOR_PAGING
+ TIMES (0x1000 - ($ - EndOfPageTables) - 0x20) DB 0
+%endif
+
+;
+; SEV-ES Processor Reset support
+;
+; sevEsResetBlock:
+; For the initial boot of an AP under SEV-ES, the "reset" RIP must be
+; programmed to the RAM area defined by SEV_ES_AP_RESET_IP. A known offset
+; and GUID will be used to locate this block in the firmware and extract
+; the build time RIP value. The GUID must always be 48 bytes from the
+; end of the firmware.
+;
+; 0xffffffca (-0x36) - IP value
+; 0xffffffcc (-0x34) - CS segment base [31:16]
+; 0xffffffce (-0x32) - Size of the SEV-ES reset block
+; 0xffffffd0 (-0x30) - SEV-ES reset block GUID
+; (00f771de-1a7e-4fcb-890e-68c77e2fb44e)
+;
+; A hypervisor reads the CS segement base and IP value. The CS segment base
+; value represents the high order 16-bits of the CS segment base, so the
+; hypervisor must left shift the value of the CS segement base by 16 bits to
+; form the full CS segment base for the CS segment register. It would then
+; program the EIP register with the IP value as read.
+;
+
+TIMES (32 - (sevEsResetBlockEnd - sevEsResetBlockStart)) DB 0
+
+sevEsResetBlockStart:
+ DD SEV_ES_AP_RESET_IP
+ DW sevEsResetBlockEnd - sevEsResetBlockStart
+ DB 0xDE, 0x71, 0xF7, 0x00, 0x7E, 0x1A, 0xCB, 0x4F
+ DB 0x89, 0x0E, 0x68, 0xC7, 0x7E, 0x2F, 0xB4, 0x4E
+sevEsResetBlockEnd:
+
+ALIGN 16
+
+applicationProcessorEntryPoint:
+;
+; Application Processors entry point
+;
+; GenFv generates code aligned on a 4k boundary which will jump to this
+; location. (0xffffffe0) This allows the Local APIC Startup IPI to be
+; used to wake up the application processors.
+;
+ jmp EarlyApInitReal16
+
+ALIGN 8
+
+ DD 0
+
+;
+; The VTF signature
+;
+; VTF-0 means that the VTF (Volume Top File) code does not require
+; any fixups.
+;
+vtfSignature:
+ DB 'V', 'T', 'F', 0
+
+ALIGN 16
+
+resetVector:
+;
+; Reset Vector
+;
+; This is where the processor will begin execution
+;
+ nop
+ nop
+ jmp EarlyBspInitReal16
+
+ALIGN 16
+
+fourGigabytes:
+
diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb
index 762661115d50..4913b379a993 100644
--- a/OvmfPkg/ResetVector/ResetVector.nasmb
+++ b/OvmfPkg/ResetVector/ResetVector.nasmb
@@ -82,5 +82,6 @@

%include "Main.asm"

+ %define SEV_ES_AP_RESET_IP FixedPcdGet32 (PcdSevEsWorkAreaBase)
%include "Ia16/ResetVectorVtf0.asm"

--
2.28.0


[PATCH v15 42/46] UefiCpuPkg: Allow AP booting under SEV-ES

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

Typically, an AP is booted using the INIT-SIPI-SIPI sequence. This
sequence is intercepted by the hypervisor, which sets the AP's registers
to the values requested by the sequence. At that point, the hypervisor can
start the AP, which will then begin execution at the appropriate location.

Under SEV-ES, AP booting presents some challenges since the hypervisor is
not allowed to alter the AP's register state. In this situation, we have
to distinguish between the AP's first boot and AP's subsequent boots.

First boot:
Once the AP's register state has been defined (which is before the guest
is first booted) it cannot be altered. Should the hypervisor attempt to
alter the register state, the change would be detected by the hardware
and the VMRUN instruction would fail. Given this, the first boot for the
AP is required to begin execution with this initial register state, which
is typically the reset vector. This prevents the BSP from directing the
AP startup location through the INIT-SIPI-SIPI sequence.

To work around this, the firmware will provide a build time reserved area
that can be used as the initial IP value. The hypervisor can extract this
location value by checking for the SEV-ES reset block GUID that must be
located 48-bytes from the end of the firmware. The format of the SEV-ES
reset block area is:

0x00 - 0x01 - SEV-ES Reset IP
0x02 - 0x03 - SEV-ES Reset CS Segment Base[31:16]
0x04 - 0x05 - Size of the SEV-ES reset block
0x06 - 0x15 - SEV-ES Reset Block GUID
(00f771de-1a7e-4fcb-890e-68c77e2fb44e)

The total size is 22 bytes. Any expansion to this block must be done
by adding new values before existing values.

The hypervisor will use the IP and CS values obtained from the SEV-ES
reset block to set as the AP's initial values. The CS Segment Base
represents the upper 16 bits of the CS segment base and must be left
shifted by 16 bits to form the complete CS segment base value.

Before booting the AP for the first time, the BSP must initialize the
SEV-ES reset area. This consists of programming a FAR JMP instruction
to the contents of a memory location that is also located in the SEV-ES
reset area. The BSP must program the IP and CS values for the FAR JMP
based on values drived from the INIT-SIPI-SIPI sequence.

Subsequent boots:
Again, the hypervisor cannot alter the AP register state, so a method is
required to take the AP out of halt state and redirect it to the desired
IP location. If it is determined that the AP is running in an SEV-ES
guest, then instead of calling CpuSleep(), a VMGEXIT is issued with the
AP Reset Hold exit code (0x80000004). The hypervisor will put the AP in
a halt state, waiting for an INIT-SIPI-SIPI sequence. Once the sequence
is recognized, the hypervisor will resume the AP. At this point the AP
must transition from the current 64-bit long mode down to 16-bit real
mode and begin executing at the derived location from the INIT-SIPI-SIPI
sequence.

Another change is around the area of obtaining the (x2)APIC ID during AP
startup. During AP startup, the AP can't take a #VC exception before the
AP has established a stack. However, the AP stack is set by using the
(x2)APIC ID, which is obtained through CPUID instructions. A CPUID
instruction will cause a #VC, so a different method must be used. The
GHCB protocol supports a method to obtain CPUID information from the
hypervisor through the GHCB MSR. This method does not require a stack,
so it is used to obtain the necessary CPUID information to determine the
(x2)APIC ID.

The new 16-bit protected mode GDT entry is used in order to transition
from 64-bit long mode down to 16-bit real mode.

A new assembler routine is created that takes the AP from 64-bit long mode
to 16-bit real mode. This is located under 1MB in memory and transitions
from 64-bit long mode to 32-bit compatibility mode to 16-bit protected
mode and finally 16-bit real mode.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 3 +
UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 3 +
UefiCpuPkg/Library/MpInitLib/MpLib.h | 60 ++++
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 70 +++-
UefiCpuPkg/Library/MpInitLib/MpLib.c | 336 +++++++++++++++++++-
UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 19 ++
UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c | 2 +-
UefiCpuPkg/Library/MpInitLib/Ia32/MpEqu.inc | 2 +-
UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 15 +
UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc | 4 +-
UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 239 ++++++++++++++
11 files changed, 738 insertions(+), 15 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
index 583276595619..1771575c69c1 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
@@ -52,6 +52,7 @@ [LibraryClasses]
DebugAgentLib
SynchronizationLib
PcdLib
+ VmgExitLib

[Protocols]
gEfiTimerArchProtocolGuid ## SOMETIMES_CONSUMES
@@ -72,4 +73,6 @@ [Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStatusCheckIntervalInMicroSeconds ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
index 4b3d39fbf36c..34abf25d43cd 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
@@ -51,6 +51,7 @@ [LibraryClasses]
SynchronizationLib
PeiServicesLib
PcdLib
+ VmgExitLib

[Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## CONSUMES
@@ -62,6 +63,8 @@ [Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase ## SOMETIMES_CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES

[Ppis]
gEdkiiPeiShadowMicrocodePpiGuid ## SOMETIMES_CONSUMES
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 5b46c295b6b2..b1a9d99cb3eb 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -173,6 +173,11 @@ typedef struct {
UINT8 *RelocateApLoopFuncAddress;
UINTN RelocateApLoopFuncSize;
UINTN ModeTransitionOffset;
+ UINTN SwitchToRealSize;
+ UINTN SwitchToRealOffset;
+ UINTN SwitchToRealNoNxOffset;
+ UINTN SwitchToRealPM16ModeOffset;
+ UINTN SwitchToRealPM16ModeSize;
} MP_ASSEMBLY_ADDRESS_MAP;

typedef struct _CPU_MP_DATA CPU_MP_DATA;
@@ -211,6 +216,8 @@ typedef struct {
// Enable5LevelPaging indicates whether 5-level paging is enabled in long mode.
//
BOOLEAN Enable5LevelPaging;
+ BOOLEAN SevEsIsEnabled;
+ UINTN GhcbBase;
} MP_CPU_EXCHANGE_INFO;

#pragma pack()
@@ -257,6 +264,7 @@ struct _CPU_MP_DATA {
UINT8 ApLoopMode;
UINT8 ApTargetCState;
UINT16 PmCodeSegment;
+ UINT16 Pm16CodeSegment;
CPU_AP_DATA *CpuData;
volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;

@@ -278,8 +286,47 @@ struct _CPU_MP_DATA {
BOOLEAN WakeUpByInitSipiSipi;

BOOLEAN SevEsIsEnabled;
+ UINTN SevEsAPBuffer;
+ UINTN SevEsAPResetStackStart;
+ CPU_MP_DATA *NewCpuMpData;
+
+ UINT64 GhcbBase;
};

+#define AP_RESET_STACK_SIZE 64
+
+#pragma pack(1)
+
+typedef struct {
+ UINT8 InsnBuffer[8];
+ UINT16 Rip;
+ UINT16 Segment;
+} SEV_ES_AP_JMP_FAR;
+
+#pragma pack()
+
+/**
+ Assembly code to move an AP from long mode to real mode.
+
+ Move an AP from long mode to real mode in preparation to invoking
+ the reset vector. This is used for SEV-ES guests where a hypervisor
+ is not allowed to set the CS and RIP to point to the reset vector.
+
+ @param[in] BufferStart The reset vector target.
+ @param[in] Code16 16-bit protected mode code segment value.
+ @param[in] Code32 32-bit protected mode code segment value.
+ @param[in] StackStart The start of a stack to be used for transitioning
+ from long mode to real mode.
+**/
+typedef
+VOID
+(EFIAPI AP_RESET) (
+ IN UINTN BufferStart,
+ IN UINT16 Code16,
+ IN UINT16 Code32,
+ IN UINTN StackStart
+ );
+
extern EFI_GUID mCpuInitMpLibHobGuid;

/**
@@ -385,6 +432,19 @@ GetModeTransitionBuffer (
IN UINTN BufferSize
);

+/**
+ Return the address of the SEV-ES AP jump table.
+
+ This buffer is required in order for an SEV-ES guest to transition from
+ UEFI into an OS.
+
+ @return Return SEV-ES AP jump table buffer
+**/
+UINTN
+GetSevEsAPMemory (
+ VOID
+ );
+
/**
This function will be called by BSP to wakeup AP.

diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 8ccddf8e9f9c..9115ff9e3e30 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -12,6 +12,8 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugAgentLib.h>
#include <Library/DxeServicesTableLib.h>
+#include <Register/Amd/Fam17Msr.h>
+#include <Register/Amd/Ghcb.h>

#include <Protocol/Timer.h>

@@ -144,6 +146,39 @@ GetModeTransitionBuffer (
return (UINTN)StartAddress;
}

+/**
+ Return the address of the SEV-ES AP jump table.
+
+ This buffer is required in order for an SEV-ES guest to transition from
+ UEFI into an OS.
+
+ @return Return SEV-ES AP jump table buffer
+**/
+UINTN
+GetSevEsAPMemory (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS StartAddress;
+
+ //
+ // Allocate 1 page for AP jump table page
+ //
+ StartAddress = BASE_4GB - 1;
+ Status = gBS->AllocatePages (
+ AllocateMaxAddress,
+ EfiReservedMemoryType,
+ 1,
+ &StartAddress
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ DEBUG ((DEBUG_INFO, "Dxe: SevEsAPMemory = %lx\n", (UINTN) StartAddress));
+
+ return (UINTN) StartAddress;
+}
+
/**
Checks APs status and updates APs status if needed.

@@ -218,6 +253,38 @@ CheckApsStatus (
}
}

+/**
+ Get Protected mode code segment with 16-bit default addressing
+ from current GDT table.
+
+ @return Protected mode 16-bit code segment value.
+**/
+UINT16
+GetProtectedMode16CS (
+ VOID
+ )
+{
+ IA32_DESCRIPTOR GdtrDesc;
+ IA32_SEGMENT_DESCRIPTOR *GdtEntry;
+ UINTN GdtEntryCount;
+ UINT16 Index;
+
+ Index = (UINT16) -1;
+ AsmReadGdtr (&GdtrDesc);
+ GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ for (Index = 0; Index < GdtEntryCount; Index++) {
+ if (GdtEntry->Bits.L == 0) {
+ if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.DB == 0) {
+ break;
+ }
+ }
+ GdtEntry++;
+ }
+ ASSERT (Index != GdtEntryCount);
+ return Index * 8;
+}
+
/**
Get Protected mode code segment from current GDT table.

@@ -238,7 +305,7 @@ GetProtectedModeCS (
GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
if (GdtEntry->Bits.L == 0) {
- if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.L == 0) {
+ if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.DB == 1) {
break;
}
}
@@ -300,6 +367,7 @@ MpInitChangeApLoopCallback (

CpuMpData = GetCpuMpData ();
CpuMpData->PmCodeSegment = GetProtectedModeCS ();
+ CpuMpData->Pm16CodeSegment = GetProtectedMode16CS ();
CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);
mNumberToFinish = CpuMpData->CpuCount - 1;
WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, NULL, TRUE);
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 2a3fbeef35f7..90416c81b616 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -9,6 +9,9 @@
**/

#include "MpLib.h"
+#include <Library/VmgExitLib.h>
+#include <Register/Amd/Fam17Msr.h>
+#include <Register/Amd/Ghcb.h>

EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;

@@ -291,6 +294,14 @@ GetApLoopMode (
//
ApLoopMode = ApInHltLoop;
}
+
+ if (PcdGetBool (PcdSevEsIsEnabled)) {
+ //
+ // For SEV-ES, force AP in Hlt-loop mode in order to use the GHCB
+ // protocol for starting APs
+ //
+ ApLoopMode = ApInHltLoop;
+ }
}

if (ApLoopMode != ApInMwaitLoop) {
@@ -587,6 +598,112 @@ InitializeApData (
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);
}

+/**
+ Get Protected mode code segment with 16-bit default addressing
+ from current GDT table.
+
+ @return Protected mode 16-bit code segment value.
+**/
+STATIC
+UINT16
+GetProtectedMode16CS (
+ VOID
+ )
+{
+ IA32_DESCRIPTOR GdtrDesc;
+ IA32_SEGMENT_DESCRIPTOR *GdtEntry;
+ UINTN GdtEntryCount;
+ UINT16 Index;
+
+ Index = (UINT16) -1;
+ AsmReadGdtr (&GdtrDesc);
+ GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ for (Index = 0; Index < GdtEntryCount; Index++) {
+ if (GdtEntry->Bits.L == 0 &&
+ GdtEntry->Bits.DB == 0 &&
+ GdtEntry->Bits.Type > 8) {
+ break;
+ }
+ GdtEntry++;
+ }
+ ASSERT (Index != GdtEntryCount);
+ return Index * 8;
+}
+
+/**
+ Get Protected mode code segment with 32-bit default addressing
+ from current GDT table.
+
+ @return Protected mode 32-bit code segment value.
+**/
+STATIC
+UINT16
+GetProtectedMode32CS (
+ VOID
+ )
+{
+ IA32_DESCRIPTOR GdtrDesc;
+ IA32_SEGMENT_DESCRIPTOR *GdtEntry;
+ UINTN GdtEntryCount;
+ UINT16 Index;
+
+ Index = (UINT16) -1;
+ AsmReadGdtr (&GdtrDesc);
+ GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ for (Index = 0; Index < GdtEntryCount; Index++) {
+ if (GdtEntry->Bits.L == 0 &&
+ GdtEntry->Bits.DB == 1 &&
+ GdtEntry->Bits.Type > 8) {
+ break;
+ }
+ GdtEntry++;
+ }
+ ASSERT (Index != GdtEntryCount);
+ return Index * 8;
+}
+
+/**
+ Reset an AP when in SEV-ES mode.
+
+ If successful, this function never returns.
+
+ @param[in] Ghcb Pointer to the GHCB
+ @param[in] CpuMpData Pointer to CPU MP Data
+
+**/
+STATIC
+VOID
+MpInitLibSevEsAPReset (
+ IN GHCB *Ghcb,
+ IN CPU_MP_DATA *CpuMpData
+ )
+{
+ UINT16 Code16, Code32;
+ AP_RESET *APResetFn;
+ UINTN BufferStart;
+ UINTN StackStart;
+
+ Code16 = GetProtectedMode16CS ();
+ Code32 = GetProtectedMode32CS ();
+
+ if (CpuMpData->WakeupBufferHigh != 0) {
+ APResetFn = (AP_RESET *) (CpuMpData->WakeupBufferHigh + CpuMpData->AddressMap.SwitchToRealNoNxOffset);
+ } else {
+ APResetFn = (AP_RESET *) (CpuMpData->MpCpuExchangeInfo->BufferStart + CpuMpData->AddressMap.SwitchToRealOffset);
+ }
+
+ BufferStart = CpuMpData->MpCpuExchangeInfo->BufferStart;
+ StackStart = CpuMpData->SevEsAPResetStackStart -
+ (AP_RESET_STACK_SIZE * GetApicId ());
+
+ //
+ // This call never returns.
+ //
+ APResetFn (BufferStart, Code16, Code32, StackStart);
+}
+
/**
This function will be called from AP reset code if BSP uses WakeUpAP.

@@ -648,7 +765,14 @@ ApWakeupFunction (
InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack);
ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal;

- InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
+ //
+ // Delay decrementing the APs executing count when SEV-ES is enabled
+ // to allow the APs to issue an AP_RESET_HOLD before the BSP possibly
+ // performs another INIT-SIPI-SIPI sequence.
+ //
+ if (!CpuMpData->SevEsIsEnabled) {
+ InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
+ }
} else {
//
// Execute AP function if AP is ready
@@ -755,7 +879,52 @@ ApWakeupFunction (
//
while (TRUE) {
DisableInterrupts ();
- CpuSleep ();
+ if (CpuMpData->SevEsIsEnabled) {
+ MSR_SEV_ES_GHCB_REGISTER Msr;
+ GHCB *Ghcb;
+ UINT64 Status;
+ BOOLEAN DoDecrement;
+
+ if (CpuMpData->InitFlag == ApInitConfig) {
+ DoDecrement = TRUE;
+ }
+
+ while (TRUE) {
+ Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);
+ Ghcb = Msr.Ghcb;
+
+ VmgInit (Ghcb);
+
+ if (DoDecrement) {
+ DoDecrement = FALSE;
+
+ //
+ // Perform the delayed decrement just before issuing the first
+ // VMGEXIT with AP_RESET_HOLD.
+ //
+ InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
+ }
+
+ Status = VmgExit (Ghcb, SVM_EXIT_AP_RESET_HOLD, 0, 0);
+ if ((Status == 0) && (Ghcb->SaveArea.SwExitInfo2 != 0)) {
+ VmgDone (Ghcb);
+ break;
+ }
+
+ VmgDone (Ghcb);
+ }
+
+ //
+ // Awakened in a new phase? Use the new CpuMpData
+ //
+ if (CpuMpData->NewCpuMpData != NULL) {
+ CpuMpData = CpuMpData->NewCpuMpData;
+ }
+
+ MpInitLibSevEsAPReset (Ghcb, CpuMpData);
+ } else {
+ CpuSleep ();
+ }
CpuPause ();
}
}
@@ -868,6 +1037,9 @@ FillExchangeInfoData (
ExchangeInfo->Enable5LevelPaging = (BOOLEAN) (Cr4.Bits.LA57 == 1);
DEBUG ((DEBUG_INFO, "%a: 5-Level Paging = %d\n", gEfiCallerBaseName, ExchangeInfo->Enable5LevelPaging));

+ ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled;
+ ExchangeInfo->GhcbBase = (UINTN) CpuMpData->GhcbBase;
+
//
// Get the BSP's data of GDT and IDT
//
@@ -894,8 +1066,9 @@ FillExchangeInfoData (
// EfiBootServicesCode to avoid page fault if NX memory protection is enabled.
//
if (CpuMpData->WakeupBufferHigh != 0) {
- Size = CpuMpData->AddressMap.RendezvousFunnelSize -
- CpuMpData->AddressMap.ModeTransitionOffset;
+ Size = CpuMpData->AddressMap.RendezvousFunnelSize +
+ CpuMpData->AddressMap.SwitchToRealSize -
+ CpuMpData->AddressMap.ModeTransitionOffset;
CopyMem (
(VOID *)CpuMpData->WakeupBufferHigh,
CpuMpData->AddressMap.RendezvousFunnelAddress +
@@ -948,7 +1121,8 @@ BackupAndPrepareWakeupBuffer(
CopyMem (
(VOID *) CpuMpData->WakeupBuffer,
(VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,
- CpuMpData->AddressMap.RendezvousFunnelSize
+ CpuMpData->AddressMap.RendezvousFunnelSize +
+ CpuMpData->AddressMap.SwitchToRealSize
);
}

@@ -969,6 +1143,44 @@ RestoreWakeupBuffer(
);
}

+/**
+ Calculate the size of the reset stack.
+
+ @return Total amount of memory required for stacks
+**/
+STATIC
+UINTN
+GetApResetStackSize (
+ VOID
+ )
+{
+ return AP_RESET_STACK_SIZE * PcdGet32(PcdCpuMaxLogicalProcessorNumber);
+}
+
+/**
+ Calculate the size of the reset vector.
+
+ @param[in] AddressMap The pointer to Address Map structure.
+
+ @return Total amount of memory required for the AP reset area
+**/
+STATIC
+UINTN
+GetApResetVectorSize (
+ IN MP_ASSEMBLY_ADDRESS_MAP *AddressMap
+ )
+{
+ UINTN Size;
+
+ Size = ALIGN_VALUE (AddressMap->RendezvousFunnelSize +
+ AddressMap->SwitchToRealSize +
+ sizeof (MP_CPU_EXCHANGE_INFO),
+ CPU_STACK_ALIGNMENT);
+ Size += GetApResetStackSize ();
+
+ return Size;
+}
+
/**
Allocate reset vector buffer.

@@ -982,16 +1194,22 @@ AllocateResetVector (
UINTN ApResetVectorSize;

if (CpuMpData->WakeupBuffer == (UINTN) -1) {
- ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +
- sizeof (MP_CPU_EXCHANGE_INFO);
+ ApResetVectorSize = GetApResetVectorSize (&CpuMpData->AddressMap);

CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
- (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);
+ (CpuMpData->WakeupBuffer +
+ CpuMpData->AddressMap.RendezvousFunnelSize +
+ CpuMpData->AddressMap.SwitchToRealSize);
CpuMpData->WakeupBufferHigh = GetModeTransitionBuffer (
- CpuMpData->AddressMap.RendezvousFunnelSize -
+ CpuMpData->AddressMap.RendezvousFunnelSize +
+ CpuMpData->AddressMap.SwitchToRealSize -
CpuMpData->AddressMap.ModeTransitionOffset
);
+ //
+ // The reset stack starts at the end of the buffer.
+ //
+ CpuMpData->SevEsAPResetStackStart = CpuMpData->WakeupBuffer + ApResetVectorSize;
}
BackupAndPrepareWakeupBuffer (CpuMpData);
}
@@ -1006,7 +1224,80 @@ FreeResetVector (
IN CPU_MP_DATA *CpuMpData
)
{
- RestoreWakeupBuffer (CpuMpData);
+ //
+ // If SEV-ES is enabled, the reset area is needed for AP parking and
+ // and AP startup in the OS, so the reset area is reserved. Do not
+ // perform the restore as this will overwrite memory which has data
+ // needed by SEV-ES.
+ //
+ if (!CpuMpData->SevEsIsEnabled) {
+ RestoreWakeupBuffer (CpuMpData);
+ }
+}
+
+/**
+ Allocate the SEV-ES AP jump table buffer.
+
+ @param[in, out] CpuMpData The pointer to CPU MP Data structure.
+**/
+VOID
+AllocateSevEsAPMemory (
+ IN OUT CPU_MP_DATA *CpuMpData
+ )
+{
+ if (CpuMpData->SevEsAPBuffer == (UINTN) -1) {
+ CpuMpData->SevEsAPBuffer =
+ CpuMpData->SevEsIsEnabled ? GetSevEsAPMemory () : 0;
+ }
+}
+
+/**
+ Program the SEV-ES AP jump table buffer.
+
+ @param[in] SipiVector The SIPI vector used for the AP Reset
+**/
+VOID
+SetSevEsJumpTable (
+ IN UINTN SipiVector
+ )
+{
+ SEV_ES_AP_JMP_FAR *JmpFar;
+ UINT32 Offset, InsnByte;
+ UINT8 LoNib, HiNib;
+
+ JmpFar = (SEV_ES_AP_JMP_FAR *) FixedPcdGet32 (PcdSevEsWorkAreaBase);
+ ASSERT (JmpFar != NULL);
+
+ //
+ // Obtain the address of the Segment/Rip location in the workarea.
+ // This will be set to a value derived from the SIPI vector and will
+ // be the memory address used for the far jump below.
+ //
+ Offset = FixedPcdGet32 (PcdSevEsWorkAreaBase);
+ Offset += sizeof (JmpFar->InsnBuffer);
+ LoNib = (UINT8) Offset;
+ HiNib = (UINT8) (Offset >> 8);
+
+ //
+ // Program the workarea (which is the initial AP boot address) with
+ // far jump to the SIPI vector (where XX and YY represent the
+ // address of where the SIPI vector is stored.
+ //
+ // JMP FAR [CS:XXYY] => 2E FF 2E YY XX
+ //
+ InsnByte = 0;
+ JmpFar->InsnBuffer[InsnByte++] = 0x2E; // CS override prefix
+ JmpFar->InsnBuffer[InsnByte++] = 0xFF; // JMP (FAR)
+ JmpFar->InsnBuffer[InsnByte++] = 0x2E; // ModRM (JMP memory location)
+ JmpFar->InsnBuffer[InsnByte++] = LoNib; // YY offset ...
+ JmpFar->InsnBuffer[InsnByte++] = HiNib; // XX offset ...
+
+ //
+ // Program the Segment/Rip based on the SIPI vector (always at least
+ // 16-byte aligned, so Rip is set to 0).
+ //
+ JmpFar->Rip = 0;
+ JmpFar->Segment = (UINT16) (SipiVector >> 4);
}

/**
@@ -1043,6 +1334,7 @@ WakeUpAP (
CpuMpData->InitFlag != ApInitDone) {
ResetVectorRequired = TRUE;
AllocateResetVector (CpuMpData);
+ AllocateSevEsAPMemory (CpuMpData);
FillExchangeInfoData (CpuMpData);
SaveLocalApicTimerSetting (CpuMpData);
}
@@ -1079,6 +1371,15 @@ WakeUpAP (
}
}
if (ResetVectorRequired) {
+ //
+ // For SEV-ES, the initial AP boot address will be defined by
+ // PcdSevEsWorkAreaBase. The Segment/Rip must be the jump address
+ // from the original INIT-SIPI-SIPI.
+ //
+ if (CpuMpData->SevEsIsEnabled) {
+ SetSevEsJumpTable (ExchangeInfo->BufferStart);
+ }
+
//
// Wakeup all APs
//
@@ -1170,6 +1471,16 @@ WakeUpAP (
*(UINT32 *) CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;
if (ResetVectorRequired) {
CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+
+ //
+ // For SEV-ES, the initial AP boot address will be defined by
+ // PcdSevEsWorkAreaBase. The Segment/Rip must be the jump address
+ // from the original INIT-SIPI-SIPI.
+ //
+ if (CpuMpData->SevEsIsEnabled) {
+ SetSevEsJumpTable (ExchangeInfo->BufferStart);
+ }
+
SendInitSipiSipi (
CpuInfoInHob[ProcessorNumber].ApicId,
(UINT32) ExchangeInfo->BufferStart
@@ -1646,7 +1957,7 @@ MpInitLibInitialize (
ASSERT (MaxLogicalProcessorNumber != 0);

AsmGetAddressMap (&AddressMap);
- ApResetVectorSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO);
+ ApResetVectorSize = GetApResetVectorSize (&AddressMap);
ApStackSize = PcdGet32(PcdCpuApStackSize);
ApLoopMode = GetApLoopMode (&MonitorFilterSize);

@@ -1705,6 +2016,8 @@ MpInitLibInitialize (
CpuMpData->CpuInfoInHob = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);
InitializeSpinLock(&CpuMpData->MpLock);
CpuMpData->SevEsIsEnabled = PcdGetBool (PcdSevEsIsEnabled);
+ CpuMpData->SevEsAPBuffer = (UINTN) -1;
+ CpuMpData->GhcbBase = PcdGet64 (PcdGhcbBase);

//
// Make sure no memory usage outside of the allocated buffer.
@@ -1763,6 +2076,7 @@ MpInitLibInitialize (
// APs have been wakeup before, just get the CPU Information
// from HOB
//
+ OldCpuMpData->NewCpuMpData = CpuMpData;
CpuMpData->CpuCount = OldCpuMpData->CpuCount;
CpuMpData->BspNumber = OldCpuMpData->BspNumber;
CpuMpData->CpuInfoInHob = OldCpuMpData->CpuInfoInHob;
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
index a548fed23fa7..3989bd6a7a9f 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
@@ -280,6 +280,25 @@ GetModeTransitionBuffer (
return 0;
}

+/**
+ Return the address of the SEV-ES AP jump table.
+
+ This buffer is required in order for an SEV-ES guest to transition from
+ UEFI into an OS.
+
+ @return Return SEV-ES AP jump table buffer
+**/
+UINTN
+GetSevEsAPMemory (
+ VOID
+ )
+{
+ //
+ // PEI phase doesn't need to do such transition. So simply return 0.
+ //
+ return 0;
+}
+
/**
Checks APs status and updates APs status if needed.

diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c
index 6298571e29b2..28f8e8e133e5 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c
@@ -121,7 +121,7 @@ GetProtectedModeCS (
GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
if (GdtEntry->Bits.L == 0) {
- if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.L == 0) {
+ if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.DB == 1) {
break;
}
}
diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpEqu.inc b/UefiCpuPkg/Library/MpInitLib/Ia32/MpEqu.inc
index efb1bc2bf7cb..4f5a7c859a56 100644
--- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpEqu.inc
+++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpEqu.inc
@@ -19,7 +19,7 @@ CPU_SWITCH_STATE_IDLE equ 0
CPU_SWITCH_STATE_STORED equ 1
CPU_SWITCH_STATE_LOADED equ 2

-LockLocation equ (RendezvousFunnelProcEnd - RendezvousFunnelProcStart)
+LockLocation equ (SwitchToRealProcEnd - RendezvousFunnelProcStart)
StackStartAddressLocation equ LockLocation + 04h
StackSizeLocation equ LockLocation + 08h
ApProcedureLocation equ LockLocation + 0Ch
diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
index b74046b76af3..309d53bf3b37 100644
--- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm
@@ -215,6 +215,16 @@ CProcedureInvoke:
jmp $ ; Never reach here
RendezvousFunnelProcEnd:

+;-------------------------------------------------------------------------------------
+;SwitchToRealProc procedure follows.
+;NOT USED IN 32 BIT MODE.
+;-------------------------------------------------------------------------------------
+global ASM_PFX(SwitchToRealProc)
+ASM_PFX(SwitchToRealProc):
+SwitchToRealProcStart:
+ jmp $ ; Never reach here
+SwitchToRealProcEnd:
+
;-------------------------------------------------------------------------------------
; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish);
;-------------------------------------------------------------------------------------
@@ -263,6 +273,11 @@ ASM_PFX(AsmGetAddressMap):
mov dword [ebx + 0Ch], AsmRelocateApLoopStart
mov dword [ebx + 10h], AsmRelocateApLoopEnd - AsmRelocateApLoopStart
mov dword [ebx + 14h], Flat32Start - RendezvousFunnelProcStart
+ mov dword [ebx + 18h], SwitchToRealProcEnd - SwitchToRealProcStart ; SwitchToRealSize
+ mov dword [ebx + 1Ch], SwitchToRealProcStart - RendezvousFunnelProcStart ; SwitchToRealOffset
+ mov dword [ebx + 20h], SwitchToRealProcStart - Flat32Start ; SwitchToRealNoNxOffset
+ mov dword [ebx + 24h], 0 ; SwitchToRealPM16ModeOffset
+ mov dword [ebx + 28h], 0 ; SwitchToRealPM16ModeSize

popad
ret
diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc b/UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc
index 58ef369342a7..c92daaaffd6b 100644
--- a/UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc
+++ b/UefiCpuPkg/Library/MpInitLib/X64/MpEqu.inc
@@ -19,7 +19,7 @@ CPU_SWITCH_STATE_IDLE equ 0
CPU_SWITCH_STATE_STORED equ 1
CPU_SWITCH_STATE_LOADED equ 2

-LockLocation equ (RendezvousFunnelProcEnd - RendezvousFunnelProcStart)
+LockLocation equ (SwitchToRealProcEnd - RendezvousFunnelProcStart)
StackStartAddressLocation equ LockLocation + 08h
StackSizeLocation equ LockLocation + 10h
ApProcedureLocation equ LockLocation + 18h
@@ -41,3 +41,5 @@ ModeTransitionSegmentLocation equ LockLocation + 98h
ModeHighMemoryLocation equ LockLocation + 9Ah
ModeHighSegmentLocation equ LockLocation + 9Eh
Enable5LevelPagingLocation equ LockLocation + 0A0h
+SevEsIsEnabledLocation equ LockLocation + 0A1h
+GhcbBaseLocation equ LockLocation + 0A2h
diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
index 87f2523e856f..6956b408d004 100644
--- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
+++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm
@@ -184,9 +184,97 @@ Releaselock:
add edi, StackStartAddressLocation
add rax, qword [edi]
mov rsp, rax
+
+ lea edi, [esi + SevEsIsEnabledLocation]
+ cmp byte [edi], 1 ; SevEsIsEnabled
+ jne CProcedureInvoke
+
+ ;
+ ; program GHCB
+ ; Each page after the GHCB is a per-CPU page, so the calculation programs
+ ; a GHCB to be every 8KB.
+ ;
+ mov eax, SIZE_4KB
+ shl eax, 1 ; EAX = SIZE_4K * 2
+ mov ecx, ebx
+ mul ecx ; EAX = SIZE_4K * 2 * CpuNumber
+ mov edi, esi
+ add edi, GhcbBaseLocation
+ add rax, qword [edi]
+ mov rdx, rax
+ shr rdx, 32
+ mov rcx, 0xc0010130
+ wrmsr
jmp CProcedureInvoke

GetApicId:
+ lea edi, [esi + SevEsIsEnabledLocation]
+ cmp byte [edi], 1 ; SevEsIsEnabled
+ jne DoCpuid
+
+ ;
+ ; Since we don't have a stack yet, we can't take a #VC
+ ; exception. Use the GHCB protocol to perform the CPUID
+ ; calls.
+ ;
+ mov rcx, 0xc0010130
+ rdmsr
+ shl rdx, 32
+ or rax, rdx
+ mov rdi, rax ; RDI now holds the original GHCB GPA
+
+ mov rdx, 0 ; CPUID function 0
+ mov rax, 0 ; RAX register requested
+ or rax, 4
+ wrmsr
+ rep vmmcall
+ rdmsr
+ cmp edx, 0bh
+ jb NoX2ApicSevEs ; CPUID level below CPUID_EXTENDED_TOPOLOGY
+
+ mov rdx, 0bh ; CPUID function 0x0b
+ mov rax, 040000000h ; RBX register requested
+ or rax, 4
+ wrmsr
+ rep vmmcall
+ rdmsr
+ test edx, 0ffffh
+ jz NoX2ApicSevEs ; CPUID.0BH:EBX[15:0] is zero
+
+ mov rdx, 0bh ; CPUID function 0x0b
+ mov rax, 0c0000000h ; RDX register requested
+ or rax, 4
+ wrmsr
+ rep vmmcall
+ rdmsr
+
+ ; Processor is x2APIC capable; 32-bit x2APIC ID is now in EDX
+ jmp RestoreGhcb
+
+NoX2ApicSevEs:
+ ; Processor is not x2APIC capable, so get 8-bit APIC ID
+ mov rdx, 1 ; CPUID function 1
+ mov rax, 040000000h ; RBX register requested
+ or rax, 4
+ wrmsr
+ rep vmmcall
+ rdmsr
+ shr edx, 24
+
+RestoreGhcb:
+ mov rbx, rdx ; Save x2APIC/APIC ID
+
+ mov rdx, rdi ; RDI holds the saved GHCB GPA
+ shr rdx, 32
+ mov eax, edi
+ wrmsr
+
+ mov rdx, rbx
+
+ ; x2APIC ID or APIC ID is in EDX
+ jmp GetProcessorNumber
+
+DoCpuid:
mov eax, 0
cpuid
cmp eax, 0bh
@@ -253,12 +341,158 @@ CProcedureInvoke:

RendezvousFunnelProcEnd:

+;-------------------------------------------------------------------------------------
+;SwitchToRealProc procedure follows.
+;ALSO THIS PROCEDURE IS EXECUTED BY APs TRANSITIONING TO 16 BIT MODE. HENCE THIS PROC
+;IS IN MACHINE CODE.
+; SwitchToRealProc (UINTN BufferStart, UINT16 Code16, UINT16 Code32, UINTN StackStart)
+; rcx - Buffer Start
+; rdx - Code16 Selector Offset
+; r8 - Code32 Selector Offset
+; r9 - Stack Start
+;-------------------------------------------------------------------------------------
+global ASM_PFX(SwitchToRealProc)
+ASM_PFX(SwitchToRealProc):
+SwitchToRealProcStart:
+BITS 64
+ cli
+
+ ;
+ ; Get RDX reset value before changing stacks since the
+ ; new stack won't be able to accomodate a #VC exception.
+ ;
+ push rax
+ push rbx
+ push rcx
+ push rdx
+
+ mov rax, 1
+ cpuid
+ mov rsi, rax ; Save off the reset value for RDX
+
+ pop rdx
+ pop rcx
+ pop rbx
+ pop rax
+
+ ;
+ ; Establish stack below 1MB
+ ;
+ mov rsp, r9
+
+ ;
+ ; Push ultimate Reset Vector onto the stack
+ ;
+ mov rax, rcx
+ shr rax, 4
+ push word 0x0002 ; RFLAGS
+ push ax ; CS
+ push word 0x0000 ; RIP
+ push word 0x0000 ; For alignment, will be discarded
+
+ ;
+ ; Get address of "16-bit operand size" label
+ ;
+ lea rbx, [PM16Mode]
+
+ ;
+ ; Push addresses used to change to compatibility mode
+ ;
+ lea rax, [CompatMode]
+ push r8
+ push rax
+
+ ;
+ ; Clear R8 - R15, for reset, before going into 32-bit mode
+ ;
+ xor r8, r8
+ xor r9, r9
+ xor r10, r10
+ xor r11, r11
+ xor r12, r12
+ xor r13, r13
+ xor r14, r14
+ xor r15, r15
+
+ ;
+ ; Far return into 32-bit mode
+ ;
+o64 retf
+
+BITS 32
+CompatMode:
+ ;
+ ; Set up stack to prepare for exiting protected mode
+ ;
+ push edx ; Code16 CS
+ push ebx ; PM16Mode label address
+
+ ;
+ ; Disable paging
+ ;
+ mov eax, cr0 ; Read CR0
+ btr eax, 31 ; Set PG=0
+ mov cr0, eax ; Write CR0
+
+ ;
+ ; Disable long mode
+ ;
+ mov ecx, 0c0000080h ; EFER MSR number
+ rdmsr ; Read EFER
+ btr eax, 8 ; Set LME=0
+ wrmsr ; Write EFER
+
+ ;
+ ; Disable PAE
+ ;
+ mov eax, cr4 ; Read CR4
+ btr eax, 5 ; Set PAE=0
+ mov cr4, eax ; Write CR4
+
+ mov edx, esi ; Restore RDX reset value
+
+ ;
+ ; Switch to 16-bit operand size
+ ;
+ retf
+
+BITS 16
+ ;
+ ; At entry to this label
+ ; - RDX will have its reset value
+ ; - On the top of the stack
+ ; - Alignment data (two bytes) to be discarded
+ ; - IP for Real Mode (two bytes)
+ ; - CS for Real Mode (two bytes)
+ ;
+PM16Mode:
+ mov eax, cr0 ; Read CR0
+ btr eax, 0 ; Set PE=0
+ mov cr0, eax ; Write CR0
+
+ pop ax ; Discard alignment data
+
+ ;
+ ; Clear registers (except RDX and RSP) before going into 16-bit mode
+ ;
+ xor eax, eax
+ xor ebx, ebx
+ xor ecx, ecx
+ xor esi, esi
+ xor edi, edi
+ xor ebp, ebp
+
+ iret
+
+SwitchToRealProcEnd:
+
;-------------------------------------------------------------------------------------
; AsmRelocateApLoop (MwaitSupport, ApTargetCState, PmCodeSegment, TopOfApStack, CountTofinish);
;-------------------------------------------------------------------------------------
global ASM_PFX(AsmRelocateApLoop)
ASM_PFX(AsmRelocateApLoop):
AsmRelocateApLoopStart:
+BITS 64
cli ; Disable interrupt before switching to 32-bit mode
mov rax, [rsp + 40] ; CountTofinish
lock dec dword [rax] ; (*CountTofinish)--
@@ -324,6 +558,11 @@ ASM_PFX(AsmGetAddressMap):
mov qword [rcx + 18h], rax
mov qword [rcx + 20h], AsmRelocateApLoopEnd - AsmRelocateApLoopStart
mov qword [rcx + 28h], Flat32Start - RendezvousFunnelProcStart
+ mov qword [rcx + 30h], SwitchToRealProcEnd - SwitchToRealProcStart ; SwitchToRealSize
+ mov qword [rcx + 38h], SwitchToRealProcStart - RendezvousFunnelProcStart ; SwitchToRealOffset
+ mov qword [rcx + 40h], SwitchToRealProcStart - Flat32Start ; SwitchToRealNoNxOffset
+ mov qword [rcx + 48h], PM16Mode - RendezvousFunnelProcStart ; SwitchToRealPM16ModeOffset
+ mov qword [rcx + 50h], SwitchToRealProcEnd - PM16Mode ; SwitchToRealPM16ModeSize
ret

;-------------------------------------------------------------------------------------
--
2.28.0


[PATCH v15 41/46] UefiCpuPkg/MpInitLib: Add CPU MP data flag to indicate if SEV-ES is enabled

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

When starting APs in an SMP configuration, the AP needs to know if it is
running as an SEV-ES guest in order to assign a GHCB page.

Add a field to the CPU_MP_DATA structure that will indicate if SEV-ES is
enabled. This new field is set during MP library initialization with the
PCD value PcdSevEsIsEnabled. This flag can then be used to determine if
SEV-ES is enabled.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 1 +
UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 1 +
UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 ++
UefiCpuPkg/Library/MpInitLib/MpLib.c | 1 +
4 files changed, 5 insertions(+)

diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
index 9907f4157b09..583276595619 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
@@ -71,4 +71,5 @@ [Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApStatusCheckIntervalInMicroSeconds ## CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
index 89ee9a79d8c5..4b3d39fbf36c 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf
@@ -61,6 +61,7 @@ [Pcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
+ gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled ## CONSUMES

[Ppis]
gEdkiiPeiShadowMicrocodePpiGuid ## SOMETIMES_CONSUMES
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index a8ca03efb8e3..5b46c295b6b2 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -276,6 +276,8 @@ struct _CPU_MP_DATA {
// driver.
//
BOOLEAN WakeUpByInitSipiSipi;
+
+ BOOLEAN SevEsIsEnabled;
};

extern EFI_GUID mCpuInitMpLibHobGuid;
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 9b0660a5d4ea..2a3fbeef35f7 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -1704,6 +1704,7 @@ MpInitLibInitialize (
CpuMpData->CpuData = (CPU_AP_DATA *) (CpuMpData + 1);
CpuMpData->CpuInfoInHob = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);
InitializeSpinLock(&CpuMpData->MpLock);
+ CpuMpData->SevEsIsEnabled = PcdGetBool (PcdSevEsIsEnabled);

//
// Make sure no memory usage outside of the allocated buffer.
--
2.28.0


[PATCH v15 40/46] UefiCpuPkg: Add a 16-bit protected mode code segment descriptor

Lendacky, Thomas
 

From: Tom Lendacky <thomas.lendacky@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198

A hypervisor is not allowed to update an SEV-ES guests register state,
so when booting an SEV-ES guest AP, the hypervisor is not allowed to
set the RIP to the guest requested value. Instead, an SEV-ES AP must be
transition from 64-bit long mode to 16-bit real mode in response to an
INIT-SIPI-SIPI sequence. This requires a 16-bit code segment descriptor.
For PEI, create this descriptor in the reset vector GDT table. For DXE,
create this descriptor from the newly reserved entry at location 0x28.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
---
UefiCpuPkg/CpuDxe/CpuGdt.h | 4 ++--
UefiCpuPkg/CpuDxe/CpuGdt.c | 8 ++++----
UefiCpuPkg/ResetVector/Vtf0/Ia16/Real16ToFlat32.asm | 9 +++++++++
3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/UefiCpuPkg/CpuDxe/CpuGdt.h b/UefiCpuPkg/CpuDxe/CpuGdt.h
index 3a0210b2f172..1c94487cbee8 100644
--- a/UefiCpuPkg/CpuDxe/CpuGdt.h
+++ b/UefiCpuPkg/CpuDxe/CpuGdt.h
@@ -36,7 +36,7 @@ struct _GDT_ENTRIES {
GDT_ENTRY LinearCode;
GDT_ENTRY SysData;
GDT_ENTRY SysCode;
- GDT_ENTRY Spare4;
+ GDT_ENTRY SysCode16;
GDT_ENTRY LinearData64;
GDT_ENTRY LinearCode64;
GDT_ENTRY Spare5;
@@ -49,7 +49,7 @@ struct _GDT_ENTRIES {
#define LINEAR_CODE_SEL OFFSET_OF (GDT_ENTRIES, LinearCode)
#define SYS_DATA_SEL OFFSET_OF (GDT_ENTRIES, SysData)
#define SYS_CODE_SEL OFFSET_OF (GDT_ENTRIES, SysCode)
-#define SPARE4_SEL OFFSET_OF (GDT_ENTRIES, Spare4)
+#define SYS_CODE16_SEL OFFSET_OF (GDT_ENTRIES, SysCode16)
#define LINEAR_DATA64_SEL OFFSET_OF (GDT_ENTRIES, LinearData64)
#define LINEAR_CODE64_SEL OFFSET_OF (GDT_ENTRIES, LinearCode64)
#define SPARE5_SEL OFFSET_OF (GDT_ENTRIES, Spare5)
diff --git a/UefiCpuPkg/CpuDxe/CpuGdt.c b/UefiCpuPkg/CpuDxe/CpuGdt.c
index 64efadeba601..a1ab543f2da5 100644
--- a/UefiCpuPkg/CpuDxe/CpuGdt.c
+++ b/UefiCpuPkg/CpuDxe/CpuGdt.c
@@ -70,14 +70,14 @@ STATIC GDT_ENTRIES GdtTemplate = {
0x0,
},
//
- // SPARE4_SEL
+ // SYS_CODE16_SEL
//
{
- 0x0, // limit 15:0
+ 0x0FFFF, // limit 15:0
0x0, // base 15:0
0x0, // base 23:16
- 0x0, // type
- 0x0, // limit 19:16, flags
+ 0x09A, // present, ring 0, code, execute/read
+ 0x08F, // page-granular, 16-bit
0x0, // base 31:24
},
//
diff --git a/UefiCpuPkg/ResetVector/Vtf0/Ia16/Real16ToFlat32.asm b/UefiCpuPkg/ResetVector/Vtf0/Ia16/Real16ToFlat32.asm
index ce4ebfffb688..0e79a3984b16 100644
--- a/UefiCpuPkg/ResetVector/Vtf0/Ia16/Real16ToFlat32.asm
+++ b/UefiCpuPkg/ResetVector/Vtf0/Ia16/Real16ToFlat32.asm
@@ -129,5 +129,14 @@ LINEAR_CODE64_SEL equ $-GDT_BASE
DB 0 ; base 31:24
%endif

+; linear code segment descriptor
+LINEAR_CODE16_SEL equ $-GDT_BASE
+ DW 0xffff ; limit 15:0
+ DW 0 ; base 15:0
+ DB 0 ; base 23:16
+ DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE32_TYPE)
+ DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(0)|CODE64_FLAG(0)|UPPER_LIMIT(0xf)
+ DB 0 ; base 31:24
+
GDT_END:

--
2.28.0


Re: [Patch ] Static IP based HTTP Support

Sivaraman Nainar
 

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2888

 

*** NetworkPkg\HttpBootDxe\HttpBootClient.c             2020-05-07 22:54:46.000000000 +05-30

--- NetworkPkg\HttpBootDxe\HttpBootClient.c 2020-08-09 21:03:01.000000000 +05-30

***************

*** 1,6 ****

--- 1,13 ----

+ //***********************************************************************

+ //*                                                                     *

+ //*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ //*                                                                     *

+ //*      All rights reserved. Subject to AMI licensing agreement.       *

+ //*                                                                     *

+ //***********************************************************************

  /** @file

    Implementation of the boot file download function.

 

  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>

  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

***************

*** 45,57 ****

      Node->Ipv4.Header.Type    = MESSAGING_DEVICE_PATH;

      Node->Ipv4.Header.SubType = MSG_IPv4_DP;

      SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));

      CopyMem (&Node->Ipv4.LocalIpAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));

      Node->Ipv4.RemotePort      = Private->Port;

      Node->Ipv4.Protocol        = EFI_IP_PROTO_TCP;

!     Node->Ipv4.StaticIpAddress = FALSE;

      CopyMem (&Node->Ipv4.GatewayIpAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS));

      CopyMem (&Node->Ipv4.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));

    } else {

      Node = AllocateZeroPool (sizeof (IPv6_DEVICE_PATH));

      if (Node == NULL) {

        return EFI_OUT_OF_RESOURCES;

--- 52,67 ----

      Node->Ipv4.Header.Type    = MESSAGING_DEVICE_PATH;

      Node->Ipv4.Header.SubType = MSG_IPv4_DP;

      SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));

      CopyMem (&Node->Ipv4.LocalIpAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));

      Node->Ipv4.RemotePort      = Private->Port;

      Node->Ipv4.Protocol        = EFI_IP_PROTO_TCP;

!     if (Private->UsingStatic)

!         Node->Ipv4.StaticIpAddress =TRUE;

!     else

!         Node->Ipv4.StaticIpAddress = FALSE;

      CopyMem (&Node->Ipv4.GatewayIpAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS));

      CopyMem (&Node->Ipv4.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));

   } else {

      Node = AllocateZeroPool (sizeof (IPv6_DEVICE_PATH));

      if (Node == NULL) {

        return EFI_OUT_OF_RESOURCES;

***************

*** 325,374 ****

    EFI_DHCP6_PACKET_OPTION         *Option;

    EFI_IPv6_ADDRESS                IpAddr;

    CHAR8                           *HostName;

    UINTN                           HostNameSize;

    CHAR16                          *HostNameStr;

    EFI_STATUS                      Status;

!

    ASSERT (Private != NULL);

!   ASSERT (Private->SelectIndex != 0);

!   SelectIndex = Private->SelectIndex - 1;

!   ASSERT (SelectIndex < HTTP_BOOT_OFFER_MAX_NUM);

!

    DnsServerIndex = 0;

 

    Status   = EFI_SUCCESS;

    HostName = NULL;

    //

    // SelectOffer contains the IP address configuration and name server configuration.

    // HttpOffer contains the boot file URL.

    //

!   SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp6;

!   if (Private->FilePathUri == NULL) {

!     //

!     // In Corporate environment, we need a HttpOffer.

!     //

!     if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||

!         (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||

!         (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {

!       HttpOffer = SelectOffer;

!     } else {

!       ASSERT (Private->SelectProxyType != HttpOfferTypeMax);

!       ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];

!       HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;

!     }

!     Private->BootFileUriParser = HttpOffer->UriParser;

!     Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;

!   } else {

!     //

!     // In Home environment the BootFileUri comes from the FilePath.

!     //

!     Private->BootFileUriParser = Private->FilePathUriParser;

!     Private->BootFileUri = Private->FilePathUri;

!   }

!

    //

    // Check the URI scheme.

    //

    Status = HttpBootCheckUriScheme (Private->BootFileUri);

    if (EFI_ERROR (Status)) {

      DEBUG ((EFI_D_ERROR, "HttpBootDhcp6ExtractUriInfo: %r.\n", Status));

--- 335,397 ----

    EFI_DHCP6_PACKET_OPTION         *Option;

    EFI_IPv6_ADDRESS                IpAddr;

    CHAR8                           *HostName;

    UINTN                           HostNameSize;

    CHAR16                          *HostNameStr;

    EFI_STATUS                      Status;

!   EFI_IPv6_ADDRESS                *Dns;

!   UINTN                           DataSize;

    ASSERT (Private != NULL);

!   if (!Private->UsingStatic){

!       ASSERT (Private->SelectIndex != 0);

!       SelectIndex = Private->SelectIndex - 1;

!       ASSERT (SelectIndex < HTTP_BOOT_OFFER_MAX_NUM);

!   }

    DnsServerIndex = 0;

+   DataSize = 0;

 

    Status   = EFI_SUCCESS;

    HostName = NULL;

+   Dns = NULL;

+   if (Private->UsingStatic){

+                 //Static HttpBoot supports Home Environment Only.

+         // In Home environment the BootFileUri comes from the FilePath.

+         //

+         Private->BootFileUriParser = Private->FilePathUriParser;

+         Private->BootFileUri = Private->FilePathUri;

+   }else{

+         Dns = NULL;

    //

    // SelectOffer contains the IP address configuration and name server configuration.

    // HttpOffer contains the boot file URL.

    //

!       SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp6;

!       if (Private->FilePathUri == NULL ) {

!         //

!         // In Corporate environment, we need a HttpOffer.

!         //

!         if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||

!             (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||

!             (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {

!           HttpOffer = SelectOffer;

!         } else {

!           ASSERT (Private->SelectProxyType != HttpOfferTypeMax);

!           ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];

!           HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;

!         }

!         Private->BootFileUriParser = HttpOffer->UriParser;

!         Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;

!       } else {

!         //

!         // In Home environment the BootFileUri comes from the FilePath.

!         //

!         Private->BootFileUriParser = Private->FilePathUriParser;

!         Private->BootFileUri = Private->FilePathUri;

!       }

!   }

    //

    // Check the URI scheme.

    //

    Status = HttpBootCheckUriScheme (Private->BootFileUri);

    if (EFI_ERROR (Status)) {

      DEBUG ((EFI_D_ERROR, "HttpBootDhcp6ExtractUriInfo: %r.\n", Status));

***************

*** 391,403 ****

    //

    // Register the IPv6 gateway address to the network device.

    //

    Status = HttpBootSetIp6Gateway (Private);

    if (EFI_ERROR (Status)) {

      return Status;

!   }

 

    if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||

        (SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||

        (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {

      Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];

      ASSERT (Option != NULL);

--- 414,450 ----

    //

    // Register the IPv6 gateway address to the network device.

    //

    Status = HttpBootSetIp6Gateway (Private);

    if (EFI_ERROR (Status)) {

      return Status;

!   }

!   if (Private->UsingStatic){

!          if( Private->DnsServerIp != NULL ){

!       //

!       // Configure the default DNS server if server assigned.

!       //

!

!           DataSize = Private->DnsServerCount * sizeof (EFI_IPv6_ADDRESS);

!           Dns = AllocateZeroPool(DataSize);

!           for (DnsServerIndex = 0;DnsServerIndex < Private->DnsServerCount;DnsServerIndex++)

!               CopyMem(&Dns[DnsServerIndex],&Private->DnsServerIp[DnsServerIndex].v6,sizeof(EFI_IPv6_ADDRESS));        

!           Status = HttpBootSetIp6Dns (

!                      Private,

!                      DataSize,

!                      Dns

!                      );

!           FreePool(Dns);

!           if (EFI_ERROR (Status)) {

!               goto Error;

!           }

!         }

!

!       goto StaticBoot;

!   }

!

  

    if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||

        (SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||

        (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {

      Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];

      ASSERT (Option != NULL);

***************

*** 430,441 ****

--- 477,489 ----

    }

 

    //

    // Extract the HTTP server Ip from URL. This is used to Check route table

    // whether can send message to HTTP Server Ip through the GateWay.

    //

+   StaticBoot:

    Status = HttpUrlGetIp6 (

               Private->BootFileUri,

               Private->BootFileUriParser,

               &IpAddr

               );

 

***************

*** 523,546 ****

  EFI_STATUS

  HttpBootDiscoverBootInfo (

    IN OUT HTTP_BOOT_PRIVATE_DATA   *Private

    )

  {

    EFI_STATUS              Status;

 

    //

    // Start D.O.R.A/S.A.R.R exchange to acquire station ip address and

    // other Http boot information.

    //

    Status = HttpBootDhcp (Private);

    if (EFI_ERROR (Status)) {

      return Status;

    }

 

    if (!Private->UsingIpv6) {

!     Status = HttpBootDhcp4ExtractUriInfo (Private);

    } else {

      Status = HttpBootDhcp6ExtractUriInfo (Private);

    }

 

    return Status;

  }

--- 571,639 ----

  EFI_STATUS

  HttpBootDiscoverBootInfo (

    IN OUT HTTP_BOOT_PRIVATE_DATA   *Private

    )

  {

    EFI_STATUS              Status;

+   EFI_IPv4_ADDRESS        *Dns;

+   UINTN                   DataSize = 0;

+   UINT8                   DnsServerIndex = 0;

 

+   Dns = NULL;

    //

    // Start D.O.R.A/S.A.R.R exchange to acquire station ip address and

    // other Http boot information.

    //

    Status = HttpBootDhcp (Private);

    if (EFI_ERROR (Status)) {

      return Status;

    }

 

    if (!Private->UsingIpv6) {

!       if (!Private->UsingStatic){

!           Status = HttpBootDhcp4ExtractUriInfo (Private);

!       }

!       else{

!         Private->BootFileUriParser = Private->FilePathUriParser;

!         Private->BootFileUri = Private->FilePathUri;

!        

!         if (Private->DnsServerIp != NULL){

!             DataSize = Private->DnsServerCount * sizeof(EFI_IPv4_ADDRESS);

!             Dns = AllocateZeroPool(DataSize);

!             for (DnsServerIndex = 0;DnsServerIndex < Private->DnsServerCount;DnsServerIndex++)

!                 CopyMem(&Dns[DnsServerIndex],&(Private->DnsServerIp[DnsServerIndex].v4),sizeof(EFI_IPv4_ADDRESS));

!            

!             Status = HttpBootRegisterIp4Dns (

!                        Private,

!                        DataSize,

!                        Dns

!                        );

!            

!             FreePool (Dns);

!             if (EFI_ERROR (Status)) {

!               FreePool (Private->DnsServerIp);

!               Private->DnsServerIp = NULL;

!               return Status;

!             }

!         }

!         //

!         // Extract the port from URL, and use default HTTP port 80 if not provided.

!         //

!         Status = HttpUrlGetPort (

!                      Private->BootFileUri,

!                      Private->BootFileUriParser,

!                      &Private->Port

!                      );

!         if (EFI_ERROR (Status) || Private->Port == 0) {

!             Private ->Port = 80;

!         }

!         //

!         // Update the device path to include the IP and boot URI information.

!         //

!         Status = HttpBootUpdateDevicePath (Private);

!       }

    } else {

      Status = HttpBootDhcp6ExtractUriInfo (Private);

    }

 

    return Status;

  }

*** NetworkPkg\HttpBootDxe\HttpBootConfig.c            2020-05-07 22:54:46.000000000 +05-30

--- NetworkPkg\HttpBootDxe\HttpBootConfig.c               2020-08-04 15:28:06.000000000 +05-30

***************

*** 1,6 ****

--- 1,13 ----

+ //***********************************************************************

+ //*                                                                     *

+ //*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ //*                                                                     *

+ //*      All rights reserved. Subject to AMI licensing agreement.       *

+ //*                                                                     *

+ //***********************************************************************

  /** @file

    Helper functions for configuring or getting the parameters relating to HTTP Boot.

 

  Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

 

***************

*** 36,72 ****

    EFI_DEVICE_PATH_PROTOCOL          *NewDevicePath;

    UINTN                             Length;

    CHAR8                             AsciiUri[URI_STR_MAX_SIZE];

    EFI_STATUS                        Status;

    UINTN                             Index;

    EFI_BOOT_MANAGER_LOAD_OPTION      NewOption;

!

    NewDevicePath = NULL;

    Node          = NULL;

    TmpDevicePath = NULL;

 

    if (StrLen (Description) == 0) {

      return EFI_INVALID_PARAMETER;

    }

 

    //

    // Convert the scheme to all lower case.

    //

    for (Index = 0; Index < StrLen (Uri); Index++) {

!     if (Uri[Index] == L':') {

!       break;

!     }

      if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {

        Uri[Index] -= (CHAR16)(L'A' - L'a');

      }

    }

 

    //

!   // Only accept empty URI, or http and https URI.

    //

!   if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)) {

      return EFI_INVALID_PARAMETER;

    }

 

    //

    // Create a new device path by appending the IP node and URI node to

    // the driver's parent device path

--- 43,93 ----

    EFI_DEVICE_PATH_PROTOCOL          *NewDevicePath;

    UINTN                             Length;

    CHAR8                             AsciiUri[URI_STR_MAX_SIZE];

    EFI_STATUS                        Status;

    UINTN                             Index;

    EFI_BOOT_MANAGER_LOAD_OPTION      NewOption;

!   EFI_IP_ADDRESS                    LocalIp;

!   EFI_IP_ADDRESS                    SubnetMask;

!   EFI_IP_ADDRESS                    GatewayIp;

!   CHAR16                            DebugString[URI_STR_MAX_SIZE];

!   CHAR8                             *AsciiUri2;

!  

!   AsciiUri2     = NULL;

    NewDevicePath = NULL;

    Node          = NULL;

    TmpDevicePath = NULL;

 

    if (StrLen (Description) == 0) {

      return EFI_INVALID_PARAMETER;

    }

 

    //

    // Convert the scheme to all lower case.

    //

    for (Index = 0; Index < StrLen (Uri); Index++) {

!       if (Uri[Index] == L'/' && Uri[Index + 1] == L'/') {

!         break;

!       }

!

      if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {

        Uri[Index] -= (CHAR16)(L'A' - L'a');

      }

    }

 

    //

!   // Only accept empty URI, or http , https URI and Static URI.

    //

!

!   if ((StrLen (Uri) != 0) && StrStr(Uri,L"static")){

!       Private->UsingStatic = TRUE;

!   }

!   else{

!       Private->UsingStatic = FALSE;

!   }

!   if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)&& EFI_ERROR(HttpBootCheckStaticUri(Uri)) {

      return EFI_INVALID_PARAMETER;

    }

 

    //

    // Create a new device path by appending the IP node and URI node to

    // the driver's parent device path

***************

*** 77,107 ****

--- 98,159 ----

        Status = EFI_OUT_OF_RESOURCES;

        goto ON_EXIT;

      }

      Node->Ipv4.Header.Type    = MESSAGING_DEVICE_PATH;

      Node->Ipv4.Header.SubType = MSG_IPv4_DP;

      SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));

+     if (Private->UsingStatic){

+         Status = VerifyIpv4Address(Uri,&LocalIp,&SubnetMask,&GatewayIp,DebugString);

+         if (EFI_ERROR(Status))

+             return Status;

+         CopyMem (&Node->Ipv4.LocalIpAddress, &LocalIp.v4, sizeof (EFI_IPv4_ADDRESS));

+         Node->Ipv4.RemotePort      = Private->Port;

+         Node->Ipv4.Protocol        = EFI_IP_PROTO_TCP;

+         Node->Ipv4.StaticIpAddress = TRUE;

+         CopyMem (&Node->Ipv4.GatewayIpAddress, &GatewayIp.v4, sizeof (EFI_IPv4_ADDRESS));

+         CopyMem (&Node->Ipv4.SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS));

+     }

    } else {

      Node = AllocateZeroPool (sizeof (IPv6_DEVICE_PATH));

      if (Node == NULL) {

        Status = EFI_OUT_OF_RESOURCES;

        goto ON_EXIT;

      }

      Node->Ipv6.Header.Type     = MESSAGING_DEVICE_PATH;

      Node->Ipv6.Header.SubType  = MSG_IPv6_DP;

      SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));

+     if (Private->UsingStatic){

+         Status = VerifyIpv6Address (Uri,&LocalIp,&GatewayIp,DebugString);

+         if (EFI_ERROR(Status))

+             return Status;

+         Node->Ipv6.PrefixLength    = IP6_PREFIX_LENGTH;

+         Node->Ipv6.RemotePort      = Private->Port;

+         Node->Ipv6.Protocol        = EFI_IP_PROTO_TCP;

+         Node->Ipv6.IpAddressOrigin = 0x03;

+         CopyMem (&Node->Ipv6.LocalIpAddress, &LocalIp.v6 , sizeof (EFI_IPv6_ADDRESS));

+         CopyMem (&Node->Ipv6.GatewayIpAddress, &GatewayIp.v6, sizeof (EFI_IPv6_ADDRESS));

+     }

    }

    TmpDevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);

    FreePool (Node);

    if (TmpDevicePath == NULL) {

      return EFI_OUT_OF_RESOURCES;

    }

    //

    // Update the URI node with the input boot file URI.

    //

    UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));

+   //Extract Bootfile uri from Static Uri.

+   if ((Private->UsingStatic  && (AsciiStrStr(AsciiUri,"dns") == NULL))||( AsciiStrStr(AsciiUri,"dhcp"))){

+     AsciiUri2 = AsciiStrStr (AsciiUri ,"http");

+     if (AsciiUri2 != NULL){

+         for (Index =0;AsciiUri2[Index] != ')' && AsciiUri2[Index] != '\0'  ;Index++);

+         AsciiUri2[Index] = '\0';

+         AsciiStrCpy(AsciiUri,AsciiUri2);

+    }

+   }

    Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);

    Node = AllocatePool (Length);

    if (Node == NULL) {

      Status = EFI_OUT_OF_RESOURCES;

      FreePool (TmpDevicePath);

      goto ON_EXIT;

***************

*** 483,494 ****

--- 535,551 ----

          return EFI_OUT_OF_RESOURCES;

        }

 

        UnicodeStrToAsciiStrS (Uri, AsciiUri, UriLen);

 

        Status = HttpBootCheckUriScheme (AsciiUri);

+       if (Status == EFI_INVALID_PARAMETER){

+           Status = HttpBootCheckStaticUri(Uri);

+           if (Status == EFI_UNSUPPORTED)

+               return EFI_INVALID_PARAMETER;

+       }

 

        if (Status == EFI_INVALID_PARAMETER) {

 

          DEBUG ((EFI_D_ERROR, "HttpBootFormCallback: %r.\n", Status));

 

          CreatePopUp (

*** NetworkPkg\HttpBootDxe\HttpBootDxe.h 2020-05-07 22:54:46.000000000 +05-30

--- NetworkPkg\HttpBootDxe\HttpBootDxe.h   2020-08-09 21:00:21.000000000 +05-30

***************

*** 1,6 ****

--- 1,13 ----

+ //***********************************************************************

+ //*                                                                     *

+ //*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ //*                                                                     *

+ //*      All rights reserved. Subject to AMI licensing agreement.       *

+ //*                                                                     *

+ //***********************************************************************

  /** @file

    UEFI HTTP boot driver's private data structure and interfaces declaration.

 

  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>

  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

***************

*** 254,265 ****

--- 261,273 ----

    UINT32                                    SelectIndex;

    UINT32                                    SelectProxyType;

    HTTP_BOOT_DHCP_PACKET_CACHE               OfferBuffer[HTTP_BOOT_OFFER_MAX_NUM];

    UINT32                                    OfferNum;

    UINT32                                    OfferCount[HttpOfferTypeMax];

    UINT32                                    OfferIndex[HttpOfferTypeMax][HTTP_BOOT_OFFER_MAX_NUM];

+   BOOLEAN                                   UsingStatic;

  };

 

  #define HTTP_BOOT_PRIVATE_DATA_SIGNATURE          SIGNATURE_32 ('H', 'B', 'P', 'D')

  #define HTTP_BOOT_VIRTUAL_NIC_SIGNATURE           SIGNATURE_32 ('H', 'B', 'V', 'N')

  #define HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE(a)   CR (a, HTTP_BOOT_PRIVATE_DATA, LoadFile, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)

  #define HTTP_BOOT_PRIVATE_DATA_FROM_ID(a)         CR (a, HTTP_BOOT_PRIVATE_DATA, Id, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)

***************

*** 518,524 ****

--- 526,665 ----

  HttpBootIp6DxeDriverBindingStop (

    IN EFI_DRIVER_BINDING_PROTOCOL  *This,

    IN EFI_HANDLE                   ControllerHandle,

    IN UINTN                        NumberOfChildren,

    IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL

    );

+ /**

+   Configure Static Ip Address using Ipconfig2 Protocol

+

+   @param[in]  Private             Pointer to HTTP boot driver private data.

+ **/

+ EFI_STATUS

+ StaticHttpBoot(HTTP_BOOT_PRIVATE_DATA        *Private);

+ /**

+   Get the IPv4 Address and Ipv6 Address   from the Input Devicepath.

+

+

+   @param[in]   FilePath         Pointer to the device path which contains IPV4 and IPV6 path node.

+

+   @retval EFI_SUCCESS            The IPV4 Address and IPV6 Address successfully assigned to Private variable 

+           EFI_INVALID_PARAMETER   If FilePath is Null

+           EFI_NOT_FOUND          If IPV4Address can't be found

+ **/

+ EFI_STATUS

+ HttpBootParseIpAddress (

+   IN     EFI_DEVICE_PATH_PROTOCOL     *FilePath,

+   IN HTTP_BOOT_PRIVATE_DATA         *Private

+   );

+ /******

+   Get the IPv6Address,GatewayIp6Address using Http Uri given by user,

+   IPV6(LocalIp6Address,Tcp,static or dhcp,gatewayip6Address)/Dns(IP1,IP2,...,IPn)/Uri(_http://DomainName/xxx.efi)

+

+   @param[in]  Buffer                  URI string of the boot file.

+   @param[out] LocalIp                 Ipv6 LocalIp Address is updated statically based on Uri

+   @param[out] GatewayIp               Ipv6  GatewayIp is updated statically based on Uri

+   @Param[out] String                  The Error Message.

+  

+   @retval EFI_SUCCESS                 IP Address is translated from String.

+   @retval EFI_INVALID_PARAMETER                      Url is not supported http and https

+           EFI_UNSUPPORTED             If IP Address is Invalid and Static Uri is invalid

+ *******/

+ EFI_STATUS

+ VerifyIpv6Address (

+       IN   CHAR16                                               *Buffer,

+       OUT  EFI_IP_ADDRESS          *LocalIp,

+       OUT  EFI_IP_ADDRESS          *GatewayIp,

+       OUT  CHAR16                                            *String 

+               );

+ /*********

+   Get the IPv4Address,subnetMask,GatewayIp using Http Uri given by user,

+   IPV4(ClientAddress,protocol,static or Dhcp,gatewayip,subnetMask)/Dns(DnsIP1,DnsIP2...,IPn)/Uri(_http://DomainName/xxx.efi)

+

+   @param[in]  Uri                   The URI string of the boot file.

+   @param[out] LocalIP                    Ipv4 LocalP is updated statically based on Uri

+   @param[out] SubnetMask            Ipv4 SubnetMask is updated statically based on Uri

+   @param[out] GatewayIp             Ipv4  GatewayIp is updated statically based on Uri

+   @Param[out] String                The Error Message.

+  

+   @retval EFI_SUCCESS               IP Address is translated from String.

+   @retval EFI_INVALID_PARAMETER     Url is not supported http and https

+           EFI_UNSUPPORTED           If IP Addrress and static Uri is invalid

+ ********/

+ EFI_STATUS

+ VerifyIpv4Address (

+         IN   CHAR16                                             *Buffer,

+                             OUT  EFI_IP_ADDRESS     *LocalIp,

+         OUT  EFI_IP_ADDRESS       *SubnetMask,

+         OUT  EFI_IP_ADDRESS       *GatewayIp,

+         OUT  CHAR16                                                         *String

+                             );

+ /******

+ This function checks static Uri given by user.

+

+ @param[in]  Buffer               The URI string of the boot file.

+

+ @retval EFI_SUCCESS                Uri and static IP address are valid.

+         EFI_UNSUPPORTED            Static Uri is invalid Format.

+                             EFI_INVALID_PARAMETER      Url is not supported http and https.

+ *******/

+ EFI_STATUS

+ HttpBootCheckStaticUri(IN CHAR16 *Uri);

+ /**

+   Configure Static IPv6 Address using Ip6config Protocol

+

+   @param[in]  Private             Pointer to HTTP boot driver private data.

+ **/

+ EFI_STATUS StaticHttpIPv6Boot (HTTP_BOOT_PRIVATE_DATA        *Private);

+

+ /**

+   This function will register the IPv4 gateway address to the network device.

+

+   @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.

+

+   @retval     EFI_SUCCESS         The new IP configuration has been configured successfully.

+   @retval     Others              Failed to configure the address.

+

+ **/

+ EFI_STATUS

+ HttpBootRegisterIp4Gateway (

+   IN HTTP_BOOT_PRIVATE_DATA         *Private

+   );

+ /**

+   This function will switch the IP4 configuration policy to Static.

+

+   @param[in]  Private             Pointer to HTTP boot driver private data.

+

+   @retval     EFI_SUCCESS         The policy is already configured to static.

+   @retval     Others              Other error as indicated..

+

+ **/

+ EFI_STATUS

+ HttpBootSetIp4Policy (

+   IN HTTP_BOOT_PRIVATE_DATA         *Private

+   );

+ /**

+   Checks the HttpBoot Mode is static or Dhcp  from the Input Devicepath.

+   And Update Private variable private->usingstatic

+

+

+   @param[in]   FilePath         Pointer to the device path which contains a IPV4 and IPv6 device path node.

+

+   @retval EFI_SUCCESS            The IPV4 Address  and IPv6 Address are successfully assigned to Private variable 

+           EFI_INVALID_PARAMETER   If FilePath is Null

+ **/

+ EFI_STATUS

+ HttpBootCheckBootType (IN     EFI_DEVICE_PATH_PROTOCOL     *FilePath,IN HTTP_BOOT_PRIVATE_DATA         *Private);

+ /**

+   Get the IPv4 and IPv6 Dns Address from Input Uri

+

+

+   @param[in]   Uri               Input Uri from Filepath

+   @param[in]   UsingIPv6         Specifies the type of IP addresses.

+   @param[in]   Private           The pointer to the driver's private data.

+

+   @retval EFI_SUCCESS            The IPV4 Address  and IPv6 Address are successfully assigned to HTTP boot driver private data.

+           EFI_INVALID_PARAMETER   If Uri is not a valid Static Devicepath URI

+ **/

+ EFI_STATUS

+ HttpBootParseDnsIp(IN CHAR8  *Uri,BOOLEAN UsingIpv6,IN HTTP_BOOT_PRIVATE_DATA         *Private);

  #endif

*** NetworkPkg\HttpBootDxe\HttpBootDxe.inf              2020-05-07 22:54:46.000000000 +05-30

--- NetworkPkg\HttpBootDxe\HttpBootDxe.inf 2020-07-24 16:19:43.000000000 +05-30

***************

*** 1,6 ****

--- 1,15 ----

+

+ #***********************************************************************

+ #*                                                                     *

+ #*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ #*                                                                     *

+ #*      All rights reserved. Subject to AMI licensing agreement.       *

+ #*                                                                     *

+ #***********************************************************************

+

  ## @file

  #  This modules produce the Load File Protocol for UEFI HTTP boot.

  #

  #  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>

  #  SPDX-License-Identifier: BSD-2-Clause-Patent

  #

***************

*** 38,49 ****

--- 47,59 ----

    HttpBootSupport.h

    HttpBootSupport.c

    HttpBootClient.h

    HttpBootClient.c

    HttpBootConfigVfr.vfr

    HttpBootConfigStrings.uni

+   HttpBootStatic.c

 

  [LibraryClasses]

    UefiDriverEntryPoint

    UefiBootServicesTableLib

    MemoryAllocationLib

    BaseLib

*** NetworkPkg\HttpBootDxe\HttpBootImpl.c                2020-05-07 22:54:46.000000000 +05-30

--- NetworkPkg\HttpBootDxe\HttpBootImpl.c   2020-08-09 20:08:53.000000000 +05-30

***************

*** 1,6 ****

--- 1,14 ----

+ //***********************************************************************

+ //*                                                                     *

+ //*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ //*                                                                     *

+ //*      All rights reserved. Subject to AMI licensing agreement.       *

+ //*                                                                     *

+ //***********************************************************************

+

  /** @file

    The implementation of EFI_LOAD_FILE_PROTOCOL for UEFI HTTP boot.

 

  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>

  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

***************

*** 119,139 ****

 

    Uri = NULL;

 

    if (Private == NULL || FilePath == NULL) {

      return EFI_INVALID_PARAMETER;

    }

!

    //

    // Check the URI in the input FilePath, in order to see whether it is

    // required to boot from a new specified boot file.

    //

    Status = HttpBootParseFilePath (FilePath, &Uri);

    if (EFI_ERROR (Status)) {

      return EFI_INVALID_PARAMETER;

!   }

 

    //

    // Check whether we need to stop and restart the HTTP boot driver.

    //

    if (Private->Started) {

      //

--- 127,158 ----

 

    Uri = NULL;

 

    if (Private == NULL || FilePath == NULL) {

      return EFI_INVALID_PARAMETER;

    }

!   //

!   // Check  If HttpBoot get IP Address from user as statically or from dhcp in the input FilePath,

    //

+   Status = HttpBootCheckBootType(FilePath,Private);

+   if (EFI_ERROR (Status)) {

+             return EFI_INVALID_PARAMETER;

+   }

    // Check the URI in the input FilePath, in order to see whether it is

    // required to boot from a new specified boot file.

    //

    Status = HttpBootParseFilePath (FilePath, &Uri);

    if (EFI_ERROR (Status)) {

      return EFI_INVALID_PARAMETER;

!   }

!  

!   if (Private->UsingStatic){

!         Status = HttpBootParseDnsIp(Uri,UsingIpv6,Private);

!         if (EFI_ERROR(Status))

!             return Status;

!     }

 

    //

    // Check whether we need to stop and restart the HTTP boot driver.

   //

    if (Private->Started) {

      //

***************

*** 161,173 ****

        if (Uri != NULL) {

          FreePool (Uri);

        }

        return EFI_ALREADY_STARTED;

      }

    }

!

    //

    // Detect whether using ipv6 or not, and set it to the private data.

    //

    if (UsingIpv6 && Private->Ip6Nic != NULL) {

      Private->UsingIpv6 = TRUE;

    } else if (!UsingIpv6 && Private->Ip4Nic != NULL) {

--- 180,201 ----

        if (Uri != NULL) {

          FreePool (Uri);

        }

        return EFI_ALREADY_STARTED;

      }

    }

!  

!   //Check the IP Address in the input FilePath and

!   //update the Ip Address to Private Data

!   //

!   if (Private->UsingStatic){

!       Status = HttpBootParseIpAddress (FilePath,Private);

!       if (EFI_ERROR (Status)) {

!           return Status;

!       }

!   }

    //

    // Detect whether using ipv6 or not, and set it to the private data.

    //

    if (UsingIpv6 && Private->Ip6Nic != NULL) {

      Private->UsingIpv6 = TRUE;

    } else if (!UsingIpv6 && Private->Ip4Nic != NULL) {

***************

*** 196,215 ****

--- 224,245 ----

      }

    }

 

    //

    // Init the content of cached DHCP offer list.

    //

+ if(!Private->UsingStatic){

    ZeroMem (Private->OfferBuffer, sizeof (Private->OfferBuffer));

    if (!Private->UsingIpv6) {

      for (Index = 0; Index < HTTP_BOOT_OFFER_MAX_NUM; Index++) {

        Private->OfferBuffer[Index].Dhcp4.Packet.Offer.Size = HTTP_CACHED_DHCP4_PACKET_MAX_SIZE;

      }

    } else {

      for (Index = 0; Index < HTTP_BOOT_OFFER_MAX_NUM; Index++) {

        Private->OfferBuffer[Index].Dhcp6.Packet.Offer.Size = HTTP_CACHED_DHCP6_PACKET_MAX_SIZE;

+     }

      }

    }

 

    if (Private->UsingIpv6) {

      //

      // Set Ip6 policy to Automatic to start the Ip6 router discovery.

***************

*** 252,274 ****

      return EFI_NOT_STARTED;

    }

 

    Status = EFI_DEVICE_ERROR;

 

    if (!Private->UsingIpv6) {

!     //

      // Start D.O.R.A process to get a IPv4 address and other boot information.

      //

!     Status = HttpBootDhcp4Dora (Private);

    } else {

!      //

      // Start S.A.R.R process to get a IPv6 address and other boot information.

      //

!     Status = HttpBootDhcp6Sarr (Private);

!   }

!

    return Status;

  }

 

  /**

    Attempt to download the boot file through HTTP message exchange.

 

--- 282,332 ----

      return EFI_NOT_STARTED;

    }

 

    Status = EFI_DEVICE_ERROR;

 

    if (!Private->UsingIpv6) {

!   

!     if (!Private->UsingStatic) {

!               //

      // Start D.O.R.A process to get a IPv4 address and other boot information.

      //

!         Status = HttpBootDhcp4Dora (Private);

!    }else{

!       Status = HttpBootSetIp4Policy (Private);

!       if (EFI_ERROR (Status)) {

!         return Status;

!       }

!       Status = StaticHttpBoot(Private);

!       if (EFI_ERROR (Status)) {

!           return Status;

!        }

!       Status = HttpBootRegisterIp4Gateway (Private);

!       if (EFI_ERROR (Status)) {

!           return Status;

!        }

!

!       AsciiPrint ("\n  Station IP address is ");

!       HttpBootShowIp4Addr (&Private->StationIp.v4);

!       AsciiPrint ("\n");

!     }

!    

    } else {

!     

!     if (!Private->UsingStatic){

!              //

      // Start S.A.R.R process to get a IPv6 address and other boot information.

      //

!         Status = HttpBootDhcp6Sarr (Private);

!     }else{

!         Status = StaticHttpIPv6Boot (Private);

!         AsciiPrint ("\n  Station IPv6 address is ");

!         HttpBootShowIp6Addr (&Private->StationIp.v6);

!         AsciiPrint ("\n");

!     }

!   }

    return Status;

  }

 

  /**

    Attempt to download the boot file through HTTP message exchange.

 

***

--- NetworkPkg\HttpBootDxe\HttpBootStatic.c 2020-08-09 21:00:09.000000000 +05-30

***************

*** 0 ****

--- 1,650 ----

+ //***********************************************************************

+ //*                                                                     *

+ //*   Copyright (c) 1985-2020, American Megatrends International LLC.   *

+ //*                                                                     *

+ //*      All rights reserved. Subject to AMI licensing agreement.       *

+ //*                                                                     *

+ //***********************************************************************

+

+ /** @file HttpBootStatic.c  

+ Provides the Static Http Boot related functions .

+

+ Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>

+ (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+ **/

+

+

+ #include "HttpBootDxe.h"

+ #include <Library/UefiBootManagerLib.h>

+

+

+ /**

+   Get the IPv4 and IPv6 Address  from the Input Devicepath.

+

+

+   @param[in]   FilePath         Pointer to the device path which contains a IPV4 and IPV6 device path node.

+

+   @retval EFI_SUCCESS            The IPV4 Address  and IPv6 Address are successfully assigned to Private variable 

+           EFI_INVALID_PARAMETER   If FilePath is Null

+ **/

+ EFI_STATUS

+ HttpBootParseIpAddress (

+   IN     EFI_DEVICE_PATH_PROTOCOL     *FilePath,

+   IN HTTP_BOOT_PRIVATE_DATA         *Private

+   )

+ {

+   EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;

+   EFI_DEV_PATH                      *Node;

+

+   if (FilePath == NULL) {

+     return EFI_INVALID_PARAMETER;

+   }

+   

+   ZeroMem (&Private->StationIp, sizeof (EFI_IP_ADDRESS));

+   ZeroMem (&Private->SubnetMask,  sizeof (EFI_IP_ADDRESS));

+   ZeroMem (&Private->GatewayIp, sizeof (EFI_IP_ADDRESS));

+   //

+   // Extract the IPV4 address from the FilePath

+   //

+  

+   TempDevicePath = FilePath;

+   while (!IsDevicePathEnd (TempDevicePath)) {

+      

+    if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&

+            (DevicePathSubType (TempDevicePath) == MSG_IPv4_DP)) {

+       Node = ( EFI_DEV_PATH *)TempDevicePath;

+      

+       CopyMem (&Private->StationIp.v4, &Node->Ipv4.LocalIpAddress, sizeof (EFI_IPv4_ADDRESS));

+       CopyMem (&Private->SubnetMask.v4, &Node->Ipv4.SubnetMask , sizeof (EFI_IPv4_ADDRESS));

+       CopyMem (&Private->GatewayIp.v4, &Node->Ipv4.GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS));

+    }

+    else if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&

+                 (DevicePathSubType (TempDevicePath) == MSG_IPv6_DP)) {

+          Node = (EFI_DEV_PATH *)TempDevicePath ;

+          CopyMem (&Private ->StationIp.v6,&Node ->Ipv6.LocalIpAddress,sizeof (EFI_IPv6_ADDRESS));

+          CopyMem (&Private ->GatewayIp.v6,&Node ->Ipv6.GatewayIpAddress,sizeof (EFI_IPv6_ADDRESS));

+      }

+   

+     TempDevicePath = NextDevicePathNode (TempDevicePath);

+   }

+

+   return EFI_SUCCESS;

+ }

+

+ /**

+   The notify function of create event when performing a manual config.

+

+   @param[in]    Event        The event this notify function registered to.

+   @param[in]    Context      Pointer to the context data registered to the event.

+

+ **/

+ VOID

+ EFIAPI

+ IfConfigManualAddressNotify (

+   IN EFI_EVENT    Event,

+   IN VOID         *Context

+   )

+ {

+     *((BOOLEAN *) Context) = TRUE;

+ }

+ /**

+   Configure Static Ip Address using Ip4config2 Protocol

+

+   @param[in]  Private             Pointer to HTTP boot driver private data.

+ **/

+ EFI_STATUS

+ StaticHttpBoot (HTTP_BOOT_PRIVATE_DATA        *Private)

+ {

+     EFI_EVENT                        MappedEvt;

+     BOOLEAN                          IsAddressOk;

+     EFI_IP4_CONFIG2_POLICY           Policy;

+     EFI_IP4_CONFIG2_MANUAL_ADDRESS   ManualAddress;

+     EFI_STATUS                       Status;

+     UINTN                            DataSize ;

+     EFI_IP4_CONFIG2_PROTOCOL         *IfCfg ;

+     EFI_EVENT                        TimeOutEvt ;

+     //

+     // Create events & timers for asynchronous settings.

+     //

+     CopyMem (&ManualAddress.Address , &Private->StationIp.v4, sizeof (EFI_IPv4_ADDRESS));

+     CopyMem (&ManualAddress.SubnetMask , &Private ->SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS));

+

+    

+     Status = gBS->CreateEvent (

+                     EVT_TIMER,

+                     TPL_CALLBACK,

+                     NULL,

+                     NULL,

+                     &TimeOutEvt

+                     );

+     if (EFI_ERROR(Status))

+         return Status;

+    

+     Status = gBS->CreateEvent (

+                 EVT_NOTIFY_SIGNAL,

+                 TPL_NOTIFY,

+                 IfConfigManualAddressNotify,

+                 &IsAddressOk,

+                 &MappedEvt

+                 );

+     if (EFI_ERROR(Status))

+         return Status;

+

+     IfCfg  = Private->Ip4Config2; 

+     Status = IfCfg->RegisterDataNotify (

+                             IfCfg,

+                             Ip4Config2DataTypeManualAddress,

+                             MappedEvt

+                             );

+     if (EFI_ERROR(Status))

+         return Status;

+     Policy = Ip4Config2PolicyStatic;

+     Status = IfCfg->SetData (

+                             IfCfg,

+                             Ip4Config2DataTypePolicy,

+                             sizeof (EFI_IP4_CONFIG2_POLICY),

+                             &Policy

+                             );

+                                                                                                            

+ if (EFI_ERROR(Status))

+         return Status;

+     DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);

+    

+     Status = IfCfg->SetData (

+                           IfCfg,

+                           Ip4Config2DataTypeManualAddress,

+                           DataSize,

+                           &ManualAddress

+                           );

+     if (Status == EFI_NOT_READY) {

+         gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);

+         while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {

+             if (IsAddressOk) {

+                 Status = EFI_SUCCESS;

+                 break;

+       }

+     }

+     }

+

+     Status = IfCfg->UnregisterDataNotify (

+                  IfCfg,

+                  Ip4Config2DataTypeManualAddress,

+                  MappedEvt

+                  );

+    

+     return Status;

+ }                   

+

+ /**

+   The notify function of create event when performing a manual config.

+

+   @param[in]    Event        The event this notify function registered to.

+   @param[in]    Context      Pointer to the context data registered to the event.

+

+ **/

+ VOID

+ EFIAPI

+ IfConfig6ManualAddressNotify (

+   IN EFI_EVENT    Event,

+   IN VOID         *Context

+   )

+ {

+   *((BOOLEAN *) Context) = TRUE;

+ }

+ /**

+   Configure Static Ipv6 Address using Ip6config Protocol

+

+   @param[in]  Private             Pointer to HTTP boot driver private data.

+ **/

+

+ EFI_STATUS

+ StaticHttpIPv6Boot (HTTP_BOOT_PRIVATE_DATA        *Private)

+ {

+     EFI_STATUS                       Status;

+     EFI_IP6_CONFIG_PROTOCOL          *IfCfg;

+             EFI_IP6_CONFIG_MANUAL_ADDRESS    CfgManAddr;

+             UINT32                           CurDadXmits;

+             UINTN                            CurDadXmitsLen;

+             EFI_IP6_CONFIG_POLICY            Policy;

+             EFI_EVENT                        TimeOutEvt;

+             EFI_EVENT                        MappedEvt;

+             BOOLEAN                          IsAddressOk;

+    

+              // Set static host ip6 address list.

+              //   This is a asynchronous process.

+              //

+             CopyMem (&CfgManAddr.Address,&Private->StationIp.v6,sizeof(EFI_IPv6_ADDRESS));

+             CfgManAddr.PrefixLength = IP6_PREFIX_LENGTH;

+             CfgManAddr.IsAnycast = FALSE ;

+            

+             IsAddressOk = FALSE;

+             IfCfg  = Private->Ip6Config;

+             Status = gBS->CreateEvent (

+                              EVT_TIMER,

+                              TPL_CALLBACK,

+                              NULL,

+                              NULL,

+                              &TimeOutEvt

+                              );

+             if (EFI_ERROR(Status))

+                             return Status;

+     

+     Status = gBS->CreateEvent (

+                  EVT_NOTIFY_SIGNAL,

+                  TPL_NOTIFY,

+                  IfConfig6ManualAddressNotify,

+                  &IsAddressOk,

+                  &MappedEvt

+                  );

+     if (EFI_ERROR(Status))

+             return Status;

+

+             Status = IfCfg->RegisterDataNotify (

+                                  IfCfg,

+                                  Ip6ConfigDataTypeManualAddress,

+                                  MappedEvt

+                                  );

+             if (EFI_ERROR (Status)) {

+                             return Status;

+             }

+            

+             Policy = Ip6ConfigPolicyManual;

+             Status = IfCfg->SetData (

+                                  IfCfg,

+                                  Ip6ConfigDataTypePolicy,

+                                  sizeof (EFI_IP6_CONFIG_POLICY),

+                                  &Policy

+                                  );

+             if (EFI_ERROR (Status)) {

+              goto ON_EXIT;

+                   }

+         

+             Status = IfCfg->SetData (

+                                  IfCfg,

+                                  Ip6ConfigDataTypeManualAddress,

+                                  sizeof(EFI_IP6_CONFIG_MANUAL_ADDRESS),

+                                  &CfgManAddr

+                                  );

+         

+

+             if (Status == EFI_NOT_READY) {

+             //

+             // Get current dad transmits count.

+             //

+             CurDadXmitsLen = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);

+             Status = IfCfg->GetData (

+                           IfCfg,

+                           Ip6ConfigDataTypeDupAddrDetectTransmits,

+                           &CurDadXmitsLen,

+                           &CurDadXmits

+                           );

+             if (EFI_ERROR (Status)) {

+               goto ON_EXIT;

+             }

+

+             gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000 + 10000000 * CurDadXmits);

+

+             while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {

+                             if (IsAddressOk) {

+                             Status = EFI_SUCCESS;

+                             break;

+                             }

+             }

+             }

+

+             Status = IfCfg->SetData (

+                                     IfCfg,

+                                     Ip6ConfigDataTypeGateway,

+                                     sizeof(EFI_IPv6_ADDRESS),

+                                     &Private->GatewayIp.v6

+                                     );

+             if (EFI_ERROR (Status)) {

+                             goto ON_EXIT;

+             }

+

+ ON_EXIT:

+

+             Status = IfCfg->UnregisterDataNotify (

+                        IfCfg,

+                         Ip6ConfigDataTypeManualAddress,

+                         MappedEvt

+                         );

+

+             if (EFI_ERROR (Status)) {

+                             return Status;

+             }

+             return Status;

+             

+ }

+ /*********

+   Get the IPv4Address,subnetMask,GatewayIp using Http Uri given by user,

+   IPV4(ClientAddress,protocol,static or Dhcp ,gatewayip,subnetMask)/Dns(DnsIP1,DnsIP2...,IPn)/Uri(_http://DomainName/xxx.efi)

+

+   @param[in]  Uri                   The URI string of the boot file.

+   @param[out] LocalIP                    Ipv4 LocalP is updated statically based on Uri

+   @param[out] SubnetMask            Ipv4 SubnetMask is updated statically based on Uri

+   @param[out] GatewayIp             Ipv4  GatewayIp is updated statically based on Uri

+   @Param[out] String                The Error Message.

+  

+   @retval EFI_SUCCESS               IP Address is translated from String.

+   @retval EFI_INVALID_PARAMETER     Url is not supported http and https

+           EFI_UNSUPPORTED           If IP Addrress and static Uri is invalid

+ ********/

+ EFI_STATUS

+ VerifyIpv4Address (

+         IN   CHAR16             *Buffer,

+         OUT  EFI_IP_ADDRESS     *LocalIp,

+         OUT  EFI_IP_ADDRESS     *SubnetMask,

+         OUT  EFI_IP_ADDRESS     *GatewayIp,

+         OUT  CHAR16             *String

+         )

+ {

+     CHAR16                        *EndPointer;

+     RETURN_STATUS                  Status;

+     EFI_IPv4_ADDRESS               Dns;

+     CHAR8                         AsciiUri[URI_STR_MAX_SIZE];

+    

+     if (StrnCmp (Buffer ,L"ipv4(",5)){

+         StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+         return EFI_UNSUPPORTED;

+     }

+     Buffer +=StrLen(L"ipv4(");

+     Status = StrToIpv4Address (Buffer, &EndPointer,&LocalIp->v4,NULL);

+     if (RETURN_ERROR (Status)){

+         StrCpyS (String ,URI_STR_MAX_SIZE,L"Invalid LocalIP address!");

+         return EFI_UNSUPPORTED;

+     }

+     Buffer = EndPointer;

+     if (StrnCmp(Buffer,L",tcp,static,",12 ) && StrnCmp(Buffer,L",tcp,dhcp,",10 )){

+         StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+         return EFI_UNSUPPORTED;

+     }

+     if (StrnCmp(Buffer,L",tcp,dhcp,",10))

+         Buffer +=StrLen(L",tcp,static,");

+     else

+         Buffer +=StrLen(L",tcp,dhcp,");

+    

+     Status = StrToIpv4Address (Buffer,&EndPointer, &GatewayIp->v4,NULL);

+     if (RETURN_ERROR(Status)) {

+         StrCpyS (String ,URI_STR_MAX_SIZE,L"Invalid GatewayIP Address!");

+         return EFI_UNSUPPORTED;

+     }

+     Buffer = EndPointer + 1;

+     Status = StrToIpv4Address (Buffer,&EndPointer, &SubnetMask->v4,NULL);

+     if (RETURN_ERROR(Status)) {

+         StrCpyS (String ,URI_STR_MAX_SIZE,L"Invalid SubnetMask Address!");

+         return EFI_UNSUPPORTED;

+     }

+     Buffer = EndPointer;

+     if (StrnCmp(Buffer,L")/uri(",6) && StrnCmp(Buffer,L")/dns(",6)){

+         StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+         return EFI_UNSUPPORTED;

+     }

+     if (!StrnCmp(Buffer,L")/dns(",6))

+     {

+         Buffer += StrLen(L")/dns(");

+         do{

+             Status  = StrToIpv4Address (Buffer,&EndPointer, &Dns,NULL);

+             if (RETURN_ERROR(Status)) {

+                StrCpyS (String ,URI_STR_MAX_SIZE,L"Invalid DnsServerIP Address!");

+                return EFI_UNSUPPORTED;

+              }

+             Buffer = EndPointer +1;

+         }while(*EndPointer == L',');  

+     }

+     if (!StrnCmp (Buffer,L"}/uri(",6)){

+         Buffer +=StrLen(L")/uri(");

+         UnicodeStrToAsciiStrS (Buffer, AsciiUri, URI_STR_MAX_SIZE);

+         Status = HttpBootCheckUriScheme (AsciiUri);

+         return Status;

+     }

+        

+     return EFI_SUCCESS;

+ }

+

+ /******

+   Get the IPv6Address,GatewayIp6Address using Http Uri given by user,

+   IPV6(LocalIp6Address,Tcp,static or dhcp,gatewayip6Address)/Dns(IP1,IP2,...,IPn)/Uri(_http://DomainName/xxx.efi)

+

+   @param[in]  Buffer                  URI string of the boot file.

+   @param[out] LocalIp                 Ipv6 LocalIp Address is updated statically based on Uri

+   @param[out] GatewayIp               Ipv6  GatewayIp is updated statically based on Uri

+   @Param[out] String                  The Error Message.

+  

+   @retval EFI_SUCCESS                 IP Address is translated from String.

+   @retval EFI_INVALID_PARAMETER                      Url is not supported http and https

+           EFI_UNSUPPORTED             If IP Address is Invalid and Static Uri is invalid

+ *******/

+ EFI_STATUS

+ VerifyIpv6Address (

+       IN   CHAR16                                               *Buffer,

+       OUT  EFI_IP_ADDRESS         *LocalIp,

+       OUT  EFI_IP_ADDRESS         *GatewayIp,

+       OUT  CHAR16                                           *String 

+               )

+ {

+    

+     CHAR16                        *EndPointer;

+     RETURN_STATUS                  Status;

+     EFI_IPv6_ADDRESS                 Dns;

+     CHAR8                         AsciiUri[URI_STR_MAX_SIZE];

+    

+     if (StrnCmp (Buffer ,L"ipv6(",5)){

+         StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+         return EFI_UNSUPPORTED;

+     }

+     Buffer += StrLen (L"ipv6(");

+     Status = StrToIpv6Address (Buffer, &EndPointer,&LocalIp->v6,NULL);

+     if (RETURN_ERROR (Status)){

+       StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid LocalIP address!");

+       return EFI_UNSUPPORTED;

+     }

+     Buffer = EndPointer;

+     if (StrnCmp(Buffer,L",tcp,static,",12) && StrnCmp(Buffer,L",tcp,dhcp,",10)){

+       StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+       return EFI_UNSUPPORTED;

+     }

+     if (StrnCmp(Buffer,L",tcp,dhcp,",10))

+         Buffer +=StrLen(L",tcp,static,");

+     else

+         Buffer +=StrLen(L",tcp,dhcp,");

+    

+     Status = StrToIpv6Address (Buffer,&EndPointer, &GatewayIp->v6,NULL);

+     if (RETURN_ERROR (Status) ) {

+       StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid GatewayIP Address!");

+       return EFI_UNSUPPORTED;

+     }

+     Buffer = EndPointer;

+     if (StrnCmp(Buffer,L")/uri(",6) && StrnCmp(Buffer,L")/dns(",6)){

+         StrCpyS (String ,URI_STR_MAX_SIZE, L"Invalid Uri Format!");

+         return EFI_UNSUPPORTED;

+     }

+     if (!StrnCmp(Buffer,L")/dns(",6))

+     {

+         Buffer += StrLen(L")/dns(");

+         do{

+             Status  = StrToIpv6Address (Buffer,&EndPointer, &Dns,NULL);

+             if (RETURN_ERROR(Status)) {

+                StrCpyS (String ,URI_STR_MAX_SIZE,L"Invalid DnsServerIP Address!");

+                return EFI_UNSUPPORTED;

+              }

+             Buffer = EndPointer +1;

+         }while(*EndPointer == L',');  

+     }

+     if (!StrnCmp (Buffer,L"}/uri(",6)){

+         Buffer +=StrLen(L")/uri(");

+         UnicodeStrToAsciiStrS (Buffer, AsciiUri, URI_STR_MAX_SIZE);

+         Status = HttpBootCheckUriScheme (AsciiUri);

+         return Status;

+     }

+     return EFI_SUCCESS;

+ }

+ /******

+ This function checks static Uri given by user and returns BOOLEAN(TRUE:valid Uri,FALSE:Invalid Uri)

+

+ @param[in]  Buffer               The URI string of the boot file.

+

+ @retval SUCCESS   Uri and static IP address are valid.

+         EFI_UNSUPPORTED Static Uri is invalid Format.

+                             EFI_INVALID_PARAMETER  Url is not supported http and https

+ *******/

+ EFI_STATUS

+ HttpBootCheckStaticUri(IN CHAR16 *Uri)

+ {

+     EFI_STATUS                      Status;

+     EFI_INPUT_KEY                   Key;

+     EFI_IP_ADDRESS                  LocalIp;

+     EFI_IP_ADDRESS                  SubnetMask;

+     EFI_IP_ADDRESS                  GatewayIp;

+     CHAR16                          ErrorMessage[URI_STR_MAX_SIZE];

+     UINTN                           Index = 0;

+    

+     if (StrLen (Uri) == 0)

+         return EFI_INVALID_PARAMETER;

+      

+     for (Index = 0; Index < StrLen (Uri); Index++) {

+         if (Uri[Index] == L'/' && Uri[Index + 1] == L'/') {

+           break;

+         }

+       if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {

+         Uri[Index] -= (CHAR16)(L'A' - L'a');

+       }

+     }

+     if (StrnCmp (Uri,L"ipv4(",5) == 0){

+         Status = VerifyIpv4Address (Uri,&LocalIp,&SubnetMask,&GatewayIp,ErrorMessage);

+         if (EFI_ERROR(Status)){

+            CreatePopUp (

+                EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,

+                &Key,

+                ErrorMessage,

+                NULL

+                );

+            return Status;

+        }

+     }else if (StrnCmp (Uri,L"ipv6(",5) == 0){

+         Status = VerifyIpv6Address (Uri,&LocalIp,&GatewayIp,ErrorMessage);

+         if (EFI_ERROR(Status)){

+             CreatePopUp (

+                EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,

+                &Key,

+                ErrorMessage,

+                NULL

+                );

+             return Status;

+         }

+     }else  if ((StrnCmp(Uri, L"http://", 7) != 0) && (StrnCmp(Uri, L"https://", 8) != 0)){

+         CreatePopUp (

+                EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,

+                &Key,

+                L"Invalid Uri",

+                NULL

+                );

+         return EFI_UNSUPPORTED;

+     }

+     return EFI_SUCCESS ;

+ }

+ /**

+   Checks the HttpBoot Mode is static or Dhcp  from the Input Devicepath.

+   And Update Private Variable Private->UsingStatic

+

+

+   @param[in]   FilePath         Pointer to the device path which contains a IPV4 and IPv6 device path node.

+

+   @retval EFI_SUCCESS            The IPV4 Address  and IPv6 Address are successfully assigned to Private variable 

+           EFI_INVALID_PARAMETER   If FilePath is Null

+ **/

+ EFI_STATUS

+ HttpBootCheckBootType (IN     EFI_DEVICE_PATH_PROTOCOL     *FilePath,IN HTTP_BOOT_PRIVATE_DATA         *Private)

+ {

+     EFI_DEVICE_PATH_PROTOCOL  *TempDevicePath;

+     EFI_DEV_PATH                      *Node;

+

+       if (FilePath == NULL) {

+         return EFI_INVALID_PARAMETER;

+       }

+      

+       TempDevicePath = FilePath;

+       while (!IsDevicePathEnd (TempDevicePath)) {

+         if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH)){

+             if (DevicePathSubType (TempDevicePath) == MSG_IPv4_DP){

+                 Node = (EFI_DEV_PATH *)TempDevicePath ;

+                 Private->UsingStatic = Node->Ipv4.StaticIpAddress ;

+             }else if (DevicePathSubType (TempDevicePath) == MSG_IPv6_DP){

+                 Node = (EFI_DEV_PATH *)TempDevicePath ;

+                 Private->UsingStatic =(Node->Ipv6.IpAddressOrigin == 0x03) ? TRUE : FALSE;

+             }

+         }

+         TempDevicePath = NextDevicePathNode (TempDevicePath);

+       }

+

+       return EFI_SUCCESS;

+ }

+ /**

+   Get the IPv4 and IPv6 Dns Address from Input Uri

+

+

+   @param[in]   Uri               Input Uri from Filepath

+   @param[in]   UsingIPv6         Specifies the type of IP addresses.

+   @param[in]   Private           The pointer to the driver's private data.

+

+   @retval EFI_SUCCESS            The IPV4 Address  and IPv6 Address are successfully assigned to HTTP boot driver private data.

+           EFI_INVALID_PARAMETER   If Uri is not a valid Static Devicepath URI

+ **/

+ EFI_STATUS

+ HttpBootParseDnsIp(IN CHAR8  *Uri,BOOLEAN  UsingIpv6,IN HTTP_BOOT_PRIVATE_DATA         *Private)

+ {

+     EFI_STATUS           Status;

+     CHAR16               Uri2[URI_STR_MAX_SIZE];

+     UINT32               Index = 0;

+     UINTN                UriStrLength = 0;

+     CHAR16              *EndPointer;

+     CHAR16              *Buffer;

+     UINTN                DataSize = 0;

+    

+     if (Uri == NULL)

+         return EFI_SUCCESS;

+     AsciiStrToUnicodeStrS(Uri,Uri2,URI_STR_MAX_SIZE);

+     UriStrLength = AsciiStrLen(Uri) + 1;

+     Status = HttpBootCheckStaticUri(Uri2);

+     if (EFI_ERROR(Status))

+         return Status;

+     if (Buffer = StrStr(Uri2,L"dns("))

+     {

+         Buffer += 4;

+         DataSize = sizeof(EFI_IP_ADDRESS) ;

+         Private->DnsServerIp = AllocateZeroPool(DataSize);

+         if (UsingIpv6)

+             Status = StrToIpv6Address (Buffer,&EndPointer,&Private->DnsServerIp[Index++].v6,NULL);

+         else

+             Status = StrToIpv4Address (Buffer,&EndPointer,&Private->DnsServerIp[Index++].v4,NULL);

+         if (EFI_ERROR(Status)){

+             FreePool(Private->DnsServerIp);

+             Private->DnsServerIp = NULL;

+             return Status;

+         }

+         while(*EndPointer == L','){

+             Private->DnsServerIp = ReallocatePool(DataSize,DataSize + sizeof(EFI_IP_ADDRESS),Private->DnsServerIp);

+             if (UsingIpv6)

+                 Status = StrToIpv6Address (Buffer,&EndPointer,&Private->DnsServerIp[Index++].v6,NULL);

+             else

+                 Status = StrToIpv4Address (Buffer,&EndPointer,&Private->DnsServerIp[Index++].v4,NULL);

+             if (EFI_ERROR(Status)){

+                 FreePool(Private->DnsServerIp);

+                 Private->DnsServerIp = NULL;

+                 return Status;

+             }

+             Buffer = EndPointer + 1;

+         }while(*EndPointer == L',');

+     Private->DnsServerCount = Index;

+     if (Buffer = StrStr(Uri2,L"http")){

+         for (Index =0;Buffer[Index] != L')' && Buffer[Index] != L'\0'  ;Index++);

+         Buffer[Index] = L'\0';

+     }

+     UnicodeStrToAsciiStrS(Buffer,Uri,UriStrLength);

+     }

+     return EFI_SUCCESS;

+ }

+


Re: [PATCH v2 2/2] CryptoPkg/OpensslLib: Commit the auto-generated assembly files for X64

Yao, Jiewen
 

Thank you Mike to help on this.

I also believe that the best option is to integrate the auto-gen process in base tool.

-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@intel.com>
Sent: Thursday, August 13, 2020 11:38 PM
To: Yao, Jiewen <jiewen.yao@intel.com>; Zurcher, Christopher J
<christopher.j.zurcher@intel.com>; devel@edk2.groups.io; Kinney, Michael D
<michael.d.kinney@intel.com>
Cc: Wang, Jian J <jian.j.wang@intel.com>; Lu, XiaoyuX <xiaoyux.lu@intel.com>;
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: RE: [PATCH v2 2/2] CryptoPkg/OpensslLib: Commit the auto-generated
assembly files for X64

Hi Jiewen,

For this use case, generating the files as part of the build process would add
a dependency in pearl.

Based on other recent CryptoPkg changes and some being discussed in BZ, I am
seeing more changes to the OpenSLL .pl configuration files, and I am concerned
that based on platform requirements, we may need to build OpenSSL with
different .pl config file settings which would also add a pearl dependency
to the build.

So exploring what it would take to add the pearl dependency to the build system
is worth exploring and if successful would eliminate the need to checkin these
types of autogenerated files. This would also reduce maintenance of the
auto-genererated files when EDK II moves to a new version of OpenSSL.

@Cristopher - Can you please share a branch that uses pearl to generate the
files
instead of checking them in? I would like the BaseTools maintainers to review
that and evaluate adding the pearl dependency. Hopefully, we can make the
pearl dependency detectable so it is only required if the build requires it.

Thanks,

Mike

-----Original Message-----
From: Yao, Jiewen <jiewen.yao@intel.com>
Sent: Thursday, August 13, 2020 8:25 AM
To: Zurcher, Christopher J <christopher.j.zurcher@intel.com>;
devel@edk2.groups.io
Cc: Wang, Jian J <jian.j.wang@intel.com>; Lu, XiaoyuX
<xiaoyux.lu@intel.com>; Kinney, Michael D
<michael.d.kinney@intel.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: RE: [PATCH v2 2/2] CryptoPkg/OpensslLib: Commit the auto-
generated assembly files for X64

+ Mike Kinney

I am not sure if it is a right way to check in auto-generated file.
That means, whenever we upgrade the openssl, we need manually generate
them again.
Any step by step, or readme to tell us how to do that?

Mike, would you please double confirm what is the right way for auto-
generated file in EDKII?


-----Original Message-----
From: Zurcher, Christopher J <christopher.j.zurcher@intel.com>
Sent: Tuesday, August 4, 2020 8:24 AM
To: devel@edk2.groups.io
Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
<jian.j.wang@intel.com>;
Lu, XiaoyuX <xiaoyux.lu@intel.com>; Ard Biesheuvel
<ard.biesheuvel@linaro.org>
Subject: [PATCH v2 2/2] CryptoPkg/OpensslLib: Commit the auto-generated
assembly files for X64

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2507

Adding the auto-generated assembly files for the X64 architecture.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
---
CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-mb-x86_64.nasm |
732
+++
CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha1-x86_64.nasm |
1916 ++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha256-x86_64.nasm |
78 +
CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-x86_64.nasm |
5103
++++++++++++++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/aes/vpaes-x86_64.nasm |
1173
+++++
CryptoPkg/Library/OpensslLib/X64/crypto/modes/ghash-x86_64.nasm |
1569 ++++++
CryptoPkg/Library/OpensslLib/X64/crypto/sha/sha1-mb-x86_64.nasm |
3137
++++++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/sha/sha1-x86_64.nasm |
2884
+++++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/sha/sha256-mb-x86_64.nasm |
3461 +++++++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/sha/sha256-x86_64.nasm |
3313
+++++++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/sha/sha512-x86_64.nasm |
1938
++++++++
CryptoPkg/Library/OpensslLib/X64/crypto/x86_64cpuid.nasm | 491
++
12 files changed, 25795 insertions(+)

diff --git a/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-mb-
x86_64.nasm b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-mb-
x86_64.nasm
new file mode 100644
index 0000000000..1a3ed1dd35
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-mb-x86_64.nasm
@@ -0,0 +1,732 @@
+; WARNING: do not edit!

+; Generated from openssl/crypto/aes/asm/aesni-mb-x86_64.pl

+;

+; Copyright 2013-2020 The OpenSSL Project Authors. All Rights Reserved.

+;

+; Licensed under the OpenSSL license (the "License"). You may not use

+; this file except in compliance with the License. You can obtain a copy

+; in the file LICENSE in the source distribution or at

+; https://www.openssl.org/source/license.html

+

+default rel

+%define XMMWORD

+%define YMMWORD

+%define ZMMWORD

+section .text code align=64

+

+

+EXTERN OPENSSL_ia32cap_P

+

+global aesni_multi_cbc_encrypt

+

+ALIGN 32

+aesni_multi_cbc_encrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_multi_cbc_encrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+

+

+

+ mov rax,rsp

+

+ push rbx

+

+ push rbp

+

+ push r12

+

+ push r13

+

+ push r14

+

+ push r15

+

+ lea rsp,[((-168))+rsp]

+ movaps XMMWORD[rsp],xmm6

+ movaps XMMWORD[16+rsp],xmm7

+ movaps XMMWORD[32+rsp],xmm8

+ movaps XMMWORD[48+rsp],xmm9

+ movaps XMMWORD[64+rsp],xmm10

+ movaps XMMWORD[80+rsp],xmm11

+ movaps XMMWORD[96+rsp],xmm12

+ movaps XMMWORD[(-104)+rax],xmm13

+ movaps XMMWORD[(-88)+rax],xmm14

+ movaps XMMWORD[(-72)+rax],xmm15

+

+

+

+

+

+

+ sub rsp,48

+ and rsp,-64

+ mov QWORD[16+rsp],rax

+

+

+$L$enc4x_body:

+ movdqu xmm12,XMMWORD[rsi]

+ lea rsi,[120+rsi]

+ lea rdi,[80+rdi]

+

+$L$enc4x_loop_grande:

+ mov DWORD[24+rsp],edx

+ xor edx,edx

+ mov ecx,DWORD[((-64))+rdi]

+ mov r8,QWORD[((-80))+rdi]

+ cmp ecx,edx

+ mov r12,QWORD[((-72))+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm2,XMMWORD[((-56))+rdi]

+ mov DWORD[32+rsp],ecx

+ cmovle r8,rsp

+ mov ecx,DWORD[((-24))+rdi]

+ mov r9,QWORD[((-40))+rdi]

+ cmp ecx,edx

+ mov r13,QWORD[((-32))+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm3,XMMWORD[((-16))+rdi]

+ mov DWORD[36+rsp],ecx

+ cmovle r9,rsp

+ mov ecx,DWORD[16+rdi]

+ mov r10,QWORD[rdi]

+ cmp ecx,edx

+ mov r14,QWORD[8+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm4,XMMWORD[24+rdi]

+ mov DWORD[40+rsp],ecx

+ cmovle r10,rsp

+ mov ecx,DWORD[56+rdi]

+ mov r11,QWORD[40+rdi]

+ cmp ecx,edx

+ mov r15,QWORD[48+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm5,XMMWORD[64+rdi]

+ mov DWORD[44+rsp],ecx

+ cmovle r11,rsp

+ test edx,edx

+ jz NEAR $L$enc4x_done

+

+ movups xmm1,XMMWORD[((16-120))+rsi]

+ pxor xmm2,xmm12

+ movups xmm0,XMMWORD[((32-120))+rsi]

+ pxor xmm3,xmm12

+ mov eax,DWORD[((240-120))+rsi]

+ pxor xmm4,xmm12

+ movdqu xmm6,XMMWORD[r8]

+ pxor xmm5,xmm12

+ movdqu xmm7,XMMWORD[r9]

+ pxor xmm2,xmm6

+ movdqu xmm8,XMMWORD[r10]

+ pxor xmm3,xmm7

+ movdqu xmm9,XMMWORD[r11]

+ pxor xmm4,xmm8

+ pxor xmm5,xmm9

+ movdqa xmm10,XMMWORD[32+rsp]

+ xor rbx,rbx

+ jmp NEAR $L$oop_enc4x

+

+ALIGN 32

+$L$oop_enc4x:

+ add rbx,16

+ lea rbp,[16+rsp]

+ mov ecx,1

+ sub rbp,rbx

+

+DB 102,15,56,220,209

+ prefetcht0 [31+rbx*1+r8]

+ prefetcht0 [31+rbx*1+r9]

+DB 102,15,56,220,217

+ prefetcht0 [31+rbx*1+r10]

+ prefetcht0 [31+rbx*1+r10]

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((48-120))+rsi]

+ cmp ecx,DWORD[32+rsp]

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+ cmovge r8,rbp

+ cmovg r12,rbp

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((-56))+rsi]

+ cmp ecx,DWORD[36+rsp]

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+ cmovge r9,rbp

+ cmovg r13,rbp

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((-40))+rsi]

+ cmp ecx,DWORD[40+rsp]

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+ cmovge r10,rbp

+ cmovg r14,rbp

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((-24))+rsi]

+ cmp ecx,DWORD[44+rsp]

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+ cmovge r11,rbp

+ cmovg r15,rbp

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((-8))+rsi]

+ movdqa xmm11,xmm10

+DB 102,15,56,220,208

+ prefetcht0 [15+rbx*1+r12]

+ prefetcht0 [15+rbx*1+r13]

+DB 102,15,56,220,216

+ prefetcht0 [15+rbx*1+r14]

+ prefetcht0 [15+rbx*1+r15]

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((128-120))+rsi]

+ pxor xmm12,xmm12

+

+DB 102,15,56,220,209

+ pcmpgtd xmm11,xmm12

+ movdqu xmm12,XMMWORD[((-120))+rsi]

+DB 102,15,56,220,217

+ paddd xmm10,xmm11

+ movdqa XMMWORD[32+rsp],xmm10

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((144-120))+rsi]

+

+ cmp eax,11

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((160-120))+rsi]

+

+ jb NEAR $L$enc4x_tail

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((176-120))+rsi]

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((192-120))+rsi]

+

+ je NEAR $L$enc4x_tail

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[((208-120))+rsi]

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((224-120))+rsi]

+ jmp NEAR $L$enc4x_tail

+

+ALIGN 32

+$L$enc4x_tail:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movdqu xmm6,XMMWORD[rbx*1+r8]

+ movdqu xmm1,XMMWORD[((16-120))+rsi]

+

+DB 102,15,56,221,208

+ movdqu xmm7,XMMWORD[rbx*1+r9]

+ pxor xmm6,xmm12

+DB 102,15,56,221,216

+ movdqu xmm8,XMMWORD[rbx*1+r10]

+ pxor xmm7,xmm12

+DB 102,15,56,221,224

+ movdqu xmm9,XMMWORD[rbx*1+r11]

+ pxor xmm8,xmm12

+DB 102,15,56,221,232

+ movdqu xmm0,XMMWORD[((32-120))+rsi]

+ pxor xmm9,xmm12

+

+ movups XMMWORD[(-16)+rbx*1+r12],xmm2

+ pxor xmm2,xmm6

+ movups XMMWORD[(-16)+rbx*1+r13],xmm3

+ pxor xmm3,xmm7

+ movups XMMWORD[(-16)+rbx*1+r14],xmm4

+ pxor xmm4,xmm8

+ movups XMMWORD[(-16)+rbx*1+r15],xmm5

+ pxor xmm5,xmm9

+

+ dec edx

+ jnz NEAR $L$oop_enc4x

+

+ mov rax,QWORD[16+rsp]

+

+ mov edx,DWORD[24+rsp]

+

+

+

+

+

+

+

+

+

+

+ lea rdi,[160+rdi]

+ dec edx

+ jnz NEAR $L$enc4x_loop_grande

+

+$L$enc4x_done:

+ movaps xmm6,XMMWORD[((-216))+rax]

+ movaps xmm7,XMMWORD[((-200))+rax]

+ movaps xmm8,XMMWORD[((-184))+rax]

+ movaps xmm9,XMMWORD[((-168))+rax]

+ movaps xmm10,XMMWORD[((-152))+rax]

+ movaps xmm11,XMMWORD[((-136))+rax]

+ movaps xmm12,XMMWORD[((-120))+rax]

+

+

+

+ mov r15,QWORD[((-48))+rax]

+

+ mov r14,QWORD[((-40))+rax]

+

+ mov r13,QWORD[((-32))+rax]

+

+ mov r12,QWORD[((-24))+rax]

+

+ mov rbp,QWORD[((-16))+rax]

+

+ mov rbx,QWORD[((-8))+rax]

+

+ lea rsp,[rax]

+

+$L$enc4x_epilogue:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_multi_cbc_encrypt:

+

+global aesni_multi_cbc_decrypt

+

+ALIGN 32

+aesni_multi_cbc_decrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_multi_cbc_decrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+

+

+

+ mov rax,rsp

+

+ push rbx

+

+ push rbp

+

+ push r12

+

+ push r13

+

+ push r14

+

+ push r15

+

+ lea rsp,[((-168))+rsp]

+ movaps XMMWORD[rsp],xmm6

+ movaps XMMWORD[16+rsp],xmm7

+ movaps XMMWORD[32+rsp],xmm8

+ movaps XMMWORD[48+rsp],xmm9

+ movaps XMMWORD[64+rsp],xmm10

+ movaps XMMWORD[80+rsp],xmm11

+ movaps XMMWORD[96+rsp],xmm12

+ movaps XMMWORD[(-104)+rax],xmm13

+ movaps XMMWORD[(-88)+rax],xmm14

+ movaps XMMWORD[(-72)+rax],xmm15

+

+

+

+

+

+

+ sub rsp,48

+ and rsp,-64

+ mov QWORD[16+rsp],rax

+

+

+$L$dec4x_body:

+ movdqu xmm12,XMMWORD[rsi]

+ lea rsi,[120+rsi]

+ lea rdi,[80+rdi]

+

+$L$dec4x_loop_grande:

+ mov DWORD[24+rsp],edx

+ xor edx,edx

+ mov ecx,DWORD[((-64))+rdi]

+ mov r8,QWORD[((-80))+rdi]

+ cmp ecx,edx

+ mov r12,QWORD[((-72))+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm6,XMMWORD[((-56))+rdi]

+ mov DWORD[32+rsp],ecx

+ cmovle r8,rsp

+ mov ecx,DWORD[((-24))+rdi]

+ mov r9,QWORD[((-40))+rdi]

+ cmp ecx,edx

+ mov r13,QWORD[((-32))+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm7,XMMWORD[((-16))+rdi]

+ mov DWORD[36+rsp],ecx

+ cmovle r9,rsp

+ mov ecx,DWORD[16+rdi]

+ mov r10,QWORD[rdi]

+ cmp ecx,edx

+ mov r14,QWORD[8+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm8,XMMWORD[24+rdi]

+ mov DWORD[40+rsp],ecx

+ cmovle r10,rsp

+ mov ecx,DWORD[56+rdi]

+ mov r11,QWORD[40+rdi]

+ cmp ecx,edx

+ mov r15,QWORD[48+rdi]

+ cmovg edx,ecx

+ test ecx,ecx

+ movdqu xmm9,XMMWORD[64+rdi]

+ mov DWORD[44+rsp],ecx

+ cmovle r11,rsp

+ test edx,edx

+ jz NEAR $L$dec4x_done

+

+ movups xmm1,XMMWORD[((16-120))+rsi]

+ movups xmm0,XMMWORD[((32-120))+rsi]

+ mov eax,DWORD[((240-120))+rsi]

+ movdqu xmm2,XMMWORD[r8]

+ movdqu xmm3,XMMWORD[r9]

+ pxor xmm2,xmm12

+ movdqu xmm4,XMMWORD[r10]

+ pxor xmm3,xmm12

+ movdqu xmm5,XMMWORD[r11]

+ pxor xmm4,xmm12

+ pxor xmm5,xmm12

+ movdqa xmm10,XMMWORD[32+rsp]

+ xor rbx,rbx

+ jmp NEAR $L$oop_dec4x

+

+ALIGN 32

+$L$oop_dec4x:

+ add rbx,16

+ lea rbp,[16+rsp]

+ mov ecx,1

+ sub rbp,rbx

+

+DB 102,15,56,222,209

+ prefetcht0 [31+rbx*1+r8]

+ prefetcht0 [31+rbx*1+r9]

+DB 102,15,56,222,217

+ prefetcht0 [31+rbx*1+r10]

+ prefetcht0 [31+rbx*1+r11]

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((48-120))+rsi]

+ cmp ecx,DWORD[32+rsp]

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+ cmovge r8,rbp

+ cmovg r12,rbp

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((-56))+rsi]

+ cmp ecx,DWORD[36+rsp]

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+ cmovge r9,rbp

+ cmovg r13,rbp

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((-40))+rsi]

+ cmp ecx,DWORD[40+rsp]

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+ cmovge r10,rbp

+ cmovg r14,rbp

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((-24))+rsi]

+ cmp ecx,DWORD[44+rsp]

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+ cmovge r11,rbp

+ cmovg r15,rbp

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((-8))+rsi]

+ movdqa xmm11,xmm10

+DB 102,15,56,222,208

+ prefetcht0 [15+rbx*1+r12]

+ prefetcht0 [15+rbx*1+r13]

+DB 102,15,56,222,216

+ prefetcht0 [15+rbx*1+r14]

+ prefetcht0 [15+rbx*1+r15]

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((128-120))+rsi]

+ pxor xmm12,xmm12

+

+DB 102,15,56,222,209

+ pcmpgtd xmm11,xmm12

+ movdqu xmm12,XMMWORD[((-120))+rsi]

+DB 102,15,56,222,217

+ paddd xmm10,xmm11

+ movdqa XMMWORD[32+rsp],xmm10

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((144-120))+rsi]

+

+ cmp eax,11

+

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((160-120))+rsi]

+

+ jb NEAR $L$dec4x_tail

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((176-120))+rsi]

+

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((192-120))+rsi]

+

+ je NEAR $L$dec4x_tail

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[((208-120))+rsi]

+

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((224-120))+rsi]

+ jmp NEAR $L$dec4x_tail

+

+ALIGN 32

+$L$dec4x_tail:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+ pxor xmm6,xmm0

+ pxor xmm7,xmm0

+DB 102,15,56,222,233

+ movdqu xmm1,XMMWORD[((16-120))+rsi]

+ pxor xmm8,xmm0

+ pxor xmm9,xmm0

+ movdqu xmm0,XMMWORD[((32-120))+rsi]

+

+DB 102,15,56,223,214

+DB 102,15,56,223,223

+ movdqu xmm6,XMMWORD[((-16))+rbx*1+r8]

+ movdqu xmm7,XMMWORD[((-16))+rbx*1+r9]

+DB 102,65,15,56,223,224

+DB 102,65,15,56,223,233

+ movdqu xmm8,XMMWORD[((-16))+rbx*1+r10]

+ movdqu xmm9,XMMWORD[((-16))+rbx*1+r11]

+

+ movups XMMWORD[(-16)+rbx*1+r12],xmm2

+ movdqu xmm2,XMMWORD[rbx*1+r8]

+ movups XMMWORD[(-16)+rbx*1+r13],xmm3

+ movdqu xmm3,XMMWORD[rbx*1+r9]

+ pxor xmm2,xmm12

+ movups XMMWORD[(-16)+rbx*1+r14],xmm4

+ movdqu xmm4,XMMWORD[rbx*1+r10]

+ pxor xmm3,xmm12

+ movups XMMWORD[(-16)+rbx*1+r15],xmm5

+ movdqu xmm5,XMMWORD[rbx*1+r11]

+ pxor xmm4,xmm12

+ pxor xmm5,xmm12

+

+ dec edx

+ jnz NEAR $L$oop_dec4x

+

+ mov rax,QWORD[16+rsp]

+

+ mov edx,DWORD[24+rsp]

+

+ lea rdi,[160+rdi]

+ dec edx

+ jnz NEAR $L$dec4x_loop_grande

+

+$L$dec4x_done:

+ movaps xmm6,XMMWORD[((-216))+rax]

+ movaps xmm7,XMMWORD[((-200))+rax]

+ movaps xmm8,XMMWORD[((-184))+rax]

+ movaps xmm9,XMMWORD[((-168))+rax]

+ movaps xmm10,XMMWORD[((-152))+rax]

+ movaps xmm11,XMMWORD[((-136))+rax]

+ movaps xmm12,XMMWORD[((-120))+rax]

+

+

+

+ mov r15,QWORD[((-48))+rax]

+

+ mov r14,QWORD[((-40))+rax]

+

+ mov r13,QWORD[((-32))+rax]

+

+ mov r12,QWORD[((-24))+rax]

+

+ mov rbp,QWORD[((-16))+rax]

+

+ mov rbx,QWORD[((-8))+rax]

+

+ lea rsp,[rax]

+

+$L$dec4x_epilogue:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_multi_cbc_decrypt:

+EXTERN __imp_RtlVirtualUnwind

+

+ALIGN 16

+se_handler:

+ push rsi

+ push rdi

+ push rbx

+ push rbp

+ push r12

+ push r13

+ push r14

+ push r15

+ pushfq

+ sub rsp,64

+

+ mov rax,QWORD[120+r8]

+ mov rbx,QWORD[248+r8]

+

+ mov rsi,QWORD[8+r9]

+ mov r11,QWORD[56+r9]

+

+ mov r10d,DWORD[r11]

+ lea r10,[r10*1+rsi]

+ cmp rbx,r10

+ jb NEAR $L$in_prologue

+

+ mov rax,QWORD[152+r8]

+

+ mov r10d,DWORD[4+r11]

+ lea r10,[r10*1+rsi]

+ cmp rbx,r10

+ jae NEAR $L$in_prologue

+

+ mov rax,QWORD[16+rax]

+

+ mov rbx,QWORD[((-8))+rax]

+ mov rbp,QWORD[((-16))+rax]

+ mov r12,QWORD[((-24))+rax]

+ mov r13,QWORD[((-32))+rax]

+ mov r14,QWORD[((-40))+rax]

+ mov r15,QWORD[((-48))+rax]

+ mov QWORD[144+r8],rbx

+ mov QWORD[160+r8],rbp

+ mov QWORD[216+r8],r12

+ mov QWORD[224+r8],r13

+ mov QWORD[232+r8],r14

+ mov QWORD[240+r8],r15

+

+ lea rsi,[((-56-160))+rax]

+ lea rdi,[512+r8]

+ mov ecx,20

+ DD 0xa548f3fc

+

+$L$in_prologue:

+ mov rdi,QWORD[8+rax]

+ mov rsi,QWORD[16+rax]

+ mov QWORD[152+r8],rax

+ mov QWORD[168+r8],rsi

+ mov QWORD[176+r8],rdi

+

+ mov rdi,QWORD[40+r9]

+ mov rsi,r8

+ mov ecx,154

+ DD 0xa548f3fc

+

+ mov rsi,r9

+ xor rcx,rcx

+ mov rdx,QWORD[8+rsi]

+ mov r8,QWORD[rsi]

+ mov r9,QWORD[16+rsi]

+ mov r10,QWORD[40+rsi]

+ lea r11,[56+rsi]

+ lea r12,[24+rsi]

+ mov QWORD[32+rsp],r10

+ mov QWORD[40+rsp],r11

+ mov QWORD[48+rsp],r12

+ mov QWORD[56+rsp],rcx

+ call QWORD[__imp_RtlVirtualUnwind]

+

+ mov eax,1

+ add rsp,64

+ popfq

+ pop r15

+ pop r14

+ pop r13

+ pop r12

+ pop rbp

+ pop rbx

+ pop rdi

+ pop rsi

+ DB 0F3h,0C3h ;repret

+

+

+section .pdata rdata align=4

+ALIGN 4

+ DD $L$SEH_begin_aesni_multi_cbc_encrypt wrt ..imagebase

+ DD $L$SEH_end_aesni_multi_cbc_encrypt wrt ..imagebase

+ DD $L$SEH_info_aesni_multi_cbc_encrypt wrt ..imagebase

+ DD $L$SEH_begin_aesni_multi_cbc_decrypt wrt ..imagebase

+ DD $L$SEH_end_aesni_multi_cbc_decrypt wrt ..imagebase

+ DD $L$SEH_info_aesni_multi_cbc_decrypt wrt ..imagebase

+section .xdata rdata align=8

+ALIGN 8

+$L$SEH_info_aesni_multi_cbc_encrypt:

+DB 9,0,0,0

+ DD se_handler wrt ..imagebase

+ DD $L$enc4x_body wrt ..imagebase,$L$enc4x_epilogue
wrt ..imagebase

+$L$SEH_info_aesni_multi_cbc_decrypt:

+DB 9,0,0,0

+ DD se_handler wrt ..imagebase

+ DD $L$dec4x_body wrt ..imagebase,$L$dec4x_epilogue
wrt ..imagebase

diff --git a/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha1-
x86_64.nasm b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha1-
x86_64.nasm
new file mode 100644
index 0000000000..f4fd9ca50d
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha1-
x86_64.nasm
@@ -0,0 +1,1916 @@
+; WARNING: do not edit!

+; Generated from openssl/crypto/aes/asm/aesni-sha1-x86_64.pl

+;

+; Copyright 2011-2020 The OpenSSL Project Authors. All Rights Reserved.

+;

+; Licensed under the OpenSSL license (the "License"). You may not use

+; this file except in compliance with the License. You can obtain a copy

+; in the file LICENSE in the source distribution or at

+; https://www.openssl.org/source/license.html

+

+default rel

+%define XMMWORD

+%define YMMWORD

+%define ZMMWORD

+section .text code align=64

+

+EXTERN OPENSSL_ia32cap_P

+

+global aesni_cbc_sha1_enc

+

+ALIGN 32

+aesni_cbc_sha1_enc:

+

+

+ mov r10d,DWORD[((OPENSSL_ia32cap_P+0))]

+ mov r11,QWORD[((OPENSSL_ia32cap_P+4))]

+ bt r11,61

+ jc NEAR aesni_cbc_sha1_enc_shaext

+ jmp NEAR aesni_cbc_sha1_enc_ssse3

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 32

+aesni_cbc_sha1_enc_ssse3:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_cbc_sha1_enc_ssse3:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ mov r10,QWORD[56+rsp]

+

+

+ push rbx

+

+ push rbp

+

+ push r12

+

+ push r13

+

+ push r14

+

+ push r15

+

+ lea rsp,[((-264))+rsp]

+

+

+

+ movaps XMMWORD[(96+0)+rsp],xmm6

+ movaps XMMWORD[(96+16)+rsp],xmm7

+ movaps XMMWORD[(96+32)+rsp],xmm8

+ movaps XMMWORD[(96+48)+rsp],xmm9

+ movaps XMMWORD[(96+64)+rsp],xmm10

+ movaps XMMWORD[(96+80)+rsp],xmm11

+ movaps XMMWORD[(96+96)+rsp],xmm12

+ movaps XMMWORD[(96+112)+rsp],xmm13

+ movaps XMMWORD[(96+128)+rsp],xmm14

+ movaps XMMWORD[(96+144)+rsp],xmm15

+$L$prologue_ssse3:

+ mov r12,rdi

+ mov r13,rsi

+ mov r14,rdx

+ lea r15,[112+rcx]

+ movdqu xmm2,XMMWORD[r8]

+ mov QWORD[88+rsp],r8

+ shl r14,6

+ sub r13,r12

+ mov r8d,DWORD[((240-112))+r15]

+ add r14,r10

+

+ lea r11,[K_XX_XX]

+ mov eax,DWORD[r9]

+ mov ebx,DWORD[4+r9]

+ mov ecx,DWORD[8+r9]

+ mov edx,DWORD[12+r9]

+ mov esi,ebx

+ mov ebp,DWORD[16+r9]

+ mov edi,ecx

+ xor edi,edx

+ and esi,edi

+

+ movdqa xmm3,XMMWORD[64+r11]

+ movdqa xmm13,XMMWORD[r11]

+ movdqu xmm4,XMMWORD[r10]

+ movdqu xmm5,XMMWORD[16+r10]

+ movdqu xmm6,XMMWORD[32+r10]

+ movdqu xmm7,XMMWORD[48+r10]

+DB 102,15,56,0,227

+DB 102,15,56,0,235

+DB 102,15,56,0,243

+ add r10,64

+ paddd xmm4,xmm13

+DB 102,15,56,0,251

+ paddd xmm5,xmm13

+ paddd xmm6,xmm13

+ movdqa XMMWORD[rsp],xmm4

+ psubd xmm4,xmm13

+ movdqa XMMWORD[16+rsp],xmm5

+ psubd xmm5,xmm13

+ movdqa XMMWORD[32+rsp],xmm6

+ psubd xmm6,xmm13

+ movups xmm15,XMMWORD[((-112))+r15]

+ movups xmm0,XMMWORD[((16-112))+r15]

+ jmp NEAR $L$oop_ssse3

+ALIGN 32

+$L$oop_ssse3:

+ ror ebx,2

+ movups xmm14,XMMWORD[r12]

+ xorps xmm14,xmm15

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+r15]

+DB 102,15,56,220,208

+ pshufd xmm8,xmm4,238

+ xor esi,edx

+ movdqa xmm12,xmm7

+ paddd xmm13,xmm7

+ mov edi,eax

+ add ebp,DWORD[rsp]

+ punpcklqdq xmm8,xmm5

+ xor ebx,ecx

+ rol eax,5

+ add ebp,esi

+ psrldq xmm12,4

+ and edi,ebx

+ xor ebx,ecx

+ pxor xmm8,xmm4

+ add ebp,eax

+ ror eax,7

+ pxor xmm12,xmm6

+ xor edi,ecx

+ mov esi,ebp

+ add edx,DWORD[4+rsp]

+ pxor xmm8,xmm12

+ xor eax,ebx

+ rol ebp,5

+ movdqa XMMWORD[48+rsp],xmm13

+ add edx,edi

+ movups xmm0,XMMWORD[((-64))+r15]

+DB 102,15,56,220,209

+ and esi,eax

+ movdqa xmm3,xmm8

+ xor eax,ebx

+ add edx,ebp

+ ror ebp,7

+ movdqa xmm12,xmm8

+ xor esi,ebx

+ pslldq xmm3,12

+ paddd xmm8,xmm8

+ mov edi,edx

+ add ecx,DWORD[8+rsp]

+ psrld xmm12,31

+ xor ebp,eax

+ rol edx,5

+ add ecx,esi

+ movdqa xmm13,xmm3

+ and edi,ebp

+ xor ebp,eax

+ psrld xmm3,30

+ add ecx,edx

+ ror edx,7

+ por xmm8,xmm12

+ xor edi,eax

+ mov esi,ecx

+ add ebx,DWORD[12+rsp]

+ movups xmm1,XMMWORD[((-48))+r15]

+DB 102,15,56,220,208

+ pslld xmm13,2

+ pxor xmm8,xmm3

+ xor edx,ebp

+ movdqa xmm3,XMMWORD[r11]

+ rol ecx,5

+ add ebx,edi

+ and esi,edx

+ pxor xmm8,xmm13

+ xor edx,ebp

+ add ebx,ecx

+ ror ecx,7

+ pshufd xmm9,xmm5,238

+ xor esi,ebp

+ movdqa xmm13,xmm8

+ paddd xmm3,xmm8

+ mov edi,ebx

+ add eax,DWORD[16+rsp]

+ punpcklqdq xmm9,xmm6

+ xor ecx,edx

+ rol ebx,5

+ add eax,esi

+ psrldq xmm13,4

+ and edi,ecx

+ xor ecx,edx

+ pxor xmm9,xmm5

+ add eax,ebx

+ ror ebx,7

+ movups xmm0,XMMWORD[((-32))+r15]

+DB 102,15,56,220,209

+ pxor xmm13,xmm7

+ xor edi,edx

+ mov esi,eax

+ add ebp,DWORD[20+rsp]

+ pxor xmm9,xmm13

+ xor ebx,ecx

+ rol eax,5

+ movdqa XMMWORD[rsp],xmm3

+ add ebp,edi

+ and esi,ebx

+ movdqa xmm12,xmm9

+ xor ebx,ecx

+ add ebp,eax

+ ror eax,7

+ movdqa xmm13,xmm9

+ xor esi,ecx

+ pslldq xmm12,12

+ paddd xmm9,xmm9

+ mov edi,ebp

+ add edx,DWORD[24+rsp]

+ psrld xmm13,31

+ xor eax,ebx

+ rol ebp,5

+ add edx,esi

+ movups xmm1,XMMWORD[((-16))+r15]

+DB 102,15,56,220,208

+ movdqa xmm3,xmm12

+ and edi,eax

+ xor eax,ebx

+ psrld xmm12,30

+ add edx,ebp

+ ror ebp,7

+ por xmm9,xmm13

+ xor edi,ebx

+ mov esi,edx

+ add ecx,DWORD[28+rsp]

+ pslld xmm3,2

+ pxor xmm9,xmm12

+ xor ebp,eax

+ movdqa xmm12,XMMWORD[16+r11]

+ rol edx,5

+ add ecx,edi

+ and esi,ebp

+ pxor xmm9,xmm3

+ xor ebp,eax

+ add ecx,edx

+ ror edx,7

+ pshufd xmm10,xmm6,238

+ xor esi,eax

+ movdqa xmm3,xmm9

+ paddd xmm12,xmm9

+ mov edi,ecx

+ add ebx,DWORD[32+rsp]

+ movups xmm0,XMMWORD[r15]

+DB 102,15,56,220,209

+ punpcklqdq xmm10,xmm7

+ xor edx,ebp

+ rol ecx,5

+ add ebx,esi

+ psrldq xmm3,4

+ and edi,edx

+ xor edx,ebp

+ pxor xmm10,xmm6

+ add ebx,ecx

+ ror ecx,7

+ pxor xmm3,xmm8

+ xor edi,ebp

+ mov esi,ebx

+ add eax,DWORD[36+rsp]

+ pxor xmm10,xmm3

+ xor ecx,edx

+ rol ebx,5

+ movdqa XMMWORD[16+rsp],xmm12

+ add eax,edi

+ and esi,ecx

+ movdqa xmm13,xmm10

+ xor ecx,edx

+ add eax,ebx

+ ror ebx,7

+ movups xmm1,XMMWORD[16+r15]

+DB 102,15,56,220,208

+ movdqa xmm3,xmm10

+ xor esi,edx

+ pslldq xmm13,12

+ paddd xmm10,xmm10

+ mov edi,eax

+ add ebp,DWORD[40+rsp]

+ psrld xmm3,31

+ xor ebx,ecx

+ rol eax,5

+ add ebp,esi

+ movdqa xmm12,xmm13

+ and edi,ebx

+ xor ebx,ecx

+ psrld xmm13,30

+ add ebp,eax

+ ror eax,7

+ por xmm10,xmm3

+ xor edi,ecx

+ mov esi,ebp

+ add edx,DWORD[44+rsp]

+ pslld xmm12,2

+ pxor xmm10,xmm13

+ xor eax,ebx

+ movdqa xmm13,XMMWORD[16+r11]

+ rol ebp,5

+ add edx,edi

+ movups xmm0,XMMWORD[32+r15]

+DB 102,15,56,220,209

+ and esi,eax

+ pxor xmm10,xmm12

+ xor eax,ebx

+ add edx,ebp

+ ror ebp,7

+ pshufd xmm11,xmm7,238

+ xor esi,ebx

+ movdqa xmm12,xmm10

+ paddd xmm13,xmm10

+ mov edi,edx

+ add ecx,DWORD[48+rsp]

+ punpcklqdq xmm11,xmm8

+ xor ebp,eax

+ rol edx,5

+ add ecx,esi

+ psrldq xmm12,4

+ and edi,ebp

+ xor ebp,eax

+ pxor xmm11,xmm7

+ add ecx,edx

+ ror edx,7

+ pxor xmm12,xmm9

+ xor edi,eax

+ mov esi,ecx

+ add ebx,DWORD[52+rsp]

+ movups xmm1,XMMWORD[48+r15]

+DB 102,15,56,220,208

+ pxor xmm11,xmm12

+ xor edx,ebp

+ rol ecx,5

+ movdqa XMMWORD[32+rsp],xmm13

+ add ebx,edi

+ and esi,edx

+ movdqa xmm3,xmm11

+ xor edx,ebp

+ add ebx,ecx

+ ror ecx,7

+ movdqa xmm12,xmm11

+ xor esi,ebp

+ pslldq xmm3,12

+ paddd xmm11,xmm11

+ mov edi,ebx

+ add eax,DWORD[56+rsp]

+ psrld xmm12,31

+ xor ecx,edx

+ rol ebx,5

+ add eax,esi

+ movdqa xmm13,xmm3

+ and edi,ecx

+ xor ecx,edx

+ psrld xmm3,30

+ add eax,ebx

+ ror ebx,7

+ cmp r8d,11

+ jb NEAR $L$aesenclast1

+ movups xmm0,XMMWORD[64+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+r15]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast1

+ movups xmm0,XMMWORD[96+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+r15]

+DB 102,15,56,220,208

+$L$aesenclast1:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+r15]

+ por xmm11,xmm12

+ xor edi,edx

+ mov esi,eax

+ add ebp,DWORD[60+rsp]

+ pslld xmm13,2

+ pxor xmm11,xmm3

+ xor ebx,ecx

+ movdqa xmm3,XMMWORD[16+r11]

+ rol eax,5

+ add ebp,edi

+ and esi,ebx

+ pxor xmm11,xmm13

+ pshufd xmm13,xmm10,238

+ xor ebx,ecx

+ add ebp,eax

+ ror eax,7

+ pxor xmm4,xmm8

+ xor esi,ecx

+ mov edi,ebp

+ add edx,DWORD[rsp]

+ punpcklqdq xmm13,xmm11

+ xor eax,ebx

+ rol ebp,5

+ pxor xmm4,xmm5

+ add edx,esi

+ movups xmm14,XMMWORD[16+r12]

+ xorps xmm14,xmm15

+ movups XMMWORD[r13*1+r12],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+r15]

+DB 102,15,56,220,208

+ and edi,eax

+ movdqa xmm12,xmm3

+ xor eax,ebx

+ paddd xmm3,xmm11

+ add edx,ebp

+ pxor xmm4,xmm13

+ ror ebp,7

+ xor edi,ebx

+ mov esi,edx

+ add ecx,DWORD[4+rsp]

+ movdqa xmm13,xmm4

+ xor ebp,eax

+ rol edx,5

+ movdqa XMMWORD[48+rsp],xmm3

+ add ecx,edi

+ and esi,ebp

+ xor ebp,eax

+ pslld xmm4,2

+ add ecx,edx

+ ror edx,7

+ psrld xmm13,30

+ xor esi,eax

+ mov edi,ecx

+ add ebx,DWORD[8+rsp]

+ movups xmm0,XMMWORD[((-64))+r15]

+DB 102,15,56,220,209

+ por xmm4,xmm13

+ xor edx,ebp

+ rol ecx,5

+ pshufd xmm3,xmm11,238

+ add ebx,esi

+ and edi,edx

+ xor edx,ebp

+ add ebx,ecx

+ add eax,DWORD[12+rsp]

+ xor edi,ebp

+ mov esi,ebx

+ rol ebx,5

+ add eax,edi

+ xor esi,edx

+ ror ecx,7

+ add eax,ebx

+ pxor xmm5,xmm9

+ add ebp,DWORD[16+rsp]

+ movups xmm1,XMMWORD[((-48))+r15]

+DB 102,15,56,220,208

+ xor esi,ecx

+ punpcklqdq xmm3,xmm4

+ mov edi,eax

+ rol eax,5

+ pxor xmm5,xmm6

+ add ebp,esi

+ xor edi,ecx

+ movdqa xmm13,xmm12

+ ror ebx,7

+ paddd xmm12,xmm4

+ add ebp,eax

+ pxor xmm5,xmm3

+ add edx,DWORD[20+rsp]

+ xor edi,ebx

+ mov esi,ebp

+ rol ebp,5

+ movdqa xmm3,xmm5

+ add edx,edi

+ xor esi,ebx

+ movdqa XMMWORD[rsp],xmm12

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[24+rsp]

+ pslld xmm5,2

+ xor esi,eax

+ mov edi,edx

+ psrld xmm3,30

+ rol edx,5

+ add ecx,esi

+ movups xmm0,XMMWORD[((-32))+r15]

+DB 102,15,56,220,209

+ xor edi,eax

+ ror ebp,7

+ por xmm5,xmm3

+ add ecx,edx

+ add ebx,DWORD[28+rsp]

+ pshufd xmm12,xmm4,238

+ xor edi,ebp

+ mov esi,ecx

+ rol ecx,5

+ add ebx,edi

+ xor esi,ebp

+ ror edx,7

+ add ebx,ecx

+ pxor xmm6,xmm10

+ add eax,DWORD[32+rsp]

+ xor esi,edx

+ punpcklqdq xmm12,xmm5

+ mov edi,ebx

+ rol ebx,5

+ pxor xmm6,xmm7

+ add eax,esi

+ xor edi,edx

+ movdqa xmm3,XMMWORD[32+r11]

+ ror ecx,7

+ paddd xmm13,xmm5

+ add eax,ebx

+ pxor xmm6,xmm12

+ add ebp,DWORD[36+rsp]

+ movups xmm1,XMMWORD[((-16))+r15]

+DB 102,15,56,220,208

+ xor edi,ecx

+ mov esi,eax

+ rol eax,5

+ movdqa xmm12,xmm6

+ add ebp,edi

+ xor esi,ecx

+ movdqa XMMWORD[16+rsp],xmm13

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[40+rsp]

+ pslld xmm6,2

+ xor esi,ebx

+ mov edi,ebp

+ psrld xmm12,30

+ rol ebp,5

+ add edx,esi

+ xor edi,ebx

+ ror eax,7

+ por xmm6,xmm12

+ add edx,ebp

+ add ecx,DWORD[44+rsp]

+ pshufd xmm13,xmm5,238

+ xor edi,eax

+ mov esi,edx

+ rol edx,5

+ add ecx,edi

+ movups xmm0,XMMWORD[r15]

+DB 102,15,56,220,209

+ xor esi,eax

+ ror ebp,7

+ add ecx,edx

+ pxor xmm7,xmm11

+ add ebx,DWORD[48+rsp]

+ xor esi,ebp

+ punpcklqdq xmm13,xmm6

+ mov edi,ecx

+ rol ecx,5

+ pxor xmm7,xmm8

+ add ebx,esi

+ xor edi,ebp

+ movdqa xmm12,xmm3

+ ror edx,7

+ paddd xmm3,xmm6

+ add ebx,ecx

+ pxor xmm7,xmm13

+ add eax,DWORD[52+rsp]

+ xor edi,edx

+ mov esi,ebx

+ rol ebx,5

+ movdqa xmm13,xmm7

+ add eax,edi

+ xor esi,edx

+ movdqa XMMWORD[32+rsp],xmm3

+ ror ecx,7

+ add eax,ebx

+ add ebp,DWORD[56+rsp]

+ movups xmm1,XMMWORD[16+r15]

+DB 102,15,56,220,208

+ pslld xmm7,2

+ xor esi,ecx

+ mov edi,eax

+ psrld xmm13,30

+ rol eax,5

+ add ebp,esi

+ xor edi,ecx

+ ror ebx,7

+ por xmm7,xmm13

+ add ebp,eax

+ add edx,DWORD[60+rsp]

+ pshufd xmm3,xmm6,238

+ xor edi,ebx

+ mov esi,ebp

+ rol ebp,5

+ add edx,edi

+ xor esi,ebx

+ ror eax,7

+ add edx,ebp

+ pxor xmm8,xmm4

+ add ecx,DWORD[rsp]

+ xor esi,eax

+ punpcklqdq xmm3,xmm7

+ mov edi,edx

+ rol edx,5

+ pxor xmm8,xmm9

+ add ecx,esi

+ movups xmm0,XMMWORD[32+r15]

+DB 102,15,56,220,209

+ xor edi,eax

+ movdqa xmm13,xmm12

+ ror ebp,7

+ paddd xmm12,xmm7

+ add ecx,edx

+ pxor xmm8,xmm3

+ add ebx,DWORD[4+rsp]

+ xor edi,ebp

+ mov esi,ecx

+ rol ecx,5

+ movdqa xmm3,xmm8

+ add ebx,edi

+ xor esi,ebp

+ movdqa XMMWORD[48+rsp],xmm12

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[8+rsp]

+ pslld xmm8,2

+ xor esi,edx

+ mov edi,ebx

+ psrld xmm3,30

+ rol ebx,5

+ add eax,esi

+ xor edi,edx

+ ror ecx,7

+ por xmm8,xmm3

+ add eax,ebx

+ add ebp,DWORD[12+rsp]

+ movups xmm1,XMMWORD[48+r15]

+DB 102,15,56,220,208

+ pshufd xmm12,xmm7,238

+ xor edi,ecx

+ mov esi,eax

+ rol eax,5

+ add ebp,edi

+ xor esi,ecx

+ ror ebx,7

+ add ebp,eax

+ pxor xmm9,xmm5

+ add edx,DWORD[16+rsp]

+ xor esi,ebx

+ punpcklqdq xmm12,xmm8

+ mov edi,ebp

+ rol ebp,5

+ pxor xmm9,xmm10

+ add edx,esi

+ xor edi,ebx

+ movdqa xmm3,xmm13

+ ror eax,7

+ paddd xmm13,xmm8

+ add edx,ebp

+ pxor xmm9,xmm12

+ add ecx,DWORD[20+rsp]

+ xor edi,eax

+ mov esi,edx

+ rol edx,5

+ movdqa xmm12,xmm9

+ add ecx,edi

+ cmp r8d,11

+ jb NEAR $L$aesenclast2

+ movups xmm0,XMMWORD[64+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+r15]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast2

+ movups xmm0,XMMWORD[96+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+r15]

+DB 102,15,56,220,208

+$L$aesenclast2:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+r15]

+ xor esi,eax

+ movdqa XMMWORD[rsp],xmm13

+ ror ebp,7

+ add ecx,edx

+ add ebx,DWORD[24+rsp]

+ pslld xmm9,2

+ xor esi,ebp

+ mov edi,ecx

+ psrld xmm12,30

+ rol ecx,5

+ add ebx,esi

+ xor edi,ebp

+ ror edx,7

+ por xmm9,xmm12

+ add ebx,ecx

+ add eax,DWORD[28+rsp]

+ pshufd xmm13,xmm8,238

+ ror ecx,7

+ mov esi,ebx

+ xor edi,edx

+ rol ebx,5

+ add eax,edi

+ xor esi,ecx

+ xor ecx,edx

+ add eax,ebx

+ pxor xmm10,xmm6

+ add ebp,DWORD[32+rsp]

+ movups xmm14,XMMWORD[32+r12]

+ xorps xmm14,xmm15

+ movups XMMWORD[16+r12*1+r13],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+r15]

+DB 102,15,56,220,208

+ and esi,ecx

+ xor ecx,edx

+ ror ebx,7

+ punpcklqdq xmm13,xmm9

+ mov edi,eax

+ xor esi,ecx

+ pxor xmm10,xmm11

+ rol eax,5

+ add ebp,esi

+ movdqa xmm12,xmm3

+ xor edi,ebx

+ paddd xmm3,xmm9

+ xor ebx,ecx

+ pxor xmm10,xmm13

+ add ebp,eax

+ add edx,DWORD[36+rsp]

+ and edi,ebx

+ xor ebx,ecx

+ ror eax,7

+ movdqa xmm13,xmm10

+ mov esi,ebp

+ xor edi,ebx

+ movdqa XMMWORD[16+rsp],xmm3

+ rol ebp,5

+ add edx,edi

+ movups xmm0,XMMWORD[((-64))+r15]

+DB 102,15,56,220,209

+ xor esi,eax

+ pslld xmm10,2

+ xor eax,ebx

+ add edx,ebp

+ psrld xmm13,30

+ add ecx,DWORD[40+rsp]

+ and esi,eax

+ xor eax,ebx

+ por xmm10,xmm13

+ ror ebp,7

+ mov edi,edx

+ xor esi,eax

+ rol edx,5

+ pshufd xmm3,xmm9,238

+ add ecx,esi

+ xor edi,ebp

+ xor ebp,eax

+ add ecx,edx

+ add ebx,DWORD[44+rsp]

+ and edi,ebp

+ xor ebp,eax

+ ror edx,7

+ movups xmm1,XMMWORD[((-48))+r15]

+DB 102,15,56,220,208

+ mov esi,ecx

+ xor edi,ebp

+ rol ecx,5

+ add ebx,edi

+ xor esi,edx

+ xor edx,ebp

+ add ebx,ecx

+ pxor xmm11,xmm7

+ add eax,DWORD[48+rsp]

+ and esi,edx

+ xor edx,ebp

+ ror ecx,7

+ punpcklqdq xmm3,xmm10

+ mov edi,ebx

+ xor esi,edx

+ pxor xmm11,xmm4

+ rol ebx,5

+ add eax,esi

+ movdqa xmm13,XMMWORD[48+r11]

+ xor edi,ecx

+ paddd xmm12,xmm10

+ xor ecx,edx

+ pxor xmm11,xmm3

+ add eax,ebx

+ add ebp,DWORD[52+rsp]

+ movups xmm0,XMMWORD[((-32))+r15]

+DB 102,15,56,220,209

+ and edi,ecx

+ xor ecx,edx

+ ror ebx,7

+ movdqa xmm3,xmm11

+ mov esi,eax

+ xor edi,ecx

+ movdqa XMMWORD[32+rsp],xmm12

+ rol eax,5

+ add ebp,edi

+ xor esi,ebx

+ pslld xmm11,2

+ xor ebx,ecx

+ add ebp,eax

+ psrld xmm3,30

+ add edx,DWORD[56+rsp]

+ and esi,ebx

+ xor ebx,ecx

+ por xmm11,xmm3

+ ror eax,7

+ mov edi,ebp

+ xor esi,ebx

+ rol ebp,5

+ pshufd xmm12,xmm10,238

+ add edx,esi

+ movups xmm1,XMMWORD[((-16))+r15]

+DB 102,15,56,220,208

+ xor edi,eax

+ xor eax,ebx

+ add edx,ebp

+ add ecx,DWORD[60+rsp]

+ and edi,eax

+ xor eax,ebx

+ ror ebp,7

+ mov esi,edx

+ xor edi,eax

+ rol edx,5

+ add ecx,edi

+ xor esi,ebp

+ xor ebp,eax

+ add ecx,edx

+ pxor xmm4,xmm8

+ add ebx,DWORD[rsp]

+ and esi,ebp

+ xor ebp,eax

+ ror edx,7

+ movups xmm0,XMMWORD[r15]

+DB 102,15,56,220,209

+ punpcklqdq xmm12,xmm11

+ mov edi,ecx

+ xor esi,ebp

+ pxor xmm4,xmm5

+ rol ecx,5

+ add ebx,esi

+ movdqa xmm3,xmm13

+ xor edi,edx

+ paddd xmm13,xmm11

+ xor edx,ebp

+ pxor xmm4,xmm12

+ add ebx,ecx

+ add eax,DWORD[4+rsp]

+ and edi,edx

+ xor edx,ebp

+ ror ecx,7

+ movdqa xmm12,xmm4

+ mov esi,ebx

+ xor edi,edx

+ movdqa XMMWORD[48+rsp],xmm13

+ rol ebx,5

+ add eax,edi

+ xor esi,ecx

+ pslld xmm4,2

+ xor ecx,edx

+ add eax,ebx

+ psrld xmm12,30

+ add ebp,DWORD[8+rsp]

+ movups xmm1,XMMWORD[16+r15]

+DB 102,15,56,220,208

+ and esi,ecx

+ xor ecx,edx

+ por xmm4,xmm12

+ ror ebx,7

+ mov edi,eax

+ xor esi,ecx

+ rol eax,5

+ pshufd xmm13,xmm11,238

+ add ebp,esi

+ xor edi,ebx

+ xor ebx,ecx

+ add ebp,eax

+ add edx,DWORD[12+rsp]

+ and edi,ebx

+ xor ebx,ecx

+ ror eax,7

+ mov esi,ebp

+ xor edi,ebx

+ rol ebp,5

+ add edx,edi

+ movups xmm0,XMMWORD[32+r15]

+DB 102,15,56,220,209

+ xor esi,eax

+ xor eax,ebx

+ add edx,ebp

+ pxor xmm5,xmm9

+ add ecx,DWORD[16+rsp]

+ and esi,eax

+ xor eax,ebx

+ ror ebp,7

+ punpcklqdq xmm13,xmm4

+ mov edi,edx

+ xor esi,eax

+ pxor xmm5,xmm6

+ rol edx,5

+ add ecx,esi

+ movdqa xmm12,xmm3

+ xor edi,ebp

+ paddd xmm3,xmm4

+ xor ebp,eax

+ pxor xmm5,xmm13

+ add ecx,edx

+ add ebx,DWORD[20+rsp]

+ and edi,ebp

+ xor ebp,eax

+ ror edx,7

+ movups xmm1,XMMWORD[48+r15]

+DB 102,15,56,220,208

+ movdqa xmm13,xmm5

+ mov esi,ecx

+ xor edi,ebp

+ movdqa XMMWORD[rsp],xmm3

+ rol ecx,5

+ add ebx,edi

+ xor esi,edx

+ pslld xmm5,2

+ xor edx,ebp

+ add ebx,ecx

+ psrld xmm13,30

+ add eax,DWORD[24+rsp]

+ and esi,edx

+ xor edx,ebp

+ por xmm5,xmm13

+ ror ecx,7

+ mov edi,ebx

+ xor esi,edx

+ rol ebx,5

+ pshufd xmm3,xmm4,238

+ add eax,esi

+ xor edi,ecx

+ xor ecx,edx

+ add eax,ebx

+ add ebp,DWORD[28+rsp]

+ cmp r8d,11

+ jb NEAR $L$aesenclast3

+ movups xmm0,XMMWORD[64+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+r15]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast3

+ movups xmm0,XMMWORD[96+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+r15]

+DB 102,15,56,220,208

+$L$aesenclast3:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+r15]

+ and edi,ecx

+ xor ecx,edx

+ ror ebx,7

+ mov esi,eax

+ xor edi,ecx

+ rol eax,5

+ add ebp,edi

+ xor esi,ebx

+ xor ebx,ecx

+ add ebp,eax

+ pxor xmm6,xmm10

+ add edx,DWORD[32+rsp]

+ and esi,ebx

+ xor ebx,ecx

+ ror eax,7

+ punpcklqdq xmm3,xmm5

+ mov edi,ebp

+ xor esi,ebx

+ pxor xmm6,xmm7

+ rol ebp,5

+ add edx,esi

+ movups xmm14,XMMWORD[48+r12]

+ xorps xmm14,xmm15

+ movups XMMWORD[32+r12*1+r13],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+r15]

+DB 102,15,56,220,208

+ movdqa xmm13,xmm12

+ xor edi,eax

+ paddd xmm12,xmm5

+ xor eax,ebx

+ pxor xmm6,xmm3

+ add edx,ebp

+ add ecx,DWORD[36+rsp]

+ and edi,eax

+ xor eax,ebx

+ ror ebp,7

+ movdqa xmm3,xmm6

+ mov esi,edx

+ xor edi,eax

+ movdqa XMMWORD[16+rsp],xmm12

+ rol edx,5

+ add ecx,edi

+ xor esi,ebp

+ pslld xmm6,2

+ xor ebp,eax

+ add ecx,edx

+ psrld xmm3,30

+ add ebx,DWORD[40+rsp]

+ and esi,ebp

+ xor ebp,eax

+ por xmm6,xmm3

+ ror edx,7

+ movups xmm0,XMMWORD[((-64))+r15]

+DB 102,15,56,220,209

+ mov edi,ecx

+ xor esi,ebp

+ rol ecx,5

+ pshufd xmm12,xmm5,238

+ add ebx,esi

+ xor edi,edx

+ xor edx,ebp

+ add ebx,ecx

+ add eax,DWORD[44+rsp]

+ and edi,edx

+ xor edx,ebp

+ ror ecx,7

+ mov esi,ebx

+ xor edi,edx

+ rol ebx,5

+ add eax,edi

+ xor esi,edx

+ add eax,ebx

+ pxor xmm7,xmm11

+ add ebp,DWORD[48+rsp]

+ movups xmm1,XMMWORD[((-48))+r15]

+DB 102,15,56,220,208

+ xor esi,ecx

+ punpcklqdq xmm12,xmm6

+ mov edi,eax

+ rol eax,5

+ pxor xmm7,xmm8

+ add ebp,esi

+ xor edi,ecx

+ movdqa xmm3,xmm13

+ ror ebx,7

+ paddd xmm13,xmm6

+ add ebp,eax

+ pxor xmm7,xmm12

+ add edx,DWORD[52+rsp]

+ xor edi,ebx

+ mov esi,ebp

+ rol ebp,5

+ movdqa xmm12,xmm7

+ add edx,edi

+ xor esi,ebx

+ movdqa XMMWORD[32+rsp],xmm13

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[56+rsp]

+ pslld xmm7,2

+ xor esi,eax

+ mov edi,edx

+ psrld xmm12,30

+ rol edx,5

+ add ecx,esi

+ movups xmm0,XMMWORD[((-32))+r15]

+DB 102,15,56,220,209

+ xor edi,eax

+ ror ebp,7

+ por xmm7,xmm12

+ add ecx,edx

+ add ebx,DWORD[60+rsp]

+ xor edi,ebp

+ mov esi,ecx

+ rol ecx,5

+ add ebx,edi

+ xor esi,ebp

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[rsp]

+ xor esi,edx

+ mov edi,ebx

+ rol ebx,5

+ paddd xmm3,xmm7

+ add eax,esi

+ xor edi,edx

+ movdqa XMMWORD[48+rsp],xmm3

+ ror ecx,7

+ add eax,ebx

+ add ebp,DWORD[4+rsp]

+ movups xmm1,XMMWORD[((-16))+r15]

+DB 102,15,56,220,208

+ xor edi,ecx

+ mov esi,eax

+ rol eax,5

+ add ebp,edi

+ xor esi,ecx

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[8+rsp]

+ xor esi,ebx

+ mov edi,ebp

+ rol ebp,5

+ add edx,esi

+ xor edi,ebx

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[12+rsp]

+ xor edi,eax

+ mov esi,edx

+ rol edx,5

+ add ecx,edi

+ movups xmm0,XMMWORD[r15]

+DB 102,15,56,220,209

+ xor esi,eax

+ ror ebp,7

+ add ecx,edx

+ cmp r10,r14

+ je NEAR $L$done_ssse3

+ movdqa xmm3,XMMWORD[64+r11]

+ movdqa xmm13,XMMWORD[r11]

+ movdqu xmm4,XMMWORD[r10]

+ movdqu xmm5,XMMWORD[16+r10]

+ movdqu xmm6,XMMWORD[32+r10]

+ movdqu xmm7,XMMWORD[48+r10]

+DB 102,15,56,0,227

+ add r10,64

+ add ebx,DWORD[16+rsp]

+ xor esi,ebp

+ mov edi,ecx

+DB 102,15,56,0,235

+ rol ecx,5

+ add ebx,esi

+ xor edi,ebp

+ ror edx,7

+ paddd xmm4,xmm13

+ add ebx,ecx

+ add eax,DWORD[20+rsp]

+ xor edi,edx

+ mov esi,ebx

+ movdqa XMMWORD[rsp],xmm4

+ rol ebx,5

+ add eax,edi

+ xor esi,edx

+ ror ecx,7

+ psubd xmm4,xmm13

+ add eax,ebx

+ add ebp,DWORD[24+rsp]

+ movups xmm1,XMMWORD[16+r15]

+DB 102,15,56,220,208

+ xor esi,ecx

+ mov edi,eax

+ rol eax,5

+ add ebp,esi

+ xor edi,ecx

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[28+rsp]

+ xor edi,ebx

+ mov esi,ebp

+ rol ebp,5

+ add edx,edi

+ xor esi,ebx

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[32+rsp]

+ xor esi,eax

+ mov edi,edx

+DB 102,15,56,0,243

+ rol edx,5

+ add ecx,esi

+ movups xmm0,XMMWORD[32+r15]

+DB 102,15,56,220,209

+ xor edi,eax

+ ror ebp,7

+ paddd xmm5,xmm13

+ add ecx,edx

+ add ebx,DWORD[36+rsp]

+ xor edi,ebp

+ mov esi,ecx

+ movdqa XMMWORD[16+rsp],xmm5

+ rol ecx,5

+ add ebx,edi

+ xor esi,ebp

+ ror edx,7

+ psubd xmm5,xmm13

+ add ebx,ecx

+ add eax,DWORD[40+rsp]

+ xor esi,edx

+ mov edi,ebx

+ rol ebx,5

+ add eax,esi

+ xor edi,edx

+ ror ecx,7

+ add eax,ebx

+ add ebp,DWORD[44+rsp]

+ movups xmm1,XMMWORD[48+r15]

+DB 102,15,56,220,208

+ xor edi,ecx

+ mov esi,eax

+ rol eax,5

+ add ebp,edi

+ xor esi,ecx

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[48+rsp]

+ xor esi,ebx

+ mov edi,ebp

+DB 102,15,56,0,251

+ rol ebp,5

+ add edx,esi

+ xor edi,ebx

+ ror eax,7

+ paddd xmm6,xmm13

+ add edx,ebp

+ add ecx,DWORD[52+rsp]

+ xor edi,eax

+ mov esi,edx

+ movdqa XMMWORD[32+rsp],xmm6

+ rol edx,5

+ add ecx,edi

+ cmp r8d,11

+ jb NEAR $L$aesenclast4

+ movups xmm0,XMMWORD[64+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+r15]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast4

+ movups xmm0,XMMWORD[96+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+r15]

+DB 102,15,56,220,208

+$L$aesenclast4:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+r15]

+ xor esi,eax

+ ror ebp,7

+ psubd xmm6,xmm13

+ add ecx,edx

+ add ebx,DWORD[56+rsp]

+ xor esi,ebp

+ mov edi,ecx

+ rol ecx,5

+ add ebx,esi

+ xor edi,ebp

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[60+rsp]

+ xor edi,edx

+ mov esi,ebx

+ rol ebx,5

+ add eax,edi

+ ror ecx,7

+ add eax,ebx

+ movups XMMWORD[48+r12*1+r13],xmm2

+ lea r12,[64+r12]

+

+ add eax,DWORD[r9]

+ add esi,DWORD[4+r9]

+ add ecx,DWORD[8+r9]

+ add edx,DWORD[12+r9]

+ mov DWORD[r9],eax

+ add ebp,DWORD[16+r9]

+ mov DWORD[4+r9],esi

+ mov ebx,esi

+ mov DWORD[8+r9],ecx

+ mov edi,ecx

+ mov DWORD[12+r9],edx

+ xor edi,edx

+ mov DWORD[16+r9],ebp

+ and esi,edi

+ jmp NEAR $L$oop_ssse3

+

+$L$done_ssse3:

+ add ebx,DWORD[16+rsp]

+ xor esi,ebp

+ mov edi,ecx

+ rol ecx,5

+ add ebx,esi

+ xor edi,ebp

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[20+rsp]

+ xor edi,edx

+ mov esi,ebx

+ rol ebx,5

+ add eax,edi

+ xor esi,edx

+ ror ecx,7

+ add eax,ebx

+ add ebp,DWORD[24+rsp]

+ movups xmm1,XMMWORD[16+r15]

+DB 102,15,56,220,208

+ xor esi,ecx

+ mov edi,eax

+ rol eax,5

+ add ebp,esi

+ xor edi,ecx

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[28+rsp]

+ xor edi,ebx

+ mov esi,ebp

+ rol ebp,5

+ add edx,edi

+ xor esi,ebx

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[32+rsp]

+ xor esi,eax

+ mov edi,edx

+ rol edx,5

+ add ecx,esi

+ movups xmm0,XMMWORD[32+r15]

+DB 102,15,56,220,209

+ xor edi,eax

+ ror ebp,7

+ add ecx,edx

+ add ebx,DWORD[36+rsp]

+ xor edi,ebp

+ mov esi,ecx

+ rol ecx,5

+ add ebx,edi

+ xor esi,ebp

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[40+rsp]

+ xor esi,edx

+ mov edi,ebx

+ rol ebx,5

+ add eax,esi

+ xor edi,edx

+ ror ecx,7

+ add eax,ebx

+ add ebp,DWORD[44+rsp]

+ movups xmm1,XMMWORD[48+r15]

+DB 102,15,56,220,208

+ xor edi,ecx

+ mov esi,eax

+ rol eax,5

+ add ebp,edi

+ xor esi,ecx

+ ror ebx,7

+ add ebp,eax

+ add edx,DWORD[48+rsp]

+ xor esi,ebx

+ mov edi,ebp

+ rol ebp,5

+ add edx,esi

+ xor edi,ebx

+ ror eax,7

+ add edx,ebp

+ add ecx,DWORD[52+rsp]

+ xor edi,eax

+ mov esi,edx

+ rol edx,5

+ add ecx,edi

+ cmp r8d,11

+ jb NEAR $L$aesenclast5

+ movups xmm0,XMMWORD[64+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+r15]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast5

+ movups xmm0,XMMWORD[96+r15]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+r15]

+DB 102,15,56,220,208

+$L$aesenclast5:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+r15]

+ xor esi,eax

+ ror ebp,7

+ add ecx,edx

+ add ebx,DWORD[56+rsp]

+ xor esi,ebp

+ mov edi,ecx

+ rol ecx,5

+ add ebx,esi

+ xor edi,ebp

+ ror edx,7

+ add ebx,ecx

+ add eax,DWORD[60+rsp]

+ xor edi,edx

+ mov esi,ebx

+ rol ebx,5

+ add eax,edi

+ ror ecx,7

+ add eax,ebx

+ movups XMMWORD[48+r12*1+r13],xmm2

+ mov r8,QWORD[88+rsp]

+

+ add eax,DWORD[r9]

+ add esi,DWORD[4+r9]

+ add ecx,DWORD[8+r9]

+ mov DWORD[r9],eax

+ add edx,DWORD[12+r9]

+ mov DWORD[4+r9],esi

+ add ebp,DWORD[16+r9]

+ mov DWORD[8+r9],ecx

+ mov DWORD[12+r9],edx

+ mov DWORD[16+r9],ebp

+ movups XMMWORD[r8],xmm2

+ movaps xmm6,XMMWORD[((96+0))+rsp]

+ movaps xmm7,XMMWORD[((96+16))+rsp]

+ movaps xmm8,XMMWORD[((96+32))+rsp]

+ movaps xmm9,XMMWORD[((96+48))+rsp]

+ movaps xmm10,XMMWORD[((96+64))+rsp]

+ movaps xmm11,XMMWORD[((96+80))+rsp]

+ movaps xmm12,XMMWORD[((96+96))+rsp]

+ movaps xmm13,XMMWORD[((96+112))+rsp]

+ movaps xmm14,XMMWORD[((96+128))+rsp]

+ movaps xmm15,XMMWORD[((96+144))+rsp]

+ lea rsi,[264+rsp]

+

+ mov r15,QWORD[rsi]

+

+ mov r14,QWORD[8+rsi]

+

+ mov r13,QWORD[16+rsi]

+

+ mov r12,QWORD[24+rsi]

+

+ mov rbp,QWORD[32+rsi]

+

+ mov rbx,QWORD[40+rsi]

+

+ lea rsp,[48+rsi]

+

+$L$epilogue_ssse3:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_cbc_sha1_enc_ssse3:

+ALIGN 64

+K_XX_XX:

+ DD 0x5a827999,0x5a827999,0x5a827999,0x5a827999

+ DD 0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1

+ DD 0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc

+ DD 0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6

+ DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f

+DB 0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0

+

+DB 65,69,83,78,73,45,67,66,67,43,83,72,65,49,32,115

+DB 116,105,116,99,104,32,102,111,114,32,120,56,54,95,54,52

+DB 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32

+DB 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111

+DB 114,103,62,0

+ALIGN 64

+

+ALIGN 32

+aesni_cbc_sha1_enc_shaext:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_cbc_sha1_enc_shaext:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ mov r10,QWORD[56+rsp]

+ lea rsp,[((-168))+rsp]

+ movaps XMMWORD[(-8-160)+rax],xmm6

+ movaps XMMWORD[(-8-144)+rax],xmm7

+ movaps XMMWORD[(-8-128)+rax],xmm8

+ movaps XMMWORD[(-8-112)+rax],xmm9

+ movaps XMMWORD[(-8-96)+rax],xmm10

+ movaps XMMWORD[(-8-80)+rax],xmm11

+ movaps XMMWORD[(-8-64)+rax],xmm12

+ movaps XMMWORD[(-8-48)+rax],xmm13

+ movaps XMMWORD[(-8-32)+rax],xmm14

+ movaps XMMWORD[(-8-16)+rax],xmm15

+$L$prologue_shaext:

+ movdqu xmm8,XMMWORD[r9]

+ movd xmm9,DWORD[16+r9]

+ movdqa xmm7,XMMWORD[((K_XX_XX+80))]

+

+ mov r11d,DWORD[240+rcx]

+ sub rsi,rdi

+ movups xmm15,XMMWORD[rcx]

+ movups xmm2,XMMWORD[r8]

+ movups xmm0,XMMWORD[16+rcx]

+ lea rcx,[112+rcx]

+

+ pshufd xmm8,xmm8,27

+ pshufd xmm9,xmm9,27

+ jmp NEAR $L$oop_shaext

+

+ALIGN 16

+$L$oop_shaext:

+ movups xmm14,XMMWORD[rdi]

+ xorps xmm14,xmm15

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+rcx]

+DB 102,15,56,220,208

+ movdqu xmm3,XMMWORD[r10]

+ movdqa xmm12,xmm9

+DB 102,15,56,0,223

+ movdqu xmm4,XMMWORD[16+r10]

+ movdqa xmm11,xmm8

+ movups xmm0,XMMWORD[((-64))+rcx]

+DB 102,15,56,220,209

+DB 102,15,56,0,231

+

+ paddd xmm9,xmm3

+ movdqu xmm5,XMMWORD[32+r10]

+ lea r10,[64+r10]

+ pxor xmm3,xmm12

+ movups xmm1,XMMWORD[((-48))+rcx]

+DB 102,15,56,220,208

+ pxor xmm3,xmm12

+ movdqa xmm10,xmm8

+DB 102,15,56,0,239

+DB 69,15,58,204,193,0

+DB 68,15,56,200,212

+ movups xmm0,XMMWORD[((-32))+rcx]

+DB 102,15,56,220,209

+DB 15,56,201,220

+ movdqu xmm6,XMMWORD[((-16))+r10]

+ movdqa xmm9,xmm8

+DB 102,15,56,0,247

+ movups xmm1,XMMWORD[((-16))+rcx]

+DB 102,15,56,220,208

+DB 69,15,58,204,194,0

+DB 68,15,56,200,205

+ pxor xmm3,xmm5

+DB 15,56,201,229

+ movups xmm0,XMMWORD[rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,0

+DB 68,15,56,200,214

+ movups xmm1,XMMWORD[16+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,222

+ pxor xmm4,xmm6

+DB 15,56,201,238

+ movups xmm0,XMMWORD[32+rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,0

+DB 68,15,56,200,203

+ movups xmm1,XMMWORD[48+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,227

+ pxor xmm5,xmm3

+DB 15,56,201,243

+ cmp r11d,11

+ jb NEAR $L$aesenclast6

+ movups xmm0,XMMWORD[64+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+rcx]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast6

+ movups xmm0,XMMWORD[96+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+rcx]

+DB 102,15,56,220,208

+$L$aesenclast6:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+rcx]

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,0

+DB 68,15,56,200,212

+ movups xmm14,XMMWORD[16+rdi]

+ xorps xmm14,xmm15

+ movups XMMWORD[rdi*1+rsi],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,236

+ pxor xmm6,xmm4

+DB 15,56,201,220

+ movups xmm0,XMMWORD[((-64))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,1

+DB 68,15,56,200,205

+ movups xmm1,XMMWORD[((-48))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,245

+ pxor xmm3,xmm5

+DB 15,56,201,229

+ movups xmm0,XMMWORD[((-32))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,1

+DB 68,15,56,200,214

+ movups xmm1,XMMWORD[((-16))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,222

+ pxor xmm4,xmm6

+DB 15,56,201,238

+ movups xmm0,XMMWORD[rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,1

+DB 68,15,56,200,203

+ movups xmm1,XMMWORD[16+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,227

+ pxor xmm5,xmm3

+DB 15,56,201,243

+ movups xmm0,XMMWORD[32+rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,1

+DB 68,15,56,200,212

+ movups xmm1,XMMWORD[48+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,236

+ pxor xmm6,xmm4

+DB 15,56,201,220

+ cmp r11d,11

+ jb NEAR $L$aesenclast7

+ movups xmm0,XMMWORD[64+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+rcx]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast7

+ movups xmm0,XMMWORD[96+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+rcx]

+DB 102,15,56,220,208

+$L$aesenclast7:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+rcx]

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,1

+DB 68,15,56,200,205

+ movups xmm14,XMMWORD[32+rdi]

+ xorps xmm14,xmm15

+ movups XMMWORD[16+rdi*1+rsi],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,245

+ pxor xmm3,xmm5

+DB 15,56,201,229

+ movups xmm0,XMMWORD[((-64))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,2

+DB 68,15,56,200,214

+ movups xmm1,XMMWORD[((-48))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,222

+ pxor xmm4,xmm6

+DB 15,56,201,238

+ movups xmm0,XMMWORD[((-32))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,2

+DB 68,15,56,200,203

+ movups xmm1,XMMWORD[((-16))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,227

+ pxor xmm5,xmm3

+DB 15,56,201,243

+ movups xmm0,XMMWORD[rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,2

+DB 68,15,56,200,212

+ movups xmm1,XMMWORD[16+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,236

+ pxor xmm6,xmm4

+DB 15,56,201,220

+ movups xmm0,XMMWORD[32+rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,2

+DB 68,15,56,200,205

+ movups xmm1,XMMWORD[48+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,245

+ pxor xmm3,xmm5

+DB 15,56,201,229

+ cmp r11d,11

+ jb NEAR $L$aesenclast8

+ movups xmm0,XMMWORD[64+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+rcx]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast8

+ movups xmm0,XMMWORD[96+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+rcx]

+DB 102,15,56,220,208

+$L$aesenclast8:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+rcx]

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,2

+DB 68,15,56,200,214

+ movups xmm14,XMMWORD[48+rdi]

+ xorps xmm14,xmm15

+ movups XMMWORD[32+rdi*1+rsi],xmm2

+ xorps xmm2,xmm14

+ movups xmm1,XMMWORD[((-80))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,222

+ pxor xmm4,xmm6

+DB 15,56,201,238

+ movups xmm0,XMMWORD[((-64))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,3

+DB 68,15,56,200,203

+ movups xmm1,XMMWORD[((-48))+rcx]

+DB 102,15,56,220,208

+DB 15,56,202,227

+ pxor xmm5,xmm3

+DB 15,56,201,243

+ movups xmm0,XMMWORD[((-32))+rcx]

+DB 102,15,56,220,209

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,3

+DB 68,15,56,200,212

+DB 15,56,202,236

+ pxor xmm6,xmm4

+ movups xmm1,XMMWORD[((-16))+rcx]

+DB 102,15,56,220,208

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,3

+DB 68,15,56,200,205

+DB 15,56,202,245

+ movups xmm0,XMMWORD[rcx]

+DB 102,15,56,220,209

+ movdqa xmm5,xmm12

+ movdqa xmm10,xmm8

+DB 69,15,58,204,193,3

+DB 68,15,56,200,214

+ movups xmm1,XMMWORD[16+rcx]

+DB 102,15,56,220,208

+ movdqa xmm9,xmm8

+DB 69,15,58,204,194,3

+DB 68,15,56,200,205

+ movups xmm0,XMMWORD[32+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[48+rcx]

+DB 102,15,56,220,208

+ cmp r11d,11

+ jb NEAR $L$aesenclast9

+ movups xmm0,XMMWORD[64+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[80+rcx]

+DB 102,15,56,220,208

+ je NEAR $L$aesenclast9

+ movups xmm0,XMMWORD[96+rcx]

+DB 102,15,56,220,209

+ movups xmm1,XMMWORD[112+rcx]

+DB 102,15,56,220,208

+$L$aesenclast9:

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[((16-112))+rcx]

+ dec rdx

+

+ paddd xmm8,xmm11

+ movups XMMWORD[48+rdi*1+rsi],xmm2

+ lea rdi,[64+rdi]

+ jnz NEAR $L$oop_shaext

+

+ pshufd xmm8,xmm8,27

+ pshufd xmm9,xmm9,27

+ movups XMMWORD[r8],xmm2

+ movdqu XMMWORD[r9],xmm8

+ movd DWORD[16+r9],xmm9

+ movaps xmm6,XMMWORD[((-8-160))+rax]

+ movaps xmm7,XMMWORD[((-8-144))+rax]

+ movaps xmm8,XMMWORD[((-8-128))+rax]

+ movaps xmm9,XMMWORD[((-8-112))+rax]

+ movaps xmm10,XMMWORD[((-8-96))+rax]

+ movaps xmm11,XMMWORD[((-8-80))+rax]

+ movaps xmm12,XMMWORD[((-8-64))+rax]

+ movaps xmm13,XMMWORD[((-8-48))+rax]

+ movaps xmm14,XMMWORD[((-8-32))+rax]

+ movaps xmm15,XMMWORD[((-8-16))+rax]

+ mov rsp,rax

+$L$epilogue_shaext:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_cbc_sha1_enc_shaext:

+EXTERN __imp_RtlVirtualUnwind

+

+ALIGN 16

+ssse3_handler:

+ push rsi

+ push rdi

+ push rbx

+ push rbp

+ push r12

+ push r13

+ push r14

+ push r15

+ pushfq

+ sub rsp,64

+

+ mov rax,QWORD[120+r8]

+ mov rbx,QWORD[248+r8]

+

+ mov rsi,QWORD[8+r9]

+ mov r11,QWORD[56+r9]

+

+ mov r10d,DWORD[r11]

+ lea r10,[r10*1+rsi]

+ cmp rbx,r10

+ jb NEAR $L$common_seh_tail

+

+ mov rax,QWORD[152+r8]

+

+ mov r10d,DWORD[4+r11]

+ lea r10,[r10*1+rsi]

+ cmp rbx,r10

+ jae NEAR $L$common_seh_tail

+ lea r10,[aesni_cbc_sha1_enc_shaext]

+ cmp rbx,r10

+ jb NEAR $L$seh_no_shaext

+

+ lea rsi,[rax]

+ lea rdi,[512+r8]

+ mov ecx,20

+ DD 0xa548f3fc

+ lea rax,[168+rax]

+ jmp NEAR $L$common_seh_tail

+$L$seh_no_shaext:

+ lea rsi,[96+rax]

+ lea rdi,[512+r8]

+ mov ecx,20

+ DD 0xa548f3fc

+ lea rax,[264+rax]

+

+ mov r15,QWORD[rax]

+ mov r14,QWORD[8+rax]

+ mov r13,QWORD[16+rax]

+ mov r12,QWORD[24+rax]

+ mov rbp,QWORD[32+rax]

+ mov rbx,QWORD[40+rax]

+ lea rax,[48+rax]

+ mov QWORD[144+r8],rbx

+ mov QWORD[160+r8],rbp

+ mov QWORD[216+r8],r12

+ mov QWORD[224+r8],r13

+ mov QWORD[232+r8],r14

+ mov QWORD[240+r8],r15

+

+$L$common_seh_tail:

+ mov rdi,QWORD[8+rax]

+ mov rsi,QWORD[16+rax]

+ mov QWORD[152+r8],rax

+ mov QWORD[168+r8],rsi

+ mov QWORD[176+r8],rdi

+

+ mov rdi,QWORD[40+r9]

+ mov rsi,r8

+ mov ecx,154

+ DD 0xa548f3fc

+

+ mov rsi,r9

+ xor rcx,rcx

+ mov rdx,QWORD[8+rsi]

+ mov r8,QWORD[rsi]

+ mov r9,QWORD[16+rsi]

+ mov r10,QWORD[40+rsi]

+ lea r11,[56+rsi]

+ lea r12,[24+rsi]

+ mov QWORD[32+rsp],r10

+ mov QWORD[40+rsp],r11

+ mov QWORD[48+rsp],r12

+ mov QWORD[56+rsp],rcx

+ call QWORD[__imp_RtlVirtualUnwind]

+

+ mov eax,1

+ add rsp,64

+ popfq

+ pop r15

+ pop r14

+ pop r13

+ pop r12

+ pop rbp

+ pop rbx

+ pop rdi

+ pop rsi

+ DB 0F3h,0C3h ;repret

+

+

+section .pdata rdata align=4

+ALIGN 4

+ DD $L$SEH_begin_aesni_cbc_sha1_enc_ssse3 wrt ..imagebase

+ DD $L$SEH_end_aesni_cbc_sha1_enc_ssse3 wrt ..imagebase

+ DD $L$SEH_info_aesni_cbc_sha1_enc_ssse3 wrt ..imagebase

+ DD $L$SEH_begin_aesni_cbc_sha1_enc_shaext wrt ..imagebase

+ DD $L$SEH_end_aesni_cbc_sha1_enc_shaext wrt ..imagebase

+ DD $L$SEH_info_aesni_cbc_sha1_enc_shaext wrt ..imagebase

+section .xdata rdata align=8

+ALIGN 8

+$L$SEH_info_aesni_cbc_sha1_enc_ssse3:

+DB 9,0,0,0

+ DD ssse3_handler wrt ..imagebase

+ DD $L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3
wrt ..imagebase

+$L$SEH_info_aesni_cbc_sha1_enc_shaext:

+DB 9,0,0,0

+ DD ssse3_handler wrt ..imagebase

+ DD $L$prologue_shaext wrt ..imagebase,$L$epilogue_shaext
wrt ..imagebase

diff --git a/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha256-
x86_64.nasm b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-
sha256-
x86_64.nasm
new file mode 100644
index 0000000000..f5c250b904
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-sha256-
x86_64.nasm
@@ -0,0 +1,78 @@
+; WARNING: do not edit!

+; Generated from openssl/crypto/aes/asm/aesni-sha256-x86_64.pl

+;

+; Copyright 2013-2020 The OpenSSL Project Authors. All Rights Reserved.

+;

+; Licensed under the OpenSSL license (the "License"). You may not use

+; this file except in compliance with the License. You can obtain a copy

+; in the file LICENSE in the source distribution or at

+; https://www.openssl.org/source/license.html

+

+default rel

+%define XMMWORD

+%define YMMWORD

+%define ZMMWORD

+section .text code align=64

+

+

+EXTERN OPENSSL_ia32cap_P

+global aesni_cbc_sha256_enc

+

+ALIGN 16

+aesni_cbc_sha256_enc:

+

+ xor eax,eax

+ cmp rcx,0

+ je NEAR $L$probe

+ ud2

+$L$probe:

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 64

+

+K256:

+ DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5

+ DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5

+ DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5

+ DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5

+ DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3

+ DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3

+ DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174

+ DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174

+ DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc

+ DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc

+ DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da

+ DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da

+ DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7

+ DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7

+ DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967

+ DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967

+ DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13

+ DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13

+ DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85

+ DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85

+ DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3

+ DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3

+ DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070

+ DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070

+ DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5

+ DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5

+ DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3

+ DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3

+ DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208

+ DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208

+ DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2

+ DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2

+

+ DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f

+ DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f

+ DD 0,0,0,0,0,0,0,0,-1,-1,-1,-1

+ DD 0,0,0,0,0,0,0,0

+DB 65,69,83,78,73,45,67,66,67,43,83,72,65,50,53,54

+DB 32,115,116,105,116,99,104,32,102,111,114,32,120,56,54,95

+DB 54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98

+DB 121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108

+DB 46,111,114,103,62,0

+ALIGN 64

diff --git a/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-
x86_64.nasm
b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-x86_64.nasm
new file mode 100644
index 0000000000..57ee23ea8c
--- /dev/null
+++ b/CryptoPkg/Library/OpensslLib/X64/crypto/aes/aesni-x86_64.nasm
@@ -0,0 +1,5103 @@
+; WARNING: do not edit!

+; Generated from openssl/crypto/aes/asm/aesni-x86_64.pl

+;

+; Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.

+;

+; Licensed under the OpenSSL license (the "License"). You may not use

+; this file except in compliance with the License. You can obtain a copy

+; in the file LICENSE in the source distribution or at

+; https://www.openssl.org/source/license.html

+

+default rel

+%define XMMWORD

+%define YMMWORD

+%define ZMMWORD

+section .text code align=64

+

+EXTERN OPENSSL_ia32cap_P

+global aesni_encrypt

+

+ALIGN 16

+aesni_encrypt:

+

+ movups xmm2,XMMWORD[rcx]

+ mov eax,DWORD[240+r8]

+ movups xmm0,XMMWORD[r8]

+ movups xmm1,XMMWORD[16+r8]

+ lea r8,[32+r8]

+ xorps xmm2,xmm0

+$L$oop_enc1_1:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[r8]

+ lea r8,[16+r8]

+ jnz NEAR $L$oop_enc1_1

+DB 102,15,56,221,209

+ pxor xmm0,xmm0

+ pxor xmm1,xmm1

+ movups XMMWORD[rdx],xmm2

+ pxor xmm2,xmm2

+ DB 0F3h,0C3h ;repret

+

+

+

+global aesni_decrypt

+

+ALIGN 16

+aesni_decrypt:

+

+ movups xmm2,XMMWORD[rcx]

+ mov eax,DWORD[240+r8]

+ movups xmm0,XMMWORD[r8]

+ movups xmm1,XMMWORD[16+r8]

+ lea r8,[32+r8]

+ xorps xmm2,xmm0

+$L$oop_dec1_2:

+DB 102,15,56,222,209

+ dec eax

+ movups xmm1,XMMWORD[r8]

+ lea r8,[16+r8]

+ jnz NEAR $L$oop_dec1_2

+DB 102,15,56,223,209

+ pxor xmm0,xmm0

+ pxor xmm1,xmm1

+ movups XMMWORD[rdx],xmm2

+ pxor xmm2,xmm2

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_encrypt2:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+ add rax,16

+

+$L$enc_loop2:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$enc_loop2

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_decrypt2:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+ add rax,16

+

+$L$dec_loop2:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$dec_loop2

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,223,208

+DB 102,15,56,223,216

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_encrypt3:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ xorps xmm4,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+ add rax,16

+

+$L$enc_loop3:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$enc_loop3

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+DB 102,15,56,221,224

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_decrypt3:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ xorps xmm4,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+ add rax,16

+

+$L$dec_loop3:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$dec_loop3

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,223,208

+DB 102,15,56,223,216

+DB 102,15,56,223,224

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_encrypt4:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ xorps xmm4,xmm0

+ xorps xmm5,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 0x0f,0x1f,0x00

+ add rax,16

+

+$L$enc_loop4:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$enc_loop4

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+DB 102,15,56,221,224

+DB 102,15,56,221,232

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_decrypt4:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ xorps xmm4,xmm0

+ xorps xmm5,xmm0

+ movups xmm0,XMMWORD[32+rcx]

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 0x0f,0x1f,0x00

+ add rax,16

+

+$L$dec_loop4:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$dec_loop4

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,223,208

+DB 102,15,56,223,216

+DB 102,15,56,223,224

+DB 102,15,56,223,232

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_encrypt6:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ pxor xmm3,xmm0

+ pxor xmm4,xmm0

+DB 102,15,56,220,209

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 102,15,56,220,217

+ pxor xmm5,xmm0

+ pxor xmm6,xmm0

+DB 102,15,56,220,225

+ pxor xmm7,xmm0

+ movups xmm0,XMMWORD[rax*1+rcx]

+ add rax,16

+ jmp NEAR $L$enc_loop6_enter

+ALIGN 16

+$L$enc_loop6:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+$L$enc_loop6_enter:

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$enc_loop6

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+DB 102,15,56,221,224

+DB 102,15,56,221,232

+DB 102,15,56,221,240

+DB 102,15,56,221,248

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_decrypt6:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ pxor xmm3,xmm0

+ pxor xmm4,xmm0

+DB 102,15,56,222,209

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 102,15,56,222,217

+ pxor xmm5,xmm0

+ pxor xmm6,xmm0

+DB 102,15,56,222,225

+ pxor xmm7,xmm0

+ movups xmm0,XMMWORD[rax*1+rcx]

+ add rax,16

+ jmp NEAR $L$dec_loop6_enter

+ALIGN 16

+$L$dec_loop6:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+$L$dec_loop6_enter:

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+DB 102,15,56,222,240

+DB 102,15,56,222,248

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$dec_loop6

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+DB 102,15,56,223,208

+DB 102,15,56,223,216

+DB 102,15,56,223,224

+DB 102,15,56,223,232

+DB 102,15,56,223,240

+DB 102,15,56,223,248

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_encrypt8:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ pxor xmm4,xmm0

+ pxor xmm5,xmm0

+ pxor xmm6,xmm0

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 102,15,56,220,209

+ pxor xmm7,xmm0

+ pxor xmm8,xmm0

+DB 102,15,56,220,217

+ pxor xmm9,xmm0

+ movups xmm0,XMMWORD[rax*1+rcx]

+ add rax,16

+ jmp NEAR $L$enc_loop8_inner

+ALIGN 16

+$L$enc_loop8:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+$L$enc_loop8_inner:

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+$L$enc_loop8_enter:

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$enc_loop8

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+DB 102,15,56,221,224

+DB 102,15,56,221,232

+DB 102,15,56,221,240

+DB 102,15,56,221,248

+DB 102,68,15,56,221,192

+DB 102,68,15,56,221,200

+ DB 0F3h,0C3h ;repret

+

+

+

+ALIGN 16

+_aesni_decrypt8:

+

+ movups xmm0,XMMWORD[rcx]

+ shl eax,4

+ movups xmm1,XMMWORD[16+rcx]

+ xorps xmm2,xmm0

+ xorps xmm3,xmm0

+ pxor xmm4,xmm0

+ pxor xmm5,xmm0

+ pxor xmm6,xmm0

+ lea rcx,[32+rax*1+rcx]

+ neg rax

+DB 102,15,56,222,209

+ pxor xmm7,xmm0

+ pxor xmm8,xmm0

+DB 102,15,56,222,217

+ pxor xmm9,xmm0

+ movups xmm0,XMMWORD[rax*1+rcx]

+ add rax,16

+ jmp NEAR $L$dec_loop8_inner

+ALIGN 16

+$L$dec_loop8:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+$L$dec_loop8_inner:

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+DB 102,68,15,56,222,193

+DB 102,68,15,56,222,201

+$L$dec_loop8_enter:

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+DB 102,15,56,222,240

+DB 102,15,56,222,248

+DB 102,68,15,56,222,192

+DB 102,68,15,56,222,200

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$dec_loop8

+

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+DB 102,68,15,56,222,193

+DB 102,68,15,56,222,201

+DB 102,15,56,223,208

+DB 102,15,56,223,216

+DB 102,15,56,223,224

+DB 102,15,56,223,232

+DB 102,15,56,223,240

+DB 102,15,56,223,248

+DB 102,68,15,56,223,192

+DB 102,68,15,56,223,200

+ DB 0F3h,0C3h ;repret

+

+

+global aesni_ecb_encrypt

+

+ALIGN 16

+aesni_ecb_encrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_ecb_encrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+

+

+

+ lea rsp,[((-88))+rsp]

+ movaps XMMWORD[rsp],xmm6

+ movaps XMMWORD[16+rsp],xmm7

+ movaps XMMWORD[32+rsp],xmm8

+ movaps XMMWORD[48+rsp],xmm9

+$L$ecb_enc_body:

+ and rdx,-16

+ jz NEAR $L$ecb_ret

+

+ mov eax,DWORD[240+rcx]

+ movups xmm0,XMMWORD[rcx]

+ mov r11,rcx

+ mov r10d,eax

+ test r8d,r8d

+ jz NEAR $L$ecb_decrypt

+

+ cmp rdx,0x80

+ jb NEAR $L$ecb_enc_tail

+

+ movdqu xmm2,XMMWORD[rdi]

+ movdqu xmm3,XMMWORD[16+rdi]

+ movdqu xmm4,XMMWORD[32+rdi]

+ movdqu xmm5,XMMWORD[48+rdi]

+ movdqu xmm6,XMMWORD[64+rdi]

+ movdqu xmm7,XMMWORD[80+rdi]

+ movdqu xmm8,XMMWORD[96+rdi]

+ movdqu xmm9,XMMWORD[112+rdi]

+ lea rdi,[128+rdi]

+ sub rdx,0x80

+ jmp NEAR $L$ecb_enc_loop8_enter

+ALIGN 16

+$L$ecb_enc_loop8:

+ movups XMMWORD[rsi],xmm2

+ mov rcx,r11

+ movdqu xmm2,XMMWORD[rdi]

+ mov eax,r10d

+ movups XMMWORD[16+rsi],xmm3

+ movdqu xmm3,XMMWORD[16+rdi]

+ movups XMMWORD[32+rsi],xmm4

+ movdqu xmm4,XMMWORD[32+rdi]

+ movups XMMWORD[48+rsi],xmm5

+ movdqu xmm5,XMMWORD[48+rdi]

+ movups XMMWORD[64+rsi],xmm6

+ movdqu xmm6,XMMWORD[64+rdi]

+ movups XMMWORD[80+rsi],xmm7

+ movdqu xmm7,XMMWORD[80+rdi]

+ movups XMMWORD[96+rsi],xmm8

+ movdqu xmm8,XMMWORD[96+rdi]

+ movups XMMWORD[112+rsi],xmm9

+ lea rsi,[128+rsi]

+ movdqu xmm9,XMMWORD[112+rdi]

+ lea rdi,[128+rdi]

+$L$ecb_enc_loop8_enter:

+

+ call _aesni_encrypt8

+

+ sub rdx,0x80

+ jnc NEAR $L$ecb_enc_loop8

+

+ movups XMMWORD[rsi],xmm2

+ mov rcx,r11

+ movups XMMWORD[16+rsi],xmm3

+ mov eax,r10d

+ movups XMMWORD[32+rsi],xmm4

+ movups XMMWORD[48+rsi],xmm5

+ movups XMMWORD[64+rsi],xmm6

+ movups XMMWORD[80+rsi],xmm7

+ movups XMMWORD[96+rsi],xmm8

+ movups XMMWORD[112+rsi],xmm9

+ lea rsi,[128+rsi]

+ add rdx,0x80

+ jz NEAR $L$ecb_ret

+

+$L$ecb_enc_tail:

+ movups xmm2,XMMWORD[rdi]

+ cmp rdx,0x20

+ jb NEAR $L$ecb_enc_one

+ movups xmm3,XMMWORD[16+rdi]

+ je NEAR $L$ecb_enc_two

+ movups xmm4,XMMWORD[32+rdi]

+ cmp rdx,0x40

+ jb NEAR $L$ecb_enc_three

+ movups xmm5,XMMWORD[48+rdi]

+ je NEAR $L$ecb_enc_four

+ movups xmm6,XMMWORD[64+rdi]

+ cmp rdx,0x60

+ jb NEAR $L$ecb_enc_five

+ movups xmm7,XMMWORD[80+rdi]

+ je NEAR $L$ecb_enc_six

+ movdqu xmm8,XMMWORD[96+rdi]

+ xorps xmm9,xmm9

+ call _aesni_encrypt8

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ movups XMMWORD[48+rsi],xmm5

+ movups XMMWORD[64+rsi],xmm6

+ movups XMMWORD[80+rsi],xmm7

+ movups XMMWORD[96+rsi],xmm8

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_one:

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_enc1_3:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_enc1_3

+DB 102,15,56,221,209

+ movups XMMWORD[rsi],xmm2

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_two:

+ call _aesni_encrypt2

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_three:

+ call _aesni_encrypt3

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_four:

+ call _aesni_encrypt4

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ movups XMMWORD[48+rsi],xmm5

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_five:

+ xorps xmm7,xmm7

+ call _aesni_encrypt6

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ movups XMMWORD[48+rsi],xmm5

+ movups XMMWORD[64+rsi],xmm6

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_enc_six:

+ call _aesni_encrypt6

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ movups XMMWORD[48+rsi],xmm5

+ movups XMMWORD[64+rsi],xmm6

+ movups XMMWORD[80+rsi],xmm7

+ jmp NEAR $L$ecb_ret

+

+ALIGN 16

+$L$ecb_decrypt:

+ cmp rdx,0x80

+ jb NEAR $L$ecb_dec_tail

+

+ movdqu xmm2,XMMWORD[rdi]

+ movdqu xmm3,XMMWORD[16+rdi]

+ movdqu xmm4,XMMWORD[32+rdi]

+ movdqu xmm5,XMMWORD[48+rdi]

+ movdqu xmm6,XMMWORD[64+rdi]

+ movdqu xmm7,XMMWORD[80+rdi]

+ movdqu xmm8,XMMWORD[96+rdi]

+ movdqu xmm9,XMMWORD[112+rdi]

+ lea rdi,[128+rdi]

+ sub rdx,0x80

+ jmp NEAR $L$ecb_dec_loop8_enter

+ALIGN 16

+$L$ecb_dec_loop8:

+ movups XMMWORD[rsi],xmm2

+ mov rcx,r11

+ movdqu xmm2,XMMWORD[rdi]

+ mov eax,r10d

+ movups XMMWORD[16+rsi],xmm3

+ movdqu xmm3,XMMWORD[16+rdi]

+ movups XMMWORD[32+rsi],xmm4

+ movdqu xmm4,XMMWORD[32+rdi]

+ movups XMMWORD[48+rsi],xmm5

+ movdqu xmm5,XMMWORD[48+rdi]

+ movups XMMWORD[64+rsi],xmm6

+ movdqu xmm6,XMMWORD[64+rdi]

+ movups XMMWORD[80+rsi],xmm7

+ movdqu xmm7,XMMWORD[80+rdi]

+ movups XMMWORD[96+rsi],xmm8

+ movdqu xmm8,XMMWORD[96+rdi]

+ movups XMMWORD[112+rsi],xmm9

+ lea rsi,[128+rsi]

+ movdqu xmm9,XMMWORD[112+rdi]

+ lea rdi,[128+rdi]

+$L$ecb_dec_loop8_enter:

+

+ call _aesni_decrypt8

+

+ movups xmm0,XMMWORD[r11]

+ sub rdx,0x80

+ jnc NEAR $L$ecb_dec_loop8

+

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ mov rcx,r11

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ mov eax,r10d

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ movups XMMWORD[48+rsi],xmm5

+ pxor xmm5,xmm5

+ movups XMMWORD[64+rsi],xmm6

+ pxor xmm6,xmm6

+ movups XMMWORD[80+rsi],xmm7

+ pxor xmm7,xmm7

+ movups XMMWORD[96+rsi],xmm8

+ pxor xmm8,xmm8

+ movups XMMWORD[112+rsi],xmm9

+ pxor xmm9,xmm9

+ lea rsi,[128+rsi]

+ add rdx,0x80

+ jz NEAR $L$ecb_ret

+

+$L$ecb_dec_tail:

+ movups xmm2,XMMWORD[rdi]

+ cmp rdx,0x20

+ jb NEAR $L$ecb_dec_one

+ movups xmm3,XMMWORD[16+rdi]

+ je NEAR $L$ecb_dec_two

+ movups xmm4,XMMWORD[32+rdi]

+ cmp rdx,0x40

+ jb NEAR $L$ecb_dec_three

+ movups xmm5,XMMWORD[48+rdi]

+ je NEAR $L$ecb_dec_four

+ movups xmm6,XMMWORD[64+rdi]

+ cmp rdx,0x60

+ jb NEAR $L$ecb_dec_five

+ movups xmm7,XMMWORD[80+rdi]

+ je NEAR $L$ecb_dec_six

+ movups xmm8,XMMWORD[96+rdi]

+ movups xmm0,XMMWORD[rcx]

+ xorps xmm9,xmm9

+ call _aesni_decrypt8

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ movups XMMWORD[48+rsi],xmm5

+ pxor xmm5,xmm5

+ movups XMMWORD[64+rsi],xmm6

+ pxor xmm6,xmm6

+ movups XMMWORD[80+rsi],xmm7

+ pxor xmm7,xmm7

+ movups XMMWORD[96+rsi],xmm8

+ pxor xmm8,xmm8

+ pxor xmm9,xmm9

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_one:

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_dec1_4:

+DB 102,15,56,222,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_dec1_4

+DB 102,15,56,223,209

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_two:

+ call _aesni_decrypt2

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_three:

+ call _aesni_decrypt3

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_four:

+ call _aesni_decrypt4

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ movups XMMWORD[48+rsi],xmm5

+ pxor xmm5,xmm5

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_five:

+ xorps xmm7,xmm7

+ call _aesni_decrypt6

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ movups XMMWORD[48+rsi],xmm5

+ pxor xmm5,xmm5

+ movups XMMWORD[64+rsi],xmm6

+ pxor xmm6,xmm6

+ pxor xmm7,xmm7

+ jmp NEAR $L$ecb_ret

+ALIGN 16

+$L$ecb_dec_six:

+ call _aesni_decrypt6

+ movups XMMWORD[rsi],xmm2

+ pxor xmm2,xmm2

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[32+rsi],xmm4

+ pxor xmm4,xmm4

+ movups XMMWORD[48+rsi],xmm5

+ pxor xmm5,xmm5

+ movups XMMWORD[64+rsi],xmm6

+ pxor xmm6,xmm6

+ movups XMMWORD[80+rsi],xmm7

+ pxor xmm7,xmm7

+

+$L$ecb_ret:

+ xorps xmm0,xmm0

+ pxor xmm1,xmm1

+ movaps xmm6,XMMWORD[rsp]

+ movaps XMMWORD[rsp],xmm0

+ movaps xmm7,XMMWORD[16+rsp]

+ movaps XMMWORD[16+rsp],xmm0

+ movaps xmm8,XMMWORD[32+rsp]

+ movaps XMMWORD[32+rsp],xmm0

+ movaps xmm9,XMMWORD[48+rsp]

+ movaps XMMWORD[48+rsp],xmm0

+ lea rsp,[88+rsp]

+$L$ecb_enc_ret:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_ecb_encrypt:

+global aesni_ccm64_encrypt_blocks

+

+ALIGN 16

+aesni_ccm64_encrypt_blocks:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_ccm64_encrypt_blocks:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ lea rsp,[((-88))+rsp]

+ movaps XMMWORD[rsp],xmm6

+ movaps XMMWORD[16+rsp],xmm7

+ movaps XMMWORD[32+rsp],xmm8

+ movaps XMMWORD[48+rsp],xmm9

+$L$ccm64_enc_body:

+ mov eax,DWORD[240+rcx]

+ movdqu xmm6,XMMWORD[r8]

+ movdqa xmm9,XMMWORD[$L$increment64]

+ movdqa xmm7,XMMWORD[$L$bswap_mask]

+

+ shl eax,4

+ mov r10d,16

+ lea r11,[rcx]

+ movdqu xmm3,XMMWORD[r9]

+ movdqa xmm2,xmm6

+ lea rcx,[32+rax*1+rcx]

+DB 102,15,56,0,247

+ sub r10,rax

+ jmp NEAR $L$ccm64_enc_outer

+ALIGN 16

+$L$ccm64_enc_outer:

+ movups xmm0,XMMWORD[r11]

+ mov rax,r10

+ movups xmm8,XMMWORD[rdi]

+

+ xorps xmm2,xmm0

+ movups xmm1,XMMWORD[16+r11]

+ xorps xmm0,xmm8

+ xorps xmm3,xmm0

+ movups xmm0,XMMWORD[32+r11]

+

+$L$ccm64_enc2_loop:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$ccm64_enc2_loop

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ paddq xmm6,xmm9

+ dec rdx

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+

+ lea rdi,[16+rdi]

+ xorps xmm8,xmm2

+ movdqa xmm2,xmm6

+ movups XMMWORD[rsi],xmm8

+DB 102,15,56,0,215

+ lea rsi,[16+rsi]

+ jnz NEAR $L$ccm64_enc_outer

+

+ pxor xmm0,xmm0

+ pxor xmm1,xmm1

+ pxor xmm2,xmm2

+ movups XMMWORD[r9],xmm3

+ pxor xmm3,xmm3

+ pxor xmm8,xmm8

+ pxor xmm6,xmm6

+ movaps xmm6,XMMWORD[rsp]

+ movaps XMMWORD[rsp],xmm0

+ movaps xmm7,XMMWORD[16+rsp]

+ movaps XMMWORD[16+rsp],xmm0

+ movaps xmm8,XMMWORD[32+rsp]

+ movaps XMMWORD[32+rsp],xmm0

+ movaps xmm9,XMMWORD[48+rsp]

+ movaps XMMWORD[48+rsp],xmm0

+ lea rsp,[88+rsp]

+$L$ccm64_enc_ret:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_ccm64_encrypt_blocks:

+global aesni_ccm64_decrypt_blocks

+

+ALIGN 16

+aesni_ccm64_decrypt_blocks:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_ccm64_decrypt_blocks:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ lea rsp,[((-88))+rsp]

+ movaps XMMWORD[rsp],xmm6

+ movaps XMMWORD[16+rsp],xmm7

+ movaps XMMWORD[32+rsp],xmm8

+ movaps XMMWORD[48+rsp],xmm9

+$L$ccm64_dec_body:

+ mov eax,DWORD[240+rcx]

+ movups xmm6,XMMWORD[r8]

+ movdqu xmm3,XMMWORD[r9]

+ movdqa xmm9,XMMWORD[$L$increment64]

+ movdqa xmm7,XMMWORD[$L$bswap_mask]

+

+ movaps xmm2,xmm6

+ mov r10d,eax

+ mov r11,rcx

+DB 102,15,56,0,247

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_enc1_5:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_enc1_5

+DB 102,15,56,221,209

+ shl r10d,4

+ mov eax,16

+ movups xmm8,XMMWORD[rdi]

+ paddq xmm6,xmm9

+ lea rdi,[16+rdi]

+ sub rax,r10

+ lea rcx,[32+r10*1+r11]

+ mov r10,rax

+ jmp NEAR $L$ccm64_dec_outer

+ALIGN 16

+$L$ccm64_dec_outer:

+ xorps xmm8,xmm2

+ movdqa xmm2,xmm6

+ movups XMMWORD[rsi],xmm8

+ lea rsi,[16+rsi]

+DB 102,15,56,0,215

+

+ sub rdx,1

+ jz NEAR $L$ccm64_dec_break

+

+ movups xmm0,XMMWORD[r11]

+ mov rax,r10

+ movups xmm1,XMMWORD[16+r11]

+ xorps xmm8,xmm0

+ xorps xmm2,xmm0

+ xorps xmm3,xmm8

+ movups xmm0,XMMWORD[32+r11]

+ jmp NEAR $L$ccm64_dec2_loop

+ALIGN 16

+$L$ccm64_dec2_loop:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ movups xmm1,XMMWORD[rax*1+rcx]

+ add rax,32

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ movups xmm0,XMMWORD[((-16))+rax*1+rcx]

+ jnz NEAR $L$ccm64_dec2_loop

+ movups xmm8,XMMWORD[rdi]

+ paddq xmm6,xmm9

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,221,208

+DB 102,15,56,221,216

+ lea rdi,[16+rdi]

+ jmp NEAR $L$ccm64_dec_outer

+

+ALIGN 16

+$L$ccm64_dec_break:

+

+ mov eax,DWORD[240+r11]

+ movups xmm0,XMMWORD[r11]

+ movups xmm1,XMMWORD[16+r11]

+ xorps xmm8,xmm0

+ lea r11,[32+r11]

+ xorps xmm3,xmm8

+$L$oop_enc1_6:

+DB 102,15,56,220,217

+ dec eax

+ movups xmm1,XMMWORD[r11]

+ lea r11,[16+r11]

+ jnz NEAR $L$oop_enc1_6

+DB 102,15,56,221,217

+ pxor xmm0,xmm0

+ pxor xmm1,xmm1

+ pxor xmm2,xmm2

+ movups XMMWORD[r9],xmm3

+ pxor xmm3,xmm3

+ pxor xmm8,xmm8

+ pxor xmm6,xmm6

+ movaps xmm6,XMMWORD[rsp]

+ movaps XMMWORD[rsp],xmm0

+ movaps xmm7,XMMWORD[16+rsp]

+ movaps XMMWORD[16+rsp],xmm0

+ movaps xmm8,XMMWORD[32+rsp]

+ movaps XMMWORD[32+rsp],xmm0

+ movaps xmm9,XMMWORD[48+rsp]

+ movaps XMMWORD[48+rsp],xmm0

+ lea rsp,[88+rsp]

+$L$ccm64_dec_ret:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_ccm64_decrypt_blocks:

+global aesni_ctr32_encrypt_blocks

+

+ALIGN 16

+aesni_ctr32_encrypt_blocks:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_ctr32_encrypt_blocks:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+

+

+

+ cmp rdx,1

+ jne NEAR $L$ctr32_bulk

+

+

+

+ movups xmm2,XMMWORD[r8]

+ movups xmm3,XMMWORD[rdi]

+ mov edx,DWORD[240+rcx]

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_enc1_7:

+DB 102,15,56,220,209

+ dec edx

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_enc1_7

+DB 102,15,56,221,209

+ pxor xmm0,xmm0

+ pxor xmm1,xmm1

+ xorps xmm2,xmm3

+ pxor xmm3,xmm3

+ movups XMMWORD[rsi],xmm2

+ xorps xmm2,xmm2

+ jmp NEAR $L$ctr32_epilogue

+

+ALIGN 16

+$L$ctr32_bulk:

+ lea r11,[rsp]

+

+ push rbp

+

+ sub rsp,288

+ and rsp,-16

+ movaps XMMWORD[(-168)+r11],xmm6

+ movaps XMMWORD[(-152)+r11],xmm7

+ movaps XMMWORD[(-136)+r11],xmm8

+ movaps XMMWORD[(-120)+r11],xmm9

+ movaps XMMWORD[(-104)+r11],xmm10

+ movaps XMMWORD[(-88)+r11],xmm11

+ movaps XMMWORD[(-72)+r11],xmm12

+ movaps XMMWORD[(-56)+r11],xmm13

+ movaps XMMWORD[(-40)+r11],xmm14

+ movaps XMMWORD[(-24)+r11],xmm15

+$L$ctr32_body:

+

+

+

+

+ movdqu xmm2,XMMWORD[r8]

+ movdqu xmm0,XMMWORD[rcx]

+ mov r8d,DWORD[12+r8]

+ pxor xmm2,xmm0

+ mov ebp,DWORD[12+rcx]

+ movdqa XMMWORD[rsp],xmm2

+ bswap r8d

+ movdqa xmm3,xmm2

+ movdqa xmm4,xmm2

+ movdqa xmm5,xmm2

+ movdqa XMMWORD[64+rsp],xmm2

+ movdqa XMMWORD[80+rsp],xmm2

+ movdqa XMMWORD[96+rsp],xmm2

+ mov r10,rdx

+ movdqa XMMWORD[112+rsp],xmm2

+

+ lea rax,[1+r8]

+ lea rdx,[2+r8]

+ bswap eax

+ bswap edx

+ xor eax,ebp

+ xor edx,ebp

+DB 102,15,58,34,216,3

+ lea rax,[3+r8]

+ movdqa XMMWORD[16+rsp],xmm3

+DB 102,15,58,34,226,3

+ bswap eax

+ mov rdx,r10

+ lea r10,[4+r8]

+ movdqa XMMWORD[32+rsp],xmm4

+ xor eax,ebp

+ bswap r10d

+DB 102,15,58,34,232,3

+ xor r10d,ebp

+ movdqa XMMWORD[48+rsp],xmm5

+ lea r9,[5+r8]

+ mov DWORD[((64+12))+rsp],r10d

+ bswap r9d

+ lea r10,[6+r8]

+ mov eax,DWORD[240+rcx]

+ xor r9d,ebp

+ bswap r10d

+ mov DWORD[((80+12))+rsp],r9d

+ xor r10d,ebp

+ lea r9,[7+r8]

+ mov DWORD[((96+12))+rsp],r10d

+ bswap r9d

+ mov r10d,DWORD[((OPENSSL_ia32cap_P+4))]

+ xor r9d,ebp

+ and r10d,71303168

+ mov DWORD[((112+12))+rsp],r9d

+

+ movups xmm1,XMMWORD[16+rcx]

+

+ movdqa xmm6,XMMWORD[64+rsp]

+ movdqa xmm7,XMMWORD[80+rsp]

+

+ cmp rdx,8

+ jb NEAR $L$ctr32_tail

+

+ sub rdx,6

+ cmp r10d,4194304

+ je NEAR $L$ctr32_6x

+

+ lea rcx,[128+rcx]

+ sub rdx,2

+ jmp NEAR $L$ctr32_loop8

+

+ALIGN 16

+$L$ctr32_6x:

+ shl eax,4

+ mov r10d,48

+ bswap ebp

+ lea rcx,[32+rax*1+rcx]

+ sub r10,rax

+ jmp NEAR $L$ctr32_loop6

+

+ALIGN 16

+$L$ctr32_loop6:

+ add r8d,6

+ movups xmm0,XMMWORD[((-48))+r10*1+rcx]

+DB 102,15,56,220,209

+ mov eax,r8d

+ xor eax,ebp

+DB 102,15,56,220,217

+DB 0x0f,0x38,0xf1,0x44,0x24,12

+ lea eax,[1+r8]

+DB 102,15,56,220,225

+ xor eax,ebp

+DB 0x0f,0x38,0xf1,0x44,0x24,28

+DB 102,15,56,220,233

+ lea eax,[2+r8]

+ xor eax,ebp

+DB 102,15,56,220,241

+DB 0x0f,0x38,0xf1,0x44,0x24,44

+ lea eax,[3+r8]

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[((-32))+r10*1+rcx]

+ xor eax,ebp

+

+DB 102,15,56,220,208

+DB 0x0f,0x38,0xf1,0x44,0x24,60

+ lea eax,[4+r8]

+DB 102,15,56,220,216

+ xor eax,ebp

+DB 0x0f,0x38,0xf1,0x44,0x24,76

+DB 102,15,56,220,224

+ lea eax,[5+r8]

+ xor eax,ebp

+DB 102,15,56,220,232

+DB 0x0f,0x38,0xf1,0x44,0x24,92

+ mov rax,r10

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+ movups xmm0,XMMWORD[((-16))+r10*1+rcx]

+

+ call $L$enc_loop6

+

+ movdqu xmm8,XMMWORD[rdi]

+ movdqu xmm9,XMMWORD[16+rdi]

+ movdqu xmm10,XMMWORD[32+rdi]

+ movdqu xmm11,XMMWORD[48+rdi]

+ movdqu xmm12,XMMWORD[64+rdi]

+ movdqu xmm13,XMMWORD[80+rdi]

+ lea rdi,[96+rdi]

+ movups xmm1,XMMWORD[((-64))+r10*1+rcx]

+ pxor xmm8,xmm2

+ movaps xmm2,XMMWORD[rsp]

+ pxor xmm9,xmm3

+ movaps xmm3,XMMWORD[16+rsp]

+ pxor xmm10,xmm4

+ movaps xmm4,XMMWORD[32+rsp]

+ pxor xmm11,xmm5

+ movaps xmm5,XMMWORD[48+rsp]

+ pxor xmm12,xmm6

+ movaps xmm6,XMMWORD[64+rsp]

+ pxor xmm13,xmm7

+ movaps xmm7,XMMWORD[80+rsp]

+ movdqu XMMWORD[rsi],xmm8

+ movdqu XMMWORD[16+rsi],xmm9

+ movdqu XMMWORD[32+rsi],xmm10

+ movdqu XMMWORD[48+rsi],xmm11

+ movdqu XMMWORD[64+rsi],xmm12

+ movdqu XMMWORD[80+rsi],xmm13

+ lea rsi,[96+rsi]

+

+ sub rdx,6

+ jnc NEAR $L$ctr32_loop6

+

+ add rdx,6

+ jz NEAR $L$ctr32_done

+

+ lea eax,[((-48))+r10]

+ lea rcx,[((-80))+r10*1+rcx]

+ neg eax

+ shr eax,4

+ jmp NEAR $L$ctr32_tail

+

+ALIGN 32

+$L$ctr32_loop8:

+ add r8d,8

+ movdqa xmm8,XMMWORD[96+rsp]

+DB 102,15,56,220,209

+ mov r9d,r8d

+ movdqa xmm9,XMMWORD[112+rsp]

+DB 102,15,56,220,217

+ bswap r9d

+ movups xmm0,XMMWORD[((32-128))+rcx]

+DB 102,15,56,220,225

+ xor r9d,ebp

+ nop

+DB 102,15,56,220,233

+ mov DWORD[((0+12))+rsp],r9d

+ lea r9,[1+r8]

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((48-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ mov DWORD[((16+12))+rsp],r9d

+ lea r9,[2+r8]

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((64-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ mov DWORD[((32+12))+rsp],r9d

+ lea r9,[3+r8]

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((80-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ mov DWORD[((48+12))+rsp],r9d

+ lea r9,[4+r8]

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((96-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ mov DWORD[((64+12))+rsp],r9d

+ lea r9,[5+r8]

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((112-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ mov DWORD[((80+12))+rsp],r9d

+ lea r9,[6+r8]

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((128-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ xor r9d,ebp

+DB 0x66,0x90

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ mov DWORD[((96+12))+rsp],r9d

+ lea r9,[7+r8]

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((144-128))+rcx]

+ bswap r9d

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+ xor r9d,ebp

+ movdqu xmm10,XMMWORD[rdi]

+DB 102,15,56,220,232

+ mov DWORD[((112+12))+rsp],r9d

+ cmp eax,11

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((160-128))+rcx]

+

+ jb NEAR $L$ctr32_enc_done

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((176-128))+rcx]

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((192-128))+rcx]

+ je NEAR $L$ctr32_enc_done

+

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movups xmm1,XMMWORD[((208-128))+rcx]

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+DB 102,68,15,56,220,192

+DB 102,68,15,56,220,200

+ movups xmm0,XMMWORD[((224-128))+rcx]

+ jmp NEAR $L$ctr32_enc_done

+

+ALIGN 16

+$L$ctr32_enc_done:

+ movdqu xmm11,XMMWORD[16+rdi]

+ pxor xmm10,xmm0

+ movdqu xmm12,XMMWORD[32+rdi]

+ pxor xmm11,xmm0

+ movdqu xmm13,XMMWORD[48+rdi]

+ pxor xmm12,xmm0

+ movdqu xmm14,XMMWORD[64+rdi]

+ pxor xmm13,xmm0

+ movdqu xmm15,XMMWORD[80+rdi]

+ pxor xmm14,xmm0

+ pxor xmm15,xmm0

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+DB 102,68,15,56,220,201

+ movdqu xmm1,XMMWORD[96+rdi]

+ lea rdi,[128+rdi]

+

+DB 102,65,15,56,221,210

+ pxor xmm1,xmm0

+ movdqu xmm10,XMMWORD[((112-128))+rdi]

+DB 102,65,15,56,221,219

+ pxor xmm10,xmm0

+ movdqa xmm11,XMMWORD[rsp]

+DB 102,65,15,56,221,228

+DB 102,65,15,56,221,237

+ movdqa xmm12,XMMWORD[16+rsp]

+ movdqa xmm13,XMMWORD[32+rsp]

+DB 102,65,15,56,221,246

+DB 102,65,15,56,221,255

+ movdqa xmm14,XMMWORD[48+rsp]

+ movdqa xmm15,XMMWORD[64+rsp]

+DB 102,68,15,56,221,193

+ movdqa xmm0,XMMWORD[80+rsp]

+ movups xmm1,XMMWORD[((16-128))+rcx]

+DB 102,69,15,56,221,202

+

+ movups XMMWORD[rsi],xmm2

+ movdqa xmm2,xmm11

+ movups XMMWORD[16+rsi],xmm3

+ movdqa xmm3,xmm12

+ movups XMMWORD[32+rsi],xmm4

+ movdqa xmm4,xmm13

+ movups XMMWORD[48+rsi],xmm5

+ movdqa xmm5,xmm14

+ movups XMMWORD[64+rsi],xmm6

+ movdqa xmm6,xmm15

+ movups XMMWORD[80+rsi],xmm7

+ movdqa xmm7,xmm0

+ movups XMMWORD[96+rsi],xmm8

+ movups XMMWORD[112+rsi],xmm9

+ lea rsi,[128+rsi]

+

+ sub rdx,8

+ jnc NEAR $L$ctr32_loop8

+

+ add rdx,8

+ jz NEAR $L$ctr32_done

+ lea rcx,[((-128))+rcx]

+

+$L$ctr32_tail:

+

+

+ lea rcx,[16+rcx]

+ cmp rdx,4

+ jb NEAR $L$ctr32_loop3

+ je NEAR $L$ctr32_loop4

+

+

+ shl eax,4

+ movdqa xmm8,XMMWORD[96+rsp]

+ pxor xmm9,xmm9

+

+ movups xmm0,XMMWORD[16+rcx]

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+ lea rcx,[((32-16))+rax*1+rcx]

+ neg rax

+DB 102,15,56,220,225

+ add rax,16

+ movups xmm10,XMMWORD[rdi]

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+ movups xmm11,XMMWORD[16+rdi]

+ movups xmm12,XMMWORD[32+rdi]

+DB 102,15,56,220,249

+DB 102,68,15,56,220,193

+

+ call $L$enc_loop8_enter

+

+ movdqu xmm13,XMMWORD[48+rdi]

+ pxor xmm2,xmm10

+ movdqu xmm10,XMMWORD[64+rdi]

+ pxor xmm3,xmm11

+ movdqu XMMWORD[rsi],xmm2

+ pxor xmm4,xmm12

+ movdqu XMMWORD[16+rsi],xmm3

+ pxor xmm5,xmm13

+ movdqu XMMWORD[32+rsi],xmm4

+ pxor xmm6,xmm10

+ movdqu XMMWORD[48+rsi],xmm5

+ movdqu XMMWORD[64+rsi],xmm6

+ cmp rdx,6

+ jb NEAR $L$ctr32_done

+

+ movups xmm11,XMMWORD[80+rdi]

+ xorps xmm7,xmm11

+ movups XMMWORD[80+rsi],xmm7

+ je NEAR $L$ctr32_done

+

+ movups xmm12,XMMWORD[96+rdi]

+ xorps xmm8,xmm12

+ movups XMMWORD[96+rsi],xmm8

+ jmp NEAR $L$ctr32_done

+

+ALIGN 32

+$L$ctr32_loop4:

+DB 102,15,56,220,209

+ lea rcx,[16+rcx]

+ dec eax

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movups xmm1,XMMWORD[rcx]

+ jnz NEAR $L$ctr32_loop4

+DB 102,15,56,221,209

+DB 102,15,56,221,217

+ movups xmm10,XMMWORD[rdi]

+ movups xmm11,XMMWORD[16+rdi]

+DB 102,15,56,221,225

+DB 102,15,56,221,233

+ movups xmm12,XMMWORD[32+rdi]

+ movups xmm13,XMMWORD[48+rdi]

+

+ xorps xmm2,xmm10

+ movups XMMWORD[rsi],xmm2

+ xorps xmm3,xmm11

+ movups XMMWORD[16+rsi],xmm3

+ pxor xmm4,xmm12

+ movdqu XMMWORD[32+rsi],xmm4

+ pxor xmm5,xmm13

+ movdqu XMMWORD[48+rsi],xmm5

+ jmp NEAR $L$ctr32_done

+

+ALIGN 32

+$L$ctr32_loop3:

+DB 102,15,56,220,209

+ lea rcx,[16+rcx]

+ dec eax

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+ movups xmm1,XMMWORD[rcx]

+ jnz NEAR $L$ctr32_loop3

+DB 102,15,56,221,209

+DB 102,15,56,221,217

+DB 102,15,56,221,225

+

+ movups xmm10,XMMWORD[rdi]

+ xorps xmm2,xmm10

+ movups XMMWORD[rsi],xmm2

+ cmp rdx,2

+ jb NEAR $L$ctr32_done

+

+ movups xmm11,XMMWORD[16+rdi]

+ xorps xmm3,xmm11

+ movups XMMWORD[16+rsi],xmm3

+ je NEAR $L$ctr32_done

+

+ movups xmm12,XMMWORD[32+rdi]

+ xorps xmm4,xmm12

+ movups XMMWORD[32+rsi],xmm4

+

+$L$ctr32_done:

+ xorps xmm0,xmm0

+ xor ebp,ebp

+ pxor xmm1,xmm1

+ pxor xmm2,xmm2

+ pxor xmm3,xmm3

+ pxor xmm4,xmm4

+ pxor xmm5,xmm5

+ movaps xmm6,XMMWORD[((-168))+r11]

+ movaps XMMWORD[(-168)+r11],xmm0

+ movaps xmm7,XMMWORD[((-152))+r11]

+ movaps XMMWORD[(-152)+r11],xmm0

+ movaps xmm8,XMMWORD[((-136))+r11]

+ movaps XMMWORD[(-136)+r11],xmm0

+ movaps xmm9,XMMWORD[((-120))+r11]

+ movaps XMMWORD[(-120)+r11],xmm0

+ movaps xmm10,XMMWORD[((-104))+r11]

+ movaps XMMWORD[(-104)+r11],xmm0

+ movaps xmm11,XMMWORD[((-88))+r11]

+ movaps XMMWORD[(-88)+r11],xmm0

+ movaps xmm12,XMMWORD[((-72))+r11]

+ movaps XMMWORD[(-72)+r11],xmm0

+ movaps xmm13,XMMWORD[((-56))+r11]

+ movaps XMMWORD[(-56)+r11],xmm0

+ movaps xmm14,XMMWORD[((-40))+r11]

+ movaps XMMWORD[(-40)+r11],xmm0

+ movaps xmm15,XMMWORD[((-24))+r11]

+ movaps XMMWORD[(-24)+r11],xmm0

+ movaps XMMWORD[rsp],xmm0

+ movaps XMMWORD[16+rsp],xmm0

+ movaps XMMWORD[32+rsp],xmm0

+ movaps XMMWORD[48+rsp],xmm0

+ movaps XMMWORD[64+rsp],xmm0

+ movaps XMMWORD[80+rsp],xmm0

+ movaps XMMWORD[96+rsp],xmm0

+ movaps XMMWORD[112+rsp],xmm0

+ mov rbp,QWORD[((-8))+r11]

+

+ lea rsp,[r11]

+

+$L$ctr32_epilogue:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_ctr32_encrypt_blocks:

+global aesni_xts_encrypt

+

+ALIGN 16

+aesni_xts_encrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_xts_encrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ lea r11,[rsp]

+

+ push rbp

+

+ sub rsp,272

+ and rsp,-16

+ movaps XMMWORD[(-168)+r11],xmm6

+ movaps XMMWORD[(-152)+r11],xmm7

+ movaps XMMWORD[(-136)+r11],xmm8

+ movaps XMMWORD[(-120)+r11],xmm9

+ movaps XMMWORD[(-104)+r11],xmm10

+ movaps XMMWORD[(-88)+r11],xmm11

+ movaps XMMWORD[(-72)+r11],xmm12

+ movaps XMMWORD[(-56)+r11],xmm13

+ movaps XMMWORD[(-40)+r11],xmm14

+ movaps XMMWORD[(-24)+r11],xmm15

+$L$xts_enc_body:

+ movups xmm2,XMMWORD[r9]

+ mov eax,DWORD[240+r8]

+ mov r10d,DWORD[240+rcx]

+ movups xmm0,XMMWORD[r8]

+ movups xmm1,XMMWORD[16+r8]

+ lea r8,[32+r8]

+ xorps xmm2,xmm0

+$L$oop_enc1_8:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[r8]

+ lea r8,[16+r8]

+ jnz NEAR $L$oop_enc1_8

+DB 102,15,56,221,209

+ movups xmm0,XMMWORD[rcx]

+ mov rbp,rcx

+ mov eax,r10d

+ shl r10d,4

+ mov r9,rdx

+ and rdx,-16

+

+ movups xmm1,XMMWORD[16+r10*1+rcx]

+

+ movdqa xmm8,XMMWORD[$L$xts_magic]

+ movdqa xmm15,xmm2

+ pshufd xmm9,xmm2,0x5f

+ pxor xmm1,xmm0

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm10,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm10,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm11,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm11,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm12,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm12,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm13,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm13,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm15

+ psrad xmm9,31

+ paddq xmm15,xmm15

+ pand xmm9,xmm8

+ pxor xmm14,xmm0

+ pxor xmm15,xmm9

+ movaps XMMWORD[96+rsp],xmm1

+

+ sub rdx,16*6

+ jc NEAR $L$xts_enc_short

+

+ mov eax,16+96

+ lea rcx,[32+r10*1+rbp]

+ sub rax,r10

+ movups xmm1,XMMWORD[16+rbp]

+ mov r10,rax

+ lea r8,[$L$xts_magic]

+ jmp NEAR $L$xts_enc_grandloop

+

+ALIGN 32

+$L$xts_enc_grandloop:

+ movdqu xmm2,XMMWORD[rdi]

+ movdqa xmm8,xmm0

+ movdqu xmm3,XMMWORD[16+rdi]

+ pxor xmm2,xmm10

+ movdqu xmm4,XMMWORD[32+rdi]

+ pxor xmm3,xmm11

+DB 102,15,56,220,209

+ movdqu xmm5,XMMWORD[48+rdi]

+ pxor xmm4,xmm12

+DB 102,15,56,220,217

+ movdqu xmm6,XMMWORD[64+rdi]

+ pxor xmm5,xmm13

+DB 102,15,56,220,225

+ movdqu xmm7,XMMWORD[80+rdi]

+ pxor xmm8,xmm15

+ movdqa xmm9,XMMWORD[96+rsp]

+ pxor xmm6,xmm14

+DB 102,15,56,220,233

+ movups xmm0,XMMWORD[32+rbp]

+ lea rdi,[96+rdi]

+ pxor xmm7,xmm8

+

+ pxor xmm10,xmm9

+DB 102,15,56,220,241

+ pxor xmm11,xmm9

+ movdqa XMMWORD[rsp],xmm10

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[48+rbp]

+ pxor xmm12,xmm9

+

+DB 102,15,56,220,208

+ pxor xmm13,xmm9

+ movdqa XMMWORD[16+rsp],xmm11

+DB 102,15,56,220,216

+ pxor xmm14,xmm9

+ movdqa XMMWORD[32+rsp],xmm12

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ pxor xmm8,xmm9

+ movdqa XMMWORD[64+rsp],xmm14

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+ movups xmm0,XMMWORD[64+rbp]

+ movdqa XMMWORD[80+rsp],xmm8

+ pshufd xmm9,xmm15,0x5f

+ jmp NEAR $L$xts_enc_loop6

+ALIGN 32

+$L$xts_enc_loop6:

+DB 102,15,56,220,209

+DB 102,15,56,220,217

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[((-64))+rax*1+rcx]

+ add rax,32

+

+DB 102,15,56,220,208

+DB 102,15,56,220,216

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+DB 102,15,56,220,248

+ movups xmm0,XMMWORD[((-80))+rax*1+rcx]

+ jnz NEAR $L$xts_enc_loop6

+

+ movdqa xmm8,XMMWORD[r8]

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+DB 102,15,56,220,209

+ paddq xmm15,xmm15

+ psrad xmm14,31

+DB 102,15,56,220,217

+ pand xmm14,xmm8

+ movups xmm10,XMMWORD[rbp]

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+DB 102,15,56,220,241

+ pxor xmm15,xmm14

+ movaps xmm11,xmm10

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[((-64))+rcx]

+

+ movdqa xmm14,xmm9

+DB 102,15,56,220,208

+ paddd xmm9,xmm9

+ pxor xmm10,xmm15

+DB 102,15,56,220,216

+ psrad xmm14,31

+ paddq xmm15,xmm15

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+ pand xmm14,xmm8

+ movaps xmm12,xmm11

+DB 102,15,56,220,240

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+DB 102,15,56,220,248

+ movups xmm0,XMMWORD[((-48))+rcx]

+

+ paddd xmm9,xmm9

+DB 102,15,56,220,209

+ pxor xmm11,xmm15

+ psrad xmm14,31

+DB 102,15,56,220,217

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ movdqa XMMWORD[48+rsp],xmm13

+ pxor xmm15,xmm14

+DB 102,15,56,220,241

+ movaps xmm13,xmm12

+ movdqa xmm14,xmm9

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[((-32))+rcx]

+

+ paddd xmm9,xmm9

+DB 102,15,56,220,208

+ pxor xmm12,xmm15

+ psrad xmm14,31

+DB 102,15,56,220,216

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+DB 102,15,56,220,224

+DB 102,15,56,220,232

+DB 102,15,56,220,240

+ pxor xmm15,xmm14

+ movaps xmm14,xmm13

+DB 102,15,56,220,248

+

+ movdqa xmm0,xmm9

+ paddd xmm9,xmm9

+DB 102,15,56,220,209

+ pxor xmm13,xmm15

+ psrad xmm0,31

+DB 102,15,56,220,217

+ paddq xmm15,xmm15

+ pand xmm0,xmm8

+DB 102,15,56,220,225

+DB 102,15,56,220,233

+ pxor xmm15,xmm0

+ movups xmm0,XMMWORD[rbp]

+DB 102,15,56,220,241

+DB 102,15,56,220,249

+ movups xmm1,XMMWORD[16+rbp]

+

+ pxor xmm14,xmm15

+DB 102,15,56,221,84,36,0

+ psrad xmm9,31

+ paddq xmm15,xmm15

+DB 102,15,56,221,92,36,16

+DB 102,15,56,221,100,36,32

+ pand xmm9,xmm8

+ mov rax,r10

+DB 102,15,56,221,108,36,48

+DB 102,15,56,221,116,36,64

+DB 102,15,56,221,124,36,80

+ pxor xmm15,xmm9

+

+ lea rsi,[96+rsi]

+ movups XMMWORD[(-96)+rsi],xmm2

+ movups XMMWORD[(-80)+rsi],xmm3

+ movups XMMWORD[(-64)+rsi],xmm4

+ movups XMMWORD[(-48)+rsi],xmm5

+ movups XMMWORD[(-32)+rsi],xmm6

+ movups XMMWORD[(-16)+rsi],xmm7

+ sub rdx,16*6

+ jnc NEAR $L$xts_enc_grandloop

+

+ mov eax,16+96

+ sub eax,r10d

+ mov rcx,rbp

+ shr eax,4

+

+$L$xts_enc_short:

+

+ mov r10d,eax

+ pxor xmm10,xmm0

+ add rdx,16*6

+ jz NEAR $L$xts_enc_done

+

+ pxor xmm11,xmm0

+ cmp rdx,0x20

+ jb NEAR $L$xts_enc_one

+ pxor xmm12,xmm0

+ je NEAR $L$xts_enc_two

+

+ pxor xmm13,xmm0

+ cmp rdx,0x40

+ jb NEAR $L$xts_enc_three

+ pxor xmm14,xmm0

+ je NEAR $L$xts_enc_four

+

+ movdqu xmm2,XMMWORD[rdi]

+ movdqu xmm3,XMMWORD[16+rdi]

+ movdqu xmm4,XMMWORD[32+rdi]

+ pxor xmm2,xmm10

+ movdqu xmm5,XMMWORD[48+rdi]

+ pxor xmm3,xmm11

+ movdqu xmm6,XMMWORD[64+rdi]

+ lea rdi,[80+rdi]

+ pxor xmm4,xmm12

+ pxor xmm5,xmm13

+ pxor xmm6,xmm14

+ pxor xmm7,xmm7

+

+ call _aesni_encrypt6

+

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm15

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+ movdqu XMMWORD[rsi],xmm2

+ xorps xmm5,xmm13

+ movdqu XMMWORD[16+rsi],xmm3

+ xorps xmm6,xmm14

+ movdqu XMMWORD[32+rsi],xmm4

+ movdqu XMMWORD[48+rsi],xmm5

+ movdqu XMMWORD[64+rsi],xmm6

+ lea rsi,[80+rsi]

+ jmp NEAR $L$xts_enc_done

+

+ALIGN 16

+$L$xts_enc_one:

+ movups xmm2,XMMWORD[rdi]

+ lea rdi,[16+rdi]

+ xorps xmm2,xmm10

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_enc1_9:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_enc1_9

+DB 102,15,56,221,209

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm11

+ movups XMMWORD[rsi],xmm2

+ lea rsi,[16+rsi]

+ jmp NEAR $L$xts_enc_done

+

+ALIGN 16

+$L$xts_enc_two:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ lea rdi,[32+rdi]

+ xorps xmm2,xmm10

+ xorps xmm3,xmm11

+

+ call _aesni_encrypt2

+

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm12

+ xorps xmm3,xmm11

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ lea rsi,[32+rsi]

+ jmp NEAR $L$xts_enc_done

+

+ALIGN 16

+$L$xts_enc_three:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ movups xmm4,XMMWORD[32+rdi]

+ lea rdi,[48+rdi]

+ xorps xmm2,xmm10

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+

+ call _aesni_encrypt3

+

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm13

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ lea rsi,[48+rsi]

+ jmp NEAR $L$xts_enc_done

+

+ALIGN 16

+$L$xts_enc_four:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ movups xmm4,XMMWORD[32+rdi]

+ xorps xmm2,xmm10

+ movups xmm5,XMMWORD[48+rdi]

+ lea rdi,[64+rdi]

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+ xorps xmm5,xmm13

+

+ call _aesni_encrypt4

+

+ pxor xmm2,xmm10

+ movdqa xmm10,xmm14

+ pxor xmm3,xmm11

+ pxor xmm4,xmm12

+ movdqu XMMWORD[rsi],xmm2

+ pxor xmm5,xmm13

+ movdqu XMMWORD[16+rsi],xmm3

+ movdqu XMMWORD[32+rsi],xmm4

+ movdqu XMMWORD[48+rsi],xmm5

+ lea rsi,[64+rsi]

+ jmp NEAR $L$xts_enc_done

+

+ALIGN 16

+$L$xts_enc_done:

+ and r9,15

+ jz NEAR $L$xts_enc_ret

+ mov rdx,r9

+

+$L$xts_enc_steal:

+ movzx eax,BYTE[rdi]

+ movzx ecx,BYTE[((-16))+rsi]

+ lea rdi,[1+rdi]

+ mov BYTE[((-16))+rsi],al

+ mov BYTE[rsi],cl

+ lea rsi,[1+rsi]

+ sub rdx,1

+ jnz NEAR $L$xts_enc_steal

+

+ sub rsi,r9

+ mov rcx,rbp

+ mov eax,r10d

+

+ movups xmm2,XMMWORD[((-16))+rsi]

+ xorps xmm2,xmm10

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_enc1_10:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_enc1_10

+DB 102,15,56,221,209

+ xorps xmm2,xmm10

+ movups XMMWORD[(-16)+rsi],xmm2

+

+$L$xts_enc_ret:

+ xorps xmm0,xmm0

+ pxor xmm1,xmm1

+ pxor xmm2,xmm2

+ pxor xmm3,xmm3

+ pxor xmm4,xmm4

+ pxor xmm5,xmm5

+ movaps xmm6,XMMWORD[((-168))+r11]

+ movaps XMMWORD[(-168)+r11],xmm0

+ movaps xmm7,XMMWORD[((-152))+r11]

+ movaps XMMWORD[(-152)+r11],xmm0

+ movaps xmm8,XMMWORD[((-136))+r11]

+ movaps XMMWORD[(-136)+r11],xmm0

+ movaps xmm9,XMMWORD[((-120))+r11]

+ movaps XMMWORD[(-120)+r11],xmm0

+ movaps xmm10,XMMWORD[((-104))+r11]

+ movaps XMMWORD[(-104)+r11],xmm0

+ movaps xmm11,XMMWORD[((-88))+r11]

+ movaps XMMWORD[(-88)+r11],xmm0

+ movaps xmm12,XMMWORD[((-72))+r11]

+ movaps XMMWORD[(-72)+r11],xmm0

+ movaps xmm13,XMMWORD[((-56))+r11]

+ movaps XMMWORD[(-56)+r11],xmm0

+ movaps xmm14,XMMWORD[((-40))+r11]

+ movaps XMMWORD[(-40)+r11],xmm0

+ movaps xmm15,XMMWORD[((-24))+r11]

+ movaps XMMWORD[(-24)+r11],xmm0

+ movaps XMMWORD[rsp],xmm0

+ movaps XMMWORD[16+rsp],xmm0

+ movaps XMMWORD[32+rsp],xmm0

+ movaps XMMWORD[48+rsp],xmm0

+ movaps XMMWORD[64+rsp],xmm0

+ movaps XMMWORD[80+rsp],xmm0

+ movaps XMMWORD[96+rsp],xmm0

+ mov rbp,QWORD[((-8))+r11]

+

+ lea rsp,[r11]

+

+$L$xts_enc_epilogue:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_xts_encrypt:

+global aesni_xts_decrypt

+

+ALIGN 16

+aesni_xts_decrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_xts_decrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ lea r11,[rsp]

+

+ push rbp

+

+ sub rsp,272

+ and rsp,-16

+ movaps XMMWORD[(-168)+r11],xmm6

+ movaps XMMWORD[(-152)+r11],xmm7

+ movaps XMMWORD[(-136)+r11],xmm8

+ movaps XMMWORD[(-120)+r11],xmm9

+ movaps XMMWORD[(-104)+r11],xmm10

+ movaps XMMWORD[(-88)+r11],xmm11

+ movaps XMMWORD[(-72)+r11],xmm12

+ movaps XMMWORD[(-56)+r11],xmm13

+ movaps XMMWORD[(-40)+r11],xmm14

+ movaps XMMWORD[(-24)+r11],xmm15

+$L$xts_dec_body:

+ movups xmm2,XMMWORD[r9]

+ mov eax,DWORD[240+r8]

+ mov r10d,DWORD[240+rcx]

+ movups xmm0,XMMWORD[r8]

+ movups xmm1,XMMWORD[16+r8]

+ lea r8,[32+r8]

+ xorps xmm2,xmm0

+$L$oop_enc1_11:

+DB 102,15,56,220,209

+ dec eax

+ movups xmm1,XMMWORD[r8]

+ lea r8,[16+r8]

+ jnz NEAR $L$oop_enc1_11

+DB 102,15,56,221,209

+ xor eax,eax

+ test rdx,15

+ setnz al

+ shl rax,4

+ sub rdx,rax

+

+ movups xmm0,XMMWORD[rcx]

+ mov rbp,rcx

+ mov eax,r10d

+ shl r10d,4

+ mov r9,rdx

+ and rdx,-16

+

+ movups xmm1,XMMWORD[16+r10*1+rcx]

+

+ movdqa xmm8,XMMWORD[$L$xts_magic]

+ movdqa xmm15,xmm2

+ pshufd xmm9,xmm2,0x5f

+ pxor xmm1,xmm0

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm10,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm10,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm11,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm11,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm12,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm12,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+ movdqa xmm13,xmm15

+ psrad xmm14,31

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+ pxor xmm13,xmm0

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm15

+ psrad xmm9,31

+ paddq xmm15,xmm15

+ pand xmm9,xmm8

+ pxor xmm14,xmm0

+ pxor xmm15,xmm9

+ movaps XMMWORD[96+rsp],xmm1

+

+ sub rdx,16*6

+ jc NEAR $L$xts_dec_short

+

+ mov eax,16+96

+ lea rcx,[32+r10*1+rbp]

+ sub rax,r10

+ movups xmm1,XMMWORD[16+rbp]

+ mov r10,rax

+ lea r8,[$L$xts_magic]

+ jmp NEAR $L$xts_dec_grandloop

+

+ALIGN 32

+$L$xts_dec_grandloop:

+ movdqu xmm2,XMMWORD[rdi]

+ movdqa xmm8,xmm0

+ movdqu xmm3,XMMWORD[16+rdi]

+ pxor xmm2,xmm10

+ movdqu xmm4,XMMWORD[32+rdi]

+ pxor xmm3,xmm11

+DB 102,15,56,222,209

+ movdqu xmm5,XMMWORD[48+rdi]

+ pxor xmm4,xmm12

+DB 102,15,56,222,217

+ movdqu xmm6,XMMWORD[64+rdi]

+ pxor xmm5,xmm13

+DB 102,15,56,222,225

+ movdqu xmm7,XMMWORD[80+rdi]

+ pxor xmm8,xmm15

+ movdqa xmm9,XMMWORD[96+rsp]

+ pxor xmm6,xmm14

+DB 102,15,56,222,233

+ movups xmm0,XMMWORD[32+rbp]

+ lea rdi,[96+rdi]

+ pxor xmm7,xmm8

+

+ pxor xmm10,xmm9

+DB 102,15,56,222,241

+ pxor xmm11,xmm9

+ movdqa XMMWORD[rsp],xmm10

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[48+rbp]

+ pxor xmm12,xmm9

+

+DB 102,15,56,222,208

+ pxor xmm13,xmm9

+ movdqa XMMWORD[16+rsp],xmm11

+DB 102,15,56,222,216

+ pxor xmm14,xmm9

+ movdqa XMMWORD[32+rsp],xmm12

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ pxor xmm8,xmm9

+ movdqa XMMWORD[64+rsp],xmm14

+DB 102,15,56,222,240

+DB 102,15,56,222,248

+ movups xmm0,XMMWORD[64+rbp]

+ movdqa XMMWORD[80+rsp],xmm8

+ pshufd xmm9,xmm15,0x5f

+ jmp NEAR $L$xts_dec_loop6

+ALIGN 32

+$L$xts_dec_loop6:

+DB 102,15,56,222,209

+DB 102,15,56,222,217

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[((-64))+rax*1+rcx]

+ add rax,32

+

+DB 102,15,56,222,208

+DB 102,15,56,222,216

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+DB 102,15,56,222,240

+DB 102,15,56,222,248

+ movups xmm0,XMMWORD[((-80))+rax*1+rcx]

+ jnz NEAR $L$xts_dec_loop6

+

+ movdqa xmm8,XMMWORD[r8]

+ movdqa xmm14,xmm9

+ paddd xmm9,xmm9

+DB 102,15,56,222,209

+ paddq xmm15,xmm15

+ psrad xmm14,31

+DB 102,15,56,222,217

+ pand xmm14,xmm8

+ movups xmm10,XMMWORD[rbp]

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+DB 102,15,56,222,241

+ pxor xmm15,xmm14

+ movaps xmm11,xmm10

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[((-64))+rcx]

+

+ movdqa xmm14,xmm9

+DB 102,15,56,222,208

+ paddd xmm9,xmm9

+ pxor xmm10,xmm15

+DB 102,15,56,222,216

+ psrad xmm14,31

+ paddq xmm15,xmm15

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+ pand xmm14,xmm8

+ movaps xmm12,xmm11

+DB 102,15,56,222,240

+ pxor xmm15,xmm14

+ movdqa xmm14,xmm9

+DB 102,15,56,222,248

+ movups xmm0,XMMWORD[((-48))+rcx]

+

+ paddd xmm9,xmm9

+DB 102,15,56,222,209

+ pxor xmm11,xmm15

+ psrad xmm14,31

+DB 102,15,56,222,217

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ movdqa XMMWORD[48+rsp],xmm13

+ pxor xmm15,xmm14

+DB 102,15,56,222,241

+ movaps xmm13,xmm12

+ movdqa xmm14,xmm9

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[((-32))+rcx]

+

+ paddd xmm9,xmm9

+DB 102,15,56,222,208

+ pxor xmm12,xmm15

+ psrad xmm14,31

+DB 102,15,56,222,216

+ paddq xmm15,xmm15

+ pand xmm14,xmm8

+DB 102,15,56,222,224

+DB 102,15,56,222,232

+DB 102,15,56,222,240

+ pxor xmm15,xmm14

+ movaps xmm14,xmm13

+DB 102,15,56,222,248

+

+ movdqa xmm0,xmm9

+ paddd xmm9,xmm9

+DB 102,15,56,222,209

+ pxor xmm13,xmm15

+ psrad xmm0,31

+DB 102,15,56,222,217

+ paddq xmm15,xmm15

+ pand xmm0,xmm8

+DB 102,15,56,222,225

+DB 102,15,56,222,233

+ pxor xmm15,xmm0

+ movups xmm0,XMMWORD[rbp]

+DB 102,15,56,222,241

+DB 102,15,56,222,249

+ movups xmm1,XMMWORD[16+rbp]

+

+ pxor xmm14,xmm15

+DB 102,15,56,223,84,36,0

+ psrad xmm9,31

+ paddq xmm15,xmm15

+DB 102,15,56,223,92,36,16

+DB 102,15,56,223,100,36,32

+ pand xmm9,xmm8

+ mov rax,r10

+DB 102,15,56,223,108,36,48

+DB 102,15,56,223,116,36,64

+DB 102,15,56,223,124,36,80

+ pxor xmm15,xmm9

+

+ lea rsi,[96+rsi]

+ movups XMMWORD[(-96)+rsi],xmm2

+ movups XMMWORD[(-80)+rsi],xmm3

+ movups XMMWORD[(-64)+rsi],xmm4

+ movups XMMWORD[(-48)+rsi],xmm5

+ movups XMMWORD[(-32)+rsi],xmm6

+ movups XMMWORD[(-16)+rsi],xmm7

+ sub rdx,16*6

+ jnc NEAR $L$xts_dec_grandloop

+

+ mov eax,16+96

+ sub eax,r10d

+ mov rcx,rbp

+ shr eax,4

+

+$L$xts_dec_short:

+

+ mov r10d,eax

+ pxor xmm10,xmm0

+ pxor xmm11,xmm0

+ add rdx,16*6

+ jz NEAR $L$xts_dec_done

+

+ pxor xmm12,xmm0

+ cmp rdx,0x20

+ jb NEAR $L$xts_dec_one

+ pxor xmm13,xmm0

+ je NEAR $L$xts_dec_two

+

+ pxor xmm14,xmm0

+ cmp rdx,0x40

+ jb NEAR $L$xts_dec_three

+ je NEAR $L$xts_dec_four

+

+ movdqu xmm2,XMMWORD[rdi]

+ movdqu xmm3,XMMWORD[16+rdi]

+ movdqu xmm4,XMMWORD[32+rdi]

+ pxor xmm2,xmm10

+ movdqu xmm5,XMMWORD[48+rdi]

+ pxor xmm3,xmm11

+ movdqu xmm6,XMMWORD[64+rdi]

+ lea rdi,[80+rdi]

+ pxor xmm4,xmm12

+ pxor xmm5,xmm13

+ pxor xmm6,xmm14

+

+ call _aesni_decrypt6

+

+ xorps xmm2,xmm10

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+ movdqu XMMWORD[rsi],xmm2

+ xorps xmm5,xmm13

+ movdqu XMMWORD[16+rsi],xmm3

+ xorps xmm6,xmm14

+ movdqu XMMWORD[32+rsi],xmm4

+ pxor xmm14,xmm14

+ movdqu XMMWORD[48+rsi],xmm5

+ pcmpgtd xmm14,xmm15

+ movdqu XMMWORD[64+rsi],xmm6

+ lea rsi,[80+rsi]

+ pshufd xmm11,xmm14,0x13

+ and r9,15

+ jz NEAR $L$xts_dec_ret

+

+ movdqa xmm10,xmm15

+ paddq xmm15,xmm15

+ pand xmm11,xmm8

+ pxor xmm11,xmm15

+ jmp NEAR $L$xts_dec_done2

+

+ALIGN 16

+$L$xts_dec_one:

+ movups xmm2,XMMWORD[rdi]

+ lea rdi,[16+rdi]

+ xorps xmm2,xmm10

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_dec1_12:

+DB 102,15,56,222,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_dec1_12

+DB 102,15,56,223,209

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm11

+ movups XMMWORD[rsi],xmm2

+ movdqa xmm11,xmm12

+ lea rsi,[16+rsi]

+ jmp NEAR $L$xts_dec_done

+

+ALIGN 16

+$L$xts_dec_two:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ lea rdi,[32+rdi]

+ xorps xmm2,xmm10

+ xorps xmm3,xmm11

+

+ call _aesni_decrypt2

+

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm12

+ xorps xmm3,xmm11

+ movdqa xmm11,xmm13

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ lea rsi,[32+rsi]

+ jmp NEAR $L$xts_dec_done

+

+ALIGN 16

+$L$xts_dec_three:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ movups xmm4,XMMWORD[32+rdi]

+ lea rdi,[48+rdi]

+ xorps xmm2,xmm10

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+

+ call _aesni_decrypt3

+

+ xorps xmm2,xmm10

+ movdqa xmm10,xmm13

+ xorps xmm3,xmm11

+ movdqa xmm11,xmm14

+ xorps xmm4,xmm12

+ movups XMMWORD[rsi],xmm2

+ movups XMMWORD[16+rsi],xmm3

+ movups XMMWORD[32+rsi],xmm4

+ lea rsi,[48+rsi]

+ jmp NEAR $L$xts_dec_done

+

+ALIGN 16

+$L$xts_dec_four:

+ movups xmm2,XMMWORD[rdi]

+ movups xmm3,XMMWORD[16+rdi]

+ movups xmm4,XMMWORD[32+rdi]

+ xorps xmm2,xmm10

+ movups xmm5,XMMWORD[48+rdi]

+ lea rdi,[64+rdi]

+ xorps xmm3,xmm11

+ xorps xmm4,xmm12

+ xorps xmm5,xmm13

+

+ call _aesni_decrypt4

+

+ pxor xmm2,xmm10

+ movdqa xmm10,xmm14

+ pxor xmm3,xmm11

+ movdqa xmm11,xmm15

+ pxor xmm4,xmm12

+ movdqu XMMWORD[rsi],xmm2

+ pxor xmm5,xmm13

+ movdqu XMMWORD[16+rsi],xmm3

+ movdqu XMMWORD[32+rsi],xmm4

+ movdqu XMMWORD[48+rsi],xmm5

+ lea rsi,[64+rsi]

+ jmp NEAR $L$xts_dec_done

+

+ALIGN 16

+$L$xts_dec_done:

+ and r9,15

+ jz NEAR $L$xts_dec_ret

+$L$xts_dec_done2:

+ mov rdx,r9

+ mov rcx,rbp

+ mov eax,r10d

+

+ movups xmm2,XMMWORD[rdi]

+ xorps xmm2,xmm11

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_dec1_13:

+DB 102,15,56,222,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_dec1_13

+DB 102,15,56,223,209

+ xorps xmm2,xmm11

+ movups XMMWORD[rsi],xmm2

+

+$L$xts_dec_steal:

+ movzx eax,BYTE[16+rdi]

+ movzx ecx,BYTE[rsi]

+ lea rdi,[1+rdi]

+ mov BYTE[rsi],al

+ mov BYTE[16+rsi],cl

+ lea rsi,[1+rsi]

+ sub rdx,1

+ jnz NEAR $L$xts_dec_steal

+

+ sub rsi,r9

+ mov rcx,rbp

+ mov eax,r10d

+

+ movups xmm2,XMMWORD[rsi]

+ xorps xmm2,xmm10

+ movups xmm0,XMMWORD[rcx]

+ movups xmm1,XMMWORD[16+rcx]

+ lea rcx,[32+rcx]

+ xorps xmm2,xmm0

+$L$oop_dec1_14:

+DB 102,15,56,222,209

+ dec eax

+ movups xmm1,XMMWORD[rcx]

+ lea rcx,[16+rcx]

+ jnz NEAR $L$oop_dec1_14

+DB 102,15,56,223,209

+ xorps xmm2,xmm10

+ movups XMMWORD[rsi],xmm2

+

+$L$xts_dec_ret:

+ xorps xmm0,xmm0

+ pxor xmm1,xmm1

+ pxor xmm2,xmm2

+ pxor xmm3,xmm3

+ pxor xmm4,xmm4

+ pxor xmm5,xmm5

+ movaps xmm6,XMMWORD[((-168))+r11]

+ movaps XMMWORD[(-168)+r11],xmm0

+ movaps xmm7,XMMWORD[((-152))+r11]

+ movaps XMMWORD[(-152)+r11],xmm0

+ movaps xmm8,XMMWORD[((-136))+r11]

+ movaps XMMWORD[(-136)+r11],xmm0

+ movaps xmm9,XMMWORD[((-120))+r11]

+ movaps XMMWORD[(-120)+r11],xmm0

+ movaps xmm10,XMMWORD[((-104))+r11]

+ movaps XMMWORD[(-104)+r11],xmm0

+ movaps xmm11,XMMWORD[((-88))+r11]

+ movaps XMMWORD[(-88)+r11],xmm0

+ movaps xmm12,XMMWORD[((-72))+r11]

+ movaps XMMWORD[(-72)+r11],xmm0

+ movaps xmm13,XMMWORD[((-56))+r11]

+ movaps XMMWORD[(-56)+r11],xmm0

+ movaps xmm14,XMMWORD[((-40))+r11]

+ movaps XMMWORD[(-40)+r11],xmm0

+ movaps xmm15,XMMWORD[((-24))+r11]

+ movaps XMMWORD[(-24)+r11],xmm0

+ movaps XMMWORD[rsp],xmm0

+ movaps XMMWORD[16+rsp],xmm0

+ movaps XMMWORD[32+rsp],xmm0

+ movaps XMMWORD[48+rsp],xmm0

+ movaps XMMWORD[64+rsp],xmm0

+ movaps XMMWORD[80+rsp],xmm0

+ movaps XMMWORD[96+rsp],xmm0

+ mov rbp,QWORD[((-8))+r11]

+

+ lea rsp,[r11]

+

+$L$xts_dec_epilogue:

+ mov rdi,QWORD[8+rsp] ;WIN64 epilogue

+ mov rsi,QWORD[16+rsp]

+ DB 0F3h,0C3h ;repret

+

+$L$SEH_end_aesni_xts_decrypt:

+global aesni_ocb_encrypt

+

+ALIGN 32

+aesni_ocb_encrypt:

+ mov QWORD[8+rsp],rdi ;WIN64 prologue

+ mov QWORD[16+rsp],rsi

+ mov rax,rsp

+$L$SEH_begin_aesni_ocb_encrypt:

+ mov rdi,rcx

+ mov rsi,rdx

+ mov rdx,r8

+ mov rcx,r9

+ mov r8,QWORD[40+rsp]

+ mov r9,QWORD[48+rsp]

+

+

+

+ lea rax,[rsp]

+ push rbx

+

+ push rbp