[edk2-devel] [PATCH] [edk2-basetools]GenCrc32:Convert the C tool of calculating the crc32 into a python tool

liwenzha posted 1 patch 1 year, 8 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/edk2 tags/patchew/20220901065702.2412-1-wenzhao1.li@intel.com
There is a newer version of this series
edk2basetools/GenCrc32/GenCrc32.py            | 373 ++++++++++++++++++
edk2basetools/GenCrc32/__init__.py            |  10 +
edk2basetools/tests/GenCrc32/decode/PcdPeim   | Bin 0 -> 18912 bytes
.../tests/GenCrc32/decode/PcdPeim_crc32       | Bin 0 -> 18916 bytes
.../tests/GenCrc32/decode/S3Resume2Pei        | Bin 0 -> 18272 bytes
.../tests/GenCrc32/decode/S3Resume2Pei_crc32  | Bin 0 -> 18276 bytes
edk2basetools/tests/GenCrc32/decode/demo      |   1 +
edk2basetools/tests/GenCrc32/decode/demo_crc  |   1 +
.../tests/GenCrc32/encode/PcdPeim.efi         | Bin 0 -> 18912 bytes
.../tests/GenCrc32/encode/PcdPeim_crc32       | Bin 0 -> 18916 bytes
.../tests/GenCrc32/encode/S3Resume2Pei.efi    | Bin 0 -> 18272 bytes
.../tests/GenCrc32/encode/S3Resume2Pei_crc32  | Bin 0 -> 18276 bytes
edk2basetools/tests/GenCrc32/encode/demo.bin  |   1 +
edk2basetools/tests/GenCrc32/encode/demo_crc  |   1 +
edk2basetools/tests/GenCrc32/test_gencrc32.py | 124 ++++++
15 files changed, 511 insertions(+)
create mode 100644 edk2basetools/GenCrc32/GenCrc32.py
create mode 100644 edk2basetools/GenCrc32/__init__.py
create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim
create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim_crc32
create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei
create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32
create mode 100644 edk2basetools/tests/GenCrc32/decode/demo
create mode 100644 edk2basetools/tests/GenCrc32/decode/demo_crc
create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim.efi
create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim_crc32
create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei.efi
create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32
create mode 100644 edk2basetools/tests/GenCrc32/encode/demo.bin
create mode 100644 edk2basetools/tests/GenCrc32/encode/demo_crc
create mode 100644 edk2basetools/tests/GenCrc32/test_gencrc32.py
[edk2-devel] [PATCH] [edk2-basetools]GenCrc32:Convert the C tool of calculating the crc32 into a python tool
Posted by liwenzha 1 year, 8 months ago
description

This patch converts the C tool of calculating the crc32 value of file into

a python file. To realize this,after reading the data into the file in

binary form from an original file,a lookup table is listed to do XOR and

shifting calculation for each bit in the file.The 32-bit result is placed

at the beginning of the file as the header.The verification part will

recalculate the crc32 value of the data behind the header again.When header

is equal to the recalculating result,which means the crc32 value of this file

is correct and the file is valid.In the unit testing part,some files which

have been preprocessed by C tool are placed in a folder.The file after processing

by python tool will be compared with these files to check whether the result is correct.

Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Yuwei Chen <yuwei.chen@intel.com>

---
 edk2basetools/GenCrc32/GenCrc32.py            | 373 ++++++++++++++++++
 edk2basetools/GenCrc32/__init__.py            |  10 +
 edk2basetools/tests/GenCrc32/decode/PcdPeim   | Bin 0 -> 18912 bytes
 .../tests/GenCrc32/decode/PcdPeim_crc32       | Bin 0 -> 18916 bytes
 .../tests/GenCrc32/decode/S3Resume2Pei        | Bin 0 -> 18272 bytes
 .../tests/GenCrc32/decode/S3Resume2Pei_crc32  | Bin 0 -> 18276 bytes
 edk2basetools/tests/GenCrc32/decode/demo      |   1 +
 edk2basetools/tests/GenCrc32/decode/demo_crc  |   1 +
 .../tests/GenCrc32/encode/PcdPeim.efi         | Bin 0 -> 18912 bytes
 .../tests/GenCrc32/encode/PcdPeim_crc32       | Bin 0 -> 18916 bytes
 .../tests/GenCrc32/encode/S3Resume2Pei.efi    | Bin 0 -> 18272 bytes
 .../tests/GenCrc32/encode/S3Resume2Pei_crc32  | Bin 0 -> 18276 bytes
 edk2basetools/tests/GenCrc32/encode/demo.bin  |   1 +
 edk2basetools/tests/GenCrc32/encode/demo_crc  |   1 +
 edk2basetools/tests/GenCrc32/test_gencrc32.py | 124 ++++++
 15 files changed, 511 insertions(+)
 create mode 100644 edk2basetools/GenCrc32/GenCrc32.py
 create mode 100644 edk2basetools/GenCrc32/__init__.py
 create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim
 create mode 100644 edk2basetools/tests/GenCrc32/decode/PcdPeim_crc32
 create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei
 create mode 100644 edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32
 create mode 100644 edk2basetools/tests/GenCrc32/decode/demo
 create mode 100644 edk2basetools/tests/GenCrc32/decode/demo_crc
 create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim.efi
 create mode 100644 edk2basetools/tests/GenCrc32/encode/PcdPeim_crc32
 create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei.efi
 create mode 100644 edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32
 create mode 100644 edk2basetools/tests/GenCrc32/encode/demo.bin
 create mode 100644 edk2basetools/tests/GenCrc32/encode/demo_crc
 create mode 100644 edk2basetools/tests/GenCrc32/test_gencrc32.py

diff --git a/edk2basetools/GenCrc32/GenCrc32.py b/edk2basetools/GenCrc32/GenCrc32.py
new file mode 100644
index 0000000..e27e4b0
--- /dev/null
+++ b/edk2basetools/GenCrc32/GenCrc32.py
@@ -0,0 +1,373 @@
+#@file
+#Calculate Crc32 value and Verify Crc32 value for input data.
+#
+#Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
+#SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+#
+#Import Modules
+#
+import io
+import logging
+import argparse
+import os
+import sys
+
+mCrcTable=[0x00000000,
+  0x77073096,
+  0xEE0E612C,
+  0x990951BA,
+  0x076DC419,
+  0x706AF48F,
+  0xE963A535,
+  0x9E6495A3,
+  0x0EDB8832,
+  0x79DCB8A4,
+  0xE0D5E91E,
+  0x97D2D988,
+  0x09B64C2B,
+  0x7EB17CBD,
+  0xE7B82D07,
+  0x90BF1D91,
+  0x1DB71064,
+  0x6AB020F2,
+  0xF3B97148,
+  0x84BE41DE,
+  0x1ADAD47D,
+  0x6DDDE4EB,
+  0xF4D4B551,
+  0x83D385C7,
+  0x136C9856,
+  0x646BA8C0,
+  0xFD62F97A,
+  0x8A65C9EC,
+  0x14015C4F,
+  0x63066CD9,
+  0xFA0F3D63,
+  0x8D080DF5,
+  0x3B6E20C8,
+  0x4C69105E,
+  0xD56041E4,
+  0xA2677172,
+  0x3C03E4D1,
+  0x4B04D447,
+  0xD20D85FD,
+  0xA50AB56B,
+  0x35B5A8FA,
+  0x42B2986C,
+  0xDBBBC9D6,
+  0xACBCF940,
+  0x32D86CE3,
+  0x45DF5C75,
+  0xDCD60DCF,
+  0xABD13D59,
+  0x26D930AC,
+  0x51DE003A,
+  0xC8D75180,
+  0xBFD06116,
+  0x21B4F4B5,
+  0x56B3C423,
+  0xCFBA9599,
+  0xB8BDA50F,
+  0x2802B89E,
+  0x5F058808,
+  0xC60CD9B2,
+  0xB10BE924,
+  0x2F6F7C87,
+  0x58684C11,
+  0xC1611DAB,
+  0xB6662D3D,
+  0x76DC4190,
+  0x01DB7106,
+  0x98D220BC,
+  0xEFD5102A,
+  0x71B18589,
+  0x06B6B51F,
+  0x9FBFE4A5,
+  0xE8B8D433,
+  0x7807C9A2,
+  0x0F00F934,
+  0x9609A88E,
+  0xE10E9818,
+  0x7F6A0DBB,
+  0x086D3D2D,
+  0x91646C97,
+  0xE6635C01,
+  0x6B6B51F4,
+  0x1C6C6162,
+  0x856530D8,
+  0xF262004E,
+  0x6C0695ED,
+  0x1B01A57B,
+  0x8208F4C1,
+  0xF50FC457,
+  0x65B0D9C6,
+  0x12B7E950,
+  0x8BBEB8EA,
+  0xFCB9887C,
+  0x62DD1DDF,
+  0x15DA2D49,
+  0x8CD37CF3,
+  0xFBD44C65,
+  0x4DB26158,
+  0x3AB551CE,
+  0xA3BC0074,
+  0xD4BB30E2,
+  0x4ADFA541,
+  0x3DD895D7,
+  0xA4D1C46D,
+  0xD3D6F4FB,
+  0x4369E96A,
+  0x346ED9FC,
+  0xAD678846,
+  0xDA60B8D0,
+  0x44042D73,
+  0x33031DE5,
+  0xAA0A4C5F,
+  0xDD0D7CC9,
+  0x5005713C,
+  0x270241AA,
+  0xBE0B1010,
+  0xC90C2086,
+  0x5768B525,
+  0x206F85B3,
+  0xB966D409,
+  0xCE61E49F,
+  0x5EDEF90E,
+  0x29D9C998,
+  0xB0D09822,
+  0xC7D7A8B4,
+  0x59B33D17,
+  0x2EB40D81,
+  0xB7BD5C3B,
+  0xC0BA6CAD,
+  0xEDB88320,
+  0x9ABFB3B6,
+  0x03B6E20C,
+  0x74B1D29A,
+  0xEAD54739,
+  0x9DD277AF,
+  0x04DB2615,
+  0x73DC1683,
+  0xE3630B12,
+  0x94643B84,
+  0x0D6D6A3E,
+  0x7A6A5AA8,
+  0xE40ECF0B,
+  0x9309FF9D,
+  0x0A00AE27,
+  0x7D079EB1,
+  0xF00F9344,
+  0x8708A3D2,
+  0x1E01F268,
+  0x6906C2FE,
+  0xF762575D,
+  0x806567CB,
+  0x196C3671,
+  0x6E6B06E7,
+  0xFED41B76,
+  0x89D32BE0,
+  0x10DA7A5A,
+  0x67DD4ACC,
+  0xF9B9DF6F,
+  0x8EBEEFF9,
+  0x17B7BE43,
+  0x60B08ED5,
+  0xD6D6A3E8,
+  0xA1D1937E,
+  0x38D8C2C4,
+  0x4FDFF252,
+  0xD1BB67F1,
+  0xA6BC5767,
+  0x3FB506DD,
+  0x48B2364B,
+  0xD80D2BDA,
+  0xAF0A1B4C,
+  0x36034AF6,
+  0x41047A60,
+  0xDF60EFC3,
+  0xA867DF55,
+  0x316E8EEF,
+  0x4669BE79,
+  0xCB61B38C,
+  0xBC66831A,
+  0x256FD2A0,
+  0x5268E236,
+  0xCC0C7795,
+  0xBB0B4703,
+  0x220216B9,
+  0x5505262F,
+  0xC5BA3BBE,
+  0xB2BD0B28,
+  0x2BB45A92,
+  0x5CB36A04,
+  0xC2D7FFA7,
+  0xB5D0CF31,
+  0x2CD99E8B,
+  0x5BDEAE1D,
+  0x9B64C2B0,
+  0xEC63F226,
+  0x756AA39C,
+  0x026D930A,
+  0x9C0906A9,
+  0xEB0E363F,
+  0x72076785,
+  0x05005713,
+  0x95BF4A82,
+  0xE2B87A14,
+  0x7BB12BAE,
+  0x0CB61B38,
+  0x92D28E9B,
+  0xE5D5BE0D,
+  0x7CDCEFB7,
+  0x0BDBDF21,
+  0x86D3D2D4,
+  0xF1D4E242,
+  0x68DDB3F8,
+  0x1FDA836E,
+  0x81BE16CD,
+  0xF6B9265B,
+  0x6FB077E1,
+  0x18B74777,
+  0x88085AE6,
+  0xFF0F6A70,
+  0x66063BCA,
+  0x11010B5C,
+  0x8F659EFF,
+  0xF862AE69,
+  0x616BFFD3,
+  0x166CCF45,
+  0xA00AE278,
+  0xD70DD2EE,
+  0x4E048354,
+  0x3903B3C2,
+  0xA7672661,
+  0xD06016F7,
+  0x4969474D,
+  0x3E6E77DB,
+  0xAED16A4A,
+  0xD9D65ADC,
+  0x40DF0B66,
+  0x37D83BF0,
+  0xA9BCAE53,
+  0xDEBB9EC5,
+  0x47B2CF7F,
+  0x30B5FFE9,
+  0xBDBDF21C,
+  0xCABAC28A,
+  0x53B39330,
+  0x24B4A3A6,
+  0xBAD03605,
+  0xCDD70693,
+  0x54DE5729,
+  0x23D967BF,
+  0xB3667A2E,
+  0xC4614AB8,
+  0x5D681B02,
+  0x2A6F2B94,
+  0xB40BBE37,
+  0xC30C8EA1,
+  0x5A05DF1B,
+  0x2D02EF8D]
+
+
+parser=argparse.ArgumentParser(description='''
+Calculate Crc32 value and Verify Crc32 value for input data.
+''')
+parser.add_argument("-e","--encode",dest="inputfilename1",
+                    help="Calculate andverify CRC32 value for the input file.")
+parser.add_argument("-d","--decode",dest="inputfilename2",
+                    help="Verify CRC32 value for the input file.")
+parser.add_argument("-o","--output",dest="outputfilename",
+                    help="Output file name.")
+parser.add_argument("-s","--silent",help="Returns only the exit code;informational and error messages are not displayed.")                   
+parser.add_argument("--version", action="version", version='%(prog)s Version 2.0',
+                    help="Show program's version number and exit.")
+
+group=parser.add_mutually_exclusive_group()
+group.add_argument("-v","--verbose",action="store_true",
+                    help="Print information statements")
+group.add_argument("-q","--quiet",action="store_true",
+                    help="Disable all messages except fatal errors")
+
+
+
+#Calculate the Crc32 and store it in the file
+def CalculateCrc32(inputfile:str, outputfile:str, filebytes=b''):
+    logger=logging.getLogger('GenCrC32')
+    status=0
+    try:
+        Crc=0xffffffff
+        if filebytes != b'':
+            temp = filebytes
+            status=1
+        else:
+            with open(inputfile,'rb') as fin:             
+                temp=fin.read()
+                
+        DataSize = len(temp)
+        for Index in range(DataSize):                 
+            Crc=(Crc>>8)^mCrcTable[(Crc&0xff)^temp[Index]]
+        CrcOut=Crc^0xffffffff
+        CrcOut=CrcOut.to_bytes(4,byteorder="little")
+        with open(outputfile,'wb') as fout:        
+            if status==0:
+                fout.write(CrcOut)
+            fout.write(temp)
+    except Exception as e:
+        logger.error("Calculation failed!")
+        raise(e)
+    return CrcOut
+
+
+#Verify the CRC and checkout if the file is correct
+def VerifyCrc32(inputfile1:str,outputfile1:str):
+    logger=logging.getLogger('GenCrC32')
+    try:
+        with open(inputfile1,'rb') as fin3:
+            head=fin3.read()
+            header=head[0:4]
+            calres=CalculateCrc32('', outputfile1, head[4:])
+
+        if calres==header:
+            return calres
+        else:
+            logger.error("Invalid file!")
+            raise(e)
+    
+    except Exception as e:
+        logger.error("Verification failed!")
+        raise(e)
+
+
+def main():
+    args=parser.parse_args()
+
+    logger=logging.getLogger('GenCrc32')
+    if args.quiet:
+        logger.setLevel(logging.CRITICAL)
+    if args.verbose:
+        logger.setLevel(logging.DEBUG)
+    lh = logging.StreamHandler(sys.stdout)
+    lf = logging.Formatter("%(levelname)-8s: %(message)s")
+    lh.setFormatter(lf)
+    logger.addHandler(lh)
+
+    try:
+        if len(sys.argv)==1:
+            parser.print_help()
+            logger.error("Missing options")
+            raise(e)
+        if args.inputfilename1:
+            CalculateCrc32(args.inputfilename1,args.outputfilename)
+        elif args.inputfilename2:
+            VerifyCrc32(args.inputfilename2,args.outputfilename)
+    except Exception as e:
+        return 1
+    return 0
+
+
+if __name__=="__main__":
+    exit(main())
\ No newline at end of file
diff --git a/edk2basetools/GenCrc32/__init__.py b/edk2basetools/GenCrc32/__init__.py
new file mode 100644
index 0000000..b35de32
--- /dev/null
+++ b/edk2basetools/GenCrc32/__init__.py
@@ -0,0 +1,10 @@
+# @file
+#  Calculate the crc32 value of file.
+#
+#  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+# Import Modules
diff --git a/edk2basetools/tests/GenCrc32/decode/PcdPeim b/edk2basetools/tests/GenCrc32/decode/PcdPeim
new file mode 100644
index 0000000000000000000000000000000000000000..db03070a222507e0d035754fb46973ac92b32931
GIT binary patch
literal 18912
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
OQHmp_46oNX?*9TcgYjno

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/decode/PcdPeim_crc32 b/edk2basetools/tests/GenCrc32/decode/PcdPeim_crc32
new file mode 100644
index 0000000000000000000000000000000000000000..c2ccd306172b3240103cf19dd12ebede0f1330ce
GIT binary patch
literal 18916
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
S=A{&-6s0&)%J6!P<NhxjY4f)L

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei b/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei
new file mode 100644
index 0000000000000000000000000000000000000000..2d1d44821ef897723d0da667f2e0b495e8ce013b
GIT binary patch
literal 18272
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
NT#2E7r*z}b{{lGaaHjwO

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32 b/edk2basetools/tests/GenCrc32/decode/S3Resume2Pei_crc32
new file mode 100644
index 0000000000000000000000000000000000000000..d18f172842a5579fe15b9ac8c9bb90ba06b96644
GIT binary patch
literal 18276
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
RoR7H}b0voUozjgz{|nl9a@7C;

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/decode/demo b/edk2basetools/tests/GenCrc32/decode/demo
new file mode 100644
index 0000000..9f9601c
--- /dev/null
+++ b/edk2basetools/tests/GenCrc32/decode/demo
@@ -0,0 +1 @@
+This is a test file for the GenCrc32 python tool~
\ No newline at end of file
diff --git a/edk2basetools/tests/GenCrc32/decode/demo_crc b/edk2basetools/tests/GenCrc32/decode/demo_crc
new file mode 100644
index 0000000..546f91f
--- /dev/null
+++ b/edk2basetools/tests/GenCrc32/decode/demo_crc
@@ -0,0 +1 @@
+U@"�This is a test file for the GenCrc32 python tool~
\ No newline at end of file
diff --git a/edk2basetools/tests/GenCrc32/encode/PcdPeim.efi b/edk2basetools/tests/GenCrc32/encode/PcdPeim.efi
new file mode 100644
index 0000000000000000000000000000000000000000..db03070a222507e0d035754fb46973ac92b32931
GIT binary patch
literal 18912
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
OQHmp_46oNX?*9TcgYjno

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/encode/PcdPeim_crc32 b/edk2basetools/tests/GenCrc32/encode/PcdPeim_crc32
new file mode 100644
index 0000000000000000000000000000000000000000..c2ccd306172b3240103cf19dd12ebede0f1330ce
GIT binary patch
literal 18916
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
S=A{&-6s0&)%J6!P<NhxjY4f)L

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei.efi b/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei.efi
new file mode 100644
index 0000000000000000000000000000000000000000..2d1d44821ef897723d0da667f2e0b495e8ce013b
GIT binary patch
literal 18272
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
NT#2E7r*z}b{{lGaaHjwO

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32 b/edk2basetools/tests/GenCrc32/encode/S3Resume2Pei_crc32
new file mode 100644
index 0000000000000000000000000000000000000000..d18f172842a5579fe15b9ac8c9bb90ba06b96644
GIT binary patch
literal 18276
zcmdUXdt8)d-uKN(M;W;%MI)oU&CxIq0RzZU0U5v+bYM6Lp@=XzATTs@59qEMG*FIr
zQ$EjAdurS5*{%KT^K8%No=n(sL0phbv)s~Z-_6vvn;k1n7tpAAzQ609;pCxh-_QHU
zJD<<ohwJ*CPuK6d23>S{pDDML`<Fil{$<Sndqjht<8u50ClETr`Ogpb3%P64eH{1P
zTxH5Xh~qZ-b6nR_<z2vyzLP(jvJ^NP51u^feb?M%{6@o@AfN2VajJBVE4UHBzc{vB
zG;I@sTL>LVFVdCn<39q&nU`CuD#QwoTY9^qd#d+79xj#RvX?7hTp48LGC<3Fp9FVg
zxz$u>sZ?|#-8kY+_i>+8j)S%nKT?J^u=<J9)lYO)KXIn|3Ay@-6Fskw`xHlYNjtPE
zDMzbzzSce9?>HM!eEFBoH!uJ9`f>s+Dwag81|VvwKpX1HnBz(K$`+U~Y*Rbm1S~Kv
zzu=zg>~-z9-SZ{To*w~6b@@gglWTo}+Nl8?#|vlF0)Nk$juzO1k8XM0kB{VqF1}Nq
z$KTU+bW64ruEixstHQNFtHHHO8<y=je8zL~$~bxdvt=2_wReg0K#=b|bGvO0paZ4+
zu*>}2M;0G)p6HhSFY~{W*O#uB=1SH;>Dwx)RxNGTcs7R;nPP}X>M)Hj|2N)LOiv$+
zVzLB-fw~0e%y?tiS@6cl*+J(pASdGg@;ZEDUj6}cA^%gp^TT<z`zS|S_@AcC!)-_S
z0lLxD89y7}5#{FxQ#j59IEMX1|ER9gk_UT=tDz4Q4$L+3|9Cu}_AYzS$mKe>>fDqI
zyQgNIy;eRM>M;ds%E;yFdbj%A^y*Klol_ls{$~fT11%dRSnr;GPW1`F1)hawMPrQN
za5-iau7Mcuneu7o*=rjoLxqenwlK!hl<LnMy<mJD=((?anplXjGzD;Ays@WHy5KlJ
zTvROg+{SSS$y|Rtk7Ci@wSAt!Ol6};{xvecxbsWQb!gyzc|IT=hcySdO)XqsPyy0F
zji-*B^ep4gs4(>ft;h8*mKH8SCHgy6l3s1TfaEerDo<WmNr^&RyPRkjGTKiDf_63r
z<UipZw99o}8>NpnFzGHtAPcS*o7=#<HdS6g5T*;9EB7xB(?tNQrBi+SkuZoS-;LVk
z(hnQ*I#R(;el3LK7`xd9^K-y9lX~)5o>-{eNiO|}!KMF;K>~(HBVEK``{4FjMdsH>
zVfQPrMaAYoNC)mOumMf^#(uBm92YW-kZ-5jm35C3xrcC>WsZ*naCm7)3-0pgKq*0_
zs(*Bi_X~Sg%JL7+nj+42Tu^rgXaWK{P)br|%Pc08tO2k&73LdftO$ddjHO7gRV3={
zLzpv@naN$Ui!srwq{#L`zU^L2wyw-fTW#dq@5Hn2{e+EbyIRT&3(gGZ+f*2me-7iA
z&rEd71Wug*fJr((n#gGZaWc0l=J+mPI`)#S^ATWqy8g~7P$^A*ZYIZp8_>Z}dU&q5
zt2VW~*p;CzFqnS?RP&3t6wAdxcN`9F*(LbfR}5x``ioJ6nOZ+_iKi*de42s8Fc39R
z4Mu|zA5T*_X64Orwd1hhUPYi`_Y<{gW1xT}ptl*2#y!{5q&8;&2p&8)gQ<miwdYhx
z3ArKA>xLFtW}&T?cc?k8eB*-@f{qJIjfF+hySodte6jR}bB8uYer`HQ1$hjb5`KS<
zcGg0~Rac&|^{mIka|nV6b0g#BEYL>CHpWjQU2g5+5V~?6NY_r0PL#+$$CK_8RMVh6
zsVaALVP2uDKr3{xApH;=I#dW(m@pwn8)}X7PRo6m*^{9aFp(V7bi4T}u<CpoL8K&5
z8`zb&1Ct}0rtFJ!`|s1X?9k5QM74BWUNsGzg%bBve*cl=dz<gn4LZ8dW)>DXMXgrO
zhp9>=xx`tgjdW`Z9o_HN`pGF6lrFwXs~rJhE*|-W0PBa4jw-E|E}@)sQr8unp$(H>
zbMyz0(!n`eK~dMqJF^1YKjGUPzySVIsZOhvzECEmHweB=8!we<1&}y;kT?+~=X7U!
zAT4>)G3gKu1RrhfXC$%$TmM8ojFWdgta7}?IX?BXzX$wy@C^k<gyWD3e6$Ym@*`R7
zE-azpU>k{&9^>d!0fU?fg~IvvG?dWtjT;_x99}w_&}t;Kd7lz3zbCVl$eFn5-f!>X
z+x`YUbZ>QV>1s~?47QdZ;bEf_7{K#iF@Q+bpa4-fA+Le25D%eLgtir#Pbf4i7)|L5
zTH1??<h$@{@Dv5Yp;SP!P#!-rt0Gyj#!UqM9P|LHngE)rfCd9peiH!ZKaVCgDydSF
zwol0HGk^k#&RBE?<7&tnV%D*V1aG_M@kl#WQWoKdqIiY!_niLG`fJ_tG_4;E9cYWe
zD(k1I4U@x$Jf4#HGHs|B@P*s&nrsWAplKhp-$%I>G@4tFE9u!;Jjyi?_K;6Pn35v%
zdPNJpB3fVO^yDe9-Nq2-#yPc`_0`TPu&df}X2h8})0Ih;HgrOzHBhD9O{AExek$-r
zH6re5@=S%Zxl!TqA@V@V5(2WqjHvzawz1gL80d+VL#C2lBII32Ja6_Z%cJ9hfErM2
zKEMd*-Y+jk)JEXD6yHdEW8}v{6e0?J_yV0XAeWbR2xQFL6!s+ZK`P|0(n<#}&o>k)
zHQfMQ^2h72jC4#X=&xX`#E3{U5Q*amEZ~RH+Bu4LhZpVSIJ9;`LtqK8|4j1{$lLi2
zo0hlI3?vMLgkfV6YKXjL9QlRgSDXC+B+33dj>SDb$r=eY=4Pnh@uGe-4)tS<l^|Io
z+TVwCGD#;Z(jB9jB6C<274lTPNK?Sq)2KEtWkbspYM!P*Pn<cG4b8<674asOxrz-;
zV*{a{CXIPF8yJQ^JxxnJO%dkbv4M}7gHx3y#C(R0on$~-Pm^F)M-%r$G++z#=*;o#
z{WlCLQub3cMci$V8gHY2XY=aLYvUCCipF+m!?=>2LGt~GWGSS*UyNx@pf%aP)UjR7
z*;P_nSa4dnc(?aHr)4{qLCs(qmci+RX;=mWqu+A-|He;RtC5?odOUI$5t6Bzj$loO
zFT;I><_vPKq(tX&&o1`B`EoxX4akHDj|OJUQqpDnIcX=#Z1v+uJk5cQEh{<C3dfdA
z&aq`JzD1mQ2h^>0X2nw&*QO%Z`mz#dAf+}GI-Ap-<qtTs^5qvm*wY;9Y1WvZ2Y8|U
z6dMTlG>4gAX9Es4p!PJY%vace6$6gLsh(!7r&%zE>j-Nj16t~7jxcAifm}8a<7tjG
z*RcUgfBxmHc!T*V_P&%+N%l0a^fV`$Utwcm3@OvooNhkP2BxxswVvh&%xcu9LU|B&
z@iZ5Cn)A&uY~UjdFkv=&noG@PZ0t=cSp2KT++3rSg)*#3I>xvE5ILNpE7wKa=So>&
z0a+SDEeAR(xs}|^0}8N7$Lw|h#l_eg#udk~amDeAOCAqa;Bc-)sgBrmA$~LqvFtod
z2@M~GVFxB<MU1_jmez#@tONb<Sy`cmJYAQ;U;t|}sk{{nq~ow)ERxqEB1%fAQQpA%
z6jZ9bJo!W*0;6ywzcxZr89aG8@ILqj>bm-SB>hN#Paf4V>6&z@-D96^ejNID(jKX!
zWd(9Mo1#dXCs_hfJ-o9gM`!P&S?Ar(hCnQ$zUeXK;8A4PF4Y+IG5o(nv=Zk$sn=-<
zq$RfmtyL(sR+s)ja=c2UAR1VQ7^SxriS`qYG=<qFGY~fcl*gvO$EK%ZJQUu*E!@$o
z8aLm}=9fzw16|FkF`dSQE@A*cPk<lnx5FFZcoOV0l9t=2C2b6}2k!H8`$u;vEkbCI
zk)%BVX^a1e9)x2>mV~dpzf?LZtB9IgCG`%SPU^EELue+FW<EvGlwhq_Ut~_(_+XC_
zWl%-RlgjUl4@kYPt)8J1NpjOHvpN=dy3&pe+~waAs?_J5YN4qZ@6`8cDrrcZVFc+n
zKl6CtZMVPFOVUy|lb1(ZoV<>%4A6NMC4+5-7L6}nZ?kw(cl-`?*}_vBQ7Wf0mJ}`^
zBI#AZdUeskD}b<T%;!mf*iy8Ua}_8dSg*x+1Z{cZXxyL1J$9|fE_m$W9($O_9_q1c
zJa)CmuBwff%}h}3M(^%U?J!;8jLyPgXYL3>l>cd-lskOR-{~jis&Knwy_9=JdDY-{
z8$cc$+k1t>A$C>qA72M|I74IJM`Fa3N^i*Dfo3JrhEOau)663@9P3sO_5_F;a~OiX
zHj#je7*MXpwfYK054r)gg@SYSFhznhTZK}n{zZT|%Y2$p?k??kk@7?!ESjqI803LZ
zJsvZ4GPQc57^oO@tbNFXUXH7&)>-CkqA|a;qkw4qh1{_xcSP4E6{-fi1$&TmNGeqG
zFC02~hUtgAcj`yn{+IVA=tsn>{XK{k`4Vyj1zugtNgC86gC}2b91dl>_`D*Sa*dLo
z?HwZzj(`vI_=52sKL;ShiF90X_tH{1k3@l8Swj^O4<VP49}_W*(GqNRi=@wSGIA9b
zo@GuYfSl3}qAt%NRQ}~DogNR?j-*54?b4Czq&LLb{L7jC0T(et?}zMe9a5-A>UCc&
zk`1VR(h2wNt|FDvAN}JCkEgB69?HL5<R9=(ZD5J~IDt?L`M%Vv98p|QyYyFzU=Rus
zKO89xN{u5-o-&f>zS53uxXX`1xf0-@&|xn?yGBhO9Vr=Pq$Z3}LJ{41frHqjlUJo9
zL}Ei}#~C8AngECT)?x1@#>s7XYwHr1)p7{lPQr7!I7nAi%dxdkdCN1H{lP$vLo7HB
zhmV~OD6Cw8NCs6cm!D@2Pe7g#8H4;66ifh1M`RpJ5tEsKGvq0hE_}kWS-$)wEP-8U
zOG=I&Q1-cdJBibUy~zW;K{VvYKh^cqTs-tV$F8iv%MGEldUmB0qi5mUz7Ncl6*D<b
z%uDH7j2rrwND?HQNkfMs$FO}@qBx_pL&UJ01T7I;2awGz?gtO1w(uM}M-7K1_SJ`B
zg5S2db_Kd`KbX1?Cq6WR`>U&H!q2rU6`9ZvhHX9e+YzrC>1_nmix8@0&q++h%|d7$
zm+!y;1qQ7JtX$P{I6^=K*K%p{2Z#y@sdHG}J)m-Y$UCkEiqjldgG7|%{+?(oXh1=i
zUnF-!QpC^H0~~keEBEq_JE1NP_Dmz#hM=ze8a<CxI6RtTBP_>S|Hh#f2T-Um*79^X
z1t)=aUVa|*T-k#B$ZZ_g--ELyf9gkbNBC$j&rmw?xhB0UzXMLd;oJWm53Q5~T+?jx
z6_~H{J0RDwj|}-aTv#&N9_X*g8K5s+bUmtpX{95GX*mp>ociI`UXF&2%PPG87o8T^
zKkxoHOgbg)9D&tlVN^Pa>FM-vTs{i`FBJ3xz~>lf*?EPdRwLn>JB})=bLU0H02fCM
zaD^E_*B^X3_%-K-i_Y9DQsEUzf3YJHdh(GdT}U64lN!VX!cylosC03tmjeWr{=h_N
zcx+Td4QYr;1g02N>%ZO|pzBKAs3e=?f<}IcLJ6id!oRhsP{X=@nZphfzIE&z4z|ui
zZX1-fN}h-M$-k_J-!*hHBI&R6_W%tGnXccUdn--uL*IiUKye|5_4mkthnFZ8&JRQA
z`ysS+QBL-<oF#9=Qwn9AEvWm`Ff5N3Q6DI!jMBUOekyHr{(GBa*k4pTh6BW@O2pqQ
zw<7>+IrF{@6bDXH6&cY_t(T5C4u`c4fa!BX@7~$Jpc_khUXc__r=Tb&?m3QK0*99V
z9k}BzY>W|?w>f&3CdJZ`sP!yGdkNLSVHR}k<WMDjj^ibxS%6W^k#xa<Ao36Fk$>n7
zsB;Nv_lO|}z_x|C2XCLFt$2hY=|uZmVukd8fDJ||AQwyNTE`i`;9evIyw&19?s~|h
z>k6=HW~GNB*z9*YzVbBBk*pdJxkH-j<dcpxg&YVX(4Q%~{|MA@rk{rxE2Pc6uFLH_
zfK6<R`;k0p25Ex$Pa&0)uG*>`eHy7)10hPKtWa=v9N|R0uFLg+CxD-Y!=J9^ENhVC
zs;4<sS|J_Jmx@)gXAo42Tv-<l=In`D>*?Tuv4HN5zNLUk>bCwwv6~{@KUm&}>bj7b
zII%$QpugzUUqSvLEYLf!4#L|qsJ$J;MWurX9qS<A{lOkTtn5_~pmtYj$8Ox^Ot3G3
z$pu}%)LoqrEZ&iln$B~!X{pr->ecqoAM81hhW7`1bY1j?$;0CP#83rDmD-Z5Ldq&I
zJ@iWgEkIa*0&8(>BWgpjXf#4%#5M(Nk!}!WB*CuQC1B-Gdc$^yW2eS%_ids|I@B$z
zcBlCT<Z3dL?5Z8-%B60lUqUyg^o+phox<fCT!m_c+I-ack`gIbow>)kFO}nVhe$_)
zU$dVnN31J-*7;$_1<{C}0>AMTDZP$LIt~7<=Qsh)lSf>HPH9nlzx^Kb?_i3~Zz0$^
z&X7@}Xs1CQVEYVMXBHR%kT;hl0ni9Q_uCjcNT&KlsyH|4D;&3Oqq#Dg>%j7`6c3y`
zjLn46%x0ST3C$oiQO0l;Q{`%8Z&EL6XcxgW07envSHlniEMz?c;2*0;<O4a3$l{LQ
zOF(WVD_Ot~GaHhDZy&{P@Zo2B@t1k=i8;f^9h%LA(==$dPv6<K-~>(&HEwmghi~&x
zQK1=8yHxl7e4P2<n?q+n2z!ky%LC9H{-xf4L$GWlZT$W4i-0{)*N?;2gX{ddKUDDt
zaqQX^+`Rz80w|tuGhu5jZJ-~UG}0+V()6SpZ6xo=#IUYkH`sbEbv{;w9BoFXbAyUb
zD|hE;XW$!xFOP98zR8Z^>3rKyuqHc(XYg%K_OMW#;}W&;tw%W&WFUqDf8h6+qRpl>
z6fo@EiAv`O@!lfwiv7CJD&iqz7UV#@9BsVgYBc}Y3|NP6`z=i4xVn^o>`6TEZEd(p
z-3}R#4VZVxf@pEb(@{ZXEQB>Qbku*~PXvXX)KCvwGL}FXI0J&9$($|eHIA-8r(Ppv
zkC1``mGB0Q0Kx4BMDQqtd#ZO_N*$r79f&8;qk--%j-x8~W)ftXSP9mmA)Bs=Op0^h
zt{a5vTF2E${*h-%m@;h`4!o}>@Q*!)*R8$N1HN!QbRyuQ;|o7~87xum6}8WCRDhiB
z;}9A3lWcbw?spvZb6<8`UC}&Se1W*?#2*vCAJF9~x08nAMTy=Xb;z^CAlSuT?l`J(
zAH0EuNh(JpG=cv~N^;DSVXpu)y|xmy8N~csU{2m2NGB<(aFif@1qVu}+~LwG$JHwS
zvBQe3!^u9F;oH(+YR3Qq<52`aZNT~^N5l<|fiS-9BP`U8f#rN#B)MrIh;JjWI0mLE
zKN+oY48Vn5)N<}ncG{zUfcf3iB>J@yXXgT1OGKCf3=IQM13Ul`&!QgeZyEInSNrsX
z1t}aia0;!?!S#5e2pyOONgV@Q__i;70#!mpCQ#eE&<~P{yXbNU$=H^UNv0T-#p8hb
zhB9Z9%)D1-6s+k7wZwS?IP?3{f(*C>8u*v}=pleE{^*MVfgUA8E7mSDcu$121B-y-
z%_n5+b;fBVMk~CGNFS`jGh5Gju!JA{Gb$1MNTX8ELJBFWF7qjt=Y#6?#3o1$Gp}a^
z`?udIy-B|?c^-D9qni?%7jHc@+qLf;<aLLjFK)hL>!mwddpF@7(lex_i+ua5uxFk*
z$EQ^lX%$ap;&AA|f0C`w^&{Y0kG8<bZSQZJ<~a8y6irpKS32tWP-7Qvnvp+1Gj+`!
zK02>LPE*F>XM3$6Z5xpqhxeRpIUCq@Heh#wcE(_jzZle;p`Ecr>T#S=@lR)HL%>sC
zJG~UWUa;fb2Pnni@F$j|hv)6UDU|IFBn5;)6Lr*|FqaMe)p3d&`oJ9lV`?yy!lviC
z=U_I3tJRdk&#2iCs~Eb!&Qo0E%F%9;yJ!U{k&cjUmK+Hlq5^8aGXaTZpN+--;(Qd-
z+5n73z}#Ww?gh00y0>8cGO0V@Qu)vjIRRBZ83kV@^(~=7pNxaO5Kg=ewR?su&7*s3
zXei(a(Z%=-PMntJp@hUc42sSi0`h)R4`N~AeAM_9Iz`~y?}EBW{|rjr0S&#}I=T>9
z(+{3UObvV&c9N!G69&{&9E;6j$9Z%}!4C7jgOf*W&8NC{(eYXK^#G*|V1Fi$$j=O+
z%M7}x=@Lwr>2#S!7ZtK(DxD|SA@iw|F}vEdv=EptLXujJg6bTC*>O187qIRuDhjY~
z*ucj~1A1Y3uapTg=GT^r8DfAF-3^k4${1J5KTTFoO{e@>$YH?`q74@*haiE0Mb*%I
za8auJLDw!n_*B%U?!nRw2cQer&`kTFm_+yZsiF?6ZMaoUZ{E5)pFha+2fJvk#zK9B
z!RKhR#c5cfwP^v@+`j=u`lA#rT7mGSQ?@D6DFB5-KtH$=a-go^!JZ0)j3uwJhM}8(
ziCP?-#Dj}~$$Jq%3t+*en2xCx=yW1n{_GzpxhJrt0X>bIe)!ZNhImdi?ZKMg)-T4w
z_KXU#_fnb<N_PP?5+3RXnNS0Mv3+4YC8E9L4gAnJCPnMVOp1qr`yG;^HZsp$c5^t!
zW3seq<9R5te!ovXgxLbno(GvSw6{Sb2$;-t3?7fA>xxG*^G|odYN1IPS}pIODvw1v
zb<Y%dYbI7@{)rw8#b=`2cjAHHzm|w;#<_@?qG8D<^Mdi+U_6%@gsd6{Ykcp@IJ*Km
zG~jY7OIl(pJ_xAfG{i@;<7$9CSJ$6P&luD)sk&{M^ix%U@+)5i$p$9(fypADMF1OG
zyA+I;`xp@uaw1Vl>gFF=t}ODcJG2E9B-B9Kb(qXp0^g8ddM68C<O_=TE{_*}r<zho
z$)2yt9KQV*u(c9Kq`{D0MNSukr5@C%!2unFZGX#mf<J=fQkv{FICCl?`vFNK9mNq>
zt)DA2TF!$Yh|MKvdEKvI--4}&OCN^gS=!aGvt9Xz3`D~=)pW)>+dQ0#27DIkSw|P1
z<WDYu_TFmg<R^QvVaDbQ`|fdosiT00eSlK$XL~o|V2Ewhh+=XYC{jz>p~92=3;{|3
zlc+JE<WZm|0&?oG3-TQ?DF@A1BxadUU~^NusI<dC<Z>7}I)YZiNSE-#uxjX%auR)8
zsqc4_t3!Pp&t1f>u?;x2R-6YDu7+@x6P{Ox@kbq6Kj|1kNF#qr`-W4}8{K~oZ2fQq
zLEL&42V^*w3Vu^M*7_O-TIA0Fv)A!)fa`lBK)tZ%^j;hu9FtFD7@?|RhdF-Na7ebN
z2RhL4o^)x?wPGB%kR-F2B%Rc5E3&k?Zz9WPlI0!g_+(jz$H`L3Wcgb_YcI*dzdTqi
zy+aaB|6uQ)o=^8em1FX%8w*C~892^Rtnde~6^_#3)&P1lO5hghC=O;gV&O7Qss4n2
zd6-l^Dt`iimYpMBO{=9ocEsT&D8c3dil%2^>rNwuE3^6!|IRc8i))M@DD9#)@RW3v
zbo_XNy-#_q-3kcTw*ut?f&_DESZ<(4{RsZF;TL|&k91xM@{}LTu1fDs6k%$RPlVgO
zA|UCnG0($3*G8BO$8Ijemw<5X48*qmIGz^tNN)sV@t01>=Lr?ghfwd*BgjsY3MZu{
zR26-n>1jrzKEI$mUtds|zqVYTpT90&h%ky3qTME>2n(%?r*rcoA|lqTEm*ra!V6_A
zNGm8bF7|>gUMwUFkvJ8mPi116scLI<S-QQZuBvQZQ+>5AIxeOxL!VxlRbFI_j*Lnu
zTa%`XE-N%u*Q{=|8@6sKD{QD~GFfdEb!BOljWuOPUB1a?uQx>-Op{(1m9jLuXvs1)
zEU#2J;{2v&OG8DSuy6}Dk^+8&6_yG52GL|ikHqCzDl0^jV63kfR$J=p?F}{T-OyMg
zR9Dp0nW}^c=t%7p=+xJb!PHn90JLo7*oaB6nnb&`fg#$hrculr@!wV>vUwuxv#~yN
z&5aEV7@ys~p;?#_y!`bIRqLvK#v{JI=X8rjTxa9Bg%uHt1-Q0ytB_t{GbIX<+ZJwH
z>K!rGeA_$1Y*ApXXs}hAtYp%-n9a~;ol$76*jm%DMQAcriWV!Zyl@-+y3a*Kq_10-
zqfbMCM5d%fEv8TykFSfqHU4<msJL6h8g*-%Y=(+0rh<yib*8kcDyzw6W1_&^+Yqey
z7|h#kaC4n^HoZo)3CSr!Y&7P4Hqmc0RoX=pnZ{UYt!We^6x`Ky7Mn?^sH;OD<)`Js
z<y#O5Hes`=+5(rG7#bO2GcW}kLnWq&v#tLEnlE;ZIt1UEh8i)$(m=;L9Ae)mDkY=I
zXKj50=`E~}ixDasssz#Jrb<hLXtmU_3=lC>Q3pZ-sV6A<35v!RD{~pg5=1cS1cQD}
zE`})cjJnmJg1?U!=BEe|5lxnwD&fAxN^0w?YsPHlBUMyktzqI^4?mF}3dy$VT(J^9
zMN0T6V-w((t)$n?ib@;vF4Z5PO_Xif$~9G@)nK($BYS-i*TLL4Om0lisLL>Iwr@$d
zS0mni5#<G)%zMlRERQISZYskhSW2)l*jw6j*~&3opRM6A>-I)VO@lZ}gi0Me$kHE$
z$s|nr_;m2Wjb{Eo1INUj2snwJQl+WXTDJ=ZCYb_132t?M<U~5Yx9i|^zL|;l>)>K0
z&imdb!R0H}dbQCv@4Md^?rZh%(Nl6H%12F@?2n0X(O(Cr6l7*Ulw0~tlFwLg6UT^*
zd-B0$al;uX8JrTq*C%g|sbPy~rV<ztxh>QCK|zTqWUIOtZHW+t!tGm!a;r?VH0RW8
zwpLiTmr<bSn(8gq?HI{7H5x^0S*git!C0}iqOs9r#Yz<6WwZ>GZptmgWD{!|DnwLO
zh4JEV!gIByar-ytX|&j_l_np%oAE=*HB?qXzp~LMrN>~Ap#(SzUF6O1$wq{|K0Z#V
z(paXjQpCj&m9?g3#nFrc4kl5=uJ_a}?eC?XZ>p#wY(=(P_{$4lY^@PZqX-jqnONk%
zhL*9pMyxb5Efn74b(%<tdIBZ5Mqw5S5jIpnOSN|b@rO=9NFjsbv)W=uWlKh{@wGO{
zF`8?t#X`ldUn6rN8bfr4rYe&7YhaBg@d0~%qoSKnej4#62sDV9AoWe?A$qbco5}jh
zjS*yz$m7W?CB|V<>-7_`3H1ObYg0|7$#xyy&3XG!*b?e3D-Z?|KyiJeSrRbQVy&;Z
zffPPI)X9%82!^@}5gk!ITRMrn#bB|DWxiLYv$C}i&~`4&u`f=<gVJXd)YO}-z(KcR
z6Rmb?CefQF3WW_@8!XKYLbe5lO1IWjZ7~TMCemM6lfk;x$QbGeZYC2o4?fzgVvQeA
z+&YRouFr-fqcv`QT4PP+`e?dhm=T#cL}X}oO%+wR$Zgft$~!BNHtTX~Hka$ylD}A7
zW08b<CTb7UE!(IEPZYB3HB~9tttfGovak_4dEwIP>b#(98erl|6Xk|47EyGm^IQbB
zk;(^k)|)^+o7|volOo27YLkKv1tPowJt-F14lbjnsm6xp-Y5Sp=o%o6NW^^)YiQGj
zgd-byd9W^m7M}7gsIBFhHQP*8X(HPkmSZ5dVp~nUy*|xWSyQ8krz|0C3&BO)I4GH%
z--tdon3a|)uK~t$fSh34fFUCq-qqP@`B8Cbc@@4(zeegCQ59$vWozFp6}}NFQ;Uo6
z*}^N-KPQS03E|;Y@1GRpdPInk++fH4$Ht;<CE`zc--4)J$t{eG-?nTa^3ZpQ-nK9@
zn%<O$$#;rh1z$wg6Ml5n{oYGVl_1b#B3%Fn+Up6Pb}0CB1oko7D^dQid7b<zuCO*x
zHu#E0R^9eS{M`%wh{ijSVX8A>-;{}6K6>ME6Kp{oH$IBtO^X5xP7&&{1st6~g~nbZ
zgZ+bGuN*m+iYh^GwW4&5ebzKIVY#Ui3>DUjdN5~mg$*`)V<U>AiFEXS(t+(|M=7F=
zUdNw?*J1}pOa68*CcAm7;za(6Uf3Cl*kJjXt+R`Qr5Y4$tOrsIS!Aih`3eq1tX6xY
z=q2nO%!Kd9Sgo}Pxu&X`im?$qu@RxtT+y(_$3~Ge6N~sbC23bi&O;Gzs2LAQ;xwZ8
zd-W#bU{sGj5*{7Lii){lvHK)cX2>8mS~ABdf>E87Y&3BqZSy3n6M;3Wa}C!yt{}7E
z`a!a!r4oDU@n&ArP-&@eMEgp+@FJXAp^xQ^I7>j6wOuHxv0z=KA#^nPt0!PG>2XFw
z?wDv(SOd#E9YsYaC{+NkV}m;1*&2skJ44UJ)|ZiE7hlxnz#n#;jIco*TQyoO^))t-
z9Ur)nQPH}X*tiw(32Eu8GxV9asPAhmDDJ4~DDyZ@DPym>wn}9ojiBWoOOejI0)0a|
zj7WrUvpq&;bbY?bI)>#5jo&t1biS#+qNbrr*?0H|Ervi5yJ%6au8yp(7It96vv{n@
zyoHR0%9_>H@oX{kJ$d!K1#R6p+GFlu|FoZb90P~bmGAhuZ}J=lVE-2X77=u^@%#$z
z`1POrG5+fH1$=)q2gk_xHXvwh_<j%HALC1Zq5BcOkKM;{PvJXj3CAtMcQL-p@NL5P
zVSN3AIPSOiBGil-#vh(J_ATMruQGrChv%2vR($VTfAI0y>;K_duJ4SC&U%+OR&55?
z|Gz%}rF(MGvDXh~@4o%fpv0c#?>yeRJ@U_)wg-N7`P})sOP{{K<;$PEq`9ys``MAY
zKW;p`borE%{kyqozhC>vrj^SMzBkVqzVbhQmGyf3+9yNK4&JpW=z~Pp)ezmvZ?AdY
zuleB0m)FHF%zpOCo!dvU+a78&EZn|)@bLPh+w)$$KjWoS-#@=|`43cvpKsh$*85?4
zXUo66aNqv0-ulJ=`0h|p^18My=Zl;n>fgVzY<+$E`=R<LUoZV&^S!^$+PCH-=T|$P
z&3NW#n$y3DTK3TTaCyq92VTi=?7ie~8q&7R$ImwSCA?)5J5f-cTgE*<hvyUC_wk-$
zf4cn48}#E8$Nk3}qf^TGliqRf{h60W=ZRP34d{&m;Nb|q=cA)^vt#GQM#ip=&5JFL
zt%?0k?BlU7#=aZ-_t-gc_r(>*mB)QI?iX=?j5{31t(duD@rvau5?1I}h%2_Q_|b~K
z6&F^lkMD^;7C$$!G_fJ^2Z@Ih-%h-c7?7k&nw6B8v^{B8(w?MelDd=nlRizlKY3H~
zL&;6aPbdE@`Ss)vlKoTWq}-p9l9HEFo3b-yZ_3Y7_NVlvoK6`?`7$MB<=rb2R~lFL
ztemlG{;K3vxvMs=vaWKhdTQ14s}8K{U-jN9_bSgSC;&zG;Z_{!iJTU7SJb^x$x)e6
z8=|&EJr?y$RA<zCQJ12=h>DHQh~60e-RK`j|2n!O`ft%g(bIGxx+S`3-2=KKx;J&Q
zZcw*4CMqU7ras0V^M7InV!n)-8LNv;ifxJQi9H%SB`zfHp}1eh9gORXI~I2>&J!21
zV$O=f`11G_326xn64xZwCO)3{Z;3HU$w`kSJ(l#nq=4k$<Uc3RNfA<3r97BoPx%3~
zdp8At6C_~&33;2MTB0sS&5W*$J{0{{v>g3%%<-6aVm^x*ib;!Yi2W*Fl~9^cmEcHl
zCA^rhKjF=U_Y=NM2ue&yOiS!ZJeK%BNiQcwCMV)gJh({wCl9zi8iPwJ$Dw?2Ct^;=
RoR7H}b0voUozjgz{|nl9a@7C;

literal 0
HcmV?d00001

diff --git a/edk2basetools/tests/GenCrc32/encode/demo.bin b/edk2basetools/tests/GenCrc32/encode/demo.bin
new file mode 100644
index 0000000..9f9601c
--- /dev/null
+++ b/edk2basetools/tests/GenCrc32/encode/demo.bin
@@ -0,0 +1 @@
+This is a test file for the GenCrc32 python tool~
\ No newline at end of file
diff --git a/edk2basetools/tests/GenCrc32/encode/demo_crc b/edk2basetools/tests/GenCrc32/encode/demo_crc
new file mode 100644
index 0000000..546f91f
--- /dev/null
+++ b/edk2basetools/tests/GenCrc32/encode/demo_crc
@@ -0,0 +1 @@
+U@"�This is a test file for the GenCrc32 python tool~
\ No newline at end of file
diff --git a/edk2basetools/tests/GenCrc32/test_gencrc32.py b/edk2basetools/tests/GenCrc32/test_gencrc32.py
new file mode 100644
index 0000000..4d8e3b8
--- /dev/null
+++ b/edk2basetools/tests/GenCrc32/test_gencrc32.py
@@ -0,0 +1,124 @@
+#@file
+#Calculate Crc32 value and Verify Crc32 value for input data.
+#
+#Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
+#SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+#Import Modules
+import shutil
+import unittest
+import tempfile
+import os
+import GenCrc32.GenCrc32 as Gen
+import filecmp
+import struct as st
+
+
+
+class TestGenCrc32(unittest.TestCase):
+    def setUp(self):
+        self.tmpdir=tempfile.mkdtemp()
+        self.binary_file=os.path.join(self.tmpdir,"Binary.bin")
+        self.create_inputfile()
+
+
+    def tearDown(self):
+        if os.path.exists(self.tmpdir):
+            shutil.rmtree(self.tmpdir)
+
+
+    def create_inputfile(self):
+        with open(self.binary_file,"wb") as fout:
+            for i in range(512):
+                fout.write(st.pack("<H",i))
+
+
+
+
+    def test_crc32encode(self):
+        inputfile=[
+            os.path.join("encode","demo.bin"),
+            os.path.join("encode","PcdPeim.efi"),
+            os.path.join("encode","S3Resume2Pei.efi")
+        ]
+        
+        outputfile=[
+            os.path.join("encode/encode_result","demo_crc_py"),
+            os.path.join("encode/encode_result","PcdPeim_crc32_py"),
+            os.path.join("encode/encode_result","S3Resume2Pei_crc32_py")
+        ]
+        
+        
+        expected_output=[
+            os.path.join("encode","demo_crc"),
+            os.path.join("encode","PcdPeim_crc32"),
+            os.path.join("encode","S3Resume2Pei_crc32")
+        ]
+        for index,o in enumerate(inputfile):
+            output=outputfile[index]
+            try:
+                Gen.CalculateCrc32(o,output)
+                status=filecmp.cmp(output,expected_output[index])
+            except Exception as e:
+                self.assertTrue(False, msg="GenCrc32 encode function error")
+            self.assertEqual(status,1)
+                
+           
+        
+    def test_crc32decode(self):
+        inputfile=[
+            os.path.join("decode","demo_crc"),
+            os.path.join("decode","PcdPeim_crc32"),
+            os.path.join("decode","S3Resume2Pei_crc32")
+        ]
+        
+        
+        outputfile=[
+            os.path.join("decode/decode_result","demo_decode"),
+            os.path.join("decode/decode_result","PcdPeim_decode"),
+            os.path.join("decode/decode_result","S3Resume2Pei_decode")
+        ]
+        
+        expected_output=[
+            os.path.join("decode","demo"),
+            os.path.join("decode","PcdPeim"),
+            os.path.join("decode","S3Resume2Pei")
+        ]
+        for index,o in enumerate(inputfile):
+            output=outputfile[index]
+            try:
+                Gen.VerifyCrc32(o,output)
+                status=filecmp.cmp(output,expected_output[index])
+            except Exception as e:
+                self.assertTrue(False, msg="GenCrc32 decode function error")
+            self.assertEqual(status,1)
+        
+
+            
+
+    def test_CalculateCrc32_outputfile(self):
+        output=[
+            "Binary1",
+            "Binary1.bin"
+        ]
+
+
+        expected_output=[
+            os.path.join(os.getcwd(),"Binary1"),
+            os.path.join(os.getcwd(),"Binary1.bin")
+        ]
+
+        for index,o in enumerate(output):
+            try:
+                Gen.CalculateCrc32(self.binary_file,o)
+            except Exception as e:
+                self.assertTrue(False,msg="GenCrc32 output file directory error")
+            self.assertTrue(os.path.exists(expected_output[index]))
+            
+
+
+
+if __name__=="__main__":
+    unittest.main()
\ No newline at end of file
-- 
2.37.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#93031): https://edk2.groups.io/g/devel/message/93031
Mute This Topic: https://groups.io/mt/93391061/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH] [edk2-basetools]GenCrc32:Convert the C tool of calculating the crc32 into a python tool
Posted by Michael Brown 1 year, 8 months ago
On 01/09/2022 07:57, liwenzha wrote:
> This patch converts the C tool of calculating the crc32 value of file into
> a python file. To realize this,after reading the data into the file in
> binary form from an original file,a lookup table is listed to do XOR and
> shifting calculation for each bit in the file.

Python has binascii.crc32 as part of the standard library.  You can 
throw away the mCrcTable and all of the open-coded CRC32 calculation 
logic, and just do:

   from binascii import crc32

   CrcOut = crc32(filebytes)

HTH,

Michael


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#93039): https://edk2.groups.io/g/devel/message/93039
Mute This Topic: https://groups.io/mt/93391061/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-