[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/20220901071018.2449-1-wenzhao1.li@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
[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 (#93032): https://edk2.groups.io/g/devel/message/93032
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]
-=-=-=-=-=-=-=-=-=-=-=-