diff --git a/bootloader_from_zip b/bootloader_from_zip index d24af8f..978e639 100755 --- a/bootloader_from_zip +++ b/bootloader_from_zip @@ -83,12 +83,12 @@ def main(argv): sys.exit(1) if not OPTIONS.zipfile: - print "--zipfile is required" + print ("--zipfile is required") common.Usage(__doc__) sys.exit(1) tf = tempfile.NamedTemporaryFile() - tf.write("foo") + tf.write(b"foo") tf.flush() extra_files = OPTIONS.bootimage @@ -106,9 +106,9 @@ if __name__ == '__main__': try: common.CloseInheritedPipes() main(sys.argv[1:]) - except common.ExternalError, e: + except common.ExternalError as e: print - print " ERROR: %s" % (e,) + print (" ERROR: %s" % (e,)) print sys.exit(1) diff --git a/create_gpt_image.py b/create_gpt_image.py index 16ad850..f2b961f 100755 --- a/create_gpt_image.py +++ b/create_gpt_image.py @@ -17,10 +17,10 @@ Script to create a GPT/UEFI image or to show information it contains. """ -from sys import version_info +from sys import exit, version_info -if version_info < (2, 7, 3): - exit('Python version must be 2.7.3 or higher') +if version_info < (3, 0): + exit('Python version must be 3.0 or higher') from logging import (debug, info, error, DEBUG, INFO, getLogger, basicConfig) @@ -32,10 +32,7 @@ from binascii import crc32 from re import compile as re_compile from collections import namedtuple -if version_info < (3, 0, 1): - from ConfigParser import SafeConfigParser, ParsingError, NoOptionError, NoSectionError -else: - from configparser import SafeConfigParser, ParsingError, NoOptionError, NoSectionError +from configparser import ConfigParser, ParsingError, NoOptionError, NoSectionError from math import floor, log @@ -69,12 +66,11 @@ class MBRInfos(object): _FMT = ' 0: units = ('KBytes', 'MBytes', 'GBytes') index = int(floor(log(self.lba_size, 1024))) - computed_size = round(self.lba_size / (1024**index), 2) + computed_size = round(self.lba_size // (1024**index), 2) human_size = '{0} {1}'.format(computed_size, units[index]) else: human_size = '0 Bytes' @@ -135,8 +131,8 @@ def write(self, img_file, offset=0): Used to write MBR in an image file """ self.raw = pack(MBRInfos._FMT, self.boot, self.os_type, - self.lba_start, self.lba_size, '', - MBRInfos._PART_ENTRY, '', self.sign) + self.lba_start, self.lba_size, b'\x00', + MBRInfos._PART_ENTRY, b'\x00', self.sign) img_file.seek(offset) img_file.write(self.raw) @@ -199,12 +195,12 @@ class GPTHeaderInfos(object): _FMT = '<8s4sII4xQQQQ16sQIII' def __init__(self, img_size=2147483648, block_size=512, size=92): - self.raw = '' + self.raw = b'' # TODO use decorators and properties to subtitute by r/w access in the # raw attribute with pack and unpack function all these attributes - self.sign = 'EFI PART' - self.rev = '\x00\x00\x01\x00' + self.sign = b'EFI PART' + self.rev = b'\x00\x00\x01\x00' self.size = size # sets the length and the entry size of the GPT partition table with @@ -213,13 +209,13 @@ def __init__(self, img_size=2147483648, block_size=512, size=92): self.entry_size = 128 # calculates the size of image in block - size_in_block = img_size / block_size + size_in_block = img_size // block_size # sets the lba backup at the value of first lba used by GPT backup self.lba_backup = size_in_block - 1 # calculates the size of the partition table in block - table_size = (self.table_length * self.entry_size) / block_size + table_size = (self.table_length * self.entry_size) // block_size # sets the lba first at the first usable lba for a partition self.lba_first = table_size + 2 @@ -300,7 +296,7 @@ def write(self, img_file, offset, block_size): img_file.write(self.raw) # writes zero on unused blocks of GPT header - raw_stuffing = '\x00' * (block_size - len(self.raw)) + raw_stuffing = b'\x00' * (block_size - len(self.raw)) img_file.write(raw_stuffing) # saves the end of the GPT header @@ -598,7 +594,7 @@ def _read_json(self, block_size): """ Used to read a JSON TLB partition file """ - with open(self.path, 'r') as tlb_file: + with open(self.path, 'rb') as tlb_file: re_parser = re_compile(r'^add\s-b\s(?P\w+)\s-s\s' '(?P[\w$()-]+)\s-t\s' '(?P\w+)\s-u\s' @@ -690,7 +686,7 @@ def _contruct_tlb_info(self, start_lba, cfg, block_size, parts): readlen = cfg.getint(partname, 'len') if readlen > 0: - size = (readlen * 1024 * 1024) / block_size + size = (readlen * 1024 * 1024) // block_size start_lba = begin + size else: size = readlen @@ -724,7 +720,7 @@ def _contruct_tlb_grp_info(self, start_lba, cfg, block_size, parts): begin = start_lba if readlen > 0: - size = (readlen * 1024 * 1024) / block_size + size = (readlen * 1024 * 1024) // block_size start_lba = begin + size else: size = readlen @@ -738,7 +734,7 @@ def _read_ini(self, block_size): Used to read a INI TLB partition file """ # sets a parser to read the INI TLB partition file - cfg = SafeConfigParser() + cfg = ConfigParser(strict=False) try: cfg.read(self.path) @@ -757,7 +753,7 @@ def _read_ini(self, block_size): except NoOptionError: # set start lba to offset 1M bytes, align with kernelflinger - start_lba_prev = 1024 * 1024 / block_size + start_lba_prev = 1024 * 1024 // block_size info('The start_lba value is undefined in the TLB partition file,' ' the default value is used: {0}'.format(start_lba_prev)) @@ -802,7 +798,7 @@ def compute_last_size_entry(self, img_size, block_size, entry_size, last = -1 # reserve the size for primary and secondary gpt MB = 1024 * 1024 - remaining_size = (img_size - MB) / block_size - 2048 + remaining_size = (img_size - MB) // block_size - 2048 for pos, entry in enumerate(self): debug('Entry size: {0}'.format(entry.size)) if entry.size < 0: @@ -1035,7 +1031,7 @@ def _write_partitions(self, img_file, tlb_infos, binaries_path): # no binary file used to build the partition or slot_b case label = tlb_part.label[0:] if bin_path == 'none' or label[len(label)-2:] == '_b': - line = '\0' + line = b'\0' img_file.seek(offset) img_file.write(line) bin_size = 0 @@ -1048,7 +1044,7 @@ def _write_partitions(self, img_file, tlb_infos, binaries_path): # checks if partition size is greather or equal to the binary file bin_size_in_bytes = stat(bin_path).st_size part_size_in_bytes = tlb_part.size * self.block_size - bin_size = bin_size_in_bytes / self.block_size + bin_size = bin_size_in_bytes // self.block_size if tlb_part.size < bin_size: error('Size of binary file {0} ({1} Bytes) is greather than ' '{2} partition size ({3} Bytes)'.format(bin_path, @@ -1081,7 +1077,7 @@ def write(self, tlb_infos, binaries_path): # fill output image header with 0x00: MBR size + GPT header size + # (partition table length * entry size) - zero = '\x00' * (2 * self.block_size + + zero = b'\x00' * (2 * self.block_size + self.gpt_header.table_length * self.gpt_header.entry_size) img_file.seek(0) diff --git a/generate_factory_images b/generate_factory_images index 4987e81..0c6d037 100755 --- a/generate_factory_images +++ b/generate_factory_images @@ -32,7 +32,7 @@ import os _FLASHALL_FILENAME = "flash-all.sh" # chmod (octal) -rwxr-x--x -_PERMS = 0751 +_PERMS = 0o751 _FLASH_HEADER = """#!/bin/bash # Copyright 2012 The Android Open Source Project @@ -103,30 +103,30 @@ def ConvertToDOSFormat(filename): def AddFlashScript(filename, tar, commands, windows): - print "Archiving", filename - tf = tempfile.NamedTemporaryFile(delete=False) - if (windows): - tf.write(_WIN_FLASH_HEADER) - else: - tf.write(_FLASH_HEADER) - - for c in commands: - if windows: - tf.write(c.get_windows_command()) + print("Archiving", filename) + with tempfile.NamedTemporaryFile(delete=False, mode='w+') as tf: + if (windows): + tf.write(_WIN_FLASH_HEADER) else: - tf.write(c.get_linux_command()) + tf.write(_FLASH_HEADER) - if (windows): - tf.write(_WIN_FLASH_FOOTER) - else: - tf.write(_FLASH_FOOTER) + for c in commands: + if windows: + tf.write(c.get_windows_command()) + else: + tf.write(c.get_linux_command()) + + if (windows): + tf.write(_WIN_FLASH_FOOTER) + else: + tf.write(_FLASH_FOOTER) - tf.close() + tf_name = tf.name if (windows): - ConvertToDOSFormat(tf.name) - chmod(tf.name, _PERMS) - tar.add(tf.name, arcname=path.basename(filename)) - os.unlink(tf.name) + ConvertToDOSFormat(tf_name) + chmod(tf_name, _PERMS) + tar.add(tf_name, arcname=path.basename(filename)) + os.unlink(tf_name) def RequireFile(filename): """Ensure file exists""" @@ -146,8 +146,8 @@ class CommandlineParser(ArgumentParser): self.description = __doc__ def error(self, message): - print >>stderr, "ERROR: {}".format(message) - print >>stderr, "\n------\n" + print("ERROR: {}".format(message), file=stderr) + print("\n------\n", file=stderr) self.print_help() exit(2) @@ -230,18 +230,18 @@ def main(): archive_name = args.output # Create Archive - print "Creating archive: " + archive_name + print("Creating archive: " + archive_name) tar = TarOpen(archive_name, "w:gz") for src_path, dst_path in files: - print "Archiving " + src_path + print("Archiving " + src_path) RequireFile(src_path) tar.add(src_path, arcname=dst_path) # 'fastboot update' covers the additional AOSP pieces, add this to the # command list now commands.append(UpdateCommand(update_fn, True)) - print "Archiving " + args.update_archive + print("Archiving " + args.update_archive) RequireFile(args.update_archive) tar.add(args.update_archive, update_fn) AddFlashScript(_FLASHALL_FILENAME, tar, commands, windows=False) @@ -249,12 +249,12 @@ def main(): tar.close() - print "Done." + print("Done.") if __name__ == "__main__": try: exit(main()) - except Usage, err: - print >>stderr, "ERROR: {}".format(err.msg) - print >>stderr, " for help use --help" + except Usage as err: + print("ERROR: {}".format(err.msg), file=stderr) + print(" for help use --help", file=stderr) exit(2) diff --git a/releasetools/bootloader_from_target_files b/releasetools/bootloader_from_target_files index 4162b00..ca5d6ad 100755 --- a/releasetools/bootloader_from_target_files +++ b/releasetools/bootloader_from_target_files @@ -61,7 +61,7 @@ def main(argv): common.Usage(__doc__) sys.exit(1) - print "unzipping target-files..." + print ("unzipping target-files...") #OPTIONS.input_tmp = common.UnzipTemp(args[0]) OPTIONS.input_tmp = args[0] #input_zip = zipfile.ZipFile(args[0], "r") @@ -89,9 +89,9 @@ if __name__ == '__main__': try: common.CloseInheritedPipes() main(sys.argv[1:]) - except common.ExternalError, e: + except common.ExternalError as e: print - print " ERROR: %s" % (e,) + print (" ERROR: %s" % (e,)) print sys.exit(1) finally: diff --git a/releasetools/flash_cmd_generator.py b/releasetools/flash_cmd_generator.py index bd50b17..cc9fc82 100755 --- a/releasetools/flash_cmd_generator.py +++ b/releasetools/flash_cmd_generator.py @@ -330,7 +330,14 @@ def parse_config(ips, variant, platform): results_list = [] for k,v in results.items(): results_list.append((k,v)) - flist = [f.rsplit(':', 1) for f in set(files)] + unique_files = [] + for file in files: + # If the number is not already in the unique_numbers list, add it + if file not in unique_files: + unique_files.append(file) + + flist = [f.rsplit(':', 1) for f in unique_files] + return results_list, flist diff --git a/releasetools/flashfiles_from_target_files b/releasetools/flashfiles_from_target_files index 02de5ff..f74b653 100755 --- a/releasetools/flashfiles_from_target_files +++ b/releasetools/flashfiles_from_target_files @@ -97,14 +97,14 @@ class VariantIpGenerator: def __add_variant_flashfile(self, ip, variant): variant_flashfile = self.flashfile + "_" + variant + ".ini" - print "Variant flashfile = %s"%variant_flashfile + print("Variant flashfile = %s"%variant_flashfile) # Sanity check to avoid future silent removal eg = self.empty_groups(ip) if eg: raise AssertionError("Unexpected malformed section %s" % eg[0]) if os.path.isfile(variant_flashfile): - print "Reading INI configuration for %s ..."%variant + print("Reading INI configuration for %s ..."%variant) with open(variant_flashfile, "r") as f: ip.parse(f) self.variant_files = self.variant_files_common @@ -125,7 +125,7 @@ class VariantIpGenerator: # This may happen when a mixin (platform level) disables a feature, while # local flashfile.ini (variant level) is kept and customizes this feature. for s in self.empty_groups(ip): - print "Removing malformed section : ", s + print("Removing malformed section : ", s) ip.delete_section(s) def empty_groups(self, ip): @@ -214,7 +214,7 @@ def getFromZip(zip_path, filename): with zipfile.ZipFile(zip_path, "r") as zf: data = zf.open(filename).read() info = zf.getinfo(filename) - return (common.File(filename, data), (info.external_attr >> 16L) & 0xFFFF) + return (common.File(filename, data), (info.external_attr >> 16) & 0xFFFF) def getProvdataVariants(unpack_dir): variants = [] @@ -250,7 +250,7 @@ def process_image(unpack_dir, dest_zip, source, target, configs, variant=None, t if target_out in flashfile_content: return else: - print "-- Adding", target_out + print("-- Adding", target_out) # Default is no special permissions perms = None # retrieve file from target file package based on source & target strings @@ -286,7 +286,7 @@ def process_image(unpack_dir, dest_zip, source, target, configs, variant=None, t # split --bytes=4G --numeric-suffixes [filename] [filename].part if ifile.size >= (1 << 32): image_part="" - count = int(ifile.size/(1 << 32)) + 1 + count = int(ifile.size//(1 << 32)) + 1 for i in range(count): image_part+=target_out+".part0"+str(i)+" " configs[1]=tuple([(x== configs[1][1] and configs[1][1].replace(target_out, image_part) or x )for x in configs[1]]) @@ -310,7 +310,7 @@ def process_image_fast(product_out, flashfiles_out, source, target, variant=None if target_out in flashfile_content: return - print "-- Adding", target_out + print("-- Adding", target_out) outfile = os.path.join(flashfiles_out, target_out) if not os.path.exists(os.path.dirname(outfile)): os.mkdir(os.path.dirname(outfile)) @@ -374,7 +374,7 @@ def main(argv): flashfile = getIntermediates(product_out, "flashfiles", "flashfiles") else: - print "Unzipping target-files..." + print("Unzipping target-files...") unpack_dir = common.UnzipTemp(args[0]) if OPTIONS.add_image: input_super = os.path.join(unpack_dir, "IMAGES") @@ -392,13 +392,13 @@ def main(argv): # Retrieve "generic" PFT instructions from target file package if os.path.isfile(flashfile + ".ini"): - print "Reading INI configuration..." + print("Reading INI configuration...") with open(flashfile + ".ini", "r") as f: ip = iniparser.IniParser() ip.parse(f) configs, files = flash_cmd_generator.parse_config([ip], build_type, platform) elif os.path.isfile(flashfile + ".json") and not OPTIONS.unified_variants: - print "Reading JSON configuration..." + print("Reading JSON configuration...") with open(flashfile + ".json", "r") as f: conf = json.loads(f.read()) configs, files = flashxml.parse_config(conf, build_type, platform) @@ -406,25 +406,25 @@ def main(argv): if not OPTIONS.mv_config_default: common.Usage(__doc__) sys.exit(1) - print "Reading JSON FLS configuration..." + print("Reading JSON FLS configuration...") with open(flashfile + "_fls.json", "r") as f: conf = json.loads(f.read()) configs, files = flashflsxml.parse_config(conf, build_type, platform, OPTIONS.mv_config_default, system) else: - print "Exiting, Missing correct flashfile configuration for generating Flashfiles." + print("Exiting, Missing correct flashfile configuration for generating Flashfiles.") sys.exit(1) if OPTIONS.fast: fastff_dir = args[1] # If mega flashfile is enabled, create multi-variant version of PFT instructions if OPTIONS.unified_variants or OPTIONS.variants : - print "Adding variant specific configurations to ip..." + print("Adding variant specific configurations to ip...") vip = VariantIpGenerator(ip, configs, OPTIONS.variants, variant_files, flashfile) vip.generate_variant_ip() configs, cmd_files = flash_cmd_generator.parse_config(vip.variant_ips, build_type, platform) cmd_files = set([i for _,i in cmd_files]) - print "Adding required binaries..." + print("Adding required binaries...") for src, target in files: if OPTIONS.variants: for variant in OPTIONS.variants: @@ -442,7 +442,7 @@ def main(argv): src,target = file.split(":") process_image_fast(product_out, fastff_dir, src, target, variant, variantFilename(target, variant)) - print "Generating JSON flash configuration files..." + print("Generating JSON flash configuration files...") for fn, data in configs: with open(os.path.join(fastff_dir,fn), 'w') as file: file.write(data) @@ -450,14 +450,14 @@ def main(argv): with zipfile.ZipFile(args[1], "w", zipfile.ZIP_DEFLATED,allowZip64=True) as dest_zip: # If mega flashfile is enabled, create multi-variant version of PFT instructions if OPTIONS.unified_variants or OPTIONS.variants : - print "Adding variant specific configurations to ip..." + print("Adding variant specific configurations to ip...") vip = VariantIpGenerator(ip, configs, OPTIONS.variants, variant_files, flashfile) vip.generate_variant_ip() configs, cmd_files = flash_cmd_generator.parse_config(vip.variant_ips, build_type, platform) cmd_files = set([i for _,i in cmd_files]) # Using "generic" instructions as reference, grab required files & insert into flashfile zip - print "Adding required binaries..." + print("Adding required binaries...") for src, target in files: if OPTIONS.variants: for variant in OPTIONS.variants: @@ -477,20 +477,22 @@ def main(argv): process_image(unpack_dir, dest_zip, src, target, configs, variant, variantFilename(target, variant)) # Write flash_cmd_generator parsed PFT flashing instructions to file & insert into flashfile zip - print "Generating JSON flash configuration files..." + print("Generating JSON flash configuration files...") for fn, data in configs: + if isinstance(data, str): + data = data.encode('utf-8') ifile = common.File(fn, data) ifile.AddToZip(dest_zip) - print "All done." + print("All done.") if __name__ == '__main__': try: common.CloseInheritedPipes() main(sys.argv[1:]) - except common.ExternalError, e: - print - print " ERROR: %s" % (e,) - print + except common.ExternalError as e: + print() + print(" ERROR: %s" % (e,)) + print() sys.exit(1) finally: common.Cleanup() diff --git a/releasetools/intel_common.py b/releasetools/intel_common.py index c2267e9..4c351ae 100644 --- a/releasetools/intel_common.py +++ b/releasetools/intel_common.py @@ -394,7 +394,7 @@ def GetBootloaderImageFromTFP(unpack_dir, autosize=False, extra_files=None, vari block_size=info["block_size"], extra_files=extra_files) - bootloader = open(filename) + bootloader = open(filename, 'rb') data = bootloader.read() bootloader.close() os.unlink(filename) @@ -461,7 +461,7 @@ def MakeVFATFilesystem(root_zip, filename, title="ANDROIDIA", size=0, block_size size += os.path.getsize(os.path.join(dpath, f)) # Add 1% extra space, minimum 32K - extra = size / 100 + extra = size // 100 if extra < (32 * 1024): extra = 32 * 1024 size += extra @@ -482,7 +482,7 @@ def MakeVFATFilesystem(root_zip, filename, title="ANDROIDIA", size=0, block_size cmd = ["mkdosfs"] if block_size: cmd.extend(["-S", str(block_size)]) - cmd.extend(["-n", title, "-C", filename, str(size / 1024)]) + cmd.extend(["-n", title, "-C", filename, str(size // 1024)]) try: p = common.Run(cmd) except Exception as exc: diff --git a/tasks/checkvendor.py b/tasks/checkvendor.py index 86e3ba2..dd05967 100755 --- a/tasks/checkvendor.py +++ b/tasks/checkvendor.py @@ -168,12 +168,12 @@ def main(): try: for mk in makefile: nb_err, searched_output = search_string(options.light, tup, mk, nb_err, searched_output) - if nb_err is not nb_err_tmp: + if nb_err != nb_err_tmp: num_mk = num_mk+1 nb_err_tmp = nb_err if not options.light: - if nb_err is not 0: + if nb_err != 0: print(separative_line) print_vendor(informative_message) print(separative_line) @@ -186,4 +186,4 @@ def main(): return 0 if __name__ == "__main__": - exit(main()) + sys.exit(main()) diff --git a/tasks/publish.mk b/tasks/publish.mk index 0591355..963be2b 100644 --- a/tasks/publish.mk +++ b/tasks/publish.mk @@ -296,6 +296,6 @@ publish: aic $(hide) mkdir -p $(TOP)/pub/$(TARGET_PRODUCT)/$(TARGET_BUILD_VARIANT) $(hide) cp $(PRODUCT_OUT)/$(TARGET_AIC_FILE_NAME) $(TOP)/pub/$(TARGET_PRODUCT)/$(TARGET_BUILD_VARIANT) else # ANDROID_AS_GUEST -publish: publish_mkdir_dest $(PUBLISH_GOALS) publish_ifwi publish_gptimage_var publish_firmware_symbols $(PUB_OSAGNOSTIC_TAG) publish_kf4sbl publish_kf4sbl_symbols $(PUB_CMCC_ZIP) publish_androidia_image publish_grubinstaller publish_kernel_debug +publish: publish_mkdir_dest $(PUBLISH_GOALS) publish_ifwi publish_gptimage_var publish_firmware_symbols $(PUB_OSAGNOSTIC_TAG) publish_kf4sbl_symbols $(PUB_CMCC_ZIP) publish_androidia_image publish_grubinstaller publish_kernel_debug @$(ACP) out/dist/* $(publish_dest) endif # ANDROID_AS_GUEST diff --git a/testkeys/cts-release-test/sdk_sandbox.pk8 b/testkeys/cts-release-test/sdk_sandbox.pk8 new file mode 100644 index 0000000..23b880b Binary files /dev/null and b/testkeys/cts-release-test/sdk_sandbox.pk8 differ diff --git a/testkeys/cts-release-test/sdk_sandbox.x509.pem b/testkeys/cts-release-test/sdk_sandbox.x509.pem new file mode 100644 index 0000000..0bd20f3 --- /dev/null +++ b/testkeys/cts-release-test/sdk_sandbox.x509.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIECzCCAvOgAwIBAgIUMWJGQnrJU7zBEpPqv63u2HOlib0wDQYJKoZIhvcNAQEL +BQAwgZQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH +DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy +b2lkMRAwDgYDVQQDDAdBbmRyb2lkMSIwIAYJKoZIhvcNAQkBFhNhbmRyb2lkQGFu +ZHJvaWQuY29tMB4XDTIxMTEwMjE3MDIxNFoXDTQ5MDMyMDE3MDIxNFowgZQxCzAJ +BgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFp +biBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRyb2lkMRAwDgYD +VQQDDAdBbmRyb2lkMSIwIAYJKoZIhvcNAQkBFhNhbmRyb2lkQGFuZHJvaWQuY29t +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA09j3dyTxv8ojb4sXjrWX +smXTYEez/u6X6po8+mWXp1xl1Y9xjYrxZROIE1MJL8aay8iYJihqx7RBWTPJYtYZ +TLElA3dyQuMgDIKtlQR3QAMRoc2IKrkfcIboEs71xl78EnTSQfRJTUEFvNigzjfB +e3JVtNDC9BR/33Iv9oNED84qW9C54h4TWHLyvo75unzPQUGS6uEIhhHa/8ynZZQW +YEd0NwAQNqbcMdbN8Bn6sRRCidEOIPd8Uu8DtIofLi7/YMo4CH1Q5f5UQbtPtqU2 +m8fjQN9WYzMazvWltRE+HYDH9YnXCLAsVicNdmFhAlXri15nG2AiRnSrHu/panAc +6wIDAQABo1MwUTAdBgNVHQ4EFgQU3F5r2DhJbRfkJKuqs1hjP/0dCUEwHwYDVR0j +BBgwFoAU3F5r2DhJbRfkJKuqs1hjP/0dCUEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAQEAwQQ8/D3f/WS5cwqcsFpT+Qzik9yTu53nsXz/pBDSbeM3 +zX1RCejXsmXhPjN7cu0uJYlrIuArOagHSC5pDci6GzcwunnnkRazSAmTpHLSRgeb +cLgKHLCph9sulI1r82x9upF47zLlbfkTrtGJryej+yWJ2Ne8irJIPeNR0z0sTBWJ +2Ngg55ezFWj3mihzw4Z6YU9txJB7Gj9eNYXdcubjoNs2mSU/6dR+HwJtD64FuH3x +QLGMZscizCN8N6b5xayjwPsszQhaHI4iR4oGJ9prbDd0JoylwWr2LrQhYuWQCn20 +cG5YhrtZshj6f1eGV1TDYd8xziapilqwzrchARvP8g== +-----END CERTIFICATE-----